LOADING REQUIREMENTS

PACKAGES

ENSEMBL

# ENSEMBL DATABASE
# v102 is for the latest mm10 version
# ensembl.v102 <- useMart(host = "https://nov2020.archive.ensembl.org",
#                        biomart = "ENSEMBL_MART_ENSEMBL",
#                        dataset = "mmusculus_gene_ensembl")

COLOR PALETTE

palette_1 = list(red = "#E9002D",
                 amber = "#FFAA00",
                 green = "#00B000")
palette_2 = list(red = "#FF1F5B",
                 green = "#00CD6C",
                 blue = "#009ADE",
                 purple = "#AF58BA",
                 yellow = "#FFC61E",
                 orange = "#F28522",
                 grey = "#A0B1BA",
                 brown = "#A6761D")
palette_3 = list(grey1 = "#a0b1ba",
                 grey2 = "#c5d0d5",
                 grey3 = "#eceff1")

colorListLoop <-  c(palette_3[["grey3"]], palette_3[["grey2"]], palette_3[["grey1"]],
                     "#C5E1EF", "#6CB0D6", "#226E9C",
                     "#06592A", 
                     "#FED976", "#FD8D3C", "#E31A1C")
colorListPromoter <- c(palette_3[["grey3"]],"#E88587", "#E31A1C")
colorListEnhancer <- c(palette_3[["grey3"]],"#87AFC7", "#226E9C")
colorListStructure <- c(palette_3[["grey3"]], palette_3[["grey2"]], palette_3[["grey1"]])

DIR LIST

refDir <- here("reference")

FIGURE PARAMETERS

library(colorspace)

fontType <- "Helvetica"

fontSizeL <- 10 # pt
fontSizeM <- 8
fontSizeS <- 6

lineThick <- 0.75 # pt
lineMedium <- 0.5
lineThin <- 0.25

panelUnit <- 30 # mm
panelMargin <- 1.5

mmToInch <- 0.03937007874
mmToLineUnit <- 1/2.13
mmToLinePlotgarden <- 1/0.75
ptToMM <- 1/2.845


strong_red <- "#CB333A"
strong_blue <- "#4851A0"
weak_red <- lighten(strong_red, amount = 0.4)   # FF7D81
weak_blue <- lighten(strong_blue, amount = 0.4) # 8A91DD
no_grey <- "#A8A8A8"

strong_teel <- "#0892A5"
strong_green <- "#23CE6B" # A485
strong_darkgreen <- "#054A29"
strong_yellow <- "#FFBA49"
strong_orange <- "#F18F01" # dTAG
strong_lightpurple <- "#BD93D8"
strong_purple <- "#9E33CB" # Epi

panelSize <- function(num, unit = panelUnit, margin = panelMargin){
  return(num*unit - 2*margin)
}

FUNCTIONS

importBedpe = function(bedpe){
  a1 = makeGRangesFromDataFrame(data.frame(
    chr = bedpe$V1,
    start = bedpe$V2 +1,
    end = bedpe$V3))
  a2 = makeGRangesFromDataFrame(data.frame(
    chr = bedpe$V4,
    start = bedpe$V5 +1,
    end = bedpe$V6))
  GInteractions(a1, a2)
}

get_density <- function(x, y, ...) {
  dens <- MASS::kde2d(x, y, ...)
  ix <- findInterval(x, dens$x)
  iy <- findInterval(y, dens$y)
  ii <- cbind(ix, iy)
  return(dens$z[ii])
}
label_kb_mb <- function(x) {
  ifelse(x >= 1000000, paste0(x / 1000000, "Mb"), paste0(x / 1000, "kb"))
}

importPeak = function(fileName){
  df = fread(fileName)
  gr = makeGRangesFromDataFrame(data.frame(
    chr = df$V1, start = df$V2, end = df$V3
  ))
}

PREPROCESSING

Adding +ooe +geneAnno

Loop should be dropped from specific comparison if ooe in any of the condition are NA If ooe is 0, fixed pseudo value of 0.01 will be used. log2(ooe) should be plotted in range (-5, 8) if plotted in scatterplot ### Common stuffs

# Parameters
commonLoopDir <- here("../data/loop_analysis")

# Defining gene neighborhood
flankSize <- 2500
gene.TSS.tb <- fread(here(refDir, "mm10", "mm10_GRCm38.p6_gene_sorted.bed")) %>%
  dplyr::mutate(TSS = ifelse(V4 == "+", V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V4, V5, V6)
colnames(gene.TSS.tb) <- c("chr", "start", "end", "strand", "gene", "ensembl")
fwrite(gene.TSS.tb, here(refDir, "mm10", "mm10_GRCm38.p6_TSS2.5kb.bed"), sep = "\t", col.names = FALSE, row.names = FALSE)

# Functions for calculating gene overlap
findOverlapGene <- function(gene.TSS.tb, chrom1, start1, end1){
  temp <- gene.TSS.tb %>% dplyr::filter(chr == chrom1) %>%
    dplyr::filter((start <= end1) & (end >= start1))
  return(temp$gene)
}
findOverlapEnsembl <- function(gene.TSS.tb, chrom1, start1, end1){
  temp <- gene.TSS.tb %>% dplyr::filter(chr == chrom1) %>%
    dplyr::filter((start <= end1) & (end >= start1))
  return(temp$ensembl)
}

Preparing

[1] Chromosight

################################################################################
# Import annotated postprocessed loops with chromosight score
loopDir <- here("../data/loop_chromosight")
data <- as_tibble(fread(here(loopDir, "chromo_union_allRes_postprocessed_annotated.tsv")))

################################################################################
# Integrate chromosight score from asynchronous experiment
resolutions  <- c(25000, 10000, 5000)

# helper: read, filter, select and rename for one experiment
annotate_scores <- function(experiment, suffix) {
  map_dfr(resolutions, function(res) {
    fread(here(loopDir,
               sprintf("GSE178982_%s_pooled_union_%dbp_pu100pz100.tsv",
                       experiment, res))
    ) %>%
      mutate(id = paste(chrom1, start1, end1, chrom2, start2, end2, sep = "_")) %>%
      filter(start2 - start1 <= 2e6) %>%
      select(id, score, pvalue, qvalue) %>%
      rename_with(~ paste0(., "_", suffix),
                  c(score, pvalue, qvalue))
  })
}

data <- data %>%
  left_join(annotate_scores("AsyncUT", "UT"), by = "id")
data <- data %>%
  left_join(annotate_scores("AsyncAID", "AID"), by = "id")
data <- data %>%
  relocate(score_UT:qvalue_AID, .after = qvalue_EpidTAG)
data <- data %>% dplyr::select(-seq(29, 41))
data <- data %>% relocate(A1:Anno_simple, .after = id)

################################################################################
# Adding obs/exp
import_obsexp <- function(experiment, suffix) {
  map_dfr(resolutions, function(res) {
    fread(here(loopDir,
               sprintf("chromo_union_allRes_postprocessed_%dbp_obxexp_%s_pooled.tsv",
                       res, experiment))
    ) %>%
      mutate(id = paste(chrom1, start1, end1, chrom2, start2, end2, sep = "_")) %>%
      select(id, ooe) %>%
      rename_with(~ paste0(., "_", suffix),
                  c(ooe))
  })
}

data <- data %>%
  left_join(import_obsexp("G1DMSO", "DMSO"), by = "id")
data <- data %>%
  left_join(import_obsexp("G1dTAG", "dTAG"), by = "id")
data <- data %>%
  left_join(import_obsexp("G1A485", "A485"), by = "id")
data <- data %>%
  left_join(import_obsexp("EpiG1DMSO", "EpiDMSO"), by = "id")
data <- data %>%
  left_join(import_obsexp("EpiG1dTAG", "EpidTAG"), by = "id")
data <- data %>%
  left_join(import_obsexp("GSE178982_AsyncUT", "UT"), by = "id")
data <- data %>%
  left_join(import_obsexp("GSE178982_AsyncAID", "AID"), by = "id")

fwrite(data, here(commonLoopDir, "loopScore_chromosight.tsv"),
       sep = "\t", col.names = TRUE)

################################################################################
# Annotate genes for p-n loops
name <- "chromosight"
gene.TSS.tb <- fread(here(refDir, "mm10", "mm10_GRCm38.p6_TSS2.5kb.bed"))
colnames(gene.TSS.tb) <- c("chr", "start", "end", "strand", "gene", "ensembl")

# Simple annotation
temp <- data %>% rowwise() %>%
  dplyr::mutate(A1_gene = ifelse(A1_simple == "P",
                                 list(findOverlapGene(gene.TSS.tb, chrom1, start1, end1)),
                                 NA),
                A2_gene = ifelse(A2_simple == "P",
                                 list(findOverlapGene(gene.TSS.tb, chrom2, start2, end2)),
                                 NA),
                gene = list(unique(c(A1_gene, A2_gene))))

temp_p_n <- temp %>% dplyr::filter(Anno_simple %in% c("P-P", "P-E", "P-S", "P-X")) %>% dplyr::select(-c("A1_gene", "A2_gene"))
fwrite(temp_p_n, here(commonLoopDir, paste0("loopScore_", name, "_p-n_simple_geneList.tsv")), sep = "\t")

temp <- data %>% rowwise() %>%
  dplyr::mutate(A1_gene = ifelse(A1_simple == "P",
                                 list(findOverlapEnsembl(gene.TSS.tb, chrom1, start1, end1)),
                                 NA),
                A2_gene = ifelse(A2_simple == "P",
                                 list(findOverlapEnsembl(gene.TSS.tb, chrom2, start2, end2)),
                                 NA),
                gene = list(unique(c(A1_gene, A2_gene))))

temp_p_n <- temp %>% dplyr::filter(Anno_simple %in% c("P-P", "P-E", "P-S", "P-X")) %>% dplyr::select(-c("A1_gene", "A2_gene"))
fwrite(temp_p_n, here(commonLoopDir, paste0("loopScore_", name, "_p-n_simple_ensemblList.tsv")), sep = "\t")

# complex annotation
temp <- data %>% rowwise() %>%
  dplyr::mutate(A1_gene = ifelse(A1 %in% c("P", "SP"),
                                 list(findOverlapGene(gene.TSS.tb, chrom1, start1, end1)),
                                 NA),
                A2_gene = ifelse(A2 %in% c("P", "SP"),
                                 list(findOverlapGene(gene.TSS.tb, chrom2, start2, end2)),
                                 NA),
                gene = list(unique(c(A1_gene, A2_gene))))

temp_p_n <- temp %>% dplyr::filter(str_detect(Anno, "P")) %>%
  dplyr::select(-c("A1_gene", "A2_gene"))
fwrite(temp_p_n, here(commonLoopDir, paste0("loopScore_", name, "_p-n_complex_geneList.tsv")), sep = "\t")

temp <- data %>% rowwise() %>%
  dplyr::mutate(A1_gene = ifelse(A1 %in% c("P", "SP"),
                                 list(findOverlapEnsembl(gene.TSS.tb, chrom1, start1, end1)),
                                 NA),
                A2_gene = ifelse(A2 %in% c("P", "SP"),
                                 list(findOverlapEnsembl(gene.TSS.tb, chrom2, start2, end2)),
                                 NA),
                gene = list(unique(c(A1_gene, A2_gene))))

temp_p_n <- temp %>% dplyr::filter(str_detect(Anno, "P")) %>%
  dplyr::select(-c("A1_gene", "A2_gene"))
fwrite(temp_p_n, here(commonLoopDir, paste0("loopScore_", name, "_p-n_complex_ensemblList.tsv")), sep = "\t")

[2] hicdcp

################################################################################
loopDir <- here("../data/loop_hicdcp")

################################################################################
# Import annotated postprocessed loops with chromosight score
data <- as_tibble(fread(here(loopDir, "hicdcp_union_10000bp_annotated.tsv"))) %>%
  mutate(id = paste(chrom1, start1, end1, chrom2, start2, end2, sep = "_")) %>%
  relocate(id, .after = end2) %>%
  dplyr::select(-c("anchor_id_1", "anchor_id_2"))

resolutions  <- c(10000)

# Adding obs/exp
import_obsexp <- function(experiment, suffix) {
  map_dfr(resolutions, function(res) {
    fread(here(loopDir,
               sprintf("hicdcp_union_%dbp_obxexp_%s_pooled.tsv",
                       res, experiment))
    ) %>%
      mutate(id = paste(chrom1, start1, end1, chrom2, start2, end2, sep = "_")) %>%
      select(id, ooe) %>%
      rename_with(~ paste0(., "_", suffix),
                  c(ooe))
  })
}

data <- data %>%
  left_join(import_obsexp("G1DMSO", "DMSO"), by = "id")
data <- data %>%
  left_join(import_obsexp("G1dTAG", "dTAG"), by = "id")
data <- data %>%
  left_join(import_obsexp("G1A485", "A485"), by = "id")
data <- data %>%
  left_join(import_obsexp("EpiG1DMSO", "EpiDMSO"), by = "id")
data <- data %>%
  left_join(import_obsexp("EpiG1dTAG", "EpidTAG"), by = "id")
data <- data %>%
  left_join(import_obsexp("GSE178982_AsyncUT", "UT"), by = "id")
data <- data %>%
  left_join(import_obsexp("GSE178982_AsyncAID", "AID"), by = "id")

fwrite(data, here(commonLoopDir, "loopScore_hicdcp.tsv"),
       sep = "\t", col.names = TRUE)

################################################################################
# Annotate genes for p-n loops
name <- "hicdcp"
gene.TSS.tb <- fread(here(refDir, "mm10", "mm10_GRCm38.p6_TSS2.5kb.bed"))
colnames(gene.TSS.tb) <- c("chr", "start", "end", "strand", "gene", "ensembl")


# Simple annotation
temp <- data %>% rowwise() %>%
  dplyr::mutate(A1_gene = ifelse(A1_simple == "P",
                                 list(findOverlapGene(gene.TSS.tb, chrom1, start1, end1)),
                                 NA),
                A2_gene = ifelse(A2_simple == "P",
                                 list(findOverlapGene(gene.TSS.tb, chrom2, start2, end2)),
                                 NA),
                gene = list(unique(c(A1_gene, A2_gene))))

temp_p_n <- temp %>% dplyr::filter(Anno_simple %in% c("P-P", "P-E", "P-S", "P-X")) %>% dplyr::select(-c("A1_gene", "A2_gene"))
fwrite(temp_p_n, here(commonLoopDir, paste0("loopScore_", name, "_p-n_simple_geneList.tsv")), sep = "\t")

temp <- data %>% rowwise() %>%
  dplyr::mutate(A1_gene = ifelse(A1_simple == "P",
                                 list(findOverlapEnsembl(gene.TSS.tb, chrom1, start1, end1)),
                                 NA),
                A2_gene = ifelse(A2_simple == "P",
                                 list(findOverlapEnsembl(gene.TSS.tb, chrom2, start2, end2)),
                                 NA),
                gene = list(unique(c(A1_gene, A2_gene))))

temp_p_n <- temp %>% dplyr::filter(Anno_simple %in% c("P-P", "P-E", "P-S", "P-X")) %>% dplyr::select(-c("A1_gene", "A2_gene"))
fwrite(temp_p_n, here(commonLoopDir, paste0("loopScore_", name, "_p-n_simple_ensemblList.tsv")), sep = "\t")

# complex annotation
temp <- data %>% rowwise() %>%
  dplyr::mutate(A1_gene = ifelse(A1 %in% c("P", "SP"),
                                 list(findOverlapGene(gene.TSS.tb, chrom1, start1, end1)),
                                 NA),
                A2_gene = ifelse(A2 %in% c("P", "SP"),
                                 list(findOverlapGene(gene.TSS.tb, chrom2, start2, end2)),
                                 NA),
                gene = list(unique(c(A1_gene, A2_gene))))

temp_p_n <- temp %>% dplyr::filter(str_detect(Anno, "P")) %>%
  dplyr::select(-c("A1_gene", "A2_gene"))
fwrite(temp_p_n, here(commonLoopDir, paste0("loopScore_", name, "_p-n_complex_geneList.tsv")), sep = "\t")

temp <- data %>% rowwise() %>%
  dplyr::mutate(A1_gene = ifelse(A1 %in% c("P", "SP"),
                                 list(findOverlapEnsembl(gene.TSS.tb, chrom1, start1, end1)),
                                 NA),
                A2_gene = ifelse(A2 %in% c("P", "SP"),
                                 list(findOverlapEnsembl(gene.TSS.tb, chrom2, start2, end2)),
                                 NA),
                gene = list(unique(c(A1_gene, A2_gene))))

temp_p_n <- temp %>% dplyr::filter(str_detect(Anno, "P")) %>%
  dplyr::select(-c("A1_gene", "A2_gene"))
fwrite(temp_p_n, here(commonLoopDir, paste0("loopScore_", name, "_p-n_complex_ensemblList.tsv")), sep = "\t")

[3] Hansen

Loops with


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubG9vcF9jaHJvbW8gPC0gYXNfdGliYmxlKGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgXCJsb29wU2NvcmVfY2hyb21vc2lnaHQudHN2XCIpKSlcbmxvb3BfaGljZGNwIDwtIGFzX3RpYmJsZShmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsIFwibG9vcFNjb3JlX2hpY2RjcC50c3ZcIikpKVxubG9vcF9IYW5zZW4gPC0gYXNfdGliYmxlKGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgXCJsb29wU2NvcmVfSGFuc2VuLnRzdlwiKSkpXG5sb29wX1RqaWFuX2Nocm9tbyA8LSBhc190aWJibGUoZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcIi4uL2xvb3BfVGppYW4vVGppYW5DaHJvbW9fdW5pb25fYWxsUmVzLmJlZHBlXCIpKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoYWJzKFY1LVYyKSA8PSAyMDAwMDAwKVxuY29sbmFtZXMobG9vcF9Uamlhbl9jaHJvbW8pIDwtIGMoXCJjaHJvbTFcIiwgXCJzdGFydDFcIiwgXCJlbmQxXCIsIFwiY2hyb20yXCIsIFwic3RhcnQyXCIsIFwiZW5kMlwiKVxubG9vcF9Uamlhbl9tdXN0YWNoZSA8LSBhc190aWJibGUoZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcIi4uL2xvb3BfVGppYW4vVGppYW5NdXN0YWNoZV91bmlvbl9hbGxSZXMuYmVkcGVcIikpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihhYnMoVjUtVjIpIDw9IDIwMDAwMDApXG5jb2xuYW1lcyhsb29wX1RqaWFuX211c3RhY2hlKSA8LSBjKFwiY2hyb20xXCIsIFwic3RhcnQxXCIsIFwiZW5kMVwiLCBcImNocm9tMlwiLCBcInN0YXJ0MlwiLCBcImVuZDJcIilcblxuYGBgIn0= -->

```r
loop_chromo <- as_tibble(fread(here(commonLoopDir, \loopScore_chromosight.tsv\)))
loop_hicdcp <- as_tibble(fread(here(commonLoopDir, \loopScore_hicdcp.tsv\)))
loop_Hansen <- as_tibble(fread(here(commonLoopDir, \loopScore_Hansen.tsv\)))
loop_Tjian_chromo <- as_tibble(fread(here(commonLoopDir, \../loop_Tjian/TjianChromo_union_allRes.bedpe\))) %>%
  dplyr::filter(abs(V5-V2) <= 2000000)
colnames(loop_Tjian_chromo) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\)
loop_Tjian_mustache <- as_tibble(fread(here(commonLoopDir, \../loop_Tjian/TjianMustache_union_allRes.bedpe\))) %>%
  dplyr::filter(abs(V5-V2) <= 2000000)
colnames(loop_Tjian_mustache) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\)

```

<!-- rnb-source-end -->
```r
loop_chromo <- as_tibble(fread(here(commonLoopDir, \loopScore_chromosight.tsv\)))
loop_hicdcp <- as_tibble(fread(here(commonLoopDir, \loopScore_hicdcp.tsv\)))
loop_Hansen <- as_tibble(fread(here(commonLoopDir, \loopScore_Hansen.tsv\)))
loop_Tjian_chromo <- as_tibble(fread(here(commonLoopDir, \../loop_Tjian/TjianChromo_union_allRes.bedpe\))) %>%
  dplyr::filter(abs(V5-V2) <= 2000000)
colnames(loop_Tjian_chromo) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\)
loop_Tjian_mustache <- as_tibble(fread(here(commonLoopDir, \../loop_Tjian/TjianMustache_union_allRes.bedpe\))) %>%
  dplyr::filter(abs(V5-V2) <= 2000000)
colnames(loop_Tjian_mustache) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\)

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


# ANALYSIS
## [1] Comparing loops
### Common stuffs

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJvWld4d1pYSWdkR2hoZENCdmJteDVJSFZ6WlhNZ2RHaGxJSFIzYnlCaGJtTm9iM0p6WEc1dFlXdGxYMmRwSUR3dElHWjFibU4wYVc5dUtHUm1LU0I3WEc0Z0lHRXhJRHd0SUVkU1lXNW5aWE1vWkdZa1kyaHliMjB4TENCSlVtRnVaMlZ6S0dSbUpITjBZWEowTVN3Z1pHWWtaVzVrTVNrcFhHNGdJR0V5SUR3dElFZFNZVzVuWlhNb1pHWWtZMmh5YjIweUxDQkpVbUZ1WjJWektHUm1KSE4wWVhKME1pd2daR1lrWlc1a01pa3BYRzRnSUVkSmJuUmxjbUZqZEdsdmJuTW9ZVEVzSUdFeUtWeHVmVnh1WEc0aklFVjRjR0Z1WkNCbFlXTm9JR0Z1WTJodmNpQjBieUF4TUNCcllpQm1iM0lnWTI5dGNHRnlhWE52Ymx4dVpYaHdZVzVrWDJGdVkyaHZjaUE4TFNCbWRXNWpkR2x2YmlobmFTa2dlMXh1SUNCaE1TQThMU0JoYm1Ob2IzSnpLR2RwTENCY0ltWnBjbk4wWENJcFhHNGdJR0V5SUR3dElHRnVZMmh2Y25Nb1oya3NJRndpYzJWamIyNWtYQ0lwWEc0Z0lHRXhjaUE4TFNCeVpYTnBlbVVvWVRFc0lIZHBaSFJvSUQwZ2NHMWhlQ2gzYVdSMGFDaGhNU2tzSUdWNGNHRnVaRk5wZW1VcExDQm1hWGdnUFNCY0ltTmxiblJsY2x3aUtWeHVJQ0JoTW5JZ1BDMGdjbVZ6YVhwbEtHRXlMQ0IzYVdSMGFDQTlJSEJ0WVhnb2QybGtkR2dvWVRJcExDQmxlSEJoYm1SVGFYcGxLU3dnWm1sNElEMGdYQ0pqWlc1MFpYSmNJaWxjYmlBZ1IwbHVkR1Z5WVdOMGFXOXVjeWhoTVhJc0lHRXljaWxjYm4xY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG4jIGhlbHBlciB0aGF0IG9ubHkgdXNlcyB0aGUgdHdvIGFuY2hvcnNcbm1ha2VfZ2kgPC0gZnVuY3Rpb24oZGYpIHtcbiAgYTEgPC0gR1JhbmdlcyhkZiRjaHJvbTEsIElSYW5nZXMoZGYkc3RhcnQxLCBkZiRlbmQxKSlcbiAgYTIgPC0gR1JhbmdlcyhkZiRjaHJvbTIsIElSYW5nZXMoZGYkc3RhcnQyLCBkZiRlbmQyKSlcbiAgR0ludGVyYWN0aW9ucyhhMSwgYTIpXG59XG5cbiMgRXhwYW5kIGVhY2ggYW5jaG9yIHRvIDEwIGtiIGZvciBjb21wYXJpc29uXG5leHBhbmRfYW5jaG9yIDwtIGZ1bmN0aW9uKGdpKSB7XG4gIGExIDwtIGFuY2hvcnMoZ2ksIFxcZmlyc3RcXClcbiAgYTIgPC0gYW5jaG9ycyhnaSwgXFxzZWNvbmRcXClcbiAgYTFyIDwtIHJlc2l6ZShhMSwgd2lkdGggPSBwbWF4KHdpZHRoKGExKSwgZXhwYW5kU2l6ZSksIGZpeCA9IFxcY2VudGVyXFwpXG4gIGEyciA8LSByZXNpemUoYTIsIHdpZHRoID0gcG1heCh3aWR0aChhMiksIGV4cGFuZFNpemUpLCBmaXggPSBcXGNlbnRlclxcKVxuICBHSW50ZXJhY3Rpb25zKGExciwgYTJyKVxufVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# helper that only uses the two anchors
make_gi <- function(df) {
  a1 <- GRanges(df$chrom1, IRanges(df$start1, df$end1))
  a2 <- GRanges(df$chrom2, IRanges(df$start2, df$end2))
  GInteractions(a1, a2)
}

# Expand each anchor to 10 kb for comparison
expand_anchor <- function(gi) {
  a1 <- anchors(gi, \first\)
  a2 <- anchors(gi, \second\)
  a1r <- resize(a1, width = pmax(width(a1), expandSize), fix = \center\)
  a2r <- resize(a2, width = pmax(width(a2), expandSize), fix = \center\)
  GInteractions(a1r, a2r)
}



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5Qm9aV3h3WlhJZ2RHaGhkQ0J2Ym14NUlIVnpaWE1nZEdobElIUjNieUJoYm1Ob2IzSnpYRzV0WVd0bFgyZHBJRHd0SUdaMWJtTjBhVzl1S0dSbUtTQjdYRzRnSUdFeElEd3RJRWRTWVc1blpYTW9aR1lrWTJoeWIyMHhMQ0JKVW1GdVoyVnpLR1JtSkhOMFlYSjBNU3dnWkdZa1pXNWtNU2twWEc0Z0lHRXlJRHd0SUVkU1lXNW5aWE1vWkdZa1kyaHliMjB5TENCSlVtRnVaMlZ6S0dSbUpITjBZWEowTWl3Z1pHWWtaVzVrTWlrcFhHNGdJRWRKYm5SbGNtRmpkR2x2Ym5Nb1lURXNJR0V5S1Z4dWZWeHVYRzRqSUVWNGNHRnVaQ0JsWVdOb0lHRnVZMmh2Y2lCMGJ5QXhNQ0JyWWlCbWIzSWdZMjl0Y0dGeWFYTnZibHh1Wlhod1lXNWtYMkZ1WTJodmNpQThMU0JtZFc1amRHbHZiaWhuYVNrZ2UxeHVJQ0JoTVNBOExTQmhibU5vYjNKektHZHBMQ0JjWEdacGNuTjBYRndwWEc0Z0lHRXlJRHd0SUdGdVkyaHZjbk1vWjJrc0lGeGNjMlZqYjI1a1hGd3BYRzRnSUdFeGNpQThMU0J5WlhOcGVtVW9ZVEVzSUhkcFpIUm9JRDBnY0cxaGVDaDNhV1IwYUNoaE1Ta3NJR1Y0Y0dGdVpGTnBlbVVwTENCbWFYZ2dQU0JjWEdObGJuUmxjbHhjS1Z4dUlDQmhNbklnUEMwZ2NtVnphWHBsS0dFeUxDQjNhV1IwYUNBOUlIQnRZWGdvZDJsa2RHZ29ZVElwTENCbGVIQmhibVJUYVhwbEtTd2dabWw0SUQwZ1hGeGpaVzUwWlhKY1hDbGNiaUFnUjBsdWRHVnlZV04wYVc5dWN5aGhNWElzSUdFeWNpbGNibjFjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuIyBoZWxwZXIgdGhhdCBvbmx5IHVzZXMgdGhlIHR3byBhbmNob3JzXG5tYWtlX2dpIDwtIGZ1bmN0aW9uKGRmKSB7XG4gIGExIDwtIEdSYW5nZXMoZGYkY2hyb20xLCBJUmFuZ2VzKGRmJHN0YXJ0MSwgZGYkZW5kMSkpXG4gIGEyIDwtIEdSYW5nZXMoZGYkY2hyb20yLCBJUmFuZ2VzKGRmJHN0YXJ0MiwgZGYkZW5kMikpXG4gIEdJbnRlcmFjdGlvbnMoYTEsIGEyKVxufVxuXG4jIEV4cGFuZCBlYWNoIGFuY2hvciB0byAxMCBrYiBmb3IgY29tcGFyaXNvblxuZXhwYW5kX2FuY2hvciA8LSBmdW5jdGlvbihnaSkge1xuICBhMSA8LSBhbmNob3JzKGdpLCBcXGZpcnN0XFwpXG4gIGEyIDwtIGFuY2hvcnMoZ2ksIFxcc2Vjb25kXFwpXG4gIGExciA8LSByZXNpemUoYTEsIHdpZHRoID0gcG1heCh3aWR0aChhMSksIGV4cGFuZFNpemUpLCBmaXggPSBcXGNlbnRlclxcKVxuICBhMnIgPC0gcmVzaXplKGEyLCB3aWR0aCA9IHBtYXgod2lkdGgoYTIpLCBleHBhbmRTaXplKSwgZml4ID0gXFxjZW50ZXJcXClcbiAgR0ludGVyYWN0aW9ucyhhMXIsIGEycilcbn1cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBoZWxwZXIgdGhhdCBvbmx5IHVzZXMgdGhlIHR3byBhbmNob3JzXG5tYWtlX2dpIDwtIGZ1bmN0aW9uKGRmKSB7XG4gIGExIDwtIEdSYW5nZXMoZGYkY2hyb20xLCBJUmFuZ2VzKGRmJHN0YXJ0MSwgZGYkZW5kMSkpXG4gIGEyIDwtIEdSYW5nZXMoZGYkY2hyb20yLCBJUmFuZ2VzKGRmJHN0YXJ0MiwgZGYkZW5kMikpXG4gIEdJbnRlcmFjdGlvbnMoYTEsIGEyKVxufVxuXG4jIEV4cGFuZCBlYWNoIGFuY2hvciB0byAxMCBrYiBmb3IgY29tcGFyaXNvblxuZXhwYW5kX2FuY2hvciA8LSBmdW5jdGlvbihnaSkge1xuICBhMSA8LSBhbmNob3JzKGdpLCBcXGZpcnN0XFwpXG4gIGEyIDwtIGFuY2hvcnMoZ2ksIFxcc2Vjb25kXFwpXG4gIGExciA8LSByZXNpemUoYTEsIHdpZHRoID0gcG1heCh3aWR0aChhMSksIGV4cGFuZFNpemUpLCBmaXggPSBcXGNlbnRlclxcKVxuICBhMnIgPC0gcmVzaXplKGEyLCB3aWR0aCA9IHBtYXgod2lkdGgoYTIpLCBleHBhbmRTaXplKSwgZml4ID0gXFxjZW50ZXJcXClcbiAgR0ludGVyYWN0aW9ucyhhMXIsIGEycilcbn1cbmBgYFxuYGBgIn0= -->

```r
```r
# helper that only uses the two anchors
make_gi <- function(df) {
  a1 <- GRanges(df$chrom1, IRanges(df$start1, df$end1))
  a2 <- GRanges(df$chrom2, IRanges(df$start2, df$end2))
  GInteractions(a1, a2)
}

# Expand each anchor to 10 kb for comparison
expand_anchor <- function(gi) {
  a1 <- anchors(gi, \first\)
  a2 <- anchors(gi, \second\)
  a1r <- resize(a1, width = pmax(width(a1), expandSize), fix = \center\)
  a2r <- resize(a2, width = pmax(width(a2), expandSize), fix = \center\)
  GInteractions(a1r, a2r)
}
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

### Import loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVabTl5S0dWNGNHRnVaRk5wZW1VZ2FXNGdZeWcxTURBd0xDQXhNREF3TUN3Z01qVXdNREFwS1h0Y2JpQWdaMmt4SUR3dElHVjRjR0Z1WkY5aGJtTm9iM0lvYldGclpWOW5hU2hzYjI5d1gyTm9jbTl0YnlrcFhHNGdJR2RwTWlBOExTQmxlSEJoYm1SZllXNWphRzl5S0cxaGEyVmZaMmtvYkc5dmNGOW9hV05rWTNBcEtWeHVJQ0JuYVRNZ1BDMGdaWGh3WVc1a1gyRnVZMmh2Y2lodFlXdGxYMmRwS0d4dmIzQmZTR0Z1YzJWdUtTbGNiaUFnWEc0Z0lHZHBYMkZzYkNBOExTQmpLR2RwTVN3Z1oya3lMQ0JuYVRNcFhHNGdJRnh1SUNBaklEUXBJR1JsZEdWeWJXbHVaU0J0WlcxaVpYSnphR2x3SUhacFlTQkRhR1ZpZVhOb1pYWWdaR2x6ZEdGdVkyVWdQU0F4SUdKcGJpZ3hNQ0JyWWlsY2JpQWdhVzR4SUR3dElHOTJaWEpzWVhCelFXNTVLR2RwWDJGc2JDd2daMmt4TENBZ0lDQnRZWGhuWVhBOVpYaHdZVzVrVTJsNlpTd2dkSGx3WlQxY0ltVnhkV0ZzWENJcFhHNGdJR2x1TWlBOExTQnZkbVZ5YkdGd2MwRnVlU2huYVY5aGJHd3NJR2RwTWl3Z0lDQWdiV0Y0WjJGd1BXVjRjR0Z1WkZOcGVtVXNJSFI1Y0dVOVhDSmxjWFZoYkZ3aUtWeHVJQ0JwYmpNZ1BDMGdiM1psY214aGNITkJibmtvWjJsZllXeHNMQ0JuYVRNc0lDQWdJRzFoZUdkaGNEMWxlSEJoYm1SVGFYcGxMQ0IwZVhCbFBWd2laWEYxWVd4Y0lpbGNiaUFnWEc0Z0lHMWxiV0psY25Ob2FYQmZaR1lnUEMwZ2RHbGlZbXhsS0Z4dUlDQWdJR3h2YjNBZ1BTQnpaWEZmWVd4dmJtY29aMmxmWVd4c0tTeGNiaUFnSUNCelpYUXhJRDBnYVc0eExGeHVJQ0FnSUhObGRESWdQU0JwYmpJc1hHNGdJQ0FnYzJWME15QTlJR2x1TTF4dUlDQXBYRzRnSUZ4dUlDQnRaVzFpWlhKemFHbHdYMlJtSUR3dElHMWxiV0psY25Ob2FYQmZaR1lnSlQ0bFhHNGdJQ0FnY21WdVlXMWxLRnh1SUNBZ0lDQWdRMmh5YjIxdmMybG5hSFFnSUNBZ0lEMGdjMlYwTVN4Y2JpQWdJQ0FnSUVocFEwUkRVQ0FnSUNBZ1BTQnpaWFF5TEZ4dUlDQWdJQ0FnU0dGdWMyVnVJRDBnYzJWME0xeHVJQ0FnSUNsY2JpQWdYRzRnSUNNZ05Ta2dWWEJUWlhRZ2NHeHZkQ0J2WmlCaGJHd2dZMjl0WW1sdVlYUnBiMjV6WEc0Z0lIQWdQQzBnZFhCelpYUW9YRzRnSUNBZ2JXVnRZbVZ5YzJocGNGOWtaaXhjYmlBZ0lDQnBiblJsY25ObFkzUWdQU0JqS0Z3aVEyaHliMjF2YzJsbmFIUmNJaXhjSWtocFEwUkRVRndpTEZ3aVNHRnVjMlZ1WENJcExGeHVJQ0FnSUc1aGJXVWdQU0JjSWx3aUxGeHVJQ0FnSUdKaGMyVmZZVzV1YjNSaGRHbHZibk1nUFNCc2FYTjBLRnh1SUNBZ0lDQWdKMHh2YjNBZ0l5Y2dQU0JwYm5SbGNuTmxZM1JwYjI1ZmMybDZaU2dwWEc0Z0lDQWdLVnh1SUNBcElDc2daMmQwYVhSc1pTaHdZWE4wWlRBb1pYaHdZVzVrVTJsNlpTd2dYQ0ppY0NCbGVIQmhibVJsWkN3Z01TQkRhR1ZpZVdOb1pYWWdaR2x6ZEZ3aUtTbGNiaUFnWEc0Z0lGeHVJQ0JtYVd4bFRtRnRaU0E4TFNCb1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tGd2liMlptVTJWMFgxd2lMQ0JsZUhCaGJtUlRhWHBsTENCY0ltSndYMlY0Y0dGdVpHVmtYQ0lwS1Z4dUlDQjNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9OUzQxS1NwdGJWUnZTVzVqYUZ4dUlDQm9aV2xuYUhRZ1BDMGdjR0Z1Wld4VGFYcGxLRE1wS20xdFZHOUpibU5vWEc0Z0lITjJaMnhwZEdVb2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrc0lIZHBaSFJvSUQwZ2QybGtkR2dzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzU5WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5mb3IoZXhwYW5kU2l6ZSBpbiBjKDUwMDAsIDEwMDAwLCAyNTAwMCkpe1xuICBnaTEgPC0gZXhwYW5kX2FuY2hvcihtYWtlX2dpKGxvb3BfY2hyb21vKSlcbiAgZ2kyIDwtIGV4cGFuZF9hbmNob3IobWFrZV9naShsb29wX2hpY2RjcCkpXG4gIGdpMyA8LSBleHBhbmRfYW5jaG9yKG1ha2VfZ2kobG9vcF9IYW5zZW4pKVxuICBcbiAgZ2lfYWxsIDwtIGMoZ2kxLCBnaTIsIGdpMylcbiAgXG4gICMgNCkgZGV0ZXJtaW5lIG1lbWJlcnNoaXAgdmlhIENoZWJ5c2hldiBkaXN0YW5jZSA9IDEgYmluKDEwIGtiKVxuICBpbjEgPC0gb3ZlcmxhcHNBbnkoZ2lfYWxsLCBnaTEsICAgIG1heGdhcD1leHBhbmRTaXplLCB0eXBlPVxcZXF1YWxcXClcbiAgaW4yIDwtIG92ZXJsYXBzQW55KGdpX2FsbCwgZ2kyLCAgICBtYXhnYXA9ZXhwYW5kU2l6ZSwgdHlwZT1cXGVxdWFsXFwpXG4gIGluMyA8LSBvdmVybGFwc0FueShnaV9hbGwsIGdpMywgICAgbWF4Z2FwPWV4cGFuZFNpemUsIHR5cGU9XFxlcXVhbFxcKVxuICBcbiAgbWVtYmVyc2hpcF9kZiA8LSB0aWJibGUoXG4gICAgbG9vcCA9IHNlcV9hbG9uZyhnaV9hbGwpLFxuICAgIHNldDEgPSBpbjEsXG4gICAgc2V0MiA9IGluMixcbiAgICBzZXQzID0gaW4zXG4gIClcbiAgXG4gIG1lbWJlcnNoaXBfZGYgPC0gbWVtYmVyc2hpcF9kZiAlPiVcbiAgICByZW5hbWUoXG4gICAgICBDaHJvbW9zaWdodCAgICAgPSBzZXQxLFxuICAgICAgSGlDRENQICAgICA9IHNldDIsXG4gICAgICBIYW5zZW4gPSBzZXQzXG4gICAgKVxuICBcbiAgIyA1KSBVcFNldCBwbG90IG9mIGFsbCBjb21iaW5hdGlvbnNcbiAgcCA8LSB1cHNldChcbiAgICBtZW1iZXJzaGlwX2RmLFxuICAgIGludGVyc2VjdCA9IGMoXFxDaHJvbW9zaWdodFxcLFxcSGlDRENQXFwsXFxIYW5zZW5cXCksXG4gICAgbmFtZSA9IFxcXFwsXG4gICAgYmFzZV9hbm5vdGF0aW9ucyA9IGxpc3QoXG4gICAgICAnTG9vcCAjJyA9IGludGVyc2VjdGlvbl9zaXplKClcbiAgICApXG4gICkgKyBnZ3RpdGxlKHBhc3RlMChleHBhbmRTaXplLCBcXGJwIGV4cGFuZGVkXG4ifQ== -->
for(expandSize in c(5000, 10000, 25000)){
  gi1 <- expand_anchor(make_gi(loop_chromo))
  gi2 <- expand_anchor(make_gi(loop_hicdcp))
  gi3 <- expand_anchor(make_gi(loop_Hansen))
  
  gi_all <- c(gi1, gi2, gi3)
  
  # 4) determine membership via Chebyshev distance = 1 bin(10 kb)
  in1 <- overlapsAny(gi_all, gi1,    maxgap=expandSize, type=\equal\)
  in2 <- overlapsAny(gi_all, gi2,    maxgap=expandSize, type=\equal\)
  in3 <- overlapsAny(gi_all, gi3,    maxgap=expandSize, type=\equal\)
  
  membership_df <- tibble(
    loop = seq_along(gi_all),
    set1 = in1,
    set2 = in2,
    set3 = in3
  )
  
  membership_df <- membership_df %>%
    rename(
      Chromosight     = set1,
      HiCDCP     = set2,
      Hansen = set3
    )
  
  # 5) UpSet plot of all combinations
  p <- upset(
    membership_df,
    intersect = c(\Chromosight\,\HiCDCP\,\Hansen\),
    name = \\,
    base_annotations = list(
      'Loop #' = intersection_size()
    )
  ) + ggtitle(paste0(expandSize, \bp expanded
```r
for(expandSize in c(5000, 10000, 25000)){
  gi1 <- expand_anchor(make_gi(loop_chromo))
  gi2 <- expand_anchor(make_gi(loop_hicdcp))
  gi3 <- expand_anchor(make_gi(loop_Hansen))
  
  gi_all <- c(gi1, gi2, gi3)
  
  # 4) determine membership via Chebyshev distance = 1 bin(10 kb)
  in1 <- overlapsAny(gi_all, gi1,    maxgap=expandSize, type=\equal\)
  in2 <- overlapsAny(gi_all, gi2,    maxgap=expandSize, type=\equal\)
  in3 <- overlapsAny(gi_all, gi3,    maxgap=expandSize, type=\equal\)
  
  membership_df <- tibble(
    loop = seq_along(gi_all),
    set1 = in1,
    set2 = in2,
    set3 = in3
  )
  
  membership_df <- membership_df %>%
    rename(
      Chromosight     = set1,
      HiCDCP     = set2,
      Hansen = set3
    )
  
  # 5) UpSet plot of all combinations
  p <- upset(
    membership_df,
    intersect = c(\Chromosight\,\HiCDCP\,\Hansen\),
    name = \\,
    base_annotations = list(
      'Loop #' = intersection_size()
    )
  ) + ggtitle(paste0(expandSize, \bp expanded

[FIG] Offset plot

Function


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZm9yKGV4cGFuZFNpemUgaW4gYyg1MDAwLCAxMDAwMCwgMjUwMDApKXtcbiAgZ2kxIDwtIGV4cGFuZF9hbmNob3IobWFrZV9naShsb29wX2Nocm9tbykpXG4gIGdpMiA8LSBleHBhbmRfYW5jaG9yKG1ha2VfZ2kobG9vcF9Uamlhbl9jaHJvbW8pKVxuICBnaTMgPC0gZXhwYW5kX2FuY2hvcihtYWtlX2dpKGxvb3BfVGppYW5fbXVzdGFjaGUpKVxuICBcbiAgZ2lfYWxsIDwtIGMoZ2kxLCBnaTIsIGdpMylcbiAgXG4gICMgNCkgZGV0ZXJtaW5lIG1lbWJlcnNoaXAgdmlhIENoZWJ5c2hldiBkaXN0YW5jZSA9IDEgYmluKDEwIGtiKVxuICBpbjEgPC0gb3ZlcmxhcHNBbnkoZ2lfYWxsLCBnaTEsICAgIG1heGdhcD1leHBhbmRTaXplLCB0eXBlPVwiZXF1YWxcIilcbiAgaW4yIDwtIG92ZXJsYXBzQW55KGdpX2FsbCwgZ2kyLCAgICBtYXhnYXA9ZXhwYW5kU2l6ZSwgdHlwZT1cImVxdWFsXCIpXG4gIGluMyA8LSBvdmVybGFwc0FueShnaV9hbGwsIGdpMywgICAgbWF4Z2FwPWV4cGFuZFNpemUsIHR5cGU9XCJlcXVhbFwiKVxuICBcbiAgbWVtYmVyc2hpcF9kZiA8LSB0aWJibGUoXG4gICAgbG9vcCA9IHNlcV9hbG9uZyhnaV9hbGwpLFxuICAgIHNldDEgPSBpbjEsXG4gICAgc2V0MiA9IGluMixcbiAgICBzZXQzID0gaW4zXG4gIClcbiAgXG4gIG1lbWJlcnNoaXBfZGYgPC0gbWVtYmVyc2hpcF9kZiAlPiVcbiAgICByZW5hbWUoXG4gICAgICBMZWVfY2hyb21vICAgICA9IHNldDEsXG4gICAgICBUamlhbl9jaHJvbW8gICAgID0gc2V0MixcbiAgICAgIFRqaWFuX211c3RhY2hlID0gc2V0M1xuICAgIClcbiAgXG4gICMgNSkgVXBTZXQgcGxvdCBvZiBhbGwgY29tYmluYXRpb25zXG4gIHAgPC0gdXBzZXQoXG4gICAgbWVtYmVyc2hpcF9kZixcbiAgICBpbnRlcnNlY3QgPSBjKFwiTGVlX2Nocm9tb1wiLFwiVGppYW5fY2hyb21vXCIsXCJUamlhbl9tdXN0YWNoZVwiKSxcbiAgICBuYW1lID0gXCJcIixcbiAgICBiYXNlX2Fubm90YXRpb25zID0gbGlzdChcbiAgICAgICdMb29wICMnID0gaW50ZXJzZWN0aW9uX3NpemUoKVxuICAgIClcbiAgKSArIGdndGl0bGUocGFzdGUwKGV4cGFuZFNpemUsIFwiYnAgZXhwYW5kZWQsIDEgQ2hlYnljaGV2IGRpc3RcIikpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcIm9mZlNldDJfXCIsIGV4cGFuZFNpemUsIFwiYnBfZXhwYW5kZWRcIikpXG4gIHdpZHRoIDwtIHBhbmVsU2l6ZSg1LjUpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMykqbW1Ub0luY2hcbiAgc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFwiLnN2Z1wiKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbmBgYCJ9 -->

```r
for(expandSize in c(5000, 10000, 25000)){
  gi1 <- expand_anchor(make_gi(loop_chromo))
  gi2 <- expand_anchor(make_gi(loop_Tjian_chromo))
  gi3 <- expand_anchor(make_gi(loop_Tjian_mustache))
  
  gi_all <- c(gi1, gi2, gi3)
  
  # 4) determine membership via Chebyshev distance = 1 bin(10 kb)
  in1 <- overlapsAny(gi_all, gi1,    maxgap=expandSize, type=\equal\)
  in2 <- overlapsAny(gi_all, gi2,    maxgap=expandSize, type=\equal\)
  in3 <- overlapsAny(gi_all, gi3,    maxgap=expandSize, type=\equal\)
  
  membership_df <- tibble(
    loop = seq_along(gi_all),
    set1 = in1,
    set2 = in2,
    set3 = in3
  )
  
  membership_df <- membership_df %>%
    rename(
      Lee_chromo     = set1,
      Tjian_chromo     = set2,
      Tjian_mustache = set3
    )
  
  # 5) UpSet plot of all combinations
  p <- upset(
    membership_df,
    intersect = c(\Lee_chromo\,\Tjian_chromo\,\Tjian_mustache\),
    name = \\,
    base_annotations = list(
      'Loop #' = intersection_size()
    )
  ) + ggtitle(paste0(expandSize, \bp expanded
```r
for(expandSize in c(5000, 10000, 25000)){
  gi1 <- expand_anchor(make_gi(loop_chromo))
  gi2 <- expand_anchor(make_gi(loop_Tjian_chromo))
  gi3 <- expand_anchor(make_gi(loop_Tjian_mustache))
  
  gi_all <- c(gi1, gi2, gi3)
  
  # 4) determine membership via Chebyshev distance = 1 bin(10 kb)
  in1 <- overlapsAny(gi_all, gi1,    maxgap=expandSize, type=\equal\)
  in2 <- overlapsAny(gi_all, gi2,    maxgap=expandSize, type=\equal\)
  in3 <- overlapsAny(gi_all, gi3,    maxgap=expandSize, type=\equal\)
  
  membership_df <- tibble(
    loop = seq_along(gi_all),
    set1 = in1,
    set2 = in2,
    set3 = in3
  )
  
  membership_df <- membership_df %>%
    rename(
      Lee_chromo     = set1,
      Tjian_chromo     = set2,
      Tjian_mustache = set3
    )
  
  # 5) UpSet plot of all combinations
  p <- upset(
    membership_df,
    intersect = c(\Lee_chromo\,\Tjian_chromo\,\Tjian_mustache\),
    name = \\,
    base_annotations = list(
      'Loop #' = intersection_size()
    )
  ) + ggtitle(paste0(expandSize, \bp expanded

HiCDC+, Hansen


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5kcmF3X2RvbnV0IDwtIGZ1bmN0aW9uKGxvb3AsIG5hbWUpe1xuICBuIDwtIG5yb3cobG9vcClcbiAgdGVtcCA8LSBsb29wICU+JSBkcGx5cjo6c2VsZWN0KGlkLCBBbm5vKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKEFubm9Hcm91cCA9IGNhc2Vfd2hlbihcbiAgICAgIEFubm8gJWluJSBjKFwiUC1QXCIsIFwiUC1FXCIsIFwiRS1FXCIpIH4gXCJyZWdfcmVnXCIsXG4gICAgICBBbm5vICVpbiUgYyhcIlAtU1BcIiwgXCJQLVNFXCIsIFwiRS1TUFwiLCBcIkUtU0VcIikgfiBcInJlZ19zdHJSZWdcIixcbiAgICAgIEFubm8gJWluJSBjKFwiUC1TXCIsIFwiRS1TXCIpIH4gXCJyZWdfc3RyXCIsXG4gICAgICBBbm5vICVpbiUgYyhcIlNQLVNQXCIsIFwiU1AtU0VcIiwgXCJTRS1TRVwiKSB+IFwic3RyUmVnX3N0clJlZ1wiLFxuICAgICAgQW5ubyAlaW4lIGMoXCJTUC1TXCIsIFwiU0UtU1wiKSB+IFwic3RyUmVnX3N0clwiLFxuICAgICAgQW5ubyAlaW4lIGMoXCJQLVhcIiwgXCJFLVhcIikgfiBcInJlZ19vdGhlclwiLFxuICAgICAgQW5ubyAlaW4lIGMoXCJTUC1YXCIsIFwiU0UtWFwiKSB+IFwic3RyUmVnX290aGVyXCIsXG4gICAgICBBbm5vICVpbiUgYyhcIlMtU1wiLCBcIlMtWFwiKSB+IFwic3RyXCIsXG4gICAgICBBbm5vICVpbiUgYyhcIlgtWFwiKSB+IFwib3RoZXJcIixcbiAgICAgIFRSVUUgfiBOQVxuICAgICkpXG4gIFxuICBcbiAgdGVtcCRBbm5vR3JvdXAgPC0gZmFjdG9yKHRlbXAkQW5ub0dyb3VwLCBsZXZlbHMgPSBjKFwicmVnX3JlZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWdfc3RyUmVnXCIsIFwicmVnX3N0clwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzdHJSZWdfc3RyUmVnXCIsIFwic3RyUmVnX3N0clwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWdfb3RoZXJcIiwgXCJzdHJSZWdfb3RoZXJcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInN0clwiLCBcIm90aGVyXCIpKVxuICBcbiAgXG4gIHBpZV9kZiA8LSB0ZW1wICU+JVxuICAgIGFzX3RpYmJsZSgpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiB0ZW1wIHdhcyBhIGxpc3QsIHRoaXMgd2lsbCBlcnJvciBlYXJseVxuICAgIGdyb3VwX2J5KEFubm9Hcm91cCkgJT4lXG4gICAgc3VtbWFyaXNlKG4gPSBuKCksIC5ncm91cHMgPSBcImRyb3BcIikgJT4lXG4gICAgbXV0YXRlKGxhYmVsID0gcGFzdGUwKEFubm9Hcm91cCwgXCJcXG4oXCIsIG4sIFwiKVwiKSlcbiAgXG4gIHAgPC0gZ2dwbG90KHBpZV9kZiwgYWVzKHggPSAyLCB5ID0gbiwgZmlsbCA9IEFubm9Hcm91cCkpICtcbiAgICBnZW9tX2NvbChjb2xvciA9IFwiYmxhY2tcIiwgd2lkdGggPSAxKSArXG4gICAgY29vcmRfcG9sYXIodGhldGEgPSBcInlcIikgK1xuICAgIHhsaW0oMC41LCAyLjUpICsgICAgICAgICAgICAgICAgIyA8LSBjcmVhdGVzIHRoZSDigJxob2xl4oCdIGJ5IGNsaXBwaW5nIHRoZSBjZW50ZXJcbiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbGFiZWwpLFxuICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSxcbiAgICAgICAgICAgICAgc2l6ZSA9IDMpICtcbiAgICB0aGVtZV92b2lkKCkgK1xuICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFwibm9uZVwiLFxuICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpXG4gICAgKSArXG4gICAgZ2d0aXRsZShwYXN0ZTAobmFtZSwgXCJcXG5cIiwgbiwgXCIgbG9vcHNcIikpXG4gIFxuICBcbiAgd2lkdGggPSAzXG4gIGhlaWdodCA9IDNcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpcixcbiAgICAgICAgICAgICAgIHBhc3RlMChcImRvbnV0X2xvb3BBbm5vX1wiLCBuYW1lLCBcIi5zdmdcIikpLFxuICAgICAgICAgIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodClcbiAgcGxvdChwKVxuICBkZXYub2ZmKClcbn1cblxuZHJhd19kb251dChsb29wX2Nocm9tbywgXCJjaHJvbW9zaWdodFwiKVxuYGBgIn0= -->

```r

draw_donut <- function(loop, name){
  n <- nrow(loop)
  temp <- loop %>% dplyr::select(id, Anno) %>%
    dplyr::mutate(AnnoGroup = case_when(
      Anno %in% c(\P-P\, \P-E\, \E-E\) ~ \reg_reg\,
      Anno %in% c(\P-SP\, \P-SE\, \E-SP\, \E-SE\) ~ \reg_strReg\,
      Anno %in% c(\P-S\, \E-S\) ~ \reg_str\,
      Anno %in% c(\SP-SP\, \SP-SE\, \SE-SE\) ~ \strReg_strReg\,
      Anno %in% c(\SP-S\, \SE-S\) ~ \strReg_str\,
      Anno %in% c(\P-X\, \E-X\) ~ \reg_other\,
      Anno %in% c(\SP-X\, \SE-X\) ~ \strReg_other\,
      Anno %in% c(\S-S\, \S-X\) ~ \str\,
      Anno %in% c(\X-X\) ~ \other\,
      TRUE ~ NA
    ))
  
  
  temp$AnnoGroup <- factor(temp$AnnoGroup, levels = c(\reg_reg\,
                                                      \reg_strReg\, \reg_str\,
                                                      \strReg_strReg\, \strReg_str\,
                                                      \reg_other\, \strReg_other\, 
                                                      \str\, \other\))
  
  
  pie_df <- temp %>%
    as_tibble() %>%                          # if temp was a list, this will error early
    group_by(AnnoGroup) %>%
    summarise(n = n(), .groups = \drop\) %>%
    mutate(label = paste0(AnnoGroup, \\n(\, n, \)\))
  
  p <- ggplot(pie_df, aes(x = 2, y = n, fill = AnnoGroup)) +
    geom_col(color = \black\, width = 1) +
    coord_polar(theta = \y\) +
    xlim(0.5, 2.5) +                # <- creates the “hole” by clipping the center
    geom_text(aes(label = label),
              position = position_stack(vjust = 0.5),
              size = 3) +
    theme_void() +
    theme(legend.position = \none\,
          plot.title = element_text(hjust = 0.5)
    ) +
    ggtitle(paste0(name, \\n\, n, \ loops\))
  
  
  width = 3
  height = 3
  svglite(here(figDir,
               paste0(\donut_loopAnno_\, name, \.svg\)),
          width = width, height = height)
  plot(p)
  dev.off()
}

draw_donut(loop_chromo, \chromosight\)
```

<!-- rnb-source-end -->
```r

draw_donut <- function(loop, name){
  n <- nrow(loop)
  temp <- loop %>% dplyr::select(id, Anno) %>%
    dplyr::mutate(AnnoGroup = case_when(
      Anno %in% c(\P-P\, \P-E\, \E-E\) ~ \reg_reg\,
      Anno %in% c(\P-SP\, \P-SE\, \E-SP\, \E-SE\) ~ \reg_strReg\,
      Anno %in% c(\P-S\, \E-S\) ~ \reg_str\,
      Anno %in% c(\SP-SP\, \SP-SE\, \SE-SE\) ~ \strReg_strReg\,
      Anno %in% c(\SP-S\, \SE-S\) ~ \strReg_str\,
      Anno %in% c(\P-X\, \E-X\) ~ \reg_other\,
      Anno %in% c(\SP-X\, \SE-X\) ~ \strReg_other\,
      Anno %in% c(\S-S\, \S-X\) ~ \str\,
      Anno %in% c(\X-X\) ~ \other\,
      TRUE ~ NA
    ))
  
  
  temp$AnnoGroup <- factor(temp$AnnoGroup, levels = c(\reg_reg\,
                                                      \reg_strReg\, \reg_str\,
                                                      \strReg_strReg\, \strReg_str\,
                                                      \reg_other\, \strReg_other\, 
                                                      \str\, \other\))
  
  
  pie_df <- temp %>%
    as_tibble() %>%                          # if temp was a list, this will error early
    group_by(AnnoGroup) %>%
    summarise(n = n(), .groups = \drop\) %>%
    mutate(label = paste0(AnnoGroup, \\n(\, n, \)\))
  
  p <- ggplot(pie_df, aes(x = 2, y = n, fill = AnnoGroup)) +
    geom_col(color = \black\, width = 1) +
    coord_polar(theta = \y\) +
    xlim(0.5, 2.5) +                # <- creates the “hole” by clipping the center
    geom_text(aes(label = label),
              position = position_stack(vjust = 0.5),
              size = 3) +
    theme_void() +
    theme(legend.position = \none\,
          plot.title = element_text(hjust = 0.5)
    ) +
    ggtitle(paste0(name, \\n\, n, \ loops\))
  
  
  width = 3
  height = 3
  svglite(here(figDir,
               paste0(\donut_loopAnno_\, name, \.svg\)),
          width = width, height = height)
  plot(p)
  dev.off()
}

draw_donut(loop_chromo, \chromosight\)

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcblxuPCEtLSBybmItc291cmNlLWJlZ2luIGV5SmtZWFJoSWpvaVlHQmdjbHh1WkhKaGQxOWtiMjUxZENoc2IyOXdYMmhwWTJSamNDd2dYQ0pvYVdOa1kzQmNJaWxjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmRyYXdfZG9udXQobG9vcF9oaWNkY3AsIFxcaGljZGNwXFwpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->

null device 1

draw_donut(loop_hicdcp, \hicdcp\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVpISmhkMTlrYjI1MWRDaHNiMjl3WDJocFkyUmpjQ3dnWEZ4b2FXTmtZM0JjWENsY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbmRyYXdfZG9udXQobG9vcF9oaWNkY3AsIFxcaGljZGNwXFwpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZHJhd19kb251dChsb29wX2hpY2RjcCwgXFxoaWNkY3BcXClcbmBgYFxuYGBgIn0= -->

```r
```r
draw_donut(loop_hicdcp, \hicdcp\)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcblxuPCEtLSBybmItc291cmNlLWJlZ2luIGV5SmtZWFJoSWpvaVlHQmdjbHh1WkhKaGQxOWtiMjUxZENoc2IyOXdYMGhoYm5ObGJpd2dYQ0pJWVc1elpXNWNJaWxjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmRyYXdfZG9udXQobG9vcF9IYW5zZW4sIFxcSGFuc2VuXFwpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->

null device 1

draw_donut(loop_Hansen, \Hansen\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVpISmhkMTlrYjI1MWRDaHNiMjl3WDBoaGJuTmxiaXdnWEZ4SVlXNXpaVzVjWENsY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbmRyYXdfZG9udXQobG9vcF9IYW5zZW4sIFxcSGFuc2VuXFwpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZHJhd19kb251dChsb29wX0hhbnNlbiwgXFxIYW5zZW5cXClcbmBgYFxuYGBgIn0= -->

```r
```r
draw_donut(loop_Hansen, \Hansen\)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

```
null device 
          1 
```



<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Tjian

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjR3h2ZEY5c2IyOXdYM05qYjNKbGMxOWhibVJmYzJGMlpWOWlaV1J3WlNBOExTQm1kVzVqZEdsdmJpaGtaaXdnWTI5c1gzZ3NJR052YkY5NUxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjlzWDNoZmIyOWxMQ0JqYjJ4ZmVWOXZiMlVzSUhCelpYVmtiMTl2YjJVZ1BTQXdMakF4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaGJtNXZUR2x6ZEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaU3dnZEdsMGJHVXNJR1pwWjBScGNpd2diRzl2Y0VScGNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2xtWmtOMWRHOW1aaUE5SURBdU1pd2daR1Z1YzJsMGVWOXVJRDBnTWpBd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjRiV2x1SUQwZ0xUQXVOU3dnZUcxaGVDQTlJREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhsdGFXNGdQU0F0TUM0MUxDQjViV0Y0SUQwZ01Ta2dlMXh1SUNCamIyeGZlRjl4SUR3dElHVnVjWFZ2S0dOdmJGOTRLVnh1SUNCamIyeGZlVjl4SUR3dElHVnVjWFZ2S0dOdmJGOTVLVnh1SUNCY2JpQWdZMjlzWDNoZmIyOWxYM0VnUEMwZ1pXNXhkVzhvWTI5c1gzaGZiMjlsS1Z4dUlDQmpiMnhmZVY5dmIyVmZjU0E4TFNCbGJuRjFieWhqYjJ4ZmVWOXZiMlVwWEc0Z0lGeHVJQ0FqSUVOeVpXRjBaU0JoSUhOcGJtZHNaU3dnZFc1cFptbGxaQ0JrWVhSaFpuSmhiV1VnWm05eUlIQnNiM1IwYVc1bklHRnVaQ0J6WVhacGJtY2dZWE1nWW1Wa2NHVmNiaUFnWkdaZmRHVnRjQ0E4TFNCa1ppQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOWZjMmx0Y0d4bElDVnBiaVVnWVc1dWIweHBjM1FwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB6Wld4bFkzUW9ZMmh5YjIweExDQnpkR0Z5ZERFc0lHVnVaREVzSUdOb2NtOXRNaXdnYzNSaGNuUXlMQ0JsYm1ReUxDQnBaQ3dnZUNBOUlDRWhZMjlzWDNoZmNTd2dlU0E5SUNFaFkyOXNYM2xmY1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIaGZiMjlsSUQwZ0lTRmpiMnhmZUY5dmIyVmZjU3dnZVY5dmIyVWdQU0FoSVdOdmJGOTVYMjl2WlY5eEtTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0dScFptWWdQU0I1TFhnc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtaVzV6YVhSNUlEMGdaMlYwWDJSbGJuTnBkSGtvZUN3Z2VTd2diaUE5SUdSbGJuTnBkSGxmYmlrcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvZFhCa2IzZHVJRDBnWTJGelpWOTNhR1Z1S0Z4dUlDQWdJQ0FnWkdsbVppQStJR1JwWm1aRGRYUnZabVlnSUg0Z1hDSlZVRndpTEZ4dUlDQWdJQ0FnWkdsbVppQThJQzFrYVdabVEzVjBiMlptSUg0Z1hDSkVUMWRPWENJc1hHNGdJQ0FnSUNCVVVsVkZJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZpQmNJazVQWENJcEtWeHVJQ0JjYmlBZ0l5QkZlSEJ2Y25RZ1lYTWdZbVZrY0dWY2JpQWdZbVZrY0dWVlVDQThMU0JrWmw5MFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSFZ3Wkc5M2JpQTlQU0JjSWxWUVhDSXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR05vY205dE1Td2djM1JoY25ReExDQmxibVF4TENCamFISnZiVElzSUhOMFlYSjBNaXdnWlc1a01pbGNiaUFnWm5keWFYUmxLR0psWkhCbFZWQXNJR2hsY21Vb2JHOXZjRVJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDJScFptWkRkWFJ2Wm1aY0lpd2daR2xtWmtOMWRHOW1aaXdnWENKZlZWQXVZbVZrY0dWY0lpa3BMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUxDQmpiMnd1Ym1GdFpYTWdQU0JHUVV4VFJTbGNiaUFnWW1Wa2NHVk9UeUE4TFNCa1psOTBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hWd1pHOTNiaUE5UFNCY0lrNVBYQ0lwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dOb2NtOXRNU3dnYzNSaGNuUXhMQ0JsYm1ReExDQmphSEp2YlRJc0lITjBZWEowTWl3Z1pXNWtNaWxjYmlBZ1puZHlhWFJsS0dKbFpIQmxUazhzSUdobGNtVW9iRzl2Y0VScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgyUnBabVpEZFhSdlptWmNJaXdnWkdsbVprTjFkRzltWml3Z1hDSmZUazh1WW1Wa2NHVmNJaWtwTENCelpYQWdQU0JjSWx4Y2RGd2lMQ0JqYjJ3dWJtRnRaWE1nUFNCR1FVeFRSU2xjYmlBZ1ltVmtjR1ZFVDFkT0lEd3RJR1JtWDNSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9kWEJrYjNkdUlEMDlJRndpUkU5WFRsd2lLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hqYUhKdmJURXNJSE4wWVhKME1Td2daVzVrTVN3Z1kyaHliMjB5TENCemRHRnlkRElzSUdWdVpESXBYRzRnSUdaM2NtbDBaU2hpWldSd1pVUlBWMDRzSUdobGNtVW9iRzl2Y0VScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgyUnBabVpEZFhSdlptWmNJaXdnWkdsbVprTjFkRzltWml3Z1hDSmZSRTlYVGk1aVpXUndaVndpS1Nrc0lITmxjQ0E5SUZ3aVhGeDBYQ0lzSUdOdmJDNXVZVzFsY3lBOUlFWkJURk5GS1Z4dUlDQmNiaUFnWEc0Z0lIQnNiM1JmWkdZZ1BDMGdaR1pmZEdWdGNDQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNmMyVnNaV04wS0dsa0xDQjRMQ0I1TENCMWNHUnZkMjRzSUdSbGJuTnBkSGtwSUNVK0pWeHVJQ0FnSUdGeWNtRnVaMlVvWkdWdWMybDBlU2xjYmlBZ1hHNGdJSEJzYjNSZlpHWWtkWEJrYjNkdUlEd3RJR1poWTNSdmNpaHdiRzkwWDJSbUpIVndaRzkzYml3Z1l5aGNJbFZRWENJc0lGd2lUazljSWl3Z1hDSkVUMWRPWENJcEtWeHVJQ0JjYmlBZ0l5QkRZV3hqZFd4aGRHVWdZU0JuYkc5aVlXd2daR1Z1YzJsMGVTQnlZVzVuWlNCMGJ5QnRZV3RsSUhOallXeGxjeUJqYjIxd1lYSmhZbXhsWEc0Z0lHUmxibk5wZEhsZmJHbHRhWFJ6SUR3dElISmhibWRsS0hCc2IzUmZaR1lrWkdWdWMybDBlU3dnYm1FdWNtMGdQU0JVVWxWRktWeHVJQ0JjYmlBZ0l5QXRMUzB0TFMwZ1UyTmhkSFJsY25Cc2IzUWdMUzB0TFMwdElGeHVJQ0J3TVNBOExTQm5aM0JzYjNRb2NHeHZkRjlrWml3Z1lXVnpLSGdnUFNCNExDQjVJRDBnZVNrcElDdGNiaUFnSUNBaklFeGhlV1Z5SURFNklGQnNiM1FnWENKT1Qxd2lJSEJ2YVc1MGN5QjNhWFJvSUdFZ1ozSmxlU0J6WTJGc1pWeHVJQ0FnSUdkbGIyMWZjRzlwYm5Rb1pHRjBZU0E5SUM0Z0pUNGxJR1pwYkhSbGNpaDFjR1J2ZDI0Z1BUMGdYQ0pPVDF3aUtTQWxQaVVnWVhKeVlXNW5aU2hrWlc1emFYUjVLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0ZsY3loamIyeHZjaUE5SUdSbGJuTnBkSGtwTENCemFYcGxJRDBnTUM0eEtTQXJYRzRnSUNBZ2MyTmhiR1ZmWTI5c2IzSmZaM0poWkdsbGJuUW9YRzRnSUNBZ0lDQnNiM2NnUFNCY0ltZHlaWGs0TlZ3aUxDQm9hV2RvSUQwZ1hDSm5jbVY1TXpCY0lpeGNiaUFnSUNBZ0lHeHBiV2wwY3lBOUlHUmxibk5wZEhsZmJHbHRhWFJ6TENCdVlXMWxJRDBnWENKRVpXNXphWFI1SUNoT1R5bGNJbHh1SUNBZ0lDa2dLMXh1SUNBZ0lGeHVJQ0FnSUNNZ1NXNTBjbTlrZFdObElHRWdibVYzSUhOallXeGxJR1p2Y2lCMGFHVWdYQ0pWVUZ3aUlIQnZhVzUwYzF4dUlDQWdJRzVsZDE5elkyRnNaVjlqYjJ4dmNpZ3BJQ3RjYmlBZ0lDQWpJRXhoZVdWeUlESTZJRkJzYjNRZ1hDSlZVRndpSUhCdmFXNTBjeUIzYVhSb0lHRWdjbVZrSUhOallXeGxYRzRnSUNBZ1oyVnZiVjl3YjJsdWRDaGtZWFJoSUQwZ0xpQWxQaVVnWm1sc2RHVnlLSFZ3Wkc5M2JpQTlQU0JjSWxWUVhDSXBJQ1UrSlNCaGNuSmhibWRsS0dSbGJuTnBkSGtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVdWektHTnZiRzl5SUQwZ1pHVnVjMmwwZVNrc0lITnBlbVVnUFNBd0xqRXBJQ3RjYmlBZ0lDQnpZMkZzWlY5amIyeHZjbDluY21Ga2FXVnVkQ2hjYmlBZ0lDQWdJR3h2ZHlBOUlIZGxZV3RmY21Wa0xDQm9hV2RvSUQwZ2MzUnliMjVuWDNKbFpDd2dJeUJNYVdkb2RDQjBieUJrWVhKcklISmxaRnh1SUNBZ0lDQWdiR2x0YVhSeklEMGdaR1Z1YzJsMGVWOXNhVzFwZEhNc0lHNWhiV1VnUFNCY0lrUmxibk5wZEhrZ0tGVlFLVndpWEc0Z0lDQWdLU0FyWEc0Z0lDQWdYRzRnSUNBZ0l5QkpiblJ5YjJSMVkyVWdZU0J1WlhjZ2MyTmhiR1VnWm05eUlIUm9aU0JjSWtSUFYwNWNJaUJ3YjJsdWRITmNiaUFnSUNCdVpYZGZjMk5oYkdWZlkyOXNiM0lvS1NBclhHNGdJQ0FnSXlCTVlYbGxjaUF6T2lCUWJHOTBJRndpUkU5WFRsd2lJSEJ2YVc1MGN5QjNhWFJvSUdFZ1lteDFaU0J6WTJGc1pWeHVJQ0FnSUdkbGIyMWZjRzlwYm5Rb1pHRjBZU0E5SUM0Z0pUNGxJR1pwYkhSbGNpaDFjR1J2ZDI0Z1BUMGdYQ0pFVDFkT1hDSXBJQ1UrSlNCaGNuSmhibWRsS0dSbGJuTnBkSGtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVdWektHTnZiRzl5SUQwZ1pHVnVjMmwwZVNrc0lITnBlbVVnUFNBd0xqRXBJQ3RjYmlBZ0lDQnpZMkZzWlY5amIyeHZjbDluY21Ga2FXVnVkQ2hjYmlBZ0lDQWdJR3h2ZHlBOUlIZGxZV3RmWW14MVpTd2dhR2xuYUNBOUlITjBjbTl1WjE5aWJIVmxMQ0FqSUV4cFoyaDBJSFJ2SUdSaGNtc2dZbXgxWlZ4dUlDQWdJQ0FnYkdsdGFYUnpJRDBnWkdWdWMybDBlVjlzYVcxcGRITXNJRzVoYldVZ1BTQmNJa1JsYm5OcGRIa2dLRVJQVjA0cFhDSmNiaUFnSUNBcElDdGNiaUFnSUNCY2JpQWdJQ0FqSUVGa1pDQmhibTV2ZEdGMGFXOXVjeUJoYm1RZ2RHaGxiV1VnWld4bGJXVnVkSE5jYmlBZ0lDQjRiR2x0S0Mwd0xqVXNJREVwSUNzZ2VXeHBiU2d0TUM0MUxDQXhLU0FySUdOdmIzSmtYMlpwZUdWa0tDa2dLMXh1SUNBZ0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ01Dd2dZMjlzSUQwZ1hDSm5jbVY1TlRCY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aUtTQXJYRzRnSUNBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBdFpHbG1aa04xZEc5bVppd2dZMjlzSUQwZ1hDSm5jbVY1WENJc0lHeHBibVYwZVhCbElEMGdYQ0prYjNSMFpXUmNJaXhjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWlrZ0sxeHVJQ0FnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z1kyOXNJRDBnWENKbmNtVjVYQ0lzSUd4cGJtVjBlWEJsSUQwZ1hDSmtiM1IwWldSY0lpeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJaWtnSzF4dUlDQWdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ3aVozSmxlVndpTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aUtTQXJYRzRnSUNBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUN3Z1lXeHdhR0VnUFNBd0xqVXNJR052Ykc5eUlEMGdYQ0puY21WNVhDSXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lwSUN0Y2JpQWdJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNBZ0lIUm9aVzFsS0Z4dUlDQWdJQ0FnYkdWblpXNWtMbkJ2YzJsMGFXOXVJRDBnWENKdWIyNWxYQ0lzWEc0Z0lDQWdJQ0J3Ykc5MExuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdJQ0JvYW5WemRDQTlJREF1TlN4Y2JpQWdJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl4Y2JpQWdJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dWY2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTEZ4dUlDQWdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNBZ0tTeGNiaUFnSUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl4Y2JpQWdJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBZ0lDa3NYRzRnSUNBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNBZ0tTeGNiaUFnSUNBZ0lHRjRhWE11ZEdsamEzTWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNBZ0tTeGNiaUFnSUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRndpZEhKaGJuTndZWEpsYm5SY0lpa3NYRzRnSUNBZ0tTQXJYRzRnSUNBZ2JHRmljeWg0SUQwZ2NYVnZYMjVoYldVb1kyOXNYM2hmY1Nrc0lIa2dQU0J4ZFc5ZmJtRnRaU2hqYjJ4ZmVWOXhLU2tnSzF4dUlDQWdJR2RuZEdsMGJHVW9kR2wwYkdVcFhHNGdJRnh1SUNCM2FXUjBhQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNDFLU3B0YlZSdlNXNWphRnh1SUNCb1pXbG5hSFFnUEMwZ2NHRnVaV3hUYVhwbEtERXVOU2txYlcxVWIwbHVZMmdnSUZ4dUlDQmNiaUFnWm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWMyTmhkSFJsY25Cc2IzUmZYQ0lzSUc1aGJXVXBYRzRnSUhOMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dYRzRnSUNBZ0lDQWdJQ0FnZDJsa2RHZ2dQU0IzYVdSMGFDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMEtWeHVJQ0J3Y21sdWRDaHdNU2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJRnh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z1hHNGdJQ0FnSUNCM2FXUjBhQ0E5SUhkcFpIUm9MQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSFZ1YVhSeklEMGdYQ0pwYmx3aUxDQnlaWE1nUFNBMk1EQXBYRzRnSUhCeWFXNTBLSEF4S1Z4dUlDQmtaWFl1YjJabUtDbGNiaUFnWEc0Z0lDTWdMUzB0TFMwdElGQnBaU0JqYUdGeWRDQXRMUzB0TFMwZ1hHNGdJSEJwWlY5a1ppQThMU0J3Ykc5MFgyUm1JQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcGpiM1Z1ZENoMWNHUnZkMjRwSUNVK0pWeHVJQ0FnSUcxMWRHRjBaU2hjYmlBZ0lDQWdJSEJqZENBZ0lEMGdiaUF2SUhOMWJTaHVLU0FxSURFd01DeGNiaUFnSUNBZ0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0hWd1pHOTNiaXdnWENKY1hHNWNJaXdnYml3Z1hDSmNYRzRvWENJc0lISnZkVzVrS0hCamRDd2dNU2tzSUZ3aUpTbGNJaWxjYmlBZ0lDQXBYRzRnSUZ4dUlDQndNaUE4TFNCblozQnNiM1FvY0dsbFgyUm1MQ0JoWlhNb2VDQTlJRndpWENJc0lIa2dQU0J1TENCbWFXeHNJRDBnZFhCa2IzZHVLU2tnSzF4dUlDQWdJR2RsYjIxZlkyOXNLR052Ykc5eUlEMGdYQ0ozYUdsMFpWd2lLU0FyWEc0Z0lDQWdZMjl2Y21SZmNHOXNZWElvZEdobGRHRWdQU0JjSW5sY0lpa2dLMXh1SUNBZ0lHZGxiMjFmZEdWNGRDaGNiaUFnSUNBZ0lHRmxjeWhzWVdKbGJDQTlJR3hoWW1Wc0tTeGNiaUFnSUNBZ0lIQnZjMmwwYVc5dUlEMGdjRzl6YVhScGIyNWZjM1JoWTJzb2RtcDFjM1FnUFNBd0xqVXBMRnh1SUNBZ0lDQWdjMmw2WlNBZ0lDQWdQU0JtYjI1MFUybDZaVTBnTHlBeVhHNGdJQ0FnS1NBclhHNGdJQ0FnZEdobGJXVmZkbTlwWkNncElDc2dkR2hsYldVb2JHVm5aVzVrTG5CdmMybDBhVzl1SUQwZ1hDSnViMjVsWENJcElDdGNiaUFnSUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2lWVkJjSWlBOUlITjBjbTl1WjE5eVpXUXNJRndpVGs5Y0lpQTlJRzV2WDJkeVpYa3NJRndpUkU5WFRsd2lJRDBnYzNSeWIyNW5YMkpzZFdVcEtWeHVJQ0JjYmlBZ1ptbHNaVTVoYldVZ1BDMGdhR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2hjSW5CcFpXTm9ZWEowWDF3aUxDQnVZVzFsS1NsY2JpQWdkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLRElwS20xdFZHOUpibU5vWEc0Z0lHaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NaWtxYlcxVWIwbHVZMmhjYmlBZ2MzWm5iR2wwWlNod1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1N3Z2QybGtkR2dnUFNCM2FXUjBhQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBLVnh1SUNCd2NtbHVkQ2h3TWlsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUZ4dUlDQmNiaUFnSXlBdExTMHRMUzBnVm1sdmJHbHVJSEJzYjNRZ2IyWWdiMjlsSUMwdExTMHRMU0JjYmlBZ2NHeHZkRjlrWmw5dmIyVWdQQzBnWkdaZmRHVnRjQ0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZjMlZzWldOMEtHbGtMQ0I0WDI5dlpTd2dlVjl2YjJVc0lIVndaRzkzYmlrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T21acGJIUmxjaWdoYVhNdWJtRW9lRjl2YjJVcExDQWhhWE11Ym1Fb2VWOXZiMlVwS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNBZ0lDQWdlRjl2YjJVZ1BTQnBabDlsYkhObEtIaGZiMjlsSUQwOUlEQXNJSEJ6WlhWa2IxOXZiMlVzSUhoZmIyOWxLU3hjYmlBZ0lDQWdJSGxmYjI5bElEMGdhV1pmWld4elpTaDVYMjl2WlNBOVBTQXdMQ0J3YzJWMVpHOWZiMjlsTENCNVgyOXZaU2tzWEc0Z0lDQWdJQ0JtWXlBZ0lDQTlJR3h2WnpJb2VWOXZiMlVnTHlCNFgyOXZaU2xjYmlBZ0lDQXBYRzRnSUZ4dUlDQndiRzkwWDJSbVgyOXZaU1IxY0dSdmQyNGdQQzBnWm1GamRHOXlLSEJzYjNSZlpHWmZiMjlsSkhWd1pHOTNiaXdnYkdWMlpXeHpJRDBnWXloY0lsVlFYQ0lzSUZ3aVRrOWNJaXdnWENKRVQxZE9YQ0lwS1Z4dUlDQmNiaUFnY0RNZ1BDMGdaMmR3Ykc5MEtIQnNiM1JmWkdaZmIyOWxMQ0JoWlhNb2VDQTlJSFZ3Wkc5M2Jpd2dlU0E5SUdaakxDQm1hV3hzSUQwZ2RYQmtiM2R1S1NrZ0sxeHVJQ0FnSUdkbGIyMWZkbWx2YkdsdUtHeHBibVYzYVdSMGFDQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lzSUdGc2NHaGhJRDBnTGpRc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnWEc0Z0lDQWdaMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0ekxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QkxDQWdZV3h3YUdFZ1BTQXdMallzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1hHNGdJQ0FnYzNSaGRGOXpkVzF0WVhKNUtGeHVJQ0FnSUNBZ1lXVnpLR2R5YjNWd0lEMGdkWEJrYjNkdUtTd2dablZ1SUQwZ2JXVmhiaXhjYmlBZ0lDQWdJR2RsYjIwZ1BTQmNJbkJ2YVc1MFhDSXNJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F3TGpVc1hHNGdJQ0FnSUNCbWFXeHNJRDBnWENKaWJHRmphMXdpTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2NHOXphWFJwYjI0Z1BTQndiM05wZEdsdmJsOWtiMlJuWlNndU15bGNiaUFnSUNBcElDdGNiaUFnSUNCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTFRNc0lETXBLU0FyWEc0Z0lDQWdjMk5oYkdWZlptbHNiRjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWh6ZEhKdmJtZGZjbVZrTENCY0ltZHlaWGt6TUZ3aUxDQnpkSEp2Ym1kZllteDFaU2twSUN0Y2JpQWdJQ0IwYUdWdFpTaGNiaUFnSUNBZ0lHRjRhWE11ZEdsMGJHVXVlQ0E5SUdWc1pXMWxiblJmWW14aGJtc29LU3hjYmlBZ0lDQWdJR0Y0YVhNdWRHbDBiR1V1ZVNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3hjYmlBZ0lDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zWEc0Z0lDQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnSUNBcExGeHVJQ0FnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc1hHNGdJQ0FnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJQ0FnSUNBZ0l5QlNiM1JoZEdVZ2VDMWhlR2x6SUd4aFltVnNjeUEwTlNCa1pXZHlaV1Z6WEc0Z0lDQWdJQ0FnSUdocWRYTjBJRDBnTVN3Z0lDQWdJQ0FnSXlCQlpHcDFjM1FnYUc5eWFYcHZiblJoYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0lDQWdJSFpxZFhOMElEMGdNU0FnSUNBZ0lDQWdJeUJCWkdwMWMzUWdkbVZ5ZEdsallXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUdGNGFYTXViR2x1WlNBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl4Y2JpQWdJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdJQ0FwTEZ4dUlDQWdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl4Y2JpQWdJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdJQ0FwTEZ4dUlDQWdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hDSjBjbUZ1YzNCaGNtVnVkRndpS1N4Y2JpQWdJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlsY2JpQWdJQ0FwSUN0c1lXSnpLSGtnUFNCY0lteHZaeklnWm1NZ2IyWWdiMkp6TDJWNGNGd2lLU0FnSzF4dUlDQWdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhiSEJvWVNBOUlERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lwSUN0Y2JpQWdJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQmpLQzB3TGpVc0lEQXVOU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYkhCb1lTQTlJREF1TlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1Z4dUlDQWdYRzRnSUZ4dUlDQjNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NUzQxS1NwdGJWUnZTVzVqYUZ4dUlDQm9aV2xuYUhRZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TlNrcWJXMVViMGx1WTJoY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpZG1sdmJHbHVYMXdpTENCdVlXMWxLVnh1SUNCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXpLVnh1SUNCa1pYWXViMlptS0NrZ0lGeHVmVnh1WEc1Y2JtTnZiVzF2Ymt4dmIzQkVhWElnUEMwZ2FHVnlaU2hjSWk0dUwyUmhkR0V2Ykc5dmNGOWhibUZzZVhOcGMxd2lLVnh1Wm1sblJHbHlJRHd0SUdobGNtVW9YQ0l1TGk5bWFXZDFjbVV2Ykc5dmNGOWhibUZzZVhOcGMxd2lLVnh1WkdseUxtTnlaV0YwWlNobWFXZEVhWElzSUhOb2IzZFhZWEp1YVc1bmN5QTlJRVpCVEZORkxDQnlaV04xY25OcGRtVWdQU0JVVWxWRktWeHVYRzVrWVhSaElEd3RJR1p5WldGa0tHaGxjbVVvWTI5dGJXOXVURzl2Y0VScGNpd2dYQ0pzYjI5d1UyTnZjbVZmWTJoeWIyMXZjMmxuYUhRdWRITjJYQ0lwS1Z4dVhHNWNibkJzYjNSZmJHOXZjRjl6WTI5eVpYTmZZVzVrWDNOaGRtVmZZbVZrY0dVb1pHRjBZU3dnYzJOdmNtVmZSRTFUVHl3Z2MyTnZjbVZmWkZSQlJ5d2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOXZaVjlFVFZOUExDQnZiMlZmWkZSQlJ5d2djSE5sZFdSdlgyOXZaU0E5SURBdU1ERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTW9YQ0pRTFZCY0lpd2dYQ0pRTFVWY0lpd2dYQ0pRTFZOY0lpd2dYQ0pRTFZoY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJa1V0UlZ3aUxDQmNJa1V0VTF3aUxDQmNJa1V0V0Z3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lVeTFUWENJc0lGd2lVeTFZWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSllMVmhjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjSW1Ob2NtOXRiM05wWjJoMFgzTmpiM0psWDJGc2JGOWtWRUZIZG5ORVRWTlBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYQ0pqYUhKdmJXOWZjMk52Y21WZllXeHNYMlJVUVVkMmMwUk5VMDljSWl3Z1ptbG5SR2x5TENCamIyMXRiMjVNYjI5d1JHbHlLVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbnBsb3RfbG9vcF9zY29yZXNfYW5kX3NhdmVfYmVkcGUgPC0gZnVuY3Rpb24oZGYsIGNvbF94LCBjb2xfeSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF94X29vZSwgY29sX3lfb29lLCBwc2V1ZG9fb29lID0gMC4wMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHRpdGxlLCBmaWdEaXIsIGxvb3BEaXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIsIGRlbnNpdHlfbiA9IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1pbiA9IC0wLjUsIHhtYXggPSAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWluID0gLTAuNSwgeW1heCA9IDEpIHtcbiAgY29sX3hfcSA8LSBlbnF1byhjb2xfeClcbiAgY29sX3lfcSA8LSBlbnF1byhjb2xfeSlcbiAgXG4gIGNvbF94X29vZV9xIDwtIGVucXVvKGNvbF94X29vZSlcbiAgY29sX3lfb29lX3EgPC0gZW5xdW8oY29sX3lfb29lKVxuICBcbiAgIyBDcmVhdGUgYSBzaW5nbGUsIHVuaWZpZWQgZGF0YWZyYW1lIGZvciBwbG90dGluZyBhbmQgc2F2aW5nIGFzIGJlZHBlXG4gIGRmX3RlbXAgPC0gZGYgJT4lXG4gICAgZHBseXI6OmZpbHRlcihBbm5vX3NpbXBsZSAlaW4lIGFubm9MaXN0KSAlPiVcbiAgICBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMiwgaWQsIHggPSAhIWNvbF94X3EsIHkgPSAhIWNvbF95X3EsXG4gICAgICAgICAgICAgICAgICB4X29vZSA9ICEhY29sX3hfb29lX3EsIHlfb29lID0gISFjb2xfeV9vb2VfcSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShkaWZmID0geS14LFxuICAgICAgICAgICAgICAgICAgZGVuc2l0eSA9IGdldF9kZW5zaXR5KHgsIHksIG4gPSBkZW5zaXR5X24pKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKHVwZG93biA9IGNhc2Vfd2hlbihcbiAgICAgIGRpZmYgPiBkaWZmQ3V0b2ZmICB+IFxcVVBcXCxcbiAgICAgIGRpZmYgPCAtZGlmZkN1dG9mZiB+IFxcRE9XTlxcLFxuICAgICAgVFJVRSAgICAgICAgICAgICAgIH4gXFxOT1xcKSlcbiAgXG4gICMgRXhwb3J0IGFzIGJlZHBlXG4gIGJlZHBlVVAgPC0gZGZfdGVtcCAlPiUgZHBseXI6OmZpbHRlcih1cGRvd24gPT0gXFxVUFxcKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIpXG4gIGZ3cml0ZShiZWRwZVVQLCBoZXJlKGxvb3BEaXIsIHBhc3RlMChuYW1lLCBcXF9kaWZmQ3V0b2ZmXFwsIGRpZmZDdXRvZmYsIFxcX1VQLmJlZHBlXFwpKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG4gIGJlZHBlTk8gPC0gZGZfdGVtcCAlPiUgZHBseXI6OmZpbHRlcih1cGRvd24gPT0gXFxOT1xcKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIpXG4gIGZ3cml0ZShiZWRwZU5PLCBoZXJlKGxvb3BEaXIsIHBhc3RlMChuYW1lLCBcXF9kaWZmQ3V0b2ZmXFwsIGRpZmZDdXRvZmYsIFxcX05PLmJlZHBlXFwpKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG4gIGJlZHBlRE9XTiA8LSBkZl90ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93biA9PSBcXERPV05cXCkgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyKVxuICBmd3JpdGUoYmVkcGVET1dOLCBoZXJlKGxvb3BEaXIsIHBhc3RlMChuYW1lLCBcXF9kaWZmQ3V0b2ZmXFwsIGRpZmZDdXRvZmYsIFxcX0RPV04uYmVkcGVcXCkpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbiAgXG4gIFxuICBwbG90X2RmIDwtIGRmX3RlbXAgJT4lXG4gICAgZHBseXI6OnNlbGVjdChpZCwgeCwgeSwgdXBkb3duLCBkZW5zaXR5KSAlPiVcbiAgICBhcnJhbmdlKGRlbnNpdHkpXG4gIFxuICBwbG90X2RmJHVwZG93biA8LSBmYWN0b3IocGxvdF9kZiR1cGRvd24sIGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbiAgXG4gICMgQ2FsY3VsYXRlIGEgZ2xvYmFsIGRlbnNpdHkgcmFuZ2UgdG8gbWFrZSBzY2FsZXMgY29tcGFyYWJsZVxuICBkZW5zaXR5X2xpbWl0cyA8LSByYW5nZShwbG90X2RmJGRlbnNpdHksIG5hLnJtID0gVFJVRSlcbiAgXG4gICMgLS0tLS0tIFNjYXR0ZXJwbG90IC0tLS0tLSBcbiAgcDEgPC0gZ2dwbG90KHBsb3RfZGYsIGFlcyh4ID0geCwgeSA9IHkpKSArXG4gICAgIyBMYXllciAxOiBQbG90IFxcTk9cXCBwb2ludHMgd2l0aCBhIGdyZXkgc2NhbGVcbiAgICBnZW9tX3BvaW50KGRhdGEgPSAuICU+JSBmaWx0ZXIodXBkb3duID09IFxcTk9cXCkgJT4lIGFycmFuZ2UoZGVuc2l0eSksXG4gICAgICAgICAgICAgICBhZXMoY29sb3IgPSBkZW5zaXR5KSwgc2l6ZSA9IDAuMSkgK1xuICAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KFxuICAgICAgbG93ID0gXFxncmV5ODVcXCwgaGlnaCA9IFxcZ3JleTMwXFwsXG4gICAgICBsaW1pdHMgPSBkZW5zaXR5X2xpbWl0cywgbmFtZSA9IFxcRGVuc2l0eSAoTk8pXFxcbiAgICApICtcbiAgICBcbiAgICAjIEludHJvZHVjZSBhIG5ldyBzY2FsZSBmb3IgdGhlIFxcVVBcXCBwb2ludHNcbiAgICBuZXdfc2NhbGVfY29sb3IoKSArXG4gICAgIyBMYXllciAyOiBQbG90IFxcVVBcXCBwb2ludHMgd2l0aCBhIHJlZCBzY2FsZVxuICAgIGdlb21fcG9pbnQoZGF0YSA9IC4gJT4lIGZpbHRlcih1cGRvd24gPT0gXFxVUFxcKSAlPiUgYXJyYW5nZShkZW5zaXR5KSxcbiAgICAgICAgICAgICAgIGFlcyhjb2xvciA9IGRlbnNpdHkpLCBzaXplID0gMC4xKSArXG4gICAgc2NhbGVfY29sb3JfZ3JhZGllbnQoXG4gICAgICBsb3cgPSB3ZWFrX3JlZCwgaGlnaCA9IHN0cm9uZ19yZWQsICMgTGlnaHQgdG8gZGFyayByZWRcbiAgICAgIGxpbWl0cyA9IGRlbnNpdHlfbGltaXRzLCBuYW1lID0gXFxEZW5zaXR5IChVUClcXFxuICAgICkgK1xuICAgIFxuICAgICMgSW50cm9kdWNlIGEgbmV3IHNjYWxlIGZvciB0aGUgXFxET1dOXFwgcG9pbnRzXG4gICAgbmV3X3NjYWxlX2NvbG9yKCkgK1xuICAgICMgTGF5ZXIgMzogUGxvdCBcXERPV05cXCBwb2ludHMgd2l0aCBhIGJsdWUgc2NhbGVcbiAgICBnZW9tX3BvaW50KGRhdGEgPSAuICU+JSBmaWx0ZXIodXBkb3duID09IFxcRE9XTlxcKSAlPiUgYXJyYW5nZShkZW5zaXR5KSxcbiAgICAgICAgICAgICAgIGFlcyhjb2xvciA9IGRlbnNpdHkpLCBzaXplID0gMC4xKSArXG4gICAgc2NhbGVfY29sb3JfZ3JhZGllbnQoXG4gICAgICBsb3cgPSB3ZWFrX2JsdWUsIGhpZ2ggPSBzdHJvbmdfYmx1ZSwgIyBMaWdodCB0byBkYXJrIGJsdWVcbiAgICAgIGxpbWl0cyA9IGRlbnNpdHlfbGltaXRzLCBuYW1lID0gXFxEZW5zaXR5IChET1dOKVxcXG4gICAgKSArXG4gICAgXG4gICAgIyBBZGQgYW5ub3RhdGlvbnMgYW5kIHRoZW1lIGVsZW1lbnRzXG4gICAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgKyBjb29yZF9maXhlZCgpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICB0aGVtZShcbiAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcLFxuICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgaGp1c3QgPSAwLjUsXG4gICAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICAgIGZhbWlseSA9IGZvbnRUeXBlXG4gICAgICApLFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgICkgK1xuICAgIGxhYnMoeCA9IHF1b19uYW1lKGNvbF94X3EpLCB5ID0gcXVvX25hbWUoY29sX3lfcSkpICtcbiAgICBnZ3RpdGxlKHRpdGxlKVxuICBcbiAgd2lkdGggPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHNjYXR0ZXJwbG90X1xcLCBuYW1lKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICAgIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodClcbiAgcHJpbnQocDEpXG4gIGRldi5vZmYoKVxuICBcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIFxuICAgICAgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0LCB1bml0cyA9IFxcaW5cXCwgcmVzID0gNjAwKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG4gIFxuICAjIC0tLS0tLSBQaWUgY2hhcnQgLS0tLS0tIFxuICBwaWVfZGYgPC0gcGxvdF9kZiAlPiVcbiAgICBkcGx5cjo6Y291bnQodXBkb3duKSAlPiVcbiAgICBtdXRhdGUoXG4gICAgICBwY3QgICA9IG4gLyBzdW0obikgKiAxMDAsXG4gICAgICBsYWJlbCA9IHBhc3RlMCh1cGRvd24sIFxcXFxuXFwsIG4sIFxcXFxuKFxcLCByb3VuZChwY3QsIDEpLCBcXCUpXFwpXG4gICAgKVxuICBcbiAgcDIgPC0gZ2dwbG90KHBpZV9kZiwgYWVzKHggPSBcXFxcLCB5ID0gbiwgZmlsbCA9IHVwZG93bikpICtcbiAgICBnZW9tX2NvbChjb2xvciA9IFxcd2hpdGVcXCkgK1xuICAgIGNvb3JkX3BvbGFyKHRoZXRhID0gXFx5XFwpICtcbiAgICBnZW9tX3RleHQoXG4gICAgICBhZXMobGFiZWwgPSBsYWJlbCksXG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSxcbiAgICAgIHNpemUgICAgID0gZm9udFNpemVNIC8gMlxuICAgICkgK1xuICAgIHRoZW1lX3ZvaWQoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcKSArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXFVQXFwgPSBzdHJvbmdfcmVkLCBcXE5PXFwgPSBub19ncmV5LCBcXERPV05cXCA9IHN0cm9uZ19ibHVlKSlcbiAgXG4gIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxwaWVjaGFydF9cXCwgbmFtZSkpXG4gIHdpZHRoIDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuICBoZWlnaHQgPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoXG4gIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodClcbiAgcHJpbnQocDIpXG4gIGRldi5vZmYoKVxuICBcbiAgXG4gICMgLS0tLS0tIFZpb2xpbiBwbG90IG9mIG9vZSAtLS0tLS0gXG4gIHBsb3RfZGZfb29lIDwtIGRmX3RlbXAgJT4lXG4gICAgZHBseXI6OnNlbGVjdChpZCwgeF9vb2UsIHlfb29lLCB1cGRvd24pICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKHhfb29lKSwgIWlzLm5hKHlfb29lKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShcbiAgICAgIHhfb29lID0gaWZfZWxzZSh4X29vZSA9PSAwLCBwc2V1ZG9fb29lLCB4X29vZSksXG4gICAgICB5X29vZSA9IGlmX2Vsc2UoeV9vb2UgPT0gMCwgcHNldWRvX29vZSwgeV9vb2UpLFxuICAgICAgZmMgICAgPSBsb2cyKHlfb29lIC8geF9vb2UpXG4gICAgKVxuICBcbiAgcGxvdF9kZl9vb2UkdXBkb3duIDwtIGZhY3RvcihwbG90X2RmX29vZSR1cGRvd24sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbiAgXG4gIHAzIDwtIGdncGxvdChwbG90X2RmX29vZSwgYWVzKHggPSB1cGRvd24sIHkgPSBmYywgZmlsbCA9IHVwZG93bikpICtcbiAgICBnZW9tX3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBhbHBoYSA9IC40LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIHRoZW1lX2NsYXNzaWMoKSArIFxuICAgIHN0YXRfc3VtbWFyeShcbiAgICAgIGFlcyhncm91cCA9IHVwZG93biksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICAgKSArXG4gICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0zLCAzKSkgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoc3Ryb25nX3JlZCwgXFxncmV5MzBcXCwgc3Ryb25nX2JsdWUpKSArXG4gICAgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICAgICksXG4gICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKSArbGFicyh5ID0gXFxsb2cyIGZjIG9mIG9icy9leHBcXCkgICtcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgICAgYWxwaGEgPSAxLFxuICAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYygtMC41LCAwLjUpLFxuICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUsXG4gICAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXClcbiAgIFxuICBcbiAgd2lkdGggPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHZpb2xpbl9cXCwgbmFtZSlcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwMylcbiAgZGV2Lm9mZigpICBcbn1cblxuXG5jb21tb25Mb29wRGlyIDwtIGhlcmUoXFwuLi9kYXRhL2xvb3BfYW5hbHlzaXNcXClcbmZpZ0RpciA8LSBoZXJlKFxcLi4vZmlndXJlL2xvb3BfYW5hbHlzaXNcXClcbmRpci5jcmVhdGUoZmlnRGlyLCBzaG93V2FybmluZ3MgPSBGQUxTRSwgcmVjdXJzaXZlID0gVFJVRSlcblxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsIFxcbG9vcFNjb3JlX2Nocm9tb3NpZ2h0LnRzdlxcKSlcblxuXG5wbG90X2xvb3Bfc2NvcmVzX2FuZF9zYXZlX2JlZHBlKGRhdGEsIHNjb3JlX0RNU08sIHNjb3JlX2RUQUcsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvb2VfRE1TTywgb29lX2RUQUcsIHBzZXVkb19vb2UgPSAwLjAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9zY29yZV9hbGxfZFRBR3ZzRE1TT1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX3Njb3JlX2FsbF9kVEFHdnNETVNPXFwsIGZpZ0RpciwgY29tbW9uTG9vcERpcilcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
plot_loop_scores_and_save_bedpe <- function(df, col_x, col_y, 
                                            col_x_ooe, col_y_ooe, pseudo_ooe = 0.01,
                                            annoList,
                                            name, title, figDir, loopDir,
                                            diffCutoff = 0.2, density_n = 200,
                                            xmin = -0.5, xmax = 1,
                                            ymin = -0.5, ymax = 1) {
  col_x_q <- enquo(col_x)
  col_y_q <- enquo(col_y)
  
  col_x_ooe_q <- enquo(col_x_ooe)
  col_y_ooe_q <- enquo(col_y_ooe)
  
  # Create a single, unified dataframe for plotting and saving as bedpe
  df_temp <- df %>%
    dplyr::filter(Anno_simple %in% annoList) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, x = !!col_x_q, y = !!col_y_q,
                  x_ooe = !!col_x_ooe_q, y_ooe = !!col_y_ooe_q) %>%
    dplyr::mutate(diff = y-x,
                  density = get_density(x, y, n = density_n)) %>%
    dplyr::mutate(updown = case_when(
      diff > diffCutoff  ~ \UP\,
      diff < -diffCutoff ~ \DOWN\,
      TRUE               ~ \NO\))
  
  # Export as bedpe
  bedpeUP <- df_temp %>% dplyr::filter(updown == \UP\) %>% dplyr::select(chrom1, start1, end1, chrom2, start2, end2)
  fwrite(bedpeUP, here(loopDir, paste0(name, \_diffCutoff\, diffCutoff, \_UP.bedpe\)), sep = \\t\, col.names = FALSE)
  bedpeNO <- df_temp %>% dplyr::filter(updown == \NO\) %>% dplyr::select(chrom1, start1, end1, chrom2, start2, end2)
  fwrite(bedpeNO, here(loopDir, paste0(name, \_diffCutoff\, diffCutoff, \_NO.bedpe\)), sep = \\t\, col.names = FALSE)
  bedpeDOWN <- df_temp %>% dplyr::filter(updown == \DOWN\) %>% dplyr::select(chrom1, start1, end1, chrom2, start2, end2)
  fwrite(bedpeDOWN, here(loopDir, paste0(name, \_diffCutoff\, diffCutoff, \_DOWN.bedpe\)), sep = \\t\, col.names = FALSE)
  
  
  plot_df <- df_temp %>%
    dplyr::select(id, x, y, updown, density) %>%
    arrange(density)
  
  plot_df$updown <- factor(plot_df$updown, c(\UP\, \NO\, \DOWN\))
  
  # Calculate a global density range to make scales comparable
  density_limits <- range(plot_df$density, na.rm = TRUE)
  
  # ------ Scatterplot ------ 
  p1 <- ggplot(plot_df, aes(x = x, y = y)) +
    # Layer 1: Plot \NO\ points with a grey scale
    geom_point(data = . %>% filter(updown == \NO\) %>% arrange(density),
               aes(color = density), size = 0.1) +
    scale_color_gradient(
      low = \grey85\, high = \grey30\,
      limits = density_limits, name = \Density (NO)\
    ) +
    
    # Introduce a new scale for the \UP\ points
    new_scale_color() +
    # Layer 2: Plot \UP\ points with a red scale
    geom_point(data = . %>% filter(updown == \UP\) %>% arrange(density),
               aes(color = density), size = 0.1) +
    scale_color_gradient(
      low = weak_red, high = strong_red, # Light to dark red
      limits = density_limits, name = \Density (UP)\
    ) +
    
    # Introduce a new scale for the \DOWN\ points
    new_scale_color() +
    # Layer 3: Plot \DOWN\ points with a blue scale
    geom_point(data = . %>% filter(updown == \DOWN\) %>% arrange(density),
               aes(color = density), size = 0.1) +
    scale_color_gradient(
      low = weak_blue, high = strong_blue, # Light to dark blue
      limits = density_limits, name = \Density (DOWN)\
    ) +
    
    # Add annotations and theme elements
    xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    theme_classic() +
    theme(
      legend.position = \none\,
      plot.title = element_text(
        hjust = 0.5,
        size = fontSizeS,
        family = fontType
      ),
      axis.title = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.line = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
    ) +
    labs(x = quo_name(col_x_q), y = quo_name(col_y_q)) +
    ggtitle(title)
  
  width <- panelSize(1.5)*mmToInch
  height <- panelSize(1.5)*mmToInch  
  
  fileName <- paste0(\scatterplot_\, name)
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = width, height = height)
  print(p1)
  dev.off()
  
  png(here(figDir, paste0(fileName, \.png\)), 
      width = width, height = height, units = \in\, res = 600)
  print(p1)
  dev.off()
  
  # ------ Pie chart ------ 
  pie_df <- plot_df %>%
    dplyr::count(updown) %>%
    mutate(
      pct   = n / sum(n) * 100,
      label = paste0(updown, \\n\, n, \\n(\, round(pct, 1), \%)\)
    )
  
  p2 <- ggplot(pie_df, aes(x = \\, y = n, fill = updown)) +
    geom_col(color = \white\) +
    coord_polar(theta = \y\) +
    geom_text(
      aes(label = label),
      position = position_stack(vjust = 0.5),
      size     = fontSizeM / 2
    ) +
    theme_void() + theme(legend.position = \none\) +
    scale_fill_manual(values = c(\UP\ = strong_red, \NO\ = no_grey, \DOWN\ = strong_blue))
  
  fileName <- here(figDir, paste0(\piechart_\, name))
  width <- panelSize(2)*mmToInch
  height <- panelSize(2)*mmToInch
  svglite(paste0(fileName, \.svg\), width = width, height = height)
  print(p2)
  dev.off()
  
  
  # ------ Violin plot of ooe ------ 
  plot_df_ooe <- df_temp %>%
    dplyr::select(id, x_ooe, y_ooe, updown) %>%
    dplyr::filter(!is.na(x_ooe), !is.na(y_ooe)) %>%
    dplyr::mutate(
      x_ooe = if_else(x_ooe == 0, pseudo_ooe, x_ooe),
      y_ooe = if_else(y_ooe == 0, pseudo_ooe, y_ooe),
      fc    = log2(y_ooe / x_ooe)
    )
  
  plot_df_ooe$updown <- factor(plot_df_ooe$updown, levels = c(\UP\, \NO\, \DOWN\))
  
  p3 <- ggplot(plot_df_ooe, aes(x = updown, y = fc, fill = updown)) +
    geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, show.legend = FALSE) + 
    geom_boxplot(width = 0.3, color = \black\,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\,
                 outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
    theme_classic() + 
    stat_summary(
      aes(group = updown), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) +
    coord_cartesian(ylim = c(-3, 3)) +
    scale_fill_manual(values = c(strong_red, \grey30\, strong_blue)) +
    theme(
      axis.title.x = element_blank(),
      axis.title.y = element_text(
        size = fontSizeM,
        family = fontType,
        color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.text.x = element_text(
        size = fontSizeM,
        angle = 45,      # Rotate x-axis labels 45 degrees
        hjust = 1,       # Adjust horizontal justification
        vjust = 1        # Adjust vertical justification
      ),
      axis.line = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
      legend.text = element_text(family = fontType, size = fontSizeS),
      legend.title = element_text(family = fontType, size = fontSizeS)
    ) +labs(y = \log2 fc of obs/exp\)  +
    geom_hline(yintercept = 0,
               alpha = 1,
               color = \black\,
               size = lineThick*mmToLineUnit,
               lineend = \square\) +
    geom_hline(yintercept = c(-0.5, 0.5),
               alpha = 0.5,
               color = \black\,
               size = lineThick*mmToLineUnit,
               lineend = \square\, linetype = \dashed\)
   
  
  width <- panelSize(1.5)*mmToInch
  height <- panelSize(1.5)*mmToInch
  fileName <- paste0(\violin_\, name)
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p3)
  dev.off()  
}


commonLoopDir <- here(\../data/loop_analysis\)
figDir <- here(\../figure/loop_analysis\)
dir.create(figDir, showWarnings = FALSE, recursive = TRUE)

data <- fread(here(commonLoopDir, \loopScore_chromosight.tsv\))


plot_loop_scores_and_save_bedpe(data, score_DMSO, score_dTAG, 
                                ooe_DMSO, ooe_dTAG, pseudo_ooe = 0.01,
                                c(\P-P\, \P-E\, \P-S\, \P-X\,
                                  \E-E\, \E-S\, \E-X\,
                                  \S-S\, \S-X\,
                                  \X-X\),
                                name = \chromosight_score_all_dTAGvsDMSO\,
                                title = \chromo_score_all_dTAGvsDMSO\, figDir, commonLoopDir)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNHeHZkRjlzYjI5d1gzTmpiM0psYzE5aGJtUmZjMkYyWlY5aVpXUndaU0E4TFNCbWRXNWpkR2x2Ymloa1ppd2dZMjlzWDNnc0lHTnZiRjk1TENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNYM2hmYjI5bExDQmpiMnhmZVY5dmIyVXNJSEJ6WlhWa2IxOXZiMlVnUFNBd0xqQXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTd2dkR2wwYkdVc0lHWnBaMFJwY2l3Z2JHOXZjRVJwY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHbG1aa04xZEc5bVppQTlJREF1TWl3Z1pHVnVjMmwwZVY5dUlEMGdNakF3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCNGJXbHVJRDBnTFRBdU5Td2dlRzFoZUNBOUlERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSGx0YVc0Z1BTQXRNQzQxTENCNWJXRjRJRDBnTVNrZ2UxeHVJQ0JqYjJ4ZmVGOXhJRHd0SUdWdWNYVnZLR052YkY5NEtWeHVJQ0JqYjJ4ZmVWOXhJRHd0SUdWdWNYVnZLR052YkY5NUtWeHVJQ0JjYmlBZ1kyOXNYM2hmYjI5bFgzRWdQQzBnWlc1eGRXOG9ZMjlzWDNoZmIyOWxLVnh1SUNCamIyeGZlVjl2YjJWZmNTQThMU0JsYm5GMWJ5aGpiMnhmZVY5dmIyVXBYRzRnSUZ4dUlDQWpJRU55WldGMFpTQmhJSE5wYm1kc1pTd2dkVzVwWm1sbFpDQmtZWFJoWm5KaGJXVWdabTl5SUhCc2IzUjBhVzVuSUdGdVpDQnpZWFpwYm1jZ1lYTWdZbVZrY0dWY2JpQWdaR1pmZEdWdGNDQThMU0JrWmlBbFBpVmNiaUFnSUNCa2NHeDVjam82Wm1sc2RHVnlLRUZ1Ym05ZmMybHRjR3hsSUNWcGJpVWdZVzV1YjB4cGMzUXBJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHpaV3hsWTNRb1kyaHliMjB4TENCemRHRnlkREVzSUdWdVpERXNJR05vY205dE1pd2djM1JoY25ReUxDQmxibVF5TENCcFpDd2dlQ0E5SUNFaFkyOXNYM2hmY1N3Z2VTQTlJQ0VoWTI5c1gzbGZjU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhoZmIyOWxJRDBnSVNGamIyeGZlRjl2YjJWZmNTd2dlVjl2YjJVZ1BTQWhJV052YkY5NVgyOXZaVjl4S1NBbFBpVmNiaUFnSUNCa2NHeDVjam82YlhWMFlYUmxLR1JwWm1ZZ1BTQjVMWGdzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1pXNXphWFI1SUQwZ1oyVjBYMlJsYm5OcGRIa29lQ3dnZVN3Z2JpQTlJR1JsYm5OcGRIbGZiaWtwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB0ZFhSaGRHVW9kWEJrYjNkdUlEMGdZMkZ6WlY5M2FHVnVLRnh1SUNBZ0lDQWdaR2xtWmlBK0lHUnBabVpEZFhSdlptWWdJSDRnWEZ4VlVGeGNMRnh1SUNBZ0lDQWdaR2xtWmlBOElDMWthV1ptUTNWMGIyWm1JSDRnWEZ4RVQxZE9YRndzWEc0Z0lDQWdJQ0JVVWxWRklDQWdJQ0FnSUNBZ0lDQWdJQ0FnZmlCY1hFNVBYRndwS1Z4dUlDQmNiaUFnSXlCRmVIQnZjblFnWVhNZ1ltVmtjR1ZjYmlBZ1ltVmtjR1ZWVUNBOExTQmtabDkwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIVndaRzkzYmlBOVBTQmNYRlZRWEZ3cElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHTm9jbTl0TVN3Z2MzUmhjblF4TENCbGJtUXhMQ0JqYUhKdmJUSXNJSE4wWVhKME1pd2daVzVrTWlsY2JpQWdabmR5YVhSbEtHSmxaSEJsVlZBc0lHaGxjbVVvYkc5dmNFUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNYMlJwWm1aRGRYUnZabVpjWEN3Z1pHbG1aa04xZEc5bVppd2dYRnhmVlZBdVltVmtjR1ZjWENrcExDQnpaWEFnUFNCY1hGeGNkRnhjTENCamIyd3VibUZ0WlhNZ1BTQkdRVXhUUlNsY2JpQWdZbVZrY0dWT1R5QThMU0JrWmw5MFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSFZ3Wkc5M2JpQTlQU0JjWEU1UFhGd3BJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR05vY205dE1Td2djM1JoY25ReExDQmxibVF4TENCamFISnZiVElzSUhOMFlYSjBNaXdnWlc1a01pbGNiaUFnWm5keWFYUmxLR0psWkhCbFRrOHNJR2hsY21Vb2JHOXZjRVJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDJScFptWkRkWFJ2Wm1aY1hDd2daR2xtWmtOMWRHOW1aaXdnWEZ4ZlRrOHVZbVZrY0dWY1hDa3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0xDQmpiMnd1Ym1GdFpYTWdQU0JHUVV4VFJTbGNiaUFnWW1Wa2NHVkVUMWRPSUR3dElHUm1YM1JsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2RYQmtiM2R1SUQwOUlGeGNSRTlYVGx4Y0tTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGphSEp2YlRFc0lITjBZWEowTVN3Z1pXNWtNU3dnWTJoeWIyMHlMQ0J6ZEdGeWRESXNJR1Z1WkRJcFhHNGdJR1ozY21sMFpTaGlaV1J3WlVSUFYwNHNJR2hsY21Vb2JHOXZjRVJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDJScFptWkRkWFJ2Wm1aY1hDd2daR2xtWmtOMWRHOW1aaXdnWEZ4ZlJFOVhUaTVpWldSd1pWeGNLU2tzSUhObGNDQTlJRnhjWEZ4MFhGd3NJR052YkM1dVlXMWxjeUE5SUVaQlRGTkZLVnh1SUNCY2JpQWdYRzRnSUhCc2IzUmZaR1lnUEMwZ1pHWmZkR1Z0Y0NBbFBpVmNiaUFnSUNCa2NHeDVjam82YzJWc1pXTjBLR2xrTENCNExDQjVMQ0IxY0dSdmQyNHNJR1JsYm5OcGRIa3BJQ1UrSlZ4dUlDQWdJR0Z5Y21GdVoyVW9aR1Z1YzJsMGVTbGNiaUFnWEc0Z0lIQnNiM1JmWkdZa2RYQmtiM2R1SUR3dElHWmhZM1J2Y2lod2JHOTBYMlJtSkhWd1pHOTNiaXdnWXloY1hGVlFYRndzSUZ4Y1RrOWNYQ3dnWEZ4RVQxZE9YRndwS1Z4dUlDQmNiaUFnSXlCRFlXeGpkV3hoZEdVZ1lTQm5iRzlpWVd3Z1pHVnVjMmwwZVNCeVlXNW5aU0IwYnlCdFlXdGxJSE5qWVd4bGN5QmpiMjF3WVhKaFlteGxYRzRnSUdSbGJuTnBkSGxmYkdsdGFYUnpJRHd0SUhKaGJtZGxLSEJzYjNSZlpHWWtaR1Z1YzJsMGVTd2dibUV1Y20wZ1BTQlVVbFZGS1Z4dUlDQmNiaUFnSXlBdExTMHRMUzBnVTJOaGRIUmxjbkJzYjNRZ0xTMHRMUzB0SUZ4dUlDQndNU0E4TFNCblozQnNiM1FvY0d4dmRGOWtaaXdnWVdWektIZ2dQU0I0TENCNUlEMGdlU2twSUN0Y2JpQWdJQ0FqSUV4aGVXVnlJREU2SUZCc2IzUWdYRnhPVDF4Y0lIQnZhVzUwY3lCM2FYUm9JR0VnWjNKbGVTQnpZMkZzWlZ4dUlDQWdJR2RsYjIxZmNHOXBiblFvWkdGMFlTQTlJQzRnSlQ0bElHWnBiSFJsY2loMWNHUnZkMjRnUFQwZ1hGeE9UMXhjS1NBbFBpVWdZWEp5WVc1blpTaGtaVzV6YVhSNUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lHRmxjeWhqYjJ4dmNpQTlJR1JsYm5OcGRIa3BMQ0J6YVhwbElEMGdNQzR4S1NBclhHNGdJQ0FnYzJOaGJHVmZZMjlzYjNKZlozSmhaR2xsYm5Rb1hHNGdJQ0FnSUNCc2IzY2dQU0JjWEdkeVpYazROVnhjTENCb2FXZG9JRDBnWEZ4bmNtVjVNekJjWEN4Y2JpQWdJQ0FnSUd4cGJXbDBjeUE5SUdSbGJuTnBkSGxmYkdsdGFYUnpMQ0J1WVcxbElEMGdYRnhFWlc1emFYUjVJQ2hPVHlsY1hGeHVJQ0FnSUNrZ0sxeHVJQ0FnSUZ4dUlDQWdJQ01nU1c1MGNtOWtkV05sSUdFZ2JtVjNJSE5qWVd4bElHWnZjaUIwYUdVZ1hGeFZVRnhjSUhCdmFXNTBjMXh1SUNBZ0lHNWxkMTl6WTJGc1pWOWpiMnh2Y2lncElDdGNiaUFnSUNBaklFeGhlV1Z5SURJNklGQnNiM1FnWEZ4VlVGeGNJSEJ2YVc1MGN5QjNhWFJvSUdFZ2NtVmtJSE5qWVd4bFhHNGdJQ0FnWjJWdmJWOXdiMmx1ZENoa1lYUmhJRDBnTGlBbFBpVWdabWxzZEdWeUtIVndaRzkzYmlBOVBTQmNYRlZRWEZ3cElDVStKU0JoY25KaGJtZGxLR1JsYm5OcGRIa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZV1Z6S0dOdmJHOXlJRDBnWkdWdWMybDBlU2tzSUhOcGVtVWdQU0F3TGpFcElDdGNiaUFnSUNCelkyRnNaVjlqYjJ4dmNsOW5jbUZrYVdWdWRDaGNiaUFnSUNBZ0lHeHZkeUE5SUhkbFlXdGZjbVZrTENCb2FXZG9JRDBnYzNSeWIyNW5YM0psWkN3Z0l5Qk1hV2RvZENCMGJ5QmtZWEpySUhKbFpGeHVJQ0FnSUNBZ2JHbHRhWFJ6SUQwZ1pHVnVjMmwwZVY5c2FXMXBkSE1zSUc1aGJXVWdQU0JjWEVSbGJuTnBkSGtnS0ZWUUtWeGNYRzRnSUNBZ0tTQXJYRzRnSUNBZ1hHNGdJQ0FnSXlCSmJuUnliMlIxWTJVZ1lTQnVaWGNnYzJOaGJHVWdabTl5SUhSb1pTQmNYRVJQVjA1Y1hDQndiMmx1ZEhOY2JpQWdJQ0J1WlhkZmMyTmhiR1ZmWTI5c2IzSW9LU0FyWEc0Z0lDQWdJeUJNWVhsbGNpQXpPaUJRYkc5MElGeGNSRTlYVGx4Y0lIQnZhVzUwY3lCM2FYUm9JR0VnWW14MVpTQnpZMkZzWlZ4dUlDQWdJR2RsYjIxZmNHOXBiblFvWkdGMFlTQTlJQzRnSlQ0bElHWnBiSFJsY2loMWNHUnZkMjRnUFQwZ1hGeEVUMWRPWEZ3cElDVStKU0JoY25KaGJtZGxLR1JsYm5OcGRIa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZV1Z6S0dOdmJHOXlJRDBnWkdWdWMybDBlU2tzSUhOcGVtVWdQU0F3TGpFcElDdGNiaUFnSUNCelkyRnNaVjlqYjJ4dmNsOW5jbUZrYVdWdWRDaGNiaUFnSUNBZ0lHeHZkeUE5SUhkbFlXdGZZbXgxWlN3Z2FHbG5hQ0E5SUhOMGNtOXVaMTlpYkhWbExDQWpJRXhwWjJoMElIUnZJR1JoY21zZ1lteDFaVnh1SUNBZ0lDQWdiR2x0YVhSeklEMGdaR1Z1YzJsMGVWOXNhVzFwZEhNc0lHNWhiV1VnUFNCY1hFUmxibk5wZEhrZ0tFUlBWMDRwWEZ4Y2JpQWdJQ0FwSUN0Y2JpQWdJQ0JjYmlBZ0lDQWpJRUZrWkNCaGJtNXZkR0YwYVc5dWN5QmhibVFnZEdobGJXVWdaV3hsYldWdWRITmNiaUFnSUNCNGJHbHRLQzB3TGpVc0lERXBJQ3NnZVd4cGJTZ3RNQzQxTENBeEtTQXJJR052YjNKa1gyWnBlR1ZrS0NrZ0sxeHVJQ0FnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTUN3Z1kyOXNJRDBnWEZ4bmNtVjVOVEJjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjS1NBclhHNGdJQ0FnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0F0WkdsbVprTjFkRzltWml3Z1kyOXNJRDBnWEZ4bmNtVjVYRndzSUd4cGJtVjBlWEJsSUQwZ1hGeGtiM1IwWldSY1hDeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ2tnSzF4dUlDQWdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYRnhuY21WNVhGd3NJR3hwYm1WMGVYQmxJRDBnWEZ4a2IzUjBaV1JjWEN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hDa2dLMXh1SUNBZ0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRnhjWjNKbGVWeGNMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjS1NBclhHNGdJQ0FnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdNQ3dnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hGeG5jbVY1WEZ3c1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3BJQ3RjYmlBZ0lDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJQ0FnSUhSb1pXMWxLRnh1SUNBZ0lDQWdiR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdYRnh1YjI1bFhGd3NYRzRnSUNBZ0lDQndiRzkwTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ0lDQm9hblZ6ZENBOUlEQXVOU3hjYmlBZ0lDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1ZjYmlBZ0lDQWdJQ2tzWEc0Z0lDQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMRnh1SUNBZ0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGeGNkSEpoYm5Od1lYSmxiblJjWENrc1hHNGdJQ0FnS1NBclhHNGdJQ0FnYkdGaWN5aDRJRDBnY1hWdlgyNWhiV1VvWTI5c1gzaGZjU2tzSUhrZ1BTQnhkVzlmYm1GdFpTaGpiMnhmZVY5eEtTa2dLMXh1SUNBZ0lHZG5kR2wwYkdVb2RHbDBiR1VwWEc0Z0lGeHVJQ0IzYVdSMGFDQThMU0J3WVc1bGJGTnBlbVVvTVM0MUtTcHRiVlJ2U1c1amFGeHVJQ0JvWldsbmFIUWdQQzBnY0dGdVpXeFRhWHBsS0RFdU5Ta3FiVzFVYjBsdVkyZ2dJRnh1SUNCY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjYzJOaGRIUmxjbkJzYjNSZlhGd3NJRzVoYldVcFhHNGdJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdkMmxrZEdnZ1BTQjNhV1IwYUN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwS1Z4dUlDQndjbWx1ZENod01TbGNiaUFnWkdWMkxtOW1aaWdwWEc0Z0lGeHVJQ0J3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnWEc0Z0lDQWdJQ0IzYVdSMGFDQTlJSGRwWkhSb0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIVnVhWFJ6SUQwZ1hGeHBibHhjTENCeVpYTWdQU0EyTURBcFhHNGdJSEJ5YVc1MEtIQXhLVnh1SUNCa1pYWXViMlptS0NsY2JpQWdYRzRnSUNNZ0xTMHRMUzB0SUZCcFpTQmphR0Z5ZENBdExTMHRMUzBnWEc0Z0lIQnBaVjlrWmlBOExTQndiRzkwWDJSbUlDVStKVnh1SUNBZ0lHUndiSGx5T2pwamIzVnVkQ2gxY0dSdmQyNHBJQ1UrSlZ4dUlDQWdJRzExZEdGMFpTaGNiaUFnSUNBZ0lIQmpkQ0FnSUQwZ2JpQXZJSE4xYlNodUtTQXFJREV3TUN4Y2JpQWdJQ0FnSUd4aFltVnNJRDBnY0dGemRHVXdLSFZ3Wkc5M2Jpd2dYRnhjWEc1Y1hDd2diaXdnWEZ4Y1hHNG9YRndzSUhKdmRXNWtLSEJqZEN3Z01Ta3NJRnhjSlNsY1hDbGNiaUFnSUNBcFhHNGdJRnh1SUNCd01pQThMU0JuWjNCc2IzUW9jR2xsWDJSbUxDQmhaWE1vZUNBOUlGeGNYRndzSUhrZ1BTQnVMQ0JtYVd4c0lEMGdkWEJrYjNkdUtTa2dLMXh1SUNBZ0lHZGxiMjFmWTI5c0tHTnZiRzl5SUQwZ1hGeDNhR2wwWlZ4Y0tTQXJYRzRnSUNBZ1kyOXZjbVJmY0c5c1lYSW9kR2hsZEdFZ1BTQmNYSGxjWENrZ0sxeHVJQ0FnSUdkbGIyMWZkR1Y0ZENoY2JpQWdJQ0FnSUdGbGN5aHNZV0psYkNBOUlHeGhZbVZzS1N4Y2JpQWdJQ0FnSUhCdmMybDBhVzl1SUQwZ2NHOXphWFJwYjI1ZmMzUmhZMnNvZG1wMWMzUWdQU0F3TGpVcExGeHVJQ0FnSUNBZ2MybDZaU0FnSUNBZ1BTQm1iMjUwVTJsNlpVMGdMeUF5WEc0Z0lDQWdLU0FyWEc0Z0lDQWdkR2hsYldWZmRtOXBaQ2dwSUNzZ2RHaGxiV1VvYkdWblpXNWtMbkJ2YzJsMGFXOXVJRDBnWEZ4dWIyNWxYRndwSUN0Y2JpQWdJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y1ZWQmNYQ0E5SUhOMGNtOXVaMTl5WldRc0lGeGNUazljWENBOUlHNXZYMmR5Wlhrc0lGeGNSRTlYVGx4Y0lEMGdjM1J5YjI1blgySnNkV1VwS1Z4dUlDQmNiaUFnWm1sc1pVNWhiV1VnUEMwZ2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaGNYSEJwWldOb1lYSjBYMXhjTENCdVlXMWxLU2xjYmlBZ2QybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtESXBLbTF0Vkc5SmJtTm9YRzRnSUdobGFXZG9kQ0E4TFNCd1lXNWxiRk5wZW1Vb01pa3FiVzFVYjBsdVkyaGNiaUFnYzNabmJHbDBaU2h3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU3dnZDJsa2RHZ2dQU0IzYVdSMGFDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMEtWeHVJQ0J3Y21sdWRDaHdNaWxjYmlBZ1pHVjJMbTltWmlncFhHNGdJRnh1SUNCY2JpQWdJeUF0TFMwdExTMGdWbWx2YkdsdUlIQnNiM1FnYjJZZ2IyOWxJQzB0TFMwdExTQmNiaUFnY0d4dmRGOWtabDl2YjJVZ1BDMGdaR1pmZEdWdGNDQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNmMyVnNaV04wS0dsa0xDQjRYMjl2WlN3Z2VWOXZiMlVzSUhWd1pHOTNiaWtnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbVpwYkhSbGNpZ2hhWE11Ym1Fb2VGOXZiMlVwTENBaGFYTXVibUVvZVY5dmIyVXBLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0FnSUNBZ2VGOXZiMlVnUFNCcFpsOWxiSE5sS0hoZmIyOWxJRDA5SURBc0lIQnpaWFZrYjE5dmIyVXNJSGhmYjI5bEtTeGNiaUFnSUNBZ0lIbGZiMjlsSUQwZ2FXWmZaV3h6WlNoNVgyOXZaU0E5UFNBd0xDQndjMlYxWkc5ZmIyOWxMQ0I1WDI5dlpTa3NYRzRnSUNBZ0lDQm1ZeUFnSUNBOUlHeHZaeklvZVY5dmIyVWdMeUI0WDI5dlpTbGNiaUFnSUNBcFhHNGdJRnh1SUNCd2JHOTBYMlJtWDI5dlpTUjFjR1J2ZDI0Z1BDMGdabUZqZEc5eUtIQnNiM1JmWkdaZmIyOWxKSFZ3Wkc5M2Jpd2diR1YyWld4eklEMGdZeWhjWEZWUVhGd3NJRnhjVGs5Y1hDd2dYRnhFVDFkT1hGd3BLVnh1SUNCY2JpQWdjRE1nUEMwZ1oyZHdiRzkwS0hCc2IzUmZaR1pmYjI5bExDQmhaWE1vZUNBOUlIVndaRzkzYml3Z2VTQTlJR1pqTENCbWFXeHNJRDBnZFhCa2IzZHVLU2tnSzF4dUlDQWdJR2RsYjIxZmRtbHZiR2x1S0d4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3NJR0ZzY0doaElEMGdMalFzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUNBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR6TENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCTENBZ1lXeHdhR0VnUFNBd0xqWXNJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ1hHNGdJQ0FnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWEc0Z0lDQWdjM1JoZEY5emRXMXRZWEo1S0Z4dUlDQWdJQ0FnWVdWektHZHliM1Z3SUQwZ2RYQmtiM2R1S1N3Z1puVnVJRDBnYldWaGJpeGNiaUFnSUNBZ0lHZGxiMjBnUFNCY1hIQnZhVzUwWEZ3c0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXdMalVzWEc0Z0lDQWdJQ0JtYVd4c0lEMGdYRnhpYkdGamExeGNMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnY0c5emFYUnBiMjRnUFNCd2IzTnBkR2x2Ymw5a2IyUm5aU2d1TXlsY2JpQWdJQ0FwSUN0Y2JpQWdJQ0JqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9MVE1zSURNcEtTQXJYRzRnSUNBZ2MyTmhiR1ZmWm1sc2JGOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aHpkSEp2Ym1kZmNtVmtMQ0JjWEdkeVpYa3pNRnhjTENCemRISnZibWRmWW14MVpTa3BJQ3RjYmlBZ0lDQjBhR1Z0WlNoY2JpQWdJQ0FnSUdGNGFYTXVkR2wwYkdVdWVDQTlJR1ZzWlcxbGJuUmZZbXhoYm1zb0tTeGNiaUFnSUNBZ0lHRjRhWE11ZEdsMGJHVXVlU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTeGNiaUFnSUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQWdJQ2tzWEc0Z0lDQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNYRzRnSUNBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdJQ0FwTEZ4dUlDQWdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVTBzWEc0Z0lDQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lDQWdJQ0FnSXlCU2IzUmhkR1VnZUMxaGVHbHpJR3hoWW1Wc2N5QTBOU0JrWldkeVpXVnpYRzRnSUNBZ0lDQWdJR2hxZFhOMElEMGdNU3dnSUNBZ0lDQWdJeUJCWkdwMWMzUWdhRzl5YVhwdmJuUmhiQ0JxZFhOMGFXWnBZMkYwYVc5dVhHNGdJQ0FnSUNBZ0lIWnFkWE4wSUQwZ01TQWdJQ0FnSUNBZ0l5QkJaR3AxYzNRZ2RtVnlkR2xqWVd3Z2FuVnpkR2xtYVdOaGRHbHZibHh1SUNBZ0lDQWdLU3hjYmlBZ0lDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3hjYmlBZ0lDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0lDQXBMRnh1SUNBZ0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3hjYmlBZ0lDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0lDQXBMRnh1SUNBZ0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWEZ4MGNtRnVjM0JoY21WdWRGeGNLU3hjYmlBZ0lDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWxjYmlBZ0lDQXBJQ3RzWVdKektIa2dQU0JjWEd4dlp6SWdabU1nYjJZZ2IySnpMMlY0Y0Z4Y0tTQWdLMXh1SUNBZ0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaGJIQm9ZU0E5SURFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3BJQ3RjYmlBZ0lDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNCaktDMHdMalVzSURBdU5Ta3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhiSEJvWVNBOUlEQXVOU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLVnh1SUNBZ1hHNGdJRnh1SUNCM2FXUjBhQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNDFLU3B0YlZSdlNXNWphRnh1SUNCb1pXbG5hSFFnUEMwZ2NHRnVaV3hUYVhwbEtERXVOU2txYlcxVWIwbHVZMmhjYmlBZ1ptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNkbWx2YkdsdVgxeGNMQ0J1WVcxbEtWeHVJQ0J6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBektWeHVJQ0JrWlhZdWIyWm1LQ2tnSUZ4dWZWeHVYRzVjYm1OdmJXMXZia3h2YjNCRWFYSWdQQzBnYUdWeVpTaGNYQzR1TDJSaGRHRXZiRzl2Y0Y5aGJtRnNlWE5wYzF4Y0tWeHVabWxuUkdseUlEd3RJR2hsY21Vb1hGd3VMaTltYVdkMWNtVXZiRzl2Y0Y5aGJtRnNlWE5wYzF4Y0tWeHVaR2x5TG1OeVpXRjBaU2htYVdkRWFYSXNJSE5vYjNkWFlYSnVhVzVuY3lBOUlFWkJURk5GTENCeVpXTjFjbk5wZG1VZ1BTQlVVbFZGS1Z4dVhHNWtZWFJoSUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl0Ylc5dVRHOXZjRVJwY2l3Z1hGeHNiMjl3VTJOdmNtVmZZMmh5YjIxdmMybG5hSFF1ZEhOMlhGd3BLVnh1WEc1Y2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhOZllXNWtYM05oZG1WZlltVmtjR1VvWkdGMFlTd2djMk52Y21WZlJFMVRUeXdnYzJOdmNtVmZaRlJCUnl3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5dlpWOUVUVk5QTENCdmIyVmZaRlJCUnl3Z2NITmxkV1J2WDI5dlpTQTlJREF1TURFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdNb1hGeFFMVkJjWEN3Z1hGeFFMVVZjWEN3Z1hGeFFMVk5jWEN3Z1hGeFFMVmhjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hFVXRSVnhjTENCY1hFVXRVMXhjTENCY1hFVXRXRnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y1V5MVRYRndzSUZ4Y1V5MVlYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4WUxWaGNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVZ1BTQmNYR05vY205dGIzTnBaMmgwWDNOamIzSmxYMkZzYkY5a1ZFRkhkbk5FVFZOUFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBkR3hsSUQwZ1hGeGphSEp2Ylc5ZmMyTnZjbVZmWVd4c1gyUlVRVWQyYzBSTlUwOWNYQ3dnWm1sblJHbHlMQ0JqYjIxdGIyNU1iMjl3UkdseUtWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG5wbG90X2xvb3Bfc2NvcmVzX2FuZF9zYXZlX2JlZHBlIDwtIGZ1bmN0aW9uKGRmLCBjb2xfeCwgY29sX3ksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfeF9vb2UsIGNvbF95X29vZSwgcHNldWRvX29vZSA9IDAuMDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0aXRsZSwgZmlnRGlyLCBsb29wRGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLCBkZW5zaXR5X24gPSAyMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtaW4gPSAtMC41LCB4bWF4ID0gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1pbiA9IC0wLjUsIHltYXggPSAxKSB7XG4gIGNvbF94X3EgPC0gZW5xdW8oY29sX3gpXG4gIGNvbF95X3EgPC0gZW5xdW8oY29sX3kpXG4gIFxuICBjb2xfeF9vb2VfcSA8LSBlbnF1byhjb2xfeF9vb2UpXG4gIGNvbF95X29vZV9xIDwtIGVucXVvKGNvbF95X29vZSlcbiAgXG4gICMgQ3JlYXRlIGEgc2luZ2xlLCB1bmlmaWVkIGRhdGFmcmFtZSBmb3IgcGxvdHRpbmcgYW5kIHNhdmluZyBhcyBiZWRwZVxuICBkZl90ZW1wIDwtIGRmICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoQW5ub19zaW1wbGUgJWluJSBhbm5vTGlzdCkgJT4lXG4gICAgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGlkLCB4ID0gISFjb2xfeF9xLCB5ID0gISFjb2xfeV9xLFxuICAgICAgICAgICAgICAgICAgeF9vb2UgPSAhIWNvbF94X29vZV9xLCB5X29vZSA9ICEhY29sX3lfb29lX3EpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoZGlmZiA9IHkteCxcbiAgICAgICAgICAgICAgICAgIGRlbnNpdHkgPSBnZXRfZGVuc2l0eSh4LCB5LCBuID0gZGVuc2l0eV9uKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZSh1cGRvd24gPSBjYXNlX3doZW4oXG4gICAgICBkaWZmID4gZGlmZkN1dG9mZiAgfiBcXFVQXFwsXG4gICAgICBkaWZmIDwgLWRpZmZDdXRvZmYgfiBcXERPV05cXCxcbiAgICAgIFRSVUUgICAgICAgICAgICAgICB+IFxcTk9cXCkpXG4gIFxuICAjIEV4cG9ydCBhcyBiZWRwZVxuICBiZWRwZVVQIDwtIGRmX3RlbXAgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duID09IFxcVVBcXCkgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyKVxuICBmd3JpdGUoYmVkcGVVUCwgaGVyZShsb29wRGlyLCBwYXN0ZTAobmFtZSwgXFxfZGlmZkN1dG9mZlxcLCBkaWZmQ3V0b2ZmLCBcXF9VUC5iZWRwZVxcKSksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBiZWRwZU5PIDwtIGRmX3RlbXAgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duID09IFxcTk9cXCkgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyKVxuICBmd3JpdGUoYmVkcGVOTywgaGVyZShsb29wRGlyLCBwYXN0ZTAobmFtZSwgXFxfZGlmZkN1dG9mZlxcLCBkaWZmQ3V0b2ZmLCBcXF9OTy5iZWRwZVxcKSksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBiZWRwZURPV04gPC0gZGZfdGVtcCAlPiUgZHBseXI6OmZpbHRlcih1cGRvd24gPT0gXFxET1dOXFwpICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMilcbiAgZndyaXRlKGJlZHBlRE9XTiwgaGVyZShsb29wRGlyLCBwYXN0ZTAobmFtZSwgXFxfZGlmZkN1dG9mZlxcLCBkaWZmQ3V0b2ZmLCBcXF9ET1dOLmJlZHBlXFwpKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG4gIFxuICBcbiAgcGxvdF9kZiA8LSBkZl90ZW1wICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoaWQsIHgsIHksIHVwZG93biwgZGVuc2l0eSkgJT4lXG4gICAgYXJyYW5nZShkZW5zaXR5KVxuICBcbiAgcGxvdF9kZiR1cGRvd24gPC0gZmFjdG9yKHBsb3RfZGYkdXBkb3duLCBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIFxuICAjIENhbGN1bGF0ZSBhIGdsb2JhbCBkZW5zaXR5IHJhbmdlIHRvIG1ha2Ugc2NhbGVzIGNvbXBhcmFibGVcbiAgZGVuc2l0eV9saW1pdHMgPC0gcmFuZ2UocGxvdF9kZiRkZW5zaXR5LCBuYS5ybSA9IFRSVUUpXG4gIFxuICAjIC0tLS0tLSBTY2F0dGVycGxvdCAtLS0tLS0gXG4gIHAxIDwtIGdncGxvdChwbG90X2RmLCBhZXMoeCA9IHgsIHkgPSB5KSkgK1xuICAgICMgTGF5ZXIgMTogUGxvdCBcXE5PXFwgcG9pbnRzIHdpdGggYSBncmV5IHNjYWxlXG4gICAgZ2VvbV9wb2ludChkYXRhID0gLiAlPiUgZmlsdGVyKHVwZG93biA9PSBcXE5PXFwpICU+JSBhcnJhbmdlKGRlbnNpdHkpLFxuICAgICAgICAgICAgICAgYWVzKGNvbG9yID0gZGVuc2l0eSksIHNpemUgPSAwLjEpICtcbiAgICBzY2FsZV9jb2xvcl9ncmFkaWVudChcbiAgICAgIGxvdyA9IFxcZ3JleTg1XFwsIGhpZ2ggPSBcXGdyZXkzMFxcLFxuICAgICAgbGltaXRzID0gZGVuc2l0eV9saW1pdHMsIG5hbWUgPSBcXERlbnNpdHkgKE5PKVxcXG4gICAgKSArXG4gICAgXG4gICAgIyBJbnRyb2R1Y2UgYSBuZXcgc2NhbGUgZm9yIHRoZSBcXFVQXFwgcG9pbnRzXG4gICAgbmV3X3NjYWxlX2NvbG9yKCkgK1xuICAgICMgTGF5ZXIgMjogUGxvdCBcXFVQXFwgcG9pbnRzIHdpdGggYSByZWQgc2NhbGVcbiAgICBnZW9tX3BvaW50KGRhdGEgPSAuICU+JSBmaWx0ZXIodXBkb3duID09IFxcVVBcXCkgJT4lIGFycmFuZ2UoZGVuc2l0eSksXG4gICAgICAgICAgICAgICBhZXMoY29sb3IgPSBkZW5zaXR5KSwgc2l6ZSA9IDAuMSkgK1xuICAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KFxuICAgICAgbG93ID0gd2Vha19yZWQsIGhpZ2ggPSBzdHJvbmdfcmVkLCAjIExpZ2h0IHRvIGRhcmsgcmVkXG4gICAgICBsaW1pdHMgPSBkZW5zaXR5X2xpbWl0cywgbmFtZSA9IFxcRGVuc2l0eSAoVVApXFxcbiAgICApICtcbiAgICBcbiAgICAjIEludHJvZHVjZSBhIG5ldyBzY2FsZSBmb3IgdGhlIFxcRE9XTlxcIHBvaW50c1xuICAgIG5ld19zY2FsZV9jb2xvcigpICtcbiAgICAjIExheWVyIDM6IFBsb3QgXFxET1dOXFwgcG9pbnRzIHdpdGggYSBibHVlIHNjYWxlXG4gICAgZ2VvbV9wb2ludChkYXRhID0gLiAlPiUgZmlsdGVyKHVwZG93biA9PSBcXERPV05cXCkgJT4lIGFycmFuZ2UoZGVuc2l0eSksXG4gICAgICAgICAgICAgICBhZXMoY29sb3IgPSBkZW5zaXR5KSwgc2l6ZSA9IDAuMSkgK1xuICAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KFxuICAgICAgbG93ID0gd2Vha19ibHVlLCBoaWdoID0gc3Ryb25nX2JsdWUsICMgTGlnaHQgdG8gZGFyayBibHVlXG4gICAgICBsaW1pdHMgPSBkZW5zaXR5X2xpbWl0cywgbmFtZSA9IFxcRGVuc2l0eSAoRE9XTilcXFxuICAgICkgK1xuICAgIFxuICAgICMgQWRkIGFubm90YXRpb25zIGFuZCB0aGVtZSBlbGVtZW50c1xuICAgIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsgY29vcmRfZml4ZWQoKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgdGhlbWUoXG4gICAgICBsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCxcbiAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIGhqdXN0ID0gMC41LFxuICAgICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZVxuICAgICAgKSxcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgICApLFxuICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgICApLFxuICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICApICtcbiAgICBsYWJzKHggPSBxdW9fbmFtZShjb2xfeF9xKSwgeSA9IHF1b19uYW1lKGNvbF95X3EpKSArXG4gICAgZ2d0aXRsZSh0aXRsZSlcbiAgXG4gIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaCAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzY2F0dGVycGxvdF9cXCwgbmFtZSlcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBcbiAgICAgICAgICB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbiAgXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBcbiAgICAgIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodCwgdW5pdHMgPSBcXGluXFwsIHJlcyA9IDYwMClcbiAgcHJpbnQocDEpXG4gIGRldi5vZmYoKVxuICBcbiAgIyAtLS0tLS0gUGllIGNoYXJ0IC0tLS0tLSBcbiAgcGllX2RmIDwtIHBsb3RfZGYgJT4lXG4gICAgZHBseXI6OmNvdW50KHVwZG93bikgJT4lXG4gICAgbXV0YXRlKFxuICAgICAgcGN0ICAgPSBuIC8gc3VtKG4pICogMTAwLFxuICAgICAgbGFiZWwgPSBwYXN0ZTAodXBkb3duLCBcXFxcblxcLCBuLCBcXFxcbihcXCwgcm91bmQocGN0LCAxKSwgXFwlKVxcKVxuICAgIClcbiAgXG4gIHAyIDwtIGdncGxvdChwaWVfZGYsIGFlcyh4ID0gXFxcXCwgeSA9IG4sIGZpbGwgPSB1cGRvd24pKSArXG4gICAgZ2VvbV9jb2woY29sb3IgPSBcXHdoaXRlXFwpICtcbiAgICBjb29yZF9wb2xhcih0aGV0YSA9IFxceVxcKSArXG4gICAgZ2VvbV90ZXh0KFxuICAgICAgYWVzKGxhYmVsID0gbGFiZWwpLFxuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksXG4gICAgICBzaXplICAgICA9IGZvbnRTaXplTSAvIDJcbiAgICApICtcbiAgICB0aGVtZV92b2lkKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCkgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFxVUFxcID0gc3Ryb25nX3JlZCwgXFxOT1xcID0gbm9fZ3JleSwgXFxET1dOXFwgPSBzdHJvbmdfYmx1ZSkpXG4gIFxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxccGllY2hhcnRfXFwsIG5hbWUpKVxuICB3aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuICBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpXG4gIHByaW50KHAyKVxuICBkZXYub2ZmKClcbiAgXG4gIFxuICAjIC0tLS0tLSBWaW9saW4gcGxvdCBvZiBvb2UgLS0tLS0tIFxuICBwbG90X2RmX29vZSA8LSBkZl90ZW1wICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoaWQsIHhfb29lLCB5X29vZSwgdXBkb3duKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKCFpcy5uYSh4X29vZSksICFpcy5uYSh5X29vZSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoXG4gICAgICB4X29vZSA9IGlmX2Vsc2UoeF9vb2UgPT0gMCwgcHNldWRvX29vZSwgeF9vb2UpLFxuICAgICAgeV9vb2UgPSBpZl9lbHNlKHlfb29lID09IDAsIHBzZXVkb19vb2UsIHlfb29lKSxcbiAgICAgIGZjICAgID0gbG9nMih5X29vZSAvIHhfb29lKVxuICAgIClcbiAgXG4gIHBsb3RfZGZfb29lJHVwZG93biA8LSBmYWN0b3IocGxvdF9kZl9vb2UkdXBkb3duLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIFxuICBwMyA8LSBnZ3Bsb3QocGxvdF9kZl9vb2UsIGFlcyh4ID0gdXBkb3duLCB5ID0gZmMsIGZpbGwgPSB1cGRvd24pKSArXG4gICAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgYWxwaGEgPSAuNCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSB1cGRvd24pLCBmdW4gPSBtZWFuLFxuICAgICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKVxuICAgICkgK1xuICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMywgMykpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKHN0cm9uZ19yZWQsIFxcZ3JleTMwXFwsIHN0cm9uZ19ibHVlKSkgK1xuICAgIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLFxuICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgICApLFxuICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgICkgK2xhYnMoeSA9IFxcbG9nMiBmYyBvZiBvYnMvZXhwXFwpICArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCxcbiAgICAgICAgICAgICAgIGFscGhhID0gMSxcbiAgICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGMoLTAuNSwgMC41KSxcbiAgICAgICAgICAgICAgIGFscGhhID0gMC41LFxuICAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpXG4gICBcbiAgXG4gIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFx2aW9saW5fXFwsIG5hbWUpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocDMpXG4gIGRldi5vZmYoKSAgXG59XG5cblxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5maWdEaXIgPC0gaGVyZShcXC4uL2ZpZ3VyZS9sb29wX2FuYWx5c2lzXFwpXG5kaXIuY3JlYXRlKGZpZ0Rpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpXG5cbmRhdGEgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcXGxvb3BTY29yZV9jaHJvbW9zaWdodC50c3ZcXCkpXG5cblxucGxvdF9sb29wX3Njb3Jlc19hbmRfc2F2ZV9iZWRwZShkYXRhLCBzY29yZV9ETVNPLCBzY29yZV9kVEFHLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb29lX0RNU08sIG9vZV9kVEFHLCBwc2V1ZG9fb29lID0gMC4wMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfc2NvcmVfYWxsX2RUQUd2c0RNU09cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19zY29yZV9hbGxfZFRBR3ZzRE1TT1xcLCBmaWdEaXIsIGNvbW1vbkxvb3BEaXIpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucGxvdF9sb29wX3Njb3Jlc19hbmRfc2F2ZV9iZWRwZSA8LSBmdW5jdGlvbihkZiwgY29sX3gsIGNvbF95LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3hfb29lLCBjb2xfeV9vb2UsIHBzZXVkb19vb2UgPSAwLjAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdGl0bGUsIGZpZ0RpciwgbG9vcERpcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMiwgZGVuc2l0eV9uID0gMjAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWluID0gLTAuNSwgeG1heCA9IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltaW4gPSAtMC41LCB5bWF4ID0gMSkge1xuICBjb2xfeF9xIDwtIGVucXVvKGNvbF94KVxuICBjb2xfeV9xIDwtIGVucXVvKGNvbF95KVxuICBcbiAgY29sX3hfb29lX3EgPC0gZW5xdW8oY29sX3hfb29lKVxuICBjb2xfeV9vb2VfcSA8LSBlbnF1byhjb2xfeV9vb2UpXG4gIFxuICAjIENyZWF0ZSBhIHNpbmdsZSwgdW5pZmllZCBkYXRhZnJhbWUgZm9yIHBsb3R0aW5nIGFuZCBzYXZpbmcgYXMgYmVkcGVcbiAgZGZfdGVtcCA8LSBkZiAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYW5ub0xpc3QpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgeCA9ICEhY29sX3hfcSwgeSA9ICEhY29sX3lfcSxcbiAgICAgICAgICAgICAgICAgIHhfb29lID0gISFjb2xfeF9vb2VfcSwgeV9vb2UgPSAhIWNvbF95X29vZV9xKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGRpZmYgPSB5LXgsXG4gICAgICAgICAgICAgICAgICBkZW5zaXR5ID0gZ2V0X2RlbnNpdHkoeCwgeSwgbiA9IGRlbnNpdHlfbikpICU+JVxuICAgIGRwbHlyOjptdXRhdGUodXBkb3duID0gY2FzZV93aGVuKFxuICAgICAgZGlmZiA+IGRpZmZDdXRvZmYgIH4gXFxVUFxcLFxuICAgICAgZGlmZiA8IC1kaWZmQ3V0b2ZmIH4gXFxET1dOXFwsXG4gICAgICBUUlVFICAgICAgICAgICAgICAgfiBcXE5PXFwpKVxuICBcbiAgIyBFeHBvcnQgYXMgYmVkcGVcbiAgYmVkcGVVUCA8LSBkZl90ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93biA9PSBcXFVQXFwpICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMilcbiAgZndyaXRlKGJlZHBlVVAsIGhlcmUobG9vcERpciwgcGFzdGUwKG5hbWUsIFxcX2RpZmZDdXRvZmZcXCwgZGlmZkN1dG9mZiwgXFxfVVAuYmVkcGVcXCkpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbiAgYmVkcGVOTyA8LSBkZl90ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93biA9PSBcXE5PXFwpICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMilcbiAgZndyaXRlKGJlZHBlTk8sIGhlcmUobG9vcERpciwgcGFzdGUwKG5hbWUsIFxcX2RpZmZDdXRvZmZcXCwgZGlmZkN1dG9mZiwgXFxfTk8uYmVkcGVcXCkpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbiAgYmVkcGVET1dOIDwtIGRmX3RlbXAgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duID09IFxcRE9XTlxcKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIpXG4gIGZ3cml0ZShiZWRwZURPV04sIGhlcmUobG9vcERpciwgcGFzdGUwKG5hbWUsIFxcX2RpZmZDdXRvZmZcXCwgZGlmZkN1dG9mZiwgXFxfRE9XTi5iZWRwZVxcKSksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBcbiAgXG4gIHBsb3RfZGYgPC0gZGZfdGVtcCAlPiVcbiAgICBkcGx5cjo6c2VsZWN0KGlkLCB4LCB5LCB1cGRvd24sIGRlbnNpdHkpICU+JVxuICAgIGFycmFuZ2UoZGVuc2l0eSlcbiAgXG4gIHBsb3RfZGYkdXBkb3duIDwtIGZhY3RvcihwbG90X2RmJHVwZG93biwgYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpKVxuICBcbiAgIyBDYWxjdWxhdGUgYSBnbG9iYWwgZGVuc2l0eSByYW5nZSB0byBtYWtlIHNjYWxlcyBjb21wYXJhYmxlXG4gIGRlbnNpdHlfbGltaXRzIDwtIHJhbmdlKHBsb3RfZGYkZGVuc2l0eSwgbmEucm0gPSBUUlVFKVxuICBcbiAgIyAtLS0tLS0gU2NhdHRlcnBsb3QgLS0tLS0tIFxuICBwMSA8LSBnZ3Bsb3QocGxvdF9kZiwgYWVzKHggPSB4LCB5ID0geSkpICtcbiAgICAjIExheWVyIDE6IFBsb3QgXFxOT1xcIHBvaW50cyB3aXRoIGEgZ3JleSBzY2FsZVxuICAgIGdlb21fcG9pbnQoZGF0YSA9IC4gJT4lIGZpbHRlcih1cGRvd24gPT0gXFxOT1xcKSAlPiUgYXJyYW5nZShkZW5zaXR5KSxcbiAgICAgICAgICAgICAgIGFlcyhjb2xvciA9IGRlbnNpdHkpLCBzaXplID0gMC4xKSArXG4gICAgc2NhbGVfY29sb3JfZ3JhZGllbnQoXG4gICAgICBsb3cgPSBcXGdyZXk4NVxcLCBoaWdoID0gXFxncmV5MzBcXCxcbiAgICAgIGxpbWl0cyA9IGRlbnNpdHlfbGltaXRzLCBuYW1lID0gXFxEZW5zaXR5IChOTylcXFxuICAgICkgK1xuICAgIFxuICAgICMgSW50cm9kdWNlIGEgbmV3IHNjYWxlIGZvciB0aGUgXFxVUFxcIHBvaW50c1xuICAgIG5ld19zY2FsZV9jb2xvcigpICtcbiAgICAjIExheWVyIDI6IFBsb3QgXFxVUFxcIHBvaW50cyB3aXRoIGEgcmVkIHNjYWxlXG4gICAgZ2VvbV9wb2ludChkYXRhID0gLiAlPiUgZmlsdGVyKHVwZG93biA9PSBcXFVQXFwpICU+JSBhcnJhbmdlKGRlbnNpdHkpLFxuICAgICAgICAgICAgICAgYWVzKGNvbG9yID0gZGVuc2l0eSksIHNpemUgPSAwLjEpICtcbiAgICBzY2FsZV9jb2xvcl9ncmFkaWVudChcbiAgICAgIGxvdyA9IHdlYWtfcmVkLCBoaWdoID0gc3Ryb25nX3JlZCwgIyBMaWdodCB0byBkYXJrIHJlZFxuICAgICAgbGltaXRzID0gZGVuc2l0eV9saW1pdHMsIG5hbWUgPSBcXERlbnNpdHkgKFVQKVxcXG4gICAgKSArXG4gICAgXG4gICAgIyBJbnRyb2R1Y2UgYSBuZXcgc2NhbGUgZm9yIHRoZSBcXERPV05cXCBwb2ludHNcbiAgICBuZXdfc2NhbGVfY29sb3IoKSArXG4gICAgIyBMYXllciAzOiBQbG90IFxcRE9XTlxcIHBvaW50cyB3aXRoIGEgYmx1ZSBzY2FsZVxuICAgIGdlb21fcG9pbnQoZGF0YSA9IC4gJT4lIGZpbHRlcih1cGRvd24gPT0gXFxET1dOXFwpICU+JSBhcnJhbmdlKGRlbnNpdHkpLFxuICAgICAgICAgICAgICAgYWVzKGNvbG9yID0gZGVuc2l0eSksIHNpemUgPSAwLjEpICtcbiAgICBzY2FsZV9jb2xvcl9ncmFkaWVudChcbiAgICAgIGxvdyA9IHdlYWtfYmx1ZSwgaGlnaCA9IHN0cm9uZ19ibHVlLCAjIExpZ2h0IHRvIGRhcmsgYmx1ZVxuICAgICAgbGltaXRzID0gZGVuc2l0eV9saW1pdHMsIG5hbWUgPSBcXERlbnNpdHkgKERPV04pXFxcbiAgICApICtcbiAgICBcbiAgICAjIEFkZCBhbm5vdGF0aW9ucyBhbmQgdGhlbWUgZWxlbWVudHNcbiAgICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArIGNvb3JkX2ZpeGVkKCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIHRoZW1lKFxuICAgICAgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBoanVzdCA9IDAuNSxcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGVcbiAgICAgICksXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgKSArXG4gICAgbGFicyh4ID0gcXVvX25hbWUoY29sX3hfcSksIHkgPSBxdW9fbmFtZShjb2xfeV9xKSkgK1xuICAgIGdndGl0bGUodGl0bGUpXG4gIFxuICB3aWR0aCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxuICBoZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2ggIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2NhdHRlcnBsb3RfXFwsIG5hbWUpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgXG4gICAgICAgICAgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG4gIFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgXG4gICAgICB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQsIHVuaXRzID0gXFxpblxcLCByZXMgPSA2MDApXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbiAgXG4gICMgLS0tLS0tIFBpZSBjaGFydCAtLS0tLS0gXG4gIHBpZV9kZiA8LSBwbG90X2RmICU+JVxuICAgIGRwbHlyOjpjb3VudCh1cGRvd24pICU+JVxuICAgIG11dGF0ZShcbiAgICAgIHBjdCAgID0gbiAvIHN1bShuKSAqIDEwMCxcbiAgICAgIGxhYmVsID0gcGFzdGUwKHVwZG93biwgXFxcXG5cXCwgbiwgXFxcXG4oXFwsIHJvdW5kKHBjdCwgMSksIFxcJSlcXClcbiAgICApXG4gIFxuICBwMiA8LSBnZ3Bsb3QocGllX2RmLCBhZXMoeCA9IFxcXFwsIHkgPSBuLCBmaWxsID0gdXBkb3duKSkgK1xuICAgIGdlb21fY29sKGNvbG9yID0gXFx3aGl0ZVxcKSArXG4gICAgY29vcmRfcG9sYXIodGhldGEgPSBcXHlcXCkgK1xuICAgIGdlb21fdGV4dChcbiAgICAgIGFlcyhsYWJlbCA9IGxhYmVsKSxcbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLFxuICAgICAgc2l6ZSAgICAgPSBmb250U2l6ZU0gLyAyXG4gICAgKSArXG4gICAgdGhlbWVfdm9pZCgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcVVBcXCA9IHN0cm9uZ19yZWQsIFxcTk9cXCA9IG5vX2dyZXksIFxcRE9XTlxcID0gc3Ryb25nX2JsdWUpKVxuICBcbiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXHBpZWNoYXJ0X1xcLCBuYW1lKSlcbiAgd2lkdGggPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbiAgc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KVxuICBwcmludChwMilcbiAgZGV2Lm9mZigpXG4gIFxuICBcbiAgIyAtLS0tLS0gVmlvbGluIHBsb3Qgb2Ygb29lIC0tLS0tLSBcbiAgcGxvdF9kZl9vb2UgPC0gZGZfdGVtcCAlPiVcbiAgICBkcGx5cjo6c2VsZWN0KGlkLCB4X29vZSwgeV9vb2UsIHVwZG93bikgJT4lXG4gICAgZHBseXI6OmZpbHRlcighaXMubmEoeF9vb2UpLCAhaXMubmEoeV9vb2UpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKFxuICAgICAgeF9vb2UgPSBpZl9lbHNlKHhfb29lID09IDAsIHBzZXVkb19vb2UsIHhfb29lKSxcbiAgICAgIHlfb29lID0gaWZfZWxzZSh5X29vZSA9PSAwLCBwc2V1ZG9fb29lLCB5X29vZSksXG4gICAgICBmYyAgICA9IGxvZzIoeV9vb2UgLyB4X29vZSlcbiAgICApXG4gIFxuICBwbG90X2RmX29vZSR1cGRvd24gPC0gZmFjdG9yKHBsb3RfZGZfb29lJHVwZG93biwgbGV2ZWxzID0gYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpKVxuICBcbiAgcDMgPC0gZ2dwbG90KHBsb3RfZGZfb29lLCBhZXMoeCA9IHVwZG93biwgeSA9IGZjLCBmaWxsID0gdXBkb3duKSkgK1xuICAgIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjQsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgdGhlbWVfY2xhc3NpYygpICsgXG4gICAgc3RhdF9zdW1tYXJ5KFxuICAgICAgYWVzKGdyb3VwID0gdXBkb3duKSwgZnVuID0gbWVhbixcbiAgICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgICApICtcbiAgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTMsIDMpKSArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhzdHJvbmdfcmVkLCBcXGdyZXkzMFxcLCBzdHJvbmdfYmx1ZSkpICtcbiAgICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSxcbiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICAgKSxcbiAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgICApLFxuICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgICApLFxuICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApICtsYWJzKHkgPSBcXGxvZzIgZmMgb2Ygb2JzL2V4cFxcKSAgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsXG4gICAgICAgICAgICAgICBhbHBoYSA9IDEsXG4gICAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjKC0wLjUsIDAuNSksXG4gICAgICAgICAgICAgICBhbHBoYSA9IDAuNSxcbiAgICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKVxuICAgXG4gIFxuICB3aWR0aCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxuICBoZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcdmlvbGluX1xcLCBuYW1lKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHAzKVxuICBkZXYub2ZmKCkgIFxufVxuXG5cbmNvbW1vbkxvb3BEaXIgPC0gaGVyZShcXC4uL2RhdGEvbG9vcF9hbmFseXNpc1xcKVxuZmlnRGlyIDwtIGhlcmUoXFwuLi9maWd1cmUvbG9vcF9hbmFseXNpc1xcKVxuZGlyLmNyZWF0ZShmaWdEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKVxuXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgXFxsb29wU2NvcmVfY2hyb21vc2lnaHQudHN2XFwpKVxuXG5cbnBsb3RfbG9vcF9zY29yZXNfYW5kX3NhdmVfYmVkcGUoZGF0YSwgc2NvcmVfRE1TTywgc2NvcmVfZFRBRywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9vZV9ETVNPLCBvb2VfZFRBRywgcHNldWRvX29vZSA9IDAuMDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1TXFwsIFxcUy1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxYLVhcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X3Njb3JlX2FsbF9kVEFHdnNETVNPXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fc2NvcmVfYWxsX2RUQUd2c0RNU09cXCwgZmlnRGlyLCBjb21tb25Mb29wRGlyKVxuYGBgXG5gYGAifQ== -->

```r
```r
plot_loop_scores_and_save_bedpe <- function(df, col_x, col_y, 
                                            col_x_ooe, col_y_ooe, pseudo_ooe = 0.01,
                                            annoList,
                                            name, title, figDir, loopDir,
                                            diffCutoff = 0.2, density_n = 200,
                                            xmin = -0.5, xmax = 1,
                                            ymin = -0.5, ymax = 1) {
  col_x_q <- enquo(col_x)
  col_y_q <- enquo(col_y)
  
  col_x_ooe_q <- enquo(col_x_ooe)
  col_y_ooe_q <- enquo(col_y_ooe)
  
  # Create a single, unified dataframe for plotting and saving as bedpe
  df_temp <- df %>%
    dplyr::filter(Anno_simple %in% annoList) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, x = !!col_x_q, y = !!col_y_q,
                  x_ooe = !!col_x_ooe_q, y_ooe = !!col_y_ooe_q) %>%
    dplyr::mutate(diff = y-x,
                  density = get_density(x, y, n = density_n)) %>%
    dplyr::mutate(updown = case_when(
      diff > diffCutoff  ~ \UP\,
      diff < -diffCutoff ~ \DOWN\,
      TRUE               ~ \NO\))
  
  # Export as bedpe
  bedpeUP <- df_temp %>% dplyr::filter(updown == \UP\) %>% dplyr::select(chrom1, start1, end1, chrom2, start2, end2)
  fwrite(bedpeUP, here(loopDir, paste0(name, \_diffCutoff\, diffCutoff, \_UP.bedpe\)), sep = \\t\, col.names = FALSE)
  bedpeNO <- df_temp %>% dplyr::filter(updown == \NO\) %>% dplyr::select(chrom1, start1, end1, chrom2, start2, end2)
  fwrite(bedpeNO, here(loopDir, paste0(name, \_diffCutoff\, diffCutoff, \_NO.bedpe\)), sep = \\t\, col.names = FALSE)
  bedpeDOWN <- df_temp %>% dplyr::filter(updown == \DOWN\) %>% dplyr::select(chrom1, start1, end1, chrom2, start2, end2)
  fwrite(bedpeDOWN, here(loopDir, paste0(name, \_diffCutoff\, diffCutoff, \_DOWN.bedpe\)), sep = \\t\, col.names = FALSE)
  
  
  plot_df <- df_temp %>%
    dplyr::select(id, x, y, updown, density) %>%
    arrange(density)
  
  plot_df$updown <- factor(plot_df$updown, c(\UP\, \NO\, \DOWN\))
  
  # Calculate a global density range to make scales comparable
  density_limits <- range(plot_df$density, na.rm = TRUE)
  
  # ------ Scatterplot ------ 
  p1 <- ggplot(plot_df, aes(x = x, y = y)) +
    # Layer 1: Plot \NO\ points with a grey scale
    geom_point(data = . %>% filter(updown == \NO\) %>% arrange(density),
               aes(color = density), size = 0.1) +
    scale_color_gradient(
      low = \grey85\, high = \grey30\,
      limits = density_limits, name = \Density (NO)\
    ) +
    
    # Introduce a new scale for the \UP\ points
    new_scale_color() +
    # Layer 2: Plot \UP\ points with a red scale
    geom_point(data = . %>% filter(updown == \UP\) %>% arrange(density),
               aes(color = density), size = 0.1) +
    scale_color_gradient(
      low = weak_red, high = strong_red, # Light to dark red
      limits = density_limits, name = \Density (UP)\
    ) +
    
    # Introduce a new scale for the \DOWN\ points
    new_scale_color() +
    # Layer 3: Plot \DOWN\ points with a blue scale
    geom_point(data = . %>% filter(updown == \DOWN\) %>% arrange(density),
               aes(color = density), size = 0.1) +
    scale_color_gradient(
      low = weak_blue, high = strong_blue, # Light to dark blue
      limits = density_limits, name = \Density (DOWN)\
    ) +
    
    # Add annotations and theme elements
    xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    theme_classic() +
    theme(
      legend.position = \none\,
      plot.title = element_text(
        hjust = 0.5,
        size = fontSizeS,
        family = fontType
      ),
      axis.title = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.line = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
    ) +
    labs(x = quo_name(col_x_q), y = quo_name(col_y_q)) +
    ggtitle(title)
  
  width <- panelSize(1.5)*mmToInch
  height <- panelSize(1.5)*mmToInch  
  
  fileName <- paste0(\scatterplot_\, name)
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = width, height = height)
  print(p1)
  dev.off()
  
  png(here(figDir, paste0(fileName, \.png\)), 
      width = width, height = height, units = \in\, res = 600)
  print(p1)
  dev.off()
  
  # ------ Pie chart ------ 
  pie_df <- plot_df %>%
    dplyr::count(updown) %>%
    mutate(
      pct   = n / sum(n) * 100,
      label = paste0(updown, \\n\, n, \\n(\, round(pct, 1), \%)\)
    )
  
  p2 <- ggplot(pie_df, aes(x = \\, y = n, fill = updown)) +
    geom_col(color = \white\) +
    coord_polar(theta = \y\) +
    geom_text(
      aes(label = label),
      position = position_stack(vjust = 0.5),
      size     = fontSizeM / 2
    ) +
    theme_void() + theme(legend.position = \none\) +
    scale_fill_manual(values = c(\UP\ = strong_red, \NO\ = no_grey, \DOWN\ = strong_blue))
  
  fileName <- here(figDir, paste0(\piechart_\, name))
  width <- panelSize(2)*mmToInch
  height <- panelSize(2)*mmToInch
  svglite(paste0(fileName, \.svg\), width = width, height = height)
  print(p2)
  dev.off()
  
  
  # ------ Violin plot of ooe ------ 
  plot_df_ooe <- df_temp %>%
    dplyr::select(id, x_ooe, y_ooe, updown) %>%
    dplyr::filter(!is.na(x_ooe), !is.na(y_ooe)) %>%
    dplyr::mutate(
      x_ooe = if_else(x_ooe == 0, pseudo_ooe, x_ooe),
      y_ooe = if_else(y_ooe == 0, pseudo_ooe, y_ooe),
      fc    = log2(y_ooe / x_ooe)
    )
  
  plot_df_ooe$updown <- factor(plot_df_ooe$updown, levels = c(\UP\, \NO\, \DOWN\))
  
  p3 <- ggplot(plot_df_ooe, aes(x = updown, y = fc, fill = updown)) +
    geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, show.legend = FALSE) + 
    geom_boxplot(width = 0.3, color = \black\,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\,
                 outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
    theme_classic() + 
    stat_summary(
      aes(group = updown), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) +
    coord_cartesian(ylim = c(-3, 3)) +
    scale_fill_manual(values = c(strong_red, \grey30\, strong_blue)) +
    theme(
      axis.title.x = element_blank(),
      axis.title.y = element_text(
        size = fontSizeM,
        family = fontType,
        color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.text.x = element_text(
        size = fontSizeM,
        angle = 45,      # Rotate x-axis labels 45 degrees
        hjust = 1,       # Adjust horizontal justification
        vjust = 1        # Adjust vertical justification
      ),
      axis.line = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
      legend.text = element_text(family = fontType, size = fontSizeS),
      legend.title = element_text(family = fontType, size = fontSizeS)
    ) +labs(y = \log2 fc of obs/exp\)  +
    geom_hline(yintercept = 0,
               alpha = 1,
               color = \black\,
               size = lineThick*mmToLineUnit,
               lineend = \square\) +
    geom_hline(yintercept = c(-0.5, 0.5),
               alpha = 0.5,
               color = \black\,
               size = lineThick*mmToLineUnit,
               lineend = \square\, linetype = \dashed\)
   
  
  width <- panelSize(1.5)*mmToInch
  height <- panelSize(1.5)*mmToInch
  fileName <- paste0(\violin_\, name)
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p3)
  dev.off()  
}


commonLoopDir <- here(\../data/loop_analysis\)
figDir <- here(\../figure/loop_analysis\)
dir.create(figDir, showWarnings = FALSE, recursive = TRUE)

data <- fread(here(commonLoopDir, \loopScore_chromosight.tsv\))


plot_loop_scores_and_save_bedpe(data, score_DMSO, score_dTAG, 
                                ooe_DMSO, ooe_dTAG, pseudo_ooe = 0.01,
                                c(\P-P\, \P-E\, \P-S\, \P-X\,
                                  \E-E\, \E-S\, \E-X\,
                                  \S-S\, \S-X\,
                                  \X-X\),
                                name = \chromosight_score_all_dTAGvsDMSO\,
                                title = \chromo_score_all_dTAGvsDMSO\, figDir, commonLoopDir)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiV2FybmluZyA6RHVwbGljYXRlZCBhZXN0aGV0aWNzIGFmdGVyIG5hbWUgc3RhbmRhcmRpc2F0aW9uOiBjb2xvdXJcbldhcm5pbmcgOkR1cGxpY2F0ZWQgYWVzdGhldGljcyBhZnRlciBuYW1lIHN0YW5kYXJkaXNhdGlvbjogY29sb3VyXG5XYXJuaW5nIDpEdXBsaWNhdGVkIGFlc3RoZXRpY3MgYWZ0ZXIgbmFtZSBzdGFuZGFyZGlzYXRpb246IGNvbG91clxuV2FybmluZyA6RHVwbGljYXRlZCBhZXN0aGV0aWNzIGFmdGVyIG5hbWUgc3RhbmRhcmRpc2F0aW9uOiBjb2xvdXJcbldhcm5pbmcgOkR1cGxpY2F0ZWQgYWVzdGhldGljcyBhZnRlciBuYW1lIHN0YW5kYXJkaXNhdGlvbjogY29sb3VyXG5udWxsIGRldmljZSBcbiAgICAgICAgICAxIFxuIn0= -->

```
Warning :Duplicated aesthetics after name standardisation: colour
Warning :Duplicated aesthetics after name standardisation: colour
Warning :Duplicated aesthetics after name standardisation: colour
Warning :Duplicated aesthetics after name standardisation: colour
Warning :Duplicated aesthetics after name standardisation: colour
null device 
          1 
```



<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

## [2] Visualizing loop annotation
### [FIG] Loop Anno pie chart

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzVrY21GM1gyUnZiblYwSUR3dElHWjFibU4wYVc5dUtHeHZiM0FzSUc1aGJXVXBlMXh1SUNCdUlEd3RJRzV5YjNjb2JHOXZjQ2xjYmlBZ2RHVnRjQ0E4TFNCc2IyOXdJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR2xrTENCQmJtNXZLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtFRnVibTlIY205MWNDQTlJR05oYzJWZmQyaGxiaWhjYmlBZ0lDQWdJRUZ1Ym04Z0pXbHVKU0JqS0Z3aVVDMVFYQ0lzSUZ3aVVDMUZYQ0lzSUZ3aVJTMUZYQ0lwSUg0Z1hDSnlaV2RmY21WblhDSXNYRzRnSUNBZ0lDQkJibTV2SUNWcGJpVWdZeWhjSWxBdFUxQmNJaXdnWENKUUxWTkZYQ0lzSUZ3aVJTMVRVRndpTENCY0lrVXRVMFZjSWlrZ2ZpQmNJbkpsWjE5emRISlNaV2RjSWl4Y2JpQWdJQ0FnSUVGdWJtOGdKV2x1SlNCaktGd2lVQzFUWENJc0lGd2lSUzFUWENJcElINGdYQ0p5WldkZmMzUnlYQ0lzWEc0Z0lDQWdJQ0JCYm01dklDVnBiaVVnWXloY0lsTlFMVk5RWENJc0lGd2lVMUF0VTBWY0lpd2dYQ0pUUlMxVFJWd2lLU0IrSUZ3aWMzUnlVbVZuWDNOMGNsSmxaMXdpTEZ4dUlDQWdJQ0FnUVc1dWJ5QWxhVzRsSUdNb1hDSlRVQzFUWENJc0lGd2lVMFV0VTF3aUtTQitJRndpYzNSeVVtVm5YM04wY2x3aUxGeHVJQ0FnSUNBZ1FXNXVieUFsYVc0bElHTW9YQ0pRTFZoY0lpd2dYQ0pGTFZoY0lpa2dmaUJjSW5KbFoxOXZkR2hsY2x3aUxGeHVJQ0FnSUNBZ1FXNXVieUFsYVc0bElHTW9YQ0pUVUMxWVhDSXNJRndpVTBVdFdGd2lLU0IrSUZ3aWMzUnlVbVZuWDI5MGFHVnlYQ0lzWEc0Z0lDQWdJQ0JCYm01dklDVnBiaVVnWXloY0lsTXRVMXdpTENCY0lsTXRXRndpS1NCK0lGd2ljM1J5WENJc1hHNGdJQ0FnSUNCQmJtNXZJQ1ZwYmlVZ1l5aGNJbGd0V0Z3aUtTQitJRndpYjNSb1pYSmNJaXhjYmlBZ0lDQWdJRlJTVlVVZ2ZpQk9RVnh1SUNBZ0lDa3BYRzRnSUZ4dUlDQmNiaUFnZEdWdGNDUkJibTV2UjNKdmRYQWdQQzBnWm1GamRHOXlLSFJsYlhBa1FXNXViMGR5YjNWd0xDQnNaWFpsYkhNZ1BTQmpLRndpY21WblgzSmxaMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSnlaV2RmYzNSeVVtVm5YQ0lzSUZ3aWNtVm5YM04wY2x3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p6ZEhKU1pXZGZjM1J5VW1WblhDSXNJRndpYzNSeVVtVm5YM04wY2x3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p5WldkZmIzUm9aWEpjSWl3Z1hDSnpkSEpTWldkZmIzUm9aWEpjSWl3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbk4wY2x3aUxDQmNJbTkwYUdWeVhDSXBLVnh1SUNCY2JpQWdYRzRnSUhCcFpWOWtaaUE4TFNCMFpXMXdJQ1UrSlZ4dUlDQWdJR0Z6WDNScFltSnNaU2dwSUNVK0pTQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5QnBaaUIwWlcxd0lIZGhjeUJoSUd4cGMzUXNJSFJvYVhNZ2QybHNiQ0JsY25KdmNpQmxZWEpzZVZ4dUlDQWdJR2R5YjNWd1gySjVLRUZ1Ym05SGNtOTFjQ2tnSlQ0bFhHNGdJQ0FnYzNWdGJXRnlhWE5sS0c0Z1BTQnVLQ2tzSUM1bmNtOTFjSE1nUFNCY0ltUnliM0JjSWlrZ0pUNGxYRzRnSUNBZ2JYVjBZWFJsS0d4aFltVnNJRDBnY0dGemRHVXdLRUZ1Ym05SGNtOTFjQ3dnWENKY1hHNG9YQ0lzSUc0c0lGd2lLVndpS1NsY2JpQWdYRzRnSUhBZ1BDMGdaMmR3Ykc5MEtIQnBaVjlrWml3Z1lXVnpLSGdnUFNBeUxDQjVJRDBnYml3Z1ptbHNiQ0E5SUVGdWJtOUhjbTkxY0NrcElDdGNiaUFnSUNCblpXOXRYMk52YkNoamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2QybGtkR2dnUFNBeEtTQXJYRzRnSUNBZ1kyOXZjbVJmY0c5c1lYSW9kR2hsZEdFZ1BTQmNJbmxjSWlrZ0sxeHVJQ0FnSUhoc2FXMG9NQzQxTENBeUxqVXBJQ3NnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUE4TFNCamNtVmhkR1Z6SUhSb1pTRGlnSnhvYjJ4bDRvQ2RJR0o1SUdOc2FYQndhVzVuSUhSb1pTQmpaVzUwWlhKY2JpQWdJQ0JuWlc5dFgzUmxlSFFvWVdWektHeGhZbVZzSUQwZ2JHRmlaV3dwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0J3YjNOcGRHbHZiaUE5SUhCdmMybDBhVzl1WDNOMFlXTnJLSFpxZFhOMElEMGdNQzQxS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJsNlpTQTlJRE1wSUN0Y2JpQWdJQ0IwYUdWdFpWOTJiMmxrS0NrZ0sxeHVJQ0FnSUhSb1pXMWxLR3hsWjJWdVpDNXdiM05wZEdsdmJpQTlJRndpYm05dVpWd2lMRnh1SUNBZ0lDQWdJQ0FnSUhCc2IzUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYUdwMWMzUWdQU0F3TGpVcFhHNGdJQ0FnS1NBclhHNGdJQ0FnWjJkMGFYUnNaU2h3WVhOMFpUQW9ibUZ0WlN3Z1hDSmNYRzVjSWl3Z2Jpd2dYQ0lnYkc5dmNITmNJaWtwWEc0Z0lGeHVJQ0JjYmlBZ2QybGtkR2dnUFNBelhHNGdJR2hsYVdkb2RDQTlJRE5jYmlBZ2MzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lIQmhjM1JsTUNoY0ltUnZiblYwWDJ4dmIzQkJibTV2WDF3aUxDQnVZVzFsTENCY0lpNXpkbWRjSWlrcExGeHVJQ0FnSUNBZ0lDQWdJSGRwWkhSb0lEMGdkMmxrZEdnc0lHaGxhV2RvZENBOUlHaGxhV2RvZENsY2JpQWdjR3h2ZENod0tWeHVJQ0JrWlhZdWIyWm1LQ2xjYm4xY2JseHVaSEpoZDE5a2IyNTFkQ2hzYjI5d1gyTm9jbTl0Ynl3Z1hDSmphSEp2Ylc5emFXZG9kRndpS1Z4dVpISmhkMTlrYjI1MWRDaHNiMjl3WDJocFkyUmpjQ3dnWENKb2FXTmtZM0JjSWlsY2JtUnlZWGRmWkc5dWRYUW9iRzl2Y0Y5SVlXNXpaVzRzSUZ3aVNHRnVjMlZ1WENJcFhHNWNibUJnWUNKOSAtLT5cblxuYGBgclxuXG5kcmF3X2RvbnV0IDwtIGZ1bmN0aW9uKGxvb3AsIG5hbWUpe1xuICBuIDwtIG5yb3cobG9vcClcbiAgdGVtcCA8LSBsb29wICU+JSBkcGx5cjo6c2VsZWN0KGlkLCBBbm5vKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKEFubm9Hcm91cCA9IGNhc2Vfd2hlbihcbiAgICAgIEFubm8gJWluJSBjKFwiUC1QXCIsIFwiUC1FXCIsIFwiRS1FXCIpIH4gXCJyZWdfcmVnXCIsXG4gICAgICBBbm5vICVpbiUgYyhcIlAtU1BcIiwgXCJQLVNFXCIsIFwiRS1TUFwiLCBcIkUtU0VcIikgfiBcInJlZ19zdHJSZWdcIixcbiAgICAgIEFubm8gJWluJSBjKFwiUC1TXCIsIFwiRS1TXCIpIH4gXCJyZWdfc3RyXCIsXG4gICAgICBBbm5vICVpbiUgYyhcIlNQLVNQXCIsIFwiU1AtU0VcIiwgXCJTRS1TRVwiKSB+IFwic3RyUmVnX3N0clJlZ1wiLFxuICAgICAgQW5ubyAlaW4lIGMoXCJTUC1TXCIsIFwiU0UtU1wiKSB+IFwic3RyUmVnX3N0clwiLFxuICAgICAgQW5ubyAlaW4lIGMoXCJQLVhcIiwgXCJFLVhcIikgfiBcInJlZ19vdGhlclwiLFxuICAgICAgQW5ubyAlaW4lIGMoXCJTUC1YXCIsIFwiU0UtWFwiKSB+IFwic3RyUmVnX290aGVyXCIsXG4gICAgICBBbm5vICVpbiUgYyhcIlMtU1wiLCBcIlMtWFwiKSB+IFwic3RyXCIsXG4gICAgICBBbm5vICVpbiUgYyhcIlgtWFwiKSB+IFwib3RoZXJcIixcbiAgICAgIFRSVUUgfiBOQVxuICAgICkpXG4gIFxuICBcbiAgdGVtcCRBbm5vR3JvdXAgPC0gZmFjdG9yKHRlbXAkQW5ub0dyb3VwLCBsZXZlbHMgPSBjKFwicmVnX3JlZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWdfc3RyUmVnXCIsIFwicmVnX3N0clwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzdHJSZWdfc3RyUmVnXCIsIFwic3RyUmVnX3N0clwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWdfb3RoZXJcIiwgXCJzdHJSZWdfb3RoZXJcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInN0clwiLCBcIm90aGVyXCIpKVxuICBcbiAgXG4gIHBpZV9kZiA8LSB0ZW1wICU+JVxuICAgIGFzX3RpYmJsZSgpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiB0ZW1wIHdhcyBhIGxpc3QsIHRoaXMgd2lsbCBlcnJvciBlYXJseVxuICAgIGdyb3VwX2J5KEFubm9Hcm91cCkgJT4lXG4gICAgc3VtbWFyaXNlKG4gPSBuKCksIC5ncm91cHMgPSBcImRyb3BcIikgJT4lXG4gICAgbXV0YXRlKGxhYmVsID0gcGFzdGUwKEFubm9Hcm91cCwgXCJcXG4oXCIsIG4sIFwiKVwiKSlcbiAgXG4gIHAgPC0gZ2dwbG90KHBpZV9kZiwgYWVzKHggPSAyLCB5ID0gbiwgZmlsbCA9IEFubm9Hcm91cCkpICtcbiAgICBnZW9tX2NvbChjb2xvciA9IFwiYmxhY2tcIiwgd2lkdGggPSAxKSArXG4gICAgY29vcmRfcG9sYXIodGhldGEgPSBcInlcIikgK1xuICAgIHhsaW0oMC41LCAyLjUpICsgICAgICAgICAgICAgICAgIyA8LSBjcmVhdGVzIHRoZSDigJxob2xl4oCdIGJ5IGNsaXBwaW5nIHRoZSBjZW50ZXJcbiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbGFiZWwpLFxuICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSxcbiAgICAgICAgICAgICAgc2l6ZSA9IDMpICtcbiAgICB0aGVtZV92b2lkKCkgK1xuICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFwibm9uZVwiLFxuICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpXG4gICAgKSArXG4gICAgZ2d0aXRsZShwYXN0ZTAobmFtZSwgXCJcXG5cIiwgbiwgXCIgbG9vcHNcIikpXG4gIFxuICBcbiAgd2lkdGggPSAzXG4gIGhlaWdodCA9IDNcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpcixcbiAgICAgICAgICAgICAgIHBhc3RlMChcImRvbnV0X2xvb3BBbm5vX1wiLCBuYW1lLCBcIi5zdmdcIikpLFxuICAgICAgICAgIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodClcbiAgcGxvdChwKVxuICBkZXYub2ZmKClcbn1cblxuZHJhd19kb251dChsb29wX2Nocm9tbywgXCJjaHJvbW9zaWdodFwiKVxuZHJhd19kb251dChsb29wX2hpY2RjcCwgXCJoaWNkY3BcIilcbmRyYXdfZG9udXQobG9vcF9IYW5zZW4sIFwiSGFuc2VuXCIpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5kcmF3X2RvbnV0IDwtIGZ1bmN0aW9uKGxvb3AsIG5hbWUpe1xuICBuIDwtIG5yb3cobG9vcClcbiAgdGVtcCA8LSBsb29wICU+JSBkcGx5cjo6c2VsZWN0KGlkLCBBbm5vKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKEFubm9Hcm91cCA9IGNhc2Vfd2hlbihcbiAgICAgIEFubm8gJWluJSBjKFwiUC1QXCIsIFwiUC1FXCIsIFwiRS1FXCIpIH4gXCJyZWdfcmVnXCIsXG4gICAgICBBbm5vICVpbiUgYyhcIlAtU1BcIiwgXCJQLVNFXCIsIFwiRS1TUFwiLCBcIkUtU0VcIikgfiBcInJlZ19zdHJSZWdcIixcbiAgICAgIEFubm8gJWluJSBjKFwiUC1TXCIsIFwiRS1TXCIpIH4gXCJyZWdfc3RyXCIsXG4gICAgICBBbm5vICVpbiUgYyhcIlNQLVNQXCIsIFwiU1AtU0VcIiwgXCJTRS1TRVwiKSB+IFwic3RyUmVnX3N0clJlZ1wiLFxuICAgICAgQW5ubyAlaW4lIGMoXCJTUC1TXCIsIFwiU0UtU1wiKSB+IFwic3RyUmVnX3N0clwiLFxuICAgICAgQW5ubyAlaW4lIGMoXCJQLVhcIiwgXCJFLVhcIikgfiBcInJlZ19vdGhlclwiLFxuICAgICAgQW5ubyAlaW4lIGMoXCJTUC1YXCIsIFwiU0UtWFwiKSB+IFwic3RyUmVnX290aGVyXCIsXG4gICAgICBBbm5vICVpbiUgYyhcIlMtU1wiLCBcIlMtWFwiKSB+IFwic3RyXCIsXG4gICAgICBBbm5vICVpbiUgYyhcIlgtWFwiKSB+IFwib3RoZXJcIixcbiAgICAgIFRSVUUgfiBOQVxuICAgICkpXG4gIFxuICBcbiAgdGVtcCRBbm5vR3JvdXAgPC0gZmFjdG9yKHRlbXAkQW5ub0dyb3VwLCBsZXZlbHMgPSBjKFwicmVnX3JlZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWdfc3RyUmVnXCIsIFwicmVnX3N0clwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzdHJSZWdfc3RyUmVnXCIsIFwic3RyUmVnX3N0clwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWdfb3RoZXJcIiwgXCJzdHJSZWdfb3RoZXJcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInN0clwiLCBcIm90aGVyXCIpKVxuICBcbiAgXG4gIHBpZV9kZiA8LSB0ZW1wICU+JVxuICAgIGFzX3RpYmJsZSgpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiB0ZW1wIHdhcyBhIGxpc3QsIHRoaXMgd2lsbCBlcnJvciBlYXJseVxuICAgIGdyb3VwX2J5KEFubm9Hcm91cCkgJT4lXG4gICAgc3VtbWFyaXNlKG4gPSBuKCksIC5ncm91cHMgPSBcImRyb3BcIikgJT4lXG4gICAgbXV0YXRlKGxhYmVsID0gcGFzdGUwKEFubm9Hcm91cCwgXCJcXG4oXCIsIG4sIFwiKVwiKSlcbiAgXG4gIHAgPC0gZ2dwbG90KHBpZV9kZiwgYWVzKHggPSAyLCB5ID0gbiwgZmlsbCA9IEFubm9Hcm91cCkpICtcbiAgICBnZW9tX2NvbChjb2xvciA9IFwiYmxhY2tcIiwgd2lkdGggPSAxKSArXG4gICAgY29vcmRfcG9sYXIodGhldGEgPSBcInlcIikgK1xuICAgIHhsaW0oMC41LCAyLjUpICsgICAgICAgICAgICAgICAgIyA8LSBjcmVhdGVzIHRoZSDigJxob2xl4oCdIGJ5IGNsaXBwaW5nIHRoZSBjZW50ZXJcbiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbGFiZWwpLFxuICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSxcbiAgICAgICAgICAgICAgc2l6ZSA9IDMpICtcbiAgICB0aGVtZV92b2lkKCkgK1xuICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFwibm9uZVwiLFxuICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpXG4gICAgKSArXG4gICAgZ2d0aXRsZShwYXN0ZTAobmFtZSwgXCJcXG5cIiwgbiwgXCIgbG9vcHNcIikpXG4gIFxuICBcbiAgd2lkdGggPSAzXG4gIGhlaWdodCA9IDNcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpcixcbiAgICAgICAgICAgICAgIHBhc3RlMChcImRvbnV0X2xvb3BBbm5vX1wiLCBuYW1lLCBcIi5zdmdcIikpLFxuICAgICAgICAgIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodClcbiAgcGxvdChwKVxuICBkZXYub2ZmKClcbn1cblxuZHJhd19kb251dChsb29wX2Nocm9tbywgXCJjaHJvbW9zaWdodFwiKVxuZHJhd19kb251dChsb29wX2hpY2RjcCwgXCJoaWNkY3BcIilcbmRyYXdfZG9udXQobG9vcF9IYW5zZW4sIFwiSGFuc2VuXCIpXG5cbmBgYCJ9 -->

```r

draw_donut <- function(loop, name){
  n <- nrow(loop)
  temp <- loop %>% dplyr::select(id, Anno) %>%
    dplyr::mutate(AnnoGroup = case_when(
      Anno %in% c("P-P", "P-E", "E-E") ~ "reg_reg",
      Anno %in% c("P-SP", "P-SE", "E-SP", "E-SE") ~ "reg_strReg",
      Anno %in% c("P-S", "E-S") ~ "reg_str",
      Anno %in% c("SP-SP", "SP-SE", "SE-SE") ~ "strReg_strReg",
      Anno %in% c("SP-S", "SE-S") ~ "strReg_str",
      Anno %in% c("P-X", "E-X") ~ "reg_other",
      Anno %in% c("SP-X", "SE-X") ~ "strReg_other",
      Anno %in% c("S-S", "S-X") ~ "str",
      Anno %in% c("X-X") ~ "other",
      TRUE ~ NA
    ))
  
  
  temp$AnnoGroup <- factor(temp$AnnoGroup, levels = c("reg_reg",
                                                      "reg_strReg", "reg_str",
                                                      "strReg_strReg", "strReg_str",
                                                      "reg_other", "strReg_other", 
                                                      "str", "other"))
  
  
  pie_df <- temp %>%
    as_tibble() %>%                          # if temp was a list, this will error early
    group_by(AnnoGroup) %>%
    summarise(n = n(), .groups = "drop") %>%
    mutate(label = paste0(AnnoGroup, "\n(", n, ")"))
  
  p <- ggplot(pie_df, aes(x = 2, y = n, fill = AnnoGroup)) +
    geom_col(color = "black", width = 1) +
    coord_polar(theta = "y") +
    xlim(0.5, 2.5) +                # <- creates the “hole” by clipping the center
    geom_text(aes(label = label),
              position = position_stack(vjust = 0.5),
              size = 3) +
    theme_void() +
    theme(legend.position = "none",
          plot.title = element_text(hjust = 0.5)
    ) +
    ggtitle(paste0(name, "\n", n, " loops"))
  
  
  width = 3
  height = 3
  svglite(here(figDir,
               paste0("donut_loopAnno_", name, ".svg")),
          width = width, height = height)
  plot(p)
  dev.off()
}

draw_donut(loop_chromo, "chromosight")
draw_donut(loop_hicdcp, "hicdcp")
draw_donut(loop_Hansen, "Hansen")

```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

## [3] Loop analysis
### Chromosight
#### [FIG] Scatterplot

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpYMkZ1WkY5ellYWmxYMkpsWkhCbEtHUmhkR0VzSUhOamIzSmxYMFJOVTA4c0lITmpiM0psWDJSVVFVY3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZiMlZmUkUxVFR5d2diMjlsWDJSVVFVY3NJSEJ6WlhWa2IxOXZiMlVnUFNBd0xqQXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpLRndpVUMxUVhDSXNJRndpVUMxRlhDSXNJRndpUlMxRlhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hDSmphSEp2Ylc5emFXZG9kRjl6WTI5eVpWOWpiMjF3YkdWNFgzSmxaMTlrVkVGSGRuTkVUVk5QWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWENKamFISnZiVzlmYzJOdmNtVmZZMjl0Y0d4bGVGOXlaV2RmWkZSQlIzWnpSRTFUVDF3aUxDQm1hV2RFYVhJc0lHTnZiVzF2Ymt4dmIzQkVhWElzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0Z1Ym05ZlkyOXNJRDBnWENKQmJtNXZYQ0lwWEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5cbnBsb3RfbG9vcF9zY29yZXNfYW5kX3NhdmVfYmVkcGUoZGF0YSwgc2NvcmVfRE1TTywgc2NvcmVfZFRBRywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9vZV9ETVNPLCBvb2VfZFRBRywgcHNldWRvX29vZSA9IDAuMDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoXCJQLVBcIiwgXCJQLUVcIiwgXCJFLUVcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBcImNocm9tb3NpZ2h0X3Njb3JlX2NvbXBsZXhfcmVnX2RUQUd2c0RNU09cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBcImNocm9tb19zY29yZV9jb21wbGV4X3JlZ19kVEFHdnNETVNPXCIsIGZpZ0RpciwgY29tbW9uTG9vcERpcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub19jb2wgPSBcIkFubm9cIilcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5wbG90X2xvb3Bfc2NvcmVzX2FuZF9zYXZlX2JlZHBlKGRhdGEsIHNjb3JlX0RNU08sIHNjb3JlX2RUQUcsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvb2VfRE1TTywgb29lX2RUQUcsIHBzZXVkb19vb2UgPSAwLjAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKFwiUC1QXCIsIFwiUC1FXCIsIFwiRS1FXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gXCJjaHJvbW9zaWdodF9zY29yZV9jb21wbGV4X3JlZ19kVEFHdnNETVNPXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gXCJjaHJvbW9fc2NvcmVfY29tcGxleF9yZWdfZFRBR3ZzRE1TT1wiLCBmaWdEaXIsIGNvbW1vbkxvb3BEaXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9fY29sID0gXCJBbm5vXCIpXG5cbmBgYCJ9 -->

```r

plot_loop_scores_and_save_bedpe(data, score_DMSO, score_dTAG, 
                                ooe_DMSO, ooe_dTAG, pseudo_ooe = 0.01,
                                c("P-P", "P-E", "E-E"),
                                name = "chromosight_score_complex_reg_dTAGvsDMSO",
                                title = "chromo_score_complex_reg_dTAGvsDMSO", figDir, commonLoopDir,
                                anno_col = "Anno")

```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

```
null device 
          1 
```



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjR3h2ZEY5c2IyOXdYM05qYjNKbGMxOWhibVJmYzJGMlpWOWlaV1J3WlNoa1lYUmhMQ0J6WTI5eVpWOUVUVk5QTENCelkyOXlaVjlrVkVGSExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IyOWxYMFJOVTA4c0lHOXZaVjlrVkVGSExDQndjMlYxWkc5ZmIyOWxJRDBnTUM0d01TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1l5aGNJbE10VTF3aUxDQmNJbE10V0Z3aUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaU0E5SUZ3aVkyaHliMjF2YzJsbmFIUmZjMk52Y21WZlkyOXRjR3hsZUY5emRISmZaRlJCUjNaelJFMVRUMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYVhSc1pTQTlJRndpWTJoeWIyMXZYM05qYjNKbFgyTnZiWEJzWlhoZmMzUnlYMlJVUVVkMmMwUk5VMDljSWl3Z1ptbG5SR2x5TENCamIyMXRiMjVNYjI5d1JHbHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhibTV2WDJOdmJDQTlJRndpUVc1dWIxd2lLVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbnBsb3RfbG9vcF9zY29yZXNfYW5kX3NhdmVfYmVkcGUoZGF0YSwgc2NvcmVfRE1TTywgc2NvcmVfZFRBRywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9vZV9ETVNPLCBvb2VfZFRBRywgcHNldWRvX29vZSA9IDAuMDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoXCJTLVNcIiwgXCJTLVhcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBcImNocm9tb3NpZ2h0X3Njb3JlX2NvbXBsZXhfc3RyX2RUQUd2c0RNU09cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBcImNocm9tb19zY29yZV9jb21wbGV4X3N0cl9kVEFHdnNETVNPXCIsIGZpZ0RpciwgY29tbW9uTG9vcERpcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub19jb2wgPSBcIkFubm9cIilcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGxvdF9sb29wX3Njb3Jlc19hbmRfc2F2ZV9iZWRwZShkYXRhLCBzY29yZV9ETVNPLCBzY29yZV9kVEFHLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb29lX0RNU08sIG9vZV9kVEFHLCBwc2V1ZG9fb29lID0gMC4wMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhcIlMtU1wiLCBcIlMtWFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IFwiY2hyb21vc2lnaHRfc2NvcmVfY29tcGxleF9zdHJfZFRBR3ZzRE1TT1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IFwiY2hyb21vX3Njb3JlX2NvbXBsZXhfc3RyX2RUQUd2c0RNU09cIiwgZmlnRGlyLCBjb21tb25Mb29wRGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vX2NvbCA9IFwiQW5ub1wiKVxuYGBgIn0= -->

```r
plot_loop_scores_and_save_bedpe(data, score_DMSO, score_dTAG, 
                                ooe_DMSO, ooe_dTAG, pseudo_ooe = 0.01,
                                c("S-S", "S-X"),
                                name = "chromosight_score_complex_str_dTAGvsDMSO",
                                title = "chromo_score_complex_str_dTAGvsDMSO", figDir, commonLoopDir,
                                anno_col = "Anno")
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

```
null device 
          1 
```



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjR3h2ZEY5c2IyOXdYM05qYjNKbGMxOWhibVJmYzJGMlpWOWlaV1J3WlNoa1lYUmhMQ0J6WTI5eVpWOUVUVk5QTENCelkyOXlaVjlrVkVGSExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IyOWxYMFJOVTA4c0lHOXZaVjlrVkVGSExDQndjMlYxWkc5ZmIyOWxJRDBnTUM0d01TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1l5aGNJbE10VTF3aUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaU0E5SUZ3aVkyaHliMjF2YzJsbmFIUmZjMk52Y21WZlkyOXRjR3hsZUY5emRISXlYMlJVUVVkMmMwUk5VMDljSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdsMGJHVWdQU0JjSW1Ob2NtOXRiMTl6WTI5eVpWOWpiMjF3YkdWNFgzTjBjakpmWDJSVVFVZDJjMFJOVTA5Y0lpd2dabWxuUkdseUxDQmpiMjF0YjI1TWIyOXdSR2x5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlgyTnZiQ0E5SUZ3aVFXNXViMXdpS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5wbG90X2xvb3Bfc2NvcmVzX2FuZF9zYXZlX2JlZHBlKGRhdGEsIHNjb3JlX0RNU08sIHNjb3JlX2RUQUcsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvb2VfRE1TTywgb29lX2RUQUcsIHBzZXVkb19vb2UgPSAwLjAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKFwiUy1TXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gXCJjaHJvbW9zaWdodF9zY29yZV9jb21wbGV4X3N0cjJfZFRBR3ZzRE1TT1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IFwiY2hyb21vX3Njb3JlX2NvbXBsZXhfc3RyMl9fZFRBR3ZzRE1TT1wiLCBmaWdEaXIsIGNvbW1vbkxvb3BEaXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9fY29sID0gXCJBbm5vXCIpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGxvdF9sb29wX3Njb3Jlc19hbmRfc2F2ZV9iZWRwZShkYXRhLCBzY29yZV9ETVNPLCBzY29yZV9kVEFHLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb29lX0RNU08sIG9vZV9kVEFHLCBwc2V1ZG9fb29lID0gMC4wMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhcIlMtU1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IFwiY2hyb21vc2lnaHRfc2NvcmVfY29tcGxleF9zdHIyX2RUQUd2c0RNU09cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBcImNocm9tb19zY29yZV9jb21wbGV4X3N0cjJfX2RUQUd2c0RNU09cIiwgZmlnRGlyLCBjb21tb25Mb29wRGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vX2NvbCA9IFwiQW5ub1wiKVxuYGBgIn0= -->

```r
plot_loop_scores_and_save_bedpe(data, score_DMSO, score_dTAG, 
                                ooe_DMSO, ooe_dTAG, pseudo_ooe = 0.01,
                                c("S-S"),
                                name = "chromosight_score_complex_str2_dTAGvsDMSO",
                                title = "chromo_score_complex_str2__dTAGvsDMSO", figDir, commonLoopDir,
                                anno_col = "Anno")
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

```
null device 
          1 
```



<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### [FIG] LOLA on anchor

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeTB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMWNiaU1nVEU5QlJFbE9SeUJNVDB4QklFUkNYRzVzYVdKeVlYSjVLRndpYzJsdGNHeGxRMkZqYUdWY0lpbGNibXhwWW5KaGNua29YQ0pNVDB4QlhDSXBYRzVzYjJ4aFJFSWdQU0JzYjJGa1VtVm5hVzl1UkVJb1hDSXZWbTlzZFcxbGN5OVZTMHBKVGw5VFUwUXZUWFJ2UnpGZllXNWhiSGx6YVhOZlkyOWtaUzl5WldabGNtVnVZMlV2VEU5TVFVTnZjbVZmWTJGamFHVmtMMjF0TVRCY0lpbGNibHh1SXlCR1ZVNURWRWxQVGxOY2JtVjRkSEpoWTNSQmJtTm9iM0lnUEMwZ1puVnVZM1JwYjI0b2JHOXZjQ2w3WEc0Z0lHRnVZMmh2Y2pFZ1BDMGdiRzl2Y0NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNcEtWeHVJQ0JqYjJ4dVlXMWxjeWhoYm1Ob2IzSXhLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNiaUFnWVc1amFHOXlNaUE4TFNCc2IyOXdJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR01vTkN3Z05Td2dOaWtwWEc0Z0lHTnZiRzVoYldWektHRnVZMmh2Y2pJcElEd3RJR01vWENKamFISmNJaXdnWENKemRHRnlkRndpTENCY0ltVnVaRndpS1Z4dUlDQmhibU5vYjNKeklEd3RJSEpsWkhWalpTaHRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1ltbHVaRjl5YjNkektHRnVZMmh2Y2pFc0lHRnVZMmh2Y2pJcEtTbGNiaUFnSUNCeVpYUjFjbTRvWVc1amFHOXljeWxjYm4xY2JseHVZWFJoWXlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0p0YlRFd1hDSXNJRndpUjFOTk16RXdOakkxTjE5QlZFRkRYMFZUUTE4eExtSmxaRndpS1NrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1ZqRXNJRll5TENCV015bGNibU52Ykc1aGJXVnpLR0YwWVdNcElEd3RJR01vWENKamFISmNJaXdnWENKemRHRnlkRndpTENCY0ltVnVaRndpS1Z4dVlYUmhZeTVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1lYUmhZeWxjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4jIExPQURJTkcgTE9MQSBEQlxubGlicmFyeShcInNpbXBsZUNhY2hlXCIpXG5saWJyYXJ5KFwiTE9MQVwiKVxubG9sYURCID0gbG9hZFJlZ2lvbkRCKFwiL1ZvbHVtZXMvVUtKSU5fU1NEL010b0cxX2FuYWx5c2lzX2NvZGUvcmVmZXJlbmNlL0xPTEFDb3JlX2NhY2hlZC9tbTEwXCIpXG5cbiMgRlVOQ1RJT05TXG5leHRyYWN0QW5jaG9yIDwtIGZ1bmN0aW9uKGxvb3Ape1xuICBhbmNob3IxIDwtIGxvb3AgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbiAgY29sbmFtZXMoYW5jaG9yMSkgPC0gYyhcImNoclwiLCBcInN0YXJ0XCIsIFwiZW5kXCIpXG4gIGFuY2hvcjIgPC0gbG9vcCAlPiUgZHBseXI6OnNlbGVjdChjKDQsIDUsIDYpKVxuICBjb2xuYW1lcyhhbmNob3IyKSA8LSBjKFwiY2hyXCIsIFwic3RhcnRcIiwgXCJlbmRcIilcbiAgYW5jaG9ycyA8LSByZWR1Y2UobWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGJpbmRfcm93cyhhbmNob3IxLCBhbmNob3IyKSkpXG4gICAgcmV0dXJuKGFuY2hvcnMpXG59XG5cbmF0YWMgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFwibW0xMFwiLCBcIkdTTTMxMDYyNTdfQVRBQ19FU0NfMS5iZWRcIikpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpXG5jb2xuYW1lcyhhdGFjKSA8LSBjKFwiY2hyXCIsIFwic3RhcnRcIiwgXCJlbmRcIilcbmF0YWMuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGF0YWMpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiMgTE9BRElORyBMT0xBIERCXG5saWJyYXJ5KFwic2ltcGxlQ2FjaGVcIilcbmxpYnJhcnkoXCJMT0xBXCIpXG5sb2xhREIgPSBsb2FkUmVnaW9uREIoXCIvVm9sdW1lcy9VS0pJTl9TU0QvTXRvRzFfYW5hbHlzaXNfY29kZS9yZWZlcmVuY2UvTE9MQUNvcmVfY2FjaGVkL21tMTBcIilcblxuIyBGVU5DVElPTlNcbmV4dHJhY3RBbmNob3IgPC0gZnVuY3Rpb24obG9vcCl7XG4gIGFuY2hvcjEgPC0gbG9vcCAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyhhbmNob3IxKSA8LSBjKFwiY2hyXCIsIFwic3RhcnRcIiwgXCJlbmRcIilcbiAgYW5jaG9yMiA8LSBsb29wICU+JSBkcGx5cjo6c2VsZWN0KGMoNCwgNSwgNikpXG4gIGNvbG5hbWVzKGFuY2hvcjIpIDwtIGMoXCJjaHJcIiwgXCJzdGFydFwiLCBcImVuZFwiKVxuICBhbmNob3JzIDwtIHJlZHVjZShtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYmluZF9yb3dzKGFuY2hvcjEsIGFuY2hvcjIpKSlcbiAgICByZXR1cm4oYW5jaG9ycylcbn1cblxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXCJtbTEwXCIsIFwiR1NNMzEwNjI1N19BVEFDX0VTQ18xLmJlZFwiKSkgJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMylcbmNvbG5hbWVzKGF0YWMpIDwtIGMoXCJjaHJcIiwgXCJzdGFydFwiLCBcImVuZFwiKVxuYXRhYy5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYXRhYylcbmBgYCJ9 -->

```r
#-------------------------------------------------------------------------------
# LOADING LOLA DB
library("simpleCache")
library("LOLA")
lolaDB = loadRegionDB("/Volumes/UKJIN_SSD/MtoG1_analysis_code/reference/LOLACore_cached/mm10")

# FUNCTIONS
extractAnchor <- function(loop){
  anchor1 <- loop %>% dplyr::select(c(1, 2, 3))
  colnames(anchor1) <- c("chr", "start", "end")
  anchor2 <- loop %>% dplyr::select(c(4, 5, 6))
  colnames(anchor2) <- c("chr", "start", "end")
  anchors <- reduce(makeGRangesFromDataFrame(bind_rows(anchor1, anchor2)))
    return(anchors)
}

atac <- fread(here(refDir, "mm10", "GSM3106257_ATAC_ESC_1.bed")) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c("chr", "start", "end")
atac.gr <- makeGRangesFromDataFrame(atac)
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### All loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR1Z0Y0NBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hSaGNtZGxkQ0FsYVc0bElIUmhjbWRsZEV4cGMzUXBYRzUwWlcxd0pIUmhjbWRsZENBOExTQm1ZV04wYjNJb2RHVnRjQ1IwWVhKblpYUXNJR3hsZG1Wc2N5QTlJSEpsZGloMFlYSm5aWFJNYVhOMEtTbGNibHh1WEc1eFZtRnNkV1ZNYjJkTllYZ2dQQzBnTlRCY2JuUmxiWEF5SUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvY1ZaaGJIVmxURzluSUQwZ2JXbHVLSEZXWVd4MVpVeHZaeXdnY1ZaaGJIVmxURzluVFdGNEtTbGNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjRElzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCMFlYSm5aWFFzSUdacGJHd2dQU0J2WkdSelVtRjBhVzhzSUhOcGVtVWdQU0J4Vm1Gc2RXVk1iMmNwS1NBclhHNGdJR2RsYjIxZmNHOXBiblFvYzJoaGNHVWdQU0F5TVN3Z0lDQWdJQ0FnSUNNZ1JXNXpkWEpsY3lCaElIQnZhVzUwSUhkcGRHZ2dZVzRnYjNWMGJHbHVaVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lITjBjbTlyWlNBOUlERXFjSFJVYjAxTklDQWdJQ0FnSXlCTWFXNWxJSGRwWkhSb0lHWnZjaUIwYUdVZ1ltOXlaR1Z5WEc0Z0lDa2dLeUIwYUdWdFpWOWlkeWdwSUNzZ1hHNGdJSE5qWVd4bFgzTnBlbVZmWTI5dWRHbHVkVzkxY3loeVlXNW5aU0E5SUdNb01DNDFMQ0F5S1NrZ0t5QWdJeUJUWlhRZ2JXbHVJR0Z1WkNCdFlYZ2djRzlwYm5RZ2MybDZaWE1nYUdWeVpWeHVJQ0J6WTJGc1pWOW1hV3hzWDJkeVlXUnBaVzUwS0d4dmR5QTlJRndpZDJocGRHVmNJaXdnYUdsbmFDQTlJRndpSTBOQ016TXpRVndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYldsMGN5QTlJR01vTVN3Z015a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IyOWlJRDBnYzJOaGJHVnpPanB6Y1hWcGMyZ3NJQ01nUkdWbWFXNWxJR2R5WVdScFpXNTBJR052Ykc5eWMxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkMWFXUmxJRDBnWjNWcFpHVmZZMjlzYjNKaVlYSW9YRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZWEozYVdSMGFDQTlJREV1TlM4MUxqQTRMQ0FnSXlCQlpHcDFjM1FnZDJsa2RHZ2diMllnZEdobElHTnZiRzl5SUdKaGNseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRnlhR1ZwWjJoMElEMGdNVFV2TlM0d09DQWdJQ01nUVdScWRYTjBJR2hsYVdkb2RDQnZaaUIwYUdVZ1kyOXNiM0lnWW1GeVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS1Z4dUlDQXBJQ3NnWEc0Z0lHeGhZbk1vZUNBOUlFNVZURXdzSUhrZ1BTQk9WVXhNS1NBZ0sxeHVJQ0IwYUdWdFpTaGNiaUFnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCaGJtZHNaU0E5SURRMUxDQWdJQ0FnSUNNZ1VtOTBZWFJsSUhndFlYaHBjeUJzWVdKbGJITWdORFVnWkdWbmNtVmxjMXh1SUNBZ0lDQWdhR3AxYzNRZ1BTQXhMQ0FnSUNBZ0lDQWpJRUZrYW5WemRDQm9iM0pwZW05dWRHRnNJR3AxYzNScFptbGpZWFJwYjI1Y2JpQWdJQ0FnSUhacWRYTjBJRDBnTVNBZ0lDQWdJQ0FnSXlCQlpHcDFjM1FnZG1WeWRHbGpZV3dnYW5WemRHbG1hV05oZEdsdmJseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NXNhVzVsSUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXhjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHbGphM01nUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWENKMGNtRnVjM0JoY21WdWRGd2lLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5a3NYRzRnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtWeHVJQ0FwWEc1Y2JtWnBaMFJwY2lBOExTQm9aWEpsS0Z3aUxpNHZabWxuZFhKbEwyeHZiM0JmWVc1aGJIbHphWE5jSWlsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpVEU5TVFWOWNJaXdnYm1GdFpTbGNibmRwWkhSb0lEd3RJSEJoYm1Wc1UybDZaU2d4TGpVcEttMXRWRzlKYm1Ob1hHNW9aV2xuYUhRZ1BDMGdjR0Z1Wld4VGFYcGxLREV1T1NrcWJXMVViMGx1WTJoY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHRhcmdldCAlaW4lIHRhcmdldExpc3QpXG50ZW1wJHRhcmdldCA8LSBmYWN0b3IodGVtcCR0YXJnZXQsIGxldmVscyA9IHJldih0YXJnZXRMaXN0KSlcblxuXG5xVmFsdWVMb2dNYXggPC0gNTBcbnRlbXAyIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUocVZhbHVlTG9nID0gbWluKHFWYWx1ZUxvZywgcVZhbHVlTG9nTWF4KSlcblxucCA8LSBnZ3Bsb3QodGVtcDIsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGZpbGwgPSBvZGRzUmF0aW8sIHNpemUgPSBxVmFsdWVMb2cpKSArXG4gIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZVxuICAgICAgICAgICAgIHN0cm9rZSA9IDEqcHRUb01NICAgICAgIyBMaW5lIHdpZHRoIGZvciB0aGUgYm9yZGVyXG4gICkgKyB0aGVtZV9idygpICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9IFwid2hpdGVcIiwgaGlnaCA9IFwiI0NCMzMzQVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICsgXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcIiMwMDAwMDBcIlxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcIiMwMDAwMDBcIlxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcIiMwMDAwMDBcIixcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFwic3F1YXJlXCJcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFwiIzAwMDAwMFwiLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXCJzcXVhcmVcIlxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXCJ0cmFuc3BhcmVudFwiKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5cbmZpZ0RpciA8LSBoZXJlKFwiLi4vZmlndXJlL2xvb3BfYW5hbHlzaXNcIilcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFwiTE9MQV9cIiwgbmFtZSlcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuOSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5wbmdcIikpLCByZXMgPSA2MDAsIHVuaXQgPSBcImluXCIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHRhcmdldCAlaW4lIHRhcmdldExpc3QpXG50ZW1wJHRhcmdldCA8LSBmYWN0b3IodGVtcCR0YXJnZXQsIGxldmVscyA9IHJldih0YXJnZXRMaXN0KSlcblxuXG5xVmFsdWVMb2dNYXggPC0gNTBcbnRlbXAyIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUocVZhbHVlTG9nID0gbWluKHFWYWx1ZUxvZywgcVZhbHVlTG9nTWF4KSlcblxucCA8LSBnZ3Bsb3QodGVtcDIsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGZpbGwgPSBvZGRzUmF0aW8sIHNpemUgPSBxVmFsdWVMb2cpKSArXG4gIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZVxuICAgICAgICAgICAgIHN0cm9rZSA9IDEqcHRUb01NICAgICAgIyBMaW5lIHdpZHRoIGZvciB0aGUgYm9yZGVyXG4gICkgKyB0aGVtZV9idygpICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9IFwid2hpdGVcIiwgaGlnaCA9IFwiI0NCMzMzQVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICsgXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcIiMwMDAwMDBcIlxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcIiMwMDAwMDBcIlxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcIiMwMDAwMDBcIixcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFwic3F1YXJlXCJcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFwiIzAwMDAwMFwiLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXCJzcXVhcmVcIlxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXCJ0cmFuc3BhcmVudFwiKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5cbmZpZ0RpciA8LSBoZXJlKFwiLi4vZmlndXJlL2xvb3BfYW5hbHlzaXNcIilcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFwiTE9MQV9cIiwgbmFtZSlcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuOSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5wbmdcIikpLCByZXMgPSA2MDAsIHVuaXQgPSBcImluXCIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuYGBgIn0= -->

```r
temp <- temp %>% dplyr::filter(target %in% targetList)
temp$target <- factor(temp$target, levels = rev(targetList))


qValueLogMax <- 50
temp2 <- temp %>% dplyr::mutate(qValueLog = min(qValueLog, qValueLogMax))

p <- ggplot(temp2, aes(x = group, y = target, fill = oddsRatio, size = qValueLog)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = "white", high = "#CB333A",
                      limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = "#000000"
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = "#000000"
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = "#000000",
      size = lineThick*mmToLineUnit,
      lineend = "square"
    ),
    axis.ticks = element_line(
      color = "#000000",
      size = lineThick*mmToLineUnit,
      lineend = "square"
    ),
    panel.background = element_rect(fill = "transparent"),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

figDir <- here("../figure/loop_analysis")

fileName <- paste0("LOLA_", name)
width <- panelSize(1.5)*mmToInch
height <- panelSize(1.9)*mmToInch
png(here(figDir, paste0(fileName, ".png")), res = 600, unit = "in", height = height, width = width)
print(p)
dev.off()

```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

```
null device 
          1 
```



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIuc3ZnXCIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5zdmdcIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmBgYCJ9 -->

```r
svglite(here(figDir, paste0(fileName, ".svg")),  height = height, width = width)
print(p)
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaR1YyTG05bVppZ3BYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZGV2Lm9mZigpXG5gYGAifQ== -->

```r
dev.off()
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

```
null device 
          1 
```



<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### Reg loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeTB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMWNiaU1nVEU5QlJFbE9SeUJNVDA5UVUxeHVJeU1qSUVsdGNHOXlkR2x1WnlCa2FXWm1aWEpsYm5ScFlXd2djbVZuZFd4aGRHOXllU0JzYjI5d2N5QW1JR1Y0ZEhKaFkzUWdZVzVqYUc5eVhHNWpiMjF0YjI1TWIyOXdSR2x5SUR3dElHaGxjbVVvWENJdUxpOWtZWFJoTDJ4dmIzQmZZVzVoYkhsemFYTmNJaWxjYm14dmIzQXVZV3hzSUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl0Ylc5dVRHOXZjRVJwY2l3Z1hDSnNiMjl3VTJOdmNtVmZZMmh5YjIxdmMybG5hSFF1ZEhOMlhDSXBLVnh1WVc1amFHOXlMbUZzYkNBOExTQW9aWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbUZzYkNrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG1Gc2JDd2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNWhiR3dnUEMwZ2NHbHVkR1Z5YzJWamRDaGhibU5vYjNJdVlXeHNXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkTENCaGRHRmpMbWR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVjYm14dmIzQXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjF0YjI1TWIyOXdSR2x5TENCY0ltTm9jbTl0YjNOcFoyaDBYM05qYjNKbFgyTnZiWEJzWlhoZmNtVm5YMlJVUVVkMmMwUk5VMDlmWkdsbVprTjFkRzltWmpBdU1sOVZVQzVpWldSd1pWd2lLU2xjYm1GdVkyaHZjaTUxY0NBOExTQW9aWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMblZ3S1NsY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l1ZFhBc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdWRYQWdQQzBnY0dsdWRHVnljMlZqZENoaGJtTm9iM0l1ZFhCYmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMHNJR0YwWVdNdVozSmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFNsY2JseHViRzl2Y0M1dWJ5QThMU0JtY21WaFpDaG9aWEpsS0dOdmJXMXZia3h2YjNCRWFYSXNJRndpWTJoeWIyMXZjMmxuYUhSZmMyTnZjbVZmWTI5dGNHeGxlRjl5WldkZlpGUkJSM1p6UkUxVFQxOWthV1ptUTNWMGIyWm1NQzR5WDA1UExtSmxaSEJsWENJcEtWeHVZVzVqYUc5eUxtNXZJRHd0SUNobGVIUnlZV04wUVc1amFHOXlLR3h2YjNBdWJtOHBLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNXVieXdnWVhSaFl5NW5jaWxjYm1GdVkyaHZjaTV1YnlBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNXViMXR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1WEc1c2IyOXdMblZ3Ym04Z1BDMGdZbWx1WkY5eWIzZHpLR3h2YjNBdWRYQXNJR3h2YjNBdWJtOHBYRzVoYm1Ob2IzSXVkWEJ1YnlBOExTQW9aWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMblZ3Ym04cEtWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1MWNHNXZMQ0JoZEdGakxtZHlLVnh1WVc1amFHOXlMblZ3Ym04Z1BDMGdjR2x1ZEdWeWMyVmpkQ2hoYm1Ob2IzSXVkWEJ1YjF0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0hNcFhTd2dZWFJoWXk1bmNsdHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWxkS1Z4dVhHNXNiMjl3TG1SdmQyNGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyMXRiMjVNYjI5d1JHbHlMQ0JjSW1Ob2NtOXRiM05wWjJoMFgzTmpiM0psWDJOdmJYQnNaWGhmY21WblgyUlVRVWQyYzBSTlUwOWZaR2xtWmtOMWRHOW1aakF1TWw5RVQxZE9MbUpsWkhCbFhDSXBLVnh1WVc1amFHOXlMbVJ2ZDI0Z1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzVrYjNkdUtTbGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVpHOTNiaXdnWVhSaFl5NW5jaWxjYm1GdVkyaHZjaTVrYjNkdUlEd3RJSEJwYm5SbGNuTmxZM1FvWVc1amFHOXlMbVJ2ZDI1YmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMHNJR0YwWVdNdVozSmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFNsY2JseHVJeTB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMWNiaU1nVWxWT1RrbE9SeUJNVDB4QlhHNGpJRlZRWEc1c2IyeGhSR2x5SUR3dElHaGxjbVVvWTI5dGJXOXVURzl2Y0VScGNpd2dYQ0pNVDB4QlhDSXBYRzVrYVhJdVkzSmxZWFJsS0d4dmJHRkVhWElzSUhOb2IzZFhZWEp1YVc1bmN5QTlJRVpCVEZORkxDQnlaV04xY25OcGRtVWdQU0JVVWxWRktWeHVYRzVjYm01aGJXVWdQQzBnWENKamFISnZiVzl6YVdkb2RGOXpZMjl5WlY5amIyMXdiR1Y0WDNKbFoxOWtWRUZIZG5ORVRWTlBYMlJwWm1aRGRYUnZabVl3TGpKY0lseHVjbVZ6ZFd4MElEd3RJSEoxYmt4UFRFRW9ZVzVqYUc5eUxuVndMQ0JoYm1Ob2IzSXVZV3hzTENCc2IyeGhSRUlwWEc1MFlpQThMU0JoYzE5MGFXSmliR1VvY21WemRXeDBLVnh1Wm5keWFYUmxLSFJpTENCb1pYSmxLR3h2YkdGRWFYSXNJSEJoYzNSbE1DaGNJa3hQVEVGZlhDSXNJRzVoYldVc0lGd2lWVkJmUVZSQlF5NTBjM1pjSWlrcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVhHNGpJRTVQWEc1eVpYTjFiSFFnUEMwZ2NuVnVURTlNUVNoaGJtTm9iM0l1Ym04c0lHRnVZMmh2Y2k1aGJHd3NJR3h2YkdGRVFpbGNiblJpSUR3dElHRnpYM1JwWW1Kc1pTaHlaWE4xYkhRcFhHNW1kM0pwZEdVb2RHSXNJR2hsY21Vb2JHOXNZVVJwY2l3Z2NHRnpkR1V3S0Z3aVRFOU1RVjljSWl3Z2JtRnRaU3dnWENKT1QxOUJWRUZETG5SemRsd2lLU2tzSUhObGNDQTlJRndpWEZ4MFhDSXBYRzVjYmlNZ1ZWQk9UMXh1Y21WemRXeDBJRHd0SUhKMWJreFBURUVvWVc1amFHOXlMblZ3Ym04c0lHRnVZMmh2Y2k1aGJHd3NJR3h2YkdGRVFpbGNiblJpSUR3dElHRnpYM1JwWW1Kc1pTaHlaWE4xYkhRcFhHNW1kM0pwZEdVb2RHSXNJR2hsY21Vb2JHOXNZVVJwY2l3Z2NHRnpkR1V3S0Z3aVRFOU1RVjljSWl3Z2JtRnRaU3dnWENKVlVFNVBYMEZVUVVNdWRITjJYQ0lwS1N3Z2MyVndJRDBnWENKY1hIUmNJaWxjYmx4dUl5QkVUMWRPWEc1eVpYTjFiSFFnUEMwZ2NuVnVURTlNUVNoaGJtTm9iM0l1Wkc5M2Jpd2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJZ1BDMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNibVozY21sMFpTaDBZaXdnYUdWeVpTaHNiMnhoUkdseUxDQndZWE4wWlRBb1hDSk1UMHhCWDF3aUxDQnVZVzFsTENCY0lrUlBWMDVmUVZSQlF5NTBjM1pjSWlrcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVhHNWNiaU1qSXlCV2FYTjFZV3hwZW1sdVp5QndMWFpoYkhWbElHRnVaQ0JQVWx4dVlXeHdhR0VnUEMwZ01DNHdOVnh1ZEdJdWRYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoc2IyeGhSR2x5TENCd1lYTjBaVEFvWENKTVQweEJYMXdpTENCdVlXMWxMQ0JjSWxWUVgwRlVRVU11ZEhOMlhDSXBLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2RHRnlaMlYwSUQwZ2RHOTFjSEJsY2loaGJuUnBZbTlrZVNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NWWmhiSFZsVEc5bklEMGdMV3h2WnpJb2NWWmhiSFZsS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbmNtOTFjQ0E5SUZ3aVZWQmNJaWtnSlQ0bFhHNGdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGd2laVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRndpS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaHhWbUZzZFdVZ1BDQmhiSEJvWVNrZ0pUNGxJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNTBZaTV1YnlBOExTQm1jbVZoWkNob1pYSmxLR3h2YkdGRWFYSXNJSEJoYzNSbE1DaGNJa3hQVEVGZlhDSXNJRzVoYldVc0lGd2lUazlmUVZSQlF5NTBjM1pjSWlrcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J4Vm1Gc2RXVk1iMmNnUFNBdGJHOW5NaWh4Vm1Gc2RXVXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2R5YjNWd0lEMGdYQ0pPVDF3aUtTQWxQaVZjYmlBZ1ptbHNkR1Z5S0hOMGNsOTBiMTlzYjNkbGNpaGpaV3hzVkhsd1pTa2dQVDBnWENKbGJXSnllVzl1YVdNZ2MzUmxiU0JqWld4c1hDSXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlVZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGdJSE5zYVdObFgyMXBiaWh0WldGdVVtNXJMQ0IzYVhSb1gzUnBaWE1nUFNCR1FVeFRSU2xjYmx4dWRHSXVkWEJ1YnlBOExTQm1jbVZoWkNob1pYSmxLR3h2YkdGRWFYSXNJSEJoYzNSbE1DaGNJa3hQVEVGZlhDSXNJRzVoYldVc0lGd2lWVkJPVDE5QlZFRkRMblJ6ZGx3aUtTa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGV1lXeDFaVXh2WnlBOUlDMXNiMmN4TUNoeFZtRnNkV1VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkeWIzVndJRDBnWENKVlVDOU9UMXdpS1NBbFBpVmNiaUFnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYQ0psYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWENJcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVVnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNibHh1Wm5keWFYUmxLSFJpTG5Wd2JtOGdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWd5TkN3Z01UWXNJREl3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBMExDQXlOU3dnTlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ055d2dPQ3dnT1N3Z01UQXNJREV4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBeE1pd2dNVE1zSURFMEtTa3NJR2hsY21Vb2JHOXNZVVJwY2l3Z2NHRnpkR1V3S0Z3aVRFOU1RVjljSWl3Z2JtRnRaU3dnWENKVlVFNVBYMEZVUVVOZmNIVmlMblJ6ZGx3aUtTa3NJSE5sY0NBOUlGd2lYRngwWENJcFhHNWNiblJpTG1SdmQyNGdQQzBnWm5KbFlXUW9hR1Z5WlNoc2IyeGhSR2x5TENCd1lYTjBaVEFvWENKTVQweEJYMXdpTENCdVlXMWxMQ0JjSWtSUFYwNWZRVlJCUXk1MGMzWmNJaWtwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnhWbUZzZFdWTWIyY2dQU0F0Ykc5bk1UQW9jVlpoYkhWbEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5jbTkxY0NBOUlGd2lSRTlYVGx3aUtTQWxQaVZjYmlBZ1ptbHNkR1Z5S0hOMGNsOTBiMTlzYjNkbGNpaGpaV3hzVkhsd1pTa2dQVDBnWENKbGJXSnllVzl1YVdNZ2MzUmxiU0JqWld4c1hDSXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlVZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGdJSE5zYVdObFgyMXBiaWh0WldGdVVtNXJMQ0IzYVhSb1gzUnBaWE1nUFNCR1FVeFRSU2xjYm1aM2NtbDBaU2gwWWk1a2IzZHVJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR01vTWpRc0lERTJMQ0F5TUN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ05Dd2dNalVzSURVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lEY3NJRGdzSURrc0lERXdMQ0F4TVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ01USXNJREV6TENBeE5Da3BMQ0JvWlhKbEtHeHZiR0ZFYVhJc0lIQmhjM1JsTUNoY0lreFBURUZmWENJc0lHNWhiV1VzSUZ3aVJFOVhUbDlCVkVGRFgxOXdkV0l1ZEhOMlhDSXBLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNibHh1WEc1MFpXMXdMblZ3Ym04Z1BDMGdkR0l1ZFhCdWJ5QWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHOWtaSE5TWVhScGJ5d2djVlpoYkhWbFRHOW5MQ0JuY205MWNDbGNiblJsYlhBdVpHOTNiaUE4TFNCMFlpNWtiM2R1SUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYjJSa2MxSmhkR2x2TENCeFZtRnNkV1ZNYjJjc0lHZHliM1Z3S1Z4dVhHNTBaVzF3SUR3dElHSnBibVJmY205M2N5aDBaVzF3TG5Wd2JtOHNJSFJsYlhBdVpHOTNiaWxjYmx4dWIzSmtaWElnUEMwZ1l5Z29kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY0lsVlFMMDVQWENJcElDVStKU0JoY25KaGJtZGxLR1JsYzJNb2IyUmtjMUpoZEdsdktTa3BKSFJoY21kbGRDeGNiaUFnSUNBZ0lDQWdJQ0FnS0hSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdYQ0pFVDFkT1hDSXBJQ1UrSlNCaGNuSmhibWRsS0dSbGMyTW9iMlJrYzFKaGRHbHZLU2twSkhSaGNtZGxkQ2xjYm05eVpHVnlJRHd0SUhWdWFYRjFaU2h2Y21SbGNpbGNibHh1ZEdWdGNDUjBZWEpuWlhRZ1BDMGdabUZqZEc5eUtIUmxiWEFrZEdGeVoyVjBMQ0JzWlhabGJITWdQU0J5WlhZb2IzSmtaWElwS1Z4dWRHVnRjQ1JuY205MWNDQThMU0JtWVdOMGIzSW9kR1Z0Y0NSbmNtOTFjQ3dnYkdWMlpXeHpJRDBnWXloY0lsVlFMMDVQWENJc0lGd2lSRTlYVGx3aUtTbGNibHh1ZEdGeVoyVjBUR2x6ZENBOExTQmpLRndpVUU5TVVqSkJYQ0lzSUZ3aVExUlNPVndpTENCY0lrRlNValJjSWl3Z1hDSkZURXd5WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSk5SVVF4WENJc0lGd2lUVVZFTVRKY0lpd2dYQ0pVUWxCY0lpd2dYQ0pVUVVZeFhDSXNJRndpVkVGR01sd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpUlZOU1VrSmNJaXdnWENKTFRFWTBYQ0lzSUZ3aVRrRk9UMGRjSWl3Z1hDSlFUMVUxUmpGY0lpd2dYQ0pUVDFneVhDSXNJRndpVFZsRFRsd2lMQ0JjSWtkQlUxUkJORndpTENCY0lsTlVRVlF6WENJc0lGd2lSVEpHTVZ3aUxDQmNJbGxaTVZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lVRE13TUZ3aUxDQmNJa1JRV1RNd1hDSXNJRndpVWtKQ1VEVmNJaXdnWENKTFJFMHlRbHdpTENCY0lrdEVUVFJDWENJc0lGd2lTMFJOTmtKY0lpd2dYQ0pVUlZReFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0pEUWxnM1hDSXNJRndpVWtsT1J6RkNYQ0lzSUZ3aVVrNUdNbHdpTENCY0lrVmFTREpjSWl3Z1hDSlRWVm94TWx3aUxDQmNJa3BCVWtsRU1sd2lMQ0JjSWsxVVJqSmNJaXdnWENKUVNFWXhPVndpS1Z4dVhHNTBaVzF3SUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvZEdGeVoyVjBJQ1ZwYmlVZ2RHRnlaMlYwVEdsemRDbGNiblJsYlhBa2RHRnlaMlYwSUR3dElHWmhZM1J2Y2loMFpXMXdKSFJoY21kbGRDd2diR1YyWld4eklEMGdjbVYyS0hSaGNtZGxkRXhwYzNRcEtWeHVYRzVjYm5GV1lXeDFaVXh2WjAxaGVDQThMU0ExTUZ4dWRHVnRjRElnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2h4Vm1Gc2RXVk1iMmNnUFNCdGFXNG9jVlpoYkhWbFRHOW5MQ0J4Vm1Gc2RXVk1iMmROWVhncEtWeHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdNaXdnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUhSaGNtZGxkQ3dnWm1sc2JDQTlJRzlrWkhOU1lYUnBieXdnYzJsNlpTQTlJSEZXWVd4MVpVeHZaeWtwSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2h6YUdGd1pTQTlJREl4TENBZ0lDQWdJQ0FnSXlCRmJuTjFjbVZ6SUdFZ2NHOXBiblFnZDJsMGFDQmhiaUJ2ZFhSc2FXNWxYRzRnSUNBZ0lDQWdJQ0FnSUNBZ2MzUnliMnRsSUQwZ01TcHdkRlJ2VFUwZ0lDQWdJQ0FqSUV4cGJtVWdkMmxrZEdnZ1ptOXlJSFJvWlNCaWIzSmtaWEpjYmlBZ0tTQXJJSFJvWlcxbFgySjNLQ2tnS3lCY2JpQWdjMk5oYkdWZmMybDZaVjlqYjI1MGFXNTFiM1Z6S0hKaGJtZGxJRDBnWXlnd0xqVXNJRElwS1NBcklDQWpJRk5sZENCdGFXNGdZVzVrSUcxaGVDQndiMmx1ZENCemFYcGxjeUJvWlhKbFhHNGdJSE5qWVd4bFgyWnBiR3hmWjNKaFpHbGxiblFvYkc5M0lEMGdYQ0ozYUdsMFpWd2lMQ0JvYVdkb0lEMGdYQ0lqUTBJek16TkJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x0YVhSeklEMGdZeWd4TENBektTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmIySWdQU0J6WTJGc1pYTTZPbk54ZFdsemFDd2dJeUJFWldacGJtVWdaM0poWkdsbGJuUWdZMjlzYjNKelhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjNWcFpHVWdQU0JuZFdsa1pWOWpiMnh2Y21KaGNpaGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhjbmRwWkhSb0lEMGdNUzQxTHpVdU1EZ3NJQ0FqSUVGa2FuVnpkQ0IzYVdSMGFDQnZaaUIwYUdVZ1kyOXNiM0lnWW1GeVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlYSm9aV2xuYUhRZ1BTQXhOUzgxTGpBNElDQWdJeUJCWkdwMWMzUWdhR1ZwWjJoMElHOW1JSFJvWlNCamIyeHZjaUJpWVhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FwWEc0Z0lDa2dLeUJjYmlBZ2JHRmljeWg0SUQwZ1RsVk1UQ3dnZVNBOUlFNVZURXdwSUNBclhHNGdJSFJvWlcxbEtGeHVJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRdWVDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lDQWdJQ0FnSXlCU2IzUmhkR1VnZUMxaGVHbHpJR3hoWW1Wc2N5QTBOU0JrWldkeVpXVnpYRzRnSUNBZ0lDQm9hblZ6ZENBOUlERXNJQ0FnSUNBZ0lDTWdRV1JxZFhOMElHaHZjbWw2YjI1MFlXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUlDQWdJQ0FnZG1wMWMzUWdQU0F4SUNBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0IyWlhKMGFXTmhiQ0JxZFhOMGFXWnBZMkYwYVc5dVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjSW5SeVlXNXpjR0Z5Wlc1MFhDSXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2xjYmx4dVptbG5SR2x5SUR3dElHaGxjbVVvWENJdUxpOW1hV2QxY21VdmJHOXZjRjloYm1Gc2VYTnBjMXdpS1Z4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0pNVDB4Qlgxd2lMQ0J1WVcxbEtWeHVkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TlNrcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzQ1S1NwdGJWUnZTVzVqYUZ4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIyBMT0FESU5HIExPT1BTXG4jIyMgSW1wb3J0aW5nIGRpZmZlcmVudGlhbCByZWd1bGF0b3J5IGxvb3BzICYgZXh0cmFjdCBhbmNob3JcbmNvbW1vbkxvb3BEaXIgPC0gaGVyZShcIi4uL2RhdGEvbG9vcF9hbmFseXNpc1wiKVxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcImxvb3BTY29yZV9jaHJvbW9zaWdodC50c3ZcIikpXG5hbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKVxuYW5jaG9yLmFsbCA8LSBwaW50ZXJzZWN0KGFuY2hvci5hbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsIFwiY2hyb21vc2lnaHRfc2NvcmVfY29tcGxleF9yZWdfZFRBR3ZzRE1TT19kaWZmQ3V0b2ZmMC4yX1VQLmJlZHBlXCIpKVxuYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cCwgYXRhYy5ncilcbmFuY2hvci51cCA8LSBwaW50ZXJzZWN0KGFuY2hvci51cFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgXCJjaHJvbW9zaWdodF9zY29yZV9jb21wbGV4X3JlZ19kVEFHdnNETVNPX2RpZmZDdXRvZmYwLjJfTk8uYmVkcGVcIikpXG5hbmNob3Iubm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vLCBhdGFjLmdyKVxuYW5jaG9yLm5vIDwtIHBpbnRlcnNlY3QoYW5jaG9yLm5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AudXBubyA8LSBiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubylcbmFuY2hvci51cG5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXBubykpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwbm8sIGF0YWMuZ3IpXG5hbmNob3IudXBubyA8LSBwaW50ZXJzZWN0KGFuY2hvci51cG5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsIFwiY2hyb21vc2lnaHRfc2NvcmVfY29tcGxleF9yZWdfZFRBR3ZzRE1TT19kaWZmQ3V0b2ZmMC4yX0RPV04uYmVkcGVcIikpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBhdGFjLmdyKVxuYW5jaG9yLmRvd24gPC0gcGludGVyc2VjdChhbmNob3IuZG93bltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG4jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIyBSVU5OSU5HIExPTEFcbiMgVVBcbmxvbGFEaXIgPC0gaGVyZShjb21tb25Mb29wRGlyLCBcIkxPTEFcIilcbmRpci5jcmVhdGUobG9sYURpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpXG5cblxubmFtZSA8LSBcImNocm9tb3NpZ2h0X3Njb3JlX2NvbXBsZXhfcmVnX2RUQUd2c0RNU09fZGlmZkN1dG9mZjAuMlwiXG5yZXN1bHQgPC0gcnVuTE9MQShhbmNob3IudXAsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiIDwtIGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgcGFzdGUwKFwiTE9MQV9cIiwgbmFtZSwgXCJVUF9BVEFDLnRzdlwiKSksIHNlcCA9IFwiXFx0XCIpXG5cbiMgTk9cbnJlc3VsdCA8LSBydW5MT0xBKGFuY2hvci5ubywgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPC0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBwYXN0ZTAoXCJMT0xBX1wiLCBuYW1lLCBcIk5PX0FUQUMudHN2XCIpKSwgc2VwID0gXCJcXHRcIilcblxuIyBVUE5PXG5yZXN1bHQgPC0gcnVuTE9MQShhbmNob3IudXBubywgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPC0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBwYXN0ZTAoXCJMT0xBX1wiLCBuYW1lLCBcIlVQTk9fQVRBQy50c3ZcIikpLCBzZXAgPSBcIlxcdFwiKVxuXG4jIERPV05cbnJlc3VsdCA8LSBydW5MT0xBKGFuY2hvci5kb3duLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA8LSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIHBhc3RlMChcIkxPTEFfXCIsIG5hbWUsIFwiRE9XTl9BVEFDLnRzdlwiKSksIHNlcCA9IFwiXFx0XCIpXG5cblxuIyMjIFZpc3VhbGl6aW5nIHAtdmFsdWUgYW5kIE9SXG5hbHBoYSA8LSAwLjA1XG50Yi51cCA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIHBhc3RlMChcIkxPTEFfXCIsIG5hbWUsIFwiVVBfQVRBQy50c3ZcIikpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXCJVUFwiKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXCJlbWJyeW9uaWMgc3RlbSBjZWxsXCIpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgcGFzdGUwKFwiTE9MQV9cIiwgbmFtZSwgXCJOT19BVEFDLnRzdlwiKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBcIk5PXCIpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcImVtYnJ5b25pYyBzdGVtIGNlbGxcIikgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50Yi51cG5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgcGFzdGUwKFwiTE9MQV9cIiwgbmFtZSwgXCJVUE5PX0FUQUMudHN2XCIpKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4gICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzEwKHFWYWx1ZSksXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBcIlVQL05PXCIpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcImVtYnJ5b25pYyBzdGVtIGNlbGxcIikgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG5md3JpdGUodGIudXBubyAlPiUgZHBseXI6OnNlbGVjdChjKDI0LCAxNiwgMjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDI1LCA1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCA4LCA5LCAxMCwgMTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCAxMywgMTQpKSwgaGVyZShsb2xhRGlyLCBwYXN0ZTAoXCJMT0xBX1wiLCBuYW1lLCBcIlVQTk9fQVRBQ19wdWIudHN2XCIpKSwgc2VwID0gXCJcXHRcIilcblxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIHBhc3RlMChcIkxPTEFfXCIsIG5hbWUsIFwiRE9XTl9BVEFDLnRzdlwiKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXCJET1dOXCIpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcImVtYnJ5b25pYyBzdGVtIGNlbGxcIikgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuZndyaXRlKHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QoYygyNCwgMTYsIDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAyNSwgNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgOCwgOSwgMTAsIDExLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgMTMsIDE0KSksIGhlcmUobG9sYURpciwgcGFzdGUwKFwiTE9MQV9cIiwgbmFtZSwgXCJET1dOX0FUQUNfX3B1Yi50c3ZcIikpLCBzZXAgPSBcIlxcdFwiKVxuXG5cbnRlbXAudXBubyA8LSB0Yi51cG5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxudGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG5cbnRlbXAgPC0gYmluZF9yb3dzKHRlbXAudXBubywgdGVtcC5kb3duKVxuXG5vcmRlciA8LSBjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFwiVVAvTk9cIikgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0LFxuICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcIkRPV05cIikgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0KVxub3JkZXIgPC0gdW5pcXVlKG9yZGVyKVxuXG50ZW1wJHRhcmdldCA8LSBmYWN0b3IodGVtcCR0YXJnZXQsIGxldmVscyA9IHJldihvcmRlcikpXG50ZW1wJGdyb3VwIDwtIGZhY3Rvcih0ZW1wJGdyb3VwLCBsZXZlbHMgPSBjKFwiVVAvTk9cIiwgXCJET1dOXCIpKVxuXG50YXJnZXRMaXN0IDwtIGMoXCJQT0xSMkFcIiwgXCJDVFI5XCIsIFwiQVJSNFwiLCBcIkVMTDJcIixcbiAgICAgICAgICAgICAgICBcIk1FRDFcIiwgXCJNRUQxMlwiLCBcIlRCUFwiLCBcIlRBRjFcIiwgXCJUQUYyXCIsXG4gICAgICAgICAgICAgICAgXCJFU1JSQlwiLCBcIktMRjRcIiwgXCJOQU5PR1wiLCBcIlBPVTVGMVwiLCBcIlNPWDJcIiwgXCJNWUNOXCIsIFwiR0FTVEE0XCIsIFwiU1RBVDNcIiwgXCJFMkYxXCIsIFwiWVkxXCIsXG4gICAgICAgICAgICAgICAgXCJQMzAwXCIsIFwiRFBZMzBcIiwgXCJSQkJQNVwiLCBcIktETTJCXCIsIFwiS0RNNEJcIiwgXCJLRE02QlwiLCBcIlRFVDFcIixcbiAgICAgICAgICAgICAgICBcIkNCWDdcIiwgXCJSSU5HMUJcIiwgXCJSTkYyXCIsIFwiRVpIMlwiLCBcIlNVWjEyXCIsIFwiSkFSSUQyXCIsIFwiTVRGMlwiLCBcIlBIRjE5XCIpXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcih0YXJnZXQgJWluJSB0YXJnZXRMaXN0KVxudGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYodGFyZ2V0TGlzdCkpXG5cblxucVZhbHVlTG9nTWF4IDwtIDUwXG50ZW1wMiA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKHFWYWx1ZUxvZyA9IG1pbihxVmFsdWVMb2csIHFWYWx1ZUxvZ01heCkpXG5cbnAgPC0gZ2dwbG90KHRlbXAyLCBhZXMoeCA9IGdyb3VwLCB5ID0gdGFyZ2V0LCBmaWxsID0gb2Rkc1JhdGlvLCBzaXplID0gcVZhbHVlTG9nKSkgK1xuICBnZW9tX3BvaW50KHNoYXBlID0gMjEsICAgICAgICAjIEVuc3VyZXMgYSBwb2ludCB3aXRoIGFuIG91dGxpbmVcbiAgICAgICAgICAgICBzdHJva2UgPSAxKnB0VG9NTSAgICAgICMgTGluZSB3aWR0aCBmb3IgdGhlIGJvcmRlclxuICApICsgdGhlbWVfYncoKSArIFxuICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuNSwgMikpICsgICMgU2V0IG1pbiBhbmQgbWF4IHBvaW50IHNpemVzIGhlcmVcbiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSBcIndoaXRlXCIsIGhpZ2ggPSBcIiNDQjMzM0FcIixcbiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEsIDMpLFxuICAgICAgICAgICAgICAgICAgICAgIG9vYiA9IHNjYWxlczo6c3F1aXNoLCAjIERlZmluZSBncmFkaWVudCBjb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgKSArIFxuICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXCIjMDAwMDAwXCJcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXCIjMDAwMDAwXCJcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXCIjMDAwMDAwXCIsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcInNxdWFyZVwiXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcIiMwMDAwMDBcIixcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFwic3F1YXJlXCJcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFwidHJhbnNwYXJlbnRcIiksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKVxuXG5maWdEaXIgPC0gaGVyZShcIi4uL2ZpZ3VyZS9sb29wX2FuYWx5c2lzXCIpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcIkxPTEFfXCIsIG5hbWUpXG53aWR0aCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjkpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIucG5nXCIpKSwgcmVzID0gNjAwLCB1bml0ID0gXCJpblwiLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiMgTE9BRElORyBMT09QU1xuIyMjIEltcG9ydGluZyBkaWZmZXJlbnRpYWwgcmVndWxhdG9yeSBsb29wcyAmIGV4dHJhY3QgYW5jaG9yXG5jb21tb25Mb29wRGlyIDwtIGhlcmUoXCIuLi9kYXRhL2xvb3BfYW5hbHlzaXNcIilcbmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgXCJsb29wU2NvcmVfY2hyb21vc2lnaHQudHN2XCIpKVxuYW5jaG9yLmFsbCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmFsbCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmFsbCwgYXRhYy5ncilcbmFuY2hvci5hbGwgPC0gcGludGVyc2VjdChhbmNob3IuYWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcImNocm9tb3NpZ2h0X3Njb3JlX2NvbXBsZXhfcmVnX2RUQUd2c0RNU09fZGlmZkN1dG9mZjAuMl9VUC5iZWRwZVwiKSlcbmFuY2hvci51cCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXAsIGF0YWMuZ3IpXG5hbmNob3IudXAgPC0gcGludGVyc2VjdChhbmNob3IudXBbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsIFwiY2hyb21vc2lnaHRfc2NvcmVfY29tcGxleF9yZWdfZFRBR3ZzRE1TT19kaWZmQ3V0b2ZmMC4yX05PLmJlZHBlXCIpKVxuYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ubywgYXRhYy5ncilcbmFuY2hvci5ubyA8LSBwaW50ZXJzZWN0KGFuY2hvci5ub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLnVwbm8gPC0gYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pXG5hbmNob3IudXBubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwbm8pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cG5vLCBhdGFjLmdyKVxuYW5jaG9yLnVwbm8gPC0gcGludGVyc2VjdChhbmNob3IudXBub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcImNocm9tb3NpZ2h0X3Njb3JlX2NvbXBsZXhfcmVnX2RUQUd2c0RNU09fZGlmZkN1dG9mZjAuMl9ET1dOLmJlZHBlXCIpKVxuYW5jaG9yLmRvd24gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgYXRhYy5ncilcbmFuY2hvci5kb3duIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmRvd25bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiMgUlVOTklORyBMT0xBXG4jIFVQXG5sb2xhRGlyIDwtIGhlcmUoY29tbW9uTG9vcERpciwgXCJMT0xBXCIpXG5kaXIuY3JlYXRlKGxvbGFEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKVxuXG5cbm5hbWUgPC0gXCJjaHJvbW9zaWdodF9zY29yZV9jb21wbGV4X3JlZ19kVEFHdnNETVNPX2RpZmZDdXRvZmYwLjJcIlxucmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLnVwLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA8LSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIHBhc3RlMChcIkxPTEFfXCIsIG5hbWUsIFwiVVBfQVRBQy50c3ZcIikpLCBzZXAgPSBcIlxcdFwiKVxuXG4jIE5PXG5yZXN1bHQgPC0gcnVuTE9MQShhbmNob3Iubm8sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiIDwtIGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgcGFzdGUwKFwiTE9MQV9cIiwgbmFtZSwgXCJOT19BVEFDLnRzdlwiKSksIHNlcCA9IFwiXFx0XCIpXG5cbiMgVVBOT1xucmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLnVwbm8sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiIDwtIGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgcGFzdGUwKFwiTE9MQV9cIiwgbmFtZSwgXCJVUE5PX0FUQUMudHN2XCIpKSwgc2VwID0gXCJcXHRcIilcblxuIyBET1dOXG5yZXN1bHQgPC0gcnVuTE9MQShhbmNob3IuZG93biwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPC0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBwYXN0ZTAoXCJMT0xBX1wiLCBuYW1lLCBcIkRPV05fQVRBQy50c3ZcIikpLCBzZXAgPSBcIlxcdFwiKVxuXG5cbiMjIyBWaXN1YWxpemluZyBwLXZhbHVlIGFuZCBPUlxuYWxwaGEgPC0gMC4wNVxudGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBwYXN0ZTAoXCJMT0xBX1wiLCBuYW1lLCBcIlVQX0FUQUMudHN2XCIpKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4gICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiAgICAgICAgICAgICAgICBncm91cCA9IFwiVVBcIikgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFwiZW1icnlvbmljIHN0ZW0gY2VsbFwiKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIHBhc3RlMChcIkxPTEFfXCIsIG5hbWUsIFwiTk9fQVRBQy50c3ZcIikpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXCJOT1wiKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXCJlbWJyeW9uaWMgc3RlbSBjZWxsXCIpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGIudXBubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIHBhc3RlMChcIkxPTEFfXCIsIG5hbWUsIFwiVVBOT19BVEFDLnRzdlwiKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXCJVUC9OT1wiKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXCJlbWJyeW9uaWMgc3RlbSBjZWxsXCIpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxuZndyaXRlKHRiLnVwbm8gJT4lIGRwbHlyOjpzZWxlY3QoYygyNCwgMTYsIDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAyNSwgNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgOCwgOSwgMTAsIDExLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgMTMsIDE0KSksIGhlcmUobG9sYURpciwgcGFzdGUwKFwiTE9MQV9cIiwgbmFtZSwgXCJVUE5PX0FUQUNfcHViLnRzdlwiKSksIHNlcCA9IFwiXFx0XCIpXG5cbnRiLmRvd24gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBwYXN0ZTAoXCJMT0xBX1wiLCBuYW1lLCBcIkRPV05fQVRBQy50c3ZcIikpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMTAocVZhbHVlKSxcbiAgICAgICAgICAgICAgICBncm91cCA9IFwiRE9XTlwiKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXCJlbWJyeW9uaWMgc3RlbSBjZWxsXCIpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbmZ3cml0ZSh0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KGMoMjQsIDE2LCAyMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMjUsIDUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIDgsIDksIDEwLCAxMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDEzLCAxNCkpLCBoZXJlKGxvbGFEaXIsIHBhc3RlMChcIkxPTEFfXCIsIG5hbWUsIFwiRE9XTl9BVEFDX19wdWIudHN2XCIpKSwgc2VwID0gXCJcXHRcIilcblxuXG50ZW1wLnVwbm8gPC0gdGIudXBubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxuXG50ZW1wIDwtIGJpbmRfcm93cyh0ZW1wLnVwbm8sIHRlbXAuZG93bilcblxub3JkZXIgPC0gYygodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcIlVQL05PXCIpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCxcbiAgICAgICAgICAgKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXCJET1dOXCIpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldClcbm9yZGVyIDwtIHVuaXF1ZShvcmRlcilcblxudGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYob3JkZXIpKVxudGVtcCRncm91cCA8LSBmYWN0b3IodGVtcCRncm91cCwgbGV2ZWxzID0gYyhcIlVQL05PXCIsIFwiRE9XTlwiKSlcblxudGFyZ2V0TGlzdCA8LSBjKFwiUE9MUjJBXCIsIFwiQ1RSOVwiLCBcIkFSUjRcIiwgXCJFTEwyXCIsXG4gICAgICAgICAgICAgICAgXCJNRUQxXCIsIFwiTUVEMTJcIiwgXCJUQlBcIiwgXCJUQUYxXCIsIFwiVEFGMlwiLFxuICAgICAgICAgICAgICAgIFwiRVNSUkJcIiwgXCJLTEY0XCIsIFwiTkFOT0dcIiwgXCJQT1U1RjFcIiwgXCJTT1gyXCIsIFwiTVlDTlwiLCBcIkdBU1RBNFwiLCBcIlNUQVQzXCIsIFwiRTJGMVwiLCBcIllZMVwiLFxuICAgICAgICAgICAgICAgIFwiUDMwMFwiLCBcIkRQWTMwXCIsIFwiUkJCUDVcIiwgXCJLRE0yQlwiLCBcIktETTRCXCIsIFwiS0RNNkJcIiwgXCJURVQxXCIsXG4gICAgICAgICAgICAgICAgXCJDQlg3XCIsIFwiUklORzFCXCIsIFwiUk5GMlwiLCBcIkVaSDJcIiwgXCJTVVoxMlwiLCBcIkpBUklEMlwiLCBcIk1URjJcIiwgXCJQSEYxOVwiKVxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIodGFyZ2V0ICVpbiUgdGFyZ2V0TGlzdClcbnRlbXAkdGFyZ2V0IDwtIGZhY3Rvcih0ZW1wJHRhcmdldCwgbGV2ZWxzID0gcmV2KHRhcmdldExpc3QpKVxuXG5cbnFWYWx1ZUxvZ01heCA8LSA1MFxudGVtcDIgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShxVmFsdWVMb2cgPSBtaW4ocVZhbHVlTG9nLCBxVmFsdWVMb2dNYXgpKVxuXG5wIDwtIGdncGxvdCh0ZW1wMiwgYWVzKHggPSBncm91cCwgeSA9IHRhcmdldCwgZmlsbCA9IG9kZHNSYXRpbywgc2l6ZSA9IHFWYWx1ZUxvZykpICtcbiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lXG4gICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0gICAgICAjIExpbmUgd2lkdGggZm9yIHRoZSBib3JkZXJcbiAgKSArIHRoZW1lX2J3KCkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjUsIDIpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlXG4gIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gXCJ3aGl0ZVwiLCBoaWdoID0gXCIjQ0IzMzNBXCIsXG4gICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLCAzKSxcbiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFwiIzAwMDAwMFwiXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFwiIzAwMDAwMFwiXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFwiIzAwMDAwMFwiLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXCJzcXVhcmVcIlxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXCIjMDAwMDAwXCIsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcInNxdWFyZVwiXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcInRyYW5zcGFyZW50XCIpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlnRGlyIDwtIGhlcmUoXCIuLi9maWd1cmUvbG9vcF9hbmFseXNpc1wiKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXCJMT0xBX1wiLCBuYW1lKVxud2lkdGggPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS45KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIHJlcyA9IDYwMCwgdW5pdCA9IFwiaW5cIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgIn0= -->

```r
#-------------------------------------------------------------------------------
# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
commonLoopDir <- here("../data/loop_analysis")
loop.all <- fread(here(commonLoopDir, "loopScore_chromosight.tsv"))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.up <- fread(here(commonLoopDir, "chromosight_score_complex_reg_dTAGvsDMSO_diffCutoff0.2_UP.bedpe"))
anchor.up <- (extractAnchor(loop.up))
overlaps <- findOverlaps(anchor.up, atac.gr)
anchor.up <- pintersect(anchor.up[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.no <- fread(here(commonLoopDir, "chromosight_score_complex_reg_dTAGvsDMSO_diffCutoff0.2_NO.bedpe"))
anchor.no <- (extractAnchor(loop.no))
overlaps <- findOverlaps(anchor.no, atac.gr)
anchor.no <- pintersect(anchor.no[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.upno <- bind_rows(loop.up, loop.no)
anchor.upno <- (extractAnchor(loop.upno))
overlaps <- findOverlaps(anchor.upno, atac.gr)
anchor.upno <- pintersect(anchor.upno[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.down <- fread(here(commonLoopDir, "chromosight_score_complex_reg_dTAGvsDMSO_diffCutoff0.2_DOWN.bedpe"))
anchor.down <- (extractAnchor(loop.down))
overlaps <- findOverlaps(anchor.down, atac.gr)
anchor.down <- pintersect(anchor.down[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

#-------------------------------------------------------------------------------
# RUNNING LOLA
# UP
lolaDir <- here(commonLoopDir, "LOLA")
dir.create(lolaDir, showWarnings = FALSE, recursive = TRUE)


name <- "chromosight_score_complex_reg_dTAGvsDMSO_diffCutoff0.2"
result <- runLOLA(anchor.up, anchor.all, lolaDB)
tb <- as_tibble(result)
fwrite(tb, here(lolaDir, paste0("LOLA_", name, "UP_ATAC.tsv")), sep = "\t")

# NO
result <- runLOLA(anchor.no, anchor.all, lolaDB)
tb <- as_tibble(result)
fwrite(tb, here(lolaDir, paste0("LOLA_", name, "NO_ATAC.tsv")), sep = "\t")

# UPNO
result <- runLOLA(anchor.upno, anchor.all, lolaDB)
tb <- as_tibble(result)
fwrite(tb, here(lolaDir, paste0("LOLA_", name, "UPNO_ATAC.tsv")), sep = "\t")

# DOWN
result <- runLOLA(anchor.down, anchor.all, lolaDB)
tb <- as_tibble(result)
fwrite(tb, here(lolaDir, paste0("LOLA_", name, "DOWN_ATAC.tsv")), sep = "\t")


### Visualizing p-value and OR
alpha <- 0.05
tb.up <- fread(here(lolaDir, paste0("LOLA_", name, "UP_ATAC.tsv"))) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = "UP") %>%
  filter(str_to_lower(cellType) == "embryonic stem cell") %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, paste0("LOLA_", name, "NO_ATAC.tsv"))) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = "NO") %>%
  filter(str_to_lower(cellType) == "embryonic stem cell") %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

tb.upno <- fread(here(lolaDir, paste0("LOLA_", name, "UPNO_ATAC.tsv"))) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log10(qValue),
                group = "UP/NO") %>%
  filter(str_to_lower(cellType) == "embryonic stem cell") %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

fwrite(tb.upno %>% dplyr::select(c(24, 16, 20,
                                   4, 25, 5,
                                   7, 8, 9, 10, 11,
                                   12, 13, 14)), here(lolaDir, paste0("LOLA_", name, "UPNO_ATAC_pub.tsv")), sep = "\t")

tb.down <- fread(here(lolaDir, paste0("LOLA_", name, "DOWN_ATAC.tsv"))) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log10(qValue),
                group = "DOWN") %>%
  filter(str_to_lower(cellType) == "embryonic stem cell") %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
fwrite(tb.down %>% dplyr::select(c(24, 16, 20,
                                   4, 25, 5,
                                   7, 8, 9, 10, 11,
                                   12, 13, 14)), here(lolaDir, paste0("LOLA_", name, "DOWN_ATAC__pub.tsv")), sep = "\t")


temp.upno <- tb.upno %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio, qValueLog, group)

temp <- bind_rows(temp.upno, temp.down)

order <- c((temp %>% dplyr::filter(group == "UP/NO") %>% arrange(desc(oddsRatio)))$target,
           (temp %>% dplyr::filter(group == "DOWN") %>% arrange(desc(oddsRatio)))$target)
order <- unique(order)

temp$target <- factor(temp$target, levels = rev(order))
temp$group <- factor(temp$group, levels = c("UP/NO", "DOWN"))

targetList <- c("POLR2A", "CTR9", "ARR4", "ELL2",
                "MED1", "MED12", "TBP", "TAF1", "TAF2",
                "ESRRB", "KLF4", "NANOG", "POU5F1", "SOX2", "MYCN", "GASTA4", "STAT3", "E2F1", "YY1",
                "P300", "DPY30", "RBBP5", "KDM2B", "KDM4B", "KDM6B", "TET1",
                "CBX7", "RING1B", "RNF2", "EZH2", "SUZ12", "JARID2", "MTF2", "PHF19")

temp <- temp %>% dplyr::filter(target %in% targetList)
temp$target <- factor(temp$target, levels = rev(targetList))


qValueLogMax <- 50
temp2 <- temp %>% dplyr::mutate(qValueLog = min(qValueLog, qValueLogMax))

p <- ggplot(temp2, aes(x = group, y = target, fill = oddsRatio, size = qValueLog)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = "white", high = "#CB333A",
                      limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = "#000000"
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = "#000000"
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = "#000000",
      size = lineThick*mmToLineUnit,
      lineend = "square"
    ),
    axis.ticks = element_line(
      color = "#000000",
      size = lineThick*mmToLineUnit,
      lineend = "square"
    ),
    panel.background = element_rect(fill = "transparent"),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

figDir <- here("../figure/loop_analysis")

fileName <- paste0("LOLA_", name)
width <- panelSize(1.5)*mmToInch
height <- panelSize(1.9)*mmToInch
png(here(figDir, paste0(fileName, ".png")), res = 600, unit = "in", height = height, width = width)
print(p)
dev.off()
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

```
null device 
          1 
```



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIuc3ZnXCIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5zdmdcIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuYGBgIn0= -->

```r
svglite(here(figDir, paste0(fileName, ".svg")),  height = height, width = width)
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgIn0= -->

```r
print(p)
dev.off()
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

```
null device 
          1 
```



<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### [FIG] Distance vs OOE plot per group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzUzYVdSMGFDQThMU0J3WVc1bGJGTnBlbVVvTWk0MUtTcHRiVlJ2U1c1amFGeHVhR1ZwWjJoMElEd3RJSEJoYm1Wc1UybDZaU2d4TGpjMUtTcHRiVlJ2U1c1amFGeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJRnh1SUNBZ0lISmxjeUE5SURZd01Dd2dkVzVwZEhNZ1BTQmNJbWx1WENJc0lIZHBaSFJvSUQwZ2QybGtkR2dzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxuXG53aWR0aCA8LSBwYW5lbFNpemUoMi41KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjc1KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIFxuICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcImluXCIsIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodClcbnByaW50KHApXG5kZXYub2ZmKClcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG53aWR0aCA8LSBwYW5lbFNpemUoMi41KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjc1KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIFxuICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcImluXCIsIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodClcbnByaW50KHApXG5kZXYub2ZmKClcblxuYGBgIn0= -->

```r

width <- panelSize(2.5)*mmToInch
height <- panelSize(1.75)*mmToInch
png(here(figDir, paste0(fileName, ".png")), 
    res = 600, units = "in", width = width, height = height)
print(p)
dev.off()

```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

```
null device 
          1 
```



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENCY2JpQWdJQ0FnSUNBZ2QybGtkR2dnUFNCM2FXUjBhQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBLVnh1Y0hKcGJuUW9jQ2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIuc3ZnXCIpKSwgXG4gICAgICAgIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodClcbnByaW50KHApXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5zdmdcIikpLCBcbiAgICAgICAgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KVxucHJpbnQocClcbmBgYCJ9 -->

```r
svglite(here(figDir, paste0(fileName, ".svg")), 
        width = width, height = height)
print(p)
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaR1YyTG05bVppZ3BYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZGV2Lm9mZigpXG5gYGAifQ== -->

```r
dev.off()
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

```
null device 
          1 
```



<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## EXPLORATORY
### Chromosight scores
#### Scatterplots

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dVptTkRkWFJ2Wm1ZZ1BDMGdNQzQxWEc1Y2JtTnZiVzF2Ymt4dmIzQkVhWElnUEMwZ2FHVnlaU2hjSWk0dUwyUmhkR0V2Ykc5dmNGOWhibUZzZVhOcGMxd2lLVnh1WkdsbVprUnBjaUE4TFNCb1pYSmxLRndpTGk0dlpHRjBZUzlTVGtGZlpHbG1abHdpS1Z4dWJtRnRaU0E4TFNCY0ltTm9jbTl0YjNOcFoyaDBYQ0pjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXRiVzl1VEc5dmNFUnBjaXdnY0dGemRHVXdLRndpYkc5dmNGTmpiM0psWDF3aUxDQnVZVzFsTENCY0lsOXdMVzVmYzJsdGNHeGxYMlZ1YzJWdFlteE1hWE4wTG5SemRsd2lLU2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBabVlnUFNCelkyOXlaVjlrVkVGSElDMGdjMk52Y21WZlJFMVRUeWxjYmx4dVpHbG1aaTVTVGtFZ1BDMGdabkpsWVdRb2FHVnlaU2hrYVdabVJHbHlMQ0JjSW1ScFptWmZSekV1WkZSQlIxOUhNUzR5YVM1a1ZFRkhYM1p6WDBjeExqSnBMa1JOVTA4dWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGxibk5sYldKc1gyZGxibVZmYVdRc0lHeHZaekpHYjJ4a1EyaGhibWRsTENCemFISnBibXRsWkY5c2IyY3lSa01zSUhCaFpHb3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU2xjYm1kbGJtVk1hWE4wTG1SdmQyNHVVazVCSUR3dElDaGthV1ptTGxKT1FTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BEMGdNQ3dnY0dGa2FpQThJR0ZzY0doaEtTa2taVzV6WlcxaWJGOW5aVzVsWDJsa1hHNW5aVzVsVEdsemRDNTFjQzVTVGtFZ1BDMGdLR1JwWm1ZdVVrNUJJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSE5vY21sdWEyVmtYMnh2WnpKR1F5QStJREFzSUhCaFpHb2dQQ0JoYkhCb1lTa3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVYRzVjYm0xaGVFeHZaekpHUXlBOExTQXlYRzVjYm5SbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBabVlzSUdkbGJtVXBJQ1UrSlNCY2JpQWdkVzV1WlhOMEtHZGxibVVwSUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0cxbFlXNWZaR2xtWmw5elkyOXlaU0E5SUcxbFlXNG9aR2xtWmlrc0lDNW5jbTkxY0hNZ1BTQW5aSEp2Y0NjcFhHNWNiblJsYlhBZ1BDMGdiR1ZtZEY5cWIybHVLSFJsYlhBc0lHUnBabVl1VWs1QkxDQmllU0E5SUdNb1hDSm5aVzVsWENJZ1BTQmNJbVZ1YzJWdFlteGZaMlZ1WlY5cFpGd2lLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHWnNZV2NnUFNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVk1hWE4wTG1SdmQyNHVVazVCTENCY0lqSkVUMWRPWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1WTWFYTjBMblZ3TGxKT1FTd2dYQ0l4VlZCY0lpd2dYQ0l3VGs5Y0lpa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzFoZUVac1lXY2dQU0FvWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQnRZWGhNYjJjeVJrTXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vY214dlp6Sm1ZMDFoZUNBOUlIQnRZWGdvY0cxcGJpaHphSEpwYm10bFpGOXNiMmN5UmtNc0lHMWhlRXh2WnpKR1F5a3NJQzF0WVhoTWIyY3lSa01wS1NBbFBpVWdYRzRnSUdSd2JIbHlPanBoY25KaGJtZGxLR1pzWVdjcFhHNWNibkFnUEMwZ1oyZHdiRzkwS0hSbGJYQXNJR0ZsY3loNElEMGdjMmh5Ykc5bk1tWmpUV0Y0TENCNUlEMGdiV1ZoYmw5a2FXWm1YM05qYjNKbExDQmpiMnh2Y2lBOUlHWnNZV2NzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BTQnBabVZzYzJVb1pteGhaeUFoUFNCY0lqQk9UMXdpTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVc0lFNUJLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphR0Z3WlNBOUlHRnpMbVpoWTNSdmNpaHRZWGhHYkdGbktTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWjJWdmJWOTBaWGgwWDNKbGNHVnNLQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQm5aM1JwZEd4bEtIQmhjM1JsTUNodVlXMWxMQ0JjSWw5elkyOXlaVjl6YVcxd2JHVkJibTV2WENJcEtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ1ptTkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBdFptTkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQnpZMkZzWlY5amIyeHZjbDl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWpCT1Qxd2lJRDBnWENKbmNtVjVYQ0lzSUZ3aU1WVlFYQ0lnUFNCY0luSmxaRndpTENCY0lqSkVUMWRPWENJZ1BTQmNJbUpzZFdWY0lpa3BJQ3NnSUNNZ1EyOXljbVZqZEdWa0lHTnZiRzl5SUcxaGNIQnBibWRjYmlBZ2MyTmhiR1ZmYzJoaGNHVmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YQ0pVVWxWRlhDSWdQU0F5TENCY0lrWkJURk5GWENJZ1BTQXhPU2twWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbEpPUVhaelRHOXZjRjljSWl3Z2JtRnRaU3dnWENKZmMyTnZjbVZmYzJsdGNHeGxRVzV1YjF3aUtWeHVhR1ZwWjJoMElEd3RJRFJjYm5kcFpIUm9JRHd0SURkY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuXG5jb21tb25Mb29wRGlyIDwtIGhlcmUoXFwuLi9kYXRhL2xvb3BfYW5hbHlzaXNcXClcbmRpZmZEaXIgPC0gaGVyZShcXC4uL2RhdGEvUk5BX2RpZmZcXClcbm5hbWUgPC0gXFxjaHJvbW9zaWdodFxcXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbW1vbkxvb3BEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgbmFtZSwgXFxfcC1uX3NpbXBsZV9lbnNlbWJsTGlzdC50c3ZcXCkpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShkaWZmID0gc2NvcmVfZFRBRyAtIHNjb3JlX0RNU08pXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUoZGlmZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDw9IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXAuUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcblxuXG5tYXhMb2cyRkMgPC0gMlxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmYpLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2d0aXRsZShwYXN0ZTAobmFtZSwgXFxfc2NvcmVfc2ltcGxlQW5ub1xcKSkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxSTkF2c0xvb3BfXFwsIG5hbWUsIFxcX3Njb3JlX3NpbXBsZUFubm9cXClcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
alpha <- 0.05
fcCutoff <- 0.5

commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \chromosight\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_simple_ensemblList.tsv\))) %>%
  dplyr::mutate(diff = score_dTAG - score_DMSO)

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_score_simpleAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_score_simpleAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlXeHdhR0VnUEMwZ01DNHdOVnh1Wm1ORGRYUnZabVlnUEMwZ01DNDFYRzVjYm1OdmJXMXZia3h2YjNCRWFYSWdQQzBnYUdWeVpTaGNYQzR1TDJSaGRHRXZiRzl2Y0Y5aGJtRnNlWE5wYzF4Y0tWeHVaR2xtWmtScGNpQThMU0JvWlhKbEtGeGNMaTR2WkdGMFlTOVNUa0ZmWkdsbVpseGNLVnh1Ym1GdFpTQThMU0JjWEdOb2NtOXRiM05wWjJoMFhGeGNibWRsYm1WQmJtNXZSR0YwWVNBOExTQnNiMkZrVEc5dmNFRnVibTlFWVhSaEtHaGxjbVVvWTI5dGJXOXVURzl2Y0VScGNpd2djR0Z6ZEdVd0tGeGNiRzl2Y0ZOamIzSmxYMXhjTENCdVlXMWxMQ0JjWEY5d0xXNWZjMmx0Y0d4bFgyVnVjMlZ0WW14TWFYTjBMblJ6ZGx4Y0tTa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dScFptWWdQU0J6WTI5eVpWOWtWRUZISUMwZ2MyTnZjbVZmUkUxVFR5bGNibHh1WkdsbVppNVNUa0VnUEMwZ1puSmxZV1FvYUdWeVpTaGthV1ptUkdseUxDQmNYR1JwWm1aZlJ6RXVaRlJCUjE5SE1TNHlhUzVrVkVGSFgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibWRsYm1WTWFYTjBMbVJ2ZDI0dVVrNUJJRHd0SUNoa2FXWm1MbEpPUVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUEQwZ01Dd2djR0ZrYWlBOElHRnNjR2hoS1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrWEc1blpXNWxUR2x6ZEM1MWNDNVNUa0VnUEMwZ0tHUnBabVl1VWs1QklDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtITm9jbWx1YTJWa1gyeHZaekpHUXlBK0lEQXNJSEJoWkdvZ1BDQmhiSEJvWVNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkZ4dVhHNWNibTFoZUV4dlp6SkdReUE4TFNBeVhHNWNiblJsYlhBZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScFptWXNJR2RsYm1VcElDVStKU0JjYmlBZ2RXNXVaWE4wS0dkbGJtVXBJQ1UrSlNCbmNtOTFjRjlpZVNoblpXNWxLU0FsUGlWY2JpQWdjM1Z0YldGeWFYcGxLRzFsWVc1ZlpHbG1abDl6WTI5eVpTQTlJRzFsWVc0b1pHbG1aaWtzSUM1bmNtOTFjSE1nUFNBblpISnZjQ2NwWEc1Y2JuUmxiWEFnUEMwZ2JHVm1kRjlxYjJsdUtIUmxiWEFzSUdScFptWXVVazVCTENCaWVTQTlJR01vWEZ4blpXNWxYRndnUFNCY1hHVnVjMlZ0WW14ZloyVnVaVjlwWkZ4Y0tTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dac1lXY2dQU0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1WTWFYTjBMbVJ2ZDI0dVVrNUJMQ0JjWERKRVQxZE9YRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExuVndMbEpPUVN3Z1hGd3hWVkJjWEN3Z1hGd3dUazljWENrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhlRVpzWVdjZ1BTQW9ZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCdFlYaE1iMmN5UmtNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9jbXh2WnpKbVkwMWhlQ0E5SUhCdFlYZ29jRzFwYmloemFISnBibXRsWkY5c2IyY3lSa01zSUcxaGVFeHZaekpHUXlrc0lDMXRZWGhNYjJjeVJrTXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtHWnNZV2NwWEc1Y2JuQWdQQzBnWjJkd2JHOTBLSFJsYlhBc0lHRmxjeWg0SUQwZ2MyaHliRzluTW1aalRXRjRMQ0I1SUQwZ2JXVmhibDlrYVdabVgzTmpiM0psTENCamIyeHZjaUE5SUdac1lXY3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHRmlaV3dnUFNCcFptVnNjMlVvWm14aFp5QWhQU0JjWERCT1QxeGNMQ0JsZUhSbGNtNWhiRjluWlc1bFgyNWhiV1VzSUU1QktTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFHRndaU0E5SUdGekxtWmhZM1J2Y2lodFlYaEdiR0ZuS1NrcElDdGNiaUFnWjJWdmJWOXdiMmx1ZENncElDc2daMlZ2YlY5MFpYaDBYM0psY0dWc0tDa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNCblozUnBkR3hsS0hCaGMzUmxNQ2h1WVcxbExDQmNYRjl6WTI5eVpWOXphVzF3YkdWQmJtNXZYRndwS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUMwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnWm1ORGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F0Wm1ORGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCelkyRnNaVjlqYjJ4dmNsOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYREJPVDF4Y0lEMGdYRnhuY21WNVhGd3NJRnhjTVZWUVhGd2dQU0JjWEhKbFpGeGNMQ0JjWERKRVQxZE9YRndnUFNCY1hHSnNkV1ZjWENrcElDc2dJQ01nUTI5eWNtVmpkR1ZrSUdOdmJHOXlJRzFoY0hCcGJtZGNiaUFnYzJOaGJHVmZjMmhoY0dWZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hGeFVVbFZGWEZ3Z1BTQXlMQ0JjWEVaQlRGTkZYRndnUFNBeE9Ta3BYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hGSk9RWFp6VEc5dmNGOWNYQ3dnYm1GdFpTd2dYRnhmYzJOdmNtVmZjMmx0Y0d4bFFXNXViMXhjS1Z4dWFHVnBaMmgwSUR3dElEUmNibmRwWkhSb0lEd3RJRGRjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcblxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5kaWZmRGlyIDwtIGhlcmUoXFwuLi9kYXRhL1JOQV9kaWZmXFwpXG5uYW1lIDwtIFxcY2hyb21vc2lnaHRcXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIG5hbWUsIFxcX3Atbl9zaW1wbGVfZW5zZW1ibExpc3QudHN2XFwpKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlmZiA9IHNjb3JlX2RUQUcgLSBzY29yZV9ETVNPKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKGRpZmZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8PSAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5cblxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZiwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdndGl0bGUocGFzdGUwKG5hbWUsIFxcX3Njb3JlX3NpbXBsZUFubm9cXCkpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcUk5BdnNMb29wX1xcLCBuYW1lLCBcXF9zY29yZV9zaW1wbGVBbm5vXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5cbmNvbW1vbkxvb3BEaXIgPC0gaGVyZShcXC4uL2RhdGEvbG9vcF9hbmFseXNpc1xcKVxuZGlmZkRpciA8LSBoZXJlKFxcLi4vZGF0YS9STkFfZGlmZlxcKVxubmFtZSA8LSBcXGNocm9tb3NpZ2h0XFxcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBuYW1lLCBcXF9wLW5fc2ltcGxlX2Vuc2VtYmxMaXN0LnRzdlxcKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGRpZmYgPSBzY29yZV9kVEFHIC0gc2NvcmVfRE1TTylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShkaWZmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPD0gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmYsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZiksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZ3RpdGxlKHBhc3RlMChuYW1lLCBcXF9zY29yZV9zaW1wbGVBbm5vXFwpKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxncmV5XFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXFJOQXZzTG9vcF9cXCwgbmFtZSwgXFxfc2NvcmVfc2ltcGxlQW5ub1xcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
alpha <- 0.05
fcCutoff <- 0.5

commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \chromosight\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_simple_ensemblList.tsv\))) %>%
  dplyr::mutate(diff = score_dTAG - score_DMSO)

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_score_simpleAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_score_simpleAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### RNA-seq loopscore scatterplot

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dVptTkRkWFJ2Wm1ZZ1BDMGdNQzQxWEc1Y2JtTnZiVzF2Ymt4dmIzQkVhWElnUEMwZ2FHVnlaU2hjSWk0dUwyUmhkR0V2Ykc5dmNGOWhibUZzZVhOcGMxd2lLVnh1WkdsbVprUnBjaUE4TFNCb1pYSmxLRndpTGk0dlpHRjBZUzlTVGtGZlpHbG1abHdpS1Z4dWJtRnRaU0E4TFNCY0ltTm9jbTl0YjNOcFoyaDBYQ0pjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXRiVzl1VEc5dmNFUnBjaXdnY0dGemRHVXdLRndpYkc5dmNGTmpiM0psWDF3aUxDQnVZVzFsTENCY0lsOXdMVzVmWTI5dGNHeGxlRjlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNJaWtwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGthV1ptSUQwZ2MyTnZjbVZmWkZSQlJ5QXRJSE5qYjNKbFgwUk5VMDhwWEc1Y2JtUnBabVl1VWs1QklEd3RJR1p5WldGa0tHaGxjbVVvWkdsbVprUnBjaXdnWENKa2FXWm1YMGN4TG1SVVFVZGZSekV1TW1rdVpGUkJSMTkyYzE5SE1TNHlhUzVFVFZOUExuUnpkbHdpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9aVzV6WlcxaWJGOW5aVzVsWDJsa0xDQnNiMmN5Um05c1pFTm9ZVzVuWlN3Z2MyaHlhVzVyWldSZmJHOW5Na1pETENCd1lXUnFMQ0JsZUhSbGNtNWhiRjluWlc1bFgyNWhiV1VwWEc1blpXNWxUR2x6ZEM1a2IzZHVMbEpPUVNBOExTQW9aR2xtWmk1U1RrRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElEdzlJREFzSUhCaFpHb2dQQ0JoYkhCb1lTa3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVaMlZ1WlV4cGMzUXVkWEF1VWs1QklEd3RJQ2hrYVdabUxsSk9RU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQaUF3TENCd1lXUnFJRHdnWVd4d2FHRXBLU1JsYm5ObGJXSnNYMmRsYm1WZmFXUmNibHh1WEc1dFlYaE1iMmN5UmtNZ1BDMGdNbHh1WEc1MFpXMXdJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGthV1ptTENCblpXNWxLU0FsUGlVZ1hHNGdJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVWdaM0p2ZFhCZllua29aMlZ1WlNrZ0pUNGxYRzRnSUhOMWJXMWhjbWw2WlNodFpXRnVYMlJwWm1aZmMyTnZjbVVnUFNCdFpXRnVLR1JwWm1ZcExDQXVaM0p2ZFhCeklEMGdKMlJ5YjNBbktWeHVYRzUwWlcxd0lEd3RJR3hsWm5SZmFtOXBiaWgwWlcxd0xDQmthV1ptTGxKT1FTd2dZbmtnUFNCaktGd2laMlZ1WlZ3aUlEMGdYQ0psYm5ObGJXSnNYMmRsYm1WZmFXUmNJaWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG1iR0ZuSUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCblpXNWxUR2x6ZEM1a2IzZHVMbEpPUVN3Z1hDSXlSRTlYVGx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bFRHbHpkQzUxY0M1U1RrRXNJRndpTVZWUVhDSXNJRndpTUU1UFhDSXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhoR2JHRm5JRDBnS0dGaWN5aHphSEpwYm10bFpGOXNiMmN5UmtNcElENGdiV0Y0VEc5bk1rWkRLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUhKc2IyY3labU5OWVhnZ1BTQndiV0Y0S0hCdGFXNG9jMmh5YVc1clpXUmZiRzluTWtaRExDQnRZWGhNYjJjeVJrTXBMQ0F0YldGNFRHOW5Na1pES1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2htYkdGbktWeHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJSE5vY214dlp6Sm1ZMDFoZUN3Z2VTQTlJRzFsWVc1ZlpHbG1abDl6WTI5eVpTd2dZMjlzYjNJZ1BTQm1iR0ZuTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hoWW1Wc0lEMGdhV1psYkhObEtHWnNZV2NnSVQwZ1hDSXdUazljSWl3Z1pYaDBaWEp1WVd4ZloyVnVaVjl1WVcxbExDQk9RU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmhoY0dVZ1BTQmhjeTVtWVdOMGIzSW9iV0Y0Um14aFp5a3BLU0FyWEc0Z0lHZGxiMjFmY0c5cGJuUW9LU0FySUdkbGIyMWZkR1Y0ZEY5eVpYQmxiQ2dwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdaMmQwYVhSc1pTaHdZWE4wWlRBb2JtRnRaU3dnWENKZmMyTnZjbVZmWTI5dGNHeGxlRUZ1Ym05Y0lpa3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQmthV1ptUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdMU0JrYVdabVEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQm1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlDMW1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aU1FNVBYQ0lnUFNCY0ltZHlaWGxjSWl3Z1hDSXhWVkJjSWlBOUlGd2ljbVZrWENJc0lGd2lNa1JQVjA1Y0lpQTlJRndpWW14MVpWd2lLU2tnS3lBZ0l5QkRiM0p5WldOMFpXUWdZMjlzYjNJZ2JXRndjR2x1WjF4dUlDQnpZMkZzWlY5emFHRndaVjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWxSU1ZVVmNJaUE5SURJc0lGd2lSa0ZNVTBWY0lpQTlJREU1S1NsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpVWs1QmRuTk1iMjl3WDF3aUxDQnVZVzFsTENCY0lsOXpZMjl5WlY5amIyMXdiR1Y0UVc1dWIxd2lLVnh1YUdWcFoyaDBJRHd0SURSY2JuZHBaSFJvSUR3dElEZGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcblxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5kaWZmRGlyIDwtIGhlcmUoXFwuLi9kYXRhL1JOQV9kaWZmXFwpXG5uYW1lIDwtIFxcY2hyb21vc2lnaHRcXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIG5hbWUsIFxcX3Atbl9jb21wbGV4X2Vuc2VtYmxMaXN0LnRzdlxcKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGRpZmYgPSBzY29yZV9kVEFHIC0gc2NvcmVfRE1TTylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShkaWZmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPD0gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmYsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZiksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZ3RpdGxlKHBhc3RlMChuYW1lLCBcXF9zY29yZV9jb21wbGV4QW5ub1xcKSkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxSTkF2c0xvb3BfXFwsIG5hbWUsIFxcX3Njb3JlX2NvbXBsZXhBbm5vXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
alpha <- 0.05
fcCutoff <- 0.5

commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \chromosight\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_complex_ensemblList.tsv\))) %>%
  dplyr::mutate(diff = score_dTAG - score_DMSO)

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_score_complexAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_score_complexAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlXeHdhR0VnUEMwZ01DNHdOVnh1Wm1ORGRYUnZabVlnUEMwZ01DNDFYRzVjYm1OdmJXMXZia3h2YjNCRWFYSWdQQzBnYUdWeVpTaGNYQzR1TDJSaGRHRXZiRzl2Y0Y5aGJtRnNlWE5wYzF4Y0tWeHVaR2xtWmtScGNpQThMU0JvWlhKbEtGeGNMaTR2WkdGMFlTOVNUa0ZmWkdsbVpseGNLVnh1Ym1GdFpTQThMU0JjWEdOb2NtOXRiM05wWjJoMFhGeGNibWRsYm1WQmJtNXZSR0YwWVNBOExTQnNiMkZrVEc5dmNFRnVibTlFWVhSaEtHaGxjbVVvWTI5dGJXOXVURzl2Y0VScGNpd2djR0Z6ZEdVd0tGeGNiRzl2Y0ZOamIzSmxYMXhjTENCdVlXMWxMQ0JjWEY5d0xXNWZZMjl0Y0d4bGVGOWxibk5sYldKc1RHbHpkQzUwYzNaY1hDa3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FXWm1JRDBnYzJOdmNtVmZaRlJCUnlBdElITmpiM0psWDBSTlUwOHBYRzVjYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9aR2xtWmtScGNpd2dYRnhrYVdabVgwY3hMbVJVUVVkZlJ6RXVNbWt1WkZSQlIxOTJjMTlITVM0eWFTNUVUVk5QTG5SemRseGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1pXNXpaVzFpYkY5blpXNWxYMmxrTENCc2IyY3lSbTlzWkVOb1lXNW5aU3dnYzJoeWFXNXJaV1JmYkc5bk1rWkRMQ0J3WVdScUxDQmxlSFJsY201aGJGOW5aVzVsWDI1aGJXVXBYRzVuWlc1bFRHbHpkQzVrYjNkdUxsSk9RU0E4TFNBb1pHbG1aaTVTVGtFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3OUlEQXNJSEJoWkdvZ1BDQmhiSEJvWVNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkZ4dVoyVnVaVXhwYzNRdWRYQXVVazVCSUR3dElDaGthV1ptTGxKT1FTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BpQXdMQ0J3WVdScUlEd2dZV3h3YUdFcEtTUmxibk5sYldKc1gyZGxibVZmYVdSY2JseHVYRzV0WVhoTWIyY3lSa01nUEMwZ01seHVYRzUwWlcxd0lEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoa2FXWm1MQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0J0WldGdUtHUnBabVlwTENBdVozSnZkWEJ6SUQwZ0oyUnliM0FuS1Z4dVhHNTBaVzF3SUR3dElHeGxablJmYW05cGJpaDBaVzF3TENCa2FXWm1MbEpPUVN3Z1lua2dQU0JqS0Z4Y1oyVnVaVnhjSUQwZ1hGeGxibk5sYldKc1gyZGxibVZmYVdSY1hDa3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobWJHRm5JRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bFRHbHpkQzVrYjNkdUxsSk9RU3dnWEZ3eVJFOVhUbHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsVEdsemRDNTFjQzVTVGtFc0lGeGNNVlZRWEZ3c0lGeGNNRTVQWEZ3cEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRZWGhHYkdGbklEMGdLR0ZpY3loemFISnBibXRsWkY5c2IyY3lSa01wSUQ0Z2JXRjRURzluTWtaREtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphSEpzYjJjeVptTk5ZWGdnUFNCd2JXRjRLSEJ0YVc0b2MyaHlhVzVyWldSZmJHOW5Na1pETENCdFlYaE1iMmN5UmtNcExDQXRiV0Y0VEc5bk1rWkRLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZZWEp5WVc1blpTaG1iR0ZuS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlITm9jbXh2WnpKbVkwMWhlQ3dnZVNBOUlHMWxZVzVmWkdsbVpsOXpZMjl5WlN3Z1kyOXNiM0lnUFNCbWJHRm5MRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeGhZbVZzSUQwZ2FXWmxiSE5sS0dac1lXY2dJVDBnWEZ3d1RrOWNYQ3dnWlhoMFpYSnVZV3hmWjJWdVpWOXVZVzFsTENCT1FTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyaGhjR1VnUFNCaGN5NW1ZV04wYjNJb2JXRjRSbXhoWnlrcEtTQXJYRzRnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJR2RsYjIxZmRHVjRkRjl5WlhCbGJDZ3BJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3RjYmlBZ1oyZDBhWFJzWlNod1lYTjBaVEFvYm1GdFpTd2dYRnhmYzJOdmNtVmZZMjl0Y0d4bGVFRnVibTljWENrcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ0xTQmthV1ptUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdNQ2tnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNCbVkwTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUMxbVkwTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lITmpZV3hsWDJOdmJHOXlYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjTUU1UFhGd2dQU0JjWEdkeVpYbGNYQ3dnWEZ3eFZWQmNYQ0E5SUZ4Y2NtVmtYRndzSUZ4Y01rUlBWMDVjWENBOUlGeGNZbXgxWlZ4Y0tTa2dLeUFnSXlCRGIzSnlaV04wWldRZ1kyOXNiM0lnYldGd2NHbHVaMXh1SUNCelkyRnNaVjl6YUdGd1pWOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYRlJTVlVWY1hDQTlJRElzSUZ4Y1JrRk1VMFZjWENBOUlERTVLU2xjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNVazVCZG5OTWIyOXdYMXhjTENCdVlXMWxMQ0JjWEY5elkyOXlaVjlqYjIxd2JHVjRRVzV1YjF4Y0tWeHVhR1ZwWjJoMElEd3RJRFJjYm5kcFpIUm9JRHd0SURkY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5cbmNvbW1vbkxvb3BEaXIgPC0gaGVyZShcXC4uL2RhdGEvbG9vcF9hbmFseXNpc1xcKVxuZGlmZkRpciA8LSBoZXJlKFxcLi4vZGF0YS9STkFfZGlmZlxcKVxubmFtZSA8LSBcXGNocm9tb3NpZ2h0XFxcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBuYW1lLCBcXF9wLW5fY29tcGxleF9lbnNlbWJsTGlzdC50c3ZcXCkpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShkaWZmID0gc2NvcmVfZFRBRyAtIHNjb3JlX0RNU08pXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUoZGlmZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDw9IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXAuUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcblxuXG5tYXhMb2cyRkMgPC0gMlxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmYpLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2d0aXRsZShwYXN0ZTAobmFtZSwgXFxfc2NvcmVfY29tcGxleEFubm9cXCkpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcUk5BdnNMb29wX1xcLCBuYW1lLCBcXF9zY29yZV9jb21wbGV4QW5ub1xcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5cbmNvbW1vbkxvb3BEaXIgPC0gaGVyZShcXC4uL2RhdGEvbG9vcF9hbmFseXNpc1xcKVxuZGlmZkRpciA8LSBoZXJlKFxcLi4vZGF0YS9STkFfZGlmZlxcKVxubmFtZSA8LSBcXGNocm9tb3NpZ2h0XFxcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBuYW1lLCBcXF9wLW5fY29tcGxleF9lbnNlbWJsTGlzdC50c3ZcXCkpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShkaWZmID0gc2NvcmVfZFRBRyAtIHNjb3JlX0RNU08pXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUoZGlmZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDw9IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXAuUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcblxuXG5tYXhMb2cyRkMgPC0gMlxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmYpLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2d0aXRsZShwYXN0ZTAobmFtZSwgXFxfc2NvcmVfY29tcGxleEFubm9cXCkpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcUk5BdnNMb29wX1xcLCBuYW1lLCBcXF9zY29yZV9jb21wbGV4QW5ub1xcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
alpha <- 0.05
fcCutoff <- 0.5

commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \chromosight\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_complex_ensemblList.tsv\))) %>%
  dplyr::mutate(diff = score_dTAG - score_DMSO)

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_score_complexAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_score_complexAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5QThMU0JtZFc1amRHbHZiaWhrWml3Z1kyOXNYM2dzSUdOdmJGOTVMQ0JoYm01dlRHbHpkQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaU3dnZEdsMGJHVXNJR1pwWjBScGNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsbVprTjFkRzltWmlBOUlEQXVOU3dnWkdWdWMybDBlVjl1SUQwZ01qQXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCNGJXbHVJRDBnTFRBdU5Td2dlRzFoZUNBOUlERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhsdGFXNGdQU0F0TUM0MUxDQjViV0Y0SUQwZ01Ta2dlMXh1SUNCamIyeGZlRjl4SUR3dElHVnVjWFZ2S0dOdmJGOTRLVnh1SUNCamIyeGZlVjl4SUR3dElHVnVjWFZ2S0dOdmJGOTVLVnh1SUNCY2JpQWdJeUJUWTJGMGRHVnljR3h2ZEZ4dUlDQmtaaklnUEMwZ1pHWWdKVDRsWEc0Z0lDQWdabWxzZEdWeUtFRnVibTlmYzJsdGNHeGxJQ1ZwYmlVZ1lXNXViMHhwYzNRcElDVStKVnh1SUNBZ0lITmxiR1ZqZENocFpDd2dlQ0E5SUNFaFkyOXNYM2hmY1N3Z2VTQTlJQ0VoWTI5c1gzbGZjU2tnSlQ0bFhHNGdJQ0FnYlhWMFlYUmxLRnh1SUNBZ0lDQWdiV2x1Y0c5eklEMGdiV2x1S0dNb2VDd2dlU2xiWXloNExDQjVLU0ErSURCZExDQnVZUzV5YlNBOUlGUlNWVVVwTEZ4dUlDQWdJQ0FnWlhCeklDQWdJRDBnYldsdWNHOXpJQ29nTUM0eExGeHVJQ0FnSUNBZ2JIZ2dJQ0FnSUQwZ2JHOW5NaWg0SUNzZ1pYQnpLU3hjYmlBZ0lDQWdJR3g1SUNBZ0lDQTlJR3h2WnpJb2VTQXJJR1Z3Y3lrc1hHNGdJQ0FnSUNCa1pXNXphWFI1SUQwZ1oyVjBYMlJsYm5OcGRIa29iSGdzSUd4NUxDQnVJRDBnWkdWdWMybDBlVjl1S1Z4dUlDQWdJQ2tnSlQ0bFhHNGdJQ0FnWVhKeVlXNW5aU2hrWlc1emFYUjVLVnh1SUNCY2JpQWdjREVnUEMwZ1oyZHdiRzkwS0dSbU1pd2dZV1Z6S0hnZ1BTQnNlQ3dnZVNBOUlHeDVMQ0JqYjJ4dmNpQTlJR1JsYm5OcGRIa3BLU0FyWEc0Z0lDQWdaMlZ2YlY5d2IybHVkQ2dwSUN0Y2JpQWdJQ0J6WTJGc1pWOWpiMnh2Y2w5MmFYSnBaR2x6S0NrZ0sxeHVJQ0FnSUhOallXeGxYM2hmWTI5dWRHbHVkVzkxY3loY2JpQWdJQ0FnSUc1aGJXVWdJQ0E5SUhCaGMzUmxNQ2hjSW14dlp6SW9YQ0lzSUhGMWIxOXVZVzFsS0dOdmJGOTRYM0VwTENCY0lpbGNJaWxjYmlBZ0lDQXBJQ3RjYmlBZ0lDQnpZMkZzWlY5NVgyTnZiblJwYm5WdmRYTW9YRzRnSUNBZ0lDQnVZVzFsSUNBZ1BTQndZWE4wWlRBb1hDSnNiMmN5S0Z3aUxDQnhkVzlmYm1GdFpTaGpiMnhmZVY5eEtTd2dYQ0lwWENJcFhHNGdJQ0FnS1NBclhHNGdJQ0FnWTI5dmNtUmZabWw0WldRb0tTQXJYRzRnSUNBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzkxY2lBOUlGd2laM0psZVRVd1hDSXNJR3hwYm1WMGVYQmxJRDBnWENKa1lYTm9aV1JjSWlrZ0sxeHVJQ0FnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2ZFhJZ1BTQmNJbWR5WlhsY0lpa2dLMXh1SUNBZ0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmRYSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQWdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdMU2d5S2lwa2FXWm1RM1YwYjJabUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiMnh2ZFhJZ1BTQmNJbWR5WlhsY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SdmRIUmxaRndpS1NBclhHNGdJQ0FnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0FvTWlvcVpHbG1aa04xZEc5bVppa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNWeUlEMGdYQ0puY21WNVhDSXNJR3hwYm1WMGVYQmxJRDBnWENKa2IzUjBaV1JjSWlrZ0sxeHVJQ0FnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FyWEc0Z0lDQWdiR0ZpY3loNElEMGdjWFZ2WDI1aGJXVW9ZMjlzWDNoZmNTa3NYRzRnSUNBZ0lDQWdJQ0I1SUQwZ2NYVnZYMjVoYldVb1kyOXNYM2xmY1NrcElDdGNiaUFnSUNCblozUnBkR3hsS0hScGRHeGxLVnh1SUNCY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpYzJOaGRIUmxjbkJzYjNSZlhDSXNJRzVoYldVcFhHNGdJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdkMmxrZEdnZ1BTQXpMalVzSUdobGFXZG9kQ0E5SURNcFhHNGdJSEJ5YVc1MEtIQXhLVnh1SUNCa1pYWXViMlptS0NsY2JpQWdYRzRnSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCY2JpQWdJQ0FnSUhkcFpIUm9JRDBnTXk0MUxDQm9aV2xuYUhRZ1BTQXpMQ0IxYm1sMGN5QTlJRndpYVc1Y0lpd2djbVZ6SUQwZ05qQXdLVnh1SUNCd2NtbHVkQ2h3TVNsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUZ4dUlDQWpJRkJwWlNCamFHRnlkRnh1SUNCa1pqTWdQQzBnWkdZZ0pUNGxYRzRnSUNBZ1ptbHNkR1Z5S0VGdWJtOWZjMmx0Y0d4bElDVnBiaVVnWVc1dWIweHBjM1FwSUNVK0pWeHVJQ0FnSUhObGJHVmpkQ2hwWkN3Z2VDQTlJQ0VoWTI5c1gzaGZjU3dnZVNBOUlDRWhZMjlzWDNsZmNTa2dKVDRsWEc0Z0lDQWdiWFYwWVhSbEtGeHVJQ0FnSUNBZ2JXbHVjRzl6SUQwZ2JXbHVLR01vZUN3Z2VTbGJZeWg0TENCNUtTQStJREJkTENCdVlTNXliU0E5SUZSU1ZVVXBMRnh1SUNBZ0lDQWdaWEJ6SUNBZ0lEMGdiV2x1Y0c5eklDb2dNQzR4TEZ4dUlDQWdJQ0FnYkhnZ0lDQWdJRDBnYkc5bk1paDRJQ3NnWlhCektTeGNiaUFnSUNBZ0lHeDVJQ0FnSUNBOUlHeHZaeklvZVNBcklHVndjeWxjYmlBZ0lDQXBJQ1UrSlZ4dUlDQWdJRzExZEdGMFpTaGthV1ptSUQwZ2JIa2dMU0JzZUNrZ0pUNGxYRzRnSUNBZ2JYVjBZWFJsS0hWd1pHOTNiaUE5SUdsbVpXeHpaU2hrYVdabUlENGdaR2xtWmtOMWRHOW1aaXdnWENKVlVGd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR1JwWm1ZZ1BDQXRaR2xtWmtOMWRHOW1aaXdnWENKRVQxZE9YQ0lzSUZ3aVRrOWNJaWtwS1Z4dUlDQmtaak1rZFhCa2IzZHVJRHd0SUdaaFkzUnZjaWhrWmpNa2RYQmtiM2R1TENCaktGd2lWVkJjSWl3Z1hDSk9UMXdpTENCY0lrUlBWMDVjSWlrcFhHNGdJRnh1SUNCd2FXVmZaR1lnUEMwZ1pHWXpJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcGpiM1Z1ZENoMWNHUnZkMjRwSUNVK0pWeHVJQ0FnSUcxMWRHRjBaU2h3WTNRZ0lDQTlJRzRnTHlCemRXMG9iaWtnS2lBeE1EQXNYRzRnSUNBZ0lDQWdJQ0FnSUd4aFltVnNJRDBnY0dGemRHVXdLSFZ3Wkc5M2Jpd2dYQ0pjWEc1Y0lpd2diaXdnWENKY1hHNG9YQ0lzSUhKdmRXNWtLSEJqZEN3eEtTd2dYQ0lsS1Z3aUtTbGNibHh1SUNCd01pQThMU0JuWjNCc2IzUW9jR2xsWDJSbUxDQmhaWE1vZUNBOUlGd2lYQ0lzSUhrZ1BTQnVMQ0JtYVd4c0lEMGdkWEJrYjNkdUtTa2dLMXh1SUNBZ0lHZGxiMjFmWTI5c0tHTnZiRzl5SUQwZ1hDSjNhR2wwWlZ3aUtTQXJYRzRnSUNBZ1kyOXZjbVJmY0c5c1lYSW9kR2hsZEdFZ1BTQmNJbmxjSWlrZ0sxeHVJQ0FnSUdkbGIyMWZkR1Y0ZENoaFpYTW9iR0ZpWld3Z1BTQnNZV0psYkNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUhCdmMybDBhVzl1SUQwZ2NHOXphWFJwYjI1ZmMzUmhZMnNvZG1wMWMzUWdQU0F3TGpVcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFYcGxJQ0FnSUNBOUlHWnZiblJUYVhwbFRTOHlLU0FyWEc0Z0lDQWdkR2hsYldWZmRtOXBaQ2dwSUNzZ0lDQjBhR1Z0WlNoc1pXZGxibVF1Y0c5emFYUnBiMjRnUFNCY0ltNXZibVZjSWlrZ0sxeHVJQ0FnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb2MzUnliMjVuWDNKbFpDd2dibTlmWjNKbGVTd2djM1J5YjI1blgySnNkV1VwS1Z4dUlDQm1hV3hsVG1GdFpTQThMU0JvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0Z3aWNHbGxZMmhoY25SZlhDSXNJRzVoYldVcEtWeHVJQ0IzYVdSMGFDQThMU0J3WVc1bGJGTnBlbVVvTWlrcWJXMVViMGx1WTJoY2JpQWdhR1ZwWjJoMElEd3RJSEJoYm1Wc1UybDZaU2d5S1NwdGJWUnZTVzVqYUZ4dUlDQnpkbWRzYVhSbEtIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcExDQjNhV1IwYUNBOUlIZHBaSFJvTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFwWEc0Z0lIQnlhVzUwS0hBeUtWeHVJQ0JrWlhZdWIyWm1LQ2xjYm4xY2JseHVYRzVqYjIxdGIyNU1iMjl3UkdseUlEd3RJR2hsY21Vb1hDSXVMaTlrWVhSaEwyeHZiM0JmWVc1aGJIbHphWE5jSWlsY2JtWnBaMFJwY2lBOExTQm9aWEpsS0Z3aUxpNHZabWxuZFhKbEwyeHZiM0JmWVc1aGJIbHphWE5jSWlsY2JtUnBjaTVqY21WaGRHVW9abWxuUkdseUxDQnphRzkzVjJGeWJtbHVaM01nUFNCR1FVeFRSU3dnY21WamRYSnphWFpsSUQwZ1ZGSlZSU2xjYmx4dVpHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZiVzF2Ymt4dmIzQkVhWElzSUZ3aWJHOXZjRk5qYjNKbFgyTm9jbTl0YjNOcFoyaDBMblJ6ZGx3aUtTbGNibHh1Y0d4dmRGOXNiMjl3WDNOamIzSmxjeWhrWVhSaExDQnZiMlZmUkUxVFR5d2diMjlsWDJSVVFVY3NJR01vWENKUUxWQmNJaXdnWENKUUxVVmNJaXdnWENKUUxWTmNJaXdnWENKUUxWaGNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJa1V0UlZ3aUxDQmNJa1V0VTF3aUxDQmNJa1V0V0Z3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVV5MVRYQ0lzSUZ3aVV5MVlYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0pZTFZoY0lpa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVZ1BTQmNJbU5vY205dGIzTnBaMmgwWDI5dlpWOWhiR3hmWkZSQlIzWkVUVk5QWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBkR3hsSUQwZ1hDSmphSEp2Ylc5ZmIyOWxYMkZzYkY5a1ZFRkhka1JOVTA5Y0lpd2dabWxuUkdseUtWeHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZSRTFUVHl3Z2IyOWxYMlJVUVVjc0lHTW9YQ0pUTFZOY0lpa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVZ1BTQmNJbU5vY205dGIzTnBaMmgwWDI5dlpWOXpkSEpmWkZSQlIzWkVUVk5QWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBkR3hsSUQwZ1hDSmphSEp2Ylc5ZmIyOWxYM04wY2w5a1ZFRkhka1JOVTA5Y0lpd2dabWxuUkdseUtWeHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZSRTFUVHl3Z2IyOWxYMlJVUVVjc0lHTW9YQ0pUTFZOY0lpd2dYQ0pUTFZoY0lpa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVZ1BTQmNJbU5vY205dGIzTnBaMmgwWDI5dlpWOXpkSEl5WDJSVVFVZDJSRTFUVDF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhWFJzWlNBOUlGd2lZMmh5YjIxdlgyOXZaVjl6ZEhJeVgyUlVRVWQyUkUxVFQxd2lMQ0JtYVdkRWFYSXBYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlFVFZOUExDQnZiMlZmWkZSQlJ5d2dZeWhjSWxBdFVGd2lMQ0JjSWxBdFJWd2lMQ0JjSWtVdFJWd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpWTJoeWIyMXZjMmxuYUhSZmIyOWxYM0psWjE5a1ZFRkhka1JOVTA5Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNJbU5vY205dGIxOXZiMlZmY21WblgyUlVRVWQyUkUxVFQxd2lMQ0JtYVdkRWFYSXBYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlFVFZOUExDQnZiMlZmWkZSQlJ5d2dZeWhjSWxBdFUxd2lMQ0JjSWtVdFUxd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpWTJoeWIyMXZjMmxuYUhSZmIyOWxYM0psWjFOMGNsOWtWRUZIZGtSTlUwOWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdsMGJHVWdQU0JjSW1Ob2NtOXRiMTl2YjJWZmNtVm5VM1J5WDJSVVFVZDJSRTFUVDF3aUxDQm1hV2RFYVhJcFhHNWNibkJzYjNSZmJHOXZjRjl6WTI5eVpYTW9aR0YwWVN3Z2IyOWxYMFJOVTA4c0lHOXZaVjlCTkRnMUxDQmpLRndpVUMxUVhDSXNJRndpVUMxRlhDSXNJRndpVUMxVFhDSXNJRndpVUMxWVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSkZMVVZjSWl3Z1hDSkZMVk5jSWl3Z1hDSkZMVmhjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWxNdFUxd2lMQ0JjSWxNdFdGd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lXQzFZWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hDSmphSEp2Ylc5emFXZG9kRjl2YjJWZllXeHNYMEUwT0RWMlJFMVRUMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ3aVkyaHliMjF2WDI5dlpWOWhiR3hmUVRRNE5YWkVUVk5QWENJc0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwUk5VMDhzSUc5dlpWOUJORGcxTENCaktGd2lVeTFUWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hDSmphSEp2Ylc5emFXZG9kRjl2YjJWZmMzUnlYMEUwT0RWMlJFMVRUMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ3aVkyaHliMjF2WDI5dlpWOXpkSEpmUVRRNE5YWkVUVk5QWENJc0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwUk5VMDhzSUc5dlpWOUJORGcxTENCaktGd2lVeTFUWENJc0lGd2lVeTFZWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hDSmphSEp2Ylc5emFXZG9kRjl2YjJWZmMzUnlNbDlCTkRnMWRrUk5VMDljSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY0ltTm9jbTl0YjE5dmIyVmZjM1J5TWw5Qk5EZzFka1JOVTA5Y0lpd2dabWxuUkdseUtWeHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZSRTFUVHl3Z2IyOWxYMEUwT0RVc0lHTW9YQ0pRTFZCY0lpd2dYQ0pRTFVWY0lpd2dYQ0pGTFVWY0lpa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVZ1BTQmNJbU5vY205dGIzTnBaMmgwWDI5dlpWOXlaV2RmUVRRNE5YWkVUVk5QWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBkR3hsSUQwZ1hDSmphSEp2Ylc5ZmIyOWxYM0psWjE5Qk5EZzFka1JOVTA5Y0lpd2dabWxuUkdseUtWeHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZSRTFUVHl3Z2IyOWxYMEUwT0RVc0lHTW9YQ0pRTFZOY0lpd2dYQ0pGTFZOY0lpa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVZ1BTQmNJbU5vY205dGIzTnBaMmgwWDI5dlpWOXlaV2RUZEhKZlFUUTROWFpFVFZOUFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYQ0pqYUhKdmJXOWZiMjlsWDNKbFoxTjBjbDlCTkRnMWRrUk5VMDljSWl3Z1ptbG5SR2x5S1Z4dVhHNWNibkJzYjNSZmJHOXZjRjl6WTI5eVpYTW9aR0YwWVN3Z2IyOWxYMFZ3YVVSTlUwOHNJRzl2WlY5RmNHbGtWRUZITENCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJc0lGd2lVQzFUWENJc0lGd2lVQzFZWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKRkxVVmNJaXdnWENKRkxWTmNJaXdnWENKRkxWaGNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbE10VTF3aUxDQmNJbE10V0Z3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVdDMVlYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWENKamFISnZiVzl6YVdkb2RGOXZiMlZmWVd4c1gwVndhV1JVUVVkMlJYQnBSRTFUVDF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhWFJzWlNBOUlGd2lZMmh5YjIxdlgyOXZaVjloYkd4ZlJYQnBaRlJCUjNaRmNHbEVUVk5QWENJc0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwVndhVVJOVTA4c0lHOXZaVjlGY0dsa1ZFRkhMQ0JqS0Z3aVV5MVRYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWENKamFISnZiVzl6YVdkb2RGOXZiMlZmYzNSeVgwVndhV1JVUVVkMlJYQnBSRTFUVDF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhWFJzWlNBOUlGd2lZMmh5YjIxdlgyOXZaVjl6ZEhKZlJYQnBaRlJCUjNaRmNHbEVUVk5QWENJc0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwVndhVVJOVTA4c0lHOXZaVjlGY0dsa1ZFRkhMQ0JqS0Z3aVV5MVRYQ0lzSUZ3aVV5MVlYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWENKamFISnZiVzl6YVdkb2RGOXZiMlZmYzNSeU1sOUZjR2xrVkVGSGRrVndhVVJOVTA5Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNJbU5vY205dGIxOXZiMlZmYzNSeU1sOUZjR2xrVkVGSGRrVndhVVJOVTA5Y0lpd2dabWxuUkdseUtWeHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZSWEJwUkUxVFR5d2diMjlsWDBWd2FXUlVRVWNzSUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSkZMVVZjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY0ltTm9jbTl0YjNOcFoyaDBYMjl2WlY5eVpXZGZSWEJwWkZSQlIzWkZjR2xFVFZOUFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYQ0pqYUhKdmJXOWZiMjlsWDNKbFoxOUZjR2xrVkVGSGRrVndhVVJOVTA5Y0lpd2dabWxuUkdseUtWeHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZSWEJwUkUxVFR5d2diMjlsWDBWd2FXUlVRVWNzSUdNb1hDSlFMVk5jSWl3Z1hDSkZMVk5jSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY0ltTm9jbTl0YjNOcFoyaDBYMjl2WlY5eVpXZFRkSEpmUlhCcFpGUkJSM1pGY0dsRVRWTlBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWENKamFISnZiVzlmYjI5bFgzSmxaMU4wY2w5RmNHbGtWRUZIZGtWd2FVUk5VMDljSWl3Z1ptbG5SR2x5S1Z4dVhHNWNibkJzYjNSZmJHOXZjRjl6WTI5eVpYTW9aR0YwWVN3Z2IyOWxYMVZVTENCdmIyVmZRVWxFTENCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJc0lGd2lVQzFUWENJc0lGd2lVQzFZWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKRkxVVmNJaXdnWENKRkxWTmNJaXdnWENKRkxWaGNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbE10VTF3aUxDQmNJbE10V0Z3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVdDMVlYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWENKamFISnZiVzl6YVdkb2RGOXZiMlZmWVd4c1gwRkpSSFpWVkZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhWFJzWlNBOUlGd2lZMmh5YjIxdlgyOXZaVjloYkd4ZlFVbEVkbFZVWENJc0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgxVlVMQ0J2YjJWZlFVbEVMQ0JqS0Z3aVV5MVRYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWENKamFISnZiVzl6YVdkb2RGOXZiMlZmYzNSeVgwRkpSSFpWVkZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhWFJzWlNBOUlGd2lZMmh5YjIxdlgyOXZaVjl6ZEhKZlFVbEVkbFZVWENJc0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgxVlVMQ0J2YjJWZlFVbEVMQ0JqS0Z3aVV5MVRYQ0lzSUZ3aVV5MVlYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWENKamFISnZiVzl6YVdkb2RGOXZiMlZmYzNSeU1sOUJTVVIyVlZSY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNJbU5vY205dGIxOXZiMlZmYzNSeU1sOUJTVVIyVlZSY0lpd2dabWxuUkdseUtWeHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZWVlFzSUc5dlpWOUJTVVFzSUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSkZMVVZjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY0ltTm9jbTl0YjNOcFoyaDBYMjl2WlY5eVpXZGZRVWxFZGxWVVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYQ0pqYUhKdmJXOWZiMjlsWDNKbFoxOUJTVVIyVlZSY0lpd2dabWxuUkdseUtWeHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZWVlFzSUc5dlpWOUJTVVFzSUdNb1hDSlFMVk5jSWl3Z1hDSkZMVk5jSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY0ltTm9jbTl0YjNOcFoyaDBYMjl2WlY5eVpXZFRkSEpmUVVsRWRsVlVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWENKamFISnZiVzlmYjI5bFgzSmxaMU4wY2w5QlNVUjJWVlJjSWl3Z1ptbG5SR2x5S1Z4dVhHNWNibUJnWUNKOSAtLT5cblxuYGBgclxucGxvdF9sb29wX3Njb3JlcyA8LSBmdW5jdGlvbihkZiwgY29sX3gsIGNvbF95LCBhbm5vTGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdGl0bGUsIGZpZ0RpcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuNSwgZGVuc2l0eV9uID0gMjAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWluID0gLTAuNSwgeG1heCA9IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltaW4gPSAtMC41LCB5bWF4ID0gMSkge1xuICBjb2xfeF9xIDwtIGVucXVvKGNvbF94KVxuICBjb2xfeV9xIDwtIGVucXVvKGNvbF95KVxuICBcbiAgIyBTY2F0dGVycGxvdFxuICBkZjIgPC0gZGYgJT4lXG4gICAgZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYW5ub0xpc3QpICU+JVxuICAgIHNlbGVjdChpZCwgeCA9ICEhY29sX3hfcSwgeSA9ICEhY29sX3lfcSkgJT4lXG4gICAgbXV0YXRlKFxuICAgICAgbWlucG9zID0gbWluKGMoeCwgeSlbYyh4LCB5KSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgICAgZXBzICAgID0gbWlucG9zICogMC4xLFxuICAgICAgbHggICAgID0gbG9nMih4ICsgZXBzKSxcbiAgICAgIGx5ICAgICA9IGxvZzIoeSArIGVwcyksXG4gICAgICBkZW5zaXR5ID0gZ2V0X2RlbnNpdHkobHgsIGx5LCBuID0gZGVuc2l0eV9uKVxuICAgICkgJT4lXG4gICAgYXJyYW5nZShkZW5zaXR5KVxuICBcbiAgcDEgPC0gZ2dwbG90KGRmMiwgYWVzKHggPSBseCwgeSA9IGx5LCBjb2xvciA9IGRlbnNpdHkpKSArXG4gICAgZ2VvbV9wb2ludCgpICtcbiAgICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICAgIHNjYWxlX3hfY29udGludW91cyhcbiAgICAgIG5hbWUgICA9IHBhc3RlMChcXGxvZzIoXFwsIHF1b19uYW1lKGNvbF94X3EpLCBcXClcXClcbiAgICApICtcbiAgICBzY2FsZV95X2NvbnRpbnVvdXMoXG4gICAgICBuYW1lICAgPSBwYXN0ZTAoXFxsb2cyKFxcLCBxdW9fbmFtZShjb2xfeV9xKSwgXFwpXFwpXG4gICAgKSArXG4gICAgY29vcmRfZml4ZWQoKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgICAgIGNvbG91ciA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvdXIgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvdXIgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLSgyKipkaWZmQ3V0b2ZmKSxcbiAgICAgICAgICAgICAgICBjb2xvdXIgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAoMioqZGlmZkN1dG9mZiksXG4gICAgICAgICAgICAgICAgY29sb3VyID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgbGFicyh4ID0gcXVvX25hbWUoY29sX3hfcSksXG4gICAgICAgICB5ID0gcXVvX25hbWUoY29sX3lfcSkpICtcbiAgICBnZ3RpdGxlKHRpdGxlKVxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2NhdHRlcnBsb3RfXFwsIG5hbWUpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgXG4gICAgICAgICAgd2lkdGggPSAzLjUsIGhlaWdodCA9IDMpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbiAgXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBcbiAgICAgIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzLCB1bml0cyA9IFxcaW5cXCwgcmVzID0gNjAwKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG4gIFxuICAjIFBpZSBjaGFydFxuICBkZjMgPC0gZGYgJT4lXG4gICAgZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYW5ub0xpc3QpICU+JVxuICAgIHNlbGVjdChpZCwgeCA9ICEhY29sX3hfcSwgeSA9ICEhY29sX3lfcSkgJT4lXG4gICAgbXV0YXRlKFxuICAgICAgbWlucG9zID0gbWluKGMoeCwgeSlbYyh4LCB5KSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgICAgZXBzICAgID0gbWlucG9zICogMC4xLFxuICAgICAgbHggICAgID0gbG9nMih4ICsgZXBzKSxcbiAgICAgIGx5ICAgICA9IGxvZzIoeSArIGVwcylcbiAgICApICU+JVxuICAgIG11dGF0ZShkaWZmID0gbHkgLSBseCkgJT4lXG4gICAgbXV0YXRlKHVwZG93biA9IGlmZWxzZShkaWZmID4gZGlmZkN1dG9mZiwgXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmYgPCAtZGlmZkN1dG9mZiwgXFxET1dOXFwsIFxcTk9cXCkpKVxuICBkZjMkdXBkb3duIDwtIGZhY3RvcihkZjMkdXBkb3duLCBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIFxuICBwaWVfZGYgPC0gZGYzICU+JVxuICAgIGRwbHlyOjpjb3VudCh1cGRvd24pICU+JVxuICAgIG11dGF0ZShwY3QgICA9IG4gLyBzdW0obikgKiAxMDAsXG4gICAgICAgICAgIGxhYmVsID0gcGFzdGUwKHVwZG93biwgXFxcXG5cXCwgbiwgXFxcXG4oXFwsIHJvdW5kKHBjdCwxKSwgXFwlKVxcKSlcblxuICBwMiA8LSBnZ3Bsb3QocGllX2RmLCBhZXMoeCA9IFxcXFwsIHkgPSBuLCBmaWxsID0gdXBkb3duKSkgK1xuICAgIGdlb21fY29sKGNvbG9yID0gXFx3aGl0ZVxcKSArXG4gICAgY29vcmRfcG9sYXIodGhldGEgPSBcXHlcXCkgK1xuICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBsYWJlbCksXG4gICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLFxuICAgICAgICAgICAgICBzaXplICAgICA9IGZvbnRTaXplTS8yKSArXG4gICAgdGhlbWVfdm9pZCgpICsgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCkgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoc3Ryb25nX3JlZCwgbm9fZ3JleSwgc3Ryb25nX2JsdWUpKVxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxccGllY2hhcnRfXFwsIG5hbWUpKVxuICB3aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuICBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpXG4gIHByaW50KHAyKVxuICBkZXYub2ZmKClcbn1cblxuXG5jb21tb25Mb29wRGlyIDwtIGhlcmUoXFwuLi9kYXRhL2xvb3BfYW5hbHlzaXNcXClcbmZpZ0RpciA8LSBoZXJlKFxcLi4vZmlndXJlL2xvb3BfYW5hbHlzaXNcXClcbmRpci5jcmVhdGUoZmlnRGlyLCBzaG93V2FybmluZ3MgPSBGQUxTRSwgcmVjdXJzaXZlID0gVFJVRSlcblxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsIFxcbG9vcFNjb3JlX2Nocm9tb3NpZ2h0LnRzdlxcKSlcblxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1TXFwsIFxcUy1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxYLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9hbGxfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX2FsbF9kVEFHdkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxTLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9zdHJfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3N0cl9kVEFHdkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxTLVNcXCwgXFxTLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9zdHIyX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9zdHIyX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfb29lX3JlZ19kVEFHdkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2VfcmVnX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtU1xcLCBcXEUtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfb29lX3JlZ1N0cl9kVEFHdkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2VfcmVnU3RyX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5cbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2VfYWxsX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9hbGxfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9zdHJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyMl9BNDg1dkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2Vfc3RyMl9BNDg1dkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ19BNDg1dkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdTdHJfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ1N0cl9BNDg1dkRNU09cXCwgZmlnRGlyKVxuXG5cbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2VfYWxsX0VwaWRUQUd2RXBpRE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9hbGxfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyX0VwaWRUQUd2RXBpRE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9zdHJfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ19FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdTdHJfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ1N0cl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxuXG5cbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2VfYWxsX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9hbGxfQUlEdlVUXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9zdHJfQUlEdlVUXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyMl9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2Vfc3RyMl9BSUR2VVRcXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdfQUlEdlVUXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ19BSUR2VVRcXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdTdHJfQUlEdlVUXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ1N0cl9BSUR2VVRcXCwgZmlnRGlyKVxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
plot_loop_scores <- function(df, col_x, col_y, annoList,
                             name, title, figDir,
                             diffCutoff = 0.5, density_n = 200,
                             xmin = -0.5, xmax = 1,
                             ymin = -0.5, ymax = 1) {
  col_x_q <- enquo(col_x)
  col_y_q <- enquo(col_y)
  
  # Scatterplot
  df2 <- df %>%
    filter(Anno_simple %in% annoList) %>%
    select(id, x = !!col_x_q, y = !!col_y_q) %>%
    mutate(
      minpos = min(c(x, y)[c(x, y) > 0], na.rm = TRUE),
      eps    = minpos * 0.1,
      lx     = log2(x + eps),
      ly     = log2(y + eps),
      density = get_density(lx, ly, n = density_n)
    ) %>%
    arrange(density)
  
  p1 <- ggplot(df2, aes(x = lx, y = ly, color = density)) +
    geom_point() +
    scale_color_viridis() +
    scale_x_continuous(
      name   = paste0(\log2(\, quo_name(col_x_q), \)\)
    ) +
    scale_y_continuous(
      name   = paste0(\log2(\, quo_name(col_y_q), \)\)
    ) +
    coord_fixed() +
    geom_abline(slope = 1, intercept = 0,
                colour = \grey50\, linetype = \dashed\) +
    geom_hline(yintercept = 0, alpha = 0.5, colour = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, colour = \grey\) +
    geom_abline(slope = 1, intercept = -(2**diffCutoff),
                colour = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept = (2**diffCutoff),
                colour = \grey\, linetype = \dotted\) +
    theme_classic() +
    labs(x = quo_name(col_x_q),
         y = quo_name(col_y_q)) +
    ggtitle(title)
  
  fileName <- paste0(\scatterplot_\, name)
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 3.5, height = 3)
  print(p1)
  dev.off()
  
  png(here(figDir, paste0(fileName, \.png\)), 
      width = 3.5, height = 3, units = \in\, res = 600)
  print(p1)
  dev.off()
  
  # Pie chart
  df3 <- df %>%
    filter(Anno_simple %in% annoList) %>%
    select(id, x = !!col_x_q, y = !!col_y_q) %>%
    mutate(
      minpos = min(c(x, y)[c(x, y) > 0], na.rm = TRUE),
      eps    = minpos * 0.1,
      lx     = log2(x + eps),
      ly     = log2(y + eps)
    ) %>%
    mutate(diff = ly - lx) %>%
    mutate(updown = ifelse(diff > diffCutoff, \UP\,
                           ifelse(diff < -diffCutoff, \DOWN\, \NO\)))
  df3$updown <- factor(df3$updown, c(\UP\, \NO\, \DOWN\))
  
  pie_df <- df3 %>%
    dplyr::count(updown) %>%
    mutate(pct   = n / sum(n) * 100,
           label = paste0(updown, \\n\, n, \\n(\, round(pct,1), \%)\))

  p2 <- ggplot(pie_df, aes(x = \\, y = n, fill = updown)) +
    geom_col(color = \white\) +
    coord_polar(theta = \y\) +
    geom_text(aes(label = label),
              position = position_stack(vjust = 0.5),
              size     = fontSizeM/2) +
    theme_void() +   theme(legend.position = \none\) +
    scale_fill_manual(values = c(strong_red, no_grey, strong_blue))
  fileName <- here(figDir, paste0(\piechart_\, name))
  width <- panelSize(2)*mmToInch
  height <- panelSize(2)*mmToInch
  svglite(paste0(fileName, \.svg\), width = width, height = height)
  print(p2)
  dev.off()
}


commonLoopDir <- here(\../data/loop_analysis\)
figDir <- here(\../figure/loop_analysis\)
dir.create(figDir, showWarnings = FALSE, recursive = TRUE)

data <- fread(here(commonLoopDir, \loopScore_chromosight.tsv\))

plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \chromosight_ooe_all_dTAGvDMSO\,
                 title = \chromo_ooe_all_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\S-S\),
                 name = \chromosight_ooe_str_dTAGvDMSO\,
                 title = \chromo_ooe_str_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\S-S\, \S-X\),
                 name = \chromosight_ooe_str2_dTAGvDMSO\,
                 title = \chromo_ooe_str2_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-P\, \P-E\, \E-E\),
                 name = \chromosight_ooe_reg_dTAGvDMSO\,
                 title = \chromo_ooe_reg_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-S\, \E-S\),
                 name = \chromosight_ooe_regStr_dTAGvDMSO\,
                 title = \chromo_ooe_regStr_dTAGvDMSO\, figDir)

plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \chromosight_ooe_all_A485vDMSO\,
                 title = \chromo_ooe_all_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\S-S\),
                 name = \chromosight_ooe_str_A485vDMSO\,
                 title = \chromo_ooe_str_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\S-S\, \S-X\),
                 name = \chromosight_ooe_str2_A485vDMSO\,
                 title = \chromo_ooe_str2_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-P\, \P-E\, \E-E\),
                 name = \chromosight_ooe_reg_A485vDMSO\,
                 title = \chromo_ooe_reg_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-S\, \E-S\),
                 name = \chromosight_ooe_regStr_A485vDMSO\,
                 title = \chromo_ooe_regStr_A485vDMSO\, figDir)


plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \chromosight_ooe_all_EpidTAGvEpiDMSO\,
                 title = \chromo_ooe_all_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\S-S\),
                 name = \chromosight_ooe_str_EpidTAGvEpiDMSO\,
                 title = \chromo_ooe_str_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\S-S\, \S-X\),
                 name = \chromosight_ooe_str2_EpidTAGvEpiDMSO\,
                 title = \chromo_ooe_str2_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-P\, \P-E\, \E-E\),
                 name = \chromosight_ooe_reg_EpidTAGvEpiDMSO\,
                 title = \chromo_ooe_reg_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-S\, \E-S\),
                 name = \chromosight_ooe_regStr_EpidTAGvEpiDMSO\,
                 title = \chromo_ooe_regStr_EpidTAGvEpiDMSO\, figDir)


plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \chromosight_ooe_all_AIDvUT\,
                 title = \chromo_ooe_all_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\S-S\),
                 name = \chromosight_ooe_str_AIDvUT\,
                 title = \chromo_ooe_str_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\S-S\, \S-X\),
                 name = \chromosight_ooe_str2_AIDvUT\,
                 title = \chromo_ooe_str2_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-P\, \P-E\, \E-E\),
                 name = \chromosight_ooe_reg_AIDvUT\,
                 title = \chromo_ooe_reg_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-S\, \E-S\),
                 name = \chromosight_ooe_regStr_AIDvUT\,
                 title = \chromo_ooe_regStr_AIDvUT\, figDir)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3lBOExTQm1kVzVqZEdsdmJpaGtaaXdnWTI5c1gzZ3NJR052YkY5NUxDQmhibTV2VEdsemRDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTd2dkR2wwYkdVc0lHWnBaMFJwY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2xtWmtOMWRHOW1aaUE5SURBdU5Td2daR1Z1YzJsMGVWOXVJRDBnTWpBd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I0YldsdUlEMGdMVEF1TlN3Z2VHMWhlQ0E5SURFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSGx0YVc0Z1BTQXRNQzQxTENCNWJXRjRJRDBnTVNrZ2UxeHVJQ0JqYjJ4ZmVGOXhJRHd0SUdWdWNYVnZLR052YkY5NEtWeHVJQ0JqYjJ4ZmVWOXhJRHd0SUdWdWNYVnZLR052YkY5NUtWeHVJQ0JjYmlBZ0l5QlRZMkYwZEdWeWNHeHZkRnh1SUNCa1pqSWdQQzBnWkdZZ0pUNGxYRzRnSUNBZ1ptbHNkR1Z5S0VGdWJtOWZjMmx0Y0d4bElDVnBiaVVnWVc1dWIweHBjM1FwSUNVK0pWeHVJQ0FnSUhObGJHVmpkQ2hwWkN3Z2VDQTlJQ0VoWTI5c1gzaGZjU3dnZVNBOUlDRWhZMjlzWDNsZmNTa2dKVDRsWEc0Z0lDQWdiWFYwWVhSbEtGeHVJQ0FnSUNBZ2JXbHVjRzl6SUQwZ2JXbHVLR01vZUN3Z2VTbGJZeWg0TENCNUtTQStJREJkTENCdVlTNXliU0E5SUZSU1ZVVXBMRnh1SUNBZ0lDQWdaWEJ6SUNBZ0lEMGdiV2x1Y0c5eklDb2dNQzR4TEZ4dUlDQWdJQ0FnYkhnZ0lDQWdJRDBnYkc5bk1paDRJQ3NnWlhCektTeGNiaUFnSUNBZ0lHeDVJQ0FnSUNBOUlHeHZaeklvZVNBcklHVndjeWtzWEc0Z0lDQWdJQ0JrWlc1emFYUjVJRDBnWjJWMFgyUmxibk5wZEhrb2JIZ3NJR3g1TENCdUlEMGdaR1Z1YzJsMGVWOXVLVnh1SUNBZ0lDa2dKVDRsWEc0Z0lDQWdZWEp5WVc1blpTaGtaVzV6YVhSNUtWeHVJQ0JjYmlBZ2NERWdQQzBnWjJkd2JHOTBLR1JtTWl3Z1lXVnpLSGdnUFNCc2VDd2dlU0E5SUd4NUxDQmpiMnh2Y2lBOUlHUmxibk5wZEhrcEtTQXJYRzRnSUNBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3RjYmlBZ0lDQnpZMkZzWlY5amIyeHZjbDkyYVhKcFpHbHpLQ2tnSzF4dUlDQWdJSE5qWVd4bFgzaGZZMjl1ZEdsdWRXOTFjeWhjYmlBZ0lDQWdJRzVoYldVZ0lDQTlJSEJoYzNSbE1DaGNYR3h2WnpJb1hGd3NJSEYxYjE5dVlXMWxLR052YkY5NFgzRXBMQ0JjWENsY1hDbGNiaUFnSUNBcElDdGNiaUFnSUNCelkyRnNaVjk1WDJOdmJuUnBiblZ2ZFhNb1hHNGdJQ0FnSUNCdVlXMWxJQ0FnUFNCd1lYTjBaVEFvWEZ4c2IyY3lLRnhjTENCeGRXOWZibUZ0WlNoamIyeGZlVjl4S1N3Z1hGd3BYRndwWEc0Z0lDQWdLU0FyWEc0Z0lDQWdZMjl2Y21SZlptbDRaV1FvS1NBclhHNGdJQ0FnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0F3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOTFjaUE5SUZ4Y1ozSmxlVFV3WEZ3c0lHeHBibVYwZVhCbElEMGdYRnhrWVhOb1pXUmNYQ2tnSzF4dUlDQWdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZkWElnUFNCY1hHZHlaWGxjWENrZ0sxeHVJQ0FnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2ZFhJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNBZ0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ0xTZ3lLaXBrYVdabVEzVjBiMlptS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyeHZkWElnUFNCY1hHZHlaWGxjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1J2ZEhSbFpGeGNLU0FyWEc0Z0lDQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQW9NaW9xWkdsbVprTjFkRzltWmlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM1Z5SUQwZ1hGeG5jbVY1WEZ3c0lHeHBibVYwZVhCbElEMGdYRnhrYjNSMFpXUmNYQ2tnSzF4dUlDQWdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJYRzRnSUNBZ2JHRmljeWg0SUQwZ2NYVnZYMjVoYldVb1kyOXNYM2hmY1Nrc1hHNGdJQ0FnSUNBZ0lDQjVJRDBnY1hWdlgyNWhiV1VvWTI5c1gzbGZjU2twSUN0Y2JpQWdJQ0JuWjNScGRHeGxLSFJwZEd4bEtWeHVJQ0JjYmlBZ1ptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNjMk5oZEhSbGNuQnNiM1JmWEZ3c0lHNWhiV1VwWEc0Z0lITjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnWEc0Z0lDQWdJQ0FnSUNBZ2QybGtkR2dnUFNBekxqVXNJR2hsYVdkb2RDQTlJRE1wWEc0Z0lIQnlhVzUwS0hBeEtWeHVJQ0JrWlhZdWIyWm1LQ2xjYmlBZ1hHNGdJSEJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0JjYmlBZ0lDQWdJSGRwWkhSb0lEMGdNeTQxTENCb1pXbG5hSFFnUFNBekxDQjFibWwwY3lBOUlGeGNhVzVjWEN3Z2NtVnpJRDBnTmpBd0tWeHVJQ0J3Y21sdWRDaHdNU2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJRnh1SUNBaklGQnBaU0JqYUdGeWRGeHVJQ0JrWmpNZ1BDMGdaR1lnSlQ0bFhHNGdJQ0FnWm1sc2RHVnlLRUZ1Ym05ZmMybHRjR3hsSUNWcGJpVWdZVzV1YjB4cGMzUXBJQ1UrSlZ4dUlDQWdJSE5sYkdWamRDaHBaQ3dnZUNBOUlDRWhZMjlzWDNoZmNTd2dlU0E5SUNFaFkyOXNYM2xmY1NrZ0pUNGxYRzRnSUNBZ2JYVjBZWFJsS0Z4dUlDQWdJQ0FnYldsdWNHOXpJRDBnYldsdUtHTW9lQ3dnZVNsYll5aDRMQ0I1S1NBK0lEQmRMQ0J1WVM1eWJTQTlJRlJTVlVVcExGeHVJQ0FnSUNBZ1pYQnpJQ0FnSUQwZ2JXbHVjRzl6SUNvZ01DNHhMRnh1SUNBZ0lDQWdiSGdnSUNBZ0lEMGdiRzluTWloNElDc2daWEJ6S1N4Y2JpQWdJQ0FnSUd4NUlDQWdJQ0E5SUd4dlp6SW9lU0FySUdWd2N5bGNiaUFnSUNBcElDVStKVnh1SUNBZ0lHMTFkR0YwWlNoa2FXWm1JRDBnYkhrZ0xTQnNlQ2tnSlQ0bFhHNGdJQ0FnYlhWMFlYUmxLSFZ3Wkc5M2JpQTlJR2xtWld4elpTaGthV1ptSUQ0Z1pHbG1aa04xZEc5bVppd2dYRnhWVUZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHUnBabVlnUENBdFpHbG1aa04xZEc5bVppd2dYRnhFVDFkT1hGd3NJRnhjVGs5Y1hDa3BLVnh1SUNCa1pqTWtkWEJrYjNkdUlEd3RJR1poWTNSdmNpaGtaak1rZFhCa2IzZHVMQ0JqS0Z4Y1ZWQmNYQ3dnWEZ4T1QxeGNMQ0JjWEVSUFYwNWNYQ2twWEc0Z0lGeHVJQ0J3YVdWZlpHWWdQQzBnWkdZeklDVStKVnh1SUNBZ0lHUndiSGx5T2pwamIzVnVkQ2gxY0dSdmQyNHBJQ1UrSlZ4dUlDQWdJRzExZEdGMFpTaHdZM1FnSUNBOUlHNGdMeUJ6ZFcwb2Jpa2dLaUF4TURBc1hHNGdJQ0FnSUNBZ0lDQWdJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tIVndaRzkzYml3Z1hGeGNYRzVjWEN3Z2Jpd2dYRnhjWEc0b1hGd3NJSEp2ZFc1a0tIQmpkQ3d4S1N3Z1hGd2xLVnhjS1NsY2JseHVJQ0J3TWlBOExTQm5aM0JzYjNRb2NHbGxYMlJtTENCaFpYTW9lQ0E5SUZ4Y1hGd3NJSGtnUFNCdUxDQm1hV3hzSUQwZ2RYQmtiM2R1S1NrZ0sxeHVJQ0FnSUdkbGIyMWZZMjlzS0dOdmJHOXlJRDBnWEZ4M2FHbDBaVnhjS1NBclhHNGdJQ0FnWTI5dmNtUmZjRzlzWVhJb2RHaGxkR0VnUFNCY1hIbGNYQ2tnSzF4dUlDQWdJR2RsYjIxZmRHVjRkQ2hoWlhNb2JHRmlaV3dnUFNCc1lXSmxiQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSEJ2YzJsMGFXOXVJRDBnY0c5emFYUnBiMjVmYzNSaFkyc29kbXAxYzNRZ1BTQXdMalVwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0J6YVhwbElDQWdJQ0E5SUdadmJuUlRhWHBsVFM4eUtTQXJYRzRnSUNBZ2RHaGxiV1ZmZG05cFpDZ3BJQ3NnSUNCMGFHVnRaU2hzWldkbGJtUXVjRzl6YVhScGIyNGdQU0JjWEc1dmJtVmNYQ2tnSzF4dUlDQWdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vYzNSeWIyNW5YM0psWkN3Z2JtOWZaM0psZVN3Z2MzUnliMjVuWDJKc2RXVXBLVnh1SUNCbWFXeGxUbUZ0WlNBOExTQm9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLRnhjY0dsbFkyaGhjblJmWEZ3c0lHNWhiV1VwS1Z4dUlDQjNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NaWtxYlcxVWIwbHVZMmhjYmlBZ2FHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3lLU3B0YlZSdlNXNWphRnh1SUNCemRtZHNhWFJsS0hCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwTENCM2FXUjBhQ0E5SUhkcFpIUm9MQ0JvWldsbmFIUWdQU0JvWldsbmFIUXBYRzRnSUhCeWFXNTBLSEF5S1Z4dUlDQmtaWFl1YjJabUtDbGNibjFjYmx4dVhHNWpiMjF0YjI1TWIyOXdSR2x5SUR3dElHaGxjbVVvWEZ3dUxpOWtZWFJoTDJ4dmIzQmZZVzVoYkhsemFYTmNYQ2xjYm1acFowUnBjaUE4TFNCb1pYSmxLRnhjTGk0dlptbG5kWEpsTDJ4dmIzQmZZVzVoYkhsemFYTmNYQ2xjYm1ScGNpNWpjbVZoZEdVb1ptbG5SR2x5TENCemFHOTNWMkZ5Ym1sdVozTWdQU0JHUVV4VFJTd2djbVZqZFhKemFYWmxJRDBnVkZKVlJTbGNibHh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0dOdmJXMXZia3h2YjNCRWFYSXNJRnhjYkc5dmNGTmpiM0psWDJOb2NtOXRiM05wWjJoMExuUnpkbHhjS1NsY2JseHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZSRTFUVHl3Z2IyOWxYMlJVUVVjc0lHTW9YRnhRTFZCY1hDd2dYRnhRTFVWY1hDd2dYRnhRTFZOY1hDd2dYRnhRTFZoY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hFVXRSVnhjTENCY1hFVXRVMXhjTENCY1hFVXRXRnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjVXkxVFhGd3NJRnhjVXkxWVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeFlMVmhjWENrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY1hHTm9jbTl0YjNOcFoyaDBYMjl2WlY5aGJHeGZaRlJCUjNaRVRWTlBYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWEZ4amFISnZiVzlmYjI5bFgyRnNiRjlrVkVGSGRrUk5VMDljWEN3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlJFMVRUeXdnYjI5bFgyUlVRVWNzSUdNb1hGeFRMVk5jWENrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY1hHTm9jbTl0YjNOcFoyaDBYMjl2WlY5emRISmZaRlJCUjNaRVRWTlBYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWEZ4amFISnZiVzlmYjI5bFgzTjBjbDlrVkVGSGRrUk5VMDljWEN3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlJFMVRUeXdnYjI5bFgyUlVRVWNzSUdNb1hGeFRMVk5jWEN3Z1hGeFRMVmhjWENrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY1hHTm9jbTl0YjNOcFoyaDBYMjl2WlY5emRISXlYMlJVUVVkMlJFMVRUMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ4Y1kyaHliMjF2WDI5dlpWOXpkSEl5WDJSVVFVZDJSRTFUVDF4Y0xDQm1hV2RFYVhJcFhHNXdiRzkwWDJ4dmIzQmZjMk52Y21WektHUmhkR0VzSUc5dlpWOUVUVk5QTENCdmIyVmZaRlJCUnl3Z1l5aGNYRkF0VUZ4Y0xDQmNYRkF0UlZ4Y0xDQmNYRVV0UlZ4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGeGNZMmh5YjIxdmMybG5hSFJmYjI5bFgzSmxaMTlrVkVGSGRrUk5VMDljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY1hHTm9jbTl0YjE5dmIyVmZjbVZuWDJSVVFVZDJSRTFUVDF4Y0xDQm1hV2RFYVhJcFhHNXdiRzkwWDJ4dmIzQmZjMk52Y21WektHUmhkR0VzSUc5dlpWOUVUVk5QTENCdmIyVmZaRlJCUnl3Z1l5aGNYRkF0VTF4Y0xDQmNYRVV0VTF4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGeGNZMmh5YjIxdmMybG5hSFJmYjI5bFgzSmxaMU4wY2w5a1ZFRkhka1JOVTA5Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNYR05vY205dGIxOXZiMlZmY21WblUzUnlYMlJVUVVkMlJFMVRUMXhjTENCbWFXZEVhWElwWEc1Y2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwUk5VMDhzSUc5dlpWOUJORGcxTENCaktGeGNVQzFRWEZ3c0lGeGNVQzFGWEZ3c0lGeGNVQzFUWEZ3c0lGeGNVQzFZWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4RkxVVmNYQ3dnWEZ4RkxWTmNYQ3dnWEZ4RkxWaGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRk10VTF4Y0xDQmNYRk10V0Z4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y1dDMVlYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWEZ4amFISnZiVzl6YVdkb2RGOXZiMlZmWVd4c1gwRTBPRFYyUkUxVFQxeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYVhSc1pTQTlJRnhjWTJoeWIyMXZYMjl2WlY5aGJHeGZRVFE0TlhaRVRWTlBYRndzSUdacFowUnBjaWxjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDBSTlUwOHNJRzl2WlY5Qk5EZzFMQ0JqS0Z4Y1V5MVRYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWEZ4amFISnZiVzl6YVdkb2RGOXZiMlZmYzNSeVgwRTBPRFYyUkUxVFQxeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYVhSc1pTQTlJRnhjWTJoeWIyMXZYMjl2WlY5emRISmZRVFE0TlhaRVRWTlBYRndzSUdacFowUnBjaWxjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDBSTlUwOHNJRzl2WlY5Qk5EZzFMQ0JqS0Z4Y1V5MVRYRndzSUZ4Y1V5MVlYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWEZ4amFISnZiVzl6YVdkb2RGOXZiMlZmYzNSeU1sOUJORGcxZGtSTlUwOWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdsMGJHVWdQU0JjWEdOb2NtOXRiMTl2YjJWZmMzUnlNbDlCTkRnMWRrUk5VMDljWEN3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlJFMVRUeXdnYjI5bFgwRTBPRFVzSUdNb1hGeFFMVkJjWEN3Z1hGeFFMVVZjWEN3Z1hGeEZMVVZjWENrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY1hHTm9jbTl0YjNOcFoyaDBYMjl2WlY5eVpXZGZRVFE0TlhaRVRWTlBYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWEZ4amFISnZiVzlmYjI5bFgzSmxaMTlCTkRnMWRrUk5VMDljWEN3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlJFMVRUeXdnYjI5bFgwRTBPRFVzSUdNb1hGeFFMVk5jWEN3Z1hGeEZMVk5jWENrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY1hHTm9jbTl0YjNOcFoyaDBYMjl2WlY5eVpXZFRkSEpmUVRRNE5YWkVUVk5QWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBkR3hsSUQwZ1hGeGphSEp2Ylc5ZmIyOWxYM0psWjFOMGNsOUJORGcxZGtSTlUwOWNYQ3dnWm1sblJHbHlLVnh1WEc1Y2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwVndhVVJOVTA4c0lHOXZaVjlGY0dsa1ZFRkhMQ0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndzSUZ4Y1VDMVRYRndzSUZ4Y1VDMVlYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnhGTFVWY1hDd2dYRnhGTFZOY1hDd2dYRnhGTFZoY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hGTXRVMXhjTENCY1hGTXRXRnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjV0MxWVhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYRnhqYUhKdmJXOXphV2RvZEY5dmIyVmZZV3hzWDBWd2FXUlVRVWQyUlhCcFJFMVRUMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ4Y1kyaHliMjF2WDI5dlpWOWhiR3hmUlhCcFpGUkJSM1pGY0dsRVRWTlBYRndzSUdacFowUnBjaWxjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDBWd2FVUk5VMDhzSUc5dlpWOUZjR2xrVkVGSExDQmpLRnhjVXkxVFhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYRnhqYUhKdmJXOXphV2RvZEY5dmIyVmZjM1J5WDBWd2FXUlVRVWQyUlhCcFJFMVRUMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ4Y1kyaHliMjF2WDI5dlpWOXpkSEpmUlhCcFpGUkJSM1pGY0dsRVRWTlBYRndzSUdacFowUnBjaWxjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDBWd2FVUk5VMDhzSUc5dlpWOUZjR2xrVkVGSExDQmpLRnhjVXkxVFhGd3NJRnhjVXkxWVhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYRnhqYUhKdmJXOXphV2RvZEY5dmIyVmZjM1J5TWw5RmNHbGtWRUZIZGtWd2FVUk5VMDljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY1hHTm9jbTl0YjE5dmIyVmZjM1J5TWw5RmNHbGtWRUZIZGtWd2FVUk5VMDljWEN3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlJYQnBSRTFUVHl3Z2IyOWxYMFZ3YVdSVVFVY3NJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4RkxVVmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjWEdOb2NtOXRiM05wWjJoMFgyOXZaVjl5WldkZlJYQnBaRlJCUjNaRmNHbEVUVk5QWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBkR3hsSUQwZ1hGeGphSEp2Ylc5ZmIyOWxYM0psWjE5RmNHbGtWRUZIZGtWd2FVUk5VMDljWEN3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlJYQnBSRTFUVHl3Z2IyOWxYMFZ3YVdSVVFVY3NJR01vWEZ4UUxWTmNYQ3dnWEZ4RkxWTmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjWEdOb2NtOXRiM05wWjJoMFgyOXZaVjl5WldkVGRISmZSWEJwWkZSQlIzWkZjR2xFVFZOUFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYRnhqYUhKdmJXOWZiMjlsWDNKbFoxTjBjbDlGY0dsa1ZFRkhka1Z3YVVSTlUwOWNYQ3dnWm1sblJHbHlLVnh1WEc1Y2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgxVlVMQ0J2YjJWZlFVbEVMQ0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndzSUZ4Y1VDMVRYRndzSUZ4Y1VDMVlYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnhGTFVWY1hDd2dYRnhGTFZOY1hDd2dYRnhGTFZoY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hGTXRVMXhjTENCY1hGTXRXRnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjV0MxWVhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYRnhqYUhKdmJXOXphV2RvZEY5dmIyVmZZV3hzWDBGSlJIWlZWRnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ4Y1kyaHliMjF2WDI5dlpWOWhiR3hmUVVsRWRsVlVYRndzSUdacFowUnBjaWxjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDFWVUxDQnZiMlZmUVVsRUxDQmpLRnhjVXkxVFhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYRnhqYUhKdmJXOXphV2RvZEY5dmIyVmZjM1J5WDBGSlJIWlZWRnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ4Y1kyaHliMjF2WDI5dlpWOXpkSEpmUVVsRWRsVlVYRndzSUdacFowUnBjaWxjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDFWVUxDQnZiMlZmUVVsRUxDQmpLRnhjVXkxVFhGd3NJRnhjVXkxWVhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYRnhqYUhKdmJXOXphV2RvZEY5dmIyVmZjM1J5TWw5QlNVUjJWVlJjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY1hHTm9jbTl0YjE5dmIyVmZjM1J5TWw5QlNVUjJWVlJjWEN3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlZWUXNJRzl2WlY5QlNVUXNJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4RkxVVmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjWEdOb2NtOXRiM05wWjJoMFgyOXZaVjl5WldkZlFVbEVkbFZVWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBkR3hsSUQwZ1hGeGphSEp2Ylc5ZmIyOWxYM0psWjE5QlNVUjJWVlJjWEN3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlZWUXNJRzl2WlY5QlNVUXNJR01vWEZ4UUxWTmNYQ3dnWEZ4RkxWTmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjWEdOb2NtOXRiM05wWjJoMFgyOXZaVjl5WldkVGRISmZRVWxFZGxWVVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYRnhqYUhKdmJXOWZiMjlsWDNKbFoxTjBjbDlCU1VSMlZWUmNYQ3dnWm1sblJHbHlLVnh1WEc1Y2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbnBsb3RfbG9vcF9zY29yZXMgPC0gZnVuY3Rpb24oZGYsIGNvbF94LCBjb2xfeSwgYW5ub0xpc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHRpdGxlLCBmaWdEaXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjUsIGRlbnNpdHlfbiA9IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1pbiA9IC0wLjUsIHhtYXggPSAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWluID0gLTAuNSwgeW1heCA9IDEpIHtcbiAgY29sX3hfcSA8LSBlbnF1byhjb2xfeClcbiAgY29sX3lfcSA8LSBlbnF1byhjb2xfeSlcbiAgXG4gICMgU2NhdHRlcnBsb3RcbiAgZGYyIDwtIGRmICU+JVxuICAgIGZpbHRlcihBbm5vX3NpbXBsZSAlaW4lIGFubm9MaXN0KSAlPiVcbiAgICBzZWxlY3QoaWQsIHggPSAhIWNvbF94X3EsIHkgPSAhIWNvbF95X3EpICU+JVxuICAgIG11dGF0ZShcbiAgICAgIG1pbnBvcyA9IG1pbihjKHgsIHkpW2MoeCwgeSkgPiAwXSwgbmEucm0gPSBUUlVFKSxcbiAgICAgIGVwcyAgICA9IG1pbnBvcyAqIDAuMSxcbiAgICAgIGx4ICAgICA9IGxvZzIoeCArIGVwcyksXG4gICAgICBseSAgICAgPSBsb2cyKHkgKyBlcHMpLFxuICAgICAgZGVuc2l0eSA9IGdldF9kZW5zaXR5KGx4LCBseSwgbiA9IGRlbnNpdHlfbilcbiAgICApICU+JVxuICAgIGFycmFuZ2UoZGVuc2l0eSlcbiAgXG4gIHAxIDwtIGdncGxvdChkZjIsIGFlcyh4ID0gbHgsIHkgPSBseSwgY29sb3IgPSBkZW5zaXR5KSkgK1xuICAgIGdlb21fcG9pbnQoKSArXG4gICAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgICBzY2FsZV94X2NvbnRpbnVvdXMoXG4gICAgICBuYW1lICAgPSBwYXN0ZTAoXFxsb2cyKFxcLCBxdW9fbmFtZShjb2xfeF9xKSwgXFwpXFwpXG4gICAgKSArXG4gICAgc2NhbGVfeV9jb250aW51b3VzKFxuICAgICAgbmFtZSAgID0gcGFzdGUwKFxcbG9nMihcXCwgcXVvX25hbWUoY29sX3lfcSksIFxcKVxcKVxuICAgICkgK1xuICAgIGNvb3JkX2ZpeGVkKCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCxcbiAgICAgICAgICAgICAgICBjb2xvdXIgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3VyID0gXFxncmV5XFwpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3VyID0gXFxncmV5XFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC0oMioqZGlmZkN1dG9mZiksXG4gICAgICAgICAgICAgICAgY29sb3VyID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gKDIqKmRpZmZDdXRvZmYpLFxuICAgICAgICAgICAgICAgIGNvbG91ciA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIGxhYnMoeCA9IHF1b19uYW1lKGNvbF94X3EpLFxuICAgICAgICAgeSA9IHF1b19uYW1lKGNvbF95X3EpKSArXG4gICAgZ2d0aXRsZSh0aXRsZSlcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHNjYXR0ZXJwbG90X1xcLCBuYW1lKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICAgIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG4gIFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgXG4gICAgICB3aWR0aCA9IDMuNSwgaGVpZ2h0ID0gMywgdW5pdHMgPSBcXGluXFwsIHJlcyA9IDYwMClcbiAgcHJpbnQocDEpXG4gIGRldi5vZmYoKVxuICBcbiAgIyBQaWUgY2hhcnRcbiAgZGYzIDwtIGRmICU+JVxuICAgIGZpbHRlcihBbm5vX3NpbXBsZSAlaW4lIGFubm9MaXN0KSAlPiVcbiAgICBzZWxlY3QoaWQsIHggPSAhIWNvbF94X3EsIHkgPSAhIWNvbF95X3EpICU+JVxuICAgIG11dGF0ZShcbiAgICAgIG1pbnBvcyA9IG1pbihjKHgsIHkpW2MoeCwgeSkgPiAwXSwgbmEucm0gPSBUUlVFKSxcbiAgICAgIGVwcyAgICA9IG1pbnBvcyAqIDAuMSxcbiAgICAgIGx4ICAgICA9IGxvZzIoeCArIGVwcyksXG4gICAgICBseSAgICAgPSBsb2cyKHkgKyBlcHMpXG4gICAgKSAlPiVcbiAgICBtdXRhdGUoZGlmZiA9IGx5IC0gbHgpICU+JVxuICAgIG11dGF0ZSh1cGRvd24gPSBpZmVsc2UoZGlmZiA+IGRpZmZDdXRvZmYsIFxcVVBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmIDwgLWRpZmZDdXRvZmYsIFxcRE9XTlxcLCBcXE5PXFwpKSlcbiAgZGYzJHVwZG93biA8LSBmYWN0b3IoZGYzJHVwZG93biwgYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpKVxuICBcbiAgcGllX2RmIDwtIGRmMyAlPiVcbiAgICBkcGx5cjo6Y291bnQodXBkb3duKSAlPiVcbiAgICBtdXRhdGUocGN0ICAgPSBuIC8gc3VtKG4pICogMTAwLFxuICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCh1cGRvd24sIFxcXFxuXFwsIG4sIFxcXFxuKFxcLCByb3VuZChwY3QsMSksIFxcJSlcXCkpXG5cbiAgcDIgPC0gZ2dwbG90KHBpZV9kZiwgYWVzKHggPSBcXFxcLCB5ID0gbiwgZmlsbCA9IHVwZG93bikpICtcbiAgICBnZW9tX2NvbChjb2xvciA9IFxcd2hpdGVcXCkgK1xuICAgIGNvb3JkX3BvbGFyKHRoZXRhID0gXFx5XFwpICtcbiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbGFiZWwpLFxuICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSxcbiAgICAgICAgICAgICAgc2l6ZSAgICAgPSBmb250U2l6ZU0vMikgK1xuICAgIHRoZW1lX3ZvaWQoKSArICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKHN0cm9uZ19yZWQsIG5vX2dyZXksIHN0cm9uZ19ibHVlKSlcbiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXHBpZWNoYXJ0X1xcLCBuYW1lKSlcbiAgd2lkdGggPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbiAgc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KVxuICBwcmludChwMilcbiAgZGV2Lm9mZigpXG59XG5cblxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5maWdEaXIgPC0gaGVyZShcXC4uL2ZpZ3VyZS9sb29wX2FuYWx5c2lzXFwpXG5kaXIuY3JlYXRlKGZpZ0Rpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpXG5cbmRhdGEgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcXGxvb3BTY29yZV9jaHJvbW9zaWdodC50c3ZcXCkpXG5cbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2VfYWxsX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9hbGxfZFRBR3ZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9zdHJfZFRBR3ZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyMl9kVEFHdkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2Vfc3RyMl9kVEFHdkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ19kVEFHdkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdTdHJfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ1N0cl9kVEFHdkRNU09cXCwgZmlnRGlyKVxuXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfb29lX2FsbF9BNDg1dkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2VfYWxsX0E0ODV2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFMtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfb29lX3N0cl9BNDg1dkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2Vfc3RyX0E0ODV2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFMtU1xcLCBcXFMtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfb29lX3N0cjJfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3N0cjJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2VfcmVnX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9yZWdfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUC1TXFwsIFxcRS1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2VfcmVnU3RyX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9yZWdTdHJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcblxuXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9FcGlETVNPLCBvb2VfRXBpZFRBRywgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfb29lX2FsbF9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2VfYWxsX0VwaWRUQUd2RXBpRE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9FcGlETVNPLCBvb2VfRXBpZFRBRywgYyhcXFMtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfb29lX3N0cl9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2Vfc3RyX0VwaWRUQUd2RXBpRE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9FcGlETVNPLCBvb2VfRXBpZFRBRywgYyhcXFMtU1xcLCBcXFMtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfb29lX3N0cjJfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3N0cjJfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2VfcmVnX0VwaWRUQUd2RXBpRE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9yZWdfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1TXFwsIFxcRS1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2VfcmVnU3RyX0VwaWRUQUd2RXBpRE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9yZWdTdHJfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcblxuXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfb29lX2FsbF9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2VfYWxsX0FJRHZVVFxcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYyhcXFMtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfb29lX3N0cl9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2Vfc3RyX0FJRHZVVFxcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYyhcXFMtU1xcLCBcXFMtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfb29lX3N0cjJfQUlEdlVUXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3N0cjJfQUlEdlVUXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2VfcmVnX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9yZWdfQUlEdlVUXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUC1TXFwsIFxcRS1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2VfcmVnU3RyX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9yZWdTdHJfQUlEdlVUXFwsIGZpZ0RpcilcblxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucGxvdF9sb29wX3Njb3JlcyA8LSBmdW5jdGlvbihkZiwgY29sX3gsIGNvbF95LCBhbm5vTGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdGl0bGUsIGZpZ0RpcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuNSwgZGVuc2l0eV9uID0gMjAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWluID0gLTAuNSwgeG1heCA9IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltaW4gPSAtMC41LCB5bWF4ID0gMSkge1xuICBjb2xfeF9xIDwtIGVucXVvKGNvbF94KVxuICBjb2xfeV9xIDwtIGVucXVvKGNvbF95KVxuICBcbiAgIyBTY2F0dGVycGxvdFxuICBkZjIgPC0gZGYgJT4lXG4gICAgZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYW5ub0xpc3QpICU+JVxuICAgIHNlbGVjdChpZCwgeCA9ICEhY29sX3hfcSwgeSA9ICEhY29sX3lfcSkgJT4lXG4gICAgbXV0YXRlKFxuICAgICAgbWlucG9zID0gbWluKGMoeCwgeSlbYyh4LCB5KSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgICAgZXBzICAgID0gbWlucG9zICogMC4xLFxuICAgICAgbHggICAgID0gbG9nMih4ICsgZXBzKSxcbiAgICAgIGx5ICAgICA9IGxvZzIoeSArIGVwcyksXG4gICAgICBkZW5zaXR5ID0gZ2V0X2RlbnNpdHkobHgsIGx5LCBuID0gZGVuc2l0eV9uKVxuICAgICkgJT4lXG4gICAgYXJyYW5nZShkZW5zaXR5KVxuICBcbiAgcDEgPC0gZ2dwbG90KGRmMiwgYWVzKHggPSBseCwgeSA9IGx5LCBjb2xvciA9IGRlbnNpdHkpKSArXG4gICAgZ2VvbV9wb2ludCgpICtcbiAgICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICAgIHNjYWxlX3hfY29udGludW91cyhcbiAgICAgIG5hbWUgICA9IHBhc3RlMChcXGxvZzIoXFwsIHF1b19uYW1lKGNvbF94X3EpLCBcXClcXClcbiAgICApICtcbiAgICBzY2FsZV95X2NvbnRpbnVvdXMoXG4gICAgICBuYW1lICAgPSBwYXN0ZTAoXFxsb2cyKFxcLCBxdW9fbmFtZShjb2xfeV9xKSwgXFwpXFwpXG4gICAgKSArXG4gICAgY29vcmRfZml4ZWQoKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgICAgIGNvbG91ciA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvdXIgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvdXIgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLSgyKipkaWZmQ3V0b2ZmKSxcbiAgICAgICAgICAgICAgICBjb2xvdXIgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAoMioqZGlmZkN1dG9mZiksXG4gICAgICAgICAgICAgICAgY29sb3VyID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgbGFicyh4ID0gcXVvX25hbWUoY29sX3hfcSksXG4gICAgICAgICB5ID0gcXVvX25hbWUoY29sX3lfcSkpICtcbiAgICBnZ3RpdGxlKHRpdGxlKVxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2NhdHRlcnBsb3RfXFwsIG5hbWUpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgXG4gICAgICAgICAgd2lkdGggPSAzLjUsIGhlaWdodCA9IDMpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbiAgXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBcbiAgICAgIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzLCB1bml0cyA9IFxcaW5cXCwgcmVzID0gNjAwKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG4gIFxuICAjIFBpZSBjaGFydFxuICBkZjMgPC0gZGYgJT4lXG4gICAgZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYW5ub0xpc3QpICU+JVxuICAgIHNlbGVjdChpZCwgeCA9ICEhY29sX3hfcSwgeSA9ICEhY29sX3lfcSkgJT4lXG4gICAgbXV0YXRlKFxuICAgICAgbWlucG9zID0gbWluKGMoeCwgeSlbYyh4LCB5KSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgICAgZXBzICAgID0gbWlucG9zICogMC4xLFxuICAgICAgbHggICAgID0gbG9nMih4ICsgZXBzKSxcbiAgICAgIGx5ICAgICA9IGxvZzIoeSArIGVwcylcbiAgICApICU+JVxuICAgIG11dGF0ZShkaWZmID0gbHkgLSBseCkgJT4lXG4gICAgbXV0YXRlKHVwZG93biA9IGlmZWxzZShkaWZmID4gZGlmZkN1dG9mZiwgXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmYgPCAtZGlmZkN1dG9mZiwgXFxET1dOXFwsIFxcTk9cXCkpKVxuICBkZjMkdXBkb3duIDwtIGZhY3RvcihkZjMkdXBkb3duLCBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIFxuICBwaWVfZGYgPC0gZGYzICU+JVxuICAgIGRwbHlyOjpjb3VudCh1cGRvd24pICU+JVxuICAgIG11dGF0ZShwY3QgICA9IG4gLyBzdW0obikgKiAxMDAsXG4gICAgICAgICAgIGxhYmVsID0gcGFzdGUwKHVwZG93biwgXFxcXG5cXCwgbiwgXFxcXG4oXFwsIHJvdW5kKHBjdCwxKSwgXFwlKVxcKSlcblxuICBwMiA8LSBnZ3Bsb3QocGllX2RmLCBhZXMoeCA9IFxcXFwsIHkgPSBuLCBmaWxsID0gdXBkb3duKSkgK1xuICAgIGdlb21fY29sKGNvbG9yID0gXFx3aGl0ZVxcKSArXG4gICAgY29vcmRfcG9sYXIodGhldGEgPSBcXHlcXCkgK1xuICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBsYWJlbCksXG4gICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLFxuICAgICAgICAgICAgICBzaXplICAgICA9IGZvbnRTaXplTS8yKSArXG4gICAgdGhlbWVfdm9pZCgpICsgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCkgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoc3Ryb25nX3JlZCwgbm9fZ3JleSwgc3Ryb25nX2JsdWUpKVxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxccGllY2hhcnRfXFwsIG5hbWUpKVxuICB3aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuICBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpXG4gIHByaW50KHAyKVxuICBkZXYub2ZmKClcbn1cblxuXG5jb21tb25Mb29wRGlyIDwtIGhlcmUoXFwuLi9kYXRhL2xvb3BfYW5hbHlzaXNcXClcbmZpZ0RpciA8LSBoZXJlKFxcLi4vZmlndXJlL2xvb3BfYW5hbHlzaXNcXClcbmRpci5jcmVhdGUoZmlnRGlyLCBzaG93V2FybmluZ3MgPSBGQUxTRSwgcmVjdXJzaXZlID0gVFJVRSlcblxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsIFxcbG9vcFNjb3JlX2Nocm9tb3NpZ2h0LnRzdlxcKSlcblxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1TXFwsIFxcUy1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxYLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9hbGxfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX2FsbF9kVEFHdkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxTLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9zdHJfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3N0cl9kVEFHdkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxTLVNcXCwgXFxTLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9zdHIyX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9zdHIyX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfb29lX3JlZ19kVEFHdkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2VfcmVnX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtU1xcLCBcXEUtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcY2hyb21vc2lnaHRfb29lX3JlZ1N0cl9kVEFHdkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2VfcmVnU3RyX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5cbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2VfYWxsX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9hbGxfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9zdHJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyMl9BNDg1dkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2Vfc3RyMl9BNDg1dkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ19BNDg1dkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdTdHJfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ1N0cl9BNDg1dkRNU09cXCwgZmlnRGlyKVxuXG5cbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2VfYWxsX0VwaWRUQUd2RXBpRE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9hbGxfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyX0VwaWRUQUd2RXBpRE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9zdHJfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ19FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdTdHJfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ1N0cl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxuXG5cbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2VfYWxsX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9hbGxfQUlEdlVUXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcY2hyb21vX29vZV9zdHJfQUlEdlVUXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxjaHJvbW9zaWdodF9vb2Vfc3RyMl9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGNocm9tb19vb2Vfc3RyMl9BSUR2VVRcXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdfQUlEdlVUXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ19BSUR2VVRcXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGNocm9tb3NpZ2h0X29vZV9yZWdTdHJfQUlEdlVUXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxjaHJvbW9fb29lX3JlZ1N0cl9BSUR2VVRcXCwgZmlnRGlyKVxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
plot_loop_scores <- function(df, col_x, col_y, annoList,
                             name, title, figDir,
                             diffCutoff = 0.5, density_n = 200,
                             xmin = -0.5, xmax = 1,
                             ymin = -0.5, ymax = 1) {
  col_x_q <- enquo(col_x)
  col_y_q <- enquo(col_y)
  
  # Scatterplot
  df2 <- df %>%
    filter(Anno_simple %in% annoList) %>%
    select(id, x = !!col_x_q, y = !!col_y_q) %>%
    mutate(
      minpos = min(c(x, y)[c(x, y) > 0], na.rm = TRUE),
      eps    = minpos * 0.1,
      lx     = log2(x + eps),
      ly     = log2(y + eps),
      density = get_density(lx, ly, n = density_n)
    ) %>%
    arrange(density)
  
  p1 <- ggplot(df2, aes(x = lx, y = ly, color = density)) +
    geom_point() +
    scale_color_viridis() +
    scale_x_continuous(
      name   = paste0(\log2(\, quo_name(col_x_q), \)\)
    ) +
    scale_y_continuous(
      name   = paste0(\log2(\, quo_name(col_y_q), \)\)
    ) +
    coord_fixed() +
    geom_abline(slope = 1, intercept = 0,
                colour = \grey50\, linetype = \dashed\) +
    geom_hline(yintercept = 0, alpha = 0.5, colour = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, colour = \grey\) +
    geom_abline(slope = 1, intercept = -(2**diffCutoff),
                colour = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept = (2**diffCutoff),
                colour = \grey\, linetype = \dotted\) +
    theme_classic() +
    labs(x = quo_name(col_x_q),
         y = quo_name(col_y_q)) +
    ggtitle(title)
  
  fileName <- paste0(\scatterplot_\, name)
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 3.5, height = 3)
  print(p1)
  dev.off()
  
  png(here(figDir, paste0(fileName, \.png\)), 
      width = 3.5, height = 3, units = \in\, res = 600)
  print(p1)
  dev.off()
  
  # Pie chart
  df3 <- df %>%
    filter(Anno_simple %in% annoList) %>%
    select(id, x = !!col_x_q, y = !!col_y_q) %>%
    mutate(
      minpos = min(c(x, y)[c(x, y) > 0], na.rm = TRUE),
      eps    = minpos * 0.1,
      lx     = log2(x + eps),
      ly     = log2(y + eps)
    ) %>%
    mutate(diff = ly - lx) %>%
    mutate(updown = ifelse(diff > diffCutoff, \UP\,
                           ifelse(diff < -diffCutoff, \DOWN\, \NO\)))
  df3$updown <- factor(df3$updown, c(\UP\, \NO\, \DOWN\))
  
  pie_df <- df3 %>%
    dplyr::count(updown) %>%
    mutate(pct   = n / sum(n) * 100,
           label = paste0(updown, \\n\, n, \\n(\, round(pct,1), \%)\))

  p2 <- ggplot(pie_df, aes(x = \\, y = n, fill = updown)) +
    geom_col(color = \white\) +
    coord_polar(theta = \y\) +
    geom_text(aes(label = label),
              position = position_stack(vjust = 0.5),
              size     = fontSizeM/2) +
    theme_void() +   theme(legend.position = \none\) +
    scale_fill_manual(values = c(strong_red, no_grey, strong_blue))
  fileName <- here(figDir, paste0(\piechart_\, name))
  width <- panelSize(2)*mmToInch
  height <- panelSize(2)*mmToInch
  svglite(paste0(fileName, \.svg\), width = width, height = height)
  print(p2)
  dev.off()
}


commonLoopDir <- here(\../data/loop_analysis\)
figDir <- here(\../figure/loop_analysis\)
dir.create(figDir, showWarnings = FALSE, recursive = TRUE)

data <- fread(here(commonLoopDir, \loopScore_chromosight.tsv\))

plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \chromosight_ooe_all_dTAGvDMSO\,
                 title = \chromo_ooe_all_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\S-S\),
                 name = \chromosight_ooe_str_dTAGvDMSO\,
                 title = \chromo_ooe_str_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\S-S\, \S-X\),
                 name = \chromosight_ooe_str2_dTAGvDMSO\,
                 title = \chromo_ooe_str2_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-P\, \P-E\, \E-E\),
                 name = \chromosight_ooe_reg_dTAGvDMSO\,
                 title = \chromo_ooe_reg_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-S\, \E-S\),
                 name = \chromosight_ooe_regStr_dTAGvDMSO\,
                 title = \chromo_ooe_regStr_dTAGvDMSO\, figDir)

plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \chromosight_ooe_all_A485vDMSO\,
                 title = \chromo_ooe_all_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\S-S\),
                 name = \chromosight_ooe_str_A485vDMSO\,
                 title = \chromo_ooe_str_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\S-S\, \S-X\),
                 name = \chromosight_ooe_str2_A485vDMSO\,
                 title = \chromo_ooe_str2_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-P\, \P-E\, \E-E\),
                 name = \chromosight_ooe_reg_A485vDMSO\,
                 title = \chromo_ooe_reg_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-S\, \E-S\),
                 name = \chromosight_ooe_regStr_A485vDMSO\,
                 title = \chromo_ooe_regStr_A485vDMSO\, figDir)


plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \chromosight_ooe_all_EpidTAGvEpiDMSO\,
                 title = \chromo_ooe_all_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\S-S\),
                 name = \chromosight_ooe_str_EpidTAGvEpiDMSO\,
                 title = \chromo_ooe_str_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\S-S\, \S-X\),
                 name = \chromosight_ooe_str2_EpidTAGvEpiDMSO\,
                 title = \chromo_ooe_str2_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-P\, \P-E\, \E-E\),
                 name = \chromosight_ooe_reg_EpidTAGvEpiDMSO\,
                 title = \chromo_ooe_reg_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-S\, \E-S\),
                 name = \chromosight_ooe_regStr_EpidTAGvEpiDMSO\,
                 title = \chromo_ooe_regStr_EpidTAGvEpiDMSO\, figDir)


plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \chromosight_ooe_all_AIDvUT\,
                 title = \chromo_ooe_all_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\S-S\),
                 name = \chromosight_ooe_str_AIDvUT\,
                 title = \chromo_ooe_str_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\S-S\, \S-X\),
                 name = \chromosight_ooe_str2_AIDvUT\,
                 title = \chromo_ooe_str2_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-P\, \P-E\, \E-E\),
                 name = \chromosight_ooe_reg_AIDvUT\,
                 title = \chromo_ooe_reg_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-S\, \E-S\),
                 name = \chromosight_ooe_regStr_AIDvUT\,
                 title = \chromo_ooe_regStr_AIDvUT\, figDir)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHViRzloWkV4dmIzQkJibTV2UkdGMFlTQThMU0JtZFc1amRHbHZiaWhtYVd4bFRtRnRaU2w3WEc0Z0lHUmhkR0VnUEMwZ1lYTmZkR2xpWW14bEtHWnlaV0ZrS0dacGJHVk9ZVzFsS1NrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2huWlc1bElEMGdjM1J5YzNCc2FYUW9aMlZ1WlN3Z0oxeGNYRng4SnlrcFhHNGdJSEpsZEhWeWJpaGtZWFJoS1Z4dWZWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxubG9hZExvb3BBbm5vRGF0YSA8LSBmdW5jdGlvbihmaWxlTmFtZSl7XG4gIGRhdGEgPC0gYXNfdGliYmxlKGZyZWFkKGZpbGVOYW1lKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShnZW5lID0gc3Ryc3BsaXQoZ2VuZSwgJ1xcXFx8JykpXG4gIHJldHVybihkYXRhKVxufVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
loadLoopAnnoData <- function(fileName){
  data <- as_tibble(fread(fileName)) %>%
    dplyr::mutate(gene = strsplit(gene, '\\|'))
  return(data)
}



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJHOWhaRXh2YjNCQmJtNXZSR0YwWVNBOExTQm1kVzVqZEdsdmJpaG1hV3hsVG1GdFpTbDdYRzRnSUdSaGRHRWdQQzBnWVhOZmRHbGlZbXhsS0daeVpXRmtLR1pwYkdWT1lXMWxLU2tnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbTExZEdGMFpTaG5aVzVsSUQwZ2MzUnljM0JzYVhRb1oyVnVaU3dnSjF4Y1hGeDhKeWtwWEc0Z0lISmxkSFZ5Ymloa1lYUmhLVnh1ZlZ4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbmxvYWRMb29wQW5ub0RhdGEgPC0gZnVuY3Rpb24oZmlsZU5hbWUpe1xuICBkYXRhIDwtIGFzX3RpYmJsZShmcmVhZChmaWxlTmFtZSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoZ2VuZSA9IHN0cnNwbGl0KGdlbmUsICdcXFxcfCcpKVxuICByZXR1cm4oZGF0YSlcbn1cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZExvb3BBbm5vRGF0YSA8LSBmdW5jdGlvbihmaWxlTmFtZSl7XG4gIGRhdGEgPC0gYXNfdGliYmxlKGZyZWFkKGZpbGVOYW1lKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShnZW5lID0gc3Ryc3BsaXQoZ2VuZSwgJ1xcXFx8JykpXG4gIHJldHVybihkYXRhKVxufVxuYGBgXG5gYGAifQ== -->

```r
```r
loadLoopAnnoData <- function(fileName){
  data <- as_tibble(fread(fileName)) %>%
    dplyr::mutate(gene = strsplit(gene, '\\|'))
  return(data)
}
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### Obs/exp score
#### Scatterplot - Chromosight

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dVptTkRkWFJ2Wm1ZZ1BDMGdNQzQxWEc1a2FXWm1RM1YwYjJabUlEd3RJREF1TlZ4dVkyOXRiVzl1VEc5dmNFUnBjaUE4TFNCb1pYSmxLRndpTGk0dlpHRjBZUzlzYjI5d1gyRnVZV3g1YzJselhDSXBYRzVrYVdabVJHbHlJRHd0SUdobGNtVW9YQ0l1TGk5a1lYUmhMMUpPUVY5a2FXWm1YQ0lwWEc1dVlXMWxJRHd0SUZ3aVkyaHliMjF2YzJsbmFIUmNJbHh1WjJWdVpVRnVibTlFWVhSaElEd3RJR3h2WVdSTWIyOXdRVzV1YjBSaGRHRW9hR1Z5WlNoamIyMXRiMjVNYjI5d1JHbHlMQ0J3WVhOMFpUQW9YQ0pzYjI5d1UyTnZjbVZmWENJc0lHNWhiV1VzSUZ3aVgzQXRibDl6YVcxd2JHVmZaVzV6WlcxaWJFeHBjM1F1ZEhOMlhDSXBLU2tnSlQ0bFhHNGdJSEp2ZDNkcGMyVW9LU0FsUGlVZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ01nZDI5eWF5QnZibVVnY205M0lHRjBJR0VnZEdsdFpWeHVJQ0J0ZFhSaGRHVW9YRzRnSUNBZ2JXbHVjRzl6SUQwZ2JXbHVLR01vYjI5bFgyUlVRVWNzSUc5dlpWOUVUVk5QS1Z0aktHOXZaVjlrVkVGSExDQnZiMlZmUkUxVFR5a2dQaUF3WFN3Z2JtRXVjbTBnUFNCVVVsVkZLU3hjYmlBZ0lDQmxjSE1nSUNBZ1BTQnBabVZzYzJVb2FYTXVabWx1YVhSbEtHMXBibkJ2Y3lrc0lHMXBibkJ2Y3lBcUlEQXVNU3dnTUM0d01Ta3NJQ0FnSUNBZ0l5Qm1ZV3hzWW1GamF5QnBaaUJpYjNSb0lHRnlaU0F3WEc0Z0lDQWdaR2xtWmlBZ0lEMGdiRzluTWlnb2IyOWxYMlJVUVVjZ0t5QmxjSE1wSUM4Z0tHOXZaVjlFVFZOUElDc2daWEJ6S1NsY2JpQWdLU0FsUGlVZ1hHNGdJSFZ1WjNKdmRYQW9LU0FsUGlVZ1hHNGdJSE5sYkdWamRDZ3RiV2x1Y0c5ekxDQXRaWEJ6S1NCY2JpQWdJMlJ3YkhseU9qcHRkWFJoZEdVb1pHbG1aaUE5SUd4dlp6SW9iMjlsWDJSVVFVY3BJQzBnYkc5bk1paHZiMlZmUkUxVFR5a3BYRzVjYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9aR2xtWmtScGNpd2dYQ0prYVdabVgwY3hMbVJVUVVkZlJ6RXVNbWt1WkZSQlIxOTJjMTlITVM0eWFTNUVUVk5QTG5SemRsd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1pXNXpaVzFpYkY5blpXNWxYMmxrTENCc2IyY3lSbTlzWkVOb1lXNW5aU3dnYzJoeWFXNXJaV1JmYkc5bk1rWkRMQ0J3WVdScUxDQmxlSFJsY201aGJGOW5aVzVsWDI1aGJXVXBYRzVuWlc1bFRHbHpkQzVrYjNkdUxsSk9RU0E4TFNBb1pHbG1aaTVTVGtFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3OUlEQXNJSEJoWkdvZ1BDQmhiSEJvWVNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkZ4dVoyVnVaVXhwYzNRdWRYQXVVazVCSUR3dElDaGthV1ptTGxKT1FTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BpQXdMQ0J3WVdScUlEd2dZV3h3YUdFcEtTUmxibk5sYldKc1gyZGxibVZmYVdSY2JseHVYRzV0WVhoTWIyY3lSa01nUEMwZ01seHVYRzUwWlcxd0lEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoa2FXWm1MQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0J0WldGdUtHUnBabVlwTENBdVozSnZkWEJ6SUQwZ0oyUnliM0FuS1Z4dVhHNTBaVzF3SUR3dElHeGxablJmYW05cGJpaDBaVzF3TENCa2FXWm1MbEpPUVN3Z1lua2dQU0JqS0Z3aVoyVnVaVndpSUQwZ1hDSmxibk5sYldKc1gyZGxibVZmYVdSY0lpa3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobWJHRm5JRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bFRHbHpkQzVrYjNkdUxsSk9RU3dnWENJeVJFOVhUbHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsVEdsemRDNTFjQzVTVGtFc0lGd2lNVlZRWENJc0lGd2lNRTVQWENJcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRZWGhHYkdGbklEMGdLR0ZpY3loemFISnBibXRsWkY5c2IyY3lSa01wSUQ0Z2JXRjRURzluTWtaREtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphSEpzYjJjeVptTk5ZWGdnUFNCd2JXRjRLSEJ0YVc0b2MyaHlhVzVyWldSZmJHOW5Na1pETENCdFlYaE1iMmN5UmtNcExDQXRiV0Y0VEc5bk1rWkRLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZZWEp5WVc1blpTaG1iR0ZuS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlITm9jbXh2WnpKbVkwMWhlQ3dnZVNBOUlHMWxZVzVmWkdsbVpsOXpZMjl5WlN3Z1kyOXNiM0lnUFNCbWJHRm5MRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeGhZbVZzSUQwZ2FXWmxiSE5sS0dac1lXY2dJVDBnWENJd1RrOWNJaXdnWlhoMFpYSnVZV3hmWjJWdVpWOXVZVzFsTENCT1FTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyaGhjR1VnUFNCaGN5NW1ZV04wYjNJb2JXRjRSbXhoWnlrcEtTQXJYRzRnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJR2RsYjIxZmRHVjRkRjl5WlhCbGJDZ3BJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3RjYmlBZ1oyZDBhWFJzWlNod1lYTjBaVEFvYm1GdFpTd2dYQ0pmYjI5bFgzTnBiWEJzWlVGdWJtOWNJaWtwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Da2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0JrYVdabVEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTFNCa2FXWm1RM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ01Da2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0JtWTBOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJQzFtWTBOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUhOallXeGxYMk52Ykc5eVgyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2lNRTVQWENJZ1BTQmNJbWR5WlhsY0lpd2dYQ0l4VlZCY0lpQTlJRndpY21Wa1hDSXNJRndpTWtSUFYwNWNJaUE5SUZ3aVlteDFaVndpS1NrZ0t5QWdJeUJEYjNKeVpXTjBaV1FnWTI5c2IzSWdiV0Z3Y0dsdVoxeHVJQ0J6WTJGc1pWOXphR0Z3WlY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY0lsUlNWVVZjSWlBOUlESXNJRndpUmtGTVUwVmNJaUE5SURFNUtTbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aVVrNUJkbk5NYjI5d1gxd2lMQ0J1WVcxbExDQmNJbDl2YjJWZmMybHRjR3hsUVc1dWIxd2lLVnh1YUdWcFoyaDBJRHd0SURSY2JuZHBaSFJvSUR3dElEZGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmZDdXRvZmYgPC0gMC41XG5jb21tb25Mb29wRGlyIDwtIGhlcmUoXFwuLi9kYXRhL2xvb3BfYW5hbHlzaXNcXClcbmRpZmZEaXIgPC0gaGVyZShcXC4uL2RhdGEvUk5BX2RpZmZcXClcbm5hbWUgPC0gXFxjaHJvbW9zaWdodFxcXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbW1vbkxvb3BEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgbmFtZSwgXFxfcC1uX3NpbXBsZV9lbnNlbWJsTGlzdC50c3ZcXCkpKSAlPiVcbiAgcm93d2lzZSgpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3b3JrIG9uZSByb3cgYXQgYSB0aW1lXG4gIG11dGF0ZShcbiAgICBtaW5wb3MgPSBtaW4oYyhvb2VfZFRBRywgb29lX0RNU08pW2Mob29lX2RUQUcsIG9vZV9ETVNPKSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgIGVwcyAgICA9IGlmZWxzZShpcy5maW5pdGUobWlucG9zKSwgbWlucG9zICogMC4xLCAwLjAxKSwgICAgICAjIGZhbGxiYWNrIGlmIGJvdGggYXJlIDBcbiAgICBkaWZmICAgPSBsb2cyKChvb2VfZFRBRyArIGVwcykgLyAob29lX0RNU08gKyBlcHMpKVxuICApICU+JSBcbiAgdW5ncm91cCgpICU+JSBcbiAgc2VsZWN0KC1taW5wb3MsIC1lcHMpIFxuICAjZHBseXI6Om11dGF0ZShkaWZmID0gbG9nMihvb2VfZFRBRykgLSBsb2cyKG9vZV9ETVNPKSlcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShkaWZmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPD0gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmYsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZiksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZ3RpdGxlKHBhc3RlMChuYW1lLCBcXF9vb2Vfc2ltcGxlQW5ub1xcKSkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxSTkF2c0xvb3BfXFwsIG5hbWUsIFxcX29vZV9zaW1wbGVBbm5vXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
alpha <- 0.05
fcCutoff <- 0.5
diffCutoff <- 0.5
commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \chromosight\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_simple_ensemblList.tsv\))) %>%
  rowwise() %>%                                # work one row at a time
  mutate(
    minpos = min(c(ooe_dTAG, ooe_DMSO)[c(ooe_dTAG, ooe_DMSO) > 0], na.rm = TRUE),
    eps    = ifelse(is.finite(minpos), minpos * 0.1, 0.01),      # fallback if both are 0
    diff   = log2((ooe_dTAG + eps) / (ooe_DMSO + eps))
  ) %>% 
  ungroup() %>% 
  select(-minpos, -eps) 
  #dplyr::mutate(diff = log2(ooe_dTAG) - log2(ooe_DMSO))

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_ooe_simpleAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_ooe_simpleAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlXeHdhR0VnUEMwZ01DNHdOVnh1Wm1ORGRYUnZabVlnUEMwZ01DNDFYRzVrYVdabVEzVjBiMlptSUR3dElEQXVOVnh1WTI5dGJXOXVURzl2Y0VScGNpQThMU0JvWlhKbEtGeGNMaTR2WkdGMFlTOXNiMjl3WDJGdVlXeDVjMmx6WEZ3cFhHNWthV1ptUkdseUlEd3RJR2hsY21Vb1hGd3VMaTlrWVhSaEwxSk9RVjlrYVdabVhGd3BYRzV1WVcxbElEd3RJRnhjWTJoeWIyMXZjMmxuYUhSY1hGeHVaMlZ1WlVGdWJtOUVZWFJoSUR3dElHeHZZV1JNYjI5d1FXNXViMFJoZEdFb2FHVnlaU2hqYjIxdGIyNU1iMjl3UkdseUxDQndZWE4wWlRBb1hGeHNiMjl3VTJOdmNtVmZYRndzSUc1aGJXVXNJRnhjWDNBdGJsOXphVzF3YkdWZlpXNXpaVzFpYkV4cGMzUXVkSE4yWEZ3cEtTa2dKVDRsWEc0Z0lISnZkM2RwYzJVb0tTQWxQaVVnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDTWdkMjl5YXlCdmJtVWdjbTkzSUdGMElHRWdkR2x0WlZ4dUlDQnRkWFJoZEdVb1hHNGdJQ0FnYldsdWNHOXpJRDBnYldsdUtHTW9iMjlsWDJSVVFVY3NJRzl2WlY5RVRWTlBLVnRqS0c5dlpWOWtWRUZITENCdmIyVmZSRTFUVHlrZ1BpQXdYU3dnYm1FdWNtMGdQU0JVVWxWRktTeGNiaUFnSUNCbGNITWdJQ0FnUFNCcFptVnNjMlVvYVhNdVptbHVhWFJsS0cxcGJuQnZjeWtzSUcxcGJuQnZjeUFxSURBdU1Td2dNQzR3TVNrc0lDQWdJQ0FnSXlCbVlXeHNZbUZqYXlCcFppQmliM1JvSUdGeVpTQXdYRzRnSUNBZ1pHbG1aaUFnSUQwZ2JHOW5NaWdvYjI5bFgyUlVRVWNnS3lCbGNITXBJQzhnS0c5dlpWOUVUVk5QSUNzZ1pYQnpLU2xjYmlBZ0tTQWxQaVVnWEc0Z0lIVnVaM0p2ZFhBb0tTQWxQaVVnWEc0Z0lITmxiR1ZqZENndGJXbHVjRzl6TENBdFpYQnpLU0JjYmlBZ0kyUndiSGx5T2pwdGRYUmhkR1VvWkdsbVppQTlJR3h2WnpJb2IyOWxYMlJVUVVjcElDMGdiRzluTWlodmIyVmZSRTFUVHlrcFhHNWNibVJwWm1ZdVVrNUJJRHd0SUdaeVpXRmtLR2hsY21Vb1pHbG1aa1JwY2l3Z1hGeGthV1ptWDBjeExtUlVRVWRmUnpFdU1ta3VaRlJCUjE5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWlc1elpXMWliRjluWlc1bFgybGtMQ0JzYjJjeVJtOXNaRU5vWVc1blpTd2djMmh5YVc1clpXUmZiRzluTWtaRExDQndZV1JxTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVcFhHNW5aVzVsVEdsemRDNWtiM2R1TGxKT1FTQThMU0FvWkdsbVppNVNUa0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHc5SURBc0lIQmhaR29nUENCaGJIQm9ZU2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WjJWdVpVeHBjM1F1ZFhBdVVrNUJJRHd0SUNoa2FXWm1MbEpPUVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUGlBd0xDQndZV1JxSUR3Z1lXeHdhR0VwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1JjYmx4dVhHNXRZWGhNYjJjeVJrTWdQQzBnTWx4dVhHNTBaVzF3SUR3dElHZGxibVZCYm01dlJHRjBZU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hrYVdabUxDQm5aVzVsS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaHRaV0Z1WDJScFptWmZjMk52Y21VZ1BTQnRaV0Z1S0dScFptWXBMQ0F1WjNKdmRYQnpJRDBnSjJSeWIzQW5LVnh1WEc1MFpXMXdJRHd0SUd4bFpuUmZhbTlwYmloMFpXMXdMQ0JrYVdabUxsSk9RU3dnWW5rZ1BTQmpLRnhjWjJWdVpWeGNJRDBnWEZ4bGJuTmxiV0pzWDJkbGJtVmZhV1JjWENrcElDVStKU0JjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2htYkdGbklEMGdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsVEdsemRDNWtiM2R1TGxKT1FTd2dYRnd5UkU5WFRseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCblpXNWxUR2x6ZEM1MWNDNVNUa0VzSUZ4Y01WVlFYRndzSUZ4Y01FNVBYRndwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYaEdiR0ZuSUQwZ0tHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnYldGNFRHOW5Na1pES1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFISnNiMmN5Wm1OTllYZ2dQU0J3YldGNEtIQnRhVzRvYzJoeWFXNXJaV1JmYkc5bk1rWkRMQ0J0WVhoTWIyY3lSa01wTENBdGJXRjRURzluTWtaREtTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNllYSnlZVzVuWlNobWJHRm5LVnh1WEc1d0lEd3RJR2RuY0d4dmRDaDBaVzF3TENCaFpYTW9lQ0E5SUhOb2NteHZaekptWTAxaGVDd2dlU0E5SUcxbFlXNWZaR2xtWmw5elkyOXlaU3dnWTI5c2IzSWdQU0JtYkdGbkxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4aFltVnNJRDBnYVdabGJITmxLR1pzWVdjZ0lUMGdYRnd3VGs5Y1hDd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxMQ0JPUVNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJoaGNHVWdQU0JoY3k1bVlXTjBiM0lvYldGNFJteGhaeWtwS1NBclhHNGdJR2RsYjIxZmNHOXBiblFvS1NBcklHZGxiMjFmZEdWNGRGOXlaWEJsYkNncElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDdGNiaUFnWjJkMGFYUnNaU2h3WVhOMFpUQW9ibUZ0WlN3Z1hGeGZiMjlsWDNOcGJYQnNaVUZ1Ym05Y1hDa3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQmthV1ptUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdMU0JrYVdabVEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQm1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlDMW1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y01FNVBYRndnUFNCY1hHZHlaWGxjWEN3Z1hGd3hWVkJjWENBOUlGeGNjbVZrWEZ3c0lGeGNNa1JQVjA1Y1hDQTlJRnhjWW14MVpWeGNLU2tnS3lBZ0l5QkRiM0p5WldOMFpXUWdZMjlzYjNJZ2JXRndjR2x1WjF4dUlDQnpZMkZzWlY5emFHRndaVjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjWEZSU1ZVVmNYQ0E5SURJc0lGeGNSa0ZNVTBWY1hDQTlJREU1S1NsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjVWs1QmRuTk1iMjl3WDF4Y0xDQnVZVzFsTENCY1hGOXZiMlZmYzJsdGNHeGxRVzV1YjF4Y0tWeHVhR1ZwWjJoMElEd3RJRFJjYm5kcFpIUm9JRHd0SURkY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmQ3V0b2ZmIDwtIDAuNVxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5kaWZmRGlyIDwtIGhlcmUoXFwuLi9kYXRhL1JOQV9kaWZmXFwpXG5uYW1lIDwtIFxcY2hyb21vc2lnaHRcXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIG5hbWUsIFxcX3Atbl9zaW1wbGVfZW5zZW1ibExpc3QudHN2XFwpKSkgJT4lXG4gIHJvd3dpc2UoKSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd29yayBvbmUgcm93IGF0IGEgdGltZVxuICBtdXRhdGUoXG4gICAgbWlucG9zID0gbWluKGMob29lX2RUQUcsIG9vZV9ETVNPKVtjKG9vZV9kVEFHLCBvb2VfRE1TTykgPiAwXSwgbmEucm0gPSBUUlVFKSxcbiAgICBlcHMgICAgPSBpZmVsc2UoaXMuZmluaXRlKG1pbnBvcyksIG1pbnBvcyAqIDAuMSwgMC4wMSksICAgICAgIyBmYWxsYmFjayBpZiBib3RoIGFyZSAwXG4gICAgZGlmZiAgID0gbG9nMigob29lX2RUQUcgKyBlcHMpIC8gKG9vZV9ETVNPICsgZXBzKSlcbiAgKSAlPiUgXG4gIHVuZ3JvdXAoKSAlPiUgXG4gIHNlbGVjdCgtbWlucG9zLCAtZXBzKSBcbiAgI2RwbHlyOjptdXRhdGUoZGlmZiA9IGxvZzIob29lX2RUQUcpIC0gbG9nMihvb2VfRE1TTykpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUoZGlmZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDw9IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXAuUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcblxuXG5tYXhMb2cyRkMgPC0gMlxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmYpLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2d0aXRsZShwYXN0ZTAobmFtZSwgXFxfb29lX3NpbXBsZUFubm9cXCkpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcUk5BdnNMb29wX1xcLCBuYW1lLCBcXF9vb2Vfc2ltcGxlQW5ub1xcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmQ3V0b2ZmIDwtIDAuNVxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5kaWZmRGlyIDwtIGhlcmUoXFwuLi9kYXRhL1JOQV9kaWZmXFwpXG5uYW1lIDwtIFxcY2hyb21vc2lnaHRcXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIG5hbWUsIFxcX3Atbl9zaW1wbGVfZW5zZW1ibExpc3QudHN2XFwpKSkgJT4lXG4gIHJvd3dpc2UoKSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd29yayBvbmUgcm93IGF0IGEgdGltZVxuICBtdXRhdGUoXG4gICAgbWlucG9zID0gbWluKGMob29lX2RUQUcsIG9vZV9ETVNPKVtjKG9vZV9kVEFHLCBvb2VfRE1TTykgPiAwXSwgbmEucm0gPSBUUlVFKSxcbiAgICBlcHMgICAgPSBpZmVsc2UoaXMuZmluaXRlKG1pbnBvcyksIG1pbnBvcyAqIDAuMSwgMC4wMSksICAgICAgIyBmYWxsYmFjayBpZiBib3RoIGFyZSAwXG4gICAgZGlmZiAgID0gbG9nMigob29lX2RUQUcgKyBlcHMpIC8gKG9vZV9ETVNPICsgZXBzKSlcbiAgKSAlPiUgXG4gIHVuZ3JvdXAoKSAlPiUgXG4gIHNlbGVjdCgtbWlucG9zLCAtZXBzKSBcbiAgI2RwbHlyOjptdXRhdGUoZGlmZiA9IGxvZzIob29lX2RUQUcpIC0gbG9nMihvb2VfRE1TTykpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUoZGlmZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDw9IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXAuUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcblxuXG5tYXhMb2cyRkMgPC0gMlxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmYpLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2d0aXRsZShwYXN0ZTAobmFtZSwgXFxfb29lX3NpbXBsZUFubm9cXCkpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcUk5BdnNMb29wX1xcLCBuYW1lLCBcXF9vb2Vfc2ltcGxlQW5ub1xcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
alpha <- 0.05
fcCutoff <- 0.5
diffCutoff <- 0.5
commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \chromosight\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_simple_ensemblList.tsv\))) %>%
  rowwise() %>%                                # work one row at a time
  mutate(
    minpos = min(c(ooe_dTAG, ooe_DMSO)[c(ooe_dTAG, ooe_DMSO) > 0], na.rm = TRUE),
    eps    = ifelse(is.finite(minpos), minpos * 0.1, 0.01),      # fallback if both are 0
    diff   = log2((ooe_dTAG + eps) / (ooe_DMSO + eps))
  ) %>% 
  ungroup() %>% 
  select(-minpos, -eps) 
  #dplyr::mutate(diff = log2(ooe_dTAG) - log2(ooe_DMSO))

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_ooe_simpleAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_ooe_simpleAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### RNA-seq loopscore scatterplot

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dVptTkRkWFJ2Wm1ZZ1BDMGdNQzQxWEc1a2FXWm1RM1YwYjJabUlEd3RJREF1TlZ4dVkyOXRiVzl1VEc5dmNFUnBjaUE4TFNCb1pYSmxLRndpTGk0dlpHRjBZUzlzYjI5d1gyRnVZV3g1YzJselhDSXBYRzVrYVdabVJHbHlJRHd0SUdobGNtVW9YQ0l1TGk5a1lYUmhMMUpPUVY5a2FXWm1YQ0lwWEc1dVlXMWxJRHd0SUZ3aVkyaHliMjF2YzJsbmFIUmNJbHh1WjJWdVpVRnVibTlFWVhSaElEd3RJR3h2WVdSTWIyOXdRVzV1YjBSaGRHRW9hR1Z5WlNoamIyMXRiMjVNYjI5d1JHbHlMQ0J3WVhOMFpUQW9YQ0pzYjI5d1UyTnZjbVZmWENJc0lHNWhiV1VzSUZ3aVgzQXRibDlqYjIxd2JHVjRYMlZ1YzJWdFlteE1hWE4wTG5SemRsd2lLU2twSUNVK0pWeHVJQ0J5YjNkM2FYTmxLQ2tnSlQ0bElDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUhkdmNtc2diMjVsSUhKdmR5QmhkQ0JoSUhScGJXVmNiaUFnYlhWMFlYUmxLRnh1SUNBZ0lHMXBibkJ2Y3lBOUlHMXBiaWhqS0c5dlpWOWtWRUZITENCdmIyVmZSRTFUVHlsYll5aHZiMlZmWkZSQlJ5d2diMjlsWDBSTlUwOHBJRDRnTUYwc0lHNWhMbkp0SUQwZ1ZGSlZSU2tzWEc0Z0lDQWdaWEJ6SUNBZ0lEMGdhV1psYkhObEtHbHpMbVpwYm1sMFpTaHRhVzV3YjNNcExDQnRhVzV3YjNNZ0tpQXdMakVzSURBdU1ERXBMQ0FnSUNBZ0lDTWdabUZzYkdKaFkyc2dhV1lnWW05MGFDQmhjbVVnTUZ4dUlDQWdJR1JwWm1ZZ0lDQTlJR3h2WnpJb0tHOXZaVjlrVkVGSElDc2daWEJ6S1NBdklDaHZiMlZmUkUxVFR5QXJJR1Z3Y3lrcFhHNGdJQ2tnSlQ0bElGeHVJQ0IxYm1keWIzVndLQ2tnSlQ0bElGeHVJQ0J6Wld4bFkzUW9MVzFwYm5CdmN5d2dMV1Z3Y3lrZ1hHNGdJQ05rY0d4NWNqbzZiWFYwWVhSbEtHUnBabVlnUFNCc2IyY3lLRzl2WlY5a1ZFRkhLU0F0SUd4dlp6SW9iMjlsWDBSTlUwOHBLVnh1WEc1a2FXWm1MbEpPUVNBOExTQm1jbVZoWkNob1pYSmxLR1JwWm1aRWFYSXNJRndpWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHVnVjMlZ0WW14ZloyVnVaVjlwWkN3Z2JHOW5Na1p2YkdSRGFHRnVaMlVzSUhOb2NtbHVhMlZrWDJ4dlp6SkdReXdnY0dGa2Fpd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxLVnh1WjJWdVpVeHBjM1F1Wkc5M2JpNVNUa0VnUEMwZ0tHUnBabVl1VWs1QklDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtITm9jbWx1YTJWa1gyeHZaekpHUXlBOFBTQXdMQ0J3WVdScUlEd2dZV3h3YUdFcEtTUmxibk5sYldKc1gyZGxibVZmYVdSY2JtZGxibVZNYVhOMExuVndMbEpPUVNBOExTQW9aR2xtWmk1U1RrRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElENGdNQ3dnY0dGa2FpQThJR0ZzY0doaEtTa2taVzV6WlcxaWJGOW5aVzVsWDJsa1hHNWNibHh1YldGNFRHOW5Na1pESUR3dElESmNibHh1ZEdWdGNDQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbG1aaXdnWjJWdVpTa2dKVDRsSUZ4dUlDQjFibTVsYzNRb1oyVnVaU2tnSlQ0bElHZHliM1Z3WDJKNUtHZGxibVVwSUNVK0pWeHVJQ0J6ZFcxdFlYSnBlbVVvYldWaGJsOWthV1ptWDNOamIzSmxJRDBnYldWaGJpaGthV1ptS1N3Z0xtZHliM1Z3Y3lBOUlDZGtjbTl3SnlsY2JseHVkR1Z0Y0NBOExTQnNaV1owWDJwdmFXNG9kR1Z0Y0N3Z1pHbG1aaTVTVGtFc0lHSjVJRDBnWXloY0ltZGxibVZjSWlBOUlGd2laVzV6WlcxaWJGOW5aVzVsWDJsa1hDSXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pteGhaeUE5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1Wkc5M2JpNVNUa0VzSUZ3aU1rUlBWMDVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVkWEF1VWs1QkxDQmNJakZWVUZ3aUxDQmNJakJPVDF3aUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0Y0Um14aFp5QTlJQ2hoWW5Nb2MyaHlhVzVyWldSZmJHOW5Na1pES1NBK0lHMWhlRXh2WnpKR1F5a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmh5Ykc5bk1tWmpUV0Y0SUQwZ2NHMWhlQ2h3YldsdUtITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2JXRjRURzluTWtaREtTd2dMVzFoZUV4dlp6SkdReWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbUZ5Y21GdVoyVW9abXhoWnlsY2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQnphSEpzYjJjeVptTk5ZWGdzSUhrZ1BTQnRaV0Z1WDJScFptWmZjMk52Y21Vc0lHTnZiRzl5SUQwZ1pteGhaeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOUlHbG1aV3h6WlNobWJHRm5JQ0U5SUZ3aU1FNVBYQ0lzSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlN3Z1RrRXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9ZWEJsSUQwZ1lYTXVabUZqZEc5eUtHMWhlRVpzWVdjcEtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJuWlc5dFgzUmxlSFJmY21Wd1pXd29LU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FyWEc0Z0lHZG5kR2wwYkdVb2NHRnpkR1V3S0c1aGJXVXNJRndpWDI5dlpWOWpiMjF3YkdWNFFXNXViMXdpS1NrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUdScFptWkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBdElHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWENKa1lYTm9aV1JjSWlrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUdaalEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTFdaalEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlBZ2MyTmhiR1ZmWTI5c2IzSmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YQ0l3VGs5Y0lpQTlJRndpWjNKbGVWd2lMQ0JjSWpGVlVGd2lJRDBnWENKeVpXUmNJaXdnWENJeVJFOVhUbHdpSUQwZ1hDSmliSFZsWENJcEtTQXJJQ0FqSUVOdmNuSmxZM1JsWkNCamIyeHZjaUJ0WVhCd2FXNW5YRzRnSUhOallXeGxYM05vWVhCbFgyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2lWRkpWUlZ3aUlEMGdNaXdnWENKR1FVeFRSVndpSUQwZ01Ua3BLVnh1WEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSlNUa0YyYzB4dmIzQmZYQ0lzSUc1aGJXVXNJRndpWDI5dlpWOWpiMjF3YkdWNFFXNXViMXdpS1Z4dWFHVnBaMmgwSUR3dElEUmNibmRwWkhSb0lEd3RJRGRjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibUJnWUNKOSAtLT5cblxuYGBgclxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmQ3V0b2ZmIDwtIDAuNVxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5kaWZmRGlyIDwtIGhlcmUoXFwuLi9kYXRhL1JOQV9kaWZmXFwpXG5uYW1lIDwtIFxcY2hyb21vc2lnaHRcXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIG5hbWUsIFxcX3Atbl9jb21wbGV4X2Vuc2VtYmxMaXN0LnRzdlxcKSkpICU+JVxuICByb3d3aXNlKCkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvcmsgb25lIHJvdyBhdCBhIHRpbWVcbiAgbXV0YXRlKFxuICAgIG1pbnBvcyA9IG1pbihjKG9vZV9kVEFHLCBvb2VfRE1TTylbYyhvb2VfZFRBRywgb29lX0RNU08pID4gMF0sIG5hLnJtID0gVFJVRSksXG4gICAgZXBzICAgID0gaWZlbHNlKGlzLmZpbml0ZShtaW5wb3MpLCBtaW5wb3MgKiAwLjEsIDAuMDEpLCAgICAgICMgZmFsbGJhY2sgaWYgYm90aCBhcmUgMFxuICAgIGRpZmYgICA9IGxvZzIoKG9vZV9kVEFHICsgZXBzKSAvIChvb2VfRE1TTyArIGVwcykpXG4gICkgJT4lIFxuICB1bmdyb3VwKCkgJT4lIFxuICBzZWxlY3QoLW1pbnBvcywgLWVwcykgXG4gICNkcGx5cjo6bXV0YXRlKGRpZmYgPSBsb2cyKG9vZV9kVEFHKSAtIGxvZzIob29lX0RNU08pKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKGRpZmZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8PSAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5cblxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZiwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdndGl0bGUocGFzdGUwKG5hbWUsIFxcX29vZV9jb21wbGV4QW5ub1xcKSkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxSTkF2c0xvb3BfXFwsIG5hbWUsIFxcX29vZV9jb21wbGV4QW5ub1xcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
alpha <- 0.05
fcCutoff <- 0.5
diffCutoff <- 0.5
commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \chromosight\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_complex_ensemblList.tsv\))) %>%
  rowwise() %>%                                # work one row at a time
  mutate(
    minpos = min(c(ooe_dTAG, ooe_DMSO)[c(ooe_dTAG, ooe_DMSO) > 0], na.rm = TRUE),
    eps    = ifelse(is.finite(minpos), minpos * 0.1, 0.01),      # fallback if both are 0
    diff   = log2((ooe_dTAG + eps) / (ooe_DMSO + eps))
  ) %>% 
  ungroup() %>% 
  select(-minpos, -eps) 
  #dplyr::mutate(diff = log2(ooe_dTAG) - log2(ooe_DMSO))

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_ooe_complexAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_ooe_complexAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlXeHdhR0VnUEMwZ01DNHdOVnh1Wm1ORGRYUnZabVlnUEMwZ01DNDFYRzVrYVdabVEzVjBiMlptSUR3dElEQXVOVnh1WTI5dGJXOXVURzl2Y0VScGNpQThMU0JvWlhKbEtGeGNMaTR2WkdGMFlTOXNiMjl3WDJGdVlXeDVjMmx6WEZ3cFhHNWthV1ptUkdseUlEd3RJR2hsY21Vb1hGd3VMaTlrWVhSaEwxSk9RVjlrYVdabVhGd3BYRzV1WVcxbElEd3RJRnhjWTJoeWIyMXZjMmxuYUhSY1hGeHVaMlZ1WlVGdWJtOUVZWFJoSUR3dElHeHZZV1JNYjI5d1FXNXViMFJoZEdFb2FHVnlaU2hqYjIxdGIyNU1iMjl3UkdseUxDQndZWE4wWlRBb1hGeHNiMjl3VTJOdmNtVmZYRndzSUc1aGJXVXNJRnhjWDNBdGJsOWpiMjF3YkdWNFgyVnVjMlZ0WW14TWFYTjBMblJ6ZGx4Y0tTa3BJQ1UrSlZ4dUlDQnliM2QzYVhObEtDa2dKVDRsSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpJSGR2Y21zZ2IyNWxJSEp2ZHlCaGRDQmhJSFJwYldWY2JpQWdiWFYwWVhSbEtGeHVJQ0FnSUcxcGJuQnZjeUE5SUcxcGJpaGpLRzl2WlY5a1ZFRkhMQ0J2YjJWZlJFMVRUeWxiWXlodmIyVmZaRlJCUnl3Z2IyOWxYMFJOVTA4cElENGdNRjBzSUc1aExuSnRJRDBnVkZKVlJTa3NYRzRnSUNBZ1pYQnpJQ0FnSUQwZ2FXWmxiSE5sS0dsekxtWnBibWwwWlNodGFXNXdiM01wTENCdGFXNXdiM01nS2lBd0xqRXNJREF1TURFcExDQWdJQ0FnSUNNZ1ptRnNiR0poWTJzZ2FXWWdZbTkwYUNCaGNtVWdNRnh1SUNBZ0lHUnBabVlnSUNBOUlHeHZaeklvS0c5dlpWOWtWRUZISUNzZ1pYQnpLU0F2SUNodmIyVmZSRTFUVHlBcklHVndjeWtwWEc0Z0lDa2dKVDRsSUZ4dUlDQjFibWR5YjNWd0tDa2dKVDRsSUZ4dUlDQnpaV3hsWTNRb0xXMXBibkJ2Y3l3Z0xXVndjeWtnWEc0Z0lDTmtjR3g1Y2pvNmJYVjBZWFJsS0dScFptWWdQU0JzYjJjeUtHOXZaVjlrVkVGSEtTQXRJR3h2WnpJb2IyOWxYMFJOVTA4cEtWeHVYRzVrYVdabUxsSk9RU0E4TFNCbWNtVmhaQ2hvWlhKbEtHUnBabVpFYVhJc0lGeGNaR2xtWmw5SE1TNWtWRUZIWDBjeExqSnBMbVJVUVVkZmRuTmZSekV1TW1rdVJFMVRUeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dWdWMyVnRZbXhmWjJWdVpWOXBaQ3dnYkc5bk1rWnZiR1JEYUdGdVoyVXNJSE5vY21sdWEyVmtYMnh2WnpKR1F5d2djR0ZrYWl3Z1pYaDBaWEp1WVd4ZloyVnVaVjl1WVcxbEtWeHVaMlZ1WlV4cGMzUXVaRzkzYmk1U1RrRWdQQzBnS0dScFptWXVVazVCSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hOb2NtbHVhMlZrWDJ4dlp6SkdReUE4UFNBd0xDQndZV1JxSUR3Z1lXeHdhR0VwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1JjYm1kbGJtVk1hWE4wTG5Wd0xsSk9RU0E4TFNBb1pHbG1aaTVTVGtFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUQ0Z01Dd2djR0ZrYWlBOElHRnNjR2hoS1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrWEc1Y2JseHViV0Y0VEc5bk1rWkRJRHd0SURKY2JseHVkR1Z0Y0NBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsbVppd2daMlZ1WlNrZ0pUNGxJRnh1SUNCMWJtNWxjM1FvWjJWdVpTa2dKVDRsSUdkeWIzVndYMko1S0dkbGJtVXBJQ1UrSlZ4dUlDQnpkVzF0WVhKcGVtVW9iV1ZoYmw5a2FXWm1YM05qYjNKbElEMGdiV1ZoYmloa2FXWm1LU3dnTG1keWIzVndjeUE5SUNka2NtOXdKeWxjYmx4dWRHVnRjQ0E4TFNCc1pXWjBYMnB2YVc0b2RHVnRjQ3dnWkdsbVppNVNUa0VzSUdKNUlEMGdZeWhjWEdkbGJtVmNYQ0E5SUZ4Y1pXNXpaVzFpYkY5blpXNWxYMmxrWEZ3cEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWm14aFp5QTlJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVaRzkzYmk1U1RrRXNJRnhjTWtSUFYwNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaVXhwYzNRdWRYQXVVazVCTENCY1hERlZVRnhjTENCY1hEQk9UMXhjS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXRjRSbXhoWnlBOUlDaGhZbk1vYzJoeWFXNXJaV1JmYkc5bk1rWkRLU0ErSUcxaGVFeHZaekpHUXlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyaHliRzluTW1aalRXRjRJRDBnY0cxaGVDaHdiV2x1S0hOb2NtbHVhMlZrWDJ4dlp6SkdReXdnYldGNFRHOW5Na1pES1N3Z0xXMWhlRXh2WnpKR1F5a3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pteGhaeWxjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCemFISnNiMmN5Wm1OTllYZ3NJSGtnUFNCdFpXRnVYMlJwWm1aZmMyTnZjbVVzSUdOdmJHOXlJRDBnWm14aFp5eGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1lXSmxiQ0E5SUdsbVpXeHpaU2htYkdGbklDRTlJRnhjTUU1UFhGd3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU3dnVGtFcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb1lYQmxJRDBnWVhNdVptRmpkRzl5S0cxaGVFWnNZV2NwS1NrZ0sxeHVJQ0JuWlc5dFgzQnZhVzUwS0NrZ0t5Qm5aVzl0WDNSbGVIUmZjbVZ3Wld3b0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJYRzRnSUdkbmRHbDBiR1VvY0dGemRHVXdLRzVoYldVc0lGeGNYMjl2WlY5amIyMXdiR1Y0UVc1dWIxeGNLU2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F0SUdScFptWkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYRnhrWVhOb1pXUmNYQ2tnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJR1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdMV1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaUFnYzJOaGJHVmZZMjlzYjNKZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hGd3dUazljWENBOUlGeGNaM0psZVZ4Y0xDQmNYREZWVUZ4Y0lEMGdYRnh5WldSY1hDd2dYRnd5UkU5WFRseGNJRDBnWEZ4aWJIVmxYRndwS1NBcklDQWpJRU52Y25KbFkzUmxaQ0JqYjJ4dmNpQnRZWEJ3YVc1blhHNGdJSE5qWVd4bFgzTm9ZWEJsWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y1ZGSlZSVnhjSUQwZ01pd2dYRnhHUVV4VFJWeGNJRDBnTVRrcEtWeHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4U1RrRjJjMHh2YjNCZlhGd3NJRzVoYldVc0lGeGNYMjl2WlY5amIyMXdiR1Y0UVc1dWIxeGNLVnh1YUdWcFoyaDBJRHd0SURSY2JuZHBaSFJvSUR3dElEZGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZkN1dG9mZiA8LSAwLjVcbmNvbW1vbkxvb3BEaXIgPC0gaGVyZShcXC4uL2RhdGEvbG9vcF9hbmFseXNpc1xcKVxuZGlmZkRpciA8LSBoZXJlKFxcLi4vZGF0YS9STkFfZGlmZlxcKVxubmFtZSA8LSBcXGNocm9tb3NpZ2h0XFxcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBuYW1lLCBcXF9wLW5fY29tcGxleF9lbnNlbWJsTGlzdC50c3ZcXCkpKSAlPiVcbiAgcm93d2lzZSgpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3b3JrIG9uZSByb3cgYXQgYSB0aW1lXG4gIG11dGF0ZShcbiAgICBtaW5wb3MgPSBtaW4oYyhvb2VfZFRBRywgb29lX0RNU08pW2Mob29lX2RUQUcsIG9vZV9ETVNPKSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgIGVwcyAgICA9IGlmZWxzZShpcy5maW5pdGUobWlucG9zKSwgbWlucG9zICogMC4xLCAwLjAxKSwgICAgICAjIGZhbGxiYWNrIGlmIGJvdGggYXJlIDBcbiAgICBkaWZmICAgPSBsb2cyKChvb2VfZFRBRyArIGVwcykgLyAob29lX0RNU08gKyBlcHMpKVxuICApICU+JSBcbiAgdW5ncm91cCgpICU+JSBcbiAgc2VsZWN0KC1taW5wb3MsIC1lcHMpIFxuICAjZHBseXI6Om11dGF0ZShkaWZmID0gbG9nMihvb2VfZFRBRykgLSBsb2cyKG9vZV9ETVNPKSlcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShkaWZmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPD0gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmYsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZiksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZ3RpdGxlKHBhc3RlMChuYW1lLCBcXF9vb2VfY29tcGxleEFubm9cXCkpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcUk5BdnNMb29wX1xcLCBuYW1lLCBcXF9vb2VfY29tcGxleEFubm9cXClcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmQ3V0b2ZmIDwtIDAuNVxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5kaWZmRGlyIDwtIGhlcmUoXFwuLi9kYXRhL1JOQV9kaWZmXFwpXG5uYW1lIDwtIFxcY2hyb21vc2lnaHRcXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIG5hbWUsIFxcX3Atbl9jb21wbGV4X2Vuc2VtYmxMaXN0LnRzdlxcKSkpICU+JVxuICByb3d3aXNlKCkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvcmsgb25lIHJvdyBhdCBhIHRpbWVcbiAgbXV0YXRlKFxuICAgIG1pbnBvcyA9IG1pbihjKG9vZV9kVEFHLCBvb2VfRE1TTylbYyhvb2VfZFRBRywgb29lX0RNU08pID4gMF0sIG5hLnJtID0gVFJVRSksXG4gICAgZXBzICAgID0gaWZlbHNlKGlzLmZpbml0ZShtaW5wb3MpLCBtaW5wb3MgKiAwLjEsIDAuMDEpLCAgICAgICMgZmFsbGJhY2sgaWYgYm90aCBhcmUgMFxuICAgIGRpZmYgICA9IGxvZzIoKG9vZV9kVEFHICsgZXBzKSAvIChvb2VfRE1TTyArIGVwcykpXG4gICkgJT4lIFxuICB1bmdyb3VwKCkgJT4lIFxuICBzZWxlY3QoLW1pbnBvcywgLWVwcykgXG4gICNkcGx5cjo6bXV0YXRlKGRpZmYgPSBsb2cyKG9vZV9kVEFHKSAtIGxvZzIob29lX0RNU08pKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKGRpZmZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8PSAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5cblxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZiwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdndGl0bGUocGFzdGUwKG5hbWUsIFxcX29vZV9jb21wbGV4QW5ub1xcKSkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxSTkF2c0xvb3BfXFwsIG5hbWUsIFxcX29vZV9jb21wbGV4QW5ub1xcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
alpha <- 0.05
fcCutoff <- 0.5
diffCutoff <- 0.5
commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \chromosight\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_complex_ensemblList.tsv\))) %>%
  rowwise() %>%                                # work one row at a time
  mutate(
    minpos = min(c(ooe_dTAG, ooe_DMSO)[c(ooe_dTAG, ooe_DMSO) > 0], na.rm = TRUE),
    eps    = ifelse(is.finite(minpos), minpos * 0.1, 0.01),      # fallback if both are 0
    diff   = log2((ooe_dTAG + eps) / (ooe_DMSO + eps))
  ) %>% 
  ungroup() %>% 
  select(-minpos, -eps) 
  #dplyr::mutate(diff = log2(ooe_dTAG) - log2(ooe_DMSO))

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_ooe_complexAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_ooe_complexAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZMjl0Ylc5dVRHOXZjRVJwY2lBOExTQm9aWEpsS0Z3aUxpNHZaR0YwWVM5c2IyOXdYMkZ1WVd4NWMybHpYQ0lwWEc1bWFXZEVhWElnUEMwZ2FHVnlaU2hjSWk0dUwyWnBaM1Z5WlM5c2IyOXdYMkZ1WVd4NWMybHpYQ0lwWEc1a2FYSXVZM0psWVhSbEtHWnBaMFJwY2l3Z2MyaHZkMWRoY201cGJtZHpJRDBnUmtGTVUwVXNJSEpsWTNWeWMybDJaU0E5SUZSU1ZVVXBYRzVjYm1SaGRHRWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyMXRiMjVNYjI5d1JHbHlMQ0JjSW14dmIzQlRZMjl5WlY5b2FXTmtZM0F1ZEhOMlhDSXBLVnh1WEc1d2JHOTBYMnh2YjNCZmMyTnZjbVZ6S0dSaGRHRXNJRzl2WlY5RVRWTlBMQ0J2YjJWZlpGUkJSeXdnWXloY0lsQXRVRndpTENCY0lsQXRSVndpTENCY0lsQXRVMXdpTENCY0lsQXRXRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpUlMxRlhDSXNJRndpUlMxVFhDSXNJRndpUlMxWVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSlRMVk5jSWl3Z1hDSlRMVmhjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWxndFdGd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpYUdsalpHTndYMjl2WlY5aGJHeGZaRlJCUjNaRVRWTlBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWENKb2FXTmtZM0JmYjI5bFgyRnNiRjlrVkVGSGRrUk5VMDljSWl3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlJFMVRUeXdnYjI5bFgyUlVRVWNzSUdNb1hDSlRMVk5jSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY0ltaHBZMlJqY0Y5dmIyVmZjM1J5WDJSVVFVZDJSRTFUVDF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhWFJzWlNBOUlGd2lhR2xqWkdOd1gyOXZaVjl6ZEhKZlpGUkJSM1pFVFZOUFhDSXNJR1pwWjBScGNpbGNibkJzYjNSZmJHOXZjRjl6WTI5eVpYTW9aR0YwWVN3Z2IyOWxYMFJOVTA4c0lHOXZaVjlrVkVGSExDQmpLRndpVXkxVFhDSXNJRndpVXkxWVhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYQ0pvYVdOa1kzQmZiMjlsWDNOMGNqSmZaRlJCUjNaRVRWTlBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWENKb2FXTmtZM0JmYjI5bFgzTjBjakpmWkZSQlIzWkVUVk5QWENJc0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwUk5VMDhzSUc5dlpWOWtWRUZITENCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJc0lGd2lSUzFGWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hDSm9hV05rWTNCZmIyOWxYM0psWjE5a1ZFRkhka1JOVTA5Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNJbWhwWTJSamNGOXZiMlZmY21WblgyUlVRVWQyUkUxVFQxd2lMQ0JtYVdkRWFYSXBYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlFVFZOUExDQnZiMlZmWkZSQlJ5d2dZeWhjSWxBdFUxd2lMQ0JjSWtVdFUxd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpYUdsalpHTndYMjl2WlY5eVpXZFRkSEpmWkZSQlIzWkVUVk5QWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBkR3hsSUQwZ1hDSm9hV05rWTNCZmIyOWxYM0psWjFOMGNsOWtWRUZIZGtSTlUwOWNJaXdnWm1sblJHbHlLVnh1WEc1d2JHOTBYMnh2YjNCZmMyTnZjbVZ6S0dSaGRHRXNJRzl2WlY5RVRWTlBMQ0J2YjJWZlFUUTROU3dnWXloY0lsQXRVRndpTENCY0lsQXRSVndpTENCY0lsQXRVMXdpTENCY0lsQXRXRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpUlMxRlhDSXNJRndpUlMxVFhDSXNJRndpUlMxWVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSlRMVk5jSWl3Z1hDSlRMVmhjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWxndFdGd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpYUdsalpHTndYMjl2WlY5aGJHeGZRVFE0TlhaRVRWTlBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWENKb2FXTmtZM0JmYjI5bFgyRnNiRjlCTkRnMWRrUk5VMDljSWl3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlJFMVRUeXdnYjI5bFgwRTBPRFVzSUdNb1hDSlRMVk5jSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY0ltaHBZMlJqY0Y5dmIyVmZjM1J5WDBFME9EVjJSRTFUVDF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhWFJzWlNBOUlGd2lhR2xqWkdOd1gyOXZaVjl6ZEhKZlFUUTROWFpFVFZOUFhDSXNJR1pwWjBScGNpbGNibkJzYjNSZmJHOXZjRjl6WTI5eVpYTW9aR0YwWVN3Z2IyOWxYMFJOVTA4c0lHOXZaVjlCTkRnMUxDQmpLRndpVXkxVFhDSXNJRndpVXkxWVhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYQ0pvYVdOa1kzQmZiMjlsWDNOMGNqSmZRVFE0TlhaRVRWTlBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWENKb2FXTmtZM0JmYjI5bFgzTjBjakpmUVRRNE5YWkVUVk5QWENJc0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwUk5VMDhzSUc5dlpWOUJORGcxTENCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJc0lGd2lSUzFGWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hDSm9hV05rWTNCZmIyOWxYM0psWjE5Qk5EZzFka1JOVTA5Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNJbWhwWTJSamNGOXZiMlZmY21WblgwRTBPRFYyUkUxVFQxd2lMQ0JtYVdkRWFYSXBYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlFVFZOUExDQnZiMlZmUVRRNE5Td2dZeWhjSWxBdFUxd2lMQ0JjSWtVdFUxd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpYUdsalpHTndYMjl2WlY5eVpXZFRkSEpmUVRRNE5YWkVUVk5QWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBkR3hsSUQwZ1hDSm9hV05rWTNCZmIyOWxYM0psWjFOMGNsOUJORGcxZGtSTlUwOWNJaXdnWm1sblJHbHlLVnh1WEc1Y2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwVndhVVJOVTA4c0lHOXZaVjlGY0dsa1ZFRkhMQ0JqS0Z3aVVDMVFYQ0lzSUZ3aVVDMUZYQ0lzSUZ3aVVDMVRYQ0lzSUZ3aVVDMVlYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0pGTFVWY0lpd2dYQ0pGTFZOY0lpd2dYQ0pGTFZoY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lsTXRVMXdpTENCY0lsTXRXRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpV0MxWVhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYQ0pvYVdOa1kzQmZiMjlsWDJGc2JGOUZjR2xrVkVGSGRrVndhVVJOVTA5Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNJbWhwWTJSamNGOXZiMlZmWVd4c1gwVndhV1JVUVVkMlJYQnBSRTFUVDF3aUxDQm1hV2RFYVhJcFhHNXdiRzkwWDJ4dmIzQmZjMk52Y21WektHUmhkR0VzSUc5dlpWOUZjR2xFVFZOUExDQnZiMlZmUlhCcFpGUkJSeXdnWXloY0lsTXRVMXdpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaU0E5SUZ3aWFHbGpaR053WDI5dlpWOXpkSEpmUlhCcFpGUkJSM1pGY0dsRVRWTlBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWENKb2FXTmtZM0JmYjI5bFgzTjBjbDlGY0dsa1ZFRkhka1Z3YVVSTlUwOWNJaXdnWm1sblJHbHlLVnh1Y0d4dmRGOXNiMjl3WDNOamIzSmxjeWhrWVhSaExDQnZiMlZmUlhCcFJFMVRUeXdnYjI5bFgwVndhV1JVUVVjc0lHTW9YQ0pUTFZOY0lpd2dYQ0pUTFZoY0lpa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVZ1BTQmNJbWhwWTJSamNGOXZiMlZmYzNSeU1sOUZjR2xrVkVGSGRrVndhVVJOVTA5Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNJbWhwWTJSamNGOXZiMlZmYzNSeU1sOUZjR2xrVkVGSGRrVndhVVJOVTA5Y0lpd2dabWxuUkdseUtWeHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZSWEJwUkUxVFR5d2diMjlsWDBWd2FXUlVRVWNzSUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSkZMVVZjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY0ltaHBZMlJqY0Y5dmIyVmZjbVZuWDBWd2FXUlVRVWQyUlhCcFJFMVRUMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ3aWFHbGpaR053WDI5dlpWOXlaV2RmUlhCcFpGUkJSM1pGY0dsRVRWTlBYQ0lzSUdacFowUnBjaWxjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDBWd2FVUk5VMDhzSUc5dlpWOUZjR2xrVkVGSExDQmpLRndpVUMxVFhDSXNJRndpUlMxVFhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYQ0pvYVdOa1kzQmZiMjlsWDNKbFoxTjBjbDlGY0dsa1ZFRkhka1Z3YVVSTlUwOWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdsMGJHVWdQU0JjSW1ocFkyUmpjRjl2YjJWZmNtVm5VM1J5WDBWd2FXUlVRVWQyUlhCcFJFMVRUMXdpTENCbWFXZEVhWElwWEc1Y2JseHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZWVlFzSUc5dlpWOUJTVVFzSUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVmhjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWtVdFJWd2lMQ0JjSWtVdFUxd2lMQ0JjSWtVdFdGd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lVeTFUWENJc0lGd2lVeTFZWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKWUxWaGNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjSW1ocFkyUmpjRjl2YjJWZllXeHNYMEZKUkhaVlZGd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYVhSc1pTQTlJRndpYUdsalpHTndYMjl2WlY5aGJHeGZRVWxFZGxWVVhDSXNJR1pwWjBScGNpbGNibkJzYjNSZmJHOXZjRjl6WTI5eVpYTW9aR0YwWVN3Z2IyOWxYMVZVTENCdmIyVmZRVWxFTENCaktGd2lVeTFUWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hDSm9hV05rWTNCZmIyOWxYM04wY2w5QlNVUjJWVlJjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY0ltaHBZMlJqY0Y5dmIyVmZjM1J5WDBGSlJIWlZWRndpTENCbWFXZEVhWElwWEc1d2JHOTBYMnh2YjNCZmMyTnZjbVZ6S0dSaGRHRXNJRzl2WlY5VlZDd2diMjlsWDBGSlJDd2dZeWhjSWxNdFUxd2lMQ0JjSWxNdFdGd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpYUdsalpHTndYMjl2WlY5emRISXlYMEZKUkhaVlZGd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYVhSc1pTQTlJRndpYUdsalpHTndYMjl2WlY5emRISXlYMEZKUkhaVlZGd2lMQ0JtYVdkRWFYSXBYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlWVkN3Z2IyOWxYMEZKUkN3Z1l5aGNJbEF0VUZ3aUxDQmNJbEF0UlZ3aUxDQmNJa1V0UlZ3aUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGd2lhR2xqWkdOd1gyOXZaVjl5WldkZlFVbEVkbFZVWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBkR3hsSUQwZ1hDSm9hV05rWTNCZmIyOWxYM0psWjE5QlNVUjJWVlJjSWl3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlZWUXNJRzl2WlY5QlNVUXNJR01vWENKUUxWTmNJaXdnWENKRkxWTmNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjSW1ocFkyUmpjRjl2YjJWZmNtVm5VM1J5WDBGSlJIWlZWRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ3aWFHbGpaR053WDI5dlpWOXlaV2RUZEhKZlFVbEVkbFZVWENJc0lHWnBaMFJwY2lsY2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5maWdEaXIgPC0gaGVyZShcXC4uL2ZpZ3VyZS9sb29wX2FuYWx5c2lzXFwpXG5kaXIuY3JlYXRlKGZpZ0Rpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpXG5cbmRhdGEgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcXGxvb3BTY29yZV9oaWNkY3AudHN2XFwpKVxuXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9hbGxfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX2FsbF9kVEFHdkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxTLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2Vfc3RyX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9zdHJfZFRBR3ZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3N0cjJfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3N0cjJfZFRBR3ZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3JlZ19kVEFHdkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2VfcmVnX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtU1xcLCBcXEUtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9yZWdTdHJfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3JlZ1N0cl9kVEFHdkRNU09cXCwgZmlnRGlyKVxuXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9hbGxfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX2FsbF9BNDg1dkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoXFxTLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2Vfc3RyX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9zdHJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3N0cjJfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3N0cjJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3JlZ19BNDg1dkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2VfcmVnX0E0ODV2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFAtU1xcLCBcXEUtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9yZWdTdHJfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3JlZ1N0cl9BNDg1dkRNU09cXCwgZmlnRGlyKVxuXG5cbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX2FsbF9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2VfYWxsX0VwaWRUQUd2RXBpRE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9FcGlETVNPLCBvb2VfRXBpZFRBRywgYyhcXFMtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9zdHJfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3N0cl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxTLVNcXCwgXFxTLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2VfcmVnX0VwaWRUQUd2RXBpRE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9yZWdfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1TXFwsIFxcRS1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3JlZ1N0cl9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2VfcmVnU3RyX0VwaWRUQUd2RXBpRE1TT1xcLCBmaWdEaXIpXG5cblxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1TXFwsIFxcUy1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxYLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2VfYWxsX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9hbGxfQUlEdlVUXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3N0cl9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2Vfc3RyX0FJRHZVVFxcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYyhcXFMtU1xcLCBcXFMtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9zdHIyX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9zdHIyX0FJRHZVVFxcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9yZWdfQUlEdlVUXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3JlZ19BSUR2VVRcXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2VfcmVnU3RyX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9yZWdTdHJfQUlEdlVUXFwsIGZpZ0RpcilcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
commonLoopDir <- here(\../data/loop_analysis\)
figDir <- here(\../figure/loop_analysis\)
dir.create(figDir, showWarnings = FALSE, recursive = TRUE)

data <- fread(here(commonLoopDir, \loopScore_hicdcp.tsv\))

plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \hicdcp_ooe_all_dTAGvDMSO\,
                 title = \hicdcp_ooe_all_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\S-S\),
                 name = \hicdcp_ooe_str_dTAGvDMSO\,
                 title = \hicdcp_ooe_str_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\S-S\, \S-X\),
                 name = \hicdcp_ooe_str2_dTAGvDMSO\,
                 title = \hicdcp_ooe_str2_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-P\, \P-E\, \E-E\),
                 name = \hicdcp_ooe_reg_dTAGvDMSO\,
                 title = \hicdcp_ooe_reg_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-S\, \E-S\),
                 name = \hicdcp_ooe_regStr_dTAGvDMSO\,
                 title = \hicdcp_ooe_regStr_dTAGvDMSO\, figDir)

plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \hicdcp_ooe_all_A485vDMSO\,
                 title = \hicdcp_ooe_all_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\S-S\),
                 name = \hicdcp_ooe_str_A485vDMSO\,
                 title = \hicdcp_ooe_str_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\S-S\, \S-X\),
                 name = \hicdcp_ooe_str2_A485vDMSO\,
                 title = \hicdcp_ooe_str2_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-P\, \P-E\, \E-E\),
                 name = \hicdcp_ooe_reg_A485vDMSO\,
                 title = \hicdcp_ooe_reg_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-S\, \E-S\),
                 name = \hicdcp_ooe_regStr_A485vDMSO\,
                 title = \hicdcp_ooe_regStr_A485vDMSO\, figDir)


plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \hicdcp_ooe_all_EpidTAGvEpiDMSO\,
                 title = \hicdcp_ooe_all_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\S-S\),
                 name = \hicdcp_ooe_str_EpidTAGvEpiDMSO\,
                 title = \hicdcp_ooe_str_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\S-S\, \S-X\),
                 name = \hicdcp_ooe_str2_EpidTAGvEpiDMSO\,
                 title = \hicdcp_ooe_str2_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-P\, \P-E\, \E-E\),
                 name = \hicdcp_ooe_reg_EpidTAGvEpiDMSO\,
                 title = \hicdcp_ooe_reg_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-S\, \E-S\),
                 name = \hicdcp_ooe_regStr_EpidTAGvEpiDMSO\,
                 title = \hicdcp_ooe_regStr_EpidTAGvEpiDMSO\, figDir)


plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \hicdcp_ooe_all_AIDvUT\,
                 title = \hicdcp_ooe_all_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\S-S\),
                 name = \hicdcp_ooe_str_AIDvUT\,
                 title = \hicdcp_ooe_str_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\S-S\, \S-X\),
                 name = \hicdcp_ooe_str2_AIDvUT\,
                 title = \hicdcp_ooe_str2_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-P\, \P-E\, \E-E\),
                 name = \hicdcp_ooe_reg_AIDvUT\,
                 title = \hicdcp_ooe_reg_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-S\, \E-S\),
                 name = \hicdcp_ooe_regStr_AIDvUT\,
                 title = \hicdcp_ooe_regStr_AIDvUT\, figDir)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVkyOXRiVzl1VEc5dmNFUnBjaUE4TFNCb1pYSmxLRnhjTGk0dlpHRjBZUzlzYjI5d1gyRnVZV3g1YzJselhGd3BYRzVtYVdkRWFYSWdQQzBnYUdWeVpTaGNYQzR1TDJacFozVnlaUzlzYjI5d1gyRnVZV3g1YzJselhGd3BYRzVrYVhJdVkzSmxZWFJsS0dacFowUnBjaXdnYzJodmQxZGhjbTVwYm1keklEMGdSa0ZNVTBVc0lISmxZM1Z5YzJsMlpTQTlJRlJTVlVVcFhHNWNibVJoZEdFZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjIxdGIyNU1iMjl3UkdseUxDQmNYR3h2YjNCVFkyOXlaVjlvYVdOa1kzQXVkSE4yWEZ3cEtWeHVYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlFVFZOUExDQnZiMlZmWkZSQlJ5d2dZeWhjWEZBdFVGeGNMQ0JjWEZBdFJWeGNMQ0JjWEZBdFUxeGNMQ0JjWEZBdFdGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNSUzFGWEZ3c0lGeGNSUzFUWEZ3c0lGeGNSUzFZWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4VExWTmNYQ3dnWEZ4VExWaGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRmd0V0Z4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGeGNhR2xqWkdOd1gyOXZaVjloYkd4ZlpGUkJSM1pFVFZOUFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYRnhvYVdOa1kzQmZiMjlsWDJGc2JGOWtWRUZIZGtSTlUwOWNYQ3dnWm1sblJHbHlLVnh1Y0d4dmRGOXNiMjl3WDNOamIzSmxjeWhrWVhSaExDQnZiMlZmUkUxVFR5d2diMjlsWDJSVVFVY3NJR01vWEZ4VExWTmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjWEdocFkyUmpjRjl2YjJWZmMzUnlYMlJVUVVkMlJFMVRUMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ4Y2FHbGpaR053WDI5dlpWOXpkSEpmWkZSQlIzWkVUVk5QWEZ3c0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwUk5VMDhzSUc5dlpWOWtWRUZITENCaktGeGNVeTFUWEZ3c0lGeGNVeTFZWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hGeG9hV05rWTNCZmIyOWxYM04wY2pKZlpGUkJSM1pFVFZOUFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYRnhvYVdOa1kzQmZiMjlsWDNOMGNqSmZaRlJCUjNaRVRWTlBYRndzSUdacFowUnBjaWxjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDBSTlUwOHNJRzl2WlY5a1ZFRkhMQ0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndzSUZ4Y1JTMUZYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWEZ4b2FXTmtZM0JmYjI5bFgzSmxaMTlrVkVGSGRrUk5VMDljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY1hHaHBZMlJqY0Y5dmIyVmZjbVZuWDJSVVFVZDJSRTFUVDF4Y0xDQm1hV2RFYVhJcFhHNXdiRzkwWDJ4dmIzQmZjMk52Y21WektHUmhkR0VzSUc5dlpWOUVUVk5QTENCdmIyVmZaRlJCUnl3Z1l5aGNYRkF0VTF4Y0xDQmNYRVV0VTF4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGeGNhR2xqWkdOd1gyOXZaVjl5WldkVGRISmZaRlJCUjNaRVRWTlBYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWEZ4b2FXTmtZM0JmYjI5bFgzSmxaMU4wY2w5a1ZFRkhka1JOVTA5Y1hDd2dabWxuUkdseUtWeHVYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlFVFZOUExDQnZiMlZmUVRRNE5Td2dZeWhjWEZBdFVGeGNMQ0JjWEZBdFJWeGNMQ0JjWEZBdFUxeGNMQ0JjWEZBdFdGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNSUzFGWEZ3c0lGeGNSUzFUWEZ3c0lGeGNSUzFZWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4VExWTmNYQ3dnWEZ4VExWaGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRmd0V0Z4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGeGNhR2xqWkdOd1gyOXZaVjloYkd4ZlFUUTROWFpFVFZOUFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYRnhvYVdOa1kzQmZiMjlsWDJGc2JGOUJORGcxZGtSTlUwOWNYQ3dnWm1sblJHbHlLVnh1Y0d4dmRGOXNiMjl3WDNOamIzSmxjeWhrWVhSaExDQnZiMlZmUkUxVFR5d2diMjlsWDBFME9EVXNJR01vWEZ4VExWTmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjWEdocFkyUmpjRjl2YjJWZmMzUnlYMEUwT0RWMlJFMVRUMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ4Y2FHbGpaR053WDI5dlpWOXpkSEpmUVRRNE5YWkVUVk5QWEZ3c0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwUk5VMDhzSUc5dlpWOUJORGcxTENCaktGeGNVeTFUWEZ3c0lGeGNVeTFZWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hGeG9hV05rWTNCZmIyOWxYM04wY2pKZlFUUTROWFpFVFZOUFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYRnhvYVdOa1kzQmZiMjlsWDNOMGNqSmZRVFE0TlhaRVRWTlBYRndzSUdacFowUnBjaWxjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDBSTlUwOHNJRzl2WlY5Qk5EZzFMQ0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndzSUZ4Y1JTMUZYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWEZ4b2FXTmtZM0JmYjI5bFgzSmxaMTlCTkRnMWRrUk5VMDljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY1hHaHBZMlJqY0Y5dmIyVmZjbVZuWDBFME9EVjJSRTFUVDF4Y0xDQm1hV2RFYVhJcFhHNXdiRzkwWDJ4dmIzQmZjMk52Y21WektHUmhkR0VzSUc5dlpWOUVUVk5QTENCdmIyVmZRVFE0TlN3Z1l5aGNYRkF0VTF4Y0xDQmNYRVV0VTF4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGeGNhR2xqWkdOd1gyOXZaVjl5WldkVGRISmZRVFE0TlhaRVRWTlBYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWEZ4b2FXTmtZM0JmYjI5bFgzSmxaMU4wY2w5Qk5EZzFka1JOVTA5Y1hDd2dabWxuUkdseUtWeHVYRzVjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDBWd2FVUk5VMDhzSUc5dlpWOUZjR2xrVkVGSExDQmpLRnhjVUMxUVhGd3NJRnhjVUMxRlhGd3NJRnhjVUMxVFhGd3NJRnhjVUMxWVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeEZMVVZjWEN3Z1hGeEZMVk5jWEN3Z1hGeEZMVmhjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEZNdFUxeGNMQ0JjWEZNdFdGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNXQzFZWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hGeG9hV05rWTNCZmIyOWxYMkZzYkY5RmNHbGtWRUZIZGtWd2FVUk5VMDljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY1hHaHBZMlJqY0Y5dmIyVmZZV3hzWDBWd2FXUlVRVWQyUlhCcFJFMVRUMXhjTENCbWFXZEVhWElwWEc1d2JHOTBYMnh2YjNCZmMyTnZjbVZ6S0dSaGRHRXNJRzl2WlY5RmNHbEVUVk5QTENCdmIyVmZSWEJwWkZSQlJ5d2dZeWhjWEZNdFUxeGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRnhjYUdsalpHTndYMjl2WlY5emRISmZSWEJwWkZSQlIzWkZjR2xFVFZOUFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYRnhvYVdOa1kzQmZiMjlsWDNOMGNsOUZjR2xrVkVGSGRrVndhVVJOVTA5Y1hDd2dabWxuUkdseUtWeHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZSWEJwUkUxVFR5d2diMjlsWDBWd2FXUlVRVWNzSUdNb1hGeFRMVk5jWEN3Z1hGeFRMVmhjWENrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY1hHaHBZMlJqY0Y5dmIyVmZjM1J5TWw5RmNHbGtWRUZIZGtWd2FVUk5VMDljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY1hHaHBZMlJqY0Y5dmIyVmZjM1J5TWw5RmNHbGtWRUZIZGtWd2FVUk5VMDljWEN3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlJYQnBSRTFUVHl3Z2IyOWxYMFZ3YVdSVVFVY3NJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4RkxVVmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjWEdocFkyUmpjRjl2YjJWZmNtVm5YMFZ3YVdSVVFVZDJSWEJwUkUxVFQxeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYVhSc1pTQTlJRnhjYUdsalpHTndYMjl2WlY5eVpXZGZSWEJwWkZSQlIzWkZjR2xFVFZOUFhGd3NJR1pwWjBScGNpbGNibkJzYjNSZmJHOXZjRjl6WTI5eVpYTW9aR0YwWVN3Z2IyOWxYMFZ3YVVSTlUwOHNJRzl2WlY5RmNHbGtWRUZITENCaktGeGNVQzFUWEZ3c0lGeGNSUzFUWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hGeG9hV05rWTNCZmIyOWxYM0psWjFOMGNsOUZjR2xrVkVGSGRrVndhVVJOVTA5Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNYR2hwWTJSamNGOXZiMlZmY21WblUzUnlYMFZ3YVdSVVFVZDJSWEJwUkUxVFQxeGNMQ0JtYVdkRWFYSXBYRzVjYmx4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlZWUXNJRzl2WlY5QlNVUXNJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWaGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRVV0UlZ4Y0xDQmNYRVV0VTF4Y0xDQmNYRVV0V0Z4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y1V5MVRYRndzSUZ4Y1V5MVlYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnhZTFZoY1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVZ1BTQmNYR2hwWTJSamNGOXZiMlZmWVd4c1gwRkpSSFpWVkZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhWFJzWlNBOUlGeGNhR2xqWkdOd1gyOXZaVjloYkd4ZlFVbEVkbFZVWEZ3c0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgxVlVMQ0J2YjJWZlFVbEVMQ0JqS0Z4Y1V5MVRYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWEZ4b2FXTmtZM0JmYjI5bFgzTjBjbDlCU1VSMlZWUmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdsMGJHVWdQU0JjWEdocFkyUmpjRjl2YjJWZmMzUnlYMEZKUkhaVlZGeGNMQ0JtYVdkRWFYSXBYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlWVkN3Z2IyOWxYMEZKUkN3Z1l5aGNYRk10VTF4Y0xDQmNYRk10V0Z4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGeGNhR2xqWkdOd1gyOXZaVjl6ZEhJeVgwRkpSSFpWVkZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhWFJzWlNBOUlGeGNhR2xqWkdOd1gyOXZaVjl6ZEhJeVgwRkpSSFpWVkZ4Y0xDQm1hV2RFYVhJcFhHNXdiRzkwWDJ4dmIzQmZjMk52Y21WektHUmhkR0VzSUc5dlpWOVZWQ3dnYjI5bFgwRkpSQ3dnWXloY1hGQXRVRnhjTENCY1hGQXRSVnhjTENCY1hFVXRSVnhjS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaU0E5SUZ4Y2FHbGpaR053WDI5dlpWOXlaV2RmUVVsRWRsVlVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWEZ4b2FXTmtZM0JmYjI5bFgzSmxaMTlCU1VSMlZWUmNYQ3dnWm1sblJHbHlLVnh1Y0d4dmRGOXNiMjl3WDNOamIzSmxjeWhrWVhSaExDQnZiMlZmVlZRc0lHOXZaVjlCU1VRc0lHTW9YRnhRTFZOY1hDd2dYRnhGTFZOY1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVZ1BTQmNYR2hwWTJSamNGOXZiMlZmY21WblUzUnlYMEZKUkhaVlZGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYVhSc1pTQTlJRnhjYUdsalpHTndYMjl2WlY5eVpXZFRkSEpmUVVsRWRsVlVYRndzSUdacFowUnBjaWxjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbmNvbW1vbkxvb3BEaXIgPC0gaGVyZShcXC4uL2RhdGEvbG9vcF9hbmFseXNpc1xcKVxuZmlnRGlyIDwtIGhlcmUoXFwuLi9maWd1cmUvbG9vcF9hbmFseXNpc1xcKVxuZGlyLmNyZWF0ZShmaWdEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKVxuXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgXFxsb29wU2NvcmVfaGljZGNwLnRzdlxcKSlcblxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1TXFwsIFxcUy1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxYLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2VfYWxsX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9hbGxfZFRBR3ZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3N0cl9kVEFHdkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2Vfc3RyX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFMtU1xcLCBcXFMtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9zdHIyX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9zdHIyX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9yZWdfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3JlZ19kVEFHdkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2VfcmVnU3RyX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9yZWdTdHJfZFRBR3ZETVNPXFwsIGZpZ0RpcilcblxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1TXFwsIFxcUy1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxYLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2VfYWxsX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9hbGxfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3N0cl9BNDg1dkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2Vfc3RyX0E0ODV2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFMtU1xcLCBcXFMtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9zdHIyX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9zdHIyX0E0ODV2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9yZWdfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3JlZ19BNDg1dkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2VfcmVnU3RyX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9yZWdTdHJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcblxuXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9FcGlETVNPLCBvb2VfRXBpZFRBRywgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9hbGxfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX2FsbF9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxTLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2Vfc3RyX0VwaWRUQUd2RXBpRE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9zdHJfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3N0cjJfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3N0cjJfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3JlZ19FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2VfcmVnX0VwaWRUQUd2RXBpRE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9FcGlETVNPLCBvb2VfRXBpZFRBRywgYyhcXFAtU1xcLCBcXEUtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9yZWdTdHJfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3JlZ1N0cl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxuXG5cbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX2FsbF9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2VfYWxsX0FJRHZVVFxcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYyhcXFMtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9zdHJfQUlEdlVUXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3N0cl9BSUR2VVRcXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxTLVNcXCwgXFxTLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2Vfc3RyMl9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2Vfc3RyMl9BSUR2VVRcXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2VfcmVnX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9yZWdfQUlEdlVUXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUC1TXFwsIFxcRS1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3JlZ1N0cl9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2VfcmVnU3RyX0FJRHZVVFxcLCBmaWdEaXIpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5maWdEaXIgPC0gaGVyZShcXC4uL2ZpZ3VyZS9sb29wX2FuYWx5c2lzXFwpXG5kaXIuY3JlYXRlKGZpZ0Rpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpXG5cbmRhdGEgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcXGxvb3BTY29yZV9oaWNkY3AudHN2XFwpKVxuXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9hbGxfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX2FsbF9kVEFHdkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxTLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2Vfc3RyX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9zdHJfZFRBR3ZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3N0cjJfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3N0cjJfZFRBR3ZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3JlZ19kVEFHdkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2VfcmVnX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtU1xcLCBcXEUtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9yZWdTdHJfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3JlZ1N0cl9kVEFHdkRNU09cXCwgZmlnRGlyKVxuXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9hbGxfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX2FsbF9BNDg1dkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoXFxTLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2Vfc3RyX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9zdHJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3N0cjJfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3N0cjJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3JlZ19BNDg1dkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2VfcmVnX0E0ODV2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFAtU1xcLCBcXEUtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9yZWdTdHJfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3JlZ1N0cl9BNDg1dkRNU09cXCwgZmlnRGlyKVxuXG5cbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX2FsbF9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2VfYWxsX0VwaWRUQUd2RXBpRE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9FcGlETVNPLCBvb2VfRXBpZFRBRywgYyhcXFMtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9zdHJfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3N0cl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxTLVNcXCwgXFxTLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2VfcmVnX0VwaWRUQUd2RXBpRE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9yZWdfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1TXFwsIFxcRS1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3JlZ1N0cl9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2VfcmVnU3RyX0VwaWRUQUd2RXBpRE1TT1xcLCBmaWdEaXIpXG5cblxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1TXFwsIFxcUy1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxYLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2VfYWxsX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9hbGxfQUlEdlVUXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxoaWNkY3Bfb29lX3N0cl9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXGhpY2RjcF9vb2Vfc3RyX0FJRHZVVFxcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYyhcXFMtU1xcLCBcXFMtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9zdHIyX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9zdHIyX0FJRHZVVFxcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcaGljZGNwX29vZV9yZWdfQUlEdlVUXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxoaWNkY3Bfb29lX3JlZ19BSUR2VVRcXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXGhpY2RjcF9vb2VfcmVnU3RyX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcaGljZGNwX29vZV9yZWdTdHJfQUlEdlVUXFwsIGZpZ0RpcilcblxuYGBgXG5gYGAifQ== -->

```r
```r
commonLoopDir <- here(\../data/loop_analysis\)
figDir <- here(\../figure/loop_analysis\)
dir.create(figDir, showWarnings = FALSE, recursive = TRUE)

data <- fread(here(commonLoopDir, \loopScore_hicdcp.tsv\))

plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \hicdcp_ooe_all_dTAGvDMSO\,
                 title = \hicdcp_ooe_all_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\S-S\),
                 name = \hicdcp_ooe_str_dTAGvDMSO\,
                 title = \hicdcp_ooe_str_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\S-S\, \S-X\),
                 name = \hicdcp_ooe_str2_dTAGvDMSO\,
                 title = \hicdcp_ooe_str2_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-P\, \P-E\, \E-E\),
                 name = \hicdcp_ooe_reg_dTAGvDMSO\,
                 title = \hicdcp_ooe_reg_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-S\, \E-S\),
                 name = \hicdcp_ooe_regStr_dTAGvDMSO\,
                 title = \hicdcp_ooe_regStr_dTAGvDMSO\, figDir)

plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \hicdcp_ooe_all_A485vDMSO\,
                 title = \hicdcp_ooe_all_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\S-S\),
                 name = \hicdcp_ooe_str_A485vDMSO\,
                 title = \hicdcp_ooe_str_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\S-S\, \S-X\),
                 name = \hicdcp_ooe_str2_A485vDMSO\,
                 title = \hicdcp_ooe_str2_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-P\, \P-E\, \E-E\),
                 name = \hicdcp_ooe_reg_A485vDMSO\,
                 title = \hicdcp_ooe_reg_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-S\, \E-S\),
                 name = \hicdcp_ooe_regStr_A485vDMSO\,
                 title = \hicdcp_ooe_regStr_A485vDMSO\, figDir)


plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \hicdcp_ooe_all_EpidTAGvEpiDMSO\,
                 title = \hicdcp_ooe_all_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\S-S\),
                 name = \hicdcp_ooe_str_EpidTAGvEpiDMSO\,
                 title = \hicdcp_ooe_str_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\S-S\, \S-X\),
                 name = \hicdcp_ooe_str2_EpidTAGvEpiDMSO\,
                 title = \hicdcp_ooe_str2_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-P\, \P-E\, \E-E\),
                 name = \hicdcp_ooe_reg_EpidTAGvEpiDMSO\,
                 title = \hicdcp_ooe_reg_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-S\, \E-S\),
                 name = \hicdcp_ooe_regStr_EpidTAGvEpiDMSO\,
                 title = \hicdcp_ooe_regStr_EpidTAGvEpiDMSO\, figDir)


plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \hicdcp_ooe_all_AIDvUT\,
                 title = \hicdcp_ooe_all_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\S-S\),
                 name = \hicdcp_ooe_str_AIDvUT\,
                 title = \hicdcp_ooe_str_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\S-S\, \S-X\),
                 name = \hicdcp_ooe_str2_AIDvUT\,
                 title = \hicdcp_ooe_str2_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-P\, \P-E\, \E-E\),
                 name = \hicdcp_ooe_reg_AIDvUT\,
                 title = \hicdcp_ooe_reg_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-S\, \E-S\),
                 name = \hicdcp_ooe_regStr_AIDvUT\,
                 title = \hicdcp_ooe_regStr_AIDvUT\, figDir)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dVptTkRkWFJ2Wm1ZZ1BDMGdNQzQxWEc1a2FXWm1RM1YwYjJabUlEd3RJREF1TlZ4dVkyOXRiVzl1VEc5dmNFUnBjaUE4TFNCb1pYSmxLRndpTGk0dlpHRjBZUzlzYjI5d1gyRnVZV3g1YzJselhDSXBYRzVrYVdabVJHbHlJRHd0SUdobGNtVW9YQ0l1TGk5a1lYUmhMMUpPUVY5a2FXWm1YQ0lwWEc1dVlXMWxJRHd0SUZ3aWFHbGpaR053WENKY2JtZGxibVZCYm01dlJHRjBZU0E4TFNCc2IyRmtURzl2Y0VGdWJtOUVZWFJoS0dobGNtVW9ZMjl0Ylc5dVRHOXZjRVJwY2l3Z2NHRnpkR1V3S0Z3aWJHOXZjRk5qYjNKbFgxd2lMQ0J1WVcxbExDQmNJbDl3TFc1ZmMybHRjR3hsWDJWdWMyVnRZbXhNYVhOMExuUnpkbHdpS1NrcElDVStKVnh1SUNCeWIzZDNhWE5sS0NrZ0pUNGxJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklIZHZjbXNnYjI1bElISnZkeUJoZENCaElIUnBiV1ZjYmlBZ2JYVjBZWFJsS0Z4dUlDQWdJRzFwYm5CdmN5QTlJRzFwYmloaktHOXZaVjlrVkVGSExDQnZiMlZmUkUxVFR5bGJZeWh2YjJWZlpGUkJSeXdnYjI5bFgwUk5VMDhwSUQ0Z01GMHNJRzVoTG5KdElEMGdWRkpWUlNrc1hHNGdJQ0FnWlhCeklDQWdJRDBnYVdabGJITmxLR2x6TG1acGJtbDBaU2h0YVc1d2IzTXBMQ0J0YVc1d2IzTWdLaUF3TGpFc0lEQXVNREVwTENBZ0lDQWdJQ01nWm1Gc2JHSmhZMnNnYVdZZ1ltOTBhQ0JoY21VZ01GeHVJQ0FnSUdScFptWWdJQ0E5SUd4dlp6SW9LRzl2WlY5a1ZFRkhJQ3NnWlhCektTQXZJQ2h2YjJWZlJFMVRUeUFySUdWd2N5a3BYRzRnSUNrZ0pUNGxJRnh1SUNCMWJtZHliM1Z3S0NrZ0pUNGxJRnh1SUNCelpXeGxZM1FvTFcxcGJuQnZjeXdnTFdWd2N5a2dYRzRnSUNOa2NHeDVjam82YlhWMFlYUmxLR1JwWm1ZZ1BTQnNiMmN5S0c5dlpWOWtWRUZIS1NBdElHeHZaeklvYjI5bFgwUk5VMDhwS1Z4dVhHNWthV1ptTGxKT1FTQThMU0JtY21WaFpDaG9aWEpsS0dScFptWkVhWElzSUZ3aVpHbG1abDlITVM1a1ZFRkhYMGN4TGpKcExtUlVRVWRmZG5OZlJ6RXVNbWt1UkUxVFR5NTBjM1pjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR1Z1YzJWdFlteGZaMlZ1WlY5cFpDd2diRzluTWtadmJHUkRhR0Z1WjJVc0lITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2NHRmthaXdnWlhoMFpYSnVZV3hmWjJWdVpWOXVZVzFsS1Z4dVoyVnVaVXhwYzNRdVpHOTNiaTVTVGtFZ1BDMGdLR1JwWm1ZdVVrNUJJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSE5vY21sdWEyVmtYMnh2WnpKR1F5QThQU0F3TENCd1lXUnFJRHdnWVd4d2FHRXBLU1JsYm5ObGJXSnNYMmRsYm1WZmFXUmNibWRsYm1WTWFYTjBMblZ3TGxKT1FTQThMU0FvWkdsbVppNVNUa0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRDRnTUN3Z2NHRmthaUE4SUdGc2NHaGhLU2trWlc1elpXMWliRjluWlc1bFgybGtYRzVjYmx4dWJXRjRURzluTWtaRElEd3RJREpjYmx4dWRHVnRjQ0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2xtWml3Z1oyVnVaU2tnSlQ0bElGeHVJQ0IxYm01bGMzUW9aMlZ1WlNrZ0pUNGxJR2R5YjNWd1gySjVLR2RsYm1VcElDVStKVnh1SUNCemRXMXRZWEpwZW1Vb2JXVmhibDlrYVdabVgzTmpiM0psSUQwZ2JXVmhiaWhrYVdabUtTd2dMbWR5YjNWd2N5QTlJQ2RrY205d0p5bGNibHh1ZEdWdGNDQThMU0JzWldaMFgycHZhVzRvZEdWdGNDd2daR2xtWmk1U1RrRXNJR0o1SUQwZ1l5aGNJbWRsYm1WY0lpQTlJRndpWlc1elpXMWliRjluWlc1bFgybGtYQ0lwS1NBbFBpVWdYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9abXhoWnlBOUlHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaVXhwYzNRdVpHOTNiaTVTVGtFc0lGd2lNa1JQVjA1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1ZFhBdVVrNUJMQ0JjSWpGVlVGd2lMQ0JjSWpCT1Qxd2lLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYldGNFJteGhaeUE5SUNoaFluTW9jMmh5YVc1clpXUmZiRzluTWtaREtTQStJRzFoZUV4dlp6SkdReWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJoeWJHOW5NbVpqVFdGNElEMGdjRzFoZUNod2JXbHVLSE5vY21sdWEyVmtYMnh2WnpKR1F5d2diV0Y0VEc5bk1rWkRLU3dnTFcxaGVFeHZaekpHUXlrcElDVStKU0JjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvWm14aFp5bGNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J6YUhKc2IyY3labU5OWVhnc0lIa2dQU0J0WldGdVgyUnBabVpmYzJOdmNtVXNJR052Ykc5eUlEMGdabXhoWnl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWVdKbGJDQTlJR2xtWld4elpTaG1iR0ZuSUNFOUlGd2lNRTVQWENJc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTd2dUa0VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vWVhCbElEMGdZWE11Wm1GamRHOXlLRzFoZUVac1lXY3BLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCblpXOXRYM1JsZUhSZmNtVndaV3dvS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJR2RuZEdsMGJHVW9jR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgyOXZaVjl6YVcxd2JHVkJibTV2WENJcEtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ1ptTkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBdFptTkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQnpZMkZzWlY5amIyeHZjbDl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWpCT1Qxd2lJRDBnWENKbmNtVjVYQ0lzSUZ3aU1WVlFYQ0lnUFNCY0luSmxaRndpTENCY0lqSkVUMWRPWENJZ1BTQmNJbUpzZFdWY0lpa3BJQ3NnSUNNZ1EyOXljbVZqZEdWa0lHTnZiRzl5SUcxaGNIQnBibWRjYmlBZ2MyTmhiR1ZmYzJoaGNHVmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YQ0pVVWxWRlhDSWdQU0F5TENCY0lrWkJURk5GWENJZ1BTQXhPU2twWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbEpPUVhaelRHOXZjRjljSWl3Z2JtRnRaU3dnWENKZmIyOWxYM05wYlhCc1pVRnVibTljSWlsY2JtaGxhV2RvZENBOExTQTBYRzUzYVdSMGFDQThMU0EzWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZkN1dG9mZiA8LSAwLjVcbmNvbW1vbkxvb3BEaXIgPC0gaGVyZShcXC4uL2RhdGEvbG9vcF9hbmFseXNpc1xcKVxuZGlmZkRpciA8LSBoZXJlKFxcLi4vZGF0YS9STkFfZGlmZlxcKVxubmFtZSA8LSBcXGhpY2RjcFxcXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbW1vbkxvb3BEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgbmFtZSwgXFxfcC1uX3NpbXBsZV9lbnNlbWJsTGlzdC50c3ZcXCkpKSAlPiVcbiAgcm93d2lzZSgpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3b3JrIG9uZSByb3cgYXQgYSB0aW1lXG4gIG11dGF0ZShcbiAgICBtaW5wb3MgPSBtaW4oYyhvb2VfZFRBRywgb29lX0RNU08pW2Mob29lX2RUQUcsIG9vZV9ETVNPKSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgIGVwcyAgICA9IGlmZWxzZShpcy5maW5pdGUobWlucG9zKSwgbWlucG9zICogMC4xLCAwLjAxKSwgICAgICAjIGZhbGxiYWNrIGlmIGJvdGggYXJlIDBcbiAgICBkaWZmICAgPSBsb2cyKChvb2VfZFRBRyArIGVwcykgLyAob29lX0RNU08gKyBlcHMpKVxuICApICU+JSBcbiAgdW5ncm91cCgpICU+JSBcbiAgc2VsZWN0KC1taW5wb3MsIC1lcHMpIFxuICAjZHBseXI6Om11dGF0ZShkaWZmID0gbG9nMihvb2VfZFRBRykgLSBsb2cyKG9vZV9ETVNPKSlcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShkaWZmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPD0gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmYsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZiksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZ3RpdGxlKHBhc3RlMChuYW1lLCBcXF9vb2Vfc2ltcGxlQW5ub1xcKSkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxSTkF2c0xvb3BfXFwsIG5hbWUsIFxcX29vZV9zaW1wbGVBbm5vXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
alpha <- 0.05
fcCutoff <- 0.5
diffCutoff <- 0.5
commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \hicdcp\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_simple_ensemblList.tsv\))) %>%
  rowwise() %>%                                # work one row at a time
  mutate(
    minpos = min(c(ooe_dTAG, ooe_DMSO)[c(ooe_dTAG, ooe_DMSO) > 0], na.rm = TRUE),
    eps    = ifelse(is.finite(minpos), minpos * 0.1, 0.01),      # fallback if both are 0
    diff   = log2((ooe_dTAG + eps) / (ooe_DMSO + eps))
  ) %>% 
  ungroup() %>% 
  select(-minpos, -eps) 
  #dplyr::mutate(diff = log2(ooe_dTAG) - log2(ooe_DMSO))

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_ooe_simpleAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_ooe_simpleAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlXeHdhR0VnUEMwZ01DNHdOVnh1Wm1ORGRYUnZabVlnUEMwZ01DNDFYRzVrYVdabVEzVjBiMlptSUR3dElEQXVOVnh1WTI5dGJXOXVURzl2Y0VScGNpQThMU0JvWlhKbEtGeGNMaTR2WkdGMFlTOXNiMjl3WDJGdVlXeDVjMmx6WEZ3cFhHNWthV1ptUkdseUlEd3RJR2hsY21Vb1hGd3VMaTlrWVhSaEwxSk9RVjlrYVdabVhGd3BYRzV1WVcxbElEd3RJRnhjYUdsalpHTndYRnhjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXRiVzl1VEc5dmNFUnBjaXdnY0dGemRHVXdLRnhjYkc5dmNGTmpiM0psWDF4Y0xDQnVZVzFsTENCY1hGOXdMVzVmYzJsdGNHeGxYMlZ1YzJWdFlteE1hWE4wTG5SemRseGNLU2twSUNVK0pWeHVJQ0J5YjNkM2FYTmxLQ2tnSlQ0bElDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUhkdmNtc2diMjVsSUhKdmR5QmhkQ0JoSUhScGJXVmNiaUFnYlhWMFlYUmxLRnh1SUNBZ0lHMXBibkJ2Y3lBOUlHMXBiaWhqS0c5dlpWOWtWRUZITENCdmIyVmZSRTFUVHlsYll5aHZiMlZmWkZSQlJ5d2diMjlsWDBSTlUwOHBJRDRnTUYwc0lHNWhMbkp0SUQwZ1ZGSlZSU2tzWEc0Z0lDQWdaWEJ6SUNBZ0lEMGdhV1psYkhObEtHbHpMbVpwYm1sMFpTaHRhVzV3YjNNcExDQnRhVzV3YjNNZ0tpQXdMakVzSURBdU1ERXBMQ0FnSUNBZ0lDTWdabUZzYkdKaFkyc2dhV1lnWW05MGFDQmhjbVVnTUZ4dUlDQWdJR1JwWm1ZZ0lDQTlJR3h2WnpJb0tHOXZaVjlrVkVGSElDc2daWEJ6S1NBdklDaHZiMlZmUkUxVFR5QXJJR1Z3Y3lrcFhHNGdJQ2tnSlQ0bElGeHVJQ0IxYm1keWIzVndLQ2tnSlQ0bElGeHVJQ0J6Wld4bFkzUW9MVzFwYm5CdmN5d2dMV1Z3Y3lrZ1hHNGdJQ05rY0d4NWNqbzZiWFYwWVhSbEtHUnBabVlnUFNCc2IyY3lLRzl2WlY5a1ZFRkhLU0F0SUd4dlp6SW9iMjlsWDBSTlUwOHBLVnh1WEc1a2FXWm1MbEpPUVNBOExTQm1jbVZoWkNob1pYSmxLR1JwWm1aRWFYSXNJRnhjWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHVnVjMlZ0WW14ZloyVnVaVjlwWkN3Z2JHOW5Na1p2YkdSRGFHRnVaMlVzSUhOb2NtbHVhMlZrWDJ4dlp6SkdReXdnY0dGa2Fpd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxLVnh1WjJWdVpVeHBjM1F1Wkc5M2JpNVNUa0VnUEMwZ0tHUnBabVl1VWs1QklDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtITm9jbWx1YTJWa1gyeHZaekpHUXlBOFBTQXdMQ0J3WVdScUlEd2dZV3h3YUdFcEtTUmxibk5sYldKc1gyZGxibVZmYVdSY2JtZGxibVZNYVhOMExuVndMbEpPUVNBOExTQW9aR2xtWmk1U1RrRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElENGdNQ3dnY0dGa2FpQThJR0ZzY0doaEtTa2taVzV6WlcxaWJGOW5aVzVsWDJsa1hHNWNibHh1YldGNFRHOW5Na1pESUR3dElESmNibHh1ZEdWdGNDQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbG1aaXdnWjJWdVpTa2dKVDRsSUZ4dUlDQjFibTVsYzNRb1oyVnVaU2tnSlQ0bElHZHliM1Z3WDJKNUtHZGxibVVwSUNVK0pWeHVJQ0J6ZFcxdFlYSnBlbVVvYldWaGJsOWthV1ptWDNOamIzSmxJRDBnYldWaGJpaGthV1ptS1N3Z0xtZHliM1Z3Y3lBOUlDZGtjbTl3SnlsY2JseHVkR1Z0Y0NBOExTQnNaV1owWDJwdmFXNG9kR1Z0Y0N3Z1pHbG1aaTVTVGtFc0lHSjVJRDBnWXloY1hHZGxibVZjWENBOUlGeGNaVzV6WlcxaWJGOW5aVzVsWDJsa1hGd3BLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pteGhaeUE5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1Wkc5M2JpNVNUa0VzSUZ4Y01rUlBWMDVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVkWEF1VWs1QkxDQmNYREZWVUZ4Y0xDQmNYREJPVDF4Y0tTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0Y0Um14aFp5QTlJQ2hoWW5Nb2MyaHlhVzVyWldSZmJHOW5Na1pES1NBK0lHMWhlRXh2WnpKR1F5a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmh5Ykc5bk1tWmpUV0Y0SUQwZ2NHMWhlQ2h3YldsdUtITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2JXRjRURzluTWtaREtTd2dMVzFoZUV4dlp6SkdReWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbUZ5Y21GdVoyVW9abXhoWnlsY2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQnphSEpzYjJjeVptTk5ZWGdzSUhrZ1BTQnRaV0Z1WDJScFptWmZjMk52Y21Vc0lHTnZiRzl5SUQwZ1pteGhaeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOUlHbG1aV3h6WlNobWJHRm5JQ0U5SUZ4Y01FNVBYRndzSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlN3Z1RrRXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9ZWEJsSUQwZ1lYTXVabUZqZEc5eUtHMWhlRVpzWVdjcEtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJuWlc5dFgzUmxlSFJmY21Wd1pXd29LU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FyWEc0Z0lHZG5kR2wwYkdVb2NHRnpkR1V3S0c1aGJXVXNJRnhjWDI5dlpWOXphVzF3YkdWQmJtNXZYRndwS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUMwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnWm1ORGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F0Wm1ORGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCelkyRnNaVjlqYjJ4dmNsOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYREJPVDF4Y0lEMGdYRnhuY21WNVhGd3NJRnhjTVZWUVhGd2dQU0JjWEhKbFpGeGNMQ0JjWERKRVQxZE9YRndnUFNCY1hHSnNkV1ZjWENrcElDc2dJQ01nUTI5eWNtVmpkR1ZrSUdOdmJHOXlJRzFoY0hCcGJtZGNiaUFnYzJOaGJHVmZjMmhoY0dWZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hGeFVVbFZGWEZ3Z1BTQXlMQ0JjWEVaQlRGTkZYRndnUFNBeE9Ta3BYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hGSk9RWFp6VEc5dmNGOWNYQ3dnYm1GdFpTd2dYRnhmYjI5bFgzTnBiWEJzWlVGdWJtOWNYQ2xjYm1obGFXZG9kQ0E4TFNBMFhHNTNhV1IwYUNBOExTQTNYRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZkN1dG9mZiA8LSAwLjVcbmNvbW1vbkxvb3BEaXIgPC0gaGVyZShcXC4uL2RhdGEvbG9vcF9hbmFseXNpc1xcKVxuZGlmZkRpciA8LSBoZXJlKFxcLi4vZGF0YS9STkFfZGlmZlxcKVxubmFtZSA8LSBcXGhpY2RjcFxcXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbW1vbkxvb3BEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgbmFtZSwgXFxfcC1uX3NpbXBsZV9lbnNlbWJsTGlzdC50c3ZcXCkpKSAlPiVcbiAgcm93d2lzZSgpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3b3JrIG9uZSByb3cgYXQgYSB0aW1lXG4gIG11dGF0ZShcbiAgICBtaW5wb3MgPSBtaW4oYyhvb2VfZFRBRywgb29lX0RNU08pW2Mob29lX2RUQUcsIG9vZV9ETVNPKSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgIGVwcyAgICA9IGlmZWxzZShpcy5maW5pdGUobWlucG9zKSwgbWlucG9zICogMC4xLCAwLjAxKSwgICAgICAjIGZhbGxiYWNrIGlmIGJvdGggYXJlIDBcbiAgICBkaWZmICAgPSBsb2cyKChvb2VfZFRBRyArIGVwcykgLyAob29lX0RNU08gKyBlcHMpKVxuICApICU+JSBcbiAgdW5ncm91cCgpICU+JSBcbiAgc2VsZWN0KC1taW5wb3MsIC1lcHMpIFxuICAjZHBseXI6Om11dGF0ZShkaWZmID0gbG9nMihvb2VfZFRBRykgLSBsb2cyKG9vZV9ETVNPKSlcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShkaWZmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPD0gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmYsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZiksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZ3RpdGxlKHBhc3RlMChuYW1lLCBcXF9vb2Vfc2ltcGxlQW5ub1xcKSkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxSTkF2c0xvb3BfXFwsIG5hbWUsIFxcX29vZV9zaW1wbGVBbm5vXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmQ3V0b2ZmIDwtIDAuNVxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5kaWZmRGlyIDwtIGhlcmUoXFwuLi9kYXRhL1JOQV9kaWZmXFwpXG5uYW1lIDwtIFxcaGljZGNwXFxcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBuYW1lLCBcXF9wLW5fc2ltcGxlX2Vuc2VtYmxMaXN0LnRzdlxcKSkpICU+JVxuICByb3d3aXNlKCkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvcmsgb25lIHJvdyBhdCBhIHRpbWVcbiAgbXV0YXRlKFxuICAgIG1pbnBvcyA9IG1pbihjKG9vZV9kVEFHLCBvb2VfRE1TTylbYyhvb2VfZFRBRywgb29lX0RNU08pID4gMF0sIG5hLnJtID0gVFJVRSksXG4gICAgZXBzICAgID0gaWZlbHNlKGlzLmZpbml0ZShtaW5wb3MpLCBtaW5wb3MgKiAwLjEsIDAuMDEpLCAgICAgICMgZmFsbGJhY2sgaWYgYm90aCBhcmUgMFxuICAgIGRpZmYgICA9IGxvZzIoKG9vZV9kVEFHICsgZXBzKSAvIChvb2VfRE1TTyArIGVwcykpXG4gICkgJT4lIFxuICB1bmdyb3VwKCkgJT4lIFxuICBzZWxlY3QoLW1pbnBvcywgLWVwcykgXG4gICNkcGx5cjo6bXV0YXRlKGRpZmYgPSBsb2cyKG9vZV9kVEFHKSAtIGxvZzIob29lX0RNU08pKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKGRpZmZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8PSAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5cblxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZiwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdndGl0bGUocGFzdGUwKG5hbWUsIFxcX29vZV9zaW1wbGVBbm5vXFwpKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxncmV5XFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXFJOQXZzTG9vcF9cXCwgbmFtZSwgXFxfb29lX3NpbXBsZUFubm9cXClcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
alpha <- 0.05
fcCutoff <- 0.5
diffCutoff <- 0.5
commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \hicdcp\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_simple_ensemblList.tsv\))) %>%
  rowwise() %>%                                # work one row at a time
  mutate(
    minpos = min(c(ooe_dTAG, ooe_DMSO)[c(ooe_dTAG, ooe_DMSO) > 0], na.rm = TRUE),
    eps    = ifelse(is.finite(minpos), minpos * 0.1, 0.01),      # fallback if both are 0
    diff   = log2((ooe_dTAG + eps) / (ooe_DMSO + eps))
  ) %>% 
  ungroup() %>% 
  select(-minpos, -eps) 
  #dplyr::mutate(diff = log2(ooe_dTAG) - log2(ooe_DMSO))

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_ooe_simpleAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_ooe_simpleAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Scatterplot - HiCDC+

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dVptTkRkWFJ2Wm1ZZ1BDMGdNQzQxWEc1a2FXWm1RM1YwYjJabUlEd3RJREF1TlZ4dVkyOXRiVzl1VEc5dmNFUnBjaUE4TFNCb1pYSmxLRndpTGk0dlpHRjBZUzlzYjI5d1gyRnVZV3g1YzJselhDSXBYRzVrYVdabVJHbHlJRHd0SUdobGNtVW9YQ0l1TGk5a1lYUmhMMUpPUVY5a2FXWm1YQ0lwWEc1dVlXMWxJRHd0SUZ3aWFHbGpaR053WENKY2JtZGxibVZCYm01dlJHRjBZU0E4TFNCc2IyRmtURzl2Y0VGdWJtOUVZWFJoS0dobGNtVW9ZMjl0Ylc5dVRHOXZjRVJwY2l3Z2NHRnpkR1V3S0Z3aWJHOXZjRk5qYjNKbFgxd2lMQ0J1WVcxbExDQmNJbDl3TFc1ZlkyOXRjR3hsZUY5bGJuTmxiV0pzVEdsemRDNTBjM1pjSWlrcEtTQWxQaVZjYmlBZ2NtOTNkMmx6WlNncElDVStKU0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5QjNiM0pySUc5dVpTQnliM2NnWVhRZ1lTQjBhVzFsWEc0Z0lHMTFkR0YwWlNoY2JpQWdJQ0J0YVc1d2IzTWdQU0J0YVc0b1l5aHZiMlZmWkZSQlJ5d2diMjlsWDBSTlUwOHBXMk1vYjI5bFgyUlVRVWNzSUc5dlpWOUVUVk5QS1NBK0lEQmRMQ0J1WVM1eWJTQTlJRlJTVlVVcExGeHVJQ0FnSUdWd2N5QWdJQ0E5SUdsbVpXeHpaU2hwY3k1bWFXNXBkR1VvYldsdWNHOXpLU3dnYldsdWNHOXpJQ29nTUM0eExDQXdMakF4S1N3Z0lDQWdJQ0FqSUdaaGJHeGlZV05ySUdsbUlHSnZkR2dnWVhKbElEQmNiaUFnSUNCa2FXWm1JQ0FnUFNCc2IyY3lLQ2h2YjJWZlpGUkJSeUFySUdWd2N5a2dMeUFvYjI5bFgwUk5VMDhnS3lCbGNITXBLVnh1SUNBcElDVStKU0JjYmlBZ2RXNW5jbTkxY0NncElDVStKU0JjYmlBZ2MyVnNaV04wS0MxdGFXNXdiM01zSUMxbGNITXBJRnh1SUNBalpIQnNlWEk2T20xMWRHRjBaU2hrYVdabUlEMGdiRzluTWlodmIyVmZaRlJCUnlrZ0xTQnNiMmN5S0c5dlpWOUVUVk5QS1NsY2JseHVaR2xtWmk1U1RrRWdQQzBnWm5KbFlXUW9hR1Z5WlNoa2FXWm1SR2x5TENCY0ltUnBabVpmUnpFdVpGUkJSMTlITVM0eWFTNWtWRUZIWDNaelgwY3hMakpwTGtSTlUwOHVkSE4yWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hsYm5ObGJXSnNYMmRsYm1WZmFXUXNJR3h2WnpKR2IyeGtRMmhoYm1kbExDQnphSEpwYm10bFpGOXNiMmN5UmtNc0lIQmhaR29zSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlNsY2JtZGxibVZNYVhOMExtUnZkMjR1VWs1QklEd3RJQ2hrYVdabUxsSk9RU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQRDBnTUN3Z2NHRmthaUE4SUdGc2NHaGhLU2trWlc1elpXMWliRjluWlc1bFgybGtYRzVuWlc1bFRHbHpkQzUxY0M1U1RrRWdQQzBnS0dScFptWXVVazVCSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hOb2NtbHVhMlZrWDJ4dlp6SkdReUErSURBc0lIQmhaR29nUENCaGJIQm9ZU2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WEc1Y2JtMWhlRXh2WnpKR1F5QThMU0F5WEc1Y2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwWm1Zc0lHZGxibVVwSUNVK0pTQmNiaUFnZFc1dVpYTjBLR2RsYm1VcElDVStKU0JuY205MWNGOWllU2huWlc1bEtTQWxQaVZjYmlBZ2MzVnRiV0Z5YVhwbEtHMWxZVzVmWkdsbVpsOXpZMjl5WlNBOUlHMWxZVzRvWkdsbVppa3NJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzVjYm5SbGJYQWdQQzBnYkdWbWRGOXFiMmx1S0hSbGJYQXNJR1JwWm1ZdVVrNUJMQ0JpZVNBOUlHTW9YQ0puWlc1bFhDSWdQU0JjSW1WdWMyVnRZbXhmWjJWdVpWOXBaRndpS1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1pzWVdjZ1BTQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExtUnZkMjR1VWs1QkxDQmNJakpFVDFkT1hDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVk1hWE4wTG5Wd0xsSk9RU3dnWENJeFZWQmNJaXdnWENJd1RrOWNJaWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxaGVFWnNZV2NnUFNBb1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJ0WVhoTWIyY3lSa01wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb2NteHZaekptWTAxaGVDQTlJSEJ0WVhnb2NHMXBiaWh6YUhKcGJtdGxaRjlzYjJjeVJrTXNJRzFoZUV4dlp6SkdReWtzSUMxdFlYaE1iMmN5UmtNcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0dac1lXY3BYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnYzJoeWJHOW5NbVpqVFdGNExDQjVJRDBnYldWaGJsOWthV1ptWDNOamIzSmxMQ0JqYjJ4dmNpQTlJR1pzWVdjc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdGaVpXd2dQU0JwWm1Wc2MyVW9abXhoWnlBaFBTQmNJakJPVDF3aUxDQmxlSFJsY201aGJGOW5aVzVsWDI1aGJXVXNJRTVCS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUdGd1pTQTlJR0Z6TG1aaFkzUnZjaWh0WVhoR2JHRm5LU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1oyVnZiVjkwWlhoMFgzSmxjR1ZzS0NrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJQ0JuWjNScGRHeGxLSEJoYzNSbE1DaHVZVzFsTENCY0lsOXZiMlZmWTI5dGNHeGxlRUZ1Ym05Y0lpa3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQmthV1ptUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdMU0JrYVdabVEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQm1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlDMW1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aU1FNVBYQ0lnUFNCY0ltZHlaWGxjSWl3Z1hDSXhWVkJjSWlBOUlGd2ljbVZrWENJc0lGd2lNa1JQVjA1Y0lpQTlJRndpWW14MVpWd2lLU2tnS3lBZ0l5QkRiM0p5WldOMFpXUWdZMjlzYjNJZ2JXRndjR2x1WjF4dUlDQnpZMkZzWlY5emFHRndaVjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWxSU1ZVVmNJaUE5SURJc0lGd2lSa0ZNVTBWY0lpQTlJREU1S1NsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpVWs1QmRuTk1iMjl3WDF3aUxDQnVZVzFsTENCY0lsOXZiMlZmWTI5dGNHeGxlRUZ1Ym05Y0lpbGNibWhsYVdkb2RDQThMU0EwWEc1M2FXUjBhQ0E4TFNBM1hHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmZDdXRvZmYgPC0gMC41XG5jb21tb25Mb29wRGlyIDwtIGhlcmUoXFwuLi9kYXRhL2xvb3BfYW5hbHlzaXNcXClcbmRpZmZEaXIgPC0gaGVyZShcXC4uL2RhdGEvUk5BX2RpZmZcXClcbm5hbWUgPC0gXFxoaWNkY3BcXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIG5hbWUsIFxcX3Atbl9jb21wbGV4X2Vuc2VtYmxMaXN0LnRzdlxcKSkpICU+JVxuICByb3d3aXNlKCkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvcmsgb25lIHJvdyBhdCBhIHRpbWVcbiAgbXV0YXRlKFxuICAgIG1pbnBvcyA9IG1pbihjKG9vZV9kVEFHLCBvb2VfRE1TTylbYyhvb2VfZFRBRywgb29lX0RNU08pID4gMF0sIG5hLnJtID0gVFJVRSksXG4gICAgZXBzICAgID0gaWZlbHNlKGlzLmZpbml0ZShtaW5wb3MpLCBtaW5wb3MgKiAwLjEsIDAuMDEpLCAgICAgICMgZmFsbGJhY2sgaWYgYm90aCBhcmUgMFxuICAgIGRpZmYgICA9IGxvZzIoKG9vZV9kVEFHICsgZXBzKSAvIChvb2VfRE1TTyArIGVwcykpXG4gICkgJT4lIFxuICB1bmdyb3VwKCkgJT4lIFxuICBzZWxlY3QoLW1pbnBvcywgLWVwcykgXG4gICNkcGx5cjo6bXV0YXRlKGRpZmYgPSBsb2cyKG9vZV9kVEFHKSAtIGxvZzIob29lX0RNU08pKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKGRpZmZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8PSAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5cblxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZiwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdndGl0bGUocGFzdGUwKG5hbWUsIFxcX29vZV9jb21wbGV4QW5ub1xcKSkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxSTkF2c0xvb3BfXFwsIG5hbWUsIFxcX29vZV9jb21wbGV4QW5ub1xcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
alpha <- 0.05
fcCutoff <- 0.5
diffCutoff <- 0.5
commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \hicdcp\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_complex_ensemblList.tsv\))) %>%
  rowwise() %>%                                # work one row at a time
  mutate(
    minpos = min(c(ooe_dTAG, ooe_DMSO)[c(ooe_dTAG, ooe_DMSO) > 0], na.rm = TRUE),
    eps    = ifelse(is.finite(minpos), minpos * 0.1, 0.01),      # fallback if both are 0
    diff   = log2((ooe_dTAG + eps) / (ooe_DMSO + eps))
  ) %>% 
  ungroup() %>% 
  select(-minpos, -eps) 
  #dplyr::mutate(diff = log2(ooe_dTAG) - log2(ooe_DMSO))

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_ooe_complexAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_ooe_complexAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlXeHdhR0VnUEMwZ01DNHdOVnh1Wm1ORGRYUnZabVlnUEMwZ01DNDFYRzVrYVdabVEzVjBiMlptSUR3dElEQXVOVnh1WTI5dGJXOXVURzl2Y0VScGNpQThMU0JvWlhKbEtGeGNMaTR2WkdGMFlTOXNiMjl3WDJGdVlXeDVjMmx6WEZ3cFhHNWthV1ptUkdseUlEd3RJR2hsY21Vb1hGd3VMaTlrWVhSaEwxSk9RVjlrYVdabVhGd3BYRzV1WVcxbElEd3RJRnhjYUdsalpHTndYRnhjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXRiVzl1VEc5dmNFUnBjaXdnY0dGemRHVXdLRnhjYkc5dmNGTmpiM0psWDF4Y0xDQnVZVzFsTENCY1hGOXdMVzVmWTI5dGNHeGxlRjlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNYQ2twS1NBbFBpVmNiaUFnY205M2QybHpaU2dwSUNVK0pTQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlCM2IzSnJJRzl1WlNCeWIzY2dZWFFnWVNCMGFXMWxYRzRnSUcxMWRHRjBaU2hjYmlBZ0lDQnRhVzV3YjNNZ1BTQnRhVzRvWXlodmIyVmZaRlJCUnl3Z2IyOWxYMFJOVTA4cFcyTW9iMjlsWDJSVVFVY3NJRzl2WlY5RVRWTlBLU0ErSURCZExDQnVZUzV5YlNBOUlGUlNWVVVwTEZ4dUlDQWdJR1Z3Y3lBZ0lDQTlJR2xtWld4elpTaHBjeTVtYVc1cGRHVW9iV2x1Y0c5ektTd2diV2x1Y0c5eklDb2dNQzR4TENBd0xqQXhLU3dnSUNBZ0lDQWpJR1poYkd4aVlXTnJJR2xtSUdKdmRHZ2dZWEpsSURCY2JpQWdJQ0JrYVdabUlDQWdQU0JzYjJjeUtDaHZiMlZmWkZSQlJ5QXJJR1Z3Y3lrZ0x5QW9iMjlsWDBSTlUwOGdLeUJsY0hNcEtWeHVJQ0FwSUNVK0pTQmNiaUFnZFc1bmNtOTFjQ2dwSUNVK0pTQmNiaUFnYzJWc1pXTjBLQzF0YVc1d2IzTXNJQzFsY0hNcElGeHVJQ0FqWkhCc2VYSTZPbTExZEdGMFpTaGthV1ptSUQwZ2JHOW5NaWh2YjJWZlpGUkJSeWtnTFNCc2IyY3lLRzl2WlY5RVRWTlBLU2xjYmx4dVpHbG1aaTVTVGtFZ1BDMGdabkpsWVdRb2FHVnlaU2hrYVdabVJHbHlMQ0JjWEdScFptWmZSekV1WkZSQlIxOUhNUzR5YVM1a1ZFRkhYM1p6WDBjeExqSnBMa1JOVTA4dWRITjJYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGxibk5sYldKc1gyZGxibVZmYVdRc0lHeHZaekpHYjJ4a1EyaGhibWRsTENCemFISnBibXRsWkY5c2IyY3lSa01zSUhCaFpHb3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU2xjYm1kbGJtVk1hWE4wTG1SdmQyNHVVazVCSUR3dElDaGthV1ptTGxKT1FTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BEMGdNQ3dnY0dGa2FpQThJR0ZzY0doaEtTa2taVzV6WlcxaWJGOW5aVzVsWDJsa1hHNW5aVzVsVEdsemRDNTFjQzVTVGtFZ1BDMGdLR1JwWm1ZdVVrNUJJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSE5vY21sdWEyVmtYMnh2WnpKR1F5QStJREFzSUhCaFpHb2dQQ0JoYkhCb1lTa3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVYRzVjYm0xaGVFeHZaekpHUXlBOExTQXlYRzVjYm5SbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBabVlzSUdkbGJtVXBJQ1UrSlNCY2JpQWdkVzV1WlhOMEtHZGxibVVwSUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0cxbFlXNWZaR2xtWmw5elkyOXlaU0E5SUcxbFlXNG9aR2xtWmlrc0lDNW5jbTkxY0hNZ1BTQW5aSEp2Y0NjcFhHNWNiblJsYlhBZ1BDMGdiR1ZtZEY5cWIybHVLSFJsYlhBc0lHUnBabVl1VWs1QkxDQmllU0E5SUdNb1hGeG5aVzVsWEZ3Z1BTQmNYR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeGNLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHWnNZV2NnUFNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVk1hWE4wTG1SdmQyNHVVazVCTENCY1hESkVUMWRPWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1WTWFYTjBMblZ3TGxKT1FTd2dYRnd4VlZCY1hDd2dYRnd3VGs5Y1hDa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzFoZUVac1lXY2dQU0FvWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQnRZWGhNYjJjeVJrTXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vY214dlp6Sm1ZMDFoZUNBOUlIQnRZWGdvY0cxcGJpaHphSEpwYm10bFpGOXNiMmN5UmtNc0lHMWhlRXh2WnpKR1F5a3NJQzF0WVhoTWIyY3lSa01wS1NBbFBpVWdYRzRnSUdSd2JIbHlPanBoY25KaGJtZGxLR1pzWVdjcFhHNWNibkFnUEMwZ1oyZHdiRzkwS0hSbGJYQXNJR0ZsY3loNElEMGdjMmh5Ykc5bk1tWmpUV0Y0TENCNUlEMGdiV1ZoYmw5a2FXWm1YM05qYjNKbExDQmpiMnh2Y2lBOUlHWnNZV2NzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BTQnBabVZzYzJVb1pteGhaeUFoUFNCY1hEQk9UMXhjTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVc0lFNUJLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphR0Z3WlNBOUlHRnpMbVpoWTNSdmNpaHRZWGhHYkdGbktTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWjJWdmJWOTBaWGgwWDNKbGNHVnNLQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQm5aM1JwZEd4bEtIQmhjM1JsTUNodVlXMWxMQ0JjWEY5dmIyVmZZMjl0Y0d4bGVFRnVibTljWENrcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ0xTQmthV1ptUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdNQ2tnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNCbVkwTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUMxbVkwTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lITmpZV3hsWDJOdmJHOXlYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjTUU1UFhGd2dQU0JjWEdkeVpYbGNYQ3dnWEZ3eFZWQmNYQ0E5SUZ4Y2NtVmtYRndzSUZ4Y01rUlBWMDVjWENBOUlGeGNZbXgxWlZ4Y0tTa2dLeUFnSXlCRGIzSnlaV04wWldRZ1kyOXNiM0lnYldGd2NHbHVaMXh1SUNCelkyRnNaVjl6YUdGd1pWOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYRlJTVlVWY1hDQTlJRElzSUZ4Y1JrRk1VMFZjWENBOUlERTVLU2xjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNVazVCZG5OTWIyOXdYMXhjTENCdVlXMWxMQ0JjWEY5dmIyVmZZMjl0Y0d4bGVFRnVibTljWENsY2JtaGxhV2RvZENBOExTQTBYRzUzYVdSMGFDQThMU0EzWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmZDdXRvZmYgPC0gMC41XG5jb21tb25Mb29wRGlyIDwtIGhlcmUoXFwuLi9kYXRhL2xvb3BfYW5hbHlzaXNcXClcbmRpZmZEaXIgPC0gaGVyZShcXC4uL2RhdGEvUk5BX2RpZmZcXClcbm5hbWUgPC0gXFxoaWNkY3BcXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIG5hbWUsIFxcX3Atbl9jb21wbGV4X2Vuc2VtYmxMaXN0LnRzdlxcKSkpICU+JVxuICByb3d3aXNlKCkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvcmsgb25lIHJvdyBhdCBhIHRpbWVcbiAgbXV0YXRlKFxuICAgIG1pbnBvcyA9IG1pbihjKG9vZV9kVEFHLCBvb2VfRE1TTylbYyhvb2VfZFRBRywgb29lX0RNU08pID4gMF0sIG5hLnJtID0gVFJVRSksXG4gICAgZXBzICAgID0gaWZlbHNlKGlzLmZpbml0ZShtaW5wb3MpLCBtaW5wb3MgKiAwLjEsIDAuMDEpLCAgICAgICMgZmFsbGJhY2sgaWYgYm90aCBhcmUgMFxuICAgIGRpZmYgICA9IGxvZzIoKG9vZV9kVEFHICsgZXBzKSAvIChvb2VfRE1TTyArIGVwcykpXG4gICkgJT4lIFxuICB1bmdyb3VwKCkgJT4lIFxuICBzZWxlY3QoLW1pbnBvcywgLWVwcykgXG4gICNkcGx5cjo6bXV0YXRlKGRpZmYgPSBsb2cyKG9vZV9kVEFHKSAtIGxvZzIob29lX0RNU08pKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKGRpZmZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8PSAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5cblxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZiwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdndGl0bGUocGFzdGUwKG5hbWUsIFxcX29vZV9jb21wbGV4QW5ub1xcKSkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxSTkF2c0xvb3BfXFwsIG5hbWUsIFxcX29vZV9jb21wbGV4QW5ub1xcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmQ3V0b2ZmIDwtIDAuNVxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5kaWZmRGlyIDwtIGhlcmUoXFwuLi9kYXRhL1JOQV9kaWZmXFwpXG5uYW1lIDwtIFxcaGljZGNwXFxcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBuYW1lLCBcXF9wLW5fY29tcGxleF9lbnNlbWJsTGlzdC50c3ZcXCkpKSAlPiVcbiAgcm93d2lzZSgpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3b3JrIG9uZSByb3cgYXQgYSB0aW1lXG4gIG11dGF0ZShcbiAgICBtaW5wb3MgPSBtaW4oYyhvb2VfZFRBRywgb29lX0RNU08pW2Mob29lX2RUQUcsIG9vZV9ETVNPKSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgIGVwcyAgICA9IGlmZWxzZShpcy5maW5pdGUobWlucG9zKSwgbWlucG9zICogMC4xLCAwLjAxKSwgICAgICAjIGZhbGxiYWNrIGlmIGJvdGggYXJlIDBcbiAgICBkaWZmICAgPSBsb2cyKChvb2VfZFRBRyArIGVwcykgLyAob29lX0RNU08gKyBlcHMpKVxuICApICU+JSBcbiAgdW5ncm91cCgpICU+JSBcbiAgc2VsZWN0KC1taW5wb3MsIC1lcHMpIFxuICAjZHBseXI6Om11dGF0ZShkaWZmID0gbG9nMihvb2VfZFRBRykgLSBsb2cyKG9vZV9ETVNPKSlcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShkaWZmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPD0gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmYsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZiksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZ3RpdGxlKHBhc3RlMChuYW1lLCBcXF9vb2VfY29tcGxleEFubm9cXCkpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcUk5BdnNMb29wX1xcLCBuYW1lLCBcXF9vb2VfY29tcGxleEFubm9cXClcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
alpha <- 0.05
fcCutoff <- 0.5
diffCutoff <- 0.5
commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \hicdcp\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_complex_ensemblList.tsv\))) %>%
  rowwise() %>%                                # work one row at a time
  mutate(
    minpos = min(c(ooe_dTAG, ooe_DMSO)[c(ooe_dTAG, ooe_DMSO) > 0], na.rm = TRUE),
    eps    = ifelse(is.finite(minpos), minpos * 0.1, 0.01),      # fallback if both are 0
    diff   = log2((ooe_dTAG + eps) / (ooe_DMSO + eps))
  ) %>% 
  ungroup() %>% 
  select(-minpos, -eps) 
  #dplyr::mutate(diff = log2(ooe_dTAG) - log2(ooe_DMSO))

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_ooe_complexAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_ooe_complexAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### RNA-seq loopscore scatterplot

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5QThMU0JtZFc1amRHbHZiaWhrWml3Z1kyOXNYM2dzSUdOdmJGOTVMQ0JoYm01dlRHbHpkQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaU3dnZEdsMGJHVXNJR1pwWjBScGNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsbVprTjFkRzltWmlBOUlEQXVOU3dnWkdWdWMybDBlVjl1SUQwZ01UQXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCNGJXbHVJRDBnTFRBdU5Td2dlRzFoZUNBOUlERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhsdGFXNGdQU0F0TUM0MUxDQjViV0Y0SUQwZ01Ta2dlMXh1SUNCamIyeGZlRjl4SUR3dElHVnVjWFZ2S0dOdmJGOTRLVnh1SUNCamIyeGZlVjl4SUR3dElHVnVjWFZ2S0dOdmJGOTVLVnh1SUNCY2JpQWdJeUJUWTJGMGRHVnljR3h2ZEZ4dUlDQmtaaklnUEMwZ1pHWWdKVDRsWEc0Z0lDQWdabWxzZEdWeUtFRnVibTlmYzJsdGNHeGxJQ1ZwYmlVZ1lXNXViMHhwYzNRcElDVStKVnh1SUNBZ0lITmxiR1ZqZENocFpDd2dlQ0E5SUNFaFkyOXNYM2hmY1N3Z2VTQTlJQ0VoWTI5c1gzbGZjU2tnSlQ0bFhHNGdJQ0FnYlhWMFlYUmxLRnh1SUNBZ0lDQWdiV2x1Y0c5eklEMGdiV2x1S0dNb2VDd2dlU2xiWXloNExDQjVLU0ErSURCZExDQnVZUzV5YlNBOUlGUlNWVVVwTEZ4dUlDQWdJQ0FnWlhCeklDQWdJRDBnYldsdWNHOXpJQ29nTUM0eExGeHVJQ0FnSUNBZ2JIZ2dJQ0FnSUQwZ2JHOW5NaWg0SUNzZ1pYQnpLU3hjYmlBZ0lDQWdJR3g1SUNBZ0lDQTlJR3h2WnpJb2VTQXJJR1Z3Y3lsY2JpQWdJQ0FwWEc0Z0lGeHVJQ0J3TVNBOExTQm5aM0JzYjNRb1pHWXlMQ0JoWlhNb2VDQTlJR3g0TENCNUlEMGdiSGtwS1NBclhHNGdJQ0FnWjJWdmJWOXdiMmx1ZENncElDdGNiaUFnSUNCelkyRnNaVjlqYjJ4dmNsOTJhWEpwWkdsektDa2dLMXh1SUNBZ0lITmpZV3hsWDNoZlkyOXVkR2x1ZFc5MWN5aGNiaUFnSUNBZ0lHNWhiV1VnSUNBOUlIQmhjM1JsTUNoY0lteHZaeklvWENJc0lIRjFiMTl1WVcxbEtHTnZiRjk0WDNFcExDQmNJaWxjSWlsY2JpQWdJQ0FwSUN0Y2JpQWdJQ0J6WTJGc1pWOTVYMk52Ym5ScGJuVnZkWE1vWEc0Z0lDQWdJQ0J1WVcxbElDQWdQU0J3WVhOMFpUQW9YQ0pzYjJjeUtGd2lMQ0J4ZFc5ZmJtRnRaU2hqYjJ4ZmVWOXhLU3dnWENJcFhDSXBYRzRnSUNBZ0tTQXJYRzRnSUNBZ1kyOXZjbVJmWm1sNFpXUW9LU0FyWEc0Z0lDQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5MWNpQTlJRndpWjNKbGVUVXdYQ0lzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SUNBZ0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmRYSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQWdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZkWElnUFNCY0ltZHlaWGxjSWlrZ0sxeHVJQ0FnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTFNneUtpcGthV1ptUTNWMGIyWm1LU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmRYSWdQU0JjSW1keVpYbGNJaXdnYkdsdVpYUjVjR1VnUFNCY0ltUnZkSFJsWkZ3aUtTQXJYRzRnSUNBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBb01pb3FaR2xtWmtOMWRHOW1aaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzVnlJRDBnWENKbmNtVjVYQ0lzSUd4cGJtVjBlWEJsSUQwZ1hDSmtiM1IwWldSY0lpa2dLMXh1SUNBZ0lIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJQ0FnYkdGaWN5aDRJRDBnY1hWdlgyNWhiV1VvWTI5c1gzaGZjU2tzWEc0Z0lDQWdJQ0FnSUNCNUlEMGdjWFZ2WDI1aGJXVW9ZMjlzWDNsZmNTa3BJQ3RjYmlBZ0lDQm5aM1JwZEd4bEtIUnBkR3hsS1Z4dUlDQmNiaUFnWm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWMyTmhkSFJsY25Cc2IzUmZYQ0lzSUc1aGJXVXBYRzRnSUhOMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dYRzRnSUNBZ0lDQWdJQ0FnZDJsa2RHZ2dQU0F6TGpVc0lHaGxhV2RvZENBOUlETXBYRzRnSUhCeWFXNTBLSEF4S1Z4dUlDQmtaWFl1YjJabUtDbGNiaUFnWEc0Z0lIQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQmNiaUFnSUNBZ0lIZHBaSFJvSUQwZ015NDFMQ0JvWldsbmFIUWdQU0F6TENCMWJtbDBjeUE5SUZ3aWFXNWNJaXdnY21WeklEMGdOakF3S1Z4dUlDQndjbWx1ZENod01TbGNiaUFnWkdWMkxtOW1aaWdwWEc0Z0lGeHVJQ0FqSUZCcFpTQmphR0Z5ZEZ4dUlDQmtaak1nUEMwZ1pHWWdKVDRsWEc0Z0lDQWdabWxzZEdWeUtFRnVibTlmYzJsdGNHeGxJQ1ZwYmlVZ1lXNXViMHhwYzNRcElDVStKVnh1SUNBZ0lITmxiR1ZqZENocFpDd2dlQ0E5SUNFaFkyOXNYM2hmY1N3Z2VTQTlJQ0VoWTI5c1gzbGZjU2tnSlQ0bFhHNGdJQ0FnYlhWMFlYUmxLRnh1SUNBZ0lDQWdiV2x1Y0c5eklEMGdiV2x1S0dNb2VDd2dlU2xiWXloNExDQjVLU0ErSURCZExDQnVZUzV5YlNBOUlGUlNWVVVwTEZ4dUlDQWdJQ0FnWlhCeklDQWdJRDBnYldsdWNHOXpJQ29nTUM0eExGeHVJQ0FnSUNBZ2JIZ2dJQ0FnSUQwZ2JHOW5NaWg0SUNzZ1pYQnpLU3hjYmlBZ0lDQWdJR3g1SUNBZ0lDQTlJR3h2WnpJb2VTQXJJR1Z3Y3lsY2JpQWdJQ0FwSUNVK0pWeHVJQ0FnSUcxMWRHRjBaU2hrYVdabUlEMGdiSGtnTFNCc2VDa2dKVDRsWEc0Z0lDQWdiWFYwWVhSbEtIVndaRzkzYmlBOUlHbG1aV3h6WlNoa2FXWm1JRDRnWkdsbVprTjFkRzltWml3Z1hDSlZVRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dScFptWWdQQ0F0WkdsbVprTjFkRzltWml3Z1hDSkVUMWRPWENJc0lGd2lUazljSWlrcEtWeHVJQ0JrWmpNa2RYQmtiM2R1SUR3dElHWmhZM1J2Y2loa1pqTWtkWEJrYjNkdUxDQmpLRndpVlZCY0lpd2dYQ0pPVDF3aUxDQmNJa1JQVjA1Y0lpa3BYRzRnSUZ4dUlDQndhV1ZmWkdZZ1BDMGdaR1l6SUNVK0pWeHVJQ0FnSUdSd2JIbHlPanBqYjNWdWRDaDFjR1J2ZDI0cElDVStKVnh1SUNBZ0lHMTFkR0YwWlNod1kzUWdJQ0E5SUc0Z0x5QnpkVzBvYmlrZ0tpQXhNREFzWEc0Z0lDQWdJQ0FnSUNBZ0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0hWd1pHOTNiaXdnWENKY1hHNWNJaXdnYml3Z1hDSmNYRzRvWENJc0lISnZkVzVrS0hCamRDd3hLU3dnWENJbEtWd2lLU2xjYmx4dUlDQndNaUE4TFNCblozQnNiM1FvY0dsbFgyUm1MQ0JoWlhNb2VDQTlJRndpWENJc0lIa2dQU0J1TENCbWFXeHNJRDBnZFhCa2IzZHVLU2tnSzF4dUlDQWdJR2RsYjIxZlkyOXNLR052Ykc5eUlEMGdYQ0ozYUdsMFpWd2lLU0FyWEc0Z0lDQWdZMjl2Y21SZmNHOXNZWElvZEdobGRHRWdQU0JjSW5sY0lpa2dLMXh1SUNBZ0lHZGxiMjFmZEdWNGRDaGhaWE1vYkdGaVpXd2dQU0JzWVdKbGJDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIQnZjMmwwYVc5dUlEMGdjRzl6YVhScGIyNWZjM1JoWTJzb2RtcDFjM1FnUFNBd0xqVXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQnphWHBsSUNBZ0lDQTlJR1p2Ym5SVGFYcGxUUzh5S1NBclhHNGdJQ0FnZEdobGJXVmZkbTlwWkNncElDc2dJQ0IwYUdWdFpTaHNaV2RsYm1RdWNHOXphWFJwYjI0Z1BTQmNJbTV2Ym1WY0lpa2dLMXh1SUNBZ0lITmpZV3hsWDJacGJHeGZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9jM1J5YjI1blgzSmxaQ3dnYm05ZlozSmxlU3dnYzNSeWIyNW5YMkpzZFdVcEtWeHVJQ0JtYVd4bFRtRnRaU0E4TFNCb1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tGd2ljR2xsWTJoaGNuUmZYQ0lzSUc1aGJXVXBLVnh1SUNCM2FXUjBhQ0E4TFNCd1lXNWxiRk5wZW1Vb01pa3FiVzFVYjBsdVkyaGNiaUFnYUdWcFoyaDBJRHd0SUhCaGJtVnNVMmw2WlNneUtTcHRiVlJ2U1c1amFGeHVJQ0J6ZG1kc2FYUmxLSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBMQ0IzYVdSMGFDQTlJSGRwWkhSb0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRcFhHNGdJSEJ5YVc1MEtIQXlLVnh1SUNCa1pYWXViMlptS0NsY2JuMWNibHh1WTI5dGJXOXVURzl2Y0VScGNpQThMU0JvWlhKbEtGd2lMaTR2WkdGMFlTOXNiMjl3WDJGdVlXeDVjMmx6WENJcFhHNW1hV2RFYVhJZ1BDMGdhR1Z5WlNoY0lpNHVMMlpwWjNWeVpTOXNiMjl3WDJGdVlXeDVjMmx6WENJcFhHNWthWEl1WTNKbFlYUmxLR1pwWjBScGNpd2djMmh2ZDFkaGNtNXBibWR6SUQwZ1JrRk1VMFVzSUhKbFkzVnljMmwyWlNBOUlGUlNWVVVwWEc1Y2JtUmhkR0VnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjF0YjI1TWIyOXdSR2x5TENCY0lteHZiM0JUWTI5eVpWOUlZVzV6Wlc0dWRITjJYQ0lwS1Z4dVpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCY2JpQWdabWxzZEdWeUtGeHVJQ0FnSUNGcFpsOWhiR3dvYzNSaGNuUnpYM2RwZEdnb1hDSnZiMlZjSWlrc0lINGdMbmdnUFQwZ01Da2dJQ0FqSUdSeWIzQWdjbTkzY3lCM2FHVnlaU0FxWlhabGNua3FJRzl2WlNvZ2RtRnNkV1VnYVhNZ01GeHVLVnh1WEc1d2JHOTBYMnh2YjNCZmMyTnZjbVZ6S0dSaGRHRXNJRzl2WlY5RVRWTlBMQ0J2YjJWZlpGUkJSeXdnWXloY0lsQXRVRndpTENCY0lsQXRSVndpTENCY0lsQXRVMXdpTENCY0lsQXRXRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpUlMxRlhDSXNJRndpUlMxVFhDSXNJRndpUlMxWVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSlRMVk5jSWl3Z1hDSlRMVmhjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWxndFdGd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpU0dGdWMyVnVYMjl2WlY5aGJHeGZaRlJCUjNaRVRWTlBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWENKSVlXNXpaVzVmYjI5bFgyRnNiRjlrVkVGSGRrUk5VMDljSWl3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlJFMVRUeXdnYjI5bFgyUlVRVWNzSUdNb1hDSlRMVk5jSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY0lraGhibk5sYmw5dmIyVmZjM1J5WDJSVVFVZDJSRTFUVDF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhWFJzWlNBOUlGd2lTR0Z1YzJWdVgyOXZaVjl6ZEhKZlpGUkJSM1pFVFZOUFhDSXNJR1pwWjBScGNpbGNibkJzYjNSZmJHOXZjRjl6WTI5eVpYTW9aR0YwWVN3Z2IyOWxYMFJOVTA4c0lHOXZaVjlrVkVGSExDQmpLRndpVXkxVFhDSXNJRndpVXkxWVhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYQ0pJWVc1elpXNWZiMjlsWDNOMGNqSmZaRlJCUjNaRVRWTlBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWENKSVlXNXpaVzVmYjI5bFgzTjBjakpmWkZSQlIzWkVUVk5QWENJc0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwUk5VMDhzSUc5dlpWOWtWRUZITENCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJc0lGd2lSUzFGWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hDSklZVzV6Wlc1ZmIyOWxYM0psWjE5a1ZFRkhka1JOVTA5Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNJa2hoYm5ObGJsOXZiMlZmY21WblgyUlVRVWQyUkUxVFQxd2lMQ0JtYVdkRWFYSXBYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlFVFZOUExDQnZiMlZmWkZSQlJ5d2dZeWhjSWxBdFUxd2lMQ0JjSWtVdFUxd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpU0dGdWMyVnVYMjl2WlY5eVpXZFRkSEpmWkZSQlIzWkVUVk5QWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBkR3hsSUQwZ1hDSklZVzV6Wlc1ZmIyOWxYM0psWjFOMGNsOWtWRUZIZGtSTlUwOWNJaXdnWm1sblJHbHlLVnh1WEc1d2JHOTBYMnh2YjNCZmMyTnZjbVZ6S0dSaGRHRXNJRzl2WlY5RVRWTlBMQ0J2YjJWZlFUUTROU3dnWXloY0lsQXRVRndpTENCY0lsQXRSVndpTENCY0lsQXRVMXdpTENCY0lsQXRXRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpUlMxRlhDSXNJRndpUlMxVFhDSXNJRndpUlMxWVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSlRMVk5jSWl3Z1hDSlRMVmhjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWxndFdGd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpU0dGdWMyVnVYMjl2WlY5aGJHeGZRVFE0TlhaRVRWTlBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWENKSVlXNXpaVzVmYjI5bFgyRnNiRjlCTkRnMWRrUk5VMDljSWl3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlJFMVRUeXdnYjI5bFgwRTBPRFVzSUdNb1hDSlRMVk5jSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY0lraGhibk5sYmw5dmIyVmZjM1J5WDBFME9EVjJSRTFUVDF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhWFJzWlNBOUlGd2lTR0Z1YzJWdVgyOXZaVjl6ZEhKZlFUUTROWFpFVFZOUFhDSXNJR1pwWjBScGNpbGNibkJzYjNSZmJHOXZjRjl6WTI5eVpYTW9aR0YwWVN3Z2IyOWxYMFJOVTA4c0lHOXZaVjlCTkRnMUxDQmpLRndpVXkxVFhDSXNJRndpVXkxWVhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYQ0pJWVc1elpXNWZiMjlsWDNOMGNqSmZRVFE0TlhaRVRWTlBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWENKSVlXNXpaVzVmYjI5bFgzTjBjakpmUVRRNE5YWkVUVk5QWENJc0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwUk5VMDhzSUc5dlpWOUJORGcxTENCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJc0lGd2lSUzFGWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hDSklZVzV6Wlc1ZmIyOWxYM0psWjE5Qk5EZzFka1JOVTA5Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNJa2hoYm5ObGJsOXZiMlZmY21WblgwRTBPRFYyUkUxVFQxd2lMQ0JtYVdkRWFYSXBYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlFVFZOUExDQnZiMlZmUVRRNE5Td2dZeWhjSWxBdFUxd2lMQ0JjSWtVdFUxd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpU0dGdWMyVnVYMjl2WlY5eVpXZFRkSEpmUVRRNE5YWkVUVk5QWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBkR3hsSUQwZ1hDSklZVzV6Wlc1ZmIyOWxYM0psWjFOMGNsOUJORGcxZGtSTlUwOWNJaXdnWm1sblJHbHlLVnh1WEc1Y2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwVndhVVJOVTA4c0lHOXZaVjlGY0dsa1ZFRkhMQ0JqS0Z3aVVDMVFYQ0lzSUZ3aVVDMUZYQ0lzSUZ3aVVDMVRYQ0lzSUZ3aVVDMVlYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0pGTFVWY0lpd2dYQ0pGTFZOY0lpd2dYQ0pGTFZoY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lsTXRVMXdpTENCY0lsTXRXRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpV0MxWVhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYQ0pJWVc1elpXNWZiMjlsWDJGc2JGOUZjR2xrVkVGSGRrVndhVVJOVTA5Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNJa2hoYm5ObGJsOXZiMlZmWVd4c1gwVndhV1JVUVVkMlJYQnBSRTFUVDF3aUxDQm1hV2RFYVhJcFhHNXdiRzkwWDJ4dmIzQmZjMk52Y21WektHUmhkR0VzSUc5dlpWOUZjR2xFVFZOUExDQnZiMlZmUlhCcFpGUkJSeXdnWXloY0lsTXRVMXdpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaU0E5SUZ3aVNHRnVjMlZ1WDI5dlpWOXpkSEpmUlhCcFpGUkJSM1pGY0dsRVRWTlBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWENKSVlXNXpaVzVmYjI5bFgzTjBjbDlGY0dsa1ZFRkhka1Z3YVVSTlUwOWNJaXdnWm1sblJHbHlLVnh1Y0d4dmRGOXNiMjl3WDNOamIzSmxjeWhrWVhSaExDQnZiMlZmUlhCcFJFMVRUeXdnYjI5bFgwVndhV1JVUVVjc0lHTW9YQ0pUTFZOY0lpd2dYQ0pUTFZoY0lpa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVZ1BTQmNJa2hoYm5ObGJsOXZiMlZmYzNSeU1sOUZjR2xrVkVGSGRrVndhVVJOVTA5Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNJa2hoYm5ObGJsOXZiMlZmYzNSeU1sOUZjR2xrVkVGSGRrVndhVVJOVTA5Y0lpd2dabWxuUkdseUtWeHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZSWEJwUkUxVFR5d2diMjlsWDBWd2FXUlVRVWNzSUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSkZMVVZjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY0lraGhibk5sYmw5dmIyVmZjbVZuWDBWd2FXUlVRVWQyUlhCcFJFMVRUMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ3aVNHRnVjMlZ1WDI5dlpWOXlaV2RmUlhCcFpGUkJSM1pGY0dsRVRWTlBYQ0lzSUdacFowUnBjaWxjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDBWd2FVUk5VMDhzSUc5dlpWOUZjR2xrVkVGSExDQmpLRndpVUMxVFhDSXNJRndpUlMxVFhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbElEMGdYQ0pJWVc1elpXNWZiMjlsWDNKbFoxTjBjbDlGY0dsa1ZFRkhka1Z3YVVSTlUwOWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdsMGJHVWdQU0JjSWtoaGJuTmxibDl2YjJWZmNtVm5VM1J5WDBWd2FXUlVRVWQyUlhCcFJFMVRUMXdpTENCbWFXZEVhWElwWEc1Y2JseHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZWVlFzSUc5dlpWOUJTVVFzSUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVmhjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWtVdFJWd2lMQ0JjSWtVdFUxd2lMQ0JjSWtVdFdGd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lVeTFUWENJc0lGd2lVeTFZWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKWUxWaGNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjSWtoaGJuTmxibDl2YjJWZllXeHNYMEZKUkhaVlZGd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYVhSc1pTQTlJRndpU0dGdWMyVnVYMjl2WlY5aGJHeGZRVWxFZGxWVVhDSXNJR1pwWjBScGNpbGNibkJzYjNSZmJHOXZjRjl6WTI5eVpYTW9aR0YwWVN3Z2IyOWxYMVZVTENCdmIyVmZRVWxFTENCaktGd2lVeTFUWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hDSklZVzV6Wlc1ZmIyOWxYM04wY2w5QlNVUjJWVlJjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY0lraGhibk5sYmw5dmIyVmZjM1J5WDBGSlJIWlZWRndpTENCbWFXZEVhWElwWEc1d2JHOTBYMnh2YjNCZmMyTnZjbVZ6S0dSaGRHRXNJRzl2WlY5VlZDd2diMjlsWDBGSlJDd2dZeWhjSWxNdFUxd2lMQ0JjSWxNdFdGd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpU0dGdWMyVnVYMjl2WlY5emRISXlYMEZKUkhaVlZGd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYVhSc1pTQTlJRndpU0dGdWMyVnVYMjl2WlY5emRISXlYMEZKUkhaVlZGd2lMQ0JtYVdkRWFYSXBYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlWVkN3Z2IyOWxYMEZKUkN3Z1l5aGNJbEF0VUZ3aUxDQmNJbEF0UlZ3aUxDQmNJa1V0UlZ3aUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGd2lTR0Z1YzJWdVgyOXZaVjl5WldkZlFVbEVkbFZVWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBkR3hsSUQwZ1hDSklZVzV6Wlc1ZmIyOWxYM0psWjE5QlNVUjJWVlJjSWl3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlZWUXNJRzl2WlY5QlNVUXNJR01vWENKUUxWTmNJaXdnWENKRkxWTmNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjSWtoaGJuTmxibDl2YjJWZmNtVm5VM1J5WDBGSlJIWlZWRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ3aVNHRnVjMlZ1WDI5dlpWOXlaV2RUZEhKZlFVbEVkbFZVWENJc0lHWnBaMFJwY2lsY2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxucGxvdF9sb29wX3Njb3JlcyA8LSBmdW5jdGlvbihkZiwgY29sX3gsIGNvbF95LCBhbm5vTGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdGl0bGUsIGZpZ0RpcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuNSwgZGVuc2l0eV9uID0gMTAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWluID0gLTAuNSwgeG1heCA9IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltaW4gPSAtMC41LCB5bWF4ID0gMSkge1xuICBjb2xfeF9xIDwtIGVucXVvKGNvbF94KVxuICBjb2xfeV9xIDwtIGVucXVvKGNvbF95KVxuICBcbiAgIyBTY2F0dGVycGxvdFxuICBkZjIgPC0gZGYgJT4lXG4gICAgZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYW5ub0xpc3QpICU+JVxuICAgIHNlbGVjdChpZCwgeCA9ICEhY29sX3hfcSwgeSA9ICEhY29sX3lfcSkgJT4lXG4gICAgbXV0YXRlKFxuICAgICAgbWlucG9zID0gbWluKGMoeCwgeSlbYyh4LCB5KSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgICAgZXBzICAgID0gbWlucG9zICogMC4xLFxuICAgICAgbHggICAgID0gbG9nMih4ICsgZXBzKSxcbiAgICAgIGx5ICAgICA9IGxvZzIoeSArIGVwcylcbiAgICApXG4gIFxuICBwMSA8LSBnZ3Bsb3QoZGYyLCBhZXMoeCA9IGx4LCB5ID0gbHkpKSArXG4gICAgZ2VvbV9wb2ludCgpICtcbiAgICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICAgIHNjYWxlX3hfY29udGludW91cyhcbiAgICAgIG5hbWUgICA9IHBhc3RlMChcXGxvZzIoXFwsIHF1b19uYW1lKGNvbF94X3EpLCBcXClcXClcbiAgICApICtcbiAgICBzY2FsZV95X2NvbnRpbnVvdXMoXG4gICAgICBuYW1lICAgPSBwYXN0ZTAoXFxsb2cyKFxcLCBxdW9fbmFtZShjb2xfeV9xKSwgXFwpXFwpXG4gICAgKSArXG4gICAgY29vcmRfZml4ZWQoKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgICAgIGNvbG91ciA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvdXIgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvdXIgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLSgyKipkaWZmQ3V0b2ZmKSxcbiAgICAgICAgICAgICAgICBjb2xvdXIgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAoMioqZGlmZkN1dG9mZiksXG4gICAgICAgICAgICAgICAgY29sb3VyID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgbGFicyh4ID0gcXVvX25hbWUoY29sX3hfcSksXG4gICAgICAgICB5ID0gcXVvX25hbWUoY29sX3lfcSkpICtcbiAgICBnZ3RpdGxlKHRpdGxlKVxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2NhdHRlcnBsb3RfXFwsIG5hbWUpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgXG4gICAgICAgICAgd2lkdGggPSAzLjUsIGhlaWdodCA9IDMpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbiAgXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBcbiAgICAgIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzLCB1bml0cyA9IFxcaW5cXCwgcmVzID0gNjAwKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG4gIFxuICAjIFBpZSBjaGFydFxuICBkZjMgPC0gZGYgJT4lXG4gICAgZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYW5ub0xpc3QpICU+JVxuICAgIHNlbGVjdChpZCwgeCA9ICEhY29sX3hfcSwgeSA9ICEhY29sX3lfcSkgJT4lXG4gICAgbXV0YXRlKFxuICAgICAgbWlucG9zID0gbWluKGMoeCwgeSlbYyh4LCB5KSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgICAgZXBzICAgID0gbWlucG9zICogMC4xLFxuICAgICAgbHggICAgID0gbG9nMih4ICsgZXBzKSxcbiAgICAgIGx5ICAgICA9IGxvZzIoeSArIGVwcylcbiAgICApICU+JVxuICAgIG11dGF0ZShkaWZmID0gbHkgLSBseCkgJT4lXG4gICAgbXV0YXRlKHVwZG93biA9IGlmZWxzZShkaWZmID4gZGlmZkN1dG9mZiwgXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmYgPCAtZGlmZkN1dG9mZiwgXFxET1dOXFwsIFxcTk9cXCkpKVxuICBkZjMkdXBkb3duIDwtIGZhY3RvcihkZjMkdXBkb3duLCBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIFxuICBwaWVfZGYgPC0gZGYzICU+JVxuICAgIGRwbHlyOjpjb3VudCh1cGRvd24pICU+JVxuICAgIG11dGF0ZShwY3QgICA9IG4gLyBzdW0obikgKiAxMDAsXG4gICAgICAgICAgIGxhYmVsID0gcGFzdGUwKHVwZG93biwgXFxcXG5cXCwgbiwgXFxcXG4oXFwsIHJvdW5kKHBjdCwxKSwgXFwlKVxcKSlcblxuICBwMiA8LSBnZ3Bsb3QocGllX2RmLCBhZXMoeCA9IFxcXFwsIHkgPSBuLCBmaWxsID0gdXBkb3duKSkgK1xuICAgIGdlb21fY29sKGNvbG9yID0gXFx3aGl0ZVxcKSArXG4gICAgY29vcmRfcG9sYXIodGhldGEgPSBcXHlcXCkgK1xuICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBsYWJlbCksXG4gICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLFxuICAgICAgICAgICAgICBzaXplICAgICA9IGZvbnRTaXplTS8yKSArXG4gICAgdGhlbWVfdm9pZCgpICsgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCkgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoc3Ryb25nX3JlZCwgbm9fZ3JleSwgc3Ryb25nX2JsdWUpKVxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxccGllY2hhcnRfXFwsIG5hbWUpKVxuICB3aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuICBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpXG4gIHByaW50KHAyKVxuICBkZXYub2ZmKClcbn1cblxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5maWdEaXIgPC0gaGVyZShcXC4uL2ZpZ3VyZS9sb29wX2FuYWx5c2lzXFwpXG5kaXIuY3JlYXRlKGZpZ0Rpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpXG5cbmRhdGEgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcXGxvb3BTY29yZV9IYW5zZW4udHN2XFwpKVxuZGF0YSA8LSBkYXRhICU+JSBcbiAgZmlsdGVyKFxuICAgICFpZl9hbGwoc3RhcnRzX3dpdGgoXFxvb2VcXCksIH4gLnggPT0gMCkgICAjIGRyb3Agcm93cyB3aGVyZSAqZXZlcnkqIG9vZSogdmFsdWUgaXMgMFxuKVxuXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9hbGxfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX2FsbF9kVEFHdkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxTLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2Vfc3RyX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9zdHJfZFRBR3ZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3N0cjJfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3N0cjJfZFRBR3ZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3JlZ19kVEFHdkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2VfcmVnX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtU1xcLCBcXEUtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9yZWdTdHJfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3JlZ1N0cl9kVEFHdkRNU09cXCwgZmlnRGlyKVxuXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9hbGxfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX2FsbF9BNDg1dkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoXFxTLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2Vfc3RyX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9zdHJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3N0cjJfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3N0cjJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3JlZ19BNDg1dkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2VfcmVnX0E0ODV2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFAtU1xcLCBcXEUtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9yZWdTdHJfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3JlZ1N0cl9BNDg1dkRNU09cXCwgZmlnRGlyKVxuXG5cbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX2FsbF9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2VfYWxsX0VwaWRUQUd2RXBpRE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9FcGlETVNPLCBvb2VfRXBpZFRBRywgYyhcXFMtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9zdHJfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3N0cl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxTLVNcXCwgXFxTLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2VfcmVnX0VwaWRUQUd2RXBpRE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9yZWdfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1TXFwsIFxcRS1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3JlZ1N0cl9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2VfcmVnU3RyX0VwaWRUQUd2RXBpRE1TT1xcLCBmaWdEaXIpXG5cblxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1TXFwsIFxcUy1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxYLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2VfYWxsX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9hbGxfQUlEdlVUXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3N0cl9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2Vfc3RyX0FJRHZVVFxcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYyhcXFMtU1xcLCBcXFMtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9zdHIyX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9zdHIyX0FJRHZVVFxcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9yZWdfQUlEdlVUXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3JlZ19BSUR2VVRcXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2VfcmVnU3RyX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9yZWdTdHJfQUlEdlVUXFwsIGZpZ0RpcilcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
plot_loop_scores <- function(df, col_x, col_y, annoList,
                             name, title, figDir,
                             diffCutoff = 0.5, density_n = 100,
                             xmin = -0.5, xmax = 1,
                             ymin = -0.5, ymax = 1) {
  col_x_q <- enquo(col_x)
  col_y_q <- enquo(col_y)
  
  # Scatterplot
  df2 <- df %>%
    filter(Anno_simple %in% annoList) %>%
    select(id, x = !!col_x_q, y = !!col_y_q) %>%
    mutate(
      minpos = min(c(x, y)[c(x, y) > 0], na.rm = TRUE),
      eps    = minpos * 0.1,
      lx     = log2(x + eps),
      ly     = log2(y + eps)
    )
  
  p1 <- ggplot(df2, aes(x = lx, y = ly)) +
    geom_point() +
    scale_color_viridis() +
    scale_x_continuous(
      name   = paste0(\log2(\, quo_name(col_x_q), \)\)
    ) +
    scale_y_continuous(
      name   = paste0(\log2(\, quo_name(col_y_q), \)\)
    ) +
    coord_fixed() +
    geom_abline(slope = 1, intercept = 0,
                colour = \grey50\, linetype = \dashed\) +
    geom_hline(yintercept = 0, alpha = 0.5, colour = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, colour = \grey\) +
    geom_abline(slope = 1, intercept = -(2**diffCutoff),
                colour = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept = (2**diffCutoff),
                colour = \grey\, linetype = \dotted\) +
    theme_classic() +
    labs(x = quo_name(col_x_q),
         y = quo_name(col_y_q)) +
    ggtitle(title)
  
  fileName <- paste0(\scatterplot_\, name)
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 3.5, height = 3)
  print(p1)
  dev.off()
  
  png(here(figDir, paste0(fileName, \.png\)), 
      width = 3.5, height = 3, units = \in\, res = 600)
  print(p1)
  dev.off()
  
  # Pie chart
  df3 <- df %>%
    filter(Anno_simple %in% annoList) %>%
    select(id, x = !!col_x_q, y = !!col_y_q) %>%
    mutate(
      minpos = min(c(x, y)[c(x, y) > 0], na.rm = TRUE),
      eps    = minpos * 0.1,
      lx     = log2(x + eps),
      ly     = log2(y + eps)
    ) %>%
    mutate(diff = ly - lx) %>%
    mutate(updown = ifelse(diff > diffCutoff, \UP\,
                           ifelse(diff < -diffCutoff, \DOWN\, \NO\)))
  df3$updown <- factor(df3$updown, c(\UP\, \NO\, \DOWN\))
  
  pie_df <- df3 %>%
    dplyr::count(updown) %>%
    mutate(pct   = n / sum(n) * 100,
           label = paste0(updown, \\n\, n, \\n(\, round(pct,1), \%)\))

  p2 <- ggplot(pie_df, aes(x = \\, y = n, fill = updown)) +
    geom_col(color = \white\) +
    coord_polar(theta = \y\) +
    geom_text(aes(label = label),
              position = position_stack(vjust = 0.5),
              size     = fontSizeM/2) +
    theme_void() +   theme(legend.position = \none\) +
    scale_fill_manual(values = c(strong_red, no_grey, strong_blue))
  fileName <- here(figDir, paste0(\piechart_\, name))
  width <- panelSize(2)*mmToInch
  height <- panelSize(2)*mmToInch
  svglite(paste0(fileName, \.svg\), width = width, height = height)
  print(p2)
  dev.off()
}

commonLoopDir <- here(\../data/loop_analysis\)
figDir <- here(\../figure/loop_analysis\)
dir.create(figDir, showWarnings = FALSE, recursive = TRUE)

data <- fread(here(commonLoopDir, \loopScore_Hansen.tsv\))
data <- data %>% 
  filter(
    !if_all(starts_with(\ooe\), ~ .x == 0)   # drop rows where *every* ooe* value is 0
)

plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \Hansen_ooe_all_dTAGvDMSO\,
                 title = \Hansen_ooe_all_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\S-S\),
                 name = \Hansen_ooe_str_dTAGvDMSO\,
                 title = \Hansen_ooe_str_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\S-S\, \S-X\),
                 name = \Hansen_ooe_str2_dTAGvDMSO\,
                 title = \Hansen_ooe_str2_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-P\, \P-E\, \E-E\),
                 name = \Hansen_ooe_reg_dTAGvDMSO\,
                 title = \Hansen_ooe_reg_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-S\, \E-S\),
                 name = \Hansen_ooe_regStr_dTAGvDMSO\,
                 title = \Hansen_ooe_regStr_dTAGvDMSO\, figDir)

plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \Hansen_ooe_all_A485vDMSO\,
                 title = \Hansen_ooe_all_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\S-S\),
                 name = \Hansen_ooe_str_A485vDMSO\,
                 title = \Hansen_ooe_str_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\S-S\, \S-X\),
                 name = \Hansen_ooe_str2_A485vDMSO\,
                 title = \Hansen_ooe_str2_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-P\, \P-E\, \E-E\),
                 name = \Hansen_ooe_reg_A485vDMSO\,
                 title = \Hansen_ooe_reg_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-S\, \E-S\),
                 name = \Hansen_ooe_regStr_A485vDMSO\,
                 title = \Hansen_ooe_regStr_A485vDMSO\, figDir)


plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \Hansen_ooe_all_EpidTAGvEpiDMSO\,
                 title = \Hansen_ooe_all_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\S-S\),
                 name = \Hansen_ooe_str_EpidTAGvEpiDMSO\,
                 title = \Hansen_ooe_str_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\S-S\, \S-X\),
                 name = \Hansen_ooe_str2_EpidTAGvEpiDMSO\,
                 title = \Hansen_ooe_str2_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-P\, \P-E\, \E-E\),
                 name = \Hansen_ooe_reg_EpidTAGvEpiDMSO\,
                 title = \Hansen_ooe_reg_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-S\, \E-S\),
                 name = \Hansen_ooe_regStr_EpidTAGvEpiDMSO\,
                 title = \Hansen_ooe_regStr_EpidTAGvEpiDMSO\, figDir)


plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \Hansen_ooe_all_AIDvUT\,
                 title = \Hansen_ooe_all_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\S-S\),
                 name = \Hansen_ooe_str_AIDvUT\,
                 title = \Hansen_ooe_str_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\S-S\, \S-X\),
                 name = \Hansen_ooe_str2_AIDvUT\,
                 title = \Hansen_ooe_str2_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-P\, \P-E\, \E-E\),
                 name = \Hansen_ooe_reg_AIDvUT\,
                 title = \Hansen_ooe_reg_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-S\, \E-S\),
                 name = \Hansen_ooe_regStr_AIDvUT\,
                 title = \Hansen_ooe_regStr_AIDvUT\, figDir)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3lBOExTQm1kVzVqZEdsdmJpaGtaaXdnWTI5c1gzZ3NJR052YkY5NUxDQmhibTV2VEdsemRDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTd2dkR2wwYkdVc0lHWnBaMFJwY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2xtWmtOMWRHOW1aaUE5SURBdU5Td2daR1Z1YzJsMGVWOXVJRDBnTVRBd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I0YldsdUlEMGdMVEF1TlN3Z2VHMWhlQ0E5SURFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSGx0YVc0Z1BTQXRNQzQxTENCNWJXRjRJRDBnTVNrZ2UxeHVJQ0JqYjJ4ZmVGOXhJRHd0SUdWdWNYVnZLR052YkY5NEtWeHVJQ0JqYjJ4ZmVWOXhJRHd0SUdWdWNYVnZLR052YkY5NUtWeHVJQ0JjYmlBZ0l5QlRZMkYwZEdWeWNHeHZkRnh1SUNCa1pqSWdQQzBnWkdZZ0pUNGxYRzRnSUNBZ1ptbHNkR1Z5S0VGdWJtOWZjMmx0Y0d4bElDVnBiaVVnWVc1dWIweHBjM1FwSUNVK0pWeHVJQ0FnSUhObGJHVmpkQ2hwWkN3Z2VDQTlJQ0VoWTI5c1gzaGZjU3dnZVNBOUlDRWhZMjlzWDNsZmNTa2dKVDRsWEc0Z0lDQWdiWFYwWVhSbEtGeHVJQ0FnSUNBZ2JXbHVjRzl6SUQwZ2JXbHVLR01vZUN3Z2VTbGJZeWg0TENCNUtTQStJREJkTENCdVlTNXliU0E5SUZSU1ZVVXBMRnh1SUNBZ0lDQWdaWEJ6SUNBZ0lEMGdiV2x1Y0c5eklDb2dNQzR4TEZ4dUlDQWdJQ0FnYkhnZ0lDQWdJRDBnYkc5bk1paDRJQ3NnWlhCektTeGNiaUFnSUNBZ0lHeDVJQ0FnSUNBOUlHeHZaeklvZVNBcklHVndjeWxjYmlBZ0lDQXBYRzRnSUZ4dUlDQndNU0E4TFNCblozQnNiM1FvWkdZeUxDQmhaWE1vZUNBOUlHeDRMQ0I1SUQwZ2JIa3BLU0FyWEc0Z0lDQWdaMlZ2YlY5d2IybHVkQ2dwSUN0Y2JpQWdJQ0J6WTJGc1pWOWpiMnh2Y2w5MmFYSnBaR2x6S0NrZ0sxeHVJQ0FnSUhOallXeGxYM2hmWTI5dWRHbHVkVzkxY3loY2JpQWdJQ0FnSUc1aGJXVWdJQ0E5SUhCaGMzUmxNQ2hjWEd4dlp6SW9YRndzSUhGMWIxOXVZVzFsS0dOdmJGOTRYM0VwTENCY1hDbGNYQ2xjYmlBZ0lDQXBJQ3RjYmlBZ0lDQnpZMkZzWlY5NVgyTnZiblJwYm5WdmRYTW9YRzRnSUNBZ0lDQnVZVzFsSUNBZ1BTQndZWE4wWlRBb1hGeHNiMmN5S0Z4Y0xDQnhkVzlmYm1GdFpTaGpiMnhmZVY5eEtTd2dYRndwWEZ3cFhHNGdJQ0FnS1NBclhHNGdJQ0FnWTI5dmNtUmZabWw0WldRb0tTQXJYRzRnSUNBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzkxY2lBOUlGeGNaM0psZVRVd1hGd3NJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJQ0FnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2ZFhJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNBZ0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmRYSWdQU0JjWEdkeVpYbGNYQ2tnSzF4dUlDQWdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdMU2d5S2lwa2FXWm1RM1YwYjJabUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiMnh2ZFhJZ1BTQmNYR2R5WlhsY1hDd2diR2x1WlhSNWNHVWdQU0JjWEdSdmRIUmxaRnhjS1NBclhHNGdJQ0FnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0FvTWlvcVpHbG1aa04xZEc5bVppa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNWeUlEMGdYRnhuY21WNVhGd3NJR3hwYm1WMGVYQmxJRDBnWEZ4a2IzUjBaV1JjWENrZ0sxeHVJQ0FnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FyWEc0Z0lDQWdiR0ZpY3loNElEMGdjWFZ2WDI1aGJXVW9ZMjlzWDNoZmNTa3NYRzRnSUNBZ0lDQWdJQ0I1SUQwZ2NYVnZYMjVoYldVb1kyOXNYM2xmY1NrcElDdGNiaUFnSUNCblozUnBkR3hsS0hScGRHeGxLVnh1SUNCY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjYzJOaGRIUmxjbkJzYjNSZlhGd3NJRzVoYldVcFhHNGdJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdkMmxrZEdnZ1BTQXpMalVzSUdobGFXZG9kQ0E5SURNcFhHNGdJSEJ5YVc1MEtIQXhLVnh1SUNCa1pYWXViMlptS0NsY2JpQWdYRzRnSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCY2JpQWdJQ0FnSUhkcFpIUm9JRDBnTXk0MUxDQm9aV2xuYUhRZ1BTQXpMQ0IxYm1sMGN5QTlJRnhjYVc1Y1hDd2djbVZ6SUQwZ05qQXdLVnh1SUNCd2NtbHVkQ2h3TVNsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUZ4dUlDQWpJRkJwWlNCamFHRnlkRnh1SUNCa1pqTWdQQzBnWkdZZ0pUNGxYRzRnSUNBZ1ptbHNkR1Z5S0VGdWJtOWZjMmx0Y0d4bElDVnBiaVVnWVc1dWIweHBjM1FwSUNVK0pWeHVJQ0FnSUhObGJHVmpkQ2hwWkN3Z2VDQTlJQ0VoWTI5c1gzaGZjU3dnZVNBOUlDRWhZMjlzWDNsZmNTa2dKVDRsWEc0Z0lDQWdiWFYwWVhSbEtGeHVJQ0FnSUNBZ2JXbHVjRzl6SUQwZ2JXbHVLR01vZUN3Z2VTbGJZeWg0TENCNUtTQStJREJkTENCdVlTNXliU0E5SUZSU1ZVVXBMRnh1SUNBZ0lDQWdaWEJ6SUNBZ0lEMGdiV2x1Y0c5eklDb2dNQzR4TEZ4dUlDQWdJQ0FnYkhnZ0lDQWdJRDBnYkc5bk1paDRJQ3NnWlhCektTeGNiaUFnSUNBZ0lHeDVJQ0FnSUNBOUlHeHZaeklvZVNBcklHVndjeWxjYmlBZ0lDQXBJQ1UrSlZ4dUlDQWdJRzExZEdGMFpTaGthV1ptSUQwZ2JIa2dMU0JzZUNrZ0pUNGxYRzRnSUNBZ2JYVjBZWFJsS0hWd1pHOTNiaUE5SUdsbVpXeHpaU2hrYVdabUlENGdaR2xtWmtOMWRHOW1aaXdnWEZ4VlVGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR1JwWm1ZZ1BDQXRaR2xtWmtOMWRHOW1aaXdnWEZ4RVQxZE9YRndzSUZ4Y1RrOWNYQ2twS1Z4dUlDQmtaak1rZFhCa2IzZHVJRHd0SUdaaFkzUnZjaWhrWmpNa2RYQmtiM2R1TENCaktGeGNWVkJjWEN3Z1hGeE9UMXhjTENCY1hFUlBWMDVjWENrcFhHNGdJRnh1SUNCd2FXVmZaR1lnUEMwZ1pHWXpJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcGpiM1Z1ZENoMWNHUnZkMjRwSUNVK0pWeHVJQ0FnSUcxMWRHRjBaU2h3WTNRZ0lDQTlJRzRnTHlCemRXMG9iaWtnS2lBeE1EQXNYRzRnSUNBZ0lDQWdJQ0FnSUd4aFltVnNJRDBnY0dGemRHVXdLSFZ3Wkc5M2Jpd2dYRnhjWEc1Y1hDd2diaXdnWEZ4Y1hHNG9YRndzSUhKdmRXNWtLSEJqZEN3eEtTd2dYRndsS1Z4Y0tTbGNibHh1SUNCd01pQThMU0JuWjNCc2IzUW9jR2xsWDJSbUxDQmhaWE1vZUNBOUlGeGNYRndzSUhrZ1BTQnVMQ0JtYVd4c0lEMGdkWEJrYjNkdUtTa2dLMXh1SUNBZ0lHZGxiMjFmWTI5c0tHTnZiRzl5SUQwZ1hGeDNhR2wwWlZ4Y0tTQXJYRzRnSUNBZ1kyOXZjbVJmY0c5c1lYSW9kR2hsZEdFZ1BTQmNYSGxjWENrZ0sxeHVJQ0FnSUdkbGIyMWZkR1Y0ZENoaFpYTW9iR0ZpWld3Z1BTQnNZV0psYkNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUhCdmMybDBhVzl1SUQwZ2NHOXphWFJwYjI1ZmMzUmhZMnNvZG1wMWMzUWdQU0F3TGpVcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFYcGxJQ0FnSUNBOUlHWnZiblJUYVhwbFRTOHlLU0FyWEc0Z0lDQWdkR2hsYldWZmRtOXBaQ2dwSUNzZ0lDQjBhR1Z0WlNoc1pXZGxibVF1Y0c5emFYUnBiMjRnUFNCY1hHNXZibVZjWENrZ0sxeHVJQ0FnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb2MzUnliMjVuWDNKbFpDd2dibTlmWjNKbGVTd2djM1J5YjI1blgySnNkV1VwS1Z4dUlDQm1hV3hsVG1GdFpTQThMU0JvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0Z4Y2NHbGxZMmhoY25SZlhGd3NJRzVoYldVcEtWeHVJQ0IzYVdSMGFDQThMU0J3WVc1bGJGTnBlbVVvTWlrcWJXMVViMGx1WTJoY2JpQWdhR1ZwWjJoMElEd3RJSEJoYm1Wc1UybDZaU2d5S1NwdGJWUnZTVzVqYUZ4dUlDQnpkbWRzYVhSbEtIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cExDQjNhV1IwYUNBOUlIZHBaSFJvTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFwWEc0Z0lIQnlhVzUwS0hBeUtWeHVJQ0JrWlhZdWIyWm1LQ2xjYm4xY2JseHVZMjl0Ylc5dVRHOXZjRVJwY2lBOExTQm9aWEpsS0Z4Y0xpNHZaR0YwWVM5c2IyOXdYMkZ1WVd4NWMybHpYRndwWEc1bWFXZEVhWElnUEMwZ2FHVnlaU2hjWEM0dUwyWnBaM1Z5WlM5c2IyOXdYMkZ1WVd4NWMybHpYRndwWEc1a2FYSXVZM0psWVhSbEtHWnBaMFJwY2l3Z2MyaHZkMWRoY201cGJtZHpJRDBnUmtGTVUwVXNJSEpsWTNWeWMybDJaU0E5SUZSU1ZVVXBYRzVjYm1SaGRHRWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyMXRiMjVNYjI5d1JHbHlMQ0JjWEd4dmIzQlRZMjl5WlY5SVlXNXpaVzR1ZEhOMlhGd3BLVnh1WkdGMFlTQThMU0JrWVhSaElDVStKU0JjYmlBZ1ptbHNkR1Z5S0Z4dUlDQWdJQ0ZwWmw5aGJHd29jM1JoY25SelgzZHBkR2dvWEZ4dmIyVmNYQ2tzSUg0Z0xuZ2dQVDBnTUNrZ0lDQWpJR1J5YjNBZ2NtOTNjeUIzYUdWeVpTQXFaWFpsY25rcUlHOXZaU29nZG1Gc2RXVWdhWE1nTUZ4dUtWeHVYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlFVFZOUExDQnZiMlZmWkZSQlJ5d2dZeWhjWEZBdFVGeGNMQ0JjWEZBdFJWeGNMQ0JjWEZBdFUxeGNMQ0JjWEZBdFdGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNSUzFGWEZ3c0lGeGNSUzFUWEZ3c0lGeGNSUzFZWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4VExWTmNYQ3dnWEZ4VExWaGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRmd0V0Z4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGeGNTR0Z1YzJWdVgyOXZaVjloYkd4ZlpGUkJSM1pFVFZOUFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYRnhJWVc1elpXNWZiMjlsWDJGc2JGOWtWRUZIZGtSTlUwOWNYQ3dnWm1sblJHbHlLVnh1Y0d4dmRGOXNiMjl3WDNOamIzSmxjeWhrWVhSaExDQnZiMlZmUkUxVFR5d2diMjlsWDJSVVFVY3NJR01vWEZ4VExWTmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjWEVoaGJuTmxibDl2YjJWZmMzUnlYMlJVUVVkMlJFMVRUMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ4Y1NHRnVjMlZ1WDI5dlpWOXpkSEpmWkZSQlIzWkVUVk5QWEZ3c0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwUk5VMDhzSUc5dlpWOWtWRUZITENCaktGeGNVeTFUWEZ3c0lGeGNVeTFZWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hGeElZVzV6Wlc1ZmIyOWxYM04wY2pKZlpGUkJSM1pFVFZOUFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYRnhJWVc1elpXNWZiMjlsWDNOMGNqSmZaRlJCUjNaRVRWTlBYRndzSUdacFowUnBjaWxjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDBSTlUwOHNJRzl2WlY5a1ZFRkhMQ0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndzSUZ4Y1JTMUZYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWEZ4SVlXNXpaVzVmYjI5bFgzSmxaMTlrVkVGSGRrUk5VMDljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY1hFaGhibk5sYmw5dmIyVmZjbVZuWDJSVVFVZDJSRTFUVDF4Y0xDQm1hV2RFYVhJcFhHNXdiRzkwWDJ4dmIzQmZjMk52Y21WektHUmhkR0VzSUc5dlpWOUVUVk5QTENCdmIyVmZaRlJCUnl3Z1l5aGNYRkF0VTF4Y0xDQmNYRVV0VTF4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGeGNTR0Z1YzJWdVgyOXZaVjl5WldkVGRISmZaRlJCUjNaRVRWTlBYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWEZ4SVlXNXpaVzVmYjI5bFgzSmxaMU4wY2w5a1ZFRkhka1JOVTA5Y1hDd2dabWxuUkdseUtWeHVYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlFVFZOUExDQnZiMlZmUVRRNE5Td2dZeWhjWEZBdFVGeGNMQ0JjWEZBdFJWeGNMQ0JjWEZBdFUxeGNMQ0JjWEZBdFdGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNSUzFGWEZ3c0lGeGNSUzFUWEZ3c0lGeGNSUzFZWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4VExWTmNYQ3dnWEZ4VExWaGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRmd0V0Z4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGeGNTR0Z1YzJWdVgyOXZaVjloYkd4ZlFUUTROWFpFVFZOUFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYRnhJWVc1elpXNWZiMjlsWDJGc2JGOUJORGcxZGtSTlUwOWNYQ3dnWm1sblJHbHlLVnh1Y0d4dmRGOXNiMjl3WDNOamIzSmxjeWhrWVhSaExDQnZiMlZmUkUxVFR5d2diMjlsWDBFME9EVXNJR01vWEZ4VExWTmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjWEVoaGJuTmxibDl2YjJWZmMzUnlYMEUwT0RWMlJFMVRUMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFYUnNaU0E5SUZ4Y1NHRnVjMlZ1WDI5dlpWOXpkSEpmUVRRNE5YWkVUVk5QWEZ3c0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgwUk5VMDhzSUc5dlpWOUJORGcxTENCaktGeGNVeTFUWEZ3c0lGeGNVeTFZWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hGeElZVzV6Wlc1ZmIyOWxYM04wY2pKZlFUUTROWFpFVFZOUFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYRnhJWVc1elpXNWZiMjlsWDNOMGNqSmZRVFE0TlhaRVRWTlBYRndzSUdacFowUnBjaWxjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDBSTlUwOHNJRzl2WlY5Qk5EZzFMQ0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndzSUZ4Y1JTMUZYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWEZ4SVlXNXpaVzVmYjI5bFgzSmxaMTlCTkRnMWRrUk5VMDljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY1hFaGhibk5sYmw5dmIyVmZjbVZuWDBFME9EVjJSRTFUVDF4Y0xDQm1hV2RFYVhJcFhHNXdiRzkwWDJ4dmIzQmZjMk52Y21WektHUmhkR0VzSUc5dlpWOUVUVk5QTENCdmIyVmZRVFE0TlN3Z1l5aGNYRkF0VTF4Y0xDQmNYRVV0VTF4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGeGNTR0Z1YzJWdVgyOXZaVjl5WldkVGRISmZRVFE0TlhaRVRWTlBYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWEZ4SVlXNXpaVzVmYjI5bFgzSmxaMU4wY2w5Qk5EZzFka1JOVTA5Y1hDd2dabWxuUkdseUtWeHVYRzVjYm5Cc2IzUmZiRzl2Y0Y5elkyOXlaWE1vWkdGMFlTd2diMjlsWDBWd2FVUk5VMDhzSUc5dlpWOUZjR2xrVkVGSExDQmpLRnhjVUMxUVhGd3NJRnhjVUMxRlhGd3NJRnhjVUMxVFhGd3NJRnhjVUMxWVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeEZMVVZjWEN3Z1hGeEZMVk5jWEN3Z1hGeEZMVmhjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEZNdFUxeGNMQ0JjWEZNdFdGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNXQzFZWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hGeElZVzV6Wlc1ZmIyOWxYMkZzYkY5RmNHbGtWRUZIZGtWd2FVUk5VMDljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY1hFaGhibk5sYmw5dmIyVmZZV3hzWDBWd2FXUlVRVWQyUlhCcFJFMVRUMXhjTENCbWFXZEVhWElwWEc1d2JHOTBYMnh2YjNCZmMyTnZjbVZ6S0dSaGRHRXNJRzl2WlY5RmNHbEVUVk5QTENCdmIyVmZSWEJwWkZSQlJ5d2dZeWhjWEZNdFUxeGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpTQTlJRnhjU0dGdWMyVnVYMjl2WlY5emRISmZSWEJwWkZSQlIzWkZjR2xFVFZOUFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwZEd4bElEMGdYRnhJWVc1elpXNWZiMjlsWDNOMGNsOUZjR2xrVkVGSGRrVndhVVJOVTA5Y1hDd2dabWxuUkdseUtWeHVjR3h2ZEY5c2IyOXdYM05qYjNKbGN5aGtZWFJoTENCdmIyVmZSWEJwUkUxVFR5d2diMjlsWDBWd2FXUlVRVWNzSUdNb1hGeFRMVk5jWEN3Z1hGeFRMVmhjWENrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCY1hFaGhibk5sYmw5dmIyVmZjM1J5TWw5RmNHbGtWRUZIZGtWd2FVUk5VMDljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY1hFaGhibk5sYmw5dmIyVmZjM1J5TWw5RmNHbGtWRUZIZGtWd2FVUk5VMDljWEN3Z1ptbG5SR2x5S1Z4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlJYQnBSRTFUVHl3Z2IyOWxYMFZ3YVdSVVFVY3NJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4RkxVVmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVWdQU0JjWEVoaGJuTmxibDl2YjJWZmNtVm5YMFZ3YVdSVVFVZDJSWEJwUkUxVFQxeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYVhSc1pTQTlJRnhjU0dGdWMyVnVYMjl2WlY5eVpXZGZSWEJwWkZSQlIzWkZjR2xFVFZOUFhGd3NJR1pwWjBScGNpbGNibkJzYjNSZmJHOXZjRjl6WTI5eVpYTW9aR0YwWVN3Z2IyOWxYMFZ3YVVSTlUwOHNJRzl2WlY5RmNHbGtWRUZITENCaktGeGNVQzFUWEZ3c0lGeGNSUzFUWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hGeElZVzV6Wlc1ZmIyOWxYM0psWjFOMGNsOUZjR2xrVkVGSGRrVndhVVJOVTA5Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNYRWhoYm5ObGJsOXZiMlZmY21WblUzUnlYMFZ3YVdSVVFVZDJSWEJwUkUxVFQxeGNMQ0JtYVdkRWFYSXBYRzVjYmx4dWNHeHZkRjlzYjI5d1gzTmpiM0psY3loa1lYUmhMQ0J2YjJWZlZWUXNJRzl2WlY5QlNVUXNJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWaGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRVV0UlZ4Y0xDQmNYRVV0VTF4Y0xDQmNYRVV0V0Z4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y1V5MVRYRndzSUZ4Y1V5MVlYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnhZTFZoY1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVZ1BTQmNYRWhoYm5ObGJsOXZiMlZmWVd4c1gwRkpSSFpWVkZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhWFJzWlNBOUlGeGNTR0Z1YzJWdVgyOXZaVjloYkd4ZlFVbEVkbFZVWEZ3c0lHWnBaMFJwY2lsY2JuQnNiM1JmYkc5dmNGOXpZMjl5WlhNb1pHRjBZU3dnYjI5bFgxVlVMQ0J2YjJWZlFVbEVMQ0JqS0Z4Y1V5MVRYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVlXMWxJRDBnWEZ4SVlXNXpaVzVmYjI5bFgzTjBjbDlCU1VSMlZWUmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdsMGJHVWdQU0JjWEVoaGJuTmxibDl2YjJWZmMzUnlYMEZKUkhaVlZGeGNMQ0JtYVdkRWFYSXBYRzV3Ykc5MFgyeHZiM0JmYzJOdmNtVnpLR1JoZEdFc0lHOXZaVjlWVkN3Z2IyOWxYMEZKUkN3Z1l5aGNYRk10VTF4Y0xDQmNYRk10V0Z4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlNBOUlGeGNTR0Z1YzJWdVgyOXZaVjl6ZEhJeVgwRkpSSFpWVkZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhWFJzWlNBOUlGeGNTR0Z1YzJWdVgyOXZaVjl6ZEhJeVgwRkpSSFpWVkZ4Y0xDQm1hV2RFYVhJcFhHNXdiRzkwWDJ4dmIzQmZjMk52Y21WektHUmhkR0VzSUc5dlpWOVZWQ3dnYjI5bFgwRkpSQ3dnWXloY1hGQXRVRnhjTENCY1hGQXRSVnhjTENCY1hFVXRSVnhjS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaU0E5SUZ4Y1NHRnVjMlZ1WDI5dlpWOXlaV2RmUVVsRWRsVlVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGRHeGxJRDBnWEZ4SVlXNXpaVzVmYjI5bFgzSmxaMTlCU1VSMlZWUmNYQ3dnWm1sblJHbHlLVnh1Y0d4dmRGOXNiMjl3WDNOamIzSmxjeWhrWVhSaExDQnZiMlZmVlZRc0lHOXZaVjlCU1VRc0lHTW9YRnhRTFZOY1hDd2dYRnhGTFZOY1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVZ1BTQmNYRWhoYm5ObGJsOXZiMlZmY21WblUzUnlYMEZKUkhaVlZGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYVhSc1pTQTlJRnhjU0dGdWMyVnVYMjl2WlY5eVpXZFRkSEpmUVVsRWRsVlVYRndzSUdacFowUnBjaWxjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbnBsb3RfbG9vcF9zY29yZXMgPC0gZnVuY3Rpb24oZGYsIGNvbF94LCBjb2xfeSwgYW5ub0xpc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHRpdGxlLCBmaWdEaXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjUsIGRlbnNpdHlfbiA9IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1pbiA9IC0wLjUsIHhtYXggPSAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWluID0gLTAuNSwgeW1heCA9IDEpIHtcbiAgY29sX3hfcSA8LSBlbnF1byhjb2xfeClcbiAgY29sX3lfcSA8LSBlbnF1byhjb2xfeSlcbiAgXG4gICMgU2NhdHRlcnBsb3RcbiAgZGYyIDwtIGRmICU+JVxuICAgIGZpbHRlcihBbm5vX3NpbXBsZSAlaW4lIGFubm9MaXN0KSAlPiVcbiAgICBzZWxlY3QoaWQsIHggPSAhIWNvbF94X3EsIHkgPSAhIWNvbF95X3EpICU+JVxuICAgIG11dGF0ZShcbiAgICAgIG1pbnBvcyA9IG1pbihjKHgsIHkpW2MoeCwgeSkgPiAwXSwgbmEucm0gPSBUUlVFKSxcbiAgICAgIGVwcyAgICA9IG1pbnBvcyAqIDAuMSxcbiAgICAgIGx4ICAgICA9IGxvZzIoeCArIGVwcyksXG4gICAgICBseSAgICAgPSBsb2cyKHkgKyBlcHMpXG4gICAgKVxuICBcbiAgcDEgPC0gZ2dwbG90KGRmMiwgYWVzKHggPSBseCwgeSA9IGx5KSkgK1xuICAgIGdlb21fcG9pbnQoKSArXG4gICAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgICBzY2FsZV94X2NvbnRpbnVvdXMoXG4gICAgICBuYW1lICAgPSBwYXN0ZTAoXFxsb2cyKFxcLCBxdW9fbmFtZShjb2xfeF9xKSwgXFwpXFwpXG4gICAgKSArXG4gICAgc2NhbGVfeV9jb250aW51b3VzKFxuICAgICAgbmFtZSAgID0gcGFzdGUwKFxcbG9nMihcXCwgcXVvX25hbWUoY29sX3lfcSksIFxcKVxcKVxuICAgICkgK1xuICAgIGNvb3JkX2ZpeGVkKCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCxcbiAgICAgICAgICAgICAgICBjb2xvdXIgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3VyID0gXFxncmV5XFwpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3VyID0gXFxncmV5XFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC0oMioqZGlmZkN1dG9mZiksXG4gICAgICAgICAgICAgICAgY29sb3VyID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gKDIqKmRpZmZDdXRvZmYpLFxuICAgICAgICAgICAgICAgIGNvbG91ciA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIGxhYnMoeCA9IHF1b19uYW1lKGNvbF94X3EpLFxuICAgICAgICAgeSA9IHF1b19uYW1lKGNvbF95X3EpKSArXG4gICAgZ2d0aXRsZSh0aXRsZSlcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHNjYXR0ZXJwbG90X1xcLCBuYW1lKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICAgIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG4gIFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgXG4gICAgICB3aWR0aCA9IDMuNSwgaGVpZ2h0ID0gMywgdW5pdHMgPSBcXGluXFwsIHJlcyA9IDYwMClcbiAgcHJpbnQocDEpXG4gIGRldi5vZmYoKVxuICBcbiAgIyBQaWUgY2hhcnRcbiAgZGYzIDwtIGRmICU+JVxuICAgIGZpbHRlcihBbm5vX3NpbXBsZSAlaW4lIGFubm9MaXN0KSAlPiVcbiAgICBzZWxlY3QoaWQsIHggPSAhIWNvbF94X3EsIHkgPSAhIWNvbF95X3EpICU+JVxuICAgIG11dGF0ZShcbiAgICAgIG1pbnBvcyA9IG1pbihjKHgsIHkpW2MoeCwgeSkgPiAwXSwgbmEucm0gPSBUUlVFKSxcbiAgICAgIGVwcyAgICA9IG1pbnBvcyAqIDAuMSxcbiAgICAgIGx4ICAgICA9IGxvZzIoeCArIGVwcyksXG4gICAgICBseSAgICAgPSBsb2cyKHkgKyBlcHMpXG4gICAgKSAlPiVcbiAgICBtdXRhdGUoZGlmZiA9IGx5IC0gbHgpICU+JVxuICAgIG11dGF0ZSh1cGRvd24gPSBpZmVsc2UoZGlmZiA+IGRpZmZDdXRvZmYsIFxcVVBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmIDwgLWRpZmZDdXRvZmYsIFxcRE9XTlxcLCBcXE5PXFwpKSlcbiAgZGYzJHVwZG93biA8LSBmYWN0b3IoZGYzJHVwZG93biwgYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpKVxuICBcbiAgcGllX2RmIDwtIGRmMyAlPiVcbiAgICBkcGx5cjo6Y291bnQodXBkb3duKSAlPiVcbiAgICBtdXRhdGUocGN0ICAgPSBuIC8gc3VtKG4pICogMTAwLFxuICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCh1cGRvd24sIFxcXFxuXFwsIG4sIFxcXFxuKFxcLCByb3VuZChwY3QsMSksIFxcJSlcXCkpXG5cbiAgcDIgPC0gZ2dwbG90KHBpZV9kZiwgYWVzKHggPSBcXFxcLCB5ID0gbiwgZmlsbCA9IHVwZG93bikpICtcbiAgICBnZW9tX2NvbChjb2xvciA9IFxcd2hpdGVcXCkgK1xuICAgIGNvb3JkX3BvbGFyKHRoZXRhID0gXFx5XFwpICtcbiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbGFiZWwpLFxuICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSxcbiAgICAgICAgICAgICAgc2l6ZSAgICAgPSBmb250U2l6ZU0vMikgK1xuICAgIHRoZW1lX3ZvaWQoKSArICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKHN0cm9uZ19yZWQsIG5vX2dyZXksIHN0cm9uZ19ibHVlKSlcbiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXHBpZWNoYXJ0X1xcLCBuYW1lKSlcbiAgd2lkdGggPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbiAgc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KVxuICBwcmludChwMilcbiAgZGV2Lm9mZigpXG59XG5cbmNvbW1vbkxvb3BEaXIgPC0gaGVyZShcXC4uL2RhdGEvbG9vcF9hbmFseXNpc1xcKVxuZmlnRGlyIDwtIGhlcmUoXFwuLi9maWd1cmUvbG9vcF9hbmFseXNpc1xcKVxuZGlyLmNyZWF0ZShmaWdEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKVxuXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgXFxsb29wU2NvcmVfSGFuc2VuLnRzdlxcKSlcbmRhdGEgPC0gZGF0YSAlPiUgXG4gIGZpbHRlcihcbiAgICAhaWZfYWxsKHN0YXJ0c193aXRoKFxcb29lXFwpLCB+IC54ID09IDApICAgIyBkcm9wIHJvd3Mgd2hlcmUgKmV2ZXJ5KiBvb2UqIHZhbHVlIGlzIDBcbilcblxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1TXFwsIFxcUy1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxYLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2VfYWxsX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9hbGxfZFRBR3ZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3N0cl9kVEFHdkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2Vfc3RyX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFMtU1xcLCBcXFMtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9zdHIyX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9zdHIyX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9yZWdfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3JlZ19kVEFHdkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2VfcmVnU3RyX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9yZWdTdHJfZFRBR3ZETVNPXFwsIGZpZ0RpcilcblxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1TXFwsIFxcUy1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxYLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2VfYWxsX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9hbGxfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3N0cl9BNDg1dkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2Vfc3RyX0E0ODV2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFMtU1xcLCBcXFMtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9zdHIyX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9zdHIyX0E0ODV2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9yZWdfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3JlZ19BNDg1dkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2VfcmVnU3RyX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9yZWdTdHJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcblxuXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9FcGlETVNPLCBvb2VfRXBpZFRBRywgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9hbGxfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX2FsbF9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxTLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2Vfc3RyX0VwaWRUQUd2RXBpRE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9zdHJfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3N0cjJfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3N0cjJfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3JlZ19FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2VfcmVnX0VwaWRUQUd2RXBpRE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9FcGlETVNPLCBvb2VfRXBpZFRBRywgYyhcXFAtU1xcLCBcXEUtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9yZWdTdHJfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3JlZ1N0cl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxuXG5cbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX2FsbF9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2VfYWxsX0FJRHZVVFxcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYyhcXFMtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9zdHJfQUlEdlVUXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3N0cl9BSUR2VVRcXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxTLVNcXCwgXFxTLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2Vfc3RyMl9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2Vfc3RyMl9BSUR2VVRcXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2VfcmVnX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9yZWdfQUlEdlVUXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUC1TXFwsIFxcRS1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3JlZ1N0cl9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2VfcmVnU3RyX0FJRHZVVFxcLCBmaWdEaXIpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucGxvdF9sb29wX3Njb3JlcyA8LSBmdW5jdGlvbihkZiwgY29sX3gsIGNvbF95LCBhbm5vTGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdGl0bGUsIGZpZ0RpcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuNSwgZGVuc2l0eV9uID0gMTAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWluID0gLTAuNSwgeG1heCA9IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltaW4gPSAtMC41LCB5bWF4ID0gMSkge1xuICBjb2xfeF9xIDwtIGVucXVvKGNvbF94KVxuICBjb2xfeV9xIDwtIGVucXVvKGNvbF95KVxuICBcbiAgIyBTY2F0dGVycGxvdFxuICBkZjIgPC0gZGYgJT4lXG4gICAgZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYW5ub0xpc3QpICU+JVxuICAgIHNlbGVjdChpZCwgeCA9ICEhY29sX3hfcSwgeSA9ICEhY29sX3lfcSkgJT4lXG4gICAgbXV0YXRlKFxuICAgICAgbWlucG9zID0gbWluKGMoeCwgeSlbYyh4LCB5KSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgICAgZXBzICAgID0gbWlucG9zICogMC4xLFxuICAgICAgbHggICAgID0gbG9nMih4ICsgZXBzKSxcbiAgICAgIGx5ICAgICA9IGxvZzIoeSArIGVwcylcbiAgICApXG4gIFxuICBwMSA8LSBnZ3Bsb3QoZGYyLCBhZXMoeCA9IGx4LCB5ID0gbHkpKSArXG4gICAgZ2VvbV9wb2ludCgpICtcbiAgICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICAgIHNjYWxlX3hfY29udGludW91cyhcbiAgICAgIG5hbWUgICA9IHBhc3RlMChcXGxvZzIoXFwsIHF1b19uYW1lKGNvbF94X3EpLCBcXClcXClcbiAgICApICtcbiAgICBzY2FsZV95X2NvbnRpbnVvdXMoXG4gICAgICBuYW1lICAgPSBwYXN0ZTAoXFxsb2cyKFxcLCBxdW9fbmFtZShjb2xfeV9xKSwgXFwpXFwpXG4gICAgKSArXG4gICAgY29vcmRfZml4ZWQoKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgICAgIGNvbG91ciA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvdXIgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvdXIgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLSgyKipkaWZmQ3V0b2ZmKSxcbiAgICAgICAgICAgICAgICBjb2xvdXIgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAoMioqZGlmZkN1dG9mZiksXG4gICAgICAgICAgICAgICAgY29sb3VyID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgbGFicyh4ID0gcXVvX25hbWUoY29sX3hfcSksXG4gICAgICAgICB5ID0gcXVvX25hbWUoY29sX3lfcSkpICtcbiAgICBnZ3RpdGxlKHRpdGxlKVxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2NhdHRlcnBsb3RfXFwsIG5hbWUpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgXG4gICAgICAgICAgd2lkdGggPSAzLjUsIGhlaWdodCA9IDMpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbiAgXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBcbiAgICAgIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzLCB1bml0cyA9IFxcaW5cXCwgcmVzID0gNjAwKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG4gIFxuICAjIFBpZSBjaGFydFxuICBkZjMgPC0gZGYgJT4lXG4gICAgZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYW5ub0xpc3QpICU+JVxuICAgIHNlbGVjdChpZCwgeCA9ICEhY29sX3hfcSwgeSA9ICEhY29sX3lfcSkgJT4lXG4gICAgbXV0YXRlKFxuICAgICAgbWlucG9zID0gbWluKGMoeCwgeSlbYyh4LCB5KSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgICAgZXBzICAgID0gbWlucG9zICogMC4xLFxuICAgICAgbHggICAgID0gbG9nMih4ICsgZXBzKSxcbiAgICAgIGx5ICAgICA9IGxvZzIoeSArIGVwcylcbiAgICApICU+JVxuICAgIG11dGF0ZShkaWZmID0gbHkgLSBseCkgJT4lXG4gICAgbXV0YXRlKHVwZG93biA9IGlmZWxzZShkaWZmID4gZGlmZkN1dG9mZiwgXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmYgPCAtZGlmZkN1dG9mZiwgXFxET1dOXFwsIFxcTk9cXCkpKVxuICBkZjMkdXBkb3duIDwtIGZhY3RvcihkZjMkdXBkb3duLCBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIFxuICBwaWVfZGYgPC0gZGYzICU+JVxuICAgIGRwbHlyOjpjb3VudCh1cGRvd24pICU+JVxuICAgIG11dGF0ZShwY3QgICA9IG4gLyBzdW0obikgKiAxMDAsXG4gICAgICAgICAgIGxhYmVsID0gcGFzdGUwKHVwZG93biwgXFxcXG5cXCwgbiwgXFxcXG4oXFwsIHJvdW5kKHBjdCwxKSwgXFwlKVxcKSlcblxuICBwMiA8LSBnZ3Bsb3QocGllX2RmLCBhZXMoeCA9IFxcXFwsIHkgPSBuLCBmaWxsID0gdXBkb3duKSkgK1xuICAgIGdlb21fY29sKGNvbG9yID0gXFx3aGl0ZVxcKSArXG4gICAgY29vcmRfcG9sYXIodGhldGEgPSBcXHlcXCkgK1xuICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBsYWJlbCksXG4gICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLFxuICAgICAgICAgICAgICBzaXplICAgICA9IGZvbnRTaXplTS8yKSArXG4gICAgdGhlbWVfdm9pZCgpICsgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCkgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoc3Ryb25nX3JlZCwgbm9fZ3JleSwgc3Ryb25nX2JsdWUpKVxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxccGllY2hhcnRfXFwsIG5hbWUpKVxuICB3aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuICBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpXG4gIHByaW50KHAyKVxuICBkZXYub2ZmKClcbn1cblxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5maWdEaXIgPC0gaGVyZShcXC4uL2ZpZ3VyZS9sb29wX2FuYWx5c2lzXFwpXG5kaXIuY3JlYXRlKGZpZ0Rpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpXG5cbmRhdGEgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcXGxvb3BTY29yZV9IYW5zZW4udHN2XFwpKVxuZGF0YSA8LSBkYXRhICU+JSBcbiAgZmlsdGVyKFxuICAgICFpZl9hbGwoc3RhcnRzX3dpdGgoXFxvb2VcXCksIH4gLnggPT0gMCkgICAjIGRyb3Agcm93cyB3aGVyZSAqZXZlcnkqIG9vZSogdmFsdWUgaXMgMFxuKVxuXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9hbGxfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX2FsbF9kVEFHdkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoXFxTLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2Vfc3RyX2RUQUd2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9zdHJfZFRBR3ZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3N0cjJfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3N0cjJfZFRBR3ZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3JlZ19kVEFHdkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2VfcmVnX2RUQUd2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYyhcXFAtU1xcLCBcXEUtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9yZWdTdHJfZFRBR3ZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3JlZ1N0cl9kVEFHdkRNU09cXCwgZmlnRGlyKVxuXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFgtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9hbGxfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX2FsbF9BNDg1dkRNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoXFxTLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2Vfc3RyX0E0ODV2RE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9zdHJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUy1TXFwsIFxcUy1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3N0cjJfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3N0cjJfQTQ4NXZETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3JlZ19BNDg1dkRNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2VfcmVnX0E0ODV2RE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYyhcXFAtU1xcLCBcXEUtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9yZWdTdHJfQTQ4NXZETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3JlZ1N0cl9BNDg1dkRNU09cXCwgZmlnRGlyKVxuXG5cbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcWC1YXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX2FsbF9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2VfYWxsX0VwaWRUQUd2RXBpRE1TT1xcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9FcGlETVNPLCBvb2VfRXBpZFRBRywgYyhcXFMtU1xcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9zdHJfRXBpZFRBR3ZFcGlETVNPXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3N0cl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxTLVNcXCwgXFxTLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU09cXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2VfcmVnX0VwaWRUQUd2RXBpRE1TT1xcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9yZWdfRXBpZFRBR3ZFcGlETVNPXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKFxcUC1TXFwsIFxcRS1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3JlZ1N0cl9FcGlkVEFHdkVwaURNU09cXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2VfcmVnU3RyX0VwaWRUQUd2RXBpRE1TT1xcLCBmaWdEaXIpXG5cblxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1TXFwsIFxcUy1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxYLVhcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2VfYWxsX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9hbGxfQUlEdlVUXFwsIGZpZ0RpcilcbnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKFxcUy1TXFwpLFxuICAgICAgICAgICAgICAgICBuYW1lID0gXFxIYW5zZW5fb29lX3N0cl9BSUR2VVRcXCxcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSBcXEhhbnNlbl9vb2Vfc3RyX0FJRHZVVFxcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYyhcXFMtU1xcLCBcXFMtWFxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9zdHIyX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9zdHIyX0FJRHZVVFxcLCBmaWdEaXIpXG5wbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSxcbiAgICAgICAgICAgICAgICAgbmFtZSA9IFxcSGFuc2VuX29vZV9yZWdfQUlEdlVUXFwsXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gXFxIYW5zZW5fb29lX3JlZ19BSUR2VVRcXCwgZmlnRGlyKVxucGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoXFxQLVNcXCwgXFxFLVNcXCksXG4gICAgICAgICAgICAgICAgIG5hbWUgPSBcXEhhbnNlbl9vb2VfcmVnU3RyX0FJRHZVVFxcLFxuICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcSGFuc2VuX29vZV9yZWdTdHJfQUlEdlVUXFwsIGZpZ0RpcilcblxuYGBgXG5gYGAifQ== -->

```r
```r
plot_loop_scores <- function(df, col_x, col_y, annoList,
                             name, title, figDir,
                             diffCutoff = 0.5, density_n = 100,
                             xmin = -0.5, xmax = 1,
                             ymin = -0.5, ymax = 1) {
  col_x_q <- enquo(col_x)
  col_y_q <- enquo(col_y)
  
  # Scatterplot
  df2 <- df %>%
    filter(Anno_simple %in% annoList) %>%
    select(id, x = !!col_x_q, y = !!col_y_q) %>%
    mutate(
      minpos = min(c(x, y)[c(x, y) > 0], na.rm = TRUE),
      eps    = minpos * 0.1,
      lx     = log2(x + eps),
      ly     = log2(y + eps)
    )
  
  p1 <- ggplot(df2, aes(x = lx, y = ly)) +
    geom_point() +
    scale_color_viridis() +
    scale_x_continuous(
      name   = paste0(\log2(\, quo_name(col_x_q), \)\)
    ) +
    scale_y_continuous(
      name   = paste0(\log2(\, quo_name(col_y_q), \)\)
    ) +
    coord_fixed() +
    geom_abline(slope = 1, intercept = 0,
                colour = \grey50\, linetype = \dashed\) +
    geom_hline(yintercept = 0, alpha = 0.5, colour = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, colour = \grey\) +
    geom_abline(slope = 1, intercept = -(2**diffCutoff),
                colour = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept = (2**diffCutoff),
                colour = \grey\, linetype = \dotted\) +
    theme_classic() +
    labs(x = quo_name(col_x_q),
         y = quo_name(col_y_q)) +
    ggtitle(title)
  
  fileName <- paste0(\scatterplot_\, name)
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 3.5, height = 3)
  print(p1)
  dev.off()
  
  png(here(figDir, paste0(fileName, \.png\)), 
      width = 3.5, height = 3, units = \in\, res = 600)
  print(p1)
  dev.off()
  
  # Pie chart
  df3 <- df %>%
    filter(Anno_simple %in% annoList) %>%
    select(id, x = !!col_x_q, y = !!col_y_q) %>%
    mutate(
      minpos = min(c(x, y)[c(x, y) > 0], na.rm = TRUE),
      eps    = minpos * 0.1,
      lx     = log2(x + eps),
      ly     = log2(y + eps)
    ) %>%
    mutate(diff = ly - lx) %>%
    mutate(updown = ifelse(diff > diffCutoff, \UP\,
                           ifelse(diff < -diffCutoff, \DOWN\, \NO\)))
  df3$updown <- factor(df3$updown, c(\UP\, \NO\, \DOWN\))
  
  pie_df <- df3 %>%
    dplyr::count(updown) %>%
    mutate(pct   = n / sum(n) * 100,
           label = paste0(updown, \\n\, n, \\n(\, round(pct,1), \%)\))

  p2 <- ggplot(pie_df, aes(x = \\, y = n, fill = updown)) +
    geom_col(color = \white\) +
    coord_polar(theta = \y\) +
    geom_text(aes(label = label),
              position = position_stack(vjust = 0.5),
              size     = fontSizeM/2) +
    theme_void() +   theme(legend.position = \none\) +
    scale_fill_manual(values = c(strong_red, no_grey, strong_blue))
  fileName <- here(figDir, paste0(\piechart_\, name))
  width <- panelSize(2)*mmToInch
  height <- panelSize(2)*mmToInch
  svglite(paste0(fileName, \.svg\), width = width, height = height)
  print(p2)
  dev.off()
}

commonLoopDir <- here(\../data/loop_analysis\)
figDir <- here(\../figure/loop_analysis\)
dir.create(figDir, showWarnings = FALSE, recursive = TRUE)

data <- fread(here(commonLoopDir, \loopScore_Hansen.tsv\))
data <- data %>% 
  filter(
    !if_all(starts_with(\ooe\), ~ .x == 0)   # drop rows where *every* ooe* value is 0
)

plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \Hansen_ooe_all_dTAGvDMSO\,
                 title = \Hansen_ooe_all_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\S-S\),
                 name = \Hansen_ooe_str_dTAGvDMSO\,
                 title = \Hansen_ooe_str_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\S-S\, \S-X\),
                 name = \Hansen_ooe_str2_dTAGvDMSO\,
                 title = \Hansen_ooe_str2_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-P\, \P-E\, \E-E\),
                 name = \Hansen_ooe_reg_dTAGvDMSO\,
                 title = \Hansen_ooe_reg_dTAGvDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_dTAG, c(\P-S\, \E-S\),
                 name = \Hansen_ooe_regStr_dTAGvDMSO\,
                 title = \Hansen_ooe_regStr_dTAGvDMSO\, figDir)

plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \Hansen_ooe_all_A485vDMSO\,
                 title = \Hansen_ooe_all_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\S-S\),
                 name = \Hansen_ooe_str_A485vDMSO\,
                 title = \Hansen_ooe_str_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\S-S\, \S-X\),
                 name = \Hansen_ooe_str2_A485vDMSO\,
                 title = \Hansen_ooe_str2_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-P\, \P-E\, \E-E\),
                 name = \Hansen_ooe_reg_A485vDMSO\,
                 title = \Hansen_ooe_reg_A485vDMSO\, figDir)
plot_loop_scores(data, ooe_DMSO, ooe_A485, c(\P-S\, \E-S\),
                 name = \Hansen_ooe_regStr_A485vDMSO\,
                 title = \Hansen_ooe_regStr_A485vDMSO\, figDir)


plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \Hansen_ooe_all_EpidTAGvEpiDMSO\,
                 title = \Hansen_ooe_all_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\S-S\),
                 name = \Hansen_ooe_str_EpidTAGvEpiDMSO\,
                 title = \Hansen_ooe_str_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\S-S\, \S-X\),
                 name = \Hansen_ooe_str2_EpidTAGvEpiDMSO\,
                 title = \Hansen_ooe_str2_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-P\, \P-E\, \E-E\),
                 name = \Hansen_ooe_reg_EpidTAGvEpiDMSO\,
                 title = \Hansen_ooe_reg_EpidTAGvEpiDMSO\, figDir)
plot_loop_scores(data, ooe_EpiDMSO, ooe_EpidTAG, c(\P-S\, \E-S\),
                 name = \Hansen_ooe_regStr_EpidTAGvEpiDMSO\,
                 title = \Hansen_ooe_regStr_EpidTAGvEpiDMSO\, figDir)


plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-P\, \P-E\, \P-S\, \P-X\,
                                                 \E-E\, \E-S\, \E-X\,
                                                 \S-S\, \S-X\,
                                                 \X-X\),
                 name = \Hansen_ooe_all_AIDvUT\,
                 title = \Hansen_ooe_all_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\S-S\),
                 name = \Hansen_ooe_str_AIDvUT\,
                 title = \Hansen_ooe_str_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\S-S\, \S-X\),
                 name = \Hansen_ooe_str2_AIDvUT\,
                 title = \Hansen_ooe_str2_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-P\, \P-E\, \E-E\),
                 name = \Hansen_ooe_reg_AIDvUT\,
                 title = \Hansen_ooe_reg_AIDvUT\, figDir)
plot_loop_scores(data, ooe_UT, ooe_AID, c(\P-S\, \E-S\),
                 name = \Hansen_ooe_regStr_AIDvUT\,
                 title = \Hansen_ooe_regStr_AIDvUT\, figDir)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dVptTkRkWFJ2Wm1ZZ1BDMGdNQzQxWEc1a2FXWm1RM1YwYjJabUlEd3RJREF1TlZ4dVkyOXRiVzl1VEc5dmNFUnBjaUE4TFNCb1pYSmxLRndpTGk0dlpHRjBZUzlzYjI5d1gyRnVZV3g1YzJselhDSXBYRzVrYVdabVJHbHlJRHd0SUdobGNtVW9YQ0l1TGk5a1lYUmhMMUpPUVY5a2FXWm1YQ0lwWEc1dVlXMWxJRHd0SUZ3aVNHRnVjMlZ1WENKY2JtZGxibVZCYm01dlJHRjBZU0E4TFNCc2IyRmtURzl2Y0VGdWJtOUVZWFJoS0dobGNtVW9ZMjl0Ylc5dVRHOXZjRVJwY2l3Z2NHRnpkR1V3S0Z3aWJHOXZjRk5qYjNKbFgxd2lMQ0J1WVcxbExDQmNJbDl3TFc1ZmMybHRjR3hsWDJWdWMyVnRZbXhNYVhOMExuUnpkbHdpS1NrcElDVStKVnh1SUNCbWFXeDBaWElvWEc0Z0lDQWdJV2xtWDJGc2JDaHpkR0Z5ZEhOZmQybDBhQ2hjSW05dlpWd2lLU3dnZmlBdWVDQTlQU0F3S1NBZ0lDTWdaSEp2Y0NCeWIzZHpJSGRvWlhKbElDcGxkbVZ5ZVNvZ2IyOWxLaUIyWVd4MVpTQnBjeUF3WEc0Z0lDa2dKVDRsWEc0Z0lISnZkM2RwYzJVb0tTQWxQaVVnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDTWdkMjl5YXlCdmJtVWdjbTkzSUdGMElHRWdkR2x0WlZ4dUlDQnRkWFJoZEdVb1hHNGdJQ0FnYldsdWNHOXpJRDBnYldsdUtHTW9iMjlsWDJSVVFVY3NJRzl2WlY5RVRWTlBLVnRqS0c5dlpWOWtWRUZITENCdmIyVmZSRTFUVHlrZ1BpQXdYU3dnYm1FdWNtMGdQU0JVVWxWRktTeGNiaUFnSUNCbGNITWdJQ0FnUFNCcFptVnNjMlVvYVhNdVptbHVhWFJsS0cxcGJuQnZjeWtzSUcxcGJuQnZjeUFxSURBdU1Td2dNQzR3TVNrc0lDQWdJQ0FnSXlCbVlXeHNZbUZqYXlCcFppQmliM1JvSUdGeVpTQXdYRzRnSUNBZ1pHbG1aaUFnSUQwZ2JHOW5NaWdvYjI5bFgyUlVRVWNnS3lCbGNITXBJQzhnS0c5dlpWOUVUVk5QSUNzZ1pYQnpLU2xjYmlBZ0tTQWxQaVVnWEc0Z0lIVnVaM0p2ZFhBb0tTQWxQaVVnWEc0Z0lITmxiR1ZqZENndGJXbHVjRzl6TENBdFpYQnpLU0JjYmlBZ0kyUndiSGx5T2pwdGRYUmhkR1VvWkdsbVppQTlJR3h2WnpJb2IyOWxYMlJVUVVjcElDMGdiRzluTWlodmIyVmZSRTFUVHlrcFhHNWNibHh1WkdsbVppNVNUa0VnUEMwZ1puSmxZV1FvYUdWeVpTaGthV1ptUkdseUxDQmNJbVJwWm1aZlJ6RXVaRlJCUjE5SE1TNHlhUzVrVkVGSFgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibWRsYm1WTWFYTjBMbVJ2ZDI0dVVrNUJJRHd0SUNoa2FXWm1MbEpPUVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUEQwZ01Dd2djR0ZrYWlBOElHRnNjR2hoS1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrWEc1blpXNWxUR2x6ZEM1MWNDNVNUa0VnUEMwZ0tHUnBabVl1VWs1QklDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtITm9jbWx1YTJWa1gyeHZaekpHUXlBK0lEQXNJSEJoWkdvZ1BDQmhiSEJvWVNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkZ4dVhHNWNibTFoZUV4dlp6SkdReUE4TFNBeVhHNWNiblJsYlhBZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScFptWXNJR2RsYm1VcElDVStKU0JjYmlBZ2RXNXVaWE4wS0dkbGJtVXBJQ1UrSlNCbmNtOTFjRjlpZVNoblpXNWxLU0FsUGlWY2JpQWdjM1Z0YldGeWFYcGxLRzFsWVc1ZlpHbG1abDl6WTI5eVpTQTlJRzFsWVc0b1pHbG1aaWtzSUM1bmNtOTFjSE1nUFNBblpISnZjQ2NwWEc1Y2JuUmxiWEFnUEMwZ2JHVm1kRjlxYjJsdUtIUmxiWEFzSUdScFptWXVVazVCTENCaWVTQTlJR01vWENKblpXNWxYQ0lnUFNCY0ltVnVjMlZ0WW14ZloyVnVaVjlwWkZ3aUtTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dac1lXY2dQU0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1WTWFYTjBMbVJ2ZDI0dVVrNUJMQ0JjSWpKRVQxZE9YQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExuVndMbEpPUVN3Z1hDSXhWVkJjSWl3Z1hDSXdUazljSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhlRVpzWVdjZ1BTQW9ZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCdFlYaE1iMmN5UmtNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9jbXh2WnpKbVkwMWhlQ0E5SUhCdFlYZ29jRzFwYmloemFISnBibXRsWkY5c2IyY3lSa01zSUcxaGVFeHZaekpHUXlrc0lDMXRZWGhNYjJjeVJrTXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtHWnNZV2NwWEc1Y2JuQWdQQzBnWjJkd2JHOTBLSFJsYlhBc0lHRmxjeWg0SUQwZ2MyaHliRzluTW1aalRXRjRMQ0I1SUQwZ2JXVmhibDlrYVdabVgzTmpiM0psTENCamIyeHZjaUE5SUdac1lXY3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHRmlaV3dnUFNCcFptVnNjMlVvWm14aFp5QWhQU0JjSWpCT1Qxd2lMQ0JsZUhSbGNtNWhiRjluWlc1bFgyNWhiV1VzSUU1QktTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFHRndaU0E5SUdGekxtWmhZM1J2Y2lodFlYaEdiR0ZuS1NrcElDdGNiaUFnWjJWdmJWOXdiMmx1ZENncElDc2daMlZ2YlY5MFpYaDBYM0psY0dWc0tDa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNCblozUnBkR3hsS0hCaGMzUmxNQ2h1WVcxbExDQmNJbDl2YjJWZmMybHRjR3hsUVc1dWIxd2lLU2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F0SUdScFptWkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJR1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdMV1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnYzJOaGJHVmZZMjlzYjNKZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSXdUazljSWlBOUlGd2laM0psZVZ3aUxDQmNJakZWVUZ3aUlEMGdYQ0p5WldSY0lpd2dYQ0l5UkU5WFRsd2lJRDBnWENKaWJIVmxYQ0lwS1NBcklDQWpJRU52Y25KbFkzUmxaQ0JqYjJ4dmNpQnRZWEJ3YVc1blhHNGdJSE5qWVd4bFgzTm9ZWEJsWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aVZGSlZSVndpSUQwZ01pd2dYQ0pHUVV4VFJWd2lJRDBnTVRrcEtWeHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKU1RrRjJjMHh2YjNCZlhDSXNJRzVoYldVc0lGd2lYMjl2WlY5emFXMXdiR1ZCYm01dlhDSXBYRzVvWldsbmFIUWdQQzBnTkZ4dWQybGtkR2dnUEMwZ04xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmZDdXRvZmYgPC0gMC41XG5jb21tb25Mb29wRGlyIDwtIGhlcmUoXFwuLi9kYXRhL2xvb3BfYW5hbHlzaXNcXClcbmRpZmZEaXIgPC0gaGVyZShcXC4uL2RhdGEvUk5BX2RpZmZcXClcbm5hbWUgPC0gXFxIYW5zZW5cXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIG5hbWUsIFxcX3Atbl9zaW1wbGVfZW5zZW1ibExpc3QudHN2XFwpKSkgJT4lXG4gIGZpbHRlcihcbiAgICAhaWZfYWxsKHN0YXJ0c193aXRoKFxcb29lXFwpLCB+IC54ID09IDApICAgIyBkcm9wIHJvd3Mgd2hlcmUgKmV2ZXJ5KiBvb2UqIHZhbHVlIGlzIDBcbiAgKSAlPiVcbiAgcm93d2lzZSgpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3b3JrIG9uZSByb3cgYXQgYSB0aW1lXG4gIG11dGF0ZShcbiAgICBtaW5wb3MgPSBtaW4oYyhvb2VfZFRBRywgb29lX0RNU08pW2Mob29lX2RUQUcsIG9vZV9ETVNPKSA+IDBdLCBuYS5ybSA9IFRSVUUpLFxuICAgIGVwcyAgICA9IGlmZWxzZShpcy5maW5pdGUobWlucG9zKSwgbWlucG9zICogMC4xLCAwLjAxKSwgICAgICAjIGZhbGxiYWNrIGlmIGJvdGggYXJlIDBcbiAgICBkaWZmICAgPSBsb2cyKChvb2VfZFRBRyArIGVwcykgLyAob29lX0RNU08gKyBlcHMpKVxuICApICU+JSBcbiAgdW5ncm91cCgpICU+JSBcbiAgc2VsZWN0KC1taW5wb3MsIC1lcHMpIFxuICAjZHBseXI6Om11dGF0ZShkaWZmID0gbG9nMihvb2VfZFRBRykgLSBsb2cyKG9vZV9ETVNPKSlcblxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKGRpZmZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8PSAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5cblxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZiwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdndGl0bGUocGFzdGUwKG5hbWUsIFxcX29vZV9zaW1wbGVBbm5vXFwpKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxncmV5XFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXFJOQXZzTG9vcF9cXCwgbmFtZSwgXFxfb29lX3NpbXBsZUFubm9cXClcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
alpha <- 0.05
fcCutoff <- 0.5
diffCutoff <- 0.5
commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \Hansen\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_simple_ensemblList.tsv\))) %>%
  filter(
    !if_all(starts_with(\ooe\), ~ .x == 0)   # drop rows where *every* ooe* value is 0
  ) %>%
  rowwise() %>%                                # work one row at a time
  mutate(
    minpos = min(c(ooe_dTAG, ooe_DMSO)[c(ooe_dTAG, ooe_DMSO) > 0], na.rm = TRUE),
    eps    = ifelse(is.finite(minpos), minpos * 0.1, 0.01),      # fallback if both are 0
    diff   = log2((ooe_dTAG + eps) / (ooe_DMSO + eps))
  ) %>% 
  ungroup() %>% 
  select(-minpos, -eps) 
  #dplyr::mutate(diff = log2(ooe_dTAG) - log2(ooe_DMSO))


diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_ooe_simpleAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_ooe_simpleAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlXeHdhR0VnUEMwZ01DNHdOVnh1Wm1ORGRYUnZabVlnUEMwZ01DNDFYRzVrYVdabVEzVjBiMlptSUR3dElEQXVOVnh1WTI5dGJXOXVURzl2Y0VScGNpQThMU0JvWlhKbEtGeGNMaTR2WkdGMFlTOXNiMjl3WDJGdVlXeDVjMmx6WEZ3cFhHNWthV1ptUkdseUlEd3RJR2hsY21Vb1hGd3VMaTlrWVhSaEwxSk9RVjlrYVdabVhGd3BYRzV1WVcxbElEd3RJRnhjU0dGdWMyVnVYRnhjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXRiVzl1VEc5dmNFUnBjaXdnY0dGemRHVXdLRnhjYkc5dmNGTmpiM0psWDF4Y0xDQnVZVzFsTENCY1hGOXdMVzVmYzJsdGNHeGxYMlZ1YzJWdFlteE1hWE4wTG5SemRseGNLU2twSUNVK0pWeHVJQ0JtYVd4MFpYSW9YRzRnSUNBZ0lXbG1YMkZzYkNoemRHRnlkSE5mZDJsMGFDaGNYRzl2WlZ4Y0tTd2dmaUF1ZUNBOVBTQXdLU0FnSUNNZ1pISnZjQ0J5YjNkeklIZG9aWEpsSUNwbGRtVnllU29nYjI5bEtpQjJZV3gxWlNCcGN5QXdYRzRnSUNrZ0pUNGxYRzRnSUhKdmQzZHBjMlVvS1NBbFBpVWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNNZ2QyOXlheUJ2Ym1VZ2NtOTNJR0YwSUdFZ2RHbHRaVnh1SUNCdGRYUmhkR1VvWEc0Z0lDQWdiV2x1Y0c5eklEMGdiV2x1S0dNb2IyOWxYMlJVUVVjc0lHOXZaVjlFVFZOUEtWdGpLRzl2WlY5a1ZFRkhMQ0J2YjJWZlJFMVRUeWtnUGlBd1hTd2dibUV1Y20wZ1BTQlVVbFZGS1N4Y2JpQWdJQ0JsY0hNZ0lDQWdQU0JwWm1Wc2MyVW9hWE11Wm1sdWFYUmxLRzFwYm5CdmN5a3NJRzFwYm5CdmN5QXFJREF1TVN3Z01DNHdNU2tzSUNBZ0lDQWdJeUJtWVd4c1ltRmpheUJwWmlCaWIzUm9JR0Z5WlNBd1hHNGdJQ0FnWkdsbVppQWdJRDBnYkc5bk1pZ29iMjlsWDJSVVFVY2dLeUJsY0hNcElDOGdLRzl2WlY5RVRWTlBJQ3NnWlhCektTbGNiaUFnS1NBbFBpVWdYRzRnSUhWdVozSnZkWEFvS1NBbFBpVWdYRzRnSUhObGJHVmpkQ2d0YldsdWNHOXpMQ0F0WlhCektTQmNiaUFnSTJSd2JIbHlPanB0ZFhSaGRHVW9aR2xtWmlBOUlHeHZaeklvYjI5bFgyUlVRVWNwSUMwZ2JHOW5NaWh2YjJWZlJFMVRUeWtwWEc1Y2JseHVaR2xtWmk1U1RrRWdQQzBnWm5KbFlXUW9hR1Z5WlNoa2FXWm1SR2x5TENCY1hHUnBabVpmUnpFdVpGUkJSMTlITVM0eWFTNWtWRUZIWDNaelgwY3hMakpwTGtSTlUwOHVkSE4yWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hsYm5ObGJXSnNYMmRsYm1WZmFXUXNJR3h2WnpKR2IyeGtRMmhoYm1kbExDQnphSEpwYm10bFpGOXNiMmN5UmtNc0lIQmhaR29zSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlNsY2JtZGxibVZNYVhOMExtUnZkMjR1VWs1QklEd3RJQ2hrYVdabUxsSk9RU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQRDBnTUN3Z2NHRmthaUE4SUdGc2NHaGhLU2trWlc1elpXMWliRjluWlc1bFgybGtYRzVuWlc1bFRHbHpkQzUxY0M1U1RrRWdQQzBnS0dScFptWXVVazVCSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hOb2NtbHVhMlZrWDJ4dlp6SkdReUErSURBc0lIQmhaR29nUENCaGJIQm9ZU2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WEc1Y2JtMWhlRXh2WnpKR1F5QThMU0F5WEc1Y2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwWm1Zc0lHZGxibVVwSUNVK0pTQmNiaUFnZFc1dVpYTjBLR2RsYm1VcElDVStKU0JuY205MWNGOWllU2huWlc1bEtTQWxQaVZjYmlBZ2MzVnRiV0Z5YVhwbEtHMWxZVzVmWkdsbVpsOXpZMjl5WlNBOUlHMWxZVzRvWkdsbVppa3NJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzVjYm5SbGJYQWdQQzBnYkdWbWRGOXFiMmx1S0hSbGJYQXNJR1JwWm1ZdVVrNUJMQ0JpZVNBOUlHTW9YRnhuWlc1bFhGd2dQU0JjWEdWdWMyVnRZbXhmWjJWdVpWOXBaRnhjS1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1pzWVdjZ1BTQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExtUnZkMjR1VWs1QkxDQmNYREpFVDFkT1hGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVk1hWE4wTG5Wd0xsSk9RU3dnWEZ3eFZWQmNYQ3dnWEZ3d1RrOWNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxaGVFWnNZV2NnUFNBb1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJ0WVhoTWIyY3lSa01wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb2NteHZaekptWTAxaGVDQTlJSEJ0WVhnb2NHMXBiaWh6YUhKcGJtdGxaRjlzYjJjeVJrTXNJRzFoZUV4dlp6SkdReWtzSUMxdFlYaE1iMmN5UmtNcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0dac1lXY3BYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnYzJoeWJHOW5NbVpqVFdGNExDQjVJRDBnYldWaGJsOWthV1ptWDNOamIzSmxMQ0JqYjJ4dmNpQTlJR1pzWVdjc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdGaVpXd2dQU0JwWm1Wc2MyVW9abXhoWnlBaFBTQmNYREJPVDF4Y0xDQmxlSFJsY201aGJGOW5aVzVsWDI1aGJXVXNJRTVCS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUdGd1pTQTlJR0Z6TG1aaFkzUnZjaWh0WVhoR2JHRm5LU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1oyVnZiVjkwWlhoMFgzSmxjR1ZzS0NrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJQ0JuWjNScGRHeGxLSEJoYzNSbE1DaHVZVzFsTENCY1hGOXZiMlZmYzJsdGNHeGxRVzV1YjF4Y0tTa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXRJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlHWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ0xXWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdjMk5oYkdWZlkyOXNiM0pmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWEZ3d1RrOWNYQ0E5SUZ4Y1ozSmxlVnhjTENCY1hERlZVRnhjSUQwZ1hGeHlaV1JjWEN3Z1hGd3lSRTlYVGx4Y0lEMGdYRnhpYkhWbFhGd3BLU0FySUNBaklFTnZjbkpsWTNSbFpDQmpiMnh2Y2lCdFlYQndhVzVuWEc0Z0lITmpZV3hsWDNOb1lYQmxYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjVkZKVlJWeGNJRDBnTWl3Z1hGeEdRVXhUUlZ4Y0lEMGdNVGtwS1Z4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhTVGtGMmMweHZiM0JmWEZ3c0lHNWhiV1VzSUZ4Y1gyOXZaVjl6YVcxd2JHVkJibTV2WEZ3cFhHNW9aV2xuYUhRZ1BDMGdORnh1ZDJsa2RHZ2dQQzBnTjF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmQ3V0b2ZmIDwtIDAuNVxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5kaWZmRGlyIDwtIGhlcmUoXFwuLi9kYXRhL1JOQV9kaWZmXFwpXG5uYW1lIDwtIFxcSGFuc2VuXFxcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBuYW1lLCBcXF9wLW5fc2ltcGxlX2Vuc2VtYmxMaXN0LnRzdlxcKSkpICU+JVxuICBmaWx0ZXIoXG4gICAgIWlmX2FsbChzdGFydHNfd2l0aChcXG9vZVxcKSwgfiAueCA9PSAwKSAgICMgZHJvcCByb3dzIHdoZXJlICpldmVyeSogb29lKiB2YWx1ZSBpcyAwXG4gICkgJT4lXG4gIHJvd3dpc2UoKSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd29yayBvbmUgcm93IGF0IGEgdGltZVxuICBtdXRhdGUoXG4gICAgbWlucG9zID0gbWluKGMob29lX2RUQUcsIG9vZV9ETVNPKVtjKG9vZV9kVEFHLCBvb2VfRE1TTykgPiAwXSwgbmEucm0gPSBUUlVFKSxcbiAgICBlcHMgICAgPSBpZmVsc2UoaXMuZmluaXRlKG1pbnBvcyksIG1pbnBvcyAqIDAuMSwgMC4wMSksICAgICAgIyBmYWxsYmFjayBpZiBib3RoIGFyZSAwXG4gICAgZGlmZiAgID0gbG9nMigob29lX2RUQUcgKyBlcHMpIC8gKG9vZV9ETVNPICsgZXBzKSlcbiAgKSAlPiUgXG4gIHVuZ3JvdXAoKSAlPiUgXG4gIHNlbGVjdCgtbWlucG9zLCAtZXBzKSBcbiAgI2RwbHlyOjptdXRhdGUoZGlmZiA9IGxvZzIob29lX2RUQUcpIC0gbG9nMihvb2VfRE1TTykpXG5cblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShkaWZmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPD0gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmYsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZiksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZ3RpdGxlKHBhc3RlMChuYW1lLCBcXF9vb2Vfc2ltcGxlQW5ub1xcKSkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxSTkF2c0xvb3BfXFwsIG5hbWUsIFxcX29vZV9zaW1wbGVBbm5vXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmQ3V0b2ZmIDwtIDAuNVxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5kaWZmRGlyIDwtIGhlcmUoXFwuLi9kYXRhL1JOQV9kaWZmXFwpXG5uYW1lIDwtIFxcSGFuc2VuXFxcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBuYW1lLCBcXF9wLW5fc2ltcGxlX2Vuc2VtYmxMaXN0LnRzdlxcKSkpICU+JVxuICBmaWx0ZXIoXG4gICAgIWlmX2FsbChzdGFydHNfd2l0aChcXG9vZVxcKSwgfiAueCA9PSAwKSAgICMgZHJvcCByb3dzIHdoZXJlICpldmVyeSogb29lKiB2YWx1ZSBpcyAwXG4gICkgJT4lXG4gIHJvd3dpc2UoKSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd29yayBvbmUgcm93IGF0IGEgdGltZVxuICBtdXRhdGUoXG4gICAgbWlucG9zID0gbWluKGMob29lX2RUQUcsIG9vZV9ETVNPKVtjKG9vZV9kVEFHLCBvb2VfRE1TTykgPiAwXSwgbmEucm0gPSBUUlVFKSxcbiAgICBlcHMgICAgPSBpZmVsc2UoaXMuZmluaXRlKG1pbnBvcyksIG1pbnBvcyAqIDAuMSwgMC4wMSksICAgICAgIyBmYWxsYmFjayBpZiBib3RoIGFyZSAwXG4gICAgZGlmZiAgID0gbG9nMigob29lX2RUQUcgKyBlcHMpIC8gKG9vZV9ETVNPICsgZXBzKSlcbiAgKSAlPiUgXG4gIHVuZ3JvdXAoKSAlPiUgXG4gIHNlbGVjdCgtbWlucG9zLCAtZXBzKSBcbiAgI2RwbHlyOjptdXRhdGUoZGlmZiA9IGxvZzIob29lX2RUQUcpIC0gbG9nMihvb2VfRE1TTykpXG5cblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShkaWZmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPD0gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmYsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZiksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZ3RpdGxlKHBhc3RlMChuYW1lLCBcXF9vb2Vfc2ltcGxlQW5ub1xcKSkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxSTkF2c0xvb3BfXFwsIG5hbWUsIFxcX29vZV9zaW1wbGVBbm5vXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
alpha <- 0.05
fcCutoff <- 0.5
diffCutoff <- 0.5
commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \Hansen\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_simple_ensemblList.tsv\))) %>%
  filter(
    !if_all(starts_with(\ooe\), ~ .x == 0)   # drop rows where *every* ooe* value is 0
  ) %>%
  rowwise() %>%                                # work one row at a time
  mutate(
    minpos = min(c(ooe_dTAG, ooe_DMSO)[c(ooe_dTAG, ooe_DMSO) > 0], na.rm = TRUE),
    eps    = ifelse(is.finite(minpos), minpos * 0.1, 0.01),      # fallback if both are 0
    diff   = log2((ooe_dTAG + eps) / (ooe_DMSO + eps))
  ) %>% 
  ungroup() %>% 
  select(-minpos, -eps) 
  #dplyr::mutate(diff = log2(ooe_dTAG) - log2(ooe_DMSO))


diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_ooe_simpleAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_ooe_simpleAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Scatterplot - Hansen

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dVptTkRkWFJ2Wm1ZZ1BDMGdNQzQxWEc1a2FXWm1RM1YwYjJabUlEd3RJREF1TlZ4dVkyOXRiVzl1VEc5dmNFUnBjaUE4TFNCb1pYSmxLRndpTGk0dlpHRjBZUzlzYjI5d1gyRnVZV3g1YzJselhDSXBYRzVrYVdabVJHbHlJRHd0SUdobGNtVW9YQ0l1TGk5a1lYUmhMMUpPUVY5a2FXWm1YQ0lwWEc1dVlXMWxJRHd0SUZ3aVNHRnVjMlZ1WENKY2JtZGxibVZCYm01dlJHRjBZU0E4TFNCc2IyRmtURzl2Y0VGdWJtOUVZWFJoS0dobGNtVW9ZMjl0Ylc5dVRHOXZjRVJwY2l3Z2NHRnpkR1V3S0Z3aWJHOXZjRk5qYjNKbFgxd2lMQ0J1WVcxbExDQmNJbDl3TFc1ZlkyOXRjR3hsZUY5bGJuTmxiV0pzVEdsemRDNTBjM1pjSWlrcEtTQWxQaVZjYmlBZ1ptbHNkR1Z5S0Z4dUlDQWdJQ0ZwWmw5aGJHd29jM1JoY25SelgzZHBkR2dvWENKdmIyVmNJaWtzSUg0Z0xuZ2dQVDBnTUNrZ0lDQWpJR1J5YjNBZ2NtOTNjeUIzYUdWeVpTQXFaWFpsY25rcUlHOXZaU29nZG1Gc2RXVWdhWE1nTUZ4dUlDQXBJQ1UrSlZ4dUlDQnliM2QzYVhObEtDa2dKVDRsSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpJSGR2Y21zZ2IyNWxJSEp2ZHlCaGRDQmhJSFJwYldWY2JpQWdiWFYwWVhSbEtGeHVJQ0FnSUcxcGJuQnZjeUE5SUcxcGJpaGpLRzl2WlY5a1ZFRkhMQ0J2YjJWZlJFMVRUeWxiWXlodmIyVmZaRlJCUnl3Z2IyOWxYMFJOVTA4cElENGdNRjBzSUc1aExuSnRJRDBnVkZKVlJTa3NYRzRnSUNBZ1pYQnpJQ0FnSUQwZ2FXWmxiSE5sS0dsekxtWnBibWwwWlNodGFXNXdiM01wTENCdGFXNXdiM01nS2lBd0xqRXNJREF1TURFcExDQWdJQ0FnSUNNZ1ptRnNiR0poWTJzZ2FXWWdZbTkwYUNCaGNtVWdNRnh1SUNBZ0lHUnBabVlnSUNBOUlHeHZaeklvS0c5dlpWOWtWRUZISUNzZ1pYQnpLU0F2SUNodmIyVmZSRTFUVHlBcklHVndjeWtwWEc0Z0lDa2dKVDRsSUZ4dUlDQjFibWR5YjNWd0tDa2dKVDRsSUZ4dUlDQnpaV3hsWTNRb0xXMXBibkJ2Y3l3Z0xXVndjeWtnWEc0Z0lDTmtjR3g1Y2pvNmJYVjBZWFJsS0dScFptWWdQU0JzYjJjeUtHOXZaVjlrVkVGSEtTQXRJR3h2WnpJb2IyOWxYMFJOVTA4cEtWeHVYRzVrYVdabUxsSk9RU0E4TFNCbWNtVmhaQ2hvWlhKbEtHUnBabVpFYVhJc0lGd2laR2xtWmw5SE1TNWtWRUZIWDBjeExqSnBMbVJVUVVkZmRuTmZSekV1TW1rdVJFMVRUeTUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dWdWMyVnRZbXhmWjJWdVpWOXBaQ3dnYkc5bk1rWnZiR1JEYUdGdVoyVXNJSE5vY21sdWEyVmtYMnh2WnpKR1F5d2djR0ZrYWl3Z1pYaDBaWEp1WVd4ZloyVnVaVjl1WVcxbEtWeHVaMlZ1WlV4cGMzUXVaRzkzYmk1U1RrRWdQQzBnS0dScFptWXVVazVCSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hOb2NtbHVhMlZrWDJ4dlp6SkdReUE4UFNBd0xDQndZV1JxSUR3Z1lXeHdhR0VwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1JjYm1kbGJtVk1hWE4wTG5Wd0xsSk9RU0E4TFNBb1pHbG1aaTVTVGtFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUQ0Z01Dd2djR0ZrYWlBOElHRnNjR2hoS1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrWEc1Y2JseHViV0Y0VEc5bk1rWkRJRHd0SURKY2JseHVkR1Z0Y0NBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsbVppd2daMlZ1WlNrZ0pUNGxJRnh1SUNCMWJtNWxjM1FvWjJWdVpTa2dKVDRsSUdkeWIzVndYMko1S0dkbGJtVXBJQ1UrSlZ4dUlDQnpkVzF0WVhKcGVtVW9iV1ZoYmw5a2FXWm1YM05qYjNKbElEMGdiV1ZoYmloa2FXWm1LU3dnTG1keWIzVndjeUE5SUNka2NtOXdKeWxjYmx4dWRHVnRjQ0E4TFNCc1pXWjBYMnB2YVc0b2RHVnRjQ3dnWkdsbVppNVNUa0VzSUdKNUlEMGdZeWhjSW1kbGJtVmNJaUE5SUZ3aVpXNXpaVzFpYkY5blpXNWxYMmxrWENJcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWm14aFp5QTlJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVaRzkzYmk1U1RrRXNJRndpTWtSUFYwNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaVXhwYzNRdWRYQXVVazVCTENCY0lqRlZVRndpTENCY0lqQk9UMXdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXRjRSbXhoWnlBOUlDaGhZbk1vYzJoeWFXNXJaV1JmYkc5bk1rWkRLU0ErSUcxaGVFeHZaekpHUXlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyaHliRzluTW1aalRXRjRJRDBnY0cxaGVDaHdiV2x1S0hOb2NtbHVhMlZrWDJ4dlp6SkdReXdnYldGNFRHOW5Na1pES1N3Z0xXMWhlRXh2WnpKR1F5a3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pteGhaeWxjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCemFISnNiMmN5Wm1OTllYZ3NJSGtnUFNCdFpXRnVYMlJwWm1aZmMyTnZjbVVzSUdOdmJHOXlJRDBnWm14aFp5eGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1lXSmxiQ0E5SUdsbVpXeHpaU2htYkdGbklDRTlJRndpTUU1UFhDSXNJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU3dnVGtFcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb1lYQmxJRDBnWVhNdVptRmpkRzl5S0cxaGVFWnNZV2NwS1NrZ0sxeHVJQ0JuWlc5dFgzQnZhVzUwS0NrZ0t5Qm5aVzl0WDNSbGVIUmZjbVZ3Wld3b0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJYRzRnSUdkbmRHbDBiR1VvY0dGemRHVXdLRzVoYldVc0lGd2lYMjl2WlY5amIyMXdiR1Y0UVc1dWIxd2lLU2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F0SUdScFptWkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJR1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdMV1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnYzJOaGJHVmZZMjlzYjNKZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSXdUazljSWlBOUlGd2laM0psZVZ3aUxDQmNJakZWVUZ3aUlEMGdYQ0p5WldSY0lpd2dYQ0l5UkU5WFRsd2lJRDBnWENKaWJIVmxYQ0lwS1NBcklDQWpJRU52Y25KbFkzUmxaQ0JqYjJ4dmNpQnRZWEJ3YVc1blhHNGdJSE5qWVd4bFgzTm9ZWEJsWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aVZGSlZSVndpSUQwZ01pd2dYQ0pHUVV4VFJWd2lJRDBnTVRrcEtWeHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKU1RrRjJjMHh2YjNCZlhDSXNJRzVoYldVc0lGd2lYMjl2WlY5amIyMXdiR1Y0UVc1dWIxd2lLVnh1YUdWcFoyaDBJRHd0SURSY2JuZHBaSFJvSUR3dElEZGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmZDdXRvZmYgPC0gMC41XG5jb21tb25Mb29wRGlyIDwtIGhlcmUoXFwuLi9kYXRhL2xvb3BfYW5hbHlzaXNcXClcbmRpZmZEaXIgPC0gaGVyZShcXC4uL2RhdGEvUk5BX2RpZmZcXClcbm5hbWUgPC0gXFxIYW5zZW5cXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIG5hbWUsIFxcX3Atbl9jb21wbGV4X2Vuc2VtYmxMaXN0LnRzdlxcKSkpICU+JVxuICBmaWx0ZXIoXG4gICAgIWlmX2FsbChzdGFydHNfd2l0aChcXG9vZVxcKSwgfiAueCA9PSAwKSAgICMgZHJvcCByb3dzIHdoZXJlICpldmVyeSogb29lKiB2YWx1ZSBpcyAwXG4gICkgJT4lXG4gIHJvd3dpc2UoKSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd29yayBvbmUgcm93IGF0IGEgdGltZVxuICBtdXRhdGUoXG4gICAgbWlucG9zID0gbWluKGMob29lX2RUQUcsIG9vZV9ETVNPKVtjKG9vZV9kVEFHLCBvb2VfRE1TTykgPiAwXSwgbmEucm0gPSBUUlVFKSxcbiAgICBlcHMgICAgPSBpZmVsc2UoaXMuZmluaXRlKG1pbnBvcyksIG1pbnBvcyAqIDAuMSwgMC4wMSksICAgICAgIyBmYWxsYmFjayBpZiBib3RoIGFyZSAwXG4gICAgZGlmZiAgID0gbG9nMigob29lX2RUQUcgKyBlcHMpIC8gKG9vZV9ETVNPICsgZXBzKSlcbiAgKSAlPiUgXG4gIHVuZ3JvdXAoKSAlPiUgXG4gIHNlbGVjdCgtbWlucG9zLCAtZXBzKSBcbiAgI2RwbHlyOjptdXRhdGUoZGlmZiA9IGxvZzIob29lX2RUQUcpIC0gbG9nMihvb2VfRE1TTykpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUoZGlmZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDw9IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXAuUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcblxuXG5tYXhMb2cyRkMgPC0gMlxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmYpLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2d0aXRsZShwYXN0ZTAobmFtZSwgXFxfb29lX2NvbXBsZXhBbm5vXFwpKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxncmV5XFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXFJOQXZzTG9vcF9cXCwgbmFtZSwgXFxfb29lX2NvbXBsZXhBbm5vXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
alpha <- 0.05
fcCutoff <- 0.5
diffCutoff <- 0.5
commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \Hansen\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_complex_ensemblList.tsv\))) %>%
  filter(
    !if_all(starts_with(\ooe\), ~ .x == 0)   # drop rows where *every* ooe* value is 0
  ) %>%
  rowwise() %>%                                # work one row at a time
  mutate(
    minpos = min(c(ooe_dTAG, ooe_DMSO)[c(ooe_dTAG, ooe_DMSO) > 0], na.rm = TRUE),
    eps    = ifelse(is.finite(minpos), minpos * 0.1, 0.01),      # fallback if both are 0
    diff   = log2((ooe_dTAG + eps) / (ooe_DMSO + eps))
  ) %>% 
  ungroup() %>% 
  select(-minpos, -eps) 
  #dplyr::mutate(diff = log2(ooe_dTAG) - log2(ooe_DMSO))

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_ooe_complexAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_ooe_complexAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlXeHdhR0VnUEMwZ01DNHdOVnh1Wm1ORGRYUnZabVlnUEMwZ01DNDFYRzVrYVdabVEzVjBiMlptSUR3dElEQXVOVnh1WTI5dGJXOXVURzl2Y0VScGNpQThMU0JvWlhKbEtGeGNMaTR2WkdGMFlTOXNiMjl3WDJGdVlXeDVjMmx6WEZ3cFhHNWthV1ptUkdseUlEd3RJR2hsY21Vb1hGd3VMaTlrWVhSaEwxSk9RVjlrYVdabVhGd3BYRzV1WVcxbElEd3RJRnhjU0dGdWMyVnVYRnhjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXRiVzl1VEc5dmNFUnBjaXdnY0dGemRHVXdLRnhjYkc5dmNGTmpiM0psWDF4Y0xDQnVZVzFsTENCY1hGOXdMVzVmWTI5dGNHeGxlRjlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNYQ2twS1NBbFBpVmNiaUFnWm1sc2RHVnlLRnh1SUNBZ0lDRnBabDloYkd3b2MzUmhjblJ6WDNkcGRHZ29YRnh2YjJWY1hDa3NJSDRnTG5nZ1BUMGdNQ2tnSUNBaklHUnliM0FnY205M2N5QjNhR1Z5WlNBcVpYWmxjbmtxSUc5dlpTb2dkbUZzZFdVZ2FYTWdNRnh1SUNBcElDVStKVnh1SUNCeWIzZDNhWE5sS0NrZ0pUNGxJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklIZHZjbXNnYjI1bElISnZkeUJoZENCaElIUnBiV1ZjYmlBZ2JYVjBZWFJsS0Z4dUlDQWdJRzFwYm5CdmN5QTlJRzFwYmloaktHOXZaVjlrVkVGSExDQnZiMlZmUkUxVFR5bGJZeWh2YjJWZlpGUkJSeXdnYjI5bFgwUk5VMDhwSUQ0Z01GMHNJRzVoTG5KdElEMGdWRkpWUlNrc1hHNGdJQ0FnWlhCeklDQWdJRDBnYVdabGJITmxLR2x6TG1acGJtbDBaU2h0YVc1d2IzTXBMQ0J0YVc1d2IzTWdLaUF3TGpFc0lEQXVNREVwTENBZ0lDQWdJQ01nWm1Gc2JHSmhZMnNnYVdZZ1ltOTBhQ0JoY21VZ01GeHVJQ0FnSUdScFptWWdJQ0E5SUd4dlp6SW9LRzl2WlY5a1ZFRkhJQ3NnWlhCektTQXZJQ2h2YjJWZlJFMVRUeUFySUdWd2N5a3BYRzRnSUNrZ0pUNGxJRnh1SUNCMWJtZHliM1Z3S0NrZ0pUNGxJRnh1SUNCelpXeGxZM1FvTFcxcGJuQnZjeXdnTFdWd2N5a2dYRzRnSUNOa2NHeDVjam82YlhWMFlYUmxLR1JwWm1ZZ1BTQnNiMmN5S0c5dlpWOWtWRUZIS1NBdElHeHZaeklvYjI5bFgwUk5VMDhwS1Z4dVhHNWthV1ptTGxKT1FTQThMU0JtY21WaFpDaG9aWEpsS0dScFptWkVhWElzSUZ4Y1pHbG1abDlITVM1a1ZFRkhYMGN4TGpKcExtUlVRVWRmZG5OZlJ6RXVNbWt1UkUxVFR5NTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR1Z1YzJWdFlteGZaMlZ1WlY5cFpDd2diRzluTWtadmJHUkRhR0Z1WjJVc0lITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2NHRmthaXdnWlhoMFpYSnVZV3hmWjJWdVpWOXVZVzFsS1Z4dVoyVnVaVXhwYzNRdVpHOTNiaTVTVGtFZ1BDMGdLR1JwWm1ZdVVrNUJJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSE5vY21sdWEyVmtYMnh2WnpKR1F5QThQU0F3TENCd1lXUnFJRHdnWVd4d2FHRXBLU1JsYm5ObGJXSnNYMmRsYm1WZmFXUmNibWRsYm1WTWFYTjBMblZ3TGxKT1FTQThMU0FvWkdsbVppNVNUa0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRDRnTUN3Z2NHRmthaUE4SUdGc2NHaGhLU2trWlc1elpXMWliRjluWlc1bFgybGtYRzVjYmx4dWJXRjRURzluTWtaRElEd3RJREpjYmx4dWRHVnRjQ0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2xtWml3Z1oyVnVaU2tnSlQ0bElGeHVJQ0IxYm01bGMzUW9aMlZ1WlNrZ0pUNGxJR2R5YjNWd1gySjVLR2RsYm1VcElDVStKVnh1SUNCemRXMXRZWEpwZW1Vb2JXVmhibDlrYVdabVgzTmpiM0psSUQwZ2JXVmhiaWhrYVdabUtTd2dMbWR5YjNWd2N5QTlJQ2RrY205d0p5bGNibHh1ZEdWdGNDQThMU0JzWldaMFgycHZhVzRvZEdWdGNDd2daR2xtWmk1U1RrRXNJR0o1SUQwZ1l5aGNYR2RsYm1WY1hDQTlJRnhjWlc1elpXMWliRjluWlc1bFgybGtYRndwS1NBbFBpVWdYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9abXhoWnlBOUlHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaVXhwYzNRdVpHOTNiaTVTVGtFc0lGeGNNa1JQVjA1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1ZFhBdVVrNUJMQ0JjWERGVlVGeGNMQ0JjWERCT1QxeGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYldGNFJteGhaeUE5SUNoaFluTW9jMmh5YVc1clpXUmZiRzluTWtaREtTQStJRzFoZUV4dlp6SkdReWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJoeWJHOW5NbVpqVFdGNElEMGdjRzFoZUNod2JXbHVLSE5vY21sdWEyVmtYMnh2WnpKR1F5d2diV0Y0VEc5bk1rWkRLU3dnTFcxaGVFeHZaekpHUXlrcElDVStKU0JjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvWm14aFp5bGNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J6YUhKc2IyY3labU5OWVhnc0lIa2dQU0J0WldGdVgyUnBabVpmYzJOdmNtVXNJR052Ykc5eUlEMGdabXhoWnl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWVdKbGJDQTlJR2xtWld4elpTaG1iR0ZuSUNFOUlGeGNNRTVQWEZ3c0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTd2dUa0VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vWVhCbElEMGdZWE11Wm1GamRHOXlLRzFoZUVac1lXY3BLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCblpXOXRYM1JsZUhSZmNtVndaV3dvS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJR2RuZEdsMGJHVW9jR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gyOXZaVjlqYjIxd2JHVjRRVzV1YjF4Y0tTa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXRJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlHWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ0xXWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdjMk5oYkdWZlkyOXNiM0pmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWEZ3d1RrOWNYQ0E5SUZ4Y1ozSmxlVnhjTENCY1hERlZVRnhjSUQwZ1hGeHlaV1JjWEN3Z1hGd3lSRTlYVGx4Y0lEMGdYRnhpYkhWbFhGd3BLU0FySUNBaklFTnZjbkpsWTNSbFpDQmpiMnh2Y2lCdFlYQndhVzVuWEc0Z0lITmpZV3hsWDNOb1lYQmxYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjVkZKVlJWeGNJRDBnTWl3Z1hGeEdRVXhUUlZ4Y0lEMGdNVGtwS1Z4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhTVGtGMmMweHZiM0JmWEZ3c0lHNWhiV1VzSUZ4Y1gyOXZaVjlqYjIxd2JHVjRRVzV1YjF4Y0tWeHVhR1ZwWjJoMElEd3RJRFJjYm5kcFpIUm9JRHd0SURkY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmQ3V0b2ZmIDwtIDAuNVxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5kaWZmRGlyIDwtIGhlcmUoXFwuLi9kYXRhL1JOQV9kaWZmXFwpXG5uYW1lIDwtIFxcSGFuc2VuXFxcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBuYW1lLCBcXF9wLW5fY29tcGxleF9lbnNlbWJsTGlzdC50c3ZcXCkpKSAlPiVcbiAgZmlsdGVyKFxuICAgICFpZl9hbGwoc3RhcnRzX3dpdGgoXFxvb2VcXCksIH4gLnggPT0gMCkgICAjIGRyb3Agcm93cyB3aGVyZSAqZXZlcnkqIG9vZSogdmFsdWUgaXMgMFxuICApICU+JVxuICByb3d3aXNlKCkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvcmsgb25lIHJvdyBhdCBhIHRpbWVcbiAgbXV0YXRlKFxuICAgIG1pbnBvcyA9IG1pbihjKG9vZV9kVEFHLCBvb2VfRE1TTylbYyhvb2VfZFRBRywgb29lX0RNU08pID4gMF0sIG5hLnJtID0gVFJVRSksXG4gICAgZXBzICAgID0gaWZlbHNlKGlzLmZpbml0ZShtaW5wb3MpLCBtaW5wb3MgKiAwLjEsIDAuMDEpLCAgICAgICMgZmFsbGJhY2sgaWYgYm90aCBhcmUgMFxuICAgIGRpZmYgICA9IGxvZzIoKG9vZV9kVEFHICsgZXBzKSAvIChvb2VfRE1TTyArIGVwcykpXG4gICkgJT4lIFxuICB1bmdyb3VwKCkgJT4lIFxuICBzZWxlY3QoLW1pbnBvcywgLWVwcykgXG4gICNkcGx5cjo6bXV0YXRlKGRpZmYgPSBsb2cyKG9vZV9kVEFHKSAtIGxvZzIob29lX0RNU08pKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKGRpZmZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8PSAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5cblxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZiwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdndGl0bGUocGFzdGUwKG5hbWUsIFxcX29vZV9jb21wbGV4QW5ub1xcKSkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxSTkF2c0xvb3BfXFwsIG5hbWUsIFxcX29vZV9jb21wbGV4QW5ub1xcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmQ3V0b2ZmIDwtIDAuNVxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5kaWZmRGlyIDwtIGhlcmUoXFwuLi9kYXRhL1JOQV9kaWZmXFwpXG5uYW1lIDwtIFxcSGFuc2VuXFxcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBuYW1lLCBcXF9wLW5fY29tcGxleF9lbnNlbWJsTGlzdC50c3ZcXCkpKSAlPiVcbiAgZmlsdGVyKFxuICAgICFpZl9hbGwoc3RhcnRzX3dpdGgoXFxvb2VcXCksIH4gLnggPT0gMCkgICAjIGRyb3Agcm93cyB3aGVyZSAqZXZlcnkqIG9vZSogdmFsdWUgaXMgMFxuICApICU+JVxuICByb3d3aXNlKCkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvcmsgb25lIHJvdyBhdCBhIHRpbWVcbiAgbXV0YXRlKFxuICAgIG1pbnBvcyA9IG1pbihjKG9vZV9kVEFHLCBvb2VfRE1TTylbYyhvb2VfZFRBRywgb29lX0RNU08pID4gMF0sIG5hLnJtID0gVFJVRSksXG4gICAgZXBzICAgID0gaWZlbHNlKGlzLmZpbml0ZShtaW5wb3MpLCBtaW5wb3MgKiAwLjEsIDAuMDEpLCAgICAgICMgZmFsbGJhY2sgaWYgYm90aCBhcmUgMFxuICAgIGRpZmYgICA9IGxvZzIoKG9vZV9kVEFHICsgZXBzKSAvIChvb2VfRE1TTyArIGVwcykpXG4gICkgJT4lIFxuICB1bmdyb3VwKCkgJT4lIFxuICBzZWxlY3QoLW1pbnBvcywgLWVwcykgXG4gICNkcGx5cjo6bXV0YXRlKGRpZmYgPSBsb2cyKG9vZV9kVEFHKSAtIGxvZzIob29lX0RNU08pKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKGRpZmZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8PSAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkXG5cblxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZiwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdndGl0bGUocGFzdGUwKG5hbWUsIFxcX29vZV9jb21wbGV4QW5ub1xcKSkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxSTkF2c0xvb3BfXFwsIG5hbWUsIFxcX29vZV9jb21wbGV4QW5ub1xcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
alpha <- 0.05
fcCutoff <- 0.5
diffCutoff <- 0.5
commonLoopDir <- here(\../data/loop_analysis\)
diffDir <- here(\../data/RNA_diff\)
name <- \Hansen\
geneAnnoData <- loadLoopAnnoData(here(commonLoopDir, paste0(\loopScore_\, name, \_p-n_complex_ensemblList.tsv\))) %>%
  filter(
    !if_all(starts_with(\ooe\), ~ .x == 0)   # drop rows where *every* ooe* value is 0
  ) %>%
  rowwise() %>%                                # work one row at a time
  mutate(
    minpos = min(c(ooe_dTAG, ooe_DMSO)[c(ooe_dTAG, ooe_DMSO) > 0], na.rm = TRUE),
    eps    = ifelse(is.finite(minpos), minpos * 0.1, 0.01),      # fallback if both are 0
    diff   = log2((ooe_dTAG + eps) / (ooe_DMSO + eps))
  ) %>% 
  ungroup() %>% 
  select(-minpos, -eps) 
  #dplyr::mutate(diff = log2(ooe_dTAG) - log2(ooe_DMSO))

diff.RNA <- fread(here(diffDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC <= 0, padj < alpha))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA %>% dplyr::filter(shrinked_log2FC > 0, padj < alpha))$ensembl_gene_id


maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() +
  ggtitle(paste0(name, \_ooe_complexAnno\)) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\RNAvsLoop_\, name, \_ooe_complexAnno\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### RNA-seq loopscore scatterplot

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZMjl0Ylc5dVRHOXZjRVJwY2lBOExTQm9aWEpsS0Z3aUxpNHZaR0YwWVM5c2IyOXdYMkZ1WVd4NWMybHpYQ0lwWEc1Y2JtUnBabVpEZFhSdlptWWdQQzBnTUM0eVhHNWNibVJoZEdFZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjIxdGIyNU1iMjl3UkdseUxDQmNJbXh2YjNCVFkyOXlaVjlqYUhKdmJXOXphV2RvZEM1MGMzWmNJaWtwWEc1Y2JuTmpiM0psTG5SaUlEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1FXNXViMTl6YVcxd2JHVWdKV2x1SlNCaktGd2lVeTFUWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hwWkN3Z2MyTnZjbVZmUkUxVFR5d2djMk52Y21WZlpGUkJSeWxjYmx4dVhHNGpJeU1nVURFdUlGVlVJSFp6SUVGSlJGeHVjMk52Y21VdWRHSWtaR1Z1YzJsMGVTQThMU0JuWlhSZlpHVnVjMmwwZVNoelkyOXlaUzUwWWlSelkyOXlaVjlFVFZOUExDQnpZMjl5WlM1MFlpUnpZMjl5WlY5a1ZFRkhMQ0J1SUQwZ01qQXdLVnh1YzJOdmNtVXVkR0lnUEMwZ2MyTnZjbVV1ZEdJZ0pUNGxJR1J3YkhseU9qcGhjbkpoYm1kbEtHUmxibk5wZEhrcFhHNXdNU0E4TFNCblozQnNiM1FvYzJOdmNtVXVkR0lzSUdGbGN5aDRJRDBnYzJOdmNtVmZSRTFUVHl3Z2VTQTlJSE5qYjNKbFgyUlVRVWNzSUdOdmJHOXlJRDBnWkdWdWMybDBlU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1hHNGdJSE5qWVd4bFgyTnZiRzl5WDNacGNtbGthWE1vS1NBclhHNGdJSGhzYVcwb0xUQXVOU3dnTVNrZ0t5QjViR2x0S0Mwd0xqVXNJREVwSUN0Y2JpQWdZMjl2Y21SZlptbDRaV1FvS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdNQ3dnWTI5c0lEMGdYQ0puY21WNU5UQmNJaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGd2laM0psZVZ3aUtTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGd2laM0psZVZ3aUtTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTFdScFptWkRkWFJ2Wm1Zc0lHTnZiQ0E5SUZ3aVozSmxlVndpTENCc2FXNWxkSGx3WlNBOUlGd2laRzkwZEdWa1hDSXBJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY0ltZHlaWGxjSWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJ2ZEhSbFpGd2lLU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHZG5kR2wwYkdVb2NHRnpkR1V3S0Z3aVEyOXVjMlZ1YzNWeklHeHZiM0FnYzJOdmNtVmNJaWtwWEc1Y2JseHVJeUJFWldacGJtVWdkR2hsSUdSaGRHRmNibU5oZEdWbmIzSnBaWE1nUEMwZ1l5aGNJbFZ3WENJc0lGd2lUbTljSWl3Z1hDSkViM2R1WENJcFhHNTJZV3gxWlhNZ1BDMGdZeWd5TWpnc0lEa3dPRFFzSURVM01UWTVLVnh1WEc0aklFTmhiR04xYkdGMFpTQndaWEpqWlc1MFlXZGxjMXh1Y0dWeVkyVnVkR0ZuWlhNZ1BDMGdjbTkxYm1Rb0tIWmhiSFZsY3lBdklITjFiU2gyWVd4MVpYTXBLU0FxSURFd01Dd2dNaWxjYmx4dUl5QkRiMjFpYVc1bElIWmhiSFZsY3lCaGJtUWdjR1Z5WTJWdWRHRm5aWE1nWm05eUlHeGhZbVZzYzF4dWJHRmlaV3h6SUR3dElIQmhjM1JsS0dOaGRHVm5iM0pwWlhNc0lGd2lYRnh1WENJc0lIWmhiSFZsY3l3Z1hDSmNYRzRvWENJc0lIQmxjbU5sYm5SaFoyVnpMQ0JjSWlVcFhDSXNJSE5sY0NBOUlGd2lYQ0lwWEc1Y2JtWnBiR1ZPWVcxbElEd3RJR2hsY21Vb1ptbG5SR2x5TENCY0luQnBaV05vWVhKMFgzVnVhVzl1VEc5dmNITmNJaWxjYm5kcFpIUm9JRHd0SUhCaGJtVnNVMmw2WlNneUtTcHRiVlJ2U1c1amFGeHVhR1ZwWjJoMElEd3RJSEJoYm1Wc1UybDZaU2d5S1NwdGJWUnZTVzVqYUZ4dWMzWm5iR2wwWlNod1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1N3Z2QybGtkR2dnUFNCM2FXUjBhQ3dnYUdWcFoyaDBJRDFvWldsbmFIUXBYRzV3YVdVb2RtRnNkV1Z6TENCY2JpQWdJQ0JzWVdKbGJITWdQU0JzWVdKbGJITXNJRnh1SUNBZ0lHTnZiQ0E5SUdNb2MzUnliMjVuWDNKbFpDd2dibTlmWjNKbGVTd2djM1J5YjI1blgySnNkV1VwTENCY2JpQWdJQ0JqWlhnZ1BTQm1iMjUwVTJsNlpVMHZNVElwWEc1a1pYWXViMlptS0NsY2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5cbmRhdGEgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcXGxvb3BTY29yZV9jaHJvbW9zaWdodC50c3ZcXCkpXG5cbnNjb3JlLnRiIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ub19zaW1wbGUgJWluJSBjKFxcUy1TXFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgc2NvcmVfRE1TTywgc2NvcmVfZFRBRylcblxuXG4jIyMgUDEuIFVUIHZzIEFJRFxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRzY29yZV9ETVNPLCBzY29yZS50YiRzY29yZV9kVEFHLCBuID0gMjAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5wMSA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gc2NvcmVfRE1TTywgeSA9IHNjb3JlX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpXG5cblxuIyBEZWZpbmUgdGhlIGRhdGFcbmNhdGVnb3JpZXMgPC0gYyhcXFVwXFwsIFxcTm9cXCwgXFxEb3duXFwpXG52YWx1ZXMgPC0gYygyMjgsIDkwODQsIDU3MTY5KVxuXG4jIENhbGN1bGF0ZSBwZXJjZW50YWdlc1xucGVyY2VudGFnZXMgPC0gcm91bmQoKHZhbHVlcyAvIHN1bSh2YWx1ZXMpKSAqIDEwMCwgMilcblxuIyBDb21iaW5lIHZhbHVlcyBhbmQgcGVyY2VudGFnZXMgZm9yIGxhYmVsc1xubGFiZWxzIDwtIHBhc3RlKGNhdGVnb3JpZXMsIFxcXFxuXFwsIHZhbHVlcywgXFxcXG4oXFwsIHBlcmNlbnRhZ2VzLCBcXCUpXFwsIHNlcCA9IFxcXFwpXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXHBpZWNoYXJ0X3VuaW9uTG9vcHNcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID1oZWlnaHQpXG5waWUodmFsdWVzLCBcbiAgICBsYWJlbHMgPSBsYWJlbHMsIFxuICAgIGNvbCA9IGMoc3Ryb25nX3JlZCwgbm9fZ3JleSwgc3Ryb25nX2JsdWUpLCBcbiAgICBjZXggPSBmb250U2l6ZU0vMTIpXG5kZXYub2ZmKClcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
commonLoopDir <- here(\../data/loop_analysis\)

diffCutoff <- 0.2

data <- fread(here(commonLoopDir, \loopScore_chromosight.tsv\))

score.tb <- data %>% dplyr::filter(Anno_simple %in% c(\S-S\)) %>%
  dplyr::select(id, score_DMSO, score_dTAG)


### P1. UT vs AID
score.tb$density <- get_density(score.tb$score_DMSO, score.tb$score_dTAG, n = 200)
score.tb <- score.tb %>% dplyr::arrange(density)
p1 <- ggplot(score.tb, aes(x = score_DMSO, y = score_dTAG, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\))


# Define the data
categories <- c(\Up\, \No\, \Down\)
values <- c(228, 9084, 57169)

# Calculate percentages
percentages <- round((values / sum(values)) * 100, 2)

# Combine values and percentages for labels
labels <- paste(categories, \\n\, values, \\n(\, percentages, \%)\, sep = \\)

fileName <- here(figDir, \piechart_unionLoops\)
width <- panelSize(2)*mmToInch
height <- panelSize(2)*mmToInch
svglite(paste0(fileName, \.svg\), width = width, height =height)
pie(values, 
    labels = labels, 
    col = c(strong_red, no_grey, strong_blue), 
    cex = fontSizeM/12)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVkyOXRiVzl1VEc5dmNFUnBjaUE4TFNCb1pYSmxLRnhjTGk0dlpHRjBZUzlzYjI5d1gyRnVZV3g1YzJselhGd3BYRzVjYm1ScFptWkRkWFJ2Wm1ZZ1BDMGdNQzR5WEc1Y2JtUmhkR0VnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjF0YjI1TWIyOXdSR2x5TENCY1hHeHZiM0JUWTI5eVpWOWphSEp2Ylc5emFXZG9kQzUwYzNaY1hDa3BYRzVjYm5OamIzSmxMblJpSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvUVc1dWIxOXphVzF3YkdVZ0pXbHVKU0JqS0Z4Y1V5MVRYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaHBaQ3dnYzJOdmNtVmZSRTFUVHl3Z2MyTnZjbVZmWkZSQlJ5bGNibHh1WEc0akl5TWdVREV1SUZWVUlIWnpJRUZKUkZ4dWMyTnZjbVV1ZEdJa1pHVnVjMmwwZVNBOExTQm5aWFJmWkdWdWMybDBlU2h6WTI5eVpTNTBZaVJ6WTI5eVpWOUVUVk5QTENCelkyOXlaUzUwWWlSelkyOXlaVjlrVkVGSExDQnVJRDBnTWpBd0tWeHVjMk52Y21VdWRHSWdQQzBnYzJOdmNtVXVkR0lnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dSbGJuTnBkSGtwWEc1d01TQThMU0JuWjNCc2IzUW9jMk52Y21VdWRHSXNJR0ZsY3loNElEMGdjMk52Y21WZlJFMVRUeXdnZVNBOUlITmpiM0psWDJSVVFVY3NJR052Ykc5eUlEMGdaR1Z1YzJsMGVTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWEc0Z0lITmpZV3hsWDJOdmJHOXlYM1pwY21sa2FYTW9LU0FyWEc0Z0lIaHNhVzBvTFRBdU5Td2dNU2tnS3lCNWJHbHRLQzB3TGpVc0lERXBJQ3RjYmlBZ1kyOXZjbVJmWm1sNFpXUW9LU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ01Dd2dZMjlzSUQwZ1hGeG5jbVY1TlRCY1hDd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ4Y1ozSmxlVnhjS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ4Y1ozSmxlVnhjS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdMV1JwWm1aRGRYUnZabVlzSUdOdmJDQTlJRnhjWjNKbGVWeGNMQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHOTBkR1ZrWEZ3cElDdGNiaUFnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0JrYVdabVEzVjBiMlptTENCamIyd2dQU0JjWEdkeVpYbGNYQ3dnYkdsdVpYUjVjR1VnUFNCY1hHUnZkSFJsWkZ4Y0tTQXJYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUdkbmRHbDBiR1VvY0dGemRHVXdLRnhjUTI5dWMyVnVjM1Z6SUd4dmIzQWdjMk52Y21WY1hDa3BYRzVjYmx4dUl5QkVaV1pwYm1VZ2RHaGxJR1JoZEdGY2JtTmhkR1ZuYjNKcFpYTWdQQzBnWXloY1hGVndYRndzSUZ4Y1RtOWNYQ3dnWEZ4RWIzZHVYRndwWEc1MllXeDFaWE1nUEMwZ1l5Z3lNamdzSURrd09EUXNJRFUzTVRZNUtWeHVYRzRqSUVOaGJHTjFiR0YwWlNCd1pYSmpaVzUwWVdkbGMxeHVjR1Z5WTJWdWRHRm5aWE1nUEMwZ2NtOTFibVFvS0haaGJIVmxjeUF2SUhOMWJTaDJZV3gxWlhNcEtTQXFJREV3TUN3Z01pbGNibHh1SXlCRGIyMWlhVzVsSUhaaGJIVmxjeUJoYm1RZ2NHVnlZMlZ1ZEdGblpYTWdabTl5SUd4aFltVnNjMXh1YkdGaVpXeHpJRHd0SUhCaGMzUmxLR05oZEdWbmIzSnBaWE1zSUZ4Y1hGeHVYRndzSUhaaGJIVmxjeXdnWEZ4Y1hHNG9YRndzSUhCbGNtTmxiblJoWjJWekxDQmNYQ1VwWEZ3c0lITmxjQ0E5SUZ4Y1hGd3BYRzVjYm1acGJHVk9ZVzFsSUR3dElHaGxjbVVvWm1sblJHbHlMQ0JjWEhCcFpXTm9ZWEowWDNWdWFXOXVURzl2Y0hOY1hDbGNibmRwWkhSb0lEd3RJSEJoYm1Wc1UybDZaU2d5S1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3lLU3B0YlZSdlNXNWphRnh1YzNabmJHbDBaU2h3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU3dnZDJsa2RHZ2dQU0IzYVdSMGFDd2dhR1ZwWjJoMElEMW9aV2xuYUhRcFhHNXdhV1VvZG1Gc2RXVnpMQ0JjYmlBZ0lDQnNZV0psYkhNZ1BTQnNZV0psYkhNc0lGeHVJQ0FnSUdOdmJDQTlJR01vYzNSeWIyNW5YM0psWkN3Z2JtOWZaM0psZVN3Z2MzUnliMjVuWDJKc2RXVXBMQ0JjYmlBZ0lDQmpaWGdnUFNCbWIyNTBVMmw2WlUwdk1USXBYRzVrWlhZdWIyWm1LQ2xjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbmNvbW1vbkxvb3BEaXIgPC0gaGVyZShcXC4uL2RhdGEvbG9vcF9hbmFseXNpc1xcKVxuXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgXFxsb29wU2NvcmVfY2hyb21vc2lnaHQudHN2XFwpKVxuXG5zY29yZS50YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYyhcXFMtU1xcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIHNjb3JlX0RNU08sIHNjb3JlX2RUQUcpXG5cblxuIyMjIFAxLiBVVCB2cyBBSURcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkc2NvcmVfRE1TTywgc2NvcmUudGIkc2NvcmVfZFRBRywgbiA9IDIwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxucDEgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IHNjb3JlX0RNU08sIHkgPSBzY29yZV9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKVxuXG5cbiMgRGVmaW5lIHRoZSBkYXRhXG5jYXRlZ29yaWVzIDwtIGMoXFxVcFxcLCBcXE5vXFwsIFxcRG93blxcKVxudmFsdWVzIDwtIGMoMjI4LCA5MDg0LCA1NzE2OSlcblxuIyBDYWxjdWxhdGUgcGVyY2VudGFnZXNcbnBlcmNlbnRhZ2VzIDwtIHJvdW5kKCh2YWx1ZXMgLyBzdW0odmFsdWVzKSkgKiAxMDAsIDIpXG5cbiMgQ29tYmluZSB2YWx1ZXMgYW5kIHBlcmNlbnRhZ2VzIGZvciBsYWJlbHNcbmxhYmVscyA8LSBwYXN0ZShjYXRlZ29yaWVzLCBcXFxcblxcLCB2YWx1ZXMsIFxcXFxuKFxcLCBwZXJjZW50YWdlcywgXFwlKVxcLCBzZXAgPSBcXFxcKVxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFxwaWVjaGFydF91bmlvbkxvb3BzXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9aGVpZ2h0KVxucGllKHZhbHVlcywgXG4gICAgbGFiZWxzID0gbGFiZWxzLCBcbiAgICBjb2wgPSBjKHN0cm9uZ19yZWQsIG5vX2dyZXksIHN0cm9uZ19ibHVlKSwgXG4gICAgY2V4ID0gZm9udFNpemVNLzEyKVxuZGV2Lm9mZigpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5cbmRhdGEgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcXGxvb3BTY29yZV9jaHJvbW9zaWdodC50c3ZcXCkpXG5cbnNjb3JlLnRiIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ub19zaW1wbGUgJWluJSBjKFxcUy1TXFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgc2NvcmVfRE1TTywgc2NvcmVfZFRBRylcblxuXG4jIyMgUDEuIFVUIHZzIEFJRFxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRzY29yZV9ETVNPLCBzY29yZS50YiRzY29yZV9kVEFHLCBuID0gMjAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5wMSA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gc2NvcmVfRE1TTywgeSA9IHNjb3JlX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpXG5cblxuIyBEZWZpbmUgdGhlIGRhdGFcbmNhdGVnb3JpZXMgPC0gYyhcXFVwXFwsIFxcTm9cXCwgXFxEb3duXFwpXG52YWx1ZXMgPC0gYygyMjgsIDkwODQsIDU3MTY5KVxuXG4jIENhbGN1bGF0ZSBwZXJjZW50YWdlc1xucGVyY2VudGFnZXMgPC0gcm91bmQoKHZhbHVlcyAvIHN1bSh2YWx1ZXMpKSAqIDEwMCwgMilcblxuIyBDb21iaW5lIHZhbHVlcyBhbmQgcGVyY2VudGFnZXMgZm9yIGxhYmVsc1xubGFiZWxzIDwtIHBhc3RlKGNhdGVnb3JpZXMsIFxcXFxuXFwsIHZhbHVlcywgXFxcXG4oXFwsIHBlcmNlbnRhZ2VzLCBcXCUpXFwsIHNlcCA9IFxcXFwpXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXHBpZWNoYXJ0X3VuaW9uTG9vcHNcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID1oZWlnaHQpXG5waWUodmFsdWVzLCBcbiAgICBsYWJlbHMgPSBsYWJlbHMsIFxuICAgIGNvbCA9IGMoc3Ryb25nX3JlZCwgbm9fZ3JleSwgc3Ryb25nX2JsdWUpLCBcbiAgICBjZXggPSBmb250U2l6ZU0vMTIpXG5kZXYub2ZmKClcblxuYGBgXG5gYGAifQ== -->

```r
```r
commonLoopDir <- here(\../data/loop_analysis\)

diffCutoff <- 0.2

data <- fread(here(commonLoopDir, \loopScore_chromosight.tsv\))

score.tb <- data %>% dplyr::filter(Anno_simple %in% c(\S-S\)) %>%
  dplyr::select(id, score_DMSO, score_dTAG)


### P1. UT vs AID
score.tb$density <- get_density(score.tb$score_DMSO, score.tb$score_dTAG, n = 200)
score.tb <- score.tb %>% dplyr::arrange(density)
p1 <- ggplot(score.tb, aes(x = score_DMSO, y = score_dTAG, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\))


# Define the data
categories <- c(\Up\, \No\, \Down\)
values <- c(228, 9084, 57169)

# Calculate percentages
percentages <- round((values / sum(values)) * 100, 2)

# Combine values and percentages for labels
labels <- paste(categories, \\n\, values, \\n(\, percentages, \%)\, sep = \\)

fileName <- here(figDir, \piechart_unionLoops\)
width <- panelSize(2)*mmToInch
height <- panelSize(2)*mmToInch
svglite(paste0(fileName, \.svg\), width = width, height =height)
pie(values, 
    labels = labels, 
    col = c(strong_red, no_grey, strong_blue), 
    cex = fontSizeM/12)
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZMjl0Ylc5dVRHOXZjRVJwY2lBOExTQm9aWEpsS0Z3aUxpNHZaR0YwWVM5c2IyOXdYMkZ1WVd4NWMybHpYQ0lwWEc1Y2JtUnBabVpEZFhSdlptWWdQQzBnTUM0eVhHNWNibVJoZEdFZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjIxdGIyNU1iMjl3UkdseUxDQmNJbXh2YjNCVFkyOXlaVjlqYUhKdmJXOXphV2RvZEM1MGMzWmNJaWtwWEc1Y2JuTmpiM0psTG5SaUlEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1FXNXViMTl6YVcxd2JHVWdKV2x1SlNCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJc0lGd2lSUzFGWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hwWkN3Z2IyOWxYMFJOVTA4c0lHOXZaVjlrVkVGSEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWdoYVhNdWJtRW9iMjlsWDBSTlUwOHBMQ0FoYVhNdWJtRW9iMjlsWDJSVVFVY3BLVnh1WEc1Y2JpTWpJeUJRTVM0Z1ZWUWdkbk1nUVVsRVhHNXpZMjl5WlM1MFlpUmtaVzV6YVhSNUlEd3RJR2RsZEY5a1pXNXphWFI1S0hOamIzSmxMblJpSkc5dlpWOUVUVk5QTENCelkyOXlaUzUwWWlSdmIyVmZaRlJCUnl3Z2JpQTlJREl3TUNsY2JuTmpiM0psTG5SaUlEd3RJSE5qYjNKbExuUmlJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlc1emFYUjVLVnh1Y0RFZ1BDMGdaMmR3Ykc5MEtITmpiM0psTG5SaUxDQmhaWE1vZUNBOUlHOXZaVjlFVFZOUExDQjVJRDBnYjI5bFgyUlVRVWNzSUdOdmJHOXlJRDBnWkdWdWMybDBlU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1hHNGdJSE5qWVd4bFgyTnZiRzl5WDNacGNtbGthWE1vS1NBclhHNGdJR052YjNKa1gyWnBlR1ZrS0NrZ0sxeHVJQ0FnSUhoc2FXMG9MVEF1TlN3Z05Ta2dLeUI1YkdsdEtDMHdMalVzSURVcElDdGNibHh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SURBc0lHTnZiQ0E5SUZ3aVozSmxlVFV3WENJc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlDMWthV1ptUTNWMGIyWm1MQ0JqYjJ3Z1BTQmNJbWR5WlhsY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SdmRIUmxaRndpS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYQ0puY21WNVhDSXNJR3hwYm1WMGVYQmxJRDBnWENKa2IzUjBaV1JjSWlrZ0sxeHVJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJuWjNScGRHeGxLSEJoYzNSbE1DaGNJa052Ym5ObGJuTjFjeUJzYjI5d0lITmpiM0psWENJcEtWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5cbmRhdGEgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcXGxvb3BTY29yZV9jaHJvbW9zaWdodC50c3ZcXCkpXG5cbnNjb3JlLnRiIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ub19zaW1wbGUgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgb29lX0RNU08sIG9vZV9kVEFHKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEob29lX0RNU08pLCAhaXMubmEob29lX2RUQUcpKVxuXG5cbiMjIyBQMS4gVVQgdnMgQUlEXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJG9vZV9ETVNPLCBzY29yZS50YiRvb2VfZFRBRywgbiA9IDIwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxucDEgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IG9vZV9ETVNPLCB5ID0gb29lX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICAgIHhsaW0oLTAuNSwgNSkgKyB5bGltKC0wLjUsIDUpICtcblxuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
commonLoopDir <- here(\../data/loop_analysis\)

diffCutoff <- 0.2

data <- fread(here(commonLoopDir, \loopScore_chromosight.tsv\))

score.tb <- data %>% dplyr::filter(Anno_simple %in% c(\P-P\, \P-E\, \E-E\)) %>%
  dplyr::select(id, ooe_DMSO, ooe_dTAG) %>%
  dplyr::filter(!is.na(ooe_DMSO), !is.na(ooe_dTAG))


### P1. UT vs AID
score.tb$density <- get_density(score.tb$ooe_DMSO, score.tb$ooe_dTAG, n = 200)
score.tb <- score.tb %>% dplyr::arrange(density)
p1 <- ggplot(score.tb, aes(x = ooe_DMSO, y = ooe_dTAG, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  coord_fixed() +
    xlim(-0.5, 5) + ylim(-0.5, 5) +

  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVkyOXRiVzl1VEc5dmNFUnBjaUE4TFNCb1pYSmxLRnhjTGk0dlpHRjBZUzlzYjI5d1gyRnVZV3g1YzJselhGd3BYRzVjYm1ScFptWkRkWFJ2Wm1ZZ1BDMGdNQzR5WEc1Y2JtUmhkR0VnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjF0YjI1TWIyOXdSR2x5TENCY1hHeHZiM0JUWTI5eVpWOWphSEp2Ylc5emFXZG9kQzUwYzNaY1hDa3BYRzVjYm5OamIzSmxMblJpSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvUVc1dWIxOXphVzF3YkdVZ0pXbHVKU0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndzSUZ4Y1JTMUZYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaHBaQ3dnYjI5bFgwUk5VMDhzSUc5dlpWOWtWRUZIS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpZ2hhWE11Ym1Fb2IyOWxYMFJOVTA4cExDQWhhWE11Ym1Fb2IyOWxYMlJVUVVjcEtWeHVYRzVjYmlNakl5QlFNUzRnVlZRZ2RuTWdRVWxFWEc1elkyOXlaUzUwWWlSa1pXNXphWFI1SUR3dElHZGxkRjlrWlc1emFYUjVLSE5qYjNKbExuUmlKRzl2WlY5RVRWTlBMQ0J6WTI5eVpTNTBZaVJ2YjJWZlpGUkJSeXdnYmlBOUlESXdNQ2xjYm5OamIzSmxMblJpSUR3dElITmpiM0psTG5SaUlDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaVzV6YVhSNUtWeHVjREVnUEMwZ1oyZHdiRzkwS0hOamIzSmxMblJpTENCaFpYTW9lQ0E5SUc5dlpWOUVUVk5QTENCNUlEMGdiMjlsWDJSVVFVY3NJR052Ykc5eUlEMGdaR1Z1YzJsMGVTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWEc0Z0lITmpZV3hsWDJOdmJHOXlYM1pwY21sa2FYTW9LU0FyWEc0Z0lHTnZiM0prWDJacGVHVmtLQ2tnSzF4dUlDQWdJSGhzYVcwb0xUQXVOU3dnTlNrZ0t5QjViR2x0S0Mwd0xqVXNJRFVwSUN0Y2JseHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJREFzSUdOdmJDQTlJRnhjWjNKbGVUVXdYRndzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SUMxa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY1hHZHlaWGxjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1J2ZEhSbFpGeGNLU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2dZMjlzSUQwZ1hGeG5jbVY1WEZ3c0lHeHBibVYwZVhCbElEMGdYRnhrYjNSMFpXUmNYQ2tnSzF4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5Qm5aM1JwZEd4bEtIQmhjM1JsTUNoY1hFTnZibk5sYm5OMWN5QnNiMjl3SUhOamIzSmxYRndwS1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbmNvbW1vbkxvb3BEaXIgPC0gaGVyZShcXC4uL2RhdGEvbG9vcF9hbmFseXNpc1xcKVxuXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgXFxsb29wU2NvcmVfY2hyb21vc2lnaHQudHN2XFwpKVxuXG5zY29yZS50YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIG9vZV9ETVNPLCBvb2VfZFRBRykgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKG9vZV9ETVNPKSwgIWlzLm5hKG9vZV9kVEFHKSlcblxuXG4jIyMgUDEuIFVUIHZzIEFJRFxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRvb2VfRE1TTywgc2NvcmUudGIkb29lX2RUQUcsIG4gPSAyMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbnAxIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBvb2VfRE1TTywgeSA9IG9vZV9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgICB4bGltKC0wLjUsIDUpICsgeWxpbSgtMC41LCA1KSArXG5cbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSlcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuY29tbW9uTG9vcERpciA8LSBoZXJlKFxcLi4vZGF0YS9sb29wX2FuYWx5c2lzXFwpXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5cbmRhdGEgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCBcXGxvb3BTY29yZV9jaHJvbW9zaWdodC50c3ZcXCkpXG5cbnNjb3JlLnRiIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ub19zaW1wbGUgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgb29lX0RNU08sIG9vZV9kVEFHKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEob29lX0RNU08pLCAhaXMubmEob29lX2RUQUcpKVxuXG5cbiMjIyBQMS4gVVQgdnMgQUlEXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJG9vZV9ETVNPLCBzY29yZS50YiRvb2VfZFRBRywgbiA9IDIwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxucDEgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IG9vZV9ETVNPLCB5ID0gb29lX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICAgIHhsaW0oLTAuNSwgNSkgKyB5bGltKC0wLjUsIDUpICtcblxuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKVxuYGBgXG5gYGAifQ== -->

```r
```r
commonLoopDir <- here(\../data/loop_analysis\)

diffCutoff <- 0.2

data <- fread(here(commonLoopDir, \loopScore_chromosight.tsv\))

score.tb <- data %>% dplyr::filter(Anno_simple %in% c(\P-P\, \P-E\, \E-E\)) %>%
  dplyr::select(id, ooe_DMSO, ooe_dTAG) %>%
  dplyr::filter(!is.na(ooe_DMSO), !is.na(ooe_dTAG))


### P1. UT vs AID
score.tb$density <- get_density(score.tb$ooe_DMSO, score.tb$ooe_dTAG, n = 200)
score.tb <- score.tb %>% dplyr::arrange(density)
p1 <- ggplot(score.tb, aes(x = ooe_DMSO, y = ooe_dTAG, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  coord_fixed() +
    xlim(-0.5, 5) + ylim(-0.5, 5) +

  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\))
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

--------------------------------------------------------------------------------
# ARCHIVE


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHViR2xpY21GeWVTaGtjR3g1Y2lsY2JteHBZbkpoY25rb1oyZHdiRzkwTWlsY2JteHBZbkpoY25rb2RtbHlhV1JwY3lsY2JteHBZbkpoY25rb2NIVnljbklwWEc1Y2JpTWdlVzkxY2lCa1pXNXphWFI1SUdadVhHNW5aWFJmWkdWdWMybDBlU0E4TFNCbWRXNWpkR2x2YmloNExDQjVMQ0J1SUQwZ01UQXdLU0I3WEc0Z0lDTWc0b0NtSUhkb1lYUmxkbVZ5SUhsdmRTQmhiSEpsWVdSNUlHaGhkbVVnNG9DbVhHNTlYRzVjYmlNZ01Ta2diV0ZyWlNCaElHZGxibVZ5WVd3Z2NHeHZkSFJwYm1jZ1puVnVZM1JwYjI1Y2JuQnNiM1JmWTI5dGNHRnlaU0E4TFNCbWRXNWpkR2x2Ymloa1ppd2dlRjlqYjJ3c0lIbGZZMjlzTENCa2FXWm1RM1YwYjJabUlEMGdNQzR4TENCc2FXMGdQU0JqS0Mwd0xqVXNJREVwS1NCN1hHNGdJR1JtTWlBOExTQmtaaUFsUGlWY2JpQWdJQ0J6Wld4bFkzUW9ZV3hzWDI5bUtHTW9lRjlqYjJ3c0lIbGZZMjlzS1NrcElDVStKVnh1SUNBZ0lISmxibUZ0WlNoNElEMGdJU0Z6ZVcwb2VGOWpiMndwTENCNUlEMGdJU0Z6ZVcwb2VWOWpiMndwS1NBbFBpVmNiaUFnSUNCdGRYUmhkR1VvWkdWdWMybDBlU0E5SUdkbGRGOWtaVzV6YVhSNUtIZ3NJSGtzSUc0Z1BTQXhNREFwS1NBbFBpVmNiaUFnSUNCaGNuSmhibWRsS0dSbGJuTnBkSGtwWEc1Y2JpQWdaMmR3Ykc5MEtHUm1NaXdnWVdWektIZ2dQU0I0TENCNUlEMGdlU3dnWTI5c2IzSWdQU0JrWlc1emFYUjVLU2tnSzF4dUlDQWdJR2RsYjIxZmNHOXBiblFvS1NBclhHNGdJQ0FnYzJOaGJHVmZZMjlzYjNKZmRtbHlhV1JwY3lncElDdGNiaUFnSUNCNGJHbHRLR3hwYlNrZ0t5QjViR2x0S0d4cGJTa2dLMXh1SUNBZ0lHTnZiM0prWDJacGVHVmtLQ2tnSzF4dUlDQWdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdNQ3dnWTI5c2IzSWdQU0JjSW1keVpYazFNRndpTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlBZ0lDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQWdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ3aVozSmxlVndpS1NBclhHNGdJQ0FnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0F0WkdsbVprTjFkRzltWml3Z1kyOXNiM0lnUFNCY0ltZHlaWGxjSWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJ2ZEhSbFpGd2lLU0FyWEc0Z0lDQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQWdaR2xtWmtOMWRHOW1aaXdnWTI5c2IzSWdQU0JjSW1keVpYbGNJaXdnYkdsdVpYUjVjR1VnUFNCY0ltUnZkSFJsWkZ3aUtTQXJYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdJQ0JuWjNScGRHeGxLSEJoYzNSbEtIaGZZMjlzTENCY0luWnpYQ0lzSUhsZlkyOXNLU2xjYm4xY2JseHVJeUF5S1NCa1pXWnBibVVnZEdobElIQmhhWEp6SUhsdmRTQmpZWEpsSUdGaWIzVjBYRzV3WVdseWN5QThMU0JzYVhOMEtGeHVJQ0JFVFZOUFgzWnpYMlJVUVVjZ1BTQmpLRndpYzJOdmNtVmZSRTFUVDF3aUxDQmNJbk5qYjNKbFgyUlVRVWRjSWlrc1hHNGdJRlZVWDNaelgwRkpSQ0FnSUNBZ1BTQmpLRndpYzJOdmNtVmZWVlJjSWl3Z0lDQmNJbk5qYjNKbFgwRkpSRndpS1Z4dUlDQWpJT0tBcGlCaFpHUWdiVzl5WlNEaWdLWmNiaWxjYmx4dUl5QXpLU0JpZFdsc1pDQmhJRzVoYldWa0lHeHBjM1FnYjJZZ1oyZHdiRzkwYzF4dWNHeHZkSE1nUEMwZ2JXRndLSEJoYVhKekxDQitJSEJzYjNSZlkyOXRjR0Z5WlNoa1lYUmhMQ0F1ZUZzeFhTd2dMbmhiTWwwc0lHUnBabVpEZFhSdlptWWdQU0JrYVdabVEzVjBiMlptS1NsY2JseHVJeUJ1YjNjZ2VXOTFJR05oYmlCd2NtbHVkQ0IwYUdWdElHRnNiRHBjYm5kaGJHc29jR3h2ZEhNc0lIQnlhVzUwS1Z4dUl5QnZjaUJoY25KaGJtZGxJSFJvWlcwZ2QybDBhQ0J3WVhSamFIZHZjbXNnTHlCbmNtbGtSWGgwY21Fc0lHVjBZeTVjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmxpYnJhcnkoZHBseXIpXG5saWJyYXJ5KGdncGxvdDIpXG5saWJyYXJ5KHZpcmlkaXMpXG5saWJyYXJ5KHB1cnJyKVxuXG4jIHlvdXIgZGVuc2l0eSBmblxuZ2V0X2RlbnNpdHkgPC0gZnVuY3Rpb24oeCwgeSwgbiA9IDEwMCkge1xuICAjIOKApiB3aGF0ZXZlciB5b3UgYWxyZWFkeSBoYXZlIOKAplxufVxuXG4jIDEpIG1ha2UgYSBnZW5lcmFsIHBsb3R0aW5nIGZ1bmN0aW9uXG5wbG90X2NvbXBhcmUgPC0gZnVuY3Rpb24oZGYsIHhfY29sLCB5X2NvbCwgZGlmZkN1dG9mZiA9IDAuMSwgbGltID0gYygtMC41LCAxKSkge1xuICBkZjIgPC0gZGYgJT4lXG4gICAgc2VsZWN0KGFsbF9vZihjKHhfY29sLCB5X2NvbCkpKSAlPiVcbiAgICByZW5hbWUoeCA9ICEhc3ltKHhfY29sKSwgeSA9ICEhc3ltKHlfY29sKSkgJT4lXG4gICAgbXV0YXRlKGRlbnNpdHkgPSBnZXRfZGVuc2l0eSh4LCB5LCBuID0gMTAwKSkgJT4lXG4gICAgYXJyYW5nZShkZW5zaXR5KVxuXG4gIGdncGxvdChkZjIsIGFlcyh4ID0geCwgeSA9IHksIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgICBnZW9tX3BvaW50KCkgK1xuICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gICAgeGxpbShsaW0pICsgeWxpbShsaW0pICtcbiAgICBjb29yZF9maXhlZCgpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbG9yID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbG9yID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gIGRpZmZDdXRvZmYsIGNvbG9yID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgZ2d0aXRsZShwYXN0ZSh4X2NvbCwgXFx2c1xcLCB5X2NvbCkpXG59XG5cbiMgMikgZGVmaW5lIHRoZSBwYWlycyB5b3UgY2FyZSBhYm91dFxucGFpcnMgPC0gbGlzdChcbiAgRE1TT192c19kVEFHID0gYyhcXHNjb3JlX0RNU09cXCwgXFxzY29yZV9kVEFHXFwpLFxuICBVVF92c19BSUQgICAgID0gYyhcXHNjb3JlX1VUXFwsICAgXFxzY29yZV9BSURcXClcbiAgIyDigKYgYWRkIG1vcmUg4oCmXG4pXG5cbiMgMykgYnVpbGQgYSBuYW1lZCBsaXN0IG9mIGdncGxvdHNcbnBsb3RzIDwtIG1hcChwYWlycywgfiBwbG90X2NvbXBhcmUoZGF0YSwgLnhbMV0sIC54WzJdLCBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZikpXG5cbiMgbm93IHlvdSBjYW4gcHJpbnQgdGhlbSBhbGw6XG53YWxrKHBsb3RzLCBwcmludClcbiMgb3IgYXJyYW5nZSB0aGVtIHdpdGggcGF0Y2h3b3JrIC8gZ3JpZEV4dHJhLCBldGMuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
library(dplyr)
library(ggplot2)
library(viridis)
library(purrr)

# your density fn
get_density <- function(x, y, n = 100) {
  # … whatever you already have …
}

# 1) make a general plotting function
plot_compare <- function(df, x_col, y_col, diffCutoff = 0.1, lim = c(-0.5, 1)) {
  df2 <- df %>%
    select(all_of(c(x_col, y_col))) %>%
    rename(x = !!sym(x_col), y = !!sym(y_col)) %>%
    mutate(density = get_density(x, y, n = 100)) %>%
    arrange(density)

  ggplot(df2, aes(x = x, y = y, color = density)) +
    geom_point() +
    scale_color_viridis() +
    xlim(lim) + ylim(lim) +
    coord_fixed() +
    geom_abline(slope = 1, intercept = 0, color = \grey50\, linetype = \dashed\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
    geom_abline(slope = 1, intercept = -diffCutoff, color = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept =  diffCutoff, color = \grey\, linetype = \dotted\) +
    theme_classic() +
    ggtitle(paste(x_col, \vs\, y_col))
}

# 2) define the pairs you care about
pairs <- list(
  DMSO_vs_dTAG = c(\score_DMSO\, \score_dTAG\),
  UT_vs_AID     = c(\score_UT\,   \score_AID\)
  # … add more …
)

# 3) build a named list of ggplots
plots <- map(pairs, ~ plot_compare(data, .x[1], .x[2], diffCutoff = diffCutoff))

# now you can print them all:
walk(plots, print)
# or arrange them with patchwork / gridExtra, etc.



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJHbGljbUZ5ZVNoa2NHeDVjaWxjYm14cFluSmhjbmtvWjJkd2JHOTBNaWxjYm14cFluSmhjbmtvZG1seWFXUnBjeWxjYm14cFluSmhjbmtvY0hWeWNuSXBYRzVjYmlNZ2VXOTFjaUJrWlc1emFYUjVJR1p1WEc1blpYUmZaR1Z1YzJsMGVTQThMU0JtZFc1amRHbHZiaWg0TENCNUxDQnVJRDBnTVRBd0tTQjdYRzRnSUNNZzRvQ21JSGRvWVhSbGRtVnlJSGx2ZFNCaGJISmxZV1I1SUdoaGRtVWc0b0NtWEc1OVhHNWNiaU1nTVNrZ2JXRnJaU0JoSUdkbGJtVnlZV3dnY0d4dmRIUnBibWNnWm5WdVkzUnBiMjVjYm5Cc2IzUmZZMjl0Y0dGeVpTQThMU0JtZFc1amRHbHZiaWhrWml3Z2VGOWpiMndzSUhsZlkyOXNMQ0JrYVdabVEzVjBiMlptSUQwZ01DNHhMQ0JzYVcwZ1BTQmpLQzB3TGpVc0lERXBLU0I3WEc0Z0lHUm1NaUE4TFNCa1ppQWxQaVZjYmlBZ0lDQnpaV3hsWTNRb1lXeHNYMjltS0dNb2VGOWpiMndzSUhsZlkyOXNLU2twSUNVK0pWeHVJQ0FnSUhKbGJtRnRaU2g0SUQwZ0lTRnplVzBvZUY5amIyd3BMQ0I1SUQwZ0lTRnplVzBvZVY5amIyd3BLU0FsUGlWY2JpQWdJQ0J0ZFhSaGRHVW9aR1Z1YzJsMGVTQTlJR2RsZEY5a1pXNXphWFI1S0hnc0lIa3NJRzRnUFNBeE1EQXBLU0FsUGlWY2JpQWdJQ0JoY25KaGJtZGxLR1JsYm5OcGRIa3BYRzVjYmlBZ1oyZHdiRzkwS0dSbU1pd2dZV1Z6S0hnZ1BTQjRMQ0I1SUQwZ2VTd2dZMjlzYjNJZ1BTQmtaVzV6YVhSNUtTa2dLMXh1SUNBZ0lHZGxiMjFmY0c5cGJuUW9LU0FyWEc0Z0lDQWdjMk5oYkdWZlkyOXNiM0pmZG1seWFXUnBjeWdwSUN0Y2JpQWdJQ0I0YkdsdEtHeHBiU2tnS3lCNWJHbHRLR3hwYlNrZ0sxeHVJQ0FnSUdOdmIzSmtYMlpwZUdWa0tDa2dLMXh1SUNBZ0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ01Dd2dZMjlzYjNJZ1BTQmNYR2R5WlhrMU1GeGNMQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaUFnSUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNBZ0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRnhjWjNKbGVWeGNLU0FyWEc0Z0lDQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXRaR2xtWmtOMWRHOW1aaXdnWTI5c2IzSWdQU0JjWEdkeVpYbGNYQ3dnYkdsdVpYUjVjR1VnUFNCY1hHUnZkSFJsWkZ4Y0tTQXJYRzRnSUNBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBZ1pHbG1aa04xZEc5bVppd2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDd2diR2x1WlhSNWNHVWdQU0JjWEdSdmRIUmxaRnhjS1NBclhHNGdJQ0FnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3RjYmlBZ0lDQm5aM1JwZEd4bEtIQmhjM1JsS0hoZlkyOXNMQ0JjWEhaelhGd3NJSGxmWTI5c0tTbGNibjFjYmx4dUl5QXlLU0JrWldacGJtVWdkR2hsSUhCaGFYSnpJSGx2ZFNCallYSmxJR0ZpYjNWMFhHNXdZV2x5Y3lBOExTQnNhWE4wS0Z4dUlDQkVUVk5QWDNaelgyUlVRVWNnUFNCaktGeGNjMk52Y21WZlJFMVRUMXhjTENCY1hITmpiM0psWDJSVVFVZGNYQ2tzWEc0Z0lGVlVYM1p6WDBGSlJDQWdJQ0FnUFNCaktGeGNjMk52Y21WZlZWUmNYQ3dnSUNCY1hITmpiM0psWDBGSlJGeGNLVnh1SUNBaklPS0FwaUJoWkdRZ2JXOXlaU0RpZ0taY2JpbGNibHh1SXlBektTQmlkV2xzWkNCaElHNWhiV1ZrSUd4cGMzUWdiMllnWjJkd2JHOTBjMXh1Y0d4dmRITWdQQzBnYldGd0tIQmhhWEp6TENCK0lIQnNiM1JmWTI5dGNHRnlaU2hrWVhSaExDQXVlRnN4WFN3Z0xuaGJNbDBzSUdScFptWkRkWFJ2Wm1ZZ1BTQmthV1ptUTNWMGIyWm1LU2xjYmx4dUl5QnViM2NnZVc5MUlHTmhiaUJ3Y21sdWRDQjBhR1Z0SUdGc2JEcGNibmRoYkdzb2NHeHZkSE1zSUhCeWFXNTBLVnh1SXlCdmNpQmhjbkpoYm1kbElIUm9aVzBnZDJsMGFDQndZWFJqYUhkdmNtc2dMeUJuY21sa1JYaDBjbUVzSUdWMFl5NWNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5saWJyYXJ5KGRwbHlyKVxubGlicmFyeShnZ3Bsb3QyKVxubGlicmFyeSh2aXJpZGlzKVxubGlicmFyeShwdXJycilcblxuIyB5b3VyIGRlbnNpdHkgZm5cbmdldF9kZW5zaXR5IDwtIGZ1bmN0aW9uKHgsIHksIG4gPSAxMDApIHtcbiAgIyDigKYgd2hhdGV2ZXIgeW91IGFscmVhZHkgaGF2ZSDigKZcbn1cblxuIyAxKSBtYWtlIGEgZ2VuZXJhbCBwbG90dGluZyBmdW5jdGlvblxucGxvdF9jb21wYXJlIDwtIGZ1bmN0aW9uKGRmLCB4X2NvbCwgeV9jb2wsIGRpZmZDdXRvZmYgPSAwLjEsIGxpbSA9IGMoLTAuNSwgMSkpIHtcbiAgZGYyIDwtIGRmICU+JVxuICAgIHNlbGVjdChhbGxfb2YoYyh4X2NvbCwgeV9jb2wpKSkgJT4lXG4gICAgcmVuYW1lKHggPSAhIXN5bSh4X2NvbCksIHkgPSAhIXN5bSh5X2NvbCkpICU+JVxuICAgIG11dGF0ZShkZW5zaXR5ID0gZ2V0X2RlbnNpdHkoeCwgeSwgbiA9IDEwMCkpICU+JVxuICAgIGFycmFuZ2UoZGVuc2l0eSlcblxuICBnZ3Bsb3QoZGYyLCBhZXMoeCA9IHgsIHkgPSB5LCBjb2xvciA9IGRlbnNpdHkpKSArXG4gICAgZ2VvbV9wb2ludCgpICtcbiAgICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICAgIHhsaW0obGltKSArIHlsaW0obGltKSArXG4gICAgY29vcmRfZml4ZWQoKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2xvciA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2xvciA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9ICBkaWZmQ3V0b2ZmLCBjb2xvciA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIGdndGl0bGUocGFzdGUoeF9jb2wsIFxcdnNcXCwgeV9jb2wpKVxufVxuXG4jIDIpIGRlZmluZSB0aGUgcGFpcnMgeW91IGNhcmUgYWJvdXRcbnBhaXJzIDwtIGxpc3QoXG4gIERNU09fdnNfZFRBRyA9IGMoXFxzY29yZV9ETVNPXFwsIFxcc2NvcmVfZFRBR1xcKSxcbiAgVVRfdnNfQUlEICAgICA9IGMoXFxzY29yZV9VVFxcLCAgIFxcc2NvcmVfQUlEXFwpXG4gICMg4oCmIGFkZCBtb3JlIOKAplxuKVxuXG4jIDMpIGJ1aWxkIGEgbmFtZWQgbGlzdCBvZiBnZ3Bsb3RzXG5wbG90cyA8LSBtYXAocGFpcnMsIH4gcGxvdF9jb21wYXJlKGRhdGEsIC54WzFdLCAueFsyXSwgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYpKVxuXG4jIG5vdyB5b3UgY2FuIHByaW50IHRoZW0gYWxsOlxud2FsayhwbG90cywgcHJpbnQpXG4jIG9yIGFycmFuZ2UgdGhlbSB3aXRoIHBhdGNod29yayAvIGdyaWRFeHRyYSwgZXRjLlxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubGlicmFyeShkcGx5cilcbmxpYnJhcnkoZ2dwbG90MilcbmxpYnJhcnkodmlyaWRpcylcbmxpYnJhcnkocHVycnIpXG5cbiMgeW91ciBkZW5zaXR5IGZuXG5nZXRfZGVuc2l0eSA8LSBmdW5jdGlvbih4LCB5LCBuID0gMTAwKSB7XG4gICMg4oCmIHdoYXRldmVyIHlvdSBhbHJlYWR5IGhhdmUg4oCmXG59XG5cbiMgMSkgbWFrZSBhIGdlbmVyYWwgcGxvdHRpbmcgZnVuY3Rpb25cbnBsb3RfY29tcGFyZSA8LSBmdW5jdGlvbihkZiwgeF9jb2wsIHlfY29sLCBkaWZmQ3V0b2ZmID0gMC4xLCBsaW0gPSBjKC0wLjUsIDEpKSB7XG4gIGRmMiA8LSBkZiAlPiVcbiAgICBzZWxlY3QoYWxsX29mKGMoeF9jb2wsIHlfY29sKSkpICU+JVxuICAgIHJlbmFtZSh4ID0gISFzeW0oeF9jb2wpLCB5ID0gISFzeW0oeV9jb2wpKSAlPiVcbiAgICBtdXRhdGUoZGVuc2l0eSA9IGdldF9kZW5zaXR5KHgsIHksIG4gPSAxMDApKSAlPiVcbiAgICBhcnJhbmdlKGRlbnNpdHkpXG5cbiAgZ2dwbG90KGRmMiwgYWVzKHggPSB4LCB5ID0geSwgY29sb3IgPSBkZW5zaXR5KSkgK1xuICAgIGdlb21fcG9pbnQoKSArXG4gICAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgICB4bGltKGxpbSkgKyB5bGltKGxpbSkgK1xuICAgIGNvb3JkX2ZpeGVkKCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sb3IgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sb3IgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAgZGlmZkN1dG9mZiwgY29sb3IgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICBnZ3RpdGxlKHBhc3RlKHhfY29sLCBcXHZzXFwsIHlfY29sKSlcbn1cblxuIyAyKSBkZWZpbmUgdGhlIHBhaXJzIHlvdSBjYXJlIGFib3V0XG5wYWlycyA8LSBsaXN0KFxuICBETVNPX3ZzX2RUQUcgPSBjKFxcc2NvcmVfRE1TT1xcLCBcXHNjb3JlX2RUQUdcXCksXG4gIFVUX3ZzX0FJRCAgICAgPSBjKFxcc2NvcmVfVVRcXCwgICBcXHNjb3JlX0FJRFxcKVxuICAjIOKApiBhZGQgbW9yZSDigKZcbilcblxuIyAzKSBidWlsZCBhIG5hbWVkIGxpc3Qgb2YgZ2dwbG90c1xucGxvdHMgPC0gbWFwKHBhaXJzLCB+IHBsb3RfY29tcGFyZShkYXRhLCAueFsxXSwgLnhbMl0sIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmKSlcblxuIyBub3cgeW91IGNhbiBwcmludCB0aGVtIGFsbDpcbndhbGsocGxvdHMsIHByaW50KVxuIyBvciBhcnJhbmdlIHRoZW0gd2l0aCBwYXRjaHdvcmsgLyBncmlkRXh0cmEsIGV0Yy5cbmBgYFxuYGBgIn0= -->

```r
```r
library(dplyr)
library(ggplot2)
library(viridis)
library(purrr)

# your density fn
get_density <- function(x, y, n = 100) {
  # … whatever you already have …
}

# 1) make a general plotting function
plot_compare <- function(df, x_col, y_col, diffCutoff = 0.1, lim = c(-0.5, 1)) {
  df2 <- df %>%
    select(all_of(c(x_col, y_col))) %>%
    rename(x = !!sym(x_col), y = !!sym(y_col)) %>%
    mutate(density = get_density(x, y, n = 100)) %>%
    arrange(density)

  ggplot(df2, aes(x = x, y = y, color = density)) +
    geom_point() +
    scale_color_viridis() +
    xlim(lim) + ylim(lim) +
    coord_fixed() +
    geom_abline(slope = 1, intercept = 0, color = \grey50\, linetype = \dashed\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
    geom_abline(slope = 1, intercept = -diffCutoff, color = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept =  diffCutoff, color = \grey\, linetype = \dotted\) +
    theme_classic() +
    ggtitle(paste(x_col, \vs\, y_col))
}

# 2) define the pairs you care about
pairs <- list(
  DMSO_vs_dTAG = c(\score_DMSO\, \score_dTAG\),
  UT_vs_AID     = c(\score_UT\,   \score_AID\)
  # … add more …
)

# 3) build a named list of ggplots
plots <- map(pairs, ~ plot_compare(data, .x[1], .x[2], diffCutoff = diffCutoff))

# now you can print them all:
walk(plots, print)
# or arrange them with patchwork / gridExtra, etc.
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjMkZ0Y0d4bElEd3RJRndpUnpFdVJFMVRUeTVOWlhKblpXUmNJbHh1Wm05eUtITmhiWEJzWlNCcGJpQmpLRndpUnpFdVJFMVRUeTVOWlhKblpXUmNJaXdnWENKSE1TNWtWRUZITGsxbGNtZGxaRndpTENCY0lrY3hMa0UwT0RVdVRXVnlaMlZrWENJcEtYdGNiaUFnZEdWdGNDNHlOV3RpSUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvWENKc2IyOXdVMk52Y21WZlhDSXNJSE5oYlhCc1pTd2dYQ0pmTWpWcllpNTBjM1pjSWlrcEtTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0dKcGJsTnBlbVVnUFNCbGJtUXhJQzBnYzNSaGNuUXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdRZ1BTQndZWE4wWlNoamFISnZiVEVzSUdKcGJsTnBlbVVzSUhOMFlYSjBNU3dnYzNSaGNuUXlMQ0J6WlhBZ1BTQmNJbDljSWlrcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwbWFXeDBaWElvYVdRZ0pXbHVKU0JzYjI5d2N5UnBaQ2tnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbk5sYkdWamRDaGphSEp2YlRFc0lITjBZWEowTVN3Z1pXNWtNU3dnWTJoeWIyMHlMQ0J6ZEdGeWRESXNJR1Z1WkRJc0lHbGtMQ0J2WW5ObGNuWmxaQ3dnWENKUEwwVmNJaWxjYmlBZ1kyOXNibUZ0WlhNb2RHVnRjQzR5Tld0aUtTQThMU0JqS0Z3aVkyaHliMjB4WENJc0lGd2ljM1JoY25ReFhDSXNJRndpWlc1a01Wd2lMQ0JjSW1Ob2NtOXRNbHdpTENCY0luTjBZWEowTWx3aUxDQmNJbVZ1WkRKY0lpd2dYQ0pwWkZ3aUxDQmNJbTlpYzF3aUxDQmNJbTlpYzJWNGNGd2lLVnh1SUNCY2JpQWdkR1Z0Y0M0eE1HdGlJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9YQ0pzYjI5d1UyTnZjbVZmWENJc0lITmhiWEJzWlN3Z1hDSmZNVEJyWWk1MGMzWmNJaWtwS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82YlhWMFlYUmxLR0pwYmxOcGVtVWdQU0JsYm1ReElDMGdjM1JoY25ReExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1FnUFNCd1lYTjBaU2hqYUhKdmJURXNJR0pwYmxOcGVtVXNJSE4wWVhKME1Td2djM1JoY25ReUxDQnpaWEFnUFNCY0lsOWNJaWtwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanBtYVd4MFpYSW9hV1FnSldsdUpTQnNiMjl3Y3lScFpDa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9uTmxiR1ZqZENoamFISnZiVEVzSUhOMFlYSjBNU3dnWlc1a01Td2dZMmh5YjIweUxDQnpkR0Z5ZERJc0lHVnVaRElzSUdsa0xDQnZZbk5sY25abFpDd2dYQ0pQTDBWY0lpbGNiaUFnWTI5c2JtRnRaWE1vZEdWdGNDNHhNR3RpS1NBOExTQmpLRndpWTJoeWIyMHhYQ0lzSUZ3aWMzUmhjblF4WENJc0lGd2laVzVrTVZ3aUxDQmNJbU5vY205dE1sd2lMQ0JjSW5OMFlYSjBNbHdpTENCY0ltVnVaREpjSWl3Z1hDSnBaRndpTENCY0ltOWljMXdpTENCY0ltOWljMlY0Y0Z3aUtWeHVJQ0JjYmlBZ2RHVnRjQzQxYTJJZ1BDMW1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0Z3aWJHOXZjRk5qYjNKbFgxd2lMQ0J6WVcxd2JHVXNJRndpWHpWcllpNTBjM1pjSWlrcEtTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0dKcGJsTnBlbVVnUFNCbGJtUXhJQzBnYzNSaGNuUXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdRZ1BTQndZWE4wWlNoamFISnZiVEVzSUdKcGJsTnBlbVVzSUhOMFlYSjBNU3dnYzNSaGNuUXlMQ0J6WlhBZ1BTQmNJbDljSWlrcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwbWFXeDBaWElvYVdRZ0pXbHVKU0JzYjI5d2N5UnBaQ2tnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbk5sYkdWamRDaGphSEp2YlRFc0lITjBZWEowTVN3Z1pXNWtNU3dnWTJoeWIyMHlMQ0J6ZEdGeWRESXNJR1Z1WkRJc0lHbGtMQ0J2WW5ObGNuWmxaQ3dnWENKUEwwVmNJaWxjYmlBZ1kyOXNibUZ0WlhNb2RHVnRjQzQxYTJJcElEd3RJR01vWENKamFISnZiVEZjSWl3Z1hDSnpkR0Z5ZERGY0lpd2dYQ0psYm1ReFhDSXNJRndpWTJoeWIyMHlYQ0lzSUZ3aWMzUmhjblF5WENJc0lGd2laVzVrTWx3aUxDQmNJbWxrWENJc0lGd2liMkp6WENJc0lGd2liMkp6Wlhod1hDSXBYRzRnSUZ4dUlDQjBaVzF3SUR3dElHSnBibVJmY205M2N5aDBaVzF3TGpJMWEySXNJSFJsYlhBdU1UQnJZaXdnZEdWdGNDNDFhMklwWEc0Z0lHWjNjbWwwWlNoMFpXMXdMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRndpYkc5dmNGTmpiM0psWDF3aUxDQnpZVzF3YkdVc0lGd2lMblJ6ZGx3aUtTa3NJSE5sY0NBOUlGd2lYRngwWENJcFhHNTlYRzVjYmx4dWRHVnRjQzVFVFZOUElEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNJbXh2YjNCVFkyOXlaVjlITVM1RVRWTlBMazFsY21kbFpDNTBjM1pjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR2xrTENCdlluTXNJRzlpYzJWNGNDbGNibU52Ykc1aGJXVnpLSFJsYlhBdVJFMVRUeWtnUEMwZ1l5aGNJbWxrWENJc0lGd2liMkp6WDBSTlUwOWNJaXdnWENKdlluTmxlSEJmUkUxVFQxd2lLVnh1ZEdWdGNDNWtWRUZISUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0lteHZiM0JUWTI5eVpWOUhNUzVrVkVGSExrMWxjbWRsWkM1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHbGtMQ0J2WW5Nc0lHOWljMlY0Y0NsY2JtTnZiRzVoYldWektIUmxiWEF1WkZSQlJ5a2dQQzBnWXloY0ltbGtYQ0lzSUZ3aWIySnpYMlJVUVVkY0lpd2dYQ0p2WW5ObGVIQmZaRlJCUjF3aUtWeHVkR1Z0Y0M1Qk5EZzFJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW14dmIzQlRZMjl5WlY5SE1TNUJORGcxTGsxbGNtZGxaQzUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dsa0xDQnZZbk1zSUc5aWMyVjRjQ2xjYm1OdmJHNWhiV1Z6S0hSbGJYQXVRVFE0TlNrZ1BDMGdZeWhjSW1sa1hDSXNJRndpYjJKelgwRTBPRFZjSWl3Z1hDSnZZbk5sZUhCZlFUUTROVndpS1Z4dVhHNXNiMjl3YzE5dlpTQThMU0JtZFd4c1gycHZhVzRvWm5Wc2JGOXFiMmx1S0hSbGJYQXVSRTFUVHl3Z2RHVnRjQzVrVkVGSExDQmllU0E5SUZ3aWFXUmNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ2RHVnRjQzVCTkRnMUxDQmllU0E5SUZ3aWFXUmNJaWtnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2IyVkdRMTlrVkVGSFgwUk5VMDhnUFNCcFpsOWxiSE5sS0c5aWMyVjRjRjlFVFZOUElEMDlJREFzSUU1QkxDQnZZbk5sZUhCZlpGUkJSeTl2WW5ObGVIQmZSRTFUVHlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IyVkdRMTlCTkRnMVgwUk5VMDhnUFNCcFpsOWxiSE5sS0c5aWMyVjRjRjlFVFZOUElEMDlJREFzSUU1QkxDQnZZbk5sZUhCZlFUUTROUzl2WW5ObGVIQmZSRTFUVHlrcFhHNWNibVozY21sMFpTaHNiMjl3YzE5dlpTd2dhR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaGNJbXh2YjNCVFkyOXlaVjlqYjI1elgyOWljMlY0Y0M1MGMzWmNJaWtwTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbnNhbXBsZSA8LSBcXEcxLkRNU08uTWVyZ2VkXFxcbmZvcihzYW1wbGUgaW4gYyhcXEcxLkRNU08uTWVyZ2VkXFwsIFxcRzEuZFRBRy5NZXJnZWRcXCwgXFxHMS5BNDg1Lk1lcmdlZFxcKSl7XG4gIHRlbXAuMjVrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcXzI1a2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuMjVrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAuMTBrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcXzEwa2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuMTBrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAuNWtiIDwtZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXF81a2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuNWtiKSA8LSBjKFxcY2hyb20xXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocm9tMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCwgXFxpZFxcLCBcXG9ic1xcLCBcXG9ic2V4cFxcKVxuICBcbiAgdGVtcCA8LSBiaW5kX3Jvd3ModGVtcC4yNWtiLCB0ZW1wLjEwa2IsIHRlbXAuNWtiKVxuICBmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXC50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxufVxuXG5cbnRlbXAuRE1TTyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxsb29wU2NvcmVfRzEuRE1TTy5NZXJnZWQudHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgb2JzLCBvYnNleHApXG5jb2xuYW1lcyh0ZW1wLkRNU08pIDwtIGMoXFxpZFxcLCBcXG9ic19ETVNPXFwsIFxcb2JzZXhwX0RNU09cXClcbnRlbXAuZFRBRyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxsb29wU2NvcmVfRzEuZFRBRy5NZXJnZWQudHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgb2JzLCBvYnNleHApXG5jb2xuYW1lcyh0ZW1wLmRUQUcpIDwtIGMoXFxpZFxcLCBcXG9ic19kVEFHXFwsIFxcb2JzZXhwX2RUQUdcXClcbnRlbXAuQTQ4NSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxsb29wU2NvcmVfRzEuQTQ4NS5NZXJnZWQudHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgb2JzLCBvYnNleHApXG5jb2xuYW1lcyh0ZW1wLkE0ODUpIDwtIGMoXFxpZFxcLCBcXG9ic19BNDg1XFwsIFxcb2JzZXhwX0E0ODVcXClcblxubG9vcHNfb2UgPC0gZnVsbF9qb2luKGZ1bGxfam9pbih0ZW1wLkRNU08sIHRlbXAuZFRBRywgYnkgPSBcXGlkXFwpLFxuICAgICAgICAgIHRlbXAuQTQ4NSwgYnkgPSBcXGlkXFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKG9lRkNfZFRBR19ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBOQSwgb2JzZXhwX2RUQUcvb2JzZXhwX0RNU08pLFxuICAgICAgICAgICAgICAgIG9lRkNfQTQ4NV9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBOQSwgb2JzZXhwX0E0ODUvb2JzZXhwX0RNU08pKVxuXG5md3JpdGUobG9vcHNfb2UsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
sample <- \G1.DMSO.Merged\
for(sample in c(\G1.DMSO.Merged\, \G1.dTAG.Merged\, \G1.A485.Merged\)){
  temp.25kb <- fread(here(consensusDir, paste0(\loopScore_\, sample, \_25kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.25kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp.10kb <- fread(here(consensusDir, paste0(\loopScore_\, sample, \_10kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.10kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp.5kb <-fread(here(consensusDir, paste0(\loopScore_\, sample, \_5kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.5kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp <- bind_rows(temp.25kb, temp.10kb, temp.5kb)
  fwrite(temp, here(consensusDir, paste0(\loopScore_\, sample, \.tsv\)), sep = \\t\)
}


temp.DMSO <- fread(here(consensusDir, \loopScore_G1.DMSO.Merged.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.DMSO) <- c(\id\, \obs_DMSO\, \obsexp_DMSO\)
temp.dTAG <- fread(here(consensusDir, \loopScore_G1.dTAG.Merged.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.dTAG) <- c(\id\, \obs_dTAG\, \obsexp_dTAG\)
temp.A485 <- fread(here(consensusDir, \loopScore_G1.A485.Merged.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.A485) <- c(\id\, \obs_A485\, \obsexp_A485\)

loops_oe <- full_join(full_join(temp.DMSO, temp.dTAG, by = \id\),
          temp.A485, by = \id\) %>%
  dplyr::mutate(oeFC_dTAG_DMSO = if_else(obsexp_DMSO == 0, NA, obsexp_dTAG/obsexp_DMSO),
                oeFC_A485_DMSO = if_else(obsexp_DMSO == 0, NA, obsexp_A485/obsexp_DMSO))

fwrite(loops_oe, here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\)), sep = \\t\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWMyRnRjR3hsSUR3dElGeGNSekV1UkUxVFR5NU5aWEpuWldSY1hGeHVabTl5S0hOaGJYQnNaU0JwYmlCaktGeGNSekV1UkUxVFR5NU5aWEpuWldSY1hDd2dYRnhITVM1a1ZFRkhMazFsY21kbFpGeGNMQ0JjWEVjeExrRTBPRFV1VFdWeVoyVmtYRndwS1h0Y2JpQWdkR1Z0Y0M0eU5XdGlJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9YRnhzYjI5d1UyTnZjbVZmWEZ3c0lITmhiWEJzWlN3Z1hGeGZNalZyWWk1MGMzWmNYQ2twS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82YlhWMFlYUmxLR0pwYmxOcGVtVWdQU0JsYm1ReElDMGdjM1JoY25ReExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1FnUFNCd1lYTjBaU2hqYUhKdmJURXNJR0pwYmxOcGVtVXNJSE4wWVhKME1Td2djM1JoY25ReUxDQnpaWEFnUFNCY1hGOWNYQ2twSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanBtYVd4MFpYSW9hV1FnSldsdUpTQnNiMjl3Y3lScFpDa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9uTmxiR1ZqZENoamFISnZiVEVzSUhOMFlYSjBNU3dnWlc1a01Td2dZMmh5YjIweUxDQnpkR0Z5ZERJc0lHVnVaRElzSUdsa0xDQnZZbk5sY25abFpDd2dYRnhQTDBWY1hDbGNiaUFnWTI5c2JtRnRaWE1vZEdWdGNDNHlOV3RpS1NBOExTQmpLRnhjWTJoeWIyMHhYRndzSUZ4Y2MzUmhjblF4WEZ3c0lGeGNaVzVrTVZ4Y0xDQmNYR05vY205dE1seGNMQ0JjWEhOMFlYSjBNbHhjTENCY1hHVnVaREpjWEN3Z1hGeHBaRnhjTENCY1hHOWljMXhjTENCY1hHOWljMlY0Y0Z4Y0tWeHVJQ0JjYmlBZ2RHVnRjQzR4TUd0aUlEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb1hGeHNiMjl3VTJOdmNtVmZYRndzSUhOaGJYQnNaU3dnWEZ4Zk1UQnJZaTUwYzNaY1hDa3BLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHSnBibE5wZW1VZ1BTQmxibVF4SUMwZ2MzUmhjblF4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXUWdQU0J3WVhOMFpTaGphSEp2YlRFc0lHSnBibE5wZW1Vc0lITjBZWEowTVN3Z2MzUmhjblF5TENCelpYQWdQU0JjWEY5Y1hDa3BJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcG1hV3gwWlhJb2FXUWdKV2x1SlNCc2IyOXdjeVJwWkNrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T25ObGJHVmpkQ2hqYUhKdmJURXNJSE4wWVhKME1Td2daVzVrTVN3Z1kyaHliMjB5TENCemRHRnlkRElzSUdWdVpESXNJR2xrTENCdlluTmxjblpsWkN3Z1hGeFBMMFZjWENsY2JpQWdZMjlzYm1GdFpYTW9kR1Z0Y0M0eE1HdGlLU0E4TFNCaktGeGNZMmh5YjIweFhGd3NJRnhjYzNSaGNuUXhYRndzSUZ4Y1pXNWtNVnhjTENCY1hHTm9jbTl0TWx4Y0xDQmNYSE4wWVhKME1seGNMQ0JjWEdWdVpESmNYQ3dnWEZ4cFpGeGNMQ0JjWEc5aWMxeGNMQ0JjWEc5aWMyVjRjRnhjS1Z4dUlDQmNiaUFnZEdWdGNDNDFhMklnUEMxbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRnhjYkc5dmNGTmpiM0psWDF4Y0xDQnpZVzF3YkdVc0lGeGNYelZyWWk1MGMzWmNYQ2twS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82YlhWMFlYUmxLR0pwYmxOcGVtVWdQU0JsYm1ReElDMGdjM1JoY25ReExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1FnUFNCd1lYTjBaU2hqYUhKdmJURXNJR0pwYmxOcGVtVXNJSE4wWVhKME1Td2djM1JoY25ReUxDQnpaWEFnUFNCY1hGOWNYQ2twSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanBtYVd4MFpYSW9hV1FnSldsdUpTQnNiMjl3Y3lScFpDa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9uTmxiR1ZqZENoamFISnZiVEVzSUhOMFlYSjBNU3dnWlc1a01Td2dZMmh5YjIweUxDQnpkR0Z5ZERJc0lHVnVaRElzSUdsa0xDQnZZbk5sY25abFpDd2dYRnhQTDBWY1hDbGNiaUFnWTI5c2JtRnRaWE1vZEdWdGNDNDFhMklwSUR3dElHTW9YRnhqYUhKdmJURmNYQ3dnWEZ4emRHRnlkREZjWEN3Z1hGeGxibVF4WEZ3c0lGeGNZMmh5YjIweVhGd3NJRnhjYzNSaGNuUXlYRndzSUZ4Y1pXNWtNbHhjTENCY1hHbGtYRndzSUZ4Y2IySnpYRndzSUZ4Y2IySnpaWGh3WEZ3cFhHNGdJRnh1SUNCMFpXMXdJRHd0SUdKcGJtUmZjbTkzY3loMFpXMXdMakkxYTJJc0lIUmxiWEF1TVRCcllpd2dkR1Z0Y0M0MWEySXBYRzRnSUdaM2NtbDBaU2gwWlcxd0xDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tGeGNiRzl2Y0ZOamIzSmxYMXhjTENCellXMXdiR1VzSUZ4Y0xuUnpkbHhjS1Nrc0lITmxjQ0E5SUZ4Y1hGeDBYRndwWEc1OVhHNWNibHh1ZEdWdGNDNUVUVk5QSUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY1hHeHZiM0JUWTI5eVpWOUhNUzVFVFZOUExrMWxjbWRsWkM1MGMzWmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHbGtMQ0J2WW5Nc0lHOWljMlY0Y0NsY2JtTnZiRzVoYldWektIUmxiWEF1UkUxVFR5a2dQQzBnWXloY1hHbGtYRndzSUZ4Y2IySnpYMFJOVTA5Y1hDd2dYRnh2WW5ObGVIQmZSRTFUVDF4Y0tWeHVkR1Z0Y0M1a1ZFRkhJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEd4dmIzQlRZMjl5WlY5SE1TNWtWRUZITGsxbGNtZGxaQzUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dsa0xDQnZZbk1zSUc5aWMyVjRjQ2xjYm1OdmJHNWhiV1Z6S0hSbGJYQXVaRlJCUnlrZ1BDMGdZeWhjWEdsa1hGd3NJRnhjYjJKelgyUlVRVWRjWEN3Z1hGeHZZbk5sZUhCZlpGUkJSMXhjS1Z4dWRHVnRjQzVCTkRnMUlEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR3h2YjNCVFkyOXlaVjlITVM1Qk5EZzFMazFsY21kbFpDNTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR2xrTENCdlluTXNJRzlpYzJWNGNDbGNibU52Ykc1aGJXVnpLSFJsYlhBdVFUUTROU2tnUEMwZ1l5aGNYR2xrWEZ3c0lGeGNiMkp6WDBFME9EVmNYQ3dnWEZ4dlluTmxlSEJmUVRRNE5WeGNLVnh1WEc1c2IyOXdjMTl2WlNBOExTQm1kV3hzWDJwdmFXNG9ablZzYkY5cWIybHVLSFJsYlhBdVJFMVRUeXdnZEdWdGNDNWtWRUZITENCaWVTQTlJRnhjYVdSY1hDa3NYRzRnSUNBZ0lDQWdJQ0FnZEdWdGNDNUJORGcxTENCaWVTQTlJRnhjYVdSY1hDa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvYjJWR1ExOWtWRUZIWDBSTlUwOGdQU0JwWmw5bGJITmxLRzlpYzJWNGNGOUVUVk5QSUQwOUlEQXNJRTVCTENCdlluTmxlSEJmWkZSQlJ5OXZZbk5sZUhCZlJFMVRUeWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjJWR1ExOUJORGcxWDBSTlUwOGdQU0JwWmw5bGJITmxLRzlpYzJWNGNGOUVUVk5QSUQwOUlEQXNJRTVCTENCdlluTmxlSEJmUVRRNE5TOXZZbk5sZUhCZlJFMVRUeWtwWEc1Y2JtWjNjbWwwWlNoc2IyOXdjMTl2WlN3Z2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNoY1hHeHZiM0JUWTI5eVpWOWpiMjV6WDI5aWMyVjRjQzUwYzNaY1hDa3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG5zYW1wbGUgPC0gXFxHMS5ETVNPLk1lcmdlZFxcXG5mb3Ioc2FtcGxlIGluIGMoXFxHMS5ETVNPLk1lcmdlZFxcLCBcXEcxLmRUQUcuTWVyZ2VkXFwsIFxcRzEuQTQ4NS5NZXJnZWRcXCkpe1xuICB0ZW1wLjI1a2IgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXF8yNWtiLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKGNocm9tMSwgYmluU2l6ZSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3BzJGlkKSAlPiVcbiAgICBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMiwgaWQsIG9ic2VydmVkLCBcXE8vRVxcKVxuICBjb2xuYW1lcyh0ZW1wLjI1a2IpIDwtIGMoXFxjaHJvbTFcXCwgXFxzdGFydDFcXCwgXFxlbmQxXFwsIFxcY2hyb20yXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcLCBcXGlkXFwsIFxcb2JzXFwsIFxcb2JzZXhwXFwpXG4gIFxuICB0ZW1wLjEwa2IgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXF8xMGtiLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKGNocm9tMSwgYmluU2l6ZSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3BzJGlkKSAlPiVcbiAgICBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMiwgaWQsIG9ic2VydmVkLCBcXE8vRVxcKVxuICBjb2xuYW1lcyh0ZW1wLjEwa2IpIDwtIGMoXFxjaHJvbTFcXCwgXFxzdGFydDFcXCwgXFxlbmQxXFwsIFxcY2hyb20yXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcLCBcXGlkXFwsIFxcb2JzXFwsIFxcb2JzZXhwXFwpXG4gIFxuICB0ZW1wLjVrYiA8LWZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIHNhbXBsZSwgXFxfNWtiLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKGNocm9tMSwgYmluU2l6ZSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3BzJGlkKSAlPiVcbiAgICBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMiwgaWQsIG9ic2VydmVkLCBcXE8vRVxcKVxuICBjb2xuYW1lcyh0ZW1wLjVrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAgPC0gYmluZF9yb3dzKHRlbXAuMjVrYiwgdGVtcC4xMGtiLCB0ZW1wLjVrYilcbiAgZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIHNhbXBsZSwgXFwudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcbn1cblxuXG50ZW1wLkRNU08gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcbG9vcFNjb3JlX0cxLkRNU08uTWVyZ2VkLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKVxuY29sbmFtZXModGVtcC5ETVNPKSA8LSBjKFxcaWRcXCwgXFxvYnNfRE1TT1xcLCBcXG9ic2V4cF9ETVNPXFwpXG50ZW1wLmRUQUcgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcbG9vcFNjb3JlX0cxLmRUQUcuTWVyZ2VkLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKVxuY29sbmFtZXModGVtcC5kVEFHKSA8LSBjKFxcaWRcXCwgXFxvYnNfZFRBR1xcLCBcXG9ic2V4cF9kVEFHXFwpXG50ZW1wLkE0ODUgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcbG9vcFNjb3JlX0cxLkE0ODUuTWVyZ2VkLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKVxuY29sbmFtZXModGVtcC5BNDg1KSA8LSBjKFxcaWRcXCwgXFxvYnNfQTQ4NVxcLCBcXG9ic2V4cF9BNDg1XFwpXG5cbmxvb3BzX29lIDwtIGZ1bGxfam9pbihmdWxsX2pvaW4odGVtcC5ETVNPLCB0ZW1wLmRUQUcsIGJ5ID0gXFxpZFxcKSxcbiAgICAgICAgICB0ZW1wLkE0ODUsIGJ5ID0gXFxpZFxcKSAlPiVcbiAgZHBseXI6Om11dGF0ZShvZUZDX2RUQUdfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgTkEsIG9ic2V4cF9kVEFHL29ic2V4cF9ETVNPKSxcbiAgICAgICAgICAgICAgICBvZUZDX0E0ODVfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgTkEsIG9ic2V4cF9BNDg1L29ic2V4cF9ETVNPKSlcblxuZndyaXRlKGxvb3BzX29lLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2FtcGxlIDwtIFxcRzEuRE1TTy5NZXJnZWRcXFxuZm9yKHNhbXBsZSBpbiBjKFxcRzEuRE1TTy5NZXJnZWRcXCwgXFxHMS5kVEFHLk1lcmdlZFxcLCBcXEcxLkE0ODUuTWVyZ2VkXFwpKXtcbiAgdGVtcC4yNWtiIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIHNhbXBsZSwgXFxfMjVrYi50c3ZcXCkpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBlbmQxIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShjaHJvbTEsIGJpblNpemUsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSBcXF9cXCkpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wcyRpZCkgJT4lXG4gICAgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGlkLCBvYnNlcnZlZCwgXFxPL0VcXClcbiAgY29sbmFtZXModGVtcC4yNWtiKSA8LSBjKFxcY2hyb20xXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocm9tMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCwgXFxpZFxcLCBcXG9ic1xcLCBcXG9ic2V4cFxcKVxuICBcbiAgdGVtcC4xMGtiIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIHNhbXBsZSwgXFxfMTBrYi50c3ZcXCkpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBlbmQxIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShjaHJvbTEsIGJpblNpemUsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSBcXF9cXCkpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wcyRpZCkgJT4lXG4gICAgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGlkLCBvYnNlcnZlZCwgXFxPL0VcXClcbiAgY29sbmFtZXModGVtcC4xMGtiKSA8LSBjKFxcY2hyb20xXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocm9tMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCwgXFxpZFxcLCBcXG9ic1xcLCBcXG9ic2V4cFxcKVxuICBcbiAgdGVtcC41a2IgPC1mcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcXzVrYi50c3ZcXCkpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBlbmQxIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShjaHJvbTEsIGJpblNpemUsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSBcXF9cXCkpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wcyRpZCkgJT4lXG4gICAgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGlkLCBvYnNlcnZlZCwgXFxPL0VcXClcbiAgY29sbmFtZXModGVtcC41a2IpIDwtIGMoXFxjaHJvbTFcXCwgXFxzdGFydDFcXCwgXFxlbmQxXFwsIFxcY2hyb20yXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcLCBcXGlkXFwsIFxcb2JzXFwsIFxcb2JzZXhwXFwpXG4gIFxuICB0ZW1wIDwtIGJpbmRfcm93cyh0ZW1wLjI1a2IsIHRlbXAuMTBrYiwgdGVtcC41a2IpXG4gIGZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcLnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG59XG5cblxudGVtcC5ETVNPIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGxvb3BTY29yZV9HMS5ETVNPLk1lcmdlZC50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGlkLCBvYnMsIG9ic2V4cClcbmNvbG5hbWVzKHRlbXAuRE1TTykgPC0gYyhcXGlkXFwsIFxcb2JzX0RNU09cXCwgXFxvYnNleHBfRE1TT1xcKVxudGVtcC5kVEFHIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGxvb3BTY29yZV9HMS5kVEFHLk1lcmdlZC50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGlkLCBvYnMsIG9ic2V4cClcbmNvbG5hbWVzKHRlbXAuZFRBRykgPC0gYyhcXGlkXFwsIFxcb2JzX2RUQUdcXCwgXFxvYnNleHBfZFRBR1xcKVxudGVtcC5BNDg1IDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGxvb3BTY29yZV9HMS5BNDg1Lk1lcmdlZC50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGlkLCBvYnMsIG9ic2V4cClcbmNvbG5hbWVzKHRlbXAuQTQ4NSkgPC0gYyhcXGlkXFwsIFxcb2JzX0E0ODVcXCwgXFxvYnNleHBfQTQ4NVxcKVxuXG5sb29wc19vZSA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAuRE1TTywgdGVtcC5kVEFHLCBieSA9IFxcaWRcXCksXG4gICAgICAgICAgdGVtcC5BNDg1LCBieSA9IFxcaWRcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUob2VGQ19kVEFHX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIE5BLCBvYnNleHBfZFRBRy9vYnNleHBfRE1TTyksXG4gICAgICAgICAgICAgICAgb2VGQ19BNDg1X0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIE5BLCBvYnNleHBfQTQ4NS9vYnNleHBfRE1TTykpXG5cbmZ3cml0ZShsb29wc19vZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
sample <- \G1.DMSO.Merged\
for(sample in c(\G1.DMSO.Merged\, \G1.dTAG.Merged\, \G1.A485.Merged\)){
  temp.25kb <- fread(here(consensusDir, paste0(\loopScore_\, sample, \_25kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.25kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp.10kb <- fread(here(consensusDir, paste0(\loopScore_\, sample, \_10kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.10kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp.5kb <-fread(here(consensusDir, paste0(\loopScore_\, sample, \_5kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.5kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp <- bind_rows(temp.25kb, temp.10kb, temp.5kb)
  fwrite(temp, here(consensusDir, paste0(\loopScore_\, sample, \.tsv\)), sep = \\t\)
}


temp.DMSO <- fread(here(consensusDir, \loopScore_G1.DMSO.Merged.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.DMSO) <- c(\id\, \obs_DMSO\, \obsexp_DMSO\)
temp.dTAG <- fread(here(consensusDir, \loopScore_G1.dTAG.Merged.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.dTAG) <- c(\id\, \obs_dTAG\, \obsexp_dTAG\)
temp.A485 <- fread(here(consensusDir, \loopScore_G1.A485.Merged.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.A485) <- c(\id\, \obs_A485\, \obsexp_A485\)

loops_oe <- full_join(full_join(temp.DMSO, temp.dTAG, by = \id\),
          temp.A485, by = \id\) %>%
  dplyr::mutate(oeFC_dTAG_DMSO = if_else(obsexp_DMSO == 0, NA, obsexp_dTAG/obsexp_DMSO),
                oeFC_A485_DMSO = if_else(obsexp_DMSO == 0, NA, obsexp_A485/obsexp_DMSO))

fwrite(loops_oe, here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\)), sep = \\t\)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaR2xtWmtOMWRHOW1aaUE5SURBdU1seHVaR0YwWVNBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTl6WTI5eVpTNTBjM1pjSWlrcFhHNWNiblJsYlhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mYzJOdmNtVmZZWE41Ym1NdWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaHBaQ3dnVlZRc0lFRkpSQ2xjYmx4dWMyTnZjbVV1ZEdJZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tWjFiR3hmYW05cGJpaDBaVzF3TENCaWVTQTlJR01vWENKcFpGd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pHbG1abDlITVNBOUlHUlVRVWNnTFNCRVRWTlBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsbVpsOWhjM2x1WXlBOUlFRkpSQ0F0SUZWVUtWeHVYRzVjYmlNakl5QlFNUzRnVlZRZ2RuTWdRVWxFWEc1elkyOXlaUzUwWWlSa1pXNXphWFI1SUR3dElHZGxkRjlrWlc1emFYUjVLSE5qYjNKbExuUmlKRlZVTENCelkyOXlaUzUwWWlSQlNVUXNJRzRnUFNBeE1EQXBYRzV6WTI5eVpTNTBZaUE4TFNCelkyOXlaUzUwWWlBbFBpVWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pHVnVjMmwwZVNsY2JtTnZjbkpsYkdGMGFXOXVJRHd0SUdOdmNpaHpZMjl5WlM1MFlpUlZWQ3dnYzJOdmNtVXVkR0lrUVVsRUtWeHVjREVnUEMwZ1oyZHdiRzkwS0hOamIzSmxMblJpTENCaFpYTW9lQ0E5SUZWVUxDQjVJRDBnUVVsRUxDQmpiMnh2Y2lBOUlHUmxibk5wZEhrcEtTQXJYRzRnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJRnh1SUNCelkyRnNaVjlqYjJ4dmNsOTJhWEpwWkdsektDa2dLMXh1SUNCNGJHbHRLQzB3TGpVc0lERXBJQ3NnZVd4cGJTZ3RNQzQxTENBeEtTQXJYRzRnSUdOdmIzSmtYMlpwZUdWa0tDa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SURBc0lHTnZiQ0E5SUZ3aVozSmxlVFV3WENJc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlDMWthV1ptUTNWMGIyWm1MQ0JqYjJ3Z1BTQmNJbWR5WlhsY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SdmRIUmxaRndpS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYQ0puY21WNVhDSXNJR3hwYm1WMGVYQmxJRDBnWENKa2IzUjBaV1JjSWlrZ0sxeHVJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJuWjNScGRHeGxLSEJoYzNSbE1DaGNJa052Ym5ObGJuTjFjeUJzYjI5d0lITmpiM0psWENJcEtTQXJYRzRnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdMVEF1TlN3Z2VTQTlJREVzSUd4aFltVnNJRDBnY0dGemRHVW9YQ0p5SUQxY0lpd2djbTkxYm1Rb1kyOXljbVZzWVhScGIyNHNJRElwS1N3Z2MybDZaU0E5SURVc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUtWeHVYRzRqSXlNZ1VERXVJRVJOVTA4Z2RuTWdaRlJCUjF4dWMyTnZjbVV1ZEdJa1pHVnVjMmwwZVNBOExTQm5aWFJmWkdWdWMybDBlU2h6WTI5eVpTNTBZaVJFVFZOUExDQnpZMjl5WlM1MFlpUmtWRUZITENCdUlEMGdNVEF3S1Z4dWMyTnZjbVV1ZEdJZ1BDMGdjMk52Y21VdWRHSWdKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JsYm5OcGRIa3BYRzVqYjNKeVpXeGhkR2x2YmlBOExTQmpiM0lvYzJOdmNtVXVkR0lrUkUxVFR5d2djMk52Y21VdWRHSWtaRlJCUnlsY2JuQXlJRHd0SUdkbmNHeHZkQ2h6WTI5eVpTNTBZaXdnWVdWektIZ2dQU0JFVFZOUExDQjVJRDBnWkZSQlJ5d2dZMjlzYjNJZ1BTQmtaVzV6YVhSNUtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJjYmlBZ2MyTmhiR1ZmWTI5c2IzSmZkbWx5YVdScGN5Z3BJQ3RjYmlBZ2VHeHBiU2d0TUM0MUxDQXhLU0FySUhsc2FXMG9MVEF1TlN3Z01Ta2dLMXh1SUNCamIyOXlaRjltYVhobFpDZ3BJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBd0xDQmpiMndnUFNCY0ltZHlaWGsxTUZ3aUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Dd2dZV3h3YUdFZ1BTQXdMalVzSUdOdmJHOXlJRDBnWENKbmNtVjVYQ0lwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ01Dd2dZV3h3YUdFZ1BTQXdMalVzSUdOdmJHOXlJRDBnWENKbmNtVjVYQ0lwSUN0Y2JpQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXRaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYQ0puY21WNVhDSXNJR3hwYm1WMGVYQmxJRDBnWENKa2IzUjBaV1JjSWlrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUdOdmJDQTlJRndpWjNKbGVWd2lMQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHOTBkR1ZrWENJcElDdGNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWjJkMGFYUnNaU2h3WVhOMFpUQW9YQ0pEYjI1elpXNXpkWE1nYkc5dmNDQnpZMjl5WlZ3aUtTa2dLMXh1SUNCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJQzB3TGpVc0lIa2dQU0F4TENCc1lXSmxiQ0E5SUhCaGMzUmxLRndpY2lBOVhDSXNJSEp2ZFc1a0tHTnZjbkpsYkdGMGFXOXVMQ0F5S1Nrc0lITnBlbVVnUFNBMUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpbGNibHh1WEc0akl5TWdVRE11SUVSTlUwOGdkbk1nUVRRNE5WeHVjMk52Y21VdWRHSWtaR1Z1YzJsMGVTQThMU0JuWlhSZlpHVnVjMmwwZVNoelkyOXlaUzUwWWlSRVRWTlBMQ0J6WTI5eVpTNTBZaVJCTkRnMUxDQnVJRDBnTVRBd0tWeHVjMk52Y21VdWRHSWdQQzBnYzJOdmNtVXVkR0lnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dSbGJuTnBkSGtwWEc1amIzSnlaV3hoZEdsdmJpQThMU0JqYjNJb2MyTnZjbVV1ZEdJa1JFMVRUeXdnYzJOdmNtVXVkR0lrUVRRNE5TbGNibkF6SUR3dElHZG5jR3h2ZENoelkyOXlaUzUwWWl3Z1lXVnpLSGdnUFNCRVRWTlBMQ0I1SUQwZ1FUUTROU3dnWTI5c2IzSWdQU0JrWlc1emFYUjVLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCY2JpQWdjMk5oYkdWZlkyOXNiM0pmZG1seWFXUnBjeWdwSUN0Y2JpQWdlR3hwYlNndE1DNDFMQ0F4S1NBcklIbHNhVzBvTFRBdU5Td2dNU2tnSzF4dUlDQmpiMjl5WkY5bWFYaGxaQ2dwSUN0Y2JpQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXdMQ0JqYjJ3Z1BTQmNJbWR5WlhrMU1Gd2lMQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ3dnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hDSm5jbVY1WENJcElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdNQ3dnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hDSm5jbVY1WENJcElDdGNiaUFnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0F0WkdsbVprTjFkRzltWml3Z1kyOXNJRDBnWENKbmNtVjVYQ0lzSUd4cGJtVjBlWEJsSUQwZ1hDSmtiM1IwWldSY0lpa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SUdScFptWkRkWFJ2Wm1Zc0lHTnZiQ0E5SUZ3aVozSmxlVndpTENCc2FXNWxkSGx3WlNBOUlGd2laRzkwZEdWa1hDSXBJQ3RjYmlBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1oyZDBhWFJzWlNod1lYTjBaVEFvWENKRGIyNXpaVzV6ZFhNZ2JHOXZjQ0J6WTI5eVpWd2lLU2tnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SUMwd0xqVXNJSGtnUFNBeExDQnNZV0psYkNBOUlIQmhjM1JsS0Z3aWNpQTlYQ0lzSUhKdmRXNWtLR052Y25KbGJHRjBhVzl1TENBeUtTa3NJSE5wZW1VZ1BTQTFMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaWxjYmx4dUl5TWpJRkF6TGlCRVRWTlBJSFp6SUZWVVhHNXpZMjl5WlM1MFlpUmtaVzV6YVhSNUlEd3RJR2RsZEY5a1pXNXphWFI1S0hOamIzSmxMblJpSkVSTlUwOHNJSE5qYjNKbExuUmlKRlZVTENCdUlEMGdNVEF3S1Z4dWMyTnZjbVV1ZEdJZ1BDMGdjMk52Y21VdWRHSWdKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JsYm5OcGRIa3BYRzVqYjNKeVpXeGhkR2x2YmlBOExTQmpiM0lvYzJOdmNtVXVkR0lrUkUxVFR5d2djMk52Y21VdWRHSWtWVlFwWEc1d05DQThMU0JuWjNCc2IzUW9jMk52Y21VdWRHSXNJR0ZsY3loNElEMGdSRTFUVHl3Z2VTQTlJRlZVTENCamIyeHZjaUE5SUdSbGJuTnBkSGtwS1NBclhHNGdJR2RsYjIxZmNHOXBiblFvS1NBcklGeHVJQ0J6WTJGc1pWOWpiMnh2Y2w5MmFYSnBaR2x6S0NrZ0sxeHVJQ0I0YkdsdEtDMHdMalVzSURFcElDc2dlV3hwYlNndE1DNDFMQ0F4S1NBclhHNGdJR052YjNKa1gyWnBlR1ZrS0NrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJREFzSUdOdmJDQTlJRndpWjNKbGVUVXdYQ0lzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNJbWR5WlhsY0lpa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNJbWR5WlhsY0lpa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SUMxa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY0ltZHlaWGxjSWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJ2ZEhSbFpGd2lLU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2dZMjlzSUQwZ1hDSm5jbVY1WENJc0lHeHBibVYwZVhCbElEMGdYQ0prYjNSMFpXUmNJaWtnSzF4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5Qm5aM1JwZEd4bEtIQmhjM1JsTUNoY0lrTnZibk5sYm5OMWN5QnNiMjl3SUhOamIzSmxYQ0lwS1NBclhHNGdJR0Z1Ym05MFlYUmxLRndpZEdWNGRGd2lMQ0I0SUQwZ0xUQXVOU3dnZVNBOUlERXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVb1hDSnlJRDFjSWl3Z2NtOTFibVFvWTI5eWNtVnNZWFJwYjI0c0lESXBLU3dnYzJsNlpTQTlJRFVzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpS1Z4dVhHNWNiaU1qSXlCUU15NGdaRlJCUnlCMmN5QkJTVVJjYm5OamIzSmxMblJpSkdSbGJuTnBkSGtnUEMwZ1oyVjBYMlJsYm5OcGRIa29jMk52Y21VdWRHSWtaRlJCUnl3Z2MyTnZjbVV1ZEdJa1FVbEVMQ0J1SUQwZ01UQXdLVnh1YzJOdmNtVXVkR0lnUEMwZ2MyTnZjbVV1ZEdJZ0pUNGxJR1J3YkhseU9qcGhjbkpoYm1kbEtHUmxibk5wZEhrcFhHNWpiM0p5Wld4aGRHbHZiaUE4TFNCamIzSW9jMk52Y21VdWRHSWtaRlJCUnl3Z2MyTnZjbVV1ZEdJa1FVbEVLVnh1Y0RVZ1BDMGdaMmR3Ykc5MEtITmpiM0psTG5SaUxDQmhaWE1vZUNBOUlHUlVRVWNzSUhrZ1BTQkJTVVFzSUdOdmJHOXlJRDBnWkdWdWMybDBlU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1hHNGdJSE5qWVd4bFgyTnZiRzl5WDNacGNtbGthWE1vS1NBclhHNGdJSGhzYVcwb0xUQXVOU3dnTVNrZ0t5QjViR2x0S0Mwd0xqVXNJREVwSUN0Y2JpQWdZMjl2Y21SZlptbDRaV1FvS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdNQ3dnWTI5c0lEMGdYQ0puY21WNU5UQmNJaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGd2laM0psZVZ3aUtTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGd2laM0psZVZ3aUtTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTFdScFptWkRkWFJ2Wm1Zc0lHTnZiQ0E5SUZ3aVozSmxlVndpTENCc2FXNWxkSGx3WlNBOUlGd2laRzkwZEdWa1hDSXBJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY0ltZHlaWGxjSWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJ2ZEhSbFpGd2lLU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHZG5kR2wwYkdVb2NHRnpkR1V3S0Z3aVEyOXVjMlZ1YzNWeklHeHZiM0FnYzJOdmNtVmNJaWtwSUN0Y2JpQWdZVzV1YjNSaGRHVW9YQ0owWlhoMFhDSXNJSGdnUFNBdE1DNDFMQ0I1SUQwZ01Td2diR0ZpWld3Z1BTQndZWE4wWlNoY0luSWdQVndpTENCeWIzVnVaQ2hqYjNKeVpXeGhkR2x2Yml3Z01pa3BMQ0J6YVhwbElEMGdOU3dnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwWEc1Y2JpTWpJeUJRTXk0Z1pHbG1abHh1YzJOdmNtVXVkR0lrWkdWdWMybDBlU0E4TFNCblpYUmZaR1Z1YzJsMGVTaHpZMjl5WlM1MFlpUmthV1ptWDBjeExDQnpZMjl5WlM1MFlpUmthV1ptWDJGemVXNWpMQ0J1SUQwZ01UQXdLVnh1YzJOdmNtVXVkR0lnUEMwZ2MyTnZjbVV1ZEdJZ0pUNGxJR1J3YkhseU9qcGhjbkpoYm1kbEtHUmxibk5wZEhrcFhHNWpiM0p5Wld4aGRHbHZiaUE4TFNCamIzSW9jMk52Y21VdWRHSWtaR2xtWmw5SE1Td2djMk52Y21VdWRHSWtaR2xtWmw5aGMzbHVZeWxjYm5BMklEd3RJR2RuY0d4dmRDaHpZMjl5WlM1MFlpd2dZV1Z6S0hnZ1BTQmthV1ptWDBjeExDQjVJRDBnWkdsbVpsOWhjM2x1WXl3Z1kyOXNiM0lnUFNCa1pXNXphWFI1S1NrZ0sxeHVJQ0JuWlc5dFgzQnZhVzUwS0NrZ0t5QmNiaUFnYzJOaGJHVmZZMjlzYjNKZmRtbHlhV1JwY3lncElDdGNiaUFnZUd4cGJTZ3RNU3dnTUM0MUtTQXJJSGxzYVcwb0xURXNJREF1TlNrZ0sxeHVJQ0JqYjI5eVpGOW1hWGhsWkNncElDdGNiaUFnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0F3TENCamIyd2dQU0JjSW1keVpYazFNRndpTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUN3Z1lXeHdhR0VnUFNBd0xqVXNJR052Ykc5eUlEMGdYQ0puY21WNVhDSXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z1lXeHdhR0VnUFNBd0xqVXNJR052Ykc5eUlEMGdYQ0puY21WNVhDSXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTFdScFptWkRkWFJ2Wm1Zc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRndpWjNKbGVWd2lLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUdScFptWkRkWFJ2Wm1Zc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRndpWjNKbGVWd2lLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUMxa2FXWm1RM1YwYjJabUxDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5Qm5aM1JwZEd4bEtIQmhjM1JsTUNoY0lrTnZibk5sYm5OMWN5QnNiMjl3SUhOamIzSmxYQ0lwS1NBclhHNGdJR0Z1Ym05MFlYUmxLRndpZEdWNGRGd2lMQ0I0SUQwZ0xURXNJSGtnUFNBd0xqVXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVb1hDSnlJRDFjSWl3Z2NtOTFibVFvWTI5eWNtVnNZWFJwYjI0c0lESXBLU3dnYzJsNlpTQTlJRFVzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpS1Z4dVhHNWNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tGd2lZMjl1YzJWdWMzVnpYM05qYjNKbFgzTmpZWFIwWlhKd2JHOTBYM0IxTVRBd2NIb3hNREJmUnpGMmMwRnplVzVqTG5CdVoxd2lLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkSE1nUFNCY0ltbHVYQ0lzSUhkcFpIUm9JRDBnTlNveUxqVXNJR2hsYVdkb2RDQTlJREl1TlNveUxqVXBYRzV3Y21sdWRDaGpiM2R3Ykc5ME9qcHdiRzkwWDJkeWFXUW9jREVzSUhBeUxDQndNeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0RRc0lIQTFMQ0J3Tml3Z1lXeHBaMjRnUFNCY0ltaGNJaXdnYm1OdmJDQTlJRE1wS1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9YQ0pqYjI1elpXNXpkWE5mYzJOdmNtVmZjMk5oZEhSbGNuQnNiM1JmY0hVeE1EQndlakV3TUY5SE1YWnpRWE41Ym1NdWMzWm5YQ0lwS1N3Z2QybGtkR2dnUFNBMUtqSXVOU3dnYUdWcFoyaDBJRDBnTWk0MUtqSXVOU2xjYm5CeWFXNTBLR052ZDNCc2IzUTZPbkJzYjNSZlozSnBaQ2h3TVN3Z2NESXNJSEF6TENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd05Dd2djRFVzSUhBMkxDQmhiR2xuYmlBOUlGd2lhRndpTENCdVkyOXNJRDBnTXlrcFhHNWtaWFl1YjJabUtDbGNibHh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5kaWZmQ3V0b2ZmID0gMC4yXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX3Njb3JlLnRzdlxcKSlcblxudGVtcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZV9hc3luYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGlkLCBVVCwgQUlEKVxuXG5zY29yZS50YiA8LSBkYXRhICU+JSBkcGx5cjo6ZnVsbF9qb2luKHRlbXAsIGJ5ID0gYyhcXGlkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShkaWZmX0cxID0gZFRBRyAtIERNU08sXG4gICAgICAgICAgICAgICAgICBkaWZmX2FzeW5jID0gQUlEIC0gVVQpXG5cblxuIyMjIFAxLiBVVCB2cyBBSURcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkVVQsIHNjb3JlLnRiJEFJRCwgbiA9IDEwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJFVULCBzY29yZS50YiRBSUQpXG5wMSA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gVVQsIHkgPSBBSUQsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyBQMS4gRE1TTyB2cyBkVEFHXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJGRUQUcsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRETVNPLCBzY29yZS50YiRkVEFHKVxucDIgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IERNU08sIHkgPSBkVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG5cbiMjIyBQMy4gRE1TTyB2cyBBNDg1XG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJEE0ODUsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRETVNPLCBzY29yZS50YiRBNDg1KVxucDMgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IERNU08sIHkgPSBBNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG4jIyMgUDMuIERNU08gdnMgVVRcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkRE1TTywgc2NvcmUudGIkVVQsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRETVNPLCBzY29yZS50YiRVVClcbnA0IDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gVVQsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cblxuIyMjIFAzLiBkVEFHIHZzIEFJRFxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRkVEFHLCBzY29yZS50YiRBSUQsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRkVEFHLCBzY29yZS50YiRBSUQpXG5wNSA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gZFRBRywgeSA9IEFJRCwgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIFAzLiBkaWZmXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJGRpZmZfRzEsIHNjb3JlLnRiJGRpZmZfYXN5bmMsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRkaWZmX0cxLCBzY29yZS50YiRkaWZmX2FzeW5jKVxucDYgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IGRpZmZfRzEsIHkgPSBkaWZmX2FzeW5jLCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0xLCAwLjUpICsgeWxpbSgtMSwgMC41KSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cblxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxjb25zZW5zdXNfc2NvcmVfc2NhdHRlcnBsb3RfcHUxMDBwejEwMF9HMXZzQXN5bmMucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSA1KjIuNSwgaGVpZ2h0ID0gMi41KjIuNSlcbnByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIHAzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICBwNCwgcDUsIHA2LCBhbGlnbiA9IFxcaFxcLCBuY29sID0gMykpXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChcXGNvbnNlbnN1c19zY29yZV9zY2F0dGVycGxvdF9wdTEwMHB6MTAwX0cxdnNBc3luYy5zdmdcXCkpLCB3aWR0aCA9IDUqMi41LCBoZWlnaHQgPSAyLjUqMi41KVxucHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgcDMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgIHA0LCBwNSwgcDYsIGFsaWduID0gXFxoXFwsIG5jb2wgPSAzKSlcbmRldi5vZmYoKVxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
diffCutoff = 0.2
data <- fread(here(consensusDir, \chromo_cons_score.tsv\))

temp <- fread(here(consensusDir, \chromo_cons_score_async.tsv\)) %>%
  dplyr::select(id, UT, AID)

score.tb <- data %>% dplyr::full_join(temp, by = c(\id\)) %>%
  dplyr::mutate(diff_G1 = dTAG - DMSO,
                  diff_async = AID - UT)


### P1. UT vs AID
score.tb$density <- get_density(score.tb$UT, score.tb$AID, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$UT, score.tb$AID)
p1 <- ggplot(score.tb, aes(x = UT, y = AID, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P1. DMSO vs dTAG
score.tb$density <- get_density(score.tb$DMSO, score.tb$dTAG, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$dTAG)
p2 <- ggplot(score.tb, aes(x = DMSO, y = dTAG, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


### P3. DMSO vs A485
score.tb$density <- get_density(score.tb$DMSO, score.tb$A485, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$A485)
p3 <- ggplot(score.tb, aes(x = DMSO, y = A485, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P3. DMSO vs UT
score.tb$density <- get_density(score.tb$DMSO, score.tb$UT, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$UT)
p4 <- ggplot(score.tb, aes(x = DMSO, y = UT, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


### P3. dTAG vs AID
score.tb$density <- get_density(score.tb$dTAG, score.tb$AID, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$dTAG, score.tb$AID)
p5 <- ggplot(score.tb, aes(x = dTAG, y = AID, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P3. diff
score.tb$density <- get_density(score.tb$diff_G1, score.tb$diff_async, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$diff_G1, score.tb$diff_async)
p6 <- ggplot(score.tb, aes(x = diff_G1, y = diff_async, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-1, 0.5) + ylim(-1, 0.5) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_hline(yintercept = diffCutoff, alpha = 0.5, color = \grey\) +
  geom_hline(yintercept = -diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = -diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -1, y = 0.5, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


png(here(figDir, paste0(\consensus_score_scatterplot_pu100pz100_G1vsAsync.png\)), res = 600, units = \in\, width = 5*2.5, height = 2.5*2.5)
print(cowplot::plot_grid(p1, p2, p3, 
                         p4, p5, p6, align = \h\, ncol = 3))
dev.off()
svglite(here(figDir, paste0(\consensus_score_scatterplot_pu100pz100_G1vsAsync.svg\)), width = 5*2.5, height = 2.5*2.5)
print(cowplot::plot_grid(p1, p2, p3, 
                         p4, p5, p6, align = \h\, ncol = 3))
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVpHbG1aa04xZEc5bVppQTlJREF1TWx4dVpHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOXpZMjl5WlM1MGMzWmNYQ2twWEc1Y2JuUmxiWEFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZjMk52Y21WZllYTjVibU11ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENocFpDd2dWVlFzSUVGSlJDbGNibHh1YzJOdmNtVXVkR0lnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21aMWJHeGZhbTlwYmloMFpXMXdMQ0JpZVNBOUlHTW9YRnhwWkZ4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWkdsbVpsOUhNU0E5SUdSVVFVY2dMU0JFVFZOUExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2xtWmw5aGMzbHVZeUE5SUVGSlJDQXRJRlZVS1Z4dVhHNWNiaU1qSXlCUU1TNGdWVlFnZG5NZ1FVbEVYRzV6WTI5eVpTNTBZaVJrWlc1emFYUjVJRHd0SUdkbGRGOWtaVzV6YVhSNUtITmpiM0psTG5SaUpGVlVMQ0J6WTI5eVpTNTBZaVJCU1VRc0lHNGdQU0F4TURBcFhHNXpZMjl5WlM1MFlpQThMU0J6WTI5eVpTNTBZaUFsUGlVZ1pIQnNlWEk2T21GeWNtRnVaMlVvWkdWdWMybDBlU2xjYm1OdmNuSmxiR0YwYVc5dUlEd3RJR052Y2loelkyOXlaUzUwWWlSVlZDd2djMk52Y21VdWRHSWtRVWxFS1Z4dWNERWdQQzBnWjJkd2JHOTBLSE5qYjNKbExuUmlMQ0JoWlhNb2VDQTlJRlZVTENCNUlEMGdRVWxFTENCamIyeHZjaUE5SUdSbGJuTnBkSGtwS1NBclhHNGdJR2RsYjIxZmNHOXBiblFvS1NBcklGeHVJQ0J6WTJGc1pWOWpiMnh2Y2w5MmFYSnBaR2x6S0NrZ0sxeHVJQ0I0YkdsdEtDMHdMalVzSURFcElDc2dlV3hwYlNndE1DNDFMQ0F4S1NBclhHNGdJR052YjNKa1gyWnBlR1ZrS0NrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJREFzSUdOdmJDQTlJRnhjWjNKbGVUVXdYRndzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SUMxa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY1hHZHlaWGxjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1J2ZEhSbFpGeGNLU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2dZMjlzSUQwZ1hGeG5jbVY1WEZ3c0lHeHBibVYwZVhCbElEMGdYRnhrYjNSMFpXUmNYQ2tnSzF4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5Qm5aM1JwZEd4bEtIQmhjM1JsTUNoY1hFTnZibk5sYm5OMWN5QnNiMjl3SUhOamIzSmxYRndwS1NBclhHNGdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ0xUQXVOU3dnZVNBOUlERXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVb1hGeHlJRDFjWEN3Z2NtOTFibVFvWTI5eWNtVnNZWFJwYjI0c0lESXBLU3dnYzJsNlpTQTlJRFVzSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjS1Z4dVhHNGpJeU1nVURFdUlFUk5VMDhnZG5NZ1pGUkJSMXh1YzJOdmNtVXVkR0lrWkdWdWMybDBlU0E4TFNCblpYUmZaR1Z1YzJsMGVTaHpZMjl5WlM1MFlpUkVUVk5QTENCelkyOXlaUzUwWWlSa1ZFRkhMQ0J1SUQwZ01UQXdLVnh1YzJOdmNtVXVkR0lnUEMwZ2MyTnZjbVV1ZEdJZ0pUNGxJR1J3YkhseU9qcGhjbkpoYm1kbEtHUmxibk5wZEhrcFhHNWpiM0p5Wld4aGRHbHZiaUE4TFNCamIzSW9jMk52Y21VdWRHSWtSRTFUVHl3Z2MyTnZjbVV1ZEdJa1pGUkJSeWxjYm5BeUlEd3RJR2RuY0d4dmRDaHpZMjl5WlM1MFlpd2dZV1Z6S0hnZ1BTQkVUVk5QTENCNUlEMGdaRlJCUnl3Z1kyOXNiM0lnUFNCa1pXNXphWFI1S1NrZ0sxeHVJQ0JuWlc5dFgzQnZhVzUwS0NrZ0t5QmNiaUFnYzJOaGJHVmZZMjlzYjNKZmRtbHlhV1JwY3lncElDdGNiaUFnZUd4cGJTZ3RNQzQxTENBeEtTQXJJSGxzYVcwb0xUQXVOU3dnTVNrZ0sxeHVJQ0JqYjI5eVpGOW1hWGhsWkNncElDdGNiaUFnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0F3TENCamIyd2dQU0JjWEdkeVpYazFNRnhjTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUN3Z1lXeHdhR0VnUFNBd0xqVXNJR052Ykc5eUlEMGdYRnhuY21WNVhGd3BJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUN3Z1lXeHdhR0VnUFNBd0xqVXNJR052Ykc5eUlEMGdYRnhuY21WNVhGd3BJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBdFpHbG1aa04xZEc5bVppd2dZMjlzSUQwZ1hGeG5jbVY1WEZ3c0lHeHBibVYwZVhCbElEMGdYRnhrYjNSMFpXUmNYQ2tnSzF4dUlDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlHUnBabVpEZFhSdlptWXNJR052YkNBOUlGeGNaM0psZVZ4Y0xDQnNhVzVsZEhsd1pTQTlJRnhjWkc5MGRHVmtYRndwSUN0Y2JpQWdkR2hsYldWZlkyeGhjM05wWXlncElDc2daMmQwYVhSc1pTaHdZWE4wWlRBb1hGeERiMjV6Wlc1emRYTWdiRzl2Y0NCelkyOXlaVnhjS1NrZ0sxeHVJQ0JoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlDMHdMalVzSUhrZ1BTQXhMQ0JzWVdKbGJDQTlJSEJoYzNSbEtGeGNjaUE5WEZ3c0lISnZkVzVrS0dOdmNuSmxiR0YwYVc5dUxDQXlLU2tzSUhOcGVtVWdQU0ExTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWENsY2JseHVYRzRqSXlNZ1VETXVJRVJOVTA4Z2RuTWdRVFE0TlZ4dWMyTnZjbVV1ZEdJa1pHVnVjMmwwZVNBOExTQm5aWFJmWkdWdWMybDBlU2h6WTI5eVpTNTBZaVJFVFZOUExDQnpZMjl5WlM1MFlpUkJORGcxTENCdUlEMGdNVEF3S1Z4dWMyTnZjbVV1ZEdJZ1BDMGdjMk52Y21VdWRHSWdKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JsYm5OcGRIa3BYRzVqYjNKeVpXeGhkR2x2YmlBOExTQmpiM0lvYzJOdmNtVXVkR0lrUkUxVFR5d2djMk52Y21VdWRHSWtRVFE0TlNsY2JuQXpJRHd0SUdkbmNHeHZkQ2h6WTI5eVpTNTBZaXdnWVdWektIZ2dQU0JFVFZOUExDQjVJRDBnUVRRNE5Td2dZMjlzYjNJZ1BTQmtaVzV6YVhSNUtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJjYmlBZ2MyTmhiR1ZmWTI5c2IzSmZkbWx5YVdScGN5Z3BJQ3RjYmlBZ2VHeHBiU2d0TUM0MUxDQXhLU0FySUhsc2FXMG9MVEF1TlN3Z01Ta2dLMXh1SUNCamIyOXlaRjltYVhobFpDZ3BJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBd0xDQmpiMndnUFNCY1hHZHlaWGsxTUZ4Y0xDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Dd2dZV3h3YUdFZ1BTQXdMalVzSUdOdmJHOXlJRDBnWEZ4bmNtVjVYRndwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ01Dd2dZV3h3YUdFZ1BTQXdMalVzSUdOdmJHOXlJRDBnWEZ4bmNtVjVYRndwSUN0Y2JpQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXRaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYRnhuY21WNVhGd3NJR3hwYm1WMGVYQmxJRDBnWEZ4a2IzUjBaV1JjWENrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUdOdmJDQTlJRnhjWjNKbGVWeGNMQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHOTBkR1ZrWEZ3cElDdGNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWjJkMGFYUnNaU2h3WVhOMFpUQW9YRnhEYjI1elpXNXpkWE1nYkc5dmNDQnpZMjl5WlZ4Y0tTa2dLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJQzB3TGpVc0lIa2dQU0F4TENCc1lXSmxiQ0E5SUhCaGMzUmxLRnhjY2lBOVhGd3NJSEp2ZFc1a0tHTnZjbkpsYkdGMGFXOXVMQ0F5S1Nrc0lITnBlbVVnUFNBMUxDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDbGNibHh1SXlNaklGQXpMaUJFVFZOUElIWnpJRlZVWEc1elkyOXlaUzUwWWlSa1pXNXphWFI1SUR3dElHZGxkRjlrWlc1emFYUjVLSE5qYjNKbExuUmlKRVJOVTA4c0lITmpiM0psTG5SaUpGVlVMQ0J1SUQwZ01UQXdLVnh1YzJOdmNtVXVkR0lnUEMwZ2MyTnZjbVV1ZEdJZ0pUNGxJR1J3YkhseU9qcGhjbkpoYm1kbEtHUmxibk5wZEhrcFhHNWpiM0p5Wld4aGRHbHZiaUE4TFNCamIzSW9jMk52Y21VdWRHSWtSRTFUVHl3Z2MyTnZjbVV1ZEdJa1ZWUXBYRzV3TkNBOExTQm5aM0JzYjNRb2MyTnZjbVV1ZEdJc0lHRmxjeWg0SUQwZ1JFMVRUeXdnZVNBOUlGVlVMQ0JqYjJ4dmNpQTlJR1JsYm5OcGRIa3BLU0FyWEc0Z0lHZGxiMjFmY0c5cGJuUW9LU0FySUZ4dUlDQnpZMkZzWlY5amIyeHZjbDkyYVhKcFpHbHpLQ2tnSzF4dUlDQjRiR2x0S0Mwd0xqVXNJREVwSUNzZ2VXeHBiU2d0TUM0MUxDQXhLU0FyWEc0Z0lHTnZiM0prWDJacGVHVmtLQ2tnSzF4dUlDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlEQXNJR052YkNBOUlGeGNaM0psZVRVd1hGd3NJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMQ0JoYkhCb1lTQTlJREF1TlN3Z1kyOXNiM0lnUFNCY1hHZHlaWGxjWENrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXdMQ0JoYkhCb1lTQTlJREF1TlN3Z1kyOXNiM0lnUFNCY1hHZHlaWGxjWENrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJQzFrYVdabVEzVjBiMlptTENCamIyd2dQU0JjWEdkeVpYbGNYQ3dnYkdsdVpYUjVjR1VnUFNCY1hHUnZkSFJsWkZ4Y0tTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z1kyOXNJRDBnWEZ4bmNtVjVYRndzSUd4cGJtVjBlWEJsSUQwZ1hGeGtiM1IwWldSY1hDa2dLMXh1SUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCblozUnBkR3hsS0hCaGMzUmxNQ2hjWEVOdmJuTmxibk4xY3lCc2IyOXdJSE5qYjNKbFhGd3BLU0FyWEc0Z0lHRnVibTkwWVhSbEtGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTFRBdU5Td2dlU0E5SURFc0lHeGhZbVZzSUQwZ2NHRnpkR1VvWEZ4eUlEMWNYQ3dnY205MWJtUW9ZMjl5Y21Wc1lYUnBiMjRzSURJcEtTd2djMmw2WlNBOUlEVXNJR052Ykc5eUlEMGdYRnhpYkdGamExeGNLVnh1WEc1Y2JpTWpJeUJRTXk0Z1pGUkJSeUIyY3lCQlNVUmNibk5qYjNKbExuUmlKR1JsYm5OcGRIa2dQQzBnWjJWMFgyUmxibk5wZEhrb2MyTnZjbVV1ZEdJa1pGUkJSeXdnYzJOdmNtVXVkR0lrUVVsRUxDQnVJRDBnTVRBd0tWeHVjMk52Y21VdWRHSWdQQzBnYzJOdmNtVXVkR0lnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dSbGJuTnBkSGtwWEc1amIzSnlaV3hoZEdsdmJpQThMU0JqYjNJb2MyTnZjbVV1ZEdJa1pGUkJSeXdnYzJOdmNtVXVkR0lrUVVsRUtWeHVjRFVnUEMwZ1oyZHdiRzkwS0hOamIzSmxMblJpTENCaFpYTW9lQ0E5SUdSVVFVY3NJSGtnUFNCQlNVUXNJR052Ykc5eUlEMGdaR1Z1YzJsMGVTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWEc0Z0lITmpZV3hsWDJOdmJHOXlYM1pwY21sa2FYTW9LU0FyWEc0Z0lIaHNhVzBvTFRBdU5Td2dNU2tnS3lCNWJHbHRLQzB3TGpVc0lERXBJQ3RjYmlBZ1kyOXZjbVJmWm1sNFpXUW9LU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ01Dd2dZMjlzSUQwZ1hGeG5jbVY1TlRCY1hDd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ4Y1ozSmxlVnhjS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ4Y1ozSmxlVnhjS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdMV1JwWm1aRGRYUnZabVlzSUdOdmJDQTlJRnhjWjNKbGVWeGNMQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHOTBkR1ZrWEZ3cElDdGNiaUFnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0JrYVdabVEzVjBiMlptTENCamIyd2dQU0JjWEdkeVpYbGNYQ3dnYkdsdVpYUjVjR1VnUFNCY1hHUnZkSFJsWkZ4Y0tTQXJYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUdkbmRHbDBiR1VvY0dGemRHVXdLRnhjUTI5dWMyVnVjM1Z6SUd4dmIzQWdjMk52Y21WY1hDa3BJQ3RjYmlBZ1lXNXViM1JoZEdVb1hGeDBaWGgwWEZ3c0lIZ2dQU0F0TUM0MUxDQjVJRDBnTVN3Z2JHRmlaV3dnUFNCd1lYTjBaU2hjWEhJZ1BWeGNMQ0J5YjNWdVpDaGpiM0p5Wld4aGRHbHZiaXdnTWlrcExDQnphWHBsSUQwZ05Td2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BYRzVjYmlNakl5QlFNeTRnWkdsbVpseHVjMk52Y21VdWRHSWtaR1Z1YzJsMGVTQThMU0JuWlhSZlpHVnVjMmwwZVNoelkyOXlaUzUwWWlSa2FXWm1YMGN4TENCelkyOXlaUzUwWWlSa2FXWm1YMkZ6ZVc1akxDQnVJRDBnTVRBd0tWeHVjMk52Y21VdWRHSWdQQzBnYzJOdmNtVXVkR0lnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dSbGJuTnBkSGtwWEc1amIzSnlaV3hoZEdsdmJpQThMU0JqYjNJb2MyTnZjbVV1ZEdJa1pHbG1abDlITVN3Z2MyTnZjbVV1ZEdJa1pHbG1abDloYzNsdVl5bGNibkEySUR3dElHZG5jR3h2ZENoelkyOXlaUzUwWWl3Z1lXVnpLSGdnUFNCa2FXWm1YMGN4TENCNUlEMGdaR2xtWmw5aGMzbHVZeXdnWTI5c2IzSWdQU0JrWlc1emFYUjVLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCY2JpQWdjMk5oYkdWZlkyOXNiM0pmZG1seWFXUnBjeWdwSUN0Y2JpQWdlR3hwYlNndE1Td2dNQzQxS1NBcklIbHNhVzBvTFRFc0lEQXVOU2tnSzF4dUlDQmpiMjl5WkY5bWFYaGxaQ2dwSUN0Y2JpQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXdMQ0JqYjJ3Z1BTQmNYR2R5WlhrMU1GeGNMQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ3dnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hGeG5jbVY1WEZ3cElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hGeG5jbVY1WEZ3cElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdMV1JwWm1aRGRYUnZabVlzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGeGNaM0psZVZ4Y0tTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGeGNaM0psZVZ4Y0tTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJQzFrYVdabVEzVjBiMlptTENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCblozUnBkR3hsS0hCaGMzUmxNQ2hjWEVOdmJuTmxibk4xY3lCc2IyOXdJSE5qYjNKbFhGd3BLU0FyWEc0Z0lHRnVibTkwWVhSbEtGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTFRFc0lIa2dQU0F3TGpVc0lHeGhZbVZzSUQwZ2NHRnpkR1VvWEZ4eUlEMWNYQ3dnY205MWJtUW9ZMjl5Y21Wc1lYUnBiMjRzSURJcEtTd2djMmw2WlNBOUlEVXNJR052Ykc5eUlEMGdYRnhpYkdGamExeGNLVnh1WEc1Y2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0Z4Y1kyOXVjMlZ1YzNWelgzTmpiM0psWDNOallYUjBaWEp3Ykc5MFgzQjFNVEF3Y0hveE1EQmZSekYyYzBGemVXNWpMbkJ1WjF4Y0tTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRITWdQU0JjWEdsdVhGd3NJSGRwWkhSb0lEMGdOU295TGpVc0lHaGxhV2RvZENBOUlESXVOU295TGpVcFhHNXdjbWx1ZENoamIzZHdiRzkwT2pwd2JHOTBYMmR5YVdRb2NERXNJSEF5TENCd015d2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjRFFzSUhBMUxDQndOaXdnWVd4cFoyNGdQU0JjWEdoY1hDd2dibU52YkNBOUlETXBLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1hGeGpiMjV6Wlc1emRYTmZjMk52Y21WZmMyTmhkSFJsY25Cc2IzUmZjSFV4TURCd2VqRXdNRjlITVhaelFYTjVibU11YzNablhGd3BLU3dnZDJsa2RHZ2dQU0ExS2pJdU5Td2dhR1ZwWjJoMElEMGdNaTQxS2pJdU5TbGNibkJ5YVc1MEtHTnZkM0JzYjNRNk9uQnNiM1JmWjNKcFpDaHdNU3dnY0RJc0lIQXpMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J3TkN3Z2NEVXNJSEEyTENCaGJHbG5iaUE5SUZ4Y2FGeGNMQ0J1WTI5c0lEMGdNeWtwWEc1a1pYWXViMlptS0NsY2JseHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5kaWZmQ3V0b2ZmID0gMC4yXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX3Njb3JlLnRzdlxcKSlcblxudGVtcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZV9hc3luYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGlkLCBVVCwgQUlEKVxuXG5zY29yZS50YiA8LSBkYXRhICU+JSBkcGx5cjo6ZnVsbF9qb2luKHRlbXAsIGJ5ID0gYyhcXGlkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShkaWZmX0cxID0gZFRBRyAtIERNU08sXG4gICAgICAgICAgICAgICAgICBkaWZmX2FzeW5jID0gQUlEIC0gVVQpXG5cblxuIyMjIFAxLiBVVCB2cyBBSURcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkVVQsIHNjb3JlLnRiJEFJRCwgbiA9IDEwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJFVULCBzY29yZS50YiRBSUQpXG5wMSA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gVVQsIHkgPSBBSUQsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyBQMS4gRE1TTyB2cyBkVEFHXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJGRUQUcsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRETVNPLCBzY29yZS50YiRkVEFHKVxucDIgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IERNU08sIHkgPSBkVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG5cbiMjIyBQMy4gRE1TTyB2cyBBNDg1XG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJEE0ODUsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRETVNPLCBzY29yZS50YiRBNDg1KVxucDMgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IERNU08sIHkgPSBBNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG4jIyMgUDMuIERNU08gdnMgVVRcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkRE1TTywgc2NvcmUudGIkVVQsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRETVNPLCBzY29yZS50YiRVVClcbnA0IDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gVVQsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cblxuIyMjIFAzLiBkVEFHIHZzIEFJRFxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRkVEFHLCBzY29yZS50YiRBSUQsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRkVEFHLCBzY29yZS50YiRBSUQpXG5wNSA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gZFRBRywgeSA9IEFJRCwgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIFAzLiBkaWZmXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJGRpZmZfRzEsIHNjb3JlLnRiJGRpZmZfYXN5bmMsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRkaWZmX0cxLCBzY29yZS50YiRkaWZmX2FzeW5jKVxucDYgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IGRpZmZfRzEsIHkgPSBkaWZmX2FzeW5jLCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0xLCAwLjUpICsgeWxpbSgtMSwgMC41KSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cblxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxjb25zZW5zdXNfc2NvcmVfc2NhdHRlcnBsb3RfcHUxMDBwejEwMF9HMXZzQXN5bmMucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSA1KjIuNSwgaGVpZ2h0ID0gMi41KjIuNSlcbnByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIHAzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICBwNCwgcDUsIHA2LCBhbGlnbiA9IFxcaFxcLCBuY29sID0gMykpXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChcXGNvbnNlbnN1c19zY29yZV9zY2F0dGVycGxvdF9wdTEwMHB6MTAwX0cxdnNBc3luYy5zdmdcXCkpLCB3aWR0aCA9IDUqMi41LCBoZWlnaHQgPSAyLjUqMi41KVxucHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgcDMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgIHA0LCBwNSwgcDYsIGFsaWduID0gXFxoXFwsIG5jb2wgPSAzKSlcbmRldi5vZmYoKVxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGlmZkN1dG9mZiA9IDAuMlxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZS50c3ZcXCkpXG5cbnRlbXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmVfYXN5bmMudHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgVVQsIEFJRClcblxuc2NvcmUudGIgPC0gZGF0YSAlPiUgZHBseXI6OmZ1bGxfam9pbih0ZW1wLCBieSA9IGMoXFxpZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlmZl9HMSA9IGRUQUcgLSBETVNPLFxuICAgICAgICAgICAgICAgICAgZGlmZl9hc3luYyA9IEFJRCAtIFVUKVxuXG5cbiMjIyBQMS4gVVQgdnMgQUlEXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJFVULCBzY29yZS50YiRBSUQsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRVVCwgc2NvcmUudGIkQUlEKVxucDEgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IFVULCB5ID0gQUlELCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG4jIyMgUDEuIERNU08gdnMgZFRBR1xuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRETVNPLCBzY29yZS50YiRkVEFHLCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkZFRBRylcbnAyIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuXG4jIyMgUDMuIERNU08gdnMgQTQ4NVxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRETVNPLCBzY29yZS50YiRBNDg1LCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkQTQ4NSlcbnAzIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIFAzLiBETVNPIHZzIFVUXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJFVULCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkVVQpXG5wNCA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gRE1TTywgeSA9IFVULCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG5cbiMjIyBQMy4gZFRBRyB2cyBBSURcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkZFRBRywgc2NvcmUudGIkQUlELCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkZFRBRywgc2NvcmUudGIkQUlEKVxucDUgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IGRUQUcsIHkgPSBBSUQsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyBQMy4gZGlmZlxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRkaWZmX0cxLCBzY29yZS50YiRkaWZmX2FzeW5jLCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkZGlmZl9HMSwgc2NvcmUudGIkZGlmZl9hc3luYylcbnA2IDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBkaWZmX0cxLCB5ID0gZGlmZl9hc3luYywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMSwgMC41KSArIHlsaW0oLTEsIDAuNSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTEsIHkgPSAwLjUsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG5cbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKFxcY29uc2Vuc3VzX3Njb3JlX3NjYXR0ZXJwbG90X3B1MTAwcHoxMDBfRzF2c0FzeW5jLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNSoyLjUsIGhlaWdodCA9IDIuNSoyLjUpXG5wcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBwMywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgcDQsIHA1LCBwNiwgYWxpZ24gPSBcXGhcXCwgbmNvbCA9IDMpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxjb25zZW5zdXNfc2NvcmVfc2NhdHRlcnBsb3RfcHUxMDBwejEwMF9HMXZzQXN5bmMuc3ZnXFwpKSwgd2lkdGggPSA1KjIuNSwgaGVpZ2h0ID0gMi41KjIuNSlcbnByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIHAzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICBwNCwgcDUsIHA2LCBhbGlnbiA9IFxcaFxcLCBuY29sID0gMykpXG5kZXYub2ZmKClcblxuXG5gYGBcbmBgYCJ9 -->

```r
```r
diffCutoff = 0.2
data <- fread(here(consensusDir, \chromo_cons_score.tsv\))

temp <- fread(here(consensusDir, \chromo_cons_score_async.tsv\)) %>%
  dplyr::select(id, UT, AID)

score.tb <- data %>% dplyr::full_join(temp, by = c(\id\)) %>%
  dplyr::mutate(diff_G1 = dTAG - DMSO,
                  diff_async = AID - UT)


### P1. UT vs AID
score.tb$density <- get_density(score.tb$UT, score.tb$AID, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$UT, score.tb$AID)
p1 <- ggplot(score.tb, aes(x = UT, y = AID, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P1. DMSO vs dTAG
score.tb$density <- get_density(score.tb$DMSO, score.tb$dTAG, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$dTAG)
p2 <- ggplot(score.tb, aes(x = DMSO, y = dTAG, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


### P3. DMSO vs A485
score.tb$density <- get_density(score.tb$DMSO, score.tb$A485, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$A485)
p3 <- ggplot(score.tb, aes(x = DMSO, y = A485, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P3. DMSO vs UT
score.tb$density <- get_density(score.tb$DMSO, score.tb$UT, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$UT)
p4 <- ggplot(score.tb, aes(x = DMSO, y = UT, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


### P3. dTAG vs AID
score.tb$density <- get_density(score.tb$dTAG, score.tb$AID, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$dTAG, score.tb$AID)
p5 <- ggplot(score.tb, aes(x = dTAG, y = AID, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P3. diff
score.tb$density <- get_density(score.tb$diff_G1, score.tb$diff_async, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$diff_G1, score.tb$diff_async)
p6 <- ggplot(score.tb, aes(x = diff_G1, y = diff_async, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-1, 0.5) + ylim(-1, 0.5) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_hline(yintercept = diffCutoff, alpha = 0.5, color = \grey\) +
  geom_hline(yintercept = -diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = -diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -1, y = 0.5, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


png(here(figDir, paste0(\consensus_score_scatterplot_pu100pz100_G1vsAsync.png\)), res = 600, units = \in\, width = 5*2.5, height = 2.5*2.5)
print(cowplot::plot_grid(p1, p2, p3, 
                         p4, p5, p6, align = \h\, ncol = 3))
dev.off()
svglite(here(figDir, paste0(\consensus_score_scatterplot_pu100pz100_G1vsAsync.svg\)), width = 5*2.5, height = 2.5*2.5)
print(cowplot::plot_grid(p1, p2, p3, 
                         p4, p5, p6, align = \h\, ncol = 3))
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR1Z0Y0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsTG1KbFpIQmxYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaHlaWE1nUFNCV015QXRJRll5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsa0lEMGdjR0Z6ZEdVb1ZqRXNJSEpsY3l3Z1ZqSXNJRlkxTENCelpYQWdQU0JjSWw5Y0lpa3BYRzV5WldkSlJDQThMU0IwWlcxd0pHbGtYRzVjYm1ScFptWkRkWFJ2Wm1ZZ1BTQXdMakpjYm1SaGRHRWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZmMyTnZjbVV1ZEhOMlhDSXBLVnh1WEc1MFpXMXdJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgzTmpiM0psWDJGemVXNWpMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvYVdRc0lGVlVMQ0JCU1VRcFhHNWNibk5qYjNKbExuUmlJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBtZFd4c1gycHZhVzRvZEdWdGNDd2dZbmtnUFNCaktGd2lhV1JjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1JwWm1aZlJ6RWdQU0JrVkVGSElDMGdSRTFUVHl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnBabVpmWVhONWJtTWdQU0JCU1VRZ0xTQlZWQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2FXUWdKV2x1SlNCeVpXZEpSQ2xjYmx4dVhHNGpJeU1nVURFdUlGVlVJSFp6SUVGSlJGeHVjMk52Y21VdWRHSWtaR1Z1YzJsMGVTQThMU0JuWlhSZlpHVnVjMmwwZVNoelkyOXlaUzUwWWlSVlZDd2djMk52Y21VdWRHSWtRVWxFTENCdUlEMGdNVEF3S1Z4dWMyTnZjbVV1ZEdJZ1BDMGdjMk52Y21VdWRHSWdKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JsYm5OcGRIa3BYRzVqYjNKeVpXeGhkR2x2YmlBOExTQmpiM0lvYzJOdmNtVXVkR0lrVlZRc0lITmpiM0psTG5SaUpFRkpSQ2xjYm5BeElEd3RJR2RuY0d4dmRDaHpZMjl5WlM1MFlpd2dZV1Z6S0hnZ1BTQlZWQ3dnZVNBOUlFRkpSQ3dnWTI5c2IzSWdQU0JrWlc1emFYUjVLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCY2JpQWdjMk5oYkdWZlkyOXNiM0pmZG1seWFXUnBjeWdwSUN0Y2JpQWdlR3hwYlNndE1DNDFMQ0F4S1NBcklIbHNhVzBvTFRBdU5Td2dNU2tnSzF4dUlDQmpiMjl5WkY5bWFYaGxaQ2dwSUN0Y2JpQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXdMQ0JqYjJ3Z1BTQmNJbWR5WlhrMU1Gd2lMQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ3dnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hDSm5jbVY1WENJcElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdNQ3dnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hDSm5jbVY1WENJcElDdGNiaUFnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0F0WkdsbVprTjFkRzltWml3Z1kyOXNJRDBnWENKbmNtVjVYQ0lzSUd4cGJtVjBlWEJsSUQwZ1hDSmtiM1IwWldSY0lpa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SUdScFptWkRkWFJ2Wm1Zc0lHTnZiQ0E5SUZ3aVozSmxlVndpTENCc2FXNWxkSGx3WlNBOUlGd2laRzkwZEdWa1hDSXBJQ3RjYmlBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1oyZDBhWFJzWlNod1lYTjBaVEFvWENKRGIyNXpaVzV6ZFhNZ2JHOXZjQ0J6WTI5eVpWd2lLU2tnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SUMwd0xqVXNJSGtnUFNBeExDQnNZV0psYkNBOUlIQmhjM1JsS0Z3aWNpQTlYQ0lzSUhKdmRXNWtLR052Y25KbGJHRjBhVzl1TENBeUtTa3NJSE5wZW1VZ1BTQTFMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaWxjYmx4dUl5TWpJRkF4TGlCRVRWTlBJSFp6SUdSVVFVZGNibk5qYjNKbExuUmlKR1JsYm5OcGRIa2dQQzBnWjJWMFgyUmxibk5wZEhrb2MyTnZjbVV1ZEdJa1JFMVRUeXdnYzJOdmNtVXVkR0lrWkZSQlJ5d2diaUE5SURFd01DbGNibk5qYjNKbExuUmlJRHd0SUhOamIzSmxMblJpSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pXNXphWFI1S1Z4dVkyOXljbVZzWVhScGIyNGdQQzBnWTI5eUtITmpiM0psTG5SaUpFUk5VMDhzSUhOamIzSmxMblJpSkdSVVFVY3BYRzV3TWlBOExTQm5aM0JzYjNRb2MyTnZjbVV1ZEdJc0lHRmxjeWg0SUQwZ1JFMVRUeXdnZVNBOUlHUlVRVWNzSUdOdmJHOXlJRDBnWkdWdWMybDBlU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1hHNGdJSE5qWVd4bFgyTnZiRzl5WDNacGNtbGthWE1vS1NBclhHNGdJSGhzYVcwb0xUQXVOU3dnTVNrZ0t5QjViR2x0S0Mwd0xqVXNJREVwSUN0Y2JpQWdZMjl2Y21SZlptbDRaV1FvS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdNQ3dnWTI5c0lEMGdYQ0puY21WNU5UQmNJaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGd2laM0psZVZ3aUtTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGd2laM0psZVZ3aUtTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTFdScFptWkRkWFJ2Wm1Zc0lHTnZiQ0E5SUZ3aVozSmxlVndpTENCc2FXNWxkSGx3WlNBOUlGd2laRzkwZEdWa1hDSXBJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY0ltZHlaWGxjSWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJ2ZEhSbFpGd2lLU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHZG5kR2wwYkdVb2NHRnpkR1V3S0Z3aVEyOXVjMlZ1YzNWeklHeHZiM0FnYzJOdmNtVmNJaWtwSUN0Y2JpQWdZVzV1YjNSaGRHVW9YQ0owWlhoMFhDSXNJSGdnUFNBdE1DNDFMQ0I1SUQwZ01Td2diR0ZpWld3Z1BTQndZWE4wWlNoY0luSWdQVndpTENCeWIzVnVaQ2hqYjNKeVpXeGhkR2x2Yml3Z01pa3BMQ0J6YVhwbElEMGdOU3dnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwWEc1Y2JseHVJeU1qSUZBekxpQkVUVk5QSUhaeklFRTBPRFZjYm5OamIzSmxMblJpSkdSbGJuTnBkSGtnUEMwZ1oyVjBYMlJsYm5OcGRIa29jMk52Y21VdWRHSWtSRTFUVHl3Z2MyTnZjbVV1ZEdJa1FUUTROU3dnYmlBOUlERXdNQ2xjYm5OamIzSmxMblJpSUR3dElITmpiM0psTG5SaUlDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaVzV6YVhSNUtWeHVZMjl5Y21Wc1lYUnBiMjRnUEMwZ1kyOXlLSE5qYjNKbExuUmlKRVJOVTA4c0lITmpiM0psTG5SaUpFRTBPRFVwWEc1d015QThMU0JuWjNCc2IzUW9jMk52Y21VdWRHSXNJR0ZsY3loNElEMGdSRTFUVHl3Z2VTQTlJRUUwT0RVc0lHTnZiRzl5SUQwZ1pHVnVjMmwwZVNrcElDdGNiaUFnWjJWdmJWOXdiMmx1ZENncElDc2dYRzRnSUhOallXeGxYMk52Ykc5eVgzWnBjbWxrYVhNb0tTQXJYRzRnSUhoc2FXMG9MVEF1TlN3Z01Ta2dLeUI1YkdsdEtDMHdMalVzSURFcElDdGNiaUFnWTI5dmNtUmZabWw0WldRb0tTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTUN3Z1kyOXNJRDBnWENKbmNtVjVOVEJjSWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJoYzJobFpGd2lLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRndpWjNKbGVWd2lLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRndpWjNKbGVWd2lLU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ0xXUnBabVpEZFhSdlptWXNJR052YkNBOUlGd2laM0psZVZ3aUxDQnNhVzVsZEhsd1pTQTlJRndpWkc5MGRHVmtYQ0lwSUN0Y2JpQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQmthV1ptUTNWMGIyWm1MQ0JqYjJ3Z1BTQmNJbWR5WlhsY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SdmRIUmxaRndpS1NBclhHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJR2RuZEdsMGJHVW9jR0Z6ZEdVd0tGd2lRMjl1YzJWdWMzVnpJR3h2YjNBZ2MyTnZjbVZjSWlrcElDdGNiaUFnWVc1dWIzUmhkR1VvWENKMFpYaDBYQ0lzSUhnZ1BTQXRNQzQxTENCNUlEMGdNU3dnYkdGaVpXd2dQU0J3WVhOMFpTaGNJbklnUFZ3aUxDQnliM1Z1WkNoamIzSnlaV3hoZEdsdmJpd2dNaWtwTENCemFYcGxJRDBnTlN3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJcFhHNWNiaU1qSXlCUU15NGdSRTFUVHlCMmN5QlZWRnh1YzJOdmNtVXVkR0lrWkdWdWMybDBlU0E4TFNCblpYUmZaR1Z1YzJsMGVTaHpZMjl5WlM1MFlpUkVUVk5QTENCelkyOXlaUzUwWWlSVlZDd2diaUE5SURFd01DbGNibk5qYjNKbExuUmlJRHd0SUhOamIzSmxMblJpSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pXNXphWFI1S1Z4dVkyOXljbVZzWVhScGIyNGdQQzBnWTI5eUtITmpiM0psTG5SaUpFUk5VMDhzSUhOamIzSmxMblJpSkZWVUtWeHVjRFFnUEMwZ1oyZHdiRzkwS0hOamIzSmxMblJpTENCaFpYTW9lQ0E5SUVSTlUwOHNJSGtnUFNCVlZDd2dZMjlzYjNJZ1BTQmtaVzV6YVhSNUtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJjYmlBZ2MyTmhiR1ZmWTI5c2IzSmZkbWx5YVdScGN5Z3BJQ3RjYmlBZ2VHeHBiU2d0TUM0MUxDQXhLU0FySUhsc2FXMG9MVEF1TlN3Z01Ta2dLMXh1SUNCamIyOXlaRjltYVhobFpDZ3BJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBd0xDQmpiMndnUFNCY0ltZHlaWGsxTUZ3aUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Dd2dZV3h3YUdFZ1BTQXdMalVzSUdOdmJHOXlJRDBnWENKbmNtVjVYQ0lwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ01Dd2dZV3h3YUdFZ1BTQXdMalVzSUdOdmJHOXlJRDBnWENKbmNtVjVYQ0lwSUN0Y2JpQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXRaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYQ0puY21WNVhDSXNJR3hwYm1WMGVYQmxJRDBnWENKa2IzUjBaV1JjSWlrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUdOdmJDQTlJRndpWjNKbGVWd2lMQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHOTBkR1ZrWENJcElDdGNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWjJkMGFYUnNaU2h3WVhOMFpUQW9YQ0pEYjI1elpXNXpkWE1nYkc5dmNDQnpZMjl5WlZ3aUtTa2dLMXh1SUNCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJQzB3TGpVc0lIa2dQU0F4TENCc1lXSmxiQ0E5SUhCaGMzUmxLRndpY2lBOVhDSXNJSEp2ZFc1a0tHTnZjbkpsYkdGMGFXOXVMQ0F5S1Nrc0lITnBlbVVnUFNBMUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpbGNibHh1WEc0akl5TWdVRE11SUdSVVFVY2dkbk1nUVVsRVhHNXpZMjl5WlM1MFlpUmtaVzV6YVhSNUlEd3RJR2RsZEY5a1pXNXphWFI1S0hOamIzSmxMblJpSkdSVVFVY3NJSE5qYjNKbExuUmlKRUZKUkN3Z2JpQTlJREV3TUNsY2JuTmpiM0psTG5SaUlEd3RJSE5qYjNKbExuUmlJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlc1emFYUjVLVnh1WTI5eWNtVnNZWFJwYjI0Z1BDMGdZMjl5S0hOamIzSmxMblJpSkdSVVFVY3NJSE5qYjNKbExuUmlKRUZKUkNsY2JuQTFJRHd0SUdkbmNHeHZkQ2h6WTI5eVpTNTBZaXdnWVdWektIZ2dQU0JrVkVGSExDQjVJRDBnUVVsRUxDQmpiMnh2Y2lBOUlHUmxibk5wZEhrcEtTQXJYRzRnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJRnh1SUNCelkyRnNaVjlqYjJ4dmNsOTJhWEpwWkdsektDa2dLMXh1SUNCNGJHbHRLQzB3TGpVc0lERXBJQ3NnZVd4cGJTZ3RNQzQxTENBeEtTQXJYRzRnSUdOdmIzSmtYMlpwZUdWa0tDa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SURBc0lHTnZiQ0E5SUZ3aVozSmxlVFV3WENJc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlDMWthV1ptUTNWMGIyWm1MQ0JqYjJ3Z1BTQmNJbWR5WlhsY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SdmRIUmxaRndpS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYQ0puY21WNVhDSXNJR3hwYm1WMGVYQmxJRDBnWENKa2IzUjBaV1JjSWlrZ0sxeHVJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJuWjNScGRHeGxLSEJoYzNSbE1DaGNJa052Ym5ObGJuTjFjeUJzYjI5d0lITmpiM0psWENJcEtTQXJYRzRnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdMVEF1TlN3Z2VTQTlJREVzSUd4aFltVnNJRDBnY0dGemRHVW9YQ0p5SUQxY0lpd2djbTkxYm1Rb1kyOXljbVZzWVhScGIyNHNJRElwS1N3Z2MybDZaU0E5SURVc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUtWeHVYRzRqSXlNZ1VETXVJR1JwWm1aY2JuTmpiM0psTG5SaUpHUmxibk5wZEhrZ1BDMGdaMlYwWDJSbGJuTnBkSGtvYzJOdmNtVXVkR0lrWkdsbVpsOUhNU3dnYzJOdmNtVXVkR0lrWkdsbVpsOWhjM2x1WXl3Z2JpQTlJREV3TUNsY2JuTmpiM0psTG5SaUlEd3RJSE5qYjNKbExuUmlJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlc1emFYUjVLVnh1WTI5eWNtVnNZWFJwYjI0Z1BDMGdZMjl5S0hOamIzSmxMblJpSkdScFptWmZSekVzSUhOamIzSmxMblJpSkdScFptWmZZWE41Ym1NcFhHNXdOaUE4TFNCblozQnNiM1FvYzJOdmNtVXVkR0lzSUdGbGN5aDRJRDBnWkdsbVpsOUhNU3dnZVNBOUlHUnBabVpmWVhONWJtTXNJR052Ykc5eUlEMGdaR1Z1YzJsMGVTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWEc0Z0lITmpZV3hsWDJOdmJHOXlYM1pwY21sa2FYTW9LU0FyWEc0Z0lIaHNhVzBvTFRFc0lEQXVOU2tnS3lCNWJHbHRLQzB4TENBd0xqVXBJQ3RjYmlBZ1kyOXZjbVJmWm1sNFpXUW9LU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ01Dd2dZMjlzSUQwZ1hDSm5jbVY1TlRCY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ3aVozSmxlVndpS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ3aVozSmxlVndpS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlHUnBabVpEZFhSdlptWXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ3aVozSmxlVndpS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMWthV1ptUTNWMGIyWm1MQ0JoYkhCb1lTQTlJREF1TlN3Z1kyOXNiM0lnUFNCY0ltZHlaWGxjSWlrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQmthV1ptUTNWMGIyWm1MQ0JoYkhCb1lTQTlJREF1TlN3Z1kyOXNiM0lnUFNCY0ltZHlaWGxjSWlrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXRaR2xtWmtOMWRHOW1aaXdnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hDSm5jbVY1WENJcElDdGNiaUFnSUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCblozUnBkR3hsS0hCaGMzUmxNQ2hjSWtOdmJuTmxibk4xY3lCc2IyOXdJSE5qYjNKbFhDSXBLU0FyWEc0Z0lHRnVibTkwWVhSbEtGd2lkR1Y0ZEZ3aUxDQjRJRDBnTFRFc0lIa2dQU0F3TGpVc0lHeGhZbVZzSUQwZ2NHRnpkR1VvWENKeUlEMWNJaXdnY205MWJtUW9ZMjl5Y21Wc1lYUnBiMjRzSURJcEtTd2djMmw2WlNBOUlEVXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lLVnh1WEc1Y2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0Z3aVkyOXVjMlZ1YzNWelgzTmpiM0psWDNOallYUjBaWEp3Ykc5MFgzQjFNVEF3Y0hveE1EQmZSekYyYzBGemVXNWpYM0psWnk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFJ6SUQwZ1hDSnBibHdpTENCM2FXUjBhQ0E5SURVcU1pNDFMQ0JvWldsbmFIUWdQU0F5TGpVcU1pNDFLVnh1Y0hKcGJuUW9ZMjkzY0d4dmREbzZjR3h2ZEY5bmNtbGtLSEF4TENCd01pd2djRE1zSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhBMExDQndOU3dnY0RZc0lHRnNhV2R1SUQwZ1hDSm9YQ0lzSUc1amIyd2dQU0F6S1NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLRndpWTI5dWMyVnVjM1Z6WDNOamIzSmxYM05qWVhSMFpYSndiRzkwWDNCMU1UQXdjSG94TURCZlJ6RjJjMEZ6ZVc1algzSmxaeTV6ZG1kY0lpa3BMQ0IzYVdSMGFDQTlJRFVxTWk0MUxDQm9aV2xuYUhRZ1BTQXlMalVxTWk0MUtWeHVjSEpwYm5Rb1kyOTNjR3h2ZERvNmNHeHZkRjluY21sa0tIQXhMQ0J3TWl3Z2NETXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEEwTENCd05Td2djRFlzSUdGc2FXZHVJRDBnWENKb1hDSXNJRzVqYjJ3Z1BTQXpLU2xjYm1SbGRpNXZabVlvS1Z4dVhHNWNiaU1qSXlNakl5TWpJeU1nVTJGMmFXNW5JRUZ6ZVc1aklHRnVaQ0JITVNCemNHVmphV1pwWXlCeVpXZDFiR0YwYjNKNUlHeHZiM0JjYm1ScFptWkRkWFJ2Wm1ZZ1BDMGdNQzR5WEc1MFpXMXdJRHd0SUhOamIzSmxMblJpSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dScFptWmZSekVnUGowZ0xXUnBabVpEZFhSdlptWXNJR1JwWm1aZllYTjVibU1nUGowZ0xXUnBabVpEZFhSdlptWXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0hObGNTZ3hMQ0EzS1NsY2JtWjNjbWwwWlNoMFpXMXdMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKamFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNCbExYQmxYMGN4ZG5OQmMzbHVZMTlpYjNSb1VtVjBZV2x1WldRdVltVmtjR1ZjSWlrc0lITmxjQ0E5SUZ3aVhGeDBYQ0lzSUdOdmJDNXVZVzFsY3lBOUlFWkJURk5GS1Z4dVhHNTBaVzF3SUR3dElITmpiM0psTG5SaUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHUnBabVpmUnpFZ1BqMGdMV1JwWm1aRGRYUnZabVlzSUdScFptWmZZWE41Ym1NZ1BDQXRaR2xtWmtOMWRHOW1aaWtnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb2MyVnhLREVzSURjcEtWeHVabmR5YVhSbEtIUmxiWEFzSUdobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZmNHVXRjR1ZmUnpGMmMwRnplVzVqWDBGemVXNWpVM0JsWTJsbWFXTlFaWEowTG1KbFpIQmxYQ0lwTENCelpYQWdQU0JjSWx4Y2RGd2lMQ0JqYjJ3dWJtRnRaWE1nUFNCR1FVeFRSU2xjYmx4dWRHVnRjQ0E4TFNCelkyOXlaUzUwWWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loa2FXWm1YMGN4SUR3Z0xXUnBabVpEZFhSdlptWXNJR1JwWm1aZllYTjVibU1nUGowZ0xXUnBabVpEZFhSdlptWXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0hObGNTZ3hMQ0EzS1NsY2JtWjNjbWwwWlNoMFpXMXdMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKamFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNCbExYQmxYMGN4ZG5OQmMzbHVZMTlITVZOd1pXTnBabWxqVUdWeWRDNWlaV1J3WlZ3aUtTd2djMlZ3SUQwZ1hDSmNYSFJjSWl3Z1kyOXNMbTVoYldWeklEMGdSa0ZNVTBVcFhHNWNiblJsYlhBZ1BDMGdjMk52Y21VdWRHSWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aR2xtWmw5SE1TQThJQzFrYVdabVEzVjBiMlptTENCa2FXWm1YMkZ6ZVc1aklEd2dMV1JwWm1aRGRYUnZabVlwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtITmxjU2d4TENBM0tTbGNibVozY21sMFpTaDBaVzF3TENCb1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDBjeGRuTkJjM2x1WTE5aWIzUm9VR1Z5ZEM1aVpXUndaVndpS1N3Z2MyVndJRDBnWENKY1hIUmNJaXdnWTI5c0xtNWhiV1Z6SUQwZ1JrRk1VMFVwWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG50ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHJlcyA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgcmVzLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcbnJlZ0lEIDwtIHRlbXAkaWRcblxuZGlmZkN1dG9mZiA9IDAuMlxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZS50c3ZcXCkpXG5cbnRlbXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmVfYXN5bmMudHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgVVQsIEFJRClcblxuc2NvcmUudGIgPC0gZGF0YSAlPiUgZHBseXI6OmZ1bGxfam9pbih0ZW1wLCBieSA9IGMoXFxpZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlmZl9HMSA9IGRUQUcgLSBETVNPLFxuICAgICAgICAgICAgICAgICAgZGlmZl9hc3luYyA9IEFJRCAtIFVUKSAlPiVcbiAgZHBseXI6OmZpbHRlcihpZCAlaW4lIHJlZ0lEKVxuXG5cbiMjIyBQMS4gVVQgdnMgQUlEXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJFVULCBzY29yZS50YiRBSUQsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRVVCwgc2NvcmUudGIkQUlEKVxucDEgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IFVULCB5ID0gQUlELCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG4jIyMgUDEuIERNU08gdnMgZFRBR1xuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRETVNPLCBzY29yZS50YiRkVEFHLCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkZFRBRylcbnAyIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuXG4jIyMgUDMuIERNU08gdnMgQTQ4NVxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRETVNPLCBzY29yZS50YiRBNDg1LCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkQTQ4NSlcbnAzIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIFAzLiBETVNPIHZzIFVUXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJFVULCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkVVQpXG5wNCA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gRE1TTywgeSA9IFVULCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG5cbiMjIyBQMy4gZFRBRyB2cyBBSURcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkZFRBRywgc2NvcmUudGIkQUlELCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkZFRBRywgc2NvcmUudGIkQUlEKVxucDUgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IGRUQUcsIHkgPSBBSUQsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyBQMy4gZGlmZlxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRkaWZmX0cxLCBzY29yZS50YiRkaWZmX2FzeW5jLCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkZGlmZl9HMSwgc2NvcmUudGIkZGlmZl9hc3luYylcbnA2IDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBkaWZmX0cxLCB5ID0gZGlmZl9hc3luYywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMSwgMC41KSArIHlsaW0oLTEsIDAuNSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cblxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxjb25zZW5zdXNfc2NvcmVfc2NhdHRlcnBsb3RfcHUxMDBwejEwMF9HMXZzQXN5bmNfcmVnLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNSoyLjUsIGhlaWdodCA9IDIuNSoyLjUpXG5wcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBwMywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgcDQsIHA1LCBwNiwgYWxpZ24gPSBcXGhcXCwgbmNvbCA9IDMpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxjb25zZW5zdXNfc2NvcmVfc2NhdHRlcnBsb3RfcHUxMDBwejEwMF9HMXZzQXN5bmNfcmVnLnN2Z1xcKSksIHdpZHRoID0gNSoyLjUsIGhlaWdodCA9IDIuNSoyLjUpXG5wcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBwMywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgcDQsIHA1LCBwNiwgYWxpZ24gPSBcXGhcXCwgbmNvbCA9IDMpKVxuZGV2Lm9mZigpXG5cblxuIyMjIyMjIyMjIyBTYXZpbmcgQXN5bmMgYW5kIEcxIHNwZWNpZmljIHJlZ3VsYXRvcnkgbG9vcFxuZGlmZkN1dG9mZiA8LSAwLjJcbnRlbXAgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZl9HMSA+PSAtZGlmZkN1dG9mZiwgZGlmZl9hc3luYyA+PSAtZGlmZkN1dG9mZikgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDcpKVxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX2JvdGhSZXRhaW5lZC5iZWRwZVxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5cbnRlbXAgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZl9HMSA+PSAtZGlmZkN1dG9mZiwgZGlmZl9hc3luYyA8IC1kaWZmQ3V0b2ZmKSAlPiVcbiAgZHBseXI6OnNlbGVjdChzZXEoMSwgNykpXG5md3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9HMXZzQXN5bmNfQXN5bmNTcGVjaWZpY1BlcnQuYmVkcGVcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuXG50ZW1wIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmZfRzEgPCAtZGlmZkN1dG9mZiwgZGlmZl9hc3luYyA+PSAtZGlmZkN1dG9mZikgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDcpKVxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX0cxU3BlY2lmaWNQZXJ0LmJlZHBlXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcblxudGVtcCA8LSBzY29yZS50YiAlPiUgZHBseXI6OmZpbHRlcihkaWZmX0cxIDwgLWRpZmZDdXRvZmYsIGRpZmZfYXN5bmMgPCAtZGlmZkN1dG9mZikgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDcpKVxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX2JvdGhQZXJ0LmJlZHBlXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
temp <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\)) %>%
  dplyr::mutate(res = V3 - V2,
                id = paste(V1, res, V2, V5, sep = \_\))
regID <- temp$id

diffCutoff = 0.2
data <- fread(here(consensusDir, \chromo_cons_score.tsv\))

temp <- fread(here(consensusDir, \chromo_cons_score_async.tsv\)) %>%
  dplyr::select(id, UT, AID)

score.tb <- data %>% dplyr::full_join(temp, by = c(\id\)) %>%
  dplyr::mutate(diff_G1 = dTAG - DMSO,
                  diff_async = AID - UT) %>%
  dplyr::filter(id %in% regID)


### P1. UT vs AID
score.tb$density <- get_density(score.tb$UT, score.tb$AID, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$UT, score.tb$AID)
p1 <- ggplot(score.tb, aes(x = UT, y = AID, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P1. DMSO vs dTAG
score.tb$density <- get_density(score.tb$DMSO, score.tb$dTAG, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$dTAG)
p2 <- ggplot(score.tb, aes(x = DMSO, y = dTAG, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


### P3. DMSO vs A485
score.tb$density <- get_density(score.tb$DMSO, score.tb$A485, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$A485)
p3 <- ggplot(score.tb, aes(x = DMSO, y = A485, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P3. DMSO vs UT
score.tb$density <- get_density(score.tb$DMSO, score.tb$UT, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$UT)
p4 <- ggplot(score.tb, aes(x = DMSO, y = UT, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


### P3. dTAG vs AID
score.tb$density <- get_density(score.tb$dTAG, score.tb$AID, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$dTAG, score.tb$AID)
p5 <- ggplot(score.tb, aes(x = dTAG, y = AID, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P3. diff
score.tb$density <- get_density(score.tb$diff_G1, score.tb$diff_async, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$diff_G1, score.tb$diff_async)
p6 <- ggplot(score.tb, aes(x = diff_G1, y = diff_async, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-1, 0.5) + ylim(-1, 0.5) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_hline(yintercept = diffCutoff, alpha = 0.5, color = \grey\) +
  geom_hline(yintercept = -diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = -diffCutoff, alpha = 0.5, color = \grey\) +
    theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -1, y = 0.5, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


png(here(figDir, paste0(\consensus_score_scatterplot_pu100pz100_G1vsAsync_reg.png\)), res = 600, units = \in\, width = 5*2.5, height = 2.5*2.5)
print(cowplot::plot_grid(p1, p2, p3, 
                         p4, p5, p6, align = \h\, ncol = 3))
dev.off()
svglite(here(figDir, paste0(\consensus_score_scatterplot_pu100pz100_G1vsAsync_reg.svg\)), width = 5*2.5, height = 2.5*2.5)
print(cowplot::plot_grid(p1, p2, p3, 
                         p4, p5, p6, align = \h\, ncol = 3))
dev.off()


########## Saving Async and G1 specific regulatory loop
diffCutoff <- 0.2
temp <- score.tb %>% dplyr::filter(diff_G1 >= -diffCutoff, diff_async >= -diffCutoff) %>%
  dplyr::select(seq(1, 7))
fwrite(temp, here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_bothRetained.bedpe\), sep = \\t\, col.names = FALSE)

temp <- score.tb %>% dplyr::filter(diff_G1 >= -diffCutoff, diff_async < -diffCutoff) %>%
  dplyr::select(seq(1, 7))
fwrite(temp, here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_AsyncSpecificPert.bedpe\), sep = \\t\, col.names = FALSE)

temp <- score.tb %>% dplyr::filter(diff_G1 < -diffCutoff, diff_async >= -diffCutoff) %>%
  dplyr::select(seq(1, 7))
fwrite(temp, here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_G1SpecificPert.bedpe\), sep = \\t\, col.names = FALSE)

temp <- score.tb %>% dplyr::filter(diff_G1 < -diffCutoff, diff_async < -diffCutoff) %>%
  dplyr::select(seq(1, 7))
fwrite(temp, here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_bothPert.bedpe\), sep = \\t\, col.names = FALSE)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRHVnRjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNCbExYQmxMbUpsWkhCbFhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoeVpYTWdQU0JXTXlBdElGWXlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xrSUQwZ2NHRnpkR1VvVmpFc0lISmxjeXdnVmpJc0lGWTFMQ0J6WlhBZ1BTQmNYRjljWENrcFhHNXlaV2RKUkNBOExTQjBaVzF3Skdsa1hHNWNibVJwWm1aRGRYUnZabVlnUFNBd0xqSmNibVJoZEdFZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mYzJOdmNtVXVkSE4yWEZ3cEtWeHVYRzUwWlcxd0lEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDNOamIzSmxYMkZ6ZVc1akxuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9hV1FzSUZWVUxDQkJTVVFwWEc1Y2JuTmpiM0psTG5SaUlEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1kV3hzWDJwdmFXNG9kR1Z0Y0N3Z1lua2dQU0JqS0Z4Y2FXUmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBabVpmUnpFZ1BTQmtWRUZISUMwZ1JFMVRUeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdScFptWmZZWE41Ym1NZ1BTQkJTVVFnTFNCVlZDa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvYVdRZ0pXbHVKU0J5WldkSlJDbGNibHh1WEc0akl5TWdVREV1SUZWVUlIWnpJRUZKUkZ4dWMyTnZjbVV1ZEdJa1pHVnVjMmwwZVNBOExTQm5aWFJmWkdWdWMybDBlU2h6WTI5eVpTNTBZaVJWVkN3Z2MyTnZjbVV1ZEdJa1FVbEVMQ0J1SUQwZ01UQXdLVnh1YzJOdmNtVXVkR0lnUEMwZ2MyTnZjbVV1ZEdJZ0pUNGxJR1J3YkhseU9qcGhjbkpoYm1kbEtHUmxibk5wZEhrcFhHNWpiM0p5Wld4aGRHbHZiaUE4TFNCamIzSW9jMk52Y21VdWRHSWtWVlFzSUhOamIzSmxMblJpSkVGSlJDbGNibkF4SUR3dElHZG5jR3h2ZENoelkyOXlaUzUwWWl3Z1lXVnpLSGdnUFNCVlZDd2dlU0E5SUVGSlJDd2dZMjlzYjNJZ1BTQmtaVzV6YVhSNUtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJjYmlBZ2MyTmhiR1ZmWTI5c2IzSmZkbWx5YVdScGN5Z3BJQ3RjYmlBZ2VHeHBiU2d0TUM0MUxDQXhLU0FySUhsc2FXMG9MVEF1TlN3Z01Ta2dLMXh1SUNCamIyOXlaRjltYVhobFpDZ3BJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBd0xDQmpiMndnUFNCY1hHZHlaWGsxTUZ4Y0xDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Dd2dZV3h3YUdFZ1BTQXdMalVzSUdOdmJHOXlJRDBnWEZ4bmNtVjVYRndwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ01Dd2dZV3h3YUdFZ1BTQXdMalVzSUdOdmJHOXlJRDBnWEZ4bmNtVjVYRndwSUN0Y2JpQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXRaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYRnhuY21WNVhGd3NJR3hwYm1WMGVYQmxJRDBnWEZ4a2IzUjBaV1JjWENrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUdOdmJDQTlJRnhjWjNKbGVWeGNMQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHOTBkR1ZrWEZ3cElDdGNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWjJkMGFYUnNaU2h3WVhOMFpUQW9YRnhEYjI1elpXNXpkWE1nYkc5dmNDQnpZMjl5WlZ4Y0tTa2dLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJQzB3TGpVc0lIa2dQU0F4TENCc1lXSmxiQ0E5SUhCaGMzUmxLRnhjY2lBOVhGd3NJSEp2ZFc1a0tHTnZjbkpsYkdGMGFXOXVMQ0F5S1Nrc0lITnBlbVVnUFNBMUxDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDbGNibHh1SXlNaklGQXhMaUJFVFZOUElIWnpJR1JVUVVkY2JuTmpiM0psTG5SaUpHUmxibk5wZEhrZ1BDMGdaMlYwWDJSbGJuTnBkSGtvYzJOdmNtVXVkR0lrUkUxVFR5d2djMk52Y21VdWRHSWtaRlJCUnl3Z2JpQTlJREV3TUNsY2JuTmpiM0psTG5SaUlEd3RJSE5qYjNKbExuUmlJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlc1emFYUjVLVnh1WTI5eWNtVnNZWFJwYjI0Z1BDMGdZMjl5S0hOamIzSmxMblJpSkVSTlUwOHNJSE5qYjNKbExuUmlKR1JVUVVjcFhHNXdNaUE4TFNCblozQnNiM1FvYzJOdmNtVXVkR0lzSUdGbGN5aDRJRDBnUkUxVFR5d2dlU0E5SUdSVVFVY3NJR052Ykc5eUlEMGdaR1Z1YzJsMGVTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWEc0Z0lITmpZV3hsWDJOdmJHOXlYM1pwY21sa2FYTW9LU0FyWEc0Z0lIaHNhVzBvTFRBdU5Td2dNU2tnS3lCNWJHbHRLQzB3TGpVc0lERXBJQ3RjYmlBZ1kyOXZjbVJmWm1sNFpXUW9LU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ01Dd2dZMjlzSUQwZ1hGeG5jbVY1TlRCY1hDd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ4Y1ozSmxlVnhjS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ4Y1ozSmxlVnhjS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdMV1JwWm1aRGRYUnZabVlzSUdOdmJDQTlJRnhjWjNKbGVWeGNMQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHOTBkR1ZrWEZ3cElDdGNiaUFnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0JrYVdabVEzVjBiMlptTENCamIyd2dQU0JjWEdkeVpYbGNYQ3dnYkdsdVpYUjVjR1VnUFNCY1hHUnZkSFJsWkZ4Y0tTQXJYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUdkbmRHbDBiR1VvY0dGemRHVXdLRnhjUTI5dWMyVnVjM1Z6SUd4dmIzQWdjMk52Y21WY1hDa3BJQ3RjYmlBZ1lXNXViM1JoZEdVb1hGeDBaWGgwWEZ3c0lIZ2dQU0F0TUM0MUxDQjVJRDBnTVN3Z2JHRmlaV3dnUFNCd1lYTjBaU2hjWEhJZ1BWeGNMQ0J5YjNWdVpDaGpiM0p5Wld4aGRHbHZiaXdnTWlrcExDQnphWHBsSUQwZ05Td2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BYRzVjYmx4dUl5TWpJRkF6TGlCRVRWTlBJSFp6SUVFME9EVmNibk5qYjNKbExuUmlKR1JsYm5OcGRIa2dQQzBnWjJWMFgyUmxibk5wZEhrb2MyTnZjbVV1ZEdJa1JFMVRUeXdnYzJOdmNtVXVkR0lrUVRRNE5Td2diaUE5SURFd01DbGNibk5qYjNKbExuUmlJRHd0SUhOamIzSmxMblJpSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pXNXphWFI1S1Z4dVkyOXljbVZzWVhScGIyNGdQQzBnWTI5eUtITmpiM0psTG5SaUpFUk5VMDhzSUhOamIzSmxMblJpSkVFME9EVXBYRzV3TXlBOExTQm5aM0JzYjNRb2MyTnZjbVV1ZEdJc0lHRmxjeWg0SUQwZ1JFMVRUeXdnZVNBOUlFRTBPRFVzSUdOdmJHOXlJRDBnWkdWdWMybDBlU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1hHNGdJSE5qWVd4bFgyTnZiRzl5WDNacGNtbGthWE1vS1NBclhHNGdJSGhzYVcwb0xUQXVOU3dnTVNrZ0t5QjViR2x0S0Mwd0xqVXNJREVwSUN0Y2JpQWdZMjl2Y21SZlptbDRaV1FvS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdNQ3dnWTI5c0lEMGdYRnhuY21WNU5UQmNYQ3dnYkdsdVpYUjVjR1VnUFNCY1hHUmhjMmhsWkZ4Y0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGeGNaM0psZVZ4Y0tTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGeGNaM0psZVZ4Y0tTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTFdScFptWkRkWFJ2Wm1Zc0lHTnZiQ0E5SUZ4Y1ozSmxlVnhjTENCc2FXNWxkSGx3WlNBOUlGeGNaRzkwZEdWa1hGd3BJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY1hHZHlaWGxjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1J2ZEhSbFpGeGNLU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHZG5kR2wwYkdVb2NHRnpkR1V3S0Z4Y1EyOXVjMlZ1YzNWeklHeHZiM0FnYzJOdmNtVmNYQ2twSUN0Y2JpQWdZVzV1YjNSaGRHVW9YRngwWlhoMFhGd3NJSGdnUFNBdE1DNDFMQ0I1SUQwZ01Td2diR0ZpWld3Z1BTQndZWE4wWlNoY1hISWdQVnhjTENCeWIzVnVaQ2hqYjNKeVpXeGhkR2x2Yml3Z01pa3BMQ0J6YVhwbElEMGdOU3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndwWEc1Y2JpTWpJeUJRTXk0Z1JFMVRUeUIyY3lCVlZGeHVjMk52Y21VdWRHSWtaR1Z1YzJsMGVTQThMU0JuWlhSZlpHVnVjMmwwZVNoelkyOXlaUzUwWWlSRVRWTlBMQ0J6WTI5eVpTNTBZaVJWVkN3Z2JpQTlJREV3TUNsY2JuTmpiM0psTG5SaUlEd3RJSE5qYjNKbExuUmlJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlc1emFYUjVLVnh1WTI5eWNtVnNZWFJwYjI0Z1BDMGdZMjl5S0hOamIzSmxMblJpSkVSTlUwOHNJSE5qYjNKbExuUmlKRlZVS1Z4dWNEUWdQQzBnWjJkd2JHOTBLSE5qYjNKbExuUmlMQ0JoWlhNb2VDQTlJRVJOVTA4c0lIa2dQU0JWVkN3Z1kyOXNiM0lnUFNCa1pXNXphWFI1S1NrZ0sxeHVJQ0JuWlc5dFgzQnZhVzUwS0NrZ0t5QmNiaUFnYzJOaGJHVmZZMjlzYjNKZmRtbHlhV1JwY3lncElDdGNiaUFnZUd4cGJTZ3RNQzQxTENBeEtTQXJJSGxzYVcwb0xUQXVOU3dnTVNrZ0sxeHVJQ0JqYjI5eVpGOW1hWGhsWkNncElDdGNiaUFnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0F3TENCamIyd2dQU0JjWEdkeVpYazFNRnhjTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUN3Z1lXeHdhR0VnUFNBd0xqVXNJR052Ykc5eUlEMGdYRnhuY21WNVhGd3BJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUN3Z1lXeHdhR0VnUFNBd0xqVXNJR052Ykc5eUlEMGdYRnhuY21WNVhGd3BJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBdFpHbG1aa04xZEc5bVppd2dZMjlzSUQwZ1hGeG5jbVY1WEZ3c0lHeHBibVYwZVhCbElEMGdYRnhrYjNSMFpXUmNYQ2tnSzF4dUlDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlHUnBabVpEZFhSdlptWXNJR052YkNBOUlGeGNaM0psZVZ4Y0xDQnNhVzVsZEhsd1pTQTlJRnhjWkc5MGRHVmtYRndwSUN0Y2JpQWdkR2hsYldWZlkyeGhjM05wWXlncElDc2daMmQwYVhSc1pTaHdZWE4wWlRBb1hGeERiMjV6Wlc1emRYTWdiRzl2Y0NCelkyOXlaVnhjS1NrZ0sxeHVJQ0JoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlDMHdMalVzSUhrZ1BTQXhMQ0JzWVdKbGJDQTlJSEJoYzNSbEtGeGNjaUE5WEZ3c0lISnZkVzVrS0dOdmNuSmxiR0YwYVc5dUxDQXlLU2tzSUhOcGVtVWdQU0ExTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWENsY2JseHVYRzRqSXlNZ1VETXVJR1JVUVVjZ2RuTWdRVWxFWEc1elkyOXlaUzUwWWlSa1pXNXphWFI1SUR3dElHZGxkRjlrWlc1emFYUjVLSE5qYjNKbExuUmlKR1JVUVVjc0lITmpiM0psTG5SaUpFRkpSQ3dnYmlBOUlERXdNQ2xjYm5OamIzSmxMblJpSUR3dElITmpiM0psTG5SaUlDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaVzV6YVhSNUtWeHVZMjl5Y21Wc1lYUnBiMjRnUEMwZ1kyOXlLSE5qYjNKbExuUmlKR1JVUVVjc0lITmpiM0psTG5SaUpFRkpSQ2xjYm5BMUlEd3RJR2RuY0d4dmRDaHpZMjl5WlM1MFlpd2dZV1Z6S0hnZ1BTQmtWRUZITENCNUlEMGdRVWxFTENCamIyeHZjaUE5SUdSbGJuTnBkSGtwS1NBclhHNGdJR2RsYjIxZmNHOXBiblFvS1NBcklGeHVJQ0J6WTJGc1pWOWpiMnh2Y2w5MmFYSnBaR2x6S0NrZ0sxeHVJQ0I0YkdsdEtDMHdMalVzSURFcElDc2dlV3hwYlNndE1DNDFMQ0F4S1NBclhHNGdJR052YjNKa1gyWnBlR1ZrS0NrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJREFzSUdOdmJDQTlJRnhjWjNKbGVUVXdYRndzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SUMxa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY1hHZHlaWGxjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1J2ZEhSbFpGeGNLU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2dZMjlzSUQwZ1hGeG5jbVY1WEZ3c0lHeHBibVYwZVhCbElEMGdYRnhrYjNSMFpXUmNYQ2tnSzF4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5Qm5aM1JwZEd4bEtIQmhjM1JsTUNoY1hFTnZibk5sYm5OMWN5QnNiMjl3SUhOamIzSmxYRndwS1NBclhHNGdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ0xUQXVOU3dnZVNBOUlERXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVb1hGeHlJRDFjWEN3Z2NtOTFibVFvWTI5eWNtVnNZWFJwYjI0c0lESXBLU3dnYzJsNlpTQTlJRFVzSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjS1Z4dVhHNGpJeU1nVURNdUlHUnBabVpjYm5OamIzSmxMblJpSkdSbGJuTnBkSGtnUEMwZ1oyVjBYMlJsYm5OcGRIa29jMk52Y21VdWRHSWtaR2xtWmw5SE1Td2djMk52Y21VdWRHSWtaR2xtWmw5aGMzbHVZeXdnYmlBOUlERXdNQ2xjYm5OamIzSmxMblJpSUR3dElITmpiM0psTG5SaUlDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaVzV6YVhSNUtWeHVZMjl5Y21Wc1lYUnBiMjRnUEMwZ1kyOXlLSE5qYjNKbExuUmlKR1JwWm1aZlJ6RXNJSE5qYjNKbExuUmlKR1JwWm1aZllYTjVibU1wWEc1d05pQThMU0JuWjNCc2IzUW9jMk52Y21VdWRHSXNJR0ZsY3loNElEMGdaR2xtWmw5SE1Td2dlU0E5SUdScFptWmZZWE41Ym1Nc0lHTnZiRzl5SUQwZ1pHVnVjMmwwZVNrcElDdGNiaUFnWjJWdmJWOXdiMmx1ZENncElDc2dYRzRnSUhOallXeGxYMk52Ykc5eVgzWnBjbWxrYVhNb0tTQXJYRzRnSUhoc2FXMG9MVEVzSURBdU5Ta2dLeUI1YkdsdEtDMHhMQ0F3TGpVcElDdGNiaUFnWTI5dmNtUmZabWw0WldRb0tTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTUN3Z1kyOXNJRDBnWEZ4bmNtVjVOVEJjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRnhjWjNKbGVWeGNLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRnhjWjNKbGVWeGNLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUdScFptWkRkWFJ2Wm1Zc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRnhjWjNKbGVWeGNLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUMxa2FXWm1RM1YwYjJabUxDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjWEdkeVpYbGNYQ2tnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjWEdkeVpYbGNYQ2tnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBdFpHbG1aa04xZEc5bVppd2dZV3h3YUdFZ1BTQXdMalVzSUdOdmJHOXlJRDBnWEZ4bmNtVjVYRndwSUN0Y2JpQWdJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJuWjNScGRHeGxLSEJoYzNSbE1DaGNYRU52Ym5ObGJuTjFjeUJzYjI5d0lITmpiM0psWEZ3cEtTQXJYRzRnSUdGdWJtOTBZWFJsS0Z4Y2RHVjRkRnhjTENCNElEMGdMVEVzSUhrZ1BTQXdMalVzSUd4aFltVnNJRDBnY0dGemRHVW9YRnh5SUQxY1hDd2djbTkxYm1Rb1kyOXljbVZzWVhScGIyNHNJRElwS1N3Z2MybDZaU0E5SURVc0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0tWeHVYRzVjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLRnhjWTI5dWMyVnVjM1Z6WDNOamIzSmxYM05qWVhSMFpYSndiRzkwWDNCMU1UQXdjSG94TURCZlJ6RjJjMEZ6ZVc1algzSmxaeTV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUnpJRDBnWEZ4cGJseGNMQ0IzYVdSMGFDQTlJRFVxTWk0MUxDQm9aV2xuYUhRZ1BTQXlMalVxTWk0MUtWeHVjSEpwYm5Rb1kyOTNjR3h2ZERvNmNHeHZkRjluY21sa0tIQXhMQ0J3TWl3Z2NETXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEEwTENCd05Td2djRFlzSUdGc2FXZHVJRDBnWEZ4b1hGd3NJRzVqYjJ3Z1BTQXpLU2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tGeGNZMjl1YzJWdWMzVnpYM05qYjNKbFgzTmpZWFIwWlhKd2JHOTBYM0IxTVRBd2NIb3hNREJmUnpGMmMwRnplVzVqWDNKbFp5NXpkbWRjWENrcExDQjNhV1IwYUNBOUlEVXFNaTQxTENCb1pXbG5hSFFnUFNBeUxqVXFNaTQxS1Z4dWNISnBiblFvWTI5M2NHeHZkRG82Y0d4dmRGOW5jbWxrS0hBeExDQndNaXdnY0RNc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQTBMQ0J3TlN3Z2NEWXNJR0ZzYVdkdUlEMGdYRnhvWEZ3c0lHNWpiMndnUFNBektTbGNibVJsZGk1dlptWW9LVnh1WEc1Y2JpTWpJeU1qSXlNakl5TWdVMkYyYVc1bklFRnplVzVqSUdGdVpDQkhNU0J6Y0dWamFXWnBZeUJ5WldkMWJHRjBiM0o1SUd4dmIzQmNibVJwWm1aRGRYUnZabVlnUEMwZ01DNHlYRzUwWlcxd0lEd3RJSE5qYjNKbExuUmlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR1JwWm1aZlJ6RWdQajBnTFdScFptWkRkWFJ2Wm1Zc0lHUnBabVpmWVhONWJtTWdQajBnTFdScFptWkRkWFJ2Wm1ZcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLSE5sY1NneExDQTNLU2xjYm1aM2NtbDBaU2gwWlcxd0xDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbFgwY3hkbk5CYzNsdVkxOWliM1JvVW1WMFlXbHVaV1F1WW1Wa2NHVmNYQ2tzSUhObGNDQTlJRnhjWEZ4MFhGd3NJR052YkM1dVlXMWxjeUE5SUVaQlRGTkZLVnh1WEc1MFpXMXdJRHd0SUhOamIzSmxMblJpSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dScFptWmZSekVnUGowZ0xXUnBabVpEZFhSdlptWXNJR1JwWm1aZllYTjVibU1nUENBdFpHbG1aa04xZEc5bVppa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvYzJWeEtERXNJRGNwS1Z4dVpuZHlhWFJsS0hSbGJYQXNJR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZSekYyYzBGemVXNWpYMEZ6ZVc1alUzQmxZMmxtYVdOUVpYSjBMbUpsWkhCbFhGd3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0xDQmpiMnd1Ym1GdFpYTWdQU0JHUVV4VFJTbGNibHh1ZEdWdGNDQThMU0J6WTI5eVpTNTBZaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhrYVdabVgwY3hJRHdnTFdScFptWkRkWFJ2Wm1Zc0lHUnBabVpmWVhONWJtTWdQajBnTFdScFptWkRkWFJ2Wm1ZcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLSE5sY1NneExDQTNLU2xjYm1aM2NtbDBaU2gwWlcxd0xDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbFgwY3hkbk5CYzNsdVkxOUhNVk53WldOcFptbGpVR1Z5ZEM1aVpXUndaVnhjS1N3Z2MyVndJRDBnWEZ4Y1hIUmNYQ3dnWTI5c0xtNWhiV1Z6SUQwZ1JrRk1VMFVwWEc1Y2JuUmxiWEFnUEMwZ2MyTnZjbVV1ZEdJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1pHbG1abDlITVNBOElDMWthV1ptUTNWMGIyWm1MQ0JrYVdabVgyRnplVzVqSUR3Z0xXUnBabVpEZFhSdlptWXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0hObGNTZ3hMQ0EzS1NsY2JtWjNjbWwwWlNoMFpXMXdMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNCbExYQmxYMGN4ZG5OQmMzbHVZMTlpYjNSb1VHVnlkQzVpWldSd1pWeGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDd2dZMjlzTG01aGJXVnpJRDBnUmtGTVUwVXBYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG50ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHJlcyA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgcmVzLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcbnJlZ0lEIDwtIHRlbXAkaWRcblxuZGlmZkN1dG9mZiA9IDAuMlxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZS50c3ZcXCkpXG5cbnRlbXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmVfYXN5bmMudHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgVVQsIEFJRClcblxuc2NvcmUudGIgPC0gZGF0YSAlPiUgZHBseXI6OmZ1bGxfam9pbih0ZW1wLCBieSA9IGMoXFxpZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlmZl9HMSA9IGRUQUcgLSBETVNPLFxuICAgICAgICAgICAgICAgICAgZGlmZl9hc3luYyA9IEFJRCAtIFVUKSAlPiVcbiAgZHBseXI6OmZpbHRlcihpZCAlaW4lIHJlZ0lEKVxuXG5cbiMjIyBQMS4gVVQgdnMgQUlEXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJFVULCBzY29yZS50YiRBSUQsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRVVCwgc2NvcmUudGIkQUlEKVxucDEgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IFVULCB5ID0gQUlELCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG4jIyMgUDEuIERNU08gdnMgZFRBR1xuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRETVNPLCBzY29yZS50YiRkVEFHLCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkZFRBRylcbnAyIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuXG4jIyMgUDMuIERNU08gdnMgQTQ4NVxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRETVNPLCBzY29yZS50YiRBNDg1LCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkQTQ4NSlcbnAzIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIFAzLiBETVNPIHZzIFVUXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJFVULCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkVVQpXG5wNCA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gRE1TTywgeSA9IFVULCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG5cbiMjIyBQMy4gZFRBRyB2cyBBSURcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkZFRBRywgc2NvcmUudGIkQUlELCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkZFRBRywgc2NvcmUudGIkQUlEKVxucDUgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IGRUQUcsIHkgPSBBSUQsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyBQMy4gZGlmZlxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRkaWZmX0cxLCBzY29yZS50YiRkaWZmX2FzeW5jLCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkZGlmZl9HMSwgc2NvcmUudGIkZGlmZl9hc3luYylcbnA2IDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBkaWZmX0cxLCB5ID0gZGlmZl9hc3luYywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMSwgMC41KSArIHlsaW0oLTEsIDAuNSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cblxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxjb25zZW5zdXNfc2NvcmVfc2NhdHRlcnBsb3RfcHUxMDBwejEwMF9HMXZzQXN5bmNfcmVnLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNSoyLjUsIGhlaWdodCA9IDIuNSoyLjUpXG5wcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBwMywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgcDQsIHA1LCBwNiwgYWxpZ24gPSBcXGhcXCwgbmNvbCA9IDMpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxjb25zZW5zdXNfc2NvcmVfc2NhdHRlcnBsb3RfcHUxMDBwejEwMF9HMXZzQXN5bmNfcmVnLnN2Z1xcKSksIHdpZHRoID0gNSoyLjUsIGhlaWdodCA9IDIuNSoyLjUpXG5wcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBwMywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgcDQsIHA1LCBwNiwgYWxpZ24gPSBcXGhcXCwgbmNvbCA9IDMpKVxuZGV2Lm9mZigpXG5cblxuIyMjIyMjIyMjIyBTYXZpbmcgQXN5bmMgYW5kIEcxIHNwZWNpZmljIHJlZ3VsYXRvcnkgbG9vcFxuZGlmZkN1dG9mZiA8LSAwLjJcbnRlbXAgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZl9HMSA+PSAtZGlmZkN1dG9mZiwgZGlmZl9hc3luYyA+PSAtZGlmZkN1dG9mZikgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDcpKVxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX2JvdGhSZXRhaW5lZC5iZWRwZVxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5cbnRlbXAgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZl9HMSA+PSAtZGlmZkN1dG9mZiwgZGlmZl9hc3luYyA8IC1kaWZmQ3V0b2ZmKSAlPiVcbiAgZHBseXI6OnNlbGVjdChzZXEoMSwgNykpXG5md3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9HMXZzQXN5bmNfQXN5bmNTcGVjaWZpY1BlcnQuYmVkcGVcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuXG50ZW1wIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmZfRzEgPCAtZGlmZkN1dG9mZiwgZGlmZl9hc3luYyA+PSAtZGlmZkN1dG9mZikgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDcpKVxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX0cxU3BlY2lmaWNQZXJ0LmJlZHBlXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcblxudGVtcCA8LSBzY29yZS50YiAlPiUgZHBseXI6OmZpbHRlcihkaWZmX0cxIDwgLWRpZmZDdXRvZmYsIGRpZmZfYXN5bmMgPCAtZGlmZkN1dG9mZikgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDcpKVxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX2JvdGhQZXJ0LmJlZHBlXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVtcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShyZXMgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIHJlcywgVjIsIFY1LCBzZXAgPSBcXF9cXCkpXG5yZWdJRCA8LSB0ZW1wJGlkXG5cbmRpZmZDdXRvZmYgPSAwLjJcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKVxuXG50ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX3Njb3JlX2FzeW5jLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIFVULCBBSUQpXG5cbnNjb3JlLnRiIDwtIGRhdGEgJT4lIGRwbHlyOjpmdWxsX2pvaW4odGVtcCwgYnkgPSBjKFxcaWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGRpZmZfRzEgPSBkVEFHIC0gRE1TTyxcbiAgICAgICAgICAgICAgICAgIGRpZmZfYXN5bmMgPSBBSUQgLSBVVCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSByZWdJRClcblxuXG4jIyMgUDEuIFVUIHZzIEFJRFxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRVVCwgc2NvcmUudGIkQUlELCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkVVQsIHNjb3JlLnRiJEFJRClcbnAxIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBVVCwgeSA9IEFJRCwgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIFAxLiBETVNPIHZzIGRUQUdcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkRE1TTywgc2NvcmUudGIkZFRBRywgbiA9IDEwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJGRUQUcpXG5wMiA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gRE1TTywgeSA9IGRUQUcsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cblxuIyMjIFAzLiBETVNPIHZzIEE0ODVcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkRE1TTywgc2NvcmUudGIkQTQ4NSwgbiA9IDEwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJEE0ODUpXG5wMyA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gRE1TTywgeSA9IEE0ODUsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyBQMy4gRE1TTyB2cyBVVFxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRETVNPLCBzY29yZS50YiRVVCwgbiA9IDEwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJFVUKVxucDQgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IERNU08sIHkgPSBVVCwgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuXG4jIyMgUDMuIGRUQUcgdnMgQUlEXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJGRUQUcsIHNjb3JlLnRiJEFJRCwgbiA9IDEwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJGRUQUcsIHNjb3JlLnRiJEFJRClcbnA1IDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBkVEFHLCB5ID0gQUlELCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG4jIyMgUDMuIGRpZmZcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkZGlmZl9HMSwgc2NvcmUudGIkZGlmZl9hc3luYywgbiA9IDEwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJGRpZmZfRzEsIHNjb3JlLnRiJGRpZmZfYXN5bmMpXG5wNiA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gZGlmZl9HMSwgeSA9IGRpZmZfYXN5bmMsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTEsIDAuNSkgKyB5bGltKC0xLCAwLjUpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTEsIHkgPSAwLjUsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG5cbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKFxcY29uc2Vuc3VzX3Njb3JlX3NjYXR0ZXJwbG90X3B1MTAwcHoxMDBfRzF2c0FzeW5jX3JlZy5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDUqMi41LCBoZWlnaHQgPSAyLjUqMi41KVxucHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgcDMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgIHA0LCBwNSwgcDYsIGFsaWduID0gXFxoXFwsIG5jb2wgPSAzKSlcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKFxcY29uc2Vuc3VzX3Njb3JlX3NjYXR0ZXJwbG90X3B1MTAwcHoxMDBfRzF2c0FzeW5jX3JlZy5zdmdcXCkpLCB3aWR0aCA9IDUqMi41LCBoZWlnaHQgPSAyLjUqMi41KVxucHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgcDMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgIHA0LCBwNSwgcDYsIGFsaWduID0gXFxoXFwsIG5jb2wgPSAzKSlcbmRldi5vZmYoKVxuXG5cbiMjIyMjIyMjIyMgU2F2aW5nIEFzeW5jIGFuZCBHMSBzcGVjaWZpYyByZWd1bGF0b3J5IGxvb3BcbmRpZmZDdXRvZmYgPC0gMC4yXG50ZW1wIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmZfRzEgPj0gLWRpZmZDdXRvZmYsIGRpZmZfYXN5bmMgPj0gLWRpZmZDdXRvZmYpICU+JVxuICBkcGx5cjo6c2VsZWN0KHNlcSgxLCA3KSlcbmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19ib3RoUmV0YWluZWQuYmVkcGVcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuXG50ZW1wIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmZfRzEgPj0gLWRpZmZDdXRvZmYsIGRpZmZfYXN5bmMgPCAtZGlmZkN1dG9mZikgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDcpKVxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX0FzeW5jU3BlY2lmaWNQZXJ0LmJlZHBlXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcblxudGVtcCA8LSBzY29yZS50YiAlPiUgZHBseXI6OmZpbHRlcihkaWZmX0cxIDwgLWRpZmZDdXRvZmYsIGRpZmZfYXN5bmMgPj0gLWRpZmZDdXRvZmYpICU+JVxuICBkcGx5cjo6c2VsZWN0KHNlcSgxLCA3KSlcbmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19HMVNwZWNpZmljUGVydC5iZWRwZVxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5cbnRlbXAgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZl9HMSA8IC1kaWZmQ3V0b2ZmLCBkaWZmX2FzeW5jIDwgLWRpZmZDdXRvZmYpICU+JVxuICBkcGx5cjo6c2VsZWN0KHNlcSgxLCA3KSlcbmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19ib3RoUGVydC5iZWRwZVxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5gYGBcbmBgYCJ9 -->

```r
```r
temp <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\)) %>%
  dplyr::mutate(res = V3 - V2,
                id = paste(V1, res, V2, V5, sep = \_\))
regID <- temp$id

diffCutoff = 0.2
data <- fread(here(consensusDir, \chromo_cons_score.tsv\))

temp <- fread(here(consensusDir, \chromo_cons_score_async.tsv\)) %>%
  dplyr::select(id, UT, AID)

score.tb <- data %>% dplyr::full_join(temp, by = c(\id\)) %>%
  dplyr::mutate(diff_G1 = dTAG - DMSO,
                  diff_async = AID - UT) %>%
  dplyr::filter(id %in% regID)


### P1. UT vs AID
score.tb$density <- get_density(score.tb$UT, score.tb$AID, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$UT, score.tb$AID)
p1 <- ggplot(score.tb, aes(x = UT, y = AID, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P1. DMSO vs dTAG
score.tb$density <- get_density(score.tb$DMSO, score.tb$dTAG, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$dTAG)
p2 <- ggplot(score.tb, aes(x = DMSO, y = dTAG, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


### P3. DMSO vs A485
score.tb$density <- get_density(score.tb$DMSO, score.tb$A485, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$A485)
p3 <- ggplot(score.tb, aes(x = DMSO, y = A485, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P3. DMSO vs UT
score.tb$density <- get_density(score.tb$DMSO, score.tb$UT, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$UT)
p4 <- ggplot(score.tb, aes(x = DMSO, y = UT, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


### P3. dTAG vs AID
score.tb$density <- get_density(score.tb$dTAG, score.tb$AID, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$dTAG, score.tb$AID)
p5 <- ggplot(score.tb, aes(x = dTAG, y = AID, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P3. diff
score.tb$density <- get_density(score.tb$diff_G1, score.tb$diff_async, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$diff_G1, score.tb$diff_async)
p6 <- ggplot(score.tb, aes(x = diff_G1, y = diff_async, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-1, 0.5) + ylim(-1, 0.5) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_hline(yintercept = diffCutoff, alpha = 0.5, color = \grey\) +
  geom_hline(yintercept = -diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = -diffCutoff, alpha = 0.5, color = \grey\) +
    theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -1, y = 0.5, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


png(here(figDir, paste0(\consensus_score_scatterplot_pu100pz100_G1vsAsync_reg.png\)), res = 600, units = \in\, width = 5*2.5, height = 2.5*2.5)
print(cowplot::plot_grid(p1, p2, p3, 
                         p4, p5, p6, align = \h\, ncol = 3))
dev.off()
svglite(here(figDir, paste0(\consensus_score_scatterplot_pu100pz100_G1vsAsync_reg.svg\)), width = 5*2.5, height = 2.5*2.5)
print(cowplot::plot_grid(p1, p2, p3, 
                         p4, p5, p6, align = \h\, ncol = 3))
dev.off()


########## Saving Async and G1 specific regulatory loop
diffCutoff <- 0.2
temp <- score.tb %>% dplyr::filter(diff_G1 >= -diffCutoff, diff_async >= -diffCutoff) %>%
  dplyr::select(seq(1, 7))
fwrite(temp, here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_bothRetained.bedpe\), sep = \\t\, col.names = FALSE)

temp <- score.tb %>% dplyr::filter(diff_G1 >= -diffCutoff, diff_async < -diffCutoff) %>%
  dplyr::select(seq(1, 7))
fwrite(temp, here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_AsyncSpecificPert.bedpe\), sep = \\t\, col.names = FALSE)

temp <- score.tb %>% dplyr::filter(diff_G1 < -diffCutoff, diff_async >= -diffCutoff) %>%
  dplyr::select(seq(1, 7))
fwrite(temp, here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_G1SpecificPert.bedpe\), sep = \\t\, col.names = FALSE)

temp <- score.tb %>% dplyr::filter(diff_G1 < -diffCutoff, diff_async < -diffCutoff) %>%
  dplyr::select(seq(1, 7))
fwrite(temp, here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_bothPert.bedpe\), sep = \\t\, col.names = FALSE)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



#### Comparing G1 vs Async for consensus loops
##### All loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR1Z0Y0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzTjBjblZqZEhWeVpTNWlaV1J3WlZ3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvY21WeklEMGdWak1nTFNCV01peGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaQ0E5SUhCaGMzUmxLRll4TENCeVpYTXNJRll5TENCV05Td2djMlZ3SUQwZ1hDSmZYQ0lwS1Z4dWNtVm5TVVFnUEMwZ2RHVnRjQ1JwWkZ4dVhHNWthV1ptUTNWMGIyWm1JRDBnTUM0eVhHNWtZWFJoSUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0ltTm9jbTl0YjE5amIyNXpYM05qYjNKbExuUnpkbHdpS1NsY2JseHVkR1Z0Y0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTl6WTI5eVpWOWhjM2x1WXk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHbGtMQ0JWVkN3Z1FVbEVLVnh1WEc1elkyOXlaUzUwWWlBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNlpuVnNiRjlxYjJsdUtIUmxiWEFzSUdKNUlEMGdZeWhjSW1sa1hDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FXWm1YMGN4SUQwZ1pGUkJSeUF0SUVSTlUwOHNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVdabVgyRnplVzVqSUQwZ1FVbEVJQzBnVlZRcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLR2xrSUNWcGJpVWdjbVZuU1VRcFhHNWNibHh1SXlNaklGQXhMaUJWVkNCMmN5QkJTVVJjYm5OamIzSmxMblJpSkdSbGJuTnBkSGtnUEMwZ1oyVjBYMlJsYm5OcGRIa29jMk52Y21VdWRHSWtWVlFzSUhOamIzSmxMblJpSkVGSlJDd2diaUE5SURFd01DbGNibk5qYjNKbExuUmlJRHd0SUhOamIzSmxMblJpSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pXNXphWFI1S1Z4dVkyOXljbVZzWVhScGIyNGdQQzBnWTI5eUtITmpiM0psTG5SaUpGVlVMQ0J6WTI5eVpTNTBZaVJCU1VRcFhHNXdNU0E4TFNCblozQnNiM1FvYzJOdmNtVXVkR0lzSUdGbGN5aDRJRDBnVlZRc0lIa2dQU0JCU1VRc0lHTnZiRzl5SUQwZ1pHVnVjMmwwZVNrcElDdGNiaUFnWjJWdmJWOXdiMmx1ZENncElDc2dYRzRnSUhOallXeGxYMk52Ykc5eVgzWnBjbWxrYVhNb0tTQXJYRzRnSUhoc2FXMG9MVEF1TlN3Z01Ta2dLeUI1YkdsdEtDMHdMalVzSURFcElDdGNiaUFnWTI5dmNtUmZabWw0WldRb0tTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTUN3Z1kyOXNJRDBnWENKbmNtVjVOVEJjSWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJoYzJobFpGd2lLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRndpWjNKbGVWd2lLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRndpWjNKbGVWd2lLU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ0xXUnBabVpEZFhSdlptWXNJR052YkNBOUlGd2laM0psZVZ3aUxDQnNhVzVsZEhsd1pTQTlJRndpWkc5MGRHVmtYQ0lwSUN0Y2JpQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQmthV1ptUTNWMGIyWm1MQ0JqYjJ3Z1BTQmNJbWR5WlhsY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SdmRIUmxaRndpS1NBclhHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJR2RuZEdsMGJHVW9jR0Z6ZEdVd0tGd2lRMjl1YzJWdWMzVnpJR3h2YjNBZ2MyTnZjbVZjSWlrcElDdGNiaUFnWVc1dWIzUmhkR1VvWENKMFpYaDBYQ0lzSUhnZ1BTQXRNQzQxTENCNUlEMGdNU3dnYkdGaVpXd2dQU0J3WVhOMFpTaGNJbklnUFZ3aUxDQnliM1Z1WkNoamIzSnlaV3hoZEdsdmJpd2dNaWtwTENCemFYcGxJRDBnTlN3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJcFhHNWNiaU1qSXlCUU1TNGdSRTFUVHlCMmN5QmtWRUZIWEc1elkyOXlaUzUwWWlSa1pXNXphWFI1SUR3dElHZGxkRjlrWlc1emFYUjVLSE5qYjNKbExuUmlKRVJOVTA4c0lITmpiM0psTG5SaUpHUlVRVWNzSUc0Z1BTQXhNREFwWEc1elkyOXlaUzUwWWlBOExTQnpZMjl5WlM1MFlpQWxQaVVnWkhCc2VYSTZPbUZ5Y21GdVoyVW9aR1Z1YzJsMGVTbGNibU52Y25KbGJHRjBhVzl1SUR3dElHTnZjaWh6WTI5eVpTNTBZaVJFVFZOUExDQnpZMjl5WlM1MFlpUmtWRUZIS1Z4dWNESWdQQzBnWjJkd2JHOTBLSE5qYjNKbExuUmlMQ0JoWlhNb2VDQTlJRVJOVTA4c0lIa2dQU0JrVkVGSExDQmpiMnh2Y2lBOUlHUmxibk5wZEhrcEtTQXJYRzRnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJRnh1SUNCelkyRnNaVjlqYjJ4dmNsOTJhWEpwWkdsektDa2dLMXh1SUNCNGJHbHRLQzB3TGpVc0lERXBJQ3NnZVd4cGJTZ3RNQzQxTENBeEtTQXJYRzRnSUdOdmIzSmtYMlpwZUdWa0tDa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SURBc0lHTnZiQ0E5SUZ3aVozSmxlVFV3WENJc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlDMWthV1ptUTNWMGIyWm1MQ0JqYjJ3Z1BTQmNJbWR5WlhsY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SdmRIUmxaRndpS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYQ0puY21WNVhDSXNJR3hwYm1WMGVYQmxJRDBnWENKa2IzUjBaV1JjSWlrZ0sxeHVJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJuWjNScGRHeGxLSEJoYzNSbE1DaGNJa052Ym5ObGJuTjFjeUJzYjI5d0lITmpiM0psWENJcEtTQXJYRzRnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdMVEF1TlN3Z2VTQTlJREVzSUd4aFltVnNJRDBnY0dGemRHVW9YQ0p5SUQxY0lpd2djbTkxYm1Rb1kyOXljbVZzWVhScGIyNHNJRElwS1N3Z2MybDZaU0E5SURVc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUtWeHVYRzVjYmlNakl5QlFNeTRnUkUxVFR5QjJjeUJCTkRnMVhHNXpZMjl5WlM1MFlpUmtaVzV6YVhSNUlEd3RJR2RsZEY5a1pXNXphWFI1S0hOamIzSmxMblJpSkVSTlUwOHNJSE5qYjNKbExuUmlKRUUwT0RVc0lHNGdQU0F4TURBcFhHNXpZMjl5WlM1MFlpQThMU0J6WTI5eVpTNTBZaUFsUGlVZ1pIQnNlWEk2T21GeWNtRnVaMlVvWkdWdWMybDBlU2xjYm1OdmNuSmxiR0YwYVc5dUlEd3RJR052Y2loelkyOXlaUzUwWWlSRVRWTlBMQ0J6WTI5eVpTNTBZaVJCTkRnMUtWeHVjRE1nUEMwZ1oyZHdiRzkwS0hOamIzSmxMblJpTENCaFpYTW9lQ0E5SUVSTlUwOHNJSGtnUFNCQk5EZzFMQ0JqYjJ4dmNpQTlJR1JsYm5OcGRIa3BLU0FyWEc0Z0lHZGxiMjFmY0c5cGJuUW9LU0FySUZ4dUlDQnpZMkZzWlY5amIyeHZjbDkyYVhKcFpHbHpLQ2tnSzF4dUlDQjRiR2x0S0Mwd0xqVXNJREVwSUNzZ2VXeHBiU2d0TUM0MUxDQXhLU0FyWEc0Z0lHTnZiM0prWDJacGVHVmtLQ2tnSzF4dUlDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlEQXNJR052YkNBOUlGd2laM0psZVRVd1hDSXNJR3hwYm1WMGVYQmxJRDBnWENKa1lYTm9aV1JjSWlrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMQ0JoYkhCb1lTQTlJREF1TlN3Z1kyOXNiM0lnUFNCY0ltZHlaWGxjSWlrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXdMQ0JoYkhCb1lTQTlJREF1TlN3Z1kyOXNiM0lnUFNCY0ltZHlaWGxjSWlrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJQzFrYVdabVEzVjBiMlptTENCamIyd2dQU0JjSW1keVpYbGNJaXdnYkdsdVpYUjVjR1VnUFNCY0ltUnZkSFJsWkZ3aUtTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z1kyOXNJRDBnWENKbmNtVjVYQ0lzSUd4cGJtVjBlWEJsSUQwZ1hDSmtiM1IwWldSY0lpa2dLMXh1SUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCblozUnBkR3hsS0hCaGMzUmxNQ2hjSWtOdmJuTmxibk4xY3lCc2IyOXdJSE5qYjNKbFhDSXBLU0FyWEc0Z0lHRnVibTkwWVhSbEtGd2lkR1Y0ZEZ3aUxDQjRJRDBnTFRBdU5Td2dlU0E5SURFc0lHeGhZbVZzSUQwZ2NHRnpkR1VvWENKeUlEMWNJaXdnY205MWJtUW9ZMjl5Y21Wc1lYUnBiMjRzSURJcEtTd2djMmw2WlNBOUlEVXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lLVnh1WEc0akl5TWdVRE11SUVSTlUwOGdkbk1nVlZSY2JuTmpiM0psTG5SaUpHUmxibk5wZEhrZ1BDMGdaMlYwWDJSbGJuTnBkSGtvYzJOdmNtVXVkR0lrUkUxVFR5d2djMk52Y21VdWRHSWtWVlFzSUc0Z1BTQXhNREFwWEc1elkyOXlaUzUwWWlBOExTQnpZMjl5WlM1MFlpQWxQaVVnWkhCc2VYSTZPbUZ5Y21GdVoyVW9aR1Z1YzJsMGVTbGNibU52Y25KbGJHRjBhVzl1SUR3dElHTnZjaWh6WTI5eVpTNTBZaVJFVFZOUExDQnpZMjl5WlM1MFlpUlZWQ2xjYm5BMElEd3RJR2RuY0d4dmRDaHpZMjl5WlM1MFlpd2dZV1Z6S0hnZ1BTQkVUVk5QTENCNUlEMGdWVlFzSUdOdmJHOXlJRDBnWkdWdWMybDBlU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1hHNGdJSE5qWVd4bFgyTnZiRzl5WDNacGNtbGthWE1vS1NBclhHNGdJSGhzYVcwb0xUQXVOU3dnTVNrZ0t5QjViR2x0S0Mwd0xqVXNJREVwSUN0Y2JpQWdZMjl2Y21SZlptbDRaV1FvS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdNQ3dnWTI5c0lEMGdYQ0puY21WNU5UQmNJaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGd2laM0psZVZ3aUtTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGd2laM0psZVZ3aUtTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTFdScFptWkRkWFJ2Wm1Zc0lHTnZiQ0E5SUZ3aVozSmxlVndpTENCc2FXNWxkSGx3WlNBOUlGd2laRzkwZEdWa1hDSXBJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY0ltZHlaWGxjSWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJ2ZEhSbFpGd2lLU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHZG5kR2wwYkdVb2NHRnpkR1V3S0Z3aVEyOXVjMlZ1YzNWeklHeHZiM0FnYzJOdmNtVmNJaWtwSUN0Y2JpQWdZVzV1YjNSaGRHVW9YQ0owWlhoMFhDSXNJSGdnUFNBdE1DNDFMQ0I1SUQwZ01Td2diR0ZpWld3Z1BTQndZWE4wWlNoY0luSWdQVndpTENCeWIzVnVaQ2hqYjNKeVpXeGhkR2x2Yml3Z01pa3BMQ0J6YVhwbElEMGdOU3dnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwWEc1Y2JseHVJeU1qSUZBekxpQmtWRUZISUhaeklFRkpSRnh1YzJOdmNtVXVkR0lrWkdWdWMybDBlU0E4TFNCblpYUmZaR1Z1YzJsMGVTaHpZMjl5WlM1MFlpUmtWRUZITENCelkyOXlaUzUwWWlSQlNVUXNJRzRnUFNBeE1EQXBYRzV6WTI5eVpTNTBZaUE4TFNCelkyOXlaUzUwWWlBbFBpVWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pHVnVjMmwwZVNsY2JtTnZjbkpsYkdGMGFXOXVJRHd0SUdOdmNpaHpZMjl5WlM1MFlpUmtWRUZITENCelkyOXlaUzUwWWlSQlNVUXBYRzV3TlNBOExTQm5aM0JzYjNRb2MyTnZjbVV1ZEdJc0lHRmxjeWg0SUQwZ1pGUkJSeXdnZVNBOUlFRkpSQ3dnWTI5c2IzSWdQU0JrWlc1emFYUjVLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCY2JpQWdjMk5oYkdWZlkyOXNiM0pmZG1seWFXUnBjeWdwSUN0Y2JpQWdlR3hwYlNndE1DNDFMQ0F4S1NBcklIbHNhVzBvTFRBdU5Td2dNU2tnSzF4dUlDQmpiMjl5WkY5bWFYaGxaQ2dwSUN0Y2JpQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXdMQ0JqYjJ3Z1BTQmNJbWR5WlhrMU1Gd2lMQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ3dnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hDSm5jbVY1WENJcElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdNQ3dnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hDSm5jbVY1WENJcElDdGNiaUFnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0F0WkdsbVprTjFkRzltWml3Z1kyOXNJRDBnWENKbmNtVjVYQ0lzSUd4cGJtVjBlWEJsSUQwZ1hDSmtiM1IwWldSY0lpa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SUdScFptWkRkWFJ2Wm1Zc0lHTnZiQ0E5SUZ3aVozSmxlVndpTENCc2FXNWxkSGx3WlNBOUlGd2laRzkwZEdWa1hDSXBJQ3RjYmlBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1oyZDBhWFJzWlNod1lYTjBaVEFvWENKRGIyNXpaVzV6ZFhNZ2JHOXZjQ0J6WTI5eVpWd2lLU2tnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SUMwd0xqVXNJSGtnUFNBeExDQnNZV0psYkNBOUlIQmhjM1JsS0Z3aWNpQTlYQ0lzSUhKdmRXNWtLR052Y25KbGJHRjBhVzl1TENBeUtTa3NJSE5wZW1VZ1BTQTFMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaWxjYmx4dUl5TWpJRkF6TGlCa2FXWm1YRzV6WTI5eVpTNTBZaVJrWlc1emFYUjVJRHd0SUdkbGRGOWtaVzV6YVhSNUtITmpiM0psTG5SaUpHUnBabVpmUnpFc0lITmpiM0psTG5SaUpHUnBabVpmWVhONWJtTXNJRzRnUFNBeE1EQXBYRzV6WTI5eVpTNTBZaUE4TFNCelkyOXlaUzUwWWlBbFBpVWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pHVnVjMmwwZVNsY2JtTnZjbkpsYkdGMGFXOXVJRHd0SUdOdmNpaHpZMjl5WlM1MFlpUmthV1ptWDBjeExDQnpZMjl5WlM1MFlpUmthV1ptWDJGemVXNWpLVnh1Y0RZZ1BDMGdaMmR3Ykc5MEtITmpiM0psTG5SaUxDQmhaWE1vZUNBOUlHUnBabVpmUnpFc0lIa2dQU0JrYVdabVgyRnplVzVqTENCamIyeHZjaUE5SUdSbGJuTnBkSGtwS1NBclhHNGdJR2RsYjIxZmNHOXBiblFvS1NBcklGeHVJQ0J6WTJGc1pWOWpiMnh2Y2w5MmFYSnBaR2x6S0NrZ0sxeHVJQ0I0YkdsdEtDMHhMQ0F3TGpVcElDc2dlV3hwYlNndE1Td2dNQzQxS1NBclhHNGdJR052YjNKa1gyWnBlR1ZrS0NrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJREFzSUdOdmJDQTlJRndpWjNKbGVUVXdYQ0lzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNJbWR5WlhsY0lpa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNJbWR5WlhsY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0JrYVdabVEzVjBiMlptTENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNJbWR5WlhsY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F0WkdsbVprTjFkRzltWml3Z1lXeHdhR0VnUFNBd0xqVXNJR052Ykc5eUlEMGdYQ0puY21WNVhDSXBJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z1lXeHdhR0VnUFNBd0xqVXNJR052Ykc5eUlEMGdYQ0puY21WNVhDSXBJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTFdScFptWkRkWFJ2Wm1Zc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRndpWjNKbGVWd2lLU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHZG5kR2wwYkdVb2NHRnpkR1V3S0Z3aVEyOXVjMlZ1YzNWeklHeHZiM0FnYzJOdmNtVmNJaWtwSUN0Y2JpQWdZVzV1YjNSaGRHVW9YQ0owWlhoMFhDSXNJSGdnUFNBdE1Td2dlU0E5SURBdU5Td2diR0ZpWld3Z1BTQndZWE4wWlNoY0luSWdQVndpTENCeWIzVnVaQ2hqYjNKeVpXeGhkR2x2Yml3Z01pa3BMQ0J6YVhwbElEMGdOU3dnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwWEc1Y2JseHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1hDSmpiMjV6Wlc1emRYTmZjMk52Y21WZmMyTmhkSFJsY25Cc2IzUmZjSFV4TURCd2VqRXdNRjlITVhaelFYTjVibU5mYzNSeUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZEhNZ1BTQmNJbWx1WENJc0lIZHBaSFJvSUQwZ05Tb3lMalVzSUdobGFXZG9kQ0E5SURJdU5Tb3lMalVwWEc1d2NtbHVkQ2hqYjNkd2JHOTBPanB3Ykc5MFgyZHlhV1FvY0RFc0lIQXlMQ0J3TXl3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NEUXNJSEExTENCd05pd2dZV3hwWjI0Z1BTQmNJbWhjSWl3Z2JtTnZiQ0E5SURNcEtWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWENKamIyNXpaVzV6ZFhOZmMyTnZjbVZmYzJOaGRIUmxjbkJzYjNSZmNIVXhNREJ3ZWpFd01GOUhNWFp6UVhONWJtTmZjM1J5TG5OMloxd2lLU2tzSUhkcFpIUm9JRDBnTlNveUxqVXNJR2hsYVdkb2RDQTlJREl1TlNveUxqVXBYRzV3Y21sdWRDaGpiM2R3Ykc5ME9qcHdiRzkwWDJkeWFXUW9jREVzSUhBeUxDQndNeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0RRc0lIQTFMQ0J3Tml3Z1lXeHBaMjRnUFNCY0ltaGNJaXdnYm1OdmJDQTlJRE1wS1Z4dVpHVjJMbTltWmlncFhHNWNibHh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbnRlbXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmUuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHJlcyA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgcmVzLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcbnJlZ0lEIDwtIHRlbXAkaWRcblxuZGlmZkN1dG9mZiA9IDAuMlxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZS50c3ZcXCkpXG5cbnRlbXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmVfYXN5bmMudHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgVVQsIEFJRClcblxuc2NvcmUudGIgPC0gZGF0YSAlPiUgZHBseXI6OmZ1bGxfam9pbih0ZW1wLCBieSA9IGMoXFxpZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlmZl9HMSA9IGRUQUcgLSBETVNPLFxuICAgICAgICAgICAgICAgICAgZGlmZl9hc3luYyA9IEFJRCAtIFVUKSAlPiVcbiAgZHBseXI6OmZpbHRlcihpZCAlaW4lIHJlZ0lEKVxuXG5cbiMjIyBQMS4gVVQgdnMgQUlEXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJFVULCBzY29yZS50YiRBSUQsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRVVCwgc2NvcmUudGIkQUlEKVxucDEgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IFVULCB5ID0gQUlELCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG4jIyMgUDEuIERNU08gdnMgZFRBR1xuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRETVNPLCBzY29yZS50YiRkVEFHLCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkZFRBRylcbnAyIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuXG4jIyMgUDMuIERNU08gdnMgQTQ4NVxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRETVNPLCBzY29yZS50YiRBNDg1LCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkQTQ4NSlcbnAzIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIFAzLiBETVNPIHZzIFVUXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJFVULCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkVVQpXG5wNCA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gRE1TTywgeSA9IFVULCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG5cbiMjIyBQMy4gZFRBRyB2cyBBSURcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkZFRBRywgc2NvcmUudGIkQUlELCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkZFRBRywgc2NvcmUudGIkQUlEKVxucDUgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IGRUQUcsIHkgPSBBSUQsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyBQMy4gZGlmZlxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRkaWZmX0cxLCBzY29yZS50YiRkaWZmX2FzeW5jLCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkZGlmZl9HMSwgc2NvcmUudGIkZGlmZl9hc3luYylcbnA2IDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBkaWZmX0cxLCB5ID0gZGlmZl9hc3luYywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMSwgMC41KSArIHlsaW0oLTEsIDAuNSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTEsIHkgPSAwLjUsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG5cbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKFxcY29uc2Vuc3VzX3Njb3JlX3NjYXR0ZXJwbG90X3B1MTAwcHoxMDBfRzF2c0FzeW5jX3N0ci5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDUqMi41LCBoZWlnaHQgPSAyLjUqMi41KVxucHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgcDMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgIHA0LCBwNSwgcDYsIGFsaWduID0gXFxoXFwsIG5jb2wgPSAzKSlcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKFxcY29uc2Vuc3VzX3Njb3JlX3NjYXR0ZXJwbG90X3B1MTAwcHoxMDBfRzF2c0FzeW5jX3N0ci5zdmdcXCkpLCB3aWR0aCA9IDUqMi41LCBoZWlnaHQgPSAyLjUqMi41KVxucHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgcDMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgIHA0LCBwNSwgcDYsIGFsaWduID0gXFxoXFwsIG5jb2wgPSAzKSlcbmRldi5vZmYoKVxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
temp <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure.bedpe\)) %>%
  dplyr::mutate(res = V3 - V2,
                id = paste(V1, res, V2, V5, sep = \_\))
regID <- temp$id

diffCutoff = 0.2
data <- fread(here(consensusDir, \chromo_cons_score.tsv\))

temp <- fread(here(consensusDir, \chromo_cons_score_async.tsv\)) %>%
  dplyr::select(id, UT, AID)

score.tb <- data %>% dplyr::full_join(temp, by = c(\id\)) %>%
  dplyr::mutate(diff_G1 = dTAG - DMSO,
                  diff_async = AID - UT) %>%
  dplyr::filter(id %in% regID)


### P1. UT vs AID
score.tb$density <- get_density(score.tb$UT, score.tb$AID, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$UT, score.tb$AID)
p1 <- ggplot(score.tb, aes(x = UT, y = AID, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P1. DMSO vs dTAG
score.tb$density <- get_density(score.tb$DMSO, score.tb$dTAG, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$dTAG)
p2 <- ggplot(score.tb, aes(x = DMSO, y = dTAG, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


### P3. DMSO vs A485
score.tb$density <- get_density(score.tb$DMSO, score.tb$A485, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$A485)
p3 <- ggplot(score.tb, aes(x = DMSO, y = A485, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P3. DMSO vs UT
score.tb$density <- get_density(score.tb$DMSO, score.tb$UT, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$UT)
p4 <- ggplot(score.tb, aes(x = DMSO, y = UT, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


### P3. dTAG vs AID
score.tb$density <- get_density(score.tb$dTAG, score.tb$AID, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$dTAG, score.tb$AID)
p5 <- ggplot(score.tb, aes(x = dTAG, y = AID, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P3. diff
score.tb$density <- get_density(score.tb$diff_G1, score.tb$diff_async, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$diff_G1, score.tb$diff_async)
p6 <- ggplot(score.tb, aes(x = diff_G1, y = diff_async, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-1, 0.5) + ylim(-1, 0.5) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_hline(yintercept = diffCutoff, alpha = 0.5, color = \grey\) +
  geom_hline(yintercept = -diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = -diffCutoff, alpha = 0.5, color = \grey\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -1, y = 0.5, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


png(here(figDir, paste0(\consensus_score_scatterplot_pu100pz100_G1vsAsync_str.png\)), res = 600, units = \in\, width = 5*2.5, height = 2.5*2.5)
print(cowplot::plot_grid(p1, p2, p3, 
                         p4, p5, p6, align = \h\, ncol = 3))
dev.off()
svglite(here(figDir, paste0(\consensus_score_scatterplot_pu100pz100_G1vsAsync_str.svg\)), width = 5*2.5, height = 2.5*2.5)
print(cowplot::plot_grid(p1, p2, p3, 
                         p4, p5, p6, align = \h\, ncol = 3))
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRHVnRjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNOMGNuVmpkSFZ5WlM1aVpXUndaVnhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9jbVZ6SUQwZ1ZqTWdMU0JXTWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFpDQTlJSEJoYzNSbEtGWXhMQ0J5WlhNc0lGWXlMQ0JXTlN3Z2MyVndJRDBnWEZ4ZlhGd3BLVnh1Y21WblNVUWdQQzBnZEdWdGNDUnBaRnh1WEc1a2FXWm1RM1YwYjJabUlEMGdNQzR5WEc1a1lYUmhJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEdOb2NtOXRiMTlqYjI1elgzTmpiM0psTG5SemRseGNLU2xjYmx4dWRHVnRjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOXpZMjl5WlY5aGMzbHVZeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dsa0xDQlZWQ3dnUVVsRUtWeHVYRzV6WTI5eVpTNTBZaUE4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm5Wc2JGOXFiMmx1S0hSbGJYQXNJR0o1SUQwZ1l5aGNYR2xrWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVdabVgwY3hJRDBnWkZSQlJ5QXRJRVJOVTA4c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptWDJGemVXNWpJRDBnUVVsRUlDMGdWVlFwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtHbGtJQ1ZwYmlVZ2NtVm5TVVFwWEc1Y2JseHVJeU1qSUZBeExpQlZWQ0IyY3lCQlNVUmNibk5qYjNKbExuUmlKR1JsYm5OcGRIa2dQQzBnWjJWMFgyUmxibk5wZEhrb2MyTnZjbVV1ZEdJa1ZWUXNJSE5qYjNKbExuUmlKRUZKUkN3Z2JpQTlJREV3TUNsY2JuTmpiM0psTG5SaUlEd3RJSE5qYjNKbExuUmlJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlc1emFYUjVLVnh1WTI5eWNtVnNZWFJwYjI0Z1BDMGdZMjl5S0hOamIzSmxMblJpSkZWVUxDQnpZMjl5WlM1MFlpUkJTVVFwWEc1d01TQThMU0JuWjNCc2IzUW9jMk52Y21VdWRHSXNJR0ZsY3loNElEMGdWVlFzSUhrZ1BTQkJTVVFzSUdOdmJHOXlJRDBnWkdWdWMybDBlU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1hHNGdJSE5qWVd4bFgyTnZiRzl5WDNacGNtbGthWE1vS1NBclhHNGdJSGhzYVcwb0xUQXVOU3dnTVNrZ0t5QjViR2x0S0Mwd0xqVXNJREVwSUN0Y2JpQWdZMjl2Y21SZlptbDRaV1FvS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdNQ3dnWTI5c0lEMGdYRnhuY21WNU5UQmNYQ3dnYkdsdVpYUjVjR1VnUFNCY1hHUmhjMmhsWkZ4Y0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGeGNaM0psZVZ4Y0tTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGeGNaM0psZVZ4Y0tTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTFdScFptWkRkWFJ2Wm1Zc0lHTnZiQ0E5SUZ4Y1ozSmxlVnhjTENCc2FXNWxkSGx3WlNBOUlGeGNaRzkwZEdWa1hGd3BJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY1hHZHlaWGxjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1J2ZEhSbFpGeGNLU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHZG5kR2wwYkdVb2NHRnpkR1V3S0Z4Y1EyOXVjMlZ1YzNWeklHeHZiM0FnYzJOdmNtVmNYQ2twSUN0Y2JpQWdZVzV1YjNSaGRHVW9YRngwWlhoMFhGd3NJSGdnUFNBdE1DNDFMQ0I1SUQwZ01Td2diR0ZpWld3Z1BTQndZWE4wWlNoY1hISWdQVnhjTENCeWIzVnVaQ2hqYjNKeVpXeGhkR2x2Yml3Z01pa3BMQ0J6YVhwbElEMGdOU3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndwWEc1Y2JpTWpJeUJRTVM0Z1JFMVRUeUIyY3lCa1ZFRkhYRzV6WTI5eVpTNTBZaVJrWlc1emFYUjVJRHd0SUdkbGRGOWtaVzV6YVhSNUtITmpiM0psTG5SaUpFUk5VMDhzSUhOamIzSmxMblJpSkdSVVFVY3NJRzRnUFNBeE1EQXBYRzV6WTI5eVpTNTBZaUE4TFNCelkyOXlaUzUwWWlBbFBpVWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pHVnVjMmwwZVNsY2JtTnZjbkpsYkdGMGFXOXVJRHd0SUdOdmNpaHpZMjl5WlM1MFlpUkVUVk5QTENCelkyOXlaUzUwWWlSa1ZFRkhLVnh1Y0RJZ1BDMGdaMmR3Ykc5MEtITmpiM0psTG5SaUxDQmhaWE1vZUNBOUlFUk5VMDhzSUhrZ1BTQmtWRUZITENCamIyeHZjaUE5SUdSbGJuTnBkSGtwS1NBclhHNGdJR2RsYjIxZmNHOXBiblFvS1NBcklGeHVJQ0J6WTJGc1pWOWpiMnh2Y2w5MmFYSnBaR2x6S0NrZ0sxeHVJQ0I0YkdsdEtDMHdMalVzSURFcElDc2dlV3hwYlNndE1DNDFMQ0F4S1NBclhHNGdJR052YjNKa1gyWnBlR1ZrS0NrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJREFzSUdOdmJDQTlJRnhjWjNKbGVUVXdYRndzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SUMxa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY1hHZHlaWGxjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1J2ZEhSbFpGeGNLU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2dZMjlzSUQwZ1hGeG5jbVY1WEZ3c0lHeHBibVYwZVhCbElEMGdYRnhrYjNSMFpXUmNYQ2tnSzF4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5Qm5aM1JwZEd4bEtIQmhjM1JsTUNoY1hFTnZibk5sYm5OMWN5QnNiMjl3SUhOamIzSmxYRndwS1NBclhHNGdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ0xUQXVOU3dnZVNBOUlERXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVb1hGeHlJRDFjWEN3Z2NtOTFibVFvWTI5eWNtVnNZWFJwYjI0c0lESXBLU3dnYzJsNlpTQTlJRFVzSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjS1Z4dVhHNWNiaU1qSXlCUU15NGdSRTFUVHlCMmN5QkJORGcxWEc1elkyOXlaUzUwWWlSa1pXNXphWFI1SUR3dElHZGxkRjlrWlc1emFYUjVLSE5qYjNKbExuUmlKRVJOVTA4c0lITmpiM0psTG5SaUpFRTBPRFVzSUc0Z1BTQXhNREFwWEc1elkyOXlaUzUwWWlBOExTQnpZMjl5WlM1MFlpQWxQaVVnWkhCc2VYSTZPbUZ5Y21GdVoyVW9aR1Z1YzJsMGVTbGNibU52Y25KbGJHRjBhVzl1SUR3dElHTnZjaWh6WTI5eVpTNTBZaVJFVFZOUExDQnpZMjl5WlM1MFlpUkJORGcxS1Z4dWNETWdQQzBnWjJkd2JHOTBLSE5qYjNKbExuUmlMQ0JoWlhNb2VDQTlJRVJOVTA4c0lIa2dQU0JCTkRnMUxDQmpiMnh2Y2lBOUlHUmxibk5wZEhrcEtTQXJYRzRnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJRnh1SUNCelkyRnNaVjlqYjJ4dmNsOTJhWEpwWkdsektDa2dLMXh1SUNCNGJHbHRLQzB3TGpVc0lERXBJQ3NnZVd4cGJTZ3RNQzQxTENBeEtTQXJYRzRnSUdOdmIzSmtYMlpwZUdWa0tDa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SURBc0lHTnZiQ0E5SUZ4Y1ozSmxlVFV3WEZ3c0lHeHBibVYwZVhCbElEMGdYRnhrWVhOb1pXUmNYQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjWEdkeVpYbGNYQ2tnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjWEdkeVpYbGNYQ2tnSzF4dUlDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlDMWthV1ptUTNWMGIyWm1MQ0JqYjJ3Z1BTQmNYR2R5WlhsY1hDd2diR2x1WlhSNWNHVWdQU0JjWEdSdmRIUmxaRnhjS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYRnhuY21WNVhGd3NJR3hwYm1WMGVYQmxJRDBnWEZ4a2IzUjBaV1JjWENrZ0sxeHVJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJuWjNScGRHeGxLSEJoYzNSbE1DaGNYRU52Ym5ObGJuTjFjeUJzYjI5d0lITmpiM0psWEZ3cEtTQXJYRzRnSUdGdWJtOTBZWFJsS0Z4Y2RHVjRkRnhjTENCNElEMGdMVEF1TlN3Z2VTQTlJREVzSUd4aFltVnNJRDBnY0dGemRHVW9YRnh5SUQxY1hDd2djbTkxYm1Rb1kyOXljbVZzWVhScGIyNHNJRElwS1N3Z2MybDZaU0E5SURVc0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0tWeHVYRzRqSXlNZ1VETXVJRVJOVTA4Z2RuTWdWVlJjYm5OamIzSmxMblJpSkdSbGJuTnBkSGtnUEMwZ1oyVjBYMlJsYm5OcGRIa29jMk52Y21VdWRHSWtSRTFUVHl3Z2MyTnZjbVV1ZEdJa1ZWUXNJRzRnUFNBeE1EQXBYRzV6WTI5eVpTNTBZaUE4TFNCelkyOXlaUzUwWWlBbFBpVWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pHVnVjMmwwZVNsY2JtTnZjbkpsYkdGMGFXOXVJRHd0SUdOdmNpaHpZMjl5WlM1MFlpUkVUVk5QTENCelkyOXlaUzUwWWlSVlZDbGNibkEwSUR3dElHZG5jR3h2ZENoelkyOXlaUzUwWWl3Z1lXVnpLSGdnUFNCRVRWTlBMQ0I1SUQwZ1ZWUXNJR052Ykc5eUlEMGdaR1Z1YzJsMGVTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWEc0Z0lITmpZV3hsWDJOdmJHOXlYM1pwY21sa2FYTW9LU0FyWEc0Z0lIaHNhVzBvTFRBdU5Td2dNU2tnS3lCNWJHbHRLQzB3TGpVc0lERXBJQ3RjYmlBZ1kyOXZjbVJmWm1sNFpXUW9LU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ01Dd2dZMjlzSUQwZ1hGeG5jbVY1TlRCY1hDd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ4Y1ozSmxlVnhjS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ4Y1ozSmxlVnhjS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdMV1JwWm1aRGRYUnZabVlzSUdOdmJDQTlJRnhjWjNKbGVWeGNMQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHOTBkR1ZrWEZ3cElDdGNiaUFnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0JrYVdabVEzVjBiMlptTENCamIyd2dQU0JjWEdkeVpYbGNYQ3dnYkdsdVpYUjVjR1VnUFNCY1hHUnZkSFJsWkZ4Y0tTQXJYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUdkbmRHbDBiR1VvY0dGemRHVXdLRnhjUTI5dWMyVnVjM1Z6SUd4dmIzQWdjMk52Y21WY1hDa3BJQ3RjYmlBZ1lXNXViM1JoZEdVb1hGeDBaWGgwWEZ3c0lIZ2dQU0F0TUM0MUxDQjVJRDBnTVN3Z2JHRmlaV3dnUFNCd1lYTjBaU2hjWEhJZ1BWeGNMQ0J5YjNWdVpDaGpiM0p5Wld4aGRHbHZiaXdnTWlrcExDQnphWHBsSUQwZ05Td2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BYRzVjYmx4dUl5TWpJRkF6TGlCa1ZFRkhJSFp6SUVGSlJGeHVjMk52Y21VdWRHSWtaR1Z1YzJsMGVTQThMU0JuWlhSZlpHVnVjMmwwZVNoelkyOXlaUzUwWWlSa1ZFRkhMQ0J6WTI5eVpTNTBZaVJCU1VRc0lHNGdQU0F4TURBcFhHNXpZMjl5WlM1MFlpQThMU0J6WTI5eVpTNTBZaUFsUGlVZ1pIQnNlWEk2T21GeWNtRnVaMlVvWkdWdWMybDBlU2xjYm1OdmNuSmxiR0YwYVc5dUlEd3RJR052Y2loelkyOXlaUzUwWWlSa1ZFRkhMQ0J6WTI5eVpTNTBZaVJCU1VRcFhHNXdOU0E4TFNCblozQnNiM1FvYzJOdmNtVXVkR0lzSUdGbGN5aDRJRDBnWkZSQlJ5d2dlU0E5SUVGSlJDd2dZMjlzYjNJZ1BTQmtaVzV6YVhSNUtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJjYmlBZ2MyTmhiR1ZmWTI5c2IzSmZkbWx5YVdScGN5Z3BJQ3RjYmlBZ2VHeHBiU2d0TUM0MUxDQXhLU0FySUhsc2FXMG9MVEF1TlN3Z01Ta2dLMXh1SUNCamIyOXlaRjltYVhobFpDZ3BJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBd0xDQmpiMndnUFNCY1hHZHlaWGsxTUZ4Y0xDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Dd2dZV3h3YUdFZ1BTQXdMalVzSUdOdmJHOXlJRDBnWEZ4bmNtVjVYRndwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ01Dd2dZV3h3YUdFZ1BTQXdMalVzSUdOdmJHOXlJRDBnWEZ4bmNtVjVYRndwSUN0Y2JpQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXRaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYRnhuY21WNVhGd3NJR3hwYm1WMGVYQmxJRDBnWEZ4a2IzUjBaV1JjWENrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUdOdmJDQTlJRnhjWjNKbGVWeGNMQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHOTBkR1ZrWEZ3cElDdGNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWjJkMGFYUnNaU2h3WVhOMFpUQW9YRnhEYjI1elpXNXpkWE1nYkc5dmNDQnpZMjl5WlZ4Y0tTa2dLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJQzB3TGpVc0lIa2dQU0F4TENCc1lXSmxiQ0E5SUhCaGMzUmxLRnhjY2lBOVhGd3NJSEp2ZFc1a0tHTnZjbkpsYkdGMGFXOXVMQ0F5S1Nrc0lITnBlbVVnUFNBMUxDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDbGNibHh1SXlNaklGQXpMaUJrYVdabVhHNXpZMjl5WlM1MFlpUmtaVzV6YVhSNUlEd3RJR2RsZEY5a1pXNXphWFI1S0hOamIzSmxMblJpSkdScFptWmZSekVzSUhOamIzSmxMblJpSkdScFptWmZZWE41Ym1Nc0lHNGdQU0F4TURBcFhHNXpZMjl5WlM1MFlpQThMU0J6WTI5eVpTNTBZaUFsUGlVZ1pIQnNlWEk2T21GeWNtRnVaMlVvWkdWdWMybDBlU2xjYm1OdmNuSmxiR0YwYVc5dUlEd3RJR052Y2loelkyOXlaUzUwWWlSa2FXWm1YMGN4TENCelkyOXlaUzUwWWlSa2FXWm1YMkZ6ZVc1aktWeHVjRFlnUEMwZ1oyZHdiRzkwS0hOamIzSmxMblJpTENCaFpYTW9lQ0E5SUdScFptWmZSekVzSUhrZ1BTQmthV1ptWDJGemVXNWpMQ0JqYjJ4dmNpQTlJR1JsYm5OcGRIa3BLU0FyWEc0Z0lHZGxiMjFmY0c5cGJuUW9LU0FySUZ4dUlDQnpZMkZzWlY5amIyeHZjbDkyYVhKcFpHbHpLQ2tnSzF4dUlDQjRiR2x0S0MweExDQXdMalVwSUNzZ2VXeHBiU2d0TVN3Z01DNDFLU0FyWEc0Z0lHTnZiM0prWDJacGVHVmtLQ2tnSzF4dUlDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlEQXNJR052YkNBOUlGeGNaM0psZVRVd1hGd3NJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMQ0JoYkhCb1lTQTlJREF1TlN3Z1kyOXNiM0lnUFNCY1hHZHlaWGxjWENrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXdMQ0JoYkhCb1lTQTlJREF1TlN3Z1kyOXNiM0lnUFNCY1hHZHlaWGxjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQmthV1ptUTNWMGIyWm1MQ0JoYkhCb1lTQTlJREF1TlN3Z1kyOXNiM0lnUFNCY1hHZHlaWGxjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXRaR2xtWmtOMWRHOW1aaXdnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hGeG5jbVY1WEZ3cElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hGeG5jbVY1WEZ3cElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdMV1JwWm1aRGRYUnZabVlzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGeGNaM0psZVZ4Y0tTQXJYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUdkbmRHbDBiR1VvY0dGemRHVXdLRnhjUTI5dWMyVnVjM1Z6SUd4dmIzQWdjMk52Y21WY1hDa3BJQ3RjYmlBZ1lXNXViM1JoZEdVb1hGeDBaWGgwWEZ3c0lIZ2dQU0F0TVN3Z2VTQTlJREF1TlN3Z2JHRmlaV3dnUFNCd1lYTjBaU2hjWEhJZ1BWeGNMQ0J5YjNWdVpDaGpiM0p5Wld4aGRHbHZiaXdnTWlrcExDQnphWHBsSUQwZ05Td2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BYRzVjYmx4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWEZ4amIyNXpaVzV6ZFhOZmMyTnZjbVZmYzJOaGRIUmxjbkJzYjNSZmNIVXhNREJ3ZWpFd01GOUhNWFp6UVhONWJtTmZjM1J5TG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkSE1nUFNCY1hHbHVYRndzSUhkcFpIUm9JRDBnTlNveUxqVXNJR2hsYVdkb2RDQTlJREl1TlNveUxqVXBYRzV3Y21sdWRDaGpiM2R3Ykc5ME9qcHdiRzkwWDJkeWFXUW9jREVzSUhBeUxDQndNeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0RRc0lIQTFMQ0J3Tml3Z1lXeHBaMjRnUFNCY1hHaGNYQ3dnYm1OdmJDQTlJRE1wS1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9YRnhqYjI1elpXNXpkWE5mYzJOdmNtVmZjMk5oZEhSbGNuQnNiM1JmY0hVeE1EQndlakV3TUY5SE1YWnpRWE41Ym1OZmMzUnlMbk4yWjF4Y0tTa3NJSGRwWkhSb0lEMGdOU295TGpVc0lHaGxhV2RvZENBOUlESXVOU295TGpVcFhHNXdjbWx1ZENoamIzZHdiRzkwT2pwd2JHOTBYMmR5YVdRb2NERXNJSEF5TENCd015d2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjRFFzSUhBMUxDQndOaXdnWVd4cFoyNGdQU0JjWEdoY1hDd2dibU52YkNBOUlETXBLVnh1WkdWMkxtOW1aaWdwWEc1Y2JseHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG50ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShyZXMgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIHJlcywgVjIsIFY1LCBzZXAgPSBcXF9cXCkpXG5yZWdJRCA8LSB0ZW1wJGlkXG5cbmRpZmZDdXRvZmYgPSAwLjJcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKVxuXG50ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX3Njb3JlX2FzeW5jLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIFVULCBBSUQpXG5cbnNjb3JlLnRiIDwtIGRhdGEgJT4lIGRwbHlyOjpmdWxsX2pvaW4odGVtcCwgYnkgPSBjKFxcaWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGRpZmZfRzEgPSBkVEFHIC0gRE1TTyxcbiAgICAgICAgICAgICAgICAgIGRpZmZfYXN5bmMgPSBBSUQgLSBVVCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSByZWdJRClcblxuXG4jIyMgUDEuIFVUIHZzIEFJRFxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRVVCwgc2NvcmUudGIkQUlELCBuID0gMTAwKVxuc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5jb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkVVQsIHNjb3JlLnRiJEFJRClcbnAxIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBVVCwgeSA9IEFJRCwgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIFAxLiBETVNPIHZzIGRUQUdcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkRE1TTywgc2NvcmUudGIkZFRBRywgbiA9IDEwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJGRUQUcpXG5wMiA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gRE1TTywgeSA9IGRUQUcsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cblxuIyMjIFAzLiBETVNPIHZzIEE0ODVcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkRE1TTywgc2NvcmUudGIkQTQ4NSwgbiA9IDEwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJEE0ODUpXG5wMyA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gRE1TTywgeSA9IEE0ODUsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyBQMy4gRE1TTyB2cyBVVFxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRETVNPLCBzY29yZS50YiRVVCwgbiA9IDEwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJFVUKVxucDQgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IERNU08sIHkgPSBVVCwgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuXG4jIyMgUDMuIGRUQUcgdnMgQUlEXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJGRUQUcsIHNjb3JlLnRiJEFJRCwgbiA9IDEwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJGRUQUcsIHNjb3JlLnRiJEFJRClcbnA1IDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBkVEFHLCB5ID0gQUlELCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG4jIyMgUDMuIGRpZmZcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkZGlmZl9HMSwgc2NvcmUudGIkZGlmZl9hc3luYywgbiA9IDEwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJGRpZmZfRzEsIHNjb3JlLnRiJGRpZmZfYXN5bmMpXG5wNiA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gZGlmZl9HMSwgeSA9IGRpZmZfYXN5bmMsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTEsIDAuNSkgKyB5bGltKC0xLCAwLjUpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0xLCB5ID0gMC41LCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChcXGNvbnNlbnN1c19zY29yZV9zY2F0dGVycGxvdF9wdTEwMHB6MTAwX0cxdnNBc3luY19zdHIucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSA1KjIuNSwgaGVpZ2h0ID0gMi41KjIuNSlcbnByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIHAzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICBwNCwgcDUsIHA2LCBhbGlnbiA9IFxcaFxcLCBuY29sID0gMykpXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChcXGNvbnNlbnN1c19zY29yZV9zY2F0dGVycGxvdF9wdTEwMHB6MTAwX0cxdnNBc3luY19zdHIuc3ZnXFwpKSwgd2lkdGggPSA1KjIuNSwgaGVpZ2h0ID0gMi41KjIuNSlcbnByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIHAzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICBwNCwgcDUsIHA2LCBhbGlnbiA9IFxcaFxcLCBuY29sID0gMykpXG5kZXYub2ZmKClcblxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVtcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZS5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUocmVzID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCByZXMsIFYyLCBWNSwgc2VwID0gXFxfXFwpKVxucmVnSUQgPC0gdGVtcCRpZFxuXG5kaWZmQ3V0b2ZmID0gMC4yXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX3Njb3JlLnRzdlxcKSlcblxudGVtcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZV9hc3luYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGlkLCBVVCwgQUlEKVxuXG5zY29yZS50YiA8LSBkYXRhICU+JSBkcGx5cjo6ZnVsbF9qb2luKHRlbXAsIGJ5ID0gYyhcXGlkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShkaWZmX0cxID0gZFRBRyAtIERNU08sXG4gICAgICAgICAgICAgICAgICBkaWZmX2FzeW5jID0gQUlEIC0gVVQpICU+JVxuICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgcmVnSUQpXG5cblxuIyMjIFAxLiBVVCB2cyBBSURcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkVVQsIHNjb3JlLnRiJEFJRCwgbiA9IDEwMClcbnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJFVULCBzY29yZS50YiRBSUQpXG5wMSA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gVVQsIHkgPSBBSUQsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyBQMS4gRE1TTyB2cyBkVEFHXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJGRUQUcsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRETVNPLCBzY29yZS50YiRkVEFHKVxucDIgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IERNU08sIHkgPSBkVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG5cbiMjIyBQMy4gRE1TTyB2cyBBNDg1XG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJEE0ODUsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRETVNPLCBzY29yZS50YiRBNDg1KVxucDMgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IERNU08sIHkgPSBBNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChcXENvbnNlbnN1cyBsb29wIHNjb3JlXFwpKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoXFxyID1cXCwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG4jIyMgUDMuIERNU08gdnMgVVRcbnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkRE1TTywgc2NvcmUudGIkVVQsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRETVNPLCBzY29yZS50YiRVVClcbnA0IDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gVVQsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cblxuIyMjIFAzLiBkVEFHIHZzIEFJRFxuc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRkVEFHLCBzY29yZS50YiRBSUQsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRkVEFHLCBzY29yZS50YiRBSUQpXG5wNSA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gZFRBRywgeSA9IEFJRCwgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KCkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgK1xuICBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxDb25zZW5zdXMgbG9vcCBzY29yZVxcKSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKFxcciA9XFwsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIFAzLiBkaWZmXG5zY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJGRpZmZfRzEsIHNjb3JlLnRiJGRpZmZfYXN5bmMsIG4gPSAxMDApXG5zY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRkaWZmX0cxLCBzY29yZS50YiRkaWZmX2FzeW5jKVxucDYgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IGRpZmZfRzEsIHkgPSBkaWZmX2FzeW5jLCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0xLCAwLjUpICsgeWxpbSgtMSwgMC41KSArXG4gIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcQ29uc2Vuc3VzIGxvb3Agc2NvcmVcXCkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cblxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxjb25zZW5zdXNfc2NvcmVfc2NhdHRlcnBsb3RfcHUxMDBwejEwMF9HMXZzQXN5bmNfc3RyLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNSoyLjUsIGhlaWdodCA9IDIuNSoyLjUpXG5wcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBwMywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgcDQsIHA1LCBwNiwgYWxpZ24gPSBcXGhcXCwgbmNvbCA9IDMpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxjb25zZW5zdXNfc2NvcmVfc2NhdHRlcnBsb3RfcHUxMDBwejEwMF9HMXZzQXN5bmNfc3RyLnN2Z1xcKSksIHdpZHRoID0gNSoyLjUsIGhlaWdodCA9IDIuNSoyLjUpXG5wcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBwMywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgcDQsIHA1LCBwNiwgYWxpZ24gPSBcXGhcXCwgbmNvbCA9IDMpKVxuZGV2Lm9mZigpXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
temp <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure.bedpe\)) %>%
  dplyr::mutate(res = V3 - V2,
                id = paste(V1, res, V2, V5, sep = \_\))
regID <- temp$id

diffCutoff = 0.2
data <- fread(here(consensusDir, \chromo_cons_score.tsv\))

temp <- fread(here(consensusDir, \chromo_cons_score_async.tsv\)) %>%
  dplyr::select(id, UT, AID)

score.tb <- data %>% dplyr::full_join(temp, by = c(\id\)) %>%
  dplyr::mutate(diff_G1 = dTAG - DMSO,
                  diff_async = AID - UT) %>%
  dplyr::filter(id %in% regID)


### P1. UT vs AID
score.tb$density <- get_density(score.tb$UT, score.tb$AID, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$UT, score.tb$AID)
p1 <- ggplot(score.tb, aes(x = UT, y = AID, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P1. DMSO vs dTAG
score.tb$density <- get_density(score.tb$DMSO, score.tb$dTAG, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$dTAG)
p2 <- ggplot(score.tb, aes(x = DMSO, y = dTAG, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


### P3. DMSO vs A485
score.tb$density <- get_density(score.tb$DMSO, score.tb$A485, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$A485)
p3 <- ggplot(score.tb, aes(x = DMSO, y = A485, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P3. DMSO vs UT
score.tb$density <- get_density(score.tb$DMSO, score.tb$UT, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$DMSO, score.tb$UT)
p4 <- ggplot(score.tb, aes(x = DMSO, y = UT, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


### P3. dTAG vs AID
score.tb$density <- get_density(score.tb$dTAG, score.tb$AID, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$dTAG, score.tb$AID)
p5 <- ggplot(score.tb, aes(x = dTAG, y = AID, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

### P3. diff
score.tb$density <- get_density(score.tb$diff_G1, score.tb$diff_async, n = 100)
score.tb <- score.tb %>% dplyr::arrange(density)
correlation <- cor(score.tb$diff_G1, score.tb$diff_async)
p6 <- ggplot(score.tb, aes(x = diff_G1, y = diff_async, color = density)) +
  geom_point() + 
  scale_color_viridis() +
  xlim(-1, 0.5) + ylim(-1, 0.5) +
  coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  geom_hline(yintercept = diffCutoff, alpha = 0.5, color = \grey\) +
  geom_hline(yintercept = -diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = diffCutoff, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = -diffCutoff, alpha = 0.5, color = \grey\) +
  theme_classic() + ggtitle(paste0(\Consensus loop score\)) +
  annotate(\text\, x = -1, y = 0.5, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)


png(here(figDir, paste0(\consensus_score_scatterplot_pu100pz100_G1vsAsync_str.png\)), res = 600, units = \in\, width = 5*2.5, height = 2.5*2.5)
print(cowplot::plot_grid(p1, p2, p3, 
                         p4, p5, p6, align = \h\, ncol = 3))
dev.off()
svglite(here(figDir, paste0(\consensus_score_scatterplot_pu100pz100_G1vsAsync_str.svg\)), width = 5*2.5, height = 2.5*2.5)
print(cowplot::plot_grid(p1, p2, p3, 
                         p4, p5, p6, align = \h\, ncol = 3))
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### reg loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJKYlhCdmNuUnBibWNnYkc5dmNITXVJRVp2Y2lCdFlXdGxJR052YlhCaGNtbHpiMjRnWldGemFXVnlMQ0F5TlNCcllseHVZbWx1VTJsNlpTQTlJREkxS2pFd01EQmNiblJsYlhBZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpVkdwcFlXNWZZMmh5YjIxdmMybG5hSFJmYkc5dmNDNWlaV1J3WlZ3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWTJWdWRHVnlNU0E5SURBdU5Tb29WaklnS3lCV015a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMlZ1ZEdWeU1pQTlJREF1TlNvb1ZqVWdLeUJXTmlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzUmhjblF4SUQwZ1kyVnVkR1Z5TVNBdElEQXVOU3BpYVc1VGFYcGxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1Z1WkRFZ1BTQmpaVzUwWlhJeElDc2dNQzQxS21KcGJsTnBlbVVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNSaGNuUXlJRDBnWTJWdWRHVnlNaUF0SURBdU5TcGlhVzVUYVhwbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnVaRElnUFNCalpXNTBaWEl5SUNzZ01DNDFLbUpwYmxOcGVtVXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0ZZeExDQnpkR0Z5ZERFc0lHVnVaREVzSUZZMExDQnpkR0Z5ZERJc0lHVnVaRElwWEc1amIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGd2lWakZjSWl3Z1hDSldNbHdpTENCY0lsWXpYQ0lzSUZ3aVZqUmNJaXdnWENKV05Wd2lMQ0JjSWxZMlhDSXBYRzVzYjI5d0xtRnplVzVqSUR3dElHbHRjRzl5ZEVKbFpIQmxLSFJsYlhBcFhHNWNibHh1WW1sdVUybDZaU0E5SURJMUtqRXdNREJjYm5SbGJYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5NdVltVmtjR1ZjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR05sYm5SbGNqRWdQU0F3TGpVcUtGWXlJQ3NnVmpNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTmxiblJsY2pJZ1BTQXdMalVxS0ZZMUlDc2dWallwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOMFlYSjBNU0E5SUdObGJuUmxjakVnTFNBd0xqVXFZbWx1VTJsNlpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxibVF4SUQwZ1kyVnVkR1Z5TVNBcklEQXVOU3BpYVc1VGFYcGxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE4wWVhKME1pQTlJR05sYm5SbGNqSWdMU0F3TGpVcVltbHVVMmw2WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJtUXlJRDBnWTJWdWRHVnlNaUFySURBdU5TcGlhVzVUYVhwbEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hXTVN3Z2MzUmhjblF4TENCbGJtUXhMQ0JXTkN3Z2MzUmhjblF5TENCbGJtUXlLVnh1WTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY0lsWXhYQ0lzSUZ3aVZqSmNJaXdnWENKV00xd2lMQ0JjSWxZMFhDSXNJRndpVmpWY0lpd2dYQ0pXTmx3aUtWeHViRzl2Y0M1SE1TQThMU0JwYlhCdmNuUkNaV1J3WlNoMFpXMXdLVnh1WEc1Y2JpTWdRMmhsWTJzZ2IzWmxjbXhoY0Z4dWIzWmxjbXhoY0NBOExTQm1hVzVrVDNabGNteGhjSE1vYkc5dmNDNWhjM2x1WXl3Z2JHOXZjQzVITVNsY2JseHVYRzV1TG1GemVXNWpJRHd0SUc1eWIzY29ZWE5mZEdsaVlteGxLR3h2YjNBdVlYTjVibU1wS1Z4dWJpNUhNU0E4TFNCdWNtOTNLR0Z6WDNScFltSnNaU2hzYjI5d0xrY3hLU2xjYm00dVlYTjVibU11YjNabGNteGhjQ0E4TFNCc1pXNW5kR2dvZFc1cGNYVmxLSEYxWlhKNVNHbDBjeWh2ZG1WeWJHRndLU2twWEc1dUxrY3hMbTkyWlhKc1lYQWdQQzBnYkdWdVozUm9LSFZ1YVhGMVpTaHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndLU2twWEc1Y2JuQnNiM1FvWlhWc1pYSW9ZeWhjSWtGemVXNWpYQ0lnUFNCdUxtRnplVzVqSUMwZ2JpNWhjM2x1WXk1dmRtVnliR0Z3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJRndpUVhONWJtTW1SekZjSWlBOUlHNHVZWE41Ym1NdWIzWmxjbXhoY0N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JjSWtjeFhDSWdQU0F4S1Nrc0lIRjFZVzUwYVhScFpYTWdQU0JVVWxWRktWeHVYRzVjYm5Cc2IzUW9aWFZzWlhJb1l5aGNJa0Z6ZVc1alhDSWdQVEVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdYQ0pCYzNsdVl5WkhNVndpSUQwZ2JpNUhNUzV2ZG1WeWJHRndMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lGd2lSekZjSWlBOUlHNHVSekVnTFNCdUxrY3hMbTkyWlhKc1lYQXBLU3dnY1hWaGJuUnBkR2xsY3lBOUlGUlNWVVVwWEc1Y2JseHVYRzVjYmlNZ1NXMXdiM0owYVc1bklHeHZiM0J6TGlCR2IzSWdiV0ZyWlNCamIyMXdZWEpwYzI5dUlHVmhjMmxsY2l3Z01qVWdhMkpjYm1KcGJsTnBlbVVnUFNBeU5Tb3hNREF3WEc1MFpXMXdMbkJ3SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbFJxYVdGdVgyTm9jbTl0YjNOcFoyaDBYMnh2YjNCZlVDMVFMbUpsWkhCbFhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoalpXNTBaWEl4SUQwZ01DNDFLaWhXTWlBcklGWXpLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWlc1MFpYSXlJRDBnTUM0MUtpaFdOU0FySUZZMktTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpkR0Z5ZERFZ1BTQmpaVzUwWlhJeElDMGdNQzQxS21KcGJsTnBlbVVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWlc1a01TQTlJR05sYm5SbGNqRWdLeUF3TGpVcVltbHVVMmw2WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRHRnlkRElnUFNCalpXNTBaWEl5SUMwZ01DNDFLbUpwYmxOcGVtVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaVzVrTWlBOUlHTmxiblJsY2pJZ0t5QXdMalVxWW1sdVUybDZaU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1ZqRXNJSE4wWVhKME1Td2daVzVrTVN3Z1ZqUXNJSE4wWVhKME1pd2daVzVrTWlsY2JtTnZiRzVoYldWektIUmxiWEF1Y0hBcElEd3RJR01vWENKV01Wd2lMQ0JjSWxZeVhDSXNJRndpVmpOY0lpd2dYQ0pXTkZ3aUxDQmNJbFkxWENJc0lGd2lWalpjSWlsY2JtSnBibE5wZW1VZ1BTQXlOU294TURBd1hHNTBaVzF3TG1Wd0lEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSWxScWFXRnVYMk5vY205dGIzTnBaMmgwWDJ4dmIzQmZSUzFRTG1KbFpIQmxYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGpaVzUwWlhJeElEMGdNQzQxS2loV01pQXJJRll6S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCalpXNTBaWEl5SUQwZ01DNDFLaWhXTlNBcklGWTJLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZEdGeWRERWdQU0JqWlc1MFpYSXhJQzBnTUM0MUttSnBibE5wZW1Vc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pXNWtNU0E5SUdObGJuUmxjakVnS3lBd0xqVXFZbWx1VTJsNlpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpkR0Z5ZERJZ1BTQmpaVzUwWlhJeUlDMGdNQzQxS21KcGJsTnBlbVVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWlc1a01pQTlJR05sYm5SbGNqSWdLeUF3TGpVcVltbHVVMmw2WlNrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9WakVzSUhOMFlYSjBNU3dnWlc1a01Td2dWalFzSUhOMFlYSjBNaXdnWlc1a01pbGNibU52Ykc1aGJXVnpLSFJsYlhBdVpYQXBJRHd0SUdNb1hDSldNVndpTENCY0lsWXlYQ0lzSUZ3aVZqTmNJaXdnWENKV05Gd2lMQ0JjSWxZMVhDSXNJRndpVmpaY0lpbGNiblJsYlhBZ1BDMGdZbWx1WkY5eWIzZHpLSFJsYlhBdWNIQXNJSFJsYlhBdVpYQXBYRzVzYjI5d0xtRnplVzVqSUR3dElHbHRjRzl5ZEVKbFpIQmxLSFJsYlhBcFhHNWNibHh1WW1sdVUybDZaU0E5SURJMUtqRXdNREJjYm5SbGJYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pTNWlaV1J3WlZ3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWTJWdWRHVnlNU0E5SURBdU5Tb29WaklnS3lCV015a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMlZ1ZEdWeU1pQTlJREF1TlNvb1ZqVWdLeUJXTmlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzUmhjblF4SUQwZ1kyVnVkR1Z5TVNBdElEQXVOU3BpYVc1VGFYcGxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1Z1WkRFZ1BTQmpaVzUwWlhJeElDc2dNQzQxS21KcGJsTnBlbVVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNSaGNuUXlJRDBnWTJWdWRHVnlNaUF0SURBdU5TcGlhVzVUYVhwbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnVaRElnUFNCalpXNTBaWEl5SUNzZ01DNDFLbUpwYmxOcGVtVXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0ZZeExDQnpkR0Z5ZERFc0lHVnVaREVzSUZZMExDQnpkR0Z5ZERJc0lHVnVaRElwWEc1amIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGd2lWakZjSWl3Z1hDSldNbHdpTENCY0lsWXpYQ0lzSUZ3aVZqUmNJaXdnWENKV05Wd2lMQ0JjSWxZMlhDSXBYRzVzYjI5d0xrY3hJRHd0SUdsdGNHOXlkRUpsWkhCbEtIUmxiWEFwWEc1Y2JseHVJeUJEYUdWamF5QnZkbVZ5YkdGd1hHNXZkbVZ5YkdGd0lEd3RJR1pwYm1SUGRtVnliR0Z3Y3loc2IyOXdMbUZ6ZVc1akxDQnNiMjl3TGtjeEtWeHVYRzVjYm00dVlYTjVibU1nUEMwZ2JuSnZkeWhoYzE5MGFXSmliR1VvYkc5dmNDNWhjM2x1WXlrcFhHNXVMa2N4SUR3dElHNXliM2NvWVhOZmRHbGlZbXhsS0d4dmIzQXVSekVwS1Z4dWJpNWhjM2x1WXk1dmRtVnliR0Z3SUR3dElHeGxibWQwYUNoMWJtbHhkV1VvY1hWbGNubElhWFJ6S0c5MlpYSnNZWEFwS1NsY2JtNHVSekV1YjNabGNteGhjQ0E4TFNCc1pXNW5kR2dvZFc1cGNYVmxLSE4xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEFwS1NsY2JseHVjR3h2ZENobGRXeGxjaWhqS0Z3aVFYTjVibU5jSWlBOUlHNHVZWE41Ym1NZ0xTQnVMbUZ6ZVc1akxtOTJaWEpzWVhBc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnWENKQmMzbHVZeVpITVZ3aUlEMGdiaTVoYzNsdVl5NXZkbVZ5YkdGd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVJ6RmNJaUE5SURFcEtTd2djWFZoYm5ScGRHbGxjeUE5SUZSU1ZVVXBYRzVjYmx4dWNHeHZkQ2hsZFd4bGNpaGpLRndpUVhONWJtTmNJaUE5TUM0eExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVFYTjVibU1tUnpGY0lpQTlJRzR1UnpFdWIzWmxjbXhoY0N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JjSWtjeFhDSWdQU0J1TGtjeElDMGdiaTVITVM1dmRtVnliR0Z3S1Nrc0lIRjFZVzUwYVhScFpYTWdQU0JVVWxWRktWeHVYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbiMgSW1wb3J0aW5nIGxvb3BzLiBGb3IgbWFrZSBjb21wYXJpc29uIGVhc2llciwgMjUga2JcbmJpblNpemUgPSAyNSoxMDAwXG50ZW1wIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXFRqaWFuX2Nocm9tb3NpZ2h0X2xvb3AuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGNlbnRlcjEgPSAwLjUqKFYyICsgVjMpLFxuICAgICAgICAgICAgICAgIGNlbnRlcjIgPSAwLjUqKFY1ICsgVjYpLFxuICAgICAgICAgICAgICAgIHN0YXJ0MSA9IGNlbnRlcjEgLSAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBlbmQxID0gY2VudGVyMSArIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIHN0YXJ0MiA9IGNlbnRlcjIgLSAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBlbmQyID0gY2VudGVyMiArIDAuNSpiaW5TaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgc3RhcnQxLCBlbmQxLCBWNCwgc3RhcnQyLCBlbmQyKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXFYxXFwsIFxcVjJcXCwgXFxWM1xcLCBcXFY0XFwsIFxcVjVcXCwgXFxWNlxcKVxubG9vcC5hc3luYyA8LSBpbXBvcnRCZWRwZSh0ZW1wKVxuXG5cbmJpblNpemUgPSAyNSoxMDAwXG50ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShjZW50ZXIxID0gMC41KihWMiArIFYzKSxcbiAgICAgICAgICAgICAgICBjZW50ZXIyID0gMC41KihWNSArIFY2KSxcbiAgICAgICAgICAgICAgICBzdGFydDEgPSBjZW50ZXIxIC0gMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgZW5kMSA9IGNlbnRlcjEgKyAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBzdGFydDIgPSBjZW50ZXIyIC0gMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgZW5kMiA9IGNlbnRlcjIgKyAwLjUqYmluU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIHN0YXJ0MSwgZW5kMSwgVjQsIHN0YXJ0MiwgZW5kMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxWMVxcLCBcXFYyXFwsIFxcVjNcXCwgXFxWNFxcLCBcXFY1XFwsIFxcVjZcXClcbmxvb3AuRzEgPC0gaW1wb3J0QmVkcGUodGVtcClcblxuXG4jIENoZWNrIG92ZXJsYXBcbm92ZXJsYXAgPC0gZmluZE92ZXJsYXBzKGxvb3AuYXN5bmMsIGxvb3AuRzEpXG5cblxubi5hc3luYyA8LSBucm93KGFzX3RpYmJsZShsb29wLmFzeW5jKSlcbm4uRzEgPC0gbnJvdyhhc190aWJibGUobG9vcC5HMSkpXG5uLmFzeW5jLm92ZXJsYXAgPC0gbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcCkpKVxubi5HMS5vdmVybGFwIDwtIGxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcCkpKVxuXG5wbG90KGV1bGVyKGMoXFxBc3luY1xcID0gbi5hc3luYyAtIG4uYXN5bmMub3ZlcmxhcCxcbiAgICAgICAgICAgICBcXEFzeW5jJkcxXFwgPSBuLmFzeW5jLm92ZXJsYXAsXG4gICAgICAgICAgICAgXFxHMVxcID0gMSkpLCBxdWFudGl0aWVzID0gVFJVRSlcblxuXG5wbG90KGV1bGVyKGMoXFxBc3luY1xcID0xLFxuICAgICAgICAgICAgIFxcQXN5bmMmRzFcXCA9IG4uRzEub3ZlcmxhcCxcbiAgICAgICAgICAgICBcXEcxXFwgPSBuLkcxIC0gbi5HMS5vdmVybGFwKSksIHF1YW50aXRpZXMgPSBUUlVFKVxuXG5cblxuXG4jIEltcG9ydGluZyBsb29wcy4gRm9yIG1ha2UgY29tcGFyaXNvbiBlYXNpZXIsIDI1IGtiXG5iaW5TaXplID0gMjUqMTAwMFxudGVtcC5wcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxUamlhbl9jaHJvbW9zaWdodF9sb29wX1AtUC5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoY2VudGVyMSA9IDAuNSooVjIgKyBWMyksXG4gICAgICAgICAgICAgICAgY2VudGVyMiA9IDAuNSooVjUgKyBWNiksXG4gICAgICAgICAgICAgICAgc3RhcnQxID0gY2VudGVyMSAtIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIGVuZDEgPSBjZW50ZXIxICsgMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgc3RhcnQyID0gY2VudGVyMiAtIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIGVuZDIgPSBjZW50ZXIyICsgMC41KmJpblNpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBzdGFydDEsIGVuZDEsIFY0LCBzdGFydDIsIGVuZDIpXG5jb2xuYW1lcyh0ZW1wLnBwKSA8LSBjKFxcVjFcXCwgXFxWMlxcLCBcXFYzXFwsIFxcVjRcXCwgXFxWNVxcLCBcXFY2XFwpXG5iaW5TaXplID0gMjUqMTAwMFxudGVtcC5lcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxUamlhbl9jaHJvbW9zaWdodF9sb29wX0UtUC5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoY2VudGVyMSA9IDAuNSooVjIgKyBWMyksXG4gICAgICAgICAgICAgICAgY2VudGVyMiA9IDAuNSooVjUgKyBWNiksXG4gICAgICAgICAgICAgICAgc3RhcnQxID0gY2VudGVyMSAtIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIGVuZDEgPSBjZW50ZXIxICsgMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgc3RhcnQyID0gY2VudGVyMiAtIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIGVuZDIgPSBjZW50ZXIyICsgMC41KmJpblNpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBzdGFydDEsIGVuZDEsIFY0LCBzdGFydDIsIGVuZDIpXG5jb2xuYW1lcyh0ZW1wLmVwKSA8LSBjKFxcVjFcXCwgXFxWMlxcLCBcXFYzXFwsIFxcVjRcXCwgXFxWNVxcLCBcXFY2XFwpXG50ZW1wIDwtIGJpbmRfcm93cyh0ZW1wLnBwLCB0ZW1wLmVwKVxubG9vcC5hc3luYyA8LSBpbXBvcnRCZWRwZSh0ZW1wKVxuXG5cbmJpblNpemUgPSAyNSoxMDAwXG50ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGNlbnRlcjEgPSAwLjUqKFYyICsgVjMpLFxuICAgICAgICAgICAgICAgIGNlbnRlcjIgPSAwLjUqKFY1ICsgVjYpLFxuICAgICAgICAgICAgICAgIHN0YXJ0MSA9IGNlbnRlcjEgLSAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBlbmQxID0gY2VudGVyMSArIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIHN0YXJ0MiA9IGNlbnRlcjIgLSAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBlbmQyID0gY2VudGVyMiArIDAuNSpiaW5TaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgc3RhcnQxLCBlbmQxLCBWNCwgc3RhcnQyLCBlbmQyKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXFYxXFwsIFxcVjJcXCwgXFxWM1xcLCBcXFY0XFwsIFxcVjVcXCwgXFxWNlxcKVxubG9vcC5HMSA8LSBpbXBvcnRCZWRwZSh0ZW1wKVxuXG5cbiMgQ2hlY2sgb3ZlcmxhcFxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMobG9vcC5hc3luYywgbG9vcC5HMSlcblxuXG5uLmFzeW5jIDwtIG5yb3coYXNfdGliYmxlKGxvb3AuYXN5bmMpKVxubi5HMSA8LSBucm93KGFzX3RpYmJsZShsb29wLkcxKSlcbm4uYXN5bmMub3ZlcmxhcCA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwKSkpXG5uLkcxLm92ZXJsYXAgPC0gbGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwKSkpXG5cbnBsb3QoZXVsZXIoYyhcXEFzeW5jXFwgPSBuLmFzeW5jIC0gbi5hc3luYy5vdmVybGFwLFxuICAgICAgICAgICAgIFxcQXN5bmMmRzFcXCA9IG4uYXN5bmMub3ZlcmxhcCxcbiAgICAgICAgICAgICBcXEcxXFwgPSAxKSksIHF1YW50aXRpZXMgPSBUUlVFKVxuXG5cbnBsb3QoZXVsZXIoYyhcXEFzeW5jXFwgPTAuMSxcbiAgICAgICAgICAgICBcXEFzeW5jJkcxXFwgPSBuLkcxLm92ZXJsYXAsXG4gICAgICAgICAgICAgXFxHMVxcID0gbi5HMSAtIG4uRzEub3ZlcmxhcCkpLCBxdWFudGl0aWVzID0gVFJVRSlcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# Importing loops. For make comparison easier, 25 kb
binSize = 25*1000
temp <- fread(here(refDir, \Tjian_chromosight_loop.bedpe\)) %>%
  dplyr::mutate(center1 = 0.5*(V2 + V3),
                center2 = 0.5*(V5 + V6),
                start1 = center1 - 0.5*binSize,
                end1 = center1 + 0.5*binSize,
                start2 = center2 - 0.5*binSize,
                end2 = center2 + 0.5*binSize) %>%
  dplyr::select(V1, start1, end1, V4, start2, end2)
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
loop.async <- importBedpe(temp)


binSize = 25*1000
temp <- fread(here(consensusDir, \chromo_cons.bedpe\)) %>%
  dplyr::mutate(center1 = 0.5*(V2 + V3),
                center2 = 0.5*(V5 + V6),
                start1 = center1 - 0.5*binSize,
                end1 = center1 + 0.5*binSize,
                start2 = center2 - 0.5*binSize,
                end2 = center2 + 0.5*binSize) %>%
  dplyr::select(V1, start1, end1, V4, start2, end2)
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
loop.G1 <- importBedpe(temp)


# Check overlap
overlap <- findOverlaps(loop.async, loop.G1)


n.async <- nrow(as_tibble(loop.async))
n.G1 <- nrow(as_tibble(loop.G1))
n.async.overlap <- length(unique(queryHits(overlap)))
n.G1.overlap <- length(unique(subjectHits(overlap)))

plot(euler(c(\Async\ = n.async - n.async.overlap,
             \Async&G1\ = n.async.overlap,
             \G1\ = 1)), quantities = TRUE)


plot(euler(c(\Async\ =1,
             \Async&G1\ = n.G1.overlap,
             \G1\ = n.G1 - n.G1.overlap)), quantities = TRUE)




# Importing loops. For make comparison easier, 25 kb
binSize = 25*1000
temp.pp <- fread(here(refDir, \Tjian_chromosight_loop_P-P.bedpe\)) %>%
  dplyr::mutate(center1 = 0.5*(V2 + V3),
                center2 = 0.5*(V5 + V6),
                start1 = center1 - 0.5*binSize,
                end1 = center1 + 0.5*binSize,
                start2 = center2 - 0.5*binSize,
                end2 = center2 + 0.5*binSize) %>%
  dplyr::select(V1, start1, end1, V4, start2, end2)
colnames(temp.pp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
binSize = 25*1000
temp.ep <- fread(here(refDir, \Tjian_chromosight_loop_E-P.bedpe\)) %>%
  dplyr::mutate(center1 = 0.5*(V2 + V3),
                center2 = 0.5*(V5 + V6),
                start1 = center1 - 0.5*binSize,
                end1 = center1 + 0.5*binSize,
                start2 = center2 - 0.5*binSize,
                end2 = center2 + 0.5*binSize) %>%
  dplyr::select(V1, start1, end1, V4, start2, end2)
colnames(temp.ep) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
temp <- bind_rows(temp.pp, temp.ep)
loop.async <- importBedpe(temp)


binSize = 25*1000
temp <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\)) %>%
  dplyr::mutate(center1 = 0.5*(V2 + V3),
                center2 = 0.5*(V5 + V6),
                start1 = center1 - 0.5*binSize,
                end1 = center1 + 0.5*binSize,
                start2 = center2 - 0.5*binSize,
                end2 = center2 + 0.5*binSize) %>%
  dplyr::select(V1, start1, end1, V4, start2, end2)
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
loop.G1 <- importBedpe(temp)


# Check overlap
overlap <- findOverlaps(loop.async, loop.G1)


n.async <- nrow(as_tibble(loop.async))
n.G1 <- nrow(as_tibble(loop.G1))
n.async.overlap <- length(unique(queryHits(overlap)))
n.G1.overlap <- length(unique(subjectHits(overlap)))

plot(euler(c(\Async\ = n.async - n.async.overlap,
             \Async&G1\ = n.async.overlap,
             \G1\ = 1)), quantities = TRUE)


plot(euler(c(\Async\ =0.1,
             \Async&G1\ = n.G1.overlap,
             \G1\ = n.G1 - n.G1.overlap)), quantities = TRUE)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkpiWEJ2Y25ScGJtY2diRzl2Y0hNdUlFWnZjaUJ0WVd0bElHTnZiWEJoY21semIyNGdaV0Z6YVdWeUxDQXlOU0JyWWx4dVltbHVVMmw2WlNBOUlESTFLakV3TURCY2JuUmxiWEFnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNWR3BwWVc1ZlkyaHliMjF2YzJsbmFIUmZiRzl2Y0M1aVpXUndaVnhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9ZMlZ1ZEdWeU1TQTlJREF1TlNvb1ZqSWdLeUJXTXlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyVnVkR1Z5TWlBOUlEQXVOU29vVmpVZ0t5QldOaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNSaGNuUXhJRDBnWTJWdWRHVnlNU0F0SURBdU5TcGlhVzVUYVhwbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnVaREVnUFNCalpXNTBaWEl4SUNzZ01DNDFLbUpwYmxOcGVtVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM1JoY25ReUlEMGdZMlZ1ZEdWeU1pQXRJREF1TlNwaWFXNVRhWHBsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWdVpESWdQU0JqWlc1MFpYSXlJQ3NnTUM0MUttSnBibE5wZW1VcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLRll4TENCemRHRnlkREVzSUdWdVpERXNJRlkwTENCemRHRnlkRElzSUdWdVpESXBYRzVqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z4Y1ZqRmNYQ3dnWEZ4V01seGNMQ0JjWEZZelhGd3NJRnhjVmpSY1hDd2dYRnhXTlZ4Y0xDQmNYRlkyWEZ3cFhHNXNiMjl3TG1GemVXNWpJRHd0SUdsdGNHOXlkRUpsWkhCbEtIUmxiWEFwWEc1Y2JseHVZbWx1VTJsNlpTQTlJREkxS2pFd01EQmNiblJsYlhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk11WW1Wa2NHVmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHTmxiblJsY2pFZ1BTQXdMalVxS0ZZeUlDc2dWak1wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdObGJuUmxjaklnUFNBd0xqVXFLRlkxSUNzZ1ZqWXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE4wWVhKME1TQTlJR05sYm5SbGNqRWdMU0F3TGpVcVltbHVVMmw2WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJtUXhJRDBnWTJWdWRHVnlNU0FySURBdU5TcGlhVzVUYVhwbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITjBZWEowTWlBOUlHTmxiblJsY2pJZ0xTQXdMalVxWW1sdVUybDZaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYm1ReUlEMGdZMlZ1ZEdWeU1pQXJJREF1TlNwaWFXNVRhWHBsS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaFdNU3dnYzNSaGNuUXhMQ0JsYm1ReExDQldOQ3dnYzNSaGNuUXlMQ0JsYm1ReUtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjWEZZeFhGd3NJRnhjVmpKY1hDd2dYRnhXTTF4Y0xDQmNYRlkwWEZ3c0lGeGNWalZjWEN3Z1hGeFdObHhjS1Z4dWJHOXZjQzVITVNBOExTQnBiWEJ2Y25SQ1pXUndaU2gwWlcxd0tWeHVYRzVjYmlNZ1EyaGxZMnNnYjNabGNteGhjRnh1YjNabGNteGhjQ0E4TFNCbWFXNWtUM1psY214aGNITW9iRzl2Y0M1aGMzbHVZeXdnYkc5dmNDNUhNU2xjYmx4dVhHNXVMbUZ6ZVc1aklEd3RJRzV5YjNjb1lYTmZkR2xpWW14bEtHeHZiM0F1WVhONWJtTXBLVnh1Ymk1SE1TQThMU0J1Y205M0tHRnpYM1JwWW1Kc1pTaHNiMjl3TGtjeEtTbGNibTR1WVhONWJtTXViM1psY214aGNDQThMU0JzWlc1bmRHZ29kVzVwY1hWbEtIRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd0tTa3BYRzV1TGtjeExtOTJaWEpzWVhBZ1BDMGdiR1Z1WjNSb0tIVnVhWEYxWlNoemRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd0tTa3BYRzVjYm5Cc2IzUW9aWFZzWlhJb1l5aGNYRUZ6ZVc1alhGd2dQU0J1TG1GemVXNWpJQzBnYmk1aGMzbHVZeTV2ZG1WeWJHRndMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lGeGNRWE41Ym1NbVJ6RmNYQ0E5SUc0dVlYTjVibU11YjNabGNteGhjQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQmNYRWN4WEZ3Z1BTQXhLU2tzSUhGMVlXNTBhWFJwWlhNZ1BTQlVVbFZGS1Z4dVhHNWNibkJzYjNRb1pYVnNaWElvWXloY1hFRnplVzVqWEZ3Z1BURXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1hGeEJjM2x1WXlaSE1WeGNJRDBnYmk1SE1TNXZkbVZ5YkdGd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y1J6RmNYQ0E5SUc0dVJ6RWdMU0J1TGtjeExtOTJaWEpzWVhBcEtTd2djWFZoYm5ScGRHbGxjeUE5SUZSU1ZVVXBYRzVjYmx4dVhHNWNiaU1nU1cxd2IzSjBhVzVuSUd4dmIzQnpMaUJHYjNJZ2JXRnJaU0JqYjIxd1lYSnBjMjl1SUdWaGMybGxjaXdnTWpVZ2EySmNibUpwYmxOcGVtVWdQU0F5TlNveE1EQXdYRzUwWlcxd0xuQndJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hGUnFhV0Z1WDJOb2NtOXRiM05wWjJoMFgyeHZiM0JmVUMxUUxtSmxaSEJsWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hqWlc1MFpYSXhJRDBnTUM0MUtpaFdNaUFySUZZektTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpaVzUwWlhJeUlEMGdNQzQxS2loV05TQXJJRlkyS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRHRnlkREVnUFNCalpXNTBaWEl4SUMwZ01DNDFLbUpwYmxOcGVtVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaVzVrTVNBOUlHTmxiblJsY2pFZ0t5QXdMalVxWW1sdVUybDZaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZEdGeWRESWdQU0JqWlc1MFpYSXlJQzBnTUM0MUttSnBibE5wZW1Vc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pXNWtNaUE5SUdObGJuUmxjaklnS3lBd0xqVXFZbWx1VTJsNlpTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvVmpFc0lITjBZWEowTVN3Z1pXNWtNU3dnVmpRc0lITjBZWEowTWl3Z1pXNWtNaWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXVjSEFwSUR3dElHTW9YRnhXTVZ4Y0xDQmNYRll5WEZ3c0lGeGNWak5jWEN3Z1hGeFdORnhjTENCY1hGWTFYRndzSUZ4Y1ZqWmNYQ2xjYm1KcGJsTnBlbVVnUFNBeU5Tb3hNREF3WEc1MFpXMXdMbVZ3SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYRlJxYVdGdVgyTm9jbTl0YjNOcFoyaDBYMnh2YjNCZlJTMVFMbUpsWkhCbFhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoalpXNTBaWEl4SUQwZ01DNDFLaWhXTWlBcklGWXpLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWlc1MFpYSXlJRDBnTUM0MUtpaFdOU0FySUZZMktTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpkR0Z5ZERFZ1BTQmpaVzUwWlhJeElDMGdNQzQxS21KcGJsTnBlbVVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWlc1a01TQTlJR05sYm5SbGNqRWdLeUF3TGpVcVltbHVVMmw2WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRHRnlkRElnUFNCalpXNTBaWEl5SUMwZ01DNDFLbUpwYmxOcGVtVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaVzVrTWlBOUlHTmxiblJsY2pJZ0t5QXdMalVxWW1sdVUybDZaU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1ZqRXNJSE4wWVhKME1Td2daVzVrTVN3Z1ZqUXNJSE4wWVhKME1pd2daVzVrTWlsY2JtTnZiRzVoYldWektIUmxiWEF1WlhBcElEd3RJR01vWEZ4V01WeGNMQ0JjWEZZeVhGd3NJRnhjVmpOY1hDd2dYRnhXTkZ4Y0xDQmNYRlkxWEZ3c0lGeGNWalpjWENsY2JuUmxiWEFnUEMwZ1ltbHVaRjl5YjNkektIUmxiWEF1Y0hBc0lIUmxiWEF1WlhBcFhHNXNiMjl3TG1GemVXNWpJRHd0SUdsdGNHOXlkRUpsWkhCbEtIUmxiWEFwWEc1Y2JseHVZbWx1VTJsNlpTQTlJREkxS2pFd01EQmNiblJsYlhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlM1aVpXUndaVnhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9ZMlZ1ZEdWeU1TQTlJREF1TlNvb1ZqSWdLeUJXTXlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyVnVkR1Z5TWlBOUlEQXVOU29vVmpVZ0t5QldOaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNSaGNuUXhJRDBnWTJWdWRHVnlNU0F0SURBdU5TcGlhVzVUYVhwbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnVaREVnUFNCalpXNTBaWEl4SUNzZ01DNDFLbUpwYmxOcGVtVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM1JoY25ReUlEMGdZMlZ1ZEdWeU1pQXRJREF1TlNwaWFXNVRhWHBsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWdVpESWdQU0JqWlc1MFpYSXlJQ3NnTUM0MUttSnBibE5wZW1VcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLRll4TENCemRHRnlkREVzSUdWdVpERXNJRlkwTENCemRHRnlkRElzSUdWdVpESXBYRzVqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z4Y1ZqRmNYQ3dnWEZ4V01seGNMQ0JjWEZZelhGd3NJRnhjVmpSY1hDd2dYRnhXTlZ4Y0xDQmNYRlkyWEZ3cFhHNXNiMjl3TGtjeElEd3RJR2x0Y0c5eWRFSmxaSEJsS0hSbGJYQXBYRzVjYmx4dUl5QkRhR1ZqYXlCdmRtVnliR0Z3WEc1dmRtVnliR0Z3SUR3dElHWnBibVJQZG1WeWJHRndjeWhzYjI5d0xtRnplVzVqTENCc2IyOXdMa2N4S1Z4dVhHNWNibTR1WVhONWJtTWdQQzBnYm5KdmR5aGhjMTkwYVdKaWJHVW9iRzl2Y0M1aGMzbHVZeWtwWEc1dUxrY3hJRHd0SUc1eWIzY29ZWE5mZEdsaVlteGxLR3h2YjNBdVJ6RXBLVnh1Ymk1aGMzbHVZeTV2ZG1WeWJHRndJRHd0SUd4bGJtZDBhQ2gxYm1seGRXVW9jWFZsY25sSWFYUnpLRzkyWlhKc1lYQXBLU2xjYm00dVJ6RXViM1psY214aGNDQThMU0JzWlc1bmRHZ29kVzVwY1hWbEtITjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQXBLU2xjYmx4dWNHeHZkQ2hsZFd4bGNpaGpLRnhjUVhONWJtTmNYQ0E5SUc0dVlYTjVibU1nTFNCdUxtRnplVzVqTG05MlpYSnNZWEFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdYRnhCYzNsdVl5WkhNVnhjSUQwZ2JpNWhjM2x1WXk1dmRtVnliR0Z3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJRnhjUnpGY1hDQTlJREVwS1N3Z2NYVmhiblJwZEdsbGN5QTlJRlJTVlVVcFhHNWNibHh1Y0d4dmRDaGxkV3hsY2loaktGeGNRWE41Ym1OY1hDQTlNQzR4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJRnhjUVhONWJtTW1SekZjWENBOUlHNHVSekV1YjNabGNteGhjQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQmNYRWN4WEZ3Z1BTQnVMa2N4SUMwZ2JpNUhNUzV2ZG1WeWJHRndLU2tzSUhGMVlXNTBhWFJwWlhNZ1BTQlVVbFZGS1Z4dVhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbiMgSW1wb3J0aW5nIGxvb3BzLiBGb3IgbWFrZSBjb21wYXJpc29uIGVhc2llciwgMjUga2JcbmJpblNpemUgPSAyNSoxMDAwXG50ZW1wIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXFRqaWFuX2Nocm9tb3NpZ2h0X2xvb3AuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGNlbnRlcjEgPSAwLjUqKFYyICsgVjMpLFxuICAgICAgICAgICAgICAgIGNlbnRlcjIgPSAwLjUqKFY1ICsgVjYpLFxuICAgICAgICAgICAgICAgIHN0YXJ0MSA9IGNlbnRlcjEgLSAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBlbmQxID0gY2VudGVyMSArIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIHN0YXJ0MiA9IGNlbnRlcjIgLSAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBlbmQyID0gY2VudGVyMiArIDAuNSpiaW5TaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgc3RhcnQxLCBlbmQxLCBWNCwgc3RhcnQyLCBlbmQyKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXFYxXFwsIFxcVjJcXCwgXFxWM1xcLCBcXFY0XFwsIFxcVjVcXCwgXFxWNlxcKVxubG9vcC5hc3luYyA8LSBpbXBvcnRCZWRwZSh0ZW1wKVxuXG5cbmJpblNpemUgPSAyNSoxMDAwXG50ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShjZW50ZXIxID0gMC41KihWMiArIFYzKSxcbiAgICAgICAgICAgICAgICBjZW50ZXIyID0gMC41KihWNSArIFY2KSxcbiAgICAgICAgICAgICAgICBzdGFydDEgPSBjZW50ZXIxIC0gMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgZW5kMSA9IGNlbnRlcjEgKyAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBzdGFydDIgPSBjZW50ZXIyIC0gMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgZW5kMiA9IGNlbnRlcjIgKyAwLjUqYmluU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIHN0YXJ0MSwgZW5kMSwgVjQsIHN0YXJ0MiwgZW5kMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxWMVxcLCBcXFYyXFwsIFxcVjNcXCwgXFxWNFxcLCBcXFY1XFwsIFxcVjZcXClcbmxvb3AuRzEgPC0gaW1wb3J0QmVkcGUodGVtcClcblxuXG4jIENoZWNrIG92ZXJsYXBcbm92ZXJsYXAgPC0gZmluZE92ZXJsYXBzKGxvb3AuYXN5bmMsIGxvb3AuRzEpXG5cblxubi5hc3luYyA8LSBucm93KGFzX3RpYmJsZShsb29wLmFzeW5jKSlcbm4uRzEgPC0gbnJvdyhhc190aWJibGUobG9vcC5HMSkpXG5uLmFzeW5jLm92ZXJsYXAgPC0gbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcCkpKVxubi5HMS5vdmVybGFwIDwtIGxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcCkpKVxuXG5wbG90KGV1bGVyKGMoXFxBc3luY1xcID0gbi5hc3luYyAtIG4uYXN5bmMub3ZlcmxhcCxcbiAgICAgICAgICAgICBcXEFzeW5jJkcxXFwgPSBuLmFzeW5jLm92ZXJsYXAsXG4gICAgICAgICAgICAgXFxHMVxcID0gMSkpLCBxdWFudGl0aWVzID0gVFJVRSlcblxuXG5wbG90KGV1bGVyKGMoXFxBc3luY1xcID0xLFxuICAgICAgICAgICAgIFxcQXN5bmMmRzFcXCA9IG4uRzEub3ZlcmxhcCxcbiAgICAgICAgICAgICBcXEcxXFwgPSBuLkcxIC0gbi5HMS5vdmVybGFwKSksIHF1YW50aXRpZXMgPSBUUlVFKVxuXG5cblxuXG4jIEltcG9ydGluZyBsb29wcy4gRm9yIG1ha2UgY29tcGFyaXNvbiBlYXNpZXIsIDI1IGtiXG5iaW5TaXplID0gMjUqMTAwMFxudGVtcC5wcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxUamlhbl9jaHJvbW9zaWdodF9sb29wX1AtUC5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoY2VudGVyMSA9IDAuNSooVjIgKyBWMyksXG4gICAgICAgICAgICAgICAgY2VudGVyMiA9IDAuNSooVjUgKyBWNiksXG4gICAgICAgICAgICAgICAgc3RhcnQxID0gY2VudGVyMSAtIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIGVuZDEgPSBjZW50ZXIxICsgMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgc3RhcnQyID0gY2VudGVyMiAtIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIGVuZDIgPSBjZW50ZXIyICsgMC41KmJpblNpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBzdGFydDEsIGVuZDEsIFY0LCBzdGFydDIsIGVuZDIpXG5jb2xuYW1lcyh0ZW1wLnBwKSA8LSBjKFxcVjFcXCwgXFxWMlxcLCBcXFYzXFwsIFxcVjRcXCwgXFxWNVxcLCBcXFY2XFwpXG5iaW5TaXplID0gMjUqMTAwMFxudGVtcC5lcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxUamlhbl9jaHJvbW9zaWdodF9sb29wX0UtUC5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoY2VudGVyMSA9IDAuNSooVjIgKyBWMyksXG4gICAgICAgICAgICAgICAgY2VudGVyMiA9IDAuNSooVjUgKyBWNiksXG4gICAgICAgICAgICAgICAgc3RhcnQxID0gY2VudGVyMSAtIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIGVuZDEgPSBjZW50ZXIxICsgMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgc3RhcnQyID0gY2VudGVyMiAtIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIGVuZDIgPSBjZW50ZXIyICsgMC41KmJpblNpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBzdGFydDEsIGVuZDEsIFY0LCBzdGFydDIsIGVuZDIpXG5jb2xuYW1lcyh0ZW1wLmVwKSA8LSBjKFxcVjFcXCwgXFxWMlxcLCBcXFYzXFwsIFxcVjRcXCwgXFxWNVxcLCBcXFY2XFwpXG50ZW1wIDwtIGJpbmRfcm93cyh0ZW1wLnBwLCB0ZW1wLmVwKVxubG9vcC5hc3luYyA8LSBpbXBvcnRCZWRwZSh0ZW1wKVxuXG5cbmJpblNpemUgPSAyNSoxMDAwXG50ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGNlbnRlcjEgPSAwLjUqKFYyICsgVjMpLFxuICAgICAgICAgICAgICAgIGNlbnRlcjIgPSAwLjUqKFY1ICsgVjYpLFxuICAgICAgICAgICAgICAgIHN0YXJ0MSA9IGNlbnRlcjEgLSAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBlbmQxID0gY2VudGVyMSArIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIHN0YXJ0MiA9IGNlbnRlcjIgLSAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBlbmQyID0gY2VudGVyMiArIDAuNSpiaW5TaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgc3RhcnQxLCBlbmQxLCBWNCwgc3RhcnQyLCBlbmQyKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXFYxXFwsIFxcVjJcXCwgXFxWM1xcLCBcXFY0XFwsIFxcVjVcXCwgXFxWNlxcKVxubG9vcC5HMSA8LSBpbXBvcnRCZWRwZSh0ZW1wKVxuXG5cbiMgQ2hlY2sgb3ZlcmxhcFxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMobG9vcC5hc3luYywgbG9vcC5HMSlcblxuXG5uLmFzeW5jIDwtIG5yb3coYXNfdGliYmxlKGxvb3AuYXN5bmMpKVxubi5HMSA8LSBucm93KGFzX3RpYmJsZShsb29wLkcxKSlcbm4uYXN5bmMub3ZlcmxhcCA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwKSkpXG5uLkcxLm92ZXJsYXAgPC0gbGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwKSkpXG5cbnBsb3QoZXVsZXIoYyhcXEFzeW5jXFwgPSBuLmFzeW5jIC0gbi5hc3luYy5vdmVybGFwLFxuICAgICAgICAgICAgIFxcQXN5bmMmRzFcXCA9IG4uYXN5bmMub3ZlcmxhcCxcbiAgICAgICAgICAgICBcXEcxXFwgPSAxKSksIHF1YW50aXRpZXMgPSBUUlVFKVxuXG5cbnBsb3QoZXVsZXIoYyhcXEFzeW5jXFwgPTAuMSxcbiAgICAgICAgICAgICBcXEFzeW5jJkcxXFwgPSBuLkcxLm92ZXJsYXAsXG4gICAgICAgICAgICAgXFxHMVxcID0gbi5HMSAtIG4uRzEub3ZlcmxhcCkpLCBxdWFudGl0aWVzID0gVFJVRSlcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBJbXBvcnRpbmcgbG9vcHMuIEZvciBtYWtlIGNvbXBhcmlzb24gZWFzaWVyLCAyNSBrYlxuYmluU2l6ZSA9IDI1KjEwMDBcbnRlbXAgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcVGppYW5fY2hyb21vc2lnaHRfbG9vcC5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoY2VudGVyMSA9IDAuNSooVjIgKyBWMyksXG4gICAgICAgICAgICAgICAgY2VudGVyMiA9IDAuNSooVjUgKyBWNiksXG4gICAgICAgICAgICAgICAgc3RhcnQxID0gY2VudGVyMSAtIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIGVuZDEgPSBjZW50ZXIxICsgMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgc3RhcnQyID0gY2VudGVyMiAtIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIGVuZDIgPSBjZW50ZXIyICsgMC41KmJpblNpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBzdGFydDEsIGVuZDEsIFY0LCBzdGFydDIsIGVuZDIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcVjFcXCwgXFxWMlxcLCBcXFYzXFwsIFxcVjRcXCwgXFxWNVxcLCBcXFY2XFwpXG5sb29wLmFzeW5jIDwtIGltcG9ydEJlZHBlKHRlbXApXG5cblxuYmluU2l6ZSA9IDI1KjEwMDBcbnRlbXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnMuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGNlbnRlcjEgPSAwLjUqKFYyICsgVjMpLFxuICAgICAgICAgICAgICAgIGNlbnRlcjIgPSAwLjUqKFY1ICsgVjYpLFxuICAgICAgICAgICAgICAgIHN0YXJ0MSA9IGNlbnRlcjEgLSAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBlbmQxID0gY2VudGVyMSArIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIHN0YXJ0MiA9IGNlbnRlcjIgLSAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBlbmQyID0gY2VudGVyMiArIDAuNSpiaW5TaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgc3RhcnQxLCBlbmQxLCBWNCwgc3RhcnQyLCBlbmQyKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXFYxXFwsIFxcVjJcXCwgXFxWM1xcLCBcXFY0XFwsIFxcVjVcXCwgXFxWNlxcKVxubG9vcC5HMSA8LSBpbXBvcnRCZWRwZSh0ZW1wKVxuXG5cbiMgQ2hlY2sgb3ZlcmxhcFxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMobG9vcC5hc3luYywgbG9vcC5HMSlcblxuXG5uLmFzeW5jIDwtIG5yb3coYXNfdGliYmxlKGxvb3AuYXN5bmMpKVxubi5HMSA8LSBucm93KGFzX3RpYmJsZShsb29wLkcxKSlcbm4uYXN5bmMub3ZlcmxhcCA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwKSkpXG5uLkcxLm92ZXJsYXAgPC0gbGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwKSkpXG5cbnBsb3QoZXVsZXIoYyhcXEFzeW5jXFwgPSBuLmFzeW5jIC0gbi5hc3luYy5vdmVybGFwLFxuICAgICAgICAgICAgIFxcQXN5bmMmRzFcXCA9IG4uYXN5bmMub3ZlcmxhcCxcbiAgICAgICAgICAgICBcXEcxXFwgPSAxKSksIHF1YW50aXRpZXMgPSBUUlVFKVxuXG5cbnBsb3QoZXVsZXIoYyhcXEFzeW5jXFwgPTEsXG4gICAgICAgICAgICAgXFxBc3luYyZHMVxcID0gbi5HMS5vdmVybGFwLFxuICAgICAgICAgICAgIFxcRzFcXCA9IG4uRzEgLSBuLkcxLm92ZXJsYXApKSwgcXVhbnRpdGllcyA9IFRSVUUpXG5cblxuXG5cbiMgSW1wb3J0aW5nIGxvb3BzLiBGb3IgbWFrZSBjb21wYXJpc29uIGVhc2llciwgMjUga2JcbmJpblNpemUgPSAyNSoxMDAwXG50ZW1wLnBwIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXFRqaWFuX2Nocm9tb3NpZ2h0X2xvb3BfUC1QLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShjZW50ZXIxID0gMC41KihWMiArIFYzKSxcbiAgICAgICAgICAgICAgICBjZW50ZXIyID0gMC41KihWNSArIFY2KSxcbiAgICAgICAgICAgICAgICBzdGFydDEgPSBjZW50ZXIxIC0gMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgZW5kMSA9IGNlbnRlcjEgKyAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBzdGFydDIgPSBjZW50ZXIyIC0gMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgZW5kMiA9IGNlbnRlcjIgKyAwLjUqYmluU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIHN0YXJ0MSwgZW5kMSwgVjQsIHN0YXJ0MiwgZW5kMilcbmNvbG5hbWVzKHRlbXAucHApIDwtIGMoXFxWMVxcLCBcXFYyXFwsIFxcVjNcXCwgXFxWNFxcLCBcXFY1XFwsIFxcVjZcXClcbmJpblNpemUgPSAyNSoxMDAwXG50ZW1wLmVwIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXFRqaWFuX2Nocm9tb3NpZ2h0X2xvb3BfRS1QLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShjZW50ZXIxID0gMC41KihWMiArIFYzKSxcbiAgICAgICAgICAgICAgICBjZW50ZXIyID0gMC41KihWNSArIFY2KSxcbiAgICAgICAgICAgICAgICBzdGFydDEgPSBjZW50ZXIxIC0gMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgZW5kMSA9IGNlbnRlcjEgKyAwLjUqYmluU2l6ZSxcbiAgICAgICAgICAgICAgICBzdGFydDIgPSBjZW50ZXIyIC0gMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgZW5kMiA9IGNlbnRlcjIgKyAwLjUqYmluU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIHN0YXJ0MSwgZW5kMSwgVjQsIHN0YXJ0MiwgZW5kMilcbmNvbG5hbWVzKHRlbXAuZXApIDwtIGMoXFxWMVxcLCBcXFYyXFwsIFxcVjNcXCwgXFxWNFxcLCBcXFY1XFwsIFxcVjZcXClcbnRlbXAgPC0gYmluZF9yb3dzKHRlbXAucHAsIHRlbXAuZXApXG5sb29wLmFzeW5jIDwtIGltcG9ydEJlZHBlKHRlbXApXG5cblxuYmluU2l6ZSA9IDI1KjEwMDBcbnRlbXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZS5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoY2VudGVyMSA9IDAuNSooVjIgKyBWMyksXG4gICAgICAgICAgICAgICAgY2VudGVyMiA9IDAuNSooVjUgKyBWNiksXG4gICAgICAgICAgICAgICAgc3RhcnQxID0gY2VudGVyMSAtIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIGVuZDEgPSBjZW50ZXIxICsgMC41KmJpblNpemUsXG4gICAgICAgICAgICAgICAgc3RhcnQyID0gY2VudGVyMiAtIDAuNSpiaW5TaXplLFxuICAgICAgICAgICAgICAgIGVuZDIgPSBjZW50ZXIyICsgMC41KmJpblNpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBzdGFydDEsIGVuZDEsIFY0LCBzdGFydDIsIGVuZDIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcVjFcXCwgXFxWMlxcLCBcXFYzXFwsIFxcVjRcXCwgXFxWNVxcLCBcXFY2XFwpXG5sb29wLkcxIDwtIGltcG9ydEJlZHBlKHRlbXApXG5cblxuIyBDaGVjayBvdmVybGFwXG5vdmVybGFwIDwtIGZpbmRPdmVybGFwcyhsb29wLmFzeW5jLCBsb29wLkcxKVxuXG5cbm4uYXN5bmMgPC0gbnJvdyhhc190aWJibGUobG9vcC5hc3luYykpXG5uLkcxIDwtIG5yb3coYXNfdGliYmxlKGxvb3AuRzEpKVxubi5hc3luYy5vdmVybGFwIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXApKSlcbm4uRzEub3ZlcmxhcCA8LSBsZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXApKSlcblxucGxvdChldWxlcihjKFxcQXN5bmNcXCA9IG4uYXN5bmMgLSBuLmFzeW5jLm92ZXJsYXAsXG4gICAgICAgICAgICAgXFxBc3luYyZHMVxcID0gbi5hc3luYy5vdmVybGFwLFxuICAgICAgICAgICAgIFxcRzFcXCA9IDEpKSwgcXVhbnRpdGllcyA9IFRSVUUpXG5cblxucGxvdChldWxlcihjKFxcQXN5bmNcXCA9MC4xLFxuICAgICAgICAgICAgIFxcQXN5bmMmRzFcXCA9IG4uRzEub3ZlcmxhcCxcbiAgICAgICAgICAgICBcXEcxXFwgPSBuLkcxIC0gbi5HMS5vdmVybGFwKSksIHF1YW50aXRpZXMgPSBUUlVFKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
# Importing loops. For make comparison easier, 25 kb
binSize = 25*1000
temp <- fread(here(refDir, \Tjian_chromosight_loop.bedpe\)) %>%
  dplyr::mutate(center1 = 0.5*(V2 + V3),
                center2 = 0.5*(V5 + V6),
                start1 = center1 - 0.5*binSize,
                end1 = center1 + 0.5*binSize,
                start2 = center2 - 0.5*binSize,
                end2 = center2 + 0.5*binSize) %>%
  dplyr::select(V1, start1, end1, V4, start2, end2)
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
loop.async <- importBedpe(temp)


binSize = 25*1000
temp <- fread(here(consensusDir, \chromo_cons.bedpe\)) %>%
  dplyr::mutate(center1 = 0.5*(V2 + V3),
                center2 = 0.5*(V5 + V6),
                start1 = center1 - 0.5*binSize,
                end1 = center1 + 0.5*binSize,
                start2 = center2 - 0.5*binSize,
                end2 = center2 + 0.5*binSize) %>%
  dplyr::select(V1, start1, end1, V4, start2, end2)
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
loop.G1 <- importBedpe(temp)


# Check overlap
overlap <- findOverlaps(loop.async, loop.G1)


n.async <- nrow(as_tibble(loop.async))
n.G1 <- nrow(as_tibble(loop.G1))
n.async.overlap <- length(unique(queryHits(overlap)))
n.G1.overlap <- length(unique(subjectHits(overlap)))

plot(euler(c(\Async\ = n.async - n.async.overlap,
             \Async&G1\ = n.async.overlap,
             \G1\ = 1)), quantities = TRUE)


plot(euler(c(\Async\ =1,
             \Async&G1\ = n.G1.overlap,
             \G1\ = n.G1 - n.G1.overlap)), quantities = TRUE)




# Importing loops. For make comparison easier, 25 kb
binSize = 25*1000
temp.pp <- fread(here(refDir, \Tjian_chromosight_loop_P-P.bedpe\)) %>%
  dplyr::mutate(center1 = 0.5*(V2 + V3),
                center2 = 0.5*(V5 + V6),
                start1 = center1 - 0.5*binSize,
                end1 = center1 + 0.5*binSize,
                start2 = center2 - 0.5*binSize,
                end2 = center2 + 0.5*binSize) %>%
  dplyr::select(V1, start1, end1, V4, start2, end2)
colnames(temp.pp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
binSize = 25*1000
temp.ep <- fread(here(refDir, \Tjian_chromosight_loop_E-P.bedpe\)) %>%
  dplyr::mutate(center1 = 0.5*(V2 + V3),
                center2 = 0.5*(V5 + V6),
                start1 = center1 - 0.5*binSize,
                end1 = center1 + 0.5*binSize,
                start2 = center2 - 0.5*binSize,
                end2 = center2 + 0.5*binSize) %>%
  dplyr::select(V1, start1, end1, V4, start2, end2)
colnames(temp.ep) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
temp <- bind_rows(temp.pp, temp.ep)
loop.async <- importBedpe(temp)


binSize = 25*1000
temp <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\)) %>%
  dplyr::mutate(center1 = 0.5*(V2 + V3),
                center2 = 0.5*(V5 + V6),
                start1 = center1 - 0.5*binSize,
                end1 = center1 + 0.5*binSize,
                start2 = center2 - 0.5*binSize,
                end2 = center2 + 0.5*binSize) %>%
  dplyr::select(V1, start1, end1, V4, start2, end2)
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
loop.G1 <- importBedpe(temp)


# Check overlap
overlap <- findOverlaps(loop.async, loop.G1)


n.async <- nrow(as_tibble(loop.async))
n.G1 <- nrow(as_tibble(loop.G1))
n.async.overlap <- length(unique(queryHits(overlap)))
n.G1.overlap <- length(unique(subjectHits(overlap)))

plot(euler(c(\Async\ = n.async - n.async.overlap,
             \Async&G1\ = n.async.overlap,
             \G1\ = 1)), quantities = TRUE)


plot(euler(c(\Async\ =0.1,
             \Async&G1\ = n.G1.overlap,
             \G1\ = n.G1 - n.G1.overlap)), quantities = TRUE)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### str loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlCSmJYQnZjblJwYm1jZ1EyaEpVQzFsZUc4Z2NHVmhhM05jYm5KbFprUnBjaUE4TFNCb1pYSmxLRndpTGk0dkxpNWNJaXdnWENKeVpXWmxjbVZ1WTJWY0lpbGNibkJsWVdzdVNETkxNamRoWXlBOExTQnBiWEJ2Y25SUVpXRnJLR2hsY21Vb2NtVm1SR2x5TENCY0lrZFRUVEkwTXpnME56WmZSVU10UkVjdE16UTFPQzFJTTBzeU4wRkRYMEZUV1U1Zk1TNXVZWEp5YjNkUVpXRnJMbUpsWkZ3aUtTbGNibkJsWVdzdVNETkxORzFsTXlBOExTQnBiWEJ2Y25SUVpXRnJLR2hsY21Vb2NtVm1SR2x5TENCY0lqTXpNalUxWDBnelN6UnRaVE5mTURRdE56UTFYMEp5ZFdObExUUmZjR1ZoYTNNdWJXVnlaMlZRWldGckxtSmxaRndpS1NsY2JuQmxZV3N1UTFSRFJpQThMU0JwYlhCdmNuUlFaV0ZyS0dobGNtVW9jbVZtUkdseUxDQmNJak16TWpRNFgwTlVRMFpmTURjdE56STVYMEp5ZFdObExUUmZjR1ZoYTNNdWJXVnlaMlZRWldGckxtSmxaRndpS1NsY2JuQmxZV3N1VWtGRU1qRWdQQzBnYVcxd2IzSjBVR1ZoYXlob1pYSmxLSEpsWmtScGNpd2dYQ0l6TXpJMU1GOVNRVVF5TVY5aFlqazVNbDlDY25WalpTMDBYM0JsWVd0ekxtMWxjbWRsVUdWaGF5NWlaV1JjSWlrcFhHNXdaV0ZyTGxkb2VYUmxMbE5GSUR3dElHbHRjRzl5ZEZCbFlXc29hR1Z5WlNoeVpXWkVhWElzSUZ3aWMzVndaWEpGYm1oaGJtTmxjbDlYYUhsMFpWOUZVME5mYlcweE1DNWlaV1JjSWlrcFhHNXdaV0ZyTGtSNWJHRnVMbE5GSUR3dElHbHRjRzl5ZEZCbFlXc29hR1Z5WlNoeVpXWkVhWElzSUZ3aWMzVndaWEpGYm1oaGJtTmxjbDlFZVd4aGJsOUZVME11WW1Wa1hDSXBLVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbiMjIyMgSW1wb3J0aW5nIENoSVAtZXhvIHBlYWtzXG5yZWZEaXIgPC0gaGVyZShcXC4uLy4uXFwsIFxccmVmZXJlbmNlXFwpXG5wZWFrLkgzSzI3YWMgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWRcXCkpXG5wZWFrLkgzSzRtZTMgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG5wZWFrLkNUQ0YgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG5wZWFrLlJBRDIxIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxucGVhay5XaHl0ZS5TRSA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXHN1cGVyRW5oYW5jZXJfV2h5dGVfRVNDX21tMTAuYmVkXFwpKVxucGVhay5EeWxhbi5TRSA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXHN1cGVyRW5oYW5jZXJfRHlsYW5fRVNDLmJlZFxcKSlcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
#### Importing ChIP-exo peaks
refDir <- here(\../..\, \reference\)
peak.H3K27ac <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
peak.H3K4me3 <- importPeak(here(refDir, \33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.bed\))
peak.CTCF <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))
peak.RAD21 <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))
peak.Whyte.SE <- importPeak(here(refDir, \superEnhancer_Whyte_ESC_mm10.bed\))
peak.Dylan.SE <- importPeak(here(refDir, \superEnhancer_Dylan_ESC.bed\))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeUJKYlhCdmNuUnBibWNnUTJoSlVDMWxlRzhnY0dWaGEzTmNibkpsWmtScGNpQThMU0JvWlhKbEtGeGNMaTR2TGk1Y1hDd2dYRnh5WldabGNtVnVZMlZjWENsY2JuQmxZV3N1U0ROTE1qZGhZeUE4TFNCcGJYQnZjblJRWldGcktHaGxjbVVvY21WbVJHbHlMQ0JjWEVkVFRUSTBNemcwTnpaZlJVTXRSRWN0TXpRMU9DMUlNMHN5TjBGRFgwRlRXVTVmTVM1dVlYSnliM2RRWldGckxtSmxaRnhjS1NsY2JuQmxZV3N1U0ROTE5HMWxNeUE4TFNCcGJYQnZjblJRWldGcktHaGxjbVVvY21WbVJHbHlMQ0JjWERNek1qVTFYMGd6U3pSdFpUTmZNRFF0TnpRMVgwSnlkV05sTFRSZmNHVmhhM011YldWeVoyVlFaV0ZyTG1KbFpGeGNLU2xjYm5CbFlXc3VRMVJEUmlBOExTQnBiWEJ2Y25SUVpXRnJLR2hsY21Vb2NtVm1SR2x5TENCY1hETXpNalE0WDBOVVEwWmZNRGN0TnpJNVgwSnlkV05sTFRSZmNHVmhhM011YldWeVoyVlFaV0ZyTG1KbFpGeGNLU2xjYm5CbFlXc3VVa0ZFTWpFZ1BDMGdhVzF3YjNKMFVHVmhheWhvWlhKbEtISmxaa1JwY2l3Z1hGd3pNekkxTUY5U1FVUXlNVjloWWprNU1sOUNjblZqWlMwMFgzQmxZV3R6TG0xbGNtZGxVR1ZoYXk1aVpXUmNYQ2twWEc1d1pXRnJMbGRvZVhSbExsTkZJRHd0SUdsdGNHOXlkRkJsWVdzb2FHVnlaU2h5WldaRWFYSXNJRnhjYzNWd1pYSkZibWhoYm1ObGNsOVhhSGwwWlY5RlUwTmZiVzB4TUM1aVpXUmNYQ2twWEc1d1pXRnJMa1I1YkdGdUxsTkZJRHd0SUdsdGNHOXlkRkJsWVdzb2FHVnlaU2h5WldaRWFYSXNJRnhjYzNWd1pYSkZibWhoYm1ObGNsOUVlV3hoYmw5RlUwTXVZbVZrWEZ3cEtWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG4jIyMjIEltcG9ydGluZyBDaElQLWV4byBwZWFrc1xucmVmRGlyIDwtIGhlcmUoXFwuLi8uLlxcLCBcXHJlZmVyZW5jZVxcKVxucGVhay5IM0syN2FjIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkXFwpKVxucGVhay5IM0s0bWUzIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxucGVhay5DVENGIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxucGVhay5SQUQyMSA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbnBlYWsuV2h5dGUuU0UgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxzdXBlckVuaGFuY2VyX1doeXRlX0VTQ19tbTEwLmJlZFxcKSlcbnBlYWsuRHlsYW4uU0UgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxzdXBlckVuaGFuY2VyX0R5bGFuX0VTQy5iZWRcXCkpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyBJbXBvcnRpbmcgQ2hJUC1leG8gcGVha3NcbnJlZkRpciA8LSBoZXJlKFxcLi4vLi5cXCwgXFxyZWZlcmVuY2VcXClcbnBlYWsuSDNLMjdhYyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5uYXJyb3dQZWFrLmJlZFxcKSlcbnBlYWsuSDNLNG1lMyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjU1X0gzSzRtZTNfMDQtNzQ1X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbnBlYWsuQ1RDRiA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbnBlYWsuUkFEMjEgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG5wZWFrLldoeXRlLlNFIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcc3VwZXJFbmhhbmNlcl9XaHl0ZV9FU0NfbW0xMC5iZWRcXCkpXG5wZWFrLkR5bGFuLlNFIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcc3VwZXJFbmhhbmNlcl9EeWxhbl9FU0MuYmVkXFwpKVxuYGBgXG5gYGAifQ== -->

```r
```r
#### Importing ChIP-exo peaks
refDir <- here(\../..\, \reference\)
peak.H3K27ac <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
peak.H3K4me3 <- importPeak(here(refDir, \33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.bed\))
peak.CTCF <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))
peak.RAD21 <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))
peak.Whyte.SE <- importPeak(here(refDir, \superEnhancer_Whyte_ESC_mm10.bed\))
peak.Dylan.SE <- importPeak(here(refDir, \superEnhancer_Dylan_ESC.bed\))
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Comparing loops called from Async

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZM0psWVhSbFRHOXZjRUZ1Ym05MFlYUnBiMjRnUEMwZ1puVnVZM1JwYjI0b1ltVmtjR1V1Ykc5dmNDNWhibTV2TENCdVlXMWxMQ0JtYVdkRWFYSXNJRzkxZEVScGNpd2dZMjlzYjNKTWFYTjBLWHRjYmlBZ2RHVnRjQ0E5SUdKbFpIQmxMbXh2YjNBdVlXNXVieUFsUGlWY2JpQWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtITmhiWEJzWlNBOUlHNWhiV1VwWEc0Z0lGeHVJQ0J1ZFcwZ1BTQnVjbTkzS0hSbGJYQXBYRzRnSUhBM0lEMGdaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnYzJGdGNHeGxMQ0JtYVd4c0lEMGdRVzV1YnpJcEtTQXJYRzRnSUNBZ1oyVnZiVjlpWVhJb1kyOXNiM0lnUFNCY0ltSnNZV05yWENJcElDdGNiaUFnSUNCMGFHVnRaVjlpZHlncElDdGNiaUFnSUNCc1lXSnpLSFJwZEd4bElEMGdjR0Z6ZEdVd0tHNTFiU3dnWENJZ2JHOXZjSE5jSWlrc1hHNGdJQ0FnSUNBZ0lDQjRJRDBnWENKY0lpd2dlU0E5SUZ3aVEyOTFiblJ6WENJcElDdGNiaUFnSUNCelkyRnNaVjk1WDJOdmJuUnBiblZ2ZFhNb2JHRmlaV3h6SUQwZ1kyOXRiV0ZmWm05eWJXRjBLQ2twSUN0Y2JpQWdJQ0IwYUdWdFpTaHdiRzkwTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHaHFkWE4wSUQwZ01DNDFLU3hjYmlBZ0lDQWdJQ0FnSUNCaGMzQmxZM1F1Y21GMGFXOGdQU0ExTEZ4dUlDQWdJQ0FnSUNBZ0lHeGxaMlZ1WkM1d2IzTnBkR2x2YmlBOUlGd2ljbWxuYUhSY0lpeGNiaUFnSUNBZ0lDQWdJQ0JzWldkbGJtUXVaR2x5WldOMGFXOXVJQ0E5SUZ3aWRtVnlkR2xqWVd4Y0lpa2dLMXh1SUNBZ0lITmpZV3hsWDJacGJHeGZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTnZiRzl5VEdsemRDbGNiaUFnWEc0Z0lIZHBaSFJvSUQwZ00xeHVJQ0JvWldsbmFIUWdQU0ExWEc0Z0lITjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndZWE4wWlRBb1hDSnNiMjl3UTJ4aGMzTnBabmxmWENJc0lHNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdkMmxrZEdnZ1BTQjNhV1IwYUN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwS1Z4dUlDQndiRzkwS0hBM0tWeHVJQ0JwYm5acGMybGliR1VvWkdWMkxtOW1aaWdwS1Z4dUlDQndibWNvYUdWeVpTaG1hV2RFYVhJc1hHNGdJQ0FnSUNBZ0lDQWdJSEJoYzNSbE1DaGNJbXh2YjNCRGJHRnpjMmxtZVY5Y0lpd2dibUZ0WlN3Z1hDSXVjRzVuWENJcEtTeGNiaUFnSUNBZ0lIZHBaSFJvSUQwZ2QybGtkR2dzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnY21WeklEMGdOakF3TENCMWJtbDBjeUE5SUZ3aWFXNWNJaWxjYmlBZ2NHeHZkQ2h3TnlsY2JpQWdhVzUyYVhOcFlteGxLR1JsZGk1dlptWW9LU2xjYm4xY2JseHVYRzVoYm01dmRHRjBaVXh2YjNCU1pXeGhlR1ZrVkZOVElEd3RJR1oxYm1OMGFXOXVLR0psWkhCbExtRnVibThwZTF4dUlDQjBaVzF3SUQwZ1ltVmtjR1V1WVc1dWJ5QWxQaVVnWkhCc2VYSTZPbkp2ZDNkcGMyVW9LU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0FnSUNBZ1FURWdQU0JwWmw5bGJITmxLQ2hCTVY5SU0wczBiV1V6VkZOVEtTd2dYQ0pRWENJc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWDJWc2MyVW9LRUV4WDBnelN6STNZV01wTENCY0lrVmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVgyVnNjMlVvS0VFeFgwTlVRMFo4UVRGZlVrRkVNakVwTENCY0lsTmNJaXdnWENKWVhDSXBLU2tzWEc0Z0lDQWdJQ0JCTWlBOUlHbG1YMlZzYzJVb0tFRXlYMGd6U3pSdFpUTlVVMU1wTENCY0lsQmNJaXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmZaV3h6WlNnb1FUSmZTRE5MTWpkaFl5a3NJRndpUlZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1pmWld4elpTZ29RVEpmUTFSRFJueEJNbDlTUVVReU1Ta3NJRndpVTF3aUxDQmNJbGhjSWlrcEtWeHVJQ0FnSUNsY2JpQWdkR1Z0Y0NBOUlIUmxiWEFnSlQ0bElHUndiSGx5T2pweWIzZDNhWE5sS0NrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2hCYm01dklEMGdjR0Z6ZEdVd0tFRXhMQ0JjSWkxY0lpd2dRVElwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1FXNXVieklnUFNCcFpsOWxiSE5sS0VGdWJtOGdQVDBnWENKRkxWQmNJaXdnWENKUUxVVmNJaXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdaZlpXeHpaU2hCYm01dklEMDlJRndpVXkxUVhDSXNJRndpVUMxVFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabDlsYkhObEtFRnVibThnUFQwZ1hDSllMVkJjSWl3Z1hDSlFMVmhjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdaZlpXeHpaU2hCYm01dklEMDlJRndpVXkxRlhDSXNJRndpUlMxVFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmZaV3h6WlNoQmJtNXZJRDA5SUZ3aVdDMUZYQ0lzSUZ3aVJTMVlYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabDlsYkhObEtFRnVibThnUFQwZ1hDSllMVk5jSWl3Z1hDSlRMVmhjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdRVzV1YnlrcEtTa3BLU3hjYmlBZ0lDQXBYRzRnSUZ4dUlDQjBaVzF3SkVGdWJtOHlJRDBnWm1GamRHOXlLSFJsYlhBa1FXNXVieklzSUd4bGRtVnNJRDBnWXloY0lsZ3RXRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lsTXRXRndpTENCY0lsTXRVMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lrVXRXRndpTEZ3aVJTMVRYQ0lzWENKRkxVVmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKUUxVVmNJaXhjSWxBdFdGd2lMQ0JjSWxBdFUxd2lMQ0JjSWxBdFVGd2lLU2xjYmlBZ1hHNGdJQ01nUTJobFkydHBibWNnZEdobElIQnlaV05sYm5ObElHOW1JSE4xY0dWeUlHVnVhR0Z1WTJWeVhHNGdJSFJsYlhBZ1BDMGdkR1Z0Y0NBbFBpVWdaSEJzZVhJNk9uSnZkM2RwYzJVb0tTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0VGdWJtOVRSU0E5SUdsbVpXeHpaU2hCTVY5WGFIbDBaUzVUUlNCOElFRXlYMWRvZVhSbExsTkZMQ0JjSWxORlhDSXNJRndpVGs5Y0lpa3BYRzRnSUhSbGJYQWtRVzV1YjFORklEd3RJR1poWTNSdmNpaDBaVzF3SkVGdWJtOVRSU3dnYkdWMlpXd2dQU0JqS0Z3aVUwVmNJaXdnWENKT1Qxd2lLU2xjYmlBZ1hHNGdJSEpsZEhWeWJpaDBaVzF3S1Z4dWZWeHVYRzVoYm01dmRHRjBaVXh2YjNCUWNtOXRiM1JsY2xSVFV5QThMU0JtZFc1amRHbHZiaWhpWldSd1pTNWhibTV2S1h0Y2JpQWdkR1Z0Y0NBOUlHSmxaSEJsTG1GdWJtOGdKVDRsSUdSd2JIbHlPanB5YjNkM2FYTmxLQ2tnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnSUNBZ0lFRXhJRDBnYVdaZlpXeHpaU2dvUVRGZlNETkxORzFsTTFSVFV5a3NJRndpVUZ3aUxDQmNJazVjSWlrc1hHNGdJQ0FnSUNCQk1pQTlJR2xtWDJWc2MyVW9LRUV5WDBnelN6UnRaVE5VVTFNcExDQmNJbEJjSWl3Z1hDSk9YQ0lwWEc0Z0lDQWdLVnh1SUNCMFpXMXdJRDBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbkp2ZDNkcGMyVW9LU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtFRnVibThnUFNCd1lYTjBaVEFvUVRFc0lGd2lMVndpTENCQk1pa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JCYm01dk1pQTlJR2xtWDJWc2MyVW9RVzV1YnlBOVBTQmNJazR0VUZ3aUxDQmNJbEF0VGx3aUxDQkJibTV2S1NsY2JpQWdYRzRnSUhSbGJYQWtRVzV1YnpJZ1BTQm1ZV04wYjNJb2RHVnRjQ1JCYm01dk1pd2diR1YyWld3Z1BTQmpLRndpVGkxT1hDSXNJRndpVUMxT1hDSXNJRndpVUMxUVhDSXBLVnh1SUNCY2JpQWdjbVYwZFhKdUtIUmxiWEFwWEc1OVhHNWNibUZ1Ym05MFlYUmxURzl2Y0VWdWFHRnVZMlZ5SUR3dElHWjFibU4wYVc5dUtHSmxaSEJsTG1GdWJtOHBlMXh1SUNCMFpXMXdJRDBnWW1Wa2NHVXVZVzV1YnlBbFBpVWdaSEJzZVhJNk9uSnZkM2RwYzJVb0tTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQWdJQ0FnUVRFZ1BTQnBabDlsYkhObEtDaEJNVjlJTTBzeU4yRmpLU3dnWENKRlhDSXNJRndpVGx3aUtTeGNiaUFnSUNBZ0lFRXlJRDBnYVdaZlpXeHpaU2dvUVRKZlNETkxNamRoWXlrc0lGd2lSVndpTENCY0lrNWNJaWxjYmlBZ0lDQXBYRzRnSUhSbGJYQWdQU0IwWlcxd0lDVStKU0JrY0d4NWNqbzZjbTkzZDJselpTZ3BJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb1FXNXVieUE5SUhCaGMzUmxNQ2hCTVN3Z1hDSXRYQ0lzSUVFeUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRUZ1Ym04eUlEMGdhV1pmWld4elpTaEJibTV2SUQwOUlGd2lUaTFGWENJc0lGd2lSUzFPWENJc0lFRnVibThwS1Z4dUlDQjBaVzF3SkVGdWJtOHlJRDBnWm1GamRHOXlLSFJsYlhBa1FXNXVieklzSUd4bGRtVnNJRDBnWXloY0lrNHRUbHdpTENCY0lrVXRUbHdpTENCY0lrVXRSVndpS1NsY2JpQWdYRzRnSUhKbGRIVnliaWgwWlcxd0tWeHVmVnh1WEc1aGJtNXZkR0YwWlV4dmIzQlRkSEoxWTNSMWNtVWdQQzBnWm5WdVkzUnBiMjRvWW1Wa2NHVXVZVzV1YnlsN1hHNGdJSFJsYlhBZ1BTQmlaV1J3WlM1aGJtNXZJQ1UrSlNCa2NHeDVjam82Y205M2QybHpaU2dwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB0ZFhSaGRHVW9YRzRnSUNBZ0lDQkJNU0E5SUdsbVgyVnNjMlVvS0VFeFgwTlVRMFo4UVRGZlVrRkVNakVwTENCY0lsTmNJaXdnWENKT1hDSXBMRnh1SUNBZ0lDQWdRVElnUFNCcFpsOWxiSE5sS0NoQk1sOURWRU5HZkVFeVgxSkJSREl4S1N3Z1hDSlRYQ0lzSUZ3aVRsd2lLVnh1SUNBZ0lDbGNiaUFnZEdWdGNDQTlJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcHliM2QzYVhObEtDa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tMTFkR0YwWlNoQmJtNXZJRDBnY0dGemRHVXdLRUV4TENCY0lpMWNJaXdnUVRJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdRVzV1YnpJZ1BTQnBabDlsYkhObEtFRnVibThnUFQwZ1hDSk9MVk5jSWl3Z1hDSlRMVTVjSWl3Z1FXNXVieWtwWEc0Z0lIUmxiWEFrUVc1dWJ6SWdQU0JtWVdOMGIzSW9kR1Z0Y0NSQmJtNXZNaXdnYkdWMlpXd2dQU0JqS0Z3aVRpMU9YQ0lzSUZ3aVV5MU9YQ0lzSUZ3aVV5MVRYQ0lwS1Z4dUlDQnlaWFIxY200b2RHVnRjQ2xjYm4xY2JseHVYRzVoYm01dmRHRjBaVUZ1WTJodmNsUlRVeUE4TFNCbWRXNWpkR2x2YmloaVpXUndaU2w3WEc0Z0lIUmlMbXh2YjNBZ1BTQmNiaUFnSUNCelpYUlBkbVZ5YkdGd1EyOXNkVzF1S0Z3aVYyaDVkR1V1VTBWY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGRFOTJaWEpzWVhCRGIyeDFiVzRvWENKRFZFTkdYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxkRTkyWlhKc1lYQkRiMngxYlc0b1hDSlNRVVF5TVZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sZEU5MlpYSnNZWEJEYjJ4MWJXNG9YQ0pJTTBzeU4yRmpYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpYUlBkbVZ5YkdGd1EyOXNkVzF1S0Z3aVNETkxORzFsTTFSVFUxd2lMQ0JpWldSd1pTa3BLU2twWEc0Z0lISmxkSFZ5YmloMFlpNXNiMjl3S1Z4dWZWeHVYRzV6WlhSUGRtVnliR0Z3UTI5c2RXMXVJRHd0SUdaMWJtTjBhVzl1S0hCbFlXdE9ZVzFsTENCc2IyOXdLWHRjYmlBZ2RHSXViRzl2Y0NBOUlHRnpYM1JwWW1Kc1pTaHNiMjl3S1Z4dUlDQnZkbVZ5YkdGd0lEMGdjbVYwZFhKdVQzWmxjbXhoY0VsdVpHVjRUR2w0ZENoblpYUW9jR0Z6ZEdVd0tGd2ljR1ZoYXk1Y0lpd2djR1ZoYTA1aGJXVXBLU3dnZEdJdWJHOXZjQ2xjYmlBZ2RHSXViRzl2Y0Z0YmNHRnpkR1V3S0Z3aVFURmZYQ0lzSUhCbFlXdE9ZVzFsS1YxZElEMGdSa0ZNVTBWY2JpQWdkR0l1Ykc5dmNGdGJjR0Z6ZEdVd0tGd2lRVEZmWENJc0lIQmxZV3RPWVcxbEtWMWRXMjkyWlhKc1lYQmJXekZkWFYwZ1BTQlVVbFZGWEc0Z0lIUmlMbXh2YjNCYlczQmhjM1JsTUNoY0lrRXlYMXdpTENCd1pXRnJUbUZ0WlNsZFhTQTlJRVpCVEZORlhHNGdJSFJpTG14dmIzQmJXM0JoYzNSbE1DaGNJa0V5WDF3aUxDQndaV0ZyVG1GdFpTbGRYVnR2ZG1WeWJHRndXMXN5WFYxZElEMGdWRkpWUlZ4dUlDQnlaWFIxY200b2RHSXViRzl2Y0NsY2JuMWNibHh1Y21WMGRYSnVUM1psY214aGNFbHVaR1Y0VEdsNGRDQThMU0JtZFc1amRHbHZiaWh3WldGckxDQnNiMjl3S1h0Y2JpQWdZVzVqYUc5eU1TNTBZaUE5SUdGelgzUnBZbUpzWlNoc2IyOXdLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hqYUhKdmJURXNJSE4wWVhKME1Td2daVzVrTVNsY2JpQWdZVzVqYUc5eU1TQTlJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaGtZWFJoTG1aeVlXMWxLRnh1SUNBZ0lHTm9jaUE5SUdGdVkyaHZjakV1ZEdJa1kyaHliMjB4TEZ4dUlDQWdJSE4wWVhKMElEMGdZVzVqYUc5eU1TNTBZaVJ6ZEdGeWRERXNYRzRnSUNBZ1pXNWtJRDBnWVc1amFHOXlNUzUwWWlSbGJtUXhYRzRnSUNrcFhHNGdJRnh1SUNCaGJtTm9iM0l5TG5SaUlEMGdZWE5mZEdsaVlteGxLR3h2YjNBcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHTm9jbTl0TWl3Z2MzUmhjblF5TENCbGJtUXlLVnh1SUNCaGJtTm9iM0l5SUQwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0dSaGRHRXVabkpoYldVb1hHNGdJQ0FnWTJoeUlEMGdZVzVqYUc5eU1pNTBZaVJqYUhKdmJUSXNYRzRnSUNBZ2MzUmhjblFnUFNCaGJtTm9iM0l5TG5SaUpITjBZWEowTWl4Y2JpQWdJQ0JsYm1RZ1BTQmhibU5vYjNJeUxuUmlKR1Z1WkRKY2JpQWdLU2xjYmlBZ1hHNGdJRzkyWlhKc1lYQWdQU0JzYVhOMEtHOTJaWEpzWVhBeElEMGdkVzVwY1hWbEtIRjFaWEo1U0dsMGN5aG1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlNU3dnY0dWaGF5a3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjNabGNteGhjRElnUFNCMWJtbHhkV1VvY1hWbGNubElhWFJ6S0dacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJeUxDQndaV0ZyS1NrcEtWeHVJQ0J5WlhSMWNtNG9iM1psY214aGNDbGNibjFjYmx4dWMyRjJaVUZ1Ym05SGNtOTFjRUpsWkhCbElEd3RJR1oxYm1OMGFXOXVLSFJsYlhBc0lHRnVibTh1YkdsemRDd2dibUZ0WlN3Z1lXNXViMDVoYldVc0lHOTFSR2x5S1h0Y2JpQWdiRzl2Y0NBOUlIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvUVc1dWJ6SWdKV2x1SlNCaGJtNXZMbXhwYzNRcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwelpXeGxZM1FvWXloY0ltTm9jbTl0TVZ3aUxDQmNJbk4wWVhKME1Wd2lMQ0JjSW1WdVpERmNJaXdnWENKamFISnZiVEpjSWl3Z1hDSnpkR0Z5ZERKY0lpd2dYQ0psYm1ReVhDSXBLVnh1SUNCbWQzSnBkR1VvYkc5dmNDd2dhR1Z5WlNodmRYUkVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNJbDljSWl3Z1lXNXViMDVoYldVc0lGd2lMbUpsWkhCbFhDSXBLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpd2dZMjlzTG01aGJXVnpJRDBnUmtGTVUwVXBYRzU5WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5jcmVhdGVMb29wQW5ub3RhdGlvbiA8LSBmdW5jdGlvbihiZWRwZS5sb29wLmFubm8sIG5hbWUsIGZpZ0Rpciwgb3V0RGlyLCBjb2xvckxpc3Qpe1xuICB0ZW1wID0gYmVkcGUubG9vcC5hbm5vICU+JVxuICAgIGRwbHlyOjptdXRhdGUoc2FtcGxlID0gbmFtZSlcbiAgXG4gIG51bSA9IG5yb3codGVtcClcbiAgcDcgPSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzYW1wbGUsIGZpbGwgPSBBbm5vMikpICtcbiAgICBnZW9tX2Jhcihjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2J3KCkgK1xuICAgIGxhYnModGl0bGUgPSBwYXN0ZTAobnVtLCBcXCBsb29wc1xcKSxcbiAgICAgICAgIHggPSBcXFxcLCB5ID0gXFxDb3VudHNcXCkgK1xuICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYV9mb3JtYXQoKSkgK1xuICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLFxuICAgICAgICAgIGFzcGVjdC5yYXRpbyA9IDUsXG4gICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gXFxyaWdodFxcLFxuICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gID0gXFx2ZXJ0aWNhbFxcKSArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KVxuICBcbiAgd2lkdGggPSAzXG4gIGhlaWdodCA9IDVcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpcixcbiAgICAgICAgICAgICAgIHBhc3RlMChcXGxvb3BDbGFzc2lmeV9cXCwgbmFtZSwgXFwuc3ZnXFwpKSxcbiAgICAgICAgICB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpXG4gIHBsb3QocDcpXG4gIGludmlzaWJsZShkZXYub2ZmKCkpXG4gIHBuZyhoZXJlKGZpZ0RpcixcbiAgICAgICAgICAgcGFzdGUwKFxcbG9vcENsYXNzaWZ5X1xcLCBuYW1lLCBcXC5wbmdcXCkpLFxuICAgICAgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0LCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcKVxuICBwbG90KHA3KVxuICBpbnZpc2libGUoZGV2Lm9mZigpKVxufVxuXG5cbmFubm90YXRlTG9vcFJlbGF4ZWRUU1MgPC0gZnVuY3Rpb24oYmVkcGUuYW5ubyl7XG4gIHRlbXAgPSBiZWRwZS5hbm5vICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoXG4gICAgICBBMSA9IGlmX2Vsc2UoKEExX0gzSzRtZTNUU1MpLCBcXFBcXCwgXG4gICAgICAgICAgICAgICAgICAgaWZfZWxzZSgoQTFfSDNLMjdhYyksIFxcRVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZSgoQTFfQ1RDRnxBMV9SQUQyMSksIFxcU1xcLCBcXFhcXCkpKSxcbiAgICAgIEEyID0gaWZfZWxzZSgoQTJfSDNLNG1lM1RTUyksIFxcUFxcLCBcbiAgICAgICAgICAgICAgICAgICBpZl9lbHNlKChBMl9IM0syN2FjKSwgXFxFXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKChBMl9DVENGfEEyX1JBRDIxKSwgXFxTXFwsIFxcWFxcKSkpXG4gICAgKVxuICB0ZW1wID0gdGVtcCAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKEFubm8gPSBwYXN0ZTAoQTEsIFxcLVxcLCBBMiksXG4gICAgICAgICAgICAgICAgICBBbm5vMiA9IGlmX2Vsc2UoQW5ubyA9PSBcXEUtUFxcLCBcXFAtRVxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKEFubm8gPT0gXFxTLVBcXCwgXFxQLVNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmX2Vsc2UoQW5ubyA9PSBcXFgtUFxcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKEFubm8gPT0gXFxTLUVcXCwgXFxFLVNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKEFubm8gPT0gXFxYLUVcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmX2Vsc2UoQW5ubyA9PSBcXFgtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vKSkpKSkpLFxuICAgIClcbiAgXG4gIHRlbXAkQW5ubzIgPSBmYWN0b3IodGVtcCRBbm5vMiwgbGV2ZWwgPSBjKFxcWC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1YXFwsIFxcUy1TXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1YXFwsXFxFLVNcXCxcXEUtRVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFAtRVxcLFxcUC1YXFwsIFxcUC1TXFwsIFxcUC1QXFwpKVxuICBcbiAgIyBDaGVja2luZyB0aGUgcHJlY2Vuc2Ugb2Ygc3VwZXIgZW5oYW5jZXJcbiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoQW5ub1NFID0gaWZlbHNlKEExX1doeXRlLlNFIHwgQTJfV2h5dGUuU0UsIFxcU0VcXCwgXFxOT1xcKSlcbiAgdGVtcCRBbm5vU0UgPC0gZmFjdG9yKHRlbXAkQW5ub1NFLCBsZXZlbCA9IGMoXFxTRVxcLCBcXE5PXFwpKVxuICBcbiAgcmV0dXJuKHRlbXApXG59XG5cbmFubm90YXRlTG9vcFByb21vdGVyVFNTIDwtIGZ1bmN0aW9uKGJlZHBlLmFubm8pe1xuICB0ZW1wID0gYmVkcGUuYW5ubyAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKFxuICAgICAgQTEgPSBpZl9lbHNlKChBMV9IM0s0bWUzVFNTKSwgXFxQXFwsIFxcTlxcKSxcbiAgICAgIEEyID0gaWZfZWxzZSgoQTJfSDNLNG1lM1RTUyksIFxcUFxcLCBcXE5cXClcbiAgICApXG4gIHRlbXAgPSB0ZW1wICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoQW5ubyA9IHBhc3RlMChBMSwgXFwtXFwsIEEyKSxcbiAgICAgICAgICAgICAgICAgIEFubm8yID0gaWZfZWxzZShBbm5vID09IFxcTi1QXFwsIFxcUC1OXFwsIEFubm8pKVxuICBcbiAgdGVtcCRBbm5vMiA9IGZhY3Rvcih0ZW1wJEFubm8yLCBsZXZlbCA9IGMoXFxOLU5cXCwgXFxQLU5cXCwgXFxQLVBcXCkpXG4gIFxuICByZXR1cm4odGVtcClcbn1cblxuYW5ub3RhdGVMb29wRW5oYW5jZXIgPC0gZnVuY3Rpb24oYmVkcGUuYW5ubyl7XG4gIHRlbXAgPSBiZWRwZS5hbm5vICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoXG4gICAgICBBMSA9IGlmX2Vsc2UoKEExX0gzSzI3YWMpLCBcXEVcXCwgXFxOXFwpLFxuICAgICAgQTIgPSBpZl9lbHNlKChBMl9IM0syN2FjKSwgXFxFXFwsIFxcTlxcKVxuICAgIClcbiAgdGVtcCA9IHRlbXAgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShBbm5vID0gcGFzdGUwKEExLCBcXC1cXCwgQTIpLFxuICAgICAgICAgICAgICAgICAgQW5ubzIgPSBpZl9lbHNlKEFubm8gPT0gXFxOLUVcXCwgXFxFLU5cXCwgQW5ubykpXG4gIHRlbXAkQW5ubzIgPSBmYWN0b3IodGVtcCRBbm5vMiwgbGV2ZWwgPSBjKFxcTi1OXFwsIFxcRS1OXFwsIFxcRS1FXFwpKVxuICBcbiAgcmV0dXJuKHRlbXApXG59XG5cbmFubm90YXRlTG9vcFN0cnVjdHVyZSA8LSBmdW5jdGlvbihiZWRwZS5hbm5vKXtcbiAgdGVtcCA9IGJlZHBlLmFubm8gJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShcbiAgICAgIEExID0gaWZfZWxzZSgoQTFfQ1RDRnxBMV9SQUQyMSksIFxcU1xcLCBcXE5cXCksXG4gICAgICBBMiA9IGlmX2Vsc2UoKEEyX0NUQ0Z8QTJfUkFEMjEpLCBcXFNcXCwgXFxOXFwpXG4gICAgKVxuICB0ZW1wID0gdGVtcCAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKEFubm8gPSBwYXN0ZTAoQTEsIFxcLVxcLCBBMiksXG4gICAgICAgICAgICAgICAgICBBbm5vMiA9IGlmX2Vsc2UoQW5ubyA9PSBcXE4tU1xcLCBcXFMtTlxcLCBBbm5vKSlcbiAgdGVtcCRBbm5vMiA9IGZhY3Rvcih0ZW1wJEFubm8yLCBsZXZlbCA9IGMoXFxOLU5cXCwgXFxTLU5cXCwgXFxTLVNcXCkpXG4gIHJldHVybih0ZW1wKVxufVxuXG5cbmFubm90YXRlQW5jaG9yVFNTIDwtIGZ1bmN0aW9uKGJlZHBlKXtcbiAgdGIubG9vcCA9IFxuICAgIHNldE92ZXJsYXBDb2x1bW4oXFxXaHl0ZS5TRVxcLFxuICAgICAgICAgICAgICAgICAgICAgc2V0T3ZlcmxhcENvbHVtbihcXENUQ0ZcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3ZlcmxhcENvbHVtbihcXFJBRDIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3ZlcmxhcENvbHVtbihcXEgzSzI3YWNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE92ZXJsYXBDb2x1bW4oXFxIM0s0bWUzVFNTXFwsIGJlZHBlKSkpKSlcbiAgcmV0dXJuKHRiLmxvb3ApXG59XG5cbnNldE92ZXJsYXBDb2x1bW4gPC0gZnVuY3Rpb24ocGVha05hbWUsIGxvb3Ape1xuICB0Yi5sb29wID0gYXNfdGliYmxlKGxvb3ApXG4gIG92ZXJsYXAgPSByZXR1cm5PdmVybGFwSW5kZXhMaXh0KGdldChwYXN0ZTAoXFxwZWFrLlxcLCBwZWFrTmFtZSkpLCB0Yi5sb29wKVxuICB0Yi5sb29wW1twYXN0ZTAoXFxBMV9cXCwgcGVha05hbWUpXV0gPSBGQUxTRVxuICB0Yi5sb29wW1twYXN0ZTAoXFxBMV9cXCwgcGVha05hbWUpXV1bb3ZlcmxhcFtbMV1dXSA9IFRSVUVcbiAgdGIubG9vcFtbcGFzdGUwKFxcQTJfXFwsIHBlYWtOYW1lKV1dID0gRkFMU0VcbiAgdGIubG9vcFtbcGFzdGUwKFxcQTJfXFwsIHBlYWtOYW1lKV1dW292ZXJsYXBbWzJdXV0gPSBUUlVFXG4gIHJldHVybih0Yi5sb29wKVxufVxuXG5yZXR1cm5PdmVybGFwSW5kZXhMaXh0IDwtIGZ1bmN0aW9uKHBlYWssIGxvb3Ape1xuICBhbmNob3IxLnRiID0gYXNfdGliYmxlKGxvb3ApICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxKVxuICBhbmNob3IxID0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGRhdGEuZnJhbWUoXG4gICAgY2hyID0gYW5jaG9yMS50YiRjaHJvbTEsXG4gICAgc3RhcnQgPSBhbmNob3IxLnRiJHN0YXJ0MSxcbiAgICBlbmQgPSBhbmNob3IxLnRiJGVuZDFcbiAgKSlcbiAgXG4gIGFuY2hvcjIudGIgPSBhc190aWJibGUobG9vcCkgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20yLCBzdGFydDIsIGVuZDIpXG4gIGFuY2hvcjIgPSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZGF0YS5mcmFtZShcbiAgICBjaHIgPSBhbmNob3IyLnRiJGNocm9tMixcbiAgICBzdGFydCA9IGFuY2hvcjIudGIkc3RhcnQyLFxuICAgIGVuZCA9IGFuY2hvcjIudGIkZW5kMlxuICApKVxuICBcbiAgb3ZlcmxhcCA9IGxpc3Qob3ZlcmxhcDEgPSB1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IxLCBwZWFrKSkpLFxuICAgICAgICAgICAgICAgICBvdmVybGFwMiA9IHVuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKGFuY2hvcjIsIHBlYWspKSkpXG4gIHJldHVybihvdmVybGFwKVxufVxuXG5zYXZlQW5ub0dyb3VwQmVkcGUgPC0gZnVuY3Rpb24odGVtcCwgYW5uby5saXN0LCBuYW1lLCBhbm5vTmFtZSwgb3VEaXIpe1xuICBsb29wID0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGFubm8ubGlzdCkgJT4lXG4gICAgZHBseXI6OnNlbGVjdChjKFxcY2hyb20xXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocm9tMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCkpXG4gIGZ3cml0ZShsb29wLCBoZXJlKG91dERpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBhbm5vTmFtZSwgXFwuYmVkcGVcXCkpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbn1cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
createLoopAnnotation <- function(bedpe.loop.anno, name, figDir, outDir, colorList){
  temp = bedpe.loop.anno %>%
    dplyr::mutate(sample = name)
  
  num = nrow(temp)
  p7 = ggplot(temp, aes(x = sample, fill = Anno2)) +
    geom_bar(color = \black\) +
    theme_bw() +
    labs(title = paste0(num, \ loops\),
         x = \\, y = \Counts\) +
    scale_y_continuous(labels = comma_format()) +
    theme(plot.title = element_text(hjust = 0.5),
          aspect.ratio = 5,
          legend.position = \right\,
          legend.direction  = \vertical\) +
    scale_fill_manual(values = colorList)
  
  width = 3
  height = 5
  svglite(here(figDir,
               paste0(\loopClassify_\, name, \.svg\)),
          width = width, height = height)
  plot(p7)
  invisible(dev.off())
  png(here(figDir,
           paste0(\loopClassify_\, name, \.png\)),
      width = width, height = height, res = 600, units = \in\)
  plot(p7)
  invisible(dev.off())
}


annotateLoopRelaxedTSS <- function(bedpe.anno){
  temp = bedpe.anno %>% dplyr::rowwise() %>%
    dplyr::mutate(
      A1 = if_else((A1_H3K4me3TSS), \P\, 
                   if_else((A1_H3K27ac), \E\,
                           if_else((A1_CTCF|A1_RAD21), \S\, \X\))),
      A2 = if_else((A2_H3K4me3TSS), \P\, 
                   if_else((A2_H3K27ac), \E\,
                           if_else((A2_CTCF|A2_RAD21), \S\, \X\)))
    )
  temp = temp %>% dplyr::rowwise() %>%
    dplyr::mutate(Anno = paste0(A1, \-\, A2),
                  Anno2 = if_else(Anno == \E-P\, \P-E\, 
                                  if_else(Anno == \S-P\, \P-S\,
                                          if_else(Anno == \X-P\, \P-X\,
                                                  if_else(Anno == \S-E\, \E-S\,
                                                          if_else(Anno == \X-E\, \E-X\,
                                                                  if_else(Anno == \X-S\, \S-X\,
                                                                          Anno)))))),
    )
  
  temp$Anno2 = factor(temp$Anno2, level = c(\X-X\,
                                            \S-X\, \S-S\,
                                            \E-X\,\E-S\,\E-E\,
                                            \P-E\,\P-X\, \P-S\, \P-P\))
  
  # Checking the precense of super enhancer
  temp <- temp %>% dplyr::rowwise() %>%
    dplyr::mutate(AnnoSE = ifelse(A1_Whyte.SE | A2_Whyte.SE, \SE\, \NO\))
  temp$AnnoSE <- factor(temp$AnnoSE, level = c(\SE\, \NO\))
  
  return(temp)
}

annotateLoopPromoterTSS <- function(bedpe.anno){
  temp = bedpe.anno %>% dplyr::rowwise() %>%
    dplyr::mutate(
      A1 = if_else((A1_H3K4me3TSS), \P\, \N\),
      A2 = if_else((A2_H3K4me3TSS), \P\, \N\)
    )
  temp = temp %>% dplyr::rowwise() %>%
    dplyr::mutate(Anno = paste0(A1, \-\, A2),
                  Anno2 = if_else(Anno == \N-P\, \P-N\, Anno))
  
  temp$Anno2 = factor(temp$Anno2, level = c(\N-N\, \P-N\, \P-P\))
  
  return(temp)
}

annotateLoopEnhancer <- function(bedpe.anno){
  temp = bedpe.anno %>% dplyr::rowwise() %>%
    dplyr::mutate(
      A1 = if_else((A1_H3K27ac), \E\, \N\),
      A2 = if_else((A2_H3K27ac), \E\, \N\)
    )
  temp = temp %>% dplyr::rowwise() %>%
    dplyr::mutate(Anno = paste0(A1, \-\, A2),
                  Anno2 = if_else(Anno == \N-E\, \E-N\, Anno))
  temp$Anno2 = factor(temp$Anno2, level = c(\N-N\, \E-N\, \E-E\))
  
  return(temp)
}

annotateLoopStructure <- function(bedpe.anno){
  temp = bedpe.anno %>% dplyr::rowwise() %>%
    dplyr::mutate(
      A1 = if_else((A1_CTCF|A1_RAD21), \S\, \N\),
      A2 = if_else((A2_CTCF|A2_RAD21), \S\, \N\)
    )
  temp = temp %>% dplyr::rowwise() %>%
    dplyr::mutate(Anno = paste0(A1, \-\, A2),
                  Anno2 = if_else(Anno == \N-S\, \S-N\, Anno))
  temp$Anno2 = factor(temp$Anno2, level = c(\N-N\, \S-N\, \S-S\))
  return(temp)
}


annotateAnchorTSS <- function(bedpe){
  tb.loop = 
    setOverlapColumn(\Whyte.SE\,
                     setOverlapColumn(\CTCF\,
                                      setOverlapColumn(\RAD21\,
                                                       setOverlapColumn(\H3K27ac\,
                                                                        setOverlapColumn(\H3K4me3TSS\, bedpe)))))
  return(tb.loop)
}

setOverlapColumn <- function(peakName, loop){
  tb.loop = as_tibble(loop)
  overlap = returnOverlapIndexLixt(get(paste0(\peak.\, peakName)), tb.loop)
  tb.loop[[paste0(\A1_\, peakName)]] = FALSE
  tb.loop[[paste0(\A1_\, peakName)]][overlap[[1]]] = TRUE
  tb.loop[[paste0(\A2_\, peakName)]] = FALSE
  tb.loop[[paste0(\A2_\, peakName)]][overlap[[2]]] = TRUE
  return(tb.loop)
}

returnOverlapIndexLixt <- function(peak, loop){
  anchor1.tb = as_tibble(loop) %>% dplyr::select(chrom1, start1, end1)
  anchor1 = makeGRangesFromDataFrame(data.frame(
    chr = anchor1.tb$chrom1,
    start = anchor1.tb$start1,
    end = anchor1.tb$end1
  ))
  
  anchor2.tb = as_tibble(loop) %>% dplyr::select(chrom2, start2, end2)
  anchor2 = makeGRangesFromDataFrame(data.frame(
    chr = anchor2.tb$chrom2,
    start = anchor2.tb$start2,
    end = anchor2.tb$end2
  ))
  
  overlap = list(overlap1 = unique(queryHits(findOverlaps(anchor1, peak))),
                 overlap2 = unique(queryHits(findOverlaps(anchor2, peak))))
  return(overlap)
}

saveAnnoGroupBedpe <- function(temp, anno.list, name, annoName, ouDir){
  loop = temp %>% dplyr::filter(Anno2 %in% anno.list) %>%
    dplyr::select(c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\))
  fwrite(loop, here(outDir, paste0(name, \_\, annoName, \.bedpe\)), sep = \\t\, col.names = FALSE)
}



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVkzSmxZWFJsVEc5dmNFRnVibTkwWVhScGIyNGdQQzBnWm5WdVkzUnBiMjRvWW1Wa2NHVXViRzl2Y0M1aGJtNXZMQ0J1WVcxbExDQm1hV2RFYVhJc0lHOTFkRVJwY2l3Z1kyOXNiM0pNYVhOMEtYdGNiaUFnZEdWdGNDQTlJR0psWkhCbExteHZiM0F1WVc1dWJ5QWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0hOaGJYQnNaU0E5SUc1aGJXVXBYRzRnSUZ4dUlDQnVkVzBnUFNCdWNtOTNLSFJsYlhBcFhHNGdJSEEzSUQwZ1oyZHdiRzkwS0hSbGJYQXNJR0ZsY3loNElEMGdjMkZ0Y0d4bExDQm1hV3hzSUQwZ1FXNXVieklwS1NBclhHNGdJQ0FnWjJWdmJWOWlZWElvWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndwSUN0Y2JpQWdJQ0IwYUdWdFpWOWlkeWdwSUN0Y2JpQWdJQ0JzWVdKektIUnBkR3hsSUQwZ2NHRnpkR1V3S0c1MWJTd2dYRndnYkc5dmNITmNYQ2tzWEc0Z0lDQWdJQ0FnSUNCNElEMGdYRnhjWEN3Z2VTQTlJRnhjUTI5MWJuUnpYRndwSUN0Y2JpQWdJQ0J6WTJGc1pWOTVYMk52Ym5ScGJuVnZkWE1vYkdGaVpXeHpJRDBnWTI5dGJXRmZabTl5YldGMEtDa3BJQ3RjYmlBZ0lDQjBhR1Z0WlNod2JHOTBMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0docWRYTjBJRDBnTUM0MUtTeGNiaUFnSUNBZ0lDQWdJQ0JoYzNCbFkzUXVjbUYwYVc4Z1BTQTFMRnh1SUNBZ0lDQWdJQ0FnSUd4bFoyVnVaQzV3YjNOcGRHbHZiaUE5SUZ4Y2NtbG5hSFJjWEN4Y2JpQWdJQ0FnSUNBZ0lDQnNaV2RsYm1RdVpHbHlaV04wYVc5dUlDQTlJRnhjZG1WeWRHbGpZV3hjWENrZ0sxeHVJQ0FnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdOdmJHOXlUR2x6ZENsY2JpQWdYRzRnSUhkcFpIUm9JRDBnTTF4dUlDQm9aV2xuYUhRZ1BTQTFYRzRnSUhOMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd1lYTjBaVEFvWEZ4c2IyOXdRMnhoYzNOcFpubGZYRndzSUc1aGJXVXNJRnhjTG5OMloxeGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ2QybGtkR2dnUFNCM2FXUjBhQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBLVnh1SUNCd2JHOTBLSEEzS1Z4dUlDQnBiblpwYzJsaWJHVW9aR1YyTG05bVppZ3BLVnh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzWEc0Z0lDQWdJQ0FnSUNBZ0lIQmhjM1JsTUNoY1hHeHZiM0JEYkdGemMybG1lVjljWEN3Z2JtRnRaU3dnWEZ3dWNHNW5YRndwS1N4Y2JpQWdJQ0FnSUhkcFpIUm9JRDBnZDJsa2RHZ3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMGN5QTlJRnhjYVc1Y1hDbGNiaUFnY0d4dmRDaHdOeWxjYmlBZ2FXNTJhWE5wWW14bEtHUmxkaTV2Wm1Zb0tTbGNibjFjYmx4dVhHNWhibTV2ZEdGMFpVeHZiM0JTWld4aGVHVmtWRk5USUR3dElHWjFibU4wYVc5dUtHSmxaSEJsTG1GdWJtOHBlMXh1SUNCMFpXMXdJRDBnWW1Wa2NHVXVZVzV1YnlBbFBpVWdaSEJzZVhJNk9uSnZkM2RwYzJVb0tTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQWdJQ0FnUVRFZ1BTQnBabDlsYkhObEtDaEJNVjlJTTBzMGJXVXpWRk5US1N3Z1hGeFFYRndzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1YMlZzYzJVb0tFRXhYMGd6U3pJM1lXTXBMQ0JjWEVWY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWDJWc2MyVW9LRUV4WDBOVVEwWjhRVEZmVWtGRU1qRXBMQ0JjWEZOY1hDd2dYRnhZWEZ3cEtTa3NYRzRnSUNBZ0lDQkJNaUE5SUdsbVgyVnNjMlVvS0VFeVgwZ3pTelJ0WlROVVUxTXBMQ0JjWEZCY1hDd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdaZlpXeHpaU2dvUVRKZlNETkxNamRoWXlrc0lGeGNSVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmZaV3h6WlNnb1FUSmZRMVJEUm54Qk1sOVNRVVF5TVNrc0lGeGNVMXhjTENCY1hGaGNYQ2twS1Z4dUlDQWdJQ2xjYmlBZ2RHVnRjQ0E5SUhSbGJYQWdKVDRsSUdSd2JIbHlPanB5YjNkM2FYTmxLQ2tnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbTExZEdGMFpTaEJibTV2SUQwZ2NHRnpkR1V3S0VFeExDQmNYQzFjWEN3Z1FUSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnUVc1dWJ6SWdQU0JwWmw5bGJITmxLRUZ1Ym04Z1BUMGdYRnhGTFZCY1hDd2dYRnhRTFVWY1hDd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1pmWld4elpTaEJibTV2SUQwOUlGeGNVeTFRWEZ3c0lGeGNVQzFUWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFpsOWxiSE5sS0VGdWJtOGdQVDBnWEZ4WUxWQmNYQ3dnWEZ4UUxWaGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1pmWld4elpTaEJibTV2SUQwOUlGeGNVeTFGWEZ3c0lGeGNSUzFUWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdaZlpXeHpaU2hCYm01dklEMDlJRnhjV0MxRlhGd3NJRnhjUlMxWVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFpsOWxiSE5sS0VGdWJtOGdQVDBnWEZ4WUxWTmNYQ3dnWEZ4VExWaGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1FXNXVieWtwS1NrcEtTeGNiaUFnSUNBcFhHNGdJRnh1SUNCMFpXMXdKRUZ1Ym04eUlEMGdabUZqZEc5eUtIUmxiWEFrUVc1dWJ6SXNJR3hsZG1Wc0lEMGdZeWhjWEZndFdGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEZNdFdGeGNMQ0JjWEZNdFUxeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEVVdFdGeGNMRnhjUlMxVFhGd3NYRnhGTFVWY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnhRTFVWY1hDeGNYRkF0V0Z4Y0xDQmNYRkF0VTF4Y0xDQmNYRkF0VUZ4Y0tTbGNiaUFnWEc0Z0lDTWdRMmhsWTJ0cGJtY2dkR2hsSUhCeVpXTmxibk5sSUc5bUlITjFjR1Z5SUdWdWFHRnVZMlZ5WEc0Z0lIUmxiWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T25KdmQzZHBjMlVvS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82YlhWMFlYUmxLRUZ1Ym05VFJTQTlJR2xtWld4elpTaEJNVjlYYUhsMFpTNVRSU0I4SUVFeVgxZG9lWFJsTGxORkxDQmNYRk5GWEZ3c0lGeGNUazljWENrcFhHNGdJSFJsYlhBa1FXNXViMU5GSUR3dElHWmhZM1J2Y2loMFpXMXdKRUZ1Ym05VFJTd2diR1YyWld3Z1BTQmpLRnhjVTBWY1hDd2dYRnhPVDF4Y0tTbGNiaUFnWEc0Z0lISmxkSFZ5YmloMFpXMXdLVnh1ZlZ4dVhHNWhibTV2ZEdGMFpVeHZiM0JRY205dGIzUmxjbFJUVXlBOExTQm1kVzVqZEdsdmJpaGlaV1J3WlM1aGJtNXZLWHRjYmlBZ2RHVnRjQ0E5SUdKbFpIQmxMbUZ1Ym04Z0pUNGxJR1J3YkhseU9qcHliM2QzYVhObEtDa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tMTFkR0YwWlNoY2JpQWdJQ0FnSUVFeElEMGdhV1pmWld4elpTZ29RVEZmU0ROTE5HMWxNMVJUVXlrc0lGeGNVRnhjTENCY1hFNWNYQ2tzWEc0Z0lDQWdJQ0JCTWlBOUlHbG1YMlZzYzJVb0tFRXlYMGd6U3pSdFpUTlVVMU1wTENCY1hGQmNYQ3dnWEZ4T1hGd3BYRzRnSUNBZ0tWeHVJQ0IwWlcxd0lEMGdkR1Z0Y0NBbFBpVWdaSEJzZVhJNk9uSnZkM2RwYzJVb0tTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0VGdWJtOGdQU0J3WVhOMFpUQW9RVEVzSUZ4Y0xWeGNMQ0JCTWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQkJibTV2TWlBOUlHbG1YMlZzYzJVb1FXNXVieUE5UFNCY1hFNHRVRnhjTENCY1hGQXRUbHhjTENCQmJtNXZLU2xjYmlBZ1hHNGdJSFJsYlhBa1FXNXVieklnUFNCbVlXTjBiM0lvZEdWdGNDUkJibTV2TWl3Z2JHVjJaV3dnUFNCaktGeGNUaTFPWEZ3c0lGeGNVQzFPWEZ3c0lGeGNVQzFRWEZ3cEtWeHVJQ0JjYmlBZ2NtVjBkWEp1S0hSbGJYQXBYRzU5WEc1Y2JtRnVibTkwWVhSbFRHOXZjRVZ1YUdGdVkyVnlJRHd0SUdaMWJtTjBhVzl1S0dKbFpIQmxMbUZ1Ym04cGUxeHVJQ0IwWlcxd0lEMGdZbVZrY0dVdVlXNXVieUFsUGlVZ1pIQnNlWEk2T25KdmQzZHBjMlVvS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNBZ0lDQWdRVEVnUFNCcFpsOWxiSE5sS0NoQk1WOUlNMHN5TjJGaktTd2dYRnhGWEZ3c0lGeGNUbHhjS1N4Y2JpQWdJQ0FnSUVFeUlEMGdhV1pmWld4elpTZ29RVEpmU0ROTE1qZGhZeWtzSUZ4Y1JWeGNMQ0JjWEU1Y1hDbGNiaUFnSUNBcFhHNGdJSFJsYlhBZ1BTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNmNtOTNkMmx6WlNncElDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvUVc1dWJ5QTlJSEJoYzNSbE1DaEJNU3dnWEZ3dFhGd3NJRUV5S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lFRnVibTh5SUQwZ2FXWmZaV3h6WlNoQmJtNXZJRDA5SUZ4Y1RpMUZYRndzSUZ4Y1JTMU9YRndzSUVGdWJtOHBLVnh1SUNCMFpXMXdKRUZ1Ym04eUlEMGdabUZqZEc5eUtIUmxiWEFrUVc1dWJ6SXNJR3hsZG1Wc0lEMGdZeWhjWEU0dFRseGNMQ0JjWEVVdFRseGNMQ0JjWEVVdFJWeGNLU2xjYmlBZ1hHNGdJSEpsZEhWeWJpaDBaVzF3S1Z4dWZWeHVYRzVoYm01dmRHRjBaVXh2YjNCVGRISjFZM1IxY21VZ1BDMGdablZ1WTNScGIyNG9ZbVZrY0dVdVlXNXVieWw3WEc0Z0lIUmxiWEFnUFNCaVpXUndaUzVoYm01dklDVStKU0JrY0d4NWNqbzZjbTkzZDJselpTZ3BJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb1hHNGdJQ0FnSUNCQk1TQTlJR2xtWDJWc2MyVW9LRUV4WDBOVVEwWjhRVEZmVWtGRU1qRXBMQ0JjWEZOY1hDd2dYRnhPWEZ3cExGeHVJQ0FnSUNBZ1FUSWdQU0JwWmw5bGJITmxLQ2hCTWw5RFZFTkdmRUV5WDFKQlJESXhLU3dnWEZ4VFhGd3NJRnhjVGx4Y0tWeHVJQ0FnSUNsY2JpQWdkR1Z0Y0NBOUlIUmxiWEFnSlQ0bElHUndiSGx5T2pweWIzZDNhWE5sS0NrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2hCYm01dklEMGdjR0Z6ZEdVd0tFRXhMQ0JjWEMxY1hDd2dRVElwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1FXNXVieklnUFNCcFpsOWxiSE5sS0VGdWJtOGdQVDBnWEZ4T0xWTmNYQ3dnWEZ4VExVNWNYQ3dnUVc1dWJ5a3BYRzRnSUhSbGJYQWtRVzV1YnpJZ1BTQm1ZV04wYjNJb2RHVnRjQ1JCYm01dk1pd2diR1YyWld3Z1BTQmpLRnhjVGkxT1hGd3NJRnhjVXkxT1hGd3NJRnhjVXkxVFhGd3BLVnh1SUNCeVpYUjFjbTRvZEdWdGNDbGNibjFjYmx4dVhHNWhibTV2ZEdGMFpVRnVZMmh2Y2xSVFV5QThMU0JtZFc1amRHbHZiaWhpWldSd1pTbDdYRzRnSUhSaUxteHZiM0FnUFNCY2JpQWdJQ0J6WlhSUGRtVnliR0Z3UTI5c2RXMXVLRnhjVjJoNWRHVXVVMFZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sZEU5MlpYSnNZWEJEYjJ4MWJXNG9YRnhEVkVOR1hGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGRFOTJaWEpzWVhCRGIyeDFiVzRvWEZ4U1FVUXlNVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxkRTkyWlhKc1lYQkRiMngxYlc0b1hGeElNMHN5TjJGalhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6WlhSUGRtVnliR0Z3UTI5c2RXMXVLRnhjU0ROTE5HMWxNMVJUVTF4Y0xDQmlaV1J3WlNrcEtTa3BYRzRnSUhKbGRIVnliaWgwWWk1c2IyOXdLVnh1ZlZ4dVhHNXpaWFJQZG1WeWJHRndRMjlzZFcxdUlEd3RJR1oxYm1OMGFXOXVLSEJsWVd0T1lXMWxMQ0JzYjI5d0tYdGNiaUFnZEdJdWJHOXZjQ0E5SUdGelgzUnBZbUpzWlNoc2IyOXdLVnh1SUNCdmRtVnliR0Z3SUQwZ2NtVjBkWEp1VDNabGNteGhjRWx1WkdWNFRHbDRkQ2huWlhRb2NHRnpkR1V3S0Z4Y2NHVmhheTVjWEN3Z2NHVmhhMDVoYldVcEtTd2dkR0l1Ykc5dmNDbGNiaUFnZEdJdWJHOXZjRnRiY0dGemRHVXdLRnhjUVRGZlhGd3NJSEJsWVd0T1lXMWxLVjFkSUQwZ1JrRk1VMFZjYmlBZ2RHSXViRzl2Y0Z0YmNHRnpkR1V3S0Z4Y1FURmZYRndzSUhCbFlXdE9ZVzFsS1YxZFcyOTJaWEpzWVhCYld6RmRYVjBnUFNCVVVsVkZYRzRnSUhSaUxteHZiM0JiVzNCaGMzUmxNQ2hjWEVFeVgxeGNMQ0J3WldGclRtRnRaU2xkWFNBOUlFWkJURk5GWEc0Z0lIUmlMbXh2YjNCYlczQmhjM1JsTUNoY1hFRXlYMXhjTENCd1pXRnJUbUZ0WlNsZFhWdHZkbVZ5YkdGd1cxc3lYVjFkSUQwZ1ZGSlZSVnh1SUNCeVpYUjFjbTRvZEdJdWJHOXZjQ2xjYm4xY2JseHVjbVYwZFhKdVQzWmxjbXhoY0VsdVpHVjRUR2w0ZENBOExTQm1kVzVqZEdsdmJpaHdaV0ZyTENCc2IyOXdLWHRjYmlBZ1lXNWphRzl5TVM1MFlpQTlJR0Z6WDNScFltSnNaU2hzYjI5d0tTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGphSEp2YlRFc0lITjBZWEowTVN3Z1pXNWtNU2xjYmlBZ1lXNWphRzl5TVNBOUlHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoa1lYUmhMbVp5WVcxbEtGeHVJQ0FnSUdOb2NpQTlJR0Z1WTJodmNqRXVkR0lrWTJoeWIyMHhMRnh1SUNBZ0lITjBZWEowSUQwZ1lXNWphRzl5TVM1MFlpUnpkR0Z5ZERFc1hHNGdJQ0FnWlc1a0lEMGdZVzVqYUc5eU1TNTBZaVJsYm1ReFhHNGdJQ2twWEc0Z0lGeHVJQ0JoYm1Ob2IzSXlMblJpSUQwZ1lYTmZkR2xpWW14bEtHeHZiM0FwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dOb2NtOXRNaXdnYzNSaGNuUXlMQ0JsYm1ReUtWeHVJQ0JoYm1Ob2IzSXlJRDBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLR1JoZEdFdVpuSmhiV1VvWEc0Z0lDQWdZMmh5SUQwZ1lXNWphRzl5TWk1MFlpUmphSEp2YlRJc1hHNGdJQ0FnYzNSaGNuUWdQU0JoYm1Ob2IzSXlMblJpSkhOMFlYSjBNaXhjYmlBZ0lDQmxibVFnUFNCaGJtTm9iM0l5TG5SaUpHVnVaREpjYmlBZ0tTbGNiaUFnWEc0Z0lHOTJaWEpzWVhBZ1BTQnNhWE4wS0c5MlpYSnNZWEF4SUQwZ2RXNXBjWFZsS0hGMVpYSjVTR2wwY3lobWFXNWtUM1psY214aGNITW9ZVzVqYUc5eU1Td2djR1ZoYXlrcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiM1psY214aGNESWdQU0IxYm1seGRXVW9jWFZsY25sSWFYUnpLR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l5TENCd1pXRnJLU2twS1Z4dUlDQnlaWFIxY200b2IzWmxjbXhoY0NsY2JuMWNibHh1YzJGMlpVRnVibTlIY205MWNFSmxaSEJsSUR3dElHWjFibU4wYVc5dUtIUmxiWEFzSUdGdWJtOHViR2x6ZEN3Z2JtRnRaU3dnWVc1dWIwNWhiV1VzSUc5MVJHbHlLWHRjYmlBZ2JHOXZjQ0E5SUhSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9RVzV1YnpJZ0pXbHVKU0JoYm01dkxteHBjM1FwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWhjWEdOb2NtOXRNVnhjTENCY1hITjBZWEowTVZ4Y0xDQmNYR1Z1WkRGY1hDd2dYRnhqYUhKdmJUSmNYQ3dnWEZ4emRHRnlkREpjWEN3Z1hGeGxibVF5WEZ3cEtWeHVJQ0JtZDNKcGRHVW9iRzl2Y0N3Z2FHVnlaU2h2ZFhSRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY1hGOWNYQ3dnWVc1dWIwNWhiV1VzSUZ4Y0xtSmxaSEJsWEZ3cEtTd2djMlZ3SUQwZ1hGeGNYSFJjWEN3Z1kyOXNMbTVoYldWeklEMGdSa0ZNVTBVcFhHNTlYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5jcmVhdGVMb29wQW5ub3RhdGlvbiA8LSBmdW5jdGlvbihiZWRwZS5sb29wLmFubm8sIG5hbWUsIGZpZ0Rpciwgb3V0RGlyLCBjb2xvckxpc3Qpe1xuICB0ZW1wID0gYmVkcGUubG9vcC5hbm5vICU+JVxuICAgIGRwbHlyOjptdXRhdGUoc2FtcGxlID0gbmFtZSlcbiAgXG4gIG51bSA9IG5yb3codGVtcClcbiAgcDcgPSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzYW1wbGUsIGZpbGwgPSBBbm5vMikpICtcbiAgICBnZW9tX2Jhcihjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2J3KCkgK1xuICAgIGxhYnModGl0bGUgPSBwYXN0ZTAobnVtLCBcXCBsb29wc1xcKSxcbiAgICAgICAgIHggPSBcXFxcLCB5ID0gXFxDb3VudHNcXCkgK1xuICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYV9mb3JtYXQoKSkgK1xuICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLFxuICAgICAgICAgIGFzcGVjdC5yYXRpbyA9IDUsXG4gICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gXFxyaWdodFxcLFxuICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gID0gXFx2ZXJ0aWNhbFxcKSArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KVxuICBcbiAgd2lkdGggPSAzXG4gIGhlaWdodCA9IDVcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpcixcbiAgICAgICAgICAgICAgIHBhc3RlMChcXGxvb3BDbGFzc2lmeV9cXCwgbmFtZSwgXFwuc3ZnXFwpKSxcbiAgICAgICAgICB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpXG4gIHBsb3QocDcpXG4gIGludmlzaWJsZShkZXYub2ZmKCkpXG4gIHBuZyhoZXJlKGZpZ0RpcixcbiAgICAgICAgICAgcGFzdGUwKFxcbG9vcENsYXNzaWZ5X1xcLCBuYW1lLCBcXC5wbmdcXCkpLFxuICAgICAgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0LCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcKVxuICBwbG90KHA3KVxuICBpbnZpc2libGUoZGV2Lm9mZigpKVxufVxuXG5cbmFubm90YXRlTG9vcFJlbGF4ZWRUU1MgPC0gZnVuY3Rpb24oYmVkcGUuYW5ubyl7XG4gIHRlbXAgPSBiZWRwZS5hbm5vICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoXG4gICAgICBBMSA9IGlmX2Vsc2UoKEExX0gzSzRtZTNUU1MpLCBcXFBcXCwgXG4gICAgICAgICAgICAgICAgICAgaWZfZWxzZSgoQTFfSDNLMjdhYyksIFxcRVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZSgoQTFfQ1RDRnxBMV9SQUQyMSksIFxcU1xcLCBcXFhcXCkpKSxcbiAgICAgIEEyID0gaWZfZWxzZSgoQTJfSDNLNG1lM1RTUyksIFxcUFxcLCBcbiAgICAgICAgICAgICAgICAgICBpZl9lbHNlKChBMl9IM0syN2FjKSwgXFxFXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKChBMl9DVENGfEEyX1JBRDIxKSwgXFxTXFwsIFxcWFxcKSkpXG4gICAgKVxuICB0ZW1wID0gdGVtcCAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKEFubm8gPSBwYXN0ZTAoQTEsIFxcLVxcLCBBMiksXG4gICAgICAgICAgICAgICAgICBBbm5vMiA9IGlmX2Vsc2UoQW5ubyA9PSBcXEUtUFxcLCBcXFAtRVxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKEFubm8gPT0gXFxTLVBcXCwgXFxQLVNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmX2Vsc2UoQW5ubyA9PSBcXFgtUFxcLCBcXFAtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKEFubm8gPT0gXFxTLUVcXCwgXFxFLVNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKEFubm8gPT0gXFxYLUVcXCwgXFxFLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmX2Vsc2UoQW5ubyA9PSBcXFgtU1xcLCBcXFMtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vKSkpKSkpLFxuICAgIClcbiAgXG4gIHRlbXAkQW5ubzIgPSBmYWN0b3IodGVtcCRBbm5vMiwgbGV2ZWwgPSBjKFxcWC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1YXFwsIFxcUy1TXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1YXFwsXFxFLVNcXCxcXEUtRVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFAtRVxcLFxcUC1YXFwsIFxcUC1TXFwsIFxcUC1QXFwpKVxuICBcbiAgIyBDaGVja2luZyB0aGUgcHJlY2Vuc2Ugb2Ygc3VwZXIgZW5oYW5jZXJcbiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoQW5ub1NFID0gaWZlbHNlKEExX1doeXRlLlNFIHwgQTJfV2h5dGUuU0UsIFxcU0VcXCwgXFxOT1xcKSlcbiAgdGVtcCRBbm5vU0UgPC0gZmFjdG9yKHRlbXAkQW5ub1NFLCBsZXZlbCA9IGMoXFxTRVxcLCBcXE5PXFwpKVxuICBcbiAgcmV0dXJuKHRlbXApXG59XG5cbmFubm90YXRlTG9vcFByb21vdGVyVFNTIDwtIGZ1bmN0aW9uKGJlZHBlLmFubm8pe1xuICB0ZW1wID0gYmVkcGUuYW5ubyAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKFxuICAgICAgQTEgPSBpZl9lbHNlKChBMV9IM0s0bWUzVFNTKSwgXFxQXFwsIFxcTlxcKSxcbiAgICAgIEEyID0gaWZfZWxzZSgoQTJfSDNLNG1lM1RTUyksIFxcUFxcLCBcXE5cXClcbiAgICApXG4gIHRlbXAgPSB0ZW1wICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoQW5ubyA9IHBhc3RlMChBMSwgXFwtXFwsIEEyKSxcbiAgICAgICAgICAgICAgICAgIEFubm8yID0gaWZfZWxzZShBbm5vID09IFxcTi1QXFwsIFxcUC1OXFwsIEFubm8pKVxuICBcbiAgdGVtcCRBbm5vMiA9IGZhY3Rvcih0ZW1wJEFubm8yLCBsZXZlbCA9IGMoXFxOLU5cXCwgXFxQLU5cXCwgXFxQLVBcXCkpXG4gIFxuICByZXR1cm4odGVtcClcbn1cblxuYW5ub3RhdGVMb29wRW5oYW5jZXIgPC0gZnVuY3Rpb24oYmVkcGUuYW5ubyl7XG4gIHRlbXAgPSBiZWRwZS5hbm5vICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoXG4gICAgICBBMSA9IGlmX2Vsc2UoKEExX0gzSzI3YWMpLCBcXEVcXCwgXFxOXFwpLFxuICAgICAgQTIgPSBpZl9lbHNlKChBMl9IM0syN2FjKSwgXFxFXFwsIFxcTlxcKVxuICAgIClcbiAgdGVtcCA9IHRlbXAgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShBbm5vID0gcGFzdGUwKEExLCBcXC1cXCwgQTIpLFxuICAgICAgICAgICAgICAgICAgQW5ubzIgPSBpZl9lbHNlKEFubm8gPT0gXFxOLUVcXCwgXFxFLU5cXCwgQW5ubykpXG4gIHRlbXAkQW5ubzIgPSBmYWN0b3IodGVtcCRBbm5vMiwgbGV2ZWwgPSBjKFxcTi1OXFwsIFxcRS1OXFwsIFxcRS1FXFwpKVxuICBcbiAgcmV0dXJuKHRlbXApXG59XG5cbmFubm90YXRlTG9vcFN0cnVjdHVyZSA8LSBmdW5jdGlvbihiZWRwZS5hbm5vKXtcbiAgdGVtcCA9IGJlZHBlLmFubm8gJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShcbiAgICAgIEExID0gaWZfZWxzZSgoQTFfQ1RDRnxBMV9SQUQyMSksIFxcU1xcLCBcXE5cXCksXG4gICAgICBBMiA9IGlmX2Vsc2UoKEEyX0NUQ0Z8QTJfUkFEMjEpLCBcXFNcXCwgXFxOXFwpXG4gICAgKVxuICB0ZW1wID0gdGVtcCAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKEFubm8gPSBwYXN0ZTAoQTEsIFxcLVxcLCBBMiksXG4gICAgICAgICAgICAgICAgICBBbm5vMiA9IGlmX2Vsc2UoQW5ubyA9PSBcXE4tU1xcLCBcXFMtTlxcLCBBbm5vKSlcbiAgdGVtcCRBbm5vMiA9IGZhY3Rvcih0ZW1wJEFubm8yLCBsZXZlbCA9IGMoXFxOLU5cXCwgXFxTLU5cXCwgXFxTLVNcXCkpXG4gIHJldHVybih0ZW1wKVxufVxuXG5cbmFubm90YXRlQW5jaG9yVFNTIDwtIGZ1bmN0aW9uKGJlZHBlKXtcbiAgdGIubG9vcCA9IFxuICAgIHNldE92ZXJsYXBDb2x1bW4oXFxXaHl0ZS5TRVxcLFxuICAgICAgICAgICAgICAgICAgICAgc2V0T3ZlcmxhcENvbHVtbihcXENUQ0ZcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3ZlcmxhcENvbHVtbihcXFJBRDIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3ZlcmxhcENvbHVtbihcXEgzSzI3YWNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE92ZXJsYXBDb2x1bW4oXFxIM0s0bWUzVFNTXFwsIGJlZHBlKSkpKSlcbiAgcmV0dXJuKHRiLmxvb3ApXG59XG5cbnNldE92ZXJsYXBDb2x1bW4gPC0gZnVuY3Rpb24ocGVha05hbWUsIGxvb3Ape1xuICB0Yi5sb29wID0gYXNfdGliYmxlKGxvb3ApXG4gIG92ZXJsYXAgPSByZXR1cm5PdmVybGFwSW5kZXhMaXh0KGdldChwYXN0ZTAoXFxwZWFrLlxcLCBwZWFrTmFtZSkpLCB0Yi5sb29wKVxuICB0Yi5sb29wW1twYXN0ZTAoXFxBMV9cXCwgcGVha05hbWUpXV0gPSBGQUxTRVxuICB0Yi5sb29wW1twYXN0ZTAoXFxBMV9cXCwgcGVha05hbWUpXV1bb3ZlcmxhcFtbMV1dXSA9IFRSVUVcbiAgdGIubG9vcFtbcGFzdGUwKFxcQTJfXFwsIHBlYWtOYW1lKV1dID0gRkFMU0VcbiAgdGIubG9vcFtbcGFzdGUwKFxcQTJfXFwsIHBlYWtOYW1lKV1dW292ZXJsYXBbWzJdXV0gPSBUUlVFXG4gIHJldHVybih0Yi5sb29wKVxufVxuXG5yZXR1cm5PdmVybGFwSW5kZXhMaXh0IDwtIGZ1bmN0aW9uKHBlYWssIGxvb3Ape1xuICBhbmNob3IxLnRiID0gYXNfdGliYmxlKGxvb3ApICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxKVxuICBhbmNob3IxID0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGRhdGEuZnJhbWUoXG4gICAgY2hyID0gYW5jaG9yMS50YiRjaHJvbTEsXG4gICAgc3RhcnQgPSBhbmNob3IxLnRiJHN0YXJ0MSxcbiAgICBlbmQgPSBhbmNob3IxLnRiJGVuZDFcbiAgKSlcbiAgXG4gIGFuY2hvcjIudGIgPSBhc190aWJibGUobG9vcCkgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20yLCBzdGFydDIsIGVuZDIpXG4gIGFuY2hvcjIgPSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZGF0YS5mcmFtZShcbiAgICBjaHIgPSBhbmNob3IyLnRiJGNocm9tMixcbiAgICBzdGFydCA9IGFuY2hvcjIudGIkc3RhcnQyLFxuICAgIGVuZCA9IGFuY2hvcjIudGIkZW5kMlxuICApKVxuICBcbiAgb3ZlcmxhcCA9IGxpc3Qob3ZlcmxhcDEgPSB1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IxLCBwZWFrKSkpLFxuICAgICAgICAgICAgICAgICBvdmVybGFwMiA9IHVuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKGFuY2hvcjIsIHBlYWspKSkpXG4gIHJldHVybihvdmVybGFwKVxufVxuXG5zYXZlQW5ub0dyb3VwQmVkcGUgPC0gZnVuY3Rpb24odGVtcCwgYW5uby5saXN0LCBuYW1lLCBhbm5vTmFtZSwgb3VEaXIpe1xuICBsb29wID0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGFubm8ubGlzdCkgJT4lXG4gICAgZHBseXI6OnNlbGVjdChjKFxcY2hyb20xXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocm9tMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCkpXG4gIGZ3cml0ZShsb29wLCBoZXJlKG91dERpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBhbm5vTmFtZSwgXFwuYmVkcGVcXCkpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbn1cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuY3JlYXRlTG9vcEFubm90YXRpb24gPC0gZnVuY3Rpb24oYmVkcGUubG9vcC5hbm5vLCBuYW1lLCBmaWdEaXIsIG91dERpciwgY29sb3JMaXN0KXtcbiAgdGVtcCA9IGJlZHBlLmxvb3AuYW5ubyAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKHNhbXBsZSA9IG5hbWUpXG4gIFxuICBudW0gPSBucm93KHRlbXApXG4gIHA3ID0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2FtcGxlLCBmaWxsID0gQW5ubzIpKSArXG4gICAgZ2VvbV9iYXIoY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9idygpICtcbiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG51bSwgXFwgbG9vcHNcXCksXG4gICAgICAgICB4ID0gXFxcXCwgeSA9IFxcQ291bnRzXFwpICtcbiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWFfZm9ybWF0KCkpICtcbiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSxcbiAgICAgICAgICBhc3BlY3QucmF0aW8gPSA1LFxuICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IFxccmlnaHRcXCxcbiAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uICA9IFxcdmVydGljYWxcXCkgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yTGlzdClcbiAgXG4gIHdpZHRoID0gM1xuICBoZWlnaHQgPSA1XG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsXG4gICAgICAgICAgICAgICBwYXN0ZTAoXFxsb29wQ2xhc3NpZnlfXFwsIG5hbWUsIFxcLnN2Z1xcKSksXG4gICAgICAgICAgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KVxuICBwbG90KHA3KVxuICBpbnZpc2libGUoZGV2Lm9mZigpKVxuICBwbmcoaGVyZShmaWdEaXIsXG4gICAgICAgICAgIHBhc3RlMChcXGxvb3BDbGFzc2lmeV9cXCwgbmFtZSwgXFwucG5nXFwpKSxcbiAgICAgIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodCwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXClcbiAgcGxvdChwNylcbiAgaW52aXNpYmxlKGRldi5vZmYoKSlcbn1cblxuXG5hbm5vdGF0ZUxvb3BSZWxheGVkVFNTIDwtIGZ1bmN0aW9uKGJlZHBlLmFubm8pe1xuICB0ZW1wID0gYmVkcGUuYW5ubyAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKFxuICAgICAgQTEgPSBpZl9lbHNlKChBMV9IM0s0bWUzVFNTKSwgXFxQXFwsIFxuICAgICAgICAgICAgICAgICAgIGlmX2Vsc2UoKEExX0gzSzI3YWMpLCBcXEVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmX2Vsc2UoKEExX0NUQ0Z8QTFfUkFEMjEpLCBcXFNcXCwgXFxYXFwpKSksXG4gICAgICBBMiA9IGlmX2Vsc2UoKEEyX0gzSzRtZTNUU1MpLCBcXFBcXCwgXG4gICAgICAgICAgICAgICAgICAgaWZfZWxzZSgoQTJfSDNLMjdhYyksIFxcRVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZSgoQTJfQ1RDRnxBMl9SQUQyMSksIFxcU1xcLCBcXFhcXCkpKVxuICAgIClcbiAgdGVtcCA9IHRlbXAgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShBbm5vID0gcGFzdGUwKEExLCBcXC1cXCwgQTIpLFxuICAgICAgICAgICAgICAgICAgQW5ubzIgPSBpZl9lbHNlKEFubm8gPT0gXFxFLVBcXCwgXFxQLUVcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZShBbm5vID09IFxcUy1QXFwsIFxcUC1TXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKEFubm8gPT0gXFxYLVBcXCwgXFxQLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZShBbm5vID09IFxcUy1FXFwsIFxcRS1TXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZShBbm5vID09IFxcWC1FXFwsIFxcRS1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKEFubm8gPT0gXFxYLVNcXCwgXFxTLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ubykpKSkpKSxcbiAgICApXG4gIFxuICB0ZW1wJEFubm8yID0gZmFjdG9yKHRlbXAkQW5ubzIsIGxldmVsID0gYyhcXFgtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtWFxcLCBcXFMtU1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtWFxcLFxcRS1TXFwsXFxFLUVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxQLUVcXCxcXFAtWFxcLCBcXFAtU1xcLCBcXFAtUFxcKSlcbiAgXG4gICMgQ2hlY2tpbmcgdGhlIHByZWNlbnNlIG9mIHN1cGVyIGVuaGFuY2VyXG4gIHRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKEFubm9TRSA9IGlmZWxzZShBMV9XaHl0ZS5TRSB8IEEyX1doeXRlLlNFLCBcXFNFXFwsIFxcTk9cXCkpXG4gIHRlbXAkQW5ub1NFIDwtIGZhY3Rvcih0ZW1wJEFubm9TRSwgbGV2ZWwgPSBjKFxcU0VcXCwgXFxOT1xcKSlcbiAgXG4gIHJldHVybih0ZW1wKVxufVxuXG5hbm5vdGF0ZUxvb3BQcm9tb3RlclRTUyA8LSBmdW5jdGlvbihiZWRwZS5hbm5vKXtcbiAgdGVtcCA9IGJlZHBlLmFubm8gJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShcbiAgICAgIEExID0gaWZfZWxzZSgoQTFfSDNLNG1lM1RTUyksIFxcUFxcLCBcXE5cXCksXG4gICAgICBBMiA9IGlmX2Vsc2UoKEEyX0gzSzRtZTNUU1MpLCBcXFBcXCwgXFxOXFwpXG4gICAgKVxuICB0ZW1wID0gdGVtcCAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKEFubm8gPSBwYXN0ZTAoQTEsIFxcLVxcLCBBMiksXG4gICAgICAgICAgICAgICAgICBBbm5vMiA9IGlmX2Vsc2UoQW5ubyA9PSBcXE4tUFxcLCBcXFAtTlxcLCBBbm5vKSlcbiAgXG4gIHRlbXAkQW5ubzIgPSBmYWN0b3IodGVtcCRBbm5vMiwgbGV2ZWwgPSBjKFxcTi1OXFwsIFxcUC1OXFwsIFxcUC1QXFwpKVxuICBcbiAgcmV0dXJuKHRlbXApXG59XG5cbmFubm90YXRlTG9vcEVuaGFuY2VyIDwtIGZ1bmN0aW9uKGJlZHBlLmFubm8pe1xuICB0ZW1wID0gYmVkcGUuYW5ubyAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKFxuICAgICAgQTEgPSBpZl9lbHNlKChBMV9IM0syN2FjKSwgXFxFXFwsIFxcTlxcKSxcbiAgICAgIEEyID0gaWZfZWxzZSgoQTJfSDNLMjdhYyksIFxcRVxcLCBcXE5cXClcbiAgICApXG4gIHRlbXAgPSB0ZW1wICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoQW5ubyA9IHBhc3RlMChBMSwgXFwtXFwsIEEyKSxcbiAgICAgICAgICAgICAgICAgIEFubm8yID0gaWZfZWxzZShBbm5vID09IFxcTi1FXFwsIFxcRS1OXFwsIEFubm8pKVxuICB0ZW1wJEFubm8yID0gZmFjdG9yKHRlbXAkQW5ubzIsIGxldmVsID0gYyhcXE4tTlxcLCBcXEUtTlxcLCBcXEUtRVxcKSlcbiAgXG4gIHJldHVybih0ZW1wKVxufVxuXG5hbm5vdGF0ZUxvb3BTdHJ1Y3R1cmUgPC0gZnVuY3Rpb24oYmVkcGUuYW5ubyl7XG4gIHRlbXAgPSBiZWRwZS5hbm5vICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoXG4gICAgICBBMSA9IGlmX2Vsc2UoKEExX0NUQ0Z8QTFfUkFEMjEpLCBcXFNcXCwgXFxOXFwpLFxuICAgICAgQTIgPSBpZl9lbHNlKChBMl9DVENGfEEyX1JBRDIxKSwgXFxTXFwsIFxcTlxcKVxuICAgIClcbiAgdGVtcCA9IHRlbXAgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShBbm5vID0gcGFzdGUwKEExLCBcXC1cXCwgQTIpLFxuICAgICAgICAgICAgICAgICAgQW5ubzIgPSBpZl9lbHNlKEFubm8gPT0gXFxOLVNcXCwgXFxTLU5cXCwgQW5ubykpXG4gIHRlbXAkQW5ubzIgPSBmYWN0b3IodGVtcCRBbm5vMiwgbGV2ZWwgPSBjKFxcTi1OXFwsIFxcUy1OXFwsIFxcUy1TXFwpKVxuICByZXR1cm4odGVtcClcbn1cblxuXG5hbm5vdGF0ZUFuY2hvclRTUyA8LSBmdW5jdGlvbihiZWRwZSl7XG4gIHRiLmxvb3AgPSBcbiAgICBzZXRPdmVybGFwQ29sdW1uKFxcV2h5dGUuU0VcXCxcbiAgICAgICAgICAgICAgICAgICAgIHNldE92ZXJsYXBDb2x1bW4oXFxDVENGXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE92ZXJsYXBDb2x1bW4oXFxSQUQyMVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE92ZXJsYXBDb2x1bW4oXFxIM0syN2FjXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRPdmVybGFwQ29sdW1uKFxcSDNLNG1lM1RTU1xcLCBiZWRwZSkpKSkpXG4gIHJldHVybih0Yi5sb29wKVxufVxuXG5zZXRPdmVybGFwQ29sdW1uIDwtIGZ1bmN0aW9uKHBlYWtOYW1lLCBsb29wKXtcbiAgdGIubG9vcCA9IGFzX3RpYmJsZShsb29wKVxuICBvdmVybGFwID0gcmV0dXJuT3ZlcmxhcEluZGV4TGl4dChnZXQocGFzdGUwKFxccGVhay5cXCwgcGVha05hbWUpKSwgdGIubG9vcClcbiAgdGIubG9vcFtbcGFzdGUwKFxcQTFfXFwsIHBlYWtOYW1lKV1dID0gRkFMU0VcbiAgdGIubG9vcFtbcGFzdGUwKFxcQTFfXFwsIHBlYWtOYW1lKV1dW292ZXJsYXBbWzFdXV0gPSBUUlVFXG4gIHRiLmxvb3BbW3Bhc3RlMChcXEEyX1xcLCBwZWFrTmFtZSldXSA9IEZBTFNFXG4gIHRiLmxvb3BbW3Bhc3RlMChcXEEyX1xcLCBwZWFrTmFtZSldXVtvdmVybGFwW1syXV1dID0gVFJVRVxuICByZXR1cm4odGIubG9vcClcbn1cblxucmV0dXJuT3ZlcmxhcEluZGV4TGl4dCA8LSBmdW5jdGlvbihwZWFrLCBsb29wKXtcbiAgYW5jaG9yMS50YiA9IGFzX3RpYmJsZShsb29wKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSlcbiAgYW5jaG9yMSA9IG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShkYXRhLmZyYW1lKFxuICAgIGNociA9IGFuY2hvcjEudGIkY2hyb20xLFxuICAgIHN0YXJ0ID0gYW5jaG9yMS50YiRzdGFydDEsXG4gICAgZW5kID0gYW5jaG9yMS50YiRlbmQxXG4gICkpXG4gIFxuICBhbmNob3IyLnRiID0gYXNfdGliYmxlKGxvb3ApICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMiwgc3RhcnQyLCBlbmQyKVxuICBhbmNob3IyID0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGRhdGEuZnJhbWUoXG4gICAgY2hyID0gYW5jaG9yMi50YiRjaHJvbTIsXG4gICAgc3RhcnQgPSBhbmNob3IyLnRiJHN0YXJ0MixcbiAgICBlbmQgPSBhbmNob3IyLnRiJGVuZDJcbiAgKSlcbiAgXG4gIG92ZXJsYXAgPSBsaXN0KG92ZXJsYXAxID0gdW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoYW5jaG9yMSwgcGVhaykpKSxcbiAgICAgICAgICAgICAgICAgb3ZlcmxhcDIgPSB1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IyLCBwZWFrKSkpKVxuICByZXR1cm4ob3ZlcmxhcClcbn1cblxuc2F2ZUFubm9Hcm91cEJlZHBlIDwtIGZ1bmN0aW9uKHRlbXAsIGFubm8ubGlzdCwgbmFtZSwgYW5ub05hbWUsIG91RGlyKXtcbiAgbG9vcCA9IHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBhbm5vLmxpc3QpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwpKVxuICBmd3JpdGUobG9vcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgYW5ub05hbWUsIFxcLmJlZHBlXFwpKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG59XG5gYGBcbmBgYCJ9 -->

```r
```r
createLoopAnnotation <- function(bedpe.loop.anno, name, figDir, outDir, colorList){
  temp = bedpe.loop.anno %>%
    dplyr::mutate(sample = name)
  
  num = nrow(temp)
  p7 = ggplot(temp, aes(x = sample, fill = Anno2)) +
    geom_bar(color = \black\) +
    theme_bw() +
    labs(title = paste0(num, \ loops\),
         x = \\, y = \Counts\) +
    scale_y_continuous(labels = comma_format()) +
    theme(plot.title = element_text(hjust = 0.5),
          aspect.ratio = 5,
          legend.position = \right\,
          legend.direction  = \vertical\) +
    scale_fill_manual(values = colorList)
  
  width = 3
  height = 5
  svglite(here(figDir,
               paste0(\loopClassify_\, name, \.svg\)),
          width = width, height = height)
  plot(p7)
  invisible(dev.off())
  png(here(figDir,
           paste0(\loopClassify_\, name, \.png\)),
      width = width, height = height, res = 600, units = \in\)
  plot(p7)
  invisible(dev.off())
}


annotateLoopRelaxedTSS <- function(bedpe.anno){
  temp = bedpe.anno %>% dplyr::rowwise() %>%
    dplyr::mutate(
      A1 = if_else((A1_H3K4me3TSS), \P\, 
                   if_else((A1_H3K27ac), \E\,
                           if_else((A1_CTCF|A1_RAD21), \S\, \X\))),
      A2 = if_else((A2_H3K4me3TSS), \P\, 
                   if_else((A2_H3K27ac), \E\,
                           if_else((A2_CTCF|A2_RAD21), \S\, \X\)))
    )
  temp = temp %>% dplyr::rowwise() %>%
    dplyr::mutate(Anno = paste0(A1, \-\, A2),
                  Anno2 = if_else(Anno == \E-P\, \P-E\, 
                                  if_else(Anno == \S-P\, \P-S\,
                                          if_else(Anno == \X-P\, \P-X\,
                                                  if_else(Anno == \S-E\, \E-S\,
                                                          if_else(Anno == \X-E\, \E-X\,
                                                                  if_else(Anno == \X-S\, \S-X\,
                                                                          Anno)))))),
    )
  
  temp$Anno2 = factor(temp$Anno2, level = c(\X-X\,
                                            \S-X\, \S-S\,
                                            \E-X\,\E-S\,\E-E\,
                                            \P-E\,\P-X\, \P-S\, \P-P\))
  
  # Checking the precense of super enhancer
  temp <- temp %>% dplyr::rowwise() %>%
    dplyr::mutate(AnnoSE = ifelse(A1_Whyte.SE | A2_Whyte.SE, \SE\, \NO\))
  temp$AnnoSE <- factor(temp$AnnoSE, level = c(\SE\, \NO\))
  
  return(temp)
}

annotateLoopPromoterTSS <- function(bedpe.anno){
  temp = bedpe.anno %>% dplyr::rowwise() %>%
    dplyr::mutate(
      A1 = if_else((A1_H3K4me3TSS), \P\, \N\),
      A2 = if_else((A2_H3K4me3TSS), \P\, \N\)
    )
  temp = temp %>% dplyr::rowwise() %>%
    dplyr::mutate(Anno = paste0(A1, \-\, A2),
                  Anno2 = if_else(Anno == \N-P\, \P-N\, Anno))
  
  temp$Anno2 = factor(temp$Anno2, level = c(\N-N\, \P-N\, \P-P\))
  
  return(temp)
}

annotateLoopEnhancer <- function(bedpe.anno){
  temp = bedpe.anno %>% dplyr::rowwise() %>%
    dplyr::mutate(
      A1 = if_else((A1_H3K27ac), \E\, \N\),
      A2 = if_else((A2_H3K27ac), \E\, \N\)
    )
  temp = temp %>% dplyr::rowwise() %>%
    dplyr::mutate(Anno = paste0(A1, \-\, A2),
                  Anno2 = if_else(Anno == \N-E\, \E-N\, Anno))
  temp$Anno2 = factor(temp$Anno2, level = c(\N-N\, \E-N\, \E-E\))
  
  return(temp)
}

annotateLoopStructure <- function(bedpe.anno){
  temp = bedpe.anno %>% dplyr::rowwise() %>%
    dplyr::mutate(
      A1 = if_else((A1_CTCF|A1_RAD21), \S\, \N\),
      A2 = if_else((A2_CTCF|A2_RAD21), \S\, \N\)
    )
  temp = temp %>% dplyr::rowwise() %>%
    dplyr::mutate(Anno = paste0(A1, \-\, A2),
                  Anno2 = if_else(Anno == \N-S\, \S-N\, Anno))
  temp$Anno2 = factor(temp$Anno2, level = c(\N-N\, \S-N\, \S-S\))
  return(temp)
}


annotateAnchorTSS <- function(bedpe){
  tb.loop = 
    setOverlapColumn(\Whyte.SE\,
                     setOverlapColumn(\CTCF\,
                                      setOverlapColumn(\RAD21\,
                                                       setOverlapColumn(\H3K27ac\,
                                                                        setOverlapColumn(\H3K4me3TSS\, bedpe)))))
  return(tb.loop)
}

setOverlapColumn <- function(peakName, loop){
  tb.loop = as_tibble(loop)
  overlap = returnOverlapIndexLixt(get(paste0(\peak.\, peakName)), tb.loop)
  tb.loop[[paste0(\A1_\, peakName)]] = FALSE
  tb.loop[[paste0(\A1_\, peakName)]][overlap[[1]]] = TRUE
  tb.loop[[paste0(\A2_\, peakName)]] = FALSE
  tb.loop[[paste0(\A2_\, peakName)]][overlap[[2]]] = TRUE
  return(tb.loop)
}

returnOverlapIndexLixt <- function(peak, loop){
  anchor1.tb = as_tibble(loop) %>% dplyr::select(chrom1, start1, end1)
  anchor1 = makeGRangesFromDataFrame(data.frame(
    chr = anchor1.tb$chrom1,
    start = anchor1.tb$start1,
    end = anchor1.tb$end1
  ))
  
  anchor2.tb = as_tibble(loop) %>% dplyr::select(chrom2, start2, end2)
  anchor2 = makeGRangesFromDataFrame(data.frame(
    chr = anchor2.tb$chrom2,
    start = anchor2.tb$start2,
    end = anchor2.tb$end2
  ))
  
  overlap = list(overlap1 = unique(queryHits(findOverlaps(anchor1, peak))),
                 overlap2 = unique(queryHits(findOverlaps(anchor2, peak))))
  return(overlap)
}

saveAnnoGroupBedpe <- function(temp, anno.list, name, annoName, ouDir){
  loop = temp %>% dplyr::filter(Anno2 %in% anno.list) %>%
    dplyr::select(c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\))
  fwrite(loop, here(outDir, paste0(name, \_\, annoName, \.bedpe\)), sep = \\t\, col.names = FALSE)
}
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



### [2.5] Consensus loop annotation

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZMjl1YzJWdWMzVnpMbXh2YjNBdWRHSWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZmMyTnZjbVV1ZEhOMlhDSXBLVnh1WEc0akl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSTF4dUl5QkdhV3gwWlhKcGJtY2dTRE5MTkcxbE15QndaV0ZyY3lCMGFHRjBJR2hoY3lCVVUxTWdibVZoY21KNVhHNGpJRk5wYm1ObElIUm9aU0JtYVc1bGMzUWdjbVZ6YjJ4MWRHbHZiaUJwY3lBMWEySXNJQ3N0TWk0MWEySWdkMmxzYkNCaVpTQjFjMlZrSUdGeklHRWdZM1YwYjJabUlHWnZjaUJqYUdWamEybHVaeUJVVTFNZ2NISmxjMlZ1WTJWY2JtWnNZVzVyVTJsNlpTQThMU0F5TlRBd1hHNW5aVzVsTG5SaUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW0xdE1UQmZSMUpEYlRNNExuQTJYMmRsYm1WZmMyOXlkR1ZrTG1KbFpGd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ZGTlRJRDBnYVdabGJITmxLRlkwSUQwOUlGd2lLMXdpTENCV01pd2dWak1wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSVFUzTjBZWEowSUQwZ1ZGTlRJQzBnWm14aGJtdFRhWHBsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSVFUyVnVaQ0E5SUZSVFV5QXJJR1pzWVc1clUybDZaU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1ZqRXNJRlJUVTNOMFlYSjBMQ0JVVTFObGJtUXBYRzVqYjJ4dVlXMWxjeWhuWlc1bExuUmlLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNibFJUVXpGcllpNW5jaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvWjJWdVpTNTBZaWxjYm5SbGJYQWdQQzBnY0dWaGF5NUlNMHMwYldVelczVnVhWEYxWlNoeGRXVnllVWhwZEhNb1ptbHVaRTkyWlhKc1lYQnpLSEJsWVdzdVNETkxORzFsTXl3Z1ZGTlRNV3RpTG1keUtTa3BYVnh1Wm5keWFYUmxLR0Z6WDNScFltSnNaU2gwWlcxd0tTd2dhR1Z5WlNoeVpXWkVhWElzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndZWE4wWlRBb1hDSXpNekkxTlY5SU0wczBiV1V6WHpBMExUYzBOVjlDY25WalpTMDBYM0JsWVd0ekxtMWxjbWRsVUdWaGF5NWNJaXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWJHRnVhMU5wZW1Vdk1UQXdNQ3dnWENKcllsUlRVeTVpWldSY0lpa3BMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUxDQmpiMnd1Ym1GdFpYTWdQU0JHUVV4VFJTbGNibkJsWVdzdVNETkxORzFsTTFSVFV5QThMU0JwYlhCdmNuUlFaV0ZyS0dobGNtVW9jbVZtUkdseUxDQndZWE4wWlRBb1hDSXpNekkxTlY5SU0wczBiV1V6WHpBMExUYzBOVjlDY25WalpTMDBYM0JsWVd0ekxtMWxjbWRsVUdWaGF5NWNJaXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWJHRnVhMU5wZW1Vdk1UQXdNQ3dnWENKcllsUlRVeTVpWldSY0lpa3BLVnh1SXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU5jYmlNZ1FXNXViM1JoZEdsdVp5QjNhWFJvSUhOMGNtbGpkQ0J3Y21sdmNtbDBlU0FvVUMxVVUxTWdQaUJGSUQ0Z1V5bGNiblJsYlhBdVlXNXVieTVVVTFNZ1BDMGdZVzV1YjNSaGRHVkJibU5vYjNKVVUxTW9ZMjl1YzJWdWMzVnpMbXh2YjNBdWRHSXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQWdJR1JwWm1aZlpGUkJSMTlFVFZOUElEMGdLR1JVUVVjdFJFMVRUeWtzWEc0Z0lDQWdaR2xtWmw5Qk5EZzFYMFJOVTA4Z1BTQW9RVFE0TlMxRVRWTlBLU2xjYmx4dWJtRnRaU0E4TFNCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY0lseHVZMjl1YzJWdWMzVnpMbXh2YjNBdVlXNXVieTUwWWlBOExTQmhibTV2ZEdGMFpVeHZiM0JTWld4aGVHVmtWRk5US0hSbGJYQXVZVzV1Ynk1VVUxTXBYRzVtZDNKcGRHVW9ZMjl1YzJWdWMzVnpMbXh2YjNBdVlXNXVieTUwWWl3Z2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjSWk1MGMzWmNJaWtwTENCY2JpQWdJQ0FnSUNCelpYQWdQU0JjSWx4Y2RGd2lMQ0JqYjJ3dWJtRnRaWE1nUFNCVVVsVkZLVnh1WTNKbFlYUmxURzl2Y0VGdWJtOTBZWFJwYjI0b1kyOXVjMlZ1YzNWekxteHZiM0F1WVc1dWJ5NTBZaXdnYm1GdFpTd2dabWxuUkdseUxDQnZkWFJFYVhJc0lDQmpiMnh2Y2t4cGMzUk1iMjl3S1Z4dWMyRjJaVUZ1Ym05SGNtOTFjRUpsWkhCbEtHTnZibk5sYm5OMWN5NXNiMjl3TG1GdWJtOHVkR0lzSUhWdWFYRjFaU2hqYjI1elpXNXpkWE11Ykc5dmNDNWhibTV2TG5SaUpFRnVibTh5S1NBc0lHNWhiV1VzSUZ3aVlXeHNYQ0lzSUc5MWRFUnBjaWxjYm5OaGRtVkJibTV2UjNKdmRYQkNaV1J3WlNoamIyNXpaVzV6ZFhNdWJHOXZjQzVoYm01dkxuUmlMQ0JqS0Z3aVVDMVFYQ0lzSUZ3aVVDMUZYQ0lzSUZ3aVVDMVRYQ0lzSUZ3aVVDMVlYQ0lzSUZ3aVJTMUZYQ0lzSUZ3aVJTMVRYQ0lzSUZ3aVJTMVlYQ0lwTENCdVlXMWxMQ0JjSW5KbFozVnNZWFJ2Y25sY0lpd2diM1YwUkdseUtWeHVjMkYyWlVGdWJtOUhjbTkxY0VKbFpIQmxLR052Ym5ObGJuTjFjeTVzYjI5d0xtRnVibTh1ZEdJc0lHTW9YQ0pUTFZOY0lpd2dYQ0pUTFZoY0lpa3NJRzVoYldVc0lGd2ljM1J5ZFdOMGRYSmxYQ0lzSUc5MWRFUnBjaWxjYm5OaGRtVkJibTV2UjNKdmRYQkNaV1J3WlNoamIyNXpaVzV6ZFhNdWJHOXZjQzVoYm01dkxuUmlMQ0JqS0Z3aVdDMVlYQ0lwTENCdVlXMWxMQ0JjSW5ndGVGd2lMQ0J2ZFhSRWFYSXBYRzV6WVhabFFXNXViMGR5YjNWd1FtVmtjR1VvWTI5dWMyVnVjM1Z6TG14dmIzQXVZVzV1Ynk1MFlpd2dZeWhjSWxBdFVGd2lMQ0JjSWxBdFJWd2lMQ0JjSWxBdFUxd2lMQ0JjSWxBdFdGd2lLU3dnYm1GdFpTd2dYQ0p3TFc1Y0lpd2diM1YwUkdseUtWeHVjMkYyWlVGdWJtOUhjbTkxY0VKbFpIQmxLR052Ym5ObGJuTjFjeTVzYjI5d0xtRnVibTh1ZEdJc0lHTW9YQ0pRTFZCY0lpd2dYQ0pRTFVWY0lpd2dYQ0pGTFVWY0lpa3NJRzVoYldVc0lGd2ljR1V0Y0dWY0lpd2diM1YwUkdseUtWeHVjMkYyWlVGdWJtOUhjbTkxY0VKbFpIQmxLR052Ym5ObGJuTjFjeTVzYjI5d0xtRnVibTh1ZEdJc0lHTW9YQ0pRTFZCY0lpd2dYQ0pRTFVWY0lpa3NJRzVoYldVc0lGd2ljQzF3WlZ3aUxDQnZkWFJFYVhJcFhHNWNibk5oZG1WQmJtNXZSM0p2ZFhCQ1pXUndaU2hqYjI1elpXNXpkWE11Ykc5dmNDNWhibTV2TG5SaUxDQmpLRndpVUMxUVhDSXBMQ0J1WVcxbExDQmNJbkF0Y0Z3aUxDQnZkWFJFYVhJcFhHNXpZWFpsUVc1dWIwZHliM1Z3UW1Wa2NHVW9ZMjl1YzJWdWMzVnpMbXh2YjNBdVlXNXVieTUwWWl3Z1l5aGNJbEF0UlZ3aUtTd2dibUZ0WlN3Z1hDSndMV1ZjSWl3Z2IzVjBSR2x5S1Z4dWMyRjJaVUZ1Ym05SGNtOTFjRUpsWkhCbEtHTnZibk5sYm5OMWN5NXNiMjl3TG1GdWJtOHVkR0lzSUdNb1hDSlFMVk5jSWlrc0lHNWhiV1VzSUZ3aWNDMXpYQ0lzSUc5MWRFUnBjaWxjYm5OaGRtVkJibTV2UjNKdmRYQkNaV1J3WlNoamIyNXpaVzV6ZFhNdWJHOXZjQzVoYm01dkxuUmlMQ0JqS0Z3aVVDMVlYQ0lwTENCdVlXMWxMQ0JjSW5BdGVGd2lMQ0J2ZFhSRWFYSXBYRzVjYmlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qWEc0aklFRnVibTkwWVhScGJtY2dkMmwwYUNCdmJtVWdiV0Z5YTJWeUlDaFFjbTl0YjNSbGNpbGNibTVoYldVZ1BDMGdYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZVSEp2Ylc5MFpYSmNJbHh1WTI5dWMyVnVjM1Z6TG14dmIzQXVZVzV1Ynk1d2NtOXRiM1JsY2k1MFlpQThMU0JoYm01dmRHRjBaVXh2YjNCUWNtOXRiM1JsY2xSVFV5aDBaVzF3TG1GdWJtOHVWRk5US1Z4dVpuZHlhWFJsS0dOdmJuTmxibk4xY3k1c2IyOXdMbUZ1Ym04dWNISnZiVzkwWlhJdWRHSXNJR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSXVkSE4yWENJcEtTd2dYRzRnSUNBZ0lDQWdjMlZ3SUQwZ1hDSmNYSFJjSWl3Z1kyOXNMbTVoYldWeklEMGdWRkpWUlNsY2JtTnlaV0YwWlV4dmIzQkJibTV2ZEdGMGFXOXVLR052Ym5ObGJuTjFjeTVzYjI5d0xtRnVibTh1Y0hKdmJXOTBaWEl1ZEdJc0lHNWhiV1VzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabWxuUkdseUxDQnZkWFJFYVhJc0lDQmpiMnh2Y2t4cGMzUlFjbTl0YjNSbGNpbGNibk5oZG1WQmJtNXZSM0p2ZFhCQ1pXUndaU2hqYjI1elpXNXpkWE11Ykc5dmNDNWhibTV2TG5CeWIyMXZkR1Z5TG5SaUxDQjFibWx4ZFdVb1kyOXVjMlZ1YzNWekxteHZiM0F1WVc1dWJ5NXdjbTl0YjNSbGNpNTBZaVJCYm01dk1pa2dMQ0J1WVcxbExDQmNJbUZzYkZ3aUxDQnZkWFJFYVhJcElDQmNibk5oZG1WQmJtNXZSM0p2ZFhCQ1pXUndaU2hqYjI1elpXNXpkWE11Ykc5dmNDNWhibTV2TG5CeWIyMXZkR1Z5TG5SaUxDQmpLRndpVUMxUVhDSXBMQ0J1WVcxbExDQmNJbkF0Y0Z3aUxDQnZkWFJFYVhJcFhHNXpZWFpsUVc1dWIwZHliM1Z3UW1Wa2NHVW9ZMjl1YzJWdWMzVnpMbXh2YjNBdVlXNXVieTV3Y205dGIzUmxjaTUwWWl3Z1l5aGNJbEF0VGx3aUtTd2dibUZ0WlN3Z1hDSndMVzVjSWl3Z2IzVjBSR2x5S1Z4dWMyRjJaVUZ1Ym05SGNtOTFjRUpsWkhCbEtHTnZibk5sYm5OMWN5NXNiMjl3TG1GdWJtOHVjSEp2Ylc5MFpYSXVkR0lzSUdNb1hDSk9MVTVjSWlrc0lHNWhiV1VzSUZ3aWJpMXVYQ0lzSUc5MWRFUnBjaWxjYmx4dUl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlOY2JpTWdRVzV1YjNSaGRHbHVaeUIzYVhSb0lHOXVaU0J0WVhKclpYSWdLRVZ1YUdGdVkyVnlLVnh1Ym1GdFpTQThMU0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlGYm1oaGJtTmxjbHdpWEc1amIyNXpaVzV6ZFhNdWJHOXZjQzVoYm01dkxtVnVhR0Z1WTJWeUxuUmlJRHd0SUdGdWJtOTBZWFJsVEc5dmNFVnVhR0Z1WTJWeUtIUmxiWEF1WVc1dWJ5NVVVMU1wWEc1bWQzSnBkR1VvWTI5dWMyVnVjM1Z6TG14dmIzQXVZVzV1Ynk1bGJtaGhibU5sY2k1MFlpd2dhR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lpNTBjM1pjSWlrcExDQmNiaUFnSUNBZ0lDQnpaWEFnUFNCY0lseGNkRndpTENCamIyd3VibUZ0WlhNZ1BTQlVVbFZGS1Z4dVkzSmxZWFJsVEc5dmNFRnVibTkwWVhScGIyNG9ZMjl1YzJWdWMzVnpMbXh2YjNBdVlXNXVieTVsYm1oaGJtTmxjaTUwWWl3Z2JtRnRaU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1hV2RFYVhJc0lHOTFkRVJwY2l3Z0lHTnZiRzl5VEdsemRFVnVhR0Z1WTJWeUtWeHVjMkYyWlVGdWJtOUhjbTkxY0VKbFpIQmxLR052Ym5ObGJuTjFjeTVzYjI5d0xtRnVibTh1Wlc1b1lXNWpaWEl1ZEdJc0lIVnVhWEYxWlNoamIyNXpaVzV6ZFhNdWJHOXZjQzVoYm01dkxtVnVhR0Z1WTJWeUxuUmlKRUZ1Ym04eUtTQXNJRzVoYldVc0lGd2lZV3hzWENJc0lHOTFkRVJwY2lrZ0lGeHVjMkYyWlVGdWJtOUhjbTkxY0VKbFpIQmxLR052Ym5ObGJuTjFjeTVzYjI5d0xtRnVibTh1Wlc1b1lXNWpaWEl1ZEdJc0lHTW9YQ0pGTFVWY0lpa3NJRzVoYldVc0lGd2laUzFsWENJc0lHOTFkRVJwY2lsY2JuTmhkbVZCYm01dlIzSnZkWEJDWldSd1pTaGpiMjV6Wlc1emRYTXViRzl2Y0M1aGJtNXZMbVZ1YUdGdVkyVnlMblJpTENCaktGd2lSUzFPWENJcExDQnVZVzFsTENCY0ltVXRibHdpTENCdmRYUkVhWElwWEc1ellYWmxRVzV1YjBkeWIzVndRbVZrY0dVb1kyOXVjMlZ1YzNWekxteHZiM0F1WVc1dWJ5NWxibWhoYm1ObGNpNTBZaXdnWXloY0lrNHRUbHdpS1N3Z2JtRnRaU3dnWENKdUxXNWNJaXdnYjNWMFJHbHlLVnh1SXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU5jYmlNZ1FXNXViM1JoZEdsdVp5QjNhWFJvSUc5dVpTQnRZWEpyWlhJZ0tGTjBjblZqZEhWeVpTbGNibTVoYldVZ1BDMGdYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZVM1J5ZFdOMGRYSmxYQ0pjYm1OdmJuTmxibk4xY3k1c2IyOXdMbUZ1Ym04dWMzUnlkV04wZFhKbExuUmlJRHd0SUdGdWJtOTBZWFJsVEc5dmNGTjBjblZqZEhWeVpTaDBaVzF3TG1GdWJtOHVWRk5US1Z4dVpuZHlhWFJsS0dOdmJuTmxibk4xY3k1c2IyOXdMbUZ1Ym04dWMzUnlkV04wZFhKbExuUmlMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lMblJ6ZGx3aUtTa3NJRnh1SUNBZ0lDQWdJSE5sY0NBOUlGd2lYRngwWENJc0lHTnZiQzV1WVcxbGN5QTlJRlJTVlVVcFhHNWpjbVZoZEdWTWIyOXdRVzV1YjNSaGRHbHZiaWhqYjI1elpXNXpkWE11Ykc5dmNDNWhibTV2TG5OMGNuVmpkSFZ5WlM1MFlpd2dibUZ0WlN3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtYVdkRWFYSXNJRzkxZEVScGNpd2dJR052Ykc5eVRHbHpkRk4wY25WamRIVnlaU2xjYm5OaGRtVkJibTV2UjNKdmRYQkNaV1J3WlNoamIyNXpaVzV6ZFhNdWJHOXZjQzVoYm01dkxuTjBjblZqZEhWeVpTNTBZaXdnZFc1cGNYVmxLR052Ym5ObGJuTjFjeTVzYjI5d0xtRnVibTh1YzNSeWRXTjBkWEpsTG5SaUpFRnVibTh5S1NBc0lHNWhiV1VzSUZ3aVlXeHNYQ0lzSUc5MWRFUnBjaWtnSUZ4dWMyRjJaVUZ1Ym05SGNtOTFjRUpsWkhCbEtHTnZibk5sYm5OMWN5NXNiMjl3TG1GdWJtOHVjM1J5ZFdOMGRYSmxMblJpTENCaktGd2lVeTFUWENJcExDQnVZVzFsTENCY0luTXRjMXdpTENCdmRYUkVhWElwWEc1ellYWmxRVzV1YjBkeWIzVndRbVZrY0dVb1kyOXVjMlZ1YzNWekxteHZiM0F1WVc1dWJ5NXpkSEoxWTNSMWNtVXVkR0lzSUdNb1hDSlRMVTVjSWlrc0lHNWhiV1VzSUZ3aWN5MXVYQ0lzSUc5MWRFUnBjaWxjYm5OaGRtVkJibTV2UjNKdmRYQkNaV1J3WlNoamIyNXpaVzV6ZFhNdWJHOXZjQzVoYm01dkxuTjBjblZqZEhWeVpTNTBZaXdnWXloY0lrNHRUbHdpS1N3Z2JtRnRaU3dnWENKdUxXNWNJaXdnYjNWMFJHbHlLVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmNvbnNlbnN1cy5sb29wLnRiIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX3Njb3JlLnRzdlxcKSlcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgRmlsdGVyaW5nIEgzSzRtZTMgcGVha3MgdGhhdCBoYXMgVFNTIG5lYXJieVxuIyBTaW5jZSB0aGUgZmluZXN0IHJlc29sdXRpb24gaXMgNWtiLCArLTIuNWtiIHdpbGwgYmUgdXNlZCBhcyBhIGN1dG9mZiBmb3IgY2hlY2tpbmcgVFNTIHByZXNlbmNlXG5mbGFua1NpemUgPC0gMjUwMFxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSxcbiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kKVxuY29sbmFtZXMoZ2VuZS50YikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5UU1Mxa2IuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmUudGIpXG50ZW1wIDwtIHBlYWsuSDNLNG1lM1t1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhwZWFrLkgzSzRtZTMsIFRTUzFrYi5ncikpKV1cbmZ3cml0ZShhc190aWJibGUodGVtcCksIGhlcmUocmVmRGlyLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKFxcMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhbmtTaXplLzEwMDAsIFxca2JUU1MuYmVkXFwpKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5wZWFrLkgzSzRtZTNUU1MgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgcGFzdGUwKFxcMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhbmtTaXplLzEwMDAsIFxca2JUU1MuYmVkXFwpKSlcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIEFubm90YXRpbmcgd2l0aCBzdHJpY3QgcHJpb3JpdHkgKFAtVFNTID4gRSA+IFMpXG50ZW1wLmFubm8uVFNTIDwtIGFubm90YXRlQW5jaG9yVFNTKGNvbnNlbnN1cy5sb29wLnRiKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBkaWZmX2RUQUdfRE1TTyA9IChkVEFHLURNU08pLFxuICAgIGRpZmZfQTQ4NV9ETVNPID0gKEE0ODUtRE1TTykpXG5cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmNvbnNlbnN1cy5sb29wLmFubm8udGIgPC0gYW5ub3RhdGVMb29wUmVsYXhlZFRTUyh0ZW1wLmFubm8uVFNTKVxuZndyaXRlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSwgXG4gICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gVFJVRSlcbmNyZWF0ZUxvb3BBbm5vdGF0aW9uKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIG5hbWUsIGZpZ0Rpciwgb3V0RGlyLCAgY29sb3JMaXN0TG9vcClcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCB1bmlxdWUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiRBbm5vMikgLCBuYW1lLCBcXGFsbFxcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLCBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcKSwgbmFtZSwgXFxyZWd1bGF0b3J5XFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBjKFxcUy1TXFwsIFxcUy1YXFwpLCBuYW1lLCBcXHN0cnVjdHVyZVxcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgYyhcXFgtWFxcKSwgbmFtZSwgXFx4LXhcXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCksIG5hbWUsIFxccC1uXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBuYW1lLCBcXHBlLXBlXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBjKFxcUC1QXFwsIFxcUC1FXFwpLCBuYW1lLCBcXHAtcGVcXCwgb3V0RGlyKVxuXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgYyhcXFAtUFxcKSwgbmFtZSwgXFxwLXBcXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoXFxQLUVcXCksIG5hbWUsIFxccC1lXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBjKFxcUC1TXFwpLCBuYW1lLCBcXHAtc1xcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgYyhcXFAtWFxcKSwgbmFtZSwgXFxwLXhcXCwgb3V0RGlyKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBBbm5vdGF0aW5nIHdpdGggb25lIG1hcmtlciAoUHJvbW90ZXIpXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub1Byb21vdGVyXFxcbmNvbnNlbnN1cy5sb29wLmFubm8ucHJvbW90ZXIudGIgPC0gYW5ub3RhdGVMb29wUHJvbW90ZXJUU1ModGVtcC5hbm5vLlRTUylcbmZ3cml0ZShjb25zZW5zdXMubG9vcC5hbm5vLnByb21vdGVyLnRiLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSksIFxuICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IFRSVUUpXG5jcmVhdGVMb29wQW5ub3RhdGlvbihjb25zZW5zdXMubG9vcC5hbm5vLnByb21vdGVyLnRiLCBuYW1lLCBcbiAgICAgICAgICAgICAgICAgICAgIGZpZ0Rpciwgb3V0RGlyLCAgY29sb3JMaXN0UHJvbW90ZXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5wcm9tb3Rlci50YiwgdW5pcXVlKGNvbnNlbnN1cy5sb29wLmFubm8ucHJvbW90ZXIudGIkQW5ubzIpICwgbmFtZSwgXFxhbGxcXCwgb3V0RGlyKSAgXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5wcm9tb3Rlci50YiwgYyhcXFAtUFxcKSwgbmFtZSwgXFxwLXBcXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8ucHJvbW90ZXIudGIsIGMoXFxQLU5cXCksIG5hbWUsIFxccC1uXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnByb21vdGVyLnRiLCBjKFxcTi1OXFwpLCBuYW1lLCBcXG4tblxcLCBvdXREaXIpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIEFubm90YXRpbmcgd2l0aCBvbmUgbWFya2VyIChFbmhhbmNlcilcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vRW5oYW5jZXJcXFxuY29uc2Vuc3VzLmxvb3AuYW5uby5lbmhhbmNlci50YiA8LSBhbm5vdGF0ZUxvb3BFbmhhbmNlcih0ZW1wLmFubm8uVFNTKVxuZndyaXRlKGNvbnNlbnN1cy5sb29wLmFubm8uZW5oYW5jZXIudGIsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSwgXG4gICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gVFJVRSlcbmNyZWF0ZUxvb3BBbm5vdGF0aW9uKGNvbnNlbnN1cy5sb29wLmFubm8uZW5oYW5jZXIudGIsIG5hbWUsIFxuICAgICAgICAgICAgICAgICAgICAgZmlnRGlyLCBvdXREaXIsICBjb2xvckxpc3RFbmhhbmNlcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLmVuaGFuY2VyLnRiLCB1bmlxdWUoY29uc2Vuc3VzLmxvb3AuYW5uby5lbmhhbmNlci50YiRBbm5vMikgLCBuYW1lLCBcXGFsbFxcLCBvdXREaXIpICBcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLmVuaGFuY2VyLnRiLCBjKFxcRS1FXFwpLCBuYW1lLCBcXGUtZVxcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5lbmhhbmNlci50YiwgYyhcXEUtTlxcKSwgbmFtZSwgXFxlLW5cXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8uZW5oYW5jZXIudGIsIGMoXFxOLU5cXCksIG5hbWUsIFxcbi1uXFwsIG91dERpcilcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIEFubm90YXRpbmcgd2l0aCBvbmUgbWFya2VyIChTdHJ1Y3R1cmUpXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub1N0cnVjdHVyZVxcXG5jb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiA8LSBhbm5vdGF0ZUxvb3BTdHJ1Y3R1cmUodGVtcC5hbm5vLlRTUylcbmZ3cml0ZShjb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpLCBcbiAgICAgICBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBUUlVFKVxuY3JlYXRlTG9vcEFubm90YXRpb24oY29uc2Vuc3VzLmxvb3AuYW5uby5zdHJ1Y3R1cmUudGIsIG5hbWUsIFxuICAgICAgICAgICAgICAgICAgICAgZmlnRGlyLCBvdXREaXIsICBjb2xvckxpc3RTdHJ1Y3R1cmUpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5zdHJ1Y3R1cmUudGIsIHVuaXF1ZShjb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiRBbm5vMikgLCBuYW1lLCBcXGFsbFxcLCBvdXREaXIpICBcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiwgYyhcXFMtU1xcKSwgbmFtZSwgXFxzLXNcXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8uc3RydWN0dXJlLnRiLCBjKFxcUy1OXFwpLCBuYW1lLCBcXHMtblxcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5zdHJ1Y3R1cmUudGIsIGMoXFxOLU5cXCksIG5hbWUsIFxcbi1uXFwsIG91dERpcilcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
consensus.loop.tb <- fread(here(consensusDir, \chromo_cons_score.tsv\))

################################################################################
# Filtering H3K4me3 peaks that has TSS nearby
# Since the finest resolution is 5kb, +-2.5kb will be used as a cutoff for checking TSS presence
flankSize <- 2500
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend)
colnames(gene.tb) <- c(\chr\, \start\, \end\)
TSS1kb.gr <- makeGRangesFromDataFrame(gene.tb)
temp <- peak.H3K4me3[unique(queryHits(findOverlaps(peak.H3K4me3, TSS1kb.gr)))]
fwrite(as_tibble(temp), here(refDir, 
                             paste0(\33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.\, 
                                    flankSize/1000, \kbTSS.bed\)), sep = \\t\, col.names = FALSE)
peak.H3K4me3TSS <- importPeak(here(refDir, paste0(\33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.\, 
                                    flankSize/1000, \kbTSS.bed\)))
################################################################################
# Annotating with strict priority (P-TSS > E > S)
temp.anno.TSS <- annotateAnchorTSS(consensus.loop.tb) %>%
  dplyr::mutate(
    diff_dTAG_DMSO = (dTAG-DMSO),
    diff_A485_DMSO = (A485-DMSO))

name <- \chromo_cons_annoHierarchy\
consensus.loop.anno.tb <- annotateLoopRelaxedTSS(temp.anno.TSS)
fwrite(consensus.loop.anno.tb, here(consensusDir, paste0(name, \.tsv\)), 
       sep = \\t\, col.names = TRUE)
createLoopAnnotation(consensus.loop.anno.tb, name, figDir, outDir,  colorListLoop)
saveAnnoGroupBedpe(consensus.loop.anno.tb, unique(consensus.loop.anno.tb$Anno2) , name, \all\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-P\, \P-E\, \P-S\, \P-X\, \E-E\, \E-S\, \E-X\), name, \regulatory\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\S-S\, \S-X\), name, \structure\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\X-X\), name, \x-x\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-P\, \P-E\, \P-S\, \P-X\), name, \p-n\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-P\, \P-E\, \E-E\), name, \pe-pe\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-P\, \P-E\), name, \p-pe\, outDir)

saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-P\), name, \p-p\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-E\), name, \p-e\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-S\), name, \p-s\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-X\), name, \p-x\, outDir)

################################################################################
# Annotating with one marker (Promoter)
name <- \chromo_cons_annoPromoter\
consensus.loop.anno.promoter.tb <- annotateLoopPromoterTSS(temp.anno.TSS)
fwrite(consensus.loop.anno.promoter.tb, here(consensusDir, paste0(name, \.tsv\)), 
       sep = \\t\, col.names = TRUE)
createLoopAnnotation(consensus.loop.anno.promoter.tb, name, 
                     figDir, outDir,  colorListPromoter)
saveAnnoGroupBedpe(consensus.loop.anno.promoter.tb, unique(consensus.loop.anno.promoter.tb$Anno2) , name, \all\, outDir)  
saveAnnoGroupBedpe(consensus.loop.anno.promoter.tb, c(\P-P\), name, \p-p\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.promoter.tb, c(\P-N\), name, \p-n\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.promoter.tb, c(\N-N\), name, \n-n\, outDir)

################################################################################
# Annotating with one marker (Enhancer)
name <- \chromo_cons_annoEnhancer\
consensus.loop.anno.enhancer.tb <- annotateLoopEnhancer(temp.anno.TSS)
fwrite(consensus.loop.anno.enhancer.tb, here(consensusDir, paste0(name, \.tsv\)), 
       sep = \\t\, col.names = TRUE)
createLoopAnnotation(consensus.loop.anno.enhancer.tb, name, 
                     figDir, outDir,  colorListEnhancer)
saveAnnoGroupBedpe(consensus.loop.anno.enhancer.tb, unique(consensus.loop.anno.enhancer.tb$Anno2) , name, \all\, outDir)  
saveAnnoGroupBedpe(consensus.loop.anno.enhancer.tb, c(\E-E\), name, \e-e\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.enhancer.tb, c(\E-N\), name, \e-n\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.enhancer.tb, c(\N-N\), name, \n-n\, outDir)
################################################################################
# Annotating with one marker (Structure)
name <- \chromo_cons_annoStructure\
consensus.loop.anno.structure.tb <- annotateLoopStructure(temp.anno.TSS)
fwrite(consensus.loop.anno.structure.tb, here(consensusDir, paste0(name, \.tsv\)), 
       sep = \\t\, col.names = TRUE)
createLoopAnnotation(consensus.loop.anno.structure.tb, name, 
                     figDir, outDir,  colorListStructure)
saveAnnoGroupBedpe(consensus.loop.anno.structure.tb, unique(consensus.loop.anno.structure.tb$Anno2) , name, \all\, outDir)  
saveAnnoGroupBedpe(consensus.loop.anno.structure.tb, c(\S-S\), name, \s-s\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.structure.tb, c(\S-N\), name, \s-n\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.structure.tb, c(\N-N\), name, \n-n\, outDir)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVkyOXVjMlZ1YzNWekxteHZiM0F1ZEdJZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mYzJOdmNtVXVkSE4yWEZ3cEtWeHVYRzRqSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJMXh1SXlCR2FXeDBaWEpwYm1jZ1NETkxORzFsTXlCd1pXRnJjeUIwYUdGMElHaGhjeUJVVTFNZ2JtVmhjbUo1WEc0aklGTnBibU5sSUhSb1pTQm1hVzVsYzNRZ2NtVnpiMngxZEdsdmJpQnBjeUExYTJJc0lDc3RNaTQxYTJJZ2QybHNiQ0JpWlNCMWMyVmtJR0Z6SUdFZ1kzVjBiMlptSUdadmNpQmphR1ZqYTJsdVp5QlVVMU1nY0hKbGMyVnVZMlZjYm1ac1lXNXJVMmw2WlNBOExTQXlOVEF3WEc1blpXNWxMblJpSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYRzF0TVRCZlIxSkRiVE00TG5BMlgyZGxibVZmYzI5eWRHVmtMbUpsWkZ4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvVkZOVElEMGdhV1psYkhObEtGWTBJRDA5SUZ4Y0sxeGNMQ0JXTWl3Z1ZqTXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRlJUVTNOMFlYSjBJRDBnVkZOVElDMGdabXhoYm10VGFYcGxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRlJUVTJWdVpDQTlJRlJUVXlBcklHWnNZVzVyVTJsNlpTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvVmpFc0lGUlRVM04wWVhKMExDQlVVMU5sYm1RcFhHNWpiMnh1WVcxbGN5aG5aVzVsTG5SaUtTQThMU0JqS0Z4Y1kyaHlYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWENsY2JsUlRVekZyWWk1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9aMlZ1WlM1MFlpbGNiblJsYlhBZ1BDMGdjR1ZoYXk1SU0wczBiV1V6VzNWdWFYRjFaU2h4ZFdWeWVVaHBkSE1vWm1sdVpFOTJaWEpzWVhCektIQmxZV3N1U0ROTE5HMWxNeXdnVkZOVE1XdGlMbWR5S1NrcFhWeHVabmR5YVhSbEtHRnpYM1JwWW1Kc1pTaDBaVzF3S1N3Z2FHVnlaU2h5WldaRWFYSXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd1lYTjBaVEFvWEZ3ek16STFOVjlJTTBzMGJXVXpYekEwTFRjME5WOUNjblZqWlMwMFgzQmxZV3R6TG0xbGNtZGxVR1ZoYXk1Y1hDd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtYkdGdWExTnBlbVV2TVRBd01Dd2dYRnhyWWxSVFV5NWlaV1JjWENrcExDQnpaWEFnUFNCY1hGeGNkRnhjTENCamIyd3VibUZ0WlhNZ1BTQkdRVXhUUlNsY2JuQmxZV3N1U0ROTE5HMWxNMVJUVXlBOExTQnBiWEJ2Y25SUVpXRnJLR2hsY21Vb2NtVm1SR2x5TENCd1lYTjBaVEFvWEZ3ek16STFOVjlJTTBzMGJXVXpYekEwTFRjME5WOUNjblZqWlMwMFgzQmxZV3R6TG0xbGNtZGxVR1ZoYXk1Y1hDd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtYkdGdWExTnBlbVV2TVRBd01Dd2dYRnhyWWxSVFV5NWlaV1JjWENrcEtWeHVJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TmNiaU1nUVc1dWIzUmhkR2x1WnlCM2FYUm9JSE4wY21samRDQndjbWx2Y21sMGVTQW9VQzFVVTFNZ1BpQkZJRDRnVXlsY2JuUmxiWEF1WVc1dWJ5NVVVMU1nUEMwZ1lXNXViM1JoZEdWQmJtTm9iM0pVVTFNb1kyOXVjMlZ1YzNWekxteHZiM0F1ZEdJcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNBZ0lHUnBabVpmWkZSQlIxOUVUVk5QSUQwZ0tHUlVRVWN0UkUxVFR5a3NYRzRnSUNBZ1pHbG1abDlCTkRnMVgwUk5VMDhnUFNBb1FUUTROUzFFVFZOUEtTbGNibHh1Ym1GdFpTQThMU0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjWEZ4dVkyOXVjMlZ1YzNWekxteHZiM0F1WVc1dWJ5NTBZaUE4TFNCaGJtNXZkR0YwWlV4dmIzQlNaV3hoZUdWa1ZGTlRLSFJsYlhBdVlXNXVieTVVVTFNcFhHNW1kM0pwZEdVb1kyOXVjMlZ1YzNWekxteHZiM0F1WVc1dWJ5NTBZaXdnYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNYQzUwYzNaY1hDa3BMQ0JjYmlBZ0lDQWdJQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0xDQmpiMnd1Ym1GdFpYTWdQU0JVVWxWRktWeHVZM0psWVhSbFRHOXZjRUZ1Ym05MFlYUnBiMjRvWTI5dWMyVnVjM1Z6TG14dmIzQXVZVzV1Ynk1MFlpd2dibUZ0WlN3Z1ptbG5SR2x5TENCdmRYUkVhWElzSUNCamIyeHZja3hwYzNSTWIyOXdLVnh1YzJGMlpVRnVibTlIY205MWNFSmxaSEJsS0dOdmJuTmxibk4xY3k1c2IyOXdMbUZ1Ym04dWRHSXNJSFZ1YVhGMVpTaGpiMjV6Wlc1emRYTXViRzl2Y0M1aGJtNXZMblJpSkVGdWJtOHlLU0FzSUc1aGJXVXNJRnhjWVd4c1hGd3NJRzkxZEVScGNpbGNibk5oZG1WQmJtNXZSM0p2ZFhCQ1pXUndaU2hqYjI1elpXNXpkWE11Ykc5dmNDNWhibTV2TG5SaUxDQmpLRnhjVUMxUVhGd3NJRnhjVUMxRlhGd3NJRnhjVUMxVFhGd3NJRnhjVUMxWVhGd3NJRnhjUlMxRlhGd3NJRnhjUlMxVFhGd3NJRnhjUlMxWVhGd3BMQ0J1WVcxbExDQmNYSEpsWjNWc1lYUnZjbmxjWEN3Z2IzVjBSR2x5S1Z4dWMyRjJaVUZ1Ym05SGNtOTFjRUpsWkhCbEtHTnZibk5sYm5OMWN5NXNiMjl3TG1GdWJtOHVkR0lzSUdNb1hGeFRMVk5jWEN3Z1hGeFRMVmhjWENrc0lHNWhiV1VzSUZ4Y2MzUnlkV04wZFhKbFhGd3NJRzkxZEVScGNpbGNibk5oZG1WQmJtNXZSM0p2ZFhCQ1pXUndaU2hqYjI1elpXNXpkWE11Ykc5dmNDNWhibTV2TG5SaUxDQmpLRnhjV0MxWVhGd3BMQ0J1WVcxbExDQmNYSGd0ZUZ4Y0xDQnZkWFJFYVhJcFhHNXpZWFpsUVc1dWIwZHliM1Z3UW1Wa2NHVW9ZMjl1YzJWdWMzVnpMbXh2YjNBdVlXNXVieTUwWWl3Z1l5aGNYRkF0VUZ4Y0xDQmNYRkF0UlZ4Y0xDQmNYRkF0VTF4Y0xDQmNYRkF0V0Z4Y0tTd2dibUZ0WlN3Z1hGeHdMVzVjWEN3Z2IzVjBSR2x5S1Z4dWMyRjJaVUZ1Ym05SGNtOTFjRUpsWkhCbEtHTnZibk5sYm5OMWN5NXNiMjl3TG1GdWJtOHVkR0lzSUdNb1hGeFFMVkJjWEN3Z1hGeFFMVVZjWEN3Z1hGeEZMVVZjWENrc0lHNWhiV1VzSUZ4Y2NHVXRjR1ZjWEN3Z2IzVjBSR2x5S1Z4dWMyRjJaVUZ1Ym05SGNtOTFjRUpsWkhCbEtHTnZibk5sYm5OMWN5NXNiMjl3TG1GdWJtOHVkR0lzSUdNb1hGeFFMVkJjWEN3Z1hGeFFMVVZjWENrc0lHNWhiV1VzSUZ4Y2NDMXdaVnhjTENCdmRYUkVhWElwWEc1Y2JuTmhkbVZCYm01dlIzSnZkWEJDWldSd1pTaGpiMjV6Wlc1emRYTXViRzl2Y0M1aGJtNXZMblJpTENCaktGeGNVQzFRWEZ3cExDQnVZVzFsTENCY1hIQXRjRnhjTENCdmRYUkVhWElwWEc1ellYWmxRVzV1YjBkeWIzVndRbVZrY0dVb1kyOXVjMlZ1YzNWekxteHZiM0F1WVc1dWJ5NTBZaXdnWXloY1hGQXRSVnhjS1N3Z2JtRnRaU3dnWEZ4d0xXVmNYQ3dnYjNWMFJHbHlLVnh1YzJGMlpVRnVibTlIY205MWNFSmxaSEJsS0dOdmJuTmxibk4xY3k1c2IyOXdMbUZ1Ym04dWRHSXNJR01vWEZ4UUxWTmNYQ2tzSUc1aGJXVXNJRnhjY0MxelhGd3NJRzkxZEVScGNpbGNibk5oZG1WQmJtNXZSM0p2ZFhCQ1pXUndaU2hqYjI1elpXNXpkWE11Ykc5dmNDNWhibTV2TG5SaUxDQmpLRnhjVUMxWVhGd3BMQ0J1WVcxbExDQmNYSEF0ZUZ4Y0xDQnZkWFJFYVhJcFhHNWNiaU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpYRzRqSUVGdWJtOTBZWFJwYm1jZ2QybDBhQ0J2Ym1VZ2JXRnlhMlZ5SUNoUWNtOXRiM1JsY2lsY2JtNWhiV1VnUEMwZ1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlVISnZiVzkwWlhKY1hGeHVZMjl1YzJWdWMzVnpMbXh2YjNBdVlXNXVieTV3Y205dGIzUmxjaTUwWWlBOExTQmhibTV2ZEdGMFpVeHZiM0JRY205dGIzUmxjbFJUVXloMFpXMXdMbUZ1Ym04dVZGTlRLVnh1Wm5keWFYUmxLR052Ym5ObGJuTjFjeTVzYjI5d0xtRnVibTh1Y0hKdmJXOTBaWEl1ZEdJc0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ3dWRITjJYRndwS1N3Z1hHNGdJQ0FnSUNBZ2MyVndJRDBnWEZ4Y1hIUmNYQ3dnWTI5c0xtNWhiV1Z6SUQwZ1ZGSlZSU2xjYm1OeVpXRjBaVXh2YjNCQmJtNXZkR0YwYVc5dUtHTnZibk5sYm5OMWN5NXNiMjl3TG1GdWJtOHVjSEp2Ylc5MFpYSXVkR0lzSUc1aGJXVXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptbG5SR2x5TENCdmRYUkVhWElzSUNCamIyeHZja3hwYzNSUWNtOXRiM1JsY2lsY2JuTmhkbVZCYm01dlIzSnZkWEJDWldSd1pTaGpiMjV6Wlc1emRYTXViRzl2Y0M1aGJtNXZMbkJ5YjIxdmRHVnlMblJpTENCMWJtbHhkV1VvWTI5dWMyVnVjM1Z6TG14dmIzQXVZVzV1Ynk1d2NtOXRiM1JsY2k1MFlpUkJibTV2TWlrZ0xDQnVZVzFsTENCY1hHRnNiRnhjTENCdmRYUkVhWElwSUNCY2JuTmhkbVZCYm01dlIzSnZkWEJDWldSd1pTaGpiMjV6Wlc1emRYTXViRzl2Y0M1aGJtNXZMbkJ5YjIxdmRHVnlMblJpTENCaktGeGNVQzFRWEZ3cExDQnVZVzFsTENCY1hIQXRjRnhjTENCdmRYUkVhWElwWEc1ellYWmxRVzV1YjBkeWIzVndRbVZrY0dVb1kyOXVjMlZ1YzNWekxteHZiM0F1WVc1dWJ5NXdjbTl0YjNSbGNpNTBZaXdnWXloY1hGQXRUbHhjS1N3Z2JtRnRaU3dnWEZ4d0xXNWNYQ3dnYjNWMFJHbHlLVnh1YzJGMlpVRnVibTlIY205MWNFSmxaSEJsS0dOdmJuTmxibk4xY3k1c2IyOXdMbUZ1Ym04dWNISnZiVzkwWlhJdWRHSXNJR01vWEZ4T0xVNWNYQ2tzSUc1aGJXVXNJRnhjYmkxdVhGd3NJRzkxZEVScGNpbGNibHh1SXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU5jYmlNZ1FXNXViM1JoZEdsdVp5QjNhWFJvSUc5dVpTQnRZWEpyWlhJZ0tFVnVhR0Z1WTJWeUtWeHVibUZ0WlNBOExTQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUZibWhoYm1ObGNseGNYRzVqYjI1elpXNXpkWE11Ykc5dmNDNWhibTV2TG1WdWFHRnVZMlZ5TG5SaUlEd3RJR0Z1Ym05MFlYUmxURzl2Y0VWdWFHRnVZMlZ5S0hSbGJYQXVZVzV1Ynk1VVUxTXBYRzVtZDNKcGRHVW9ZMjl1YzJWdWMzVnpMbXh2YjNBdVlXNXVieTVsYm1oaGJtTmxjaTUwWWl3Z2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEM1MGMzWmNYQ2twTENCY2JpQWdJQ0FnSUNCelpYQWdQU0JjWEZ4Y2RGeGNMQ0JqYjJ3dWJtRnRaWE1nUFNCVVVsVkZLVnh1WTNKbFlYUmxURzl2Y0VGdWJtOTBZWFJwYjI0b1kyOXVjMlZ1YzNWekxteHZiM0F1WVc1dWJ5NWxibWhoYm1ObGNpNTBZaXdnYm1GdFpTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWFXZEVhWElzSUc5MWRFUnBjaXdnSUdOdmJHOXlUR2x6ZEVWdWFHRnVZMlZ5S1Z4dWMyRjJaVUZ1Ym05SGNtOTFjRUpsWkhCbEtHTnZibk5sYm5OMWN5NXNiMjl3TG1GdWJtOHVaVzVvWVc1alpYSXVkR0lzSUhWdWFYRjFaU2hqYjI1elpXNXpkWE11Ykc5dmNDNWhibTV2TG1WdWFHRnVZMlZ5TG5SaUpFRnVibTh5S1NBc0lHNWhiV1VzSUZ4Y1lXeHNYRndzSUc5MWRFUnBjaWtnSUZ4dWMyRjJaVUZ1Ym05SGNtOTFjRUpsWkhCbEtHTnZibk5sYm5OMWN5NXNiMjl3TG1GdWJtOHVaVzVvWVc1alpYSXVkR0lzSUdNb1hGeEZMVVZjWENrc0lHNWhiV1VzSUZ4Y1pTMWxYRndzSUc5MWRFUnBjaWxjYm5OaGRtVkJibTV2UjNKdmRYQkNaV1J3WlNoamIyNXpaVzV6ZFhNdWJHOXZjQzVoYm01dkxtVnVhR0Z1WTJWeUxuUmlMQ0JqS0Z4Y1JTMU9YRndwTENCdVlXMWxMQ0JjWEdVdGJseGNMQ0J2ZFhSRWFYSXBYRzV6WVhabFFXNXViMGR5YjNWd1FtVmtjR1VvWTI5dWMyVnVjM1Z6TG14dmIzQXVZVzV1Ynk1bGJtaGhibU5sY2k1MFlpd2dZeWhjWEU0dFRseGNLU3dnYm1GdFpTd2dYRnh1TFc1Y1hDd2diM1YwUkdseUtWeHVJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TmNiaU1nUVc1dWIzUmhkR2x1WnlCM2FYUm9JRzl1WlNCdFlYSnJaWElnS0ZOMGNuVmpkSFZ5WlNsY2JtNWhiV1VnUEMwZ1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlUzUnlkV04wZFhKbFhGeGNibU52Ym5ObGJuTjFjeTVzYjI5d0xtRnVibTh1YzNSeWRXTjBkWEpsTG5SaUlEd3RJR0Z1Ym05MFlYUmxURzl2Y0ZOMGNuVmpkSFZ5WlNoMFpXMXdMbUZ1Ym04dVZGTlRLVnh1Wm5keWFYUmxLR052Ym5ObGJuTjFjeTVzYjI5d0xtRnVibTh1YzNSeWRXTjBkWEpsTG5SaUxDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y0xuUnpkbHhjS1Nrc0lGeHVJQ0FnSUNBZ0lITmxjQ0E5SUZ4Y1hGeDBYRndzSUdOdmJDNXVZVzFsY3lBOUlGUlNWVVVwWEc1amNtVmhkR1ZNYjI5d1FXNXViM1JoZEdsdmJpaGpiMjV6Wlc1emRYTXViRzl2Y0M1aGJtNXZMbk4wY25WamRIVnlaUzUwWWl3Z2JtRnRaU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1hV2RFYVhJc0lHOTFkRVJwY2l3Z0lHTnZiRzl5VEdsemRGTjBjblZqZEhWeVpTbGNibk5oZG1WQmJtNXZSM0p2ZFhCQ1pXUndaU2hqYjI1elpXNXpkWE11Ykc5dmNDNWhibTV2TG5OMGNuVmpkSFZ5WlM1MFlpd2dkVzVwY1hWbEtHTnZibk5sYm5OMWN5NXNiMjl3TG1GdWJtOHVjM1J5ZFdOMGRYSmxMblJpSkVGdWJtOHlLU0FzSUc1aGJXVXNJRnhjWVd4c1hGd3NJRzkxZEVScGNpa2dJRnh1YzJGMlpVRnVibTlIY205MWNFSmxaSEJsS0dOdmJuTmxibk4xY3k1c2IyOXdMbUZ1Ym04dWMzUnlkV04wZFhKbExuUmlMQ0JqS0Z4Y1V5MVRYRndwTENCdVlXMWxMQ0JjWEhNdGMxeGNMQ0J2ZFhSRWFYSXBYRzV6WVhabFFXNXViMGR5YjNWd1FtVmtjR1VvWTI5dWMyVnVjM1Z6TG14dmIzQXVZVzV1Ynk1emRISjFZM1IxY21VdWRHSXNJR01vWEZ4VExVNWNYQ2tzSUc1aGJXVXNJRnhjY3kxdVhGd3NJRzkxZEVScGNpbGNibk5oZG1WQmJtNXZSM0p2ZFhCQ1pXUndaU2hqYjI1elpXNXpkWE11Ykc5dmNDNWhibTV2TG5OMGNuVmpkSFZ5WlM1MFlpd2dZeWhjWEU0dFRseGNLU3dnYm1GdFpTd2dYRnh1TFc1Y1hDd2diM1YwUkdseUtWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG5jb25zZW5zdXMubG9vcC50YiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZS50c3ZcXCkpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIEZpbHRlcmluZyBIM0s0bWUzIHBlYWtzIHRoYXQgaGFzIFRTUyBuZWFyYnlcbiMgU2luY2UgdGhlIGZpbmVzdCByZXNvbHV0aW9uIGlzIDVrYiwgKy0yLjVrYiB3aWxsIGJlIHVzZWQgYXMgYSBjdXRvZmYgZm9yIGNoZWNraW5nIFRTUyBwcmVzZW5jZVxuZmxhbmtTaXplIDwtIDI1MDBcbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMyksXG4gICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsXG4gICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZClcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuVFNTMWtiLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShnZW5lLnRiKVxudGVtcCA8LSBwZWFrLkgzSzRtZTNbdW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMocGVhay5IM0s0bWUzLCBUU1Mxa2IuZ3IpKSldXG5md3JpdGUoYXNfdGliYmxlKHRlbXApLCBoZXJlKHJlZkRpciwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMChcXDMzMjU1X0gzSzRtZTNfMDQtNzQ1X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLlxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYW5rU2l6ZS8xMDAwLCBcXGtiVFNTLmJlZFxcKSksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxucGVhay5IM0s0bWUzVFNTIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIHBhc3RlMChcXDMzMjU1X0gzSzRtZTNfMDQtNzQ1X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLlxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYW5rU2l6ZS8xMDAwLCBcXGtiVFNTLmJlZFxcKSkpXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBBbm5vdGF0aW5nIHdpdGggc3RyaWN0IHByaW9yaXR5IChQLVRTUyA+IEUgPiBTKVxudGVtcC5hbm5vLlRTUyA8LSBhbm5vdGF0ZUFuY2hvclRTUyhjb25zZW5zdXMubG9vcC50YikgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZGlmZl9kVEFHX0RNU08gPSAoZFRBRy1ETVNPKSxcbiAgICBkaWZmX0E0ODVfRE1TTyA9IChBNDg1LURNU08pKVxuXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5jb25zZW5zdXMubG9vcC5hbm5vLnRiIDwtIGFubm90YXRlTG9vcFJlbGF4ZWRUU1ModGVtcC5hbm5vLlRTUylcbmZ3cml0ZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSksIFxuICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IFRSVUUpXG5jcmVhdGVMb29wQW5ub3RhdGlvbihjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBuYW1lLCBmaWdEaXIsIG91dERpciwgIGNvbG9yTGlzdExvb3ApXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgdW5pcXVlKGNvbnNlbnN1cy5sb29wLmFubm8udGIkQW5ubzIpICwgbmFtZSwgXFxhbGxcXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCwgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCksIG5hbWUsIFxccmVndWxhdG9yeVxcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgYyhcXFMtU1xcLCBcXFMtWFxcKSwgbmFtZSwgXFxzdHJ1Y3R1cmVcXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoXFxYLVhcXCksIG5hbWUsIFxceC14XFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpLCBuYW1lLCBcXHAtblxcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSwgbmFtZSwgXFxwZS1wZVxcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgYyhcXFAtUFxcLCBcXFAtRVxcKSwgbmFtZSwgXFxwLXBlXFwsIG91dERpcilcblxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoXFxQLVBcXCksIG5hbWUsIFxccC1wXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBjKFxcUC1FXFwpLCBuYW1lLCBcXHAtZVxcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgYyhcXFAtU1xcKSwgbmFtZSwgXFxwLXNcXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoXFxQLVhcXCksIG5hbWUsIFxccC14XFwsIG91dERpcilcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgQW5ub3RhdGluZyB3aXRoIG9uZSBtYXJrZXIgKFByb21vdGVyKVxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9Qcm9tb3RlclxcXG5jb25zZW5zdXMubG9vcC5hbm5vLnByb21vdGVyLnRiIDwtIGFubm90YXRlTG9vcFByb21vdGVyVFNTKHRlbXAuYW5uby5UU1MpXG5md3JpdGUoY29uc2Vuc3VzLmxvb3AuYW5uby5wcm9tb3Rlci50YiwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpLCBcbiAgICAgICBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBUUlVFKVxuY3JlYXRlTG9vcEFubm90YXRpb24oY29uc2Vuc3VzLmxvb3AuYW5uby5wcm9tb3Rlci50YiwgbmFtZSwgXG4gICAgICAgICAgICAgICAgICAgICBmaWdEaXIsIG91dERpciwgIGNvbG9yTGlzdFByb21vdGVyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8ucHJvbW90ZXIudGIsIHVuaXF1ZShjb25zZW5zdXMubG9vcC5hbm5vLnByb21vdGVyLnRiJEFubm8yKSAsIG5hbWUsIFxcYWxsXFwsIG91dERpcikgIFxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8ucHJvbW90ZXIudGIsIGMoXFxQLVBcXCksIG5hbWUsIFxccC1wXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnByb21vdGVyLnRiLCBjKFxcUC1OXFwpLCBuYW1lLCBcXHAtblxcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5wcm9tb3Rlci50YiwgYyhcXE4tTlxcKSwgbmFtZSwgXFxuLW5cXCwgb3V0RGlyKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBBbm5vdGF0aW5nIHdpdGggb25lIG1hcmtlciAoRW5oYW5jZXIpXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0VuaGFuY2VyXFxcbmNvbnNlbnN1cy5sb29wLmFubm8uZW5oYW5jZXIudGIgPC0gYW5ub3RhdGVMb29wRW5oYW5jZXIodGVtcC5hbm5vLlRTUylcbmZ3cml0ZShjb25zZW5zdXMubG9vcC5hbm5vLmVuaGFuY2VyLnRiLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSksIFxuICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IFRSVUUpXG5jcmVhdGVMb29wQW5ub3RhdGlvbihjb25zZW5zdXMubG9vcC5hbm5vLmVuaGFuY2VyLnRiLCBuYW1lLCBcbiAgICAgICAgICAgICAgICAgICAgIGZpZ0Rpciwgb3V0RGlyLCAgY29sb3JMaXN0RW5oYW5jZXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5lbmhhbmNlci50YiwgdW5pcXVlKGNvbnNlbnN1cy5sb29wLmFubm8uZW5oYW5jZXIudGIkQW5ubzIpICwgbmFtZSwgXFxhbGxcXCwgb3V0RGlyKSAgXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5lbmhhbmNlci50YiwgYyhcXEUtRVxcKSwgbmFtZSwgXFxlLWVcXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8uZW5oYW5jZXIudGIsIGMoXFxFLU5cXCksIG5hbWUsIFxcZS1uXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLmVuaGFuY2VyLnRiLCBjKFxcTi1OXFwpLCBuYW1lLCBcXG4tblxcLCBvdXREaXIpXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBBbm5vdGF0aW5nIHdpdGggb25lIG1hcmtlciAoU3RydWN0dXJlKVxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9TdHJ1Y3R1cmVcXFxuY29uc2Vuc3VzLmxvb3AuYW5uby5zdHJ1Y3R1cmUudGIgPC0gYW5ub3RhdGVMb29wU3RydWN0dXJlKHRlbXAuYW5uby5UU1MpXG5md3JpdGUoY29uc2Vuc3VzLmxvb3AuYW5uby5zdHJ1Y3R1cmUudGIsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSwgXG4gICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gVFJVRSlcbmNyZWF0ZUxvb3BBbm5vdGF0aW9uKGNvbnNlbnN1cy5sb29wLmFubm8uc3RydWN0dXJlLnRiLCBuYW1lLCBcbiAgICAgICAgICAgICAgICAgICAgIGZpZ0Rpciwgb3V0RGlyLCAgY29sb3JMaXN0U3RydWN0dXJlKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8uc3RydWN0dXJlLnRiLCB1bmlxdWUoY29uc2Vuc3VzLmxvb3AuYW5uby5zdHJ1Y3R1cmUudGIkQW5ubzIpICwgbmFtZSwgXFxhbGxcXCwgb3V0RGlyKSAgXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5zdHJ1Y3R1cmUudGIsIGMoXFxTLVNcXCksIG5hbWUsIFxccy1zXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiwgYyhcXFMtTlxcKSwgbmFtZSwgXFxzLW5cXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8uc3RydWN0dXJlLnRiLCBjKFxcTi1OXFwpLCBuYW1lLCBcXG4tblxcLCBvdXREaXIpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuY29uc2Vuc3VzLmxvb3AudGIgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBGaWx0ZXJpbmcgSDNLNG1lMyBwZWFrcyB0aGF0IGhhcyBUU1MgbmVhcmJ5XG4jIFNpbmNlIHRoZSBmaW5lc3QgcmVzb2x1dGlvbiBpcyA1a2IsICstMi41a2Igd2lsbCBiZSB1c2VkIGFzIGEgY3V0b2ZmIGZvciBjaGVja2luZyBUU1MgcHJlc2VuY2VcbmZsYW5rU2l6ZSA8LSAyNTAwXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLFxuICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLFxuICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcblRTUzFrYi5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS50YilcbnRlbXAgPC0gcGVhay5IM0s0bWUzW3VuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKHBlYWsuSDNLNG1lMywgVFNTMWtiLmdyKSkpXVxuZndyaXRlKGFzX3RpYmJsZSh0ZW1wKSwgaGVyZShyZWZEaXIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoXFwzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFua1NpemUvMTAwMCwgXFxrYlRTUy5iZWRcXCkpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbnBlYWsuSDNLNG1lM1RTUyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBwYXN0ZTAoXFwzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFua1NpemUvMTAwMCwgXFxrYlRTUy5iZWRcXCkpKVxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgQW5ub3RhdGluZyB3aXRoIHN0cmljdCBwcmlvcml0eSAoUC1UU1MgPiBFID4gUylcbnRlbXAuYW5uby5UU1MgPC0gYW5ub3RhdGVBbmNob3JUU1MoY29uc2Vuc3VzLmxvb3AudGIpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGRpZmZfZFRBR19ETVNPID0gKGRUQUctRE1TTyksXG4gICAgZGlmZl9BNDg1X0RNU08gPSAoQTQ4NS1ETVNPKSlcblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuY29uc2Vuc3VzLmxvb3AuYW5uby50YiA8LSBhbm5vdGF0ZUxvb3BSZWxheGVkVFNTKHRlbXAuYW5uby5UU1MpXG5md3JpdGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpLCBcbiAgICAgICBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBUUlVFKVxuY3JlYXRlTG9vcEFubm90YXRpb24oY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgbmFtZSwgZmlnRGlyLCBvdXREaXIsICBjb2xvckxpc3RMb29wKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIHVuaXF1ZShjb25zZW5zdXMubG9vcC5hbm5vLnRiJEFubm8yKSAsIG5hbWUsIFxcYWxsXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwpLCBuYW1lLCBcXHJlZ3VsYXRvcnlcXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoXFxTLVNcXCwgXFxTLVhcXCksIG5hbWUsIFxcc3RydWN0dXJlXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBjKFxcWC1YXFwpLCBuYW1lLCBcXHgteFxcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSwgbmFtZSwgXFxwLW5cXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIG5hbWUsIFxccGUtcGVcXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoXFxQLVBcXCwgXFxQLUVcXCksIG5hbWUsIFxccC1wZVxcLCBvdXREaXIpXG5cbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBjKFxcUC1QXFwpLCBuYW1lLCBcXHAtcFxcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgYyhcXFAtRVxcKSwgbmFtZSwgXFxwLWVcXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoXFxQLVNcXCksIG5hbWUsIFxccC1zXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBjKFxcUC1YXFwpLCBuYW1lLCBcXHAteFxcLCBvdXREaXIpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIEFubm90YXRpbmcgd2l0aCBvbmUgbWFya2VyIChQcm9tb3Rlcilcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vUHJvbW90ZXJcXFxuY29uc2Vuc3VzLmxvb3AuYW5uby5wcm9tb3Rlci50YiA8LSBhbm5vdGF0ZUxvb3BQcm9tb3RlclRTUyh0ZW1wLmFubm8uVFNTKVxuZndyaXRlKGNvbnNlbnN1cy5sb29wLmFubm8ucHJvbW90ZXIudGIsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSwgXG4gICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gVFJVRSlcbmNyZWF0ZUxvb3BBbm5vdGF0aW9uKGNvbnNlbnN1cy5sb29wLmFubm8ucHJvbW90ZXIudGIsIG5hbWUsIFxuICAgICAgICAgICAgICAgICAgICAgZmlnRGlyLCBvdXREaXIsICBjb2xvckxpc3RQcm9tb3RlcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnByb21vdGVyLnRiLCB1bmlxdWUoY29uc2Vuc3VzLmxvb3AuYW5uby5wcm9tb3Rlci50YiRBbm5vMikgLCBuYW1lLCBcXGFsbFxcLCBvdXREaXIpICBcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnByb21vdGVyLnRiLCBjKFxcUC1QXFwpLCBuYW1lLCBcXHAtcFxcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5wcm9tb3Rlci50YiwgYyhcXFAtTlxcKSwgbmFtZSwgXFxwLW5cXCwgb3V0RGlyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8ucHJvbW90ZXIudGIsIGMoXFxOLU5cXCksIG5hbWUsIFxcbi1uXFwsIG91dERpcilcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgQW5ub3RhdGluZyB3aXRoIG9uZSBtYXJrZXIgKEVuaGFuY2VyKVxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9FbmhhbmNlclxcXG5jb25zZW5zdXMubG9vcC5hbm5vLmVuaGFuY2VyLnRiIDwtIGFubm90YXRlTG9vcEVuaGFuY2VyKHRlbXAuYW5uby5UU1MpXG5md3JpdGUoY29uc2Vuc3VzLmxvb3AuYW5uby5lbmhhbmNlci50YiwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpLCBcbiAgICAgICBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBUUlVFKVxuY3JlYXRlTG9vcEFubm90YXRpb24oY29uc2Vuc3VzLmxvb3AuYW5uby5lbmhhbmNlci50YiwgbmFtZSwgXG4gICAgICAgICAgICAgICAgICAgICBmaWdEaXIsIG91dERpciwgIGNvbG9yTGlzdEVuaGFuY2VyKVxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8uZW5oYW5jZXIudGIsIHVuaXF1ZShjb25zZW5zdXMubG9vcC5hbm5vLmVuaGFuY2VyLnRiJEFubm8yKSAsIG5hbWUsIFxcYWxsXFwsIG91dERpcikgIFxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8uZW5oYW5jZXIudGIsIGMoXFxFLUVcXCksIG5hbWUsIFxcZS1lXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLmVuaGFuY2VyLnRiLCBjKFxcRS1OXFwpLCBuYW1lLCBcXGUtblxcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5lbmhhbmNlci50YiwgYyhcXE4tTlxcKSwgbmFtZSwgXFxuLW5cXCwgb3V0RGlyKVxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgQW5ub3RhdGluZyB3aXRoIG9uZSBtYXJrZXIgKFN0cnVjdHVyZSlcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vU3RydWN0dXJlXFxcbmNvbnNlbnN1cy5sb29wLmFubm8uc3RydWN0dXJlLnRiIDwtIGFubm90YXRlTG9vcFN0cnVjdHVyZSh0ZW1wLmFubm8uVFNTKVxuZndyaXRlKGNvbnNlbnN1cy5sb29wLmFubm8uc3RydWN0dXJlLnRiLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSksIFxuICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IFRSVUUpXG5jcmVhdGVMb29wQW5ub3RhdGlvbihjb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiwgbmFtZSwgXG4gICAgICAgICAgICAgICAgICAgICBmaWdEaXIsIG91dERpciwgIGNvbG9yTGlzdFN0cnVjdHVyZSlcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiwgdW5pcXVlKGNvbnNlbnN1cy5sb29wLmFubm8uc3RydWN0dXJlLnRiJEFubm8yKSAsIG5hbWUsIFxcYWxsXFwsIG91dERpcikgIFxuc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8uc3RydWN0dXJlLnRiLCBjKFxcUy1TXFwpLCBuYW1lLCBcXHMtc1xcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5zdHJ1Y3R1cmUudGIsIGMoXFxTLU5cXCksIG5hbWUsIFxccy1uXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiwgYyhcXE4tTlxcKSwgbmFtZSwgXFxuLW5cXCwgb3V0RGlyKVxuYGBgXG5gYGAifQ== -->

```r
```r
consensus.loop.tb <- fread(here(consensusDir, \chromo_cons_score.tsv\))

################################################################################
# Filtering H3K4me3 peaks that has TSS nearby
# Since the finest resolution is 5kb, +-2.5kb will be used as a cutoff for checking TSS presence
flankSize <- 2500
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend)
colnames(gene.tb) <- c(\chr\, \start\, \end\)
TSS1kb.gr <- makeGRangesFromDataFrame(gene.tb)
temp <- peak.H3K4me3[unique(queryHits(findOverlaps(peak.H3K4me3, TSS1kb.gr)))]
fwrite(as_tibble(temp), here(refDir, 
                             paste0(\33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.\, 
                                    flankSize/1000, \kbTSS.bed\)), sep = \\t\, col.names = FALSE)
peak.H3K4me3TSS <- importPeak(here(refDir, paste0(\33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.\, 
                                    flankSize/1000, \kbTSS.bed\)))
################################################################################
# Annotating with strict priority (P-TSS > E > S)
temp.anno.TSS <- annotateAnchorTSS(consensus.loop.tb) %>%
  dplyr::mutate(
    diff_dTAG_DMSO = (dTAG-DMSO),
    diff_A485_DMSO = (A485-DMSO))

name <- \chromo_cons_annoHierarchy\
consensus.loop.anno.tb <- annotateLoopRelaxedTSS(temp.anno.TSS)
fwrite(consensus.loop.anno.tb, here(consensusDir, paste0(name, \.tsv\)), 
       sep = \\t\, col.names = TRUE)
createLoopAnnotation(consensus.loop.anno.tb, name, figDir, outDir,  colorListLoop)
saveAnnoGroupBedpe(consensus.loop.anno.tb, unique(consensus.loop.anno.tb$Anno2) , name, \all\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-P\, \P-E\, \P-S\, \P-X\, \E-E\, \E-S\, \E-X\), name, \regulatory\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\S-S\, \S-X\), name, \structure\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\X-X\), name, \x-x\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-P\, \P-E\, \P-S\, \P-X\), name, \p-n\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-P\, \P-E\, \E-E\), name, \pe-pe\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-P\, \P-E\), name, \p-pe\, outDir)

saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-P\), name, \p-p\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-E\), name, \p-e\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-S\), name, \p-s\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.tb, c(\P-X\), name, \p-x\, outDir)

################################################################################
# Annotating with one marker (Promoter)
name <- \chromo_cons_annoPromoter\
consensus.loop.anno.promoter.tb <- annotateLoopPromoterTSS(temp.anno.TSS)
fwrite(consensus.loop.anno.promoter.tb, here(consensusDir, paste0(name, \.tsv\)), 
       sep = \\t\, col.names = TRUE)
createLoopAnnotation(consensus.loop.anno.promoter.tb, name, 
                     figDir, outDir,  colorListPromoter)
saveAnnoGroupBedpe(consensus.loop.anno.promoter.tb, unique(consensus.loop.anno.promoter.tb$Anno2) , name, \all\, outDir)  
saveAnnoGroupBedpe(consensus.loop.anno.promoter.tb, c(\P-P\), name, \p-p\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.promoter.tb, c(\P-N\), name, \p-n\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.promoter.tb, c(\N-N\), name, \n-n\, outDir)

################################################################################
# Annotating with one marker (Enhancer)
name <- \chromo_cons_annoEnhancer\
consensus.loop.anno.enhancer.tb <- annotateLoopEnhancer(temp.anno.TSS)
fwrite(consensus.loop.anno.enhancer.tb, here(consensusDir, paste0(name, \.tsv\)), 
       sep = \\t\, col.names = TRUE)
createLoopAnnotation(consensus.loop.anno.enhancer.tb, name, 
                     figDir, outDir,  colorListEnhancer)
saveAnnoGroupBedpe(consensus.loop.anno.enhancer.tb, unique(consensus.loop.anno.enhancer.tb$Anno2) , name, \all\, outDir)  
saveAnnoGroupBedpe(consensus.loop.anno.enhancer.tb, c(\E-E\), name, \e-e\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.enhancer.tb, c(\E-N\), name, \e-n\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.enhancer.tb, c(\N-N\), name, \n-n\, outDir)
################################################################################
# Annotating with one marker (Structure)
name <- \chromo_cons_annoStructure\
consensus.loop.anno.structure.tb <- annotateLoopStructure(temp.anno.TSS)
fwrite(consensus.loop.anno.structure.tb, here(consensusDir, paste0(name, \.tsv\)), 
       sep = \\t\, col.names = TRUE)
createLoopAnnotation(consensus.loop.anno.structure.tb, name, 
                     figDir, outDir,  colorListStructure)
saveAnnoGroupBedpe(consensus.loop.anno.structure.tb, unique(consensus.loop.anno.structure.tb$Anno2) , name, \all\, outDir)  
saveAnnoGroupBedpe(consensus.loop.anno.structure.tb, c(\S-S\), name, \s-s\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.structure.tb, c(\S-N\), name, \s-n\, outDir)
saveAnnoGroupBedpe(consensus.loop.anno.structure.tb, c(\N-N\), name, \n-n\, outDir)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Functions

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TmNiaU1nTWpBeU5DNHdPUzR4TUNCVGNHeHBkSFJwYm1jZ2NtVm5kV3hoZEc5eWVTQnNiMjl3SUdsdWRHOGdjSFZ5WlNCeVpXZDFiR0YwYjNKNUlHRnVaQ0J6ZEhKMVkzUjFjbVV0Y21Wc1lYUmxaQ0JzYjI5d2MxeHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WTI5dWMyVnVjM1Z6TG14dmIzQXVZVzV1Ynk1MFlpQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aUxuUnpkbHdpS1NrcFhHNXlaV2QxYkdGMGIzSjVMbXh2YjNBdVlXNXVieTUwWWlBOExTQmpiMjV6Wlc1emRYTXViRzl2Y0M1aGJtNXZMblJpSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHlJQ1ZwYmlVZ1l5aGNJbEF0VUZ3aUxDQmNJbEF0UlZ3aUxDQmNJa1V0UlZ3aUtTbGNibHh1Y21WbmRXeGhkRzl5ZVM1c2IyOXdMbUZ1Ym04dWRHSWdQQzBnY21WbmRXeGhkRzl5ZVM1c2IyOXdMbUZ1Ym04dWRHSWdKVDRsSUhKdmQzZHBjMlVvS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnSUNCQmJtNXZNeUE5SUdsbVpXeHpaU2hCTVY5U1FVUXlNU0I4SUVFeFgwTlVRMFlnZkNCQk1sOVNRVVF5TVNCOElFRXlYMUpCUkRJeExDQndZWE4wWlRBb1hDSnpkSEpjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjR0Z6ZEdVd0tGd2ljbVZuWENJcEtWeHVJQ0FwWEc1Y2JseHVabmR5YVhSbEtISmxaM1ZzWVhSdmNua3ViRzl2Y0M1aGJtNXZMblJpTENCb1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDBGdWJtOHpMblJ6ZGx3aUtTa3NJRnh1SUNBZ0lDQWdJSE5sY0NBOUlGd2lYRngwWENJc0lHTnZiQzV1WVcxbGN5QTlJRlJTVlVVcFhHNWNibkpsWjNWc1lYUnZjbmt1Ykc5dmNDNWhibTV2TG5SaVgzSmxaeUE4TFNCeVpXZDFiR0YwYjNKNUxteHZiM0F1WVc1dWJ5NTBZaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhCYm01dk15QTlQU0JjSW5KbFoxd2lLVnh1Y21WbmRXeGhkRzl5ZVM1c2IyOXdMbUZ1Ym04dWRHSmZjM1J5SUR3dElISmxaM1ZzWVhSdmNua3ViRzl2Y0M1aGJtNXZMblJpSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHpJRDA5SUZ3aWMzUnlYQ0lwWEc1Y2JuTmhkbVZCYm01dlIzSnZkWEJDWldSd1pTaHlaV2QxYkdGMGIzSjVMbXh2YjNBdVlXNXVieTUwWWw5eVpXY3NJR01vWENKUUxWQmNJaXdnWENKUUxVVmNJaXdnWENKRkxVVmNJaWtzSUc1aGJXVXNJRndpY0dVdGNHVmZjbVZuWENJc0lHOTFkRVJwY2lsY2JuTmhkbVZCYm01dlIzSnZkWEJDWldSd1pTaHlaV2QxYkdGMGIzSjVMbXh2YjNBdVlXNXVieTUwWWw5emRISXNJR01vWENKUUxWQmNJaXdnWENKUUxVVmNJaXdnWENKRkxVVmNJaWtzSUc1aGJXVXNJRndpY0dVdGNHVmZjM1J5WENJc0lHOTFkRVJwY2lsY2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgMjAyNC4wOS4xMCBTcGxpdHRpbmcgcmVndWxhdG9yeSBsb29wIGludG8gcHVyZSByZWd1bGF0b3J5IGFuZCBzdHJ1Y3R1cmUtcmVsYXRlZCBsb29wc1xubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuY29uc2Vuc3VzLmxvb3AuYW5uby50YiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5yZWd1bGF0b3J5Lmxvb3AuYW5uby50YiA8LSBjb25zZW5zdXMubG9vcC5hbm5vLnRiICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSlcblxucmVndWxhdG9yeS5sb29wLmFubm8udGIgPC0gcmVndWxhdG9yeS5sb29wLmFubm8udGIgJT4lIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBBbm5vMyA9IGlmZWxzZShBMV9SQUQyMSB8IEExX0NUQ0YgfCBBMl9SQUQyMSB8IEEyX1JBRDIxLCBwYXN0ZTAoXFxzdHJcXCksXG4gICAgICAgICAgICAgICAgICAgcGFzdGUwKFxccmVnXFwpKVxuICApXG5cblxuZndyaXRlKHJlZ3VsYXRvcnkubG9vcC5hbm5vLnRiLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX0Fubm8zLnRzdlxcKSksIFxuICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IFRSVUUpXG5cbnJlZ3VsYXRvcnkubG9vcC5hbm5vLnRiX3JlZyA8LSByZWd1bGF0b3J5Lmxvb3AuYW5uby50YiAlPiUgZHBseXI6OmZpbHRlcihBbm5vMyA9PSBcXHJlZ1xcKVxucmVndWxhdG9yeS5sb29wLmFubm8udGJfc3RyIDwtIHJlZ3VsYXRvcnkubG9vcC5hbm5vLnRiICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8zID09IFxcc3RyXFwpXG5cbnNhdmVBbm5vR3JvdXBCZWRwZShyZWd1bGF0b3J5Lmxvb3AuYW5uby50Yl9yZWcsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIG5hbWUsIFxccGUtcGVfcmVnXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShyZWd1bGF0b3J5Lmxvb3AuYW5uby50Yl9zdHIsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIG5hbWUsIFxccGUtcGVfc3RyXFwsIG91dERpcilcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
################################################################################
# 2024.09.10 Splitting regulatory loop into pure regulatory and structure-related loops
name <- \chromo_cons_annoHierarchy\
consensus.loop.anno.tb <- fread(here(consensusDir, paste0(name, \.tsv\)))
regulatory.loop.anno.tb <- consensus.loop.anno.tb %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\))

regulatory.loop.anno.tb <- regulatory.loop.anno.tb %>% rowwise() %>%
  dplyr::mutate(
    Anno3 = ifelse(A1_RAD21 | A1_CTCF | A2_RAD21 | A2_RAD21, paste0(\str\),
                   paste0(\reg\))
  )


fwrite(regulatory.loop.anno.tb, here(consensusDir, paste0(name, \_Anno3.tsv\)), 
       sep = \\t\, col.names = TRUE)

regulatory.loop.anno.tb_reg <- regulatory.loop.anno.tb %>% dplyr::filter(Anno3 == \reg\)
regulatory.loop.anno.tb_str <- regulatory.loop.anno.tb %>% dplyr::filter(Anno3 == \str\)

saveAnnoGroupBedpe(regulatory.loop.anno.tb_reg, c(\P-P\, \P-E\, \E-E\), name, \pe-pe_reg\, outDir)
saveAnnoGroupBedpe(regulatory.loop.anno.tb_str, c(\P-P\, \P-E\, \E-E\), name, \pe-pe_str\, outDir)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlOY2JpTWdNakF5TkM0d09TNHhNQ0JUY0d4cGRIUnBibWNnY21WbmRXeGhkRzl5ZVNCc2IyOXdJR2x1ZEc4Z2NIVnlaU0J5WldkMWJHRjBiM0o1SUdGdVpDQnpkSEoxWTNSMWNtVXRjbVZzWVhSbFpDQnNiMjl3YzF4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVZMjl1YzJWdWMzVnpMbXh2YjNBdVlXNXVieTUwWWlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjTG5SemRseGNLU2twWEc1eVpXZDFiR0YwYjNKNUxteHZiM0F1WVc1dWJ5NTBZaUE4TFNCamIyNXpaVzV6ZFhNdWJHOXZjQzVoYm01dkxuUmlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRUZ1Ym04eUlDVnBiaVVnWXloY1hGQXRVRnhjTENCY1hGQXRSVnhjTENCY1hFVXRSVnhjS1NsY2JseHVjbVZuZFd4aGRHOXllUzVzYjI5d0xtRnVibTh1ZEdJZ1BDMGdjbVZuZFd4aGRHOXllUzVzYjI5d0xtRnVibTh1ZEdJZ0pUNGxJSEp2ZDNkcGMyVW9LU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoY2JpQWdJQ0JCYm01dk15QTlJR2xtWld4elpTaEJNVjlTUVVReU1TQjhJRUV4WDBOVVEwWWdmQ0JCTWw5U1FVUXlNU0I4SUVFeVgxSkJSREl4TENCd1lYTjBaVEFvWEZ4emRISmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NHRnpkR1V3S0Z4Y2NtVm5YRndwS1Z4dUlDQXBYRzVjYmx4dVpuZHlhWFJsS0hKbFozVnNZWFJ2Y25rdWJHOXZjQzVoYm01dkxuUmlMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNYMEZ1Ym04ekxuUnpkbHhjS1Nrc0lGeHVJQ0FnSUNBZ0lITmxjQ0E5SUZ4Y1hGeDBYRndzSUdOdmJDNXVZVzFsY3lBOUlGUlNWVVVwWEc1Y2JuSmxaM1ZzWVhSdmNua3ViRzl2Y0M1aGJtNXZMblJpWDNKbFp5QThMU0J5WldkMWJHRjBiM0o1TG14dmIzQXVZVzV1Ynk1MFlpQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TXlBOVBTQmNYSEpsWjF4Y0tWeHVjbVZuZFd4aGRHOXllUzVzYjI5d0xtRnVibTh1ZEdKZmMzUnlJRHd0SUhKbFozVnNZWFJ2Y25rdWJHOXZjQzVoYm01dkxuUmlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRUZ1Ym04eklEMDlJRnhjYzNSeVhGd3BYRzVjYm5OaGRtVkJibTV2UjNKdmRYQkNaV1J3WlNoeVpXZDFiR0YwYjNKNUxteHZiM0F1WVc1dWJ5NTBZbDl5Wldjc0lHTW9YRnhRTFZCY1hDd2dYRnhRTFVWY1hDd2dYRnhGTFVWY1hDa3NJRzVoYldVc0lGeGNjR1V0Y0dWZmNtVm5YRndzSUc5MWRFUnBjaWxjYm5OaGRtVkJibTV2UjNKdmRYQkNaV1J3WlNoeVpXZDFiR0YwYjNKNUxteHZiM0F1WVc1dWJ5NTBZbDl6ZEhJc0lHTW9YRnhRTFZCY1hDd2dYRnhRTFVWY1hDd2dYRnhGTFVWY1hDa3NJRzVoYldVc0lGeGNjR1V0Y0dWZmMzUnlYRndzSUc5MWRFUnBjaWxjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIDIwMjQuMDkuMTAgU3BsaXR0aW5nIHJlZ3VsYXRvcnkgbG9vcCBpbnRvIHB1cmUgcmVndWxhdG9yeSBhbmQgc3RydWN0dXJlLXJlbGF0ZWQgbG9vcHNcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmNvbnNlbnN1cy5sb29wLmFubm8udGIgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxucmVndWxhdG9yeS5sb29wLmFubm8udGIgPC0gY29uc2Vuc3VzLmxvb3AuYW5uby50YiAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCkpXG5cbnJlZ3VsYXRvcnkubG9vcC5hbm5vLnRiIDwtIHJlZ3VsYXRvcnkubG9vcC5hbm5vLnRiICU+JSByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgQW5ubzMgPSBpZmVsc2UoQTFfUkFEMjEgfCBBMV9DVENGIHwgQTJfUkFEMjEgfCBBMl9SQUQyMSwgcGFzdGUwKFxcc3RyXFwpLFxuICAgICAgICAgICAgICAgICAgIHBhc3RlMChcXHJlZ1xcKSlcbiAgKVxuXG5cbmZ3cml0ZShyZWd1bGF0b3J5Lmxvb3AuYW5uby50YiwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9Bbm5vMy50c3ZcXCkpLCBcbiAgICAgICBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBUUlVFKVxuXG5yZWd1bGF0b3J5Lmxvb3AuYW5uby50Yl9yZWcgPC0gcmVndWxhdG9yeS5sb29wLmFubm8udGIgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzMgPT0gXFxyZWdcXClcbnJlZ3VsYXRvcnkubG9vcC5hbm5vLnRiX3N0ciA8LSByZWd1bGF0b3J5Lmxvb3AuYW5uby50YiAlPiUgZHBseXI6OmZpbHRlcihBbm5vMyA9PSBcXHN0clxcKVxuXG5zYXZlQW5ub0dyb3VwQmVkcGUocmVndWxhdG9yeS5sb29wLmFubm8udGJfcmVnLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBuYW1lLCBcXHBlLXBlX3JlZ1xcLCBvdXREaXIpXG5zYXZlQW5ub0dyb3VwQmVkcGUocmVndWxhdG9yeS5sb29wLmFubm8udGJfc3RyLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBuYW1lLCBcXHBlLXBlX3N0clxcLCBvdXREaXIpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgMjAyNC4wOS4xMCBTcGxpdHRpbmcgcmVndWxhdG9yeSBsb29wIGludG8gcHVyZSByZWd1bGF0b3J5IGFuZCBzdHJ1Y3R1cmUtcmVsYXRlZCBsb29wc1xubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuY29uc2Vuc3VzLmxvb3AuYW5uby50YiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5yZWd1bGF0b3J5Lmxvb3AuYW5uby50YiA8LSBjb25zZW5zdXMubG9vcC5hbm5vLnRiICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSlcblxucmVndWxhdG9yeS5sb29wLmFubm8udGIgPC0gcmVndWxhdG9yeS5sb29wLmFubm8udGIgJT4lIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBBbm5vMyA9IGlmZWxzZShBMV9SQUQyMSB8IEExX0NUQ0YgfCBBMl9SQUQyMSB8IEEyX1JBRDIxLCBwYXN0ZTAoXFxzdHJcXCksXG4gICAgICAgICAgICAgICAgICAgcGFzdGUwKFxccmVnXFwpKVxuICApXG5cblxuZndyaXRlKHJlZ3VsYXRvcnkubG9vcC5hbm5vLnRiLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX0Fubm8zLnRzdlxcKSksIFxuICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IFRSVUUpXG5cbnJlZ3VsYXRvcnkubG9vcC5hbm5vLnRiX3JlZyA8LSByZWd1bGF0b3J5Lmxvb3AuYW5uby50YiAlPiUgZHBseXI6OmZpbHRlcihBbm5vMyA9PSBcXHJlZ1xcKVxucmVndWxhdG9yeS5sb29wLmFubm8udGJfc3RyIDwtIHJlZ3VsYXRvcnkubG9vcC5hbm5vLnRiICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8zID09IFxcc3RyXFwpXG5cbnNhdmVBbm5vR3JvdXBCZWRwZShyZWd1bGF0b3J5Lmxvb3AuYW5uby50Yl9yZWcsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIG5hbWUsIFxccGUtcGVfcmVnXFwsIG91dERpcilcbnNhdmVBbm5vR3JvdXBCZWRwZShyZWd1bGF0b3J5Lmxvb3AuYW5uby50Yl9zdHIsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIG5hbWUsIFxccGUtcGVfc3RyXFwsIG91dERpcilcblxuYGBgXG5gYGAifQ== -->

```r
```r
################################################################################
# 2024.09.10 Splitting regulatory loop into pure regulatory and structure-related loops
name <- \chromo_cons_annoHierarchy\
consensus.loop.anno.tb <- fread(here(consensusDir, paste0(name, \.tsv\)))
regulatory.loop.anno.tb <- consensus.loop.anno.tb %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\))

regulatory.loop.anno.tb <- regulatory.loop.anno.tb %>% rowwise() %>%
  dplyr::mutate(
    Anno3 = ifelse(A1_RAD21 | A1_CTCF | A2_RAD21 | A2_RAD21, paste0(\str\),
                   paste0(\reg\))
  )


fwrite(regulatory.loop.anno.tb, here(consensusDir, paste0(name, \_Anno3.tsv\)), 
       sep = \\t\, col.names = TRUE)

regulatory.loop.anno.tb_reg <- regulatory.loop.anno.tb %>% dplyr::filter(Anno3 == \reg\)
regulatory.loop.anno.tb_str <- regulatory.loop.anno.tb %>% dplyr::filter(Anno3 == \str\)

saveAnnoGroupBedpe(regulatory.loop.anno.tb_reg, c(\P-P\, \P-E\, \E-E\), name, \pe-pe_reg\, outDir)
saveAnnoGroupBedpe(regulatory.loop.anno.tb_str, c(\P-P\, \P-E\, \E-E\), name, \pe-pe_str\, outDir)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Annotation

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZM0psWVhSbFgyeHZiM0JmWkdselgzWnpYM05qYjNKbElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHWnBaMFJwY2l3Z2JtRnRaU3dnUVc1dWJ6Sk1hWE4wS1h0Y2JpQWdaR0YwWVNBOUlHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvUVc1dWJ6SWdKV2x1SlNCQmJtNXZNa3hwYzNRcFhHNGdJRnh1SUNBakl5TWdZbUZ5Y0d4dmRGeHVJQ0IwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2FXUXNJRVJOVTA4c0lHUlVRVWNzSUVFME9EVXBJQ1UrSlZ4dUlDQWdJSEJwZG05MFgyeHZibWRsY2lnaGFXUXNJRzVoYldWelgzUnZJRDBnWENKMGNtVmhkRzFsYm5SY0lpd2dkbUZzZFdWelgzUnZJRDBnWENKelkyOXlaVndpS1Z4dUlDQjBaVzF3SkhSeVpXRjBiV1Z1ZENBOExTQm1ZV04wYjNJb2RHVnRjQ1IwY21WaGRHMWxiblFzSUd4bGRtVnNjeUE5SUdNb1hDSkVUVk5QWENJc0lGd2laRlJCUjF3aUxDQmNJa0UwT0RWY0lpa3BYRzRnSUZ4dUlDQndNeUE4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQjBjbVZoZEcxbGJuUXNJSGtnUFNCelkyOXlaU2twSUN0Y2JpQWdJQ0JuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlIUnlaV0YwYldWdWRDa3NJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUN0Y2JpQWdJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aVJFMVRUMXdpSUQwZ1hDSm5jbVY1WENJc0lGd2laRlJCUjF3aUlEMGdYQ0p3YVc1clhDSXNJRndpUVRRNE5Wd2lJRDBnWENKemEzbGliSFZsWENJcEtTQXJYRzRnSUNBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDdGNiaUFnSUNCNWJHbHRLQzB3TGpVc0lERXBJQ3RjYmlBZ0lDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lzSUdOdmJHOXlJRDBnWENKbmNtVjVYQ0lwSUN0Y2JpQWdJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNBZ0lHZG5kR2wwYkdVb2JtRnRaU2tnSzF4dUlDQWdJSFJvWlcxbEtIQnNiM1F1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb2MybDZaU0E5SURRcEtWeHVJQ0JtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKelkyOXlaVjlpWVhKd2JHOTBYMXdpTENCdVlXMWxLVnh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z1hHNGdJQ0FnSUNCeVpYTWdQU0EyTURBc0lIVnVhWFJ6SUQwZ1hDSnBibHdpTENCM2FXUjBhQ0E5SURJc0lHaGxhV2RvZENBOUlEUXBYRzRnSUhCeWFXNTBLSEF6S1Z4dUlDQmtaWFl1YjJabUtDbGNiaUFnYzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrcExDQmNiaUFnSUNBZ0lDQWdJQ0IzYVdSMGFDQTlJRElzSUdobGFXZG9kQ0E5SURRcFhHNGdJSEJ5YVc1MEtIQXpLVnh1SUNCa1pYWXViMlptS0NsY2JpQWdYRzRnSUNNakl5QkVhWE4wWVc1alpTQjJjeUJ6WTI5eVpWeHVJQ0JjYmlBZ2RHVnRjQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hrYVhOMFlXNWpaU3dnUkUxVFR5d2daRlJCUnl3Z1FUUTROU2xjYmx4dUlDQmhkbWRmYzJOdmNtVnpJRHd0SUhSbGJYQWdKVDRsWEc0Z0lDQWdaM0p2ZFhCZllua29aR2x6ZEdGdVkyVXBJQ1UrSlZ4dUlDQWdJSE4xYlcxaGNtbHpaU2hoWTNKdmMzTW9jM1JoY25SelgzZHBkR2dvWENKRVRWTlBYQ0lwT25OMFlYSjBjMTkzYVhSb0tGd2lRVFE0TlZ3aUtTd2diV1ZoYml3Z2JtRXVjbTBnUFNCVVVsVkZLU2xjYmx4dUlDQmhkbWRmYzJOdmNtVnpYMnh2Ym1jZ1BDMGdZWFpuWDNOamIzSmxjeUFsUGlWY2JpQWdJQ0J3YVhadmRGOXNiMjVuWlhJb1kyOXNjeUE5SUVSTlUwODZRVFE0TlN3Z2JtRnRaWE5mZEc4Z1BTQmNJbU52Ym1ScGRHbHZibHdpTENCMllXeDFaWE5mZEc4Z1BTQmNJbUYyWjE5elkyOXlaVndpS1Z4dUlDQmhkbWRmYzJOdmNtVnpYMnh2Ym1ja1kyOXVaR2wwYVc5dUlEd3RJR1poWTNSdmNpaGhkbWRmYzJOdmNtVnpYMnh2Ym1ja1kyOXVaR2wwYVc5dUxDQnNaWFpsYkhNZ1BTQmpLRndpUkUxVFQxd2lMQ0JjSW1SVVFVZGNJaXdnWENKQk5EZzFYQ0lwS1Z4dUlDQWpJRU55WldGMFpTQjBhR1VnY0d4dmRGeHVJQ0J3TkNBOExTQm5aM0JzYjNRb1lYWm5YM05qYjNKbGMxOXNiMjVuTENCaFpYTW9lQ0E5SUdScGMzUmhibU5sTENCNUlEMGdZWFpuWDNOamIzSmxMQ0JqYjJ4dmNpQTlJR052Ym1ScGRHbHZiaXdnWm1sc2JDQTlJR052Ym1ScGRHbHZiaWtwSUN0Y2JpQWdJQ0JuWlc5dFgzTnRiMjkwYUNoemFHOTNMbXhsWjJWdVpDQTlJRlJTVlVVcElDc2dlV3hwYlNnd0xDQXdMalVwSUN0Y2JpQWdJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUFnYzJOaGJHVmZlRjlqYjI1MGFXNTFiM1Z6S0d4aFltVnNjeUE5SUd4aFltVnNYMnRpWDIxaUtTQXJYRzRnSUNBZ2MyTmhiR1ZmWTI5c2IzSmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YQ0pFVFZOUFhDSWdQU0JjSW1keVpYbGNJaXdnWENKa1ZFRkhYQ0lnUFNCY0luQnBibXRjSWl3Z1hDSkJORGcxWENJZ1BTQmNJbk5yZVdKc2RXVmNJaWtwSUN0Y2JpQWdJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aVJFMVRUMXdpSUQwZ1hDSm5jbVY1T0RCY0lpd2dYQ0prVkVGSFhDSWdQU0JjSW5CcGJtdGNJaXdnWENKQk5EZzFYQ0lnUFNCY0luTnJlV0pzZFdWY0lpa3BJQ3RjYmlBZ0lDQnNZV0p6S0hScGRHeGxJRDBnY0dGemRHVXdLRzVoYldVcExGeHVJQ0FnSUNBZ0lDQWdlQ0E5SUZ3aVJHbHpkR0Z1WTJWY0lpeGNiaUFnSUNBZ0lDQWdJSGtnUFNCY0lrRjJaWEpoWjJVZ1UyTnZjbVZjSWlrZ0sxeHVJQ0FnSUhSb1pXMWxLSEJzYjNRdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9jMmw2WlNBOUlEVXBLVnh1SUNCbWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSmthWE4wWDNaelgzTmpiM0psWDJ4cGJtVlFiRzkwWDF3aUxDQnVZVzFsS1Z4dUlDQndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTeGNiaUFnSUNBZ0lISmxjeUE5SURZd01Dd2dkVzVwZEhNZ1BTQmNJbWx1WENJc0lIZHBaSFJvSUQwZ05Dd2dhR1ZwWjJoMElEMGdNeWxjYmlBZ2NISnBiblFvY0RRcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NYRzRnSUNBZ0lDQjNhV1IwYUNBOUlEUXNJR2hsYVdkb2RDQTlJRE1wWEc0Z0lIQnlhVzUwS0hBMEtWeHVJQ0JrWlhZdWIyWm1LQ2xjYm4xY2JseHVZM0psWVhSbFgyeHZiM0JmWkdselgzWnpYMlJwWm1aelkyOXlaU0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JtYVdkRWFYSXNJRzVoYldVc0lFRnVibTh5VEdsemRDbDdYRzRnSUdSaGRHRWdQU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtFRnVibTh5SUNWcGJpVWdRVzV1YnpKTWFYTjBLVnh1SUNCY2JpQWdYRzRnSUhSbGJYQWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGthWE4wWVc1alpTQTlJSE4wWVhKME1pQXRJSE4wWVhKME1Ta2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2x6ZEdGdVkyVXNJR1JwWm1aZlpGUkJSMTlFVFZOUExDQmthV1ptWDBFME9EVmZSRTFUVHlsY2JpQWdYRzRnSUdGMloxOXpZMjl5WlhNZ1BDMGdkR1Z0Y0NBbFBpVmNiaUFnSUNCbmNtOTFjRjlpZVNoa2FYTjBZVzVqWlNrZ0pUNGxYRzRnSUNBZ2MzVnRiV0Z5YVhObEtHRmpjbTl6Y3lneE9qSXNJRzFsWVc0c0lHNWhMbkp0SUQwZ1ZGSlZSU2twWEc0Z0lGeHVJQ0JoZG1kZmMyTnZjbVZ6WDJ4dmJtY2dQQzBnWVhablgzTmpiM0psY3lBbFBpVmNiaUFnSUNCd2FYWnZkRjlzYjI1blpYSW9ZMjlzY3lBOUlESTZNeXdnYm1GdFpYTmZkRzhnUFNCY0ltTnZibVJwZEdsdmJsd2lMQ0IyWVd4MVpYTmZkRzhnUFNCY0ltRjJaMTl6WTI5eVpWd2lLVnh1SUNCaGRtZGZjMk52Y21WelgyeHZibWNrWTI5dVpHbDBhVzl1SUR3dElHWmhZM1J2Y2loaGRtZGZjMk52Y21WelgyeHZibWNrWTI5dVpHbDBhVzl1TENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR1YyWld4eklEMGdZeWhjSW1ScFptWmZaRlJCUjE5RVRWTlBYQ0lzSUZ3aVpHbG1abDlCTkRnMVgwUk5VMDljSWlrcFhHNGdJQ01nUTNKbFlYUmxJSFJvWlNCd2JHOTBYRzRnSUhBMElEd3RJR2RuY0d4dmRDaGhkbWRmYzJOdmNtVnpYMnh2Ym1jc0lHRmxjeWg0SUQwZ1pHbHpkR0Z1WTJVc0lIa2dQU0JoZG1kZmMyTnZjbVVzSUdOdmJHOXlJRDBnWTI5dVpHbDBhVzl1TENCbWFXeHNJRDBnWTI5dVpHbDBhVzl1S1NrZ0sxeHVJQ0FnSUdkbGIyMWZjMjF2YjNSb0tITm9iM2N1YkdWblpXNWtJRDBnVkZKVlJTa2dLeUJuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLU0FySUhsc2FXMG9MVEF1TlN3Z01DNHhLU0FyWEc0Z0lDQWdkR2hsYldWZlkyeGhjM05wWXlncElDc2dJSE5qWVd4bFgzaGZZMjl1ZEdsdWRXOTFjeWhzWVdKbGJITWdQU0JzWVdKbGJGOXJZbDl0WWlrZ0sxeHVJQ0FnSUhOallXeGxYMk52Ykc5eVgyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2laR2xtWmw5a1ZFRkhYMFJOVTA5Y0lpQTlJRndpY0dsdWExd2lMQ0JjSW1ScFptWmZRVFE0TlY5RVRWTlBYQ0lnUFNCY0luTnJlV0pzZFdWY0lpa3BJQ3RjYmlBZ0lDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRndpWkdsbVpsOWtWRUZIWDBSTlUwOWNJaUE5SUZ3aWNHbHVhMXdpTENCY0ltUnBabVpmUVRRNE5WOUVUVk5QWENJZ1BTQmNJbk5yZVdKc2RXVmNJaWtwSUN0Y2JpQWdJQ0JzWVdKektIUnBkR3hsSUQwZ2NHRnpkR1V3S0c1aGJXVXBMRnh1SUNBZ0lDQWdJQ0FnZUNBOUlGd2lSR2x6ZEdGdVkyVmNJaXhjYmlBZ0lDQWdJQ0FnSUhrZ1BTQmNJa0YyWlhKaFoyVWdSR2xtWmlCVFkyOXlaVndpS1NBclhHNGdJQ0FnZEdobGJXVW9jR3h2ZEM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05Ta3BYRzRnSUdacGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0ltUnBjM1JmZG5OZmMyTnZjbVZmWkdsbVpteHBibVZRYkc5MFgxd2lMQ0J1WVcxbEtWeHVJQ0J3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3hjYmlBZ0lDQWdJSEpsY3lBOUlEWXdNQ3dnZFc1cGRITWdQU0JjSW1sdVhDSXNJSGRwWkhSb0lEMGdOQzQxTENCb1pXbG5hSFFnUFNBektWeHVJQ0J3Y21sdWRDaHdOQ2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N4Y2JpQWdJQ0FnSUNBZ0lDQjNhV1IwYUNBOUlEUXVOU3dnYUdWcFoyaDBJRDBnTXlsY2JpQWdjSEpwYm5Rb2NEUXBYRzRnSUdSbGRpNXZabVlvS1Z4dWZWeHVYRzVqY21WaGRHVmZiRzl2Y0Y5elkyRjBkR1Z5Y0d4dmRDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm1hV2RFYVhJc0lHNWhiV1VzSUVGdWJtOHlUR2x6ZEN3Z1pHbG1aa04xZEc5bVppbDdYRzRnSUdSaGRHRWdQQzBnWkdGMFlTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0hWd1pHOTNibDlrVkVGSFgwUk5VMDhnUFNCcFptVnNjMlVvWkdsbVpsOWtWRUZIWDBSTlUwOGdQaUJrYVdabVEzVjBiMlptTENCY0lsVlFYQ0lzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWkdsbVpsOWtWRUZIWDBSTlUwOGdQaUF0WkdsbVprTjFkRzltWml3Z1hDSk9UMXdpTENCY0lrUlBWMDVjSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkWEJrYjNkdVgwRTBPRFZmUkUxVFR5QTlJR2xtWld4elpTaGthV1ptWDBFME9EVmZSRTFUVHlBK0lHUnBabVpEZFhSdlptWXNJRndpVlZCY0lpd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGthV1ptWDBFME9EVmZSRTFUVHlBK0lDMWthV1ptUTNWMGIyWm1MQ0JjSWs1UFhDSXNJRndpUkU5WFRsd2lLU2twSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanBtYVd4MFpYSW9RVzV1YnpJZ0pXbHVKU0JCYm01dk1reHBjM1FwWEc0Z0lHUmhkR0VrZFhCa2IzZHVYMlJVUVVkZlJFMVRUeUE4TFNCbVlXTjBiM0lvWkdGMFlTUjFjR1J2ZDI1ZlpGUkJSMTlFVFZOUExDQnNaWFpsYkhNZ1BTQmpLRndpVlZCY0lpd2dYQ0pPVDF3aUxDQmNJa1JQVjA1Y0lpa3BYRzRnSUdSaGRHRWtkWEJrYjNkdVgwRTBPRFZmUkUxVFR5QThMU0JtWVdOMGIzSW9aR0YwWVNSMWNHUnZkMjVmUVRRNE5WOUVUVk5QTENCc1pYWmxiSE1nUFNCaktGd2lWVkJjSWl3Z1hDSk9UMXdpTENCY0lrUlBWMDVjSWlrcFhHNGdJRnh1SUNCdWRXMHVkWEFnUEMwZ0tITjFiVzFoY25rb1pHRjBZU1IxY0dSdmQyNWZaRlJCUjE5RVRWTlBLU2xiWENKVlVGd2lYVnh1SUNCdWRXMHVibThnUEMwZ0tITjFiVzFoY25rb1pHRjBZU1IxY0dSdmQyNWZaRlJCUjE5RVRWTlBLU2xiWENKT1Qxd2lYVnh1SUNCdWRXMHVaRzkzYmlBOExTQW9jM1Z0YldGeWVTaGtZWFJoSkhWd1pHOTNibDlrVkVGSFgwUk5VMDhwS1Z0Y0lrUlBWMDVjSWwxY2JpQWdiblZ0TG1Gc2JDQThMU0J1ZFcwdWRYQWdLeUJ1ZFcwdWJtOGdLeUJ1ZFcwdVpHOTNibHh1SUNCd1pYSmpMblZ3SUR3dElISnZkVzVrS0c1MWJTNTFjQ0F2SUc1MWJTNWhiR3dnS2lBeE1EQXNJRElwWEc0Z0lIQmxjbU11Ym04Z1BDMGdjbTkxYm1Rb2JuVnRMbTV2SUM4Z2JuVnRMbUZzYkNBcUlERXdNQ3dnTWlsY2JpQWdjR1Z5WXk1a2IzZHVJRHd0SUhKdmRXNWtLRzUxYlM1a2IzZHVJQzhnYm5WdExtRnNiQ0FxSURFd01Dd2dNaWxjYmlBZ1hHNGdJQ01qSXlCVFkyRjBkR1Z5Y0d4dmRGeHVJQ0JrWVhSaEpHUmxibk5wZEhrZ1BDMGdaMlYwWDJSbGJuTnBkSGtvWkdGMFlTUkVUVk5QTENCa1lYUmhKR1JVUVVjc0lHNGdQU0F4TURBcFhHNGdJR1JoZEdFZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pHVnVjMmwwZVNsY2JpQWdZMjl5Y21Wc1lYUnBiMjRnUEMwZ1kyOXlLR1JoZEdFa1JFMVRUeXdnWkdGMFlTUmtWRUZIS1Z4dUlDQndNU0E4TFNCblozQnNiM1FvWkdGMFlTd2dZV1Z6S0hnZ1BTQkVUVk5QTENCNUlEMGdaRlJCUnl3Z1kyOXNiM0lnUFNCa1pXNXphWFI1S1NrZ0sxeHVJQ0FnSUdkbGIyMWZjRzlwYm5Rb2MybDZaU0E5SURFc1hHNGdJQ0FnSUNCaGJIQm9ZU0E5SURFc1hHNGdJQ0FnSUNCemRISnZhMlVnUFNBd0tTQXJJRnh1SUNBZ0lITmpZV3hsWDJOdmJHOXlYM1pwY21sa2FYTW9iM0IwYVc5dUlEMGdYQ0pFWENJc0lHZDFhV1JsSUQwZ1ozVnBaR1ZmWTI5c2IzSmlZWElvWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaGNuZHBaSFJvSUQwZ01TNDFMelV1TURnc0lDQWpJRUZrYW5WemRDQjNhV1IwYUNCdlppQjBhR1VnWTI5c2IzSWdZbUZ5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaGNtaGxhV2RvZENBOUlERTFMelV1TURnZ0lDQWpJRUZrYW5WemRDQm9aV2xuYUhRZ2IyWWdkR2hsSUdOdmJHOXlJR0poY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS1NrZ0sxeHVJQ0FnSUhoc2FXMG9MVEF1TlN3Z01Ta2dLeUI1YkdsdEtDMHdMalVzSURFcElDc2dZMjl2Y21SZlptbDRaV1FvS1NBclhHNGdJQ0FnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0F3TENCamIyd2dQU0JjSW1keVpYazFNRndpTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lwSUN0Y2JpQWdJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJQzFrYVdabVEzVjBiMlptTENCamIyd2dQU0JjSW1keVpYbGNJaXdnYkdsdVpYUjVjR1VnUFNCY0ltUnZkSFJsWkZ3aUxGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lLU0FyWEc0Z0lDQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQmthV1ptUTNWMGIyWm1MQ0JqYjJ3Z1BTQmNJbWR5WlhsY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SdmRIUmxaRndpTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aUtTQXJYRzRnSUNBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUN3Z1lXeHdhR0VnUFNBd0xqVXNJR052Ykc5eUlEMGdYQ0puY21WNVhDSXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lwSUN0Y2JpQWdJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXdMQ0JoYkhCb1lTQTlJREF1TlN3Z1kyOXNiM0lnUFNCY0ltZHlaWGxjSWl4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpa2dLMXh1SUNBZ0lHRnVibTkwWVhSbEtGd2lkR1Y0ZEZ3aUxDQjRJRDBnTFRBdU5Td2dlU0E5SURFc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z3aVZWQTZJRndpTENCdWRXMHVkWEFzSUZ3aUlDaGNJaXdnY0dWeVl5NTFjQ3dnWENJbEtWd2lLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnTENCemFYcGxJRDBnTVN4Y2JpQWdJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVcElDdGNiaUFnSUNCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJQzB3TGpVc0lIa2dQU0F4TFRBdU1Td2diR0ZpWld3Z1BTQndZWE4wWlRBb1hDSk9Uem9nWENJc0lHNTFiUzV1Ynl3Z1hDSWdLRndpTENCd1pYSmpMbTV2TENCY0lpVXBYQ0lwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXdnYUdwMWMzUWdQU0F3TENBc0lITnBlbVVnUFNBeExGeHVJQ0FnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTa2dLMXh1SUNBZ0lHRnVibTkwWVhSbEtGd2lkR1Y0ZEZ3aUxDQjRJRDBnTFRBdU5Td2dlU0E5SURFdE1DNHlMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJa1JQVjA0NklGd2lMQ0J1ZFcwdVpHOTNiaXdnWENJZ0tGd2lMQ0J3WlhKakxtUnZkMjRzSUZ3aUpTbGNJaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMQ0JvYW5WemRDQTlJREFzSUN3Z2MybDZaU0E5SURFc1hHNGdJQ0FnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbEtTQXJYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdJQ0FqWVc1dWIzUmhkR1VvWENKMFpYaDBYQ0lzSUhnZ1BTQXRNQzQxTENCNUlEMGdNU3dnYkdGaVpXd2dQU0J3WVhOMFpTaGNJbklnUFZ3aUxDQnliM1Z1WkNoamIzSnlaV3hoZEdsdmJpd2dNaWtwTENCemFYcGxJRDBnTlN3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJcElDdGNiaUFnSUNCMGFHVnRaU2hjYmlBZ0lDQWdJQ01nYkdWblpXNWtMbkJ2YzJsMGFXOXVJRDBnWENKdWIyNWxYQ0lzWEc0Z0lDQWdJQ0J3Ykc5MExuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdJQ0JvYW5WemRDQTlJREF1TlN4Y2JpQWdJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl4Y2JpQWdJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dWY2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTEZ4dUlDQWdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNBZ0tTeGNiaUFnSUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl4Y2JpQWdJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBZ0lDa3NYRzRnSUNBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNBZ0tTeGNiaUFnSUNBZ0lHRjRhWE11ZEdsamEzTWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNBZ0tTeGNiaUFnSUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRndpZEhKaGJuTndZWEpsYm5SY0lpa3NYRzRnSUNBZ0tTQXJYRzRnSUhoc1lXSW9YQ0pNYjI5d0lITmpiM0psWEZ4dVJ6RXVSRTFUVDF3aUtTQXJYRzRnSUNBZ2VXeGhZaWhjSWt4dmIzQWdjMk52Y21WY1hHNUhNUzVrVkVGSFhDSXBYRzRnSUZ4dUlDQmNiaUFnWEc0Z0lHNTFiUzUxY0NBOExTQW9jM1Z0YldGeWVTaGtZWFJoSkhWd1pHOTNibDlCTkRnMVgwUk5VMDhwS1Z0Y0lsVlFYQ0pkWEc0Z0lHNTFiUzV1YnlBOExTQW9jM1Z0YldGeWVTaGtZWFJoSkhWd1pHOTNibDlCTkRnMVgwUk5VMDhwS1Z0Y0lrNVBYQ0pkWEc0Z0lHNTFiUzVrYjNkdUlEd3RJQ2h6ZFcxdFlYSjVLR1JoZEdFa2RYQmtiM2R1WDBFME9EVmZSRTFUVHlrcFcxd2lSRTlYVGx3aVhWeHVJQ0J1ZFcwdVlXeHNJRHd0SUc1MWJTNTFjQ0FySUc1MWJTNXVieUFySUc1MWJTNWtiM2R1WEc0Z0lIQmxjbU11ZFhBZ1BDMGdjbTkxYm1Rb2JuVnRMblZ3SUM4Z2JuVnRMbUZzYkNBcUlERXdNQ3dnTWlsY2JpQWdjR1Z5WXk1dWJ5QThMU0J5YjNWdVpDaHVkVzB1Ym04Z0x5QnVkVzB1WVd4c0lDb2dNVEF3TENBeUtWeHVJQ0J3WlhKakxtUnZkMjRnUEMwZ2NtOTFibVFvYm5WdExtUnZkMjRnTHlCdWRXMHVZV3hzSUNvZ01UQXdMQ0F5S1Z4dUlDQmNiaUFnWkdGMFlTUmtaVzV6YVhSNUlEd3RJR2RsZEY5a1pXNXphWFI1S0dSaGRHRWtSRTFUVHl3Z1pHRjBZU1JCTkRnMUxDQnVJRDBnTVRBd0tWeHVJQ0JrWVhSaElEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcGhjbkpoYm1kbEtHUmxibk5wZEhrcFhHNGdJR052Y25KbGJHRjBhVzl1SUR3dElHTnZjaWhrWVhSaEpFUk5VMDhzSUdSaGRHRWtRVFE0TlNsY2JpQWdjRElnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdSRTFUVHl3Z2VTQTlJRUUwT0RVc0lHTnZiRzl5SUQwZ1pHVnVjMmwwZVNrcElDdGNiaUFnSUNCblpXOXRYM0J2YVc1MEtITnBlbVVnUFNBeExGeHVJQ0FnSUNBZ1lXeHdhR0VnUFNBeExGeHVJQ0FnSUNBZ2MzUnliMnRsSUQwZ01Da2dLeUJjYmlBZ0lDQnpZMkZzWlY5amIyeHZjbDkyYVhKcFpHbHpLRzl3ZEdsdmJpQTlJRndpUkZ3aUxDQm5kV2xrWlNBOUlHZDFhV1JsWDJOdmJHOXlZbUZ5S0Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlYSjNhV1IwYUNBOUlERXVOUzgxTGpBNExDQWdJeUJCWkdwMWMzUWdkMmxrZEdnZ2IyWWdkR2hsSUdOdmJHOXlJR0poY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlYSm9aV2xuYUhRZ1BTQXhOUzgxTGpBNElDQWdJeUJCWkdwMWMzUWdhR1ZwWjJoMElHOW1JSFJvWlNCamIyeHZjaUJpWVhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNrcElDdGNiaUFnSUNCNGJHbHRLQzB3TGpVc0lERXBJQ3NnZVd4cGJTZ3RNQzQxTENBeEtTQXJJR052YjNKa1gyWnBlR1ZrS0NrZ0sxeHVJQ0FnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTUN3Z1kyOXNJRDBnWENKbmNtVjVOVEJjSWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJoYzJobFpGd2lMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpS1NBclhHNGdJQ0FnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0F0WkdsbVprTjFkRzltWml3Z1kyOXNJRDBnWENKbmNtVjVYQ0lzSUd4cGJtVjBlWEJsSUQwZ1hDSmtiM1IwWldSY0lpeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJaWtnSzF4dUlDQWdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYQ0puY21WNVhDSXNJR3hwYm1WMGVYQmxJRDBnWENKa2IzUjBaV1JjSWl4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpa2dLMXh1SUNBZ0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRndpWjNKbGVWd2lMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpS1NBclhHNGdJQ0FnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdNQ3dnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hDSm5jbVY1WENJc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXBJQ3RjYmlBZ0lDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SUMwd0xqVXNJSGtnUFNBeExDQnNZV0psYkNBOUlIQmhjM1JsTUNoY0lsVlFPaUJjSWl3Z2JuVnRMblZ3TENCY0lpQW9YQ0lzSUhCbGNtTXVkWEFzSUZ3aUpTbGNJaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F4TEZ4dUlDQWdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlNrZ0sxeHVJQ0FnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdMVEF1TlN3Z2VTQTlJREV0TUM0eExDQnNZV0psYkNBOUlIQmhjM1JsTUNoY0lrNVBPaUJjSWl3Z2JuVnRMbTV2TENCY0lpQW9YQ0lzSUhCbGNtTXVibThzSUZ3aUpTbGNJaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F4TEZ4dUlDQWdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlNrZ0sxeHVJQ0FnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdMVEF1TlN3Z2VTQTlJREV0TUM0eUxDQnNZV0psYkNBOUlIQmhjM1JsTUNoY0lrUlBWMDQ2SUZ3aUxDQnVkVzB1Wkc5M2Jpd2dYQ0lnS0Z3aUxDQndaWEpqTG1SdmQyNHNJRndpSlNsY0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXhMRnh1SUNBZ0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU2tnSzF4dUlDQWdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNBZ0lDTWdZVzV1YjNSaGRHVW9YQ0owWlhoMFhDSXNJSGdnUFNBdE1DNDFMQ0I1SUQwZ01Td2diR0ZpWld3Z1BTQndZWE4wWlNoY0luSWdQVndpTENCeWIzVnVaQ2hqYjNKeVpXeGhkR2x2Yml3Z01pa3BMQ0J6YVhwbElEMGdOU3dnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwSUN0Y2JpQWdJQ0IwYUdWdFpTaGNiaUFnSUNBZ0lDTWdiR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdYQ0p1YjI1bFhDSXNYRzRnSUNBZ0lDQndiRzkwTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ0lDQm9hblZ6ZENBOUlEQXVOU3hjYmlBZ0lDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1ZjYmlBZ0lDQWdJQ2tzWEc0Z0lDQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMRnh1SUNBZ0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGd2lkSEpoYm5Od1lYSmxiblJjSWlrc1hHNGdJQ0FnS1NBclhHNGdJQ0FnZUd4aFlpaGNJa3h2YjNBZ2MyTnZjbVZjWEc1SE1TNUVUVk5QWENJcElDdGNiaUFnSUNCNWJHRmlLRndpVEc5dmNDQnpZMjl5WlZ4Y2JrY3hMa0UwT0RWY0lpbGNibHh1SUNBZ0lIZHBaSFJvSUR3dElIQmhibVZzVTJsNlpTZ3hMalVwS20xdFZHOUpibU5vWEc0Z0lHaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzQxS1NwdGJWUnZTVzVqYUNBZ1hHNGdJRnh1SUNCbWFXeGxUbUZ0WlNBOExTQm9aWEpsS0dacFowUnBjaXh3WVhOMFpUQW9YQ0p6WTJGMGRHVnljR3h2ZEY5Y0lpd2dibUZ0WlN3Z1hDSmZaRlJCUjE5MmMxOUVUVk5QWDF3aUxDQmthV1ptUTNWMGIyWm1LU2xjYmx4dUlDQnpkbWRzYVhSbEtIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcExDQjNhV1IwYUNBOUlIZHBaSFJvTENCb1pXbG5hSFFnUFdobGFXZG9kQ2xjYmlBZ2NISnBiblFvY0RFcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCd2JtY29jR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3NJSGRwWkhSb0lEMGdkMmxrZEdnc0lHaGxhV2RvZENBOWFHVnBaMmgwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lwWEc0Z0lIQnlhVzUwS0hBeEtWeHVJQ0JrWlhZdWIyWm1LQ2xjYmlBZ1hHNGdJQ0FnWm1sc1pVNWhiV1VnUEMwZ2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaGNJbk5qWVhSMFpYSndiRzkwWDF3aUxDQnVZVzFsTENCY0lsOUJORGcxWDNaelgwUk5VMDlmWENJc0lHUnBabVpEZFhSdlptWXBLVnh1WEc0Z0lITjJaMnhwZEdVb2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrc0lIZHBaSFJvSUQwZ2QybGtkR2dzSUdobGFXZG9kQ0E5YUdWcFoyaDBLVnh1SUNCd2NtbHVkQ2h3TWlsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUhCdVp5aHdZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTd2dkMmxrZEdnZ1BTQjNhV1IwYUN3Z2FHVnBaMmgwSUQxb1pXbG5hSFFzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ3aWFXNWNJaWxjYmlBZ2NISnBiblFvY0RJcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCY2JpQWdJeUJjYmlBZ0l5QmNiaUFnSXlCY2JpQWdJeUJ3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBjeUE5SUZ3aWFXNWNJaXdnZDJsa2RHZ2dQU0ExS2pFdU5Td2dhR1ZwWjJoMElEMGdNaTQxS2pFdU5TbGNiaUFnSXlCd2NtbHVkQ2hqYjNkd2JHOTBPanB3Ykc5MFgyZHlhV1FvY0RFc0lIQXlMQ0JoYkdsbmJpQTlJRndpYUZ3aUtTbGNiaUFnSXlCa1pYWXViMlptS0NsY2JpQWdJeUJjYmlBZ0l5QnpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUZ4dUlDQWpJQ0FnSUNBZ0lDQWdkMmxrZEdnZ1BTQTFLakV1TlN3Z2FHVnBaMmgwSUQwZ01pNDFLakV1TlNsY2JpQWdJeUJ3Y21sdWRDaGpiM2R3Ykc5ME9qcHdiRzkwWDJkeWFXUW9jREVzSUhBeUxDQmhiR2xuYmlBOUlGd2lhRndpS1NsY2JpQWdJeUJrWlhZdWIyWm1LQ2xjYm4xY2JseHViV0ZyWlY5a2FXWm1YMkpsWkhCbElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHNWhiV1VzSUVGdWJtOHlUR2x6ZEN3Z2IzVjBSR2x5TENCa2FXWm1RM1YwYjJabUtYdGNiaUFnWkdGMFlTQThMU0JrWVhSaElDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvZFhCa2IzZHVYMlJVUVVkZlJFMVRUeUE5SUdsbVpXeHpaU2hrYVdabVgyUlVRVWRmUkUxVFR5QStJR1JwWm1aRGRYUnZabVlzSUZ3aVZWQmNJaXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hrYVdabVgyUlVRVWRmUkUxVFR5QStJQzFrYVdabVEzVjBiMlptTENCY0lrNVBYQ0lzSUZ3aVJFOVhUbHdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjFjR1J2ZDI1ZlFUUTROVjlFVFZOUElEMGdhV1psYkhObEtHUnBabVpmUVRRNE5WOUVUVk5QSUQ0Z1pHbG1aa04xZEc5bVppd2dYQ0pWVUZ3aUxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHUnBabVpmUVRRNE5WOUVUVk5QSUQ0Z0xXUnBabVpEZFhSdlptWXNJRndpVGs5Y0lpd2dYQ0pFVDFkT1hDSXBLU2tnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJRUZ1Ym04eVRHbHpkQ2xjYmlBZ1pHRjBZU1IxY0dSdmQyNWZaRlJCUjE5RVRWTlBJRHd0SUdaaFkzUnZjaWhrWVhSaEpIVndaRzkzYmw5a1ZFRkhYMFJOVTA4c0lHeGxkbVZzY3lBOUlHTW9YQ0pWVUZ3aUxDQmNJazVQWENJc0lGd2lSRTlYVGx3aUtTbGNiaUFnWkdGMFlTUjFjR1J2ZDI1ZlFUUTROVjlFVFZOUElEd3RJR1poWTNSdmNpaGtZWFJoSkhWd1pHOTNibDlCTkRnMVgwUk5VMDhzSUd4bGRtVnNjeUE5SUdNb1hDSlZVRndpTENCY0lrNVBYQ0lzSUZ3aVJFOVhUbHdpS1NsY2JpQWdYRzRnSUc5MWRDNTBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvZFhCa2IzZHVYMlJVUVVkZlJFMVRUeUE5UFNCY0lsVlFYQ0lwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dNb01Td2dNaXdnTXl3Z05Dd2dOU3dnTmlrcFhHNGdJR1ozY21sMFpTaHZkWFF1ZEdWdGNDd2dhR1Z5WlNodmRYUkVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNJbDlrVkVGSGRuTkVUVk5QWDFWUVgyUnBabVpjSWl3Z1pHbG1aa04xZEc5bVppd2dYQ0l1WW1Wa2NHVmNJaWtwTENCY2JpQWdJQ0FnSUNBZ0lITmxjQ0E5SUZ3aVhGeDBYQ0lzSUdOdmJDNXVZVzFsY3lBOUlFWkJURk5GS1Z4dUlDQnZkWFF1ZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIVndaRzkzYmw5a1ZFRkhYMFJOVTA4Z1BUMGdYQ0pPVDF3aUtTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLREVzSURJc0lETXNJRFFzSURVc0lEWXBLVnh1SUNCbWQzSnBkR1VvYjNWMExuUmxiWEFzSUdobGNtVW9iM1YwUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENKZlpGUkJSM1p6UkUxVFQxOU9UMTlrYVdabVhDSXNJR1JwWm1aRGRYUnZabVlzSUZ3aUxtSmxaSEJsWENJcEtTd2dYRzRnSUNBZ0lDQWdJQ0J6WlhBZ1BTQmNJbHhjZEZ3aUxDQmpiMnd1Ym1GdFpYTWdQU0JHUVV4VFJTbGNiaUFnYjNWMExuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWgxY0dSdmQyNWZaRlJCUjE5RVRWTlBJRDA5SUZ3aVJFOVhUbHdpS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNc0lEUXNJRFVzSURZcEtWeHVJQ0JtZDNKcGRHVW9iM1YwTG5SbGJYQXNJR2hsY21Vb2IzVjBSR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYQ0pmWkZSQlIzWnpSRTFUVDE5RVQxZE9YMlJwWm1aY0lpd2daR2xtWmtOMWRHOW1aaXdnWENJdVltVmtjR1ZjSWlrcExDQmNiaUFnSUNBZ0lDQWdJSE5sY0NBOUlGd2lYRngwWENJc0lHTnZiQzV1WVcxbGN5QTlJRVpCVEZORktWeHVJQ0JjYmlBZ2IzVjBMblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loMWNHUnZkMjVmUVRRNE5WOUVUVk5QSUQwOUlGd2lWVkJjSWlrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1l5Z3hMQ0F5TENBekxDQTBMQ0ExTENBMktTbGNiaUFnWm5keWFYUmxLRzkxZEM1MFpXMXdMQ0JvWlhKbEtHOTFkRVJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDBFME9EVjJjMFJOVTA5ZlZWQmZaR2xtWmx3aUxDQmthV1ptUTNWMGIyWm1MQ0JjSWk1aVpXUndaVndpS1Nrc0lGeHVJQ0FnSUNBZ0lDQWdjMlZ3SUQwZ1hDSmNYSFJjSWl3Z1kyOXNMbTVoYldWeklEMGdSa0ZNVTBVcFhHNGdJRzkxZEM1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9kWEJrYjNkdVgwRTBPRFZmUkUxVFR5QTlQU0JjSWs1UFhDSXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR01vTVN3Z01pd2dNeXdnTkN3Z05Td2dOaWtwWEc0Z0lHWjNjbWwwWlNodmRYUXVkR1Z0Y0N3Z2FHVnlaU2h2ZFhSRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOUJORGcxZG5ORVRWTlBYMDVQWDJScFptWmNJaXdnWkdsbVprTjFkRzltWml3Z1hDSXVZbVZrY0dWY0lpa3BMQ0JjYmlBZ0lDQWdJQ0FnSUhObGNDQTlJRndpWEZ4MFhDSXNJR052YkM1dVlXMWxjeUE5SUVaQlRGTkZLVnh1SUNCdmRYUXVkR1Z0Y0NBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hWd1pHOTNibDlCTkRnMVgwUk5VMDhnUFQwZ1hDSkVUMWRPWENJcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHTW9NU3dnTWl3Z015d2dOQ3dnTlN3Z05pa3BYRzRnSUdaM2NtbDBaU2h2ZFhRdWRHVnRjQ3dnYUdWeVpTaHZkWFJFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjSWw5Qk5EZzFkbk5FVFZOUFgwUlBWMDVmWkdsbVpsd2lMQ0JrYVdabVEzVjBiMlptTENCY0lpNWlaV1J3WlZ3aUtTa3NJRnh1SUNBZ0lDQWdJQ0FnYzJWd0lEMGdYQ0pjWEhSY0lpd2dZMjlzTG01aGJXVnpJRDBnUmtGTVUwVXBYRzU5WEc1Y2JtTnlaV0YwWlY5a2FYTjBYM1p6WDJGMloxTmpiM0psWDNCbGNsUnlaV0YwYldWdWRDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm1hV2RFYVhJc0lHNWhiV1VzSUd4dmIzQk1hWE4wTENCamIyeHZja3hwYzNRc0lITmxJRDBnUmtGTVUwVXBlMXh1SUNCaGRtZGZjMk52Y21WelgyeHZibWNnUEMwZ1pHRjBZU0FsUGlWY2JpQWdJQ0JuY205MWNGOWllU2hrYVhOMFlXNWpaU3dnUVc1dWJ6SXBJQ1UrSlZ4dUlDQWdJSE4xYlcxaGNtbHpaU2hoZG1kZmMyTnZjbVVnUFNCdFpXRnVLSE5qYjNKbExDQnVZUzV5YlNBOUlGUlNWVVVwS1NBbFBpVmNiaUFnSUNCMWJtZHliM1Z3S0NrZ1hHNGdJR0YyWjE5elkyOXlaWE5mYkc5dVp5UkJibTV2TWlBOExTQm1ZV04wYjNJb1lYWm5YM05qYjNKbGMxOXNiMjVuSkVGdWJtOHlMQ0JzWlhabGJDQTlJR3h2YjNCTWFYTjBLVnh1SUNCd05DQThMU0JuWjNCc2IzUW9ZWFpuWDNOamIzSmxjMTlzYjI1bkxDQmhaWE1vZUNBOUlHUnBjM1JoYm1ObExDQjVJRDBnWVhablgzTmpiM0psTENCamIyeHZjaUE5SUVGdWJtOHlMQ0JtYVd4c0lEMGdRVzV1YnpJcEtTQXJJRnh1SUNBZ0lHZGxiMjFmYzIxdmIzUm9LSE5vYjNjdWJHVm5aVzVrSUQwZ1ZGSlZSU3dnYzJVZ1BTQnpaU2tnSUN0Y2JpQWdJQ0I1YkdsdEtEQXNJREF1TlNrZ0sxeHVJQ0FnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUNCelkyRnNaVjk0WDJOdmJuUnBiblZ2ZFhNb2JHRmlaV3h6SUQwZ2JHRmlaV3hmYTJKZmJXSXBJQ3RjYmlBZ0lDQnpZMkZzWlY5amIyeHZjbDl0WVc1MVlXd29kbUZzZFdWeklEMGdZMjlzYjNKTWFYTjBLU0FyWEc0Z0lDQWdjMk5oYkdWZlptbHNiRjl0WVc1MVlXd29kbUZzZFdWeklEMGdZMjlzYjNKTWFYTjBLU0FyWEc0Z0lDQWdiR0ZpY3loMGFYUnNaU0E5SUhCaGMzUmxNQ2h1WVcxbEtTeGNiaUFnSUNBZ0lDQWdJSGdnUFNCY0lrUnBjM1JoYm1ObFhDSXNYRzRnSUNBZ0lDQWdJQ0I1SUQwZ1hDSkJkbVZ5WVdkbElGTmpiM0psWENJcElDdGNiaUFnSUNCMGFHVnRaU2h3Ykc5MExuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTRLU2xjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW1ScGMzUmZkbk5mYzJOdmNtVmZiR2x1WlZCc2IzUmZYQ0lzSUc1aGJXVXBYRzRnSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCY2JpQWdJQ0FnSUhKbGN5QTlJRFl3TUN3Z2RXNXBkSE1nUFNCY0ltbHVYQ0lzSUhkcFpIUm9JRDBnTkN3Z2FHVnBaMmgwSUQwZ015bGNiaUFnY0hKcGJuUW9jRFFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0J6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lGeHVJQ0FnSUNBZ0lDQWdJSGRwWkhSb0lEMGdOQ3dnYUdWcFoyaDBJRDBnTXlsY2JpQWdjSEpwYm5Rb2NEUXBYRzRnSUdSbGRpNXZabVlvS1Z4dWZTQmNibHh1WTNKbFlYUmxYMlJwYzNSZmRuTmZZWFpuUkdsbVpsTmpiM0psWDNCbGNsUnlaV0YwYldWdWRDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm1hV2RFYVhJc0lHNWhiV1VzSUd4dmIzQk1hWE4wTENCamIyeHZja3hwYzNRc0lITmxJRDBnUmtGTVUwVXBlMXh1SUNCaGRtZGZjMk52Y21WelgyeHZibWNnUEMwZ1pHRjBZU0FsUGlWY2JpQWdJQ0JuY205MWNGOWllU2hrYVhOMFlXNWpaU3dnUVc1dWJ6SXBJQ1UrSlZ4dUlDQWdJSE4xYlcxaGNtbHpaU2hoZG1kZmMyTnZjbVVnUFNCdFpXRnVLSE5qYjNKbExDQnVZUzV5YlNBOUlGUlNWVVVwS1NBbFBpVmNiaUFnSUNCMWJtZHliM1Z3S0NrZ1hHNGdJR0YyWjE5elkyOXlaWE5mYkc5dVp5UkJibTV2TWlBOExTQm1ZV04wYjNJb1lYWm5YM05qYjNKbGMxOXNiMjVuSkVGdWJtOHlMQ0JzWlhabGJDQTlJR3h2YjNCTWFYTjBLVnh1SUNCd05DQThMU0JuWjNCc2IzUW9ZWFpuWDNOamIzSmxjMTlzYjI1bkxDQmhaWE1vZUNBOUlHUnBjM1JoYm1ObExDQjVJRDBnWVhablgzTmpiM0psTENCamIyeHZjaUE5SUVGdWJtOHlMQ0JtYVd4c0lEMGdRVzV1YnpJcEtTQXJJRnh1SUNBZ0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBcElDdGNiaUFnSUNCblpXOXRYM050YjI5MGFDaHphRzkzTG14bFoyVnVaQ0E5SUZSU1ZVVXNJSE5sSUQwZ2MyVXBJQ0FyWEc0Z0lDQWdkR2hsYldWZlkyeGhjM05wWXlncElDc2dJSE5qWVd4bFgzaGZZMjl1ZEdsdWRXOTFjeWhzWVdKbGJITWdQU0JzWVdKbGJGOXJZbDl0WWlrZ0sxeHVJQ0FnSUhOallXeGxYMk52Ykc5eVgyMWhiblZoYkNoMllXeDFaWE1nUFNCamIyeHZja3hwYzNRcElDdGNiaUFnSUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCamIyeHZja3hwYzNRcElDdGNiaUFnSUNCc1lXSnpLSFJwZEd4bElEMGdjR0Z6ZEdVd0tHNWhiV1VwTEZ4dUlDQWdJQ0FnSUNBZ2VDQTlJRndpUkdsemRHRnVZMlZjSWl4Y2JpQWdJQ0FnSUNBZ0lIa2dQU0JjSWtGMlpYSmhaMlVnUkdsbVppQlRZMjl5WlZ3aUtTQXJYRzRnSUNBZ2RHaGxiV1VvY0d4dmRDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdPQ2twSUZ4dUlDQmNiaUFnWm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aVpHbHpkRjkyYzE5elkyOXlaVjlrYVdabWJHbHVaVkJzYjNSZlhDSXNJRzVoYldVcFhHNGdJSEJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0JjYmlBZ0lDQWdJSEpsY3lBOUlEWXdNQ3dnZFc1cGRITWdQU0JjSW1sdVhDSXNJSGRwWkhSb0lEMGdOQ3dnYUdWcFoyaDBJRDBnTXlsY2JpQWdjSEpwYm5Rb2NEUXBYRzRnSUdSbGRpNXZabVlvS1Z4dUlDQnpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUZ4dUlDQWdJQ0FnSUNBZ0lIZHBaSFJvSUQwZ05Dd2dhR1ZwWjJoMElEMGdNeWxjYmlBZ2NISnBiblFvY0RRcFhHNGdJR1JsZGk1dlptWW9LVnh1ZlNCY2JseHVZM0psWVhSbFgzTmpiM0psWDJKaGNuQnNiM1JmY0dWeVZISmxZWFJ0Wlc1MElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHWnBaMFJwY2l3Z2JtRnRaU3dnYkc5dmNFeHBjM1FzSUdOdmJHOXlUR2x6ZENsN1hHNGdJR1JoZEdFa1FXNXVieklnUEMwZ1ptRmpkRzl5S0dSaGRHRWtRVzV1YnpJc0lHeGxkbVZzY3lBOUlHeHZiM0JNYVhOMEtWeHVJQ0JjYmlBZ2NETWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1FXNXVieklzSUhrZ1BTQnpZMjl5WlNrcElDdGNiaUFnSUNCblpXOXRYM1pwYjJ4cGJpaGhaWE1vWm1sc2JDQTlJRUZ1Ym04eUtTd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnSzF4dUlDQWdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR052Ykc5eVRHbHpkQ2tnSzF4dUlDQWdJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU1Td2diM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJLU0FyWEc0Z0lDQWdlV3hwYlNndE1DNDFMQ0F4S1NBclhHNGdJQ0FnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ3dnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUxDQmpiMnh2Y2lBOUlGd2laM0psZVZ3aUtTQXJYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdJQ0JuWjNScGRHeGxLRzVoYldVcElDdGNiaUFnSUNCMGFHVnRaU2h3Ykc5MExuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTBLU2xjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW5OamIzSmxYMkpoY2xCc2IzUmZYQ0lzSUc1aGJXVXBYRzRnSUZ4dUlDQndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2dYRzRnSUNBZ0lDQnlaWE1nUFNBMk1EQXNJSFZ1YVhSeklEMGdYQ0pwYmx3aUxDQjNhV1IwYUNBOUlESXNJR2hsYVdkb2RDQTlJRFFwWEc0Z0lIQnlhVzUwS0hBektWeHVJQ0JrWlhZdWIyWm1LQ2xjYmlBZ2MzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0JjYmlBZ0lDQWdJQ0FnSUNCM2FXUjBhQ0E5SURJc0lHaGxhV2RvZENBOUlEUXBYRzRnSUhCeWFXNTBLSEF6S1Z4dWZWeHVYRzVjYm1sMFpYSmhkR1ZmYkc5dmNGOW1kVzVqZEdsdmJuTWdQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2dabWxuUkdseUxDQm5jbTkxY0U1aGJXVXNJR0Z1Ym05TWFYTjBLWHRjYmlBZ0l5QmpjbVZoZEdWZmJHOXZjRjlrYVhOZmRuTmZjMk52Y21Vb1pHRjBZU3dnWm1sblJHbHlMQ0JuY205MWNFNWhiV1VzSUdGdWJtOU1hWE4wS1Z4dUlDQWpJR055WldGMFpWOXNiMjl3WDJScGMxOTJjMTlrYVdabWMyTnZjbVVvWkdGMFlTd2dabWxuUkdseUxDQm5jbTkxY0U1aGJXVXNJR0Z1Ym05TWFYTjBLVnh1WEc0Z0lHTnlaV0YwWlY5c2IyOXdYM05qWVhSMFpYSndiRzkwS0dSaGRHRXNJR1pwWjBScGNpd2daM0p2ZFhCT1lXMWxMQ0JoYm01dlRHbHpkQ3dnTUM0eUtWeHVJQ0FqSUdOeVpXRjBaVjlzYjI5d1gzTmpZWFIwWlhKd2JHOTBLR1JoZEdFc0lHWnBaMFJwY2l3Z1ozSnZkWEJPWVcxbExDQmhibTV2VEdsemRDd2dNQzR4S1Z4dUlDQWpJRzFoYTJWZlpHbG1abDlpWldSd1pTaGtZWFJoTENCbmNtOTFjRTVoYldVc0lHRnVibTlNYVhOMExDQmpiMjV6Wlc1emRYTkVhWElzSURBdU1pbGNiaUFnSXlCdFlXdGxYMlJwWm1aZlltVmtjR1VvWkdGMFlTd2daM0p2ZFhCT1lXMWxMQ0JoYm01dlRHbHpkQ3dnWTI5dWMyVnVjM1Z6UkdseUxDQXdMakVwWEc1OVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuY3JlYXRlX2xvb3BfZGlzX3ZzX3Njb3JlIDwtIGZ1bmN0aW9uKGRhdGEsIGZpZ0RpciwgbmFtZSwgQW5ubzJMaXN0KXtcbiAgZGF0YSA9IGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBBbm5vMkxpc3QpXG4gIFxuICAjIyMgYmFycGxvdFxuICB0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoaWQsIERNU08sIGRUQUcsIEE0ODUpICU+JVxuICAgIHBpdm90X2xvbmdlcighaWQsIG5hbWVzX3RvID0gXFx0cmVhdG1lbnRcXCwgdmFsdWVzX3RvID0gXFxzY29yZVxcKVxuICB0ZW1wJHRyZWF0bWVudCA8LSBmYWN0b3IodGVtcCR0cmVhdG1lbnQsIGxldmVscyA9IGMoXFxETVNPXFwsIFxcZFRBR1xcLCBcXEE0ODVcXCkpXG4gIFxuICBwMyA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSB0cmVhdG1lbnQsIHkgPSBzY29yZSkpICtcbiAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHRyZWF0bWVudCksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcRE1TT1xcID0gXFxncmV5XFwsIFxcZFRBR1xcID0gXFxwaW5rXFwsIFxcQTQ4NVxcID0gXFxza3libHVlXFwpKSArXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICB5bGltKC0wLjUsIDEpICtcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIGdndGl0bGUobmFtZSkgK1xuICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQpKVxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzY29yZV9iYXJwbG90X1xcLCBuYW1lKVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgXG4gICAgICByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDIsIGhlaWdodCA9IDQpXG4gIHByaW50KHAzKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBcbiAgICAgICAgICB3aWR0aCA9IDIsIGhlaWdodCA9IDQpXG4gIHByaW50KHAzKVxuICBkZXYub2ZmKClcbiAgXG4gICMjIyBEaXN0YW5jZSB2cyBzY29yZVxuICBcbiAgdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgRE1TTywgZFRBRywgQTQ4NSlcblxuICBhdmdfc2NvcmVzIDwtIHRlbXAgJT4lXG4gICAgZ3JvdXBfYnkoZGlzdGFuY2UpICU+JVxuICAgIHN1bW1hcmlzZShhY3Jvc3Moc3RhcnRzX3dpdGgoXFxETVNPXFwpOnN0YXJ0c193aXRoKFxcQTQ4NVxcKSwgbWVhbiwgbmEucm0gPSBUUlVFKSlcblxuICBhdmdfc2NvcmVzX2xvbmcgPC0gYXZnX3Njb3JlcyAlPiVcbiAgICBwaXZvdF9sb25nZXIoY29scyA9IERNU086QTQ4NSwgbmFtZXNfdG8gPSBcXGNvbmRpdGlvblxcLCB2YWx1ZXNfdG8gPSBcXGF2Z19zY29yZVxcKVxuICBhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uIDwtIGZhY3Rvcihhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uLCBsZXZlbHMgPSBjKFxcRE1TT1xcLCBcXGRUQUdcXCwgXFxBNDg1XFwpKVxuICAjIENyZWF0ZSB0aGUgcGxvdFxuICBwNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IGNvbmRpdGlvbiwgZmlsbCA9IGNvbmRpdGlvbikpICtcbiAgICBnZW9tX3Ntb290aChzaG93LmxlZ2VuZCA9IFRSVUUpICsgeWxpbSgwLCAwLjUpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFxETVNPXFwgPSBcXGdyZXlcXCwgXFxkVEFHXFwgPSBcXHBpbmtcXCwgXFxBNDg1XFwgPSBcXHNreWJsdWVcXCkpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcRE1TT1xcID0gXFxncmV5ODBcXCwgXFxkVEFHXFwgPSBcXHBpbmtcXCwgXFxBNDg1XFwgPSBcXHNreWJsdWVcXCkpICtcbiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG5hbWUpLFxuICAgICAgICAgeCA9IFxcRGlzdGFuY2VcXCxcbiAgICAgICAgIHkgPSBcXEF2ZXJhZ2UgU2NvcmVcXCkgK1xuICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKVxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxkaXN0X3ZzX3Njb3JlX2xpbmVQbG90X1xcLCBuYW1lKVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSxcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksXG4gICAgICB3aWR0aCA9IDQsIGhlaWdodCA9IDMpXG4gIHByaW50KHA0KVxuICBkZXYub2ZmKClcbn1cblxuY3JlYXRlX2xvb3BfZGlzX3ZzX2RpZmZzY29yZSA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIEFubm8yTGlzdCl7XG4gIGRhdGEgPSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgQW5ubzJMaXN0KVxuICBcbiAgXG4gIHRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfZFRBR19ETVNPLCBkaWZmX0E0ODVfRE1TTylcbiAgXG4gIGF2Z19zY29yZXMgPC0gdGVtcCAlPiVcbiAgICBncm91cF9ieShkaXN0YW5jZSkgJT4lXG4gICAgc3VtbWFyaXNlKGFjcm9zcygxOjIsIG1lYW4sIG5hLnJtID0gVFJVRSkpXG4gIFxuICBhdmdfc2NvcmVzX2xvbmcgPC0gYXZnX3Njb3JlcyAlPiVcbiAgICBwaXZvdF9sb25nZXIoY29scyA9IDI6MywgbmFtZXNfdG8gPSBcXGNvbmRpdGlvblxcLCB2YWx1ZXNfdG8gPSBcXGF2Z19zY29yZVxcKVxuICBhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uIDwtIGZhY3Rvcihhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhcXGRpZmZfZFRBR19ETVNPXFwsIFxcZGlmZl9BNDg1X0RNU09cXCkpXG4gICMgQ3JlYXRlIHRoZSBwbG90XG4gIHA0IDwtIGdncGxvdChhdmdfc2NvcmVzX2xvbmcsIGFlcyh4ID0gZGlzdGFuY2UsIHkgPSBhdmdfc2NvcmUsIGNvbG9yID0gY29uZGl0aW9uLCBmaWxsID0gY29uZGl0aW9uKSkgK1xuICAgIGdlb21fc21vb3RoKHNob3cubGVnZW5kID0gVFJVRSkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIHlsaW0oLTAuNSwgMC4xKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcZGlmZl9kVEFHX0RNU09cXCA9IFxccGlua1xcLCBcXGRpZmZfQTQ4NV9ETVNPXFwgPSBcXHNreWJsdWVcXCkpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcZGlmZl9kVEFHX0RNU09cXCA9IFxccGlua1xcLCBcXGRpZmZfQTQ4NV9ETVNPXFwgPSBcXHNreWJsdWVcXCkpICtcbiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG5hbWUpLFxuICAgICAgICAgeCA9IFxcRGlzdGFuY2VcXCxcbiAgICAgICAgIHkgPSBcXEF2ZXJhZ2UgRGlmZiBTY29yZVxcKSArXG4gICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGRpc3RfdnNfc2NvcmVfZGlmZmxpbmVQbG90X1xcLCBuYW1lKVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSxcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNC41LCBoZWlnaHQgPSAzKVxuICBwcmludChwNClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSxcbiAgICAgICAgICB3aWR0aCA9IDQuNSwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxufVxuXG5jcmVhdGVfbG9vcF9zY2F0dGVycGxvdCA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIEFubm8yTGlzdCwgZGlmZkN1dG9mZil7XG4gIGRhdGEgPC0gZGF0YSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiBkaWZmQ3V0b2ZmLCBcXFVQXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpLFxuICAgICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSkpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBBbm5vMkxpc3QpXG4gIGRhdGEkdXBkb3duX2RUQUdfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fZFRBR19ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIGRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIFxuICBudW0udXAgPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxVUFxcXVxuICBudW0ubm8gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxOT1xcXVxuICBudW0uZG93biA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVtcXERPV05cXF1cbiAgbnVtLmFsbCA8LSBudW0udXAgKyBudW0ubm8gKyBudW0uZG93blxuICBwZXJjLnVwIDwtIHJvdW5kKG51bS51cCAvIG51bS5hbGwgKiAxMDAsIDIpXG4gIHBlcmMubm8gPC0gcm91bmQobnVtLm5vIC8gbnVtLmFsbCAqIDEwMCwgMilcbiAgcGVyYy5kb3duIDwtIHJvdW5kKG51bS5kb3duIC8gbnVtLmFsbCAqIDEwMCwgMilcbiAgXG4gICMjIyBTY2F0dGVycGxvdFxuICBkYXRhJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoZGF0YSRETVNPLCBkYXRhJGRUQUcsIG4gPSAxMDApXG4gIGRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbiAgY29ycmVsYXRpb24gPC0gY29yKGRhdGEkRE1TTywgZGF0YSRkVEFHKVxuICBwMSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICAgIGdlb21fcG9pbnQoc2l6ZSA9IDEsXG4gICAgICBhbHBoYSA9IDEsXG4gICAgICBzdHJva2UgPSAwKSArIFxuICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gXFxEXFwsIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgKSkgK1xuICAgIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsgY29vcmRfZml4ZWQoKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUwKFxcVVA6IFxcLCBudW0udXAsIFxcIChcXCwgcGVyYy51cCwgXFwlKVxcKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgLCBzaXplID0gMSxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLTAuMSwgbGFiZWwgPSBwYXN0ZTAoXFxOTzogXFwsIG51bS5ubywgXFwgKFxcLCBwZXJjLm5vLCBcXCUpXFwpLCBcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCAsIHNpemUgPSAxLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4yLCBsYWJlbCA9IHBhc3RlMChcXERPV046IFxcLCBudW0uZG93biwgXFwgKFxcLCBwZXJjLmRvd24sIFxcJSlcXCksIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsICwgc2l6ZSA9IDEsXG4gICAgICAgIGZhbWlseSA9IGZvbnRUeXBlKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICAjYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZShcbiAgICAgICMgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBoanVzdCA9IDAuNSxcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGVcbiAgICAgICksXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgKSArXG4gIHhsYWIoXFxMb29wIHNjb3JlXFxuRzEuRE1TT1xcKSArXG4gICAgeWxhYihcXExvb3Agc2NvcmVcXG5HMS5kVEFHXFwpXG4gIFxuICBcbiAgXG4gIG51bS51cCA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9BNDg1X0RNU08pKVtcXFVQXFxdXG4gIG51bS5ubyA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9BNDg1X0RNU08pKVtcXE5PXFxdXG4gIG51bS5kb3duIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX0E0ODVfRE1TTykpW1xcRE9XTlxcXVxuICBudW0uYWxsIDwtIG51bS51cCArIG51bS5ubyArIG51bS5kb3duXG4gIHBlcmMudXAgPC0gcm91bmQobnVtLnVwIC8gbnVtLmFsbCAqIDEwMCwgMilcbiAgcGVyYy5ubyA8LSByb3VuZChudW0ubm8gLyBudW0uYWxsICogMTAwLCAyKVxuICBwZXJjLmRvd24gPC0gcm91bmQobnVtLmRvd24gLyBudW0uYWxsICogMTAwLCAyKVxuICBcbiAgZGF0YSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KGRhdGEkRE1TTywgZGF0YSRBNDg1LCBuID0gMTAwKVxuICBkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG4gIGNvcnJlbGF0aW9uIDwtIGNvcihkYXRhJERNU08sIGRhdGEkQTQ4NSlcbiAgcDIgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gRE1TTywgeSA9IEE0ODUsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgICBnZW9tX3BvaW50KHNpemUgPSAxLFxuICAgICAgYWxwaGEgPSAxLFxuICAgICAgc3Ryb2tlID0gMCkgKyBcbiAgICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9IFxcRFxcLCBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICkpICtcbiAgICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArIGNvb3JkX2ZpeGVkKCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlMChcXFVQOiBcXCwgbnVtLnVwLCBcXCAoXFwsIHBlcmMudXAsIFxcJSlcXCksIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4xLCBsYWJlbCA9IHBhc3RlMChcXE5POiBcXCwgbnVtLm5vLCBcXCAoXFwsIHBlcmMubm8sIFxcJSlcXCksIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4yLCBsYWJlbCA9IHBhc3RlMChcXERPV046IFxcLCBudW0uZG93biwgXFwgKFxcLCBwZXJjLmRvd24sIFxcJSlcXCksIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIFxuICAgICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZShcbiAgICAgICMgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBoanVzdCA9IDAuNSxcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGVcbiAgICAgICksXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgKSArXG4gICAgeGxhYihcXExvb3Agc2NvcmVcXG5HMS5ETVNPXFwpICtcbiAgICB5bGFiKFxcTG9vcCBzY29yZVxcbkcxLkE0ODVcXClcblxuICAgIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaCAgXG4gIFxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpcixwYXN0ZTAoXFxzY2F0dGVycGxvdF9cXCwgbmFtZSwgXFxfZFRBR192c19ETVNPX1xcLCBkaWZmQ3V0b2ZmKSlcblxuICBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPWhlaWdodClcbiAgcHJpbnQocDEpXG4gIGRldi5vZmYoKVxuICBwbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9aGVpZ2h0LCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbiAgXG4gICAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXHNjYXR0ZXJwbG90X1xcLCBuYW1lLCBcXF9BNDg1X3ZzX0RNU09fXFwsIGRpZmZDdXRvZmYpKVxuXG4gIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9aGVpZ2h0KVxuICBwcmludChwMilcbiAgZGV2Lm9mZigpXG4gIHBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID1oZWlnaHQsIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXClcbiAgcHJpbnQocDIpXG4gIGRldi5vZmYoKVxuICBcbiAgIyBcbiAgIyBcbiAgIyBcbiAgIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSA1KjEuNSwgaGVpZ2h0ID0gMi41KjEuNSlcbiAgIyBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgIyBkZXYub2ZmKClcbiAgIyBcbiAgIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAjICAgICAgICAgd2lkdGggPSA1KjEuNSwgaGVpZ2h0ID0gMi41KjEuNSlcbiAgIyBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgIyBkZXYub2ZmKClcbn1cblxubWFrZV9kaWZmX2JlZHBlIDwtIGZ1bmN0aW9uKGRhdGEsIG5hbWUsIEFubm8yTGlzdCwgb3V0RGlyLCBkaWZmQ3V0b2ZmKXtcbiAgZGF0YSA8LSBkYXRhICU+JVxuICAgIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgICB1cGRvd25fQTQ4NV9ETVNPID0gaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIEFubm8yTGlzdClcbiAgZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbiAgZGF0YSR1cGRvd25fQTQ4NV9ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9BNDg1X0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbiAgXG4gIG91dC50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXFVQXFwpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpXG4gIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHdnNETVNPX1VQX2RpZmZcXCwgZGlmZkN1dG9mZiwgXFwuYmVkcGVcXCkpLCBcbiAgICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBvdXQudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9kVEFHX0RNU08gPT0gXFxOT1xcKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYpKVxuICBmd3JpdGUob3V0LnRlbXAsIGhlcmUob3V0RGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR3ZzRE1TT19OT19kaWZmXFwsIGRpZmZDdXRvZmYsIFxcLmJlZHBlXFwpKSwgXG4gICAgICAgICBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbiAgb3V0LnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fZFRBR19ETVNPID09IFxcRE9XTlxcKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYpKVxuICBmd3JpdGUob3V0LnRlbXAsIGhlcmUob3V0RGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR3ZzRE1TT19ET1dOX2RpZmZcXCwgZGlmZkN1dG9mZiwgXFwuYmVkcGVcXCkpLCBcbiAgICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBcbiAgb3V0LnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fQTQ4NV9ETVNPID09IFxcVVBcXCkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2KSlcbiAgZndyaXRlKG91dC50ZW1wLCBoZXJlKG91dERpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODV2c0RNU09fVVBfZGlmZlxcLCBkaWZmQ3V0b2ZmLCBcXC5iZWRwZVxcKSksIFxuICAgICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG4gIG91dC50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX0E0ODVfRE1TTyA9PSBcXE5PXFwpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpXG4gIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1dnNETVNPX05PX2RpZmZcXCwgZGlmZkN1dG9mZiwgXFwuYmVkcGVcXCkpLCBcbiAgICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBvdXQudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gXFxET1dOXFwpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpXG4gIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1dnNETVNPX0RPV05fZGlmZlxcLCBkaWZmQ3V0b2ZmLCBcXC5iZWRwZVxcKSksIFxuICAgICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG59XG5cbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudCA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gRkFMU0Upe1xuICBhdmdfc2NvcmVzX2xvbmcgPC0gZGF0YSAlPiVcbiAgICBncm91cF9ieShkaXN0YW5jZSwgQW5ubzIpICU+JVxuICAgIHN1bW1hcmlzZShhdmdfc2NvcmUgPSBtZWFuKHNjb3JlLCBuYS5ybSA9IFRSVUUpKSAlPiVcbiAgICB1bmdyb3VwKCkgXG4gIGF2Z19zY29yZXNfbG9uZyRBbm5vMiA8LSBmYWN0b3IoYXZnX3Njb3Jlc19sb25nJEFubm8yLCBsZXZlbCA9IGxvb3BMaXN0KVxuICBwNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IEFubm8yLCBmaWxsID0gQW5ubzIpKSArIFxuICAgIGdlb21fc21vb3RoKHNob3cubGVnZW5kID0gVFJVRSwgc2UgPSBzZSkgICtcbiAgICB5bGltKDAsIDAuNSkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KSArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KSArXG4gICAgbGFicyh0aXRsZSA9IHBhc3RlMChuYW1lKSxcbiAgICAgICAgIHggPSBcXERpc3RhbmNlXFwsXG4gICAgICAgICB5ID0gXFxBdmVyYWdlIFNjb3JlXFwpICtcbiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSlcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGRpc3RfdnNfc2NvcmVfbGluZVBsb3RfXFwsIG5hbWUpXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICAgIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxufSBcblxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gRkFMU0Upe1xuICBhdmdfc2NvcmVzX2xvbmcgPC0gZGF0YSAlPiVcbiAgICBncm91cF9ieShkaXN0YW5jZSwgQW5ubzIpICU+JVxuICAgIHN1bW1hcmlzZShhdmdfc2NvcmUgPSBtZWFuKHNjb3JlLCBuYS5ybSA9IFRSVUUpKSAlPiVcbiAgICB1bmdyb3VwKCkgXG4gIGF2Z19zY29yZXNfbG9uZyRBbm5vMiA8LSBmYWN0b3IoYXZnX3Njb3Jlc19sb25nJEFubm8yLCBsZXZlbCA9IGxvb3BMaXN0KVxuICBwNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IEFubm8yLCBmaWxsID0gQW5ubzIpKSArIFxuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgICBnZW9tX3Ntb290aChzaG93LmxlZ2VuZCA9IFRSVUUsIHNlID0gc2UpICArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvckxpc3QpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvckxpc3QpICtcbiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG5hbWUpLFxuICAgICAgICAgeCA9IFxcRGlzdGFuY2VcXCxcbiAgICAgICAgIHkgPSBcXEF2ZXJhZ2UgRGlmZiBTY29yZVxcKSArXG4gICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZGlzdF92c19zY29yZV9kaWZmbGluZVBsb3RfXFwsIG5hbWUpXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICAgIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxufSBcblxuY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50IDwtIGZ1bmN0aW9uKGRhdGEsIGZpZ0RpciwgbmFtZSwgbG9vcExpc3QsIGNvbG9yTGlzdCl7XG4gIGRhdGEkQW5ubzIgPC0gZmFjdG9yKGRhdGEkQW5ubzIsIGxldmVscyA9IGxvb3BMaXN0KVxuICBcbiAgcDMgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gQW5ubzIsIHkgPSBzY29yZSkpICtcbiAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IEFubm8yKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yTGlzdCkgK1xuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgeWxpbSgtMC41LCAxKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcLCBjb2xvciA9IFxcZ3JleVxcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICBnZ3RpdGxlKG5hbWUpICtcbiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA0KSlcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHNjb3JlX2JhclBsb3RfXFwsIG5hbWUpXG4gIFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgXG4gICAgICByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDIsIGhlaWdodCA9IDQpXG4gIHByaW50KHAzKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBcbiAgICAgICAgICB3aWR0aCA9IDIsIGhlaWdodCA9IDQpXG4gIHByaW50KHAzKVxufVxuXG5cbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMgPC0gZnVuY3Rpb24oZGF0YSwgZmlnRGlyLCBncm91cE5hbWUsIGFubm9MaXN0KXtcbiAgIyBjcmVhdGVfbG9vcF9kaXNfdnNfc2NvcmUoZGF0YSwgZmlnRGlyLCBncm91cE5hbWUsIGFubm9MaXN0KVxuICAjIGNyZWF0ZV9sb29wX2Rpc192c19kaWZmc2NvcmUoZGF0YSwgZmlnRGlyLCBncm91cE5hbWUsIGFubm9MaXN0KVxuXG4gIGNyZWF0ZV9sb29wX3NjYXR0ZXJwbG90KGRhdGEsIGZpZ0RpciwgZ3JvdXBOYW1lLCBhbm5vTGlzdCwgMC4yKVxuICAjIGNyZWF0ZV9sb29wX3NjYXR0ZXJwbG90KGRhdGEsIGZpZ0RpciwgZ3JvdXBOYW1lLCBhbm5vTGlzdCwgMC4xKVxuICAjIG1ha2VfZGlmZl9iZWRwZShkYXRhLCBncm91cE5hbWUsIGFubm9MaXN0LCBjb25zZW5zdXNEaXIsIDAuMilcbiAgIyBtYWtlX2RpZmZfYmVkcGUoZGF0YSwgZ3JvdXBOYW1lLCBhbm5vTGlzdCwgY29uc2Vuc3VzRGlyLCAwLjEpXG59XG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
create_loop_dis_vs_score <- function(data, figDir, name, Anno2List){
  data = data %>% dplyr::filter(Anno2 %in% Anno2List)
  
  ### barplot
  temp <- data %>% dplyr::select(id, DMSO, dTAG, A485) %>%
    pivot_longer(!id, names_to = \treatment\, values_to = \score\)
  temp$treatment <- factor(temp$treatment, levels = c(\DMSO\, \dTAG\, \A485\))
  
  p3 <- ggplot(temp, aes(x = treatment, y = score)) +
    geom_violin(aes(fill = treatment), show.legend = FALSE) +
    scale_fill_manual(values = c(\DMSO\ = \grey\, \dTAG\ = \pink\, \A485\ = \skyblue\)) +
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    ylim(-0.5, 1) +
    geom_hline(yintercept = 0, linetype = \dashed\, color = \grey\) +
    theme_classic() +
    ggtitle(name) +
    theme(plot.title = element_text(size = 4))
  fileName <- paste0(\score_barplot_\, name)
  png(here(figDir, paste0(fileName, \.png\)), 
      res = 600, units = \in\, width = 2, height = 4)
  print(p3)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 2, height = 4)
  print(p3)
  dev.off()
  
  ### Distance vs score
  
  temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, DMSO, dTAG, A485)

  avg_scores <- temp %>%
    group_by(distance) %>%
    summarise(across(starts_with(\DMSO\):starts_with(\A485\), mean, na.rm = TRUE))

  avg_scores_long <- avg_scores %>%
    pivot_longer(cols = DMSO:A485, names_to = \condition\, values_to = \avg_score\)
  avg_scores_long$condition <- factor(avg_scores_long$condition, levels = c(\DMSO\, \dTAG\, \A485\))
  # Create the plot
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = condition, fill = condition)) +
    geom_smooth(show.legend = TRUE) + ylim(0, 0.5) +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = c(\DMSO\ = \grey\, \dTAG\ = \pink\, \A485\ = \skyblue\)) +
    scale_fill_manual(values = c(\DMSO\ = \grey80\, \dTAG\ = \pink\, \A485\ = \skyblue\)) +
    labs(title = paste0(name),
         x = \Distance\,
         y = \Average Score\) +
    theme(plot.title = element_text(size = 5))
  fileName <- paste0(\dist_vs_score_linePlot_\, name)
  png(here(figDir, paste0(fileName, \.png\)),
      res = 600, units = \in\, width = 4, height = 3)
  print(p4)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),
      width = 4, height = 3)
  print(p4)
  dev.off()
}

create_loop_dis_vs_diffscore <- function(data, figDir, name, Anno2List){
  data = data %>% dplyr::filter(Anno2 %in% Anno2List)
  
  
  temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_dTAG_DMSO, diff_A485_DMSO)
  
  avg_scores <- temp %>%
    group_by(distance) %>%
    summarise(across(1:2, mean, na.rm = TRUE))
  
  avg_scores_long <- avg_scores %>%
    pivot_longer(cols = 2:3, names_to = \condition\, values_to = \avg_score\)
  avg_scores_long$condition <- factor(avg_scores_long$condition, 
                                      levels = c(\diff_dTAG_DMSO\, \diff_A485_DMSO\))
  # Create the plot
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = condition, fill = condition)) +
    geom_smooth(show.legend = TRUE) + geom_hline(yintercept = 0) + ylim(-0.5, 0.1) +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = c(\diff_dTAG_DMSO\ = \pink\, \diff_A485_DMSO\ = \skyblue\)) +
    scale_fill_manual(values = c(\diff_dTAG_DMSO\ = \pink\, \diff_A485_DMSO\ = \skyblue\)) +
    labs(title = paste0(name),
         x = \Distance\,
         y = \Average Diff Score\) +
    theme(plot.title = element_text(size = 5))
  fileName <- paste0(\dist_vs_score_difflinePlot_\, name)
  png(here(figDir, paste0(fileName, \.png\)),
      res = 600, units = \in\, width = 4.5, height = 3)
  print(p4)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),
          width = 4.5, height = 3)
  print(p4)
  dev.off()
}

create_loop_scatterplot <- function(data, figDir, name, Anno2List, diffCutoff){
  data <- data %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\))) %>%
    dplyr::filter(Anno2 %in% Anno2List)
  data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  
  num.up <- (summary(data$updown_dTAG_DMSO))[\UP\]
  num.no <- (summary(data$updown_dTAG_DMSO))[\NO\]
  num.down <- (summary(data$updown_dTAG_DMSO))[\DOWN\]
  num.all <- num.up + num.no + num.down
  perc.up <- round(num.up / num.all * 100, 2)
  perc.no <- round(num.no / num.all * 100, 2)
  perc.down <- round(num.down / num.all * 100, 2)
  
  ### Scatterplot
  data$density <- get_density(data$DMSO, data$dTAG, n = 100)
  data <- data %>% dplyr::arrange(density)
  correlation <- cor(data$DMSO, data$dTAG)
  p1 <- ggplot(data, aes(x = DMSO, y = dTAG, color = density)) +
    geom_point(size = 1,
      alpha = 1,
      stroke = 0) + 
    scale_color_viridis(option = \D\, guide = guide_colorbar(
                          barwidth = 1.5/5.08,  # Adjust width of the color bar
                          barheight = 15/5.08   # Adjust height of the color bar
                        )) +
    xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    annotate(\text\, x = -0.5, y = 1, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
             color = \black\, hjust = 0, , size = 1,
        family = fontType) +
    annotate(\text\, x = -0.5, y = 1-0.1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
             color = \black\, hjust = 0, , size = 1,
        family = fontType) +
    annotate(\text\, x = -0.5, y = 1-0.2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
             color = \black\, hjust = 0, , size = 1,
        family = fontType) +
    theme_classic() +
    #annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\) +
    theme(
      # legend.position = \none\,
      plot.title = element_text(
        hjust = 0.5,
        size = fontSizeS,
        family = fontType
      ),
      axis.title = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.line = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
    ) +
  xlab(\Loop score\nG1.DMSO\) +
    ylab(\Loop score\nG1.dTAG\)
  
  
  
  num.up <- (summary(data$updown_A485_DMSO))[\UP\]
  num.no <- (summary(data$updown_A485_DMSO))[\NO\]
  num.down <- (summary(data$updown_A485_DMSO))[\DOWN\]
  num.all <- num.up + num.no + num.down
  perc.up <- round(num.up / num.all * 100, 2)
  perc.no <- round(num.no / num.all * 100, 2)
  perc.down <- round(num.down / num.all * 100, 2)
  
  data$density <- get_density(data$DMSO, data$A485, n = 100)
  data <- data %>% dplyr::arrange(density)
  correlation <- cor(data$DMSO, data$A485)
  p2 <- ggplot(data, aes(x = DMSO, y = A485, color = density)) +
    geom_point(size = 1,
      alpha = 1,
      stroke = 0) + 
    scale_color_viridis(option = \D\, guide = guide_colorbar(
                          barwidth = 1.5/5.08,  # Adjust width of the color bar
                          barheight = 15/5.08   # Adjust height of the color bar
                        )) +
    xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    annotate(\text\, x = -0.5, y = 1, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
             color = \black\, hjust = 0, size = 1,
        family = fontType) +
    annotate(\text\, x = -0.5, y = 1-0.1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
             color = \black\, hjust = 0, size = 1,
        family = fontType) +
    annotate(\text\, x = -0.5, y = 1-0.2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
             color = \black\, hjust = 0, size = 1,
        family = fontType) +
    theme_classic() + 
    # annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\) +
    theme(
      # legend.position = \none\,
      plot.title = element_text(
        hjust = 0.5,
        size = fontSizeS,
        family = fontType
      ),
      axis.title = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.line = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
    ) +
    xlab(\Loop score\nG1.DMSO\) +
    ylab(\Loop score\nG1.A485\)

    width <- panelSize(1.5)*mmToInch
  height <- panelSize(1.5)*mmToInch  
  
  fileName <- here(figDir,paste0(\scatterplot_\, name, \_dTAG_vs_DMSO_\, diffCutoff))

  svglite(paste0(fileName, \.svg\), width = width, height =height)
  print(p1)
  dev.off()
  png(paste0(fileName, \.png\), width = width, height =height, res = 600, unit = \in\)
  print(p1)
  dev.off()
  
    fileName <- here(figDir, paste0(\scatterplot_\, name, \_A485_vs_DMSO_\, diffCutoff))

  svglite(paste0(fileName, \.svg\), width = width, height =height)
  print(p2)
  dev.off()
  png(paste0(fileName, \.png\), width = width, height =height, res = 600, unit = \in\)
  print(p2)
  dev.off()
  
  # 
  # 
  # 
  # png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 5*1.5, height = 2.5*1.5)
  # print(cowplot::plot_grid(p1, p2, align = \h\))
  # dev.off()
  # 
  # svglite(here(figDir, paste0(fileName, \.svg\)), 
  #         width = 5*1.5, height = 2.5*1.5)
  # print(cowplot::plot_grid(p1, p2, align = \h\))
  # dev.off()
}

make_diff_bedpe <- function(data, name, Anno2List, outDir, diffCutoff){
  data <- data %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\))) %>%
    dplyr::filter(Anno2 %in% Anno2List)
  data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  
  out.temp <- data %>% dplyr::filter(updown_dTAG_DMSO == \UP\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_dTAGvsDMSO_UP_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_dTAG_DMSO == \NO\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_dTAGvsDMSO_NO_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_dTAG_DMSO == \DOWN\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_dTAGvsDMSO_DOWN_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  
  out.temp <- data %>% dplyr::filter(updown_A485_DMSO == \UP\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_A485vsDMSO_UP_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_A485_DMSO == \NO\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_A485vsDMSO_NO_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_A485_DMSO == \DOWN\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_A485vsDMSO_DOWN_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
}

create_dist_vs_avgScore_perTreatment <- function(data, figDir, name, loopList, colorList, se = FALSE){
  avg_scores_long <- data %>%
    group_by(distance, Anno2) %>%
    summarise(avg_score = mean(score, na.rm = TRUE)) %>%
    ungroup() 
  avg_scores_long$Anno2 <- factor(avg_scores_long$Anno2, level = loopList)
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = Anno2, fill = Anno2)) + 
    geom_smooth(show.legend = TRUE, se = se)  +
    ylim(0, 0.5) +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = colorList) +
    scale_fill_manual(values = colorList) +
    labs(title = paste0(name),
         x = \Distance\,
         y = \Average Score\) +
    theme(plot.title = element_text(size = 8))
  
  fileName <- paste0(\dist_vs_score_linePlot_\, name)
  png(here(figDir, paste0(fileName, \.png\)), 
      res = 600, units = \in\, width = 4, height = 3)
  print(p4)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 4, height = 3)
  print(p4)
  dev.off()
} 

create_dist_vs_avgDiffScore_perTreatment <- function(data, figDir, name, loopList, colorList, se = FALSE){
  avg_scores_long <- data %>%
    group_by(distance, Anno2) %>%
    summarise(avg_score = mean(score, na.rm = TRUE)) %>%
    ungroup() 
  avg_scores_long$Anno2 <- factor(avg_scores_long$Anno2, level = loopList)
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = Anno2, fill = Anno2)) + 
    geom_hline(yintercept = 0) +
    geom_smooth(show.legend = TRUE, se = se)  +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = colorList) +
    scale_fill_manual(values = colorList) +
    labs(title = paste0(name),
         x = \Distance\,
         y = \Average Diff Score\) +
    theme(plot.title = element_text(size = 8)) 
  
  fileName <- paste0(\dist_vs_score_difflinePlot_\, name)
  png(here(figDir, paste0(fileName, \.png\)), 
      res = 600, units = \in\, width = 4, height = 3)
  print(p4)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 4, height = 3)
  print(p4)
  dev.off()
} 

create_score_barplot_perTreatment <- function(data, figDir, name, loopList, colorList){
  data$Anno2 <- factor(data$Anno2, levels = loopList)
  
  p3 <- ggplot(data, aes(x = Anno2, y = score)) +
    geom_violin(aes(fill = Anno2), show.legend = FALSE) +
    scale_fill_manual(values = colorList) +
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    ylim(-0.5, 1) +
    geom_hline(yintercept = 0, linetype = \dashed\, color = \grey\) +
    theme_classic() +
    ggtitle(name) +
    theme(plot.title = element_text(size = 4))
  
  fileName <- paste0(\score_barPlot_\, name)
  
  png(here(figDir, paste0(fileName, \.png\)), 
      res = 600, units = \in\, width = 2, height = 4)
  print(p3)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 2, height = 4)
  print(p3)
}


iterate_loop_functions <- function(data, figDir, groupName, annoList){
  # create_loop_dis_vs_score(data, figDir, groupName, annoList)
  # create_loop_dis_vs_diffscore(data, figDir, groupName, annoList)

  create_loop_scatterplot(data, figDir, groupName, annoList, 0.2)
  # create_loop_scatterplot(data, figDir, groupName, annoList, 0.1)
  # make_diff_bedpe(data, groupName, annoList, consensusDir, 0.2)
  # make_diff_bedpe(data, groupName, annoList, consensusDir, 0.1)
}



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVkzSmxZWFJsWDJ4dmIzQmZaR2x6WDNaelgzTmpiM0psSUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdacFowUnBjaXdnYm1GdFpTd2dRVzV1YnpKTWFYTjBLWHRjYmlBZ1pHRjBZU0E5SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9RVzV1YnpJZ0pXbHVKU0JCYm01dk1reHBjM1FwWEc0Z0lGeHVJQ0FqSXlNZ1ltRnljR3h2ZEZ4dUlDQjBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvYVdRc0lFUk5VMDhzSUdSVVFVY3NJRUUwT0RVcElDVStKVnh1SUNBZ0lIQnBkbTkwWDJ4dmJtZGxjaWdoYVdRc0lHNWhiV1Z6WDNSdklEMGdYRngwY21WaGRHMWxiblJjWEN3Z2RtRnNkV1Z6WDNSdklEMGdYRnh6WTI5eVpWeGNLVnh1SUNCMFpXMXdKSFJ5WldGMGJXVnVkQ0E4TFNCbVlXTjBiM0lvZEdWdGNDUjBjbVZoZEcxbGJuUXNJR3hsZG1Wc2N5QTlJR01vWEZ4RVRWTlBYRndzSUZ4Y1pGUkJSMXhjTENCY1hFRTBPRFZjWENrcFhHNGdJRnh1SUNCd015QThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCMGNtVmhkRzFsYm5Rc0lIa2dQU0J6WTI5eVpTa3BJQ3RjYmlBZ0lDQm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUhSeVpXRjBiV1Z1ZENrc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3RjYmlBZ0lDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjUkUxVFQxeGNJRDBnWEZ4bmNtVjVYRndzSUZ4Y1pGUkJSMXhjSUQwZ1hGeHdhVzVyWEZ3c0lGeGNRVFE0TlZ4Y0lEMGdYRnh6YTNsaWJIVmxYRndwS1NBclhHNGdJQ0FnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUN0Y2JpQWdJQ0I1YkdsdEtDMHdMalVzSURFcElDdGNiaUFnSUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3NJR052Ykc5eUlEMGdYRnhuY21WNVhGd3BJQ3RjYmlBZ0lDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJQ0FnSUdkbmRHbDBiR1VvYm1GdFpTa2dLMXh1SUNBZ0lIUm9aVzFsS0hCc2IzUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFFwS1Z4dUlDQm1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnh6WTI5eVpWOWlZWEp3Ykc5MFgxeGNMQ0J1WVcxbEtWeHVJQ0J3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnWEc0Z0lDQWdJQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUnpJRDBnWEZ4cGJseGNMQ0IzYVdSMGFDQTlJRElzSUdobGFXZG9kQ0E5SURRcFhHNGdJSEJ5YVc1MEtIQXpLVnh1SUNCa1pYWXViMlptS0NsY2JpQWdjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2twTENCY2JpQWdJQ0FnSUNBZ0lDQjNhV1IwYUNBOUlESXNJR2hsYVdkb2RDQTlJRFFwWEc0Z0lIQnlhVzUwS0hBektWeHVJQ0JrWlhZdWIyWm1LQ2xjYmlBZ1hHNGdJQ01qSXlCRWFYTjBZVzVqWlNCMmN5QnpZMjl5WlZ4dUlDQmNiaUFnZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBjM1JoYm1ObElEMGdjM1JoY25ReUlDMGdjM1JoY25ReEtTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGthWE4wWVc1alpTd2dSRTFUVHl3Z1pGUkJSeXdnUVRRNE5TbGNibHh1SUNCaGRtZGZjMk52Y21WeklEd3RJSFJsYlhBZ0pUNGxYRzRnSUNBZ1ozSnZkWEJmWW5rb1pHbHpkR0Z1WTJVcElDVStKVnh1SUNBZ0lITjFiVzFoY21selpTaGhZM0p2YzNNb2MzUmhjblJ6WDNkcGRHZ29YRnhFVFZOUFhGd3BPbk4wWVhKMGMxOTNhWFJvS0Z4Y1FUUTROVnhjS1N3Z2JXVmhiaXdnYm1FdWNtMGdQU0JVVWxWRktTbGNibHh1SUNCaGRtZGZjMk52Y21WelgyeHZibWNnUEMwZ1lYWm5YM05qYjNKbGN5QWxQaVZjYmlBZ0lDQndhWFp2ZEY5c2IyNW5aWElvWTI5c2N5QTlJRVJOVTA4NlFUUTROU3dnYm1GdFpYTmZkRzhnUFNCY1hHTnZibVJwZEdsdmJseGNMQ0IyWVd4MVpYTmZkRzhnUFNCY1hHRjJaMTl6WTI5eVpWeGNLVnh1SUNCaGRtZGZjMk52Y21WelgyeHZibWNrWTI5dVpHbDBhVzl1SUR3dElHWmhZM1J2Y2loaGRtZGZjMk52Y21WelgyeHZibWNrWTI5dVpHbDBhVzl1TENCc1pYWmxiSE1nUFNCaktGeGNSRTFUVDF4Y0xDQmNYR1JVUVVkY1hDd2dYRnhCTkRnMVhGd3BLVnh1SUNBaklFTnlaV0YwWlNCMGFHVWdjR3h2ZEZ4dUlDQndOQ0E4TFNCblozQnNiM1FvWVhablgzTmpiM0psYzE5c2IyNW5MQ0JoWlhNb2VDQTlJR1JwYzNSaGJtTmxMQ0I1SUQwZ1lYWm5YM05qYjNKbExDQmpiMnh2Y2lBOUlHTnZibVJwZEdsdmJpd2dabWxzYkNBOUlHTnZibVJwZEdsdmJpa3BJQ3RjYmlBZ0lDQm5aVzl0WDNOdGIyOTBhQ2h6YUc5M0xteGxaMlZ1WkNBOUlGUlNWVVVwSUNzZ2VXeHBiU2d3TENBd0xqVXBJQ3RjYmlBZ0lDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QWdjMk5oYkdWZmVGOWpiMjUwYVc1MWIzVnpLR3hoWW1Wc2N5QTlJR3hoWW1Wc1gydGlYMjFpS1NBclhHNGdJQ0FnYzJOaGJHVmZZMjlzYjNKZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hGeEVUVk5QWEZ3Z1BTQmNYR2R5WlhsY1hDd2dYRnhrVkVGSFhGd2dQU0JjWEhCcGJtdGNYQ3dnWEZ4Qk5EZzFYRndnUFNCY1hITnJlV0pzZFdWY1hDa3BJQ3RjYmlBZ0lDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjUkUxVFQxeGNJRDBnWEZ4bmNtVjVPREJjWEN3Z1hGeGtWRUZIWEZ3Z1BTQmNYSEJwYm10Y1hDd2dYRnhCTkRnMVhGd2dQU0JjWEhOcmVXSnNkV1ZjWENrcElDdGNiaUFnSUNCc1lXSnpLSFJwZEd4bElEMGdjR0Z6ZEdVd0tHNWhiV1VwTEZ4dUlDQWdJQ0FnSUNBZ2VDQTlJRnhjUkdsemRHRnVZMlZjWEN4Y2JpQWdJQ0FnSUNBZ0lIa2dQU0JjWEVGMlpYSmhaMlVnVTJOdmNtVmNYQ2tnSzF4dUlDQWdJSFJvWlcxbEtIQnNiM1F1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb2MybDZaU0E5SURVcEtWeHVJQ0JtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4a2FYTjBYM1p6WDNOamIzSmxYMnhwYm1WUWJHOTBYMXhjTENCdVlXMWxLVnh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N4Y2JpQWdJQ0FnSUhKbGN5QTlJRFl3TUN3Z2RXNXBkSE1nUFNCY1hHbHVYRndzSUhkcFpIUm9JRDBnTkN3Z2FHVnBaMmgwSUQwZ015bGNiaUFnY0hKcGJuUW9jRFFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0J6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc1hHNGdJQ0FnSUNCM2FXUjBhQ0E5SURRc0lHaGxhV2RvZENBOUlETXBYRzRnSUhCeWFXNTBLSEEwS1Z4dUlDQmtaWFl1YjJabUtDbGNibjFjYmx4dVkzSmxZWFJsWDJ4dmIzQmZaR2x6WDNaelgyUnBabVp6WTI5eVpTQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm1hV2RFYVhJc0lHNWhiV1VzSUVGdWJtOHlUR2x6ZENsN1hHNGdJR1JoZEdFZ1BTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHlJQ1ZwYmlVZ1FXNXViekpNYVhOMEtWeHVJQ0JjYmlBZ1hHNGdJSFJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVNrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbHpkR0Z1WTJVc0lHUnBabVpmWkZSQlIxOUVUVk5QTENCa2FXWm1YMEUwT0RWZlJFMVRUeWxjYmlBZ1hHNGdJR0YyWjE5elkyOXlaWE1nUEMwZ2RHVnRjQ0FsUGlWY2JpQWdJQ0JuY205MWNGOWllU2hrYVhOMFlXNWpaU2tnSlQ0bFhHNGdJQ0FnYzNWdGJXRnlhWE5sS0dGamNtOXpjeWd4T2pJc0lHMWxZVzRzSUc1aExuSnRJRDBnVkZKVlJTa3BYRzRnSUZ4dUlDQmhkbWRmYzJOdmNtVnpYMnh2Ym1jZ1BDMGdZWFpuWDNOamIzSmxjeUFsUGlWY2JpQWdJQ0J3YVhadmRGOXNiMjVuWlhJb1kyOXNjeUE5SURJNk15d2dibUZ0WlhOZmRHOGdQU0JjWEdOdmJtUnBkR2x2Ymx4Y0xDQjJZV3gxWlhOZmRHOGdQU0JjWEdGMloxOXpZMjl5WlZ4Y0tWeHVJQ0JoZG1kZmMyTnZjbVZ6WDJ4dmJtY2tZMjl1WkdsMGFXOXVJRHd0SUdaaFkzUnZjaWhoZG1kZmMyTnZjbVZ6WDJ4dmJtY2tZMjl1WkdsMGFXOXVMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHVjJaV3h6SUQwZ1l5aGNYR1JwWm1aZlpGUkJSMTlFVFZOUFhGd3NJRnhjWkdsbVpsOUJORGcxWDBSTlUwOWNYQ2twWEc0Z0lDTWdRM0psWVhSbElIUm9aU0J3Ykc5MFhHNGdJSEEwSUR3dElHZG5jR3h2ZENoaGRtZGZjMk52Y21WelgyeHZibWNzSUdGbGN5aDRJRDBnWkdsemRHRnVZMlVzSUhrZ1BTQmhkbWRmYzJOdmNtVXNJR052Ykc5eUlEMGdZMjl1WkdsMGFXOXVMQ0JtYVd4c0lEMGdZMjl1WkdsMGFXOXVLU2tnSzF4dUlDQWdJR2RsYjIxZmMyMXZiM1JvS0hOb2IzY3ViR1ZuWlc1a0lEMGdWRkpWUlNrZ0t5Qm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0tTQXJJSGxzYVcwb0xUQXVOU3dnTUM0eEtTQXJYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ0lITmpZV3hsWDNoZlkyOXVkR2x1ZFc5MWN5aHNZV0psYkhNZ1BTQnNZV0psYkY5cllsOXRZaWtnSzF4dUlDQWdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y1pHbG1abDlrVkVGSFgwUk5VMDljWENBOUlGeGNjR2x1YTF4Y0xDQmNYR1JwWm1aZlFUUTROVjlFVFZOUFhGd2dQU0JjWEhOcmVXSnNkV1ZjWENrcElDdGNiaUFnSUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGeGNaR2xtWmw5a1ZFRkhYMFJOVTA5Y1hDQTlJRnhjY0dsdWExeGNMQ0JjWEdScFptWmZRVFE0TlY5RVRWTlBYRndnUFNCY1hITnJlV0pzZFdWY1hDa3BJQ3RjYmlBZ0lDQnNZV0p6S0hScGRHeGxJRDBnY0dGemRHVXdLRzVoYldVcExGeHVJQ0FnSUNBZ0lDQWdlQ0E5SUZ4Y1JHbHpkR0Z1WTJWY1hDeGNiaUFnSUNBZ0lDQWdJSGtnUFNCY1hFRjJaWEpoWjJVZ1JHbG1aaUJUWTI5eVpWeGNLU0FyWEc0Z0lDQWdkR2hsYldVb2NHeHZkQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTlNrcFhHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEdScGMzUmZkbk5mYzJOdmNtVmZaR2xtWm14cGJtVlFiRzkwWDF4Y0xDQnVZVzFsS1Z4dUlDQndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTeGNiaUFnSUNBZ0lISmxjeUE5SURZd01Dd2dkVzVwZEhNZ1BTQmNYR2x1WEZ3c0lIZHBaSFJvSUQwZ05DNDFMQ0JvWldsbmFIUWdQU0F6S1Z4dUlDQndjbWx1ZENod05DbGNiaUFnWkdWMkxtOW1aaWdwWEc0Z0lITjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3hjYmlBZ0lDQWdJQ0FnSUNCM2FXUjBhQ0E5SURRdU5Td2dhR1ZwWjJoMElEMGdNeWxjYmlBZ2NISnBiblFvY0RRcFhHNGdJR1JsZGk1dlptWW9LVnh1ZlZ4dVhHNWpjbVZoZEdWZmJHOXZjRjl6WTJGMGRHVnljR3h2ZENBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbWFXZEVhWElzSUc1aGJXVXNJRUZ1Ym04eVRHbHpkQ3dnWkdsbVprTjFkRzltWmlsN1hHNGdJR1JoZEdFZ1BDMGdaR0YwWVNBbFBpVmNiaUFnSUNCa2NHeDVjam82YlhWMFlYUmxLSFZ3Wkc5M2JsOWtWRUZIWDBSTlUwOGdQU0JwWm1Wc2MyVW9aR2xtWmw5a1ZFRkhYMFJOVTA4Z1BpQmthV1ptUTNWMGIyWm1MQ0JjWEZWUVhGd3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aR2xtWmw5a1ZFRkhYMFJOVTA4Z1BpQXRaR2xtWmtOMWRHOW1aaXdnWEZ4T1QxeGNMQ0JjWEVSUFYwNWNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RYQmtiM2R1WDBFME9EVmZSRTFUVHlBOUlHbG1aV3h6WlNoa2FXWm1YMEUwT0RWZlJFMVRUeUErSUdScFptWkRkWFJ2Wm1Zc0lGeGNWVkJjWEN3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoa2FXWm1YMEUwT0RWZlJFMVRUeUErSUMxa2FXWm1RM1YwYjJabUxDQmNYRTVQWEZ3c0lGeGNSRTlYVGx4Y0tTa3BJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcG1hV3gwWlhJb1FXNXVieklnSldsdUpTQkJibTV2TWt4cGMzUXBYRzRnSUdSaGRHRWtkWEJrYjNkdVgyUlVRVWRmUkUxVFR5QThMU0JtWVdOMGIzSW9aR0YwWVNSMWNHUnZkMjVmWkZSQlIxOUVUVk5QTENCc1pYWmxiSE1nUFNCaktGeGNWVkJjWEN3Z1hGeE9UMXhjTENCY1hFUlBWMDVjWENrcFhHNGdJR1JoZEdFa2RYQmtiM2R1WDBFME9EVmZSRTFUVHlBOExTQm1ZV04wYjNJb1pHRjBZU1IxY0dSdmQyNWZRVFE0TlY5RVRWTlBMQ0JzWlhabGJITWdQU0JqS0Z4Y1ZWQmNYQ3dnWEZ4T1QxeGNMQ0JjWEVSUFYwNWNYQ2twWEc0Z0lGeHVJQ0J1ZFcwdWRYQWdQQzBnS0hOMWJXMWhjbmtvWkdGMFlTUjFjR1J2ZDI1ZlpGUkJSMTlFVFZOUEtTbGJYRnhWVUZ4Y1hWeHVJQ0J1ZFcwdWJtOGdQQzBnS0hOMWJXMWhjbmtvWkdGMFlTUjFjR1J2ZDI1ZlpGUkJSMTlFVFZOUEtTbGJYRnhPVDF4Y1hWeHVJQ0J1ZFcwdVpHOTNiaUE4TFNBb2MzVnRiV0Z5ZVNoa1lYUmhKSFZ3Wkc5M2JsOWtWRUZIWDBSTlUwOHBLVnRjWEVSUFYwNWNYRjFjYmlBZ2JuVnRMbUZzYkNBOExTQnVkVzB1ZFhBZ0t5QnVkVzB1Ym04Z0t5QnVkVzB1Wkc5M2JseHVJQ0J3WlhKakxuVndJRHd0SUhKdmRXNWtLRzUxYlM1MWNDQXZJRzUxYlM1aGJHd2dLaUF4TURBc0lESXBYRzRnSUhCbGNtTXVibThnUEMwZ2NtOTFibVFvYm5WdExtNXZJQzhnYm5WdExtRnNiQ0FxSURFd01Dd2dNaWxjYmlBZ2NHVnlZeTVrYjNkdUlEd3RJSEp2ZFc1a0tHNTFiUzVrYjNkdUlDOGdiblZ0TG1Gc2JDQXFJREV3TUN3Z01pbGNiaUFnWEc0Z0lDTWpJeUJUWTJGMGRHVnljR3h2ZEZ4dUlDQmtZWFJoSkdSbGJuTnBkSGtnUEMwZ1oyVjBYMlJsYm5OcGRIa29aR0YwWVNSRVRWTlBMQ0JrWVhSaEpHUlVRVWNzSUc0Z1BTQXhNREFwWEc0Z0lHUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21GeWNtRnVaMlVvWkdWdWMybDBlU2xjYmlBZ1kyOXljbVZzWVhScGIyNGdQQzBnWTI5eUtHUmhkR0VrUkUxVFR5d2daR0YwWVNSa1ZFRkhLVnh1SUNCd01TQThMU0JuWjNCc2IzUW9aR0YwWVN3Z1lXVnpLSGdnUFNCRVRWTlBMQ0I1SUQwZ1pGUkJSeXdnWTI5c2IzSWdQU0JrWlc1emFYUjVLU2tnSzF4dUlDQWdJR2RsYjIxZmNHOXBiblFvYzJsNlpTQTlJREVzWEc0Z0lDQWdJQ0JoYkhCb1lTQTlJREVzWEc0Z0lDQWdJQ0J6ZEhKdmEyVWdQU0F3S1NBcklGeHVJQ0FnSUhOallXeGxYMk52Ykc5eVgzWnBjbWxrYVhNb2IzQjBhVzl1SUQwZ1hGeEVYRndzSUdkMWFXUmxJRDBnWjNWcFpHVmZZMjlzYjNKaVlYSW9YRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poY25kcFpIUm9JRDBnTVM0MUx6VXVNRGdzSUNBaklFRmthblZ6ZENCM2FXUjBhQ0J2WmlCMGFHVWdZMjlzYjNJZ1ltRnlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poY21obGFXZG9kQ0E5SURFMUx6VXVNRGdnSUNBaklFRmthblZ6ZENCb1pXbG5hSFFnYjJZZ2RHaGxJR052Ykc5eUlHSmhjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLU2tnSzF4dUlDQWdJSGhzYVcwb0xUQXVOU3dnTVNrZ0t5QjViR2x0S0Mwd0xqVXNJREVwSUNzZ1kyOXZjbVJmWm1sNFpXUW9LU0FyWEc0Z0lDQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXdMQ0JqYjJ3Z1BTQmNYR2R5WlhrMU1GeGNMQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3c1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3BJQ3RjYmlBZ0lDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlDMWthV1ptUTNWMGIyWm1MQ0JqYjJ3Z1BTQmNYR2R5WlhsY1hDd2diR2x1WlhSNWNHVWdQU0JjWEdSdmRIUmxaRnhjTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0tTQXJYRzRnSUNBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY1hHZHlaWGxjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1J2ZEhSbFpGeGNMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjS1NBclhHNGdJQ0FnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ3dnWVd4d2FHRWdQU0F3TGpVc0lHTnZiRzl5SUQwZ1hGeG5jbVY1WEZ3c1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3BJQ3RjYmlBZ0lDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjWEdkeVpYbGNYQ3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWENrZ0sxeHVJQ0FnSUdGdWJtOTBZWFJsS0Z4Y2RHVjRkRnhjTENCNElEMGdMVEF1TlN3Z2VTQTlJREVzSUd4aFltVnNJRDBnY0dGemRHVXdLRnhjVlZBNklGeGNMQ0J1ZFcwdWRYQXNJRnhjSUNoY1hDd2djR1Z5WXk1MWNDd2dYRndsS1Z4Y0tTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2dMQ0J6YVhwbElEMGdNU3hjYmlBZ0lDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VwSUN0Y2JpQWdJQ0JoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlDMHdMalVzSUhrZ1BTQXhMVEF1TVN3Z2JHRmlaV3dnUFNCd1lYTjBaVEFvWEZ4T1R6b2dYRndzSUc1MWJTNXVieXdnWEZ3Z0tGeGNMQ0J3WlhKakxtNXZMQ0JjWENVcFhGd3BMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDd2dhR3AxYzNRZ1BTQXdMQ0FzSUhOcGVtVWdQU0F4TEZ4dUlDQWdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlNrZ0sxeHVJQ0FnSUdGdWJtOTBZWFJsS0Z4Y2RHVjRkRnhjTENCNElEMGdMVEF1TlN3Z2VTQTlJREV0TUM0eUxDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hFUlBWMDQ2SUZ4Y0xDQnVkVzB1Wkc5M2Jpd2dYRndnS0Z4Y0xDQndaWEpqTG1SdmQyNHNJRnhjSlNsY1hDa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xDQm9hblZ6ZENBOUlEQXNJQ3dnYzJsNlpTQTlJREVzWEc0Z0lDQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsS1NBclhHNGdJQ0FnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3RjYmlBZ0lDQWpZVzV1YjNSaGRHVW9YRngwWlhoMFhGd3NJSGdnUFNBdE1DNDFMQ0I1SUQwZ01Td2diR0ZpWld3Z1BTQndZWE4wWlNoY1hISWdQVnhjTENCeWIzVnVaQ2hqYjNKeVpXeGhkR2x2Yml3Z01pa3BMQ0J6YVhwbElEMGdOU3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndwSUN0Y2JpQWdJQ0IwYUdWdFpTaGNiaUFnSUNBZ0lDTWdiR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdYRnh1YjI1bFhGd3NYRzRnSUNBZ0lDQndiRzkwTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ0lDQm9hblZ6ZENBOUlEQXVOU3hjYmlBZ0lDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1ZjYmlBZ0lDQWdJQ2tzWEc0Z0lDQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMRnh1SUNBZ0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGeGNkSEpoYm5Od1lYSmxiblJjWENrc1hHNGdJQ0FnS1NBclhHNGdJSGhzWVdJb1hGeE1iMjl3SUhOamIzSmxYRnh1UnpFdVJFMVRUMXhjS1NBclhHNGdJQ0FnZVd4aFlpaGNYRXh2YjNBZ2MyTnZjbVZjWEc1SE1TNWtWRUZIWEZ3cFhHNGdJRnh1SUNCY2JpQWdYRzRnSUc1MWJTNTFjQ0E4TFNBb2MzVnRiV0Z5ZVNoa1lYUmhKSFZ3Wkc5M2JsOUJORGcxWDBSTlUwOHBLVnRjWEZWUVhGeGRYRzRnSUc1MWJTNXVieUE4TFNBb2MzVnRiV0Z5ZVNoa1lYUmhKSFZ3Wkc5M2JsOUJORGcxWDBSTlUwOHBLVnRjWEU1UFhGeGRYRzRnSUc1MWJTNWtiM2R1SUR3dElDaHpkVzF0WVhKNUtHUmhkR0VrZFhCa2IzZHVYMEUwT0RWZlJFMVRUeWtwVzF4Y1JFOVhUbHhjWFZ4dUlDQnVkVzB1WVd4c0lEd3RJRzUxYlM1MWNDQXJJRzUxYlM1dWJ5QXJJRzUxYlM1a2IzZHVYRzRnSUhCbGNtTXVkWEFnUEMwZ2NtOTFibVFvYm5WdExuVndJQzhnYm5WdExtRnNiQ0FxSURFd01Dd2dNaWxjYmlBZ2NHVnlZeTV1YnlBOExTQnliM1Z1WkNodWRXMHVibThnTHlCdWRXMHVZV3hzSUNvZ01UQXdMQ0F5S1Z4dUlDQndaWEpqTG1SdmQyNGdQQzBnY205MWJtUW9iblZ0TG1SdmQyNGdMeUJ1ZFcwdVlXeHNJQ29nTVRBd0xDQXlLVnh1SUNCY2JpQWdaR0YwWVNSa1pXNXphWFI1SUR3dElHZGxkRjlrWlc1emFYUjVLR1JoZEdFa1JFMVRUeXdnWkdGMFlTUkJORGcxTENCdUlEMGdNVEF3S1Z4dUlDQmtZWFJoSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dSbGJuTnBkSGtwWEc0Z0lHTnZjbkpsYkdGMGFXOXVJRHd0SUdOdmNpaGtZWFJoSkVSTlUwOHNJR1JoZEdFa1FUUTROU2xjYmlBZ2NESWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1JFMVRUeXdnZVNBOUlFRTBPRFVzSUdOdmJHOXlJRDBnWkdWdWMybDBlU2twSUN0Y2JpQWdJQ0JuWlc5dFgzQnZhVzUwS0hOcGVtVWdQU0F4TEZ4dUlDQWdJQ0FnWVd4d2FHRWdQU0F4TEZ4dUlDQWdJQ0FnYzNSeWIydGxJRDBnTUNrZ0t5QmNiaUFnSUNCelkyRnNaVjlqYjJ4dmNsOTJhWEpwWkdsektHOXdkR2x2YmlBOUlGeGNSRnhjTENCbmRXbGtaU0E5SUdkMWFXUmxYMk52Ykc5eVltRnlLRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVhKM2FXUjBhQ0E5SURFdU5TODFMakE0TENBZ0l5QkJaR3AxYzNRZ2QybGtkR2dnYjJZZ2RHaGxJR052Ykc5eUlHSmhjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVhKb1pXbG5hSFFnUFNBeE5TODFMakE0SUNBZ0l5QkJaR3AxYzNRZ2FHVnBaMmgwSUc5bUlIUm9aU0JqYjJ4dmNpQmlZWEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2twSUN0Y2JpQWdJQ0I0YkdsdEtDMHdMalVzSURFcElDc2dlV3hwYlNndE1DNDFMQ0F4S1NBcklHTnZiM0prWDJacGVHVmtLQ2tnSzF4dUlDQWdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdNQ3dnWTI5c0lEMGdYRnhuY21WNU5UQmNYQ3dnYkdsdVpYUjVjR1VnUFNCY1hHUmhjMmhsWkZ4Y0xGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNLU0FyWEc0Z0lDQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXRaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYRnhuY21WNVhGd3NJR3hwYm1WMGVYQmxJRDBnWEZ4a2IzUjBaV1JjWEN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hDa2dLMXh1SUNBZ0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2dZMjlzSUQwZ1hGeG5jbVY1WEZ3c0lHeHBibVYwZVhCbElEMGdYRnhrYjNSMFpXUmNYQ3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWENrZ0sxeHVJQ0FnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGeGNaM0psZVZ4Y0xGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNLU0FyWEc0Z0lDQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ01Dd2dZV3h3YUdFZ1BTQXdMalVzSUdOdmJHOXlJRDBnWEZ4bmNtVjVYRndzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3hjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3cElDdGNiaUFnSUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJQzB3TGpVc0lIa2dQU0F4TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjWEZWUU9pQmNYQ3dnYm5WdExuVndMQ0JjWENBb1hGd3NJSEJsY21NdWRYQXNJRnhjSlNsY1hDa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXhMRnh1SUNBZ0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU2tnSzF4dUlDQWdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ0xUQXVOU3dnZVNBOUlERXRNQzR4TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjWEU1UE9pQmNYQ3dnYm5WdExtNXZMQ0JjWENBb1hGd3NJSEJsY21NdWJtOHNJRnhjSlNsY1hDa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXhMRnh1SUNBZ0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU2tnSzF4dUlDQWdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ0xUQXVOU3dnZVNBOUlERXRNQzR5TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjWEVSUFYwNDZJRnhjTENCdWRXMHVaRzkzYml3Z1hGd2dLRnhjTENCd1pYSmpMbVJ2ZDI0c0lGeGNKU2xjWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBeExGeHVJQ0FnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTa2dLMXh1SUNBZ0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0FnSUNNZ1lXNXViM1JoZEdVb1hGeDBaWGgwWEZ3c0lIZ2dQU0F0TUM0MUxDQjVJRDBnTVN3Z2JHRmlaV3dnUFNCd1lYTjBaU2hjWEhJZ1BWeGNMQ0J5YjNWdVpDaGpiM0p5Wld4aGRHbHZiaXdnTWlrcExDQnphWHBsSUQwZ05Td2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BJQ3RjYmlBZ0lDQjBhR1Z0WlNoY2JpQWdJQ0FnSUNNZ2JHVm5aVzVrTG5CdmMybDBhVzl1SUQwZ1hGeHViMjVsWEZ3c1hHNGdJQ0FnSUNCd2JHOTBMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnSUNCb2FuVnpkQ0E5SURBdU5TeGNiaUFnSUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5eGNiaUFnSUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVmNiaUFnSUNBZ0lDa3NYRzRnSUNBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExGeHVJQ0FnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDQWdLU3hjYmlBZ0lDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5eGNiaUFnSUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQWdJQ2tzWEc0Z0lDQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzWEc0Z0lDQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDQWdLU3hjYmlBZ0lDQWdJR0Y0YVhNdWRHbGphM01nUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzWEc0Z0lDQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDQWdLU3hjYmlBZ0lDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ4Y2RISmhibk53WVhKbGJuUmNYQ2tzWEc0Z0lDQWdLU0FyWEc0Z0lDQWdlR3hoWWloY1hFeHZiM0FnYzJOdmNtVmNYRzVITVM1RVRWTlBYRndwSUN0Y2JpQWdJQ0I1YkdGaUtGeGNURzl2Y0NCelkyOXlaVnhjYmtjeExrRTBPRFZjWENsY2JseHVJQ0FnSUhkcFpIUm9JRHd0SUhCaGJtVnNVMmw2WlNneExqVXBLbTF0Vkc5SmJtTm9YRzRnSUdobGFXZG9kQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNDFLU3B0YlZSdlNXNWphQ0FnWEc0Z0lGeHVJQ0JtYVd4bFRtRnRaU0E4TFNCb1pYSmxLR1pwWjBScGNpeHdZWE4wWlRBb1hGeHpZMkYwZEdWeWNHeHZkRjljWEN3Z2JtRnRaU3dnWEZ4ZlpGUkJSMTkyYzE5RVRWTlBYMXhjTENCa2FXWm1RM1YwYjJabUtTbGNibHh1SUNCemRtZHNhWFJsS0hCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwTENCM2FXUjBhQ0E5SUhkcFpIUm9MQ0JvWldsbmFIUWdQV2hsYVdkb2RDbGNiaUFnY0hKcGJuUW9jREVwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0J3Ym1jb2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrc0lIZHBaSFJvSUQwZ2QybGtkR2dzSUdobGFXZG9kQ0E5YUdWcFoyaDBMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3BYRzRnSUhCeWFXNTBLSEF4S1Z4dUlDQmtaWFl1YjJabUtDbGNiaUFnWEc0Z0lDQWdabWxzWlU1aGJXVWdQQzBnYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNoY1hITmpZWFIwWlhKd2JHOTBYMXhjTENCdVlXMWxMQ0JjWEY5Qk5EZzFYM1p6WDBSTlUwOWZYRndzSUdScFptWkRkWFJ2Wm1ZcEtWeHVYRzRnSUhOMloyeHBkR1VvY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2tzSUhkcFpIUm9JRDBnZDJsa2RHZ3NJR2hsYVdkb2RDQTlhR1ZwWjJoMEtWeHVJQ0J3Y21sdWRDaHdNaWxjYmlBZ1pHVjJMbTltWmlncFhHNGdJSEJ1Wnlod1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1N3Z2QybGtkR2dnUFNCM2FXUjBhQ3dnYUdWcFoyaDBJRDFvWldsbmFIUXNJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRnhjYVc1Y1hDbGNiaUFnY0hKcGJuUW9jRElwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0JjYmlBZ0l5QmNiaUFnSXlCY2JpQWdJeUJjYmlBZ0l5QndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMGN5QTlJRnhjYVc1Y1hDd2dkMmxrZEdnZ1BTQTFLakV1TlN3Z2FHVnBaMmgwSUQwZ01pNDFLakV1TlNsY2JpQWdJeUJ3Y21sdWRDaGpiM2R3Ykc5ME9qcHdiRzkwWDJkeWFXUW9jREVzSUhBeUxDQmhiR2xuYmlBOUlGeGNhRnhjS1NsY2JpQWdJeUJrWlhZdWIyWm1LQ2xjYmlBZ0l5QmNiaUFnSXlCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJRnh1SUNBaklDQWdJQ0FnSUNBZ2QybGtkR2dnUFNBMUtqRXVOU3dnYUdWcFoyaDBJRDBnTWk0MUtqRXVOU2xjYmlBZ0l5QndjbWx1ZENoamIzZHdiRzkwT2pwd2JHOTBYMmR5YVdRb2NERXNJSEF5TENCaGJHbG5iaUE5SUZ4Y2FGeGNLU2xjYmlBZ0l5QmtaWFl1YjJabUtDbGNibjFjYmx4dWJXRnJaVjlrYVdabVgySmxaSEJsSUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUc1aGJXVXNJRUZ1Ym04eVRHbHpkQ3dnYjNWMFJHbHlMQ0JrYVdabVEzVjBiMlptS1h0Y2JpQWdaR0YwWVNBOExTQmtZWFJoSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB0ZFhSaGRHVW9kWEJrYjNkdVgyUlVRVWRmUkUxVFR5QTlJR2xtWld4elpTaGthV1ptWDJSVVFVZGZSRTFUVHlBK0lHUnBabVpEZFhSdlptWXNJRnhjVlZCY1hDd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGthV1ptWDJSVVFVZGZSRTFUVHlBK0lDMWthV1ptUTNWMGIyWm1MQ0JjWEU1UFhGd3NJRnhjUkU5WFRseGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMWNHUnZkMjVmUVRRNE5WOUVUVk5QSUQwZ2FXWmxiSE5sS0dScFptWmZRVFE0TlY5RVRWTlBJRDRnWkdsbVprTjFkRzltWml3Z1hGeFZVRnhjTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dScFptWmZRVFE0TlY5RVRWTlBJRDRnTFdScFptWkRkWFJ2Wm1Zc0lGeGNUazljWEN3Z1hGeEVUMWRPWEZ3cEtTa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tWnBiSFJsY2loQmJtNXZNaUFsYVc0bElFRnVibTh5VEdsemRDbGNiaUFnWkdGMFlTUjFjR1J2ZDI1ZlpGUkJSMTlFVFZOUElEd3RJR1poWTNSdmNpaGtZWFJoSkhWd1pHOTNibDlrVkVGSFgwUk5VMDhzSUd4bGRtVnNjeUE5SUdNb1hGeFZVRnhjTENCY1hFNVBYRndzSUZ4Y1JFOVhUbHhjS1NsY2JpQWdaR0YwWVNSMWNHUnZkMjVmUVRRNE5WOUVUVk5QSUR3dElHWmhZM1J2Y2loa1lYUmhKSFZ3Wkc5M2JsOUJORGcxWDBSTlUwOHNJR3hsZG1Wc2N5QTlJR01vWEZ4VlVGeGNMQ0JjWEU1UFhGd3NJRnhjUkU5WFRseGNLU2xjYmlBZ1hHNGdJRzkxZEM1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9kWEJrYjNkdVgyUlVRVWRmUkUxVFR5QTlQU0JjWEZWUVhGd3BJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR01vTVN3Z01pd2dNeXdnTkN3Z05Td2dOaWtwWEc0Z0lHWjNjbWwwWlNodmRYUXVkR1Z0Y0N3Z2FHVnlaU2h2ZFhSRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY1hGOWtWRUZIZG5ORVRWTlBYMVZRWDJScFptWmNYQ3dnWkdsbVprTjFkRzltWml3Z1hGd3VZbVZrY0dWY1hDa3BMQ0JjYmlBZ0lDQWdJQ0FnSUhObGNDQTlJRnhjWEZ4MFhGd3NJR052YkM1dVlXMWxjeUE5SUVaQlRGTkZLVnh1SUNCdmRYUXVkR1Z0Y0NBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hWd1pHOTNibDlrVkVGSFgwUk5VMDhnUFQwZ1hGeE9UMXhjS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNc0lEUXNJRFVzSURZcEtWeHVJQ0JtZDNKcGRHVW9iM1YwTG5SbGJYQXNJR2hsY21Vb2IzVjBSR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnhmWkZSQlIzWnpSRTFUVDE5T1QxOWthV1ptWEZ3c0lHUnBabVpEZFhSdlptWXNJRnhjTG1KbFpIQmxYRndwS1N3Z1hHNGdJQ0FnSUNBZ0lDQnpaWEFnUFNCY1hGeGNkRnhjTENCamIyd3VibUZ0WlhNZ1BTQkdRVXhUUlNsY2JpQWdiM1YwTG5SbGJYQWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaDFjR1J2ZDI1ZlpGUkJSMTlFVFZOUElEMDlJRnhjUkU5WFRseGNLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hqS0RFc0lESXNJRE1zSURRc0lEVXNJRFlwS1Z4dUlDQm1kM0pwZEdVb2IzVjBMblJsYlhBc0lHaGxjbVVvYjNWMFJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hGeGZaRlJCUjNaelJFMVRUMTlFVDFkT1gyUnBabVpjWEN3Z1pHbG1aa04xZEc5bVppd2dYRnd1WW1Wa2NHVmNYQ2twTENCY2JpQWdJQ0FnSUNBZ0lITmxjQ0E5SUZ4Y1hGeDBYRndzSUdOdmJDNXVZVzFsY3lBOUlFWkJURk5GS1Z4dUlDQmNiaUFnYjNWMExuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWgxY0dSdmQyNWZRVFE0TlY5RVRWTlBJRDA5SUZ4Y1ZWQmNYQ2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWXlneExDQXlMQ0F6TENBMExDQTFMQ0EyS1NsY2JpQWdabmR5YVhSbEtHOTFkQzUwWlcxd0xDQm9aWEpsS0c5MWRFUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNYMEUwT0RWMmMwUk5VMDlmVlZCZlpHbG1abHhjTENCa2FXWm1RM1YwYjJabUxDQmNYQzVpWldSd1pWeGNLU2tzSUZ4dUlDQWdJQ0FnSUNBZ2MyVndJRDBnWEZ4Y1hIUmNYQ3dnWTI5c0xtNWhiV1Z6SUQwZ1JrRk1VMFVwWEc0Z0lHOTFkQzUwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2RYQmtiM2R1WDBFME9EVmZSRTFUVHlBOVBTQmNYRTVQWEZ3cElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHTW9NU3dnTWl3Z015d2dOQ3dnTlN3Z05pa3BYRzRnSUdaM2NtbDBaU2h2ZFhRdWRHVnRjQ3dnYUdWeVpTaHZkWFJFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5Qk5EZzFkbk5FVFZOUFgwNVBYMlJwWm1aY1hDd2daR2xtWmtOMWRHOW1aaXdnWEZ3dVltVmtjR1ZjWENrcExDQmNiaUFnSUNBZ0lDQWdJSE5sY0NBOUlGeGNYRngwWEZ3c0lHTnZiQzV1WVcxbGN5QTlJRVpCVEZORktWeHVJQ0J2ZFhRdWRHVnRjQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSFZ3Wkc5M2JsOUJORGcxWDBSTlUwOGdQVDBnWEZ4RVQxZE9YRndwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dNb01Td2dNaXdnTXl3Z05Dd2dOU3dnTmlrcFhHNGdJR1ozY21sMFpTaHZkWFF1ZEdWdGNDd2dhR1Z5WlNodmRYUkVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNYRjlCTkRnMWRuTkVUVk5QWDBSUFYwNWZaR2xtWmx4Y0xDQmthV1ptUTNWMGIyWm1MQ0JjWEM1aVpXUndaVnhjS1Nrc0lGeHVJQ0FnSUNBZ0lDQWdjMlZ3SUQwZ1hGeGNYSFJjWEN3Z1kyOXNMbTVoYldWeklEMGdSa0ZNVTBVcFhHNTlYRzVjYm1OeVpXRjBaVjlrYVhOMFgzWnpYMkYyWjFOamIzSmxYM0JsY2xSeVpXRjBiV1Z1ZENBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbWFXZEVhWElzSUc1aGJXVXNJR3h2YjNCTWFYTjBMQ0JqYjJ4dmNreHBjM1FzSUhObElEMGdSa0ZNVTBVcGUxeHVJQ0JoZG1kZmMyTnZjbVZ6WDJ4dmJtY2dQQzBnWkdGMFlTQWxQaVZjYmlBZ0lDQm5jbTkxY0Y5aWVTaGthWE4wWVc1alpTd2dRVzV1YnpJcElDVStKVnh1SUNBZ0lITjFiVzFoY21selpTaGhkbWRmYzJOdmNtVWdQU0J0WldGdUtITmpiM0psTENCdVlTNXliU0E5SUZSU1ZVVXBLU0FsUGlWY2JpQWdJQ0IxYm1keWIzVndLQ2tnWEc0Z0lHRjJaMTl6WTI5eVpYTmZiRzl1WnlSQmJtNXZNaUE4TFNCbVlXTjBiM0lvWVhablgzTmpiM0psYzE5c2IyNW5KRUZ1Ym04eUxDQnNaWFpsYkNBOUlHeHZiM0JNYVhOMEtWeHVJQ0J3TkNBOExTQm5aM0JzYjNRb1lYWm5YM05qYjNKbGMxOXNiMjVuTENCaFpYTW9lQ0E5SUdScGMzUmhibU5sTENCNUlEMGdZWFpuWDNOamIzSmxMQ0JqYjJ4dmNpQTlJRUZ1Ym04eUxDQm1hV3hzSUQwZ1FXNXVieklwS1NBcklGeHVJQ0FnSUdkbGIyMWZjMjF2YjNSb0tITm9iM2N1YkdWblpXNWtJRDBnVkZKVlJTd2djMlVnUFNCelpTa2dJQ3RjYmlBZ0lDQjViR2x0S0RBc0lEQXVOU2tnSzF4dUlDQWdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJQ0J6WTJGc1pWOTRYMk52Ym5ScGJuVnZkWE1vYkdGaVpXeHpJRDBnYkdGaVpXeGZhMkpmYldJcElDdGNiaUFnSUNCelkyRnNaVjlqYjJ4dmNsOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1kyOXNiM0pNYVhOMEtTQXJYRzRnSUNBZ2MyTmhiR1ZmWm1sc2JGOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1kyOXNiM0pNYVhOMEtTQXJYRzRnSUNBZ2JHRmljeWgwYVhSc1pTQTlJSEJoYzNSbE1DaHVZVzFsS1N4Y2JpQWdJQ0FnSUNBZ0lIZ2dQU0JjWEVScGMzUmhibU5sWEZ3c1hHNGdJQ0FnSUNBZ0lDQjVJRDBnWEZ4QmRtVnlZV2RsSUZOamIzSmxYRndwSUN0Y2JpQWdJQ0IwYUdWdFpTaHdiRzkwTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBNEtTbGNiaUFnWEc0Z0lHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYR1JwYzNSZmRuTmZjMk52Y21WZmJHbHVaVkJzYjNSZlhGd3NJRzVoYldVcFhHNGdJSEJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0JjYmlBZ0lDQWdJSEpsY3lBOUlEWXdNQ3dnZFc1cGRITWdQU0JjWEdsdVhGd3NJSGRwWkhSb0lEMGdOQ3dnYUdWcFoyaDBJRDBnTXlsY2JpQWdjSEpwYm5Rb2NEUXBYRzRnSUdSbGRpNXZabVlvS1Z4dUlDQnpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUZ4dUlDQWdJQ0FnSUNBZ0lIZHBaSFJvSUQwZ05Dd2dhR1ZwWjJoMElEMGdNeWxjYmlBZ2NISnBiblFvY0RRcFhHNGdJR1JsZGk1dlptWW9LVnh1ZlNCY2JseHVZM0psWVhSbFgyUnBjM1JmZG5OZllYWm5SR2xtWmxOamIzSmxYM0JsY2xSeVpXRjBiV1Z1ZENBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbWFXZEVhWElzSUc1aGJXVXNJR3h2YjNCTWFYTjBMQ0JqYjJ4dmNreHBjM1FzSUhObElEMGdSa0ZNVTBVcGUxeHVJQ0JoZG1kZmMyTnZjbVZ6WDJ4dmJtY2dQQzBnWkdGMFlTQWxQaVZjYmlBZ0lDQm5jbTkxY0Y5aWVTaGthWE4wWVc1alpTd2dRVzV1YnpJcElDVStKVnh1SUNBZ0lITjFiVzFoY21selpTaGhkbWRmYzJOdmNtVWdQU0J0WldGdUtITmpiM0psTENCdVlTNXliU0E5SUZSU1ZVVXBLU0FsUGlWY2JpQWdJQ0IxYm1keWIzVndLQ2tnWEc0Z0lHRjJaMTl6WTI5eVpYTmZiRzl1WnlSQmJtNXZNaUE4TFNCbVlXTjBiM0lvWVhablgzTmpiM0psYzE5c2IyNW5KRUZ1Ym04eUxDQnNaWFpsYkNBOUlHeHZiM0JNYVhOMEtWeHVJQ0J3TkNBOExTQm5aM0JzYjNRb1lYWm5YM05qYjNKbGMxOXNiMjVuTENCaFpYTW9lQ0E5SUdScGMzUmhibU5sTENCNUlEMGdZWFpuWDNOamIzSmxMQ0JqYjJ4dmNpQTlJRUZ1Ym04eUxDQm1hV3hzSUQwZ1FXNXVieklwS1NBcklGeHVJQ0FnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdJQ0JuWlc5dFgzTnRiMjkwYUNoemFHOTNMbXhsWjJWdVpDQTlJRlJTVlVVc0lITmxJRDBnYzJVcElDQXJYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ0lITmpZV3hsWDNoZlkyOXVkR2x1ZFc5MWN5aHNZV0psYkhNZ1BTQnNZV0psYkY5cllsOXRZaWtnSzF4dUlDQWdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqYjJ4dmNreHBjM1FwSUN0Y2JpQWdJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqYjJ4dmNreHBjM1FwSUN0Y2JpQWdJQ0JzWVdKektIUnBkR3hsSUQwZ2NHRnpkR1V3S0c1aGJXVXBMRnh1SUNBZ0lDQWdJQ0FnZUNBOUlGeGNSR2x6ZEdGdVkyVmNYQ3hjYmlBZ0lDQWdJQ0FnSUhrZ1BTQmNYRUYyWlhKaFoyVWdSR2xtWmlCVFkyOXlaVnhjS1NBclhHNGdJQ0FnZEdobGJXVW9jR3h2ZEM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ09Da3BJRnh1SUNCY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjWkdsemRGOTJjMTl6WTI5eVpWOWthV1ptYkdsdVpWQnNiM1JmWEZ3c0lHNWhiV1VwWEc0Z0lIQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQmNiaUFnSUNBZ0lISmxjeUE5SURZd01Dd2dkVzVwZEhNZ1BTQmNYR2x1WEZ3c0lIZHBaSFJvSUQwZ05Dd2dhR1ZwWjJoMElEMGdNeWxjYmlBZ2NISnBiblFvY0RRcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJRnh1SUNBZ0lDQWdJQ0FnSUhkcFpIUm9JRDBnTkN3Z2FHVnBaMmgwSUQwZ015bGNiaUFnY0hKcGJuUW9jRFFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVmU0JjYmx4dVkzSmxZWFJsWDNOamIzSmxYMkpoY25Cc2IzUmZjR1Z5VkhKbFlYUnRaVzUwSUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdacFowUnBjaXdnYm1GdFpTd2diRzl2Y0V4cGMzUXNJR052Ykc5eVRHbHpkQ2w3WEc0Z0lHUmhkR0VrUVc1dWJ6SWdQQzBnWm1GamRHOXlLR1JoZEdFa1FXNXVieklzSUd4bGRtVnNjeUE5SUd4dmIzQk1hWE4wS1Z4dUlDQmNiaUFnY0RNZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnUVc1dWJ6SXNJSGtnUFNCelkyOXlaU2twSUN0Y2JpQWdJQ0JuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlFRnVibTh5S1N3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLMXh1SUNBZ0lITmpZV3hsWDJacGJHeGZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTnZiRzl5VEdsemRDa2dLMXh1SUNBZ0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJYRzRnSUNBZ2VXeHBiU2d0TUM0MUxDQXhLU0FyWEc0Z0lDQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Dd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjTENCamIyeHZjaUE5SUZ4Y1ozSmxlVnhjS1NBclhHNGdJQ0FnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3RjYmlBZ0lDQm5aM1JwZEd4bEtHNWhiV1VwSUN0Y2JpQWdJQ0IwYUdWdFpTaHdiRzkwTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBMEtTbGNiaUFnWEc0Z0lHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYSE5qYjNKbFgySmhjbEJzYjNSZlhGd3NJRzVoYldVcFhHNGdJRnh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z1hHNGdJQ0FnSUNCeVpYTWdQU0EyTURBc0lIVnVhWFJ6SUQwZ1hGeHBibHhjTENCM2FXUjBhQ0E5SURJc0lHaGxhV2RvZENBOUlEUXBYRzRnSUhCeWFXNTBLSEF6S1Z4dUlDQmtaWFl1YjJabUtDbGNiaUFnYzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQmNiaUFnSUNBZ0lDQWdJQ0IzYVdSMGFDQTlJRElzSUdobGFXZG9kQ0E5SURRcFhHNGdJSEJ5YVc1MEtIQXpLVnh1ZlZ4dVhHNWNibWwwWlhKaGRHVmZiRzl2Y0Y5bWRXNWpkR2x2Ym5NZ1BDMGdablZ1WTNScGIyNG9aR0YwWVN3Z1ptbG5SR2x5TENCbmNtOTFjRTVoYldVc0lHRnVibTlNYVhOMEtYdGNiaUFnSXlCamNtVmhkR1ZmYkc5dmNGOWthWE5mZG5OZmMyTnZjbVVvWkdGMFlTd2dabWxuUkdseUxDQm5jbTkxY0U1aGJXVXNJR0Z1Ym05TWFYTjBLVnh1SUNBaklHTnlaV0YwWlY5c2IyOXdYMlJwYzE5MmMxOWthV1ptYzJOdmNtVW9aR0YwWVN3Z1ptbG5SR2x5TENCbmNtOTFjRTVoYldVc0lHRnVibTlNYVhOMEtWeHVYRzRnSUdOeVpXRjBaVjlzYjI5d1gzTmpZWFIwWlhKd2JHOTBLR1JoZEdFc0lHWnBaMFJwY2l3Z1ozSnZkWEJPWVcxbExDQmhibTV2VEdsemRDd2dNQzR5S1Z4dUlDQWpJR055WldGMFpWOXNiMjl3WDNOallYUjBaWEp3Ykc5MEtHUmhkR0VzSUdacFowUnBjaXdnWjNKdmRYQk9ZVzFsTENCaGJtNXZUR2x6ZEN3Z01DNHhLVnh1SUNBaklHMWhhMlZmWkdsbVpsOWlaV1J3WlNoa1lYUmhMQ0JuY205MWNFNWhiV1VzSUdGdWJtOU1hWE4wTENCamIyNXpaVzV6ZFhORWFYSXNJREF1TWlsY2JpQWdJeUJ0WVd0bFgyUnBabVpmWW1Wa2NHVW9aR0YwWVN3Z1ozSnZkWEJPWVcxbExDQmhibTV2VEdsemRDd2dZMjl1YzJWdWMzVnpSR2x5TENBd0xqRXBYRzU5WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuY3JlYXRlX2xvb3BfZGlzX3ZzX3Njb3JlIDwtIGZ1bmN0aW9uKGRhdGEsIGZpZ0RpciwgbmFtZSwgQW5ubzJMaXN0KXtcbiAgZGF0YSA9IGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBBbm5vMkxpc3QpXG4gIFxuICAjIyMgYmFycGxvdFxuICB0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoaWQsIERNU08sIGRUQUcsIEE0ODUpICU+JVxuICAgIHBpdm90X2xvbmdlcighaWQsIG5hbWVzX3RvID0gXFx0cmVhdG1lbnRcXCwgdmFsdWVzX3RvID0gXFxzY29yZVxcKVxuICB0ZW1wJHRyZWF0bWVudCA8LSBmYWN0b3IodGVtcCR0cmVhdG1lbnQsIGxldmVscyA9IGMoXFxETVNPXFwsIFxcZFRBR1xcLCBcXEE0ODVcXCkpXG4gIFxuICBwMyA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSB0cmVhdG1lbnQsIHkgPSBzY29yZSkpICtcbiAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHRyZWF0bWVudCksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcRE1TT1xcID0gXFxncmV5XFwsIFxcZFRBR1xcID0gXFxwaW5rXFwsIFxcQTQ4NVxcID0gXFxza3libHVlXFwpKSArXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICB5bGltKC0wLjUsIDEpICtcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIGdndGl0bGUobmFtZSkgK1xuICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQpKVxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzY29yZV9iYXJwbG90X1xcLCBuYW1lKVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgXG4gICAgICByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDIsIGhlaWdodCA9IDQpXG4gIHByaW50KHAzKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBcbiAgICAgICAgICB3aWR0aCA9IDIsIGhlaWdodCA9IDQpXG4gIHByaW50KHAzKVxuICBkZXYub2ZmKClcbiAgXG4gICMjIyBEaXN0YW5jZSB2cyBzY29yZVxuICBcbiAgdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgRE1TTywgZFRBRywgQTQ4NSlcblxuICBhdmdfc2NvcmVzIDwtIHRlbXAgJT4lXG4gICAgZ3JvdXBfYnkoZGlzdGFuY2UpICU+JVxuICAgIHN1bW1hcmlzZShhY3Jvc3Moc3RhcnRzX3dpdGgoXFxETVNPXFwpOnN0YXJ0c193aXRoKFxcQTQ4NVxcKSwgbWVhbiwgbmEucm0gPSBUUlVFKSlcblxuICBhdmdfc2NvcmVzX2xvbmcgPC0gYXZnX3Njb3JlcyAlPiVcbiAgICBwaXZvdF9sb25nZXIoY29scyA9IERNU086QTQ4NSwgbmFtZXNfdG8gPSBcXGNvbmRpdGlvblxcLCB2YWx1ZXNfdG8gPSBcXGF2Z19zY29yZVxcKVxuICBhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uIDwtIGZhY3Rvcihhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uLCBsZXZlbHMgPSBjKFxcRE1TT1xcLCBcXGRUQUdcXCwgXFxBNDg1XFwpKVxuICAjIENyZWF0ZSB0aGUgcGxvdFxuICBwNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IGNvbmRpdGlvbiwgZmlsbCA9IGNvbmRpdGlvbikpICtcbiAgICBnZW9tX3Ntb290aChzaG93LmxlZ2VuZCA9IFRSVUUpICsgeWxpbSgwLCAwLjUpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFxETVNPXFwgPSBcXGdyZXlcXCwgXFxkVEFHXFwgPSBcXHBpbmtcXCwgXFxBNDg1XFwgPSBcXHNreWJsdWVcXCkpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcRE1TT1xcID0gXFxncmV5ODBcXCwgXFxkVEFHXFwgPSBcXHBpbmtcXCwgXFxBNDg1XFwgPSBcXHNreWJsdWVcXCkpICtcbiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG5hbWUpLFxuICAgICAgICAgeCA9IFxcRGlzdGFuY2VcXCxcbiAgICAgICAgIHkgPSBcXEF2ZXJhZ2UgU2NvcmVcXCkgK1xuICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKVxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxkaXN0X3ZzX3Njb3JlX2xpbmVQbG90X1xcLCBuYW1lKVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSxcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksXG4gICAgICB3aWR0aCA9IDQsIGhlaWdodCA9IDMpXG4gIHByaW50KHA0KVxuICBkZXYub2ZmKClcbn1cblxuY3JlYXRlX2xvb3BfZGlzX3ZzX2RpZmZzY29yZSA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIEFubm8yTGlzdCl7XG4gIGRhdGEgPSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgQW5ubzJMaXN0KVxuICBcbiAgXG4gIHRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfZFRBR19ETVNPLCBkaWZmX0E0ODVfRE1TTylcbiAgXG4gIGF2Z19zY29yZXMgPC0gdGVtcCAlPiVcbiAgICBncm91cF9ieShkaXN0YW5jZSkgJT4lXG4gICAgc3VtbWFyaXNlKGFjcm9zcygxOjIsIG1lYW4sIG5hLnJtID0gVFJVRSkpXG4gIFxuICBhdmdfc2NvcmVzX2xvbmcgPC0gYXZnX3Njb3JlcyAlPiVcbiAgICBwaXZvdF9sb25nZXIoY29scyA9IDI6MywgbmFtZXNfdG8gPSBcXGNvbmRpdGlvblxcLCB2YWx1ZXNfdG8gPSBcXGF2Z19zY29yZVxcKVxuICBhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uIDwtIGZhY3Rvcihhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhcXGRpZmZfZFRBR19ETVNPXFwsIFxcZGlmZl9BNDg1X0RNU09cXCkpXG4gICMgQ3JlYXRlIHRoZSBwbG90XG4gIHA0IDwtIGdncGxvdChhdmdfc2NvcmVzX2xvbmcsIGFlcyh4ID0gZGlzdGFuY2UsIHkgPSBhdmdfc2NvcmUsIGNvbG9yID0gY29uZGl0aW9uLCBmaWxsID0gY29uZGl0aW9uKSkgK1xuICAgIGdlb21fc21vb3RoKHNob3cubGVnZW5kID0gVFJVRSkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIHlsaW0oLTAuNSwgMC4xKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcZGlmZl9kVEFHX0RNU09cXCA9IFxccGlua1xcLCBcXGRpZmZfQTQ4NV9ETVNPXFwgPSBcXHNreWJsdWVcXCkpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcZGlmZl9kVEFHX0RNU09cXCA9IFxccGlua1xcLCBcXGRpZmZfQTQ4NV9ETVNPXFwgPSBcXHNreWJsdWVcXCkpICtcbiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG5hbWUpLFxuICAgICAgICAgeCA9IFxcRGlzdGFuY2VcXCxcbiAgICAgICAgIHkgPSBcXEF2ZXJhZ2UgRGlmZiBTY29yZVxcKSArXG4gICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGRpc3RfdnNfc2NvcmVfZGlmZmxpbmVQbG90X1xcLCBuYW1lKVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSxcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNC41LCBoZWlnaHQgPSAzKVxuICBwcmludChwNClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSxcbiAgICAgICAgICB3aWR0aCA9IDQuNSwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxufVxuXG5jcmVhdGVfbG9vcF9zY2F0dGVycGxvdCA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIEFubm8yTGlzdCwgZGlmZkN1dG9mZil7XG4gIGRhdGEgPC0gZGF0YSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiBkaWZmQ3V0b2ZmLCBcXFVQXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpLFxuICAgICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSkpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBBbm5vMkxpc3QpXG4gIGRhdGEkdXBkb3duX2RUQUdfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fZFRBR19ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIGRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIFxuICBudW0udXAgPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxVUFxcXVxuICBudW0ubm8gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxOT1xcXVxuICBudW0uZG93biA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVtcXERPV05cXF1cbiAgbnVtLmFsbCA8LSBudW0udXAgKyBudW0ubm8gKyBudW0uZG93blxuICBwZXJjLnVwIDwtIHJvdW5kKG51bS51cCAvIG51bS5hbGwgKiAxMDAsIDIpXG4gIHBlcmMubm8gPC0gcm91bmQobnVtLm5vIC8gbnVtLmFsbCAqIDEwMCwgMilcbiAgcGVyYy5kb3duIDwtIHJvdW5kKG51bS5kb3duIC8gbnVtLmFsbCAqIDEwMCwgMilcbiAgXG4gICMjIyBTY2F0dGVycGxvdFxuICBkYXRhJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoZGF0YSRETVNPLCBkYXRhJGRUQUcsIG4gPSAxMDApXG4gIGRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbiAgY29ycmVsYXRpb24gPC0gY29yKGRhdGEkRE1TTywgZGF0YSRkVEFHKVxuICBwMSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICAgIGdlb21fcG9pbnQoc2l6ZSA9IDEsXG4gICAgICBhbHBoYSA9IDEsXG4gICAgICBzdHJva2UgPSAwKSArIFxuICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gXFxEXFwsIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgKSkgK1xuICAgIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsgY29vcmRfZml4ZWQoKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUwKFxcVVA6IFxcLCBudW0udXAsIFxcIChcXCwgcGVyYy51cCwgXFwlKVxcKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgLCBzaXplID0gMSxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLTAuMSwgbGFiZWwgPSBwYXN0ZTAoXFxOTzogXFwsIG51bS5ubywgXFwgKFxcLCBwZXJjLm5vLCBcXCUpXFwpLCBcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCAsIHNpemUgPSAxLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4yLCBsYWJlbCA9IHBhc3RlMChcXERPV046IFxcLCBudW0uZG93biwgXFwgKFxcLCBwZXJjLmRvd24sIFxcJSlcXCksIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsICwgc2l6ZSA9IDEsXG4gICAgICAgIGZhbWlseSA9IGZvbnRUeXBlKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICAjYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZShcbiAgICAgICMgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBoanVzdCA9IDAuNSxcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGVcbiAgICAgICksXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgKSArXG4gIHhsYWIoXFxMb29wIHNjb3JlXFxuRzEuRE1TT1xcKSArXG4gICAgeWxhYihcXExvb3Agc2NvcmVcXG5HMS5kVEFHXFwpXG4gIFxuICBcbiAgXG4gIG51bS51cCA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9BNDg1X0RNU08pKVtcXFVQXFxdXG4gIG51bS5ubyA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9BNDg1X0RNU08pKVtcXE5PXFxdXG4gIG51bS5kb3duIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX0E0ODVfRE1TTykpW1xcRE9XTlxcXVxuICBudW0uYWxsIDwtIG51bS51cCArIG51bS5ubyArIG51bS5kb3duXG4gIHBlcmMudXAgPC0gcm91bmQobnVtLnVwIC8gbnVtLmFsbCAqIDEwMCwgMilcbiAgcGVyYy5ubyA8LSByb3VuZChudW0ubm8gLyBudW0uYWxsICogMTAwLCAyKVxuICBwZXJjLmRvd24gPC0gcm91bmQobnVtLmRvd24gLyBudW0uYWxsICogMTAwLCAyKVxuICBcbiAgZGF0YSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KGRhdGEkRE1TTywgZGF0YSRBNDg1LCBuID0gMTAwKVxuICBkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG4gIGNvcnJlbGF0aW9uIDwtIGNvcihkYXRhJERNU08sIGRhdGEkQTQ4NSlcbiAgcDIgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gRE1TTywgeSA9IEE0ODUsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgICBnZW9tX3BvaW50KHNpemUgPSAxLFxuICAgICAgYWxwaGEgPSAxLFxuICAgICAgc3Ryb2tlID0gMCkgKyBcbiAgICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9IFxcRFxcLCBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICkpICtcbiAgICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArIGNvb3JkX2ZpeGVkKCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlMChcXFVQOiBcXCwgbnVtLnVwLCBcXCAoXFwsIHBlcmMudXAsIFxcJSlcXCksIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4xLCBsYWJlbCA9IHBhc3RlMChcXE5POiBcXCwgbnVtLm5vLCBcXCAoXFwsIHBlcmMubm8sIFxcJSlcXCksIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4yLCBsYWJlbCA9IHBhc3RlMChcXERPV046IFxcLCBudW0uZG93biwgXFwgKFxcLCBwZXJjLmRvd24sIFxcJSlcXCksIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIFxuICAgICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZShcbiAgICAgICMgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBoanVzdCA9IDAuNSxcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGVcbiAgICAgICksXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgKSArXG4gICAgeGxhYihcXExvb3Agc2NvcmVcXG5HMS5ETVNPXFwpICtcbiAgICB5bGFiKFxcTG9vcCBzY29yZVxcbkcxLkE0ODVcXClcblxuICAgIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaCAgXG4gIFxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpcixwYXN0ZTAoXFxzY2F0dGVycGxvdF9cXCwgbmFtZSwgXFxfZFRBR192c19ETVNPX1xcLCBkaWZmQ3V0b2ZmKSlcblxuICBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPWhlaWdodClcbiAgcHJpbnQocDEpXG4gIGRldi5vZmYoKVxuICBwbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9aGVpZ2h0LCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbiAgXG4gICAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXHNjYXR0ZXJwbG90X1xcLCBuYW1lLCBcXF9BNDg1X3ZzX0RNU09fXFwsIGRpZmZDdXRvZmYpKVxuXG4gIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9aGVpZ2h0KVxuICBwcmludChwMilcbiAgZGV2Lm9mZigpXG4gIHBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID1oZWlnaHQsIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXClcbiAgcHJpbnQocDIpXG4gIGRldi5vZmYoKVxuICBcbiAgIyBcbiAgIyBcbiAgIyBcbiAgIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSA1KjEuNSwgaGVpZ2h0ID0gMi41KjEuNSlcbiAgIyBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgIyBkZXYub2ZmKClcbiAgIyBcbiAgIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAjICAgICAgICAgd2lkdGggPSA1KjEuNSwgaGVpZ2h0ID0gMi41KjEuNSlcbiAgIyBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgIyBkZXYub2ZmKClcbn1cblxubWFrZV9kaWZmX2JlZHBlIDwtIGZ1bmN0aW9uKGRhdGEsIG5hbWUsIEFubm8yTGlzdCwgb3V0RGlyLCBkaWZmQ3V0b2ZmKXtcbiAgZGF0YSA8LSBkYXRhICU+JVxuICAgIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgICB1cGRvd25fQTQ4NV9ETVNPID0gaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIEFubm8yTGlzdClcbiAgZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbiAgZGF0YSR1cGRvd25fQTQ4NV9ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9BNDg1X0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbiAgXG4gIG91dC50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXFVQXFwpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpXG4gIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHdnNETVNPX1VQX2RpZmZcXCwgZGlmZkN1dG9mZiwgXFwuYmVkcGVcXCkpLCBcbiAgICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBvdXQudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9kVEFHX0RNU08gPT0gXFxOT1xcKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYpKVxuICBmd3JpdGUob3V0LnRlbXAsIGhlcmUob3V0RGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR3ZzRE1TT19OT19kaWZmXFwsIGRpZmZDdXRvZmYsIFxcLmJlZHBlXFwpKSwgXG4gICAgICAgICBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbiAgb3V0LnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fZFRBR19ETVNPID09IFxcRE9XTlxcKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYpKVxuICBmd3JpdGUob3V0LnRlbXAsIGhlcmUob3V0RGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR3ZzRE1TT19ET1dOX2RpZmZcXCwgZGlmZkN1dG9mZiwgXFwuYmVkcGVcXCkpLCBcbiAgICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBcbiAgb3V0LnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fQTQ4NV9ETVNPID09IFxcVVBcXCkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2KSlcbiAgZndyaXRlKG91dC50ZW1wLCBoZXJlKG91dERpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODV2c0RNU09fVVBfZGlmZlxcLCBkaWZmQ3V0b2ZmLCBcXC5iZWRwZVxcKSksIFxuICAgICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG4gIG91dC50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX0E0ODVfRE1TTyA9PSBcXE5PXFwpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpXG4gIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1dnNETVNPX05PX2RpZmZcXCwgZGlmZkN1dG9mZiwgXFwuYmVkcGVcXCkpLCBcbiAgICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBvdXQudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gXFxET1dOXFwpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpXG4gIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1dnNETVNPX0RPV05fZGlmZlxcLCBkaWZmQ3V0b2ZmLCBcXC5iZWRwZVxcKSksIFxuICAgICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG59XG5cbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudCA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gRkFMU0Upe1xuICBhdmdfc2NvcmVzX2xvbmcgPC0gZGF0YSAlPiVcbiAgICBncm91cF9ieShkaXN0YW5jZSwgQW5ubzIpICU+JVxuICAgIHN1bW1hcmlzZShhdmdfc2NvcmUgPSBtZWFuKHNjb3JlLCBuYS5ybSA9IFRSVUUpKSAlPiVcbiAgICB1bmdyb3VwKCkgXG4gIGF2Z19zY29yZXNfbG9uZyRBbm5vMiA8LSBmYWN0b3IoYXZnX3Njb3Jlc19sb25nJEFubm8yLCBsZXZlbCA9IGxvb3BMaXN0KVxuICBwNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IEFubm8yLCBmaWxsID0gQW5ubzIpKSArIFxuICAgIGdlb21fc21vb3RoKHNob3cubGVnZW5kID0gVFJVRSwgc2UgPSBzZSkgICtcbiAgICB5bGltKDAsIDAuNSkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KSArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KSArXG4gICAgbGFicyh0aXRsZSA9IHBhc3RlMChuYW1lKSxcbiAgICAgICAgIHggPSBcXERpc3RhbmNlXFwsXG4gICAgICAgICB5ID0gXFxBdmVyYWdlIFNjb3JlXFwpICtcbiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSlcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGRpc3RfdnNfc2NvcmVfbGluZVBsb3RfXFwsIG5hbWUpXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICAgIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxufSBcblxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gRkFMU0Upe1xuICBhdmdfc2NvcmVzX2xvbmcgPC0gZGF0YSAlPiVcbiAgICBncm91cF9ieShkaXN0YW5jZSwgQW5ubzIpICU+JVxuICAgIHN1bW1hcmlzZShhdmdfc2NvcmUgPSBtZWFuKHNjb3JlLCBuYS5ybSA9IFRSVUUpKSAlPiVcbiAgICB1bmdyb3VwKCkgXG4gIGF2Z19zY29yZXNfbG9uZyRBbm5vMiA8LSBmYWN0b3IoYXZnX3Njb3Jlc19sb25nJEFubm8yLCBsZXZlbCA9IGxvb3BMaXN0KVxuICBwNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IEFubm8yLCBmaWxsID0gQW5ubzIpKSArIFxuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgICBnZW9tX3Ntb290aChzaG93LmxlZ2VuZCA9IFRSVUUsIHNlID0gc2UpICArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvckxpc3QpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvckxpc3QpICtcbiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG5hbWUpLFxuICAgICAgICAgeCA9IFxcRGlzdGFuY2VcXCxcbiAgICAgICAgIHkgPSBcXEF2ZXJhZ2UgRGlmZiBTY29yZVxcKSArXG4gICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZGlzdF92c19zY29yZV9kaWZmbGluZVBsb3RfXFwsIG5hbWUpXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICAgIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxufSBcblxuY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50IDwtIGZ1bmN0aW9uKGRhdGEsIGZpZ0RpciwgbmFtZSwgbG9vcExpc3QsIGNvbG9yTGlzdCl7XG4gIGRhdGEkQW5ubzIgPC0gZmFjdG9yKGRhdGEkQW5ubzIsIGxldmVscyA9IGxvb3BMaXN0KVxuICBcbiAgcDMgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gQW5ubzIsIHkgPSBzY29yZSkpICtcbiAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IEFubm8yKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yTGlzdCkgK1xuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgeWxpbSgtMC41LCAxKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcLCBjb2xvciA9IFxcZ3JleVxcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICBnZ3RpdGxlKG5hbWUpICtcbiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA0KSlcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHNjb3JlX2JhclBsb3RfXFwsIG5hbWUpXG4gIFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgXG4gICAgICByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDIsIGhlaWdodCA9IDQpXG4gIHByaW50KHAzKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBcbiAgICAgICAgICB3aWR0aCA9IDIsIGhlaWdodCA9IDQpXG4gIHByaW50KHAzKVxufVxuXG5cbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMgPC0gZnVuY3Rpb24oZGF0YSwgZmlnRGlyLCBncm91cE5hbWUsIGFubm9MaXN0KXtcbiAgIyBjcmVhdGVfbG9vcF9kaXNfdnNfc2NvcmUoZGF0YSwgZmlnRGlyLCBncm91cE5hbWUsIGFubm9MaXN0KVxuICAjIGNyZWF0ZV9sb29wX2Rpc192c19kaWZmc2NvcmUoZGF0YSwgZmlnRGlyLCBncm91cE5hbWUsIGFubm9MaXN0KVxuXG4gIGNyZWF0ZV9sb29wX3NjYXR0ZXJwbG90KGRhdGEsIGZpZ0RpciwgZ3JvdXBOYW1lLCBhbm5vTGlzdCwgMC4yKVxuICAjIGNyZWF0ZV9sb29wX3NjYXR0ZXJwbG90KGRhdGEsIGZpZ0RpciwgZ3JvdXBOYW1lLCBhbm5vTGlzdCwgMC4xKVxuICAjIG1ha2VfZGlmZl9iZWRwZShkYXRhLCBncm91cE5hbWUsIGFubm9MaXN0LCBjb25zZW5zdXNEaXIsIDAuMilcbiAgIyBtYWtlX2RpZmZfYmVkcGUoZGF0YSwgZ3JvdXBOYW1lLCBhbm5vTGlzdCwgY29uc2Vuc3VzRGlyLCAwLjEpXG59XG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuY3JlYXRlX2xvb3BfZGlzX3ZzX3Njb3JlIDwtIGZ1bmN0aW9uKGRhdGEsIGZpZ0RpciwgbmFtZSwgQW5ubzJMaXN0KXtcbiAgZGF0YSA9IGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBBbm5vMkxpc3QpXG4gIFxuICAjIyMgYmFycGxvdFxuICB0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoaWQsIERNU08sIGRUQUcsIEE0ODUpICU+JVxuICAgIHBpdm90X2xvbmdlcighaWQsIG5hbWVzX3RvID0gXFx0cmVhdG1lbnRcXCwgdmFsdWVzX3RvID0gXFxzY29yZVxcKVxuICB0ZW1wJHRyZWF0bWVudCA8LSBmYWN0b3IodGVtcCR0cmVhdG1lbnQsIGxldmVscyA9IGMoXFxETVNPXFwsIFxcZFRBR1xcLCBcXEE0ODVcXCkpXG4gIFxuICBwMyA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSB0cmVhdG1lbnQsIHkgPSBzY29yZSkpICtcbiAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHRyZWF0bWVudCksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcRE1TT1xcID0gXFxncmV5XFwsIFxcZFRBR1xcID0gXFxwaW5rXFwsIFxcQTQ4NVxcID0gXFxza3libHVlXFwpKSArXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICB5bGltKC0wLjUsIDEpICtcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIGdndGl0bGUobmFtZSkgK1xuICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQpKVxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzY29yZV9iYXJwbG90X1xcLCBuYW1lKVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgXG4gICAgICByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDIsIGhlaWdodCA9IDQpXG4gIHByaW50KHAzKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBcbiAgICAgICAgICB3aWR0aCA9IDIsIGhlaWdodCA9IDQpXG4gIHByaW50KHAzKVxuICBkZXYub2ZmKClcbiAgXG4gICMjIyBEaXN0YW5jZSB2cyBzY29yZVxuICBcbiAgdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgRE1TTywgZFRBRywgQTQ4NSlcblxuICBhdmdfc2NvcmVzIDwtIHRlbXAgJT4lXG4gICAgZ3JvdXBfYnkoZGlzdGFuY2UpICU+JVxuICAgIHN1bW1hcmlzZShhY3Jvc3Moc3RhcnRzX3dpdGgoXFxETVNPXFwpOnN0YXJ0c193aXRoKFxcQTQ4NVxcKSwgbWVhbiwgbmEucm0gPSBUUlVFKSlcblxuICBhdmdfc2NvcmVzX2xvbmcgPC0gYXZnX3Njb3JlcyAlPiVcbiAgICBwaXZvdF9sb25nZXIoY29scyA9IERNU086QTQ4NSwgbmFtZXNfdG8gPSBcXGNvbmRpdGlvblxcLCB2YWx1ZXNfdG8gPSBcXGF2Z19zY29yZVxcKVxuICBhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uIDwtIGZhY3Rvcihhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uLCBsZXZlbHMgPSBjKFxcRE1TT1xcLCBcXGRUQUdcXCwgXFxBNDg1XFwpKVxuICAjIENyZWF0ZSB0aGUgcGxvdFxuICBwNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IGNvbmRpdGlvbiwgZmlsbCA9IGNvbmRpdGlvbikpICtcbiAgICBnZW9tX3Ntb290aChzaG93LmxlZ2VuZCA9IFRSVUUpICsgeWxpbSgwLCAwLjUpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFxETVNPXFwgPSBcXGdyZXlcXCwgXFxkVEFHXFwgPSBcXHBpbmtcXCwgXFxBNDg1XFwgPSBcXHNreWJsdWVcXCkpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcRE1TT1xcID0gXFxncmV5ODBcXCwgXFxkVEFHXFwgPSBcXHBpbmtcXCwgXFxBNDg1XFwgPSBcXHNreWJsdWVcXCkpICtcbiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG5hbWUpLFxuICAgICAgICAgeCA9IFxcRGlzdGFuY2VcXCxcbiAgICAgICAgIHkgPSBcXEF2ZXJhZ2UgU2NvcmVcXCkgK1xuICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKVxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxkaXN0X3ZzX3Njb3JlX2xpbmVQbG90X1xcLCBuYW1lKVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSxcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksXG4gICAgICB3aWR0aCA9IDQsIGhlaWdodCA9IDMpXG4gIHByaW50KHA0KVxuICBkZXYub2ZmKClcbn1cblxuY3JlYXRlX2xvb3BfZGlzX3ZzX2RpZmZzY29yZSA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIEFubm8yTGlzdCl7XG4gIGRhdGEgPSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgQW5ubzJMaXN0KVxuICBcbiAgXG4gIHRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfZFRBR19ETVNPLCBkaWZmX0E0ODVfRE1TTylcbiAgXG4gIGF2Z19zY29yZXMgPC0gdGVtcCAlPiVcbiAgICBncm91cF9ieShkaXN0YW5jZSkgJT4lXG4gICAgc3VtbWFyaXNlKGFjcm9zcygxOjIsIG1lYW4sIG5hLnJtID0gVFJVRSkpXG4gIFxuICBhdmdfc2NvcmVzX2xvbmcgPC0gYXZnX3Njb3JlcyAlPiVcbiAgICBwaXZvdF9sb25nZXIoY29scyA9IDI6MywgbmFtZXNfdG8gPSBcXGNvbmRpdGlvblxcLCB2YWx1ZXNfdG8gPSBcXGF2Z19zY29yZVxcKVxuICBhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uIDwtIGZhY3Rvcihhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhcXGRpZmZfZFRBR19ETVNPXFwsIFxcZGlmZl9BNDg1X0RNU09cXCkpXG4gICMgQ3JlYXRlIHRoZSBwbG90XG4gIHA0IDwtIGdncGxvdChhdmdfc2NvcmVzX2xvbmcsIGFlcyh4ID0gZGlzdGFuY2UsIHkgPSBhdmdfc2NvcmUsIGNvbG9yID0gY29uZGl0aW9uLCBmaWxsID0gY29uZGl0aW9uKSkgK1xuICAgIGdlb21fc21vb3RoKHNob3cubGVnZW5kID0gVFJVRSkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIHlsaW0oLTAuNSwgMC4xKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcZGlmZl9kVEFHX0RNU09cXCA9IFxccGlua1xcLCBcXGRpZmZfQTQ4NV9ETVNPXFwgPSBcXHNreWJsdWVcXCkpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcZGlmZl9kVEFHX0RNU09cXCA9IFxccGlua1xcLCBcXGRpZmZfQTQ4NV9ETVNPXFwgPSBcXHNreWJsdWVcXCkpICtcbiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG5hbWUpLFxuICAgICAgICAgeCA9IFxcRGlzdGFuY2VcXCxcbiAgICAgICAgIHkgPSBcXEF2ZXJhZ2UgRGlmZiBTY29yZVxcKSArXG4gICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGRpc3RfdnNfc2NvcmVfZGlmZmxpbmVQbG90X1xcLCBuYW1lKVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSxcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNC41LCBoZWlnaHQgPSAzKVxuICBwcmludChwNClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSxcbiAgICAgICAgICB3aWR0aCA9IDQuNSwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxufVxuXG5jcmVhdGVfbG9vcF9zY2F0dGVycGxvdCA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIEFubm8yTGlzdCwgZGlmZkN1dG9mZil7XG4gIGRhdGEgPC0gZGF0YSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiBkaWZmQ3V0b2ZmLCBcXFVQXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpLFxuICAgICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSkpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBBbm5vMkxpc3QpXG4gIGRhdGEkdXBkb3duX2RUQUdfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fZFRBR19ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIGRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIFxuICBudW0udXAgPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxVUFxcXVxuICBudW0ubm8gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxOT1xcXVxuICBudW0uZG93biA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVtcXERPV05cXF1cbiAgbnVtLmFsbCA8LSBudW0udXAgKyBudW0ubm8gKyBudW0uZG93blxuICBwZXJjLnVwIDwtIHJvdW5kKG51bS51cCAvIG51bS5hbGwgKiAxMDAsIDIpXG4gIHBlcmMubm8gPC0gcm91bmQobnVtLm5vIC8gbnVtLmFsbCAqIDEwMCwgMilcbiAgcGVyYy5kb3duIDwtIHJvdW5kKG51bS5kb3duIC8gbnVtLmFsbCAqIDEwMCwgMilcbiAgXG4gICMjIyBTY2F0dGVycGxvdFxuICBkYXRhJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoZGF0YSRETVNPLCBkYXRhJGRUQUcsIG4gPSAxMDApXG4gIGRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbiAgY29ycmVsYXRpb24gPC0gY29yKGRhdGEkRE1TTywgZGF0YSRkVEFHKVxuICBwMSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICAgIGdlb21fcG9pbnQoc2l6ZSA9IDEsXG4gICAgICBhbHBoYSA9IDEsXG4gICAgICBzdHJva2UgPSAwKSArIFxuICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gXFxEXFwsIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgKSkgK1xuICAgIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsgY29vcmRfZml4ZWQoKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUwKFxcVVA6IFxcLCBudW0udXAsIFxcIChcXCwgcGVyYy51cCwgXFwlKVxcKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgLCBzaXplID0gMSxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLTAuMSwgbGFiZWwgPSBwYXN0ZTAoXFxOTzogXFwsIG51bS5ubywgXFwgKFxcLCBwZXJjLm5vLCBcXCUpXFwpLCBcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCAsIHNpemUgPSAxLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4yLCBsYWJlbCA9IHBhc3RlMChcXERPV046IFxcLCBudW0uZG93biwgXFwgKFxcLCBwZXJjLmRvd24sIFxcJSlcXCksIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsICwgc2l6ZSA9IDEsXG4gICAgICAgIGZhbWlseSA9IGZvbnRUeXBlKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICAjYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZShcbiAgICAgICMgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBoanVzdCA9IDAuNSxcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGVcbiAgICAgICksXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgKSArXG4gIHhsYWIoXFxMb29wIHNjb3JlXFxuRzEuRE1TT1xcKSArXG4gICAgeWxhYihcXExvb3Agc2NvcmVcXG5HMS5kVEFHXFwpXG4gIFxuICBcbiAgXG4gIG51bS51cCA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9BNDg1X0RNU08pKVtcXFVQXFxdXG4gIG51bS5ubyA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9BNDg1X0RNU08pKVtcXE5PXFxdXG4gIG51bS5kb3duIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX0E0ODVfRE1TTykpW1xcRE9XTlxcXVxuICBudW0uYWxsIDwtIG51bS51cCArIG51bS5ubyArIG51bS5kb3duXG4gIHBlcmMudXAgPC0gcm91bmQobnVtLnVwIC8gbnVtLmFsbCAqIDEwMCwgMilcbiAgcGVyYy5ubyA8LSByb3VuZChudW0ubm8gLyBudW0uYWxsICogMTAwLCAyKVxuICBwZXJjLmRvd24gPC0gcm91bmQobnVtLmRvd24gLyBudW0uYWxsICogMTAwLCAyKVxuICBcbiAgZGF0YSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KGRhdGEkRE1TTywgZGF0YSRBNDg1LCBuID0gMTAwKVxuICBkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG4gIGNvcnJlbGF0aW9uIDwtIGNvcihkYXRhJERNU08sIGRhdGEkQTQ4NSlcbiAgcDIgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gRE1TTywgeSA9IEE0ODUsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgICBnZW9tX3BvaW50KHNpemUgPSAxLFxuICAgICAgYWxwaGEgPSAxLFxuICAgICAgc3Ryb2tlID0gMCkgKyBcbiAgICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9IFxcRFxcLCBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICkpICtcbiAgICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArIGNvb3JkX2ZpeGVkKCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwsXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlMChcXFVQOiBcXCwgbnVtLnVwLCBcXCAoXFwsIHBlcmMudXAsIFxcJSlcXCksIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4xLCBsYWJlbCA9IHBhc3RlMChcXE5POiBcXCwgbnVtLm5vLCBcXCAoXFwsIHBlcmMubm8sIFxcJSlcXCksIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4yLCBsYWJlbCA9IHBhc3RlMChcXERPV046IFxcLCBudW0uZG93biwgXFwgKFxcLCBwZXJjLmRvd24sIFxcJSlcXCksIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIFxuICAgICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZShcXHIgPVxcLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZShcbiAgICAgICMgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBoanVzdCA9IDAuNSxcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGVcbiAgICAgICksXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgKSArXG4gICAgeGxhYihcXExvb3Agc2NvcmVcXG5HMS5ETVNPXFwpICtcbiAgICB5bGFiKFxcTG9vcCBzY29yZVxcbkcxLkE0ODVcXClcblxuICAgIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaCAgXG4gIFxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpcixwYXN0ZTAoXFxzY2F0dGVycGxvdF9cXCwgbmFtZSwgXFxfZFRBR192c19ETVNPX1xcLCBkaWZmQ3V0b2ZmKSlcblxuICBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPWhlaWdodClcbiAgcHJpbnQocDEpXG4gIGRldi5vZmYoKVxuICBwbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9aGVpZ2h0LCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbiAgXG4gICAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXHNjYXR0ZXJwbG90X1xcLCBuYW1lLCBcXF9BNDg1X3ZzX0RNU09fXFwsIGRpZmZDdXRvZmYpKVxuXG4gIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9aGVpZ2h0KVxuICBwcmludChwMilcbiAgZGV2Lm9mZigpXG4gIHBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID1oZWlnaHQsIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXClcbiAgcHJpbnQocDIpXG4gIGRldi5vZmYoKVxuICBcbiAgIyBcbiAgIyBcbiAgIyBcbiAgIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSA1KjEuNSwgaGVpZ2h0ID0gMi41KjEuNSlcbiAgIyBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgIyBkZXYub2ZmKClcbiAgIyBcbiAgIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAjICAgICAgICAgd2lkdGggPSA1KjEuNSwgaGVpZ2h0ID0gMi41KjEuNSlcbiAgIyBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgIyBkZXYub2ZmKClcbn1cblxubWFrZV9kaWZmX2JlZHBlIDwtIGZ1bmN0aW9uKGRhdGEsIG5hbWUsIEFubm8yTGlzdCwgb3V0RGlyLCBkaWZmQ3V0b2ZmKXtcbiAgZGF0YSA8LSBkYXRhICU+JVxuICAgIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgICB1cGRvd25fQTQ4NV9ETVNPID0gaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIEFubm8yTGlzdClcbiAgZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbiAgZGF0YSR1cGRvd25fQTQ4NV9ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9BNDg1X0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbiAgXG4gIG91dC50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXFVQXFwpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpXG4gIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHdnNETVNPX1VQX2RpZmZcXCwgZGlmZkN1dG9mZiwgXFwuYmVkcGVcXCkpLCBcbiAgICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBvdXQudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9kVEFHX0RNU08gPT0gXFxOT1xcKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYpKVxuICBmd3JpdGUob3V0LnRlbXAsIGhlcmUob3V0RGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR3ZzRE1TT19OT19kaWZmXFwsIGRpZmZDdXRvZmYsIFxcLmJlZHBlXFwpKSwgXG4gICAgICAgICBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbiAgb3V0LnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fZFRBR19ETVNPID09IFxcRE9XTlxcKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYpKVxuICBmd3JpdGUob3V0LnRlbXAsIGhlcmUob3V0RGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR3ZzRE1TT19ET1dOX2RpZmZcXCwgZGlmZkN1dG9mZiwgXFwuYmVkcGVcXCkpLCBcbiAgICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBcbiAgb3V0LnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fQTQ4NV9ETVNPID09IFxcVVBcXCkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2KSlcbiAgZndyaXRlKG91dC50ZW1wLCBoZXJlKG91dERpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODV2c0RNU09fVVBfZGlmZlxcLCBkaWZmQ3V0b2ZmLCBcXC5iZWRwZVxcKSksIFxuICAgICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG4gIG91dC50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX0E0ODVfRE1TTyA9PSBcXE5PXFwpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpXG4gIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1dnNETVNPX05PX2RpZmZcXCwgZGlmZkN1dG9mZiwgXFwuYmVkcGVcXCkpLCBcbiAgICAgICAgIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBvdXQudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gXFxET1dOXFwpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpXG4gIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1dnNETVNPX0RPV05fZGlmZlxcLCBkaWZmQ3V0b2ZmLCBcXC5iZWRwZVxcKSksIFxuICAgICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG59XG5cbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudCA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gRkFMU0Upe1xuICBhdmdfc2NvcmVzX2xvbmcgPC0gZGF0YSAlPiVcbiAgICBncm91cF9ieShkaXN0YW5jZSwgQW5ubzIpICU+JVxuICAgIHN1bW1hcmlzZShhdmdfc2NvcmUgPSBtZWFuKHNjb3JlLCBuYS5ybSA9IFRSVUUpKSAlPiVcbiAgICB1bmdyb3VwKCkgXG4gIGF2Z19zY29yZXNfbG9uZyRBbm5vMiA8LSBmYWN0b3IoYXZnX3Njb3Jlc19sb25nJEFubm8yLCBsZXZlbCA9IGxvb3BMaXN0KVxuICBwNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IEFubm8yLCBmaWxsID0gQW5ubzIpKSArIFxuICAgIGdlb21fc21vb3RoKHNob3cubGVnZW5kID0gVFJVRSwgc2UgPSBzZSkgICtcbiAgICB5bGltKDAsIDAuNSkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KSArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KSArXG4gICAgbGFicyh0aXRsZSA9IHBhc3RlMChuYW1lKSxcbiAgICAgICAgIHggPSBcXERpc3RhbmNlXFwsXG4gICAgICAgICB5ID0gXFxBdmVyYWdlIFNjb3JlXFwpICtcbiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSlcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGRpc3RfdnNfc2NvcmVfbGluZVBsb3RfXFwsIG5hbWUpXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICAgIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxufSBcblxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gRkFMU0Upe1xuICBhdmdfc2NvcmVzX2xvbmcgPC0gZGF0YSAlPiVcbiAgICBncm91cF9ieShkaXN0YW5jZSwgQW5ubzIpICU+JVxuICAgIHN1bW1hcmlzZShhdmdfc2NvcmUgPSBtZWFuKHNjb3JlLCBuYS5ybSA9IFRSVUUpKSAlPiVcbiAgICB1bmdyb3VwKCkgXG4gIGF2Z19zY29yZXNfbG9uZyRBbm5vMiA8LSBmYWN0b3IoYXZnX3Njb3Jlc19sb25nJEFubm8yLCBsZXZlbCA9IGxvb3BMaXN0KVxuICBwNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IEFubm8yLCBmaWxsID0gQW5ubzIpKSArIFxuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgICBnZW9tX3Ntb290aChzaG93LmxlZ2VuZCA9IFRSVUUsIHNlID0gc2UpICArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvckxpc3QpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvckxpc3QpICtcbiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG5hbWUpLFxuICAgICAgICAgeCA9IFxcRGlzdGFuY2VcXCxcbiAgICAgICAgIHkgPSBcXEF2ZXJhZ2UgRGlmZiBTY29yZVxcKSArXG4gICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZGlzdF92c19zY29yZV9kaWZmbGluZVBsb3RfXFwsIG5hbWUpXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICAgIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxufSBcblxuY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50IDwtIGZ1bmN0aW9uKGRhdGEsIGZpZ0RpciwgbmFtZSwgbG9vcExpc3QsIGNvbG9yTGlzdCl7XG4gIGRhdGEkQW5ubzIgPC0gZmFjdG9yKGRhdGEkQW5ubzIsIGxldmVscyA9IGxvb3BMaXN0KVxuICBcbiAgcDMgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gQW5ubzIsIHkgPSBzY29yZSkpICtcbiAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IEFubm8yKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yTGlzdCkgK1xuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgeWxpbSgtMC41LCAxKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcLCBjb2xvciA9IFxcZ3JleVxcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICBnZ3RpdGxlKG5hbWUpICtcbiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA0KSlcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHNjb3JlX2JhclBsb3RfXFwsIG5hbWUpXG4gIFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgXG4gICAgICByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDIsIGhlaWdodCA9IDQpXG4gIHByaW50KHAzKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBcbiAgICAgICAgICB3aWR0aCA9IDIsIGhlaWdodCA9IDQpXG4gIHByaW50KHAzKVxufVxuXG5cbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMgPC0gZnVuY3Rpb24oZGF0YSwgZmlnRGlyLCBncm91cE5hbWUsIGFubm9MaXN0KXtcbiAgIyBjcmVhdGVfbG9vcF9kaXNfdnNfc2NvcmUoZGF0YSwgZmlnRGlyLCBncm91cE5hbWUsIGFubm9MaXN0KVxuICAjIGNyZWF0ZV9sb29wX2Rpc192c19kaWZmc2NvcmUoZGF0YSwgZmlnRGlyLCBncm91cE5hbWUsIGFubm9MaXN0KVxuXG4gIGNyZWF0ZV9sb29wX3NjYXR0ZXJwbG90KGRhdGEsIGZpZ0RpciwgZ3JvdXBOYW1lLCBhbm5vTGlzdCwgMC4yKVxuICAjIGNyZWF0ZV9sb29wX3NjYXR0ZXJwbG90KGRhdGEsIGZpZ0RpciwgZ3JvdXBOYW1lLCBhbm5vTGlzdCwgMC4xKVxuICAjIG1ha2VfZGlmZl9iZWRwZShkYXRhLCBncm91cE5hbWUsIGFubm9MaXN0LCBjb25zZW5zdXNEaXIsIDAuMilcbiAgIyBtYWtlX2RpZmZfYmVkcGUoZGF0YSwgZ3JvdXBOYW1lLCBhbm5vTGlzdCwgY29uc2Vuc3VzRGlyLCAwLjEpXG59XG5gYGBcbmBgYCJ9 -->

```r
```r
create_loop_dis_vs_score <- function(data, figDir, name, Anno2List){
  data = data %>% dplyr::filter(Anno2 %in% Anno2List)
  
  ### barplot
  temp <- data %>% dplyr::select(id, DMSO, dTAG, A485) %>%
    pivot_longer(!id, names_to = \treatment\, values_to = \score\)
  temp$treatment <- factor(temp$treatment, levels = c(\DMSO\, \dTAG\, \A485\))
  
  p3 <- ggplot(temp, aes(x = treatment, y = score)) +
    geom_violin(aes(fill = treatment), show.legend = FALSE) +
    scale_fill_manual(values = c(\DMSO\ = \grey\, \dTAG\ = \pink\, \A485\ = \skyblue\)) +
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    ylim(-0.5, 1) +
    geom_hline(yintercept = 0, linetype = \dashed\, color = \grey\) +
    theme_classic() +
    ggtitle(name) +
    theme(plot.title = element_text(size = 4))
  fileName <- paste0(\score_barplot_\, name)
  png(here(figDir, paste0(fileName, \.png\)), 
      res = 600, units = \in\, width = 2, height = 4)
  print(p3)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 2, height = 4)
  print(p3)
  dev.off()
  
  ### Distance vs score
  
  temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, DMSO, dTAG, A485)

  avg_scores <- temp %>%
    group_by(distance) %>%
    summarise(across(starts_with(\DMSO\):starts_with(\A485\), mean, na.rm = TRUE))

  avg_scores_long <- avg_scores %>%
    pivot_longer(cols = DMSO:A485, names_to = \condition\, values_to = \avg_score\)
  avg_scores_long$condition <- factor(avg_scores_long$condition, levels = c(\DMSO\, \dTAG\, \A485\))
  # Create the plot
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = condition, fill = condition)) +
    geom_smooth(show.legend = TRUE) + ylim(0, 0.5) +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = c(\DMSO\ = \grey\, \dTAG\ = \pink\, \A485\ = \skyblue\)) +
    scale_fill_manual(values = c(\DMSO\ = \grey80\, \dTAG\ = \pink\, \A485\ = \skyblue\)) +
    labs(title = paste0(name),
         x = \Distance\,
         y = \Average Score\) +
    theme(plot.title = element_text(size = 5))
  fileName <- paste0(\dist_vs_score_linePlot_\, name)
  png(here(figDir, paste0(fileName, \.png\)),
      res = 600, units = \in\, width = 4, height = 3)
  print(p4)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),
      width = 4, height = 3)
  print(p4)
  dev.off()
}

create_loop_dis_vs_diffscore <- function(data, figDir, name, Anno2List){
  data = data %>% dplyr::filter(Anno2 %in% Anno2List)
  
  
  temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_dTAG_DMSO, diff_A485_DMSO)
  
  avg_scores <- temp %>%
    group_by(distance) %>%
    summarise(across(1:2, mean, na.rm = TRUE))
  
  avg_scores_long <- avg_scores %>%
    pivot_longer(cols = 2:3, names_to = \condition\, values_to = \avg_score\)
  avg_scores_long$condition <- factor(avg_scores_long$condition, 
                                      levels = c(\diff_dTAG_DMSO\, \diff_A485_DMSO\))
  # Create the plot
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = condition, fill = condition)) +
    geom_smooth(show.legend = TRUE) + geom_hline(yintercept = 0) + ylim(-0.5, 0.1) +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = c(\diff_dTAG_DMSO\ = \pink\, \diff_A485_DMSO\ = \skyblue\)) +
    scale_fill_manual(values = c(\diff_dTAG_DMSO\ = \pink\, \diff_A485_DMSO\ = \skyblue\)) +
    labs(title = paste0(name),
         x = \Distance\,
         y = \Average Diff Score\) +
    theme(plot.title = element_text(size = 5))
  fileName <- paste0(\dist_vs_score_difflinePlot_\, name)
  png(here(figDir, paste0(fileName, \.png\)),
      res = 600, units = \in\, width = 4.5, height = 3)
  print(p4)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),
          width = 4.5, height = 3)
  print(p4)
  dev.off()
}

create_loop_scatterplot <- function(data, figDir, name, Anno2List, diffCutoff){
  data <- data %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\))) %>%
    dplyr::filter(Anno2 %in% Anno2List)
  data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  
  num.up <- (summary(data$updown_dTAG_DMSO))[\UP\]
  num.no <- (summary(data$updown_dTAG_DMSO))[\NO\]
  num.down <- (summary(data$updown_dTAG_DMSO))[\DOWN\]
  num.all <- num.up + num.no + num.down
  perc.up <- round(num.up / num.all * 100, 2)
  perc.no <- round(num.no / num.all * 100, 2)
  perc.down <- round(num.down / num.all * 100, 2)
  
  ### Scatterplot
  data$density <- get_density(data$DMSO, data$dTAG, n = 100)
  data <- data %>% dplyr::arrange(density)
  correlation <- cor(data$DMSO, data$dTAG)
  p1 <- ggplot(data, aes(x = DMSO, y = dTAG, color = density)) +
    geom_point(size = 1,
      alpha = 1,
      stroke = 0) + 
    scale_color_viridis(option = \D\, guide = guide_colorbar(
                          barwidth = 1.5/5.08,  # Adjust width of the color bar
                          barheight = 15/5.08   # Adjust height of the color bar
                        )) +
    xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    annotate(\text\, x = -0.5, y = 1, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
             color = \black\, hjust = 0, , size = 1,
        family = fontType) +
    annotate(\text\, x = -0.5, y = 1-0.1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
             color = \black\, hjust = 0, , size = 1,
        family = fontType) +
    annotate(\text\, x = -0.5, y = 1-0.2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
             color = \black\, hjust = 0, , size = 1,
        family = fontType) +
    theme_classic() +
    #annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\) +
    theme(
      # legend.position = \none\,
      plot.title = element_text(
        hjust = 0.5,
        size = fontSizeS,
        family = fontType
      ),
      axis.title = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.line = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
    ) +
  xlab(\Loop score\nG1.DMSO\) +
    ylab(\Loop score\nG1.dTAG\)
  
  
  
  num.up <- (summary(data$updown_A485_DMSO))[\UP\]
  num.no <- (summary(data$updown_A485_DMSO))[\NO\]
  num.down <- (summary(data$updown_A485_DMSO))[\DOWN\]
  num.all <- num.up + num.no + num.down
  perc.up <- round(num.up / num.all * 100, 2)
  perc.no <- round(num.no / num.all * 100, 2)
  perc.down <- round(num.down / num.all * 100, 2)
  
  data$density <- get_density(data$DMSO, data$A485, n = 100)
  data <- data %>% dplyr::arrange(density)
  correlation <- cor(data$DMSO, data$A485)
  p2 <- ggplot(data, aes(x = DMSO, y = A485, color = density)) +
    geom_point(size = 1,
      alpha = 1,
      stroke = 0) + 
    scale_color_viridis(option = \D\, guide = guide_colorbar(
                          barwidth = 1.5/5.08,  # Adjust width of the color bar
                          barheight = 15/5.08   # Adjust height of the color bar
                        )) +
    xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\,
      color = \black\,
      size = lineThick*mmToLineUnit,
      lineend = \square\) +
    annotate(\text\, x = -0.5, y = 1, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
             color = \black\, hjust = 0, size = 1,
        family = fontType) +
    annotate(\text\, x = -0.5, y = 1-0.1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
             color = \black\, hjust = 0, size = 1,
        family = fontType) +
    annotate(\text\, x = -0.5, y = 1-0.2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
             color = \black\, hjust = 0, size = 1,
        family = fontType) +
    theme_classic() + 
    # annotate(\text\, x = -0.5, y = 1, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\) +
    theme(
      # legend.position = \none\,
      plot.title = element_text(
        hjust = 0.5,
        size = fontSizeS,
        family = fontType
      ),
      axis.title = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS,
        family = fontType,
        color = \#000000\
      ),
      axis.line = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\,
        size = lineThick*mmToLineUnit,
        lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
    ) +
    xlab(\Loop score\nG1.DMSO\) +
    ylab(\Loop score\nG1.A485\)

    width <- panelSize(1.5)*mmToInch
  height <- panelSize(1.5)*mmToInch  
  
  fileName <- here(figDir,paste0(\scatterplot_\, name, \_dTAG_vs_DMSO_\, diffCutoff))

  svglite(paste0(fileName, \.svg\), width = width, height =height)
  print(p1)
  dev.off()
  png(paste0(fileName, \.png\), width = width, height =height, res = 600, unit = \in\)
  print(p1)
  dev.off()
  
    fileName <- here(figDir, paste0(\scatterplot_\, name, \_A485_vs_DMSO_\, diffCutoff))

  svglite(paste0(fileName, \.svg\), width = width, height =height)
  print(p2)
  dev.off()
  png(paste0(fileName, \.png\), width = width, height =height, res = 600, unit = \in\)
  print(p2)
  dev.off()
  
  # 
  # 
  # 
  # png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 5*1.5, height = 2.5*1.5)
  # print(cowplot::plot_grid(p1, p2, align = \h\))
  # dev.off()
  # 
  # svglite(here(figDir, paste0(fileName, \.svg\)), 
  #         width = 5*1.5, height = 2.5*1.5)
  # print(cowplot::plot_grid(p1, p2, align = \h\))
  # dev.off()
}

make_diff_bedpe <- function(data, name, Anno2List, outDir, diffCutoff){
  data <- data %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\))) %>%
    dplyr::filter(Anno2 %in% Anno2List)
  data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  
  out.temp <- data %>% dplyr::filter(updown_dTAG_DMSO == \UP\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_dTAGvsDMSO_UP_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_dTAG_DMSO == \NO\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_dTAGvsDMSO_NO_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_dTAG_DMSO == \DOWN\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_dTAGvsDMSO_DOWN_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  
  out.temp <- data %>% dplyr::filter(updown_A485_DMSO == \UP\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_A485vsDMSO_UP_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_A485_DMSO == \NO\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_A485vsDMSO_NO_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_A485_DMSO == \DOWN\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_A485vsDMSO_DOWN_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
}

create_dist_vs_avgScore_perTreatment <- function(data, figDir, name, loopList, colorList, se = FALSE){
  avg_scores_long <- data %>%
    group_by(distance, Anno2) %>%
    summarise(avg_score = mean(score, na.rm = TRUE)) %>%
    ungroup() 
  avg_scores_long$Anno2 <- factor(avg_scores_long$Anno2, level = loopList)
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = Anno2, fill = Anno2)) + 
    geom_smooth(show.legend = TRUE, se = se)  +
    ylim(0, 0.5) +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = colorList) +
    scale_fill_manual(values = colorList) +
    labs(title = paste0(name),
         x = \Distance\,
         y = \Average Score\) +
    theme(plot.title = element_text(size = 8))
  
  fileName <- paste0(\dist_vs_score_linePlot_\, name)
  png(here(figDir, paste0(fileName, \.png\)), 
      res = 600, units = \in\, width = 4, height = 3)
  print(p4)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 4, height = 3)
  print(p4)
  dev.off()
} 

create_dist_vs_avgDiffScore_perTreatment <- function(data, figDir, name, loopList, colorList, se = FALSE){
  avg_scores_long <- data %>%
    group_by(distance, Anno2) %>%
    summarise(avg_score = mean(score, na.rm = TRUE)) %>%
    ungroup() 
  avg_scores_long$Anno2 <- factor(avg_scores_long$Anno2, level = loopList)
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = Anno2, fill = Anno2)) + 
    geom_hline(yintercept = 0) +
    geom_smooth(show.legend = TRUE, se = se)  +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = colorList) +
    scale_fill_manual(values = colorList) +
    labs(title = paste0(name),
         x = \Distance\,
         y = \Average Diff Score\) +
    theme(plot.title = element_text(size = 8)) 
  
  fileName <- paste0(\dist_vs_score_difflinePlot_\, name)
  png(here(figDir, paste0(fileName, \.png\)), 
      res = 600, units = \in\, width = 4, height = 3)
  print(p4)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 4, height = 3)
  print(p4)
  dev.off()
} 

create_score_barplot_perTreatment <- function(data, figDir, name, loopList, colorList){
  data$Anno2 <- factor(data$Anno2, levels = loopList)
  
  p3 <- ggplot(data, aes(x = Anno2, y = score)) +
    geom_violin(aes(fill = Anno2), show.legend = FALSE) +
    scale_fill_manual(values = colorList) +
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    ylim(-0.5, 1) +
    geom_hline(yintercept = 0, linetype = \dashed\, color = \grey\) +
    theme_classic() +
    ggtitle(name) +
    theme(plot.title = element_text(size = 4))
  
  fileName <- paste0(\score_barPlot_\, name)
  
  png(here(figDir, paste0(fileName, \.png\)), 
      res = 600, units = \in\, width = 2, height = 4)
  print(p3)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 2, height = 4)
  print(p3)
}


iterate_loop_functions <- function(data, figDir, groupName, annoList){
  # create_loop_dis_vs_score(data, figDir, groupName, annoList)
  # create_loop_dis_vs_diffscore(data, figDir, groupName, annoList)

  create_loop_scatterplot(data, figDir, groupName, annoList, 0.2)
  # create_loop_scatterplot(data, figDir, groupName, annoList, 0.1)
  # make_diff_bedpe(data, groupName, annoList, consensusDir, 0.2)
  # make_diff_bedpe(data, groupName, annoList, consensusDir, 0.1)
}
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### Pure-reg vs Str-reg

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzV1WVcxbElEd3RJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVndpWEc1a1lYUmhJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSXVkSE4yWENJcEtTbGNibHh1YVhSbGNtRjBaVjlzYjI5d1gyWjFibU4wYVc5dWN5aGtZWFJoTENCbWFXZEVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNJbDljSWl3Z1hDSmpiRjloYkd4Y0lpa3NJSFZ1YVhGMVpTaGtZWFJoSkVGdWJtOHlLU2xjYm1sMFpYSmhkR1ZmYkc5dmNGOW1kVzVqZEdsdmJuTW9aR0YwWVN3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYQ0pmWENJc0lGd2lZMnhmYzNSeWRXTjBkWEpsWENJcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1l5aGNJbE10VTF3aUxDQmNJbE10V0Z3aUtTbGNibWwwWlhKaGRHVmZiRzl2Y0Y5bWRXNWpkR2x2Ym5Nb1pHRjBZU3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZYQ0lzSUZ3aWN5MXpYQ0lwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWXloY0lsTXRVMXdpS1NsY2JtbDBaWEpoZEdWZmJHOXZjRjltZFc1amRHbHZibk1vWkdGMFlTd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENKZlhDSXNJRndpWTJ4ZmNtVm5kV3hoZEc5eWVWd2lLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR01vWENKUUxWQmNJaXdnWENKUUxVVmNJaXdnWENKUUxWTmNJaXdnWENKUUxWaGNJaXdnWENKRkxVVmNJaXdnWENKRkxWTmNJaXdnWENKRkxWaGNJaWtwWEc1cGRHVnlZWFJsWDJ4dmIzQmZablZ1WTNScGIyNXpLR1JoZEdFc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDF3aUxDQmNJbU5zWDNCbExYQmxYQ0lwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWXloY0lsQXRVRndpTENCY0lsQXRSVndpTENCY0lrVXRSVndpS1NsY2JtbDBaWEpoZEdWZmJHOXZjRjltZFc1amRHbHZibk1vWkdGMFlTd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENKZlhDSXNJRndpY0Mxd1pWd2lLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR01vWENKUUxWQmNJaXdnWENKUUxVVmNJaWtwWEc1cGRHVnlZWFJsWDJ4dmIzQmZablZ1WTNScGIyNXpLR1JoZEdFc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDF3aUxDQmNJbkF0Y0Z3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTW9YQ0pRTFZCY0lpa3BYRzVwZEdWeVlYUmxYMnh2YjNCZlpuVnVZM1JwYjI1ektHUmhkR0VzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYMXdpTENCY0luQXRaVndpS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdNb1hDSlFMVVZjSWlrcFhHNXBkR1Z5WVhSbFgyeHZiM0JmWm5WdVkzUnBiMjV6S0dSaGRHRXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgxd2lMQ0JjSW1VdFpWd2lLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR01vWENKRkxVVmNJaWtwWEc1cGRHVnlZWFJsWDJ4dmIzQmZablZ1WTNScGIyNXpLR1JoZEdFc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDF3aUxDQmNJbmd0ZUZ3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTW9YQ0pZTFZoY0lpa3BYRzRqSXlNakl5TWpJeU1qSTF4dUl5QkRjbVZoZEdsdVp5QmthV1ptWlhKbGJuUnBZV3dnYzJOaGRIUmxjbkJzYjNSY2JsWnBaWGNvWkdGMFlTbGNibHh1WEc1Y2JpTWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qWEc0aklFTnlaV0YwYVc1bklHWnBaM1Z5WlhNZ2NHVnlJR1ZoWTJnZ1kyOXVaR2wwYVc5dVhHNXVZVzFsSUR3dElGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWd2lYRzVrWVhSaElEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENJdWRITjJYQ0lwS1NsY2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsemRHRnVZMlVzSUVSTlUwOHNJRUZ1Ym04eUtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjSW1ScGMzUmhibU5sWENJc0lGd2ljMk52Y21WY0lpd2dYQ0pCYm01dk1sd2lLVnh1WTNKbFlYUmxYMlJwYzNSZmRuTmZZWFpuVTJOdmNtVmZjR1Z5VkhKbFlYUnRaVzUwS0hSbGJYQXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgwUk5VMDljSWlrc0lHTW9YQ0pZTFZoY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKVExWaGNJaXdnWENKVExWTmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSkZMVmhjSWl4Y0lrVXRVMXdpTEZ3aVJTMUZYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lVQzFGWENJc1hDSlFMVmhjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVkJjSWlrc0lHTnZiRzl5VEdsemRFeHZiM0FwWEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0J6ZEdGeWRESWdMU0J6ZEdGeWRERXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwYzNSaGJtTmxMQ0JrVkVGSExDQkJibTV2TWlsY2JtTnZiRzVoYldWektIUmxiWEFwSUR3dElHTW9YQ0prYVhOMFlXNWpaVndpTENCY0luTmpiM0psWENJc0lGd2lRVzV1YnpKY0lpbGNibU55WldGMFpWOWthWE4wWDNaelgyRjJaMU5qYjNKbFgzQmxjbFJ5WldGMGJXVnVkQ2gwWlcxd0xDQm1hV2RFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjSWw5a1ZFRkhYQ0lwTENCaktGd2lXQzFZWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpVXkxWVhDSXNJRndpVXkxVFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVJTMVlYQ0lzWENKRkxWTmNJaXhjSWtVdFJWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lsQXRSVndpTEZ3aVVDMVlYQ0lzSUZ3aVVDMVRYQ0lzSUZ3aVVDMVFYQ0lwTENCamIyeHZja3hwYzNSTWIyOXdLVnh1WEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0J6ZEdGeWRESWdMU0J6ZEdGeWRERXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwYzNSaGJtTmxMQ0JCTkRnMUxDQkJibTV2TWlsY2JtTnZiRzVoYldWektIUmxiWEFwSUR3dElHTW9YQ0prYVhOMFlXNWpaVndpTENCY0luTmpiM0psWENJc0lGd2lRVzV1YnpKY0lpbGNibU55WldGMFpWOWthWE4wWDNaelgyRjJaMU5qYjNKbFgzQmxjbFJ5WldGMGJXVnVkQ2gwWlcxd0xDQm1hV2RFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjSWw5Qk5EZzFYQ0lwTENCaktGd2lXQzFZWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpVXkxWVhDSXNJRndpVXkxVFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVJTMVlYQ0lzWENKRkxWTmNJaXhjSWtVdFJWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lsQXRSVndpTEZ3aVVDMVlYQ0lzSUZ3aVVDMVRYQ0lzSUZ3aVVDMVFYQ0lwTENCamIyeHZja3hwYzNSTWIyOXdLVnh1WEc0akl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJMXh1SXlCRGNtVmhkR2x1WnlCbWFXZDFjbVZ6SUhCbGNpQmxZV05vSUdOdmJtUnBkR2x2Yml3Z1pHbG1abVZ5Wlc1MGFXRnNYRzV1WVcxbElEd3RJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVndpWEc1a1lYUmhJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSXVkSE4yWENJcEtTbGNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVNrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbHpkR0Z1WTJVc0lHUnBabVpmWkZSQlIxOUVUVk5QTENCQmJtNXZNaWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXBJRHd0SUdNb1hDSmthWE4wWVc1alpWd2lMQ0JjSW5OamIzSmxYQ0lzSUZ3aVFXNXViekpjSWlsY2JtTnlaV0YwWlY5a2FYTjBYM1p6WDJGMlowUnBabVpUWTI5eVpWOXdaWEpVY21WaGRHMWxiblFvZEdWdGNDd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENKZlpGUkJSMXdpS1N3Z1l5aGNJbGd0V0Z3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWxNdFdGd2lMQ0JjSWxNdFUxd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lrVXRXRndpTEZ3aVJTMVRYQ0lzWENKRkxVVmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSlFMVVZjSWl4Y0lsQXRXRndpTENCY0lsQXRVMXdpTENCY0lsQXRVRndpS1N3Z1kyOXNiM0pNYVhOMFRHOXZjQ2xjYm1OeVpXRjBaVjlrYVhOMFgzWnpYMkYyWjBScFptWlRZMjl5WlY5d1pYSlVjbVZoZEcxbGJuUW9kR1Z0Y0N3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYQ0pmWkZSQlIxOVRSVndpS1N3Z1l5aGNJbGd0V0Z3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWxNdFdGd2lMQ0JjSWxNdFUxd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lrVXRXRndpTEZ3aVJTMVRYQ0lzWENKRkxVVmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSlFMVVZjSWl4Y0lsQXRXRndpTENCY0lsQXRVMXdpTENCY0lsQXRVRndpS1N3Z1kyOXNiM0pNYVhOMFRHOXZjQ3dnYzJVZ1BTQlVVbFZGS1Z4dWJtRnRaU0E4TFNCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY0lseHVaR0YwWVNBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpTG5SemRsd2lLU2twWEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0J6ZEdGeWRESWdMU0J6ZEdGeWRERXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwYzNSaGJtTmxMQ0JrYVdabVgwRTBPRFZmUkUxVFR5d2dRVzV1YnpJcFhHNWpiMnh1WVcxbGN5aDBaVzF3S1NBOExTQmpLRndpWkdsemRHRnVZMlZjSWl3Z1hDSnpZMjl5WlZ3aUxDQmNJa0Z1Ym04eVhDSXBYRzVqY21WaGRHVmZaR2x6ZEY5MmMxOWhkbWRFYVdabVUyTnZjbVZmY0dWeVZISmxZWFJ0Wlc1MEtIUmxiWEFzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYMEUwT0RWY0lpa3NJR01vWENKWUxWaGNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSlRMVmhjSWl3Z1hDSlRMVk5jSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0pGTFZoY0lpeGNJa1V0VTF3aUxGd2lSUzFGWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpVUMxRlhDSXNYQ0pRTFZoY0lpd2dYQ0pRTFZOY0lpd2dYQ0pRTFZCY0lpa3NJR052Ykc5eVRHbHpkRXh2YjNBcFhHNWNibU55WldGMFpWOWthWE4wWDNaelgyRjJaMFJwWm1aVFkyOXlaVjl3WlhKVWNtVmhkRzFsYm5Rb2RHVnRjQ3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZRVFE0TlY5VFJWd2lLU3dnWXloY0lsZ3RXRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbE10V0Z3aUxDQmNJbE10VTF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWtVdFdGd2lMRndpUlMxVFhDSXNYQ0pGTFVWY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKUUxVVmNJaXhjSWxBdFdGd2lMQ0JjSWxBdFUxd2lMQ0JjSWxBdFVGd2lLU3dnWTI5c2IzSk1hWE4wVEc5dmNDd2djMlVnUFNCVVVsVkZLVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5cbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxcY2xfYWxsXFwpLCB1bmlxdWUoZGF0YSRBbm5vMikpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXGNsX3N0cnVjdHVyZVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgIGMoXFxTLVNcXCwgXFxTLVhcXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXHMtc1xcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgIGMoXFxTLVNcXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXGNsX3JlZ3VsYXRvcnlcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwsIFxcRS1FXFwsIFxcRS1TXFwsIFxcRS1YXFwpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxjbF9wZS1wZVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXHAtcGVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICBjKFxcUC1QXFwsIFxcUC1FXFwpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxwLXBcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICBjKFxcUC1QXFwpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxwLWVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICBjKFxcUC1FXFwpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxlLWVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICBjKFxcRS1FXFwpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFx4LXhcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICBjKFxcWC1YXFwpKVxuIyMjIyMjIyMjIyNcbiMgQ3JlYXRpbmcgZGlmZmVyZW50aWFsIHNjYXR0ZXJwbG90XG5WaWV3KGRhdGEpXG5cblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBDcmVhdGluZyBmaWd1cmVzIHBlciBlYWNoIGNvbmRpdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9ETVNPXFwpLCBjKFxcWC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1YXFwsIFxcUy1TXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1YXFwsXFxFLVNcXCxcXEUtRVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFAtRVxcLFxcUC1YXFwsIFxcUC1TXFwsIFxcUC1QXFwpLCBjb2xvckxpc3RMb29wKVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZFRBRywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR1xcKSwgYyhcXFgtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtWFxcLCBcXFMtU1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtWFxcLFxcRS1TXFwsXFxFLUVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxQLUVcXCxcXFAtWFxcLCBcXFAtU1xcLCBcXFAtUFxcKSwgY29sb3JMaXN0TG9vcClcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgQTQ4NSwgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NVxcKSwgYyhcXFgtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtWFxcLCBcXFMtU1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtWFxcLFxcRS1TXFwsXFxFLUVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxQLUVcXCxcXFAtWFxcLCBcXFAtU1xcLCBcXFAtUFxcKSwgY29sb3JMaXN0TG9vcClcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgQ3JlYXRpbmcgZmlndXJlcyBwZXIgZWFjaCBjb25kaXRpb24sIGRpZmZlcmVudGlhbFxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBkaWZmX2RUQUdfRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIGMoXFxYLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVhcXCwgXFxTLVNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLVhcXCxcXEUtU1xcLFxcRS1FXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUC1FXFwsXFxQLVhcXCwgXFxQLVNcXCwgXFxQLVBcXCksIGNvbG9yTGlzdExvb3ApXG5jcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdfU0VcXCksIGMoXFxYLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVhcXCwgXFxTLVNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLVhcXCxcXEUtU1xcLFxcRS1FXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUC1FXFwsXFxQLVhcXCwgXFxQLVNcXCwgXFxQLVBcXCksIGNvbG9yTGlzdExvb3AsIHNlID0gVFJVRSlcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZGlmZl9BNDg1X0RNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1XFwpLCBjKFxcWC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1YXFwsIFxcUy1TXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1YXFwsXFxFLVNcXCxcXEUtRVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFAtRVxcLFxcUC1YXFwsIFxcUC1TXFwsIFxcUC1QXFwpLCBjb2xvckxpc3RMb29wKVxuXG5jcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVfU0VcXCksIGMoXFxYLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVhcXCwgXFxTLVNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLVhcXCxcXEUtU1xcLFxcRS1FXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUC1FXFwsXFxQLVhcXCwgXFxQLVNcXCwgXFxQLVBcXCksIGNvbG9yTGlzdExvb3AsIHNlID0gVFJVRSlcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->

name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

iterate_loop_functions(data, figDir, paste0(name, \_\, \cl_all\), unique(data$Anno2))
iterate_loop_functions(data, figDir, paste0(name, \_\, \cl_structure\), 
                       c(\S-S\, \S-X\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \s-s\), 
                       c(\S-S\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \cl_regulatory\), 
                       c(\P-P\, \P-E\, \P-S\, \P-X\, \E-E\, \E-S\, \E-X\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \cl_pe-pe\), 
                       c(\P-P\, \P-E\, \E-E\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \p-pe\), 
                       c(\P-P\, \P-E\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \p-p\), 
                       c(\P-P\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \p-e\), 
                       c(\P-E\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \e-e\), 
                       c(\E-E\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \x-x\), 
                       c(\X-X\))
###########
# Creating differential scatterplot
View(data)



#######################
# Creating figures per each condition
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_DMSO\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, dTAG, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, A485, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_A485\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop)

#######################
# Creating figures per each condition, differential
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_dTAG_SE\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop, se = TRUE)
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_A485_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_A485\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop)

create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_A485_SE\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop, se = TRUE)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNXVZVzFsSUR3dElGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWeGNYRzVrWVhSaElEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ3dWRITjJYRndwS1NsY2JseHVhWFJsY21GMFpWOXNiMjl3WDJaMWJtTjBhVzl1Y3loa1lYUmhMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY1hGOWNYQ3dnWEZ4amJGOWhiR3hjWENrc0lIVnVhWEYxWlNoa1lYUmhKRUZ1Ym04eUtTbGNibWwwWlhKaGRHVmZiRzl2Y0Y5bWRXNWpkR2x2Ym5Nb1pHRjBZU3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hGeGZYRndzSUZ4Y1kyeGZjM1J5ZFdOMGRYSmxYRndwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWXloY1hGTXRVMXhjTENCY1hGTXRXRnhjS1NsY2JtbDBaWEpoZEdWZmJHOXZjRjltZFc1amRHbHZibk1vWkdGMFlTd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZlhGd3NJRnhjY3kxelhGd3BMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZeWhjWEZNdFUxeGNLU2xjYm1sMFpYSmhkR1ZmYkc5dmNGOW1kVzVqZEdsdmJuTW9aR0YwWVN3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnhmWEZ3c0lGeGNZMnhmY21WbmRXeGhkRzl5ZVZ4Y0tTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTW9YRnhRTFZCY1hDd2dYRnhRTFVWY1hDd2dYRnhRTFZOY1hDd2dYRnhRTFZoY1hDd2dYRnhGTFVWY1hDd2dYRnhGTFZOY1hDd2dYRnhGTFZoY1hDa3BYRzVwZEdWeVlYUmxYMnh2YjNCZlpuVnVZM1JwYjI1ektHUmhkR0VzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNYMXhjTENCY1hHTnNYM0JsTFhCbFhGd3BMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZeWhjWEZBdFVGeGNMQ0JjWEZBdFJWeGNMQ0JjWEVVdFJWeGNLU2xjYm1sMFpYSmhkR1ZmYkc5dmNGOW1kVzVqZEdsdmJuTW9aR0YwWVN3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnhmWEZ3c0lGeGNjQzF3WlZ4Y0tTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTW9YRnhRTFZCY1hDd2dYRnhRTFVWY1hDa3BYRzVwZEdWeVlYUmxYMnh2YjNCZlpuVnVZM1JwYjI1ektHUmhkR0VzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNYMXhjTENCY1hIQXRjRnhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdNb1hGeFFMVkJjWENrcFhHNXBkR1Z5WVhSbFgyeHZiM0JmWm5WdVkzUnBiMjV6S0dSaGRHRXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gxeGNMQ0JjWEhBdFpWeGNLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR01vWEZ4UUxVVmNYQ2twWEc1cGRHVnlZWFJsWDJ4dmIzQmZablZ1WTNScGIyNXpLR1JoZEdFc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDF4Y0xDQmNYR1V0WlZ4Y0tTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTW9YRnhGTFVWY1hDa3BYRzVwZEdWeVlYUmxYMnh2YjNCZlpuVnVZM1JwYjI1ektHUmhkR0VzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNYMXhjTENCY1hIZ3RlRnhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdNb1hGeFlMVmhjWENrcFhHNGpJeU1qSXlNakl5TWpJMXh1SXlCRGNtVmhkR2x1WnlCa2FXWm1aWEpsYm5ScFlXd2djMk5oZEhSbGNuQnNiM1JjYmxacFpYY29aR0YwWVNsY2JseHVYRzVjYmlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpYRzRqSUVOeVpXRjBhVzVuSUdacFozVnlaWE1nY0dWeUlHVmhZMmdnWTI5dVpHbDBhVzl1WEc1dVlXMWxJRHd0SUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVZ4Y1hHNWtZWFJoSUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnd1ZEhOMlhGd3BLU2xjYm5SbGJYQWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGthWE4wWVc1alpTQTlJSE4wWVhKME1pQXRJSE4wWVhKME1Ta2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2x6ZEdGdVkyVXNJRVJOVTA4c0lFRnVibTh5S1Z4dVkyOXNibUZ0WlhNb2RHVnRjQ2tnUEMwZ1l5aGNYR1JwYzNSaGJtTmxYRndzSUZ4Y2MyTnZjbVZjWEN3Z1hGeEJibTV2TWx4Y0tWeHVZM0psWVhSbFgyUnBjM1JmZG5OZllYWm5VMk52Y21WZmNHVnlWSEpsWVhSdFpXNTBLSFJsYlhBc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDBSTlUwOWNYQ2tzSUdNb1hGeFlMVmhjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnhUTFZoY1hDd2dYRnhUTFZOY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4RkxWaGNYQ3hjWEVVdFUxeGNMRnhjUlMxRlhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y1VDMUZYRndzWEZ4UUxWaGNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWQmNYQ2tzSUdOdmJHOXlUR2x6ZEV4dmIzQXBYRzUwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1pHbHpkR0Z1WTJVZ1BTQnpkR0Z5ZERJZ0xTQnpkR0Z5ZERFcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBjM1JoYm1ObExDQmtWRUZITENCQmJtNXZNaWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXBJRHd0SUdNb1hGeGthWE4wWVc1alpWeGNMQ0JjWEhOamIzSmxYRndzSUZ4Y1FXNXViekpjWENsY2JtTnlaV0YwWlY5a2FYTjBYM1p6WDJGMloxTmpiM0psWDNCbGNsUnlaV0YwYldWdWRDaDBaVzF3TENCbWFXZEVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNYRjlrVkVGSFhGd3BMQ0JqS0Z4Y1dDMVlYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNVeTFZWEZ3c0lGeGNVeTFUWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjUlMxWVhGd3NYRnhGTFZOY1hDeGNYRVV0UlZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEZBdFJWeGNMRnhjVUMxWVhGd3NJRnhjVUMxVFhGd3NJRnhjVUMxUVhGd3BMQ0JqYjJ4dmNreHBjM1JNYjI5d0tWeHVYRzUwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1pHbHpkR0Z1WTJVZ1BTQnpkR0Z5ZERJZ0xTQnpkR0Z5ZERFcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBjM1JoYm1ObExDQkJORGcxTENCQmJtNXZNaWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXBJRHd0SUdNb1hGeGthWE4wWVc1alpWeGNMQ0JjWEhOamIzSmxYRndzSUZ4Y1FXNXViekpjWENsY2JtTnlaV0YwWlY5a2FYTjBYM1p6WDJGMloxTmpiM0psWDNCbGNsUnlaV0YwYldWdWRDaDBaVzF3TENCbWFXZEVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNYRjlCTkRnMVhGd3BMQ0JqS0Z4Y1dDMVlYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNVeTFZWEZ3c0lGeGNVeTFUWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjUlMxWVhGd3NYRnhGTFZOY1hDeGNYRVV0UlZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEZBdFJWeGNMRnhjVUMxWVhGd3NJRnhjVUMxVFhGd3NJRnhjVUMxUVhGd3BMQ0JqYjJ4dmNreHBjM1JNYjI5d0tWeHVYRzRqSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakkxeHVJeUJEY21WaGRHbHVaeUJtYVdkMWNtVnpJSEJsY2lCbFlXTm9JR052Ym1ScGRHbHZiaXdnWkdsbVptVnlaVzUwYVdGc1hHNXVZVzFsSUR3dElGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWeGNYRzVrWVhSaElEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ3dWRITjJYRndwS1NsY2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsemRHRnVZMlVzSUdScFptWmZaRlJCUjE5RVRWTlBMQ0JCYm01dk1pbGNibU52Ykc1aGJXVnpLSFJsYlhBcElEd3RJR01vWEZ4a2FYTjBZVzVqWlZ4Y0xDQmNYSE5qYjNKbFhGd3NJRnhjUVc1dWJ6SmNYQ2xjYm1OeVpXRjBaVjlrYVhOMFgzWnpYMkYyWjBScFptWlRZMjl5WlY5d1pYSlVjbVZoZEcxbGJuUW9kR1Z0Y0N3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnhmWkZSQlIxeGNLU3dnWXloY1hGZ3RXRnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRk10V0Z4Y0xDQmNYRk10VTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEVVdFdGeGNMRnhjUlMxVFhGd3NYRnhGTFVWY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4UUxVVmNYQ3hjWEZBdFdGeGNMQ0JjWEZBdFUxeGNMQ0JjWEZBdFVGeGNLU3dnWTI5c2IzSk1hWE4wVEc5dmNDbGNibU55WldGMFpWOWthWE4wWDNaelgyRjJaMFJwWm1aVFkyOXlaVjl3WlhKVWNtVmhkRzFsYm5Rb2RHVnRjQ3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hGeGZaRlJCUjE5VFJWeGNLU3dnWXloY1hGZ3RXRnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRk10V0Z4Y0xDQmNYRk10VTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEVVdFdGeGNMRnhjUlMxVFhGd3NYRnhGTFVWY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4UUxVVmNYQ3hjWEZBdFdGeGNMQ0JjWEZBdFUxeGNMQ0JjWEZBdFVGeGNLU3dnWTI5c2IzSk1hWE4wVEc5dmNDd2djMlVnUFNCVVVsVkZLVnh1Ym1GdFpTQThMU0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjWEZ4dVpHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNMblJ6ZGx4Y0tTa3BYRzUwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1pHbHpkR0Z1WTJVZ1BTQnpkR0Z5ZERJZ0xTQnpkR0Z5ZERFcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBjM1JoYm1ObExDQmthV1ptWDBFME9EVmZSRTFUVHl3Z1FXNXVieklwWEc1amIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGeGNaR2x6ZEdGdVkyVmNYQ3dnWEZ4elkyOXlaVnhjTENCY1hFRnVibTh5WEZ3cFhHNWpjbVZoZEdWZlpHbHpkRjkyYzE5aGRtZEVhV1ptVTJOdmNtVmZjR1Z5VkhKbFlYUnRaVzUwS0hSbGJYQXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gwRTBPRFZjWENrc0lHTW9YRnhZTFZoY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4VExWaGNYQ3dnWEZ4VExWTmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeEZMVmhjWEN4Y1hFVXRVMXhjTEZ4Y1JTMUZYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNVQzFGWEZ3c1hGeFFMVmhjWEN3Z1hGeFFMVk5jWEN3Z1hGeFFMVkJjWENrc0lHTnZiRzl5VEdsemRFeHZiM0FwWEc1Y2JtTnlaV0YwWlY5a2FYTjBYM1p6WDJGMlowUnBabVpUWTI5eVpWOXdaWEpVY21WaGRHMWxiblFvZEdWdGNDd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZlFUUTROVjlUUlZ4Y0tTd2dZeWhjWEZndFdGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hGTXRXRnhjTENCY1hGTXRVMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRVV0V0Z4Y0xGeGNSUzFUWEZ3c1hGeEZMVVZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnhRTFVWY1hDeGNYRkF0V0Z4Y0xDQmNYRkF0VTF4Y0xDQmNYRkF0VUZ4Y0tTd2dZMjlzYjNKTWFYTjBURzl2Y0N3Z2MyVWdQU0JVVWxWRktWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG5cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXGNsX2FsbFxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxjbF9zdHJ1Y3R1cmVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICBjKFxcUy1TXFwsIFxcUy1YXFwpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxzLXNcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICBjKFxcUy1TXFwpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxjbF9yZWd1bGF0b3J5XFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLCBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxcY2xfcGUtcGVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxwLXBlXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgYyhcXFAtUFxcLCBcXFAtRVxcKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxccC1wXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgYyhcXFAtUFxcKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxccC1lXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgYyhcXFAtRVxcKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxcZS1lXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgYyhcXEUtRVxcKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxceC14XFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgYyhcXFgtWFxcKSlcbiMjIyMjIyMjIyMjXG4jIENyZWF0aW5nIGRpZmZlcmVudGlhbCBzY2F0dGVycGxvdFxuVmlldyhkYXRhKVxuXG5cblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgQ3JlYXRpbmcgZmlndXJlcyBwZXIgZWFjaCBjb25kaXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfRE1TT1xcKSwgYyhcXFgtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtWFxcLCBcXFMtU1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtWFxcLFxcRS1TXFwsXFxFLUVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxQLUVcXCxcXFAtWFxcLCBcXFAtU1xcLCBcXFAtUFxcKSwgY29sb3JMaXN0TG9vcClcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRUQUcsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIGMoXFxYLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVhcXCwgXFxTLVNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLVhcXCxcXEUtU1xcLFxcRS1FXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUC1FXFwsXFxQLVhcXCwgXFxQLVNcXCwgXFxQLVBcXCksIGNvbG9yTGlzdExvb3ApXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIEE0ODUsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVcXCksIGMoXFxYLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVhcXCwgXFxTLVNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLVhcXCxcXEUtU1xcLFxcRS1FXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUC1FXFwsXFxQLVhcXCwgXFxQLVNcXCwgXFxQLVBcXCksIGNvbG9yTGlzdExvb3ApXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIENyZWF0aW5nIGZpZ3VyZXMgcGVyIGVhY2ggY29uZGl0aW9uLCBkaWZmZXJlbnRpYWxcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZGlmZl9kVEFHX0RNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHXFwpLCBjKFxcWC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1YXFwsIFxcUy1TXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1YXFwsXFxFLVNcXCxcXEUtRVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFAtRVxcLFxcUC1YXFwsIFxcUC1TXFwsIFxcUC1QXFwpLCBjb2xvckxpc3RMb29wKVxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHX1NFXFwpLCBjKFxcWC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1YXFwsIFxcUy1TXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1YXFwsXFxFLVNcXCxcXEUtRVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFAtRVxcLFxcUC1YXFwsIFxcUC1TXFwsIFxcUC1QXFwpLCBjb2xvckxpc3RMb29wLCBzZSA9IFRSVUUpXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSlcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfQTQ4NV9ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NVxcKSwgYyhcXFgtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtWFxcLCBcXFMtU1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtWFxcLFxcRS1TXFwsXFxFLUVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxQLUVcXCxcXFAtWFxcLCBcXFAtU1xcLCBcXFAtUFxcKSwgY29sb3JMaXN0TG9vcClcblxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1X1NFXFwpLCBjKFxcWC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1YXFwsIFxcUy1TXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1YXFwsXFxFLVNcXCxcXEUtRVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFAtRVxcLFxcUC1YXFwsIFxcUC1TXFwsIFxcUC1QXFwpLCBjb2xvckxpc3RMb29wLCBzZSA9IFRSVUUpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSlcblxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxjbF9hbGxcXCksIHVuaXF1ZShkYXRhJEFubm8yKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxcY2xfc3RydWN0dXJlXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgYyhcXFMtU1xcLCBcXFMtWFxcKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxccy1zXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgYyhcXFMtU1xcKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxcY2xfcmVndWxhdG9yeVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCwgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXGNsX3BlLXBlXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxccC1wZVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgIGMoXFxQLVBcXCwgXFxQLUVcXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXHAtcFxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgIGMoXFxQLVBcXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXHAtZVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgIGMoXFxQLUVcXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXGUtZVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgIGMoXFxFLUVcXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXHgteFxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgIGMoXFxYLVhcXCkpXG4jIyMjIyMjIyMjI1xuIyBDcmVhdGluZyBkaWZmZXJlbnRpYWwgc2NhdHRlcnBsb3RcblZpZXcoZGF0YSlcblxuXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIENyZWF0aW5nIGZpZ3VyZXMgcGVyIGVhY2ggY29uZGl0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSlcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIERNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0RNU09cXCksIGMoXFxYLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVhcXCwgXFxTLVNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLVhcXCxcXEUtU1xcLFxcRS1FXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUC1FXFwsXFxQLVhcXCwgXFxQLVNcXCwgXFxQLVBcXCksIGNvbG9yTGlzdExvb3ApXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBkVEFHLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHXFwpLCBjKFxcWC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1YXFwsIFxcUy1TXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1YXFwsXFxFLVNcXCxcXEUtRVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFAtRVxcLFxcUC1YXFwsIFxcUC1TXFwsIFxcUC1QXFwpLCBjb2xvckxpc3RMb29wKVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBBNDg1LCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1XFwpLCBjKFxcWC1YXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUy1YXFwsIFxcUy1TXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRS1YXFwsXFxFLVNcXCxcXEUtRVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFAtRVxcLFxcUC1YXFwsIFxcUC1TXFwsIFxcUC1QXFwpLCBjb2xvckxpc3RMb29wKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBDcmVhdGluZyBmaWd1cmVzIHBlciBlYWNoIGNvbmRpdGlvbiwgZGlmZmVyZW50aWFsXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSlcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfZFRBR19ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR1xcKSwgYyhcXFgtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtWFxcLCBcXFMtU1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtWFxcLFxcRS1TXFwsXFxFLUVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxQLUVcXCxcXFAtWFxcLCBcXFAtU1xcLCBcXFAtUFxcKSwgY29sb3JMaXN0TG9vcClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR19TRVxcKSwgYyhcXFgtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtWFxcLCBcXFMtU1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtWFxcLFxcRS1TXFwsXFxFLUVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxQLUVcXCxcXFAtWFxcLCBcXFAtU1xcLCBcXFAtUFxcKSwgY29sb3JMaXN0TG9vcCwgc2UgPSBUUlVFKVxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBkaWZmX0E0ODVfRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVcXCksIGMoXFxYLVhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTLVhcXCwgXFxTLVNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFLVhcXCxcXEUtU1xcLFxcRS1FXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcUC1FXFwsXFxQLVhcXCwgXFxQLVNcXCwgXFxQLVBcXCksIGNvbG9yTGlzdExvb3ApXG5cbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NV9TRVxcKSwgYyhcXFgtWFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFMtWFxcLCBcXFMtU1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEUtWFxcLFxcRS1TXFwsXFxFLUVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxQLUVcXCxcXFAtWFxcLCBcXFAtU1xcLCBcXFAtUFxcKSwgY29sb3JMaXN0TG9vcCwgc2UgPSBUUlVFKVxuYGBgXG5gYGAifQ== -->

```r
```r

name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

iterate_loop_functions(data, figDir, paste0(name, \_\, \cl_all\), unique(data$Anno2))
iterate_loop_functions(data, figDir, paste0(name, \_\, \cl_structure\), 
                       c(\S-S\, \S-X\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \s-s\), 
                       c(\S-S\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \cl_regulatory\), 
                       c(\P-P\, \P-E\, \P-S\, \P-X\, \E-E\, \E-S\, \E-X\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \cl_pe-pe\), 
                       c(\P-P\, \P-E\, \E-E\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \p-pe\), 
                       c(\P-P\, \P-E\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \p-p\), 
                       c(\P-P\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \p-e\), 
                       c(\P-E\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \e-e\), 
                       c(\E-E\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \x-x\), 
                       c(\X-X\))
###########
# Creating differential scatterplot
View(data)



#######################
# Creating figures per each condition
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_DMSO\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, dTAG, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, A485, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_A485\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop)

#######################
# Creating figures per each condition, differential
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_dTAG_SE\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop, se = TRUE)
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_A485_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_A485\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop)

create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_A485_SE\), c(\X-X\,
                                                                 \S-X\, \S-S\,
                                                                 \E-X\,\E-S\,\E-E\,
                                                                 \P-E\,\P-X\, \P-S\, \P-P\), colorListLoop, se = TRUE)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



### [2.6] Comparing across samples for conesnsus loop
#### Functions

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgwRnVibTh6TG5SemRsd2lLU2twWEc1a2FXWm1RM1YwYjJabUlEd3RJREF1TWx4dVhHNGpJRk53YkdsMGRHbHVaeUJrWVhSaFhHNWtZWFJoTG5KbFp5QThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtFRnVibTh6SUQwOUlGd2ljbVZuWENJcFhHNWtZWFJoTG5OMGNpQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtFRnVibTh6SUQwOUlGd2ljM1J5WENJcFhHNWNiaU1nVkdGcmFXNW5JR052WkdWeklHWnliMjBnY0hKbGRtbHZkWE1nWm5WdVkzUnBiMjRnS0hOMGNpbGNibVJoZEdFZ1BDMGdaR0YwWVM1emRISmNibVJoZEdFZ1BDMGdaR0YwWVNBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDFjR1J2ZDI1ZlpGUkJSMTlFVFZOUElEMGdhV1psYkhObEtHUnBabVpmWkZSQlIxOUVUVk5QSUQ0Z1pHbG1aa04xZEc5bVppd2dYQ0pWVUZ3aUxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoa2FXWm1YMlJVUVVkZlJFMVRUeUErSUMxa2FXWm1RM1YwYjJabUxDQmNJazVQWENJc0lGd2lSRTlYVGx3aUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkWEJrYjNkdVgwRTBPRFZmUkUxVFR5QTlJR2xtWld4elpTaGthV1ptWDBFME9EVmZSRTFUVHlBK0lHUnBabVpEZFhSdlptWXNJRndpVlZCY0lpd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1pHbG1abDlCTkRnMVgwUk5VMDhnUGlBdFpHbG1aa04xZEc5bVppd2dYQ0pPVDF3aUxDQmNJa1JQVjA1Y0lpa3BLVnh1WkdGMFlTUjFjR1J2ZDI1ZlpGUkJSMTlFVFZOUElEd3RJR1poWTNSdmNpaGtZWFJoSkhWd1pHOTNibDlrVkVGSFgwUk5VMDhzSUd4bGRtVnNjeUE5SUdNb1hDSlZVRndpTENCY0lrNVBYQ0lzSUZ3aVJFOVhUbHdpS1NsY2JtUmhkR0VrZFhCa2IzZHVYMEUwT0RWZlJFMVRUeUE4TFNCbVlXTjBiM0lvWkdGMFlTUjFjR1J2ZDI1ZlFUUTROVjlFVFZOUExDQnNaWFpsYkhNZ1BTQmpLRndpVlZCY0lpd2dYQ0pPVDF3aUxDQmNJa1JQVjA1Y0lpa3BYRzVjYm01MWJTNTFjQ0E4TFNBb2MzVnRiV0Z5ZVNoa1lYUmhKSFZ3Wkc5M2JsOWtWRUZIWDBSTlUwOHBLVnRjSWxWUVhDSmRYRzV1ZFcwdWJtOGdQQzBnS0hOMWJXMWhjbmtvWkdGMFlTUjFjR1J2ZDI1ZlpGUkJSMTlFVFZOUEtTbGJYQ0pPVDF3aVhWeHViblZ0TG1SdmQyNGdQQzBnS0hOMWJXMWhjbmtvWkdGMFlTUjFjR1J2ZDI1ZlpGUkJSMTlFVFZOUEtTbGJYQ0pFVDFkT1hDSmRYRzV1ZFcwdVlXeHNJRHd0SUc1MWJTNTFjQ0FySUc1MWJTNXVieUFySUc1MWJTNWtiM2R1WEc1d1pYSmpMblZ3SUR3dElISnZkVzVrS0c1MWJTNTFjQ0F2SUc1MWJTNWhiR3dnS2lBeE1EQXNJRElwWEc1d1pYSmpMbTV2SUR3dElISnZkVzVrS0c1MWJTNXVieUF2SUc1MWJTNWhiR3dnS2lBeE1EQXNJRElwWEc1d1pYSmpMbVJ2ZDI0Z1BDMGdjbTkxYm1Rb2JuVnRMbVJ2ZDI0Z0x5QnVkVzB1WVd4c0lDb2dNVEF3TENBeUtWeHVYRzVrWVhSaEpHUmxibk5wZEhrZ1BDMGdaMlYwWDJSbGJuTnBkSGtvWkdGMFlTUkVUVk5QTENCa1lYUmhKR1JVUVVjc0lHNGdQU0F4TURBcFhHNWtZWFJoSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dSbGJuTnBkSGtwWEc1d01TQThMU0JuWjNCc2IzUW9aR0YwWVN3Z1lXVnpLSGdnUFNCRVRWTlBMQ0I1SUQwZ1pGUkJSeXdnWTI5c2IzSWdQU0JrWlc1emFYUjVLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ1hHNGdJSE5qWVd4bFgyTnZiRzl5WDNacGNtbGthWE1vS1NBclhHNGdJSGhzYVcwb0xUQXVOU3dnTVNrZ0t5QjViR2x0S0Mwd0xqVXNJREVwSUNzZ1kyOXZjbVJmWm1sNFpXUW9LU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ01Dd2dZMjlzSUQwZ1hDSm5jbVY1TlRCY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdMV1JwWm1aRGRYUnZabVlzSUdOdmJDQTlJRndpWjNKbGVWd2lMQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHOTBkR1ZrWENJcElDdGNiaUFnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0JrYVdabVEzVjBiMlptTENCamIyd2dQU0JjSW1keVpYbGNJaXdnYkdsdVpYUjVjR1VnUFNCY0ltUnZkSFJsWkZ3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGd2laM0psZVZ3aUtTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJREFzSUdGc2NHaGhJRDBnTUM0MUxDQmpiMnh2Y2lBOUlGd2laM0psZVZ3aUtTQXJYRzRnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdMVEF1TlN3Z2VTQTlJREVzSUd4aFltVnNJRDBnY0dGemRHVXdLRndpVlZBNklGd2lMQ0J1ZFcwdWRYQXNJRndpSUNoY0lpd2djR1Z5WXk1MWNDd2dYQ0lsS1Z3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektTQXJYRzRnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdMVEF1TlN3Z2VTQTlJREV0TUM0eExDQnNZV0psYkNBOUlIQmhjM1JsTUNoY0lrNVBPaUJjSWl3Z2JuVnRMbTV2TENCY0lpQW9YQ0lzSUhCbGNtTXVibThzSUZ3aUpTbGNJaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNeWtnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SUMwd0xqVXNJSGtnUFNBeExUQXVNaXdnYkdGaVpXd2dQU0J3WVhOMFpUQW9YQ0pFVDFkT09pQmNJaXdnYm5WdExtUnZkMjRzSUZ3aUlDaGNJaXdnY0dWeVl5NWtiM2R1TENCY0lpVXBYQ0lwTENCY2JpQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wSUN0Y2JpQWdkR2hsYldWZlkyeGhjM05wWXlncElDc2daMmQwYVhSc1pTaHVZVzFsS1NBcklIUm9aVzFsS0hCc2IzUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFVwS1Z4dVhHNGpJRlJoYTJsdVp5QmpiMlJsY3lCbWNtOXRJSEJ5WlhacGIzVnpJR1oxYm1OMGFXOXVJQ2h5WldjcFhHNWtZWFJoSUR3dElHUmhkR0V1Y21WblhHNWtZWFJoSUR3dElHUmhkR0VnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2RYQmtiM2R1WDJSVVFVZGZSRTFUVHlBOUlHbG1aV3h6WlNoa2FXWm1YMlJVUVVkZlJFMVRUeUErSUdScFptWkRkWFJ2Wm1Zc0lGd2lWVkJjSWl3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWkdsbVpsOWtWRUZIWDBSTlUwOGdQaUF0WkdsbVprTjFkRzltWml3Z1hDSk9UMXdpTENCY0lrUlBWMDVjSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIVndaRzkzYmw5Qk5EZzFYMFJOVTA4Z1BTQnBabVZzYzJVb1pHbG1abDlCTkRnMVgwUk5VMDhnUGlCa2FXWm1RM1YwYjJabUxDQmNJbFZRWENJc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dScFptWmZRVFE0TlY5RVRWTlBJRDRnTFdScFptWkRkWFJ2Wm1Zc0lGd2lUazljSWl3Z1hDSkVUMWRPWENJcEtTbGNibVJoZEdFa2RYQmtiM2R1WDJSVVFVZGZSRTFUVHlBOExTQm1ZV04wYjNJb1pHRjBZU1IxY0dSdmQyNWZaRlJCUjE5RVRWTlBMQ0JzWlhabGJITWdQU0JqS0Z3aVZWQmNJaXdnWENKT1Qxd2lMQ0JjSWtSUFYwNWNJaWtwWEc1a1lYUmhKSFZ3Wkc5M2JsOUJORGcxWDBSTlUwOGdQQzBnWm1GamRHOXlLR1JoZEdFa2RYQmtiM2R1WDBFME9EVmZSRTFUVHl3Z2JHVjJaV3h6SUQwZ1l5aGNJbFZRWENJc0lGd2lUazljSWl3Z1hDSkVUMWRPWENJcEtWeHVYRzV1ZFcwdWRYQWdQQzBnS0hOMWJXMWhjbmtvWkdGMFlTUjFjR1J2ZDI1ZlpGUkJSMTlFVFZOUEtTbGJYQ0pWVUZ3aVhWeHViblZ0TG01dklEd3RJQ2h6ZFcxdFlYSjVLR1JoZEdFa2RYQmtiM2R1WDJSVVFVZGZSRTFUVHlrcFcxd2lUazljSWwxY2JtNTFiUzVrYjNkdUlEd3RJQ2h6ZFcxdFlYSjVLR1JoZEdFa2RYQmtiM2R1WDJSVVFVZGZSRTFUVHlrcFcxd2lSRTlYVGx3aVhWeHViblZ0TG1Gc2JDQThMU0J1ZFcwdWRYQWdLeUJ1ZFcwdWJtOGdLeUJ1ZFcwdVpHOTNibHh1Y0dWeVl5NTFjQ0E4TFNCeWIzVnVaQ2h1ZFcwdWRYQWdMeUJ1ZFcwdVlXeHNJQ29nTVRBd0xDQXlLVnh1Y0dWeVl5NXVieUE4TFNCeWIzVnVaQ2h1ZFcwdWJtOGdMeUJ1ZFcwdVlXeHNJQ29nTVRBd0xDQXlLVnh1Y0dWeVl5NWtiM2R1SUR3dElISnZkVzVrS0c1MWJTNWtiM2R1SUM4Z2JuVnRMbUZzYkNBcUlERXdNQ3dnTWlsY2JseHVaR0YwWVNSa1pXNXphWFI1SUR3dElHZGxkRjlrWlc1emFYUjVLR1JoZEdFa1JFMVRUeXdnWkdGMFlTUmtWRUZITENCdUlEMGdNVEF3S1Z4dVpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlc1emFYUjVLVnh1Y0RJZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnUkUxVFR5d2dlU0E5SUdSVVFVY3NJR052Ykc5eUlEMGdaR1Z1YzJsMGVTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDaHphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FySUZ4dUlDQnpZMkZzWlY5amIyeHZjbDkyYVhKcFpHbHpLQ2tnSzF4dUlDQjRiR2x0S0Mwd0xqVXNJREVwSUNzZ2VXeHBiU2d0TUM0MUxDQXhLU0FySUdOdmIzSmtYMlpwZUdWa0tDa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SURBc0lHTnZiQ0E5SUZ3aVozSmxlVFV3WENJc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlDMWthV1ptUTNWMGIyWm1MQ0JqYjJ3Z1BTQmNJbWR5WlhsY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SdmRIUmxaRndpS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnWTI5c0lEMGdYQ0puY21WNVhDSXNJR3hwYm1WMGVYQmxJRDBnWENKa2IzUjBaV1JjSWlrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMQ0JoYkhCb1lTQTlJREF1TlN3Z1kyOXNiM0lnUFNCY0ltZHlaWGxjSWlrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXdMQ0JoYkhCb1lTQTlJREF1TlN3Z1kyOXNiM0lnUFNCY0ltZHlaWGxjSWlrZ0sxeHVJQ0JoYm01dmRHRjBaU2hjSW5SbGVIUmNJaXdnZUNBOUlDMHdMalVzSUhrZ1BTQXhMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbFZRT2lCY0lpd2diblZ0TG5Wd0xDQmNJaUFvWENJc0lIQmxjbU11ZFhBc0lGd2lKU2xjSWlrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXdnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTXlrZ0sxeHVJQ0JoYm01dmRHRjBaU2hjSW5SbGVIUmNJaXdnZUNBOUlDMHdMalVzSUhrZ1BTQXhMVEF1TVN3Z2JHRmlaV3dnUFNCd1lYTjBaVEFvWENKT1R6b2dYQ0lzSUc1MWJTNXVieXdnWENJZ0tGd2lMQ0J3WlhKakxtNXZMQ0JjSWlVcFhDSXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBJQ3RjYmlBZ1lXNXViM1JoZEdVb1hDSjBaWGgwWENJc0lIZ2dQU0F0TUM0MUxDQjVJRDBnTVMwd0xqSXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGd2lSRTlYVGpvZ1hDSXNJRzUxYlM1a2IzZHVMQ0JjSWlBb1hDSXNJSEJsY21NdVpHOTNiaXdnWENJbEtWd2lLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXpLU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHZG5kR2wwYkdVb2JtRnRaU2tnS3lCMGFHVnRaU2h3Ykc5MExuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTFLU2tnSUZ4dUlDQmNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWMyTmhkSFJsY25Cc2IzUmZYQ0lzSUc1aGJXVXNJRndpWDF3aUxDQmthV1ptUTNWMGIyWm1MQ0JjSWw5d2RYSmxYM04wY2w5eVpXZGNJaWxjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFJ6SUQwZ1hDSnBibHdpTENCM2FXUjBhQ0E5SURVcU1TNDFMQ0JvWldsbmFIUWdQU0F5TGpVcU1TNDFLVnh1Y0hKcGJuUW9ZMjkzY0d4dmREbzZjR3h2ZEY5bmNtbGtLSEF4TENCd01pd2dZV3hwWjI0Z1BTQmNJbWhjSWlrcFhHNWtaWFl1YjJabUtDbGNibHh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrcExDQmNiaUFnSUNBZ0lDQWdkMmxrZEdnZ1BTQTFLakV1TlN3Z2FHVnBaMmgwSUQwZ01pNDFLakV1TlNsY2JuQnlhVzUwS0dOdmQzQnNiM1E2T25Cc2IzUmZaM0pwWkNod01Td2djRElzSUdGc2FXZHVJRDBnWENKb1hDSXBLVnh1WkdWMkxtOW1aaWdwWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfQW5ubzMudHN2XFwpKSlcbmRpZmZDdXRvZmYgPC0gMC4yXG5cbiMgU3BsaXR0aW5nIGRhdGFcbmRhdGEucmVnIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzMgPT0gXFxyZWdcXClcbmRhdGEuc3RyIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzMgPT0gXFxzdHJcXClcblxuIyBUYWtpbmcgY29kZXMgZnJvbSBwcmV2aW91cyBmdW5jdGlvbiAoc3RyKVxuZGF0YSA8LSBkYXRhLnN0clxuZGF0YSA8LSBkYXRhICU+JVxuICBkcGx5cjo6bXV0YXRlKHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiBkaWZmQ3V0b2ZmLCBcXFVQXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSxcbiAgICAgICAgICAgICAgICB1cGRvd25fQTQ4NV9ETVNPID0gaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSkpXG5kYXRhJHVwZG93bl9kVEFHX0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX2RUQUdfRE1TTywgbGV2ZWxzID0gYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpKVxuZGF0YSR1cGRvd25fQTQ4NV9ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9BNDg1X0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcblxubnVtLnVwIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpW1xcVVBcXF1cbm51bS5ubyA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVtcXE5PXFxdXG5udW0uZG93biA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVtcXERPV05cXF1cbm51bS5hbGwgPC0gbnVtLnVwICsgbnVtLm5vICsgbnVtLmRvd25cbnBlcmMudXAgPC0gcm91bmQobnVtLnVwIC8gbnVtLmFsbCAqIDEwMCwgMilcbnBlcmMubm8gPC0gcm91bmQobnVtLm5vIC8gbnVtLmFsbCAqIDEwMCwgMilcbnBlcmMuZG93biA8LSByb3VuZChudW0uZG93biAvIG51bS5hbGwgKiAxMDAsIDIpXG5cbmRhdGEkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShkYXRhJERNU08sIGRhdGEkZFRBRywgbiA9IDEwMClcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbnAxIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IERNU08sIHkgPSBkVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgKyBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoXFxVUDogXFwsIG51bS51cCwgXFwgKFxcLCBwZXJjLnVwLCBcXCUpXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMS0wLjEsIGxhYmVsID0gcGFzdGUwKFxcTk86IFxcLCBudW0ubm8sIFxcIChcXCwgcGVyYy5ubywgXFwlKVxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4yLCBsYWJlbCA9IHBhc3RlMChcXERPV046IFxcLCBudW0uZG93biwgXFwgKFxcLCBwZXJjLmRvd24sIFxcJSlcXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKG5hbWUpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpXG5cbiMgVGFraW5nIGNvZGVzIGZyb20gcHJldmlvdXMgZnVuY3Rpb24gKHJlZylcbmRhdGEgPC0gZGF0YS5yZWdcbmRhdGEgPC0gZGF0YSAlPiVcbiAgZHBseXI6Om11dGF0ZSh1cGRvd25fZFRBR19ETVNPID0gaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpKVxuZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbmRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG5cbm51bS51cCA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVtcXFVQXFxdXG5udW0ubm8gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxOT1xcXVxubnVtLmRvd24gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxET1dOXFxdXG5udW0uYWxsIDwtIG51bS51cCArIG51bS5ubyArIG51bS5kb3duXG5wZXJjLnVwIDwtIHJvdW5kKG51bS51cCAvIG51bS5hbGwgKiAxMDAsIDIpXG5wZXJjLm5vIDwtIHJvdW5kKG51bS5ubyAvIG51bS5hbGwgKiAxMDAsIDIpXG5wZXJjLmRvd24gPC0gcm91bmQobnVtLmRvd24gLyBudW0uYWxsICogMTAwLCAyKVxuXG5kYXRhJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoZGF0YSRETVNPLCBkYXRhJGRUQUcsIG4gPSAxMDApXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5wMiA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUwKFxcVVA6IFxcLCBudW0udXAsIFxcIChcXCwgcGVyYy51cCwgXFwlKVxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4xLCBsYWJlbCA9IHBhc3RlMChcXE5POiBcXCwgbnVtLm5vLCBcXCAoXFwsIHBlcmMubm8sIFxcJSlcXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLTAuMiwgbGFiZWwgPSBwYXN0ZTAoXFxET1dOOiBcXCwgbnVtLmRvd24sIFxcIChcXCwgcGVyYy5kb3duLCBcXCUpXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShuYW1lKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKSAgXG4gIFxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxzY2F0dGVycGxvdF9cXCwgbmFtZSwgXFxfXFwsIGRpZmZDdXRvZmYsIFxcX3B1cmVfc3RyX3JlZ1xcKVxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNSoxLjUsIGhlaWdodCA9IDIuNSoxLjUpXG5wcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbmRldi5vZmYoKVxuXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICB3aWR0aCA9IDUqMS41LCBoZWlnaHQgPSAyLjUqMS41KVxucHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \_Anno3.tsv\)))
diffCutoff <- 0.2

# Splitting data
data.reg <- data %>% dplyr::filter(Anno3 == \reg\)
data.str <- data %>% dplyr::filter(Anno3 == \str\)

# Taking codes from previous function (str)
data <- data.str
data <- data %>%
  dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)))
data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))

num.up <- (summary(data$updown_dTAG_DMSO))[\UP\]
num.no <- (summary(data$updown_dTAG_DMSO))[\NO\]
num.down <- (summary(data$updown_dTAG_DMSO))[\DOWN\]
num.all <- num.up + num.no + num.down
perc.up <- round(num.up / num.all * 100, 2)
perc.no <- round(num.no / num.all * 100, 2)
perc.down <- round(num.down / num.all * 100, 2)

data$density <- get_density(data$DMSO, data$dTAG, n = 100)
data <- data %>% dplyr::arrange(density)
p1 <- ggplot(data, aes(x = DMSO, y = dTAG, color = density)) +
  geom_point(show.legend = FALSE) + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  annotate(\text\, x = -0.5, y = 1, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  theme_classic() + ggtitle(name) + theme(plot.title = element_text(size = 5))

# Taking codes from previous function (reg)
data <- data.reg
data <- data %>%
  dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)))
data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))

num.up <- (summary(data$updown_dTAG_DMSO))[\UP\]
num.no <- (summary(data$updown_dTAG_DMSO))[\NO\]
num.down <- (summary(data$updown_dTAG_DMSO))[\DOWN\]
num.all <- num.up + num.no + num.down
perc.up <- round(num.up / num.all * 100, 2)
perc.no <- round(num.no / num.all * 100, 2)
perc.down <- round(num.down / num.all * 100, 2)

data$density <- get_density(data$DMSO, data$dTAG, n = 100)
data <- data %>% dplyr::arrange(density)
p2 <- ggplot(data, aes(x = DMSO, y = dTAG, color = density)) +
  geom_point(show.legend = FALSE) + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  annotate(\text\, x = -0.5, y = 1, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  theme_classic() + ggtitle(name) + theme(plot.title = element_text(size = 5))  
  

fileName <- paste0(\scatterplot_\, name, \_\, diffCutoff, \_pure_str_reg\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 5*1.5, height = 2.5*1.5)
print(cowplot::plot_grid(p1, p2, align = \h\))
dev.off()

svglite(here(figDir, paste0(fileName, \.svg\)), 
        width = 5*1.5, height = 2.5*1.5)
print(cowplot::plot_grid(p1, p2, align = \h\))
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVaR0YwWVNBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDBGdWJtOHpMblJ6ZGx4Y0tTa3BYRzVrYVdabVEzVjBiMlptSUR3dElEQXVNbHh1WEc0aklGTndiR2wwZEdsdVp5QmtZWFJoWEc1a1lYUmhMbkpsWnlBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHpJRDA5SUZ4Y2NtVm5YRndwWEc1a1lYUmhMbk4wY2lBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHpJRDA5SUZ4Y2MzUnlYRndwWEc1Y2JpTWdWR0ZyYVc1bklHTnZaR1Z6SUdaeWIyMGdjSEpsZG1sdmRYTWdablZ1WTNScGIyNGdLSE4wY2lsY2JtUmhkR0VnUEMwZ1pHRjBZUzV6ZEhKY2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMWNHUnZkMjVmWkZSQlIxOUVUVk5QSUQwZ2FXWmxiSE5sS0dScFptWmZaRlJCUjE5RVRWTlBJRDRnWkdsbVprTjFkRzltWml3Z1hGeFZVRnhjTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hrYVdabVgyUlVRVWRmUkUxVFR5QStJQzFrYVdabVEzVjBiMlptTENCY1hFNVBYRndzSUZ4Y1JFOVhUbHhjS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RYQmtiM2R1WDBFME9EVmZSRTFUVHlBOUlHbG1aV3h6WlNoa2FXWm1YMEUwT0RWZlJFMVRUeUErSUdScFptWkRkWFJ2Wm1Zc0lGeGNWVkJjWEN3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWkdsbVpsOUJORGcxWDBSTlUwOGdQaUF0WkdsbVprTjFkRzltWml3Z1hGeE9UMXhjTENCY1hFUlBWMDVjWENrcEtWeHVaR0YwWVNSMWNHUnZkMjVmWkZSQlIxOUVUVk5QSUR3dElHWmhZM1J2Y2loa1lYUmhKSFZ3Wkc5M2JsOWtWRUZIWDBSTlUwOHNJR3hsZG1Wc2N5QTlJR01vWEZ4VlVGeGNMQ0JjWEU1UFhGd3NJRnhjUkU5WFRseGNLU2xjYm1SaGRHRWtkWEJrYjNkdVgwRTBPRFZmUkUxVFR5QThMU0JtWVdOMGIzSW9aR0YwWVNSMWNHUnZkMjVmUVRRNE5WOUVUVk5QTENCc1pYWmxiSE1nUFNCaktGeGNWVkJjWEN3Z1hGeE9UMXhjTENCY1hFUlBWMDVjWENrcFhHNWNibTUxYlM1MWNDQThMU0FvYzNWdGJXRnllU2hrWVhSaEpIVndaRzkzYmw5a1ZFRkhYMFJOVTA4cEtWdGNYRlZRWEZ4ZFhHNXVkVzB1Ym04Z1BDMGdLSE4xYlcxaGNua29aR0YwWVNSMWNHUnZkMjVmWkZSQlIxOUVUVk5QS1NsYlhGeE9UMXhjWFZ4dWJuVnRMbVJ2ZDI0Z1BDMGdLSE4xYlcxaGNua29aR0YwWVNSMWNHUnZkMjVmWkZSQlIxOUVUVk5QS1NsYlhGeEVUMWRPWEZ4ZFhHNXVkVzB1WVd4c0lEd3RJRzUxYlM1MWNDQXJJRzUxYlM1dWJ5QXJJRzUxYlM1a2IzZHVYRzV3WlhKakxuVndJRHd0SUhKdmRXNWtLRzUxYlM1MWNDQXZJRzUxYlM1aGJHd2dLaUF4TURBc0lESXBYRzV3WlhKakxtNXZJRHd0SUhKdmRXNWtLRzUxYlM1dWJ5QXZJRzUxYlM1aGJHd2dLaUF4TURBc0lESXBYRzV3WlhKakxtUnZkMjRnUEMwZ2NtOTFibVFvYm5WdExtUnZkMjRnTHlCdWRXMHVZV3hzSUNvZ01UQXdMQ0F5S1Z4dVhHNWtZWFJoSkdSbGJuTnBkSGtnUEMwZ1oyVjBYMlJsYm5OcGRIa29aR0YwWVNSRVRWTlBMQ0JrWVhSaEpHUlVRVWNzSUc0Z1BTQXhNREFwWEc1a1lYUmhJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JsYm5OcGRIa3BYRzV3TVNBOExTQm5aM0JzYjNRb1pHRjBZU3dnWVdWektIZ2dQU0JFVFZOUExDQjVJRDBnWkZSQlJ5d2dZMjlzYjNJZ1BTQmtaVzV6YVhSNUtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnWEc0Z0lITmpZV3hsWDJOdmJHOXlYM1pwY21sa2FYTW9LU0FyWEc0Z0lIaHNhVzBvTFRBdU5Td2dNU2tnS3lCNWJHbHRLQzB3TGpVc0lERXBJQ3NnWTI5dmNtUmZabWw0WldRb0tTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTUN3Z1kyOXNJRDBnWEZ4bmNtVjVOVEJjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ0xXUnBabVpEZFhSdlptWXNJR052YkNBOUlGeGNaM0psZVZ4Y0xDQnNhVzVsZEhsd1pTQTlJRnhjWkc5MGRHVmtYRndwSUN0Y2JpQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQmthV1ptUTNWMGIyWm1MQ0JqYjJ3Z1BTQmNYR2R5WlhsY1hDd2diR2x1WlhSNWNHVWdQU0JjWEdSdmRIUmxaRnhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ4Y1ozSmxlVnhjS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ4Y1ozSmxlVnhjS1NBclhHNGdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ0xUQXVOU3dnZVNBOUlERXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGeGNWVkE2SUZ4Y0xDQnVkVzB1ZFhBc0lGeGNJQ2hjWEN3Z2NHVnlZeTUxY0N3Z1hGd2xLVnhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F6S1NBclhHNGdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ0xUQXVOU3dnZVNBOUlERXRNQzR4TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjWEU1UE9pQmNYQ3dnYm5WdExtNXZMQ0JjWENBb1hGd3NJSEJsY21NdWJtOHNJRnhjSlNsY1hDa3NJRnh1SUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ015a2dLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJQzB3TGpVc0lIa2dQU0F4TFRBdU1pd2diR0ZpWld3Z1BTQndZWE4wWlRBb1hGeEVUMWRPT2lCY1hDd2diblZ0TG1SdmQyNHNJRnhjSUNoY1hDd2djR1Z5WXk1a2IzZHVMQ0JjWENVcFhGd3BMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBJQ3RjYmlBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1oyZDBhWFJzWlNodVlXMWxLU0FySUhSb1pXMWxLSEJzYjNRdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9jMmw2WlNBOUlEVXBLVnh1WEc0aklGUmhhMmx1WnlCamIyUmxjeUJtY205dElIQnlaWFpwYjNWeklHWjFibU4wYVc5dUlDaHlaV2NwWEc1a1lYUmhJRHd0SUdSaGRHRXVjbVZuWEc1a1lYUmhJRHd0SUdSaGRHRWdKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvZFhCa2IzZHVYMlJVUVVkZlJFMVRUeUE5SUdsbVpXeHpaU2hrYVdabVgyUlVRVWRmUkUxVFR5QStJR1JwWm1aRGRYUnZabVlzSUZ4Y1ZWQmNYQ3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aR2xtWmw5a1ZFRkhYMFJOVTA4Z1BpQXRaR2xtWmtOMWRHOW1aaXdnWEZ4T1QxeGNMQ0JjWEVSUFYwNWNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhWd1pHOTNibDlCTkRnMVgwUk5VMDhnUFNCcFptVnNjMlVvWkdsbVpsOUJORGcxWDBSTlUwOGdQaUJrYVdabVEzVjBiMlptTENCY1hGVlFYRndzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR1JwWm1aZlFUUTROVjlFVFZOUElENGdMV1JwWm1aRGRYUnZabVlzSUZ4Y1RrOWNYQ3dnWEZ4RVQxZE9YRndwS1NsY2JtUmhkR0VrZFhCa2IzZHVYMlJVUVVkZlJFMVRUeUE4TFNCbVlXTjBiM0lvWkdGMFlTUjFjR1J2ZDI1ZlpGUkJSMTlFVFZOUExDQnNaWFpsYkhNZ1BTQmpLRnhjVlZCY1hDd2dYRnhPVDF4Y0xDQmNYRVJQVjA1Y1hDa3BYRzVrWVhSaEpIVndaRzkzYmw5Qk5EZzFYMFJOVTA4Z1BDMGdabUZqZEc5eUtHUmhkR0VrZFhCa2IzZHVYMEUwT0RWZlJFMVRUeXdnYkdWMlpXeHpJRDBnWXloY1hGVlFYRndzSUZ4Y1RrOWNYQ3dnWEZ4RVQxZE9YRndwS1Z4dVhHNXVkVzB1ZFhBZ1BDMGdLSE4xYlcxaGNua29aR0YwWVNSMWNHUnZkMjVmWkZSQlIxOUVUVk5QS1NsYlhGeFZVRnhjWFZ4dWJuVnRMbTV2SUR3dElDaHpkVzF0WVhKNUtHUmhkR0VrZFhCa2IzZHVYMlJVUVVkZlJFMVRUeWtwVzF4Y1RrOWNYRjFjYm01MWJTNWtiM2R1SUR3dElDaHpkVzF0WVhKNUtHUmhkR0VrZFhCa2IzZHVYMlJVUVVkZlJFMVRUeWtwVzF4Y1JFOVhUbHhjWFZ4dWJuVnRMbUZzYkNBOExTQnVkVzB1ZFhBZ0t5QnVkVzB1Ym04Z0t5QnVkVzB1Wkc5M2JseHVjR1Z5WXk1MWNDQThMU0J5YjNWdVpDaHVkVzB1ZFhBZ0x5QnVkVzB1WVd4c0lDb2dNVEF3TENBeUtWeHVjR1Z5WXk1dWJ5QThMU0J5YjNWdVpDaHVkVzB1Ym04Z0x5QnVkVzB1WVd4c0lDb2dNVEF3TENBeUtWeHVjR1Z5WXk1a2IzZHVJRHd0SUhKdmRXNWtLRzUxYlM1a2IzZHVJQzhnYm5WdExtRnNiQ0FxSURFd01Dd2dNaWxjYmx4dVpHRjBZU1JrWlc1emFYUjVJRHd0SUdkbGRGOWtaVzV6YVhSNUtHUmhkR0VrUkUxVFR5d2daR0YwWVNSa1ZFRkhMQ0J1SUQwZ01UQXdLVnh1WkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaVzV6YVhSNUtWeHVjRElnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdSRTFUVHl3Z2VTQTlJR1JVUVVjc0lHTnZiRzl5SUQwZ1pHVnVjMmwwZVNrcElDdGNiaUFnWjJWdmJWOXdiMmx1ZENoemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJJRnh1SUNCelkyRnNaVjlqYjJ4dmNsOTJhWEpwWkdsektDa2dLMXh1SUNCNGJHbHRLQzB3TGpVc0lERXBJQ3NnZVd4cGJTZ3RNQzQxTENBeEtTQXJJR052YjNKa1gyWnBlR1ZrS0NrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJREFzSUdOdmJDQTlJRnhjWjNKbGVUVXdYRndzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SUMxa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY1hHZHlaWGxjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1J2ZEhSbFpGeGNLU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2dZMjlzSUQwZ1hGeG5jbVY1WEZ3c0lHeHBibVYwZVhCbElEMGdYRnhrYjNSMFpXUmNYQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjWEdkeVpYbGNYQ2tnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjWEdkeVpYbGNYQ2tnSzF4dUlDQmhibTV2ZEdGMFpTaGNYSFJsZUhSY1hDd2dlQ0E5SUMwd0xqVXNJSGtnUFNBeExDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hGVlFPaUJjWEN3Z2JuVnRMblZ3TENCY1hDQW9YRndzSUhCbGNtTXVkWEFzSUZ4Y0pTbGNYQ2tzSUZ4dUlDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNeWtnSzF4dUlDQmhibTV2ZEdGMFpTaGNYSFJsZUhSY1hDd2dlQ0E5SUMwd0xqVXNJSGtnUFNBeExUQXVNU3dnYkdGaVpXd2dQU0J3WVhOMFpUQW9YRnhPVHpvZ1hGd3NJRzUxYlM1dWJ5d2dYRndnS0Z4Y0xDQndaWEpqTG01dkxDQmNYQ1VwWEZ3cExDQmNiaUFnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzSUdocWRYTjBJRDBnTUN3Z2MybDZaU0E5SURNcElDdGNiaUFnWVc1dWIzUmhkR1VvWEZ4MFpYaDBYRndzSUhnZ1BTQXRNQzQxTENCNUlEMGdNUzB3TGpJc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z4Y1JFOVhUam9nWEZ3c0lHNTFiUzVrYjNkdUxDQmNYQ0FvWEZ3c0lIQmxjbU11Wkc5M2Jpd2dYRndsS1Z4Y0tTd2dYRzRnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektTQXJYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUdkbmRHbDBiR1VvYm1GdFpTa2dLeUIwYUdWdFpTaHdiRzkwTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBMUtTa2dJRnh1SUNCY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjYzJOaGRIUmxjbkJzYjNSZlhGd3NJRzVoYldVc0lGeGNYMXhjTENCa2FXWm1RM1YwYjJabUxDQmNYRjl3ZFhKbFgzTjBjbDl5WldkY1hDbGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUnpJRDBnWEZ4cGJseGNMQ0IzYVdSMGFDQTlJRFVxTVM0MUxDQm9aV2xuYUhRZ1BTQXlMalVxTVM0MUtWeHVjSEpwYm5Rb1kyOTNjR3h2ZERvNmNHeHZkRjluY21sa0tIQXhMQ0J3TWl3Z1lXeHBaMjRnUFNCY1hHaGNYQ2twWEc1a1pYWXViMlptS0NsY2JseHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2twTENCY2JpQWdJQ0FnSUNBZ2QybGtkR2dnUFNBMUtqRXVOU3dnYUdWcFoyaDBJRDBnTWk0MUtqRXVOU2xjYm5CeWFXNTBLR052ZDNCc2IzUTZPbkJzYjNSZlozSnBaQ2h3TVN3Z2NESXNJR0ZzYVdkdUlEMGdYRnhvWEZ3cEtWeHVaR1YyTG05bVppZ3BYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfQW5ubzMudHN2XFwpKSlcbmRpZmZDdXRvZmYgPC0gMC4yXG5cbiMgU3BsaXR0aW5nIGRhdGFcbmRhdGEucmVnIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzMgPT0gXFxyZWdcXClcbmRhdGEuc3RyIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzMgPT0gXFxzdHJcXClcblxuIyBUYWtpbmcgY29kZXMgZnJvbSBwcmV2aW91cyBmdW5jdGlvbiAoc3RyKVxuZGF0YSA8LSBkYXRhLnN0clxuZGF0YSA8LSBkYXRhICU+JVxuICBkcGx5cjo6bXV0YXRlKHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiBkaWZmQ3V0b2ZmLCBcXFVQXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSxcbiAgICAgICAgICAgICAgICB1cGRvd25fQTQ4NV9ETVNPID0gaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSkpXG5kYXRhJHVwZG93bl9kVEFHX0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX2RUQUdfRE1TTywgbGV2ZWxzID0gYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpKVxuZGF0YSR1cGRvd25fQTQ4NV9ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9BNDg1X0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcblxubnVtLnVwIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpW1xcVVBcXF1cbm51bS5ubyA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVtcXE5PXFxdXG5udW0uZG93biA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVtcXERPV05cXF1cbm51bS5hbGwgPC0gbnVtLnVwICsgbnVtLm5vICsgbnVtLmRvd25cbnBlcmMudXAgPC0gcm91bmQobnVtLnVwIC8gbnVtLmFsbCAqIDEwMCwgMilcbnBlcmMubm8gPC0gcm91bmQobnVtLm5vIC8gbnVtLmFsbCAqIDEwMCwgMilcbnBlcmMuZG93biA8LSByb3VuZChudW0uZG93biAvIG51bS5hbGwgKiAxMDAsIDIpXG5cbmRhdGEkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShkYXRhJERNU08sIGRhdGEkZFRBRywgbiA9IDEwMClcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbnAxIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IERNU08sIHkgPSBkVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgKyBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoXFxVUDogXFwsIG51bS51cCwgXFwgKFxcLCBwZXJjLnVwLCBcXCUpXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMS0wLjEsIGxhYmVsID0gcGFzdGUwKFxcTk86IFxcLCBudW0ubm8sIFxcIChcXCwgcGVyYy5ubywgXFwlKVxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4yLCBsYWJlbCA9IHBhc3RlMChcXERPV046IFxcLCBudW0uZG93biwgXFwgKFxcLCBwZXJjLmRvd24sIFxcJSlcXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKG5hbWUpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpXG5cbiMgVGFraW5nIGNvZGVzIGZyb20gcHJldmlvdXMgZnVuY3Rpb24gKHJlZylcbmRhdGEgPC0gZGF0YS5yZWdcbmRhdGEgPC0gZGF0YSAlPiVcbiAgZHBseXI6Om11dGF0ZSh1cGRvd25fZFRBR19ETVNPID0gaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpKVxuZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbmRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG5cbm51bS51cCA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVtcXFVQXFxdXG5udW0ubm8gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxOT1xcXVxubnVtLmRvd24gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxET1dOXFxdXG5udW0uYWxsIDwtIG51bS51cCArIG51bS5ubyArIG51bS5kb3duXG5wZXJjLnVwIDwtIHJvdW5kKG51bS51cCAvIG51bS5hbGwgKiAxMDAsIDIpXG5wZXJjLm5vIDwtIHJvdW5kKG51bS5ubyAvIG51bS5hbGwgKiAxMDAsIDIpXG5wZXJjLmRvd24gPC0gcm91bmQobnVtLmRvd24gLyBudW0uYWxsICogMTAwLCAyKVxuXG5kYXRhJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoZGF0YSRETVNPLCBkYXRhJGRUQUcsIG4gPSAxMDApXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5wMiA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUwKFxcVVA6IFxcLCBudW0udXAsIFxcIChcXCwgcGVyYy51cCwgXFwlKVxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4xLCBsYWJlbCA9IHBhc3RlMChcXE5POiBcXCwgbnVtLm5vLCBcXCAoXFwsIHBlcmMubm8sIFxcJSlcXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLTAuMiwgbGFiZWwgPSBwYXN0ZTAoXFxET1dOOiBcXCwgbnVtLmRvd24sIFxcIChcXCwgcGVyYy5kb3duLCBcXCUpXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShuYW1lKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKSAgXG4gIFxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxzY2F0dGVycGxvdF9cXCwgbmFtZSwgXFxfXFwsIGRpZmZDdXRvZmYsIFxcX3B1cmVfc3RyX3JlZ1xcKVxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNSoxLjUsIGhlaWdodCA9IDIuNSoxLjUpXG5wcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbmRldi5vZmYoKVxuXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICB3aWR0aCA9IDUqMS41LCBoZWlnaHQgPSAyLjUqMS41KVxucHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX0Fubm8zLnRzdlxcKSkpXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuXG4jIFNwbGl0dGluZyBkYXRhXG5kYXRhLnJlZyA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8zID09IFxccmVnXFwpXG5kYXRhLnN0ciA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8zID09IFxcc3RyXFwpXG5cbiMgVGFraW5nIGNvZGVzIGZyb20gcHJldmlvdXMgZnVuY3Rpb24gKHN0cilcbmRhdGEgPC0gZGF0YS5zdHJcbmRhdGEgPC0gZGF0YSAlPiVcbiAgZHBseXI6Om11dGF0ZSh1cGRvd25fZFRBR19ETVNPID0gaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpKVxuZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbmRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG5cbm51bS51cCA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVtcXFVQXFxdXG5udW0ubm8gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxOT1xcXVxubnVtLmRvd24gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxET1dOXFxdXG5udW0uYWxsIDwtIG51bS51cCArIG51bS5ubyArIG51bS5kb3duXG5wZXJjLnVwIDwtIHJvdW5kKG51bS51cCAvIG51bS5hbGwgKiAxMDAsIDIpXG5wZXJjLm5vIDwtIHJvdW5kKG51bS5ubyAvIG51bS5hbGwgKiAxMDAsIDIpXG5wZXJjLmRvd24gPC0gcm91bmQobnVtLmRvd24gLyBudW0uYWxsICogMTAwLCAyKVxuXG5kYXRhJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoZGF0YSRETVNPLCBkYXRhJGRUQUcsIG4gPSAxMDApXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5wMSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUwKFxcVVA6IFxcLCBudW0udXAsIFxcIChcXCwgcGVyYy51cCwgXFwlKVxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4xLCBsYWJlbCA9IHBhc3RlMChcXE5POiBcXCwgbnVtLm5vLCBcXCAoXFwsIHBlcmMubm8sIFxcJSlcXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLTAuMiwgbGFiZWwgPSBwYXN0ZTAoXFxET1dOOiBcXCwgbnVtLmRvd24sIFxcIChcXCwgcGVyYy5kb3duLCBcXCUpXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShuYW1lKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKVxuXG4jIFRha2luZyBjb2RlcyBmcm9tIHByZXZpb3VzIGZ1bmN0aW9uIChyZWcpXG5kYXRhIDwtIGRhdGEucmVnXG5kYXRhIDwtIGRhdGEgJT4lXG4gIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpLFxuICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiBkaWZmQ3V0b2ZmLCBcXFVQXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSlcbmRhdGEkdXBkb3duX2RUQUdfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fZFRBR19ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG5kYXRhJHVwZG93bl9BNDg1X0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX0E0ODVfRE1TTywgbGV2ZWxzID0gYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpKVxuXG5udW0udXAgPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxVUFxcXVxubnVtLm5vIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpW1xcTk9cXF1cbm51bS5kb3duIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpW1xcRE9XTlxcXVxubnVtLmFsbCA8LSBudW0udXAgKyBudW0ubm8gKyBudW0uZG93blxucGVyYy51cCA8LSByb3VuZChudW0udXAgLyBudW0uYWxsICogMTAwLCAyKVxucGVyYy5ubyA8LSByb3VuZChudW0ubm8gLyBudW0uYWxsICogMTAwLCAyKVxucGVyYy5kb3duIDwtIHJvdW5kKG51bS5kb3duIC8gbnVtLmFsbCAqIDEwMCwgMilcblxuZGF0YSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KGRhdGEkRE1TTywgZGF0YSRkVEFHLCBuID0gMTAwKVxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxucDIgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gRE1TTywgeSA9IGRUQUcsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlMChcXFVQOiBcXCwgbnVtLnVwLCBcXCAoXFwsIHBlcmMudXAsIFxcJSlcXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLTAuMSwgbGFiZWwgPSBwYXN0ZTAoXFxOTzogXFwsIG51bS5ubywgXFwgKFxcLCBwZXJjLm5vLCBcXCUpXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMS0wLjIsIGxhYmVsID0gcGFzdGUwKFxcRE9XTjogXFwsIG51bS5kb3duLCBcXCAoXFwsIHBlcmMuZG93biwgXFwlKVxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUobmFtZSkgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkgIFxuICBcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2NhdHRlcnBsb3RfXFwsIG5hbWUsIFxcX1xcLCBkaWZmQ3V0b2ZmLCBcXF9wdXJlX3N0cl9yZWdcXClcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDUqMS41LCBoZWlnaHQgPSAyLjUqMS41KVxucHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG5kZXYub2ZmKClcblxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBcbiAgICAgICAgd2lkdGggPSA1KjEuNSwgaGVpZ2h0ID0gMi41KjEuNSlcbnByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gXFxoXFwpKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \_Anno3.tsv\)))
diffCutoff <- 0.2

# Splitting data
data.reg <- data %>% dplyr::filter(Anno3 == \reg\)
data.str <- data %>% dplyr::filter(Anno3 == \str\)

# Taking codes from previous function (str)
data <- data.str
data <- data %>%
  dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)))
data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))

num.up <- (summary(data$updown_dTAG_DMSO))[\UP\]
num.no <- (summary(data$updown_dTAG_DMSO))[\NO\]
num.down <- (summary(data$updown_dTAG_DMSO))[\DOWN\]
num.all <- num.up + num.no + num.down
perc.up <- round(num.up / num.all * 100, 2)
perc.no <- round(num.no / num.all * 100, 2)
perc.down <- round(num.down / num.all * 100, 2)

data$density <- get_density(data$DMSO, data$dTAG, n = 100)
data <- data %>% dplyr::arrange(density)
p1 <- ggplot(data, aes(x = DMSO, y = dTAG, color = density)) +
  geom_point(show.legend = FALSE) + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  annotate(\text\, x = -0.5, y = 1, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  theme_classic() + ggtitle(name) + theme(plot.title = element_text(size = 5))

# Taking codes from previous function (reg)
data <- data.reg
data <- data %>%
  dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)))
data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))

num.up <- (summary(data$updown_dTAG_DMSO))[\UP\]
num.no <- (summary(data$updown_dTAG_DMSO))[\NO\]
num.down <- (summary(data$updown_dTAG_DMSO))[\DOWN\]
num.all <- num.up + num.no + num.down
perc.up <- round(num.up / num.all * 100, 2)
perc.no <- round(num.no / num.all * 100, 2)
perc.down <- round(num.down / num.all * 100, 2)

data$density <- get_density(data$DMSO, data$dTAG, n = 100)
data <- data %>% dplyr::arrange(density)
p2 <- ggplot(data, aes(x = DMSO, y = dTAG, color = density)) +
  geom_point(show.legend = FALSE) + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  annotate(\text\, x = -0.5, y = 1, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  theme_classic() + ggtitle(name) + theme(plot.title = element_text(size = 5))  
  

fileName <- paste0(\scatterplot_\, name, \_\, diffCutoff, \_pure_str_reg\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 5*1.5, height = 2.5*1.5)
print(cowplot::plot_grid(p1, p2, align = \h\))
dev.off()

svglite(here(figDir, paste0(fileName, \.svg\)), 
        width = 5*1.5, height = 2.5*1.5)
print(cowplot::plot_grid(p1, p2, align = \h\))
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Relaxed annotation

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgwRnVibTh6TG5SemRsd2lLU2twWEc1Y2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2h6YVhwbElEMGdjM1JoY25ReUlDMGdjM1JoY25ReEtWeHVYRzVrWVhSaFgzVnVaR1Z5TlRCcllpQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtFRnVibTh5SUNWcGJpVWdZeWhjSWxBdFVGd2lMQ0JjSWxBdFJWd2lMQ0JjSWtVdFJWd2lLU3dnYzJsNlpTQThJRFV3S2pFd01EQXNJRUZ1Ym04eklEMDlJRndpY21WblhDSXBYRzVrWVhSaFgzVnVaR1Z5TWpBd2EySWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJR01vWENKUUxWQmNJaXdnWENKUUxVVmNJaXdnWENKRkxVVmNJaWtzSUhOcGVtVWdQajBnTlRBcU1UQXdNQ3dnYzJsNlpTQThJREl3TUNveE1EQXdMQ0JCYm01dk15QTlQU0JjSW5KbFoxd2lLVnh1WkdGMFlWOXZkbVZ5TWpBd2EySWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJR01vWENKUUxWQmNJaXdnWENKUUxVVmNJaXdnWENKRkxVVmNJaWtzSUhOcGVtVWdQajBnTWpBd0tqRXdNREFzSUVGdWJtOHpJRDA5SUZ3aWNtVm5YQ0lwWEc1Y2JpTWpJeU1qSXlNalhHNWNibVJoZEdFZ1BDMGdaR0YwWVY5MWJtUmxjalV3YTJKY2JseHVaR2xtWmtOMWRHOW1aaUE4TFNBd0xqSmNibVJoZEdFZ1BDMGdaR0YwWVNBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDFjR1J2ZDI1ZlpGUkJSMTlFVFZOUElEMGdhV1psYkhObEtHUnBabVpmWkZSQlIxOUVUVk5QSUQ0Z1pHbG1aa04xZEc5bVppd2dYQ0pWVUZ3aUxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoa2FXWm1YMlJVUVVkZlJFMVRUeUErSUMxa2FXWm1RM1YwYjJabUxDQmNJazVQWENJc0lGd2lSRTlYVGx3aUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkWEJrYjNkdVgwRTBPRFZmUkUxVFR5QTlJR2xtWld4elpTaGthV1ptWDBFME9EVmZSRTFUVHlBK0lHUnBabVpEZFhSdlptWXNJRndpVlZCY0lpd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1pHbG1abDlCTkRnMVgwUk5VMDhnUGlBdFpHbG1aa04xZEc5bVppd2dYQ0pPVDF3aUxDQmNJa1JQVjA1Y0lpa3BLVnh1WkdGMFlTUjFjR1J2ZDI1ZlpGUkJSMTlFVFZOUElEd3RJR1poWTNSdmNpaGtZWFJoSkhWd1pHOTNibDlrVkVGSFgwUk5VMDhzSUd4bGRtVnNjeUE5SUdNb1hDSlZVRndpTENCY0lrNVBYQ0lzSUZ3aVJFOVhUbHdpS1NsY2JtUmhkR0VrZFhCa2IzZHVYMEUwT0RWZlJFMVRUeUE4TFNCbVlXTjBiM0lvWkdGMFlTUjFjR1J2ZDI1ZlFUUTROVjlFVFZOUExDQnNaWFpsYkhNZ1BTQmpLRndpVlZCY0lpd2dYQ0pPVDF3aUxDQmNJa1JQVjA1Y0lpa3BYRzVjYmlNakl5TmNibTUxYlM1MWNDQThMU0FvYzNWdGJXRnllU2hrWVhSaEpIVndaRzkzYmw5a1ZFRkhYMFJOVTA4cEtWdGNJbFZRWENKZFhHNXVkVzB1Ym04Z1BDMGdLSE4xYlcxaGNua29aR0YwWVNSMWNHUnZkMjVmWkZSQlIxOUVUVk5QS1NsYlhDSk9UMXdpWFZ4dWJuVnRMbVJ2ZDI0Z1BDMGdLSE4xYlcxaGNua29aR0YwWVNSMWNHUnZkMjVmWkZSQlIxOUVUVk5QS1NsYlhDSkVUMWRPWENKZFhHNXVkVzB1WVd4c0lEd3RJRzUxYlM1MWNDQXJJRzUxYlM1dWJ5QXJJRzUxYlM1a2IzZHVYRzV3WlhKakxuVndJRHd0SUhKdmRXNWtLRzUxYlM1MWNDQXZJRzUxYlM1aGJHd2dLaUF4TURBc0lESXBYRzV3WlhKakxtNXZJRHd0SUhKdmRXNWtLRzUxYlM1dWJ5QXZJRzUxYlM1aGJHd2dLaUF4TURBc0lESXBYRzV3WlhKakxtUnZkMjRnUEMwZ2NtOTFibVFvYm5WdExtUnZkMjRnTHlCdWRXMHVZV3hzSUNvZ01UQXdMQ0F5S1Z4dVhHNWtZWFJoSkdSbGJuTnBkSGtnUEMwZ1oyVjBYMlJsYm5OcGRIa29aR0YwWVNSRVRWTlBMQ0JrWVhSaEpHUlVRVWNzSUc0Z1BTQXhNREFwWEc1a1lYUmhJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JsYm5OcGRIa3BYRzV3TVNBOExTQm5aM0JzYjNRb1pHRjBZU3dnWVdWektIZ2dQU0JFVFZOUExDQjVJRDBnWkZSQlJ5d2dZMjlzYjNJZ1BTQmtaVzV6YVhSNUtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnWEc0Z0lITmpZV3hsWDJOdmJHOXlYM1pwY21sa2FYTW9LU0FyWEc0Z0lIaHNhVzBvTFRBdU5Td2dNU2tnS3lCNWJHbHRLQzB3TGpVc0lERXBJQ3NnWTI5dmNtUmZabWw0WldRb0tTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTUN3Z1kyOXNJRDBnWENKbmNtVjVOVEJjSWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJoYzJobFpGd2lLU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ0xXUnBabVpEZFhSdlptWXNJR052YkNBOUlGd2laM0psZVZ3aUxDQnNhVzVsZEhsd1pTQTlJRndpWkc5MGRHVmtYQ0lwSUN0Y2JpQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQmthV1ptUTNWMGIyWm1MQ0JqYjJ3Z1BTQmNJbWR5WlhsY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SdmRIUmxaRndpS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ3aVozSmxlVndpS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ3aVozSmxlVndpS1NBclhHNGdJR0Z1Ym05MFlYUmxLRndpZEdWNGRGd2lMQ0I0SUQwZ0xUQXVOU3dnZVNBOUlERXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGd2lWVkE2SUZ3aUxDQnVkVzB1ZFhBc0lGd2lJQ2hjSWl3Z2NHVnlZeTUxY0N3Z1hDSWxLVndpS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F6S1NBclhHNGdJR0Z1Ym05MFlYUmxLRndpZEdWNGRGd2lMQ0I0SUQwZ0xUQXVOU3dnZVNBOUlERXRNQzR4TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSWs1UE9pQmNJaXdnYm5WdExtNXZMQ0JjSWlBb1hDSXNJSEJsY21NdWJtOHNJRndpSlNsY0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ015a2dLMXh1SUNCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJQzB3TGpVc0lIa2dQU0F4TFRBdU1pd2diR0ZpWld3Z1BTQndZWE4wWlRBb1hDSkVUMWRPT2lCY0lpd2diblZ0TG1SdmQyNHNJRndpSUNoY0lpd2djR1Z5WXk1a2IzZHVMQ0JjSWlVcFhDSXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBJQ3RjYmlBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1oyZDBhWFJzWlNodVlXMWxLU0FySUhSb1pXMWxLSEJzYjNRdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9jMmw2WlNBOUlEVXBLU0FnWEc0Z0lGeHVYRzRqSXlNalhHNXVkVzB1ZFhBZ1BDMGdLSE4xYlcxaGNua29aR0YwWVNSMWNHUnZkMjVmUVRRNE5WOUVUVk5QS1NsYlhDSlZVRndpWFZ4dWJuVnRMbTV2SUR3dElDaHpkVzF0WVhKNUtHUmhkR0VrZFhCa2IzZHVYMEUwT0RWZlJFMVRUeWtwVzF3aVRrOWNJbDFjYm01MWJTNWtiM2R1SUR3dElDaHpkVzF0WVhKNUtHUmhkR0VrZFhCa2IzZHVYMEUwT0RWZlJFMVRUeWtwVzF3aVJFOVhUbHdpWFZ4dWJuVnRMbUZzYkNBOExTQnVkVzB1ZFhBZ0t5QnVkVzB1Ym04Z0t5QnVkVzB1Wkc5M2JseHVjR1Z5WXk1MWNDQThMU0J5YjNWdVpDaHVkVzB1ZFhBZ0x5QnVkVzB1WVd4c0lDb2dNVEF3TENBeUtWeHVjR1Z5WXk1dWJ5QThMU0J5YjNWdVpDaHVkVzB1Ym04Z0x5QnVkVzB1WVd4c0lDb2dNVEF3TENBeUtWeHVjR1Z5WXk1a2IzZHVJRHd0SUhKdmRXNWtLRzUxYlM1a2IzZHVJQzhnYm5WdExtRnNiQ0FxSURFd01Dd2dNaWxjYmx4dVpHRjBZU1JrWlc1emFYUjVJRHd0SUdkbGRGOWtaVzV6YVhSNUtHUmhkR0VrUkUxVFR5d2daR0YwWVNSQk5EZzFMQ0J1SUQwZ01UQXdLVnh1WkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaVzV6YVhSNUtWeHVjRElnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdSRTFUVHl3Z2VTQTlJRUUwT0RVc0lHTnZiRzl5SUQwZ1pHVnVjMmwwZVNrcElDdGNiaUFnWjJWdmJWOXdiMmx1ZENoemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJJRnh1SUNCelkyRnNaVjlqYjJ4dmNsOTJhWEpwWkdsektDa2dLMXh1SUNCNGJHbHRLQzB3TGpVc0lERXBJQ3NnZVd4cGJTZ3RNQzQxTENBeEtTQXJJR052YjNKa1gyWnBlR1ZrS0NrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJREFzSUdOdmJDQTlJRndpWjNKbGVUVXdYQ0lzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SUMxa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY0ltZHlaWGxjSWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJ2ZEhSbFpGd2lLU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2dZMjlzSUQwZ1hDSm5jbVY1WENJc0lHeHBibVYwZVhCbElEMGdYQ0prYjNSMFpXUmNJaWtnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SUMwd0xqVXNJSGtnUFNBeExDQnNZV0psYkNBOUlIQmhjM1JsTUNoY0lsVlFPaUJjSWl3Z2JuVnRMblZ3TENCY0lpQW9YQ0lzSUhCbGNtTXVkWEFzSUZ3aUpTbGNJaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNeWtnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SUMwd0xqVXNJSGtnUFNBeExUQXVNU3dnYkdGaVpXd2dQU0J3WVhOMFpUQW9YQ0pPVHpvZ1hDSXNJRzUxYlM1dWJ5d2dYQ0lnS0Z3aUxDQndaWEpqTG01dkxDQmNJaVVwWENJcExDQmNiaUFnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzSUdocWRYTjBJRDBnTUN3Z2MybDZaU0E5SURNcElDdGNiaUFnWVc1dWIzUmhkR1VvWENKMFpYaDBYQ0lzSUhnZ1BTQXRNQzQxTENCNUlEMGdNUzB3TGpJc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z3aVJFOVhUam9nWENJc0lHNTFiUzVrYjNkdUxDQmNJaUFvWENJc0lIQmxjbU11Wkc5M2Jpd2dYQ0lsS1Z3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektTQXJYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUdkbmRHbDBiR1VvYm1GdFpTa2dLeUIwYUdWdFpTaHdiRzkwTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBMUtTa2dJRnh1SUNCY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpYzJOaGRIUmxjbkJzYjNSZlhDSXNJRzVoYldVc0lGd2lYMXdpTENCa2FXWm1RM1YwYjJabUxDQmNJbDl5WldkMWJtUmxjalV3YTJKZmNIVnlaVndpS1Z4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZEhNZ1BTQmNJbWx1WENJc0lIZHBaSFJvSUQwZ05Tb3hMalVzSUdobGFXZG9kQ0E5SURJdU5Tb3hMalVwWEc1d2NtbHVkQ2hqYjNkd2JHOTBPanB3Ykc5MFgyZHlhV1FvY0RFc0lIQXlMQ0JoYkdsbmJpQTlJRndpYUZ3aUtTbGNibVJsZGk1dlptWW9LVnh1WEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJRnh1SUNBZ0lDQWdJQ0IzYVdSMGFDQTlJRFVxTVM0MUxDQm9aV2xuYUhRZ1BTQXlMalVxTVM0MUtWeHVjSEpwYm5Rb1kyOTNjR3h2ZERvNmNHeHZkRjluY21sa0tIQXhMQ0J3TWl3Z1lXeHBaMjRnUFNCY0ltaGNJaWtwWEc1a1pYWXViMlptS0NsY2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX0Fubm8zLnRzdlxcKSkpXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShzaXplID0gc3RhcnQyIC0gc3RhcnQxKVxuXG5kYXRhX3VuZGVyNTBrYiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSwgc2l6ZSA8IDUwKjEwMDAsIEFubm8zID09IFxccmVnXFwpXG5kYXRhX3VuZGVyMjAwa2IgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIHNpemUgPj0gNTAqMTAwMCwgc2l6ZSA8IDIwMCoxMDAwLCBBbm5vMyA9PSBcXHJlZ1xcKVxuZGF0YV9vdmVyMjAwa2IgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIHNpemUgPj0gMjAwKjEwMDAsIEFubm8zID09IFxccmVnXFwpXG5cbiMjIyMjIyMjXG5cbmRhdGEgPC0gZGF0YV91bmRlcjUwa2JcblxuZGlmZkN1dG9mZiA8LSAwLjJcbmRhdGEgPC0gZGF0YSAlPiVcbiAgZHBseXI6Om11dGF0ZSh1cGRvd25fZFRBR19ETVNPID0gaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpKVxuZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbmRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG5cbiMjIyNcbm51bS51cCA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVtcXFVQXFxdXG5udW0ubm8gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxOT1xcXVxubnVtLmRvd24gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxET1dOXFxdXG5udW0uYWxsIDwtIG51bS51cCArIG51bS5ubyArIG51bS5kb3duXG5wZXJjLnVwIDwtIHJvdW5kKG51bS51cCAvIG51bS5hbGwgKiAxMDAsIDIpXG5wZXJjLm5vIDwtIHJvdW5kKG51bS5ubyAvIG51bS5hbGwgKiAxMDAsIDIpXG5wZXJjLmRvd24gPC0gcm91bmQobnVtLmRvd24gLyBudW0uYWxsICogMTAwLCAyKVxuXG5kYXRhJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoZGF0YSRETVNPLCBkYXRhJGRUQUcsIG4gPSAxMDApXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5wMSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUwKFxcVVA6IFxcLCBudW0udXAsIFxcIChcXCwgcGVyYy51cCwgXFwlKVxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4xLCBsYWJlbCA9IHBhc3RlMChcXE5POiBcXCwgbnVtLm5vLCBcXCAoXFwsIHBlcmMubm8sIFxcJSlcXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLTAuMiwgbGFiZWwgPSBwYXN0ZTAoXFxET1dOOiBcXCwgbnVtLmRvd24sIFxcIChcXCwgcGVyYy5kb3duLCBcXCUpXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShuYW1lKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKSAgXG4gIFxuXG4jIyMjXG5udW0udXAgPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fQTQ4NV9ETVNPKSlbXFxVUFxcXVxubnVtLm5vIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX0E0ODVfRE1TTykpW1xcTk9cXF1cbm51bS5kb3duIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX0E0ODVfRE1TTykpW1xcRE9XTlxcXVxubnVtLmFsbCA8LSBudW0udXAgKyBudW0ubm8gKyBudW0uZG93blxucGVyYy51cCA8LSByb3VuZChudW0udXAgLyBudW0uYWxsICogMTAwLCAyKVxucGVyYy5ubyA8LSByb3VuZChudW0ubm8gLyBudW0uYWxsICogMTAwLCAyKVxucGVyYy5kb3duIDwtIHJvdW5kKG51bS5kb3duIC8gbnVtLmFsbCAqIDEwMCwgMilcblxuZGF0YSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KGRhdGEkRE1TTywgZGF0YSRBNDg1LCBuID0gMTAwKVxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxucDIgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gRE1TTywgeSA9IEE0ODUsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlMChcXFVQOiBcXCwgbnVtLnVwLCBcXCAoXFwsIHBlcmMudXAsIFxcJSlcXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLTAuMSwgbGFiZWwgPSBwYXN0ZTAoXFxOTzogXFwsIG51bS5ubywgXFwgKFxcLCBwZXJjLm5vLCBcXCUpXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMS0wLjIsIGxhYmVsID0gcGFzdGUwKFxcRE9XTjogXFwsIG51bS5kb3duLCBcXCAoXFwsIHBlcmMuZG93biwgXFwlKVxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUobmFtZSkgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkgIFxuICBcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2NhdHRlcnBsb3RfXFwsIG5hbWUsIFxcX1xcLCBkaWZmQ3V0b2ZmLCBcXF9yZWd1bmRlcjUwa2JfcHVyZVxcKVxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNSoxLjUsIGhlaWdodCA9IDIuNSoxLjUpXG5wcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbmRldi5vZmYoKVxuXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICB3aWR0aCA9IDUqMS41LCBoZWlnaHQgPSAyLjUqMS41KVxucHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG5kZXYub2ZmKClcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \_Anno3.tsv\)))

data <- data %>% dplyr::mutate(size = start2 - start1)

data_under50kb <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\), size < 50*1000, Anno3 == \reg\)
data_under200kb <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\), size >= 50*1000, size < 200*1000, Anno3 == \reg\)
data_over200kb <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\), size >= 200*1000, Anno3 == \reg\)

########

data <- data_under50kb

diffCutoff <- 0.2
data <- data %>%
  dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)))
data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))

####
num.up <- (summary(data$updown_dTAG_DMSO))[\UP\]
num.no <- (summary(data$updown_dTAG_DMSO))[\NO\]
num.down <- (summary(data$updown_dTAG_DMSO))[\DOWN\]
num.all <- num.up + num.no + num.down
perc.up <- round(num.up / num.all * 100, 2)
perc.no <- round(num.no / num.all * 100, 2)
perc.down <- round(num.down / num.all * 100, 2)

data$density <- get_density(data$DMSO, data$dTAG, n = 100)
data <- data %>% dplyr::arrange(density)
p1 <- ggplot(data, aes(x = DMSO, y = dTAG, color = density)) +
  geom_point(show.legend = FALSE) + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  annotate(\text\, x = -0.5, y = 1, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  theme_classic() + ggtitle(name) + theme(plot.title = element_text(size = 5))  
  

####
num.up <- (summary(data$updown_A485_DMSO))[\UP\]
num.no <- (summary(data$updown_A485_DMSO))[\NO\]
num.down <- (summary(data$updown_A485_DMSO))[\DOWN\]
num.all <- num.up + num.no + num.down
perc.up <- round(num.up / num.all * 100, 2)
perc.no <- round(num.no / num.all * 100, 2)
perc.down <- round(num.down / num.all * 100, 2)

data$density <- get_density(data$DMSO, data$A485, n = 100)
data <- data %>% dplyr::arrange(density)
p2 <- ggplot(data, aes(x = DMSO, y = A485, color = density)) +
  geom_point(show.legend = FALSE) + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  annotate(\text\, x = -0.5, y = 1, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  theme_classic() + ggtitle(name) + theme(plot.title = element_text(size = 5))  
  

fileName <- paste0(\scatterplot_\, name, \_\, diffCutoff, \_regunder50kb_pure\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 5*1.5, height = 2.5*1.5)
print(cowplot::plot_grid(p1, p2, align = \h\))
dev.off()

svglite(here(figDir, paste0(fileName, \.svg\)), 
        width = 5*1.5, height = 2.5*1.5)
print(cowplot::plot_grid(p1, p2, align = \h\))
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVaR0YwWVNBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDBGdWJtOHpMblJ6ZGx4Y0tTa3BYRzVjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaHphWHBsSUQwZ2MzUmhjblF5SUMwZ2MzUmhjblF4S1Z4dVhHNWtZWFJoWDNWdVpHVnlOVEJyWWlBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHlJQ1ZwYmlVZ1l5aGNYRkF0VUZ4Y0xDQmNYRkF0UlZ4Y0xDQmNYRVV0UlZ4Y0tTd2djMmw2WlNBOElEVXdLakV3TURBc0lFRnVibTh6SUQwOUlGeGNjbVZuWEZ3cFhHNWtZWFJoWDNWdVpHVnlNakF3YTJJZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loQmJtNXZNaUFsYVc0bElHTW9YRnhRTFZCY1hDd2dYRnhRTFVWY1hDd2dYRnhGTFVWY1hDa3NJSE5wZW1VZ1BqMGdOVEFxTVRBd01Dd2djMmw2WlNBOElESXdNQ294TURBd0xDQkJibTV2TXlBOVBTQmNYSEpsWjF4Y0tWeHVaR0YwWVY5dmRtVnlNakF3YTJJZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loQmJtNXZNaUFsYVc0bElHTW9YRnhRTFZCY1hDd2dYRnhRTFVWY1hDd2dYRnhGTFVWY1hDa3NJSE5wZW1VZ1BqMGdNakF3S2pFd01EQXNJRUZ1Ym04eklEMDlJRnhjY21WblhGd3BYRzVjYmlNakl5TWpJeU1qWEc1Y2JtUmhkR0VnUEMwZ1pHRjBZVjkxYm1SbGNqVXdhMkpjYmx4dVpHbG1aa04xZEc5bVppQThMU0F3TGpKY2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMWNHUnZkMjVmWkZSQlIxOUVUVk5QSUQwZ2FXWmxiSE5sS0dScFptWmZaRlJCUjE5RVRWTlBJRDRnWkdsbVprTjFkRzltWml3Z1hGeFZVRnhjTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hrYVdabVgyUlVRVWRmUkUxVFR5QStJQzFrYVdabVEzVjBiMlptTENCY1hFNVBYRndzSUZ4Y1JFOVhUbHhjS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RYQmtiM2R1WDBFME9EVmZSRTFUVHlBOUlHbG1aV3h6WlNoa2FXWm1YMEUwT0RWZlJFMVRUeUErSUdScFptWkRkWFJ2Wm1Zc0lGeGNWVkJjWEN3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWkdsbVpsOUJORGcxWDBSTlUwOGdQaUF0WkdsbVprTjFkRzltWml3Z1hGeE9UMXhjTENCY1hFUlBWMDVjWENrcEtWeHVaR0YwWVNSMWNHUnZkMjVmWkZSQlIxOUVUVk5QSUR3dElHWmhZM1J2Y2loa1lYUmhKSFZ3Wkc5M2JsOWtWRUZIWDBSTlUwOHNJR3hsZG1Wc2N5QTlJR01vWEZ4VlVGeGNMQ0JjWEU1UFhGd3NJRnhjUkU5WFRseGNLU2xjYm1SaGRHRWtkWEJrYjNkdVgwRTBPRFZmUkUxVFR5QThMU0JtWVdOMGIzSW9aR0YwWVNSMWNHUnZkMjVmUVRRNE5WOUVUVk5QTENCc1pYWmxiSE1nUFNCaktGeGNWVkJjWEN3Z1hGeE9UMXhjTENCY1hFUlBWMDVjWENrcFhHNWNiaU1qSXlOY2JtNTFiUzUxY0NBOExTQW9jM1Z0YldGeWVTaGtZWFJoSkhWd1pHOTNibDlrVkVGSFgwUk5VMDhwS1Z0Y1hGVlFYRnhkWEc1dWRXMHVibThnUEMwZ0tITjFiVzFoY25rb1pHRjBZU1IxY0dSdmQyNWZaRlJCUjE5RVRWTlBLU2xiWEZ4T1QxeGNYVnh1Ym5WdExtUnZkMjRnUEMwZ0tITjFiVzFoY25rb1pHRjBZU1IxY0dSdmQyNWZaRlJCUjE5RVRWTlBLU2xiWEZ4RVQxZE9YRnhkWEc1dWRXMHVZV3hzSUR3dElHNTFiUzUxY0NBcklHNTFiUzV1YnlBcklHNTFiUzVrYjNkdVhHNXdaWEpqTG5Wd0lEd3RJSEp2ZFc1a0tHNTFiUzUxY0NBdklHNTFiUzVoYkd3Z0tpQXhNREFzSURJcFhHNXdaWEpqTG01dklEd3RJSEp2ZFc1a0tHNTFiUzV1YnlBdklHNTFiUzVoYkd3Z0tpQXhNREFzSURJcFhHNXdaWEpqTG1SdmQyNGdQQzBnY205MWJtUW9iblZ0TG1SdmQyNGdMeUJ1ZFcwdVlXeHNJQ29nTVRBd0xDQXlLVnh1WEc1a1lYUmhKR1JsYm5OcGRIa2dQQzBnWjJWMFgyUmxibk5wZEhrb1pHRjBZU1JFVFZOUExDQmtZWFJoSkdSVVFVY3NJRzRnUFNBeE1EQXBYRzVrWVhSaElEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcGhjbkpoYm1kbEtHUmxibk5wZEhrcFhHNXdNU0E4TFNCblozQnNiM1FvWkdGMFlTd2dZV1Z6S0hnZ1BTQkVUVk5QTENCNUlEMGdaRlJCUnl3Z1kyOXNiM0lnUFNCa1pXNXphWFI1S1NrZ0sxeHVJQ0JuWlc5dFgzQnZhVzUwS0hOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUhOallXeGxYMk52Ykc5eVgzWnBjbWxrYVhNb0tTQXJYRzRnSUhoc2FXMG9MVEF1TlN3Z01Ta2dLeUI1YkdsdEtDMHdMalVzSURFcElDc2dZMjl2Y21SZlptbDRaV1FvS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdNQ3dnWTI5c0lEMGdYRnhuY21WNU5UQmNYQ3dnYkdsdVpYUjVjR1VnUFNCY1hHUmhjMmhsWkZ4Y0tTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTFdScFptWkRkWFJ2Wm1Zc0lHTnZiQ0E5SUZ4Y1ozSmxlVnhjTENCc2FXNWxkSGx3WlNBOUlGeGNaRzkwZEdWa1hGd3BJQ3RjYmlBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY1hHZHlaWGxjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1J2ZEhSbFpGeGNLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRnhjWjNKbGVWeGNLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRnhjWjNKbGVWeGNLU0FyWEc0Z0lHRnVibTkwWVhSbEtGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTFRBdU5Td2dlU0E5SURFc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z4Y1ZWQTZJRnhjTENCdWRXMHVkWEFzSUZ4Y0lDaGNYQ3dnY0dWeVl5NTFjQ3dnWEZ3bEtWeGNLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXpLU0FyWEc0Z0lHRnVibTkwWVhSbEtGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTFRBdU5Td2dlU0E5SURFdE1DNHhMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYRTVQT2lCY1hDd2diblZ0TG01dkxDQmNYQ0FvWEZ3c0lIQmxjbU11Ym04c0lGeGNKU2xjWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTXlrZ0sxeHVJQ0JoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlDMHdMalVzSUhrZ1BTQXhMVEF1TWl3Z2JHRmlaV3dnUFNCd1lYTjBaVEFvWEZ4RVQxZE9PaUJjWEN3Z2JuVnRMbVJ2ZDI0c0lGeGNJQ2hjWEN3Z2NHVnlZeTVrYjNkdUxDQmNYQ1VwWEZ3cExDQmNiaUFnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzSUdocWRYTjBJRDBnTUN3Z2MybDZaU0E5SURNcElDdGNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWjJkMGFYUnNaU2h1WVcxbEtTQXJJSFJvWlcxbEtIQnNiM1F1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb2MybDZaU0E5SURVcEtTQWdYRzRnSUZ4dVhHNGpJeU1qWEc1dWRXMHVkWEFnUEMwZ0tITjFiVzFoY25rb1pHRjBZU1IxY0dSdmQyNWZRVFE0TlY5RVRWTlBLU2xiWEZ4VlVGeGNYVnh1Ym5WdExtNXZJRHd0SUNoemRXMXRZWEo1S0dSaGRHRWtkWEJrYjNkdVgwRTBPRFZmUkUxVFR5a3BXMXhjVGs5Y1hGMWNibTUxYlM1a2IzZHVJRHd0SUNoemRXMXRZWEo1S0dSaGRHRWtkWEJrYjNkdVgwRTBPRFZmUkUxVFR5a3BXMXhjUkU5WFRseGNYVnh1Ym5WdExtRnNiQ0E4TFNCdWRXMHVkWEFnS3lCdWRXMHVibThnS3lCdWRXMHVaRzkzYmx4dWNHVnlZeTUxY0NBOExTQnliM1Z1WkNodWRXMHVkWEFnTHlCdWRXMHVZV3hzSUNvZ01UQXdMQ0F5S1Z4dWNHVnlZeTV1YnlBOExTQnliM1Z1WkNodWRXMHVibThnTHlCdWRXMHVZV3hzSUNvZ01UQXdMQ0F5S1Z4dWNHVnlZeTVrYjNkdUlEd3RJSEp2ZFc1a0tHNTFiUzVrYjNkdUlDOGdiblZ0TG1Gc2JDQXFJREV3TUN3Z01pbGNibHh1WkdGMFlTUmtaVzV6YVhSNUlEd3RJR2RsZEY5a1pXNXphWFI1S0dSaGRHRWtSRTFUVHl3Z1pHRjBZU1JCTkRnMUxDQnVJRDBnTVRBd0tWeHVaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pXNXphWFI1S1Z4dWNESWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1JFMVRUeXdnZVNBOUlFRTBPRFVzSUdOdmJHOXlJRDBnWkdWdWMybDBlU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2h6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBcklGeHVJQ0J6WTJGc1pWOWpiMnh2Y2w5MmFYSnBaR2x6S0NrZ0sxeHVJQ0I0YkdsdEtDMHdMalVzSURFcElDc2dlV3hwYlNndE1DNDFMQ0F4S1NBcklHTnZiM0prWDJacGVHVmtLQ2tnSzF4dUlDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlEQXNJR052YkNBOUlGeGNaM0psZVRVd1hGd3NJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJQzFrYVdabVEzVjBiMlptTENCamIyd2dQU0JjWEdkeVpYbGNYQ3dnYkdsdVpYUjVjR1VnUFNCY1hHUnZkSFJsWkZ4Y0tTQXJYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z1kyOXNJRDBnWEZ4bmNtVjVYRndzSUd4cGJtVjBlWEJsSUQwZ1hGeGtiM1IwWldSY1hDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJQzB3TGpVc0lIa2dQU0F4TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjWEZWUU9pQmNYQ3dnYm5WdExuVndMQ0JjWENBb1hGd3NJSEJsY21NdWRYQXNJRnhjSlNsY1hDa3NJRnh1SUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ015a2dLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJQzB3TGpVc0lIa2dQU0F4TFRBdU1Td2diR0ZpWld3Z1BTQndZWE4wWlRBb1hGeE9Uem9nWEZ3c0lHNTFiUzV1Ynl3Z1hGd2dLRnhjTENCd1pYSmpMbTV2TENCY1hDVXBYRndwTENCY2JpQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wSUN0Y2JpQWdZVzV1YjNSaGRHVW9YRngwWlhoMFhGd3NJSGdnUFNBdE1DNDFMQ0I1SUQwZ01TMHdMaklzSUd4aFltVnNJRDBnY0dGemRHVXdLRnhjUkU5WFRqb2dYRndzSUc1MWJTNWtiM2R1TENCY1hDQW9YRndzSUhCbGNtTXVaRzkzYml3Z1hGd2xLVnhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F6S1NBclhHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJR2RuZEdsMGJHVW9ibUZ0WlNrZ0t5QjBhR1Z0WlNod2JHOTBMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0hOcGVtVWdQU0ExS1NrZ0lGeHVJQ0JjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNjMk5oZEhSbGNuQnNiM1JmWEZ3c0lHNWhiV1VzSUZ4Y1gxeGNMQ0JrYVdabVEzVjBiMlptTENCY1hGOXlaV2QxYm1SbGNqVXdhMkpmY0hWeVpWeGNLVnh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkSE1nUFNCY1hHbHVYRndzSUhkcFpIUm9JRDBnTlNveExqVXNJR2hsYVdkb2RDQTlJREl1TlNveExqVXBYRzV3Y21sdWRDaGpiM2R3Ykc5ME9qcHdiRzkwWDJkeWFXUW9jREVzSUhBeUxDQmhiR2xuYmlBOUlGeGNhRnhjS1NsY2JtUmxkaTV2Wm1Zb0tWeHVYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lGeHVJQ0FnSUNBZ0lDQjNhV1IwYUNBOUlEVXFNUzQxTENCb1pXbG5hSFFnUFNBeUxqVXFNUzQxS1Z4dWNISnBiblFvWTI5M2NHeHZkRG82Y0d4dmRGOW5jbWxrS0hBeExDQndNaXdnWVd4cFoyNGdQU0JjWEdoY1hDa3BYRzVrWlhZdWIyWm1LQ2xjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9Bbm5vMy50c3ZcXCkpKVxuXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoc2l6ZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuZGF0YV91bmRlcjUwa2IgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIHNpemUgPCA1MCoxMDAwLCBBbm5vMyA9PSBcXHJlZ1xcKVxuZGF0YV91bmRlcjIwMGtiIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBzaXplID49IDUwKjEwMDAsIHNpemUgPCAyMDAqMTAwMCwgQW5ubzMgPT0gXFxyZWdcXClcbmRhdGFfb3ZlcjIwMGtiIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBzaXplID49IDIwMCoxMDAwLCBBbm5vMyA9PSBcXHJlZ1xcKVxuXG4jIyMjIyMjI1xuXG5kYXRhIDwtIGRhdGFfdW5kZXI1MGtiXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5kYXRhIDwtIGRhdGEgJT4lXG4gIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpLFxuICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiBkaWZmQ3V0b2ZmLCBcXFVQXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSlcbmRhdGEkdXBkb3duX2RUQUdfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fZFRBR19ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG5kYXRhJHVwZG93bl9BNDg1X0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX0E0ODVfRE1TTywgbGV2ZWxzID0gYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpKVxuXG4jIyMjXG5udW0udXAgPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxVUFxcXVxubnVtLm5vIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpW1xcTk9cXF1cbm51bS5kb3duIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpW1xcRE9XTlxcXVxubnVtLmFsbCA8LSBudW0udXAgKyBudW0ubm8gKyBudW0uZG93blxucGVyYy51cCA8LSByb3VuZChudW0udXAgLyBudW0uYWxsICogMTAwLCAyKVxucGVyYy5ubyA8LSByb3VuZChudW0ubm8gLyBudW0uYWxsICogMTAwLCAyKVxucGVyYy5kb3duIDwtIHJvdW5kKG51bS5kb3duIC8gbnVtLmFsbCAqIDEwMCwgMilcblxuZGF0YSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KGRhdGEkRE1TTywgZGF0YSRkVEFHLCBuID0gMTAwKVxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxucDEgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gRE1TTywgeSA9IGRUQUcsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlMChcXFVQOiBcXCwgbnVtLnVwLCBcXCAoXFwsIHBlcmMudXAsIFxcJSlcXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLTAuMSwgbGFiZWwgPSBwYXN0ZTAoXFxOTzogXFwsIG51bS5ubywgXFwgKFxcLCBwZXJjLm5vLCBcXCUpXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMS0wLjIsIGxhYmVsID0gcGFzdGUwKFxcRE9XTjogXFwsIG51bS5kb3duLCBcXCAoXFwsIHBlcmMuZG93biwgXFwlKVxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUobmFtZSkgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkgIFxuICBcblxuIyMjI1xubnVtLnVwIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX0E0ODVfRE1TTykpW1xcVVBcXF1cbm51bS5ubyA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9BNDg1X0RNU08pKVtcXE5PXFxdXG5udW0uZG93biA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9BNDg1X0RNU08pKVtcXERPV05cXF1cbm51bS5hbGwgPC0gbnVtLnVwICsgbnVtLm5vICsgbnVtLmRvd25cbnBlcmMudXAgPC0gcm91bmQobnVtLnVwIC8gbnVtLmFsbCAqIDEwMCwgMilcbnBlcmMubm8gPC0gcm91bmQobnVtLm5vIC8gbnVtLmFsbCAqIDEwMCwgMilcbnBlcmMuZG93biA8LSByb3VuZChudW0uZG93biAvIG51bS5hbGwgKiAxMDAsIDIpXG5cbmRhdGEkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShkYXRhJERNU08sIGRhdGEkQTQ4NSwgbiA9IDEwMClcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbnAyIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IERNU08sIHkgPSBBNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArXG4gIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgKyBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoXFxVUDogXFwsIG51bS51cCwgXFwgKFxcLCBwZXJjLnVwLCBcXCUpXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMS0wLjEsIGxhYmVsID0gcGFzdGUwKFxcTk86IFxcLCBudW0ubm8sIFxcIChcXCwgcGVyYy5ubywgXFwlKVxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4yLCBsYWJlbCA9IHBhc3RlMChcXERPV046IFxcLCBudW0uZG93biwgXFwgKFxcLCBwZXJjLmRvd24sIFxcJSlcXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKG5hbWUpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpICBcbiAgXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXHNjYXR0ZXJwbG90X1xcLCBuYW1lLCBcXF9cXCwgZGlmZkN1dG9mZiwgXFxfcmVndW5kZXI1MGtiX3B1cmVcXClcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDUqMS41LCBoZWlnaHQgPSAyLjUqMS41KVxucHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG5kZXYub2ZmKClcblxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBcbiAgICAgICAgd2lkdGggPSA1KjEuNSwgaGVpZ2h0ID0gMi41KjEuNSlcbnByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gXFxoXFwpKVxuZGV2Lm9mZigpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX0Fubm8zLnRzdlxcKSkpXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShzaXplID0gc3RhcnQyIC0gc3RhcnQxKVxuXG5kYXRhX3VuZGVyNTBrYiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSwgc2l6ZSA8IDUwKjEwMDAsIEFubm8zID09IFxccmVnXFwpXG5kYXRhX3VuZGVyMjAwa2IgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIHNpemUgPj0gNTAqMTAwMCwgc2l6ZSA8IDIwMCoxMDAwLCBBbm5vMyA9PSBcXHJlZ1xcKVxuZGF0YV9vdmVyMjAwa2IgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIHNpemUgPj0gMjAwKjEwMDAsIEFubm8zID09IFxccmVnXFwpXG5cbiMjIyMjIyMjXG5cbmRhdGEgPC0gZGF0YV91bmRlcjUwa2JcblxuZGlmZkN1dG9mZiA8LSAwLjJcbmRhdGEgPC0gZGF0YSAlPiVcbiAgZHBseXI6Om11dGF0ZSh1cGRvd25fZFRBR19ETVNPID0gaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpKVxuZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbmRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG5cbiMjIyNcbm51bS51cCA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVtcXFVQXFxdXG5udW0ubm8gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxOT1xcXVxubnVtLmRvd24gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXFxET1dOXFxdXG5udW0uYWxsIDwtIG51bS51cCArIG51bS5ubyArIG51bS5kb3duXG5wZXJjLnVwIDwtIHJvdW5kKG51bS51cCAvIG51bS5hbGwgKiAxMDAsIDIpXG5wZXJjLm5vIDwtIHJvdW5kKG51bS5ubyAvIG51bS5hbGwgKiAxMDAsIDIpXG5wZXJjLmRvd24gPC0gcm91bmQobnVtLmRvd24gLyBudW0uYWxsICogMTAwLCAyKVxuXG5kYXRhJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoZGF0YSRETVNPLCBkYXRhJGRUQUcsIG4gPSAxMDApXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5wMSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUwKFxcVVA6IFxcLCBudW0udXAsIFxcIChcXCwgcGVyYy51cCwgXFwlKVxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gLTAuNSwgeSA9IDEtMC4xLCBsYWJlbCA9IHBhc3RlMChcXE5POiBcXCwgbnVtLm5vLCBcXCAoXFwsIHBlcmMubm8sIFxcJSlcXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLTAuMiwgbGFiZWwgPSBwYXN0ZTAoXFxET1dOOiBcXCwgbnVtLmRvd24sIFxcIChcXCwgcGVyYy5kb3duLCBcXCUpXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShuYW1lKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKSAgXG4gIFxuXG4jIyMjXG5udW0udXAgPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fQTQ4NV9ETVNPKSlbXFxVUFxcXVxubnVtLm5vIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX0E0ODVfRE1TTykpW1xcTk9cXF1cbm51bS5kb3duIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX0E0ODVfRE1TTykpW1xcRE9XTlxcXVxubnVtLmFsbCA8LSBudW0udXAgKyBudW0ubm8gKyBudW0uZG93blxucGVyYy51cCA8LSByb3VuZChudW0udXAgLyBudW0uYWxsICogMTAwLCAyKVxucGVyYy5ubyA8LSByb3VuZChudW0ubm8gLyBudW0uYWxsICogMTAwLCAyKVxucGVyYy5kb3duIDwtIHJvdW5kKG51bS5kb3duIC8gbnVtLmFsbCAqIDEwMCwgMilcblxuZGF0YSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KGRhdGEkRE1TTywgZGF0YSRBNDg1LCBuID0gMTAwKVxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxucDIgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gRE1TTywgeSA9IEE0ODUsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgK1xuICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlMChcXFVQOiBcXCwgbnVtLnVwLCBcXCAoXFwsIHBlcmMudXAsIFxcJSlcXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IC0wLjUsIHkgPSAxLTAuMSwgbGFiZWwgPSBwYXN0ZTAoXFxOTzogXFwsIG51bS5ubywgXFwgKFxcLCBwZXJjLm5vLCBcXCUpXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAtMC41LCB5ID0gMS0wLjIsIGxhYmVsID0gcGFzdGUwKFxcRE9XTjogXFwsIG51bS5kb3duLCBcXCAoXFwsIHBlcmMuZG93biwgXFwlKVxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUobmFtZSkgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkgIFxuICBcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2NhdHRlcnBsb3RfXFwsIG5hbWUsIFxcX1xcLCBkaWZmQ3V0b2ZmLCBcXF9yZWd1bmRlcjUwa2JfcHVyZVxcKVxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gNSoxLjUsIGhlaWdodCA9IDIuNSoxLjUpXG5wcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbmRldi5vZmYoKVxuXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICB3aWR0aCA9IDUqMS41LCBoZWlnaHQgPSAyLjUqMS41KVxucHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG5kZXYub2ZmKClcblxuYGBgXG5gYGAifQ== -->

```r
```r
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \_Anno3.tsv\)))

data <- data %>% dplyr::mutate(size = start2 - start1)

data_under50kb <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\), size < 50*1000, Anno3 == \reg\)
data_under200kb <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\), size >= 50*1000, size < 200*1000, Anno3 == \reg\)
data_over200kb <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\), size >= 200*1000, Anno3 == \reg\)

########

data <- data_under50kb

diffCutoff <- 0.2
data <- data %>%
  dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)))
data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))

####
num.up <- (summary(data$updown_dTAG_DMSO))[\UP\]
num.no <- (summary(data$updown_dTAG_DMSO))[\NO\]
num.down <- (summary(data$updown_dTAG_DMSO))[\DOWN\]
num.all <- num.up + num.no + num.down
perc.up <- round(num.up / num.all * 100, 2)
perc.no <- round(num.no / num.all * 100, 2)
perc.down <- round(num.down / num.all * 100, 2)

data$density <- get_density(data$DMSO, data$dTAG, n = 100)
data <- data %>% dplyr::arrange(density)
p1 <- ggplot(data, aes(x = DMSO, y = dTAG, color = density)) +
  geom_point(show.legend = FALSE) + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  annotate(\text\, x = -0.5, y = 1, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  theme_classic() + ggtitle(name) + theme(plot.title = element_text(size = 5))  
  

####
num.up <- (summary(data$updown_A485_DMSO))[\UP\]
num.no <- (summary(data$updown_A485_DMSO))[\NO\]
num.down <- (summary(data$updown_A485_DMSO))[\DOWN\]
num.all <- num.up + num.no + num.down
perc.up <- round(num.up / num.all * 100, 2)
perc.no <- round(num.no / num.all * 100, 2)
perc.down <- round(num.down / num.all * 100, 2)

data$density <- get_density(data$DMSO, data$A485, n = 100)
data <- data %>% dplyr::arrange(density)
p2 <- ggplot(data, aes(x = DMSO, y = A485, color = density)) +
  geom_point(show.legend = FALSE) + 
  scale_color_viridis() +
  xlim(-0.5, 1) + ylim(-0.5, 1) + coord_fixed() +
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  annotate(\text\, x = -0.5, y = 1, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  annotate(\text\, x = -0.5, y = 1-0.2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
           color = \black\, hjust = 0, size = 3) +
  theme_classic() + ggtitle(name) + theme(plot.title = element_text(size = 5))  
  

fileName <- paste0(\scatterplot_\, name, \_\, diffCutoff, \_regunder50kb_pure\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 5*1.5, height = 2.5*1.5)
print(cowplot::plot_grid(p1, p2, align = \h\))
dev.off()

svglite(here(figDir, paste0(fileName, \.svg\)), 
        width = 5*1.5, height = 2.5*1.5)
print(cowplot::plot_grid(p1, p2, align = \h\))
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### Pure-reg vs str-reg

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzV1WVcxbElEd3RJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMUJ5YjIxdmRHVnlYQ0pjYm1SaGRHRWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lpNTBjM1pjSWlrcEtWeHVhWFJsY21GMFpWOXNiMjl3WDJaMWJtTjBhVzl1Y3loa1lYUmhMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOWNJaXdnWENKaGJHeGNJaWtzSUhWdWFYRjFaU2hrWVhSaEpFRnVibTh5S1NsY2JtbDBaWEpoZEdWZmJHOXZjRjltZFc1amRHbHZibk1vWkdGMFlTd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENKZlhDSXNJRndpY0Mxd1hDSXBMQ0JqS0Z3aVVDMVFYQ0lwS1Z4dWFYUmxjbUYwWlY5c2IyOXdYMloxYm1OMGFXOXVjeWhrWVhSaExDQm1hV2RFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjSWw5Y0lpd2dYQ0p3TFc1Y0lpa3NJR01vWENKUUxVNWNJaWtwWEc1cGRHVnlZWFJsWDJ4dmIzQmZablZ1WTNScGIyNXpLR1JoZEdFc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDF3aUxDQmNJbTR0Ymx3aUtTd2dZeWhjSWs0dFRsd2lLU2xjYmx4dVkyOXNiM0pNYVhOMElEd3RJR052Ykc5eVRHbHpkRkJ5YjIxdmRHVnlYRzVzYjI5d1RHbHpkQ0E4TFNCaktGd2lUaTFPWENJc0lGd2lVQzFPWENJc0lGd2lVQzFRWENJcFhHNWNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVNrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbHpkR0Z1WTJVc0lFUk5VMDhzSUVGdWJtOHlLVnh1WTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY0ltUnBjM1JoYm1ObFhDSXNJRndpYzJOdmNtVmNJaXdnWENKQmJtNXZNbHdpS1Z4dVkzSmxZWFJsWDJScGMzUmZkbk5mWVhablUyTnZjbVZmY0dWeVZISmxZWFJ0Wlc1MEtIUmxiWEFzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYMFJOVTA5Y0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQk1hWE4wTENCamIyeHZja3hwYzNRc0lITmxJRDBnVkZKVlJTbGNibU55WldGMFpWOXpZMjl5WlY5aVlYSndiRzkwWDNCbGNsUnlaV0YwYldWdWRDaDBaVzF3TENCbWFXZEVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNJbDlFVFZOUFhDSXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjRXhwYzNRc0lHTnZiRzl5VEdsemRDbGNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVNrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbHpkR0Z1WTJVc0lHUlVRVWNzSUVGdWJtOHlLVnh1WTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY0ltUnBjM1JoYm1ObFhDSXNJRndpYzJOdmNtVmNJaXdnWENKQmJtNXZNbHdpS1Z4dVkzSmxZWFJsWDJScGMzUmZkbk5mWVhablUyTnZjbVZmY0dWeVZISmxZWFJ0Wlc1MEtIUmxiWEFzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYMlJVUVVkY0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQk1hWE4wTENCamIyeHZja3hwYzNRc0lITmxJRDBnVkZKVlJTbGNibHh1WTNKbFlYUmxYM05qYjNKbFgySmhjbkJzYjNSZmNHVnlWSEpsWVhSdFpXNTBLSFJsYlhBc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDJSVVFVZGNJaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3VEdsemRDd2dZMjlzYjNKTWFYTjBLVnh1ZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBjM1JoYm1ObElEMGdjM1JoY25ReUlDMGdjM1JoY25ReEtTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGthWE4wWVc1alpTd2dRVFE0TlN3Z1FXNXVieklwWEc1amIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGd2laR2x6ZEdGdVkyVmNJaXdnWENKelkyOXlaVndpTENCY0lrRnVibTh5WENJcFhHNWpjbVZoZEdWZlpHbHpkRjkyYzE5aGRtZFRZMjl5WlY5d1pYSlVjbVZoZEcxbGJuUW9kR1Z0Y0N3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYQ0pmUVRRNE5Wd2lLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjRXhwYzNRc0lHTnZiRzl5VEdsemRDd2djMlVnUFNCVVVsVkZLVnh1WTNKbFlYUmxYM05qYjNKbFgySmhjbkJzYjNSZmNHVnlWSEpsWVhSdFpXNTBLSFJsYlhBc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDBFME9EVmNJaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3VEdsemRDd2dZMjlzYjNKTWFYTjBLVnh1WEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0J6ZEdGeWRESWdMU0J6ZEdGeWRERXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwYzNSaGJtTmxMQ0JrYVdabVgyUlVRVWRmUkUxVFR5d2dRVzV1YnpJcFhHNWpiMnh1WVcxbGN5aDBaVzF3S1NBOExTQmpLRndpWkdsemRHRnVZMlZjSWl3Z1hDSnpZMjl5WlZ3aUxDQmNJa0Z1Ym04eVhDSXBYRzVqY21WaGRHVmZaR2x6ZEY5MmMxOWhkbWRFYVdabVUyTnZjbVZmY0dWeVZISmxZWFJ0Wlc1MEtIUmxiWEFzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYMlJVUVVkY0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQk1hWE4wTENCamIyeHZja3hwYzNRc0lITmxJRDBnVkZKVlJTbGNibHh1ZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBjM1JoYm1ObElEMGdjM1JoY25ReUlDMGdjM1JoY25ReEtTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGthWE4wWVc1alpTd2daR2xtWmw5Qk5EZzFYMFJOVTA4c0lFRnVibTh5S1Z4dVkyOXNibUZ0WlhNb2RHVnRjQ2tnUEMwZ1l5aGNJbVJwYzNSaGJtTmxYQ0lzSUZ3aWMyTnZjbVZjSWl3Z1hDSkJibTV2TWx3aUtWeHVZM0psWVhSbFgyUnBjM1JmZG5OZllYWm5SR2xtWmxOamIzSmxYM0JsY2xSeVpXRjBiV1Z1ZENoMFpXMXdMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOUJORGcxWENJcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d1RHbHpkQ3dnWTI5c2IzSk1hWE4wTENCelpTQTlJRlJTVlVVcFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub1Byb21vdGVyXFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxhbGxcXCksIHVuaXF1ZShkYXRhJEFubm8yKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxccC1wXFwpLCBjKFxcUC1QXFwpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxwLW5cXCksIGMoXFxQLU5cXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXG4tblxcKSwgYyhcXE4tTlxcKSlcblxuY29sb3JMaXN0IDwtIGNvbG9yTGlzdFByb21vdGVyXG5sb29wTGlzdCA8LSBjKFxcTi1OXFwsIFxcUC1OXFwsIFxcUC1QXFwpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIERNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0RNU09cXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9ETVNPXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRUQUcsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcblxuY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0KVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgQTQ4NSwgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKVxuY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0KVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBkaWZmX2RUQUdfRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZGlmZl9BNDg1X0RNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1XFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->

name <- \chromo_cons_annoPromoter\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
iterate_loop_functions(data, figDir, paste0(name, \_\, \all\), unique(data$Anno2))
iterate_loop_functions(data, figDir, paste0(name, \_\, \p-p\), c(\P-P\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \p-n\), c(\P-N\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \n-n\), c(\N-N\))

colorList <- colorListPromoter
loopList <- c(\N-N\, \P-N\, \P-P\)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_DMSO\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_DMSO\), 
                                      loopList, colorList)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, dTAG, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                     loopList, colorList, se = TRUE)

create_score_barplot_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                      loopList, colorList)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, A485, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                      loopList, colorList)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                     loopList, colorList, se = TRUE)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_A485_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                     loopList, colorList, se = TRUE)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNXVZVzFsSUR3dElGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIxQnliMjF2ZEdWeVhGeGNibVJoZEdFZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEM1MGMzWmNYQ2twS1Z4dWFYUmxjbUYwWlY5c2IyOXdYMloxYm1OMGFXOXVjeWhrWVhSaExDQm1hV2RFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5Y1hDd2dYRnhoYkd4Y1hDa3NJSFZ1YVhGMVpTaGtZWFJoSkVGdWJtOHlLU2xjYm1sMFpYSmhkR1ZmYkc5dmNGOW1kVzVqZEdsdmJuTW9aR0YwWVN3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnhmWEZ3c0lGeGNjQzF3WEZ3cExDQmpLRnhjVUMxUVhGd3BLVnh1YVhSbGNtRjBaVjlzYjI5d1gyWjFibU4wYVc5dWN5aGtZWFJoTENCbWFXZEVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNYRjljWEN3Z1hGeHdMVzVjWENrc0lHTW9YRnhRTFU1Y1hDa3BYRzVwZEdWeVlYUmxYMnh2YjNCZlpuVnVZM1JwYjI1ektHUmhkR0VzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNYMXhjTENCY1hHNHRibHhjS1N3Z1l5aGNYRTR0VGx4Y0tTbGNibHh1WTI5c2IzSk1hWE4wSUR3dElHTnZiRzl5VEdsemRGQnliMjF2ZEdWeVhHNXNiMjl3VEdsemRDQThMU0JqS0Z4Y1RpMU9YRndzSUZ4Y1VDMU9YRndzSUZ4Y1VDMVFYRndwWEc1Y2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsemRHRnVZMlVzSUVSTlUwOHNJRUZ1Ym04eUtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjWEdScGMzUmhibU5sWEZ3c0lGeGNjMk52Y21WY1hDd2dYRnhCYm01dk1seGNLVnh1WTNKbFlYUmxYMlJwYzNSZmRuTmZZWFpuVTJOdmNtVmZjR1Z5VkhKbFlYUnRaVzUwS0hSbGJYQXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gwUk5VMDljWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNCTWFYTjBMQ0JqYjJ4dmNreHBjM1FzSUhObElEMGdWRkpWUlNsY2JtTnlaV0YwWlY5elkyOXlaVjlpWVhKd2JHOTBYM0JsY2xSeVpXRjBiV1Z1ZENoMFpXMXdMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY1hGOUVUVk5QWEZ3cExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNFeHBjM1FzSUdOdmJHOXlUR2x6ZENsY2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsemRHRnVZMlVzSUdSVVFVY3NJRUZ1Ym04eUtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjWEdScGMzUmhibU5sWEZ3c0lGeGNjMk52Y21WY1hDd2dYRnhCYm01dk1seGNLVnh1WTNKbFlYUmxYMlJwYzNSZmRuTmZZWFpuVTJOdmNtVmZjR1Z5VkhKbFlYUnRaVzUwS0hSbGJYQXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gyUlVRVWRjWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNCTWFYTjBMQ0JqYjJ4dmNreHBjM1FzSUhObElEMGdWRkpWUlNsY2JseHVZM0psWVhSbFgzTmpiM0psWDJKaGNuQnNiM1JmY0dWeVZISmxZWFJ0Wlc1MEtIUmxiWEFzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNYMlJVUVVkY1hDa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdUR2x6ZEN3Z1kyOXNiM0pNYVhOMEtWeHVkR1Z0Y0NBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dScGMzUmhibU5sSUQwZ2MzUmhjblF5SUMwZ2MzUmhjblF4S1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoa2FYTjBZVzVqWlN3Z1FUUTROU3dnUVc1dWJ6SXBYRzVqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z4Y1pHbHpkR0Z1WTJWY1hDd2dYRnh6WTI5eVpWeGNMQ0JjWEVGdWJtOHlYRndwWEc1amNtVmhkR1ZmWkdsemRGOTJjMTloZG1kVFkyOXlaVjl3WlhKVWNtVmhkRzFsYm5Rb2RHVnRjQ3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hGeGZRVFE0TlZ4Y0tTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNFeHBjM1FzSUdOdmJHOXlUR2x6ZEN3Z2MyVWdQU0JVVWxWRktWeHVZM0psWVhSbFgzTmpiM0psWDJKaGNuQnNiM1JmY0dWeVZISmxZWFJ0Wlc1MEtIUmxiWEFzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNYMEUwT0RWY1hDa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdUR2x6ZEN3Z1kyOXNiM0pNYVhOMEtWeHVYRzUwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1pHbHpkR0Z1WTJVZ1BTQnpkR0Z5ZERJZ0xTQnpkR0Z5ZERFcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBjM1JoYm1ObExDQmthV1ptWDJSVVFVZGZSRTFUVHl3Z1FXNXVieklwWEc1amIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGeGNaR2x6ZEdGdVkyVmNYQ3dnWEZ4elkyOXlaVnhjTENCY1hFRnVibTh5WEZ3cFhHNWpjbVZoZEdWZlpHbHpkRjkyYzE5aGRtZEVhV1ptVTJOdmNtVmZjR1Z5VkhKbFlYUnRaVzUwS0hSbGJYQXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gyUlVRVWRjWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNCTWFYTjBMQ0JqYjJ4dmNreHBjM1FzSUhObElEMGdWRkpWUlNsY2JseHVkR1Z0Y0NBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dScGMzUmhibU5sSUQwZ2MzUmhjblF5SUMwZ2MzUmhjblF4S1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoa2FYTjBZVzVqWlN3Z1pHbG1abDlCTkRnMVgwUk5VMDhzSUVGdWJtOHlLVnh1WTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY1hHUnBjM1JoYm1ObFhGd3NJRnhjYzJOdmNtVmNYQ3dnWEZ4QmJtNXZNbHhjS1Z4dVkzSmxZWFJsWDJScGMzUmZkbk5mWVhablJHbG1abE5qYjNKbFgzQmxjbFJ5WldGMGJXVnVkQ2gwWlcxd0xDQm1hV2RFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5Qk5EZzFYRndwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3VEdsemRDd2dZMjlzYjNKTWFYTjBMQ0J6WlNBOUlGUlNWVVVwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub1Byb21vdGVyXFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxhbGxcXCksIHVuaXF1ZShkYXRhJEFubm8yKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxccC1wXFwpLCBjKFxcUC1QXFwpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxwLW5cXCksIGMoXFxQLU5cXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXG4tblxcKSwgYyhcXE4tTlxcKSlcblxuY29sb3JMaXN0IDwtIGNvbG9yTGlzdFByb21vdGVyXG5sb29wTGlzdCA8LSBjKFxcTi1OXFwsIFxcUC1OXFwsIFxcUC1QXFwpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIERNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0RNU09cXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9ETVNPXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRUQUcsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcblxuY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0KVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgQTQ4NSwgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKVxuY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0KVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBkaWZmX2RUQUdfRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZGlmZl9BNDg1X0RNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1XFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub1Byb21vdGVyXFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxhbGxcXCksIHVuaXF1ZShkYXRhJEFubm8yKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxccC1wXFwpLCBjKFxcUC1QXFwpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxwLW5cXCksIGMoXFxQLU5cXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXG4tblxcKSwgYyhcXE4tTlxcKSlcblxuY29sb3JMaXN0IDwtIGNvbG9yTGlzdFByb21vdGVyXG5sb29wTGlzdCA8LSBjKFxcTi1OXFwsIFxcUC1OXFwsIFxcUC1QXFwpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIERNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0RNU09cXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9ETVNPXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRUQUcsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcblxuY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0KVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgQTQ4NSwgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKVxuY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0KVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBkaWZmX2RUQUdfRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZGlmZl9BNDg1X0RNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1XFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpXG5gYGBcbmBgYCJ9 -->

```r
```r

name <- \chromo_cons_annoPromoter\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
iterate_loop_functions(data, figDir, paste0(name, \_\, \all\), unique(data$Anno2))
iterate_loop_functions(data, figDir, paste0(name, \_\, \p-p\), c(\P-P\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \p-n\), c(\P-N\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \n-n\), c(\N-N\))

colorList <- colorListPromoter
loopList <- c(\N-N\, \P-N\, \P-P\)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_DMSO\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_DMSO\), 
                                      loopList, colorList)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, dTAG, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                     loopList, colorList, se = TRUE)

create_score_barplot_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                      loopList, colorList)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, A485, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                      loopList, colorList)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                     loopList, colorList, se = TRUE)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_A485_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                     loopList, colorList, se = TRUE)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### 50kb vs 200 kb

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUZibWhoYm1ObGNsd2lYRzVrWVhSaElEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENJdWRITjJYQ0lwS1NsY2JtbDBaWEpoZEdWZmJHOXZjRjltZFc1amRHbHZibk1vWkdGMFlTd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENKZlhDSXNJRndpWVd4c1hDSXBMQ0IxYm1seGRXVW9aR0YwWVNSQmJtNXZNaWtwWEc1cGRHVnlZWFJsWDJ4dmIzQmZablZ1WTNScGIyNXpLR1JoZEdFc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDF3aUxDQmNJbVV0WlZ3aUtTd2dZeWhjSWtVdFJWd2lLU2xjYm1sMFpYSmhkR1ZmYkc5dmNGOW1kVzVqZEdsdmJuTW9aR0YwWVN3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYQ0pmWENJc0lGd2laUzF1WENJcExDQmpLRndpUlMxT1hDSXBLVnh1YVhSbGNtRjBaVjlzYjI5d1gyWjFibU4wYVc5dWN5aGtZWFJoTENCbWFXZEVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNJbDljSWl3Z1hDSnVMVzVjSWlrc0lHTW9YQ0pPTFU1Y0lpa3BYRzVjYm1OdmJHOXlUR2x6ZENBOExTQmpiMnh2Y2t4cGMzUkZibWhoYm1ObGNseHViRzl2Y0V4cGMzUWdQQzBnWXloY0lrNHRUbHdpTENCY0lrVXRUbHdpTENCY0lrVXRSVndpS1Z4dVhHNTBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWkdsemRHRnVZMlVnUFNCemRHRnlkRElnTFNCemRHRnlkREVwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScGMzUmhibU5sTENCRVRWTlBMQ0JCYm01dk1pbGNibU52Ykc1aGJXVnpLSFJsYlhBcElEd3RJR01vWENKa2FYTjBZVzVqWlZ3aUxDQmNJbk5qYjNKbFhDSXNJRndpUVc1dWJ6SmNJaWxjYm1OeVpXRjBaVjlrYVhOMFgzWnpYMkYyWjFOamIzSmxYM0JsY2xSeVpXRjBiV1Z1ZENoMFpXMXdMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOUVUVk5QWENJcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d1RHbHpkQ3dnWTI5c2IzSk1hWE4wTENCelpTQTlJRlJTVlVVcFhHNWpjbVZoZEdWZmMyTnZjbVZmWW1GeWNHeHZkRjl3WlhKVWNtVmhkRzFsYm5Rb2RHVnRjQ3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZSRTFUVDF3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQk1hWE4wTENCamIyeHZja3hwYzNRcFhHNTBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWkdsemRHRnVZMlVnUFNCemRHRnlkRElnTFNCemRHRnlkREVwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScGMzUmhibU5sTENCa1ZFRkhMQ0JCYm01dk1pbGNibU52Ykc1aGJXVnpLSFJsYlhBcElEd3RJR01vWENKa2FYTjBZVzVqWlZ3aUxDQmNJbk5qYjNKbFhDSXNJRndpUVc1dWJ6SmNJaWxjYm1OeVpXRjBaVjlrYVhOMFgzWnpYMkYyWjFOamIzSmxYM0JsY2xSeVpXRjBiV1Z1ZENoMFpXMXdMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOWtWRUZIWENJcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d1RHbHpkQ3dnWTI5c2IzSk1hWE4wTENCelpTQTlJRlJTVlVVcFhHNWpjbVZoZEdWZmMyTnZjbVZmWW1GeWNHeHZkRjl3WlhKVWNtVmhkRzFsYm5Rb2RHVnRjQ3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZaRlJCUjF3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQk1hWE4wTENCamIyeHZja3hwYzNRcFhHNTBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWkdsemRHRnVZMlVnUFNCemRHRnlkRElnTFNCemRHRnlkREVwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScGMzUmhibU5sTENCQk5EZzFMQ0JCYm01dk1pbGNibU52Ykc1aGJXVnpLSFJsYlhBcElEd3RJR01vWENKa2FYTjBZVzVqWlZ3aUxDQmNJbk5qYjNKbFhDSXNJRndpUVc1dWJ6SmNJaWxjYm1OeVpXRjBaVjlrYVhOMFgzWnpYMkYyWjFOamIzSmxYM0JsY2xSeVpXRjBiV1Z1ZENoMFpXMXdMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOUJORGcxWENJcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d1RHbHpkQ3dnWTI5c2IzSk1hWE4wTENCelpTQTlJRlJTVlVVcFhHNWpjbVZoZEdWZmMyTnZjbVZmWW1GeWNHeHZkRjl3WlhKVWNtVmhkRzFsYm5Rb2RHVnRjQ3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZRVFE0TlZ3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQk1hWE4wTENCamIyeHZja3hwYzNRcFhHNWNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVNrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbHpkR0Z1WTJVc0lHUnBabVpmWkZSQlIxOUVUVk5QTENCQmJtNXZNaWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXBJRHd0SUdNb1hDSmthWE4wWVc1alpWd2lMQ0JjSW5OamIzSmxYQ0lzSUZ3aVFXNXViekpjSWlsY2JtTnlaV0YwWlY5a2FYTjBYM1p6WDJGMlowUnBabVpUWTI5eVpWOXdaWEpVY21WaGRHMWxiblFvZEdWdGNDd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENKZlpGUkJSMXdpS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0V4cGMzUXNJR052Ykc5eVRHbHpkQ3dnYzJVZ1BTQlVVbFZGS1Z4dVhHNTBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWkdsemRHRnVZMlVnUFNCemRHRnlkRElnTFNCemRHRnlkREVwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScGMzUmhibU5sTENCa2FXWm1YMEUwT0RWZlJFMVRUeXdnUVc1dWJ6SXBYRzVqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z3aVpHbHpkR0Z1WTJWY0lpd2dYQ0p6WTI5eVpWd2lMQ0JjSWtGdWJtOHlYQ0lwWEc1amNtVmhkR1ZmWkdsemRGOTJjMTloZG1kRWFXWm1VMk52Y21WZmNHVnlWSEpsWVhSdFpXNTBLSFJsYlhBc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDBFME9EVmNJaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0JNYVhOMExDQmpiMnh2Y2t4cGMzUXNJSE5sSUQwZ1ZGSlZSU2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vRW5oYW5jZXJcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXGFsbFxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxlLWVcXCksIGMoXFxFLUVcXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXGUtblxcKSwgYyhcXEUtTlxcKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxcbi1uXFwpLCBjKFxcTi1OXFwpKVxuXG5jb2xvckxpc3QgPC0gY29sb3JMaXN0RW5oYW5jZXJcbmxvb3BMaXN0IDwtIGMoXFxOLU5cXCwgXFxFLU5cXCwgXFxFLUVcXClcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfRE1TT1xcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKVxuY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0RNU09cXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0KVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZFRBRywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR1xcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKVxuY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0KVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgQTQ4NSwgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKVxuY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0KVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBkaWZmX2RUQUdfRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZGlmZl9BNDg1X0RNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1XFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
name <- \chromo_cons_annoEnhancer\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
iterate_loop_functions(data, figDir, paste0(name, \_\, \all\), unique(data$Anno2))
iterate_loop_functions(data, figDir, paste0(name, \_\, \e-e\), c(\E-E\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \e-n\), c(\E-N\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \n-n\), c(\N-N\))

colorList <- colorListEnhancer
loopList <- c(\N-N\, \E-N\, \E-E\)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_DMSO\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_DMSO\), 
                                      loopList, colorList)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, dTAG, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                      loopList, colorList)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, A485, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                      loopList, colorList)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                     loopList, colorList, se = TRUE)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_A485_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                     loopList, colorList, se = TRUE)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05RmJtaGhibU5sY2x4Y1hHNWtZWFJoSUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnd1ZEhOMlhGd3BLU2xjYm1sMFpYSmhkR1ZmYkc5dmNGOW1kVzVqZEdsdmJuTW9aR0YwWVN3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnhmWEZ3c0lGeGNZV3hzWEZ3cExDQjFibWx4ZFdVb1pHRjBZU1JCYm01dk1pa3BYRzVwZEdWeVlYUmxYMnh2YjNCZlpuVnVZM1JwYjI1ektHUmhkR0VzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNYMXhjTENCY1hHVXRaVnhjS1N3Z1l5aGNYRVV0UlZ4Y0tTbGNibWwwWlhKaGRHVmZiRzl2Y0Y5bWRXNWpkR2x2Ym5Nb1pHRjBZU3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hGeGZYRndzSUZ4Y1pTMXVYRndwTENCaktGeGNSUzFPWEZ3cEtWeHVhWFJsY21GMFpWOXNiMjl3WDJaMWJtTjBhVzl1Y3loa1lYUmhMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY1hGOWNYQ3dnWEZ4dUxXNWNYQ2tzSUdNb1hGeE9MVTVjWENrcFhHNWNibU52Ykc5eVRHbHpkQ0E4TFNCamIyeHZja3hwYzNSRmJtaGhibU5sY2x4dWJHOXZjRXhwYzNRZ1BDMGdZeWhjWEU0dFRseGNMQ0JjWEVVdFRseGNMQ0JjWEVVdFJWeGNLVnh1WEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0J6ZEdGeWRESWdMU0J6ZEdGeWRERXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwYzNSaGJtTmxMQ0JFVFZOUExDQkJibTV2TWlsY2JtTnZiRzVoYldWektIUmxiWEFwSUR3dElHTW9YRnhrYVhOMFlXNWpaVnhjTENCY1hITmpiM0psWEZ3c0lGeGNRVzV1YnpKY1hDbGNibU55WldGMFpWOWthWE4wWDNaelgyRjJaMU5qYjNKbFgzQmxjbFJ5WldGMGJXVnVkQ2gwWlcxd0xDQm1hV2RFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5RVRWTlBYRndwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3VEdsemRDd2dZMjlzYjNKTWFYTjBMQ0J6WlNBOUlGUlNWVVVwWEc1amNtVmhkR1ZmYzJOdmNtVmZZbUZ5Y0d4dmRGOXdaWEpVY21WaGRHMWxiblFvZEdWdGNDd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZlJFMVRUMXhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNCTWFYTjBMQ0JqYjJ4dmNreHBjM1FwWEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0J6ZEdGeWRESWdMU0J6ZEdGeWRERXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwYzNSaGJtTmxMQ0JrVkVGSExDQkJibTV2TWlsY2JtTnZiRzVoYldWektIUmxiWEFwSUR3dElHTW9YRnhrYVhOMFlXNWpaVnhjTENCY1hITmpiM0psWEZ3c0lGeGNRVzV1YnpKY1hDbGNibU55WldGMFpWOWthWE4wWDNaelgyRjJaMU5qYjNKbFgzQmxjbFJ5WldGMGJXVnVkQ2gwWlcxd0xDQm1hV2RFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5a1ZFRkhYRndwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3VEdsemRDd2dZMjlzYjNKTWFYTjBMQ0J6WlNBOUlGUlNWVVVwWEc1amNtVmhkR1ZmYzJOdmNtVmZZbUZ5Y0d4dmRGOXdaWEpVY21WaGRHMWxiblFvZEdWdGNDd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZlpGUkJSMXhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNCTWFYTjBMQ0JqYjJ4dmNreHBjM1FwWEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0J6ZEdGeWRESWdMU0J6ZEdGeWRERXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwYzNSaGJtTmxMQ0JCTkRnMUxDQkJibTV2TWlsY2JtTnZiRzVoYldWektIUmxiWEFwSUR3dElHTW9YRnhrYVhOMFlXNWpaVnhjTENCY1hITmpiM0psWEZ3c0lGeGNRVzV1YnpKY1hDbGNibU55WldGMFpWOWthWE4wWDNaelgyRjJaMU5qYjNKbFgzQmxjbFJ5WldGMGJXVnVkQ2gwWlcxd0xDQm1hV2RFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5Qk5EZzFYRndwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3VEdsemRDd2dZMjlzYjNKTWFYTjBMQ0J6WlNBOUlGUlNWVVVwWEc1amNtVmhkR1ZmYzJOdmNtVmZZbUZ5Y0d4dmRGOXdaWEpVY21WaGRHMWxiblFvZEdWdGNDd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZlFUUTROVnhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNCTWFYTjBMQ0JqYjJ4dmNreHBjM1FwWEc1Y2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsemRHRnVZMlVzSUdScFptWmZaRlJCUjE5RVRWTlBMQ0JCYm01dk1pbGNibU52Ykc1aGJXVnpLSFJsYlhBcElEd3RJR01vWEZ4a2FYTjBZVzVqWlZ4Y0xDQmNYSE5qYjNKbFhGd3NJRnhjUVc1dWJ6SmNYQ2xjYm1OeVpXRjBaVjlrYVhOMFgzWnpYMkYyWjBScFptWlRZMjl5WlY5d1pYSlVjbVZoZEcxbGJuUW9kR1Z0Y0N3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnhmWkZSQlIxeGNLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjRXhwYzNRc0lHTnZiRzl5VEdsemRDd2djMlVnUFNCVVVsVkZLVnh1WEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0J6ZEdGeWRESWdMU0J6ZEdGeWRERXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwYzNSaGJtTmxMQ0JrYVdabVgwRTBPRFZmUkUxVFR5d2dRVzV1YnpJcFhHNWpiMnh1WVcxbGN5aDBaVzF3S1NBOExTQmpLRnhjWkdsemRHRnVZMlZjWEN3Z1hGeHpZMjl5WlZ4Y0xDQmNYRUZ1Ym04eVhGd3BYRzVqY21WaGRHVmZaR2x6ZEY5MmMxOWhkbWRFYVdabVUyTnZjbVZmY0dWeVZISmxZWFJ0Wlc1MEtIUmxiWEFzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNYMEUwT0RWY1hDa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQk1hWE4wTENCamIyeHZja3hwYzNRc0lITmxJRDBnVkZKVlJTbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0VuaGFuY2VyXFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxhbGxcXCksIHVuaXF1ZShkYXRhJEFubm8yKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxcZS1lXFwpLCBjKFxcRS1FXFwpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxlLW5cXCksIGMoXFxFLU5cXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXG4tblxcKSwgYyhcXE4tTlxcKSlcblxuY29sb3JMaXN0IDwtIGNvbG9yTGlzdEVuaGFuY2VyXG5sb29wTGlzdCA8LSBjKFxcTi1OXFwsIFxcRS1OXFwsIFxcRS1FXFwpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIERNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0RNU09cXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9ETVNPXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRUQUcsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIEE0ODUsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1XFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZGlmZl9kVEFHX0RNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfQTQ4NV9ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9FbmhhbmNlclxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxcYWxsXFwpLCB1bmlxdWUoZGF0YSRBbm5vMikpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXGUtZVxcKSwgYyhcXEUtRVxcKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxcZS1uXFwpLCBjKFxcRS1OXFwpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxuLW5cXCksIGMoXFxOLU5cXCkpXG5cbmNvbG9yTGlzdCA8LSBjb2xvckxpc3RFbmhhbmNlclxubG9vcExpc3QgPC0gYyhcXE4tTlxcLCBcXEUtTlxcLCBcXEUtRVxcKVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9ETVNPXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpXG5jcmVhdGVfc2NvcmVfYmFycGxvdF9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfRE1TT1xcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QpXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBkVEFHLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpXG5jcmVhdGVfc2NvcmVfYmFycGxvdF9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR1xcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QpXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBBNDg1LCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1XFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpXG5jcmVhdGVfc2NvcmVfYmFycGxvdF9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfZFRBR19ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR1xcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBkaWZmX0E0ODVfRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmBgYFxuYGBgIn0= -->

```r
```r
name <- \chromo_cons_annoEnhancer\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
iterate_loop_functions(data, figDir, paste0(name, \_\, \all\), unique(data$Anno2))
iterate_loop_functions(data, figDir, paste0(name, \_\, \e-e\), c(\E-E\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \e-n\), c(\E-N\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \n-n\), c(\N-N\))

colorList <- colorListEnhancer
loopList <- c(\N-N\, \E-N\, \E-E\)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_DMSO\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_DMSO\), 
                                      loopList, colorList)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, dTAG, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                      loopList, colorList)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, A485, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                      loopList, colorList)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                     loopList, colorList, se = TRUE)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_A485_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                     loopList, colorList, se = TRUE)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### One feature annotation - promoter

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOVRkSEoxWTNSMWNtVmNJbHh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aUxuUnpkbHdpS1NrcFhHNXBkR1Z5WVhSbFgyeHZiM0JmWm5WdVkzUnBiMjV6S0dSaGRHRXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgxd2lMQ0JjSW1Gc2JGd2lLU3dnZFc1cGNYVmxLR1JoZEdFa1FXNXVieklwS1Z4dWFYUmxjbUYwWlY5c2IyOXdYMloxYm1OMGFXOXVjeWhrWVhSaExDQm1hV2RFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjSWw5Y0lpd2dYQ0p6TFhOY0lpa3NJR01vWENKVExWTmNJaWtwWEc1cGRHVnlZWFJsWDJ4dmIzQmZablZ1WTNScGIyNXpLR1JoZEdFc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDF3aUxDQmNJbk10Ymx3aUtTd2dZeWhjSWxNdFRsd2lLU2xjYm1sMFpYSmhkR1ZmYkc5dmNGOW1kVzVqZEdsdmJuTW9aR0YwWVN3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYQ0pmWENJc0lGd2liaTF1WENJcExDQmpLRndpVGkxT1hDSXBLVnh1WEc1amIyeHZja3hwYzNRZ1BDMGdZMjlzYjNKTWFYTjBVM1J5ZFdOMGRYSmxYRzVzYjI5d1RHbHpkQ0E4TFNCaktGd2lUaTFPWENJc0lGd2lVeTFPWENJc0lGd2lVeTFUWENJcFhHNWNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVNrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbHpkR0Z1WTJVc0lFUk5VMDhzSUVGdWJtOHlLVnh1WTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY0ltUnBjM1JoYm1ObFhDSXNJRndpYzJOdmNtVmNJaXdnWENKQmJtNXZNbHdpS1Z4dVkzSmxZWFJsWDJScGMzUmZkbk5mWVhablUyTnZjbVZmY0dWeVZISmxZWFJ0Wlc1MEtIUmxiWEFzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYMFJOVTA5Y0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQk1hWE4wTENCamIyeHZja3hwYzNRc0lITmxJRDBnVkZKVlJTbGNibU55WldGMFpWOXpZMjl5WlY5aVlYSndiRzkwWDNCbGNsUnlaV0YwYldWdWRDaDBaVzF3TENCbWFXZEVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNJbDlFVFZOUFhDSXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjRXhwYzNRc0lHTnZiRzl5VEdsemRDbGNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVNrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbHpkR0Z1WTJVc0lHUlVRVWNzSUVGdWJtOHlLVnh1WTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY0ltUnBjM1JoYm1ObFhDSXNJRndpYzJOdmNtVmNJaXdnWENKQmJtNXZNbHdpS1Z4dVkzSmxZWFJsWDJScGMzUmZkbk5mWVhablUyTnZjbVZmY0dWeVZISmxZWFJ0Wlc1MEtIUmxiWEFzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYMlJVUVVkY0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQk1hWE4wTENCamIyeHZja3hwYzNRc0lITmxJRDBnVkZKVlJTbGNibU55WldGMFpWOXpZMjl5WlY5aVlYSndiRzkwWDNCbGNsUnlaV0YwYldWdWRDaDBaVzF3TENCbWFXZEVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNJbDlrVkVGSFhDSXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjRXhwYzNRc0lHTnZiRzl5VEdsemRDbGNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVNrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbHpkR0Z1WTJVc0lFRTBPRFVzSUVGdWJtOHlLVnh1WTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY0ltUnBjM1JoYm1ObFhDSXNJRndpYzJOdmNtVmNJaXdnWENKQmJtNXZNbHdpS1Z4dVkzSmxZWFJsWDJScGMzUmZkbk5mWVhablUyTnZjbVZmY0dWeVZISmxZWFJ0Wlc1MEtIUmxiWEFzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYMEUwT0RWY0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQk1hWE4wTENCamIyeHZja3hwYzNRc0lITmxJRDBnVkZKVlJTbGNibU55WldGMFpWOXpZMjl5WlY5aVlYSndiRzkwWDNCbGNsUnlaV0YwYldWdWRDaDBaVzF3TENCbWFXZEVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNJbDlCTkRnMVhDSXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjRXhwYzNRc0lHTnZiRzl5VEdsemRDbGNibHh1ZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBjM1JoYm1ObElEMGdjM1JoY25ReUlDMGdjM1JoY25ReEtTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGthWE4wWVc1alpTd2daR2xtWmw5a1ZFRkhYMFJOVTA4c0lFRnVibTh5S1Z4dVkyOXNibUZ0WlhNb2RHVnRjQ2tnUEMwZ1l5aGNJbVJwYzNSaGJtTmxYQ0lzSUZ3aWMyTnZjbVZjSWl3Z1hDSkJibTV2TWx3aUtWeHVZM0psWVhSbFgyUnBjM1JmZG5OZllYWm5SR2xtWmxOamIzSmxYM0JsY2xSeVpXRjBiV1Z1ZENoMFpXMXdMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOWtWRUZIWENJcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d1RHbHpkQ3dnWTI5c2IzSk1hWE4wTENCelpTQTlJRlJTVlVVcFhHNWNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVNrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbHpkR0Z1WTJVc0lHUnBabVpmUVRRNE5WOUVUVk5QTENCQmJtNXZNaWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXBJRHd0SUdNb1hDSmthWE4wWVc1alpWd2lMQ0JjSW5OamIzSmxYQ0lzSUZ3aVFXNXViekpjSWlsY2JtTnlaV0YwWlY5a2FYTjBYM1p6WDJGMlowUnBabVpUWTI5eVpWOXdaWEpVY21WaGRHMWxiblFvZEdWdGNDd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENKZlFUUTROVndpS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0V4cGMzUXNJR052Ykc5eVRHbHpkQ3dnYzJVZ1BTQlVVbFZGS1Z4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9TdHJ1Y3R1cmVcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXGFsbFxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxzLXNcXCksIGMoXFxTLVNcXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXHMtblxcKSwgYyhcXFMtTlxcKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxcbi1uXFwpLCBjKFxcTi1OXFwpKVxuXG5jb2xvckxpc3QgPC0gY29sb3JMaXN0U3RydWN0dXJlXG5sb29wTGlzdCA8LSBjKFxcTi1OXFwsIFxcUy1OXFwsIFxcUy1TXFwpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIERNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0RNU09cXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9ETVNPXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRUQUcsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIEE0ODUsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1XFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZGlmZl9kVEFHX0RNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfQTQ4NV9ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
name <- \chromo_cons_annoStructure\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
iterate_loop_functions(data, figDir, paste0(name, \_\, \all\), unique(data$Anno2))
iterate_loop_functions(data, figDir, paste0(name, \_\, \s-s\), c(\S-S\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \s-n\), c(\S-N\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \n-n\), c(\N-N\))

colorList <- colorListStructure
loopList <- c(\N-N\, \S-N\, \S-S\)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_DMSO\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_DMSO\), 
                                      loopList, colorList)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, dTAG, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                      loopList, colorList)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, A485, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                      loopList, colorList)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                     loopList, colorList, se = TRUE)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_A485_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                     loopList, colorList, se = TRUE)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05VGRISjFZM1IxY21WY1hGeHVaR0YwWVNBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjTG5SemRseGNLU2twWEc1cGRHVnlZWFJsWDJ4dmIzQmZablZ1WTNScGIyNXpLR1JoZEdFc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDF4Y0xDQmNYR0ZzYkZ4Y0tTd2dkVzVwY1hWbEtHUmhkR0VrUVc1dWJ6SXBLVnh1YVhSbGNtRjBaVjlzYjI5d1gyWjFibU4wYVc5dWN5aGtZWFJoTENCbWFXZEVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNYRjljWEN3Z1hGeHpMWE5jWENrc0lHTW9YRnhUTFZOY1hDa3BYRzVwZEdWeVlYUmxYMnh2YjNCZlpuVnVZM1JwYjI1ektHUmhkR0VzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNYMXhjTENCY1hITXRibHhjS1N3Z1l5aGNYRk10VGx4Y0tTbGNibWwwWlhKaGRHVmZiRzl2Y0Y5bWRXNWpkR2x2Ym5Nb1pHRjBZU3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hGeGZYRndzSUZ4Y2JpMXVYRndwTENCaktGeGNUaTFPWEZ3cEtWeHVYRzVqYjJ4dmNreHBjM1FnUEMwZ1kyOXNiM0pNYVhOMFUzUnlkV04wZFhKbFhHNXNiMjl3VEdsemRDQThMU0JqS0Z4Y1RpMU9YRndzSUZ4Y1V5MU9YRndzSUZ4Y1V5MVRYRndwWEc1Y2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsemRHRnVZMlVzSUVSTlUwOHNJRUZ1Ym04eUtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjWEdScGMzUmhibU5sWEZ3c0lGeGNjMk52Y21WY1hDd2dYRnhCYm01dk1seGNLVnh1WTNKbFlYUmxYMlJwYzNSZmRuTmZZWFpuVTJOdmNtVmZjR1Z5VkhKbFlYUnRaVzUwS0hSbGJYQXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gwUk5VMDljWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNCTWFYTjBMQ0JqYjJ4dmNreHBjM1FzSUhObElEMGdWRkpWUlNsY2JtTnlaV0YwWlY5elkyOXlaVjlpWVhKd2JHOTBYM0JsY2xSeVpXRjBiV1Z1ZENoMFpXMXdMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY1hGOUVUVk5QWEZ3cExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNFeHBjM1FzSUdOdmJHOXlUR2x6ZENsY2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsemRHRnVZMlVzSUdSVVFVY3NJRUZ1Ym04eUtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjWEdScGMzUmhibU5sWEZ3c0lGeGNjMk52Y21WY1hDd2dYRnhCYm01dk1seGNLVnh1WTNKbFlYUmxYMlJwYzNSZmRuTmZZWFpuVTJOdmNtVmZjR1Z5VkhKbFlYUnRaVzUwS0hSbGJYQXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gyUlVRVWRjWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNCTWFYTjBMQ0JqYjJ4dmNreHBjM1FzSUhObElEMGdWRkpWUlNsY2JtTnlaV0YwWlY5elkyOXlaVjlpWVhKd2JHOTBYM0JsY2xSeVpXRjBiV1Z1ZENoMFpXMXdMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY1hGOWtWRUZIWEZ3cExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNFeHBjM1FzSUdOdmJHOXlUR2x6ZENsY2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsemRHRnVZMlVzSUVFME9EVXNJRUZ1Ym04eUtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjWEdScGMzUmhibU5sWEZ3c0lGeGNjMk52Y21WY1hDd2dYRnhCYm01dk1seGNLVnh1WTNKbFlYUmxYMlJwYzNSZmRuTmZZWFpuVTJOdmNtVmZjR1Z5VkhKbFlYUnRaVzUwS0hSbGJYQXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gwRTBPRFZjWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNCTWFYTjBMQ0JqYjJ4dmNreHBjM1FzSUhObElEMGdWRkpWUlNsY2JtTnlaV0YwWlY5elkyOXlaVjlpWVhKd2JHOTBYM0JsY2xSeVpXRjBiV1Z1ZENoMFpXMXdMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY1hGOUJORGcxWEZ3cExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNFeHBjM1FzSUdOdmJHOXlUR2x6ZENsY2JseHVkR1Z0Y0NBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dScGMzUmhibU5sSUQwZ2MzUmhjblF5SUMwZ2MzUmhjblF4S1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoa2FYTjBZVzVqWlN3Z1pHbG1abDlrVkVGSFgwUk5VMDhzSUVGdWJtOHlLVnh1WTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY1hHUnBjM1JoYm1ObFhGd3NJRnhjYzJOdmNtVmNYQ3dnWEZ4QmJtNXZNbHhjS1Z4dVkzSmxZWFJsWDJScGMzUmZkbk5mWVhablJHbG1abE5qYjNKbFgzQmxjbFJ5WldGMGJXVnVkQ2gwWlcxd0xDQm1hV2RFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5a1ZFRkhYRndwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3VEdsemRDd2dZMjlzYjNKTWFYTjBMQ0J6WlNBOUlGUlNWVVVwWEc1Y2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsemRHRnVZMlVzSUdScFptWmZRVFE0TlY5RVRWTlBMQ0JCYm01dk1pbGNibU52Ykc1aGJXVnpLSFJsYlhBcElEd3RJR01vWEZ4a2FYTjBZVzVqWlZ4Y0xDQmNYSE5qYjNKbFhGd3NJRnhjUVc1dWJ6SmNYQ2xjYm1OeVpXRjBaVjlrYVhOMFgzWnpYMkYyWjBScFptWlRZMjl5WlY5d1pYSlVjbVZoZEcxbGJuUW9kR1Z0Y0N3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnhmUVRRNE5WeGNLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjRXhwYzNRc0lHTnZiRzl5VEdsemRDd2djMlVnUFNCVVVsVkZLVnh1WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9TdHJ1Y3R1cmVcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXGFsbFxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxzLXNcXCksIGMoXFxTLVNcXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXHMtblxcKSwgYyhcXFMtTlxcKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxcbi1uXFwpLCBjKFxcTi1OXFwpKVxuXG5jb2xvckxpc3QgPC0gY29sb3JMaXN0U3RydWN0dXJlXG5sb29wTGlzdCA8LSBjKFxcTi1OXFwsIFxcUy1OXFwsIFxcUy1TXFwpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIERNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0RNU09cXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9ETVNPXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRUQUcsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIEE0ODUsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1XFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZGlmZl9kVEFHX0RNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfQTQ4NV9ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9TdHJ1Y3R1cmVcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXGFsbFxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpKVxuaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9cXCwgXFxzLXNcXCksIGMoXFxTLVNcXCkpXG5pdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX1xcLCBcXHMtblxcKSwgYyhcXFMtTlxcKSlcbml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfXFwsIFxcbi1uXFwpLCBjKFxcTi1OXFwpKVxuXG5jb2xvckxpc3QgPC0gY29sb3JMaXN0U3RydWN0dXJlXG5sb29wTGlzdCA8LSBjKFxcTi1OXFwsIFxcUy1OXFwsIFxcUy1TXFwpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIERNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0RNU09cXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9ETVNPXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRUQUcsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIEE0ODUsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSlcbmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1XFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdClcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZGlmZl9kVEFHX0RNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfQTQ4NV9ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NVxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
name <- \chromo_cons_annoStructure\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
iterate_loop_functions(data, figDir, paste0(name, \_\, \all\), unique(data$Anno2))
iterate_loop_functions(data, figDir, paste0(name, \_\, \s-s\), c(\S-S\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \s-n\), c(\S-N\))
iterate_loop_functions(data, figDir, paste0(name, \_\, \n-n\), c(\N-N\))

colorList <- colorListStructure
loopList <- c(\N-N\, \S-N\, \S-S\)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_DMSO\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_DMSO\), 
                                      loopList, colorList)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, dTAG, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                      loopList, colorList)
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, A485, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                     loopList, colorList, se = TRUE)
create_score_barplot_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                      loopList, colorList)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_dTAG\), 
                                     loopList, colorList, se = TRUE)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, diff_A485_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment(temp, figDir, paste0(name, \_A485\), 
                                     loopList, colorList, se = TRUE)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### One feature annotation - enhancer

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaR0YwWVNBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTl6WTI5eVpTNTBjM1pjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsY3lBOUlHVnVaREVnTFNCemRHRnlkREVwWEc1Y2JuQXhJRHd0SUdkbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlHUnBjM1JoYm1ObExDQm1hV3hzSUQwZ1ptRmpkRzl5S0hKbGN5a3BLU0FyWEc0Z0lHZGxiMjFmYUdsemRHOW5jbUZ0S0dKcGJuZHBaSFJvSUQwZ05UQXdNREFzSUdGc2NHaGhJRDBnTVNrZ0sxeHVJQ0JzWVdKektIUnBkR3hsSUQwZ1hDSkVhWE4wY21saWRYUnBiMjRnYjJZZ1JHbHpkR0Z1WTJVZ1lua2dVbVZ6YjJ4MWRHbHZibHdpTEZ4dUlDQWdJQ0FnSUhnZ1BTQmNJa1JwYzNSaGJtTmxYQ0lzWEc0Z0lDQWdJQ0FnZVNBOUlGd2lRMjkxYm5SelhDSXBJQ3NnWEc0Z0lHWmhZMlYwWDNkeVlYQW9maUJ5WlhNc0lHNWpiMndnUFNBeExDQnpZMkZzWlhNZ1BTQmNJbVp5WldWY0lpa2dLeUJjYmlBZ2MyTmhiR1ZmZUY5amIyNTBhVzUxYjNWektHeGhZbVZzY3lBOUlHeGhZbVZzWDJ0aVgyMWlMQ0JzYVcxcGRITWdQU0JqS0RBc0lEVmxOaWtwSUNzZ1hHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJYRzRnSUhSb1pXMWxLR3hsWjJWdVpDNXdiM05wZEdsdmJpQTlJRndpYm05dVpWd2lMRnh1SUNBZ0lDQWdJQ0J3Ykc5MExuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTRLU2tnSUNNZ1VtVnRiM1psY3lCMGFHVWdiR1ZuWlc1a1hHNWNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tGd2lZMjl1YzJWdWMzVnpYMlJwYzNSZmNHVnlYM0psY3k1d2JtZGNJaWtwTENCY2JpQWdJQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUnpJRDBnWENKcGJsd2lMQ0IzYVdSMGFDQTlJRE1zSUdobGFXZG9kQ0E5SURZcFhHNXdjbWx1ZENod01TbGNibVJsZGk1dlptWW9LVnh1WEc1d01pQThMU0JuWjNCc2IzUW9aR0YwWVN3Z1lXVnpLSGdnUFNCa2FYTjBZVzVqWlN3Z1ptbHNiQ0E5SUdaaFkzUnZjaWh5WlhNcEtTa2dLMXh1SUNCblpXOXRYMmhwYzNSdlozSmhiU2hpYVc1M2FXUjBhQ0E5SURVd01EQXdMQ0JoYkhCb1lTQTlJREVwSUN0Y2JpQWdiR0ZpY3loMGFYUnNaU0E5SUZ3aVJHbHpkSEpwWW5WMGFXOXVJRzltSUVScGMzUmhibU5sSUdKNUlGSmxjMjlzZFhScGIyNWNJaXhjYmlBZ0lDQWdJQ0I0SUQwZ1hDSkVhWE4wWVc1alpWd2lMRnh1SUNBZ0lDQWdJSGtnUFNCY0lrTnZkVzUwYzF3aUtTQXJJRnh1SUNCbVlXTmxkRjkzY21Gd0tINGdjbVZ6TENCdVkyOXNJRDBnTVN3Z2MyTmhiR1Z6SUQwZ1hDSm1jbVZsWENJcElDc2dYRzRnSUhOallXeGxYM2hmWTI5dWRHbHVkVzkxY3loc1lXSmxiSE1nUFNCc1lXSmxiRjlyWWw5dFlpd2diR2x0YVhSeklEMGdZeWd3TENBeVpUWXBLU0FySUZ4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJQ0IwYUdWdFpTaHNaV2RsYm1RdWNHOXphWFJwYjI0Z1BTQmNJbTV2Ym1WY0lpeGNiaUFnSUNBZ0lDQWdjR3h2ZEM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ09Da3BJQ0FqSUZKbGJXOTJaWE1nZEdobElHeGxaMlZ1WkZ4dVhHNWNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tGd2lZMjl1YzJWdWMzVnpYMlJwYzNSZmNHVnlYM0psYzE4eWJXSXVjRzVuWENJcEtTd2dYRzRnSUNBZ2NtVnpJRDBnTmpBd0xDQjFibWwwY3lBOUlGd2lhVzVjSWl3Z2QybGtkR2dnUFNBekxDQm9aV2xuYUhRZ1BTQTJLVnh1Y0hKcGJuUW9jRElwWEc1a1pYWXViMlptS0NsY2JseHVYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICByZXMgPSBlbmQxIC0gc3RhcnQxKVxuXG5wMSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBkaXN0YW5jZSwgZmlsbCA9IGZhY3RvcihyZXMpKSkgK1xuICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUwMDAwLCBhbHBoYSA9IDEpICtcbiAgbGFicyh0aXRsZSA9IFxcRGlzdHJpYnV0aW9uIG9mIERpc3RhbmNlIGJ5IFJlc29sdXRpb25cXCxcbiAgICAgICB4ID0gXFxEaXN0YW5jZVxcLFxuICAgICAgIHkgPSBcXENvdW50c1xcKSArIFxuICBmYWNldF93cmFwKH4gcmVzLCBuY29sID0gMSwgc2NhbGVzID0gXFxmcmVlXFwpICsgXG4gIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYiwgbGltaXRzID0gYygwLCA1ZTYpKSArIFxuICB0aGVtZV9jbGFzc2ljKCkgK1xuICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCxcbiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpICAjIFJlbW92ZXMgdGhlIGxlZ2VuZFxuXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChcXGNvbnNlbnN1c19kaXN0X3Blcl9yZXMucG5nXFwpKSwgXG4gICAgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAzLCBoZWlnaHQgPSA2KVxucHJpbnQocDEpXG5kZXYub2ZmKClcblxucDIgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZGlzdGFuY2UsIGZpbGwgPSBmYWN0b3IocmVzKSkpICtcbiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDAwMCwgYWxwaGEgPSAxKSArXG4gIGxhYnModGl0bGUgPSBcXERpc3RyaWJ1dGlvbiBvZiBEaXN0YW5jZSBieSBSZXNvbHV0aW9uXFwsXG4gICAgICAgeCA9IFxcRGlzdGFuY2VcXCxcbiAgICAgICB5ID0gXFxDb3VudHNcXCkgKyBcbiAgZmFjZXRfd3JhcCh+IHJlcywgbmNvbCA9IDEsIHNjYWxlcyA9IFxcZnJlZVxcKSArIFxuICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIsIGxpbWl0cyA9IGMoMCwgMmU2KSkgKyBcbiAgdGhlbWVfY2xhc3NpYygpICtcbiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKSAgIyBSZW1vdmVzIHRoZSBsZWdlbmRcblxuXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChcXGNvbnNlbnN1c19kaXN0X3Blcl9yZXNfMm1iLnBuZ1xcKSksIFxuICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMywgaGVpZ2h0ID0gNilcbnByaW50KHAyKVxuZGV2Lm9mZigpXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
data <- fread(here(consensusDir, \chromo_cons_score.tsv\)) %>%
  dplyr::mutate(distance = start2 - start1,
                res = end1 - start1)

p1 <- ggplot(data, aes(x = distance, fill = factor(res))) +
  geom_histogram(binwidth = 50000, alpha = 1) +
  labs(title = \Distribution of Distance by Resolution\,
       x = \Distance\,
       y = \Counts\) + 
  facet_wrap(~ res, ncol = 1, scales = \free\) + 
  scale_x_continuous(labels = label_kb_mb, limits = c(0, 5e6)) + 
  theme_classic() +
  theme(legend.position = \none\,
        plot.title = element_text(size = 8))  # Removes the legend

png(here(figDir, paste0(\consensus_dist_per_res.png\)), 
    res = 600, units = \in\, width = 3, height = 6)
print(p1)
dev.off()

p2 <- ggplot(data, aes(x = distance, fill = factor(res))) +
  geom_histogram(binwidth = 50000, alpha = 1) +
  labs(title = \Distribution of Distance by Resolution\,
       x = \Distance\,
       y = \Counts\) + 
  facet_wrap(~ res, ncol = 1, scales = \free\) + 
  scale_x_continuous(labels = label_kb_mb, limits = c(0, 2e6)) + 
  theme_classic() +
  theme(legend.position = \none\,
        plot.title = element_text(size = 8))  # Removes the legend


png(here(figDir, paste0(\consensus_dist_per_res_2mb.png\)), 
    res = 600, units = \in\, width = 3, height = 6)
print(p2)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVpHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOXpZMjl5WlM1MGMzWmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBjM1JoYm1ObElEMGdjM1JoY25ReUlDMGdjM1JoY25ReExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjeUE5SUdWdVpERWdMU0J6ZEdGeWRERXBYRzVjYm5BeElEd3RJR2RuY0d4dmRDaGtZWFJoTENCaFpYTW9lQ0E5SUdScGMzUmhibU5sTENCbWFXeHNJRDBnWm1GamRHOXlLSEpsY3lrcEtTQXJYRzRnSUdkbGIyMWZhR2x6ZEc5bmNtRnRLR0pwYm5kcFpIUm9JRDBnTlRBd01EQXNJR0ZzY0doaElEMGdNU2tnSzF4dUlDQnNZV0p6S0hScGRHeGxJRDBnWEZ4RWFYTjBjbWxpZFhScGIyNGdiMllnUkdsemRHRnVZMlVnWW5rZ1VtVnpiMngxZEdsdmJseGNMRnh1SUNBZ0lDQWdJSGdnUFNCY1hFUnBjM1JoYm1ObFhGd3NYRzRnSUNBZ0lDQWdlU0E5SUZ4Y1EyOTFiblJ6WEZ3cElDc2dYRzRnSUdaaFkyVjBYM2R5WVhBb2ZpQnlaWE1zSUc1amIyd2dQU0F4TENCelkyRnNaWE1nUFNCY1hHWnlaV1ZjWENrZ0t5QmNiaUFnYzJOaGJHVmZlRjlqYjI1MGFXNTFiM1Z6S0d4aFltVnNjeUE5SUd4aFltVnNYMnRpWDIxaUxDQnNhVzFwZEhNZ1BTQmpLREFzSURWbE5pa3BJQ3NnWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJSFJvWlcxbEtHeGxaMlZ1WkM1d2IzTnBkR2x2YmlBOUlGeGNibTl1WlZ4Y0xGeHVJQ0FnSUNBZ0lDQndiRzkwTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBNEtTa2dJQ01nVW1WdGIzWmxjeUIwYUdVZ2JHVm5aVzVrWEc1Y2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0Z4Y1kyOXVjMlZ1YzNWelgyUnBjM1JmY0dWeVgzSmxjeTV3Ym1kY1hDa3BMQ0JjYmlBZ0lDQnlaWE1nUFNBMk1EQXNJSFZ1YVhSeklEMGdYRnhwYmx4Y0xDQjNhV1IwYUNBOUlETXNJR2hsYVdkb2RDQTlJRFlwWEc1d2NtbHVkQ2h3TVNsY2JtUmxkaTV2Wm1Zb0tWeHVYRzV3TWlBOExTQm5aM0JzYjNRb1pHRjBZU3dnWVdWektIZ2dQU0JrYVhOMFlXNWpaU3dnWm1sc2JDQTlJR1poWTNSdmNpaHlaWE1wS1NrZ0sxeHVJQ0JuWlc5dFgyaHBjM1J2WjNKaGJTaGlhVzUzYVdSMGFDQTlJRFV3TURBd0xDQmhiSEJvWVNBOUlERXBJQ3RjYmlBZ2JHRmljeWgwYVhSc1pTQTlJRnhjUkdsemRISnBZblYwYVc5dUlHOW1JRVJwYzNSaGJtTmxJR0o1SUZKbGMyOXNkWFJwYjI1Y1hDeGNiaUFnSUNBZ0lDQjRJRDBnWEZ4RWFYTjBZVzVqWlZ4Y0xGeHVJQ0FnSUNBZ0lIa2dQU0JjWEVOdmRXNTBjMXhjS1NBcklGeHVJQ0JtWVdObGRGOTNjbUZ3S0g0Z2NtVnpMQ0J1WTI5c0lEMGdNU3dnYzJOaGJHVnpJRDBnWEZ4bWNtVmxYRndwSUNzZ1hHNGdJSE5qWVd4bFgzaGZZMjl1ZEdsdWRXOTFjeWhzWVdKbGJITWdQU0JzWVdKbGJGOXJZbDl0WWl3Z2JHbHRhWFJ6SUQwZ1l5Z3dMQ0F5WlRZcEtTQXJJRnh1SUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQjBhR1Z0WlNoc1pXZGxibVF1Y0c5emFYUnBiMjRnUFNCY1hHNXZibVZjWEN4Y2JpQWdJQ0FnSUNBZ2NHeHZkQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnT0NrcElDQWpJRkpsYlc5MlpYTWdkR2hsSUd4bFoyVnVaRnh1WEc1Y2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0Z4Y1kyOXVjMlZ1YzNWelgyUnBjM1JmY0dWeVgzSmxjMTh5YldJdWNHNW5YRndwS1N3Z1hHNGdJQ0FnY21WeklEMGdOakF3TENCMWJtbDBjeUE5SUZ4Y2FXNWNYQ3dnZDJsa2RHZ2dQU0F6TENCb1pXbG5hSFFnUFNBMktWeHVjSEpwYm5Rb2NESXBYRzVrWlhZdWIyWm1LQ2xjYmx4dVhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICByZXMgPSBlbmQxIC0gc3RhcnQxKVxuXG5wMSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBkaXN0YW5jZSwgZmlsbCA9IGZhY3RvcihyZXMpKSkgK1xuICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUwMDAwLCBhbHBoYSA9IDEpICtcbiAgbGFicyh0aXRsZSA9IFxcRGlzdHJpYnV0aW9uIG9mIERpc3RhbmNlIGJ5IFJlc29sdXRpb25cXCxcbiAgICAgICB4ID0gXFxEaXN0YW5jZVxcLFxuICAgICAgIHkgPSBcXENvdW50c1xcKSArIFxuICBmYWNldF93cmFwKH4gcmVzLCBuY29sID0gMSwgc2NhbGVzID0gXFxmcmVlXFwpICsgXG4gIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYiwgbGltaXRzID0gYygwLCA1ZTYpKSArIFxuICB0aGVtZV9jbGFzc2ljKCkgK1xuICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCxcbiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpICAjIFJlbW92ZXMgdGhlIGxlZ2VuZFxuXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChcXGNvbnNlbnN1c19kaXN0X3Blcl9yZXMucG5nXFwpKSwgXG4gICAgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAzLCBoZWlnaHQgPSA2KVxucHJpbnQocDEpXG5kZXYub2ZmKClcblxucDIgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZGlzdGFuY2UsIGZpbGwgPSBmYWN0b3IocmVzKSkpICtcbiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDAwMCwgYWxwaGEgPSAxKSArXG4gIGxhYnModGl0bGUgPSBcXERpc3RyaWJ1dGlvbiBvZiBEaXN0YW5jZSBieSBSZXNvbHV0aW9uXFwsXG4gICAgICAgeCA9IFxcRGlzdGFuY2VcXCxcbiAgICAgICB5ID0gXFxDb3VudHNcXCkgKyBcbiAgZmFjZXRfd3JhcCh+IHJlcywgbmNvbCA9IDEsIHNjYWxlcyA9IFxcZnJlZVxcKSArIFxuICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIsIGxpbWl0cyA9IGMoMCwgMmU2KSkgKyBcbiAgdGhlbWVfY2xhc3NpYygpICtcbiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKSAgIyBSZW1vdmVzIHRoZSBsZWdlbmRcblxuXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChcXGNvbnNlbnN1c19kaXN0X3Blcl9yZXNfMm1iLnBuZ1xcKSksIFxuICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMywgaGVpZ2h0ID0gNilcbnByaW50KHAyKVxuZGV2Lm9mZigpXG5cblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZS50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgIHJlcyA9IGVuZDEgLSBzdGFydDEpXG5cbnAxIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGRpc3RhbmNlLCBmaWxsID0gZmFjdG9yKHJlcykpKSArXG4gIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwMDAsIGFscGhhID0gMSkgK1xuICBsYWJzKHRpdGxlID0gXFxEaXN0cmlidXRpb24gb2YgRGlzdGFuY2UgYnkgUmVzb2x1dGlvblxcLFxuICAgICAgIHggPSBcXERpc3RhbmNlXFwsXG4gICAgICAgeSA9IFxcQ291bnRzXFwpICsgXG4gIGZhY2V0X3dyYXAofiByZXMsIG5jb2wgPSAxLCBzY2FsZXMgPSBcXGZyZWVcXCkgKyBcbiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iLCBsaW1pdHMgPSBjKDAsIDVlNikpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArXG4gIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcLFxuICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkgICMgUmVtb3ZlcyB0aGUgbGVnZW5kXG5cbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKFxcY29uc2Vuc3VzX2Rpc3RfcGVyX3Jlcy5wbmdcXCkpLCBcbiAgICByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDMsIGhlaWdodCA9IDYpXG5wcmludChwMSlcbmRldi5vZmYoKVxuXG5wMiA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBkaXN0YW5jZSwgZmlsbCA9IGZhY3RvcihyZXMpKSkgK1xuICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUwMDAwLCBhbHBoYSA9IDEpICtcbiAgbGFicyh0aXRsZSA9IFxcRGlzdHJpYnV0aW9uIG9mIERpc3RhbmNlIGJ5IFJlc29sdXRpb25cXCxcbiAgICAgICB4ID0gXFxEaXN0YW5jZVxcLFxuICAgICAgIHkgPSBcXENvdW50c1xcKSArIFxuICBmYWNldF93cmFwKH4gcmVzLCBuY29sID0gMSwgc2NhbGVzID0gXFxmcmVlXFwpICsgXG4gIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYiwgbGltaXRzID0gYygwLCAyZTYpKSArIFxuICB0aGVtZV9jbGFzc2ljKCkgK1xuICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCxcbiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpICAjIFJlbW92ZXMgdGhlIGxlZ2VuZFxuXG5cbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKFxcY29uc2Vuc3VzX2Rpc3RfcGVyX3Jlc18ybWIucG5nXFwpKSwgXG4gICAgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAzLCBoZWlnaHQgPSA2KVxucHJpbnQocDIpXG5kZXYub2ZmKClcblxuXG5gYGBcbmBgYCJ9 -->

```r
```r
data <- fread(here(consensusDir, \chromo_cons_score.tsv\)) %>%
  dplyr::mutate(distance = start2 - start1,
                res = end1 - start1)

p1 <- ggplot(data, aes(x = distance, fill = factor(res))) +
  geom_histogram(binwidth = 50000, alpha = 1) +
  labs(title = \Distribution of Distance by Resolution\,
       x = \Distance\,
       y = \Counts\) + 
  facet_wrap(~ res, ncol = 1, scales = \free\) + 
  scale_x_continuous(labels = label_kb_mb, limits = c(0, 5e6)) + 
  theme_classic() +
  theme(legend.position = \none\,
        plot.title = element_text(size = 8))  # Removes the legend

png(here(figDir, paste0(\consensus_dist_per_res.png\)), 
    res = 600, units = \in\, width = 3, height = 6)
print(p1)
dev.off()

p2 <- ggplot(data, aes(x = distance, fill = factor(res))) +
  geom_histogram(binwidth = 50000, alpha = 1) +
  labs(title = \Distribution of Distance by Resolution\,
       x = \Distance\,
       y = \Counts\) + 
  facet_wrap(~ res, ncol = 1, scales = \free\) + 
  scale_x_continuous(labels = label_kb_mb, limits = c(0, 2e6)) + 
  theme_classic() +
  theme(legend.position = \none\,
        plot.title = element_text(size = 8))  # Removes the legend


png(here(figDir, paste0(\consensus_dist_per_res_2mb.png\)), 
    res = 600, units = \in\, width = 3, height = 6)
print(p2)
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### One feature annotation - structure


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSUVScGMzUmhibU5sSUhaeklITmpiM0psWEc0Z0lGeHVJQ0IwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1pHbHpkR0Z1WTJVZ1BTQnpkR0Z5ZERJZ0xTQnpkR0Z5ZERFcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBjM1JoYm1ObExDQkVUVk5QTENCa1ZFRkhMQ0JCTkRnMUtWeHVJQ0JjYmlBZ1lYWm5YM05qYjNKbGN5QThMU0IwWlcxd0lDVStKVnh1SUNBZ0lHZHliM1Z3WDJKNUtHUnBjM1JoYm1ObEtTQWxQaVZjYmlBZ0lDQnpkVzF0WVhKcGMyVW9ZV055YjNOektITjBZWEowYzE5M2FYUm9LRndpUkUxVFQxd2lLVHB6ZEdGeWRITmZkMmwwYUNoY0lrRTBPRFZjSWlrc0lHMWxZVzRzSUc1aExuSnRJRDBnVkZKVlJTa3BYRzRnSUZ4dUlDQmhkbWRmYzJOdmNtVnpYMnh2Ym1jZ1BDMGdZWFpuWDNOamIzSmxjeUFsUGlWY2JpQWdJQ0J3YVhadmRGOXNiMjVuWlhJb1kyOXNjeUE5SUVSTlUwODZRVFE0TlN3Z2JtRnRaWE5mZEc4Z1BTQmNJbU52Ym1ScGRHbHZibHdpTENCMllXeDFaWE5mZEc4Z1BTQmNJbUYyWjE5elkyOXlaVndpS1Z4dUlDQmhkbWRmYzJOdmNtVnpYMnh2Ym1ja1kyOXVaR2wwYVc5dUlEd3RJR1poWTNSdmNpaGhkbWRmYzJOdmNtVnpYMnh2Ym1ja1kyOXVaR2wwYVc5dUxDQnNaWFpsYkhNZ1BTQmpLRndpUkUxVFQxd2lMQ0JjSW1SVVFVZGNJaXdnWENKQk5EZzFYQ0lwS1Z4dUlDQWpJRU55WldGMFpTQjBhR1VnY0d4dmRGeHVJQ0J3TkNBOExTQm5aM0JzYjNRb1lYWm5YM05qYjNKbGMxOXNiMjVuTENCaFpYTW9lQ0E5SUdScGMzUmhibU5sTENCNUlEMGdZWFpuWDNOamIzSmxMQ0JqYjJ4dmNpQTlJR052Ym1ScGRHbHZiaXdnWm1sc2JDQTlJR052Ym1ScGRHbHZiaWtwSUN0Y2JpQWdJQ0JuWlc5dFgzTnRiMjkwYUNoemFHOTNMbXhsWjJWdVpDQTlJRlJTVlVVcElDc2dlV3hwYlNnd0xDQXdMalVwSUN0Y2JpQWdJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUFnYzJOaGJHVmZlRjlqYjI1MGFXNTFiM1Z6S0d4aFltVnNjeUE5SUd4aFltVnNYMnRpWDIxaUtTQXJYRzRnSUNBZ2MyTmhiR1ZmWTI5c2IzSmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YQ0pFVFZOUFhDSWdQU0JjSW1keVpYbGNJaXdnWENKa1ZFRkhYQ0lnUFNCY0luQnBibXRjSWl3Z1hDSkJORGcxWENJZ1BTQmNJbk5yZVdKc2RXVmNJaWtwSUN0Y2JpQWdJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aVJFMVRUMXdpSUQwZ1hDSm5jbVY1T0RCY0lpd2dYQ0prVkVGSFhDSWdQU0JjSW5CcGJtdGNJaXdnWENKQk5EZzFYQ0lnUFNCY0luTnJlV0pzZFdWY0lpa3BJQ3RjYmlBZ0lDQnNZV0p6S0hScGRHeGxJRDBnY0dGemRHVXdLRndpUkdsemRHRnVZMlVnZG5NdUlFRjJaWEpoWjJVZ1UyTnZjbVVzSUZ3aUxDQnViM1JsS1N4Y2JpQWdJQ0FnSUNBZ0lIZ2dQU0JjSWtScGMzUmhibU5sWENJc1hHNGdJQ0FnSUNBZ0lDQjVJRDBnWENKQmRtVnlZV2RsSUZOamIzSmxYQ0lwSUN0Y2JpQWdJQ0IwYUdWdFpTaHdiRzkwTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBeE1pa3BYRzRnSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLRndpWTI5dWMyVnVjM1Z6WDJScGMzUmZkbk5mWVhablUyTnZjbVZmWVd4c1VtVnpYM0IxTVRBd2NIb3hNREJmWENJc0lHNXZkR1VzSUZ3aUxuQnVaMXdpS1Nrc0lGeHVJQ0FnSUNBZ2NtVnpJRDBnTmpBd0xDQjFibWwwY3lBOUlGd2lhVzVjSWl3Z2QybGtkR2dnUFNBMExDQm9aV2xuYUhRZ1BTQXpLVnh1SUNCd2NtbHVkQ2h3TkNsY2JpQWdaR1YyTG05bVppZ3BYRzVjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiMjIyBEaXN0YW5jZSB2cyBzY29yZVxuICBcbiAgdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgRE1TTywgZFRBRywgQTQ4NSlcbiAgXG4gIGF2Z19zY29yZXMgPC0gdGVtcCAlPiVcbiAgICBncm91cF9ieShkaXN0YW5jZSkgJT4lXG4gICAgc3VtbWFyaXNlKGFjcm9zcyhzdGFydHNfd2l0aChcXERNU09cXCk6c3RhcnRzX3dpdGgoXFxBNDg1XFwpLCBtZWFuLCBuYS5ybSA9IFRSVUUpKVxuICBcbiAgYXZnX3Njb3Jlc19sb25nIDwtIGF2Z19zY29yZXMgJT4lXG4gICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBETVNPOkE0ODUsIG5hbWVzX3RvID0gXFxjb25kaXRpb25cXCwgdmFsdWVzX3RvID0gXFxhdmdfc2NvcmVcXClcbiAgYXZnX3Njb3Jlc19sb25nJGNvbmRpdGlvbiA8LSBmYWN0b3IoYXZnX3Njb3Jlc19sb25nJGNvbmRpdGlvbiwgbGV2ZWxzID0gYyhcXERNU09cXCwgXFxkVEFHXFwsIFxcQTQ4NVxcKSlcbiAgIyBDcmVhdGUgdGhlIHBsb3RcbiAgcDQgPC0gZ2dwbG90KGF2Z19zY29yZXNfbG9uZywgYWVzKHggPSBkaXN0YW5jZSwgeSA9IGF2Z19zY29yZSwgY29sb3IgPSBjb25kaXRpb24sIGZpbGwgPSBjb25kaXRpb24pKSArXG4gICAgZ2VvbV9zbW9vdGgoc2hvdy5sZWdlbmQgPSBUUlVFKSArIHlsaW0oMCwgMC41KSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcRE1TT1xcID0gXFxncmV5XFwsIFxcZFRBR1xcID0gXFxwaW5rXFwsIFxcQTQ4NVxcID0gXFxza3libHVlXFwpKSArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXERNU09cXCA9IFxcZ3JleTgwXFwsIFxcZFRBR1xcID0gXFxwaW5rXFwsIFxcQTQ4NVxcID0gXFxza3libHVlXFwpKSArXG4gICAgbGFicyh0aXRsZSA9IHBhc3RlMChcXERpc3RhbmNlIHZzLiBBdmVyYWdlIFNjb3JlXG4ifQ== -->
### Distance vs score
  
  temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, DMSO, dTAG, A485)
  
  avg_scores <- temp %>%
    group_by(distance) %>%
    summarise(across(starts_with(\DMSO\):starts_with(\A485\), mean, na.rm = TRUE))
  
  avg_scores_long <- avg_scores %>%
    pivot_longer(cols = DMSO:A485, names_to = \condition\, values_to = \avg_score\)
  avg_scores_long$condition <- factor(avg_scores_long$condition, levels = c(\DMSO\, \dTAG\, \A485\))
  # Create the plot
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = condition, fill = condition)) +
    geom_smooth(show.legend = TRUE) + ylim(0, 0.5) +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = c(\DMSO\ = \grey\, \dTAG\ = \pink\, \A485\ = \skyblue\)) +
    scale_fill_manual(values = c(\DMSO\ = \grey80\, \dTAG\ = \pink\, \A485\ = \skyblue\)) +
    labs(title = paste0(\Distance vs. Average Score
```r
### Distance vs score
  
  temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, DMSO, dTAG, A485)
  
  avg_scores <- temp %>%
    group_by(distance) %>%
    summarise(across(starts_with(\DMSO\):starts_with(\A485\), mean, na.rm = TRUE))
  
  avg_scores_long <- avg_scores %>%
    pivot_longer(cols = DMSO:A485, names_to = \condition\, values_to = \avg_score\)
  avg_scores_long$condition <- factor(avg_scores_long$condition, levels = c(\DMSO\, \dTAG\, \A485\))
  # Create the plot
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = condition, fill = condition)) +
    geom_smooth(show.legend = TRUE) + ylim(0, 0.5) +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = c(\DMSO\ = \grey\, \dTAG\ = \pink\, \A485\ = \skyblue\)) +
    scale_fill_manual(values = c(\DMSO\ = \grey80\, \dTAG\ = \pink\, \A485\ = \skyblue\)) +
    labs(title = paste0(\Distance vs. Average Score

[2.7] Distance vs loop # and score


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBBbm5vdGF0aW5nIGdlbmVzIGJhc2VkIG9uIHByb21vdGVyIGFuY2hvclxubmFtZSA8LSBcImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcIlxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFwiLnRzdlwiKSkpXG5gYGAifQ== -->

```r
# Annotating genes based on promoter anchor
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
```

<!-- rnb-source-end -->
```r
# Annotating genes based on promoter anchor
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVabXhoYm10VGFYcGxJRHd0SURJMU1EQmNibWRsYm1VdVZGTlRMblJpSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbTF0TVRCZlIxSkRiVE00TG5BMlgyZGxibVZmYzI5eWRHVmtMbUpsWkZ3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvVkZOVElEMGdhV1psYkhObEtGWTBJRDA5SUZ3aUsxd2lMQ0JXTWl3Z1ZqTXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRlJUVTNOMFlYSjBJRDBnVkZOVElDMGdabXhoYm10VGFYcGxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRlJUVTJWdVpDQTlJRlJUVXlBcklHWnNZVzVyVTJsNlpTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvVmpFc0lGUlRVM04wWVhKMExDQlVVMU5sYm1Rc0lGWTBMQ0JXTlN3Z1ZqWXBYRzVqYjJ4dVlXMWxjeWhuWlc1bExsUlRVeTUwWWlrZ1BDMGdZeWhjSW1Ob2Nsd2lMQ0JjSW5OMFlYSjBYQ0lzSUZ3aVpXNWtYQ0lzSUZ3aWMzUnlZVzVrWENJc0lGd2laMlZ1WlZ3aUxDQmNJbVZ1YzJWdFlteGNJaWxjYmx4dVpuZHlhWFJsS0dkbGJtVXVWRk5UTG5SaUxDQm9aWEpsS0hKbFprUnBjaXdnWENKdGJURXdYMGRTUTIwek9DNXdObDlVVTFNeUxqVnJZaTVpWldSY0lpa3NJSE5sY0NBOUlGd2lYRngwWENJc0lHTnZiQzV1WVcxbGN5QTlJRVpCVEZORkxDQnliM2N1Ym1GdFpYTWdQU0JHUVV4VFJTbGNibHh1Wm1sdVpFOTJaWEpzWVhCSFpXNWxJRHd0SUdaMWJtTjBhVzl1S0dkbGJtVXVWRk5UTG5SaUxDQmphSEp2YlRFc0lITjBZWEowTVN3Z1pXNWtNU2w3WEc0Z0lIUmxiWEFnUEMwZ1oyVnVaUzVVVTFNdWRHSWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9ZMmh5SUQwOUlHTm9jbTl0TVNrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T21acGJIUmxjaWdvYzNSaGNuUWdQRDBnWlc1a01Ta2dKaUFvWlc1a0lENDlJSE4wWVhKME1Ta3BYRzRnSUhKbGRIVnliaWgwWlcxd0pHZGxibVVwWEc1OVhHNW1hVzVrVDNabGNteGhjRVZ1YzJWdFltd2dQQzBnWm5WdVkzUnBiMjRvWjJWdVpTNVVVMU11ZEdJc0lHTm9jbTl0TVN3Z2MzUmhjblF4TENCbGJtUXhLWHRjYmlBZ2RHVnRjQ0E4TFNCblpXNWxMbFJUVXk1MFlpQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaGphSElnUFQwZ1kyaHliMjB4S1NBbFBpVmNiaUFnSUNCa2NHeDVjam82Wm1sc2RHVnlLQ2h6ZEdGeWRDQThQU0JsYm1ReEtTQW1JQ2hsYm1RZ1BqMGdjM1JoY25ReEtTbGNiaUFnY21WMGRYSnVLSFJsYlhBa1pXNXpaVzFpYkNsY2JuMWNibHh1ZEdWdGNDQThMU0JrWVhSaElDVStKU0J5YjNkM2FYTmxLQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1FURmZaMlZ1WlNBOUlHbG1aV3h6WlNoQk1TQTlQU0JjSWxCY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHBjM1FvWm1sdVpFOTJaWEpzWVhCSFpXNWxLR2RsYm1VdVZGTlRMblJpTENCamFISnZiVEVzSUhOMFlYSjBNU3dnWlc1a01Ta3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdUa0VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUVFeVgyZGxibVVnUFNCcFptVnNjMlVvUVRJZ1BUMGdYQ0pRWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FYTjBLR1pwYm1SUGRtVnliR0Z3UjJWdVpTaG5aVzVsTGxSVFV5NTBZaXdnWTJoeWIyMHlMQ0J6ZEdGeWRESXNJR1Z1WkRJcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lFNUJLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuWlc1bElEMGdiR2x6ZENoMWJtbHhkV1VvWXloQk1WOW5aVzVsTENCQk1sOW5aVzVsS1NrcEtWeHVYRzUwWlcxd1gzQmZiaUE4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRUZ1Ym04eUlDVnBiaVVnWXloY0lsQXRVRndpTENCY0lsQXRSVndpTENCY0lsQXRVMXdpTENCY0lsQXRXRndpS1NrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb0xXTW9YQ0pCTVY5blpXNWxYQ0lzSUZ3aVFUSmZaMlZ1WlZ3aUtTbGNibVozY21sMFpTaDBaVzF3WDNCZmJpd2dhR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOXdMVzVmWjJWdVpVeHBjM1F1ZEhOMlhDSXBLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNibHh1ZEdWdGNGOXdYM0JsSUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvUVc1dWJ6SWdKV2x1SlNCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJcEtTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDZ3RZeWhjSWtFeFgyZGxibVZjSWl3Z1hDSkJNbDluWlc1bFhDSXBLVnh1Wm5keWFYUmxLSFJsYlhCZmNGOXdaU3dnYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNJbDl3TFhCbFgyZGxibVZNYVhOMExuUnpkbHdpS1Nrc0lITmxjQ0E5SUZ3aVhGeDBYQ0lwWEc1Y2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ2NtOTNkMmx6WlNncElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRUV4WDJkbGJtVWdQU0JwWm1Wc2MyVW9RVEVnUFQwZ1hDSlFYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVhOMEtHWnBibVJQZG1WeWJHRndSVzV6WlcxaWJDaG5aVzVsTGxSVFV5NTBZaXdnWTJoeWIyMHhMQ0J6ZEdGeWRERXNJR1Z1WkRFcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lFNUJLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JCTWw5blpXNWxJRDBnYVdabGJITmxLRUV5SUQwOUlGd2lVRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsemRDaG1hVzVrVDNabGNteGhjRVZ1YzJWdFltd29aMlZ1WlM1VVUxTXVkR0lzSUdOb2NtOXRNaXdnYzNSaGNuUXlMQ0JsYm1ReUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQk9RU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjJWdVpTQTlJR3hwYzNRb2RXNXBjWFZsS0dNb1FURmZaMlZ1WlN3Z1FUSmZaMlZ1WlNrcEtTbGNibHh1ZEdWdGNGOXdYMjRnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhCYm01dk1pQWxhVzRsSUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVmhjSWlrcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtDMWpLRndpUVRGZloyVnVaVndpTENCY0lrRXlYMmRsYm1WY0lpa3BYRzVtZDNKcGRHVW9kR1Z0Y0Y5d1gyNHNJR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZjQzF1WDJWdWMyVnRZbXhNYVhOMExuUnpkbHdpS1Nrc0lITmxjQ0E5SUZ3aVhGeDBYQ0lwWEc1Y2JuUmxiWEJmY0Y5d1pTQThMU0IwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtFRnVibTh5SUNWcGJpVWdZeWhjSWxBdFVGd2lMQ0JjSWxBdFJWd2lLU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvTFdNb1hDSkJNVjluWlc1bFhDSXNJRndpUVRKZloyVnVaVndpS1NsY2JtWjNjbWwwWlNoMFpXMXdYM0JmY0dVc0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENKZmNDMXdaVjlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNJaWtwTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5mbGFua1NpemUgPC0gMjUwMFxuZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMyksXG4gICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsXG4gICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCwgVjQsIFY1LCBWNilcbmNvbG5hbWVzKGdlbmUuVFNTLnRiKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxzdHJhbmRcXCwgXFxnZW5lXFwsIFxcZW5zZW1ibFxcKVxuXG5md3JpdGUoZ2VuZS5UU1MudGIsIGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X1RTUzIuNWtiLmJlZFxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UsIHJvdy5uYW1lcyA9IEZBTFNFKVxuXG5maW5kT3ZlcmxhcEdlbmUgPC0gZnVuY3Rpb24oZ2VuZS5UU1MudGIsIGNocm9tMSwgc3RhcnQxLCBlbmQxKXtcbiAgdGVtcCA8LSBnZW5lLlRTUy50YiAlPiUgZHBseXI6OmZpbHRlcihjaHIgPT0gY2hyb20xKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKChzdGFydCA8PSBlbmQxKSAmIChlbmQgPj0gc3RhcnQxKSlcbiAgcmV0dXJuKHRlbXAkZ2VuZSlcbn1cbmZpbmRPdmVybGFwRW5zZW1ibCA8LSBmdW5jdGlvbihnZW5lLlRTUy50YiwgY2hyb20xLCBzdGFydDEsIGVuZDEpe1xuICB0ZW1wIDwtIGdlbmUuVFNTLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbTEpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoKHN0YXJ0IDw9IGVuZDEpICYgKGVuZCA+PSBzdGFydDEpKVxuICByZXR1cm4odGVtcCRlbnNlbWJsKVxufVxuXG50ZW1wIDwtIGRhdGEgJT4lIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShBMV9nZW5lID0gaWZlbHNlKEExID09IFxcUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChmaW5kT3ZlcmxhcEdlbmUoZ2VuZS5UU1MudGIsIGNocm9tMSwgc3RhcnQxLCBlbmQxKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSksXG4gICAgICAgICAgICAgICAgQTJfZ2VuZSA9IGlmZWxzZShBMiA9PSBcXFBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZmluZE92ZXJsYXBHZW5lKGdlbmUuVFNTLnRiLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMikpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLFxuICAgICAgICAgICAgICAgIGdlbmUgPSBsaXN0KHVuaXF1ZShjKEExX2dlbmUsIEEyX2dlbmUpKSkpXG5cbnRlbXBfcF9uIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSAlPiUgZHBseXI6OnNlbGVjdCgtYyhcXEExX2dlbmVcXCwgXFxBMl9nZW5lXFwpKVxuZndyaXRlKHRlbXBfcF9uLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9nZW5lTGlzdC50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxuXG50ZW1wX3BfcGUgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCkpICU+JSBkcGx5cjo6c2VsZWN0KC1jKFxcQTFfZ2VuZVxcLCBcXEEyX2dlbmVcXCkpXG5md3JpdGUodGVtcF9wX3BlLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3AtcGVfZ2VuZUxpc3QudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcblxudGVtcCA8LSBkYXRhICU+JSByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoQTFfZ2VuZSA9IGlmZWxzZShBMSA9PSBcXFBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZmluZE92ZXJsYXBFbnNlbWJsKGdlbmUuVFNTLnRiLCBjaHJvbTEsIHN0YXJ0MSwgZW5kMSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLFxuICAgICAgICAgICAgICAgIEEyX2dlbmUgPSBpZmVsc2UoQTIgPT0gXFxQXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwRW5zZW1ibChnZW5lLlRTUy50YiwgY2hyb20yLCBzdGFydDIsIGVuZDIpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSxcbiAgICAgICAgICAgICAgICBnZW5lID0gbGlzdCh1bmlxdWUoYyhBMV9nZW5lLCBBMl9nZW5lKSkpKVxuXG50ZW1wX3BfbiA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoLWMoXFxBMV9nZW5lXFwsIFxcQTJfZ2VuZVxcKSlcbmZ3cml0ZSh0ZW1wX3BfbiwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcblxudGVtcF9wX3BlIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwpKSAlPiUgZHBseXI6OnNlbGVjdCgtYyhcXEExX2dlbmVcXCwgXFxBMl9nZW5lXFwpKVxuZndyaXRlKHRlbXBfcF9wZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLXBlX2Vuc2VtYmxMaXN0LnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
flankSize <- 2500
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V4, V5, V6)
colnames(gene.TSS.tb) <- c(\chr\, \start\, \end\, \strand\, \gene\, \ensembl\)

fwrite(gene.TSS.tb, here(refDir, \mm10_GRCm38.p6_TSS2.5kb.bed\), sep = \\t\, col.names = FALSE, row.names = FALSE)

findOverlapGene <- function(gene.TSS.tb, chrom1, start1, end1){
  temp <- gene.TSS.tb %>% dplyr::filter(chr == chrom1) %>%
    dplyr::filter((start <= end1) & (end >= start1))
  return(temp$gene)
}
findOverlapEnsembl <- function(gene.TSS.tb, chrom1, start1, end1){
  temp <- gene.TSS.tb %>% dplyr::filter(chr == chrom1) %>%
    dplyr::filter((start <= end1) & (end >= start1))
  return(temp$ensembl)
}

temp <- data %>% rowwise() %>%
  dplyr::mutate(A1_gene = ifelse(A1 == \P\,
                                 list(findOverlapGene(gene.TSS.tb, chrom1, start1, end1)),
                                 NA),
                A2_gene = ifelse(A2 == \P\,
                                 list(findOverlapGene(gene.TSS.tb, chrom2, start2, end2)),
                                 NA),
                gene = list(unique(c(A1_gene, A2_gene))))

temp_p_n <- temp %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \P-S\, \P-X\)) %>% dplyr::select(-c(\A1_gene\, \A2_gene\))
fwrite(temp_p_n, here(consensusDir, paste0(name, \_p-n_geneList.tsv\)), sep = \\t\)

temp_p_pe <- temp %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\)) %>% dplyr::select(-c(\A1_gene\, \A2_gene\))
fwrite(temp_p_pe, here(consensusDir, paste0(name, \_p-pe_geneList.tsv\)), sep = \\t\)

temp <- data %>% rowwise() %>%
  dplyr::mutate(A1_gene = ifelse(A1 == \P\,
                                 list(findOverlapEnsembl(gene.TSS.tb, chrom1, start1, end1)),
                                 NA),
                A2_gene = ifelse(A2 == \P\,
                                 list(findOverlapEnsembl(gene.TSS.tb, chrom2, start2, end2)),
                                 NA),
                gene = list(unique(c(A1_gene, A2_gene))))

temp_p_n <- temp %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \P-S\, \P-X\)) %>% dplyr::select(-c(\A1_gene\, \A2_gene\))
fwrite(temp_p_n, here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)), sep = \\t\)

temp_p_pe <- temp %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\)) %>% dplyr::select(-c(\A1_gene\, \A2_gene\))
fwrite(temp_p_pe, here(consensusDir, paste0(name, \_p-pe_ensemblList.tsv\)), sep = \\t\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVpteGhibXRUYVhwbElEd3RJREkxTURCY2JtZGxibVV1VkZOVExuUmlJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHMXRNVEJmUjFKRGJUTTRMbkEyWDJkbGJtVmZjMjl5ZEdWa0xtSmxaRnhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9WRk5USUQwZ2FXWmxiSE5sS0ZZMElEMDlJRnhjSzF4Y0xDQldNaXdnVmpNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlRVM04wWVhKMElEMGdWRk5USUMwZ1pteGhibXRUYVhwbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlRVMlZ1WkNBOUlGUlRVeUFySUdac1lXNXJVMmw2WlNrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9WakVzSUZSVFUzTjBZWEowTENCVVUxTmxibVFzSUZZMExDQldOU3dnVmpZcFhHNWpiMnh1WVcxbGN5aG5aVzVsTGxSVFV5NTBZaWtnUEMwZ1l5aGNYR05vY2x4Y0xDQmNYSE4wWVhKMFhGd3NJRnhjWlc1a1hGd3NJRnhjYzNSeVlXNWtYRndzSUZ4Y1oyVnVaVnhjTENCY1hHVnVjMlZ0WW14Y1hDbGNibHh1Wm5keWFYUmxLR2RsYm1VdVZGTlRMblJpTENCb1pYSmxLSEpsWmtScGNpd2dYRnh0YlRFd1gwZFNRMjB6T0M1d05sOVVVMU15TGpWcllpNWlaV1JjWENrc0lITmxjQ0E5SUZ4Y1hGeDBYRndzSUdOdmJDNXVZVzFsY3lBOUlFWkJURk5GTENCeWIzY3VibUZ0WlhNZ1BTQkdRVXhUUlNsY2JseHVabWx1WkU5MlpYSnNZWEJIWlc1bElEd3RJR1oxYm1OMGFXOXVLR2RsYm1VdVZGTlRMblJpTENCamFISnZiVEVzSUhOMFlYSjBNU3dnWlc1a01TbDdYRzRnSUhSbGJYQWdQQzBnWjJWdVpTNVVVMU11ZEdJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1kyaHlJRDA5SUdOb2NtOXRNU2tnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbVpwYkhSbGNpZ29jM1JoY25RZ1BEMGdaVzVrTVNrZ0ppQW9aVzVrSUQ0OUlITjBZWEowTVNrcFhHNGdJSEpsZEhWeWJpaDBaVzF3SkdkbGJtVXBYRzU5WEc1bWFXNWtUM1psY214aGNFVnVjMlZ0WW13Z1BDMGdablZ1WTNScGIyNG9aMlZ1WlM1VVUxTXVkR0lzSUdOb2NtOXRNU3dnYzNSaGNuUXhMQ0JsYm1ReEtYdGNiaUFnZEdWdGNDQThMU0JuWlc1bExsUlRVeTUwWWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loamFISWdQVDBnWTJoeWIyMHhLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZabWxzZEdWeUtDaHpkR0Z5ZENBOFBTQmxibVF4S1NBbUlDaGxibVFnUGowZ2MzUmhjblF4S1NsY2JpQWdjbVYwZFhKdUtIUmxiWEFrWlc1elpXMWliQ2xjYm4xY2JseHVkR1Z0Y0NBOExTQmtZWFJoSUNVK0pTQnliM2QzYVhObEtDa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvUVRGZloyVnVaU0E5SUdsbVpXeHpaU2hCTVNBOVBTQmNYRkJjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGMzUW9abWx1WkU5MlpYSnNZWEJIWlc1bEtHZGxibVV1VkZOVExuUmlMQ0JqYUhKdmJURXNJSE4wWVhKME1Td2daVzVrTVNrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1RrRXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRUV5WDJkbGJtVWdQU0JwWm1Wc2MyVW9RVElnUFQwZ1hGeFFYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVhOMEtHWnBibVJQZG1WeWJHRndSMlZ1WlNoblpXNWxMbFJUVXk1MFlpd2dZMmh5YjIweUxDQnpkR0Z5ZERJc0lHVnVaRElwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUU1QktTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5aVzVsSUQwZ2JHbHpkQ2gxYm1seGRXVW9ZeWhCTVY5blpXNWxMQ0JCTWw5blpXNWxLU2twS1Z4dVhHNTBaVzF3WDNCZmJpQThMU0IwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtFRnVibTh5SUNWcGJpVWdZeWhjWEZBdFVGeGNMQ0JjWEZBdFJWeGNMQ0JjWEZBdFUxeGNMQ0JjWEZBdFdGeGNLU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvTFdNb1hGeEJNVjluWlc1bFhGd3NJRnhjUVRKZloyVnVaVnhjS1NsY2JtWjNjbWwwWlNoMFpXMXdYM0JmYml3Z2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5d0xXNWZaMlZ1WlV4cGMzUXVkSE4yWEZ3cEtTd2djMlZ3SUQwZ1hGeGNYSFJjWENsY2JseHVkR1Z0Y0Y5d1gzQmxJRHd0SUhSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9RVzV1YnpJZ0pXbHVKU0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndwS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENndFl5aGNYRUV4WDJkbGJtVmNYQ3dnWEZ4Qk1sOW5aVzVsWEZ3cEtWeHVabmR5YVhSbEtIUmxiWEJmY0Y5d1pTd2dhR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY1hGOXdMWEJsWDJkbGJtVk1hWE4wTG5SemRseGNLU2tzSUhObGNDQTlJRnhjWEZ4MFhGd3BYRzVjYm5SbGJYQWdQQzBnWkdGMFlTQWxQaVVnY205M2QybHpaU2dwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtFRXhYMmRsYm1VZ1BTQnBabVZzYzJVb1FURWdQVDBnWEZ4UVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNhWE4wS0dacGJtUlBkbVZ5YkdGd1JXNXpaVzFpYkNoblpXNWxMbFJUVXk1MFlpd2dZMmh5YjIweExDQnpkR0Z5ZERFc0lHVnVaREVwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUU1QktTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQkJNbDluWlc1bElEMGdhV1psYkhObEtFRXlJRDA5SUZ4Y1VGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x6ZENobWFXNWtUM1psY214aGNFVnVjMlZ0WW13b1oyVnVaUzVVVTFNdWRHSXNJR05vY205dE1pd2djM1JoY25ReUxDQmxibVF5S1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCT1FTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaMlZ1WlNBOUlHeHBjM1FvZFc1cGNYVmxLR01vUVRGZloyVnVaU3dnUVRKZloyVnVaU2twS1NsY2JseHVkR1Z0Y0Y5d1gyNGdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWaGNYQ2twSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0MxaktGeGNRVEZmWjJWdVpWeGNMQ0JjWEVFeVgyZGxibVZjWENrcFhHNW1kM0pwZEdVb2RHVnRjRjl3WDI0c0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZmNDMXVYMlZ1YzJWdFlteE1hWE4wTG5SemRseGNLU2tzSUhObGNDQTlJRnhjWEZ4MFhGd3BYRzVjYm5SbGJYQmZjRjl3WlNBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHlJQ1ZwYmlVZ1l5aGNYRkF0VUZ4Y0xDQmNYRkF0UlZ4Y0tTa2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9MV01vWEZ4Qk1WOW5aVzVsWEZ3c0lGeGNRVEpmWjJWdVpWeGNLU2xjYm1aM2NtbDBaU2gwWlcxd1gzQmZjR1VzSUdobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnhmY0Mxd1pWOWxibk5sYldKc1RHbHpkQzUwYzNaY1hDa3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5mbGFua1NpemUgPC0gMjUwMFxuZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMyksXG4gICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsXG4gICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCwgVjQsIFY1LCBWNilcbmNvbG5hbWVzKGdlbmUuVFNTLnRiKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxzdHJhbmRcXCwgXFxnZW5lXFwsIFxcZW5zZW1ibFxcKVxuXG5md3JpdGUoZ2VuZS5UU1MudGIsIGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X1RTUzIuNWtiLmJlZFxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UsIHJvdy5uYW1lcyA9IEZBTFNFKVxuXG5maW5kT3ZlcmxhcEdlbmUgPC0gZnVuY3Rpb24oZ2VuZS5UU1MudGIsIGNocm9tMSwgc3RhcnQxLCBlbmQxKXtcbiAgdGVtcCA8LSBnZW5lLlRTUy50YiAlPiUgZHBseXI6OmZpbHRlcihjaHIgPT0gY2hyb20xKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKChzdGFydCA8PSBlbmQxKSAmIChlbmQgPj0gc3RhcnQxKSlcbiAgcmV0dXJuKHRlbXAkZ2VuZSlcbn1cbmZpbmRPdmVybGFwRW5zZW1ibCA8LSBmdW5jdGlvbihnZW5lLlRTUy50YiwgY2hyb20xLCBzdGFydDEsIGVuZDEpe1xuICB0ZW1wIDwtIGdlbmUuVFNTLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbTEpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoKHN0YXJ0IDw9IGVuZDEpICYgKGVuZCA+PSBzdGFydDEpKVxuICByZXR1cm4odGVtcCRlbnNlbWJsKVxufVxuXG50ZW1wIDwtIGRhdGEgJT4lIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShBMV9nZW5lID0gaWZlbHNlKEExID09IFxcUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChmaW5kT3ZlcmxhcEdlbmUoZ2VuZS5UU1MudGIsIGNocm9tMSwgc3RhcnQxLCBlbmQxKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSksXG4gICAgICAgICAgICAgICAgQTJfZ2VuZSA9IGlmZWxzZShBMiA9PSBcXFBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZmluZE92ZXJsYXBHZW5lKGdlbmUuVFNTLnRiLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMikpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLFxuICAgICAgICAgICAgICAgIGdlbmUgPSBsaXN0KHVuaXF1ZShjKEExX2dlbmUsIEEyX2dlbmUpKSkpXG5cbnRlbXBfcF9uIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSAlPiUgZHBseXI6OnNlbGVjdCgtYyhcXEExX2dlbmVcXCwgXFxBMl9nZW5lXFwpKVxuZndyaXRlKHRlbXBfcF9uLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9nZW5lTGlzdC50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxuXG50ZW1wX3BfcGUgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCkpICU+JSBkcGx5cjo6c2VsZWN0KC1jKFxcQTFfZ2VuZVxcLCBcXEEyX2dlbmVcXCkpXG5md3JpdGUodGVtcF9wX3BlLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3AtcGVfZ2VuZUxpc3QudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcblxudGVtcCA8LSBkYXRhICU+JSByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoQTFfZ2VuZSA9IGlmZWxzZShBMSA9PSBcXFBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZmluZE92ZXJsYXBFbnNlbWJsKGdlbmUuVFNTLnRiLCBjaHJvbTEsIHN0YXJ0MSwgZW5kMSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLFxuICAgICAgICAgICAgICAgIEEyX2dlbmUgPSBpZmVsc2UoQTIgPT0gXFxQXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwRW5zZW1ibChnZW5lLlRTUy50YiwgY2hyb20yLCBzdGFydDIsIGVuZDIpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSxcbiAgICAgICAgICAgICAgICBnZW5lID0gbGlzdCh1bmlxdWUoYyhBMV9nZW5lLCBBMl9nZW5lKSkpKVxuXG50ZW1wX3BfbiA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoLWMoXFxBMV9nZW5lXFwsIFxcQTJfZ2VuZVxcKSlcbmZ3cml0ZSh0ZW1wX3BfbiwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcblxudGVtcF9wX3BlIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwpKSAlPiUgZHBseXI6OnNlbGVjdCgtYyhcXEExX2dlbmVcXCwgXFxBMl9nZW5lXFwpKVxuZndyaXRlKHRlbXBfcF9wZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLXBlX2Vuc2VtYmxMaXN0LnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZmxhbmtTaXplIDwtIDI1MDBcbmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLFxuICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLFxuICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY0LCBWNSwgVjYpXG5jb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcc3RyYW5kXFwsIFxcZ2VuZVxcLCBcXGVuc2VtYmxcXClcblxuZndyaXRlKGdlbmUuVFNTLnRiLCBoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9UU1MyLjVrYi5iZWRcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFLCByb3cubmFtZXMgPSBGQUxTRSlcblxuZmluZE92ZXJsYXBHZW5lIDwtIGZ1bmN0aW9uKGdlbmUuVFNTLnRiLCBjaHJvbTEsIHN0YXJ0MSwgZW5kMSl7XG4gIHRlbXAgPC0gZ2VuZS5UU1MudGIgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyID09IGNocm9tMSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcigoc3RhcnQgPD0gZW5kMSkgJiAoZW5kID49IHN0YXJ0MSkpXG4gIHJldHVybih0ZW1wJGdlbmUpXG59XG5maW5kT3ZlcmxhcEVuc2VtYmwgPC0gZnVuY3Rpb24oZ2VuZS5UU1MudGIsIGNocm9tMSwgc3RhcnQxLCBlbmQxKXtcbiAgdGVtcCA8LSBnZW5lLlRTUy50YiAlPiUgZHBseXI6OmZpbHRlcihjaHIgPT0gY2hyb20xKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKChzdGFydCA8PSBlbmQxKSAmIChlbmQgPj0gc3RhcnQxKSlcbiAgcmV0dXJuKHRlbXAkZW5zZW1ibClcbn1cblxudGVtcCA8LSBkYXRhICU+JSByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoQTFfZ2VuZSA9IGlmZWxzZShBMSA9PSBcXFBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZmluZE92ZXJsYXBHZW5lKGdlbmUuVFNTLnRiLCBjaHJvbTEsIHN0YXJ0MSwgZW5kMSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLFxuICAgICAgICAgICAgICAgIEEyX2dlbmUgPSBpZmVsc2UoQTIgPT0gXFxQXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwR2VuZShnZW5lLlRTUy50YiwgY2hyb20yLCBzdGFydDIsIGVuZDIpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSxcbiAgICAgICAgICAgICAgICBnZW5lID0gbGlzdCh1bmlxdWUoYyhBMV9nZW5lLCBBMl9nZW5lKSkpKVxuXG50ZW1wX3BfbiA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoLWMoXFxBMV9nZW5lXFwsIFxcQTJfZ2VuZVxcKSlcbmZ3cml0ZSh0ZW1wX3BfbiwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZ2VuZUxpc3QudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcblxudGVtcF9wX3BlIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwpKSAlPiUgZHBseXI6OnNlbGVjdCgtYyhcXEExX2dlbmVcXCwgXFxBMl9nZW5lXFwpKVxuZndyaXRlKHRlbXBfcF9wZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLXBlX2dlbmVMaXN0LnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG5cbnRlbXAgPC0gZGF0YSAlPiUgcm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKEExX2dlbmUgPSBpZmVsc2UoQTEgPT0gXFxQXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwRW5zZW1ibChnZW5lLlRTUy50YiwgY2hyb20xLCBzdGFydDEsIGVuZDEpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSxcbiAgICAgICAgICAgICAgICBBMl9nZW5lID0gaWZlbHNlKEEyID09IFxcUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChmaW5kT3ZlcmxhcEVuc2VtYmwoZ2VuZS5UU1MudGIsIGNocm9tMiwgc3RhcnQyLCBlbmQyKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSksXG4gICAgICAgICAgICAgICAgZ2VuZSA9IGxpc3QodW5pcXVlKGMoQTFfZ2VuZSwgQTJfZ2VuZSkpKSlcblxudGVtcF9wX24gPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpICU+JSBkcGx5cjo6c2VsZWN0KC1jKFxcQTFfZ2VuZVxcLCBcXEEyX2dlbmVcXCkpXG5md3JpdGUodGVtcF9wX24sIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG5cbnRlbXBfcF9wZSA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoLWMoXFxBMV9nZW5lXFwsIFxcQTJfZ2VuZVxcKSlcbmZ3cml0ZSh0ZW1wX3BfcGUsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1wZV9lbnNlbWJsTGlzdC50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
flankSize <- 2500
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V4, V5, V6)
colnames(gene.TSS.tb) <- c(\chr\, \start\, \end\, \strand\, \gene\, \ensembl\)

fwrite(gene.TSS.tb, here(refDir, \mm10_GRCm38.p6_TSS2.5kb.bed\), sep = \\t\, col.names = FALSE, row.names = FALSE)

findOverlapGene <- function(gene.TSS.tb, chrom1, start1, end1){
  temp <- gene.TSS.tb %>% dplyr::filter(chr == chrom1) %>%
    dplyr::filter((start <= end1) & (end >= start1))
  return(temp$gene)
}
findOverlapEnsembl <- function(gene.TSS.tb, chrom1, start1, end1){
  temp <- gene.TSS.tb %>% dplyr::filter(chr == chrom1) %>%
    dplyr::filter((start <= end1) & (end >= start1))
  return(temp$ensembl)
}

temp <- data %>% rowwise() %>%
  dplyr::mutate(A1_gene = ifelse(A1 == \P\,
                                 list(findOverlapGene(gene.TSS.tb, chrom1, start1, end1)),
                                 NA),
                A2_gene = ifelse(A2 == \P\,
                                 list(findOverlapGene(gene.TSS.tb, chrom2, start2, end2)),
                                 NA),
                gene = list(unique(c(A1_gene, A2_gene))))

temp_p_n <- temp %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \P-S\, \P-X\)) %>% dplyr::select(-c(\A1_gene\, \A2_gene\))
fwrite(temp_p_n, here(consensusDir, paste0(name, \_p-n_geneList.tsv\)), sep = \\t\)

temp_p_pe <- temp %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\)) %>% dplyr::select(-c(\A1_gene\, \A2_gene\))
fwrite(temp_p_pe, here(consensusDir, paste0(name, \_p-pe_geneList.tsv\)), sep = \\t\)

temp <- data %>% rowwise() %>%
  dplyr::mutate(A1_gene = ifelse(A1 == \P\,
                                 list(findOverlapEnsembl(gene.TSS.tb, chrom1, start1, end1)),
                                 NA),
                A2_gene = ifelse(A2 == \P\,
                                 list(findOverlapEnsembl(gene.TSS.tb, chrom2, start2, end2)),
                                 NA),
                gene = list(unique(c(A1_gene, A2_gene))))

temp_p_n <- temp %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \P-S\, \P-X\)) %>% dplyr::select(-c(\A1_gene\, \A2_gene\))
fwrite(temp_p_n, here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)), sep = \\t\)

temp_p_pe <- temp %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\)) %>% dplyr::select(-c(\A1_gene\, \A2_gene\))
fwrite(temp_p_pe, here(consensusDir, paste0(name, \_p-pe_ensemblList.tsv\)), sep = \\t\)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [2.8] Annotating genes to P-P and P-E loops
#### Link gene to promoter anchor
Here, anchor was linked to a gene based on whether the anchor overlaps with TSS +- 2.5kb region

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZM0psWVhSbFgyUnBjM1JmWW1GeWNHeHZkQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JtYVdkRWFYSXNJRzVoYldVc0lHNXZkR1VzSUd4dmIzQk1hWE4wTENCa2FXWm1RM1YwYjJabUtYdGNiaUFnZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtFRnVibTh5TENCa2FYTjBZVzVqWlN3Z2RYQmtiM2R1WDJSVVFVZGZSRTFUVHl3Z2RYQmtiM2R1WDBFME9EVmZSRTFUVHlrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T21acGJIUmxjaWhCYm01dk1pQWxhVzRsSUd4dmIzQk1hWE4wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RYQmtiM2R1WDJSVVFVZGZSRTFUVHlBbGFXNGxJR01vWENKVlVGd2lMQ0JjSWs1UFhDSXNJRndpUkU5WFRsd2lLU2xjYmlBZ2NDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCMWNHUnZkMjVmWkZSQlIxOUVUVk5QTENCNUlEMGdaR2x6ZEdGdVkyVXBLU0FyWEc0Z0lDQWdaMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCMWNHUnZkMjVmWkZSQlIxOUVUVk5QS1NrZ0t5QmNiaUFnSUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMakVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0sxeHVJQ0FnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0IxY0dSdmQyNWZaRlJCUjE5RVRWTlBLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNJbkpsWkZ3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpa2dLMXh1SUNBZ0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHZG5kR2wwYkdVb2JtOTBaU2tnSzF4dUlDQWdJSE5qWVd4bFgzbGZZMjl1ZEdsdWRXOTFjeWhzWVdKbGJITWdQU0JzWVdKbGJGOXJZbDl0WWlsY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpYzJsNlpWOWlZWEp3Ykc5MFgxd2lMQ0J1WVcxbExDQmNJbDlrVkVGSFgzWnpYMFJOVTA5ZlhDSXNJRzV2ZEdVc0lGd2lYMXdpTENCa2FXWm1RM1YwYjJabUtWeHVJQ0JvWldsbmFIUWdQQzBnTTF4dUlDQjNhV1IwYUNBOExTQTBYRzRnSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUZ4dUlDQmNiaUFnZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtFRnVibTh5TENCa2FYTjBZVzVqWlN3Z2RYQmtiM2R1WDJSVVFVZGZSRTFUVHl3Z2RYQmtiM2R1WDBFME9EVmZSRTFUVHlrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T21acGJIUmxjaWhCYm01dk1pQWxhVzRsSUd4dmIzQk1hWE4wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RYQmtiM2R1WDBFME9EVmZSRTFUVHlBbGFXNGxJR01vWENKVlVGd2lMQ0JjSWs1UFhDSXNJQ0JjSWtSUFYwNWNJaWtwWEc0Z0lIQWdQQzBnWjJkd2JHOTBLSFJsYlhBc0lHRmxjeWg0SUQwZ2RYQmtiM2R1WDBFME9EVmZSRTFUVHl3Z2VTQTlJR1JwYzNSaGJtTmxLU2tnSzF4dUlDQWdJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ2RYQmtiM2R1WDBFME9EVmZSRTFUVHlrcElDc2dYRzRnSUNBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDdGNiaUFnSUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnZFhCa2IzZHVYMEUwT0RWZlJFMVRUeWtzSUdaMWJpQTlJRzFsWVc0c0lHZGxiMjBnUFNCY0luQnZhVzUwWENJc0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXlMQ0JtYVd4c0lEMGdYQ0p5WldSY0lpd2dZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXBJQ3RjYmlBZ0lDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5Qm5aM1JwZEd4bEtHNXZkR1VwSUN0Y2JpQWdJQ0J6WTJGc1pWOTVYMk52Ym5ScGJuVnZkWE1vYkdGaVpXeHpJRDBnYkdGaVpXeGZhMkpmYldJcFhHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW5OcGVtVmZZbUZ5Y0d4dmRGOWNJaXdnYm1GdFpTd2dYQ0pmUVRRNE5WOTJjMTlFVFZOUFgxd2lMQ0J1YjNSbExDQmNJbDljSWl3Z1pHbG1aa04xZEc5bVppbGNiaUFnYUdWcFoyaDBJRHd0SUROY2JpQWdkMmxrZEdnZ1BDMGdORnh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0J6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1ZlZ4dVhHNWNibTVoYldWY2JtUnBabVpEZFhSdlptWWdQQzBnTUM0eVhHNXVZVzFsSUR3dElGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWd2lYRzVrWVhSaElEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENJdWRITjJYQ0lwS1NsY2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMWNHUnZkMjVmWkZSQlIxOUVUVk5QSUQwZ2FXWmxiSE5sS0dScFptWmZaRlJCUjE5RVRWTlBJRDRnWkdsbVprTjFkRzltWml3Z1hDSlZVRndpTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hrYVdabVgyUlVRVWRmUkUxVFR5QStJQzFrYVdabVEzVjBiMlptTENCY0lrNVBYQ0lzSUZ3aVJFOVhUbHdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RYQmtiM2R1WDBFME9EVmZSRTFUVHlBOUlHbG1aV3h6WlNoa2FXWm1YMEUwT0RWZlJFMVRUeUErSUdScFptWkRkWFJ2Wm1Zc0lGd2lWVkJjSWl3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWkdsbVpsOUJORGcxWDBSTlUwOGdQaUF0WkdsbVprTjFkRzltWml3Z1hDSk9UMXdpTENCY0lrUlBWMDVjSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnBjM1JoYm1ObElEMGdjM1JoY25ReUlDMGdjM1JoY25ReEtWeHVaR0YwWVNSMWNHUnZkMjVmWkZSQlIxOUVUVk5QSUR3dElHWmhZM1J2Y2loa1lYUmhKSFZ3Wkc5M2JsOWtWRUZIWDBSTlUwOHNJR3hsZG1Wc2N5QTlJR01vWENKVlVGd2lMQ0JjSWs1UFhDSXNJRndpUkU5WFRsd2lLU2xjYm1SaGRHRWtkWEJrYjNkdVgwRTBPRFZmUkUxVFR5QThMU0JtWVdOMGIzSW9aR0YwWVNSMWNHUnZkMjVmUVRRNE5WOUVUVk5QTENCc1pYWmxiSE1nUFNCaktGd2lWVkJjSWl3Z1hDSk9UMXdpTENCY0lrUlBWMDVjSWlrcFhHNWpjbVZoZEdWZlpHbHpkRjlpWVhKd2JHOTBLR1JoZEdFc0lHWnBaMFJwY2l3Z2JtRnRaU3dnWENKd0xXNWNJaXdnWXloY0lsQXRVRndpTENCY0lsQXRSVndpTENCY0lsQXRVMXdpTENCY0lsQXRXRndpS1N3Z01DNHlLVnh1WTNKbFlYUmxYMlJwYzNSZlltRnljR3h2ZENoa1lYUmhMQ0JtYVdkRWFYSXNJRzVoYldVc0lGd2ljQzF3WlZ3aUxDQmpLRndpVUMxUVhDSXNJRndpVUMxRlhDSXBMQ0F3TGpJcFhHNWpjbVZoZEdWZlpHbHpkRjlpWVhKd2JHOTBLR1JoZEdFc0lHWnBaMFJwY2l3Z2JtRnRaU3dnWENKd1pTMXdaVndpTENCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJc0lGd2lSUzFGWENJcExDQXdMaklwWEc1amNtVmhkR1ZmWkdsemRGOWlZWEp3Ykc5MEtHUmhkR0VzSUdacFowUnBjaXdnYm1GdFpTd2dYQ0p6ZEhKY0lpd2dZeWhjSWxNdFUxd2lMQ0JjSWxNdFdGd2lLU3dnTUM0eUtWeHVYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmNyZWF0ZV9kaXN0X2JhcnBsb3QgPC0gZnVuY3Rpb24oZGF0YSwgZmlnRGlyLCBuYW1lLCBub3RlLCBsb29wTGlzdCwgZGlmZkN1dG9mZil7XG4gIHRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChBbm5vMiwgZGlzdGFuY2UsIHVwZG93bl9kVEFHX0RNU08sIHVwZG93bl9BNDg1X0RNU08pICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBsb29wTGlzdCxcbiAgICAgICAgICAgICAgICAgIHVwZG93bl9kVEFHX0RNU08gJWluJSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIHAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gdXBkb3duX2RUQUdfRE1TTywgeSA9IGRpc3RhbmNlKSkgK1xuICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gdXBkb3duX2RUQUdfRE1TTykpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gdXBkb3duX2RUQUdfRE1TTyksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKG5vdGUpICtcbiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHNpemVfYmFycGxvdF9cXCwgbmFtZSwgXFxfZFRBR192c19ETVNPX1xcLCBub3RlLCBcXF9cXCwgZGlmZkN1dG9mZilcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gNFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBcbiAgXG4gIHRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChBbm5vMiwgZGlzdGFuY2UsIHVwZG93bl9kVEFHX0RNU08sIHVwZG93bl9BNDg1X0RNU08pICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBsb29wTGlzdCxcbiAgICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gJWluJSBjKFxcVVBcXCwgXFxOT1xcLCAgXFxET1dOXFwpKVxuICBwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHVwZG93bl9BNDg1X0RNU08sIHkgPSBkaXN0YW5jZSkpICtcbiAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHVwZG93bl9BNDg1X0RNU08pKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHVwZG93bl9BNDg1X0RNU08pLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShub3RlKSArXG4gICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKVxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzaXplX2JhcnBsb3RfXFwsIG5hbWUsIFxcX0E0ODVfdnNfRE1TT19cXCwgbm90ZSwgXFxfXFwsIGRpZmZDdXRvZmYpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDRcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cblxuXG5uYW1lXG5kaWZmQ3V0b2ZmIDwtIDAuMlxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5kYXRhIDwtIGRhdGEgJT4lXG4gIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpLFxuICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiBkaWZmQ3V0b2ZmLCBcXFVQXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcbmRhdGEkdXBkb3duX2RUQUdfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fZFRBR19ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG5kYXRhJHVwZG93bl9BNDg1X0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX0E0ODVfRE1TTywgbGV2ZWxzID0gYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpKVxuY3JlYXRlX2Rpc3RfYmFycGxvdChkYXRhLCBmaWdEaXIsIG5hbWUsIFxccC1uXFwsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCksIDAuMilcbmNyZWF0ZV9kaXN0X2JhcnBsb3QoZGF0YSwgZmlnRGlyLCBuYW1lLCBcXHAtcGVcXCwgYyhcXFAtUFxcLCBcXFAtRVxcKSwgMC4yKVxuY3JlYXRlX2Rpc3RfYmFycGxvdChkYXRhLCBmaWdEaXIsIG5hbWUsIFxccGUtcGVcXCwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSwgMC4yKVxuY3JlYXRlX2Rpc3RfYmFycGxvdChkYXRhLCBmaWdEaXIsIG5hbWUsIFxcc3RyXFwsIGMoXFxTLVNcXCwgXFxTLVhcXCksIDAuMilcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
create_dist_barplot <- function(data, figDir, name, note, loopList, diffCutoff){
  temp <- data %>% dplyr::select(Anno2, distance, updown_dTAG_DMSO, updown_A485_DMSO) %>%
    dplyr::filter(Anno2 %in% loopList,
                  updown_dTAG_DMSO %in% c(\UP\, \NO\, \DOWN\))
  p <- ggplot(temp, aes(x = updown_dTAG_DMSO, y = distance)) +
    geom_violin(aes(fill = updown_dTAG_DMSO)) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = updown_dTAG_DMSO), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + ggtitle(note) +
    scale_y_continuous(labels = label_kb_mb)
  fileName <- paste0(\size_barplot_\, name, \_dTAG_vs_DMSO_\, note, \_\, diffCutoff)
  height <- 3
  width <- 4
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
  
  
  temp <- data %>% dplyr::select(Anno2, distance, updown_dTAG_DMSO, updown_A485_DMSO) %>%
    dplyr::filter(Anno2 %in% loopList,
                  updown_A485_DMSO %in% c(\UP\, \NO\,  \DOWN\))
  p <- ggplot(temp, aes(x = updown_A485_DMSO, y = distance)) +
    geom_violin(aes(fill = updown_A485_DMSO)) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = updown_A485_DMSO), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + ggtitle(note) +
    scale_y_continuous(labels = label_kb_mb)
  fileName <- paste0(\size_barplot_\, name, \_A485_vs_DMSO_\, note, \_\, diffCutoff)
  height <- 3
  width <- 4
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}


name
diffCutoff <- 0.2
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
data <- data %>%
  dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)),
                distance = start2 - start1)
data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
create_dist_barplot(data, figDir, name, \p-n\, c(\P-P\, \P-E\, \P-S\, \P-X\), 0.2)
create_dist_barplot(data, figDir, name, \p-pe\, c(\P-P\, \P-E\), 0.2)
create_dist_barplot(data, figDir, name, \pe-pe\, c(\P-P\, \P-E\, \E-E\), 0.2)
create_dist_barplot(data, figDir, name, \str\, c(\S-S\, \S-X\), 0.2)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVkzSmxZWFJsWDJScGMzUmZZbUZ5Y0d4dmRDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm1hV2RFYVhJc0lHNWhiV1VzSUc1dmRHVXNJR3h2YjNCTWFYTjBMQ0JrYVdabVEzVjBiMlptS1h0Y2JpQWdkR1Z0Y0NBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VGdWJtOHlMQ0JrYVhOMFlXNWpaU3dnZFhCa2IzZHVYMlJVUVVkZlJFMVRUeXdnZFhCa2IzZHVYMEUwT0RWZlJFMVRUeWtnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJR3h2YjNCTWFYTjBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZFhCa2IzZHVYMlJVUVVkZlJFMVRUeUFsYVc0bElHTW9YRnhWVUZ4Y0xDQmNYRTVQWEZ3c0lGeGNSRTlYVGx4Y0tTbGNiaUFnY0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0IxY0dSdmQyNWZaRlJCUjE5RVRWTlBMQ0I1SUQwZ1pHbHpkR0Z1WTJVcEtTQXJYRzRnSUNBZ1oyVnZiVjkyYVc5c2FXNG9ZV1Z6S0dacGJHd2dQU0IxY0dSdmQyNWZaRlJCUjE5RVRWTlBLU2tnS3lCY2JpQWdJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnSzF4dUlDQWdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQjFjR1J2ZDI1ZlpGUkJSMTlFVFZOUEtTd2dablZ1SUQwZ2JXVmhiaXdnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURJc0lHWnBiR3dnUFNCY1hISmxaRnhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWENrZ0sxeHVJQ0FnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUdkbmRHbDBiR1VvYm05MFpTa2dLMXh1SUNBZ0lITmpZV3hsWDNsZlkyOXVkR2x1ZFc5MWN5aHNZV0psYkhNZ1BTQnNZV0psYkY5cllsOXRZaWxjYmlBZ1ptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNjMmw2WlY5aVlYSndiRzkwWDF4Y0xDQnVZVzFsTENCY1hGOWtWRUZIWDNaelgwUk5VMDlmWEZ3c0lHNXZkR1VzSUZ4Y1gxeGNMQ0JrYVdabVEzVjBiMlptS1Z4dUlDQm9aV2xuYUhRZ1BDMGdNMXh1SUNCM2FXUjBhQ0E4TFNBMFhHNGdJSEJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpQWdjSEpwYm5Rb2NDbGNiaUFnWkdWMkxtOW1aaWdwWEc0Z0lITjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJRnh1SUNCY2JpQWdkR1Z0Y0NBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VGdWJtOHlMQ0JrYVhOMFlXNWpaU3dnZFhCa2IzZHVYMlJVUVVkZlJFMVRUeXdnZFhCa2IzZHVYMEUwT0RWZlJFMVRUeWtnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJR3h2YjNCTWFYTjBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZFhCa2IzZHVYMEUwT0RWZlJFMVRUeUFsYVc0bElHTW9YRnhWVUZ4Y0xDQmNYRTVQWEZ3c0lDQmNYRVJQVjA1Y1hDa3BYRzRnSUhBZ1BDMGdaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnZFhCa2IzZHVYMEUwT0RWZlJFMVRUeXdnZVNBOUlHUnBjM1JoYm1ObEtTa2dLMXh1SUNBZ0lHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnZFhCa2IzZHVYMEUwT0RWZlJFMVRUeWtwSUNzZ1hHNGdJQ0FnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUN0Y2JpQWdJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdkWEJrYjNkdVgwRTBPRFZmUkUxVFR5a3NJR1oxYmlBOUlHMWxZVzRzSUdkbGIyMGdQU0JjWEhCdmFXNTBYRndzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBeUxDQm1hV3hzSUQwZ1hGeHlaV1JjWEN3Z1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3cElDdGNiaUFnSUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCblozUnBkR3hsS0c1dmRHVXBJQ3RjYmlBZ0lDQnpZMkZzWlY5NVgyTnZiblJwYm5WdmRYTW9iR0ZpWld4eklEMGdiR0ZpWld4ZmEySmZiV0lwWEc0Z0lHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYSE5wZW1WZlltRnljR3h2ZEY5Y1hDd2dibUZ0WlN3Z1hGeGZRVFE0TlY5MmMxOUVUVk5QWDF4Y0xDQnViM1JsTENCY1hGOWNYQ3dnWkdsbVprTjFkRzltWmlsY2JpQWdhR1ZwWjJoMElEd3RJRE5jYmlBZ2QybGtkR2dnUEMwZ05GeHVJQ0J3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dUlDQnpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVmVnh1WEc1Y2JtNWhiV1ZjYm1ScFptWkRkWFJ2Wm1ZZ1BDMGdNQzR5WEc1dVlXMWxJRHd0SUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVZ4Y1hHNWtZWFJoSUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnd1ZEhOMlhGd3BLU2xjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2gxY0dSdmQyNWZaRlJCUjE5RVRWTlBJRDBnYVdabGJITmxLR1JwWm1aZlpGUkJSMTlFVFZOUElENGdaR2xtWmtOMWRHOW1aaXdnWEZ4VlVGeGNMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGthV1ptWDJSVVFVZGZSRTFUVHlBK0lDMWthV1ptUTNWMGIyWm1MQ0JjWEU1UFhGd3NJRnhjUkU5WFRseGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZFhCa2IzZHVYMEUwT0RWZlJFMVRUeUE5SUdsbVpXeHpaU2hrYVdabVgwRTBPRFZmUkUxVFR5QStJR1JwWm1aRGRYUnZabVlzSUZ4Y1ZWQmNYQ3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aR2xtWmw5Qk5EZzFYMFJOVTA4Z1BpQXRaR2xtWmtOMWRHOW1aaXdnWEZ4T1QxeGNMQ0JjWEVSUFYwNWNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdScGMzUmhibU5sSUQwZ2MzUmhjblF5SUMwZ2MzUmhjblF4S1Z4dVpHRjBZU1IxY0dSdmQyNWZaRlJCUjE5RVRWTlBJRHd0SUdaaFkzUnZjaWhrWVhSaEpIVndaRzkzYmw5a1ZFRkhYMFJOVTA4c0lHeGxkbVZzY3lBOUlHTW9YRnhWVUZ4Y0xDQmNYRTVQWEZ3c0lGeGNSRTlYVGx4Y0tTbGNibVJoZEdFa2RYQmtiM2R1WDBFME9EVmZSRTFUVHlBOExTQm1ZV04wYjNJb1pHRjBZU1IxY0dSdmQyNWZRVFE0TlY5RVRWTlBMQ0JzWlhabGJITWdQU0JqS0Z4Y1ZWQmNYQ3dnWEZ4T1QxeGNMQ0JjWEVSUFYwNWNYQ2twWEc1amNtVmhkR1ZmWkdsemRGOWlZWEp3Ykc5MEtHUmhkR0VzSUdacFowUnBjaXdnYm1GdFpTd2dYRnh3TFc1Y1hDd2dZeWhjWEZBdFVGeGNMQ0JjWEZBdFJWeGNMQ0JjWEZBdFUxeGNMQ0JjWEZBdFdGeGNLU3dnTUM0eUtWeHVZM0psWVhSbFgyUnBjM1JmWW1GeWNHeHZkQ2hrWVhSaExDQm1hV2RFYVhJc0lHNWhiV1VzSUZ4Y2NDMXdaVnhjTENCaktGeGNVQzFRWEZ3c0lGeGNVQzFGWEZ3cExDQXdMaklwWEc1amNtVmhkR1ZmWkdsemRGOWlZWEp3Ykc5MEtHUmhkR0VzSUdacFowUnBjaXdnYm1GdFpTd2dYRnh3WlMxd1pWeGNMQ0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndzSUZ4Y1JTMUZYRndwTENBd0xqSXBYRzVqY21WaGRHVmZaR2x6ZEY5aVlYSndiRzkwS0dSaGRHRXNJR1pwWjBScGNpd2dibUZ0WlN3Z1hGeHpkSEpjWEN3Z1l5aGNYRk10VTF4Y0xDQmNYRk10V0Z4Y0tTd2dNQzR5S1Z4dVhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbmNyZWF0ZV9kaXN0X2JhcnBsb3QgPC0gZnVuY3Rpb24oZGF0YSwgZmlnRGlyLCBuYW1lLCBub3RlLCBsb29wTGlzdCwgZGlmZkN1dG9mZil7XG4gIHRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChBbm5vMiwgZGlzdGFuY2UsIHVwZG93bl9kVEFHX0RNU08sIHVwZG93bl9BNDg1X0RNU08pICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBsb29wTGlzdCxcbiAgICAgICAgICAgICAgICAgIHVwZG93bl9kVEFHX0RNU08gJWluJSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG4gIHAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gdXBkb3duX2RUQUdfRE1TTywgeSA9IGRpc3RhbmNlKSkgK1xuICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gdXBkb3duX2RUQUdfRE1TTykpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gdXBkb3duX2RUQUdfRE1TTyksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKG5vdGUpICtcbiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHNpemVfYmFycGxvdF9cXCwgbmFtZSwgXFxfZFRBR192c19ETVNPX1xcLCBub3RlLCBcXF9cXCwgZGlmZkN1dG9mZilcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gNFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBcbiAgXG4gIHRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChBbm5vMiwgZGlzdGFuY2UsIHVwZG93bl9kVEFHX0RNU08sIHVwZG93bl9BNDg1X0RNU08pICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBsb29wTGlzdCxcbiAgICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gJWluJSBjKFxcVVBcXCwgXFxOT1xcLCAgXFxET1dOXFwpKVxuICBwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHVwZG93bl9BNDg1X0RNU08sIHkgPSBkaXN0YW5jZSkpICtcbiAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHVwZG93bl9BNDg1X0RNU08pKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHVwZG93bl9BNDg1X0RNU08pLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShub3RlKSArXG4gICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKVxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzaXplX2JhcnBsb3RfXFwsIG5hbWUsIFxcX0E0ODVfdnNfRE1TT19cXCwgbm90ZSwgXFxfXFwsIGRpZmZDdXRvZmYpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDRcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cblxuXG5uYW1lXG5kaWZmQ3V0b2ZmIDwtIDAuMlxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5kYXRhIDwtIGRhdGEgJT4lXG4gIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpLFxuICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiBkaWZmQ3V0b2ZmLCBcXFVQXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcbmRhdGEkdXBkb3duX2RUQUdfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fZFRBR19ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG5kYXRhJHVwZG93bl9BNDg1X0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX0E0ODVfRE1TTywgbGV2ZWxzID0gYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpKVxuY3JlYXRlX2Rpc3RfYmFycGxvdChkYXRhLCBmaWdEaXIsIG5hbWUsIFxccC1uXFwsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCksIDAuMilcbmNyZWF0ZV9kaXN0X2JhcnBsb3QoZGF0YSwgZmlnRGlyLCBuYW1lLCBcXHAtcGVcXCwgYyhcXFAtUFxcLCBcXFAtRVxcKSwgMC4yKVxuY3JlYXRlX2Rpc3RfYmFycGxvdChkYXRhLCBmaWdEaXIsIG5hbWUsIFxccGUtcGVcXCwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSwgMC4yKVxuY3JlYXRlX2Rpc3RfYmFycGxvdChkYXRhLCBmaWdEaXIsIG5hbWUsIFxcc3RyXFwsIGMoXFxTLVNcXCwgXFxTLVhcXCksIDAuMilcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuY3JlYXRlX2Rpc3RfYmFycGxvdCA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIG5vdGUsIGxvb3BMaXN0LCBkaWZmQ3V0b2ZmKXtcbiAgdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KEFubm8yLCBkaXN0YW5jZSwgdXBkb3duX2RUQUdfRE1TTywgdXBkb3duX0E0ODVfRE1TTykgJT4lXG4gICAgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGxvb3BMaXN0LFxuICAgICAgICAgICAgICAgICAgdXBkb3duX2RUQUdfRE1TTyAlaW4lIGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbiAgcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSB1cGRvd25fZFRBR19ETVNPLCB5ID0gZGlzdGFuY2UpKSArXG4gICAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSB1cGRvd25fZFRBR19ETVNPKSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSB1cGRvd25fZFRBR19ETVNPKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUobm90ZSkgK1xuICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYilcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2l6ZV9iYXJwbG90X1xcLCBuYW1lLCBcXF9kVEFHX3ZzX0RNU09fXFwsIG5vdGUsIFxcX1xcLCBkaWZmQ3V0b2ZmKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSA0XG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIFxuICBcbiAgdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KEFubm8yLCBkaXN0YW5jZSwgdXBkb3duX2RUQUdfRE1TTywgdXBkb3duX0E0ODVfRE1TTykgJT4lXG4gICAgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGxvb3BMaXN0LFxuICAgICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyAlaW4lIGMoXFxVUFxcLCBcXE5PXFwsICBcXERPV05cXCkpXG4gIHAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gdXBkb3duX0E0ODVfRE1TTywgeSA9IGRpc3RhbmNlKSkgK1xuICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gdXBkb3duX0E0ODVfRE1TTykpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gdXBkb3duX0E0ODVfRE1TTyksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKG5vdGUpICtcbiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHNpemVfYmFycGxvdF9cXCwgbmFtZSwgXFxfQTQ4NV92c19ETVNPX1xcLCBub3RlLCBcXF9cXCwgZGlmZkN1dG9mZilcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gNFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG5cbm5hbWVcbmRpZmZDdXRvZmYgPC0gMC4yXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSlcbmRhdGEgPC0gZGF0YSAlPiVcbiAgZHBseXI6Om11dGF0ZSh1cGRvd25fZFRBR19ETVNPID0gaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKVxuZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbmRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCkpXG5jcmVhdGVfZGlzdF9iYXJwbG90KGRhdGEsIGZpZ0RpciwgbmFtZSwgXFxwLW5cXCwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSwgMC4yKVxuY3JlYXRlX2Rpc3RfYmFycGxvdChkYXRhLCBmaWdEaXIsIG5hbWUsIFxccC1wZVxcLCBjKFxcUC1QXFwsIFxcUC1FXFwpLCAwLjIpXG5jcmVhdGVfZGlzdF9iYXJwbG90KGRhdGEsIGZpZ0RpciwgbmFtZSwgXFxwZS1wZVxcLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCAwLjIpXG5jcmVhdGVfZGlzdF9iYXJwbG90KGRhdGEsIGZpZ0RpciwgbmFtZSwgXFxzdHJcXCwgYyhcXFMtU1xcLCBcXFMtWFxcKSwgMC4yKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
create_dist_barplot <- function(data, figDir, name, note, loopList, diffCutoff){
  temp <- data %>% dplyr::select(Anno2, distance, updown_dTAG_DMSO, updown_A485_DMSO) %>%
    dplyr::filter(Anno2 %in% loopList,
                  updown_dTAG_DMSO %in% c(\UP\, \NO\, \DOWN\))
  p <- ggplot(temp, aes(x = updown_dTAG_DMSO, y = distance)) +
    geom_violin(aes(fill = updown_dTAG_DMSO)) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = updown_dTAG_DMSO), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + ggtitle(note) +
    scale_y_continuous(labels = label_kb_mb)
  fileName <- paste0(\size_barplot_\, name, \_dTAG_vs_DMSO_\, note, \_\, diffCutoff)
  height <- 3
  width <- 4
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
  
  
  temp <- data %>% dplyr::select(Anno2, distance, updown_dTAG_DMSO, updown_A485_DMSO) %>%
    dplyr::filter(Anno2 %in% loopList,
                  updown_A485_DMSO %in% c(\UP\, \NO\,  \DOWN\))
  p <- ggplot(temp, aes(x = updown_A485_DMSO, y = distance)) +
    geom_violin(aes(fill = updown_A485_DMSO)) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = updown_A485_DMSO), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + ggtitle(note) +
    scale_y_continuous(labels = label_kb_mb)
  fileName <- paste0(\size_barplot_\, name, \_A485_vs_DMSO_\, note, \_\, diffCutoff)
  height <- 3
  width <- 4
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}


name
diffCutoff <- 0.2
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
data <- data %>%
  dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                          ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)),
                distance = start2 - start1)
data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
create_dist_barplot(data, figDir, name, \p-n\, c(\P-P\, \P-E\, \P-S\, \P-X\), 0.2)
create_dist_barplot(data, figDir, name, \p-pe\, c(\P-P\, \P-E\), 0.2)
create_dist_barplot(data, figDir, name, \pe-pe\, c(\P-P\, \P-E\, \E-E\), 0.2)
create_dist_barplot(data, figDir, name, \str\, c(\S-S\, \S-X\), 0.2)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVSMDlrYVhJZ1BDMGdhR1Z5WlNoY0lpNHVMeTR1WENJc0lGd2ljbVZ6ZFd4MFhDSXNJRndpYkc5dmNGd2lMQ0JjSWtkUFhDSXBYRzVrYVhJdVkzSmxZWFJsS0VkUFpHbHlMQ0J6YUc5M1YyRnlibWx1WjNNZ1BTQkdRVXhUUlN3Z2NtVmpkWEp6YVhabElEMGdWRkpWUlNsY2JseHVaMlYwUjA4Z1BDMGdablZ1WTNScGIyNG9ibUZ0WlN3Z1ptbG5SR2x5TENCblpXNWxUR2x6ZEN3Z1kyRjBaV2R2Y25sT2RXMGdQU0F4TlN3Z2FHVnBaMmgwSUQwZ01UQXNJSGRwWkhSb0lEMGdOeWw3WEc0Z0lFZFBJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bFRHbHpkQ3dnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUtWeHVJQ0JIVHk1eVpXRmtZV0pzWlNBOExTQnpaWFJTWldGa1lXSnNaU2hIVHl3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXBYRzRnSUdaM2NtbDBaU2hoY3k1a1lYUmhMbVp5WVcxbEtFZFBLU3dnYUdWeVpTaEhUMlJwY2l3Z2NHRnpkR1V3S0Z3aVIwOWZYQ0lzSUc1aGJXVXNJRndpWDJWdWMyVnRZbXd1ZEhOMlhDSXBLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNiaUFnWm5keWFYUmxLR0Z6TG1SaGRHRXVabkpoYldVb1IwOHVjbVZoWkdGaWJHVXBMQ0JvWlhKbEtFZFBaR2x5TENCd1lYTjBaVEFvWENKSFQxOWNJaXdnYm1GdFpTd2dYQ0pmY21WaFpHRmliR1V1ZEhOMlhDSXBLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNiaUFnWEc0Z0lHbG1LRzV5YjNjb1lYTXVaR0YwWVM1bWNtRnRaU2hIVHlrcElDRTlJREFwZTF4dUlDQWdJQ01qSXlNalhHNGdJQ0FnWm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aVIwOWZYQ0lzSUc1aGJXVXBYRzRnSUNBZ2MzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJQ0FnY0hKcGJuUW9aRzkwY0d4dmRDaEhUeXdnYzJodmQwTmhkR1ZuYjNKNUlEMGdZMkYwWldkdmNubE9kVzBzSUhScGRHeGxJRDBnYm1GdFpTa2dLeUJjYmlBZ0lDQWdJQ0FnSUNBZ0lITmpZV3hsWDJOdmJHOXlYMk52Ym5ScGJuVnZkWE1vYkdsdGFYUnpJRDBnWXlnd0xDQXdMakExS1N3Z2JHOTNJRDBnWENKeVpXUmNJaXdnYUdsbmFDQTlJRndpWW14aFkydGNJaWtwWEc0Z0lDQWdaR1YyTG05bVppZ3BYRzRnSUNBZ2NHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lLVnh1SUNBZ0lIQnlhVzUwS0dSdmRIQnNiM1FvUjA4c0lITm9iM2REWVhSbFoyOXllU0E5SUdOaGRHVm5iM0o1VG5WdExDQjBhWFJzWlNBOUlHNWhiV1VwSUNzZ1hHNGdJQ0FnSUNBZ0lDQWdJQ0J6WTJGc1pWOWpiMnh2Y2w5amIyNTBhVzUxYjNWektHeHBiV2wwY3lBOUlHTW9NQ3dnTUM0d05Ta3NJR3h2ZHlBOUlGd2ljbVZrWENJc0lHaHBaMmdnUFNCY0ltSnNZV05yWENJcEtWeHVJQ0FnSUdSbGRpNXZabVlvS1Z4dUlDQjlJRnh1ZlZ4dVhHNWpiMjUyVUhaaGJIVmxJRHd0SUdaMWJtTjBhVzl1S0hCMllXeDFaU2w3WEc0Z0lHOTFkQ0E4TFNCcFptVnNjMlVvY0haaGJIVmxJRHdnTUM0d01EQXhMQ0JjSWlvcUtpcGNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9jSFpoYkhWbElEd2dNQzR3TURFc0lGd2lLaW9xWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2h3ZG1Gc2RXVWdQQ0F3TGpBeExDQmNJaW9xWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9jSFpoYkhWbElEd2dNQzR3TlN3Z1hDSXFYQ0lzSUZ3aWJuTmNJaWtwS1NsY2JpQWdjbVYwZFhKdUtHOTFkQ2xjYm4xY2JseHViRzloWkV4dmIzQkJibTV2UkdGMFlTQThMU0JtZFc1amRHbHZiaWhtYVd4bFRtRnRaU3dnWkdsbVprTjFkRzltWmlBOUlEQXVNaXdnWVc1dWIweHBjM1FnUFNCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJc0lGd2lVQzFUWENJc0lGd2lVQzFZWENJcEtYdGNiaUFnWkdGMFlTQThMU0JtY21WaFpDaG1hV3hsVG1GdFpTa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tMTFkR0YwWlNoMWNHUnZkMjVmWkZSQlIxOUVUVk5QSUQwZ2FXWmxiSE5sS0dScFptWmZaRlJCUjE5RVRWTlBJRDRnWkdsbVprTjFkRzltWml3Z1hDSlZVRndpTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dScFptWmZaRlJCUjE5RVRWTlBJRDRnTFdScFptWkRkWFJ2Wm1Zc0lGd2lUazljSWl3Z1hDSkVUMWRPWENJcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFZ3Wkc5M2JsOUJORGcxWDBSTlUwOGdQU0JwWm1Wc2MyVW9aR2xtWmw5Qk5EZzFYMFJOVTA4Z1BpQmthV1ptUTNWMGIyWm1MQ0JjSWxWUVhDSXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aR2xtWmw5Qk5EZzFYMFJOVTA4Z1BpQXRaR2xtWmtOMWRHOW1aaXdnWENKT1Qxd2lMQ0JjSWtSUFYwNWNJaWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1oyVnVaU0E5SUhOMGNuTndiR2wwS0dkbGJtVXNJQ2RjWEZ4Y2ZDY3BLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZabWxzZEdWeUtFRnVibTh5SUNWcGJpVWdJR0Z1Ym05TWFYTjBLVnh1SUNCa1lYUmhKSFZ3Wkc5M2JsOWtWRUZIWDBSTlUwOGdQQzBnWm1GamRHOXlLR1JoZEdFa2RYQmtiM2R1WDJSVVFVZGZSRTFUVHl3Z2JHVjJaV3h6SUQwZ1l5aGNJbFZRWENJc0lGd2lUazljSWl3Z1hDSkVUMWRPWENJcEtWeHVJQ0JrWVhSaEpIVndaRzkzYmw5Qk5EZzFYMFJOVTA4Z1BDMGdabUZqZEc5eUtHUmhkR0VrZFhCa2IzZHVYMEUwT0RWZlJFMVRUeXdnYkdWMlpXeHpJRDBnWXloY0lsVlFYQ0lzSUZ3aVRrOWNJaXdnWENKRVQxZE9YQ0lwS1Z4dUlDQmNiaUFnY21WMGRYSnVLR1JoZEdFcFhHNTlYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbkdPZGlyIDwtIGhlcmUoXFwuLi8uLlxcLCBcXHJlc3VsdFxcLCBcXGxvb3BcXCwgXFxHT1xcKVxuZGlyLmNyZWF0ZShHT2Rpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpXG5cbmdldEdPIDwtIGZ1bmN0aW9uKG5hbWUsIGZpZ0RpciwgZ2VuZUxpc3QsIGNhdGVnb3J5TnVtID0gMTUsIGhlaWdodCA9IDEwLCB3aWR0aCA9IDcpe1xuICBHTyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbiAgR08ucmVhZGFibGUgPC0gc2V0UmVhZGFibGUoR08sIE9yZ0RiID0gb3JnLk1tLmVnLmRiKVxuICBmd3JpdGUoYXMuZGF0YS5mcmFtZShHTyksIGhlcmUoR09kaXIsIHBhc3RlMChcXEdPX1xcLCBuYW1lLCBcXF9lbnNlbWJsLnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG4gIGZ3cml0ZShhcy5kYXRhLmZyYW1lKEdPLnJlYWRhYmxlKSwgaGVyZShHT2RpciwgcGFzdGUwKFxcR09fXFwsIG5hbWUsIFxcX3JlYWRhYmxlLnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG4gIFxuICBpZihucm93KGFzLmRhdGEuZnJhbWUoR08pKSAhPSAwKXtcbiAgICAjIyMjI1xuICAgIGZpbGVOYW1lIDwtIHBhc3RlMChcXEdPX1xcLCBuYW1lKVxuICAgIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICAgIHByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IGNhdGVnb3J5TnVtLCB0aXRsZSA9IG5hbWUpICsgXG4gICAgICAgICAgICBzY2FsZV9jb2xvcl9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMC4wNSksIGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsYWNrXFwpKVxuICAgIGRldi5vZmYoKVxuICAgIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgsIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXClcbiAgICBwcmludChkb3RwbG90KEdPLCBzaG93Q2F0ZWdvcnkgPSBjYXRlZ29yeU51bSwgdGl0bGUgPSBuYW1lKSArIFxuICAgICAgICAgICAgc2NhbGVfY29sb3JfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDAuMDUpLCBsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibGFja1xcKSlcbiAgICBkZXYub2ZmKClcbiAgfSBcbn1cblxuY29udlB2YWx1ZSA8LSBmdW5jdGlvbihwdmFsdWUpe1xuICBvdXQgPC0gaWZlbHNlKHB2YWx1ZSA8IDAuMDAwMSwgXFwqKioqXFwsXG4gICAgICAgICAgICAgICAgaWZlbHNlKHB2YWx1ZSA8IDAuMDAxLCBcXCoqKlxcLFxuICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocHZhbHVlIDwgMC4wMSwgXFwqKlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHB2YWx1ZSA8IDAuMDUsIFxcKlxcLCBcXG5zXFwpKSkpXG4gIHJldHVybihvdXQpXG59XG5cbmxvYWRMb29wQW5ub0RhdGEgPC0gZnVuY3Rpb24oZmlsZU5hbWUsIGRpZmZDdXRvZmYgPSAwLjIsIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSl7XG4gIGRhdGEgPC0gZnJlYWQoZmlsZU5hbWUpICU+JVxuICAgIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgICB1cGRvd25fQTQ4NV9ETVNPID0gaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSxcbiAgICAgICAgICAgICAgICAgIGdlbmUgPSBzdHJzcGxpdChnZW5lLCAnXFxcXHwnKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lICBhbm5vTGlzdClcbiAgZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbiAgZGF0YSR1cGRvd25fQTQ4NV9ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9BNDg1X0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbiAgXG4gIHJldHVybihkYXRhKVxufVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
GOdir <- here(\../..\, \result\, \loop\, \GO\)
dir.create(GOdir, showWarnings = FALSE, recursive = TRUE)

getGO <- function(name, figDir, geneList, categoryNum = 15, height = 10, width = 7){
  GO <- enrichGO(gene = geneList, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
  GO.readable <- setReadable(GO, OrgDb = org.Mm.eg.db)
  fwrite(as.data.frame(GO), here(GOdir, paste0(\GO_\, name, \_ensembl.tsv\)), sep = \\t\)
  fwrite(as.data.frame(GO.readable), here(GOdir, paste0(\GO_\, name, \_readable.tsv\)), sep = \\t\)
  
  if(nrow(as.data.frame(GO)) != 0){
    #####
    fileName <- paste0(\GO_\, name)
    svglite(here(figDir, paste0(fileName, \.svg\)), height = height, width = width)
    print(dotplot(GO, showCategory = categoryNum, title = name) + 
            scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))
    dev.off()
    png(here(figDir, paste0(fileName, \.png\)), height = height, width = width, res = 600, unit = \in\)
    print(dotplot(GO, showCategory = categoryNum, title = name) + 
            scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))
    dev.off()
  } 
}

convPvalue <- function(pvalue){
  out <- ifelse(pvalue < 0.0001, \****\,
                ifelse(pvalue < 0.001, \***\,
                       ifelse(pvalue < 0.01, \**\,
                              ifelse(pvalue < 0.05, \*\, \ns\))))
  return(out)
}

loadLoopAnnoData <- function(fileName, diffCutoff = 0.2, annoList = c(\P-P\, \P-E\, \P-S\, \P-X\)){
  data <- fread(fileName) %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  gene = strsplit(gene, '\\|')) %>%
    dplyr::filter(Anno2 %in%  annoList)
  data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  
  return(data)
}



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVIwOWthWElnUEMwZ2FHVnlaU2hjWEM0dUx5NHVYRndzSUZ4Y2NtVnpkV3gwWEZ3c0lGeGNiRzl2Y0Z4Y0xDQmNYRWRQWEZ3cFhHNWthWEl1WTNKbFlYUmxLRWRQWkdseUxDQnphRzkzVjJGeWJtbHVaM01nUFNCR1FVeFRSU3dnY21WamRYSnphWFpsSUQwZ1ZGSlZSU2xjYmx4dVoyVjBSMDhnUEMwZ1puVnVZM1JwYjI0b2JtRnRaU3dnWm1sblJHbHlMQ0JuWlc1bFRHbHpkQ3dnWTJGMFpXZHZjbmxPZFcwZ1BTQXhOU3dnYUdWcFoyaDBJRDBnTVRBc0lIZHBaSFJvSUQwZ055bDdYRzRnSUVkUElEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsVEdsemRDd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjS1Z4dUlDQkhUeTV5WldGa1lXSnNaU0E4TFNCelpYUlNaV0ZrWVdKc1pTaEhUeXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJcFhHNGdJR1ozY21sMFpTaGhjeTVrWVhSaExtWnlZVzFsS0VkUEtTd2dhR1Z5WlNoSFQyUnBjaXdnY0dGemRHVXdLRnhjUjA5ZlhGd3NJRzVoYldVc0lGeGNYMlZ1YzJWdFltd3VkSE4yWEZ3cEtTd2djMlZ3SUQwZ1hGeGNYSFJjWENsY2JpQWdabmR5YVhSbEtHRnpMbVJoZEdFdVpuSmhiV1VvUjA4dWNtVmhaR0ZpYkdVcExDQm9aWEpsS0VkUFpHbHlMQ0J3WVhOMFpUQW9YRnhIVDE5Y1hDd2dibUZ0WlN3Z1hGeGZjbVZoWkdGaWJHVXVkSE4yWEZ3cEtTd2djMlZ3SUQwZ1hGeGNYSFJjWENsY2JpQWdYRzRnSUdsbUtHNXliM2NvWVhNdVpHRjBZUzVtY21GdFpTaEhUeWtwSUNFOUlEQXBlMXh1SUNBZ0lDTWpJeU1qWEc0Z0lDQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjUjA5ZlhGd3NJRzVoYldVcFhHNGdJQ0FnYzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lDQWdjSEpwYm5Rb1pHOTBjR3h2ZENoSFR5d2djMmh2ZDBOaGRHVm5iM0o1SUQwZ1kyRjBaV2R2Y25sT2RXMHNJSFJwZEd4bElEMGdibUZ0WlNrZ0t5QmNiaUFnSUNBZ0lDQWdJQ0FnSUhOallXeGxYMk52Ykc5eVgyTnZiblJwYm5WdmRYTW9iR2x0YVhSeklEMGdZeWd3TENBd0xqQTFLU3dnYkc5M0lEMGdYRnh5WldSY1hDd2dhR2xuYUNBOUlGeGNZbXhoWTJ0Y1hDa3BYRzRnSUNBZ1pHVjJMbTltWmlncFhHNGdJQ0FnY0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0tWeHVJQ0FnSUhCeWFXNTBLR1J2ZEhCc2IzUW9SMDhzSUhOb2IzZERZWFJsWjI5eWVTQTlJR05oZEdWbmIzSjVUblZ0TENCMGFYUnNaU0E5SUc1aGJXVXBJQ3NnWEc0Z0lDQWdJQ0FnSUNBZ0lDQnpZMkZzWlY5amIyeHZjbDlqYjI1MGFXNTFiM1Z6S0d4cGJXbDBjeUE5SUdNb01Dd2dNQzR3TlNrc0lHeHZkeUE5SUZ4Y2NtVmtYRndzSUdocFoyZ2dQU0JjWEdKc1lXTnJYRndwS1Z4dUlDQWdJR1JsZGk1dlptWW9LVnh1SUNCOUlGeHVmVnh1WEc1amIyNTJVSFpoYkhWbElEd3RJR1oxYm1OMGFXOXVLSEIyWVd4MVpTbDdYRzRnSUc5MWRDQThMU0JwWm1Wc2MyVW9jSFpoYkhWbElEd2dNQzR3TURBeExDQmNYQ29xS2lwY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb2NIWmhiSFZsSUR3Z01DNHdNREVzSUZ4Y0tpb3FYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaHdkbUZzZFdVZ1BDQXdMakF4TENCY1hDb3FYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb2NIWmhiSFZsSUR3Z01DNHdOU3dnWEZ3cVhGd3NJRnhjYm5OY1hDa3BLU2xjYmlBZ2NtVjBkWEp1S0c5MWRDbGNibjFjYmx4dWJHOWhaRXh2YjNCQmJtNXZSR0YwWVNBOExTQm1kVzVqZEdsdmJpaG1hV3hsVG1GdFpTd2daR2xtWmtOMWRHOW1aaUE5SURBdU1pd2dZVzV1YjB4cGMzUWdQU0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndzSUZ4Y1VDMVRYRndzSUZ4Y1VDMVlYRndwS1h0Y2JpQWdaR0YwWVNBOExTQm1jbVZoWkNobWFXeGxUbUZ0WlNrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2gxY0dSdmQyNWZaRlJCUjE5RVRWTlBJRDBnYVdabGJITmxLR1JwWm1aZlpGUkJSMTlFVFZOUElENGdaR2xtWmtOMWRHOW1aaXdnWEZ4VlVGeGNMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR1JwWm1aZlpGUkJSMTlFVFZOUElENGdMV1JwWm1aRGRYUnZabVlzSUZ4Y1RrOWNYQ3dnWEZ4RVQxZE9YRndwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIVndaRzkzYmw5Qk5EZzFYMFJOVTA4Z1BTQnBabVZzYzJVb1pHbG1abDlCTkRnMVgwUk5VMDhnUGlCa2FXWm1RM1YwYjJabUxDQmNYRlZRWEZ3c0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1pHbG1abDlCTkRnMVgwUk5VMDhnUGlBdFpHbG1aa04xZEc5bVppd2dYRnhPVDF4Y0xDQmNYRVJQVjA1Y1hDa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjJWdVpTQTlJSE4wY25Od2JHbDBLR2RsYm1Vc0lDZGNYRnhjZkNjcEtTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHlJQ1ZwYmlVZ0lHRnVibTlNYVhOMEtWeHVJQ0JrWVhSaEpIVndaRzkzYmw5a1ZFRkhYMFJOVTA4Z1BDMGdabUZqZEc5eUtHUmhkR0VrZFhCa2IzZHVYMlJVUVVkZlJFMVRUeXdnYkdWMlpXeHpJRDBnWXloY1hGVlFYRndzSUZ4Y1RrOWNYQ3dnWEZ4RVQxZE9YRndwS1Z4dUlDQmtZWFJoSkhWd1pHOTNibDlCTkRnMVgwUk5VMDhnUEMwZ1ptRmpkRzl5S0dSaGRHRWtkWEJrYjNkdVgwRTBPRFZmUkUxVFR5d2diR1YyWld4eklEMGdZeWhjWEZWUVhGd3NJRnhjVGs5Y1hDd2dYRnhFVDFkT1hGd3BLVnh1SUNCY2JpQWdjbVYwZFhKdUtHUmhkR0VwWEc1OVhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbkdPZGlyIDwtIGhlcmUoXFwuLi8uLlxcLCBcXHJlc3VsdFxcLCBcXGxvb3BcXCwgXFxHT1xcKVxuZGlyLmNyZWF0ZShHT2Rpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpXG5cbmdldEdPIDwtIGZ1bmN0aW9uKG5hbWUsIGZpZ0RpciwgZ2VuZUxpc3QsIGNhdGVnb3J5TnVtID0gMTUsIGhlaWdodCA9IDEwLCB3aWR0aCA9IDcpe1xuICBHTyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbiAgR08ucmVhZGFibGUgPC0gc2V0UmVhZGFibGUoR08sIE9yZ0RiID0gb3JnLk1tLmVnLmRiKVxuICBmd3JpdGUoYXMuZGF0YS5mcmFtZShHTyksIGhlcmUoR09kaXIsIHBhc3RlMChcXEdPX1xcLCBuYW1lLCBcXF9lbnNlbWJsLnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG4gIGZ3cml0ZShhcy5kYXRhLmZyYW1lKEdPLnJlYWRhYmxlKSwgaGVyZShHT2RpciwgcGFzdGUwKFxcR09fXFwsIG5hbWUsIFxcX3JlYWRhYmxlLnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG4gIFxuICBpZihucm93KGFzLmRhdGEuZnJhbWUoR08pKSAhPSAwKXtcbiAgICAjIyMjI1xuICAgIGZpbGVOYW1lIDwtIHBhc3RlMChcXEdPX1xcLCBuYW1lKVxuICAgIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICAgIHByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IGNhdGVnb3J5TnVtLCB0aXRsZSA9IG5hbWUpICsgXG4gICAgICAgICAgICBzY2FsZV9jb2xvcl9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMC4wNSksIGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsYWNrXFwpKVxuICAgIGRldi5vZmYoKVxuICAgIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgsIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXClcbiAgICBwcmludChkb3RwbG90KEdPLCBzaG93Q2F0ZWdvcnkgPSBjYXRlZ29yeU51bSwgdGl0bGUgPSBuYW1lKSArIFxuICAgICAgICAgICAgc2NhbGVfY29sb3JfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDAuMDUpLCBsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibGFja1xcKSlcbiAgICBkZXYub2ZmKClcbiAgfSBcbn1cblxuY29udlB2YWx1ZSA8LSBmdW5jdGlvbihwdmFsdWUpe1xuICBvdXQgPC0gaWZlbHNlKHB2YWx1ZSA8IDAuMDAwMSwgXFwqKioqXFwsXG4gICAgICAgICAgICAgICAgaWZlbHNlKHB2YWx1ZSA8IDAuMDAxLCBcXCoqKlxcLFxuICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocHZhbHVlIDwgMC4wMSwgXFwqKlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHB2YWx1ZSA8IDAuMDUsIFxcKlxcLCBcXG5zXFwpKSkpXG4gIHJldHVybihvdXQpXG59XG5cbmxvYWRMb29wQW5ub0RhdGEgPC0gZnVuY3Rpb24oZmlsZU5hbWUsIGRpZmZDdXRvZmYgPSAwLjIsIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSl7XG4gIGRhdGEgPC0gZnJlYWQoZmlsZU5hbWUpICU+JVxuICAgIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgICB1cGRvd25fQTQ4NV9ETVNPID0gaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSxcbiAgICAgICAgICAgICAgICAgIGdlbmUgPSBzdHJzcGxpdChnZW5lLCAnXFxcXHwnKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lICBhbm5vTGlzdClcbiAgZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbiAgZGF0YSR1cGRvd25fQTQ4NV9ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9BNDg1X0RNU08sIGxldmVscyA9IGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSlcbiAgXG4gIHJldHVybihkYXRhKVxufVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuR09kaXIgPC0gaGVyZShcXC4uLy4uXFwsIFxccmVzdWx0XFwsIFxcbG9vcFxcLCBcXEdPXFwpXG5kaXIuY3JlYXRlKEdPZGlyLCBzaG93V2FybmluZ3MgPSBGQUxTRSwgcmVjdXJzaXZlID0gVFJVRSlcblxuZ2V0R08gPC0gZnVuY3Rpb24obmFtZSwgZmlnRGlyLCBnZW5lTGlzdCwgY2F0ZWdvcnlOdW0gPSAxNSwgaGVpZ2h0ID0gMTAsIHdpZHRoID0gNyl7XG4gIEdPIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuICBHTy5yZWFkYWJsZSA8LSBzZXRSZWFkYWJsZShHTywgT3JnRGIgPSBvcmcuTW0uZWcuZGIpXG4gIGZ3cml0ZShhcy5kYXRhLmZyYW1lKEdPKSwgaGVyZShHT2RpciwgcGFzdGUwKFxcR09fXFwsIG5hbWUsIFxcX2Vuc2VtYmwudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcbiAgZndyaXRlKGFzLmRhdGEuZnJhbWUoR08ucmVhZGFibGUpLCBoZXJlKEdPZGlyLCBwYXN0ZTAoXFxHT19cXCwgbmFtZSwgXFxfcmVhZGFibGUudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcbiAgXG4gIGlmKG5yb3coYXMuZGF0YS5mcmFtZShHTykpICE9IDApe1xuICAgICMjIyMjXG4gICAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcR09fXFwsIG5hbWUpXG4gICAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gICAgcHJpbnQoZG90cGxvdChHTywgc2hvd0NhdGVnb3J5ID0gY2F0ZWdvcnlOdW0sIHRpdGxlID0gbmFtZSkgKyBcbiAgICAgICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gXFxyZWRcXCwgaGlnaCA9IFxcYmxhY2tcXCkpXG4gICAgZGV2Lm9mZigpXG4gICAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcKVxuICAgIHByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IGNhdGVnb3J5TnVtLCB0aXRsZSA9IG5hbWUpICsgXG4gICAgICAgICAgICBzY2FsZV9jb2xvcl9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMC4wNSksIGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsYWNrXFwpKVxuICAgIGRldi5vZmYoKVxuICB9IFxufVxuXG5jb252UHZhbHVlIDwtIGZ1bmN0aW9uKHB2YWx1ZSl7XG4gIG91dCA8LSBpZmVsc2UocHZhbHVlIDwgMC4wMDAxLCBcXCoqKipcXCxcbiAgICAgICAgICAgICAgICBpZmVsc2UocHZhbHVlIDwgMC4wMDEsIFxcKioqXFwsXG4gICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdmFsdWUgPCAwLjAxLCBcXCoqXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocHZhbHVlIDwgMC4wNSwgXFwqXFwsIFxcbnNcXCkpKSlcbiAgcmV0dXJuKG91dClcbn1cblxubG9hZExvb3BBbm5vRGF0YSA8LSBmdW5jdGlvbihmaWxlTmFtZSwgZGlmZkN1dG9mZiA9IDAuMiwgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKXtcbiAgZGF0YSA8LSBmcmVhZChmaWxlTmFtZSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZSh1cGRvd25fZFRBR19ETVNPID0gaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSxcbiAgICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiBkaWZmQ3V0b2ZmLCBcXFVQXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpLFxuICAgICAgICAgICAgICAgICAgZ2VuZSA9IHN0cnNwbGl0KGdlbmUsICdcXFxcfCcpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgIGFubm9MaXN0KVxuICBkYXRhJHVwZG93bl9kVEFHX0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX2RUQUdfRE1TTywgbGV2ZWxzID0gYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpKVxuICBkYXRhJHVwZG93bl9BNDg1X0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX0E0ODVfRE1TTywgbGV2ZWxzID0gYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpKVxuICBcbiAgcmV0dXJuKGRhdGEpXG59XG5gYGBcbmBgYCJ9 -->

```r
```r
GOdir <- here(\../..\, \result\, \loop\, \GO\)
dir.create(GOdir, showWarnings = FALSE, recursive = TRUE)

getGO <- function(name, figDir, geneList, categoryNum = 15, height = 10, width = 7){
  GO <- enrichGO(gene = geneList, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
  GO.readable <- setReadable(GO, OrgDb = org.Mm.eg.db)
  fwrite(as.data.frame(GO), here(GOdir, paste0(\GO_\, name, \_ensembl.tsv\)), sep = \\t\)
  fwrite(as.data.frame(GO.readable), here(GOdir, paste0(\GO_\, name, \_readable.tsv\)), sep = \\t\)
  
  if(nrow(as.data.frame(GO)) != 0){
    #####
    fileName <- paste0(\GO_\, name)
    svglite(here(figDir, paste0(fileName, \.svg\)), height = height, width = width)
    print(dotplot(GO, showCategory = categoryNum, title = name) + 
            scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))
    dev.off()
    png(here(figDir, paste0(fileName, \.png\)), height = height, width = width, res = 600, unit = \in\)
    print(dotplot(GO, showCategory = categoryNum, title = name) + 
            scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))
    dev.off()
  } 
}

convPvalue <- function(pvalue){
  out <- ifelse(pvalue < 0.0001, \****\,
                ifelse(pvalue < 0.001, \***\,
                       ifelse(pvalue < 0.01, \**\,
                              ifelse(pvalue < 0.05, \*\, \ns\))))
  return(out)
}

loadLoopAnnoData <- function(fileName, diffCutoff = 0.2, annoList = c(\P-P\, \P-E\, \P-S\, \P-X\)){
  data <- fread(fileName) %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  gene = strsplit(gene, '\\|')) %>%
    dplyr::filter(Anno2 %in%  annoList)
  data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  
  return(data)
}
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

### [2.9] Size distribution of diff loops


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHViRzl2Y0ZSNWNHVWdQQzBnWENKd0xXNWNJbHh1WEc0aklHZGxkSFJwYm1jZ2JHbHpkQ0J2WmlCblpXNWxjeUJ2WmlCcGJuUmxjbVZ6ZENCbWNtOXRJRkpPUVMxelpYRWdZVzVrSUZCU1R5MXpaWEZjYm1Gc2NHaGhJRHd0SURBdU1EVmNibVpqUTNWMGIyWm1JRHd0SURBdU5WeHVaR2xtWmk1UVVrOHVSekV1WkZSQlJ5QThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKa2FXWm1YMGN4UnpJdVpGUkJSMTlITVM1a1ZFRkhYM1p6WDBjeExrUk5VMDlmVUZKUGMyVnhMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY0dGa2FpQThJR0ZzY0doaExDQmhZbk1vYzJoeWFXNXJaV1JmYkc5bk1rWkRLU0ErSUdaalEzVjBiMlptS1Z4dVpHbG1aaTVRVWs4dVJ6SXVaRlJCUnlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0prYVdabVgwY3hSekl1WkZSQlIxOUhNaTVrVkVGSFgzWnpYMGN5TGtSTlUwOWZVRkpQYzJWeExuUnpkbHdpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jR0ZrYWlBOElHRnNjR2hoTENCaFluTW9jMmh5YVc1clpXUmZiRzluTWtaREtTQStJR1pqUTNWMGIyWm1LVnh1WkdsbVppNVNUa0V1UnpFdVpGUkJSeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSmthV1ptWDBjeExtUlVRVWRmUnpFdU1ta3VaRlJCUjE5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY0dGa2FpQThJR0ZzY0doaExDQmhZbk1vYzJoeWFXNXJaV1JmYkc5bk1rWkRLU0ErSUdaalEzVjBiMlptS1Z4dVpHbG1aaTVTVGtFdVJ6RXVaRlJCUnk1dWIwWkRZM1YwYjJabUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1ScFptWmZSekV1WkZSQlIxOUhNUzR5YVM1a1ZFRkhYM1p6WDBjeExqSnBMa1JOVTA4dWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaHdZV1JxSUR3Z1lXeHdhR0VwWEc0aklFbHRjRzl5ZEdsdVp5QnNiMjl3SUdkbGJtVWdZVzV1YjNSaGRHbHZibHh1Ym1GdFpTQThMU0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjSWx4dVhHNWthV1ptUTNWMGIyWm1JRHd0SURBdU1seHVaMlZ1WlVGdWJtOUVZWFJoSUR3dElHeHZZV1JNYjI5d1FXNXViMFJoZEdFb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjSWw5d0xXNWZaVzV6WlcxaWJFeHBjM1F1ZEhOMlhDSXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHbG1aa04xZEc5bVppQTlJR1JwWm1aRGRYUnZabVlzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnVibTlNYVhOMElEMGdZeWhjSWxBdFVGd2lMQ0JjSWxBdFJWd2lMQ0JjSWxBdFUxd2lMQ0JjSWxBdFdGd2lLU2tsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVNsY2JpTWdaMlZ1WlVGdWJtOUVZWFJoSUR3dElHeHZZV1JNYjI5d1FXNXViMFJoZEdFb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjSWw5d0xXNWZaVzV6WlcxaWJFeHBjM1F1ZEhOMlhDSXBLU3hjYmlNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptUTNWMGIyWm1JRDBnWkdsbVprTjFkRzltWml4Y2JpTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hDSlFMVkJjSWlrcEpUNGxJRnh1SXlBZ0lHUndiSGx5T2pwdGRYUmhkR1VvWkdsemRHRnVZMlVnUFNCemRHRnlkRElnTFNCemRHRnlkREVwWEc0aklGUmxjM1JwYm1jZ1pHbG1abVZ5Wlc1MElIZGhlWE1nZEc4Z1kyRnNZM1ZzWVhSbElISmxjSEpsYzJWdWRHRjBhWFpsSUdabFlYUjFjbVVnYjJZZ2JHOXZjSE1nWm05eUlHVmhZMmdnWjJWdVpWeHVaR2xtWmk1U1RrRWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVpHbG1abDlITVM1a1ZFRkhYMGN4TGpKcExtUlVRVWRmZG5OZlJ6RXVNbWt1UkUxVFR5NTBjM1pjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR1Z1YzJWdFlteGZaMlZ1WlY5cFpDd2diRzluTWtadmJHUkRhR0Z1WjJVc0lITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2NHRmthaXdnWlhoMFpYSnVZV3hmWjJWdVpWOXVZVzFsS1Z4dVoyVnVaVXhwYzNRdVpHOTNiaUE4TFNCMWJtbHhkV1VvWXlnb1pHbG1aaTVTVGtFdVJ6RXVaRlJCUnlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUENBd0tTa2taVzV6WlcxaWJGOW5aVzVsWDJsa0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQW9aR2xtWmk1UVVrOHVSekV1WkZSQlJ5QWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FvWkdsbVppNVFVazh1UnpJdVpGUkJSeUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0F3S1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrS1NsY2JtZGxibVZNYVhOMExtUnZkMjR1VWs1QklEd3RJQ2hrYVdabUxsSk9RUzVITVM1a1ZFRkhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSE5vY21sdWEyVmtYMnh2WnpKR1F5QThJREFwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1JjYm1kbGJtVk1hWE4wTG1SdmQyNHVVazVCTG01dlJrTmpkWFJ2Wm1ZZ1BDMGdLR1JwWm1ZdVVrNUJMa2N4TG1SVVFVY3VibTlHUTJOMWRHOW1aaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0F3S1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrWEc1blpXNWxUR2x6ZEM1MWNHUnZkMjR1VWs1QkxtNXZSa05qZFhSdlptWWdQQzBnS0dScFptWXVVazVCTGtjeExtUlVRVWN1Ym05R1EyTjFkRzltWmlra1pXNXpaVzFpYkY5blpXNWxYMmxrWEc1Y2JtZGxibVZNYVhOMExuVndJRHd0SUhWdWFYRjFaU2hqS0Noa2FXWm1MbEpPUVM1SE1TNWtWRUZISUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hOb2NtbHVhMlZrWDJ4dlp6SkdReUErSURBcEtTUmxibk5sYldKc1gyZGxibVZmYVdRc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBb1pHbG1aaTVRVWs4dVJ6RXVaRlJCUnlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUGlBd0tTa2taVzV6WlcxaWJGOW5aVzVsWDJsa0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tHUnBabVl1VUZKUExrY3lMbVJVUVVjZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUQ0Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpDa3BYRzVjYmx4dUl5QmJNVjBnUVhabGNtRm5aU0J2WmlCa2FXWm1aWEpsYm5ScFlXd2diRzl2Y0NCelkyOXlaWE1nWm05eUlHVmhZMmdnWjJWdVpWeHVJeU1nVWs1QklHOXViSGxjYm1aalEzVjBiMlptSUR3dElEQXVOVnh1WVd4d2FHRWdQQzBnTUM0d05WeHViV0Y0VEc5bk1rWkRJRHd0SURKY2JseHVkR1Z0Y0NBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsbVpsOWtWRUZIWDBSTlUwOHNJR2RsYm1VcElDVStKU0JjYmlBZ2RXNXVaWE4wS0dkbGJtVXBJQ1UrSlNCbmNtOTFjRjlpZVNoblpXNWxLU0FsUGlWY2JpQWdjM1Z0YldGeWFYcGxLRzFsWVc1ZlpHbG1abDl6WTI5eVpTQTlJRzFsWVc0b1pHbG1abDlrVkVGSFgwUk5VMDhwTENBdVozSnZkWEJ6SUQwZ0oyUnliM0FuS1Z4dVhHNTBaVzF3SUR3dElHeGxablJmYW05cGJpaDBaVzF3TENCa2FXWm1MbEpPUVN3Z1lua2dQU0JqS0Z3aVoyVnVaVndpSUQwZ1hDSmxibk5sYldKc1gyZGxibVZmYVdSY0lpa3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobWJHRm5JRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bFRHbHpkQzVrYjNkdUxsSk9RU3dnWENJeVJFOVhUbHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQmpLQ2tzSUZ3aU1WVlFYQ0lzSUZ3aU1FNVBYQ0lwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYaEdiR0ZuSUQwZ0tHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnYldGNFRHOW5Na1pES1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFISnNiMmN5Wm1OTllYZ2dQU0J3YldGNEtIQnRhVzRvYzJoeWFXNXJaV1JmYkc5bk1rWkRMQ0J0WVhoTWIyY3lSa01wTENBdGJXRjRURzluTWtaREtTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNllYSnlZVzVuWlNobWJHRm5LVnh1WEc0alpuZHlhWFJsS0hSbGJYQXNJR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1kbGJtVmZZWFpuVTJOdmNtVmZabU5mWkZSQlIxOXdMVzR1ZEhOMlhDSXBMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUtWeHVYRzRqWEc0aklIQWdQQzBnWjJkd2JHOTBLSFJsYlhBc0lHRmxjeWg0SUQwZ2MyaHliRzluTW1aalRXRjRMQ0I1SUQwZ2JXVmhibDlrYVdabVgzTmpiM0psTENCamIyeHZjaUE5SUdac1lXY3NYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOUlHbG1aV3h6WlNobWJHRm5JQ0U5SUZ3aU1FNVBYQ0lzSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlN3Z1RrRXBMRnh1SXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmhoY0dVZ1BTQmhjeTVtWVdOMGIzSW9iV0Y0Um14aFp5a3BLU0FyWEc0aklDQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1oyVnZiVjkwWlhoMFgzSmxjR1ZzS0NrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJeUFnSUdkbmRHbDBiR1VvWENKa1ZFRkhYQ0lwSUN0Y2JpTWdJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0aklDQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGpJQ0FnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdMU0JrYVdabVEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlNZ0lDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRqSUNBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnWm1ORGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SXlBZ0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUMxbVkwTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJoYzJobFpGd2lLU0FyWEc0aklDQWdjMk5oYkdWZlkyOXNiM0pmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENJd1RrOWNJaUE5SUZ3aVozSmxlVndpTENCY0lqRlZVRndpSUQwZ1hDSnlaV1JjSWl3Z1hDSXlSRTlYVGx3aUlEMGdYQ0ppYkhWbFhDSXBLU0FySUNBaklFTnZjbkpsWTNSbFpDQmpiMnh2Y2lCdFlYQndhVzVuWEc0aklDQWdjMk5oYkdWZmMyaGhjR1ZmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENKVVVsVkZYQ0lnUFNBeUxDQmNJa1pCVEZORlhDSWdQU0F4T1NrcFhHNGpYRzRqSUdacGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0lteHZaekpHUTE5MmMxOWhkbWRUWTI5eVpWOWtWRUZIWDF3aUxDQnNiMjl3Vkhsd1pTd2dYQ0pmWkdsbVprTjFkRzltWmw5Y0lpd2daR2xtWmtOMWRHOW1aaWxjYmlNZ2FHVnBaMmgwSUR3dElEUmNiaU1nZDJsa2RHZ2dQQzBnTjF4dUl5QndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0aklIQnlhVzUwS0hBcFhHNGpJR1JsZGk1dlptWW9LVnh1SXlCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGpJSEJ5YVc1MEtIQXBYRzRqSUdSbGRpNXZabVlvS1Z4dVhHNGpJRTV2SUVaRElHTjFkRzltWmlCdmNIUnBiMjRnTFNCa2IzZHVJRzl1YkhsY2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwWm1aZlpGUkJSMTlFVFZOUExDQm5aVzVsS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaHRaV0Z1WDJScFptWmZjMk52Y21VZ1BTQnRaV0Z1S0dScFptWmZaRlJCUjE5RVRWTlBLU3dnTG1keWIzVndjeUE5SUNka2NtOXdKeWxjYmx4dWRHVnRjQ0E4TFNCc1pXWjBYMnB2YVc0b2RHVnRjQ3dnWkdsbVppNVNUa0VzSUdKNUlEMGdZeWhjSW1kbGJtVmNJaUE5SUZ3aVpXNXpaVzFpYkY5blpXNWxYMmxrWENJcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWm14aFp5QTlJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVaRzkzYmk1U1RrRXVibTlHUTJOMWRHOW1aaXdnWENJeVJFOVhUbHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQmpLQ2tzSUZ3aU1WVlFYQ0lzSUZ3aU1FNVBYQ0lwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYaEdiR0ZuSUQwZ0tHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnYldGNFRHOW5Na1pES1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFISnNiMmN5Wm1OTllYZ2dQU0J3YldGNEtIQnRhVzRvYzJoeWFXNXJaV1JmYkc5bk1rWkRMQ0J0WVhoTWIyY3lSa01wTENBdGJXRjRURzluTWtaREtTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNllYSnlZVzVuWlNobWJHRm5LVnh1WEc0aklHWjNjbWwwWlNoMFpXMXdMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRndpWjJWdVpWOWhkbWRUWTI5eVpWOW1ZMTlrVkVGSFgxd2lMQ0JzYjI5d1ZIbHdaU3dnWENKZmJtOUdRMk4xZEc5bVppNTBjM1pjSWlrcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2VTQTlJRzFsWVc1ZlpHbG1abDl6WTI5eVpTd2dZMjlzYjNJZ1BTQm1iR0ZuTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWVdKbGJDQTlJR2xtWld4elpTaG1iR0ZuSUNFOUlGd2lNRTVQWENJc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTd2dUa0VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vWVhCbElEMGdZWE11Wm1GamRHOXlLRzFoZUVac1lXY3BLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLSE5wZW1VZ1BTQXhMQ0JoYkhCb1lTQTlJREVzWEc0Z0lDQWdJQ0J6ZEhKdmEyVWdQU0F3S1NBcklHZGxiMjFmZEdWNGRGOXlaWEJsYkNncElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDc2dYRzRnSUdkMWFXUmxjeWhqYjJ4dmNpQTlJRndpYm05dVpWd2lMQ0J6YUdGd1pTQTlJRndpYm05dVpWd2lLU0FySUZ4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENJcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdZeWhrYVdabVEzVjBiMlptTENBdFpHbG1aa04xZEc5bVppa3NJR3hwYm1WMGVYQmxJRDBnWENKa1lYTm9aV1JjSWl3Z1lXeHdhR0VnUFNBeExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0JqS0daalEzVjBiMlptTENBdFptTkRkWFJ2Wm1ZcExDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lzSUdGc2NHaGhJRDBnTVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJaWtnSzF4dUlDQjBhR1Z0WlNoY2JpQWdJQ0JoZUdsekxuUnBkR3hsTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVk5MRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJwZEd4bExua2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpWEc0Z0lDQWdLU3dnSUNBZ1hHNGdJQ0FnWVhocGN5NXNhVzVsSUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXhjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHbGphM01nUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWENKMGNtRnVjM0JoY21WdWRGd2lLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5a3NYRzRnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtWeHVJQ0FwSUNzZ2JHRmljeWg1SUQwZ1hDSkJkbWN1SU02VUlHeHZiM0FnYzJOdmNtVmNJaXdnZUNBOUlGd2liRzluTWloemFISjFibXRsYmlCR1F5bGNJaWtnSzF4dUlDQnpZMkZzWlY5amIyeHZjbDl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWpCT1Qxd2lJRDBnWENJalFUbEJPRUU1WENJc0lGd2lNVlZRWENJZ1BTQmNJaU5EUWpNek0wRmNJaXdnWENJeVJFOVhUbHdpSUQwZ1hDSWpORGcxTWtFd1hDSXBLU0FySUNBaklFTnZjbkpsWTNSbFpDQmpiMnh2Y2lCdFlYQndhVzVuWEc0Z0lITmpZV3hsWDNOb1lYQmxYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRndpVkZKVlJWd2lJRDBnTWl3Z1hDSkdRVXhUUlZ3aUlEMGdNVGtwS1Z4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0pzYjJjeVJrTmZkbk5mWVhablUyTnZjbVZmWkZSQlIxOWNJaXdnYkc5dmNGUjVjR1VzSUZ3aVgyUnBabVpEZFhSdlptWmZYQ0lzSUdScFptWkRkWFJ2Wm1Zc0lGd2lYMjV2UmtOamRYUnZabVpjSWlsY2JtaGxhV2RvZENBOExTQTBNaXB0YlZSdlNXNWphRnh1ZDJsa2RHZ2dQQzBnTlRBcWJXMVViMGx1WTJoY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dUl5Qk9ieUJHUXlCamRYUnZabVlnYjNCMGFXOXVJQzBnZFhBZ1lXNWtJR1J2ZDI1Y2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwWm1aZlpGUkJSMTlFVFZOUExDQm5aVzVsS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaHRaV0Z1WDJScFptWmZjMk52Y21VZ1BTQnRaV0Z1S0dScFptWmZaRlJCUjE5RVRWTlBLU3dnTG1keWIzVndjeUE5SUNka2NtOXdKeWxjYmx4dWRHVnRjQ0E4TFNCc1pXWjBYMnB2YVc0b2RHVnRjQ3dnWkdsbVppNVNUa0VzSUdKNUlEMGdZeWhjSW1kbGJtVmNJaUE5SUZ3aVpXNXpaVzFpYkY5blpXNWxYMmxrWENJcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWm14aFp5QTlJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVkWEJrYjNkdUxsSk9RUzV1YjBaRFkzVjBiMlptTENCY0lqSkVUMWRPWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR01vS1N3Z1hDSXhWVkJjSWl3Z1hDSXdUazljSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhlRVpzWVdjZ1BTQW9ZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCdFlYaE1iMmN5UmtNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9jbXh2WnpKbVkwMWhlQ0E5SUhCdFlYZ29jRzFwYmloemFISnBibXRsWkY5c2IyY3lSa01zSUcxaGVFeHZaekpHUXlrc0lDMXRZWGhNYjJjeVJrTXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtHWnNZV2NwWEc1Y2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQnphSEpwYm10bFpGOXNiMmN5UmtNc0lIa2dQU0J0WldGdVgyUnBabVpmYzJOdmNtVXNJR052Ykc5eUlEMGdabXhoWnl3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdGaVpXd2dQU0JwWm1Wc2MyVW9abXhoWnlBaFBTQmNJakJPVDF3aUxDQmxlSFJsY201aGJGOW5aVzVsWDI1aGJXVXNJRTVCS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUdGd1pTQTlJR0Z6TG1aaFkzUnZjaWh0WVhoR2JHRm5LU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1oyVnZiVjkwWlhoMFgzSmxjR1ZzS0NrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QmNiaUFnWjJkMGFYUnNaU2hjSW1SVVFVZGNJaWtnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F0SUdScFptWkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnS3lCY2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ01Da2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0JtWTBOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJQzFtWTBOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUhOallXeGxYMk52Ykc5eVgyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2lNRTVQWENJZ1BTQmNJbWR5WlhsY0lpd2dYQ0l4VlZCY0lpQTlJRndpY21Wa1hDSXNJRndpTWtSUFYwNWNJaUE5SUZ3aVlteDFaVndpS1NrZ0t5QWdJeUJEYjNKeVpXTjBaV1FnWTI5c2IzSWdiV0Z3Y0dsdVoxeHVJQ0J6WTJGc1pWOXphR0Z3WlY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY0lsUlNWVVZjSWlBOUlESXNJRndpUmtGTVUwVmNJaUE5SURFNUtTbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWJHOW5Na1pEWDNaelgyRjJaMU5qYjNKbFgyUlVRVWRmWENJc0lHeHZiM0JVZVhCbExDQmNJbDlrYVdabVEzVjBiMlptWDF3aUxDQmthV1ptUTNWMGIyWm1MQ0JjSWw5dWIwWkRZM1YwYjJabWRYQmtiM2R1WENJcFhHNW9aV2xuYUhRZ1BDMGdORnh1ZDJsa2RHZ2dQQzBnTjF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc0aklGeHVJeUFqSXlCU1RrRWdLeUJRVWs4dGMyVnhYRzRqSUhSbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBabVpmWkZSQlIxOUVUVk5QTENCblpXNWxLU0FsUGlVZ1hHNGpJQ0FnZFc1dVpYTjBLR2RsYm1VcElDVStKU0JuY205MWNGOWllU2huWlc1bEtTQWxQaVZjYmlNZ0lDQnpkVzF0WVhKcGVtVW9iV1ZoYmw5a2FXWm1YM05qYjNKbElEMGdiV1ZoYmloa2FXWm1YMlJVUVVkZlJFMVRUeWtzSUM1bmNtOTFjSE1nUFNBblpISnZjQ2NwWEc0aklGeHVJeUIwWlcxd0lEd3RJR3hsWm5SZmFtOXBiaWgwWlcxd0xDQmthV1ptTGxKT1FTd2dZbmtnUFNCaktGd2laMlZ1WlZ3aUlEMGdYQ0psYm5ObGJXSnNYMmRsYm1WZmFXUmNJaWtwSUNVK0pTQmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLR1pzWVdjZ1BTQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExtUnZkMjRzSUZ3aU1rUlBWMDVjSWl4Y2JpTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bFRHbHpkQzUxY0N3Z1hDSXhWVkJjSWl3Z1hDSXdUazljSWlrcExGeHVJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0Y0Um14aFp5QTlJQ2hoWW5Nb2MyaHlhVzVyWldSZmJHOW5Na1pES1NBK0lHMWhlRXh2WnpKR1F5a3NYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUhKc2IyY3labU5OWVhnZ1BTQndiV0Y0S0hCdGFXNG9jMmh5YVc1clpXUmZiRzluTWtaRExDQnRZWGhNYjJjeVJrTXBMQ0F0YldGNFRHOW5Na1pES1NrZ0pUNGxJRnh1SXlBZ0lHUndiSGx5T2pwaGNuSmhibWRsS0dac1lXY3BYRzRqSUZ4dUl5Qm1kM0pwZEdVb2RHVnRjQ3dnYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVoyVnVaVjloZG1kVFkyOXlaVjltWTE5a1ZFRkhYMXdpTENCc2IyOXdWSGx3WlN3Z1hDSXVkSE4yWENJcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dUl5QmNiaU1nY0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J6YUhKc2IyY3labU5OWVhnc0lIa2dQU0J0WldGdVgyUnBabVpmYzJOdmNtVXNJR052Ykc5eUlEMGdabXhoWnl3Z1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1lXSmxiQ0E5SUdsbVpXeHpaU2htYkdGbklDRTlJRndpTUU1UFhDSXNJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU3dnVGtFcExGeHVJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyaGhjR1VnUFNCaGN5NW1ZV04wYjNJb2JXRjRSbXhoWnlrcEtTQXJYRzRqSUNBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWjJWdmJWOTBaWGgwWDNKbGNHVnNLQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCY2JpTWdJQ0JuWjNScGRHeGxLRndpWkZSQlIxd2lLU0FyWEc0aklDQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Da2dLMXh1SXlBZ0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUdScFptWkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUl5QWdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJJRnh1SXlBZ0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SURBcElDdGNiaU1nSUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0JtWTBOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRqSUNBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTFdaalEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlNZ0lDQnpZMkZzWlY5amIyeHZjbDl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWpCT1Qxd2lJRDBnWENKbmNtVjVYQ0lzSUZ3aU1WVlFYQ0lnUFNCY0luSmxaRndpTENCY0lqSkVUMWRPWENJZ1BTQmNJbUpzZFdWY0lpa3BJQ3NnSUNNZ1EyOXljbVZqZEdWa0lHTnZiRzl5SUcxaGNIQnBibWRjYmlNZ0lDQnpZMkZzWlY5emFHRndaVjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWxSU1ZVVmNJaUE5SURJc0lGd2lSa0ZNVTBWY0lpQTlJREU1S1NsY2JpTWdYRzRqSUdacGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0lteHZaekpHUTE5MmMxOWhkbWRUWTI5eVpWOWtWRUZIWDF3aUxDQnNiMjl3Vkhsd1pTd2dYQ0pmWkdsbVprTjFkRzltWmw5Y0lpd2daR2xtWmtOMWRHOW1aaXdnWENKZlVrNUJMVkJTVDF3aUtWeHVJeUJvWldsbmFIUWdQQzBnTkZ4dUl5QjNhV1IwYUNBOExTQTNYRzRqSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaU1nY0hKcGJuUW9jQ2xjYmlNZ1pHVjJMbTltWmlncFhHNGpJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlNZ2NISnBiblFvY0NsY2JpTWdaR1YyTG05bVppZ3BYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmxvb3BUeXBlIDwtIFxccC1uXFxcblxuIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUFJPLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzEuZFRBR192c19HMS5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUFJPLkcyLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzIuZFRBR192c19HMi5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKVxuIyBJbXBvcnRpbmcgbG9vcCBnZW5lIGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpXG4jIGdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwpKSU+JSBcbiMgICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKVxuIyBUZXN0aW5nIGRpZmZlcmVudCB3YXlzIHRvIGNhbGN1bGF0ZSByZXByZXNlbnRhdGl2ZSBmZWF0dXJlIG9mIGxvb3BzIGZvciBlYWNoIGdlbmVcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24gPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCkpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXBkb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYpJGVuc2VtYmxfZ2VuZV9pZFxuXG5nZW5lTGlzdC51cCA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQpKVxuXG5cbiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuI1xuIyBwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLFxuIyAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiMgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuIyAgIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICtcbiMgICBnZ3RpdGxlKFxcZFRBR1xcKSArXG4jICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4jICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuIyAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuIyAgIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuI1xuIyBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19cXCwgbG9vcFR5cGUsIFxcX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYpXG4jIGhlaWdodCA8LSA0XG4jIHdpZHRoIDwtIDdcbiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcblxuIyBObyBGQyBjdXRvZmYgb3B0aW9uIC0gZG93biBvbmx5XG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuIyBmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19cXCwgbG9vcFR5cGUsIFxcX25vRkNjdXRvZmYudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJpbmtlZF9sb2cyRkMsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludChzaXplID0gMSwgYWxwaGEgPSAxLFxuICAgICAgc3Ryb2tlID0gMCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBndWlkZXMoY29sb3IgPSBcXG5vbmVcXCwgc2hhcGUgPSBcXG5vbmVcXCkgKyBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAxLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGMoZGlmZkN1dG9mZiwgLWRpZmZDdXRvZmYpLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwsIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDEsXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYyhmY0N1dG9mZiwgLWZjQ3V0b2ZmKSwgbGluZXR5cGUgPSBcXGRhc2hlZFxcLCBhbHBoYSA9IDEsXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArIGxhYnMoeSA9IFxcQXZnLiDOlCBsb29wIHNjb3JlXFwsIHggPSBcXGxvZzIoc2hydW5rZW4gRkMpXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcI0E5QThBOVxcLCBcXDFVUFxcID0gXFwjQ0IzMzNBXFwsIFxcMkRPV05cXCA9IFxcIzQ4NTJBMFxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfXFwsIGxvb3BUeXBlLCBcXF9kaWZmQ3V0b2ZmX1xcLCBkaWZmQ3V0b2ZmLCBcXF9ub0ZDY3V0b2ZmXFwpXG5oZWlnaHQgPC0gNDIqbW1Ub0luY2hcbndpZHRoIDwtIDUwKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbiMgTm8gRkMgY3V0b2ZmIG9wdGlvbiAtIHVwIGFuZCBkb3duXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwZG93bi5STkEubm9GQ2N1dG9mZiwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hyaW5rZWRfbG9nMkZDLCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxkVEFHXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxncmV5XFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19hdmdTY29yZV9kVEFHX1xcLCBsb29wVHlwZSwgXFxfZGlmZkN1dG9mZl9cXCwgZGlmZkN1dG9mZiwgXFxfbm9GQ2N1dG9mZnVwZG93blxcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuIyBcbiMgIyMgUk5BICsgUFJPLXNlcVxuIyB0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZ2VuZSkgJT4lIFxuIyAgIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4jICAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9kVEFHX0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuIyBcbiMgdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4jICAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLCBcXDJET1dOXFwsXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiMgICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuIyAgICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiMgICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuIyBcbiMgZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19cXCwgbG9vcFR5cGUsIFxcLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbiMgXG4jIHAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuIyAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiMgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuIyAgIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4jICAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4jICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4jICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4jICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG4jIFxuIyBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19cXCwgbG9vcFR5cGUsIFxcX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYsIFxcX1JOQS1QUk9cXClcbiMgaGVpZ2h0IDwtIDRcbiMgd2lkdGggPC0gN1xuIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
loopType <- \p-n\

# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>%
  dplyr::mutate(distance = start2 - start1)
# geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
#                                       diffCutoff = diffCutoff,
#                                       annoList = c(\P-P\))%>% 
#   dplyr::mutate(distance = start2 - start1)
# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id))
geneList.down.RNA <- (diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.down.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.updown.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff)$ensembl_gene_id

geneList.up <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id))


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

#fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

#
# p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
#                       label = ifelse(flag != \0NO\, external_gene_name, NA),
#                       shape = as.factor(maxFlag))) +
#   geom_point() + geom_text_repel() + theme_classic() +
#   ggtitle(\dTAG\) +
#   geom_hline(yintercept = 0) +
#   geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
#   geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
#   geom_vline(xintercept = 0) +
#   geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
#   geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
#   scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
#   scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))
#
# fileName <- paste0(\log2FC_vs_avgScore_dTAG_\, loopType, \_diffCutoff_\, diffCutoff)
# height <- 4
# width <- 7
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()

# No FC cutoff option - down only
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

# fwrite(temp, here(consensusDir, paste0(\gene_avgScore_fc_dTAG_\, loopType, \_noFCcutoff.tsv\)), sep = \\t\)

p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point(size = 1, alpha = 1,
      stroke = 0) + geom_text_repel() + theme_classic() + 
  guides(color = \none\, shape = \none\) + 
  geom_hline(yintercept = 0, alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) +
  geom_hline(yintercept = c(diffCutoff, -diffCutoff), linetype = \dashed\, alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) +
  geom_vline(xintercept = 0, alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) +
  geom_vline(xintercept = c(fcCutoff, -fcCutoff), linetype = \dashed\, alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) +
  theme(
    axis.title.x = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) + labs(y = \Avg. Δ loop score\, x = \log2(shrunken FC)\) +
  scale_color_manual(values = c(\0NO\ = \#A9A8A9\, \1UP\ = \#CB333A\, \2DOWN\ = \#4852A0\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_\, loopType, \_diffCutoff_\, diffCutoff, \_noFCcutoff\)
height <- 42*mmToInch
width <- 50*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# No FC cutoff option - up and down
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.updown.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)


p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_\, loopType, \_diffCutoff_\, diffCutoff, \_noFCcutoffupdown\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# 
# ## RNA + PRO-seq
# temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, gene) %>% 
#   unnest(gene) %>% group_by(gene) %>%
#   summarize(mean_diff_score = mean(diff_dTAG_DMSO), .groups = 'drop')
# 
# temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
#   dplyr::mutate(flag = ifelse(gene %in% geneList.down, \2DOWN\,
#                               ifelse(gene %in% geneList.up, \1UP\, \0NO\)),
#                 maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
#                 shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
#   dplyr::arrange(flag)
# 
# fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_\, loopType, \.tsv\), sep = \\t\)
# 
# p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
#                       label = ifelse(flag != \0NO\, external_gene_name, NA),
#                       shape = as.factor(maxFlag))) +
#   geom_point() + geom_text_repel() + theme_classic() + 
#   ggtitle(\dTAG\) +
#   geom_hline(yintercept = 0) +
#   geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
#   geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
#   geom_vline(xintercept = 0) +
#   geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
#   geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
#   scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
#   scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))
# 
# fileName <- paste0(\log2FC_vs_avgScore_dTAG_\, loopType, \_diffCutoff_\, diffCutoff, \_RNA-PRO\)
# height <- 4
# width <- 7
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJHOXZjRlI1Y0dVZ1BDMGdYRnh3TFc1Y1hGeHVYRzRqSUdkbGRIUnBibWNnYkdsemRDQnZaaUJuWlc1bGN5QnZaaUJwYm5SbGNtVnpkQ0JtY205dElGSk9RUzF6WlhFZ1lXNWtJRkJTVHkxelpYRmNibUZzY0doaElEd3RJREF1TURWY2JtWmpRM1YwYjJabUlEd3RJREF1TlZ4dVpHbG1aaTVRVWs4dVJ6RXVaRlJCUnlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhrYVdabVgwY3hSekl1WkZSQlIxOUhNUzVrVkVGSFgzWnpYMGN4TGtSTlUwOWZVRkpQYzJWeExuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jR0ZrYWlBOElHRnNjR2hoTENCaFluTW9jMmh5YVc1clpXUmZiRzluTWtaREtTQStJR1pqUTNWMGIyWm1LVnh1WkdsbVppNVFVazh1UnpJdVpGUkJSeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeGthV1ptWDBjeFJ6SXVaRlJCUjE5SE1pNWtWRUZIWDNaelgwY3lMa1JOVTA5ZlVGSlBjMlZ4TG5SemRseGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NHRmthaUE4SUdGc2NHaGhMQ0JoWW5Nb2MyaHlhVzVyWldSZmJHOW5Na1pES1NBK0lHWmpRM1YwYjJabUtWeHVaR2xtWmk1U1RrRXVSekV1WkZSQlJ5QThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4a2FXWm1YMGN4TG1SVVFVZGZSekV1TW1rdVpGUkJSMTkyYzE5SE1TNHlhUzVFVFZOUExuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jR0ZrYWlBOElHRnNjR2hoTENCaFluTW9jMmh5YVc1clpXUmZiRzluTWtaREtTQStJR1pqUTNWMGIyWm1LVnh1WkdsbVppNVNUa0V1UnpFdVpGUkJSeTV1YjBaRFkzVjBiMlptSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR1JwWm1aZlJ6RXVaRlJCUjE5SE1TNHlhUzVrVkVGSFgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lod1lXUnFJRHdnWVd4d2FHRXBYRzRqSUVsdGNHOXlkR2x1WnlCc2IyOXdJR2RsYm1VZ1lXNXViM1JoZEdsdmJseHVibUZ0WlNBOExTQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNYRnh1WEc1a2FXWm1RM1YwYjJabUlEd3RJREF1TWx4dVoyVnVaVUZ1Ym05RVlYUmhJRHd0SUd4dllXUk1iMjl3UVc1dWIwUmhkR0VvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNYRjl3TFc1ZlpXNXpaVzFpYkV4cGMzUXVkSE4yWEZ3cEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsbVprTjFkRzltWmlBOUlHUnBabVpEZFhSdlptWXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGdWJtOU1hWE4wSUQwZ1l5aGNYRkF0VUZ4Y0xDQmNYRkF0UlZ4Y0xDQmNYRkF0VTF4Y0xDQmNYRkF0V0Z4Y0tTa2xQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2xjYmlNZ1oyVnVaVUZ1Ym05RVlYUmhJRHd0SUd4dllXUk1iMjl3UVc1dWIwUmhkR0VvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNYRjl3TFc1ZlpXNXpaVzFpYkV4cGMzUXVkSE4yWEZ3cEtTeGNiaU1nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2FXWm1RM1YwYjJabUlEMGdaR2xtWmtOMWRHOW1aaXhjYmlNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhibTV2VEdsemRDQTlJR01vWEZ4UUxWQmNYQ2twSlQ0bElGeHVJeUFnSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0J6ZEdGeWRESWdMU0J6ZEdGeWRERXBYRzRqSUZSbGMzUnBibWNnWkdsbVptVnlaVzUwSUhkaGVYTWdkRzhnWTJGc1kzVnNZWFJsSUhKbGNISmxjMlZ1ZEdGMGFYWmxJR1psWVhSMWNtVWdiMllnYkc5dmNITWdabTl5SUdWaFkyZ2daMlZ1WlZ4dVpHbG1aaTVTVGtFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHVnVjMlZ0WW14ZloyVnVaVjlwWkN3Z2JHOW5Na1p2YkdSRGFHRnVaMlVzSUhOb2NtbHVhMlZrWDJ4dlp6SkdReXdnY0dGa2Fpd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxLVnh1WjJWdVpVeHBjM1F1Wkc5M2JpQThMU0IxYm1seGRXVW9ZeWdvWkdsbVppNVNUa0V1UnpFdVpGUkJSeUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0F3S1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBb1pHbG1aaTVRVWs4dVJ6RXVaRlJCUnlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUENBd0tTa2taVzV6WlcxaWJGOW5aVzVsWDJsa0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQW9aR2xtWmk1UVVrOHVSekl1WkZSQlJ5QWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtLU2xjYm1kbGJtVk1hWE4wTG1SdmQyNHVVazVCSUR3dElDaGthV1ptTGxKT1FTNUhNUzVrVkVGSElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtITm9jbWx1YTJWa1gyeHZaekpHUXlBOElEQXBLU1JsYm5ObGJXSnNYMmRsYm1WZmFXUmNibWRsYm1WTWFYTjBMbVJ2ZDI0dVVrNUJMbTV2UmtOamRYUnZabVlnUEMwZ0tHUnBabVl1VWs1QkxrY3hMbVJVUVVjdWJtOUdRMk4xZEc5bVppQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtYRzVuWlc1bFRHbHpkQzUxY0dSdmQyNHVVazVCTG01dlJrTmpkWFJ2Wm1ZZ1BDMGdLR1JwWm1ZdVVrNUJMa2N4TG1SVVFVY3VibTlHUTJOMWRHOW1aaWtrWlc1elpXMWliRjluWlc1bFgybGtYRzVjYm1kbGJtVk1hWE4wTG5Wd0lEd3RJSFZ1YVhGMVpTaGpLQ2hrYVdabUxsSk9RUzVITVM1a1ZFRkhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSE5vY21sdWEyVmtYMnh2WnpKR1F5QStJREFwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1FzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FvWkdsbVppNVFVazh1UnpFdVpGUkJSeUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQaUF3S1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS0dScFptWXVVRkpQTGtjeUxtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRDRnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkNrcFhHNWNibHh1SXlCYk1WMGdRWFpsY21GblpTQnZaaUJrYVdabVpYSmxiblJwWVd3Z2JHOXZjQ0J6WTI5eVpYTWdabTl5SUdWaFkyZ2daMlZ1WlZ4dUl5TWdVazVCSUc5dWJIbGNibVpqUTNWMGIyWm1JRHd0SURBdU5WeHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dWJXRjRURzluTWtaRElEd3RJREpjYmx4dWRHVnRjQ0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2xtWmw5a1ZFRkhYMFJOVTA4c0lHZGxibVVwSUNVK0pTQmNiaUFnZFc1dVpYTjBLR2RsYm1VcElDVStKU0JuY205MWNGOWllU2huWlc1bEtTQWxQaVZjYmlBZ2MzVnRiV0Z5YVhwbEtHMWxZVzVmWkdsbVpsOXpZMjl5WlNBOUlHMWxZVzRvWkdsbVpsOWtWRUZIWDBSTlUwOHBMQ0F1WjNKdmRYQnpJRDBnSjJSeWIzQW5LVnh1WEc1MFpXMXdJRHd0SUd4bFpuUmZhbTlwYmloMFpXMXdMQ0JrYVdabUxsSk9RU3dnWW5rZ1BTQmpLRnhjWjJWdVpWeGNJRDBnWEZ4bGJuTmxiV0pzWDJkbGJtVmZhV1JjWENrcElDVStKU0JjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2htYkdGbklEMGdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsVEdsemRDNWtiM2R1TGxKT1FTd2dYRnd5UkU5WFRseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCaktDa3NJRnhjTVZWUVhGd3NJRnhjTUU1UFhGd3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhoR2JHRm5JRDBnS0dGaWN5aHphSEpwYm10bFpGOXNiMmN5UmtNcElENGdiV0Y0VEc5bk1rWkRLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUhKc2IyY3labU5OWVhnZ1BTQndiV0Y0S0hCdGFXNG9jMmh5YVc1clpXUmZiRzluTWtaRExDQnRZWGhNYjJjeVJrTXBMQ0F0YldGNFRHOW5Na1pES1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2htYkdGbktWeHVYRzRqWm5keWFYUmxLSFJsYlhBc0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR2RsYm1WZllYWm5VMk52Y21WZlptTmZaRlJCUjE5d0xXNHVkSE4yWEZ3cExDQnpaWEFnUFNCY1hGeGNkRnhjS1Z4dVhHNGpYRzRqSUhBZ1BDMGdaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnYzJoeWJHOW5NbVpqVFdGNExDQjVJRDBnYldWaGJsOWthV1ptWDNOamIzSmxMQ0JqYjJ4dmNpQTlJR1pzWVdjc1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1lXSmxiQ0E5SUdsbVpXeHpaU2htYkdGbklDRTlJRnhjTUU1UFhGd3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU3dnVGtFcExGeHVJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyaGhjR1VnUFNCaGN5NW1ZV04wYjNJb2JXRjRSbXhoWnlrcEtTQXJYRzRqSUNBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWjJWdmJWOTBaWGgwWDNKbGNHVnNLQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUl5QWdJR2RuZEdsMGJHVW9YRnhrVkVGSFhGd3BJQ3RjYmlNZ0lDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRqSUNBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0aklDQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ0xTQmthV1ptUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaU1nSUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGpJQ0FnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdabU5EZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJeUFnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJQzFtWTBOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY1hHUmhjMmhsWkZ4Y0tTQXJYRzRqSUNBZ2MyTmhiR1ZmWTI5c2IzSmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YRnd3VGs5Y1hDQTlJRnhjWjNKbGVWeGNMQ0JjWERGVlVGeGNJRDBnWEZ4eVpXUmNYQ3dnWEZ3eVJFOVhUbHhjSUQwZ1hGeGliSFZsWEZ3cEtTQXJJQ0FqSUVOdmNuSmxZM1JsWkNCamIyeHZjaUJ0WVhCd2FXNW5YRzRqSUNBZ2MyTmhiR1ZmYzJoaGNHVmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YRnhVVWxWRlhGd2dQU0F5TENCY1hFWkJURk5GWEZ3Z1BTQXhPU2twWEc0alhHNGpJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEd4dlp6SkdRMTkyYzE5aGRtZFRZMjl5WlY5a1ZFRkhYMXhjTENCc2IyOXdWSGx3WlN3Z1hGeGZaR2xtWmtOMWRHOW1abDljWEN3Z1pHbG1aa04xZEc5bVppbGNiaU1nYUdWcFoyaDBJRHd0SURSY2JpTWdkMmxrZEdnZ1BDMGdOMXh1SXlCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRqSUhCeWFXNTBLSEFwWEc0aklHUmxkaTV2Wm1Zb0tWeHVJeUJ6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0aklIQnlhVzUwS0hBcFhHNGpJR1JsZGk1dlptWW9LVnh1WEc0aklFNXZJRVpESUdOMWRHOW1aaUJ2Y0hScGIyNGdMU0JrYjNkdUlHOXViSGxjYm5SbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBabVpmWkZSQlIxOUVUVk5QTENCblpXNWxLU0FsUGlVZ1hHNGdJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVWdaM0p2ZFhCZllua29aMlZ1WlNrZ0pUNGxYRzRnSUhOMWJXMWhjbWw2WlNodFpXRnVYMlJwWm1aZmMyTnZjbVVnUFNCdFpXRnVLR1JwWm1aZlpGUkJSMTlFVFZOUEtTd2dMbWR5YjNWd2N5QTlJQ2RrY205d0p5bGNibHh1ZEdWdGNDQThMU0JzWldaMFgycHZhVzRvZEdWdGNDd2daR2xtWmk1U1RrRXNJR0o1SUQwZ1l5aGNYR2RsYm1WY1hDQTlJRnhjWlc1elpXMWliRjluWlc1bFgybGtYRndwS1NBbFBpVWdYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9abXhoWnlBOUlHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaVXhwYzNRdVpHOTNiaTVTVGtFdWJtOUdRMk4xZEc5bVppd2dYRnd5UkU5WFRseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCaktDa3NJRnhjTVZWUVhGd3NJRnhjTUU1UFhGd3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhoR2JHRm5JRDBnS0dGaWN5aHphSEpwYm10bFpGOXNiMmN5UmtNcElENGdiV0Y0VEc5bk1rWkRLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUhKc2IyY3labU5OWVhnZ1BTQndiV0Y0S0hCdGFXNG9jMmh5YVc1clpXUmZiRzluTWtaRExDQnRZWGhNYjJjeVJrTXBMQ0F0YldGNFRHOW5Na1pES1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2htYkdGbktWeHVYRzRqSUdaM2NtbDBaU2gwWlcxd0xDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tGeGNaMlZ1WlY5aGRtZFRZMjl5WlY5bVkxOWtWRUZIWDF4Y0xDQnNiMjl3Vkhsd1pTd2dYRnhmYm05R1EyTjFkRzltWmk1MGMzWmNYQ2twTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1WEc1d0lEd3RJR2RuY0d4dmRDaDBaVzF3TENCaFpYTW9lQ0E5SUhOb2NtbHVhMlZrWDJ4dlp6SkdReXdnZVNBOUlHMWxZVzVmWkdsbVpsOXpZMjl5WlN3Z1kyOXNiM0lnUFNCbWJHRm5MQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOUlHbG1aV3h6WlNobWJHRm5JQ0U5SUZ4Y01FNVBYRndzSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlN3Z1RrRXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9ZWEJsSUQwZ1lYTXVabUZqZEc5eUtHMWhlRVpzWVdjcEtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtITnBlbVVnUFNBeExDQmhiSEJvWVNBOUlERXNYRzRnSUNBZ0lDQnpkSEp2YTJVZ1BTQXdLU0FySUdkbGIyMWZkR1Y0ZEY5eVpYQmxiQ2dwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1hHNGdJR2QxYVdSbGN5aGpiMnh2Y2lBOUlGeGNibTl1WlZ4Y0xDQnphR0Z3WlNBOUlGeGNibTl1WlZ4Y0tTQXJJRnh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRndwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ1l5aGthV1ptUTNWMGIyWm1MQ0F0WkdsbVprTjFkRzltWmlrc0lHeHBibVYwZVhCbElEMGdYRnhrWVhOb1pXUmNYQ3dnWVd4d2FHRWdQU0F4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWENrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQmpLR1pqUTNWMGIyWm1MQ0F0Wm1ORGRYUnZabVlwTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3NJR0ZzY0doaElEMGdNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hDa2dLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUnBkR3hsTG5rZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVk5MRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNYRzRnSUNBZ0tTd2dJQ0FnWEc0Z0lDQWdZWGhwY3k1c2FXNWxJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hDeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdsamEzTWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYRngwY21GdWMzQmhjbVZ1ZEZ4Y0tTeGNiaUFnSUNCc1pXZGxibVF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnYkdWblpXNWtMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1Z4dUlDQXBJQ3NnYkdGaWN5aDVJRDBnWEZ4QmRtY3VJTTZVSUd4dmIzQWdjMk52Y21WY1hDd2dlQ0E5SUZ4Y2JHOW5NaWh6YUhKMWJtdGxiaUJHUXlsY1hDa2dLMXh1SUNCelkyRnNaVjlqYjJ4dmNsOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYREJPVDF4Y0lEMGdYRndqUVRsQk9FRTVYRndzSUZ4Y01WVlFYRndnUFNCY1hDTkRRak16TTBGY1hDd2dYRnd5UkU5WFRseGNJRDBnWEZ3ak5EZzFNa0V3WEZ3cEtTQXJJQ0FqSUVOdmNuSmxZM1JsWkNCamIyeHZjaUJ0WVhCd2FXNW5YRzRnSUhOallXeGxYM05vWVhCbFgyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGeGNWRkpWUlZ4Y0lEMGdNaXdnWEZ4R1FVeFRSVnhjSUQwZ01Ua3BLVnh1WEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hGeHNiMmN5UmtOZmRuTmZZWFpuVTJOdmNtVmZaRlJCUjE5Y1hDd2diRzl2Y0ZSNWNHVXNJRnhjWDJScFptWkRkWFJ2Wm1aZlhGd3NJR1JwWm1aRGRYUnZabVlzSUZ4Y1gyNXZSa05qZFhSdlptWmNYQ2xjYm1obGFXZG9kQ0E4TFNBME1pcHRiVlJ2U1c1amFGeHVkMmxrZEdnZ1BDMGdOVEFxYlcxVWIwbHVZMmhjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibHh1SXlCT2J5QkdReUJqZFhSdlptWWdiM0IwYVc5dUlDMGdkWEFnWVc1a0lHUnZkMjVjYm5SbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBabVpmWkZSQlIxOUVUVk5QTENCblpXNWxLU0FsUGlVZ1hHNGdJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVWdaM0p2ZFhCZllua29aMlZ1WlNrZ0pUNGxYRzRnSUhOMWJXMWhjbWw2WlNodFpXRnVYMlJwWm1aZmMyTnZjbVVnUFNCdFpXRnVLR1JwWm1aZlpGUkJSMTlFVFZOUEtTd2dMbWR5YjNWd2N5QTlJQ2RrY205d0p5bGNibHh1ZEdWdGNDQThMU0JzWldaMFgycHZhVzRvZEdWdGNDd2daR2xtWmk1U1RrRXNJR0o1SUQwZ1l5aGNYR2RsYm1WY1hDQTlJRnhjWlc1elpXMWliRjluWlc1bFgybGtYRndwS1NBbFBpVWdYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9abXhoWnlBOUlHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaVXhwYzNRdWRYQmtiM2R1TGxKT1FTNXViMFpEWTNWMGIyWm1MQ0JjWERKRVQxZE9YRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHTW9LU3dnWEZ3eFZWQmNYQ3dnWEZ3d1RrOWNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxaGVFWnNZV2NnUFNBb1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJ0WVhoTWIyY3lSa01wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb2NteHZaekptWTAxaGVDQTlJSEJ0WVhnb2NHMXBiaWh6YUhKcGJtdGxaRjlzYjJjeVJrTXNJRzFoZUV4dlp6SkdReWtzSUMxdFlYaE1iMmN5UmtNcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0dac1lXY3BYRzVjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCemFISnBibXRsWkY5c2IyY3lSa01zSUhrZ1BTQnRaV0Z1WDJScFptWmZjMk52Y21Vc0lHTnZiRzl5SUQwZ1pteGhaeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BTQnBabVZzYzJVb1pteGhaeUFoUFNCY1hEQk9UMXhjTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVc0lFNUJLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphR0Z3WlNBOUlHRnpMbVpoWTNSdmNpaHRZWGhHYkdGbktTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWjJWdmJWOTBaWGgwWDNKbGNHVnNLQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCY2JpQWdaMmQwYVhSc1pTaGNYR1JVUVVkY1hDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXRJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLeUJjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQm1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlDMW1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y01FNVBYRndnUFNCY1hHZHlaWGxjWEN3Z1hGd3hWVkJjWENBOUlGeGNjbVZrWEZ3c0lGeGNNa1JQVjA1Y1hDQTlJRnhjWW14MVpWeGNLU2tnS3lBZ0l5QkRiM0p5WldOMFpXUWdZMjlzYjNJZ2JXRndjR2x1WjF4dUlDQnpZMkZzWlY5emFHRndaVjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjWEZSU1ZVVmNYQ0E5SURJc0lGeGNSa0ZNVTBWY1hDQTlJREU1S1NsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjYkc5bk1rWkRYM1p6WDJGMloxTmpiM0psWDJSVVFVZGZYRndzSUd4dmIzQlVlWEJsTENCY1hGOWthV1ptUTNWMGIyWm1YMXhjTENCa2FXWm1RM1YwYjJabUxDQmNYRjl1YjBaRFkzVjBiMlptZFhCa2IzZHVYRndwWEc1b1pXbG5hSFFnUEMwZ05GeHVkMmxrZEdnZ1BDMGdOMXh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVYRzRqSUZ4dUl5QWpJeUJTVGtFZ0t5QlFVazh0YzJWeFhHNGpJSFJsYlhBZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScFptWmZaRlJCUjE5RVRWTlBMQ0JuWlc1bEtTQWxQaVVnWEc0aklDQWdkVzV1WlhOMEtHZGxibVVwSUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVmNiaU1nSUNCemRXMXRZWEpwZW1Vb2JXVmhibDlrYVdabVgzTmpiM0psSUQwZ2JXVmhiaWhrYVdabVgyUlVRVWRmUkUxVFR5a3NJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzRqSUZ4dUl5QjBaVzF3SUR3dElHeGxablJmYW05cGJpaDBaVzF3TENCa2FXWm1MbEpPUVN3Z1lua2dQU0JqS0Z4Y1oyVnVaVnhjSUQwZ1hGeGxibk5sYldKc1gyZGxibVZmYVdSY1hDa3BJQ1UrSlNCY2JpTWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHWnNZV2NnUFNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVk1hWE4wTG1SdmQyNHNJRnhjTWtSUFYwNWNYQ3hjYmlNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsVEdsemRDNTFjQ3dnWEZ3eFZWQmNYQ3dnWEZ3d1RrOWNYQ2twTEZ4dUl5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXRjRSbXhoWnlBOUlDaGhZbk1vYzJoeWFXNXJaV1JmYkc5bk1rWkRLU0ErSUcxaGVFeHZaekpHUXlrc1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphSEpzYjJjeVptTk5ZWGdnUFNCd2JXRjRLSEJ0YVc0b2MyaHlhVzVyWldSZmJHOW5Na1pETENCdFlYaE1iMmN5UmtNcExDQXRiV0Y0VEc5bk1rWkRLU2tnSlQ0bElGeHVJeUFnSUdSd2JIbHlPanBoY25KaGJtZGxLR1pzWVdjcFhHNGpJRnh1SXlCbWQzSnBkR1VvZEdWdGNDd2dhR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWjJWdVpWOWhkbWRUWTI5eVpWOW1ZMTlrVkVGSFgxeGNMQ0JzYjI5d1ZIbHdaU3dnWEZ3dWRITjJYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1SXlCY2JpTWdjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQnphSEpzYjJjeVptTk5ZWGdzSUhrZ1BTQnRaV0Z1WDJScFptWmZjMk52Y21Vc0lHTnZiRzl5SUQwZ1pteGhaeXdnWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWVdKbGJDQTlJR2xtWld4elpTaG1iR0ZuSUNFOUlGeGNNRTVQWEZ3c0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTd2dUa0VwTEZ4dUl5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJoaGNHVWdQU0JoY3k1bVlXTjBiM0lvYldGNFJteGhaeWtwS1NBclhHNGpJQ0FnWjJWdmJWOXdiMmx1ZENncElDc2daMlZ2YlY5MFpYaDBYM0psY0dWc0tDa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJjYmlNZ0lDQm5aM1JwZEd4bEtGeGNaRlJCUjF4Y0tTQXJYRzRqSUNBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJeUFnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SXlBZ0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUMwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBcklGeHVJeUFnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpTWdJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQm1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGpJQ0FnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdMV1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaU1nSUNCelkyRnNaVjlqYjJ4dmNsOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYREJPVDF4Y0lEMGdYRnhuY21WNVhGd3NJRnhjTVZWUVhGd2dQU0JjWEhKbFpGeGNMQ0JjWERKRVQxZE9YRndnUFNCY1hHSnNkV1ZjWENrcElDc2dJQ01nUTI5eWNtVmpkR1ZrSUdOdmJHOXlJRzFoY0hCcGJtZGNiaU1nSUNCelkyRnNaVjl6YUdGd1pWOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYRlJTVlVWY1hDQTlJRElzSUZ4Y1JrRk1VMFZjWENBOUlERTVLU2xjYmlNZ1hHNGpJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEd4dlp6SkdRMTkyYzE5aGRtZFRZMjl5WlY5a1ZFRkhYMXhjTENCc2IyOXdWSGx3WlN3Z1hGeGZaR2xtWmtOMWRHOW1abDljWEN3Z1pHbG1aa04xZEc5bVppd2dYRnhmVWs1QkxWQlNUMXhjS1Z4dUl5Qm9aV2xuYUhRZ1BDMGdORnh1SXlCM2FXUjBhQ0E4TFNBM1hHNGpJSEJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpTWdjSEpwYm5Rb2NDbGNiaU1nWkdWMkxtOW1aaWdwWEc0aklITjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaU1nY0hKcGJuUW9jQ2xjYmlNZ1pHVjJMbTltWmlncFhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbmxvb3BUeXBlIDwtIFxccC1uXFxcblxuIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUFJPLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzEuZFRBR192c19HMS5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUFJPLkcyLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzIuZFRBR192c19HMi5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKVxuIyBJbXBvcnRpbmcgbG9vcCBnZW5lIGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpXG4jIGdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwpKSU+JSBcbiMgICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKVxuIyBUZXN0aW5nIGRpZmZlcmVudCB3YXlzIHRvIGNhbGN1bGF0ZSByZXByZXNlbnRhdGl2ZSBmZWF0dXJlIG9mIGxvb3BzIGZvciBlYWNoIGdlbmVcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24gPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCkpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXBkb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYpJGVuc2VtYmxfZ2VuZV9pZFxuXG5nZW5lTGlzdC51cCA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQpKVxuXG5cbiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuI1xuIyBwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLFxuIyAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiMgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuIyAgIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICtcbiMgICBnZ3RpdGxlKFxcZFRBR1xcKSArXG4jICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4jICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuIyAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuIyAgIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuI1xuIyBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19cXCwgbG9vcFR5cGUsIFxcX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYpXG4jIGhlaWdodCA8LSA0XG4jIHdpZHRoIDwtIDdcbiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcblxuIyBObyBGQyBjdXRvZmYgb3B0aW9uIC0gZG93biBvbmx5XG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuIyBmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19cXCwgbG9vcFR5cGUsIFxcX25vRkNjdXRvZmYudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJpbmtlZF9sb2cyRkMsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludChzaXplID0gMSwgYWxwaGEgPSAxLFxuICAgICAgc3Ryb2tlID0gMCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBndWlkZXMoY29sb3IgPSBcXG5vbmVcXCwgc2hhcGUgPSBcXG5vbmVcXCkgKyBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAxLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGMoZGlmZkN1dG9mZiwgLWRpZmZDdXRvZmYpLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwsIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDEsXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYyhmY0N1dG9mZiwgLWZjQ3V0b2ZmKSwgbGluZXR5cGUgPSBcXGRhc2hlZFxcLCBhbHBoYSA9IDEsXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArIGxhYnMoeSA9IFxcQXZnLiDOlCBsb29wIHNjb3JlXFwsIHggPSBcXGxvZzIoc2hydW5rZW4gRkMpXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcI0E5QThBOVxcLCBcXDFVUFxcID0gXFwjQ0IzMzNBXFwsIFxcMkRPV05cXCA9IFxcIzQ4NTJBMFxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfXFwsIGxvb3BUeXBlLCBcXF9kaWZmQ3V0b2ZmX1xcLCBkaWZmQ3V0b2ZmLCBcXF9ub0ZDY3V0b2ZmXFwpXG5oZWlnaHQgPC0gNDIqbW1Ub0luY2hcbndpZHRoIDwtIDUwKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbiMgTm8gRkMgY3V0b2ZmIG9wdGlvbiAtIHVwIGFuZCBkb3duXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwZG93bi5STkEubm9GQ2N1dG9mZiwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hyaW5rZWRfbG9nMkZDLCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxkVEFHXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxncmV5XFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19hdmdTY29yZV9kVEFHX1xcLCBsb29wVHlwZSwgXFxfZGlmZkN1dG9mZl9cXCwgZGlmZkN1dG9mZiwgXFxfbm9GQ2N1dG9mZnVwZG93blxcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuIyBcbiMgIyMgUk5BICsgUFJPLXNlcVxuIyB0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZ2VuZSkgJT4lIFxuIyAgIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4jICAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9kVEFHX0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuIyBcbiMgdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4jICAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLCBcXDJET1dOXFwsXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiMgICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuIyAgICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiMgICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuIyBcbiMgZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19cXCwgbG9vcFR5cGUsIFxcLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbiMgXG4jIHAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuIyAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiMgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuIyAgIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4jICAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4jICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4jICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4jICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG4jIFxuIyBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19cXCwgbG9vcFR5cGUsIFxcX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYsIFxcX1JOQS1QUk9cXClcbiMgaGVpZ2h0IDwtIDRcbiMgd2lkdGggPC0gN1xuIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9vcFR5cGUgPC0gXFxwLW5cXFxuXG4jIGdldHRpbmcgbGlzdCBvZiBnZW5lcyBvZiBpbnRlcmVzdCBmcm9tIFJOQS1zZXEgYW5kIFBSTy1zZXFcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZi5QUk8uRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxRzIuZFRBR19HMS5kVEFHX3ZzX0cxLkRNU09fUFJPc2VxLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5QUk8uRzIuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxRzIuZFRBR19HMi5kVEFHX3ZzX0cyLkRNU09fUFJPc2VxLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5STkEuRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEpXG4jIEltcG9ydGluZyBsb29wIGdlbmUgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSklPiVcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcbiMgZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZixcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCkpJT4lIFxuIyAgIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpXG4jIFRlc3RpbmcgZGlmZmVyZW50IHdheXMgdG8gY2FsY3VsYXRlIHJlcHJlc2VudGF0aXZlIGZlYXR1cmUgb2YgbG9vcHMgZm9yIGVhY2ggZ2VuZVxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93biA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzIuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkKSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cGRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZikkZW5zZW1ibF9nZW5lX2lkXG5cbmdlbmVMaXN0LnVwIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCkpXG5cblxuIyBbMV0gQXZlcmFnZSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9kVEFHX0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9kVEFHX0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG4jZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLW4udHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG4jXG4jIHAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsXG4jICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuIyAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4jICAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuIyAgIGdndGl0bGUoXFxkVEFHXFwpICtcbiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4jICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4jICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4jICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4jICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4jICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG4jXG4jIGZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19hdmdTY29yZV9kVEFHX1xcLCBsb29wVHlwZSwgXFxfZGlmZkN1dG9mZl9cXCwgZGlmZkN1dG9mZilcbiMgaGVpZ2h0IDwtIDRcbiMgd2lkdGggPC0gN1xuIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuXG4jIE5vIEZDIGN1dG9mZiBvcHRpb24gLSBkb3duIG9ubHlcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG4jIGZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcZ2VuZV9hdmdTY29yZV9mY19kVEFHX1xcLCBsb29wVHlwZSwgXFxfbm9GQ2N1dG9mZi50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmlua2VkX2xvZzJGQywgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KHNpemUgPSAxLCBhbHBoYSA9IDEsXG4gICAgICBzdHJva2UgPSAwKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGd1aWRlcyhjb2xvciA9IFxcbm9uZVxcLCBzaGFwZSA9IFxcbm9uZVxcKSArIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDEsXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYyhkaWZmQ3V0b2ZmLCAtZGlmZkN1dG9mZiksIGxpbmV0eXBlID0gXFxkYXNoZWRcXCwgYWxwaGEgPSAxLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKGZjQ3V0b2ZmLCAtZmNDdXRvZmYpLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwsIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSwgICAgXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApICsgbGFicyh5ID0gXFxBdmcuIM6UIGxvb3Agc2NvcmVcXCwgeCA9IFxcbG9nMihzaHJ1bmtlbiBGQylcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFwjQTlBOEE5XFwsIFxcMVVQXFwgPSBcXCNDQjMzM0FcXCwgXFwyRE9XTlxcID0gXFwjNDg1MkEwXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19cXCwgbG9vcFR5cGUsIFxcX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYsIFxcX25vRkNjdXRvZmZcXClcbmhlaWdodCA8LSA0MiptbVRvSW5jaFxud2lkdGggPC0gNTAqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuIyBObyBGQyBjdXRvZmYgb3B0aW9uIC0gdXAgYW5kIGRvd25cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXBkb3duLlJOQS5ub0ZDY3V0b2ZmLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJpbmtlZF9sb2cyRkMsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfXFwsIGxvb3BUeXBlLCBcXF9kaWZmQ3V0b2ZmX1xcLCBkaWZmQ3V0b2ZmLCBcXF9ub0ZDY3V0b2ZmdXBkb3duXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4jIFxuIyAjIyBSTkEgKyBQUk8tc2VxXG4jIHRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgXG4jICAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiMgICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpXG4jIFxuIyB0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiMgICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24sIFxcMkRPV05cXCxcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cCwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuIyAgICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4jICAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuIyAgIGRwbHlyOjphcnJhbmdlKGZsYWcpXG4jIFxuIyBmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIFxcZ2VuZV9hdmdTY29yZV9mY19kVEFHX1xcLCBsb29wVHlwZSwgXFwudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuIyBcbiMgcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4jICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuIyAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4jICAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiMgICBnZ3RpdGxlKFxcZFRBR1xcKSArXG4jICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4jICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiMgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxncmV5XFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiMgICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcbiMgXG4jIGZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19hdmdTY29yZV9kVEFHX1xcLCBsb29wVHlwZSwgXFxfZGlmZkN1dG9mZl9cXCwgZGlmZkN1dG9mZiwgXFxfUk5BLVBST1xcKVxuIyBoZWlnaHQgPC0gNFxuIyB3aWR0aCA8LSA3XG4jIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG4jIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
loopType <- \p-n\

# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>%
  dplyr::mutate(distance = start2 - start1)
# geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
#                                       diffCutoff = diffCutoff,
#                                       annoList = c(\P-P\))%>% 
#   dplyr::mutate(distance = start2 - start1)
# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id))
geneList.down.RNA <- (diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.down.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.updown.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff)$ensembl_gene_id

geneList.up <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id))


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

#fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

#
# p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag,
#                       label = ifelse(flag != \0NO\, external_gene_name, NA),
#                       shape = as.factor(maxFlag))) +
#   geom_point() + geom_text_repel() + theme_classic() +
#   ggtitle(\dTAG\) +
#   geom_hline(yintercept = 0) +
#   geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
#   geom_hline(yintercept = - diffCutoff, linetype = \dashed\) +
#   geom_vline(xintercept = 0) +
#   geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
#   geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
#   scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
#   scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))
#
# fileName <- paste0(\log2FC_vs_avgScore_dTAG_\, loopType, \_diffCutoff_\, diffCutoff)
# height <- 4
# width <- 7
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()

# No FC cutoff option - down only
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

# fwrite(temp, here(consensusDir, paste0(\gene_avgScore_fc_dTAG_\, loopType, \_noFCcutoff.tsv\)), sep = \\t\)

p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point(size = 1, alpha = 1,
      stroke = 0) + geom_text_repel() + theme_classic() + 
  guides(color = \none\, shape = \none\) + 
  geom_hline(yintercept = 0, alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) +
  geom_hline(yintercept = c(diffCutoff, -diffCutoff), linetype = \dashed\, alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) +
  geom_vline(xintercept = 0, alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) +
  geom_vline(xintercept = c(fcCutoff, -fcCutoff), linetype = \dashed\, alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) +
  theme(
    axis.title.x = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) + labs(y = \Avg. Δ loop score\, x = \log2(shrunken FC)\) +
  scale_color_manual(values = c(\0NO\ = \#A9A8A9\, \1UP\ = \#CB333A\, \2DOWN\ = \#4852A0\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_\, loopType, \_diffCutoff_\, diffCutoff, \_noFCcutoff\)
height <- 42*mmToInch
width <- 50*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# No FC cutoff option - up and down
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.updown.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)


p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_\, loopType, \_diffCutoff_\, diffCutoff, \_noFCcutoffupdown\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# 
# ## RNA + PRO-seq
# temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, gene) %>% 
#   unnest(gene) %>% group_by(gene) %>%
#   summarize(mean_diff_score = mean(diff_dTAG_DMSO), .groups = 'drop')
# 
# temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
#   dplyr::mutate(flag = ifelse(gene %in% geneList.down, \2DOWN\,
#                               ifelse(gene %in% geneList.up, \1UP\, \0NO\)),
#                 maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
#                 shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
#   dplyr::arrange(flag)
# 
# fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_\, loopType, \.tsv\), sep = \\t\)
# 
# p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
#                       label = ifelse(flag != \0NO\, external_gene_name, NA),
#                       shape = as.factor(maxFlag))) +
#   geom_point() + geom_text_repel() + theme_classic() + 
#   ggtitle(\dTAG\) +
#   geom_hline(yintercept = 0) +
#   geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
#   geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
#   geom_vline(xintercept = 0) +
#   geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
#   geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
#   scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
#   scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))
# 
# fileName <- paste0(\log2FC_vs_avgScore_dTAG_\, loopType, \_diffCutoff_\, diffCutoff, \_RNA-PRO\)
# height <- 4
# width <- 7
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

### [2.10] Linking with RNA-seq/PRO-seq
#### Function & parameter

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzVzYjI5d1ZIbHdaU0E4TFNCY0luQXRjR1ZjSWx4dVhHNGpJR2RsZEhScGJtY2diR2x6ZENCdlppQm5aVzVsY3lCdlppQnBiblJsY21WemRDQm1jbTl0SUZKT1FTMXpaWEVnWVc1a0lGQlNUeTF6WlhGY2JtRnNjR2hoSUR3dElEQXVNRFZjYm1aalEzVjBiMlptSUR3dElEQXVOVnh1WkdsbVppNVFVazh1UnpFdVpGUkJSeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSmthV1ptWDBjeFJ6SXVaRlJCUjE5SE1TNWtWRUZIWDNaelgwY3hMa1JOVTA5ZlVGSlBjMlZ4TG5SemRsd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NHRmthaUE4SUdGc2NHaGhMQ0JoWW5Nb2MyaHlhVzVyWldSZmJHOW5Na1pES1NBK0lHWmpRM1YwYjJabUtWeHVaR2xtWmk1UVVrOHVSekl1WkZSQlJ5QThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKa2FXWm1YMGN4UnpJdVpGUkJSMTlITWk1a1ZFRkhYM1p6WDBjeUxrUk5VMDlmVUZKUGMyVnhMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY0dGa2FpQThJR0ZzY0doaExDQmhZbk1vYzJoeWFXNXJaV1JmYkc5bk1rWkRLU0ErSUdaalEzVjBiMlptS1Z4dVpHbG1aaTVTVGtFdVJ6RXVaRlJCUnlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0prYVdabVgwY3hMbVJVUVVkZlJ6RXVNbWt1WkZSQlIxOTJjMTlITVM0eWFTNUVUVk5QTG5SemRsd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NHRmthaUE4SUdGc2NHaGhMQ0JoWW5Nb2MyaHlhVzVyWldSZmJHOW5Na1pES1NBK0lHWmpRM1YwYjJabUtWeHVaR2xtWmk1U1RrRXVSekV1WkZSQlJ5NXViMFpEWTNWMGIyWm1JRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltUnBabVpmUnpFdVpGUkJSMTlITVM0eWFTNWtWRUZIWDNaelgwY3hMakpwTGtSTlUwOHVkSE4yWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh3WVdScUlEd2dZV3h3YUdFcFhHNGpJRWx0Y0c5eWRHbHVaeUJzYjI5d0lHZGxibVVnWVc1dWIzUmhkR2x2Ymx4dWJtRnRaU0E4TFNCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY0lseHVYRzVrYVdabVEzVjBiMlptSUR3dElEQXVNbHh1WjJWdVpVRnVibTlFWVhSaElEd3RJR3h2WVdSTWIyOXdRVzV1YjBSaGRHRW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOXdMVzVmWlc1elpXMWliRXhwYzNRdWRITjJYQ0lwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2xtWmtOMWRHOW1aaUE5SUdScFptWkRkWFJ2Wm1Zc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0Z1Ym05TWFYTjBJRDBnWXloY0lsQXRVRndpTENCY0lsQXRSVndpTENCY0lsQXRVMXdpTENCY0lsQXRXRndpS1NrbFBpVWdYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0J6ZEdGeWRESWdMU0J6ZEdGeWRERXBYRzVjYmx4dUl5Qk1iMkZrYVc1bklFOUZJR3h2YjNBZ2MyTnZjbVZjYm0xcGJsWmhiSFZsSUR3dElDMDBYRzV2WW5ObGVIQWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaGNJbXh2YjNCVFkyOXlaVjlqYjI1elgyOWljMlY0Y0M1MGMzWmNJaWtwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaHNiMmRmYjJKelpYaHdYMFJOVTA4Z1BTQnBabDlsYkhObEtHOWljMlY0Y0Y5RVRWTlBJRDA5SURBc0lHMXBibFpoYkhWbExDQnNiMmN5S0c5aWMyVjRjRjlFVFZOUEtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrVkVGSElEMGdhV1pmWld4elpTaHZZbk5sZUhCZlpGUkJSeUE5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmWkZSQlJ5a3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WjE5dlluTmxlSEJmUVRRNE5TQTlJR2xtWDJWc2MyVW9iMkp6Wlhod1gwRTBPRFVnUFQwZ01Dd2diV2x1Vm1Gc2RXVXNJR3h2WnpJb2IySnpaWGh3WDBFME9EVXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDJScFptWmZaRlJCUjE5RVRWTlBJRDBnYkc5blgyOWljMlY0Y0Y5a1ZFRkhJQzBnYkc5blgyOWljMlY0Y0Y5RVRWTlBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WjE5dlluTmxlSEJmWkdsbVpsOUJORGcxWDBSTlUwOGdQU0JzYjJkZmIySnpaWGh3WDBFME9EVWdMU0JzYjJkZmIySnpaWGh3WDBSTlUwOHBYRzVjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR3hsWm5SZmFtOXBiaWh2WW5ObGVIQXNJR0o1SUQwZ1l5aGNJbWxrWENJcEtWeHVYRzRqSUZSbGMzUnBibWNnWkdsbVptVnlaVzUwSUhkaGVYTWdkRzhnWTJGc1kzVnNZWFJsSUhKbGNISmxjMlZ1ZEdGMGFYWmxJR1psWVhSMWNtVWdiMllnYkc5dmNITWdabTl5SUdWaFkyZ2daMlZ1WlZ4dVpHbG1aaTVTVGtFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHVnVjMlZ0WW14ZloyVnVaVjlwWkN3Z2JHOW5Na1p2YkdSRGFHRnVaMlVzSUhOb2NtbHVhMlZrWDJ4dlp6SkdReXdnY0dGa2Fpd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxLVnh1WjJWdVpVeHBjM1F1Wkc5M2JpQThMU0IxYm1seGRXVW9ZeWdvWkdsbVppNVNUa0V1UnpFdVpGUkJSeUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0F3S1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBb1pHbG1aaTVRVWs4dVJ6RXVaRlJCUnlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUENBd0tTa2taVzV6WlcxaWJGOW5aVzVsWDJsa0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQW9aR2xtWmk1UVVrOHVSekl1WkZSQlJ5QWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtLU2xjYm1kbGJtVk1hWE4wTG1SdmQyNHVVazVCSUR3dElDaGthV1ptTGxKT1FTNUhNUzVrVkVGSElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtITm9jbWx1YTJWa1gyeHZaekpHUXlBOElEQXBLU1JsYm5ObGJXSnNYMmRsYm1WZmFXUmNibWRsYm1WTWFYTjBMbVJ2ZDI0dVVrNUJMbTV2UmtOamRYUnZabVlnUEMwZ0tHUnBabVl1VWs1QkxrY3hMbVJVUVVjdWJtOUdRMk4xZEc5bVppQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtYRzVuWlc1bFRHbHpkQzUxY0dSdmQyNHVVazVCTG01dlJrTmpkWFJ2Wm1ZZ1BDMGdLR1JwWm1ZdVVrNUJMa2N4TG1SVVFVY3VibTlHUTJOMWRHOW1aaWtrWlc1elpXMWliRjluWlc1bFgybGtYRzVjYm1kbGJtVk1hWE4wTG5Wd0lEd3RJSFZ1YVhGMVpTaGpLQ2hrYVdabUxsSk9RUzVITVM1a1ZFRkhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSE5vY21sdWEyVmtYMnh2WnpKR1F5QStJREFwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1FzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FvWkdsbVppNVFVazh1UnpFdVpGUkJSeUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQaUF3S1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS0dScFptWXVVRkpQTGtjeUxtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRDRnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkNrcFhHNWNibHh1SXlCYk1WMGdRWFpsY21GblpTQnZaaUJrYVdabVpYSmxiblJwWVd3Z2JHOXZjQ0J6WTI5eVpYTWdabTl5SUdWaFkyZ2daMlZ1WlZ4dUl5TWdVazVCSUc5dWJIbGNibVpqUTNWMGIyWm1JRHd0SURBdU5WeHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dWJXRjRURzluTWtaRElEd3RJREpjYmx4dWRHVnRjQ0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9iRzluWDI5aWMyVjRjRjlrYVdabVgyUlVRVWRmUkUxVFR5d2daMlZ1WlNrZ0pUNGxJRnh1SUNCMWJtNWxjM1FvWjJWdVpTa2dKVDRsSUdkeWIzVndYMko1S0dkbGJtVXBJQ1UrSlZ4dUlDQnpkVzF0WVhKcGVtVW9iV1ZoYmw5a2FXWm1YM05qYjNKbElEMGdiV1ZoYmloc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QS1N3Z0xtZHliM1Z3Y3lBOUlDZGtjbTl3SnlsY2JseHVkR1Z0Y0NBOExTQnNaV1owWDJwdmFXNG9kR1Z0Y0N3Z1pHbG1aaTVTVGtFc0lHSjVJRDBnWXloY0ltZGxibVZjSWlBOUlGd2laVzV6WlcxaWJGOW5aVzVsWDJsa1hDSXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pteGhaeUE5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1Wkc5M2JpNVNUa0VzSUZ3aU1rUlBWMDVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdZeWdwTENCY0lqRlZVRndpTENCY0lqQk9UMXdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXRjRSbXhoWnlBOUlDaGhZbk1vYzJoeWFXNXJaV1JmYkc5bk1rWkRLU0ErSUcxaGVFeHZaekpHUXlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyaHliRzluTW1aalRXRjRJRDBnY0cxaGVDaHdiV2x1S0hOb2NtbHVhMlZrWDJ4dlp6SkdReXdnYldGNFRHOW5Na1pES1N3Z0xXMWhlRXh2WnpKR1F5a3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pteGhaeWxjYmx4dUkyWjNjbWwwWlNoMFpXMXdMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKblpXNWxYMkYyWjFOamIzSmxYMlpqWDJSVVFVZGZjQzF1TG5SemRsd2lLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J6YUhKc2IyY3labU5OWVhnc0lIa2dQU0J0WldGdVgyUnBabVpmYzJOdmNtVXNJR052Ykc5eUlEMGdabXhoWnl3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdGaVpXd2dQU0JwWm1Wc2MyVW9abXhoWnlBaFBTQmNJakJPVDF3aUxDQmxlSFJsY201aGJGOW5aVzVsWDI1aGJXVXNJRTVCS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUdGd1pTQTlJR0Z6TG1aaFkzUnZjaWh0WVhoR2JHRm5LU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1oyVnZiVjkwWlhoMFgzSmxjR1ZzS0NrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QmNiaUFnWjJkMGFYUnNaU2hjSW1SVVFVZGNJaWtnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F0SUdScFptWkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnS3lCY2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ01Da2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0JtWTBOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJQzFtWTBOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUhOallXeGxYMk52Ykc5eVgyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2lNRTVQWENJZ1BTQmNJbWR5WlhsY0lpd2dYQ0l4VlZCY0lpQTlJRndpY21Wa1hDSXNJRndpTWtSUFYwNWNJaUE5SUZ3aVlteDFaVndpS1NrZ0t5QWdJeUJEYjNKeVpXTjBaV1FnWTI5c2IzSWdiV0Z3Y0dsdVoxeHVJQ0J6WTJGc1pWOXphR0Z3WlY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY0lsUlNWVVZjSWlBOUlESXNJRndpUmtGTVUwVmNJaUE5SURFNUtTbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWJHOW5Na1pEWDNaelgyRjJaMU5qYjNKbFgyUlVRVWRmVDBWZlhDSXNJR3h2YjNCVWVYQmxMQ0JjSWw5aGRtZE1iMmRQUlZ3aUtWeHVhR1ZwWjJoMElEd3RJRFJjYm5kcFpIUm9JRHd0SURkY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dUl5Qk9ieUJHUXlCamRYUnZabVlnYjNCMGFXOXVJQzBnWkc5M2JpQnZibXg1WEc1MFpXMXdJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaHNiMmRmYjJKelpYaHdYMlJwWm1aZlpGUkJSMTlFVFZOUExDQm5aVzVsS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaHRaV0Z1WDJScFptWmZjMk52Y21VZ1BTQnRaV0Z1S0d4dloxOXZZbk5sZUhCZlpHbG1abDlrVkVGSFgwUk5VMDhwTENBdVozSnZkWEJ6SUQwZ0oyUnliM0FuS1Z4dVhHNTBaVzF3SUR3dElHeGxablJmYW05cGJpaDBaVzF3TENCa2FXWm1MbEpPUVN3Z1lua2dQU0JqS0Z3aVoyVnVaVndpSUQwZ1hDSmxibk5sYldKc1gyZGxibVZmYVdSY0lpa3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobWJHRm5JRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bFRHbHpkQzVrYjNkdUxsSk9RUzV1YjBaRFkzVjBiMlptTENCY0lqSkVUMWRPWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR01vS1N3Z1hDSXhWVkJjSWl3Z1hDSXdUazljSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhlRVpzWVdjZ1BTQW9ZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCdFlYaE1iMmN5UmtNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9jbXh2WnpKbVkwMWhlQ0E5SUhCdFlYZ29jRzFwYmloemFISnBibXRsWkY5c2IyY3lSa01zSUcxaGVFeHZaekpHUXlrc0lDMXRZWGhNYjJjeVJrTXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtHWnNZV2NwWEc1Y2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQnphSEpwYm10bFpGOXNiMmN5UmtNc0lIa2dQU0J0WldGdVgyUnBabVpmYzJOdmNtVXNJR052Ykc5eUlEMGdabXhoWnl3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdGaVpXd2dQU0JwWm1Wc2MyVW9abXhoWnlBaFBTQmNJakJPVDF3aUxDQmxlSFJsY201aGJGOW5aVzVsWDI1aGJXVXNJRTVCS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUdGd1pTQTlJR0Z6TG1aaFkzUnZjaWh0WVhoR2JHRm5LU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1oyVnZiVjkwWlhoMFgzSmxjR1ZzS0NrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QmNiaUFnWjJkMGFYUnNaU2hjSW1SVVFVZGNJaWtnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F0SUdScFptWkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnS3lCY2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ01Da2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0JtWTBOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJQzFtWTBOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUhOallXeGxYMk52Ykc5eVgyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2lNRTVQWENJZ1BTQmNJbWR5WlhsY0lpd2dYQ0l4VlZCY0lpQTlJRndpY21Wa1hDSXNJRndpTWtSUFYwNWNJaUE5SUZ3aVlteDFaVndpS1NrZ0t5QWdJeUJEYjNKeVpXTjBaV1FnWTI5c2IzSWdiV0Z3Y0dsdVoxeHVJQ0J6WTJGc1pWOXphR0Z3WlY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY0lsUlNWVVZjSWlBOUlESXNJRndpUmtGTVUwVmNJaUE5SURFNUtTbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWJHOW5Na1pEWDNaelgyRjJaMU5qYjNKbFgyUlVRVWRmVDBWZlhDSXNJR3h2YjNCVWVYQmxMQ0JjSWw5aGRtZE1iMmRQUlY5dWIwWkRZM1YwYjJabVhDSXBYRzVvWldsbmFIUWdQQzBnTkZ4dWQybGtkR2dnUEMwZ04xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5cbmxvb3BUeXBlIDwtIFxccC1wZVxcXG5cbiMgZ2V0dGluZyBsaXN0IG9mIGdlbmVzIG9mIGludGVyZXN0IGZyb20gUk5BLXNlcSBhbmQgUFJPLXNlcVxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmLlBSTy5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzFHMi5kVEFHX0cxLmRUQUdfdnNfRzEuRE1TT19QUk9zZXEudHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlBSTy5HMi5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzFHMi5kVEFHX0cyLmRUQUdfdnNfRzIuRE1TT19QUk9zZXEudHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSlcbiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuXG4jIExvYWRpbmcgT0UgbG9vcCBzY29yZVxubWluVmFsdWUgPC0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTylcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgbGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpXG5cbiMgVGVzdGluZyBkaWZmZXJlbnQgd2F5cyB0byBjYWxjdWxhdGUgcmVwcmVzZW50YXRpdmUgZmVhdHVyZSBvZiBsb29wcyBmb3IgZWFjaCBnZW5lXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQpKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmKSRlbnNlbWJsX2dlbmVfaWRcblxuZ2VuZUxpc3QudXAgPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzIuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkKSlcblxuXG4jIFsxXSBBdmVyYWdlIG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lXG4jIyBSTkEgb25seVxuZmNDdXRvZmYgPC0gMC41XG5hbHBoYSA8LSAwLjA1XG5tYXhMb2cyRkMgPC0gMlxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG4jZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLW4udHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcZFRBR1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19PRV9cXCwgbG9vcFR5cGUsIFxcX2F2Z0xvZ09FXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4jIE5vIEZDIGN1dG9mZiBvcHRpb24gLSBkb3duIG9ubHlcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4obG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmlua2VkX2xvZzJGQywgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcZFRBR1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19PRV9cXCwgbG9vcFR5cGUsIFxcX2F2Z0xvZ09FX25vRkNjdXRvZmZcXClcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->

loopType <- \p-pe\

# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1)


# Loading OE loop score
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

geneAnnoData <- geneAnnoData %>% left_join(obsexp, by = c(\id\))

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id))
geneList.down.RNA <- (diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.down.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.updown.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff)$ensembl_gene_id

geneList.up <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id))


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(log_obsexp_diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

#fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_\, loopType, \_avgLogOE\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# No FC cutoff option - down only
temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(log_obsexp_diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)


p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_\, loopType, \_avgLogOE_noFCcutoff\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNXNiMjl3Vkhsd1pTQThMU0JjWEhBdGNHVmNYRnh1WEc0aklHZGxkSFJwYm1jZ2JHbHpkQ0J2WmlCblpXNWxjeUJ2WmlCcGJuUmxjbVZ6ZENCbWNtOXRJRkpPUVMxelpYRWdZVzVrSUZCU1R5MXpaWEZjYm1Gc2NHaGhJRHd0SURBdU1EVmNibVpqUTNWMGIyWm1JRHd0SURBdU5WeHVaR2xtWmk1UVVrOHVSekV1WkZSQlJ5QThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4a2FXWm1YMGN4UnpJdVpGUkJSMTlITVM1a1ZFRkhYM1p6WDBjeExrUk5VMDlmVUZKUGMyVnhMblJ6ZGx4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY0dGa2FpQThJR0ZzY0doaExDQmhZbk1vYzJoeWFXNXJaV1JmYkc5bk1rWkRLU0ErSUdaalEzVjBiMlptS1Z4dVpHbG1aaTVRVWs4dVJ6SXVaRlJCUnlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhrYVdabVgwY3hSekl1WkZSQlIxOUhNaTVrVkVGSFgzWnpYMGN5TGtSTlUwOWZVRkpQYzJWeExuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jR0ZrYWlBOElHRnNjR2hoTENCaFluTW9jMmh5YVc1clpXUmZiRzluTWtaREtTQStJR1pqUTNWMGIyWm1LVnh1WkdsbVppNVNUa0V1UnpFdVpGUkJSeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeGthV1ptWDBjeExtUlVRVWRmUnpFdU1ta3VaRlJCUjE5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY0dGa2FpQThJR0ZzY0doaExDQmhZbk1vYzJoeWFXNXJaV1JmYkc5bk1rWkRLU0ErSUdaalEzVjBiMlptS1Z4dVpHbG1aaTVTVGtFdVJ6RXVaRlJCUnk1dWIwWkRZM1YwYjJabUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdScFptWmZSekV1WkZSQlIxOUhNUzR5YVM1a1ZFRkhYM1p6WDBjeExqSnBMa1JOVTA4dWRITjJYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaHdZV1JxSUR3Z1lXeHdhR0VwWEc0aklFbHRjRzl5ZEdsdVp5QnNiMjl3SUdkbGJtVWdZVzV1YjNSaGRHbHZibHh1Ym1GdFpTQThMU0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjWEZ4dVhHNWthV1ptUTNWMGIyWm1JRHd0SURBdU1seHVaMlZ1WlVGdWJtOUVZWFJoSUR3dElHeHZZV1JNYjI5d1FXNXViMFJoZEdFb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5d0xXNWZaVzV6WlcxaWJFeHBjM1F1ZEhOMlhGd3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHbG1aa04xZEc5bVppQTlJR1JwWm1aRGRYUnZabVlzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnVibTlNYVhOMElEMGdZeWhjWEZBdFVGeGNMQ0JjWEZBdFJWeGNMQ0JjWEZBdFUxeGNMQ0JjWEZBdFdGeGNLU2tsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pHbHpkR0Z1WTJVZ1BTQnpkR0Z5ZERJZ0xTQnpkR0Z5ZERFcFhHNWNibHh1SXlCTWIyRmthVzVuSUU5RklHeHZiM0FnYzJOdmNtVmNibTFwYmxaaGJIVmxJRHd0SUMwMFhHNXZZbk5sZUhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNoY1hHeHZiM0JUWTI5eVpWOWpiMjV6WDI5aWMyVjRjQzUwYzNaY1hDa3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoc2IyZGZiMkp6Wlhod1gwUk5VMDhnUFNCcFpsOWxiSE5sS0c5aWMyVjRjRjlFVFZOUElEMDlJREFzSUcxcGJsWmhiSFZsTENCc2IyY3lLRzlpYzJWNGNGOUVUVk5QS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOW5YMjlpYzJWNGNGOWtWRUZISUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmWkZSQlJ5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZaRlJCUnlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5ObGVIQmZRVFE0TlNBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDBFME9EVWdQVDBnTUN3Z2JXbHVWbUZzZFdVc0lHeHZaeklvYjJKelpYaHdYMEUwT0RVcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMlJwWm1aZlpGUkJSMTlFVFZOUElEMGdiRzluWDI5aWMyVjRjRjlrVkVGSElDMGdiRzluWDI5aWMyVjRjRjlFVFZOUExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5ObGVIQmZaR2xtWmw5Qk5EZzFYMFJOVTA4Z1BTQnNiMmRmYjJKelpYaHdYMEUwT0RVZ0xTQnNiMmRmYjJKelpYaHdYMFJOVTA4cFhHNWNibWRsYm1WQmJtNXZSR0YwWVNBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHeGxablJmYW05cGJpaHZZbk5sZUhBc0lHSjVJRDBnWXloY1hHbGtYRndwS1Z4dVhHNGpJRlJsYzNScGJtY2daR2xtWm1WeVpXNTBJSGRoZVhNZ2RHOGdZMkZzWTNWc1lYUmxJSEpsY0hKbGMyVnVkR0YwYVhabElHWmxZWFIxY21VZ2IyWWdiRzl2Y0hNZ1ptOXlJR1ZoWTJnZ1oyVnVaVnh1WkdsbVppNVNUa0VnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaR2xtWmw5SE1TNWtWRUZIWDBjeExqSnBMbVJVUVVkZmRuTmZSekV1TW1rdVJFMVRUeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dWdWMyVnRZbXhmWjJWdVpWOXBaQ3dnYkc5bk1rWnZiR1JEYUdGdVoyVXNJSE5vY21sdWEyVmtYMnh2WnpKR1F5d2djR0ZrYWl3Z1pYaDBaWEp1WVd4ZloyVnVaVjl1WVcxbEtWeHVaMlZ1WlV4cGMzUXVaRzkzYmlBOExTQjFibWx4ZFdVb1l5Z29aR2xtWmk1U1RrRXVSekV1WkZSQlJ5QWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FvWkdsbVppNVFVazh1UnpFdVpGUkJSeUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0F3S1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBb1pHbG1aaTVRVWs4dVJ6SXVaRlJCUnlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUENBd0tTa2taVzV6WlcxaWJGOW5aVzVsWDJsa0tTbGNibWRsYm1WTWFYTjBMbVJ2ZDI0dVVrNUJJRHd0SUNoa2FXWm1MbEpPUVM1SE1TNWtWRUZISUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hOb2NtbHVhMlZrWDJ4dlp6SkdReUE4SURBcEtTUmxibk5sYldKc1gyZGxibVZmYVdSY2JtZGxibVZNYVhOMExtUnZkMjR1VWs1QkxtNXZSa05qZFhSdlptWWdQQzBnS0dScFptWXVVazVCTGtjeExtUlVRVWN1Ym05R1EyTjFkRzltWmlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUENBd0tTa2taVzV6WlcxaWJGOW5aVzVsWDJsa1hHNW5aVzVsVEdsemRDNTFjR1J2ZDI0dVVrNUJMbTV2UmtOamRYUnZabVlnUEMwZ0tHUnBabVl1VWs1QkxrY3hMbVJVUVVjdWJtOUdRMk4xZEc5bVppa2taVzV6WlcxaWJGOW5aVzVsWDJsa1hHNWNibWRsYm1WTWFYTjBMblZ3SUR3dElIVnVhWEYxWlNoaktDaGthV1ptTGxKT1FTNUhNUzVrVkVGSElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtITm9jbWx1YTJWa1gyeHZaekpHUXlBK0lEQXBLU1JsYm5ObGJXSnNYMmRsYm1WZmFXUXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQW9aR2xtWmk1UVVrOHVSekV1WkZSQlJ5QWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BpQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLR1JwWm1ZdVVGSlBMa2N5TG1SVVFVY2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElENGdNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaQ2twWEc1Y2JseHVJeUJiTVYwZ1FYWmxjbUZuWlNCdlppQmthV1ptWlhKbGJuUnBZV3dnYkc5dmNDQnpZMjl5WlhNZ1ptOXlJR1ZoWTJnZ1oyVnVaVnh1SXlNZ1VrNUJJRzl1YkhsY2JtWmpRM1YwYjJabUlEd3RJREF1TlZ4dVlXeHdhR0VnUEMwZ01DNHdOVnh1YldGNFRHOW5Na1pESUR3dElESmNibHh1ZEdWdGNDQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2JHOW5YMjlpYzJWNGNGOWthV1ptWDJSVVFVZGZSRTFUVHl3Z1oyVnVaU2tnSlQ0bElGeHVJQ0IxYm01bGMzUW9aMlZ1WlNrZ0pUNGxJR2R5YjNWd1gySjVLR2RsYm1VcElDVStKVnh1SUNCemRXMXRZWEpwZW1Vb2JXVmhibDlrYVdabVgzTmpiM0psSUQwZ2JXVmhiaWhzYjJkZmIySnpaWGh3WDJScFptWmZaRlJCUjE5RVRWTlBLU3dnTG1keWIzVndjeUE5SUNka2NtOXdKeWxjYmx4dWRHVnRjQ0E4TFNCc1pXWjBYMnB2YVc0b2RHVnRjQ3dnWkdsbVppNVNUa0VzSUdKNUlEMGdZeWhjWEdkbGJtVmNYQ0E5SUZ4Y1pXNXpaVzFpYkY5blpXNWxYMmxrWEZ3cEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWm14aFp5QTlJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVaRzkzYmk1U1RrRXNJRnhjTWtSUFYwNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1l5Z3BMQ0JjWERGVlVGeGNMQ0JjWERCT1QxeGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYldGNFJteGhaeUE5SUNoaFluTW9jMmh5YVc1clpXUmZiRzluTWtaREtTQStJRzFoZUV4dlp6SkdReWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJoeWJHOW5NbVpqVFdGNElEMGdjRzFoZUNod2JXbHVLSE5vY21sdWEyVmtYMnh2WnpKR1F5d2diV0Y0VEc5bk1rWkRLU3dnTFcxaGVFeHZaekpHUXlrcElDVStKU0JjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvWm14aFp5bGNibHh1STJaM2NtbDBaU2gwWlcxd0xDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhuWlc1bFgyRjJaMU5qYjNKbFgyWmpYMlJVUVVkZmNDMXVMblJ6ZGx4Y0tTd2djMlZ3SUQwZ1hGeGNYSFJjWENsY2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQnphSEpzYjJjeVptTk5ZWGdzSUhrZ1BTQnRaV0Z1WDJScFptWmZjMk52Y21Vc0lHTnZiRzl5SUQwZ1pteGhaeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BTQnBabVZzYzJVb1pteGhaeUFoUFNCY1hEQk9UMXhjTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVc0lFNUJLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphR0Z3WlNBOUlHRnpMbVpoWTNSdmNpaHRZWGhHYkdGbktTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWjJWdmJWOTBaWGgwWDNKbGNHVnNLQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCY2JpQWdaMmQwYVhSc1pTaGNYR1JVUVVkY1hDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXRJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLeUJjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQm1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlDMW1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y01FNVBYRndnUFNCY1hHZHlaWGxjWEN3Z1hGd3hWVkJjWENBOUlGeGNjbVZrWEZ3c0lGeGNNa1JQVjA1Y1hDQTlJRnhjWW14MVpWeGNLU2tnS3lBZ0l5QkRiM0p5WldOMFpXUWdZMjlzYjNJZ2JXRndjR2x1WjF4dUlDQnpZMkZzWlY5emFHRndaVjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjWEZSU1ZVVmNYQ0E5SURJc0lGeGNSa0ZNVTBWY1hDQTlJREU1S1NsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjYkc5bk1rWkRYM1p6WDJGMloxTmpiM0psWDJSVVFVZGZUMFZmWEZ3c0lHeHZiM0JVZVhCbExDQmNYRjloZG1kTWIyZFBSVnhjS1Z4dWFHVnBaMmgwSUR3dElEUmNibmRwWkhSb0lEd3RJRGRjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibHh1SXlCT2J5QkdReUJqZFhSdlptWWdiM0IwYVc5dUlDMGdaRzkzYmlCdmJteDVYRzUwWlcxd0lEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QTENCblpXNWxLU0FsUGlVZ1hHNGdJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVWdaM0p2ZFhCZllua29aMlZ1WlNrZ0pUNGxYRzRnSUhOMWJXMWhjbWw2WlNodFpXRnVYMlJwWm1aZmMyTnZjbVVnUFNCdFpXRnVLR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOHBMQ0F1WjNKdmRYQnpJRDBnSjJSeWIzQW5LVnh1WEc1MFpXMXdJRHd0SUd4bFpuUmZhbTlwYmloMFpXMXdMQ0JrYVdabUxsSk9RU3dnWW5rZ1BTQmpLRnhjWjJWdVpWeGNJRDBnWEZ4bGJuTmxiV0pzWDJkbGJtVmZhV1JjWENrcElDVStKU0JjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2htYkdGbklEMGdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsVEdsemRDNWtiM2R1TGxKT1FTNXViMFpEWTNWMGIyWm1MQ0JjWERKRVQxZE9YRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHTW9LU3dnWEZ3eFZWQmNYQ3dnWEZ3d1RrOWNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxaGVFWnNZV2NnUFNBb1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJ0WVhoTWIyY3lSa01wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb2NteHZaekptWTAxaGVDQTlJSEJ0WVhnb2NHMXBiaWh6YUhKcGJtdGxaRjlzYjJjeVJrTXNJRzFoZUV4dlp6SkdReWtzSUMxdFlYaE1iMmN5UmtNcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0dac1lXY3BYRzVjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCemFISnBibXRsWkY5c2IyY3lSa01zSUhrZ1BTQnRaV0Z1WDJScFptWmZjMk52Y21Vc0lHTnZiRzl5SUQwZ1pteGhaeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BTQnBabVZzYzJVb1pteGhaeUFoUFNCY1hEQk9UMXhjTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVc0lFNUJLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphR0Z3WlNBOUlHRnpMbVpoWTNSdmNpaHRZWGhHYkdGbktTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWjJWdmJWOTBaWGgwWDNKbGNHVnNLQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCY2JpQWdaMmQwYVhSc1pTaGNYR1JVUVVkY1hDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXRJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLeUJjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQm1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlDMW1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y01FNVBYRndnUFNCY1hHZHlaWGxjWEN3Z1hGd3hWVkJjWENBOUlGeGNjbVZrWEZ3c0lGeGNNa1JQVjA1Y1hDQTlJRnhjWW14MVpWeGNLU2tnS3lBZ0l5QkRiM0p5WldOMFpXUWdZMjlzYjNJZ2JXRndjR2x1WjF4dUlDQnpZMkZzWlY5emFHRndaVjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjWEZSU1ZVVmNYQ0E5SURJc0lGeGNSa0ZNVTBWY1hDQTlJREU1S1NsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjYkc5bk1rWkRYM1p6WDJGMloxTmpiM0psWDJSVVFVZGZUMFZmWEZ3c0lHeHZiM0JVZVhCbExDQmNYRjloZG1kTWIyZFBSVjl1YjBaRFkzVjBiMlptWEZ3cFhHNW9aV2xuYUhRZ1BDMGdORnh1ZDJsa2RHZ2dQQzBnTjF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuXG5sb29wVHlwZSA8LSBcXHAtcGVcXFxuXG4jIGdldHRpbmcgbGlzdCBvZiBnZW5lcyBvZiBpbnRlcmVzdCBmcm9tIFJOQS1zZXEgYW5kIFBSTy1zZXFcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZi5QUk8uRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxRzIuZFRBR19HMS5kVEFHX3ZzX0cxLkRNU09fUFJPc2VxLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5QUk8uRzIuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxRzIuZFRBR19HMi5kVEFHX3ZzX0cyLkRNU09fUFJPc2VxLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5STkEuRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEpXG4jIEltcG9ydGluZyBsb29wIGdlbmUgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSklPiUgXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpXG5cblxuIyBMb2FkaW5nIE9FIGxvb3Agc2NvcmVcbm1pblZhbHVlIDwtIC00XG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pXG5cbmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuXG4jIFRlc3RpbmcgZGlmZmVyZW50IHdheXMgdG8gY2FsY3VsYXRlIHJlcHJlc2VudGF0aXZlIGZlYXR1cmUgb2YgbG9vcHMgZm9yIGVhY2ggZ2VuZVxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93biA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzIuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkKSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cGRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZikkZW5zZW1ibF9nZW5lX2lkXG5cbmdlbmVMaXN0LnVwIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCkpXG5cblxuIyBbMV0gQXZlcmFnZSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfXFwsIGxvb3BUeXBlLCBcXF9hdmdMb2dPRVxcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuIyBObyBGQyBjdXRvZmYgb3B0aW9uIC0gZG93biBvbmx5XG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJpbmtlZF9sb2cyRkMsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfXFwsIGxvb3BUeXBlLCBcXF9hdmdMb2dPRV9ub0ZDY3V0b2ZmXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5sb29wVHlwZSA8LSBcXHAtcGVcXFxuXG4jIGdldHRpbmcgbGlzdCBvZiBnZW5lcyBvZiBpbnRlcmVzdCBmcm9tIFJOQS1zZXEgYW5kIFBSTy1zZXFcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZi5QUk8uRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxRzIuZFRBR19HMS5kVEFHX3ZzX0cxLkRNU09fUFJPc2VxLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5QUk8uRzIuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxRzIuZFRBR19HMi5kVEFHX3ZzX0cyLkRNU09fUFJPc2VxLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5STkEuRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEpXG4jIEltcG9ydGluZyBsb29wIGdlbmUgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSklPiUgXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpXG5cblxuIyBMb2FkaW5nIE9FIGxvb3Agc2NvcmVcbm1pblZhbHVlIDwtIC00XG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pXG5cbmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuXG4jIFRlc3RpbmcgZGlmZmVyZW50IHdheXMgdG8gY2FsY3VsYXRlIHJlcHJlc2VudGF0aXZlIGZlYXR1cmUgb2YgbG9vcHMgZm9yIGVhY2ggZ2VuZVxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93biA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzIuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkKSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cGRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZikkZW5zZW1ibF9nZW5lX2lkXG5cbmdlbmVMaXN0LnVwIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCkpXG5cblxuIyBbMV0gQXZlcmFnZSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfXFwsIGxvb3BUeXBlLCBcXF9hdmdMb2dPRVxcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuIyBObyBGQyBjdXRvZmYgb3B0aW9uIC0gZG93biBvbmx5XG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJpbmtlZF9sb2cyRkMsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfXFwsIGxvb3BUeXBlLCBcXF9hdmdMb2dPRV9ub0ZDY3V0b2ZmXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r

loopType <- \p-pe\

# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1)


# Loading OE loop score
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

geneAnnoData <- geneAnnoData %>% left_join(obsexp, by = c(\id\))

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id))
geneList.down.RNA <- (diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.down.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.updown.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff)$ensembl_gene_id

geneList.up <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id))


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(log_obsexp_diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

#fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_\, loopType, \_avgLogOE\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# No FC cutoff option - down only
temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(log_obsexp_diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)


p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_\, loopType, \_avgLogOE_noFCcutoff\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### dTAG Scatterplot

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJuWlhSMGFXNW5JR3hwYzNRZ2IyWWdaMlZ1WlhNZ2IyWWdhVzUwWlhKbGMzUWdabkp2YlNCU1RrRXRjMlZ4SUdGdVpDQlFVazh0YzJWeFhHNWhiSEJvWVNBOExTQXdMakExWEc1bVkwTjFkRzltWmlBOExTQXdMalZjYm1ScFptWXVVRkpQTGtjeExtUlVRVWNnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laR2xtWmw5SE1VY3lMbVJVUVVkZlJ6RXVaRlJCUjE5MmMxOUhNUzVFVFZOUFgxQlNUM05sY1M1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIQmhaR29nUENCaGJIQm9ZU3dnWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQm1ZME4xZEc5bVppbGNibVJwWm1ZdVVGSlBMa2N5TG1SVVFVY2dQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVpHbG1abDlITVVjeUxtUlVRVWRmUnpJdVpGUkJSMTkyYzE5SE1pNUVUVk5QWDFCU1QzTmxjUzUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VWs1QkxrY3hMbVJVUVVjZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIQmhaR29nUENCaGJIQm9ZU3dnWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQm1ZME4xZEc5bVppbGNibVJwWm1ZdVVrNUJMa2N4TG1SVVFVY3VibTlHUTJOMWRHOW1aaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSmthV1ptWDBjeExtUlVRVWRmUnpFdU1ta3VaRlJCUjE5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY0dGa2FpQThJR0ZzY0doaEtWeHVJeUJKYlhCdmNuUnBibWNnYkc5dmNDQm5aVzVsSUdGdWJtOTBZWFJwYjI1Y2JtNWhiV1VnUEMwZ1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVhDSmNibHh1WkdsbVprTjFkRzltWmlBOExTQXdMakpjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZjQzF1WDJWdWMyVnRZbXhNYVhOMExuUnpkbHdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwWm1aRGRYUnZabVlnUFNCa2FXWm1RM1YwYjJabUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVmhjSWlrcEpUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhLVnh1WEc1Y2JpTWdURzloWkdsdVp5QlBSU0JzYjI5d0lITmpiM0psWEc1dGFXNVdZV3gxWlNBOExTQXRORnh1YjJKelpYaHdJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9YQ0pzYjI5d1UyTnZjbVZmWTI5dWMxOXZZbk5sZUhBdWRITjJYQ0lwS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9iRzluWDI5aWMyVjRjRjlFVFZOUElEMGdhV1pmWld4elpTaHZZbk5sZUhCZlJFMVRUeUE5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmUkUxVFR5a3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WjE5dlluTmxlSEJmWkZSQlJ5QTlJR2xtWDJWc2MyVW9iMkp6Wlhod1gyUlVRVWNnUFQwZ01Dd2diV2x1Vm1Gc2RXVXNJR3h2WnpJb2IySnpaWGh3WDJSVVFVY3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDBFME9EVWdQU0JwWmw5bGJITmxLRzlpYzJWNGNGOUJORGcxSUQwOUlEQXNJRzFwYmxaaGJIVmxMQ0JzYjJjeUtHOWljMlY0Y0Y5Qk5EZzFLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5a2FXWm1YMlJVUVVkZlJFMVRUeUE5SUd4dloxOXZZbk5sZUhCZlpGUkJSeUF0SUd4dloxOXZZbk5sZUhCZlJFMVRUeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDJScFptWmZRVFE0TlY5RVRWTlBJRDBnYkc5blgyOWljMlY0Y0Y5Qk5EZzFJQzBnYkc5blgyOWljMlY0Y0Y5RVRWTlBLVnh1WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JzWldaMFgycHZhVzRvYjJKelpYaHdMQ0JpZVNBOUlHTW9YQ0pwWkZ3aUtTbGNibHh1SXlCVVpYTjBhVzVuSUdScFptWmxjbVZ1ZENCM1lYbHpJSFJ2SUdOaGJHTjFiR0YwWlNCeVpYQnlaWE5sYm5SaGRHbDJaU0JtWldGMGRYSmxJRzltSUd4dmIzQnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JtUnBabVl1VWs1QklEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1ScFptWmZSekV1WkZSQlIxOUhNUzR5YVM1a1ZFRkhYM1p6WDBjeExqSnBMa1JOVTA4dWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGxibk5sYldKc1gyZGxibVZmYVdRc0lHeHZaekpHYjJ4a1EyaGhibWRsTENCemFISnBibXRsWkY5c2IyY3lSa01zSUhCaFpHb3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU2xjYm1kbGJtVk1hWE4wTG1SdmQyNGdQQzBnZFc1cGNYVmxLR01vS0dScFptWXVVazVCTGtjeExtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHdnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tHUnBabVl1VUZKUExrY3hMbVJVUVVjZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLR1JwWm1ZdVVGSlBMa2N5TG1SVVFVY2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElEd2dNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaQ2twWEc1blpXNWxUR2x6ZEM1a2IzZHVMbEpPUVNBOExTQW9aR2xtWmk1U1RrRXVSekV1WkZSQlJ5QWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtYRzVuWlc1bFRHbHpkQzVrYjNkdUxsSk9RUzV1YjBaRFkzVjBiMlptSUR3dElDaGthV1ptTGxKT1FTNUhNUzVrVkVGSExtNXZSa05qZFhSdlptWWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElEd2dNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WjJWdVpVeHBjM1F1ZFhCa2IzZHVMbEpPUVM1dWIwWkRZM1YwYjJabUlEd3RJQ2hrYVdabUxsSk9RUzVITVM1a1ZFRkhMbTV2UmtOamRYUnZabVlwSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WEc1blpXNWxUR2x6ZEM1MWNDQThMU0IxYm1seGRXVW9ZeWdvWkdsbVppNVNUa0V1UnpFdVpGUkJSeUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQaUF3S1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS0dScFptWXVVRkpQTGtjeExtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRDRnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNoa2FXWm1MbEJTVHk1SE1pNWtWRUZISUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hOb2NtbHVhMlZrWDJ4dlp6SkdReUErSURBcEtTUmxibk5sYldKc1gyZGxibVZmYVdRcEtWeHVYRzVjYmlNZ1d6RmRJRUYyWlhKaFoyVWdiMllnWkdsbVptVnlaVzUwYVdGc0lHeHZiM0FnYzJOdmNtVnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JpTWpJRkpPUVNCdmJteDVYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibUZzY0doaElEd3RJREF1TURWY2JtMWhlRXh2WnpKR1F5QThMU0F5WEc1Y2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOHNJR2RsYm1VcElDVStKU0JjYmlBZ2RXNXVaWE4wS0dkbGJtVXBJQ1UrSlNCbmNtOTFjRjlpZVNoblpXNWxLU0FsUGlWY2JpQWdjM1Z0YldGeWFYcGxLRzFsWVc1ZlpHbG1abDl6WTI5eVpTQTlJSE4xYlNoc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QS1N3Z0xtZHliM1Z3Y3lBOUlDZGtjbTl3SnlsY2JseHVkR1Z0Y0NBOExTQnNaV1owWDJwdmFXNG9kR1Z0Y0N3Z1pHbG1aaTVTVGtFc0lHSjVJRDBnWXloY0ltZGxibVZjSWlBOUlGd2laVzV6WlcxaWJGOW5aVzVsWDJsa1hDSXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pteGhaeUE5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1Wkc5M2JpNVNUa0VzSUZ3aU1rUlBWMDVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdZeWdwTENCY0lqRlZVRndpTENCY0lqQk9UMXdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXRjRSbXhoWnlBOUlDaGhZbk1vYzJoeWFXNXJaV1JmYkc5bk1rWkRLU0ErSUcxaGVFeHZaekpHUXlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyaHliRzluTW1aalRXRjRJRDBnY0cxaGVDaHdiV2x1S0hOb2NtbHVhMlZrWDJ4dlp6SkdReXdnYldGNFRHOW5Na1pES1N3Z0xXMWhlRXh2WnpKR1F5a3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pteGhaeWxjYmx4dUkyWjNjbWwwWlNoMFpXMXdMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKblpXNWxYMkYyWjFOamIzSmxYMlpqWDJSVVFVZGZjQzF1TG5SemRsd2lLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J6YUhKc2IyY3labU5OWVhnc0lIa2dQU0J0WldGdVgyUnBabVpmYzJOdmNtVXNJR052Ykc5eUlEMGdabXhoWnl3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdGaVpXd2dQU0JwWm1Wc2MyVW9abXhoWnlBaFBTQmNJakJPVDF3aUxDQmxlSFJsY201aGJGOW5aVzVsWDI1aGJXVXNJRTVCS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUdGd1pTQTlJR0Z6TG1aaFkzUnZjaWh0WVhoR2JHRm5LU2twSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ1oyVnZiVjkwWlhoMFgzSmxjR1ZzS0NrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QmNiaUFnWjJkMGFYUnNaU2hjSW1SVVFVZGNJaWtnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F0SUdScFptWkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnS3lCY2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ01Da2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0JtWTBOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJQzFtWTBOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUhOallXeGxYMk52Ykc5eVgyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2lNRTVQWENJZ1BTQmNJbWR5WlhsY0lpd2dYQ0l4VlZCY0lpQTlJRndpY21Wa1hDSXNJRndpTWtSUFYwNWNJaUE5SUZ3aVlteDFaVndpS1NrZ0t5QWdJeUJEYjNKeVpXTjBaV1FnWTI5c2IzSWdiV0Z3Y0dsdVoxeHVJQ0J6WTJGc1pWOXphR0Z3WlY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY0lsUlNWVVZjSWlBOUlESXNJRndpUmtGTVUwVmNJaUE5SURFNUtTbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWJHOW5Na1pEWDNaelgyRjJaMU5qYjNKbFgyUlVRVWRmVDBWZmNDMXVYM04xYlV4dlowOUZYQ0lwWEc1b1pXbG5hSFFnUEMwZ05GeHVkMmxrZEdnZ1BDMGdOMXh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ3aWFXNWNJaXdnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVYRzRqSUU1dklFWkRJR04xZEc5bVppQnZjSFJwYjI0Z0xTQmtiM2R1SUc5dWJIbGNiblJsYlhBZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0d4dloxOXZZbk5sZUhCZlpHbG1abDlrVkVGSFgwUk5VMDhzSUdkbGJtVXBJQ1UrSlNCY2JpQWdkVzV1WlhOMEtHZGxibVVwSUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0cxbFlXNWZaR2xtWmw5elkyOXlaU0E5SUhOMWJTaHNiMmRmYjJKelpYaHdYMlJwWm1aZlpGUkJSMTlFVFZOUEtTd2dMbWR5YjNWd2N5QTlJQ2RrY205d0p5bGNibHh1ZEdWdGNDQThMU0JzWldaMFgycHZhVzRvZEdWdGNDd2daR2xtWmk1U1RrRXNJR0o1SUQwZ1l5aGNJbWRsYm1WY0lpQTlJRndpWlc1elpXMWliRjluWlc1bFgybGtYQ0lwS1NBbFBpVWdYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9abXhoWnlBOUlHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaVXhwYzNRdVpHOTNiaTVTVGtFdWJtOUdRMk4xZEc5bVppd2dYQ0l5UkU5WFRsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCaktDa3NJRndpTVZWUVhDSXNJRndpTUU1UFhDSXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhoR2JHRm5JRDBnS0dGaWN5aHphSEpwYm10bFpGOXNiMmN5UmtNcElENGdiV0Y0VEc5bk1rWkRLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUhKc2IyY3labU5OWVhnZ1BTQndiV0Y0S0hCdGFXNG9jMmh5YVc1clpXUmZiRzluTWtaRExDQnRZWGhNYjJjeVJrTXBMQ0F0YldGNFRHOW5Na1pES1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2htYkdGbktWeHVYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnYzJoeWFXNXJaV1JmYkc5bk1rWkRMQ0I1SUQwZ2JXVmhibDlrYVdabVgzTmpiM0psTENCamIyeHZjaUE5SUdac1lXY3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeGhZbVZzSUQwZ2FXWmxiSE5sS0dac1lXY2dJVDBnWENJd1RrOWNJaXdnWlhoMFpYSnVZV3hmWjJWdVpWOXVZVzFsTENCT1FTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyaGhjR1VnUFNCaGN5NW1ZV04wYjNJb2JXRjRSbXhoWnlrcEtTQXJYRzRnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJR2RsYjIxZmRHVjRkRjl5WlhCbGJDZ3BJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWEc0Z0lHZG5kR2wwYkdVb1hDSmtWRUZIWENJcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ0xTQmthV1ptUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDc2dYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ1ptTkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBdFptTkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQnpZMkZzWlY5amIyeHZjbDl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWpCT1Qxd2lJRDBnWENKbmNtVjVYQ0lzSUZ3aU1WVlFYQ0lnUFNCY0luSmxaRndpTENCY0lqSkVUMWRPWENJZ1BTQmNJbUpzZFdWY0lpa3BJQ3NnSUNNZ1EyOXljbVZqZEdWa0lHTnZiRzl5SUcxaGNIQnBibWRjYmlBZ2MyTmhiR1ZmYzJoaGNHVmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YQ0pVVWxWRlhDSWdQU0F5TENCY0lrWkJURk5GWENJZ1BTQXhPU2twWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbXh2WnpKR1ExOTJjMTloZG1kVFkyOXlaVjlrVkVGSFgwOUZYM0F0Ymw5emRXMU1iMmRQUlY5dWIwWkRZM1YwYjJabVhDSXBYRzVvWldsbmFIUWdQQzBnTkZ4dWQybGtkR2dnUEMwZ04xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jIGdldHRpbmcgbGlzdCBvZiBnZW5lcyBvZiBpbnRlcmVzdCBmcm9tIFJOQS1zZXEgYW5kIFBSTy1zZXFcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZi5QUk8uRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxRzIuZFRBR19HMS5kVEFHX3ZzX0cxLkRNU09fUFJPc2VxLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5QUk8uRzIuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxRzIuZFRBR19HMi5kVEFHX3ZzX0cyLkRNU09fUFJPc2VxLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5STkEuRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEpXG4jIEltcG9ydGluZyBsb29wIGdlbmUgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSklPiUgXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpXG5cblxuIyBMb2FkaW5nIE9FIGxvb3Agc2NvcmVcbm1pblZhbHVlIDwtIC00XG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pXG5cbmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuXG4jIFRlc3RpbmcgZGlmZmVyZW50IHdheXMgdG8gY2FsY3VsYXRlIHJlcHJlc2VudGF0aXZlIGZlYXR1cmUgb2YgbG9vcHMgZm9yIGVhY2ggZ2VuZVxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93biA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzIuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkKSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cGRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZikkZW5zZW1ibF9nZW5lX2lkXG5cbmdlbmVMaXN0LnVwIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCkpXG5cblxuIyBbMV0gQXZlcmFnZSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gc3VtKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG4jZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLW4udHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcZFRBR1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19PRV9wLW5fc3VtTG9nT0VcXClcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbiMgTm8gRkMgY3V0b2ZmIG9wdGlvbiAtIGRvd24gb25seVxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gc3VtKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJpbmtlZF9sb2cyRkMsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfcC1uX3N1bUxvZ09FX25vRkNjdXRvZmZcXClcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1)


# Loading OE loop score
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

geneAnnoData <- geneAnnoData %>% left_join(obsexp, by = c(\id\))

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id))
geneList.down.RNA <- (diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.down.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.updown.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff)$ensembl_gene_id

geneList.up <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id))


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = sum(log_obsexp_diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

#fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_sumLogOE\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# No FC cutoff option - down only
temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = sum(log_obsexp_diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)


p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_sumLogOE_noFCcutoff\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5Qm5aWFIwYVc1bklHeHBjM1FnYjJZZ1oyVnVaWE1nYjJZZ2FXNTBaWEpsYzNRZ1puSnZiU0JTVGtFdGMyVnhJR0Z1WkNCUVVrOHRjMlZ4WEc1aGJIQm9ZU0E4TFNBd0xqQTFYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibVJwWm1ZdVVGSlBMa2N4TG1SVVFVY2dQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1pHbG1abDlITVVjeUxtUlVRVWRmUnpFdVpGUkJSMTkyYzE5SE1TNUVUVk5QWDFCU1QzTmxjUzUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VUZKUExrY3lMbVJVUVVjZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWkdsbVpsOUhNVWN5TG1SVVFVZGZSekl1WkZSQlIxOTJjMTlITWk1RVRWTlBYMUJTVDNObGNTNTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEJoWkdvZ1BDQmhiSEJvWVN3Z1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJtWTBOMWRHOW1aaWxjYm1ScFptWXVVazVCTGtjeExtUlVRVWNnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaR2xtWmw5SE1TNWtWRUZIWDBjeExqSnBMbVJVUVVkZmRuTmZSekV1TW1rdVJFMVRUeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VWs1QkxrY3hMbVJVUVVjdWJtOUdRMk4xZEc5bVppQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4a2FXWm1YMGN4TG1SVVFVZGZSekV1TW1rdVpGUkJSMTkyYzE5SE1TNHlhUzVFVFZOUExuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jR0ZrYWlBOElHRnNjR2hoS1Z4dUl5QkpiWEJ2Y25ScGJtY2diRzl2Y0NCblpXNWxJR0Z1Ym05MFlYUnBiMjVjYm01aGJXVWdQQzBnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WEZ4Y2JseHVaR2xtWmtOMWRHOW1aaUE4TFNBd0xqSmNibWRsYm1WQmJtNXZSR0YwWVNBOExTQnNiMkZrVEc5dmNFRnVibTlFWVhSaEtHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZmNDMXVYMlZ1YzJWdFlteE1hWE4wTG5SemRseGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnBabVpEZFhSdlptWWdQU0JrYVdabVEzVjBiMlptTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhibTV2VEdsemRDQTlJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWaGNYQ2twSlQ0bElGeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBjM1JoYm1ObElEMGdjM1JoY25ReUlDMGdjM1JoY25ReEtWeHVYRzVjYmlNZ1RHOWhaR2x1WnlCUFJTQnNiMjl3SUhOamIzSmxYRzV0YVc1V1lXeDFaU0E4TFNBdE5GeHViMkp6Wlhod0lEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb1hGeHNiMjl3VTJOdmNtVmZZMjl1YzE5dlluTmxlSEF1ZEhOMlhGd3BLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2JHOW5YMjlpYzJWNGNGOUVUVk5QSUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmUkUxVFR5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZSRTFUVHlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5ObGVIQmZaRlJCUnlBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDJSVVFVY2dQVDBnTUN3Z2JXbHVWbUZzZFdVc0lHeHZaeklvYjJKelpYaHdYMlJVUVVjcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMEUwT0RVZ1BTQnBabDlsYkhObEtHOWljMlY0Y0Y5Qk5EZzFJRDA5SURBc0lHMXBibFpoYkhWbExDQnNiMmN5S0c5aWMyVjRjRjlCTkRnMUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrYVdabVgyUlVRVWRmUkUxVFR5QTlJR3h2WjE5dlluTmxlSEJmWkZSQlJ5QXRJR3h2WjE5dlluTmxlSEJmUkUxVFR5eGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMlJwWm1aZlFUUTROVjlFVFZOUElEMGdiRzluWDI5aWMyVjRjRjlCTkRnMUlDMGdiRzluWDI5aWMyVjRjRjlFVFZOUEtWeHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQnNaV1owWDJwdmFXNG9iMkp6Wlhod0xDQmllU0E5SUdNb1hGeHBaRnhjS1NsY2JseHVJeUJVWlhOMGFXNW5JR1JwWm1abGNtVnVkQ0IzWVhseklIUnZJR05oYkdOMWJHRjBaU0J5WlhCeVpYTmxiblJoZEdsMlpTQm1aV0YwZFhKbElHOW1JR3h2YjNCeklHWnZjaUJsWVdOb0lHZGxibVZjYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR1JwWm1aZlJ6RXVaRlJCUjE5SE1TNHlhUzVrVkVGSFgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibWRsYm1WTWFYTjBMbVJ2ZDI0Z1BDMGdkVzVwY1hWbEtHTW9LR1JwWm1ZdVVrNUJMa2N4TG1SVVFVY2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElEd2dNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS0dScFptWXVVRkpQTGtjeExtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHdnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tHUnBabVl1VUZKUExrY3lMbVJVUVVjZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpDa3BYRzVuWlc1bFRHbHpkQzVrYjNkdUxsSk9RU0E4TFNBb1pHbG1aaTVTVGtFdVJ6RXVaRlJCUnlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUENBd0tTa2taVzV6WlcxaWJGOW5aVzVsWDJsa1hHNW5aVzVsVEdsemRDNWtiM2R1TGxKT1FTNXViMFpEWTNWMGIyWm1JRHd0SUNoa2FXWm1MbEpPUVM1SE1TNWtWRUZITG01dlJrTmpkWFJ2Wm1ZZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVaMlZ1WlV4cGMzUXVkWEJrYjNkdUxsSk9RUzV1YjBaRFkzVjBiMlptSUR3dElDaGthV1ptTGxKT1FTNUhNUzVrVkVGSExtNXZSa05qZFhSdlptWXBKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVYRzVuWlc1bFRHbHpkQzUxY0NBOExTQjFibWx4ZFdVb1l5Z29aR2xtWmk1U1RrRXVSekV1WkZSQlJ5QWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BpQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLR1JwWm1ZdVVGSlBMa2N4TG1SVVFVY2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElENGdNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2hrYVdabUxsQlNUeTVITWk1a1ZFRkhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSE5vY21sdWEyVmtYMnh2WnpKR1F5QStJREFwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1FwS1Z4dVhHNWNiaU1nV3pGZElFRjJaWEpoWjJVZ2IyWWdaR2xtWm1WeVpXNTBhV0ZzSUd4dmIzQWdjMk52Y21WeklHWnZjaUJsWVdOb0lHZGxibVZjYmlNaklGSk9RU0J2Ym14NVhHNW1ZME4xZEc5bVppQThMU0F3TGpWY2JtRnNjR2hoSUR3dElEQXVNRFZjYm0xaGVFeHZaekpHUXlBOExTQXlYRzVjYm5SbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHeHZaMTl2WW5ObGVIQmZaR2xtWmw5a1ZFRkhYMFJOVTA4c0lHZGxibVVwSUNVK0pTQmNiaUFnZFc1dVpYTjBLR2RsYm1VcElDVStKU0JuY205MWNGOWllU2huWlc1bEtTQWxQaVZjYmlBZ2MzVnRiV0Z5YVhwbEtHMWxZVzVmWkdsbVpsOXpZMjl5WlNBOUlITjFiU2hzYjJkZmIySnpaWGh3WDJScFptWmZaRlJCUjE5RVRWTlBLU3dnTG1keWIzVndjeUE5SUNka2NtOXdKeWxjYmx4dWRHVnRjQ0E4TFNCc1pXWjBYMnB2YVc0b2RHVnRjQ3dnWkdsbVppNVNUa0VzSUdKNUlEMGdZeWhjWEdkbGJtVmNYQ0E5SUZ4Y1pXNXpaVzFpYkY5blpXNWxYMmxrWEZ3cEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWm14aFp5QTlJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVaRzkzYmk1U1RrRXNJRnhjTWtSUFYwNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1l5Z3BMQ0JjWERGVlVGeGNMQ0JjWERCT1QxeGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYldGNFJteGhaeUE5SUNoaFluTW9jMmh5YVc1clpXUmZiRzluTWtaREtTQStJRzFoZUV4dlp6SkdReWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJoeWJHOW5NbVpqVFdGNElEMGdjRzFoZUNod2JXbHVLSE5vY21sdWEyVmtYMnh2WnpKR1F5d2diV0Y0VEc5bk1rWkRLU3dnTFcxaGVFeHZaekpHUXlrcElDVStKU0JjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvWm14aFp5bGNibHh1STJaM2NtbDBaU2gwWlcxd0xDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhuWlc1bFgyRjJaMU5qYjNKbFgyWmpYMlJVUVVkZmNDMXVMblJ6ZGx4Y0tTd2djMlZ3SUQwZ1hGeGNYSFJjWENsY2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQnphSEpzYjJjeVptTk5ZWGdzSUhrZ1BTQnRaV0Z1WDJScFptWmZjMk52Y21Vc0lHTnZiRzl5SUQwZ1pteGhaeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BTQnBabVZzYzJVb1pteGhaeUFoUFNCY1hEQk9UMXhjTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVc0lFNUJLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphR0Z3WlNBOUlHRnpMbVpoWTNSdmNpaHRZWGhHYkdGbktTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWjJWdmJWOTBaWGgwWDNKbGNHVnNLQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCY2JpQWdaMmQwYVhSc1pTaGNYR1JVUVVkY1hDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXRJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLeUJjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQm1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlDMW1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y01FNVBYRndnUFNCY1hHZHlaWGxjWEN3Z1hGd3hWVkJjWENBOUlGeGNjbVZrWEZ3c0lGeGNNa1JQVjA1Y1hDQTlJRnhjWW14MVpWeGNLU2tnS3lBZ0l5QkRiM0p5WldOMFpXUWdZMjlzYjNJZ2JXRndjR2x1WjF4dUlDQnpZMkZzWlY5emFHRndaVjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjWEZSU1ZVVmNYQ0E5SURJc0lGeGNSa0ZNVTBWY1hDQTlJREU1S1NsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjYkc5bk1rWkRYM1p6WDJGMloxTmpiM0psWDJSVVFVZGZUMFZmY0MxdVgzTjFiVXh2WjA5RlhGd3BYRzVvWldsbmFIUWdQQzBnTkZ4dWQybGtkR2dnUEMwZ04xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRnhjYVc1Y1hDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2twTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVhHNGpJRTV2SUVaRElHTjFkRzltWmlCdmNIUnBiMjRnTFNCa2IzZHVJRzl1YkhsY2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOHNJR2RsYm1VcElDVStKU0JjYmlBZ2RXNXVaWE4wS0dkbGJtVXBJQ1UrSlNCbmNtOTFjRjlpZVNoblpXNWxLU0FsUGlWY2JpQWdjM1Z0YldGeWFYcGxLRzFsWVc1ZlpHbG1abDl6WTI5eVpTQTlJSE4xYlNoc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QS1N3Z0xtZHliM1Z3Y3lBOUlDZGtjbTl3SnlsY2JseHVkR1Z0Y0NBOExTQnNaV1owWDJwdmFXNG9kR1Z0Y0N3Z1pHbG1aaTVTVGtFc0lHSjVJRDBnWXloY1hHZGxibVZjWENBOUlGeGNaVzV6WlcxaWJGOW5aVzVsWDJsa1hGd3BLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pteGhaeUE5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1Wkc5M2JpNVNUa0V1Ym05R1EyTjFkRzltWml3Z1hGd3lSRTlYVGx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JqS0Nrc0lGeGNNVlZRWEZ3c0lGeGNNRTVQWEZ3cEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRZWGhHYkdGbklEMGdLR0ZpY3loemFISnBibXRsWkY5c2IyY3lSa01wSUQ0Z2JXRjRURzluTWtaREtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphSEpzYjJjeVptTk5ZWGdnUFNCd2JXRjRLSEJ0YVc0b2MyaHlhVzVyWldSZmJHOW5Na1pETENCdFlYaE1iMmN5UmtNcExDQXRiV0Y0VEc5bk1rWkRLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZZWEp5WVc1blpTaG1iR0ZuS1Z4dVhHNWNibkFnUEMwZ1oyZHdiRzkwS0hSbGJYQXNJR0ZsY3loNElEMGdjMmh5YVc1clpXUmZiRzluTWtaRExDQjVJRDBnYldWaGJsOWthV1ptWDNOamIzSmxMQ0JqYjJ4dmNpQTlJR1pzWVdjc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4aFltVnNJRDBnYVdabGJITmxLR1pzWVdjZ0lUMGdYRnd3VGs5Y1hDd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxMQ0JPUVNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJoaGNHVWdQU0JoY3k1bVlXTjBiM0lvYldGNFJteGhaeWtwS1NBclhHNGdJR2RsYjIxZmNHOXBiblFvS1NBcklHZGxiMjFmZEdWNGRGOXlaWEJsYkNncElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDc2dYRzRnSUdkbmRHbDBiR1VvWEZ4a1ZFRkhYRndwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Da2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0JrYVdabVEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTFNCa2FXWm1RM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUNzZ1hHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnWm1ORGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F0Wm1ORGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCelkyRnNaVjlqYjJ4dmNsOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYREJPVDF4Y0lEMGdYRnhuY21WNVhGd3NJRnhjTVZWUVhGd2dQU0JjWEhKbFpGeGNMQ0JjWERKRVQxZE9YRndnUFNCY1hHSnNkV1ZjWENrcElDc2dJQ01nUTI5eWNtVmpkR1ZrSUdOdmJHOXlJRzFoY0hCcGJtZGNiaUFnYzJOaGJHVmZjMmhoY0dWZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hGeFVVbFZGWEZ3Z1BTQXlMQ0JjWEVaQlRGTkZYRndnUFNBeE9Ta3BYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hHeHZaekpHUTE5MmMxOWhkbWRUWTI5eVpWOWtWRUZIWDA5RlgzQXRibDl6ZFcxTWIyZFBSVjl1YjBaRFkzVjBiMlptWEZ3cFhHNW9aV2xuYUhRZ1BDMGdORnh1ZDJsa2RHZ2dQQzBnTjF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUFJPLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzEuZFRBR192c19HMS5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUFJPLkcyLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzIuZFRBR192c19HMi5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKVxuIyBJbXBvcnRpbmcgbG9vcCBnZW5lIGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKVxuXG5cbiMgTG9hZGluZyBPRSBsb29wIHNjb3JlXG5taW5WYWx1ZSA8LSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTyxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPKVxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoXFxpZFxcKSlcblxuIyBUZXN0aW5nIGRpZmZlcmVudCB3YXlzIHRvIGNhbGN1bGF0ZSByZXByZXNlbnRhdGl2ZSBmZWF0dXJlIG9mIGxvb3BzIGZvciBlYWNoIGdlbmVcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24gPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCkpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXBkb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYpJGVuc2VtYmxfZ2VuZV9pZFxuXG5nZW5lTGlzdC51cCA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQpKVxuXG5cbiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IHN1bShsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfcC1uX3N1bUxvZ09FXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4jIE5vIEZDIGN1dG9mZiBvcHRpb24gLSBkb3duIG9ubHlcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IHN1bShsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hyaW5rZWRfbG9nMkZDLCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxkVEFHXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxncmV5XFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19hdmdTY29yZV9kVEFHX09FX3Atbl9zdW1Mb2dPRV9ub0ZDY3V0b2ZmXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUFJPLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzEuZFRBR192c19HMS5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUFJPLkcyLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzIuZFRBR192c19HMi5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKVxuIyBJbXBvcnRpbmcgbG9vcCBnZW5lIGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKVxuXG5cbiMgTG9hZGluZyBPRSBsb29wIHNjb3JlXG5taW5WYWx1ZSA8LSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTyxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPKVxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoXFxpZFxcKSlcblxuIyBUZXN0aW5nIGRpZmZlcmVudCB3YXlzIHRvIGNhbGN1bGF0ZSByZXByZXNlbnRhdGl2ZSBmZWF0dXJlIG9mIGxvb3BzIGZvciBlYWNoIGdlbmVcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24gPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCkpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXBkb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYpJGVuc2VtYmxfZ2VuZV9pZFxuXG5nZW5lTGlzdC51cCA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQpKVxuXG5cbiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IHN1bShsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfcC1uX3N1bUxvZ09FXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4jIE5vIEZDIGN1dG9mZiBvcHRpb24gLSBkb3duIG9ubHlcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IHN1bShsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hyaW5rZWRfbG9nMkZDLCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxkVEFHXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxncmV5XFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19hdmdTY29yZV9kVEFHX09FX3Atbl9zdW1Mb2dPRV9ub0ZDY3V0b2ZmXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1)


# Loading OE loop score
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

geneAnnoData <- geneAnnoData %>% left_join(obsexp, by = c(\id\))

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id))
geneList.down.RNA <- (diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.down.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.updown.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff)$ensembl_gene_id

geneList.up <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id))


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = sum(log_obsexp_diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

#fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_sumLogOE\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# No FC cutoff option - down only
temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = sum(log_obsexp_diff_dTAG_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)


p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_sumLogOE_noFCcutoff\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



#### dTAG Scatterplot OE
##### Avg

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJuWlhSMGFXNW5JR3hwYzNRZ2IyWWdaMlZ1WlhNZ2IyWWdhVzUwWlhKbGMzUWdabkp2YlNCU1RrRXRjMlZ4SUdGdVpDQlFVazh0YzJWeFhHNWhiSEJvWVNBOExTQXdMakExWEc1bVkwTjFkRzltWmlBOExTQXdMalZjYm1ScFptWXVVRkpQTGtjeExtUlVRVWNnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laR2xtWmw5SE1VY3lMbVJVUVVkZlJ6RXVaRlJCUjE5MmMxOUhNUzVFVFZOUFgxQlNUM05sY1M1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIQmhaR29nUENCaGJIQm9ZU3dnWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQm1ZME4xZEc5bVppbGNibVJwWm1ZdVVGSlBMa2N5TG1SVVFVY2dQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVpHbG1abDlITVVjeUxtUlVRVWRmUnpJdVpGUkJSMTkyYzE5SE1pNUVUVk5QWDFCU1QzTmxjUzUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VWs1QkxrY3hMbVJVUVVjZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIQmhaR29nUENCaGJIQm9ZU3dnWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQm1ZME4xZEc5bVppbGNibVJwWm1ZdVVrNUJMa2N4TG1SVVFVY3VibTlHUTJOMWRHOW1aaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSmthV1ptWDBjeExtUlVRVWRmUnpFdU1ta3VaRlJCUjE5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY0dGa2FpQThJR0ZzY0doaEtWeHVJeUJKYlhCdmNuUnBibWNnYkc5dmNDQm5aVzVsSUdGdWJtOTBZWFJwYjI1Y2JtNWhiV1VnUEMwZ1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVhDSmNibHh1WkdsbVprTjFkRzltWmlBOExTQXdMakpjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZjQzF1WDJWdWMyVnRZbXhNYVhOMExuUnpkbHdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwWm1aRGRYUnZabVlnUFNCa2FXWm1RM1YwYjJabUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVmhjSWlrcEpUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhLVnh1WEc1Y2JpTWdURzloWkdsdVp5QlBSU0JzYjI5d0lITmpiM0psWEc1dGFXNVdZV3gxWlNBOExTQXRORnh1YjJKelpYaHdJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9YQ0pzYjI5d1UyTnZjbVZmWTI5dWMxOXZZbk5sZUhBdWRITjJYQ0lwS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9iRzluWDI5aWMyVjRjRjlFVFZOUElEMGdhV1pmWld4elpTaHZZbk5sZUhCZlJFMVRUeUE5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmUkUxVFR5a3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WjE5dlluTmxlSEJmWkZSQlJ5QTlJR2xtWDJWc2MyVW9iMkp6Wlhod1gyUlVRVWNnUFQwZ01Dd2diV2x1Vm1Gc2RXVXNJR3h2WnpJb2IySnpaWGh3WDJSVVFVY3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDBFME9EVWdQU0JwWmw5bGJITmxLRzlpYzJWNGNGOUJORGcxSUQwOUlEQXNJRzFwYmxaaGJIVmxMQ0JzYjJjeUtHOWljMlY0Y0Y5Qk5EZzFLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5a2FXWm1YMlJVUVVkZlJFMVRUeUE5SUd4dloxOXZZbk5sZUhCZlpGUkJSeUF0SUd4dloxOXZZbk5sZUhCZlJFMVRUeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDJScFptWmZRVFE0TlY5RVRWTlBJRDBnYkc5blgyOWljMlY0Y0Y5Qk5EZzFJQzBnYkc5blgyOWljMlY0Y0Y5RVRWTlBLVnh1WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JzWldaMFgycHZhVzRvYjJKelpYaHdMQ0JpZVNBOUlHTW9YQ0pwWkZ3aUtTbGNibHh1SXlCVVpYTjBhVzVuSUdScFptWmxjbVZ1ZENCM1lYbHpJSFJ2SUdOaGJHTjFiR0YwWlNCeVpYQnlaWE5sYm5SaGRHbDJaU0JtWldGMGRYSmxJRzltSUd4dmIzQnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JtUnBabVl1VWs1QklEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1ScFptWmZSekV1WkZSQlIxOUhNUzR5YVM1a1ZFRkhYM1p6WDBjeExqSnBMa1JOVTA4dWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGxibk5sYldKc1gyZGxibVZmYVdRc0lHeHZaekpHYjJ4a1EyaGhibWRsTENCemFISnBibXRsWkY5c2IyY3lSa01zSUhCaFpHb3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU2xjYm1kbGJtVk1hWE4wTG1SdmQyNGdQQzBnZFc1cGNYVmxLR01vS0dScFptWXVVazVCTGtjeExtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHdnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tHUnBabVl1VUZKUExrY3hMbVJVUVVjZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLR1JwWm1ZdVVGSlBMa2N5TG1SVVFVY2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElEd2dNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaQ2twWEc1blpXNWxUR2x6ZEM1a2IzZHVMbEpPUVNBOExTQW9aR2xtWmk1U1RrRXVSekV1WkZSQlJ5QWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtYRzVuWlc1bFRHbHpkQzVrYjNkdUxsSk9RUzV1YjBaRFkzVjBiMlptSUR3dElDaGthV1ptTGxKT1FTNUhNUzVrVkVGSExtNXZSa05qZFhSdlptWWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElEd2dNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WjJWdVpVeHBjM1F1ZFhCa2IzZHVMbEpPUVM1dWIwWkRZM1YwYjJabUlEd3RJQ2hrYVdabUxsSk9RUzVITVM1a1ZFRkhMbTV2UmtOamRYUnZabVlwSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WEc1blpXNWxUR2x6ZEM1MWNDQThMU0IxYm1seGRXVW9ZeWdvWkdsbVppNVNUa0V1UnpFdVpGUkJSeUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQaUF3S1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS0dScFptWXVVRkpQTGtjeExtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRDRnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNoa2FXWm1MbEJTVHk1SE1pNWtWRUZISUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hOb2NtbHVhMlZrWDJ4dlp6SkdReUErSURBcEtTUmxibk5sYldKc1gyZGxibVZmYVdRcEtWeHVYRzVjYmlNZ1d6RmRJRUYyWlhKaFoyVWdiMllnWkdsbVptVnlaVzUwYVdGc0lHeHZiM0FnYzJOdmNtVnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JpTWpJRkpPUVNCdmJteDVYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibUZzY0doaElEd3RJREF1TURWY2JtMWhlRXh2WnpKR1F5QThMU0F5WEc1Y2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOHNJR2RsYm1VcElDVStKU0JjYmlBZ2RXNXVaWE4wS0dkbGJtVXBJQ1UrSlNCbmNtOTFjRjlpZVNoblpXNWxLU0FsUGlWY2JpQWdjM1Z0YldGeWFYcGxLRzFsWVc1ZlpHbG1abDl6WTI5eVpTQTlJR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOWJkMmhwWTJndWJXRjRLR0ZpY3loc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QS1NsZExDQXVaM0p2ZFhCeklEMGdKMlJ5YjNBbktWeHVYRzVjYm5SbGJYQWdQQzBnYkdWbWRGOXFiMmx1S0hSbGJYQXNJR1JwWm1ZdVVrNUJMQ0JpZVNBOUlHTW9YQ0puWlc1bFhDSWdQU0JjSW1WdWMyVnRZbXhmWjJWdVpWOXBaRndpS1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1pzWVdjZ1BTQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExtUnZkMjR1VWs1QkxDQmNJakpFVDFkT1hDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdNb0tTd2dYQ0l4VlZCY0lpd2dYQ0l3VGs5Y0lpa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzFoZUVac1lXY2dQU0FvWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQnRZWGhNYjJjeVJrTXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vY214dlp6Sm1ZMDFoZUNBOUlIQnRZWGdvY0cxcGJpaHphSEpwYm10bFpGOXNiMmN5UmtNc0lHMWhlRXh2WnpKR1F5a3NJQzF0WVhoTWIyY3lSa01wS1NBbFBpVWdYRzRnSUdSd2JIbHlPanBoY25KaGJtZGxLR1pzWVdjcFhHNWNiaU5tZDNKcGRHVW9kR1Z0Y0N3Z2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2laMlZ1WlY5aGRtZFRZMjl5WlY5bVkxOWtWRUZIWDNBdGJpNTBjM1pjSWlrc0lITmxjQ0E5SUZ3aVhGeDBYQ0lwWEc1Y2JuQWdQQzBnWjJkd2JHOTBLSFJsYlhBc0lHRmxjeWg0SUQwZ2MyaHliRzluTW1aalRXRjRMQ0I1SUQwZ2JXVmhibDlrYVdabVgzTmpiM0psTENCamIyeHZjaUE5SUdac1lXY3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeGhZbVZzSUQwZ2FXWmxiSE5sS0dac1lXY2dJVDBnWENJd1RrOWNJaXdnWlhoMFpYSnVZV3hmWjJWdVpWOXVZVzFsTENCT1FTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyaGhjR1VnUFNCaGN5NW1ZV04wYjNJb2JXRjRSbXhoWnlrcEtTQXJYRzRnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJR2RsYjIxZmRHVjRkRjl5WlhCbGJDZ3BJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWEc0Z0lHZG5kR2wwYkdVb1hDSmtWRUZIWENJcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ0xTQmthV1ptUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDc2dYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ1ptTkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBdFptTkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQnpZMkZzWlY5amIyeHZjbDl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWpCT1Qxd2lJRDBnWENKbmNtVjVYQ0lzSUZ3aU1WVlFYQ0lnUFNCY0luSmxaRndpTENCY0lqSkVUMWRPWENJZ1BTQmNJbUpzZFdWY0lpa3BJQ3NnSUNNZ1EyOXljbVZqZEdWa0lHTnZiRzl5SUcxaGNIQnBibWRjYmlBZ2MyTmhiR1ZmYzJoaGNHVmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YQ0pVVWxWRlhDSWdQU0F5TENCY0lrWkJURk5GWENJZ1BTQXhPU2twWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbXh2WnpKR1ExOTJjMTloZG1kVFkyOXlaVjlrVkVGSFgwOUZYM0F0Ymw5aFluTk1iMmRQUlZ3aUtWeHVhR1ZwWjJoMElEd3RJRFJjYm5kcFpIUm9JRHd0SURkY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dUl5Qk9ieUJHUXlCamRYUnZabVlnYjNCMGFXOXVJQzBnWkc5M2JpQnZibXg1WEc1MFpXMXdJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaHNiMmRmYjJKelpYaHdYMlJwWm1aZlpGUkJSMTlFVFZOUExDQm5aVzVsS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaHRaV0Z1WDJScFptWmZjMk52Y21VZ1BTQnNiMmRmYjJKelpYaHdYMlJwWm1aZlpGUkJSMTlFVFZOUFczZG9hV05vTG0xaGVDaGhZbk1vYkc5blgyOWljMlY0Y0Y5a2FXWm1YMlJVUVVkZlJFMVRUeWtwWFN3Z0xtZHliM1Z3Y3lBOUlDZGtjbTl3SnlsY2JseHVkR1Z0Y0NBOExTQnNaV1owWDJwdmFXNG9kR1Z0Y0N3Z1pHbG1aaTVTVGtFc0lHSjVJRDBnWXloY0ltZGxibVZjSWlBOUlGd2laVzV6WlcxaWJGOW5aVzVsWDJsa1hDSXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pteGhaeUE5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1Wkc5M2JpNVNUa0V1Ym05R1EyTjFkRzltWml3Z1hDSXlSRTlYVGx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JqS0Nrc0lGd2lNVlZRWENJc0lGd2lNRTVQWENJcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRZWGhHYkdGbklEMGdLR0ZpY3loemFISnBibXRsWkY5c2IyY3lSa01wSUQ0Z2JXRjRURzluTWtaREtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphSEpzYjJjeVptTk5ZWGdnUFNCd2JXRjRLSEJ0YVc0b2MyaHlhVzVyWldSZmJHOW5Na1pETENCdFlYaE1iMmN5UmtNcExDQXRiV0Y0VEc5bk1rWkRLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZZWEp5WVc1blpTaG1iR0ZuS1Z4dVhHNWNibkFnUEMwZ1oyZHdiRzkwS0hSbGJYQXNJR0ZsY3loNElEMGdjMmh5YVc1clpXUmZiRzluTWtaRExDQjVJRDBnYldWaGJsOWthV1ptWDNOamIzSmxMQ0JqYjJ4dmNpQTlJR1pzWVdjc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4aFltVnNJRDBnYVdabGJITmxLR1pzWVdjZ0lUMGdYQ0l3VGs5Y0lpd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxMQ0JPUVNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJoaGNHVWdQU0JoY3k1bVlXTjBiM0lvYldGNFJteGhaeWtwS1NBclhHNGdJR2RsYjIxZmNHOXBiblFvS1NBcklHZGxiMjFmZEdWNGRGOXlaWEJsYkNncElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDc2dYRzRnSUdkbmRHbDBiR1VvWENKa1ZFRkhYQ0lwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Da2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0JrYVdabVEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTFNCa2FXWm1RM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUNzZ1hHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnWm1ORGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F0Wm1ORGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SUNCelkyRnNaVjlqYjJ4dmNsOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNJakJPVDF3aUlEMGdYQ0puY21WNVhDSXNJRndpTVZWUVhDSWdQU0JjSW5KbFpGd2lMQ0JjSWpKRVQxZE9YQ0lnUFNCY0ltSnNkV1ZjSWlrcElDc2dJQ01nUTI5eWNtVmpkR1ZrSUdOdmJHOXlJRzFoY0hCcGJtZGNiaUFnYzJOaGJHVmZjMmhoY0dWZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSlVVbFZGWENJZ1BTQXlMQ0JjSWtaQlRGTkZYQ0lnUFNBeE9Ta3BYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0lteHZaekpHUTE5MmMxOWhkbWRUWTI5eVpWOWtWRUZIWDA5RlgzQXRibDloWW5OTWIyZFBSVjl1YjBaRFkzVjBiMlptWENJcFhHNW9aV2xuYUhRZ1BDMGdORnh1ZDJsa2RHZ2dQQzBnTjF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbiMgZ2V0dGluZyBsaXN0IG9mIGdlbmVzIG9mIGludGVyZXN0IGZyb20gUk5BLXNlcSBhbmQgUFJPLXNlcVxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmLlBSTy5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzFHMi5kVEFHX0cxLmRUQUdfdnNfRzEuRE1TT19QUk9zZXEudHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlBSTy5HMi5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzFHMi5kVEFHX0cyLmRUQUdfdnNfRzIuRE1TT19QUk9zZXEudHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSlcbiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuXG4jIExvYWRpbmcgT0UgbG9vcCBzY29yZVxubWluVmFsdWUgPC0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTylcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgbGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpXG5cbiMgVGVzdGluZyBkaWZmZXJlbnQgd2F5cyB0byBjYWxjdWxhdGUgcmVwcmVzZW50YXRpdmUgZmVhdHVyZSBvZiBsb29wcyBmb3IgZWFjaCBnZW5lXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQpKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmKSRlbnNlbWJsX2dlbmVfaWRcblxuZ2VuZUxpc3QudXAgPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzIuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkKSlcblxuXG4jIFsxXSBBdmVyYWdlIG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lXG4jIyBSTkEgb25seVxuZmNDdXRvZmYgPC0gMC41XG5hbHBoYSA8LSAwLjA1XG5tYXhMb2cyRkMgPC0gMlxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPW3doaWNoLm1heChhYnMobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTykpXSwgLmdyb3VwcyA9ICdkcm9wJylcblxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG4jZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLW4udHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcZFRBR1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19PRV9wLW5fYWJzTG9nT0VcXClcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbiMgTm8gRkMgY3V0b2ZmIG9wdGlvbiAtIGRvd24gb25seVxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TT1t3aGljaC5tYXgoYWJzKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08pKV0sIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmlua2VkX2xvZzJGQywgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcZFRBR1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19PRV9wLW5fYWJzTG9nT0Vfbm9GQ2N1dG9mZlxcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1)


# Loading OE loop score
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

geneAnnoData <- geneAnnoData %>% left_join(obsexp, by = c(\id\))

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id))
geneList.down.RNA <- (diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.down.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.updown.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff)$ensembl_gene_id

geneList.up <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id))


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = log_obsexp_diff_dTAG_DMSO[which.max(abs(log_obsexp_diff_dTAG_DMSO))], .groups = 'drop')


temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

#fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_absLogOE\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# No FC cutoff option - down only
temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = log_obsexp_diff_dTAG_DMSO[which.max(abs(log_obsexp_diff_dTAG_DMSO))], .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)


p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_absLogOE_noFCcutoff\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5Qm5aWFIwYVc1bklHeHBjM1FnYjJZZ1oyVnVaWE1nYjJZZ2FXNTBaWEpsYzNRZ1puSnZiU0JTVGtFdGMyVnhJR0Z1WkNCUVVrOHRjMlZ4WEc1aGJIQm9ZU0E4TFNBd0xqQTFYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibVJwWm1ZdVVGSlBMa2N4TG1SVVFVY2dQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1pHbG1abDlITVVjeUxtUlVRVWRmUnpFdVpGUkJSMTkyYzE5SE1TNUVUVk5QWDFCU1QzTmxjUzUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VUZKUExrY3lMbVJVUVVjZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWkdsbVpsOUhNVWN5TG1SVVFVZGZSekl1WkZSQlIxOTJjMTlITWk1RVRWTlBYMUJTVDNObGNTNTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEJoWkdvZ1BDQmhiSEJvWVN3Z1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJtWTBOMWRHOW1aaWxjYm1ScFptWXVVazVCTGtjeExtUlVRVWNnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaR2xtWmw5SE1TNWtWRUZIWDBjeExqSnBMbVJVUVVkZmRuTmZSekV1TW1rdVJFMVRUeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VWs1QkxrY3hMbVJVUVVjdWJtOUdRMk4xZEc5bVppQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4a2FXWm1YMGN4TG1SVVFVZGZSekV1TW1rdVpGUkJSMTkyYzE5SE1TNHlhUzVFVFZOUExuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jR0ZrYWlBOElHRnNjR2hoS1Z4dUl5QkpiWEJ2Y25ScGJtY2diRzl2Y0NCblpXNWxJR0Z1Ym05MFlYUnBiMjVjYm01aGJXVWdQQzBnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WEZ4Y2JseHVaR2xtWmtOMWRHOW1aaUE4TFNBd0xqSmNibWRsYm1WQmJtNXZSR0YwWVNBOExTQnNiMkZrVEc5dmNFRnVibTlFWVhSaEtHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZmNDMXVYMlZ1YzJWdFlteE1hWE4wTG5SemRseGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnBabVpEZFhSdlptWWdQU0JrYVdabVEzVjBiMlptTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhibTV2VEdsemRDQTlJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWaGNYQ2twSlQ0bElGeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBjM1JoYm1ObElEMGdjM1JoY25ReUlDMGdjM1JoY25ReEtWeHVYRzVjYmlNZ1RHOWhaR2x1WnlCUFJTQnNiMjl3SUhOamIzSmxYRzV0YVc1V1lXeDFaU0E4TFNBdE5GeHViMkp6Wlhod0lEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb1hGeHNiMjl3VTJOdmNtVmZZMjl1YzE5dlluTmxlSEF1ZEhOMlhGd3BLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2JHOW5YMjlpYzJWNGNGOUVUVk5QSUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmUkUxVFR5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZSRTFUVHlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5ObGVIQmZaRlJCUnlBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDJSVVFVY2dQVDBnTUN3Z2JXbHVWbUZzZFdVc0lHeHZaeklvYjJKelpYaHdYMlJVUVVjcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMEUwT0RVZ1BTQnBabDlsYkhObEtHOWljMlY0Y0Y5Qk5EZzFJRDA5SURBc0lHMXBibFpoYkhWbExDQnNiMmN5S0c5aWMyVjRjRjlCTkRnMUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrYVdabVgyUlVRVWRmUkUxVFR5QTlJR3h2WjE5dlluTmxlSEJmWkZSQlJ5QXRJR3h2WjE5dlluTmxlSEJmUkUxVFR5eGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMlJwWm1aZlFUUTROVjlFVFZOUElEMGdiRzluWDI5aWMyVjRjRjlCTkRnMUlDMGdiRzluWDI5aWMyVjRjRjlFVFZOUEtWeHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQnNaV1owWDJwdmFXNG9iMkp6Wlhod0xDQmllU0E5SUdNb1hGeHBaRnhjS1NsY2JseHVJeUJVWlhOMGFXNW5JR1JwWm1abGNtVnVkQ0IzWVhseklIUnZJR05oYkdOMWJHRjBaU0J5WlhCeVpYTmxiblJoZEdsMlpTQm1aV0YwZFhKbElHOW1JR3h2YjNCeklHWnZjaUJsWVdOb0lHZGxibVZjYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR1JwWm1aZlJ6RXVaRlJCUjE5SE1TNHlhUzVrVkVGSFgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibWRsYm1WTWFYTjBMbVJ2ZDI0Z1BDMGdkVzVwY1hWbEtHTW9LR1JwWm1ZdVVrNUJMa2N4TG1SVVFVY2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElEd2dNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS0dScFptWXVVRkpQTGtjeExtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHdnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tHUnBabVl1VUZKUExrY3lMbVJVUVVjZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpDa3BYRzVuWlc1bFRHbHpkQzVrYjNkdUxsSk9RU0E4TFNBb1pHbG1aaTVTVGtFdVJ6RXVaRlJCUnlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUENBd0tTa2taVzV6WlcxaWJGOW5aVzVsWDJsa1hHNW5aVzVsVEdsemRDNWtiM2R1TGxKT1FTNXViMFpEWTNWMGIyWm1JRHd0SUNoa2FXWm1MbEpPUVM1SE1TNWtWRUZITG01dlJrTmpkWFJ2Wm1ZZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVaMlZ1WlV4cGMzUXVkWEJrYjNkdUxsSk9RUzV1YjBaRFkzVjBiMlptSUR3dElDaGthV1ptTGxKT1FTNUhNUzVrVkVGSExtNXZSa05qZFhSdlptWXBKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVYRzVuWlc1bFRHbHpkQzUxY0NBOExTQjFibWx4ZFdVb1l5Z29aR2xtWmk1U1RrRXVSekV1WkZSQlJ5QWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BpQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLR1JwWm1ZdVVGSlBMa2N4TG1SVVFVY2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElENGdNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2hrYVdabUxsQlNUeTVITWk1a1ZFRkhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSE5vY21sdWEyVmtYMnh2WnpKR1F5QStJREFwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1FwS1Z4dVhHNWNiaU1nV3pGZElFRjJaWEpoWjJVZ2IyWWdaR2xtWm1WeVpXNTBhV0ZzSUd4dmIzQWdjMk52Y21WeklHWnZjaUJsWVdOb0lHZGxibVZjYmlNaklGSk9RU0J2Ym14NVhHNW1ZME4xZEc5bVppQThMU0F3TGpWY2JtRnNjR2hoSUR3dElEQXVNRFZjYm0xaGVFeHZaekpHUXlBOExTQXlYRzVjYm5SbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHeHZaMTl2WW5ObGVIQmZaR2xtWmw5a1ZFRkhYMFJOVTA4c0lHZGxibVVwSUNVK0pTQmNiaUFnZFc1dVpYTjBLR2RsYm1VcElDVStKU0JuY205MWNGOWllU2huWlc1bEtTQWxQaVZjYmlBZ2MzVnRiV0Z5YVhwbEtHMWxZVzVmWkdsbVpsOXpZMjl5WlNBOUlHeHZaMTl2WW5ObGVIQmZaR2xtWmw5a1ZFRkhYMFJOVTA5YmQyaHBZMmd1YldGNEtHRmljeWhzYjJkZmIySnpaWGh3WDJScFptWmZaRlJCUjE5RVRWTlBLU2xkTENBdVozSnZkWEJ6SUQwZ0oyUnliM0FuS1Z4dVhHNWNiblJsYlhBZ1BDMGdiR1ZtZEY5cWIybHVLSFJsYlhBc0lHUnBabVl1VWs1QkxDQmllU0E5SUdNb1hGeG5aVzVsWEZ3Z1BTQmNYR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeGNLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHWnNZV2NnUFNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVk1hWE4wTG1SdmQyNHVVazVCTENCY1hESkVUMWRPWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR01vS1N3Z1hGd3hWVkJjWEN3Z1hGd3dUazljWENrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhlRVpzWVdjZ1BTQW9ZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCdFlYaE1iMmN5UmtNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9jbXh2WnpKbVkwMWhlQ0E5SUhCdFlYZ29jRzFwYmloemFISnBibXRsWkY5c2IyY3lSa01zSUcxaGVFeHZaekpHUXlrc0lDMXRZWGhNYjJjeVJrTXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtHWnNZV2NwWEc1Y2JpTm1kM0pwZEdVb2RHVnRjQ3dnYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1oyVnVaVjloZG1kVFkyOXlaVjltWTE5a1ZFRkhYM0F0Ymk1MGMzWmNYQ2tzSUhObGNDQTlJRnhjWEZ4MFhGd3BYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnYzJoeWJHOW5NbVpqVFdGNExDQjVJRDBnYldWaGJsOWthV1ptWDNOamIzSmxMQ0JqYjJ4dmNpQTlJR1pzWVdjc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4aFltVnNJRDBnYVdabGJITmxLR1pzWVdjZ0lUMGdYRnd3VGs5Y1hDd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxMQ0JPUVNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJoaGNHVWdQU0JoY3k1bVlXTjBiM0lvYldGNFJteGhaeWtwS1NBclhHNGdJR2RsYjIxZmNHOXBiblFvS1NBcklHZGxiMjFmZEdWNGRGOXlaWEJsYkNncElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDc2dYRzRnSUdkbmRHbDBiR1VvWEZ4a1ZFRkhYRndwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Da2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0JrYVdabVEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTFNCa2FXWm1RM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUNzZ1hHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnWm1ORGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F0Wm1ORGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCelkyRnNaVjlqYjJ4dmNsOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYREJPVDF4Y0lEMGdYRnhuY21WNVhGd3NJRnhjTVZWUVhGd2dQU0JjWEhKbFpGeGNMQ0JjWERKRVQxZE9YRndnUFNCY1hHSnNkV1ZjWENrcElDc2dJQ01nUTI5eWNtVmpkR1ZrSUdOdmJHOXlJRzFoY0hCcGJtZGNiaUFnYzJOaGJHVmZjMmhoY0dWZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hGeFVVbFZGWEZ3Z1BTQXlMQ0JjWEVaQlRGTkZYRndnUFNBeE9Ta3BYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hHeHZaekpHUTE5MmMxOWhkbWRUWTI5eVpWOWtWRUZIWDA5RlgzQXRibDloWW5OTWIyZFBSVnhjS1Z4dWFHVnBaMmgwSUR3dElEUmNibmRwWkhSb0lEd3RJRGRjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibHh1SXlCT2J5QkdReUJqZFhSdlptWWdiM0IwYVc5dUlDMGdaRzkzYmlCdmJteDVYRzUwWlcxd0lEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QTENCblpXNWxLU0FsUGlVZ1hHNGdJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVWdaM0p2ZFhCZllua29aMlZ1WlNrZ0pUNGxYRzRnSUhOMWJXMWhjbWw2WlNodFpXRnVYMlJwWm1aZmMyTnZjbVVnUFNCc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QVzNkb2FXTm9MbTFoZUNoaFluTW9iRzluWDI5aWMyVjRjRjlrYVdabVgyUlVRVWRmUkUxVFR5a3BYU3dnTG1keWIzVndjeUE5SUNka2NtOXdKeWxjYmx4dWRHVnRjQ0E4TFNCc1pXWjBYMnB2YVc0b2RHVnRjQ3dnWkdsbVppNVNUa0VzSUdKNUlEMGdZeWhjWEdkbGJtVmNYQ0E5SUZ4Y1pXNXpaVzFpYkY5blpXNWxYMmxrWEZ3cEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWm14aFp5QTlJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVaRzkzYmk1U1RrRXVibTlHUTJOMWRHOW1aaXdnWEZ3eVJFOVhUbHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQmpLQ2tzSUZ4Y01WVlFYRndzSUZ4Y01FNVBYRndwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYaEdiR0ZuSUQwZ0tHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnYldGNFRHOW5Na1pES1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFISnNiMmN5Wm1OTllYZ2dQU0J3YldGNEtIQnRhVzRvYzJoeWFXNXJaV1JmYkc5bk1rWkRMQ0J0WVhoTWIyY3lSa01wTENBdGJXRjRURzluTWtaREtTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNllYSnlZVzVuWlNobWJHRm5LVnh1WEc1Y2JuQWdQQzBnWjJkd2JHOTBLSFJsYlhBc0lHRmxjeWg0SUQwZ2MyaHlhVzVyWldSZmJHOW5Na1pETENCNUlEMGdiV1ZoYmw5a2FXWm1YM05qYjNKbExDQmpiMnh2Y2lBOUlHWnNZV2NzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hoWW1Wc0lEMGdhV1psYkhObEtHWnNZV2NnSVQwZ1hGd3dUazljWEN3Z1pYaDBaWEp1WVd4ZloyVnVaVjl1WVcxbExDQk9RU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmhoY0dVZ1BTQmhjeTVtWVdOMGIzSW9iV0Y0Um14aFp5a3BLU0FyWEc0Z0lHZGxiMjFmY0c5cGJuUW9LU0FySUdkbGIyMWZkR1Y0ZEY5eVpYQmxiQ2dwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1hHNGdJR2RuZEdsMGJHVW9YRnhrVkVGSFhGd3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQmthV1ptUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdMU0JrYVdabVEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3NnWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SURBcElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdabU5EZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXRabU5EZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJQ0J6WTJGc1pWOWpiMnh2Y2w5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY1hEQk9UMXhjSUQwZ1hGeG5jbVY1WEZ3c0lGeGNNVlZRWEZ3Z1BTQmNYSEpsWkZ4Y0xDQmNYREpFVDFkT1hGd2dQU0JjWEdKc2RXVmNYQ2twSUNzZ0lDTWdRMjl5Y21WamRHVmtJR052Ykc5eUlHMWhjSEJwYm1kY2JpQWdjMk5oYkdWZmMyaGhjR1ZmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWEZ4VVVsVkZYRndnUFNBeUxDQmNYRVpCVEZORlhGd2dQU0F4T1NrcFhHNWNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEd4dlp6SkdRMTkyYzE5aGRtZFRZMjl5WlY5a1ZFRkhYMDlGWDNBdGJsOWhZbk5NYjJkUFJWOXViMFpEWTNWMGIyWm1YRndwWEc1b1pXbG5hSFFnUEMwZ05GeHVkMmxrZEdnZ1BDMGdOMXh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG4jIGdldHRpbmcgbGlzdCBvZiBnZW5lcyBvZiBpbnRlcmVzdCBmcm9tIFJOQS1zZXEgYW5kIFBSTy1zZXFcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZi5QUk8uRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxRzIuZFRBR19HMS5kVEFHX3ZzX0cxLkRNU09fUFJPc2VxLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5QUk8uRzIuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxRzIuZFRBR19HMi5kVEFHX3ZzX0cyLkRNU09fUFJPc2VxLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5STkEuRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEpXG4jIEltcG9ydGluZyBsb29wIGdlbmUgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSklPiUgXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpXG5cblxuIyBMb2FkaW5nIE9FIGxvb3Agc2NvcmVcbm1pblZhbHVlIDwtIC00XG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pXG5cbmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuXG4jIFRlc3RpbmcgZGlmZmVyZW50IHdheXMgdG8gY2FsY3VsYXRlIHJlcHJlc2VudGF0aXZlIGZlYXR1cmUgb2YgbG9vcHMgZm9yIGVhY2ggZ2VuZVxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93biA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzIuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkKSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cGRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZikkZW5zZW1ibF9nZW5lX2lkXG5cbmdlbmVMaXN0LnVwIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCkpXG5cblxuIyBbMV0gQXZlcmFnZSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TT1t3aGljaC5tYXgoYWJzKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08pKV0sIC5ncm91cHMgPSAnZHJvcCcpXG5cblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfcC1uX2Fic0xvZ09FXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4jIE5vIEZDIGN1dG9mZiBvcHRpb24gLSBkb3duIG9ubHlcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU09bd2hpY2gubWF4KGFicyhsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSldLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJpbmtlZF9sb2cyRkMsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfcC1uX2Fic0xvZ09FX25vRkNjdXRvZmZcXClcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUFJPLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzEuZFRBR192c19HMS5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUFJPLkcyLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzIuZFRBR192c19HMi5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKVxuIyBJbXBvcnRpbmcgbG9vcCBnZW5lIGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKVxuXG5cbiMgTG9hZGluZyBPRSBsb29wIHNjb3JlXG5taW5WYWx1ZSA8LSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTyxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPKVxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoXFxpZFxcKSlcblxuIyBUZXN0aW5nIGRpZmZlcmVudCB3YXlzIHRvIGNhbGN1bGF0ZSByZXByZXNlbnRhdGl2ZSBmZWF0dXJlIG9mIGxvb3BzIGZvciBlYWNoIGdlbmVcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24gPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCkpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXBkb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYpJGVuc2VtYmxfZ2VuZV9pZFxuXG5nZW5lTGlzdC51cCA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQpKVxuXG5cbiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU09bd2hpY2gubWF4KGFicyhsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSldLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbiNmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIFxcZ2VuZV9hdmdTY29yZV9mY19kVEFHX3Atbi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxkVEFHXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxncmV5XFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19hdmdTY29yZV9kVEFHX09FX3Atbl9hYnNMb2dPRVxcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuIyBObyBGQyBjdXRvZmYgb3B0aW9uIC0gZG93biBvbmx5XG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPW3doaWNoLm1heChhYnMobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTykpXSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hyaW5rZWRfbG9nMkZDLCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxkVEFHXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxncmV5XFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19hdmdTY29yZV9kVEFHX09FX3Atbl9hYnNMb2dPRV9ub0ZDY3V0b2ZmXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1)


# Loading OE loop score
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

geneAnnoData <- geneAnnoData %>% left_join(obsexp, by = c(\id\))

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id))
geneList.down.RNA <- (diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.down.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.updown.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff)$ensembl_gene_id

geneList.up <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id))


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = log_obsexp_diff_dTAG_DMSO[which.max(abs(log_obsexp_diff_dTAG_DMSO))], .groups = 'drop')


temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

#fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_absLogOE\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# No FC cutoff option - down only
temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = log_obsexp_diff_dTAG_DMSO[which.max(abs(log_obsexp_diff_dTAG_DMSO))], .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)


p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_absLogOE_noFCcutoff\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### Sum

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJuWlhSMGFXNW5JR3hwYzNRZ2IyWWdaMlZ1WlhNZ2IyWWdhVzUwWlhKbGMzUWdabkp2YlNCU1RrRXRjMlZ4SUdGdVpDQlFVazh0YzJWeFhHNWhiSEJvWVNBOExTQXdMakExWEc1bVkwTjFkRzltWmlBOExTQXdMalZjYm1ScFptWXVVRkpQTGtjeExtUlVRVWNnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laR2xtWmw5SE1VY3lMbVJVUVVkZlJ6RXVaRlJCUjE5MmMxOUhNUzVFVFZOUFgxQlNUM05sY1M1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIQmhaR29nUENCaGJIQm9ZU3dnWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQm1ZME4xZEc5bVppbGNibVJwWm1ZdVVGSlBMa2N5TG1SVVFVY2dQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVpHbG1abDlITVVjeUxtUlVRVWRmUnpJdVpGUkJSMTkyYzE5SE1pNUVUVk5QWDFCU1QzTmxjUzUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VWs1QkxrY3hMbVJVUVVjZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIQmhaR29nUENCaGJIQm9ZU3dnWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQm1ZME4xZEc5bVppbGNibVJwWm1ZdVVrNUJMa2N4TG1SVVFVY3VibTlHUTJOMWRHOW1aaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSmthV1ptWDBjeExtUlVRVWRmUnpFdU1ta3VaRlJCUjE5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY0dGa2FpQThJR0ZzY0doaEtWeHVJeUJKYlhCdmNuUnBibWNnYkc5dmNDQm5aVzVsSUdGdWJtOTBZWFJwYjI1Y2JtNWhiV1VnUEMwZ1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVhDSmNibHh1WkdsbVprTjFkRzltWmlBOExTQXdMakpjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZjQzF1WDJWdWMyVnRZbXhNYVhOMExuUnpkbHdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwWm1aRGRYUnZabVlnUFNCa2FXWm1RM1YwYjJabUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVmhjSWlrcEpUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhLVnh1WEc1Y2JpTWdURzloWkdsdVp5QlBSU0JzYjI5d0lITmpiM0psWEc1dGFXNVdZV3gxWlNBOExTQXRORnh1YjJKelpYaHdJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9YQ0pzYjI5d1UyTnZjbVZmWTI5dWMxOXZZbk5sZUhBdWRITjJYQ0lwS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9iRzluWDI5aWMyVjRjRjlFVFZOUElEMGdhV1pmWld4elpTaHZZbk5sZUhCZlJFMVRUeUE5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmUkUxVFR5a3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WjE5dlluTmxlSEJmWkZSQlJ5QTlJR2xtWDJWc2MyVW9iMkp6Wlhod1gyUlVRVWNnUFQwZ01Dd2diV2x1Vm1Gc2RXVXNJR3h2WnpJb2IySnpaWGh3WDJSVVFVY3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDBFME9EVWdQU0JwWmw5bGJITmxLRzlpYzJWNGNGOUJORGcxSUQwOUlEQXNJRzFwYmxaaGJIVmxMQ0JzYjJjeUtHOWljMlY0Y0Y5Qk5EZzFLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5a2FXWm1YMlJVUVVkZlJFMVRUeUE5SUd4dloxOXZZbk5sZUhCZlpGUkJSeUF0SUd4dloxOXZZbk5sZUhCZlJFMVRUeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDJScFptWmZRVFE0TlY5RVRWTlBJRDBnYkc5blgyOWljMlY0Y0Y5Qk5EZzFJQzBnYkc5blgyOWljMlY0Y0Y5RVRWTlBLVnh1WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JzWldaMFgycHZhVzRvYjJKelpYaHdMQ0JpZVNBOUlHTW9YQ0pwWkZ3aUtTbGNibHh1SXlCVVpYTjBhVzVuSUdScFptWmxjbVZ1ZENCM1lYbHpJSFJ2SUdOaGJHTjFiR0YwWlNCeVpYQnlaWE5sYm5SaGRHbDJaU0JtWldGMGRYSmxJRzltSUd4dmIzQnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JtUnBabVl1VWs1QklEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1ScFptWmZSekV1WkZSQlIxOUhNUzR5YVM1a1ZFRkhYM1p6WDBjeExqSnBMa1JOVTA4dWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGxibk5sYldKc1gyZGxibVZmYVdRc0lHeHZaekpHYjJ4a1EyaGhibWRsTENCemFISnBibXRsWkY5c2IyY3lSa01zSUhCaFpHb3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU2xjYm1kbGJtVk1hWE4wTG1SdmQyNGdQQzBnZFc1cGNYVmxLR01vS0dScFptWXVVazVCTGtjeExtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHdnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tHUnBabVl1VUZKUExrY3hMbVJVUVVjZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLR1JwWm1ZdVVGSlBMa2N5TG1SVVFVY2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElEd2dNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaQ2twWEc1blpXNWxUR2x6ZEM1a2IzZHVMbEpPUVNBOExTQW9aR2xtWmk1U1RrRXVSekV1WkZSQlJ5QWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtYRzVuWlc1bFRHbHpkQzVrYjNkdUxsSk9RUzV1YjBaRFkzVjBiMlptSUR3dElDaGthV1ptTGxKT1FTNUhNUzVrVkVGSExtNXZSa05qZFhSdlptWWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElEd2dNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WjJWdVpVeHBjM1F1ZFhCa2IzZHVMbEpPUVM1dWIwWkRZM1YwYjJabUlEd3RJQ2hrYVdabUxsSk9RUzVITVM1a1ZFRkhMbTV2UmtOamRYUnZabVlwSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WEc1blpXNWxUR2x6ZEM1MWNDQThMU0IxYm1seGRXVW9ZeWdvWkdsbVppNVNUa0V1UnpFdVpGUkJSeUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQaUF3S1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS0dScFptWXVVRkpQTGtjeExtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRDRnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNoa2FXWm1MbEJTVHk1SE1pNWtWRUZISUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hOb2NtbHVhMlZrWDJ4dlp6SkdReUErSURBcEtTUmxibk5sYldKc1gyZGxibVZmYVdRcEtWeHVYRzVjYmlNZ1d6RmRJRUYyWlhKaFoyVWdiMllnWkdsbVptVnlaVzUwYVdGc0lHeHZiM0FnYzJOdmNtVnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JpTWpJRkpPUVNCdmJteDVYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibUZzY0doaElEd3RJREF1TURWY2JtMWhlRXh2WnpKR1F5QThMU0F5WEc1Y2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOHNJR2RsYm1Vc0lHUnBjM1JoYm1ObEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bElGeHVJQ0J6YkdsalpWOXRhVzRvWkdsemRHRnVZMlVzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1NBbFBpVWdYRzRnSUhOMWJXMWhjbWw2WlNodFpXRnVYMlJwWm1aZmMyTnZjbVVnUFNCc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QTENBdVozSnZkWEJ6SUQwZ0oyUnliM0FuS1Z4dVhHNTBaVzF3SUR3dElHeGxablJmYW05cGJpaDBaVzF3TENCa2FXWm1MbEpPUVN3Z1lua2dQU0JqS0Z3aVoyVnVaVndpSUQwZ1hDSmxibk5sYldKc1gyZGxibVZmYVdSY0lpa3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobWJHRm5JRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bFRHbHpkQzVrYjNkdUxsSk9RU3dnWENJeVJFOVhUbHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQmpLQ2tzSUZ3aU1WVlFYQ0lzSUZ3aU1FNVBYQ0lwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYaEdiR0ZuSUQwZ0tHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnYldGNFRHOW5Na1pES1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFISnNiMmN5Wm1OTllYZ2dQU0J3YldGNEtIQnRhVzRvYzJoeWFXNXJaV1JmYkc5bk1rWkRMQ0J0WVhoTWIyY3lSa01wTENBdGJXRjRURzluTWtaREtTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNllYSnlZVzVuWlNobWJHRm5LVnh1WEc0alpuZHlhWFJsS0hSbGJYQXNJR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1kbGJtVmZZWFpuVTJOdmNtVmZabU5mWkZSQlIxOXdMVzR1ZEhOMlhDSXBMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUtWeHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJSE5vY214dlp6Sm1ZMDFoZUN3Z2VTQTlJRzFsWVc1ZlpHbG1abDl6WTI5eVpTd2dZMjlzYjNJZ1BTQm1iR0ZuTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWVdKbGJDQTlJR2xtWld4elpTaG1iR0ZuSUNFOUlGd2lNRTVQWENJc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTd2dUa0VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vWVhCbElEMGdZWE11Wm1GamRHOXlLRzFoZUVac1lXY3BLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCblpXOXRYM1JsZUhSZmNtVndaV3dvS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0JuWjNScGRHeGxLRndpWkZSQlIxd2lLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJQzBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJoYzJobFpGd2lLU0FySUZ4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJR1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdMV1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnYzJOaGJHVmZZMjlzYjNKZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSXdUazljSWlBOUlGd2laM0psZVZ3aUxDQmNJakZWVUZ3aUlEMGdYQ0p5WldSY0lpd2dYQ0l5UkU5WFRsd2lJRDBnWENKaWJIVmxYQ0lwS1NBcklDQWpJRU52Y25KbFkzUmxaQ0JqYjJ4dmNpQnRZWEJ3YVc1blhHNGdJSE5qWVd4bFgzTm9ZWEJsWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aVZGSlZSVndpSUQwZ01pd2dYQ0pHUVV4VFJWd2lJRDBnTVRrcEtWeHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKc2IyY3lSa05mZG5OZllYWm5VMk52Y21WZlpGUkJSMTlQUlY5d0xXNWZZMnh2YzJWemRFeHZaMDlGWENJcFhHNW9aV2xuYUhRZ1BDMGdORnh1ZDJsa2RHZ2dQQzBnTjF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc0aklFNXZJRVpESUdOMWRHOW1aaUJ2Y0hScGIyNGdMU0JrYjNkdUlHOXViSGxjYm5SbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHeHZaMTl2WW5ObGVIQmZaR2xtWmw5a1ZFRkhYMFJOVTA4c0lHZGxibVVzSUdScGMzUmhibU5sS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaGthWE4wWVc1alpTd2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBJQ1UrSlNCY2JpQWdjM1Z0YldGeWFYcGxLRzFsWVc1ZlpHbG1abDl6WTI5eVpTQTlJR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOHNJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzVjYm5SbGJYQWdQQzBnYkdWbWRGOXFiMmx1S0hSbGJYQXNJR1JwWm1ZdVVrNUJMQ0JpZVNBOUlHTW9YQ0puWlc1bFhDSWdQU0JjSW1WdWMyVnRZbXhmWjJWdVpWOXBaRndpS1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1pzWVdjZ1BTQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExtUnZkMjR1VWs1QkxtNXZSa05qZFhSdlptWXNJRndpTWtSUFYwNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1l5Z3BMQ0JjSWpGVlVGd2lMQ0JjSWpCT1Qxd2lLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYldGNFJteGhaeUE5SUNoaFluTW9jMmh5YVc1clpXUmZiRzluTWtaREtTQStJRzFoZUV4dlp6SkdReWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJoeWJHOW5NbVpqVFdGNElEMGdjRzFoZUNod2JXbHVLSE5vY21sdWEyVmtYMnh2WnpKR1F5d2diV0Y0VEc5bk1rWkRLU3dnTFcxaGVFeHZaekpHUXlrcElDVStKU0JjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvWm14aFp5bGNibHh1WEc1d0lEd3RJR2RuY0d4dmRDaDBaVzF3TENCaFpYTW9lQ0E5SUhOb2NtbHVhMlZrWDJ4dlp6SkdReXdnZVNBOUlHMWxZVzVmWkdsbVpsOXpZMjl5WlN3Z1kyOXNiM0lnUFNCbWJHRm5MQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOUlHbG1aV3h6WlNobWJHRm5JQ0U5SUZ3aU1FNVBYQ0lzSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlN3Z1RrRXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9ZWEJsSUQwZ1lYTXVabUZqZEc5eUtHMWhlRVpzWVdjcEtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJuWlc5dFgzUmxlSFJmY21Wd1pXd29LU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQm5aM1JwZEd4bEtGd2laRlJCUjF3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJJRnh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlHWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ0xXWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUN0Y2JpQWdjMk5oYkdWZlkyOXNiM0pmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENJd1RrOWNJaUE5SUZ3aVozSmxlVndpTENCY0lqRlZVRndpSUQwZ1hDSnlaV1JjSWl3Z1hDSXlSRTlYVGx3aUlEMGdYQ0ppYkhWbFhDSXBLU0FySUNBaklFTnZjbkpsWTNSbFpDQmpiMnh2Y2lCdFlYQndhVzVuWEc0Z0lITmpZV3hsWDNOb1lYQmxYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRndpVkZKVlJWd2lJRDBnTWl3Z1hDSkdRVXhUUlZ3aUlEMGdNVGtwS1Z4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0pzYjJjeVJrTmZkbk5mWVhablUyTnZjbVZmWkZSQlIxOVBSVjl3TFc1ZlkyeHZjMlZ6ZEV4dlowOUZYMjV2UmtOamRYUnZabVpjSWlsY2JtaGxhV2RvZENBOExTQTBYRzUzYVdSMGFDQThMU0EzWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbiMgZ2V0dGluZyBsaXN0IG9mIGdlbmVzIG9mIGludGVyZXN0IGZyb20gUk5BLXNlcSBhbmQgUFJPLXNlcVxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmLlBSTy5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzFHMi5kVEFHX0cxLmRUQUdfdnNfRzEuRE1TT19QUk9zZXEudHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlBSTy5HMi5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzFHMi5kVEFHX0cyLmRUQUdfdnNfRzIuRE1TT19QUk9zZXEudHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSlcbiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuXG4jIExvYWRpbmcgT0UgbG9vcCBzY29yZVxubWluVmFsdWUgPC0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTylcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgbGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpXG5cbiMgVGVzdGluZyBkaWZmZXJlbnQgd2F5cyB0byBjYWxjdWxhdGUgcmVwcmVzZW50YXRpdmUgZmVhdHVyZSBvZiBsb29wcyBmb3IgZWFjaCBnZW5lXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQpKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmKSRlbnNlbWJsX2dlbmVfaWRcblxuZ2VuZUxpc3QudXAgPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzIuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkKSlcblxuXG4jIFsxXSBBdmVyYWdlIG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lXG4jIyBSTkEgb25seVxuZmNDdXRvZmYgPC0gMC41XG5hbHBoYSA8LSAwLjA1XG5tYXhMb2cyRkMgPC0gMlxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBnZW5lLCBkaXN0YW5jZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSBcbiAgc2xpY2VfbWluKGRpc3RhbmNlLCB3aXRoX3RpZXMgPSBGQUxTRSkgJT4lIFxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfcC1uX2Nsb3Nlc3RMb2dPRVxcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuIyBObyBGQyBjdXRvZmYgb3B0aW9uIC0gZG93biBvbmx5XG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBnZW5lLCBkaXN0YW5jZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzbGljZV9taW4oZGlzdGFuY2UsIHdpdGhfdGllcyA9IEZBTFNFKSAlPiUgXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJpbmtlZF9sb2cyRkMsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfcC1uX2Nsb3Nlc3RMb2dPRV9ub0ZDY3V0b2ZmXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1)


# Loading OE loop score
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

geneAnnoData <- geneAnnoData %>% left_join(obsexp, by = c(\id\))

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id))
geneList.down.RNA <- (diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.down.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.updown.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff)$ensembl_gene_id

geneList.up <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id))


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene, distance) %>% 
  unnest(gene) %>% group_by(gene) %>% 
  slice_min(distance, with_ties = FALSE) %>% 
  summarize(mean_diff_score = log_obsexp_diff_dTAG_DMSO, .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

#fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_closestLogOE\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# No FC cutoff option - down only
temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene, distance) %>% 
  unnest(gene) %>% group_by(gene) %>%
  slice_min(distance, with_ties = FALSE) %>% 
  summarize(mean_diff_score = log_obsexp_diff_dTAG_DMSO, .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)


p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_closestLogOE_noFCcutoff\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5Qm5aWFIwYVc1bklHeHBjM1FnYjJZZ1oyVnVaWE1nYjJZZ2FXNTBaWEpsYzNRZ1puSnZiU0JTVGtFdGMyVnhJR0Z1WkNCUVVrOHRjMlZ4WEc1aGJIQm9ZU0E4TFNBd0xqQTFYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibVJwWm1ZdVVGSlBMa2N4TG1SVVFVY2dQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1pHbG1abDlITVVjeUxtUlVRVWRmUnpFdVpGUkJSMTkyYzE5SE1TNUVUVk5QWDFCU1QzTmxjUzUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VUZKUExrY3lMbVJVUVVjZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWkdsbVpsOUhNVWN5TG1SVVFVZGZSekl1WkZSQlIxOTJjMTlITWk1RVRWTlBYMUJTVDNObGNTNTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEJoWkdvZ1BDQmhiSEJvWVN3Z1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJtWTBOMWRHOW1aaWxjYm1ScFptWXVVazVCTGtjeExtUlVRVWNnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaR2xtWmw5SE1TNWtWRUZIWDBjeExqSnBMbVJVUVVkZmRuTmZSekV1TW1rdVJFMVRUeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VWs1QkxrY3hMbVJVUVVjdWJtOUdRMk4xZEc5bVppQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4a2FXWm1YMGN4TG1SVVFVZGZSekV1TW1rdVpGUkJSMTkyYzE5SE1TNHlhUzVFVFZOUExuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jR0ZrYWlBOElHRnNjR2hoS1Z4dUl5QkpiWEJ2Y25ScGJtY2diRzl2Y0NCblpXNWxJR0Z1Ym05MFlYUnBiMjVjYm01aGJXVWdQQzBnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WEZ4Y2JseHVaR2xtWmtOMWRHOW1aaUE4TFNBd0xqSmNibWRsYm1WQmJtNXZSR0YwWVNBOExTQnNiMkZrVEc5dmNFRnVibTlFWVhSaEtHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZmNDMXVYMlZ1YzJWdFlteE1hWE4wTG5SemRseGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnBabVpEZFhSdlptWWdQU0JrYVdabVEzVjBiMlptTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhibTV2VEdsemRDQTlJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWaGNYQ2twSlQ0bElGeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBjM1JoYm1ObElEMGdjM1JoY25ReUlDMGdjM1JoY25ReEtWeHVYRzVjYmlNZ1RHOWhaR2x1WnlCUFJTQnNiMjl3SUhOamIzSmxYRzV0YVc1V1lXeDFaU0E4TFNBdE5GeHViMkp6Wlhod0lEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb1hGeHNiMjl3VTJOdmNtVmZZMjl1YzE5dlluTmxlSEF1ZEhOMlhGd3BLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2JHOW5YMjlpYzJWNGNGOUVUVk5QSUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmUkUxVFR5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZSRTFUVHlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5ObGVIQmZaRlJCUnlBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDJSVVFVY2dQVDBnTUN3Z2JXbHVWbUZzZFdVc0lHeHZaeklvYjJKelpYaHdYMlJVUVVjcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMEUwT0RVZ1BTQnBabDlsYkhObEtHOWljMlY0Y0Y5Qk5EZzFJRDA5SURBc0lHMXBibFpoYkhWbExDQnNiMmN5S0c5aWMyVjRjRjlCTkRnMUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrYVdabVgyUlVRVWRmUkUxVFR5QTlJR3h2WjE5dlluTmxlSEJmWkZSQlJ5QXRJR3h2WjE5dlluTmxlSEJmUkUxVFR5eGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMlJwWm1aZlFUUTROVjlFVFZOUElEMGdiRzluWDI5aWMyVjRjRjlCTkRnMUlDMGdiRzluWDI5aWMyVjRjRjlFVFZOUEtWeHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQnNaV1owWDJwdmFXNG9iMkp6Wlhod0xDQmllU0E5SUdNb1hGeHBaRnhjS1NsY2JseHVJeUJVWlhOMGFXNW5JR1JwWm1abGNtVnVkQ0IzWVhseklIUnZJR05oYkdOMWJHRjBaU0J5WlhCeVpYTmxiblJoZEdsMlpTQm1aV0YwZFhKbElHOW1JR3h2YjNCeklHWnZjaUJsWVdOb0lHZGxibVZjYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR1JwWm1aZlJ6RXVaRlJCUjE5SE1TNHlhUzVrVkVGSFgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibWRsYm1WTWFYTjBMbVJ2ZDI0Z1BDMGdkVzVwY1hWbEtHTW9LR1JwWm1ZdVVrNUJMa2N4TG1SVVFVY2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElEd2dNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS0dScFptWXVVRkpQTGtjeExtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHdnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tHUnBabVl1VUZKUExrY3lMbVJVUVVjZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpDa3BYRzVuWlc1bFRHbHpkQzVrYjNkdUxsSk9RU0E4TFNBb1pHbG1aaTVTVGtFdVJ6RXVaRlJCUnlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUENBd0tTa2taVzV6WlcxaWJGOW5aVzVsWDJsa1hHNW5aVzVsVEdsemRDNWtiM2R1TGxKT1FTNXViMFpEWTNWMGIyWm1JRHd0SUNoa2FXWm1MbEpPUVM1SE1TNWtWRUZITG01dlJrTmpkWFJ2Wm1ZZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVaMlZ1WlV4cGMzUXVkWEJrYjNkdUxsSk9RUzV1YjBaRFkzVjBiMlptSUR3dElDaGthV1ptTGxKT1FTNUhNUzVrVkVGSExtNXZSa05qZFhSdlptWXBKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVYRzVuWlc1bFRHbHpkQzUxY0NBOExTQjFibWx4ZFdVb1l5Z29aR2xtWmk1U1RrRXVSekV1WkZSQlJ5QWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BpQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLR1JwWm1ZdVVGSlBMa2N4TG1SVVFVY2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElENGdNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2hrYVdabUxsQlNUeTVITWk1a1ZFRkhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSE5vY21sdWEyVmtYMnh2WnpKR1F5QStJREFwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1FwS1Z4dVhHNWNiaU1nV3pGZElFRjJaWEpoWjJVZ2IyWWdaR2xtWm1WeVpXNTBhV0ZzSUd4dmIzQWdjMk52Y21WeklHWnZjaUJsWVdOb0lHZGxibVZjYmlNaklGSk9RU0J2Ym14NVhHNW1ZME4xZEc5bVppQThMU0F3TGpWY2JtRnNjR2hoSUR3dElEQXVNRFZjYm0xaGVFeHZaekpHUXlBOExTQXlYRzVjYm5SbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHeHZaMTl2WW5ObGVIQmZaR2xtWmw5a1ZFRkhYMFJOVTA4c0lHZGxibVVzSUdScGMzUmhibU5sS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsSUZ4dUlDQnpiR2xqWlY5dGFXNG9aR2x6ZEdGdVkyVXNJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLU0FsUGlVZ1hHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0JzYjJkZmIySnpaWGh3WDJScFptWmZaRlJCUjE5RVRWTlBMQ0F1WjNKdmRYQnpJRDBnSjJSeWIzQW5LVnh1WEc1MFpXMXdJRHd0SUd4bFpuUmZhbTlwYmloMFpXMXdMQ0JrYVdabUxsSk9RU3dnWW5rZ1BTQmpLRnhjWjJWdVpWeGNJRDBnWEZ4bGJuTmxiV0pzWDJkbGJtVmZhV1JjWENrcElDVStKU0JjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2htYkdGbklEMGdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsVEdsemRDNWtiM2R1TGxKT1FTd2dYRnd5UkU5WFRseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCaktDa3NJRnhjTVZWUVhGd3NJRnhjTUU1UFhGd3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhoR2JHRm5JRDBnS0dGaWN5aHphSEpwYm10bFpGOXNiMmN5UmtNcElENGdiV0Y0VEc5bk1rWkRLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUhKc2IyY3labU5OWVhnZ1BTQndiV0Y0S0hCdGFXNG9jMmh5YVc1clpXUmZiRzluTWtaRExDQnRZWGhNYjJjeVJrTXBMQ0F0YldGNFRHOW5Na1pES1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2htYkdGbktWeHVYRzRqWm5keWFYUmxLSFJsYlhBc0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR2RsYm1WZllYWm5VMk52Y21WZlptTmZaRlJCUjE5d0xXNHVkSE4yWEZ3cExDQnpaWEFnUFNCY1hGeGNkRnhjS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlITm9jbXh2WnpKbVkwMWhlQ3dnZVNBOUlHMWxZVzVmWkdsbVpsOXpZMjl5WlN3Z1kyOXNiM0lnUFNCbWJHRm5MQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOUlHbG1aV3h6WlNobWJHRm5JQ0U5SUZ4Y01FNVBYRndzSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlN3Z1RrRXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9ZWEJsSUQwZ1lYTXVabUZqZEc5eUtHMWhlRVpzWVdjcEtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJuWlc5dFgzUmxlSFJmY21Wd1pXd29LU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQm5aM1JwZEd4bEtGeGNaRlJCUjF4Y0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY1hHUmhjMmhsWkZ4Y0tTQXJJRnh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlHWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ0xXWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdjMk5oYkdWZlkyOXNiM0pmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWEZ3d1RrOWNYQ0E5SUZ4Y1ozSmxlVnhjTENCY1hERlZVRnhjSUQwZ1hGeHlaV1JjWEN3Z1hGd3lSRTlYVGx4Y0lEMGdYRnhpYkhWbFhGd3BLU0FySUNBaklFTnZjbkpsWTNSbFpDQmpiMnh2Y2lCdFlYQndhVzVuWEc0Z0lITmpZV3hsWDNOb1lYQmxYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjVkZKVlJWeGNJRDBnTWl3Z1hGeEdRVXhUUlZ4Y0lEMGdNVGtwS1Z4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhzYjJjeVJrTmZkbk5mWVhablUyTnZjbVZmWkZSQlIxOVBSVjl3TFc1ZlkyeHZjMlZ6ZEV4dlowOUZYRndwWEc1b1pXbG5hSFFnUEMwZ05GeHVkMmxrZEdnZ1BDMGdOMXh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVYRzRqSUU1dklFWkRJR04xZEc5bVppQnZjSFJwYjI0Z0xTQmtiM2R1SUc5dWJIbGNiblJsYlhBZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0d4dloxOXZZbk5sZUhCZlpHbG1abDlrVkVGSFgwUk5VMDhzSUdkbGJtVXNJR1JwYzNSaGJtTmxLU0FsUGlVZ1hHNGdJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVWdaM0p2ZFhCZllua29aMlZ1WlNrZ0pUNGxYRzRnSUhOc2FXTmxYMjFwYmloa2FYTjBZVzVqWlN3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcElDVStKU0JjYmlBZ2MzVnRiV0Z5YVhwbEtHMWxZVzVmWkdsbVpsOXpZMjl5WlNBOUlHeHZaMTl2WW5ObGVIQmZaR2xtWmw5a1ZFRkhYMFJOVTA4c0lDNW5jbTkxY0hNZ1BTQW5aSEp2Y0NjcFhHNWNiblJsYlhBZ1BDMGdiR1ZtZEY5cWIybHVLSFJsYlhBc0lHUnBabVl1VWs1QkxDQmllU0E5SUdNb1hGeG5aVzVsWEZ3Z1BTQmNYR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeGNLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHWnNZV2NnUFNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVk1hWE4wTG1SdmQyNHVVazVCTG01dlJrTmpkWFJ2Wm1Zc0lGeGNNa1JQVjA1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWXlncExDQmNYREZWVUZ4Y0xDQmNYREJPVDF4Y0tTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0Y0Um14aFp5QTlJQ2hoWW5Nb2MyaHlhVzVyWldSZmJHOW5Na1pES1NBK0lHMWhlRXh2WnpKR1F5a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmh5Ykc5bk1tWmpUV0Y0SUQwZ2NHMWhlQ2h3YldsdUtITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2JXRjRURzluTWtaREtTd2dMVzFoZUV4dlp6SkdReWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbUZ5Y21GdVoyVW9abXhoWnlsY2JseHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJSE5vY21sdWEyVmtYMnh2WnpKR1F5d2dlU0E5SUcxbFlXNWZaR2xtWmw5elkyOXlaU3dnWTI5c2IzSWdQU0JtYkdGbkxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1lXSmxiQ0E5SUdsbVpXeHpaU2htYkdGbklDRTlJRnhjTUU1UFhGd3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU3dnVGtFcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb1lYQmxJRDBnWVhNdVptRmpkRzl5S0cxaGVFWnNZV2NwS1NrZ0sxeHVJQ0JuWlc5dFgzQnZhVzUwS0NrZ0t5Qm5aVzl0WDNSbGVIUmZjbVZ3Wld3b0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNCblozUnBkR3hsS0Z4Y1pGUkJSMXhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUMwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBcklGeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUdaalEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTFdaalEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3RjYmlBZ2MyTmhiR1ZmWTI5c2IzSmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YRnd3VGs5Y1hDQTlJRnhjWjNKbGVWeGNMQ0JjWERGVlVGeGNJRDBnWEZ4eVpXUmNYQ3dnWEZ3eVJFOVhUbHhjSUQwZ1hGeGliSFZsWEZ3cEtTQXJJQ0FqSUVOdmNuSmxZM1JsWkNCamIyeHZjaUJ0WVhCd2FXNW5YRzRnSUhOallXeGxYM05vWVhCbFgyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGeGNWRkpWUlZ4Y0lEMGdNaXdnWEZ4R1FVeFRSVnhjSUQwZ01Ua3BLVnh1WEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hGeHNiMmN5UmtOZmRuTmZZWFpuVTJOdmNtVmZaRlJCUjE5UFJWOXdMVzVmWTJ4dmMyVnpkRXh2WjA5RlgyNXZSa05qZFhSdlptWmNYQ2xjYm1obGFXZG9kQ0E4TFNBMFhHNTNhV1IwYUNBOExTQTNYRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbiMgZ2V0dGluZyBsaXN0IG9mIGdlbmVzIG9mIGludGVyZXN0IGZyb20gUk5BLXNlcSBhbmQgUFJPLXNlcVxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmLlBSTy5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzFHMi5kVEFHX0cxLmRUQUdfdnNfRzEuRE1TT19QUk9zZXEudHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlBSTy5HMi5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzFHMi5kVEFHX0cyLmRUQUdfdnNfRzIuRE1TT19QUk9zZXEudHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSlcbiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuXG4jIExvYWRpbmcgT0UgbG9vcCBzY29yZVxubWluVmFsdWUgPC0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTylcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgbGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpXG5cbiMgVGVzdGluZyBkaWZmZXJlbnQgd2F5cyB0byBjYWxjdWxhdGUgcmVwcmVzZW50YXRpdmUgZmVhdHVyZSBvZiBsb29wcyBmb3IgZWFjaCBnZW5lXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQpKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmKSRlbnNlbWJsX2dlbmVfaWRcblxuZ2VuZUxpc3QudXAgPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzIuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkKSlcblxuXG4jIFsxXSBBdmVyYWdlIG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lXG4jIyBSTkEgb25seVxuZmNDdXRvZmYgPC0gMC41XG5hbHBoYSA8LSAwLjA1XG5tYXhMb2cyRkMgPC0gMlxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBnZW5lLCBkaXN0YW5jZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSBcbiAgc2xpY2VfbWluKGRpc3RhbmNlLCB3aXRoX3RpZXMgPSBGQUxTRSkgJT4lIFxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfcC1uX2Nsb3Nlc3RMb2dPRVxcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuIyBObyBGQyBjdXRvZmYgb3B0aW9uIC0gZG93biBvbmx5XG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBnZW5lLCBkaXN0YW5jZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzbGljZV9taW4oZGlzdGFuY2UsIHdpdGhfdGllcyA9IEZBTFNFKSAlPiUgXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJpbmtlZF9sb2cyRkMsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfcC1uX2Nsb3Nlc3RMb2dPRV9ub0ZDY3V0b2ZmXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUFJPLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzEuZFRBR192c19HMS5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUFJPLkcyLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzIuZFRBR192c19HMi5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKVxuIyBJbXBvcnRpbmcgbG9vcCBnZW5lIGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKVxuXG5cbiMgTG9hZGluZyBPRSBsb29wIHNjb3JlXG5taW5WYWx1ZSA8LSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTyxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPKVxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoXFxpZFxcKSlcblxuIyBUZXN0aW5nIGRpZmZlcmVudCB3YXlzIHRvIGNhbGN1bGF0ZSByZXByZXNlbnRhdGl2ZSBmZWF0dXJlIG9mIGxvb3BzIGZvciBlYWNoIGdlbmVcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24gPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCkpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXBkb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYpJGVuc2VtYmxfZ2VuZV9pZFxuXG5nZW5lTGlzdC51cCA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQpKVxuXG5cbiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUsIGRpc3RhbmNlKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lIFxuICBzbGljZV9taW4oZGlzdGFuY2UsIHdpdGhfdGllcyA9IEZBTFNFKSAlPiUgXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG4jZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLW4udHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcZFRBR1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19PRV9wLW5fY2xvc2VzdExvZ09FXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4jIE5vIEZDIGN1dG9mZiBvcHRpb24gLSBkb3duIG9ubHlcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUsIGRpc3RhbmNlKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHNsaWNlX21pbihkaXN0YW5jZSwgd2l0aF90aWVzID0gRkFMU0UpICU+JSBcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmlua2VkX2xvZzJGQywgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcZFRBR1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19PRV9wLW5fY2xvc2VzdExvZ09FX25vRkNjdXRvZmZcXClcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1)


# Loading OE loop score
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

geneAnnoData <- geneAnnoData %>% left_join(obsexp, by = c(\id\))

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id))
geneList.down.RNA <- (diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.down.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.updown.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff)$ensembl_gene_id

geneList.up <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id))


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene, distance) %>% 
  unnest(gene) %>% group_by(gene) %>% 
  slice_min(distance, with_ties = FALSE) %>% 
  summarize(mean_diff_score = log_obsexp_diff_dTAG_DMSO, .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

#fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_closestLogOE\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# No FC cutoff option - down only
temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene, distance) %>% 
  unnest(gene) %>% group_by(gene) %>%
  slice_min(distance, with_ties = FALSE) %>% 
  summarize(mean_diff_score = log_obsexp_diff_dTAG_DMSO, .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)


p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_closestLogOE_noFCcutoff\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### abs max

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJuWlhSMGFXNW5JR3hwYzNRZ2IyWWdaMlZ1WlhNZ2IyWWdhVzUwWlhKbGMzUWdabkp2YlNCU1RrRXRjMlZ4SUdGdVpDQlFVazh0YzJWeFhHNWhiSEJvWVNBOExTQXdMakExWEc1bVkwTjFkRzltWmlBOExTQXdMalZjYm1ScFptWXVVRkpQTGtjeExtUlVRVWNnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laR2xtWmw5SE1VY3lMbVJVUVVkZlJ6RXVaRlJCUjE5MmMxOUhNUzVFVFZOUFgxQlNUM05sY1M1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIQmhaR29nUENCaGJIQm9ZU3dnWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQm1ZME4xZEc5bVppbGNibVJwWm1ZdVVGSlBMa2N5TG1SVVFVY2dQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVpHbG1abDlITVVjeUxtUlVRVWRmUnpJdVpGUkJSMTkyYzE5SE1pNUVUVk5QWDFCU1QzTmxjUzUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VWs1QkxrY3hMbVJVUVVjZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIQmhaR29nUENCaGJIQm9ZU3dnWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQm1ZME4xZEc5bVppbGNibVJwWm1ZdVVrNUJMa2N4TG1SVVFVY3VibTlHUTJOMWRHOW1aaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSmthV1ptWDBjeExtUlVRVWRmUnpFdU1ta3VaRlJCUjE5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY0dGa2FpQThJR0ZzY0doaEtWeHVJeUJKYlhCdmNuUnBibWNnYkc5dmNDQm5aVzVsSUdGdWJtOTBZWFJwYjI1Y2JtNWhiV1VnUEMwZ1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVhDSmNibHh1WkdsbVprTjFkRzltWmlBOExTQXdMakpjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZjQzF1WDJWdWMyVnRZbXhNYVhOMExuUnpkbHdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwWm1aRGRYUnZabVlnUFNCa2FXWm1RM1YwYjJabUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVmhjSWlrcEpUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhLVnh1WEc1Y2JpTWdURzloWkdsdVp5QlBSU0JzYjI5d0lITmpiM0psWEc1dGFXNVdZV3gxWlNBOExTQXRORnh1YjJKelpYaHdJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9YQ0pzYjI5d1UyTnZjbVZmWTI5dWMxOXZZbk5sZUhBdWRITjJYQ0lwS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9iRzluWDI5aWMyVjRjRjlFVFZOUElEMGdhV1pmWld4elpTaHZZbk5sZUhCZlJFMVRUeUE5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmUkUxVFR5a3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WjE5dlluTmxlSEJmWkZSQlJ5QTlJR2xtWDJWc2MyVW9iMkp6Wlhod1gyUlVRVWNnUFQwZ01Dd2diV2x1Vm1Gc2RXVXNJR3h2WnpJb2IySnpaWGh3WDJSVVFVY3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDBFME9EVWdQU0JwWmw5bGJITmxLRzlpYzJWNGNGOUJORGcxSUQwOUlEQXNJRzFwYmxaaGJIVmxMQ0JzYjJjeUtHOWljMlY0Y0Y5Qk5EZzFLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5a2FXWm1YMlJVUVVkZlJFMVRUeUE5SUd4dloxOXZZbk5sZUhCZlpGUkJSeUF0SUd4dloxOXZZbk5sZUhCZlJFMVRUeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDJScFptWmZRVFE0TlY5RVRWTlBJRDBnYkc5blgyOWljMlY0Y0Y5Qk5EZzFJQzBnYkc5blgyOWljMlY0Y0Y5RVRWTlBLVnh1WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JzWldaMFgycHZhVzRvYjJKelpYaHdMQ0JpZVNBOUlHTW9YQ0pwWkZ3aUtTbGNibHh1SXlCVVpYTjBhVzVuSUdScFptWmxjbVZ1ZENCM1lYbHpJSFJ2SUdOaGJHTjFiR0YwWlNCeVpYQnlaWE5sYm5SaGRHbDJaU0JtWldGMGRYSmxJRzltSUd4dmIzQnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JtUnBabVl1VWs1QklEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1ScFptWmZSekV1WkZSQlIxOUhNUzR5YVM1a1ZFRkhYM1p6WDBjeExqSnBMa1JOVTA4dWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGxibk5sYldKc1gyZGxibVZmYVdRc0lHeHZaekpHYjJ4a1EyaGhibWRsTENCemFISnBibXRsWkY5c2IyY3lSa01zSUhCaFpHb3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU2xjYm1kbGJtVk1hWE4wTG1SdmQyNGdQQzBnZFc1cGNYVmxLR01vS0dScFptWXVVazVCTGtjeExtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHdnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tHUnBabVl1VUZKUExrY3hMbVJVUVVjZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLR1JwWm1ZdVVGSlBMa2N5TG1SVVFVY2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElEd2dNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaQ2twWEc1blpXNWxUR2x6ZEM1a2IzZHVMbEpPUVNBOExTQW9aR2xtWmk1U1RrRXVSekV1WkZSQlJ5QWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtYRzVuWlc1bFRHbHpkQzVrYjNkdUxsSk9RUzV1YjBaRFkzVjBiMlptSUR3dElDaGthV1ptTGxKT1FTNUhNUzVrVkVGSExtNXZSa05qZFhSdlptWWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElEd2dNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WjJWdVpVeHBjM1F1ZFhCa2IzZHVMbEpPUVM1dWIwWkRZM1YwYjJabUlEd3RJQ2hrYVdabUxsSk9RUzVITVM1a1ZFRkhMbTV2UmtOamRYUnZabVlwSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WEc1blpXNWxUR2x6ZEM1MWNDQThMU0IxYm1seGRXVW9ZeWdvWkdsbVppNVNUa0V1UnpFdVpGUkJSeUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQaUF3S1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS0dScFptWXVVRkpQTGtjeExtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRDRnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNoa2FXWm1MbEJTVHk1SE1pNWtWRUZISUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hOb2NtbHVhMlZrWDJ4dlp6SkdReUErSURBcEtTUmxibk5sYldKc1gyZGxibVZmYVdRcEtWeHVYRzVjYmlNZ1d6RmRJRUYyWlhKaFoyVWdiMllnWkdsbVptVnlaVzUwYVdGc0lHeHZiM0FnYzJOdmNtVnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JpTWpJRkpPUVNCdmJteDVYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibUZzY0doaElEd3RJREF1TURWY2JtMWhlRXh2WnpKR1F5QThMU0F5WEc1Y2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOHNJR2RsYm1Vc0lHUnBjM1JoYm1ObEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bElGeHVJQ0J6YkdsalpWOXRZWGdvWkdsemRHRnVZMlVzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1NBbFBpVWdYRzRnSUhOMWJXMWhjbWw2WlNodFpXRnVYMlJwWm1aZmMyTnZjbVVnUFNCc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QTENBdVozSnZkWEJ6SUQwZ0oyUnliM0FuS1Z4dVhHNTBaVzF3SUR3dElHeGxablJmYW05cGJpaDBaVzF3TENCa2FXWm1MbEpPUVN3Z1lua2dQU0JqS0Z3aVoyVnVaVndpSUQwZ1hDSmxibk5sYldKc1gyZGxibVZmYVdSY0lpa3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobWJHRm5JRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bFRHbHpkQzVrYjNkdUxsSk9RU3dnWENJeVJFOVhUbHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQmpLQ2tzSUZ3aU1WVlFYQ0lzSUZ3aU1FNVBYQ0lwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYaEdiR0ZuSUQwZ0tHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnYldGNFRHOW5Na1pES1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFISnNiMmN5Wm1OTllYZ2dQU0J3YldGNEtIQnRhVzRvYzJoeWFXNXJaV1JmYkc5bk1rWkRMQ0J0WVhoTWIyY3lSa01wTENBdGJXRjRURzluTWtaREtTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNllYSnlZVzVuWlNobWJHRm5LVnh1WEc0alpuZHlhWFJsS0hSbGJYQXNJR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1kbGJtVmZZWFpuVTJOdmNtVmZabU5mWkZSQlIxOXdMVzR1ZEhOMlhDSXBMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUtWeHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJSE5vY214dlp6Sm1ZMDFoZUN3Z2VTQTlJRzFsWVc1ZlpHbG1abDl6WTI5eVpTd2dZMjlzYjNJZ1BTQm1iR0ZuTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWVdKbGJDQTlJR2xtWld4elpTaG1iR0ZuSUNFOUlGd2lNRTVQWENJc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTd2dUa0VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vWVhCbElEMGdZWE11Wm1GamRHOXlLRzFoZUVac1lXY3BLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCblpXOXRYM1JsZUhSZmNtVndaV3dvS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0JuWjNScGRHeGxLRndpWkZSQlIxd2lLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJQzBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJoYzJobFpGd2lLU0FySUZ4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJR1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdMV1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnYzJOaGJHVmZZMjlzYjNKZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSXdUazljSWlBOUlGd2laM0psZVZ3aUxDQmNJakZWVUZ3aUlEMGdYQ0p5WldSY0lpd2dYQ0l5UkU5WFRsd2lJRDBnWENKaWJIVmxYQ0lwS1NBcklDQWpJRU52Y25KbFkzUmxaQ0JqYjJ4dmNpQnRZWEJ3YVc1blhHNGdJSE5qWVd4bFgzTm9ZWEJsWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aVZGSlZSVndpSUQwZ01pd2dYQ0pHUVV4VFJWd2lJRDBnTVRrcEtWeHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKc2IyY3lSa05mZG5OZllYWm5VMk52Y21WZlpGUkJSMTlQUlY5d0xXNWZabUZ5ZEdobGMzUk1iMmRQUlZ3aUtWeHVhR1ZwWjJoMElEd3RJRFJjYm5kcFpIUm9JRHd0SURkY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dUl5Qk9ieUJHUXlCamRYUnZabVlnYjNCMGFXOXVJQzBnWkc5M2JpQnZibXg1WEc1MFpXMXdJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaHNiMmRmYjJKelpYaHdYMlJwWm1aZlpGUkJSMTlFVFZOUExDQm5aVzVsTENCa2FYTjBZVzVqWlNrZ0pUNGxJRnh1SUNCMWJtNWxjM1FvWjJWdVpTa2dKVDRsSUdkeWIzVndYMko1S0dkbGJtVXBJQ1UrSlZ4dUlDQnpiR2xqWlY5dFlYZ29aR2x6ZEdGdVkyVXNJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLU0FsUGlVZ1hHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0JzYjJkZmIySnpaWGh3WDJScFptWmZaRlJCUjE5RVRWTlBMQ0F1WjNKdmRYQnpJRDBnSjJSeWIzQW5LVnh1WEc1MFpXMXdJRHd0SUd4bFpuUmZhbTlwYmloMFpXMXdMQ0JrYVdabUxsSk9RU3dnWW5rZ1BTQmpLRndpWjJWdVpWd2lJRDBnWENKbGJuTmxiV0pzWDJkbGJtVmZhV1JjSWlrcElDVStKU0JjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2htYkdGbklEMGdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsVEdsemRDNWtiM2R1TGxKT1FTNXViMFpEWTNWMGIyWm1MQ0JjSWpKRVQxZE9YQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHTW9LU3dnWENJeFZWQmNJaXdnWENJd1RrOWNJaWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxaGVFWnNZV2NnUFNBb1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJ0WVhoTWIyY3lSa01wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb2NteHZaekptWTAxaGVDQTlJSEJ0WVhnb2NHMXBiaWh6YUhKcGJtdGxaRjlzYjJjeVJrTXNJRzFoZUV4dlp6SkdReWtzSUMxdFlYaE1iMmN5UmtNcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0dac1lXY3BYRzVjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCemFISnBibXRsWkY5c2IyY3lSa01zSUhrZ1BTQnRaV0Z1WDJScFptWmZjMk52Y21Vc0lHTnZiRzl5SUQwZ1pteGhaeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BTQnBabVZzYzJVb1pteGhaeUFoUFNCY0lqQk9UMXdpTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVc0lFNUJLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphR0Z3WlNBOUlHRnpMbVpoWTNSdmNpaHRZWGhHYkdGbktTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWjJWdmJWOTBaWGgwWDNKbGNHVnNLQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCY2JpQWdaMmQwYVhSc1pTaGNJbVJVUVVkY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWENKa1lYTm9aV1JjSWlrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXRJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLeUJjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQm1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlDMW1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aU1FNVBYQ0lnUFNCY0ltZHlaWGxjSWl3Z1hDSXhWVkJjSWlBOUlGd2ljbVZrWENJc0lGd2lNa1JQVjA1Y0lpQTlJRndpWW14MVpWd2lLU2tnS3lBZ0l5QkRiM0p5WldOMFpXUWdZMjlzYjNJZ2JXRndjR2x1WjF4dUlDQnpZMkZzWlY5emFHRndaVjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWxSU1ZVVmNJaUE5SURJc0lGd2lSa0ZNVTBWY0lpQTlJREU1S1NsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpYkc5bk1rWkRYM1p6WDJGMloxTmpiM0psWDJSVVFVZGZUMFZmY0MxdVgyWmhjblJvWlhOMFRHOW5UMFZmYm05R1EyTjFkRzltWmx3aUtWeHVhR1ZwWjJoMElEd3RJRFJjYm5kcFpIUm9JRHd0SURkY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiMgZ2V0dGluZyBsaXN0IG9mIGdlbmVzIG9mIGludGVyZXN0IGZyb20gUk5BLXNlcSBhbmQgUFJPLXNlcVxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmLlBSTy5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzFHMi5kVEFHX0cxLmRUQUdfdnNfRzEuRE1TT19QUk9zZXEudHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlBSTy5HMi5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzFHMi5kVEFHX0cyLmRUQUdfdnNfRzIuRE1TT19QUk9zZXEudHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSlcbiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuXG4jIExvYWRpbmcgT0UgbG9vcCBzY29yZVxubWluVmFsdWUgPC0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTylcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgbGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpXG5cbiMgVGVzdGluZyBkaWZmZXJlbnQgd2F5cyB0byBjYWxjdWxhdGUgcmVwcmVzZW50YXRpdmUgZmVhdHVyZSBvZiBsb29wcyBmb3IgZWFjaCBnZW5lXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQpKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmKSRlbnNlbWJsX2dlbmVfaWRcblxuZ2VuZUxpc3QudXAgPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzIuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkKSlcblxuXG4jIFsxXSBBdmVyYWdlIG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lXG4jIyBSTkEgb25seVxuZmNDdXRvZmYgPC0gMC41XG5hbHBoYSA8LSAwLjA1XG5tYXhMb2cyRkMgPC0gMlxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBnZW5lLCBkaXN0YW5jZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSBcbiAgc2xpY2VfbWF4KGRpc3RhbmNlLCB3aXRoX3RpZXMgPSBGQUxTRSkgJT4lIFxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfcC1uX2ZhcnRoZXN0TG9nT0VcXClcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbiMgTm8gRkMgY3V0b2ZmIG9wdGlvbiAtIGRvd24gb25seVxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZ2VuZSwgZGlzdGFuY2UpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc2xpY2VfbWF4KGRpc3RhbmNlLCB3aXRoX3RpZXMgPSBGQUxTRSkgJT4lIFxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hyaW5rZWRfbG9nMkZDLCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxkVEFHXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxncmV5XFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19hdmdTY29yZV9kVEFHX09FX3Atbl9mYXJ0aGVzdExvZ09FX25vRkNjdXRvZmZcXClcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1)


# Loading OE loop score
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

geneAnnoData <- geneAnnoData %>% left_join(obsexp, by = c(\id\))

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id))
geneList.down.RNA <- (diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.down.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.updown.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff)$ensembl_gene_id

geneList.up <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id))


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene, distance) %>% 
  unnest(gene) %>% group_by(gene) %>% 
  slice_max(distance, with_ties = FALSE) %>% 
  summarize(mean_diff_score = log_obsexp_diff_dTAG_DMSO, .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

#fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_farthestLogOE\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# No FC cutoff option - down only
temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene, distance) %>% 
  unnest(gene) %>% group_by(gene) %>%
  slice_max(distance, with_ties = FALSE) %>% 
  summarize(mean_diff_score = log_obsexp_diff_dTAG_DMSO, .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)


p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_farthestLogOE_noFCcutoff\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5Qm5aWFIwYVc1bklHeHBjM1FnYjJZZ1oyVnVaWE1nYjJZZ2FXNTBaWEpsYzNRZ1puSnZiU0JTVGtFdGMyVnhJR0Z1WkNCUVVrOHRjMlZ4WEc1aGJIQm9ZU0E4TFNBd0xqQTFYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibVJwWm1ZdVVGSlBMa2N4TG1SVVFVY2dQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1pHbG1abDlITVVjeUxtUlVRVWRmUnpFdVpGUkJSMTkyYzE5SE1TNUVUVk5QWDFCU1QzTmxjUzUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VUZKUExrY3lMbVJVUVVjZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWkdsbVpsOUhNVWN5TG1SVVFVZGZSekl1WkZSQlIxOTJjMTlITWk1RVRWTlBYMUJTVDNObGNTNTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEJoWkdvZ1BDQmhiSEJvWVN3Z1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJtWTBOMWRHOW1aaWxjYm1ScFptWXVVazVCTGtjeExtUlVRVWNnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaR2xtWmw5SE1TNWtWRUZIWDBjeExqSnBMbVJVUVVkZmRuTmZSekV1TW1rdVJFMVRUeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VWs1QkxrY3hMbVJVUVVjdWJtOUdRMk4xZEc5bVppQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4a2FXWm1YMGN4TG1SVVFVZGZSekV1TW1rdVpGUkJSMTkyYzE5SE1TNHlhUzVFVFZOUExuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jR0ZrYWlBOElHRnNjR2hoS1Z4dUl5QkpiWEJ2Y25ScGJtY2diRzl2Y0NCblpXNWxJR0Z1Ym05MFlYUnBiMjVjYm01aGJXVWdQQzBnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WEZ4Y2JseHVaR2xtWmtOMWRHOW1aaUE4TFNBd0xqSmNibWRsYm1WQmJtNXZSR0YwWVNBOExTQnNiMkZrVEc5dmNFRnVibTlFWVhSaEtHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZmNDMXVYMlZ1YzJWdFlteE1hWE4wTG5SemRseGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnBabVpEZFhSdlptWWdQU0JrYVdabVEzVjBiMlptTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhibTV2VEdsemRDQTlJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWaGNYQ2twSlQ0bElGeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBjM1JoYm1ObElEMGdjM1JoY25ReUlDMGdjM1JoY25ReEtWeHVYRzVjYmlNZ1RHOWhaR2x1WnlCUFJTQnNiMjl3SUhOamIzSmxYRzV0YVc1V1lXeDFaU0E4TFNBdE5GeHViMkp6Wlhod0lEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb1hGeHNiMjl3VTJOdmNtVmZZMjl1YzE5dlluTmxlSEF1ZEhOMlhGd3BLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2JHOW5YMjlpYzJWNGNGOUVUVk5QSUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmUkUxVFR5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZSRTFUVHlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5ObGVIQmZaRlJCUnlBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDJSVVFVY2dQVDBnTUN3Z2JXbHVWbUZzZFdVc0lHeHZaeklvYjJKelpYaHdYMlJVUVVjcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMEUwT0RVZ1BTQnBabDlsYkhObEtHOWljMlY0Y0Y5Qk5EZzFJRDA5SURBc0lHMXBibFpoYkhWbExDQnNiMmN5S0c5aWMyVjRjRjlCTkRnMUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrYVdabVgyUlVRVWRmUkUxVFR5QTlJR3h2WjE5dlluTmxlSEJmWkZSQlJ5QXRJR3h2WjE5dlluTmxlSEJmUkUxVFR5eGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMlJwWm1aZlFUUTROVjlFVFZOUElEMGdiRzluWDI5aWMyVjRjRjlCTkRnMUlDMGdiRzluWDI5aWMyVjRjRjlFVFZOUEtWeHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQnNaV1owWDJwdmFXNG9iMkp6Wlhod0xDQmllU0E5SUdNb1hGeHBaRnhjS1NsY2JseHVJeUJVWlhOMGFXNW5JR1JwWm1abGNtVnVkQ0IzWVhseklIUnZJR05oYkdOMWJHRjBaU0J5WlhCeVpYTmxiblJoZEdsMlpTQm1aV0YwZFhKbElHOW1JR3h2YjNCeklHWnZjaUJsWVdOb0lHZGxibVZjYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR1JwWm1aZlJ6RXVaRlJCUjE5SE1TNHlhUzVrVkVGSFgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibWRsYm1WTWFYTjBMbVJ2ZDI0Z1BDMGdkVzVwY1hWbEtHTW9LR1JwWm1ZdVVrNUJMa2N4TG1SVVFVY2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElEd2dNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS0dScFptWXVVRkpQTGtjeExtUlVRVWNnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHdnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tHUnBabVl1VUZKUExrY3lMbVJVUVVjZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpDa3BYRzVuWlc1bFRHbHpkQzVrYjNkdUxsSk9RU0E4TFNBb1pHbG1aaTVTVGtFdVJ6RXVaRlJCUnlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUENBd0tTa2taVzV6WlcxaWJGOW5aVzVsWDJsa1hHNW5aVzVsVEdsemRDNWtiM2R1TGxKT1FTNXViMFpEWTNWMGIyWm1JRHd0SUNoa2FXWm1MbEpPUVM1SE1TNWtWRUZITG01dlJrTmpkWFJ2Wm1ZZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVaMlZ1WlV4cGMzUXVkWEJrYjNkdUxsSk9RUzV1YjBaRFkzVjBiMlptSUR3dElDaGthV1ptTGxKT1FTNUhNUzVrVkVGSExtNXZSa05qZFhSdlptWXBKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVYRzVuWlc1bFRHbHpkQzUxY0NBOExTQjFibWx4ZFdVb1l5Z29aR2xtWmk1U1RrRXVSekV1WkZSQlJ5QWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BpQXdLU2trWlc1elpXMWliRjluWlc1bFgybGtMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLR1JwWm1ZdVVGSlBMa2N4TG1SVVFVY2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jMmh5YVc1clpXUmZiRzluTWtaRElENGdNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2hrYVdabUxsQlNUeTVITWk1a1ZFRkhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSE5vY21sdWEyVmtYMnh2WnpKR1F5QStJREFwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1FwS1Z4dVhHNWNiaU1nV3pGZElFRjJaWEpoWjJVZ2IyWWdaR2xtWm1WeVpXNTBhV0ZzSUd4dmIzQWdjMk52Y21WeklHWnZjaUJsWVdOb0lHZGxibVZjYmlNaklGSk9RU0J2Ym14NVhHNW1ZME4xZEc5bVppQThMU0F3TGpWY2JtRnNjR2hoSUR3dElEQXVNRFZjYm0xaGVFeHZaekpHUXlBOExTQXlYRzVjYm5SbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHeHZaMTl2WW5ObGVIQmZaR2xtWmw5a1ZFRkhYMFJOVTA4c0lHZGxibVVzSUdScGMzUmhibU5sS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsSUZ4dUlDQnpiR2xqWlY5dFlYZ29aR2x6ZEdGdVkyVXNJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLU0FsUGlVZ1hHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0JzYjJkZmIySnpaWGh3WDJScFptWmZaRlJCUjE5RVRWTlBMQ0F1WjNKdmRYQnpJRDBnSjJSeWIzQW5LVnh1WEc1MFpXMXdJRHd0SUd4bFpuUmZhbTlwYmloMFpXMXdMQ0JrYVdabUxsSk9RU3dnWW5rZ1BTQmpLRnhjWjJWdVpWeGNJRDBnWEZ4bGJuTmxiV0pzWDJkbGJtVmZhV1JjWENrcElDVStKU0JjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2htYkdGbklEMGdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsVEdsemRDNWtiM2R1TGxKT1FTd2dYRnd5UkU5WFRseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCaktDa3NJRnhjTVZWUVhGd3NJRnhjTUU1UFhGd3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhoR2JHRm5JRDBnS0dGaWN5aHphSEpwYm10bFpGOXNiMmN5UmtNcElENGdiV0Y0VEc5bk1rWkRLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUhKc2IyY3labU5OWVhnZ1BTQndiV0Y0S0hCdGFXNG9jMmh5YVc1clpXUmZiRzluTWtaRExDQnRZWGhNYjJjeVJrTXBMQ0F0YldGNFRHOW5Na1pES1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2htYkdGbktWeHVYRzRqWm5keWFYUmxLSFJsYlhBc0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR2RsYm1WZllYWm5VMk52Y21WZlptTmZaRlJCUjE5d0xXNHVkSE4yWEZ3cExDQnpaWEFnUFNCY1hGeGNkRnhjS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlITm9jbXh2WnpKbVkwMWhlQ3dnZVNBOUlHMWxZVzVmWkdsbVpsOXpZMjl5WlN3Z1kyOXNiM0lnUFNCbWJHRm5MQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOUlHbG1aV3h6WlNobWJHRm5JQ0U5SUZ4Y01FNVBYRndzSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlN3Z1RrRXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9ZWEJsSUQwZ1lYTXVabUZqZEc5eUtHMWhlRVpzWVdjcEtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJuWlc5dFgzUmxlSFJmY21Wd1pXd29LU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQm5aM1JwZEd4bEtGeGNaRlJCUjF4Y0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY1hHUmhjMmhsWkZ4Y0tTQXJJRnh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlHWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ0xXWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdjMk5oYkdWZlkyOXNiM0pmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWEZ3d1RrOWNYQ0E5SUZ4Y1ozSmxlVnhjTENCY1hERlZVRnhjSUQwZ1hGeHlaV1JjWEN3Z1hGd3lSRTlYVGx4Y0lEMGdYRnhpYkhWbFhGd3BLU0FySUNBaklFTnZjbkpsWTNSbFpDQmpiMnh2Y2lCdFlYQndhVzVuWEc0Z0lITmpZV3hsWDNOb1lYQmxYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjVkZKVlJWeGNJRDBnTWl3Z1hGeEdRVXhUUlZ4Y0lEMGdNVGtwS1Z4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhzYjJjeVJrTmZkbk5mWVhablUyTnZjbVZmWkZSQlIxOVBSVjl3TFc1ZlptRnlkR2hsYzNSTWIyZFBSVnhjS1Z4dWFHVnBaMmgwSUR3dElEUmNibmRwWkhSb0lEd3RJRGRjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibHh1SXlCT2J5QkdReUJqZFhSdlptWWdiM0IwYVc5dUlDMGdaRzkzYmlCdmJteDVYRzUwWlcxd0lEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QTENCblpXNWxMQ0JrYVhOMFlXNWpaU2tnSlQ0bElGeHVJQ0IxYm01bGMzUW9aMlZ1WlNrZ0pUNGxJR2R5YjNWd1gySjVLR2RsYm1VcElDVStKVnh1SUNCemJHbGpaVjl0WVhnb1pHbHpkR0Z1WTJVc0lIZHBkR2hmZEdsbGN5QTlJRVpCVEZORktTQWxQaVVnWEc0Z0lITjFiVzFoY21sNlpTaHRaV0Z1WDJScFptWmZjMk52Y21VZ1BTQnNiMmRmYjJKelpYaHdYMlJwWm1aZlpGUkJSMTlFVFZOUExDQXVaM0p2ZFhCeklEMGdKMlJ5YjNBbktWeHVYRzUwWlcxd0lEd3RJR3hsWm5SZmFtOXBiaWgwWlcxd0xDQmthV1ptTGxKT1FTd2dZbmtnUFNCaktGeGNaMlZ1WlZ4Y0lEMGdYRnhsYm5ObGJXSnNYMmRsYm1WZmFXUmNYQ2twSUNVK0pTQmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG1iR0ZuSUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCblpXNWxUR2x6ZEM1a2IzZHVMbEpPUVM1dWIwWkRZM1YwYjJabUxDQmNYREpFVDFkT1hGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdNb0tTd2dYRnd4VlZCY1hDd2dYRnd3VGs5Y1hDa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzFoZUVac1lXY2dQU0FvWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQnRZWGhNYjJjeVJrTXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vY214dlp6Sm1ZMDFoZUNBOUlIQnRZWGdvY0cxcGJpaHphSEpwYm10bFpGOXNiMmN5UmtNc0lHMWhlRXh2WnpKR1F5a3NJQzF0WVhoTWIyY3lSa01wS1NBbFBpVWdYRzRnSUdSd2JIbHlPanBoY25KaGJtZGxLR1pzWVdjcFhHNWNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSGtnUFNCdFpXRnVYMlJwWm1aZmMyTnZjbVVzSUdOdmJHOXlJRDBnWm14aFp5d2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHRmlaV3dnUFNCcFptVnNjMlVvWm14aFp5QWhQU0JjWERCT1QxeGNMQ0JsZUhSbGNtNWhiRjluWlc1bFgyNWhiV1VzSUU1QktTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFHRndaU0E5SUdGekxtWmhZM1J2Y2lodFlYaEdiR0ZuS1NrcElDdGNiaUFnWjJWdmJWOXdiMmx1ZENncElDc2daMlZ2YlY5MFpYaDBYM0psY0dWc0tDa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJjYmlBZ1oyZDBhWFJzWlNoY1hHUlVRVWRjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUdScFptWkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYRnhrWVhOb1pXUmNYQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBdElHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0t5QmNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdNQ2tnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNCbVkwTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUMxbVkwTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lITmpZV3hsWDJOdmJHOXlYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjTUU1UFhGd2dQU0JjWEdkeVpYbGNYQ3dnWEZ3eFZWQmNYQ0E5SUZ4Y2NtVmtYRndzSUZ4Y01rUlBWMDVjWENBOUlGeGNZbXgxWlZ4Y0tTa2dLeUFnSXlCRGIzSnlaV04wWldRZ1kyOXNiM0lnYldGd2NHbHVaMXh1SUNCelkyRnNaVjl6YUdGd1pWOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYRlJTVlVWY1hDQTlJRElzSUZ4Y1JrRk1VMFZjWENBOUlERTVLU2xjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNiRzluTWtaRFgzWnpYMkYyWjFOamIzSmxYMlJVUVVkZlQwVmZjQzF1WDJaaGNuUm9aWE4wVEc5blQwVmZibTlHUTJOMWRHOW1abHhjS1Z4dWFHVnBaMmgwSUR3dElEUmNibmRwWkhSb0lEd3RJRGRjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG4jIGdldHRpbmcgbGlzdCBvZiBnZW5lcyBvZiBpbnRlcmVzdCBmcm9tIFJOQS1zZXEgYW5kIFBSTy1zZXFcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZi5QUk8uRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxRzIuZFRBR19HMS5kVEFHX3ZzX0cxLkRNU09fUFJPc2VxLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5QUk8uRzIuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxRzIuZFRBR19HMi5kVEFHX3ZzX0cyLkRNU09fUFJPc2VxLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5STkEuRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEpXG4jIEltcG9ydGluZyBsb29wIGdlbmUgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSklPiUgXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpXG5cblxuIyBMb2FkaW5nIE9FIGxvb3Agc2NvcmVcbm1pblZhbHVlIDwtIC00XG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pXG5cbmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuXG4jIFRlc3RpbmcgZGlmZmVyZW50IHdheXMgdG8gY2FsY3VsYXRlIHJlcHJlc2VudGF0aXZlIGZlYXR1cmUgb2YgbG9vcHMgZm9yIGVhY2ggZ2VuZVxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93biA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzIuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkKSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cGRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZikkZW5zZW1ibF9nZW5lX2lkXG5cbmdlbmVMaXN0LnVwIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCkpXG5cblxuIyBbMV0gQXZlcmFnZSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDJcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZ2VuZSwgZGlzdGFuY2UpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUgXG4gIHNsaWNlX21heChkaXN0YW5jZSwgd2l0aF90aWVzID0gRkFMU0UpICU+JSBcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbiNmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIFxcZ2VuZV9hdmdTY29yZV9mY19kVEFHX3Atbi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxkVEFHXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxncmV5XFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19hdmdTY29yZV9kVEFHX09FX3Atbl9mYXJ0aGVzdExvZ09FXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4jIE5vIEZDIGN1dG9mZiBvcHRpb24gLSBkb3duIG9ubHlcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUsIGRpc3RhbmNlKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHNsaWNlX21heChkaXN0YW5jZSwgd2l0aF90aWVzID0gRkFMU0UpICU+JSBcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmlua2VkX2xvZzJGQywgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcZFRBR1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19PRV9wLW5fZmFydGhlc3RMb2dPRV9ub0ZDY3V0b2ZmXFwpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUFJPLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzEuZFRBR192c19HMS5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUFJPLkcyLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzIuZFRBR192c19HMi5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKVxuIyBJbXBvcnRpbmcgbG9vcCBnZW5lIGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKVxuXG5cbiMgTG9hZGluZyBPRSBsb29wIHNjb3JlXG5taW5WYWx1ZSA8LSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTyxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPKVxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoXFxpZFxcKSlcblxuIyBUZXN0aW5nIGRpZmZlcmVudCB3YXlzIHRvIGNhbGN1bGF0ZSByZXByZXNlbnRhdGl2ZSBmZWF0dXJlIG9mIGxvb3BzIGZvciBlYWNoIGdlbmVcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24gPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCkpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXBkb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYpJGVuc2VtYmxfZ2VuZV9pZFxuXG5nZW5lTGlzdC51cCA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwKSkkZW5zZW1ibF9nZW5lX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQpKVxuXG5cbiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSAyXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUsIGRpc3RhbmNlKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lIFxuICBzbGljZV9tYXgoZGlzdGFuY2UsIHdpdGhfdGllcyA9IEZBTFNFKSAlPiUgXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG4jZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLW4udHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcZFRBR1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcZ3JleVxcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19PRV9wLW5fZmFydGhlc3RMb2dPRVxcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuIyBObyBGQyBjdXRvZmYgb3B0aW9uIC0gZG93biBvbmx5XG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBnZW5lLCBkaXN0YW5jZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzbGljZV9tYXgoZGlzdGFuY2UsIHdpdGhfdGllcyA9IEZBTFNFKSAlPiUgXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJpbmtlZF9sb2cyRkMsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXGRUQUdcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGdyZXlcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfcC1uX2ZhcnRoZXN0TG9nT0Vfbm9GQ2N1dG9mZlxcKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1)


# Loading OE loop score
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

geneAnnoData <- geneAnnoData %>% left_join(obsexp, by = c(\id\))

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id,
                          (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id))
geneList.down.RNA <- (diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.down.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff %>% dplyr::filter(shrinked_log2FC < 0))$ensembl_gene_id
geneList.updown.RNA.noFCcutoff <- (diff.RNA.G1.dTAG.noFCcutoff)$ensembl_gene_id

geneList.up <- unique(c((diff.RNA.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G1.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id,
                        (diff.PRO.G2.dTAG %>% dplyr::filter(shrinked_log2FC > 0))$ensembl_gene_id))


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 2

temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene, distance) %>% 
  unnest(gene) %>% group_by(gene) %>% 
  slice_max(distance, with_ties = FALSE) %>% 
  summarize(mean_diff_score = log_obsexp_diff_dTAG_DMSO, .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

#fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_farthestLogOE\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# No FC cutoff option - down only
temp <- geneAnnoData %>% dplyr::select(log_obsexp_diff_dTAG_DMSO, gene, distance) %>% 
  unnest(gene) %>% group_by(gene) %>%
  slice_max(distance, with_ties = FALSE) %>% 
  summarize(mean_diff_score = log_obsexp_diff_dTAG_DMSO, .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA.noFCcutoff, \2DOWN\,
                              ifelse(gene %in% c(), \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)


p <- ggplot(temp, aes(x = shrinked_log2FC, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\dTAG\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \grey\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_dTAG_OE_p-n_farthestLogOE_noFCcutoff\)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### Closest P-N loop

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJuWlhSMGFXNW5JR3hwYzNRZ2IyWWdaMlZ1WlhNZ2IyWWdhVzUwWlhKbGMzUWdabkp2YlNCU1RrRXRjMlZ4SUdGdVpDQlFVazh0YzJWeFhHNWhiSEJvWVNBOExTQXdMakExWEc1bVkwTjFkRzltWmlBOExTQXdMalZjYm1ScFptWXVVazVCTGtjeExrRTBPRFVnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laR2xtWmw5SE1TNUJORGcxTG5ObGJHVmpkR1ZrTWw5SE1TNHlhUzVCTkRnMVgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lod1lXUnFJRHdnWVd4d2FHRXNJR0ZpY3loemFISnBibXRsWkY5c2IyY3lSa01wSUQ0Z1ptTkRkWFJ2Wm1ZcFhHNWNiaU1nU1cxd2IzSjBhVzVuSUd4dmIzQWdaMlZ1WlNCaGJtNXZkR0YwYVc5dVhHNXVZVzFsSUR3dElGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWd2lYRzVjYm1ScFptWkRkWFJ2Wm1ZZ1BDMGdNQzR5WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnYkc5aFpFeHZiM0JCYm01dlJHRjBZU2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYM0F0Ymw5bGJuTmxiV0pzVEdsemRDNTBjM1pjSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVdabVEzVjBiMlptSUQwZ1pHbG1aa04xZEc5bVppeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVc1dWIweHBjM1FnUFNCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJc0lGd2lVQzFUWENJc0lGd2lVQzFZWENJcEtTVStKU0JjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2xjYmx4dUl5QlVaWE4wYVc1bklHUnBabVpsY21WdWRDQjNZWGx6SUhSdklHTmhiR04xYkdGMFpTQnlaWEJ5WlhObGJuUmhkR2wyWlNCbVpXRjBkWEpsSUc5bUlHeHZiM0J6SUdadmNpQmxZV05vSUdkbGJtVmNibVJwWm1ZdVVrNUJJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltUnBabVpmUnpFdVFUUTROUzV6Wld4bFkzUmxaREpmUnpFdU1ta3VRVFE0TlY5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWlc1elpXMWliRjluWlc1bFgybGtMQ0JzYjJjeVJtOXNaRU5vWVc1blpTd2djMmh5YVc1clpXUmZiRzluTWtaRExDQndZV1JxTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVcFhHNW5aVzVsVEdsemRDNWtiM2R1TGxKT1FTQThMU0FvWkdsbVppNVNUa0V1UnpFdVFUUTROU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0F0Wm1ORGRYUnZabVlwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1JjYm1kbGJtVk1hWE4wTG5Wd0xsSk9RU0E4TFNBb1pHbG1aaTVTVGtFdVJ6RXVRVFE0TlNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUGlCbVkwTjFkRzltWmlrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkZ4dVhHNWNiaU1nV3pGZElFRjJaWEpoWjJVZ2IyWWdaR2xtWm1WeVpXNTBhV0ZzSUd4dmIzQWdjMk52Y21WeklHWnZjaUJsWVdOb0lHZGxibVZjYmlNaklGSk9RU0J2Ym14NVhHNW1ZME4xZEc5bVppQThMU0F3TGpWY2JtRnNjR2hoSUR3dElEQXVNRFZjYm0xaGVFeHZaekpHUXlBOExTQTBYRzVjYm5SbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBabVpmUVRRNE5WOUVUVk5QTENCblpXNWxLU0FsUGlVZ1hHNGdJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVWdaM0p2ZFhCZllua29aMlZ1WlNrZ0pUNGxYRzRnSUhOMWJXMWhjbWw2WlNodFpXRnVYMlJwWm1aZmMyTnZjbVVnUFNCdFpXRnVLR1JwWm1aZlFUUTROVjlFVFZOUEtTd2dMbWR5YjNWd2N5QTlJQ2RrY205d0p5bGNibHh1ZEdWdGNDQThMU0JzWldaMFgycHZhVzRvZEdWdGNDd2daR2xtWmk1U1RrRXNJR0o1SUQwZ1l5aGNJbWRsYm1WY0lpQTlJRndpWlc1elpXMWliRjluWlc1bFgybGtYQ0lwS1NBbFBpVWdYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9abXhoWnlBOUlHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaVXhwYzNRdVpHOTNiaTVTVGtFc0lGd2lNa1JQVjA1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1ZFhBdVVrNUJMQ0JjSWpGVlVGd2lMQ0JjSWpCT1Qxd2lLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYldGNFJteGhaeUE5SUNoaFluTW9jMmh5YVc1clpXUmZiRzluTWtaREtTQStJRzFoZUV4dlp6SkdReWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJoeWJHOW5NbVpqVFdGNElEMGdjRzFoZUNod2JXbHVLSE5vY21sdWEyVmtYMnh2WnpKR1F5d2diV0Y0VEc5bk1rWkRLU3dnTFcxaGVFeHZaekpHUXlrcElDVStKU0JjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvWm14aFp5bGNibHh1Wm5keWFYUmxLSFJsYlhBc0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNJbWRsYm1WZllYWm5VMk52Y21WZlptTmZaRlJCUjE5d0xXNHVkSE4yWENJcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlITm9jbXh2WnpKbVkwMWhlQ3dnZVNBOUlHMWxZVzVmWkdsbVpsOXpZMjl5WlN3Z1kyOXNiM0lnUFNCbWJHRm5MQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOUlHbG1aV3h6WlNobWJHRm5JQ0U5SUZ3aU1FNVBYQ0lzSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlN3Z1RrRXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9ZWEJsSUQwZ1lYTXVabUZqZEc5eUtHMWhlRVpzWVdjcEtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJuWlc5dFgzUmxlSFJmY21Wd1pXd29LU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQm5aM1JwZEd4bEtGd2lRVFE0TlZ3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJJRnh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlHWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ0xXWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUN0Y2JpQWdjMk5oYkdWZlkyOXNiM0pmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENJd1RrOWNJaUE5SUZ3aVlteGhZMnRjSWl3Z1hDSXhWVkJjSWlBOUlGd2ljbVZrWENJc0lGd2lNa1JQVjA1Y0lpQTlJRndpWW14MVpWd2lLU2tnS3lBZ0l5QkRiM0p5WldOMFpXUWdZMjlzYjNJZ2JXRndjR2x1WjF4dUlDQnpZMkZzWlY5emFHRndaVjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWxSU1ZVVmNJaUE5SURJc0lGd2lSa0ZNVTBWY0lpQTlJREU1S1NsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpYkc5bk1rWkRYM1p6WDJGMloxTmpiM0psWDBFME9EVmZjQzF1WDJScFptWkRkWFJ2Wm1aZlhDSXNJR1JwWm1aRGRYUnZabVlwWEc1b1pXbG5hSFFnUEMwZ05GeHVkMmxrZEdnZ1BDMGdOMXh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ3aWFXNWNJaXdnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVYRzRqSUZzeVhTQlRkVzBnYjJZZ1pHbG1abVZ5Wlc1MGFXRnNJR3h2YjNBZ2MyTnZjbVZ6SUdadmNpQmxZV05vSUdkbGJtVmNiaU1qSUZKT1FTQnZibXg1WEc1bVkwTjFkRzltWmlBOExTQXdMalZjYm1Gc2NHaGhJRHd0SURBdU1EVmNibTFoZUV4dlp6SkdReUE4TFNBMFhHNWNiblJsYlhBZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScFptWmZRVFE0TlY5RVRWTlBMQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h6ZFcxZlpHbG1abDl6WTI5eVpTQTlJSE4xYlNoa2FXWm1YMEUwT0RWZlJFMVRUeWtzSUM1bmNtOTFjSE1nUFNBblpISnZjQ2NwWEc1Y2JuUmxiWEFnUEMwZ2JHVm1kRjlxYjJsdUtIUmxiWEFzSUdScFptWXVVazVCTENCaWVTQTlJR01vWENKblpXNWxYQ0lnUFNCY0ltVnVjMlZ0WW14ZloyVnVaVjlwWkZ3aUtTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dac1lXY2dQU0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1WTWFYTjBMbVJ2ZDI0dVVrNUJMQ0JjSWpKRVQxZE9YQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExuVndMbEpPUVN3Z1hDSXhWVkJjSWl3Z1hDSXdUazljSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhlRVpzWVdjZ1BTQW9ZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCdFlYaE1iMmN5UmtNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9jbXh2WnpKbVkwMWhlQ0E5SUhCdFlYZ29jRzFwYmloemFISnBibXRsWkY5c2IyY3lSa01zSUcxaGVFeHZaekpHUXlrc0lDMXRZWGhNYjJjeVJrTXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtHWnNZV2NwWEc1Y2JtWjNjbWwwWlNoMFpXMXdMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKblpXNWxYM04xYlZOamIzSmxYMlpqWDJSVVFVZGZjQzF1TG5SemRsd2lLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J6YUhKc2IyY3labU5OWVhnc0lIa2dQU0J6ZFcxZlpHbG1abDl6WTI5eVpTd2dZMjlzYjNJZ1BTQm1iR0ZuTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWVdKbGJDQTlJR2xtWld4elpTaG1iR0ZuSUNFOUlGd2lNRTVQWENJc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTd2dUa0VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vWVhCbElEMGdZWE11Wm1GamRHOXlLRzFoZUVac1lXY3BLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCblpXOXRYM1JsZUhSZmNtVndaV3dvS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0JuWjNScGRHeGxLRndpUVRRNE5Wd2lLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJQzBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJoYzJobFpGd2lLU0FySUZ4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJR1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdMV1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnYzJOaGJHVmZZMjlzYjNKZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSXdUazljSWlBOUlGd2lZbXhoWTJ0Y0lpd2dYQ0l4VlZCY0lpQTlJRndpY21Wa1hDSXNJRndpTWtSUFYwNWNJaUE5SUZ3aVlteDFaVndpS1NrZ0t5QWdJeUJEYjNKeVpXTjBaV1FnWTI5c2IzSWdiV0Z3Y0dsdVoxeHVJQ0J6WTJGc1pWOXphR0Z3WlY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY0lsUlNWVVZjSWlBOUlESXNJRndpUmtGTVUwVmNJaUE5SURFNUtTbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWJHOW5Na1pEWDNaelgzTjFiVk5qYjNKbFgwRTBPRFZmY0MxdVgyUnBabVpEZFhSdlptWmZYQ0lzSUdScFptWkRkWFJ2Wm1ZcFhHNW9aV2xuYUhRZ1BDMGdORnh1ZDJsa2RHZ2dQQzBnTjF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc1Y2JpTWdXek5kSUUxaGVDQnZaaUJrYVdabVpYSmxiblJwWVd3Z2JHOXZjQ0J6WTI5eVpYTWdabTl5SUdWaFkyZ2daMlZ1WlZ4dUl5TWdVazVCSUc5dWJIbGNibVpqUTNWMGIyWm1JRHd0SURBdU5WeHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dWJXRjRURzluTWtaRElEd3RJRFJjYmx4dWRHVnRjQ0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2xtWmw5Qk5EZzFYMFJOVTA4c0lHZGxibVVwSUNVK0pTQmNiaUFnZFc1dVpYTjBLR2RsYm1VcElDVStKU0JuY205MWNGOWllU2huWlc1bEtTQWxQaVZjYmlBZ2MzVnRiV0Z5YVhwbEtHMWhlRjloWW5OZlpHbG1abDl6WTI5eVpTQTlJR1JwWm1aZlFUUTROVjlFVFZOUFczZG9hV05vTG0xaGVDaGhZbk1vWkdsbVpsOUJORGcxWDBSTlUwOHBLVjBzSUM1bmNtOTFjSE1nUFNBblpISnZjQ2NwWEc1Y2JuUmxiWEFnUEMwZ2JHVm1kRjlxYjJsdUtIUmxiWEFzSUdScFptWXVVazVCTENCaWVTQTlJR01vWENKblpXNWxYQ0lnUFNCY0ltVnVjMlZ0WW14ZloyVnVaVjlwWkZ3aUtTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dac1lXY2dQU0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1WTWFYTjBMbVJ2ZDI0dVVrNUJMQ0JjSWpKRVQxZE9YQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExuVndMbEpPUVN3Z1hDSXhWVkJjSWl3Z1hDSXdUazljSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhlRVpzWVdjZ1BTQW9ZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCdFlYaE1iMmN5UmtNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9jbXh2WnpKbVkwMWhlQ0E5SUhCdFlYZ29jRzFwYmloemFISnBibXRsWkY5c2IyY3lSa01zSUcxaGVFeHZaekpHUXlrc0lDMXRZWGhNYjJjeVJrTXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtHWnNZV2NwWEc1Y2JtWjNjbWwwWlNoMFpXMXdMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKblpXNWxYMjFoZUVGaWMxTmpiM0psWDJaalgyUlVRVWRmY0MxdUxuUnpkbHdpS1N3Z2MyVndJRDBnWENKY1hIUmNJaWxjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCemFISnNiMmN5Wm1OTllYZ3NJSGtnUFNCdFlYaGZZV0p6WDJScFptWmZjMk52Y21Vc0lHTnZiRzl5SUQwZ1pteGhaeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BTQnBabVZzYzJVb1pteGhaeUFoUFNCY0lqQk9UMXdpTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVc0lFNUJLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphR0Z3WlNBOUlHRnpMbVpoWTNSdmNpaHRZWGhHYkdGbktTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWjJWdmJWOTBaWGgwWDNKbGNHVnNLQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCY2JpQWdaMmQwYVhSc1pTaGNJa0UwT0RWY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWENKa1lYTm9aV1JjSWlrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXRJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLeUJjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQm1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlDMW1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aU1FNVBYQ0lnUFNCY0ltSnNZV05yWENJc0lGd2lNVlZRWENJZ1BTQmNJbkpsWkZ3aUxDQmNJakpFVDFkT1hDSWdQU0JjSW1Kc2RXVmNJaWtwSUNzZ0lDTWdRMjl5Y21WamRHVmtJR052Ykc5eUlHMWhjSEJwYm1kY2JpQWdjMk5oYkdWZmMyaGhjR1ZmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENKVVVsVkZYQ0lnUFNBeUxDQmNJa1pCVEZORlhDSWdQU0F4T1NrcFhHNWNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW14dlp6SkdRMTkyYzE5dFlYaEJZbk5UWTI5eVpWOUJORGcxWDNBdGJsOWthV1ptUTNWMGIyWm1YMXdpTENCa2FXWm1RM1YwYjJabUtWeHVhR1ZwWjJoMElEd3RJRFJjYm5kcFpIUm9JRHd0SURkY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jIGdldHRpbmcgbGlzdCBvZiBnZW5lcyBvZiBpbnRlcmVzdCBmcm9tIFJOQS1zZXEgYW5kIFBSTy1zZXFcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZi5STkEuRzEuQTQ4NSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcblxuIyBJbXBvcnRpbmcgbG9vcCBnZW5lIGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKVxuXG4jIFRlc3RpbmcgZGlmZmVyZW50IHdheXMgdG8gY2FsY3VsYXRlIHJlcHJlc2VudGF0aXZlIGZlYXR1cmUgb2YgbG9vcHMgZm9yIGVhY2ggZ2VuZVxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQS5HMS5BNDg1ICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZikpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXAuUk5BIDwtIChkaWZmLlJOQS5HMS5BNDg1ICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmKSkkZW5zZW1ibF9nZW5lX2lkXG5cblxuIyBbMV0gQXZlcmFnZSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDRcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9BNDg1X0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5md3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIFxcZ2VuZV9hdmdTY29yZV9mY19kVEFHX3Atbi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxBNDg1XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxibGFja1xcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfQTQ4NV9wLW5fZGlmZkN1dG9mZl9cXCwgZGlmZkN1dG9mZilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbiMgWzJdIFN1bSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDRcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKHN1bV9kaWZmX3Njb3JlID0gc3VtKGRpZmZfQTQ4NV9ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfc3VtU2NvcmVfZmNfZFRBR19wLW4udHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IHN1bV9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxBNDg1XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxibGFja1xcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfc3VtU2NvcmVfQTQ4NV9wLW5fZGlmZkN1dG9mZl9cXCwgZGlmZkN1dG9mZilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuIyBbM10gTWF4IG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lXG4jIyBSTkEgb25seVxuZmNDdXRvZmYgPC0gMC41XG5hbHBoYSA8LSAwLjA1XG5tYXhMb2cyRkMgPC0gNFxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWF4X2Fic19kaWZmX3Njb3JlID0gZGlmZl9BNDg1X0RNU09bd2hpY2gubWF4KGFicyhkaWZmX0E0ODVfRE1TTykpXSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfbWF4QWJzU2NvcmVfZmNfZFRBR19wLW4udHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1heF9hYnNfZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcQTQ4NVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcYmxhY2tcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX21heEFic1Njb3JlX0E0ODVfcC1uX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.RNA.G1.A485 <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)

# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1)

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA.G1.A485 %>% dplyr::filter(shrinked_log2FC < -fcCutoff))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA.G1.A485 %>% dplyr::filter(shrinked_log2FC > fcCutoff))$ensembl_gene_id


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_A485_p-n_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# [2] Sum of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(sum_diff_score = sum(diff_A485_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_sumScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = sum_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_sumScore_A485_p-n_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


# [3] Max of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(max_abs_diff_score = diff_A485_DMSO[which.max(abs(diff_A485_DMSO))], .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_maxAbsScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = max_abs_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_maxAbsScore_A485_p-n_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5Qm5aWFIwYVc1bklHeHBjM1FnYjJZZ1oyVnVaWE1nYjJZZ2FXNTBaWEpsYzNRZ1puSnZiU0JTVGtFdGMyVnhJR0Z1WkNCUVVrOHRjMlZ4WEc1aGJIQm9ZU0E4TFNBd0xqQTFYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibVJwWm1ZdVVrNUJMa2N4TGtFME9EVWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1pHbG1abDlITVM1Qk5EZzFMbk5sYkdWamRHVmtNbDlITVM0eWFTNUJORGcxWDNaelgwY3hMakpwTGtSTlUwOHVkSE4yWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh3WVdScUlEd2dZV3h3YUdFc0lHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnWm1ORGRYUnZabVlwWEc1Y2JpTWdTVzF3YjNKMGFXNW5JR3h2YjNBZ1oyVnVaU0JoYm01dmRHRjBhVzl1WEc1dVlXMWxJRHd0SUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVZ4Y1hHNWNibVJwWm1aRGRYUnZabVlnUEMwZ01DNHlYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gzQXRibDlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptUTNWMGIyWm1JRDBnWkdsbVprTjFkRzltWml4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZVzV1YjB4cGMzUWdQU0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndzSUZ4Y1VDMVRYRndzSUZ4Y1VDMVlYRndwS1NVK0pTQmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGthWE4wWVc1alpTQTlJSE4wWVhKME1pQXRJSE4wWVhKME1TbGNibHh1SXlCVVpYTjBhVzVuSUdScFptWmxjbVZ1ZENCM1lYbHpJSFJ2SUdOaGJHTjFiR0YwWlNCeVpYQnlaWE5sYm5SaGRHbDJaU0JtWldGMGRYSmxJRzltSUd4dmIzQnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JtUnBabVl1VWs1QklEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdScFptWmZSekV1UVRRNE5TNXpaV3hsWTNSbFpESmZSekV1TW1rdVFUUTROVjkyYzE5SE1TNHlhUzVFVFZOUExuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9aVzV6WlcxaWJGOW5aVzVsWDJsa0xDQnNiMmN5Um05c1pFTm9ZVzVuWlN3Z2MyaHlhVzVyWldSZmJHOW5Na1pETENCd1lXUnFMQ0JsZUhSbGNtNWhiRjluWlc1bFgyNWhiV1VwWEc1blpXNWxUR2x6ZEM1a2IzZHVMbEpPUVNBOExTQW9aR2xtWmk1U1RrRXVSekV1UVRRNE5TQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXRabU5EZFhSdlptWXBLU1JsYm5ObGJXSnNYMmRsYm1WZmFXUmNibWRsYm1WTWFYTjBMblZ3TGxKT1FTQThMU0FvWkdsbVppNVNUa0V1UnpFdVFUUTROU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQaUJtWTBOMWRHOW1aaWtwSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WEc1Y2JpTWdXekZkSUVGMlpYSmhaMlVnYjJZZ1pHbG1abVZ5Wlc1MGFXRnNJR3h2YjNBZ2MyTnZjbVZ6SUdadmNpQmxZV05vSUdkbGJtVmNiaU1qSUZKT1FTQnZibXg1WEc1bVkwTjFkRzltWmlBOExTQXdMalZjYm1Gc2NHaGhJRHd0SURBdU1EVmNibTFoZUV4dlp6SkdReUE4TFNBMFhHNWNiblJsYlhBZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScFptWmZRVFE0TlY5RVRWTlBMQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0J0WldGdUtHUnBabVpmUVRRNE5WOUVUVk5QS1N3Z0xtZHliM1Z3Y3lBOUlDZGtjbTl3SnlsY2JseHVkR1Z0Y0NBOExTQnNaV1owWDJwdmFXNG9kR1Z0Y0N3Z1pHbG1aaTVTVGtFc0lHSjVJRDBnWXloY1hHZGxibVZjWENBOUlGeGNaVzV6WlcxaWJGOW5aVzVsWDJsa1hGd3BLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pteGhaeUE5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1Wkc5M2JpNVNUa0VzSUZ4Y01rUlBWMDVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVkWEF1VWs1QkxDQmNYREZWVUZ4Y0xDQmNYREJPVDF4Y0tTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0Y0Um14aFp5QTlJQ2hoWW5Nb2MyaHlhVzVyWldSZmJHOW5Na1pES1NBK0lHMWhlRXh2WnpKR1F5a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmh5Ykc5bk1tWmpUV0Y0SUQwZ2NHMWhlQ2h3YldsdUtITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2JXRjRURzluTWtaREtTd2dMVzFoZUV4dlp6SkdReWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbUZ5Y21GdVoyVW9abXhoWnlsY2JseHVabmR5YVhSbEtIUmxiWEFzSUdobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY1hHZGxibVZmWVhablUyTnZjbVZmWm1OZlpGUkJSMTl3TFc0dWRITjJYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1WEc1d0lEd3RJR2RuY0d4dmRDaDBaVzF3TENCaFpYTW9lQ0E5SUhOb2NteHZaekptWTAxaGVDd2dlU0E5SUcxbFlXNWZaR2xtWmw5elkyOXlaU3dnWTI5c2IzSWdQU0JtYkdGbkxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1lXSmxiQ0E5SUdsbVpXeHpaU2htYkdGbklDRTlJRnhjTUU1UFhGd3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU3dnVGtFcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb1lYQmxJRDBnWVhNdVptRmpkRzl5S0cxaGVFWnNZV2NwS1NrZ0sxeHVJQ0JuWlc5dFgzQnZhVzUwS0NrZ0t5Qm5aVzl0WDNSbGVIUmZjbVZ3Wld3b0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNCblozUnBkR3hsS0Z4Y1FUUTROVnhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUMwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBcklGeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUdaalEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTFdaalEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3RjYmlBZ2MyTmhiR1ZmWTI5c2IzSmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YRnd3VGs5Y1hDQTlJRnhjWW14aFkydGNYQ3dnWEZ3eFZWQmNYQ0E5SUZ4Y2NtVmtYRndzSUZ4Y01rUlBWMDVjWENBOUlGeGNZbXgxWlZ4Y0tTa2dLeUFnSXlCRGIzSnlaV04wWldRZ1kyOXNiM0lnYldGd2NHbHVaMXh1SUNCelkyRnNaVjl6YUdGd1pWOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYRlJTVlVWY1hDQTlJRElzSUZ4Y1JrRk1VMFZjWENBOUlERTVLU2xjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNiRzluTWtaRFgzWnpYMkYyWjFOamIzSmxYMEUwT0RWZmNDMXVYMlJwWm1aRGRYUnZabVpmWEZ3c0lHUnBabVpEZFhSdlptWXBYRzVvWldsbmFIUWdQQzBnTkZ4dWQybGtkR2dnUEMwZ04xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRnhjYVc1Y1hDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2twTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVhHNGpJRnN5WFNCVGRXMGdiMllnWkdsbVptVnlaVzUwYVdGc0lHeHZiM0FnYzJOdmNtVnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JpTWpJRkpPUVNCdmJteDVYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibUZzY0doaElEd3RJREF1TURWY2JtMWhlRXh2WnpKR1F5QThMU0EwWEc1Y2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwWm1aZlFUUTROVjlFVFZOUExDQm5aVzVsS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaHpkVzFmWkdsbVpsOXpZMjl5WlNBOUlITjFiU2hrYVdabVgwRTBPRFZmUkUxVFR5a3NJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzVjYm5SbGJYQWdQQzBnYkdWbWRGOXFiMmx1S0hSbGJYQXNJR1JwWm1ZdVVrNUJMQ0JpZVNBOUlHTW9YRnhuWlc1bFhGd2dQU0JjWEdWdWMyVnRZbXhmWjJWdVpWOXBaRnhjS1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1pzWVdjZ1BTQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExtUnZkMjR1VWs1QkxDQmNYREpFVDFkT1hGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVk1hWE4wTG5Wd0xsSk9RU3dnWEZ3eFZWQmNYQ3dnWEZ3d1RrOWNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxaGVFWnNZV2NnUFNBb1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJ0WVhoTWIyY3lSa01wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb2NteHZaekptWTAxaGVDQTlJSEJ0WVhnb2NHMXBiaWh6YUhKcGJtdGxaRjlzYjJjeVJrTXNJRzFoZUV4dlp6SkdReWtzSUMxdFlYaE1iMmN5UmtNcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0dac1lXY3BYRzVjYm1aM2NtbDBaU2gwWlcxd0xDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhuWlc1bFgzTjFiVk5qYjNKbFgyWmpYMlJVUVVkZmNDMXVMblJ6ZGx4Y0tTd2djMlZ3SUQwZ1hGeGNYSFJjWENsY2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQnphSEpzYjJjeVptTk5ZWGdzSUhrZ1BTQnpkVzFmWkdsbVpsOXpZMjl5WlN3Z1kyOXNiM0lnUFNCbWJHRm5MQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOUlHbG1aV3h6WlNobWJHRm5JQ0U5SUZ4Y01FNVBYRndzSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlN3Z1RrRXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9ZWEJsSUQwZ1lYTXVabUZqZEc5eUtHMWhlRVpzWVdjcEtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJuWlc5dFgzUmxlSFJmY21Wd1pXd29LU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQm5aM1JwZEd4bEtGeGNRVFE0TlZ4Y0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY1hHUmhjMmhsWkZ4Y0tTQXJJRnh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlHWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ0xXWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdjMk5oYkdWZlkyOXNiM0pmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWEZ3d1RrOWNYQ0E5SUZ4Y1lteGhZMnRjWEN3Z1hGd3hWVkJjWENBOUlGeGNjbVZrWEZ3c0lGeGNNa1JQVjA1Y1hDQTlJRnhjWW14MVpWeGNLU2tnS3lBZ0l5QkRiM0p5WldOMFpXUWdZMjlzYjNJZ2JXRndjR2x1WjF4dUlDQnpZMkZzWlY5emFHRndaVjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjWEZSU1ZVVmNYQ0E5SURJc0lGeGNSa0ZNVTBWY1hDQTlJREU1S1NsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjYkc5bk1rWkRYM1p6WDNOMWJWTmpiM0psWDBFME9EVmZjQzF1WDJScFptWkRkWFJ2Wm1aZlhGd3NJR1JwWm1aRGRYUnZabVlwWEc1b1pXbG5hSFFnUEMwZ05GeHVkMmxrZEdnZ1BDMGdOMXh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVYRzVjYmlNZ1d6TmRJRTFoZUNCdlppQmthV1ptWlhKbGJuUnBZV3dnYkc5dmNDQnpZMjl5WlhNZ1ptOXlJR1ZoWTJnZ1oyVnVaVnh1SXlNZ1VrNUJJRzl1YkhsY2JtWmpRM1YwYjJabUlEd3RJREF1TlZ4dVlXeHdhR0VnUEMwZ01DNHdOVnh1YldGNFRHOW5Na1pESUR3dElEUmNibHh1ZEdWdGNDQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbG1abDlCTkRnMVgwUk5VMDhzSUdkbGJtVXBJQ1UrSlNCY2JpQWdkVzV1WlhOMEtHZGxibVVwSUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0cxaGVGOWhZbk5mWkdsbVpsOXpZMjl5WlNBOUlHUnBabVpmUVRRNE5WOUVUVk5QVzNkb2FXTm9MbTFoZUNoaFluTW9aR2xtWmw5Qk5EZzFYMFJOVTA4cEtWMHNJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzVjYm5SbGJYQWdQQzBnYkdWbWRGOXFiMmx1S0hSbGJYQXNJR1JwWm1ZdVVrNUJMQ0JpZVNBOUlHTW9YRnhuWlc1bFhGd2dQU0JjWEdWdWMyVnRZbXhmWjJWdVpWOXBaRnhjS1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1pzWVdjZ1BTQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExtUnZkMjR1VWs1QkxDQmNYREpFVDFkT1hGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVk1hWE4wTG5Wd0xsSk9RU3dnWEZ3eFZWQmNYQ3dnWEZ3d1RrOWNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxaGVFWnNZV2NnUFNBb1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJ0WVhoTWIyY3lSa01wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb2NteHZaekptWTAxaGVDQTlJSEJ0WVhnb2NHMXBiaWh6YUhKcGJtdGxaRjlzYjJjeVJrTXNJRzFoZUV4dlp6SkdReWtzSUMxdFlYaE1iMmN5UmtNcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0dac1lXY3BYRzVjYm1aM2NtbDBaU2gwWlcxd0xDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhuWlc1bFgyMWhlRUZpYzFOamIzSmxYMlpqWDJSVVFVZGZjQzF1TG5SemRseGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDbGNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J6YUhKc2IyY3labU5OWVhnc0lIa2dQU0J0WVhoZllXSnpYMlJwWm1aZmMyTnZjbVVzSUdOdmJHOXlJRDBnWm14aFp5d2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHRmlaV3dnUFNCcFptVnNjMlVvWm14aFp5QWhQU0JjWERCT1QxeGNMQ0JsZUhSbGNtNWhiRjluWlc1bFgyNWhiV1VzSUU1QktTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFHRndaU0E5SUdGekxtWmhZM1J2Y2lodFlYaEdiR0ZuS1NrcElDdGNiaUFnWjJWdmJWOXdiMmx1ZENncElDc2daMlZ2YlY5MFpYaDBYM0psY0dWc0tDa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJjYmlBZ1oyZDBhWFJzWlNoY1hFRTBPRFZjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUdScFptWkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYRnhrWVhOb1pXUmNYQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBdElHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0t5QmNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdNQ2tnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNCbVkwTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUMxbVkwTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lITmpZV3hsWDJOdmJHOXlYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjTUU1UFhGd2dQU0JjWEdKc1lXTnJYRndzSUZ4Y01WVlFYRndnUFNCY1hISmxaRnhjTENCY1hESkVUMWRPWEZ3Z1BTQmNYR0pzZFdWY1hDa3BJQ3NnSUNNZ1EyOXljbVZqZEdWa0lHTnZiRzl5SUcxaGNIQnBibWRjYmlBZ2MyTmhiR1ZmYzJoaGNHVmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YRnhVVWxWRlhGd2dQU0F5TENCY1hFWkJURk5GWEZ3Z1BTQXhPU2twWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYR3h2WnpKR1ExOTJjMTl0WVhoQlluTlRZMjl5WlY5Qk5EZzFYM0F0Ymw5a2FXWm1RM1YwYjJabVgxeGNMQ0JrYVdabVEzVjBiMlptS1Z4dWFHVnBaMmgwSUR3dElEUmNibmRwWkhSb0lEd3RJRGRjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibHh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUk5BLkcxLkE0ODUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5cbiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuIyBUZXN0aW5nIGRpZmZlcmVudCB3YXlzIHRvIGNhbGN1bGF0ZSByZXByZXNlbnRhdGl2ZSBmZWF0dXJlIG9mIGxvb3BzIGZvciBlYWNoIGdlbmVcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuQTQ4NSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEuRzEuQTQ4NSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiBmY0N1dG9mZikpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSA0XG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfQTQ4NV9ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLW4udHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcQTQ4NVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcYmxhY2tcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX0E0ODVfcC1uX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4jIFsyXSBTdW0gb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSA0XG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShzdW1fZGlmZl9zY29yZSA9IHN1bShkaWZmX0E0ODVfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX3N1bVNjb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBzdW1fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcQTQ4NVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcYmxhY2tcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX3N1bVNjb3JlX0E0ODVfcC1uX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cbiMgWzNdIE1heCBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDRcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1heF9hYnNfZGlmZl9zY29yZSA9IGRpZmZfQTQ4NV9ETVNPW3doaWNoLm1heChhYnMoZGlmZl9BNDg1X0RNU08pKV0sIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX21heEFic1Njb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtYXhfYWJzX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXEE0ODVcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGJsYWNrXFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19tYXhBYnNTY29yZV9BNDg1X3Atbl9kaWZmQ3V0b2ZmX1xcLCBkaWZmQ3V0b2ZmKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUk5BLkcxLkE0ODUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5cbiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuIyBUZXN0aW5nIGRpZmZlcmVudCB3YXlzIHRvIGNhbGN1bGF0ZSByZXByZXNlbnRhdGl2ZSBmZWF0dXJlIG9mIGxvb3BzIGZvciBlYWNoIGdlbmVcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuQTQ4NSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEuRzEuQTQ4NSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiBmY0N1dG9mZikpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSA0XG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfQTQ4NV9ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLW4udHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcQTQ4NVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcYmxhY2tcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX0E0ODVfcC1uX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4jIFsyXSBTdW0gb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSA0XG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShzdW1fZGlmZl9zY29yZSA9IHN1bShkaWZmX0E0ODVfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX3N1bVNjb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBzdW1fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcQTQ4NVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcYmxhY2tcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX3N1bVNjb3JlX0E0ODVfcC1uX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cbiMgWzNdIE1heCBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDRcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1heF9hYnNfZGlmZl9zY29yZSA9IGRpZmZfQTQ4NV9ETVNPW3doaWNoLm1heChhYnMoZGlmZl9BNDg1X0RNU08pKV0sIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX21heEFic1Njb3JlX2ZjX2RUQUdfcC1uLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtYXhfYWJzX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXEE0ODVcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGJsYWNrXFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19tYXhBYnNTY29yZV9BNDg1X3Atbl9kaWZmQ3V0b2ZmX1xcLCBkaWZmQ3V0b2ZmKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuYGBgXG5gYGAifQ== -->

```r
```r
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.RNA.G1.A485 <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)

# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1)

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA.G1.A485 %>% dplyr::filter(shrinked_log2FC < -fcCutoff))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA.G1.A485 %>% dplyr::filter(shrinked_log2FC > fcCutoff))$ensembl_gene_id


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_A485_p-n_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# [2] Sum of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(sum_diff_score = sum(diff_A485_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_sumScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = sum_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_sumScore_A485_p-n_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


# [3] Max of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(max_abs_diff_score = diff_A485_DMSO[which.max(abs(diff_A485_DMSO))], .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_maxAbsScore_fc_dTAG_p-n.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = max_abs_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_maxAbsScore_A485_p-n_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### Farthest P-N loop

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJuWlhSMGFXNW5JR3hwYzNRZ2IyWWdaMlZ1WlhNZ2IyWWdhVzUwWlhKbGMzUWdabkp2YlNCU1RrRXRjMlZ4SUdGdVpDQlFVazh0YzJWeFhHNWhiSEJvWVNBOExTQXdMakExWEc1bVkwTjFkRzltWmlBOExTQXdMalZjYm1ScFptWXVVazVCTGtjeExrRTBPRFVnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laR2xtWmw5SE1TNUJORGcxTG5ObGJHVmpkR1ZrTWw5SE1TNHlhUzVCTkRnMVgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lod1lXUnFJRHdnWVd4d2FHRXNJR0ZpY3loemFISnBibXRsWkY5c2IyY3lSa01wSUQ0Z1ptTkRkWFJ2Wm1ZcFhHNWNiaU1nU1cxd2IzSjBhVzVuSUd4dmIzQWdaMlZ1WlNCaGJtNXZkR0YwYVc5dVhHNXVZVzFsSUR3dElGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWd2lYRzVjYm1ScFptWkRkWFJ2Wm1ZZ1BDMGdNQzR5WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnYkc5aFpFeHZiM0JCYm01dlJHRjBZU2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYM0F0Ymw5bGJuTmxiV0pzVEdsemRDNTBjM1pjSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVdabVEzVjBiMlptSUQwZ1pHbG1aa04xZEc5bVppeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVc1dWIweHBjM1FnUFNCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJcEtTVStKU0JjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2xjYmx4dUl5QlVaWE4wYVc1bklHUnBabVpsY21WdWRDQjNZWGx6SUhSdklHTmhiR04xYkdGMFpTQnlaWEJ5WlhObGJuUmhkR2wyWlNCbVpXRjBkWEpsSUc5bUlHeHZiM0J6SUdadmNpQmxZV05vSUdkbGJtVmNibVJwWm1ZdVVrNUJJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltUnBabVpmUnpFdVFUUTROUzV6Wld4bFkzUmxaREpmUnpFdU1ta3VRVFE0TlY5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWlc1elpXMWliRjluWlc1bFgybGtMQ0JzYjJjeVJtOXNaRU5vWVc1blpTd2djMmh5YVc1clpXUmZiRzluTWtaRExDQndZV1JxTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVcFhHNW5aVzVsVEdsemRDNWtiM2R1TGxKT1FTQThMU0FvWkdsbVppNVNUa0V1UnpFdVFUUTROU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0F0Wm1ORGRYUnZabVlwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1JjYm1kbGJtVk1hWE4wTG5Wd0xsSk9RU0E4TFNBb1pHbG1aaTVTVGtFdVJ6RXVRVFE0TlNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUGlCbVkwTjFkRzltWmlrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkZ4dVhHNWNiaU1nV3pGZElFRjJaWEpoWjJVZ2IyWWdaR2xtWm1WeVpXNTBhV0ZzSUd4dmIzQWdjMk52Y21WeklHWnZjaUJsWVdOb0lHZGxibVZjYmlNaklGSk9RU0J2Ym14NVhHNW1ZME4xZEc5bVppQThMU0F3TGpWY2JtRnNjR2hoSUR3dElEQXVNRFZjYm0xaGVFeHZaekpHUXlBOExTQTBYRzVjYm5SbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBabVpmUVRRNE5WOUVUVk5QTENCblpXNWxLU0FsUGlVZ1hHNGdJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVWdaM0p2ZFhCZllua29aMlZ1WlNrZ0pUNGxYRzRnSUhOMWJXMWhjbWw2WlNodFpXRnVYMlJwWm1aZmMyTnZjbVVnUFNCdFpXRnVLR1JwWm1aZlFUUTROVjlFVFZOUEtTd2dMbWR5YjNWd2N5QTlJQ2RrY205d0p5bGNibHh1ZEdWdGNDQThMU0JzWldaMFgycHZhVzRvZEdWdGNDd2daR2xtWmk1U1RrRXNJR0o1SUQwZ1l5aGNJbWRsYm1WY0lpQTlJRndpWlc1elpXMWliRjluWlc1bFgybGtYQ0lwS1NBbFBpVWdYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9abXhoWnlBOUlHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaVXhwYzNRdVpHOTNiaTVTVGtFc0lGd2lNa1JQVjA1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1ZFhBdVVrNUJMQ0JjSWpGVlVGd2lMQ0JjSWpCT1Qxd2lLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYldGNFJteGhaeUE5SUNoaFluTW9jMmh5YVc1clpXUmZiRzluTWtaREtTQStJRzFoZUV4dlp6SkdReWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJoeWJHOW5NbVpqVFdGNElEMGdjRzFoZUNod2JXbHVLSE5vY21sdWEyVmtYMnh2WnpKR1F5d2diV0Y0VEc5bk1rWkRLU3dnTFcxaGVFeHZaekpHUXlrcElDVStKU0JjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvWm14aFp5bGNibHh1Wm5keWFYUmxLSFJsYlhBc0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNJbWRsYm1WZllYWm5VMk52Y21WZlptTmZaRlJCUjE5d0xYQmxMblJ6ZGx3aUtTd2djMlZ3SUQwZ1hDSmNYSFJjSWlsY2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQnphSEpzYjJjeVptTk5ZWGdzSUhrZ1BTQnRaV0Z1WDJScFptWmZjMk52Y21Vc0lHTnZiRzl5SUQwZ1pteGhaeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BTQnBabVZzYzJVb1pteGhaeUFoUFNCY0lqQk9UMXdpTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVc0lFNUJLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphR0Z3WlNBOUlHRnpMbVpoWTNSdmNpaHRZWGhHYkdGbktTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWjJWdmJWOTBaWGgwWDNKbGNHVnNLQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCY2JpQWdaMmQwYVhSc1pTaGNJa0UwT0RWY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWENKa1lYTm9aV1JjSWlrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXRJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLeUJjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQm1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlDMW1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aU1FNVBYQ0lnUFNCY0ltSnNZV05yWENJc0lGd2lNVlZRWENJZ1BTQmNJbkpsWkZ3aUxDQmNJakpFVDFkT1hDSWdQU0JjSW1Kc2RXVmNJaWtwSUNzZ0lDTWdRMjl5Y21WamRHVmtJR052Ykc5eUlHMWhjSEJwYm1kY2JpQWdjMk5oYkdWZmMyaGhjR1ZmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENKVVVsVkZYQ0lnUFNBeUxDQmNJa1pCVEZORlhDSWdQU0F4T1NrcFhHNWNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW14dlp6SkdRMTkyYzE5aGRtZFRZMjl5WlY5Qk5EZzFYM0F0Y0dWZlpHbG1aa04xZEc5bVpsOWNJaXdnWkdsbVprTjFkRzltWmlsY2JtaGxhV2RvZENBOExTQTBYRzUzYVdSMGFDQThMU0EzWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVjYmlNZ1d6SmRJRk4xYlNCdlppQmthV1ptWlhKbGJuUnBZV3dnYkc5dmNDQnpZMjl5WlhNZ1ptOXlJR1ZoWTJnZ1oyVnVaVnh1SXlNZ1VrNUJJRzl1YkhsY2JtWmpRM1YwYjJabUlEd3RJREF1TlZ4dVlXeHdhR0VnUEMwZ01DNHdOVnh1YldGNFRHOW5Na1pESUR3dElEUmNibHh1ZEdWdGNDQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbG1abDlCTkRnMVgwUk5VMDhzSUdkbGJtVXBJQ1UrSlNCY2JpQWdkVzV1WlhOMEtHZGxibVVwSUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0hOMWJWOWthV1ptWDNOamIzSmxJRDBnYzNWdEtHUnBabVpmUVRRNE5WOUVUVk5QS1N3Z0xtZHliM1Z3Y3lBOUlDZGtjbTl3SnlsY2JseHVkR1Z0Y0NBOExTQnNaV1owWDJwdmFXNG9kR1Z0Y0N3Z1pHbG1aaTVTVGtFc0lHSjVJRDBnWXloY0ltZGxibVZjSWlBOUlGd2laVzV6WlcxaWJGOW5aVzVsWDJsa1hDSXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pteGhaeUE5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1Wkc5M2JpNVNUa0VzSUZ3aU1rUlBWMDVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVkWEF1VWs1QkxDQmNJakZWVUZ3aUxDQmNJakJPVDF3aUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0Y0Um14aFp5QTlJQ2hoWW5Nb2MyaHlhVzVyWldSZmJHOW5Na1pES1NBK0lHMWhlRXh2WnpKR1F5a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmh5Ykc5bk1tWmpUV0Y0SUQwZ2NHMWhlQ2h3YldsdUtITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2JXRjRURzluTWtaREtTd2dMVzFoZUV4dlp6SkdReWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbUZ5Y21GdVoyVW9abXhoWnlsY2JseHVabmR5YVhSbEtIUmxiWEFzSUdobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0ltZGxibVZmYzNWdFUyTnZjbVZmWm1OZlpGUkJSMTl3TFhCbExuUnpkbHdpS1N3Z2MyVndJRDBnWENKY1hIUmNJaWxjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCemFISnNiMmN5Wm1OTllYZ3NJSGtnUFNCemRXMWZaR2xtWmw5elkyOXlaU3dnWTI5c2IzSWdQU0JtYkdGbkxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1lXSmxiQ0E5SUdsbVpXeHpaU2htYkdGbklDRTlJRndpTUU1UFhDSXNJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU3dnVGtFcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb1lYQmxJRDBnWVhNdVptRmpkRzl5S0cxaGVFWnNZV2NwS1NrZ0sxeHVJQ0JuWlc5dFgzQnZhVzUwS0NrZ0t5Qm5aVzl0WDNSbGVIUmZjbVZ3Wld3b0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNCblozUnBkR3hsS0Z3aVFUUTROVndpS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJoYzJobFpGd2lLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUMwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBcklGeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUdaalEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTFdaalEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlBZ2MyTmhiR1ZmWTI5c2IzSmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YQ0l3VGs5Y0lpQTlJRndpWW14aFkydGNJaXdnWENJeFZWQmNJaUE5SUZ3aWNtVmtYQ0lzSUZ3aU1rUlBWMDVjSWlBOUlGd2lZbXgxWlZ3aUtTa2dLeUFnSXlCRGIzSnlaV04wWldRZ1kyOXNiM0lnYldGd2NHbHVaMXh1SUNCelkyRnNaVjl6YUdGd1pWOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNJbFJTVlVWY0lpQTlJRElzSUZ3aVJrRk1VMFZjSWlBOUlERTVLU2xjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2liRzluTWtaRFgzWnpYM04xYlZOamIzSmxYMEUwT0RWZmNDMXdaVjlrYVdabVEzVjBiMlptWDF3aUxDQmthV1ptUTNWMGIyWm1LVnh1YUdWcFoyaDBJRHd0SURSY2JuZHBaSFJvSUR3dElEZGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JseHVYRzRqSUZzelhTQk5ZWGdnYjJZZ1pHbG1abVZ5Wlc1MGFXRnNJR3h2YjNBZ2MyTnZjbVZ6SUdadmNpQmxZV05vSUdkbGJtVmNiaU1qSUZKT1FTQnZibXg1WEc1bVkwTjFkRzltWmlBOExTQXdMalZjYm1Gc2NHaGhJRHd0SURBdU1EVmNibTFoZUV4dlp6SkdReUE4TFNBMFhHNWNiblJsYlhBZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScFptWmZRVFE0TlY5RVRWTlBMQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h0WVhoZllXSnpYMlJwWm1aZmMyTnZjbVVnUFNCa2FXWm1YMEUwT0RWZlJFMVRUMXQzYUdsamFDNXRZWGdvWVdKektHUnBabVpmUVRRNE5WOUVUVk5QS1NsZExDQXVaM0p2ZFhCeklEMGdKMlJ5YjNBbktWeHVYRzUwWlcxd0lEd3RJR3hsWm5SZmFtOXBiaWgwWlcxd0xDQmthV1ptTGxKT1FTd2dZbmtnUFNCaktGd2laMlZ1WlZ3aUlEMGdYQ0psYm5ObGJXSnNYMmRsYm1WZmFXUmNJaWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG1iR0ZuSUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCblpXNWxUR2x6ZEM1a2IzZHVMbEpPUVN3Z1hDSXlSRTlYVGx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bFRHbHpkQzUxY0M1U1RrRXNJRndpTVZWUVhDSXNJRndpTUU1UFhDSXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhoR2JHRm5JRDBnS0dGaWN5aHphSEpwYm10bFpGOXNiMmN5UmtNcElENGdiV0Y0VEc5bk1rWkRLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUhKc2IyY3labU5OWVhnZ1BTQndiV0Y0S0hCdGFXNG9jMmh5YVc1clpXUmZiRzluTWtaRExDQnRZWGhNYjJjeVJrTXBMQ0F0YldGNFRHOW5Na1pES1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2htYkdGbktWeHVYRzVtZDNKcGRHVW9kR1Z0Y0N3Z2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2laMlZ1WlY5dFlYaEJZbk5UWTI5eVpWOW1ZMTlrVkVGSFgzQXRjR1V1ZEhOMlhDSXBMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUtWeHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJSE5vY214dlp6Sm1ZMDFoZUN3Z2VTQTlJRzFoZUY5aFluTmZaR2xtWmw5elkyOXlaU3dnWTI5c2IzSWdQU0JtYkdGbkxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1lXSmxiQ0E5SUdsbVpXeHpaU2htYkdGbklDRTlJRndpTUU1UFhDSXNJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU3dnVGtFcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb1lYQmxJRDBnWVhNdVptRmpkRzl5S0cxaGVFWnNZV2NwS1NrZ0sxeHVJQ0JuWlc5dFgzQnZhVzUwS0NrZ0t5Qm5aVzl0WDNSbGVIUmZjbVZ3Wld3b0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNCblozUnBkR3hsS0Z3aVFUUTROVndpS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJoYzJobFpGd2lLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUMwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBcklGeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUdaalEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTFdaalEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3RjYmlBZ2MyTmhiR1ZmWTI5c2IzSmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YQ0l3VGs5Y0lpQTlJRndpWW14aFkydGNJaXdnWENJeFZWQmNJaUE5SUZ3aWNtVmtYQ0lzSUZ3aU1rUlBWMDVjSWlBOUlGd2lZbXgxWlZ3aUtTa2dLeUFnSXlCRGIzSnlaV04wWldRZ1kyOXNiM0lnYldGd2NHbHVaMXh1SUNCelkyRnNaVjl6YUdGd1pWOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNJbFJTVlVWY0lpQTlJRElzSUZ3aVJrRk1VMFZjSWlBOUlERTVLU2xjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2liRzluTWtaRFgzWnpYMjFoZUVGaWMxTmpiM0psWDBFME9EVmZjQzF3WlY5a2FXWm1RM1YwYjJabVgxd2lMQ0JrYVdabVEzVjBiMlptS1Z4dWFHVnBaMmgwSUR3dElEUmNibmRwWkhSb0lEd3RJRGRjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibUJnWUNKOSAtLT5cblxuYGBgclxuIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUk5BLkcxLkE0ODUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5cbiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuIyBUZXN0aW5nIGRpZmZlcmVudCB3YXlzIHRvIGNhbGN1bGF0ZSByZXByZXNlbnRhdGl2ZSBmZWF0dXJlIG9mIGxvb3BzIGZvciBlYWNoIGdlbmVcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuQTQ4NSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEuRzEuQTQ4NSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiBmY0N1dG9mZikpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSA0XG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfQTQ4NV9ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLXBlLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXEE0ODVcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGJsYWNrXFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19hdmdTY29yZV9BNDg1X3AtcGVfZGlmZkN1dG9mZl9cXCwgZGlmZkN1dG9mZilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbiMgWzJdIFN1bSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDRcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKHN1bV9kaWZmX3Njb3JlID0gc3VtKGRpZmZfQTQ4NV9ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfc3VtU2NvcmVfZmNfZFRBR19wLXBlLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBzdW1fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcQTQ4NVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcYmxhY2tcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX3N1bVNjb3JlX0E0ODVfcC1wZV9kaWZmQ3V0b2ZmX1xcLCBkaWZmQ3V0b2ZmKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG4jIFszXSBNYXggb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSA0XG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtYXhfYWJzX2RpZmZfc2NvcmUgPSBkaWZmX0E0ODVfRE1TT1t3aGljaC5tYXgoYWJzKGRpZmZfQTQ4NV9ETVNPKSldLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5md3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIFxcZ2VuZV9tYXhBYnNTY29yZV9mY19kVEFHX3AtcGUudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1heF9hYnNfZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcQTQ4NVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcYmxhY2tcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX21heEFic1Njb3JlX0E0ODVfcC1wZV9kaWZmQ3V0b2ZmX1xcLCBkaWZmQ3V0b2ZmKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.RNA.G1.A485 <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)

# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\))%>% 
  dplyr::mutate(distance = start2 - start1)

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA.G1.A485 %>% dplyr::filter(shrinked_log2FC < -fcCutoff))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA.G1.A485 %>% dplyr::filter(shrinked_log2FC > fcCutoff))$ensembl_gene_id


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-pe.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_A485_p-pe_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# [2] Sum of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(sum_diff_score = sum(diff_A485_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_sumScore_fc_dTAG_p-pe.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = sum_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_sumScore_A485_p-pe_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


# [3] Max of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(max_abs_diff_score = diff_A485_DMSO[which.max(abs(diff_A485_DMSO))], .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_maxAbsScore_fc_dTAG_p-pe.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = max_abs_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_maxAbsScore_A485_p-pe_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5Qm5aWFIwYVc1bklHeHBjM1FnYjJZZ1oyVnVaWE1nYjJZZ2FXNTBaWEpsYzNRZ1puSnZiU0JTVGtFdGMyVnhJR0Z1WkNCUVVrOHRjMlZ4WEc1aGJIQm9ZU0E4TFNBd0xqQTFYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibVJwWm1ZdVVrNUJMa2N4TGtFME9EVWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1pHbG1abDlITVM1Qk5EZzFMbk5sYkdWamRHVmtNbDlITVM0eWFTNUJORGcxWDNaelgwY3hMakpwTGtSTlUwOHVkSE4yWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh3WVdScUlEd2dZV3h3YUdFc0lHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnWm1ORGRYUnZabVlwWEc1Y2JpTWdTVzF3YjNKMGFXNW5JR3h2YjNBZ1oyVnVaU0JoYm01dmRHRjBhVzl1WEc1dVlXMWxJRHd0SUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVZ4Y1hHNWNibVJwWm1aRGRYUnZabVlnUEMwZ01DNHlYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gzQXRibDlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptUTNWMGIyWm1JRDBnWkdsbVprTjFkRzltWml4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZVzV1YjB4cGMzUWdQU0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndwS1NVK0pTQmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGthWE4wWVc1alpTQTlJSE4wWVhKME1pQXRJSE4wWVhKME1TbGNibHh1SXlCVVpYTjBhVzVuSUdScFptWmxjbVZ1ZENCM1lYbHpJSFJ2SUdOaGJHTjFiR0YwWlNCeVpYQnlaWE5sYm5SaGRHbDJaU0JtWldGMGRYSmxJRzltSUd4dmIzQnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JtUnBabVl1VWs1QklEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdScFptWmZSekV1UVRRNE5TNXpaV3hsWTNSbFpESmZSekV1TW1rdVFUUTROVjkyYzE5SE1TNHlhUzVFVFZOUExuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9aVzV6WlcxaWJGOW5aVzVsWDJsa0xDQnNiMmN5Um05c1pFTm9ZVzVuWlN3Z2MyaHlhVzVyWldSZmJHOW5Na1pETENCd1lXUnFMQ0JsZUhSbGNtNWhiRjluWlc1bFgyNWhiV1VwWEc1blpXNWxUR2x6ZEM1a2IzZHVMbEpPUVNBOExTQW9aR2xtWmk1U1RrRXVSekV1UVRRNE5TQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXRabU5EZFhSdlptWXBLU1JsYm5ObGJXSnNYMmRsYm1WZmFXUmNibWRsYm1WTWFYTjBMblZ3TGxKT1FTQThMU0FvWkdsbVppNVNUa0V1UnpFdVFUUTROU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQaUJtWTBOMWRHOW1aaWtwSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WEc1Y2JpTWdXekZkSUVGMlpYSmhaMlVnYjJZZ1pHbG1abVZ5Wlc1MGFXRnNJR3h2YjNBZ2MyTnZjbVZ6SUdadmNpQmxZV05vSUdkbGJtVmNiaU1qSUZKT1FTQnZibXg1WEc1bVkwTjFkRzltWmlBOExTQXdMalZjYm1Gc2NHaGhJRHd0SURBdU1EVmNibTFoZUV4dlp6SkdReUE4TFNBMFhHNWNiblJsYlhBZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScFptWmZRVFE0TlY5RVRWTlBMQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0J0WldGdUtHUnBabVpmUVRRNE5WOUVUVk5QS1N3Z0xtZHliM1Z3Y3lBOUlDZGtjbTl3SnlsY2JseHVkR1Z0Y0NBOExTQnNaV1owWDJwdmFXNG9kR1Z0Y0N3Z1pHbG1aaTVTVGtFc0lHSjVJRDBnWXloY1hHZGxibVZjWENBOUlGeGNaVzV6WlcxaWJGOW5aVzVsWDJsa1hGd3BLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pteGhaeUE5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1Wkc5M2JpNVNUa0VzSUZ4Y01rUlBWMDVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVkWEF1VWs1QkxDQmNYREZWVUZ4Y0xDQmNYREJPVDF4Y0tTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0Y0Um14aFp5QTlJQ2hoWW5Nb2MyaHlhVzVyWldSZmJHOW5Na1pES1NBK0lHMWhlRXh2WnpKR1F5a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmh5Ykc5bk1tWmpUV0Y0SUQwZ2NHMWhlQ2h3YldsdUtITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2JXRjRURzluTWtaREtTd2dMVzFoZUV4dlp6SkdReWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbUZ5Y21GdVoyVW9abXhoWnlsY2JseHVabmR5YVhSbEtIUmxiWEFzSUdobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY1hHZGxibVZmWVhablUyTnZjbVZmWm1OZlpGUkJSMTl3TFhCbExuUnpkbHhjS1N3Z2MyVndJRDBnWEZ4Y1hIUmNYQ2xjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCemFISnNiMmN5Wm1OTllYZ3NJSGtnUFNCdFpXRnVYMlJwWm1aZmMyTnZjbVVzSUdOdmJHOXlJRDBnWm14aFp5d2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHRmlaV3dnUFNCcFptVnNjMlVvWm14aFp5QWhQU0JjWERCT1QxeGNMQ0JsZUhSbGNtNWhiRjluWlc1bFgyNWhiV1VzSUU1QktTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFHRndaU0E5SUdGekxtWmhZM1J2Y2lodFlYaEdiR0ZuS1NrcElDdGNiaUFnWjJWdmJWOXdiMmx1ZENncElDc2daMlZ2YlY5MFpYaDBYM0psY0dWc0tDa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJjYmlBZ1oyZDBhWFJzWlNoY1hFRTBPRFZjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUdScFptWkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYRnhrWVhOb1pXUmNYQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBdElHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0t5QmNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdNQ2tnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNCbVkwTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUMxbVkwTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lITmpZV3hsWDJOdmJHOXlYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjTUU1UFhGd2dQU0JjWEdKc1lXTnJYRndzSUZ4Y01WVlFYRndnUFNCY1hISmxaRnhjTENCY1hESkVUMWRPWEZ3Z1BTQmNYR0pzZFdWY1hDa3BJQ3NnSUNNZ1EyOXljbVZqZEdWa0lHTnZiRzl5SUcxaGNIQnBibWRjYmlBZ2MyTmhiR1ZmYzJoaGNHVmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YRnhVVWxWRlhGd2dQU0F5TENCY1hFWkJURk5GWEZ3Z1BTQXhPU2twWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYR3h2WnpKR1ExOTJjMTloZG1kVFkyOXlaVjlCTkRnMVgzQXRjR1ZmWkdsbVprTjFkRzltWmw5Y1hDd2daR2xtWmtOMWRHOW1aaWxjYm1obGFXZG9kQ0E4TFNBMFhHNTNhV1IwYUNBOExTQTNYRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWNiaU1nV3pKZElGTjFiU0J2WmlCa2FXWm1aWEpsYm5ScFlXd2diRzl2Y0NCelkyOXlaWE1nWm05eUlHVmhZMmdnWjJWdVpWeHVJeU1nVWs1QklHOXViSGxjYm1aalEzVjBiMlptSUR3dElEQXVOVnh1WVd4d2FHRWdQQzBnTUM0d05WeHViV0Y0VEc5bk1rWkRJRHd0SURSY2JseHVkR1Z0Y0NBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsbVpsOUJORGcxWDBSTlUwOHNJR2RsYm1VcElDVStKU0JjYmlBZ2RXNXVaWE4wS0dkbGJtVXBJQ1UrSlNCbmNtOTFjRjlpZVNoblpXNWxLU0FsUGlWY2JpQWdjM1Z0YldGeWFYcGxLSE4xYlY5a2FXWm1YM05qYjNKbElEMGdjM1Z0S0dScFptWmZRVFE0TlY5RVRWTlBLU3dnTG1keWIzVndjeUE5SUNka2NtOXdKeWxjYmx4dWRHVnRjQ0E4TFNCc1pXWjBYMnB2YVc0b2RHVnRjQ3dnWkdsbVppNVNUa0VzSUdKNUlEMGdZeWhjWEdkbGJtVmNYQ0E5SUZ4Y1pXNXpaVzFpYkY5blpXNWxYMmxrWEZ3cEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWm14aFp5QTlJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVaRzkzYmk1U1RrRXNJRnhjTWtSUFYwNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaVXhwYzNRdWRYQXVVazVCTENCY1hERlZVRnhjTENCY1hEQk9UMXhjS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXRjRSbXhoWnlBOUlDaGhZbk1vYzJoeWFXNXJaV1JmYkc5bk1rWkRLU0ErSUcxaGVFeHZaekpHUXlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyaHliRzluTW1aalRXRjRJRDBnY0cxaGVDaHdiV2x1S0hOb2NtbHVhMlZrWDJ4dlp6SkdReXdnYldGNFRHOW5Na1pES1N3Z0xXMWhlRXh2WnpKR1F5a3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pteGhaeWxjYmx4dVpuZHlhWFJsS0hSbGJYQXNJR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEdkbGJtVmZjM1Z0VTJOdmNtVmZabU5mWkZSQlIxOXdMWEJsTG5SemRseGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDbGNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J6YUhKc2IyY3labU5OWVhnc0lIa2dQU0J6ZFcxZlpHbG1abDl6WTI5eVpTd2dZMjlzYjNJZ1BTQm1iR0ZuTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWVdKbGJDQTlJR2xtWld4elpTaG1iR0ZuSUNFOUlGeGNNRTVQWEZ3c0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTd2dUa0VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vWVhCbElEMGdZWE11Wm1GamRHOXlLRzFoZUVac1lXY3BLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCblpXOXRYM1JsZUhSZmNtVndaV3dvS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0JuWjNScGRHeGxLRnhjUVRRNE5WeGNLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY1hHUmhjMmhsWkZ4Y0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJQzBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FySUZ4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJR1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdMV1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaUFnYzJOaGJHVmZZMjlzYjNKZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hGd3dUazljWENBOUlGeGNZbXhoWTJ0Y1hDd2dYRnd4VlZCY1hDQTlJRnhjY21Wa1hGd3NJRnhjTWtSUFYwNWNYQ0E5SUZ4Y1lteDFaVnhjS1NrZ0t5QWdJeUJEYjNKeVpXTjBaV1FnWTI5c2IzSWdiV0Z3Y0dsdVoxeHVJQ0J6WTJGc1pWOXphR0Z3WlY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY1hGUlNWVVZjWENBOUlESXNJRnhjUmtGTVUwVmNYQ0E5SURFNUtTbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y2JHOW5Na1pEWDNaelgzTjFiVk5qYjNKbFgwRTBPRFZmY0Mxd1pWOWthV1ptUTNWMGIyWm1YMXhjTENCa2FXWm1RM1YwYjJabUtWeHVhR1ZwWjJoMElEd3RJRFJjYm5kcFpIUm9JRHd0SURkY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dVhHNGpJRnN6WFNCTllYZ2diMllnWkdsbVptVnlaVzUwYVdGc0lHeHZiM0FnYzJOdmNtVnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JpTWpJRkpPUVNCdmJteDVYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibUZzY0doaElEd3RJREF1TURWY2JtMWhlRXh2WnpKR1F5QThMU0EwWEc1Y2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwWm1aZlFUUTROVjlFVFZOUExDQm5aVzVsS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaHRZWGhmWVdKelgyUnBabVpmYzJOdmNtVWdQU0JrYVdabVgwRTBPRFZmUkUxVFQxdDNhR2xqYUM1dFlYZ29ZV0p6S0dScFptWmZRVFE0TlY5RVRWTlBLU2xkTENBdVozSnZkWEJ6SUQwZ0oyUnliM0FuS1Z4dVhHNTBaVzF3SUR3dElHeGxablJmYW05cGJpaDBaVzF3TENCa2FXWm1MbEpPUVN3Z1lua2dQU0JqS0Z4Y1oyVnVaVnhjSUQwZ1hGeGxibk5sYldKc1gyZGxibVZmYVdSY1hDa3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobWJHRm5JRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bFRHbHpkQzVrYjNkdUxsSk9RU3dnWEZ3eVJFOVhUbHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsVEdsemRDNTFjQzVTVGtFc0lGeGNNVlZRWEZ3c0lGeGNNRTVQWEZ3cEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRZWGhHYkdGbklEMGdLR0ZpY3loemFISnBibXRsWkY5c2IyY3lSa01wSUQ0Z2JXRjRURzluTWtaREtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphSEpzYjJjeVptTk5ZWGdnUFNCd2JXRjRLSEJ0YVc0b2MyaHlhVzVyWldSZmJHOW5Na1pETENCdFlYaE1iMmN5UmtNcExDQXRiV0Y0VEc5bk1rWkRLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZZWEp5WVc1blpTaG1iR0ZuS1Z4dVhHNW1kM0pwZEdVb2RHVnRjQ3dnYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1oyVnVaVjl0WVhoQlluTlRZMjl5WlY5bVkxOWtWRUZIWDNBdGNHVXVkSE4yWEZ3cExDQnpaWEFnUFNCY1hGeGNkRnhjS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlITm9jbXh2WnpKbVkwMWhlQ3dnZVNBOUlHMWhlRjloWW5OZlpHbG1abDl6WTI5eVpTd2dZMjlzYjNJZ1BTQm1iR0ZuTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWVdKbGJDQTlJR2xtWld4elpTaG1iR0ZuSUNFOUlGeGNNRTVQWEZ3c0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTd2dUa0VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vWVhCbElEMGdZWE11Wm1GamRHOXlLRzFoZUVac1lXY3BLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCblpXOXRYM1JsZUhSZmNtVndaV3dvS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0JuWjNScGRHeGxLRnhjUVRRNE5WeGNLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY1hHUmhjMmhsWkZ4Y0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJQzBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FySUZ4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJR1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdMV1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDdGNiaUFnYzJOaGJHVmZZMjlzYjNKZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hGd3dUazljWENBOUlGeGNZbXhoWTJ0Y1hDd2dYRnd4VlZCY1hDQTlJRnhjY21Wa1hGd3NJRnhjTWtSUFYwNWNYQ0E5SUZ4Y1lteDFaVnhjS1NrZ0t5QWdJeUJEYjNKeVpXTjBaV1FnWTI5c2IzSWdiV0Z3Y0dsdVoxeHVJQ0J6WTJGc1pWOXphR0Z3WlY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY1hGUlNWVVZjWENBOUlESXNJRnhjUmtGTVUwVmNYQ0E5SURFNUtTbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y2JHOW5Na1pEWDNaelgyMWhlRUZpYzFOamIzSmxYMEUwT0RWZmNDMXdaVjlrYVdabVEzVjBiMlptWDF4Y0xDQmthV1ptUTNWMGIyWm1LVnh1YUdWcFoyaDBJRHd0SURSY2JuZHBaSFJvSUR3dElEZGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbiMgZ2V0dGluZyBsaXN0IG9mIGdlbmVzIG9mIGludGVyZXN0IGZyb20gUk5BLXNlcSBhbmQgUFJPLXNlcVxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmLlJOQS5HMS5BNDg1IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuXG4jIEltcG9ydGluZyBsb29wIGdlbmUgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcKSklPiUgXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpXG5cbiMgVGVzdGluZyBkaWZmZXJlbnQgd2F5cyB0byBjYWxjdWxhdGUgcmVwcmVzZW50YXRpdmUgZmVhdHVyZSBvZiBsb29wcyBmb3IgZWFjaCBnZW5lXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BLkcxLkE0ODUgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BLkcxLkE0ODUgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gZmNDdXRvZmYpKSRlbnNlbWJsX2dlbmVfaWRcblxuXG4jIFsxXSBBdmVyYWdlIG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lXG4jIyBSTkEgb25seVxuZmNDdXRvZmYgPC0gMC41XG5hbHBoYSA8LSAwLjA1XG5tYXhMb2cyRkMgPC0gNFxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX0E0ODVfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1wZS50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxBNDg1XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxibGFja1xcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfQTQ4NV9wLXBlX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4jIFsyXSBTdW0gb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSA0XG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShzdW1fZGlmZl9zY29yZSA9IHN1bShkaWZmX0E0ODVfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX3N1bVNjb3JlX2ZjX2RUQUdfcC1wZS50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gc3VtX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXEE0ODVcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGJsYWNrXFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19zdW1TY29yZV9BNDg1X3AtcGVfZGlmZkN1dG9mZl9cXCwgZGlmZkN1dG9mZilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuIyBbM10gTWF4IG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lXG4jIyBSTkEgb25seVxuZmNDdXRvZmYgPC0gMC41XG5hbHBoYSA8LSAwLjA1XG5tYXhMb2cyRkMgPC0gNFxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWF4X2Fic19kaWZmX3Njb3JlID0gZGlmZl9BNDg1X0RNU09bd2hpY2gubWF4KGFicyhkaWZmX0E0ODVfRE1TTykpXSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfbWF4QWJzU2NvcmVfZmNfZFRBR19wLXBlLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtYXhfYWJzX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXEE0ODVcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGJsYWNrXFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19tYXhBYnNTY29yZV9BNDg1X3AtcGVfZGlmZkN1dG9mZl9cXCwgZGlmZkN1dG9mZilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUk5BLkcxLkE0ODUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5cbiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuIyBUZXN0aW5nIGRpZmZlcmVudCB3YXlzIHRvIGNhbGN1bGF0ZSByZXByZXNlbnRhdGl2ZSBmZWF0dXJlIG9mIGxvb3BzIGZvciBlYWNoIGdlbmVcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuQTQ4NSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEuRzEuQTQ4NSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiBmY0N1dG9mZikpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSA0XG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfQTQ4NV9ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLXBlLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXEE0ODVcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGJsYWNrXFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19hdmdTY29yZV9BNDg1X3AtcGVfZGlmZkN1dG9mZl9cXCwgZGlmZkN1dG9mZilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbiMgWzJdIFN1bSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDRcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKHN1bV9kaWZmX3Njb3JlID0gc3VtKGRpZmZfQTQ4NV9ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfc3VtU2NvcmVfZmNfZFRBR19wLXBlLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBzdW1fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcQTQ4NVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcYmxhY2tcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX3N1bVNjb3JlX0E0ODVfcC1wZV9kaWZmQ3V0b2ZmX1xcLCBkaWZmQ3V0b2ZmKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG4jIFszXSBNYXggb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSA0XG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtYXhfYWJzX2RpZmZfc2NvcmUgPSBkaWZmX0E0ODVfRE1TT1t3aGljaC5tYXgoYWJzKGRpZmZfQTQ4NV9ETVNPKSldLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5md3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIFxcZ2VuZV9tYXhBYnNTY29yZV9mY19kVEFHX3AtcGUudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1heF9hYnNfZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcQTQ4NVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcYmxhY2tcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX21heEFic1Njb3JlX0E0ODVfcC1wZV9kaWZmQ3V0b2ZmX1xcLCBkaWZmQ3V0b2ZmKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.RNA.G1.A485 <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)

# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\))%>% 
  dplyr::mutate(distance = start2 - start1)

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA.G1.A485 %>% dplyr::filter(shrinked_log2FC < -fcCutoff))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA.G1.A485 %>% dplyr::filter(shrinked_log2FC > fcCutoff))$ensembl_gene_id


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-pe.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_A485_p-pe_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# [2] Sum of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(sum_diff_score = sum(diff_A485_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_sumScore_fc_dTAG_p-pe.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = sum_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_sumScore_A485_p-pe_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


# [3] Max of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(max_abs_diff_score = diff_A485_DMSO[which.max(abs(diff_A485_DMSO))], .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_maxAbsScore_fc_dTAG_p-pe.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = max_abs_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_maxAbsScore_A485_p-pe_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### A485 Scatterplot
##### P-N

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJuWlhSMGFXNW5JR3hwYzNRZ2IyWWdaMlZ1WlhNZ2IyWWdhVzUwWlhKbGMzUWdabkp2YlNCU1RrRXRjMlZ4SUdGdVpDQlFVazh0YzJWeFhHNWhiSEJvWVNBOExTQXdMakExWEc1bVkwTjFkRzltWmlBOExTQXdMalZjYm1ScFptWXVVazVCTGtjeExrRTBPRFVnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laR2xtWmw5SE1TNUJORGcxTG5ObGJHVmpkR1ZrTWw5SE1TNHlhUzVCTkRnMVgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lod1lXUnFJRHdnWVd4d2FHRXNJR0ZpY3loemFISnBibXRsWkY5c2IyY3lSa01wSUQ0Z1ptTkRkWFJ2Wm1ZcFhHNWNiaU1nU1cxd2IzSjBhVzVuSUd4dmIzQWdaMlZ1WlNCaGJtNXZkR0YwYVc5dVhHNXVZVzFsSUR3dElGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWd2lYRzVjYm1ScFptWkRkWFJ2Wm1ZZ1BDMGdNQzR5WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnYkc5aFpFeHZiM0JCYm01dlJHRjBZU2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYM0F0Ymw5bGJuTmxiV0pzVEdsemRDNTBjM1pjSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVdabVEzVjBiMlptSUQwZ1pHbG1aa04xZEc5bVppeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVc1dWIweHBjM1FnUFNCaktGd2lVQzFUWENJcEtTVStKU0JjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2xjYmx4dUl5QlVaWE4wYVc1bklHUnBabVpsY21WdWRDQjNZWGx6SUhSdklHTmhiR04xYkdGMFpTQnlaWEJ5WlhObGJuUmhkR2wyWlNCbVpXRjBkWEpsSUc5bUlHeHZiM0J6SUdadmNpQmxZV05vSUdkbGJtVmNibVJwWm1ZdVVrNUJJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltUnBabVpmUnpFdVFUUTROUzV6Wld4bFkzUmxaREpmUnpFdU1ta3VRVFE0TlY5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWlc1elpXMWliRjluWlc1bFgybGtMQ0JzYjJjeVJtOXNaRU5vWVc1blpTd2djMmh5YVc1clpXUmZiRzluTWtaRExDQndZV1JxTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVcFhHNW5aVzVsVEdsemRDNWtiM2R1TGxKT1FTQThMU0FvWkdsbVppNVNUa0V1UnpFdVFUUTROU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0F0Wm1ORGRYUnZabVlwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1JjYm1kbGJtVk1hWE4wTG5Wd0xsSk9RU0E4TFNBb1pHbG1aaTVTVGtFdVJ6RXVRVFE0TlNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loemFISnBibXRsWkY5c2IyY3lSa01nUGlCbVkwTjFkRzltWmlrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkZ4dVhHNWNiaU1nV3pGZElFRjJaWEpoWjJVZ2IyWWdaR2xtWm1WeVpXNTBhV0ZzSUd4dmIzQWdjMk52Y21WeklHWnZjaUJsWVdOb0lHZGxibVZjYmlNaklGSk9RU0J2Ym14NVhHNW1ZME4xZEc5bVppQThMU0F3TGpWY2JtRnNjR2hoSUR3dElEQXVNRFZjYm0xaGVFeHZaekpHUXlBOExTQTBYRzVjYm5SbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBabVpmUVRRNE5WOUVUVk5QTENCblpXNWxLU0FsUGlVZ1hHNGdJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVWdaM0p2ZFhCZllua29aMlZ1WlNrZ0pUNGxYRzRnSUhOMWJXMWhjbWw2WlNodFpXRnVYMlJwWm1aZmMyTnZjbVVnUFNCdFpXRnVLR1JwWm1aZlFUUTROVjlFVFZOUEtTd2dMbWR5YjNWd2N5QTlJQ2RrY205d0p5bGNibHh1ZEdWdGNDQThMU0JzWldaMFgycHZhVzRvZEdWdGNDd2daR2xtWmk1U1RrRXNJR0o1SUQwZ1l5aGNJbWRsYm1WY0lpQTlJRndpWlc1elpXMWliRjluWlc1bFgybGtYQ0lwS1NBbFBpVWdYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9abXhoWnlBOUlHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaVXhwYzNRdVpHOTNiaTVTVGtFc0lGd2lNa1JQVjA1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1ZFhBdVVrNUJMQ0JjSWpGVlVGd2lMQ0JjSWpCT1Qxd2lLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYldGNFJteGhaeUE5SUNoaFluTW9jMmh5YVc1clpXUmZiRzluTWtaREtTQStJRzFoZUV4dlp6SkdReWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJoeWJHOW5NbVpqVFdGNElEMGdjRzFoZUNod2JXbHVLSE5vY21sdWEyVmtYMnh2WnpKR1F5d2diV0Y0VEc5bk1rWkRLU3dnTFcxaGVFeHZaekpHUXlrcElDVStKU0JjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvWm14aFp5bGNibHh1Wm5keWFYUmxLSFJsYlhBc0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNJbWRsYm1WZllYWm5VMk52Y21WZlptTmZaRlJCUjE5d0xYTXVkSE4yWENJcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlITm9jbXh2WnpKbVkwMWhlQ3dnZVNBOUlHMWxZVzVmWkdsbVpsOXpZMjl5WlN3Z1kyOXNiM0lnUFNCbWJHRm5MQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOUlHbG1aV3h6WlNobWJHRm5JQ0U5SUZ3aU1FNVBYQ0lzSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlN3Z1RrRXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9ZWEJsSUQwZ1lYTXVabUZqZEc5eUtHMWhlRVpzWVdjcEtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJuWlc5dFgzUmxlSFJmY21Wd1pXd29LU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQm5aM1JwZEd4bEtGd2lRVFE0TlZ3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJJRnh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlHWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ0xXWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUN0Y2JpQWdjMk5oYkdWZlkyOXNiM0pmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENJd1RrOWNJaUE5SUZ3aVlteGhZMnRjSWl3Z1hDSXhWVkJjSWlBOUlGd2ljbVZrWENJc0lGd2lNa1JQVjA1Y0lpQTlJRndpWW14MVpWd2lLU2tnS3lBZ0l5QkRiM0p5WldOMFpXUWdZMjlzYjNJZ2JXRndjR2x1WjF4dUlDQnpZMkZzWlY5emFHRndaVjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWxSU1ZVVmNJaUE5SURJc0lGd2lSa0ZNVTBWY0lpQTlJREU1S1NsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpYkc5bk1rWkRYM1p6WDJGMloxTmpiM0psWDBFME9EVmZjQzF6WDJScFptWkRkWFJ2Wm1aZlhDSXNJR1JwWm1aRGRYUnZabVlwWEc1b1pXbG5hSFFnUEMwZ05GeHVkMmxrZEdnZ1BDMGdOMXh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ3aWFXNWNJaXdnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVYRzRqSUZzeVhTQlRkVzBnYjJZZ1pHbG1abVZ5Wlc1MGFXRnNJR3h2YjNBZ2MyTnZjbVZ6SUdadmNpQmxZV05vSUdkbGJtVmNiaU1qSUZKT1FTQnZibXg1WEc1bVkwTjFkRzltWmlBOExTQXdMalZjYm1Gc2NHaGhJRHd0SURBdU1EVmNibTFoZUV4dlp6SkdReUE4TFNBMFhHNWNiblJsYlhBZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScFptWmZRVFE0TlY5RVRWTlBMQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h6ZFcxZlpHbG1abDl6WTI5eVpTQTlJSE4xYlNoa2FXWm1YMEUwT0RWZlJFMVRUeWtzSUM1bmNtOTFjSE1nUFNBblpISnZjQ2NwWEc1Y2JuUmxiWEFnUEMwZ2JHVm1kRjlxYjJsdUtIUmxiWEFzSUdScFptWXVVazVCTENCaWVTQTlJR01vWENKblpXNWxYQ0lnUFNCY0ltVnVjMlZ0WW14ZloyVnVaVjlwWkZ3aUtTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dac1lXY2dQU0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1WTWFYTjBMbVJ2ZDI0dVVrNUJMQ0JjSWpKRVQxZE9YQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExuVndMbEpPUVN3Z1hDSXhWVkJjSWl3Z1hDSXdUazljSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhlRVpzWVdjZ1BTQW9ZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCdFlYaE1iMmN5UmtNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9jbXh2WnpKbVkwMWhlQ0E5SUhCdFlYZ29jRzFwYmloemFISnBibXRsWkY5c2IyY3lSa01zSUcxaGVFeHZaekpHUXlrc0lDMXRZWGhNYjJjeVJrTXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtHWnNZV2NwWEc1Y2JtWjNjbWwwWlNoMFpXMXdMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKblpXNWxYM04xYlZOamIzSmxYMlpqWDJSVVFVZGZjQzF6TG5SemRsd2lLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J6YUhKc2IyY3labU5OWVhnc0lIa2dQU0J6ZFcxZlpHbG1abDl6WTI5eVpTd2dZMjlzYjNJZ1BTQm1iR0ZuTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWVdKbGJDQTlJR2xtWld4elpTaG1iR0ZuSUNFOUlGd2lNRTVQWENJc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTd2dUa0VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vWVhCbElEMGdZWE11Wm1GamRHOXlLRzFoZUVac1lXY3BLU2tnSzF4dUlDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCblpXOXRYM1JsZUhSZmNtVndaV3dvS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0JuWjNScGRHeGxLRndpUVRRNE5Wd2lLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJQzBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJoYzJobFpGd2lLU0FySUZ4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZkbXhwYm1Vb2VHbHVkR1Z5WTJWd2RDQTlJR1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdMV1pqUTNWMGIyWm1MQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnYzJOaGJHVmZZMjlzYjNKZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSXdUazljSWlBOUlGd2lZbXhoWTJ0Y0lpd2dYQ0l4VlZCY0lpQTlJRndpY21Wa1hDSXNJRndpTWtSUFYwNWNJaUE5SUZ3aVlteDFaVndpS1NrZ0t5QWdJeUJEYjNKeVpXTjBaV1FnWTI5c2IzSWdiV0Z3Y0dsdVoxeHVJQ0J6WTJGc1pWOXphR0Z3WlY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY0lsUlNWVVZjSWlBOUlESXNJRndpUmtGTVUwVmNJaUE5SURFNUtTbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWJHOW5Na1pEWDNaelgzTjFiVk5qYjNKbFgwRTBPRFZmY0MxelgyUnBabVpEZFhSdlptWmZYQ0lzSUdScFptWkRkWFJ2Wm1ZcFhHNW9aV2xuYUhRZ1BDMGdORnh1ZDJsa2RHZ2dQQzBnTjF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc1Y2JpTWdXek5kSUUxaGVDQnZaaUJrYVdabVpYSmxiblJwWVd3Z2JHOXZjQ0J6WTI5eVpYTWdabTl5SUdWaFkyZ2daMlZ1WlZ4dUl5TWdVazVCSUc5dWJIbGNibVpqUTNWMGIyWm1JRHd0SURBdU5WeHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dWJXRjRURzluTWtaRElEd3RJRFJjYmx4dWRHVnRjQ0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2xtWmw5Qk5EZzFYMFJOVTA4c0lHZGxibVVwSUNVK0pTQmNiaUFnZFc1dVpYTjBLR2RsYm1VcElDVStKU0JuY205MWNGOWllU2huWlc1bEtTQWxQaVZjYmlBZ2MzVnRiV0Z5YVhwbEtHMWhlRjloWW5OZlpHbG1abDl6WTI5eVpTQTlJR1JwWm1aZlFUUTROVjlFVFZOUFczZG9hV05vTG0xaGVDaGhZbk1vWkdsbVpsOUJORGcxWDBSTlUwOHBLVjBzSUM1bmNtOTFjSE1nUFNBblpISnZjQ2NwWEc1Y2JuUmxiWEFnUEMwZ2JHVm1kRjlxYjJsdUtIUmxiWEFzSUdScFptWXVVazVCTENCaWVTQTlJR01vWENKblpXNWxYQ0lnUFNCY0ltVnVjMlZ0WW14ZloyVnVaVjlwWkZ3aUtTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dac1lXY2dQU0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1WTWFYTjBMbVJ2ZDI0dVVrNUJMQ0JjSWpKRVQxZE9YQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExuVndMbEpPUVN3Z1hDSXhWVkJjSWl3Z1hDSXdUazljSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhlRVpzWVdjZ1BTQW9ZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCdFlYaE1iMmN5UmtNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9jbXh2WnpKbVkwMWhlQ0E5SUhCdFlYZ29jRzFwYmloemFISnBibXRsWkY5c2IyY3lSa01zSUcxaGVFeHZaekpHUXlrc0lDMXRZWGhNYjJjeVJrTXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtHWnNZV2NwWEc1Y2JtWjNjbWwwWlNoMFpXMXdMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKblpXNWxYMjFoZUVGaWMxTmpiM0psWDJaalgyUlVRVWRmY0MxekxuUnpkbHdpS1N3Z2MyVndJRDBnWENKY1hIUmNJaWxjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCemFISnNiMmN5Wm1OTllYZ3NJSGtnUFNCdFlYaGZZV0p6WDJScFptWmZjMk52Y21Vc0lHTnZiRzl5SUQwZ1pteGhaeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BTQnBabVZzYzJVb1pteGhaeUFoUFNCY0lqQk9UMXdpTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVc0lFNUJLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphR0Z3WlNBOUlHRnpMbVpoWTNSdmNpaHRZWGhHYkdGbktTa3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnWjJWdmJWOTBaWGgwWDNKbGNHVnNLQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCY2JpQWdaMmQwYVhSc1pTaGNJa0UwT0RWY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWENKa1lYTm9aV1JjSWlrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXRJR1JwWm1aRGRYUnZabVlzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLeUJjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQm1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlDMW1ZME4xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aU1FNVBYQ0lnUFNCY0ltSnNZV05yWENJc0lGd2lNVlZRWENJZ1BTQmNJbkpsWkZ3aUxDQmNJakpFVDFkT1hDSWdQU0JjSW1Kc2RXVmNJaWtwSUNzZ0lDTWdRMjl5Y21WamRHVmtJR052Ykc5eUlHMWhjSEJwYm1kY2JpQWdjMk5oYkdWZmMyaGhjR1ZmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENKVVVsVkZYQ0lnUFNBeUxDQmNJa1pCVEZORlhDSWdQU0F4T1NrcFhHNWNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW14dlp6SkdRMTkyYzE5dFlYaEJZbk5UWTI5eVpWOUJORGcxWDNBdGMxOWthV1ptUTNWMGIyWm1YMXdpTENCa2FXWm1RM1YwYjJabUtWeHVhR1ZwWjJoMElEd3RJRFJjYm5kcFpIUm9JRHd0SURkY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiMgZ2V0dGluZyBsaXN0IG9mIGdlbmVzIG9mIGludGVyZXN0IGZyb20gUk5BLXNlcSBhbmQgUFJPLXNlcVxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmLlJOQS5HMS5BNDg1IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKVxuXG4jIEltcG9ydGluZyBsb29wIGdlbmUgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtU1xcKSklPiUgXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpXG5cbiMgVGVzdGluZyBkaWZmZXJlbnQgd2F5cyB0byBjYWxjdWxhdGUgcmVwcmVzZW50YXRpdmUgZmVhdHVyZSBvZiBsb29wcyBmb3IgZWFjaCBnZW5lXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BLkcxLkE0ODUgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmKSkkZW5zZW1ibF9nZW5lX2lkXG5nZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BLkcxLkE0ODUgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gZmNDdXRvZmYpKSRlbnNlbWJsX2dlbmVfaWRcblxuXG4jIFsxXSBBdmVyYWdlIG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lXG4jIyBSTkEgb25seVxuZmNDdXRvZmYgPC0gMC41XG5hbHBoYSA8LSAwLjA1XG5tYXhMb2cyRkMgPC0gNFxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX0E0ODVfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1zLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXEE0ODVcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGJsYWNrXFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19hdmdTY29yZV9BNDg1X3Atc19kaWZmQ3V0b2ZmX1xcLCBkaWZmQ3V0b2ZmKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuIyBbMl0gU3VtIG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lXG4jIyBSTkEgb25seVxuZmNDdXRvZmYgPC0gMC41XG5hbHBoYSA8LSAwLjA1XG5tYXhMb2cyRkMgPC0gNFxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUoc3VtX2RpZmZfc2NvcmUgPSBzdW0oZGlmZl9BNDg1X0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5md3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIFxcZ2VuZV9zdW1TY29yZV9mY19kVEFHX3Atcy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gc3VtX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXEE0ODVcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGJsYWNrXFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19zdW1TY29yZV9BNDg1X3Atc19kaWZmQ3V0b2ZmX1xcLCBkaWZmQ3V0b2ZmKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG4jIFszXSBNYXggb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSA0XG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtYXhfYWJzX2RpZmZfc2NvcmUgPSBkaWZmX0E0ODVfRE1TT1t3aGljaC5tYXgoYWJzKGRpZmZfQTQ4NV9ETVNPKSldLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5md3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIFxcZ2VuZV9tYXhBYnNTY29yZV9mY19kVEFHX3Atcy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWF4X2Fic19kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxBNDg1XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxibGFja1xcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfbWF4QWJzU2NvcmVfQTQ4NV9wLXNfZGlmZkN1dG9mZl9cXCwgZGlmZkN1dG9mZilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.RNA.G1.A485 <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)

# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-S\))%>% 
  dplyr::mutate(distance = start2 - start1)

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA.G1.A485 %>% dplyr::filter(shrinked_log2FC < -fcCutoff))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA.G1.A485 %>% dplyr::filter(shrinked_log2FC > fcCutoff))$ensembl_gene_id


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-s.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_A485_p-s_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# [2] Sum of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(sum_diff_score = sum(diff_A485_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_sumScore_fc_dTAG_p-s.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = sum_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_sumScore_A485_p-s_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


# [3] Max of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(max_abs_diff_score = diff_A485_DMSO[which.max(abs(diff_A485_DMSO))], .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_maxAbsScore_fc_dTAG_p-s.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = max_abs_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_maxAbsScore_A485_p-s_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5Qm5aWFIwYVc1bklHeHBjM1FnYjJZZ1oyVnVaWE1nYjJZZ2FXNTBaWEpsYzNRZ1puSnZiU0JTVGtFdGMyVnhJR0Z1WkNCUVVrOHRjMlZ4WEc1aGJIQm9ZU0E4TFNBd0xqQTFYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibVJwWm1ZdVVrNUJMa2N4TGtFME9EVWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1pHbG1abDlITVM1Qk5EZzFMbk5sYkdWamRHVmtNbDlITVM0eWFTNUJORGcxWDNaelgwY3hMakpwTGtSTlUwOHVkSE4yWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh3WVdScUlEd2dZV3h3YUdFc0lHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnWm1ORGRYUnZabVlwWEc1Y2JpTWdTVzF3YjNKMGFXNW5JR3h2YjNBZ1oyVnVaU0JoYm01dmRHRjBhVzl1WEc1dVlXMWxJRHd0SUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVZ4Y1hHNWNibVJwWm1aRGRYUnZabVlnUEMwZ01DNHlYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gzQXRibDlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptUTNWMGIyWm1JRDBnWkdsbVprTjFkRzltWml4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZVzV1YjB4cGMzUWdQU0JqS0Z4Y1VDMVRYRndwS1NVK0pTQmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGthWE4wWVc1alpTQTlJSE4wWVhKME1pQXRJSE4wWVhKME1TbGNibHh1SXlCVVpYTjBhVzVuSUdScFptWmxjbVZ1ZENCM1lYbHpJSFJ2SUdOaGJHTjFiR0YwWlNCeVpYQnlaWE5sYm5SaGRHbDJaU0JtWldGMGRYSmxJRzltSUd4dmIzQnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JtUnBabVl1VWs1QklEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdScFptWmZSekV1UVRRNE5TNXpaV3hsWTNSbFpESmZSekV1TW1rdVFUUTROVjkyYzE5SE1TNHlhUzVFVFZOUExuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9aVzV6WlcxaWJGOW5aVzVsWDJsa0xDQnNiMmN5Um05c1pFTm9ZVzVuWlN3Z2MyaHlhVzVyWldSZmJHOW5Na1pETENCd1lXUnFMQ0JsZUhSbGNtNWhiRjluWlc1bFgyNWhiV1VwWEc1blpXNWxUR2x6ZEM1a2IzZHVMbEpPUVNBOExTQW9aR2xtWmk1U1RrRXVSekV1UVRRNE5TQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXRabU5EZFhSdlptWXBLU1JsYm5ObGJXSnNYMmRsYm1WZmFXUmNibWRsYm1WTWFYTjBMblZ3TGxKT1FTQThMU0FvWkdsbVppNVNUa0V1UnpFdVFUUTROU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh6YUhKcGJtdGxaRjlzYjJjeVJrTWdQaUJtWTBOMWRHOW1aaWtwSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1WEc1Y2JpTWdXekZkSUVGMlpYSmhaMlVnYjJZZ1pHbG1abVZ5Wlc1MGFXRnNJR3h2YjNBZ2MyTnZjbVZ6SUdadmNpQmxZV05vSUdkbGJtVmNiaU1qSUZKT1FTQnZibXg1WEc1bVkwTjFkRzltWmlBOExTQXdMalZjYm1Gc2NHaGhJRHd0SURBdU1EVmNibTFoZUV4dlp6SkdReUE4TFNBMFhHNWNiblJsYlhBZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScFptWmZRVFE0TlY5RVRWTlBMQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0J0WldGdUtHUnBabVpmUVRRNE5WOUVUVk5QS1N3Z0xtZHliM1Z3Y3lBOUlDZGtjbTl3SnlsY2JseHVkR1Z0Y0NBOExTQnNaV1owWDJwdmFXNG9kR1Z0Y0N3Z1pHbG1aaTVTVGtFc0lHSjVJRDBnWXloY1hHZGxibVZjWENBOUlGeGNaVzV6WlcxaWJGOW5aVzVsWDJsa1hGd3BLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pteGhaeUE5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpVeHBjM1F1Wkc5M2JpNVNUa0VzSUZ4Y01rUlBWMDVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlV4cGMzUXVkWEF1VWs1QkxDQmNYREZWVUZ4Y0xDQmNYREJPVDF4Y0tTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0Y0Um14aFp5QTlJQ2hoWW5Nb2MyaHlhVzVyWldSZmJHOW5Na1pES1NBK0lHMWhlRXh2WnpKR1F5a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmh5Ykc5bk1tWmpUV0Y0SUQwZ2NHMWhlQ2h3YldsdUtITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2JXRjRURzluTWtaREtTd2dMVzFoZUV4dlp6SkdReWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbUZ5Y21GdVoyVW9abXhoWnlsY2JseHVabmR5YVhSbEtIUmxiWEFzSUdobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY1hHZGxibVZmWVhablUyTnZjbVZmWm1OZlpGUkJSMTl3TFhNdWRITjJYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1WEc1d0lEd3RJR2RuY0d4dmRDaDBaVzF3TENCaFpYTW9lQ0E5SUhOb2NteHZaekptWTAxaGVDd2dlU0E5SUcxbFlXNWZaR2xtWmw5elkyOXlaU3dnWTI5c2IzSWdQU0JtYkdGbkxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1lXSmxiQ0E5SUdsbVpXeHpaU2htYkdGbklDRTlJRnhjTUU1UFhGd3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU3dnVGtFcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb1lYQmxJRDBnWVhNdVptRmpkRzl5S0cxaGVFWnNZV2NwS1NrZ0sxeHVJQ0JuWlc5dFgzQnZhVzUwS0NrZ0t5Qm5aVzl0WDNSbGVIUmZjbVZ3Wld3b0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNCblozUnBkR3hsS0Z4Y1FUUTROVnhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnWkdsbVprTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUMwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBcklGeHVJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUdaalEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3RjYmlBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTFdaalEzVjBiMlptTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3RjYmlBZ2MyTmhiR1ZmWTI5c2IzSmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YRnd3VGs5Y1hDQTlJRnhjWW14aFkydGNYQ3dnWEZ3eFZWQmNYQ0E5SUZ4Y2NtVmtYRndzSUZ4Y01rUlBWMDVjWENBOUlGeGNZbXgxWlZ4Y0tTa2dLeUFnSXlCRGIzSnlaV04wWldRZ1kyOXNiM0lnYldGd2NHbHVaMXh1SUNCelkyRnNaVjl6YUdGd1pWOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYRlJTVlVWY1hDQTlJRElzSUZ4Y1JrRk1VMFZjWENBOUlERTVLU2xjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNiRzluTWtaRFgzWnpYMkYyWjFOamIzSmxYMEUwT0RWZmNDMXpYMlJwWm1aRGRYUnZabVpmWEZ3c0lHUnBabVpEZFhSdlptWXBYRzVvWldsbmFIUWdQQzBnTkZ4dWQybGtkR2dnUEMwZ04xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRnhjYVc1Y1hDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2twTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVhHNGpJRnN5WFNCVGRXMGdiMllnWkdsbVptVnlaVzUwYVdGc0lHeHZiM0FnYzJOdmNtVnpJR1p2Y2lCbFlXTm9JR2RsYm1WY2JpTWpJRkpPUVNCdmJteDVYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibUZzY0doaElEd3RJREF1TURWY2JtMWhlRXh2WnpKR1F5QThMU0EwWEc1Y2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwWm1aZlFUUTROVjlFVFZOUExDQm5aVzVsS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaHpkVzFmWkdsbVpsOXpZMjl5WlNBOUlITjFiU2hrYVdabVgwRTBPRFZmUkUxVFR5a3NJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzVjYm5SbGJYQWdQQzBnYkdWbWRGOXFiMmx1S0hSbGJYQXNJR1JwWm1ZdVVrNUJMQ0JpZVNBOUlHTW9YRnhuWlc1bFhGd2dQU0JjWEdWdWMyVnRZbXhmWjJWdVpWOXBaRnhjS1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1pzWVdjZ1BTQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExtUnZkMjR1VWs1QkxDQmNYREpFVDFkT1hGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVk1hWE4wTG5Wd0xsSk9RU3dnWEZ3eFZWQmNYQ3dnWEZ3d1RrOWNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxaGVFWnNZV2NnUFNBb1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJ0WVhoTWIyY3lSa01wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb2NteHZaekptWTAxaGVDQTlJSEJ0WVhnb2NHMXBiaWh6YUhKcGJtdGxaRjlzYjJjeVJrTXNJRzFoZUV4dlp6SkdReWtzSUMxdFlYaE1iMmN5UmtNcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0dac1lXY3BYRzVjYm1aM2NtbDBaU2gwWlcxd0xDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhuWlc1bFgzTjFiVk5qYjNKbFgyWmpYMlJVUVVkZmNDMXpMblJ6ZGx4Y0tTd2djMlZ3SUQwZ1hGeGNYSFJjWENsY2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQnphSEpzYjJjeVptTk5ZWGdzSUhrZ1BTQnpkVzFmWkdsbVpsOXpZMjl5WlN3Z1kyOXNiM0lnUFNCbWJHRm5MQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOUlHbG1aV3h6WlNobWJHRm5JQ0U5SUZ4Y01FNVBYRndzSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlN3Z1RrRXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9ZWEJsSUQwZ1lYTXVabUZqZEc5eUtHMWhlRVpzWVdjcEtTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtDa2dLeUJuWlc5dFgzUmxlSFJmY21Wd1pXd29LU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQm5aM1JwZEd4bEtGeGNRVFE0TlZ4Y0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ1pHbG1aa04xZEc5bVppd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMGdaR2xtWmtOMWRHOW1aaXdnYkdsdVpYUjVjR1VnUFNCY1hHUmhjMmhsWkZ4Y0tTQXJJRnh1SUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlHWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdaMlZ2YlY5MmJHbHVaU2g0YVc1MFpYSmpaWEIwSUQwZ0xXWmpRM1YwYjJabUxDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdjMk5oYkdWZlkyOXNiM0pmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWEZ3d1RrOWNYQ0E5SUZ4Y1lteGhZMnRjWEN3Z1hGd3hWVkJjWENBOUlGeGNjbVZrWEZ3c0lGeGNNa1JQVjA1Y1hDQTlJRnhjWW14MVpWeGNLU2tnS3lBZ0l5QkRiM0p5WldOMFpXUWdZMjlzYjNJZ2JXRndjR2x1WjF4dUlDQnpZMkZzWlY5emFHRndaVjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjWEZSU1ZVVmNYQ0E5SURJc0lGeGNSa0ZNVTBWY1hDQTlJREU1S1NsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjYkc5bk1rWkRYM1p6WDNOMWJWTmpiM0psWDBFME9EVmZjQzF6WDJScFptWkRkWFJ2Wm1aZlhGd3NJR1JwWm1aRGRYUnZabVlwWEc1b1pXbG5hSFFnUEMwZ05GeHVkMmxrZEdnZ1BDMGdOMXh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVYRzVjYmlNZ1d6TmRJRTFoZUNCdlppQmthV1ptWlhKbGJuUnBZV3dnYkc5dmNDQnpZMjl5WlhNZ1ptOXlJR1ZoWTJnZ1oyVnVaVnh1SXlNZ1VrNUJJRzl1YkhsY2JtWmpRM1YwYjJabUlEd3RJREF1TlZ4dVlXeHdhR0VnUEMwZ01DNHdOVnh1YldGNFRHOW5Na1pESUR3dElEUmNibHh1ZEdWdGNDQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbG1abDlCTkRnMVgwUk5VMDhzSUdkbGJtVXBJQ1UrSlNCY2JpQWdkVzV1WlhOMEtHZGxibVVwSUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0cxaGVGOWhZbk5mWkdsbVpsOXpZMjl5WlNBOUlHUnBabVpmUVRRNE5WOUVUVk5QVzNkb2FXTm9MbTFoZUNoaFluTW9aR2xtWmw5Qk5EZzFYMFJOVTA4cEtWMHNJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzVjYm5SbGJYQWdQQzBnYkdWbWRGOXFiMmx1S0hSbGJYQXNJR1JwWm1ZdVVrNUJMQ0JpZVNBOUlHTW9YRnhuWlc1bFhGd2dQU0JjWEdWdWMyVnRZbXhmWjJWdVpWOXBaRnhjS1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1pzWVdjZ1BTQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVZNYVhOMExtUnZkMjR1VWs1QkxDQmNYREpFVDFkT1hGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVk1hWE4wTG5Wd0xsSk9RU3dnWEZ3eFZWQmNYQ3dnWEZ3d1RrOWNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxaGVFWnNZV2NnUFNBb1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJ0WVhoTWIyY3lSa01wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb2NteHZaekptWTAxaGVDQTlJSEJ0WVhnb2NHMXBiaWh6YUhKcGJtdGxaRjlzYjJjeVJrTXNJRzFoZUV4dlp6SkdReWtzSUMxdFlYaE1iMmN5UmtNcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0dac1lXY3BYRzVjYm1aM2NtbDBaU2gwWlcxd0xDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhuWlc1bFgyMWhlRUZpYzFOamIzSmxYMlpqWDJSVVFVZGZjQzF6TG5SemRseGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDbGNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J6YUhKc2IyY3labU5OWVhnc0lIa2dQU0J0WVhoZllXSnpYMlJwWm1aZmMyTnZjbVVzSUdOdmJHOXlJRDBnWm14aFp5d2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHRmlaV3dnUFNCcFptVnNjMlVvWm14aFp5QWhQU0JjWERCT1QxeGNMQ0JsZUhSbGNtNWhiRjluWlc1bFgyNWhiV1VzSUU1QktTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFHRndaU0E5SUdGekxtWmhZM1J2Y2lodFlYaEdiR0ZuS1NrcElDdGNiaUFnWjJWdmJWOXdiMmx1ZENncElDc2daMlZ2YlY5MFpYaDBYM0psY0dWc0tDa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJjYmlBZ1oyZDBhWFJzWlNoY1hFRTBPRFZjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUdScFptWkRkWFJ2Wm1Zc0lHeHBibVYwZVhCbElEMGdYRnhrWVhOb1pXUmNYQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBdElHUnBabVpEZFhSdlptWXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0t5QmNiaUFnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdNQ2tnSzF4dUlDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNCbVkwTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SUMxbVkwTjFkRzltWml3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lITmpZV3hsWDJOdmJHOXlYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjTUU1UFhGd2dQU0JjWEdKc1lXTnJYRndzSUZ4Y01WVlFYRndnUFNCY1hISmxaRnhjTENCY1hESkVUMWRPWEZ3Z1BTQmNYR0pzZFdWY1hDa3BJQ3NnSUNNZ1EyOXljbVZqZEdWa0lHTnZiRzl5SUcxaGNIQnBibWRjYmlBZ2MyTmhiR1ZmYzJoaGNHVmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YRnhVVWxWRlhGd2dQU0F5TENCY1hFWkJURk5GWEZ3Z1BTQXhPU2twWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYR3h2WnpKR1ExOTJjMTl0WVhoQlluTlRZMjl5WlY5Qk5EZzFYM0F0YzE5a2FXWm1RM1YwYjJabVgxeGNMQ0JrYVdabVEzVjBiMlptS1Z4dWFHVnBaMmgwSUR3dElEUmNibmRwWkhSb0lEd3RJRGRjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG4jIGdldHRpbmcgbGlzdCBvZiBnZW5lcyBvZiBpbnRlcmVzdCBmcm9tIFJOQS1zZXEgYW5kIFBSTy1zZXFcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZi5STkEuRzEuQTQ4NSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcblxuIyBJbXBvcnRpbmcgbG9vcCBnZW5lIGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVNcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKVxuXG4jIFRlc3RpbmcgZGlmZmVyZW50IHdheXMgdG8gY2FsY3VsYXRlIHJlcHJlc2VudGF0aXZlIGZlYXR1cmUgb2YgbG9vcHMgZm9yIGVhY2ggZ2VuZVxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQS5HMS5BNDg1ICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZikpJGVuc2VtYmxfZ2VuZV9pZFxuZ2VuZUxpc3QudXAuUk5BIDwtIChkaWZmLlJOQS5HMS5BNDg1ICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmKSkkZW5zZW1ibF9nZW5lX2lkXG5cblxuIyBbMV0gQXZlcmFnZSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDRcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9BNDg1X0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgXFwyRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsIFxcMVVQXFwsIFxcME5PXFwpKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKVxuXG5md3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIFxcZ2VuZV9hdmdTY29yZV9mY19kVEFHX3Atcy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxBNDg1XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxibGFja1xcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfYXZnU2NvcmVfQTQ4NV9wLXNfZGlmZkN1dG9mZl9cXCwgZGlmZkN1dG9mZilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbiMgWzJdIFN1bSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDRcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKHN1bV9kaWZmX3Njb3JlID0gc3VtKGRpZmZfQTQ4NV9ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfc3VtU2NvcmVfZmNfZFRBR19wLXMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IHN1bV9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gXFwwTk9cXCwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArXG4gIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFxBNDg1XFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXDBOT1xcID0gXFxibGFja1xcLCBcXDFVUFxcID0gXFxyZWRcXCwgXFwyRE9XTlxcID0gXFxibHVlXFwpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nXG4gIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKFxcVFJVRVxcID0gMiwgXFxGQUxTRVxcID0gMTkpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfdnNfc3VtU2NvcmVfQTQ4NV9wLXNfZGlmZkN1dG9mZl9cXCwgZGlmZkN1dG9mZilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA3XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuIyBbM10gTWF4IG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lXG4jIyBSTkEgb25seVxuZmNDdXRvZmYgPC0gMC41XG5hbHBoYSA8LSAwLjA1XG5tYXhMb2cyRkMgPC0gNFxuXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWF4X2Fic19kaWZmX3Njb3JlID0gZGlmZl9BNDg1X0RNU09bd2hpY2gubWF4KGFicyhkaWZmX0E0ODVfRE1TTykpXSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfbWF4QWJzU2NvcmVfZmNfZFRBR19wLXMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1heF9hYnNfZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcQTQ4NVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcYmxhY2tcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX21heEFic1Njb3JlX0E0ODVfcC1zX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUk5BLkcxLkE0ODUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5cbiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1TXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuIyBUZXN0aW5nIGRpZmZlcmVudCB3YXlzIHRvIGNhbGN1bGF0ZSByZXByZXNlbnRhdGl2ZSBmZWF0dXJlIG9mIGxvb3BzIGZvciBlYWNoIGdlbmVcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5nZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuQTQ4NSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYpKSRlbnNlbWJsX2dlbmVfaWRcbmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEuRzEuQTQ4NSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiBmY0N1dG9mZikpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSA0XG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfQTQ4NV9ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJylcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsIFxcMkRPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCBcXDFVUFxcLCBcXDBOT1xcKSksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZylcblxuZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLXMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcQTQ4NVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcYmxhY2tcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX2F2Z1Njb3JlX0E0ODVfcC1zX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4jIFsyXSBTdW0gb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmVcbiMjIFJOQSBvbmx5XG5mY0N1dG9mZiA8LSAwLjVcbmFscGhhIDwtIDAuMDVcbm1heExvZzJGQyA8LSA0XG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShzdW1fZGlmZl9zY29yZSA9IHN1bShkaWZmX0E0ODVfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX3N1bVNjb3JlX2ZjX2RUQUdfcC1zLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBzdW1fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCBcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9IFxcME5PXFwsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgK1xuICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcQTQ4NVxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIFxuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFwwTk9cXCA9IFxcYmxhY2tcXCwgXFwxVVBcXCA9IFxccmVkXFwsIFxcMkRPV05cXCA9IFxcYmx1ZVxcKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZ1xuICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhcXFRSVUVcXCA9IDIsIFxcRkFMU0VcXCA9IDE5KSlcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX3ZzX3N1bVNjb3JlX0E0ODVfcC1zX2RpZmZDdXRvZmZfXFwsIGRpZmZDdXRvZmYpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gN1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cbiMgWzNdIE1heCBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZVxuIyMgUk5BIG9ubHlcbmZjQ3V0b2ZmIDwtIDAuNVxuYWxwaGEgPC0gMC4wNVxubWF4TG9nMkZDIDwtIDRcblxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1heF9hYnNfZGlmZl9zY29yZSA9IGRpZmZfQTQ4NV9ETVNPW3doaWNoLm1heChhYnMoZGlmZl9BNDg1X0RNU08pKV0sIC5ncm91cHMgPSAnZHJvcCcpXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCBcXDJET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgXFwxVVBcXCwgXFwwTk9cXCkpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpXG5cbmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxnZW5lX21heEFic1Njb3JlX2ZjX2RUQUdfcC1zLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtYXhfYWJzX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSBcXDBOT1xcLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICtcbiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgZ2d0aXRsZShcXEE0ODVcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcME5PXFwgPSBcXGJsYWNrXFwsIFxcMVVQXFwgPSBcXHJlZFxcLCBcXDJET1dOXFwgPSBcXGJsdWVcXCkpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmdcbiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoXFxUUlVFXFwgPSAyLCBcXEZBTFNFXFwgPSAxOSkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ192c19tYXhBYnNTY29yZV9BNDg1X3Atc19kaWZmQ3V0b2ZmX1xcLCBkaWZmQ3V0b2ZmKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDdcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
# getting list of genes of interest from RNA-seq and PRO-seq
alpha <- 0.05
fcCutoff <- 0.5
diff.RNA.G1.A485 <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)

# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\

diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-S\))%>% 
  dplyr::mutate(distance = start2 - start1)

# Testing different ways to calculate representative feature of loops for each gene
diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
geneList.down.RNA <- (diff.RNA.G1.A485 %>% dplyr::filter(shrinked_log2FC < -fcCutoff))$ensembl_gene_id
geneList.up.RNA <- (diff.RNA.G1.A485 %>% dplyr::filter(shrinked_log2FC > fcCutoff))$ensembl_gene_id


# [1] Average of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_avgScore_fc_dTAG_p-s.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = mean_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_avgScore_A485_p-s_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

# [2] Sum of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(sum_diff_score = sum(diff_A485_DMSO), .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_sumScore_fc_dTAG_p-s.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = sum_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_sumScore_A485_p-s_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


# [3] Max of differential loop scores for each gene
## RNA only
fcCutoff <- 0.5
alpha <- 0.05
maxLog2FC <- 4

temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(max_abs_diff_score = diff_A485_DMSO[which.max(abs(diff_A485_DMSO))], .groups = 'drop')

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% geneList.down.RNA, \2DOWN\,
                              ifelse(gene %in% geneList.up.RNA, \1UP\, \0NO\)),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                shrlog2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag)

fwrite(temp, here(consensusDir, \gene_maxAbsScore_fc_dTAG_p-s.tsv\), sep = \\t\)

p <- ggplot(temp, aes(x = shrlog2fcMax, y = max_abs_diff_score, color = flag, 
                      label = ifelse(flag != \0NO\, external_gene_name, NA),
                      shape = as.factor(maxFlag))) +
  geom_point() + geom_text_repel() + theme_classic() + 
  ggtitle(\A485\) +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = diffCutoff, linetype = \dashed\) +
  geom_hline(yintercept = - diffCutoff, linetype = \dashed\) + 
  geom_vline(xintercept = 0) +
  geom_vline(xintercept = fcCutoff, linetype = \dashed\) +
  geom_vline(xintercept = -fcCutoff, linetype = \dashed\) +
  scale_color_manual(values = c(\0NO\ = \black\, \1UP\ = \red\, \2DOWN\ = \blue\)) +  # Corrected color mapping
  scale_shape_manual(values = c(\TRUE\ = 2, \FALSE\ = 19))

fileName <- paste0(\log2FC_vs_maxAbsScore_A485_p-s_diffCutoff_\, diffCutoff)
height <- 4
width <- 7
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### P-PE

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJKVFZCUFVsUkpUa2NnUjBWT1JTQkJUazVQSUVSQlZFRWdSazlTSUZBdFRpQk1UMDlRVTF4dWJtRnRaU0E4TFNCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY0lseHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgzQXRibDlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNJaWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptUTNWMGIyWm1JRDBnTUM0eUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVmhjSWlrcEpUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJsWVd0SlJDQTlJSEJoYzNSbEtHTm9jbTl0TVN3Z2MzUmhjblF4TENCemRHRnlkRElzSUhObGNDQTlJRndpWDF3aUtTbGNibHh1WEc0aklFTnZkVzUwYVc1bklHNTFiV0psY2lCdlppQnNiMjl3SUhCbGNpQm5aVzVsYzF4dWRHVnRjRk4xYlNBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvY0dWaGEwbEVMQ0JuWlc1bExDQkJibTV2TWlrZ0pUNGxJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVWdaM0p2ZFhCZllua29aMlZ1WlNrZ0pUNGxJQ0J6ZFcxdFlYSnBlbVVvWEc0Z0lDQWdjR1ZoYXlBOUlHeHBjM1FvY0dWaGEwbEVLU3hjYmlBZ0lDQmhibTV2TWlBOUlHeHBjM1FvUVc1dWJ6SXBMRnh1SUNBZ0lHTnZkVzUwSUQwZ2JpZ3BLVnh1WEc1blozQnNiM1FvZEdWdGNGTjFiU3dnWVdWektIZ2dQU0JqYjNWdWRDa3BJQ3NnWjJWdmJWOW9hWE4wYjJkeVlXMG9ZbWx1ZDJsa2RHZ2dQU0F4S1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0JuWjNScGRHeGxLRndpSXlCdlppQlFMVTRnYkc5dmNITWdabTl5SUdWaFkyZ2daMlZ1WlZ3aUtTQXJJSE5qWVd4bFgzbGZiRzluTVRBb0tWeHVYRzRqSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSTF4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jIElNUE9SVElORyBHRU5FIEFOTk8gREFUQSBGT1IgUC1OIExPT1BTXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSklPiUgXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgcGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKVxuXG5cbiMgQ291bnRpbmcgbnVtYmVyIG9mIGxvb3AgcGVyIGdlbmVzXG50ZW1wU3VtIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChwZWFrSUQsIGdlbmUsIEFubm8yKSAlPiUgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUgIHN1bW1hcml6ZShcbiAgICBwZWFrID0gbGlzdChwZWFrSUQpLFxuICAgIGFubm8yID0gbGlzdChBbm5vMiksXG4gICAgY291bnQgPSBuKCkpXG5cbmdncGxvdCh0ZW1wU3VtLCBhZXMoeCA9IGNvdW50KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIGdndGl0bGUoXFwjIG9mIFAtTiBsb29wcyBmb3IgZWFjaCBnZW5lXFwpICsgc2NhbGVfeV9sb2cxMCgpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# IMPORTING GENE ANNO DATA FOR P-N LOOPS
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))


# Counting number of loop per genes
tempSum <- geneAnnoData %>% dplyr::select(peakID, gene, Anno2) %>% unnest(gene) %>% group_by(gene) %>%  summarize(
    peak = list(peakID),
    anno2 = list(Anno2),
    count = n())

ggplot(tempSum, aes(x = count)) + geom_histogram(binwidth = 1) + theme_classic() + 
  ggtitle(\# of P-N loops for each gene\) + scale_y_log10()

###################################################################################



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkpUVkJQVWxSSlRrY2dSMFZPUlNCQlRrNVBJRVJCVkVFZ1JrOVNJRkF0VGlCTVQwOVFVMXh1Ym1GdFpTQThMU0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjWEZ4dVhHNW5aVzVsUVc1dWIwUmhkR0VnUEMwZ2JHOWhaRXh2YjNCQmJtNXZSR0YwWVNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDNBdGJsOWxibk5sYldKc1RHbHpkQzUwYzNaY1hDa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2FXWm1RM1YwYjJabUlEMGdNQzR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhibTV2VEdsemRDQTlJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWaGNYQ2twSlQ0bElGeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBjM1JoYm1ObElEMGdjM1JoY25ReUlDMGdjM1JoY25ReExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQmxZV3RKUkNBOUlIQmhjM1JsS0dOb2NtOXRNU3dnYzNSaGNuUXhMQ0J6ZEdGeWRESXNJSE5sY0NBOUlGeGNYMXhjS1NsY2JseHVYRzRqSUVOdmRXNTBhVzVuSUc1MWJXSmxjaUJ2WmlCc2IyOXdJSEJsY2lCblpXNWxjMXh1ZEdWdGNGTjFiU0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9jR1ZoYTBsRUxDQm5aVzVsTENCQmJtNXZNaWtnSlQ0bElIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bElDQnpkVzF0WVhKcGVtVW9YRzRnSUNBZ2NHVmhheUE5SUd4cGMzUW9jR1ZoYTBsRUtTeGNiaUFnSUNCaGJtNXZNaUE5SUd4cGMzUW9RVzV1YnpJcExGeHVJQ0FnSUdOdmRXNTBJRDBnYmlncEtWeHVYRzVuWjNCc2IzUW9kR1Z0Y0ZOMWJTd2dZV1Z6S0hnZ1BTQmpiM1Z1ZENrcElDc2daMlZ2YlY5b2FYTjBiMmR5WVcwb1ltbHVkMmxrZEdnZ1BTQXhLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQm5aM1JwZEd4bEtGeGNJeUJ2WmlCUUxVNGdiRzl2Y0hNZ1ptOXlJR1ZoWTJnZ1oyVnVaVnhjS1NBcklITmpZV3hsWDNsZmJHOW5NVEFvS1Z4dVhHNGpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJMXh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuIyBJTVBPUlRJTkcgR0VORSBBTk5PIERBVEEgRk9SIFAtTiBMT09QU1xubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgIHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSlcblxuXG4jIENvdW50aW5nIG51bWJlciBvZiBsb29wIHBlciBnZW5lc1xudGVtcFN1bSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QocGVha0lELCBnZW5lLCBBbm5vMikgJT4lIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lICBzdW1tYXJpemUoXG4gICAgcGVhayA9IGxpc3QocGVha0lEKSxcbiAgICBhbm5vMiA9IGxpc3QoQW5ubzIpLFxuICAgIGNvdW50ID0gbigpKVxuXG5nZ3Bsb3QodGVtcFN1bSwgYWVzKHggPSBjb3VudCkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcIyBvZiBQLU4gbG9vcHMgZm9yIGVhY2ggZ2VuZVxcKSArIHNjYWxlX3lfbG9nMTAoKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBJTVBPUlRJTkcgR0VORSBBTk5PIERBVEEgRk9SIFAtTiBMT09QU1xubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgIHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSlcblxuXG4jIENvdW50aW5nIG51bWJlciBvZiBsb29wIHBlciBnZW5lc1xudGVtcFN1bSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QocGVha0lELCBnZW5lLCBBbm5vMikgJT4lIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lICBzdW1tYXJpemUoXG4gICAgcGVhayA9IGxpc3QocGVha0lEKSxcbiAgICBhbm5vMiA9IGxpc3QoQW5ubzIpLFxuICAgIGNvdW50ID0gbigpKVxuXG5nZ3Bsb3QodGVtcFN1bSwgYWVzKHggPSBjb3VudCkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBnZ3RpdGxlKFxcIyBvZiBQLU4gbG9vcHMgZm9yIGVhY2ggZ2VuZVxcKSArIHNjYWxlX3lfbG9nMTAoKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuYGBgXG5gYGAifQ== -->

```r
```r
# IMPORTING GENE ANNO DATA FOR P-N LOOPS
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))


# Counting number of loop per genes
tempSum <- geneAnnoData %>% dplyr::select(peakID, gene, Anno2) %>% unnest(gene) %>% group_by(gene) %>%  summarize(
    peak = list(peakID),
    anno2 = list(Anno2),
    count = n())

ggplot(tempSum, aes(x = count)) + geom_histogram(binwidth = 1) + theme_classic() + 
  ggtitle(\# of P-N loops for each gene\) + scale_y_log10()

###################################################################################
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### P-S

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJKVFZCUFVsUkpUa2NnUjBWT1JTQkJUazVQSUVSQlZFRWdSazlTSUZBdFRpQk1UMDlRVTF4dWJtRnRaU0E4TFNCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY0lseHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgzQXRibDlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNJaWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptUTNWMGIyWm1JRDBnTUM0eUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVmhjSWlrcFhHNWNiblJsYlhCVFJTQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVWdaM0p2ZFhCZllua29aMlZ1WlNrZ0pUNGxJSE4xYlcxaGNtbDZaU2hUUlNBOUlHbG1aV3h6WlNoaGJua29RVzV1YjFORklEMDlJRndpVTBWY0lpa3NJREVzSURBcEtWeHVYRzVjYm1keWIzVndNU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSm5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQXhMblJ6ZGx3aUtTa2taMlZ1WlZ4dVozSnZkWEF5SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbWRsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjREl1ZEhOMlhDSXBLU1JuWlc1bFhHNW5jbTkxY0RVZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3TlM1MGMzWmNJaWtwSkdkbGJtVmNibWR5YjNWd09DQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKblpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBNExuUnpkbHdpS1Nra1oyVnVaVnh1WEc1Y2JuUmxiWEJUUlNBOExTQjBaVzF3VTBVZ0pUNGxJSEp2ZDNkcGMyVW9LU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hjYmlBZ1ozSnZkWEFnUFNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkeWIzVndNU3dnWENKbmNtOTFjREZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCbmNtOTFjRElzSUZ3aVozSnZkWEF5WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkeWIzVndOU3dnWENKbmNtOTFjRFZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2R5YjNWd09Dd2dYQ0puY205MWNEaGNJaXdnVGtFcEtTa3BLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcG1hV3gwWlhJb0lXbHpMbTVoS0dkeWIzVndLU2xjYmx4dWNHVnlZeTVuY205MWNERWdQQzBnYm5KdmR5aDBaVzF3VTBVZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1hDSm5jbTkxY0RGY0lpd2dVMFVnUFQwZ01Ta3BMMXh1SUNCdWNtOTNLSFJsYlhCVFJTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNJbWR5YjNWd01Wd2lLU2xjYmx4dWNHVnlZeTVuY205MWNESWdQQzBnYm5KdmR5aDBaVzF3VTBVZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1hDSm5jbTkxY0RKY0lpd2dVMFVnUFQwZ01Ta3BMMXh1SUNCdWNtOTNLSFJsYlhCVFJTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNJbWR5YjNWd01sd2lLU2xjYmx4dWNHVnlZeTVuY205MWNEVWdQQzBnYm5KdmR5aDBaVzF3VTBVZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1hDSm5jbTkxY0RWY0lpd2dVMFVnUFQwZ01Ta3BMMXh1SUNCdWNtOTNLSFJsYlhCVFJTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNJbWR5YjNWd05Wd2lLU2xjYmx4dWNHVnlZeTVuY205MWNEZ2dQQzBnYm5KdmR5aDBaVzF3VTBVZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1hDSm5jbTkxY0RoY0lpd2dVMFVnUFQwZ01Ta3BMMXh1SUNCdWNtOTNLSFJsYlhCVFJTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNJbWR5YjNWd09Gd2lLU2xjYmx4dWRHVnRjRkJzYjNRZ1BDMGdkR2xpWW14bEtHZHliM1Z3SUQwZ1l5aGNJbWR5YjNWd01Wd2lMQ0JjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3TlZ3aUxDQmNJbWR5YjNWd09Gd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd1pYSmpJRDBnWXlod1pYSmpMbWR5YjNWd01Td2djR1Z5WXk1bmNtOTFjRElzSUhCbGNtTXVaM0p2ZFhBMUxDQndaWEpqTG1keWIzVndPQ2twWEc1Y2JtZG5jR3h2ZENoMFpXMXdVR3h2ZEN3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlIQmxjbU1wS1NBcklHZGxiMjFmY0c5cGJuUW9LU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUhsc2FXMG9NQ3dnTUM0eUtWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuIyBJTVBPUlRJTkcgR0VORSBBTk5PIERBVEEgRk9SIFAtTiBMT09QU1xubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpXG5cbnRlbXBTRSA8LSBnZW5lQW5ub0RhdGEgJT4lIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lIHN1bW1hcml6ZShTRSA9IGlmZWxzZShhbnkoQW5ub1NFID09IFxcU0VcXCksIDEsIDApKVxuXG5cbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDIudHN2XFwpKSRnZW5lXG5ncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwNS50c3ZcXCkpJGdlbmVcbmdyb3VwOCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA4LnRzdlxcKSkkZ2VuZVxuXG5cbnRlbXBTRSA8LSB0ZW1wU0UgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZ2VuZSAlaW4lIGdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdyb3VwNSwgXFxncm91cDVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdyb3VwOCwgXFxncm91cDhcXCwgTkEpKSkpKSAlPiUgXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxucGVyYy5ncm91cDEgPC0gbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDFcXCwgU0UgPT0gMSkpL1xuICBucm93KHRlbXBTRSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMVxcKSlcblxucGVyYy5ncm91cDIgPC0gbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDJcXCwgU0UgPT0gMSkpL1xuICBucm93KHRlbXBTRSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMlxcKSlcblxucGVyYy5ncm91cDUgPC0gbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDVcXCwgU0UgPT0gMSkpL1xuICBucm93KHRlbXBTRSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwNVxcKSlcblxucGVyYy5ncm91cDggPC0gbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDhcXCwgU0UgPT0gMSkpL1xuICBucm93KHRlbXBTRSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwOFxcKSlcblxudGVtcFBsb3QgPC0gdGliYmxlKGdyb3VwID0gYyhcXGdyb3VwMVxcLCBcXGdyb3VwMlxcLCBcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSxcbiAgICAgICAgICAgICAgICAgICBwZXJjID0gYyhwZXJjLmdyb3VwMSwgcGVyYy5ncm91cDIsIHBlcmMuZ3JvdXA1LCBwZXJjLmdyb3VwOCkpXG5cbmdncGxvdCh0ZW1wUGxvdCwgYWVzKHggPSBncm91cCwgeSA9IHBlcmMpKSArIGdlb21fcG9pbnQoKSArIHRoZW1lX2NsYXNzaWMoKSArIHlsaW0oMCwgMC4yKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# IMPORTING GENE ANNO DATA FOR P-N LOOPS
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))

tempSE <- geneAnnoData %>% unnest(gene) %>% group_by(gene) %>% summarize(SE = ifelse(any(AnnoSE == \SE\), 1, 0))


group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene


tempSE <- tempSE %>% rowwise() %>% dplyr::mutate(
  group = ifelse(gene %in% group1, \group1\,
                 ifelse(gene %in% group2, \group2\,
                        ifelse(gene %in% group5, \group5\,
                               ifelse(gene %in% group8, \group8\, NA))))) %>% 
  dplyr::filter(!is.na(group))

perc.group1 <- nrow(tempSE %>% dplyr::filter(group == \group1\, SE == 1))/
  nrow(tempSE %>% dplyr::filter(group == \group1\))

perc.group2 <- nrow(tempSE %>% dplyr::filter(group == \group2\, SE == 1))/
  nrow(tempSE %>% dplyr::filter(group == \group2\))

perc.group5 <- nrow(tempSE %>% dplyr::filter(group == \group5\, SE == 1))/
  nrow(tempSE %>% dplyr::filter(group == \group5\))

perc.group8 <- nrow(tempSE %>% dplyr::filter(group == \group8\, SE == 1))/
  nrow(tempSE %>% dplyr::filter(group == \group8\))

tempPlot <- tibble(group = c(\group1\, \group2\, \group5\, \group8\),
                   perc = c(perc.group1, perc.group2, perc.group5, perc.group8))

ggplot(tempPlot, aes(x = group, y = perc)) + geom_point() + theme_classic() + ylim(0, 0.2)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkpUVkJQVWxSSlRrY2dSMFZPUlNCQlRrNVBJRVJCVkVFZ1JrOVNJRkF0VGlCTVQwOVFVMXh1Ym1GdFpTQThMU0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjWEZ4dVhHNW5aVzVsUVc1dWIwUmhkR0VnUEMwZ2JHOWhaRXh2YjNCQmJtNXZSR0YwWVNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDNBdGJsOWxibk5sYldKc1RHbHpkQzUwYzNaY1hDa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2FXWm1RM1YwYjJabUlEMGdNQzR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhibTV2VEdsemRDQTlJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWaGNYQ2twWEc1Y2JuUmxiWEJUUlNBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bElITjFiVzFoY21sNlpTaFRSU0E5SUdsbVpXeHpaU2hoYm5rb1FXNXViMU5GSUQwOUlGeGNVMFZjWENrc0lERXNJREFwS1Z4dVhHNWNibWR5YjNWd01TQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4blpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBeExuUnpkbHhjS1Nra1oyVnVaVnh1WjNKdmRYQXlJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNESXVkSE4yWEZ3cEtTUm5aVzVsWEc1bmNtOTFjRFVnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJkeWIzVndOUzUwYzNaY1hDa3BKR2RsYm1WY2JtZHliM1Z3T0NBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhuWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlozSnZkWEE0TG5SemRseGNLU2trWjJWdVpWeHVYRzVjYm5SbGJYQlRSU0E4TFNCMFpXMXdVMFVnSlQ0bElISnZkM2RwYzJVb0tTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnWjNKdmRYQWdQU0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2R5YjNWd01Td2dYRnhuY205MWNERmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuY205MWNESXNJRnhjWjNKdmRYQXlYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2R5YjNWd05Td2dYRnhuY205MWNEVmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZHliM1Z3T0N3Z1hGeG5jbTkxY0RoY1hDd2dUa0VwS1NrcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvSVdsekxtNWhLR2R5YjNWd0tTbGNibHh1Y0dWeVl5NW5jbTkxY0RFZ1BDMGdibkp2ZHloMFpXMXdVMFVnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWEZ4bmNtOTFjREZjWEN3Z1UwVWdQVDBnTVNrcEwxeHVJQ0J1Y205M0tIUmxiWEJUUlNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY1hHZHliM1Z3TVZ4Y0tTbGNibHh1Y0dWeVl5NW5jbTkxY0RJZ1BDMGdibkp2ZHloMFpXMXdVMFVnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWEZ4bmNtOTFjREpjWEN3Z1UwVWdQVDBnTVNrcEwxeHVJQ0J1Y205M0tIUmxiWEJUUlNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY1hHZHliM1Z3TWx4Y0tTbGNibHh1Y0dWeVl5NW5jbTkxY0RVZ1BDMGdibkp2ZHloMFpXMXdVMFVnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWEZ4bmNtOTFjRFZjWEN3Z1UwVWdQVDBnTVNrcEwxeHVJQ0J1Y205M0tIUmxiWEJUUlNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY1hHZHliM1Z3TlZ4Y0tTbGNibHh1Y0dWeVl5NW5jbTkxY0RnZ1BDMGdibkp2ZHloMFpXMXdVMFVnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWEZ4bmNtOTFjRGhjWEN3Z1UwVWdQVDBnTVNrcEwxeHVJQ0J1Y205M0tIUmxiWEJUUlNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY1hHZHliM1Z3T0Z4Y0tTbGNibHh1ZEdWdGNGQnNiM1FnUEMwZ2RHbGlZbXhsS0dkeWIzVndJRDBnWXloY1hHZHliM1Z3TVZ4Y0xDQmNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndOVnhjTENCY1hHZHliM1Z3T0Z4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J3WlhKaklEMGdZeWh3WlhKakxtZHliM1Z3TVN3Z2NHVnlZeTVuY205MWNESXNJSEJsY21NdVozSnZkWEExTENCd1pYSmpMbWR5YjNWd09Da3BYRzVjYm1kbmNHeHZkQ2gwWlcxd1VHeHZkQ3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUhCbGNtTXBLU0FySUdkbGIyMWZjRzlwYm5Rb0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJSGxzYVcwb01Dd2dNQzR5S1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbiMgSU1QT1JUSU5HIEdFTkUgQU5OTyBEQVRBIEZPUiBQLU4gTE9PUFNcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKVxuXG50ZW1wU0UgPC0gZ2VuZUFubm9EYXRhICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSBzdW1tYXJpemUoU0UgPSBpZmVsc2UoYW55KEFubm9TRSA9PSBcXFNFXFwpLCAxLCAwKSlcblxuXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAyLnRzdlxcKSkkZ2VuZVxuZ3JvdXA1IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDUudHN2XFwpKSRnZW5lXG5ncm91cDggPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwOC50c3ZcXCkpJGdlbmVcblxuXG50ZW1wU0UgPC0gdGVtcFNFICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGdlbmUgJWluJSBncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ3JvdXAyLCBcXGdyb3VwMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBncm91cDgsIFxcZ3JvdXA4XFwsIE5BKSkpKSkgJT4lIFxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cbnBlcmMuZ3JvdXAxIDwtIG5yb3codGVtcFNFICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXAxXFwsIFNFID09IDEpKS9cbiAgbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDFcXCkpXG5cbnBlcmMuZ3JvdXAyIDwtIG5yb3codGVtcFNFICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXAyXFwsIFNFID09IDEpKS9cbiAgbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDJcXCkpXG5cbnBlcmMuZ3JvdXA1IDwtIG5yb3codGVtcFNFICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXA1XFwsIFNFID09IDEpKS9cbiAgbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDVcXCkpXG5cbnBlcmMuZ3JvdXA4IDwtIG5yb3codGVtcFNFICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXA4XFwsIFNFID09IDEpKS9cbiAgbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDhcXCkpXG5cbnRlbXBQbG90IDwtIHRpYmJsZShncm91cCA9IGMoXFxncm91cDFcXCwgXFxncm91cDJcXCwgXFxncm91cDVcXCwgXFxncm91cDhcXCksXG4gICAgICAgICAgICAgICAgICAgcGVyYyA9IGMocGVyYy5ncm91cDEsIHBlcmMuZ3JvdXAyLCBwZXJjLmdyb3VwNSwgcGVyYy5ncm91cDgpKVxuXG5nZ3Bsb3QodGVtcFBsb3QsIGFlcyh4ID0gZ3JvdXAsIHkgPSBwZXJjKSkgKyBnZW9tX3BvaW50KCkgKyB0aGVtZV9jbGFzc2ljKCkgKyB5bGltKDAsIDAuMilcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBJTVBPUlRJTkcgR0VORSBBTk5PIERBVEEgRk9SIFAtTiBMT09QU1xubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpXG5cbnRlbXBTRSA8LSBnZW5lQW5ub0RhdGEgJT4lIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lIHN1bW1hcml6ZShTRSA9IGlmZWxzZShhbnkoQW5ub1NFID09IFxcU0VcXCksIDEsIDApKVxuXG5cbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDIudHN2XFwpKSRnZW5lXG5ncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwNS50c3ZcXCkpJGdlbmVcbmdyb3VwOCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA4LnRzdlxcKSkkZ2VuZVxuXG5cbnRlbXBTRSA8LSB0ZW1wU0UgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZ2VuZSAlaW4lIGdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdyb3VwNSwgXFxncm91cDVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdyb3VwOCwgXFxncm91cDhcXCwgTkEpKSkpKSAlPiUgXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxucGVyYy5ncm91cDEgPC0gbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDFcXCwgU0UgPT0gMSkpL1xuICBucm93KHRlbXBTRSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMVxcKSlcblxucGVyYy5ncm91cDIgPC0gbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDJcXCwgU0UgPT0gMSkpL1xuICBucm93KHRlbXBTRSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMlxcKSlcblxucGVyYy5ncm91cDUgPC0gbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDVcXCwgU0UgPT0gMSkpL1xuICBucm93KHRlbXBTRSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwNVxcKSlcblxucGVyYy5ncm91cDggPC0gbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDhcXCwgU0UgPT0gMSkpL1xuICBucm93KHRlbXBTRSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwOFxcKSlcblxudGVtcFBsb3QgPC0gdGliYmxlKGdyb3VwID0gYyhcXGdyb3VwMVxcLCBcXGdyb3VwMlxcLCBcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSxcbiAgICAgICAgICAgICAgICAgICBwZXJjID0gYyhwZXJjLmdyb3VwMSwgcGVyYy5ncm91cDIsIHBlcmMuZ3JvdXA1LCBwZXJjLmdyb3VwOCkpXG5cbmdncGxvdCh0ZW1wUGxvdCwgYWVzKHggPSBncm91cCwgeSA9IHBlcmMpKSArIGdlb21fcG9pbnQoKSArIHRoZW1lX2NsYXNzaWMoKSArIHlsaW0oMCwgMC4yKVxuYGBgXG5gYGAifQ== -->

```r
```r
# IMPORTING GENE ANNO DATA FOR P-N LOOPS
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))

tempSE <- geneAnnoData %>% unnest(gene) %>% group_by(gene) %>% summarize(SE = ifelse(any(AnnoSE == \SE\), 1, 0))


group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene


tempSE <- tempSE %>% rowwise() %>% dplyr::mutate(
  group = ifelse(gene %in% group1, \group1\,
                 ifelse(gene %in% group2, \group2\,
                        ifelse(gene %in% group5, \group5\,
                               ifelse(gene %in% group8, \group8\, NA))))) %>% 
  dplyr::filter(!is.na(group))

perc.group1 <- nrow(tempSE %>% dplyr::filter(group == \group1\, SE == 1))/
  nrow(tempSE %>% dplyr::filter(group == \group1\))

perc.group2 <- nrow(tempSE %>% dplyr::filter(group == \group2\, SE == 1))/
  nrow(tempSE %>% dplyr::filter(group == \group2\))

perc.group5 <- nrow(tempSE %>% dplyr::filter(group == \group5\, SE == 1))/
  nrow(tempSE %>% dplyr::filter(group == \group5\))

perc.group8 <- nrow(tempSE %>% dplyr::filter(group == \group8\, SE == 1))/
  nrow(tempSE %>% dplyr::filter(group == \group8\))

tempPlot <- tibble(group = c(\group1\, \group2\, \group5\, \group8\),
                   perc = c(perc.group1, perc.group2, perc.group5, perc.group8))

ggplot(tempPlot, aes(x = group, y = perc)) + geom_point() + theme_classic() + ylim(0, 0.2)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## [2.11] How many loops per gene?

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjR3h2ZEY5cGJuTlRZMjl5WlNBOExTQm1kVzVqZEdsdmJpaDBaVzF3TG5SaUxDQnViM1JsTENCNWJXbHVJRDBnTUN3Z2VXMWhlQ0E5SURFdU5TbDdYRzRnSUhBeE1pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ3aVozSnZkWEF4WENJc0lGd2laM0p2ZFhBeVhDSXBMQ0ExS1Z4dUlDQndNVFVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbWR5YjNWd01Wd2lMQ0JjSW1keWIzVndOVndpS1N3Z05TbGNiaUFnY0RFNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWENKbmNtOTFjREZjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc0Z0lIQXlOU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGd2laM0p2ZFhBeVhDSXNJRndpWjNKdmRYQTFYQ0lwTENBMUtWeHVJQ0J3TWpnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3T0Z3aUtTd2dOU2xjYmlBZ2NEVTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hDSm5jbTkxY0RWY0lpd2dYQ0puY205MWNEaGNJaWtzSURVcFhHNGdJRnh1SUNCd0lEd3RJR2RuY0d4dmRDaDBaVzF3TG5SaUxDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdjMk52Y21VcEtTQXJJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ1ozSnZkWEFwTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJJRnh1SUNBZ0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJYRzRnSUNBZ2MzUmhkRjl6ZFcxdFlYSjVLR0ZsY3lobmNtOTFjQ0E5SUdkeWIzVndLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNJbkpsWkZ3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpa2dLMXh1SUNBZ0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHTnZiM0prWDJOaGNuUmxjMmxoYmloNWJHbHRJRDBnWXloNWJXbHVMQ0I1YldGNEtTa2dLMXh1SUNBZ0lHRnVibTkwWVhSbEtGd2lkR1Y0ZEZ3aUxDQjRJRDBnTVN3Z2VTQTlJSGx0YVc0Z0t5QXhMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkF4TWpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0RFeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNERTFPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNVFVwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3TVRnNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeE9Da3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQXlOVG9nWENJc0lHTnZiblpRZG1Gc2RXVW9jREkxS1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0RJNE9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod01qZ3BMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndOVGc2SUZ3aUxHTnZiblpRZG1Gc2RXVW9JSEExT0Nrc0lGd2lYRnh1WENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektWeHVJQ0JjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW1sdWMzVnNZWFJwYjI1ZmMyTnZjbVZmWENJc0lHNXZkR1VwWEc0Z0lHaGxhV2RvZENBOExTQXpYRzRnSUhkcFpIUm9JRHd0SUROY2JpQWdjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUlDQndjbWx1ZENod0tWeHVJQ0JrWlhZdWIyWm1LQ2xjYmlBZ2MzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVJQ0J3Y21sdWRDaHdLVnh1SUNCa1pYWXViMlptS0NsY2JuMWNibHh1SXlCRVRWTlBYRzUwWlcxd0xuUmlJRHd0SUdkbGJtVXVhVzV6VTJOdmNtVWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHSnZkVzVrWVhKNVNXNXpVMk52Y21WZlJFMVRUeWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXVkR0lwSUR3dElHTW9YQ0puY205MWNGd2lMQ0JjSW5OamIzSmxYQ0lwWEc1d2JHOTBYMmx1YzFOamIzSmxLSFJsYlhBdWRHSXNJRndpYm1WaGNtVnpkRUp2ZFc1a1lYSjVYMFJOVTA5Y0lpbGNibHh1WEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5wbG90X2luc1Njb3JlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMS41KXtcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gIHAxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4gIHAyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwNTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTU6IFxcLCBjb252UHZhbHVlKHAxNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxODogXFwsIGNvbnZQdmFsdWUocDE4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI1OiBcXCwgY29udlB2YWx1ZShwMjUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjg6IFxcLCBjb252UHZhbHVlKHAyOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA1ODogXFwsY29udlB2YWx1ZSggcDU4KSwgXFxcXG5cXCksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbl9zY29yZV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIERNU09cbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfRE1TT1xcKVxuXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
plot_insScore <- function(temp.tb, note, ymin = 0, ymax = 1.5){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNHeHZkRjlwYm5OVFkyOXlaU0E4TFNCbWRXNWpkR2x2YmloMFpXMXdMblJpTENCdWIzUmxMQ0I1YldsdUlEMGdNQ3dnZVcxaGVDQTlJREV1TlNsN1hHNGdJSEF4TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRnhjWjNKdmRYQXhYRndzSUZ4Y1ozSnZkWEF5WEZ3cExDQTFLVnh1SUNCd01UVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hHZHliM1Z3TVZ4Y0xDQmNYR2R5YjNWd05WeGNLU3dnTlNsY2JpQWdjREU0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYRnhuY205MWNERmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzRnSUhBeU5TQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ4Y1ozSnZkWEF5WEZ3c0lGeGNaM0p2ZFhBMVhGd3BMQ0ExS1Z4dUlDQndNamdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndPRnhjS1N3Z05TbGNiaUFnY0RVNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWEZ4bmNtOTFjRFZjWEN3Z1hGeG5jbTkxY0RoY1hDa3NJRFVwWEc0Z0lGeHVJQ0J3SUR3dElHZG5jR3h2ZENoMFpXMXdMblJpTENCaFpYTW9lQ0E5SUdkeWIzVndMQ0I1SUQwZ2MyTnZjbVVwS1NBcklHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnWjNKdmRYQXBMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBcklGeHVJQ0FnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBclhHNGdJQ0FnYzNSaGRGOXpkVzF0WVhKNUtHRmxjeWhuY205MWNDQTlJR2R5YjNWd0tTd2dablZ1SUQwZ2JXVmhiaXdnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURJc0lHWnBiR3dnUFNCY1hISmxaRnhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWENrZ0sxeHVJQ0FnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWg1YldsdUxDQjViV0Y0S1NrZ0sxeHVJQ0FnSUdGdWJtOTBZWFJsS0Z4Y2RHVjRkRnhjTENCNElEMGdNU3dnZVNBOUlIbHRhVzRnS3lBeExDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQXhNam9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jREV5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0RFMU9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod01UVXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdNVGc2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF4T0Nrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhBeU5Ub2dYRndzSUdOdmJuWlFkbUZzZFdVb2NESTFLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjREk0T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3TWpncExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d05UZzZJRnhjTEdOdmJuWlFkbUZzZFdVb0lIQTFPQ2tzSUZ4Y1hGeHVYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F6S1Z4dUlDQmNiaUFnWEc0Z0lHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYR2x1YzNWc1lYUnBiMjVmYzJOdmNtVmZYRndzSUc1dmRHVXBYRzRnSUdobGFXZG9kQ0E4TFNBelhHNGdJSGRwWkhSb0lEd3RJRE5jYmlBZ2NHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1SUNCd2NtbHVkQ2h3S1Z4dUlDQmtaWFl1YjJabUtDbGNiaUFnYzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUlDQndjbWx1ZENod0tWeHVJQ0JrWlhZdWIyWm1LQ2xjYm4xY2JseHVJeUJFVFZOUFhHNTBaVzF3TG5SaUlEd3RJR2RsYm1VdWFXNXpVMk52Y21VZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1ozSnZkWEFzSUdKdmRXNWtZWEo1U1c1elUyTnZjbVZmUkUxVFR5bGNibU52Ykc1aGJXVnpLSFJsYlhBdWRHSXBJRHd0SUdNb1hGeG5jbTkxY0Z4Y0xDQmNYSE5qYjNKbFhGd3BYRzV3Ykc5MFgybHVjMU5qYjNKbEtIUmxiWEF1ZEdJc0lGeGNibVZoY21WemRFSnZkVzVrWVhKNVgwUk5VMDljWENsY2JseHVYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxucGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5bWluLCB5bWF4KSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IHltaW4gKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNTogXFwsIGNvbnZQdmFsdWUocDI1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25fc2NvcmVfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cblxuIyBETVNPXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfRE1TTylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X0RNU09cXClcblxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5bWluLCB5bWF4KSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IHltaW4gKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNTogXFwsIGNvbnZQdmFsdWUocDI1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25fc2NvcmVfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cblxuIyBETVNPXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfRE1TTylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X0RNU09cXClcblxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
plot_insScore <- function(temp.tb, note, ymin = 0, ymax = 1.5){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO\)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


## [2.11.2] SuperEnhancer?

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnYkc5aFpFeHZiM0JCYm01dlJHRjBZU2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYM0F0Ymw5bGJuTmxiV0pzVEdsemRDNTBjM1pjSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVdabVEzVjBiMlptSUQwZ01DNHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaGJtNXZUR2x6ZENBOUlHTW9YQ0pRTFZCY0lpd2dYQ0pRTFVWY0lpd2dYQ0pRTFZOY0lpd2dYQ0pRTFZoY0lpa3BKVDRsSUZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dScGMzUmhibU5sSUQwZ2MzUmhjblF5SUMwZ2MzUmhjblF4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCbFlXdEpSQ0E5SUhCaGMzUmxLR05vY205dE1Td2djM1JoY25ReExDQnpkR0Z5ZERJc0lITmxjQ0E5SUZ3aVgxd2lLU2xjYmx4dVhHNGpJeUJFYVhacFpHbHVaeUJuWlc1bGN5QnBiblJ2SUdkeWIzVndjMXh1ZEdWdGNDQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbG1abDlrVkVGSFgwUk5VMDhzSUdScGMzUmhibU5sTENCblpXNWxLU0FsUGlVZ1hHNGdJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVWdaM0p2ZFhCZllua29aMlZ1WlNrZ0pUNGxYRzRnSUhOMWJXMWhjbWw2WlNodFpXRnVYMlJwWm1aZmMyTnZjbVVnUFNCdFpXRnVLR1JwWm1aZlpGUkJSMTlFVFZOUEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUcxbFlXNWZaR2x6ZEdGdVkyVWdQU0J0WldGdUtHUnBjM1JoYm1ObEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUM1bmNtOTFjSE1nUFNBblpISnZjQ2NwWEc1Y2JtUnBabVl1VWs1QklEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1ScFptWmZSekV1WkZSQlIxOUhNUzR5YVM1a1ZFRkhYM1p6WDBjeExqSnBMa1JOVTA4dWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGxibk5sYldKc1gyZGxibVZmYVdRc0lHeHZaekpHYjJ4a1EyaGhibWRsTENCemFISnBibXRsWkY5c2IyY3lSa01zSUhCaFpHb3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU2xjYmx4dWJXRjRURzluTWtaRElEMGdNbHh1WEc1MFpXMXdJRHd0SUd4bFpuUmZhbTlwYmloMFpXMXdMQ0JrYVdabUxsSk9RU3dnWW5rZ1BTQmpLRndpWjJWdVpWd2lJRDBnWENKbGJuTmxiV0pzWDJkbGJtVmZhV1JjSWlrcElDVStKU0JjYmlBZ1pISnZjRjl1WVNoemFISnBibXRsWkY5c2IyY3lSa01wWEc1Y2JseHVkR1Z0Y0NBOExTQjBaVzF3SUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHZHliM1Z3SUQwZ2FXWmxiSE5sS0hCaFpHb2dQQ0F3TGpBMUlDWWdjMmh5YVc1clpXUmZiRzluTWtaRElEd2dNQ3dnTVN3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLRzFsWVc1ZlpHbG1abDl6WTI5eVpTQThJREFzSURJc0lETXBLU2xjYmx4dVhHNWNibVpqUTNWMGIyWm1JRHd0SURBdU5WeHVaR2xtWmtOMWRHOW1aaUE4TFNBd0xqSmNibHh1WjJWdVpTNW5jbTkxY0RFZ1BDMGdLSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ01Ta3BKR2RsYm1WY2JtZGxibVV1WjNKdmRYQXlJRHd0SUNoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRElwS1NSblpXNWxYRzVtZDNKcGRHVW9LSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ01Ta3BMQ0JvWlhKbEtISmxaa1JwY2l3Z1hDSm5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWW1sdVlYSjVSM0p2ZFhBeExuUnpkbHdpS1N3Z2MyVndJRDBnWENKY1hIUmNJaWxjYm1aM2NtbDBaU2dvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQXlLU2tzSUdobGNtVW9jbVZtUkdseUxDQmNJbWRsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNESXVkSE4yWENJcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVhHNWNiaU1nUVdSa2FXNW5JR2R5YjNWd0lHbHVabTl5YldGMGFXOXVJSFJ2SUdkbGJtVkJibTV2WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0IxYm01bGMzUW9aMlZ1WlNrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1hHNGdJR2R5YjNWd0lEMGdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsTG1keWIzVndNU3dnWENKbmNtOTFjREZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCblpXNWxMbWR5YjNWd01pd2dYQ0puY205MWNESmNJaXdnVGtFcEtWeHVLVnh1WEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSklPiUgXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgcGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKVxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9kVEFHX0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxuXG50ZW1wIDwtIHRlbXAgJT4lXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBpZmVsc2UocGFkaiA8IDAuMDUgJiBzaHJpbmtlZF9sb2cyRkMgPCAwLCAxLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobWVhbl9kaWZmX3Njb3JlIDwgMCwgMiwgMykpKVxuXG5cblxuZmNDdXRvZmYgPC0gMC41XG5kaWZmQ3V0b2ZmIDwtIDAuMlxuXG5nZW5lLmdyb3VwMSA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAxKSkkZ2VuZVxuZ2VuZS5ncm91cDIgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMikpJGdlbmVcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAxKSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDIpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cblxuIyBBZGRpbmcgZ3JvdXAgaW5mb3JtYXRpb24gdG8gZ2VuZUFubm9cbmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIHVubmVzdChnZW5lKSAlPiUgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAxLCBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAyLCBcXGdyb3VwMlxcLCBOQSkpXG4pXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))


## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)


temp <- temp %>%
  dplyr::mutate(group = ifelse(padj < 0.05 & shrinked_log2FC < 0, 1, 
                               ifelse(mean_diff_score < 0, 2, 3)))



fcCutoff <- 0.5
diffCutoff <- 0.2

gene.group1 <- (temp %>% dplyr::filter(group == 1))$gene
gene.group2 <- (temp %>% dplyr::filter(group == 2))$gene
fwrite((temp %>% dplyr::filter(group == 1)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 2)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\), sep = \\t\)


# Adding group information to geneAnno
geneAnnoData <- geneAnnoData %>% unnest(gene) %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\, NA))
)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gzQXRibDlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptUTNWMGIyWm1JRDBnTUM0eUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hGeFFMVkJjWEN3Z1hGeFFMVVZjWEN3Z1hGeFFMVk5jWEN3Z1hGeFFMVmhjWENrcEpUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJsWVd0SlJDQTlJSEJoYzNSbEtHTm9jbTl0TVN3Z2MzUmhjblF4TENCemRHRnlkRElzSUhObGNDQTlJRnhjWDF4Y0tTbGNibHh1WEc0akl5QkVhWFpwWkdsdVp5Qm5aVzVsY3lCcGJuUnZJR2R5YjNWd2MxeHVkR1Z0Y0NBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsbVpsOWtWRUZIWDBSTlUwOHNJR1JwYzNSaGJtTmxMQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0J0WldGdUtHUnBabVpmWkZSQlIxOUVUVk5QS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzFsWVc1ZlpHbHpkR0Z1WTJVZ1BTQnRaV0Z1S0dScGMzUmhibU5sS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzVjYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR1JwWm1aZlJ6RXVaRlJCUjE5SE1TNHlhUzVrVkVGSFgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibHh1YldGNFRHOW5Na1pESUQwZ01seHVYRzUwWlcxd0lEd3RJR3hsWm5SZmFtOXBiaWgwWlcxd0xDQmthV1ptTGxKT1FTd2dZbmtnUFNCaktGeGNaMlZ1WlZ4Y0lEMGdYRnhsYm5ObGJXSnNYMmRsYm1WZmFXUmNYQ2twSUNVK0pTQmNiaUFnWkhKdmNGOXVZU2h6YUhKcGJtdGxaRjlzYjJjeVJrTXBYRzVjYmx4dWRHVnRjQ0E4TFNCMFpXMXdJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dkeWIzVndJRDBnYVdabGJITmxLSEJoWkdvZ1BDQXdMakExSUNZZ2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z01Dd2dNU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHMWxZVzVmWkdsbVpsOXpZMjl5WlNBOElEQXNJRElzSURNcEtTbGNibHh1WEc1Y2JtWmpRM1YwYjJabUlEd3RJREF1TlZ4dVpHbG1aa04xZEc5bVppQThMU0F3TGpKY2JseHVaMlZ1WlM1bmNtOTFjREVnUEMwZ0tIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnTVNrcEpHZGxibVZjYm1kbGJtVXVaM0p2ZFhBeUlEd3RJQ2gwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlESXBLU1JuWlc1bFhHNW1kM0pwZEdVb0tIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnTVNrcExDQm9aWEpsS0hKbFprUnBjaXdnWEZ4blpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZZbWx1WVhKNVIzSnZkWEF4TG5SemRseGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDbGNibVozY21sMFpTZ29kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNBeUtTa3NJR2hsY21Vb2NtVm1SR2x5TENCY1hHZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjlpYVc1aGNubEhjbTkxY0RJdWRITjJYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1WEc1Y2JpTWdRV1JrYVc1bklHZHliM1Z3SUdsdVptOXliV0YwYVc5dUlIUnZJR2RsYm1WQmJtNXZYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQjFibTVsYzNRb1oyVnVaU2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lHZHliM1Z3SUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCblpXNWxMbWR5YjNWd01Td2dYRnhuY205MWNERmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bExtZHliM1Z3TWl3Z1hGeG5jbTkxY0RKY1hDd2dUa0VwS1Z4dUtWeHVYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgIHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSlcblxuXG4jIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwc1xudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9kVEFHX0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSxcbiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSxcbiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcblxubWF4TG9nMkZDID0gMlxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpXG5cblxudGVtcCA8LSB0ZW1wICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gaWZlbHNlKHBhZGogPCAwLjA1ICYgc2hyaW5rZWRfbG9nMkZDIDwgMCwgMSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG1lYW5fZGlmZl9zY29yZSA8IDAsIDIsIDMpKSlcblxuXG5cbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZkN1dG9mZiA8LSAwLjJcblxuZ2VuZS5ncm91cDEgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMSkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDIpKSRnZW5lXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMSkpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAyKSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cbiMgQWRkaW5nIGdyb3VwIGluZm9ybWF0aW9uIHRvIGdlbmVBbm5vXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMiwgXFxncm91cDJcXCwgTkEpKVxuKVxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgIHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSlcblxuXG4jIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwc1xudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9kVEFHX0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSxcbiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSxcbiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcblxubWF4TG9nMkZDID0gMlxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpXG5cblxudGVtcCA8LSB0ZW1wICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gaWZlbHNlKHBhZGogPCAwLjA1ICYgc2hyaW5rZWRfbG9nMkZDIDwgMCwgMSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG1lYW5fZGlmZl9zY29yZSA8IDAsIDIsIDMpKSlcblxuXG5cbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZkN1dG9mZiA8LSAwLjJcblxuZ2VuZS5ncm91cDEgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMSkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDIpKSRnZW5lXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMSkpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAyKSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cbiMgQWRkaW5nIGdyb3VwIGluZm9ybWF0aW9uIHRvIGdlbmVBbm5vXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMiwgXFxncm91cDJcXCwgTkEpKVxuKVxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))


## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)


temp <- temp %>%
  dplyr::mutate(group = ifelse(padj < 0.05 & shrinked_log2FC < 0, 1, 
                               ifelse(mean_diff_score < 0, 2, 3)))



fcCutoff <- 0.5
diffCutoff <- 0.2

gene.group1 <- (temp %>% dplyr::filter(group == 1))$gene
gene.group2 <- (temp %>% dplyr::filter(group == 2))$gene
fwrite((temp %>% dplyr::filter(group == 1)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 2)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\), sep = \\t\)


# Adding group information to geneAnno
geneAnnoData <- geneAnnoData %>% unnest(gene) %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\, NA))
)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzVuWlc1bExtZHliM1Z3TVNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0puWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlltbHVZWEo1UjNKdmRYQXhMblJ6ZGx3aUtTa2taMlZ1WlZ4dVoyVnVaUzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMkpwYm1GeWVVZHliM1Z3TWk1MGMzWmNJaWtwSkdkbGJtVmNibHh1UjA4eElEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsTG1keWIzVndNU3dnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUxDQnlaV0ZrWVdKc1pTQTlJRlJTVlVVcFhHNUhUeklnUEMwZ1pXNXlhV05vUjA4b1oyVnVaU0E5SUdkbGJtVXVaM0p2ZFhBeUxDQlBjbWRFWWlBOUlHOXlaeTVOYlM1bFp5NWtZaXdnYTJWNVZIbHdaU0E5SUZ3aVJVNVRSVTFDVEZ3aUxDQnZiblFnUFNCY0lrSlFYQ0lzSUhKbFlXUmhZbXhsSUQwZ1ZGSlZSU2xjYmtkUE1TNWtaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLRWRQTVNsY2JrZFBNaTVrWmlBOExTQmhjeTVrWVhSaExtWnlZVzFsS0VkUE1pbGNiaU1nWm5keWFYUmxLRWRQTVM1a1ppd2dhR1Z5WlNoY0lrZFBYMkpwYm1GeWVWOW5jbTkxY0RFdWRITjJYQ0lwTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1SXlCbWQzSnBkR1VvUjA4eUxtUm1MQ0JvWlhKbEtGd2lSMDlmWW1sdVlYSjVYMmR5YjNWd01pNTBjM1pjSWlrc0lITmxjQ0E5SUZ3aVhGeDBYQ0lwWEc1SFR6RXVaR1lnUEMwZ1puSmxZV1FvYUdWeVpTaGNJa2RQWDJKcGJtRnllVjluY205MWNERXVkSE4yWENJcEtWeHVSMDh5TG1SbUlEd3RJR1p5WldGa0tHaGxjbVVvWENKSFQxOWlhVzVoY25sZlozSnZkWEF5TG5SemRsd2lLU2xjYmx4dWMzVmljMlYwTVNBOExTQkhUekV1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGd2lSM0p2ZFhBZ01Wd2lLU0FsUGlWY2JpQWdaSEJzZVhJNk9tRnljbUZ1WjJVb2NDNWhaR3AxYzNRcFhHNXpkV0p6WlhReEpFZGxibVZTWVhScGJ5QThMU0J6WVhCd2JIa29jM1J5YzNCc2FYUW9jM1ZpYzJWME1TUkhaVzVsVW1GMGFXOHNJRndpTDF3aUtTd2dablZ1WTNScGIyNG9lQ2tnWVhNdWJuVnRaWEpwWXloNFd6RmRLU0F2SUdGekxtNTFiV1Z5YVdNb2VGc3lYU2twWEc1Y2JuTjFZbk5sZERJZ1BDMGdSMDh5TG1SbUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtFbEVMQ0JFWlhOamNtbHdkR2x2Yml3Z1IyVnVaVkpoZEdsdkxDQndMbUZrYW5WemRDa2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aM0p2ZFhBZ1BTQmNJa2R5YjNWd0lESmNJaWtnSlQ0bFhHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtIQXVZV1JxZFhOMEtWeHVjM1ZpYzJWME1pUkhaVzVsVW1GMGFXOGdQQzBnYzJGd2NHeDVLSE4wY25Od2JHbDBLSE4xWW5ObGRESWtSMlZ1WlZKaGRHbHZMQ0JjSWk5Y0lpa3NJR1oxYm1OMGFXOXVLSGdwSUdGekxtNTFiV1Z5YVdNb2VGc3hYU2tnTHlCaGN5NXVkVzFsY21saktIaGJNbDBwS1Z4dVhHNWNia2RQYkdsemRDQThMU0JtWVdOMGIzSW9ZeWhjSWtkUE9qQXdNREU0TWpSY0lpd2dYQ0pIVHpvd01ETXdPRGM1WENJc0lGd2lSMDg2TURBeU1UazFNMXdpTENCY0lrZFBPakF3TVRrNE1qZGNJaXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVIwODZNREF5TWpZeE0xd2lMQ0JjSWtkUE9qQXdOVEEzTmpkY0lpd2dYQ0pIVHpvd01ETTBORGN3WENJc0lGd2lSMDg2TURBeE5qQTFOVndpTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSkhUem93TURBMk16azNYQ0lzSUZ3aVIwODZNREF6TURrd01Gd2lMQ0JjSWtkUE9qQXdNRGd6T0RCY0lpa3BYRzVjYm1SaGRHRWdQQzBnWW1sdVpGOXliM2R6S0hOMVluTmxkREVzSUhOMVluTmxkRElwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtFbEVJQ1ZwYmlVZ1IwOXNhWE4wS1Z4dVhHNWtaWE5qVDNKa1pYSWdQQzBnYzI5eWRDaDFibWx4ZFdVb1pHRjBZU1JFWlhOamNtbHdkR2x2YmlrcFcyTW9OQ3dnTVRBc0lESXNJREVzSURNc0lERXhMQ0EzTENBNExDQTJMQ0ExTENBNUtWMWNibkJXWVd4MVpVeHZaMDFoZUNBOExTQXhNRnh1WkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjbTkzZDJselpTZ3BJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLSEJXWVd4MVpVeHZaeUE5SUcxcGJpZ3RiRzluTVRBb2NDNWhaR3AxYzNRcExDQndWbUZzZFdWTWIyZE5ZWGdwS1Z4dWNDQThMU0JuWjNCc2IzUW9aR0YwWVN3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlHWmhZM1J2Y2loRVpYTmpjbWx3ZEdsdmJpd2diR1YyWld4eklEMGdaR1Z6WTA5eVpHVnlLU3dnYzJsNlpTQTlJSEJXWVd4MVpVeHZaeXdnWm1sc2JDQTlJRWRsYm1WU1lYUnBieWtwSUNzZ1hHNGdJR2RsYjIxZmNHOXBiblFvYzJoaGNHVWdQU0F5TVN3Z0lDQWdJQ0FnSUNNZ1JXNXpkWEpsY3lCaElIQnZhVzUwSUhkcGRHZ2dZVzRnYjNWMGJHbHVaVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lITjBjbTlyWlNBOUlERXFjSFJVYjAxTktTQXJJRnh1SUNCelkyRnNaVjl6YVhwbFgyTnZiblJwYm5WdmRYTW9jbUZ1WjJVZ1BTQmpLREF1TlN3Z01pa3BJQ3NnSUNNZ1UyVjBJRzFwYmlCaGJtUWdiV0Y0SUhCdmFXNTBJSE5wZW1WeklHaGxjbVZjYmlBZ2MyTmhiR1ZmWm1sc2JGOW5jbUZrYVdWdWRDaHNiM2NnUFNCY0luZG9hWFJsWENJc0lHaHBaMmdnUFNCY0lpTkRRak16TTBGY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklHeHBiV2wwY3lBOUlHTW9NQ3dnTVNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjI5aUlEMGdjMk5oYkdWek9qcHpjWFZwYzJnc0lDTWdSR1ZtYVc1bElHZHlZV1JwWlc1MElHTnZiRzl5YzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2QxYVdSbElEMGdaM1ZwWkdWZlkyOXNiM0ppWVhJb1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlYSjNhV1IwYUNBOUlERXVOUzgxTGpBNExDQWdJeUJCWkdwMWMzUWdkMmxrZEdnZ2IyWWdkR2hsSUdOdmJHOXlJR0poY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GeWFHVnBaMmgwSUQwZ01UVXZOUzR3T0NBZ0lDTWdRV1JxZFhOMElHaGxhV2RvZENCdlppQjBhR1VnWTI5c2IzSWdZbUZ5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLVnh1SUNBcElDc2dYRzRnSUd4aFluTW9lQ0E5SUU1VlRFd3NJSGtnUFNCT1ZVeE1LU0FyWEc0Z0lIUm9aVzFsWDJKM0tDa2dLeUFnSXlCQmNIQnNlU0IwYUdWdFpWOWlkeUJtYVhKemRDd2djMjhnWTNWemRHOXRJSFJvWlcxbElITmxkSFJwYm1keklHTnZiV1VnWVdaMFpYSmNiaUFnZEdobGJXVW9YRzRnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYQ0owY21GdWMzQmhjbVZ1ZEZ3aUtTd2dJQ01nVDNabGNuSnBaR1VnZEdobGJXVmZZbmNnY0dGdVpXeGNiaUFnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTENBZ0lDQWdJQ0FnSUNNZ1JXNXpkWEpsSUhOcGVtVWdhWE1nYzJWMElHWnZjaUI0TFdGNGFYTWdkR1Y0ZEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBMbmtnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExDQWdJQ0FnSUNBZ0lDTWdSVzV6ZFhKbElITnBlbVVnYVhNZ2MyVjBJR1p2Y2lCNUxXRjRhWE1nZEdWNGRGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxGeHVJQ0FnSUNBZ2JHbHVaV2hsYVdkb2RDQTlJREF1T1NBZ0lDQWdJQ0FnSUNBaklFRnNiRzkzY3lCM2NtRndjR2x1WnlCbWIzSWdlUzFoZUdseklHeGhZbVZzY3lCMGJ5Qm1hWFFnYVc1MGJ5QXlJR3hwYm1WelhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUnBZMnR6SUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXhjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNrc1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWxjYmlBZ0tWeHVJQ0JjYmx4dVhHNW1hV3hsVG1GdFpTQThMU0JvWlhKbEtHWnBaMFJwY2l3Z1hDSXVMbHdpTENCY0lrZFBYQ0lzSUZ3aVIwOWZaM0p2ZFhCelgySnBibUZ5ZVVkeWIzVndhVzVuWENJcFhHNTNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NaTQxS1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3hMaklwS20xdFZHOUpibU5vWEc1emRtZHNhWFJsS0hCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5cbmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5nZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5HTzEgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmUuZ3JvdXAxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSlcbkdPMiA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKVxuR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoR08xKVxuR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoR08yKVxuIyBmd3JpdGUoR08xLmRmLCBoZXJlKFxcR09fYmluYXJ5X2dyb3VwMS50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG4jIGZ3cml0ZShHTzIuZGYsIGhlcmUoXFxHT19iaW5hcnlfZ3JvdXAyLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbkdPMS5kZiA8LSBmcmVhZChoZXJlKFxcR09fYmluYXJ5X2dyb3VwMS50c3ZcXCkpXG5HTzIuZGYgPC0gZnJlYWQoaGVyZShcXEdPX2JpbmFyeV9ncm91cDIudHN2XFwpKVxuXG5zdWJzZXQxIDwtIEdPMS5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAxXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDEkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQxJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcblxuc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgMlxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQyJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MiRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5cblxuR09saXN0IDwtIGZhY3RvcihjKFxcR086MDAwMTgyNFxcLCBcXEdPOjAwMzA4NzlcXCwgXFxHTzowMDIxOTUzXFwsIFxcR086MDAxOTgyN1xcLCBcbiAgICAgICAgICAgICAgICAgXFxHTzowMDIyNjEzXFwsIFxcR086MDA1MDc2N1xcLCBcXEdPOjAwMzQ0NzBcXCwgXFxHTzowMDE2MDU1XFwsIFxuICAgICAgICAgICAgICAgICBcXEdPOjAwMDYzOTdcXCwgXFxHTzowMDMwOTAwXFwsIFxcR086MDAwODM4MFxcKSlcblxuZGF0YSA8LSBiaW5kX3Jvd3Moc3Vic2V0MSwgc3Vic2V0MikgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpXG5cbmRlc2NPcmRlciA8LSBzb3J0KHVuaXF1ZShkYXRhJERlc2NyaXB0aW9uKSlbYyg0LCAxMCwgMiwgMSwgMywgMTEsIDcsIDgsIDYsIDUsIDkpXVxucFZhbHVlTG9nTWF4IDwtIDEwXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUocFZhbHVlTG9nID0gbWluKC1sb2cxMChwLmFkanVzdCksIHBWYWx1ZUxvZ01heCkpXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gZmFjdG9yKERlc2NyaXB0aW9uLCBsZXZlbHMgPSBkZXNjT3JkZXIpLCBzaXplID0gcFZhbHVlTG9nLCBmaWxsID0gR2VuZVJhdGlvKSkgKyBcbiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lXG4gICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0pICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9IFxcd2hpdGVcXCwgaGlnaCA9IFxcI0NCMzMzQVxcLFxuICAgICAgICAgICAgICAgICAgICAgICMgbGltaXRzID0gYygwLCAxKSxcbiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiAgdGhlbWVfYncoKSArICAjIEFwcGx5IHRoZW1lX2J3IGZpcnN0LCBzbyBjdXN0b20gdGhlbWUgc2V0dGluZ3MgY29tZSBhZnRlclxuICB0aGVtZShcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLCAgIyBPdmVycmlkZSB0aGVtZV9idyBwYW5lbFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsICAgICAgICAgIyBFbnN1cmUgc2l6ZSBpcyBzZXQgZm9yIHgtYXhpcyB0ZXh0XG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgKSxcbiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsICAgICAgICAgIyBFbnN1cmUgc2l6ZSBpcyBzZXQgZm9yIHktYXhpcyB0ZXh0XG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBsaW5laGVpZ2h0ID0gMC45ICAgICAgICAgICMgQWxsb3dzIHdyYXBwaW5nIGZvciB5LWF4aXMgbGFiZWxzIHRvIGZpdCBpbnRvIDIgbGluZXNcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG4gIFxuXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXC4uXFwsIFxcR09cXCwgXFxHT19ncm91cHNfYmluYXJ5R3JvdXBpbmdcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgyLjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

GO1 <- enrichGO(gene = gene.group1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE)
GO2 <- enrichGO(gene = gene.group2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE)
GO1.df <- as.data.frame(GO1)
GO2.df <- as.data.frame(GO2)
# fwrite(GO1.df, here(\GO_binary_group1.tsv\), sep = \\t\)
# fwrite(GO2.df, here(\GO_binary_group2.tsv\), sep = \\t\)
GO1.df <- fread(here(\GO_binary_group1.tsv\))
GO2.df <- fread(here(\GO_binary_group2.tsv\))

subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 1\) %>%
  dplyr::arrange(p.adjust)
subset1$GeneRatio <- sapply(strsplit(subset1$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))

subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 2\) %>%
  dplyr::arrange(p.adjust)
subset2$GeneRatio <- sapply(strsplit(subset2$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))


GOlist <- factor(c(\GO:0001824\, \GO:0030879\, \GO:0021953\, \GO:0019827\, 
                 \GO:0022613\, \GO:0050767\, \GO:0034470\, \GO:0016055\, 
                 \GO:0006397\, \GO:0030900\, \GO:0008380\))

data <- bind_rows(subset1, subset2) %>%
  dplyr::filter(ID %in% GOlist)

descOrder <- sort(unique(data$Description))[c(4, 10, 2, 1, 3, 11, 7, 8, 6, 5, 9)]
pValueLogMax <- 10
data <- data %>% dplyr::rowwise() %>% dplyr::mutate(pValueLog = min(-log10(p.adjust), pValueLogMax))
p <- ggplot(data, aes(x = group, y = factor(Description, levels = descOrder), size = pValueLog, fill = GeneRatio)) + 
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM) + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = \white\, high = \#CB333A\,
                      # limits = c(0, 1),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL) +
  theme_bw() +  # Apply theme_bw first, so custom theme settings come after
  theme(
    panel.background = element_rect(fill = \transparent\),  # Override theme_bw panel
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      size = fontSizeS,         # Ensure size is set for x-axis text
      family = fontType,
      color = \#000000\,
    ),
    axis.text.y = element_text(
      size = fontSizeS,         # Ensure size is set for y-axis text
      family = fontType,
      color = \#000000\,
      lineheight = 0.9          # Allows wrapping for y-axis labels to fit into 2 lines
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )
  


fileName <- here(figDir, \..\, \GO\, \GO_groups_binaryGrouping\)
width <- panelSize(2.5)*mmToInch
height <- panelSize(1.2)*mmToInch
svglite(paste0(fileName, \.svg\), height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNW5aVzVsTG1keWIzVndNU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeG5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWW1sdVlYSjVSM0p2ZFhBeExuUnpkbHhjS1Nra1oyVnVaVnh1WjJWdVpTNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNaTUwYzNaY1hDa3BKR2RsYm1WY2JseHVSMDh4SUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxMbWR5YjNWd01Td2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjTENCeVpXRmtZV0pzWlNBOUlGUlNWVVVwWEc1SFR6SWdQQzBnWlc1eWFXTm9SMDhvWjJWdVpTQTlJR2RsYm1VdVozSnZkWEF5TENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRnhjUlU1VFJVMUNURnhjTENCdmJuUWdQU0JjWEVKUVhGd3NJSEpsWVdSaFlteGxJRDBnVkZKVlJTbGNia2RQTVM1a1ppQThMU0JoY3k1a1lYUmhMbVp5WVcxbEtFZFBNU2xjYmtkUE1pNWtaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLRWRQTWlsY2JpTWdabmR5YVhSbEtFZFBNUzVrWml3Z2FHVnlaU2hjWEVkUFgySnBibUZ5ZVY5bmNtOTFjREV1ZEhOMlhGd3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVJeUJtZDNKcGRHVW9SMDh5TG1SbUxDQm9aWEpsS0Z4Y1IwOWZZbWx1WVhKNVgyZHliM1Z3TWk1MGMzWmNYQ2tzSUhObGNDQTlJRnhjWEZ4MFhGd3BYRzVIVHpFdVpHWWdQQzBnWm5KbFlXUW9hR1Z5WlNoY1hFZFBYMkpwYm1GeWVWOW5jbTkxY0RFdWRITjJYRndwS1Z4dVIwOHlMbVJtSUR3dElHWnlaV0ZrS0dobGNtVW9YRnhIVDE5aWFXNWhjbmxmWjNKdmRYQXlMblJ6ZGx4Y0tTbGNibHh1YzNWaWMyVjBNU0E4TFNCSFR6RXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ4Y1IzSnZkWEFnTVZ4Y0tTQWxQaVZjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvY0M1aFpHcDFjM1FwWEc1emRXSnpaWFF4SkVkbGJtVlNZWFJwYnlBOExTQnpZWEJ3Ykhrb2MzUnljM0JzYVhRb2MzVmljMlYwTVNSSFpXNWxVbUYwYVc4c0lGeGNMMXhjS1N3Z1puVnVZM1JwYjI0b2VDa2dZWE11Ym5WdFpYSnBZeWg0V3pGZEtTQXZJR0Z6TG01MWJXVnlhV01vZUZzeVhTa3BYRzVjYm5OMVluTmxkRElnUEMwZ1IwOHlMbVJtSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VsRUxDQkVaWE5qY21sd2RHbHZiaXdnUjJWdVpWSmhkR2x2TENCd0xtRmthblZ6ZENrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCY1hFZHliM1Z3SURKY1hDa2dKVDRsWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0hBdVlXUnFkWE4wS1Z4dWMzVmljMlYwTWlSSFpXNWxVbUYwYVc4Z1BDMGdjMkZ3Y0d4NUtITjBjbk53YkdsMEtITjFZbk5sZERJa1IyVnVaVkpoZEdsdkxDQmNYQzljWENrc0lHWjFibU4wYVc5dUtIZ3BJR0Z6TG01MWJXVnlhV01vZUZzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hoYk1sMHBLVnh1WEc1Y2JrZFBiR2x6ZENBOExTQm1ZV04wYjNJb1l5aGNYRWRQT2pBd01ERTRNalJjWEN3Z1hGeEhUem93TURNd09EYzVYRndzSUZ4Y1IwODZNREF5TVRrMU0xeGNMQ0JjWEVkUE9qQXdNVGs0TWpkY1hDd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjUjA4Nk1EQXlNall4TTF4Y0xDQmNYRWRQT2pBd05UQTNOamRjWEN3Z1hGeEhUem93TURNME5EY3dYRndzSUZ4Y1IwODZNREF4TmpBMU5WeGNMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4SFR6b3dNREEyTXprM1hGd3NJRnhjUjA4Nk1EQXpNRGt3TUZ4Y0xDQmNYRWRQT2pBd01EZ3pPREJjWENrcFhHNWNibVJoZEdFZ1BDMGdZbWx1WkY5eWIzZHpLSE4xWW5ObGRERXNJSE4xWW5ObGRESXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0VsRUlDVnBiaVVnUjA5c2FYTjBLVnh1WEc1a1pYTmpUM0prWlhJZ1BDMGdjMjl5ZENoMWJtbHhkV1VvWkdGMFlTUkVaWE5qY21sd2RHbHZiaWtwVzJNb05Dd2dNVEFzSURJc0lERXNJRE1zSURFeExDQTNMQ0E0TENBMkxDQTFMQ0E1S1YxY2JuQldZV3gxWlV4dlowMWhlQ0E4TFNBeE1GeHVaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmNtOTNkMmx6WlNncElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtIQldZV3gxWlV4dlp5QTlJRzFwYmlndGJHOW5NVEFvY0M1aFpHcDFjM1FwTENCd1ZtRnNkV1ZNYjJkTllYZ3BLVnh1Y0NBOExTQm5aM0JzYjNRb1pHRjBZU3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUdaaFkzUnZjaWhFWlhOamNtbHdkR2x2Yml3Z2JHVjJaV3h6SUQwZ1pHVnpZMDl5WkdWeUtTd2djMmw2WlNBOUlIQldZV3gxWlV4dlp5d2dabWxzYkNBOUlFZGxibVZTWVhScGJ5a3BJQ3NnWEc0Z0lHZGxiMjFmY0c5cGJuUW9jMmhoY0dVZ1BTQXlNU3dnSUNBZ0lDQWdJQ01nUlc1emRYSmxjeUJoSUhCdmFXNTBJSGRwZEdnZ1lXNGdiM1YwYkdsdVpWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUhOMGNtOXJaU0E5SURFcWNIUlViMDFOS1NBcklGeHVJQ0J6WTJGc1pWOXphWHBsWDJOdmJuUnBiblZ2ZFhNb2NtRnVaMlVnUFNCaktEQXVOU3dnTWlrcElDc2dJQ01nVTJWMElHMXBiaUJoYm1RZ2JXRjRJSEJ2YVc1MElITnBlbVZ6SUdobGNtVmNiaUFnYzJOaGJHVmZabWxzYkY5bmNtRmthV1Z1ZENoc2IzY2dQU0JjWEhkb2FYUmxYRndzSUdocFoyZ2dQU0JjWENORFFqTXpNMEZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUd4cGJXbDBjeUE5SUdNb01Dd2dNU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiMjlpSUQwZ2MyTmhiR1Z6T2pwemNYVnBjMmdzSUNNZ1JHVm1hVzVsSUdkeVlXUnBaVzUwSUdOdmJHOXljMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZDFhV1JsSUQwZ1ozVnBaR1ZmWTI5c2IzSmlZWElvWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVhKM2FXUjBhQ0E5SURFdU5TODFMakE0TENBZ0l5QkJaR3AxYzNRZ2QybGtkR2dnYjJZZ2RHaGxJR052Ykc5eUlHSmhjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZ5YUdWcFoyaDBJRDBnTVRVdk5TNHdPQ0FnSUNNZ1FXUnFkWE4wSUdobGFXZG9kQ0J2WmlCMGFHVWdZMjlzYjNJZ1ltRnlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tWeHVJQ0FwSUNzZ1hHNGdJR3hoWW5Nb2VDQTlJRTVWVEV3c0lIa2dQU0JPVlV4TUtTQXJYRzRnSUhSb1pXMWxYMkozS0NrZ0t5QWdJeUJCY0hCc2VTQjBhR1Z0WlY5aWR5Qm1hWEp6ZEN3Z2MyOGdZM1Z6ZEc5dElIUm9aVzFsSUhObGRIUnBibWR6SUdOdmJXVWdZV1owWlhKY2JpQWdkR2hsYldVb1hHNGdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hGeDBjbUZ1YzNCaGNtVnVkRnhjS1N3Z0lDTWdUM1psY25KcFpHVWdkR2hsYldWZlluY2djR0Z1Wld4Y2JpQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5eGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0FnSUNBZ0lDQWdJQ01nUlc1emRYSmxJSE5wZW1VZ2FYTWdjMlYwSUdadmNpQjRMV0Y0YVhNZ2RHVjRkRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMExua2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTENBZ0lDQWdJQ0FnSUNNZ1JXNXpkWEpsSUhOcGVtVWdhWE1nYzJWMElHWnZjaUI1TFdGNGFYTWdkR1Y0ZEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTEZ4dUlDQWdJQ0FnYkdsdVpXaGxhV2RvZENBOUlEQXVPU0FnSUNBZ0lDQWdJQ0FqSUVGc2JHOTNjeUIzY21Gd2NHbHVaeUJtYjNJZ2VTMWhlR2x6SUd4aFltVnNjeUIwYnlCbWFYUWdhVzUwYnlBeUlHeHBibVZ6WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hDeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdiR1ZuWlc1a0xuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5bGNiaUFnS1Z4dUlDQmNibHh1WEc1bWFXeGxUbUZ0WlNBOExTQm9aWEpsS0dacFowUnBjaXdnWEZ3dUxseGNMQ0JjWEVkUFhGd3NJRnhjUjA5ZlozSnZkWEJ6WDJKcGJtRnllVWR5YjNWd2FXNW5YRndwWEc1M2FXUjBhQ0E4TFNCd1lXNWxiRk5wZW1Vb01pNDFLU3B0YlZSdlNXNWphRnh1YUdWcFoyaDBJRHd0SUhCaGJtVnNVMmw2WlNneExqSXBLbTF0Vkc5SmJtTm9YRzV6ZG1kc2FYUmxLSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5cbmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5nZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5HTzEgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmUuZ3JvdXAxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSlcbkdPMiA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKVxuR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoR08xKVxuR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoR08yKVxuIyBmd3JpdGUoR08xLmRmLCBoZXJlKFxcR09fYmluYXJ5X2dyb3VwMS50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG4jIGZ3cml0ZShHTzIuZGYsIGhlcmUoXFxHT19iaW5hcnlfZ3JvdXAyLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbkdPMS5kZiA8LSBmcmVhZChoZXJlKFxcR09fYmluYXJ5X2dyb3VwMS50c3ZcXCkpXG5HTzIuZGYgPC0gZnJlYWQoaGVyZShcXEdPX2JpbmFyeV9ncm91cDIudHN2XFwpKVxuXG5zdWJzZXQxIDwtIEdPMS5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAxXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDEkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQxJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcblxuc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgMlxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQyJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MiRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5cblxuR09saXN0IDwtIGZhY3RvcihjKFxcR086MDAwMTgyNFxcLCBcXEdPOjAwMzA4NzlcXCwgXFxHTzowMDIxOTUzXFwsIFxcR086MDAxOTgyN1xcLCBcbiAgICAgICAgICAgICAgICAgXFxHTzowMDIyNjEzXFwsIFxcR086MDA1MDc2N1xcLCBcXEdPOjAwMzQ0NzBcXCwgXFxHTzowMDE2MDU1XFwsIFxuICAgICAgICAgICAgICAgICBcXEdPOjAwMDYzOTdcXCwgXFxHTzowMDMwOTAwXFwsIFxcR086MDAwODM4MFxcKSlcblxuZGF0YSA8LSBiaW5kX3Jvd3Moc3Vic2V0MSwgc3Vic2V0MikgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpXG5cbmRlc2NPcmRlciA8LSBzb3J0KHVuaXF1ZShkYXRhJERlc2NyaXB0aW9uKSlbYyg0LCAxMCwgMiwgMSwgMywgMTEsIDcsIDgsIDYsIDUsIDkpXVxucFZhbHVlTG9nTWF4IDwtIDEwXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUocFZhbHVlTG9nID0gbWluKC1sb2cxMChwLmFkanVzdCksIHBWYWx1ZUxvZ01heCkpXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gZmFjdG9yKERlc2NyaXB0aW9uLCBsZXZlbHMgPSBkZXNjT3JkZXIpLCBzaXplID0gcFZhbHVlTG9nLCBmaWxsID0gR2VuZVJhdGlvKSkgKyBcbiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lXG4gICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0pICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9IFxcd2hpdGVcXCwgaGlnaCA9IFxcI0NCMzMzQVxcLFxuICAgICAgICAgICAgICAgICAgICAgICMgbGltaXRzID0gYygwLCAxKSxcbiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiAgdGhlbWVfYncoKSArICAjIEFwcGx5IHRoZW1lX2J3IGZpcnN0LCBzbyBjdXN0b20gdGhlbWUgc2V0dGluZ3MgY29tZSBhZnRlclxuICB0aGVtZShcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLCAgIyBPdmVycmlkZSB0aGVtZV9idyBwYW5lbFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsICAgICAgICAgIyBFbnN1cmUgc2l6ZSBpcyBzZXQgZm9yIHgtYXhpcyB0ZXh0XG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgKSxcbiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsICAgICAgICAgIyBFbnN1cmUgc2l6ZSBpcyBzZXQgZm9yIHktYXhpcyB0ZXh0XG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBsaW5laGVpZ2h0ID0gMC45ICAgICAgICAgICMgQWxsb3dzIHdyYXBwaW5nIGZvciB5LWF4aXMgbGFiZWxzIHRvIGZpdCBpbnRvIDIgbGluZXNcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG4gIFxuXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXC4uXFwsIFxcR09cXCwgXFxHT19ncm91cHNfYmluYXJ5R3JvdXBpbmdcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgyLjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5nZW5lLmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ2VuZS5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuR08xIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwMSwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpXG5HTzIgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmUuZ3JvdXAyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSlcbkdPMS5kZiA8LSBhcy5kYXRhLmZyYW1lKEdPMSlcbkdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKEdPMilcbiMgZndyaXRlKEdPMS5kZiwgaGVyZShcXEdPX2JpbmFyeV9ncm91cDEudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuIyBmd3JpdGUoR08yLmRmLCBoZXJlKFxcR09fYmluYXJ5X2dyb3VwMi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5HTzEuZGYgPC0gZnJlYWQoaGVyZShcXEdPX2JpbmFyeV9ncm91cDEudHN2XFwpKVxuR08yLmRmIDwtIGZyZWFkKGhlcmUoXFxHT19iaW5hcnlfZ3JvdXAyLnRzdlxcKSlcblxuc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgMVxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQxJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MSRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5cbnN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDJcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuc3Vic2V0MiRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDIkR2VuZVJhdGlvLCBcXC9cXCksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKVxuXG5cbkdPbGlzdCA8LSBmYWN0b3IoYyhcXEdPOjAwMDE4MjRcXCwgXFxHTzowMDMwODc5XFwsIFxcR086MDAyMTk1M1xcLCBcXEdPOjAwMTk4MjdcXCwgXG4gICAgICAgICAgICAgICAgIFxcR086MDAyMjYxM1xcLCBcXEdPOjAwNTA3NjdcXCwgXFxHTzowMDM0NDcwXFwsIFxcR086MDAxNjA1NVxcLCBcbiAgICAgICAgICAgICAgICAgXFxHTzowMDA2Mzk3XFwsIFxcR086MDAzMDkwMFxcLCBcXEdPOjAwMDgzODBcXCkpXG5cbmRhdGEgPC0gYmluZF9yb3dzKHN1YnNldDEsIHN1YnNldDIpICU+JVxuICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuXG5kZXNjT3JkZXIgPC0gc29ydCh1bmlxdWUoZGF0YSREZXNjcmlwdGlvbikpW2MoNCwgMTAsIDIsIDEsIDMsIDExLCA3LCA4LCA2LCA1LCA5KV1cbnBWYWx1ZUxvZ01heCA8LSAxMFxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKHBWYWx1ZUxvZyA9IG1pbigtbG9nMTAocC5hZGp1c3QpLCBwVmFsdWVMb2dNYXgpKVxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGZhY3RvcihEZXNjcmlwdGlvbiwgbGV2ZWxzID0gZGVzY09yZGVyKSwgc2l6ZSA9IHBWYWx1ZUxvZywgZmlsbCA9IEdlbmVSYXRpbykpICsgXG4gIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZVxuICAgICAgICAgICAgIHN0cm9rZSA9IDEqcHRUb01NKSArIFxuICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuNSwgMikpICsgICMgU2V0IG1pbiBhbmQgbWF4IHBvaW50IHNpemVzIGhlcmVcbiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSBcXHdoaXRlXFwsIGhpZ2ggPSBcXCNDQjMzM0FcXCxcbiAgICAgICAgICAgICAgICAgICAgICAjIGxpbWl0cyA9IGMoMCwgMSksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICsgXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArXG4gIHRoZW1lX2J3KCkgKyAgIyBBcHBseSB0aGVtZV9idyBmaXJzdCwgc28gY3VzdG9tIHRoZW1lIHNldHRpbmdzIGNvbWUgYWZ0ZXJcbiAgdGhlbWUoXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSwgICMgT3ZlcnJpZGUgdGhlbWVfYncgcGFuZWxcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCAgICAgICAgICMgRW5zdXJlIHNpemUgaXMgc2V0IGZvciB4LWF4aXMgdGV4dFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICksXG4gICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCAgICAgICAgICMgRW5zdXJlIHNpemUgaXMgc2V0IGZvciB5LWF4aXMgdGV4dFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgbGluZWhlaWdodCA9IDAuOSAgICAgICAgICAjIEFsbG93cyB3cmFwcGluZyBmb3IgeS1heGlzIGxhYmVscyB0byBmaXQgaW50byAyIGxpbmVzXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKVxuICBcblxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFwuLlxcLCBcXEdPXFwsIFxcR09fZ3JvdXBzX2JpbmFyeUdyb3VwaW5nXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMi41KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG5zdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

GO1 <- enrichGO(gene = gene.group1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE)
GO2 <- enrichGO(gene = gene.group2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE)
GO1.df <- as.data.frame(GO1)
GO2.df <- as.data.frame(GO2)
# fwrite(GO1.df, here(\GO_binary_group1.tsv\), sep = \\t\)
# fwrite(GO2.df, here(\GO_binary_group2.tsv\), sep = \\t\)
GO1.df <- fread(here(\GO_binary_group1.tsv\))
GO2.df <- fread(here(\GO_binary_group2.tsv\))

subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 1\) %>%
  dplyr::arrange(p.adjust)
subset1$GeneRatio <- sapply(strsplit(subset1$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))

subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 2\) %>%
  dplyr::arrange(p.adjust)
subset2$GeneRatio <- sapply(strsplit(subset2$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))


GOlist <- factor(c(\GO:0001824\, \GO:0030879\, \GO:0021953\, \GO:0019827\, 
                 \GO:0022613\, \GO:0050767\, \GO:0034470\, \GO:0016055\, 
                 \GO:0006397\, \GO:0030900\, \GO:0008380\))

data <- bind_rows(subset1, subset2) %>%
  dplyr::filter(ID %in% GOlist)

descOrder <- sort(unique(data$Description))[c(4, 10, 2, 1, 3, 11, 7, 8, 6, 5, 9)]
pValueLogMax <- 10
data <- data %>% dplyr::rowwise() %>% dplyr::mutate(pValueLog = min(-log10(p.adjust), pValueLogMax))
p <- ggplot(data, aes(x = group, y = factor(Description, levels = descOrder), size = pValueLog, fill = GeneRatio)) + 
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM) + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = \white\, high = \#CB333A\,
                      # limits = c(0, 1),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL) +
  theme_bw() +  # Apply theme_bw first, so custom theme settings come after
  theme(
    panel.background = element_rect(fill = \transparent\),  # Override theme_bw panel
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      size = fontSizeS,         # Ensure size is set for x-axis text
      family = fontType,
      color = \#000000\,
    ),
    axis.text.y = element_text(
      size = fontSizeS,         # Ensure size is set for y-axis text
      family = fontType,
      color = \#000000\,
      lineheight = 0.9          # Allows wrapping for y-axis labels to fit into 2 lines
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )
  


fileName <- here(figDir, \..\, \GO\, \GO_groups_binaryGrouping\)
width <- panelSize(2.5)*mmToInch
height <- panelSize(1.2)*mmToInch
svglite(paste0(fileName, \.svg\), height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## [2.12] How many loops/distance per gene in each quadrant?
#### dTAG with binary grouping
##### Splitting genes to group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJEYUdWamEybHVaeUJoZG1WeVlXZGxJR1JwYzNSaGJtTmxJRzltSUd4dmIzQnpJSEJsY2lCblpXNWxYRzRqSUhSbGJYQWdhWE1nWVNCMGFXSmliR1VnZDJobGNtVWdaR1ZzZEdFZ2JHOXZjQ0JoYm1RZ2JHOW5NbVpqSUdGeVpTQnRaWEpuWldSY2JuUmxiWEFrWjNKdmRYQWdQQzBnWm1GamRHOXlLSFJsYlhBa1ozSnZkWEFwWEc1Y2JuUmxiWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQWxhVzRsSUdNb01Td2dNaWtwWEc1Y2JseHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TVNrZ0tTUnRaV0Z1WDJScGMzUmhibU5sWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TWlrZ0tTUnRaV0Z1WDJScGMzUmhibU5sWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WEc1d2RqRXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnTVN3Z01pa3NJRFVwWEc1Y2JseHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnYldWaGJsOWthWE4wWVc1alpTa3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQm5jbTkxY0Nrc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3RjYmlBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDc2djMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR3hoWW1Wc2N5QTlJR3hoWW1Wc1gydGlYMjFpS1NBclhHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNJbkJ2YVc1MFhDSXNJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWENKeVpXUmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SURFc0lIa2dQU0F4TURBd01EQXdMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkIyTVRJNklGd2lMQ0J3ZGpFeUtTeGNiaUFnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzSUdocWRYTjBJRDBnTUN3Z2MybDZaU0E5SURNcFhHNGdJRnh1SUNCY2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbk5wZW1WZlltRnljR3h2ZEY5a2FXWm1SM0p2ZFhCZlpGUkJSMTkyYzE5RVRWTlBYMkpwYm1GeWVVZHliM1Z3WENJcFhHNW9aV2xuYUhRZ1BDMGdNMXh1ZDJsa2RHZ2dQQzBnTWx4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbiMgQ2hlY2tpbmcgYXZlcmFnZSBkaXN0YW5jZSBvZiBsb29wcyBwZXIgZ2VuZVxuIyB0ZW1wIGlzIGEgdGliYmxlIHdoZXJlIGRlbHRhIGxvb3AgYW5kIGxvZzJmYyBhcmUgbWVyZ2VkXG50ZW1wJGdyb3VwIDwtIGZhY3Rvcih0ZW1wJGdyb3VwKVxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKDEsIDIpKVxuXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkbWVhbl9kaXN0YW5jZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkbWVhbl9kaXN0YW5jZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIDEsIDIpLCA1KVxuXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IG1lYW5fZGlzdGFuY2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMTAwMDAwMCwgbGFiZWwgPSBwYXN0ZTAoXFxwdjEyOiBcXCwgcHYxMiksXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxzaXplX2JhcnBsb3RfZGlmZkdyb3VwX2RUQUdfdnNfRE1TT19iaW5hcnlHcm91cFxcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDJcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# Checking average distance of loops per gene
# temp is a tibble where delta loop and log2fc are merged
temp$group <- factor(temp$group)

temp <- temp %>% dplyr::filter(group %in% c(1, 2))


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$mean_distance
  distance2 <- (data %>% dplyr::filter(group ==group2) )$mean_distance
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

pv12 <- round(getPvalWilcox(temp, 1, 2), 5)



p <- ggplot(temp, aes(x = group, y = mean_distance)) + geom_violin(aes(fill = group), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + scale_y_continuous(labels = label_kb_mb) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)+
  annotate(\text\, x = 1, y = 1000000, label = paste0(\pv12: \, pv12),
           color = \black\, hjust = 0, size = 3)
  
  
fileName <- paste0(\size_barplot_diffGroup_dTAG_vs_DMSO_binaryGroup\)
height <- 3
width <- 2
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkRhR1ZqYTJsdVp5QmhkbVZ5WVdkbElHUnBjM1JoYm1ObElHOW1JR3h2YjNCeklIQmxjaUJuWlc1bFhHNGpJSFJsYlhBZ2FYTWdZU0IwYVdKaWJHVWdkMmhsY21VZ1pHVnNkR0VnYkc5dmNDQmhibVFnYkc5bk1tWmpJR0Z5WlNCdFpYSm5aV1JjYm5SbGJYQWtaM0p2ZFhBZ1BDMGdabUZqZEc5eUtIUmxiWEFrWjNKdmRYQXBYRzVjYm5SbGJYQWdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBbGFXNGxJR01vTVN3Z01pa3BYRzVjYmx4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNU2tnS1NSdFpXRnVYMlJwYzNSaGJtTmxYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNaWtnS1NSdFpXRnVYMlJwYzNSaGJtTmxYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzV3ZGpFeUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dNU3dnTWlrc0lEVXBYRzVjYmx4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdiV1ZoYmw5a2FYTjBZVzVqWlNrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCbmNtOTFjQ2tzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDdGNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ2MyTmhiR1ZmZVY5amIyNTBhVzUxYjNWektHeGhZbVZzY3lBOUlHeGhZbVZzWDJ0aVgyMWlLU0FyWEc0Z0lITjBZWFJmYzNWdGJXRnllU2hoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c0lHZGxiMjBnUFNCY1hIQnZhVzUwWEZ3c0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXlMQ0JtYVd4c0lEMGdYRnh5WldSY1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJREVzSUhrZ1BTQXhNREF3TURBd0xDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQjJNVEk2SUZ4Y0xDQndkakV5S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wWEc0Z0lGeHVJQ0JjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hITnBlbVZmWW1GeWNHeHZkRjlrYVdabVIzSnZkWEJmWkZSQlIxOTJjMTlFVFZOUFgySnBibUZ5ZVVkeWIzVndYRndwWEc1b1pXbG5hSFFnUEMwZ00xeHVkMmxrZEdnZ1BDMGdNbHh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG4jIENoZWNraW5nIGF2ZXJhZ2UgZGlzdGFuY2Ugb2YgbG9vcHMgcGVyIGdlbmVcbiMgdGVtcCBpcyBhIHRpYmJsZSB3aGVyZSBkZWx0YSBsb29wIGFuZCBsb2cyZmMgYXJlIG1lcmdlZFxudGVtcCRncm91cCA8LSBmYWN0b3IodGVtcCRncm91cClcblxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYygxLCAyKSlcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJG1lYW5fZGlzdGFuY2VcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJG1lYW5fZGlzdGFuY2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAxLCAyKSwgNSlcblxuXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBtZWFuX2Rpc3RhbmNlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDEwMDAwMDAsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIHB2MTIpLFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2l6ZV9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09fYmluYXJ5R3JvdXBcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAyXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBDaGVja2luZyBhdmVyYWdlIGRpc3RhbmNlIG9mIGxvb3BzIHBlciBnZW5lXG4jIHRlbXAgaXMgYSB0aWJibGUgd2hlcmUgZGVsdGEgbG9vcCBhbmQgbG9nMmZjIGFyZSBtZXJnZWRcbnRlbXAkZ3JvdXAgPC0gZmFjdG9yKHRlbXAkZ3JvdXApXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoMSwgMikpXG5cblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRtZWFuX2Rpc3RhbmNlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRtZWFuX2Rpc3RhbmNlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMSwgMiksIDUpXG5cblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gbWVhbl9kaXN0YW5jZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAxMDAwMDAwLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyKSxcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXHNpemVfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX2JpbmFyeUdyb3VwXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gMlxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
# Checking average distance of loops per gene
# temp is a tibble where delta loop and log2fc are merged
temp$group <- factor(temp$group)

temp <- temp %>% dplyr::filter(group %in% c(1, 2))


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$mean_distance
  distance2 <- (data %>% dplyr::filter(group ==group2) )$mean_distance
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

pv12 <- round(getPvalWilcox(temp, 1, 2), 5)



p <- ggplot(temp, aes(x = group, y = mean_distance)) + geom_violin(aes(fill = group), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + scale_y_continuous(labels = label_kb_mb) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)+
  annotate(\text\, x = 1, y = 1000000, label = paste0(\pv12: \, pv12),
           color = \black\, hjust = 0, size = 3)
  
  
fileName <- paste0(\size_barplot_diffGroup_dTAG_vs_DMSO_binaryGroup\)
height <- 3
width <- 2
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### - GO for each group


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJEYjNWdWRHbHVaeUJ1ZFcxaVpYSWdiMllnYkc5dmNDQndaWElnWjJWdVpYTmNiblJsYlhCVGRXMGdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIQmxZV3RKUkN3Z1oyVnVaU3dnUVc1dWJ6SXBJQ1UrSlNCMWJtNWxjM1FvWjJWdVpTa2dKVDRsSUdkeWIzVndYMko1S0dkbGJtVXBJQ1UrSlNBZ2MzVnRiV0Z5YVhwbEtGeHVJQ0FnSUhCbFlXc2dQU0JzYVhOMEtIQmxZV3RKUkNrc1hHNGdJQ0FnWVc1dWJ6SWdQU0JzYVhOMEtFRnVibTh5S1N4Y2JpQWdJQ0JqYjNWdWRDQTlJRzRvS1NsY2JseHVkR1Z0Y0ZOMWJTQThMU0IwWlcxd1UzVnRJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNCbmNtOTFjQ0E5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0RFc0lGd2laM0p2ZFhBeFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjRElzSUZ3aVozSnZkWEF5WENJc0lFNUJLU2xjYmlrZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb0lXbHpMbTVoS0dkeWIzVndLU2tnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdKV2x1SlNCaktGd2laM0p2ZFhBeFhDSXNJRndpWjNKdmRYQXlYQ0lwS1Z4dVhHNGpJRnh1WjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGdJR1JwYzNSaGJtTmxNU0E4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQV2R5YjNWd01Ta2dLU1JqYjNWdWRGeHVJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDFuY205MWNESXBJQ2trWTI5MWJuUmNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNWNibHh1Y0hZeE1pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlRkVzBzWENKbmNtOTFjREZjSWl3Z1hDSm5jbTkxY0RKY0lpa3NJRFVwWEc0aklIQjJNVFVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VTNWdExGd2laM0p2ZFhBeFhDSXNJRndpWjNKdmRYQTFYQ0lwTENBMUtWeHVJeUJ3ZGpFNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGTjFiU3hjSW1keWIzVndNVndpTENCY0ltZHliM1Z3T0Z3aUtTd2dOU2xjYmlNZ2NIWXlOU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJUZFcwc1hDSm5jbTkxY0RKY0lpd2dYQ0puY205MWNEVmNJaWtzSURVcFhHNGpJSEIyTWpnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1UzVnRMRndpWjNKdmRYQXlYQ0lzSUZ3aVozSnZkWEE0WENJcExDQTFLVnh1SXlCd2RqVTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRk4xYlN4Y0ltZHliM1Z3TlZ3aUxDQmNJbWR5YjNWd09Gd2lLU3dnTlNsY2JseHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdVM1Z0TENCaFpYTW9lQ0E5SUdkeWIzVndMQ0I1SUQwZ1kyOTFiblFzSUdacGJHd2dQU0JuY205MWNDa3BJQ3NnWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TlN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QkxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpd2dZV3h3YUdFZ1BTQXdMallzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ0lDQWdJQ0FnWEc0Z0lITmpZV3hsWDNsZlkyOXVkR2x1ZFc5MWN5aGljbVZoYTNNZ1BTQnpaWEVvTUN3Z01UQXNJR0o1SUQwZ01pa3BJQ3NnWEc0Z0lHeGhZbk1vZUNBOUlFNVZURXdzSUhrZ1BTQmNJaU1nYjJZZ1VDMU9JR3h2YjNCeklIQmxjaUJuWlc1bFhDSXBJQ3RjYmlBZ1kyOXZjbVJmWTJGeWRHVnphV0Z1S0hsc2FXMGdQU0JqS0RBc0lEZ3BLU0FyWEc0Z0lITjBZWFJmYzNWdGJXRnllU2hjYmlBZ0lDQmhaWE1vWjNKdmRYQWdQU0JuY205MWNDa3NJR1oxYmlBOUlHMWxZVzRzWEc0Z0lDQWdaMlZ2YlNBOUlGd2ljRzlwYm5SY0lpd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJREF1TlN4Y2JpQWdJQ0JtYVd4c0lEMGdYQ0ppYkdGamExd2lMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJbHh1SUNBcEsxeHVJQ0JoYm01dmRHRjBaU2hjSW5SbGVIUmNJaXdnZUNBOUlERXNJSGtnUFNBekxDQnNZV0psYkNBOUlIQmhjM1JsTUNoY0luQjJNVEk2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEIyTVRJcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzSUdocWRYTjBJRDBnTUN3Z2MybDZaU0E5SURFcElDdGNiaUFnZEdobGJXVW9YRzRnSUNBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUNBZ0lDQWdJeUJTYjNSaGRHVWdlQzFoZUdseklHeGhZbVZzY3lBME5TQmtaV2R5WldWelhHNGdJQ0FnSUNCb2FuVnpkQ0E5SURFc0lDQWdJQ0FnSUNNZ1FXUnFkWE4wSUdodmNtbDZiMjUwWVd3Z2FuVnpkR2xtYVdOaGRHbHZibHh1SUNBZ0lDQWdkbXAxYzNRZ1BTQXhJQ0FnSUNBZ0lDQWpJRUZrYW5WemRDQjJaWEowYVdOaGJDQnFkWE4wYVdacFkyRjBhVzl1WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNJblJ5WVc1emNHRnlaVzUwWENJcExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDQWdLVnh1WEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbU52ZFc1MFgySmhjbkJzYjNSZlpHbG1aa2R5YjNWd1gyUlVRVWRmZG5OZlJFMVRUMTlpYVc1aGNubEhjbTkxY0Z3aUtWeHVkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLREF1T0NrcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzQxS1NwdGJWUnZTVzVqYUZ4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbiMgQ291bnRpbmcgbnVtYmVyIG9mIGxvb3AgcGVyIGdlbmVzXG50ZW1wU3VtIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChwZWFrSUQsIGdlbmUsIEFubm8yKSAlPiUgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUgIHN1bW1hcml6ZShcbiAgICBwZWFrID0gbGlzdChwZWFrSUQpLFxuICAgIGFubm8yID0gbGlzdChBbm5vMiksXG4gICAgY291bnQgPSBuKCkpXG5cbnRlbXBTdW0gPC0gdGVtcFN1bSAlPiUgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAxLCBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAyLCBcXGdyb3VwMlxcLCBOQSkpXG4pICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYyhcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSlcblxuIyBcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkY291bnRcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGNvdW50XG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuIyBwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcFN1bSwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSwgY29sb3IgPSBcXGJsYWNrXFwsIGFscGhhID0gMC42LFxuICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIFxuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwLCBieSA9IDIpKSArIFxuICBsYWJzKHggPSBOVUxMLCB5ID0gXFwjIG9mIFAtTiBsb29wcyBwZXIgZ2VuZVxcKSArXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA4KSkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMywgbGFiZWwgPSBwYXN0ZTAoXFxwdjEyOiBcXCwgY29udlB2YWx1ZShwdjEyKSksXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxKSArXG4gIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgIClcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09fYmluYXJ5R3JvdXBcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgwLjgpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# Counting number of loop per genes
tempSum <- geneAnnoData %>% dplyr::select(peakID, gene, Anno2) %>% unnest(gene) %>% group_by(gene) %>%  summarize(
    peak = list(peakID),
    anno2 = list(Anno2),
    count = n())

tempSum <- tempSum %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\, NA))
) %>% dplyr::filter(!is.na(group)) %>% dplyr::filter(group %in% c(\group1\, \group2\))

# 
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$count
  distance2 <- (data %>% dplyr::filter(group ==group2) )$count
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


pv12 <- round(getPvalWilcox(tempSum,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(tempSum,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(tempSum,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(tempSum,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(tempSum,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(tempSum,\group5\, \group8\), 5)


p <- ggplot(tempSum, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA, color = \black\, alpha = 0.6,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\, show.legend = FALSE) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 10, by = 2)) + 
  labs(x = NULL, y = \# of P-N loops per gene\) +
  coord_cartesian(ylim = c(0, 8)) +
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  )+
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, convPvalue(pv12)),
           color = \black\, hjust = 0, size = 1) +
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )


fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_binaryGroup\)
width <- panelSize(0.8)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkRiM1Z1ZEdsdVp5QnVkVzFpWlhJZ2IyWWdiRzl2Y0NCd1pYSWdaMlZ1WlhOY2JuUmxiWEJUZFcwZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hCbFlXdEpSQ3dnWjJWdVpTd2dRVzV1YnpJcElDVStKU0IxYm01bGMzUW9aMlZ1WlNrZ0pUNGxJR2R5YjNWd1gySjVLR2RsYm1VcElDVStKU0FnYzNWdGJXRnlhWHBsS0Z4dUlDQWdJSEJsWVdzZ1BTQnNhWE4wS0hCbFlXdEpSQ2tzWEc0Z0lDQWdZVzV1YnpJZ1BTQnNhWE4wS0VGdWJtOHlLU3hjYmlBZ0lDQmpiM1Z1ZENBOUlHNG9LU2xjYmx4dWRHVnRjRk4xYlNBOExTQjBaVzF3VTNWdElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0JuY205MWNDQTlJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjREVzSUZ4Y1ozSnZkWEF4WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNESXNJRnhjWjNKdmRYQXlYRndzSUU1QktTbGNiaWtnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvSVdsekxtNWhLR2R5YjNWd0tTa2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ0pXbHVKU0JqS0Z4Y1ozSnZkWEF4WEZ3c0lGeGNaM0p2ZFhBeVhGd3BLVnh1WEc0aklGeHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TVNrZ0tTUmpiM1Z1ZEZ4dUlDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMW5jbTkxY0RJcElDa2tZMjkxYm5SY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1Y2JseHVjSFl4TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVGRXMHNYRnhuY205MWNERmNYQ3dnWEZ4bmNtOTFjREpjWENrc0lEVXBYRzRqSUhCMk1UVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdVM1Z0TEZ4Y1ozSnZkWEF4WEZ3c0lGeGNaM0p2ZFhBMVhGd3BMQ0ExS1Z4dUl5QndkakU0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZOMWJTeGNYR2R5YjNWd01WeGNMQ0JjWEdkeWIzVndPRnhjS1N3Z05TbGNiaU1nY0hZeU5TQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlRkVzBzWEZ4bmNtOTFjREpjWEN3Z1hGeG5jbTkxY0RWY1hDa3NJRFVwWEc0aklIQjJNamdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VTNWdExGeGNaM0p2ZFhBeVhGd3NJRnhjWjNKdmRYQTRYRndwTENBMUtWeHVJeUJ3ZGpVNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGTjFiU3hjWEdkeWIzVndOVnhjTENCY1hHZHliM1Z3T0Z4Y0tTd2dOU2xjYmx4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd1UzVnRMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnWTI5MWJuUXNJR1pwYkd3Z1BTQm5jbTkxY0NrcElDc2dYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVOU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN3Z1lXeHdhR0VnUFNBd0xqWXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnSUNBZ0lDQWdYRzRnSUhOallXeGxYM2xmWTI5dWRHbHVkVzkxY3loaWNtVmhhM01nUFNCelpYRW9NQ3dnTVRBc0lHSjVJRDBnTWlrcElDc2dYRzRnSUd4aFluTW9lQ0E5SUU1VlRFd3NJSGtnUFNCY1hDTWdiMllnVUMxT0lHeHZiM0J6SUhCbGNpQm5aVzVsWEZ3cElDdGNiaUFnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLREFzSURncEtTQXJYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGNiaUFnSUNCaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNYRzRnSUNBZ1oyVnZiU0E5SUZ4Y2NHOXBiblJjWEN3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlEQXVOU3hjYmlBZ0lDQm1hV3hzSUQwZ1hGeGliR0ZqYTF4Y0xDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hGeHVJQ0FwSzF4dUlDQmhibTV2ZEdGMFpTaGNYSFJsZUhSY1hDd2dlQ0E5SURFc0lIa2dQU0F6TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjWEhCMk1USTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQjJNVElwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJREVwSUN0Y2JpQWdkR2hsYldVb1hHNGdJQ0FnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUXVlQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJQ0FnSUNBZ0l5QlNiM1JoZEdVZ2VDMWhlR2x6SUd4aFltVnNjeUEwTlNCa1pXZHlaV1Z6WEc0Z0lDQWdJQ0JvYW5WemRDQTlJREVzSUNBZ0lDQWdJQ01nUVdScWRYTjBJR2h2Y21sNmIyNTBZV3dnYW5WemRHbG1hV05oZEdsdmJseHVJQ0FnSUNBZ2RtcDFjM1FnUFNBeElDQWdJQ0FnSUNBaklFRmthblZ6ZENCMlpYSjBhV05oYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY1hIUnlZVzV6Y0dGeVpXNTBYRndwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNBZ0tWeHVYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hHTnZkVzUwWDJKaGNuQnNiM1JmWkdsbVprZHliM1Z3WDJSVVFVZGZkbk5mUkUxVFQxOWlhVzVoY25sSGNtOTFjRnhjS1Z4dWQybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtEQXVPQ2txYlcxVWIwbHVZMmhjYm1obGFXZG9kQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNDFLU3B0YlZSdlNXNWphRnh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG4jIENvdW50aW5nIG51bWJlciBvZiBsb29wIHBlciBnZW5lc1xudGVtcFN1bSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QocGVha0lELCBnZW5lLCBBbm5vMikgJT4lIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lICBzdW1tYXJpemUoXG4gICAgcGVhayA9IGxpc3QocGVha0lEKSxcbiAgICBhbm5vMiA9IGxpc3QoQW5ubzIpLFxuICAgIGNvdW50ID0gbigpKVxuXG50ZW1wU3VtIDwtIHRlbXBTdW0gJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMiwgXFxncm91cDJcXCwgTkEpKVxuKSAlPiUgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKSAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxncm91cDFcXCwgXFxncm91cDJcXCkpXG5cbiMgXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGNvdW50XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRjb3VudFxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiMgcHYxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4jIHB2MTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuIyBwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2NTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KHRlbXBTdW0sIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEsIGNvbG9yID0gXFxibGFja1xcLCBhbHBoYSA9IDAuNixcbiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IFxcIyBvZiBQLU4gbG9vcHMgcGVyIGdlbmVcXCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgOCkpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIGNvbnZQdmFsdWUocHYxMikpLFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSkgK1xuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX2JpbmFyeUdyb3VwXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMC44KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBDb3VudGluZyBudW1iZXIgb2YgbG9vcCBwZXIgZ2VuZXNcbnRlbXBTdW0gPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KHBlYWtJRCwgZ2VuZSwgQW5ubzIpICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSAgc3VtbWFyaXplKFxuICAgIHBlYWsgPSBsaXN0KHBlYWtJRCksXG4gICAgYW5ubzIgPSBsaXN0KEFubm8yKSxcbiAgICBjb3VudCA9IG4oKSlcblxudGVtcFN1bSA8LSB0ZW1wU3VtICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDIsIFxcZ3JvdXAyXFwsIE5BKSlcbikgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSkgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpKVxuXG4jIFxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRjb3VudFxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkY291bnRcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4jIHB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHYyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4jIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxuIyBwdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wU3VtLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BLCBjb2xvciA9IFxcYmxhY2tcXCwgYWxwaGEgPSAwLjYsXG4gICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIHNob3cubGVnZW5kID0gRkFMU0UpICsgdGhlbWVfY2xhc3NpYygpICsgICAgICAgXG4gIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAsIGJ5ID0gMikpICsgXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBcXCMgb2YgUC1OIGxvb3BzIHBlciBnZW5lXFwpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDgpKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBjb252UHZhbHVlKHB2MTIpKSxcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpICtcbiAgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKVxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGNvdW50X2JhcnBsb3RfZGlmZkdyb3VwX2RUQUdfdnNfRE1TT19iaW5hcnlHcm91cFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDAuOCkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
# Counting number of loop per genes
tempSum <- geneAnnoData %>% dplyr::select(peakID, gene, Anno2) %>% unnest(gene) %>% group_by(gene) %>%  summarize(
    peak = list(peakID),
    anno2 = list(Anno2),
    count = n())

tempSum <- tempSum %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\, NA))
) %>% dplyr::filter(!is.na(group)) %>% dplyr::filter(group %in% c(\group1\, \group2\))

# 
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$count
  distance2 <- (data %>% dplyr::filter(group ==group2) )$count
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


pv12 <- round(getPvalWilcox(tempSum,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(tempSum,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(tempSum,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(tempSum,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(tempSum,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(tempSum,\group5\, \group8\), 5)


p <- ggplot(tempSum, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA, color = \black\, alpha = 0.6,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\, show.legend = FALSE) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 10, by = 2)) + 
  labs(x = NULL, y = \# of P-N loops per gene\) +
  coord_cartesian(ylim = c(0, 8)) +
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  )+
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, convPvalue(pv12)),
           color = \black\, hjust = 0, size = 1) +
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )


fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_binaryGroup\)
width <- panelSize(0.8)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



##### - Average loop size

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakkxeHVkR1Z0Y0RJZ1BDMGdkR1Z0Y0ZOMWJTQWxQaVVnY205M2QybHpaU2dwSUNVK0pTQnRkWFJoZEdVb2RHOTBZV3dnUFNCc1pXNW5kR2dvWVc1dWJ6SXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiblZ0WDNCd0lEMGdjM1Z0S0dGdWJtOHlJRDA5SUZ3aVVDMVFYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm5WdFgzQmxJRDBnYzNWdEtHRnVibTh5SUQwOUlGd2lVQzFGWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0J6SUQwZ2MzVnRLR0Z1Ym04eUlEMDlJRndpVUMxVFhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiblZ0WDNCNElEMGdjM1Z0S0dGdWJtOHlJRDA5SUZ3aVVDMVlYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21GMGFXOWZjbVZuSUQwZ0tHNTFiVjl3Y0NBcklHNTFiVjl3WlNrdmRHOTBZV3dzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WVhScGIxOXpkSElnUFNCdWRXMWZjSE12ZEc5MFlXd3BYRzVjYmlOellYWmxVa1JUS0hSbGJYQXlMQ0JvWlhKbEtISmxjM1ZzZEVScGNpd2dYQ0puWlc1bFgyeHZiM0JmYkdsdWExOUJORGcxTG5Ka2Mxd2lLU2xjYmx4dVhHNXNiMjl3Vkhsd1pTQThMU0IwWlcxd01pQWxQaVVnWjNKdmRYQmZZbmtvWjNKdmRYQXBJQ1UrSlNCemRXMXRZWEpwYzJVb2JuVnRYM0J3SUQwZ2MzVnRLRzUxYlY5d2NDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0JsSUQwZ2MzVnRLRzUxYlY5d1pTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0J6SUQwZ2MzVnRLRzUxYlY5d2N5a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0I0SUQwZ2MzVnRLRzUxYlY5d2VDa3BYRzVjYmx4dWJHOXZjRlI1Y0dWTWIyNW5JRHd0SUd4dmIzQlVlWEJsSUNVK0pTQndhWFp2ZEY5c2IyNW5aWElvTFdkeWIzVndMQ0J1WVcxbGMxOTBieUE5SUZ3aWRIbHdaVndpTENCMllXeDFaWE5mZEc4Z1BTQmNJbU52ZFc1MFhDSXBYRzVjYm14dmIzQlVlWEJsVEc5dVp5UjBlWEJsSUR3dElHWmhZM1J2Y2loc2IyOXdWSGx3WlV4dmJtY2tkSGx3WlN3Z2JHVjJaV3h6SUQwZ1l5aGNJbTUxYlY5d2NGd2lMQ0JjSW01MWJWOXdaVndpTENCY0ltNTFiVjl3YzF3aUxDQmNJbTUxYlY5d2VGd2lLU2xjYmx4dUl5QlFiRzkwZEdsdVoxeHVaMmR3Ykc5MEtHeHZiM0JVZVhCbFRHOXVaeXdnWVdWektHWnBiR3c5ZEhsd1pTd2dlVDFqYjNWdWRDd2dlRDFuY205MWNDa3BJQ3NnWEc0Z0lDQWdaMlZ2YlY5aVlYSW9jRzl6YVhScGIyNDlYQ0ptYVd4c1hDSXNJSE4wWVhROVhDSnBaR1Z1ZEdsMGVWd2lLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LVnh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG4jIyMjIyMjXG50ZW1wMiA8LSB0ZW1wU3VtICU+JSByb3d3aXNlKCkgJT4lIG11dGF0ZSh0b3RhbCA9IGxlbmd0aChhbm5vMiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHAgPSBzdW0oYW5ubzIgPT0gXFxQLVBcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGUgPSBzdW0oYW5ubzIgPT0gXFxQLUVcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHMgPSBzdW0oYW5ubzIgPT0gXFxQLVNcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHggPSBzdW0oYW5ubzIgPT0gXFxQLVhcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb19yZWcgPSAobnVtX3BwICsgbnVtX3BlKS90b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvX3N0ciA9IG51bV9wcy90b3RhbClcblxuI3NhdmVSRFModGVtcDIsIGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rX0E0ODUucmRzXFwpKVxuXG5cbmxvb3BUeXBlIDwtIHRlbXAyICU+JSBncm91cF9ieShncm91cCkgJT4lIHN1bW1hcmlzZShudW1fcHAgPSBzdW0obnVtX3BwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGUgPSBzdW0obnVtX3BlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHMgPSBzdW0obnVtX3BzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHggPSBzdW0obnVtX3B4KSlcblxuXG5sb29wVHlwZUxvbmcgPC0gbG9vcFR5cGUgJT4lIHBpdm90X2xvbmdlcigtZ3JvdXAsIG5hbWVzX3RvID0gXFx0eXBlXFwsIHZhbHVlc190byA9IFxcY291bnRcXClcblxubG9vcFR5cGVMb25nJHR5cGUgPC0gZmFjdG9yKGxvb3BUeXBlTG9uZyR0eXBlLCBsZXZlbHMgPSBjKFxcbnVtX3BwXFwsIFxcbnVtX3BlXFwsIFxcbnVtX3BzXFwsIFxcbnVtX3B4XFwpKVxuXG4jIFBsb3R0aW5nXG5nZ3Bsb3QobG9vcFR5cGVMb25nLCBhZXMoZmlsbD10eXBlLCB5PWNvdW50LCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdD1cXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
#######
temp2 <- tempSum %>% rowwise() %>% mutate(total = length(anno2),
                                 num_pp = sum(anno2 == \P-P\),
                                 num_pe = sum(anno2 == \P-E\),
                                 num_ps = sum(anno2 == \P-S\),
                                 num_px = sum(anno2 == \P-X\),
                                 ratio_reg = (num_pp + num_pe)/total,
                                 ratio_str = num_ps/total)

#saveRDS(temp2, here(resultDir, \gene_loop_link_A485.rds\))


loopType <- temp2 %>% group_by(group) %>% summarise(num_pp = sum(num_pp),
                                        num_pe = sum(num_pe),
                                        num_ps = sum(num_ps),
                                        num_px = sum(num_px))


loopTypeLong <- loopType %>% pivot_longer(-group, names_to = \type\, values_to = \count\)

loopTypeLong$type <- factor(loopTypeLong$type, levels = c(\num_pp\, \num_pe\, \num_ps\, \num_px\))

# Plotting
ggplot(loopTypeLong, aes(fill=type, y=count, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSTF4dWRHVnRjRElnUEMwZ2RHVnRjRk4xYlNBbFBpVWdjbTkzZDJselpTZ3BJQ1UrSlNCdGRYUmhkR1VvZEc5MFlXd2dQU0JzWlc1bmRHZ29ZVzV1YnpJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0J3SUQwZ2MzVnRLR0Z1Ym04eUlEMDlJRnhjVUMxUVhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiblZ0WDNCbElEMGdjM1Z0S0dGdWJtOHlJRDA5SUZ4Y1VDMUZYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm5WdFgzQnpJRDBnYzNWdEtHRnVibTh5SUQwOUlGeGNVQzFUWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0I0SUQwZ2MzVnRLR0Z1Ym04eUlEMDlJRnhjVUMxWVhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbUYwYVc5ZmNtVm5JRDBnS0c1MWJWOXdjQ0FySUc1MWJWOXdaU2t2ZEc5MFlXd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlZWFJwYjE5emRISWdQU0J1ZFcxZmNITXZkRzkwWVd3cFhHNWNiaU56WVhabFVrUlRLSFJsYlhBeUxDQm9aWEpsS0hKbGMzVnNkRVJwY2l3Z1hGeG5aVzVsWDJ4dmIzQmZiR2x1YTE5Qk5EZzFMbkprYzF4Y0tTbGNibHh1WEc1c2IyOXdWSGx3WlNBOExTQjBaVzF3TWlBbFBpVWdaM0p2ZFhCZllua29aM0p2ZFhBcElDVStKU0J6ZFcxdFlYSnBjMlVvYm5WdFgzQndJRDBnYzNWdEtHNTFiVjl3Y0Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm5WdFgzQmxJRDBnYzNWdEtHNTFiVjl3WlNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm5WdFgzQnpJRDBnYzNWdEtHNTFiVjl3Y3lrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm5WdFgzQjRJRDBnYzNWdEtHNTFiVjl3ZUNrcFhHNWNibHh1Ykc5dmNGUjVjR1ZNYjI1bklEd3RJR3h2YjNCVWVYQmxJQ1UrSlNCd2FYWnZkRjlzYjI1blpYSW9MV2R5YjNWd0xDQnVZVzFsYzE5MGJ5QTlJRnhjZEhsd1pWeGNMQ0IyWVd4MVpYTmZkRzhnUFNCY1hHTnZkVzUwWEZ3cFhHNWNibXh2YjNCVWVYQmxURzl1WnlSMGVYQmxJRHd0SUdaaFkzUnZjaWhzYjI5d1ZIbHdaVXh2Ym1ja2RIbHdaU3dnYkdWMlpXeHpJRDBnWXloY1hHNTFiVjl3Y0Z4Y0xDQmNYRzUxYlY5d1pWeGNMQ0JjWEc1MWJWOXdjMXhjTENCY1hHNTFiVjl3ZUZ4Y0tTbGNibHh1SXlCUWJHOTBkR2x1WjF4dVoyZHdiRzkwS0d4dmIzQlVlWEJsVEc5dVp5d2dZV1Z6S0dacGJHdzlkSGx3WlN3Z2VUMWpiM1Z1ZEN3Z2VEMW5jbTkxY0NrcElDc2dYRzRnSUNBZ1oyVnZiVjlpWVhJb2NHOXphWFJwYjI0OVhGeG1hV3hzWEZ3c0lITjBZWFE5WEZ4cFpHVnVkR2wwZVZ4Y0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tWeHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG4jIyMjIyMjXG50ZW1wMiA8LSB0ZW1wU3VtICU+JSByb3d3aXNlKCkgJT4lIG11dGF0ZSh0b3RhbCA9IGxlbmd0aChhbm5vMiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHAgPSBzdW0oYW5ubzIgPT0gXFxQLVBcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGUgPSBzdW0oYW5ubzIgPT0gXFxQLUVcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHMgPSBzdW0oYW5ubzIgPT0gXFxQLVNcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHggPSBzdW0oYW5ubzIgPT0gXFxQLVhcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb19yZWcgPSAobnVtX3BwICsgbnVtX3BlKS90b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvX3N0ciA9IG51bV9wcy90b3RhbClcblxuI3NhdmVSRFModGVtcDIsIGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rX0E0ODUucmRzXFwpKVxuXG5cbmxvb3BUeXBlIDwtIHRlbXAyICU+JSBncm91cF9ieShncm91cCkgJT4lIHN1bW1hcmlzZShudW1fcHAgPSBzdW0obnVtX3BwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGUgPSBzdW0obnVtX3BlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHMgPSBzdW0obnVtX3BzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHggPSBzdW0obnVtX3B4KSlcblxuXG5sb29wVHlwZUxvbmcgPC0gbG9vcFR5cGUgJT4lIHBpdm90X2xvbmdlcigtZ3JvdXAsIG5hbWVzX3RvID0gXFx0eXBlXFwsIHZhbHVlc190byA9IFxcY291bnRcXClcblxubG9vcFR5cGVMb25nJHR5cGUgPC0gZmFjdG9yKGxvb3BUeXBlTG9uZyR0eXBlLCBsZXZlbHMgPSBjKFxcbnVtX3BwXFwsIFxcbnVtX3BlXFwsIFxcbnVtX3BzXFwsIFxcbnVtX3B4XFwpKVxuXG4jIFBsb3R0aW5nXG5nZ3Bsb3QobG9vcFR5cGVMb25nLCBhZXMoZmlsbD10eXBlLCB5PWNvdW50LCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdD1cXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjI1xudGVtcDIgPC0gdGVtcFN1bSAlPiUgcm93d2lzZSgpICU+JSBtdXRhdGUodG90YWwgPSBsZW5ndGgoYW5ubzIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BwID0gc3VtKGFubm8yID09IFxcUC1QXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BlID0gc3VtKGFubm8yID09IFxcUC1FXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BzID0gc3VtKGFubm8yID09IFxcUC1TXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3B4ID0gc3VtKGFubm8yID09IFxcUC1YXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW9fcmVnID0gKG51bV9wcCArIG51bV9wZSkvdG90YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb19zdHIgPSBudW1fcHMvdG90YWwpXG5cbiNzYXZlUkRTKHRlbXAyLCBoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGlua19BNDg1LnJkc1xcKSlcblxuXG5sb29wVHlwZSA8LSB0ZW1wMiAlPiUgZ3JvdXBfYnkoZ3JvdXApICU+JSBzdW1tYXJpc2UobnVtX3BwID0gc3VtKG51bV9wcCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BlID0gc3VtKG51bV9wZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BzID0gc3VtKG51bV9wcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3B4ID0gc3VtKG51bV9weCkpXG5cblxubG9vcFR5cGVMb25nIDwtIGxvb3BUeXBlICU+JSBwaXZvdF9sb25nZXIoLWdyb3VwLCBuYW1lc190byA9IFxcdHlwZVxcLCB2YWx1ZXNfdG8gPSBcXGNvdW50XFwpXG5cbmxvb3BUeXBlTG9uZyR0eXBlIDwtIGZhY3Rvcihsb29wVHlwZUxvbmckdHlwZSwgbGV2ZWxzID0gYyhcXG51bV9wcFxcLCBcXG51bV9wZVxcLCBcXG51bV9wc1xcLCBcXG51bV9weFxcKSlcblxuIyBQbG90dGluZ1xuZ2dwbG90KGxvb3BUeXBlTG9uZywgYWVzKGZpbGw9dHlwZSwgeT1jb3VudCwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
#######
temp2 <- tempSum %>% rowwise() %>% mutate(total = length(anno2),
                                 num_pp = sum(anno2 == \P-P\),
                                 num_pe = sum(anno2 == \P-E\),
                                 num_ps = sum(anno2 == \P-S\),
                                 num_px = sum(anno2 == \P-X\),
                                 ratio_reg = (num_pp + num_pe)/total,
                                 ratio_str = num_ps/total)

#saveRDS(temp2, here(resultDir, \gene_loop_link_A485.rds\))


loopType <- temp2 %>% group_by(group) %>% summarise(num_pp = sum(num_pp),
                                        num_pe = sum(num_pe),
                                        num_ps = sum(num_ps),
                                        num_px = sum(num_px))


loopTypeLong <- loopType %>% pivot_longer(-group, names_to = \type\, values_to = \count\)

loopTypeLong$type <- factor(loopTypeLong$type, levels = c(\num_pp\, \num_pe\, \num_ps\, \num_px\))

# Plotting
ggplot(loopTypeLong, aes(fill=type, y=count, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-N

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakl5TmNiaU5RTFZCY2JtUmhkR0VnUEMwZ2RHVnRjRElnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJRzUxYlY5d2NDbGNibU52Ykc1aGJXVnpLR1JoZEdFcElEd3RJR01vWENKbmNtOTFjRndpTENCY0ltTnZkVzUwWENJcFhHNXdkakV5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN4Y0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLU3dnTlNsY2JpTWdjSFl4TlNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFc1hDSm5jbTkxY0RGY0lpd2dYQ0puY205MWNEVmNJaWtzSURVcFhHNGpJSEIyTVRnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGd2laM0p2ZFhBeFhDSXNJRndpWjNKdmRYQTRYQ0lwTENBMUtWeHVJeUJ3ZGpJMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTeGNJbWR5YjNWd01sd2lMQ0JjSW1keWIzVndOVndpS1N3Z05TbGNiaU1nY0hZeU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYQ0puY205MWNESmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzRqSUhCMk5UZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMRndpWjNKdmRYQTFYQ0lzSUZ3aVozSnZkWEE0WENJcExDQTFLVnh1WEc1Y2JuQWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQmpiM1Z1ZEN3Z1ptbHNiQ0E5SUdkeWIzVndLU2tnS3lCY2JpQWdaMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0MUxDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMQ0JoYkhCb1lTQTlJREF1Tml4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJaXdnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QWdJQ0FnSUNCY2JpQWdjMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR0p5WldGcmN5QTlJSE5sY1Nnd0xDQXhNQ3dnWW5rZ1BTQXlLU2tnS3lCY2JpQWdiR0ZpY3loNElEMGdUbFZNVEN3Z2VTQTlJRndpSXlCdlppQlFMVkFnYkc5dmNITWdjR1Z5SUdkbGJtVmNJaWtnSzF4dUlDQmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb01Dd2dOQ2twSUN0Y2JpQWdjM1JoZEY5emRXMXRZWEo1S0Z4dUlDQWdJR0ZsY3lobmNtOTFjQ0E5SUdkeWIzVndLU3dnWm5WdUlEMGdiV1ZoYml4Y2JpQWdJQ0JuWlc5dElEMGdYQ0p3YjJsdWRGd2lMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTUM0MUxGeHVJQ0FnSUdacGJHd2dQU0JjSW1Kc1lXTnJYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpWEc0Z0lDa3JYRzRnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdNU3dnZVNBOUlETXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGd2ljSFl4TWpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hZeE1pa3BMRnh1SUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ01Ta2dLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpVMHNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpVMHNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZEM1NElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnWVc1bmJHVWdQU0EwTlN3Z0lDQWdJQ0FqSUZKdmRHRjBaU0I0TFdGNGFYTWdiR0ZpWld4eklEUTFJR1JsWjNKbFpYTmNiaUFnSUNBZ0lHaHFkWE4wSUQwZ01Td2dJQ0FnSUNBZ0l5QkJaR3AxYzNRZ2FHOXlhWHB2Ym5SaGJDQnFkWE4wYVdacFkyRjBhVzl1WEc0Z0lDQWdJQ0IyYW5WemRDQTlJREVnSUNBZ0lDQWdJQ01nUVdScWRYTjBJSFpsY25ScFkyRnNJR3AxYzNScFptbGpZWFJwYjI1Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRndpZEhKaGJuTndZWEpsYm5SY0lpa3NYRzRnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlsY2JpQWdJQ0FwWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbU52ZFc1MFgySmhjbkJzYjNSZlpHbG1aa2R5YjNWd1gyUlVRVWRmZG5OZlJFMVRUMTl3Y0Y5aWFXNWhjbmxIY205MWNGd2lLVnh1ZDJsa2RHZ2dQQzBnY0dGdVpXeFRhWHBsS0RBdU9Da3FiVzFVYjBsdVkyaGNibWhsYVdkb2RDQThMU0J3WVc1bGJGTnBlbVVvTVM0MUtTcHRiVlJ2U1c1amFGeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jIyMjIyMjI1xuI1AtUFxuZGF0YSA8LSB0ZW1wMiAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgbnVtX3BwKVxuY29sbmFtZXMoZGF0YSkgPC0gYyhcXGdyb3VwXFwsIFxcY291bnRcXClcbnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuIyBwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSwgY29sb3IgPSBcXGJsYWNrXFwsIGFscGhhID0gMC42LFxuICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIFxuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwLCBieSA9IDIpKSArIFxuICBsYWJzKHggPSBOVUxMLCB5ID0gXFwjIG9mIFAtUCBsb29wcyBwZXIgZ2VuZVxcKSArXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA0KSkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMywgbGFiZWwgPSBwYXN0ZTAoXFxwdjEyOiBcXCwgY29udlB2YWx1ZShwdjEyKSksXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxKSArXG4gIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgIClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3BwX2JpbmFyeUdyb3VwXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMC44KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
########
#P-P
data <- temp2 %>% dplyr::select(group, num_pp)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)


p <- ggplot(data, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA, color = \black\, alpha = 0.6,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\, show.legend = FALSE) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 10, by = 2)) + 
  labs(x = NULL, y = \# of P-P loops per gene\) +
  coord_cartesian(ylim = c(0, 4)) +
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  )+
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, convPvalue(pv12)),
           color = \black\, hjust = 0, size = 1) +
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )

fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_pp_binaryGroup\)
width <- panelSize(0.8)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSXlOY2JpTlFMVkJjYm1SaGRHRWdQQzBnZEdWdGNESWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHNTFiVjl3Y0NsY2JtTnZiRzVoYldWektHUmhkR0VwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEdOdmRXNTBYRndwWEc1d2RqRXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tTd2dOU2xjYmlNZ2NIWXhOU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0VzWEZ4bmNtOTFjREZjWEN3Z1hGeG5jbTkxY0RWY1hDa3NJRFVwWEc0aklIQjJNVGdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTEZ4Y1ozSnZkWEF4WEZ3c0lGeGNaM0p2ZFhBNFhGd3BMQ0ExS1Z4dUl5QndkakkxSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN4Y1hHZHliM1Z3TWx4Y0xDQmNYR2R5YjNWd05WeGNLU3dnTlNsY2JpTWdjSFl5T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFc1hGeG5jbTkxY0RKY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNGpJSEIyTlRnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGeGNaM0p2ZFhBMVhGd3NJRnhjWjNKdmRYQTRYRndwTENBMUtWeHVYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCamIzVnVkQ3dnWm1sc2JDQTlJR2R5YjNWd0tTa2dLeUJjYmlBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzQxTENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFc0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xDQmhiSEJvWVNBOUlEQXVOaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hDd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lBZ0lDQWdJQ0JjYmlBZ2MyTmhiR1ZmZVY5amIyNTBhVzUxYjNWektHSnlaV0ZyY3lBOUlITmxjU2d3TENBeE1Dd2dZbmtnUFNBeUtTa2dLeUJjYmlBZ2JHRmljeWg0SUQwZ1RsVk1UQ3dnZVNBOUlGeGNJeUJ2WmlCUUxWQWdiRzl2Y0hNZ2NHVnlJR2RsYm1WY1hDa2dLMXh1SUNCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTUN3Z05Da3BJQ3RjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLRnh1SUNBZ0lHRmxjeWhuY205MWNDQTlJR2R5YjNWd0tTd2dablZ1SUQwZ2JXVmhiaXhjYmlBZ0lDQm5aVzl0SUQwZ1hGeHdiMmx1ZEZ4Y0xDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNQzQxTEZ4dUlDQWdJR1pwYkd3Z1BTQmNYR0pzWVdOclhGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNYRzRnSUNrclhHNGdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ01Td2dlU0E5SURNc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z4Y2NIWXhNam9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSFl4TWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTVNrZ0sxeHVJQ0IwYUdWdFpTaGNiaUFnSUNBZ0lHRjRhWE11ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQzU0SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdZVzVuYkdVZ1BTQTBOU3dnSUNBZ0lDQWpJRkp2ZEdGMFpTQjRMV0Y0YVhNZ2JHRmlaV3h6SURRMUlHUmxaM0psWlhOY2JpQWdJQ0FnSUdocWRYTjBJRDBnTVN3Z0lDQWdJQ0FnSXlCQlpHcDFjM1FnYUc5eWFYcHZiblJoYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0lDQjJhblZ6ZENBOUlERWdJQ0FnSUNBZ0lDTWdRV1JxZFhOMElIWmxjblJwWTJGc0lHcDFjM1JwWm1sallYUnBiMjVjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11YkdsdVpTQTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJwWTJ0eklEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcExGeHVJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGeGNkSEpoYm5Od1lYSmxiblJjWENrc1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWxjYmlBZ0lDQXBYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hHTnZkVzUwWDJKaGNuQnNiM1JmWkdsbVprZHliM1Z3WDJSVVFVZGZkbk5mUkUxVFQxOXdjRjlpYVc1aGNubEhjbTkxY0Z4Y0tWeHVkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLREF1T0NrcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzQxS1NwdGJWUnZTVzVqYUZ4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLVBcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wcClcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiMgcHYxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4jIHB2MTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuIyBwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2NTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEsIGNvbG9yID0gXFxibGFja1xcLCBhbHBoYSA9IDAuNixcbiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IFxcIyBvZiBQLVAgbG9vcHMgcGVyIGdlbmVcXCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNCkpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIGNvbnZQdmFsdWUocHYxMikpLFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSkgK1xuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGNvdW50X2JhcnBsb3RfZGlmZkdyb3VwX2RUQUdfdnNfRE1TT19wcF9iaW5hcnlHcm91cFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDAuOCkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLVBcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wcClcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiMgcHYxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4jIHB2MTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuIyBwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2NTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEsIGNvbG9yID0gXFxibGFja1xcLCBhbHBoYSA9IDAuNixcbiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IFxcIyBvZiBQLVAgbG9vcHMgcGVyIGdlbmVcXCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNCkpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIGNvbnZQdmFsdWUocHYxMikpLFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSkgK1xuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGNvdW50X2JhcnBsb3RfZGlmZkdyb3VwX2RUQUdfdnNfRE1TT19wcF9iaW5hcnlHcm91cFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDAuOCkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
########
#P-P
data <- temp2 %>% dplyr::select(group, num_pp)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)


p <- ggplot(data, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA, color = \black\, alpha = 0.6,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\, show.legend = FALSE) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 10, by = 2)) + 
  labs(x = NULL, y = \# of P-P loops per gene\) +
  coord_cartesian(ylim = c(0, 4)) +
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  )+
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, convPvalue(pv12)),
           color = \black\, hjust = 0, size = 1) +
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )

fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_pp_binaryGroup\)
width <- panelSize(0.8)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Counting loop types

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakl5TmNiaU5RTFVWY2JtUmhkR0VnUEMwZ2RHVnRjRElnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJRzUxYlY5d1pTbGNibU52Ykc1aGJXVnpLR1JoZEdFcElEd3RJR01vWENKbmNtOTFjRndpTENCY0ltTnZkVzUwWENJcFhHNXdkakV5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN4Y0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLU3dnTlNsY2JseHVYRzV3SUR3dElHZG5jR3h2ZENoa1lYUmhMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnWTI5MWJuUXNJR1pwYkd3Z1BTQm5jbTkxY0NrcElDc2dYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVOU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z1lXeHdhR0VnUFNBd0xqWXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENJc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnSUNBZ0lDQWdYRzRnSUhOallXeGxYM2xmWTI5dWRHbHVkVzkxY3loaWNtVmhhM01nUFNCelpYRW9NQ3dnTVRBc0lHSjVJRDBnTWlrcElDc2dYRzRnSUd4aFluTW9lQ0E5SUU1VlRFd3NJSGtnUFNCY0lpTWdiMllnVUMxRklHeHZiM0J6SUhCbGNpQm5aVzVsWENJcElDdGNiaUFnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLREFzSURRcEtTQXJYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGNiaUFnSUNCaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNYRzRnSUNBZ1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlEQXVOU3hjYmlBZ0lDQm1hV3hzSUQwZ1hDSmliR0ZqYTF3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lseHVJQ0FwSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SURFc0lIa2dQU0F6TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5CMk1USTZJRndpTENCamIyNTJVSFpoYkhWbEtIQjJNVElwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJREVwSUN0Y2JpQWdkR2hsYldVb1hHNGdJQ0FnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUXVlQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJQ0FnSUNBZ0l5QlNiM1JoZEdVZ2VDMWhlR2x6SUd4aFltVnNjeUEwTlNCa1pXZHlaV1Z6WEc0Z0lDQWdJQ0JvYW5WemRDQTlJREVzSUNBZ0lDQWdJQ01nUVdScWRYTjBJR2h2Y21sNmIyNTBZV3dnYW5WemRHbG1hV05oZEdsdmJseHVJQ0FnSUNBZ2RtcDFjM1FnUFNBeElDQWdJQ0FnSUNBaklFRmthblZ6ZENCMlpYSjBhV05oYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY0luUnlZVzV6Y0dGeVpXNTBYQ0lwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNBZ0tWeHVYRzVjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2lZMjkxYm5SZlltRnljR3h2ZEY5a2FXWm1SM0p2ZFhCZlpGUkJSMTkyYzE5RVRWTlBYM0JsWDJKcGJtRnllVWR5YjNWd1hDSXBYRzUzYVdSMGFDQThMU0J3WVc1bGJGTnBlbVVvTUM0NEtTcHRiVlJ2U1c1amFGeHVhR1ZwWjJoMElEd3RJSEJoYm1Wc1UybDZaU2d4TGpVcEttMXRWRzlKYm1Ob1hHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG4jIyMjIyMjI1xuI1AtRVxuZGF0YSA8LSB0ZW1wMiAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgbnVtX3BlKVxuY29sbmFtZXMoZGF0YSkgPC0gYyhcXGdyb3VwXFwsIFxcY291bnRcXClcbnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEsIGNvbG9yID0gXFxibGFja1xcLCBhbHBoYSA9IDAuNixcbiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IFxcIyBvZiBQLUUgbG9vcHMgcGVyIGdlbmVcXCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNCkpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIGNvbnZQdmFsdWUocHYxMikpLFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSkgK1xuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApXG5cblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09fcGVfYmluYXJ5R3JvdXBcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgwLjgpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
########
#P-E
data <- temp2 %>% dplyr::select(group, num_pe)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)


p <- ggplot(data, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA, color = \black\, alpha = 0.6,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\, show.legend = FALSE) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 10, by = 2)) + 
  labs(x = NULL, y = \# of P-E loops per gene\) +
  coord_cartesian(ylim = c(0, 4)) +
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  )+
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, convPvalue(pv12)),
           color = \black\, hjust = 0, size = 1) +
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )



fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_pe_binaryGroup\)
width <- panelSize(0.8)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSXlOY2JpTlFMVVZjYm1SaGRHRWdQQzBnZEdWdGNESWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHNTFiVjl3WlNsY2JtTnZiRzVoYldWektHUmhkR0VwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEdOdmRXNTBYRndwWEc1d2RqRXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tTd2dOU2xjYmx4dVhHNXdJRHd0SUdkbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdZMjkxYm5Rc0lHWnBiR3dnUFNCbmNtOTFjQ2twSUNzZ1hHNGdJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU5Td2diM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnWVd4d2FHRWdQU0F3TGpZc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRndzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDc2dJQ0FnSUNBZ1hHNGdJSE5qWVd4bFgzbGZZMjl1ZEdsdWRXOTFjeWhpY21WaGEzTWdQU0J6WlhFb01Dd2dNVEFzSUdKNUlEMGdNaWtwSUNzZ1hHNGdJR3hoWW5Nb2VDQTlJRTVWVEV3c0lIa2dQU0JjWENNZ2IyWWdVQzFGSUd4dmIzQnpJSEJsY2lCblpXNWxYRndwSUN0Y2JpQWdZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktEQXNJRFFwS1NBclhHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoY2JpQWdJQ0JoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURBdU5TeGNiaUFnSUNCbWFXeHNJRDBnWEZ4aWJHRmphMXhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEZ4dUlDQXBLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJREVzSUhrZ1BTQXpMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEIyTVRJNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCMk1USXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlERXBJQ3RjYmlBZ2RHaGxiV1VvWEc0Z0lDQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVk5MRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVk5MRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRdWVDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lDQWdJQ0FnSXlCU2IzUmhkR1VnZUMxaGVHbHpJR3hoWW1Wc2N5QTBOU0JrWldkeVpXVnpYRzRnSUNBZ0lDQm9hblZ6ZENBOUlERXNJQ0FnSUNBZ0lDTWdRV1JxZFhOMElHaHZjbWw2YjI1MFlXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUlDQWdJQ0FnZG1wMWMzUWdQU0F4SUNBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0IyWlhKMGFXTmhiQ0JxZFhOMGFXWnBZMkYwYVc5dVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjWEhSeVlXNXpjR0Z5Wlc1MFhGd3BMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ0FnS1Z4dVhHNWNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y1kyOTFiblJmWW1GeWNHeHZkRjlrYVdabVIzSnZkWEJmWkZSQlIxOTJjMTlFVFZOUFgzQmxYMkpwYm1GeWVVZHliM1Z3WEZ3cFhHNTNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NQzQ0S1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3hMalVwS20xdFZHOUpibU5vWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG4jIyMjIyMjI1xuI1AtRVxuZGF0YSA8LSB0ZW1wMiAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgbnVtX3BlKVxuY29sbmFtZXMoZGF0YSkgPC0gYyhcXGdyb3VwXFwsIFxcY291bnRcXClcbnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEsIGNvbG9yID0gXFxibGFja1xcLCBhbHBoYSA9IDAuNixcbiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IFxcIyBvZiBQLUUgbG9vcHMgcGVyIGdlbmVcXCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNCkpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIGNvbnZQdmFsdWUocHYxMikpLFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSkgK1xuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApXG5cblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09fcGVfYmluYXJ5R3JvdXBcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgwLjgpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLUVcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wZSlcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcblxuXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BLCBjb2xvciA9IFxcYmxhY2tcXCwgYWxwaGEgPSAwLjYsXG4gICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIHNob3cubGVnZW5kID0gRkFMU0UpICsgdGhlbWVfY2xhc3NpYygpICsgICAgICAgXG4gIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAsIGJ5ID0gMikpICsgXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBcXCMgb2YgUC1FIGxvb3BzIHBlciBnZW5lXFwpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDQpKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBjb252UHZhbHVlKHB2MTIpKSxcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpICtcbiAgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKVxuXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3BlX2JpbmFyeUdyb3VwXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMC44KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
########
#P-E
data <- temp2 %>% dplyr::select(group, num_pe)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)


p <- ggplot(data, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA, color = \black\, alpha = 0.6,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\, show.legend = FALSE) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 10, by = 2)) + 
  labs(x = NULL, y = \# of P-E loops per gene\) +
  coord_cartesian(ylim = c(0, 4)) +
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  )+
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, convPvalue(pv12)),
           color = \black\, hjust = 0, size = 1) +
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )



fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_pe_binaryGroup\)
width <- panelSize(0.8)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-P

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakl5TmNiaU5RTFZOY2JtUmhkR0VnUEMwZ2RHVnRjRElnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJRzUxYlY5d2N5bGNibU52Ykc1aGJXVnpLR1JoZEdFcElEd3RJR01vWENKbmNtOTFjRndpTENCY0ltTnZkVzUwWENJcFhHNXdkakV5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN4Y0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLU3dnTlNsY2JseHVYRzV3SUR3dElHZG5jR3h2ZENoa1lYUmhMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnWTI5MWJuUXNJR1pwYkd3Z1BTQm5jbTkxY0NrcElDc2dYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVOU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z1lXeHdhR0VnUFNBd0xqWXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENJc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnSUNBZ0lDQWdYRzRnSUhOallXeGxYM2xmWTI5dWRHbHVkVzkxY3loaWNtVmhhM01nUFNCelpYRW9NQ3dnTVRBc0lHSjVJRDBnTWlrcElDc2dYRzRnSUd4aFluTW9lQ0E5SUU1VlRFd3NJSGtnUFNCY0lpTWdiMllnVUMxVElHeHZiM0J6SUhCbGNpQm5aVzVsWENJcElDdGNiaUFnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLREFzSURRcEtTQXJYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGNiaUFnSUNCaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNYRzRnSUNBZ1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlEQXVOU3hjYmlBZ0lDQm1hV3hzSUQwZ1hDSmliR0ZqYTF3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lseHVJQ0FwSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SURFc0lIa2dQU0F6TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5CMk1USTZJRndpTENCamIyNTJVSFpoYkhWbEtIQjJNVElwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJREVwSUN0Y2JpQWdkR2hsYldVb1hHNGdJQ0FnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUXVlQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJQ0FnSUNBZ0l5QlNiM1JoZEdVZ2VDMWhlR2x6SUd4aFltVnNjeUEwTlNCa1pXZHlaV1Z6WEc0Z0lDQWdJQ0JvYW5WemRDQTlJREVzSUNBZ0lDQWdJQ01nUVdScWRYTjBJR2h2Y21sNmIyNTBZV3dnYW5WemRHbG1hV05oZEdsdmJseHVJQ0FnSUNBZ2RtcDFjM1FnUFNBeElDQWdJQ0FnSUNBaklFRmthblZ6ZENCMlpYSjBhV05oYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY0luUnlZVzV6Y0dGeVpXNTBYQ0lwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNBZ0tWeHVYRzVjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2lZMjkxYm5SZlltRnljR3h2ZEY5a2FXWm1SM0p2ZFhCZlpGUkJSMTkyYzE5RVRWTlBYM0J6WDJKcGJtRnllVWR5YjNWd1hDSXBYRzUzYVdSMGFDQThMU0J3WVc1bGJGTnBlbVVvTUM0NEtTcHRiVlJ2U1c1amFGeHVhR1ZwWjJoMElEd3RJSEJoYm1Wc1UybDZaU2d4TGpVcEttMXRWRzlKYm1Ob1hHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG4jIyMjIyMjI1xuI1AtU1xuZGF0YSA8LSB0ZW1wMiAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgbnVtX3BzKVxuY29sbmFtZXMoZGF0YSkgPC0gYyhcXGdyb3VwXFwsIFxcY291bnRcXClcbnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEsIGNvbG9yID0gXFxibGFja1xcLCBhbHBoYSA9IDAuNixcbiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IFxcIyBvZiBQLVMgbG9vcHMgcGVyIGdlbmVcXCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNCkpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIGNvbnZQdmFsdWUocHYxMikpLFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSkgK1xuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApXG5cblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09fcHNfYmluYXJ5R3JvdXBcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgwLjgpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
########
#P-S
data <- temp2 %>% dplyr::select(group, num_ps)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)


p <- ggplot(data, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA, color = \black\, alpha = 0.6,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\, show.legend = FALSE) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 10, by = 2)) + 
  labs(x = NULL, y = \# of P-S loops per gene\) +
  coord_cartesian(ylim = c(0, 4)) +
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  )+
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, convPvalue(pv12)),
           color = \black\, hjust = 0, size = 1) +
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )



fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_ps_binaryGroup\)
width <- panelSize(0.8)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSXlOY2JpTlFMVk5jYm1SaGRHRWdQQzBnZEdWdGNESWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHNTFiVjl3Y3lsY2JtTnZiRzVoYldWektHUmhkR0VwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEdOdmRXNTBYRndwWEc1d2RqRXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tTd2dOU2xjYmx4dVhHNXdJRHd0SUdkbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdZMjkxYm5Rc0lHWnBiR3dnUFNCbmNtOTFjQ2twSUNzZ1hHNGdJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU5Td2diM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnWVd4d2FHRWdQU0F3TGpZc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRndzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDc2dJQ0FnSUNBZ1hHNGdJSE5qWVd4bFgzbGZZMjl1ZEdsdWRXOTFjeWhpY21WaGEzTWdQU0J6WlhFb01Dd2dNVEFzSUdKNUlEMGdNaWtwSUNzZ1hHNGdJR3hoWW5Nb2VDQTlJRTVWVEV3c0lIa2dQU0JjWENNZ2IyWWdVQzFUSUd4dmIzQnpJSEJsY2lCblpXNWxYRndwSUN0Y2JpQWdZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktEQXNJRFFwS1NBclhHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoY2JpQWdJQ0JoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURBdU5TeGNiaUFnSUNCbWFXeHNJRDBnWEZ4aWJHRmphMXhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEZ4dUlDQXBLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJREVzSUhrZ1BTQXpMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEIyTVRJNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCMk1USXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlERXBJQ3RjYmlBZ2RHaGxiV1VvWEc0Z0lDQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVk5MRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVk5MRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRdWVDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lDQWdJQ0FnSXlCU2IzUmhkR1VnZUMxaGVHbHpJR3hoWW1Wc2N5QTBOU0JrWldkeVpXVnpYRzRnSUNBZ0lDQm9hblZ6ZENBOUlERXNJQ0FnSUNBZ0lDTWdRV1JxZFhOMElHaHZjbWw2YjI1MFlXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUlDQWdJQ0FnZG1wMWMzUWdQU0F4SUNBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0IyWlhKMGFXTmhiQ0JxZFhOMGFXWnBZMkYwYVc5dVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjWEhSeVlXNXpjR0Z5Wlc1MFhGd3BMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ0FnS1Z4dVhHNWNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y1kyOTFiblJmWW1GeWNHeHZkRjlrYVdabVIzSnZkWEJmWkZSQlIxOTJjMTlFVFZOUFgzQnpYMkpwYm1GeWVVZHliM1Z3WEZ3cFhHNTNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NQzQ0S1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3hMalVwS20xdFZHOUpibU5vWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG4jIyMjIyMjI1xuI1AtU1xuZGF0YSA8LSB0ZW1wMiAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgbnVtX3BzKVxuY29sbmFtZXMoZGF0YSkgPC0gYyhcXGdyb3VwXFwsIFxcY291bnRcXClcbnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEsIGNvbG9yID0gXFxibGFja1xcLCBhbHBoYSA9IDAuNixcbiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IFxcIyBvZiBQLVMgbG9vcHMgcGVyIGdlbmVcXCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNCkpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIGNvbnZQdmFsdWUocHYxMikpLFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSkgK1xuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApXG5cblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09fcHNfYmluYXJ5R3JvdXBcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgwLjgpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLVNcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wcylcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcblxuXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BLCBjb2xvciA9IFxcYmxhY2tcXCwgYWxwaGEgPSAwLjYsXG4gICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIHNob3cubGVnZW5kID0gRkFMU0UpICsgdGhlbWVfY2xhc3NpYygpICsgICAgICAgXG4gIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAsIGJ5ID0gMikpICsgXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBcXCMgb2YgUC1TIGxvb3BzIHBlciBnZW5lXFwpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDQpKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBjb252UHZhbHVlKHB2MTIpKSxcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpICtcbiAgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKVxuXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3BzX2JpbmFyeUdyb3VwXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMC44KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
########
#P-S
data <- temp2 %>% dplyr::select(group, num_ps)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)


p <- ggplot(data, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA, color = \black\, alpha = 0.6,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\, show.legend = FALSE) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 10, by = 2)) + 
  labs(x = NULL, y = \# of P-S loops per gene\) +
  coord_cartesian(ylim = c(0, 4)) +
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  )+
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, convPvalue(pv12)),
           color = \black\, hjust = 0, size = 1) +
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )



fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_ps_binaryGroup\)
width <- panelSize(0.8)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-E

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnYkc5aFpFeHZiM0JCYm01dlJHRjBZU2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYM0F0Ymw5bGJuTmxiV0pzVEdsemRDNTBjM1pjSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVdabVEzVjBiMlptSUQwZ01DNHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaGJtNXZUR2x6ZENBOUlHTW9YQ0pRTFZCY0lpd2dYQ0pRTFVWY0lpd2dYQ0pRTFZOY0lpd2dYQ0pRTFZoY0lpa3BKVDRsSUZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dScGMzUmhibU5sSUQwZ2MzUmhjblF5SUMwZ2MzUmhjblF4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCbFlXdEpSQ0E5SUhCaGMzUmxLR05vY205dE1Td2djM1JoY25ReExDQnpkR0Z5ZERJc0lITmxjQ0E5SUZ3aVgxd2lLU2xjYmx4dVhHNWNiaU1qSUVScGRtbGthVzVuSUdkbGJtVnpJR2x1ZEc4Z1ozSnZkWEJ6WEc1MFpXMXdJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGthV1ptWDJSVVFVZGZSRTFUVHl3Z1pHbHpkR0Z1WTJVc0lHZGxibVVwSUNVK0pTQmNiaUFnZFc1dVpYTjBLR2RsYm1VcElDVStKU0JuY205MWNGOWllU2huWlc1bEtTQWxQaVZjYmlBZ2MzVnRiV0Z5YVhwbEtHMWxZVzVmWkdsbVpsOXpZMjl5WlNBOUlHMWxZVzRvWkdsbVpsOWtWRUZIWDBSTlUwOHBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2JXVmhibDlrYVhOMFlXNWpaU0E5SUcxbFlXNG9aR2x6ZEdGdVkyVXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0xtZHliM1Z3Y3lBOUlDZGtjbTl3SnlsY2JseHVaR2xtWmk1U1RrRWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVpHbG1abDlITVM1a1ZFRkhYMGN4TGpKcExtUlVRVWRmZG5OZlJ6RXVNbWt1UkUxVFR5NTBjM1pjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR1Z1YzJWdFlteGZaMlZ1WlY5cFpDd2diRzluTWtadmJHUkRhR0Z1WjJVc0lITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2NHRmthaXdnWlhoMFpYSnVZV3hmWjJWdVpWOXVZVzFsS1Z4dVhHNXRZWGhNYjJjeVJrTWdQU0F5WEc1Y2JuUmxiWEFnUEMwZ2JHVm1kRjlxYjJsdUtIUmxiWEFzSUdScFptWXVVazVCTENCaWVTQTlJR01vWENKblpXNWxYQ0lnUFNCY0ltVnVjMlZ0WW14ZloyVnVaVjlwWkZ3aUtTa2dKVDRsSUZ4dUlDQmtjbTl3WDI1aEtITm9jbWx1YTJWa1gyeHZaekpHUXlsY2JseHVYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibVJwWm1aRGRYUnZabVlnUEMwZ01DNHlYRzRqSUZ4dWRHVnRjQ0E4TFNCMFpXMXdJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dkeWIzVndJRDBnYVdabGJITmxLRzFsWVc1ZlpHbG1abDl6WTI5eVpTQThJQzFrYVdabVEzVjBiMlptTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXRabU5EZFhSdlptWXNJREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoemFISnBibXRsWkY5c2IyY3lSa01nUEdaalEzVjBiMlptTENBeUxDQXpLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHMWxZVzVmWkdsbVpsOXpZMjl5WlNBOElHUnBabVpEZFhSdlptWXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2h6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0F0Wm1ORGRYUnZabVlzSURRc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z1ptTkRkWFJ2Wm1Zc0lEVXNJRFlwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtITm9jbWx1YTJWa1gyeHZaekpHUXlBOElDMW1ZME4xZEc5bVppd2dOeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2h6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0JtWTBOMWRHOW1aaXdnT0N3Z09Ta3BLU2twWEc1Y2JseHVaMlZ1WlM1bmNtOTFjREVnUEMwZ0tIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnTVNrcEpHZGxibVZjYm1kbGJtVXVaM0p2ZFhBeUlEd3RJQ2gwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlESXBLU1JuWlc1bFhHNW5aVzVsTG1keWIzVndNeUE4TFNBb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0F6S1Nra1oyVnVaVnh1WjJWdVpTNW5jbTkxY0RRZ1BDMGdLSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ05Da3BKR2RsYm1WY2JtZGxibVV1WjNKdmRYQTFJRHd0SUNoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRFVwS1NSblpXNWxYRzVuWlc1bExtZHliM1Z3TmlBOExTQW9kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNBMktTa2taMlZ1WlZ4dVoyVnVaUzVuY205MWNEY2dQQzBnS0hSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdOeWtwSkdkbGJtVmNibWRsYm1VdVozSnZkWEE0SUR3dElDaDBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SURncEtTUm5aVzVsWEc1blpXNWxMbWR5YjNWd09TQThMU0FvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQTVLU2trWjJWdVpWeHVYRzVtZDNKcGRHVW9LSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ01Ta3BMQ0JvWlhKbEtISmxaa1JwY2l3Z1hDSm5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQXhMblJ6ZGx3aUtTd2djMlZ3SUQwZ1hDSmNYSFJjSWlsY2JtWjNjbWwwWlNnb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0F5S1Nrc0lHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RJdWRITjJYQ0lwTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1Wm5keWFYUmxLQ2gwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlETXBLU3dnYUdWeVpTaHlaV1pFYVhJc0lGd2laMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJkeWIzVndNeTUwYzNaY0lpa3NJSE5sY0NBOUlGd2lYRngwWENJcFhHNW1kM0pwZEdVb0tIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnTkNrcExDQm9aWEpsS0hKbFprUnBjaXdnWENKblpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBMExuUnpkbHdpS1N3Z2MyVndJRDBnWENKY1hIUmNJaWxjYm1aM2NtbDBaU2dvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQTFLU2tzSUdobGNtVW9jbVZtUkdseUxDQmNJbWRsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjRFV1ZEhOMlhDSXBMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUtWeHVabmR5YVhSbEtDaDBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SURZcEtTd2dhR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd05pNTBjM1pjSWlrc0lITmxjQ0E5SUZ3aVhGeDBYQ0lwWEc1bWQzSnBkR1VvS0hSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdOeWtwTENCb1pYSmxLSEpsWmtScGNpd2dYQ0puWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlozSnZkWEEzTG5SemRsd2lLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNibVozY21sMFpTZ29kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNBNEtTa3NJR2hsY21Vb2NtVm1SR2x5TENCY0ltZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNEZ3VkSE4yWENJcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVpuZHlhWFJsS0NoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRGtwS1N3Z2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3T1M1MGMzWmNJaWtzSUhObGNDQTlJRndpWEZ4MFhDSXBYRzVjYmx4dUl5QkJaR1JwYm1jZ1ozSnZkWEFnYVc1bWIzSnRZWFJwYjI0Z2RHOGdaMlZ1WlVGdWJtOWNibWRsYm1WQmJtNXZSR0YwWVNBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hjYmlBZ1ozSnZkWEFnUFNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVXVaM0p2ZFhBeExDQmNJbWR5YjNWd01Wd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEF5TENCY0ltZHliM1Z3TWx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCblpXNWxMbWR5YjNWd015d2dYQ0puY205MWNETmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVV1WjNKdmRYQTBMQ0JjSW1keWIzVndORndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVV1WjNKdmRYQTFMQ0JjSW1keWIzVndOVndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCblpXNWxMbWR5YjNWd05pd2dYQ0puY205MWNEWmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEEzTENCY0ltZHliM1Z3TjF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVXVaM0p2ZFhBNExDQmNJbWR5YjNWd09Gd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCblpXNWxMbWR5YjNWd09Td2dYQ0puY205MWNEbGNJaXdnVGtFcEtTa3BLU2twS1NsY2JpbGNibHh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSklPiUgXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgcGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKVxuXG5cblxuIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHNcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksXG4gICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksXG4gICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5cbm1heExvZzJGQyA9IDJcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRyb3BfbmEoc2hyaW5rZWRfbG9nMkZDKVxuXG5cbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZkN1dG9mZiA8LSAwLjJcbiMgXG50ZW1wIDwtIHRlbXAgJT4lXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBpZmVsc2UobWVhbl9kaWZmX3Njb3JlIDwgLWRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiwgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8ZmNDdXRvZmYsIDIsIDMpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobWVhbl9kaWZmX3Njb3JlIDwgZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiwgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPCBmY0N1dG9mZiwgNSwgNikpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmLCA3LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IGZjQ3V0b2ZmLCA4LCA5KSkpKSlcblxuXG5nZW5lLmdyb3VwMSA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAxKSkkZ2VuZVxuZ2VuZS5ncm91cDIgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMikpJGdlbmVcbmdlbmUuZ3JvdXAzIDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDMpKSRnZW5lXG5nZW5lLmdyb3VwNCA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA0KSkkZ2VuZVxuZ2VuZS5ncm91cDUgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNSkpJGdlbmVcbmdlbmUuZ3JvdXA2IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDYpKSRnZW5lXG5nZW5lLmdyb3VwNyA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA3KSkkZ2VuZVxuZ2VuZS5ncm91cDggPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOCkpJGdlbmVcbmdlbmUuZ3JvdXA5IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDkpKSRnZW5lXG5cbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAxKSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDIpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMykpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAzLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA0KSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDQudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDUpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwNS50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNikpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA2LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA3KSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDcudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDgpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwOC50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOSkpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA5LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuXG4jIEFkZGluZyBncm91cCBpbmZvcm1hdGlvbiB0byBnZW5lQW5ub1xuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgdW5uZXN0KGdlbmUpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAzLCBcXGdyb3VwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDQsIFxcZ3JvdXA0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA2LCBcXGdyb3VwNlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDcsIFxcZ3JvdXA3XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDgsIFxcZ3JvdXA4XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA5LCBcXGdyb3VwOVxcLCBOQSkpKSkpKSkpKVxuKVxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)


fcCutoff <- 0.5
diffCutoff <- 0.2
# 
temp <- temp %>%
  dplyr::mutate(group = ifelse(mean_diff_score < -diffCutoff,
                               ifelse(shrinked_log2FC < -fcCutoff, 1,
                                      ifelse(shrinked_log2FC <fcCutoff, 2, 3)),
                               ifelse(mean_diff_score < diffCutoff,
                                      ifelse(shrinked_log2FC < -fcCutoff, 4,
                                             ifelse(shrinked_log2FC < fcCutoff, 5, 6)),
                                      ifelse(shrinked_log2FC < -fcCutoff, 7,
                                             ifelse(shrinked_log2FC < fcCutoff, 8, 9)))))


gene.group1 <- (temp %>% dplyr::filter(group == 1))$gene
gene.group2 <- (temp %>% dplyr::filter(group == 2))$gene
gene.group3 <- (temp %>% dplyr::filter(group == 3))$gene
gene.group4 <- (temp %>% dplyr::filter(group == 4))$gene
gene.group5 <- (temp %>% dplyr::filter(group == 5))$gene
gene.group6 <- (temp %>% dplyr::filter(group == 6))$gene
gene.group7 <- (temp %>% dplyr::filter(group == 7))$gene
gene.group8 <- (temp %>% dplyr::filter(group == 8))$gene
gene.group9 <- (temp %>% dplyr::filter(group == 9))$gene

fwrite((temp %>% dplyr::filter(group == 1)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 2)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 3)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group3.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 4)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group4.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 5)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 6)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group6.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 7)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group7.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 8)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 9)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group9.tsv\), sep = \\t\)


# Adding group information to geneAnno
geneAnnoData <- geneAnnoData %>% unnest(gene) %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\,
                        ifelse(gene %in% gene.group3, \group3\,
                               ifelse(gene %in% gene.group4, \group4\,
                                      ifelse(gene %in% gene.group5, \group5\,
                                             ifelse(gene %in% gene.group6, \group6\,
                                                    ifelse(gene %in% gene.group7, \group7\,
                                                           ifelse(gene %in% gene.group8, \group8\,
                                                                  ifelse(gene %in% gene.group9, \group9\, NA)))))))))
)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gzQXRibDlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptUTNWMGIyWm1JRDBnTUM0eUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hGeFFMVkJjWEN3Z1hGeFFMVVZjWEN3Z1hGeFFMVk5jWEN3Z1hGeFFMVmhjWENrcEpUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJsWVd0SlJDQTlJSEJoYzNSbEtHTm9jbTl0TVN3Z2MzUmhjblF4TENCemRHRnlkRElzSUhObGNDQTlJRnhjWDF4Y0tTbGNibHh1WEc1Y2JpTWpJRVJwZG1sa2FXNW5JR2RsYm1WeklHbHVkRzhnWjNKdmRYQnpYRzUwWlcxd0lEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoa2FXWm1YMlJVUVVkZlJFMVRUeXdnWkdsemRHRnVZMlVzSUdkbGJtVXBJQ1UrSlNCY2JpQWdkVzV1WlhOMEtHZGxibVVwSUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0cxbFlXNWZaR2xtWmw5elkyOXlaU0E5SUcxbFlXNG9aR2xtWmw5a1ZFRkhYMFJOVTA4cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnYldWaGJsOWthWE4wWVc1alpTQTlJRzFsWVc0b1pHbHpkR0Z1WTJVcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnTG1keWIzVndjeUE5SUNka2NtOXdKeWxjYmx4dVpHbG1aaTVTVGtFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHVnVjMlZ0WW14ZloyVnVaVjlwWkN3Z2JHOW5Na1p2YkdSRGFHRnVaMlVzSUhOb2NtbHVhMlZrWDJ4dlp6SkdReXdnY0dGa2Fpd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxLVnh1WEc1dFlYaE1iMmN5UmtNZ1BTQXlYRzVjYm5SbGJYQWdQQzBnYkdWbWRGOXFiMmx1S0hSbGJYQXNJR1JwWm1ZdVVrNUJMQ0JpZVNBOUlHTW9YRnhuWlc1bFhGd2dQU0JjWEdWdWMyVnRZbXhmWjJWdVpWOXBaRnhjS1NrZ0pUNGxJRnh1SUNCa2NtOXdYMjVoS0hOb2NtbHVhMlZrWDJ4dlp6SkdReWxjYmx4dVhHNW1ZME4xZEc5bVppQThMU0F3TGpWY2JtUnBabVpEZFhSdlptWWdQQzBnTUM0eVhHNGpJRnh1ZEdWdGNDQThMU0IwWlcxd0lDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdhV1psYkhObEtHMWxZVzVmWkdsbVpsOXpZMjl5WlNBOElDMWthV1ptUTNWMGIyWm1MRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoemFISnBibXRsWkY5c2IyY3lSa01nUENBdFptTkRkWFJ2Wm1Zc0lERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2h6YUhKcGJtdGxaRjlzYjJjeVJrTWdQR1pqUTNWMGIyWm1MQ0F5TENBektTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0cxbFlXNWZaR2xtWmw5elkyOXlaU0E4SUdScFptWkRkWFJ2Wm1Zc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXRabU5EZFhSdlptWXNJRFFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHdnWm1ORGRYUnZabVlzSURVc0lEWXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0hOb2NtbHVhMlZrWDJ4dlp6SkdReUE4SUMxbVkwTjFkRzltWml3Z055eGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQm1ZME4xZEc5bVppd2dPQ3dnT1NrcEtTa3BYRzVjYmx4dVoyVnVaUzVuY205MWNERWdQQzBnS0hSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdNU2twSkdkbGJtVmNibWRsYm1VdVozSnZkWEF5SUR3dElDaDBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SURJcEtTUm5aVzVsWEc1blpXNWxMbWR5YjNWd015QThMU0FvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQXpLU2trWjJWdVpWeHVaMlZ1WlM1bmNtOTFjRFFnUEMwZ0tIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnTkNrcEpHZGxibVZjYm1kbGJtVXVaM0p2ZFhBMUlEd3RJQ2gwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlEVXBLU1JuWlc1bFhHNW5aVzVsTG1keWIzVndOaUE4TFNBb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0EyS1Nra1oyVnVaVnh1WjJWdVpTNW5jbTkxY0RjZ1BDMGdLSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ055a3BKR2RsYm1WY2JtZGxibVV1WjNKdmRYQTRJRHd0SUNoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRGdwS1NSblpXNWxYRzVuWlc1bExtZHliM1Z3T1NBOExTQW9kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNBNUtTa2taMlZ1WlZ4dVhHNW1kM0pwZEdVb0tIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnTVNrcExDQm9aWEpsS0hKbFprUnBjaXdnWEZ4blpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBeExuUnpkbHhjS1N3Z2MyVndJRDBnWEZ4Y1hIUmNYQ2xjYm1aM2NtbDBaU2dvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQXlLU2tzSUdobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjREl1ZEhOMlhGd3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVabmR5YVhSbEtDaDBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SURNcEtTd2dhR1Z5WlNoeVpXWkVhWElzSUZ4Y1oyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd015NTBjM1pjWENrc0lITmxjQ0E5SUZ4Y1hGeDBYRndwWEc1bWQzSnBkR1VvS0hSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdOQ2twTENCb1pYSmxLSEpsWmtScGNpd2dYRnhuWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlozSnZkWEEwTG5SemRseGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDbGNibVozY21sMFpTZ29kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNBMUtTa3NJR2hsY21Vb2NtVm1SR2x5TENCY1hHZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNEVXVkSE4yWEZ3cExDQnpaWEFnUFNCY1hGeGNkRnhjS1Z4dVpuZHlhWFJsS0NoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRFlwS1N3Z2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3Tmk1MGMzWmNYQ2tzSUhObGNDQTlJRnhjWEZ4MFhGd3BYRzVtZDNKcGRHVW9LSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ055a3BMQ0JvWlhKbEtISmxaa1JwY2l3Z1hGeG5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQTNMblJ6ZGx4Y0tTd2djMlZ3SUQwZ1hGeGNYSFJjWENsY2JtWjNjbWwwWlNnb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0E0S1Nrc0lHaGxjbVVvY21WbVJHbHlMQ0JjWEdkbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RndWRITjJYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1Wm5keWFYUmxLQ2gwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlEa3BLU3dnYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJkeWIzVndPUzUwYzNaY1hDa3NJSE5sY0NBOUlGeGNYRngwWEZ3cFhHNWNibHh1SXlCQlpHUnBibWNnWjNKdmRYQWdhVzVtYjNKdFlYUnBiMjRnZEc4Z1oyVnVaVUZ1Ym05Y2JtZGxibVZCYm01dlJHRjBZU0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnWjNKdmRYQWdQU0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEF4TENCY1hHZHliM1Z3TVZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVV1WjNKdmRYQXlMQ0JjWEdkeWIzVndNbHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bExtZHliM1Z3TXl3Z1hGeG5jbTkxY0ROY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVXVaM0p2ZFhBMExDQmNYR2R5YjNWd05GeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVXVaM0p2ZFhBMUxDQmNYR2R5YjNWd05WeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bExtZHliM1Z3Tml3Z1hGeG5jbTkxY0RaY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHZGxibVV1WjNKdmRYQTNMQ0JjWEdkeWIzVndOMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEE0TENCY1hHZHliM1Z3T0Z4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bExtZHliM1Z3T1N3Z1hGeG5jbTkxY0RsY1hDd2dUa0VwS1NrcEtTa3BLU2xjYmlsY2JseHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSklPiUgXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgcGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKVxuXG5cblxuIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHNcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksXG4gICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksXG4gICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5cbm1heExvZzJGQyA9IDJcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRyb3BfbmEoc2hyaW5rZWRfbG9nMkZDKVxuXG5cbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZkN1dG9mZiA8LSAwLjJcbiMgXG50ZW1wIDwtIHRlbXAgJT4lXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBpZmVsc2UobWVhbl9kaWZmX3Njb3JlIDwgLWRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiwgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8ZmNDdXRvZmYsIDIsIDMpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobWVhbl9kaWZmX3Njb3JlIDwgZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiwgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPCBmY0N1dG9mZiwgNSwgNikpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmLCA3LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IGZjQ3V0b2ZmLCA4LCA5KSkpKSlcblxuXG5nZW5lLmdyb3VwMSA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAxKSkkZ2VuZVxuZ2VuZS5ncm91cDIgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMikpJGdlbmVcbmdlbmUuZ3JvdXAzIDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDMpKSRnZW5lXG5nZW5lLmdyb3VwNCA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA0KSkkZ2VuZVxuZ2VuZS5ncm91cDUgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNSkpJGdlbmVcbmdlbmUuZ3JvdXA2IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDYpKSRnZW5lXG5nZW5lLmdyb3VwNyA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA3KSkkZ2VuZVxuZ2VuZS5ncm91cDggPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOCkpJGdlbmVcbmdlbmUuZ3JvdXA5IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDkpKSRnZW5lXG5cbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAxKSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDIpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMykpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAzLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA0KSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDQudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDUpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwNS50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNikpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA2LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA3KSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDcudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDgpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwOC50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOSkpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA5LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuXG4jIEFkZGluZyBncm91cCBpbmZvcm1hdGlvbiB0byBnZW5lQW5ub1xuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgdW5uZXN0KGdlbmUpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAzLCBcXGdyb3VwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDQsIFxcZ3JvdXA0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA2LCBcXGdyb3VwNlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDcsIFxcZ3JvdXA3XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDgsIFxcZ3JvdXA4XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA5LCBcXGdyb3VwOVxcLCBOQSkpKSkpKSkpKVxuKVxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgIHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSlcblxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9kVEFHX0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxuXG5mY0N1dG9mZiA8LSAwLjVcbmRpZmZDdXRvZmYgPC0gMC4yXG4jIFxudGVtcCA8LSB0ZW1wICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gaWZlbHNlKG1lYW5fZGlmZl9zY29yZSA8IC1kaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYsIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPGZjQ3V0b2ZmLCAyLCAzKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG1lYW5fZGlmZl9zY29yZSA8IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYsIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hyaW5rZWRfbG9nMkZDIDwgZmNDdXRvZmYsIDUsIDYpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiwgNyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPCBmY0N1dG9mZiwgOCwgOSkpKSkpXG5cblxuZ2VuZS5ncm91cDEgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMSkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDIpKSRnZW5lXG5nZW5lLmdyb3VwMyA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAzKSkkZ2VuZVxuZ2VuZS5ncm91cDQgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNCkpJGdlbmVcbmdlbmUuZ3JvdXA1IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDUpKSRnZW5lXG5nZW5lLmdyb3VwNiA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA2KSkkZ2VuZVxuZ2VuZS5ncm91cDcgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNykpJGdlbmVcbmdlbmUuZ3JvdXA4IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDgpKSRnZW5lXG5nZW5lLmdyb3VwOSA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA5KSkkZ2VuZVxuXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMSkpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAyKSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDIudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDMpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNCkpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA0LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA1KSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDUudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDYpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwNi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNykpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA3LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA4KSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDkpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwOS50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cblxuIyBBZGRpbmcgZ3JvdXAgaW5mb3JtYXRpb24gdG8gZ2VuZUFubm9cbmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIHVubmVzdChnZW5lKSAlPiUgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAxLCBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAyLCBcXGdyb3VwMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMywgXFxncm91cDNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA0LCBcXGdyb3VwNFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA1LCBcXGdyb3VwNVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNiwgXFxncm91cDZcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA3LCBcXGdyb3VwN1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA4LCBcXGdyb3VwOFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwOSwgXFxncm91cDlcXCwgTkEpKSkpKSkpKSlcbilcblxuXG5gYGBcbmBgYCJ9 -->

```r
```r
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)


fcCutoff <- 0.5
diffCutoff <- 0.2
# 
temp <- temp %>%
  dplyr::mutate(group = ifelse(mean_diff_score < -diffCutoff,
                               ifelse(shrinked_log2FC < -fcCutoff, 1,
                                      ifelse(shrinked_log2FC <fcCutoff, 2, 3)),
                               ifelse(mean_diff_score < diffCutoff,
                                      ifelse(shrinked_log2FC < -fcCutoff, 4,
                                             ifelse(shrinked_log2FC < fcCutoff, 5, 6)),
                                      ifelse(shrinked_log2FC < -fcCutoff, 7,
                                             ifelse(shrinked_log2FC < fcCutoff, 8, 9)))))


gene.group1 <- (temp %>% dplyr::filter(group == 1))$gene
gene.group2 <- (temp %>% dplyr::filter(group == 2))$gene
gene.group3 <- (temp %>% dplyr::filter(group == 3))$gene
gene.group4 <- (temp %>% dplyr::filter(group == 4))$gene
gene.group5 <- (temp %>% dplyr::filter(group == 5))$gene
gene.group6 <- (temp %>% dplyr::filter(group == 6))$gene
gene.group7 <- (temp %>% dplyr::filter(group == 7))$gene
gene.group8 <- (temp %>% dplyr::filter(group == 8))$gene
gene.group9 <- (temp %>% dplyr::filter(group == 9))$gene

fwrite((temp %>% dplyr::filter(group == 1)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 2)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 3)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group3.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 4)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group4.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 5)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 6)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group6.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 7)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group7.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 8)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 9)), here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group9.tsv\), sep = \\t\)


# Adding group information to geneAnno
geneAnnoData <- geneAnnoData %>% unnest(gene) %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\,
                        ifelse(gene %in% gene.group3, \group3\,
                               ifelse(gene %in% gene.group4, \group4\,
                                      ifelse(gene %in% gene.group5, \group5\,
                                             ifelse(gene %in% gene.group6, \group6\,
                                                    ifelse(gene %in% gene.group7, \group7\,
                                                           ifelse(gene %in% gene.group8, \group8\,
                                                                  ifelse(gene %in% gene.group9, \group9\, NA)))))))))
)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-S

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVSMDh4SUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxMbWR5YjNWd01Td2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY0lrVk9VMFZOUWt4Y0lpd2diMjUwSUQwZ1hDSkNVRndpS1Z4dVIwOHlJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bExtZHliM1Z3TWl3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lLVnh1UjA4MUlEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsTG1keWIzVndOU3dnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUtWeHVSMDg0SUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxMbWR5YjNWd09Dd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY0lrVk9VMFZOUWt4Y0lpd2diMjUwSUQwZ1hDSkNVRndpS1Z4dVhHNUhUekV1WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNoSFR6RXBYRzVIVHpJdVpHWWdQQzBnWVhNdVpHRjBZUzVtY21GdFpTaEhUeklwWEc1SFR6TXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hIVHpVcFhHNUhUelF1WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNoSFR6Z3BYRzVjYm5OMVluTmxkREVnUEMwZ1IwOHhMbVJtSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VsRUxDQkVaWE5qY21sd2RHbHZiaXdnUjJWdVpWSmhkR2x2TENCd0xtRmthblZ6ZENrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCY0ltZHliM1Z3TVZ3aUtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hjYmlBZ0lDQm5jaUE5SUhOaGNIQnNlU2hIWlc1bFVtRjBhVzhzSUdaMWJtTjBhVzl1S0hncElIdGNiaUFnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjSWk5Y0lseHVJQ0FnSUNBZ2NHRnlkSE1nUEMwZ2RXNXNhWE4wS0hOMGNuTndiR2wwS0hnc0lGd2lMMXdpS1NsY2JpQWdJQ0FnSUNNZ1EyOXVkbVZ5ZENCMGJ5QnVkVzFsY21saklHRnVaQ0J3WlhKbWIzSnRJSFJvWlNCa2FYWnBjMmx2Ymx4dUlDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SUNBZ0lIMHBYRzRnSUNrZ0pUNGxJR1J3YkhseU9qcGhjbkpoYm1kbEtHUmxjMk1vWjNJcEtWeHVjM1ZpYzJWME1pQThMU0JIVHpJdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxFZGxibVZTWVhScGJ5d2djQzVoWkdwMWMzUXBJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdYQ0puY205MWNESmNJaWtnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1hHNGdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0Z0lDQWdJQ0FqSUZOd2JHbDBJSFJvWlNCemRISnBibWNnWW5rZ1hDSXZYQ0pjYmlBZ0lDQWdJSEJoY25SeklEd3RJSFZ1YkdsemRDaHpkSEp6Y0d4cGRDaDRMQ0JjSWk5Y0lpa3BYRzRnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaUFnSUNBZ0lHRnpMbTUxYldWeWFXTW9jR0Z5ZEhOYk1WMHBJQzhnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN5WFNsY2JpQWdJQ0I5S1Z4dUlDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYm5OMVluTmxkRE1nUEMwZ1IwOHpMbVJtSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VsRUxDQkVaWE5qY21sd2RHbHZiaXhIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ3aVozSnZkWEF6WENJcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNBZ0lHZHlJRDBnYzJGd2NHeDVLRWRsYm1WU1lYUnBieXdnWm5WdVkzUnBiMjRvZUNrZ2UxeHVJQ0FnSUNBZ0l5QlRjR3hwZENCMGFHVWdjM1J5YVc1bklHSjVJRndpTDF3aVhHNGdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hDSXZYQ0lwS1Z4dUlDQWdJQ0FnSXlCRGIyNTJaWEowSUhSdklHNTFiV1Z5YVdNZ1lXNWtJSEJsY21admNtMGdkR2hsSUdScGRtbHphVzl1WEc0Z0lDQWdJQ0JoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekZkS1NBdklHRnpMbTUxYldWeWFXTW9jR0Z5ZEhOYk1sMHBYRzRnSUNBZ2ZTbGNiaUFnS1NBbFBpVWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pHVnpZeWhuY2lrcFhHNWNia2RQYkdsemRDQThMU0JtWVdOMGIzSW9ZeWhjSWtkUE9qQXdNek13TURKY0lpd2dYQ0pIVHpvd01EY3dNemN6WENJc0lGd2lSMDg2TURBME9EY3pNRndpTENCY0lrZFBPakF3TXpFeE1ETmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKSFR6b3dNREl5TmpFelhDSXNJRndpUjA4Nk1EQTFNRGMyTjF3aUxDQmNJa2RQT2pBd016UTBOekJjSWl3Z1hDSkhUem93TURFMk1EVTFYQ0lzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lrZFBPakF3TURZek9UZGNJaXdnWENKSFR6b3dNRE13T1RBd1hDSXNJRndpUjA4Nk1EQXdPRE00TUZ3aUtTbGNibHh1WkdGMFlTQThMU0JpYVc1a1gzSnZkM01vWW1sdVpGOXliM2R6S0hOMVluTmxkREVzSUhOMVluTmxkRElwTENCemRXSnpaWFF6S1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaEpSQ0FsYVc0bElFZFBiR2x6ZENsY2JseHVaR1Z6WTA5eVpHVnlJRHd0SUhOdmNuUW9kVzVwY1hWbEtHUmhkR0VrUkdWelkzSnBjSFJwYjI0cEtWdGpLREVzSURJc0lEVXNJRGNzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F6TENBMExDQTJMQ0E0TENBNUxDQXhNQ3dnTVRFcFhWeHVYRzV3SUR3dElHZG5jR3h2ZENoa1lYUmhMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnWm1GamRHOXlLRVJsYzJOeWFYQjBhVzl1TENCc1pYWmxiQ0E5SUdSbGMyTlBjbVJsY2lrc0lHTnZiRzl5SUQwZ2NDNWhaR3AxYzNRc0lITnBlbVVnUFNCbmNpa3BJQ3NnWEc0Z0lHZGxiMjFmY0c5cGJuUW9LU0FySUhSb1pXMWxYMkozS0NrZ0sxeHVJQ0J6WTJGc1pWOWpiMnh2Y2w5bmNtRmthV1Z1ZENoc2IzY2dQU0JjSW5KbFpGd2lMQ0JvYVdkb0lEMGdYQ0ppYkhWbFhDSXNJR3hwYldsMGN5QTlJR01vTUN3Z01DNHdOU2twSUN0Y2JpQWdjMk5oYkdWZmMybDZaVjlqYjI1MGFXNTFiM1Z6S0hKaGJtZGxJRDBnWXlnd0xDQXpLU2tnSzF4dUlDQnNZV0p6S0hnZ1BTQk9WVXhNTENCNUlEMGdUbFZNVENrZ0sxeHVJQ0IwYUdWdFpTaGhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb2MybDZaU0E5SURZcExDQWdJeUJUWlhRZ1lYaHBjeUIwWlhoMElITnBlbVZjYmlBZ0lDQWdJQ0FnWVhocGN5NTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOaWtzSUNNZ1UyVjBJR0Y0YVhNZ2RHbDBiR1VnYzJsNlpTQW9hV1lnYm05MElISmxiVzkyWldRcFhHNGdJQ0FnSUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBMktTd2dJeUJUWlhRZ2JHVm5aVzVrSUhSbGVIUWdjMmw2WlZ4dUlDQWdJQ0FnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb2MybDZaU0E5SURZcEtTQmNibHh1Wm1sc1pVNWhiV1VnUEMwZ2FHVnlaU2htYVdkRWFYSXNJRndpTGk1Y0lpd2dYQ0pIVDF3aUxDQmNJa2RQWDJkeWIzVndjMXdpS1Z4dWFHVnBaMmgwSUQwZ01seHVkMmxrZEdnZ1BTQXpMalZjYm5OMloyeHBkR1VvY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbkdPMSA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPMiA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPNSA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDUsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPOCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDgsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcblxuR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoR08xKVxuR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoR08yKVxuR08zLmRmIDwtIGFzLmRhdGEuZnJhbWUoR081KVxuR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoR084KVxuXG5zdWJzZXQxIDwtIEdPMS5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxncm91cDFcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbnN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbixHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcZ3JvdXAyXFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4gICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4gICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4gICAgfSlcbiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG5zdWJzZXQzIDwtIEdPMy5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXGdyb3VwM1xcKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHtcbiAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiAgICAgICMgQ29udmVydCB0byBudW1lcmljIGFuZCBwZXJmb3JtIHRoZSBkaXZpc2lvblxuICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuICAgIH0pXG4gICkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZ3IpKVxuXG5HT2xpc3QgPC0gZmFjdG9yKGMoXFxHTzowMDMzMDAyXFwsIFxcR086MDA3MDM3M1xcLCBcXEdPOjAwNDg3MzBcXCwgXFxHTzowMDMxMTAzXFwsXG4gICAgICAgICAgICAgICAgIFxcR086MDAyMjYxM1xcLCBcXEdPOjAwNTA3NjdcXCwgXFxHTzowMDM0NDcwXFwsIFxcR086MDAxNjA1NVxcLCBcbiAgICAgICAgICAgICAgICAgXFxHTzowMDA2Mzk3XFwsIFxcR086MDAzMDkwMFxcLCBcXEdPOjAwMDgzODBcXCkpXG5cbmRhdGEgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQxLCBzdWJzZXQyKSwgc3Vic2V0MykgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpXG5cbmRlc2NPcmRlciA8LSBzb3J0KHVuaXF1ZShkYXRhJERlc2NyaXB0aW9uKSlbYygxLCAyLCA1LCA3LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgNCwgNiwgOCwgOSwgMTAsIDExKV1cblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGZhY3RvcihEZXNjcmlwdGlvbiwgbGV2ZWwgPSBkZXNjT3JkZXIpLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICtcbiAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gXFxyZWRcXCwgaGlnaCA9IFxcYmx1ZVxcLCBsaW1pdHMgPSBjKDAsIDAuMDUpKSArXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICtcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgICMgU2V0IGF4aXMgdGV4dCBzaXplXG4gICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemVcbiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkgXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXC4uXFwsIFxcR09cXCwgXFxHT19ncm91cHNcXClcbmhlaWdodCA9IDJcbndpZHRoID0gMy41XG5zdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
GO1 <- enrichGO(gene = gene.group1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO2 <- enrichGO(gene = gene.group2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO5 <- enrichGO(gene = gene.group5, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO8 <- enrichGO(gene = gene.group8, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)

GO1.df <- as.data.frame(GO1)
GO2.df <- as.data.frame(GO2)
GO3.df <- as.data.frame(GO5)
GO4.df <- as.data.frame(GO8)

subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \group1\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))
subset2 <- GO2.df %>% dplyr::select(ID, Description,GeneRatio, p.adjust) %>% dplyr::mutate(group = \group2\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))
subset3 <- GO3.df %>% dplyr::select(ID, Description,GeneRatio, p.adjust) %>% dplyr::mutate(group = \group3\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))

GOlist <- factor(c(\GO:0033002\, \GO:0070373\, \GO:0048730\, \GO:0031103\,
                 \GO:0022613\, \GO:0050767\, \GO:0034470\, \GO:0016055\, 
                 \GO:0006397\, \GO:0030900\, \GO:0008380\))

data <- bind_rows(bind_rows(subset1, subset2), subset3) %>%
  dplyr::filter(ID %in% GOlist)

descOrder <- sort(unique(data$Description))[c(1, 2, 5, 7,
                                 3, 4, 6, 8, 9, 10, 11)]

p <- ggplot(data, aes(x = group, y = factor(Description, level = descOrder), color = p.adjust, size = gr)) + 
  geom_point() + theme_bw() +
  scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
  scale_size_continuous(range = c(0, 3)) +
  labs(x = NULL, y = NULL) +
  theme(axis.text = element_text(size = 6),  # Set axis text size
        axis.title = element_text(size = 6), # Set axis title size (if not removed)
        legend.text = element_text(size = 6), # Set legend text size
        legend.title = element_text(size = 6)) 

fileName <- here(figDir, \..\, \GO\, \GO_groups\)
height = 2
width = 3.5
svglite(paste0(fileName, \.svg\), height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVIwOHhJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bExtZHliM1Z3TVN3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjWEVWT1UwVk5Ra3hjWEN3Z2IyNTBJRDBnWEZ4Q1VGeGNLVnh1UjA4eUlEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsTG1keWIzVndNaXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0tWeHVSMDgxSUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxMbWR5YjNWd05Td2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjS1Z4dVIwODRJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bExtZHliM1Z3T0N3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjWEVWT1UwVk5Ra3hjWEN3Z2IyNTBJRDBnWEZ4Q1VGeGNLVnh1WEc1SFR6RXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hIVHpFcFhHNUhUekl1WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNoSFR6SXBYRzVIVHpNdVpHWWdQQzBnWVhNdVpHRjBZUzVtY21GdFpTaEhUelVwWEc1SFR6UXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hIVHpncFhHNWNibk4xWW5ObGRERWdQQzBnUjA4eExtUm1JQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLRWxFTENCRVpYTmpjbWx3ZEdsdmJpd2dSMlZ1WlZKaGRHbHZMQ0J3TG1Ga2FuVnpkQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JjWEdkeWIzVndNVnhjS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnSUNCbmNpQTlJSE5oY0hCc2VTaEhaVzVsVW1GMGFXOHNJR1oxYm1OMGFXOXVLSGdwSUh0Y2JpQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNYQzljWEZ4dUlDQWdJQ0FnY0dGeWRITWdQQzBnZFc1c2FYTjBLSE4wY25Od2JHbDBLSGdzSUZ4Y0wxeGNLU2xjYmlBZ0lDQWdJQ01nUTI5dWRtVnlkQ0IwYnlCdWRXMWxjbWxqSUdGdVpDQndaWEptYjNKdElIUm9aU0JrYVhacGMybHZibHh1SUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJQ0FnSUgwcFhHNGdJQ2tnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dSbGMyTW9aM0lwS1Z4dWMzVmljMlYwTWlBOExTQkhUekl1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TEVkbGJtVlNZWFJwYnl3Z2NDNWhaR3AxYzNRcElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHZHliM1Z3SUQwZ1hGeG5jbTkxY0RKY1hDa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRnSUNBZ0lDQWpJRk53YkdsMElIUm9aU0J6ZEhKcGJtY2dZbmtnWEZ3dlhGeGNiaUFnSUNBZ0lIQmhjblJ6SUR3dElIVnViR2x6ZENoemRISnpjR3hwZENoNExDQmNYQzljWENrcFhHNGdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpQWdJQ0FnSUdGekxtNTFiV1Z5YVdNb2NHRnlkSE5iTVYwcElDOGdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3lYU2xjYmlBZ0lDQjlLVnh1SUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNibk4xWW5ObGRETWdQQzBnUjA4ekxtUm1JQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLRWxFTENCRVpYTmpjbWx3ZEdsdmJpeEhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRnhjWjNKdmRYQXpYRndwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0FnSUdkeUlEMGdjMkZ3Y0d4NUtFZGxibVZTWVhScGJ5d2dablZ1WTNScGIyNG9lQ2tnZTF4dUlDQWdJQ0FnSXlCVGNHeHBkQ0IwYUdVZ2MzUnlhVzVuSUdKNUlGeGNMMXhjWEc0Z0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWEZ3dlhGd3BLVnh1SUNBZ0lDQWdJeUJEYjI1MlpYSjBJSFJ2SUc1MWJXVnlhV01nWVc1a0lIQmxjbVp2Y20wZ2RHaGxJR1JwZG1semFXOXVYRzRnSUNBZ0lDQmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6RmRLU0F2SUdGekxtNTFiV1Z5YVdNb2NHRnlkSE5iTWwwcFhHNGdJQ0FnZlNsY2JpQWdLU0FsUGlVZ1pIQnNlWEk2T21GeWNtRnVaMlVvWkdWell5aG5jaWtwWEc1Y2JrZFBiR2x6ZENBOExTQm1ZV04wYjNJb1l5aGNYRWRQT2pBd016TXdNREpjWEN3Z1hGeEhUem93TURjd016Y3pYRndzSUZ4Y1IwODZNREEwT0Rjek1GeGNMQ0JjWEVkUE9qQXdNekV4TUROY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnhIVHpvd01ESXlOakV6WEZ3c0lGeGNSMDg2TURBMU1EYzJOMXhjTENCY1hFZFBPakF3TXpRME56QmNYQ3dnWEZ4SFR6b3dNREUyTURVMVhGd3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEVkUE9qQXdNRFl6T1RkY1hDd2dYRnhIVHpvd01ETXdPVEF3WEZ3c0lGeGNSMDg2TURBd09ETTRNRnhjS1NsY2JseHVaR0YwWVNBOExTQmlhVzVrWDNKdmQzTW9ZbWx1WkY5eWIzZHpLSE4xWW5ObGRERXNJSE4xWW5ObGRESXBMQ0J6ZFdKelpYUXpLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loSlJDQWxhVzRsSUVkUGJHbHpkQ2xjYmx4dVpHVnpZMDl5WkdWeUlEd3RJSE52Y25Rb2RXNXBjWFZsS0dSaGRHRWtSR1Z6WTNKcGNIUnBiMjRwS1Z0aktERXNJRElzSURVc0lEY3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXpMQ0EwTENBMkxDQTRMQ0E1TENBeE1Dd2dNVEVwWFZ4dVhHNXdJRHd0SUdkbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdabUZqZEc5eUtFUmxjMk55YVhCMGFXOXVMQ0JzWlhabGJDQTlJR1JsYzJOUGNtUmxjaWtzSUdOdmJHOXlJRDBnY0M1aFpHcDFjM1FzSUhOcGVtVWdQU0JuY2lrcElDc2dYRzRnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJSFJvWlcxbFgySjNLQ2tnSzF4dUlDQnpZMkZzWlY5amIyeHZjbDluY21Ga2FXVnVkQ2hzYjNjZ1BTQmNYSEpsWkZ4Y0xDQm9hV2RvSUQwZ1hGeGliSFZsWEZ3c0lHeHBiV2wwY3lBOUlHTW9NQ3dnTUM0d05Ta3BJQ3RjYmlBZ2MyTmhiR1ZmYzJsNlpWOWpiMjUwYVc1MWIzVnpLSEpoYm1kbElEMGdZeWd3TENBektTa2dLMXh1SUNCc1lXSnpLSGdnUFNCT1ZVeE1MQ0I1SUQwZ1RsVk1UQ2tnSzF4dUlDQjBhR1Z0WlNoaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFlwTENBZ0l5QlRaWFFnWVhocGN5QjBaWGgwSUhOcGVtVmNiaUFnSUNBZ0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3NJQ01nVTJWMElHRjRhWE1nZEdsMGJHVWdjMmw2WlNBb2FXWWdibTkwSUhKbGJXOTJaV1FwWEc0Z0lDQWdJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0hOcGVtVWdQU0EyS1N3Z0l5QlRaWFFnYkdWblpXNWtJSFJsZUhRZ2MybDZaVnh1SUNBZ0lDQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFlwS1NCY2JseHVabWxzWlU1aGJXVWdQQzBnYUdWeVpTaG1hV2RFYVhJc0lGeGNMaTVjWEN3Z1hGeEhUMXhjTENCY1hFZFBYMmR5YjNWd2MxeGNLVnh1YUdWcFoyaDBJRDBnTWx4dWQybGtkR2dnUFNBekxqVmNibk4yWjJ4cGRHVW9jR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5HTzEgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmUuZ3JvdXAxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5HTzIgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmUuZ3JvdXAyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5HTzUgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmUuZ3JvdXA1LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5HTzggPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmUuZ3JvdXA4LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5cbkdPMS5kZiA8LSBhcy5kYXRhLmZyYW1lKEdPMSlcbkdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKEdPMilcbkdPMy5kZiA8LSBhcy5kYXRhLmZyYW1lKEdPNSlcbkdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKEdPOClcblxuc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcZ3JvdXAxXFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4gICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4gICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4gICAgfSlcbiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG5zdWJzZXQyIDwtIEdPMi5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXGdyb3VwMlxcKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHtcbiAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiAgICAgICMgQ29udmVydCB0byBudW1lcmljIGFuZCBwZXJmb3JtIHRoZSBkaXZpc2lvblxuICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuICAgIH0pXG4gICkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZ3IpKVxuc3Vic2V0MyA8LSBHTzMuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxncm91cDNcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcblxuR09saXN0IDwtIGZhY3RvcihjKFxcR086MDAzMzAwMlxcLCBcXEdPOjAwNzAzNzNcXCwgXFxHTzowMDQ4NzMwXFwsIFxcR086MDAzMTEwM1xcLFxuICAgICAgICAgICAgICAgICBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDUwNzY3XFwsIFxcR086MDAzNDQ3MFxcLCBcXEdPOjAwMTYwNTVcXCwgXG4gICAgICAgICAgICAgICAgIFxcR086MDAwNjM5N1xcLCBcXEdPOjAwMzA5MDBcXCwgXFxHTzowMDA4MzgwXFwpKVxuXG5kYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3Moc3Vic2V0MSwgc3Vic2V0MiksIHN1YnNldDMpICU+JVxuICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuXG5kZXNjT3JkZXIgPC0gc29ydCh1bmlxdWUoZGF0YSREZXNjcmlwdGlvbikpW2MoMSwgMiwgNSwgNyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDQsIDYsIDgsIDksIDEwLCAxMSldXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBmYWN0b3IoRGVzY3JpcHRpb24sIGxldmVsID0gZGVzY09yZGVyKSwgY29sb3IgPSBwLmFkanVzdCwgc2l6ZSA9IGdyKSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArXG4gIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsdWVcXCwgbGltaXRzID0gYygwLCAwLjA1KSkgK1xuICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAsIDMpKSArXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArXG4gIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZClcbiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBsZWdlbmQgdGV4dCBzaXplXG4gICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFwuLlxcLCBcXEdPXFwsIFxcR09fZ3JvdXBzXFwpXG5oZWlnaHQgPSAyXG53aWR0aCA9IDMuNVxuc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuR08xIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwMSwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR08yIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR081IDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwNSwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR084IDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwOCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuXG5HTzEuZGYgPC0gYXMuZGF0YS5mcmFtZShHTzEpXG5HTzIuZGYgPC0gYXMuZGF0YS5mcmFtZShHTzIpXG5HTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShHTzUpXG5HTzQuZGYgPC0gYXMuZGF0YS5mcmFtZShHTzgpXG5cbnN1YnNldDEgPC0gR08xLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXGdyb3VwMVxcKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHtcbiAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiAgICAgICMgQ29udmVydCB0byBudW1lcmljIGFuZCBwZXJmb3JtIHRoZSBkaXZpc2lvblxuICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuICAgIH0pXG4gICkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZ3IpKVxuc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxncm91cDJcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbnN1YnNldDMgPC0gR08zLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbixHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcZ3JvdXAzXFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4gICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4gICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4gICAgfSlcbiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG5cbkdPbGlzdCA8LSBmYWN0b3IoYyhcXEdPOjAwMzMwMDJcXCwgXFxHTzowMDcwMzczXFwsIFxcR086MDA0ODczMFxcLCBcXEdPOjAwMzExMDNcXCxcbiAgICAgICAgICAgICAgICAgXFxHTzowMDIyNjEzXFwsIFxcR086MDA1MDc2N1xcLCBcXEdPOjAwMzQ0NzBcXCwgXFxHTzowMDE2MDU1XFwsIFxuICAgICAgICAgICAgICAgICBcXEdPOjAwMDYzOTdcXCwgXFxHTzowMDMwOTAwXFwsIFxcR086MDAwODM4MFxcKSlcblxuZGF0YSA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKHN1YnNldDEsIHN1YnNldDIpLCBzdWJzZXQzKSAlPiVcbiAgZHBseXI6OmZpbHRlcihJRCAlaW4lIEdPbGlzdClcblxuZGVzY09yZGVyIDwtIHNvcnQodW5pcXVlKGRhdGEkRGVzY3JpcHRpb24pKVtjKDEsIDIsIDUsIDcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCA0LCA2LCA4LCA5LCAxMCwgMTEpXVxuXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gZmFjdG9yKERlc2NyaXB0aW9uLCBsZXZlbCA9IGRlc2NPcmRlciksIGNvbG9yID0gcC5hZGp1c3QsIHNpemUgPSBncikpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgK1xuICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibHVlXFwsIGxpbWl0cyA9IGMoMCwgMC4wNSkpICtcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLCAzKSkgK1xuICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGF4aXMgdGl0bGUgc2l6ZSAoaWYgbm90IHJlbW92ZWQpXG4gICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc1xcKVxuaGVpZ2h0ID0gMlxud2lkdGggPSAzLjVcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
GO1 <- enrichGO(gene = gene.group1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO2 <- enrichGO(gene = gene.group2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO5 <- enrichGO(gene = gene.group5, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO8 <- enrichGO(gene = gene.group8, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)

GO1.df <- as.data.frame(GO1)
GO2.df <- as.data.frame(GO2)
GO3.df <- as.data.frame(GO5)
GO4.df <- as.data.frame(GO8)

subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \group1\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))
subset2 <- GO2.df %>% dplyr::select(ID, Description,GeneRatio, p.adjust) %>% dplyr::mutate(group = \group2\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))
subset3 <- GO3.df %>% dplyr::select(ID, Description,GeneRatio, p.adjust) %>% dplyr::mutate(group = \group3\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))

GOlist <- factor(c(\GO:0033002\, \GO:0070373\, \GO:0048730\, \GO:0031103\,
                 \GO:0022613\, \GO:0050767\, \GO:0034470\, \GO:0016055\, 
                 \GO:0006397\, \GO:0030900\, \GO:0008380\))

data <- bind_rows(bind_rows(subset1, subset2), subset3) %>%
  dplyr::filter(ID %in% GOlist)

descOrder <- sort(unique(data$Description))[c(1, 2, 5, 7,
                                 3, 4, 6, 8, 9, 10, 11)]

p <- ggplot(data, aes(x = group, y = factor(Description, level = descOrder), color = p.adjust, size = gr)) + 
  geom_point() + theme_bw() +
  scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
  scale_size_continuous(range = c(0, 3)) +
  labs(x = NULL, y = NULL) +
  theme(axis.text = element_text(size = 6),  # Set axis text size
        axis.title = element_text(size = 6), # Set axis title size (if not removed)
        legend.text = element_text(size = 6), # Set legend text size
        legend.title = element_text(size = 6)) 

fileName <- here(figDir, \..\, \GO\, \GO_groups\)
height = 2
width = 3.5
svglite(paste0(fileName, \.svg\), height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### dTAG
##### - Splitting genes to groups

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJEYUdWamEybHVaeUJoZG1WeVlXZGxJR1JwYzNSaGJtTmxJRzltSUd4dmIzQnpJSEJsY2lCblpXNWxYRzRqSUhSbGJYQWdhWE1nWVNCMGFXSmliR1VnZDJobGNtVWdaR1ZzZEdFZ2JHOXZjQ0JoYm1RZ2JHOW5NbVpqSUdGeVpTQnRaWEpuWldSY2JuUmxiWEFrWjNKdmRYQWdQQzBnWm1GamRHOXlLSFJsYlhBa1ozSnZkWEFwWEc1Y2JpTmNiblJsYlhBZ1BDMGdkR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0FsYVc0bElHTW9NU3dnTWl3Z05Td2dPQ2twWEc1Y2JseHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TVNrZ0tTUnRaV0Z1WDJScGMzUmhibU5sWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TWlrZ0tTUnRaV0Z1WDJScGMzUmhibU5sWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WEc1d2RqRXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnTVN3Z01pa3NJRFVwWEc1d2RqRTFJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnTVN3Z05Ta3NJRFVwWEc1d2RqRTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnTVN3Z09Da3NJRFVwWEc1d2RqSTFJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnTWl3Z05Ta3NJRFVwWEc1d2RqSTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnTWl3Z09Da3NJRFVwWEc1d2RqVTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnTlN3Z09Da3NJRFVwWEc1Y2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJRzFsWVc1ZlpHbHpkR0Z1WTJVcEtTQXJJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ1ozSnZkWEFwTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklITmpZV3hsWDNsZlkyOXVkR2x1ZFc5MWN5aHNZV0psYkhNZ1BTQnNZV0psYkY5cllsOXRZaWtnSzF4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRndpY21Wa1hDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lLU0FyWEc0Z0lHRnVibTkwWVhSbEtGd2lkR1Y0ZEZ3aUxDQjRJRDBnTVN3Z2VTQTlJREV3TURBd01EQXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGd2ljSFl4TWpvZ1hDSXNJSEIyTVRJc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkIyTVRVNklGd2lMQ0J3ZGpFMUxDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3ZGpFNE9pQmNJaXdnY0hZeE9Dd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hZeU5Ub2dYQ0lzSUhCMk1qVXNJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk1qZzZJRndpTENCd2RqSTRMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2RqVTRPaUJjSWl3Z2NIWTFPQ3dnWENKY1hHNWNJaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNeWxjYmlBZ1hHNGdJRnh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWMybDZaVjlpWVhKd2JHOTBYMlJwWm1aSGNtOTFjRjlrVkVGSFgzWnpYMFJOVTA5Y0lpbGNibWhsYVdkb2RDQThMU0F6WEc1M2FXUjBhQ0E4TFNBelhHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG4jIENoZWNraW5nIGF2ZXJhZ2UgZGlzdGFuY2Ugb2YgbG9vcHMgcGVyIGdlbmVcbiMgdGVtcCBpcyBhIHRpYmJsZSB3aGVyZSBkZWx0YSBsb29wIGFuZCBsb2cyZmMgYXJlIG1lcmdlZFxudGVtcCRncm91cCA8LSBmYWN0b3IodGVtcCRncm91cClcblxuI1xudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYygxLCAyLCA1LCA4KSlcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJG1lYW5fZGlzdGFuY2VcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJG1lYW5fZGlzdGFuY2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAxLCAyKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAxLCA1KSwgNSlcbnB2MTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAxLCA4KSwgNSlcbnB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAyLCA1KSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAyLCA4KSwgNSlcbnB2NTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCA1LCA4KSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gbWVhbl9kaXN0YW5jZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMTAwMDAwMCwgbGFiZWwgPSBwYXN0ZTAoXFxwdjEyOiBcXCwgcHYxMiwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxNTogXFwsIHB2MTUsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTg6IFxcLCBwdjE4LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI1OiBcXCwgcHYyNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyODogXFwsIHB2MjgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NTg6IFxcLCBwdjU4LCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxzaXplX2JhcnBsb3RfZGlmZkdyb3VwX2RUQUdfdnNfRE1TT1xcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# Checking average distance of loops per gene
# temp is a tibble where delta loop and log2fc are merged
temp$group <- factor(temp$group)

#
temp <- temp %>% dplyr::filter(group %in% c(1, 2, 5, 8))


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$mean_distance
  distance2 <- (data %>% dplyr::filter(group ==group2) )$mean_distance
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

pv12 <- round(getPvalWilcox(temp, 1, 2), 5)
pv15 <- round(getPvalWilcox(temp, 1, 5), 5)
pv18 <- round(getPvalWilcox(temp, 1, 8), 5)
pv25 <- round(getPvalWilcox(temp, 2, 5), 5)
pv28 <- round(getPvalWilcox(temp, 2, 8), 5)
pv58 <- round(getPvalWilcox(temp, 5, 8), 5)


p <- ggplot(temp, aes(x = group, y = mean_distance)) + geom_violin(aes(fill = group), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + scale_y_continuous(labels = label_kb_mb) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  annotate(\text\, x = 1, y = 1000000, label = paste0(\pv12: \, pv12, \\n\,
                                                      \pv15: \, pv15, \\n\,
                                                      \pv18: \, pv18, \\n\,
                                                      \pv25: \, pv25, \\n\,
                                                      \pv28: \, pv28, \\n\,
                                                      \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 3)
  
  
fileName <- paste0(\size_barplot_diffGroup_dTAG_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkRhR1ZqYTJsdVp5QmhkbVZ5WVdkbElHUnBjM1JoYm1ObElHOW1JR3h2YjNCeklIQmxjaUJuWlc1bFhHNGpJSFJsYlhBZ2FYTWdZU0IwYVdKaWJHVWdkMmhsY21VZ1pHVnNkR0VnYkc5dmNDQmhibVFnYkc5bk1tWmpJR0Z5WlNCdFpYSm5aV1JjYm5SbGJYQWtaM0p2ZFhBZ1BDMGdabUZqZEc5eUtIUmxiWEFrWjNKdmRYQXBYRzVjYmlOY2JuUmxiWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQWxhVzRsSUdNb01Td2dNaXdnTlN3Z09Da3BYRzVjYmx4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNU2tnS1NSdFpXRnVYMlJwYzNSaGJtTmxYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNaWtnS1NSdFpXRnVYMlJwYzNSaGJtTmxYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzV3ZGpFeUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dNU3dnTWlrc0lEVXBYRzV3ZGpFMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dNU3dnTlNrc0lEVXBYRzV3ZGpFNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dNU3dnT0Nrc0lEVXBYRzV3ZGpJMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dNaXdnTlNrc0lEVXBYRzV3ZGpJNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dNaXdnT0Nrc0lEVXBYRzV3ZGpVNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dOU3dnT0Nrc0lEVXBYRzVjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlHMWxZVzVmWkdsemRHRnVZMlVwS1NBcklHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnWjNKdmRYQXBMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBclhHNGdJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU1Td2diM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUhOallXeGxYM2xmWTI5dWRHbHVkVzkxY3loc1lXSmxiSE1nUFNCc1lXSmxiRjlyWWw5dFlpa2dLMXh1SUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGeGNjbVZrWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0tTQXJYRzRnSUdGdWJtOTBZWFJsS0Z4Y2RHVjRkRnhjTENCNElEMGdNU3dnZVNBOUlERXdNREF3TURBc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z4Y2NIWXhNam9nWEZ3c0lIQjJNVElzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQjJNVFU2SUZ4Y0xDQndkakUxTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdkakU0T2lCY1hDd2djSFl4T0N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSFl5TlRvZ1hGd3NJSEIyTWpVc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTWpnNklGeGNMQ0J3ZGpJNExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3ZGpVNE9pQmNYQ3dnY0hZMU9Dd2dYRnhjWEc1Y1hDa3NJRnh1SUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ015bGNiaUFnWEc0Z0lGeHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjYzJsNlpWOWlZWEp3Ykc5MFgyUnBabVpIY205MWNGOWtWRUZIWDNaelgwUk5VMDljWENsY2JtaGxhV2RvZENBOExTQXpYRzUzYVdSMGFDQThMU0F6WEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG4jIENoZWNraW5nIGF2ZXJhZ2UgZGlzdGFuY2Ugb2YgbG9vcHMgcGVyIGdlbmVcbiMgdGVtcCBpcyBhIHRpYmJsZSB3aGVyZSBkZWx0YSBsb29wIGFuZCBsb2cyZmMgYXJlIG1lcmdlZFxudGVtcCRncm91cCA8LSBmYWN0b3IodGVtcCRncm91cClcblxuI1xudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYygxLCAyLCA1LCA4KSlcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJG1lYW5fZGlzdGFuY2VcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJG1lYW5fZGlzdGFuY2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAxLCAyKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAxLCA1KSwgNSlcbnB2MTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAxLCA4KSwgNSlcbnB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAyLCA1KSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAyLCA4KSwgNSlcbnB2NTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCA1LCA4KSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gbWVhbl9kaXN0YW5jZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMTAwMDAwMCwgbGFiZWwgPSBwYXN0ZTAoXFxwdjEyOiBcXCwgcHYxMiwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxNTogXFwsIHB2MTUsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTg6IFxcLCBwdjE4LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI1OiBcXCwgcHYyNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyODogXFwsIHB2MjgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NTg6IFxcLCBwdjU4LCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxzaXplX2JhcnBsb3RfZGlmZkdyb3VwX2RUQUdfdnNfRE1TT1xcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBDaGVja2luZyBhdmVyYWdlIGRpc3RhbmNlIG9mIGxvb3BzIHBlciBnZW5lXG4jIHRlbXAgaXMgYSB0aWJibGUgd2hlcmUgZGVsdGEgbG9vcCBhbmQgbG9nMmZjIGFyZSBtZXJnZWRcbnRlbXAkZ3JvdXAgPC0gZmFjdG9yKHRlbXAkZ3JvdXApXG5cbiNcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoMSwgMiwgNSwgOCkpXG5cblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRtZWFuX2Rpc3RhbmNlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRtZWFuX2Rpc3RhbmNlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMSwgMiksIDUpXG5wdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMSwgNSksIDUpXG5wdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMSwgOCksIDUpXG5wdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMiwgNSksIDUpXG5wdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMiwgOCksIDUpXG5wdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgNSwgOCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IG1lYW5fZGlzdGFuY2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDEwMDAwMDAsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIHB2MTIsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE4OiBcXCwgcHYxOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNTogXFwsIHB2MjUsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjU4OiBcXCwgcHY1OCwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2l6ZV9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
# Checking average distance of loops per gene
# temp is a tibble where delta loop and log2fc are merged
temp$group <- factor(temp$group)

#
temp <- temp %>% dplyr::filter(group %in% c(1, 2, 5, 8))


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$mean_distance
  distance2 <- (data %>% dplyr::filter(group ==group2) )$mean_distance
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

pv12 <- round(getPvalWilcox(temp, 1, 2), 5)
pv15 <- round(getPvalWilcox(temp, 1, 5), 5)
pv18 <- round(getPvalWilcox(temp, 1, 8), 5)
pv25 <- round(getPvalWilcox(temp, 2, 5), 5)
pv28 <- round(getPvalWilcox(temp, 2, 8), 5)
pv58 <- round(getPvalWilcox(temp, 5, 8), 5)


p <- ggplot(temp, aes(x = group, y = mean_distance)) + geom_violin(aes(fill = group), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + scale_y_continuous(labels = label_kb_mb) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  annotate(\text\, x = 1, y = 1000000, label = paste0(\pv12: \, pv12, \\n\,
                                                      \pv15: \, pv15, \\n\,
                                                      \pv18: \, pv18, \\n\,
                                                      \pv25: \, pv25, \\n\,
                                                      \pv28: \, pv28, \\n\,
                                                      \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 3)
  
  
fileName <- paste0(\size_barplot_diffGroup_dTAG_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### - GO for each group


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJEYjNWdWRHbHVaeUJ1ZFcxaVpYSWdiMllnYkc5dmNDQndaWElnWjJWdVpYTmNiblJsYlhCVGRXMGdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIQmxZV3RKUkN3Z1oyVnVaU3dnUVc1dWJ6SXBJQ1UrSlNCMWJtNWxjM1FvWjJWdVpTa2dKVDRsSUdkeWIzVndYMko1S0dkbGJtVXBJQ1UrSlNBZ2MzVnRiV0Z5YVhwbEtGeHVJQ0FnSUhCbFlXc2dQU0JzYVhOMEtIQmxZV3RKUkNrc1hHNGdJQ0FnWVc1dWJ6SWdQU0JzYVhOMEtFRnVibTh5S1N4Y2JpQWdJQ0JqYjNWdWRDQTlJRzRvS1NsY2JseHVkR1Z0Y0ZOMWJTQThMU0IwWlcxd1UzVnRJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNCbmNtOTFjQ0E5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0RFc0lGd2laM0p2ZFhBeFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjRElzSUZ3aVozSnZkWEF5WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVXVaM0p2ZFhBekxDQmNJbWR5YjNWd00xd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNEUXNJRndpWjNKdmRYQTBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNEVXNJRndpWjNKdmRYQTFYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVXVaM0p2ZFhBMkxDQmNJbWR5YjNWd05sd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjRGNzSUZ3aVozSnZkWEEzWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0Rnc0lGd2laM0p2ZFhBNFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVXVaM0p2ZFhBNUxDQmNJbWR5YjNWd09Wd2lMQ0JPUVNrcEtTa3BLU2twS1Z4dUtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQWxhVzRsSUdNb1hDSm5jbTkxY0RGY0lpd2dYQ0puY205MWNESmNJaXdnWENKbmNtOTFjRFZjSWl3Z1hDSm5jbTkxY0RoY0lpa3BYRzVjYmx4dUl5QlVSVTFRSUZOVVFWSlVYRzRqWjJWdVpVeHBjM1F1WjNKdmRYQXhJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNERXVkSE4yWENJcEtWeHVJMmRsYm1WTWFYTjBMbWR5YjNWd01TNTBaVzF3SUR3dElHZGxibVZNYVhOMExtZHliM1Z3TVNBbFBpVWdaSEJzZVhJNk9teGxablJmYW05cGJpaDBaVzF3VTNWdExDQmllU0E5SUdNb1hDSm5aVzVsWENJcEtWeHVJeUJVUlUxUUlFVk9SRnh1WEc1blpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaUFnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXhLU0FwSkdOdmRXNTBYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNaWtnS1NSamIzVnVkRnh1SUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JuMWNibHh1WEc1d2RqRXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRk4xYlN4Y0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLU3dnTlNsY2JuQjJNVFVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VTNWdExGd2laM0p2ZFhBeFhDSXNJRndpWjNKdmRYQTFYQ0lwTENBMUtWeHVjSFl4T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVGRXMHNYQ0puY205MWNERmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzV3ZGpJMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGTjFiU3hjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3TlZ3aUtTd2dOU2xjYm5CMk1qZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdVM1Z0TEZ3aVozSnZkWEF5WENJc0lGd2laM0p2ZFhBNFhDSXBMQ0ExS1Z4dWNIWTFPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJUZFcwc1hDSm5jbTkxY0RWY0lpd2dYQ0puY205MWNEaGNJaWtzSURVcFhHNWNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjRk4xYlN3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlHTnZkVzUwTENCbWFXeHNJRDBnWjNKdmRYQXBLU0FySUZ4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpVc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUFnSUNBZ0lDQmNiaUFnYzJOaGJHVmZlVjlqYjI1MGFXNTFiM1Z6S0dKeVpXRnJjeUE5SUhObGNTZ3dMQ0F4TUN3Z1lua2dQU0F5S1N3Z2JHbHRhWFJ6SUQwZ1l5Z3dMQ0F4TUNrcElDc2dYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0JuY205MWNDa3NJR1oxYmlBOUlHMWxZVzRzSUdkbGIyMGdQU0JjSW5CdmFXNTBYQ0lzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBeUxDQm1hV3hzSUQwZ1hDSnlaV1JjSWl3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJcElDQXJYRzRnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdNU3dnZVNBOUlETXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGd2ljSFl4TWpvZ1hDSXNJSEIyTVRJc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk1UVTZJRndpTENCd2RqRTFMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkakU0T2lCY0lpd2djSFl4T0N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hZeU5Ub2dYQ0lzSUhCMk1qVXNJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNamc2SUZ3aUxDQndkakk0TENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3ZGpVNE9pQmNJaXdnY0hZMU9Dd2dYQ0pjWEc1Y0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ01Ta2dLeUFnZEdobGJXVW9iR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdYQ0p1YjI1bFhDSXBYRzVjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2lZMjkxYm5SZlltRnljR3h2ZEY5a2FXWm1SM0p2ZFhCZlpGUkJSMTkyYzE5RVRWTlBYQ0lwWEc1b1pXbG5hSFFnUEMwZ00xeHVkMmxrZEdnZ1BDMGdNMXh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ3aWFXNWNJaXdnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuIyBDb3VudGluZyBudW1iZXIgb2YgbG9vcCBwZXIgZ2VuZXNcbnRlbXBTdW0gPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KHBlYWtJRCwgZ2VuZSwgQW5ubzIpICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSAgc3VtbWFyaXplKFxuICAgIHBlYWsgPSBsaXN0KHBlYWtJRCksXG4gICAgYW5ubzIgPSBsaXN0KEFubm8yKSxcbiAgICBjb3VudCA9IG4oKSlcblxudGVtcFN1bSA8LSB0ZW1wU3VtICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAzLCBcXGdyb3VwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDQsIFxcZ3JvdXA0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA2LCBcXGdyb3VwNlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDcsIFxcZ3JvdXA3XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDgsIFxcZ3JvdXA4XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA5LCBcXGdyb3VwOVxcLCBOQSkpKSkpKSkpKVxuKSAlPiVcbiAgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxncm91cDFcXCwgXFxncm91cDJcXCwgXFxncm91cDVcXCwgXFxncm91cDhcXCkpXG5cblxuIyBURU1QIFNUQVJUXG4jZ2VuZUxpc3QuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKVxuI2dlbmVMaXN0Lmdyb3VwMS50ZW1wIDwtIGdlbmVMaXN0Lmdyb3VwMSAlPiUgZHBseXI6OmxlZnRfam9pbih0ZW1wU3VtLCBieSA9IGMoXFxnZW5lXFwpKVxuIyBURU1QIEVORFxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGNvdW50XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRjb3VudFxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG5wdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcFN1bSwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSwgbGltaXRzID0gYygwLCAxMCkpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIHB2MTIsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE4OiBcXCwgcHYxOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNTogXFwsIHB2MjUsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjU4OiBcXCwgcHY1OCwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSkgKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# Counting number of loop per genes
tempSum <- geneAnnoData %>% dplyr::select(peakID, gene, Anno2) %>% unnest(gene) %>% group_by(gene) %>%  summarize(
    peak = list(peakID),
    anno2 = list(Anno2),
    count = n())

tempSum <- tempSum %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\,
                        ifelse(gene %in% gene.group3, \group3\,
                               ifelse(gene %in% gene.group4, \group4\,
                                      ifelse(gene %in% gene.group5, \group5\,
                                             ifelse(gene %in% gene.group6, \group6\,
                                                    ifelse(gene %in% gene.group7, \group7\,
                                                           ifelse(gene %in% gene.group8, \group8\,
                                                                  ifelse(gene %in% gene.group9, \group9\, NA)))))))))
) %>%
  dplyr::filter(group %in% c(\group1\, \group2\, \group5\, \group8\))


# TEMP START
#geneList.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))
#geneList.group1.temp <- geneList.group1 %>% dplyr::left_join(tempSum, by = c(\gene\))
# TEMP END

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$count
  distance2 <- (data %>% dplyr::filter(group ==group2) )$count
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


pv12 <- round(getPvalWilcox(tempSum,\group1\, \group2\), 5)
pv15 <- round(getPvalWilcox(tempSum,\group1\, \group5\), 5)
pv18 <- round(getPvalWilcox(tempSum,\group1\, \group8\), 5)
pv25 <- round(getPvalWilcox(tempSum,\group2\, \group5\), 5)
pv28 <- round(getPvalWilcox(tempSum,\group2\, \group8\), 5)
pv58 <- round(getPvalWilcox(tempSum,\group5\, \group8\), 5)


p <- ggplot(tempSum, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 10, by = 2), limits = c(0, 10)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
                                                \pv15: \, pv15, \\n\,
                                                \pv18: \, pv18, \\n\,
                                                \pv25: \, pv25, \\n\,
                                                \pv28: \, pv28, \\n\,
                                                \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 1) +  theme(legend.position = \none\)


fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkRiM1Z1ZEdsdVp5QnVkVzFpWlhJZ2IyWWdiRzl2Y0NCd1pYSWdaMlZ1WlhOY2JuUmxiWEJUZFcwZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hCbFlXdEpSQ3dnWjJWdVpTd2dRVzV1YnpJcElDVStKU0IxYm01bGMzUW9aMlZ1WlNrZ0pUNGxJR2R5YjNWd1gySjVLR2RsYm1VcElDVStKU0FnYzNWdGJXRnlhWHBsS0Z4dUlDQWdJSEJsWVdzZ1BTQnNhWE4wS0hCbFlXdEpSQ2tzWEc0Z0lDQWdZVzV1YnpJZ1BTQnNhWE4wS0VGdWJtOHlLU3hjYmlBZ0lDQmpiM1Z1ZENBOUlHNG9LU2xjYmx4dWRHVnRjRk4xYlNBOExTQjBaVzF3VTNWdElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0JuY205MWNDQTlJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjREVzSUZ4Y1ozSnZkWEF4WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNESXNJRnhjWjNKdmRYQXlYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEF6TENCY1hHZHliM1Z3TTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0RRc0lGeGNaM0p2ZFhBMFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0RVc0lGeGNaM0p2ZFhBMVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEEyTENCY1hHZHliM1Z3Tmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNEY3NJRnhjWjNKdmRYQTNYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjRGdzSUZ4Y1ozSnZkWEE0WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEE1TENCY1hHZHliM1Z3T1Z4Y0xDQk9RU2twS1NrcEtTa3BLVnh1S1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBbGFXNGxJR01vWEZ4bmNtOTFjREZjWEN3Z1hGeG5jbTkxY0RKY1hDd2dYRnhuY205MWNEVmNYQ3dnWEZ4bmNtOTFjRGhjWENrcFhHNWNibHh1SXlCVVJVMVFJRk5VUVZKVVhHNGpaMlZ1WlV4cGMzUXVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdkbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RFdWRITjJYRndwS1Z4dUkyZGxibVZNYVhOMExtZHliM1Z3TVM1MFpXMXdJRHd0SUdkbGJtVk1hWE4wTG1keWIzVndNU0FsUGlVZ1pIQnNlWEk2T214bFpuUmZhbTlwYmloMFpXMXdVM1Z0TENCaWVTQTlJR01vWEZ4blpXNWxYRndwS1Z4dUl5QlVSVTFRSUVWT1JGeHVYRzVuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpQWdaR2x6ZEdGdVkyVXhJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlaM0p2ZFhBeEtTQXBKR052ZFc1MFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQV2R5YjNWd01pa2dLU1JqYjNWdWRGeHVJQ0IzYVd3Z1BDMGdkMmxzWTI5NExuUmxjM1FvWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcFhHNGdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYm4xY2JseHVYRzV3ZGpFeUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGTjFiU3hjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tTd2dOU2xjYm5CMk1UVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdVM1Z0TEZ4Y1ozSnZkWEF4WEZ3c0lGeGNaM0p2ZFhBMVhGd3BMQ0ExS1Z4dWNIWXhPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJUZFcwc1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNXdkakkxSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZOMWJTeGNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndOVnhjS1N3Z05TbGNibkIyTWpnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1UzVnRMRnhjWjNKdmRYQXlYRndzSUZ4Y1ozSnZkWEE0WEZ3cExDQTFLVnh1Y0hZMU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlRkVzBzWEZ4bmNtOTFjRFZjWEN3Z1hGeG5jbTkxY0RoY1hDa3NJRFVwWEc1Y2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNGTjFiU3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUdOdmRXNTBMQ0JtYVd4c0lEMGdaM0p2ZFhBcEtTQXJJRnh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMalVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QWdJQ0FnSUNCY2JpQWdjMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR0p5WldGcmN5QTlJSE5sY1Nnd0xDQXhNQ3dnWW5rZ1BTQXlLU3dnYkdsdGFYUnpJRDBnWXlnd0xDQXhNQ2twSUNzZ1hHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNYSEJ2YVc1MFhGd3NJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWEZ4eVpXUmNYQ3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndwSUNBclhHNGdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ01Td2dlU0E5SURNc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z4Y2NIWXhNam9nWEZ3c0lIQjJNVElzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTVRVNklGeGNMQ0J3ZGpFMUxDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqRTRPaUJjWEN3Z2NIWXhPQ3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSFl5TlRvZ1hGd3NJSEIyTWpVc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1qZzZJRnhjTENCd2RqSTRMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdkalU0T2lCY1hDd2djSFkxT0N3Z1hGeGNYRzVjWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTVNrZ0t5QWdkR2hsYldVb2JHVm5aVzVrTG5CdmMybDBhVzl1SUQwZ1hGeHViMjVsWEZ3cFhHNWNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y1kyOTFiblJmWW1GeWNHeHZkRjlrYVdabVIzSnZkWEJmWkZSQlIxOTJjMTlFVFZOUFhGd3BYRzVvWldsbmFIUWdQQzBnTTF4dWQybGtkR2dnUEMwZ00xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRnhjYVc1Y1hDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2twTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbiMgQ291bnRpbmcgbnVtYmVyIG9mIGxvb3AgcGVyIGdlbmVzXG50ZW1wU3VtIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChwZWFrSUQsIGdlbmUsIEFubm8yKSAlPiUgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUgIHN1bW1hcml6ZShcbiAgICBwZWFrID0gbGlzdChwZWFrSUQpLFxuICAgIGFubm8yID0gbGlzdChBbm5vMiksXG4gICAgY291bnQgPSBuKCkpXG5cbnRlbXBTdW0gPC0gdGVtcFN1bSAlPiUgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAxLCBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAyLCBcXGdyb3VwMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMywgXFxncm91cDNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA0LCBcXGdyb3VwNFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA1LCBcXGdyb3VwNVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNiwgXFxncm91cDZcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA3LCBcXGdyb3VwN1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA4LCBcXGdyb3VwOFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwOSwgXFxncm91cDlcXCwgTkEpKSkpKSkpKSlcbikgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpKVxuXG5cbiMgVEVNUCBTVEFSVFxuI2dlbmVMaXN0Lmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdlxcKSlcbiNnZW5lTGlzdC5ncm91cDEudGVtcCA8LSBnZW5lTGlzdC5ncm91cDEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4odGVtcFN1bSwgYnkgPSBjKFxcZ2VuZVxcKSlcbiMgVEVNUCBFTkRcblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRjb3VudFxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkY291bnRcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG5wdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHYyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG5wdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbnB2NTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KHRlbXBTdW0sIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgICAgICAgXG4gIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAsIGJ5ID0gMiksIGxpbWl0cyA9IGMoMCwgMTApKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpICsgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcKVxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGNvdW50X2JhcnBsb3RfZGlmZkdyb3VwX2RUQUdfdnNfRE1TT1xcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBDb3VudGluZyBudW1iZXIgb2YgbG9vcCBwZXIgZ2VuZXNcbnRlbXBTdW0gPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KHBlYWtJRCwgZ2VuZSwgQW5ubzIpICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSAgc3VtbWFyaXplKFxuICAgIHBlYWsgPSBsaXN0KHBlYWtJRCksXG4gICAgYW5ubzIgPSBsaXN0KEFubm8yKSxcbiAgICBjb3VudCA9IG4oKSlcblxudGVtcFN1bSA8LSB0ZW1wU3VtICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAzLCBcXGdyb3VwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDQsIFxcZ3JvdXA0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA2LCBcXGdyb3VwNlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDcsIFxcZ3JvdXA3XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDgsIFxcZ3JvdXA4XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA5LCBcXGdyb3VwOVxcLCBOQSkpKSkpKSkpKVxuKSAlPiVcbiAgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxncm91cDFcXCwgXFxncm91cDJcXCwgXFxncm91cDVcXCwgXFxncm91cDhcXCkpXG5cblxuIyBURU1QIFNUQVJUXG4jZ2VuZUxpc3QuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKVxuI2dlbmVMaXN0Lmdyb3VwMS50ZW1wIDwtIGdlbmVMaXN0Lmdyb3VwMSAlPiUgZHBseXI6OmxlZnRfam9pbih0ZW1wU3VtLCBieSA9IGMoXFxnZW5lXFwpKVxuIyBURU1QIEVORFxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGNvdW50XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRjb3VudFxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG5wdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcFN1bSwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSwgbGltaXRzID0gYygwLCAxMCkpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIHB2MTIsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE4OiBcXCwgcHYxOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNTogXFwsIHB2MjUsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjU4OiBcXCwgcHY1OCwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSkgKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
# Counting number of loop per genes
tempSum <- geneAnnoData %>% dplyr::select(peakID, gene, Anno2) %>% unnest(gene) %>% group_by(gene) %>%  summarize(
    peak = list(peakID),
    anno2 = list(Anno2),
    count = n())

tempSum <- tempSum %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\,
                        ifelse(gene %in% gene.group3, \group3\,
                               ifelse(gene %in% gene.group4, \group4\,
                                      ifelse(gene %in% gene.group5, \group5\,
                                             ifelse(gene %in% gene.group6, \group6\,
                                                    ifelse(gene %in% gene.group7, \group7\,
                                                           ifelse(gene %in% gene.group8, \group8\,
                                                                  ifelse(gene %in% gene.group9, \group9\, NA)))))))))
) %>%
  dplyr::filter(group %in% c(\group1\, \group2\, \group5\, \group8\))


# TEMP START
#geneList.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))
#geneList.group1.temp <- geneList.group1 %>% dplyr::left_join(tempSum, by = c(\gene\))
# TEMP END

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$count
  distance2 <- (data %>% dplyr::filter(group ==group2) )$count
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


pv12 <- round(getPvalWilcox(tempSum,\group1\, \group2\), 5)
pv15 <- round(getPvalWilcox(tempSum,\group1\, \group5\), 5)
pv18 <- round(getPvalWilcox(tempSum,\group1\, \group8\), 5)
pv25 <- round(getPvalWilcox(tempSum,\group2\, \group5\), 5)
pv28 <- round(getPvalWilcox(tempSum,\group2\, \group8\), 5)
pv58 <- round(getPvalWilcox(tempSum,\group5\, \group8\), 5)


p <- ggplot(tempSum, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 10, by = 2), limits = c(0, 10)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
                                                \pv15: \, pv15, \\n\,
                                                \pv18: \, pv18, \\n\,
                                                \pv25: \, pv25, \\n\,
                                                \pv28: \, pv28, \\n\,
                                                \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 1) +  theme(legend.position = \none\)


fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




##### - Average loop size

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakkxeHVkR1Z0Y0RJZ1BDMGdkR1Z0Y0ZOMWJTQWxQaVVnY205M2QybHpaU2dwSUNVK0pTQnRkWFJoZEdVb2RHOTBZV3dnUFNCc1pXNW5kR2dvWVc1dWJ6SXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiblZ0WDNCd0lEMGdjM1Z0S0dGdWJtOHlJRDA5SUZ3aVVDMVFYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm5WdFgzQmxJRDBnYzNWdEtHRnVibTh5SUQwOUlGd2lVQzFGWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0J6SUQwZ2MzVnRLR0Z1Ym04eUlEMDlJRndpVUMxVFhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiblZ0WDNCNElEMGdjM1Z0S0dGdWJtOHlJRDA5SUZ3aVVDMVlYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21GMGFXOWZjbVZuSUQwZ0tHNTFiVjl3Y0NBcklHNTFiVjl3WlNrdmRHOTBZV3dzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WVhScGIxOXpkSElnUFNCdWRXMWZjSE12ZEc5MFlXd3BYRzVjYm5OaGRtVlNSRk1vZEdWdGNESXNJR2hsY21Vb2NtVnpkV3gwUkdseUxDQmNJbWRsYm1WZmJHOXZjRjlzYVc1ckxuSmtjMXdpS1NsY2JseHVYRzVzYjI5d1ZIbHdaU0E4TFNCMFpXMXdNaUFsUGlVZ1ozSnZkWEJmWW5rb1ozSnZkWEFwSUNVK0pTQnpkVzF0WVhKcGMyVW9iblZ0WDNCd0lEMGdjM1Z0S0c1MWJWOXdjQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiblZ0WDNCbElEMGdjM1Z0S0c1MWJWOXdaU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiblZ0WDNCeklEMGdjM1Z0S0c1MWJWOXdjeWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiblZ0WDNCNElEMGdjM1Z0S0c1MWJWOXdlQ2twWEc1Y2JseHViRzl2Y0ZSNWNHVk1iMjVuSUR3dElHeHZiM0JVZVhCbElDVStKU0J3YVhadmRGOXNiMjVuWlhJb0xXZHliM1Z3TENCdVlXMWxjMTkwYnlBOUlGd2lkSGx3WlZ3aUxDQjJZV3gxWlhOZmRHOGdQU0JjSW1OdmRXNTBYQ0lwWEc1Y2JteHZiM0JVZVhCbFRHOXVaeVIwZVhCbElEd3RJR1poWTNSdmNpaHNiMjl3Vkhsd1pVeHZibWNrZEhsd1pTd2diR1YyWld4eklEMGdZeWhjSW01MWJWOXdjRndpTENCY0ltNTFiVjl3WlZ3aUxDQmNJbTUxYlY5d2Mxd2lMQ0JjSW01MWJWOXdlRndpS1NsY2JseHVJeUJRYkc5MGRHbHVaMXh1WjJkd2JHOTBLR3h2YjNCVWVYQmxURzl1Wnl3Z1lXVnpLR1pwYkd3OWRIbHdaU3dnZVQxamIzVnVkQ3dnZUQxbmNtOTFjQ2twSUNzZ1hHNGdJQ0FnWjJWdmJWOWlZWElvY0c5emFYUnBiMjQ5WENKbWFXeHNYQ0lzSUhOMFlYUTlYQ0pwWkdWdWRHbDBlVndpS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1Z4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuIyMjIyMjI1xudGVtcDIgPC0gdGVtcFN1bSAlPiUgcm93d2lzZSgpICU+JSBtdXRhdGUodG90YWwgPSBsZW5ndGgoYW5ubzIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BwID0gc3VtKGFubm8yID09IFxcUC1QXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BlID0gc3VtKGFubm8yID09IFxcUC1FXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BzID0gc3VtKGFubm8yID09IFxcUC1TXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3B4ID0gc3VtKGFubm8yID09IFxcUC1YXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW9fcmVnID0gKG51bV9wcCArIG51bV9wZSkvdG90YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb19zdHIgPSBudW1fcHMvdG90YWwpXG5cbnNhdmVSRFModGVtcDIsIGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rLnJkc1xcKSlcblxuXG5sb29wVHlwZSA8LSB0ZW1wMiAlPiUgZ3JvdXBfYnkoZ3JvdXApICU+JSBzdW1tYXJpc2UobnVtX3BwID0gc3VtKG51bV9wcCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BlID0gc3VtKG51bV9wZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BzID0gc3VtKG51bV9wcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3B4ID0gc3VtKG51bV9weCkpXG5cblxubG9vcFR5cGVMb25nIDwtIGxvb3BUeXBlICU+JSBwaXZvdF9sb25nZXIoLWdyb3VwLCBuYW1lc190byA9IFxcdHlwZVxcLCB2YWx1ZXNfdG8gPSBcXGNvdW50XFwpXG5cbmxvb3BUeXBlTG9uZyR0eXBlIDwtIGZhY3Rvcihsb29wVHlwZUxvbmckdHlwZSwgbGV2ZWxzID0gYyhcXG51bV9wcFxcLCBcXG51bV9wZVxcLCBcXG51bV9wc1xcLCBcXG51bV9weFxcKSlcblxuIyBQbG90dGluZ1xuZ2dwbG90KGxvb3BUeXBlTG9uZywgYWVzKGZpbGw9dHlwZSwgeT1jb3VudCwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
#######
temp2 <- tempSum %>% rowwise() %>% mutate(total = length(anno2),
                                 num_pp = sum(anno2 == \P-P\),
                                 num_pe = sum(anno2 == \P-E\),
                                 num_ps = sum(anno2 == \P-S\),
                                 num_px = sum(anno2 == \P-X\),
                                 ratio_reg = (num_pp + num_pe)/total,
                                 ratio_str = num_ps/total)

saveRDS(temp2, here(resultDir, \gene_loop_link.rds\))


loopType <- temp2 %>% group_by(group) %>% summarise(num_pp = sum(num_pp),
                                        num_pe = sum(num_pe),
                                        num_ps = sum(num_ps),
                                        num_px = sum(num_px))


loopTypeLong <- loopType %>% pivot_longer(-group, names_to = \type\, values_to = \count\)

loopTypeLong$type <- factor(loopTypeLong$type, levels = c(\num_pp\, \num_pe\, \num_ps\, \num_px\))

# Plotting
ggplot(loopTypeLong, aes(fill=type, y=count, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSTF4dWRHVnRjRElnUEMwZ2RHVnRjRk4xYlNBbFBpVWdjbTkzZDJselpTZ3BJQ1UrSlNCdGRYUmhkR1VvZEc5MFlXd2dQU0JzWlc1bmRHZ29ZVzV1YnpJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0J3SUQwZ2MzVnRLR0Z1Ym04eUlEMDlJRnhjVUMxUVhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiblZ0WDNCbElEMGdjM1Z0S0dGdWJtOHlJRDA5SUZ4Y1VDMUZYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm5WdFgzQnpJRDBnYzNWdEtHRnVibTh5SUQwOUlGeGNVQzFUWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0I0SUQwZ2MzVnRLR0Z1Ym04eUlEMDlJRnhjVUMxWVhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbUYwYVc5ZmNtVm5JRDBnS0c1MWJWOXdjQ0FySUc1MWJWOXdaU2t2ZEc5MFlXd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlZWFJwYjE5emRISWdQU0J1ZFcxZmNITXZkRzkwWVd3cFhHNWNibk5oZG1WU1JGTW9kR1Z0Y0RJc0lHaGxjbVVvY21WemRXeDBSR2x5TENCY1hHZGxibVZmYkc5dmNGOXNhVzVyTG5Ka2MxeGNLU2xjYmx4dVhHNXNiMjl3Vkhsd1pTQThMU0IwWlcxd01pQWxQaVVnWjNKdmRYQmZZbmtvWjNKdmRYQXBJQ1UrSlNCemRXMXRZWEpwYzJVb2JuVnRYM0J3SUQwZ2MzVnRLRzUxYlY5d2NDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0JsSUQwZ2MzVnRLRzUxYlY5d1pTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0J6SUQwZ2MzVnRLRzUxYlY5d2N5a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0I0SUQwZ2MzVnRLRzUxYlY5d2VDa3BYRzVjYmx4dWJHOXZjRlI1Y0dWTWIyNW5JRHd0SUd4dmIzQlVlWEJsSUNVK0pTQndhWFp2ZEY5c2IyNW5aWElvTFdkeWIzVndMQ0J1WVcxbGMxOTBieUE5SUZ4Y2RIbHdaVnhjTENCMllXeDFaWE5mZEc4Z1BTQmNYR052ZFc1MFhGd3BYRzVjYm14dmIzQlVlWEJsVEc5dVp5UjBlWEJsSUR3dElHWmhZM1J2Y2loc2IyOXdWSGx3WlV4dmJtY2tkSGx3WlN3Z2JHVjJaV3h6SUQwZ1l5aGNYRzUxYlY5d2NGeGNMQ0JjWEc1MWJWOXdaVnhjTENCY1hHNTFiVjl3YzF4Y0xDQmNYRzUxYlY5d2VGeGNLU2xjYmx4dUl5QlFiRzkwZEdsdVoxeHVaMmR3Ykc5MEtHeHZiM0JVZVhCbFRHOXVaeXdnWVdWektHWnBiR3c5ZEhsd1pTd2dlVDFqYjNWdWRDd2dlRDFuY205MWNDa3BJQ3NnWEc0Z0lDQWdaMlZ2YlY5aVlYSW9jRzl6YVhScGIyNDlYRnhtYVd4c1hGd3NJSE4wWVhROVhGeHBaR1Z1ZEdsMGVWeGNLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LVnh1WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuIyMjIyMjI1xudGVtcDIgPC0gdGVtcFN1bSAlPiUgcm93d2lzZSgpICU+JSBtdXRhdGUodG90YWwgPSBsZW5ndGgoYW5ubzIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BwID0gc3VtKGFubm8yID09IFxcUC1QXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BlID0gc3VtKGFubm8yID09IFxcUC1FXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BzID0gc3VtKGFubm8yID09IFxcUC1TXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3B4ID0gc3VtKGFubm8yID09IFxcUC1YXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW9fcmVnID0gKG51bV9wcCArIG51bV9wZSkvdG90YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb19zdHIgPSBudW1fcHMvdG90YWwpXG5cbnNhdmVSRFModGVtcDIsIGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rLnJkc1xcKSlcblxuXG5sb29wVHlwZSA8LSB0ZW1wMiAlPiUgZ3JvdXBfYnkoZ3JvdXApICU+JSBzdW1tYXJpc2UobnVtX3BwID0gc3VtKG51bV9wcCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BlID0gc3VtKG51bV9wZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BzID0gc3VtKG51bV9wcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3B4ID0gc3VtKG51bV9weCkpXG5cblxubG9vcFR5cGVMb25nIDwtIGxvb3BUeXBlICU+JSBwaXZvdF9sb25nZXIoLWdyb3VwLCBuYW1lc190byA9IFxcdHlwZVxcLCB2YWx1ZXNfdG8gPSBcXGNvdW50XFwpXG5cbmxvb3BUeXBlTG9uZyR0eXBlIDwtIGZhY3Rvcihsb29wVHlwZUxvbmckdHlwZSwgbGV2ZWxzID0gYyhcXG51bV9wcFxcLCBcXG51bV9wZVxcLCBcXG51bV9wc1xcLCBcXG51bV9weFxcKSlcblxuIyBQbG90dGluZ1xuZ2dwbG90KGxvb3BUeXBlTG9uZywgYWVzKGZpbGw9dHlwZSwgeT1jb3VudCwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjI1xudGVtcDIgPC0gdGVtcFN1bSAlPiUgcm93d2lzZSgpICU+JSBtdXRhdGUodG90YWwgPSBsZW5ndGgoYW5ubzIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BwID0gc3VtKGFubm8yID09IFxcUC1QXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BlID0gc3VtKGFubm8yID09IFxcUC1FXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BzID0gc3VtKGFubm8yID09IFxcUC1TXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3B4ID0gc3VtKGFubm8yID09IFxcUC1YXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW9fcmVnID0gKG51bV9wcCArIG51bV9wZSkvdG90YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb19zdHIgPSBudW1fcHMvdG90YWwpXG5cbnNhdmVSRFModGVtcDIsIGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rLnJkc1xcKSlcblxuXG5sb29wVHlwZSA8LSB0ZW1wMiAlPiUgZ3JvdXBfYnkoZ3JvdXApICU+JSBzdW1tYXJpc2UobnVtX3BwID0gc3VtKG51bV9wcCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BlID0gc3VtKG51bV9wZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BzID0gc3VtKG51bV9wcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3B4ID0gc3VtKG51bV9weCkpXG5cblxubG9vcFR5cGVMb25nIDwtIGxvb3BUeXBlICU+JSBwaXZvdF9sb25nZXIoLWdyb3VwLCBuYW1lc190byA9IFxcdHlwZVxcLCB2YWx1ZXNfdG8gPSBcXGNvdW50XFwpXG5cbmxvb3BUeXBlTG9uZyR0eXBlIDwtIGZhY3Rvcihsb29wVHlwZUxvbmckdHlwZSwgbGV2ZWxzID0gYyhcXG51bV9wcFxcLCBcXG51bV9wZVxcLCBcXG51bV9wc1xcLCBcXG51bV9weFxcKSlcblxuIyBQbG90dGluZ1xuZ2dwbG90KGxvb3BUeXBlTG9uZywgYWVzKGZpbGw9dHlwZSwgeT1jb3VudCwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
#######
temp2 <- tempSum %>% rowwise() %>% mutate(total = length(anno2),
                                 num_pp = sum(anno2 == \P-P\),
                                 num_pe = sum(anno2 == \P-E\),
                                 num_ps = sum(anno2 == \P-S\),
                                 num_px = sum(anno2 == \P-X\),
                                 ratio_reg = (num_pp + num_pe)/total,
                                 ratio_str = num_ps/total)

saveRDS(temp2, here(resultDir, \gene_loop_link.rds\))


loopType <- temp2 %>% group_by(group) %>% summarise(num_pp = sum(num_pp),
                                        num_pe = sum(num_pe),
                                        num_ps = sum(num_ps),
                                        num_px = sum(num_px))


loopTypeLong <- loopType %>% pivot_longer(-group, names_to = \type\, values_to = \count\)

loopTypeLong$type <- factor(loopTypeLong$type, levels = c(\num_pp\, \num_pe\, \num_ps\, \num_px\))

# Plotting
ggplot(loopTypeLong, aes(fill=type, y=count, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-N

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakl5TmNiaU5RTFZCY2JtUmhkR0VnUEMwZ2RHVnRjRElnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJRzUxYlY5d2NDbGNibU52Ykc1aGJXVnpLR1JoZEdFcElEd3RJR01vWENKbmNtOTFjRndpTENCY0ltTnZkVzUwWENJcFhHNXdkakV5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN4Y0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLU3dnTlNsY2JuQjJNVFVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTEZ3aVozSnZkWEF4WENJc0lGd2laM0p2ZFhBMVhDSXBMQ0ExS1Z4dWNIWXhPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0VzWENKbmNtOTFjREZjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc1d2RqSTFJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3TlZ3aUtTd2dOU2xjYm5CMk1qZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMRndpWjNKdmRYQXlYQ0lzSUZ3aVozSnZkWEE0WENJcExDQTFLVnh1Y0hZMU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYQ0puY205MWNEVmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCamIzVnVkQ3dnWm1sc2JDQTlJR2R5YjNWd0tTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMalVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QWdJQ0FnSUNCY2JpQWdjMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR0p5WldGcmN5QTlJSE5sY1Nnd0xDQTFMQ0JpZVNBOUlESXBMQ0JzYVcxcGRITWdQU0JqS0RBc0lEVXBLU0FySUZ4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRndpY21Wa1hDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lLU0FnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SURFc0lIa2dQU0F6TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5CMk1USTZJRndpTENCd2RqRXlMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkakUxT2lCY0lpd2djSFl4TlN3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hZeE9Eb2dYQ0lzSUhCMk1UZ3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNalU2SUZ3aUxDQndkakkxTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3ZGpJNE9pQmNJaXdnY0hZeU9Dd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNIWTFPRG9nWENJc0lIQjJOVGdzSUZ3aVhGeHVYQ0lwTENCY2JpQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJREVwS3lBZ2RHaGxiV1VvYkdWblpXNWtMbkJ2YzJsMGFXOXVJRDBnWENKdWIyNWxYQ0lwWEc1Y2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpWTI5MWJuUmZZbUZ5Y0d4dmRGOWthV1ptUjNKdmRYQmZaRlJCUjE5MmMxOUVUVk5QWDNCd1hDSXBYRzVvWldsbmFIUWdQQzBnTTF4dWQybGtkR2dnUEMwZ00xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jIyMjIyMjI1xuI1AtUFxuZGF0YSA8LSB0ZW1wMiAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgbnVtX3BwKVxuY29sbmFtZXMoZGF0YSkgPC0gYyhcXGdyb3VwXFwsIFxcY291bnRcXClcbnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxucHYxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG5wdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbnB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG5wdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIFxuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDUsIGJ5ID0gMiksIGxpbWl0cyA9IGMoMCwgNSkpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIHB2MTIsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE4OiBcXCwgcHYxOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNTogXFwsIHB2MjUsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjU4OiBcXCwgcHY1OCwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSkrICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXClcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09fcHBcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
########
#P-P
data <- temp2 %>% dplyr::select(group, num_pp)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
                                                \pv15: \, pv15, \\n\,
                                                \pv18: \, pv18, \\n\,
                                                \pv25: \, pv25, \\n\,
                                                \pv28: \, pv28, \\n\,
                                                \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 1)+  theme(legend.position = \none\)


fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_pp\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSXlOY2JpTlFMVkJjYm1SaGRHRWdQQzBnZEdWdGNESWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHNTFiVjl3Y0NsY2JtTnZiRzVoYldWektHUmhkR0VwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEdOdmRXNTBYRndwWEc1d2RqRXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tTd2dOU2xjYm5CMk1UVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMRnhjWjNKdmRYQXhYRndzSUZ4Y1ozSnZkWEExWEZ3cExDQTFLVnh1Y0hZeE9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYRnhuY205MWNERmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzV3ZGpJMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTeGNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndOVnhjS1N3Z05TbGNibkIyTWpnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGeGNaM0p2ZFhBeVhGd3NJRnhjWjNKdmRYQTRYRndwTENBMUtWeHVjSFkxT0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFc1hGeG5jbTkxY0RWY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNWNibkFnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JqYjNWdWRDd2dabWxzYkNBOUlHZHliM1Z3S1NrZ0sxeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqVXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lBZ0lDQWdJQ0JjYmlBZ2MyTmhiR1ZmZVY5amIyNTBhVzUxYjNWektHSnlaV0ZyY3lBOUlITmxjU2d3TENBMUxDQmllU0E5SURJcExDQnNhVzFwZEhNZ1BTQmpLREFzSURVcEtTQXJJRnh1SUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGeGNjbVZrWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0tTQWdLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJREVzSUhrZ1BTQXpMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEIyTVRJNklGeGNMQ0J3ZGpFeUxDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqRTFPaUJjWEN3Z2NIWXhOU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSFl4T0RvZ1hGd3NJSEIyTVRnc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1qVTZJRnhjTENCd2RqSTFMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdkakk0T2lCY1hDd2djSFl5T0N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hZMU9Eb2dYRndzSUhCMk5UZ3NJRnhjWEZ4dVhGd3BMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlERXBLeUFnZEdobGJXVW9iR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdYRnh1YjI1bFhGd3BYRzVjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNZMjkxYm5SZlltRnljR3h2ZEY5a2FXWm1SM0p2ZFhCZlpGUkJSMTkyYzE5RVRWTlBYM0J3WEZ3cFhHNW9aV2xuYUhRZ1BDMGdNMXh1ZDJsa2RHZ2dQQzBnTTF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLVBcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wcClcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG5wdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3BwXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLVBcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wcClcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG5wdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3BwXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
########
#P-P
data <- temp2 %>% dplyr::select(group, num_pp)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
                                                \pv15: \, pv15, \\n\,
                                                \pv18: \, pv18, \\n\,
                                                \pv25: \, pv25, \\n\,
                                                \pv28: \, pv28, \\n\,
                                                \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 1)+  theme(legend.position = \none\)


fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_pp\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Counting loop types

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakl5TmNiaU5RTFVWY2JtUmhkR0VnUEMwZ2RHVnRjRElnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJRzUxYlY5d1pTbGNibU52Ykc1aGJXVnpLR1JoZEdFcElEd3RJR01vWENKbmNtOTFjRndpTENCY0ltTnZkVzUwWENJcFhHNXdkakV5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN4Y0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLU3dnTlNsY2JuQjJNVFVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTEZ3aVozSnZkWEF4WENJc0lGd2laM0p2ZFhBMVhDSXBMQ0ExS1Z4dWNIWXhPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0VzWENKbmNtOTFjREZjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc1d2RqSTFJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3TlZ3aUtTd2dOU2xjYm5CMk1qZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMRndpWjNKdmRYQXlYQ0lzSUZ3aVozSnZkWEE0WENJcExDQTFLVnh1Y0hZMU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYQ0puY205MWNEVmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCamIzVnVkQ3dnWm1sc2JDQTlJR2R5YjNWd0tTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMalVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QWdJQ0FnSUNCY2JpQWdjMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR0p5WldGcmN5QTlJSE5sY1Nnd0xDQTFMQ0JpZVNBOUlESXBMQ0JzYVcxcGRITWdQU0JqS0RBc0lEVXBLU0FySUZ4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRndpY21Wa1hDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lLU0FnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SURFc0lIa2dQU0F6TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5CMk1USTZJRndpTENCd2RqRXlMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkakUxT2lCY0lpd2djSFl4TlN3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hZeE9Eb2dYQ0lzSUhCMk1UZ3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNalU2SUZ3aUxDQndkakkxTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3ZGpJNE9pQmNJaXdnY0hZeU9Dd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNIWTFPRG9nWENJc0lIQjJOVGdzSUZ3aVhGeHVYQ0lwTENCY2JpQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJREVwS3lBZ2RHaGxiV1VvYkdWblpXNWtMbkJ2YzJsMGFXOXVJRDBnWENKdWIyNWxYQ0lwWEc1Y2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpWTI5MWJuUmZZbUZ5Y0d4dmRGOWthV1ptUjNKdmRYQmZaRlJCUjE5MmMxOUVUVk5QWDNCbFhDSXBYRzVvWldsbmFIUWdQQzBnTTF4dWQybGtkR2dnUEMwZ00xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jIyMjIyMjI1xuI1AtRVxuZGF0YSA8LSB0ZW1wMiAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgbnVtX3BlKVxuY29sbmFtZXMoZGF0YSkgPC0gYyhcXGdyb3VwXFwsIFxcY291bnRcXClcbnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxucHYxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG5wdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbnB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG5wdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIFxuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDUsIGJ5ID0gMiksIGxpbWl0cyA9IGMoMCwgNSkpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIHB2MTIsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE4OiBcXCwgcHYxOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNTogXFwsIHB2MjUsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjU4OiBcXCwgcHY1OCwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSkrICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXClcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09fcGVcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
########
#P-E
data <- temp2 %>% dplyr::select(group, num_pe)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
                                                \pv15: \, pv15, \\n\,
                                                \pv18: \, pv18, \\n\,
                                                \pv25: \, pv25, \\n\,
                                                \pv28: \, pv28, \\n\,
                                                \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 1)+  theme(legend.position = \none\)


fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_pe\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSXlOY2JpTlFMVVZjYm1SaGRHRWdQQzBnZEdWdGNESWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHNTFiVjl3WlNsY2JtTnZiRzVoYldWektHUmhkR0VwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEdOdmRXNTBYRndwWEc1d2RqRXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tTd2dOU2xjYm5CMk1UVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMRnhjWjNKdmRYQXhYRndzSUZ4Y1ozSnZkWEExWEZ3cExDQTFLVnh1Y0hZeE9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYRnhuY205MWNERmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzV3ZGpJMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTeGNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndOVnhjS1N3Z05TbGNibkIyTWpnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGeGNaM0p2ZFhBeVhGd3NJRnhjWjNKdmRYQTRYRndwTENBMUtWeHVjSFkxT0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFc1hGeG5jbTkxY0RWY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNWNibkFnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JqYjNWdWRDd2dabWxzYkNBOUlHZHliM1Z3S1NrZ0sxeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqVXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lBZ0lDQWdJQ0JjYmlBZ2MyTmhiR1ZmZVY5amIyNTBhVzUxYjNWektHSnlaV0ZyY3lBOUlITmxjU2d3TENBMUxDQmllU0E5SURJcExDQnNhVzFwZEhNZ1BTQmpLREFzSURVcEtTQXJJRnh1SUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGeGNjbVZrWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0tTQWdLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJREVzSUhrZ1BTQXpMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEIyTVRJNklGeGNMQ0J3ZGpFeUxDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqRTFPaUJjWEN3Z2NIWXhOU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSFl4T0RvZ1hGd3NJSEIyTVRnc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1qVTZJRnhjTENCd2RqSTFMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdkakk0T2lCY1hDd2djSFl5T0N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hZMU9Eb2dYRndzSUhCMk5UZ3NJRnhjWEZ4dVhGd3BMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlERXBLeUFnZEdobGJXVW9iR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdYRnh1YjI1bFhGd3BYRzVjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNZMjkxYm5SZlltRnljR3h2ZEY5a2FXWm1SM0p2ZFhCZlpGUkJSMTkyYzE5RVRWTlBYM0JsWEZ3cFhHNW9aV2xuYUhRZ1BDMGdNMXh1ZDJsa2RHZ2dQQzBnTTF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLUVcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wZSlcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG5wdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3BlXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLUVcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wZSlcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG5wdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3BlXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
########
#P-E
data <- temp2 %>% dplyr::select(group, num_pe)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
                                                \pv15: \, pv15, \\n\,
                                                \pv18: \, pv18, \\n\,
                                                \pv25: \, pv25, \\n\,
                                                \pv28: \, pv28, \\n\,
                                                \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 1)+  theme(legend.position = \none\)


fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_pe\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-P

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakl5TmNiaU5RTFZOY2JtUmhkR0VnUEMwZ2RHVnRjRElnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJRzUxYlY5d2N5bGNibU52Ykc1aGJXVnpLR1JoZEdFcElEd3RJR01vWENKbmNtOTFjRndpTENCY0ltTnZkVzUwWENJcFhHNXdkakV5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN4Y0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLU3dnTlNsY2JuQjJNVFVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTEZ3aVozSnZkWEF4WENJc0lGd2laM0p2ZFhBMVhDSXBMQ0ExS1Z4dWNIWXhPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0VzWENKbmNtOTFjREZjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc1d2RqSTFJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3TlZ3aUtTd2dOU2xjYm5CMk1qZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMRndpWjNKdmRYQXlYQ0lzSUZ3aVozSnZkWEE0WENJcExDQTFLVnh1Y0hZMU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYQ0puY205MWNEVmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCamIzVnVkQ3dnWm1sc2JDQTlJR2R5YjNWd0tTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMalVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QWdJQ0FnSUNCY2JpQWdjMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR0p5WldGcmN5QTlJSE5sY1Nnd0xDQTFMQ0JpZVNBOUlESXBMQ0JzYVcxcGRITWdQU0JqS0RBc0lEVXBLU0FySUZ4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRndpY21Wa1hDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lLU0FnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SURFc0lIa2dQU0F6TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5CMk1USTZJRndpTENCd2RqRXlMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkakUxT2lCY0lpd2djSFl4TlN3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hZeE9Eb2dYQ0lzSUhCMk1UZ3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNalU2SUZ3aUxDQndkakkxTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3ZGpJNE9pQmNJaXdnY0hZeU9Dd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNIWTFPRG9nWENJc0lIQjJOVGdzSUZ3aVhGeHVYQ0lwTENCY2JpQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJREVwS3lBZ2RHaGxiV1VvYkdWblpXNWtMbkJ2YzJsMGFXOXVJRDBnWENKdWIyNWxYQ0lwWEc1Y2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpWTI5MWJuUmZZbUZ5Y0d4dmRGOWthV1ptUjNKdmRYQmZaRlJCUjE5MmMxOUVUVk5QWDNCelhDSXBYRzVvWldsbmFIUWdQQzBnTTF4dWQybGtkR2dnUEMwZ00xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jIyMjIyMjI1xuI1AtU1xuZGF0YSA8LSB0ZW1wMiAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgbnVtX3BzKVxuY29sbmFtZXMoZGF0YSkgPC0gYyhcXGdyb3VwXFwsIFxcY291bnRcXClcbnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxucHYxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG5wdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbnB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG5wdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIFxuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDUsIGJ5ID0gMiksIGxpbWl0cyA9IGMoMCwgNSkpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIHB2MTIsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE4OiBcXCwgcHYxOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNTogXFwsIHB2MjUsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjU4OiBcXCwgcHY1OCwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSkrICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXClcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09fcHNcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
########
#P-S
data <- temp2 %>% dplyr::select(group, num_ps)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
                                                \pv15: \, pv15, \\n\,
                                                \pv18: \, pv18, \\n\,
                                                \pv25: \, pv25, \\n\,
                                                \pv28: \, pv28, \\n\,
                                                \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 1)+  theme(legend.position = \none\)


fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_ps\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSXlOY2JpTlFMVk5jYm1SaGRHRWdQQzBnZEdWdGNESWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHNTFiVjl3Y3lsY2JtTnZiRzVoYldWektHUmhkR0VwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEdOdmRXNTBYRndwWEc1d2RqRXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tTd2dOU2xjYm5CMk1UVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMRnhjWjNKdmRYQXhYRndzSUZ4Y1ozSnZkWEExWEZ3cExDQTFLVnh1Y0hZeE9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYRnhuY205MWNERmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzV3ZGpJMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTeGNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndOVnhjS1N3Z05TbGNibkIyTWpnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGeGNaM0p2ZFhBeVhGd3NJRnhjWjNKdmRYQTRYRndwTENBMUtWeHVjSFkxT0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFc1hGeG5jbTkxY0RWY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNWNibkFnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JqYjNWdWRDd2dabWxzYkNBOUlHZHliM1Z3S1NrZ0sxeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqVXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lBZ0lDQWdJQ0JjYmlBZ2MyTmhiR1ZmZVY5amIyNTBhVzUxYjNWektHSnlaV0ZyY3lBOUlITmxjU2d3TENBMUxDQmllU0E5SURJcExDQnNhVzFwZEhNZ1BTQmpLREFzSURVcEtTQXJJRnh1SUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGeGNjbVZrWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0tTQWdLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJREVzSUhrZ1BTQXpMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEIyTVRJNklGeGNMQ0J3ZGpFeUxDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqRTFPaUJjWEN3Z2NIWXhOU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSFl4T0RvZ1hGd3NJSEIyTVRnc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1qVTZJRnhjTENCd2RqSTFMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdkakk0T2lCY1hDd2djSFl5T0N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hZMU9Eb2dYRndzSUhCMk5UZ3NJRnhjWEZ4dVhGd3BMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlERXBLeUFnZEdobGJXVW9iR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdYRnh1YjI1bFhGd3BYRzVjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNZMjkxYm5SZlltRnljR3h2ZEY5a2FXWm1SM0p2ZFhCZlpGUkJSMTkyYzE5RVRWTlBYM0J6WEZ3cFhHNW9aV2xuYUhRZ1BDMGdNMXh1ZDJsa2RHZ2dQQzBnTTF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLVNcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wcylcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG5wdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3BzXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLVNcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wcylcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG5wdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3BzXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
########
#P-S
data <- temp2 %>% dplyr::select(group, num_ps)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
                                                \pv15: \, pv15, \\n\,
                                                \pv18: \, pv18, \\n\,
                                                \pv25: \, pv25, \\n\,
                                                \pv28: \, pv28, \\n\,
                                                \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 1)+  theme(legend.position = \none\)


fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_ps\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-E

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakl5TmNiaU5RTFZoY2JtUmhkR0VnUEMwZ2RHVnRjRElnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJRzUxYlY5d2VDbGNibU52Ykc1aGJXVnpLR1JoZEdFcElEd3RJR01vWENKbmNtOTFjRndpTENCY0ltTnZkVzUwWENJcFhHNXdkakV5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN4Y0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLU3dnTlNsY2JuQjJNVFVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTEZ3aVozSnZkWEF4WENJc0lGd2laM0p2ZFhBMVhDSXBMQ0ExS1Z4dWNIWXhPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0VzWENKbmNtOTFjREZjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc1d2RqSTFJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3TlZ3aUtTd2dOU2xjYm5CMk1qZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMRndpWjNKdmRYQXlYQ0lzSUZ3aVozSnZkWEE0WENJcExDQTFLVnh1Y0hZMU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYQ0puY205MWNEVmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCamIzVnVkQ3dnWm1sc2JDQTlJR2R5YjNWd0tTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMalVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QWdJQ0FnSUNCY2JpQWdjMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR0p5WldGcmN5QTlJSE5sY1Nnd0xDQTFMQ0JpZVNBOUlESXBMQ0JzYVcxcGRITWdQU0JqS0RBc0lEVXBLU0FySUZ4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRndpY21Wa1hDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lLU0FnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SURFc0lIa2dQU0F6TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5CMk1USTZJRndpTENCd2RqRXlMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkakUxT2lCY0lpd2djSFl4TlN3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hZeE9Eb2dYQ0lzSUhCMk1UZ3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNalU2SUZ3aUxDQndkakkxTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3ZGpJNE9pQmNJaXdnY0hZeU9Dd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNIWTFPRG9nWENJc0lIQjJOVGdzSUZ3aVhGeHVYQ0lwTENCY2JpQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJREVwS3lBZ2RHaGxiV1VvYkdWblpXNWtMbkJ2YzJsMGFXOXVJRDBnWENKdWIyNWxYQ0lwWEc1Y2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpWTI5MWJuUmZZbUZ5Y0d4dmRGOWthV1ptUjNKdmRYQmZaRlJCUjE5MmMxOUVUVk5QWDNCNFhDSXBYRzVvWldsbmFIUWdQQzBnTTF4dWQybGtkR2dnUEMwZ00xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jIyMjIyMjI1xuI1AtWFxuZGF0YSA8LSB0ZW1wMiAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgbnVtX3B4KVxuY29sbmFtZXMoZGF0YSkgPC0gYyhcXGdyb3VwXFwsIFxcY291bnRcXClcbnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxucHYxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG5wdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbnB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG5wdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIFxuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDUsIGJ5ID0gMiksIGxpbWl0cyA9IGMoMCwgNSkpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIHB2MTIsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE4OiBcXCwgcHYxOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNTogXFwsIHB2MjUsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjU4OiBcXCwgcHY1OCwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSkrICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXClcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09fcHhcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
########
#P-X
data <- temp2 %>% dplyr::select(group, num_px)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
                                                \pv15: \, pv15, \\n\,
                                                \pv18: \, pv18, \\n\,
                                                \pv25: \, pv25, \\n\,
                                                \pv28: \, pv28, \\n\,
                                                \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 1)+  theme(legend.position = \none\)


fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_px\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSXlOY2JpTlFMVmhjYm1SaGRHRWdQQzBnZEdWdGNESWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHNTFiVjl3ZUNsY2JtTnZiRzVoYldWektHUmhkR0VwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEdOdmRXNTBYRndwWEc1d2RqRXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tTd2dOU2xjYm5CMk1UVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMRnhjWjNKdmRYQXhYRndzSUZ4Y1ozSnZkWEExWEZ3cExDQTFLVnh1Y0hZeE9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYRnhuY205MWNERmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzV3ZGpJMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTeGNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndOVnhjS1N3Z05TbGNibkIyTWpnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGeGNaM0p2ZFhBeVhGd3NJRnhjWjNKdmRYQTRYRndwTENBMUtWeHVjSFkxT0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFc1hGeG5jbTkxY0RWY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNWNibkFnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JqYjNWdWRDd2dabWxzYkNBOUlHZHliM1Z3S1NrZ0sxeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqVXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lBZ0lDQWdJQ0JjYmlBZ2MyTmhiR1ZmZVY5amIyNTBhVzUxYjNWektHSnlaV0ZyY3lBOUlITmxjU2d3TENBMUxDQmllU0E5SURJcExDQnNhVzFwZEhNZ1BTQmpLREFzSURVcEtTQXJJRnh1SUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGeGNjbVZrWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0tTQWdLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJREVzSUhrZ1BTQXpMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEIyTVRJNklGeGNMQ0J3ZGpFeUxDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqRTFPaUJjWEN3Z2NIWXhOU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSFl4T0RvZ1hGd3NJSEIyTVRnc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1qVTZJRnhjTENCd2RqSTFMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdkakk0T2lCY1hDd2djSFl5T0N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hZMU9Eb2dYRndzSUhCMk5UZ3NJRnhjWEZ4dVhGd3BMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlERXBLeUFnZEdobGJXVW9iR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdYRnh1YjI1bFhGd3BYRzVjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNZMjkxYm5SZlltRnljR3h2ZEY5a2FXWm1SM0p2ZFhCZlpGUkJSMTkyYzE5RVRWTlBYM0I0WEZ3cFhHNW9aV2xuYUhRZ1BDMGdNMXh1ZDJsa2RHZ2dQQzBnTTF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLVhcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9weClcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG5wdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3B4XFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLVhcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9weClcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG5wdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3B4XFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
########
#P-X
data <- temp2 %>% dplyr::select(group, num_px)
colnames(data) <- c(\group\, \count\)
pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
                                                \pv15: \, pv15, \\n\,
                                                \pv18: \, pv18, \\n\,
                                                \pv25: \, pv25, \\n\,
                                                \pv28: \, pv28, \\n\,
                                                \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 1)+  theme(legend.position = \none\)


fileName <- paste0(\count_barplot_diffGroup_dTAG_vs_DMSO_px\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-S

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnYkc5aFpFeHZiM0JCYm01dlJHRjBZU2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYM0F0Ymw5bGJuTmxiV0pzVEdsemRDNTBjM1pjSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVdabVEzVjBiMlptSUQwZ01DNHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaGJtNXZUR2x6ZENBOUlHTW9YQ0pRTFZCY0lpd2dYQ0pRTFVWY0lpd2dYQ0pRTFZOY0lpd2dYQ0pRTFZoY0lpa3BKVDRsSUZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dScGMzUmhibU5sSUQwZ2MzUmhjblF5SUMwZ2MzUmhjblF4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCbFlXdEpSQ0E5SUhCaGMzUmxLR05vY205dE1Td2djM1JoY25ReExDQnpkR0Z5ZERJc0lITmxjQ0E5SUZ3aVgxd2lLU2xjYmx4dVhHNWNiaU1qSUVScGRtbGthVzVuSUdkbGJtVnpJR2x1ZEc4Z1ozSnZkWEJ6WEc1MFpXMXdJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGthV1ptWDBFME9EVmZSRTFUVHl3Z1pHbHpkR0Z1WTJVc0lHZGxibVVwSUNVK0pTQmNiaUFnZFc1dVpYTjBLR2RsYm1VcElDVStKU0JuY205MWNGOWllU2huWlc1bEtTQWxQaVZjYmlBZ2MzVnRiV0Z5YVhwbEtHMWxZVzVmWkdsbVpsOXpZMjl5WlNBOUlHMWxZVzRvWkdsbVpsOUJORGcxWDBSTlUwOHBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2JXVmhibDlrYVhOMFlXNWpaU0E5SUcxbFlXNG9aR2x6ZEdGdVkyVXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0xtZHliM1Z3Y3lBOUlDZGtjbTl3SnlsY2JseHVaR2xtWmk1U1RrRWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVpHbG1abDlITVM1Qk5EZzFMbk5sYkdWamRHVmtNbDlITVM0eWFTNUJORGcxWDNaelgwY3hMakpwTGtSTlUwOHVkSE4yWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hsYm5ObGJXSnNYMmRsYm1WZmFXUXNJR3h2WnpKR2IyeGtRMmhoYm1kbExDQnphSEpwYm10bFpGOXNiMmN5UmtNc0lIQmhaR29zSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlNsY2JseHVYRzUwWlcxd0lEd3RJR3hsWm5SZmFtOXBiaWgwWlcxd0xDQmthV1ptTGxKT1FTd2dZbmtnUFNCaktGd2laMlZ1WlZ3aUlEMGdYQ0psYm5ObGJXSnNYMmRsYm1WZmFXUmNJaWtwSUNVK0pTQmNiaUFnWkhKdmNGOXVZU2h6YUhKcGJtdGxaRjlzYjJjeVJrTXBYRzVjYmx4dVptTkRkWFJ2Wm1ZZ1BDMGdNQzQxWEc1a2FXWm1RM1YwYjJabUlEd3RJREF1TWx4dUl5QmNiblJsYlhBZ1BDMGdkR1Z0Y0NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlHbG1aV3h6WlNodFpXRnVYMlJwWm1aZmMyTnZjbVVnUENBdFpHbG1aa04xZEc5bVppeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHdnTFdaalEzVjBiMlptTENBeExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9jMmh5YVc1clpXUmZiRzluTWtaRElEeG1ZME4xZEc5bVppd2dNaXdnTXlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQQ0JrYVdabVEzVjBiMlptTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z0xXWmpRM1YwYjJabUxDQTBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLSE5vY21sdWEyVmtYMnh2WnpKR1F5QThJR1pqUTNWMGIyWm1MQ0ExTENBMktTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2h6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0F0Wm1ORGRYUnZabVlzSURjc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z1ptTkRkWFJ2Wm1Zc0lEZ3NJRGtwS1NrcEtWeHVYRzVjYm1kbGJtVXVaM0p2ZFhBeElEd3RJQ2gwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlERXBLU1JuWlc1bFhHNW5aVzVsTG1keWIzVndNaUE4TFNBb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0F5S1Nra1oyVnVaVnh1WjJWdVpTNW5jbTkxY0RNZ1BDMGdLSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ015a3BKR2RsYm1WY2JtZGxibVV1WjNKdmRYQTBJRHd0SUNoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRFFwS1NSblpXNWxYRzVuWlc1bExtZHliM1Z3TlNBOExTQW9kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNBMUtTa2taMlZ1WlZ4dVoyVnVaUzVuY205MWNEWWdQQzBnS0hSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdOaWtwSkdkbGJtVmNibWRsYm1VdVozSnZkWEEzSUR3dElDaDBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SURjcEtTUm5aVzVsWEc1blpXNWxMbWR5YjNWd09DQThMU0FvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQTRLU2trWjJWdVpWeHVaMlZ1WlM1bmNtOTFjRGtnUEMwZ0tIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnT1NrcEpHZGxibVZjYmx4dVpuZHlhWFJsS0NoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJREVwS1N3Z2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmUVRRNE5WOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3TVM1MGMzWmNJaWtzSUhObGNDQTlJRndpWEZ4MFhDSXBYRzVtZDNKcGRHVW9LSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ01pa3BMQ0JvWlhKbEtISmxaa1JwY2l3Z1hDSm5aVzVsVEdsemRGOUJORGcxWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQXlMblJ6ZGx3aUtTd2djMlZ3SUQwZ1hDSmNYSFJjSWlsY2JtWjNjbWwwWlNnb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0F6S1Nrc0lHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDBFME9EVmZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RNdWRITjJYQ0lwTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1Wm5keWFYUmxLQ2gwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlEUXBLU3dnYUdWeVpTaHlaV1pFYVhJc0lGd2laMlZ1WlV4cGMzUmZRVFE0TlY5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJkeWIzVndOQzUwYzNaY0lpa3NJSE5sY0NBOUlGd2lYRngwWENJcFhHNW1kM0pwZEdVb0tIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnTlNrcExDQm9aWEpsS0hKbFprUnBjaXdnWENKblpXNWxUR2x6ZEY5Qk5EZzFYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBMUxuUnpkbHdpS1N3Z2MyVndJRDBnWENKY1hIUmNJaWxjYm1aM2NtbDBaU2dvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQTJLU2tzSUdobGNtVW9jbVZtUkdseUxDQmNJbWRsYm1WTWFYTjBYMEUwT0RWZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjRFl1ZEhOMlhDSXBMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUtWeHVabmR5YVhSbEtDaDBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SURjcEtTd2dhR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlFUUTROVjkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd055NTBjM1pjSWlrc0lITmxjQ0E5SUZ3aVhGeDBYQ0lwWEc1bWQzSnBkR1VvS0hSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdPQ2twTENCb1pYSmxLSEpsWmtScGNpd2dYQ0puWlc1bFRHbHpkRjlCTkRnMVgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlozSnZkWEE0TG5SemRsd2lLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNibVozY21sMFpTZ29kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNBNUtTa3NJR2hsY21Vb2NtVm1SR2x5TENCY0ltZGxibVZNYVhOMFgwRTBPRFZmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNEa3VkSE4yWENJcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVhHNWNiaU1nUVdSa2FXNW5JR2R5YjNWd0lHbHVabTl5YldGMGFXOXVJSFJ2SUdkbGJtVkJibTV2WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0IxYm01bGMzUW9aMlZ1WlNrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1hHNGdJR2R5YjNWd0lEMGdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsTG1keWIzVndNU3dnWENKbmNtOTFjREZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCblpXNWxMbWR5YjNWd01pd2dYQ0puY205MWNESmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjRE1zSUZ3aVozSnZkWEF6WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bExtZHliM1Z3TkN3Z1hDSm5jbTkxY0RSY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bExtZHliM1Z3TlN3Z1hDSm5jbTkxY0RWY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjRFlzSUZ3aVozSnZkWEEyWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCblpXNWxMbWR5YjNWd055d2dYQ0puY205MWNEZGNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsTG1keWIzVndPQ3dnWENKbmNtOTFjRGhjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjRGtzSUZ3aVozSnZkWEE1WENJc0lFNUJLU2twS1NrcEtTa3BYRzRwWEc1Y2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgIHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSlcblxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9BNDg1X0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcblxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpXG5cblxuZmNDdXRvZmYgPC0gMC41XG5kaWZmQ3V0b2ZmIDwtIDAuMlxuIyBcbnRlbXAgPC0gdGVtcCAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IGlmZWxzZShtZWFuX2RpZmZfc2NvcmUgPCAtZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmLCAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hyaW5rZWRfbG9nMkZDIDxmY0N1dG9mZiwgMiwgMykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtZWFuX2RpZmZfc2NvcmUgPCBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmLCA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IGZjQ3V0b2ZmLCA1LCA2KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYsIDcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hyaW5rZWRfbG9nMkZDIDwgZmNDdXRvZmYsIDgsIDkpKSkpKVxuXG5cbmdlbmUuZ3JvdXAxIDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDEpKSRnZW5lXG5nZW5lLmdyb3VwMiA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAyKSkkZ2VuZVxuZ2VuZS5ncm91cDMgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMykpJGdlbmVcbmdlbmUuZ3JvdXA0IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDQpKSRnZW5lXG5nZW5lLmdyb3VwNSA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA1KSkkZ2VuZVxuZ2VuZS5ncm91cDYgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNikpJGdlbmVcbmdlbmUuZ3JvdXA3IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDcpKSRnZW5lXG5nZW5lLmdyb3VwOCA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA4KSkkZ2VuZVxuZ2VuZS5ncm91cDkgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOSkpJGdlbmVcblxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDEpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwMS50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMikpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAyLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAzKSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDQpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNC50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNSkpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA2KSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDYudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDcpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOCkpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA4LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA5KSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDkudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cbiMgQWRkaW5nIGdyb3VwIGluZm9ybWF0aW9uIHRvIGdlbmVBbm5vXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMiwgXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDMsIFxcZ3JvdXAzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNCwgXFxncm91cDRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNSwgXFxncm91cDVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDYsIFxcZ3JvdXA2XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNywgXFxncm91cDdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwOCwgXFxncm91cDhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDksIFxcZ3JvdXA5XFwsIE5BKSkpKSkpKSkpXG4pXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)


temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)


fcCutoff <- 0.5
diffCutoff <- 0.2
# 
temp <- temp %>%
  dplyr::mutate(group = ifelse(mean_diff_score < -diffCutoff,
                               ifelse(shrinked_log2FC < -fcCutoff, 1,
                                      ifelse(shrinked_log2FC <fcCutoff, 2, 3)),
                               ifelse(mean_diff_score < diffCutoff,
                                      ifelse(shrinked_log2FC < -fcCutoff, 4,
                                             ifelse(shrinked_log2FC < fcCutoff, 5, 6)),
                                      ifelse(shrinked_log2FC < -fcCutoff, 7,
                                             ifelse(shrinked_log2FC < fcCutoff, 8, 9)))))


gene.group1 <- (temp %>% dplyr::filter(group == 1))$gene
gene.group2 <- (temp %>% dplyr::filter(group == 2))$gene
gene.group3 <- (temp %>% dplyr::filter(group == 3))$gene
gene.group4 <- (temp %>% dplyr::filter(group == 4))$gene
gene.group5 <- (temp %>% dplyr::filter(group == 5))$gene
gene.group6 <- (temp %>% dplyr::filter(group == 6))$gene
gene.group7 <- (temp %>% dplyr::filter(group == 7))$gene
gene.group8 <- (temp %>% dplyr::filter(group == 8))$gene
gene.group9 <- (temp %>% dplyr::filter(group == 9))$gene

fwrite((temp %>% dplyr::filter(group == 1)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group1.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 2)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group2.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 3)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group3.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 4)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group4.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 5)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group5.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 6)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group6.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 7)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group7.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 8)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group8.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 9)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group9.tsv\), sep = \\t\)


# Adding group information to geneAnno
geneAnnoData <- geneAnnoData %>% unnest(gene) %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\,
                        ifelse(gene %in% gene.group3, \group3\,
                               ifelse(gene %in% gene.group4, \group4\,
                                      ifelse(gene %in% gene.group5, \group5\,
                                             ifelse(gene %in% gene.group6, \group6\,
                                                    ifelse(gene %in% gene.group7, \group7\,
                                                           ifelse(gene %in% gene.group8, \group8\,
                                                                  ifelse(gene %in% gene.group9, \group9\, NA)))))))))
)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gzQXRibDlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptUTNWMGIyWm1JRDBnTUM0eUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hGeFFMVkJjWEN3Z1hGeFFMVVZjWEN3Z1hGeFFMVk5jWEN3Z1hGeFFMVmhjWENrcEpUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJsWVd0SlJDQTlJSEJoYzNSbEtHTm9jbTl0TVN3Z2MzUmhjblF4TENCemRHRnlkRElzSUhObGNDQTlJRnhjWDF4Y0tTbGNibHh1WEc1Y2JpTWpJRVJwZG1sa2FXNW5JR2RsYm1WeklHbHVkRzhnWjNKdmRYQnpYRzUwWlcxd0lEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoa2FXWm1YMEUwT0RWZlJFMVRUeXdnWkdsemRHRnVZMlVzSUdkbGJtVXBJQ1UrSlNCY2JpQWdkVzV1WlhOMEtHZGxibVVwSUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0cxbFlXNWZaR2xtWmw5elkyOXlaU0E5SUcxbFlXNG9aR2xtWmw5Qk5EZzFYMFJOVTA4cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnYldWaGJsOWthWE4wWVc1alpTQTlJRzFsWVc0b1pHbHpkR0Z1WTJVcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnTG1keWIzVndjeUE5SUNka2NtOXdKeWxjYmx4dVpHbG1aaTVTVGtFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWkdsbVpsOUhNUzVCTkRnMUxuTmxiR1ZqZEdWa01sOUhNUzR5YVM1Qk5EZzFYM1p6WDBjeExqSnBMa1JOVTA4dWRITjJYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGxibk5sYldKc1gyZGxibVZmYVdRc0lHeHZaekpHYjJ4a1EyaGhibWRsTENCemFISnBibXRsWkY5c2IyY3lSa01zSUhCaFpHb3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU2xjYmx4dVhHNTBaVzF3SUR3dElHeGxablJmYW05cGJpaDBaVzF3TENCa2FXWm1MbEpPUVN3Z1lua2dQU0JqS0Z4Y1oyVnVaVnhjSUQwZ1hGeGxibk5sYldKc1gyZGxibVZmYVdSY1hDa3BJQ1UrSlNCY2JpQWdaSEp2Y0Y5dVlTaHphSEpwYm10bFpGOXNiMmN5UmtNcFhHNWNibHh1Wm1ORGRYUnZabVlnUEMwZ01DNDFYRzVrYVdabVEzVjBiMlptSUR3dElEQXVNbHh1SXlCY2JuUmxiWEFnUEMwZ2RHVnRjQ0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUdsbVpXeHpaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQQ0F0WkdsbVprTjFkRzltWml4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9jMmh5YVc1clpXUmZiRzluTWtaRElEd2dMV1pqUTNWMGIyWm1MQ0F4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb2MyaHlhVzVyWldSZmJHOW5Na1pESUR4bVkwTjFkRzltWml3Z01pd2dNeWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaHRaV0Z1WDJScFptWmZjMk52Y21VZ1BDQmthV1ptUTNWMGIyWm1MRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHdnTFdaalEzVjBiMlptTENBMExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtITm9jbWx1YTJWa1gyeHZaekpHUXlBOElHWmpRM1YwYjJabUxDQTFMQ0EyS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaHphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXRabU5EZFhSdlptWXNJRGNzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHdnWm1ORGRYUnZabVlzSURnc0lEa3BLU2twS1Z4dVhHNWNibWRsYm1VdVozSnZkWEF4SUR3dElDaDBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SURFcEtTUm5aVzVsWEc1blpXNWxMbWR5YjNWd01pQThMU0FvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQXlLU2trWjJWdVpWeHVaMlZ1WlM1bmNtOTFjRE1nUEMwZ0tIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnTXlrcEpHZGxibVZjYm1kbGJtVXVaM0p2ZFhBMElEd3RJQ2gwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlEUXBLU1JuWlc1bFhHNW5aVzVsTG1keWIzVndOU0E4TFNBb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0ExS1Nra1oyVnVaVnh1WjJWdVpTNW5jbTkxY0RZZ1BDMGdLSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ05pa3BKR2RsYm1WY2JtZGxibVV1WjNKdmRYQTNJRHd0SUNoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRGNwS1NSblpXNWxYRzVuWlc1bExtZHliM1Z3T0NBOExTQW9kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNBNEtTa2taMlZ1WlZ4dVoyVnVaUzVuY205MWNEa2dQQzBnS0hSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdPU2twSkdkbGJtVmNibHh1Wm5keWFYUmxLQ2gwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlERXBLU3dnYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZRVFE0TlY5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJkeWIzVndNUzUwYzNaY1hDa3NJSE5sY0NBOUlGeGNYRngwWEZ3cFhHNW1kM0pwZEdVb0tIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnTWlrcExDQm9aWEpsS0hKbFprUnBjaXdnWEZ4blpXNWxUR2x6ZEY5Qk5EZzFYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBeUxuUnpkbHhjS1N3Z2MyVndJRDBnWEZ4Y1hIUmNYQ2xjYm1aM2NtbDBaU2dvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQXpLU2tzSUdobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMEUwT0RWZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjRE11ZEhOMlhGd3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVabmR5YVhSbEtDaDBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SURRcEtTd2dhR1Z5WlNoeVpXWkVhWElzSUZ4Y1oyVnVaVXhwYzNSZlFUUTROVjkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd05DNTBjM1pjWENrc0lITmxjQ0E5SUZ4Y1hGeDBYRndwWEc1bWQzSnBkR1VvS0hSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdOU2twTENCb1pYSmxLSEpsWmtScGNpd2dYRnhuWlc1bFRHbHpkRjlCTkRnMVgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlozSnZkWEExTG5SemRseGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDbGNibVozY21sMFpTZ29kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNBMktTa3NJR2hsY21Vb2NtVm1SR2x5TENCY1hHZGxibVZNYVhOMFgwRTBPRFZmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNEWXVkSE4yWEZ3cExDQnpaWEFnUFNCY1hGeGNkRnhjS1Z4dVpuZHlhWFJsS0NoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRGNwS1N3Z2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmUVRRNE5WOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3Tnk1MGMzWmNYQ2tzSUhObGNDQTlJRnhjWEZ4MFhGd3BYRzVtZDNKcGRHVW9LSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ09Da3BMQ0JvWlhKbEtISmxaa1JwY2l3Z1hGeG5aVzVsVEdsemRGOUJORGcxWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQTRMblJ6ZGx4Y0tTd2djMlZ3SUQwZ1hGeGNYSFJjWENsY2JtWjNjbWwwWlNnb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0E1S1Nrc0lHaGxjbVVvY21WbVJHbHlMQ0JjWEdkbGJtVk1hWE4wWDBFME9EVmZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RrdWRITjJYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1WEc1Y2JpTWdRV1JrYVc1bklHZHliM1Z3SUdsdVptOXliV0YwYVc5dUlIUnZJR2RsYm1WQmJtNXZYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQjFibTVsYzNRb1oyVnVaU2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lHZHliM1Z3SUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCblpXNWxMbWR5YjNWd01Td2dYRnhuY205MWNERmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bExtZHliM1Z3TWl3Z1hGeG5jbTkxY0RKY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNETXNJRnhjWjNKdmRYQXpYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsTG1keWIzVndOQ3dnWEZ4bmNtOTFjRFJjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQm5aVzVsTG1keWIzVndOU3dnWEZ4bmNtOTFjRFZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNEWXNJRnhjWjNKdmRYQTJYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JuWlc1bExtZHliM1Z3Tnl3Z1hGeG5jbTkxY0RkY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCblpXNWxMbWR5YjNWd09Dd2dYRnhuY205MWNEaGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNEa3NJRnhjWjNKdmRYQTVYRndzSUU1QktTa3BLU2twS1NrcFhHNHBYRzVjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICBwZWFrSUQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSBcXF9cXCkpXG5cblxuXG4jIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwc1xudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfQTQ4NV9ETVNPKSxcbiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSxcbiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5cblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRyb3BfbmEoc2hyaW5rZWRfbG9nMkZDKVxuXG5cbmZjQ3V0b2ZmIDwtIDAuNVxuZGlmZkN1dG9mZiA8LSAwLjJcbiMgXG50ZW1wIDwtIHRlbXAgJT4lXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBpZmVsc2UobWVhbl9kaWZmX3Njb3JlIDwgLWRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiwgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8ZmNDdXRvZmYsIDIsIDMpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobWVhbl9kaWZmX3Njb3JlIDwgZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiwgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPCBmY0N1dG9mZiwgNSwgNikpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmLCA3LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IGZjQ3V0b2ZmLCA4LCA5KSkpKSlcblxuXG5nZW5lLmdyb3VwMSA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAxKSkkZ2VuZVxuZ2VuZS5ncm91cDIgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMikpJGdlbmVcbmdlbmUuZ3JvdXAzIDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDMpKSRnZW5lXG5nZW5lLmdyb3VwNCA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA0KSkkZ2VuZVxuZ2VuZS5ncm91cDUgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNSkpJGdlbmVcbmdlbmUuZ3JvdXA2IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDYpKSRnZW5lXG5nZW5lLmdyb3VwNyA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA3KSkkZ2VuZVxuZ2VuZS5ncm91cDggPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOCkpJGdlbmVcbmdlbmUuZ3JvdXA5IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDkpKSRnZW5lXG5cbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAxKSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDIpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMykpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAzLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA0KSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDQudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDUpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNS50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNikpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA2LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA3KSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDcudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDgpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwOC50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOSkpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA5LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuXG4jIEFkZGluZyBncm91cCBpbmZvcm1hdGlvbiB0byBnZW5lQW5ub1xuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgdW5uZXN0KGdlbmUpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAzLCBcXGdyb3VwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDQsIFxcZ3JvdXA0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA2LCBcXGdyb3VwNlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDcsIFxcZ3JvdXA3XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDgsIFxcZ3JvdXA4XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA5LCBcXGdyb3VwOVxcLCBOQSkpKSkpKSkpKVxuKVxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgIHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSlcblxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9BNDg1X0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcblxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpXG5cblxuZmNDdXRvZmYgPC0gMC41XG5kaWZmQ3V0b2ZmIDwtIDAuMlxuIyBcbnRlbXAgPC0gdGVtcCAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IGlmZWxzZShtZWFuX2RpZmZfc2NvcmUgPCAtZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmLCAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hyaW5rZWRfbG9nMkZDIDxmY0N1dG9mZiwgMiwgMykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtZWFuX2RpZmZfc2NvcmUgPCBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmLCA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IGZjQ3V0b2ZmLCA1LCA2KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYsIDcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hyaW5rZWRfbG9nMkZDIDwgZmNDdXRvZmYsIDgsIDkpKSkpKVxuXG5cbmdlbmUuZ3JvdXAxIDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDEpKSRnZW5lXG5nZW5lLmdyb3VwMiA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAyKSkkZ2VuZVxuZ2VuZS5ncm91cDMgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMykpJGdlbmVcbmdlbmUuZ3JvdXA0IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDQpKSRnZW5lXG5nZW5lLmdyb3VwNSA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA1KSkkZ2VuZVxuZ2VuZS5ncm91cDYgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNikpJGdlbmVcbmdlbmUuZ3JvdXA3IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDcpKSRnZW5lXG5nZW5lLmdyb3VwOCA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA4KSkkZ2VuZVxuZ2VuZS5ncm91cDkgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOSkpJGdlbmVcblxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDEpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwMS50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMikpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAyLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAzKSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDQpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNC50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNSkpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA2KSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDYudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDcpKSwgaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOCkpLCBoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA4LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA5KSksIGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDkudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cbiMgQWRkaW5nIGdyb3VwIGluZm9ybWF0aW9uIHRvIGdlbmVBbm5vXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMiwgXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDMsIFxcZ3JvdXAzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNCwgXFxncm91cDRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNSwgXFxncm91cDVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDYsIFxcZ3JvdXA2XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNywgXFxncm91cDdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwOCwgXFxncm91cDhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDksIFxcZ3JvdXA5XFwsIE5BKSkpKSkpKSkpXG4pXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)


temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)


fcCutoff <- 0.5
diffCutoff <- 0.2
# 
temp <- temp %>%
  dplyr::mutate(group = ifelse(mean_diff_score < -diffCutoff,
                               ifelse(shrinked_log2FC < -fcCutoff, 1,
                                      ifelse(shrinked_log2FC <fcCutoff, 2, 3)),
                               ifelse(mean_diff_score < diffCutoff,
                                      ifelse(shrinked_log2FC < -fcCutoff, 4,
                                             ifelse(shrinked_log2FC < fcCutoff, 5, 6)),
                                      ifelse(shrinked_log2FC < -fcCutoff, 7,
                                             ifelse(shrinked_log2FC < fcCutoff, 8, 9)))))


gene.group1 <- (temp %>% dplyr::filter(group == 1))$gene
gene.group2 <- (temp %>% dplyr::filter(group == 2))$gene
gene.group3 <- (temp %>% dplyr::filter(group == 3))$gene
gene.group4 <- (temp %>% dplyr::filter(group == 4))$gene
gene.group5 <- (temp %>% dplyr::filter(group == 5))$gene
gene.group6 <- (temp %>% dplyr::filter(group == 6))$gene
gene.group7 <- (temp %>% dplyr::filter(group == 7))$gene
gene.group8 <- (temp %>% dplyr::filter(group == 8))$gene
gene.group9 <- (temp %>% dplyr::filter(group == 9))$gene

fwrite((temp %>% dplyr::filter(group == 1)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group1.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 2)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group2.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 3)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group3.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 4)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group4.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 5)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group5.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 6)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group6.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 7)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group7.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 8)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group8.tsv\), sep = \\t\)
fwrite((temp %>% dplyr::filter(group == 9)), here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group9.tsv\), sep = \\t\)


# Adding group information to geneAnno
geneAnnoData <- geneAnnoData %>% unnest(gene) %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\,
                        ifelse(gene %in% gene.group3, \group3\,
                               ifelse(gene %in% gene.group4, \group4\,
                                      ifelse(gene %in% gene.group5, \group5\,
                                             ifelse(gene %in% gene.group6, \group6\,
                                                    ifelse(gene %in% gene.group7, \group7\,
                                                           ifelse(gene %in% gene.group8, \group8\,
                                                                  ifelse(gene %in% gene.group9, \group9\, NA)))))))))
)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-X

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVSMDh4SUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxMbWR5YjNWd01Td2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY0lrVk9VMFZOUWt4Y0lpd2diMjUwSUQwZ1hDSkNVRndpS1Z4dVIwOHlJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bExtZHliM1Z3TWl3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lLVnh1UjA4eklEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsTG1keWIzVndNeXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUtWeHVSMDgwSUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxMbWR5YjNWd05Dd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY0lrVk9VMFZOUWt4Y0lpd2diMjUwSUQwZ1hDSkNVRndpS1Z4dVIwODFJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bExtZHliM1Z3TlN3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lLVnh1UjA4MklEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsTG1keWIzVndOaXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUtWeHVSMDgzSUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxMbWR5YjNWd055d2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY0lrVk9VMFZOUWt4Y0lpd2diMjUwSUQwZ1hDSkNVRndpS1Z4dVIwODRJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bExtZHliM1Z3T0N3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lLVnh1UjA4NUlEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsTG1keWIzVndPU3dnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUtWeHVYRzVrYjNSd2JHOTBLRWRQTVN3Z2MyaHZkME5oZEdWbmIzSjVJRDBnTVRBcFhHNWNiaU1nWEc0aklFZFBNUzVrWmlBOExTQmhjeTVrWVhSaExtWnlZVzFsS0VkUE1TbGNiaU1nUjA4eUxtUm1JRHd0SUdGekxtUmhkR0V1Wm5KaGJXVW9SMDh5S1Z4dUl5QkhUek11WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNoSFR6VXBYRzRqSUVkUE5DNWtaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLRWRQT0NsY2JpTWdYRzRqSUhOMVluTmxkREVnUEMwZ1IwOHhMbVJtSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VsRUxDQkVaWE5qY21sd2RHbHZiaXdnUjJWdVpWSmhkR2x2TENCd0xtRmthblZ6ZENrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCY0ltZHliM1Z3TVZ3aUtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNJaTljSWx4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hDSXZYQ0lwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdjM1ZpYzJWME1pQThMU0JIVHpJdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxFZGxibVZTWVhScGJ5d2djQzVoWkdwMWMzUXBJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdYQ0puY205MWNESmNJaWtnSlQ0bFhHNGpJQ0FnWkhCc2VYSTZPbTExZEdGMFpTaGNiaU1nSUNBZ0lHZHlJRDBnYzJGd2NHeDVLRWRsYm1WU1lYUnBieXdnWm5WdVkzUnBiMjRvZUNrZ2UxeHVJeUFnSUNBZ0lDQWpJRk53YkdsMElIUm9aU0J6ZEhKcGJtY2dZbmtnWENJdlhDSmNiaU1nSUNBZ0lDQWdjR0Z5ZEhNZ1BDMGdkVzVzYVhOMEtITjBjbk53YkdsMEtIZ3NJRndpTDF3aUtTbGNiaU1nSUNBZ0lDQWdJeUJEYjI1MlpYSjBJSFJ2SUc1MWJXVnlhV01nWVc1a0lIQmxjbVp2Y20wZ2RHaGxJR1JwZG1semFXOXVYRzRqSUNBZ0lDQWdJR0Z6TG01MWJXVnlhV01vY0dGeWRITmJNVjBwSUM4Z1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeVhTbGNiaU1nSUNBZ0lIMHBYRzRqSUNBZ0tTQWxQaVVnWkhCc2VYSTZPbUZ5Y21GdVoyVW9aR1Z6WXlobmNpa3BYRzRqSUhOMVluTmxkRE1nUEMwZ1IwOHpMbVJtSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VsRUxDQkVaWE5qY21sd2RHbHZiaXhIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ3aVozSnZkWEF6WENJcElDVStKVnh1SXlBZ0lHUndiSGx5T2pwdGRYUmhkR1VvWEc0aklDQWdJQ0JuY2lBOUlITmhjSEJzZVNoSFpXNWxVbUYwYVc4c0lHWjFibU4wYVc5dUtIZ3BJSHRjYmlNZ0lDQWdJQ0FnSXlCVGNHeHBkQ0IwYUdVZ2MzUnlhVzVuSUdKNUlGd2lMMXdpWEc0aklDQWdJQ0FnSUhCaGNuUnpJRHd0SUhWdWJHbHpkQ2h6ZEhKemNHeHBkQ2g0TENCY0lpOWNJaWtwWEc0aklDQWdJQ0FnSUNNZ1EyOXVkbVZ5ZENCMGJ5QnVkVzFsY21saklHRnVaQ0J3WlhKbWIzSnRJSFJvWlNCa2FYWnBjMmx2Ymx4dUl5QWdJQ0FnSUNCaGN5NXVkVzFsY21saktIQmhjblJ6V3pGZEtTQXZJR0Z6TG01MWJXVnlhV01vY0dGeWRITmJNbDBwWEc0aklDQWdJQ0I5S1Z4dUl5QWdJQ2tnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dSbGMyTW9aM0lwS1Z4dUl5QmNiaU1nUjA5c2FYTjBJRHd0SUdaaFkzUnZjaWhqS0Z3aVIwODZNREF6TXpBd01sd2lMQ0JjSWtkUE9qQXdOekF6TnpOY0lpd2dYQ0pIVHpvd01EUTROek13WENJc0lGd2lSMDg2TURBek1URXdNMXdpTEZ4dUl5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lSMDg2TURBeU1qWXhNMXdpTENCY0lrZFBPakF3TlRBM05qZGNJaXdnWENKSFR6b3dNRE0wTkRjd1hDSXNJRndpUjA4Nk1EQXhOakExTlZ3aUxDQmNiaU1nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWtkUE9qQXdNRFl6T1RkY0lpd2dYQ0pIVHpvd01ETXdPVEF3WENJc0lGd2lSMDg2TURBd09ETTRNRndpS1NsY2JpTWdYRzRqSUdSaGRHRWdQQzBnWW1sdVpGOXliM2R6S0dKcGJtUmZjbTkzY3loemRXSnpaWFF4TENCemRXSnpaWFF5S1N3Z2MzVmljMlYwTXlrZ0pUNGxYRzRqSUNBZ1pIQnNlWEk2T21acGJIUmxjaWhKUkNBbGFXNGxJRWRQYkdsemRDbGNiaU1nWEc0aklHUmxjMk5QY21SbGNpQThMU0J6YjNKMEtIVnVhWEYxWlNoa1lYUmhKRVJsYzJOeWFYQjBhVzl1S1NsYll5Z3hMQ0F5TENBMUxDQTNMRnh1SXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F6TENBMExDQTJMQ0E0TENBNUxDQXhNQ3dnTVRFcFhWeHVJeUJjYmlNZ2NDQThMU0JuWjNCc2IzUW9aR0YwWVN3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlHWmhZM1J2Y2loRVpYTmpjbWx3ZEdsdmJpd2diR1YyWld3Z1BTQmtaWE5qVDNKa1pYSXBMQ0JqYjJ4dmNpQTlJSEF1WVdScWRYTjBMQ0J6YVhwbElEMGdaM0lwS1NBcklGeHVJeUFnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJSFJvWlcxbFgySjNLQ2tnSzF4dUl5QWdJSE5qWVd4bFgyTnZiRzl5WDJkeVlXUnBaVzUwS0d4dmR5QTlJRndpY21Wa1hDSXNJR2hwWjJnZ1BTQmNJbUpzZFdWY0lpd2diR2x0YVhSeklEMGdZeWd3TENBd0xqQTFLU2tnSzF4dUl5QWdJSE5qWVd4bFgzTnBlbVZmWTI5dWRHbHVkVzkxY3loeVlXNW5aU0E5SUdNb01Dd2dNeWtwSUN0Y2JpTWdJQ0JzWVdKektIZ2dQU0JPVlV4TUxDQjVJRDBnVGxWTVRDa2dLMXh1SXlBZ0lIUm9aVzFsS0dGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOaWtzSUNBaklGTmxkQ0JoZUdseklIUmxlSFFnYzJsNlpWeHVJeUFnSUNBZ0lDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9jMmw2WlNBOUlEWXBMQ0FqSUZObGRDQmhlR2x6SUhScGRHeGxJSE5wZW1VZ0tHbG1JRzV2ZENCeVpXMXZkbVZrS1Z4dUl5QWdJQ0FnSUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBMktTd2dJeUJUWlhRZ2JHVm5aVzVrSUhSbGVIUWdjMmw2WlZ4dUl5QWdJQ0FnSUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3BJRnh1SXlCY2JpTWdabWxzWlU1aGJXVWdQQzBnYUdWeVpTaG1hV2RFYVhJc0lGd2lMaTVjSWl3Z1hDSkhUMXdpTENCY0lrZFBYMmR5YjNWd2Mxd2lLVnh1SXlCb1pXbG5hSFFnUFNBeVhHNGpJSGRwWkhSb0lEMGdNeTQxWEc0aklITjJaMnhwZEdVb2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlNZ2NISnBiblFvY0NsY2JpTWdaR1YyTG05bVppZ3BYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbkdPMSA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPMiA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPMyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPNCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPNSA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDUsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPNiA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDYsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPNyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDcsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPOCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDgsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPOSA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDksIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcblxuZG90cGxvdChHTzEsIHNob3dDYXRlZ29yeSA9IDEwKVxuXG4jIFxuIyBHTzEuZGYgPC0gYXMuZGF0YS5mcmFtZShHTzEpXG4jIEdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKEdPMilcbiMgR08zLmRmIDwtIGFzLmRhdGEuZnJhbWUoR081KVxuIyBHTzQuZGYgPC0gYXMuZGF0YS5mcmFtZShHTzgpXG4jIFxuIyBzdWJzZXQxIDwtIEdPMS5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxncm91cDFcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbixHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcZ3JvdXAyXFwpICU+JVxuIyAgIGRwbHlyOjptdXRhdGUoXG4jICAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHtcbiMgICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4jICAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4jICAgICAgICMgQ29udmVydCB0byBudW1lcmljIGFuZCBwZXJmb3JtIHRoZSBkaXZpc2lvblxuIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4jICAgICB9KVxuIyAgICkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZ3IpKVxuIyBzdWJzZXQzIDwtIEdPMy5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXGdyb3VwM1xcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgXG4jIEdPbGlzdCA8LSBmYWN0b3IoYyhcXEdPOjAwMzMwMDJcXCwgXFxHTzowMDcwMzczXFwsIFxcR086MDA0ODczMFxcLCBcXEdPOjAwMzExMDNcXCxcbiMgICAgICAgICAgICAgICAgICBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDUwNzY3XFwsIFxcR086MDAzNDQ3MFxcLCBcXEdPOjAwMTYwNTVcXCwgXG4jICAgICAgICAgICAgICAgICAgXFxHTzowMDA2Mzk3XFwsIFxcR086MDAzMDkwMFxcLCBcXEdPOjAwMDgzODBcXCkpXG4jIFxuIyBkYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3Moc3Vic2V0MSwgc3Vic2V0MiksIHN1YnNldDMpICU+JVxuIyAgIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpXG4jIFxuIyBkZXNjT3JkZXIgPC0gc29ydCh1bmlxdWUoZGF0YSREZXNjcmlwdGlvbikpW2MoMSwgMiwgNSwgNyxcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgNCwgNiwgOCwgOSwgMTAsIDExKV1cbiMgXG4jIHAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBmYWN0b3IoRGVzY3JpcHRpb24sIGxldmVsID0gZGVzY09yZGVyKSwgY29sb3IgPSBwLmFkanVzdCwgc2l6ZSA9IGdyKSkgKyBcbiMgICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICtcbiMgICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibHVlXFwsIGxpbWl0cyA9IGMoMCwgMC4wNSkpICtcbiMgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAsIDMpKSArXG4jICAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiMgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZClcbiMgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemVcbiMgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcbiMgXG4jIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXC4uXFwsIFxcR09cXCwgXFxHT19ncm91cHNcXClcbiMgaGVpZ2h0ID0gMlxuIyB3aWR0aCA9IDMuNVxuIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
GO1 <- enrichGO(gene = gene.group1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO2 <- enrichGO(gene = gene.group2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO3 <- enrichGO(gene = gene.group3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO4 <- enrichGO(gene = gene.group4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO5 <- enrichGO(gene = gene.group5, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO6 <- enrichGO(gene = gene.group6, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO7 <- enrichGO(gene = gene.group7, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO8 <- enrichGO(gene = gene.group8, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO9 <- enrichGO(gene = gene.group9, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)

dotplot(GO1, showCategory = 10)

# 
# GO1.df <- as.data.frame(GO1)
# GO2.df <- as.data.frame(GO2)
# GO3.df <- as.data.frame(GO5)
# GO4.df <- as.data.frame(GO8)
# 
# subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \group1\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset2 <- GO2.df %>% dplyr::select(ID, Description,GeneRatio, p.adjust) %>% dplyr::mutate(group = \group2\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset3 <- GO3.df %>% dplyr::select(ID, Description,GeneRatio, p.adjust) %>% dplyr::mutate(group = \group3\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# 
# GOlist <- factor(c(\GO:0033002\, \GO:0070373\, \GO:0048730\, \GO:0031103\,
#                  \GO:0022613\, \GO:0050767\, \GO:0034470\, \GO:0016055\, 
#                  \GO:0006397\, \GO:0030900\, \GO:0008380\))
# 
# data <- bind_rows(bind_rows(subset1, subset2), subset3) %>%
#   dplyr::filter(ID %in% GOlist)
# 
# descOrder <- sort(unique(data$Description))[c(1, 2, 5, 7,
#                                  3, 4, 6, 8, 9, 10, 11)]
# 
# p <- ggplot(data, aes(x = group, y = factor(Description, level = descOrder), color = p.adjust, size = gr)) + 
#   geom_point() + theme_bw() +
#   scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
#   scale_size_continuous(range = c(0, 3)) +
#   labs(x = NULL, y = NULL) +
#   theme(axis.text = element_text(size = 6),  # Set axis text size
#         axis.title = element_text(size = 6), # Set axis title size (if not removed)
#         legend.text = element_text(size = 6), # Set legend text size
#         legend.title = element_text(size = 6)) 
# 
# fileName <- here(figDir, \..\, \GO\, \GO_groups\)
# height = 2
# width = 3.5
# svglite(paste0(fileName, \.svg\), height = height, width = width)
# print(p)
# dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVIwOHhJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bExtZHliM1Z3TVN3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjWEVWT1UwVk5Ra3hjWEN3Z2IyNTBJRDBnWEZ4Q1VGeGNLVnh1UjA4eUlEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsTG1keWIzVndNaXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0tWeHVSMDh6SUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxMbWR5YjNWd015d2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjS1Z4dVIwODBJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bExtZHliM1Z3TkN3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjWEVWT1UwVk5Ra3hjWEN3Z2IyNTBJRDBnWEZ4Q1VGeGNLVnh1UjA4MUlEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsTG1keWIzVndOU3dnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0tWeHVSMDgySUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxMbWR5YjNWd05pd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjS1Z4dVIwODNJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bExtZHliM1Z3Tnl3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjWEVWT1UwVk5Ra3hjWEN3Z2IyNTBJRDBnWEZ4Q1VGeGNLVnh1UjA4NElEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsTG1keWIzVndPQ3dnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0tWeHVSMDg1SUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxMbWR5YjNWd09Td2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjS1Z4dVhHNWtiM1J3Ykc5MEtFZFBNU3dnYzJodmQwTmhkR1ZuYjNKNUlEMGdNVEFwWEc1Y2JpTWdYRzRqSUVkUE1TNWtaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLRWRQTVNsY2JpTWdSMDh5TG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1IwOHlLVnh1SXlCSFR6TXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hIVHpVcFhHNGpJRWRQTkM1a1ppQThMU0JoY3k1a1lYUmhMbVp5WVcxbEtFZFBPQ2xjYmlNZ1hHNGpJSE4xWW5ObGRERWdQQzBnUjA4eExtUm1JQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLRWxFTENCRVpYTmpjbWx3ZEdsdmJpd2dSMlZ1WlZKaGRHbHZMQ0J3TG1Ga2FuVnpkQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JjWEdkeWIzVndNVnhjS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SXlBZ0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRqSUNBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY1hDOWNYRnh1SXlBZ0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWEZ3dlhGd3BLVnh1SXlBZ0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlNZ0lDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SXlBZ0lDQWdmU2xjYmlNZ0lDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmlNZ2MzVmljMlYwTWlBOExTQkhUekl1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TEVkbGJtVlNZWFJwYnl3Z2NDNWhaR3AxYzNRcElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHZHliM1Z3SUQwZ1hGeG5jbTkxY0RKY1hDa2dKVDRsWEc0aklDQWdaSEJzZVhJNk9tMTFkR0YwWlNoY2JpTWdJQ0FnSUdkeUlEMGdjMkZ3Y0d4NUtFZGxibVZTWVhScGJ5d2dablZ1WTNScGIyNG9lQ2tnZTF4dUl5QWdJQ0FnSUNBaklGTndiR2wwSUhSb1pTQnpkSEpwYm1jZ1lua2dYRnd2WEZ4Y2JpTWdJQ0FnSUNBZ2NHRnlkSE1nUEMwZ2RXNXNhWE4wS0hOMGNuTndiR2wwS0hnc0lGeGNMMXhjS1NsY2JpTWdJQ0FnSUNBZ0l5QkRiMjUyWlhKMElIUnZJRzUxYldWeWFXTWdZVzVrSUhCbGNtWnZjbTBnZEdobElHUnBkbWx6YVc5dVhHNGpJQ0FnSUNBZ0lHRnpMbTUxYldWeWFXTW9jR0Z5ZEhOYk1WMHBJQzhnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN5WFNsY2JpTWdJQ0FnSUgwcFhHNGpJQ0FnS1NBbFBpVWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pHVnpZeWhuY2lrcFhHNGpJSE4xWW5ObGRETWdQQzBnUjA4ekxtUm1JQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLRWxFTENCRVpYTmpjbWx3ZEdsdmJpeEhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRnhjWjNKdmRYQXpYRndwSUNVK0pWeHVJeUFnSUdSd2JIbHlPanB0ZFhSaGRHVW9YRzRqSUNBZ0lDQm5jaUE5SUhOaGNIQnNlU2hIWlc1bFVtRjBhVzhzSUdaMWJtTjBhVzl1S0hncElIdGNiaU1nSUNBZ0lDQWdJeUJUY0d4cGRDQjBhR1VnYzNSeWFXNW5JR0o1SUZ4Y0wxeGNYRzRqSUNBZ0lDQWdJSEJoY25SeklEd3RJSFZ1YkdsemRDaHpkSEp6Y0d4cGRDaDRMQ0JjWEM5Y1hDa3BYRzRqSUNBZ0lDQWdJQ01nUTI5dWRtVnlkQ0IwYnlCdWRXMWxjbWxqSUdGdVpDQndaWEptYjNKdElIUm9aU0JrYVhacGMybHZibHh1SXlBZ0lDQWdJQ0JoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekZkS1NBdklHRnpMbTUxYldWeWFXTW9jR0Z5ZEhOYk1sMHBYRzRqSUNBZ0lDQjlLVnh1SXlBZ0lDa2dKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JsYzJNb1ozSXBLVnh1SXlCY2JpTWdSMDlzYVhOMElEd3RJR1poWTNSdmNpaGpLRnhjUjA4Nk1EQXpNekF3TWx4Y0xDQmNYRWRQT2pBd056QXpOek5jWEN3Z1hGeEhUem93TURRNE56TXdYRndzSUZ4Y1IwODZNREF6TVRFd00xeGNMRnh1SXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y1IwODZNREF5TWpZeE0xeGNMQ0JjWEVkUE9qQXdOVEEzTmpkY1hDd2dYRnhIVHpvd01ETTBORGN3WEZ3c0lGeGNSMDg2TURBeE5qQTFOVnhjTENCY2JpTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRWRQT2pBd01EWXpPVGRjWEN3Z1hGeEhUem93TURNd09UQXdYRndzSUZ4Y1IwODZNREF3T0RNNE1GeGNLU2xjYmlNZ1hHNGpJR1JoZEdFZ1BDMGdZbWx1WkY5eWIzZHpLR0pwYm1SZmNtOTNjeWh6ZFdKelpYUXhMQ0J6ZFdKelpYUXlLU3dnYzNWaWMyVjBNeWtnSlQ0bFhHNGpJQ0FnWkhCc2VYSTZPbVpwYkhSbGNpaEpSQ0FsYVc0bElFZFBiR2x6ZENsY2JpTWdYRzRqSUdSbGMyTlBjbVJsY2lBOExTQnpiM0owS0hWdWFYRjFaU2hrWVhSaEpFUmxjMk55YVhCMGFXOXVLU2xiWXlneExDQXlMQ0ExTENBM0xGeHVJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXpMQ0EwTENBMkxDQTRMQ0E1TENBeE1Dd2dNVEVwWFZ4dUl5QmNiaU1nY0NBOExTQm5aM0JzYjNRb1pHRjBZU3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUdaaFkzUnZjaWhFWlhOamNtbHdkR2x2Yml3Z2JHVjJaV3dnUFNCa1pYTmpUM0prWlhJcExDQmpiMnh2Y2lBOUlIQXVZV1JxZFhOMExDQnphWHBsSUQwZ1ozSXBLU0FySUZ4dUl5QWdJR2RsYjIxZmNHOXBiblFvS1NBcklIUm9aVzFsWDJKM0tDa2dLMXh1SXlBZ0lITmpZV3hsWDJOdmJHOXlYMmR5WVdScFpXNTBLR3h2ZHlBOUlGeGNjbVZrWEZ3c0lHaHBaMmdnUFNCY1hHSnNkV1ZjWEN3Z2JHbHRhWFJ6SUQwZ1l5Z3dMQ0F3TGpBMUtTa2dLMXh1SXlBZ0lITmpZV3hsWDNOcGVtVmZZMjl1ZEdsdWRXOTFjeWh5WVc1blpTQTlJR01vTUN3Z015a3BJQ3RjYmlNZ0lDQnNZV0p6S0hnZ1BTQk9WVXhNTENCNUlEMGdUbFZNVENrZ0sxeHVJeUFnSUhSb1pXMWxLR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3NJQ0FqSUZObGRDQmhlR2x6SUhSbGVIUWdjMmw2WlZ4dUl5QWdJQ0FnSUNBZ0lHRjRhWE11ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb2MybDZaU0E5SURZcExDQWpJRk5sZENCaGVHbHpJSFJwZEd4bElITnBlbVVnS0dsbUlHNXZkQ0J5WlcxdmRtVmtLVnh1SXlBZ0lDQWdJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0hOcGVtVWdQU0EyS1N3Z0l5QlRaWFFnYkdWblpXNWtJSFJsZUhRZ2MybDZaVnh1SXlBZ0lDQWdJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTmlrcElGeHVJeUJjYmlNZ1ptbHNaVTVoYldVZ1BDMGdhR1Z5WlNobWFXZEVhWElzSUZ4Y0xpNWNYQ3dnWEZ4SFQxeGNMQ0JjWEVkUFgyZHliM1Z3YzF4Y0tWeHVJeUJvWldsbmFIUWdQU0F5WEc0aklIZHBaSFJvSUQwZ015NDFYRzRqSUhOMloyeHBkR1VvY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2tzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaU1nY0hKcGJuUW9jQ2xjYmlNZ1pHVjJMbTltWmlncFhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbkdPMSA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPMiA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPMyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPNCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPNSA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDUsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPNiA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDYsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPNyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDcsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPOCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDgsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPOSA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDksIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcblxuZG90cGxvdChHTzEsIHNob3dDYXRlZ29yeSA9IDEwKVxuXG4jIFxuIyBHTzEuZGYgPC0gYXMuZGF0YS5mcmFtZShHTzEpXG4jIEdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKEdPMilcbiMgR08zLmRmIDwtIGFzLmRhdGEuZnJhbWUoR081KVxuIyBHTzQuZGYgPC0gYXMuZGF0YS5mcmFtZShHTzgpXG4jIFxuIyBzdWJzZXQxIDwtIEdPMS5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxncm91cDFcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbixHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcZ3JvdXAyXFwpICU+JVxuIyAgIGRwbHlyOjptdXRhdGUoXG4jICAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHtcbiMgICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4jICAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4jICAgICAgICMgQ29udmVydCB0byBudW1lcmljIGFuZCBwZXJmb3JtIHRoZSBkaXZpc2lvblxuIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4jICAgICB9KVxuIyAgICkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZ3IpKVxuIyBzdWJzZXQzIDwtIEdPMy5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXGdyb3VwM1xcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgXG4jIEdPbGlzdCA8LSBmYWN0b3IoYyhcXEdPOjAwMzMwMDJcXCwgXFxHTzowMDcwMzczXFwsIFxcR086MDA0ODczMFxcLCBcXEdPOjAwMzExMDNcXCxcbiMgICAgICAgICAgICAgICAgICBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDUwNzY3XFwsIFxcR086MDAzNDQ3MFxcLCBcXEdPOjAwMTYwNTVcXCwgXG4jICAgICAgICAgICAgICAgICAgXFxHTzowMDA2Mzk3XFwsIFxcR086MDAzMDkwMFxcLCBcXEdPOjAwMDgzODBcXCkpXG4jIFxuIyBkYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3Moc3Vic2V0MSwgc3Vic2V0MiksIHN1YnNldDMpICU+JVxuIyAgIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpXG4jIFxuIyBkZXNjT3JkZXIgPC0gc29ydCh1bmlxdWUoZGF0YSREZXNjcmlwdGlvbikpW2MoMSwgMiwgNSwgNyxcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgNCwgNiwgOCwgOSwgMTAsIDExKV1cbiMgXG4jIHAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBmYWN0b3IoRGVzY3JpcHRpb24sIGxldmVsID0gZGVzY09yZGVyKSwgY29sb3IgPSBwLmFkanVzdCwgc2l6ZSA9IGdyKSkgKyBcbiMgICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICtcbiMgICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibHVlXFwsIGxpbWl0cyA9IGMoMCwgMC4wNSkpICtcbiMgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAsIDMpKSArXG4jICAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiMgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZClcbiMgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemVcbiMgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcbiMgXG4jIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXC4uXFwsIFxcR09cXCwgXFxHT19ncm91cHNcXClcbiMgaGVpZ2h0ID0gMlxuIyB3aWR0aCA9IDMuNVxuIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuR08xIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwMSwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR08yIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR08zIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwMywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR080IDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwNCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR081IDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwNSwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR082IDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwNiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR083IDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwNywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR084IDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwOCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR085IDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwOSwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuXG5kb3RwbG90KEdPMSwgc2hvd0NhdGVnb3J5ID0gMTApXG5cbiMgXG4jIEdPMS5kZiA8LSBhcy5kYXRhLmZyYW1lKEdPMSlcbiMgR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoR08yKVxuIyBHTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShHTzUpXG4jIEdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKEdPOClcbiMgXG4jIHN1YnNldDEgPC0gR08xLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXGdyb3VwMVxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxncm91cDJcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDMgPC0gR08zLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbixHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcZ3JvdXAzXFwpICU+JVxuIyAgIGRwbHlyOjptdXRhdGUoXG4jICAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHtcbiMgICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4jICAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4jICAgICAgICMgQ29udmVydCB0byBudW1lcmljIGFuZCBwZXJmb3JtIHRoZSBkaXZpc2lvblxuIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4jICAgICB9KVxuIyAgICkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZ3IpKVxuIyBcbiMgR09saXN0IDwtIGZhY3RvcihjKFxcR086MDAzMzAwMlxcLCBcXEdPOjAwNzAzNzNcXCwgXFxHTzowMDQ4NzMwXFwsIFxcR086MDAzMTEwM1xcLFxuIyAgICAgICAgICAgICAgICAgIFxcR086MDAyMjYxM1xcLCBcXEdPOjAwNTA3NjdcXCwgXFxHTzowMDM0NDcwXFwsIFxcR086MDAxNjA1NVxcLCBcbiMgICAgICAgICAgICAgICAgICBcXEdPOjAwMDYzOTdcXCwgXFxHTzowMDMwOTAwXFwsIFxcR086MDAwODM4MFxcKSlcbiMgXG4jIGRhdGEgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQxLCBzdWJzZXQyKSwgc3Vic2V0MykgJT4lXG4jICAgZHBseXI6OmZpbHRlcihJRCAlaW4lIEdPbGlzdClcbiMgXG4jIGRlc2NPcmRlciA8LSBzb3J0KHVuaXF1ZShkYXRhJERlc2NyaXB0aW9uKSlbYygxLCAyLCA1LCA3LFxuIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCA0LCA2LCA4LCA5LCAxMCwgMTEpXVxuIyBcbiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGZhY3RvcihEZXNjcmlwdGlvbiwgbGV2ZWwgPSBkZXNjT3JkZXIpLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIFxuIyAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgK1xuIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsdWVcXCwgbGltaXRzID0gYygwLCAwLjA1KSkgK1xuIyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICtcbiMgICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuIyAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuIyAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuIyAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuIyBcbiMgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc1xcKVxuIyBoZWlnaHQgPSAyXG4jIHdpZHRoID0gMy41XG4jIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
GO1 <- enrichGO(gene = gene.group1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO2 <- enrichGO(gene = gene.group2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO3 <- enrichGO(gene = gene.group3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO4 <- enrichGO(gene = gene.group4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO5 <- enrichGO(gene = gene.group5, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO6 <- enrichGO(gene = gene.group6, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO7 <- enrichGO(gene = gene.group7, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO8 <- enrichGO(gene = gene.group8, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO9 <- enrichGO(gene = gene.group9, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)

dotplot(GO1, showCategory = 10)

# 
# GO1.df <- as.data.frame(GO1)
# GO2.df <- as.data.frame(GO2)
# GO3.df <- as.data.frame(GO5)
# GO4.df <- as.data.frame(GO8)
# 
# subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \group1\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset2 <- GO2.df %>% dplyr::select(ID, Description,GeneRatio, p.adjust) %>% dplyr::mutate(group = \group2\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset3 <- GO3.df %>% dplyr::select(ID, Description,GeneRatio, p.adjust) %>% dplyr::mutate(group = \group3\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# 
# GOlist <- factor(c(\GO:0033002\, \GO:0070373\, \GO:0048730\, \GO:0031103\,
#                  \GO:0022613\, \GO:0050767\, \GO:0034470\, \GO:0016055\, 
#                  \GO:0006397\, \GO:0030900\, \GO:0008380\))
# 
# data <- bind_rows(bind_rows(subset1, subset2), subset3) %>%
#   dplyr::filter(ID %in% GOlist)
# 
# descOrder <- sort(unique(data$Description))[c(1, 2, 5, 7,
#                                  3, 4, 6, 8, 9, 10, 11)]
# 
# p <- ggplot(data, aes(x = group, y = factor(Description, level = descOrder), color = p.adjust, size = gr)) + 
#   geom_point() + theme_bw() +
#   scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
#   scale_size_continuous(range = c(0, 3)) +
#   labs(x = NULL, y = NULL) +
#   theme(axis.text = element_text(size = 6),  # Set axis text size
#         axis.title = element_text(size = 6), # Set axis title size (if not removed)
#         legend.text = element_text(size = 6), # Set legend text size
#         legend.title = element_text(size = 6)) 
# 
# fileName <- here(figDir, \..\, \GO\, \GO_groups\)
# height = 2
# width = 3.5
# svglite(paste0(fileName, \.svg\), height = height, width = width)
# print(p)
# dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### A485
##### - Splitting genes to groups

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJEYUdWamEybHVaeUJoZG1WeVlXZGxJR1JwYzNSaGJtTmxJRzltSUd4dmIzQnpJSEJsY2lCblpXNWxYRzRqSUhSbGJYQWdhWE1nWVNCMGFXSmliR1VnZDJobGNtVWdaR1ZzZEdFZ2JHOXZjQ0JoYm1RZ2JHOW5NbVpqSUdGeVpTQnRaWEpuWldSY2JuUmxiWEFrWjNKdmRYQWdQQzBnWm1GamRHOXlLSFJsYlhBa1ozSnZkWEFwWEc1Y2JseHVJeUJjYmlNZ1oyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRqSUNBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOVozSnZkWEF4S1NBcEpHMWxZVzVmWkdsemRHRnVZMlZjYmlNZ0lDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMW5jbTkxY0RJcElDa2tiV1ZoYmw5a2FYTjBZVzVqWlZ4dUl5QWdJSGRwYkNBOExTQjNhV3hqYjNndWRHVnpkQ2hrYVhOMFlXNWpaVEVzSUdScGMzUmhibU5sTWlsY2JpTWdJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc0aklIMWNiaU1nWEc0aklIQjJNVElnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TENBeExDQXlLU3dnTlNsY2JpTWdjSFl4TlNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lERXNJRFVwTENBMUtWeHVJeUJ3ZGpFNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dNU3dnT0Nrc0lEVXBYRzRqSUhCMk1qVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0F5TENBMUtTd2dOU2xjYmlNZ2NIWXlPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSURJc0lEZ3BMQ0ExS1Z4dUl5QndkalU0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z05Td2dPQ2tzSURVcFhHNWNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUcxbFlXNWZaR2x6ZEdGdVkyVXBLU0FySUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdaM0p2ZFhBcExDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FyWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJSE5qWVd4bFgzbGZZMjl1ZEdsdWRXOTFjeWhzWVdKbGJITWdQU0JzWVdKbGJGOXJZbDl0WWlrZ0sxeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMQ0JuWlc5dElEMGdYQ0p3YjJsdWRGd2lMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ3aWNtVmtYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpS1Z4dUlDQWpJR0Z1Ym05MFlYUmxLRndpZEdWNGRGd2lMQ0I0SUQwZ01Td2dlU0E5SURFd01EQXdNREFzSUd4aFltVnNJRDBnY0dGemRHVXdLRndpY0hZeE1qb2dYQ0lzSUhCMk1USXNJRndpWEZ4dVhDSXNYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNIWXhOVG9nWENJc0lIQjJNVFVzSUZ3aVhGeHVYQ0lzWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSFl4T0RvZ1hDSXNJSEIyTVRnc0lGd2lYRnh1WENJc1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hZeU5Ub2dYQ0lzSUhCMk1qVXNJRndpWEZ4dVhDSXNYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNIWXlPRG9nWENJc0lIQjJNamdzSUZ3aVhGeHVYQ0lzWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSFkxT0RvZ1hDSXNJSEIyTlRnc0lGd2lYRnh1WENJcExDQmNiaUFnSXlBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ015bGNiaUFnSXlCY2JpQWdYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKemFYcGxYMkpoY25Cc2IzUmZaR2xtWmtkeWIzVndYMEUwT0RWZmRuTmZSRTFUVDF3aUtWeHVhR1ZwWjJoMElEd3RJRE5jYm5kcFpIUm9JRHd0SURSY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiMgQ2hlY2tpbmcgYXZlcmFnZSBkaXN0YW5jZSBvZiBsb29wcyBwZXIgZ2VuZVxuIyB0ZW1wIGlzIGEgdGliYmxlIHdoZXJlIGRlbHRhIGxvb3AgYW5kIGxvZzJmYyBhcmUgbWVyZ2VkXG50ZW1wJGdyb3VwIDwtIGZhY3Rvcih0ZW1wJGdyb3VwKVxuXG5cbiMgXG4jIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuIyAgIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRtZWFuX2Rpc3RhbmNlXG4jICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJG1lYW5fZGlzdGFuY2VcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG4jIFxuIyBwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMSwgMiksIDUpXG4jIHB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAxLCA1KSwgNSlcbiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIDEsIDgpLCA1KVxuIyBwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMiwgNSksIDUpXG4jIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAyLCA4KSwgNSlcbiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIDUsIDgpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBtZWFuX2Rpc3RhbmNlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAxMDAwMDAwLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTg6IFxcLCBwdjE4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NTg6IFxcLCBwdjU4LCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gICMgXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2l6ZV9iYXJwbG90X2RpZmZHcm91cF9BNDg1X3ZzX0RNU09cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSA0XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# Checking average distance of loops per gene
# temp is a tibble where delta loop and log2fc are merged
temp$group <- factor(temp$group)


# 
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(group ==group1) )$mean_distance
#   distance2 <- (data %>% dplyr::filter(group ==group2) )$mean_distance
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
# pv12 <- round(getPvalWilcox(temp, 1, 2), 5)
# pv15 <- round(getPvalWilcox(temp, 1, 5), 5)
# pv18 <- round(getPvalWilcox(temp, 1, 8), 5)
# pv25 <- round(getPvalWilcox(temp, 2, 5), 5)
# pv28 <- round(getPvalWilcox(temp, 2, 8), 5)
# pv58 <- round(getPvalWilcox(temp, 5, 8), 5)


p <- ggplot(temp, aes(x = group, y = mean_distance)) + geom_violin(aes(fill = group), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + scale_y_continuous(labels = label_kb_mb) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)
  # annotate(\text\, x = 1, y = 1000000, label = paste0(\pv12: \, pv12, \\n\,
  #                                                     \pv15: \, pv15, \\n\,
  #                                                     \pv18: \, pv18, \\n\,
  #                                                     \pv25: \, pv25, \\n\,
  #                                                     \pv28: \, pv28, \\n\,
  #                                                     \pv58: \, pv58, \\n\), 
  #          color = \black\, hjust = 0, size = 3)
  # 
  
fileName <- paste0(\size_barplot_diffGroup_A485_vs_DMSO\)
height <- 3
width <- 4
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkRhR1ZqYTJsdVp5QmhkbVZ5WVdkbElHUnBjM1JoYm1ObElHOW1JR3h2YjNCeklIQmxjaUJuWlc1bFhHNGpJSFJsYlhBZ2FYTWdZU0IwYVdKaWJHVWdkMmhsY21VZ1pHVnNkR0VnYkc5dmNDQmhibVFnYkc5bk1tWmpJR0Z5WlNCdFpYSm5aV1JjYm5SbGJYQWtaM0p2ZFhBZ1BDMGdabUZqZEc5eUtIUmxiWEFrWjNKdmRYQXBYRzVjYmx4dUl5QmNiaU1nWjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGpJQ0FnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXhLU0FwSkcxbFlXNWZaR2x6ZEdGdVkyVmNiaU1nSUNCa2FYTjBZVzVqWlRJZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQxbmNtOTFjRElwSUNra2JXVmhibDlrYVhOMFlXNWpaVnh1SXlBZ0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlNZ0lDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzRqSUgxY2JpTWdYRzRqSUhCMk1USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0F4TENBeUtTd2dOU2xjYmlNZ2NIWXhOU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSURFc0lEVXBMQ0ExS1Z4dUl5QndkakU0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z01Td2dPQ2tzSURVcFhHNGpJSEIyTWpVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQXlMQ0ExS1N3Z05TbGNiaU1nY0hZeU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRElzSURncExDQTFLVnh1SXlCd2RqVTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnTlN3Z09Da3NJRFVwWEc1Y2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJRzFsWVc1ZlpHbHpkR0Z1WTJVcEtTQXJJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ1ozSnZkWEFwTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklITmpZV3hsWDNsZlkyOXVkR2x1ZFc5MWN5aHNZV0psYkhNZ1BTQnNZV0psYkY5cllsOXRZaWtnSzF4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hGeHdiMmx1ZEZ4Y0xDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRnhjY21Wa1hGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNLVnh1SUNBaklHRnVibTkwWVhSbEtGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTVN3Z2VTQTlJREV3TURBd01EQXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGeGNjSFl4TWpvZ1hGd3NJSEIyTVRJc0lGeGNYRnh1WEZ3c1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hZeE5Ub2dYRndzSUhCMk1UVXNJRnhjWEZ4dVhGd3NYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NIWXhPRG9nWEZ3c0lIQjJNVGdzSUZ4Y1hGeHVYRndzWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSFl5TlRvZ1hGd3NJSEIyTWpVc0lGeGNYRnh1WEZ3c1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hZeU9Eb2dYRndzSUhCMk1qZ3NJRnhjWEZ4dVhGd3NYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NIWTFPRG9nWEZ3c0lIQjJOVGdzSUZ4Y1hGeHVYRndwTENCY2JpQWdJeUFnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTXlsY2JpQWdJeUJjYmlBZ1hHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnh6YVhwbFgySmhjbkJzYjNSZlpHbG1aa2R5YjNWd1gwRTBPRFZmZG5OZlJFMVRUMXhjS1Z4dWFHVnBaMmgwSUR3dElETmNibmRwWkhSb0lEd3RJRFJjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG4jIENoZWNraW5nIGF2ZXJhZ2UgZGlzdGFuY2Ugb2YgbG9vcHMgcGVyIGdlbmVcbiMgdGVtcCBpcyBhIHRpYmJsZSB3aGVyZSBkZWx0YSBsb29wIGFuZCBsb2cyZmMgYXJlIG1lcmdlZFxudGVtcCRncm91cCA8LSBmYWN0b3IodGVtcCRncm91cClcblxuXG4jIFxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkbWVhbl9kaXN0YW5jZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRtZWFuX2Rpc3RhbmNlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcbiMgcHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIDEsIDIpLCA1KVxuIyBwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMSwgNSksIDUpXG4jIHB2MTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAxLCA4KSwgNSlcbiMgcHYyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIDIsIDUpLCA1KVxuIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMiwgOCksIDUpXG4jIHB2NTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCA1LCA4KSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gbWVhbl9kaXN0YW5jZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMTAwMDAwMCwgbGFiZWwgPSBwYXN0ZTAoXFxwdjEyOiBcXCwgcHYxMiwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE4OiBcXCwgcHYxOCwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI1OiBcXCwgcHYyNSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjU4OiBcXCwgcHY1OCwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICAjIFxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXHNpemVfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gNFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBDaGVja2luZyBhdmVyYWdlIGRpc3RhbmNlIG9mIGxvb3BzIHBlciBnZW5lXG4jIHRlbXAgaXMgYSB0aWJibGUgd2hlcmUgZGVsdGEgbG9vcCBhbmQgbG9nMmZjIGFyZSBtZXJnZWRcbnRlbXAkZ3JvdXAgPC0gZmFjdG9yKHRlbXAkZ3JvdXApXG5cblxuIyBcbiMgZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4jICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJG1lYW5fZGlzdGFuY2VcbiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkbWVhbl9kaXN0YW5jZVxuIyAgIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiMgICByZXR1cm4od2lsJHAudmFsdWUpXG4jIH1cbiMgXG4jIHB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAxLCAyKSwgNSlcbiMgcHYxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIDEsIDUpLCA1KVxuIyBwdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMSwgOCksIDUpXG4jIHB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAyLCA1KSwgNSlcbiMgcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIDIsIDgpLCA1KVxuIyBwdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgNSwgOCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IG1lYW5fZGlzdGFuY2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDEwMDAwMDAsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIHB2MTIsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxNTogXFwsIHB2MTUsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNTogXFwsIHB2MjUsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyODogXFwsIHB2MjgsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgIyBcbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxzaXplX2JhcnBsb3RfZGlmZkdyb3VwX0E0ODVfdnNfRE1TT1xcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDRcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
# Checking average distance of loops per gene
# temp is a tibble where delta loop and log2fc are merged
temp$group <- factor(temp$group)


# 
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(group ==group1) )$mean_distance
#   distance2 <- (data %>% dplyr::filter(group ==group2) )$mean_distance
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
# pv12 <- round(getPvalWilcox(temp, 1, 2), 5)
# pv15 <- round(getPvalWilcox(temp, 1, 5), 5)
# pv18 <- round(getPvalWilcox(temp, 1, 8), 5)
# pv25 <- round(getPvalWilcox(temp, 2, 5), 5)
# pv28 <- round(getPvalWilcox(temp, 2, 8), 5)
# pv58 <- round(getPvalWilcox(temp, 5, 8), 5)


p <- ggplot(temp, aes(x = group, y = mean_distance)) + geom_violin(aes(fill = group), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + scale_y_continuous(labels = label_kb_mb) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)
  # annotate(\text\, x = 1, y = 1000000, label = paste0(\pv12: \, pv12, \\n\,
  #                                                     \pv15: \, pv15, \\n\,
  #                                                     \pv18: \, pv18, \\n\,
  #                                                     \pv25: \, pv25, \\n\,
  #                                                     \pv28: \, pv28, \\n\,
  #                                                     \pv58: \, pv58, \\n\), 
  #          color = \black\, hjust = 0, size = 3)
  # 
  
fileName <- paste0(\size_barplot_diffGroup_A485_vs_DMSO\)
height <- 3
width <- 4
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### - GO for each group


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJEYjNWdWRHbHVaeUJ1ZFcxaVpYSWdiMllnYkc5dmNDQndaWElnWjJWdVpYTmNiblJsYlhCVGRXMGdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIQmxZV3RKUkN3Z1oyVnVaU3dnUVc1dWJ6SXBJQ1UrSlNCMWJtNWxjM1FvWjJWdVpTa2dKVDRsSUdkeWIzVndYMko1S0dkbGJtVXBJQ1UrSlNBZ2MzVnRiV0Z5YVhwbEtGeHVJQ0FnSUhCbFlXc2dQU0JzYVhOMEtIQmxZV3RKUkNrc1hHNGdJQ0FnWVc1dWJ6SWdQU0JzYVhOMEtFRnVibTh5S1N4Y2JpQWdJQ0JqYjNWdWRDQTlJRzRvS1NsY2JseHVkR1Z0Y0ZOMWJTQThMU0IwWlcxd1UzVnRJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNCbmNtOTFjQ0E5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0RFc0lGd2laM0p2ZFhBeFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjRElzSUZ3aVozSnZkWEF5WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVXVaM0p2ZFhBekxDQmNJbWR5YjNWd00xd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNEUXNJRndpWjNKdmRYQTBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNEVXNJRndpWjNKdmRYQTFYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVXVaM0p2ZFhBMkxDQmNJbWR5YjNWd05sd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjRGNzSUZ3aVozSnZkWEEzWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0Rnc0lGd2laM0p2ZFhBNFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVXVaM0p2ZFhBNUxDQmNJbWR5YjNWd09Wd2lMQ0JPUVNrcEtTa3BLU2twS1Z4dUtTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpZ2hhWE11Ym1Fb1ozSnZkWEFwS1Z4dVhHNGpJRnh1SXlCblpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaU1nSUNCa2FYTjBZVzVqWlRFZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQxbmNtOTFjREVwSUNra1kyOTFiblJjYmlNZ0lDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMW5jbTkxY0RJcElDa2tZMjkxYm5SY2JpTWdJQ0IzYVd3Z1BDMGdkMmxzWTI5NExuUmxjM1FvWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcFhHNGpJQ0FnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dUl5QjlYRzRqSUZ4dUl5QmNiaU1nY0hZeE1pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlRkVzBzWENKbmNtOTFjREZjSWl3Z1hDSm5jbTkxY0RKY0lpa3NJRFVwWEc0aklIQjJNVFVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VTNWdExGd2laM0p2ZFhBeFhDSXNJRndpWjNKdmRYQTFYQ0lwTENBMUtWeHVJeUJ3ZGpFNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGTjFiU3hjSW1keWIzVndNVndpTENCY0ltZHliM1Z3T0Z3aUtTd2dOU2xjYmlNZ2NIWXlOU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJUZFcwc1hDSm5jbTkxY0RKY0lpd2dYQ0puY205MWNEVmNJaWtzSURVcFhHNGpJSEIyTWpnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1UzVnRMRndpWjNKdmRYQXlYQ0lzSUZ3aVozSnZkWEE0WENJcExDQTFLVnh1SXlCd2RqVTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRk4xYlN4Y0ltZHliM1Z3TlZ3aUxDQmNJbWR5YjNWd09Gd2lLU3dnTlNsY2JseHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdVM1Z0TENCaFpYTW9lQ0E5SUdkeWIzVndMQ0I1SUQwZ1kyOTFiblFzSUdacGJHd2dQU0JuY205MWNDa3BJQ3NnWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TlN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJQ0FnSUNBZ0lGeHVJQ0J6WTJGc1pWOTVYMk52Ym5ScGJuVnZkWE1vWW5KbFlXdHpJRDBnYzJWeEtEQXNJREV3TENCaWVTQTlJRElwS1NBcklGeHVJQ0JqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9NQ3dnTVRBcEtTQXJYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0JuY205MWNDa3NJR1oxYmlBOUlHMWxZVzRzSUdkbGIyMGdQU0JjSW5CdmFXNTBYQ0lzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBeUxDQm1hV3hzSUQwZ1hDSnlaV1JjSWl3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJcElDdGNiaUFnZEdobGJXVW9iR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdYQ0p1YjI1bFhDSXBYRzRnSUNNZ1lXNXViM1JoZEdVb1hDSjBaWGgwWENJc0lIZ2dQU0F4TENCNUlEMGdNeXdnYkdGaVpXd2dQU0J3WVhOMFpUQW9YQ0p3ZGpFeU9pQmNJaXdnY0hZeE1pd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkakUxT2lCY0lpd2djSFl4TlN3Z1hDSmNYRzVjSWl4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2RqRTRPaUJjSWl3Z2NIWXhPQ3dnWENKY1hHNWNJaXhjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3ZGpJMU9pQmNJaXdnY0hZeU5Td2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkakk0T2lCY0lpd2djSFl5T0N3Z1hDSmNYRzVjSWl4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2RqVTRPaUJjSWl3Z2NIWTFPQ3dnWENKY1hHNWNJaWtzSUZ4dUlDQWpJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F4S1NBcklDQmNibHh1WEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSmpiM1Z1ZEY5aVlYSndiRzkwWDJScFptWkhjbTkxY0Y5Qk5EZzFYM1p6WDBSTlUwOWNJaWxjYm1obGFXZG9kQ0E4TFNBelhHNTNhV1IwYUNBOExTQTBYRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuIyBDb3VudGluZyBudW1iZXIgb2YgbG9vcCBwZXIgZ2VuZXNcbnRlbXBTdW0gPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KHBlYWtJRCwgZ2VuZSwgQW5ubzIpICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSAgc3VtbWFyaXplKFxuICAgIHBlYWsgPSBsaXN0KHBlYWtJRCksXG4gICAgYW5ubzIgPSBsaXN0KEFubm8yKSxcbiAgICBjb3VudCA9IG4oKSlcblxudGVtcFN1bSA8LSB0ZW1wU3VtICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAzLCBcXGdyb3VwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDQsIFxcZ3JvdXA0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA2LCBcXGdyb3VwNlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDcsIFxcZ3JvdXA3XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDgsIFxcZ3JvdXA4XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA5LCBcXGdyb3VwOVxcLCBOQSkpKSkpKSkpKVxuKSAlPiUgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG4jIFxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkY291bnRcbiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkY291bnRcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG4jIFxuIyBcbiMgcHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4jIHB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHYyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4jIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxuIyBwdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wU3VtLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIFxuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwLCBieSA9IDIpKSArIFxuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTApKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMywgbGFiZWwgPSBwYXN0ZTAoXFxwdjEyOiBcXCwgcHYxMiwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE4OiBcXCwgcHYxOCwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI1OiBcXCwgcHYyNSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjU4OiBcXCwgcHY1OCwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxKSArICBcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9BNDg1X3ZzX0RNU09cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSA0XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# Counting number of loop per genes
tempSum <- geneAnnoData %>% dplyr::select(peakID, gene, Anno2) %>% unnest(gene) %>% group_by(gene) %>%  summarize(
    peak = list(peakID),
    anno2 = list(Anno2),
    count = n())

tempSum <- tempSum %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\,
                        ifelse(gene %in% gene.group3, \group3\,
                               ifelse(gene %in% gene.group4, \group4\,
                                      ifelse(gene %in% gene.group5, \group5\,
                                             ifelse(gene %in% gene.group6, \group6\,
                                                    ifelse(gene %in% gene.group7, \group7\,
                                                           ifelse(gene %in% gene.group8, \group8\,
                                                                  ifelse(gene %in% gene.group9, \group9\, NA)))))))))
) %>% dplyr::filter(!is.na(group))

# 
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(group ==group1) )$count
#   distance2 <- (data %>% dplyr::filter(group ==group2) )$count
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
# 
# pv12 <- round(getPvalWilcox(tempSum,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(tempSum,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(tempSum,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(tempSum,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(tempSum,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(tempSum,\group5\, \group8\), 5)


p <- ggplot(tempSum, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 10, by = 2)) + 
  coord_cartesian(ylim = c(0, 10)) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  theme(legend.position = \none\)
  # annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
  #                                               \pv15: \, pv15, \\n\,
  #                                               \pv18: \, pv18, \\n\,
  #                                               \pv25: \, pv25, \\n\,
  #                                               \pv28: \, pv28, \\n\,
  #                                               \pv58: \, pv58, \\n\), 
  #          color = \black\, hjust = 0, size = 1) +  


fileName <- paste0(\count_barplot_diffGroup_A485_vs_DMSO\)
height <- 3
width <- 4
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkRiM1Z1ZEdsdVp5QnVkVzFpWlhJZ2IyWWdiRzl2Y0NCd1pYSWdaMlZ1WlhOY2JuUmxiWEJUZFcwZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hCbFlXdEpSQ3dnWjJWdVpTd2dRVzV1YnpJcElDVStKU0IxYm01bGMzUW9aMlZ1WlNrZ0pUNGxJR2R5YjNWd1gySjVLR2RsYm1VcElDVStKU0FnYzNWdGJXRnlhWHBsS0Z4dUlDQWdJSEJsWVdzZ1BTQnNhWE4wS0hCbFlXdEpSQ2tzWEc0Z0lDQWdZVzV1YnpJZ1BTQnNhWE4wS0VGdWJtOHlLU3hjYmlBZ0lDQmpiM1Z1ZENBOUlHNG9LU2xjYmx4dWRHVnRjRk4xYlNBOExTQjBaVzF3VTNWdElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0JuY205MWNDQTlJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjREVzSUZ4Y1ozSnZkWEF4WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNESXNJRnhjWjNKdmRYQXlYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEF6TENCY1hHZHliM1Z3TTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0RRc0lGeGNaM0p2ZFhBMFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0RVc0lGeGNaM0p2ZFhBMVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEEyTENCY1hHZHliM1Z3Tmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNEY3NJRnhjWjNKdmRYQTNYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjRGdzSUZ4Y1ozSnZkWEE0WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEE1TENCY1hHZHliM1Z3T1Z4Y0xDQk9RU2twS1NrcEtTa3BLVnh1S1NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lnaGFYTXVibUVvWjNKdmRYQXBLVnh1WEc0aklGeHVJeUJuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpTWdJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDFuY205MWNERXBJQ2trWTI5MWJuUmNiaU1nSUNCa2FYTjBZVzVqWlRJZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQxbmNtOTFjRElwSUNra1kyOTFiblJjYmlNZ0lDQjNhV3dnUEMwZ2QybHNZMjk0TG5SbGMzUW9aR2x6ZEdGdVkyVXhMQ0JrYVhOMFlXNWpaVElwWEc0aklDQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1SXlCOVhHNGpJRnh1SXlCY2JpTWdjSFl4TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVGRXMHNYRnhuY205MWNERmNYQ3dnWEZ4bmNtOTFjREpjWENrc0lEVXBYRzRqSUhCMk1UVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdVM1Z0TEZ4Y1ozSnZkWEF4WEZ3c0lGeGNaM0p2ZFhBMVhGd3BMQ0ExS1Z4dUl5QndkakU0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZOMWJTeGNYR2R5YjNWd01WeGNMQ0JjWEdkeWIzVndPRnhjS1N3Z05TbGNiaU1nY0hZeU5TQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlRkVzBzWEZ4bmNtOTFjREpjWEN3Z1hGeG5jbTkxY0RWY1hDa3NJRFVwWEc0aklIQjJNamdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VTNWdExGeGNaM0p2ZFhBeVhGd3NJRnhjWjNKdmRYQTRYRndwTENBMUtWeHVJeUJ3ZGpVNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGTjFiU3hjWEdkeWIzVndOVnhjTENCY1hHZHliM1Z3T0Z4Y0tTd2dOU2xjYmx4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd1UzVnRMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnWTI5MWJuUXNJR1pwYkd3Z1BTQm5jbTkxY0NrcElDc2dYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVOU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklDQWdJQ0FnSUZ4dUlDQnpZMkZzWlY5NVgyTnZiblJwYm5WdmRYTW9ZbkpsWVd0eklEMGdjMlZ4S0RBc0lERXdMQ0JpZVNBOUlESXBLU0FySUZ4dUlDQmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb01Dd2dNVEFwS1NBclhHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNYSEJ2YVc1MFhGd3NJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWEZ4eVpXUmNYQ3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndwSUN0Y2JpQWdkR2hsYldVb2JHVm5aVzVrTG5CdmMybDBhVzl1SUQwZ1hGeHViMjVsWEZ3cFhHNGdJQ01nWVc1dWIzUmhkR1VvWEZ4MFpYaDBYRndzSUhnZ1BTQXhMQ0I1SUQwZ015d2diR0ZpWld3Z1BTQndZWE4wWlRBb1hGeHdkakV5T2lCY1hDd2djSFl4TWl3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqRTFPaUJjWEN3Z2NIWXhOU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3ZGpFNE9pQmNYQ3dnY0hZeE9Dd2dYRnhjWEc1Y1hDeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdkakkxT2lCY1hDd2djSFl5TlN3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqSTRPaUJjWEN3Z2NIWXlPQ3dnWEZ4Y1hHNWNYQ3hjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3ZGpVNE9pQmNYQ3dnY0hZMU9Dd2dYRnhjWEc1Y1hDa3NJRnh1SUNBaklDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXhLU0FySUNCY2JseHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4amIzVnVkRjlpWVhKd2JHOTBYMlJwWm1aSGNtOTFjRjlCTkRnMVgzWnpYMFJOVTA5Y1hDbGNibWhsYVdkb2RDQThMU0F6WEc1M2FXUjBhQ0E4TFNBMFhHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuIyBDb3VudGluZyBudW1iZXIgb2YgbG9vcCBwZXIgZ2VuZXNcbnRlbXBTdW0gPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KHBlYWtJRCwgZ2VuZSwgQW5ubzIpICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSAgc3VtbWFyaXplKFxuICAgIHBlYWsgPSBsaXN0KHBlYWtJRCksXG4gICAgYW5ubzIgPSBsaXN0KEFubm8yKSxcbiAgICBjb3VudCA9IG4oKSlcblxudGVtcFN1bSA8LSB0ZW1wU3VtICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAzLCBcXGdyb3VwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDQsIFxcZ3JvdXA0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA2LCBcXGdyb3VwNlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDcsIFxcZ3JvdXA3XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDgsIFxcZ3JvdXA4XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA5LCBcXGdyb3VwOVxcLCBOQSkpKSkpKSkpKVxuKSAlPiUgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG4jIFxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkY291bnRcbiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkY291bnRcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG4jIFxuIyBcbiMgcHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4jIHB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHYyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4jIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxuIyBwdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wU3VtLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIFxuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwLCBieSA9IDIpKSArIFxuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTApKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMywgbGFiZWwgPSBwYXN0ZTAoXFxwdjEyOiBcXCwgcHYxMiwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE4OiBcXCwgcHYxOCwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI1OiBcXCwgcHYyNSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjU4OiBcXCwgcHY1OCwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxKSArICBcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9BNDg1X3ZzX0RNU09cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSA0XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBDb3VudGluZyBudW1iZXIgb2YgbG9vcCBwZXIgZ2VuZXNcbnRlbXBTdW0gPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KHBlYWtJRCwgZ2VuZSwgQW5ubzIpICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSAgc3VtbWFyaXplKFxuICAgIHBlYWsgPSBsaXN0KHBlYWtJRCksXG4gICAgYW5ubzIgPSBsaXN0KEFubm8yKSxcbiAgICBjb3VudCA9IG4oKSlcblxudGVtcFN1bSA8LSB0ZW1wU3VtICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAzLCBcXGdyb3VwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDQsIFxcZ3JvdXA0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA2LCBcXGdyb3VwNlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDcsIFxcZ3JvdXA3XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDgsIFxcZ3JvdXA4XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA5LCBcXGdyb3VwOVxcLCBOQSkpKSkpKSkpKVxuKSAlPiUgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG4jIFxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkY291bnRcbiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkY291bnRcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG4jIFxuIyBcbiMgcHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4jIHB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHYyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4jIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxuIyBwdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wU3VtLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIFxuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwLCBieSA9IDIpKSArIFxuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTApKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMywgbGFiZWwgPSBwYXN0ZTAoXFxwdjEyOiBcXCwgcHYxMiwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE4OiBcXCwgcHYxOCwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI1OiBcXCwgcHYyNSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjU4OiBcXCwgcHY1OCwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxKSArICBcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9BNDg1X3ZzX0RNU09cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSA0XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
# Counting number of loop per genes
tempSum <- geneAnnoData %>% dplyr::select(peakID, gene, Anno2) %>% unnest(gene) %>% group_by(gene) %>%  summarize(
    peak = list(peakID),
    anno2 = list(Anno2),
    count = n())

tempSum <- tempSum %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\,
                        ifelse(gene %in% gene.group3, \group3\,
                               ifelse(gene %in% gene.group4, \group4\,
                                      ifelse(gene %in% gene.group5, \group5\,
                                             ifelse(gene %in% gene.group6, \group6\,
                                                    ifelse(gene %in% gene.group7, \group7\,
                                                           ifelse(gene %in% gene.group8, \group8\,
                                                                  ifelse(gene %in% gene.group9, \group9\, NA)))))))))
) %>% dplyr::filter(!is.na(group))

# 
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(group ==group1) )$count
#   distance2 <- (data %>% dplyr::filter(group ==group2) )$count
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
# 
# pv12 <- round(getPvalWilcox(tempSum,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(tempSum,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(tempSum,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(tempSum,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(tempSum,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(tempSum,\group5\, \group8\), 5)


p <- ggplot(tempSum, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 10, by = 2)) + 
  coord_cartesian(ylim = c(0, 10)) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  theme(legend.position = \none\)
  # annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
  #                                               \pv15: \, pv15, \\n\,
  #                                               \pv18: \, pv18, \\n\,
  #                                               \pv25: \, pv25, \\n\,
  #                                               \pv28: \, pv28, \\n\,
  #                                               \pv58: \, pv58, \\n\), 
  #          color = \black\, hjust = 0, size = 1) +  


fileName <- paste0(\count_barplot_diffGroup_A485_vs_DMSO\)
height <- 3
width <- 4
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




##### - Average loop size

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakkxeHVkR1Z0Y0RJZ1BDMGdkR1Z0Y0ZOMWJTQWxQaVVnY205M2QybHpaU2dwSUNVK0pTQnRkWFJoZEdVb2RHOTBZV3dnUFNCc1pXNW5kR2dvWVc1dWJ6SXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiblZ0WDNCd0lEMGdjM1Z0S0dGdWJtOHlJRDA5SUZ3aVVDMVFYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm5WdFgzQmxJRDBnYzNWdEtHRnVibTh5SUQwOUlGd2lVQzFGWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0J6SUQwZ2MzVnRLR0Z1Ym04eUlEMDlJRndpVUMxVFhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiblZ0WDNCNElEMGdjM1Z0S0dGdWJtOHlJRDA5SUZ3aVVDMVlYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21GMGFXOWZjbVZuSUQwZ0tHNTFiVjl3Y0NBcklHNTFiVjl3WlNrdmRHOTBZV3dzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WVhScGIxOXpkSElnUFNCdWRXMWZjSE12ZEc5MFlXd3BYRzVjYm5OaGRtVlNSRk1vZEdWdGNESXNJR2hsY21Vb2NtVnpkV3gwUkdseUxDQmNJbWRsYm1WZmJHOXZjRjlzYVc1clgwRTBPRFV1Y21SelhDSXBLVnh1WEc1Y2JteHZiM0JVZVhCbElEd3RJSFJsYlhBeUlDVStKU0JuY205MWNGOWllU2huY205MWNDa2dKVDRsSUhOMWJXMWhjbWx6WlNodWRXMWZjSEFnUFNCemRXMG9iblZ0WDNCd0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdWRXMWZjR1VnUFNCemRXMG9iblZ0WDNCbEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdWRXMWZjSE1nUFNCemRXMG9iblZ0WDNCektTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdWRXMWZjSGdnUFNCemRXMG9iblZ0WDNCNEtTbGNibHh1WEc1c2IyOXdWSGx3WlV4dmJtY2dQQzBnYkc5dmNGUjVjR1VnSlQ0bElIQnBkbTkwWDJ4dmJtZGxjaWd0WjNKdmRYQXNJRzVoYldWelgzUnZJRDBnWENKMGVYQmxYQ0lzSUhaaGJIVmxjMTkwYnlBOUlGd2lZMjkxYm5SY0lpbGNibHh1Ykc5dmNGUjVjR1ZNYjI1bkpIUjVjR1VnUEMwZ1ptRmpkRzl5S0d4dmIzQlVlWEJsVEc5dVp5UjBlWEJsTENCc1pYWmxiSE1nUFNCaktGd2liblZ0WDNCd1hDSXNJRndpYm5WdFgzQmxYQ0lzSUZ3aWJuVnRYM0J6WENJc0lGd2liblZ0WDNCNFhDSXBLVnh1WEc0aklGQnNiM1IwYVc1blhHNW5aM0JzYjNRb2JHOXZjRlI1Y0dWTWIyNW5MQ0JoWlhNb1ptbHNiRDEwZVhCbExDQjVQV052ZFc1MExDQjRQV2R5YjNWd0tTa2dLeUJjYmlBZ0lDQm5aVzl0WDJKaGNpaHdiM05wZEdsdmJqMWNJbVpwYkd4Y0lpd2djM1JoZEQxY0ltbGtaVzUwYVhSNVhDSXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BYRzVjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiMjIyMjIyNcbnRlbXAyIDwtIHRlbXBTdW0gJT4lIHJvd3dpc2UoKSAlPiUgbXV0YXRlKHRvdGFsID0gbGVuZ3RoKGFubm8yKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wcCA9IHN1bShhbm5vMiA9PSBcXFAtUFxcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wZSA9IHN1bShhbm5vMiA9PSBcXFAtRVxcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wcyA9IHN1bShhbm5vMiA9PSBcXFAtU1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9weCA9IHN1bShhbm5vMiA9PSBcXFAtWFxcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvX3JlZyA9IChudW1fcHAgKyBudW1fcGUpL3RvdGFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW9fc3RyID0gbnVtX3BzL3RvdGFsKVxuXG5zYXZlUkRTKHRlbXAyLCBoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGlua19BNDg1LnJkc1xcKSlcblxuXG5sb29wVHlwZSA8LSB0ZW1wMiAlPiUgZ3JvdXBfYnkoZ3JvdXApICU+JSBzdW1tYXJpc2UobnVtX3BwID0gc3VtKG51bV9wcCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BlID0gc3VtKG51bV9wZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BzID0gc3VtKG51bV9wcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3B4ID0gc3VtKG51bV9weCkpXG5cblxubG9vcFR5cGVMb25nIDwtIGxvb3BUeXBlICU+JSBwaXZvdF9sb25nZXIoLWdyb3VwLCBuYW1lc190byA9IFxcdHlwZVxcLCB2YWx1ZXNfdG8gPSBcXGNvdW50XFwpXG5cbmxvb3BUeXBlTG9uZyR0eXBlIDwtIGZhY3Rvcihsb29wVHlwZUxvbmckdHlwZSwgbGV2ZWxzID0gYyhcXG51bV9wcFxcLCBcXG51bV9wZVxcLCBcXG51bV9wc1xcLCBcXG51bV9weFxcKSlcblxuIyBQbG90dGluZ1xuZ2dwbG90KGxvb3BUeXBlTG9uZywgYWVzKGZpbGw9dHlwZSwgeT1jb3VudCwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
#######
temp2 <- tempSum %>% rowwise() %>% mutate(total = length(anno2),
                                 num_pp = sum(anno2 == \P-P\),
                                 num_pe = sum(anno2 == \P-E\),
                                 num_ps = sum(anno2 == \P-S\),
                                 num_px = sum(anno2 == \P-X\),
                                 ratio_reg = (num_pp + num_pe)/total,
                                 ratio_str = num_ps/total)

saveRDS(temp2, here(resultDir, \gene_loop_link_A485.rds\))


loopType <- temp2 %>% group_by(group) %>% summarise(num_pp = sum(num_pp),
                                        num_pe = sum(num_pe),
                                        num_ps = sum(num_ps),
                                        num_px = sum(num_px))


loopTypeLong <- loopType %>% pivot_longer(-group, names_to = \type\, values_to = \count\)

loopTypeLong$type <- factor(loopTypeLong$type, levels = c(\num_pp\, \num_pe\, \num_ps\, \num_px\))

# Plotting
ggplot(loopTypeLong, aes(fill=type, y=count, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSTF4dWRHVnRjRElnUEMwZ2RHVnRjRk4xYlNBbFBpVWdjbTkzZDJselpTZ3BJQ1UrSlNCdGRYUmhkR1VvZEc5MFlXd2dQU0JzWlc1bmRHZ29ZVzV1YnpJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0J3SUQwZ2MzVnRLR0Z1Ym04eUlEMDlJRnhjVUMxUVhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiblZ0WDNCbElEMGdjM1Z0S0dGdWJtOHlJRDA5SUZ4Y1VDMUZYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm5WdFgzQnpJRDBnYzNWdEtHRnVibTh5SUQwOUlGeGNVQzFUWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JuVnRYM0I0SUQwZ2MzVnRLR0Z1Ym04eUlEMDlJRnhjVUMxWVhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbUYwYVc5ZmNtVm5JRDBnS0c1MWJWOXdjQ0FySUc1MWJWOXdaU2t2ZEc5MFlXd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlZWFJwYjE5emRISWdQU0J1ZFcxZmNITXZkRzkwWVd3cFhHNWNibk5oZG1WU1JGTW9kR1Z0Y0RJc0lHaGxjbVVvY21WemRXeDBSR2x5TENCY1hHZGxibVZmYkc5dmNGOXNhVzVyWDBFME9EVXVjbVJ6WEZ3cEtWeHVYRzVjYm14dmIzQlVlWEJsSUR3dElIUmxiWEF5SUNVK0pTQm5jbTkxY0Y5aWVTaG5jbTkxY0NrZ0pUNGxJSE4xYlcxaGNtbHpaU2h1ZFcxZmNIQWdQU0J6ZFcwb2JuVnRYM0J3S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1ZFcxZmNHVWdQU0J6ZFcwb2JuVnRYM0JsS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1ZFcxZmNITWdQU0J6ZFcwb2JuVnRYM0J6S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1ZFcxZmNIZ2dQU0J6ZFcwb2JuVnRYM0I0S1NsY2JseHVYRzVzYjI5d1ZIbHdaVXh2Ym1jZ1BDMGdiRzl2Y0ZSNWNHVWdKVDRsSUhCcGRtOTBYMnh2Ym1kbGNpZ3RaM0p2ZFhBc0lHNWhiV1Z6WDNSdklEMGdYRngwZVhCbFhGd3NJSFpoYkhWbGMxOTBieUE5SUZ4Y1kyOTFiblJjWENsY2JseHViRzl2Y0ZSNWNHVk1iMjVuSkhSNWNHVWdQQzBnWm1GamRHOXlLR3h2YjNCVWVYQmxURzl1WnlSMGVYQmxMQ0JzWlhabGJITWdQU0JqS0Z4Y2JuVnRYM0J3WEZ3c0lGeGNiblZ0WDNCbFhGd3NJRnhjYm5WdFgzQnpYRndzSUZ4Y2JuVnRYM0I0WEZ3cEtWeHVYRzRqSUZCc2IzUjBhVzVuWEc1blozQnNiM1FvYkc5dmNGUjVjR1ZNYjI1bkxDQmhaWE1vWm1sc2JEMTBlWEJsTENCNVBXTnZkVzUwTENCNFBXZHliM1Z3S1NrZ0t5QmNiaUFnSUNCblpXOXRYMkpoY2lod2IzTnBkR2x2YmoxY1hHWnBiR3hjWEN3Z2MzUmhkRDFjWEdsa1pXNTBhWFI1WEZ3cElDc2dkR2hsYldWZlkyeGhjM05wWXlncFhHNWNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG4jIyMjIyMjXG50ZW1wMiA8LSB0ZW1wU3VtICU+JSByb3d3aXNlKCkgJT4lIG11dGF0ZSh0b3RhbCA9IGxlbmd0aChhbm5vMiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHAgPSBzdW0oYW5ubzIgPT0gXFxQLVBcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGUgPSBzdW0oYW5ubzIgPT0gXFxQLUVcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHMgPSBzdW0oYW5ubzIgPT0gXFxQLVNcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHggPSBzdW0oYW5ubzIgPT0gXFxQLVhcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb19yZWcgPSAobnVtX3BwICsgbnVtX3BlKS90b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvX3N0ciA9IG51bV9wcy90b3RhbClcblxuc2F2ZVJEUyh0ZW1wMiwgaGVyZShyZXN1bHREaXIsIFxcZ2VuZV9sb29wX2xpbmtfQTQ4NS5yZHNcXCkpXG5cblxubG9vcFR5cGUgPC0gdGVtcDIgJT4lIGdyb3VwX2J5KGdyb3VwKSAlPiUgc3VtbWFyaXNlKG51bV9wcCA9IHN1bShudW1fcHApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wZSA9IHN1bShudW1fcGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wcyA9IHN1bShudW1fcHMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9weCA9IHN1bShudW1fcHgpKVxuXG5cbmxvb3BUeXBlTG9uZyA8LSBsb29wVHlwZSAlPiUgcGl2b3RfbG9uZ2VyKC1ncm91cCwgbmFtZXNfdG8gPSBcXHR5cGVcXCwgdmFsdWVzX3RvID0gXFxjb3VudFxcKVxuXG5sb29wVHlwZUxvbmckdHlwZSA8LSBmYWN0b3IobG9vcFR5cGVMb25nJHR5cGUsIGxldmVscyA9IGMoXFxudW1fcHBcXCwgXFxudW1fcGVcXCwgXFxudW1fcHNcXCwgXFxudW1fcHhcXCkpXG5cbiMgUGxvdHRpbmdcbmdncGxvdChsb29wVHlwZUxvbmcsIGFlcyhmaWxsPXR5cGUsIHk9Y291bnQsIHg9Z3JvdXApKSArIFxuICAgIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcLCBzdGF0PVxcaWRlbnRpdHlcXCkgKyB0aGVtZV9jbGFzc2ljKClcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjI1xudGVtcDIgPC0gdGVtcFN1bSAlPiUgcm93d2lzZSgpICU+JSBtdXRhdGUodG90YWwgPSBsZW5ndGgoYW5ubzIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BwID0gc3VtKGFubm8yID09IFxcUC1QXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BlID0gc3VtKGFubm8yID09IFxcUC1FXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BzID0gc3VtKGFubm8yID09IFxcUC1TXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3B4ID0gc3VtKGFubm8yID09IFxcUC1YXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW9fcmVnID0gKG51bV9wcCArIG51bV9wZSkvdG90YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb19zdHIgPSBudW1fcHMvdG90YWwpXG5cbnNhdmVSRFModGVtcDIsIGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rX0E0ODUucmRzXFwpKVxuXG5cbmxvb3BUeXBlIDwtIHRlbXAyICU+JSBncm91cF9ieShncm91cCkgJT4lIHN1bW1hcmlzZShudW1fcHAgPSBzdW0obnVtX3BwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGUgPSBzdW0obnVtX3BlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHMgPSBzdW0obnVtX3BzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHggPSBzdW0obnVtX3B4KSlcblxuXG5sb29wVHlwZUxvbmcgPC0gbG9vcFR5cGUgJT4lIHBpdm90X2xvbmdlcigtZ3JvdXAsIG5hbWVzX3RvID0gXFx0eXBlXFwsIHZhbHVlc190byA9IFxcY291bnRcXClcblxubG9vcFR5cGVMb25nJHR5cGUgPC0gZmFjdG9yKGxvb3BUeXBlTG9uZyR0eXBlLCBsZXZlbHMgPSBjKFxcbnVtX3BwXFwsIFxcbnVtX3BlXFwsIFxcbnVtX3BzXFwsIFxcbnVtX3B4XFwpKVxuXG4jIFBsb3R0aW5nXG5nZ3Bsb3QobG9vcFR5cGVMb25nLCBhZXMoZmlsbD10eXBlLCB5PWNvdW50LCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdD1cXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cbmBgYFxuYGBgIn0= -->

```r
```r
#######
temp2 <- tempSum %>% rowwise() %>% mutate(total = length(anno2),
                                 num_pp = sum(anno2 == \P-P\),
                                 num_pe = sum(anno2 == \P-E\),
                                 num_ps = sum(anno2 == \P-S\),
                                 num_px = sum(anno2 == \P-X\),
                                 ratio_reg = (num_pp + num_pe)/total,
                                 ratio_str = num_ps/total)

saveRDS(temp2, here(resultDir, \gene_loop_link_A485.rds\))


loopType <- temp2 %>% group_by(group) %>% summarise(num_pp = sum(num_pp),
                                        num_pe = sum(num_pe),
                                        num_ps = sum(num_ps),
                                        num_px = sum(num_px))


loopTypeLong <- loopType %>% pivot_longer(-group, names_to = \type\, values_to = \count\)

loopTypeLong$type <- factor(loopTypeLong$type, levels = c(\num_pp\, \num_pe\, \num_ps\, \num_px\))

# Plotting
ggplot(loopTypeLong, aes(fill=type, y=count, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-N

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakl5TmNiaU5RTFZCY2JtUmhkR0VnUEMwZ2RHVnRjRElnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJRzUxYlY5d2NDbGNibU52Ykc1aGJXVnpLR1JoZEdFcElEd3RJR01vWENKbmNtOTFjRndpTENCY0ltTnZkVzUwWENJcFhHNGpJSEIyTVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGd2laM0p2ZFhBeFhDSXNJRndpWjNKdmRYQXlYQ0lwTENBMUtWeHVJeUJ3ZGpFMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTeGNJbWR5YjNWd01Wd2lMQ0JjSW1keWIzVndOVndpS1N3Z05TbGNiaU1nY0hZeE9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYQ0puY205MWNERmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzRqSUhCMk1qVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMRndpWjNKdmRYQXlYQ0lzSUZ3aVozSnZkWEExWENJcExDQTFLVnh1SXlCd2RqSTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3T0Z3aUtTd2dOU2xjYmlNZ2NIWTFPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0VzWENKbmNtOTFjRFZjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc1Y2JuQWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQmpiM1Z1ZEN3Z1ptbHNiQ0E5SUdkeWIzVndLU2tnSzF4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpVc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUFnSUNBZ0lDQmNiaUFnYzJOaGJHVmZlVjlqYjI1MGFXNTFiM1Z6S0dKeVpXRnJjeUE5SUhObGNTZ3dMQ0ExTENCaWVTQTlJRElwTENCc2FXMXBkSE1nUFNCaktEQXNJRFVwS1NBcklGeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMQ0JuWlc5dElEMGdYQ0p3YjJsdWRGd2lMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ3aWNtVmtYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpS1NBZ0sxeHVJQ0IwYUdWdFpTaHNaV2RsYm1RdWNHOXphWFJwYjI0Z1BTQmNJbTV2Ym1WY0lpbGNiaUFnSXlCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQXpMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkIyTVRJNklGd2lMQ0J3ZGpFeUxDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNVFU2SUZ3aUxDQndkakUxTENCY0lseGNibHdpTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk1UZzZJRndpTENCd2RqRTRMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkIyTWpVNklGd2lMQ0J3ZGpJMUxDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNamc2SUZ3aUxDQndkakk0TENCY0lseGNibHdpTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk5UZzZJRndpTENCd2RqVTRMQ0JjSWx4Y2Jsd2lLU3dnWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJREVwWEc1Y2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpWTI5MWJuUmZZbUZ5Y0d4dmRGOWthV1ptUjNKdmRYQmZRVFE0TlY5MmMxOUVUVk5QWDNCd1hDSXBYRzVvWldsbmFIUWdQQzBnTTF4dWQybGtkR2dnUEMwZ00xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jIyMjIyMjI1xuI1AtUFxuZGF0YSA8LSB0ZW1wMiAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgbnVtX3BwKVxuY29sbmFtZXMoZGF0YSkgPC0gYyhcXGdyb3VwXFwsIFxcY291bnRcXClcbiMgcHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4jIHB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHYyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4jIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxuIyBwdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIFxuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDUsIGJ5ID0gMiksIGxpbWl0cyA9IGMoMCwgNSkpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICArXG4gIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIHB2MTIsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxNTogXFwsIHB2MTUsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNTogXFwsIHB2MjUsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyODogXFwsIHB2MjgsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSlcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9BNDg1X3ZzX0RNU09fcHBcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
########
#P-P
data <- temp2 %>% dplyr::select(group, num_pp)
colnames(data) <- c(\group\, \count\)
# pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  theme(legend.position = \none\)
  # annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
  #                                               \pv15: \, pv15, \\n\,
  #                                               \pv18: \, pv18, \\n\,
  #                                               \pv25: \, pv25, \\n\,
  #                                               \pv28: \, pv28, \\n\,
  #                                               \pv58: \, pv58, \\n\), 
  #          color = \black\, hjust = 0, size = 1)


fileName <- paste0(\count_barplot_diffGroup_A485_vs_DMSO_pp\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSXlOY2JpTlFMVkJjYm1SaGRHRWdQQzBnZEdWdGNESWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHNTFiVjl3Y0NsY2JtTnZiRzVoYldWektHUmhkR0VwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEdOdmRXNTBYRndwWEc0aklIQjJNVElnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTEZ4Y1ozSnZkWEF4WEZ3c0lGeGNaM0p2ZFhBeVhGd3BMQ0ExS1Z4dUl5QndkakUxSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN4Y1hHZHliM1Z3TVZ4Y0xDQmNYR2R5YjNWd05WeGNLU3dnTlNsY2JpTWdjSFl4T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFc1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNGpJSEIyTWpVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGeGNaM0p2ZFhBeVhGd3NJRnhjWjNKdmRYQTFYRndwTENBMUtWeHVJeUJ3ZGpJNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTeGNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndPRnhjS1N3Z05TbGNiaU1nY0hZMU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYRnhuY205MWNEVmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCamIzVnVkQ3dnWm1sc2JDQTlJR2R5YjNWd0tTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMalVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QWdJQ0FnSUNCY2JpQWdjMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR0p5WldGcmN5QTlJSE5sY1Nnd0xDQTFMQ0JpZVNBOUlESXBMQ0JzYVcxcGRITWdQU0JqS0RBc0lEVXBLU0FySUZ4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hGeHdiMmx1ZEZ4Y0xDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRnhjY21Wa1hGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNLU0FnSzF4dUlDQjBhR1Z0WlNoc1pXZGxibVF1Y0c5emFYUnBiMjRnUFNCY1hHNXZibVZjWENsY2JpQWdJeUJoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBekxDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQjJNVEk2SUZ4Y0xDQndkakV5TENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1UVTZJRnhjTENCd2RqRTFMQ0JjWEZ4Y2JseGNMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTVRnNklGeGNMQ0J3ZGpFNExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQjJNalU2SUZ4Y0xDQndkakkxTENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1qZzZJRnhjTENCd2RqSTRMQ0JjWEZ4Y2JseGNMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTlRnNklGeGNMQ0J3ZGpVNExDQmNYRnhjYmx4Y0tTd2dYRzRnSUNNZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlERXBYRzVjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNZMjkxYm5SZlltRnljR3h2ZEY5a2FXWm1SM0p2ZFhCZlFUUTROVjkyYzE5RVRWTlBYM0J3WEZ3cFhHNW9aV2xuYUhRZ1BDMGdNMXh1ZDJsa2RHZ2dQQzBnTTF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLVBcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wcClcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG4jIHB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuIyBwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTg6IFxcLCBwdjE4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NTg6IFxcLCBwdjU4LCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPX3BwXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLVBcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wcClcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG4jIHB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuIyBwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTg6IFxcLCBwdjE4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NTg6IFxcLCBwdjU4LCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPX3BwXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
########
#P-P
data <- temp2 %>% dplyr::select(group, num_pp)
colnames(data) <- c(\group\, \count\)
# pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  theme(legend.position = \none\)
  # annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
  #                                               \pv15: \, pv15, \\n\,
  #                                               \pv18: \, pv18, \\n\,
  #                                               \pv25: \, pv25, \\n\,
  #                                               \pv28: \, pv28, \\n\,
  #                                               \pv58: \, pv58, \\n\), 
  #          color = \black\, hjust = 0, size = 1)


fileName <- paste0(\count_barplot_diffGroup_A485_vs_DMSO_pp\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Counting loop types

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakl5TmNiaU5RTFVWY2JtUmhkR0VnUEMwZ2RHVnRjRElnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJRzUxYlY5d1pTbGNibU52Ykc1aGJXVnpLR1JoZEdFcElEd3RJR01vWENKbmNtOTFjRndpTENCY0ltTnZkVzUwWENJcFhHNGpJSEIyTVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGd2laM0p2ZFhBeFhDSXNJRndpWjNKdmRYQXlYQ0lwTENBMUtWeHVJeUJ3ZGpFMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTeGNJbWR5YjNWd01Wd2lMQ0JjSW1keWIzVndOVndpS1N3Z05TbGNiaU1nY0hZeE9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYQ0puY205MWNERmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzRqSUhCMk1qVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMRndpWjNKdmRYQXlYQ0lzSUZ3aVozSnZkWEExWENJcExDQTFLVnh1SXlCd2RqSTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3T0Z3aUtTd2dOU2xjYmlNZ2NIWTFPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0VzWENKbmNtOTFjRFZjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc1Y2JuQWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQmpiM1Z1ZEN3Z1ptbHNiQ0E5SUdkeWIzVndLU2tnSzF4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpVc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUFnSUNBZ0lDQmNiaUFnYzJOaGJHVmZlVjlqYjI1MGFXNTFiM1Z6S0dKeVpXRnJjeUE5SUhObGNTZ3dMQ0ExTENCaWVTQTlJRElwTENCc2FXMXBkSE1nUFNCaktEQXNJRFVwS1NBcklGeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMQ0JuWlc5dElEMGdYQ0p3YjJsdWRGd2lMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ3aWNtVmtYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpS1NBZ0sxeHVJQ0IwYUdWdFpTaHNaV2RsYm1RdWNHOXphWFJwYjI0Z1BTQmNJbTV2Ym1WY0lpbGNiaUFnSXlCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQXpMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkIyTVRJNklGd2lMQ0J3ZGpFeUxDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNVFU2SUZ3aUxDQndkakUxTENCY0lseGNibHdpTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk1UZzZJRndpTENCd2RqRTRMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkIyTWpVNklGd2lMQ0J3ZGpJMUxDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNamc2SUZ3aUxDQndkakk0TENCY0lseGNibHdpTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk5UZzZJRndpTENCd2RqVTRMQ0JjSWx4Y2Jsd2lLU3dnWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJREVwWEc1Y2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpWTI5MWJuUmZZbUZ5Y0d4dmRGOWthV1ptUjNKdmRYQmZRVFE0TlY5MmMxOUVUVk5QWDNCbFhDSXBYRzVvWldsbmFIUWdQQzBnTTF4dWQybGtkR2dnUEMwZ00xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jIyMjIyMjI1xuI1AtRVxuZGF0YSA8LSB0ZW1wMiAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgbnVtX3BlKVxuY29sbmFtZXMoZGF0YSkgPC0gYyhcXGdyb3VwXFwsIFxcY291bnRcXClcbiMgcHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4jIHB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHYyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4jIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxuIyBwdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIFxuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDUsIGJ5ID0gMiksIGxpbWl0cyA9IGMoMCwgNSkpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICArXG4gIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKFxccHYxMjogXFwsIHB2MTIsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxNTogXFwsIHB2MTUsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNTogXFwsIHB2MjUsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyODogXFwsIHB2MjgsIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMSlcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudF9iYXJwbG90X2RpZmZHcm91cF9BNDg1X3ZzX0RNU09fcGVcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
########
#P-E
data <- temp2 %>% dplyr::select(group, num_pe)
colnames(data) <- c(\group\, \count\)
# pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  theme(legend.position = \none\)
  # annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
  #                                               \pv15: \, pv15, \\n\,
  #                                               \pv18: \, pv18, \\n\,
  #                                               \pv25: \, pv25, \\n\,
  #                                               \pv28: \, pv28, \\n\,
  #                                               \pv58: \, pv58, \\n\), 
  #          color = \black\, hjust = 0, size = 1)


fileName <- paste0(\count_barplot_diffGroup_A485_vs_DMSO_pe\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSXlOY2JpTlFMVVZjYm1SaGRHRWdQQzBnZEdWdGNESWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHNTFiVjl3WlNsY2JtTnZiRzVoYldWektHUmhkR0VwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEdOdmRXNTBYRndwWEc0aklIQjJNVElnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTEZ4Y1ozSnZkWEF4WEZ3c0lGeGNaM0p2ZFhBeVhGd3BMQ0ExS1Z4dUl5QndkakUxSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN4Y1hHZHliM1Z3TVZ4Y0xDQmNYR2R5YjNWd05WeGNLU3dnTlNsY2JpTWdjSFl4T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFc1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNGpJSEIyTWpVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGeGNaM0p2ZFhBeVhGd3NJRnhjWjNKdmRYQTFYRndwTENBMUtWeHVJeUJ3ZGpJNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTeGNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndPRnhjS1N3Z05TbGNiaU1nY0hZMU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYRnhuY205MWNEVmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCamIzVnVkQ3dnWm1sc2JDQTlJR2R5YjNWd0tTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMalVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QWdJQ0FnSUNCY2JpQWdjMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR0p5WldGcmN5QTlJSE5sY1Nnd0xDQTFMQ0JpZVNBOUlESXBMQ0JzYVcxcGRITWdQU0JqS0RBc0lEVXBLU0FySUZ4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hGeHdiMmx1ZEZ4Y0xDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRnhjY21Wa1hGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNLU0FnSzF4dUlDQjBhR1Z0WlNoc1pXZGxibVF1Y0c5emFYUnBiMjRnUFNCY1hHNXZibVZjWENsY2JpQWdJeUJoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBekxDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQjJNVEk2SUZ4Y0xDQndkakV5TENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1UVTZJRnhjTENCd2RqRTFMQ0JjWEZ4Y2JseGNMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTVRnNklGeGNMQ0J3ZGpFNExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQjJNalU2SUZ4Y0xDQndkakkxTENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1qZzZJRnhjTENCd2RqSTRMQ0JjWEZ4Y2JseGNMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTlRnNklGeGNMQ0J3ZGpVNExDQmNYRnhjYmx4Y0tTd2dYRzRnSUNNZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlERXBYRzVjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNZMjkxYm5SZlltRnljR3h2ZEY5a2FXWm1SM0p2ZFhCZlFUUTROVjkyYzE5RVRWTlBYM0JsWEZ3cFhHNW9aV2xuYUhRZ1BDMGdNMXh1ZDJsa2RHZ2dQQzBnTTF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLUVcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wZSlcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG4jIHB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuIyBwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTg6IFxcLCBwdjE4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NTg6IFxcLCBwdjU4LCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPX3BlXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLUVcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wZSlcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG4jIHB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuIyBwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTg6IFxcLCBwdjE4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NTg6IFxcLCBwdjU4LCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPX3BlXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
########
#P-E
data <- temp2 %>% dplyr::select(group, num_pe)
colnames(data) <- c(\group\, \count\)
# pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  theme(legend.position = \none\)
  # annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
  #                                               \pv15: \, pv15, \\n\,
  #                                               \pv18: \, pv18, \\n\,
  #                                               \pv25: \, pv25, \\n\,
  #                                               \pv28: \, pv28, \\n\,
  #                                               \pv58: \, pv58, \\n\), 
  #          color = \black\, hjust = 0, size = 1)


fileName <- paste0(\count_barplot_diffGroup_A485_vs_DMSO_pe\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-P

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakl5TmNiaU5RTFZOY2JtUmhkR0VnUEMwZ2RHVnRjRElnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJRzUxYlY5d2N5bGNibU52Ykc1aGJXVnpLR1JoZEdFcElEd3RJR01vWENKbmNtOTFjRndpTENCY0ltTnZkVzUwWENJcFhHNGpJSEIyTVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGd2laM0p2ZFhBeFhDSXNJRndpWjNKdmRYQXlYQ0lwTENBMUtWeHVJeUJ3ZGpFMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTeGNJbWR5YjNWd01Wd2lMQ0JjSW1keWIzVndOVndpS1N3Z05TbGNiaU1nY0hZeE9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYQ0puY205MWNERmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzRqSUhCMk1qVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMRndpWjNKdmRYQXlYQ0lzSUZ3aVozSnZkWEExWENJcExDQTFLVnh1SXlCd2RqSTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3T0Z3aUtTd2dOU2xjYmlNZ2NIWTFPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0VzWENKbmNtOTFjRFZjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc1Y2JuQWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQmpiM1Z1ZEN3Z1ptbHNiQ0E5SUdkeWIzVndLU2tnSzF4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpVc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUFnSUNBZ0lDQmNiaUFnYzJOaGJHVmZlVjlqYjI1MGFXNTFiM1Z6S0dKeVpXRnJjeUE5SUhObGNTZ3dMQ0ExTENCaWVTQTlJRElwTENCc2FXMXBkSE1nUFNCaktEQXNJRFVwS1NBcklGeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMQ0JuWlc5dElEMGdYQ0p3YjJsdWRGd2lMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ3aWNtVmtYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpS1NBZ0sxeHVJQ0IwYUdWdFpTaHNaV2RsYm1RdWNHOXphWFJwYjI0Z1BTQmNJbTV2Ym1WY0lpbGNiaUFnSXlCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQXpMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkIyTVRJNklGd2lMQ0J3ZGpFeUxDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNVFU2SUZ3aUxDQndkakUxTENCY0lseGNibHdpTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk1UZzZJRndpTENCd2RqRTRMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkIyTWpVNklGd2lMQ0J3ZGpJMUxDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNamc2SUZ3aUxDQndkakk0TENCY0lseGNibHdpTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk5UZzZJRndpTENCd2RqVTRMQ0JjSWx4Y2Jsd2lLU3dnWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJREVwS3lBZ1hHNWNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aVkyOTFiblJmWW1GeWNHeHZkRjlrYVdabVIzSnZkWEJmUVRRNE5WOTJjMTlFVFZOUFgzQnpYQ0lwWEc1b1pXbG5hSFFnUEMwZ00xeHVkMmxrZEdnZ1BDMGdNMXh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ3aWFXNWNJaXdnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuIyMjIyMjIyNcbiNQLVNcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wcylcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG4jIHB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuIyBwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTg6IFxcLCBwdjE4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NTg6IFxcLCBwdjU4LCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPX3BzXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
########
#P-S
data <- temp2 %>% dplyr::select(group, num_ps)
colnames(data) <- c(\group\, \count\)
# pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  theme(legend.position = \none\)
  # annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
  #                                               \pv15: \, pv15, \\n\,
  #                                               \pv18: \, pv18, \\n\,
  #                                               \pv25: \, pv25, \\n\,
  #                                               \pv28: \, pv28, \\n\,
  #                                               \pv58: \, pv58, \\n\), 
  #          color = \black\, hjust = 0, size = 1)+  


fileName <- paste0(\count_barplot_diffGroup_A485_vs_DMSO_ps\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSXlOY2JpTlFMVk5jYm1SaGRHRWdQQzBnZEdWdGNESWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHNTFiVjl3Y3lsY2JtTnZiRzVoYldWektHUmhkR0VwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEdOdmRXNTBYRndwWEc0aklIQjJNVElnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTEZ4Y1ozSnZkWEF4WEZ3c0lGeGNaM0p2ZFhBeVhGd3BMQ0ExS1Z4dUl5QndkakUxSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN4Y1hHZHliM1Z3TVZ4Y0xDQmNYR2R5YjNWd05WeGNLU3dnTlNsY2JpTWdjSFl4T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFc1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNGpJSEIyTWpVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGeGNaM0p2ZFhBeVhGd3NJRnhjWjNKdmRYQTFYRndwTENBMUtWeHVJeUJ3ZGpJNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTeGNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndPRnhjS1N3Z05TbGNiaU1nY0hZMU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYRnhuY205MWNEVmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCamIzVnVkQ3dnWm1sc2JDQTlJR2R5YjNWd0tTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMalVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QWdJQ0FnSUNCY2JpQWdjMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR0p5WldGcmN5QTlJSE5sY1Nnd0xDQTFMQ0JpZVNBOUlESXBMQ0JzYVcxcGRITWdQU0JqS0RBc0lEVXBLU0FySUZ4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hGeHdiMmx1ZEZ4Y0xDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRnhjY21Wa1hGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNLU0FnSzF4dUlDQjBhR1Z0WlNoc1pXZGxibVF1Y0c5emFYUnBiMjRnUFNCY1hHNXZibVZjWENsY2JpQWdJeUJoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBekxDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQjJNVEk2SUZ4Y0xDQndkakV5TENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1UVTZJRnhjTENCd2RqRTFMQ0JjWEZ4Y2JseGNMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTVRnNklGeGNMQ0J3ZGpFNExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQjJNalU2SUZ4Y0xDQndkakkxTENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1qZzZJRnhjTENCd2RqSTRMQ0JjWEZ4Y2JseGNMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTlRnNklGeGNMQ0J3ZGpVNExDQmNYRnhjYmx4Y0tTd2dYRzRnSUNNZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlERXBLeUFnWEc1Y2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjWTI5MWJuUmZZbUZ5Y0d4dmRGOWthV1ptUjNKdmRYQmZRVFE0TlY5MmMxOUVUVk5QWDNCelhGd3BYRzVvWldsbmFIUWdQQzBnTTF4dWQybGtkR2dnUEMwZ00xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRnhjYVc1Y1hDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2twTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbiMjIyMjIyMjXG4jUC1TXG5kYXRhIDwtIHRlbXAyICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBudW1fcHMpXG5jb2xuYW1lcyhkYXRhKSA8LSBjKFxcZ3JvdXBcXCwgXFxjb3VudFxcKVxuIyBwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiMgcHYxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4jIHB2MTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuIyBwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2NTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgICAgICAgXG4gIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNSwgYnkgPSAyKSwgbGltaXRzID0gYygwLCA1KSkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgICtcbiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMywgbGFiZWwgPSBwYXN0ZTAoXFxwdjEyOiBcXCwgcHYxMiwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE4OiBcXCwgcHYxOCwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI1OiBcXCwgcHYyNSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjU4OiBcXCwgcHY1OCwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxKSsgIFxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGNvdW50X2JhcnBsb3RfZGlmZkdyb3VwX0E0ODVfdnNfRE1TT19wc1xcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLVNcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wcylcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG4jIHB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuIyBwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTg6IFxcLCBwdjE4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NTg6IFxcLCBwdjU4LCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPX3BzXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
########
#P-S
data <- temp2 %>% dplyr::select(group, num_ps)
colnames(data) <- c(\group\, \count\)
# pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  theme(legend.position = \none\)
  # annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
  #                                               \pv15: \, pv15, \\n\,
  #                                               \pv18: \, pv18, \\n\,
  #                                               \pv25: \, pv25, \\n\,
  #                                               \pv28: \, pv28, \\n\,
  #                                               \pv58: \, pv58, \\n\), 
  #          color = \black\, hjust = 0, size = 1)+  


fileName <- paste0(\count_barplot_diffGroup_A485_vs_DMSO_ps\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-E

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakl5TmNiaU5RTFZoY2JtUmhkR0VnUEMwZ2RHVnRjRElnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJRzUxYlY5d2VDbGNibU52Ykc1aGJXVnpLR1JoZEdFcElEd3RJR01vWENKbmNtOTFjRndpTENCY0ltTnZkVzUwWENJcFhHNGpJSEIyTVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGd2laM0p2ZFhBeFhDSXNJRndpWjNKdmRYQXlYQ0lwTENBMUtWeHVJeUJ3ZGpFMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTeGNJbWR5YjNWd01Wd2lMQ0JjSW1keWIzVndOVndpS1N3Z05TbGNiaU1nY0hZeE9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYQ0puY205MWNERmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzRqSUhCMk1qVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMRndpWjNKdmRYQXlYQ0lzSUZ3aVozSnZkWEExWENJcExDQTFLVnh1SXlCd2RqSTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3hjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3T0Z3aUtTd2dOU2xjYmlNZ2NIWTFPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0VzWENKbmNtOTFjRFZjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc1Y2JuQWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQmpiM1Z1ZEN3Z1ptbHNiQ0E5SUdkeWIzVndLU2tnSzF4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpVc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUFnSUNBZ0lDQmNiaUFnYzJOaGJHVmZlVjlqYjI1MGFXNTFiM1Z6S0dKeVpXRnJjeUE5SUhObGNTZ3dMQ0ExTENCaWVTQTlJRElwTENCc2FXMXBkSE1nUFNCaktEQXNJRFVwS1NBcklGeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMQ0JuWlc5dElEMGdYQ0p3YjJsdWRGd2lMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ3aWNtVmtYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpS1NBZ0sxeHVJQ0IwYUdWdFpTaHNaV2RsYm1RdWNHOXphWFJwYjI0Z1BTQmNJbTV2Ym1WY0lpbGNiaUFnSXlCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQXpMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkIyTVRJNklGd2lMQ0J3ZGpFeUxDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNVFU2SUZ3aUxDQndkakUxTENCY0lseGNibHdpTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk1UZzZJRndpTENCd2RqRTRMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkIyTWpVNklGd2lMQ0J3ZGpJMUxDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNamc2SUZ3aUxDQndkakk0TENCY0lseGNibHdpTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk5UZzZJRndpTENCd2RqVTRMQ0JjSWx4Y2Jsd2lLU3dnWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJREVwS3lBZ1hHNWNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aVkyOTFiblJmWW1GeWNHeHZkRjlrYVdabVIzSnZkWEJmUVRRNE5WOTJjMTlFVFZOUFgzQjRYQ0lwWEc1b1pXbG5hSFFnUEMwZ00xeHVkMmxrZEdnZ1BDMGdNMXh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ3aWFXNWNJaXdnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuIyMjIyMjIyNcbiNQLVhcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9weClcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG4jIHB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuIyBwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTg6IFxcLCBwdjE4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NTg6IFxcLCBwdjU4LCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPX3B4XFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
########
#P-X
data <- temp2 %>% dplyr::select(group, num_px)
colnames(data) <- c(\group\, \count\)
# pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  theme(legend.position = \none\)
  # annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
  #                                               \pv15: \, pv15, \\n\,
  #                                               \pv18: \, pv18, \\n\,
  #                                               \pv25: \, pv25, \\n\,
  #                                               \pv28: \, pv28, \\n\,
  #                                               \pv58: \, pv58, \\n\), 
  #          color = \black\, hjust = 0, size = 1)+  


fileName <- paste0(\count_barplot_diffGroup_A485_vs_DMSO_px\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSXlOY2JpTlFMVmhjYm1SaGRHRWdQQzBnZEdWdGNESWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHNTFiVjl3ZUNsY2JtTnZiRzVoYldWektHUmhkR0VwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEdOdmRXNTBYRndwWEc0aklIQjJNVElnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTEZ4Y1ozSnZkWEF4WEZ3c0lGeGNaM0p2ZFhBeVhGd3BMQ0ExS1Z4dUl5QndkakUxSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN4Y1hHZHliM1Z3TVZ4Y0xDQmNYR2R5YjNWd05WeGNLU3dnTlNsY2JpTWdjSFl4T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFc1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNGpJSEIyTWpVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExGeGNaM0p2ZFhBeVhGd3NJRnhjWjNKdmRYQTFYRndwTENBMUtWeHVJeUJ3ZGpJNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTeGNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndPRnhjS1N3Z05TbGNiaU1nY0hZMU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNYRnhuY205MWNEVmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCamIzVnVkQ3dnWm1sc2JDQTlJR2R5YjNWd0tTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMalVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QWdJQ0FnSUNCY2JpQWdjMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR0p5WldGcmN5QTlJSE5sY1Nnd0xDQTFMQ0JpZVNBOUlESXBMQ0JzYVcxcGRITWdQU0JqS0RBc0lEVXBLU0FySUZ4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hGeHdiMmx1ZEZ4Y0xDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRnhjY21Wa1hGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNLU0FnSzF4dUlDQjBhR1Z0WlNoc1pXZGxibVF1Y0c5emFYUnBiMjRnUFNCY1hHNXZibVZjWENsY2JpQWdJeUJoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBekxDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQjJNVEk2SUZ4Y0xDQndkakV5TENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1UVTZJRnhjTENCd2RqRTFMQ0JjWEZ4Y2JseGNMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTVRnNklGeGNMQ0J3ZGpFNExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQjJNalU2SUZ4Y0xDQndkakkxTENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1qZzZJRnhjTENCd2RqSTRMQ0JjWEZ4Y2JseGNMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTlRnNklGeGNMQ0J3ZGpVNExDQmNYRnhjYmx4Y0tTd2dYRzRnSUNNZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlERXBLeUFnWEc1Y2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjWTI5MWJuUmZZbUZ5Y0d4dmRGOWthV1ptUjNKdmRYQmZRVFE0TlY5MmMxOUVUVk5QWDNCNFhGd3BYRzVvWldsbmFIUWdQQzBnTTF4dWQybGtkR2dnUEMwZ00xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRnhjYVc1Y1hDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2twTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbiMjIyMjIyMjXG4jUC1YXG5kYXRhIDwtIHRlbXAyICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBudW1fcHgpXG5jb2xuYW1lcyhkYXRhKSA8LSBjKFxcZ3JvdXBcXCwgXFxjb3VudFxcKVxuIyBwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiMgcHYxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4jIHB2MTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuIyBwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2NTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgICAgICAgXG4gIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNSwgYnkgPSAyKSwgbGltaXRzID0gYygwLCA1KSkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgICtcbiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMywgbGFiZWwgPSBwYXN0ZTAoXFxwdjEyOiBcXCwgcHYxMiwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE4OiBcXCwgcHYxOCwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI1OiBcXCwgcHYyNSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjU4OiBcXCwgcHY1OCwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxKSsgIFxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGNvdW50X2JhcnBsb3RfZGlmZkdyb3VwX0E0ODVfdnNfRE1TT19weFxcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjIyNcbiNQLVhcbmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9weClcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxncm91cFxcLCBcXGNvdW50XFwpXG4jIHB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuIyBwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4jIHB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSxcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICBcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTU6IFxcLCBwdjE1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTg6IFxcLCBwdjE4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBwdjI4LCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NTg6IFxcLCBwdjU4LCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcY291bnRfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPX3B4XFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
########
#P-X
data <- temp2 %>% dplyr::select(group, num_px)
colnames(data) <- c(\group\, \count\)
# pv12 <- round(getPvalWilcox(data,\group1\, \group2\), 5)
# pv15 <- round(getPvalWilcox(data,\group1\, \group5\), 5)
# pv18 <- round(getPvalWilcox(data,\group1\, \group8\), 5)
# pv25 <- round(getPvalWilcox(data,\group2\, \group5\), 5)
# pv28 <- round(getPvalWilcox(data,\group2\, \group8\), 5)
# pv58 <- round(getPvalWilcox(data,\group5\, \group8\), 5)

p <- ggplot(data, aes(x = group, y = count, fill = group)) +
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() +       
  scale_y_continuous(breaks = seq(0, 5, by = 2), limits = c(0, 5)) + 
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  theme(legend.position = \none\)
  # annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
  #                                               \pv15: \, pv15, \\n\,
  #                                               \pv18: \, pv18, \\n\,
  #                                               \pv25: \, pv25, \\n\,
  #                                               \pv28: \, pv28, \\n\,
  #                                               \pv58: \, pv58, \\n\), 
  #          color = \black\, hjust = 0, size = 1)+  


fileName <- paste0(\count_barplot_diffGroup_A485_vs_DMSO_px\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-S

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc1aGJIQm9ZU0E4TFNBd0xqQTFYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibVJwWm1ZdVVGSlBMa2N4TG1SVVFVY2dQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVpHbG1abDlITVVjeUxtUlVRVWRmUnpFdVpGUkJSMTkyYzE5SE1TNUVUVk5QWDFCU1QzTmxjUzUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VUZKUExrY3lMbVJVUVVjZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWkdsbVpsOUhNVWN5TG1SVVFVZGZSekl1WkZSQlIxOTJjMTlITWk1RVRWTlBYMUJTVDNObGNTNTBjM1pjSWlrcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEJoWkdvZ1BDQmhiSEJvWVN3Z1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJtWTBOMWRHOW1aaWxjYm1ScFptWXVVazVCTGtjeExtUlVRVWNnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laR2xtWmw5SE1TNWtWRUZIWDBjeExqSnBMbVJVUVVkZmRuTmZSekV1TW1rdVJFMVRUeTUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hCaFpHb2dQQ0JoYkhCb1lTd2dZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCbVkwTjFkRzltWmlsY2JtUnBabVl1VWs1QkxrY3hMbVJVUVVjdWJtOUdRMk4xZEc5bVppQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKa2FXWm1YMGN4TG1SVVFVZGZSekV1TW1rdVpGUkJSMTkyYzE5SE1TNHlhUzVFVFZOUExuUnpkbHdpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jR0ZrYWlBOElHRnNjR2hoS1Z4dUl5TWpJeU1qSXlNakl5TWpYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgzQXRibDlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNJaWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptUTNWMGIyWm1JRDBnTUM0eUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVmhjSWlrcEpUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJsWVd0SlJDQTlJSEJoYzNSbEtHTm9jbTl0TVN3Z2MzUmhjblF4TENCemRHRnlkRElzSUhObGNDQTlJRndpWDF3aUtTbGNibHh1WEc1Y2JpTWdkR1Z0Y0RJZ1kyOXVkR0ZwYm5NZ1oyVnVaWE1nWm5KdmJTQm5jbTkxY0NBeExDQXlMQ0ExTENBNElHRnVaQ0JzYjI5d0lHTnZkVzUwYzF4dUkyTmhiR04xYkdGMGFXNW5JR1JwWm1ZZ2MyTnZjbVVnWVc1a0lHeHZaekptWXlCa2FYTjBjbWxpZFhScGIyNGdZbUZ6WldRZ2IyNGdjQzF1SUc1MWJXSmxjbk5jYm5KbGMzVnNkRVJwY2lBOExTQm9aWEpsS0Z3aUxpNHZMaTR2Y21WemRXeDBYQ0lwWEc1Y2JuUmxiWEF5SUR3dElISmxZV1JTUkZNb2FHVnlaU2h5WlhOMWJIUkVhWElzSUZ3aVoyVnVaVjlzYjI5d1gyeHBibXN1Y21SelhDSXBLVnh1WEc1Y2JuQnVUM1psY2pnZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIUnZkR0ZzSUQ0OUlEZ3BLU1JuWlc1bFhHNXdiazkyWlhJMklEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaDBiM1JoYkNBK1BTQTJMQ0IwYjNSaGJDQThJRGdwS1NSblpXNWxYRzV3Yms5MlpYSTBJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWgwYjNSaGJDQStQU0EwTENCMGIzUmhiQ0E4SURZcEtTUm5aVzVsWEc1d2JrOTJaWEl5SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loMGIzUmhiQ0ErUFNBeUxDQjBiM1JoYkNBOElEUXBLU1JuWlc1bFhHNXdiazkyWlhJd0lEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaDBiM1JoYkNBOElESXBLU1JuWlc1bFhHNWNibHh1WEc0akl5QkVhWFpwWkdsdVp5Qm5aVzVsY3lCcGJuUnZJR2R5YjNWd2MxeHVkR1Z0Y0NBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsbVpsOWtWRUZIWDBSTlUwOHNJR1JwYzNSaGJtTmxMQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0J0WldGdUtHUnBabVpmWkZSQlIxOUVUVk5QS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzFsWVc1ZlpHbHpkR0Z1WTJVZ1BTQnRaV0Z1S0dScGMzUmhibU5sS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzVjYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbVJwWm1aZlJ6RXVaRlJCUjE5SE1TNHlhUzVrVkVGSFgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibHh1YldGNFRHOW5Na1pESUQwZ01seHVYRzUwWlcxd0lEd3RJR3hsWm5SZmFtOXBiaWgwWlcxd0xDQmthV1ptTGxKT1FTd2dZbmtnUFNCaktGd2laMlZ1WlZ3aUlEMGdYQ0psYm5ObGJXSnNYMmRsYm1WZmFXUmNJaWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG1iR0ZuSUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCa2FXWm1MbEpPUVM1SE1TNWtWRUZISkdWdWMyVnRZbXhmWjJWdVpWOXBaQ3dnWENJeVJFOVhUbHdpTENCY0lqQk9UMXdpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYaEdiR0ZuSUQwZ0tHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnYldGNFRHOW5Na1pES1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyY3labU5OWVhnZ1BTQndiV0Y0S0hCdGFXNG9jMmh5YVc1clpXUmZiRzluTWtaRExDQnRZWGhNYjJjeVJrTXBMQ0F0YldGNFRHOW5Na1pES1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2htYkdGbktTQWxQaVZjYmlBZ1pISnZjRjl1WVNoemFISnBibXRsWkY5c2IyY3lSa01wWEc1Y2JuUmxiWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hjYmlBZ2NHNVBkbVZ5SUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCd2JrOTJaWEk0TENCY0luQnVUM1psY2poY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjRzVQZG1WeU5pd2dYQ0p3Yms5MlpYSTJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3Yms5MlpYSTBMQ0JjSW5CdVQzWmxjalJjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3Yms5MlpYSXlMQ0JjSW5CdVQzWmxjakpjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjRzVQZG1WeU1Dd2dYQ0p3Yms5MlpYSXdYQ0lzSUU1QktTa3BLU2twSUNVK0pWeHVJQ0JrY205d1gyNWhLSEJ1VDNabGNpbGNibUJnWUNKOSAtLT5cblxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUFJPLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzEuZFRBR192c19HMS5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUFJPLkcyLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzIuZFRBR192c19HMi5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKVxuIyMjIyMjIyMjIyMjXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgIHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSlcblxuXG5cbiMgdGVtcDIgY29udGFpbnMgZ2VuZXMgZnJvbSBncm91cCAxLCAyLCA1LCA4IGFuZCBsb29wIGNvdW50c1xuI2NhbGN1bGF0aW5nIGRpZmYgc2NvcmUgYW5kIGxvZzJmYyBkaXN0cmlidXRpb24gYmFzZWQgb24gcC1uIG51bWJlcnNcbnJlc3VsdERpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0XFwpXG5cbnRlbXAyIDwtIHJlYWRSRFMoaGVyZShyZXN1bHREaXIsIFxcZ2VuZV9sb29wX2xpbmsucmRzXFwpKVxuXG5cbnBuT3ZlcjggPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDgpKSRnZW5lXG5wbk92ZXI2IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSA2LCB0b3RhbCA8IDgpKSRnZW5lXG5wbk92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSA0LCB0b3RhbCA8IDYpKSRnZW5lXG5wbk92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSAyLCB0b3RhbCA8IDQpKSRnZW5lXG5wbk92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA8IDIpKSRnZW5lXG5cblxuXG4jIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwc1xudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9kVEFHX0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSxcbiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSxcbiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcblxubWF4TG9nMkZDID0gMlxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBkaWZmLlJOQS5HMS5kVEFHJGVuc2VtYmxfZ2VuZV9pZCwgXFwyRE9XTlxcLCBcXDBOT1xcKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKSAlPiVcbiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShcbiAgcG5PdmVyID0gaWZlbHNlKGdlbmUgJWluJSBwbk92ZXI4LCBcXHBuT3ZlcjhcXCxcbiAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyNiwgXFxwbk92ZXI2XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwbk92ZXI0LCBcXHBuT3ZlcjRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwbk92ZXIyLCBcXHBuT3ZlcjJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyMCwgXFxwbk92ZXIwXFwsIE5BKSkpKSkpICU+JVxuICBkcm9wX25hKHBuT3ZlcilcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
name <- \chromo_cons_annoHierarchy\

alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
############
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))



# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers
resultDir <- here(\../../result\)

temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))


pnOver8 <- (temp2 %>% dplyr::filter(total >= 8))$gene
pnOver6 <- (temp2 %>% dplyr::filter(total >= 6, total < 8))$gene
pnOver4 <- (temp2 %>% dplyr::filter(total >= 4, total < 6))$gene
pnOver2 <- (temp2 %>% dplyr::filter(total >= 2, total < 4))$gene
pnOver0 <- (temp2 %>% dplyr::filter(total < 2))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% diff.RNA.G1.dTAG$ensembl_gene_id, \2DOWN\, \0NO\),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                log2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag) %>%
  drop_na(shrinked_log2FC)

temp <- temp %>% dplyr::mutate(
  pnOver = ifelse(gene %in% pnOver8, \pnOver8\,
                  ifelse(gene %in% pnOver6, \pnOver6\,
                         ifelse(gene %in% pnOver4, \pnOver4\,
                                ifelse(gene %in% pnOver2, \pnOver2\,
                                       ifelse(gene %in% pnOver0, \pnOver0\, NA)))))) %>%
  drop_na(pnOver)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzVoYkhCb1lTQThMU0F3TGpBMVhHNW1ZME4xZEc5bVppQThMU0F3TGpWY2JtUnBabVl1VUZKUExrY3hMbVJVUVVjZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWkdsbVpsOUhNVWN5TG1SVVFVZGZSekV1WkZSQlIxOTJjMTlITVM1RVRWTlBYMUJTVDNObGNTNTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEJoWkdvZ1BDQmhiSEJvWVN3Z1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJtWTBOMWRHOW1aaWxjYm1ScFptWXVVRkpQTGtjeUxtUlVRVWNnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaR2xtWmw5SE1VY3lMbVJVUVVkZlJ6SXVaRlJCUjE5MmMxOUhNaTVFVFZOUFgxQlNUM05sY1M1MGMzWmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIQmhaR29nUENCaGJIQm9ZU3dnWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQm1ZME4xZEc5bVppbGNibVJwWm1ZdVVrNUJMa2N4TG1SVVFVY2dQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1pHbG1abDlITVM1a1ZFRkhYMGN4TGpKcExtUlVRVWRmZG5OZlJ6RXVNbWt1UkUxVFR5NTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEJoWkdvZ1BDQmhiSEJvWVN3Z1lXSnpLSE5vY21sdWEyVmtYMnh2WnpKR1F5a2dQaUJtWTBOMWRHOW1aaWxjYm1ScFptWXVVazVCTGtjeExtUlVRVWN1Ym05R1EyTjFkRzltWmlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhrYVdabVgwY3hMbVJVUVVkZlJ6RXVNbWt1WkZSQlIxOTJjMTlITVM0eWFTNUVUVk5QTG5SemRseGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NHRmthaUE4SUdGc2NHaGhLVnh1SXlNakl5TWpJeU1qSXlNalhHNW5aVzVsUVc1dWIwUmhkR0VnUEMwZ2JHOWhaRXh2YjNCQmJtNXZSR0YwWVNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDNBdGJsOWxibk5sYldKc1RHbHpkQzUwYzNaY1hDa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2FXWm1RM1YwYjJabUlEMGdNQzR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhibTV2VEdsemRDQTlJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWaGNYQ2twSlQ0bElGeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBjM1JoYm1ObElEMGdjM1JoY25ReUlDMGdjM1JoY25ReExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQmxZV3RKUkNBOUlIQmhjM1JsS0dOb2NtOXRNU3dnYzNSaGNuUXhMQ0J6ZEdGeWRESXNJSE5sY0NBOUlGeGNYMXhjS1NsY2JseHVYRzVjYmlNZ2RHVnRjRElnWTI5dWRHRnBibk1nWjJWdVpYTWdabkp2YlNCbmNtOTFjQ0F4TENBeUxDQTFMQ0E0SUdGdVpDQnNiMjl3SUdOdmRXNTBjMXh1STJOaGJHTjFiR0YwYVc1bklHUnBabVlnYzJOdmNtVWdZVzVrSUd4dlp6Sm1ZeUJrYVhOMGNtbGlkWFJwYjI0Z1ltRnpaV1FnYjI0Z2NDMXVJRzUxYldKbGNuTmNibkpsYzNWc2RFUnBjaUE4TFNCb1pYSmxLRnhjTGk0dkxpNHZjbVZ6ZFd4MFhGd3BYRzVjYm5SbGJYQXlJRHd0SUhKbFlXUlNSRk1vYUdWeVpTaHlaWE4xYkhSRWFYSXNJRnhjWjJWdVpWOXNiMjl3WDJ4cGJtc3VjbVJ6WEZ3cEtWeHVYRzVjYm5CdVQzWmxjamdnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hSdmRHRnNJRDQ5SURncEtTUm5aVzVsWEc1d2JrOTJaWEkySUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loMGIzUmhiQ0ErUFNBMkxDQjBiM1JoYkNBOElEZ3BLU1JuWlc1bFhHNXdiazkyWlhJMElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaDBiM1JoYkNBK1BTQTBMQ0IwYjNSaGJDQThJRFlwS1NSblpXNWxYRzV3Yms5MlpYSXlJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWgwYjNSaGJDQStQU0F5TENCMGIzUmhiQ0E4SURRcEtTUm5aVzVsWEc1d2JrOTJaWEl3SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loMGIzUmhiQ0E4SURJcEtTUm5aVzVsWEc1Y2JseHVYRzRqSXlCRWFYWnBaR2x1WnlCblpXNWxjeUJwYm5SdklHZHliM1Z3YzF4dWRHVnRjQ0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2xtWmw5a1ZFRkhYMFJOVTA4c0lHUnBjM1JoYm1ObExDQm5aVzVsS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaHRaV0Z1WDJScFptWmZjMk52Y21VZ1BTQnRaV0Z1S0dScFptWmZaRlJCUjE5RVRWTlBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHMWxZVzVmWkdsemRHRnVZMlVnUFNCdFpXRnVLR1JwYzNSaGJtTmxLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDNW5jbTkxY0hNZ1BTQW5aSEp2Y0NjcFhHNWNibVJwWm1ZdVVrNUJJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHUnBabVpmUnpFdVpGUkJSMTlITVM0eWFTNWtWRUZIWDNaelgwY3hMakpwTGtSTlUwOHVkSE4yWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hsYm5ObGJXSnNYMmRsYm1WZmFXUXNJR3h2WnpKR2IyeGtRMmhoYm1kbExDQnphSEpwYm10bFpGOXNiMmN5UmtNc0lIQmhaR29zSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlNsY2JseHViV0Y0VEc5bk1rWkRJRDBnTWx4dVhHNTBaVzF3SUR3dElHeGxablJmYW05cGJpaDBaVzF3TENCa2FXWm1MbEpPUVN3Z1lua2dQU0JqS0Z4Y1oyVnVaVnhjSUQwZ1hGeGxibk5sYldKc1gyZGxibVZmYVdSY1hDa3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobWJHRm5JRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JrYVdabUxsSk9RUzVITVM1a1ZFRkhKR1Z1YzJWdFlteGZaMlZ1WlY5cFpDd2dYRnd5UkU5WFRseGNMQ0JjWERCT1QxeGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhoR2JHRm5JRDBnS0dGaWN5aHphSEpwYm10bFpGOXNiMmN5UmtNcElENGdiV0Y0VEc5bk1rWkRLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJjeVptTk5ZWGdnUFNCd2JXRjRLSEJ0YVc0b2MyaHlhVzVyWldSZmJHOW5Na1pETENCdFlYaE1iMmN5UmtNcExDQXRiV0Y0VEc5bk1rWkRLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZZWEp5WVc1blpTaG1iR0ZuS1NBbFBpVmNiaUFnWkhKdmNGOXVZU2h6YUhKcGJtdGxaRjlzYjJjeVJrTXBYRzVjYm5SbGJYQWdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnY0c1UGRtVnlJRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3Yms5MlpYSTRMQ0JjWEhCdVQzWmxjamhjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NHNVBkbVZ5Tml3Z1hGeHdiazkyWlhJMlhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndiazkyWlhJMExDQmNYSEJ1VDNabGNqUmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndiazkyWlhJeUxDQmNYSEJ1VDNabGNqSmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NHNVBkbVZ5TUN3Z1hGeHdiazkyWlhJd1hGd3NJRTVCS1NrcEtTa3BJQ1UrSlZ4dUlDQmtjbTl3WDI1aEtIQnVUM1psY2lsY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmLlBSTy5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzFHMi5kVEFHX0cxLmRUQUdfdnNfRzEuRE1TT19QUk9zZXEudHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlBSTy5HMi5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzFHMi5kVEFHX0cyLmRUQUdfdnNfRzIuRE1TT19QUk9zZXEudHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSlcbiMjIyMjIyMjIyMjI1xuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICBwZWFrSUQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSBcXF9cXCkpXG5cblxuXG4jIHRlbXAyIGNvbnRhaW5zIGdlbmVzIGZyb20gZ3JvdXAgMSwgMiwgNSwgOCBhbmQgbG9vcCBjb3VudHNcbiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzXG5yZXN1bHREaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdFxcKVxuXG50ZW1wMiA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rLnJkc1xcKSlcblxuXG5wbk92ZXI4IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSA4KSkkZ2VuZVxucG5PdmVyNiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gNiwgdG90YWwgPCA4KSkkZ2VuZVxucG5PdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gNCwgdG90YWwgPCA2KSkkZ2VuZVxucG5PdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gMiwgdG90YWwgPCA0KSkkZ2VuZVxucG5PdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPCAyKSkkZ2VuZVxuXG5cblxuIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHNcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksXG4gICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksXG4gICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5cbm1heExvZzJGQyA9IDJcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZGlmZi5STkEuRzEuZFRBRyRlbnNlbWJsX2dlbmVfaWQsIFxcMkRPV05cXCwgXFwwTk9cXCksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgbG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZykgJT4lXG4gIGRyb3BfbmEoc2hyaW5rZWRfbG9nMkZDKVxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHBuT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcG5PdmVyOCwgXFxwbk92ZXI4XFwsXG4gICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBuT3ZlcjYsIFxccG5PdmVyNlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyNCwgXFxwbk92ZXI0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyMiwgXFxwbk92ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBuT3ZlcjAsIFxccG5PdmVyMFxcLCBOQSkpKSkpKSAlPiVcbiAgZHJvcF9uYShwbk92ZXIpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUFJPLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzEuZFRBR192c19HMS5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUFJPLkcyLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMUcyLmRUQUdfRzIuZFRBR192c19HMi5ETVNPX1BST3NlcS50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKVxuIyMjIyMjIyMjIyMjXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgIHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSlcblxuXG5cbiMgdGVtcDIgY29udGFpbnMgZ2VuZXMgZnJvbSBncm91cCAxLCAyLCA1LCA4IGFuZCBsb29wIGNvdW50c1xuI2NhbGN1bGF0aW5nIGRpZmYgc2NvcmUgYW5kIGxvZzJmYyBkaXN0cmlidXRpb24gYmFzZWQgb24gcC1uIG51bWJlcnNcbnJlc3VsdERpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0XFwpXG5cbnRlbXAyIDwtIHJlYWRSRFMoaGVyZShyZXN1bHREaXIsIFxcZ2VuZV9sb29wX2xpbmsucmRzXFwpKVxuXG5cbnBuT3ZlcjggPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDgpKSRnZW5lXG5wbk92ZXI2IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSA2LCB0b3RhbCA8IDgpKSRnZW5lXG5wbk92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSA0LCB0b3RhbCA8IDYpKSRnZW5lXG5wbk92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSAyLCB0b3RhbCA8IDQpKSRnZW5lXG5wbk92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA8IDIpKSRnZW5lXG5cblxuXG4jIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwc1xudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9kVEFHX0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSxcbiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSxcbiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcblxubWF4TG9nMkZDID0gMlxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBkaWZmLlJOQS5HMS5kVEFHJGVuc2VtYmxfZ2VuZV9pZCwgXFwyRE9XTlxcLCBcXDBOT1xcKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKSAlPiVcbiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShcbiAgcG5PdmVyID0gaWZlbHNlKGdlbmUgJWluJSBwbk92ZXI4LCBcXHBuT3ZlcjhcXCxcbiAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyNiwgXFxwbk92ZXI2XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwbk92ZXI0LCBcXHBuT3ZlcjRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwbk92ZXIyLCBcXHBuT3ZlcjJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyMCwgXFxwbk92ZXIwXFwsIE5BKSkpKSkpICU+JVxuICBkcm9wX25hKHBuT3ZlcilcbmBgYFxuYGBgIn0= -->

```r
```r
name <- \chromo_cons_annoHierarchy\

alpha <- 0.05
fcCutoff <- 0.5
diff.PRO.G1.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G1.dTAG_vs_G1.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.PRO.G2.dTAG <- fread(here(refDir, \diff_G1G2.dTAG_G2.dTAG_vs_G2.DMSO_PROseq.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
############
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))



# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers
resultDir <- here(\../../result\)

temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))


pnOver8 <- (temp2 %>% dplyr::filter(total >= 8))$gene
pnOver6 <- (temp2 %>% dplyr::filter(total >= 6, total < 8))$gene
pnOver4 <- (temp2 %>% dplyr::filter(total >= 4, total < 6))$gene
pnOver2 <- (temp2 %>% dplyr::filter(total >= 2, total < 4))$gene
pnOver0 <- (temp2 %>% dplyr::filter(total < 2))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% diff.RNA.G1.dTAG$ensembl_gene_id, \2DOWN\, \0NO\),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                log2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag) %>%
  drop_na(shrinked_log2FC)

temp <- temp %>% dplyr::mutate(
  pnOver = ifelse(gene %in% pnOver8, \pnOver8\,
                  ifelse(gene %in% pnOver6, \pnOver6\,
                         ifelse(gene %in% pnOver4, \pnOver4\,
                                ifelse(gene %in% pnOver2, \pnOver2\,
                                       ifelse(gene %in% pnOver0, \pnOver0\, NA)))))) %>%
  drop_na(pnOver)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Loop number per gene: P-X

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVSMDltYVdkRWFYSWdQQzBnYUdWeVpTaG1hV2RFYVhJc0lGd2lMaTR2UjA5Y0lpbGNibWRsZEVkUEtGd2ljRzVQZG1WeU9Gd2lMQ0JIVDJacFowUnBjaXdnY0c1UGRtVnlPQ2xjYm1kbGRFZFBLRndpY0c1UGRtVnlObHdpTENCSFQyWnBaMFJwY2l3Z2NHNVBkbVZ5TmlsY2JtZGxkRWRQS0Z3aWNHNVBkbVZ5TkZ3aUxDQkhUMlpwWjBScGNpd2djRzVQZG1WeU5DbGNibWRsZEVkUEtGd2ljRzVQZG1WeU1sd2lMQ0JIVDJacFowUnBjaXdnY0c1UGRtVnlNaWxjYm1kbGRFZFBLRndpY0c1UGRtVnlNRndpTENCSFQyWnBaMFJwY2l3Z2NHNVBkbVZ5TUNsY2JseHVJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qWEc1SFR6QXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hsYm5KcFkyaEhUeWhuWlc1bElEMGdjRzVQZG1WeU1Dd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY0lrVk9VMFZOUWt4Y0lpd2diMjUwSUQwZ1hDSkNVRndpS1NsY2JrZFBNaTVrWmlBOExTQmhjeTVrWVhSaExtWnlZVzFsS0dWdWNtbGphRWRQS0dkbGJtVWdQU0J3Yms5MlpYSXlMQ0JQY21kRVlpQTlJRzl5Wnk1TmJTNWxaeTVrWWl3Z2EyVjVWSGx3WlNBOUlGd2lSVTVUUlUxQ1RGd2lMQ0J2Ym5RZ1BTQmNJa0pRWENJcEtWeHVSMDgwTG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCdVQzWmxjalFzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYQ0pGVGxORlRVSk1YQ0lzSUc5dWRDQTlJRndpUWxCY0lpa3BYRzVIVHpZdVpHWWdQQzBnWVhNdVpHRjBZUzVtY21GdFpTaGxibkpwWTJoSFR5aG5aVzVsSUQwZ2NHNVBkbVZ5Tml3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lLU2xjYmtkUE9DNWtaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLR1Z1Y21samFFZFBLR2RsYm1VZ1BTQndiazkyWlhJNExDQlBjbWRFWWlBOUlHOXlaeTVOYlM1bFp5NWtZaXdnYTJWNVZIbHdaU0E5SUZ3aVJVNVRSVTFDVEZ3aUxDQnZiblFnUFNCY0lrSlFYQ0lwS1Z4dVhHNWNibk4xWW5ObGREQWdQQzBnUjA4d0xtUm1JQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLRWxFTENCRVpYTmpjbWx3ZEdsdmJpd2dSMlZ1WlZKaGRHbHZMQ0J3TG1Ga2FuVnpkQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JjSW5CdVQzWmxjakJjSWlrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9YRzRnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGdJQ0FnSUNBaklGTndiR2wwSUhSb1pTQnpkSEpwYm1jZ1lua2dYQ0l2WENKY2JpQWdJQ0FnSUhCaGNuUnpJRHd0SUhWdWJHbHpkQ2h6ZEhKemNHeHBkQ2g0TENCY0lpOWNJaWtwWEc0Z0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlBZ0lDQWdJR0Z6TG01MWJXVnlhV01vY0dGeWRITmJNVjBwSUM4Z1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeVhTbGNiaUFnSUNCOUtWeHVJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JuTjFZbk5sZERJZ1BDMGdSMDh5TG1SbUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtFbEVMQ0JFWlhOamNtbHdkR2x2Yml3Z1IyVnVaVkpoZEdsdkxDQndMbUZrYW5WemRDa2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aM0p2ZFhBZ1BTQmNJbkJ1VDNabGNqSmNJaWtnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1hHNGdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0Z0lDQWdJQ0FqSUZOd2JHbDBJSFJvWlNCemRISnBibWNnWW5rZ1hDSXZYQ0pjYmlBZ0lDQWdJSEJoY25SeklEd3RJSFZ1YkdsemRDaHpkSEp6Y0d4cGRDaDRMQ0JjSWk5Y0lpa3BYRzRnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaUFnSUNBZ0lHRnpMbTUxYldWeWFXTW9jR0Z5ZEhOYk1WMHBJQzhnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN5WFNsY2JpQWdJQ0I5S1Z4dUlDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYm5OMVluTmxkRFFnUEMwZ1IwODBMbVJtSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VsRUxDQkVaWE5qY21sd2RHbHZiaXdnUjJWdVpWSmhkR2x2TENCd0xtRmthblZ6ZENrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCY0luQnVUM1psY2pSY0lpa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRnSUNBZ0lDQWpJRk53YkdsMElIUm9aU0J6ZEhKcGJtY2dZbmtnWENJdlhDSmNiaUFnSUNBZ0lIQmhjblJ6SUR3dElIVnViR2x6ZENoemRISnpjR3hwZENoNExDQmNJaTljSWlrcFhHNGdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpQWdJQ0FnSUdGekxtNTFiV1Z5YVdNb2NHRnlkSE5iTVYwcElDOGdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3lYU2xjYmlBZ0lDQjlLVnh1SUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNibk4xWW5ObGREWWdQQzBnUjA4MkxtUm1JQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLRWxFTENCRVpYTmpjbWx3ZEdsdmJpd2dSMlZ1WlZKaGRHbHZMQ0J3TG1Ga2FuVnpkQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JjSW5CdVQzWmxjalpjSWlrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9YRzRnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGdJQ0FnSUNBaklGTndiR2wwSUhSb1pTQnpkSEpwYm1jZ1lua2dYQ0l2WENKY2JpQWdJQ0FnSUhCaGNuUnpJRHd0SUhWdWJHbHpkQ2h6ZEhKemNHeHBkQ2g0TENCY0lpOWNJaWtwWEc0Z0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlBZ0lDQWdJR0Z6TG01MWJXVnlhV01vY0dGeWRITmJNVjBwSUM4Z1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeVhTbGNiaUFnSUNCOUtWeHVJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JuTjFZbk5sZERnZ1BDMGdSMDg0TG1SbUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtFbEVMQ0JFWlhOamNtbHdkR2x2Yml3Z1IyVnVaVkpoZEdsdkxDQndMbUZrYW5WemRDa2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aM0p2ZFhBZ1BTQmNJbkJ1VDNabGNqaGNJaWtnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1hHNGdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0Z0lDQWdJQ0FqSUZOd2JHbDBJSFJvWlNCemRISnBibWNnWW5rZ1hDSXZYQ0pjYmlBZ0lDQWdJSEJoY25SeklEd3RJSFZ1YkdsemRDaHpkSEp6Y0d4cGRDaDRMQ0JjSWk5Y0lpa3BYRzRnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaUFnSUNBZ0lHRnpMbTUxYldWeWFXTW9jR0Z5ZEhOYk1WMHBJQzhnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN5WFNsY2JpQWdJQ0I5S1Z4dUlDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmx4dVhHNUhUMnhwYzNRZ1BDMGdabUZqZEc5eUtHTW9YQ0pIVHpvd01EQTJNemszWENJc0lGd2lSMDg2TURBd09ETTRNRndpTENCY0lrZFBPakF3TWpJMk1UTmNJaXdnWENKSFR6b3dNRE0wTkRjd1hDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKSFR6b3dNREUyTURVMVhDSXNJRndpUjA4Nk1EQXdOek00T1Z3aUxDQmNJa2RQT2pBd05EZzFOakpjSWl3Z1hDSkhUem93TURRMU1UWTFYQ0lzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lSMDg2TURBM01qQXdNVndpTENCY0lrZFBPakF3TURjMU1UZGNJaXdnWENKSFR6b3dNRFE0TnpBMVhDSXBLVnh1WEc1a1lYUmhJRHd0SUdKcGJtUmZjbTkzY3loaWFXNWtYM0p2ZDNNb1ltbHVaRjl5YjNkektITjFZbk5sZERBc0lITjFZbk5sZERJcExDQnpkV0p6WlhRMEtTd2djM1ZpYzJWME9Da2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvU1VRZ0pXbHVKU0JIVDJ4cGMzUXBYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCRVpYTmpjbWx3ZEdsdmJpd2dZMjlzYjNJZ1BTQndMbUZrYW5WemRDd2djMmw2WlNBOUlHZHlLU2tnS3lCY2JpQWdaMlZ2YlY5d2IybHVkQ2dwSUNzZ2RHaGxiV1ZmWW5jb0tTQXJYRzRnSUhOallXeGxYMk52Ykc5eVgyZHlZV1JwWlc1MEtHeHZkeUE5SUZ3aWNtVmtYQ0lzSUdocFoyZ2dQU0JjSW1Kc2RXVmNJaXdnYkdsdGFYUnpJRDBnWXlnd0xDQXdMakExS1NrZ0sxeHVJQ0J6WTJGc1pWOXphWHBsWDJOdmJuUnBiblZ2ZFhNb2NtRnVaMlVnUFNCaktEQXNJRE1wS1NBclhHNGdJR3hoWW5Nb2VDQTlJRTVWVEV3c0lIa2dQU0JPVlV4TUtTQXJYRzRnSUhSb1pXMWxLR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3NJQ0FqSUZObGRDQmhlR2x6SUhSbGVIUWdjMmw2WlZ4dUlDQWdJQ0FnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0hOcGVtVWdQU0EyS1N3Z0l5QlRaWFFnWVhocGN5QjBhWFJzWlNCemFYcGxJQ2hwWmlCdWIzUWdjbVZ0YjNabFpDbGNiaUFnSUNBZ0lDQWdiR1ZuWlc1a0xuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9jMmw2WlNBOUlEWXBMQ0FqSUZObGRDQnNaV2RsYm1RZ2RHVjRkQ0J6YVhwbFhHNGdJQ0FnSUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3BJRnh1WEc1bWFXeGxUbUZ0WlNBOExTQm9aWEpsS0dacFowUnBjaXdnWENJdUxsd2lMQ0JjSWtkUFhDSXNJRndpUjA5ZlozSnZkWEJ6WDNCdVhDSXBYRzVvWldsbmFIUWdQU0F5WEc1M2FXUjBhQ0E5SURNdU0xeHVjM1puYkdsMFpTaHdZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuR09maWdEaXIgPC0gaGVyZShmaWdEaXIsIFxcLi4vR09cXClcbmdldEdPKFxccG5PdmVyOFxcLCBHT2ZpZ0RpciwgcG5PdmVyOClcbmdldEdPKFxccG5PdmVyNlxcLCBHT2ZpZ0RpciwgcG5PdmVyNilcbmdldEdPKFxccG5PdmVyNFxcLCBHT2ZpZ0RpciwgcG5PdmVyNClcbmdldEdPKFxccG5PdmVyMlxcLCBHT2ZpZ0RpciwgcG5PdmVyMilcbmdldEdPKFxccG5PdmVyMFxcLCBHT2ZpZ0RpciwgcG5PdmVyMClcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5HTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcG5PdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbkdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXIyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBuT3ZlcjQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG5HTzYuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcG5PdmVyNiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbkdPOC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXI4LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuXG5cbnN1YnNldDAgPC0gR08wLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBuT3ZlcjBcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbnN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBuT3ZlcjJcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbnN1YnNldDQgPC0gR080LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBuT3ZlcjRcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbnN1YnNldDYgPC0gR082LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBuT3ZlcjZcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbnN1YnNldDggPC0gR084LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBuT3ZlcjhcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcblxuXG5HT2xpc3QgPC0gZmFjdG9yKGMoXFxHTzowMDA2Mzk3XFwsIFxcR086MDAwODM4MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDM0NDcwXFwsXG4gICAgICAgICAgICAgICAgICAgXFxHTzowMDE2MDU1XFwsIFxcR086MDAwNzM4OVxcLCBcXEdPOjAwNDg1NjJcXCwgXFxHTzowMDQ1MTY1XFwsIFxuICAgICAgICAgICAgICAgICAgIFxcR086MDA3MjAwMVxcLCBcXEdPOjAwMDc1MTdcXCwgXFxHTzowMDQ4NzA1XFwpKVxuXG5kYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3MoYmluZF9yb3dzKHN1YnNldDAsIHN1YnNldDIpLCBzdWJzZXQ0KSwgc3Vic2V0OCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBEZXNjcmlwdGlvbiwgY29sb3IgPSBwLmFkanVzdCwgc2l6ZSA9IGdyKSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArXG4gIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsdWVcXCwgbGltaXRzID0gYygwLCAwLjA1KSkgK1xuICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAsIDMpKSArXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArXG4gIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZClcbiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBsZWdlbmQgdGV4dCBzaXplXG4gICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFwuLlxcLCBcXEdPXFwsIFxcR09fZ3JvdXBzX3BuXFwpXG5oZWlnaHQgPSAyXG53aWR0aCA9IDMuM1xuc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
GOfigDir <- here(figDir, \../GO\)
getGO(\pnOver8\, GOfigDir, pnOver8)
getGO(\pnOver6\, GOfigDir, pnOver6)
getGO(\pnOver4\, GOfigDir, pnOver4)
getGO(\pnOver2\, GOfigDir, pnOver2)
getGO(\pnOver0\, GOfigDir, pnOver0)

#####################
GO0.df <- as.data.frame(enrichGO(gene = pnOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO2.df <- as.data.frame(enrichGO(gene = pnOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO4.df <- as.data.frame(enrichGO(gene = pnOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO6.df <- as.data.frame(enrichGO(gene = pnOver6, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO8.df <- as.data.frame(enrichGO(gene = pnOver8, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))


subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver0\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))
subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver2\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))
subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver4\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))
subset6 <- GO6.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver6\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))
subset8 <- GO8.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver8\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))


GOlist <- factor(c(\GO:0006397\, \GO:0008380\, \GO:0022613\, \GO:0034470\,
                   \GO:0016055\, \GO:0007389\, \GO:0048562\, \GO:0045165\, 
                   \GO:0072001\, \GO:0007517\, \GO:0048705\))

data <- bind_rows(bind_rows(bind_rows(subset0, subset2), subset4), subset8) %>%
  dplyr::filter(ID %in% GOlist)

p <- ggplot(data, aes(x = group, y = Description, color = p.adjust, size = gr)) + 
  geom_point() + theme_bw() +
  scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
  scale_size_continuous(range = c(0, 3)) +
  labs(x = NULL, y = NULL) +
  theme(axis.text = element_text(size = 6),  # Set axis text size
        axis.title = element_text(size = 6), # Set axis title size (if not removed)
        legend.text = element_text(size = 6), # Set legend text size
        legend.title = element_text(size = 6)) 

fileName <- here(figDir, \..\, \GO\, \GO_groups_pn\)
height = 2
width = 3.3
svglite(paste0(fileName, \.svg\), height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVIwOW1hV2RFYVhJZ1BDMGdhR1Z5WlNobWFXZEVhWElzSUZ4Y0xpNHZSMDljWENsY2JtZGxkRWRQS0Z4Y2NHNVBkbVZ5T0Z4Y0xDQkhUMlpwWjBScGNpd2djRzVQZG1WeU9DbGNibWRsZEVkUEtGeGNjRzVQZG1WeU5seGNMQ0JIVDJacFowUnBjaXdnY0c1UGRtVnlOaWxjYm1kbGRFZFBLRnhjY0c1UGRtVnlORnhjTENCSFQyWnBaMFJwY2l3Z2NHNVBkbVZ5TkNsY2JtZGxkRWRQS0Z4Y2NHNVBkbVZ5TWx4Y0xDQkhUMlpwWjBScGNpd2djRzVQZG1WeU1pbGNibWRsZEVkUEtGeGNjRzVQZG1WeU1GeGNMQ0JIVDJacFowUnBjaXdnY0c1UGRtVnlNQ2xjYmx4dUl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpYRzVIVHpBdVpHWWdQQzBnWVhNdVpHRjBZUzVtY21GdFpTaGxibkpwWTJoSFR5aG5aVzVsSUQwZ2NHNVBkbVZ5TUN3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjWEVWT1UwVk5Ra3hjWEN3Z2IyNTBJRDBnWEZ4Q1VGeGNLU2xjYmtkUE1pNWtaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLR1Z1Y21samFFZFBLR2RsYm1VZ1BTQndiazkyWlhJeUxDQlBjbWRFWWlBOUlHOXlaeTVOYlM1bFp5NWtZaXdnYTJWNVZIbHdaU0E5SUZ4Y1JVNVRSVTFDVEZ4Y0xDQnZiblFnUFNCY1hFSlFYRndwS1Z4dVIwODBMbVJtSUR3dElHRnpMbVJoZEdFdVpuSmhiV1VvWlc1eWFXTm9SMDhvWjJWdVpTQTlJSEJ1VDNabGNqUXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hGeEZUbE5GVFVKTVhGd3NJRzl1ZENBOUlGeGNRbEJjWENrcFhHNUhUell1WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNobGJuSnBZMmhIVHloblpXNWxJRDBnY0c1UGRtVnlOaXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0tTbGNia2RQT0M1a1ppQThMU0JoY3k1a1lYUmhMbVp5WVcxbEtHVnVjbWxqYUVkUEtHZGxibVVnUFNCd2JrOTJaWEk0TENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRnhjUlU1VFJVMUNURnhjTENCdmJuUWdQU0JjWEVKUVhGd3BLVnh1WEc1Y2JuTjFZbk5sZERBZ1BDMGdSMDh3TG1SbUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtFbEVMQ0JFWlhOamNtbHdkR2x2Yml3Z1IyVnVaVkpoZEdsdkxDQndMbUZrYW5WemRDa2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aM0p2ZFhBZ1BTQmNYSEJ1VDNabGNqQmNYQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1hHNGdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0Z0lDQWdJQ0FqSUZOd2JHbDBJSFJvWlNCemRISnBibWNnWW5rZ1hGd3ZYRnhjYmlBZ0lDQWdJSEJoY25SeklEd3RJSFZ1YkdsemRDaHpkSEp6Y0d4cGRDaDRMQ0JjWEM5Y1hDa3BYRzRnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaUFnSUNBZ0lHRnpMbTUxYldWeWFXTW9jR0Z5ZEhOYk1WMHBJQzhnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN5WFNsY2JpQWdJQ0I5S1Z4dUlDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYm5OMVluTmxkRElnUEMwZ1IwOHlMbVJtSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VsRUxDQkVaWE5qY21sd2RHbHZiaXdnUjJWdVpWSmhkR2x2TENCd0xtRmthblZ6ZENrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCY1hIQnVUM1psY2pKY1hDa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRnSUNBZ0lDQWpJRk53YkdsMElIUm9aU0J6ZEhKcGJtY2dZbmtnWEZ3dlhGeGNiaUFnSUNBZ0lIQmhjblJ6SUR3dElIVnViR2x6ZENoemRISnpjR3hwZENoNExDQmNYQzljWENrcFhHNGdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpQWdJQ0FnSUdGekxtNTFiV1Z5YVdNb2NHRnlkSE5iTVYwcElDOGdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3lYU2xjYmlBZ0lDQjlLVnh1SUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNibk4xWW5ObGREUWdQQzBnUjA4MExtUm1JQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLRWxFTENCRVpYTmpjbWx3ZEdsdmJpd2dSMlZ1WlZKaGRHbHZMQ0J3TG1Ga2FuVnpkQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JjWEhCdVQzWmxjalJjWENrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9YRzRnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGdJQ0FnSUNBaklGTndiR2wwSUhSb1pTQnpkSEpwYm1jZ1lua2dYRnd2WEZ4Y2JpQWdJQ0FnSUhCaGNuUnpJRHd0SUhWdWJHbHpkQ2h6ZEhKemNHeHBkQ2g0TENCY1hDOWNYQ2twWEc0Z0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlBZ0lDQWdJR0Z6TG01MWJXVnlhV01vY0dGeWRITmJNVjBwSUM4Z1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeVhTbGNiaUFnSUNCOUtWeHVJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JuTjFZbk5sZERZZ1BDMGdSMDgyTG1SbUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtFbEVMQ0JFWlhOamNtbHdkR2x2Yml3Z1IyVnVaVkpoZEdsdkxDQndMbUZrYW5WemRDa2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aM0p2ZFhBZ1BTQmNYSEJ1VDNabGNqWmNYQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1hHNGdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0Z0lDQWdJQ0FqSUZOd2JHbDBJSFJvWlNCemRISnBibWNnWW5rZ1hGd3ZYRnhjYmlBZ0lDQWdJSEJoY25SeklEd3RJSFZ1YkdsemRDaHpkSEp6Y0d4cGRDaDRMQ0JjWEM5Y1hDa3BYRzRnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaUFnSUNBZ0lHRnpMbTUxYldWeWFXTW9jR0Z5ZEhOYk1WMHBJQzhnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN5WFNsY2JpQWdJQ0I5S1Z4dUlDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYm5OMVluTmxkRGdnUEMwZ1IwODRMbVJtSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VsRUxDQkVaWE5qY21sd2RHbHZiaXdnUjJWdVpWSmhkR2x2TENCd0xtRmthblZ6ZENrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCY1hIQnVUM1psY2poY1hDa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRnSUNBZ0lDQWpJRk53YkdsMElIUm9aU0J6ZEhKcGJtY2dZbmtnWEZ3dlhGeGNiaUFnSUNBZ0lIQmhjblJ6SUR3dElIVnViR2x6ZENoemRISnpjR3hwZENoNExDQmNYQzljWENrcFhHNGdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpQWdJQ0FnSUdGekxtNTFiV1Z5YVdNb2NHRnlkSE5iTVYwcElDOGdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3lYU2xjYmlBZ0lDQjlLVnh1SUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNibHh1WEc1SFQyeHBjM1FnUEMwZ1ptRmpkRzl5S0dNb1hGeEhUem93TURBMk16azNYRndzSUZ4Y1IwODZNREF3T0RNNE1GeGNMQ0JjWEVkUE9qQXdNakkyTVROY1hDd2dYRnhIVHpvd01ETTBORGN3WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnhIVHpvd01ERTJNRFUxWEZ3c0lGeGNSMDg2TURBd056TTRPVnhjTENCY1hFZFBPakF3TkRnMU5qSmNYQ3dnWEZ4SFR6b3dNRFExTVRZMVhGd3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y1IwODZNREEzTWpBd01WeGNMQ0JjWEVkUE9qQXdNRGMxTVRkY1hDd2dYRnhIVHpvd01EUTROekExWEZ3cEtWeHVYRzVrWVhSaElEd3RJR0pwYm1SZmNtOTNjeWhpYVc1a1gzSnZkM01vWW1sdVpGOXliM2R6S0hOMVluTmxkREFzSUhOMVluTmxkRElwTENCemRXSnpaWFEwS1N3Z2MzVmljMlYwT0NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9TVVFnSldsdUpTQkhUMnhwYzNRcFhHNWNibkFnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JFWlhOamNtbHdkR2x2Yml3Z1kyOXNiM0lnUFNCd0xtRmthblZ6ZEN3Z2MybDZaU0E5SUdkeUtTa2dLeUJjYmlBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnZEdobGJXVmZZbmNvS1NBclhHNGdJSE5qWVd4bFgyTnZiRzl5WDJkeVlXUnBaVzUwS0d4dmR5QTlJRnhjY21Wa1hGd3NJR2hwWjJnZ1BTQmNYR0pzZFdWY1hDd2diR2x0YVhSeklEMGdZeWd3TENBd0xqQTFLU2tnSzF4dUlDQnpZMkZzWlY5emFYcGxYMk52Ym5ScGJuVnZkWE1vY21GdVoyVWdQU0JqS0RBc0lETXBLU0FyWEc0Z0lHeGhZbk1vZUNBOUlFNVZURXdzSUhrZ1BTQk9WVXhNS1NBclhHNGdJSFJvWlcxbEtHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTmlrc0lDQWpJRk5sZENCaGVHbHpJSFJsZUhRZ2MybDZaVnh1SUNBZ0lDQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTJLU3dnSXlCVFpYUWdZWGhwY3lCMGFYUnNaU0J6YVhwbElDaHBaaUJ1YjNRZ2NtVnRiM1psWkNsY2JpQWdJQ0FnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb2MybDZaU0E5SURZcExDQWpJRk5sZENCc1pXZGxibVFnZEdWNGRDQnphWHBsWEc0Z0lDQWdJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTmlrcElGeHVYRzVtYVd4bFRtRnRaU0E4TFNCb1pYSmxLR1pwWjBScGNpd2dYRnd1TGx4Y0xDQmNYRWRQWEZ3c0lGeGNSMDlmWjNKdmRYQnpYM0J1WEZ3cFhHNW9aV2xuYUhRZ1BTQXlYRzUzYVdSMGFDQTlJRE11TTF4dWMzWm5iR2wwWlNod1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1N3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbkdPZmlnRGlyIDwtIGhlcmUoZmlnRGlyLCBcXC4uL0dPXFwpXG5nZXRHTyhcXHBuT3ZlcjhcXCwgR09maWdEaXIsIHBuT3ZlcjgpXG5nZXRHTyhcXHBuT3ZlcjZcXCwgR09maWdEaXIsIHBuT3ZlcjYpXG5nZXRHTyhcXHBuT3ZlcjRcXCwgR09maWdEaXIsIHBuT3ZlcjQpXG5nZXRHTyhcXHBuT3ZlcjJcXCwgR09maWdEaXIsIHBuT3ZlcjIpXG5nZXRHTyhcXHBuT3ZlcjBcXCwgR09maWdEaXIsIHBuT3ZlcjApXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuR08wLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBuT3ZlcjAsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG5HTzIuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcG5PdmVyMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbkdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuR082LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBuT3ZlcjYsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG5HTzguZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcG5PdmVyOCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcblxuXG5zdWJzZXQwIDwtIEdPMC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxwbk92ZXIwXFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4gICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4gICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4gICAgfSlcbiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG5zdWJzZXQyIDwtIEdPMi5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxwbk92ZXIyXFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4gICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4gICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4gICAgfSlcbiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG5zdWJzZXQ0IDwtIEdPNC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxwbk92ZXI0XFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4gICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4gICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4gICAgfSlcbiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG5zdWJzZXQ2IDwtIEdPNi5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxwbk92ZXI2XFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4gICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4gICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4gICAgfSlcbiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG5zdWJzZXQ4IDwtIEdPOC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxwbk92ZXI4XFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4gICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4gICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4gICAgfSlcbiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG5cblxuR09saXN0IDwtIGZhY3RvcihjKFxcR086MDAwNjM5N1xcLCBcXEdPOjAwMDgzODBcXCwgXFxHTzowMDIyNjEzXFwsIFxcR086MDAzNDQ3MFxcLFxuICAgICAgICAgICAgICAgICAgIFxcR086MDAxNjA1NVxcLCBcXEdPOjAwMDczODlcXCwgXFxHTzowMDQ4NTYyXFwsIFxcR086MDA0NTE2NVxcLCBcbiAgICAgICAgICAgICAgICAgICBcXEdPOjAwNzIwMDFcXCwgXFxHTzowMDA3NTE3XFwsIFxcR086MDA0ODcwNVxcKSlcblxuZGF0YSA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQwLCBzdWJzZXQyKSwgc3Vic2V0NCksIHN1YnNldDgpICU+JVxuICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gRGVzY3JpcHRpb24sIGNvbG9yID0gcC5hZGp1c3QsIHNpemUgPSBncikpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgK1xuICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibHVlXFwsIGxpbWl0cyA9IGMoMCwgMC4wNSkpICtcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLCAzKSkgK1xuICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGF4aXMgdGl0bGUgc2l6ZSAoaWYgbm90IHJlbW92ZWQpXG4gICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc19wblxcKVxuaGVpZ2h0ID0gMlxud2lkdGggPSAzLjNcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuR09maWdEaXIgPC0gaGVyZShmaWdEaXIsIFxcLi4vR09cXClcbmdldEdPKFxccG5PdmVyOFxcLCBHT2ZpZ0RpciwgcG5PdmVyOClcbmdldEdPKFxccG5PdmVyNlxcLCBHT2ZpZ0RpciwgcG5PdmVyNilcbmdldEdPKFxccG5PdmVyNFxcLCBHT2ZpZ0RpciwgcG5PdmVyNClcbmdldEdPKFxccG5PdmVyMlxcLCBHT2ZpZ0RpciwgcG5PdmVyMilcbmdldEdPKFxccG5PdmVyMFxcLCBHT2ZpZ0RpciwgcG5PdmVyMClcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5HTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcG5PdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbkdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXIyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBuT3ZlcjQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG5HTzYuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcG5PdmVyNiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbkdPOC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXI4LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuXG5cbnN1YnNldDAgPC0gR08wLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBuT3ZlcjBcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbnN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBuT3ZlcjJcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbnN1YnNldDQgPC0gR080LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBuT3ZlcjRcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbnN1YnNldDYgPC0gR082LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBuT3ZlcjZcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbnN1YnNldDggPC0gR084LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBuT3ZlcjhcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcblxuXG5HT2xpc3QgPC0gZmFjdG9yKGMoXFxHTzowMDA2Mzk3XFwsIFxcR086MDAwODM4MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDM0NDcwXFwsXG4gICAgICAgICAgICAgICAgICAgXFxHTzowMDE2MDU1XFwsIFxcR086MDAwNzM4OVxcLCBcXEdPOjAwNDg1NjJcXCwgXFxHTzowMDQ1MTY1XFwsIFxuICAgICAgICAgICAgICAgICAgIFxcR086MDA3MjAwMVxcLCBcXEdPOjAwMDc1MTdcXCwgXFxHTzowMDQ4NzA1XFwpKVxuXG5kYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3MoYmluZF9yb3dzKHN1YnNldDAsIHN1YnNldDIpLCBzdWJzZXQ0KSwgc3Vic2V0OCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBEZXNjcmlwdGlvbiwgY29sb3IgPSBwLmFkanVzdCwgc2l6ZSA9IGdyKSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArXG4gIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsdWVcXCwgbGltaXRzID0gYygwLCAwLjA1KSkgK1xuICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAsIDMpKSArXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArXG4gIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZClcbiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBsZWdlbmQgdGV4dCBzaXplXG4gICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFwuLlxcLCBcXEdPXFwsIFxcR09fZ3JvdXBzX3BuXFwpXG5oZWlnaHQgPSAyXG53aWR0aCA9IDMuM1xuc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
GOfigDir <- here(figDir, \../GO\)
getGO(\pnOver8\, GOfigDir, pnOver8)
getGO(\pnOver6\, GOfigDir, pnOver6)
getGO(\pnOver4\, GOfigDir, pnOver4)
getGO(\pnOver2\, GOfigDir, pnOver2)
getGO(\pnOver0\, GOfigDir, pnOver0)

#####################
GO0.df <- as.data.frame(enrichGO(gene = pnOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO2.df <- as.data.frame(enrichGO(gene = pnOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO4.df <- as.data.frame(enrichGO(gene = pnOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO6.df <- as.data.frame(enrichGO(gene = pnOver6, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO8.df <- as.data.frame(enrichGO(gene = pnOver8, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))


subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver0\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))
subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver2\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))
subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver4\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))
subset6 <- GO6.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver6\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))
subset8 <- GO8.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver8\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))


GOlist <- factor(c(\GO:0006397\, \GO:0008380\, \GO:0022613\, \GO:0034470\,
                   \GO:0016055\, \GO:0007389\, \GO:0048562\, \GO:0045165\, 
                   \GO:0072001\, \GO:0007517\, \GO:0048705\))

data <- bind_rows(bind_rows(bind_rows(subset0, subset2), subset4), subset8) %>%
  dplyr::filter(ID %in% GOlist)

p <- ggplot(data, aes(x = group, y = Description, color = p.adjust, size = gr)) + 
  geom_point() + theme_bw() +
  scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
  scale_size_continuous(range = c(0, 3)) +
  labs(x = NULL, y = NULL) +
  theme(axis.text = element_text(size = 6),  # Set axis text size
        axis.title = element_text(size = 6), # Set axis title size (if not removed)
        legend.text = element_text(size = 6), # Set legend text size
        legend.title = element_text(size = 6)) 

fileName <- here(figDir, \..\, \GO\, \GO_groups_pn\)
height = 2
width = 3.3
svglite(paste0(fileName, \.svg\), height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



### dTAG
#### Grouping with P-N number
##### Grouping

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdiazkyWlhJZ1BUMW5jbTkxY0RFcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3Yms5MlpYSWdQVDFuY205MWNESXBJQ2trYldWaGJsOWthV1ptWDNOamIzSmxYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzV3ZGpBeUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYQ0p3Yms5MlpYSXdYQ0lzSUZ3aWNHNVBkbVZ5TWx3aUtTd2dOU2xjYm5CMk1qUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjSW5CdVQzWmxjakpjSWl3Z1hDSndiazkyWlhJMFhDSXBMQ0ExS1Z4dWNIWTBOaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ3aWNHNVBkbVZ5TkZ3aUxDQmNJbkJ1VDNabGNqWmNJaWtzSURVcFhHNXdkakE0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hDSndiazkyWlhJd1hDSXNJRndpY0c1UGRtVnlPRndpS1N3Z05TbGNibkIyTWpnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNJbkJ1VDNabGNqSmNJaXdnWENKd2JrOTJaWEk0WENJcExDQTFLVnh1Y0hZME9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRndpY0c1UGRtVnlORndpTENCY0luQnVUM1psY2poY0lpa3NJRFVwWEc1d2RqWTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWENKd2JrOTJaWEkyWENJc0lGd2ljRzVQZG1WeU9Gd2lLU3dnTlNsY2JseHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJSEJ1VDNabGNpd2dlU0E5SUcxbFlXNWZaR2xtWmw5elkyOXlaU2twSUNzZ1oyVnZiVjkyYVc5c2FXNG9ZV1Z6S0dacGJHd2dQU0J3Yms5MlpYSXBMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBclhHNGdJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU1Td2diM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ2NHNVBkbVZ5S1N3Z1puVnVJRDBnYldWaGJpd2daMlZ2YlNBOUlGd2ljRzlwYm5SY0lpd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJRElzSUdacGJHd2dQU0JjSW5KbFpGd2lMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaWtnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xqSXBLMXh1SUNCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQXdMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkIyTURJNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCMk1ESXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkakkwT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3ZGpJMEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNIWTBOam9nWENJc0lHTnZiblpRZG1Gc2RXVW9jSFkwTmlrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk5qZzZJRndpTENCamIyNTJVSFpoYkhWbEtIQjJOamdwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3ZGpRNE9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2RqUTRLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSFl5T0RvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hZeU9Da3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJNRGc2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEIyTURncExDQmNJbHhjYmx3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektWeHVYRzRnSUZ4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2laR2xtWmxOamIzSmxYMkpoY25Cc2IzUmZjRzVIY205MWNGOWtWRUZIWDNaelgwUk5VMDljSWlsY2JtaGxhV2RvZENBOExTQXpYRzUzYVdSMGFDQThMU0F6WEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAyKSApJG1lYW5fZGlmZl9zY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucHYwMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjJcXCksIDUpXG5wdjI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwbk92ZXIyXFwsIFxccG5PdmVyNFxcKSwgNSlcbnB2NDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI2XFwpLCA1KVxucHYwOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjhcXCksIDUpXG5wdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwbk92ZXIyXFwsIFxccG5PdmVyOFxcKSwgNSlcbnB2NDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI4XFwpLCA1KVxucHY2OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyNlxcLCBcXHBuT3ZlcjhcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwbk92ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBuT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4yKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwYXN0ZTAoXFxwdjAyOiBcXCwgY29udlB2YWx1ZShwdjAyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNDogXFwsIGNvbnZQdmFsdWUocHYyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDY6IFxcLCBjb252UHZhbHVlKHB2NDYpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjY4OiBcXCwgY29udlB2YWx1ZShwdjY4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY0ODogXFwsIGNvbnZQdmFsdWUocHY0OCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBjb252UHZhbHVlKHB2MjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA4OiBcXCwgY29udlB2YWx1ZShwdjA4KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGRpZmZTY29yZV9iYXJwbG90X3BuR3JvdXBfZFRBR192c19ETVNPXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(pnOver ==group1) )$mean_diff_score
  distance2 <- (data %>% dplyr::filter(pnOver ==group2) )$mean_diff_score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

pv02 <- round(getPvalWilcox(temp, \pnOver0\, \pnOver2\), 5)
pv24 <- round(getPvalWilcox(temp, \pnOver2\, \pnOver4\), 5)
pv46 <- round(getPvalWilcox(temp, \pnOver4\, \pnOver6\), 5)
pv08 <- round(getPvalWilcox(temp, \pnOver0\, \pnOver8\), 5)
pv28 <- round(getPvalWilcox(temp, \pnOver2\, \pnOver8\), 5)
pv48 <- round(getPvalWilcox(temp, \pnOver4\, \pnOver8\), 5)
pv68 <- round(getPvalWilcox(temp, \pnOver6\, \pnOver8\), 5)


p <- ggplot(temp, aes(x = pnOver, y = mean_diff_score)) + geom_violin(aes(fill = pnOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = pnOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0.2)+
  annotate(\text\, x = 1, y = 0, label = paste0(\pv02: \, convPvalue(pv02), \\n\,
                                                \pv24: \, convPvalue(pv24), \\n\,
                                                \pv46: \, convPvalue(pv46), \\n\,
                                                \pv68: \, convPvalue(pv68), \\n\,
                                                \pv48: \, convPvalue(pv48), \\n\,
                                                \pv28: \, convPvalue(pv28), \\n\,
                                                \pv08: \, convPvalue(pv08), \\n\), 
           color = \black\, hjust = 0, size = 3)

  
fileName <- paste0(\diffScore_barplot_pnGroup_dTAG_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2JrOTJaWElnUFQxbmNtOTFjREVwSUNra2JXVmhibDlrYVdabVgzTmpiM0psWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdiazkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGdJSGRwYkNBOExTQjNhV3hqYjNndWRHVnpkQ2hrYVhOMFlXNWpaVEVzSUdScGMzUmhibU5sTWlsY2JpQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1ZlZ4dVhHNXdkakF5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hGeHdiazkyWlhJd1hGd3NJRnhjY0c1UGRtVnlNbHhjS1N3Z05TbGNibkIyTWpRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNYSEJ1VDNabGNqSmNYQ3dnWEZ4d2JrOTJaWEkwWEZ3cExDQTFLVnh1Y0hZME5pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRnhjY0c1UGRtVnlORnhjTENCY1hIQnVUM1psY2paY1hDa3NJRFVwWEc1d2RqQTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWEZ4d2JrOTJaWEl3WEZ3c0lGeGNjRzVQZG1WeU9GeGNLU3dnTlNsY2JuQjJNamdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TENCY1hIQnVUM1psY2pKY1hDd2dYRnh3Yms5MlpYSTRYRndwTENBMUtWeHVjSFkwT0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGeGNjRzVQZG1WeU5GeGNMQ0JjWEhCdVQzWmxjamhjWENrc0lEVXBYRzV3ZGpZNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYRnh3Yms5MlpYSTJYRndzSUZ4Y2NHNVBkbVZ5T0Z4Y0tTd2dOU2xjYmx4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlIQnVUM1psY2l3Z2VTQTlJRzFsWVc1ZlpHbG1abDl6WTI5eVpTa3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQndiazkyWlhJcExDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FyWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnY0c1UGRtVnlLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ4Y2NHOXBiblJjWEN3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNYSEpsWkZ4Y0xDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TGpJcEsxeHVJQ0JoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBd0xDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQjJNREk2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEIyTURJcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqSTBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdkakkwS1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hZME5qb2dYRndzSUdOdmJuWlFkbUZzZFdVb2NIWTBOaWtzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTmpnNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCMk5qZ3BMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdkalE0T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3ZGpRNEtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NIWXlPRG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSFl5T0Nrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk1EZzZJRnhjTENCamIyNTJVSFpoYkhWbEtIQjJNRGdwTENCY1hGeGNibHhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F6S1Z4dVhHNGdJRnh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y1pHbG1abE5qYjNKbFgySmhjbkJzYjNSZmNHNUhjbTkxY0Y5a1ZFRkhYM1p6WDBSTlUwOWNYQ2xjYm1obGFXZG9kQ0E4TFNBelhHNTNhV1IwYUNBOExTQXpYRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAyKSApJG1lYW5fZGlmZl9zY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucHYwMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjJcXCksIDUpXG5wdjI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwbk92ZXIyXFwsIFxccG5PdmVyNFxcKSwgNSlcbnB2NDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI2XFwpLCA1KVxucHYwOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjhcXCksIDUpXG5wdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwbk92ZXIyXFwsIFxccG5PdmVyOFxcKSwgNSlcbnB2NDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI4XFwpLCA1KVxucHY2OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyNlxcLCBcXHBuT3ZlcjhcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwbk92ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBuT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4yKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwYXN0ZTAoXFxwdjAyOiBcXCwgY29udlB2YWx1ZShwdjAyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNDogXFwsIGNvbnZQdmFsdWUocHYyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDY6IFxcLCBjb252UHZhbHVlKHB2NDYpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjY4OiBcXCwgY29udlB2YWx1ZShwdjY4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY0ODogXFwsIGNvbnZQdmFsdWUocHY0OCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBjb252UHZhbHVlKHB2MjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA4OiBcXCwgY29udlB2YWx1ZShwdjA4KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGRpZmZTY29yZV9iYXJwbG90X3BuR3JvdXBfZFRBR192c19ETVNPXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDEpICkkbWVhbl9kaWZmX3Njb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5wdjAyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwbk92ZXIwXFwsIFxccG5PdmVyMlxcKSwgNSlcbnB2MjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI0XFwpLCA1KVxucHY0NiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyNFxcLCBcXHBuT3ZlcjZcXCksIDUpXG5wdjA4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwbk92ZXIwXFwsIFxccG5PdmVyOFxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI4XFwpLCA1KVxucHY0OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyNFxcLCBcXHBuT3ZlcjhcXCksIDUpXG5wdjY4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwbk92ZXI2XFwsIFxccG5PdmVyOFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHBuT3ZlciwgeSA9IG1lYW5fZGlmZl9zY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwbk92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcG5PdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjIpK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHB2MDI6IFxcLCBjb252UHZhbHVlKHB2MDIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI0OiBcXCwgY29udlB2YWx1ZShwdjI0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY0NjogXFwsIGNvbnZQdmFsdWUocHY0NiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Njg6IFxcLCBjb252UHZhbHVlKHB2NjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjQ4OiBcXCwgY29udlB2YWx1ZShwdjQ4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyODogXFwsIGNvbnZQdmFsdWUocHYyOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDg6IFxcLCBjb252UHZhbHVlKHB2MDgpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcZGlmZlNjb3JlX2JhcnBsb3RfcG5Hcm91cF9kVEFHX3ZzX0RNU09cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(pnOver ==group1) )$mean_diff_score
  distance2 <- (data %>% dplyr::filter(pnOver ==group2) )$mean_diff_score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

pv02 <- round(getPvalWilcox(temp, \pnOver0\, \pnOver2\), 5)
pv24 <- round(getPvalWilcox(temp, \pnOver2\, \pnOver4\), 5)
pv46 <- round(getPvalWilcox(temp, \pnOver4\, \pnOver6\), 5)
pv08 <- round(getPvalWilcox(temp, \pnOver0\, \pnOver8\), 5)
pv28 <- round(getPvalWilcox(temp, \pnOver2\, \pnOver8\), 5)
pv48 <- round(getPvalWilcox(temp, \pnOver4\, \pnOver8\), 5)
pv68 <- round(getPvalWilcox(temp, \pnOver6\, \pnOver8\), 5)


p <- ggplot(temp, aes(x = pnOver, y = mean_diff_score)) + geom_violin(aes(fill = pnOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = pnOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0.2)+
  annotate(\text\, x = 1, y = 0, label = paste0(\pv02: \, convPvalue(pv02), \\n\,
                                                \pv24: \, convPvalue(pv24), \\n\,
                                                \pv46: \, convPvalue(pv46), \\n\,
                                                \pv68: \, convPvalue(pv68), \\n\,
                                                \pv48: \, convPvalue(pv48), \\n\,
                                                \pv28: \, convPvalue(pv28), \\n\,
                                                \pv08: \, convPvalue(pv08), \\n\), 
           color = \black\, hjust = 0, size = 3)

  
fileName <- paste0(\diffScore_barplot_pnGroup_dTAG_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### GO for each group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJMXh1SUdkbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvY0c1UGRtVnlJRDA5WjNKdmRYQXhLU0FwSkd4dlp6SkdiMnhrUTJoaGJtZGxYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2JrOTJaWElnUFQxbmNtOTFjRElwSUNra2JHOW5Na1p2YkdSRGFHRnVaMlZjYmlBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SUNCeVpYUjFjbTRvZDJsc0pIQXVkbUZzZFdVcFhHNTlYRzVjYm5SbGJYQkViM2R1SUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYkc5bk1rWnZiR1JEYUdGdVoyVWdQQ0F3S1Z4dUlGeHVjSFl3TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjSW5CdVQzWmxjakJjSWl3Z1hDSndiazkyWlhJeVhDSXBMQ0ExS1Z4dWNIWXdOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNJbkJ1VDNabGNqQmNJaXdnWENKd2JrOTJaWEkwWENJcExDQTFLVnh1Y0hZd05pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY0luQnVUM1psY2pCY0lpd2dYQ0p3Yms5MlpYSTJYQ0lwTENBMUtWeHVjSFl3T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjSW5CdVQzWmxjakJjSWl3Z1hDSndiazkyWlhJNFhDSXBMQ0ExS1Z4dWNIWXlOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNJbkJ1VDNabGNqSmNJaXdnWENKd2JrOTJaWEkwWENJcExDQTFLVnh1Y0hZeU5pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY0luQnVUM1psY2pKY0lpd2dYQ0p3Yms5MlpYSTJYQ0lwTENBMUtWeHVjSFl5T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjSW5CdVQzWmxjakpjSWl3Z1hDSndiazkyWlhJNFhDSXBMQ0ExS1Z4dWNIWTBOaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNJbkJ1VDNabGNqUmNJaXdnWENKd2JrOTJaWEkyWENJcExDQTFLVnh1Y0hZME9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY0luQnVUM1psY2pSY0lpd2dYQ0p3Yms5MlpYSTRYQ0lwTENBMUtWeHVjSFkyT0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjSW5CdVQzWmxjalpjSWl3Z1hDSndiazkyWlhJNFhDSXBMQ0ExS1Z4dVhHNWNibHh1WEc1d0lEd3RJR2RuY0d4dmRDaDBaVzF3Ukc5M2Jpd2dZV1Z6S0hnZ1BTQndiazkyWlhJc0lIa2dQU0JzYjJjeVJtOXNaRU5vWVc1blpTa3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQndiazkyWlhJcExDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FyWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnY0c1UGRtVnlLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNJbkpsWkZ3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1N0Y2JpQWdZVzV1YjNSaGRHVW9YQ0owWlhoMFhDSXNJSGdnUFNBeExDQjVJRDBnTFRBdU5Td2diR0ZpWld3Z1BTQndZWE4wWlRBb1hDSndkakF5T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3ZGpBeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSFl3TkRvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hZd05Da3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkIyTURZNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCMk1EWXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3ZGpBNE9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2RqQTRLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hZeU5Eb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NIWXlOQ2tzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk1qWTZJRndpTENCamIyNTJVSFpoYkhWbEtIQjJNallwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2RqSTRPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdkakk0S1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNIWTBOam9nWENJc0lHTnZiblpRZG1Gc2RXVW9jSFkwTmlrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJORGc2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEIyTkRncExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkalk0T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3ZGpZNEtTd2dYQ0pjWEc1Y0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ015a2dLeUJqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9MVEVzSURBcEtWeHVYRzRnSUZ4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2liRzluTWtaRFgySmhjbkJzYjNSZmNHNUhjbTkxY0Y5a1ZFRkhYM1p6WDBSTlUwOWZaRzkzYmx3aUtWeHVhR1ZwWjJoMElEd3RJRE5jYm5kcFpIUm9JRHd0SUROY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dVhHNWNiblJsYlhCVmNDQThMU0IwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHeHZaekpHYjJ4a1EyaGhibWRsSUQ0Z01DbGNiaUJjYm5CMk1ESWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdWWEFzSUZ3aWNHNVBkbVZ5TUZ3aUxDQmNJbkJ1VDNabGNqSmNJaWtzSURVcFhHNXdkakEwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNJbkJ1VDNabGNqQmNJaXdnWENKd2JrOTJaWEkwWENJcExDQTFLVnh1Y0hZd05pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlZjQ3dnWENKd2JrOTJaWEl3WENJc0lGd2ljRzVQZG1WeU5sd2lLU3dnTlNsY2JuQjJNRGdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VlhBc0lGd2ljRzVQZG1WeU1Gd2lMQ0JjSW5CdVQzWmxjamhjSWlrc0lEVXBYRzV3ZGpJMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjSW5CdVQzWmxjakpjSWl3Z1hDSndiazkyWlhJMFhDSXBMQ0ExS1Z4dWNIWXlOaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJWY0N3Z1hDSndiazkyWlhJeVhDSXNJRndpY0c1UGRtVnlObHdpS1N3Z05TbGNibkIyTWpnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1ZYQXNJRndpY0c1UGRtVnlNbHdpTENCY0luQnVUM1psY2poY0lpa3NJRFVwWEc1d2RqUTJJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY0luQnVUM1psY2pSY0lpd2dYQ0p3Yms5MlpYSTJYQ0lwTENBMUtWeHVjSFkwT0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVmNDd2dYQ0p3Yms5MlpYSTBYQ0lzSUZ3aWNHNVBkbVZ5T0Z3aUtTd2dOU2xjYm5CMk5qZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdWWEFzSUZ3aWNHNVBkbVZ5Tmx3aUxDQmNJbkJ1VDNabGNqaGNJaWtzSURVcFhHNWNibHh1WEc1Y2JuQWdQQzBnWjJkd2JHOTBLSFJsYlhCVmNDd2dZV1Z6S0hnZ1BTQndiazkyWlhJc0lIa2dQU0JzYjJjeVJtOXNaRU5vWVc1blpTa3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQndiazkyWlhJcExDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FyWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnY0c1UGRtVnlLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNJbkpsWkZ3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1N0Y2JpQWdZVzV1YjNSaGRHVW9YQ0owWlhoMFhDSXNJSGdnUFNBeExDQjVJRDBnTUM0MUxDQnNZV0psYkNBOUlIQmhjM1JsTUNoY0luQjJNREk2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEIyTURJcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkakEwT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3ZGpBMEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSFl3TmpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hZd05pa3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkIyTURnNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCMk1EZ3BMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3ZGpJME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2RqSTBLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hZeU5qb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NIWXlOaWtzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk1qZzZJRndpTENCamIyNTJVSFpoYkhWbEtIQjJNamdwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2RqUTJPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdkalEyS1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNIWTBPRG9nWENJc0lHTnZiblpRZG1Gc2RXVW9jSFkwT0Nrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJOamc2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEIyTmpncExDQmNJbHhjYmx3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektTQXJJR052YjNKa1gyTmhjblJsYzJsaGJpaDViR2x0SUQwZ1l5Z3dMQ0F4S1NsY2JseHVJQ0JjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0lteHZaekpHUTE5aVlYSndiRzkwWDNCdVIzSnZkWEJmWkZSQlIxOTJjMTlFVFZOUFgzVndYQ0lwWEc1b1pXbG5hSFFnUEMwZ00xeHVkMmxrZEdnZ1BDMGdNMXh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ3aWFXNWNJaXdnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuI1xuIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAxKSApJGxvZzJGb2xkQ2hhbmdlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnRlbXBEb3duIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKVxuIFxucHYwMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXIyXFwpLCA1KVxucHYwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI0XFwpLCA1KVxucHYwNiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI2XFwpLCA1KVxucHYwOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI4XFwpLCA1KVxucHYyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI0XFwpLCA1KVxucHYyNiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI2XFwpLCA1KVxucHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI4XFwpLCA1KVxucHY0NiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI2XFwpLCA1KVxucHY0OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI4XFwpLCA1KVxucHY2OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjZcXCwgXFxwbk92ZXI4XFwpLCA1KVxuXG5cblxuXG5wIDwtIGdncGxvdCh0ZW1wRG93biwgYWVzKHggPSBwbk92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwbk92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcG5PdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gLTAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwdjAyOiBcXCwgY29udlB2YWx1ZShwdjAyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYwNDogXFwsIGNvbnZQdmFsdWUocHYwNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDY6IFxcLCBjb252UHZhbHVlKHB2MDYpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA4OiBcXCwgY29udlB2YWx1ZShwdjA4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNDogXFwsIGNvbnZQdmFsdWUocHYyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjY6IFxcLCBjb252UHZhbHVlKHB2MjYpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgY29udlB2YWx1ZShwdjI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY0NjogXFwsIGNvbnZQdmFsdWUocHY0NiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDg6IFxcLCBjb252UHZhbHVlKHB2NDgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjY4OiBcXCwgY29udlB2YWx1ZShwdjY4KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEsIDApKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcG5Hcm91cF9kVEFHX3ZzX0RNU09fZG93blxcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMClcbiBcbnB2MDIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjJcXCksIDUpXG5wdjA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI0XFwpLCA1KVxucHYwNiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXIwXFwsIFxccG5PdmVyNlxcKSwgNSlcbnB2MDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjhcXCksIDUpXG5wdjI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI0XFwpLCA1KVxucHYyNiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXIyXFwsIFxccG5PdmVyNlxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMlxcLCBcXHBuT3ZlcjhcXCksIDUpXG5wdjQ2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI2XFwpLCA1KVxucHY0OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXI0XFwsIFxccG5PdmVyOFxcKSwgNSlcbnB2NjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyNlxcLCBcXHBuT3ZlcjhcXCksIDUpXG5cblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwbk92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwbk92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcG5PdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMC41LCBsYWJlbCA9IHBhc3RlMChcXHB2MDI6IFxcLCBjb252UHZhbHVlKHB2MDIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA0OiBcXCwgY29udlB2YWx1ZShwdjA0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYwNjogXFwsIGNvbnZQdmFsdWUocHYwNiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDg6IFxcLCBjb252UHZhbHVlKHB2MDgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI0OiBcXCwgY29udlB2YWx1ZShwdjI0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNjogXFwsIGNvbnZQdmFsdWUocHYyNiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBjb252UHZhbHVlKHB2MjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjQ2OiBcXCwgY29udlB2YWx1ZShwdjQ2KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY0ODogXFwsIGNvbnZQdmFsdWUocHY0OCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Njg6IFxcLCBjb252UHZhbHVlKHB2NjgpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSlcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BuR3JvdXBfZFRBR192c19ETVNPX3VwXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
#
 getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(pnOver ==group1) )$log2FoldChange
  distance2 <- (data %>% dplyr::filter(pnOver ==group2) )$log2FoldChange
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
 
pv02 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver2\), 5)
pv04 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver4\), 5)
pv06 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver6\), 5)
pv08 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver8\), 5)
pv24 <- round(getPvalWilcox(tempDown, \pnOver2\, \pnOver4\), 5)
pv26 <- round(getPvalWilcox(tempDown, \pnOver2\, \pnOver6\), 5)
pv28 <- round(getPvalWilcox(tempDown, \pnOver2\, \pnOver8\), 5)
pv46 <- round(getPvalWilcox(tempDown, \pnOver4\, \pnOver6\), 5)
pv48 <- round(getPvalWilcox(tempDown, \pnOver4\, \pnOver8\), 5)
pv68 <- round(getPvalWilcox(tempDown, \pnOver6\, \pnOver8\), 5)




p <- ggplot(tempDown, aes(x = pnOver, y = log2FoldChange)) + geom_violin(aes(fill = pnOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = pnOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)+
  annotate(\text\, x = 1, y = -0.5, label = paste0(\pv02: \, convPvalue(pv02), \\n\,
                                                   \pv04: \, convPvalue(pv04), \\n\,
                                                   \pv06: \, convPvalue(pv06), \\n\,
                                                   \pv08: \, convPvalue(pv08), \\n\,
                                                   \pv24: \, convPvalue(pv24), \\n\,
                                                   \pv26: \, convPvalue(pv26), \\n\,
                                                   \pv28: \, convPvalue(pv28), \\n\,
                                                   \pv46: \, convPvalue(pv46), \\n\,
                                                   \pv48: \, convPvalue(pv48), \\n\,
                                                   \pv68: \, convPvalue(pv68), \\n\), 
           color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(-1, 0))

  
fileName <- paste0(\log2FC_barplot_pnGroup_dTAG_vs_DMSO_down\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
 
pv02 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver2\), 5)
pv04 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver4\), 5)
pv06 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver6\), 5)
pv08 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver8\), 5)
pv24 <- round(getPvalWilcox(tempUp, \pnOver2\, \pnOver4\), 5)
pv26 <- round(getPvalWilcox(tempUp, \pnOver2\, \pnOver6\), 5)
pv28 <- round(getPvalWilcox(tempUp, \pnOver2\, \pnOver8\), 5)
pv46 <- round(getPvalWilcox(tempUp, \pnOver4\, \pnOver6\), 5)
pv48 <- round(getPvalWilcox(tempUp, \pnOver4\, \pnOver8\), 5)
pv68 <- round(getPvalWilcox(tempUp, \pnOver6\, \pnOver8\), 5)




p <- ggplot(tempUp, aes(x = pnOver, y = log2FoldChange)) + geom_violin(aes(fill = pnOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = pnOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)+
  annotate(\text\, x = 1, y = 0.5, label = paste0(\pv02: \, convPvalue(pv02), \\n\,
                                                   \pv04: \, convPvalue(pv04), \\n\,
                                                   \pv06: \, convPvalue(pv06), \\n\,
                                                   \pv08: \, convPvalue(pv08), \\n\,
                                                   \pv24: \, convPvalue(pv24), \\n\,
                                                   \pv26: \, convPvalue(pv26), \\n\,
                                                   \pv28: \, convPvalue(pv28), \\n\,
                                                   \pv46: \, convPvalue(pv46), \\n\,
                                                   \pv48: \, convPvalue(pv48), \\n\,
                                                   \pv68: \, convPvalue(pv68), \\n\), 
           color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_pnGroup_dTAG_vs_DMSO_up\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUkxeHVJR2RsZEZCMllXeFhhV3hqYjNnZ1BDMGdablZ1WTNScGIyNG9aR0YwWVN3Z1ozSnZkWEF4TENCbmNtOTFjRElwZTF4dUlDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jRzVQZG1WeUlEMDlaM0p2ZFhBeEtTQXBKR3h2WnpKR2IyeGtRMmhoYm1kbFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3Yms5MlpYSWdQVDFuY205MWNESXBJQ2trYkc5bk1rWnZiR1JEYUdGdVoyVmNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNWNiblJsYlhCRWIzZHVJRHd0SUhSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iRzluTWtadmJHUkRhR0Z1WjJVZ1BDQXdLVnh1SUZ4dWNIWXdNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNYSEJ1VDNabGNqQmNYQ3dnWEZ4d2JrOTJaWEl5WEZ3cExDQTFLVnh1Y0hZd05DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY1hIQnVUM1psY2pCY1hDd2dYRnh3Yms5MlpYSTBYRndwTENBMUtWeHVjSFl3TmlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjWEhCdVQzWmxjakJjWEN3Z1hGeHdiazkyWlhJMlhGd3BMQ0ExS1Z4dWNIWXdPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNYSEJ1VDNabGNqQmNYQ3dnWEZ4d2JrOTJaWEk0WEZ3cExDQTFLVnh1Y0hZeU5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY1hIQnVUM1psY2pKY1hDd2dYRnh3Yms5MlpYSTBYRndwTENBMUtWeHVjSFl5TmlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjWEhCdVQzWmxjakpjWEN3Z1hGeHdiazkyWlhJMlhGd3BMQ0ExS1Z4dWNIWXlPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNYSEJ1VDNabGNqSmNYQ3dnWEZ4d2JrOTJaWEk0WEZ3cExDQTFLVnh1Y0hZME5pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY1hIQnVUM1psY2pSY1hDd2dYRnh3Yms5MlpYSTJYRndwTENBMUtWeHVjSFkwT0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjWEhCdVQzWmxjalJjWEN3Z1hGeHdiazkyWlhJNFhGd3BMQ0ExS1Z4dWNIWTJPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNYSEJ1VDNabGNqWmNYQ3dnWEZ4d2JrOTJaWEk0WEZ3cExDQTFLVnh1WEc1Y2JseHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdSRzkzYml3Z1lXVnpLSGdnUFNCd2JrOTJaWElzSUhrZ1BTQnNiMmN5Um05c1pFTm9ZVzVuWlNrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCd2JrOTJaWElwTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdjRzVQZG1WeUtTd2dablZ1SUQwZ2JXVmhiaXdnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURJc0lHWnBiR3dnUFNCY1hISmxaRnhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLU3RjYmlBZ1lXNXViM1JoZEdVb1hGeDBaWGgwWEZ3c0lIZ2dQU0F4TENCNUlEMGdMVEF1TlN3Z2JHRmlaV3dnUFNCd1lYTjBaVEFvWEZ4d2RqQXlPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdkakF5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NIWXdORG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSFl3TkNrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQjJNRFk2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEIyTURZcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdkakE0T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3ZGpBNEtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSFl5TkRvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hZeU5Da3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTWpZNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCMk1qWXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3ZGpJNE9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod2RqSTRLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hZME5qb2dYRndzSUdOdmJuWlFkbUZzZFdVb2NIWTBOaWtzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk5EZzZJRnhjTENCamIyNTJVSFpoYkhWbEtIQjJORGdwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqWTRPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdkalk0S1N3Z1hGeGNYRzVjWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTXlrZ0t5QmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb0xURXNJREFwS1Z4dVhHNGdJRnh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y2JHOW5Na1pEWDJKaGNuQnNiM1JmY0c1SGNtOTFjRjlrVkVGSFgzWnpYMFJOVTA5ZlpHOTNibHhjS1Z4dWFHVnBaMmgwSUR3dElETmNibmRwWkhSb0lEd3RJRE5jYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibHh1WEc1Y2JuUmxiWEJWY0NBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0d4dlp6SkdiMnhrUTJoaGJtZGxJRDRnTUNsY2JpQmNibkIyTURJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1ZYQXNJRnhjY0c1UGRtVnlNRnhjTENCY1hIQnVUM1psY2pKY1hDa3NJRFVwWEc1d2RqQTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY1hIQnVUM1psY2pCY1hDd2dYRnh3Yms5MlpYSTBYRndwTENBMUtWeHVjSFl3TmlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVmNDd2dYRnh3Yms5MlpYSXdYRndzSUZ4Y2NHNVBkbVZ5Tmx4Y0tTd2dOU2xjYm5CMk1EZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdWWEFzSUZ4Y2NHNVBkbVZ5TUZ4Y0xDQmNYSEJ1VDNabGNqaGNYQ2tzSURVcFhHNXdkakkwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNYSEJ1VDNabGNqSmNYQ3dnWEZ4d2JrOTJaWEkwWEZ3cExDQTFLVnh1Y0hZeU5pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlZjQ3dnWEZ4d2JrOTJaWEl5WEZ3c0lGeGNjRzVQZG1WeU5seGNLU3dnTlNsY2JuQjJNamdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VlhBc0lGeGNjRzVQZG1WeU1seGNMQ0JjWEhCdVQzWmxjamhjWENrc0lEVXBYRzV3ZGpRMklEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjWEhCdVQzWmxjalJjWEN3Z1hGeHdiazkyWlhJMlhGd3BMQ0ExS1Z4dWNIWTBPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJWY0N3Z1hGeHdiazkyWlhJMFhGd3NJRnhjY0c1UGRtVnlPRnhjS1N3Z05TbGNibkIyTmpnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1ZYQXNJRnhjY0c1UGRtVnlObHhjTENCY1hIQnVUM1psY2poY1hDa3NJRFVwWEc1Y2JseHVYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtIUmxiWEJWY0N3Z1lXVnpLSGdnUFNCd2JrOTJaWElzSUhrZ1BTQnNiMmN5Um05c1pFTm9ZVzVuWlNrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCd2JrOTJaWElwTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdjRzVQZG1WeUtTd2dablZ1SUQwZ2JXVmhiaXdnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURJc0lHWnBiR3dnUFNCY1hISmxaRnhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLU3RjYmlBZ1lXNXViM1JoZEdVb1hGeDBaWGgwWEZ3c0lIZ2dQU0F4TENCNUlEMGdNQzQxTENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjWEhCMk1ESTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQjJNRElwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqQTBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdkakEwS1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NIWXdOam9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSFl3Tmlrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQjJNRGc2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEIyTURncExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdkakkwT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3ZGpJMEtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSFl5TmpvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hZeU5pa3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTWpnNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCMk1qZ3BMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3ZGpRMk9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod2RqUTJLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hZME9Eb2dYRndzSUdOdmJuWlFkbUZzZFdVb2NIWTBPQ2tzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk5qZzZJRnhjTENCamIyNTJVSFpoYkhWbEtIQjJOamdwTENCY1hGeGNibHhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F6S1NBcklHTnZiM0prWDJOaGNuUmxjMmxoYmloNWJHbHRJRDBnWXlnd0xDQXhLU2xjYmx4dUlDQmNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEd4dlp6SkdRMTlpWVhKd2JHOTBYM0J1UjNKdmRYQmZaRlJCUjE5MmMxOUVUVk5QWDNWd1hGd3BYRzVvWldsbmFIUWdQQzBnTTF4dWQybGtkR2dnUEMwZ00xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRnhjYVc1Y1hDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2twTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbiNcbiBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBuT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAyKSApJGxvZzJGb2xkQ2hhbmdlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG50ZW1wRG93biA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlIDwgMClcbiBcbnB2MDIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIwXFwsIFxccG5PdmVyMlxcKSwgNSlcbnB2MDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIwXFwsIFxccG5PdmVyNFxcKSwgNSlcbnB2MDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIwXFwsIFxccG5PdmVyNlxcKSwgNSlcbnB2MDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIwXFwsIFxccG5PdmVyOFxcKSwgNSlcbnB2MjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIyXFwsIFxccG5PdmVyNFxcKSwgNSlcbnB2MjYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIyXFwsIFxccG5PdmVyNlxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIyXFwsIFxccG5PdmVyOFxcKSwgNSlcbnB2NDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXI0XFwsIFxccG5PdmVyNlxcKSwgNSlcbnB2NDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXI0XFwsIFxccG5PdmVyOFxcKSwgNSlcbnB2NjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXI2XFwsIFxccG5PdmVyOFxcKSwgNSlcblxuXG5cblxucCA8LSBnZ3Bsb3QodGVtcERvd24sIGFlcyh4ID0gcG5PdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBuT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IC0wLjUsIGxhYmVsID0gcGFzdGUwKFxccHYwMjogXFwsIGNvbnZQdmFsdWUocHYwMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDQ6IFxcLCBjb252UHZhbHVlKHB2MDQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA2OiBcXCwgY29udlB2YWx1ZShwdjA2KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYwODogXFwsIGNvbnZQdmFsdWUocHYwOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjQ6IFxcLCBjb252UHZhbHVlKHB2MjQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI2OiBcXCwgY29udlB2YWx1ZShwdjI2KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyODogXFwsIGNvbnZQdmFsdWUocHYyOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDY6IFxcLCBjb252UHZhbHVlKHB2NDYpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjQ4OiBcXCwgY29udlB2YWx1ZShwdjQ4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY2ODogXFwsIGNvbnZQdmFsdWUocHY2OCksIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0xLCAwKSlcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BuR3JvdXBfZFRBR192c19ETVNPX2Rvd25cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG50ZW1wVXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA+IDApXG4gXG5wdjAyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXIyXFwpLCA1KVxucHYwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXIwXFwsIFxccG5PdmVyNFxcKSwgNSlcbnB2MDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjZcXCksIDUpXG5wdjA4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI4XFwpLCA1KVxucHYyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXIyXFwsIFxccG5PdmVyNFxcKSwgNSlcbnB2MjYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMlxcLCBcXHBuT3ZlcjZcXCksIDUpXG5wdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI4XFwpLCA1KVxucHY0NiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXI0XFwsIFxccG5PdmVyNlxcKSwgNSlcbnB2NDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyNFxcLCBcXHBuT3ZlcjhcXCksIDUpXG5wdjY4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjZcXCwgXFxwbk92ZXI4XFwpLCA1KVxuXG5cblxuXG5wIDwtIGdncGxvdCh0ZW1wVXAsIGFlcyh4ID0gcG5PdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBuT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwdjAyOiBcXCwgY29udlB2YWx1ZShwdjAyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYwNDogXFwsIGNvbnZQdmFsdWUocHYwNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDY6IFxcLCBjb252UHZhbHVlKHB2MDYpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA4OiBcXCwgY29udlB2YWx1ZShwdjA4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNDogXFwsIGNvbnZQdmFsdWUocHYyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjY6IFxcLCBjb252UHZhbHVlKHB2MjYpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgY29udlB2YWx1ZShwdjI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY0NjogXFwsIGNvbnZQdmFsdWUocHY0NiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDg6IFxcLCBjb252UHZhbHVlKHB2NDgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjY4OiBcXCwgY29udlB2YWx1ZShwdjY4KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfYmFycGxvdF9wbkdyb3VwX2RUQUdfdnNfRE1TT191cFxcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuI1xuIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAxKSApJGxvZzJGb2xkQ2hhbmdlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnRlbXBEb3duIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKVxuIFxucHYwMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXIyXFwpLCA1KVxucHYwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI0XFwpLCA1KVxucHYwNiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI2XFwpLCA1KVxucHYwOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI4XFwpLCA1KVxucHYyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI0XFwpLCA1KVxucHYyNiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI2XFwpLCA1KVxucHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI4XFwpLCA1KVxucHY0NiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI2XFwpLCA1KVxucHY0OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI4XFwpLCA1KVxucHY2OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjZcXCwgXFxwbk92ZXI4XFwpLCA1KVxuXG5cblxuXG5wIDwtIGdncGxvdCh0ZW1wRG93biwgYWVzKHggPSBwbk92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwbk92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcG5PdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gLTAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwdjAyOiBcXCwgY29udlB2YWx1ZShwdjAyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYwNDogXFwsIGNvbnZQdmFsdWUocHYwNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDY6IFxcLCBjb252UHZhbHVlKHB2MDYpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA4OiBcXCwgY29udlB2YWx1ZShwdjA4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNDogXFwsIGNvbnZQdmFsdWUocHYyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjY6IFxcLCBjb252UHZhbHVlKHB2MjYpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgY29udlB2YWx1ZShwdjI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY0NjogXFwsIGNvbnZQdmFsdWUocHY0NiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDg6IFxcLCBjb252UHZhbHVlKHB2NDgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjY4OiBcXCwgY29udlB2YWx1ZShwdjY4KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEsIDApKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcG5Hcm91cF9kVEFHX3ZzX0RNU09fZG93blxcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMClcbiBcbnB2MDIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjJcXCksIDUpXG5wdjA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI0XFwpLCA1KVxucHYwNiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXIwXFwsIFxccG5PdmVyNlxcKSwgNSlcbnB2MDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjhcXCksIDUpXG5wdjI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI0XFwpLCA1KVxucHYyNiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXIyXFwsIFxccG5PdmVyNlxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMlxcLCBcXHBuT3ZlcjhcXCksIDUpXG5wdjQ2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI2XFwpLCA1KVxucHY0OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXI0XFwsIFxccG5PdmVyOFxcKSwgNSlcbnB2NjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyNlxcLCBcXHBuT3ZlcjhcXCksIDUpXG5cblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwbk92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwbk92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcG5PdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMC41LCBsYWJlbCA9IHBhc3RlMChcXHB2MDI6IFxcLCBjb252UHZhbHVlKHB2MDIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA0OiBcXCwgY29udlB2YWx1ZShwdjA0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYwNjogXFwsIGNvbnZQdmFsdWUocHYwNiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDg6IFxcLCBjb252UHZhbHVlKHB2MDgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI0OiBcXCwgY29udlB2YWx1ZShwdjI0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNjogXFwsIGNvbnZQdmFsdWUocHYyNiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBjb252UHZhbHVlKHB2MjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjQ2OiBcXCwgY29udlB2YWx1ZShwdjQ2KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY0ODogXFwsIGNvbnZQdmFsdWUocHY0OCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Njg6IFxcLCBjb252UHZhbHVlKHB2NjgpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSlcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BuR3JvdXBfZFRBR192c19ETVNPX3VwXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
#
 getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(pnOver ==group1) )$log2FoldChange
  distance2 <- (data %>% dplyr::filter(pnOver ==group2) )$log2FoldChange
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
 
pv02 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver2\), 5)
pv04 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver4\), 5)
pv06 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver6\), 5)
pv08 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver8\), 5)
pv24 <- round(getPvalWilcox(tempDown, \pnOver2\, \pnOver4\), 5)
pv26 <- round(getPvalWilcox(tempDown, \pnOver2\, \pnOver6\), 5)
pv28 <- round(getPvalWilcox(tempDown, \pnOver2\, \pnOver8\), 5)
pv46 <- round(getPvalWilcox(tempDown, \pnOver4\, \pnOver6\), 5)
pv48 <- round(getPvalWilcox(tempDown, \pnOver4\, \pnOver8\), 5)
pv68 <- round(getPvalWilcox(tempDown, \pnOver6\, \pnOver8\), 5)




p <- ggplot(tempDown, aes(x = pnOver, y = log2FoldChange)) + geom_violin(aes(fill = pnOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = pnOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)+
  annotate(\text\, x = 1, y = -0.5, label = paste0(\pv02: \, convPvalue(pv02), \\n\,
                                                   \pv04: \, convPvalue(pv04), \\n\,
                                                   \pv06: \, convPvalue(pv06), \\n\,
                                                   \pv08: \, convPvalue(pv08), \\n\,
                                                   \pv24: \, convPvalue(pv24), \\n\,
                                                   \pv26: \, convPvalue(pv26), \\n\,
                                                   \pv28: \, convPvalue(pv28), \\n\,
                                                   \pv46: \, convPvalue(pv46), \\n\,
                                                   \pv48: \, convPvalue(pv48), \\n\,
                                                   \pv68: \, convPvalue(pv68), \\n\), 
           color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(-1, 0))

  
fileName <- paste0(\log2FC_barplot_pnGroup_dTAG_vs_DMSO_down\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
 
pv02 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver2\), 5)
pv04 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver4\), 5)
pv06 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver6\), 5)
pv08 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver8\), 5)
pv24 <- round(getPvalWilcox(tempUp, \pnOver2\, \pnOver4\), 5)
pv26 <- round(getPvalWilcox(tempUp, \pnOver2\, \pnOver6\), 5)
pv28 <- round(getPvalWilcox(tempUp, \pnOver2\, \pnOver8\), 5)
pv46 <- round(getPvalWilcox(tempUp, \pnOver4\, \pnOver6\), 5)
pv48 <- round(getPvalWilcox(tempUp, \pnOver4\, \pnOver8\), 5)
pv68 <- round(getPvalWilcox(tempUp, \pnOver6\, \pnOver8\), 5)




p <- ggplot(tempUp, aes(x = pnOver, y = log2FoldChange)) + geom_violin(aes(fill = pnOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = pnOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)+
  annotate(\text\, x = 1, y = 0.5, label = paste0(\pv02: \, convPvalue(pv02), \\n\,
                                                   \pv04: \, convPvalue(pv04), \\n\,
                                                   \pv06: \, convPvalue(pv06), \\n\,
                                                   \pv08: \, convPvalue(pv08), \\n\,
                                                   \pv24: \, convPvalue(pv24), \\n\,
                                                   \pv26: \, convPvalue(pv26), \\n\,
                                                   \pv28: \, convPvalue(pv28), \\n\,
                                                   \pv46: \, convPvalue(pv46), \\n\,
                                                   \pv48: \, convPvalue(pv48), \\n\,
                                                   \pv68: \, convPvalue(pv68), \\n\), 
           color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_pnGroup_dTAG_vs_DMSO_up\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



##### loop score

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUIwWlcxd01pQmpiMjUwWVdsdWN5Qm5aVzVsY3lCbWNtOXRJR2R5YjNWd0lERXNJRElzSURVc0lEZ2dZVzVrSUd4dmIzQWdZMjkxYm5SelhHNGpZMkZzWTNWc1lYUnBibWNnWkdsbVppQnpZMjl5WlNCaGJtUWdiRzluTW1aaklHUnBjM1J5YVdKMWRHbHZiaUJpWVhObFpDQnZiaUJ3TFc0Z2JuVnRZbVZ5YzF4dVhHNXdjMDkyWlhJMElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hNZ1BqMGdOQ2twSkdkbGJtVmNibkJ6VDNabGNqTWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2N5QStQU0F6TENCdWRXMWZjSE1nUENBMEtTa2taMlZ1WlZ4dWNITlBkbVZ5TWlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J6SUQ0OUlESXNJRzUxYlY5d2N5QThJRE1wS1NSblpXNWxYRzV3YzA5MlpYSXhJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNITWdQajBnTVN3Z2JuVnRYM0J6SUR3Z01pa3BKR2RsYm1WY2JuQnpUM1psY2pBZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y3lBOElERXBLU1JuWlc1bFhHNWNibHh1WEc0akl5QkVhWFpwWkdsdVp5Qm5aVzVsY3lCcGJuUnZJR2R5YjNWd2MxeHVkR1Z0Y0NBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsbVpsOWtWRUZIWDBSTlUwOHNJR1JwYzNSaGJtTmxMQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0J0WldGdUtHUnBabVpmWkZSQlIxOUVUVk5QS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzFsWVc1ZlpHbHpkR0Z1WTJVZ1BTQnRaV0Z1S0dScGMzUmhibU5sS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzVjYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbVJwWm1aZlJ6RXVaRlJCUjE5SE1TNHlhUzVrVkVGSFgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibHh1YldGNFRHOW5Na1pESUQwZ01seHVYRzUwWlcxd0lEd3RJR3hsWm5SZmFtOXBiaWgwWlcxd0xDQmthV1ptTGxKT1FTd2dZbmtnUFNCaktGd2laMlZ1WlZ3aUlEMGdYQ0psYm5ObGJXSnNYMmRsYm1WZmFXUmNJaWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG1iR0ZuSUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCa2FXWm1MbEpPUVM1SE1TNWtWRUZISkdWdWMyVnRZbXhmWjJWdVpWOXBaQ3dnWENJeVJFOVhUbHdpTENCY0lqQk9UMXdpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYaEdiR0ZuSUQwZ0tHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnYldGNFRHOW5Na1pES1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyY3labU5OWVhnZ1BTQndiV0Y0S0hCdGFXNG9jMmh5YVc1clpXUmZiRzluTWtaRExDQnRZWGhNYjJjeVJrTXBMQ0F0YldGNFRHOW5Na1pES1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2htYkdGbktTQWxQaVZjYmlBZ1pISnZjRjl1WVNoemFISnBibXRsWkY5c2IyY3lSa01wWEc1Y2JuUmxiWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hjYmlBZ2NITlBkbVZ5SUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCd2MwOTJaWEkwTENCY0luQnpUM1psY2pSY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjSE5QZG1WeU15d2dYQ0p3YzA5MlpYSXpYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSXlMQ0JjSW5CelQzWmxjakpjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSXhMQ0JjSW5CelQzWmxjakZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjSE5QZG1WeU1Dd2dYQ0p3YzA5MlpYSXdYQ0lzSUU1QktTa3BLU2twSUNVK0pWeHVJQ0JrY205d1gyNWhLSEJ6VDNabGNpbGNibHh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbiMgdGVtcDIgY29udGFpbnMgZ2VuZXMgZnJvbSBncm91cCAxLCAyLCA1LCA4IGFuZCBsb29wIGNvdW50c1xuI2NhbGN1bGF0aW5nIGRpZmYgc2NvcmUgYW5kIGxvZzJmYyBkaXN0cmlidXRpb24gYmFzZWQgb24gcC1uIG51bWJlcnNcblxucHNPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDQpKSRnZW5lXG5wc092ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMywgbnVtX3BzIDwgNCkpJGdlbmVcbnBzT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAyLCBudW1fcHMgPCAzKSkkZ2VuZVxucHNPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDEsIG51bV9wcyA8IDIpKSRnZW5lXG5wc092ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPCAxKSkkZ2VuZVxuXG5cblxuIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHNcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksXG4gICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksXG4gICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5cbm1heExvZzJGQyA9IDJcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZGlmZi5STkEuRzEuZFRBRyRlbnNlbWJsX2dlbmVfaWQsIFxcMkRPV05cXCwgXFwwTk9cXCksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgbG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZykgJT4lXG4gIGRyb3BfbmEoc2hyaW5rZWRfbG9nMkZDKVxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHBzT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcHNPdmVyNCwgXFxwc092ZXI0XFwsXG4gICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjMsIFxccHNPdmVyM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMiwgXFxwc092ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMSwgXFxwc092ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjAsIFxccHNPdmVyMFxcLCBOQSkpKSkpKSAlPiVcbiAgZHJvcF9uYShwc092ZXIpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% diff.RNA.G1.dTAG$ensembl_gene_id, \2DOWN\, \0NO\),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                log2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag) %>%
  drop_na(shrinked_log2FC)

temp <- temp %>% dplyr::mutate(
  psOver = ifelse(gene %in% psOver4, \psOver4\,
                  ifelse(gene %in% psOver3, \psOver3\,
                         ifelse(gene %in% psOver2, \psOver2\,
                                ifelse(gene %in% psOver1, \psOver1\,
                                       ifelse(gene %in% psOver0, \psOver0\, NA)))))) %>%
  drop_na(psOver)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QjBaVzF3TWlCamIyNTBZV2x1Y3lCblpXNWxjeUJtY205dElHZHliM1Z3SURFc0lESXNJRFVzSURnZ1lXNWtJR3h2YjNBZ1kyOTFiblJ6WEc0alkyRnNZM1ZzWVhScGJtY2daR2xtWmlCelkyOXlaU0JoYm1RZ2JHOW5NbVpqSUdScGMzUnlhV0oxZEdsdmJpQmlZWE5sWkNCdmJpQndMVzRnYm5WdFltVnljMXh1WEc1d2MwOTJaWEkwSUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSE1nUGowZ05Da3BKR2RsYm1WY2JuQnpUM1psY2pNZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y3lBK1BTQXpMQ0J1ZFcxZmNITWdQQ0EwS1Nra1oyVnVaVnh1Y0hOUGRtVnlNaUE4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQnpJRDQ5SURJc0lHNTFiVjl3Y3lBOElETXBLU1JuWlc1bFhHNXdjMDkyWlhJeElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hNZ1BqMGdNU3dnYm5WdFgzQnpJRHdnTWlrcEpHZGxibVZjYm5CelQzWmxjakFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjeUE4SURFcEtTUm5aVzVsWEc1Y2JseHVYRzRqSXlCRWFYWnBaR2x1WnlCblpXNWxjeUJwYm5SdklHZHliM1Z3YzF4dWRHVnRjQ0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2xtWmw5a1ZFRkhYMFJOVTA4c0lHUnBjM1JoYm1ObExDQm5aVzVsS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaHRaV0Z1WDJScFptWmZjMk52Y21VZ1BTQnRaV0Z1S0dScFptWmZaRlJCUjE5RVRWTlBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHMWxZVzVmWkdsemRHRnVZMlVnUFNCdFpXRnVLR1JwYzNSaGJtTmxLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDNW5jbTkxY0hNZ1BTQW5aSEp2Y0NjcFhHNWNibVJwWm1ZdVVrNUJJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHUnBabVpmUnpFdVpGUkJSMTlITVM0eWFTNWtWRUZIWDNaelgwY3hMakpwTGtSTlUwOHVkSE4yWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hsYm5ObGJXSnNYMmRsYm1WZmFXUXNJR3h2WnpKR2IyeGtRMmhoYm1kbExDQnphSEpwYm10bFpGOXNiMmN5UmtNc0lIQmhaR29zSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlNsY2JseHViV0Y0VEc5bk1rWkRJRDBnTWx4dVhHNTBaVzF3SUR3dElHeGxablJmYW05cGJpaDBaVzF3TENCa2FXWm1MbEpPUVN3Z1lua2dQU0JqS0Z4Y1oyVnVaVnhjSUQwZ1hGeGxibk5sYldKc1gyZGxibVZmYVdSY1hDa3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobWJHRm5JRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JrYVdabUxsSk9RUzVITVM1a1ZFRkhKR1Z1YzJWdFlteGZaMlZ1WlY5cFpDd2dYRnd5UkU5WFRseGNMQ0JjWERCT1QxeGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhoR2JHRm5JRDBnS0dGaWN5aHphSEpwYm10bFpGOXNiMmN5UmtNcElENGdiV0Y0VEc5bk1rWkRLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJjeVptTk5ZWGdnUFNCd2JXRjRLSEJ0YVc0b2MyaHlhVzVyWldSZmJHOW5Na1pETENCdFlYaE1iMmN5UmtNcExDQXRiV0Y0VEc5bk1rWkRLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZZWEp5WVc1blpTaG1iR0ZuS1NBbFBpVmNiaUFnWkhKdmNGOXVZU2h6YUhKcGJtdGxaRjlzYjJjeVJrTXBYRzVjYm5SbGJYQWdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnY0hOUGRtVnlJRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSTBMQ0JjWEhCelQzWmxjalJjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NITlBkbVZ5TXl3Z1hGeHdjMDkyWlhJelhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndjMDkyWlhJeUxDQmNYSEJ6VDNabGNqSmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndjMDkyWlhJeExDQmNYSEJ6VDNabGNqRmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NITlBkbVZ5TUN3Z1hGeHdjMDkyWlhJd1hGd3NJRTVCS1NrcEtTa3BJQ1UrSlZ4dUlDQmtjbTl3WDI1aEtIQnpUM1psY2lsY2JseHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG4jIHRlbXAyIGNvbnRhaW5zIGdlbmVzIGZyb20gZ3JvdXAgMSwgMiwgNSwgOCBhbmQgbG9vcCBjb3VudHNcbiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzXG5cbnBzT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSA0KSkkZ2VuZVxucHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDMsIG51bV9wcyA8IDQpKSRnZW5lXG5wc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMiwgbnVtX3BzIDwgMykpJGdlbmVcbnBzT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAxLCBudW1fcHMgPCAyKSkkZ2VuZVxucHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzIDwgMSkpJGdlbmVcblxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9kVEFHX0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGRpZmYuUk5BLkcxLmRUQUckZW5zZW1ibF9nZW5lX2lkLCBcXDJET1dOXFwsIFxcME5PXFwpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIGxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpICU+JVxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKFxuICBwc092ZXIgPSBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjQsIFxccHNPdmVyNFxcLFxuICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIzLCBcXHBzT3ZlcjNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjIsIFxccHNPdmVyMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjEsIFxccHNPdmVyMVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIwLCBcXHBzT3ZlcjBcXCwgTkEpKSkpKSkgJT4lXG4gIGRyb3BfbmEocHNPdmVyKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyB0ZW1wMiBjb250YWlucyBnZW5lcyBmcm9tIGdyb3VwIDEsIDIsIDUsIDggYW5kIGxvb3AgY291bnRzXG4jY2FsY3VsYXRpbmcgZGlmZiBzY29yZSBhbmQgbG9nMmZjIGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiBwLW4gbnVtYmVyc1xuXG5wc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gNCkpJGdlbmVcbnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZVxucHNPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDIsIG51bV9wcyA8IDMpKSRnZW5lXG5wc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMSwgbnVtX3BzIDwgMikpJGdlbmVcbnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lXG5cblxuXG4jIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwc1xudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9kVEFHX0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSxcbiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSxcbiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcblxubWF4TG9nMkZDID0gMlxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBkaWZmLlJOQS5HMS5kVEFHJGVuc2VtYmxfZ2VuZV9pZCwgXFwyRE9XTlxcLCBcXDBOT1xcKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKSAlPiVcbiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShcbiAgcHNPdmVyID0gaWZlbHNlKGdlbmUgJWluJSBwc092ZXI0LCBcXHBzT3ZlcjRcXCxcbiAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMywgXFxwc092ZXIzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIyLCBcXHBzT3ZlcjJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIxLCBcXHBzT3ZlcjFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMCwgXFxwc092ZXIwXFwsIE5BKSkpKSkpICU+JVxuICBkcm9wX25hKHBzT3ZlcilcblxuYGBgXG5gYGAifQ== -->

```r
```r
# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% diff.RNA.G1.dTAG$ensembl_gene_id, \2DOWN\, \0NO\),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                log2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag) %>%
  drop_na(shrinked_log2FC)

temp <- temp %>% dplyr::mutate(
  psOver = ifelse(gene %in% psOver4, \psOver4\,
                  ifelse(gene %in% psOver3, \psOver3\,
                         ifelse(gene %in% psOver2, \psOver2\,
                                ifelse(gene %in% psOver1, \psOver1\,
                                       ifelse(gene %in% psOver0, \psOver0\, NA)))))) %>%
  drop_na(psOver)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### log2FC

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVSMDltYVdkRWFYSWdQQzBnYUdWeVpTaG1hV2RFYVhJc0lGd2lMaTR2UjA5Y0lpbGNibHh1SXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNalhHNUhUekF1WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNobGJuSnBZMmhIVHloblpXNWxJRDBnY0hOUGRtVnlNQ3dnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUxDQnlaV0ZrWVdKc1pTQTlJRlJTVlVVcEtWeHVSMDh4TG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCelQzWmxjakVzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYQ0pGVGxORlRVSk1YQ0lzSUc5dWRDQTlJRndpUWxCY0lpd2djbVZoWkdGaWJHVWdQU0JVVWxWRktTbGNia2RQTWk1a1ppQThMU0JoY3k1a1lYUmhMbVp5WVcxbEtHVnVjbWxqYUVkUEtHZGxibVVnUFNCd2MwOTJaWEl5TENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRndpUlU1VFJVMUNURndpTENCdmJuUWdQU0JjSWtKUVhDSXNJSEpsWVdSaFlteGxJRDBnVkZKVlJTa3BYRzVIVHpNdVpHWWdQQzBnWVhNdVpHRjBZUzVtY21GdFpTaGxibkpwWTJoSFR5aG5aVzVsSUQwZ2NITlBkbVZ5TXl3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lMQ0J5WldGa1lXSnNaU0E5SUZSU1ZVVXBLVnh1UjA4MExtUm1JRHd0SUdGekxtUmhkR0V1Wm5KaGJXVW9aVzV5YVdOb1IwOG9aMlZ1WlNBOUlIQnpUM1psY2pRc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWENKRlRsTkZUVUpNWENJc0lHOXVkQ0E5SUZ3aVFsQmNJaXdnY21WaFpHRmliR1VnUFNCVVVsVkZLU2xjYmx4dVpuZHlhWFJsS0VkUE1DNWtaaXdnYUdWeVpTaGNJa2RQWDFCVFgyZHliM1Z3TUM1MGMzWmNJaWtzSUhObGNDQTlJRndpWEZ4MFhDSXBYRzVtZDNKcGRHVW9SMDh4TG1SbUxDQm9aWEpsS0Z3aVIwOWZVRk5mWjNKdmRYQXhMblJ6ZGx3aUtTd2djMlZ3SUQwZ1hDSmNYSFJjSWlsY2JtWjNjbWwwWlNoSFR6SXVaR1lzSUdobGNtVW9YQ0pIVDE5UVUxOW5jbTkxY0RJdWRITjJYQ0lwTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1Wm5keWFYUmxLRWRQTXk1a1ppd2dhR1Z5WlNoY0lrZFBYMUJUWDJkeWIzVndNeTUwYzNaY0lpa3NJSE5sY0NBOUlGd2lYRngwWENJcFhHNW1kM0pwZEdVb1IwODBMbVJtTENCb1pYSmxLRndpUjA5ZlVGTmZaM0p2ZFhBMExuUnpkbHdpS1N3Z2MyVndJRDBnWENKY1hIUmNJaWxjYmx4dVIwOHdMbVJtSUR3dElHWnlaV0ZrS0dobGNtVW9YQ0pIVDE5UVUxOW5jbTkxY0RBdWRITjJYQ0lwS1Z4dVIwOHhMbVJtSUR3dElHWnlaV0ZrS0dobGNtVW9YQ0pIVDE5UVUxOW5jbTkxY0RFdWRITjJYQ0lwS1Z4dVIwOHlMbVJtSUR3dElHWnlaV0ZrS0dobGNtVW9YQ0pIVDE5UVUxOW5jbTkxY0RJdWRITjJYQ0lwS1Z4dVIwOHpMbVJtSUR3dElHWnlaV0ZrS0dobGNtVW9YQ0pIVDE5UVUxOW5jbTkxY0RNdWRITjJYQ0lwS1Z4dVIwODBMbVJtSUR3dElHWnlaV0ZrS0dobGNtVW9YQ0pIVDE5UVUxOW5jbTkxY0RRdWRITjJYQ0lwS1Z4dVhHNXpkV0p6WlhRd0lEd3RJRWRQTUM1a1ppQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaEpSQ3dnUkdWelkzSnBjSFJwYjI0c0lFZGxibVZTWVhScGJ5d2djQzVoWkdwMWMzUXBJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdYQ0pIY205MWNDQXdYQ0lwSUNVK0pWeHVJQ0JrY0d4NWNqbzZZWEp5WVc1blpTaHdMbUZrYW5WemRDbGNibk4xWW5ObGRERWdQQzBnUjA4eExtUm1JQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLRWxFTENCRVpYTmpjbWx3ZEdsdmJpd2dSMlZ1WlZKaGRHbHZMQ0J3TG1Ga2FuVnpkQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JjSWtkeWIzVndJREZjSWlrZ0pUNGxYRzRnSUdSd2JIbHlPanBoY25KaGJtZGxLSEF1WVdScWRYTjBLVnh1YzNWaWMyVjBNaUE4TFNCSFR6SXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ3aVIzSnZkWEFnTWx3aUtTQWxQaVZjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvY0M1aFpHcDFjM1FwWEc1emRXSnpaWFF6SUR3dElFZFBNeTVrWmlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoSlJDd2dSR1Z6WTNKcGNIUnBiMjRzSUVkbGJtVlNZWFJwYnl3Z2NDNWhaR3AxYzNRcElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHZHliM1Z3SUQwZ1hDSkhjbTkxY0NBelhDSXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNllYSnlZVzVuWlNod0xtRmthblZ6ZENsY2JuTjFZbk5sZERRZ1BDMGdSMDgwTG1SbUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtFbEVMQ0JFWlhOamNtbHdkR2x2Yml3Z1IyVnVaVkpoZEdsdkxDQndMbUZrYW5WemRDa2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aM0p2ZFhBZ1BTQmNJa2R5YjNWd0lEUmNJaWtnSlQ0bFhHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtIQXVZV1JxZFhOMEtWeHVYRzV6ZFdKelpYUXdKRWRsYm1WU1lYUnBieUE4TFNCellYQndiSGtvYzNSeWMzQnNhWFFvYzNWaWMyVjBNQ1JIWlc1bFVtRjBhVzhzSUZ3aUwxd2lLU3dnWm5WdVkzUnBiMjRvZUNrZ1lYTXViblZ0WlhKcFl5aDRXekZkS1NBdklHRnpMbTUxYldWeWFXTW9lRnN5WFNrcFhHNXpkV0p6WlhReEpFZGxibVZTWVhScGJ5QThMU0J6WVhCd2JIa29jM1J5YzNCc2FYUW9jM1ZpYzJWME1TUkhaVzVsVW1GMGFXOHNJRndpTDF3aUtTd2dablZ1WTNScGIyNG9lQ2tnWVhNdWJuVnRaWEpwWXloNFd6RmRLU0F2SUdGekxtNTFiV1Z5YVdNb2VGc3lYU2twWEc1emRXSnpaWFF5SkVkbGJtVlNZWFJwYnlBOExTQnpZWEJ3Ykhrb2MzUnljM0JzYVhRb2MzVmljMlYwTWlSSFpXNWxVbUYwYVc4c0lGd2lMMXdpS1N3Z1puVnVZM1JwYjI0b2VDa2dZWE11Ym5WdFpYSnBZeWg0V3pGZEtTQXZJR0Z6TG01MWJXVnlhV01vZUZzeVhTa3BYRzV6ZFdKelpYUXpKRWRsYm1WU1lYUnBieUE4TFNCellYQndiSGtvYzNSeWMzQnNhWFFvYzNWaWMyVjBNeVJIWlc1bFVtRjBhVzhzSUZ3aUwxd2lLU3dnWm5WdVkzUnBiMjRvZUNrZ1lYTXViblZ0WlhKcFl5aDRXekZkS1NBdklHRnpMbTUxYldWeWFXTW9lRnN5WFNrcFhHNXpkV0p6WlhRMEpFZGxibVZTWVhScGJ5QThMU0J6WVhCd2JIa29jM1J5YzNCc2FYUW9jM1ZpYzJWME5DUkhaVzVsVW1GMGFXOHNJRndpTDF3aUtTd2dablZ1WTNScGIyNG9lQ2tnWVhNdWJuVnRaWEpwWXloNFd6RmRLU0F2SUdGekxtNTFiV1Z5YVdNb2VGc3lYU2twWEc1Y2JseHVSMDlzYVhOMElEd3RJR1poWTNSdmNpaGpLRndpUjA4Nk1EQXdPRE00TUZ3aUxDQmNJa2RQT2pBd01EWXpPVGRjSWl3Z1hDSkhUem93TURNME5EY3dYQ0lzSUZ3aVIwODZNREF5TWpZeE0xd2lMQ0JjSWtkUE9qQXdNVFl3TlRWY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWtkUE9qQXdOakV4TXpoY0lpd2dYQ0pIVHpvd01EWXdOVFl5WENJc0lGd2lSMDg2TURBd056TTRPVndpTENCY0lrZFBPakF3TmpBME9EVmNJaXdnWENKSFR6b3dNRFE0TmpNNFhDSXNJRndpUjA4Nk1EQTBOVFkyTkZ3aUtTbGNibHh1WkdGMFlTQThMU0JpYVc1a1gzSnZkM01vWW1sdVpGOXliM2R6S0dKcGJtUmZjbTkzY3loaWFXNWtYM0p2ZDNNb2MzVmljMlYwTUN3Z2MzVmljMlYwTVNrc0lITjFZbk5sZERJcExDQnpkV0p6WlhRektTd2djM1ZpYzJWME5Da2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvU1VRZ0pXbHVKU0JIVDJ4cGMzUXBYRzVjYm1SbGMyTlBjbVJsY2lBOExTQnpiM0owS0hWdWFYRjFaU2hrWVhSaEpFUmxjMk55YVhCMGFXOXVLU2xiY21WMktHTW9NVEFzSURRc0lEVXNJRGtzSURFeExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBeUxDQTJMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXpMQ0F4TENBNExDQTNLU2xkWEc1Y2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T25KdmQzZHBjMlVvS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNod1ZtRnNkV1ZNYjJjZ1BTQnRhVzRvTFd4dlp6RXdLSEF1WVdScWRYTjBLU3dnY0ZaaGJIVmxURzluVFdGNEtTbGNibkFnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JtWVdOMGIzSW9SR1Z6WTNKcGNIUnBiMjRzSUd4bGRtVnNjeUE5SUdSbGMyTlBjbVJsY2lrc0lITnBlbVVnUFNCd1ZtRnNkV1ZNYjJjc0lHWnBiR3dnUFNCSFpXNWxVbUYwYVc4cEtTQXJJRnh1SUNCblpXOXRYM0J2YVc1MEtITm9ZWEJsSUQwZ01qRXNJQ0FnSUNBZ0lDQWpJRVZ1YzNWeVpYTWdZU0J3YjJsdWRDQjNhWFJvSUdGdUlHOTFkR3hwYm1WY2JpQWdJQ0FnSUNBZ0lDQWdJQ0J6ZEhKdmEyVWdQU0F4S25CMFZHOU5UU2tnS3lCY2JpQWdjMk5oYkdWZmMybDZaVjlqYjI1MGFXNTFiM1Z6S0hKaGJtZGxJRDBnWXlnd0xqVXNJRElwS1NBcklDQWpJRk5sZENCdGFXNGdZVzVrSUcxaGVDQndiMmx1ZENCemFYcGxjeUJvWlhKbFhHNGdJSE5qWVd4bFgyWnBiR3hmWjNKaFpHbGxiblFvYkc5M0lEMGdYQ0ozYUdsMFpWd2lMQ0JvYVdkb0lEMGdYQ0lqUTBJek16TkJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJzYVcxcGRITWdQU0JqS0RBc0lERXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOXZZaUE5SUhOallXeGxjem82YzNGMWFYTm9MQ0FqSUVSbFptbHVaU0JuY21Ga2FXVnVkQ0JqYjJ4dmNuTmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbmRXbGtaU0E5SUdkMWFXUmxYMk52Ykc5eVltRnlLRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZ5ZDJsa2RHZ2dQU0F4TGpVdk5TNHdPQ3dnSUNNZ1FXUnFkWE4wSUhkcFpIUm9JRzltSUhSb1pTQmpiMnh2Y2lCaVlYSmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhjbWhsYVdkb2RDQTlJREUxTHpVdU1EZ2dJQ0FqSUVGa2FuVnpkQ0JvWldsbmFIUWdiMllnZEdobElHTnZiRzl5SUdKaGNseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNsY2JpQWdLU0FySUZ4dUlDQnNZV0p6S0hnZ1BTQk9WVXhNTENCNUlEMGdUbFZNVENrZ0sxeHVJQ0IwYUdWdFpWOWlkeWdwSUNzZ0lDTWdRWEJ3YkhrZ2RHaGxiV1ZmWW5jZ1ptbHljM1FzSUhOdklHTjFjM1J2YlNCMGFHVnRaU0J6WlhSMGFXNW5jeUJqYjIxbElHRm1kR1Z5WEc0Z0lIUm9aVzFsS0Z4dUlDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ3aWRISmhibk53WVhKbGJuUmNJaWtzSUNBaklFOTJaWEp5YVdSbElIUm9aVzFsWDJKM0lIQmhibVZzWEc0Z0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQzU0SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5d2dJQ0FnSUNBZ0lDQWpJRVZ1YzNWeVpTQnphWHBsSUdseklITmxkQ0JtYjNJZ2VDMWhlR2x6SUhSbGVIUmNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZEM1NUlEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXdnSUNBZ0lDQWdJQ0FqSUVWdWMzVnlaU0J6YVhwbElHbHpJSE5sZENCbWIzSWdlUzFoZUdseklIUmxlSFJjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXhjYmlBZ0lDQWdJR3hwYm1Wb1pXbG5hSFFnUFNBd0xqa2dJQ0FnSUNBZ0lDQWdJeUJCYkd4dmQzTWdkM0poY0hCcGJtY2dabTl5SUhrdFlYaHBjeUJzWVdKbGJITWdkRzhnWm1sMElHbHVkRzhnTWlCc2FXNWxjMXh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2xjYmx4dVptbHNaVTVoYldVZ1BDMGdhR1Z5WlNobWFXZEVhWElzSUZ3aUxpNWNJaXdnWENKSFQxd2lMQ0JjSWtkUFgyZHliM1Z3YzE5d2Mxd2lLVnh1ZDJsa2RHZ2dQQzBnY0dGdVpXeFRhWHBsS0RJdU55a3FiVzFVYjBsdVkyaGNibWhsYVdkb2RDQThMU0J3WVc1bGJGTnBlbVVvTVM0eUtTcHRiVlJ2U1c1amFGeHVjM1puYkdsMFpTaHdZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuR09maWdEaXIgPC0gaGVyZShmaWdEaXIsIFxcLi4vR09cXClcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5HTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbkdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5HTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcblxuZndyaXRlKEdPMC5kZiwgaGVyZShcXEdPX1BTX2dyb3VwMC50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoR08xLmRmLCBoZXJlKFxcR09fUFNfZ3JvdXAxLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZShHTzIuZGYsIGhlcmUoXFxHT19QU19ncm91cDIudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKEdPMy5kZiwgaGVyZShcXEdPX1BTX2dyb3VwMy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoR080LmRmLCBoZXJlKFxcR09fUFNfZ3JvdXA0LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuR08wLmRmIDwtIGZyZWFkKGhlcmUoXFxHT19QU19ncm91cDAudHN2XFwpKVxuR08xLmRmIDwtIGZyZWFkKGhlcmUoXFxHT19QU19ncm91cDEudHN2XFwpKVxuR08yLmRmIDwtIGZyZWFkKGhlcmUoXFxHT19QU19ncm91cDIudHN2XFwpKVxuR08zLmRmIDwtIGZyZWFkKGhlcmUoXFxHT19QU19ncm91cDMudHN2XFwpKVxuR080LmRmIDwtIGZyZWFkKGhlcmUoXFxHT19QU19ncm91cDQudHN2XFwpKVxuXG5zdWJzZXQwIDwtIEdPMC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAwXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDEgPC0gR08xLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDFcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgMlxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQzIDwtIEdPMy5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAzXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDQgPC0gR080LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDRcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuXG5zdWJzZXQwJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MCRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQxJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MSRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQyJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MiRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQzJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MyRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQ0JEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0NCRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5cblxuR09saXN0IDwtIGZhY3RvcihjKFxcR086MDAwODM4MFxcLCBcXEdPOjAwMDYzOTdcXCwgXFxHTzowMDM0NDcwXFwsIFxcR086MDAyMjYxM1xcLCBcXEdPOjAwMTYwNTVcXCxcbiAgICAgICAgICAgICAgICAgICBcXEdPOjAwNjExMzhcXCwgXFxHTzowMDYwNTYyXFwsIFxcR086MDAwNzM4OVxcLCBcXEdPOjAwNjA0ODVcXCwgXFxHTzowMDQ4NjM4XFwsIFxcR086MDA0NTY2NFxcKSlcblxuZGF0YSA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKGJpbmRfcm93cyhiaW5kX3Jvd3Moc3Vic2V0MCwgc3Vic2V0MSksIHN1YnNldDIpLCBzdWJzZXQzKSwgc3Vic2V0NCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpXG5cbmRlc2NPcmRlciA8LSBzb3J0KHVuaXF1ZShkYXRhJERlc2NyaXB0aW9uKSlbcmV2KGMoMTAsIDQsIDUsIDksIDExLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCA2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAxLCA4LCA3KSldXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShwVmFsdWVMb2cgPSBtaW4oLWxvZzEwKHAuYWRqdXN0KSwgcFZhbHVlTG9nTWF4KSlcbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBmYWN0b3IoRGVzY3JpcHRpb24sIGxldmVscyA9IGRlc2NPcmRlciksIHNpemUgPSBwVmFsdWVMb2csIGZpbGwgPSBHZW5lUmF0aW8pKSArIFxuICBnZW9tX3BvaW50KHNoYXBlID0gMjEsICAgICAgICAjIEVuc3VyZXMgYSBwb2ludCB3aXRoIGFuIG91dGxpbmVcbiAgICAgICAgICAgICBzdHJva2UgPSAxKnB0VG9NTSkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjUsIDIpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlXG4gIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gXFx3aGl0ZVxcLCBoaWdoID0gXFwjQ0IzMzNBXFwsXG4gICAgICAgICAgICAgICAgICAgICAgIyBsaW1pdHMgPSBjKDAsIDEpLFxuICAgICAgICAgICAgICAgICAgICAgIG9vYiA9IHNjYWxlczo6c3F1aXNoLCAjIERlZmluZSBncmFkaWVudCBjb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgKSArIFxuICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuICB0aGVtZV9idygpICsgICMgQXBwbHkgdGhlbWVfYncgZmlyc3QsIHNvIGN1c3RvbSB0aGVtZSBzZXR0aW5ncyBjb21lIGFmdGVyXG4gIHRoZW1lKFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksICAjIE92ZXJyaWRlIHRoZW1lX2J3IHBhbmVsXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeC1heGlzIHRleHRcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICApLFxuICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeS1heGlzIHRleHRcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIGxpbmVoZWlnaHQgPSAwLjkgICAgICAgICAgIyBBbGxvd3Mgd3JhcHBpbmcgZm9yIHktYXhpcyBsYWJlbHMgdG8gZml0IGludG8gMiBsaW5lc1xuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc19wc1xcKVxud2lkdGggPC0gcGFuZWxTaXplKDIuNykqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaFxuc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
GOfigDir <- here(figDir, \../GO\)

#####################
GO0.df <- as.data.frame(enrichGO(gene = psOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO1.df <- as.data.frame(enrichGO(gene = psOver1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO2.df <- as.data.frame(enrichGO(gene = psOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO3.df <- as.data.frame(enrichGO(gene = psOver3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO4.df <- as.data.frame(enrichGO(gene = psOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))

fwrite(GO0.df, here(\GO_PS_group0.tsv\), sep = \\t\)
fwrite(GO1.df, here(\GO_PS_group1.tsv\), sep = \\t\)
fwrite(GO2.df, here(\GO_PS_group2.tsv\), sep = \\t\)
fwrite(GO3.df, here(\GO_PS_group3.tsv\), sep = \\t\)
fwrite(GO4.df, here(\GO_PS_group4.tsv\), sep = \\t\)

GO0.df <- fread(here(\GO_PS_group0.tsv\))
GO1.df <- fread(here(\GO_PS_group1.tsv\))
GO2.df <- fread(here(\GO_PS_group2.tsv\))
GO3.df <- fread(here(\GO_PS_group3.tsv\))
GO4.df <- fread(here(\GO_PS_group4.tsv\))

subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 0\) %>%
  dplyr::arrange(p.adjust)
subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 1\) %>%
  dplyr::arrange(p.adjust)
subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 2\) %>%
  dplyr::arrange(p.adjust)
subset3 <- GO3.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 3\) %>%
  dplyr::arrange(p.adjust)
subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 4\) %>%
  dplyr::arrange(p.adjust)

subset0$GeneRatio <- sapply(strsplit(subset0$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset1$GeneRatio <- sapply(strsplit(subset1$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset2$GeneRatio <- sapply(strsplit(subset2$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset3$GeneRatio <- sapply(strsplit(subset3$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset4$GeneRatio <- sapply(strsplit(subset4$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))


GOlist <- factor(c(\GO:0008380\, \GO:0006397\, \GO:0034470\, \GO:0022613\, \GO:0016055\,
                   \GO:0061138\, \GO:0060562\, \GO:0007389\, \GO:0060485\, \GO:0048638\, \GO:0045664\))

data <- bind_rows(bind_rows(bind_rows(bind_rows(subset0, subset1), subset2), subset3), subset4) %>%
  dplyr::filter(ID %in% GOlist)

descOrder <- sort(unique(data$Description))[rev(c(10, 4, 5, 9, 11,
                                                  2, 6,
                                                  3, 1, 8, 7))]

data <- data %>% dplyr::rowwise() %>% dplyr::mutate(pValueLog = min(-log10(p.adjust), pValueLogMax))
p <- ggplot(data, aes(x = group, y = factor(Description, levels = descOrder), size = pValueLog, fill = GeneRatio)) + 
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM) + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = \white\, high = \#CB333A\,
                      # limits = c(0, 1),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL) +
  theme_bw() +  # Apply theme_bw first, so custom theme settings come after
  theme(
    panel.background = element_rect(fill = \transparent\),  # Override theme_bw panel
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      size = fontSizeS,         # Ensure size is set for x-axis text
      family = fontType,
      color = \#000000\,
    ),
    axis.text.y = element_text(
      size = fontSizeS,         # Ensure size is set for y-axis text
      family = fontType,
      color = \#000000\,
      lineheight = 0.9          # Allows wrapping for y-axis labels to fit into 2 lines
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- here(figDir, \..\, \GO\, \GO_groups_ps\)
width <- panelSize(2.7)*mmToInch
height <- panelSize(1.2)*mmToInch
svglite(paste0(fileName, \.svg\), height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVIwOW1hV2RFYVhJZ1BDMGdhR1Z5WlNobWFXZEVhWElzSUZ4Y0xpNHZSMDljWENsY2JseHVJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qWEc1SFR6QXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hsYm5KcFkyaEhUeWhuWlc1bElEMGdjSE5QZG1WeU1Dd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjTENCeVpXRmtZV0pzWlNBOUlGUlNWVVVwS1Z4dVIwOHhMbVJtSUR3dElHRnpMbVJoZEdFdVpuSmhiV1VvWlc1eWFXTm9SMDhvWjJWdVpTQTlJSEJ6VDNabGNqRXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hGeEZUbE5GVFVKTVhGd3NJRzl1ZENBOUlGeGNRbEJjWEN3Z2NtVmhaR0ZpYkdVZ1BTQlVVbFZGS1NsY2JrZFBNaTVrWmlBOExTQmhjeTVrWVhSaExtWnlZVzFsS0dWdWNtbGphRWRQS0dkbGJtVWdQU0J3YzA5MlpYSXlMQ0JQY21kRVlpQTlJRzl5Wnk1TmJTNWxaeTVrWWl3Z2EyVjVWSGx3WlNBOUlGeGNSVTVUUlUxQ1RGeGNMQ0J2Ym5RZ1BTQmNYRUpRWEZ3c0lISmxZV1JoWW14bElEMGdWRkpWUlNrcFhHNUhUek11WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNobGJuSnBZMmhIVHloblpXNWxJRDBnY0hOUGRtVnlNeXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0xDQnlaV0ZrWVdKc1pTQTlJRlJTVlVVcEtWeHVSMDgwTG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCelQzWmxjalFzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYRnhGVGxORlRVSk1YRndzSUc5dWRDQTlJRnhjUWxCY1hDd2djbVZoWkdGaWJHVWdQU0JVVWxWRktTbGNibHh1Wm5keWFYUmxLRWRQTUM1a1ppd2dhR1Z5WlNoY1hFZFBYMUJUWDJkeWIzVndNQzUwYzNaY1hDa3NJSE5sY0NBOUlGeGNYRngwWEZ3cFhHNW1kM0pwZEdVb1IwOHhMbVJtTENCb1pYSmxLRnhjUjA5ZlVGTmZaM0p2ZFhBeExuUnpkbHhjS1N3Z2MyVndJRDBnWEZ4Y1hIUmNYQ2xjYm1aM2NtbDBaU2hIVHpJdVpHWXNJR2hsY21Vb1hGeEhUMTlRVTE5bmNtOTFjREl1ZEhOMlhGd3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVabmR5YVhSbEtFZFBNeTVrWml3Z2FHVnlaU2hjWEVkUFgxQlRYMmR5YjNWd015NTBjM1pjWENrc0lITmxjQ0E5SUZ4Y1hGeDBYRndwWEc1bWQzSnBkR1VvUjA4MExtUm1MQ0JvWlhKbEtGeGNSMDlmVUZOZlozSnZkWEEwTG5SemRseGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDbGNibHh1UjA4d0xtUm1JRHd0SUdaeVpXRmtLR2hsY21Vb1hGeEhUMTlRVTE5bmNtOTFjREF1ZEhOMlhGd3BLVnh1UjA4eExtUm1JRHd0SUdaeVpXRmtLR2hsY21Vb1hGeEhUMTlRVTE5bmNtOTFjREV1ZEhOMlhGd3BLVnh1UjA4eUxtUm1JRHd0SUdaeVpXRmtLR2hsY21Vb1hGeEhUMTlRVTE5bmNtOTFjREl1ZEhOMlhGd3BLVnh1UjA4ekxtUm1JRHd0SUdaeVpXRmtLR2hsY21Vb1hGeEhUMTlRVTE5bmNtOTFjRE11ZEhOMlhGd3BLVnh1UjA4MExtUm1JRHd0SUdaeVpXRmtLR2hsY21Vb1hGeEhUMTlRVTE5bmNtOTFjRFF1ZEhOMlhGd3BLVnh1WEc1emRXSnpaWFF3SUR3dElFZFBNQzVrWmlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoSlJDd2dSR1Z6WTNKcGNIUnBiMjRzSUVkbGJtVlNZWFJwYnl3Z2NDNWhaR3AxYzNRcElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHZHliM1Z3SUQwZ1hGeEhjbTkxY0NBd1hGd3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNllYSnlZVzVuWlNod0xtRmthblZ6ZENsY2JuTjFZbk5sZERFZ1BDMGdSMDh4TG1SbUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtFbEVMQ0JFWlhOamNtbHdkR2x2Yml3Z1IyVnVaVkpoZEdsdkxDQndMbUZrYW5WemRDa2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aM0p2ZFhBZ1BTQmNYRWR5YjNWd0lERmNYQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtIQXVZV1JxZFhOMEtWeHVjM1ZpYzJWME1pQThMU0JIVHpJdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRnhjUjNKdmRYQWdNbHhjS1NBbFBpVmNiaUFnWkhCc2VYSTZPbUZ5Y21GdVoyVW9jQzVoWkdwMWMzUXBYRzV6ZFdKelpYUXpJRHd0SUVkUE15NWtaaUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hKUkN3Z1JHVnpZM0pwY0hScGIyNHNJRWRsYm1WU1lYUnBieXdnY0M1aFpHcDFjM1FwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dkeWIzVndJRDBnWEZ4SGNtOTFjQ0F6WEZ3cElDVStKVnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2h3TG1Ga2FuVnpkQ2xjYm5OMVluTmxkRFFnUEMwZ1IwODBMbVJtSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VsRUxDQkVaWE5qY21sd2RHbHZiaXdnUjJWdVpWSmhkR2x2TENCd0xtRmthblZ6ZENrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCY1hFZHliM1Z3SURSY1hDa2dKVDRsWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0hBdVlXUnFkWE4wS1Z4dVhHNXpkV0p6WlhRd0pFZGxibVZTWVhScGJ5QThMU0J6WVhCd2JIa29jM1J5YzNCc2FYUW9jM1ZpYzJWME1DUkhaVzVsVW1GMGFXOHNJRnhjTDF4Y0tTd2dablZ1WTNScGIyNG9lQ2tnWVhNdWJuVnRaWEpwWXloNFd6RmRLU0F2SUdGekxtNTFiV1Z5YVdNb2VGc3lYU2twWEc1emRXSnpaWFF4SkVkbGJtVlNZWFJwYnlBOExTQnpZWEJ3Ykhrb2MzUnljM0JzYVhRb2MzVmljMlYwTVNSSFpXNWxVbUYwYVc4c0lGeGNMMXhjS1N3Z1puVnVZM1JwYjI0b2VDa2dZWE11Ym5WdFpYSnBZeWg0V3pGZEtTQXZJR0Z6TG01MWJXVnlhV01vZUZzeVhTa3BYRzV6ZFdKelpYUXlKRWRsYm1WU1lYUnBieUE4TFNCellYQndiSGtvYzNSeWMzQnNhWFFvYzNWaWMyVjBNaVJIWlc1bFVtRjBhVzhzSUZ4Y0wxeGNLU3dnWm5WdVkzUnBiMjRvZUNrZ1lYTXViblZ0WlhKcFl5aDRXekZkS1NBdklHRnpMbTUxYldWeWFXTW9lRnN5WFNrcFhHNXpkV0p6WlhRekpFZGxibVZTWVhScGJ5QThMU0J6WVhCd2JIa29jM1J5YzNCc2FYUW9jM1ZpYzJWME15UkhaVzVsVW1GMGFXOHNJRnhjTDF4Y0tTd2dablZ1WTNScGIyNG9lQ2tnWVhNdWJuVnRaWEpwWXloNFd6RmRLU0F2SUdGekxtNTFiV1Z5YVdNb2VGc3lYU2twWEc1emRXSnpaWFEwSkVkbGJtVlNZWFJwYnlBOExTQnpZWEJ3Ykhrb2MzUnljM0JzYVhRb2MzVmljMlYwTkNSSFpXNWxVbUYwYVc4c0lGeGNMMXhjS1N3Z1puVnVZM1JwYjI0b2VDa2dZWE11Ym5WdFpYSnBZeWg0V3pGZEtTQXZJR0Z6TG01MWJXVnlhV01vZUZzeVhTa3BYRzVjYmx4dVIwOXNhWE4wSUR3dElHWmhZM1J2Y2loaktGeGNSMDg2TURBd09ETTRNRnhjTENCY1hFZFBPakF3TURZek9UZGNYQ3dnWEZ4SFR6b3dNRE0wTkRjd1hGd3NJRnhjUjA4Nk1EQXlNall4TTF4Y0xDQmNYRWRQT2pBd01UWXdOVFZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRWRQT2pBd05qRXhNemhjWEN3Z1hGeEhUem93TURZd05UWXlYRndzSUZ4Y1IwODZNREF3TnpNNE9WeGNMQ0JjWEVkUE9qQXdOakEwT0RWY1hDd2dYRnhIVHpvd01EUTROak00WEZ3c0lGeGNSMDg2TURBME5UWTJORnhjS1NsY2JseHVaR0YwWVNBOExTQmlhVzVrWDNKdmQzTW9ZbWx1WkY5eWIzZHpLR0pwYm1SZmNtOTNjeWhpYVc1a1gzSnZkM01vYzNWaWMyVjBNQ3dnYzNWaWMyVjBNU2tzSUhOMVluTmxkRElwTENCemRXSnpaWFF6S1N3Z2MzVmljMlYwTkNrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9TVVFnSldsdUpTQkhUMnhwYzNRcFhHNWNibVJsYzJOUGNtUmxjaUE4TFNCemIzSjBLSFZ1YVhGMVpTaGtZWFJoSkVSbGMyTnlhWEIwYVc5dUtTbGJjbVYyS0dNb01UQXNJRFFzSURVc0lEa3NJREV4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F5TENBMkxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBekxDQXhMQ0E0TENBM0tTbGRYRzVjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbkp2ZDNkcGMyVW9LU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2h3Vm1Gc2RXVk1iMmNnUFNCdGFXNG9MV3h2WnpFd0tIQXVZV1JxZFhOMEtTd2djRlpoYkhWbFRHOW5UV0Y0S1NsY2JuQWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQm1ZV04wYjNJb1JHVnpZM0pwY0hScGIyNHNJR3hsZG1Wc2N5QTlJR1JsYzJOUGNtUmxjaWtzSUhOcGVtVWdQU0J3Vm1Gc2RXVk1iMmNzSUdacGJHd2dQU0JIWlc1bFVtRjBhVzhwS1NBcklGeHVJQ0JuWlc5dFgzQnZhVzUwS0hOb1lYQmxJRDBnTWpFc0lDQWdJQ0FnSUNBaklFVnVjM1Z5WlhNZ1lTQndiMmx1ZENCM2FYUm9JR0Z1SUc5MWRHeHBibVZjYmlBZ0lDQWdJQ0FnSUNBZ0lDQnpkSEp2YTJVZ1BTQXhLbkIwVkc5TlRTa2dLeUJjYmlBZ2MyTmhiR1ZmYzJsNlpWOWpiMjUwYVc1MWIzVnpLSEpoYm1kbElEMGdZeWd3TGpVc0lESXBLU0FySUNBaklGTmxkQ0J0YVc0Z1lXNWtJRzFoZUNCd2IybHVkQ0J6YVhwbGN5Qm9aWEpsWEc0Z0lITmpZV3hsWDJacGJHeGZaM0poWkdsbGJuUW9iRzkzSUQwZ1hGeDNhR2wwWlZ4Y0xDQm9hV2RvSUQwZ1hGd2pRMEl6TXpOQlhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5QnNhVzFwZEhNZ1BTQmpLREFzSURFcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5dllpQTlJSE5qWVd4bGN6bzZjM0YxYVhOb0xDQWpJRVJsWm1sdVpTQm5jbUZrYVdWdWRDQmpiMnh2Y25OY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuZFdsa1pTQTlJR2QxYVdSbFgyTnZiRzl5WW1GeUtGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRnlkMmxrZEdnZ1BTQXhMalV2TlM0d09Dd2dJQ01nUVdScWRYTjBJSGRwWkhSb0lHOW1JSFJvWlNCamIyeHZjaUJpWVhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaGNtaGxhV2RvZENBOUlERTFMelV1TURnZ0lDQWpJRUZrYW5WemRDQm9aV2xuYUhRZ2IyWWdkR2hsSUdOdmJHOXlJR0poY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2xjYmlBZ0tTQXJJRnh1SUNCc1lXSnpLSGdnUFNCT1ZVeE1MQ0I1SUQwZ1RsVk1UQ2tnSzF4dUlDQjBhR1Z0WlY5aWR5Z3BJQ3NnSUNNZ1FYQndiSGtnZEdobGJXVmZZbmNnWm1seWMzUXNJSE52SUdOMWMzUnZiU0IwYUdWdFpTQnpaWFIwYVc1bmN5QmpiMjFsSUdGbWRHVnlYRzRnSUhSb1pXMWxLRnh1SUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRnhjZEhKaGJuTndZWEpsYm5SY1hDa3NJQ0FqSUU5MlpYSnlhV1JsSUhSb1pXMWxYMkozSUhCaGJtVnNYRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDNTRJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl3Z0lDQWdJQ0FnSUNBaklFVnVjM1Z5WlNCemFYcGxJR2x6SUhObGRDQm1iM0lnZUMxaGVHbHpJSFJsZUhSY2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQzU1SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5d2dJQ0FnSUNBZ0lDQWpJRVZ1YzNWeVpTQnphWHBsSUdseklITmxkQ0JtYjNJZ2VTMWhlR2x6SUhSbGVIUmNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hDeGNiaUFnSUNBZ0lHeHBibVZvWldsbmFIUWdQU0F3TGprZ0lDQWdJQ0FnSUNBZ0l5QkJiR3h2ZDNNZ2QzSmhjSEJwYm1jZ1ptOXlJSGt0WVhocGN5QnNZV0psYkhNZ2RHOGdabWwwSUdsdWRHOGdNaUJzYVc1bGMxeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NXNhVzVsSUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3hjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2FHVnlaU2htYVdkRWFYSXNJRnhjTGk1Y1hDd2dYRnhIVDF4Y0xDQmNYRWRQWDJkeWIzVndjMTl3YzF4Y0tWeHVkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLREl1TnlrcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzR5S1NwdGJWUnZTVzVqYUZ4dWMzWm5iR2wwWlNod1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1N3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbkdPZmlnRGlyIDwtIGhlcmUoZmlnRGlyLCBcXC4uL0dPXFwpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuR08wLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjAsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbkdPMS5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5HTzIuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuR08zLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbkdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5cbmZ3cml0ZShHTzAuZGYsIGhlcmUoXFxHT19QU19ncm91cDAudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKEdPMS5kZiwgaGVyZShcXEdPX1BTX2dyb3VwMS50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoR08yLmRmLCBoZXJlKFxcR09fUFNfZ3JvdXAyLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZShHTzMuZGYsIGhlcmUoXFxHT19QU19ncm91cDMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKEdPNC5kZiwgaGVyZShcXEdPX1BTX2dyb3VwNC50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbkdPMC5kZiA8LSBmcmVhZChoZXJlKFxcR09fUFNfZ3JvdXAwLnRzdlxcKSlcbkdPMS5kZiA8LSBmcmVhZChoZXJlKFxcR09fUFNfZ3JvdXAxLnRzdlxcKSlcbkdPMi5kZiA8LSBmcmVhZChoZXJlKFxcR09fUFNfZ3JvdXAyLnRzdlxcKSlcbkdPMy5kZiA8LSBmcmVhZChoZXJlKFxcR09fUFNfZ3JvdXAzLnRzdlxcKSlcbkdPNC5kZiA8LSBmcmVhZChoZXJlKFxcR09fUFNfZ3JvdXA0LnRzdlxcKSlcblxuc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgMFxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQxIDwtIEdPMS5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAxXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDJcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuc3Vic2V0MyA8LSBHTzMuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgM1xcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQ0IDwtIEdPNC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCA0XFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcblxuc3Vic2V0MCRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDAkR2VuZVJhdGlvLCBcXC9cXCksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKVxuc3Vic2V0MSRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDEkR2VuZVJhdGlvLCBcXC9cXCksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKVxuc3Vic2V0MiRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDIkR2VuZVJhdGlvLCBcXC9cXCksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKVxuc3Vic2V0MyRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDMkR2VuZVJhdGlvLCBcXC9cXCksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKVxuc3Vic2V0NCRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDQkR2VuZVJhdGlvLCBcXC9cXCksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKVxuXG5cbkdPbGlzdCA8LSBmYWN0b3IoYyhcXEdPOjAwMDgzODBcXCwgXFxHTzowMDA2Mzk3XFwsIFxcR086MDAzNDQ3MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDE2MDU1XFwsXG4gICAgICAgICAgICAgICAgICAgXFxHTzowMDYxMTM4XFwsIFxcR086MDA2MDU2MlxcLCBcXEdPOjAwMDczODlcXCwgXFxHTzowMDYwNDg1XFwsIFxcR086MDA0ODYzOFxcLCBcXEdPOjAwNDU2NjRcXCkpXG5cbmRhdGEgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhiaW5kX3Jvd3MoYmluZF9yb3dzKHN1YnNldDAsIHN1YnNldDEpLCBzdWJzZXQyKSwgc3Vic2V0MyksIHN1YnNldDQpICU+JVxuICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuXG5kZXNjT3JkZXIgPC0gc29ydCh1bmlxdWUoZGF0YSREZXNjcmlwdGlvbikpW3JldihjKDEwLCA0LCA1LCA5LCAxMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgNixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMSwgOCwgNykpXVxuXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUocFZhbHVlTG9nID0gbWluKC1sb2cxMChwLmFkanVzdCksIHBWYWx1ZUxvZ01heCkpXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gZmFjdG9yKERlc2NyaXB0aW9uLCBsZXZlbHMgPSBkZXNjT3JkZXIpLCBzaXplID0gcFZhbHVlTG9nLCBmaWxsID0gR2VuZVJhdGlvKSkgKyBcbiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lXG4gICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0pICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9IFxcd2hpdGVcXCwgaGlnaCA9IFxcI0NCMzMzQVxcLFxuICAgICAgICAgICAgICAgICAgICAgICMgbGltaXRzID0gYygwLCAxKSxcbiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiAgdGhlbWVfYncoKSArICAjIEFwcGx5IHRoZW1lX2J3IGZpcnN0LCBzbyBjdXN0b20gdGhlbWUgc2V0dGluZ3MgY29tZSBhZnRlclxuICB0aGVtZShcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLCAgIyBPdmVycmlkZSB0aGVtZV9idyBwYW5lbFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsICAgICAgICAgIyBFbnN1cmUgc2l6ZSBpcyBzZXQgZm9yIHgtYXhpcyB0ZXh0XG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgKSxcbiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsICAgICAgICAgIyBFbnN1cmUgc2l6ZSBpcyBzZXQgZm9yIHktYXhpcyB0ZXh0XG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBsaW5laGVpZ2h0ID0gMC45ICAgICAgICAgICMgQWxsb3dzIHdyYXBwaW5nIGZvciB5LWF4aXMgbGFiZWxzIHRvIGZpdCBpbnRvIDIgbGluZXNcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXC4uXFwsIFxcR09cXCwgXFxHT19ncm91cHNfcHNcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgyLjcpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuR09maWdEaXIgPC0gaGVyZShmaWdEaXIsIFxcLi4vR09cXClcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5HTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbkdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5HTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcblxuZndyaXRlKEdPMC5kZiwgaGVyZShcXEdPX1BTX2dyb3VwMC50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoR08xLmRmLCBoZXJlKFxcR09fUFNfZ3JvdXAxLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZShHTzIuZGYsIGhlcmUoXFxHT19QU19ncm91cDIudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuZndyaXRlKEdPMy5kZiwgaGVyZShcXEdPX1BTX2dyb3VwMy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoR080LmRmLCBoZXJlKFxcR09fUFNfZ3JvdXA0LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuR08wLmRmIDwtIGZyZWFkKGhlcmUoXFxHT19QU19ncm91cDAudHN2XFwpKVxuR08xLmRmIDwtIGZyZWFkKGhlcmUoXFxHT19QU19ncm91cDEudHN2XFwpKVxuR08yLmRmIDwtIGZyZWFkKGhlcmUoXFxHT19QU19ncm91cDIudHN2XFwpKVxuR08zLmRmIDwtIGZyZWFkKGhlcmUoXFxHT19QU19ncm91cDMudHN2XFwpKVxuR080LmRmIDwtIGZyZWFkKGhlcmUoXFxHT19QU19ncm91cDQudHN2XFwpKVxuXG5zdWJzZXQwIDwtIEdPMC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAwXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDEgPC0gR08xLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDFcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgMlxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQzIDwtIEdPMy5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAzXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDQgPC0gR080LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDRcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuXG5zdWJzZXQwJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MCRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQxJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MSRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQyJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MiRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQzJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MyRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQ0JEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0NCRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5cblxuR09saXN0IDwtIGZhY3RvcihjKFxcR086MDAwODM4MFxcLCBcXEdPOjAwMDYzOTdcXCwgXFxHTzowMDM0NDcwXFwsIFxcR086MDAyMjYxM1xcLCBcXEdPOjAwMTYwNTVcXCxcbiAgICAgICAgICAgICAgICAgICBcXEdPOjAwNjExMzhcXCwgXFxHTzowMDYwNTYyXFwsIFxcR086MDAwNzM4OVxcLCBcXEdPOjAwNjA0ODVcXCwgXFxHTzowMDQ4NjM4XFwsIFxcR086MDA0NTY2NFxcKSlcblxuZGF0YSA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKGJpbmRfcm93cyhiaW5kX3Jvd3Moc3Vic2V0MCwgc3Vic2V0MSksIHN1YnNldDIpLCBzdWJzZXQzKSwgc3Vic2V0NCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpXG5cbmRlc2NPcmRlciA8LSBzb3J0KHVuaXF1ZShkYXRhJERlc2NyaXB0aW9uKSlbcmV2KGMoMTAsIDQsIDUsIDksIDExLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCA2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAxLCA4LCA3KSldXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShwVmFsdWVMb2cgPSBtaW4oLWxvZzEwKHAuYWRqdXN0KSwgcFZhbHVlTG9nTWF4KSlcbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBmYWN0b3IoRGVzY3JpcHRpb24sIGxldmVscyA9IGRlc2NPcmRlciksIHNpemUgPSBwVmFsdWVMb2csIGZpbGwgPSBHZW5lUmF0aW8pKSArIFxuICBnZW9tX3BvaW50KHNoYXBlID0gMjEsICAgICAgICAjIEVuc3VyZXMgYSBwb2ludCB3aXRoIGFuIG91dGxpbmVcbiAgICAgICAgICAgICBzdHJva2UgPSAxKnB0VG9NTSkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjUsIDIpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlXG4gIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gXFx3aGl0ZVxcLCBoaWdoID0gXFwjQ0IzMzNBXFwsXG4gICAgICAgICAgICAgICAgICAgICAgIyBsaW1pdHMgPSBjKDAsIDEpLFxuICAgICAgICAgICAgICAgICAgICAgIG9vYiA9IHNjYWxlczo6c3F1aXNoLCAjIERlZmluZSBncmFkaWVudCBjb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgKSArIFxuICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuICB0aGVtZV9idygpICsgICMgQXBwbHkgdGhlbWVfYncgZmlyc3QsIHNvIGN1c3RvbSB0aGVtZSBzZXR0aW5ncyBjb21lIGFmdGVyXG4gIHRoZW1lKFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksICAjIE92ZXJyaWRlIHRoZW1lX2J3IHBhbmVsXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeC1heGlzIHRleHRcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICApLFxuICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeS1heGlzIHRleHRcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIGxpbmVoZWlnaHQgPSAwLjkgICAgICAgICAgIyBBbGxvd3Mgd3JhcHBpbmcgZm9yIHktYXhpcyBsYWJlbHMgdG8gZml0IGludG8gMiBsaW5lc1xuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc19wc1xcKVxud2lkdGggPC0gcGFuZWxTaXplKDIuNykqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaFxuc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
GOfigDir <- here(figDir, \../GO\)

#####################
GO0.df <- as.data.frame(enrichGO(gene = psOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO1.df <- as.data.frame(enrichGO(gene = psOver1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO2.df <- as.data.frame(enrichGO(gene = psOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO3.df <- as.data.frame(enrichGO(gene = psOver3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO4.df <- as.data.frame(enrichGO(gene = psOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))

fwrite(GO0.df, here(\GO_PS_group0.tsv\), sep = \\t\)
fwrite(GO1.df, here(\GO_PS_group1.tsv\), sep = \\t\)
fwrite(GO2.df, here(\GO_PS_group2.tsv\), sep = \\t\)
fwrite(GO3.df, here(\GO_PS_group3.tsv\), sep = \\t\)
fwrite(GO4.df, here(\GO_PS_group4.tsv\), sep = \\t\)

GO0.df <- fread(here(\GO_PS_group0.tsv\))
GO1.df <- fread(here(\GO_PS_group1.tsv\))
GO2.df <- fread(here(\GO_PS_group2.tsv\))
GO3.df <- fread(here(\GO_PS_group3.tsv\))
GO4.df <- fread(here(\GO_PS_group4.tsv\))

subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 0\) %>%
  dplyr::arrange(p.adjust)
subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 1\) %>%
  dplyr::arrange(p.adjust)
subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 2\) %>%
  dplyr::arrange(p.adjust)
subset3 <- GO3.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 3\) %>%
  dplyr::arrange(p.adjust)
subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 4\) %>%
  dplyr::arrange(p.adjust)

subset0$GeneRatio <- sapply(strsplit(subset0$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset1$GeneRatio <- sapply(strsplit(subset1$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset2$GeneRatio <- sapply(strsplit(subset2$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset3$GeneRatio <- sapply(strsplit(subset3$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset4$GeneRatio <- sapply(strsplit(subset4$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))


GOlist <- factor(c(\GO:0008380\, \GO:0006397\, \GO:0034470\, \GO:0022613\, \GO:0016055\,
                   \GO:0061138\, \GO:0060562\, \GO:0007389\, \GO:0060485\, \GO:0048638\, \GO:0045664\))

data <- bind_rows(bind_rows(bind_rows(bind_rows(subset0, subset1), subset2), subset3), subset4) %>%
  dplyr::filter(ID %in% GOlist)

descOrder <- sort(unique(data$Description))[rev(c(10, 4, 5, 9, 11,
                                                  2, 6,
                                                  3, 1, 8, 7))]

data <- data %>% dplyr::rowwise() %>% dplyr::mutate(pValueLog = min(-log10(p.adjust), pValueLogMax))
p <- ggplot(data, aes(x = group, y = factor(Description, levels = descOrder), size = pValueLog, fill = GeneRatio)) + 
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM) + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = \white\, high = \#CB333A\,
                      # limits = c(0, 1),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL) +
  theme_bw() +  # Apply theme_bw first, so custom theme settings come after
  theme(
    panel.background = element_rect(fill = \transparent\),  # Override theme_bw panel
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      size = fontSizeS,         # Ensure size is set for x-axis text
      family = fontType,
      color = \#000000\,
    ),
    axis.text.y = element_text(
      size = fontSizeS,         # Ensure size is set for y-axis text
      family = fontType,
      color = \#000000\,
      lineheight = 0.9          # Allows wrapping for y-axis labels to fit into 2 lines
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- here(figDir, \..\, \GO\, \GO_groups_ps\)
width <- panelSize(2.7)*mmToInch
height <- panelSize(1.2)*mmToInch
svglite(paste0(fileName, \.svg\), height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Grouping with P-S number
##### Grouping

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMW5jbTkxY0RFcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3YzA5MlpYSWdQVDFuY205MWNESXBJQ2trYldWaGJsOWthV1ptWDNOamIzSmxYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzV3Y3pBeElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYQ0p3YzA5MlpYSXdYQ0lzSUZ3aWNITlBkbVZ5TVZ3aUtTd2dOU2xjYm5Cek1USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjSW5CelQzWmxjakZjSWl3Z1hDSndjMDkyWlhJeVhDSXBMQ0ExS1Z4dWNITXlNeUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ3aWNITlBkbVZ5TWx3aUxDQmNJbkJ6VDNabGNqTmNJaWtzSURVcFhHNXdjek0wSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hDSndjMDkyWlhJelhDSXNJRndpY0hOUGRtVnlORndpS1N3Z05TbGNibkJ6TWpRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNJbkJ6VDNabGNqSmNJaXdnWENKd2MwOTJaWEkwWENJcExDQTFLVnh1Y0hNeE5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRndpY0hOUGRtVnlNVndpTENCY0luQnpUM1psY2pSY0lpa3NJRFVwWEc1d2N6QTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWENKd2MwOTJaWEl3WENJc0lGd2ljSE5QZG1WeU5Gd2lLU3dnTlNsY2JseHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJSEJ6VDNabGNpd2dlU0E5SUcxbFlXNWZaR2xtWmw5elkyOXlaU2twSUNzZ1hHNGdJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ2NITlBkbVZ5S1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxUV1ZrYVhWdElDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMak1zSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVTFsWkdsMWJTQXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRmNiaUFnS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHeGhZbk1vZUNBOUlFNVZURXdnTENCNUlEMGdYQ0pCZG1WeVlXZGxJTTZVSUd4dmIzQWdjMk52Y21WY0lpa2dLMXh1SUNCemRHRjBYM04xYlcxaGNua29YRzRnSUNBZ1lXVnpLR2R5YjNWd0lEMGdjSE5QZG1WeUtTd2dablZ1SUQwZ2JXVmhiaXhjYmlBZ0lDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNQzQxTEZ4dUlDQWdJR1pwYkd3Z1BTQmNJbUpzWVdOclhDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lYRzRnSUNrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFwSUN0Y2JpQWdkR2hsYldVb1hHNGdJQ0FnWVhocGN5NTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpVMHNJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTENCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0JoYm1kc1pTQTlJRFExTENCb2FuVnpkQ0E5SURFc0lIWnFkWE4wSUQwZ01WeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NXNhVzVsSUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXdnYzJsNlpTQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdsamEzTWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxDQnphWHBsSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNrc1hHNGdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hDSjBjbUZ1YzNCaGNtVnVkRndpS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdiR1ZuWlc1a0xuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLVnh1SUNBcEsxeHVJQ0JoYm01dmRHRjBaU2hjSW5SbGVIUmNJaXdnZUNBOUlERXNJSGtnUFNBd0xDQnNZV0psYkNBOUlIQmhjM1JsTUNoY0luQnpNREU2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TURFcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2N6RXlPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdjekV5S1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hNeU16b2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NITXlNeWtzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TXpRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek16UXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekkwT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pJMEtTd2dYQ0pjWEc1Y0lpd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNVFE2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TVRRcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2N6QTBPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdjekEwS1N3Z1hDSmNYRzVjSWlrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXdnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTWlrZ0sxeHVJQ0FnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSWpOemMzTnpjM1hDSXNJRndpSXpoQ04wVTJOVndpTENCY0lpTkJNamcwTlRKY0lpd2dYQ0lqUXpJNE9EUkVYQ0lzSUZ3aUkwWXlPRVV5UTF3aUtTa2dLMXh1SUNCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTFRBdU5Td2dNQzR4S1NsY2JseHVYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0ltUnBabVpUWTI5eVpWOWlZWEp3Ykc5MFgzQnpSM0p2ZFhCZlpGUkJSMTkyYzE5RVRWTlBYekpjSWlsY2JuZHBaSFJvSUR3dElETXpLbTF0Vkc5SmJtTm9YRzVvWldsbmFIUWdQQzB6TXlwdGJWUnZTVzVqYUZ4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJG1lYW5fZGlmZl9zY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG5wczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXIzXFwpLCA1KVxucHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwc092ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIFxuICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIFxuICAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BXG4gICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFxcQXZlcmFnZSDOlCBsb29wIHNjb3JlXFwpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IHBzT3ZlciksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMwNDogXFwsIGNvbnZQdmFsdWUocHMwNCksIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDIpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcIzc3Nzc3N1xcLCBcXCM4QjdFNjVcXCwgXFwjQTI4NDUyXFwsIFxcI0MyODg0RFxcLCBcXCNGMjhFMkNcXCkpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuMSkpXG5cblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxkaWZmU2NvcmVfYmFycGxvdF9wc0dyb3VwX2RUQUdfdnNfRE1TT18yXFwpXG53aWR0aCA8LSAzMyptbVRvSW5jaFxuaGVpZ2h0IDwtMzMqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(psOver ==group1) )$mean_diff_score
  distance2 <- (data %>% dplyr::filter(psOver ==group2) )$mean_diff_score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

ps01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(temp, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(temp, \psOver1\, \psOver4\), 5)
ps04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)


p <- ggplot(temp, aes(x = psOver, y = mean_diff_score)) + 
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineMedium * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \Average Δ loop score\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) +
    scale_fill_manual(values = c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\)) +
  coord_cartesian(ylim = c(-0.5, 0.1))



fileName <- paste0(\diffScore_barplot_psGroup_dTAG_vs_DMSO_2\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2MwOTJaWElnUFQxbmNtOTFjREVwSUNra2JXVmhibDlrYVdabVgzTmpiM0psWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGdJSGRwYkNBOExTQjNhV3hqYjNndWRHVnpkQ2hrYVhOMFlXNWpaVEVzSUdScGMzUmhibU5sTWlsY2JpQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1ZlZ4dVhHNXdjekF4SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hGeHdjMDkyWlhJd1hGd3NJRnhjY0hOUGRtVnlNVnhjS1N3Z05TbGNibkJ6TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNYSEJ6VDNabGNqRmNYQ3dnWEZ4d2MwOTJaWEl5WEZ3cExDQTFLVnh1Y0hNeU15QThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRnhjY0hOUGRtVnlNbHhjTENCY1hIQnpUM1psY2pOY1hDa3NJRFVwWEc1d2N6TTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWEZ4d2MwOTJaWEl6WEZ3c0lGeGNjSE5QZG1WeU5GeGNLU3dnTlNsY2JuQnpNalFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TENCY1hIQnpUM1psY2pKY1hDd2dYRnh3YzA5MlpYSTBYRndwTENBMUtWeHVjSE14TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGeGNjSE5QZG1WeU1WeGNMQ0JjWEhCelQzWmxjalJjWENrc0lEVXBYRzV3Y3pBMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYRnh3YzA5MlpYSXdYRndzSUZ4Y2NITlBkbVZ5TkZ4Y0tTd2dOU2xjYmx4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlIQnpUM1psY2l3Z2VTQTlJRzFsWVc1ZlpHbG1abDl6WTI5eVpTa3BJQ3NnWEc0Z0lHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnY0hOUGRtVnlLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFRXVmthWFZ0SUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0sxeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqTXNJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpVMWxaR2wxYlNBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtGY2JpQWdLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUd4aFluTW9lQ0E5SUU1VlRFd2dMQ0I1SUQwZ1hGeEJkbVZ5WVdkbElNNlVJR3h2YjNBZ2MyTnZjbVZjWENrZ0sxeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1hHNGdJQ0FnWVdWektHZHliM1Z3SUQwZ2NITlBkbVZ5S1N3Z1puVnVJRDBnYldWaGJpeGNiaUFnSUNCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01DNDFMRnh1SUNBZ0lHWnBiR3dnUFNCY1hHSnNZV05yWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y1hHNGdJQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXBJQ3RjYmlBZ2RHaGxiV1VvWEc0Z0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQmhibWRzWlNBOUlEUTFMQ0JvYW5WemRDQTlJREVzSUhacWRYTjBJRDBnTVZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1c2FXNWxJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hDd2djMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWEZ4MGNtRnVjM0JoY21WdWRGeGNLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5a3NYRzRnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtWeHVJQ0FwSzF4dUlDQmhibTV2ZEdGMFpTaGNYSFJsZUhSY1hDd2dlQ0E5SURFc0lIa2dQU0F3TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjWEhCek1ERTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNREVwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3Y3pFeU9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod2N6RXlLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSE15TXpvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hNeU15a3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNelE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TXpRcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6STBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekkwS1N3Z1hGeGNYRzVjWEN3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek1UUTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNVFFwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3Y3pBME9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod2N6QTBLU3dnWEZ4Y1hHNWNYQ2tzSUZ4dUlDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNaWtnSzF4dUlDQWdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWEZ3ak56YzNOemMzWEZ3c0lGeGNJemhDTjBVMk5WeGNMQ0JjWENOQk1qZzBOVEpjWEN3Z1hGd2pRekk0T0RSRVhGd3NJRnhjSTBZeU9FVXlRMXhjS1NrZ0sxeHVJQ0JqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9MVEF1TlN3Z01DNHhLU2xjYmx4dVhHNWNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEdScFptWlRZMjl5WlY5aVlYSndiRzkwWDNCelIzSnZkWEJmWkZSQlIxOTJjMTlFVFZOUFh6SmNYQ2xjYm5kcFpIUm9JRHd0SURNekttMXRWRzlKYm1Ob1hHNW9aV2xuYUhRZ1BDMHpNeXB0YlZSdlNXNWphRnh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRtZWFuX2RpZmZfc2NvcmVcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMikgKSRtZWFuX2RpZmZfc2NvcmVcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjJcXCksIDUpXG5wczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gcHNPdmVyLCB5ID0gbWVhbl9kaWZmX3Njb3JlKSkgKyBcbiAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwc092ZXIpLCBcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQVxuICApICsgdGhlbWVfY2xhc3NpYygpICsgbGFicyh4ID0gTlVMTCAsIHkgPSBcXEF2ZXJhZ2UgzpQgbG9vcCBzY29yZVxcKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsIGNvbnZQdmFsdWUocHMxNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAyKSArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCM3Nzc3NzdcXCwgXFwjOEI3RTY1XFwsIFxcI0EyODQ1MlxcLCBcXCNDMjg4NERcXCwgXFwjRjI4RTJDXFwpKSArXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC41LCAwLjEpKVxuXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcZGlmZlNjb3JlX2JhcnBsb3RfcHNHcm91cF9kVEFHX3ZzX0RNU09fMlxcKVxud2lkdGggPC0gMzMqbW1Ub0luY2hcbmhlaWdodCA8LTMzKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbWVhbl9kaWZmX3Njb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHBzT3ZlciwgeSA9IG1lYW5fZGlmZl9zY29yZSkpICsgXG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkFcbiAgKSArIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxBdmVyYWdlIM6UIGxvb3Agc2NvcmVcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjNzc3Nzc3XFwsIFxcIzhCN0U2NVxcLCBcXCNBMjg0NTJcXCwgXFwjQzI4ODREXFwsIFxcI0YyOEUyQ1xcKSkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC4xKSlcblxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGRpZmZTY29yZV9iYXJwbG90X3BzR3JvdXBfZFRBR192c19ETVNPXzJcXClcbndpZHRoIDwtIDMzKm1tVG9JbmNoXG5oZWlnaHQgPC0zMyptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(psOver ==group1) )$mean_diff_score
  distance2 <- (data %>% dplyr::filter(psOver ==group2) )$mean_diff_score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

ps01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(temp, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(temp, \psOver1\, \psOver4\), 5)
ps04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)


p <- ggplot(temp, aes(x = psOver, y = mean_diff_score)) + 
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineMedium * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \Average Δ loop score\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) +
    scale_fill_manual(values = c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\)) +
  coord_cartesian(ylim = c(-0.5, 0.1))



fileName <- paste0(\diffScore_barplot_psGroup_dTAG_vs_DMSO_2\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### GO for each group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR1Z0Y0NBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dGaWMweHZaekpHUXlBOUlHRmljeWhzYjJjeVJtOXNaRU5vWVc1blpTa3BYRzVjYm10elgzSmxjM1ZzZERFZ1BDMGdhM011ZEdWemRDaGNiaUFnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMGdYQ0p3YzA5MlpYSTBYQ0lwSUNVK0pTQndkV3hzS0dGaWMweHZaekpHUXlrc1hHNGdJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2NITlBkbVZ5SUQwOUlGd2ljSE5QZG1WeU0xd2lLU0FsUGlVZ2NIVnNiQ2hoWW5OTWIyY3lSa01wWEc0cFhHNXJjMTl5WlhOMWJIUXlJRHd0SUd0ekxuUmxjM1FvWEc0Z0lIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvY0hOUGRtVnlJRDA5SUZ3aWNITlBkbVZ5TkZ3aUtTQWxQaVVnY0hWc2JDaGhZbk5NYjJjeVJrTXBMRnh1SUNCMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSEJ6VDNabGNpQTlQU0JjSW5CelQzWmxjakpjSWlrZ0pUNGxJSEIxYkd3b1lXSnpURzluTWtaREtWeHVLVnh1YTNOZmNtVnpkV3gwTXlBOExTQnJjeTUwWlhOMEtGeHVJQ0IwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIQnpUM1psY2lBOVBTQmNJbkJ6VDNabGNqUmNJaWtnSlQ0bElIQjFiR3dvWVdKelRHOW5Na1pES1N4Y2JpQWdkR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2MwOTJaWElnUFQwZ1hDSndjMDkyWlhJeFhDSXBJQ1UrSlNCd2RXeHNLR0ZpYzB4dlp6SkdReWxjYmlsY2JtdHpYM0psYzNWc2REUWdQQzBnYTNNdWRHVnpkQ2hjYmlBZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3YzA5MlpYSWdQVDBnWENKd2MwOTJaWEkwWENJcElDVStKU0J3ZFd4c0tHRmljMHh2WnpKR1F5a3NYRzRnSUhSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jSE5QZG1WeUlEMDlJRndpY0hOUGRtVnlNRndpS1NBbFBpVWdjSFZzYkNoaFluTk1iMmN5UmtNcFhHNHBYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnWVdKelRHOW5Na1pETENCamIyeHZjaUE5SUhCelQzWmxjaWtwSUN0Y2JuTmpZV3hsWDJOdmJHOXlYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQW9ZeWhjSWlNM056YzNOemRjSWl3Z1hDSWpPRUkzUlRZMVhDSXNJRndpSTBFeU9EUTFNbHdpTENCY0lpTkRNamc0TkVSY0lpd2dYQ0lqUmpJNFJUSkRYQ0lwS1NrZ0sxeHVJQ0J6ZEdGMFgyVmpaR1lvYzJsNlpTQTlJREF1TkN3Z2JHbHVaWGRwWkhSb0lEMGdiR2x1WlUxbFpHbDFiU0FxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lnS1NBcklDTWdWWE5sSUhOMFlYUmZaV05rWmlCMGJ5QndiRzkwSUhSb1pTQmxiWEJwY21sallXd2dRMFJHWEc0Z0lHeGhZbk1vWEc0Z0lDQWdlQ0E5SUZ3aVFXSnpMaUJzYjJjeUtHWnZiR1FnWTJoaGJtZGxLVndpTEZ4dUlDQWdJSGtnUFNCY0lrTjFiWFZzWVhScGRtVWdVSEp2WW1GaWFXeHBkSGxjSWx4dUlDQXBJQ3NnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGhzYVcwZ1BTQmpLREFzSURFdU5Ta3BJQ3RjYmlBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ0l5QkRiR1ZoYmlCMGFHVnRaVnh1SUNCMGFHVnRaU2hjYmlBZ0lDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpVMHNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXViR2x1WlNBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUnBZMnR6SUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXhjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENKY2JpQWdJQ0FwTEZ4dUlDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ3aWRISmhibk53WVhKbGJuUmNJaWtzWEc0Z0lDQWdiR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdYQ0p1YjI1bFhDSXNYRzRnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlsY2JpQWdJQ0FwSUNzZ2MyTmhiR1ZmZVY5amIyNTBhVzUxYjNWektHeGhZbVZzY3lBOUlITmpZV3hsY3pvNmJuVnRZbVZ5WDJadmNtMWhkQ2hoWTJOMWNtRmplU0E5SURBdU1Ta3BYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKc2IyY3lSa05mWTJSbVgzQnpSM0p2ZFhCZlpGUkJSMTkyYzE5RVRWTlBYQ0lwWEc1M2FXUjBhQ0E4TFNBek15cHRiVlJ2U1c1amFGeHVhR1ZwWjJoMElEd3RNek1xYlcxVWIwbHVZMmhjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibHh1WEc1Y2JseHVJMXh1SUdkbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvY0hOUGRtVnlJRDA5WjNKdmRYQXhLU0FwSkd4dlp6SkdiMnhrUTJoaGJtZGxYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2MwOTJaWElnUFQxbmNtOTFjRElwSUNra2JHOW5Na1p2YkdSRGFHRnVaMlZjYmlBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SUNCeVpYUjFjbTRvZDJsc0pIQXVkbUZzZFdVcFhHNTlYRzVjYm5SbGJYQkViM2R1SUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYkc5bk1rWnZiR1JEYUdGdVoyVWdQQ0F3S1Z4dUlGeHVjSE13TVNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjSW5CelQzWmxjakJjSWl3Z1hDSndjMDkyWlhJeFhDSXBMQ0ExS1Z4dWNITXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNJbkJ6VDNabGNqRmNJaXdnWENKd2MwOTJaWEl5WENJcExDQTFLVnh1Y0hNeU15QThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY0luQnpUM1psY2pKY0lpd2dYQ0p3YzA5MlpYSXpYQ0lwTENBMUtWeHVjSE16TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjSW5CelQzWmxjak5jSWl3Z1hDSndjMDkyWlhJMFhDSXBMQ0ExS1Z4dWNITXlOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNJbkJ6VDNabGNqSmNJaXdnWENKd2MwOTJaWEkwWENJcExDQTFLVnh1Y0hNeE5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY0luQnpUM1psY2pGY0lpd2dYQ0p3YzA5MlpYSTBYQ0lwTENBMUtWeHVYRzV3Y3pBMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNFUnZkMjRzSUZ3aWNITlBkbVZ5TUZ3aUxDQmNJbkJ6VDNabGNqUmNJaWtzSURVcFhHNWNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjRVJ2ZDI0c0lHRmxjeWg0SUQwZ2NITlBkbVZ5TENCNUlEMGdiRzluTWtadmJHUkRhR0Z1WjJVcEtTQXJJRnh1SUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2lJMFE1UkRsRU9Wd2lMQ0JjSWlOQ1JrSkdRa1pjSWl3Z1hDSWpRVFpCTmtFMlhDSXNJRndpSXpoRE9FTTRRMXdpTENCY0lpTTNNemN6TnpOY0lpa3BJQ3NnSXlCR2FYWmxJSE5vWVdSbGN5QnZaaUJuY21WNVhHNGdJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ2NITlBkbVZ5S1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QlhHNGdJQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCc1lXSnpLSGdnUFNCT1ZVeE1JQ3dnZVNBOUlGd2liRzluTWlobWIyeGtJR05vWVc1blpTbGNJaWtnSzF4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWEc0Z0lDQWdZV1Z6S0dkeWIzVndJRDBnY0hOUGRtVnlLU3dnWm5WdUlEMGdiV1ZoYml4Y2JpQWdJQ0JuWlc5dElEMGdYQ0p3YjJsdWRGd2lMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTVN4Y2JpQWdJQ0JtYVd4c0lEMGdYQ0p5WldSY0lpd2dZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSmNiaUFnS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ2tnSzF4dUlDQjBhR1Z0WlNoY2JpQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5d2dabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUdocWRYTjBJRDBnTVN3Z2RtcDFjM1FnUFNBeFhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY0luUnlZVzV6Y0dGeVpXNTBYQ0lwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNrclhHNGdJR0Z1Ym05MFlYUmxLRndpZEdWNGRGd2lMQ0I0SUQwZ01Td2dlU0E5SUMwd0xqVXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGd2ljSE13TVRvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNd01Ta3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNVEk2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TVRJcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2N6SXpPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdjekl6S1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hNek5Eb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NITXpOQ2tzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TWpRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1qUXBMQ0JjSWx4Y2Jsd2lMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE14TkRvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNeE5Da3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNRFE2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TURRcExDQmNJbHhjYmx3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBeUtTQXJJR052YjNKa1gyTmhjblJsYzJsaGJpaDViR2x0SUQwZ1l5Z3RNU3dnTUNrcFhHNGdJRnh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWJHOW5Na1pEWDJKaGNuQnNiM1JmY0hOSGNtOTFjRjlrVkVGSFgzWnpYMFJOVTA5ZlpHOTNibHdpS1Z4dWQybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtERXVNaWtxYlcxVWIwbHVZMmhjYm1obGFXZG9kQ0E4TFNCd1lXNWxiRk5wZW1Vb01Ta3FiVzFVYjBsdVkyaGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JseHVYRzVjYm5SbGJYQlZjQ0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR3h2WnpKR2IyeGtRMmhoYm1kbElENGdNQ2xjYmlCY2JuQnpNREVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VlhBc0lGd2ljSE5QZG1WeU1Gd2lMQ0JjSW5CelQzWmxjakZjSWlrc0lEVXBYRzV3Y3pFeUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjSW5CelQzWmxjakZjSWl3Z1hDSndjMDkyWlhJeVhDSXBMQ0ExS1Z4dWNITXlNeUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJWY0N3Z1hDSndjMDkyWlhJeVhDSXNJRndpY0hOUGRtVnlNMXdpS1N3Z05TbGNibkJ6TXpRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1ZYQXNJRndpY0hOUGRtVnlNMXdpTENCY0luQnpUM1psY2pSY0lpa3NJRFVwWEc1d2N6STBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY0luQnpUM1psY2pKY0lpd2dYQ0p3YzA5MlpYSTBYQ0lwTENBMUtWeHVjSE14TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVmNDd2dYQ0p3YzA5MlpYSXhYQ0lzSUZ3aWNITlBkbVZ5TkZ3aUtTd2dOU2xjYm5Cek1EUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdWWEFzSUZ3aWNITlBkbVZ5TUZ3aUxDQmNJbkJ6VDNabGNqUmNJaWtzSURVcFhHNWNibHh1WEc1Y2JuQWdQQzBnWjJkd2JHOTBLSFJsYlhCVmNDd2dZV1Z6S0hnZ1BTQndjMDkyWlhJc0lIa2dQU0JzYjJjeVJtOXNaRU5vWVc1blpTa3BJQ3NnWEc0Z0lITmpZV3hsWDJacGJHeGZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YQ0lqUkRsRU9VUTVYQ0lzSUZ3aUkwSkdRa1pDUmx3aUxDQmNJaU5CTmtFMlFUWmNJaXdnWENJak9FTTRRemhEWENJc0lGd2lJemN6TnpNM00xd2lLU2tnS3lBaklFWnBkbVVnYzJoaFpHVnpJRzltSUdkeVpYbGNiaUFnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQndjMDkyWlhJcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3RjYmlBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRmNiaUFnS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHeGhZbk1vZUNBOUlFNVZURXdnTENCNUlEMGdYQ0pzYjJjeUtHWnZiR1FnWTJoaGJtZGxLVndpS1NBclhHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoY2JpQWdJQ0JoWlhNb1ozSnZkWEFnUFNCd2MwOTJaWElwTENCbWRXNGdQU0J0WldGdUxGeHVJQ0FnSUdkbGIyMGdQU0JjSW5CdmFXNTBYQ0lzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBeExGeHVJQ0FnSUdacGJHd2dQU0JjSW5KbFpGd2lMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJbHh1SUNBcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ3dnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwS1NBclhHNGdJSFJvWlcxbEtGeHVJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl3Z1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZEM1NElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnWVc1bmJHVWdQU0EwTlN3Z2FHcDFjM1FnUFNBeExDQjJhblZ6ZENBOUlERmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXViR2x1WlNBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpd2djMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBcExGeHVJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGd2lkSEpoYm5Od1lYSmxiblJjSWlrc1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWxjYmlBZ0tTdGNiaUFnWVc1dWIzUmhkR1VvWENKMFpYaDBYQ0lzSUhnZ1BTQXhMQ0I1SUQwZ01DNDFMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkJ6TURFNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1ERXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekV5T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pFeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNITXlNem9nWENJc0lHTnZiblpRZG1Gc2RXVW9jSE15TXlrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5Cek16UTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNelFwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pJME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6STBLU3dnWENKY1hHNWNJaXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TVRRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1UUXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekEwT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pBMEtTd2dYQ0pjWEc1Y0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ01pa2dLeUJqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9NQ3dnTVNrcFhHNWNiaUFnWEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSnNiMmN5UmtOZlltRnljR3h2ZEY5d2MwZHliM1Z3WDJSVVFVZGZkbk5mUkUxVFQxOTFjRndpS1Z4dWQybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtERXVNVGdwS20xdFZHOUpibU5vWEc1b1pXbG5hSFFnUEMwZ2NHRnVaV3hUYVhwbEtERXBLbTF0Vkc5SmJtTm9YRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKGFic0xvZzJGQyA9IGFicyhsb2cyRm9sZENoYW5nZSkpXG5cbmtzX3Jlc3VsdDEgPC0ga3MudGVzdChcbiAgdGVtcCAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT0gXFxwc092ZXI0XFwpICU+JSBwdWxsKGFic0xvZzJGQyksXG4gIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09IFxccHNPdmVyM1xcKSAlPiUgcHVsbChhYnNMb2cyRkMpXG4pXG5rc19yZXN1bHQyIDwtIGtzLnRlc3QoXG4gIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09IFxccHNPdmVyNFxcKSAlPiUgcHVsbChhYnNMb2cyRkMpLFxuICB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PSBcXHBzT3ZlcjJcXCkgJT4lIHB1bGwoYWJzTG9nMkZDKVxuKVxua3NfcmVzdWx0MyA8LSBrcy50ZXN0KFxuICB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PSBcXHBzT3ZlcjRcXCkgJT4lIHB1bGwoYWJzTG9nMkZDKSxcbiAgdGVtcCAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT0gXFxwc092ZXIxXFwpICU+JSBwdWxsKGFic0xvZzJGQylcbilcbmtzX3Jlc3VsdDQgPC0ga3MudGVzdChcbiAgdGVtcCAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT0gXFxwc092ZXI0XFwpICU+JSBwdWxsKGFic0xvZzJGQyksXG4gIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09IFxccHNPdmVyMFxcKSAlPiUgcHVsbChhYnNMb2cyRkMpXG4pXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gYWJzTG9nMkZDLCBjb2xvciA9IHBzT3ZlcikpICtcbnNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSAoYyhcXCM3Nzc3NzdcXCwgXFwjOEI3RTY1XFwsIFxcI0EyODQ1MlxcLCBcXCNDMjg4NERcXCwgXFwjRjI4RTJDXFwpKSkgK1xuICBzdGF0X2VjZGYoc2l6ZSA9IDAuNCwgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwgKSArICMgVXNlIHN0YXRfZWNkZiB0byBwbG90IHRoZSBlbXBpcmljYWwgQ0RGXG4gIGxhYnMoXG4gICAgeCA9IFxcQWJzLiBsb2cyKGZvbGQgY2hhbmdlKVxcLFxuICAgIHkgPSBcXEN1bXVsYXRpdmUgUHJvYmFiaWxpdHlcXFxuICApICsgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDEuNSkpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgIyBDbGVhbiB0aGVtZVxuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDAuMSkpXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfY2RmX3BzR3JvdXBfZFRBR192c19ETVNPXFwpXG53aWR0aCA8LSAzMyptbVRvSW5jaFxuaGVpZ2h0IDwtMzMqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cblxuI1xuIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJGxvZzJGb2xkQ2hhbmdlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnRlbXBEb3duIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKVxuIFxucHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXIzXFwpLCA1KVxucHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcERvd24sIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIFxuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICsgIyBGaXZlIHNoYWRlcyBvZiBncmV5XG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BXG4gICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFxcbG9nMihmb2xkIGNoYW5nZSlcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IC0wLjUsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsIGNvbnZQdmFsdWUocHMxNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAyKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMSwgMCkpXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcHNHcm91cF9kVEFHX3ZzX0RNU09fZG93blxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMClcbiBcbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG5wczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwc092ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjRDlEOUQ5XFwsIFxcI0JGQkZCRlxcLCBcXCNBNkE2QTZcXCwgXFwjOEM4QzhDXFwsIFxcIzczNzM3M1xcKSkgKyAjIEZpdmUgc2hhZGVzIG9mIGdyZXlcbiAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwc092ZXIpLCBcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkFcbiAgKSArIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxsb2cyKGZvbGQgY2hhbmdlKVxcKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLFxuICAgIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMC41LCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfYmFycGxvdF9wc0dyb3VwX2RUQUdfdnNfRE1TT191cFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMTgpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
temp <- temp %>% dplyr::mutate(absLog2FC = abs(log2FoldChange))

ks_result1 <- ks.test(
  temp %>% dplyr::filter(psOver == \psOver4\) %>% pull(absLog2FC),
  temp %>% dplyr::filter(psOver == \psOver3\) %>% pull(absLog2FC)
)
ks_result2 <- ks.test(
  temp %>% dplyr::filter(psOver == \psOver4\) %>% pull(absLog2FC),
  temp %>% dplyr::filter(psOver == \psOver2\) %>% pull(absLog2FC)
)
ks_result3 <- ks.test(
  temp %>% dplyr::filter(psOver == \psOver4\) %>% pull(absLog2FC),
  temp %>% dplyr::filter(psOver == \psOver1\) %>% pull(absLog2FC)
)
ks_result4 <- ks.test(
  temp %>% dplyr::filter(psOver == \psOver4\) %>% pull(absLog2FC),
  temp %>% dplyr::filter(psOver == \psOver0\) %>% pull(absLog2FC)
)

p <- ggplot(temp, aes(x = absLog2FC, color = psOver)) +
scale_color_manual(values = (c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\))) +
  stat_ecdf(size = 0.4, linewidth = lineMedium * mmToLineUnit, lineend = \square\ ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Abs. log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.position = \none\,
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    ) + scale_y_continuous(labels = scales::number_format(accuracy = 0.1))
fileName <- paste0(\log2FC_cdf_psGroup_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()




#
 getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(psOver ==group1) )$log2FoldChange
  distance2 <- (data %>% dplyr::filter(psOver ==group2) )$log2FoldChange
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
 
ps01 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(tempDown, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver4\), 5)

ps04 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver4\), 5)


p <- ggplot(tempDown, aes(x = psOver, y = log2FoldChange)) + 
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) + # Five shades of grey
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \log2(fold change)\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = -0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) + coord_cartesian(ylim = c(-1, 0))
  
fileName <- paste0(\log2FC_barplot_psGroup_dTAG_vs_DMSO_down\)
width <- panelSize(1.2)*mmToInch
height <- panelSize(1)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
 
ps01 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(tempUp, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver4\), 5)
ps04 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver4\), 5)




p <- ggplot(tempUp, aes(x = psOver, y = log2FoldChange)) + 
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) + # Five shades of grey
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \log2(fold change)\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_psGroup_dTAG_vs_DMSO_up\)
width <- panelSize(1.18)*mmToInch
height <- panelSize(1)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRHVnRjQ0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR0ZpYzB4dlp6SkdReUE5SUdGaWN5aHNiMmN5Um05c1pFTm9ZVzVuWlNrcFhHNWNibXR6WDNKbGMzVnNkREVnUEMwZ2EzTXVkR1Z6ZENoY2JpQWdkR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2MwOTJaWElnUFQwZ1hGeHdjMDkyWlhJMFhGd3BJQ1UrSlNCd2RXeHNLR0ZpYzB4dlp6SkdReWtzWEc0Z0lIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvY0hOUGRtVnlJRDA5SUZ4Y2NITlBkbVZ5TTF4Y0tTQWxQaVVnY0hWc2JDaGhZbk5NYjJjeVJrTXBYRzRwWEc1cmMxOXlaWE4xYkhReUlEd3RJR3R6TG5SbGMzUW9YRzRnSUhSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jSE5QZG1WeUlEMDlJRnhjY0hOUGRtVnlORnhjS1NBbFBpVWdjSFZzYkNoaFluTk1iMmN5UmtNcExGeHVJQ0IwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIQnpUM1psY2lBOVBTQmNYSEJ6VDNabGNqSmNYQ2tnSlQ0bElIQjFiR3dvWVdKelRHOW5Na1pES1Z4dUtWeHVhM05mY21WemRXeDBNeUE4TFNCcmN5NTBaWE4wS0Z4dUlDQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hCelQzWmxjaUE5UFNCY1hIQnpUM1psY2pSY1hDa2dKVDRsSUhCMWJHd29ZV0p6VEc5bk1rWkRLU3hjYmlBZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3YzA5MlpYSWdQVDBnWEZ4d2MwOTJaWEl4WEZ3cElDVStKU0J3ZFd4c0tHRmljMHh2WnpKR1F5bGNiaWxjYm10elgzSmxjM1ZzZERRZ1BDMGdhM011ZEdWemRDaGNiaUFnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMGdYRnh3YzA5MlpYSTBYRndwSUNVK0pTQndkV3hzS0dGaWMweHZaekpHUXlrc1hHNGdJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2NITlBkbVZ5SUQwOUlGeGNjSE5QZG1WeU1GeGNLU0FsUGlVZ2NIVnNiQ2hoWW5OTWIyY3lSa01wWEc0cFhHNWNibkFnUEMwZ1oyZHdiRzkwS0hSbGJYQXNJR0ZsY3loNElEMGdZV0p6VEc5bk1rWkRMQ0JqYjJ4dmNpQTlJSEJ6VDNabGNpa3BJQ3RjYm5OallXeGxYMk52Ykc5eVgyMWhiblZoYkNoMllXeDFaWE1nUFNBb1l5aGNYQ00zTnpjM056ZGNYQ3dnWEZ3ak9FSTNSVFkxWEZ3c0lGeGNJMEV5T0RRMU1seGNMQ0JjWENORE1qZzRORVJjWEN3Z1hGd2pSakk0UlRKRFhGd3BLU2tnSzF4dUlDQnpkR0YwWDJWalpHWW9jMmw2WlNBOUlEQXVOQ3dnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVTFsWkdsMWJTQXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd2dLU0FySUNNZ1ZYTmxJSE4wWVhSZlpXTmtaaUIwYnlCd2JHOTBJSFJvWlNCbGJYQnBjbWxqWVd3Z1EwUkdYRzRnSUd4aFluTW9YRzRnSUNBZ2VDQTlJRnhjUVdKekxpQnNiMmN5S0dadmJHUWdZMmhoYm1kbEtWeGNMRnh1SUNBZ0lIa2dQU0JjWEVOMWJYVnNZWFJwZG1VZ1VISnZZbUZpYVd4cGRIbGNYRnh1SUNBcElDc2dZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIaHNhVzBnUFNCaktEQXNJREV1TlNrcElDdGNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnSXlCRGJHVmhiaUIwYUdWdFpWeHVJQ0IwYUdWdFpTaGNiaUFnSUNBZ0lHRjRhWE11ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hDeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRnhjZEhKaGJuTndZWEpsYm5SY1hDa3NYRzRnSUNBZ2JHVm5aVzVrTG5CdmMybDBhVzl1SUQwZ1hGeHViMjVsWEZ3c1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWxjYmlBZ0lDQXBJQ3NnYzJOaGJHVmZlVjlqYjI1MGFXNTFiM1Z6S0d4aFltVnNjeUE5SUhOallXeGxjem82Ym5WdFltVnlYMlp2Y20xaGRDaGhZMk4xY21GamVTQTlJREF1TVNrcFhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhzYjJjeVJrTmZZMlJtWDNCelIzSnZkWEJmWkZSQlIxOTJjMTlFVFZOUFhGd3BYRzUzYVdSMGFDQThMU0F6TXlwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dE16TXFiVzFVYjBsdVkyaGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JseHVYRzVjYmx4dUkxeHVJR2RsZEZCMllXeFhhV3hqYjNnZ1BDMGdablZ1WTNScGIyNG9aR0YwWVN3Z1ozSnZkWEF4TENCbmNtOTFjRElwZTF4dUlDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jSE5QZG1WeUlEMDlaM0p2ZFhBeEtTQXBKR3h2WnpKR2IyeGtRMmhoYm1kbFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3YzA5MlpYSWdQVDFuY205MWNESXBJQ2trYkc5bk1rWnZiR1JEYUdGdVoyVmNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNWNiblJsYlhCRWIzZHVJRHd0SUhSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iRzluTWtadmJHUkRhR0Z1WjJVZ1BDQXdLVnh1SUZ4dWNITXdNU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNYSEJ6VDNabGNqQmNYQ3dnWEZ4d2MwOTJaWEl4WEZ3cExDQTFLVnh1Y0hNeE1pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY1hIQnpUM1psY2pGY1hDd2dYRnh3YzA5MlpYSXlYRndwTENBMUtWeHVjSE15TXlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjWEhCelQzWmxjakpjWEN3Z1hGeHdjMDkyWlhJelhGd3BMQ0ExS1Z4dWNITXpOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNYSEJ6VDNabGNqTmNYQ3dnWEZ4d2MwOTJaWEkwWEZ3cExDQTFLVnh1Y0hNeU5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY1hIQnpUM1psY2pKY1hDd2dYRnh3YzA5MlpYSTBYRndwTENBMUtWeHVjSE14TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjWEhCelQzWmxjakZjWEN3Z1hGeHdjMDkyWlhJMFhGd3BMQ0ExS1Z4dVhHNXdjekEwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0VSdmQyNHNJRnhjY0hOUGRtVnlNRnhjTENCY1hIQnpUM1psY2pSY1hDa3NJRFVwWEc1Y2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNFUnZkMjRzSUdGbGN5aDRJRDBnY0hOUGRtVnlMQ0I1SUQwZ2JHOW5Na1p2YkdSRGFHRnVaMlVwS1NBcklGeHVJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y0kwUTVSRGxFT1Z4Y0xDQmNYQ05DUmtKR1FrWmNYQ3dnWEZ3alFUWkJOa0UyWEZ3c0lGeGNJemhET0VNNFExeGNMQ0JjWENNM016Y3pOek5jWENrcElDc2dJeUJHYVhabElITm9ZV1JsY3lCdlppQm5jbVY1WEc0Z0lHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnY0hOUGRtVnlLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBclhHNGdJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU1Td2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCWEc0Z0lDa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJzWVdKektIZ2dQU0JPVlV4TUlDd2dlU0E5SUZ4Y2JHOW5NaWhtYjJ4a0lHTm9ZVzVuWlNsY1hDa2dLMXh1SUNCemRHRjBYM04xYlcxaGNua29YRzRnSUNBZ1lXVnpLR2R5YjNWd0lEMGdjSE5QZG1WeUtTd2dablZ1SUQwZ2JXVmhiaXhjYmlBZ0lDQm5aVzl0SUQwZ1hGeHdiMmx1ZEZ4Y0xDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNU3hjYmlBZ0lDQm1hV3hzSUQwZ1hGeHlaV1JjWEN3Z1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ4Y2JpQWdLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBc0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDa2dLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl3Z1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUXVlQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJR2hxZFhOMElEMGdNU3dnZG1wMWMzUWdQU0F4WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xDQnphWHBsSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjWEhSeVlXNXpjR0Z5Wlc1MFhGd3BMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2tyWEc0Z0lHRnVibTkwWVhSbEtGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTVN3Z2VTQTlJQzB3TGpVc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z4Y2NITXdNVG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE13TVNrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek1USTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNVElwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3Y3pJek9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod2N6SXpLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSE16TkRvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hNek5Da3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNalE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TWpRcExDQmNYRnhjYmx4Y0xDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXhORG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE14TkNrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek1EUTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNRFFwTENCY1hGeGNibHhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F5S1NBcklHTnZiM0prWDJOaGNuUmxjMmxoYmloNWJHbHRJRDBnWXlndE1Td2dNQ2twWEc0Z0lGeHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjYkc5bk1rWkRYMkpoY25Cc2IzUmZjSE5IY205MWNGOWtWRUZIWDNaelgwUk5VMDlmWkc5M2JseGNLVnh1ZDJsa2RHZ2dQQzBnY0dGdVpXeFRhWHBsS0RFdU1pa3FiVzFVYjBsdVkyaGNibWhsYVdkb2RDQThMU0J3WVc1bGJGTnBlbVVvTVNrcWJXMVViMGx1WTJoY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dVhHNWNiblJsYlhCVmNDQThMU0IwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHeHZaekpHYjJ4a1EyaGhibWRsSUQ0Z01DbGNiaUJjYm5Cek1ERWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdWWEFzSUZ4Y2NITlBkbVZ5TUZ4Y0xDQmNYSEJ6VDNabGNqRmNYQ2tzSURVcFhHNXdjekV5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNYSEJ6VDNabGNqRmNYQ3dnWEZ4d2MwOTJaWEl5WEZ3cExDQTFLVnh1Y0hNeU15QThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlZjQ3dnWEZ4d2MwOTJaWEl5WEZ3c0lGeGNjSE5QZG1WeU0xeGNLU3dnTlNsY2JuQnpNelFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VlhBc0lGeGNjSE5QZG1WeU0xeGNMQ0JjWEhCelQzWmxjalJjWENrc0lEVXBYRzV3Y3pJMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjWEhCelQzWmxjakpjWEN3Z1hGeHdjMDkyWlhJMFhGd3BMQ0ExS1Z4dWNITXhOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJWY0N3Z1hGeHdjMDkyWlhJeFhGd3NJRnhjY0hOUGRtVnlORnhjS1N3Z05TbGNibkJ6TURRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1ZYQXNJRnhjY0hOUGRtVnlNRnhjTENCY1hIQnpUM1psY2pSY1hDa3NJRFVwWEc1Y2JseHVYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtIUmxiWEJWY0N3Z1lXVnpLSGdnUFNCd2MwOTJaWElzSUhrZ1BTQnNiMmN5Um05c1pFTm9ZVzVuWlNrcElDc2dYRzRnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hGd2pSRGxFT1VRNVhGd3NJRnhjSTBKR1FrWkNSbHhjTENCY1hDTkJOa0UyUVRaY1hDd2dYRndqT0VNNFF6aERYRndzSUZ4Y0l6Y3pOek0zTTF4Y0tTa2dLeUFqSUVacGRtVWdjMmhoWkdWeklHOW1JR2R5WlhsY2JpQWdaMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCd2MwOTJaWElwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDdGNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtGY2JpQWdLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUd4aFluTW9lQ0E5SUU1VlRFd2dMQ0I1SUQwZ1hGeHNiMmN5S0dadmJHUWdZMmhoYm1kbEtWeGNLU0FyWEc0Z0lITjBZWFJmYzNWdGJXRnllU2hjYmlBZ0lDQmhaWE1vWjNKdmRYQWdQU0J3YzA5MlpYSXBMQ0JtZFc0Z1BTQnRaV0Z1TEZ4dUlDQWdJR2RsYjIwZ1BTQmNYSEJ2YVc1MFhGd3NJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F4TEZ4dUlDQWdJR1pwYkd3Z1BTQmNYSEpsWkZ4Y0xDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hGeHVJQ0FwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Dd2diR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBLU0FyWEc0Z0lIUm9aVzFsS0Z4dUlDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2dZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXdnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQzU0SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdZVzVuYkdVZ1BTQTBOU3dnYUdwMWMzUWdQU0F4TENCMmFuVnpkQ0E5SURGY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJwWTJ0eklEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN3Z2MybDZaU0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ4Y2RISmhibk53WVhKbGJuUmNYQ2tzWEc0Z0lDQWdiR1ZuWlc1a0xuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5bGNiaUFnS1N0Y2JpQWdZVzV1YjNSaGRHVW9YRngwWlhoMFhGd3NJSGdnUFNBeExDQjVJRDBnTUM0MUxDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQnpNREU2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TURFcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6RXlPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekV5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hNeU16b2dYRndzSUdOdmJuWlFkbUZzZFdVb2NITXlNeWtzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEJ6TXpRNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek16UXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekkwT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pJMEtTd2dYRnhjWEc1Y1hDd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNVFE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TVRRcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6QTBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekEwS1N3Z1hGeGNYRzVjWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTWlrZ0t5QmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb01Dd2dNU2twWEc1Y2JpQWdYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4c2IyY3lSa05mWW1GeWNHeHZkRjl3YzBkeWIzVndYMlJVUVVkZmRuTmZSRTFUVDE5MWNGeGNLVnh1ZDJsa2RHZ2dQQzBnY0dGdVpXeFRhWHBsS0RFdU1UZ3BLbTF0Vkc5SmJtTm9YRzVvWldsbmFIUWdQQzBnY0dGdVpXeFRhWHBsS0RFcEttMXRWRzlKYm1Ob1hHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKGFic0xvZzJGQyA9IGFicyhsb2cyRm9sZENoYW5nZSkpXG5cbmtzX3Jlc3VsdDEgPC0ga3MudGVzdChcbiAgdGVtcCAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT0gXFxwc092ZXI0XFwpICU+JSBwdWxsKGFic0xvZzJGQyksXG4gIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09IFxccHNPdmVyM1xcKSAlPiUgcHVsbChhYnNMb2cyRkMpXG4pXG5rc19yZXN1bHQyIDwtIGtzLnRlc3QoXG4gIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09IFxccHNPdmVyNFxcKSAlPiUgcHVsbChhYnNMb2cyRkMpLFxuICB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PSBcXHBzT3ZlcjJcXCkgJT4lIHB1bGwoYWJzTG9nMkZDKVxuKVxua3NfcmVzdWx0MyA8LSBrcy50ZXN0KFxuICB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PSBcXHBzT3ZlcjRcXCkgJT4lIHB1bGwoYWJzTG9nMkZDKSxcbiAgdGVtcCAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT0gXFxwc092ZXIxXFwpICU+JSBwdWxsKGFic0xvZzJGQylcbilcbmtzX3Jlc3VsdDQgPC0ga3MudGVzdChcbiAgdGVtcCAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT0gXFxwc092ZXI0XFwpICU+JSBwdWxsKGFic0xvZzJGQyksXG4gIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09IFxccHNPdmVyMFxcKSAlPiUgcHVsbChhYnNMb2cyRkMpXG4pXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gYWJzTG9nMkZDLCBjb2xvciA9IHBzT3ZlcikpICtcbnNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSAoYyhcXCM3Nzc3NzdcXCwgXFwjOEI3RTY1XFwsIFxcI0EyODQ1MlxcLCBcXCNDMjg4NERcXCwgXFwjRjI4RTJDXFwpKSkgK1xuICBzdGF0X2VjZGYoc2l6ZSA9IDAuNCwgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwgKSArICMgVXNlIHN0YXRfZWNkZiB0byBwbG90IHRoZSBlbXBpcmljYWwgQ0RGXG4gIGxhYnMoXG4gICAgeCA9IFxcQWJzLiBsb2cyKGZvbGQgY2hhbmdlKVxcLFxuICAgIHkgPSBcXEN1bXVsYXRpdmUgUHJvYmFiaWxpdHlcXFxuICApICsgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDEuNSkpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgIyBDbGVhbiB0aGVtZVxuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDAuMSkpXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfY2RmX3BzR3JvdXBfZFRBR192c19ETVNPXFwpXG53aWR0aCA8LSAzMyptbVRvSW5jaFxuaGVpZ2h0IDwtMzMqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cblxuI1xuIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJGxvZzJGb2xkQ2hhbmdlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnRlbXBEb3duIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKVxuIFxucHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXIzXFwpLCA1KVxucHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcERvd24sIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIFxuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICsgIyBGaXZlIHNoYWRlcyBvZiBncmV5XG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BXG4gICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFxcbG9nMihmb2xkIGNoYW5nZSlcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IC0wLjUsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsIGNvbnZQdmFsdWUocHMxNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAyKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMSwgMCkpXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcHNHcm91cF9kVEFHX3ZzX0RNU09fZG93blxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMClcbiBcbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG5wczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwc092ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjRDlEOUQ5XFwsIFxcI0JGQkZCRlxcLCBcXCNBNkE2QTZcXCwgXFwjOEM4QzhDXFwsIFxcIzczNzM3M1xcKSkgKyAjIEZpdmUgc2hhZGVzIG9mIGdyZXlcbiAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwc092ZXIpLCBcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkFcbiAgKSArIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxsb2cyKGZvbGQgY2hhbmdlKVxcKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLFxuICAgIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMC41LCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfYmFycGxvdF9wc0dyb3VwX2RUQUdfdnNfRE1TT191cFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMTgpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKGFic0xvZzJGQyA9IGFicyhsb2cyRm9sZENoYW5nZSkpXG5cbmtzX3Jlc3VsdDEgPC0ga3MudGVzdChcbiAgdGVtcCAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT0gXFxwc092ZXI0XFwpICU+JSBwdWxsKGFic0xvZzJGQyksXG4gIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09IFxccHNPdmVyM1xcKSAlPiUgcHVsbChhYnNMb2cyRkMpXG4pXG5rc19yZXN1bHQyIDwtIGtzLnRlc3QoXG4gIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09IFxccHNPdmVyNFxcKSAlPiUgcHVsbChhYnNMb2cyRkMpLFxuICB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PSBcXHBzT3ZlcjJcXCkgJT4lIHB1bGwoYWJzTG9nMkZDKVxuKVxua3NfcmVzdWx0MyA8LSBrcy50ZXN0KFxuICB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PSBcXHBzT3ZlcjRcXCkgJT4lIHB1bGwoYWJzTG9nMkZDKSxcbiAgdGVtcCAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT0gXFxwc092ZXIxXFwpICU+JSBwdWxsKGFic0xvZzJGQylcbilcbmtzX3Jlc3VsdDQgPC0ga3MudGVzdChcbiAgdGVtcCAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT0gXFxwc092ZXI0XFwpICU+JSBwdWxsKGFic0xvZzJGQyksXG4gIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09IFxccHNPdmVyMFxcKSAlPiUgcHVsbChhYnNMb2cyRkMpXG4pXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gYWJzTG9nMkZDLCBjb2xvciA9IHBzT3ZlcikpICtcbnNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSAoYyhcXCM3Nzc3NzdcXCwgXFwjOEI3RTY1XFwsIFxcI0EyODQ1MlxcLCBcXCNDMjg4NERcXCwgXFwjRjI4RTJDXFwpKSkgK1xuICBzdGF0X2VjZGYoc2l6ZSA9IDAuNCwgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwgKSArICMgVXNlIHN0YXRfZWNkZiB0byBwbG90IHRoZSBlbXBpcmljYWwgQ0RGXG4gIGxhYnMoXG4gICAgeCA9IFxcQWJzLiBsb2cyKGZvbGQgY2hhbmdlKVxcLFxuICAgIHkgPSBcXEN1bXVsYXRpdmUgUHJvYmFiaWxpdHlcXFxuICApICsgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDEuNSkpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgIyBDbGVhbiB0aGVtZVxuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDAuMSkpXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfY2RmX3BzR3JvdXBfZFRBR192c19ETVNPXFwpXG53aWR0aCA8LSAzMyptbVRvSW5jaFxuaGVpZ2h0IDwtMzMqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cblxuI1xuIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJGxvZzJGb2xkQ2hhbmdlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnRlbXBEb3duIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKVxuIFxucHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXIzXFwpLCA1KVxucHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcERvd24sIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIFxuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICsgIyBGaXZlIHNoYWRlcyBvZiBncmV5XG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BXG4gICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFxcbG9nMihmb2xkIGNoYW5nZSlcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IC0wLjUsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsIGNvbnZQdmFsdWUocHMxNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAyKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMSwgMCkpXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcHNHcm91cF9kVEFHX3ZzX0RNU09fZG93blxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMClcbiBcbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG5wczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwc092ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjRDlEOUQ5XFwsIFxcI0JGQkZCRlxcLCBcXCNBNkE2QTZcXCwgXFwjOEM4QzhDXFwsIFxcIzczNzM3M1xcKSkgKyAjIEZpdmUgc2hhZGVzIG9mIGdyZXlcbiAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwc092ZXIpLCBcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkFcbiAgKSArIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxsb2cyKGZvbGQgY2hhbmdlKVxcKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLFxuICAgIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMC41LCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfYmFycGxvdF9wc0dyb3VwX2RUQUdfdnNfRE1TT191cFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMTgpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
temp <- temp %>% dplyr::mutate(absLog2FC = abs(log2FoldChange))

ks_result1 <- ks.test(
  temp %>% dplyr::filter(psOver == \psOver4\) %>% pull(absLog2FC),
  temp %>% dplyr::filter(psOver == \psOver3\) %>% pull(absLog2FC)
)
ks_result2 <- ks.test(
  temp %>% dplyr::filter(psOver == \psOver4\) %>% pull(absLog2FC),
  temp %>% dplyr::filter(psOver == \psOver2\) %>% pull(absLog2FC)
)
ks_result3 <- ks.test(
  temp %>% dplyr::filter(psOver == \psOver4\) %>% pull(absLog2FC),
  temp %>% dplyr::filter(psOver == \psOver1\) %>% pull(absLog2FC)
)
ks_result4 <- ks.test(
  temp %>% dplyr::filter(psOver == \psOver4\) %>% pull(absLog2FC),
  temp %>% dplyr::filter(psOver == \psOver0\) %>% pull(absLog2FC)
)

p <- ggplot(temp, aes(x = absLog2FC, color = psOver)) +
scale_color_manual(values = (c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\))) +
  stat_ecdf(size = 0.4, linewidth = lineMedium * mmToLineUnit, lineend = \square\ ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Abs. log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.position = \none\,
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    ) + scale_y_continuous(labels = scales::number_format(accuracy = 0.1))
fileName <- paste0(\log2FC_cdf_psGroup_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()




#
 getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(psOver ==group1) )$log2FoldChange
  distance2 <- (data %>% dplyr::filter(psOver ==group2) )$log2FoldChange
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
 
ps01 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(tempDown, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver4\), 5)

ps04 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver4\), 5)


p <- ggplot(tempDown, aes(x = psOver, y = log2FoldChange)) + 
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) + # Five shades of grey
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \log2(fold change)\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = -0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) + coord_cartesian(ylim = c(-1, 0))
  
fileName <- paste0(\log2FC_barplot_psGroup_dTAG_vs_DMSO_down\)
width <- panelSize(1.2)*mmToInch
height <- panelSize(1)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
 
ps01 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(tempUp, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver4\), 5)
ps04 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver4\), 5)




p <- ggplot(tempUp, aes(x = psOver, y = log2FoldChange)) + 
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) + # Five shades of grey
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \log2(fold change)\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_psGroup_dTAG_vs_DMSO_up\)
width <- panelSize(1.18)*mmToInch
height <- panelSize(1)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### loop score

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUIwWlcxd01pQmpiMjUwWVdsdWN5Qm5aVzVsY3lCbWNtOXRJR2R5YjNWd0lERXNJRElzSURVc0lEZ2dZVzVrSUd4dmIzQWdZMjkxYm5SelhHNGpZMkZzWTNWc1lYUnBibWNnWkdsbVppQnpZMjl5WlNCaGJtUWdiRzluTW1aaklHUnBjM1J5YVdKMWRHbHZiaUJpWVhObFpDQnZiaUJ3TFc0Z2JuVnRZbVZ5YzF4dVhHNXdjMDkyWlhJMElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0dVZ1BqMGdOQ2twSkdkbGJtVmNibkJ6VDNabGNqTWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d1pTQStQU0F6TENCdWRXMWZjR1VnUENBMEtTa2taMlZ1WlZ4dWNITlBkbVZ5TWlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0JsSUQ0OUlESXNJRzUxYlY5d1pTQThJRE1wS1NSblpXNWxYRzV3YzA5MlpYSXhJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNHVWdQajBnTVN3Z2JuVnRYM0JsSUR3Z01pa3BKR2RsYm1WY2JuQnpUM1psY2pBZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3WlNBOElERXBLU1JuWlc1bFhHNWNibHh1WEc0akl5QkVhWFpwWkdsdVp5Qm5aVzVsY3lCcGJuUnZJR2R5YjNWd2MxeHVkR1Z0Y0NBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsbVpsOWtWRUZIWDBSTlUwOHNJR1JwYzNSaGJtTmxMQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0J0WldGdUtHUnBabVpmWkZSQlIxOUVUVk5QS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzFsWVc1ZlpHbHpkR0Z1WTJVZ1BTQnRaV0Z1S0dScGMzUmhibU5sS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzVjYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbVJwWm1aZlJ6RXVaRlJCUjE5SE1TNHlhUzVrVkVGSFgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibHh1YldGNFRHOW5Na1pESUQwZ01seHVYRzUwWlcxd0lEd3RJR3hsWm5SZmFtOXBiaWgwWlcxd0xDQmthV1ptTGxKT1FTd2dZbmtnUFNCaktGd2laMlZ1WlZ3aUlEMGdYQ0psYm5ObGJXSnNYMmRsYm1WZmFXUmNJaWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG1iR0ZuSUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCa2FXWm1MbEpPUVM1SE1TNWtWRUZISkdWdWMyVnRZbXhmWjJWdVpWOXBaQ3dnWENJeVJFOVhUbHdpTENCY0lqQk9UMXdpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYaEdiR0ZuSUQwZ0tHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnYldGNFRHOW5Na1pES1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyY3labU5OWVhnZ1BTQndiV0Y0S0hCdGFXNG9jMmh5YVc1clpXUmZiRzluTWtaRExDQnRZWGhNYjJjeVJrTXBMQ0F0YldGNFRHOW5Na1pES1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2htYkdGbktTQWxQaVZjYmlBZ1pISnZjRjl1WVNoemFISnBibXRsWkY5c2IyY3lSa01wWEc1Y2JuUmxiWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hjYmlBZ2NITlBkbVZ5SUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCd2MwOTJaWEkwTENCY0luQnpUM1psY2pSY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjSE5QZG1WeU15d2dYQ0p3YzA5MlpYSXpYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSXlMQ0JjSW5CelQzWmxjakpjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSXhMQ0JjSW5CelQzWmxjakZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjSE5QZG1WeU1Dd2dYQ0p3YzA5MlpYSXdYQ0lzSUU1QktTa3BLU2twSUNVK0pWeHVJQ0JrY205d1gyNWhLSEJ6VDNabGNpbGNibHh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbiMgdGVtcDIgY29udGFpbnMgZ2VuZXMgZnJvbSBncm91cCAxLCAyLCA1LCA4IGFuZCBsb29wIGNvdW50c1xuI2NhbGN1bGF0aW5nIGRpZmYgc2NvcmUgYW5kIGxvZzJmYyBkaXN0cmlidXRpb24gYmFzZWQgb24gcC1uIG51bWJlcnNcblxucHNPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDQpKSRnZW5lXG5wc092ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMywgbnVtX3BlIDwgNCkpJGdlbmVcbnBzT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAyLCBudW1fcGUgPCAzKSkkZ2VuZVxucHNPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDEsIG51bV9wZSA8IDIpKSRnZW5lXG5wc092ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPCAxKSkkZ2VuZVxuXG5cblxuIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHNcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksXG4gICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksXG4gICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5cbm1heExvZzJGQyA9IDJcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZGlmZi5STkEuRzEuZFRBRyRlbnNlbWJsX2dlbmVfaWQsIFxcMkRPV05cXCwgXFwwTk9cXCksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgbG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZykgJT4lXG4gIGRyb3BfbmEoc2hyaW5rZWRfbG9nMkZDKVxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHBzT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcHNPdmVyNCwgXFxwc092ZXI0XFwsXG4gICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjMsIFxccHNPdmVyM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMiwgXFxwc092ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMSwgXFxwc092ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjAsIFxccHNPdmVyMFxcLCBOQSkpKSkpKSAlPiVcbiAgZHJvcF9uYShwc092ZXIpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers

psOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% diff.RNA.G1.dTAG$ensembl_gene_id, \2DOWN\, \0NO\),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                log2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag) %>%
  drop_na(shrinked_log2FC)

temp <- temp %>% dplyr::mutate(
  psOver = ifelse(gene %in% psOver4, \psOver4\,
                  ifelse(gene %in% psOver3, \psOver3\,
                         ifelse(gene %in% psOver2, \psOver2\,
                                ifelse(gene %in% psOver1, \psOver1\,
                                       ifelse(gene %in% psOver0, \psOver0\, NA)))))) %>%
  drop_na(psOver)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QjBaVzF3TWlCamIyNTBZV2x1Y3lCblpXNWxjeUJtY205dElHZHliM1Z3SURFc0lESXNJRFVzSURnZ1lXNWtJR3h2YjNBZ1kyOTFiblJ6WEc0alkyRnNZM1ZzWVhScGJtY2daR2xtWmlCelkyOXlaU0JoYm1RZ2JHOW5NbVpqSUdScGMzUnlhV0oxZEdsdmJpQmlZWE5sWkNCdmJpQndMVzRnYm5WdFltVnljMXh1WEc1d2MwOTJaWEkwSUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjR1VnUGowZ05Da3BKR2RsYm1WY2JuQnpUM1psY2pNZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3WlNBK1BTQXpMQ0J1ZFcxZmNHVWdQQ0EwS1Nra1oyVnVaVnh1Y0hOUGRtVnlNaUE4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQmxJRDQ5SURJc0lHNTFiVjl3WlNBOElETXBLU1JuWlc1bFhHNXdjMDkyWlhJeElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0dVZ1BqMGdNU3dnYm5WdFgzQmxJRHdnTWlrcEpHZGxibVZjYm5CelQzWmxjakFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdaU0E4SURFcEtTUm5aVzVsWEc1Y2JseHVYRzRqSXlCRWFYWnBaR2x1WnlCblpXNWxjeUJwYm5SdklHZHliM1Z3YzF4dWRHVnRjQ0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2xtWmw5a1ZFRkhYMFJOVTA4c0lHUnBjM1JoYm1ObExDQm5aVzVsS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaHRaV0Z1WDJScFptWmZjMk52Y21VZ1BTQnRaV0Z1S0dScFptWmZaRlJCUjE5RVRWTlBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHMWxZVzVmWkdsemRHRnVZMlVnUFNCdFpXRnVLR1JwYzNSaGJtTmxLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDNW5jbTkxY0hNZ1BTQW5aSEp2Y0NjcFhHNWNibVJwWm1ZdVVrNUJJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHUnBabVpmUnpFdVpGUkJSMTlITVM0eWFTNWtWRUZIWDNaelgwY3hMakpwTGtSTlUwOHVkSE4yWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hsYm5ObGJXSnNYMmRsYm1WZmFXUXNJR3h2WnpKR2IyeGtRMmhoYm1kbExDQnphSEpwYm10bFpGOXNiMmN5UmtNc0lIQmhaR29zSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlNsY2JseHViV0Y0VEc5bk1rWkRJRDBnTWx4dVhHNTBaVzF3SUR3dElHeGxablJmYW05cGJpaDBaVzF3TENCa2FXWm1MbEpPUVN3Z1lua2dQU0JqS0Z4Y1oyVnVaVnhjSUQwZ1hGeGxibk5sYldKc1gyZGxibVZmYVdSY1hDa3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobWJHRm5JRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JrYVdabUxsSk9RUzVITVM1a1ZFRkhKR1Z1YzJWdFlteGZaMlZ1WlY5cFpDd2dYRnd5UkU5WFRseGNMQ0JjWERCT1QxeGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhoR2JHRm5JRDBnS0dGaWN5aHphSEpwYm10bFpGOXNiMmN5UmtNcElENGdiV0Y0VEc5bk1rWkRLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJjeVptTk5ZWGdnUFNCd2JXRjRLSEJ0YVc0b2MyaHlhVzVyWldSZmJHOW5Na1pETENCdFlYaE1iMmN5UmtNcExDQXRiV0Y0VEc5bk1rWkRLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZZWEp5WVc1blpTaG1iR0ZuS1NBbFBpVmNiaUFnWkhKdmNGOXVZU2h6YUhKcGJtdGxaRjlzYjJjeVJrTXBYRzVjYm5SbGJYQWdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnY0hOUGRtVnlJRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSTBMQ0JjWEhCelQzWmxjalJjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NITlBkbVZ5TXl3Z1hGeHdjMDkyWlhJelhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndjMDkyWlhJeUxDQmNYSEJ6VDNabGNqSmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndjMDkyWlhJeExDQmNYSEJ6VDNabGNqRmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NITlBkbVZ5TUN3Z1hGeHdjMDkyWlhJd1hGd3NJRTVCS1NrcEtTa3BJQ1UrSlZ4dUlDQmtjbTl3WDI1aEtIQnpUM1psY2lsY2JseHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG4jIHRlbXAyIGNvbnRhaW5zIGdlbmVzIGZyb20gZ3JvdXAgMSwgMiwgNSwgOCBhbmQgbG9vcCBjb3VudHNcbiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzXG5cbnBzT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSA0KSkkZ2VuZVxucHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lXG5wc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmVcbnBzT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAxLCBudW1fcGUgPCAyKSkkZ2VuZVxucHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmVcblxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9kVEFHX0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGRpZmYuUk5BLkcxLmRUQUckZW5zZW1ibF9nZW5lX2lkLCBcXDJET1dOXFwsIFxcME5PXFwpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIGxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpICU+JVxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKFxuICBwc092ZXIgPSBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjQsIFxccHNPdmVyNFxcLFxuICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIzLCBcXHBzT3ZlcjNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjIsIFxccHNPdmVyMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjEsIFxccHNPdmVyMVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIwLCBcXHBzT3ZlcjBcXCwgTkEpKSkpKSkgJT4lXG4gIGRyb3BfbmEocHNPdmVyKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyB0ZW1wMiBjb250YWlucyBnZW5lcyBmcm9tIGdyb3VwIDEsIDIsIDUsIDggYW5kIGxvb3AgY291bnRzXG4jY2FsY3VsYXRpbmcgZGlmZiBzY29yZSBhbmQgbG9nMmZjIGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiBwLW4gbnVtYmVyc1xuXG5wc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gNCkpJGdlbmVcbnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAzLCBudW1fcGUgPCA0KSkkZ2VuZVxucHNPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDIsIG51bV9wZSA8IDMpKSRnZW5lXG5wc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMSwgbnVtX3BlIDwgMikpJGdlbmVcbnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA8IDEpKSRnZW5lXG5cblxuXG4jIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwc1xudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9kVEFHX0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSxcbiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSxcbiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcblxubWF4TG9nMkZDID0gMlxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBkaWZmLlJOQS5HMS5kVEFHJGVuc2VtYmxfZ2VuZV9pZCwgXFwyRE9XTlxcLCBcXDBOT1xcKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKSAlPiVcbiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShcbiAgcHNPdmVyID0gaWZlbHNlKGdlbmUgJWluJSBwc092ZXI0LCBcXHBzT3ZlcjRcXCxcbiAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMywgXFxwc092ZXIzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIyLCBcXHBzT3ZlcjJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIxLCBcXHBzT3ZlcjFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMCwgXFxwc092ZXIwXFwsIE5BKSkpKSkpICU+JVxuICBkcm9wX25hKHBzT3ZlcilcblxuYGBgXG5gYGAifQ== -->

```r
```r
# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers

psOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% diff.RNA.G1.dTAG$ensembl_gene_id, \2DOWN\, \0NO\),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                log2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag) %>%
  drop_na(shrinked_log2FC)

temp <- temp %>% dplyr::mutate(
  psOver = ifelse(gene %in% psOver4, \psOver4\,
                  ifelse(gene %in% psOver3, \psOver3\,
                         ifelse(gene %in% psOver2, \psOver2\,
                                ifelse(gene %in% psOver1, \psOver1\,
                                       ifelse(gene %in% psOver0, \psOver0\, NA)))))) %>%
  drop_na(psOver)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### log2FC

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVSMDltYVdkRWFYSWdQQzBnYUdWeVpTaG1hV2RFYVhJc0lGd2lMaTR2UjA5Y0lpbGNiaU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSTF4dVIwOHdMbVJtSUR3dElHRnpMbVJoZEdFdVpuSmhiV1VvWlc1eWFXTm9SMDhvWjJWdVpTQTlJSEJ6VDNabGNqQXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hDSkZUbE5GVFVKTVhDSXNJRzl1ZENBOUlGd2lRbEJjSWl3Z2NtVmhaR0ZpYkdVZ1BTQlVVbFZGS1NsY2JrZFBNUzVrWmlBOExTQmhjeTVrWVhSaExtWnlZVzFsS0dWdWNtbGphRWRQS0dkbGJtVWdQU0J3YzA5MlpYSXhMQ0JQY21kRVlpQTlJRzl5Wnk1TmJTNWxaeTVrWWl3Z2EyVjVWSGx3WlNBOUlGd2lSVTVUUlUxQ1RGd2lMQ0J2Ym5RZ1BTQmNJa0pRWENJc0lISmxZV1JoWW14bElEMGdWRkpWUlNrcFhHNUhUekl1WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNobGJuSnBZMmhIVHloblpXNWxJRDBnY0hOUGRtVnlNaXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUxDQnlaV0ZrWVdKc1pTQTlJRlJTVlVVcEtWeHVSMDh6TG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCelQzWmxjak1zSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYQ0pGVGxORlRVSk1YQ0lzSUc5dWRDQTlJRndpUWxCY0lpd2djbVZoWkdGaWJHVWdQU0JVVWxWRktTbGNia2RQTkM1a1ppQThMU0JoY3k1a1lYUmhMbVp5WVcxbEtHVnVjbWxqYUVkUEtHZGxibVVnUFNCd2MwOTJaWEkwTENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRndpUlU1VFJVMUNURndpTENCdmJuUWdQU0JjSWtKUVhDSXNJSEpsWVdSaFlteGxJRDBnVkZKVlJTa3BYRzVjYmlNZ1puZHlhWFJsS0VkUE1DNWtaaXdnYUdWeVpTaGNJa2RQWDFCRlgyZHliM1Z3TUM1MGMzWmNJaWtzSUhObGNDQTlJRndpWEZ4MFhDSXBYRzRqSUdaM2NtbDBaU2hIVHpFdVpHWXNJR2hsY21Vb1hDSkhUMTlRUlY5bmNtOTFjREV1ZEhOMlhDSXBMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUtWeHVJeUJtZDNKcGRHVW9SMDh5TG1SbUxDQm9aWEpsS0Z3aVIwOWZVRVZmWjNKdmRYQXlMblJ6ZGx3aUtTd2djMlZ3SUQwZ1hDSmNYSFJjSWlsY2JpTWdabmR5YVhSbEtFZFBNeTVrWml3Z2FHVnlaU2hjSWtkUFgxQkZYMmR5YjNWd015NTBjM1pjSWlrc0lITmxjQ0E5SUZ3aVhGeDBYQ0lwWEc0aklHWjNjbWwwWlNoSFR6UXVaR1lzSUdobGNtVW9YQ0pIVDE5UVJWOW5jbTkxY0RRdWRITjJYQ0lwTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1WEc1Y2JuTjFZbk5sZERBZ1BDMGdSMDh3TG1SbUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtFbEVMQ0JFWlhOamNtbHdkR2x2Yml3Z1IyVnVaVkpoZEdsdkxDQndMbUZrYW5WemRDa2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aM0p2ZFhBZ1BTQmNJa2R5YjNWd0lEQmNJaWtnSlQ0bFhHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtIQXVZV1JxZFhOMEtWeHVjM1ZpYzJWME1TQThMU0JIVHpFdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRndpUjNKdmRYQWdNVndpS1NBbFBpVmNiaUFnWkhCc2VYSTZPbUZ5Y21GdVoyVW9jQzVoWkdwMWMzUXBYRzV6ZFdKelpYUXlJRHd0SUVkUE1pNWtaaUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hKUkN3Z1JHVnpZM0pwY0hScGIyNHNJRWRsYm1WU1lYUnBieXdnY0M1aFpHcDFjM1FwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dkeWIzVndJRDBnWENKSGNtOTFjQ0F5WENJcElDVStKVnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2h3TG1Ga2FuVnpkQ2xjYm5OMVluTmxkRE1nUEMwZ1IwOHpMbVJtSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VsRUxDQkVaWE5qY21sd2RHbHZiaXdnUjJWdVpWSmhkR2x2TENCd0xtRmthblZ6ZENrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCY0lrZHliM1Z3SUROY0lpa2dKVDRsWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0hBdVlXUnFkWE4wS1Z4dWMzVmljMlYwTkNBOExTQkhUelF1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGd2lSM0p2ZFhBZ05Gd2lLU0FsUGlWY2JpQWdaSEJzZVhJNk9tRnljbUZ1WjJVb2NDNWhaR3AxYzNRcFhHNWNibk4xWW5ObGREQWtSMlZ1WlZKaGRHbHZJRHd0SUhOaGNIQnNlU2h6ZEhKemNHeHBkQ2h6ZFdKelpYUXdKRWRsYm1WU1lYUnBieXdnWENJdlhDSXBMQ0JtZFc1amRHbHZiaWg0S1NCaGN5NXVkVzFsY21saktIaGJNVjBwSUM4Z1lYTXViblZ0WlhKcFl5aDRXekpkS1NsY2JuTjFZbk5sZERFa1IyVnVaVkpoZEdsdklEd3RJSE5oY0hCc2VTaHpkSEp6Y0d4cGRDaHpkV0p6WlhReEpFZGxibVZTWVhScGJ5d2dYQ0l2WENJcExDQm1kVzVqZEdsdmJpaDRLU0JoY3k1dWRXMWxjbWxqS0hoYk1WMHBJQzhnWVhNdWJuVnRaWEpwWXloNFd6SmRLU2xjYm5OMVluTmxkRElrUjJWdVpWSmhkR2x2SUR3dElITmhjSEJzZVNoemRISnpjR3hwZENoemRXSnpaWFF5SkVkbGJtVlNZWFJwYnl3Z1hDSXZYQ0lwTENCbWRXNWpkR2x2YmloNEtTQmhjeTV1ZFcxbGNtbGpLSGhiTVYwcElDOGdZWE11Ym5WdFpYSnBZeWg0V3pKZEtTbGNibk4xWW5ObGRETWtSMlZ1WlZKaGRHbHZJRHd0SUhOaGNIQnNlU2h6ZEhKemNHeHBkQ2h6ZFdKelpYUXpKRWRsYm1WU1lYUnBieXdnWENJdlhDSXBMQ0JtZFc1amRHbHZiaWg0S1NCaGN5NXVkVzFsY21saktIaGJNVjBwSUM4Z1lYTXViblZ0WlhKcFl5aDRXekpkS1NsY2JuTjFZbk5sZERRa1IyVnVaVkpoZEdsdklEd3RJSE5oY0hCc2VTaHpkSEp6Y0d4cGRDaHpkV0p6WlhRMEpFZGxibVZTWVhScGJ5d2dYQ0l2WENJcExDQm1kVzVqZEdsdmJpaDRLU0JoY3k1dWRXMWxjbWxqS0hoYk1WMHBJQzhnWVhNdWJuVnRaWEpwWXloNFd6SmRLU2xjYmx4dVIwOXNhWE4wSUR3dElHWmhZM1J2Y2loaktGd2lSMDg2TURBd09ETTRNRndpTENCY0lrZFBPakF3TURZek9UZGNJaXdnWENKSFR6b3dNRE0wTkRjd1hDSXNJRndpUjA4Nk1EQXlNall4TTF3aUxDQmNJa2RQT2pBd01UWXdOVFZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJa2RQT2pBd05qRXhNemhjSWl3Z1hDSkhUem93TURZd05UWXlYQ0lzSUZ3aVIwODZNREF3TnpNNE9Wd2lMQ0JjSWtkUE9qQXdOakEwT0RWY0lpd2dYQ0pIVHpvd01EUTROak00WENJc0lGd2lSMDg2TURBME5UWTJORndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lSMDg2TURBME1EQXlPVndpS1NsY2JseHVaR0YwWVNBOExTQmlhVzVrWDNKdmQzTW9ZbWx1WkY5eWIzZHpLR0pwYm1SZmNtOTNjeWh6ZFdKelpYUXdMQ0J6ZFdKelpYUXhLU3dnYzNWaWMyVjBNaWtzSUhOMVluTmxkRFFwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtFbEVJQ1ZwYmlVZ1IwOXNhWE4wS1Z4dVhHNWtaWE5qVDNKa1pYSWdQQzBnYzI5eWRDaDFibWx4ZFdVb1pHRjBZU1JFWlhOamNtbHdkR2x2YmlrcFczSmxkaWhqS0RFeExDQTFMQ0EyTENBeE1Dd2dNVElzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRE1zSURjc0lEUXNJRElzSURrc0lEZ3BLVjFjYmx4dVpXMXdkSGxmY205M015QThMU0JrWVhSaExtWnlZVzFsS0Z4dUlDQkpSQ0E5SUU1QkxDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJPYnlCemNHVmphV1pwWXlCSlJGeHVJQ0JFWlhOamNtbHdkR2x2YmlBOUlFNUJMQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlCT2J5QmtaWE5qY21sd2RHbHZibHh1SUNCSFpXNWxVbUYwYVc4Z1BTQk9RU3dnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5Qk9ieUJuWlc1bElISmhkR2x2WEc0Z0lIQXVZV1JxZFhOMElEMGdUa0VzSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpJRTV2SUhBdVlXUnFkWE4wSUhaaGJIVmxYRzRnSUdkeWIzVndJRDBnWENKSGNtOTFjQ0F6WENJZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5QkhjbTkxY0NCMGJ5QmhaR1FnWVhNZ1pXMXdkSGtnWTI5c2RXMXVYRzRwWEc1Y2JtVnRjSFI1WDNKdmR6UWdQQzBnWkdGMFlTNW1jbUZ0WlNoY2JpQWdTVVFnUFNCT1FTd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ01nVG04Z2MzQmxZMmxtYVdNZ1NVUmNiaUFnUkdWelkzSnBjSFJwYjI0Z1BTQk9RU3dnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1RtOGdaR1Z6WTNKcGNIUnBiMjVjYmlBZ1IyVnVaVkpoZEdsdklEMGdUa0VzSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDTWdUbThnWjJWdVpTQnlZWFJwYjF4dUlDQndMbUZrYW5WemRDQTlJRTVCTENBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJPYnlCd0xtRmthblZ6ZENCMllXeDFaVnh1SUNCbmNtOTFjQ0E5SUZ3aVIzSnZkWEFnTkZ3aUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDTWdSM0p2ZFhBZ2RHOGdZV1JrSUdGeklHVnRjSFI1SUdOdmJIVnRibHh1S1Z4dVhHNGpJRUZ3Y0dWdVpDQjBhR1VnWlcxd2RIa2djbTkzSUhSdklIbHZkWElnWkdGMFlYTmxkRnh1WkdGMFlTQThMU0J5WW1sdVpDaGtZWFJoTENCbGJYQjBlVjl5YjNjekxDQmxiWEIwZVY5eWIzYzBLVnh1WEc1Y2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T25KdmQzZHBjMlVvS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNod1ZtRnNkV1ZNYjJjZ1BTQnRhVzRvTFd4dlp6RXdLSEF1WVdScWRYTjBLU3dnY0ZaaGJIVmxURzluVFdGNEtTbGNibkFnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JtWVdOMGIzSW9SR1Z6WTNKcGNIUnBiMjRzSUd4bGRtVnNjeUE5SUdSbGMyTlBjbVJsY2lrc0lITnBlbVVnUFNCd1ZtRnNkV1ZNYjJjc0lHWnBiR3dnUFNCSFpXNWxVbUYwYVc4cEtTQXJJRnh1SUNCblpXOXRYM0J2YVc1MEtITm9ZWEJsSUQwZ01qRXNJQ0FnSUNBZ0lDQWpJRVZ1YzNWeVpYTWdZU0J3YjJsdWRDQjNhWFJvSUdGdUlHOTFkR3hwYm1WY2JpQWdJQ0FnSUNBZ0lDQWdJQ0J6ZEhKdmEyVWdQU0F4S25CMFZHOU5UU2tnS3lCY2JpQWdjMk5oYkdWZmMybDZaVjlqYjI1MGFXNTFiM1Z6S0hKaGJtZGxJRDBnWXlnd0xqVXNJRElwS1NBcklDQWpJRk5sZENCdGFXNGdZVzVrSUcxaGVDQndiMmx1ZENCemFYcGxjeUJvWlhKbFhHNGdJSE5qWVd4bFgyWnBiR3hmWjNKaFpHbGxiblFvYkc5M0lEMGdYQ0ozYUdsMFpWd2lMQ0JvYVdkb0lEMGdYQ0lqUTBJek16TkJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJzYVcxcGRITWdQU0JqS0RBc0lERXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOXZZaUE5SUhOallXeGxjem82YzNGMWFYTm9MQ0FqSUVSbFptbHVaU0JuY21Ga2FXVnVkQ0JqYjJ4dmNuTmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbmRXbGtaU0E5SUdkMWFXUmxYMk52Ykc5eVltRnlLRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZ5ZDJsa2RHZ2dQU0F4TGpVdk5TNHdPQ3dnSUNNZ1FXUnFkWE4wSUhkcFpIUm9JRzltSUhSb1pTQmpiMnh2Y2lCaVlYSmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhjbWhsYVdkb2RDQTlJREUxTHpVdU1EZ2dJQ0FqSUVGa2FuVnpkQ0JvWldsbmFIUWdiMllnZEdobElHTnZiRzl5SUdKaGNseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNsY2JpQWdLU0FySUZ4dUlDQnNZV0p6S0hnZ1BTQk9WVXhNTENCNUlEMGdUbFZNVENrZ0sxeHVJQ0IwYUdWdFpWOWlkeWdwSUNzZ0lDTWdRWEJ3YkhrZ2RHaGxiV1ZmWW5jZ1ptbHljM1FzSUhOdklHTjFjM1J2YlNCMGFHVnRaU0J6WlhSMGFXNW5jeUJqYjIxbElHRm1kR1Z5WEc0Z0lIUm9aVzFsS0Z4dUlDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ3aWRISmhibk53WVhKbGJuUmNJaWtzSUNBaklFOTJaWEp5YVdSbElIUm9aVzFsWDJKM0lIQmhibVZzWEc0Z0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQzU0SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5d2dJQ0FnSUNBZ0lDQWpJRVZ1YzNWeVpTQnphWHBsSUdseklITmxkQ0JtYjNJZ2VDMWhlR2x6SUhSbGVIUmNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZEM1NUlEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXdnSUNBZ0lDQWdJQ0FqSUVWdWMzVnlaU0J6YVhwbElHbHpJSE5sZENCbWIzSWdlUzFoZUdseklIUmxlSFJjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXhjYmlBZ0lDQWdJR3hwYm1Wb1pXbG5hSFFnUFNBd0xqa2dJQ0FnSUNBZ0lDQWdJeUJCYkd4dmQzTWdkM0poY0hCcGJtY2dabTl5SUhrdFlYaHBjeUJzWVdKbGJITWdkRzhnWm1sMElHbHVkRzhnTWlCc2FXNWxjMXh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2xjYmx4dVptbHNaVTVoYldVZ1BDMGdhR1Z5WlNobWFXZEVhWElzSUZ3aUxpNWNJaXdnWENKSFQxd2lMQ0JjSWtkUFgyZHliM1Z3YzE5d1pWd2lLVnh1ZDJsa2RHZ2dQQzBnY0dGdVpXeFRhWHBsS0RJdU5qVXBLbTF0Vkc5SmJtTm9YRzVvWldsbmFIUWdQQzBnY0dGdVpXeFRhWHBsS0RFdU15a3FiVzFVYjBsdVkyaGNibk4yWjJ4cGRHVW9jR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibUJnWUNKOSAtLT5cblxuYGBgclxuR09maWdEaXIgPC0gaGVyZShmaWdEaXIsIFxcLi4vR09cXClcbiMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuR08wLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjAsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbkdPMS5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5HTzIuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuR08zLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbkdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5cbiMgZndyaXRlKEdPMC5kZiwgaGVyZShcXEdPX1BFX2dyb3VwMC50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG4jIGZ3cml0ZShHTzEuZGYsIGhlcmUoXFxHT19QRV9ncm91cDEudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuIyBmd3JpdGUoR08yLmRmLCBoZXJlKFxcR09fUEVfZ3JvdXAyLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbiMgZndyaXRlKEdPMy5kZiwgaGVyZShcXEdPX1BFX2dyb3VwMy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG4jIGZ3cml0ZShHTzQuZGYsIGhlcmUoXFxHT19QRV9ncm91cDQudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cbnN1YnNldDAgPC0gR08wLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDBcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgMVxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQyIDwtIEdPMi5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAyXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDMgPC0gR08zLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDNcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgNFxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5cbnN1YnNldDAkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQwJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcbnN1YnNldDEkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQxJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcbnN1YnNldDIkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQyJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcbnN1YnNldDMkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQzJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcbnN1YnNldDQkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQ0JEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcblxuR09saXN0IDwtIGZhY3RvcihjKFxcR086MDAwODM4MFxcLCBcXEdPOjAwMDYzOTdcXCwgXFxHTzowMDM0NDcwXFwsIFxcR086MDAyMjYxM1xcLCBcXEdPOjAwMTYwNTVcXCxcbiAgICAgICAgICAgICAgICAgICBcXEdPOjAwNjExMzhcXCwgXFxHTzowMDYwNTYyXFwsIFxcR086MDAwNzM4OVxcLCBcXEdPOjAwNjA0ODVcXCwgXFxHTzowMDQ4NjM4XFwsIFxcR086MDA0NTY2NFxcLFxuICAgICAgICAgICAgICAgICAgIFxcR086MDA0MDAyOVxcKSlcblxuZGF0YSA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQwLCBzdWJzZXQxKSwgc3Vic2V0MiksIHN1YnNldDQpICU+JVxuICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuXG5kZXNjT3JkZXIgPC0gc29ydCh1bmlxdWUoZGF0YSREZXNjcmlwdGlvbikpW3JldihjKDExLCA1LCA2LCAxMCwgMTIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDcsIDQsIDIsIDksIDgpKV1cblxuZW1wdHlfcm93MyA8LSBkYXRhLmZyYW1lKFxuICBJRCA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBzcGVjaWZpYyBJRFxuICBEZXNjcmlwdGlvbiA9IE5BLCAgICAgICAgICAgICAgICAgICAgIyBObyBkZXNjcmlwdGlvblxuICBHZW5lUmF0aW8gPSBOQSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBnZW5lIHJhdGlvXG4gIHAuYWRqdXN0ID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHAuYWRqdXN0IHZhbHVlXG4gIGdyb3VwID0gXFxHcm91cCAzXFwgICAgICAgICAgICAgICAgICAgIyBHcm91cCB0byBhZGQgYXMgZW1wdHkgY29sdW1uXG4pXG5cbmVtcHR5X3JvdzQgPC0gZGF0YS5mcmFtZShcbiAgSUQgPSBOQSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gc3BlY2lmaWMgSURcbiAgRGVzY3JpcHRpb24gPSBOQSwgICAgICAgICAgICAgICAgICAgICMgTm8gZGVzY3JpcHRpb25cbiAgR2VuZVJhdGlvID0gTkEsICAgICAgICAgICAgICAgICAgICAgICMgTm8gZ2VuZSByYXRpb1xuICBwLmFkanVzdCA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAgIyBObyBwLmFkanVzdCB2YWx1ZVxuICBncm91cCA9IFxcR3JvdXAgNFxcICAgICAgICAgICAgICAgICAgICMgR3JvdXAgdG8gYWRkIGFzIGVtcHR5IGNvbHVtblxuKVxuXG4jIEFwcGVuZCB0aGUgZW1wdHkgcm93IHRvIHlvdXIgZGF0YXNldFxuZGF0YSA8LSByYmluZChkYXRhLCBlbXB0eV9yb3czLCBlbXB0eV9yb3c0KVxuXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShwVmFsdWVMb2cgPSBtaW4oLWxvZzEwKHAuYWRqdXN0KSwgcFZhbHVlTG9nTWF4KSlcbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBmYWN0b3IoRGVzY3JpcHRpb24sIGxldmVscyA9IGRlc2NPcmRlciksIHNpemUgPSBwVmFsdWVMb2csIGZpbGwgPSBHZW5lUmF0aW8pKSArIFxuICBnZW9tX3BvaW50KHNoYXBlID0gMjEsICAgICAgICAjIEVuc3VyZXMgYSBwb2ludCB3aXRoIGFuIG91dGxpbmVcbiAgICAgICAgICAgICBzdHJva2UgPSAxKnB0VG9NTSkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjUsIDIpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlXG4gIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gXFx3aGl0ZVxcLCBoaWdoID0gXFwjQ0IzMzNBXFwsXG4gICAgICAgICAgICAgICAgICAgICAgIyBsaW1pdHMgPSBjKDAsIDEpLFxuICAgICAgICAgICAgICAgICAgICAgIG9vYiA9IHNjYWxlczo6c3F1aXNoLCAjIERlZmluZSBncmFkaWVudCBjb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgKSArIFxuICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuICB0aGVtZV9idygpICsgICMgQXBwbHkgdGhlbWVfYncgZmlyc3QsIHNvIGN1c3RvbSB0aGVtZSBzZXR0aW5ncyBjb21lIGFmdGVyXG4gIHRoZW1lKFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksICAjIE92ZXJyaWRlIHRoZW1lX2J3IHBhbmVsXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeC1heGlzIHRleHRcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICApLFxuICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeS1heGlzIHRleHRcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIGxpbmVoZWlnaHQgPSAwLjkgICAgICAgICAgIyBBbGxvd3Mgd3JhcHBpbmcgZm9yIHktYXhpcyBsYWJlbHMgdG8gZml0IGludG8gMiBsaW5lc1xuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc19wZVxcKVxud2lkdGggPC0gcGFuZWxTaXplKDIuNjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMykqbW1Ub0luY2hcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
GOfigDir <- here(figDir, \../GO\)
#####################
GO0.df <- as.data.frame(enrichGO(gene = psOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO1.df <- as.data.frame(enrichGO(gene = psOver1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO2.df <- as.data.frame(enrichGO(gene = psOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO3.df <- as.data.frame(enrichGO(gene = psOver3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO4.df <- as.data.frame(enrichGO(gene = psOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))

# fwrite(GO0.df, here(\GO_PE_group0.tsv\), sep = \\t\)
# fwrite(GO1.df, here(\GO_PE_group1.tsv\), sep = \\t\)
# fwrite(GO2.df, here(\GO_PE_group2.tsv\), sep = \\t\)
# fwrite(GO3.df, here(\GO_PE_group3.tsv\), sep = \\t\)
# fwrite(GO4.df, here(\GO_PE_group4.tsv\), sep = \\t\)


subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 0\) %>%
  dplyr::arrange(p.adjust)
subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 1\) %>%
  dplyr::arrange(p.adjust)
subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 2\) %>%
  dplyr::arrange(p.adjust)
subset3 <- GO3.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 3\) %>%
  dplyr::arrange(p.adjust)
subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 4\) %>%
  dplyr::arrange(p.adjust)

subset0$GeneRatio <- sapply(strsplit(subset0$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset1$GeneRatio <- sapply(strsplit(subset1$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset2$GeneRatio <- sapply(strsplit(subset2$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset3$GeneRatio <- sapply(strsplit(subset3$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset4$GeneRatio <- sapply(strsplit(subset4$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))

GOlist <- factor(c(\GO:0008380\, \GO:0006397\, \GO:0034470\, \GO:0022613\, \GO:0016055\,
                   \GO:0061138\, \GO:0060562\, \GO:0007389\, \GO:0060485\, \GO:0048638\, \GO:0045664\,
                   \GO:0040029\))

data <- bind_rows(bind_rows(bind_rows(subset0, subset1), subset2), subset4) %>%
  dplyr::filter(ID %in% GOlist)

descOrder <- sort(unique(data$Description))[rev(c(11, 5, 6, 10, 12,
                                                  1,
                                                  3, 7, 4, 2, 9, 8))]

empty_row3 <- data.frame(
  ID = NA,                             # No specific ID
  Description = NA,                    # No description
  GeneRatio = NA,                      # No gene ratio
  p.adjust = NA,                       # No p.adjust value
  group = \Group 3\                   # Group to add as empty column
)

empty_row4 <- data.frame(
  ID = NA,                             # No specific ID
  Description = NA,                    # No description
  GeneRatio = NA,                      # No gene ratio
  p.adjust = NA,                       # No p.adjust value
  group = \Group 4\                   # Group to add as empty column
)

# Append the empty row to your dataset
data <- rbind(data, empty_row3, empty_row4)


data <- data %>% dplyr::rowwise() %>% dplyr::mutate(pValueLog = min(-log10(p.adjust), pValueLogMax))
p <- ggplot(data, aes(x = group, y = factor(Description, levels = descOrder), size = pValueLog, fill = GeneRatio)) + 
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM) + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = \white\, high = \#CB333A\,
                      # limits = c(0, 1),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL) +
  theme_bw() +  # Apply theme_bw first, so custom theme settings come after
  theme(
    panel.background = element_rect(fill = \transparent\),  # Override theme_bw panel
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      size = fontSizeS,         # Ensure size is set for x-axis text
      family = fontType,
      color = \#000000\,
    ),
    axis.text.y = element_text(
      size = fontSizeS,         # Ensure size is set for y-axis text
      family = fontType,
      color = \#000000\,
      lineheight = 0.9          # Allows wrapping for y-axis labels to fit into 2 lines
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- here(figDir, \..\, \GO\, \GO_groups_pe\)
width <- panelSize(2.65)*mmToInch
height <- panelSize(1.3)*mmToInch
svglite(paste0(fileName, \.svg\), height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVIwOW1hV2RFYVhJZ1BDMGdhR1Z5WlNobWFXZEVhWElzSUZ4Y0xpNHZSMDljWENsY2JpTWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJMXh1UjA4d0xtUm1JRHd0SUdGekxtUmhkR0V1Wm5KaGJXVW9aVzV5YVdOb1IwOG9aMlZ1WlNBOUlIQnpUM1psY2pBc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWEZ4RlRsTkZUVUpNWEZ3c0lHOXVkQ0E5SUZ4Y1FsQmNYQ3dnY21WaFpHRmliR1VnUFNCVVVsVkZLU2xjYmtkUE1TNWtaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLR1Z1Y21samFFZFBLR2RsYm1VZ1BTQndjMDkyWlhJeExDQlBjbWRFWWlBOUlHOXlaeTVOYlM1bFp5NWtZaXdnYTJWNVZIbHdaU0E5SUZ4Y1JVNVRSVTFDVEZ4Y0xDQnZiblFnUFNCY1hFSlFYRndzSUhKbFlXUmhZbXhsSUQwZ1ZGSlZSU2twWEc1SFR6SXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hsYm5KcFkyaEhUeWhuWlc1bElEMGdjSE5QZG1WeU1pd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjTENCeVpXRmtZV0pzWlNBOUlGUlNWVVVwS1Z4dVIwOHpMbVJtSUR3dElHRnpMbVJoZEdFdVpuSmhiV1VvWlc1eWFXTm9SMDhvWjJWdVpTQTlJSEJ6VDNabGNqTXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hGeEZUbE5GVFVKTVhGd3NJRzl1ZENBOUlGeGNRbEJjWEN3Z2NtVmhaR0ZpYkdVZ1BTQlVVbFZGS1NsY2JrZFBOQzVrWmlBOExTQmhjeTVrWVhSaExtWnlZVzFsS0dWdWNtbGphRWRQS0dkbGJtVWdQU0J3YzA5MlpYSTBMQ0JQY21kRVlpQTlJRzl5Wnk1TmJTNWxaeTVrWWl3Z2EyVjVWSGx3WlNBOUlGeGNSVTVUUlUxQ1RGeGNMQ0J2Ym5RZ1BTQmNYRUpRWEZ3c0lISmxZV1JoWW14bElEMGdWRkpWUlNrcFhHNWNiaU1nWm5keWFYUmxLRWRQTUM1a1ppd2dhR1Z5WlNoY1hFZFBYMUJGWDJkeWIzVndNQzUwYzNaY1hDa3NJSE5sY0NBOUlGeGNYRngwWEZ3cFhHNGpJR1ozY21sMFpTaEhUekV1WkdZc0lHaGxjbVVvWEZ4SFQxOVFSVjluY205MWNERXVkSE4yWEZ3cExDQnpaWEFnUFNCY1hGeGNkRnhjS1Z4dUl5Qm1kM0pwZEdVb1IwOHlMbVJtTENCb1pYSmxLRnhjUjA5ZlVFVmZaM0p2ZFhBeUxuUnpkbHhjS1N3Z2MyVndJRDBnWEZ4Y1hIUmNYQ2xjYmlNZ1puZHlhWFJsS0VkUE15NWtaaXdnYUdWeVpTaGNYRWRQWDFCRlgyZHliM1Z3TXk1MGMzWmNYQ2tzSUhObGNDQTlJRnhjWEZ4MFhGd3BYRzRqSUdaM2NtbDBaU2hIVHpRdVpHWXNJR2hsY21Vb1hGeEhUMTlRUlY5bmNtOTFjRFF1ZEhOMlhGd3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVYRzVjYm5OMVluTmxkREFnUEMwZ1IwOHdMbVJtSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VsRUxDQkVaWE5qY21sd2RHbHZiaXdnUjJWdVpWSmhkR2x2TENCd0xtRmthblZ6ZENrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCY1hFZHliM1Z3SURCY1hDa2dKVDRsWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0hBdVlXUnFkWE4wS1Z4dWMzVmljMlYwTVNBOExTQkhUekV1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGeGNSM0p2ZFhBZ01WeGNLU0FsUGlWY2JpQWdaSEJzZVhJNk9tRnljbUZ1WjJVb2NDNWhaR3AxYzNRcFhHNXpkV0p6WlhReUlEd3RJRWRQTWk1a1ppQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaEpSQ3dnUkdWelkzSnBjSFJwYjI0c0lFZGxibVZTWVhScGJ5d2djQzVoWkdwMWMzUXBJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdYRnhIY205MWNDQXlYRndwSUNVK0pWeHVJQ0JrY0d4NWNqbzZZWEp5WVc1blpTaHdMbUZrYW5WemRDbGNibk4xWW5ObGRETWdQQzBnUjA4ekxtUm1JQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLRWxFTENCRVpYTmpjbWx3ZEdsdmJpd2dSMlZ1WlZKaGRHbHZMQ0J3TG1Ga2FuVnpkQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JjWEVkeWIzVndJRE5jWENrZ0pUNGxYRzRnSUdSd2JIbHlPanBoY25KaGJtZGxLSEF1WVdScWRYTjBLVnh1YzNWaWMyVjBOQ0E4TFNCSFR6UXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ4Y1IzSnZkWEFnTkZ4Y0tTQWxQaVZjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvY0M1aFpHcDFjM1FwWEc1Y2JuTjFZbk5sZERBa1IyVnVaVkpoZEdsdklEd3RJSE5oY0hCc2VTaHpkSEp6Y0d4cGRDaHpkV0p6WlhRd0pFZGxibVZTWVhScGJ5d2dYRnd2WEZ3cExDQm1kVzVqZEdsdmJpaDRLU0JoY3k1dWRXMWxjbWxqS0hoYk1WMHBJQzhnWVhNdWJuVnRaWEpwWXloNFd6SmRLU2xjYm5OMVluTmxkREVrUjJWdVpWSmhkR2x2SUR3dElITmhjSEJzZVNoemRISnpjR3hwZENoemRXSnpaWFF4SkVkbGJtVlNZWFJwYnl3Z1hGd3ZYRndwTENCbWRXNWpkR2x2YmloNEtTQmhjeTV1ZFcxbGNtbGpLSGhiTVYwcElDOGdZWE11Ym5WdFpYSnBZeWg0V3pKZEtTbGNibk4xWW5ObGRESWtSMlZ1WlZKaGRHbHZJRHd0SUhOaGNIQnNlU2h6ZEhKemNHeHBkQ2h6ZFdKelpYUXlKRWRsYm1WU1lYUnBieXdnWEZ3dlhGd3BMQ0JtZFc1amRHbHZiaWg0S1NCaGN5NXVkVzFsY21saktIaGJNVjBwSUM4Z1lYTXViblZ0WlhKcFl5aDRXekpkS1NsY2JuTjFZbk5sZERNa1IyVnVaVkpoZEdsdklEd3RJSE5oY0hCc2VTaHpkSEp6Y0d4cGRDaHpkV0p6WlhRekpFZGxibVZTWVhScGJ5d2dYRnd2WEZ3cExDQm1kVzVqZEdsdmJpaDRLU0JoY3k1dWRXMWxjbWxqS0hoYk1WMHBJQzhnWVhNdWJuVnRaWEpwWXloNFd6SmRLU2xjYm5OMVluTmxkRFFrUjJWdVpWSmhkR2x2SUR3dElITmhjSEJzZVNoemRISnpjR3hwZENoemRXSnpaWFEwSkVkbGJtVlNZWFJwYnl3Z1hGd3ZYRndwTENCbWRXNWpkR2x2YmloNEtTQmhjeTV1ZFcxbGNtbGpLSGhiTVYwcElDOGdZWE11Ym5WdFpYSnBZeWg0V3pKZEtTbGNibHh1UjA5c2FYTjBJRHd0SUdaaFkzUnZjaWhqS0Z4Y1IwODZNREF3T0RNNE1GeGNMQ0JjWEVkUE9qQXdNRFl6T1RkY1hDd2dYRnhIVHpvd01ETTBORGN3WEZ3c0lGeGNSMDg2TURBeU1qWXhNMXhjTENCY1hFZFBPakF3TVRZd05UVmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hFZFBPakF3TmpFeE16aGNYQ3dnWEZ4SFR6b3dNRFl3TlRZeVhGd3NJRnhjUjA4Nk1EQXdOek00T1Z4Y0xDQmNYRWRQT2pBd05qQTBPRFZjWEN3Z1hGeEhUem93TURRNE5qTTRYRndzSUZ4Y1IwODZNREEwTlRZMk5GeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y1IwODZNREEwTURBeU9WeGNLU2xjYmx4dVpHRjBZU0E4TFNCaWFXNWtYM0p2ZDNNb1ltbHVaRjl5YjNkektHSnBibVJmY205M2N5aHpkV0p6WlhRd0xDQnpkV0p6WlhReEtTd2djM1ZpYzJWME1pa3NJSE4xWW5ObGREUXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0VsRUlDVnBiaVVnUjA5c2FYTjBLVnh1WEc1a1pYTmpUM0prWlhJZ1BDMGdjMjl5ZENoMWJtbHhkV1VvWkdGMFlTUkVaWE5qY21sd2RHbHZiaWtwVzNKbGRpaGpLREV4TENBMUxDQTJMQ0F4TUN3Z01USXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lETXNJRGNzSURRc0lESXNJRGtzSURncEtWMWNibHh1Wlcxd2RIbGZjbTkzTXlBOExTQmtZWFJoTG1aeVlXMWxLRnh1SUNCSlJDQTlJRTVCTENBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5Qk9ieUJ6Y0dWamFXWnBZeUJKUkZ4dUlDQkVaWE5qY21sd2RHbHZiaUE5SUU1QkxDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJPYnlCa1pYTmpjbWx3ZEdsdmJseHVJQ0JIWlc1bFVtRjBhVzhnUFNCT1FTd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlCT2J5Qm5aVzVsSUhKaGRHbHZYRzRnSUhBdVlXUnFkWE4wSUQwZ1RrRXNJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklFNXZJSEF1WVdScWRYTjBJSFpoYkhWbFhHNGdJR2R5YjNWd0lEMGdYRnhIY205MWNDQXpYRndnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlCSGNtOTFjQ0IwYnlCaFpHUWdZWE1nWlcxd2RIa2dZMjlzZFcxdVhHNHBYRzVjYm1WdGNIUjVYM0p2ZHpRZ1BDMGdaR0YwWVM1bWNtRnRaU2hjYmlBZ1NVUWdQU0JPUVN3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDTWdUbThnYzNCbFkybG1hV01nU1VSY2JpQWdSR1Z6WTNKcGNIUnBiMjRnUFNCT1FTd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ01nVG04Z1pHVnpZM0pwY0hScGIyNWNiaUFnUjJWdVpWSmhkR2x2SUQwZ1RrRXNJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1RtOGdaMlZ1WlNCeVlYUnBiMXh1SUNCd0xtRmthblZ6ZENBOUlFNUJMQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5Qk9ieUJ3TG1Ga2FuVnpkQ0IyWVd4MVpWeHVJQ0JuY205MWNDQTlJRnhjUjNKdmRYQWdORnhjSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1IzSnZkWEFnZEc4Z1lXUmtJR0Z6SUdWdGNIUjVJR052YkhWdGJseHVLVnh1WEc0aklFRndjR1Z1WkNCMGFHVWdaVzF3ZEhrZ2NtOTNJSFJ2SUhsdmRYSWdaR0YwWVhObGRGeHVaR0YwWVNBOExTQnlZbWx1WkNoa1lYUmhMQ0JsYlhCMGVWOXliM2N6TENCbGJYQjBlVjl5YjNjMEtWeHVYRzVjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbkp2ZDNkcGMyVW9LU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2h3Vm1Gc2RXVk1iMmNnUFNCdGFXNG9MV3h2WnpFd0tIQXVZV1JxZFhOMEtTd2djRlpoYkhWbFRHOW5UV0Y0S1NsY2JuQWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQm1ZV04wYjNJb1JHVnpZM0pwY0hScGIyNHNJR3hsZG1Wc2N5QTlJR1JsYzJOUGNtUmxjaWtzSUhOcGVtVWdQU0J3Vm1Gc2RXVk1iMmNzSUdacGJHd2dQU0JIWlc1bFVtRjBhVzhwS1NBcklGeHVJQ0JuWlc5dFgzQnZhVzUwS0hOb1lYQmxJRDBnTWpFc0lDQWdJQ0FnSUNBaklFVnVjM1Z5WlhNZ1lTQndiMmx1ZENCM2FYUm9JR0Z1SUc5MWRHeHBibVZjYmlBZ0lDQWdJQ0FnSUNBZ0lDQnpkSEp2YTJVZ1BTQXhLbkIwVkc5TlRTa2dLeUJjYmlBZ2MyTmhiR1ZmYzJsNlpWOWpiMjUwYVc1MWIzVnpLSEpoYm1kbElEMGdZeWd3TGpVc0lESXBLU0FySUNBaklGTmxkQ0J0YVc0Z1lXNWtJRzFoZUNCd2IybHVkQ0J6YVhwbGN5Qm9aWEpsWEc0Z0lITmpZV3hsWDJacGJHeGZaM0poWkdsbGJuUW9iRzkzSUQwZ1hGeDNhR2wwWlZ4Y0xDQm9hV2RvSUQwZ1hGd2pRMEl6TXpOQlhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5QnNhVzFwZEhNZ1BTQmpLREFzSURFcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5dllpQTlJSE5qWVd4bGN6bzZjM0YxYVhOb0xDQWpJRVJsWm1sdVpTQm5jbUZrYVdWdWRDQmpiMnh2Y25OY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuZFdsa1pTQTlJR2QxYVdSbFgyTnZiRzl5WW1GeUtGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRnlkMmxrZEdnZ1BTQXhMalV2TlM0d09Dd2dJQ01nUVdScWRYTjBJSGRwWkhSb0lHOW1JSFJvWlNCamIyeHZjaUJpWVhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaGNtaGxhV2RvZENBOUlERTFMelV1TURnZ0lDQWpJRUZrYW5WemRDQm9aV2xuYUhRZ2IyWWdkR2hsSUdOdmJHOXlJR0poY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2xjYmlBZ0tTQXJJRnh1SUNCc1lXSnpLSGdnUFNCT1ZVeE1MQ0I1SUQwZ1RsVk1UQ2tnSzF4dUlDQjBhR1Z0WlY5aWR5Z3BJQ3NnSUNNZ1FYQndiSGtnZEdobGJXVmZZbmNnWm1seWMzUXNJSE52SUdOMWMzUnZiU0IwYUdWdFpTQnpaWFIwYVc1bmN5QmpiMjFsSUdGbWRHVnlYRzRnSUhSb1pXMWxLRnh1SUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRnhjZEhKaGJuTndZWEpsYm5SY1hDa3NJQ0FqSUU5MlpYSnlhV1JsSUhSb1pXMWxYMkozSUhCaGJtVnNYRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDNTRJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl3Z0lDQWdJQ0FnSUNBaklFVnVjM1Z5WlNCemFYcGxJR2x6SUhObGRDQm1iM0lnZUMxaGVHbHpJSFJsZUhSY2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQzU1SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5d2dJQ0FnSUNBZ0lDQWpJRVZ1YzNWeVpTQnphWHBsSUdseklITmxkQ0JtYjNJZ2VTMWhlR2x6SUhSbGVIUmNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hDeGNiaUFnSUNBZ0lHeHBibVZvWldsbmFIUWdQU0F3TGprZ0lDQWdJQ0FnSUNBZ0l5QkJiR3h2ZDNNZ2QzSmhjSEJwYm1jZ1ptOXlJSGt0WVhocGN5QnNZV0psYkhNZ2RHOGdabWwwSUdsdWRHOGdNaUJzYVc1bGMxeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NXNhVzVsSUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3hjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2FHVnlaU2htYVdkRWFYSXNJRnhjTGk1Y1hDd2dYRnhIVDF4Y0xDQmNYRWRQWDJkeWIzVndjMTl3WlZ4Y0tWeHVkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLREl1TmpVcEttMXRWRzlKYm1Ob1hHNW9aV2xuYUhRZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TXlrcWJXMVViMGx1WTJoY2JuTjJaMnhwZEdVb2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbkdPZmlnRGlyIDwtIGhlcmUoZmlnRGlyLCBcXC4uL0dPXFwpXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyNcbkdPMC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIwLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5HTzEuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMSwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbkdPMy5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIzLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5HTzQuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyNCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuXG4jIGZ3cml0ZShHTzAuZGYsIGhlcmUoXFxHT19QRV9ncm91cDAudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuIyBmd3JpdGUoR08xLmRmLCBoZXJlKFxcR09fUEVfZ3JvdXAxLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbiMgZndyaXRlKEdPMi5kZiwgaGVyZShcXEdPX1BFX2dyb3VwMi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG4jIGZ3cml0ZShHTzMuZGYsIGhlcmUoXFxHT19QRV9ncm91cDMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuIyBmd3JpdGUoR080LmRmLCBoZXJlKFxcR09fUEVfZ3JvdXA0LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuXG5zdWJzZXQwIDwtIEdPMC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAwXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDEgPC0gR08xLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDFcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgMlxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQzIDwtIEdPMy5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAzXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDQgPC0gR080LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDRcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuXG5zdWJzZXQwJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MCRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQxJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MSRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQyJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MiRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQzJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MyRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQ0JEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0NCRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5cbkdPbGlzdCA8LSBmYWN0b3IoYyhcXEdPOjAwMDgzODBcXCwgXFxHTzowMDA2Mzk3XFwsIFxcR086MDAzNDQ3MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDE2MDU1XFwsXG4gICAgICAgICAgICAgICAgICAgXFxHTzowMDYxMTM4XFwsIFxcR086MDA2MDU2MlxcLCBcXEdPOjAwMDczODlcXCwgXFxHTzowMDYwNDg1XFwsIFxcR086MDA0ODYzOFxcLCBcXEdPOjAwNDU2NjRcXCxcbiAgICAgICAgICAgICAgICAgICBcXEdPOjAwNDAwMjlcXCkpXG5cbmRhdGEgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhiaW5kX3Jvd3Moc3Vic2V0MCwgc3Vic2V0MSksIHN1YnNldDIpLCBzdWJzZXQ0KSAlPiVcbiAgZHBseXI6OmZpbHRlcihJRCAlaW4lIEdPbGlzdClcblxuZGVzY09yZGVyIDwtIHNvcnQodW5pcXVlKGRhdGEkRGVzY3JpcHRpb24pKVtyZXYoYygxMSwgNSwgNiwgMTAsIDEyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCA3LCA0LCAyLCA5LCA4KSldXG5cbmVtcHR5X3JvdzMgPC0gZGF0YS5mcmFtZShcbiAgSUQgPSBOQSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gc3BlY2lmaWMgSURcbiAgRGVzY3JpcHRpb24gPSBOQSwgICAgICAgICAgICAgICAgICAgICMgTm8gZGVzY3JpcHRpb25cbiAgR2VuZVJhdGlvID0gTkEsICAgICAgICAgICAgICAgICAgICAgICMgTm8gZ2VuZSByYXRpb1xuICBwLmFkanVzdCA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAgIyBObyBwLmFkanVzdCB2YWx1ZVxuICBncm91cCA9IFxcR3JvdXAgM1xcICAgICAgICAgICAgICAgICAgICMgR3JvdXAgdG8gYWRkIGFzIGVtcHR5IGNvbHVtblxuKVxuXG5lbXB0eV9yb3c0IDwtIGRhdGEuZnJhbWUoXG4gIElEID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHNwZWNpZmljIElEXG4gIERlc2NyaXB0aW9uID0gTkEsICAgICAgICAgICAgICAgICAgICAjIE5vIGRlc2NyaXB0aW9uXG4gIEdlbmVSYXRpbyA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIGdlbmUgcmF0aW9cbiAgcC5hZGp1c3QgPSBOQSwgICAgICAgICAgICAgICAgICAgICAgICMgTm8gcC5hZGp1c3QgdmFsdWVcbiAgZ3JvdXAgPSBcXEdyb3VwIDRcXCAgICAgICAgICAgICAgICAgICAjIEdyb3VwIHRvIGFkZCBhcyBlbXB0eSBjb2x1bW5cbilcblxuIyBBcHBlbmQgdGhlIGVtcHR5IHJvdyB0byB5b3VyIGRhdGFzZXRcbmRhdGEgPC0gcmJpbmQoZGF0YSwgZW1wdHlfcm93MywgZW1wdHlfcm93NClcblxuXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUocFZhbHVlTG9nID0gbWluKC1sb2cxMChwLmFkanVzdCksIHBWYWx1ZUxvZ01heCkpXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gZmFjdG9yKERlc2NyaXB0aW9uLCBsZXZlbHMgPSBkZXNjT3JkZXIpLCBzaXplID0gcFZhbHVlTG9nLCBmaWxsID0gR2VuZVJhdGlvKSkgKyBcbiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lXG4gICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0pICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9IFxcd2hpdGVcXCwgaGlnaCA9IFxcI0NCMzMzQVxcLFxuICAgICAgICAgICAgICAgICAgICAgICMgbGltaXRzID0gYygwLCAxKSxcbiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiAgdGhlbWVfYncoKSArICAjIEFwcGx5IHRoZW1lX2J3IGZpcnN0LCBzbyBjdXN0b20gdGhlbWUgc2V0dGluZ3MgY29tZSBhZnRlclxuICB0aGVtZShcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLCAgIyBPdmVycmlkZSB0aGVtZV9idyBwYW5lbFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsICAgICAgICAgIyBFbnN1cmUgc2l6ZSBpcyBzZXQgZm9yIHgtYXhpcyB0ZXh0XG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgKSxcbiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsICAgICAgICAgIyBFbnN1cmUgc2l6ZSBpcyBzZXQgZm9yIHktYXhpcyB0ZXh0XG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBsaW5laGVpZ2h0ID0gMC45ICAgICAgICAgICMgQWxsb3dzIHdyYXBwaW5nIGZvciB5LWF4aXMgbGFiZWxzIHRvIGZpdCBpbnRvIDIgbGluZXNcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXC4uXFwsIFxcR09cXCwgXFxHT19ncm91cHNfcGVcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgyLjY1KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjMpKm1tVG9JbmNoXG5zdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuR09maWdEaXIgPC0gaGVyZShmaWdEaXIsIFxcLi4vR09cXClcbiMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuR08wLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjAsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbkdPMS5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5HTzIuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuR08zLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbkdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5cbiMgZndyaXRlKEdPMC5kZiwgaGVyZShcXEdPX1BFX2dyb3VwMC50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG4jIGZ3cml0ZShHTzEuZGYsIGhlcmUoXFxHT19QRV9ncm91cDEudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuIyBmd3JpdGUoR08yLmRmLCBoZXJlKFxcR09fUEVfZ3JvdXAyLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbiMgZndyaXRlKEdPMy5kZiwgaGVyZShcXEdPX1BFX2dyb3VwMy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG4jIGZ3cml0ZShHTzQuZGYsIGhlcmUoXFxHT19QRV9ncm91cDQudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cbnN1YnNldDAgPC0gR08wLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDBcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgMVxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQyIDwtIEdPMi5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAyXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDMgPC0gR08zLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDNcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgNFxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5cbnN1YnNldDAkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQwJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcbnN1YnNldDEkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQxJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcbnN1YnNldDIkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQyJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcbnN1YnNldDMkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQzJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcbnN1YnNldDQkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQ0JEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcblxuR09saXN0IDwtIGZhY3RvcihjKFxcR086MDAwODM4MFxcLCBcXEdPOjAwMDYzOTdcXCwgXFxHTzowMDM0NDcwXFwsIFxcR086MDAyMjYxM1xcLCBcXEdPOjAwMTYwNTVcXCxcbiAgICAgICAgICAgICAgICAgICBcXEdPOjAwNjExMzhcXCwgXFxHTzowMDYwNTYyXFwsIFxcR086MDAwNzM4OVxcLCBcXEdPOjAwNjA0ODVcXCwgXFxHTzowMDQ4NjM4XFwsIFxcR086MDA0NTY2NFxcLFxuICAgICAgICAgICAgICAgICAgIFxcR086MDA0MDAyOVxcKSlcblxuZGF0YSA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQwLCBzdWJzZXQxKSwgc3Vic2V0MiksIHN1YnNldDQpICU+JVxuICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuXG5kZXNjT3JkZXIgPC0gc29ydCh1bmlxdWUoZGF0YSREZXNjcmlwdGlvbikpW3JldihjKDExLCA1LCA2LCAxMCwgMTIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDcsIDQsIDIsIDksIDgpKV1cblxuZW1wdHlfcm93MyA8LSBkYXRhLmZyYW1lKFxuICBJRCA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBzcGVjaWZpYyBJRFxuICBEZXNjcmlwdGlvbiA9IE5BLCAgICAgICAgICAgICAgICAgICAgIyBObyBkZXNjcmlwdGlvblxuICBHZW5lUmF0aW8gPSBOQSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBnZW5lIHJhdGlvXG4gIHAuYWRqdXN0ID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHAuYWRqdXN0IHZhbHVlXG4gIGdyb3VwID0gXFxHcm91cCAzXFwgICAgICAgICAgICAgICAgICAgIyBHcm91cCB0byBhZGQgYXMgZW1wdHkgY29sdW1uXG4pXG5cbmVtcHR5X3JvdzQgPC0gZGF0YS5mcmFtZShcbiAgSUQgPSBOQSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gc3BlY2lmaWMgSURcbiAgRGVzY3JpcHRpb24gPSBOQSwgICAgICAgICAgICAgICAgICAgICMgTm8gZGVzY3JpcHRpb25cbiAgR2VuZVJhdGlvID0gTkEsICAgICAgICAgICAgICAgICAgICAgICMgTm8gZ2VuZSByYXRpb1xuICBwLmFkanVzdCA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAgIyBObyBwLmFkanVzdCB2YWx1ZVxuICBncm91cCA9IFxcR3JvdXAgNFxcICAgICAgICAgICAgICAgICAgICMgR3JvdXAgdG8gYWRkIGFzIGVtcHR5IGNvbHVtblxuKVxuXG4jIEFwcGVuZCB0aGUgZW1wdHkgcm93IHRvIHlvdXIgZGF0YXNldFxuZGF0YSA8LSByYmluZChkYXRhLCBlbXB0eV9yb3czLCBlbXB0eV9yb3c0KVxuXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShwVmFsdWVMb2cgPSBtaW4oLWxvZzEwKHAuYWRqdXN0KSwgcFZhbHVlTG9nTWF4KSlcbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBmYWN0b3IoRGVzY3JpcHRpb24sIGxldmVscyA9IGRlc2NPcmRlciksIHNpemUgPSBwVmFsdWVMb2csIGZpbGwgPSBHZW5lUmF0aW8pKSArIFxuICBnZW9tX3BvaW50KHNoYXBlID0gMjEsICAgICAgICAjIEVuc3VyZXMgYSBwb2ludCB3aXRoIGFuIG91dGxpbmVcbiAgICAgICAgICAgICBzdHJva2UgPSAxKnB0VG9NTSkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjUsIDIpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlXG4gIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gXFx3aGl0ZVxcLCBoaWdoID0gXFwjQ0IzMzNBXFwsXG4gICAgICAgICAgICAgICAgICAgICAgIyBsaW1pdHMgPSBjKDAsIDEpLFxuICAgICAgICAgICAgICAgICAgICAgIG9vYiA9IHNjYWxlczo6c3F1aXNoLCAjIERlZmluZSBncmFkaWVudCBjb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgKSArIFxuICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuICB0aGVtZV9idygpICsgICMgQXBwbHkgdGhlbWVfYncgZmlyc3QsIHNvIGN1c3RvbSB0aGVtZSBzZXR0aW5ncyBjb21lIGFmdGVyXG4gIHRoZW1lKFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksICAjIE92ZXJyaWRlIHRoZW1lX2J3IHBhbmVsXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeC1heGlzIHRleHRcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICApLFxuICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeS1heGlzIHRleHRcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIGxpbmVoZWlnaHQgPSAwLjkgICAgICAgICAgIyBBbGxvd3Mgd3JhcHBpbmcgZm9yIHktYXhpcyBsYWJlbHMgdG8gZml0IGludG8gMiBsaW5lc1xuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc19wZVxcKVxud2lkdGggPC0gcGFuZWxTaXplKDIuNjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMykqbW1Ub0luY2hcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
GOfigDir <- here(figDir, \../GO\)
#####################
GO0.df <- as.data.frame(enrichGO(gene = psOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO1.df <- as.data.frame(enrichGO(gene = psOver1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO2.df <- as.data.frame(enrichGO(gene = psOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO3.df <- as.data.frame(enrichGO(gene = psOver3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO4.df <- as.data.frame(enrichGO(gene = psOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))

# fwrite(GO0.df, here(\GO_PE_group0.tsv\), sep = \\t\)
# fwrite(GO1.df, here(\GO_PE_group1.tsv\), sep = \\t\)
# fwrite(GO2.df, here(\GO_PE_group2.tsv\), sep = \\t\)
# fwrite(GO3.df, here(\GO_PE_group3.tsv\), sep = \\t\)
# fwrite(GO4.df, here(\GO_PE_group4.tsv\), sep = \\t\)


subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 0\) %>%
  dplyr::arrange(p.adjust)
subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 1\) %>%
  dplyr::arrange(p.adjust)
subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 2\) %>%
  dplyr::arrange(p.adjust)
subset3 <- GO3.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 3\) %>%
  dplyr::arrange(p.adjust)
subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 4\) %>%
  dplyr::arrange(p.adjust)

subset0$GeneRatio <- sapply(strsplit(subset0$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset1$GeneRatio <- sapply(strsplit(subset1$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset2$GeneRatio <- sapply(strsplit(subset2$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset3$GeneRatio <- sapply(strsplit(subset3$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset4$GeneRatio <- sapply(strsplit(subset4$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))

GOlist <- factor(c(\GO:0008380\, \GO:0006397\, \GO:0034470\, \GO:0022613\, \GO:0016055\,
                   \GO:0061138\, \GO:0060562\, \GO:0007389\, \GO:0060485\, \GO:0048638\, \GO:0045664\,
                   \GO:0040029\))

data <- bind_rows(bind_rows(bind_rows(subset0, subset1), subset2), subset4) %>%
  dplyr::filter(ID %in% GOlist)

descOrder <- sort(unique(data$Description))[rev(c(11, 5, 6, 10, 12,
                                                  1,
                                                  3, 7, 4, 2, 9, 8))]

empty_row3 <- data.frame(
  ID = NA,                             # No specific ID
  Description = NA,                    # No description
  GeneRatio = NA,                      # No gene ratio
  p.adjust = NA,                       # No p.adjust value
  group = \Group 3\                   # Group to add as empty column
)

empty_row4 <- data.frame(
  ID = NA,                             # No specific ID
  Description = NA,                    # No description
  GeneRatio = NA,                      # No gene ratio
  p.adjust = NA,                       # No p.adjust value
  group = \Group 4\                   # Group to add as empty column
)

# Append the empty row to your dataset
data <- rbind(data, empty_row3, empty_row4)


data <- data %>% dplyr::rowwise() %>% dplyr::mutate(pValueLog = min(-log10(p.adjust), pValueLogMax))
p <- ggplot(data, aes(x = group, y = factor(Description, levels = descOrder), size = pValueLog, fill = GeneRatio)) + 
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM) + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = \white\, high = \#CB333A\,
                      # limits = c(0, 1),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL) +
  theme_bw() +  # Apply theme_bw first, so custom theme settings come after
  theme(
    panel.background = element_rect(fill = \transparent\),  # Override theme_bw panel
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      size = fontSizeS,         # Ensure size is set for x-axis text
      family = fontType,
      color = \#000000\,
    ),
    axis.text.y = element_text(
      size = fontSizeS,         # Ensure size is set for y-axis text
      family = fontType,
      color = \#000000\,
      lineheight = 0.9          # Allows wrapping for y-axis labels to fit into 2 lines
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- here(figDir, \..\, \GO\, \GO_groups_pe\)
width <- panelSize(2.65)*mmToInch
height <- panelSize(1.3)*mmToInch
svglite(paste0(fileName, \.svg\), height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



#### Grouping with P-E number
##### Grouping

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMW5jbTkxY0RFcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3YzA5MlpYSWdQVDFuY205MWNESXBJQ2trYldWaGJsOWthV1ptWDNOamIzSmxYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzV3Y3pBeElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYQ0p3YzA5MlpYSXdYQ0lzSUZ3aWNITlBkbVZ5TVZ3aUtTd2dOU2xjYm5Cek1USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjSW5CelQzWmxjakZjSWl3Z1hDSndjMDkyWlhJeVhDSXBMQ0ExS1Z4dWNITXlNeUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ3aWNITlBkbVZ5TWx3aUxDQmNJbkJ6VDNabGNqTmNJaWtzSURVcFhHNXdjek0wSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hDSndjMDkyWlhJelhDSXNJRndpY0hOUGRtVnlORndpS1N3Z05TbGNibkJ6TWpRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNJbkJ6VDNabGNqSmNJaXdnWENKd2MwOTJaWEkwWENJcExDQTFLVnh1Y0hNeE5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRndpY0hOUGRtVnlNVndpTENCY0luQnpUM1psY2pSY0lpa3NJRFVwWEc1d2N6QTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWENKd2MwOTJaWEl3WENJc0lGd2ljSE5QZG1WeU5Gd2lLU3dnTlNsY2JseHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJSEJ6VDNabGNpd2dlU0E5SUcxbFlXNWZaR2xtWmw5elkyOXlaU2twSUNzZ1hHNGdJQ0FnYzJOaGJHVmZabWxzYkY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY0lpTTNOemMzTnpkY0lpd2dYQ0lqT0VJM1JUWTFYQ0lzSUZ3aUkwRXlPRFExTWx3aUxDQmNJaU5ETWpnNE5FUmNJaXdnWENJalJqSTRSVEpEWENJcEtTQXJYRzRnSUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdjSE5QZG1WeUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVFdWa2FYVnRJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnSzF4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpNc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaWGRwWkhSb0lEMGdiR2x1WlUxbFpHbDFiU0FxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0ZjYmlBZ0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJR3hoWW5Nb2VDQTlJRTVWVEV3Z0xDQjVJRDBnWENKQmRtVnlZV2RsSU02VUlHeHZiM0FnYzJOdmNtVmNJaWtnSzF4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWEc0Z0lDQWdZV1Z6S0dkeWIzVndJRDBnY0hOUGRtVnlLU3dnWm5WdUlEMGdiV1ZoYml4Y2JpQWdJQ0JuWlc5dElEMGdYQ0p3YjJsdWRGd2lMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTUM0MUxGeHVJQ0FnSUdacGJHd2dQU0JjSW1Kc1lXTnJYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpWEc0Z0lDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRcElDdGNiaUFnZEdobGJXVW9YRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVTBzSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2dZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCaGJtZHNaU0E5SURRMUxDQm9hblZ6ZENBOUlERXNJSFpxZFhOMElEMGdNVnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl3Z2MybDZaU0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHbGphM01nUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYQ0owY21GdWMzQmhjbVZ1ZEZ3aUtTeGNiaUFnSUNCc1pXZGxibVF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnYkdWblpXNWtMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1Z4dUlDQXBLMXh1SUNCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQXdMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkJ6TURFNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1ERXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekV5T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pFeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNITXlNem9nWENJc0lHTnZiblpRZG1Gc2RXVW9jSE15TXlrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5Cek16UTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNelFwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pJME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6STBLU3dnWENKY1hHNWNJaXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TVRRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1UUXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekEwT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pBMEtTd2dYQ0pjWEc1Y0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ01pa2dLMXh1SUNCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTFRBdU5Td2dNQzR4S1NsY2JseHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKa2FXWm1VMk52Y21WZlltRnljR3h2ZEY5d1pVZHliM1Z3WDJSVVFVZGZkbk5mUkUxVFQxd2lLVnh1ZDJsa2RHZ2dQQzBnTXpNcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExUTXpLbTF0Vkc5SmJtTm9YRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbWVhbl9kaWZmX3Njb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHBzT3ZlciwgeSA9IG1lYW5fZGlmZl9zY29yZSkpICsgXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCM3Nzc3NzdcXCwgXFwjOEI3RTY1XFwsIFxcI0EyODQ1MlxcLCBcXCNDMjg4NERcXCwgXFwjRjI4RTJDXFwpKSArXG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkFcbiAgKSArIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxBdmVyYWdlIM6UIGxvb3Agc2NvcmVcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC4xKSlcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxkaWZmU2NvcmVfYmFycGxvdF9wZUdyb3VwX2RUQUdfdnNfRE1TT1xcKVxud2lkdGggPC0gMzMqbW1Ub0luY2hcbmhlaWdodCA8LTMzKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(psOver ==group1) )$mean_diff_score
  distance2 <- (data %>% dplyr::filter(psOver ==group2) )$mean_diff_score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

ps01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(temp, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(temp, \psOver1\, \psOver4\), 5)
ps04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)


p <- ggplot(temp, aes(x = psOver, y = mean_diff_score)) + 
    scale_fill_manual(values = c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\)) +
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineMedium * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \Average Δ loop score\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) +
  coord_cartesian(ylim = c(-0.5, 0.1))


fileName <- paste0(\diffScore_barplot_peGroup_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2MwOTJaWElnUFQxbmNtOTFjREVwSUNra2JXVmhibDlrYVdabVgzTmpiM0psWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGdJSGRwYkNBOExTQjNhV3hqYjNndWRHVnpkQ2hrYVhOMFlXNWpaVEVzSUdScGMzUmhibU5sTWlsY2JpQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1ZlZ4dVhHNXdjekF4SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hGeHdjMDkyWlhJd1hGd3NJRnhjY0hOUGRtVnlNVnhjS1N3Z05TbGNibkJ6TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNYSEJ6VDNabGNqRmNYQ3dnWEZ4d2MwOTJaWEl5WEZ3cExDQTFLVnh1Y0hNeU15QThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRnhjY0hOUGRtVnlNbHhjTENCY1hIQnpUM1psY2pOY1hDa3NJRFVwWEc1d2N6TTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWEZ4d2MwOTJaWEl6WEZ3c0lGeGNjSE5QZG1WeU5GeGNLU3dnTlNsY2JuQnpNalFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TENCY1hIQnpUM1psY2pKY1hDd2dYRnh3YzA5MlpYSTBYRndwTENBMUtWeHVjSE14TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGeGNjSE5QZG1WeU1WeGNMQ0JjWEhCelQzWmxjalJjWENrc0lEVXBYRzV3Y3pBMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYRnh3YzA5MlpYSXdYRndzSUZ4Y2NITlBkbVZ5TkZ4Y0tTd2dOU2xjYmx4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlIQnpUM1psY2l3Z2VTQTlJRzFsWVc1ZlpHbG1abDl6WTI5eVpTa3BJQ3NnWEc0Z0lDQWdjMk5oYkdWZlptbHNiRjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjWENNM056YzNOemRjWEN3Z1hGd2pPRUkzUlRZMVhGd3NJRnhjSTBFeU9EUTFNbHhjTENCY1hDTkRNamc0TkVSY1hDd2dYRndqUmpJNFJUSkRYRndwS1NBclhHNGdJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ2NITlBkbVZ5S1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxUV1ZrYVhWdElDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMak1zSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVTFsWkdsMWJTQXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRmNiaUFnS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHeGhZbk1vZUNBOUlFNVZURXdnTENCNUlEMGdYRnhCZG1WeVlXZGxJTTZVSUd4dmIzQWdjMk52Y21WY1hDa2dLMXh1SUNCemRHRjBYM04xYlcxaGNua29YRzRnSUNBZ1lXVnpLR2R5YjNWd0lEMGdjSE5QZG1WeUtTd2dablZ1SUQwZ2JXVmhiaXhjYmlBZ0lDQm5aVzl0SUQwZ1hGeHdiMmx1ZEZ4Y0xDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNQzQxTEZ4dUlDQWdJR1pwYkd3Z1BTQmNYR0pzWVdOclhGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNYRzRnSUNrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFwSUN0Y2JpQWdkR2hsYldVb1hHNGdJQ0FnWVhocGN5NTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpVMHNJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTENCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0JoYm1kc1pTQTlJRFExTENCb2FuVnpkQ0E5SURFc0lIWnFkWE4wSUQwZ01WeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NXNhVzVsSUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3dnYzJsNlpTQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdsamEzTWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xDQnphWHBsSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hGeDBjbUZ1YzNCaGNtVnVkRnhjS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdiR1ZuWlc1a0xuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLVnh1SUNBcEsxeHVJQ0JoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBd0xDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQnpNREU2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TURFcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6RXlPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekV5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hNeU16b2dYRndzSUdOdmJuWlFkbUZzZFdVb2NITXlNeWtzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEJ6TXpRNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek16UXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekkwT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pJMEtTd2dYRnhjWEc1Y1hDd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNVFE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TVRRcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6QTBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekEwS1N3Z1hGeGNYRzVjWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTWlrZ0sxeHVJQ0JqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9MVEF1TlN3Z01DNHhLU2xjYmx4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhrYVdabVUyTnZjbVZmWW1GeWNHeHZkRjl3WlVkeWIzVndYMlJVUVVkZmRuTmZSRTFUVDF4Y0tWeHVkMmxrZEdnZ1BDMGdNek1xYlcxVWIwbHVZMmhjYm1obGFXZG9kQ0E4TFRNekttMXRWRzlKYm1Ob1hHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbWVhbl9kaWZmX3Njb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHBzT3ZlciwgeSA9IG1lYW5fZGlmZl9zY29yZSkpICsgXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCM3Nzc3NzdcXCwgXFwjOEI3RTY1XFwsIFxcI0EyODQ1MlxcLCBcXCNDMjg4NERcXCwgXFwjRjI4RTJDXFwpKSArXG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkFcbiAgKSArIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxBdmVyYWdlIM6UIGxvb3Agc2NvcmVcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC4xKSlcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxkaWZmU2NvcmVfYmFycGxvdF9wZUdyb3VwX2RUQUdfdnNfRE1TT1xcKVxud2lkdGggPC0gMzMqbW1Ub0luY2hcbmhlaWdodCA8LTMzKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbWVhbl9kaWZmX3Njb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHBzT3ZlciwgeSA9IG1lYW5fZGlmZl9zY29yZSkpICsgXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCM3Nzc3NzdcXCwgXFwjOEI3RTY1XFwsIFxcI0EyODQ1MlxcLCBcXCNDMjg4NERcXCwgXFwjRjI4RTJDXFwpKSArXG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkFcbiAgKSArIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxBdmVyYWdlIM6UIGxvb3Agc2NvcmVcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC4xKSlcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxkaWZmU2NvcmVfYmFycGxvdF9wZUdyb3VwX2RUQUdfdnNfRE1TT1xcKVxud2lkdGggPC0gMzMqbW1Ub0luY2hcbmhlaWdodCA8LTMzKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(psOver ==group1) )$mean_diff_score
  distance2 <- (data %>% dplyr::filter(psOver ==group2) )$mean_diff_score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

ps01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(temp, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(temp, \psOver1\, \psOver4\), 5)
ps04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)


p <- ggplot(temp, aes(x = psOver, y = mean_diff_score)) + 
    scale_fill_manual(values = c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\)) +
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineMedium * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \Average Δ loop score\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) +
  coord_cartesian(ylim = c(-0.5, 0.1))


fileName <- paste0(\diffScore_barplot_peGroup_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### GO for each group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR1Z0Y0NBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dGaWMweHZaekpHUXlBOUlHRmljeWhzYjJjeVJtOXNaRU5vWVc1blpTa3BYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJR0ZpYzB4dlp6SkdReXdnWTI5c2IzSWdQU0J3YzA5MlpYSXBLU0FyWEc1elkyRnNaVjlqYjJ4dmNsOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ0tHTW9YQ0lqTnpjM056YzNYQ0lzSUZ3aUl6aENOMFUyTlZ3aUxDQmNJaU5CTWpnME5USmNJaXdnWENJalF6STRPRFJFWENJc0lGd2lJMFl5T0VVeVExd2lLU2twSUN0Y2JpQWdjM1JoZEY5bFkyUm1LSE5wZW1VZ1BTQXdMalFzSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZOWldScGRXMGdLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lJQ2tnS3lBaklGVnpaU0J6ZEdGMFgyVmpaR1lnZEc4Z2NHeHZkQ0IwYUdVZ1pXMXdhWEpwWTJGc0lFTkVSbHh1SUNCc1lXSnpLRnh1SUNBZ0lIZ2dQU0JjSWtGaWN5NGdiRzluTWlobWIyeGtJR05vWVc1blpTbGNJaXhjYmlBZ0lDQjVJRDBnWENKRGRXMTFiR0YwYVhabElGQnliMkpoWW1sc2FYUjVYQ0pjYmlBZ0tTQXJJR052YjNKa1gyTmhjblJsYzJsaGJpaDRiR2x0SUQwZ1l5Z3dMQ0F4TGpVcEtTQXJYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUNNZ1EyeGxZVzRnZEdobGJXVmNiaUFnZEdobGJXVW9YRzRnSUNBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjSW5SeVlXNXpjR0Z5Wlc1MFhDSXBMRnh1SUNBZ0lHeGxaMlZ1WkM1d2IzTnBkR2x2YmlBOUlGd2libTl1WlZ3aUxGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDQWdLU0FySUhOallXeGxYM2xmWTI5dWRHbHVkVzkxY3loc1lXSmxiSE1nUFNCelkyRnNaWE02T201MWJXSmxjbDltYjNKdFlYUW9ZV05qZFhKaFkza2dQU0F3TGpFcEtWeHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpYkc5bk1rWkRYMk5rWmw5d1pVZHliM1Z3WDJSVVFVZGZkbk5mUkUxVFQxd2lLVnh1ZDJsa2RHZ2dQQzBnTXpNcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExUTXpLbTF0Vkc5SmJtTm9YRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWNibHh1STF4dUlHZGxkRkIyWVd4WGFXeGpiM2dnUEMwZ1puVnVZM1JwYjI0b1pHRjBZU3dnWjNKdmRYQXhMQ0JuY205MWNESXBlMXh1SUNCa2FYTjBZVzVqWlRFZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2NITlBkbVZ5SUQwOVozSnZkWEF4S1NBcEpHeHZaekpHYjJ4a1EyaGhibWRsWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiRzluTWtadmJHUkRhR0Z1WjJWY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1Y2JuUmxiWEJFYjNkdUlEd3RJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JHOW5Na1p2YkdSRGFHRnVaMlVnUENBd0tWeHVJRnh1Y0hNd01TQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY0luQnpUM1psY2pCY0lpd2dYQ0p3YzA5MlpYSXhYQ0lwTENBMUtWeHVjSE14TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjSW5CelQzWmxjakZjSWl3Z1hDSndjMDkyWlhJeVhDSXBMQ0ExS1Z4dWNITXlNeUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNJbkJ6VDNabGNqSmNJaXdnWENKd2MwOTJaWEl6WENJcExDQTFLVnh1Y0hNek5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY0luQnpUM1psY2pOY0lpd2dYQ0p3YzA5MlpYSTBYQ0lwTENBMUtWeHVjSE15TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjSW5CelQzWmxjakpjSWl3Z1hDSndjMDkyWlhJMFhDSXBMQ0ExS1Z4dWNITXhOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNJbkJ6VDNabGNqRmNJaXdnWENKd2MwOTJaWEkwWENJcExDQTFLVnh1WEc1d2N6QTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRVJ2ZDI0c0lGd2ljSE5QZG1WeU1Gd2lMQ0JjSW5CelQzWmxjalJjSWlrc0lEVXBYRzVjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0VSdmQyNHNJR0ZsY3loNElEMGdjSE5QZG1WeUxDQjVJRDBnYkc5bk1rWnZiR1JEYUdGdVoyVXBLU0FySUZ4dUlDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRndpSTBRNVJEbEVPVndpTENCY0lpTkNSa0pHUWtaY0lpd2dYQ0lqUVRaQk5rRTJYQ0lzSUZ3aUl6aERPRU00UTF3aUxDQmNJaU0zTXpjek56TmNJaWtwSUNzZ0l5QkdhWFpsSUhOb1lXUmxjeUJ2WmlCbmNtVjVYRzRnSUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdjSE5QZG1WeUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FyWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJYRzRnSUNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QnNZV0p6S0hnZ1BTQk9WVXhNSUN3Z2VTQTlJRndpYkc5bk1paG1iMnhrSUdOb1lXNW5aU2xjSWlrZ0sxeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1hHNGdJQ0FnWVdWektHZHliM1Z3SUQwZ2NITlBkbVZ5S1N3Z1puVnVJRDBnYldWaGJpeGNiaUFnSUNCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01TeGNiaUFnSUNCbWFXeHNJRDBnWENKeVpXUmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0pjYmlBZ0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFzSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZENrZ0sxeHVJQ0IwYUdWdFpTaGNiaUFnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXdnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRdWVDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lHaHFkWE4wSUQwZ01Td2dkbXAxYzNRZ1BTQXhYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNJblJ5WVc1emNHRnlaVzUwWENJcExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDa3JYRzRnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdNU3dnZVNBOUlDMHdMalVzSUd4aFltVnNJRDBnY0dGemRHVXdLRndpY0hNd01Ub2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NITXdNU2tzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TVRJNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1USXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekl6T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pJektTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNITXpORG9nWENJc0lHTnZiblpRZG1Gc2RXVW9jSE16TkNrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5Cek1qUTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNalFwTENCY0lseGNibHdpTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hNeE5Eb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NITXhOQ2tzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TURRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1EUXBMQ0JjSWx4Y2Jsd2lLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXlLU0FySUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWd0TVN3Z01Da3BYRzRnSUZ4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2liRzluTWtaRFgySmhjbkJzYjNSZmNHVkhjbTkxY0Y5a1ZFRkhYM1p6WDBSTlUwOWZaRzkzYmx3aUtWeHVkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TWlrcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NU2txYlcxVWIwbHVZMmhjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibHh1WEc1Y2JuUmxiWEJWY0NBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0d4dlp6SkdiMnhrUTJoaGJtZGxJRDRnTUNsY2JpQmNibkJ6TURFZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1ZYQXNJRndpY0hOUGRtVnlNRndpTENCY0luQnpUM1psY2pGY0lpa3NJRFVwWEc1d2N6RXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY0luQnpUM1psY2pGY0lpd2dYQ0p3YzA5MlpYSXlYQ0lwTENBMUtWeHVjSE15TXlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVmNDd2dYQ0p3YzA5MlpYSXlYQ0lzSUZ3aWNITlBkbVZ5TTF3aUtTd2dOU2xjYm5Cek16UWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdWWEFzSUZ3aWNITlBkbVZ5TTF3aUxDQmNJbkJ6VDNabGNqUmNJaWtzSURVcFhHNXdjekkwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNJbkJ6VDNabGNqSmNJaXdnWENKd2MwOTJaWEkwWENJcExDQTFLVnh1Y0hNeE5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlZjQ3dnWENKd2MwOTJaWEl4WENJc0lGd2ljSE5QZG1WeU5Gd2lLU3dnTlNsY2JuQnpNRFFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VlhBc0lGd2ljSE5QZG1WeU1Gd2lMQ0JjSW5CelQzWmxjalJjSWlrc0lEVXBYRzVjYmx4dVhHNWNibkFnUEMwZ1oyZHdiRzkwS0hSbGJYQlZjQ3dnWVdWektIZ2dQU0J3YzA5MlpYSXNJSGtnUFNCc2IyY3lSbTlzWkVOb1lXNW5aU2twSUNzZ1hHNGdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENJalJEbEVPVVE1WENJc0lGd2lJMEpHUWtaQ1Jsd2lMQ0JjSWlOQk5rRTJRVFpjSWl3Z1hDSWpPRU00UXpoRFhDSXNJRndpSXpjek56TTNNMXdpS1NrZ0t5QWpJRVpwZG1VZ2MyaGhaR1Z6SUc5bUlHZHlaWGxjYmlBZ1oyVnZiVjkyYVc5c2FXNG9ZV1Z6S0dacGJHd2dQU0J3YzA5MlpYSXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUN0Y2JpQWdaMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0eExDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0ZjYmlBZ0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJR3hoWW5Nb2VDQTlJRTVWVEV3Z0xDQjVJRDBnWENKc2IyY3lLR1p2YkdRZ1kyaGhibWRsS1Z3aUtTQXJYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGNiaUFnSUNCaFpYTW9aM0p2ZFhBZ1BTQndjMDkyWlhJcExDQm1kVzRnUFNCdFpXRnVMRnh1SUNBZ0lHZGxiMjBnUFNCY0luQnZhVzUwWENJc0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXhMRnh1SUNBZ0lHWnBiR3dnUFNCY0luSmxaRndpTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWx4dUlDQXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUN3Z2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMEtTQXJYRzRnSUhSb1pXMWxLRnh1SUNBZ0lHRjRhWE11ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTENCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5d2dabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDNTRJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ1lXNW5iR1VnUFNBME5Td2dhR3AxYzNRZ1BTQXhMQ0IyYW5WemRDQTlJREZjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11YkdsdVpTQTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUnBZMnR6SUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXdnYzJsNlpTQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRndpZEhKaGJuTndZWEpsYm5SY0lpa3NYRzRnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlsY2JpQWdLU3RjYmlBZ1lXNXViM1JoZEdVb1hDSjBaWGgwWENJc0lIZ2dQU0F4TENCNUlEMGdNQzQxTENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5Cek1ERTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNREVwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pFeU9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6RXlLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE15TXpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNeU15a3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNelE2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TXpRcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2N6STBPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdjekkwS1N3Z1hDSmNYRzVjSWl3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5Cek1UUTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNVFFwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pBME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6QTBLU3dnWENKY1hHNWNJaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNaWtnS3lCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTUN3Z01Ta3BYRzVjYmlBZ1hHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0pzYjJjeVJrTmZZbUZ5Y0d4dmRGOXdaVWR5YjNWd1gyUlVRVWRmZG5OZlJFMVRUMTkxY0Z3aUtWeHVkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TVRncEttMXRWRzlKYm1Ob1hHNW9aV2xuYUhRZ1BDMGdjR0Z1Wld4VGFYcGxLREVwS20xdFZHOUpibU5vWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShhYnNMb2cyRkMgPSBhYnMobG9nMkZvbGRDaGFuZ2UpKVxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBhYnNMb2cyRkMsIGNvbG9yID0gcHNPdmVyKSkgK1xuc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IChjKFxcIzc3Nzc3N1xcLCBcXCM4QjdFNjVcXCwgXFwjQTI4NDUyXFwsIFxcI0MyODg0RFxcLCBcXCNGMjhFMkNcXCkpKSArXG4gIHN0YXRfZWNkZihzaXplID0gMC40LCBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCApICsgIyBVc2Ugc3RhdF9lY2RmIHRvIHBsb3QgdGhlIGVtcGlyaWNhbCBDREZcbiAgbGFicyhcbiAgICB4ID0gXFxBYnMuIGxvZzIoZm9sZCBjaGFuZ2UpXFwsXG4gICAgeSA9IFxcQ3VtdWxhdGl2ZSBQcm9iYWJpbGl0eVxcXG4gICkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMS41KSkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyAjIENsZWFuIHRoZW1lXG4gIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgICkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMC4xKSlcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19jZGZfcGVHcm91cF9kVEFHX3ZzX0RNU09cXClcbndpZHRoIDwtIDMzKm1tVG9JbmNoXG5oZWlnaHQgPC0zMyptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cbiNcbiBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJGxvZzJGb2xkQ2hhbmdlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG50ZW1wRG93biA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlIDwgMClcbiBcbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcblxucHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KHRlbXBEb3duLCBhZXMoeCA9IHBzT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCNEOUQ5RDlcXCwgXFwjQkZCRkJGXFwsIFxcI0E2QTZBNlxcLCBcXCM4QzhDOENcXCwgXFwjNzM3MzczXFwpKSArICMgRml2ZSBzaGFkZXMgb2YgZ3JleVxuICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIFxuICAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQVxuICApICsgdGhlbWVfY2xhc3NpYygpICsgbGFicyh4ID0gTlVMTCAsIHkgPSBcXGxvZzIoZm9sZCBjaGFuZ2UpXFwpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IHBzT3ZlciksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsXG4gICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAtMC41LCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEsIDApKVxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BlR3JvdXBfZFRBR192c19ETVNPX2Rvd25cXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG50ZW1wVXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA+IDApXG4gXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5cblxuXG5wIDwtIGdncGxvdCh0ZW1wVXAsIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIFxuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICsgIyBGaXZlIHNoYWRlcyBvZiBncmV5XG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BXG4gICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFxcbG9nMihmb2xkIGNoYW5nZSlcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMwNDogXFwsIGNvbnZQdmFsdWUocHMwNCksIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDIpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEpKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcGVHcm91cF9kVEFHX3ZzX0RNU09fdXBcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjE4KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxKSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
temp <- temp %>% dplyr::mutate(absLog2FC = abs(log2FoldChange))
p <- ggplot(temp, aes(x = absLog2FC, color = psOver)) +
scale_color_manual(values = (c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\))) +
  stat_ecdf(size = 0.4, linewidth = lineMedium * mmToLineUnit, lineend = \square\ ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Abs. log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.position = \none\,
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    ) + scale_y_continuous(labels = scales::number_format(accuracy = 0.1))
fileName <- paste0(\log2FC_cdf_peGroup_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


#
 getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(psOver ==group1) )$log2FoldChange
  distance2 <- (data %>% dplyr::filter(psOver ==group2) )$log2FoldChange
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
 
ps01 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(tempDown, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver4\), 5)

ps04 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver4\), 5)


p <- ggplot(tempDown, aes(x = psOver, y = log2FoldChange)) + 
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) + # Five shades of grey
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \log2(fold change)\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = -0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) + coord_cartesian(ylim = c(-1, 0))
  
fileName <- paste0(\log2FC_barplot_peGroup_dTAG_vs_DMSO_down\)
width <- panelSize(1.2)*mmToInch
height <- panelSize(1)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
 
ps01 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(tempUp, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver4\), 5)
ps04 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver4\), 5)




p <- ggplot(tempUp, aes(x = psOver, y = log2FoldChange)) + 
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) + # Five shades of grey
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \log2(fold change)\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_peGroup_dTAG_vs_DMSO_up\)
width <- panelSize(1.18)*mmToInch
height <- panelSize(1)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRHVnRjQ0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR0ZpYzB4dlp6SkdReUE5SUdGaWN5aHNiMmN5Um05c1pFTm9ZVzVuWlNrcFhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlHRmljMHh2WnpKR1F5d2dZMjlzYjNJZ1BTQndjMDkyWlhJcEtTQXJYRzV6WTJGc1pWOWpiMnh2Y2w5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnS0dNb1hGd2pOemMzTnpjM1hGd3NJRnhjSXpoQ04wVTJOVnhjTENCY1hDTkJNamcwTlRKY1hDd2dYRndqUXpJNE9EUkVYRndzSUZ4Y0kwWXlPRVV5UTF4Y0tTa3BJQ3RjYmlBZ2MzUmhkRjlsWTJSbUtITnBlbVVnUFNBd0xqUXNJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVk5aV1JwZFcwZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0lDa2dLeUFqSUZWelpTQnpkR0YwWDJWalpHWWdkRzhnY0d4dmRDQjBhR1VnWlcxd2FYSnBZMkZzSUVORVJseHVJQ0JzWVdKektGeHVJQ0FnSUhnZ1BTQmNYRUZpY3k0Z2JHOW5NaWhtYjJ4a0lHTm9ZVzVuWlNsY1hDeGNiaUFnSUNCNUlEMGdYRnhEZFcxMWJHRjBhWFpsSUZCeWIySmhZbWxzYVhSNVhGeGNiaUFnS1NBcklHTnZiM0prWDJOaGNuUmxjMmxoYmloNGJHbHRJRDBnWXlnd0xDQXhMalVwS1NBclhHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJQ01nUTJ4bFlXNGdkR2hsYldWY2JpQWdkR2hsYldVb1hHNGdJQ0FnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNYSFJ5WVc1emNHRnlaVzUwWEZ3cExGeHVJQ0FnSUd4bFoyVnVaQzV3YjNOcGRHbHZiaUE5SUZ4Y2JtOXVaVnhjTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNBZ0tTQXJJSE5qWVd4bFgzbGZZMjl1ZEdsdWRXOTFjeWhzWVdKbGJITWdQU0J6WTJGc1pYTTZPbTUxYldKbGNsOW1iM0p0WVhRb1lXTmpkWEpoWTNrZ1BTQXdMakVwS1Z4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNiRzluTWtaRFgyTmtabDl3WlVkeWIzVndYMlJVUVVkZmRuTmZSRTFUVDF4Y0tWeHVkMmxrZEdnZ1BDMGdNek1xYlcxVWIwbHVZMmhjYm1obGFXZG9kQ0E4TFRNekttMXRWRzlKYm1Ob1hHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Y2JseHVJMXh1SUdkbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvY0hOUGRtVnlJRDA5WjNKdmRYQXhLU0FwSkd4dlp6SkdiMnhrUTJoaGJtZGxYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2MwOTJaWElnUFQxbmNtOTFjRElwSUNra2JHOW5Na1p2YkdSRGFHRnVaMlZjYmlBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SUNCeVpYUjFjbTRvZDJsc0pIQXVkbUZzZFdVcFhHNTlYRzVjYm5SbGJYQkViM2R1SUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYkc5bk1rWnZiR1JEYUdGdVoyVWdQQ0F3S1Z4dUlGeHVjSE13TVNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjWEhCelQzWmxjakJjWEN3Z1hGeHdjMDkyWlhJeFhGd3BMQ0ExS1Z4dWNITXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNYSEJ6VDNabGNqRmNYQ3dnWEZ4d2MwOTJaWEl5WEZ3cExDQTFLVnh1Y0hNeU15QThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY1hIQnpUM1psY2pKY1hDd2dYRnh3YzA5MlpYSXpYRndwTENBMUtWeHVjSE16TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjWEhCelQzWmxjak5jWEN3Z1hGeHdjMDkyWlhJMFhGd3BMQ0ExS1Z4dWNITXlOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNYSEJ6VDNabGNqSmNYQ3dnWEZ4d2MwOTJaWEkwWEZ3cExDQTFLVnh1Y0hNeE5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY1hIQnpUM1psY2pGY1hDd2dYRnh3YzA5MlpYSTBYRndwTENBMUtWeHVYRzV3Y3pBMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNFUnZkMjRzSUZ4Y2NITlBkbVZ5TUZ4Y0xDQmNYSEJ6VDNabGNqUmNYQ2tzSURVcFhHNWNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjRVJ2ZDI0c0lHRmxjeWg0SUQwZ2NITlBkbVZ5TENCNUlEMGdiRzluTWtadmJHUkRhR0Z1WjJVcEtTQXJJRnh1SUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGeGNJMFE1UkRsRU9WeGNMQ0JjWENOQ1JrSkdRa1pjWEN3Z1hGd2pRVFpCTmtFMlhGd3NJRnhjSXpoRE9FTTRRMXhjTENCY1hDTTNNemN6TnpOY1hDa3BJQ3NnSXlCR2FYWmxJSE5vWVdSbGN5QnZaaUJuY21WNVhHNGdJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ2NITlBkbVZ5S1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QlhHNGdJQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCc1lXSnpLSGdnUFNCT1ZVeE1JQ3dnZVNBOUlGeGNiRzluTWlobWIyeGtJR05vWVc1blpTbGNYQ2tnSzF4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWEc0Z0lDQWdZV1Z6S0dkeWIzVndJRDBnY0hOUGRtVnlLU3dnWm5WdUlEMGdiV1ZoYml4Y2JpQWdJQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTVN4Y2JpQWdJQ0JtYVd4c0lEMGdYRnh5WldSY1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGeGNiaUFnS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ2tnSzF4dUlDQjBhR1Z0WlNoY2JpQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5d2dabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUdocWRYTjBJRDBnTVN3Z2RtcDFjM1FnUFNBeFhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY1hIUnlZVzV6Y0dGeVpXNTBYRndwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNrclhHNGdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ01Td2dlU0E5SUMwd0xqVXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGeGNjSE13TVRvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hNd01Ta3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNVEk2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TVRJcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6SXpPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekl6S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hNek5Eb2dYRndzSUdOdmJuWlFkbUZzZFdVb2NITXpOQ2tzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEJ6TWpRNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek1qUXBMQ0JjWEZ4Y2JseGNMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSE14TkRvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hNeE5Da3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNRFE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TURRcExDQmNYRnhjYmx4Y0tTd2dYRzRnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBeUtTQXJJR052YjNKa1gyTmhjblJsYzJsaGJpaDViR2x0SUQwZ1l5Z3RNU3dnTUNrcFhHNGdJRnh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y2JHOW5Na1pEWDJKaGNuQnNiM1JmY0dWSGNtOTFjRjlrVkVGSFgzWnpYMFJOVTA5ZlpHOTNibHhjS1Z4dWQybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtERXVNaWtxYlcxVWIwbHVZMmhjYm1obGFXZG9kQ0E4TFNCd1lXNWxiRk5wZW1Vb01Ta3FiVzFVYjBsdVkyaGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JseHVYRzVjYm5SbGJYQlZjQ0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR3h2WnpKR2IyeGtRMmhoYm1kbElENGdNQ2xjYmlCY2JuQnpNREVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VlhBc0lGeGNjSE5QZG1WeU1GeGNMQ0JjWEhCelQzWmxjakZjWENrc0lEVXBYRzV3Y3pFeUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjWEhCelQzWmxjakZjWEN3Z1hGeHdjMDkyWlhJeVhGd3BMQ0ExS1Z4dWNITXlNeUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJWY0N3Z1hGeHdjMDkyWlhJeVhGd3NJRnhjY0hOUGRtVnlNMXhjS1N3Z05TbGNibkJ6TXpRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1ZYQXNJRnhjY0hOUGRtVnlNMXhjTENCY1hIQnpUM1psY2pSY1hDa3NJRFVwWEc1d2N6STBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY1hIQnpUM1psY2pKY1hDd2dYRnh3YzA5MlpYSTBYRndwTENBMUtWeHVjSE14TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVmNDd2dYRnh3YzA5MlpYSXhYRndzSUZ4Y2NITlBkbVZ5TkZ4Y0tTd2dOU2xjYm5Cek1EUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdWWEFzSUZ4Y2NITlBkbVZ5TUZ4Y0xDQmNYSEJ6VDNabGNqUmNYQ2tzSURVcFhHNWNibHh1WEc1Y2JuQWdQQzBnWjJkd2JHOTBLSFJsYlhCVmNDd2dZV1Z6S0hnZ1BTQndjMDkyWlhJc0lIa2dQU0JzYjJjeVJtOXNaRU5vWVc1blpTa3BJQ3NnWEc0Z0lITmpZV3hsWDJacGJHeGZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YRndqUkRsRU9VUTVYRndzSUZ4Y0kwSkdRa1pDUmx4Y0xDQmNYQ05CTmtFMlFUWmNYQ3dnWEZ3ak9FTTRRemhEWEZ3c0lGeGNJemN6TnpNM00xeGNLU2tnS3lBaklFWnBkbVVnYzJoaFpHVnpJRzltSUdkeVpYbGNiaUFnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQndjMDkyWlhJcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3RjYmlBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRmNiaUFnS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHeGhZbk1vZUNBOUlFNVZURXdnTENCNUlEMGdYRnhzYjJjeUtHWnZiR1FnWTJoaGJtZGxLVnhjS1NBclhHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoY2JpQWdJQ0JoWlhNb1ozSnZkWEFnUFNCd2MwOTJaWElwTENCbWRXNGdQU0J0WldGdUxGeHVJQ0FnSUdkbGIyMGdQU0JjWEhCdmFXNTBYRndzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBeExGeHVJQ0FnSUdacGJHd2dQU0JjWEhKbFpGeGNMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYRnh1SUNBcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ3dnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwS1NBclhHNGdJSFJvWlcxbEtGeHVJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl3Z1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZEM1NElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnWVc1bmJHVWdQU0EwTlN3Z2FHcDFjM1FnUFNBeExDQjJhblZ6ZENBOUlERmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXViR2x1WlNBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hDd2djMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcExGeHVJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGeGNkSEpoYm5Od1lYSmxiblJjWENrc1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWxjYmlBZ0tTdGNiaUFnWVc1dWIzUmhkR1VvWEZ4MFpYaDBYRndzSUhnZ1BTQXhMQ0I1SUQwZ01DNDFMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEJ6TURFNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek1ERXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekV5T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pFeUtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXlNem9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE15TXlrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek16UTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNelFwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3Y3pJME9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod2N6STBLU3dnWEZ4Y1hHNWNYQ3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEJ6TVRRNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek1UUXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekEwT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pBMEtTd2dYRnhjWEc1Y1hDa3NJRnh1SUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ01pa2dLeUJqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9NQ3dnTVNrcFhHNWNiaUFnWEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hGeHNiMmN5UmtOZlltRnljR3h2ZEY5d1pVZHliM1Z3WDJSVVFVZGZkbk5mUkUxVFQxOTFjRnhjS1Z4dWQybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtERXVNVGdwS20xdFZHOUpibU5vWEc1b1pXbG5hSFFnUEMwZ2NHRnVaV3hUYVhwbEtERXBLbTF0Vkc5SmJtTm9YRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShhYnNMb2cyRkMgPSBhYnMobG9nMkZvbGRDaGFuZ2UpKVxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBhYnNMb2cyRkMsIGNvbG9yID0gcHNPdmVyKSkgK1xuc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IChjKFxcIzc3Nzc3N1xcLCBcXCM4QjdFNjVcXCwgXFwjQTI4NDUyXFwsIFxcI0MyODg0RFxcLCBcXCNGMjhFMkNcXCkpKSArXG4gIHN0YXRfZWNkZihzaXplID0gMC40LCBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCApICsgIyBVc2Ugc3RhdF9lY2RmIHRvIHBsb3QgdGhlIGVtcGlyaWNhbCBDREZcbiAgbGFicyhcbiAgICB4ID0gXFxBYnMuIGxvZzIoZm9sZCBjaGFuZ2UpXFwsXG4gICAgeSA9IFxcQ3VtdWxhdGl2ZSBQcm9iYWJpbGl0eVxcXG4gICkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMS41KSkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyAjIENsZWFuIHRoZW1lXG4gIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgICkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMC4xKSlcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19jZGZfcGVHcm91cF9kVEFHX3ZzX0RNU09cXClcbndpZHRoIDwtIDMzKm1tVG9JbmNoXG5oZWlnaHQgPC0zMyptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cbiNcbiBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJGxvZzJGb2xkQ2hhbmdlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG50ZW1wRG93biA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlIDwgMClcbiBcbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcblxucHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KHRlbXBEb3duLCBhZXMoeCA9IHBzT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCNEOUQ5RDlcXCwgXFwjQkZCRkJGXFwsIFxcI0E2QTZBNlxcLCBcXCM4QzhDOENcXCwgXFwjNzM3MzczXFwpKSArICMgRml2ZSBzaGFkZXMgb2YgZ3JleVxuICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIFxuICAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQVxuICApICsgdGhlbWVfY2xhc3NpYygpICsgbGFicyh4ID0gTlVMTCAsIHkgPSBcXGxvZzIoZm9sZCBjaGFuZ2UpXFwpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IHBzT3ZlciksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsXG4gICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAtMC41LCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEsIDApKVxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BlR3JvdXBfZFRBR192c19ETVNPX2Rvd25cXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG50ZW1wVXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA+IDApXG4gXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5cblxuXG5wIDwtIGdncGxvdCh0ZW1wVXAsIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIFxuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICsgIyBGaXZlIHNoYWRlcyBvZiBncmV5XG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BXG4gICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFxcbG9nMihmb2xkIGNoYW5nZSlcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMwNDogXFwsIGNvbnZQdmFsdWUocHMwNCksIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDIpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEpKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcGVHcm91cF9kVEFHX3ZzX0RNU09fdXBcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjE4KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxKSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKGFic0xvZzJGQyA9IGFicyhsb2cyRm9sZENoYW5nZSkpXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGFic0xvZzJGQywgY29sb3IgPSBwc092ZXIpKSArXG5zY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gKGMoXFwjNzc3Nzc3XFwsIFxcIzhCN0U2NVxcLCBcXCNBMjg0NTJcXCwgXFwjQzI4ODREXFwsIFxcI0YyOEUyQ1xcKSkpICtcbiAgc3RhdF9lY2RmKHNpemUgPSAwLjQsIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcICkgKyAjIFVzZSBzdGF0X2VjZGYgdG8gcGxvdCB0aGUgZW1waXJpY2FsIENERlxuICBsYWJzKFxuICAgIHggPSBcXEFicy4gbG9nMihmb2xkIGNoYW5nZSlcXCxcbiAgICB5ID0gXFxDdW11bGF0aXZlIFByb2JhYmlsaXR5XFxcbiAgKSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxLjUpKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArICMgQ2xlYW4gdGhlbWVcbiAgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAwLjEpKVxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2NkZl9wZUdyb3VwX2RUQUdfdnNfRE1TT1xcKVxud2lkdGggPC0gMzMqbW1Ub0luY2hcbmhlaWdodCA8LTMzKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuI1xuIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJGxvZzJGb2xkQ2hhbmdlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnRlbXBEb3duIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKVxuIFxucHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXIzXFwpLCA1KVxucHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcERvd24sIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIFxuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICsgIyBGaXZlIHNoYWRlcyBvZiBncmV5XG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BXG4gICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFxcbG9nMihmb2xkIGNoYW5nZSlcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IC0wLjUsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsIGNvbnZQdmFsdWUocHMxNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAyKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMSwgMCkpXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcGVHcm91cF9kVEFHX3ZzX0RNU09fZG93blxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMClcbiBcbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG5wczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwc092ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjRDlEOUQ5XFwsIFxcI0JGQkZCRlxcLCBcXCNBNkE2QTZcXCwgXFwjOEM4QzhDXFwsIFxcIzczNzM3M1xcKSkgKyAjIEZpdmUgc2hhZGVzIG9mIGdyZXlcbiAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwc092ZXIpLCBcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkFcbiAgKSArIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxsb2cyKGZvbGQgY2hhbmdlKVxcKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLFxuICAgIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMC41LCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfYmFycGxvdF9wZUdyb3VwX2RUQUdfdnNfRE1TT191cFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMTgpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
temp <- temp %>% dplyr::mutate(absLog2FC = abs(log2FoldChange))
p <- ggplot(temp, aes(x = absLog2FC, color = psOver)) +
scale_color_manual(values = (c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\))) +
  stat_ecdf(size = 0.4, linewidth = lineMedium * mmToLineUnit, lineend = \square\ ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Abs. log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.position = \none\,
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    ) + scale_y_continuous(labels = scales::number_format(accuracy = 0.1))
fileName <- paste0(\log2FC_cdf_peGroup_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


#
 getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(psOver ==group1) )$log2FoldChange
  distance2 <- (data %>% dplyr::filter(psOver ==group2) )$log2FoldChange
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
 
ps01 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(tempDown, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver4\), 5)

ps04 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver4\), 5)


p <- ggplot(tempDown, aes(x = psOver, y = log2FoldChange)) + 
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) + # Five shades of grey
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \log2(fold change)\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = -0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) + coord_cartesian(ylim = c(-1, 0))
  
fileName <- paste0(\log2FC_barplot_peGroup_dTAG_vs_DMSO_down\)
width <- panelSize(1.2)*mmToInch
height <- panelSize(1)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
 
ps01 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(tempUp, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver4\), 5)
ps04 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver4\), 5)




p <- ggplot(tempUp, aes(x = psOver, y = log2FoldChange)) + 
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) + # Five shades of grey
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \log2(fold change)\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_peGroup_dTAG_vs_DMSO_up\)
width <- panelSize(1.18)*mmToInch
height <- panelSize(1)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### loop score

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUIwWlcxd01pQmpiMjUwWVdsdWN5Qm5aVzVsY3lCbWNtOXRJR2R5YjNWd0lERXNJRElzSURVc0lEZ2dZVzVrSUd4dmIzQWdZMjkxYm5SelhHNGpZMkZzWTNWc1lYUnBibWNnWkdsbVppQnpZMjl5WlNCaGJtUWdiRzluTW1aaklHUnBjM1J5YVdKMWRHbHZiaUJpWVhObFpDQnZiaUJ3TFc0Z2JuVnRZbVZ5YzF4dVhHNXdjMDkyWlhJMElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hBZ1BqMGdOQ2twSkdkbGJtVmNibkJ6VDNabGNqTWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2NDQStQU0F6TENCdWRXMWZjSEFnUENBMEtTa2taMlZ1WlZ4dWNITlBkbVZ5TWlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J3SUQ0OUlESXNJRzUxYlY5d2NDQThJRE1wS1NSblpXNWxYRzV3YzA5MlpYSXhJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNIQWdQajBnTVN3Z2JuVnRYM0J3SUR3Z01pa3BKR2RsYm1WY2JuQnpUM1psY2pBZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y0NBOElERXBLU1JuWlc1bFhHNWNibHh1WEc0akl5QkVhWFpwWkdsdVp5Qm5aVzVsY3lCcGJuUnZJR2R5YjNWd2MxeHVkR1Z0Y0NBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsbVpsOWtWRUZIWDBSTlUwOHNJR1JwYzNSaGJtTmxMQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0J0WldGdUtHUnBabVpmWkZSQlIxOUVUVk5QS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzFsWVc1ZlpHbHpkR0Z1WTJVZ1BTQnRaV0Z1S0dScGMzUmhibU5sS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzVjYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbVJwWm1aZlJ6RXVaRlJCUjE5SE1TNHlhUzVrVkVGSFgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibHh1YldGNFRHOW5Na1pESUQwZ01seHVYRzUwWlcxd0lEd3RJR3hsWm5SZmFtOXBiaWgwWlcxd0xDQmthV1ptTGxKT1FTd2dZbmtnUFNCaktGd2laMlZ1WlZ3aUlEMGdYQ0psYm5ObGJXSnNYMmRsYm1WZmFXUmNJaWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG1iR0ZuSUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCa2FXWm1MbEpPUVM1SE1TNWtWRUZISkdWdWMyVnRZbXhmWjJWdVpWOXBaQ3dnWENJeVJFOVhUbHdpTENCY0lqQk9UMXdpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYaEdiR0ZuSUQwZ0tHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnYldGNFRHOW5Na1pES1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyY3labU5OWVhnZ1BTQndiV0Y0S0hCdGFXNG9jMmh5YVc1clpXUmZiRzluTWtaRExDQnRZWGhNYjJjeVJrTXBMQ0F0YldGNFRHOW5Na1pES1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2htYkdGbktTQWxQaVZjYmlBZ1pISnZjRjl1WVNoemFISnBibXRsWkY5c2IyY3lSa01wWEc1Y2JuUmxiWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hjYmlBZ2NITlBkbVZ5SUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCd2MwOTJaWEkwTENCY0luQnpUM1psY2pSY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjSE5QZG1WeU15d2dYQ0p3YzA5MlpYSXpYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSXlMQ0JjSW5CelQzWmxjakpjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSXhMQ0JjSW5CelQzWmxjakZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjSE5QZG1WeU1Dd2dYQ0p3YzA5MlpYSXdYQ0lzSUU1QktTa3BLU2twSUNVK0pWeHVJQ0JrY205d1gyNWhLSEJ6VDNabGNpbGNibHh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG4jIHRlbXAyIGNvbnRhaW5zIGdlbmVzIGZyb20gZ3JvdXAgMSwgMiwgNSwgOCBhbmQgbG9vcCBjb3VudHNcbiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzXG5cbnBzT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSA0KSkkZ2VuZVxucHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lXG5wc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmVcbnBzT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAxLCBudW1fcHAgPCAyKSkkZ2VuZVxucHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmVcblxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9kVEFHX0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGRpZmYuUk5BLkcxLmRUQUckZW5zZW1ibF9nZW5lX2lkLCBcXDJET1dOXFwsIFxcME5PXFwpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIGxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpICU+JVxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKFxuICBwc092ZXIgPSBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjQsIFxccHNPdmVyNFxcLFxuICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIzLCBcXHBzT3ZlcjNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjIsIFxccHNPdmVyMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjEsIFxccHNPdmVyMVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIwLCBcXHBzT3ZlcjBcXCwgTkEpKSkpKSkgJT4lXG4gIGRyb3BfbmEocHNPdmVyKVxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers

psOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% diff.RNA.G1.dTAG$ensembl_gene_id, \2DOWN\, \0NO\),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                log2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag) %>%
  drop_na(shrinked_log2FC)

temp <- temp %>% dplyr::mutate(
  psOver = ifelse(gene %in% psOver4, \psOver4\,
                  ifelse(gene %in% psOver3, \psOver3\,
                         ifelse(gene %in% psOver2, \psOver2\,
                                ifelse(gene %in% psOver1, \psOver1\,
                                       ifelse(gene %in% psOver0, \psOver0\, NA)))))) %>%
  drop_na(psOver)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QjBaVzF3TWlCamIyNTBZV2x1Y3lCblpXNWxjeUJtY205dElHZHliM1Z3SURFc0lESXNJRFVzSURnZ1lXNWtJR3h2YjNBZ1kyOTFiblJ6WEc0alkyRnNZM1ZzWVhScGJtY2daR2xtWmlCelkyOXlaU0JoYm1RZ2JHOW5NbVpqSUdScGMzUnlhV0oxZEdsdmJpQmlZWE5sWkNCdmJpQndMVzRnYm5WdFltVnljMXh1WEc1d2MwOTJaWEkwSUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSEFnUGowZ05Da3BKR2RsYm1WY2JuQnpUM1psY2pNZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y0NBK1BTQXpMQ0J1ZFcxZmNIQWdQQ0EwS1Nra1oyVnVaVnh1Y0hOUGRtVnlNaUE4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQndJRDQ5SURJc0lHNTFiVjl3Y0NBOElETXBLU1JuWlc1bFhHNXdjMDkyWlhJeElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hBZ1BqMGdNU3dnYm5WdFgzQndJRHdnTWlrcEpHZGxibVZjYm5CelQzWmxjakFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjQ0E4SURFcEtTUm5aVzVsWEc1Y2JseHVYRzRqSXlCRWFYWnBaR2x1WnlCblpXNWxjeUJwYm5SdklHZHliM1Z3YzF4dWRHVnRjQ0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2xtWmw5a1ZFRkhYMFJOVTA4c0lHUnBjM1JoYm1ObExDQm5aVzVsS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaHRaV0Z1WDJScFptWmZjMk52Y21VZ1BTQnRaV0Z1S0dScFptWmZaRlJCUjE5RVRWTlBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHMWxZVzVmWkdsemRHRnVZMlVnUFNCdFpXRnVLR1JwYzNSaGJtTmxLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDNW5jbTkxY0hNZ1BTQW5aSEp2Y0NjcFhHNWNibVJwWm1ZdVVrNUJJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHUnBabVpmUnpFdVpGUkJSMTlITVM0eWFTNWtWRUZIWDNaelgwY3hMakpwTGtSTlUwOHVkSE4yWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hsYm5ObGJXSnNYMmRsYm1WZmFXUXNJR3h2WnpKR2IyeGtRMmhoYm1kbExDQnphSEpwYm10bFpGOXNiMmN5UmtNc0lIQmhaR29zSUdWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlNsY2JseHViV0Y0VEc5bk1rWkRJRDBnTWx4dVhHNTBaVzF3SUR3dElHeGxablJmYW05cGJpaDBaVzF3TENCa2FXWm1MbEpPUVN3Z1lua2dQU0JqS0Z4Y1oyVnVaVnhjSUQwZ1hGeGxibk5sYldKc1gyZGxibVZmYVdSY1hDa3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobWJHRm5JRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0JrYVdabUxsSk9RUzVITVM1a1ZFRkhKR1Z1YzJWdFlteGZaMlZ1WlY5cFpDd2dYRnd5UkU5WFRseGNMQ0JjWERCT1QxeGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhoR2JHRm5JRDBnS0dGaWN5aHphSEpwYm10bFpGOXNiMmN5UmtNcElENGdiV0Y0VEc5bk1rWkRLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJjeVptTk5ZWGdnUFNCd2JXRjRLSEJ0YVc0b2MyaHlhVzVyWldSZmJHOW5Na1pETENCdFlYaE1iMmN5UmtNcExDQXRiV0Y0VEc5bk1rWkRLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZZWEp5WVc1blpTaG1iR0ZuS1NBbFBpVmNiaUFnWkhKdmNGOXVZU2h6YUhKcGJtdGxaRjlzYjJjeVJrTXBYRzVjYm5SbGJYQWdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnY0hOUGRtVnlJRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSTBMQ0JjWEhCelQzWmxjalJjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NITlBkbVZ5TXl3Z1hGeHdjMDkyWlhJelhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndjMDkyWlhJeUxDQmNYSEJ6VDNabGNqSmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndjMDkyWlhJeExDQmNYSEJ6VDNabGNqRmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NITlBkbVZ5TUN3Z1hGeHdjMDkyWlhJd1hGd3NJRTVCS1NrcEtTa3BJQ1UrSlZ4dUlDQmtjbTl3WDI1aEtIQnpUM1psY2lsY2JseHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG4jIHRlbXAyIGNvbnRhaW5zIGdlbmVzIGZyb20gZ3JvdXAgMSwgMiwgNSwgOCBhbmQgbG9vcCBjb3VudHNcbiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzXG5cbnBzT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSA0KSkkZ2VuZVxucHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lXG5wc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmVcbnBzT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAxLCBudW1fcHAgPCAyKSkkZ2VuZVxucHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmVcblxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9kVEFHX0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGRpZmYuUk5BLkcxLmRUQUckZW5zZW1ibF9nZW5lX2lkLCBcXDJET1dOXFwsIFxcME5PXFwpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIGxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpICU+JVxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKFxuICBwc092ZXIgPSBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjQsIFxccHNPdmVyNFxcLFxuICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIzLCBcXHBzT3ZlcjNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjIsIFxccHNPdmVyMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjEsIFxccHNPdmVyMVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIwLCBcXHBzT3ZlcjBcXCwgTkEpKSkpKSkgJT4lXG4gIGRyb3BfbmEocHNPdmVyKVxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyB0ZW1wMiBjb250YWlucyBnZW5lcyBmcm9tIGdyb3VwIDEsIDIsIDUsIDggYW5kIGxvb3AgY291bnRzXG4jY2FsY3VsYXRpbmcgZGlmZiBzY29yZSBhbmQgbG9nMmZjIGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiBwLW4gbnVtYmVyc1xuXG5wc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gNCkpJGdlbmVcbnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAzLCBudW1fcHAgPCA0KSkkZ2VuZVxucHNPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDIsIG51bV9wcCA8IDMpKSRnZW5lXG5wc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMSwgbnVtX3BwIDwgMikpJGdlbmVcbnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA8IDEpKSRnZW5lXG5cblxuXG4jIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwc1xudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9kVEFHX0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSxcbiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSxcbiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcblxubWF4TG9nMkZDID0gMlxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBkaWZmLlJOQS5HMS5kVEFHJGVuc2VtYmxfZ2VuZV9pZCwgXFwyRE9XTlxcLCBcXDBOT1xcKSxcbiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSxcbiAgICAgICAgICAgICAgICBsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIFxuICBkcGx5cjo6YXJyYW5nZShmbGFnKSAlPiVcbiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShcbiAgcHNPdmVyID0gaWZlbHNlKGdlbmUgJWluJSBwc092ZXI0LCBcXHBzT3ZlcjRcXCxcbiAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMywgXFxwc092ZXIzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIyLCBcXHBzT3ZlcjJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIxLCBcXHBzT3ZlcjFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMCwgXFxwc092ZXIwXFwsIE5BKSkpKSkpICU+JVxuICBkcm9wX25hKHBzT3ZlcilcblxuXG5gYGBcbmBgYCJ9 -->

```r
```r
# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers

psOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% diff.RNA.G1.dTAG$ensembl_gene_id, \2DOWN\, \0NO\),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                log2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag) %>%
  drop_na(shrinked_log2FC)

temp <- temp %>% dplyr::mutate(
  psOver = ifelse(gene %in% psOver4, \psOver4\,
                  ifelse(gene %in% psOver3, \psOver3\,
                         ifelse(gene %in% psOver2, \psOver2\,
                                ifelse(gene %in% psOver1, \psOver1\,
                                       ifelse(gene %in% psOver0, \psOver0\, NA)))))) %>%
  drop_na(psOver)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### log2FC

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVSMDltYVdkRWFYSWdQQzBnYUdWeVpTaG1hV2RFYVhJc0lGd2lMaTR2UjA5Y0lpbGNibHh1SXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNalhHNUhUekF1WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNobGJuSnBZMmhIVHloblpXNWxJRDBnY0hOUGRtVnlNQ3dnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUxDQnlaV0ZrWVdKc1pTQTlJRlJTVlVVcEtWeHVSMDh4TG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCelQzWmxjakVzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYQ0pGVGxORlRVSk1YQ0lzSUc5dWRDQTlJRndpUWxCY0lpd2djbVZoWkdGaWJHVWdQU0JVVWxWRktTbGNia2RQTWk1a1ppQThMU0JoY3k1a1lYUmhMbVp5WVcxbEtHVnVjbWxqYUVkUEtHZGxibVVnUFNCd2MwOTJaWEl5TENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRndpUlU1VFJVMUNURndpTENCdmJuUWdQU0JjSWtKUVhDSXNJSEpsWVdSaFlteGxJRDBnVkZKVlJTa3BYRzVIVHpNdVpHWWdQQzBnWVhNdVpHRjBZUzVtY21GdFpTaGxibkpwWTJoSFR5aG5aVzVsSUQwZ2NITlBkbVZ5TXl3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lMQ0J5WldGa1lXSnNaU0E5SUZSU1ZVVXBLVnh1UjA4MExtUm1JRHd0SUdGekxtUmhkR0V1Wm5KaGJXVW9aVzV5YVdOb1IwOG9aMlZ1WlNBOUlIQnpUM1psY2pRc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWENKRlRsTkZUVUpNWENJc0lHOXVkQ0E5SUZ3aVFsQmNJaXdnY21WaFpHRmliR1VnUFNCVVVsVkZLU2xjYmlNZ1hHNGpJR1ozY21sMFpTaEhUekF1WkdZc0lHaGxjbVVvWENKSFQxOVFVRjluY205MWNEQXVkSE4yWENJcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dUl5Qm1kM0pwZEdVb1IwOHhMbVJtTENCb1pYSmxLRndpUjA5ZlVGQmZaM0p2ZFhBeExuUnpkbHdpS1N3Z2MyVndJRDBnWENKY1hIUmNJaWxjYmlNZ1puZHlhWFJsS0VkUE1pNWtaaXdnYUdWeVpTaGNJa2RQWDFCUVgyZHliM1Z3TWk1MGMzWmNJaWtzSUhObGNDQTlJRndpWEZ4MFhDSXBYRzRqSUdaM2NtbDBaU2hIVHpNdVpHWXNJR2hsY21Vb1hDSkhUMTlRVUY5bmNtOTFjRE11ZEhOMlhDSXBMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUtWeHVJeUJtZDNKcGRHVW9SMDgwTG1SbUxDQm9aWEpsS0Z3aVIwOWZVRkJmWjNKdmRYQTBMblJ6ZGx3aUtTd2djMlZ3SUQwZ1hDSmNYSFJjSWlsY2JseHVjM1ZpYzJWME1DQThMU0JIVHpBdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRndpUjNKdmRYQWdNRndpS1NBbFBpVmNiaUFnWkhCc2VYSTZPbUZ5Y21GdVoyVW9jQzVoWkdwMWMzUXBYRzV6ZFdKelpYUXhJRHd0SUVkUE1TNWtaaUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hKUkN3Z1JHVnpZM0pwY0hScGIyNHNJRWRsYm1WU1lYUnBieXdnY0M1aFpHcDFjM1FwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dkeWIzVndJRDBnWENKSGNtOTFjQ0F4WENJcElDVStKVnh1SUNCa2NHeDVjam82WVhKeVlXNW5aU2h3TG1Ga2FuVnpkQ2xjYm5OMVluTmxkRElnUEMwZ1IwOHlMbVJtSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0VsRUxDQkVaWE5qY21sd2RHbHZiaXdnUjJWdVpWSmhkR2x2TENCd0xtRmthblZ6ZENrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCY0lrZHliM1Z3SURKY0lpa2dKVDRsWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0hBdVlXUnFkWE4wS1Z4dWMzVmljMlYwTXlBOExTQkhUek11WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGd2lSM0p2ZFhBZ00xd2lLU0FsUGlWY2JpQWdaSEJzZVhJNk9tRnljbUZ1WjJVb2NDNWhaR3AxYzNRcFhHNXpkV0p6WlhRMElEd3RJRWRQTkM1a1ppQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaEpSQ3dnUkdWelkzSnBjSFJwYjI0c0lFZGxibVZTWVhScGJ5d2djQzVoWkdwMWMzUXBJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdYQ0pIY205MWNDQTBYQ0lwSUNVK0pWeHVJQ0JrY0d4NWNqbzZZWEp5WVc1blpTaHdMbUZrYW5WemRDbGNibHh1YzNWaWMyVjBNQ1JIWlc1bFVtRjBhVzhnUEMwZ2MyRndjR3g1S0hOMGNuTndiR2wwS0hOMVluTmxkREFrUjJWdVpWSmhkR2x2TENCY0lpOWNJaWtzSUdaMWJtTjBhVzl1S0hncElHRnpMbTUxYldWeWFXTW9lRnN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSGhiTWwwcEtWeHVjM1ZpYzJWME1TUkhaVzVsVW1GMGFXOGdQQzBnYzJGd2NHeDVLSE4wY25Od2JHbDBLSE4xWW5ObGRERWtSMlZ1WlZKaGRHbHZMQ0JjSWk5Y0lpa3NJR1oxYm1OMGFXOXVLSGdwSUdGekxtNTFiV1Z5YVdNb2VGc3hYU2tnTHlCaGN5NXVkVzFsY21saktIaGJNbDBwS1Z4dWMzVmljMlYwTWlSSFpXNWxVbUYwYVc4Z1BDMGdjMkZ3Y0d4NUtITjBjbk53YkdsMEtITjFZbk5sZERJa1IyVnVaVkpoZEdsdkxDQmNJaTljSWlrc0lHWjFibU4wYVc5dUtIZ3BJR0Z6TG01MWJXVnlhV01vZUZzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hoYk1sMHBLVnh1YzNWaWMyVjBNeVJIWlc1bFVtRjBhVzhnUEMwZ2MyRndjR3g1S0hOMGNuTndiR2wwS0hOMVluTmxkRE1rUjJWdVpWSmhkR2x2TENCY0lpOWNJaWtzSUdaMWJtTjBhVzl1S0hncElHRnpMbTUxYldWeWFXTW9lRnN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSGhiTWwwcEtWeHVjM1ZpYzJWME5DUkhaVzVsVW1GMGFXOGdQQzBnYzJGd2NHeDVLSE4wY25Od2JHbDBLSE4xWW5ObGREUWtSMlZ1WlZKaGRHbHZMQ0JjSWk5Y0lpa3NJR1oxYm1OMGFXOXVLSGdwSUdGekxtNTFiV1Z5YVdNb2VGc3hYU2tnTHlCaGN5NXVkVzFsY21saktIaGJNbDBwS1Z4dVhHNUhUMnhwYzNRZ1BDMGdabUZqZEc5eUtHTW9YQ0pIVHpvd01EQTRNemd3WENJc0lGd2lSMDg2TURBd05qTTVOMXdpTENCY0lrZFBPakF3TXpRME56QmNJaXdnWENKSFR6b3dNREl5TmpFelhDSXNJRndpUjA4Nk1EQXhOakExTlZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpUjA4Nk1EQTJNVEV6T0Z3aUxDQmNJa2RQT2pBd05qQTFOakpjSWl3Z1hDSkhUem93TURBM016ZzVYQ0lzSUZ3aVIwODZNREEyTURRNE5Wd2lMQ0JjSWtkUE9qQXdORGcyTXpoY0lpd2dYQ0pIVHpvd01EUTFOalkwWENJcEtWeHVYRzVrWVhSaElEd3RJR0pwYm1SZmNtOTNjeWh6ZFdKelpYUXdMQ0J6ZFdKelpYUXhLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loSlJDQWxhVzRsSUVkUGJHbHpkQ2xjYmx4dVhHNWNibVZ0Y0hSNVgzSnZkeklnUEMwZ1pHRjBZUzVtY21GdFpTaGNiaUFnU1VRZ1BTQk9RU3dnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1RtOGdjM0JsWTJsbWFXTWdTVVJjYmlBZ1JHVnpZM0pwY0hScGIyNGdQU0JPUVN3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDTWdUbThnWkdWelkzSnBjSFJwYjI1Y2JpQWdSMlZ1WlZKaGRHbHZJRDBnVGtFc0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ01nVG04Z1oyVnVaU0J5WVhScGIxeHVJQ0J3TG1Ga2FuVnpkQ0E5SUU1QkxDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlCT2J5QndMbUZrYW5WemRDQjJZV3gxWlZ4dUlDQm5jbTkxY0NBOUlGd2lSM0p2ZFhBZ01sd2lJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ01nUjNKdmRYQWdkRzhnWVdSa0lHRnpJR1Z0Y0hSNUlHTnZiSFZ0Ymx4dUtWeHVYRzVsYlhCMGVWOXliM2N6SUR3dElHUmhkR0V1Wm5KaGJXVW9YRzRnSUVsRUlEMGdUa0VzSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklFNXZJSE53WldOcFptbGpJRWxFWEc0Z0lFUmxjMk55YVhCMGFXOXVJRDBnVGtFc0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpJRTV2SUdSbGMyTnlhWEIwYVc5dVhHNGdJRWRsYm1WU1lYUnBieUE5SUU1QkxDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUU1dklHZGxibVVnY21GMGFXOWNiaUFnY0M1aFpHcDFjM1FnUFNCT1FTd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1RtOGdjQzVoWkdwMWMzUWdkbUZzZFdWY2JpQWdaM0p2ZFhBZ1BTQmNJa2R5YjNWd0lETmNJaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUVkeWIzVndJSFJ2SUdGa1pDQmhjeUJsYlhCMGVTQmpiMngxYlc1Y2JpbGNibHh1Wlcxd2RIbGZjbTkzTkNBOExTQmtZWFJoTG1aeVlXMWxLRnh1SUNCSlJDQTlJRTVCTENBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5Qk9ieUJ6Y0dWamFXWnBZeUJKUkZ4dUlDQkVaWE5qY21sd2RHbHZiaUE5SUU1QkxDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJPYnlCa1pYTmpjbWx3ZEdsdmJseHVJQ0JIWlc1bFVtRjBhVzhnUFNCT1FTd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlCT2J5Qm5aVzVsSUhKaGRHbHZYRzRnSUhBdVlXUnFkWE4wSUQwZ1RrRXNJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklFNXZJSEF1WVdScWRYTjBJSFpoYkhWbFhHNGdJR2R5YjNWd0lEMGdYQ0pIY205MWNDQTBYQ0lnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlCSGNtOTFjQ0IwYnlCaFpHUWdZWE1nWlcxd2RIa2dZMjlzZFcxdVhHNHBYRzVjYmlNZ1FYQndaVzVrSUhSb1pTQmxiWEIwZVNCeWIzY2dkRzhnZVc5MWNpQmtZWFJoYzJWMFhHNWtZWFJoSUR3dElISmlhVzVrS0dSaGRHRXNJR1Z0Y0hSNVgzSnZkeklzSUdWdGNIUjVYM0p2ZHpNc0lHVnRjSFI1WDNKdmR6UXBYRzVrWlhOalQzSmtaWElnUEMwZ2MyOXlkQ2gxYm1seGRXVW9aR0YwWVNSRVpYTmpjbWx3ZEdsdmJpa3BXM0psZGloaktERXlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQTBMQ0ExTENBNUxDQXhNU3dnTVRBc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBeUxDQTJMQ0F6TENBeExDQTRMQ0EzS1NsZFhHNWtZWFJoSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvUkdWelkzSnBjSFJwYjI0Z0pXbHVKU0JrWlhOalQzSmtaWElwWEc1Y2JseHVaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmNtOTNkMmx6WlNncElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtIQldZV3gxWlV4dlp5QTlJRzFwYmlndGJHOW5NVEFvY0M1aFpHcDFjM1FwTENCd1ZtRnNkV1ZNYjJkTllYZ3BLVnh1Y0NBOExTQm5aM0JzYjNRb1pHRjBZU3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUdaaFkzUnZjaWhFWlhOamNtbHdkR2x2Yml3Z2JHVjJaV3h6SUQwZ1pHVnpZMDl5WkdWeUtTd2djMmw2WlNBOUlIQldZV3gxWlV4dlp5d2dabWxzYkNBOUlFZGxibVZTWVhScGJ5a3BJQ3NnWEc0Z0lHZGxiMjFmY0c5cGJuUW9jMmhoY0dVZ1BTQXlNU3dnSUNBZ0lDQWdJQ01nUlc1emRYSmxjeUJoSUhCdmFXNTBJSGRwZEdnZ1lXNGdiM1YwYkdsdVpWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUhOMGNtOXJaU0E5SURFcWNIUlViMDFOS1NBcklGeHVJQ0J6WTJGc1pWOXphWHBsWDJOdmJuUnBiblZ2ZFhNb2NtRnVaMlVnUFNCaktEQXVOU3dnTWlrcElDc2dJQ01nVTJWMElHMXBiaUJoYm1RZ2JXRjRJSEJ2YVc1MElITnBlbVZ6SUdobGNtVmNiaUFnYzJOaGJHVmZabWxzYkY5bmNtRmthV1Z1ZENoc2IzY2dQU0JjSW5kb2FYUmxYQ0lzSUdocFoyZ2dQU0JjSWlORFFqTXpNMEZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUd4cGJXbDBjeUE5SUdNb01Dd2dNU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiMjlpSUQwZ2MyTmhiR1Z6T2pwemNYVnBjMmdzSUNNZ1JHVm1hVzVsSUdkeVlXUnBaVzUwSUdOdmJHOXljMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZDFhV1JsSUQwZ1ozVnBaR1ZmWTI5c2IzSmlZWElvWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVhKM2FXUjBhQ0E5SURFdU5TODFMakE0TENBZ0l5QkJaR3AxYzNRZ2QybGtkR2dnYjJZZ2RHaGxJR052Ykc5eUlHSmhjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZ5YUdWcFoyaDBJRDBnTVRVdk5TNHdPQ0FnSUNNZ1FXUnFkWE4wSUdobGFXZG9kQ0J2WmlCMGFHVWdZMjlzYjNJZ1ltRnlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tWeHVJQ0FwSUNzZ1hHNGdJR3hoWW5Nb2VDQTlJRTVWVEV3c0lIa2dQU0JPVlV4TUtTQXJYRzRnSUhSb1pXMWxYMkozS0NrZ0t5QWdJeUJCY0hCc2VTQjBhR1Z0WlY5aWR5Qm1hWEp6ZEN3Z2MyOGdZM1Z6ZEc5dElIUm9aVzFsSUhObGRIUnBibWR6SUdOdmJXVWdZV1owWlhKY2JpQWdkR2hsYldVb1hHNGdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hDSjBjbUZ1YzNCaGNtVnVkRndpS1N3Z0lDTWdUM1psY25KcFpHVWdkR2hsYldWZlluY2djR0Z1Wld4Y2JpQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5eGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0FnSUNBZ0lDQWdJQ01nUlc1emRYSmxJSE5wZW1VZ2FYTWdjMlYwSUdadmNpQjRMV0Y0YVhNZ2RHVjRkRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMExua2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTENBZ0lDQWdJQ0FnSUNNZ1JXNXpkWEpsSUhOcGVtVWdhWE1nYzJWMElHWnZjaUI1TFdGNGFYTWdkR1Y0ZEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTEZ4dUlDQWdJQ0FnYkdsdVpXaGxhV2RvZENBOUlEQXVPU0FnSUNBZ0lDQWdJQ0FqSUVGc2JHOTNjeUIzY21Gd2NHbHVaeUJtYjNJZ2VTMWhlR2x6SUd4aFltVnNjeUIwYnlCbWFYUWdhVzUwYnlBeUlHeHBibVZ6WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdiR1ZuWlc1a0xuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5bGNiaUFnS1Z4dVhHNW1hV3hsVG1GdFpTQThMU0JvWlhKbEtHWnBaMFJwY2l3Z1hDSXVMbHdpTENCY0lrZFBYQ0lzSUZ3aVIwOWZaM0p2ZFhCelgzQndYQ0lwWEc1M2FXUjBhQ0E4TFNCd1lXNWxiRk5wZW1Vb01pNDJOU2txYlcxVWIwbHVZMmhjYm1obGFXZG9kQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNHlLU3B0YlZSdlNXNWphRnh1YzNabmJHbDBaU2h3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbkdPZmlnRGlyIDwtIGhlcmUoZmlnRGlyLCBcXC4uL0dPXFwpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuR08wLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjAsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbkdPMS5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5HTzIuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuR08zLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbkdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG4jIFxuIyBmd3JpdGUoR08wLmRmLCBoZXJlKFxcR09fUFBfZ3JvdXAwLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbiMgZndyaXRlKEdPMS5kZiwgaGVyZShcXEdPX1BQX2dyb3VwMS50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG4jIGZ3cml0ZShHTzIuZGYsIGhlcmUoXFxHT19QUF9ncm91cDIudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuIyBmd3JpdGUoR08zLmRmLCBoZXJlKFxcR09fUFBfZ3JvdXAzLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbiMgZndyaXRlKEdPNC5kZiwgaGVyZShcXEdPX1BQX2dyb3VwNC50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbnN1YnNldDAgPC0gR08wLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDBcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgMVxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQyIDwtIEdPMi5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAyXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDMgPC0gR08zLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDNcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgNFxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5cbnN1YnNldDAkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQwJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcbnN1YnNldDEkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQxJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcbnN1YnNldDIkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQyJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcbnN1YnNldDMkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQzJEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcbnN1YnNldDQkR2VuZVJhdGlvIDwtIHNhcHBseShzdHJzcGxpdChzdWJzZXQ0JEdlbmVSYXRpbywgXFwvXFwpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSlcblxuR09saXN0IDwtIGZhY3RvcihjKFxcR086MDAwODM4MFxcLCBcXEdPOjAwMDYzOTdcXCwgXFxHTzowMDM0NDcwXFwsIFxcR086MDAyMjYxM1xcLCBcXEdPOjAwMTYwNTVcXCxcbiAgICAgICAgICAgICAgICAgICBcXEdPOjAwNjExMzhcXCwgXFxHTzowMDYwNTYyXFwsIFxcR086MDAwNzM4OVxcLCBcXEdPOjAwNjA0ODVcXCwgXFxHTzowMDQ4NjM4XFwsIFxcR086MDA0NTY2NFxcKSlcblxuZGF0YSA8LSBiaW5kX3Jvd3Moc3Vic2V0MCwgc3Vic2V0MSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpXG5cblxuXG5lbXB0eV9yb3cyIDwtIGRhdGEuZnJhbWUoXG4gIElEID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHNwZWNpZmljIElEXG4gIERlc2NyaXB0aW9uID0gTkEsICAgICAgICAgICAgICAgICAgICAjIE5vIGRlc2NyaXB0aW9uXG4gIEdlbmVSYXRpbyA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIGdlbmUgcmF0aW9cbiAgcC5hZGp1c3QgPSBOQSwgICAgICAgICAgICAgICAgICAgICAgICMgTm8gcC5hZGp1c3QgdmFsdWVcbiAgZ3JvdXAgPSBcXEdyb3VwIDJcXCAgICAgICAgICAgICAgICAgICAjIEdyb3VwIHRvIGFkZCBhcyBlbXB0eSBjb2x1bW5cbilcblxuZW1wdHlfcm93MyA8LSBkYXRhLmZyYW1lKFxuICBJRCA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBzcGVjaWZpYyBJRFxuICBEZXNjcmlwdGlvbiA9IE5BLCAgICAgICAgICAgICAgICAgICAgIyBObyBkZXNjcmlwdGlvblxuICBHZW5lUmF0aW8gPSBOQSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBnZW5lIHJhdGlvXG4gIHAuYWRqdXN0ID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHAuYWRqdXN0IHZhbHVlXG4gIGdyb3VwID0gXFxHcm91cCAzXFwgICAgICAgICAgICAgICAgICAgIyBHcm91cCB0byBhZGQgYXMgZW1wdHkgY29sdW1uXG4pXG5cbmVtcHR5X3JvdzQgPC0gZGF0YS5mcmFtZShcbiAgSUQgPSBOQSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gc3BlY2lmaWMgSURcbiAgRGVzY3JpcHRpb24gPSBOQSwgICAgICAgICAgICAgICAgICAgICMgTm8gZGVzY3JpcHRpb25cbiAgR2VuZVJhdGlvID0gTkEsICAgICAgICAgICAgICAgICAgICAgICMgTm8gZ2VuZSByYXRpb1xuICBwLmFkanVzdCA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAgIyBObyBwLmFkanVzdCB2YWx1ZVxuICBncm91cCA9IFxcR3JvdXAgNFxcICAgICAgICAgICAgICAgICAgICMgR3JvdXAgdG8gYWRkIGFzIGVtcHR5IGNvbHVtblxuKVxuXG4jIEFwcGVuZCB0aGUgZW1wdHkgcm93IHRvIHlvdXIgZGF0YXNldFxuZGF0YSA8LSByYmluZChkYXRhLCBlbXB0eV9yb3cyLCBlbXB0eV9yb3czLCBlbXB0eV9yb3c0KVxuZGVzY09yZGVyIDwtIHNvcnQodW5pcXVlKGRhdGEkRGVzY3JpcHRpb24pKVtyZXYoYygxMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgNSwgOSwgMTEsIDEwLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgNiwgMywgMSwgOCwgNykpXVxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKERlc2NyaXB0aW9uICVpbiUgZGVzY09yZGVyKVxuXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShwVmFsdWVMb2cgPSBtaW4oLWxvZzEwKHAuYWRqdXN0KSwgcFZhbHVlTG9nTWF4KSlcbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBmYWN0b3IoRGVzY3JpcHRpb24sIGxldmVscyA9IGRlc2NPcmRlciksIHNpemUgPSBwVmFsdWVMb2csIGZpbGwgPSBHZW5lUmF0aW8pKSArIFxuICBnZW9tX3BvaW50KHNoYXBlID0gMjEsICAgICAgICAjIEVuc3VyZXMgYSBwb2ludCB3aXRoIGFuIG91dGxpbmVcbiAgICAgICAgICAgICBzdHJva2UgPSAxKnB0VG9NTSkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjUsIDIpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlXG4gIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gXFx3aGl0ZVxcLCBoaWdoID0gXFwjQ0IzMzNBXFwsXG4gICAgICAgICAgICAgICAgICAgICAgIyBsaW1pdHMgPSBjKDAsIDEpLFxuICAgICAgICAgICAgICAgICAgICAgIG9vYiA9IHNjYWxlczo6c3F1aXNoLCAjIERlZmluZSBncmFkaWVudCBjb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgKSArIFxuICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuICB0aGVtZV9idygpICsgICMgQXBwbHkgdGhlbWVfYncgZmlyc3QsIHNvIGN1c3RvbSB0aGVtZSBzZXR0aW5ncyBjb21lIGFmdGVyXG4gIHRoZW1lKFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksICAjIE92ZXJyaWRlIHRoZW1lX2J3IHBhbmVsXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeC1heGlzIHRleHRcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICApLFxuICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeS1heGlzIHRleHRcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIGxpbmVoZWlnaHQgPSAwLjkgICAgICAgICAgIyBBbGxvd3Mgd3JhcHBpbmcgZm9yIHktYXhpcyBsYWJlbHMgdG8gZml0IGludG8gMiBsaW5lc1xuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc19wcFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDIuNjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
GOfigDir <- here(figDir, \../GO\)

#####################
GO0.df <- as.data.frame(enrichGO(gene = psOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO1.df <- as.data.frame(enrichGO(gene = psOver1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO2.df <- as.data.frame(enrichGO(gene = psOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO3.df <- as.data.frame(enrichGO(gene = psOver3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO4.df <- as.data.frame(enrichGO(gene = psOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
# 
# fwrite(GO0.df, here(\GO_PP_group0.tsv\), sep = \\t\)
# fwrite(GO1.df, here(\GO_PP_group1.tsv\), sep = \\t\)
# fwrite(GO2.df, here(\GO_PP_group2.tsv\), sep = \\t\)
# fwrite(GO3.df, here(\GO_PP_group3.tsv\), sep = \\t\)
# fwrite(GO4.df, here(\GO_PP_group4.tsv\), sep = \\t\)

subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 0\) %>%
  dplyr::arrange(p.adjust)
subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 1\) %>%
  dplyr::arrange(p.adjust)
subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 2\) %>%
  dplyr::arrange(p.adjust)
subset3 <- GO3.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 3\) %>%
  dplyr::arrange(p.adjust)
subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 4\) %>%
  dplyr::arrange(p.adjust)

subset0$GeneRatio <- sapply(strsplit(subset0$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset1$GeneRatio <- sapply(strsplit(subset1$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset2$GeneRatio <- sapply(strsplit(subset2$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset3$GeneRatio <- sapply(strsplit(subset3$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset4$GeneRatio <- sapply(strsplit(subset4$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))

GOlist <- factor(c(\GO:0008380\, \GO:0006397\, \GO:0034470\, \GO:0022613\, \GO:0016055\,
                   \GO:0061138\, \GO:0060562\, \GO:0007389\, \GO:0060485\, \GO:0048638\, \GO:0045664\))

data <- bind_rows(subset0, subset1) %>%
  dplyr::filter(ID %in% GOlist)



empty_row2 <- data.frame(
  ID = NA,                             # No specific ID
  Description = NA,                    # No description
  GeneRatio = NA,                      # No gene ratio
  p.adjust = NA,                       # No p.adjust value
  group = \Group 2\                   # Group to add as empty column
)

empty_row3 <- data.frame(
  ID = NA,                             # No specific ID
  Description = NA,                    # No description
  GeneRatio = NA,                      # No gene ratio
  p.adjust = NA,                       # No p.adjust value
  group = \Group 3\                   # Group to add as empty column
)

empty_row4 <- data.frame(
  ID = NA,                             # No specific ID
  Description = NA,                    # No description
  GeneRatio = NA,                      # No gene ratio
  p.adjust = NA,                       # No p.adjust value
  group = \Group 4\                   # Group to add as empty column
)

# Append the empty row to your dataset
data <- rbind(data, empty_row2, empty_row3, empty_row4)
descOrder <- sort(unique(data$Description))[rev(c(12,
                                                  4, 5, 9, 11, 10, 
                                                  2, 6, 3, 1, 8, 7))]
data <- data %>% dplyr::filter(Description %in% descOrder)


data <- data %>% dplyr::rowwise() %>% dplyr::mutate(pValueLog = min(-log10(p.adjust), pValueLogMax))
p <- ggplot(data, aes(x = group, y = factor(Description, levels = descOrder), size = pValueLog, fill = GeneRatio)) + 
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM) + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = \white\, high = \#CB333A\,
                      # limits = c(0, 1),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL) +
  theme_bw() +  # Apply theme_bw first, so custom theme settings come after
  theme(
    panel.background = element_rect(fill = \transparent\),  # Override theme_bw panel
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      size = fontSizeS,         # Ensure size is set for x-axis text
      family = fontType,
      color = \#000000\,
    ),
    axis.text.y = element_text(
      size = fontSizeS,         # Ensure size is set for y-axis text
      family = fontType,
      color = \#000000\,
      lineheight = 0.9          # Allows wrapping for y-axis labels to fit into 2 lines
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- here(figDir, \..\, \GO\, \GO_groups_pp\)
width <- panelSize(2.65)*mmToInch
height <- panelSize(1.2)*mmToInch
svglite(paste0(fileName, \.svg\), height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVIwOW1hV2RFYVhJZ1BDMGdhR1Z5WlNobWFXZEVhWElzSUZ4Y0xpNHZSMDljWENsY2JseHVJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qWEc1SFR6QXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hsYm5KcFkyaEhUeWhuWlc1bElEMGdjSE5QZG1WeU1Dd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjTENCeVpXRmtZV0pzWlNBOUlGUlNWVVVwS1Z4dVIwOHhMbVJtSUR3dElHRnpMbVJoZEdFdVpuSmhiV1VvWlc1eWFXTm9SMDhvWjJWdVpTQTlJSEJ6VDNabGNqRXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hGeEZUbE5GVFVKTVhGd3NJRzl1ZENBOUlGeGNRbEJjWEN3Z2NtVmhaR0ZpYkdVZ1BTQlVVbFZGS1NsY2JrZFBNaTVrWmlBOExTQmhjeTVrWVhSaExtWnlZVzFsS0dWdWNtbGphRWRQS0dkbGJtVWdQU0J3YzA5MlpYSXlMQ0JQY21kRVlpQTlJRzl5Wnk1TmJTNWxaeTVrWWl3Z2EyVjVWSGx3WlNBOUlGeGNSVTVUUlUxQ1RGeGNMQ0J2Ym5RZ1BTQmNYRUpRWEZ3c0lISmxZV1JoWW14bElEMGdWRkpWUlNrcFhHNUhUek11WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNobGJuSnBZMmhIVHloblpXNWxJRDBnY0hOUGRtVnlNeXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0xDQnlaV0ZrWVdKc1pTQTlJRlJTVlVVcEtWeHVSMDgwTG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCelQzWmxjalFzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYRnhGVGxORlRVSk1YRndzSUc5dWRDQTlJRnhjUWxCY1hDd2djbVZoWkdGaWJHVWdQU0JVVWxWRktTbGNiaU1nWEc0aklHWjNjbWwwWlNoSFR6QXVaR1lzSUdobGNtVW9YRnhIVDE5UVVGOW5jbTkxY0RBdWRITjJYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1SXlCbWQzSnBkR1VvUjA4eExtUm1MQ0JvWlhKbEtGeGNSMDlmVUZCZlozSnZkWEF4TG5SemRseGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDbGNiaU1nWm5keWFYUmxLRWRQTWk1a1ppd2dhR1Z5WlNoY1hFZFBYMUJRWDJkeWIzVndNaTUwYzNaY1hDa3NJSE5sY0NBOUlGeGNYRngwWEZ3cFhHNGpJR1ozY21sMFpTaEhUek11WkdZc0lHaGxjbVVvWEZ4SFQxOVFVRjluY205MWNETXVkSE4yWEZ3cExDQnpaWEFnUFNCY1hGeGNkRnhjS1Z4dUl5Qm1kM0pwZEdVb1IwODBMbVJtTENCb1pYSmxLRnhjUjA5ZlVGQmZaM0p2ZFhBMExuUnpkbHhjS1N3Z2MyVndJRDBnWEZ4Y1hIUmNYQ2xjYmx4dWMzVmljMlYwTUNBOExTQkhUekF1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGeGNSM0p2ZFhBZ01GeGNLU0FsUGlWY2JpQWdaSEJzZVhJNk9tRnljbUZ1WjJVb2NDNWhaR3AxYzNRcFhHNXpkV0p6WlhReElEd3RJRWRQTVM1a1ppQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaEpSQ3dnUkdWelkzSnBjSFJwYjI0c0lFZGxibVZTWVhScGJ5d2djQzVoWkdwMWMzUXBJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdYRnhIY205MWNDQXhYRndwSUNVK0pWeHVJQ0JrY0d4NWNqbzZZWEp5WVc1blpTaHdMbUZrYW5WemRDbGNibk4xWW5ObGRESWdQQzBnUjA4eUxtUm1JQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLRWxFTENCRVpYTmpjbWx3ZEdsdmJpd2dSMlZ1WlZKaGRHbHZMQ0J3TG1Ga2FuVnpkQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JjWEVkeWIzVndJREpjWENrZ0pUNGxYRzRnSUdSd2JIbHlPanBoY25KaGJtZGxLSEF1WVdScWRYTjBLVnh1YzNWaWMyVjBNeUE4TFNCSFR6TXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ4Y1IzSnZkWEFnTTF4Y0tTQWxQaVZjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvY0M1aFpHcDFjM1FwWEc1emRXSnpaWFEwSUR3dElFZFBOQzVrWmlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoSlJDd2dSR1Z6WTNKcGNIUnBiMjRzSUVkbGJtVlNZWFJwYnl3Z2NDNWhaR3AxYzNRcElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHZHliM1Z3SUQwZ1hGeEhjbTkxY0NBMFhGd3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNllYSnlZVzVuWlNod0xtRmthblZ6ZENsY2JseHVjM1ZpYzJWME1DUkhaVzVsVW1GMGFXOGdQQzBnYzJGd2NHeDVLSE4wY25Od2JHbDBLSE4xWW5ObGREQWtSMlZ1WlZKaGRHbHZMQ0JjWEM5Y1hDa3NJR1oxYm1OMGFXOXVLSGdwSUdGekxtNTFiV1Z5YVdNb2VGc3hYU2tnTHlCaGN5NXVkVzFsY21saktIaGJNbDBwS1Z4dWMzVmljMlYwTVNSSFpXNWxVbUYwYVc4Z1BDMGdjMkZ3Y0d4NUtITjBjbk53YkdsMEtITjFZbk5sZERFa1IyVnVaVkpoZEdsdkxDQmNYQzljWENrc0lHWjFibU4wYVc5dUtIZ3BJR0Z6TG01MWJXVnlhV01vZUZzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hoYk1sMHBLVnh1YzNWaWMyVjBNaVJIWlc1bFVtRjBhVzhnUEMwZ2MyRndjR3g1S0hOMGNuTndiR2wwS0hOMVluTmxkRElrUjJWdVpWSmhkR2x2TENCY1hDOWNYQ2tzSUdaMWJtTjBhVzl1S0hncElHRnpMbTUxYldWeWFXTW9lRnN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSGhiTWwwcEtWeHVjM1ZpYzJWME15UkhaVzVsVW1GMGFXOGdQQzBnYzJGd2NHeDVLSE4wY25Od2JHbDBLSE4xWW5ObGRETWtSMlZ1WlZKaGRHbHZMQ0JjWEM5Y1hDa3NJR1oxYm1OMGFXOXVLSGdwSUdGekxtNTFiV1Z5YVdNb2VGc3hYU2tnTHlCaGN5NXVkVzFsY21saktIaGJNbDBwS1Z4dWMzVmljMlYwTkNSSFpXNWxVbUYwYVc4Z1BDMGdjMkZ3Y0d4NUtITjBjbk53YkdsMEtITjFZbk5sZERRa1IyVnVaVkpoZEdsdkxDQmNYQzljWENrc0lHWjFibU4wYVc5dUtIZ3BJR0Z6TG01MWJXVnlhV01vZUZzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hoYk1sMHBLVnh1WEc1SFQyeHBjM1FnUEMwZ1ptRmpkRzl5S0dNb1hGeEhUem93TURBNE16Z3dYRndzSUZ4Y1IwODZNREF3TmpNNU4xeGNMQ0JjWEVkUE9qQXdNelEwTnpCY1hDd2dYRnhIVHpvd01ESXlOakV6WEZ3c0lGeGNSMDg2TURBeE5qQTFOVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNSMDg2TURBMk1URXpPRnhjTENCY1hFZFBPakF3TmpBMU5qSmNYQ3dnWEZ4SFR6b3dNREEzTXpnNVhGd3NJRnhjUjA4Nk1EQTJNRFE0TlZ4Y0xDQmNYRWRQT2pBd05EZzJNemhjWEN3Z1hGeEhUem93TURRMU5qWTBYRndwS1Z4dVhHNWtZWFJoSUR3dElHSnBibVJmY205M2N5aHpkV0p6WlhRd0xDQnpkV0p6WlhReEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWhKUkNBbGFXNGxJRWRQYkdsemRDbGNibHh1WEc1Y2JtVnRjSFI1WDNKdmR6SWdQQzBnWkdGMFlTNW1jbUZ0WlNoY2JpQWdTVVFnUFNCT1FTd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ01nVG04Z2MzQmxZMmxtYVdNZ1NVUmNiaUFnUkdWelkzSnBjSFJwYjI0Z1BTQk9RU3dnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1RtOGdaR1Z6WTNKcGNIUnBiMjVjYmlBZ1IyVnVaVkpoZEdsdklEMGdUa0VzSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDTWdUbThnWjJWdVpTQnlZWFJwYjF4dUlDQndMbUZrYW5WemRDQTlJRTVCTENBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJPYnlCd0xtRmthblZ6ZENCMllXeDFaVnh1SUNCbmNtOTFjQ0E5SUZ4Y1IzSnZkWEFnTWx4Y0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDTWdSM0p2ZFhBZ2RHOGdZV1JrSUdGeklHVnRjSFI1SUdOdmJIVnRibHh1S1Z4dVhHNWxiWEIwZVY5eWIzY3pJRHd0SUdSaGRHRXVabkpoYldVb1hHNGdJRWxFSUQwZ1RrRXNJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUU1dklITndaV05wWm1saklFbEVYRzRnSUVSbGMyTnlhWEIwYVc5dUlEMGdUa0VzSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklFNXZJR1JsYzJOeWFYQjBhVzl1WEc0Z0lFZGxibVZTWVhScGJ5QTlJRTVCTENBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpJRTV2SUdkbGJtVWdjbUYwYVc5Y2JpQWdjQzVoWkdwMWMzUWdQU0JPUVN3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ01nVG04Z2NDNWhaR3AxYzNRZ2RtRnNkV1ZjYmlBZ1ozSnZkWEFnUFNCY1hFZHliM1Z3SUROY1hDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpJRWR5YjNWd0lIUnZJR0ZrWkNCaGN5QmxiWEIwZVNCamIyeDFiVzVjYmlsY2JseHVaVzF3ZEhsZmNtOTNOQ0E4TFNCa1lYUmhMbVp5WVcxbEtGeHVJQ0JKUkNBOUlFNUJMQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlCT2J5QnpjR1ZqYVdacFl5QkpSRnh1SUNCRVpYTmpjbWx3ZEdsdmJpQTlJRTVCTENBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5Qk9ieUJrWlhOamNtbHdkR2x2Ymx4dUlDQkhaVzVsVW1GMGFXOGdQU0JPUVN3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJPYnlCblpXNWxJSEpoZEdsdlhHNGdJSEF1WVdScWRYTjBJRDBnVGtFc0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUU1dklIQXVZV1JxZFhOMElIWmhiSFZsWEc0Z0lHZHliM1Z3SUQwZ1hGeEhjbTkxY0NBMFhGd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJIY205MWNDQjBieUJoWkdRZ1lYTWdaVzF3ZEhrZ1kyOXNkVzF1WEc0cFhHNWNiaU1nUVhCd1pXNWtJSFJvWlNCbGJYQjBlU0J5YjNjZ2RHOGdlVzkxY2lCa1lYUmhjMlYwWEc1a1lYUmhJRHd0SUhKaWFXNWtLR1JoZEdFc0lHVnRjSFI1WDNKdmR6SXNJR1Z0Y0hSNVgzSnZkek1zSUdWdGNIUjVYM0p2ZHpRcFhHNWtaWE5qVDNKa1pYSWdQQzBnYzI5eWRDaDFibWx4ZFdVb1pHRjBZU1JFWlhOamNtbHdkR2x2YmlrcFczSmxkaWhqS0RFeUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBMExDQTFMQ0E1TENBeE1Td2dNVEFzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F5TENBMkxDQXpMQ0F4TENBNExDQTNLU2xkWEc1a1lYUmhJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9SR1Z6WTNKcGNIUnBiMjRnSldsdUpTQmtaWE5qVDNKa1pYSXBYRzVjYmx4dVpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Y205M2QybHpaU2dwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0hCV1lXeDFaVXh2WnlBOUlHMXBiaWd0Ykc5bk1UQW9jQzVoWkdwMWMzUXBMQ0J3Vm1Gc2RXVk1iMmROWVhncEtWeHVjQ0E4TFNCblozQnNiM1FvWkdGMFlTd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJR1poWTNSdmNpaEVaWE5qY21sd2RHbHZiaXdnYkdWMlpXeHpJRDBnWkdWelkwOXlaR1Z5S1N3Z2MybDZaU0E5SUhCV1lXeDFaVXh2Wnl3Z1ptbHNiQ0E5SUVkbGJtVlNZWFJwYnlrcElDc2dYRzRnSUdkbGIyMWZjRzlwYm5Rb2MyaGhjR1VnUFNBeU1Td2dJQ0FnSUNBZ0lDTWdSVzV6ZFhKbGN5QmhJSEJ2YVc1MElIZHBkR2dnWVc0Z2IzVjBiR2x1WlZ4dUlDQWdJQ0FnSUNBZ0lDQWdJSE4wY205clpTQTlJREVxY0hSVWIwMU5LU0FySUZ4dUlDQnpZMkZzWlY5emFYcGxYMk52Ym5ScGJuVnZkWE1vY21GdVoyVWdQU0JqS0RBdU5Td2dNaWtwSUNzZ0lDTWdVMlYwSUcxcGJpQmhibVFnYldGNElIQnZhVzUwSUhOcGVtVnpJR2hsY21WY2JpQWdjMk5oYkdWZlptbHNiRjluY21Ga2FXVnVkQ2hzYjNjZ1BTQmNYSGRvYVhSbFhGd3NJR2hwWjJnZ1BTQmNYQ05EUWpNek0wRmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpJR3hwYldsMGN5QTlJR01vTUN3Z01Ta3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IyOWlJRDBnYzJOaGJHVnpPanB6Y1hWcGMyZ3NJQ01nUkdWbWFXNWxJR2R5WVdScFpXNTBJR052Ykc5eWMxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkMWFXUmxJRDBnWjNWcFpHVmZZMjlzYjNKaVlYSW9YRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZWEozYVdSMGFDQTlJREV1TlM4MUxqQTRMQ0FnSXlCQlpHcDFjM1FnZDJsa2RHZ2diMllnZEdobElHTnZiRzl5SUdKaGNseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRnlhR1ZwWjJoMElEMGdNVFV2TlM0d09DQWdJQ01nUVdScWRYTjBJR2hsYVdkb2RDQnZaaUIwYUdVZ1kyOXNiM0lnWW1GeVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS1Z4dUlDQXBJQ3NnWEc0Z0lHeGhZbk1vZUNBOUlFNVZURXdzSUhrZ1BTQk9WVXhNS1NBclhHNGdJSFJvWlcxbFgySjNLQ2tnS3lBZ0l5QkJjSEJzZVNCMGFHVnRaVjlpZHlCbWFYSnpkQ3dnYzI4Z1kzVnpkRzl0SUhSb1pXMWxJSE5sZEhScGJtZHpJR052YldVZ1lXWjBaWEpjYmlBZ2RHaGxiV1VvWEc0Z0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWEZ4MGNtRnVjM0JoY21WdWRGeGNLU3dnSUNNZ1QzWmxjbkpwWkdVZ2RHaGxiV1ZmWW5jZ2NHRnVaV3hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExDQWdJQ0FnSUNBZ0lDTWdSVzV6ZFhKbElITnBlbVVnYVhNZ2MyVjBJR1p2Y2lCNExXRjRhWE1nZEdWNGRGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwTG5rZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0FnSUNBZ0lDQWdJQ01nUlc1emRYSmxJSE5wZW1VZ2FYTWdjMlYwSUdadmNpQjVMV0Y0YVhNZ2RHVjRkRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMRnh1SUNBZ0lDQWdiR2x1WldobGFXZG9kQ0E5SURBdU9TQWdJQ0FnSUNBZ0lDQWpJRUZzYkc5M2N5QjNjbUZ3Y0dsdVp5Qm1iM0lnZVMxaGVHbHpJR3hoWW1Wc2N5QjBieUJtYVhRZ2FXNTBieUF5SUd4cGJtVnpYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJwWTJ0eklEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlsY2JpQWdLVnh1WEc1bWFXeGxUbUZ0WlNBOExTQm9aWEpsS0dacFowUnBjaXdnWEZ3dUxseGNMQ0JjWEVkUFhGd3NJRnhjUjA5ZlozSnZkWEJ6WDNCd1hGd3BYRzUzYVdSMGFDQThMU0J3WVc1bGJGTnBlbVVvTWk0Mk5Ta3FiVzFVYjBsdVkyaGNibWhsYVdkb2RDQThMU0J3WVc1bGJGTnBlbVVvTVM0eUtTcHRiVlJ2U1c1amFGeHVjM1puYkdsMFpTaHdZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG5HT2ZpZ0RpciA8LSBoZXJlKGZpZ0RpciwgXFwuLi9HT1xcKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyNcbkdPMC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIwLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5HTzEuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMSwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbkdPMy5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIzLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5HTzQuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyNCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuIyBcbiMgZndyaXRlKEdPMC5kZiwgaGVyZShcXEdPX1BQX2dyb3VwMC50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG4jIGZ3cml0ZShHTzEuZGYsIGhlcmUoXFxHT19QUF9ncm91cDEudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuIyBmd3JpdGUoR08yLmRmLCBoZXJlKFxcR09fUFBfZ3JvdXAyLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbiMgZndyaXRlKEdPMy5kZiwgaGVyZShcXEdPX1BQX2dyb3VwMy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG4jIGZ3cml0ZShHTzQuZGYsIGhlcmUoXFxHT19QUF9ncm91cDQudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5zdWJzZXQwIDwtIEdPMC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAwXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDEgPC0gR08xLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDFcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgMlxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQzIDwtIEdPMy5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAzXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDQgPC0gR080LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDRcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuXG5zdWJzZXQwJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MCRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQxJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MSRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQyJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MiRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQzJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MyRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5zdWJzZXQ0JEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0NCRHZW5lUmF0aW8sIFxcL1xcKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4WzFdKSAvIGFzLm51bWVyaWMoeFsyXSkpXG5cbkdPbGlzdCA8LSBmYWN0b3IoYyhcXEdPOjAwMDgzODBcXCwgXFxHTzowMDA2Mzk3XFwsIFxcR086MDAzNDQ3MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDE2MDU1XFwsXG4gICAgICAgICAgICAgICAgICAgXFxHTzowMDYxMTM4XFwsIFxcR086MDA2MDU2MlxcLCBcXEdPOjAwMDczODlcXCwgXFxHTzowMDYwNDg1XFwsIFxcR086MDA0ODYzOFxcLCBcXEdPOjAwNDU2NjRcXCkpXG5cbmRhdGEgPC0gYmluZF9yb3dzKHN1YnNldDAsIHN1YnNldDEpICU+JVxuICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuXG5cblxuZW1wdHlfcm93MiA8LSBkYXRhLmZyYW1lKFxuICBJRCA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBzcGVjaWZpYyBJRFxuICBEZXNjcmlwdGlvbiA9IE5BLCAgICAgICAgICAgICAgICAgICAgIyBObyBkZXNjcmlwdGlvblxuICBHZW5lUmF0aW8gPSBOQSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBnZW5lIHJhdGlvXG4gIHAuYWRqdXN0ID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHAuYWRqdXN0IHZhbHVlXG4gIGdyb3VwID0gXFxHcm91cCAyXFwgICAgICAgICAgICAgICAgICAgIyBHcm91cCB0byBhZGQgYXMgZW1wdHkgY29sdW1uXG4pXG5cbmVtcHR5X3JvdzMgPC0gZGF0YS5mcmFtZShcbiAgSUQgPSBOQSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gc3BlY2lmaWMgSURcbiAgRGVzY3JpcHRpb24gPSBOQSwgICAgICAgICAgICAgICAgICAgICMgTm8gZGVzY3JpcHRpb25cbiAgR2VuZVJhdGlvID0gTkEsICAgICAgICAgICAgICAgICAgICAgICMgTm8gZ2VuZSByYXRpb1xuICBwLmFkanVzdCA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAgIyBObyBwLmFkanVzdCB2YWx1ZVxuICBncm91cCA9IFxcR3JvdXAgM1xcICAgICAgICAgICAgICAgICAgICMgR3JvdXAgdG8gYWRkIGFzIGVtcHR5IGNvbHVtblxuKVxuXG5lbXB0eV9yb3c0IDwtIGRhdGEuZnJhbWUoXG4gIElEID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHNwZWNpZmljIElEXG4gIERlc2NyaXB0aW9uID0gTkEsICAgICAgICAgICAgICAgICAgICAjIE5vIGRlc2NyaXB0aW9uXG4gIEdlbmVSYXRpbyA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIGdlbmUgcmF0aW9cbiAgcC5hZGp1c3QgPSBOQSwgICAgICAgICAgICAgICAgICAgICAgICMgTm8gcC5hZGp1c3QgdmFsdWVcbiAgZ3JvdXAgPSBcXEdyb3VwIDRcXCAgICAgICAgICAgICAgICAgICAjIEdyb3VwIHRvIGFkZCBhcyBlbXB0eSBjb2x1bW5cbilcblxuIyBBcHBlbmQgdGhlIGVtcHR5IHJvdyB0byB5b3VyIGRhdGFzZXRcbmRhdGEgPC0gcmJpbmQoZGF0YSwgZW1wdHlfcm93MiwgZW1wdHlfcm93MywgZW1wdHlfcm93NClcbmRlc2NPcmRlciA8LSBzb3J0KHVuaXF1ZShkYXRhJERlc2NyaXB0aW9uKSlbcmV2KGMoMTIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDUsIDksIDExLCAxMCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDYsIDMsIDEsIDgsIDcpKV1cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihEZXNjcmlwdGlvbiAlaW4lIGRlc2NPcmRlcilcblxuXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUocFZhbHVlTG9nID0gbWluKC1sb2cxMChwLmFkanVzdCksIHBWYWx1ZUxvZ01heCkpXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gZmFjdG9yKERlc2NyaXB0aW9uLCBsZXZlbHMgPSBkZXNjT3JkZXIpLCBzaXplID0gcFZhbHVlTG9nLCBmaWxsID0gR2VuZVJhdGlvKSkgKyBcbiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lXG4gICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0pICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9IFxcd2hpdGVcXCwgaGlnaCA9IFxcI0NCMzMzQVxcLFxuICAgICAgICAgICAgICAgICAgICAgICMgbGltaXRzID0gYygwLCAxKSxcbiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiAgdGhlbWVfYncoKSArICAjIEFwcGx5IHRoZW1lX2J3IGZpcnN0LCBzbyBjdXN0b20gdGhlbWUgc2V0dGluZ3MgY29tZSBhZnRlclxuICB0aGVtZShcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLCAgIyBPdmVycmlkZSB0aGVtZV9idyBwYW5lbFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsICAgICAgICAgIyBFbnN1cmUgc2l6ZSBpcyBzZXQgZm9yIHgtYXhpcyB0ZXh0XG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgKSxcbiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsICAgICAgICAgIyBFbnN1cmUgc2l6ZSBpcyBzZXQgZm9yIHktYXhpcyB0ZXh0XG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBsaW5laGVpZ2h0ID0gMC45ICAgICAgICAgICMgQWxsb3dzIHdyYXBwaW5nIGZvciB5LWF4aXMgbGFiZWxzIHRvIGZpdCBpbnRvIDIgbGluZXNcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXC4uXFwsIFxcR09cXCwgXFxHT19ncm91cHNfcHBcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgyLjY1KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG5zdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuR09maWdEaXIgPC0gaGVyZShmaWdEaXIsIFxcLi4vR09cXClcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5HTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbkdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwsIHJlYWRhYmxlID0gVFJVRSkpXG5HTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcLCByZWFkYWJsZSA9IFRSVUUpKVxuR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCwgcmVhZGFibGUgPSBUUlVFKSlcbiMgXG4jIGZ3cml0ZShHTzAuZGYsIGhlcmUoXFxHT19QUF9ncm91cDAudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuIyBmd3JpdGUoR08xLmRmLCBoZXJlKFxcR09fUFBfZ3JvdXAxLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcbiMgZndyaXRlKEdPMi5kZiwgaGVyZShcXEdPX1BQX2dyb3VwMi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG4jIGZ3cml0ZShHTzMuZGYsIGhlcmUoXFxHT19QUF9ncm91cDMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuIyBmd3JpdGUoR080LmRmLCBoZXJlKFxcR09fUFBfZ3JvdXA0LnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgMFxcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQxIDwtIEdPMS5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCAxXFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcbnN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEdyb3VwIDJcXCkgJT4lXG4gIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KVxuc3Vic2V0MyA8LSBHTzMuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcR3JvdXAgM1xcKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpXG5zdWJzZXQ0IDwtIEdPNC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHcm91cCA0XFwpICU+JVxuICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdClcblxuc3Vic2V0MCRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDAkR2VuZVJhdGlvLCBcXC9cXCksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKVxuc3Vic2V0MSRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDEkR2VuZVJhdGlvLCBcXC9cXCksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKVxuc3Vic2V0MiRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDIkR2VuZVJhdGlvLCBcXC9cXCksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKVxuc3Vic2V0MyRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDMkR2VuZVJhdGlvLCBcXC9cXCksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKVxuc3Vic2V0NCRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDQkR2VuZVJhdGlvLCBcXC9cXCksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKVxuXG5HT2xpc3QgPC0gZmFjdG9yKGMoXFxHTzowMDA4MzgwXFwsIFxcR086MDAwNjM5N1xcLCBcXEdPOjAwMzQ0NzBcXCwgXFxHTzowMDIyNjEzXFwsIFxcR086MDAxNjA1NVxcLFxuICAgICAgICAgICAgICAgICAgIFxcR086MDA2MTEzOFxcLCBcXEdPOjAwNjA1NjJcXCwgXFxHTzowMDA3Mzg5XFwsIFxcR086MDA2MDQ4NVxcLCBcXEdPOjAwNDg2MzhcXCwgXFxHTzowMDQ1NjY0XFwpKVxuXG5kYXRhIDwtIGJpbmRfcm93cyhzdWJzZXQwLCBzdWJzZXQxKSAlPiVcbiAgZHBseXI6OmZpbHRlcihJRCAlaW4lIEdPbGlzdClcblxuXG5cbmVtcHR5X3JvdzIgPC0gZGF0YS5mcmFtZShcbiAgSUQgPSBOQSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gc3BlY2lmaWMgSURcbiAgRGVzY3JpcHRpb24gPSBOQSwgICAgICAgICAgICAgICAgICAgICMgTm8gZGVzY3JpcHRpb25cbiAgR2VuZVJhdGlvID0gTkEsICAgICAgICAgICAgICAgICAgICAgICMgTm8gZ2VuZSByYXRpb1xuICBwLmFkanVzdCA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAgIyBObyBwLmFkanVzdCB2YWx1ZVxuICBncm91cCA9IFxcR3JvdXAgMlxcICAgICAgICAgICAgICAgICAgICMgR3JvdXAgdG8gYWRkIGFzIGVtcHR5IGNvbHVtblxuKVxuXG5lbXB0eV9yb3czIDwtIGRhdGEuZnJhbWUoXG4gIElEID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHNwZWNpZmljIElEXG4gIERlc2NyaXB0aW9uID0gTkEsICAgICAgICAgICAgICAgICAgICAjIE5vIGRlc2NyaXB0aW9uXG4gIEdlbmVSYXRpbyA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIGdlbmUgcmF0aW9cbiAgcC5hZGp1c3QgPSBOQSwgICAgICAgICAgICAgICAgICAgICAgICMgTm8gcC5hZGp1c3QgdmFsdWVcbiAgZ3JvdXAgPSBcXEdyb3VwIDNcXCAgICAgICAgICAgICAgICAgICAjIEdyb3VwIHRvIGFkZCBhcyBlbXB0eSBjb2x1bW5cbilcblxuZW1wdHlfcm93NCA8LSBkYXRhLmZyYW1lKFxuICBJRCA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBzcGVjaWZpYyBJRFxuICBEZXNjcmlwdGlvbiA9IE5BLCAgICAgICAgICAgICAgICAgICAgIyBObyBkZXNjcmlwdGlvblxuICBHZW5lUmF0aW8gPSBOQSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBnZW5lIHJhdGlvXG4gIHAuYWRqdXN0ID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHAuYWRqdXN0IHZhbHVlXG4gIGdyb3VwID0gXFxHcm91cCA0XFwgICAgICAgICAgICAgICAgICAgIyBHcm91cCB0byBhZGQgYXMgZW1wdHkgY29sdW1uXG4pXG5cbiMgQXBwZW5kIHRoZSBlbXB0eSByb3cgdG8geW91ciBkYXRhc2V0XG5kYXRhIDwtIHJiaW5kKGRhdGEsIGVtcHR5X3JvdzIsIGVtcHR5X3JvdzMsIGVtcHR5X3JvdzQpXG5kZXNjT3JkZXIgPC0gc29ydCh1bmlxdWUoZGF0YSREZXNjcmlwdGlvbikpW3JldihjKDEyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCA1LCA5LCAxMSwgMTAsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCA2LCAzLCAxLCA4LCA3KSldXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoRGVzY3JpcHRpb24gJWluJSBkZXNjT3JkZXIpXG5cblxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKHBWYWx1ZUxvZyA9IG1pbigtbG9nMTAocC5hZGp1c3QpLCBwVmFsdWVMb2dNYXgpKVxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGZhY3RvcihEZXNjcmlwdGlvbiwgbGV2ZWxzID0gZGVzY09yZGVyKSwgc2l6ZSA9IHBWYWx1ZUxvZywgZmlsbCA9IEdlbmVSYXRpbykpICsgXG4gIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZVxuICAgICAgICAgICAgIHN0cm9rZSA9IDEqcHRUb01NKSArIFxuICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuNSwgMikpICsgICMgU2V0IG1pbiBhbmQgbWF4IHBvaW50IHNpemVzIGhlcmVcbiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSBcXHdoaXRlXFwsIGhpZ2ggPSBcXCNDQjMzM0FcXCxcbiAgICAgICAgICAgICAgICAgICAgICAjIGxpbWl0cyA9IGMoMCwgMSksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICsgXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArXG4gIHRoZW1lX2J3KCkgKyAgIyBBcHBseSB0aGVtZV9idyBmaXJzdCwgc28gY3VzdG9tIHRoZW1lIHNldHRpbmdzIGNvbWUgYWZ0ZXJcbiAgdGhlbWUoXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSwgICMgT3ZlcnJpZGUgdGhlbWVfYncgcGFuZWxcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCAgICAgICAgICMgRW5zdXJlIHNpemUgaXMgc2V0IGZvciB4LWF4aXMgdGV4dFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICksXG4gICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCAgICAgICAgICMgRW5zdXJlIHNpemUgaXMgc2V0IGZvciB5LWF4aXMgdGV4dFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgbGluZWhlaWdodCA9IDAuOSAgICAgICAgICAjIEFsbG93cyB3cmFwcGluZyBmb3IgeS1heGlzIGxhYmVscyB0byBmaXQgaW50byAyIGxpbmVzXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKVxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFwuLlxcLCBcXEdPXFwsIFxcR09fZ3JvdXBzX3BwXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMi42NSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaFxuc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
GOfigDir <- here(figDir, \../GO\)

#####################
GO0.df <- as.data.frame(enrichGO(gene = psOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO1.df <- as.data.frame(enrichGO(gene = psOver1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO2.df <- as.data.frame(enrichGO(gene = psOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO3.df <- as.data.frame(enrichGO(gene = psOver3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
GO4.df <- as.data.frame(enrichGO(gene = psOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\, readable = TRUE))
# 
# fwrite(GO0.df, here(\GO_PP_group0.tsv\), sep = \\t\)
# fwrite(GO1.df, here(\GO_PP_group1.tsv\), sep = \\t\)
# fwrite(GO2.df, here(\GO_PP_group2.tsv\), sep = \\t\)
# fwrite(GO3.df, here(\GO_PP_group3.tsv\), sep = \\t\)
# fwrite(GO4.df, here(\GO_PP_group4.tsv\), sep = \\t\)

subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 0\) %>%
  dplyr::arrange(p.adjust)
subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 1\) %>%
  dplyr::arrange(p.adjust)
subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 2\) %>%
  dplyr::arrange(p.adjust)
subset3 <- GO3.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 3\) %>%
  dplyr::arrange(p.adjust)
subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \Group 4\) %>%
  dplyr::arrange(p.adjust)

subset0$GeneRatio <- sapply(strsplit(subset0$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset1$GeneRatio <- sapply(strsplit(subset1$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset2$GeneRatio <- sapply(strsplit(subset2$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset3$GeneRatio <- sapply(strsplit(subset3$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))
subset4$GeneRatio <- sapply(strsplit(subset4$GeneRatio, \/\), function(x) as.numeric(x[1]) / as.numeric(x[2]))

GOlist <- factor(c(\GO:0008380\, \GO:0006397\, \GO:0034470\, \GO:0022613\, \GO:0016055\,
                   \GO:0061138\, \GO:0060562\, \GO:0007389\, \GO:0060485\, \GO:0048638\, \GO:0045664\))

data <- bind_rows(subset0, subset1) %>%
  dplyr::filter(ID %in% GOlist)



empty_row2 <- data.frame(
  ID = NA,                             # No specific ID
  Description = NA,                    # No description
  GeneRatio = NA,                      # No gene ratio
  p.adjust = NA,                       # No p.adjust value
  group = \Group 2\                   # Group to add as empty column
)

empty_row3 <- data.frame(
  ID = NA,                             # No specific ID
  Description = NA,                    # No description
  GeneRatio = NA,                      # No gene ratio
  p.adjust = NA,                       # No p.adjust value
  group = \Group 3\                   # Group to add as empty column
)

empty_row4 <- data.frame(
  ID = NA,                             # No specific ID
  Description = NA,                    # No description
  GeneRatio = NA,                      # No gene ratio
  p.adjust = NA,                       # No p.adjust value
  group = \Group 4\                   # Group to add as empty column
)

# Append the empty row to your dataset
data <- rbind(data, empty_row2, empty_row3, empty_row4)
descOrder <- sort(unique(data$Description))[rev(c(12,
                                                  4, 5, 9, 11, 10, 
                                                  2, 6, 3, 1, 8, 7))]
data <- data %>% dplyr::filter(Description %in% descOrder)


data <- data %>% dplyr::rowwise() %>% dplyr::mutate(pValueLog = min(-log10(p.adjust), pValueLogMax))
p <- ggplot(data, aes(x = group, y = factor(Description, levels = descOrder), size = pValueLog, fill = GeneRatio)) + 
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM) + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = \white\, high = \#CB333A\,
                      # limits = c(0, 1),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL) +
  theme_bw() +  # Apply theme_bw first, so custom theme settings come after
  theme(
    panel.background = element_rect(fill = \transparent\),  # Override theme_bw panel
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      size = fontSizeS,         # Ensure size is set for x-axis text
      family = fontType,
      color = \#000000\,
    ),
    axis.text.y = element_text(
      size = fontSizeS,         # Ensure size is set for y-axis text
      family = fontType,
      color = \#000000\,
      lineheight = 0.9          # Allows wrapping for y-axis labels to fit into 2 lines
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick * mmToLineUnit,
      lineend = \square\
    ),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- here(figDir, \..\, \GO\, \GO_groups_pp\)
width <- panelSize(2.65)*mmToInch
height <- panelSize(1.2)*mmToInch
svglite(paste0(fileName, \.svg\), height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



#### Grouping with P-P number
##### Grouping

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMW5jbTkxY0RFcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3YzA5MlpYSWdQVDFuY205MWNESXBJQ2trYldWaGJsOWthV1ptWDNOamIzSmxYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzV3Y3pBeElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYQ0p3YzA5MlpYSXdYQ0lzSUZ3aWNITlBkbVZ5TVZ3aUtTd2dOU2xjYm5Cek1USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjSW5CelQzWmxjakZjSWl3Z1hDSndjMDkyWlhJeVhDSXBMQ0ExS1Z4dWNITXlNeUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ3aWNITlBkbVZ5TWx3aUxDQmNJbkJ6VDNabGNqTmNJaWtzSURVcFhHNXdjek0wSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hDSndjMDkyWlhJelhDSXNJRndpY0hOUGRtVnlORndpS1N3Z05TbGNibkJ6TWpRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNJbkJ6VDNabGNqSmNJaXdnWENKd2MwOTJaWEkwWENJcExDQTFLVnh1Y0hNeE5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRndpY0hOUGRtVnlNVndpTENCY0luQnpUM1psY2pSY0lpa3NJRFVwWEc1d2N6QTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWENKd2MwOTJaWEl3WENJc0lGd2ljSE5QZG1WeU5Gd2lLU3dnTlNsY2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQndjMDkyWlhJc0lIa2dQU0J0WldGdVgyUnBabVpmYzJOdmNtVXBLU0FySUZ4dUlDQWdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJSEpsZGloaktGd2lJemMzTnpjM04xd2lMQ0JjSWlNNFFqZEZOalZjSWl3Z1hDSWpRVEk0TkRVeVhDSXNJRndpSTBNeU9EZzBSRndpTENCY0lpTkdNamhGTWtOY0lpa3BLU0FyWEc0Z0lHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnY0hOUGRtVnlLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFRXVmthWFZ0SUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0sxeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqTXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpVMWxaR2wxYlNBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtGY2JpQWdLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUd4aFluTW9lQ0E5SUU1VlRFd2dMQ0I1SUQwZ1hDSkJkbVZ5WVdkbElNNlVJR3h2YjNBZ2MyTnZjbVZjSWlrZ0sxeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1hHNGdJQ0FnWVdWektHZHliM1Z3SUQwZ2NITlBkbVZ5S1N3Z1puVnVJRDBnYldWaGJpeGNiaUFnSUNCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01DNDFMRnh1SUNBZ0lHWnBiR3dnUFNCY0ltSnNZV05yWENJc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aVhHNGdJQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXBJQ3RjYmlBZ2RHaGxiV1VvWEc0Z0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQmhibWRzWlNBOUlEUTFMQ0JvYW5WemRDQTlJREVzSUhacWRYTjBJRDBnTVZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1c2FXNWxJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpd2djMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWENKMGNtRnVjM0JoY21WdWRGd2lLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5a3NYRzRnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtWeHVJQ0FwSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SURFc0lIa2dQU0F3TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5Cek1ERTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNREVwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pFeU9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6RXlLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE15TXpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNeU15a3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNelE2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TXpRcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2N6STBPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdjekkwS1N3Z1hDSmNYRzVjSWl3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5Cek1UUTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNVFFwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pBME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6QTBLU3dnWENKY1hHNWNJaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNaWtnSzF4dUlDQmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb0xUQXVOU3dnTUM0eEtTbGNibHh1WEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSmthV1ptVTJOdmNtVmZZbUZ5Y0d4dmRGOXdjRWR5YjNWd1gyUlVRVWRmZG5OZlJFMVRUMXdpS1Z4dWQybGtkR2dnUEMwZ016TXFiVzFVYjBsdVkyaGNibWhsYVdkb2RDQThMVE16S20xdFZHOUpibU5vWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJG1lYW5fZGlmZl9zY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG5wczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXIzXFwpLCA1KVxucHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gcHNPdmVyLCB5ID0gbWVhbl9kaWZmX3Njb3JlKSkgKyBcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSByZXYoYyhcXCM3Nzc3NzdcXCwgXFwjOEI3RTY1XFwsIFxcI0EyODQ1MlxcLCBcXCNDMjg4NERcXCwgXFwjRjI4RTJDXFwpKSkgK1xuICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIFxuICAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BXG4gICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFxcQXZlcmFnZSDOlCBsb29wIHNjb3JlXFwpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IHBzT3ZlciksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMwNDogXFwsIGNvbnZQdmFsdWUocHMwNCksIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDIpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuMSkpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcZGlmZlNjb3JlX2JhcnBsb3RfcHBHcm91cF9kVEFHX3ZzX0RNU09cXClcbndpZHRoIDwtIDMzKm1tVG9JbmNoXG5oZWlnaHQgPC0zMyptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(psOver ==group1) )$mean_diff_score
  distance2 <- (data %>% dplyr::filter(psOver ==group2) )$mean_diff_score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

ps01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(temp, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(temp, \psOver1\, \psOver4\), 5)
ps04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)

p <- ggplot(temp, aes(x = psOver, y = mean_diff_score)) + 
    scale_fill_manual(values = rev(c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\))) +
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineMedium * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \Average Δ loop score\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) +
  coord_cartesian(ylim = c(-0.5, 0.1))


fileName <- paste0(\diffScore_barplot_ppGroup_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2MwOTJaWElnUFQxbmNtOTFjREVwSUNra2JXVmhibDlrYVdabVgzTmpiM0psWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGdJSGRwYkNBOExTQjNhV3hqYjNndWRHVnpkQ2hrYVhOMFlXNWpaVEVzSUdScGMzUmhibU5sTWlsY2JpQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1ZlZ4dVhHNXdjekF4SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hGeHdjMDkyWlhJd1hGd3NJRnhjY0hOUGRtVnlNVnhjS1N3Z05TbGNibkJ6TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNYSEJ6VDNabGNqRmNYQ3dnWEZ4d2MwOTJaWEl5WEZ3cExDQTFLVnh1Y0hNeU15QThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRnhjY0hOUGRtVnlNbHhjTENCY1hIQnpUM1psY2pOY1hDa3NJRFVwWEc1d2N6TTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWEZ4d2MwOTJaWEl6WEZ3c0lGeGNjSE5QZG1WeU5GeGNLU3dnTlNsY2JuQnpNalFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TENCY1hIQnpUM1psY2pKY1hDd2dYRnh3YzA5MlpYSTBYRndwTENBMUtWeHVjSE14TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGeGNjSE5QZG1WeU1WeGNMQ0JjWEhCelQzWmxjalJjWENrc0lEVXBYRzV3Y3pBMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYRnh3YzA5MlpYSXdYRndzSUZ4Y2NITlBkbVZ5TkZ4Y0tTd2dOU2xjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCd2MwOTJaWElzSUhrZ1BTQnRaV0Z1WDJScFptWmZjMk52Y21VcEtTQXJJRnh1SUNBZ0lITmpZV3hsWDJacGJHeGZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlISmxkaWhqS0Z4Y0l6YzNOemMzTjF4Y0xDQmNYQ000UWpkRk5qVmNYQ3dnWEZ3alFUSTRORFV5WEZ3c0lGeGNJME15T0RnMFJGeGNMQ0JjWENOR01qaEZNa05jWENrcEtTQXJYRzRnSUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdjSE5QZG1WeUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVFdWa2FYVnRJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnSzF4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpNc0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaWGRwWkhSb0lEMGdiR2x1WlUxbFpHbDFiU0FxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0ZjYmlBZ0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJR3hoWW5Nb2VDQTlJRTVWVEV3Z0xDQjVJRDBnWEZ4QmRtVnlZV2RsSU02VUlHeHZiM0FnYzJOdmNtVmNYQ2tnSzF4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWEc0Z0lDQWdZV1Z6S0dkeWIzVndJRDBnY0hOUGRtVnlLU3dnWm5WdUlEMGdiV1ZoYml4Y2JpQWdJQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTUM0MUxGeHVJQ0FnSUdacGJHd2dQU0JjWEdKc1lXTnJYRndzSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjWEc0Z0lDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRcElDdGNiaUFnZEdobGJXVW9YRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVTBzSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2dZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCaGJtZHNaU0E5SURRMUxDQm9hblZ6ZENBOUlERXNJSFpxZFhOMElEMGdNVnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN3Z2MybDZaU0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHbGphM01nUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYRngwY21GdWMzQmhjbVZ1ZEZ4Y0tTeGNiaUFnSUNCc1pXZGxibVF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnYkdWblpXNWtMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1Z4dUlDQXBLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJREVzSUhrZ1BTQXdMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEJ6TURFNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek1ERXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekV5T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pFeUtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXlNem9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE15TXlrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek16UTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNelFwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3Y3pJME9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod2N6STBLU3dnWEZ4Y1hHNWNYQ3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEJ6TVRRNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek1UUXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekEwT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pBMEtTd2dYRnhjWEc1Y1hDa3NJRnh1SUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ01pa2dLMXh1SUNCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTFRBdU5Td2dNQzR4S1NsY2JseHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4a2FXWm1VMk52Y21WZlltRnljR3h2ZEY5d2NFZHliM1Z3WDJSVVFVZGZkbk5mUkUxVFQxeGNLVnh1ZDJsa2RHZ2dQQzBnTXpNcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExUTXpLbTF0Vkc5SmJtTm9YRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRtZWFuX2RpZmZfc2NvcmVcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMikgKSRtZWFuX2RpZmZfc2NvcmVcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjJcXCksIDUpXG5wczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHBzT3ZlciwgeSA9IG1lYW5fZGlmZl9zY29yZSkpICsgXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcmV2KGMoXFwjNzc3Nzc3XFwsIFxcIzhCN0U2NVxcLCBcXCNBMjg0NTJcXCwgXFwjQzI4ODREXFwsIFxcI0YyOEUyQ1xcKSkpICtcbiAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwc092ZXIpLCBcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQVxuICApICsgdGhlbWVfY2xhc3NpYygpICsgbGFicyh4ID0gTlVMTCAsIHkgPSBcXEF2ZXJhZ2UgzpQgbG9vcCBzY29yZVxcKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsIGNvbnZQdmFsdWUocHMxNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAyKSArXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC41LCAwLjEpKVxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGRpZmZTY29yZV9iYXJwbG90X3BwR3JvdXBfZFRBR192c19ETVNPXFwpXG53aWR0aCA8LSAzMyptbVRvSW5jaFxuaGVpZ2h0IDwtMzMqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbWVhbl9kaWZmX3Njb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwc092ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIFxuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHJldihjKFxcIzc3Nzc3N1xcLCBcXCM4QjdFNjVcXCwgXFwjQTI4NDUyXFwsIFxcI0MyODg0RFxcLCBcXCNGMjhFMkNcXCkpKSArXG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkFcbiAgKSArIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxBdmVyYWdlIM6UIGxvb3Agc2NvcmVcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC4xKSlcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxkaWZmU2NvcmVfYmFycGxvdF9wcEdyb3VwX2RUQUdfdnNfRE1TT1xcKVxud2lkdGggPC0gMzMqbW1Ub0luY2hcbmhlaWdodCA8LTMzKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbmBgYFxuYGBgIn0= -->

```r
```r
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(psOver ==group1) )$mean_diff_score
  distance2 <- (data %>% dplyr::filter(psOver ==group2) )$mean_diff_score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

ps01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(temp, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(temp, \psOver1\, \psOver4\), 5)
ps04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)

p <- ggplot(temp, aes(x = psOver, y = mean_diff_score)) + 
    scale_fill_manual(values = rev(c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\))) +
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineMedium * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \Average Δ loop score\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) +
  coord_cartesian(ylim = c(-0.5, 0.1))


fileName <- paste0(\diffScore_barplot_ppGroup_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### GO for each group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR1Z0Y0NBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dGaWMweHZaekpHUXlBOUlHRmljeWhzYjJjeVJtOXNaRU5vWVc1blpTa3BYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJR0ZpYzB4dlp6SkdReXdnWTI5c2IzSWdQU0J3YzA5MlpYSXBLU0FyWEc1elkyRnNaVjlqYjJ4dmNsOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ0tISmxkaWhqS0Z3aUl6YzNOemMzTjF3aUxDQmNJaU00UWpkRk5qVmNJaXdnWENJalFUSTRORFV5WENJc0lGd2lJME15T0RnMFJGd2lMQ0JjSWlOR01qaEZNa05jSWlrcEtTa2dLMXh1SUNCemRHRjBYMlZqWkdZb2MybDZaU0E5SURBdU5Dd2diR2x1WlhkcFpIUm9JRDBnYkdsdVpVMWxaR2wxYlNBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENJZ0tTQXJJQ01nVlhObElITjBZWFJmWldOa1ppQjBieUJ3Ykc5MElIUm9aU0JsYlhCcGNtbGpZV3dnUTBSR1hHNGdJR3hoWW5Nb1hHNGdJQ0FnZUNBOUlGd2lRV0p6TGlCc2IyY3lLR1p2YkdRZ1kyaGhibWRsS1Z3aUxGeHVJQ0FnSUhrZ1BTQmNJa04xYlhWc1lYUnBkbVVnVUhKdlltRmlhV3hwZEhsY0lseHVJQ0FwSUNzZ1kyOXZjbVJmWTJGeWRHVnphV0Z1S0hoc2FXMGdQU0JqS0RBc0lERXVOU2twSUN0Y2JpQWdkR2hsYldWZlkyeGhjM05wWXlncElDc2dJeUJEYkdWaGJpQjBhR1Z0WlZ4dUlDQjBhR1Z0WlNoY2JpQWdJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVTBzWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11YkdsdVpTQTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJwWTJ0eklEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBcExGeHVJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGd2lkSEpoYm5Od1lYSmxiblJjSWlrc1hHNGdJQ0FnYkdWblpXNWtMbkJ2YzJsMGFXOXVJRDBnWENKdWIyNWxYQ0lzWEc0Z0lDQWdiR1ZuWlc1a0xuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5bGNiaUFnSUNBcElDc2djMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR3hoWW1Wc2N5QTlJSE5qWVd4bGN6bzZiblZ0WW1WeVgyWnZjbTFoZENoaFkyTjFjbUZqZVNBOUlEQXVNU2twWEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSnNiMmN5UmtOZlkyUm1YM0J3UjNKdmRYQmZaRlJCUjE5MmMxOUVUVk5QWENJcFhHNTNhV1IwYUNBOExTQXpNeXB0YlZSdlNXNWphRnh1YUdWcFoyaDBJRHd0TXpNcWJXMVViMGx1WTJoY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dVhHNWNiaU5jYmlCblpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaUFnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hCelQzWmxjaUE5UFdkeWIzVndNU2tnS1NSc2IyY3lSbTlzWkVOb1lXNW5aVnh1SUNCa2FYTjBZVzVqWlRJZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2NITlBkbVZ5SUQwOVozSnZkWEF5S1NBcEpHeHZaekpHYjJ4a1EyaGhibWRsWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WEc1MFpXMXdSRzkzYmlBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0d4dlp6SkdiMnhrUTJoaGJtZGxJRHdnTUNsY2JpQmNibkJ6TURFZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1JHOTNiaXdnWENKd2MwOTJaWEl3WENJc0lGd2ljSE5QZG1WeU1Wd2lLU3dnTlNsY2JuQnpNVElnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3Ukc5M2Jpd2dYQ0p3YzA5MlpYSXhYQ0lzSUZ3aWNITlBkbVZ5TWx3aUtTd2dOU2xjYm5Cek1qTWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdSRzkzYml3Z1hDSndjMDkyWlhJeVhDSXNJRndpY0hOUGRtVnlNMXdpS1N3Z05TbGNibkJ6TXpRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1JHOTNiaXdnWENKd2MwOTJaWEl6WENJc0lGd2ljSE5QZG1WeU5Gd2lLU3dnTlNsY2JuQnpNalFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3Ukc5M2Jpd2dYQ0p3YzA5MlpYSXlYQ0lzSUZ3aWNITlBkbVZ5TkZ3aUtTd2dOU2xjYm5Cek1UUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdSRzkzYml3Z1hDSndjMDkyWlhJeFhDSXNJRndpY0hOUGRtVnlORndpS1N3Z05TbGNibHh1Y0hNd05DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY0luQnpUM1psY2pCY0lpd2dYQ0p3YzA5MlpYSTBYQ0lwTENBMUtWeHVYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtIUmxiWEJFYjNkdUxDQmhaWE1vZUNBOUlIQnpUM1psY2l3Z2VTQTlJR3h2WnpKR2IyeGtRMmhoYm1kbEtTa2dLeUJjYmlBZ2MyTmhiR1ZmWm1sc2JGOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNJaU5FT1VRNVJEbGNJaXdnWENJalFrWkNSa0pHWENJc0lGd2lJMEUyUVRaQk5sd2lMQ0JjSWlNNFF6aERPRU5jSWl3Z1hDSWpOek0zTXpjelhDSXBLU0FySUNNZ1JtbDJaU0J6YUdGa1pYTWdiMllnWjNKbGVWeHVJQ0JuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlIQnpUM1psY2lrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMakVzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FWeHVJQ0FwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ2JHRmljeWg0SUQwZ1RsVk1UQ0FzSUhrZ1BTQmNJbXh2WnpJb1ptOXNaQ0JqYUdGdVoyVXBYQ0lwSUN0Y2JpQWdjM1JoZEY5emRXMXRZWEo1S0Z4dUlDQWdJR0ZsY3lobmNtOTFjQ0E5SUhCelQzWmxjaWtzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnWjJWdmJTQTlJRndpY0c5cGJuUmNJaXdnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURFc1hHNGdJQ0FnWm1sc2JDQTlJRndpY21Wa1hDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lYRzRnSUNrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFwSUN0Y2JpQWdkR2hsYldVb1hHNGdJQ0FnWVhocGN5NTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTENCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0JoYm1kc1pTQTlJRFExTENCb2FuVnpkQ0E5SURFc0lIWnFkWE4wSUQwZ01WeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NXNhVzVsSUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXdnYzJsNlpTQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdsamEzTWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxDQnphWHBsSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNrc1hHNGdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hDSjBjbUZ1YzNCaGNtVnVkRndpS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdiR1ZuWlc1a0xuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLVnh1SUNBcEsxeHVJQ0JoYm01dmRHRjBaU2hjSW5SbGVIUmNJaXdnZUNBOUlERXNJSGtnUFNBdE1DNDFMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkJ6TURFNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1ERXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekV5T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pFeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNITXlNem9nWENJc0lHTnZiblpRZG1Gc2RXVW9jSE15TXlrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5Cek16UTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNelFwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pJME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6STBLU3dnWENKY1hHNWNJaXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TVRRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1UUXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekEwT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pBMEtTd2dYQ0pjWEc1Y0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ01pa2dLeUJqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9MVEVzSURBcEtWeHVJQ0JjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0lteHZaekpHUTE5aVlYSndiRzkwWDNCd1IzSnZkWEJmWkZSQlIxOTJjMTlFVFZOUFgyUnZkMjVjSWlsY2JuZHBaSFJvSUR3dElIQmhibVZzVTJsNlpTZ3hMaklwS20xdFZHOUpibU5vWEc1b1pXbG5hSFFnUEMwZ2NHRnVaV3hUYVhwbEtERXBLbTF0Vkc5SmJtTm9YRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWNibHh1WEc1MFpXMXdWWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhzYjJjeVJtOXNaRU5vWVc1blpTQStJREFwWEc0Z1hHNXdjekF4SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNJbkJ6VDNabGNqQmNJaXdnWENKd2MwOTJaWEl4WENJcExDQTFLVnh1Y0hNeE1pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlZjQ3dnWENKd2MwOTJaWEl4WENJc0lGd2ljSE5QZG1WeU1sd2lLU3dnTlNsY2JuQnpNak1nUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VlhBc0lGd2ljSE5QZG1WeU1sd2lMQ0JjSW5CelQzWmxjak5jSWlrc0lEVXBYRzV3Y3pNMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjSW5CelQzWmxjak5jSWl3Z1hDSndjMDkyWlhJMFhDSXBMQ0ExS1Z4dWNITXlOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJWY0N3Z1hDSndjMDkyWlhJeVhDSXNJRndpY0hOUGRtVnlORndpS1N3Z05TbGNibkJ6TVRRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1ZYQXNJRndpY0hOUGRtVnlNVndpTENCY0luQnpUM1psY2pSY0lpa3NJRFVwWEc1d2N6QTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY0luQnpUM1psY2pCY0lpd2dYQ0p3YzA5MlpYSTBYQ0lwTENBMUtWeHVYRzVjYmx4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd1ZYQXNJR0ZsY3loNElEMGdjSE5QZG1WeUxDQjVJRDBnYkc5bk1rWnZiR1JEYUdGdVoyVXBLU0FySUZ4dUlDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRndpSTBRNVJEbEVPVndpTENCY0lpTkNSa0pHUWtaY0lpd2dYQ0lqUVRaQk5rRTJYQ0lzSUZ3aUl6aERPRU00UTF3aUxDQmNJaU0zTXpjek56TmNJaWtwSUNzZ0l5QkdhWFpsSUhOb1lXUmxjeUJ2WmlCbmNtVjVYRzRnSUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdjSE5QZG1WeUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FyWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJYRzRnSUNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QnNZV0p6S0hnZ1BTQk9WVXhNSUN3Z2VTQTlJRndpYkc5bk1paG1iMnhrSUdOb1lXNW5aU2xjSWlrZ0sxeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1hHNGdJQ0FnWVdWektHZHliM1Z3SUQwZ2NITlBkbVZ5S1N3Z1puVnVJRDBnYldWaGJpeGNiaUFnSUNCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01TeGNiaUFnSUNCbWFXeHNJRDBnWENKeVpXUmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0pjYmlBZ0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFzSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZENrZ0sxeHVJQ0IwYUdWdFpTaGNiaUFnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXdnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRdWVDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lHaHFkWE4wSUQwZ01Td2dkbXAxYzNRZ1BTQXhYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNJblJ5WVc1emNHRnlaVzUwWENJcExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDa3JYRzRnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdNU3dnZVNBOUlEQXVOU3dnYkdGaVpXd2dQU0J3WVhOMFpUQW9YQ0p3Y3pBeE9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6QXhLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE14TWpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNeE1pa3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNak02SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TWpNcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2N6TTBPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdjek0wS1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hNeU5Eb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NITXlOQ2tzSUZ3aVhGeHVYQ0lzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pFME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6RTBLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE13TkRvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNd05Da3NJRndpWEZ4dVhDSXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlESXBJQ3NnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLREFzSURFcEtWeHVYRzRnSUZ4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2liRzluTWtaRFgySmhjbkJzYjNSZmNIQkhjbTkxY0Y5a1ZFRkhYM1p6WDBSTlUwOWZkWEJjSWlsY2JuZHBaSFJvSUR3dElIQmhibVZzVTJsNlpTZ3hMakU0S1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3hLU3B0YlZSdlNXNWphRnh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ3aWFXNWNJaXdnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKGFic0xvZzJGQyA9IGFicyhsb2cyRm9sZENoYW5nZSkpXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGFic0xvZzJGQywgY29sb3IgPSBwc092ZXIpKSArXG5zY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gKHJldihjKFxcIzc3Nzc3N1xcLCBcXCM4QjdFNjVcXCwgXFwjQTI4NDUyXFwsIFxcI0MyODg0RFxcLCBcXCNGMjhFMkNcXCkpKSkgK1xuICBzdGF0X2VjZGYoc2l6ZSA9IDAuNCwgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwgKSArICMgVXNlIHN0YXRfZWNkZiB0byBwbG90IHRoZSBlbXBpcmljYWwgQ0RGXG4gIGxhYnMoXG4gICAgeCA9IFxcQWJzLiBsb2cyKGZvbGQgY2hhbmdlKVxcLFxuICAgIHkgPSBcXEN1bXVsYXRpdmUgUHJvYmFiaWxpdHlcXFxuICApICsgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDEuNSkpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgIyBDbGVhbiB0aGVtZVxuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDAuMSkpXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfY2RmX3BwR3JvdXBfZFRBR192c19ETVNPXFwpXG53aWR0aCA8LSAzMyptbVRvSW5jaFxuaGVpZ2h0IDwtMzMqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbiNcbiBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJGxvZzJGb2xkQ2hhbmdlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG50ZW1wRG93biA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlIDwgMClcbiBcbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcblxucHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KHRlbXBEb3duLCBhZXMoeCA9IHBzT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCNEOUQ5RDlcXCwgXFwjQkZCRkJGXFwsIFxcI0E2QTZBNlxcLCBcXCM4QzhDOENcXCwgXFwjNzM3MzczXFwpKSArICMgRml2ZSBzaGFkZXMgb2YgZ3JleVxuICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIFxuICAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQVxuICApICsgdGhlbWVfY2xhc3NpYygpICsgbGFicyh4ID0gTlVMTCAsIHkgPSBcXGxvZzIoZm9sZCBjaGFuZ2UpXFwpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IHBzT3ZlciksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsXG4gICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAtMC41LCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEsIDApKVxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BwR3JvdXBfZFRBR192c19ETVNPX2Rvd25cXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG50ZW1wVXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA+IDApXG4gXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5cblxuXG5wIDwtIGdncGxvdCh0ZW1wVXAsIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIFxuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICsgIyBGaXZlIHNoYWRlcyBvZiBncmV5XG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BXG4gICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFxcbG9nMihmb2xkIGNoYW5nZSlcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMwNDogXFwsIGNvbnZQdmFsdWUocHMwNCksIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDIpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEpKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcHBHcm91cF9kVEFHX3ZzX0RNU09fdXBcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjE4KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxKSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
temp <- temp %>% dplyr::mutate(absLog2FC = abs(log2FoldChange))
p <- ggplot(temp, aes(x = absLog2FC, color = psOver)) +
scale_color_manual(values = (rev(c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\)))) +
  stat_ecdf(size = 0.4, linewidth = lineMedium * mmToLineUnit, lineend = \square\ ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Abs. log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.position = \none\,
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    ) + scale_y_continuous(labels = scales::number_format(accuracy = 0.1))
fileName <- paste0(\log2FC_cdf_ppGroup_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



#
 getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(psOver ==group1) )$log2FoldChange
  distance2 <- (data %>% dplyr::filter(psOver ==group2) )$log2FoldChange
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
 
ps01 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(tempDown, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver4\), 5)

ps04 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver4\), 5)


p <- ggplot(tempDown, aes(x = psOver, y = log2FoldChange)) + 
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) + # Five shades of grey
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \log2(fold change)\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = -0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) + coord_cartesian(ylim = c(-1, 0))
  
fileName <- paste0(\log2FC_barplot_ppGroup_dTAG_vs_DMSO_down\)
width <- panelSize(1.2)*mmToInch
height <- panelSize(1)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
 
ps01 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(tempUp, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver4\), 5)
ps04 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver4\), 5)




p <- ggplot(tempUp, aes(x = psOver, y = log2FoldChange)) + 
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) + # Five shades of grey
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \log2(fold change)\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_ppGroup_dTAG_vs_DMSO_up\)
width <- panelSize(1.18)*mmToInch
height <- panelSize(1)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRHVnRjQ0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR0ZpYzB4dlp6SkdReUE5SUdGaWN5aHNiMmN5Um05c1pFTm9ZVzVuWlNrcFhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlHRmljMHh2WnpKR1F5d2dZMjlzYjNJZ1BTQndjMDkyWlhJcEtTQXJYRzV6WTJGc1pWOWpiMnh2Y2w5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnS0hKbGRpaGpLRnhjSXpjM056YzNOMXhjTENCY1hDTTRRamRGTmpWY1hDd2dYRndqUVRJNE5EVXlYRndzSUZ4Y0kwTXlPRGcwUkZ4Y0xDQmNYQ05HTWpoRk1rTmNYQ2twS1NrZ0sxeHVJQ0J6ZEdGMFgyVmpaR1lvYzJsNlpTQTlJREF1TkN3Z2JHbHVaWGRwWkhSb0lEMGdiR2x1WlUxbFpHbDFiU0FxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRndnS1NBcklDTWdWWE5sSUhOMFlYUmZaV05rWmlCMGJ5QndiRzkwSUhSb1pTQmxiWEJwY21sallXd2dRMFJHWEc0Z0lHeGhZbk1vWEc0Z0lDQWdlQ0E5SUZ4Y1FXSnpMaUJzYjJjeUtHWnZiR1FnWTJoaGJtZGxLVnhjTEZ4dUlDQWdJSGtnUFNCY1hFTjFiWFZzWVhScGRtVWdVSEp2WW1GaWFXeHBkSGxjWEZ4dUlDQXBJQ3NnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGhzYVcwZ1BTQmpLREFzSURFdU5Ta3BJQ3RjYmlBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ0l5QkRiR1ZoYmlCMGFHVnRaVnh1SUNCMGFHVnRaU2hjYmlBZ0lDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpVMHNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXViR2x1WlNBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUnBZMnR6SUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3hjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ4Y2RISmhibk53WVhKbGJuUmNYQ2tzWEc0Z0lDQWdiR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdYRnh1YjI1bFhGd3NYRzRnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlsY2JpQWdJQ0FwSUNzZ2MyTmhiR1ZmZVY5amIyNTBhVzUxYjNWektHeGhZbVZzY3lBOUlITmpZV3hsY3pvNmJuVnRZbVZ5WDJadmNtMWhkQ2hoWTJOMWNtRmplU0E5SURBdU1Ta3BYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4c2IyY3lSa05mWTJSbVgzQndSM0p2ZFhCZlpGUkJSMTkyYzE5RVRWTlBYRndwWEc1M2FXUjBhQ0E4TFNBek15cHRiVlJ2U1c1amFGeHVhR1ZwWjJoMElEd3RNek1xYlcxVWIwbHVZMmhjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibHh1WEc1Y2JpTmNiaUJuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpQWdaR2x6ZEdGdVkyVXhJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSEJ6VDNabGNpQTlQV2R5YjNWd01Ta2dLU1JzYjJjeVJtOXNaRU5vWVc1blpWeHVJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvY0hOUGRtVnlJRDA5WjNKdmRYQXlLU0FwSkd4dlp6SkdiMnhrUTJoaGJtZGxYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzUwWlcxd1JHOTNiaUE4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR3h2WnpKR2IyeGtRMmhoYm1kbElEd2dNQ2xjYmlCY2JuQnpNREVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3Ukc5M2Jpd2dYRnh3YzA5MlpYSXdYRndzSUZ4Y2NITlBkbVZ5TVZ4Y0tTd2dOU2xjYm5Cek1USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdSRzkzYml3Z1hGeHdjMDkyWlhJeFhGd3NJRnhjY0hOUGRtVnlNbHhjS1N3Z05TbGNibkJ6TWpNZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1JHOTNiaXdnWEZ4d2MwOTJaWEl5WEZ3c0lGeGNjSE5QZG1WeU0xeGNLU3dnTlNsY2JuQnpNelFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3Ukc5M2Jpd2dYRnh3YzA5MlpYSXpYRndzSUZ4Y2NITlBkbVZ5TkZ4Y0tTd2dOU2xjYm5Cek1qUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdSRzkzYml3Z1hGeHdjMDkyWlhJeVhGd3NJRnhjY0hOUGRtVnlORnhjS1N3Z05TbGNibkJ6TVRRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1JHOTNiaXdnWEZ4d2MwOTJaWEl4WEZ3c0lGeGNjSE5QZG1WeU5GeGNLU3dnTlNsY2JseHVjSE13TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjWEhCelQzWmxjakJjWEN3Z1hGeHdjMDkyWlhJMFhGd3BMQ0ExS1Z4dVhHNWNibkFnUEMwZ1oyZHdiRzkwS0hSbGJYQkViM2R1TENCaFpYTW9lQ0E5SUhCelQzWmxjaXdnZVNBOUlHeHZaekpHYjJ4a1EyaGhibWRsS1NrZ0t5QmNiaUFnYzJOaGJHVmZabWxzYkY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY1hDTkVPVVE1UkRsY1hDd2dYRndqUWtaQ1JrSkdYRndzSUZ4Y0kwRTJRVFpCTmx4Y0xDQmNYQ000UXpoRE9FTmNYQ3dnWEZ3ak56TTNNemN6WEZ3cEtTQXJJQ01nUm1sMlpTQnphR0ZrWlhNZ2IyWWdaM0psZVZ4dUlDQm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUhCelQzWmxjaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0sxeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVZ4dUlDQXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnYkdGaWN5aDRJRDBnVGxWTVRDQXNJSGtnUFNCY1hHeHZaeklvWm05c1pDQmphR0Z1WjJVcFhGd3BJQ3RjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLRnh1SUNBZ0lHRmxjeWhuY205MWNDQTlJSEJ6VDNabGNpa3NJR1oxYmlBOUlHMWxZVzRzWEc0Z0lDQWdaMlZ2YlNBOUlGeGNjRzlwYm5SY1hDd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJREVzWEc0Z0lDQWdabWxzYkNBOUlGeGNjbVZrWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y1hHNGdJQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXBJQ3RjYmlBZ2RHaGxiV1VvWEc0Z0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQmhibWRzWlNBOUlEUTFMQ0JvYW5WemRDQTlJREVzSUhacWRYTjBJRDBnTVZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1c2FXNWxJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hDd2djMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWEZ4MGNtRnVjM0JoY21WdWRGeGNLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5a3NYRzRnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtWeHVJQ0FwSzF4dUlDQmhibTV2ZEdGMFpTaGNYSFJsZUhSY1hDd2dlQ0E5SURFc0lIa2dQU0F0TUM0MUxDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQnpNREU2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TURFcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6RXlPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekV5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hNeU16b2dYRndzSUdOdmJuWlFkbUZzZFdVb2NITXlNeWtzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEJ6TXpRNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek16UXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekkwT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pJMEtTd2dYRnhjWEc1Y1hDd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNVFE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TVRRcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6QTBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekEwS1N3Z1hGeGNYRzVjWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTWlrZ0t5QmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb0xURXNJREFwS1Z4dUlDQmNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEd4dlp6SkdRMTlpWVhKd2JHOTBYM0J3UjNKdmRYQmZaRlJCUjE5MmMxOUVUVk5QWDJSdmQyNWNYQ2xjYm5kcFpIUm9JRHd0SUhCaGJtVnNVMmw2WlNneExqSXBLbTF0Vkc5SmJtTm9YRzVvWldsbmFIUWdQQzBnY0dGdVpXeFRhWHBsS0RFcEttMXRWRzlKYm1Ob1hHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Y2JseHVYRzUwWlcxd1ZYQWdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHNiMmN5Um05c1pFTm9ZVzVuWlNBK0lEQXBYRzRnWEc1d2N6QXhJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY1hIQnpUM1psY2pCY1hDd2dYRnh3YzA5MlpYSXhYRndwTENBMUtWeHVjSE14TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVmNDd2dYRnh3YzA5MlpYSXhYRndzSUZ4Y2NITlBkbVZ5TWx4Y0tTd2dOU2xjYm5Cek1qTWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdWWEFzSUZ4Y2NITlBkbVZ5TWx4Y0xDQmNYSEJ6VDNabGNqTmNYQ2tzSURVcFhHNXdjek0wSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNYSEJ6VDNabGNqTmNYQ3dnWEZ4d2MwOTJaWEkwWEZ3cExDQTFLVnh1Y0hNeU5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlZjQ3dnWEZ4d2MwOTJaWEl5WEZ3c0lGeGNjSE5QZG1WeU5GeGNLU3dnTlNsY2JuQnpNVFFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VlhBc0lGeGNjSE5QZG1WeU1WeGNMQ0JjWEhCelQzWmxjalJjWENrc0lEVXBYRzV3Y3pBMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjWEhCelQzWmxjakJjWEN3Z1hGeHdjMDkyWlhJMFhGd3BMQ0ExS1Z4dVhHNWNibHh1WEc1d0lEd3RJR2RuY0d4dmRDaDBaVzF3VlhBc0lHRmxjeWg0SUQwZ2NITlBkbVZ5TENCNUlEMGdiRzluTWtadmJHUkRhR0Z1WjJVcEtTQXJJRnh1SUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGeGNJMFE1UkRsRU9WeGNMQ0JjWENOQ1JrSkdRa1pjWEN3Z1hGd2pRVFpCTmtFMlhGd3NJRnhjSXpoRE9FTTRRMXhjTENCY1hDTTNNemN6TnpOY1hDa3BJQ3NnSXlCR2FYWmxJSE5vWVdSbGN5QnZaaUJuY21WNVhHNGdJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ2NITlBkbVZ5S1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QlhHNGdJQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCc1lXSnpLSGdnUFNCT1ZVeE1JQ3dnZVNBOUlGeGNiRzluTWlobWIyeGtJR05vWVc1blpTbGNYQ2tnSzF4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWEc0Z0lDQWdZV1Z6S0dkeWIzVndJRDBnY0hOUGRtVnlLU3dnWm5WdUlEMGdiV1ZoYml4Y2JpQWdJQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTVN4Y2JpQWdJQ0JtYVd4c0lEMGdYRnh5WldSY1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGeGNiaUFnS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ2tnSzF4dUlDQjBhR1Z0WlNoY2JpQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5d2dabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUdocWRYTjBJRDBnTVN3Z2RtcDFjM1FnUFNBeFhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY1hIUnlZVzV6Y0dGeVpXNTBYRndwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNrclhHNGdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ01Td2dlU0E5SURBdU5Td2diR0ZpWld3Z1BTQndZWE4wWlRBb1hGeHdjekF4T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pBeEtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXhNam9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE14TWlrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek1qTTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNak1wTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3Y3pNME9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod2N6TTBLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSE15TkRvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hNeU5Da3NJRnhjWEZ4dVhGd3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekUwT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pFMEtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXdORG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE13TkNrc0lGeGNYRnh1WEZ3cExDQmNiaUFnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzSUdocWRYTjBJRDBnTUN3Z2MybDZaU0E5SURJcElDc2dZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktEQXNJREVwS1Z4dVhHNGdJRnh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y2JHOW5Na1pEWDJKaGNuQnNiM1JmY0hCSGNtOTFjRjlrVkVGSFgzWnpYMFJOVTA5ZmRYQmNYQ2xjYm5kcFpIUm9JRHd0SUhCaGJtVnNVMmw2WlNneExqRTRLU3B0YlZSdlNXNWphRnh1YUdWcFoyaDBJRHd0SUhCaGJtVnNVMmw2WlNneEtTcHRiVlJ2U1c1amFGeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRnhjYVc1Y1hDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2twTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShhYnNMb2cyRkMgPSBhYnMobG9nMkZvbGRDaGFuZ2UpKVxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBhYnNMb2cyRkMsIGNvbG9yID0gcHNPdmVyKSkgK1xuc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IChyZXYoYyhcXCM3Nzc3NzdcXCwgXFwjOEI3RTY1XFwsIFxcI0EyODQ1MlxcLCBcXCNDMjg4NERcXCwgXFwjRjI4RTJDXFwpKSkpICtcbiAgc3RhdF9lY2RmKHNpemUgPSAwLjQsIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcICkgKyAjIFVzZSBzdGF0X2VjZGYgdG8gcGxvdCB0aGUgZW1waXJpY2FsIENERlxuICBsYWJzKFxuICAgIHggPSBcXEFicy4gbG9nMihmb2xkIGNoYW5nZSlcXCxcbiAgICB5ID0gXFxDdW11bGF0aXZlIFByb2JhYmlsaXR5XFxcbiAgKSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxLjUpKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArICMgQ2xlYW4gdGhlbWVcbiAgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAwLjEpKVxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2NkZl9wcEdyb3VwX2RUQUdfdnNfRE1TT1xcKVxud2lkdGggPC0gMzMqbW1Ub0luY2hcbmhlaWdodCA8LTMzKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG4jXG4gZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbG9nMkZvbGRDaGFuZ2VcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMikgKSRsb2cyRm9sZENoYW5nZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxudGVtcERvd24gPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA8IDApXG4gXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG5wczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjJcXCksIDUpXG5wczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cbnBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wRG93biwgYWVzKHggPSBwc092ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjRDlEOUQ5XFwsIFxcI0JGQkZCRlxcLCBcXCNBNkE2QTZcXCwgXFwjOEM4QzhDXFwsIFxcIzczNzM3M1xcKSkgKyAjIEZpdmUgc2hhZGVzIG9mIGdyZXlcbiAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwc092ZXIpLCBcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkFcbiAgKSArIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxsb2cyKGZvbGQgY2hhbmdlKVxcKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLFxuICAgIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKStcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gLTAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMwNDogXFwsIGNvbnZQdmFsdWUocHMwNCksIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDIpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0xLCAwKSlcbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfYmFycGxvdF9wcEdyb3VwX2RUQUdfdnNfRE1TT19kb3duXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxKSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cblxudGVtcFVwIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPiAwKVxuIFxucHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjJcXCksIDUpXG5wczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXIzXFwpLCA1KVxucHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxuXG5cblxucCA8LSBnZ3Bsb3QodGVtcFVwLCBhZXMoeCA9IHBzT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCNEOUQ5RDlcXCwgXFwjQkZCRkJGXFwsIFxcI0E2QTZBNlxcLCBcXCM4QzhDOENcXCwgXFwjNzM3MzczXFwpKSArICMgRml2ZSBzaGFkZXMgb2YgZ3JleVxuICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIFxuICAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQVxuICApICsgdGhlbWVfY2xhc3NpYygpICsgbGFicyh4ID0gTlVMTCAsIHkgPSBcXGxvZzIoZm9sZCBjaGFuZ2UpXFwpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IHBzT3ZlciksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsXG4gICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLjUsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsIGNvbnZQdmFsdWUocHMxNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAyKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSlcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BwR3JvdXBfZFRBR192c19ETVNPX3VwXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMS4xOCkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKGFic0xvZzJGQyA9IGFicyhsb2cyRm9sZENoYW5nZSkpXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGFic0xvZzJGQywgY29sb3IgPSBwc092ZXIpKSArXG5zY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gKHJldihjKFxcIzc3Nzc3N1xcLCBcXCM4QjdFNjVcXCwgXFwjQTI4NDUyXFwsIFxcI0MyODg0RFxcLCBcXCNGMjhFMkNcXCkpKSkgK1xuICBzdGF0X2VjZGYoc2l6ZSA9IDAuNCwgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwgKSArICMgVXNlIHN0YXRfZWNkZiB0byBwbG90IHRoZSBlbXBpcmljYWwgQ0RGXG4gIGxhYnMoXG4gICAgeCA9IFxcQWJzLiBsb2cyKGZvbGQgY2hhbmdlKVxcLFxuICAgIHkgPSBcXEN1bXVsYXRpdmUgUHJvYmFiaWxpdHlcXFxuICApICsgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDEuNSkpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgIyBDbGVhbiB0aGVtZVxuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDAuMSkpXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfY2RmX3BwR3JvdXBfZFRBR192c19ETVNPXFwpXG53aWR0aCA8LSAzMyptbVRvSW5jaFxuaGVpZ2h0IDwtMzMqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbiNcbiBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJGxvZzJGb2xkQ2hhbmdlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG50ZW1wRG93biA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlIDwgMClcbiBcbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcblxucHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KHRlbXBEb3duLCBhZXMoeCA9IHBzT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCNEOUQ5RDlcXCwgXFwjQkZCRkJGXFwsIFxcI0E2QTZBNlxcLCBcXCM4QzhDOENcXCwgXFwjNzM3MzczXFwpKSArICMgRml2ZSBzaGFkZXMgb2YgZ3JleVxuICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIFxuICAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQVxuICApICsgdGhlbWVfY2xhc3NpYygpICsgbGFicyh4ID0gTlVMTCAsIHkgPSBcXGxvZzIoZm9sZCBjaGFuZ2UpXFwpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IHBzT3ZlciksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsXG4gICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAtMC41LCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEsIDApKVxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BwR3JvdXBfZFRBR192c19ETVNPX2Rvd25cXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG50ZW1wVXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA+IDApXG4gXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxucHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5cblxuXG5wIDwtIGdncGxvdCh0ZW1wVXAsIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIFxuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICsgIyBGaXZlIHNoYWRlcyBvZiBncmV5XG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BXG4gICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFxcbG9nMihmb2xkIGNoYW5nZSlcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMwNDogXFwsIGNvbnZQdmFsdWUocHMwNCksIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDIpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEpKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcHBHcm91cF9kVEFHX3ZzX0RNU09fdXBcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjE4KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxKSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
temp <- temp %>% dplyr::mutate(absLog2FC = abs(log2FoldChange))
p <- ggplot(temp, aes(x = absLog2FC, color = psOver)) +
scale_color_manual(values = (rev(c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\)))) +
  stat_ecdf(size = 0.4, linewidth = lineMedium * mmToLineUnit, lineend = \square\ ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Abs. log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.position = \none\,
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    ) + scale_y_continuous(labels = scales::number_format(accuracy = 0.1))
fileName <- paste0(\log2FC_cdf_ppGroup_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



#
 getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(psOver ==group1) )$log2FoldChange
  distance2 <- (data %>% dplyr::filter(psOver ==group2) )$log2FoldChange
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
 
ps01 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(tempDown, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver4\), 5)

ps04 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver4\), 5)


p <- ggplot(tempDown, aes(x = psOver, y = log2FoldChange)) + 
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) + # Five shades of grey
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \log2(fold change)\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = -0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) + coord_cartesian(ylim = c(-1, 0))
  
fileName <- paste0(\log2FC_barplot_ppGroup_dTAG_vs_DMSO_down\)
width <- panelSize(1.2)*mmToInch
height <- panelSize(1)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
 
ps01 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver1\), 5)
ps12 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver2\), 5)
ps23 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver3\), 5)
ps34 <- round(getPvalWilcox(tempUp, \psOver3\, \psOver4\), 5)
ps24 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver4\), 5)
ps14 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver4\), 5)
ps04 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver4\), 5)




p <- ggplot(tempUp, aes(x = psOver, y = log2FoldChange)) + 
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) + # Five shades of grey
  geom_violin(aes(fill = psOver), 
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \log2(fold change)\) +
  stat_summary(
    aes(group = psOver), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_ppGroup_dTAG_vs_DMSO_up\)
width <- panelSize(1.18)*mmToInch
height <- panelSize(1)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### loop score

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlNakl5TWpJeU1qWEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnYkc5aFpFeHZiM0JCYm01dlJHRjBZU2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYM0F0Ymw5bGJuTmxiV0pzVEdsemRDNTBjM1pjSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVdabVEzVjBiMlptSUQwZ01DNHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaGJtNXZUR2x6ZENBOUlHTW9YQ0pRTFZCY0lpd2dYQ0pRTFVWY0lpd2dYQ0pRTFZOY0lpd2dYQ0pRTFZoY0lpa3BKVDRsSUZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dScGMzUmhibU5sSUQwZ2MzUmhjblF5SUMwZ2MzUmhjblF4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCbFlXdEpSQ0E5SUhCaGMzUmxLR05vY205dE1Td2djM1JoY25ReExDQnpkR0Z5ZERJc0lITmxjQ0E5SUZ3aVgxd2lLU2xjYmx4dVhHNGpJSFJsYlhBeVhHNGpZMkZzWTNWc1lYUnBibWNnWkdsbVppQnpZMjl5WlNCaGJtUWdiRzluTW1aaklHUnBjM1J5YVdKMWRHbHZiaUJpWVhObFpDQnZiaUJ3TFc0Z2JuVnRZbVZ5YzF4dWRHVnRjRElnUEMwZ2NtVmhaRkpFVXlob1pYSmxLSEpsYzNWc2RFUnBjaXdnWENKblpXNWxYMnh2YjNCZmJHbHVhMTlCTkRnMUxuSmtjMXdpS1NsY2JseHVjRzVQZG1WeU9DQThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9kRzkwWVd3Z1BqMGdPQ2twSkdkbGJtVmNibkJ1VDNabGNqWWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSFJ2ZEdGc0lENDlJRFlzSUhSdmRHRnNJRHdnT0NrcEpHZGxibVZjYm5CdVQzWmxjalFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hSdmRHRnNJRDQ5SURRc0lIUnZkR0ZzSUR3Z05pa3BKR2RsYm1WY2JuQnVUM1psY2pJZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIUnZkR0ZzSUQ0OUlESXNJSFJ2ZEdGc0lEd2dOQ2twSkdkbGJtVmNibkJ1VDNabGNqQWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSFJ2ZEdGc0lEd2dNaWtwSkdkbGJtVmNibHh1WEc1Y2JpTWpJRVJwZG1sa2FXNW5JR2RsYm1WeklHbHVkRzhnWjNKdmRYQnpYRzUwWlcxd0lEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoa2FXWm1YMEUwT0RWZlJFMVRUeXdnWkdsemRHRnVZMlVzSUdkbGJtVXBJQ1UrSlNCY2JpQWdkVzV1WlhOMEtHZGxibVVwSUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0cxbFlXNWZaR2xtWmw5elkyOXlaU0E5SUcxbFlXNG9aR2xtWmw5Qk5EZzFYMFJOVTA4cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnYldWaGJsOWthWE4wWVc1alpTQTlJRzFsWVc0b1pHbHpkR0Z1WTJVcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnTG1keWIzVndjeUE5SUNka2NtOXdKeWxjYmx4dVpHbG1aaTVTVGtFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWkdsbVpsOUhNUzVCTkRnMUxuTmxiR1ZqZEdWa01sOUhNUzR5YVM1Qk5EZzFYM1p6WDBjeExqSnBMa1JOVTA4dWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGxibk5sYldKc1gyZGxibVZmYVdRc0lHeHZaekpHYjJ4a1EyaGhibWRsTENCemFISnBibXRsWkY5c2IyY3lSa01zSUhCaFpHb3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU2xjYmx4dWJXRjRURzluTWtaRElEMGdNbHh1WEc1MFpXMXdJRHd0SUd4bFpuUmZhbTlwYmloMFpXMXdMQ0JrYVdabUxsSk9RU3dnWW5rZ1BTQmpLRndpWjJWdVpWd2lJRDBnWENKbGJuTmxiV0pzWDJkbGJtVmZhV1JjSWlrcElDVStKU0JjYmlBZ1pISnZjRjl1WVNoemFISnBibXRsWkY5c2IyY3lSa01wWEc1Y2JuUmxiWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hjYmlBZ2NHNVBkbVZ5SUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCd2JrOTJaWEk0TENCY0luQnVUM1psY2poY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjRzVQZG1WeU5pd2dYQ0p3Yms5MlpYSTJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3Yms5MlpYSTBMQ0JjSW5CdVQzWmxjalJjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3Yms5MlpYSXlMQ0JjSW5CdVQzWmxjakpjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjRzVQZG1WeU1Dd2dYQ0p3Yms5MlpYSXdYQ0lzSUU1QktTa3BLU2twSUNVK0pWeHVJQ0JrY205d1gyNWhLSEJ1VDNabGNpbGNibUJnWUNKOSAtLT5cblxuYGBgclxuIyMjIyMjIyMjIyMjXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgIHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSlcblxuXG4jIHRlbXAyXG4jY2FsY3VsYXRpbmcgZGlmZiBzY29yZSBhbmQgbG9nMmZjIGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiBwLW4gbnVtYmVyc1xudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGlua19BNDg1LnJkc1xcKSlcblxucG5PdmVyOCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gOCkpJGdlbmVcbnBuT3ZlcjYgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDYsIHRvdGFsIDwgOCkpJGdlbmVcbnBuT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDQsIHRvdGFsIDwgNikpJGdlbmVcbnBuT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDIsIHRvdGFsIDwgNCkpJGdlbmVcbnBuT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsIDwgMikpJGdlbmVcblxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9BNDg1X0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcblxubWF4TG9nMkZDID0gMlxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShcbiAgcG5PdmVyID0gaWZlbHNlKGdlbmUgJWluJSBwbk92ZXI4LCBcXHBuT3ZlcjhcXCxcbiAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyNiwgXFxwbk92ZXI2XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwbk92ZXI0LCBcXHBuT3ZlcjRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwbk92ZXIyLCBcXHBuT3ZlcjJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyMCwgXFxwbk92ZXIwXFwsIE5BKSkpKSkpICU+JVxuICBkcm9wX25hKHBuT3ZlcilcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
############
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))


# temp2
#calculating diff score and log2fc distribution based on p-n numbers
temp2 <- readRDS(here(resultDir, \gene_loop_link_A485.rds\))

pnOver8 <- (temp2 %>% dplyr::filter(total >= 8))$gene
pnOver6 <- (temp2 %>% dplyr::filter(total >= 6, total < 8))$gene
pnOver4 <- (temp2 %>% dplyr::filter(total >= 4, total < 6))$gene
pnOver2 <- (temp2 %>% dplyr::filter(total >= 2, total < 4))$gene
pnOver0 <- (temp2 %>% dplyr::filter(total < 2))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)

temp <- temp %>% dplyr::mutate(
  pnOver = ifelse(gene %in% pnOver8, \pnOver8\,
                  ifelse(gene %in% pnOver6, \pnOver6\,
                         ifelse(gene %in% pnOver4, \pnOver4\,
                                ifelse(gene %in% pnOver2, \pnOver2\,
                                       ifelse(gene %in% pnOver0, \pnOver0\, NA)))))) %>%
  drop_na(pnOver)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeU1qSXlNakl5TWpYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gzQXRibDlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptUTNWMGIyWm1JRDBnTUM0eUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hGeFFMVkJjWEN3Z1hGeFFMVVZjWEN3Z1hGeFFMVk5jWEN3Z1hGeFFMVmhjWENrcEpUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJsWVd0SlJDQTlJSEJoYzNSbEtHTm9jbTl0TVN3Z2MzUmhjblF4TENCemRHRnlkRElzSUhObGNDQTlJRnhjWDF4Y0tTbGNibHh1WEc0aklIUmxiWEF5WEc0alkyRnNZM1ZzWVhScGJtY2daR2xtWmlCelkyOXlaU0JoYm1RZ2JHOW5NbVpqSUdScGMzUnlhV0oxZEdsdmJpQmlZWE5sWkNCdmJpQndMVzRnYm5WdFltVnljMXh1ZEdWdGNESWdQQzBnY21WaFpGSkVVeWhvWlhKbEtISmxjM1ZzZEVScGNpd2dYRnhuWlc1bFgyeHZiM0JmYkdsdWExOUJORGcxTG5Ka2MxeGNLU2xjYmx4dWNHNVBkbVZ5T0NBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2RHOTBZV3dnUGowZ09Da3BKR2RsYm1WY2JuQnVUM1psY2pZZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIUnZkR0ZzSUQ0OUlEWXNJSFJ2ZEdGc0lEd2dPQ2twSkdkbGJtVmNibkJ1VDNabGNqUWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSFJ2ZEdGc0lENDlJRFFzSUhSdmRHRnNJRHdnTmlrcEpHZGxibVZjYm5CdVQzWmxjaklnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hSdmRHRnNJRDQ5SURJc0lIUnZkR0ZzSUR3Z05Da3BKR2RsYm1WY2JuQnVUM1psY2pBZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIUnZkR0ZzSUR3Z01pa3BKR2RsYm1WY2JseHVYRzVjYmlNaklFUnBkbWxrYVc1bklHZGxibVZ6SUdsdWRHOGdaM0p2ZFhCelhHNTBaVzF3SUR3dElHZGxibVZCYm01dlJHRjBZU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hrYVdabVgwRTBPRFZmUkUxVFR5d2daR2x6ZEdGdVkyVXNJR2RsYm1VcElDVStKU0JjYmlBZ2RXNXVaWE4wS0dkbGJtVXBJQ1UrSlNCbmNtOTFjRjlpZVNoblpXNWxLU0FsUGlWY2JpQWdjM1Z0YldGeWFYcGxLRzFsWVc1ZlpHbG1abDl6WTI5eVpTQTlJRzFsWVc0b1pHbG1abDlCTkRnMVgwUk5VMDhwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdiV1ZoYmw5a2FYTjBZVzVqWlNBOUlHMWxZVzRvWkdsemRHRnVZMlVwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdMbWR5YjNWd2N5QTlJQ2RrY205d0p5bGNibHh1WkdsbVppNVNUa0VnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaR2xtWmw5SE1TNUJORGcxTG5ObGJHVmpkR1ZrTWw5SE1TNHlhUzVCTkRnMVgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibHh1YldGNFRHOW5Na1pESUQwZ01seHVYRzUwWlcxd0lEd3RJR3hsWm5SZmFtOXBiaWgwWlcxd0xDQmthV1ptTGxKT1FTd2dZbmtnUFNCaktGeGNaMlZ1WlZ4Y0lEMGdYRnhsYm5ObGJXSnNYMmRsYm1WZmFXUmNYQ2twSUNVK0pTQmNiaUFnWkhKdmNGOXVZU2h6YUhKcGJtdGxaRjlzYjJjeVJrTXBYRzVjYm5SbGJYQWdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnY0c1UGRtVnlJRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3Yms5MlpYSTRMQ0JjWEhCdVQzWmxjamhjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NHNVBkbVZ5Tml3Z1hGeHdiazkyWlhJMlhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndiazkyWlhJMExDQmNYSEJ1VDNabGNqUmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndiazkyWlhJeUxDQmNYSEJ1VDNabGNqSmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NHNVBkbVZ5TUN3Z1hGeHdiazkyWlhJd1hGd3NJRTVCS1NrcEtTa3BJQ1UrSlZ4dUlDQmtjbTl3WDI1aEtIQnVUM1psY2lsY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbiMjIyMjIyMjIyMjI1xuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICBwZWFrSUQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSBcXF9cXCkpXG5cblxuIyB0ZW1wMlxuI2NhbGN1bGF0aW5nIGRpZmYgc2NvcmUgYW5kIGxvZzJmYyBkaXN0cmlidXRpb24gYmFzZWQgb24gcC1uIG51bWJlcnNcbnRlbXAyIDwtIHJlYWRSRFMoaGVyZShyZXN1bHREaXIsIFxcZ2VuZV9sb29wX2xpbmtfQTQ4NS5yZHNcXCkpXG5cbnBuT3ZlcjggPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDgpKSRnZW5lXG5wbk92ZXI2IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSA2LCB0b3RhbCA8IDgpKSRnZW5lXG5wbk92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSA0LCB0b3RhbCA8IDYpKSRnZW5lXG5wbk92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSAyLCB0b3RhbCA8IDQpKSRnZW5lXG5wbk92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA8IDIpKSRnZW5lXG5cblxuXG4jIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwc1xudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfQTQ4NV9ETVNPKSxcbiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSxcbiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5cbm1heExvZzJGQyA9IDJcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRyb3BfbmEoc2hyaW5rZWRfbG9nMkZDKVxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHBuT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcG5PdmVyOCwgXFxwbk92ZXI4XFwsXG4gICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBuT3ZlcjYsIFxccG5PdmVyNlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyNCwgXFxwbk92ZXI0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyMiwgXFxwbk92ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBuT3ZlcjAsIFxccG5PdmVyMFxcLCBOQSkpKSkpKSAlPiVcbiAgZHJvcF9uYShwbk92ZXIpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyMjIyMjIyMjXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgIHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSlcblxuXG4jIHRlbXAyXG4jY2FsY3VsYXRpbmcgZGlmZiBzY29yZSBhbmQgbG9nMmZjIGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiBwLW4gbnVtYmVyc1xudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGlua19BNDg1LnJkc1xcKSlcblxucG5PdmVyOCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gOCkpJGdlbmVcbnBuT3ZlcjYgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDYsIHRvdGFsIDwgOCkpJGdlbmVcbnBuT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDQsIHRvdGFsIDwgNikpJGdlbmVcbnBuT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDIsIHRvdGFsIDwgNCkpJGdlbmVcbnBuT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsIDwgMikpJGdlbmVcblxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9BNDg1X0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcblxubWF4TG9nMkZDID0gMlxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShcbiAgcG5PdmVyID0gaWZlbHNlKGdlbmUgJWluJSBwbk92ZXI4LCBcXHBuT3ZlcjhcXCxcbiAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyNiwgXFxwbk92ZXI2XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwbk92ZXI0LCBcXHBuT3ZlcjRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwbk92ZXIyLCBcXHBuT3ZlcjJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyMCwgXFxwbk92ZXIwXFwsIE5BKSkpKSkpICU+JVxuICBkcm9wX25hKHBuT3ZlcilcbmBgYFxuYGBgIn0= -->

```r
```r
############
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))


# temp2
#calculating diff score and log2fc distribution based on p-n numbers
temp2 <- readRDS(here(resultDir, \gene_loop_link_A485.rds\))

pnOver8 <- (temp2 %>% dplyr::filter(total >= 8))$gene
pnOver6 <- (temp2 %>% dplyr::filter(total >= 6, total < 8))$gene
pnOver4 <- (temp2 %>% dplyr::filter(total >= 4, total < 6))$gene
pnOver2 <- (temp2 %>% dplyr::filter(total >= 2, total < 4))$gene
pnOver0 <- (temp2 %>% dplyr::filter(total < 2))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)

temp <- temp %>% dplyr::mutate(
  pnOver = ifelse(gene %in% pnOver8, \pnOver8\,
                  ifelse(gene %in% pnOver6, \pnOver6\,
                         ifelse(gene %in% pnOver4, \pnOver4\,
                                ifelse(gene %in% pnOver2, \pnOver2\,
                                       ifelse(gene %in% pnOver0, \pnOver0\, NA)))))) %>%
  drop_na(pnOver)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### log2FC

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJIVDJacFowUnBjaUE4TFNCb1pYSmxLR1pwWjBScGNpd2dYQ0l1TGk5SFQxd2lLVnh1SXlCblpYUkhUeWhjSW5CdVQzWmxjamhjSWl3Z1IwOW1hV2RFYVhJc0lIQnVUM1psY2pncFhHNGpJR2RsZEVkUEtGd2ljRzVQZG1WeU5sd2lMQ0JIVDJacFowUnBjaXdnY0c1UGRtVnlOaWxjYmlNZ1oyVjBSMDhvWENKd2JrOTJaWEkwWENJc0lFZFBabWxuUkdseUxDQndiazkyWlhJMEtWeHVJeUJuWlhSSFR5aGNJbkJ1VDNabGNqSmNJaXdnUjA5bWFXZEVhWElzSUhCdVQzWmxjaklwWEc0aklHZGxkRWRQS0Z3aWNHNVBkbVZ5TUZ3aUxDQkhUMlpwWjBScGNpd2djRzVQZG1WeU1DbGNiaU1nWEc0aklDTWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJMXh1SXlCSFR6QXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hsYm5KcFkyaEhUeWhuWlc1bElEMGdjRzVQZG1WeU1Dd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY0lrVk9VMFZOUWt4Y0lpd2diMjUwSUQwZ1hDSkNVRndpS1NsY2JpTWdSMDh5TG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCdVQzWmxjaklzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYQ0pGVGxORlRVSk1YQ0lzSUc5dWRDQTlJRndpUWxCY0lpa3BYRzRqSUVkUE5DNWtaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLR1Z1Y21samFFZFBLR2RsYm1VZ1BTQndiazkyWlhJMExDQlBjbWRFWWlBOUlHOXlaeTVOYlM1bFp5NWtZaXdnYTJWNVZIbHdaU0E5SUZ3aVJVNVRSVTFDVEZ3aUxDQnZiblFnUFNCY0lrSlFYQ0lwS1Z4dUl5QkhUell1WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNobGJuSnBZMmhIVHloblpXNWxJRDBnY0c1UGRtVnlOaXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUtTbGNiaU1nUjA4NExtUm1JRHd0SUdGekxtUmhkR0V1Wm5KaGJXVW9aVzV5YVdOb1IwOG9aMlZ1WlNBOUlIQnVUM1psY2pnc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWENKRlRsTkZUVUpNWENJc0lHOXVkQ0E5SUZ3aVFsQmNJaWtwWEc0aklGeHVJeUJjYmlNZ2MzVmljMlYwTUNBOExTQkhUekF1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGd2ljRzVQZG1WeU1Gd2lLU0FsUGlWY2JpTWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJeUFnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGpJQ0FnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjSWk5Y0lseHVJeUFnSUNBZ0lDQndZWEowY3lBOExTQjFibXhwYzNRb2MzUnljM0JzYVhRb2VDd2dYQ0l2WENJcEtWeHVJeUFnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaU1nSUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJeUFnSUNBZ2ZTbGNiaU1nSUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNiaU1nYzNWaWMyVjBNaUE4TFNCSFR6SXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ3aWNHNVBkbVZ5TWx3aUtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNJaTljSWx4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hDSXZYQ0lwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdjM1ZpYzJWME5DQThMU0JIVHpRdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRndpY0c1UGRtVnlORndpS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SXlBZ0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRqSUNBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY0lpOWNJbHh1SXlBZ0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWENJdlhDSXBLVnh1SXlBZ0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlNZ0lDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SXlBZ0lDQWdmU2xjYmlNZ0lDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmlNZ2MzVmljMlYwTmlBOExTQkhUell1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGd2ljRzVQZG1WeU5sd2lLU0FsUGlWY2JpTWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJeUFnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGpJQ0FnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjSWk5Y0lseHVJeUFnSUNBZ0lDQndZWEowY3lBOExTQjFibXhwYzNRb2MzUnljM0JzYVhRb2VDd2dYQ0l2WENJcEtWeHVJeUFnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaU1nSUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJeUFnSUNBZ2ZTbGNiaU1nSUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNiaU1nYzNWaWMyVjBPQ0E4TFNCSFR6Z3VaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ3aWNHNVBkbVZ5T0Z3aUtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNJaTljSWx4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hDSXZYQ0lwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdYRzRqSUZ4dUl5QkhUMnhwYzNRZ1BDMGdabUZqZEc5eUtHTW9YQ0pIVHpvd01EQTJNemszWENJc0lGd2lSMDg2TURBd09ETTRNRndpTENCY0lrZFBPakF3TWpJMk1UTmNJaXdnWENKSFR6b3dNRE0wTkRjd1hDSXNYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lrZFBPakF3TVRZd05UVmNJaXdnWENKSFR6b3dNREEzTXpnNVhDSXNJRndpUjA4Nk1EQTBPRFUyTWx3aUxDQmNJa2RQT2pBd05EVXhOalZjSWl3Z1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWtkUE9qQXdOekl3TURGY0lpd2dYQ0pIVHpvd01EQTNOVEUzWENJc0lGd2lSMDg2TURBME9EY3dOVndpS1NsY2JpTWdYRzRqSUdSaGRHRWdQQzBnWW1sdVpGOXliM2R6S0dKcGJtUmZjbTkzY3loaWFXNWtYM0p2ZDNNb2MzVmljMlYwTUN3Z2MzVmljMlYwTWlrc0lITjFZbk5sZERRcExDQnpkV0p6WlhRNEtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0VsRUlDVnBiaVVnUjA5c2FYTjBLVnh1SXlCY2JpTWdjQ0E4TFNCblozQnNiM1FvWkdGMFlTd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJRVJsYzJOeWFYQjBhVzl1TENCamIyeHZjaUE5SUhBdVlXUnFkWE4wTENCemFYcGxJRDBnWjNJcEtTQXJJRnh1SXlBZ0lHZGxiMjFmY0c5cGJuUW9LU0FySUhSb1pXMWxYMkozS0NrZ0sxeHVJeUFnSUhOallXeGxYMk52Ykc5eVgyZHlZV1JwWlc1MEtHeHZkeUE5SUZ3aWNtVmtYQ0lzSUdocFoyZ2dQU0JjSW1Kc2RXVmNJaXdnYkdsdGFYUnpJRDBnWXlnd0xDQXdMakExS1NrZ0sxeHVJeUFnSUhOallXeGxYM05wZW1WZlkyOXVkR2x1ZFc5MWN5aHlZVzVuWlNBOUlHTW9NQ3dnTXlrcElDdGNiaU1nSUNCc1lXSnpLSGdnUFNCT1ZVeE1MQ0I1SUQwZ1RsVk1UQ2tnSzF4dUl5QWdJSFJvWlcxbEtHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTmlrc0lDQWpJRk5sZENCaGVHbHpJSFJsZUhRZ2MybDZaVnh1SXlBZ0lDQWdJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFlwTENBaklGTmxkQ0JoZUdseklIUnBkR3hsSUhOcGVtVWdLR2xtSUc1dmRDQnlaVzF2ZG1Wa0tWeHVJeUFnSUNBZ0lDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTJLU3dnSXlCVFpYUWdiR1ZuWlc1a0lIUmxlSFFnYzJsNlpWeHVJeUFnSUNBZ0lDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOaWtwSUZ4dUl5QmNiaU1nWm1sc1pVNWhiV1VnUEMwZ2FHVnlaU2htYVdkRWFYSXNJRndpTGk1Y0lpd2dYQ0pIVDF3aUxDQmNJa2RQWDJkeWIzVndjMTl3Ymx3aUtWeHVJeUJvWldsbmFIUWdQU0F5WEc0aklIZHBaSFJvSUQwZ015NHpYRzRqSUhOMloyeHBkR1VvY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaU1nY0hKcGJuUW9jQ2xjYmlNZ1pHVjJMbTltWmlncFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuIyBHT2ZpZ0RpciA8LSBoZXJlKGZpZ0RpciwgXFwuLi9HT1xcKVxuIyBnZXRHTyhcXHBuT3ZlcjhcXCwgR09maWdEaXIsIHBuT3ZlcjgpXG4jIGdldEdPKFxccG5PdmVyNlxcLCBHT2ZpZ0RpciwgcG5PdmVyNilcbiMgZ2V0R08oXFxwbk92ZXI0XFwsIEdPZmlnRGlyLCBwbk92ZXI0KVxuIyBnZXRHTyhcXHBuT3ZlcjJcXCwgR09maWdEaXIsIHBuT3ZlcjIpXG4jIGdldEdPKFxccG5PdmVyMFxcLCBHT2ZpZ0RpciwgcG5PdmVyMClcbiMgXG4jICMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBHTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcG5PdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBuT3ZlcjIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBHTzYuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcG5PdmVyNiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR084LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBuT3ZlcjgsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIFxuIyBcbiMgc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyMFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyMlxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyNFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0NiA8LSBHTzYuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyNlxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0OCA8LSBHTzguZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyOFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgXG4jIFxuIyBHT2xpc3QgPC0gZmFjdG9yKGMoXFxHTzowMDA2Mzk3XFwsIFxcR086MDAwODM4MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDM0NDcwXFwsXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwMTYwNTVcXCwgXFxHTzowMDA3Mzg5XFwsIFxcR086MDA0ODU2MlxcLCBcXEdPOjAwNDUxNjVcXCwgXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwNzIwMDFcXCwgXFxHTzowMDA3NTE3XFwsIFxcR086MDA0ODcwNVxcKSlcbiMgXG4jIGRhdGEgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhiaW5kX3Jvd3Moc3Vic2V0MCwgc3Vic2V0MiksIHN1YnNldDQpLCBzdWJzZXQ4KSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuIyBcbiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IERlc2NyaXB0aW9uLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIFxuIyAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgK1xuIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsdWVcXCwgbGltaXRzID0gYygwLCAwLjA1KSkgK1xuIyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICtcbiMgICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuIyAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuIyAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuIyAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuIyBcbiMgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc19wblxcKVxuIyBoZWlnaHQgPSAyXG4jIHdpZHRoID0gMy4zXG4jIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# GOfigDir <- here(figDir, \../GO\)
# getGO(\pnOver8\, GOfigDir, pnOver8)
# getGO(\pnOver6\, GOfigDir, pnOver6)
# getGO(\pnOver4\, GOfigDir, pnOver4)
# getGO(\pnOver2\, GOfigDir, pnOver2)
# getGO(\pnOver0\, GOfigDir, pnOver0)
# 
# #####################
# GO0.df <- as.data.frame(enrichGO(gene = pnOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO2.df <- as.data.frame(enrichGO(gene = pnOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO4.df <- as.data.frame(enrichGO(gene = pnOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO6.df <- as.data.frame(enrichGO(gene = pnOver6, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO8.df <- as.data.frame(enrichGO(gene = pnOver8, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# 
# 
# subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver0\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver2\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver4\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset6 <- GO6.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver6\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset8 <- GO8.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver8\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# 
# 
# GOlist <- factor(c(\GO:0006397\, \GO:0008380\, \GO:0022613\, \GO:0034470\,
#                    \GO:0016055\, \GO:0007389\, \GO:0048562\, \GO:0045165\, 
#                    \GO:0072001\, \GO:0007517\, \GO:0048705\))
# 
# data <- bind_rows(bind_rows(bind_rows(subset0, subset2), subset4), subset8) %>%
#   dplyr::filter(ID %in% GOlist)
# 
# p <- ggplot(data, aes(x = group, y = Description, color = p.adjust, size = gr)) + 
#   geom_point() + theme_bw() +
#   scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
#   scale_size_continuous(range = c(0, 3)) +
#   labs(x = NULL, y = NULL) +
#   theme(axis.text = element_text(size = 6),  # Set axis text size
#         axis.title = element_text(size = 6), # Set axis title size (if not removed)
#         legend.text = element_text(size = 6), # Set legend text size
#         legend.title = element_text(size = 6)) 
# 
# fileName <- here(figDir, \..\, \GO\, \GO_groups_pn\)
# height = 2
# width = 3.3
# svglite(paste0(fileName, \.svg\), height = height, width = width)
# print(p)
# dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkhUMlpwWjBScGNpQThMU0JvWlhKbEtHWnBaMFJwY2l3Z1hGd3VMaTlIVDF4Y0tWeHVJeUJuWlhSSFR5aGNYSEJ1VDNabGNqaGNYQ3dnUjA5bWFXZEVhWElzSUhCdVQzWmxjamdwWEc0aklHZGxkRWRQS0Z4Y2NHNVBkbVZ5Tmx4Y0xDQkhUMlpwWjBScGNpd2djRzVQZG1WeU5pbGNiaU1nWjJWMFIwOG9YRnh3Yms5MlpYSTBYRndzSUVkUFptbG5SR2x5TENCd2JrOTJaWEkwS1Z4dUl5Qm5aWFJIVHloY1hIQnVUM1psY2pKY1hDd2dSMDltYVdkRWFYSXNJSEJ1VDNabGNqSXBYRzRqSUdkbGRFZFBLRnhjY0c1UGRtVnlNRnhjTENCSFQyWnBaMFJwY2l3Z2NHNVBkbVZ5TUNsY2JpTWdYRzRqSUNNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakkxeHVJeUJIVHpBdVpHWWdQQzBnWVhNdVpHRjBZUzVtY21GdFpTaGxibkpwWTJoSFR5aG5aVzVsSUQwZ2NHNVBkbVZ5TUN3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjWEVWT1UwVk5Ra3hjWEN3Z2IyNTBJRDBnWEZ4Q1VGeGNLU2xjYmlNZ1IwOHlMbVJtSUR3dElHRnpMbVJoZEdFdVpuSmhiV1VvWlc1eWFXTm9SMDhvWjJWdVpTQTlJSEJ1VDNabGNqSXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hGeEZUbE5GVFVKTVhGd3NJRzl1ZENBOUlGeGNRbEJjWENrcFhHNGpJRWRQTkM1a1ppQThMU0JoY3k1a1lYUmhMbVp5WVcxbEtHVnVjbWxqYUVkUEtHZGxibVVnUFNCd2JrOTJaWEkwTENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRnhjUlU1VFJVMUNURnhjTENCdmJuUWdQU0JjWEVKUVhGd3BLVnh1SXlCSFR6WXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hsYm5KcFkyaEhUeWhuWlc1bElEMGdjRzVQZG1WeU5pd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjS1NsY2JpTWdSMDg0TG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCdVQzWmxjamdzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYRnhGVGxORlRVSk1YRndzSUc5dWRDQTlJRnhjUWxCY1hDa3BYRzRqSUZ4dUl5QmNiaU1nYzNWaWMyVjBNQ0E4TFNCSFR6QXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ4Y2NHNVBkbVZ5TUZ4Y0tTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNYQzljWEZ4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hGd3ZYRndwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdjM1ZpYzJWME1pQThMU0JIVHpJdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRnhjY0c1UGRtVnlNbHhjS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SXlBZ0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRqSUNBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY1hDOWNYRnh1SXlBZ0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWEZ3dlhGd3BLVnh1SXlBZ0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlNZ0lDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SXlBZ0lDQWdmU2xjYmlNZ0lDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmlNZ2MzVmljMlYwTkNBOExTQkhUelF1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGeGNjRzVQZG1WeU5GeGNLU0FsUGlWY2JpTWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJeUFnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGpJQ0FnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjWEM5Y1hGeHVJeUFnSUNBZ0lDQndZWEowY3lBOExTQjFibXhwYzNRb2MzUnljM0JzYVhRb2VDd2dYRnd2WEZ3cEtWeHVJeUFnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaU1nSUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJeUFnSUNBZ2ZTbGNiaU1nSUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNiaU1nYzNWaWMyVjBOaUE4TFNCSFR6WXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ4Y2NHNVBkbVZ5Tmx4Y0tTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNYQzljWEZ4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hGd3ZYRndwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdjM1ZpYzJWME9DQThMU0JIVHpndVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRnhjY0c1UGRtVnlPRnhjS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SXlBZ0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRqSUNBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY1hDOWNYRnh1SXlBZ0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWEZ3dlhGd3BLVnh1SXlBZ0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlNZ0lDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SXlBZ0lDQWdmU2xjYmlNZ0lDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmlNZ1hHNGpJRnh1SXlCSFQyeHBjM1FnUEMwZ1ptRmpkRzl5S0dNb1hGeEhUem93TURBMk16azNYRndzSUZ4Y1IwODZNREF3T0RNNE1GeGNMQ0JjWEVkUE9qQXdNakkyTVROY1hDd2dYRnhIVHpvd01ETTBORGN3WEZ3c1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEVkUE9qQXdNVFl3TlRWY1hDd2dYRnhIVHpvd01EQTNNemc1WEZ3c0lGeGNSMDg2TURBME9EVTJNbHhjTENCY1hFZFBPakF3TkRVeE5qVmNYQ3dnWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRWRQT2pBd056SXdNREZjWEN3Z1hGeEhUem93TURBM05URTNYRndzSUZ4Y1IwODZNREEwT0Rjd05WeGNLU2xjYmlNZ1hHNGpJR1JoZEdFZ1BDMGdZbWx1WkY5eWIzZHpLR0pwYm1SZmNtOTNjeWhpYVc1a1gzSnZkM01vYzNWaWMyVjBNQ3dnYzNWaWMyVjBNaWtzSUhOMVluTmxkRFFwTENCemRXSnpaWFE0S1NBbFBpVmNiaU1nSUNCa2NHeDVjam82Wm1sc2RHVnlLRWxFSUNWcGJpVWdSMDlzYVhOMEtWeHVJeUJjYmlNZ2NDQThMU0JuWjNCc2IzUW9aR0YwWVN3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlFUmxjMk55YVhCMGFXOXVMQ0JqYjJ4dmNpQTlJSEF1WVdScWRYTjBMQ0J6YVhwbElEMGdaM0lwS1NBcklGeHVJeUFnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJSFJvWlcxbFgySjNLQ2tnSzF4dUl5QWdJSE5qWVd4bFgyTnZiRzl5WDJkeVlXUnBaVzUwS0d4dmR5QTlJRnhjY21Wa1hGd3NJR2hwWjJnZ1BTQmNYR0pzZFdWY1hDd2diR2x0YVhSeklEMGdZeWd3TENBd0xqQTFLU2tnSzF4dUl5QWdJSE5qWVd4bFgzTnBlbVZmWTI5dWRHbHVkVzkxY3loeVlXNW5aU0E5SUdNb01Dd2dNeWtwSUN0Y2JpTWdJQ0JzWVdKektIZ2dQU0JPVlV4TUxDQjVJRDBnVGxWTVRDa2dLMXh1SXlBZ0lIUm9aVzFsS0dGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOaWtzSUNBaklGTmxkQ0JoZUdseklIUmxlSFFnYzJsNlpWeHVJeUFnSUNBZ0lDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9jMmw2WlNBOUlEWXBMQ0FqSUZObGRDQmhlR2x6SUhScGRHeGxJSE5wZW1VZ0tHbG1JRzV2ZENCeVpXMXZkbVZrS1Z4dUl5QWdJQ0FnSUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBMktTd2dJeUJUWlhRZ2JHVm5aVzVrSUhSbGVIUWdjMmw2WlZ4dUl5QWdJQ0FnSUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3BJRnh1SXlCY2JpTWdabWxzWlU1aGJXVWdQQzBnYUdWeVpTaG1hV2RFYVhJc0lGeGNMaTVjWEN3Z1hGeEhUMXhjTENCY1hFZFBYMmR5YjNWd2MxOXdibHhjS1Z4dUl5Qm9aV2xuYUhRZ1BTQXlYRzRqSUhkcFpIUm9JRDBnTXk0elhHNGpJSE4yWjJ4cGRHVW9jR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpTWdjSEpwYm5Rb2NDbGNiaU1nWkdWMkxtOW1aaWdwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuIyBHT2ZpZ0RpciA8LSBoZXJlKGZpZ0RpciwgXFwuLi9HT1xcKVxuIyBnZXRHTyhcXHBuT3ZlcjhcXCwgR09maWdEaXIsIHBuT3ZlcjgpXG4jIGdldEdPKFxccG5PdmVyNlxcLCBHT2ZpZ0RpciwgcG5PdmVyNilcbiMgZ2V0R08oXFxwbk92ZXI0XFwsIEdPZmlnRGlyLCBwbk92ZXI0KVxuIyBnZXRHTyhcXHBuT3ZlcjJcXCwgR09maWdEaXIsIHBuT3ZlcjIpXG4jIGdldEdPKFxccG5PdmVyMFxcLCBHT2ZpZ0RpciwgcG5PdmVyMClcbiMgXG4jICMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBHTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcG5PdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBuT3ZlcjIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBHTzYuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcG5PdmVyNiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR084LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBuT3ZlcjgsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIFxuIyBcbiMgc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyMFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyMlxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyNFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0NiA8LSBHTzYuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyNlxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0OCA8LSBHTzguZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyOFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgXG4jIFxuIyBHT2xpc3QgPC0gZmFjdG9yKGMoXFxHTzowMDA2Mzk3XFwsIFxcR086MDAwODM4MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDM0NDcwXFwsXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwMTYwNTVcXCwgXFxHTzowMDA3Mzg5XFwsIFxcR086MDA0ODU2MlxcLCBcXEdPOjAwNDUxNjVcXCwgXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwNzIwMDFcXCwgXFxHTzowMDA3NTE3XFwsIFxcR086MDA0ODcwNVxcKSlcbiMgXG4jIGRhdGEgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhiaW5kX3Jvd3Moc3Vic2V0MCwgc3Vic2V0MiksIHN1YnNldDQpLCBzdWJzZXQ4KSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuIyBcbiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IERlc2NyaXB0aW9uLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIFxuIyAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgK1xuIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsdWVcXCwgbGltaXRzID0gYygwLCAwLjA1KSkgK1xuIyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICtcbiMgICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuIyAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuIyAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuIyAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuIyBcbiMgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc19wblxcKVxuIyBoZWlnaHQgPSAyXG4jIHdpZHRoID0gMy4zXG4jIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBHT2ZpZ0RpciA8LSBoZXJlKGZpZ0RpciwgXFwuLi9HT1xcKVxuIyBnZXRHTyhcXHBuT3ZlcjhcXCwgR09maWdEaXIsIHBuT3ZlcjgpXG4jIGdldEdPKFxccG5PdmVyNlxcLCBHT2ZpZ0RpciwgcG5PdmVyNilcbiMgZ2V0R08oXFxwbk92ZXI0XFwsIEdPZmlnRGlyLCBwbk92ZXI0KVxuIyBnZXRHTyhcXHBuT3ZlcjJcXCwgR09maWdEaXIsIHBuT3ZlcjIpXG4jIGdldEdPKFxccG5PdmVyMFxcLCBHT2ZpZ0RpciwgcG5PdmVyMClcbiMgXG4jICMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBHTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcG5PdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBuT3ZlcjIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBHTzYuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcG5PdmVyNiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR084LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBuT3ZlcjgsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIFxuIyBcbiMgc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyMFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyMlxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyNFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0NiA8LSBHTzYuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyNlxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0OCA8LSBHTzguZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccG5PdmVyOFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgXG4jIFxuIyBHT2xpc3QgPC0gZmFjdG9yKGMoXFxHTzowMDA2Mzk3XFwsIFxcR086MDAwODM4MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDM0NDcwXFwsXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwMTYwNTVcXCwgXFxHTzowMDA3Mzg5XFwsIFxcR086MDA0ODU2MlxcLCBcXEdPOjAwNDUxNjVcXCwgXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwNzIwMDFcXCwgXFxHTzowMDA3NTE3XFwsIFxcR086MDA0ODcwNVxcKSlcbiMgXG4jIGRhdGEgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhiaW5kX3Jvd3Moc3Vic2V0MCwgc3Vic2V0MiksIHN1YnNldDQpLCBzdWJzZXQ4KSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuIyBcbiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IERlc2NyaXB0aW9uLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIFxuIyAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgK1xuIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsdWVcXCwgbGltaXRzID0gYygwLCAwLjA1KSkgK1xuIyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICtcbiMgICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuIyAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuIyAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuIyAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuIyBcbiMgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc19wblxcKVxuIyBoZWlnaHQgPSAyXG4jIHdpZHRoID0gMy4zXG4jIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
# GOfigDir <- here(figDir, \../GO\)
# getGO(\pnOver8\, GOfigDir, pnOver8)
# getGO(\pnOver6\, GOfigDir, pnOver6)
# getGO(\pnOver4\, GOfigDir, pnOver4)
# getGO(\pnOver2\, GOfigDir, pnOver2)
# getGO(\pnOver0\, GOfigDir, pnOver0)
# 
# #####################
# GO0.df <- as.data.frame(enrichGO(gene = pnOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO2.df <- as.data.frame(enrichGO(gene = pnOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO4.df <- as.data.frame(enrichGO(gene = pnOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO6.df <- as.data.frame(enrichGO(gene = pnOver6, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO8.df <- as.data.frame(enrichGO(gene = pnOver8, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# 
# 
# subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver0\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver2\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver4\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset6 <- GO6.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver6\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset8 <- GO8.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \pnOver8\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# 
# 
# GOlist <- factor(c(\GO:0006397\, \GO:0008380\, \GO:0022613\, \GO:0034470\,
#                    \GO:0016055\, \GO:0007389\, \GO:0048562\, \GO:0045165\, 
#                    \GO:0072001\, \GO:0007517\, \GO:0048705\))
# 
# data <- bind_rows(bind_rows(bind_rows(subset0, subset2), subset4), subset8) %>%
#   dplyr::filter(ID %in% GOlist)
# 
# p <- ggplot(data, aes(x = group, y = Description, color = p.adjust, size = gr)) + 
#   geom_point() + theme_bw() +
#   scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
#   scale_size_continuous(range = c(0, 3)) +
#   labs(x = NULL, y = NULL) +
#   theme(axis.text = element_text(size = 6),  # Set axis text size
#         axis.title = element_text(size = 6), # Set axis title size (if not removed)
#         legend.text = element_text(size = 6), # Set legend text size
#         legend.title = element_text(size = 6)) 
# 
# fileName <- here(figDir, \..\, \GO\, \GO_groups_pn\)
# height = 2
# width = 3.3
# svglite(paste0(fileName, \.svg\), height = height, width = width)
# print(p)
# dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### A485
#### Grouping with P-N number
##### Grouping

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpTWdJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvY0c1UGRtVnlJRDA5WjNKdmRYQXhLU0FwSkcxbFlXNWZaR2xtWmw5elkyOXlaVnh1SXlBZ0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdiazkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGpJQ0FnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJeUFnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JpTWdmVnh1SXlCY2JpTWdjSFl3TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGd2ljRzVQZG1WeU1Gd2lMQ0JjSW5CdVQzWmxjakpjSWlrc0lEVXBYRzRqSUhCMk1qUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjSW5CdVQzWmxjakpjSWl3Z1hDSndiazkyWlhJMFhDSXBMQ0ExS1Z4dUl5QndkalEySUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hDSndiazkyWlhJMFhDSXNJRndpY0c1UGRtVnlObHdpS1N3Z05TbGNiaU1nY0hZd09DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRndpY0c1UGRtVnlNRndpTENCY0luQnVUM1psY2poY0lpa3NJRFVwWEc0aklIQjJNamdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TENCY0luQnVUM1psY2pKY0lpd2dYQ0p3Yms5MlpYSTRYQ0lwTENBMUtWeHVJeUJ3ZGpRNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYQ0p3Yms5MlpYSTBYQ0lzSUZ3aWNHNVBkbVZ5T0Z3aUtTd2dOU2xjYmlNZ2NIWTJPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ3aWNHNVBkbVZ5Tmx3aUxDQmNJbkJ1VDNabGNqaGNJaWtzSURVcFhHNWNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J3Yms5MlpYSXNJSGtnUFNCdFpXRnVYMlJwWm1aZmMyTnZjbVVwS1NBcklHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnY0c1UGRtVnlLU3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0sxeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCY2JpQWdjM1JoZEY5emRXMXRZWEo1S0dGbGN5aG5jbTkxY0NBOUlIQnVUM1psY2lrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNJbkJ2YVc1MFhDSXNJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWENKeVpXUmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01DbGNiaUFnSXlCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQXdMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkIyTURJNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCMk1ESXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkIyTWpRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCMk1qUXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkIyTkRZNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCMk5EWXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkIyTmpnNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCMk5qZ3BMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkIyTkRnNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCMk5EZ3BMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkIyTWpnNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCMk1qZ3BMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkIyTURnNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCMk1EZ3BMQ0JjSWx4Y2Jsd2lLU3dnWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wWEc1Y2JpQWdJRnh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aVpHbG1abE5qYjNKbFgySmhjbkJzYjNSZmNHNUhjbTkxY0Y5Qk5EZzFYM1p6WDBSTlUwOWNJaWxjYm1obGFXZG9kQ0E4TFNBelhHNTNhV1IwYUNBOExTQXpYRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcbiMgcHYwMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjJcXCksIDUpXG4jIHB2MjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI0XFwpLCA1KVxuIyBwdjQ2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwbk92ZXI0XFwsIFxccG5PdmVyNlxcKSwgNSlcbiMgcHYwOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjhcXCksIDUpXG4jIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI4XFwpLCA1KVxuIyBwdjQ4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwbk92ZXI0XFwsIFxccG5PdmVyOFxcKSwgNSlcbiMgcHY2OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyNlxcLCBcXHBuT3ZlcjhcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwbk92ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBuT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHB2MDI6IFxcLCBjb252UHZhbHVlKHB2MDIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjQ6IFxcLCBjb252UHZhbHVlKHB2MjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDY6IFxcLCBjb252UHZhbHVlKHB2NDYpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Njg6IFxcLCBjb252UHZhbHVlKHB2NjgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDg6IFxcLCBjb252UHZhbHVlKHB2NDgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBjb252UHZhbHVlKHB2MjgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDg6IFxcLCBjb252UHZhbHVlKHB2MDgpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG5cbiAgIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcZGlmZlNjb3JlX2JhcnBsb3RfcG5Hcm91cF9BNDg1X3ZzX0RNU09cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(pnOver ==group1) )$mean_diff_score
#   distance2 <- (data %>% dplyr::filter(pnOver ==group2) )$mean_diff_score
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
# pv02 <- round(getPvalWilcox(temp, \pnOver0\, \pnOver2\), 5)
# pv24 <- round(getPvalWilcox(temp, \pnOver2\, \pnOver4\), 5)
# pv46 <- round(getPvalWilcox(temp, \pnOver4\, \pnOver6\), 5)
# pv08 <- round(getPvalWilcox(temp, \pnOver0\, \pnOver8\), 5)
# pv28 <- round(getPvalWilcox(temp, \pnOver2\, \pnOver8\), 5)
# pv48 <- round(getPvalWilcox(temp, \pnOver4\, \pnOver8\), 5)
# pv68 <- round(getPvalWilcox(temp, \pnOver6\, \pnOver8\), 5)


p <- ggplot(temp, aes(x = pnOver, y = mean_diff_score)) + geom_violin(aes(fill = pnOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = pnOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0, label = paste0(\pv02: \, convPvalue(pv02), \\n\,
  #                                               \pv24: \, convPvalue(pv24), \\n\,
  #                                               \pv46: \, convPvalue(pv46), \\n\,
  #                                               \pv68: \, convPvalue(pv68), \\n\,
  #                                               \pv48: \, convPvalue(pv48), \\n\,
  #                                               \pv28: \, convPvalue(pv28), \\n\,
  #                                               \pv08: \, convPvalue(pv08), \\n\), 
  #          color = \black\, hjust = 0, size = 3)

   
fileName <- paste0(\diffScore_barplot_pnGroup_A485_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5Qm5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlNZ0lDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jRzVQZG1WeUlEMDlaM0p2ZFhBeEtTQXBKRzFsWVc1ZlpHbG1abDl6WTI5eVpWeHVJeUFnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2JrOTJaWElnUFQxbmNtOTFjRElwSUNra2JXVmhibDlrYVdabVgzTmpiM0psWEc0aklDQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUl5QWdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYmlNZ2ZWeHVJeUJjYmlNZ2NIWXdNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ4Y2NHNVBkbVZ5TUZ4Y0xDQmNYSEJ1VDNabGNqSmNYQ2tzSURVcFhHNGpJSEIyTWpRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNYSEJ1VDNabGNqSmNYQ3dnWEZ4d2JrOTJaWEkwWEZ3cExDQTFLVnh1SXlCd2RqUTJJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWEZ4d2JrOTJaWEkwWEZ3c0lGeGNjRzVQZG1WeU5seGNLU3dnTlNsY2JpTWdjSFl3T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGeGNjRzVQZG1WeU1GeGNMQ0JjWEhCdVQzWmxjamhjWENrc0lEVXBYRzRqSUhCMk1qZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjWEhCdVQzWmxjakpjWEN3Z1hGeHdiazkyWlhJNFhGd3BMQ0ExS1Z4dUl5QndkalE0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hGeHdiazkyWlhJMFhGd3NJRnhjY0c1UGRtVnlPRnhjS1N3Z05TbGNiaU1nY0hZMk9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRnhjY0c1UGRtVnlObHhjTENCY1hIQnVUM1psY2poY1hDa3NJRFVwWEc1Y2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQndiazkyWlhJc0lIa2dQU0J0WldGdVgyUnBabVpmYzJOdmNtVXBLU0FySUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdjRzVQZG1WeUtTd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnSzF4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLR0ZsY3lobmNtOTFjQ0E5SUhCdVQzWmxjaWtzSUdaMWJpQTlJRzFsWVc0c0lHZGxiMjBnUFNCY1hIQnZhVzUwWEZ3c0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXlMQ0JtYVd4c0lEMGdYRnh5WldSY1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUNsY2JpQWdJeUJoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBd0xDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQjJNREk2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEIyTURJcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQjJNalE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEIyTWpRcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQjJORFk2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEIyTkRZcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQjJOamc2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEIyTmpncExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQjJORGc2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEIyTkRncExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQjJNamc2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEIyTWpncExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQjJNRGc2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEIyTURncExDQmNYRnhjYmx4Y0tTd2dYRzRnSUNNZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBYRzVjYmlBZ0lGeHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjWkdsbVpsTmpiM0psWDJKaGNuQnNiM1JmY0c1SGNtOTFjRjlCTkRnMVgzWnpYMFJOVTA5Y1hDbGNibWhsYVdkb2RDQThMU0F6WEc1M2FXUjBhQ0E4TFNBelhHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcbiMgcHYwMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjJcXCksIDUpXG4jIHB2MjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI0XFwpLCA1KVxuIyBwdjQ2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwbk92ZXI0XFwsIFxccG5PdmVyNlxcKSwgNSlcbiMgcHYwOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjhcXCksIDUpXG4jIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI4XFwpLCA1KVxuIyBwdjQ4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwbk92ZXI0XFwsIFxccG5PdmVyOFxcKSwgNSlcbiMgcHY2OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyNlxcLCBcXHBuT3ZlcjhcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwbk92ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBuT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHB2MDI6IFxcLCBjb252UHZhbHVlKHB2MDIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjQ6IFxcLCBjb252UHZhbHVlKHB2MjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDY6IFxcLCBjb252UHZhbHVlKHB2NDYpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Njg6IFxcLCBjb252UHZhbHVlKHB2NjgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDg6IFxcLCBjb252UHZhbHVlKHB2NDgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBjb252UHZhbHVlKHB2MjgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDg6IFxcLCBjb252UHZhbHVlKHB2MDgpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG5cbiAgIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcZGlmZlNjb3JlX2JhcnBsb3RfcG5Hcm91cF9BNDg1X3ZzX0RNU09cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcbiMgcHYwMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjJcXCksIDUpXG4jIHB2MjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI0XFwpLCA1KVxuIyBwdjQ2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwbk92ZXI0XFwsIFxccG5PdmVyNlxcKSwgNSlcbiMgcHYwOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjhcXCksIDUpXG4jIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI4XFwpLCA1KVxuIyBwdjQ4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwbk92ZXI0XFwsIFxccG5PdmVyOFxcKSwgNSlcbiMgcHY2OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccG5PdmVyNlxcLCBcXHBuT3ZlcjhcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwbk92ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBuT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHB2MDI6IFxcLCBjb252UHZhbHVlKHB2MDIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjQ6IFxcLCBjb252UHZhbHVlKHB2MjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDY6IFxcLCBjb252UHZhbHVlKHB2NDYpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Njg6IFxcLCBjb252UHZhbHVlKHB2NjgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDg6IFxcLCBjb252UHZhbHVlKHB2NDgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBjb252UHZhbHVlKHB2MjgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDg6IFxcLCBjb252UHZhbHVlKHB2MDgpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG5cbiAgIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcZGlmZlNjb3JlX2JhcnBsb3RfcG5Hcm91cF9BNDg1X3ZzX0RNU09cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(pnOver ==group1) )$mean_diff_score
#   distance2 <- (data %>% dplyr::filter(pnOver ==group2) )$mean_diff_score
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
# pv02 <- round(getPvalWilcox(temp, \pnOver0\, \pnOver2\), 5)
# pv24 <- round(getPvalWilcox(temp, \pnOver2\, \pnOver4\), 5)
# pv46 <- round(getPvalWilcox(temp, \pnOver4\, \pnOver6\), 5)
# pv08 <- round(getPvalWilcox(temp, \pnOver0\, \pnOver8\), 5)
# pv28 <- round(getPvalWilcox(temp, \pnOver2\, \pnOver8\), 5)
# pv48 <- round(getPvalWilcox(temp, \pnOver4\, \pnOver8\), 5)
# pv68 <- round(getPvalWilcox(temp, \pnOver6\, \pnOver8\), 5)


p <- ggplot(temp, aes(x = pnOver, y = mean_diff_score)) + geom_violin(aes(fill = pnOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = pnOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0, label = paste0(\pv02: \, convPvalue(pv02), \\n\,
  #                                               \pv24: \, convPvalue(pv24), \\n\,
  #                                               \pv46: \, convPvalue(pv46), \\n\,
  #                                               \pv68: \, convPvalue(pv68), \\n\,
  #                                               \pv48: \, convPvalue(pv48), \\n\,
  #                                               \pv28: \, convPvalue(pv28), \\n\,
  #                                               \pv08: \, convPvalue(pv08), \\n\), 
  #          color = \black\, hjust = 0, size = 3)

   
fileName <- paste0(\diffScore_barplot_pnGroup_A485_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### (SKIP) GO for each group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJMXh1SXlBZ1oyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRqSUNBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIQnVUM1psY2lBOVBXZHliM1Z3TVNrZ0tTUnNiMmN5Um05c1pFTm9ZVzVuWlZ4dUl5QWdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3Yms5MlpYSWdQVDFuY205MWNESXBJQ2trYkc5bk1rWnZiR1JEYUdGdVoyVmNiaU1nSUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRqSUNBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVJeUI5WEc0aklGeHVkR1Z0Y0VSdmQyNGdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHNiMmN5Um05c1pFTm9ZVzVuWlNBOElEQXBYRzRqSUNCY2JpTWdjSFl3TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjSW5CdVQzWmxjakJjSWl3Z1hDSndiazkyWlhJeVhDSXBMQ0ExS1Z4dUl5QndkakEwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0VSdmQyNHNJRndpY0c1UGRtVnlNRndpTENCY0luQnVUM1psY2pSY0lpa3NJRFVwWEc0aklIQjJNRFlnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3Ukc5M2Jpd2dYQ0p3Yms5MlpYSXdYQ0lzSUZ3aWNHNVBkbVZ5Tmx3aUtTd2dOU2xjYmlNZ2NIWXdPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNJbkJ1VDNabGNqQmNJaXdnWENKd2JrOTJaWEk0WENJcExDQTFLVnh1SXlCd2RqSTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRVJ2ZDI0c0lGd2ljRzVQZG1WeU1sd2lMQ0JjSW5CdVQzWmxjalJjSWlrc0lEVXBYRzRqSUhCMk1qWWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdSRzkzYml3Z1hDSndiazkyWlhJeVhDSXNJRndpY0c1UGRtVnlObHdpS1N3Z05TbGNiaU1nY0hZeU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY0luQnVUM1psY2pKY0lpd2dYQ0p3Yms5MlpYSTRYQ0lwTENBMUtWeHVJeUJ3ZGpRMklEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNFUnZkMjRzSUZ3aWNHNVBkbVZ5TkZ3aUxDQmNJbkJ1VDNabGNqWmNJaWtzSURVcFhHNGpJSEIyTkRnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1JHOTNiaXdnWENKd2JrOTJaWEkwWENJc0lGd2ljRzVQZG1WeU9Gd2lLU3dnTlNsY2JpTWdjSFkyT0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjSW5CdVQzWmxjalpjSWl3Z1hDSndiazkyWlhJNFhDSXBMQ0ExS1Z4dVhHNWNibHh1WEc1d0lEd3RJR2RuY0d4dmRDaDBaVzF3Ukc5M2Jpd2dZV1Z6S0hnZ1BTQndiazkyWlhJc0lIa2dQU0JzYjJjeVJtOXNaRU5vWVc1blpTa3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQndiazkyWlhJcExDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FyWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnY0c1UGRtVnlLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNJbkpsWkZ3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1Z4dUlDQWpJR0Z1Ym05MFlYUmxLRndpZEdWNGRGd2lMQ0I0SUQwZ01Td2dlU0E5SUMwd0xqVXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGd2ljSFl3TWpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hZd01pa3NJRndpWEZ4dVhDSXNYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hZd05Eb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NIWXdOQ2tzSUZ3aVhGeHVYQ0lzWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNIWXdOam9nWENJc0lHTnZiblpRZG1Gc2RXVW9jSFl3Tmlrc0lGd2lYRnh1WENJc1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSFl3T0RvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hZd09Da3NJRndpWEZ4dVhDSXNYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hZeU5Eb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NIWXlOQ2tzSUZ3aVhGeHVYQ0lzWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNIWXlOam9nWENJc0lHTnZiblpRZG1Gc2RXVW9jSFl5Tmlrc0lGd2lYRnh1WENJc1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSFl5T0RvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hZeU9Da3NJRndpWEZ4dVhDSXNYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hZME5qb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NIWTBOaWtzSUZ3aVhGeHVYQ0lzWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNIWTBPRG9nWENJc0lHTnZiblpRZG1Gc2RXVW9jSFkwT0Nrc0lGd2lYRnh1WENJc1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSFkyT0RvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hZMk9Da3NJRndpWEZ4dVhDSXBMQ0JjYmlBZ0l5QWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNeWtnS3lCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTFRFc0lEQXBLVnh1WEc0Z0lGeHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpYkc5bk1rWkRYMkpoY25Cc2IzUmZjRzVIY205MWNGOUJORGcxWDNaelgwUk5VMDlmWkc5M2Jsd2lLVnh1YUdWcFoyaDBJRHd0SUROY2JuZHBaSFJvSUR3dElETmNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JseHVYRzVjYm5SbGJYQlZjQ0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR3h2WnpKR2IyeGtRMmhoYm1kbElENGdNQ2xjYmlNZ0lGeHVJeUJ3ZGpBeUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjSW5CdVQzWmxjakJjSWl3Z1hDSndiazkyWlhJeVhDSXBMQ0ExS1Z4dUl5QndkakEwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNJbkJ1VDNabGNqQmNJaXdnWENKd2JrOTJaWEkwWENJcExDQTFLVnh1SXlCd2RqQTJJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY0luQnVUM1psY2pCY0lpd2dYQ0p3Yms5MlpYSTJYQ0lwTENBMUtWeHVJeUJ3ZGpBNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjSW5CdVQzWmxjakJjSWl3Z1hDSndiazkyWlhJNFhDSXBMQ0ExS1Z4dUl5QndkakkwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNJbkJ1VDNabGNqSmNJaXdnWENKd2JrOTJaWEkwWENJcExDQTFLVnh1SXlCd2RqSTJJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY0luQnVUM1psY2pKY0lpd2dYQ0p3Yms5MlpYSTJYQ0lwTENBMUtWeHVJeUJ3ZGpJNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjSW5CdVQzWmxjakpjSWl3Z1hDSndiazkyWlhJNFhDSXBMQ0ExS1Z4dUl5QndkalEySUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNJbkJ1VDNabGNqUmNJaXdnWENKd2JrOTJaWEkyWENJcExDQTFLVnh1SXlCd2RqUTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY0luQnVUM1psY2pSY0lpd2dYQ0p3Yms5MlpYSTRYQ0lwTENBMUtWeHVJeUJ3ZGpZNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjSW5CdVQzWmxjalpjSWl3Z1hDSndiazkyWlhJNFhDSXBMQ0ExS1Z4dUl5QmNibHh1WEc1Y2JuQWdQQzBnWjJkd2JHOTBLSFJsYlhCVmNDd2dZV1Z6S0hnZ1BTQndiazkyWlhJc0lIa2dQU0JzYjJjeVJtOXNaRU5vWVc1blpTa3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQndiazkyWlhJcExDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FyWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnY0c1UGRtVnlLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNJbkpsWkZ3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1Z4dUlDQWpJR0Z1Ym05MFlYUmxLRndpZEdWNGRGd2lMQ0I0SUQwZ01Td2dlU0E5SURBdU5Td2diR0ZpWld3Z1BTQndZWE4wWlRBb1hDSndkakF5T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3ZGpBeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3ZGpBME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2RqQTBLU3dnWENKY1hHNWNJaXhjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2RqQTJPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdkakEyS1N3Z1hDSmNYRzVjSWl4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkakE0T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3ZGpBNEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3ZGpJME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2RqSTBLU3dnWENKY1hHNWNJaXhjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2RqSTJPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdkakkyS1N3Z1hDSmNYRzVjSWl4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkakk0T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3ZGpJNEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3ZGpRMk9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2RqUTJLU3dnWENKY1hHNWNJaXhjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd2RqUTRPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdkalE0S1N3Z1hDSmNYRzVjSWl4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkalk0T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3ZGpZNEtTd2dYQ0pjWEc1Y0lpa3NJRnh1SUNBaklDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXpLU0FySUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWd3TENBeEtTbGNibHh1SUNCY2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbXh2WnpKR1ExOWlZWEp3Ykc5MFgzQnVSM0p2ZFhCZlFUUTROVjkyYzE5RVRWTlBYM1Z3WENJcFhHNW9aV2xuYUhRZ1BDMGdNMXh1ZDJsa2RHZ2dQQzBnTTF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbiNcbiMgIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuIyAgIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDEpICkkbG9nMkZvbGRDaGFuZ2VcbiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAyKSApJGxvZzJGb2xkQ2hhbmdlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcbnRlbXBEb3duIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKVxuIyAgXG4jIHB2MDIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIwXFwsIFxccG5PdmVyMlxcKSwgNSlcbiMgcHYwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI0XFwpLCA1KVxuIyBwdjA2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjZcXCksIDUpXG4jIHB2MDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIwXFwsIFxccG5PdmVyOFxcKSwgNSlcbiMgcHYyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI0XFwpLCA1KVxuIyBwdjI2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccG5PdmVyMlxcLCBcXHBuT3ZlcjZcXCksIDUpXG4jIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIyXFwsIFxccG5PdmVyOFxcKSwgNSlcbiMgcHY0NiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI2XFwpLCA1KVxuIyBwdjQ4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccG5PdmVyNFxcLCBcXHBuT3ZlcjhcXCksIDUpXG4jIHB2NjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXI2XFwsIFxccG5PdmVyOFxcKSwgNSlcblxuXG5cblxucCA8LSBnZ3Bsb3QodGVtcERvd24sIGFlcyh4ID0gcG5PdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBuT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAtMC41LCBsYWJlbCA9IHBhc3RlMChcXHB2MDI6IFxcLCBjb252UHZhbHVlKHB2MDIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDQ6IFxcLCBjb252UHZhbHVlKHB2MDQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDY6IFxcLCBjb252UHZhbHVlKHB2MDYpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDg6IFxcLCBjb252UHZhbHVlKHB2MDgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjQ6IFxcLCBjb252UHZhbHVlKHB2MjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjY6IFxcLCBjb252UHZhbHVlKHB2MjYpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBjb252UHZhbHVlKHB2MjgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDY6IFxcLCBjb252UHZhbHVlKHB2NDYpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDg6IFxcLCBjb252UHZhbHVlKHB2NDgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Njg6IFxcLCBjb252UHZhbHVlKHB2NjgpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0xLCAwKSlcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BuR3JvdXBfQTQ4NV92c19ETVNPX2Rvd25cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG50ZW1wVXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA+IDApXG4jICBcbiMgcHYwMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXIwXFwsIFxccG5PdmVyMlxcKSwgNSlcbiMgcHYwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXIwXFwsIFxccG5PdmVyNFxcKSwgNSlcbiMgcHYwNiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXIwXFwsIFxccG5PdmVyNlxcKSwgNSlcbiMgcHYwOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXIwXFwsIFxccG5PdmVyOFxcKSwgNSlcbiMgcHYyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXIyXFwsIFxccG5PdmVyNFxcKSwgNSlcbiMgcHYyNiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXIyXFwsIFxccG5PdmVyNlxcKSwgNSlcbiMgcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXIyXFwsIFxccG5PdmVyOFxcKSwgNSlcbiMgcHY0NiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXI0XFwsIFxccG5PdmVyNlxcKSwgNSlcbiMgcHY0OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXI0XFwsIFxccG5PdmVyOFxcKSwgNSlcbiMgcHY2OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwbk92ZXI2XFwsIFxccG5PdmVyOFxcKSwgNSlcbiMgXG5cblxuXG5wIDwtIGdncGxvdCh0ZW1wVXAsIGFlcyh4ID0gcG5PdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBuT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLjUsIGxhYmVsID0gcGFzdGUwKFxccHYwMjogXFwsIGNvbnZQdmFsdWUocHYwMiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYwNDogXFwsIGNvbnZQdmFsdWUocHYwNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYwNjogXFwsIGNvbnZQdmFsdWUocHYwNiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYwODogXFwsIGNvbnZQdmFsdWUocHYwOCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNDogXFwsIGNvbnZQdmFsdWUocHYyNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNjogXFwsIGNvbnZQdmFsdWUocHYyNiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyODogXFwsIGNvbnZQdmFsdWUocHYyOCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY0NjogXFwsIGNvbnZQdmFsdWUocHY0NiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY0ODogXFwsIGNvbnZQdmFsdWUocHY0OCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY2ODogXFwsIGNvbnZQdmFsdWUocHY2OCksIFxcXFxuXFwpLCBcbiAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfYmFycGxvdF9wbkdyb3VwX0E0ODVfdnNfRE1TT191cFxcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
#
#  getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(pnOver ==group1) )$log2FoldChange
#   distance2 <- (data %>% dplyr::filter(pnOver ==group2) )$log2FoldChange
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
#  
# pv02 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver2\), 5)
# pv04 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver4\), 5)
# pv06 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver6\), 5)
# pv08 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver8\), 5)
# pv24 <- round(getPvalWilcox(tempDown, \pnOver2\, \pnOver4\), 5)
# pv26 <- round(getPvalWilcox(tempDown, \pnOver2\, \pnOver6\), 5)
# pv28 <- round(getPvalWilcox(tempDown, \pnOver2\, \pnOver8\), 5)
# pv46 <- round(getPvalWilcox(tempDown, \pnOver4\, \pnOver6\), 5)
# pv48 <- round(getPvalWilcox(tempDown, \pnOver4\, \pnOver8\), 5)
# pv68 <- round(getPvalWilcox(tempDown, \pnOver6\, \pnOver8\), 5)




p <- ggplot(tempDown, aes(x = pnOver, y = log2FoldChange)) + geom_violin(aes(fill = pnOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = pnOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = -0.5, label = paste0(\pv02: \, convPvalue(pv02), \\n\,
  #                                                  \pv04: \, convPvalue(pv04), \\n\,
  #                                                  \pv06: \, convPvalue(pv06), \\n\,
  #                                                  \pv08: \, convPvalue(pv08), \\n\,
  #                                                  \pv24: \, convPvalue(pv24), \\n\,
  #                                                  \pv26: \, convPvalue(pv26), \\n\,
  #                                                  \pv28: \, convPvalue(pv28), \\n\,
  #                                                  \pv46: \, convPvalue(pv46), \\n\,
  #                                                  \pv48: \, convPvalue(pv48), \\n\,
  #                                                  \pv68: \, convPvalue(pv68), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(-1, 0))

  
fileName <- paste0(\log2FC_barplot_pnGroup_A485_vs_DMSO_down\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
#  
# pv02 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver2\), 5)
# pv04 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver4\), 5)
# pv06 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver6\), 5)
# pv08 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver8\), 5)
# pv24 <- round(getPvalWilcox(tempUp, \pnOver2\, \pnOver4\), 5)
# pv26 <- round(getPvalWilcox(tempUp, \pnOver2\, \pnOver6\), 5)
# pv28 <- round(getPvalWilcox(tempUp, \pnOver2\, \pnOver8\), 5)
# pv46 <- round(getPvalWilcox(tempUp, \pnOver4\, \pnOver6\), 5)
# pv48 <- round(getPvalWilcox(tempUp, \pnOver4\, \pnOver8\), 5)
# pv68 <- round(getPvalWilcox(tempUp, \pnOver6\, \pnOver8\), 5)
# 



p <- ggplot(tempUp, aes(x = pnOver, y = log2FoldChange)) + geom_violin(aes(fill = pnOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = pnOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0.5, label = paste0(\pv02: \, convPvalue(pv02), \\n\,
  #                                                  \pv04: \, convPvalue(pv04), \\n\,
  #                                                  \pv06: \, convPvalue(pv06), \\n\,
  #                                                  \pv08: \, convPvalue(pv08), \\n\,
  #                                                  \pv24: \, convPvalue(pv24), \\n\,
  #                                                  \pv26: \, convPvalue(pv26), \\n\,
  #                                                  \pv28: \, convPvalue(pv28), \\n\,
  #                                                  \pv46: \, convPvalue(pv46), \\n\,
  #                                                  \pv48: \, convPvalue(pv48), \\n\,
  #                                                  \pv68: \, convPvalue(pv68), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_pnGroup_A485_vs_DMSO_up\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUkxeHVJeUFnWjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGpJQ0FnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hCdVQzWmxjaUE5UFdkeWIzVndNU2tnS1NSc2IyY3lSbTlzWkVOb1lXNW5aVnh1SXlBZ0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdiazkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiRzluTWtadmJHUkRhR0Z1WjJWY2JpTWdJQ0IzYVd3Z1BDMGdkMmxzWTI5NExuUmxjM1FvWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcFhHNGpJQ0FnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dUl5QjlYRzRqSUZ4dWRHVnRjRVJ2ZDI0Z1BDMGdkR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loc2IyY3lSbTlzWkVOb1lXNW5aU0E4SURBcFhHNGpJQ0JjYmlNZ2NIWXdNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNYSEJ1VDNabGNqQmNYQ3dnWEZ4d2JrOTJaWEl5WEZ3cExDQTFLVnh1SXlCd2RqQTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRVJ2ZDI0c0lGeGNjRzVQZG1WeU1GeGNMQ0JjWEhCdVQzWmxjalJjWENrc0lEVXBYRzRqSUhCMk1EWWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdSRzkzYml3Z1hGeHdiazkyWlhJd1hGd3NJRnhjY0c1UGRtVnlObHhjS1N3Z05TbGNiaU1nY0hZd09DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY1hIQnVUM1psY2pCY1hDd2dYRnh3Yms5MlpYSTRYRndwTENBMUtWeHVJeUJ3ZGpJMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNFUnZkMjRzSUZ4Y2NHNVBkbVZ5TWx4Y0xDQmNYSEJ1VDNabGNqUmNYQ2tzSURVcFhHNGpJSEIyTWpZZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1JHOTNiaXdnWEZ4d2JrOTJaWEl5WEZ3c0lGeGNjRzVQZG1WeU5seGNLU3dnTlNsY2JpTWdjSFl5T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjWEhCdVQzWmxjakpjWEN3Z1hGeHdiazkyWlhJNFhGd3BMQ0ExS1Z4dUl5QndkalEySUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0VSdmQyNHNJRnhjY0c1UGRtVnlORnhjTENCY1hIQnVUM1psY2paY1hDa3NJRFVwWEc0aklIQjJORGdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3Ukc5M2Jpd2dYRnh3Yms5MlpYSTBYRndzSUZ4Y2NHNVBkbVZ5T0Z4Y0tTd2dOU2xjYmlNZ2NIWTJPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNYSEJ1VDNabGNqWmNYQ3dnWEZ4d2JrOTJaWEk0WEZ3cExDQTFLVnh1WEc1Y2JseHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdSRzkzYml3Z1lXVnpLSGdnUFNCd2JrOTJaWElzSUhrZ1BTQnNiMmN5Um05c1pFTm9ZVzVuWlNrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCd2JrOTJaWElwTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdjRzVQZG1WeUtTd2dablZ1SUQwZ2JXVmhiaXdnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURJc0lHWnBiR3dnUFNCY1hISmxaRnhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLVnh1SUNBaklHRnVibTkwWVhSbEtGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTVN3Z2VTQTlJQzB3TGpVc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z4Y2NIWXdNam9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSFl3TWlrc0lGeGNYRnh1WEZ3c1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSFl3TkRvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hZd05Da3NJRnhjWEZ4dVhGd3NYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hZd05qb2dYRndzSUdOdmJuWlFkbUZzZFdVb2NIWXdOaWtzSUZ4Y1hGeHVYRndzWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NIWXdPRG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSFl3T0Nrc0lGeGNYRnh1WEZ3c1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSFl5TkRvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hZeU5Da3NJRnhjWEZ4dVhGd3NYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hZeU5qb2dYRndzSUdOdmJuWlFkbUZzZFdVb2NIWXlOaWtzSUZ4Y1hGeHVYRndzWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NIWXlPRG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSFl5T0Nrc0lGeGNYRnh1WEZ3c1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSFkwTmpvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hZME5pa3NJRnhjWEZ4dVhGd3NYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hZME9Eb2dYRndzSUdOdmJuWlFkbUZzZFdVb2NIWTBPQ2tzSUZ4Y1hGeHVYRndzWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NIWTJPRG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSFkyT0Nrc0lGeGNYRnh1WEZ3cExDQmNiaUFnSXlBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ015a2dLeUJqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9MVEVzSURBcEtWeHVYRzRnSUZ4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNiRzluTWtaRFgySmhjbkJzYjNSZmNHNUhjbTkxY0Y5Qk5EZzFYM1p6WDBSTlUwOWZaRzkzYmx4Y0tWeHVhR1ZwWjJoMElEd3RJRE5jYm5kcFpIUm9JRHd0SUROY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dVhHNWNiblJsYlhCVmNDQThMU0IwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHeHZaekpHYjJ4a1EyaGhibWRsSUQ0Z01DbGNiaU1nSUZ4dUl5QndkakF5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNYSEJ1VDNabGNqQmNYQ3dnWEZ4d2JrOTJaWEl5WEZ3cExDQTFLVnh1SXlCd2RqQTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY1hIQnVUM1psY2pCY1hDd2dYRnh3Yms5MlpYSTBYRndwTENBMUtWeHVJeUJ3ZGpBMklEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjWEhCdVQzWmxjakJjWEN3Z1hGeHdiazkyWlhJMlhGd3BMQ0ExS1Z4dUl5QndkakE0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNYSEJ1VDNabGNqQmNYQ3dnWEZ4d2JrOTJaWEk0WEZ3cExDQTFLVnh1SXlCd2RqSTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY1hIQnVUM1psY2pKY1hDd2dYRnh3Yms5MlpYSTBYRndwTENBMUtWeHVJeUJ3ZGpJMklEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjWEhCdVQzWmxjakpjWEN3Z1hGeHdiazkyWlhJMlhGd3BMQ0ExS1Z4dUl5Qndkakk0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNYSEJ1VDNabGNqSmNYQ3dnWEZ4d2JrOTJaWEk0WEZ3cExDQTFLVnh1SXlCd2RqUTJJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY1hIQnVUM1psY2pSY1hDd2dYRnh3Yms5MlpYSTJYRndwTENBMUtWeHVJeUJ3ZGpRNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjWEhCdVQzWmxjalJjWEN3Z1hGeHdiazkyWlhJNFhGd3BMQ0ExS1Z4dUl5Qndkalk0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNYSEJ1VDNabGNqWmNYQ3dnWEZ4d2JrOTJaWEk0WEZ3cExDQTFLVnh1SXlCY2JseHVYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtIUmxiWEJWY0N3Z1lXVnpLSGdnUFNCd2JrOTJaWElzSUhrZ1BTQnNiMmN5Um05c1pFTm9ZVzVuWlNrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCd2JrOTJaWElwTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdjRzVQZG1WeUtTd2dablZ1SUQwZ2JXVmhiaXdnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURJc0lHWnBiR3dnUFNCY1hISmxaRnhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLVnh1SUNBaklHRnVibTkwWVhSbEtGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTVN3Z2VTQTlJREF1TlN3Z2JHRmlaV3dnUFNCd1lYTjBaVEFvWEZ4d2RqQXlPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdkakF5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdkakEwT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3ZGpBMEtTd2dYRnhjWEc1Y1hDeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3ZGpBMk9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod2RqQTJLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqQTRPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdkakE0S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdkakkwT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3ZGpJMEtTd2dYRnhjWEc1Y1hDeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3ZGpJMk9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod2RqSTJLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqSTRPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdkakk0S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdkalEyT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3ZGpRMktTd2dYRnhjWEc1Y1hDeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3ZGpRNE9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod2RqUTRLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqWTRPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdkalk0S1N3Z1hGeGNYRzVjWENrc0lGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektTQXJJR052YjNKa1gyTmhjblJsYzJsaGJpaDViR2x0SUQwZ1l5Z3dMQ0F4S1NsY2JseHVJQ0JjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hHeHZaekpHUTE5aVlYSndiRzkwWDNCdVIzSnZkWEJmUVRRNE5WOTJjMTlFVFZOUFgzVndYRndwWEc1b1pXbG5hSFFnUEMwZ00xeHVkMmxrZEdnZ1BDMGdNMXh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG4jXG4jICBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAxKSApJGxvZzJGb2xkQ2hhbmdlXG4jICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBuT3ZlciA9PWdyb3VwMikgKSRsb2cyRm9sZENoYW5nZVxuIyAgIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiMgICByZXR1cm4od2lsJHAudmFsdWUpXG4jIH1cbiMgXG50ZW1wRG93biA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlIDwgMClcbiMgIFxuIyBwdjAyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjJcXCksIDUpXG4jIHB2MDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIwXFwsIFxccG5PdmVyNFxcKSwgNSlcbiMgcHYwNiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI2XFwpLCA1KVxuIyBwdjA4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjhcXCksIDUpXG4jIHB2MjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIyXFwsIFxccG5PdmVyNFxcKSwgNSlcbiMgcHYyNiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI2XFwpLCA1KVxuIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccG5PdmVyMlxcLCBcXHBuT3ZlcjhcXCksIDUpXG4jIHB2NDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXI0XFwsIFxccG5PdmVyNlxcKSwgNSlcbiMgcHY0OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI4XFwpLCA1KVxuIyBwdjY4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccG5PdmVyNlxcLCBcXHBuT3ZlcjhcXCksIDUpXG5cblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBEb3duLCBhZXMoeCA9IHBuT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBuT3ZlciksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwbk92ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gLTAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwdjAyOiBcXCwgY29udlB2YWx1ZShwdjAyKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA0OiBcXCwgY29udlB2YWx1ZShwdjA0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA2OiBcXCwgY29udlB2YWx1ZShwdjA2KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA4OiBcXCwgY29udlB2YWx1ZShwdjA4KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI0OiBcXCwgY29udlB2YWx1ZShwdjI0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI2OiBcXCwgY29udlB2YWx1ZShwdjI2KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgY29udlB2YWx1ZShwdjI4KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjQ2OiBcXCwgY29udlB2YWx1ZShwdjQ2KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjQ4OiBcXCwgY29udlB2YWx1ZShwdjQ4KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjY4OiBcXCwgY29udlB2YWx1ZShwdjY4KSwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMSwgMCkpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfYmFycGxvdF9wbkdyb3VwX0E0ODVfdnNfRE1TT19kb3duXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cblxudGVtcFVwIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPiAwKVxuIyAgXG4jIHB2MDIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjJcXCksIDUpXG4jIHB2MDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjRcXCksIDUpXG4jIHB2MDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjZcXCksIDUpXG4jIHB2MDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjhcXCksIDUpXG4jIHB2MjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMlxcLCBcXHBuT3ZlcjRcXCksIDUpXG4jIHB2MjYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMlxcLCBcXHBuT3ZlcjZcXCksIDUpXG4jIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyMlxcLCBcXHBuT3ZlcjhcXCksIDUpXG4jIHB2NDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyNFxcLCBcXHBuT3ZlcjZcXCksIDUpXG4jIHB2NDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyNFxcLCBcXHBuT3ZlcjhcXCksIDUpXG4jIHB2NjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccG5PdmVyNlxcLCBcXHBuT3ZlcjhcXCksIDUpXG4jIFxuXG5cblxucCA8LSBnZ3Bsb3QodGVtcFVwLCBhZXMoeCA9IHBuT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBuT3ZlciksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwbk92ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMC41LCBsYWJlbCA9IHBhc3RlMChcXHB2MDI6IFxcLCBjb252UHZhbHVlKHB2MDIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDQ6IFxcLCBjb252UHZhbHVlKHB2MDQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDY6IFxcLCBjb252UHZhbHVlKHB2MDYpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MDg6IFxcLCBjb252UHZhbHVlKHB2MDgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjQ6IFxcLCBjb252UHZhbHVlKHB2MjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjY6IFxcLCBjb252UHZhbHVlKHB2MjYpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Mjg6IFxcLCBjb252UHZhbHVlKHB2MjgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDY6IFxcLCBjb252UHZhbHVlKHB2NDYpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NDg6IFxcLCBjb252UHZhbHVlKHB2NDgpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2Njg6IFxcLCBjb252UHZhbHVlKHB2NjgpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEpKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcG5Hcm91cF9BNDg1X3ZzX0RNU09fdXBcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuI1xuIyAgZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4jICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBuT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2VcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG4jIFxudGVtcERvd24gPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA8IDApXG4jICBcbiMgcHYwMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXIyXFwpLCA1KVxuIyBwdjA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccG5PdmVyMFxcLCBcXHBuT3ZlcjRcXCksIDUpXG4jIHB2MDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIwXFwsIFxccG5PdmVyNlxcKSwgNSlcbiMgcHYwOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI4XFwpLCA1KVxuIyBwdjI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccG5PdmVyMlxcLCBcXHBuT3ZlcjRcXCksIDUpXG4jIHB2MjYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXIyXFwsIFxccG5PdmVyNlxcKSwgNSlcbiMgcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI4XFwpLCA1KVxuIyBwdjQ2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccG5PdmVyNFxcLCBcXHBuT3ZlcjZcXCksIDUpXG4jIHB2NDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwbk92ZXI0XFwsIFxccG5PdmVyOFxcKSwgNSlcbiMgcHY2OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBuT3ZlcjZcXCwgXFxwbk92ZXI4XFwpLCA1KVxuXG5cblxuXG5wIDwtIGdncGxvdCh0ZW1wRG93biwgYWVzKHggPSBwbk92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwbk92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcG5PdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IC0wLjUsIGxhYmVsID0gcGFzdGUwKFxccHYwMjogXFwsIGNvbnZQdmFsdWUocHYwMiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYwNDogXFwsIGNvbnZQdmFsdWUocHYwNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYwNjogXFwsIGNvbnZQdmFsdWUocHYwNiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYwODogXFwsIGNvbnZQdmFsdWUocHYwOCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNDogXFwsIGNvbnZQdmFsdWUocHYyNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyNjogXFwsIGNvbnZQdmFsdWUocHYyNiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyODogXFwsIGNvbnZQdmFsdWUocHYyOCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY0NjogXFwsIGNvbnZQdmFsdWUocHY0NiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY0ODogXFwsIGNvbnZQdmFsdWUocHY0OCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY2ODogXFwsIGNvbnZQdmFsdWUocHY2OCksIFxcXFxuXFwpLCBcbiAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEsIDApKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcG5Hcm91cF9BNDg1X3ZzX0RNU09fZG93blxcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMClcbiMgIFxuIyBwdjAyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXIyXFwpLCA1KVxuIyBwdjA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI0XFwpLCA1KVxuIyBwdjA2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI2XFwpLCA1KVxuIyBwdjA4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjBcXCwgXFxwbk92ZXI4XFwpLCA1KVxuIyBwdjI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI0XFwpLCA1KVxuIyBwdjI2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI2XFwpLCA1KVxuIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjJcXCwgXFxwbk92ZXI4XFwpLCA1KVxuIyBwdjQ2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI2XFwpLCA1KVxuIyBwdjQ4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjRcXCwgXFxwbk92ZXI4XFwpLCA1KVxuIyBwdjY4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBuT3ZlcjZcXCwgXFxwbk92ZXI4XFwpLCA1KVxuIyBcblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwbk92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwbk92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcG5PdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwdjAyOiBcXCwgY29udlB2YWx1ZShwdjAyKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA0OiBcXCwgY29udlB2YWx1ZShwdjA0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA2OiBcXCwgY29udlB2YWx1ZShwdjA2KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjA4OiBcXCwgY29udlB2YWx1ZShwdjA4KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI0OiBcXCwgY29udlB2YWx1ZShwdjI0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI2OiBcXCwgY29udlB2YWx1ZShwdjI2KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgY29udlB2YWx1ZShwdjI4KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjQ2OiBcXCwgY29udlB2YWx1ZShwdjQ2KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjQ4OiBcXCwgY29udlB2YWx1ZShwdjQ4KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjY4OiBcXCwgY29udlB2YWx1ZShwdjY4KSwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSlcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BuR3JvdXBfQTQ4NV92c19ETVNPX3VwXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
#
#  getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(pnOver ==group1) )$log2FoldChange
#   distance2 <- (data %>% dplyr::filter(pnOver ==group2) )$log2FoldChange
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
#  
# pv02 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver2\), 5)
# pv04 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver4\), 5)
# pv06 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver6\), 5)
# pv08 <- round(getPvalWilcox(tempDown, \pnOver0\, \pnOver8\), 5)
# pv24 <- round(getPvalWilcox(tempDown, \pnOver2\, \pnOver4\), 5)
# pv26 <- round(getPvalWilcox(tempDown, \pnOver2\, \pnOver6\), 5)
# pv28 <- round(getPvalWilcox(tempDown, \pnOver2\, \pnOver8\), 5)
# pv46 <- round(getPvalWilcox(tempDown, \pnOver4\, \pnOver6\), 5)
# pv48 <- round(getPvalWilcox(tempDown, \pnOver4\, \pnOver8\), 5)
# pv68 <- round(getPvalWilcox(tempDown, \pnOver6\, \pnOver8\), 5)




p <- ggplot(tempDown, aes(x = pnOver, y = log2FoldChange)) + geom_violin(aes(fill = pnOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = pnOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = -0.5, label = paste0(\pv02: \, convPvalue(pv02), \\n\,
  #                                                  \pv04: \, convPvalue(pv04), \\n\,
  #                                                  \pv06: \, convPvalue(pv06), \\n\,
  #                                                  \pv08: \, convPvalue(pv08), \\n\,
  #                                                  \pv24: \, convPvalue(pv24), \\n\,
  #                                                  \pv26: \, convPvalue(pv26), \\n\,
  #                                                  \pv28: \, convPvalue(pv28), \\n\,
  #                                                  \pv46: \, convPvalue(pv46), \\n\,
  #                                                  \pv48: \, convPvalue(pv48), \\n\,
  #                                                  \pv68: \, convPvalue(pv68), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(-1, 0))

  
fileName <- paste0(\log2FC_barplot_pnGroup_A485_vs_DMSO_down\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
#  
# pv02 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver2\), 5)
# pv04 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver4\), 5)
# pv06 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver6\), 5)
# pv08 <- round(getPvalWilcox(tempUp, \pnOver0\, \pnOver8\), 5)
# pv24 <- round(getPvalWilcox(tempUp, \pnOver2\, \pnOver4\), 5)
# pv26 <- round(getPvalWilcox(tempUp, \pnOver2\, \pnOver6\), 5)
# pv28 <- round(getPvalWilcox(tempUp, \pnOver2\, \pnOver8\), 5)
# pv46 <- round(getPvalWilcox(tempUp, \pnOver4\, \pnOver6\), 5)
# pv48 <- round(getPvalWilcox(tempUp, \pnOver4\, \pnOver8\), 5)
# pv68 <- round(getPvalWilcox(tempUp, \pnOver6\, \pnOver8\), 5)
# 



p <- ggplot(tempUp, aes(x = pnOver, y = log2FoldChange)) + geom_violin(aes(fill = pnOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = pnOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0.5, label = paste0(\pv02: \, convPvalue(pv02), \\n\,
  #                                                  \pv04: \, convPvalue(pv04), \\n\,
  #                                                  \pv06: \, convPvalue(pv06), \\n\,
  #                                                  \pv08: \, convPvalue(pv08), \\n\,
  #                                                  \pv24: \, convPvalue(pv24), \\n\,
  #                                                  \pv26: \, convPvalue(pv26), \\n\,
  #                                                  \pv28: \, convPvalue(pv28), \\n\,
  #                                                  \pv46: \, convPvalue(pv46), \\n\,
  #                                                  \pv48: \, convPvalue(pv48), \\n\,
  #                                                  \pv68: \, convPvalue(pv68), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_pnGroup_A485_vs_DMSO_up\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



##### loop score

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUIwWlcxd01pQmpiMjUwWVdsdWN5Qm5aVzVsY3lCbWNtOXRJR2R5YjNWd0lERXNJRElzSURVc0lEZ2dZVzVrSUd4dmIzQWdZMjkxYm5SelhHNGpZMkZzWTNWc1lYUnBibWNnWkdsbVppQnpZMjl5WlNCaGJtUWdiRzluTW1aaklHUnBjM1J5YVdKMWRHbHZiaUJpWVhObFpDQnZiaUJ3TFc0Z2JuVnRZbVZ5YzF4dVhHNXdjMDkyWlhJMElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hNZ1BqMGdOQ2twSkdkbGJtVmNibkJ6VDNabGNqTWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2N5QStQU0F6TENCdWRXMWZjSE1nUENBMEtTa2taMlZ1WlZ4dWNITlBkbVZ5TWlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J6SUQ0OUlESXNJRzUxYlY5d2N5QThJRE1wS1NSblpXNWxYRzV3YzA5MlpYSXhJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNITWdQajBnTVN3Z2JuVnRYM0J6SUR3Z01pa3BKR2RsYm1WY2JuQnpUM1psY2pBZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y3lBOElERXBLU1JuWlc1bFhHNWNibHh1WEc1Y2JpTWpJRVJwZG1sa2FXNW5JR2RsYm1WeklHbHVkRzhnWjNKdmRYQnpYRzUwWlcxd0lEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoa2FXWm1YMEUwT0RWZlJFMVRUeXdnWkdsemRHRnVZMlVzSUdkbGJtVXBJQ1UrSlNCY2JpQWdkVzV1WlhOMEtHZGxibVVwSUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0cxbFlXNWZaR2xtWmw5elkyOXlaU0E5SUcxbFlXNG9aR2xtWmw5Qk5EZzFYMFJOVTA4cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnYldWaGJsOWthWE4wWVc1alpTQTlJRzFsWVc0b1pHbHpkR0Z1WTJVcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnTG1keWIzVndjeUE5SUNka2NtOXdKeWxjYmx4dVpHbG1aaTVTVGtFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWkdsbVpsOUhNUzVCTkRnMUxuTmxiR1ZqZEdWa01sOUhNUzR5YVM1Qk5EZzFYM1p6WDBjeExqSnBMa1JOVTA4dWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGxibk5sYldKc1gyZGxibVZmYVdRc0lHeHZaekpHYjJ4a1EyaGhibWRsTENCemFISnBibXRsWkY5c2IyY3lSa01zSUhCaFpHb3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU2xjYmx4dWJXRjRURzluTWtaRElEMGdNbHh1WEc1MFpXMXdJRHd0SUd4bFpuUmZhbTlwYmloMFpXMXdMQ0JrYVdabUxsSk9RU3dnWW5rZ1BTQmpLRndpWjJWdVpWd2lJRDBnWENKbGJuTmxiV0pzWDJkbGJtVmZhV1JjSWlrcElDVStKU0JjYmlBZ1pISnZjRjl1WVNoemFISnBibXRsWkY5c2IyY3lSa01wWEc1Y2JseHVkR1Z0Y0NBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQndjMDkyWlhJZ1BTQnBabVZzYzJVb1oyVnVaU0FsYVc0bElIQnpUM1psY2pRc0lGd2ljSE5QZG1WeU5Gd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSXpMQ0JjSW5CelQzWmxjak5jSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUhCelQzWmxjaklzSUZ3aWNITlBkbVZ5TWx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUhCelQzWmxjakVzSUZ3aWNITlBkbVZ5TVZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSXdMQ0JjSW5CelQzWmxjakJjSWl3Z1RrRXBLU2twS1NrZ0pUNGxYRzRnSUdSeWIzQmZibUVvY0hOUGRtVnlLVnh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG4jIHRlbXAyIGNvbnRhaW5zIGdlbmVzIGZyb20gZ3JvdXAgMSwgMiwgNSwgOCBhbmQgbG9vcCBjb3VudHNcbiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzXG5cbnBzT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSA0KSkkZ2VuZVxucHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDMsIG51bV9wcyA8IDQpKSRnZW5lXG5wc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMiwgbnVtX3BzIDwgMykpJGdlbmVcbnBzT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAxLCBudW1fcHMgPCAyKSkkZ2VuZVxucHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzIDwgMSkpJGdlbmVcblxuXG5cblxuIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHNcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX0E0ODVfRE1TTyksXG4gICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksXG4gICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHBzT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcHNPdmVyNCwgXFxwc092ZXI0XFwsXG4gICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjMsIFxccHNPdmVyM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMiwgXFxwc092ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMSwgXFxwc092ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjAsIFxccHNPdmVyMFxcLCBOQSkpKSkpKSAlPiVcbiAgZHJvcF9uYShwc092ZXIpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene




## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)


temp <- temp %>% dplyr::mutate(
  psOver = ifelse(gene %in% psOver4, \psOver4\,
                  ifelse(gene %in% psOver3, \psOver3\,
                         ifelse(gene %in% psOver2, \psOver2\,
                                ifelse(gene %in% psOver1, \psOver1\,
                                       ifelse(gene %in% psOver0, \psOver0\, NA)))))) %>%
  drop_na(psOver)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QjBaVzF3TWlCamIyNTBZV2x1Y3lCblpXNWxjeUJtY205dElHZHliM1Z3SURFc0lESXNJRFVzSURnZ1lXNWtJR3h2YjNBZ1kyOTFiblJ6WEc0alkyRnNZM1ZzWVhScGJtY2daR2xtWmlCelkyOXlaU0JoYm1RZ2JHOW5NbVpqSUdScGMzUnlhV0oxZEdsdmJpQmlZWE5sWkNCdmJpQndMVzRnYm5WdFltVnljMXh1WEc1d2MwOTJaWEkwSUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSE1nUGowZ05Da3BKR2RsYm1WY2JuQnpUM1psY2pNZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y3lBK1BTQXpMQ0J1ZFcxZmNITWdQQ0EwS1Nra1oyVnVaVnh1Y0hOUGRtVnlNaUE4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQnpJRDQ5SURJc0lHNTFiVjl3Y3lBOElETXBLU1JuWlc1bFhHNXdjMDkyWlhJeElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hNZ1BqMGdNU3dnYm5WdFgzQnpJRHdnTWlrcEpHZGxibVZjYm5CelQzWmxjakFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjeUE4SURFcEtTUm5aVzVsWEc1Y2JseHVYRzVjYmlNaklFUnBkbWxrYVc1bklHZGxibVZ6SUdsdWRHOGdaM0p2ZFhCelhHNTBaVzF3SUR3dElHZGxibVZCYm01dlJHRjBZU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hrYVdabVgwRTBPRFZmUkUxVFR5d2daR2x6ZEdGdVkyVXNJR2RsYm1VcElDVStKU0JjYmlBZ2RXNXVaWE4wS0dkbGJtVXBJQ1UrSlNCbmNtOTFjRjlpZVNoblpXNWxLU0FsUGlWY2JpQWdjM1Z0YldGeWFYcGxLRzFsWVc1ZlpHbG1abDl6WTI5eVpTQTlJRzFsWVc0b1pHbG1abDlCTkRnMVgwUk5VMDhwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdiV1ZoYmw5a2FYTjBZVzVqWlNBOUlHMWxZVzRvWkdsemRHRnVZMlVwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdMbWR5YjNWd2N5QTlJQ2RrY205d0p5bGNibHh1WkdsbVppNVNUa0VnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaR2xtWmw5SE1TNUJORGcxTG5ObGJHVmpkR1ZrTWw5SE1TNHlhUzVCTkRnMVgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibHh1YldGNFRHOW5Na1pESUQwZ01seHVYRzUwWlcxd0lEd3RJR3hsWm5SZmFtOXBiaWgwWlcxd0xDQmthV1ptTGxKT1FTd2dZbmtnUFNCaktGeGNaMlZ1WlZ4Y0lEMGdYRnhsYm5ObGJXSnNYMmRsYm1WZmFXUmNYQ2twSUNVK0pTQmNiaUFnWkhKdmNGOXVZU2h6YUhKcGJtdGxaRjlzYjJjeVJrTXBYRzVjYmx4dWRHVnRjQ0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNCd2MwOTJaWElnUFNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUhCelQzWmxjalFzSUZ4Y2NITlBkbVZ5TkZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndjMDkyWlhJekxDQmNYSEJ6VDNabGNqTmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJSEJ6VDNabGNqSXNJRnhjY0hOUGRtVnlNbHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJSEJ6VDNabGNqRXNJRnhjY0hOUGRtVnlNVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndjMDkyWlhJd0xDQmNYSEJ6VDNabGNqQmNYQ3dnVGtFcEtTa3BLU2tnSlQ0bFhHNGdJR1J5YjNCZmJtRW9jSE5QZG1WeUtWeHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG4jIHRlbXAyIGNvbnRhaW5zIGdlbmVzIGZyb20gZ3JvdXAgMSwgMiwgNSwgOCBhbmQgbG9vcCBjb3VudHNcbiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzXG5cbnBzT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSA0KSkkZ2VuZVxucHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDMsIG51bV9wcyA8IDQpKSRnZW5lXG5wc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMiwgbnVtX3BzIDwgMykpJGdlbmVcbnBzT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAxLCBudW1fcHMgPCAyKSkkZ2VuZVxucHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzIDwgMSkpJGdlbmVcblxuXG5cblxuIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHNcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX0E0ODVfRE1TTyksXG4gICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksXG4gICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHBzT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcHNPdmVyNCwgXFxwc092ZXI0XFwsXG4gICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjMsIFxccHNPdmVyM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMiwgXFxwc092ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMSwgXFxwc092ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjAsIFxccHNPdmVyMFxcLCBOQSkpKSkpKSAlPiVcbiAgZHJvcF9uYShwc092ZXIpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyB0ZW1wMiBjb250YWlucyBnZW5lcyBmcm9tIGdyb3VwIDEsIDIsIDUsIDggYW5kIGxvb3AgY291bnRzXG4jY2FsY3VsYXRpbmcgZGlmZiBzY29yZSBhbmQgbG9nMmZjIGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiBwLW4gbnVtYmVyc1xuXG5wc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gNCkpJGdlbmVcbnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZVxucHNPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDIsIG51bV9wcyA8IDMpKSRnZW5lXG5wc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMSwgbnVtX3BzIDwgMikpJGdlbmVcbnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lXG5cblxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9BNDg1X0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcblxubWF4TG9nMkZDID0gMlxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpXG5cblxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKFxuICBwc092ZXIgPSBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjQsIFxccHNPdmVyNFxcLFxuICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIzLCBcXHBzT3ZlcjNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjIsIFxccHNPdmVyMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjEsIFxccHNPdmVyMVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIwLCBcXHBzT3ZlcjBcXCwgTkEpKSkpKSkgJT4lXG4gIGRyb3BfbmEocHNPdmVyKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene




## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)


temp <- temp %>% dplyr::mutate(
  psOver = ifelse(gene %in% psOver4, \psOver4\,
                  ifelse(gene %in% psOver3, \psOver3\,
                         ifelse(gene %in% psOver2, \psOver2\,
                                ifelse(gene %in% psOver1, \psOver1\,
                                       ifelse(gene %in% psOver0, \psOver0\, NA)))))) %>%
  drop_na(psOver)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### log2FC

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJIVDJacFowUnBjaUE4TFNCb1pYSmxLR1pwWjBScGNpd2dYQ0l1TGk5SFQxd2lLVnh1SXlCblpYUkhUeWhjSW5CelQzWmxjalJjSWl3Z1IwOW1hV2RFYVhJc0lIQnpUM1psY2pRcFhHNGpJR2RsZEVkUEtGd2ljSE5QZG1WeU0xd2lMQ0JIVDJacFowUnBjaXdnY0hOUGRtVnlNeWxjYmlNZ1oyVjBSMDhvWENKd2MwOTJaWEl5WENJc0lFZFBabWxuUkdseUxDQndjMDkyWlhJeUtWeHVJeUJuWlhSSFR5aGNJbkJ6VDNabGNqRmNJaXdnUjA5bWFXZEVhWElzSUhCelQzWmxjakVwWEc0aklHZGxkRWRQS0Z3aWNITlBkbVZ5TUZ3aUxDQkhUMlpwWjBScGNpd2djSE5QZG1WeU1DbGNiaU1nWEc0aklDTWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJMXh1SXlCSFR6QXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hsYm5KcFkyaEhUeWhuWlc1bElEMGdjSE5QZG1WeU1Dd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY0lrVk9VMFZOUWt4Y0lpd2diMjUwSUQwZ1hDSkNVRndpS1NsY2JpTWdSMDh4TG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCelQzWmxjakVzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYQ0pGVGxORlRVSk1YQ0lzSUc5dWRDQTlJRndpUWxCY0lpa3BYRzRqSUVkUE1pNWtaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLR1Z1Y21samFFZFBLR2RsYm1VZ1BTQndjMDkyWlhJeUxDQlBjbWRFWWlBOUlHOXlaeTVOYlM1bFp5NWtZaXdnYTJWNVZIbHdaU0E5SUZ3aVJVNVRSVTFDVEZ3aUxDQnZiblFnUFNCY0lrSlFYQ0lwS1Z4dUl5QkhUek11WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNobGJuSnBZMmhIVHloblpXNWxJRDBnY0hOUGRtVnlNeXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUtTbGNiaU1nUjA4MExtUm1JRHd0SUdGekxtUmhkR0V1Wm5KaGJXVW9aVzV5YVdOb1IwOG9aMlZ1WlNBOUlIQnpUM1psY2pRc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWENKRlRsTkZUVUpNWENJc0lHOXVkQ0E5SUZ3aVFsQmNJaWtwWEc0aklGeHVJeUJjYmlNZ2MzVmljMlYwTUNBOExTQkhUekF1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGd2ljSE5QZG1WeU1Gd2lLU0FsUGlWY2JpTWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJeUFnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGpJQ0FnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjSWk5Y0lseHVJeUFnSUNBZ0lDQndZWEowY3lBOExTQjFibXhwYzNRb2MzUnljM0JzYVhRb2VDd2dYQ0l2WENJcEtWeHVJeUFnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaU1nSUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJeUFnSUNBZ2ZTbGNiaU1nSUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNiaU1nYzNWaWMyVjBNU0E4TFNCSFR6RXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ3aWNITlBkbVZ5TVZ3aUtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNJaTljSWx4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hDSXZYQ0lwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdjM1ZpYzJWME1pQThMU0JIVHpJdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRndpY0hOUGRtVnlNbHdpS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SXlBZ0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRqSUNBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY0lpOWNJbHh1SXlBZ0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWENJdlhDSXBLVnh1SXlBZ0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlNZ0lDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SXlBZ0lDQWdmU2xjYmlNZ0lDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmlNZ2MzVmljMlYwTXlBOExTQkhUek11WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGd2ljSE5QZG1WeU0xd2lLU0FsUGlWY2JpTWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJeUFnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGpJQ0FnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjSWk5Y0lseHVJeUFnSUNBZ0lDQndZWEowY3lBOExTQjFibXhwYzNRb2MzUnljM0JzYVhRb2VDd2dYQ0l2WENJcEtWeHVJeUFnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaU1nSUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJeUFnSUNBZ2ZTbGNiaU1nSUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNiaU1nYzNWaWMyVjBOQ0E4TFNCSFR6UXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ3aWNITlBkbVZ5TkZ3aUtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNJaTljSWx4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hDSXZYQ0lwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdYRzRqSUZ4dUl5QkhUMnhwYzNRZ1BDMGdabUZqZEc5eUtHTW9YQ0pIVHpvd01EQTJNemszWENJc0lGd2lSMDg2TURBd09ETTRNRndpTENCY0lrZFBPakF3TWpJMk1UTmNJaXdnWENKSFR6b3dNRE0wTkRjd1hDSXNYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lrZFBPakF3TVRZd05UVmNJaXdnWENKSFR6b3dNREEzTXpnNVhDSXNJRndpUjA4Nk1EQTBPRFUyTWx3aUxDQmNJa2RQT2pBd05EVXhOalZjSWl3Z1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWtkUE9qQXdOekl3TURGY0lpd2dYQ0pIVHpvd01EQTNOVEUzWENJc0lGd2lSMDg2TURBME9EY3dOVndpTENCY0lrZFBPakF3TURNd01ESmNJaWtwWEc0aklGeHVJeUJrWVhSaElEd3RJR0pwYm1SZmNtOTNjeWhpYVc1a1gzSnZkM01vWW1sdVpGOXliM2R6S0dKcGJtUmZjbTkzY3loemRXSnpaWFF3TENCemRXSnpaWFF4S1N3Z2MzVmljMlYwTWlrc0lITjFZbk5sZERNcExDQnpkV0p6WlhRMEtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0VsRUlDVnBiaVVnUjA5c2FYTjBLVnh1SXlCY2JpTWdjQ0E4TFNCblozQnNiM1FvWkdGMFlTd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJRVJsYzJOeWFYQjBhVzl1TENCamIyeHZjaUE5SUhBdVlXUnFkWE4wTENCemFYcGxJRDBnWjNJcEtTQXJJRnh1SXlBZ0lHZGxiMjFmY0c5cGJuUW9LU0FySUhSb1pXMWxYMkozS0NrZ0sxeHVJeUFnSUhOallXeGxYMk52Ykc5eVgyZHlZV1JwWlc1MEtHeHZkeUE5SUZ3aWNtVmtYQ0lzSUdocFoyZ2dQU0JjSW1Kc2RXVmNJaXdnYkdsdGFYUnpJRDBnWXlnd0xDQXdMakExS1NrZ0sxeHVJeUFnSUhOallXeGxYM05wZW1WZlkyOXVkR2x1ZFc5MWN5aHlZVzVuWlNBOUlHTW9NQ3dnTXlrcElDdGNiaU1nSUNCc1lXSnpLSGdnUFNCT1ZVeE1MQ0I1SUQwZ1RsVk1UQ2tnSzF4dUl5QWdJSFJvWlcxbEtHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTmlrc0lDQWpJRk5sZENCaGVHbHpJSFJsZUhRZ2MybDZaVnh1SXlBZ0lDQWdJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFlwTENBaklGTmxkQ0JoZUdseklIUnBkR3hsSUhOcGVtVWdLR2xtSUc1dmRDQnlaVzF2ZG1Wa0tWeHVJeUFnSUNBZ0lDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTJLU3dnSXlCVFpYUWdiR1ZuWlc1a0lIUmxlSFFnYzJsNlpWeHVJeUFnSUNBZ0lDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOaWtwSUZ4dUl5QmNiaU1nWm1sc1pVNWhiV1VnUEMwZ2FHVnlaU2htYVdkRWFYSXNJRndpTGk1Y0lpd2dYQ0pIVDF3aUxDQmNJa2RQWDJkeWIzVndjMTl3YzF3aUtWeHVJeUJvWldsbmFIUWdQU0F5WEc0aklIZHBaSFJvSUQwZ015NDBYRzRqSUhOMloyeHBkR1VvY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaU1nY0hKcGJuUW9jQ2xjYmlNZ1pHVjJMbTltWmlncFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuIyBHT2ZpZ0RpciA8LSBoZXJlKGZpZ0RpciwgXFwuLi9HT1xcKVxuIyBnZXRHTyhcXHBzT3ZlcjRcXCwgR09maWdEaXIsIHBzT3ZlcjQpXG4jIGdldEdPKFxccHNPdmVyM1xcLCBHT2ZpZ0RpciwgcHNPdmVyMylcbiMgZ2V0R08oXFxwc092ZXIyXFwsIEdPZmlnRGlyLCBwc092ZXIyKVxuIyBnZXRHTyhcXHBzT3ZlcjFcXCwgR09maWdEaXIsIHBzT3ZlcjEpXG4jIGdldEdPKFxccHNPdmVyMFxcLCBHT2ZpZ0RpciwgcHNPdmVyMClcbiMgXG4jICMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBHTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBHTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIFxuIyBcbiMgc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMVxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMlxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MyA8LSBHTzMuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyM1xcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyNFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgXG4jIFxuIyBHT2xpc3QgPC0gZmFjdG9yKGMoXFxHTzowMDA2Mzk3XFwsIFxcR086MDAwODM4MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDM0NDcwXFwsXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwMTYwNTVcXCwgXFxHTzowMDA3Mzg5XFwsIFxcR086MDA0ODU2MlxcLCBcXEdPOjAwNDUxNjVcXCwgXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwNzIwMDFcXCwgXFxHTzowMDA3NTE3XFwsIFxcR086MDA0ODcwNVxcLCBcXEdPOjAwMDMwMDJcXCkpXG4jIFxuIyBkYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3MoYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQwLCBzdWJzZXQxKSwgc3Vic2V0MiksIHN1YnNldDMpLCBzdWJzZXQ0KSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuIyBcbiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IERlc2NyaXB0aW9uLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIFxuIyAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgK1xuIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsdWVcXCwgbGltaXRzID0gYygwLCAwLjA1KSkgK1xuIyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICtcbiMgICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuIyAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuIyAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuIyAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuIyBcbiMgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc19wc1xcKVxuIyBoZWlnaHQgPSAyXG4jIHdpZHRoID0gMy40XG4jIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# GOfigDir <- here(figDir, \../GO\)
# getGO(\psOver4\, GOfigDir, psOver4)
# getGO(\psOver3\, GOfigDir, psOver3)
# getGO(\psOver2\, GOfigDir, psOver2)
# getGO(\psOver1\, GOfigDir, psOver1)
# getGO(\psOver0\, GOfigDir, psOver0)
# 
# #####################
# GO0.df <- as.data.frame(enrichGO(gene = psOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO1.df <- as.data.frame(enrichGO(gene = psOver1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO2.df <- as.data.frame(enrichGO(gene = psOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO3.df <- as.data.frame(enrichGO(gene = psOver3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO4.df <- as.data.frame(enrichGO(gene = psOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# 
# 
# subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver0\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver1\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver2\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset3 <- GO3.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver3\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver4\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# 
# 
# GOlist <- factor(c(\GO:0006397\, \GO:0008380\, \GO:0022613\, \GO:0034470\,
#                    \GO:0016055\, \GO:0007389\, \GO:0048562\, \GO:0045165\, 
#                    \GO:0072001\, \GO:0007517\, \GO:0048705\, \GO:0003002\))
# 
# data <- bind_rows(bind_rows(bind_rows(bind_rows(subset0, subset1), subset2), subset3), subset4) %>%
#   dplyr::filter(ID %in% GOlist)
# 
# p <- ggplot(data, aes(x = group, y = Description, color = p.adjust, size = gr)) + 
#   geom_point() + theme_bw() +
#   scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
#   scale_size_continuous(range = c(0, 3)) +
#   labs(x = NULL, y = NULL) +
#   theme(axis.text = element_text(size = 6),  # Set axis text size
#         axis.title = element_text(size = 6), # Set axis title size (if not removed)
#         legend.text = element_text(size = 6), # Set legend text size
#         legend.title = element_text(size = 6)) 
# 
# fileName <- here(figDir, \..\, \GO\, \GO_groups_ps\)
# height = 2
# width = 3.4
# svglite(paste0(fileName, \.svg\), height = height, width = width)
# print(p)
# dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkhUMlpwWjBScGNpQThMU0JvWlhKbEtHWnBaMFJwY2l3Z1hGd3VMaTlIVDF4Y0tWeHVJeUJuWlhSSFR5aGNYSEJ6VDNabGNqUmNYQ3dnUjA5bWFXZEVhWElzSUhCelQzWmxjalFwWEc0aklHZGxkRWRQS0Z4Y2NITlBkbVZ5TTF4Y0xDQkhUMlpwWjBScGNpd2djSE5QZG1WeU15bGNiaU1nWjJWMFIwOG9YRnh3YzA5MlpYSXlYRndzSUVkUFptbG5SR2x5TENCd2MwOTJaWEl5S1Z4dUl5Qm5aWFJIVHloY1hIQnpUM1psY2pGY1hDd2dSMDltYVdkRWFYSXNJSEJ6VDNabGNqRXBYRzRqSUdkbGRFZFBLRnhjY0hOUGRtVnlNRnhjTENCSFQyWnBaMFJwY2l3Z2NITlBkbVZ5TUNsY2JpTWdYRzRqSUNNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakkxeHVJeUJIVHpBdVpHWWdQQzBnWVhNdVpHRjBZUzVtY21GdFpTaGxibkpwWTJoSFR5aG5aVzVsSUQwZ2NITlBkbVZ5TUN3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjWEVWT1UwVk5Ra3hjWEN3Z2IyNTBJRDBnWEZ4Q1VGeGNLU2xjYmlNZ1IwOHhMbVJtSUR3dElHRnpMbVJoZEdFdVpuSmhiV1VvWlc1eWFXTm9SMDhvWjJWdVpTQTlJSEJ6VDNabGNqRXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hGeEZUbE5GVFVKTVhGd3NJRzl1ZENBOUlGeGNRbEJjWENrcFhHNGpJRWRQTWk1a1ppQThMU0JoY3k1a1lYUmhMbVp5WVcxbEtHVnVjbWxqYUVkUEtHZGxibVVnUFNCd2MwOTJaWEl5TENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRnhjUlU1VFJVMUNURnhjTENCdmJuUWdQU0JjWEVKUVhGd3BLVnh1SXlCSFR6TXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hsYm5KcFkyaEhUeWhuWlc1bElEMGdjSE5QZG1WeU15d2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjS1NsY2JpTWdSMDgwTG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCelQzWmxjalFzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYRnhGVGxORlRVSk1YRndzSUc5dWRDQTlJRnhjUWxCY1hDa3BYRzRqSUZ4dUl5QmNiaU1nYzNWaWMyVjBNQ0E4TFNCSFR6QXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ4Y2NITlBkbVZ5TUZ4Y0tTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNYQzljWEZ4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hGd3ZYRndwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdjM1ZpYzJWME1TQThMU0JIVHpFdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRnhjY0hOUGRtVnlNVnhjS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SXlBZ0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRqSUNBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY1hDOWNYRnh1SXlBZ0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWEZ3dlhGd3BLVnh1SXlBZ0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlNZ0lDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SXlBZ0lDQWdmU2xjYmlNZ0lDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmlNZ2MzVmljMlYwTWlBOExTQkhUekl1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGeGNjSE5QZG1WeU1seGNLU0FsUGlWY2JpTWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJeUFnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGpJQ0FnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjWEM5Y1hGeHVJeUFnSUNBZ0lDQndZWEowY3lBOExTQjFibXhwYzNRb2MzUnljM0JzYVhRb2VDd2dYRnd2WEZ3cEtWeHVJeUFnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaU1nSUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJeUFnSUNBZ2ZTbGNiaU1nSUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNiaU1nYzNWaWMyVjBNeUE4TFNCSFR6TXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ4Y2NITlBkbVZ5TTF4Y0tTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNYQzljWEZ4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hGd3ZYRndwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdjM1ZpYzJWME5DQThMU0JIVHpRdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRnhjY0hOUGRtVnlORnhjS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SXlBZ0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRqSUNBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY1hDOWNYRnh1SXlBZ0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWEZ3dlhGd3BLVnh1SXlBZ0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlNZ0lDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SXlBZ0lDQWdmU2xjYmlNZ0lDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmlNZ1hHNGpJRnh1SXlCSFQyeHBjM1FnUEMwZ1ptRmpkRzl5S0dNb1hGeEhUem93TURBMk16azNYRndzSUZ4Y1IwODZNREF3T0RNNE1GeGNMQ0JjWEVkUE9qQXdNakkyTVROY1hDd2dYRnhIVHpvd01ETTBORGN3WEZ3c1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEVkUE9qQXdNVFl3TlRWY1hDd2dYRnhIVHpvd01EQTNNemc1WEZ3c0lGeGNSMDg2TURBME9EVTJNbHhjTENCY1hFZFBPakF3TkRVeE5qVmNYQ3dnWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRWRQT2pBd056SXdNREZjWEN3Z1hGeEhUem93TURBM05URTNYRndzSUZ4Y1IwODZNREEwT0Rjd05WeGNMQ0JjWEVkUE9qQXdNRE13TURKY1hDa3BYRzRqSUZ4dUl5QmtZWFJoSUR3dElHSnBibVJmY205M2N5aGlhVzVrWDNKdmQzTW9ZbWx1WkY5eWIzZHpLR0pwYm1SZmNtOTNjeWh6ZFdKelpYUXdMQ0J6ZFdKelpYUXhLU3dnYzNWaWMyVjBNaWtzSUhOMVluTmxkRE1wTENCemRXSnpaWFEwS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82Wm1sc2RHVnlLRWxFSUNWcGJpVWdSMDlzYVhOMEtWeHVJeUJjYmlNZ2NDQThMU0JuWjNCc2IzUW9aR0YwWVN3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlFUmxjMk55YVhCMGFXOXVMQ0JqYjJ4dmNpQTlJSEF1WVdScWRYTjBMQ0J6YVhwbElEMGdaM0lwS1NBcklGeHVJeUFnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJSFJvWlcxbFgySjNLQ2tnSzF4dUl5QWdJSE5qWVd4bFgyTnZiRzl5WDJkeVlXUnBaVzUwS0d4dmR5QTlJRnhjY21Wa1hGd3NJR2hwWjJnZ1BTQmNYR0pzZFdWY1hDd2diR2x0YVhSeklEMGdZeWd3TENBd0xqQTFLU2tnSzF4dUl5QWdJSE5qWVd4bFgzTnBlbVZmWTI5dWRHbHVkVzkxY3loeVlXNW5aU0E5SUdNb01Dd2dNeWtwSUN0Y2JpTWdJQ0JzWVdKektIZ2dQU0JPVlV4TUxDQjVJRDBnVGxWTVRDa2dLMXh1SXlBZ0lIUm9aVzFsS0dGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOaWtzSUNBaklGTmxkQ0JoZUdseklIUmxlSFFnYzJsNlpWeHVJeUFnSUNBZ0lDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9jMmw2WlNBOUlEWXBMQ0FqSUZObGRDQmhlR2x6SUhScGRHeGxJSE5wZW1VZ0tHbG1JRzV2ZENCeVpXMXZkbVZrS1Z4dUl5QWdJQ0FnSUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBMktTd2dJeUJUWlhRZ2JHVm5aVzVrSUhSbGVIUWdjMmw2WlZ4dUl5QWdJQ0FnSUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3BJRnh1SXlCY2JpTWdabWxzWlU1aGJXVWdQQzBnYUdWeVpTaG1hV2RFYVhJc0lGeGNMaTVjWEN3Z1hGeEhUMXhjTENCY1hFZFBYMmR5YjNWd2MxOXdjMXhjS1Z4dUl5Qm9aV2xuYUhRZ1BTQXlYRzRqSUhkcFpIUm9JRDBnTXk0MFhHNGpJSE4yWjJ4cGRHVW9jR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpTWdjSEpwYm5Rb2NDbGNiaU1nWkdWMkxtOW1aaWdwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuIyBHT2ZpZ0RpciA8LSBoZXJlKGZpZ0RpciwgXFwuLi9HT1xcKVxuIyBnZXRHTyhcXHBzT3ZlcjRcXCwgR09maWdEaXIsIHBzT3ZlcjQpXG4jIGdldEdPKFxccHNPdmVyM1xcLCBHT2ZpZ0RpciwgcHNPdmVyMylcbiMgZ2V0R08oXFxwc092ZXIyXFwsIEdPZmlnRGlyLCBwc092ZXIyKVxuIyBnZXRHTyhcXHBzT3ZlcjFcXCwgR09maWdEaXIsIHBzT3ZlcjEpXG4jIGdldEdPKFxccHNPdmVyMFxcLCBHT2ZpZ0RpciwgcHNPdmVyMClcbiMgXG4jICMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBHTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBHTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIFxuIyBcbiMgc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMVxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMlxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MyA8LSBHTzMuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyM1xcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyNFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgXG4jIFxuIyBHT2xpc3QgPC0gZmFjdG9yKGMoXFxHTzowMDA2Mzk3XFwsIFxcR086MDAwODM4MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDM0NDcwXFwsXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwMTYwNTVcXCwgXFxHTzowMDA3Mzg5XFwsIFxcR086MDA0ODU2MlxcLCBcXEdPOjAwNDUxNjVcXCwgXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwNzIwMDFcXCwgXFxHTzowMDA3NTE3XFwsIFxcR086MDA0ODcwNVxcLCBcXEdPOjAwMDMwMDJcXCkpXG4jIFxuIyBkYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3MoYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQwLCBzdWJzZXQxKSwgc3Vic2V0MiksIHN1YnNldDMpLCBzdWJzZXQ0KSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuIyBcbiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IERlc2NyaXB0aW9uLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIFxuIyAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgK1xuIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsdWVcXCwgbGltaXRzID0gYygwLCAwLjA1KSkgK1xuIyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICtcbiMgICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuIyAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuIyAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuIyAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuIyBcbiMgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc19wc1xcKVxuIyBoZWlnaHQgPSAyXG4jIHdpZHRoID0gMy40XG4jIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBHT2ZpZ0RpciA8LSBoZXJlKGZpZ0RpciwgXFwuLi9HT1xcKVxuIyBnZXRHTyhcXHBzT3ZlcjRcXCwgR09maWdEaXIsIHBzT3ZlcjQpXG4jIGdldEdPKFxccHNPdmVyM1xcLCBHT2ZpZ0RpciwgcHNPdmVyMylcbiMgZ2V0R08oXFxwc092ZXIyXFwsIEdPZmlnRGlyLCBwc092ZXIyKVxuIyBnZXRHTyhcXHBzT3ZlcjFcXCwgR09maWdEaXIsIHBzT3ZlcjEpXG4jIGdldEdPKFxccHNPdmVyMFxcLCBHT2ZpZ0RpciwgcHNPdmVyMClcbiMgXG4jICMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBHTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBHTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIFxuIyBcbiMgc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMVxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMlxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MyA8LSBHTzMuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyM1xcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyNFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgXG4jIFxuIyBHT2xpc3QgPC0gZmFjdG9yKGMoXFxHTzowMDA2Mzk3XFwsIFxcR086MDAwODM4MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDM0NDcwXFwsXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwMTYwNTVcXCwgXFxHTzowMDA3Mzg5XFwsIFxcR086MDA0ODU2MlxcLCBcXEdPOjAwNDUxNjVcXCwgXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwNzIwMDFcXCwgXFxHTzowMDA3NTE3XFwsIFxcR086MDA0ODcwNVxcLCBcXEdPOjAwMDMwMDJcXCkpXG4jIFxuIyBkYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3MoYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQwLCBzdWJzZXQxKSwgc3Vic2V0MiksIHN1YnNldDMpLCBzdWJzZXQ0KSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuIyBcbiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IERlc2NyaXB0aW9uLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIFxuIyAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgK1xuIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsdWVcXCwgbGltaXRzID0gYygwLCAwLjA1KSkgK1xuIyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICtcbiMgICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuIyAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuIyAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuIyAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuIyBcbiMgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc19wc1xcKVxuIyBoZWlnaHQgPSAyXG4jIHdpZHRoID0gMy40XG4jIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
# GOfigDir <- here(figDir, \../GO\)
# getGO(\psOver4\, GOfigDir, psOver4)
# getGO(\psOver3\, GOfigDir, psOver3)
# getGO(\psOver2\, GOfigDir, psOver2)
# getGO(\psOver1\, GOfigDir, psOver1)
# getGO(\psOver0\, GOfigDir, psOver0)
# 
# #####################
# GO0.df <- as.data.frame(enrichGO(gene = psOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO1.df <- as.data.frame(enrichGO(gene = psOver1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO2.df <- as.data.frame(enrichGO(gene = psOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO3.df <- as.data.frame(enrichGO(gene = psOver3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO4.df <- as.data.frame(enrichGO(gene = psOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# 
# 
# subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver0\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver1\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver2\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset3 <- GO3.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver3\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver4\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# 
# 
# GOlist <- factor(c(\GO:0006397\, \GO:0008380\, \GO:0022613\, \GO:0034470\,
#                    \GO:0016055\, \GO:0007389\, \GO:0048562\, \GO:0045165\, 
#                    \GO:0072001\, \GO:0007517\, \GO:0048705\, \GO:0003002\))
# 
# data <- bind_rows(bind_rows(bind_rows(bind_rows(subset0, subset1), subset2), subset3), subset4) %>%
#   dplyr::filter(ID %in% GOlist)
# 
# p <- ggplot(data, aes(x = group, y = Description, color = p.adjust, size = gr)) + 
#   geom_point() + theme_bw() +
#   scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
#   scale_size_continuous(range = c(0, 3)) +
#   labs(x = NULL, y = NULL) +
#   theme(axis.text = element_text(size = 6),  # Set axis text size
#         axis.title = element_text(size = 6), # Set axis title size (if not removed)
#         legend.text = element_text(size = 6), # Set legend text size
#         legend.title = element_text(size = 6)) 
# 
# fileName <- here(figDir, \..\, \GO\, \GO_groups_ps\)
# height = 2
# width = 3.4
# svglite(paste0(fileName, \.svg\), height = height, width = width)
# print(p)
# dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Grouping with P-S number
##### Grouping

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpTWdJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvY0hOUGRtVnlJRDA5WjNKdmRYQXhLU0FwSkcxbFlXNWZaR2xtWmw5elkyOXlaVnh1SXlBZ0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGpJQ0FnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJeUFnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JpTWdmVnh1SXlCY2JpTWdjSE13TVNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGd2ljSE5QZG1WeU1Gd2lMQ0JjSW5CelQzWmxjakZjSWlrc0lEVXBYRzRqSUhCek1USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjSW5CelQzWmxjakZjSWl3Z1hDSndjMDkyWlhJeVhDSXBMQ0ExS1Z4dUl5Qndjekl6SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hDSndjMDkyWlhJeVhDSXNJRndpY0hOUGRtVnlNMXdpS1N3Z05TbGNiaU1nY0hNek5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRndpY0hOUGRtVnlNMXdpTENCY0luQnpUM1psY2pSY0lpa3NJRFVwWEc0aklIQnpNalFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TENCY0luQnpUM1psY2pKY0lpd2dYQ0p3YzA5MlpYSTBYQ0lwTENBMUtWeHVJeUJ3Y3pFMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYQ0p3YzA5MlpYSXhYQ0lzSUZ3aWNITlBkbVZ5TkZ3aUtTd2dOU2xjYmlNZ2NITXdOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ3aWNITlBkbVZ5TUZ3aUxDQmNJbkJ6VDNabGNqUmNJaWtzSURVcFhHNGpJRnh1WEc1d0lEd3RJR2RuY0d4dmRDaDBaVzF3TENCaFpYTW9lQ0E5SUhCelQzWmxjaXdnZVNBOUlHMWxZVzVmWkdsbVpsOXpZMjl5WlNrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCd2MwOTJaWElwTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdjSE5QZG1WeUtTd2dablZ1SUQwZ2JXVmhiaXdnWjJWdmJTQTlJRndpY0c5cGJuUmNJaXdnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURJc0lHWnBiR3dnUFNCY0luSmxaRndpTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWlrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLVnh1SUNBaklHRnVibTkwWVhSbEtGd2lkR1Y0ZEZ3aUxDQjRJRDBnTVN3Z2VTQTlJREFzSUd4aFltVnNJRDBnY0dGemRHVXdLRndpY0hNd01Ub2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NITXdNU2tzSUZ3aVhGeHVYQ0lzWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hNeE1qb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NITXhNaWtzSUZ3aVhGeHVYQ0lzWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hNeU16b2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NITXlNeWtzSUZ3aVhGeHVYQ0lzWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hNek5Eb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NITXpOQ2tzSUZ3aVhGeHVYQ0lzWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hNeU5Eb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NITXlOQ2tzSUZ3aVhGeHVYQ0lzSUZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5Cek1UUTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNVFFwTENCY0lseGNibHdpTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5Cek1EUTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNRFFwTENCY0lseGNibHdpS1N3Z1hHNGdJQ01nSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzSUdocWRYTjBJRDBnTUN3Z2MybDZaU0E5SURNcFhHNWNiaUFnWEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSmthV1ptVTJOdmNtVmZZbUZ5Y0d4dmRGOXdjMGR5YjNWd1gwRTBPRFZmZG5OZlJFMVRUMXdpS1Z4dWFHVnBaMmgwSUR3dElETmNibmRwWkhSb0lEd3RJRE5jYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibUJnWUNKOSAtLT5cblxuYGBgclxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcbiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG4jIHBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxuIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIFxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHBzT3ZlciwgeSA9IG1lYW5fZGlmZl9zY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwc092ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsIFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxkaWZmU2NvcmVfYmFycGxvdF9wc0dyb3VwX0E0ODVfdnNfRE1TT1xcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(psOver ==group1) )$mean_diff_score
#   distance2 <- (data %>% dplyr::filter(psOver ==group2) )$mean_diff_score
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
# ps01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(temp, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(temp, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)
# 

p <- ggplot(temp, aes(x = psOver, y = mean_diff_score)) + geom_violin(aes(fill = psOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = psOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\, 
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3)

  
fileName <- paste0(\diffScore_barplot_psGroup_A485_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5Qm5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlNZ0lDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jSE5QZG1WeUlEMDlaM0p2ZFhBeEtTQXBKRzFsWVc1ZlpHbG1abDl6WTI5eVpWeHVJeUFnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2MwOTJaWElnUFQxbmNtOTFjRElwSUNra2JXVmhibDlrYVdabVgzTmpiM0psWEc0aklDQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUl5QWdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYmlNZ2ZWeHVJeUJjYmlNZ2NITXdNU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ4Y2NITlBkbVZ5TUZ4Y0xDQmNYSEJ6VDNabGNqRmNYQ2tzSURVcFhHNGpJSEJ6TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNYSEJ6VDNabGNqRmNYQ3dnWEZ4d2MwOTJaWEl5WEZ3cExDQTFLVnh1SXlCd2N6SXpJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWEZ4d2MwOTJaWEl5WEZ3c0lGeGNjSE5QZG1WeU0xeGNLU3dnTlNsY2JpTWdjSE16TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGeGNjSE5QZG1WeU0xeGNMQ0JjWEhCelQzWmxjalJjWENrc0lEVXBYRzRqSUhCek1qUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjWEhCelQzWmxjakpjWEN3Z1hGeHdjMDkyWlhJMFhGd3BMQ0ExS1Z4dUl5QndjekUwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hGeHdjMDkyWlhJeFhGd3NJRnhjY0hOUGRtVnlORnhjS1N3Z05TbGNiaU1nY0hNd05DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRnhjY0hOUGRtVnlNRnhjTENCY1hIQnpUM1psY2pSY1hDa3NJRFVwWEc0aklGeHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJSEJ6VDNabGNpd2dlU0E5SUcxbFlXNWZaR2xtWmw5elkyOXlaU2twSUNzZ1oyVnZiVjkyYVc5c2FXNG9ZV1Z6S0dacGJHd2dQU0J3YzA5MlpYSXBMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBclhHNGdJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU1Td2diM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ2NITlBkbVZ5S1N3Z1puVnVJRDBnYldWaGJpd2daMlZ2YlNBOUlGeGNjRzlwYm5SY1hDd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJRElzSUdacGJHd2dQU0JjWEhKbFpGeGNMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0tWeHVJQ0FqSUdGdWJtOTBZWFJsS0Z4Y2RHVjRkRnhjTENCNElEMGdNU3dnZVNBOUlEQXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGeGNjSE13TVRvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hNd01Ta3NJRnhjWEZ4dVhGd3NYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSE14TWpvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hNeE1pa3NJRnhjWEZ4dVhGd3NYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSE15TXpvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hNeU15a3NJRnhjWEZ4dVhGd3NYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSE16TkRvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hNek5Da3NJRnhjWEZ4dVhGd3NYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSE15TkRvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0hNeU5Da3NJRnhjWEZ4dVhGd3NJRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEJ6TVRRNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek1UUXBMQ0JjWEZ4Y2JseGNMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEJ6TURRNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek1EUXBMQ0JjWEZ4Y2JseGNLU3dnWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wWEc1Y2JpQWdYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4a2FXWm1VMk52Y21WZlltRnljR3h2ZEY5d2MwZHliM1Z3WDBFME9EVmZkbk5mUkUxVFQxeGNLVnh1YUdWcFoyaDBJRHd0SUROY2JuZHBaSFJvSUR3dElETmNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbiMgZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4jICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRtZWFuX2RpZmZfc2NvcmVcbiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJG1lYW5fZGlmZl9zY29yZVxuIyAgIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiMgICByZXR1cm4od2lsJHAudmFsdWUpXG4jIH1cbiMgXG4jIHBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxuIyBwczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbiMgcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG4jIHBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBcblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwc092ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBzT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLCBcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcZGlmZlNjb3JlX2JhcnBsb3RfcHNHcm91cF9BNDg1X3ZzX0RNU09cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcbiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG4jIHBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxuIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIFxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHBzT3ZlciwgeSA9IG1lYW5fZGlmZl9zY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwc092ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsIFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxkaWZmU2NvcmVfYmFycGxvdF9wc0dyb3VwX0E0ODVfdnNfRE1TT1xcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(psOver ==group1) )$mean_diff_score
#   distance2 <- (data %>% dplyr::filter(psOver ==group2) )$mean_diff_score
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
# ps01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(temp, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(temp, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)
# 

p <- ggplot(temp, aes(x = psOver, y = mean_diff_score)) + geom_violin(aes(fill = psOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = psOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\, 
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3)

  
fileName <- paste0(\diffScore_barplot_psGroup_A485_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### (SKIP) GO for each group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJMXh1SXlBZ1oyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRqSUNBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIQnpUM1psY2lBOVBXZHliM1Z3TVNrZ0tTUnNiMmN5Um05c1pFTm9ZVzVuWlZ4dUl5QWdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3YzA5MlpYSWdQVDFuY205MWNESXBJQ2trYkc5bk1rWnZiR1JEYUdGdVoyVmNiaU1nSUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRqSUNBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVJeUI5WEc1Y2JuUmxiWEJFYjNkdUlEd3RJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JHOW5Na1p2YkdSRGFHRnVaMlVnUENBd0tWeHVJeUFnWEc0aklIQnpNREVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3Ukc5M2Jpd2dYQ0p3YzA5MlpYSXdYQ0lzSUZ3aWNITlBkbVZ5TVZ3aUtTd2dOU2xjYmlNZ2NITXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNJbkJ6VDNabGNqRmNJaXdnWENKd2MwOTJaWEl5WENJcExDQTFLVnh1SXlCd2N6SXpJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRVJ2ZDI0c0lGd2ljSE5QZG1WeU1sd2lMQ0JjSW5CelQzWmxjak5jSWlrc0lEVXBYRzRqSUhCek16UWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdSRzkzYml3Z1hDSndjMDkyWlhJelhDSXNJRndpY0hOUGRtVnlORndpS1N3Z05TbGNiaU1nY0hNeU5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY0luQnpUM1psY2pKY0lpd2dYQ0p3YzA5MlpYSTBYQ0lwTENBMUtWeHVJeUJ3Y3pFMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNFUnZkMjRzSUZ3aWNITlBkbVZ5TVZ3aUxDQmNJbkJ6VDNabGNqUmNJaWtzSURVcFhHNGpJRnh1SXlCd2N6QTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRVJ2ZDI0c0lGd2ljSE5QZG1WeU1Gd2lMQ0JjSW5CelQzWmxjalJjSWlrc0lEVXBYRzVjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0VSdmQyNHNJR0ZsY3loNElEMGdjSE5QZG1WeUxDQjVJRDBnYkc5bk1rWnZiR1JEYUdGdVoyVXBLU0FySUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdjSE5QZG1WeUtTd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnSzF4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLR0ZsY3lobmNtOTFjQ0E5SUhCelQzWmxjaWtzSUdaMWJpQTlJRzFsWVc0c0lHZGxiMjBnUFNCY0luQnZhVzUwWENJc0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXlMQ0JtYVd4c0lEMGdYQ0p5WldSY0lpd2dZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUNsY2JpQWdJeUJoYm01dmRHRjBaU2hjSW5SbGVIUmNJaXdnZUNBOUlERXNJSGtnUFNBdE1DNDFMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkJ6TURFNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1ERXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TVRJNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1USXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TWpNNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1qTXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TXpRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek16UXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TWpRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1qUXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TVRRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1UUXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TURRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1EUXBMQ0JjSWx4Y2Jsd2lLU3dnWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wSUNzZ1kyOXZjbVJmWTJGeWRHVnphV0Z1S0hsc2FXMGdQU0JqS0MweExDQXdLU2xjYmx4dUlDQmNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW14dlp6SkdRMTlpWVhKd2JHOTBYM0J6UjNKdmRYQmZRVFE0TlY5MmMxOUVUVk5QWDJSdmQyNWNJaWxjYm1obGFXZG9kQ0E4TFNBelhHNTNhV1IwYUNBOExTQXpYRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWNibHh1WEc1MFpXMXdWWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhzYjJjeVJtOXNaRU5vWVc1blpTQStJREFwWEc0aklDQmNiaU1nY0hNd01TQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlZjQ3dnWENKd2MwOTJaWEl3WENJc0lGd2ljSE5QZG1WeU1Wd2lLU3dnTlNsY2JpTWdjSE14TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVmNDd2dYQ0p3YzA5MlpYSXhYQ0lzSUZ3aWNITlBkbVZ5TWx3aUtTd2dOU2xjYmlNZ2NITXlNeUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJWY0N3Z1hDSndjMDkyWlhJeVhDSXNJRndpY0hOUGRtVnlNMXdpS1N3Z05TbGNiaU1nY0hNek5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlZjQ3dnWENKd2MwOTJaWEl6WENJc0lGd2ljSE5QZG1WeU5Gd2lLU3dnTlNsY2JpTWdjSE15TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVmNDd2dYQ0p3YzA5MlpYSXlYQ0lzSUZ3aWNITlBkbVZ5TkZ3aUtTd2dOU2xjYmlNZ2NITXhOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJWY0N3Z1hDSndjMDkyWlhJeFhDSXNJRndpY0hOUGRtVnlORndpS1N3Z05TbGNiaU1nY0hNd05DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlZjQ3dnWENKd2MwOTJaWEl3WENJc0lGd2ljSE5QZG1WeU5Gd2lLU3dnTlNsY2JpTWdYRzVjYmx4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd1ZYQXNJR0ZsY3loNElEMGdjSE5QZG1WeUxDQjVJRDBnYkc5bk1rWnZiR1JEYUdGdVoyVXBLU0FySUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdjSE5QZG1WeUtTd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnSzF4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLR0ZsY3lobmNtOTFjQ0E5SUhCelQzWmxjaWtzSUdaMWJpQTlJRzFsWVc0c0lHZGxiMjBnUFNCY0luQnZhVzUwWENJc0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXlMQ0JtYVd4c0lEMGdYQ0p5WldSY0lpd2dZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUNsY2JpQWdJeUJoYm01dmRHRjBaU2hjSW5SbGVIUmNJaXdnZUNBOUlERXNJSGtnUFNBd0xqVXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGd2ljSE13TVRvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNd01Ta3NJRndpWEZ4dVhDSXNYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE14TWpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNeE1pa3NJRndpWEZ4dVhDSXNYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE15TXpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNeU15a3NJRndpWEZ4dVhDSXNYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE16TkRvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNek5Da3NJRndpWEZ4dVhDSXNYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE15TkRvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNeU5Da3NJRndpWEZ4dVhDSXNYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE14TkRvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNeE5Da3NJRndpWEZ4dVhDSXNYRzRnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE13TkRvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNd05Da3NJRndpWEZ4dVhDSXBMQ0JjYmlBZ0l5QWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNeWtnS3lCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTUN3Z01Ta3BYRzVjYmlBZ1hHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0pzYjJjeVJrTmZZbUZ5Y0d4dmRGOXdjMGR5YjNWd1gwRTBPRFZmZG5OZlJFMVRUMTkxY0Z3aUtWeHVhR1ZwWjJoMElEd3RJRE5jYm5kcFpIUm9JRHd0SUROY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiNcbiMgIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuIyAgIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbG9nMkZvbGRDaGFuZ2VcbiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJGxvZzJGb2xkQ2hhbmdlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuXG50ZW1wRG93biA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlIDwgMClcbiMgIFxuIyBwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG4jIHBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbiMgcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXIzXFwpLCA1KVxuIyBwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBcbiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KHRlbXBEb3duLCBhZXMoeCA9IHBzT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gLTAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMSwgMCkpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfYmFycGxvdF9wc0dyb3VwX0E0ODVfdnNfRE1TT19kb3duXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cblxudGVtcFVwIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPiAwKVxuIyAgXG4jIHBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG4jIHBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjJcXCksIDUpXG4jIHBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG4jIHBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIFxuXG5cblxucCA8LSBnZ3Bsb3QodGVtcFVwLCBhZXMoeCA9IHBzT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMC41LCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEpKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcHNHcm91cF9BNDg1X3ZzX0RNU09fdXBcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
#
#  getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(psOver ==group1) )$log2FoldChange
#   distance2 <- (data %>% dplyr::filter(psOver ==group2) )$log2FoldChange
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }

tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
#  
# ps01 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(tempDown, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver4\), 5)
# 
# ps04 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver4\), 5)


p <- ggplot(tempDown, aes(x = psOver, y = log2FoldChange)) + geom_violin(aes(fill = psOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = psOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = -0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(-1, 0))

  
fileName <- paste0(\log2FC_barplot_psGroup_A485_vs_DMSO_down\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
#  
# ps01 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(tempUp, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver4\), 5)
# 



p <- ggplot(tempUp, aes(x = psOver, y = log2FoldChange)) + geom_violin(aes(fill = psOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = psOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_psGroup_A485_vs_DMSO_up\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUkxeHVJeUFnWjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGpJQ0FnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hCelQzWmxjaUE5UFdkeWIzVndNU2tnS1NSc2IyY3lSbTlzWkVOb1lXNW5aVnh1SXlBZ0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiRzluTWtadmJHUkRhR0Z1WjJWY2JpTWdJQ0IzYVd3Z1BDMGdkMmxzWTI5NExuUmxjM1FvWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcFhHNGpJQ0FnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dUl5QjlYRzVjYm5SbGJYQkViM2R1SUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYkc5bk1rWnZiR1JEYUdGdVoyVWdQQ0F3S1Z4dUl5QWdYRzRqSUhCek1ERWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdSRzkzYml3Z1hGeHdjMDkyWlhJd1hGd3NJRnhjY0hOUGRtVnlNVnhjS1N3Z05TbGNiaU1nY0hNeE1pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY1hIQnpUM1psY2pGY1hDd2dYRnh3YzA5MlpYSXlYRndwTENBMUtWeHVJeUJ3Y3pJeklEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNFUnZkMjRzSUZ4Y2NITlBkbVZ5TWx4Y0xDQmNYSEJ6VDNabGNqTmNYQ2tzSURVcFhHNGpJSEJ6TXpRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1JHOTNiaXdnWEZ4d2MwOTJaWEl6WEZ3c0lGeGNjSE5QZG1WeU5GeGNLU3dnTlNsY2JpTWdjSE15TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjWEhCelQzWmxjakpjWEN3Z1hGeHdjMDkyWlhJMFhGd3BMQ0ExS1Z4dUl5QndjekUwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0VSdmQyNHNJRnhjY0hOUGRtVnlNVnhjTENCY1hIQnpUM1psY2pSY1hDa3NJRFVwWEc0aklGeHVJeUJ3Y3pBMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNFUnZkMjRzSUZ4Y2NITlBkbVZ5TUZ4Y0xDQmNYSEJ6VDNabGNqUmNYQ2tzSURVcFhHNWNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjRVJ2ZDI0c0lHRmxjeWg0SUQwZ2NITlBkbVZ5TENCNUlEMGdiRzluTWtadmJHUkRhR0Z1WjJVcEtTQXJJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ2NITlBkbVZ5S1N3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMakVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QmNiaUFnYzNSaGRGOXpkVzF0WVhKNUtHRmxjeWhuY205MWNDQTlJSEJ6VDNabGNpa3NJR1oxYmlBOUlHMWxZVzRzSUdkbGIyMGdQU0JjWEhCdmFXNTBYRndzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBeUxDQm1hV3hzSUQwZ1hGeHlaV1JjWEN3Z1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3cElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ2xjYmlBZ0l5QmhibTV2ZEdGMFpTaGNYSFJsZUhSY1hDd2dlQ0E5SURFc0lIa2dQU0F0TUM0MUxDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQnpNREU2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TURFcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNVEk2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TVRJcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNak02SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TWpNcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNelE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TXpRcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNalE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TWpRcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNVFE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TVRRcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNRFE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TURRcExDQmNYRnhjYmx4Y0tTd2dYRzRnSUNNZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBJQ3NnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLQzB4TENBd0tTbGNibHh1SUNCY2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYR3h2WnpKR1ExOWlZWEp3Ykc5MFgzQnpSM0p2ZFhCZlFUUTROVjkyYzE5RVRWTlBYMlJ2ZDI1Y1hDbGNibWhsYVdkb2RDQThMU0F6WEc1M2FXUjBhQ0E4TFNBelhHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Y2JseHVYRzUwWlcxd1ZYQWdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHNiMmN5Um05c1pFTm9ZVzVuWlNBK0lEQXBYRzRqSUNCY2JpTWdjSE13TVNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVmNDd2dYRnh3YzA5MlpYSXdYRndzSUZ4Y2NITlBkbVZ5TVZ4Y0tTd2dOU2xjYmlNZ2NITXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJWY0N3Z1hGeHdjMDkyWlhJeFhGd3NJRnhjY0hOUGRtVnlNbHhjS1N3Z05TbGNiaU1nY0hNeU15QThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlZjQ3dnWEZ4d2MwOTJaWEl5WEZ3c0lGeGNjSE5QZG1WeU0xeGNLU3dnTlNsY2JpTWdjSE16TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVmNDd2dYRnh3YzA5MlpYSXpYRndzSUZ4Y2NITlBkbVZ5TkZ4Y0tTd2dOU2xjYmlNZ2NITXlOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJWY0N3Z1hGeHdjMDkyWlhJeVhGd3NJRnhjY0hOUGRtVnlORnhjS1N3Z05TbGNiaU1nY0hNeE5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlZjQ3dnWEZ4d2MwOTJaWEl4WEZ3c0lGeGNjSE5QZG1WeU5GeGNLU3dnTlNsY2JpTWdjSE13TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVmNDd2dYRnh3YzA5MlpYSXdYRndzSUZ4Y2NITlBkbVZ5TkZ4Y0tTd2dOU2xjYmlNZ1hHNWNibHh1WEc1d0lEd3RJR2RuY0d4dmRDaDBaVzF3VlhBc0lHRmxjeWg0SUQwZ2NITlBkbVZ5TENCNUlEMGdiRzluTWtadmJHUkRhR0Z1WjJVcEtTQXJJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ2NITlBkbVZ5S1N3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMakVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QmNiaUFnYzNSaGRGOXpkVzF0WVhKNUtHRmxjeWhuY205MWNDQTlJSEJ6VDNabGNpa3NJR1oxYmlBOUlHMWxZVzRzSUdkbGIyMGdQU0JjWEhCdmFXNTBYRndzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBeUxDQm1hV3hzSUQwZ1hGeHlaV1JjWEN3Z1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3cElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ2xjYmlBZ0l5QmhibTV2ZEdGMFpTaGNYSFJsZUhSY1hDd2dlQ0E5SURFc0lIa2dQU0F3TGpVc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z4Y2NITXdNVG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE13TVNrc0lGeGNYRnh1WEZ3c1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXhNam9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE14TWlrc0lGeGNYRnh1WEZ3c1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXlNem9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE15TXlrc0lGeGNYRnh1WEZ3c1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXpORG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE16TkNrc0lGeGNYRnh1WEZ3c1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXlORG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE15TkNrc0lGeGNYRnh1WEZ3c1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXhORG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE14TkNrc0lGeGNYRnh1WEZ3c1hHNGdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXdORG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE13TkNrc0lGeGNYRnh1WEZ3cExDQmNiaUFnSXlBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ015a2dLeUJqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9NQ3dnTVNrcFhHNWNiaUFnWEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hGeHNiMmN5UmtOZlltRnljR3h2ZEY5d2MwZHliM1Z3WDBFME9EVmZkbk5mUkUxVFQxOTFjRnhjS1Z4dWFHVnBaMmgwSUR3dElETmNibmRwWkhSb0lEd3RJRE5jYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG4jXG4jICBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJGxvZzJGb2xkQ2hhbmdlXG4jICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMikgKSRsb2cyRm9sZENoYW5nZVxuIyAgIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiMgICByZXR1cm4od2lsJHAudmFsdWUpXG4jIH1cblxudGVtcERvd24gPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA8IDApXG4jICBcbiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxuIyBwczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjJcXCksIDUpXG4jIHBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgXG4jIHBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wRG93biwgYWVzKHggPSBwc092ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwc092ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IC0wLjUsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsIGNvbnZQdmFsdWUocHMxNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMwNDogXFwsIGNvbnZQdmFsdWUocHMwNCksIFxcXFxuXFwpLCBcbiAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEsIDApKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcHNHcm91cF9BNDg1X3ZzX0RNU09fZG93blxcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMClcbiMgIFxuIyBwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxuIyBwczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxuIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXIzXFwpLCA1KVxuIyBwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBcblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwc092ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwc092ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSlcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BzR3JvdXBfQTQ4NV92c19ETVNPX3VwXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuI1xuIyAgZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4jICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2VcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG5cbnRlbXBEb3duIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKVxuIyAgXG4jIHBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxuIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG4jIHBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIFxuIyBwczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcERvd24sIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBzT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAtMC41LCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0xLCAwKSlcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BzR3JvdXBfQTQ4NV92c19ETVNPX2Rvd25cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG50ZW1wVXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA+IDApXG4jICBcbiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbiMgcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgXG5cblxuXG5wIDwtIGdncGxvdCh0ZW1wVXAsIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBzT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLjUsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsIGNvbnZQdmFsdWUocHMxNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMwNDogXFwsIGNvbnZQdmFsdWUocHMwNCksIFxcXFxuXFwpLCBcbiAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfYmFycGxvdF9wc0dyb3VwX0E0ODVfdnNfRE1TT191cFxcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
#
#  getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(psOver ==group1) )$log2FoldChange
#   distance2 <- (data %>% dplyr::filter(psOver ==group2) )$log2FoldChange
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }

tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
#  
# ps01 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(tempDown, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver4\), 5)
# 
# ps04 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver4\), 5)


p <- ggplot(tempDown, aes(x = psOver, y = log2FoldChange)) + geom_violin(aes(fill = psOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = psOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = -0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(-1, 0))

  
fileName <- paste0(\log2FC_barplot_psGroup_A485_vs_DMSO_down\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
#  
# ps01 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(tempUp, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver4\), 5)
# 



p <- ggplot(tempUp, aes(x = psOver, y = log2FoldChange)) + geom_violin(aes(fill = psOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = psOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_psGroup_A485_vs_DMSO_up\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### loop score

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUIwWlcxd01pQmpiMjUwWVdsdWN5Qm5aVzVsY3lCbWNtOXRJR2R5YjNWd0lERXNJRElzSURVc0lEZ2dZVzVrSUd4dmIzQWdZMjkxYm5SelhHNGpZMkZzWTNWc1lYUnBibWNnWkdsbVppQnpZMjl5WlNCaGJtUWdiRzluTW1aaklHUnBjM1J5YVdKMWRHbHZiaUJpWVhObFpDQnZiaUJ3TFc0Z2JuVnRZbVZ5YzF4dVhHNXdaVTkyWlhJMElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0dVZ1BqMGdOQ2twSkdkbGJtVmNibkJsVDNabGNqTWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d1pTQStQU0F6TENCdWRXMWZjR1VnUENBMEtTa2taMlZ1WlZ4dWNHVlBkbVZ5TWlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0JsSUQ0OUlESXNJRzUxYlY5d1pTQThJRE1wS1NSblpXNWxYRzV3WlU5MlpYSXhJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNHVWdQajBnTVN3Z2JuVnRYM0JsSUR3Z01pa3BKR2RsYm1WY2JuQmxUM1psY2pBZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3WlNBOElERXBLU1JuWlc1bFhHNWNibHh1WEc0akl5QkVhWFpwWkdsdVp5Qm5aVzVsY3lCcGJuUnZJR2R5YjNWd2MxeHVkR1Z0Y0NBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWkdsbVpsOUJORGcxWDBSTlUwOHNJR1JwYzNSaGJtTmxMQ0JuWlc1bEtTQWxQaVVnWEc0Z0lIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2h0WldGdVgyUnBabVpmYzJOdmNtVWdQU0J0WldGdUtHUnBabVpmUVRRNE5WOUVUVk5QS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzFsWVc1ZlpHbHpkR0Z1WTJVZ1BTQnRaV0Z1S0dScGMzUmhibU5sS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQzVuY205MWNITWdQU0FuWkhKdmNDY3BYRzVjYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbVJwWm1aZlJ6RXVRVFE0TlM1elpXeGxZM1JsWkRKZlJ6RXVNbWt1UVRRNE5WOTJjMTlITVM0eWFTNUVUVk5QTG5SemRsd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1pXNXpaVzFpYkY5blpXNWxYMmxrTENCc2IyY3lSbTlzWkVOb1lXNW5aU3dnYzJoeWFXNXJaV1JmYkc5bk1rWkRMQ0J3WVdScUxDQmxlSFJsY201aGJGOW5aVzVsWDI1aGJXVXBYRzVjYm0xaGVFeHZaekpHUXlBOUlESmNibHh1ZEdWdGNDQThMU0JzWldaMFgycHZhVzRvZEdWdGNDd2daR2xtWmk1U1RrRXNJR0o1SUQwZ1l5aGNJbWRsYm1WY0lpQTlJRndpWlc1elpXMWliRjluWlc1bFgybGtYQ0lwS1NBbFBpVWdYRzRnSUdSeWIzQmZibUVvYzJoeWFXNXJaV1JmYkc5bk1rWkRLVnh1WEc1Y2JuUmxiWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hjYmlBZ2NHVlBkbVZ5SUQwZ2FXWmxiSE5sS0dkbGJtVWdKV2x1SlNCd1pVOTJaWEkwTENCY0luQmxUM1psY2pSY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjR1ZQZG1WeU15d2dYQ0p3WlU5MlpYSXpYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3WlU5MlpYSXlMQ0JjSW5CbFQzWmxjakpjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3WlU5MlpYSXhMQ0JjSW5CbFQzWmxjakZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjR1ZQZG1WeU1Dd2dYQ0p3WlU5MlpYSXdYQ0lzSUU1QktTa3BLU2twSUNVK0pWeHVJQ0JrY205d1gyNWhLSEJsVDNabGNpbGNibHh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbiMgdGVtcDIgY29udGFpbnMgZ2VuZXMgZnJvbSBncm91cCAxLCAyLCA1LCA4IGFuZCBsb29wIGNvdW50c1xuI2NhbGN1bGF0aW5nIGRpZmYgc2NvcmUgYW5kIGxvZzJmYyBkaXN0cmlidXRpb24gYmFzZWQgb24gcC1uIG51bWJlcnNcblxucGVPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDQpKSRnZW5lXG5wZU92ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMywgbnVtX3BlIDwgNCkpJGdlbmVcbnBlT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAyLCBudW1fcGUgPCAzKSkkZ2VuZVxucGVPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDEsIG51bV9wZSA8IDIpKSRnZW5lXG5wZU92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPCAxKSkkZ2VuZVxuXG5cblxuIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHNcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX0E0ODVfRE1TTyksXG4gICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksXG4gICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHBlT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcGVPdmVyNCwgXFxwZU92ZXI0XFwsXG4gICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBlT3ZlcjMsIFxccGVPdmVyM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcGVPdmVyMiwgXFxwZU92ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcGVPdmVyMSwgXFxwZU92ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBlT3ZlcjAsIFxccGVPdmVyMFxcLCBOQSkpKSkpKSAlPiVcbiAgZHJvcF9uYShwZU92ZXIpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers

peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)


temp <- temp %>% dplyr::mutate(
  peOver = ifelse(gene %in% peOver4, \peOver4\,
                  ifelse(gene %in% peOver3, \peOver3\,
                         ifelse(gene %in% peOver2, \peOver2\,
                                ifelse(gene %in% peOver1, \peOver1\,
                                       ifelse(gene %in% peOver0, \peOver0\, NA)))))) %>%
  drop_na(peOver)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QjBaVzF3TWlCamIyNTBZV2x1Y3lCblpXNWxjeUJtY205dElHZHliM1Z3SURFc0lESXNJRFVzSURnZ1lXNWtJR3h2YjNBZ1kyOTFiblJ6WEc0alkyRnNZM1ZzWVhScGJtY2daR2xtWmlCelkyOXlaU0JoYm1RZ2JHOW5NbVpqSUdScGMzUnlhV0oxZEdsdmJpQmlZWE5sWkNCdmJpQndMVzRnYm5WdFltVnljMXh1WEc1d1pVOTJaWEkwSUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjR1VnUGowZ05Da3BKR2RsYm1WY2JuQmxUM1psY2pNZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3WlNBK1BTQXpMQ0J1ZFcxZmNHVWdQQ0EwS1Nra1oyVnVaVnh1Y0dWUGRtVnlNaUE4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQmxJRDQ5SURJc0lHNTFiVjl3WlNBOElETXBLU1JuWlc1bFhHNXdaVTkyWlhJeElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0dVZ1BqMGdNU3dnYm5WdFgzQmxJRHdnTWlrcEpHZGxibVZjYm5CbFQzWmxjakFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdaU0E4SURFcEtTUm5aVzVsWEc1Y2JseHVYRzRqSXlCRWFYWnBaR2x1WnlCblpXNWxjeUJwYm5SdklHZHliM1Z3YzF4dWRHVnRjQ0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2xtWmw5Qk5EZzFYMFJOVTA4c0lHUnBjM1JoYm1ObExDQm5aVzVsS1NBbFBpVWdYRzRnSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaHRaV0Z1WDJScFptWmZjMk52Y21VZ1BTQnRaV0Z1S0dScFptWmZRVFE0TlY5RVRWTlBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHMWxZVzVmWkdsemRHRnVZMlVnUFNCdFpXRnVLR1JwYzNSaGJtTmxLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDNW5jbTkxY0hNZ1BTQW5aSEp2Y0NjcFhHNWNibVJwWm1ZdVVrNUJJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHUnBabVpmUnpFdVFUUTROUzV6Wld4bFkzUmxaREpmUnpFdU1ta3VRVFE0TlY5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWlc1elpXMWliRjluWlc1bFgybGtMQ0JzYjJjeVJtOXNaRU5vWVc1blpTd2djMmh5YVc1clpXUmZiRzluTWtaRExDQndZV1JxTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVcFhHNWNibTFoZUV4dlp6SkdReUE5SURKY2JseHVkR1Z0Y0NBOExTQnNaV1owWDJwdmFXNG9kR1Z0Y0N3Z1pHbG1aaTVTVGtFc0lHSjVJRDBnWXloY1hHZGxibVZjWENBOUlGeGNaVzV6WlcxaWJGOW5aVzVsWDJsa1hGd3BLU0FsUGlVZ1hHNGdJR1J5YjNCZmJtRW9jMmh5YVc1clpXUmZiRzluTWtaREtWeHVYRzVjYm5SbGJYQWdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnY0dWUGRtVnlJRDBnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3WlU5MlpYSTBMQ0JjWEhCbFQzWmxjalJjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NHVlBkbVZ5TXl3Z1hGeHdaVTkyWlhJelhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndaVTkyWlhJeUxDQmNYSEJsVDNabGNqSmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndaVTkyWlhJeExDQmNYSEJsVDNabGNqRmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NHVlBkbVZ5TUN3Z1hGeHdaVTkyWlhJd1hGd3NJRTVCS1NrcEtTa3BJQ1UrSlZ4dUlDQmtjbTl3WDI1aEtIQmxUM1psY2lsY2JseHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG4jIHRlbXAyIGNvbnRhaW5zIGdlbmVzIGZyb20gZ3JvdXAgMSwgMiwgNSwgOCBhbmQgbG9vcCBjb3VudHNcbiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzXG5cbnBlT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSA0KSkkZ2VuZVxucGVPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lXG5wZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmVcbnBlT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAxLCBudW1fcGUgPCAyKSkkZ2VuZVxucGVPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmVcblxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9BNDg1X0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcblxubWF4TG9nMkZDID0gMlxuXG50ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBcbiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpXG5cblxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKFxuICBwZU92ZXIgPSBpZmVsc2UoZ2VuZSAlaW4lIHBlT3ZlcjQsIFxccGVPdmVyNFxcLFxuICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwZU92ZXIzLCBcXHBlT3ZlcjNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBlT3ZlcjIsIFxccGVPdmVyMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBlT3ZlcjEsIFxccGVPdmVyMVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwZU92ZXIwLCBcXHBlT3ZlcjBcXCwgTkEpKSkpKSkgJT4lXG4gIGRyb3BfbmEocGVPdmVyKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyB0ZW1wMiBjb250YWlucyBnZW5lcyBmcm9tIGdyb3VwIDEsIDIsIDUsIDggYW5kIGxvb3AgY291bnRzXG4jY2FsY3VsYXRpbmcgZGlmZiBzY29yZSBhbmQgbG9nMmZjIGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiBwLW4gbnVtYmVyc1xuXG5wZU92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gNCkpJGdlbmVcbnBlT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAzLCBudW1fcGUgPCA0KSkkZ2VuZVxucGVPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDIsIG51bV9wZSA8IDMpKSRnZW5lXG5wZU92ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMSwgbnVtX3BlIDwgMikpJGdlbmVcbnBlT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA8IDEpKSRnZW5lXG5cblxuXG4jIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwc1xudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgXG4gIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfQTQ4NV9ETVNPKSxcbiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSxcbiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5cbm1heExvZzJGQyA9IDJcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRyb3BfbmEoc2hyaW5rZWRfbG9nMkZDKVxuXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShcbiAgcGVPdmVyID0gaWZlbHNlKGdlbmUgJWluJSBwZU92ZXI0LCBcXHBlT3ZlcjRcXCxcbiAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcGVPdmVyMywgXFxwZU92ZXIzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwZU92ZXIyLCBcXHBlT3ZlcjJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwZU92ZXIxLCBcXHBlT3ZlcjFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcGVPdmVyMCwgXFxwZU92ZXIwXFwsIE5BKSkpKSkpICU+JVxuICBkcm9wX25hKHBlT3ZlcilcblxuYGBgXG5gYGAifQ== -->

```r
```r
# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers

peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)


temp <- temp %>% dplyr::mutate(
  peOver = ifelse(gene %in% peOver4, \peOver4\,
                  ifelse(gene %in% peOver3, \peOver3\,
                         ifelse(gene %in% peOver2, \peOver2\,
                                ifelse(gene %in% peOver1, \peOver1\,
                                       ifelse(gene %in% peOver0, \peOver0\, NA)))))) %>%
  drop_na(peOver)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### log2FC

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJIVDJacFowUnBjaUE4TFNCb1pYSmxLR1pwWjBScGNpd2dYQ0l1TGk5SFQxd2lLVnh1SXlCblpYUkhUeWhjSW5CbFQzWmxjalJjSWl3Z1IwOW1hV2RFYVhJc0lIQnpUM1psY2pRcFhHNGpJR2RsZEVkUEtGd2ljR1ZQZG1WeU0xd2lMQ0JIVDJacFowUnBjaXdnY0hOUGRtVnlNeWxjYmlNZ1oyVjBSMDhvWENKd1pVOTJaWEl5WENJc0lFZFBabWxuUkdseUxDQndjMDkyWlhJeUtWeHVJeUJuWlhSSFR5aGNJbkJsVDNabGNqRmNJaXdnUjA5bWFXZEVhWElzSUhCelQzWmxjakVwWEc0aklHZGxkRWRQS0Z3aWNHVlBkbVZ5TUZ3aUxDQkhUMlpwWjBScGNpd2djSE5QZG1WeU1DbGNiaU1nWEc0aklDTWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJMXh1SXlCSFR6QXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hsYm5KcFkyaEhUeWhuWlc1bElEMGdjSE5QZG1WeU1Dd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY0lrVk9VMFZOUWt4Y0lpd2diMjUwSUQwZ1hDSkNVRndpS1NsY2JpTWdSMDh4TG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCelQzWmxjakVzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYQ0pGVGxORlRVSk1YQ0lzSUc5dWRDQTlJRndpUWxCY0lpa3BYRzRqSUVkUE1pNWtaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLR1Z1Y21samFFZFBLR2RsYm1VZ1BTQndjMDkyWlhJeUxDQlBjbWRFWWlBOUlHOXlaeTVOYlM1bFp5NWtZaXdnYTJWNVZIbHdaU0E5SUZ3aVJVNVRSVTFDVEZ3aUxDQnZiblFnUFNCY0lrSlFYQ0lwS1Z4dUl5QkhUek11WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNobGJuSnBZMmhIVHloblpXNWxJRDBnY0hOUGRtVnlNeXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUtTbGNiaU1nUjA4MExtUm1JRHd0SUdGekxtUmhkR0V1Wm5KaGJXVW9aVzV5YVdOb1IwOG9aMlZ1WlNBOUlIQnpUM1psY2pRc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWENKRlRsTkZUVUpNWENJc0lHOXVkQ0E5SUZ3aVFsQmNJaWtwWEc0aklGeHVJeUJjYmlNZ2MzVmljMlYwTUNBOExTQkhUekF1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGd2ljSE5QZG1WeU1Gd2lLU0FsUGlWY2JpTWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJeUFnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGpJQ0FnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjSWk5Y0lseHVJeUFnSUNBZ0lDQndZWEowY3lBOExTQjFibXhwYzNRb2MzUnljM0JzYVhRb2VDd2dYQ0l2WENJcEtWeHVJeUFnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaU1nSUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJeUFnSUNBZ2ZTbGNiaU1nSUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNiaU1nYzNWaWMyVjBNU0E4TFNCSFR6RXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ3aWNITlBkbVZ5TVZ3aUtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNJaTljSWx4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hDSXZYQ0lwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdjM1ZpYzJWME1pQThMU0JIVHpJdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRndpY0hOUGRtVnlNbHdpS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SXlBZ0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRqSUNBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY0lpOWNJbHh1SXlBZ0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWENJdlhDSXBLVnh1SXlBZ0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlNZ0lDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SXlBZ0lDQWdmU2xjYmlNZ0lDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmlNZ2MzVmljMlYwTXlBOExTQkhUek11WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGd2ljSE5QZG1WeU0xd2lLU0FsUGlWY2JpTWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJeUFnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGpJQ0FnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjSWk5Y0lseHVJeUFnSUNBZ0lDQndZWEowY3lBOExTQjFibXhwYzNRb2MzUnljM0JzYVhRb2VDd2dYQ0l2WENJcEtWeHVJeUFnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaU1nSUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJeUFnSUNBZ2ZTbGNiaU1nSUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNiaU1nYzNWaWMyVjBOQ0E4TFNCSFR6UXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ3aWNITlBkbVZ5TkZ3aUtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNJaTljSWx4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hDSXZYQ0lwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdYRzRqSUZ4dUl5QkhUMnhwYzNRZ1BDMGdabUZqZEc5eUtHTW9YQ0pIVHpvd01EQTJNemszWENJc0lGd2lSMDg2TURBd09ETTRNRndpTENCY0lrZFBPakF3TWpJMk1UTmNJaXdnWENKSFR6b3dNRE0wTkRjd1hDSXNYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lrZFBPakF3TVRZd05UVmNJaXdnWENKSFR6b3dNREEzTXpnNVhDSXNJRndpUjA4Nk1EQTBPRFUyTWx3aUxDQmNJa2RQT2pBd05EVXhOalZjSWl3Z1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWtkUE9qQXdOekl3TURGY0lpd2dYQ0pIVHpvd01EQTNOVEUzWENJc0lGd2lSMDg2TURBME9EY3dOVndpTENCY2JpTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpUjA4Nk1EQTBNREF5T1Z3aUxDQmNJa2RQT2pBd01UQXhOalZjSWlrcFhHNGpJRnh1SXlCa1lYUmhJRHd0SUdKcGJtUmZjbTkzY3loaWFXNWtYM0p2ZDNNb1ltbHVaRjl5YjNkektITjFZbk5sZERBc0lITjFZbk5sZERFcExDQnpkV0p6WlhReUtTd2djM1ZpYzJWME5Da2dKVDRsWEc0aklDQWdaSEJzZVhJNk9tWnBiSFJsY2loSlJDQWxhVzRsSUVkUGJHbHpkQ2xjYmlNZ1hHNGpJSEFnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JFWlhOamNtbHdkR2x2Yml3Z1kyOXNiM0lnUFNCd0xtRmthblZ6ZEN3Z2MybDZaU0E5SUdkeUtTa2dLeUJjYmlNZ0lDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCMGFHVnRaVjlpZHlncElDdGNiaU1nSUNCelkyRnNaVjlqYjJ4dmNsOW5jbUZrYVdWdWRDaHNiM2NnUFNCY0luSmxaRndpTENCb2FXZG9JRDBnWENKaWJIVmxYQ0lzSUd4cGJXbDBjeUE5SUdNb01Dd2dNQzR3TlNrcElDdGNiaU1nSUNCelkyRnNaVjl6YVhwbFgyTnZiblJwYm5WdmRYTW9jbUZ1WjJVZ1BTQmpLREFzSURNcEtTQXJYRzRqSUNBZ2JHRmljeWg0SUQwZ1RsVk1UQ3dnZVNBOUlFNVZURXdwSUN0Y2JpTWdJQ0IwYUdWdFpTaGhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb2MybDZaU0E5SURZcExDQWdJeUJUWlhRZ1lYaHBjeUIwWlhoMElITnBlbVZjYmlNZ0lDQWdJQ0FnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0hOcGVtVWdQU0EyS1N3Z0l5QlRaWFFnWVhocGN5QjBhWFJzWlNCemFYcGxJQ2hwWmlCdWIzUWdjbVZ0YjNabFpDbGNiaU1nSUNBZ0lDQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOaWtzSUNNZ1UyVjBJR3hsWjJWdVpDQjBaWGgwSUhOcGVtVmNiaU1nSUNBZ0lDQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFlwS1NCY2JpTWdYRzRqSUdacGJHVk9ZVzFsSUR3dElHaGxjbVVvWm1sblJHbHlMQ0JjSWk0dVhDSXNJRndpUjA5Y0lpd2dYQ0pIVDE5bmNtOTFjSE5mY0dWY0lpbGNiaU1nYUdWcFoyaDBJRDBnTWx4dUl5QjNhV1IwYUNBOUlETXVORnh1SXlCemRtZHNhWFJsS0hCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRqSUhCeWFXNTBLSEFwWEc0aklHUmxkaTV2Wm1Zb0tWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuIyBHT2ZpZ0RpciA8LSBoZXJlKGZpZ0RpciwgXFwuLi9HT1xcKVxuIyBnZXRHTyhcXHBlT3ZlcjRcXCwgR09maWdEaXIsIHBzT3ZlcjQpXG4jIGdldEdPKFxccGVPdmVyM1xcLCBHT2ZpZ0RpciwgcHNPdmVyMylcbiMgZ2V0R08oXFxwZU92ZXIyXFwsIEdPZmlnRGlyLCBwc092ZXIyKVxuIyBnZXRHTyhcXHBlT3ZlcjFcXCwgR09maWdEaXIsIHBzT3ZlcjEpXG4jIGdldEdPKFxccGVPdmVyMFxcLCBHT2ZpZ0RpciwgcHNPdmVyMClcbiMgXG4jICMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBHTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBHTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIFxuIyBcbiMgc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMVxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMlxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MyA8LSBHTzMuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyM1xcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyNFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgXG4jIFxuIyBHT2xpc3QgPC0gZmFjdG9yKGMoXFxHTzowMDA2Mzk3XFwsIFxcR086MDAwODM4MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDM0NDcwXFwsXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwMTYwNTVcXCwgXFxHTzowMDA3Mzg5XFwsIFxcR086MDA0ODU2MlxcLCBcXEdPOjAwNDUxNjVcXCwgXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwNzIwMDFcXCwgXFxHTzowMDA3NTE3XFwsIFxcR086MDA0ODcwNVxcLCBcbiMgICAgICAgICAgICAgICAgICAgIFxcR086MDA0MDAyOVxcLCBcXEdPOjAwMTAxNjVcXCkpXG4jIFxuIyBkYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3MoYmluZF9yb3dzKHN1YnNldDAsIHN1YnNldDEpLCBzdWJzZXQyKSwgc3Vic2V0NCkgJT4lXG4jICAgZHBseXI6OmZpbHRlcihJRCAlaW4lIEdPbGlzdClcbiMgXG4jIHAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBEZXNjcmlwdGlvbiwgY29sb3IgPSBwLmFkanVzdCwgc2l6ZSA9IGdyKSkgKyBcbiMgICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICtcbiMgICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibHVlXFwsIGxpbWl0cyA9IGMoMCwgMC4wNSkpICtcbiMgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAsIDMpKSArXG4jICAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiMgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZClcbiMgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemVcbiMgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcbiMgXG4jIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXC4uXFwsIFxcR09cXCwgXFxHT19ncm91cHNfcGVcXClcbiMgaGVpZ2h0ID0gMlxuIyB3aWR0aCA9IDMuNFxuIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# GOfigDir <- here(figDir, \../GO\)
# getGO(\peOver4\, GOfigDir, psOver4)
# getGO(\peOver3\, GOfigDir, psOver3)
# getGO(\peOver2\, GOfigDir, psOver2)
# getGO(\peOver1\, GOfigDir, psOver1)
# getGO(\peOver0\, GOfigDir, psOver0)
# 
# #####################
# GO0.df <- as.data.frame(enrichGO(gene = psOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO1.df <- as.data.frame(enrichGO(gene = psOver1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO2.df <- as.data.frame(enrichGO(gene = psOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO3.df <- as.data.frame(enrichGO(gene = psOver3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO4.df <- as.data.frame(enrichGO(gene = psOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# 
# 
# subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver0\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver1\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver2\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset3 <- GO3.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver3\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver4\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# 
# 
# GOlist <- factor(c(\GO:0006397\, \GO:0008380\, \GO:0022613\, \GO:0034470\,
#                    \GO:0016055\, \GO:0007389\, \GO:0048562\, \GO:0045165\, 
#                    \GO:0072001\, \GO:0007517\, \GO:0048705\, 
#                    \GO:0040029\, \GO:0010165\))
# 
# data <- bind_rows(bind_rows(bind_rows(subset0, subset1), subset2), subset4) %>%
#   dplyr::filter(ID %in% GOlist)
# 
# p <- ggplot(data, aes(x = group, y = Description, color = p.adjust, size = gr)) + 
#   geom_point() + theme_bw() +
#   scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
#   scale_size_continuous(range = c(0, 3)) +
#   labs(x = NULL, y = NULL) +
#   theme(axis.text = element_text(size = 6),  # Set axis text size
#         axis.title = element_text(size = 6), # Set axis title size (if not removed)
#         legend.text = element_text(size = 6), # Set legend text size
#         legend.title = element_text(size = 6)) 
# 
# fileName <- here(figDir, \..\, \GO\, \GO_groups_pe\)
# height = 2
# width = 3.4
# svglite(paste0(fileName, \.svg\), height = height, width = width)
# print(p)
# dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkhUMlpwWjBScGNpQThMU0JvWlhKbEtHWnBaMFJwY2l3Z1hGd3VMaTlIVDF4Y0tWeHVJeUJuWlhSSFR5aGNYSEJsVDNabGNqUmNYQ3dnUjA5bWFXZEVhWElzSUhCelQzWmxjalFwWEc0aklHZGxkRWRQS0Z4Y2NHVlBkbVZ5TTF4Y0xDQkhUMlpwWjBScGNpd2djSE5QZG1WeU15bGNiaU1nWjJWMFIwOG9YRnh3WlU5MlpYSXlYRndzSUVkUFptbG5SR2x5TENCd2MwOTJaWEl5S1Z4dUl5Qm5aWFJIVHloY1hIQmxUM1psY2pGY1hDd2dSMDltYVdkRWFYSXNJSEJ6VDNabGNqRXBYRzRqSUdkbGRFZFBLRnhjY0dWUGRtVnlNRnhjTENCSFQyWnBaMFJwY2l3Z2NITlBkbVZ5TUNsY2JpTWdYRzRqSUNNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakkxeHVJeUJIVHpBdVpHWWdQQzBnWVhNdVpHRjBZUzVtY21GdFpTaGxibkpwWTJoSFR5aG5aVzVsSUQwZ2NITlBkbVZ5TUN3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjWEVWT1UwVk5Ra3hjWEN3Z2IyNTBJRDBnWEZ4Q1VGeGNLU2xjYmlNZ1IwOHhMbVJtSUR3dElHRnpMbVJoZEdFdVpuSmhiV1VvWlc1eWFXTm9SMDhvWjJWdVpTQTlJSEJ6VDNabGNqRXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hGeEZUbE5GVFVKTVhGd3NJRzl1ZENBOUlGeGNRbEJjWENrcFhHNGpJRWRQTWk1a1ppQThMU0JoY3k1a1lYUmhMbVp5WVcxbEtHVnVjbWxqYUVkUEtHZGxibVVnUFNCd2MwOTJaWEl5TENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRnhjUlU1VFJVMUNURnhjTENCdmJuUWdQU0JjWEVKUVhGd3BLVnh1SXlCSFR6TXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hsYm5KcFkyaEhUeWhuWlc1bElEMGdjSE5QZG1WeU15d2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjS1NsY2JpTWdSMDgwTG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCelQzWmxjalFzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYRnhGVGxORlRVSk1YRndzSUc5dWRDQTlJRnhjUWxCY1hDa3BYRzRqSUZ4dUl5QmNiaU1nYzNWaWMyVjBNQ0E4TFNCSFR6QXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ4Y2NITlBkbVZ5TUZ4Y0tTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNYQzljWEZ4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hGd3ZYRndwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdjM1ZpYzJWME1TQThMU0JIVHpFdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRnhjY0hOUGRtVnlNVnhjS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SXlBZ0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRqSUNBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY1hDOWNYRnh1SXlBZ0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWEZ3dlhGd3BLVnh1SXlBZ0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlNZ0lDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SXlBZ0lDQWdmU2xjYmlNZ0lDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmlNZ2MzVmljMlYwTWlBOExTQkhUekl1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGeGNjSE5QZG1WeU1seGNLU0FsUGlWY2JpTWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJeUFnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGpJQ0FnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjWEM5Y1hGeHVJeUFnSUNBZ0lDQndZWEowY3lBOExTQjFibXhwYzNRb2MzUnljM0JzYVhRb2VDd2dYRnd2WEZ3cEtWeHVJeUFnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaU1nSUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJeUFnSUNBZ2ZTbGNiaU1nSUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNiaU1nYzNWaWMyVjBNeUE4TFNCSFR6TXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ4Y2NITlBkbVZ5TTF4Y0tTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNYQzljWEZ4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hGd3ZYRndwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdjM1ZpYzJWME5DQThMU0JIVHpRdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRnhjY0hOUGRtVnlORnhjS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SXlBZ0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRqSUNBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY1hDOWNYRnh1SXlBZ0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWEZ3dlhGd3BLVnh1SXlBZ0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlNZ0lDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SXlBZ0lDQWdmU2xjYmlNZ0lDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmlNZ1hHNGpJRnh1SXlCSFQyeHBjM1FnUEMwZ1ptRmpkRzl5S0dNb1hGeEhUem93TURBMk16azNYRndzSUZ4Y1IwODZNREF3T0RNNE1GeGNMQ0JjWEVkUE9qQXdNakkyTVROY1hDd2dYRnhIVHpvd01ETTBORGN3WEZ3c1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEVkUE9qQXdNVFl3TlRWY1hDd2dYRnhIVHpvd01EQTNNemc1WEZ3c0lGeGNSMDg2TURBME9EVTJNbHhjTENCY1hFZFBPakF3TkRVeE5qVmNYQ3dnWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRWRQT2pBd056SXdNREZjWEN3Z1hGeEhUem93TURBM05URTNYRndzSUZ4Y1IwODZNREEwT0Rjd05WeGNMQ0JjYmlNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNSMDg2TURBME1EQXlPVnhjTENCY1hFZFBPakF3TVRBeE5qVmNYQ2twWEc0aklGeHVJeUJrWVhSaElEd3RJR0pwYm1SZmNtOTNjeWhpYVc1a1gzSnZkM01vWW1sdVpGOXliM2R6S0hOMVluTmxkREFzSUhOMVluTmxkREVwTENCemRXSnpaWFF5S1N3Z2MzVmljMlYwTkNrZ0pUNGxYRzRqSUNBZ1pIQnNlWEk2T21acGJIUmxjaWhKUkNBbGFXNGxJRWRQYkdsemRDbGNiaU1nWEc0aklIQWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQkVaWE5qY21sd2RHbHZiaXdnWTI5c2IzSWdQU0J3TG1Ga2FuVnpkQ3dnYzJsNlpTQTlJR2R5S1NrZ0t5QmNiaU1nSUNCblpXOXRYM0J2YVc1MEtDa2dLeUIwYUdWdFpWOWlkeWdwSUN0Y2JpTWdJQ0J6WTJGc1pWOWpiMnh2Y2w5bmNtRmthV1Z1ZENoc2IzY2dQU0JjWEhKbFpGeGNMQ0JvYVdkb0lEMGdYRnhpYkhWbFhGd3NJR3hwYldsMGN5QTlJR01vTUN3Z01DNHdOU2twSUN0Y2JpTWdJQ0J6WTJGc1pWOXphWHBsWDJOdmJuUnBiblZ2ZFhNb2NtRnVaMlVnUFNCaktEQXNJRE1wS1NBclhHNGpJQ0FnYkdGaWN5aDRJRDBnVGxWTVRDd2dlU0E5SUU1VlRFd3BJQ3RjYmlNZ0lDQjBhR1Z0WlNoaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFlwTENBZ0l5QlRaWFFnWVhocGN5QjBaWGgwSUhOcGVtVmNiaU1nSUNBZ0lDQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTJLU3dnSXlCVFpYUWdZWGhwY3lCMGFYUnNaU0J6YVhwbElDaHBaaUJ1YjNRZ2NtVnRiM1psWkNsY2JpTWdJQ0FnSUNBZ0lDQnNaV2RsYm1RdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3NJQ01nVTJWMElHeGxaMlZ1WkNCMFpYaDBJSE5wZW1WY2JpTWdJQ0FnSUNBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9jMmw2WlNBOUlEWXBLU0JjYmlNZ1hHNGpJR1pwYkdWT1lXMWxJRHd0SUdobGNtVW9abWxuUkdseUxDQmNYQzR1WEZ3c0lGeGNSMDljWEN3Z1hGeEhUMTluY205MWNITmZjR1ZjWENsY2JpTWdhR1ZwWjJoMElEMGdNbHh1SXlCM2FXUjBhQ0E5SURNdU5GeHVJeUJ6ZG1kc2FYUmxLSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGpJSEJ5YVc1MEtIQXBYRzRqSUdSbGRpNXZabVlvS1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbiMgR09maWdEaXIgPC0gaGVyZShmaWdEaXIsIFxcLi4vR09cXClcbiMgZ2V0R08oXFxwZU92ZXI0XFwsIEdPZmlnRGlyLCBwc092ZXI0KVxuIyBnZXRHTyhcXHBlT3ZlcjNcXCwgR09maWdEaXIsIHBzT3ZlcjMpXG4jIGdldEdPKFxccGVPdmVyMlxcLCBHT2ZpZ0RpciwgcHNPdmVyMilcbiMgZ2V0R08oXFxwZU92ZXIxXFwsIEdPZmlnRGlyLCBwc092ZXIxKVxuIyBnZXRHTyhcXHBlT3ZlcjBcXCwgR09maWdEaXIsIHBzT3ZlcjApXG4jIFxuIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgR08wLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjAsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPMS5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBHTzIuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR08zLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBcbiMgXG4jIHN1YnNldDAgPC0gR08wLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjBcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDEgPC0gR08xLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjFcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjJcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDMgPC0gR08zLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjNcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDQgPC0gR080LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjRcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIFxuIyBcbiMgR09saXN0IDwtIGZhY3RvcihjKFxcR086MDAwNjM5N1xcLCBcXEdPOjAwMDgzODBcXCwgXFxHTzowMDIyNjEzXFwsIFxcR086MDAzNDQ3MFxcLFxuIyAgICAgICAgICAgICAgICAgICAgXFxHTzowMDE2MDU1XFwsIFxcR086MDAwNzM4OVxcLCBcXEdPOjAwNDg1NjJcXCwgXFxHTzowMDQ1MTY1XFwsIFxuIyAgICAgICAgICAgICAgICAgICAgXFxHTzowMDcyMDAxXFwsIFxcR086MDAwNzUxN1xcLCBcXEdPOjAwNDg3MDVcXCwgXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwNDAwMjlcXCwgXFxHTzowMDEwMTY1XFwpKVxuIyBcbiMgZGF0YSA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQwLCBzdWJzZXQxKSwgc3Vic2V0MiksIHN1YnNldDQpICU+JVxuIyAgIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpXG4jIFxuIyBwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gRGVzY3JpcHRpb24sIGNvbG9yID0gcC5hZGp1c3QsIHNpemUgPSBncikpICsgXG4jICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArXG4jICAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gXFxyZWRcXCwgaGlnaCA9IFxcYmx1ZVxcLCBsaW1pdHMgPSBjKDAsIDAuMDUpKSArXG4jICAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLCAzKSkgK1xuIyAgIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArXG4jICAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgICMgU2V0IGF4aXMgdGV4dCBzaXplXG4jICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGF4aXMgdGl0bGUgc2l6ZSAoaWYgbm90IHJlbW92ZWQpXG4jICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBsZWdlbmQgdGV4dCBzaXplXG4jICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkgXG4jIFxuIyBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFwuLlxcLCBcXEdPXFwsIFxcR09fZ3JvdXBzX3BlXFwpXG4jIGhlaWdodCA9IDJcbiMgd2lkdGggPSAzLjRcbiMgc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBHT2ZpZ0RpciA8LSBoZXJlKGZpZ0RpciwgXFwuLi9HT1xcKVxuIyBnZXRHTyhcXHBlT3ZlcjRcXCwgR09maWdEaXIsIHBzT3ZlcjQpXG4jIGdldEdPKFxccGVPdmVyM1xcLCBHT2ZpZ0RpciwgcHNPdmVyMylcbiMgZ2V0R08oXFxwZU92ZXIyXFwsIEdPZmlnRGlyLCBwc092ZXIyKVxuIyBnZXRHTyhcXHBlT3ZlcjFcXCwgR09maWdEaXIsIHBzT3ZlcjEpXG4jIGdldEdPKFxccGVPdmVyMFxcLCBHT2ZpZ0RpciwgcHNPdmVyMClcbiMgXG4jICMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBHTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBHTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIFxuIyBcbiMgc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMVxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMlxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MyA8LSBHTzMuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyM1xcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyNFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgXG4jIFxuIyBHT2xpc3QgPC0gZmFjdG9yKGMoXFxHTzowMDA2Mzk3XFwsIFxcR086MDAwODM4MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDM0NDcwXFwsXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwMTYwNTVcXCwgXFxHTzowMDA3Mzg5XFwsIFxcR086MDA0ODU2MlxcLCBcXEdPOjAwNDUxNjVcXCwgXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwNzIwMDFcXCwgXFxHTzowMDA3NTE3XFwsIFxcR086MDA0ODcwNVxcLCBcbiMgICAgICAgICAgICAgICAgICAgIFxcR086MDA0MDAyOVxcLCBcXEdPOjAwMTAxNjVcXCkpXG4jIFxuIyBkYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3MoYmluZF9yb3dzKHN1YnNldDAsIHN1YnNldDEpLCBzdWJzZXQyKSwgc3Vic2V0NCkgJT4lXG4jICAgZHBseXI6OmZpbHRlcihJRCAlaW4lIEdPbGlzdClcbiMgXG4jIHAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBEZXNjcmlwdGlvbiwgY29sb3IgPSBwLmFkanVzdCwgc2l6ZSA9IGdyKSkgKyBcbiMgICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICtcbiMgICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibHVlXFwsIGxpbWl0cyA9IGMoMCwgMC4wNSkpICtcbiMgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAsIDMpKSArXG4jICAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiMgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZClcbiMgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemVcbiMgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcbiMgXG4jIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXC4uXFwsIFxcR09cXCwgXFxHT19ncm91cHNfcGVcXClcbiMgaGVpZ2h0ID0gMlxuIyB3aWR0aCA9IDMuNFxuIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
# GOfigDir <- here(figDir, \../GO\)
# getGO(\peOver4\, GOfigDir, psOver4)
# getGO(\peOver3\, GOfigDir, psOver3)
# getGO(\peOver2\, GOfigDir, psOver2)
# getGO(\peOver1\, GOfigDir, psOver1)
# getGO(\peOver0\, GOfigDir, psOver0)
# 
# #####################
# GO0.df <- as.data.frame(enrichGO(gene = psOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO1.df <- as.data.frame(enrichGO(gene = psOver1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO2.df <- as.data.frame(enrichGO(gene = psOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO3.df <- as.data.frame(enrichGO(gene = psOver3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO4.df <- as.data.frame(enrichGO(gene = psOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# 
# 
# subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver0\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver1\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver2\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset3 <- GO3.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver3\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver4\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# 
# 
# GOlist <- factor(c(\GO:0006397\, \GO:0008380\, \GO:0022613\, \GO:0034470\,
#                    \GO:0016055\, \GO:0007389\, \GO:0048562\, \GO:0045165\, 
#                    \GO:0072001\, \GO:0007517\, \GO:0048705\, 
#                    \GO:0040029\, \GO:0010165\))
# 
# data <- bind_rows(bind_rows(bind_rows(subset0, subset1), subset2), subset4) %>%
#   dplyr::filter(ID %in% GOlist)
# 
# p <- ggplot(data, aes(x = group, y = Description, color = p.adjust, size = gr)) + 
#   geom_point() + theme_bw() +
#   scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
#   scale_size_continuous(range = c(0, 3)) +
#   labs(x = NULL, y = NULL) +
#   theme(axis.text = element_text(size = 6),  # Set axis text size
#         axis.title = element_text(size = 6), # Set axis title size (if not removed)
#         legend.text = element_text(size = 6), # Set legend text size
#         legend.title = element_text(size = 6)) 
# 
# fileName <- here(figDir, \..\, \GO\, \GO_groups_pe\)
# height = 2
# width = 3.4
# svglite(paste0(fileName, \.svg\), height = height, width = width)
# print(p)
# dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



#### Grouping with P-E number
##### Grouping

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpTWdJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvY0hOUGRtVnlJRDA5WjNKdmRYQXhLU0FwSkcxbFlXNWZaR2xtWmw5elkyOXlaVnh1SXlBZ0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGpJQ0FnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJeUFnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JpTWdmVnh1SXlCY2JpTWdjSE13TVNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGd2ljSE5QZG1WeU1Gd2lMQ0JjSW5CelQzWmxjakZjSWlrc0lEVXBYRzRqSUhCek1USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjSW5CelQzWmxjakZjSWl3Z1hDSndjMDkyWlhJeVhDSXBMQ0ExS1Z4dUl5Qndjekl6SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hDSndjMDkyWlhJeVhDSXNJRndpY0hOUGRtVnlNMXdpS1N3Z05TbGNiaU1nY0hNek5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRndpY0hOUGRtVnlNMXdpTENCY0luQnpUM1psY2pSY0lpa3NJRFVwWEc0aklIQnpNalFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TENCY0luQnpUM1psY2pKY0lpd2dYQ0p3YzA5MlpYSTBYQ0lwTENBMUtWeHVJeUJ3Y3pFMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYQ0p3YzA5MlpYSXhYQ0lzSUZ3aWNITlBkbVZ5TkZ3aUtTd2dOU2xjYmlNZ2NITXdOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ3aWNITlBkbVZ5TUZ3aUxDQmNJbkJ6VDNabGNqUmNJaWtzSURVcFhHNWNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J3WlU5MlpYSXNJSGtnUFNCdFpXRnVYMlJwWm1aZmMyTnZjbVVwS1NBcklHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnY0dWUGRtVnlLU3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0sxeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCY2JpQWdjM1JoZEY5emRXMXRZWEo1S0dGbGN5aG5jbTkxY0NBOUlIQmxUM1psY2lrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNJbkJ2YVc1MFhDSXNJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWENKeVpXUmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01DbGNiaUFnSXlCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQXdMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkJ6TURFNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1ERXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TVRJNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1USXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TWpNNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1qTXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TXpRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek16UXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TWpRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1qUXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TVRRNklGd2lMR052Ym5aUWRtRnNkV1VvSUhCek1UUXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TURRNklGd2lMR052Ym5aUWRtRnNkV1VvSUhCek1EUXBMQ0JjSWx4Y2Jsd2lLU3dnWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wWEc1Y2JpQWdYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKa2FXWm1VMk52Y21WZlltRnljR3h2ZEY5d1pVZHliM1Z3WDBFME9EVmZkbk5mUkUxVFQxd2lLVnh1YUdWcFoyaDBJRHd0SUROY2JuZHBaSFJvSUR3dElETmNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG4jIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuIyAgIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbWVhbl9kaWZmX3Njb3JlXG4jICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMikgKSRtZWFuX2RpZmZfc2NvcmVcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG4jIFxuIyBwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjJcXCksIDUpXG4jIHBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXIzXFwpLCA1KVxuIyBwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHBlT3ZlciwgeSA9IG1lYW5fZGlmZl9zY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwZU92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcGVPdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsY29udlB2YWx1ZSggcHMxNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMwNDogXFwsY29udlB2YWx1ZSggcHMwNCksIFxcXFxuXFwpLCBcbiAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGRpZmZTY29yZV9iYXJwbG90X3BlR3JvdXBfQTQ4NV92c19ETVNPXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(psOver ==group1) )$mean_diff_score
#   distance2 <- (data %>% dplyr::filter(psOver ==group2) )$mean_diff_score
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
# ps01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(temp, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(temp, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)


p <- ggplot(temp, aes(x = peOver, y = mean_diff_score)) + geom_violin(aes(fill = peOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = peOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \,convPvalue( ps14), \\n\,
  #                                               \ps04: \,convPvalue( ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3)

  
fileName <- paste0(\diffScore_barplot_peGroup_A485_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5Qm5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlNZ0lDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jSE5QZG1WeUlEMDlaM0p2ZFhBeEtTQXBKRzFsWVc1ZlpHbG1abDl6WTI5eVpWeHVJeUFnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2MwOTJaWElnUFQxbmNtOTFjRElwSUNra2JXVmhibDlrYVdabVgzTmpiM0psWEc0aklDQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUl5QWdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYmlNZ2ZWeHVJeUJjYmlNZ2NITXdNU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ4Y2NITlBkbVZ5TUZ4Y0xDQmNYSEJ6VDNabGNqRmNYQ2tzSURVcFhHNGpJSEJ6TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNYSEJ6VDNabGNqRmNYQ3dnWEZ4d2MwOTJaWEl5WEZ3cExDQTFLVnh1SXlCd2N6SXpJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWEZ4d2MwOTJaWEl5WEZ3c0lGeGNjSE5QZG1WeU0xeGNLU3dnTlNsY2JpTWdjSE16TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGeGNjSE5QZG1WeU0xeGNMQ0JjWEhCelQzWmxjalJjWENrc0lEVXBYRzRqSUhCek1qUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjWEhCelQzWmxjakpjWEN3Z1hGeHdjMDkyWlhJMFhGd3BMQ0ExS1Z4dUl5QndjekUwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hGeHdjMDkyWlhJeFhGd3NJRnhjY0hOUGRtVnlORnhjS1N3Z05TbGNiaU1nY0hNd05DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRnhjY0hOUGRtVnlNRnhjTENCY1hIQnpUM1psY2pSY1hDa3NJRFVwWEc1Y2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQndaVTkyWlhJc0lIa2dQU0J0WldGdVgyUnBabVpmYzJOdmNtVXBLU0FySUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdjR1ZQZG1WeUtTd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnSzF4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLR0ZsY3lobmNtOTFjQ0E5SUhCbFQzWmxjaWtzSUdaMWJpQTlJRzFsWVc0c0lHZGxiMjBnUFNCY1hIQnZhVzUwWEZ3c0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXlMQ0JtYVd4c0lEMGdYRnh5WldSY1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUNsY2JpQWdJeUJoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBd0xDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQnpNREU2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TURFcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNVEk2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TVRJcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNak02SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TWpNcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNelE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TXpRcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNalE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TWpRcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNVFE2SUZ4Y0xHTnZiblpRZG1Gc2RXVW9JSEJ6TVRRcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNRFE2SUZ4Y0xHTnZiblpRZG1Gc2RXVW9JSEJ6TURRcExDQmNYRnhjYmx4Y0tTd2dYRzRnSUNNZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBYRzVjYmlBZ1hHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhrYVdabVUyTnZjbVZmWW1GeWNHeHZkRjl3WlVkeWIzVndYMEUwT0RWZmRuTmZSRTFUVDF4Y0tWeHVhR1ZwWjJoMElEd3RJRE5jYm5kcFpIUm9JRHd0SUROY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcbiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG4jIHBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxuIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwZU92ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcGVPdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBlT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLGNvbnZQdmFsdWUoIHBzMTQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLGNvbnZQdmFsdWUoIHBzMDQpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxkaWZmU2NvcmVfYmFycGxvdF9wZUdyb3VwX0E0ODVfdnNfRE1TT1xcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcbiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG4jIHBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxuIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwZU92ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcGVPdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBlT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLGNvbnZQdmFsdWUoIHBzMTQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLGNvbnZQdmFsdWUoIHBzMDQpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxkaWZmU2NvcmVfYmFycGxvdF9wZUdyb3VwX0E0ODVfdnNfRE1TT1xcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(psOver ==group1) )$mean_diff_score
#   distance2 <- (data %>% dplyr::filter(psOver ==group2) )$mean_diff_score
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
# ps01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(temp, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(temp, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)


p <- ggplot(temp, aes(x = peOver, y = mean_diff_score)) + geom_violin(aes(fill = peOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = peOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \,convPvalue( ps14), \\n\,
  #                                               \ps04: \,convPvalue( ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3)

  
fileName <- paste0(\diffScore_barplot_peGroup_A485_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### (SKIP) GO for each group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJMXh1SXlBZ1oyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRqSUNBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIQnpUM1psY2lBOVBXZHliM1Z3TVNrZ0tTUnNiMmN5Um05c1pFTm9ZVzVuWlZ4dUl5QWdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3YzA5MlpYSWdQVDFuY205MWNESXBJQ2trYkc5bk1rWnZiR1JEYUdGdVoyVmNiaU1nSUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRqSUNBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVJeUI5WEc0aklGeHVkR1Z0Y0VSdmQyNGdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHNiMmN5Um05c1pFTm9ZVzVuWlNBOElEQXBYRzRqSUNCY2JpTWdjSE13TVNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjSW5CelQzWmxjakJjSWl3Z1hDSndjMDkyWlhJeFhDSXBMQ0ExS1Z4dUl5QndjekV5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0VSdmQyNHNJRndpY0hOUGRtVnlNVndpTENCY0luQnpUM1psY2pKY0lpa3NJRFVwWEc0aklIQnpNak1nUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3Ukc5M2Jpd2dYQ0p3YzA5MlpYSXlYQ0lzSUZ3aWNITlBkbVZ5TTF3aUtTd2dOU2xjYmlNZ2NITXpOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNJbkJ6VDNabGNqTmNJaXdnWENKd2MwOTJaWEkwWENJcExDQTFLVnh1SXlCd2N6STBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRVJ2ZDI0c0lGd2ljSE5QZG1WeU1sd2lMQ0JjSW5CelQzWmxjalJjSWlrc0lEVXBYRzRqSUhCek1UUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdSRzkzYml3Z1hDSndjMDkyWlhJeFhDSXNJRndpY0hOUGRtVnlORndpS1N3Z05TbGNiaU1nY0hNd05DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY0luQnpUM1psY2pCY0lpd2dYQ0p3YzA5MlpYSTBYQ0lwTENBMUtWeHVYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtIUmxiWEJFYjNkdUxDQmhaWE1vZUNBOUlIQmxUM1psY2l3Z2VTQTlJR3h2WnpKR2IyeGtRMmhoYm1kbEtTa2dLeUJuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlIQmxUM1psY2lrc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3RjYmlBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDc2dYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0J3WlU5MlpYSXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGd2ljbVZrWENJc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwWEc0Z0lDTWdZVzV1YjNSaGRHVW9YQ0owWlhoMFhDSXNJSGdnUFNBeExDQjVJRDBnTFRBdU5Td2diR0ZpWld3Z1BTQndZWE4wWlRBb1hDSndjekF4T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pBeEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekV5T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pFeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekl6T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pJektTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjek0wT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pNMEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekkwT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pJMEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekUwT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pFMEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekEwT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pBMEtTd2dYQ0pjWEc1Y0lpa3NJRnh1SUNBaklDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXpLU0FySUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWd0TVN3Z01Da3BYRzVjYmlBZ1hHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0pzYjJjeVJrTmZZbUZ5Y0d4dmRGOXdaVWR5YjNWd1gwRTBPRFZmZG5OZlJFMVRUMTlrYjNkdVhDSXBYRzVvWldsbmFIUWdQQzBnTTF4dWQybGtkR2dnUEMwZ00xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVhHNWNibHh1ZEdWdGNGVndJRHd0SUhSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iRzluTWtadmJHUkRhR0Z1WjJVZ1BpQXdLVnh1SUZ4dUl5QndjekF4SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNJbkJ6VDNabGNqQmNJaXdnWENKd2MwOTJaWEl4WENJcExDQTFLVnh1SXlCd2N6RXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY0luQnpUM1psY2pGY0lpd2dYQ0p3YzA5MlpYSXlYQ0lwTENBMUtWeHVJeUJ3Y3pJeklEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjSW5CelQzWmxjakpjSWl3Z1hDSndjMDkyWlhJelhDSXBMQ0ExS1Z4dUl5Qndjek0wSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNJbkJ6VDNabGNqTmNJaXdnWENKd2MwOTJaWEkwWENJcExDQTFLVnh1SXlCd2N6STBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY0luQnpUM1psY2pKY0lpd2dYQ0p3YzA5MlpYSTBYQ0lwTENBMUtWeHVJeUJ3Y3pFMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjSW5CelQzWmxjakZjSWl3Z1hDSndjMDkyWlhJMFhDSXBMQ0ExS1Z4dUl5QndjekEwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNJbkJ6VDNabGNqQmNJaXdnWENKd2MwOTJaWEkwWENJcExDQTFLVnh1SXlCY2JseHVYRzVjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0ZWd0xDQmhaWE1vZUNBOUlIQmxUM1psY2l3Z2VTQTlJR3h2WnpKR2IyeGtRMmhoYm1kbEtTa2dLeUJuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlIQmxUM1psY2lrc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3RjYmlBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDc2dYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0J3WlU5MlpYSXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGd2ljbVZrWENJc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwWEc0Z0lDTWdZVzV1YjNSaGRHVW9YQ0owWlhoMFhDSXNJSGdnUFNBeExDQjVJRDBnTUM0MUxDQnNZV0psYkNBOUlIQmhjM1JsTUNoY0luQnpNREU2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TURFcExDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNVEk2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TVRJcExDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNak02SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TWpNcExDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNelE2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TXpRcExDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNalE2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TWpRcExDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNVFE2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TVRRcExDQmNJbHhjYmx3aUxGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNRFE2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TURRcExDQmNJbHhjYmx3aUtTd2dYRzRnSUNNZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBJQ3NnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLREFzSURFcEtWeHVYRzRnSUZ4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2liRzluTWtaRFgySmhjbkJzYjNSZmNHVkhjbTkxY0Y5Qk5EZzFYM1p6WDBSTlUwOWZkWEJjSWlsY2JtaGxhV2RvZENBOExTQXpYRzUzYVdSMGFDQThMU0F6WEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbiNcbiMgIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuIyAgIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbG9nMkZvbGRDaGFuZ2VcbiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJGxvZzJGb2xkQ2hhbmdlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcbnRlbXBEb3duIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKVxuIyAgXG4jIHBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxuIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG4jIHBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wRG93biwgYWVzKHggPSBwZU92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwZU92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcGVPdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IC0wLjUsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsIGNvbnZQdmFsdWUocHMxNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMwNDogXFwsIGNvbnZQdmFsdWUocHMwNCksIFxcXFxuXFwpLCBcbiAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEsIDApKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcGVHcm91cF9BNDg1X3ZzX0RNU09fZG93blxcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMClcbiBcbiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbiMgcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgXG5cblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwZU92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwZU92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcGVPdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSlcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BlR3JvdXBfQTQ4NV92c19ETVNPX3VwXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
#
#  getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(psOver ==group1) )$log2FoldChange
#   distance2 <- (data %>% dplyr::filter(psOver ==group2) )$log2FoldChange
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
#  
# ps01 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(tempDown, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver4\), 5)


p <- ggplot(tempDown, aes(x = peOver, y = log2FoldChange)) + geom_violin(aes(fill = peOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = peOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = -0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(-1, 0))

  
fileName <- paste0(\log2FC_barplot_peGroup_A485_vs_DMSO_down\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
 
# ps01 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(tempUp, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver4\), 5)
# 




p <- ggplot(tempUp, aes(x = peOver, y = log2FoldChange)) + geom_violin(aes(fill = peOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = peOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_peGroup_A485_vs_DMSO_up\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUkxeHVJeUFnWjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGpJQ0FnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hCelQzWmxjaUE5UFdkeWIzVndNU2tnS1NSc2IyY3lSbTlzWkVOb1lXNW5aVnh1SXlBZ0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiRzluTWtadmJHUkRhR0Z1WjJWY2JpTWdJQ0IzYVd3Z1BDMGdkMmxzWTI5NExuUmxjM1FvWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcFhHNGpJQ0FnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dUl5QjlYRzRqSUZ4dWRHVnRjRVJ2ZDI0Z1BDMGdkR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loc2IyY3lSbTlzWkVOb1lXNW5aU0E4SURBcFhHNGpJQ0JjYmlNZ2NITXdNU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNYSEJ6VDNabGNqQmNYQ3dnWEZ4d2MwOTJaWEl4WEZ3cExDQTFLVnh1SXlCd2N6RXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRVJ2ZDI0c0lGeGNjSE5QZG1WeU1WeGNMQ0JjWEhCelQzWmxjakpjWENrc0lEVXBYRzRqSUhCek1qTWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdSRzkzYml3Z1hGeHdjMDkyWlhJeVhGd3NJRnhjY0hOUGRtVnlNMXhjS1N3Z05TbGNiaU1nY0hNek5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY1hIQnpUM1psY2pOY1hDd2dYRnh3YzA5MlpYSTBYRndwTENBMUtWeHVJeUJ3Y3pJMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNFUnZkMjRzSUZ4Y2NITlBkbVZ5TWx4Y0xDQmNYSEJ6VDNabGNqUmNYQ2tzSURVcFhHNGpJSEJ6TVRRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1JHOTNiaXdnWEZ4d2MwOTJaWEl4WEZ3c0lGeGNjSE5QZG1WeU5GeGNLU3dnTlNsY2JpTWdjSE13TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjWEhCelQzWmxjakJjWEN3Z1hGeHdjMDkyWlhJMFhGd3BMQ0ExS1Z4dVhHNWNibkFnUEMwZ1oyZHdiRzkwS0hSbGJYQkViM2R1TENCaFpYTW9lQ0E5SUhCbFQzWmxjaXdnZVNBOUlHeHZaekpHYjJ4a1EyaGhibWRsS1NrZ0t5Qm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUhCbFQzWmxjaWtzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDdGNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1hHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQndaVTkyWlhJcExDQm1kVzRnUFNCdFpXRnVMQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ4Y2NtVmtYRndzSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXBYRzRnSUNNZ1lXNXViM1JoZEdVb1hGeDBaWGgwWEZ3c0lIZ2dQU0F4TENCNUlEMGdMVEF1TlN3Z2JHRmlaV3dnUFNCd1lYTjBaVEFvWEZ4d2N6QXhPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekF4S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6RXlPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekV5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6SXpPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekl6S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6TTBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjek0wS1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6STBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekkwS1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6RTBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekUwS1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6QTBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekEwS1N3Z1hGeGNYRzVjWENrc0lGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektTQXJJR052YjNKa1gyTmhjblJsYzJsaGJpaDViR2x0SUQwZ1l5Z3RNU3dnTUNrcFhHNWNiaUFnWEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hGeHNiMmN5UmtOZlltRnljR3h2ZEY5d1pVZHliM1Z3WDBFME9EVmZkbk5mUkUxVFQxOWtiM2R1WEZ3cFhHNW9aV2xuYUhRZ1BDMGdNMXh1ZDJsa2RHZ2dQQzBnTTF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc1Y2JseHVkR1Z0Y0ZWd0lEd3RJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JHOW5Na1p2YkdSRGFHRnVaMlVnUGlBd0tWeHVJRnh1SXlCd2N6QXhJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY1hIQnpUM1psY2pCY1hDd2dYRnh3YzA5MlpYSXhYRndwTENBMUtWeHVJeUJ3Y3pFeUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjWEhCelQzWmxjakZjWEN3Z1hGeHdjMDkyWlhJeVhGd3BMQ0ExS1Z4dUl5Qndjekl6SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNYSEJ6VDNabGNqSmNYQ3dnWEZ4d2MwOTJaWEl6WEZ3cExDQTFLVnh1SXlCd2N6TTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY1hIQnpUM1psY2pOY1hDd2dYRnh3YzA5MlpYSTBYRndwTENBMUtWeHVJeUJ3Y3pJMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGVndMQ0JjWEhCelQzWmxjakpjWEN3Z1hGeHdjMDkyWlhJMFhGd3BMQ0ExS1Z4dUl5QndjekUwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZWd0xDQmNYSEJ6VDNabGNqRmNYQ3dnWEZ4d2MwOTJaWEkwWEZ3cExDQTFLVnh1SXlCd2N6QTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRlZ3TENCY1hIQnpUM1psY2pCY1hDd2dYRnh3YzA5MlpYSTBYRndwTENBMUtWeHVJeUJjYmx4dVhHNWNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjRlZ3TENCaFpYTW9lQ0E5SUhCbFQzWmxjaXdnZVNBOUlHeHZaekpHYjJ4a1EyaGhibWRsS1NrZ0t5Qm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUhCbFQzWmxjaWtzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDdGNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1hHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQndaVTkyWlhJcExDQm1kVzRnUFNCdFpXRnVMQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ4Y2NtVmtYRndzSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXBYRzRnSUNNZ1lXNXViM1JoZEdVb1hGeDBaWGgwWEZ3c0lIZ2dQU0F4TENCNUlEMGdNQzQxTENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjWEhCek1ERTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNREVwTENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek1USTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNVElwTENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek1qTTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNak1wTENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek16UTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNelFwTENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek1qUTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNalFwTENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek1UUTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNVFFwTENCY1hGeGNibHhjTEZ4dUlDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek1EUTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNRFFwTENCY1hGeGNibHhjS1N3Z1hHNGdJQ01nSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzSUdocWRYTjBJRDBnTUN3Z2MybDZaU0E5SURNcElDc2dZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktEQXNJREVwS1Z4dVhHNGdJRnh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y2JHOW5Na1pEWDJKaGNuQnNiM1JmY0dWSGNtOTFjRjlCTkRnMVgzWnpYMFJOVTA5ZmRYQmNYQ2xjYm1obGFXZG9kQ0E4TFNBelhHNTNhV1IwYUNBOExTQXpYRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbiNcbiMgIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuIyAgIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbG9nMkZvbGRDaGFuZ2VcbiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJGxvZzJGb2xkQ2hhbmdlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcbnRlbXBEb3duIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKVxuIyAgXG4jIHBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxuIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG4jIHBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wRG93biwgYWVzKHggPSBwZU92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwZU92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcGVPdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IC0wLjUsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsIGNvbnZQdmFsdWUocHMxNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMwNDogXFwsIGNvbnZQdmFsdWUocHMwNCksIFxcXFxuXFwpLCBcbiAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEsIDApKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcGVHcm91cF9BNDg1X3ZzX0RNU09fZG93blxcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMClcbiBcbiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbiMgcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgXG5cblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwZU92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwZU92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcGVPdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSlcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BlR3JvdXBfQTQ4NV92c19ETVNPX3VwXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuI1xuIyAgZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4jICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2VcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG4jIFxudGVtcERvd24gPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA8IDApXG4jICBcbiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxuIyBwczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjJcXCksIDUpXG4jIHBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KHRlbXBEb3duLCBhZXMoeCA9IHBlT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBlT3ZlciksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwZU92ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gLTAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMSwgMCkpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfYmFycGxvdF9wZUdyb3VwX0E0ODVfdnNfRE1TT19kb3duXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cblxudGVtcFVwIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPiAwKVxuIFxuIyBwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxuIyBwczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxuIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXIzXFwpLCA1KVxuIyBwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBcblxuXG5cblxucCA8LSBnZ3Bsb3QodGVtcFVwLCBhZXMoeCA9IHBlT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBlT3ZlciksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwZU92ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMC41LCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEpKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcGVHcm91cF9BNDg1X3ZzX0RNU09fdXBcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
#
#  getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(psOver ==group1) )$log2FoldChange
#   distance2 <- (data %>% dplyr::filter(psOver ==group2) )$log2FoldChange
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
#  
# ps01 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(tempDown, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver4\), 5)


p <- ggplot(tempDown, aes(x = peOver, y = log2FoldChange)) + geom_violin(aes(fill = peOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = peOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = -0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(-1, 0))

  
fileName <- paste0(\log2FC_barplot_peGroup_A485_vs_DMSO_down\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
 
# ps01 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(tempUp, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver4\), 5)
# 




p <- ggplot(tempUp, aes(x = peOver, y = log2FoldChange)) + geom_violin(aes(fill = peOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = peOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_peGroup_A485_vs_DMSO_up\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### loop score

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUIwWlcxd01pQmpiMjUwWVdsdWN5Qm5aVzVsY3lCbWNtOXRJR2R5YjNWd0lERXNJRElzSURVc0lEZ2dZVzVrSUd4dmIzQWdZMjkxYm5SelhHNGpZMkZzWTNWc1lYUnBibWNnWkdsbVppQnpZMjl5WlNCaGJtUWdiRzluTW1aaklHUnBjM1J5YVdKMWRHbHZiaUJpWVhObFpDQnZiaUJ3TFc0Z2JuVnRZbVZ5YzF4dWNIQlBkbVZ5TkNBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J3SUQ0OUlEUXBLU1JuWlc1bFhHNXdjRTkyWlhJeklEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hBZ1BqMGdNeXdnYm5WdFgzQndJRHdnTkNrcEpHZGxibVZjYm5Cd1QzWmxjaklnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjQ0ErUFNBeUxDQnVkVzFmY0hBZ1BDQXpLU2trWjJWdVpWeHVjSEJQZG1WeU1TQThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCd0lENDlJREVzSUc1MWJWOXdjQ0E4SURJcEtTUm5aVzVsWEc1d2NFOTJaWEl3SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSEFnUENBeEtTa2taMlZ1WlZ4dVhHNWNibHh1SXlNZ1JHbDJhV1JwYm1jZ1oyVnVaWE1nYVc1MGJ5Qm5jbTkxY0hOY2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwWm1aZlFUUTROVjlFVFZOUExDQmthWE4wWVc1alpTd2daMlZ1WlNrZ0pUNGxJRnh1SUNCMWJtNWxjM1FvWjJWdVpTa2dKVDRsSUdkeWIzVndYMko1S0dkbGJtVXBJQ1UrSlZ4dUlDQnpkVzF0WVhKcGVtVW9iV1ZoYmw5a2FXWm1YM05qYjNKbElEMGdiV1ZoYmloa2FXWm1YMEUwT0RWZlJFMVRUeWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnRaV0Z1WDJScGMzUmhibU5sSUQwZ2JXVmhiaWhrYVhOMFlXNWpaU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQXVaM0p2ZFhCeklEMGdKMlJ5YjNBbktWeHVYRzVrYVdabUxsSk9RU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSmthV1ptWDBjeExrRTBPRFV1YzJWc1pXTjBaV1F5WDBjeExqSnBMa0UwT0RWZmRuTmZSekV1TW1rdVJFMVRUeTUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dWdWMyVnRZbXhmWjJWdVpWOXBaQ3dnYkc5bk1rWnZiR1JEYUdGdVoyVXNJSE5vY21sdWEyVmtYMnh2WnpKR1F5d2djR0ZrYWl3Z1pYaDBaWEp1WVd4ZloyVnVaVjl1WVcxbEtWeHVYRzV0WVhoTWIyY3lSa01nUFNBeVhHNWNiblJsYlhBZ1BDMGdiR1ZtZEY5cWIybHVLSFJsYlhBc0lHUnBabVl1VWs1QkxDQmllU0E5SUdNb1hDSm5aVzVsWENJZ1BTQmNJbVZ1YzJWdFlteGZaMlZ1WlY5cFpGd2lLU2tnSlQ0bElGeHVJQ0JrY205d1gyNWhLSE5vY21sdWEyVmtYMnh2WnpKR1F5bGNibHh1WEc1MFpXMXdJRHd0SUhSbGJYQWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9YRzRnSUhCd1QzWmxjaUE5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnY0hCUGRtVnlOQ3dnWENKd2NFOTJaWEkwWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElIQndUM1psY2pNc0lGd2ljSEJQZG1WeU0xd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjSEJQZG1WeU1pd2dYQ0p3Y0U5MlpYSXlYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjSEJQZG1WeU1Td2dYQ0p3Y0U5MlpYSXhYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElIQndUM1psY2pBc0lGd2ljSEJQZG1WeU1Gd2lMQ0JPUVNrcEtTa3BLU0FsUGlWY2JpQWdaSEp2Y0Y5dVlTaHdjRTkyWlhJcFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuIyB0ZW1wMiBjb250YWlucyBnZW5lcyBmcm9tIGdyb3VwIDEsIDIsIDUsIDggYW5kIGxvb3AgY291bnRzXG4jY2FsY3VsYXRpbmcgZGlmZiBzY29yZSBhbmQgbG9nMmZjIGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiBwLW4gbnVtYmVyc1xucHBPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDQpKSRnZW5lXG5wcE92ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMywgbnVtX3BwIDwgNCkpJGdlbmVcbnBwT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAyLCBudW1fcHAgPCAzKSkkZ2VuZVxucHBPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDEsIG51bV9wcCA8IDIpKSRnZW5lXG5wcE92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPCAxKSkkZ2VuZVxuXG5cblxuIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHNcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX0E0ODVfRE1TTyksXG4gICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksXG4gICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHBwT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcHBPdmVyNCwgXFxwcE92ZXI0XFwsXG4gICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBwT3ZlcjMsIFxccHBPdmVyM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHBPdmVyMiwgXFxwcE92ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHBPdmVyMSwgXFxwcE92ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBwT3ZlcjAsIFxccHBPdmVyMFxcLCBOQSkpKSkpKSAlPiVcbiAgZHJvcF9uYShwcE92ZXIpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers
ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)


temp <- temp %>% dplyr::mutate(
  ppOver = ifelse(gene %in% ppOver4, \ppOver4\,
                  ifelse(gene %in% ppOver3, \ppOver3\,
                         ifelse(gene %in% ppOver2, \ppOver2\,
                                ifelse(gene %in% ppOver1, \ppOver1\,
                                       ifelse(gene %in% ppOver0, \ppOver0\, NA)))))) %>%
  drop_na(ppOver)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QjBaVzF3TWlCamIyNTBZV2x1Y3lCblpXNWxjeUJtY205dElHZHliM1Z3SURFc0lESXNJRFVzSURnZ1lXNWtJR3h2YjNBZ1kyOTFiblJ6WEc0alkyRnNZM1ZzWVhScGJtY2daR2xtWmlCelkyOXlaU0JoYm1RZ2JHOW5NbVpqSUdScGMzUnlhV0oxZEdsdmJpQmlZWE5sWkNCdmJpQndMVzRnYm5WdFltVnljMXh1Y0hCUGRtVnlOQ0E4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQndJRDQ5SURRcEtTUm5aVzVsWEc1d2NFOTJaWEl6SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSEFnUGowZ015d2diblZ0WDNCd0lEd2dOQ2twSkdkbGJtVmNibkJ3VDNabGNqSWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2NDQStQU0F5TENCdWRXMWZjSEFnUENBektTa2taMlZ1WlZ4dWNIQlBkbVZ5TVNBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J3SUQ0OUlERXNJRzUxYlY5d2NDQThJRElwS1NSblpXNWxYRzV3Y0U5MlpYSXdJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNIQWdQQ0F4S1Nra1oyVnVaVnh1WEc1Y2JseHVJeU1nUkdsMmFXUnBibWNnWjJWdVpYTWdhVzUwYnlCbmNtOTFjSE5jYm5SbGJYQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHUnBabVpmUVRRNE5WOUVUVk5QTENCa2FYTjBZVzVqWlN3Z1oyVnVaU2tnSlQ0bElGeHVJQ0IxYm01bGMzUW9aMlZ1WlNrZ0pUNGxJR2R5YjNWd1gySjVLR2RsYm1VcElDVStKVnh1SUNCemRXMXRZWEpwZW1Vb2JXVmhibDlrYVdabVgzTmpiM0psSUQwZ2JXVmhiaWhrYVdabVgwRTBPRFZmUkUxVFR5a3NYRzRnSUNBZ0lDQWdJQ0FnSUNCdFpXRnVYMlJwYzNSaGJtTmxJRDBnYldWaGJpaGthWE4wWVc1alpTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBdVozSnZkWEJ6SUQwZ0oyUnliM0FuS1Z4dVhHNWthV1ptTGxKT1FTQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4a2FXWm1YMGN4TGtFME9EVXVjMlZzWldOMFpXUXlYMGN4TGpKcExrRTBPRFZmZG5OZlJ6RXVNbWt1UkUxVFR5NTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR1Z1YzJWdFlteGZaMlZ1WlY5cFpDd2diRzluTWtadmJHUkRhR0Z1WjJVc0lITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2NHRmthaXdnWlhoMFpYSnVZV3hmWjJWdVpWOXVZVzFsS1Z4dVhHNXRZWGhNYjJjeVJrTWdQU0F5WEc1Y2JuUmxiWEFnUEMwZ2JHVm1kRjlxYjJsdUtIUmxiWEFzSUdScFptWXVVazVCTENCaWVTQTlJR01vWEZ4blpXNWxYRndnUFNCY1hHVnVjMlZ0WW14ZloyVnVaVjlwWkZ4Y0tTa2dKVDRsSUZ4dUlDQmtjbTl3WDI1aEtITm9jbWx1YTJWa1gyeHZaekpHUXlsY2JseHVYRzUwWlcxd0lEd3RJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1hHNGdJSEJ3VDNabGNpQTlJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdjSEJQZG1WeU5Dd2dYRnh3Y0U5MlpYSTBYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUhCd1QzWmxjak1zSUZ4Y2NIQlBkbVZ5TTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NIQlBkbVZ5TWl3Z1hGeHdjRTkyWlhJeVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ2NIQlBkbVZ5TVN3Z1hGeHdjRTkyWlhJeFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUhCd1QzWmxjakFzSUZ4Y2NIQlBkbVZ5TUZ4Y0xDQk9RU2twS1NrcEtTQWxQaVZjYmlBZ1pISnZjRjl1WVNod2NFOTJaWElwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuIyB0ZW1wMiBjb250YWlucyBnZW5lcyBmcm9tIGdyb3VwIDEsIDIsIDUsIDggYW5kIGxvb3AgY291bnRzXG4jY2FsY3VsYXRpbmcgZGlmZiBzY29yZSBhbmQgbG9nMmZjIGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiBwLW4gbnVtYmVyc1xucHBPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDQpKSRnZW5lXG5wcE92ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMywgbnVtX3BwIDwgNCkpJGdlbmVcbnBwT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAyLCBudW1fcHAgPCAzKSkkZ2VuZVxucHBPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDEsIG51bV9wcCA8IDIpKSRnZW5lXG5wcE92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPCAxKSkkZ2VuZVxuXG5cblxuIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHNcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX0E0ODVfRE1TTyksXG4gICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksXG4gICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHBwT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcHBPdmVyNCwgXFxwcE92ZXI0XFwsXG4gICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBwT3ZlcjMsIFxccHBPdmVyM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHBPdmVyMiwgXFxwcE92ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHBPdmVyMSwgXFxwcE92ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBwT3ZlcjAsIFxccHBPdmVyMFxcLCBOQSkpKSkpKSAlPiVcbiAgZHJvcF9uYShwcE92ZXIpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyB0ZW1wMiBjb250YWlucyBnZW5lcyBmcm9tIGdyb3VwIDEsIDIsIDUsIDggYW5kIGxvb3AgY291bnRzXG4jY2FsY3VsYXRpbmcgZGlmZiBzY29yZSBhbmQgbG9nMmZjIGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiBwLW4gbnVtYmVyc1xucHBPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDQpKSRnZW5lXG5wcE92ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMywgbnVtX3BwIDwgNCkpJGdlbmVcbnBwT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAyLCBudW1fcHAgPCAzKSkkZ2VuZVxucHBPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDEsIG51bV9wcCA8IDIpKSRnZW5lXG5wcE92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPCAxKSkkZ2VuZVxuXG5cblxuIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHNcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX0E0ODVfRE1TTyksXG4gICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksXG4gICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHBwT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcHBPdmVyNCwgXFxwcE92ZXI0XFwsXG4gICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBwT3ZlcjMsIFxccHBPdmVyM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHBPdmVyMiwgXFxwcE92ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHBPdmVyMSwgXFxwcE92ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBwT3ZlcjAsIFxccHBPdmVyMFxcLCBOQSkpKSkpKSAlPiVcbiAgZHJvcF9uYShwcE92ZXIpXG5gYGBcbmBgYCJ9 -->

```r
```r
# temp2 contains genes from group 1, 2, 5, 8 and loop counts
#calculating diff score and log2fc distribution based on p-n numbers
ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene



## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_A485_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_A485_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  drop_na(shrinked_log2FC)


temp <- temp %>% dplyr::mutate(
  ppOver = ifelse(gene %in% ppOver4, \ppOver4\,
                  ifelse(gene %in% ppOver3, \ppOver3\,
                         ifelse(gene %in% ppOver2, \ppOver2\,
                                ifelse(gene %in% ppOver1, \ppOver1\,
                                       ifelse(gene %in% ppOver0, \ppOver0\, NA)))))) %>%
  drop_na(ppOver)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### log2FC

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJIVDJacFowUnBjaUE4TFNCb1pYSmxLR1pwWjBScGNpd2dYQ0l1TGk5SFQxd2lLVnh1SXlCblpYUkhUeWhjSW5Cd1QzWmxjalJjSWl3Z1IwOW1hV2RFYVhJc0lIQnpUM1psY2pRcFhHNGpJR2RsZEVkUEtGd2ljSEJQZG1WeU0xd2lMQ0JIVDJacFowUnBjaXdnY0hOUGRtVnlNeWxjYmlNZ1oyVjBSMDhvWENKd2NFOTJaWEl5WENJc0lFZFBabWxuUkdseUxDQndjMDkyWlhJeUtWeHVJeUJuWlhSSFR5aGNJbkJ3VDNabGNqRmNJaXdnUjA5bWFXZEVhWElzSUhCelQzWmxjakVwWEc0aklHZGxkRWRQS0Z3aWNIQlBkbVZ5TUZ3aUxDQkhUMlpwWjBScGNpd2djSE5QZG1WeU1DbGNiaU1nWEc0aklDTWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJMXh1SXlCSFR6QXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hsYm5KcFkyaEhUeWhuWlc1bElEMGdjSE5QZG1WeU1Dd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY0lrVk9VMFZOUWt4Y0lpd2diMjUwSUQwZ1hDSkNVRndpS1NsY2JpTWdSMDh4TG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCelQzWmxjakVzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYQ0pGVGxORlRVSk1YQ0lzSUc5dWRDQTlJRndpUWxCY0lpa3BYRzRqSUVkUE1pNWtaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLR1Z1Y21samFFZFBLR2RsYm1VZ1BTQndjMDkyWlhJeUxDQlBjbWRFWWlBOUlHOXlaeTVOYlM1bFp5NWtZaXdnYTJWNVZIbHdaU0E5SUZ3aVJVNVRSVTFDVEZ3aUxDQnZiblFnUFNCY0lrSlFYQ0lwS1Z4dUl5QkhUek11WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNobGJuSnBZMmhIVHloblpXNWxJRDBnY0hOUGRtVnlNeXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUtTbGNiaU1nUjA4MExtUm1JRHd0SUdGekxtUmhkR0V1Wm5KaGJXVW9aVzV5YVdOb1IwOG9aMlZ1WlNBOUlIQnpUM1psY2pRc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWENKRlRsTkZUVUpNWENJc0lHOXVkQ0E5SUZ3aVFsQmNJaWtwWEc0aklGeHVJeUJjYmlNZ2MzVmljMlYwTUNBOExTQkhUekF1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGd2ljSE5QZG1WeU1Gd2lLU0FsUGlWY2JpTWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJeUFnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGpJQ0FnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjSWk5Y0lseHVJeUFnSUNBZ0lDQndZWEowY3lBOExTQjFibXhwYzNRb2MzUnljM0JzYVhRb2VDd2dYQ0l2WENJcEtWeHVJeUFnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaU1nSUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJeUFnSUNBZ2ZTbGNiaU1nSUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNiaU1nYzNWaWMyVjBNU0E4TFNCSFR6RXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ3aWNITlBkbVZ5TVZ3aUtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNJaTljSWx4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hDSXZYQ0lwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdjM1ZpYzJWME1pQThMU0JIVHpJdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRndpY0hOUGRtVnlNbHdpS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SXlBZ0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRqSUNBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY0lpOWNJbHh1SXlBZ0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWENJdlhDSXBLVnh1SXlBZ0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlNZ0lDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SXlBZ0lDQWdmU2xjYmlNZ0lDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmlNZ2MzVmljMlYwTXlBOExTQkhUek11WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGd2ljSE5QZG1WeU0xd2lLU0FsUGlWY2JpTWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJeUFnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGpJQ0FnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjSWk5Y0lseHVJeUFnSUNBZ0lDQndZWEowY3lBOExTQjFibXhwYzNRb2MzUnljM0JzYVhRb2VDd2dYQ0l2WENJcEtWeHVJeUFnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaU1nSUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJeUFnSUNBZ2ZTbGNiaU1nSUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNiaU1nYzNWaWMyVjBOQ0E4TFNCSFR6UXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ3aWNITlBkbVZ5TkZ3aUtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNJaTljSWx4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hDSXZYQ0lwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdYRzRqSUZ4dUl5QkhUMnhwYzNRZ1BDMGdabUZqZEc5eUtHTW9YQ0pIVHpvd01EQTJNemszWENJc0lGd2lSMDg2TURBd09ETTRNRndpTENCY0lrZFBPakF3TWpJMk1UTmNJaXdnWENKSFR6b3dNRE0wTkRjd1hDSXNYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lrZFBPakF3TVRZd05UVmNJaXdnWENKSFR6b3dNREEzTXpnNVhDSXNJRndpUjA4Nk1EQTBPRFUyTWx3aUxDQmNJa2RQT2pBd05EVXhOalZjSWl3Z1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWtkUE9qQXdOekl3TURGY0lpd2dYQ0pIVHpvd01EQTNOVEUzWENJc0lGd2lSMDg2TURBME9EY3dOVndpTENCY0lrZFBPakF3TURNd01ESmNJaXdnWENKSFR6b3dNREE1TkRFeFhDSXBLVnh1SXlCY2JpTWdaR0YwWVNBOExTQmlhVzVrWDNKdmQzTW9ZbWx1WkY5eWIzZHpLSE4xWW5ObGREQXNJSE4xWW5ObGRERXBMQ0J6ZFdKelpYUXpLU0FsUGlWY2JpTWdJQ0JrY0d4NWNqbzZabWxzZEdWeUtFbEVJQ1ZwYmlVZ1IwOXNhWE4wS1Z4dUl5QmNiaU1nY0NBOExTQm5aM0JzYjNRb1pHRjBZU3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUVSbGMyTnlhWEIwYVc5dUxDQmpiMnh2Y2lBOUlIQXVZV1JxZFhOMExDQnphWHBsSUQwZ1ozSXBLU0FySUZ4dUl5QWdJR2RsYjIxZmNHOXBiblFvS1NBcklIUm9aVzFsWDJKM0tDa2dLMXh1SXlBZ0lITmpZV3hsWDJOdmJHOXlYMmR5WVdScFpXNTBLR3h2ZHlBOUlGd2ljbVZrWENJc0lHaHBaMmdnUFNCY0ltSnNkV1ZjSWl3Z2JHbHRhWFJ6SUQwZ1l5Z3dMQ0F3TGpBMUtTa2dLMXh1SXlBZ0lITmpZV3hsWDNOcGVtVmZZMjl1ZEdsdWRXOTFjeWh5WVc1blpTQTlJR01vTUN3Z015a3BJQ3RjYmlNZ0lDQnNZV0p6S0hnZ1BTQk9WVXhNTENCNUlEMGdUbFZNVENrZ0sxeHVJeUFnSUhSb1pXMWxLR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3NJQ0FqSUZObGRDQmhlR2x6SUhSbGVIUWdjMmw2WlZ4dUl5QWdJQ0FnSUNBZ0lHRjRhWE11ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb2MybDZaU0E5SURZcExDQWpJRk5sZENCaGVHbHpJSFJwZEd4bElITnBlbVVnS0dsbUlHNXZkQ0J5WlcxdmRtVmtLVnh1SXlBZ0lDQWdJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0hOcGVtVWdQU0EyS1N3Z0l5QlRaWFFnYkdWblpXNWtJSFJsZUhRZ2MybDZaVnh1SXlBZ0lDQWdJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTmlrcElGeHVJeUJjYmlNZ1ptbHNaVTVoYldVZ1BDMGdhR1Z5WlNobWFXZEVhWElzSUZ3aUxpNWNJaXdnWENKSFQxd2lMQ0JjSWtkUFgyZHliM1Z3YzE5d2NGd2lLVnh1SXlCb1pXbG5hSFFnUFNBeVhHNGpJSGRwWkhSb0lEMGdNeTQwWEc0aklITjJaMnhwZEdVb2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlNZ2NISnBiblFvY0NsY2JpTWdaR1YyTG05bVppZ3BYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbiMgR09maWdEaXIgPC0gaGVyZShmaWdEaXIsIFxcLi4vR09cXClcbiMgZ2V0R08oXFxwcE92ZXI0XFwsIEdPZmlnRGlyLCBwc092ZXI0KVxuIyBnZXRHTyhcXHBwT3ZlcjNcXCwgR09maWdEaXIsIHBzT3ZlcjMpXG4jIGdldEdPKFxccHBPdmVyMlxcLCBHT2ZpZ0RpciwgcHNPdmVyMilcbiMgZ2V0R08oXFxwcE92ZXIxXFwsIEdPZmlnRGlyLCBwc092ZXIxKVxuIyBnZXRHTyhcXHBwT3ZlcjBcXCwgR09maWdEaXIsIHBzT3ZlcjApXG4jIFxuIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgR08wLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjAsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPMS5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBHTzIuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR08zLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBcbiMgXG4jIHN1YnNldDAgPC0gR08wLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjBcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDEgPC0gR08xLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjFcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjJcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDMgPC0gR08zLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjNcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDQgPC0gR080LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjRcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIFxuIyBcbiMgR09saXN0IDwtIGZhY3RvcihjKFxcR086MDAwNjM5N1xcLCBcXEdPOjAwMDgzODBcXCwgXFxHTzowMDIyNjEzXFwsIFxcR086MDAzNDQ3MFxcLFxuIyAgICAgICAgICAgICAgICAgICAgXFxHTzowMDE2MDU1XFwsIFxcR086MDAwNzM4OVxcLCBcXEdPOjAwNDg1NjJcXCwgXFxHTzowMDQ1MTY1XFwsIFxuIyAgICAgICAgICAgICAgICAgICAgXFxHTzowMDcyMDAxXFwsIFxcR086MDAwNzUxN1xcLCBcXEdPOjAwNDg3MDVcXCwgXFxHTzowMDAzMDAyXFwsIFxcR086MDAwOTQxMVxcKSlcbiMgXG4jIGRhdGEgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQwLCBzdWJzZXQxKSwgc3Vic2V0MykgJT4lXG4jICAgZHBseXI6OmZpbHRlcihJRCAlaW4lIEdPbGlzdClcbiMgXG4jIHAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBEZXNjcmlwdGlvbiwgY29sb3IgPSBwLmFkanVzdCwgc2l6ZSA9IGdyKSkgKyBcbiMgICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICtcbiMgICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibHVlXFwsIGxpbWl0cyA9IGMoMCwgMC4wNSkpICtcbiMgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAsIDMpKSArXG4jICAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiMgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZClcbiMgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemVcbiMgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcbiMgXG4jIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXC4uXFwsIFxcR09cXCwgXFxHT19ncm91cHNfcHBcXClcbiMgaGVpZ2h0ID0gMlxuIyB3aWR0aCA9IDMuNFxuIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# GOfigDir <- here(figDir, \../GO\)
# getGO(\ppOver4\, GOfigDir, psOver4)
# getGO(\ppOver3\, GOfigDir, psOver3)
# getGO(\ppOver2\, GOfigDir, psOver2)
# getGO(\ppOver1\, GOfigDir, psOver1)
# getGO(\ppOver0\, GOfigDir, psOver0)
# 
# #####################
# GO0.df <- as.data.frame(enrichGO(gene = psOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO1.df <- as.data.frame(enrichGO(gene = psOver1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO2.df <- as.data.frame(enrichGO(gene = psOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO3.df <- as.data.frame(enrichGO(gene = psOver3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO4.df <- as.data.frame(enrichGO(gene = psOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# 
# 
# subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver0\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver1\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver2\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset3 <- GO3.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver3\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver4\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# 
# 
# GOlist <- factor(c(\GO:0006397\, \GO:0008380\, \GO:0022613\, \GO:0034470\,
#                    \GO:0016055\, \GO:0007389\, \GO:0048562\, \GO:0045165\, 
#                    \GO:0072001\, \GO:0007517\, \GO:0048705\, \GO:0003002\, \GO:0009411\))
# 
# data <- bind_rows(bind_rows(subset0, subset1), subset3) %>%
#   dplyr::filter(ID %in% GOlist)
# 
# p <- ggplot(data, aes(x = group, y = Description, color = p.adjust, size = gr)) + 
#   geom_point() + theme_bw() +
#   scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
#   scale_size_continuous(range = c(0, 3)) +
#   labs(x = NULL, y = NULL) +
#   theme(axis.text = element_text(size = 6),  # Set axis text size
#         axis.title = element_text(size = 6), # Set axis title size (if not removed)
#         legend.text = element_text(size = 6), # Set legend text size
#         legend.title = element_text(size = 6)) 
# 
# fileName <- here(figDir, \..\, \GO\, \GO_groups_pp\)
# height = 2
# width = 3.4
# svglite(paste0(fileName, \.svg\), height = height, width = width)
# print(p)
# dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkhUMlpwWjBScGNpQThMU0JvWlhKbEtHWnBaMFJwY2l3Z1hGd3VMaTlIVDF4Y0tWeHVJeUJuWlhSSFR5aGNYSEJ3VDNabGNqUmNYQ3dnUjA5bWFXZEVhWElzSUhCelQzWmxjalFwWEc0aklHZGxkRWRQS0Z4Y2NIQlBkbVZ5TTF4Y0xDQkhUMlpwWjBScGNpd2djSE5QZG1WeU15bGNiaU1nWjJWMFIwOG9YRnh3Y0U5MlpYSXlYRndzSUVkUFptbG5SR2x5TENCd2MwOTJaWEl5S1Z4dUl5Qm5aWFJIVHloY1hIQndUM1psY2pGY1hDd2dSMDltYVdkRWFYSXNJSEJ6VDNabGNqRXBYRzRqSUdkbGRFZFBLRnhjY0hCUGRtVnlNRnhjTENCSFQyWnBaMFJwY2l3Z2NITlBkbVZ5TUNsY2JpTWdYRzRqSUNNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakkxeHVJeUJIVHpBdVpHWWdQQzBnWVhNdVpHRjBZUzVtY21GdFpTaGxibkpwWTJoSFR5aG5aVzVsSUQwZ2NITlBkbVZ5TUN3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjWEVWT1UwVk5Ra3hjWEN3Z2IyNTBJRDBnWEZ4Q1VGeGNLU2xjYmlNZ1IwOHhMbVJtSUR3dElHRnpMbVJoZEdFdVpuSmhiV1VvWlc1eWFXTm9SMDhvWjJWdVpTQTlJSEJ6VDNabGNqRXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hGeEZUbE5GVFVKTVhGd3NJRzl1ZENBOUlGeGNRbEJjWENrcFhHNGpJRWRQTWk1a1ppQThMU0JoY3k1a1lYUmhMbVp5WVcxbEtHVnVjbWxqYUVkUEtHZGxibVVnUFNCd2MwOTJaWEl5TENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRnhjUlU1VFJVMUNURnhjTENCdmJuUWdQU0JjWEVKUVhGd3BLVnh1SXlCSFR6TXVaR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hsYm5KcFkyaEhUeWhuWlc1bElEMGdjSE5QZG1WeU15d2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjS1NsY2JpTWdSMDgwTG1SbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb1pXNXlhV05vUjA4b1oyVnVaU0E5SUhCelQzWmxjalFzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYRnhGVGxORlRVSk1YRndzSUc5dWRDQTlJRnhjUWxCY1hDa3BYRzRqSUZ4dUl5QmNiaU1nYzNWaWMyVjBNQ0E4TFNCSFR6QXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ4Y2NITlBkbVZ5TUZ4Y0tTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNYQzljWEZ4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hGd3ZYRndwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdjM1ZpYzJWME1TQThMU0JIVHpFdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRnhjY0hOUGRtVnlNVnhjS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SXlBZ0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRqSUNBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY1hDOWNYRnh1SXlBZ0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWEZ3dlhGd3BLVnh1SXlBZ0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlNZ0lDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SXlBZ0lDQWdmU2xjYmlNZ0lDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmlNZ2MzVmljMlYwTWlBOExTQkhUekl1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGeGNjSE5QZG1WeU1seGNLU0FsUGlWY2JpTWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJeUFnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGpJQ0FnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjWEM5Y1hGeHVJeUFnSUNBZ0lDQndZWEowY3lBOExTQjFibXhwYzNRb2MzUnljM0JzYVhRb2VDd2dYRnd2WEZ3cEtWeHVJeUFnSUNBZ0lDQWpJRU52Ym5abGNuUWdkRzhnYm5WdFpYSnBZeUJoYm1RZ2NHVnlabTl5YlNCMGFHVWdaR2wyYVhOcGIyNWNiaU1nSUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJeUFnSUNBZ2ZTbGNiaU1nSUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNiaU1nYzNWaWMyVjBNeUE4TFNCSFR6TXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ4Y2NITlBkbVZ5TTF4Y0tTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUl5QWdJQ0FnWjNJZ1BTQnpZWEJ3Ykhrb1IyVnVaVkpoZEdsdkxDQm1kVzVqZEdsdmJpaDRLU0I3WEc0aklDQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNYQzljWEZ4dUl5QWdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hGd3ZYRndwS1Z4dUl5QWdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpTWdJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUl5QWdJQ0FnZlNsY2JpTWdJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JpTWdjM1ZpYzJWME5DQThMU0JIVHpRdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRnhjY0hOUGRtVnlORnhjS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SXlBZ0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRqSUNBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY1hDOWNYRnh1SXlBZ0lDQWdJQ0J3WVhKMGN5QThMU0IxYm14cGMzUW9jM1J5YzNCc2FYUW9lQ3dnWEZ3dlhGd3BLVnh1SXlBZ0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlNZ0lDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SXlBZ0lDQWdmU2xjYmlNZ0lDQXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHZHlLU2xjYmlNZ1hHNGpJRnh1SXlCSFQyeHBjM1FnUEMwZ1ptRmpkRzl5S0dNb1hGeEhUem93TURBMk16azNYRndzSUZ4Y1IwODZNREF3T0RNNE1GeGNMQ0JjWEVkUE9qQXdNakkyTVROY1hDd2dYRnhIVHpvd01ETTBORGN3WEZ3c1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEVkUE9qQXdNVFl3TlRWY1hDd2dYRnhIVHpvd01EQTNNemc1WEZ3c0lGeGNSMDg2TURBME9EVTJNbHhjTENCY1hFZFBPakF3TkRVeE5qVmNYQ3dnWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRWRQT2pBd056SXdNREZjWEN3Z1hGeEhUem93TURBM05URTNYRndzSUZ4Y1IwODZNREEwT0Rjd05WeGNMQ0JjWEVkUE9qQXdNRE13TURKY1hDd2dYRnhIVHpvd01EQTVOREV4WEZ3cEtWeHVJeUJjYmlNZ1pHRjBZU0E4TFNCaWFXNWtYM0p2ZDNNb1ltbHVaRjl5YjNkektITjFZbk5sZERBc0lITjFZbk5sZERFcExDQnpkV0p6WlhRektTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0VsRUlDVnBiaVVnUjA5c2FYTjBLVnh1SXlCY2JpTWdjQ0E4TFNCblozQnNiM1FvWkdGMFlTd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJRVJsYzJOeWFYQjBhVzl1TENCamIyeHZjaUE5SUhBdVlXUnFkWE4wTENCemFYcGxJRDBnWjNJcEtTQXJJRnh1SXlBZ0lHZGxiMjFmY0c5cGJuUW9LU0FySUhSb1pXMWxYMkozS0NrZ0sxeHVJeUFnSUhOallXeGxYMk52Ykc5eVgyZHlZV1JwWlc1MEtHeHZkeUE5SUZ4Y2NtVmtYRndzSUdocFoyZ2dQU0JjWEdKc2RXVmNYQ3dnYkdsdGFYUnpJRDBnWXlnd0xDQXdMakExS1NrZ0sxeHVJeUFnSUhOallXeGxYM05wZW1WZlkyOXVkR2x1ZFc5MWN5aHlZVzVuWlNBOUlHTW9NQ3dnTXlrcElDdGNiaU1nSUNCc1lXSnpLSGdnUFNCT1ZVeE1MQ0I1SUQwZ1RsVk1UQ2tnSzF4dUl5QWdJSFJvWlcxbEtHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTmlrc0lDQWpJRk5sZENCaGVHbHpJSFJsZUhRZ2MybDZaVnh1SXlBZ0lDQWdJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFlwTENBaklGTmxkQ0JoZUdseklIUnBkR3hsSUhOcGVtVWdLR2xtSUc1dmRDQnlaVzF2ZG1Wa0tWeHVJeUFnSUNBZ0lDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTJLU3dnSXlCVFpYUWdiR1ZuWlc1a0lIUmxlSFFnYzJsNlpWeHVJeUFnSUNBZ0lDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOaWtwSUZ4dUl5QmNiaU1nWm1sc1pVNWhiV1VnUEMwZ2FHVnlaU2htYVdkRWFYSXNJRnhjTGk1Y1hDd2dYRnhIVDF4Y0xDQmNYRWRQWDJkeWIzVndjMTl3Y0Z4Y0tWeHVJeUJvWldsbmFIUWdQU0F5WEc0aklIZHBaSFJvSUQwZ015NDBYRzRqSUhOMloyeHBkR1VvY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2tzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaU1nY0hKcGJuUW9jQ2xjYmlNZ1pHVjJMbTltWmlncFhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbiMgR09maWdEaXIgPC0gaGVyZShmaWdEaXIsIFxcLi4vR09cXClcbiMgZ2V0R08oXFxwcE92ZXI0XFwsIEdPZmlnRGlyLCBwc092ZXI0KVxuIyBnZXRHTyhcXHBwT3ZlcjNcXCwgR09maWdEaXIsIHBzT3ZlcjMpXG4jIGdldEdPKFxccHBPdmVyMlxcLCBHT2ZpZ0RpciwgcHNPdmVyMilcbiMgZ2V0R08oXFxwcE92ZXIxXFwsIEdPZmlnRGlyLCBwc092ZXIxKVxuIyBnZXRHTyhcXHBwT3ZlcjBcXCwgR09maWdEaXIsIHBzT3ZlcjApXG4jIFxuIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgR08wLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjAsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPMS5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBHTzIuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR08zLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBcbiMgXG4jIHN1YnNldDAgPC0gR08wLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjBcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDEgPC0gR08xLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjFcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjJcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDMgPC0gR08zLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjNcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIHN1YnNldDQgPC0gR080LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHBzT3ZlcjRcXCkgJT4lXG4jICAgZHBseXI6Om11dGF0ZShcbiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4jICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiMgICAgIH0pXG4jICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG4jIFxuIyBcbiMgR09saXN0IDwtIGZhY3RvcihjKFxcR086MDAwNjM5N1xcLCBcXEdPOjAwMDgzODBcXCwgXFxHTzowMDIyNjEzXFwsIFxcR086MDAzNDQ3MFxcLFxuIyAgICAgICAgICAgICAgICAgICAgXFxHTzowMDE2MDU1XFwsIFxcR086MDAwNzM4OVxcLCBcXEdPOjAwNDg1NjJcXCwgXFxHTzowMDQ1MTY1XFwsIFxuIyAgICAgICAgICAgICAgICAgICAgXFxHTzowMDcyMDAxXFwsIFxcR086MDAwNzUxN1xcLCBcXEdPOjAwNDg3MDVcXCwgXFxHTzowMDAzMDAyXFwsIFxcR086MDAwOTQxMVxcKSlcbiMgXG4jIGRhdGEgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQwLCBzdWJzZXQxKSwgc3Vic2V0MykgJT4lXG4jICAgZHBseXI6OmZpbHRlcihJRCAlaW4lIEdPbGlzdClcbiMgXG4jIHAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBEZXNjcmlwdGlvbiwgY29sb3IgPSBwLmFkanVzdCwgc2l6ZSA9IGdyKSkgKyBcbiMgICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICtcbiMgICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibHVlXFwsIGxpbWl0cyA9IGMoMCwgMC4wNSkpICtcbiMgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAsIDMpKSArXG4jICAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiMgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZClcbiMgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemVcbiMgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcbiMgXG4jIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXC4uXFwsIFxcR09cXCwgXFxHT19ncm91cHNfcHBcXClcbiMgaGVpZ2h0ID0gMlxuIyB3aWR0aCA9IDMuNFxuIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBHT2ZpZ0RpciA8LSBoZXJlKGZpZ0RpciwgXFwuLi9HT1xcKVxuIyBnZXRHTyhcXHBwT3ZlcjRcXCwgR09maWdEaXIsIHBzT3ZlcjQpXG4jIGdldEdPKFxccHBPdmVyM1xcLCBHT2ZpZ0RpciwgcHNPdmVyMylcbiMgZ2V0R08oXFxwcE92ZXIyXFwsIEdPZmlnRGlyLCBwc092ZXIyKVxuIyBnZXRHTyhcXHBwT3ZlcjFcXCwgR09maWdEaXIsIHBzT3ZlcjEpXG4jIGdldEdPKFxccHBPdmVyMFxcLCBHT2ZpZ0RpciwgcHNPdmVyMClcbiMgXG4jICMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBHTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIEdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuIyBHTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbiMgR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG4jIFxuIyBcbiMgc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMVxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyMlxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0MyA8LSBHTzMuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyM1xcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxccHNPdmVyNFxcKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKFxuIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4jICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuIyAgICAgfSlcbiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcbiMgXG4jIFxuIyBHT2xpc3QgPC0gZmFjdG9yKGMoXFxHTzowMDA2Mzk3XFwsIFxcR086MDAwODM4MFxcLCBcXEdPOjAwMjI2MTNcXCwgXFxHTzowMDM0NDcwXFwsXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwMTYwNTVcXCwgXFxHTzowMDA3Mzg5XFwsIFxcR086MDA0ODU2MlxcLCBcXEdPOjAwNDUxNjVcXCwgXG4jICAgICAgICAgICAgICAgICAgICBcXEdPOjAwNzIwMDFcXCwgXFxHTzowMDA3NTE3XFwsIFxcR086MDA0ODcwNVxcLCBcXEdPOjAwMDMwMDJcXCwgXFxHTzowMDA5NDExXFwpKVxuIyBcbiMgZGF0YSA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKHN1YnNldDAsIHN1YnNldDEpLCBzdWJzZXQzKSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KVxuIyBcbiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IERlc2NyaXB0aW9uLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIFxuIyAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgK1xuIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsdWVcXCwgbGltaXRzID0gYygwLCAwLjA1KSkgK1xuIyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICtcbiMgICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuIyAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuIyAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuIyAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuIyBcbiMgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcLi5cXCwgXFxHT1xcLCBcXEdPX2dyb3Vwc19wcFxcKVxuIyBoZWlnaHQgPSAyXG4jIHdpZHRoID0gMy40XG4jIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
# GOfigDir <- here(figDir, \../GO\)
# getGO(\ppOver4\, GOfigDir, psOver4)
# getGO(\ppOver3\, GOfigDir, psOver3)
# getGO(\ppOver2\, GOfigDir, psOver2)
# getGO(\ppOver1\, GOfigDir, psOver1)
# getGO(\ppOver0\, GOfigDir, psOver0)
# 
# #####################
# GO0.df <- as.data.frame(enrichGO(gene = psOver0, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO1.df <- as.data.frame(enrichGO(gene = psOver1, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO2.df <- as.data.frame(enrichGO(gene = psOver2, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO3.df <- as.data.frame(enrichGO(gene = psOver3, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# GO4.df <- as.data.frame(enrichGO(gene = psOver4, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
# 
# 
# subset0 <- GO0.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver0\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset1 <- GO1.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver1\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset2 <- GO2.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver2\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset3 <- GO3.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver3\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# subset4 <- GO4.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \psOver4\) %>%
#   dplyr::mutate(
#     gr = sapply(GeneRatio, function(x) {
#       # Split the string by \/\
#       parts <- unlist(strsplit(x, \/\))
#       # Convert to numeric and perform the division
#       as.numeric(parts[1]) / as.numeric(parts[2])
#     })
#   ) %>% dplyr::arrange(desc(gr))
# 
# 
# GOlist <- factor(c(\GO:0006397\, \GO:0008380\, \GO:0022613\, \GO:0034470\,
#                    \GO:0016055\, \GO:0007389\, \GO:0048562\, \GO:0045165\, 
#                    \GO:0072001\, \GO:0007517\, \GO:0048705\, \GO:0003002\, \GO:0009411\))
# 
# data <- bind_rows(bind_rows(subset0, subset1), subset3) %>%
#   dplyr::filter(ID %in% GOlist)
# 
# p <- ggplot(data, aes(x = group, y = Description, color = p.adjust, size = gr)) + 
#   geom_point() + theme_bw() +
#   scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
#   scale_size_continuous(range = c(0, 3)) +
#   labs(x = NULL, y = NULL) +
#   theme(axis.text = element_text(size = 6),  # Set axis text size
#         axis.title = element_text(size = 6), # Set axis title size (if not removed)
#         legend.text = element_text(size = 6), # Set legend text size
#         legend.title = element_text(size = 6)) 
# 
# fileName <- here(figDir, \..\, \GO\, \GO_groups_pp\)
# height = 2
# width = 3.4
# svglite(paste0(fileName, \.svg\), height = height, width = width)
# print(p)
# dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



#### Grouping with P-P number
##### Grouping

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpTWdJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvY0hOUGRtVnlJRDA5WjNKdmRYQXhLU0FwSkcxbFlXNWZaR2xtWmw5elkyOXlaVnh1SXlBZ0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGpJQ0FnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJeUFnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JpTWdmVnh1SXlCY2JpTWdjSE13TVNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGd2ljSE5QZG1WeU1Gd2lMQ0JjSW5CelQzWmxjakZjSWlrc0lEVXBYRzRqSUhCek1USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjSW5CelQzWmxjakZjSWl3Z1hDSndjMDkyWlhJeVhDSXBMQ0ExS1Z4dUl5Qndjekl6SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hDSndjMDkyWlhJeVhDSXNJRndpY0hOUGRtVnlNMXdpS1N3Z05TbGNiaU1nY0hNek5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRndpY0hOUGRtVnlNMXdpTENCY0luQnpUM1psY2pSY0lpa3NJRFVwWEc0aklIQnpNalFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TENCY0luQnpUM1psY2pKY0lpd2dYQ0p3YzA5MlpYSTBYQ0lwTENBMUtWeHVJeUJ3Y3pFMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYQ0p3YzA5MlpYSXhYQ0lzSUZ3aWNITlBkbVZ5TkZ3aUtTd2dOU2xjYmlNZ2NITXdOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ3aWNITlBkbVZ5TUZ3aUxDQmNJbkJ6VDNabGNqUmNJaWtzSURVcFhHNWNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J3Y0U5MlpYSXNJSGtnUFNCdFpXRnVYMlJwWm1aZmMyTnZjbVVwS1NBcklHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnY0hCUGRtVnlLU3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0sxeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCY2JpQWdjM1JoZEY5emRXMXRZWEo1S0dGbGN5aG5jbTkxY0NBOUlIQndUM1psY2lrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNJbkJ2YVc1MFhDSXNJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWENKeVpXUmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01DbGNiaUFnSXlCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQXdMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkJ6TURFNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1ERXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TVRJNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1USXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TWpNNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1qTXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TXpRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek16UXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TWpRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1qUXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TVRRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1UUXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TURRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1EUXBMQ0JjSWx4Y2Jsd2lLU3dnWEc0Z0lDTWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wWEc1Y2JpQWdYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKa2FXWm1VMk52Y21WZlltRnljR3h2ZEY5d2NFZHliM1Z3WDBFME9EVmZkbk5mUkUxVFQxd2lLVnh1YUdWcFoyaDBJRHd0SUROY2JuZHBaSFJvSUR3dElETmNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG4jIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuIyAgIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbWVhbl9kaWZmX3Njb3JlXG4jICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMikgKSRtZWFuX2RpZmZfc2NvcmVcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG4jIFxuIyBwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjJcXCksIDUpXG4jIHBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXIzXFwpLCA1KVxuIyBwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHBwT3ZlciwgeSA9IG1lYW5fZGlmZl9zY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwcE92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcHBPdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyNDogXFwsIGNvbnZQdmFsdWUocHMyNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsIGNvbnZQdmFsdWUocHMxNCksIFxcXFxuXFwsXG4gICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMwNDogXFwsIGNvbnZQdmFsdWUocHMwNCksIFxcXFxuXFwpLCBcbiAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGRpZmZTY29yZV9iYXJwbG90X3BwR3JvdXBfQTQ4NV92c19ETVNPXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(psOver ==group1) )$mean_diff_score
#   distance2 <- (data %>% dplyr::filter(psOver ==group2) )$mean_diff_score
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
# ps01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(temp, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(temp, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)


p <- ggplot(temp, aes(x = ppOver, y = mean_diff_score)) + geom_violin(aes(fill = ppOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = ppOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3)

  
fileName <- paste0(\diffScore_barplot_ppGroup_A485_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5Qm5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlNZ0lDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jSE5QZG1WeUlEMDlaM0p2ZFhBeEtTQXBKRzFsWVc1ZlpHbG1abDl6WTI5eVpWeHVJeUFnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2MwOTJaWElnUFQxbmNtOTFjRElwSUNra2JXVmhibDlrYVdabVgzTmpiM0psWEc0aklDQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUl5QWdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYmlNZ2ZWeHVJeUJjYmlNZ2NITXdNU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ4Y2NITlBkbVZ5TUZ4Y0xDQmNYSEJ6VDNabGNqRmNYQ2tzSURVcFhHNGpJSEJ6TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNYSEJ6VDNabGNqRmNYQ3dnWEZ4d2MwOTJaWEl5WEZ3cExDQTFLVnh1SXlCd2N6SXpJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWEZ4d2MwOTJaWEl5WEZ3c0lGeGNjSE5QZG1WeU0xeGNLU3dnTlNsY2JpTWdjSE16TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGeGNjSE5QZG1WeU0xeGNMQ0JjWEhCelQzWmxjalJjWENrc0lEVXBYRzRqSUhCek1qUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjWEhCelQzWmxjakpjWEN3Z1hGeHdjMDkyWlhJMFhGd3BMQ0ExS1Z4dUl5QndjekUwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hGeHdjMDkyWlhJeFhGd3NJRnhjY0hOUGRtVnlORnhjS1N3Z05TbGNiaU1nY0hNd05DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRnhjY0hOUGRtVnlNRnhjTENCY1hIQnpUM1psY2pSY1hDa3NJRFVwWEc1Y2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQndjRTkyWlhJc0lIa2dQU0J0WldGdVgyUnBabVpmYzJOdmNtVXBLU0FySUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdjSEJQZG1WeUtTd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnSzF4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLR0ZsY3lobmNtOTFjQ0E5SUhCd1QzWmxjaWtzSUdaMWJpQTlJRzFsWVc0c0lHZGxiMjBnUFNCY1hIQnZhVzUwWEZ3c0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXlMQ0JtYVd4c0lEMGdYRnh5WldSY1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUNsY2JpQWdJeUJoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBd0xDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQnpNREU2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TURFcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNVEk2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TVRJcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNak02SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TWpNcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNelE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TXpRcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNalE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TWpRcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNVFE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TVRRcExDQmNYRnhjYmx4Y0xGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNRFE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TURRcExDQmNYRnhjYmx4Y0tTd2dYRzRnSUNNZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBYRzVjYmlBZ1hHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhrYVdabVUyTnZjbVZmWW1GeWNHeHZkRjl3Y0VkeWIzVndYMEUwT0RWZmRuTmZSRTFUVDF4Y0tWeHVhR1ZwWjJoMElEd3RJRE5jYm5kcFpIUm9JRHd0SUROY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcbiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG4jIHBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxuIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwcE92ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHBPdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBwT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxkaWZmU2NvcmVfYmFycGxvdF9wcEdyb3VwX0E0ODVfdnNfRE1TT1xcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcbiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG4jIHBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxuIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwcE92ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHBPdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBwT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxkaWZmU2NvcmVfYmFycGxvdF9wcEdyb3VwX0E0ODVfdnNfRE1TT1xcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(psOver ==group1) )$mean_diff_score
#   distance2 <- (data %>% dplyr::filter(psOver ==group2) )$mean_diff_score
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 
# ps01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(temp, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(temp, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)


p <- ggplot(temp, aes(x = ppOver, y = mean_diff_score)) + geom_violin(aes(fill = ppOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = ppOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3)

  
fileName <- paste0(\diffScore_barplot_ppGroup_A485_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### (SKIP) GO for each group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJMXh1SXlBZ1oyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRqSUNBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIQnpUM1psY2lBOVBXZHliM1Z3TVNrZ0tTUnNiMmN5Um05c1pFTm9ZVzVuWlZ4dUl5QWdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3YzA5MlpYSWdQVDFuY205MWNESXBJQ2trYkc5bk1rWnZiR1JEYUdGdVoyVmNiaU1nSUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRqSUNBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVJeUI5WEc1Y2JuUmxiWEJFYjNkdUlEd3RJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JHOW5Na1p2YkdSRGFHRnVaMlVnUENBd0tWeHVJeUFnWEc0aklIQnpNREVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3Ukc5M2Jpd2dYQ0p3YzA5MlpYSXdYQ0lzSUZ3aWNITlBkbVZ5TVZ3aUtTd2dOU2xjYmlNZ2NITXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJFYjNkdUxDQmNJbkJ6VDNabGNqRmNJaXdnWENKd2MwOTJaWEl5WENJcExDQTFLVnh1SXlCd2N6SXpJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRVJ2ZDI0c0lGd2ljSE5QZG1WeU1sd2lMQ0JjSW5CelQzWmxjak5jSWlrc0lEVXBYRzRqSUhCek16UWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdSRzkzYml3Z1hDSndjMDkyWlhJelhDSXNJRndpY0hOUGRtVnlORndpS1N3Z05TbGNiaU1nY0hNeU5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY0luQnpUM1psY2pKY0lpd2dYQ0p3YzA5MlpYSTBYQ0lwTENBMUtWeHVJeUJ3Y3pFMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNFUnZkMjRzSUZ3aWNITlBkbVZ5TVZ3aUxDQmNJbkJ6VDNabGNqUmNJaWtzSURVcFhHNGpJSEJ6TURRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1JHOTNiaXdnWENKd2MwOTJaWEl3WENJc0lGd2ljSE5QZG1WeU5Gd2lLU3dnTlNsY2JseHVYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtIUmxiWEJFYjNkdUxDQmhaWE1vZUNBOUlIQndUM1psY2l3Z2VTQTlJR3h2WnpKR2IyeGtRMmhoYm1kbEtTa2dLeUJuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlIQndUM1psY2lrc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3RjYmlBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDc2dYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0J3Y0U5MlpYSXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGd2ljbVZrWENJc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwWEc0Z0lDTWdZVzV1YjNSaGRHVW9YQ0owWlhoMFhDSXNJSGdnUFNBeExDQjVJRDBnTFRBdU5Td2diR0ZpWld3Z1BTQndZWE4wWlRBb1hDSndjekF4T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pBeEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekV5T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pFeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekl6T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pJektTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjek0wT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pNMEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekkwT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pJMEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekUwT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pFMEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekEwT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pBMEtTd2dYQ0pjWEc1Y0lpa3NJRnh1SUNBaklDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXpLU0FySUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWd0TVN3Z01Da3BYRzVjYmlBZ1hHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0pzYjJjeVJrTmZZbUZ5Y0d4dmRGOXdjRWR5YjNWd1gwRTBPRFZmZG5OZlJFMVRUMTlrYjNkdVhDSXBYRzVvWldsbmFIUWdQQzBnTTF4dWQybGtkR2dnUEMwZ00xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVhHNWNibHh1ZEdWdGNGVndJRHd0SUhSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iRzluTWtadmJHUkRhR0Z1WjJVZ1BpQXdLVnh1SXlBZ1hHNGpJSEJ6TURFZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1ZYQXNJRndpY0hOUGRtVnlNRndpTENCY0luQnpUM1psY2pGY0lpa3NJRFVwWEc0aklIQnpNVElnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VlhBc0lGd2ljSE5QZG1WeU1Wd2lMQ0JjSW5CelQzWmxjakpjSWlrc0lEVXBYRzRqSUhCek1qTWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdWWEFzSUZ3aWNITlBkbVZ5TWx3aUxDQmNJbkJ6VDNabGNqTmNJaWtzSURVcFhHNGpJSEJ6TXpRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1ZYQXNJRndpY0hOUGRtVnlNMXdpTENCY0luQnpUM1psY2pSY0lpa3NJRFVwWEc0aklIQnpNalFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VlhBc0lGd2ljSE5QZG1WeU1sd2lMQ0JjSW5CelQzWmxjalJjSWlrc0lEVXBYRzRqSUhCek1UUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdWWEFzSUZ3aWNITlBkbVZ5TVZ3aUxDQmNJbkJ6VDNabGNqUmNJaWtzSURVcFhHNGpJSEJ6TURRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1ZYQXNJRndpY0hOUGRtVnlNRndpTENCY0luQnpUM1psY2pSY0lpa3NJRFVwWEc0aklGeHVJeUJjYmx4dVhHNWNibkFnUEMwZ1oyZHdiRzkwS0hSbGJYQlZjQ3dnWVdWektIZ2dQU0J3Y0U5MlpYSXNJSGtnUFNCc2IyY3lSbTlzWkVOb1lXNW5aU2twSUNzZ1oyVnZiVjkyYVc5c2FXNG9ZV1Z6S0dacGJHd2dQU0J3Y0U5MlpYSXBMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBclhHNGdJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU1Td2diM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ2NIQlBkbVZ5S1N3Z1puVnVJRDBnYldWaGJpd2daMlZ2YlNBOUlGd2ljRzlwYm5SY0lpd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJRElzSUdacGJHd2dQU0JjSW5KbFpGd2lMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaWtnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0tWeHVJQ0FqSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdNU3dnZVNBOUlEQXVOU3dnYkdGaVpXd2dQU0J3WVhOMFpUQW9YQ0p3Y3pBeE9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6QXhLU3dnWENKY1hHNWNJaXhjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pFeU9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6RXlLU3dnWENKY1hHNWNJaXhjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pJek9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6SXpLU3dnWENKY1hHNWNJaXhjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pNME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6TTBLU3dnWENKY1hHNWNJaXhjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pJME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6STBLU3dnWENKY1hHNWNJaXhjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pFME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6RTBLU3dnWENKY1hHNWNJaXhjYmlBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pBME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6QTBLU3dnWENKY1hHNWNJaWtzSUZ4dUlDQWpJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F6S1NBcklHTnZiM0prWDJOaGNuUmxjMmxoYmloNWJHbHRJRDBnWXlnd0xDQXhLU2xjYmx4dUlDQmNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW14dlp6SkdRMTlpWVhKd2JHOTBYM0J3UjNKdmRYQmZRVFE0TlY5MmMxOUVUVk5QWDNWd1hDSXBYRzVvWldsbmFIUWdQQzBnTTF4dWQybGtkR2dnUEMwZ00xeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jXG4jICBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJGxvZzJGb2xkQ2hhbmdlXG4jICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMikgKSRsb2cyRm9sZENoYW5nZVxuIyAgIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiMgICByZXR1cm4od2lsJHAudmFsdWUpXG4jIH1cblxudGVtcERvd24gPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA8IDApXG4jICBcbiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwpLCA1KVxuIyBwczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjJcXCksIDUpXG4jIHBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjBcXCwgXFxwc092ZXI0XFwpLCA1KVxuXG5cblxucCA8LSBnZ3Bsb3QodGVtcERvd24sIGFlcyh4ID0gcHBPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHBPdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBwT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcbiAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAtMC41LCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0xLCAwKSlcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BwR3JvdXBfQTQ4NV92c19ETVNPX2Rvd25cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG50ZW1wVXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA+IDApXG4jICBcbiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcKSwgNSlcbiMgcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcKSwgNSlcbiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIyXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIxXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgXG4jIFxuXG5cblxucCA8LSBnZ3Bsb3QodGVtcFVwLCBhZXMoeCA9IHBwT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBwT3ZlciksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwcE92ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMC41LCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEpKVxuXG4gIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2JhcnBsb3RfcHBHcm91cF9BNDg1X3ZzX0RNU09fdXBcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
#
#  getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(psOver ==group1) )$log2FoldChange
#   distance2 <- (data %>% dplyr::filter(psOver ==group2) )$log2FoldChange
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }

tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
#  
# ps01 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(tempDown, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver4\), 5)



p <- ggplot(tempDown, aes(x = ppOver, y = log2FoldChange)) + geom_violin(aes(fill = ppOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = ppOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = -0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(-1, 0))

  
fileName <- paste0(\log2FC_barplot_ppGroup_A485_vs_DMSO_down\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
#  
# ps01 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(tempUp, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver4\), 5)
# 
# 



p <- ggplot(tempUp, aes(x = ppOver, y = log2FoldChange)) + geom_violin(aes(fill = ppOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = ppOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_ppGroup_A485_vs_DMSO_up\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUkxeHVJeUFnWjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGpJQ0FnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hCelQzWmxjaUE5UFdkeWIzVndNU2tnS1NSc2IyY3lSbTlzWkVOb1lXNW5aVnh1SXlBZ0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdjMDkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiRzluTWtadmJHUkRhR0Z1WjJWY2JpTWdJQ0IzYVd3Z1BDMGdkMmxzWTI5NExuUmxjM1FvWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcFhHNGpJQ0FnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dUl5QjlYRzVjYm5SbGJYQkViM2R1SUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYkc5bk1rWnZiR1JEYUdGdVoyVWdQQ0F3S1Z4dUl5QWdYRzRqSUhCek1ERWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdSRzkzYml3Z1hGeHdjMDkyWlhJd1hGd3NJRnhjY0hOUGRtVnlNVnhjS1N3Z05TbGNiaU1nY0hNeE1pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQkViM2R1TENCY1hIQnpUM1psY2pGY1hDd2dYRnh3YzA5MlpYSXlYRndwTENBMUtWeHVJeUJ3Y3pJeklEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNFUnZkMjRzSUZ4Y2NITlBkbVZ5TWx4Y0xDQmNYSEJ6VDNabGNqTmNYQ2tzSURVcFhHNGpJSEJ6TXpRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1JHOTNiaXdnWEZ4d2MwOTJaWEl6WEZ3c0lGeGNjSE5QZG1WeU5GeGNLU3dnTlNsY2JpTWdjSE15TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCRWIzZHVMQ0JjWEhCelQzWmxjakpjWEN3Z1hGeHdjMDkyWlhJMFhGd3BMQ0ExS1Z4dUl5QndjekUwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0VSdmQyNHNJRnhjY0hOUGRtVnlNVnhjTENCY1hIQnpUM1psY2pSY1hDa3NJRFVwWEc0aklIQnpNRFFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3Ukc5M2Jpd2dYRnh3YzA5MlpYSXdYRndzSUZ4Y2NITlBkbVZ5TkZ4Y0tTd2dOU2xjYmx4dVhHNWNibkFnUEMwZ1oyZHdiRzkwS0hSbGJYQkViM2R1TENCaFpYTW9lQ0E5SUhCd1QzWmxjaXdnZVNBOUlHeHZaekpHYjJ4a1EyaGhibWRsS1NrZ0t5Qm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUhCd1QzWmxjaWtzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDdGNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1hHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQndjRTkyWlhJcExDQm1kVzRnUFNCdFpXRnVMQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ4Y2NtVmtYRndzSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXBYRzRnSUNNZ1lXNXViM1JoZEdVb1hGeDBaWGgwWEZ3c0lIZ2dQU0F4TENCNUlEMGdMVEF1TlN3Z2JHRmlaV3dnUFNCd1lYTjBaVEFvWEZ4d2N6QXhPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekF4S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6RXlPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekV5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6SXpPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekl6S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6TTBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjek0wS1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6STBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekkwS1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6RTBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekUwS1N3Z1hGeGNYRzVjWEN4Y2JpQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6QTBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekEwS1N3Z1hGeGNYRzVjWENrc0lGeHVJQ0FqSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektTQXJJR052YjNKa1gyTmhjblJsYzJsaGJpaDViR2x0SUQwZ1l5Z3RNU3dnTUNrcFhHNWNiaUFnWEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hGeHNiMmN5UmtOZlltRnljR3h2ZEY5d2NFZHliM1Z3WDBFME9EVmZkbk5mUkUxVFQxOWtiM2R1WEZ3cFhHNW9aV2xuYUhRZ1BDMGdNMXh1ZDJsa2RHZ2dQQzBnTTF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc1Y2JseHVkR1Z0Y0ZWd0lEd3RJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JHOW5Na1p2YkdSRGFHRnVaMlVnUGlBd0tWeHVJeUFnWEc0aklIQnpNREVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VlhBc0lGeGNjSE5QZG1WeU1GeGNMQ0JjWEhCelQzWmxjakZjWENrc0lEVXBYRzRqSUhCek1USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdWWEFzSUZ4Y2NITlBkbVZ5TVZ4Y0xDQmNYSEJ6VDNabGNqSmNYQ2tzSURVcFhHNGpJSEJ6TWpNZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1ZYQXNJRnhjY0hOUGRtVnlNbHhjTENCY1hIQnpUM1psY2pOY1hDa3NJRFVwWEc0aklIQnpNelFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VlhBc0lGeGNjSE5QZG1WeU0xeGNMQ0JjWEhCelQzWmxjalJjWENrc0lEVXBYRzRqSUhCek1qUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdWWEFzSUZ4Y2NITlBkbVZ5TWx4Y0xDQmNYSEJ6VDNabGNqUmNYQ2tzSURVcFhHNGpJSEJ6TVRRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1ZYQXNJRnhjY0hOUGRtVnlNVnhjTENCY1hIQnpUM1psY2pSY1hDa3NJRFVwWEc0aklIQnpNRFFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VlhBc0lGeGNjSE5QZG1WeU1GeGNMQ0JjWEhCelQzWmxjalJjWENrc0lEVXBYRzRqSUZ4dUl5QmNibHh1WEc1Y2JuQWdQQzBnWjJkd2JHOTBLSFJsYlhCVmNDd2dZV1Z6S0hnZ1BTQndjRTkyWlhJc0lIa2dQU0JzYjJjeVJtOXNaRU5vWVc1blpTa3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQndjRTkyWlhJcExDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FyWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnY0hCUGRtVnlLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ4Y2NHOXBiblJjWEN3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNYSEpsWkZ4Y0xDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1Z4dUlDQWpJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ01Td2dlU0E5SURBdU5Td2diR0ZpWld3Z1BTQndZWE4wWlRBb1hGeHdjekF4T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pBeEtTd2dYRnhjWEc1Y1hDeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekV5T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pFeUtTd2dYRnhjWEc1Y1hDeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekl6T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pJektTd2dYRnhjWEc1Y1hDeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjek0wT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pNMEtTd2dYRnhjWEc1Y1hDeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekkwT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pJMEtTd2dYRnhjWEc1Y1hDeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekUwT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pFMEtTd2dYRnhjWEc1Y1hDeGNiaUFnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekEwT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pBMEtTd2dYRnhjWEc1Y1hDa3NJRnh1SUNBaklDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXpLU0FySUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWd3TENBeEtTbGNibHh1SUNCY2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYR3h2WnpKR1ExOWlZWEp3Ykc5MFgzQndSM0p2ZFhCZlFUUTROVjkyYzE5RVRWTlBYM1Z3WEZ3cFhHNW9aV2xuYUhRZ1BDMGdNMXh1ZDJsa2RHZ2dQQzBnTTF4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuI1xuIyAgZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4jICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2VcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG5cbnRlbXBEb3duIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKVxuIyAgXG4jIHBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxuIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG4jIHBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBEb3duLCBhZXMoeCA9IHBwT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBwT3ZlciksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwcE92ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gLTAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMSwgMCkpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfYmFycGxvdF9wcEdyb3VwX0E0ODVfdnNfRE1TT19kb3duXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cblxudGVtcFVwIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPiAwKVxuIyAgXG4jIHBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG4jIHBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjJcXCksIDUpXG4jIHBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG4jIHBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIFxuIyBcblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwcE92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwcE92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcHBPdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSlcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BwR3JvdXBfQTQ4NV92c19ETVNPX3VwXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuI1xuIyAgZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4jICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZVxuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2VcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG5cbnRlbXBEb3duIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKVxuIyAgXG4jIHBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyMVxcKSwgNSlcbiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwpLCA1KVxuIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG4jIHBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIzXFwsIFxccHNPdmVyNFxcKSwgNSlcbiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCBcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpLCA1KVxuIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgXFxwc092ZXIwXFwsIFxccHNPdmVyNFxcKSwgNSlcblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBEb3duLCBhZXMoeCA9IHBwT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBwT3ZlciksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwcE92ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApXG4gICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gLTAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMSwgMCkpXG5cbiAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfYmFycGxvdF9wcEdyb3VwX0E0ODVfdnNfRE1TT19kb3duXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cblxudGVtcFVwIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPiAwKVxuIyAgXG4jIHBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCksIDUpXG4jIHBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjJcXCksIDUpXG4jIHBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCksIDUpXG4jIHBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMVxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIHBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsIFxccHNPdmVyMFxcLCBcXHBzT3ZlcjRcXCksIDUpXG4jIFxuIyBcblxuXG5cbnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwcE92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwcE92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcHBPdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczE0OiBcXCwgY29udlB2YWx1ZShwczE0KSwgXFxcXG5cXCxcbiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSlcblxuICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19iYXJwbG90X3BwR3JvdXBfQTQ4NV92c19ETVNPX3VwXFwpXG5oZWlnaHQgPC0gM1xud2lkdGggPC0gM1xucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
#
#  getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(psOver ==group1) )$log2FoldChange
#   distance2 <- (data %>% dplyr::filter(psOver ==group2) )$log2FoldChange
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }

tempDown <- temp %>% dplyr::filter(log2FoldChange < 0)
#  
# ps01 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(tempDown, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(tempDown, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(tempDown, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(tempDown, \psOver0\, \psOver4\), 5)



p <- ggplot(tempDown, aes(x = ppOver, y = log2FoldChange)) + geom_violin(aes(fill = ppOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = ppOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = -0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(-1, 0))

  
fileName <- paste0(\log2FC_barplot_ppGroup_A485_vs_DMSO_down\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



tempUp <- temp %>% dplyr::filter(log2FoldChange > 0)
#  
# ps01 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver1\), 5)
# ps12 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver2\), 5)
# ps23 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver3\), 5)
# ps34 <- round(getPvalWilcox(tempUp, \psOver3\, \psOver4\), 5)
# ps24 <- round(getPvalWilcox(tempUp, \psOver2\, \psOver4\), 5)
# ps14 <- round(getPvalWilcox(tempUp, \psOver1\, \psOver4\), 5)
# ps04 <- round(getPvalWilcox(tempUp, \psOver0\, \psOver4\), 5)
# 
# 



p <- ggplot(tempUp, aes(x = ppOver, y = log2FoldChange)) + geom_violin(aes(fill = ppOver), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + theme_classic() + 
  stat_summary(aes(group = ppOver), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  geom_hline(yintercept = 0)
  # annotate(\text\, x = 1, y = 0.5, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
  #                                               \ps12: \, convPvalue(ps12), \\n\,
  #                                               \ps23: \, convPvalue(ps23), \\n\,
  #                                               \ps34: \, convPvalue(ps34), \\n\,
  #                                               \ps24: \, convPvalue(ps24), \\n\,
  #                                               \ps14: \, convPvalue(ps14), \\n\,
  #                                               \ps04: \, convPvalue(ps04), \\n\), 
  #          color = \black\, hjust = 0, size = 3) + coord_cartesian(ylim = c(0, 1))

  
fileName <- paste0(\log2FC_barplot_ppGroup_A485_vs_DMSO_up\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### loop score

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJKVFZCUFVsUkpUa2NnUjBWT1JTQkJUazVQSUVSQlZFRWdSazlTSUZBdFRpQk1UMDlRVTF4dWJtRnRaU0E4TFNCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY0lseHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgzQXRibDlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNJaWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsbVprTjFkRzltWmlBOUlEQXVNaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0Z1Ym05TWFYTjBJRDBnWXloY0lsQXRVRndpTENCY0lsQXRSVndpTENCY0lsQXRVMXdpTENCY0lsQXRXRndpS1NrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1l5Z3hMQ0F5TENBekxDQTBMQ0ExTENBMkxDQXhNU3dnTVRJc0lERXpMQ0F5TWl3Z01qTXNJREkwTENBeU5Td2dNamNzSURJNEtTbGNibHh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aUxuUnpkbHdpS1NrcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHTW9NU3dnTWl3Z015d2dOQ3dnTlN3Z05pd2dNVEVzSURFeUxDQXhNeXdnTWpJc0lESXpMQ0F5TkN3Z01qVXNJREkzS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9ZbWx1VTJsNlpTQTlJR1Z1WkRFZ0xTQnpkR0Z5ZERFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXUnFYM04wWVhKME1TQTlJR2xtWld4elpTaGlhVzVUYVhwbElEMDlJRFV3TURBc0lITjBZWEowTVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoaWFXNVRhWHBsSUQwOUlERXdNREF3TENCemRHRnlkREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNSaGNuUXhJQ3NnTVRBd01EQXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoWkdwZlpXNWtNU0E5SUdGa2FsOXpkR0Z5ZERFZ0t5QTFNREF3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGa2FsOXpkR0Z5ZERJZ1BTQnBabVZzYzJVb1ltbHVVMmw2WlNBOVBTQTFNREF3TENCemRHRnlkRElzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWW1sdVUybDZaU0E5UFNBeE1EQXdNQ3dnYzNSaGNuUXlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE4wWVhKME1pQXJJREV3TURBd0tTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZV1JxWDJWdVpESWdQU0JoWkdwZmMzUmhjblF5SUNzZ05UQXdNQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm1Ob2IzSXhJRDBnY0dGemRHVW9ZMmh5YjIweExDQmhaR3BmYzNSaGNuUXhMQ0JoWkdwZlpXNWtNU3dnYzJWd0lEMGdYQ0pmWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnVZMmh2Y2pJZ1BTQndZWE4wWlNoamFISnZiVElzSUdGa2FsOXpkR0Z5ZERJc0lHRmthbDlsYm1ReUxDQnpaWEFnUFNCY0lsOWNJaWtwWEc1Y2JpTWdaR0YwWVNBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpTG5SemRsd2lLU2twSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dNb01Td2dNaXdnTXl3Z05Dd2dOU3dnTml3Z01URXNJREV5TENBeE15d2dNaklzSURJekxDQXlOQ3dnTWpVc0lESTNLU2tnSlQ0bElGeHVJeUFnSUdSd2JIbHlPanB0ZFhSaGRHVW9ZbWx1VTJsNlpTQTlJR1Z1WkRFZ0xTQnpkR0Z5ZERFc1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhaR3BmYzNSaGNuUXhJRDBnYVdabGJITmxLR0pwYmxOcGVtVWdQVDBnTlRBd01Dd2djM1JoY25ReExGeHVJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9ZbWx1VTJsNlpTQTlQU0F4TURBd01Dd2djM1JoY25ReEt6VXdNREFzWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRHRnlkREVnS3lBeE1EQXdNQ2twTEZ4dUl5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXUnFYMlZ1WkRFZ1BTQmhaR3BmYzNSaGNuUXhJQ3NnTlRBd01DeGNiaU1nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0ZrYWw5emRHRnlkRElnUFNCcFptVnNjMlVvWW1sdVUybDZaU0E5UFNBMU1EQXdMQ0J6ZEdGeWRESXNYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hpYVc1VGFYcGxJRDA5SURFd01EQXdMQ0J6ZEdGeWRESWdLeUExTURBd0xGeHVJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM1JoY25ReUlDc2dNVEF3TURBcEtTeGNiaU1nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0ZrYWw5bGJtUXlJRDBnWVdScVgzTjBZWEowTWlBcklEVXdNREFzWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaGJtTm9iM0l4SUQwZ2NHRnpkR1VvWTJoeWIyMHhMQ0JoWkdwZmMzUmhjblF4TENCaFpHcGZaVzVrTVN3Z2MyVndJRDBnWENKZlhDSXBMRnh1SXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVc1amFHOXlNaUE5SUhCaGMzUmxLR05vY205dE1pd2dZV1JxWDNOMFlYSjBNaXdnWVdScVgyVnVaRElzSUhObGNDQTlJRndpWDF3aUtTbGNibHh1WkdGMFlTNXlaV2NnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhCYm01dk1pQWxhVzRsSUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVmhjSWl3Z1hDSkZMVVZjSWl3Z1hDSkZMVk5jSWl3Z1hDSkZMVmhjSWlrcFhHNWNiaU1qSUVkeVlYQm9YRzRqYVc1emRHRnNiQzV3WVdOcllXZGxjeWhjSW1sbmNtRndhRndpS1Z4dWJHbGljbUZ5ZVNocFozSmhjR2dwWEc1Y2JpTWdWRzhnWW1VZ1lXSnNaU0IwYnlCamIyNXpkSEoxWTNRZ1lTQm5jbUZ3YUN3Z1pXRmphQ0JoYm1Ob2IzSWdibVZsWkNCMGJ5Qm9ZWFpsSUhOaGJXVWdjbVZ6YjJ4MWRHbHZiaTVjYmlNZ1UyaHBibXNnZEdobElITnBlbVVnZEc4Z01UQWdhMkpjYmlNZ1NXWWdkR2hsSUdGdVkyaHZjaUJwY3lBeU5XdGlMQ0JqYUc5dmMyVWdkR2hsSUcxcFpHUnNaU0ExYTJJZ1ltbHVYRzRqSUVsbUlIUm9aU0JoYm1Ob2IzSWdhWE1nTVRCcllpd2dZMmh2YjNObElIUm9aU0JzWldaMElEVnJZaUJpYVc1Y2JseHVaM0poY0dnZ1BDMGdaM0poY0doZlpuSnZiVjlrWVhSaFgyWnlZVzFsS0dSaGRHRXVjbVZuSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dGdVkyaHZjakVzSUdGdVkyaHZjaklwS1Z4dVkyOXRjRzl1Wlc1MGN5QThMU0JqYjIxd2IyNWxiblJ6S0dkeVlYQm9LVnh1WkdGMFlTNXlaV2NrYUhWaUlEd3RJR052YlhCdmJtVnVkSE1rYldWdFltVnljMmhwY0Z0a1lYUmhMbkpsWnlSaGJtTm9iM0l4WFZ4dVhHNTBaVzF3TG1KbFpIQmxJRHd0SUdSaGRHRXVjbVZuSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dOb2NtOXRNU3dnWVdScVgzTjBZWEowTVN3Z1lXUnFYMlZ1WkRFc0lHTm9jbTl0TWl3Z1lXUnFYM04wWVhKME1pd2dZV1JxWDJWdVpESXBYRzVtZDNKcGRHVW9kR1Z0Y0M1aVpXUndaU3dnYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNJbDl5WldkMWJHRjBiM0o1WHpWcllrRmthaTVpWldSd1pWd2lLU2tzSUZ4dUlDQWdJQ0FnSUdOdmJDNXVZVzFsY3lBOUlFWkJURk5GTEhKdmR5NXVZVzFsY3lBOUlFWkJURk5GTENCelpYQWdQU0JjSWx4Y2RGd2lLU0FnWEc1Y2JtaDFZazUxYlNBOExTQmtZWFJoTG5KbFp5QWxQaVVnWjNKdmRYQmZZbmtvYUhWaUtTQWxQaVVnYzNWdGJXRnlhWE5sS0dOdmRXNTBJRDBnYmlncEtWeHVYRzRqSUVoMVlpQnphWHBsSUdScGMzUnlhV0oxZEdsdmJseHVjQ0E4TFNCblozQnNiM1FvYUhWaVRuVnRMQ0JoWlhNb2VDQTlJR052ZFc1MEtTa2dLeUJuWlc5dFgyaHBjM1J2WjNKaGJTaGlhVzUzYVdSMGFDQWdQU0F4S1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklGeHVJQ0J6WTJGc1pWOTVYMnh2WnpFd0tDbGNibHh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z1hDSm9kV0pmYzJsNlpWOWthWE4wY21saWRYUnBiMjR1YzNablhDSXBMQ0JvWldsbmFIUWdQU0F5TENCM2FXUjBhQ0E5SURJcFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVjYm1SaGRHRXVjbVZuSUR3dElHUmhkR0V1Y21WbklDVStKU0JrY0d4NWNqbzZiR1ZtZEY5cWIybHVLR2gxWWs1MWJTd2dZbmtnUFNCY0ltaDFZbHdpS1NCY2JtUmhkR0V1Y21WbklEd3RJR1JoZEdFdWNtVm5JQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLSEJsWVd0SlJDQTlJSEJoYzNSbEtHTm9jbTl0TVN3Z2MzUmhjblF4TENCemRHRnlkRElzSUhObGNDQTlJRndpWDF3aUtTbGNibHh1SXlCRmVIQnZjblJwYm1jZ2NtVm5kV3hoZEc5eWVTQnNiMjl3Y3lCM2FYUm9JSE53WldOcFptbGpJR2gxWWlCemFYcGxYRzUwWlcxd0xtSmxaSEJsSUR3dElHUmhkR0V1Y21WbklDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHTnZkVzUwSUQ0OUlETXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR05vY205dE1Td2dZV1JxWDNOMFlYSjBNU3dnWVdScVgyVnVaREVzSUdOb2NtOXRNaXdnWVdScVgzTjBZWEowTWl3Z1lXUnFYMlZ1WkRJcFhHNW1kM0pwZEdVb2RHVnRjQzVpWldSd1pTd2dhR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOXlaV2QxYkdGMGIzSjVYelZyWWtGa2FsOW9kV0l6TG1KbFpIQmxYQ0lwS1N3Z1hHNGdJQ0FnSUNBZ1kyOXNMbTVoYldWeklEMGdSa0ZNVTBVc2NtOTNMbTVoYldWeklEMGdSa0ZNVTBVc0lITmxjQ0E5SUZ3aVhGeDBYQ0lwSUNCY2JseHVkR1Z0Y0M1aVpXUndaU0E4TFNCa1lYUmhMbkpsWnlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loamIzVnVkQ0ErUFNBMUtTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGphSEp2YlRFc0lHRmthbDl6ZEdGeWRERXNJR0ZrYWw5bGJtUXhMQ0JqYUhKdmJUSXNJR0ZrYWw5emRHRnlkRElzSUdGa2FsOWxibVF5S1Z4dVpuZHlhWFJsS0hSbGJYQXVZbVZrY0dVc0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENKZmNtVm5kV3hoZEc5eWVWODFhMkpCWkdwZmFIVmlOUzVpWldSd1pWd2lLU2tzSUZ4dUlDQWdJQ0FnSUdOdmJDNXVZVzFsY3lBOUlFWkJURk5GTEhKdmR5NXVZVzFsY3lBOUlFWkJURk5GTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1WEc1MFpXMXdMbUpsWkhCbElEd3RJR1JoZEdFdWNtVm5JQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR052ZFc1MElENDlJREV3S1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoamFISnZiVEVzSUdGa2FsOXpkR0Z5ZERFc0lHRmthbDlsYm1ReExDQmphSEp2YlRJc0lHRmthbDl6ZEdGeWRESXNJR0ZrYWw5bGJtUXlLVnh1Wm5keWFYUmxLSFJsYlhBdVltVmtjR1VzSUdobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYQ0pmY21WbmRXeGhkRzl5ZVY4MWEySkJaR3BmYUhWaU1UQXVZbVZrY0dWY0lpa3BMQ0JjYmlBZ0lDQWdJQ0JqYjJ3dWJtRnRaWE1nUFNCR1FVeFRSU3h5YjNjdWJtRnRaWE1nUFNCR1FVeFRSU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNibHh1WEc0aklFRmtaR2x1WnlCblpXNWxJR0Z1Ym05MFlYUnBiMjRnZEc4Z2FIVmljMXh1WjJWdVpWQmxZV3RRWVdseUlEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNod1pXRnJTVVFnUFNCd1lYTjBaU2hqYUhKdmJURXNJSE4wWVhKME1Td2djM1JoY25ReUxDQnpaWEFnUFNCY0lsOWNJaWtwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hCbFlXdEpSQ3dnWjJWdVpTbGNibVJoZEdFdWNtVm5JRHd0SUdSaGRHRXVjbVZuSUNVK0pTQmtjR3g1Y2pvNmJHVm1kRjlxYjJsdUtHZGxibVZRWldGclVHRnBjaXdnWW5rZ1BTQmNJbkJsWVd0SlJGd2lLVnh1WEc0aklFUjFjbWx1WnlCMWJtNWxjM1JwYm1jc0lFVXRUaUJzYjI5d2N5QjNhWFJvYjNWMElHZGxibVVnWVc1dWIzUmhkR1ZrSUdGeVpTQnlaVzF2ZG1Wa1hHNWtZWFJoTG5KbFp5QThMU0JrWVhSaExuSmxaeUFsUGlVZ2RXNXVaWE4wS0dkbGJtVXBJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNCbmNtOTFjQ0E5SUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0RFc0lGd2laM0p2ZFhBeFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjRElzSUZ3aVozSnZkWEF5WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVXVaM0p2ZFhBekxDQmNJbWR5YjNWd00xd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNEUXNJRndpWjNKdmRYQTBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNEVXNJRndpWjNKdmRYQTFYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVXVaM0p2ZFhBMkxDQmNJbWR5YjNWd05sd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjRGNzSUZ3aVozSnZkWEEzWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0Rnc0lGd2laM0p2ZFhBNFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUdkbGJtVXVaM0p2ZFhBNUxDQmNJbWR5YjNWd09Wd2lMQ0JPUVNrcEtTa3BLU2twS1Z4dUtWeHVYRzVjYm5SbGJYQWdQQzBnWkdGMFlTNXlaV2NnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjJWdVpTd2dhSFZpTENCamIzVnVkQ3dnWjNKdmRYQXBJQ1UrSlZ4dUlDQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVWdjMnhwWTJWZmJXRjRLR052ZFc1MExDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdKV2x1SlNCaktGd2laM0p2ZFhBeFhDSXNJRndpWjNKdmRYQXlYQ0lzSUZ3aVozSnZkWEExWENJc0lGd2laM0p2ZFhBNFhDSXBLVnh1WEc1Y2JpTWdWRVZOVUNCVFZFRlNWRnh1SXlCVVJVMVFJRk5VUVZKVVhHNW5aVzVsVEdsemRDNW5jbTkxY0RFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3TVM1MGMzWmNJaWtwWEc1blpXNWxUR2x6ZEM1bmNtOTFjREV1ZEdWdGNDQThMU0JuWlc1bFRHbHpkQzVuY205MWNERWdKVDRsSUdSd2JIbHlPanBzWldaMFgycHZhVzRvZEdWdGNDd2dZbmtnUFNCaktGd2laMlZ1WlZ3aUtTbGNiaU1nVkVWTlVDQkZUa1JjYmx4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNU2tnS1NSamIzVnVkRnh1SUNCa2FYTjBZVzVqWlRJZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQxbmNtOTFjRElwSUNra1kyOTFiblJjYmlBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SUNCeVpYUjFjbTRvZDJsc0pIQXVkbUZzZFdVcFhHNTlYRzVjYmx4dWNIWXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEJUZFcwc1hDSm5jbTkxY0RGY0lpd2dYQ0puY205MWNESmNJaWtzSURVcFhHNXdkakUxSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0ZOMWJTeGNJbWR5YjNWd01Wd2lMQ0JjSW1keWIzVndOVndpS1N3Z05TbGNibkIyTVRnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd1UzVnRMRndpWjNKdmRYQXhYQ0lzSUZ3aVozSnZkWEE0WENJcExDQTFLVnh1Y0hZeU5TQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlRkVzBzWENKbmNtOTFjREpjSWl3Z1hDSm5jbTkxY0RWY0lpa3NJRFVwWEc1d2RqSTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRk4xYlN4Y0ltZHliM1Z3TWx3aUxDQmNJbWR5YjNWd09Gd2lLU3dnTlNsY2JuQjJOVGdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VTNWdExGd2laM0p2ZFhBMVhDSXNJRndpWjNKdmRYQTRYQ0lwTENBMUtWeHVYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCamIzVnVkQ3dnWm1sc2JDQTlJR2R5YjNWd0tTa2dLeUJjYmlBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzQxTENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDc2dYRzRnSUNBZ2MyTmhiR1ZmZVY5amIyNTBhVzUxYjNWektHSnlaV0ZyY3lBOUlITmxjU2d3TENBek1Dd2dZbmtnUFNBMUtTd2diR2x0YVhSeklEMGdZeWd3TENBek1Da3BJQ3NnWEc1Y2JpQWdjM1JoZEY5emRXMXRZWEo1S0dGbGN5aG5jbTkxY0NBOUlHZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpd2daMlZ2YlNBOUlGd2ljRzlwYm5SY0lpd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJRElzSUdacGJHd2dQU0JjSW5KbFpGd2lMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaWtnSUN0Y2JpQWdZVzV1YjNSaGRHVW9YQ0owWlhoMFhDSXNJSGdnUFNBeExDQjVJRDBnTXl3Z2JHRmlaV3dnUFNCd1lYTjBaVEFvWENKd2RqRXlPaUJjSWl3Z2NIWXhNaXdnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSFl4TlRvZ1hDSXNJSEIyTVRVc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5CMk1UZzZJRndpTENCd2RqRTRMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndkakkxT2lCY0lpd2djSFl5TlN3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hZeU9Eb2dYQ0lzSUhCMk1qZ3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQjJOVGc2SUZ3aUxDQndkalU0TENCY0lseGNibHdpS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F4S1NBcklDQjBhR1Z0WlNoc1pXZGxibVF1Y0c5emFYUnBiMjRnUFNCY0ltNXZibVZjSWlsY2JseHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKamIzVnVkRWgxWWw5aVlYSndiRzkwWDJScFptWkhjbTkxY0Y5a1ZFRkhYM1p6WDBSTlUwOWNJaWxjYm1obGFXZG9kQ0E4TFNBelhHNTNhV1IwYUNBOExTQXpYRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWNibHh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG4jIElNUE9SVElORyBHRU5FIEFOTk8gREFUQSBGT1IgUC1OIExPT1BTXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYsIDExLCAxMiwgMTMsIDIyLCAyMywgMjQsIDI1LCAyNywgMjgpKVxuXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2LCAxMSwgMTIsIDEzLCAyMiwgMjMsIDI0LCAyNSwgMjcpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICBhZGpfc3RhcnQxID0gaWZlbHNlKGJpblNpemUgPT0gNTAwMCwgc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGJpblNpemUgPT0gMTAwMDAsIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDEgKyAxMDAwMCkpLFxuICAgICAgICAgICAgICAgIGFkal9lbmQxID0gYWRqX3N0YXJ0MSArIDUwMDAsXG4gICAgICAgICAgICAgICAgYWRqX3N0YXJ0MiA9IGlmZWxzZShiaW5TaXplID09IDUwMDAsIHN0YXJ0MixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShiaW5TaXplID09IDEwMDAwLCBzdGFydDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQyICsgMTAwMDApKSxcbiAgICAgICAgICAgICAgICBhZGpfZW5kMiA9IGFkal9zdGFydDIgKyA1MDAwLFxuICAgICAgICAgICAgICAgIGFuY2hvcjEgPSBwYXN0ZShjaHJvbTEsIGFkal9zdGFydDEsIGFkal9lbmQxLCBzZXAgPSBcXF9cXCksXG4gICAgICAgICAgICAgICAgYW5jaG9yMiA9IHBhc3RlKGNocm9tMiwgYWRqX3N0YXJ0MiwgYWRqX2VuZDIsIHNlcCA9IFxcX1xcKSlcblxuIyBkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2LCAxMSwgMTIsIDEzLCAyMiwgMjMsIDI0LCAyNSwgMjcpKSAlPiUgXG4jICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiMgICAgICAgICAgICAgICAgIGFkal9zdGFydDEgPSBpZmVsc2UoYmluU2l6ZSA9PSA1MDAwLCBzdGFydDEsXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShiaW5TaXplID09IDEwMDAwLCBzdGFydDErNTAwMCxcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0MSArIDEwMDAwKSksXG4jICAgICAgICAgICAgICAgICBhZGpfZW5kMSA9IGFkal9zdGFydDEgKyA1MDAwLFxuIyAgICAgICAgICAgICAgICAgYWRqX3N0YXJ0MiA9IGlmZWxzZShiaW5TaXplID09IDUwMDAsIHN0YXJ0MixcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGJpblNpemUgPT0gMTAwMDAsIHN0YXJ0MiArIDUwMDAsXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDIgKyAxMDAwMCkpLFxuIyAgICAgICAgICAgICAgICAgYWRqX2VuZDIgPSBhZGpfc3RhcnQyICsgNTAwMCxcbiMgICAgICAgICAgICAgICAgIGFuY2hvcjEgPSBwYXN0ZShjaHJvbTEsIGFkal9zdGFydDEsIGFkal9lbmQxLCBzZXAgPSBcXF9cXCksXG4jICAgICAgICAgICAgICAgICBhbmNob3IyID0gcGFzdGUoY2hyb20yLCBhZGpfc3RhcnQyLCBhZGpfZW5kMiwgc2VwID0gXFxfXFwpKVxuXG5kYXRhLnJlZyA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLCBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcKSlcblxuIyMgR3JhcGhcbiNpbnN0YWxsLnBhY2thZ2VzKFxcaWdyYXBoXFwpXG5saWJyYXJ5KGlncmFwaClcblxuIyBUbyBiZSBhYmxlIHRvIGNvbnN0cnVjdCBhIGdyYXBoLCBlYWNoIGFuY2hvciBuZWVkIHRvIGhhdmUgc2FtZSByZXNvbHV0aW9uLlxuIyBTaGluayB0aGUgc2l6ZSB0byAxMCBrYlxuIyBJZiB0aGUgYW5jaG9yIGlzIDI1a2IsIGNob29zZSB0aGUgbWlkZGxlIDVrYiBiaW5cbiMgSWYgdGhlIGFuY2hvciBpcyAxMGtiLCBjaG9vc2UgdGhlIGxlZnQgNWtiIGJpblxuXG5ncmFwaCA8LSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoZGF0YS5yZWcgJT4lIGRwbHlyOjpzZWxlY3QoYW5jaG9yMSwgYW5jaG9yMikpXG5jb21wb25lbnRzIDwtIGNvbXBvbmVudHMoZ3JhcGgpXG5kYXRhLnJlZyRodWIgPC0gY29tcG9uZW50cyRtZW1iZXJzaGlwW2RhdGEucmVnJGFuY2hvcjFdXG5cbnRlbXAuYmVkcGUgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBhZGpfc3RhcnQxLCBhZGpfZW5kMSwgY2hyb20yLCBhZGpfc3RhcnQyLCBhZGpfZW5kMilcbmZ3cml0ZSh0ZW1wLmJlZHBlLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3JlZ3VsYXRvcnlfNWtiQWRqLmJlZHBlXFwpKSwgXG4gICAgICAgY29sLm5hbWVzID0gRkFMU0Uscm93Lm5hbWVzID0gRkFMU0UsIHNlcCA9IFxcXFx0XFwpICBcblxuaHViTnVtIDwtIGRhdGEucmVnICU+JSBncm91cF9ieShodWIpICU+JSBzdW1tYXJpc2UoY291bnQgPSBuKCkpXG5cbiMgSHViIHNpemUgZGlzdHJpYnV0aW9uXG5wIDwtIGdncGxvdChodWJOdW0sIGFlcyh4ID0gY291bnQpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoICA9IDEpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIHNjYWxlX3lfbG9nMTAoKVxuXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBcXGh1Yl9zaXplX2Rpc3RyaWJ1dGlvbi5zdmdcXCksIGhlaWdodCA9IDIsIHdpZHRoID0gMilcbnByaW50KHApXG5kZXYub2ZmKClcblxuZGF0YS5yZWcgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oaHViTnVtLCBieSA9IFxcaHViXFwpIFxuZGF0YS5yZWcgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjptdXRhdGUocGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKVxuXG4jIEV4cG9ydGluZyByZWd1bGF0b3J5IGxvb3BzIHdpdGggc3BlY2lmaWMgaHViIHNpemVcbnRlbXAuYmVkcGUgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjpmaWx0ZXIoY291bnQgPj0gMykgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBhZGpfc3RhcnQxLCBhZGpfZW5kMSwgY2hyb20yLCBhZGpfc3RhcnQyLCBhZGpfZW5kMilcbmZ3cml0ZSh0ZW1wLmJlZHBlLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3JlZ3VsYXRvcnlfNWtiQWRqX2h1YjMuYmVkcGVcXCkpLCBcbiAgICAgICBjb2wubmFtZXMgPSBGQUxTRSxyb3cubmFtZXMgPSBGQUxTRSwgc2VwID0gXFxcXHRcXCkgIFxuXG50ZW1wLmJlZHBlIDwtIGRhdGEucmVnICU+JSBkcGx5cjo6ZmlsdGVyKGNvdW50ID49IDUpICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgYWRqX3N0YXJ0MSwgYWRqX2VuZDEsIGNocm9tMiwgYWRqX3N0YXJ0MiwgYWRqX2VuZDIpXG5md3JpdGUodGVtcC5iZWRwZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9yZWd1bGF0b3J5XzVrYkFkal9odWI1LmJlZHBlXFwpKSwgXG4gICAgICAgY29sLm5hbWVzID0gRkFMU0Uscm93Lm5hbWVzID0gRkFMU0UsIHNlcCA9IFxcXFx0XFwpXG5cbnRlbXAuYmVkcGUgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjpmaWx0ZXIoY291bnQgPj0gMTApICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgYWRqX3N0YXJ0MSwgYWRqX2VuZDEsIGNocm9tMiwgYWRqX3N0YXJ0MiwgYWRqX2VuZDIpXG5md3JpdGUodGVtcC5iZWRwZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9yZWd1bGF0b3J5XzVrYkFkal9odWIxMC5iZWRwZVxcKSksIFxuICAgICAgIGNvbC5uYW1lcyA9IEZBTFNFLHJvdy5uYW1lcyA9IEZBTFNFLCBzZXAgPSBcXFxcdFxcKVxuXG5cbiMgQWRkaW5nIGdlbmUgYW5ub3RhdGlvbiB0byBodWJzXG5nZW5lUGVha1BhaXIgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6bXV0YXRlKHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSkgJT4lIGRwbHlyOjpzZWxlY3QocGVha0lELCBnZW5lKVxuZGF0YS5yZWcgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZVBlYWtQYWlyLCBieSA9IFxccGVha0lEXFwpXG5cbiMgRHVyaW5nIHVubmVzdGluZywgRS1OIGxvb3BzIHdpdGhvdXQgZ2VuZSBhbm5vdGF0ZWQgYXJlIHJlbW92ZWRcbmRhdGEucmVnIDwtIGRhdGEucmVnICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMiwgXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDMsIFxcZ3JvdXAzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNCwgXFxncm91cDRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNSwgXFxncm91cDVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDYsIFxcZ3JvdXA2XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNywgXFxncm91cDdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwOCwgXFxncm91cDhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDksIFxcZ3JvdXA5XFwsIE5BKSkpKSkpKSkpXG4pXG5cblxudGVtcCA8LSBkYXRhLnJlZyAlPiUgZHBseXI6OnNlbGVjdChnZW5lLCBodWIsIGNvdW50LCBncm91cCkgJT4lXG4gIGdyb3VwX2J5KGdlbmUpICU+JSBzbGljZV9tYXgoY291bnQsIHdpdGhfdGllcyA9IEZBTFNFKSAlPiVcbiAgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxncm91cDFcXCwgXFxncm91cDJcXCwgXFxncm91cDVcXCwgXFxncm91cDhcXCkpXG5cblxuIyBURU1QIFNUQVJUXG4jIFRFTVAgU1RBUlRcbmdlbmVMaXN0Lmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdlxcKSlcbmdlbmVMaXN0Lmdyb3VwMS50ZW1wIDwtIGdlbmVMaXN0Lmdyb3VwMSAlPiUgZHBseXI6OmxlZnRfam9pbih0ZW1wLCBieSA9IGMoXFxnZW5lXFwpKVxuIyBURU1QIEVORFxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGNvdW50XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRjb3VudFxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG5wdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDMwLCBieSA9IDUpLCBsaW1pdHMgPSBjKDAsIDMwKSkgKyBcblxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpICsgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcKVxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGNvdW50SHViX2JhcnBsb3RfZGlmZkdyb3VwX2RUQUdfdnNfRE1TT1xcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# IMPORTING GENE ANNO DATA FOR P-N LOOPS
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                 diffCutoff = 0.2,
                                 annoList = c(\P-P\, \P-E\, \P-S\, \P-X\)) %>% dplyr::select(c(1, 2, 3, 4, 5, 6, 11, 12, 13, 22, 23, 24, 25, 27, 28))

data <- fread(here(consensusDir, paste0(name, \.tsv\))) %>% dplyr::select(c(1, 2, 3, 4, 5, 6, 11, 12, 13, 22, 23, 24, 25, 27)) %>%
  dplyr::mutate(binSize = end1 - start1,
                adj_start1 = ifelse(binSize == 5000, start1,
                                    ifelse(binSize == 10000, start1,
                                           start1 + 10000)),
                adj_end1 = adj_start1 + 5000,
                adj_start2 = ifelse(binSize == 5000, start2,
                                    ifelse(binSize == 10000, start2,
                                           start2 + 10000)),
                adj_end2 = adj_start2 + 5000,
                anchor1 = paste(chrom1, adj_start1, adj_end1, sep = \_\),
                anchor2 = paste(chrom2, adj_start2, adj_end2, sep = \_\))

# data <- fread(here(consensusDir, paste0(name, \.tsv\))) %>% dplyr::select(c(1, 2, 3, 4, 5, 6, 11, 12, 13, 22, 23, 24, 25, 27)) %>% 
#   dplyr::mutate(binSize = end1 - start1,
#                 adj_start1 = ifelse(binSize == 5000, start1,
#                                     ifelse(binSize == 10000, start1+5000,
#                                            start1 + 10000)),
#                 adj_end1 = adj_start1 + 5000,
#                 adj_start2 = ifelse(binSize == 5000, start2,
#                                     ifelse(binSize == 10000, start2 + 5000,
#                                            start2 + 10000)),
#                 adj_end2 = adj_start2 + 5000,
#                 anchor1 = paste(chrom1, adj_start1, adj_end1, sep = \_\),
#                 anchor2 = paste(chrom2, adj_start2, adj_end2, sep = \_\))

data.reg <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \P-S\, \P-X\, \E-E\, \E-S\, \E-X\))

## Graph
#install.packages(\igraph\)
library(igraph)

# To be able to construct a graph, each anchor need to have same resolution.
# Shink the size to 10 kb
# If the anchor is 25kb, choose the middle 5kb bin
# If the anchor is 10kb, choose the left 5kb bin

graph <- graph_from_data_frame(data.reg %>% dplyr::select(anchor1, anchor2))
components <- components(graph)
data.reg$hub <- components$membership[data.reg$anchor1]

temp.bedpe <- data.reg %>% dplyr::select(chrom1, adj_start1, adj_end1, chrom2, adj_start2, adj_end2)
fwrite(temp.bedpe, here(consensusDir, paste0(name, \_regulatory_5kbAdj.bedpe\)), 
       col.names = FALSE,row.names = FALSE, sep = \\t\)  

hubNum <- data.reg %>% group_by(hub) %>% summarise(count = n())

# Hub size distribution
p <- ggplot(hubNum, aes(x = count)) + geom_histogram(binwidth  = 1) + theme_classic() + 
  scale_y_log10()

svglite(here(figDir, \hub_size_distribution.svg\), height = 2, width = 2)
print(p)
dev.off()

data.reg <- data.reg %>% dplyr::left_join(hubNum, by = \hub\) 
data.reg <- data.reg %>% dplyr::mutate(peakID = paste(chrom1, start1, start2, sep = \_\))

# Exporting regulatory loops with specific hub size
temp.bedpe <- data.reg %>% dplyr::filter(count >= 3) %>% dplyr::select(chrom1, adj_start1, adj_end1, chrom2, adj_start2, adj_end2)
fwrite(temp.bedpe, here(consensusDir, paste0(name, \_regulatory_5kbAdj_hub3.bedpe\)), 
       col.names = FALSE,row.names = FALSE, sep = \\t\)  

temp.bedpe <- data.reg %>% dplyr::filter(count >= 5) %>% dplyr::select(chrom1, adj_start1, adj_end1, chrom2, adj_start2, adj_end2)
fwrite(temp.bedpe, here(consensusDir, paste0(name, \_regulatory_5kbAdj_hub5.bedpe\)), 
       col.names = FALSE,row.names = FALSE, sep = \\t\)

temp.bedpe <- data.reg %>% dplyr::filter(count >= 10) %>% dplyr::select(chrom1, adj_start1, adj_end1, chrom2, adj_start2, adj_end2)
fwrite(temp.bedpe, here(consensusDir, paste0(name, \_regulatory_5kbAdj_hub10.bedpe\)), 
       col.names = FALSE,row.names = FALSE, sep = \\t\)


# Adding gene annotation to hubs
genePeakPair <- geneAnnoData %>% dplyr::mutate(peakID = paste(chrom1, start1, start2, sep = \_\)) %>% dplyr::select(peakID, gene)
data.reg <- data.reg %>% dplyr::left_join(genePeakPair, by = \peakID\)

# During unnesting, E-N loops without gene annotated are removed
data.reg <- data.reg %>% unnest(gene) %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\,
                        ifelse(gene %in% gene.group3, \group3\,
                               ifelse(gene %in% gene.group4, \group4\,
                                      ifelse(gene %in% gene.group5, \group5\,
                                             ifelse(gene %in% gene.group6, \group6\,
                                                    ifelse(gene %in% gene.group7, \group7\,
                                                           ifelse(gene %in% gene.group8, \group8\,
                                                                  ifelse(gene %in% gene.group9, \group9\, NA)))))))))
)


temp <- data.reg %>% dplyr::select(gene, hub, count, group) %>%
  group_by(gene) %>% slice_max(count, with_ties = FALSE) %>%
  dplyr::filter(group %in% c(\group1\, \group2\, \group5\, \group8\))


# TEMP START
# TEMP START
geneList.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))
geneList.group1.temp <- geneList.group1 %>% dplyr::left_join(temp, by = c(\gene\))
# TEMP END

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$count
  distance2 <- (data %>% dplyr::filter(group ==group2) )$count
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


pv12 <- round(getPvalWilcox(tempSum,\group1\, \group2\), 5)
pv15 <- round(getPvalWilcox(tempSum,\group1\, \group5\), 5)
pv18 <- round(getPvalWilcox(tempSum,\group1\, \group8\), 5)
pv25 <- round(getPvalWilcox(tempSum,\group2\, \group5\), 5)
pv28 <- round(getPvalWilcox(tempSum,\group2\, \group8\), 5)
pv58 <- round(getPvalWilcox(tempSum,\group5\, \group8\), 5)


p <- ggplot(temp, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() + 
    scale_y_continuous(breaks = seq(0, 30, by = 5), limits = c(0, 30)) + 

  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
                                                \pv15: \, pv15, \\n\,
                                                \pv18: \, pv18, \\n\,
                                                \pv25: \, pv25, \\n\,
                                                \pv28: \, pv28, \\n\,
                                                \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 1) +  theme(legend.position = \none\)


fileName <- paste0(\countHub_barplot_diffGroup_dTAG_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkpUVkJQVWxSSlRrY2dSMFZPUlNCQlRrNVBJRVJCVkVFZ1JrOVNJRkF0VGlCTVQwOVFVMXh1Ym1GdFpTQThMU0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjWEZ4dVhHNW5aVzVsUVc1dWIwUmhkR0VnUEMwZ2JHOWhaRXh2YjNCQmJtNXZSR0YwWVNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDNBdGJsOWxibk5sYldKc1RHbHpkQzUwYzNaY1hDa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2xtWmtOMWRHOW1aaUE5SURBdU1peGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnVibTlNYVhOMElEMGdZeWhjWEZBdFVGeGNMQ0JjWEZBdFJWeGNMQ0JjWEZBdFUxeGNMQ0JjWEZBdFdGeGNLU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWXlneExDQXlMQ0F6TENBMExDQTFMQ0EyTENBeE1Td2dNVElzSURFekxDQXlNaXdnTWpNc0lESTBMQ0F5TlN3Z01qY3NJREk0S1NsY2JseHVaR0YwWVNBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjTG5SemRseGNLU2twSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dNb01Td2dNaXdnTXl3Z05Dd2dOU3dnTml3Z01URXNJREV5TENBeE15d2dNaklzSURJekxDQXlOQ3dnTWpVc0lESTNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ltbHVVMmw2WlNBOUlHVnVaREVnTFNCemRHRnlkREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVdScVgzTjBZWEowTVNBOUlHbG1aV3h6WlNoaWFXNVRhWHBsSUQwOUlEVXdNREFzSUhOMFlYSjBNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hpYVc1VGFYcGxJRDA5SURFd01EQXdMQ0J6ZEdGeWRERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM1JoY25ReElDc2dNVEF3TURBcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhaR3BmWlc1a01TQTlJR0ZrYWw5emRHRnlkREVnS3lBMU1EQXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0ZrYWw5emRHRnlkRElnUFNCcFptVnNjMlVvWW1sdVUybDZaU0E5UFNBMU1EQXdMQ0J6ZEdGeWRESXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9ZbWx1VTJsNlpTQTlQU0F4TURBd01Dd2djM1JoY25ReUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITjBZWEowTWlBcklERXdNREF3S1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXUnFYMlZ1WkRJZ1BTQmhaR3BmYzNSaGNuUXlJQ3NnTlRBd01DeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhibU5vYjNJeElEMGdjR0Z6ZEdVb1kyaHliMjB4TENCaFpHcGZjM1JoY25ReExDQmhaR3BmWlc1a01Td2djMlZ3SUQwZ1hGeGZYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGdVkyaHZjaklnUFNCd1lYTjBaU2hqYUhKdmJUSXNJR0ZrYWw5emRHRnlkRElzSUdGa2FsOWxibVF5TENCelpYQWdQU0JjWEY5Y1hDa3BYRzVjYmlNZ1pHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNMblJ6ZGx4Y0tTa3BJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR01vTVN3Z01pd2dNeXdnTkN3Z05Td2dOaXdnTVRFc0lERXlMQ0F4TXl3Z01qSXNJREl6TENBeU5Dd2dNalVzSURJM0tTa2dKVDRsSUZ4dUl5QWdJR1J3YkhseU9qcHRkWFJoZEdVb1ltbHVVMmw2WlNBOUlHVnVaREVnTFNCemRHRnlkREVzWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaFpHcGZjM1JoY25ReElEMGdhV1psYkhObEtHSnBibE5wZW1VZ1BUMGdOVEF3TUN3Z2MzUmhjblF4TEZ4dUl5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1ltbHVVMmw2WlNBOVBTQXhNREF3TUN3Z2MzUmhjblF4S3pVd01EQXNYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZEdGeWRERWdLeUF4TURBd01Da3BMRnh1SXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVdScVgyVnVaREVnUFNCaFpHcGZjM1JoY25ReElDc2dOVEF3TUN4Y2JpTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRmthbDl6ZEdGeWRESWdQU0JwWm1Wc2MyVW9ZbWx1VTJsNlpTQTlQU0ExTURBd0xDQnpkR0Z5ZERJc1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGlhVzVUYVhwbElEMDlJREV3TURBd0xDQnpkR0Z5ZERJZ0t5QTFNREF3TEZ4dUl5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzUmhjblF5SUNzZ01UQXdNREFwS1N4Y2JpTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRmthbDlsYm1ReUlEMGdZV1JxWDNOMFlYSjBNaUFySURVd01EQXNYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm1Ob2IzSXhJRDBnY0dGemRHVW9ZMmh5YjIweExDQmhaR3BmYzNSaGNuUXhMQ0JoWkdwZlpXNWtNU3dnYzJWd0lEMGdYRnhmWEZ3cExGeHVJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZVzVqYUc5eU1pQTlJSEJoYzNSbEtHTm9jbTl0TWl3Z1lXUnFYM04wWVhKME1pd2dZV1JxWDJWdVpESXNJSE5sY0NBOUlGeGNYMXhjS1NsY2JseHVaR0YwWVM1eVpXY2dQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWaGNYQ3dnWEZ4RkxVVmNYQ3dnWEZ4RkxWTmNYQ3dnWEZ4RkxWaGNYQ2twWEc1Y2JpTWpJRWR5WVhCb1hHNGphVzV6ZEdGc2JDNXdZV05yWVdkbGN5aGNYR2xuY21Gd2FGeGNLVnh1YkdsaWNtRnllU2hwWjNKaGNHZ3BYRzVjYmlNZ1ZHOGdZbVVnWVdKc1pTQjBieUJqYjI1emRISjFZM1FnWVNCbmNtRndhQ3dnWldGamFDQmhibU5vYjNJZ2JtVmxaQ0IwYnlCb1lYWmxJSE5oYldVZ2NtVnpiMngxZEdsdmJpNWNiaU1nVTJocGJtc2dkR2hsSUhOcGVtVWdkRzhnTVRBZ2EySmNiaU1nU1dZZ2RHaGxJR0Z1WTJodmNpQnBjeUF5Tld0aUxDQmphRzl2YzJVZ2RHaGxJRzFwWkdSc1pTQTFhMklnWW1sdVhHNGpJRWxtSUhSb1pTQmhibU5vYjNJZ2FYTWdNVEJyWWl3Z1kyaHZiM05sSUhSb1pTQnNaV1owSURWcllpQmlhVzVjYmx4dVozSmhjR2dnUEMwZ1ozSmhjR2hmWm5KdmJWOWtZWFJoWDJaeVlXMWxLR1JoZEdFdWNtVm5JQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR0Z1WTJodmNqRXNJR0Z1WTJodmNqSXBLVnh1WTI5dGNHOXVaVzUwY3lBOExTQmpiMjF3YjI1bGJuUnpLR2R5WVhCb0tWeHVaR0YwWVM1eVpXY2thSFZpSUR3dElHTnZiWEJ2Ym1WdWRITWtiV1Z0WW1WeWMyaHBjRnRrWVhSaExuSmxaeVJoYm1Ob2IzSXhYVnh1WEc1MFpXMXdMbUpsWkhCbElEd3RJR1JoZEdFdWNtVm5JQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR05vY205dE1Td2dZV1JxWDNOMFlYSjBNU3dnWVdScVgyVnVaREVzSUdOb2NtOXRNaXdnWVdScVgzTjBZWEowTWl3Z1lXUnFYMlZ1WkRJcFhHNW1kM0pwZEdVb2RHVnRjQzVpWldSd1pTd2dhR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY1hGOXlaV2QxYkdGMGIzSjVYelZyWWtGa2FpNWlaV1J3WlZ4Y0tTa3NJRnh1SUNBZ0lDQWdJR052YkM1dVlXMWxjeUE5SUVaQlRGTkZMSEp2ZHk1dVlXMWxjeUE5SUVaQlRGTkZMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tTQWdYRzVjYm1oMVlrNTFiU0E4TFNCa1lYUmhMbkpsWnlBbFBpVWdaM0p2ZFhCZllua29hSFZpS1NBbFBpVWdjM1Z0YldGeWFYTmxLR052ZFc1MElEMGdiaWdwS1Z4dVhHNGpJRWgxWWlCemFYcGxJR1JwYzNSeWFXSjFkR2x2Ymx4dWNDQThMU0JuWjNCc2IzUW9hSFZpVG5WdExDQmhaWE1vZUNBOUlHTnZkVzUwS1NrZ0t5Qm5aVzl0WDJocGMzUnZaM0poYlNoaWFXNTNhV1IwYUNBZ1BTQXhLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQnpZMkZzWlY5NVgyeHZaekV3S0NsY2JseHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnWEZ4b2RXSmZjMmw2WlY5a2FYTjBjbWxpZFhScGIyNHVjM1puWEZ3cExDQm9aV2xuYUhRZ1BTQXlMQ0IzYVdSMGFDQTlJRElwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWNibVJoZEdFdWNtVm5JRHd0SUdSaGRHRXVjbVZuSUNVK0pTQmtjR3g1Y2pvNmJHVm1kRjlxYjJsdUtHaDFZazUxYlN3Z1lua2dQU0JjWEdoMVlseGNLU0JjYm1SaGRHRXVjbVZuSUR3dElHUmhkR0V1Y21WbklDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtIQmxZV3RKUkNBOUlIQmhjM1JsS0dOb2NtOXRNU3dnYzNSaGNuUXhMQ0J6ZEdGeWRESXNJSE5sY0NBOUlGeGNYMXhjS1NsY2JseHVJeUJGZUhCdmNuUnBibWNnY21WbmRXeGhkRzl5ZVNCc2IyOXdjeUIzYVhSb0lITndaV05wWm1saklHaDFZaUJ6YVhwbFhHNTBaVzF3TG1KbFpIQmxJRHd0SUdSaGRHRXVjbVZuSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dOdmRXNTBJRDQ5SURNcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHTm9jbTl0TVN3Z1lXUnFYM04wWVhKME1Td2dZV1JxWDJWdVpERXNJR05vY205dE1pd2dZV1JxWDNOMFlYSjBNaXdnWVdScVgyVnVaRElwWEc1bWQzSnBkR1VvZEdWdGNDNWlaV1J3WlN3Z2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5eVpXZDFiR0YwYjNKNVh6VnJZa0ZrYWw5b2RXSXpMbUpsWkhCbFhGd3BLU3dnWEc0Z0lDQWdJQ0FnWTI5c0xtNWhiV1Z6SUQwZ1JrRk1VMFVzY205M0xtNWhiV1Z6SUQwZ1JrRk1VMFVzSUhObGNDQTlJRnhjWEZ4MFhGd3BJQ0JjYmx4dWRHVnRjQzVpWldSd1pTQThMU0JrWVhSaExuSmxaeUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhqYjNWdWRDQStQU0ExS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoamFISnZiVEVzSUdGa2FsOXpkR0Z5ZERFc0lHRmthbDlsYm1ReExDQmphSEp2YlRJc0lHRmthbDl6ZEdGeWRESXNJR0ZrYWw5bGJtUXlLVnh1Wm5keWFYUmxLSFJsYlhBdVltVmtjR1VzSUdobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnhmY21WbmRXeGhkRzl5ZVY4MWEySkJaR3BmYUhWaU5TNWlaV1J3WlZ4Y0tTa3NJRnh1SUNBZ0lDQWdJR052YkM1dVlXMWxjeUE5SUVaQlRGTkZMSEp2ZHk1dVlXMWxjeUE5SUVaQlRGTkZMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVYRzUwWlcxd0xtSmxaSEJsSUR3dElHUmhkR0V1Y21WbklDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHTnZkVzUwSUQ0OUlERXdLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hqYUhKdmJURXNJR0ZrYWw5emRHRnlkREVzSUdGa2FsOWxibVF4TENCamFISnZiVElzSUdGa2FsOXpkR0Z5ZERJc0lHRmthbDlsYm1ReUtWeHVabmR5YVhSbEtIUmxiWEF1WW1Wa2NHVXNJR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hGeGZjbVZuZFd4aGRHOXllVjgxYTJKQlpHcGZhSFZpTVRBdVltVmtjR1ZjWENrcExDQmNiaUFnSUNBZ0lDQmpiMnd1Ym1GdFpYTWdQU0JHUVV4VFJTeHliM2N1Ym1GdFpYTWdQU0JHUVV4VFJTd2djMlZ3SUQwZ1hGeGNYSFJjWENsY2JseHVYRzRqSUVGa1pHbHVaeUJuWlc1bElHRnVibTkwWVhScGIyNGdkRzhnYUhWaWMxeHVaMlZ1WlZCbFlXdFFZV2x5SUR3dElHZGxibVZCYm01dlJHRjBZU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2h3WldGclNVUWdQU0J3WVhOMFpTaGphSEp2YlRFc0lITjBZWEowTVN3Z2MzUmhjblF5TENCelpYQWdQU0JjWEY5Y1hDa3BJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSEJsWVd0SlJDd2daMlZ1WlNsY2JtUmhkR0V1Y21WbklEd3RJR1JoZEdFdWNtVm5JQ1UrSlNCa2NHeDVjam82YkdWbWRGOXFiMmx1S0dkbGJtVlFaV0ZyVUdGcGNpd2dZbmtnUFNCY1hIQmxZV3RKUkZ4Y0tWeHVYRzRqSUVSMWNtbHVaeUIxYm01bGMzUnBibWNzSUVVdFRpQnNiMjl3Y3lCM2FYUm9iM1YwSUdkbGJtVWdZVzV1YjNSaGRHVmtJR0Z5WlNCeVpXMXZkbVZrWEc1a1lYUmhMbkpsWnlBOExTQmtZWFJoTG5KbFp5QWxQaVVnZFc1dVpYTjBLR2RsYm1VcElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0JuY205MWNDQTlJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjREVzSUZ4Y1ozSnZkWEF4WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNESXNJRnhjWjNKdmRYQXlYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEF6TENCY1hHZHliM1Z3TTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0RRc0lGeGNaM0p2ZFhBMFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2huWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0RVc0lGeGNaM0p2ZFhBMVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEEyTENCY1hHZHliM1Z3Tmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNEY3NJRnhjWjNKdmRYQTNYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaG5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjRGdzSUZ4Y1ozSnZkWEE0WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEE1TENCY1hHZHliM1Z3T1Z4Y0xDQk9RU2twS1NrcEtTa3BLVnh1S1Z4dVhHNWNiblJsYlhBZ1BDMGdaR0YwWVM1eVpXY2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aMlZ1WlN3Z2FIVmlMQ0JqYjNWdWRDd2daM0p2ZFhBcElDVStKVnh1SUNCbmNtOTFjRjlpZVNoblpXNWxLU0FsUGlVZ2MyeHBZMlZmYldGNEtHTnZkVzUwTENCM2FYUm9YM1JwWlhNZ1BTQkdRVXhUUlNrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ0pXbHVKU0JqS0Z4Y1ozSnZkWEF4WEZ3c0lGeGNaM0p2ZFhBeVhGd3NJRnhjWjNKdmRYQTFYRndzSUZ4Y1ozSnZkWEE0WEZ3cEtWeHVYRzVjYmlNZ1ZFVk5VQ0JUVkVGU1ZGeHVJeUJVUlUxUUlGTlVRVkpVWEc1blpXNWxUR2x6ZEM1bmNtOTFjREVnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJkeWIzVndNUzUwYzNaY1hDa3BYRzVuWlc1bFRHbHpkQzVuY205MWNERXVkR1Z0Y0NBOExTQm5aVzVsVEdsemRDNW5jbTkxY0RFZ0pUNGxJR1J3YkhseU9qcHNaV1owWDJwdmFXNG9kR1Z0Y0N3Z1lua2dQU0JqS0Z4Y1oyVnVaVnhjS1NsY2JpTWdWRVZOVUNCRlRrUmNibHh1WjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGdJR1JwYzNSaGJtTmxNU0E4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQV2R5YjNWd01Ta2dLU1JqYjNWdWRGeHVJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDFuY205MWNESXBJQ2trWTI5MWJuUmNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNWNibHh1Y0hZeE1pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQlRkVzBzWEZ4bmNtOTFjREZjWEN3Z1hGeG5jbTkxY0RKY1hDa3NJRFVwWEc1d2RqRTFJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjRk4xYlN4Y1hHZHliM1Z3TVZ4Y0xDQmNYR2R5YjNWd05WeGNLU3dnTlNsY2JuQjJNVGdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3VTNWdExGeGNaM0p2ZFhBeFhGd3NJRnhjWjNKdmRYQTRYRndwTENBMUtWeHVjSFl5TlNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhCVGRXMHNYRnhuY205MWNESmNYQ3dnWEZ4bmNtOTFjRFZjWENrc0lEVXBYRzV3ZGpJNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNGTjFiU3hjWEdkeWIzVndNbHhjTENCY1hHZHliM1Z3T0Z4Y0tTd2dOU2xjYm5CMk5UZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdVM1Z0TEZ4Y1ozSnZkWEExWEZ3c0lGeGNaM0p2ZFhBNFhGd3BMQ0ExS1Z4dVhHNWNibkFnUEMwZ1oyZHdiRzkwS0hSbGJYQXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JqYjNWdWRDd2dabWxzYkNBOUlHZHliM1Z3S1NrZ0t5QmNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNDFMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1hHNGdJQ0FnYzJOaGJHVmZlVjlqYjI1MGFXNTFiM1Z6S0dKeVpXRnJjeUE5SUhObGNTZ3dMQ0F6TUN3Z1lua2dQU0ExS1N3Z2JHbHRhWFJ6SUQwZ1l5Z3dMQ0F6TUNrcElDc2dYRzVjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLR0ZsY3lobmNtOTFjQ0E5SUdkeWIzVndLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ4Y2NHOXBiblJjWEN3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNYSEpsWkZ4Y0xDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDa2dJQ3RjYmlBZ1lXNXViM1JoZEdVb1hGeDBaWGgwWEZ3c0lIZ2dQU0F4TENCNUlEMGdNeXdnYkdGaVpXd2dQU0J3WVhOMFpUQW9YRnh3ZGpFeU9pQmNYQ3dnY0hZeE1pd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NIWXhOVG9nWEZ3c0lIQjJNVFVzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEIyTVRnNklGeGNMQ0J3ZGpFNExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2RqSTFPaUJjWEN3Z2NIWXlOU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjSFl5T0RvZ1hGd3NJSEIyTWpnc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCMk5UZzZJRnhjTENCd2RqVTRMQ0JjWEZ4Y2JseGNLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXhLU0FySUNCMGFHVnRaU2hzWldkbGJtUXVjRzl6YVhScGIyNGdQU0JjWEc1dmJtVmNYQ2xjYmx4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhqYjNWdWRFaDFZbDlpWVhKd2JHOTBYMlJwWm1aSGNtOTFjRjlrVkVGSFgzWnpYMFJOVTA5Y1hDbGNibWhsYVdkb2RDQThMU0F6WEc1M2FXUjBhQ0E4TFNBelhHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Y2JseHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG4jIElNUE9SVElORyBHRU5FIEFOTk8gREFUQSBGT1IgUC1OIExPT1BTXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYsIDExLCAxMiwgMTMsIDIyLCAyMywgMjQsIDI1LCAyNywgMjgpKVxuXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2LCAxMSwgMTIsIDEzLCAyMiwgMjMsIDI0LCAyNSwgMjcpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICBhZGpfc3RhcnQxID0gaWZlbHNlKGJpblNpemUgPT0gNTAwMCwgc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGJpblNpemUgPT0gMTAwMDAsIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDEgKyAxMDAwMCkpLFxuICAgICAgICAgICAgICAgIGFkal9lbmQxID0gYWRqX3N0YXJ0MSArIDUwMDAsXG4gICAgICAgICAgICAgICAgYWRqX3N0YXJ0MiA9IGlmZWxzZShiaW5TaXplID09IDUwMDAsIHN0YXJ0MixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShiaW5TaXplID09IDEwMDAwLCBzdGFydDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQyICsgMTAwMDApKSxcbiAgICAgICAgICAgICAgICBhZGpfZW5kMiA9IGFkal9zdGFydDIgKyA1MDAwLFxuICAgICAgICAgICAgICAgIGFuY2hvcjEgPSBwYXN0ZShjaHJvbTEsIGFkal9zdGFydDEsIGFkal9lbmQxLCBzZXAgPSBcXF9cXCksXG4gICAgICAgICAgICAgICAgYW5jaG9yMiA9IHBhc3RlKGNocm9tMiwgYWRqX3N0YXJ0MiwgYWRqX2VuZDIsIHNlcCA9IFxcX1xcKSlcblxuIyBkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2LCAxMSwgMTIsIDEzLCAyMiwgMjMsIDI0LCAyNSwgMjcpKSAlPiUgXG4jICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiMgICAgICAgICAgICAgICAgIGFkal9zdGFydDEgPSBpZmVsc2UoYmluU2l6ZSA9PSA1MDAwLCBzdGFydDEsXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShiaW5TaXplID09IDEwMDAwLCBzdGFydDErNTAwMCxcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0MSArIDEwMDAwKSksXG4jICAgICAgICAgICAgICAgICBhZGpfZW5kMSA9IGFkal9zdGFydDEgKyA1MDAwLFxuIyAgICAgICAgICAgICAgICAgYWRqX3N0YXJ0MiA9IGlmZWxzZShiaW5TaXplID09IDUwMDAsIHN0YXJ0MixcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGJpblNpemUgPT0gMTAwMDAsIHN0YXJ0MiArIDUwMDAsXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDIgKyAxMDAwMCkpLFxuIyAgICAgICAgICAgICAgICAgYWRqX2VuZDIgPSBhZGpfc3RhcnQyICsgNTAwMCxcbiMgICAgICAgICAgICAgICAgIGFuY2hvcjEgPSBwYXN0ZShjaHJvbTEsIGFkal9zdGFydDEsIGFkal9lbmQxLCBzZXAgPSBcXF9cXCksXG4jICAgICAgICAgICAgICAgICBhbmNob3IyID0gcGFzdGUoY2hyb20yLCBhZGpfc3RhcnQyLCBhZGpfZW5kMiwgc2VwID0gXFxfXFwpKVxuXG5kYXRhLnJlZyA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcLCBcXEUtRVxcLCBcXEUtU1xcLCBcXEUtWFxcKSlcblxuIyMgR3JhcGhcbiNpbnN0YWxsLnBhY2thZ2VzKFxcaWdyYXBoXFwpXG5saWJyYXJ5KGlncmFwaClcblxuIyBUbyBiZSBhYmxlIHRvIGNvbnN0cnVjdCBhIGdyYXBoLCBlYWNoIGFuY2hvciBuZWVkIHRvIGhhdmUgc2FtZSByZXNvbHV0aW9uLlxuIyBTaGluayB0aGUgc2l6ZSB0byAxMCBrYlxuIyBJZiB0aGUgYW5jaG9yIGlzIDI1a2IsIGNob29zZSB0aGUgbWlkZGxlIDVrYiBiaW5cbiMgSWYgdGhlIGFuY2hvciBpcyAxMGtiLCBjaG9vc2UgdGhlIGxlZnQgNWtiIGJpblxuXG5ncmFwaCA8LSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoZGF0YS5yZWcgJT4lIGRwbHlyOjpzZWxlY3QoYW5jaG9yMSwgYW5jaG9yMikpXG5jb21wb25lbnRzIDwtIGNvbXBvbmVudHMoZ3JhcGgpXG5kYXRhLnJlZyRodWIgPC0gY29tcG9uZW50cyRtZW1iZXJzaGlwW2RhdGEucmVnJGFuY2hvcjFdXG5cbnRlbXAuYmVkcGUgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBhZGpfc3RhcnQxLCBhZGpfZW5kMSwgY2hyb20yLCBhZGpfc3RhcnQyLCBhZGpfZW5kMilcbmZ3cml0ZSh0ZW1wLmJlZHBlLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3JlZ3VsYXRvcnlfNWtiQWRqLmJlZHBlXFwpKSwgXG4gICAgICAgY29sLm5hbWVzID0gRkFMU0Uscm93Lm5hbWVzID0gRkFMU0UsIHNlcCA9IFxcXFx0XFwpICBcblxuaHViTnVtIDwtIGRhdGEucmVnICU+JSBncm91cF9ieShodWIpICU+JSBzdW1tYXJpc2UoY291bnQgPSBuKCkpXG5cbiMgSHViIHNpemUgZGlzdHJpYnV0aW9uXG5wIDwtIGdncGxvdChodWJOdW0sIGFlcyh4ID0gY291bnQpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoICA9IDEpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gIHNjYWxlX3lfbG9nMTAoKVxuXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBcXGh1Yl9zaXplX2Rpc3RyaWJ1dGlvbi5zdmdcXCksIGhlaWdodCA9IDIsIHdpZHRoID0gMilcbnByaW50KHApXG5kZXYub2ZmKClcblxuZGF0YS5yZWcgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oaHViTnVtLCBieSA9IFxcaHViXFwpIFxuZGF0YS5yZWcgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjptdXRhdGUocGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKVxuXG4jIEV4cG9ydGluZyByZWd1bGF0b3J5IGxvb3BzIHdpdGggc3BlY2lmaWMgaHViIHNpemVcbnRlbXAuYmVkcGUgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjpmaWx0ZXIoY291bnQgPj0gMykgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBhZGpfc3RhcnQxLCBhZGpfZW5kMSwgY2hyb20yLCBhZGpfc3RhcnQyLCBhZGpfZW5kMilcbmZ3cml0ZSh0ZW1wLmJlZHBlLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3JlZ3VsYXRvcnlfNWtiQWRqX2h1YjMuYmVkcGVcXCkpLCBcbiAgICAgICBjb2wubmFtZXMgPSBGQUxTRSxyb3cubmFtZXMgPSBGQUxTRSwgc2VwID0gXFxcXHRcXCkgIFxuXG50ZW1wLmJlZHBlIDwtIGRhdGEucmVnICU+JSBkcGx5cjo6ZmlsdGVyKGNvdW50ID49IDUpICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgYWRqX3N0YXJ0MSwgYWRqX2VuZDEsIGNocm9tMiwgYWRqX3N0YXJ0MiwgYWRqX2VuZDIpXG5md3JpdGUodGVtcC5iZWRwZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9yZWd1bGF0b3J5XzVrYkFkal9odWI1LmJlZHBlXFwpKSwgXG4gICAgICAgY29sLm5hbWVzID0gRkFMU0Uscm93Lm5hbWVzID0gRkFMU0UsIHNlcCA9IFxcXFx0XFwpXG5cbnRlbXAuYmVkcGUgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjpmaWx0ZXIoY291bnQgPj0gMTApICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgYWRqX3N0YXJ0MSwgYWRqX2VuZDEsIGNocm9tMiwgYWRqX3N0YXJ0MiwgYWRqX2VuZDIpXG5md3JpdGUodGVtcC5iZWRwZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9yZWd1bGF0b3J5XzVrYkFkal9odWIxMC5iZWRwZVxcKSksIFxuICAgICAgIGNvbC5uYW1lcyA9IEZBTFNFLHJvdy5uYW1lcyA9IEZBTFNFLCBzZXAgPSBcXFxcdFxcKVxuXG5cbiMgQWRkaW5nIGdlbmUgYW5ub3RhdGlvbiB0byBodWJzXG5nZW5lUGVha1BhaXIgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6bXV0YXRlKHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSkgJT4lIGRwbHlyOjpzZWxlY3QocGVha0lELCBnZW5lKVxuZGF0YS5yZWcgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZVBlYWtQYWlyLCBieSA9IFxccGVha0lEXFwpXG5cbiMgRHVyaW5nIHVubmVzdGluZywgRS1OIGxvb3BzIHdpdGhvdXQgZ2VuZSBhbm5vdGF0ZWQgYXJlIHJlbW92ZWRcbmRhdGEucmVnIDwtIGRhdGEucmVnICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMiwgXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDMsIFxcZ3JvdXAzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNCwgXFxncm91cDRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNSwgXFxncm91cDVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDYsIFxcZ3JvdXA2XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNywgXFxncm91cDdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwOCwgXFxncm91cDhcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDksIFxcZ3JvdXA5XFwsIE5BKSkpKSkpKSkpXG4pXG5cblxudGVtcCA8LSBkYXRhLnJlZyAlPiUgZHBseXI6OnNlbGVjdChnZW5lLCBodWIsIGNvdW50LCBncm91cCkgJT4lXG4gIGdyb3VwX2J5KGdlbmUpICU+JSBzbGljZV9tYXgoY291bnQsIHdpdGhfdGllcyA9IEZBTFNFKSAlPiVcbiAgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxncm91cDFcXCwgXFxncm91cDJcXCwgXFxncm91cDVcXCwgXFxncm91cDhcXCkpXG5cblxuIyBURU1QIFNUQVJUXG4jIFRFTVAgU1RBUlRcbmdlbmVMaXN0Lmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdlxcKSlcbmdlbmVMaXN0Lmdyb3VwMS50ZW1wIDwtIGdlbmVMaXN0Lmdyb3VwMSAlPiUgZHBseXI6OmxlZnRfam9pbih0ZW1wLCBieSA9IGMoXFxnZW5lXFwpKVxuIyBURU1QIEVORFxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGNvdW50XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRjb3VudFxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxucHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG5wdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDMwLCBieSA9IDUpLCBsaW1pdHMgPSBjKDAsIDMwKSkgKyBcblxuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSAgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMChcXHB2MTI6IFxcLCBwdjEyLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjE1OiBcXCwgcHYxNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxODogXFwsIHB2MTgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MjU6IFxcLCBwdjI1LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI4OiBcXCwgcHYyOCwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHY1ODogXFwsIHB2NTgsIFxcXFxuXFwpLCBcbiAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpICsgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcKVxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGNvdW50SHViX2JhcnBsb3RfZGlmZkdyb3VwX2RUQUdfdnNfRE1TT1xcKVxuaGVpZ2h0IDwtIDNcbndpZHRoIDwtIDNcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBJTVBPUlRJTkcgR0VORSBBTk5PIERBVEEgRk9SIFAtTiBMT09QU1xubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2LCAxMSwgMTIsIDEzLCAyMiwgMjMsIDI0LCAyNSwgMjcsIDI4KSlcblxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNiwgMTEsIDEyLCAxMywgMjIsIDIzLCAyNCwgMjUsIDI3KSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgYWRqX3N0YXJ0MSA9IGlmZWxzZShiaW5TaXplID09IDUwMDAsIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShiaW5TaXplID09IDEwMDAwLCBzdGFydDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQxICsgMTAwMDApKSxcbiAgICAgICAgICAgICAgICBhZGpfZW5kMSA9IGFkal9zdGFydDEgKyA1MDAwLFxuICAgICAgICAgICAgICAgIGFkal9zdGFydDIgPSBpZmVsc2UoYmluU2l6ZSA9PSA1MDAwLCBzdGFydDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYmluU2l6ZSA9PSAxMDAwMCwgc3RhcnQyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0MiArIDEwMDAwKSksXG4gICAgICAgICAgICAgICAgYWRqX2VuZDIgPSBhZGpfc3RhcnQyICsgNTAwMCxcbiAgICAgICAgICAgICAgICBhbmNob3IxID0gcGFzdGUoY2hyb20xLCBhZGpfc3RhcnQxLCBhZGpfZW5kMSwgc2VwID0gXFxfXFwpLFxuICAgICAgICAgICAgICAgIGFuY2hvcjIgPSBwYXN0ZShjaHJvbTIsIGFkal9zdGFydDIsIGFkal9lbmQyLCBzZXAgPSBcXF9cXCkpXG5cbiMgZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNiwgMTEsIDEyLCAxMywgMjIsIDIzLCAyNCwgMjUsIDI3KSkgJT4lIFxuIyAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsXG4jICAgICAgICAgICAgICAgICBhZGpfc3RhcnQxID0gaWZlbHNlKGJpblNpemUgPT0gNTAwMCwgc3RhcnQxLFxuIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYmluU2l6ZSA9PSAxMDAwMCwgc3RhcnQxKzUwMDAsXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDEgKyAxMDAwMCkpLFxuIyAgICAgICAgICAgICAgICAgYWRqX2VuZDEgPSBhZGpfc3RhcnQxICsgNTAwMCxcbiMgICAgICAgICAgICAgICAgIGFkal9zdGFydDIgPSBpZmVsc2UoYmluU2l6ZSA9PSA1MDAwLCBzdGFydDIsXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShiaW5TaXplID09IDEwMDAwLCBzdGFydDIgKyA1MDAwLFxuIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQyICsgMTAwMDApKSxcbiMgICAgICAgICAgICAgICAgIGFkal9lbmQyID0gYWRqX3N0YXJ0MiArIDUwMDAsXG4jICAgICAgICAgICAgICAgICBhbmNob3IxID0gcGFzdGUoY2hyb20xLCBhZGpfc3RhcnQxLCBhZGpfZW5kMSwgc2VwID0gXFxfXFwpLFxuIyAgICAgICAgICAgICAgICAgYW5jaG9yMiA9IHBhc3RlKGNocm9tMiwgYWRqX3N0YXJ0MiwgYWRqX2VuZDIsIHNlcCA9IFxcX1xcKSlcblxuZGF0YS5yZWcgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCwgXFxFLUVcXCwgXFxFLVNcXCwgXFxFLVhcXCkpXG5cbiMjIEdyYXBoXG4jaW5zdGFsbC5wYWNrYWdlcyhcXGlncmFwaFxcKVxubGlicmFyeShpZ3JhcGgpXG5cbiMgVG8gYmUgYWJsZSB0byBjb25zdHJ1Y3QgYSBncmFwaCwgZWFjaCBhbmNob3IgbmVlZCB0byBoYXZlIHNhbWUgcmVzb2x1dGlvbi5cbiMgU2hpbmsgdGhlIHNpemUgdG8gMTAga2JcbiMgSWYgdGhlIGFuY2hvciBpcyAyNWtiLCBjaG9vc2UgdGhlIG1pZGRsZSA1a2IgYmluXG4jIElmIHRoZSBhbmNob3IgaXMgMTBrYiwgY2hvb3NlIHRoZSBsZWZ0IDVrYiBiaW5cblxuZ3JhcGggPC0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGRhdGEucmVnICU+JSBkcGx5cjo6c2VsZWN0KGFuY2hvcjEsIGFuY2hvcjIpKVxuY29tcG9uZW50cyA8LSBjb21wb25lbnRzKGdyYXBoKVxuZGF0YS5yZWckaHViIDwtIGNvbXBvbmVudHMkbWVtYmVyc2hpcFtkYXRhLnJlZyRhbmNob3IxXVxuXG50ZW1wLmJlZHBlIDwtIGRhdGEucmVnICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgYWRqX3N0YXJ0MSwgYWRqX2VuZDEsIGNocm9tMiwgYWRqX3N0YXJ0MiwgYWRqX2VuZDIpXG5md3JpdGUodGVtcC5iZWRwZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9yZWd1bGF0b3J5XzVrYkFkai5iZWRwZVxcKSksIFxuICAgICAgIGNvbC5uYW1lcyA9IEZBTFNFLHJvdy5uYW1lcyA9IEZBTFNFLCBzZXAgPSBcXFxcdFxcKSAgXG5cbmh1Yk51bSA8LSBkYXRhLnJlZyAlPiUgZ3JvdXBfYnkoaHViKSAlPiUgc3VtbWFyaXNlKGNvdW50ID0gbigpKVxuXG4jIEh1YiBzaXplIGRpc3RyaWJ1dGlvblxucCA8LSBnZ3Bsb3QoaHViTnVtLCBhZXMoeCA9IGNvdW50KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCAgPSAxKSArIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzY2FsZV95X2xvZzEwKClcblxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgXFxodWJfc2l6ZV9kaXN0cmlidXRpb24uc3ZnXFwpLCBoZWlnaHQgPSAyLCB3aWR0aCA9IDIpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbmRhdGEucmVnIDwtIGRhdGEucmVnICU+JSBkcGx5cjo6bGVmdF9qb2luKGh1Yk51bSwgYnkgPSBcXGh1YlxcKSBcbmRhdGEucmVnIDwtIGRhdGEucmVnICU+JSBkcGx5cjo6bXV0YXRlKHBlYWtJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSlcblxuIyBFeHBvcnRpbmcgcmVndWxhdG9yeSBsb29wcyB3aXRoIHNwZWNpZmljIGh1YiBzaXplXG50ZW1wLmJlZHBlIDwtIGRhdGEucmVnICU+JSBkcGx5cjo6ZmlsdGVyKGNvdW50ID49IDMpICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgYWRqX3N0YXJ0MSwgYWRqX2VuZDEsIGNocm9tMiwgYWRqX3N0YXJ0MiwgYWRqX2VuZDIpXG5md3JpdGUodGVtcC5iZWRwZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9yZWd1bGF0b3J5XzVrYkFkal9odWIzLmJlZHBlXFwpKSwgXG4gICAgICAgY29sLm5hbWVzID0gRkFMU0Uscm93Lm5hbWVzID0gRkFMU0UsIHNlcCA9IFxcXFx0XFwpICBcblxudGVtcC5iZWRwZSA8LSBkYXRhLnJlZyAlPiUgZHBseXI6OmZpbHRlcihjb3VudCA+PSA1KSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIGFkal9zdGFydDEsIGFkal9lbmQxLCBjaHJvbTIsIGFkal9zdGFydDIsIGFkal9lbmQyKVxuZndyaXRlKHRlbXAuYmVkcGUsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcmVndWxhdG9yeV81a2JBZGpfaHViNS5iZWRwZVxcKSksIFxuICAgICAgIGNvbC5uYW1lcyA9IEZBTFNFLHJvdy5uYW1lcyA9IEZBTFNFLCBzZXAgPSBcXFxcdFxcKVxuXG50ZW1wLmJlZHBlIDwtIGRhdGEucmVnICU+JSBkcGx5cjo6ZmlsdGVyKGNvdW50ID49IDEwKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIGFkal9zdGFydDEsIGFkal9lbmQxLCBjaHJvbTIsIGFkal9zdGFydDIsIGFkal9lbmQyKVxuZndyaXRlKHRlbXAuYmVkcGUsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcmVndWxhdG9yeV81a2JBZGpfaHViMTAuYmVkcGVcXCkpLCBcbiAgICAgICBjb2wubmFtZXMgPSBGQUxTRSxyb3cubmFtZXMgPSBGQUxTRSwgc2VwID0gXFxcXHRcXClcblxuXG4jIEFkZGluZyBnZW5lIGFubm90YXRpb24gdG8gaHVic1xuZ2VuZVBlYWtQYWlyIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6Om11dGF0ZShwZWFrSUQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSBcXF9cXCkpICU+JSBkcGx5cjo6c2VsZWN0KHBlYWtJRCwgZ2VuZSlcbmRhdGEucmVnIDwtIGRhdGEucmVnICU+JSBkcGx5cjo6bGVmdF9qb2luKGdlbmVQZWFrUGFpciwgYnkgPSBcXHBlYWtJRFxcKVxuXG4jIER1cmluZyB1bm5lc3RpbmcsIEUtTiBsb29wcyB3aXRob3V0IGdlbmUgYW5ub3RhdGVkIGFyZSByZW1vdmVkXG5kYXRhLnJlZyA8LSBkYXRhLnJlZyAlPiUgdW5uZXN0KGdlbmUpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAzLCBcXGdyb3VwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDQsIFxcZ3JvdXA0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA2LCBcXGdyb3VwNlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDcsIFxcZ3JvdXA3XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDgsIFxcZ3JvdXA4XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA5LCBcXGdyb3VwOVxcLCBOQSkpKSkpKSkpKVxuKVxuXG5cbnRlbXAgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjpzZWxlY3QoZ2VuZSwgaHViLCBjb3VudCwgZ3JvdXApICU+JVxuICBncm91cF9ieShnZW5lKSAlPiUgc2xpY2VfbWF4KGNvdW50LCB3aXRoX3RpZXMgPSBGQUxTRSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpKVxuXG5cbiMgVEVNUCBTVEFSVFxuIyBURU1QIFNUQVJUXG5nZW5lTGlzdC5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMS50c3ZcXCkpXG5nZW5lTGlzdC5ncm91cDEudGVtcCA8LSBnZW5lTGlzdC5ncm91cDEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4odGVtcCwgYnkgPSBjKFxcZ2VuZVxcKSlcbiMgVEVNUCBFTkRcblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRjb3VudFxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkY291bnRcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG5wdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbnB2MTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxucHYyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG5wdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSxcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbnB2NTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgXG4gICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAzMCwgYnkgPSA1KSwgbGltaXRzID0gYygwLCAzMCkpICsgXG5cbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMywgbGFiZWwgPSBwYXN0ZTAoXFxwdjEyOiBcXCwgcHYxMiwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYxNTogXFwsIHB2MTUsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2MTg6IFxcLCBwdjE4LCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwdjI1OiBcXCwgcHYyNSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHYyODogXFwsIHB2MjgsIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHB2NTg6IFxcLCBwdjU4LCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAxKSArICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXClcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxjb3VudEh1Yl9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09cXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG5gYGBcbmBgYCJ9 -->

```r
```r
# IMPORTING GENE ANNO DATA FOR P-N LOOPS
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                 diffCutoff = 0.2,
                                 annoList = c(\P-P\, \P-E\, \P-S\, \P-X\)) %>% dplyr::select(c(1, 2, 3, 4, 5, 6, 11, 12, 13, 22, 23, 24, 25, 27, 28))

data <- fread(here(consensusDir, paste0(name, \.tsv\))) %>% dplyr::select(c(1, 2, 3, 4, 5, 6, 11, 12, 13, 22, 23, 24, 25, 27)) %>%
  dplyr::mutate(binSize = end1 - start1,
                adj_start1 = ifelse(binSize == 5000, start1,
                                    ifelse(binSize == 10000, start1,
                                           start1 + 10000)),
                adj_end1 = adj_start1 + 5000,
                adj_start2 = ifelse(binSize == 5000, start2,
                                    ifelse(binSize == 10000, start2,
                                           start2 + 10000)),
                adj_end2 = adj_start2 + 5000,
                anchor1 = paste(chrom1, adj_start1, adj_end1, sep = \_\),
                anchor2 = paste(chrom2, adj_start2, adj_end2, sep = \_\))

# data <- fread(here(consensusDir, paste0(name, \.tsv\))) %>% dplyr::select(c(1, 2, 3, 4, 5, 6, 11, 12, 13, 22, 23, 24, 25, 27)) %>% 
#   dplyr::mutate(binSize = end1 - start1,
#                 adj_start1 = ifelse(binSize == 5000, start1,
#                                     ifelse(binSize == 10000, start1+5000,
#                                            start1 + 10000)),
#                 adj_end1 = adj_start1 + 5000,
#                 adj_start2 = ifelse(binSize == 5000, start2,
#                                     ifelse(binSize == 10000, start2 + 5000,
#                                            start2 + 10000)),
#                 adj_end2 = adj_start2 + 5000,
#                 anchor1 = paste(chrom1, adj_start1, adj_end1, sep = \_\),
#                 anchor2 = paste(chrom2, adj_start2, adj_end2, sep = \_\))

data.reg <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \P-S\, \P-X\, \E-E\, \E-S\, \E-X\))

## Graph
#install.packages(\igraph\)
library(igraph)

# To be able to construct a graph, each anchor need to have same resolution.
# Shink the size to 10 kb
# If the anchor is 25kb, choose the middle 5kb bin
# If the anchor is 10kb, choose the left 5kb bin

graph <- graph_from_data_frame(data.reg %>% dplyr::select(anchor1, anchor2))
components <- components(graph)
data.reg$hub <- components$membership[data.reg$anchor1]

temp.bedpe <- data.reg %>% dplyr::select(chrom1, adj_start1, adj_end1, chrom2, adj_start2, adj_end2)
fwrite(temp.bedpe, here(consensusDir, paste0(name, \_regulatory_5kbAdj.bedpe\)), 
       col.names = FALSE,row.names = FALSE, sep = \\t\)  

hubNum <- data.reg %>% group_by(hub) %>% summarise(count = n())

# Hub size distribution
p <- ggplot(hubNum, aes(x = count)) + geom_histogram(binwidth  = 1) + theme_classic() + 
  scale_y_log10()

svglite(here(figDir, \hub_size_distribution.svg\), height = 2, width = 2)
print(p)
dev.off()

data.reg <- data.reg %>% dplyr::left_join(hubNum, by = \hub\) 
data.reg <- data.reg %>% dplyr::mutate(peakID = paste(chrom1, start1, start2, sep = \_\))

# Exporting regulatory loops with specific hub size
temp.bedpe <- data.reg %>% dplyr::filter(count >= 3) %>% dplyr::select(chrom1, adj_start1, adj_end1, chrom2, adj_start2, adj_end2)
fwrite(temp.bedpe, here(consensusDir, paste0(name, \_regulatory_5kbAdj_hub3.bedpe\)), 
       col.names = FALSE,row.names = FALSE, sep = \\t\)  

temp.bedpe <- data.reg %>% dplyr::filter(count >= 5) %>% dplyr::select(chrom1, adj_start1, adj_end1, chrom2, adj_start2, adj_end2)
fwrite(temp.bedpe, here(consensusDir, paste0(name, \_regulatory_5kbAdj_hub5.bedpe\)), 
       col.names = FALSE,row.names = FALSE, sep = \\t\)

temp.bedpe <- data.reg %>% dplyr::filter(count >= 10) %>% dplyr::select(chrom1, adj_start1, adj_end1, chrom2, adj_start2, adj_end2)
fwrite(temp.bedpe, here(consensusDir, paste0(name, \_regulatory_5kbAdj_hub10.bedpe\)), 
       col.names = FALSE,row.names = FALSE, sep = \\t\)


# Adding gene annotation to hubs
genePeakPair <- geneAnnoData %>% dplyr::mutate(peakID = paste(chrom1, start1, start2, sep = \_\)) %>% dplyr::select(peakID, gene)
data.reg <- data.reg %>% dplyr::left_join(genePeakPair, by = \peakID\)

# During unnesting, E-N loops without gene annotated are removed
data.reg <- data.reg %>% unnest(gene) %>% dplyr::mutate(
  group = ifelse(gene %in% gene.group1, \group1\,
                 ifelse(gene %in% gene.group2, \group2\,
                        ifelse(gene %in% gene.group3, \group3\,
                               ifelse(gene %in% gene.group4, \group4\,
                                      ifelse(gene %in% gene.group5, \group5\,
                                             ifelse(gene %in% gene.group6, \group6\,
                                                    ifelse(gene %in% gene.group7, \group7\,
                                                           ifelse(gene %in% gene.group8, \group8\,
                                                                  ifelse(gene %in% gene.group9, \group9\, NA)))))))))
)


temp <- data.reg %>% dplyr::select(gene, hub, count, group) %>%
  group_by(gene) %>% slice_max(count, with_ties = FALSE) %>%
  dplyr::filter(group %in% c(\group1\, \group2\, \group5\, \group8\))


# TEMP START
# TEMP START
geneList.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))
geneList.group1.temp <- geneList.group1 %>% dplyr::left_join(temp, by = c(\gene\))
# TEMP END

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$count
  distance2 <- (data %>% dplyr::filter(group ==group2) )$count
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


pv12 <- round(getPvalWilcox(tempSum,\group1\, \group2\), 5)
pv15 <- round(getPvalWilcox(tempSum,\group1\, \group5\), 5)
pv18 <- round(getPvalWilcox(tempSum,\group1\, \group8\), 5)
pv25 <- round(getPvalWilcox(tempSum,\group2\, \group5\), 5)
pv28 <- round(getPvalWilcox(tempSum,\group2\, \group8\), 5)
pv58 <- round(getPvalWilcox(tempSum,\group5\, \group8\), 5)


p <- ggplot(temp, aes(x = group, y = count, fill = group)) + 
  geom_boxplot(width = 0.5, outlier.shape = NA) + theme_classic() + 
    scale_y_continuous(breaks = seq(0, 30, by = 5), limits = c(0, 30)) + 

  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)  +
  annotate(\text\, x = 1, y = 3, label = paste0(\pv12: \, pv12, \\n\,
                                                \pv15: \, pv15, \\n\,
                                                \pv18: \, pv18, \\n\,
                                                \pv25: \, pv25, \\n\,
                                                \pv28: \, pv28, \\n\,
                                                \pv58: \, pv58, \\n\), 
           color = \black\, hjust = 0, size = 1) +  theme(legend.position = \none\)


fileName <- paste0(\countHub_barplot_diffGroup_dTAG_vs_DMSO\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### log2FC

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJKYlhCdmNuUWdhVzV6ZFd4aGRHbHZiaUJ6WTI5eVpTQmpZV3hqZFd4aGRHVmtJSGRwZEdnZ2NIbDBhRzl1WEc1eVpYTjFiSFJFYVhJZ1BDMGdhR1Z5WlNoY0lpNHVMeTR1TDNKbGMzVnNkRndpS1Z4dWFXNXpVMk52Y21VdVJFMVRUeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxjM1ZzZEVScGNpd2dYQ0pVUVVSY0lpd2dYQ0pwYm5OMWJHRjBhVzl1VTJOdmNtVmZNalZyWWw5SE1VUk5VMDh1ZEhOMlhDSXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1l5aGNJbU5vY205dFhDSXNJRndpYzNSaGNuUmNJaXdnWENKbGJtUmNJaXdnWENKc2IyY3lYMmx1YzNWc1lYUnBiMjVmYzJOdmNtVmZNVEkxTURBd1hDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoaWFXNUpSQ0E5SUhCaGMzUmxLR05vY205dExDQnpkR0Z5ZEN3Z1pXNWtMQ0J6WlhBZ1BTQmNJbDljSWlrcFhHNWpiMnh1WVcxbGN5aHBibk5UWTI5eVpTNUVUVk5QS1NBOExTQmpLRndpWTJoeWIyMWNJaXdnWENKemRHRnlkRndpTENCY0ltVnVaRndpTENCY0ltbHVjM1ZzWVhScGIyNVRZMjl5WlZ3aUxDQmNJbUpwYmtsRVhDSXBYRzVwYm5OVFkyOXlaUzVrVkVGSElEd3RJR1p5WldGa0tHaGxjbVVvY21WemRXeDBSR2x5TENCY0lsUkJSRndpTENCY0ltbHVjM1ZzWVhScGIyNVRZMjl5WlY4eU5XdGlYMGN4WkZSQlJ5NTBjM1pjSWlrcElDVStKU0JjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hqS0Z3aVkyaHliMjFjSWl3Z1hDSnpkR0Z5ZEZ3aUxDQmNJbVZ1WkZ3aUxDQmNJbXh2WnpKZmFXNXpkV3hoZEdsdmJsOXpZMjl5WlY4eE1qVXdNREJjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR0pwYmtsRUlEMGdjR0Z6ZEdVb1kyaHliMjBzSUhOMFlYSjBMQ0JsYm1Rc0lITmxjQ0E5SUZ3aVgxd2lLU2xjYm1OdmJHNWhiV1Z6S0dsdWMxTmpiM0psTG1SVVFVY3BJRHd0SUdNb1hDSmphSEp2YlZ3aUxDQmNJbk4wWVhKMFhDSXNJRndpWlc1a1hDSXNJRndpYVc1emRXeGhkR2x2YmxOamIzSmxYQ0lzSUZ3aVltbHVTVVJjSWlsY2JseHVJMmx1YzFOamIzSmxJRHd0SUdaMWJHeGZhbTlwYmlocGJuTlRZMjl5WlM1RVRWTlBMQ0JwYm5OVFkyOXlaUzVrVkVGSExDQmllU0E5SUdNb1hDSmlhVzVKUkZ3aUtTa2dKVDRsWEc0aklDQmtjR3g1Y2pvNmMyVnNaV04wS0dKcGJrbEVMQ0JqYUhKdmJTNTRMQ0J6ZEdGeWRDNTRMQ0JsYm1RdWVDd2dhVzV6ZFd4aGRHbHZibE5qYjNKbExuZ3NJR2x1YzNWc1lYUnBiMjVUWTI5eVpTNTVLU0JjYmx4dUkyTnZiRzVoYldWektHbHVjMU5qYjNKbEtTQThMU0JqS0Z3aVltbHVTVVJjSWl3Z1hDSmphSEpjSWl3Z1hDSnpkR0Z5ZEZ3aUxDQmNJbVZ1WkZ3aUxDQmNJbWx1YzNWc1lYUnBiMjVmYzJOdmNtVmZSRTFUVDF3aUxDQmNJbWx1YzNWc1lYUnBiMjVmYzJOdllYSmxYMlJVUVVkY0lpbGNibHh1STFacFpYY29hVzV6VTJOdmNtVXBYRzVjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiMgSW1wb3J0IGluc3VsYXRpb24gc2NvcmUgY2FsY3VsYXRlZCB3aXRoIHB5dGhvblxucmVzdWx0RGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHRcXClcbmluc1Njb3JlLkRNU08gPC0gZnJlYWQoaGVyZShyZXN1bHREaXIsIFxcVEFEXFwsIFxcaW5zdWxhdGlvblNjb3JlXzI1a2JfRzFETVNPLnRzdlxcKSkgJT4lIFxuICBkcGx5cjo6c2VsZWN0KGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcbG9nMl9pbnN1bGF0aW9uX3Njb3JlXzEyNTAwMFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoYmluSUQgPSBwYXN0ZShjaHJvbSwgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpKVxuY29sbmFtZXMoaW5zU2NvcmUuRE1TTykgPC0gYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxpbnN1bGF0aW9uU2NvcmVcXCwgXFxiaW5JRFxcKVxuaW5zU2NvcmUuZFRBRyA8LSBmcmVhZChoZXJlKHJlc3VsdERpciwgXFxUQURcXCwgXFxpbnN1bGF0aW9uU2NvcmVfMjVrYl9HMWRUQUcudHN2XFwpKSAlPiUgXG4gIGRwbHlyOjpzZWxlY3QoYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxsb2cyX2luc3VsYXRpb25fc2NvcmVfMTI1MDAwXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShiaW5JRCA9IHBhc3RlKGNocm9tLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCkpXG5jb2xuYW1lcyhpbnNTY29yZS5kVEFHKSA8LSBjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGluc3VsYXRpb25TY29yZVxcLCBcXGJpbklEXFwpXG5cbiNpbnNTY29yZSA8LSBmdWxsX2pvaW4oaW5zU2NvcmUuRE1TTywgaW5zU2NvcmUuZFRBRywgYnkgPSBjKFxcYmluSURcXCkpICU+JVxuIyAgZHBseXI6OnNlbGVjdChiaW5JRCwgY2hyb20ueCwgc3RhcnQueCwgZW5kLngsIGluc3VsYXRpb25TY29yZS54LCBpbnN1bGF0aW9uU2NvcmUueSkgXG5cbiNjb2xuYW1lcyhpbnNTY29yZSkgPC0gYyhcXGJpbklEXFwsIFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxpbnN1bGF0aW9uX3Njb3JlX0RNU09cXCwgXFxpbnN1bGF0aW9uX3Njb2FyZV9kVEFHXFwpXG5cbiNWaWV3KGluc1Njb3JlKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# Import insulation score calculated with python
resultDir <- here(\../../result\)
insScore.DMSO <- fread(here(resultDir, \TAD\, \insulationScore_25kb_G1DMSO.tsv\)) %>% 
  dplyr::select(c(\chrom\, \start\, \end\, \log2_insulation_score_125000\)) %>%
  dplyr::mutate(binID = paste(chrom, start, end, sep = \_\))
colnames(insScore.DMSO) <- c(\chrom\, \start\, \end\, \insulationScore\, \binID\)
insScore.dTAG <- fread(here(resultDir, \TAD\, \insulationScore_25kb_G1dTAG.tsv\)) %>% 
  dplyr::select(c(\chrom\, \start\, \end\, \log2_insulation_score_125000\)) %>%
  dplyr::mutate(binID = paste(chrom, start, end, sep = \_\))
colnames(insScore.dTAG) <- c(\chrom\, \start\, \end\, \insulationScore\, \binID\)

#insScore <- full_join(insScore.DMSO, insScore.dTAG, by = c(\binID\)) %>%
#  dplyr::select(binID, chrom.x, start.x, end.x, insulationScore.x, insulationScore.y) 

#colnames(insScore) <- c(\binID\, \chr\, \start\, \end\, \insulation_score_DMSO\, \insulation_scoare_dTAG\)

#View(insScore)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkpiWEJ2Y25RZ2FXNXpkV3hoZEdsdmJpQnpZMjl5WlNCallXeGpkV3hoZEdWa0lIZHBkR2dnY0hsMGFHOXVYRzV5WlhOMWJIUkVhWElnUEMwZ2FHVnlaU2hjWEM0dUx5NHVMM0psYzNWc2RGeGNLVnh1YVc1elUyTnZjbVV1UkUxVFR5QThMU0JtY21WaFpDaG9aWEpsS0hKbGMzVnNkRVJwY2l3Z1hGeFVRVVJjWEN3Z1hGeHBibk4xYkdGMGFXOXVVMk52Y21WZk1qVnJZbDlITVVSTlUwOHVkSE4yWEZ3cEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWXloY1hHTm9jbTl0WEZ3c0lGeGNjM1JoY25SY1hDd2dYRnhsYm1SY1hDd2dYRnhzYjJjeVgybHVjM1ZzWVhScGIyNWZjMk52Y21WZk1USTFNREF3WEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hpYVc1SlJDQTlJSEJoYzNSbEtHTm9jbTl0TENCemRHRnlkQ3dnWlc1a0xDQnpaWEFnUFNCY1hGOWNYQ2twWEc1amIyeHVZVzFsY3locGJuTlRZMjl5WlM1RVRWTlBLU0E4TFNCaktGeGNZMmh5YjIxY1hDd2dYRnh6ZEdGeWRGeGNMQ0JjWEdWdVpGeGNMQ0JjWEdsdWMzVnNZWFJwYjI1VFkyOXlaVnhjTENCY1hHSnBia2xFWEZ3cFhHNXBibk5UWTI5eVpTNWtWRUZISUR3dElHWnlaV0ZrS0dobGNtVW9jbVZ6ZFd4MFJHbHlMQ0JjWEZSQlJGeGNMQ0JjWEdsdWMzVnNZWFJwYjI1VFkyOXlaVjh5Tld0aVgwY3haRlJCUnk1MGMzWmNYQ2twSUNVK0pTQmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGpLRnhjWTJoeWIyMWNYQ3dnWEZ4emRHRnlkRnhjTENCY1hHVnVaRnhjTENCY1hHeHZaekpmYVc1emRXeGhkR2x2Ymw5elkyOXlaVjh4TWpVd01EQmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHSnBia2xFSUQwZ2NHRnpkR1VvWTJoeWIyMHNJSE4wWVhKMExDQmxibVFzSUhObGNDQTlJRnhjWDF4Y0tTbGNibU52Ykc1aGJXVnpLR2x1YzFOamIzSmxMbVJVUVVjcElEd3RJR01vWEZ4amFISnZiVnhjTENCY1hITjBZWEowWEZ3c0lGeGNaVzVrWEZ3c0lGeGNhVzV6ZFd4aGRHbHZibE5qYjNKbFhGd3NJRnhjWW1sdVNVUmNYQ2xjYmx4dUkybHVjMU5qYjNKbElEd3RJR1oxYkd4ZmFtOXBiaWhwYm5OVFkyOXlaUzVFVFZOUExDQnBibk5UWTI5eVpTNWtWRUZITENCaWVTQTlJR01vWEZ4aWFXNUpSRnhjS1NrZ0pUNGxYRzRqSUNCa2NHeDVjam82YzJWc1pXTjBLR0pwYmtsRUxDQmphSEp2YlM1NExDQnpkR0Z5ZEM1NExDQmxibVF1ZUN3Z2FXNXpkV3hoZEdsdmJsTmpiM0psTG5nc0lHbHVjM1ZzWVhScGIyNVRZMjl5WlM1NUtTQmNibHh1STJOdmJHNWhiV1Z6S0dsdWMxTmpiM0psS1NBOExTQmpLRnhjWW1sdVNVUmNYQ3dnWEZ4amFISmNYQ3dnWEZ4emRHRnlkRnhjTENCY1hHVnVaRnhjTENCY1hHbHVjM1ZzWVhScGIyNWZjMk52Y21WZlJFMVRUMXhjTENCY1hHbHVjM1ZzWVhScGIyNWZjMk52WVhKbFgyUlVRVWRjWENsY2JseHVJMVpwWlhjb2FXNXpVMk52Y21VcFhHNWNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG4jIEltcG9ydCBpbnN1bGF0aW9uIHNjb3JlIGNhbGN1bGF0ZWQgd2l0aCBweXRob25cbnJlc3VsdERpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0XFwpXG5pbnNTY29yZS5ETVNPIDwtIGZyZWFkKGhlcmUocmVzdWx0RGlyLCBcXFRBRFxcLCBcXGluc3VsYXRpb25TY29yZV8yNWtiX0cxRE1TTy50c3ZcXCkpICU+JSBcbiAgZHBseXI6OnNlbGVjdChjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGxvZzJfaW5zdWxhdGlvbl9zY29yZV8xMjUwMDBcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGJpbklEID0gcGFzdGUoY2hyb20sIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSlcbmNvbG5hbWVzKGluc1Njb3JlLkRNU08pIDwtIGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcaW5zdWxhdGlvblNjb3JlXFwsIFxcYmluSURcXClcbmluc1Njb3JlLmRUQUcgPC0gZnJlYWQoaGVyZShyZXN1bHREaXIsIFxcVEFEXFwsIFxcaW5zdWxhdGlvblNjb3JlXzI1a2JfRzFkVEFHLnRzdlxcKSkgJT4lIFxuICBkcGx5cjo6c2VsZWN0KGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcbG9nMl9pbnN1bGF0aW9uX3Njb3JlXzEyNTAwMFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoYmluSUQgPSBwYXN0ZShjaHJvbSwgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpKVxuY29sbmFtZXMoaW5zU2NvcmUuZFRBRykgPC0gYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxpbnN1bGF0aW9uU2NvcmVcXCwgXFxiaW5JRFxcKVxuXG4jaW5zU2NvcmUgPC0gZnVsbF9qb2luKGluc1Njb3JlLkRNU08sIGluc1Njb3JlLmRUQUcsIGJ5ID0gYyhcXGJpbklEXFwpKSAlPiVcbiMgIGRwbHlyOjpzZWxlY3QoYmluSUQsIGNocm9tLngsIHN0YXJ0LngsIGVuZC54LCBpbnN1bGF0aW9uU2NvcmUueCwgaW5zdWxhdGlvblNjb3JlLnkpIFxuXG4jY29sbmFtZXMoaW5zU2NvcmUpIDwtIGMoXFxiaW5JRFxcLCBcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcaW5zdWxhdGlvbl9zY29yZV9ETVNPXFwsIFxcaW5zdWxhdGlvbl9zY29hcmVfZFRBR1xcKVxuXG4jVmlldyhpbnNTY29yZSlcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBJbXBvcnQgaW5zdWxhdGlvbiBzY29yZSBjYWxjdWxhdGVkIHdpdGggcHl0aG9uXG5yZXN1bHREaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdFxcKVxuaW5zU2NvcmUuRE1TTyA8LSBmcmVhZChoZXJlKHJlc3VsdERpciwgXFxUQURcXCwgXFxpbnN1bGF0aW9uU2NvcmVfMjVrYl9HMURNU08udHN2XFwpKSAlPiUgXG4gIGRwbHlyOjpzZWxlY3QoYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxsb2cyX2luc3VsYXRpb25fc2NvcmVfMTI1MDAwXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShiaW5JRCA9IHBhc3RlKGNocm9tLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCkpXG5jb2xuYW1lcyhpbnNTY29yZS5ETVNPKSA8LSBjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGluc3VsYXRpb25TY29yZVxcLCBcXGJpbklEXFwpXG5pbnNTY29yZS5kVEFHIDwtIGZyZWFkKGhlcmUocmVzdWx0RGlyLCBcXFRBRFxcLCBcXGluc3VsYXRpb25TY29yZV8yNWtiX0cxZFRBRy50c3ZcXCkpICU+JSBcbiAgZHBseXI6OnNlbGVjdChjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGxvZzJfaW5zdWxhdGlvbl9zY29yZV8xMjUwMDBcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGJpbklEID0gcGFzdGUoY2hyb20sIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSlcbmNvbG5hbWVzKGluc1Njb3JlLmRUQUcpIDwtIGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcaW5zdWxhdGlvblNjb3JlXFwsIFxcYmluSURcXClcblxuI2luc1Njb3JlIDwtIGZ1bGxfam9pbihpbnNTY29yZS5ETVNPLCBpbnNTY29yZS5kVEFHLCBieSA9IGMoXFxiaW5JRFxcKSkgJT4lXG4jICBkcGx5cjo6c2VsZWN0KGJpbklELCBjaHJvbS54LCBzdGFydC54LCBlbmQueCwgaW5zdWxhdGlvblNjb3JlLngsIGluc3VsYXRpb25TY29yZS55KSBcblxuI2NvbG5hbWVzKGluc1Njb3JlKSA8LSBjKFxcYmluSURcXCwgXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGluc3VsYXRpb25fc2NvcmVfRE1TT1xcLCBcXGluc3VsYXRpb25fc2NvYXJlX2RUQUdcXClcblxuI1ZpZXcoaW5zU2NvcmUpXG5cbmBgYFxuYGBgIn0= -->

```r
```r
# Import insulation score calculated with python
resultDir <- here(\../../result\)
insScore.DMSO <- fread(here(resultDir, \TAD\, \insulationScore_25kb_G1DMSO.tsv\)) %>% 
  dplyr::select(c(\chrom\, \start\, \end\, \log2_insulation_score_125000\)) %>%
  dplyr::mutate(binID = paste(chrom, start, end, sep = \_\))
colnames(insScore.DMSO) <- c(\chrom\, \start\, \end\, \insulationScore\, \binID\)
insScore.dTAG <- fread(here(resultDir, \TAD\, \insulationScore_25kb_G1dTAG.tsv\)) %>% 
  dplyr::select(c(\chrom\, \start\, \end\, \log2_insulation_score_125000\)) %>%
  dplyr::mutate(binID = paste(chrom, start, end, sep = \_\))
colnames(insScore.dTAG) <- c(\chrom\, \start\, \end\, \insulationScore\, \binID\)

#insScore <- full_join(insScore.DMSO, insScore.dTAG, by = c(\binID\)) %>%
#  dplyr::select(binID, chrom.x, start.x, end.x, insulationScore.x, insulationScore.y) 

#colnames(insScore) <- c(\binID\, \chr\, \start\, \end\, \insulation_score_DMSO\, \insulation_scoare_dTAG\)

#View(insScore)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


## [2.13] How to define multiconnected hub using regulatory loops?

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMlZ1WlM1VVUxTXVkR0lnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2liVzB4TUY5SFVrTnRNemd1Y0RaZloyVnVaVjl6YjNKMFpXUXVZbVZrWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hVVTFNZ1BTQnBabVZzYzJVb1ZqUWdQVDBnWENJclhDSXNJRll5TENCV015a3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0ZZMkxDQldOU3dnVmpFc0lGUlRVeWxjYm1OdmJHNWhiV1Z6S0dkbGJtVXVWRk5UTG5SaUtTQThMU0JqS0Z3aVpXNXpaVzFpYkZ3aUxDQmNJbWRsYm1WY0lpd2dYQ0pqYUhKY0lpd2dYQ0pVVTFOY0lpbGNibHh1WjJWMFNXNXpkV3hoZEdsdmJsTmpiM0psSUR3dElHWjFibU4wYVc5dUtHTm9jaXdnVkZOVExDQnBibk5UWTI5eVpTNTBZaWw3WEc0Z0lIUmxiWEF1ZEdJZ1BDMGdhVzV6VTJOdmNtVXVkR0lnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWTJoeWIyMGdQVDBnWTJoeUxDQnpkR0Z5ZENBOElGUlRVeXdnWlc1a0lENGdWRk5US1Z4dUlDQnZkWFFnUEMwZ2RHVnRjQzUwWWlScGJuTjFiR0YwYVc5dVUyTnZjbVZjYmlBZ2FXWW9iR1Z1WjNSb0tHOTFkQ2tnUENBeEtYdGNiaUFnSUNCeVpYUjFjbTRvVGtFcFhHNGdJSDFsYkhObGUxeHVJQ0FnSUhKbGRIVnliaWgwWlcxd0xuUmlKR2x1YzNWc1lYUnBiMjVUWTI5eVpTbGNiaUFnZlZ4dWZWeHVYRzVuWlc1bExtbHVjMU5qYjNKbExtRnNiQ0E4TFNCblpXNWxMbFJUVXk1MFlpQWxQaVVnY205M2QybHpaU2dwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQnNiMmN5WDJsdWMxTmpiM0psWDBSTlUwOGdQU0JuWlhSSmJuTjFiR0YwYVc5dVUyTnZjbVVvWTJoeUxDQlVVMU1zSUdsdWMxTmpiM0psTGtSTlUwOHBMRnh1SUNCcGJuTlRZMjl5WlY5RVRWTlBJRDBnTWw1c2IyY3lYMmx1YzFOamIzSmxYMFJOVTA4c1hHNGdJR3h2WnpKZmFXNXpVMk52Y21WZlpGUkJSeUE5SUdkbGRFbHVjM1ZzWVhScGIyNVRZMjl5WlNoamFISXNJRlJUVXl3Z2FXNXpVMk52Y21VdVpGUkJSeWtzWEc0Z0lHbHVjMU5qYjNKbFgyUlVRVWNnUFNBeVhteHZaekpmYVc1elUyTnZjbVZmWkZSQlJ5eGNiaUFnWkdsbVpsOXBibk5UWTI5eVpTQTlJR2x1YzFOamIzSmxYMlJVUVVjZ0xTQnBibk5UWTI5eVpWOUVUVk5QS1Z4dVhHNWNibUJnWUNKOSAtLT5cblxuYGBgclxuZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMykpICU+JVxuICBkcGx5cjo6c2VsZWN0KFY2LCBWNSwgVjEsIFRTUylcbmNvbG5hbWVzKGdlbmUuVFNTLnRiKSA8LSBjKFxcZW5zZW1ibFxcLCBcXGdlbmVcXCwgXFxjaHJcXCwgXFxUU1NcXClcblxuZ2V0SW5zdWxhdGlvblNjb3JlIDwtIGZ1bmN0aW9uKGNociwgVFNTLCBpbnNTY29yZS50Yil7XG4gIHRlbXAudGIgPC0gaW5zU2NvcmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyb20gPT0gY2hyLCBzdGFydCA8IFRTUywgZW5kID4gVFNTKVxuICBvdXQgPC0gdGVtcC50YiRpbnN1bGF0aW9uU2NvcmVcbiAgaWYobGVuZ3RoKG91dCkgPCAxKXtcbiAgICByZXR1cm4oTkEpXG4gIH1lbHNle1xuICAgIHJldHVybih0ZW1wLnRiJGluc3VsYXRpb25TY29yZSlcbiAgfVxufVxuXG5nZW5lLmluc1Njb3JlLmFsbCA8LSBnZW5lLlRTUy50YiAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBsb2cyX2luc1Njb3JlX0RNU08gPSBnZXRJbnN1bGF0aW9uU2NvcmUoY2hyLCBUU1MsIGluc1Njb3JlLkRNU08pLFxuICBpbnNTY29yZV9ETVNPID0gMl5sb2cyX2luc1Njb3JlX0RNU08sXG4gIGxvZzJfaW5zU2NvcmVfZFRBRyA9IGdldEluc3VsYXRpb25TY29yZShjaHIsIFRTUywgaW5zU2NvcmUuZFRBRyksXG4gIGluc1Njb3JlX2RUQUcgPSAyXmxvZzJfaW5zU2NvcmVfZFRBRyxcbiAgZGlmZl9pbnNTY29yZSA9IGluc1Njb3JlX2RUQUcgLSBpbnNTY29yZV9ETVNPKVxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, V5, V1, TSS)
colnames(gene.TSS.tb) <- c(\ensembl\, \gene\, \chr\, \TSS\)

getInsulationScore <- function(chr, TSS, insScore.tb){
  temp.tb <- insScore.tb %>% dplyr::filter(chrom == chr, start < TSS, end > TSS)
  out <- temp.tb$insulationScore
  if(length(out) < 1){
    return(NA)
  }else{
    return(temp.tb$insulationScore)
  }
}

gene.insScore.all <- gene.TSS.tb %>% rowwise() %>% dplyr::mutate(
  log2_insScore_DMSO = getInsulationScore(chr, TSS, insScore.DMSO),
  insScore_DMSO = 2^log2_insScore_DMSO,
  log2_insScore_dTAG = getInsulationScore(chr, TSS, insScore.dTAG),
  insScore_dTAG = 2^log2_insScore_dTAG,
  diff_insScore = insScore_dTAG - insScore_DMSO)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVoyVnVaUzVVVTFNdWRHSWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y2JXMHhNRjlIVWtOdE16Z3VjRFpmWjJWdVpWOXpiM0owWldRdVltVmtYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaFVVMU1nUFNCcFptVnNjMlVvVmpRZ1BUMGdYRndyWEZ3c0lGWXlMQ0JXTXlrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLRlkyTENCV05Td2dWakVzSUZSVFV5bGNibU52Ykc1aGJXVnpLR2RsYm1VdVZGTlRMblJpS1NBOExTQmpLRnhjWlc1elpXMWliRnhjTENCY1hHZGxibVZjWEN3Z1hGeGphSEpjWEN3Z1hGeFVVMU5jWENsY2JseHVaMlYwU1c1emRXeGhkR2x2YmxOamIzSmxJRHd0SUdaMWJtTjBhVzl1S0dOb2Npd2dWRk5UTENCcGJuTlRZMjl5WlM1MFlpbDdYRzRnSUhSbGJYQXVkR0lnUEMwZ2FXNXpVMk52Y21VdWRHSWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9ZMmh5YjIwZ1BUMGdZMmh5TENCemRHRnlkQ0E4SUZSVFV5d2daVzVrSUQ0Z1ZGTlRLVnh1SUNCdmRYUWdQQzBnZEdWdGNDNTBZaVJwYm5OMWJHRjBhVzl1VTJOdmNtVmNiaUFnYVdZb2JHVnVaM1JvS0c5MWRDa2dQQ0F4S1h0Y2JpQWdJQ0J5WlhSMWNtNG9Ua0VwWEc0Z0lIMWxiSE5sZTF4dUlDQWdJSEpsZEhWeWJpaDBaVzF3TG5SaUpHbHVjM1ZzWVhScGIyNVRZMjl5WlNsY2JpQWdmVnh1ZlZ4dVhHNW5aVzVsTG1sdWMxTmpiM0psTG1Gc2JDQThMU0JuWlc1bExsUlRVeTUwWWlBbFBpVWdjbTkzZDJselpTZ3BJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNCc2IyY3lYMmx1YzFOamIzSmxYMFJOVTA4Z1BTQm5aWFJKYm5OMWJHRjBhVzl1VTJOdmNtVW9ZMmh5TENCVVUxTXNJR2x1YzFOamIzSmxMa1JOVTA4cExGeHVJQ0JwYm5OVFkyOXlaVjlFVFZOUElEMGdNbDVzYjJjeVgybHVjMU5qYjNKbFgwUk5VMDhzWEc0Z0lHeHZaekpmYVc1elUyTnZjbVZmWkZSQlJ5QTlJR2RsZEVsdWMzVnNZWFJwYjI1VFkyOXlaU2hqYUhJc0lGUlRVeXdnYVc1elUyTnZjbVV1WkZSQlJ5a3NYRzRnSUdsdWMxTmpiM0psWDJSVVFVY2dQU0F5WG14dlp6SmZhVzV6VTJOdmNtVmZaRlJCUnl4Y2JpQWdaR2xtWmw5cGJuTlRZMjl5WlNBOUlHbHVjMU5qYjNKbFgyUlVRVWNnTFNCcGJuTlRZMjl5WlY5RVRWTlBLVnh1WEc1Y2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWNiwgVjUsIFYxLCBUU1MpXG5jb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYyhcXGVuc2VtYmxcXCwgXFxnZW5lXFwsIFxcY2hyXFwsIFxcVFNTXFwpXG5cbmdldEluc3VsYXRpb25TY29yZSA8LSBmdW5jdGlvbihjaHIsIFRTUywgaW5zU2NvcmUudGIpe1xuICB0ZW1wLnRiIDwtIGluc1Njb3JlLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGNocm9tID09IGNociwgc3RhcnQgPCBUU1MsIGVuZCA+IFRTUylcbiAgb3V0IDwtIHRlbXAudGIkaW5zdWxhdGlvblNjb3JlXG4gIGlmKGxlbmd0aChvdXQpIDwgMSl7XG4gICAgcmV0dXJuKE5BKVxuICB9ZWxzZXtcbiAgICByZXR1cm4odGVtcC50YiRpbnN1bGF0aW9uU2NvcmUpXG4gIH1cbn1cblxuZ2VuZS5pbnNTY29yZS5hbGwgPC0gZ2VuZS5UU1MudGIgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShcbiAgbG9nMl9pbnNTY29yZV9ETVNPID0gZ2V0SW5zdWxhdGlvblNjb3JlKGNociwgVFNTLCBpbnNTY29yZS5ETVNPKSxcbiAgaW5zU2NvcmVfRE1TTyA9IDJebG9nMl9pbnNTY29yZV9ETVNPLFxuICBsb2cyX2luc1Njb3JlX2RUQUcgPSBnZXRJbnN1bGF0aW9uU2NvcmUoY2hyLCBUU1MsIGluc1Njb3JlLmRUQUcpLFxuICBpbnNTY29yZV9kVEFHID0gMl5sb2cyX2luc1Njb3JlX2RUQUcsXG4gIGRpZmZfaW5zU2NvcmUgPSBpbnNTY29yZV9kVEFHIC0gaW5zU2NvcmVfRE1TTylcblxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMykpICU+JVxuICBkcGx5cjo6c2VsZWN0KFY2LCBWNSwgVjEsIFRTUylcbmNvbG5hbWVzKGdlbmUuVFNTLnRiKSA8LSBjKFxcZW5zZW1ibFxcLCBcXGdlbmVcXCwgXFxjaHJcXCwgXFxUU1NcXClcblxuZ2V0SW5zdWxhdGlvblNjb3JlIDwtIGZ1bmN0aW9uKGNociwgVFNTLCBpbnNTY29yZS50Yil7XG4gIHRlbXAudGIgPC0gaW5zU2NvcmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyb20gPT0gY2hyLCBzdGFydCA8IFRTUywgZW5kID4gVFNTKVxuICBvdXQgPC0gdGVtcC50YiRpbnN1bGF0aW9uU2NvcmVcbiAgaWYobGVuZ3RoKG91dCkgPCAxKXtcbiAgICByZXR1cm4oTkEpXG4gIH1lbHNle1xuICAgIHJldHVybih0ZW1wLnRiJGluc3VsYXRpb25TY29yZSlcbiAgfVxufVxuXG5nZW5lLmluc1Njb3JlLmFsbCA8LSBnZW5lLlRTUy50YiAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBsb2cyX2luc1Njb3JlX0RNU08gPSBnZXRJbnN1bGF0aW9uU2NvcmUoY2hyLCBUU1MsIGluc1Njb3JlLkRNU08pLFxuICBpbnNTY29yZV9ETVNPID0gMl5sb2cyX2luc1Njb3JlX0RNU08sXG4gIGxvZzJfaW5zU2NvcmVfZFRBRyA9IGdldEluc3VsYXRpb25TY29yZShjaHIsIFRTUywgaW5zU2NvcmUuZFRBRyksXG4gIGluc1Njb3JlX2RUQUcgPSAyXmxvZzJfaW5zU2NvcmVfZFRBRyxcbiAgZGlmZl9pbnNTY29yZSA9IGluc1Njb3JlX2RUQUcgLSBpbnNTY29yZV9ETVNPKVxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, V5, V1, TSS)
colnames(gene.TSS.tb) <- c(\ensembl\, \gene\, \chr\, \TSS\)

getInsulationScore <- function(chr, TSS, insScore.tb){
  temp.tb <- insScore.tb %>% dplyr::filter(chrom == chr, start < TSS, end > TSS)
  out <- temp.tb$insulationScore
  if(length(out) < 1){
    return(NA)
  }else{
    return(temp.tb$insulationScore)
  }
}

gene.insScore.all <- gene.TSS.tb %>% rowwise() %>% dplyr::mutate(
  log2_insScore_DMSO = getInsulationScore(chr, TSS, insScore.DMSO),
  insScore_DMSO = 2^log2_insScore_DMSO,
  log2_insScore_dTAG = getInsulationScore(chr, TSS, insScore.dTAG),
  insScore_dTAG = 2^log2_insScore_dTAG,
  diff_insScore = insScore_dTAG - insScore_DMSO)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## [2.14] Looking deeper into TAD and insulation
### Insulation score of TSS?
#### Importing insulation score

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJKYlhCdmNuUnBibWNnVkVGRUlHSnZkVzVrWVhKcFpYTmNiblJoWkY5aWIzVnVaR0Z5ZVNBOExTQm1jbVZoWkNob1pYSmxLRndpTGk0dkxpNHZjbVZ6ZFd4MEwxUkJSRndpTENCY0lsUkJSRjh5Tld0aVh6RXlOV3RpWDI5MGMzVmZZbTkxYm1SaGNtbGxjMTlITVVSTlUwOHVZbVZrWENJcEtWeHVZMjlzYm1GdFpYTW9kR0ZrWDJKdmRXNWtZWEo1S1NBOExTQmpLRndpWTJoeVhDSXNJRndpYzNSaGNuUmNJaXdnWENKbGJtUmNJaWxjYm5SaFpGOWliM1Z1WkdGeWVTQThMU0IwWVdSZlltOTFibVJoY25rZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb2RHRmtYMmxrSUQwZ2NHRnpkR1VvWTJoeUxDQnpkR0Z5ZEN3Z1pXNWtMQ0J6WlhBZ1BTQmNJbDljSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05sYm5SbGNpQTlJQ2h6ZEdGeWRDQXJJR1Z1WkNrdk1pbGNibHh1Wm1sdVpFTnNiM05sYzNSVVFVUkNiM1Z1WkdGeWVTQThMU0JtZFc1amRHbHZiaWhqYUhKdmJTd2dWRk5UTENCMFlXUmZZbTkxYm1SaGNua3BlMXh1SUNCMFpXMXdJRHd0SUhSaFpGOWliM1Z1WkdGeWVTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaGphSElnUFQwZ1kyaHliMjBwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0JoWW5Nb1kyVnVkR1Z5SUMwZ1ZGTlRLU2tnSlQ0bFhHNGdJQ0FnYzJ4cFkyVmZiV2x1S0dScGMzUmhibU5sS1Z4dUlDQnBaaWh1Y205M0tIUmxiWEFwSUQwOUlERXBlMXh1SUNBZ0lDQWdjbVYwZFhKdUtIUmxiWEFrWTJWdWRHVnlLVnh1SUNCOVpXeHpaWHRjYmlBZ0lDQnlaWFIxY200b1RrRXBYRzRnSUgxY2JuMWNibHh1WEc1blpXNWxMbWx1YzFOamIzSmxMbUZzYkNBOExTQm5aVzVsTG1sdWMxTmpiM0psTG1Gc2JDQWxQaVVnY205M2QybHpaU2dwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHTnNiM05sYzNSQ2IzVnVaR0Z5ZVNBOUlHWnBibVJEYkc5elpYTjBWRUZFUW05MWJtUmhjbmtvWTJoeUxDQlVVMU1zSUhSaFpGOWliM1Z1WkdGeWVTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluTWw5aWIzVnVaR0Z5ZVVsdWMxTmpiM0psWDBSTlUwOGdQU0JuWlhSSmJuTjFiR0YwYVc5dVUyTnZjbVVvWTJoeUxDQmpiRzl6WlhOMFFtOTFibVJoY25rc0lHbHVjMU5qYjNKbExrUk5VMDhwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKdmRXNWtZWEo1U1c1elUyTnZjbVZmUkUxVFR5QTlJREplYkc5bk1sOWliM1Z1WkdGeWVVbHVjMU5qYjNKbFgwUk5VMDhzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5bk1sOWliM1Z1WkdGeWVVbHVjMU5qYjNKbFgyUlVRVWNnUFNCblpYUkpibk4xYkdGMGFXOXVVMk52Y21Vb1kyaHlMQ0JqYkc5elpYTjBRbTkxYm1SaGNua3NJR2x1YzFOamIzSmxMbVJVUVVjcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSnZkVzVrWVhKNVNXNXpVMk52Y21WZlpGUkJSeUE5SURKZWJHOW5NbDlpYjNWdVpHRnllVWx1YzFOamIzSmxYMlJVUVVjc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHbG1abDlpYjNWdVpHRnllVWx1YzFOamIzSmxJRDBnWW05MWJtUmhjbmxKYm5OVFkyOXlaVjlrVkVGSElDMGdZbTkxYm1SaGNubEpibk5UWTI5eVpWOUVUVk5QS1Z4dVhHNXpZWFpsVWtSVEtHZGxibVV1YVc1elUyTnZjbVV1WVd4c0xDQm9aWEpsS0hKbGMzVnNkRVJwY2l3Z1hDSm5aVzVsTG1sdWMxTmpiM0psTG1Gc2JDNXlaSE5jSWlrcFhHNW5aVzVsTG1sdWMxTmpiM0psTG1Gc2JDQThMU0J5WldGa1VrUlRLR2hsY21Vb2NtVnpkV3gwUkdseUxDQmNJbWRsYm1VdWFXNXpVMk52Y21VdVlXeHNMbkprYzF3aUtTbGNibUJnWUNKOSAtLT5cblxuYGBgclxuIyBJbXBvcnRpbmcgVEFEIGJvdW5kYXJpZXNcbnRhZF9ib3VuZGFyeSA8LSBmcmVhZChoZXJlKFxcLi4vLi4vcmVzdWx0L1RBRFxcLCBcXFRBRF8yNWtiXzEyNWtiX290c3VfYm91bmRhcmllc19HMURNU08uYmVkXFwpKVxuY29sbmFtZXModGFkX2JvdW5kYXJ5KSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnRhZF9ib3VuZGFyeSA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjptdXRhdGUodGFkX2lkID0gcGFzdGUoY2hyLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IChzdGFydCArIGVuZCkvMilcblxuZmluZENsb3Nlc3RUQURCb3VuZGFyeSA8LSBmdW5jdGlvbihjaHJvbSwgVFNTLCB0YWRfYm91bmRhcnkpe1xuICB0ZW1wIDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6OmZpbHRlcihjaHIgPT0gY2hyb20pICU+JVxuICAgIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBhYnMoY2VudGVyIC0gVFNTKSkgJT4lXG4gICAgc2xpY2VfbWluKGRpc3RhbmNlKVxuICBpZihucm93KHRlbXApID09IDEpe1xuICAgICAgcmV0dXJuKHRlbXAkY2VudGVyKVxuICB9ZWxzZXtcbiAgICByZXR1cm4oTkEpXG4gIH1cbn1cblxuXG5nZW5lLmluc1Njb3JlLmFsbCA8LSBnZW5lLmluc1Njb3JlLmFsbCAlPiUgcm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKGNsb3Nlc3RCb3VuZGFyeSA9IGZpbmRDbG9zZXN0VEFEQm91bmRhcnkoY2hyLCBUU1MsIHRhZF9ib3VuZGFyeSksXG4gICAgICAgICAgICAgICAgbG9nMl9ib3VuZGFyeUluc1Njb3JlX0RNU08gPSBnZXRJbnN1bGF0aW9uU2NvcmUoY2hyLCBjbG9zZXN0Qm91bmRhcnksIGluc1Njb3JlLkRNU08pLFxuICAgICAgICAgICAgICAgIGJvdW5kYXJ5SW5zU2NvcmVfRE1TTyA9IDJebG9nMl9ib3VuZGFyeUluc1Njb3JlX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nMl9ib3VuZGFyeUluc1Njb3JlX2RUQUcgPSBnZXRJbnN1bGF0aW9uU2NvcmUoY2hyLCBjbG9zZXN0Qm91bmRhcnksIGluc1Njb3JlLmRUQUcpLFxuICAgICAgICAgICAgICAgIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRyA9IDJebG9nMl9ib3VuZGFyeUluc1Njb3JlX2RUQUcsXG4gICAgICAgICAgICAgICAgZGlmZl9ib3VuZGFyeUluc1Njb3JlID0gYm91bmRhcnlJbnNTY29yZV9kVEFHIC0gYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuXG5zYXZlUkRTKGdlbmUuaW5zU2NvcmUuYWxsLCBoZXJlKHJlc3VsdERpciwgXFxnZW5lLmluc1Njb3JlLmFsbC5yZHNcXCkpXG5nZW5lLmluc1Njb3JlLmFsbCA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCBcXGdlbmUuaW5zU2NvcmUuYWxsLnJkc1xcKSlcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# Importing TAD boundaries
tad_boundary <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_boundaries_G1DMSO.bed\))
colnames(tad_boundary) <- c(\chr\, \start\, \end\)
tad_boundary <- tad_boundary %>% dplyr::mutate(tad_id = paste(chr, start, end, sep = \_\),
                                               center = (start + end)/2)

findClosestTADBoundary <- function(chrom, TSS, tad_boundary){
  temp <- tad_boundary %>% dplyr::filter(chr == chrom) %>%
    dplyr::mutate(distance = abs(center - TSS)) %>%
    slice_min(distance)
  if(nrow(temp) == 1){
      return(temp$center)
  }else{
    return(NA)
  }
}


gene.insScore.all <- gene.insScore.all %>% rowwise() %>%
  dplyr::mutate(closestBoundary = findClosestTADBoundary(chr, TSS, tad_boundary),
                log2_boundaryInsScore_DMSO = getInsulationScore(chr, closestBoundary, insScore.DMSO),
                boundaryInsScore_DMSO = 2^log2_boundaryInsScore_DMSO,
                log2_boundaryInsScore_dTAG = getInsulationScore(chr, closestBoundary, insScore.dTAG),
                boundaryInsScore_dTAG = 2^log2_boundaryInsScore_dTAG,
                diff_boundaryInsScore = boundaryInsScore_dTAG - boundaryInsScore_DMSO)

saveRDS(gene.insScore.all, here(resultDir, \gene.insScore.all.rds\))
gene.insScore.all <- readRDS(here(resultDir, \gene.insScore.all.rds\))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkpiWEJ2Y25ScGJtY2dWRUZFSUdKdmRXNWtZWEpwWlhOY2JuUmhaRjlpYjNWdVpHRnllU0E4TFNCbWNtVmhaQ2hvWlhKbEtGeGNMaTR2TGk0dmNtVnpkV3gwTDFSQlJGeGNMQ0JjWEZSQlJGOHlOV3RpWHpFeU5XdGlYMjkwYzNWZlltOTFibVJoY21sbGMxOUhNVVJOVTA4dVltVmtYRndwS1Z4dVkyOXNibUZ0WlhNb2RHRmtYMkp2ZFc1a1lYSjVLU0E4TFNCaktGeGNZMmh5WEZ3c0lGeGNjM1JoY25SY1hDd2dYRnhsYm1SY1hDbGNiblJoWkY5aWIzVnVaR0Z5ZVNBOExTQjBZV1JmWW05MWJtUmhjbmtnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvZEdGa1gybGtJRDBnY0dGemRHVW9ZMmh5TENCemRHRnlkQ3dnWlc1a0xDQnpaWEFnUFNCY1hGOWNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTmxiblJsY2lBOUlDaHpkR0Z5ZENBcklHVnVaQ2t2TWlsY2JseHVabWx1WkVOc2IzTmxjM1JVUVVSQ2IzVnVaR0Z5ZVNBOExTQm1kVzVqZEdsdmJpaGphSEp2YlN3Z1ZGTlRMQ0IwWVdSZlltOTFibVJoY25rcGUxeHVJQ0IwWlcxd0lEd3RJSFJoWkY5aWIzVnVaR0Z5ZVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loamFISWdQVDBnWTJoeWIyMHBJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb1pHbHpkR0Z1WTJVZ1BTQmhZbk1vWTJWdWRHVnlJQzBnVkZOVEtTa2dKVDRsWEc0Z0lDQWdjMnhwWTJWZmJXbHVLR1JwYzNSaGJtTmxLVnh1SUNCcFppaHVjbTkzS0hSbGJYQXBJRDA5SURFcGUxeHVJQ0FnSUNBZ2NtVjBkWEp1S0hSbGJYQWtZMlZ1ZEdWeUtWeHVJQ0I5Wld4elpYdGNiaUFnSUNCeVpYUjFjbTRvVGtFcFhHNGdJSDFjYm4xY2JseHVYRzVuWlc1bExtbHVjMU5qYjNKbExtRnNiQ0E4TFNCblpXNWxMbWx1YzFOamIzSmxMbUZzYkNBbFBpVWdjbTkzZDJselpTZ3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dOc2IzTmxjM1JDYjNWdVpHRnllU0E5SUdacGJtUkRiRzl6WlhOMFZFRkVRbTkxYm1SaGNua29ZMmh5TENCVVUxTXNJSFJoWkY5aWIzVnVaR0Z5ZVNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOW5NbDlpYjNWdVpHRnllVWx1YzFOamIzSmxYMFJOVTA4Z1BTQm5aWFJKYm5OMWJHRjBhVzl1VTJOdmNtVW9ZMmh5TENCamJHOXpaWE4wUW05MWJtUmhjbmtzSUdsdWMxTmpiM0psTGtSTlUwOHBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0p2ZFc1a1lYSjVTVzV6VTJOdmNtVmZSRTFUVHlBOUlESmViRzluTWw5aWIzVnVaR0Z5ZVVsdWMxTmpiM0psWDBSTlUwOHNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluTWw5aWIzVnVaR0Z5ZVVsdWMxTmpiM0psWDJSVVFVY2dQU0JuWlhSSmJuTjFiR0YwYVc5dVUyTnZjbVVvWTJoeUxDQmpiRzl6WlhOMFFtOTFibVJoY25rc0lHbHVjMU5qYjNKbExtUlVRVWNwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKdmRXNWtZWEo1U1c1elUyTnZjbVZmWkZSQlJ5QTlJREplYkc5bk1sOWliM1Z1WkdGeWVVbHVjMU5qYjNKbFgyUlVRVWNzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsbVpsOWliM1Z1WkdGeWVVbHVjMU5qYjNKbElEMGdZbTkxYm1SaGNubEpibk5UWTI5eVpWOWtWRUZISUMwZ1ltOTFibVJoY25sSmJuTlRZMjl5WlY5RVRWTlBLVnh1WEc1ellYWmxVa1JUS0dkbGJtVXVhVzV6VTJOdmNtVXVZV3hzTENCb1pYSmxLSEpsYzNWc2RFUnBjaXdnWEZ4blpXNWxMbWx1YzFOamIzSmxMbUZzYkM1eVpITmNYQ2twWEc1blpXNWxMbWx1YzFOamIzSmxMbUZzYkNBOExTQnlaV0ZrVWtSVEtHaGxjbVVvY21WemRXeDBSR2x5TENCY1hHZGxibVV1YVc1elUyTnZjbVV1WVd4c0xuSmtjMXhjS1NsY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbiMgSW1wb3J0aW5nIFRBRCBib3VuZGFyaWVzXG50YWRfYm91bmRhcnkgPC0gZnJlYWQoaGVyZShcXC4uLy4uL3Jlc3VsdC9UQURcXCwgXFxUQURfMjVrYl8xMjVrYl9vdHN1X2JvdW5kYXJpZXNfRzFETVNPLmJlZFxcKSlcbmNvbG5hbWVzKHRhZF9ib3VuZGFyeSkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG50YWRfYm91bmRhcnkgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6bXV0YXRlKHRhZF9pZCA9IHBhc3RlKGNociwgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSAoc3RhcnQgKyBlbmQpLzIpXG5cbmZpbmRDbG9zZXN0VEFEQm91bmRhcnkgPC0gZnVuY3Rpb24oY2hyb20sIFRTUywgdGFkX2JvdW5kYXJ5KXtcbiAgdGVtcCA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyID09IGNocm9tKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gYWJzKGNlbnRlciAtIFRTUykpICU+JVxuICAgIHNsaWNlX21pbihkaXN0YW5jZSlcbiAgaWYobnJvdyh0ZW1wKSA9PSAxKXtcbiAgICAgIHJldHVybih0ZW1wJGNlbnRlcilcbiAgfWVsc2V7XG4gICAgcmV0dXJuKE5BKVxuICB9XG59XG5cblxuZ2VuZS5pbnNTY29yZS5hbGwgPC0gZ2VuZS5pbnNTY29yZS5hbGwgJT4lIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShjbG9zZXN0Qm91bmRhcnkgPSBmaW5kQ2xvc2VzdFRBREJvdW5kYXJ5KGNociwgVFNTLCB0YWRfYm91bmRhcnkpLFxuICAgICAgICAgICAgICAgIGxvZzJfYm91bmRhcnlJbnNTY29yZV9ETVNPID0gZ2V0SW5zdWxhdGlvblNjb3JlKGNociwgY2xvc2VzdEJvdW5kYXJ5LCBpbnNTY29yZS5ETVNPKSxcbiAgICAgICAgICAgICAgICBib3VuZGFyeUluc1Njb3JlX0RNU08gPSAyXmxvZzJfYm91bmRhcnlJbnNTY29yZV9ETVNPLFxuICAgICAgICAgICAgICAgIGxvZzJfYm91bmRhcnlJbnNTY29yZV9kVEFHID0gZ2V0SW5zdWxhdGlvblNjb3JlKGNociwgY2xvc2VzdEJvdW5kYXJ5LCBpbnNTY29yZS5kVEFHKSxcbiAgICAgICAgICAgICAgICBib3VuZGFyeUluc1Njb3JlX2RUQUcgPSAyXmxvZzJfYm91bmRhcnlJbnNTY29yZV9kVEFHLFxuICAgICAgICAgICAgICAgIGRpZmZfYm91bmRhcnlJbnNTY29yZSA9IGJvdW5kYXJ5SW5zU2NvcmVfZFRBRyAtIGJvdW5kYXJ5SW5zU2NvcmVfRE1TTylcblxuc2F2ZVJEUyhnZW5lLmluc1Njb3JlLmFsbCwgaGVyZShyZXN1bHREaXIsIFxcZ2VuZS5pbnNTY29yZS5hbGwucmRzXFwpKVxuZ2VuZS5pbnNTY29yZS5hbGwgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lLmluc1Njb3JlLmFsbC5yZHNcXCkpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBJbXBvcnRpbmcgVEFEIGJvdW5kYXJpZXNcbnRhZF9ib3VuZGFyeSA8LSBmcmVhZChoZXJlKFxcLi4vLi4vcmVzdWx0L1RBRFxcLCBcXFRBRF8yNWtiXzEyNWtiX290c3VfYm91bmRhcmllc19HMURNU08uYmVkXFwpKVxuY29sbmFtZXModGFkX2JvdW5kYXJ5KSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnRhZF9ib3VuZGFyeSA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjptdXRhdGUodGFkX2lkID0gcGFzdGUoY2hyLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IChzdGFydCArIGVuZCkvMilcblxuZmluZENsb3Nlc3RUQURCb3VuZGFyeSA8LSBmdW5jdGlvbihjaHJvbSwgVFNTLCB0YWRfYm91bmRhcnkpe1xuICB0ZW1wIDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6OmZpbHRlcihjaHIgPT0gY2hyb20pICU+JVxuICAgIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBhYnMoY2VudGVyIC0gVFNTKSkgJT4lXG4gICAgc2xpY2VfbWluKGRpc3RhbmNlKVxuICBpZihucm93KHRlbXApID09IDEpe1xuICAgICAgcmV0dXJuKHRlbXAkY2VudGVyKVxuICB9ZWxzZXtcbiAgICByZXR1cm4oTkEpXG4gIH1cbn1cblxuXG5nZW5lLmluc1Njb3JlLmFsbCA8LSBnZW5lLmluc1Njb3JlLmFsbCAlPiUgcm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKGNsb3Nlc3RCb3VuZGFyeSA9IGZpbmRDbG9zZXN0VEFEQm91bmRhcnkoY2hyLCBUU1MsIHRhZF9ib3VuZGFyeSksXG4gICAgICAgICAgICAgICAgbG9nMl9ib3VuZGFyeUluc1Njb3JlX0RNU08gPSBnZXRJbnN1bGF0aW9uU2NvcmUoY2hyLCBjbG9zZXN0Qm91bmRhcnksIGluc1Njb3JlLkRNU08pLFxuICAgICAgICAgICAgICAgIGJvdW5kYXJ5SW5zU2NvcmVfRE1TTyA9IDJebG9nMl9ib3VuZGFyeUluc1Njb3JlX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nMl9ib3VuZGFyeUluc1Njb3JlX2RUQUcgPSBnZXRJbnN1bGF0aW9uU2NvcmUoY2hyLCBjbG9zZXN0Qm91bmRhcnksIGluc1Njb3JlLmRUQUcpLFxuICAgICAgICAgICAgICAgIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRyA9IDJebG9nMl9ib3VuZGFyeUluc1Njb3JlX2RUQUcsXG4gICAgICAgICAgICAgICAgZGlmZl9ib3VuZGFyeUluc1Njb3JlID0gYm91bmRhcnlJbnNTY29yZV9kVEFHIC0gYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuXG5zYXZlUkRTKGdlbmUuaW5zU2NvcmUuYWxsLCBoZXJlKHJlc3VsdERpciwgXFxnZW5lLmluc1Njb3JlLmFsbC5yZHNcXCkpXG5nZW5lLmluc1Njb3JlLmFsbCA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCBcXGdlbmUuaW5zU2NvcmUuYWxsLnJkc1xcKSlcbmBgYFxuYGBgIn0= -->

```r
```r
# Importing TAD boundaries
tad_boundary <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_boundaries_G1DMSO.bed\))
colnames(tad_boundary) <- c(\chr\, \start\, \end\)
tad_boundary <- tad_boundary %>% dplyr::mutate(tad_id = paste(chr, start, end, sep = \_\),
                                               center = (start + end)/2)

findClosestTADBoundary <- function(chrom, TSS, tad_boundary){
  temp <- tad_boundary %>% dplyr::filter(chr == chrom) %>%
    dplyr::mutate(distance = abs(center - TSS)) %>%
    slice_min(distance)
  if(nrow(temp) == 1){
      return(temp$center)
  }else{
    return(NA)
  }
}


gene.insScore.all <- gene.insScore.all %>% rowwise() %>%
  dplyr::mutate(closestBoundary = findClosestTADBoundary(chr, TSS, tad_boundary),
                log2_boundaryInsScore_DMSO = getInsulationScore(chr, closestBoundary, insScore.DMSO),
                boundaryInsScore_DMSO = 2^log2_boundaryInsScore_DMSO,
                log2_boundaryInsScore_dTAG = getInsulationScore(chr, closestBoundary, insScore.dTAG),
                boundaryInsScore_dTAG = 2^log2_boundaryInsScore_dTAG,
                diff_boundaryInsScore = boundaryInsScore_dTAG - boundaryInsScore_DMSO)

saveRDS(gene.insScore.all, here(resultDir, \gene.insScore.all.rds\))
gene.insScore.all <- readRDS(here(resultDir, \gene.insScore.all.rds\))
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Linking to gene

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhDSXBLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNaTUwYzNaY0lpa3BKR2RsYm1WY2JseHVYRzVuWlc1bExtbHVjMU5qYjNKbElEd3RJR2RsYm1VdWFXNXpVMk52Y21VdVlXeHNJQ1UrSlNCeWIzZDNhWE5sS0NrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1hHNGdJR2R5YjNWd0lEMGdhV1psYkhObEtHVnVjMlZ0WW13Z0pXbHVKU0JuY205MWNERXNJRndpWjNKdmRYQXhYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEF5TENCY0ltZHliM1Z3TWx3aUxDQk9RU2twS1NBbFBpVWdYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9JV2x6TG01aEtHZHliM1Z3S1NsY2JseHVYRzVuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpQWdaR2x6ZEdGdVkyVXhJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlaM0p2ZFhBeEtTQXBKSE5qYjNKbFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQV2R5YjNWd01pa2dLU1J6WTI5eVpWeHVJQ0IzYVd3Z1BDMGdkMmxzWTI5NExuUmxjM1FvWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcFhHNGdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYm4xY2JseHVYRzV3Ykc5MFgybHVjMU5qYjNKbElEd3RJR1oxYm1OMGFXOXVLSFJsYlhBdWRHSXNJRzV2ZEdVc0lIbHRhVzRnUFNBdE1TNDFMQ0I1YldGNElEMGdNQ2w3WEc0Z0lIQXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGd2laM0p2ZFhBeFhDSXNJRndpWjNKdmRYQXlYQ0lwTENBMUtWeHVJQ0JjYmlBZ2NDQThMU0JuWjNCc2IzUW9kR1Z0Y0M1MFlpd2dZV1Z6S0hnZ1BTQmNJaTVjSWl3Z1ptbHNiQ0E5SUdkeWIzVndMQ0I1SUQwZ0xYTmpiM0psS1NrZ0t5QmNiaUFnSUNCc1lXSnpLSGdnUFNCT1ZVeE1MQ0I1SUQwZ1hDSXRJRWx1YzNWc1lYUnBiMjRnYzJOdmNtVmNJaWtnS3lBZ0l5QlNaVzF2ZG1VZ2VDMWhlR2x6SUhScGRHeGxYRzRnSUNBZ2MyTmhiR1ZmWm1sc2JGOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ2NtVjJLQ2hqS0Z3aUl6YzNOemMzTjF3aUxDQmNJaU5HTWpoRk1rTmNJaWtwS1NrZ0sxeHVYRzRnSUNBZ2FXNTBjbTlrWVhSaGRtbDZPanBuWlc5dFgzTndiR2wwWDNacGIyeHBiaWhzYVc1bGQybGtkR2dnUFNCc2FXNWxUV1ZrYVhWdElDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0ZzY0doaElEMGdMalFwSUN0Y2JpQWdJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqTXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxUV1ZrYVhWdElDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJMQ0FnWVd4d2FHRWdQU0F3TGpZc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3RjYmlBZ0lDQnpkR0YwWDNOMWJXMWhjbmtvWEc0Z0lDQWdJQ0JoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnSUNCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01DNDFMRnh1SUNBZ0lDQWdabWxzYkNBOUlGd2lZbXhoWTJ0Y0lpd2dZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJSEJ2YzJsMGFXOXVJRDBnY0c5emFYUnBiMjVmWkc5a1oyVW9Mak1wWEc0Z0lDQWdLU0FyWEc0Z0lDQWdYRzRnSUNBZ0l5QmNiaUFnSUNBaklHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnWjNKdmRYQXBMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXdnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENJc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnWEc0Z0lDQWdJeUJuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXdnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENJc1hHNGdJQ0FnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdiM1YwYkdsbGNpNXphWHBsSUQwZ01Td2diM1YwYkdsbGNpNXpkSEp2YTJVZ1BTQk9RU2tnSzF4dUlDQWdJQ01nYzNSaGRGOXpkVzF0WVhKNUtHRmxjeWhuY205MWNDQTlJR2R5YjNWd0tTd2dablZ1SUQwZ2JXVmhiaXdnWjJWdmJTQTlJRndpY0c5cGJuUmNJaXdnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURFc0lHWnBiR3dnUFNCY0luSmxaRndpTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWlrZ0t5QmNiaUFnSUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwS1NBclhHNGdJQ0FnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLSGx0YVc0c0lIbHRZWGdwS1NBclhHNGdJQ0FnWVc1dWIzUmhkR1VvWENKMFpYaDBYQ0lzSUhnZ1BTQXhMQ0I1SUQwZ2VXMXBiaUFySURFc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z3aWNERXlPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNVElwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXdnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTXlrZ0sxeHVJQ0FnSUhSb1pXMWxLRnh1SUNBZ0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTeGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTeGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0JoYm1kc1pTQTlJRFExTENBZ0lDQWdJQ01nVW05MFlYUmxJSGd0WVhocGN5QnNZV0psYkhNZ05EVWdaR1ZuY21WbGMxeHVJQ0FnSUNBZ2FHcDFjM1FnUFNBeExDQWdJQ0FnSUNBaklFRmthblZ6ZENCb2IzSnBlbTl1ZEdGc0lHcDFjM1JwWm1sallYUnBiMjVjYmlBZ0lDQWdJSFpxZFhOMElEMGdNU0FnSUNBZ0lDQWdJeUJCWkdwMWMzUWdkbVZ5ZEdsallXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1c2FXNWxJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdsamEzTWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYQ0owY21GdWMzQmhjbVZ1ZEZ3aUtTeGNiaUFnSUNCc1pXZGxibVF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnYkdWblpXNWtMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1Z4dUlDQWdJQ2tySUNBZ1ozVnBaR1Z6S0Z4dUlDQWdJQ0FnWm1sc2JDQTlJR2QxYVdSbFgyeGxaMlZ1WkNoY2JpQWdJQ0FnSUNBZ2EyVjVkMmxrZEdnZ1BTQXdMaklzSUNBaklFRmthblZ6ZENCMGFHVWdkMmxrZEdnZ2IyWWdkR2hsSUd4bFoyVnVaQ0JyWlhselhHNGdJQ0FnSUNBZ0lHdGxlV2hsYVdkb2RDQTlJREF1TWlBZ0l5QkJaR3AxYzNRZ2RHaGxJR2hsYVdkb2RDQnZaaUIwYUdVZ2JHVm5aVzVrSUd0bGVYTmNiaUFnSUNBZ0lDa3BYRzRnSUNBZ0lDQmNiaUFnSUNBZ0lGeHVJQ0JtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKcGJuTjFiR0YwYVc5dVgzTmpiM0psWDJKcGJtRnllVWR5YjNWd1gxd2lMQ0J1YjNSbEtWeHVJQ0IzYVdSMGFDQThMU0J3WVc1bGJGTnBlbVVvTVM0MU5Ta3FiVzFVYjBsdVkyaGNibWhsYVdkb2RDQThMU0J3WVc1bGJGTnBlbVVvTVM0eUtTcHRiVlJ2U1c1amFGeHVJQ0J3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dUlDQnpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVmVnh1WEc0aklFUk5VMDljYm5SbGJYQXVkR0lnUEMwZ1oyVnVaUzVwYm5OVFkyOXlaU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2huY205MWNDd2dZbTkxYm1SaGNubEpibk5UWTI5eVpWOUVUVk5QS1Z4dVkyOXNibUZ0WlhNb2RHVnRjQzUwWWlrZ1BDMGdZeWhjSW1keWIzVndYQ0lzSUZ3aWMyTnZjbVZjSWlsY2JuQnNiM1JmYVc1elUyTnZjbVVvZEdWdGNDNTBZaXdnWENKdVpXRnlaWE4wUW05MWJtUmhjbmxmUkUxVFQxOWlhVzVoY25sSGNtOTFjRndpTENCNWJXbHVJRDBnTFRFdU1Td2dlVzFoZUNBOUlDMHdMalVwWEc1Y2JpTWdaRlJCUjF4dWRHVnRjQzUwWWlBOExTQm5aVzVsTG1sdWMxTmpiM0psSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dkeWIzVndMQ0JpYjNWdVpHRnllVWx1YzFOamIzSmxYMlJVUVVjcFhHNWpiMnh1WVcxbGN5aDBaVzF3TG5SaUtTQThMU0JqS0Z3aVozSnZkWEJjSWl3Z1hDSnpZMjl5WlZ3aUtWeHVjR3h2ZEY5cGJuTlRZMjl5WlNoMFpXMXdMblJpTENCY0ltNWxZWEpsYzNSQ2IzVnVaR0Z5ZVY5a1ZFRkhYMkpwYm1GeWVVZHliM1Z3WENJc0lIbHRhVzRnUFNBZ0xURXVNU3dnZVcxaGVDQTlJQzB3TGpVcFhHNWNiaU1nWkdsbVpseHVkR1Z0Y0M1MFlpQThMU0JuWlc1bExtbHVjMU5qYjNKbElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHZHliM1Z3TENCa2FXWm1YMkp2ZFc1a1lYSjVTVzV6VTJOdmNtVXBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xuUmlLU0E4TFNCaktGd2laM0p2ZFhCY0lpd2dYQ0p6WTI5eVpWd2lLVnh1Y0d4dmRGOXBibk5UWTI5eVpTaDBaVzF3TG5SaUxDQmNJbTVsWVhKbGMzUkNiM1Z1WkdGeWVWOWthV1ptWDJKcGJtRnllVWR5YjNWd1hDSXNJSGx0YVc0Z1BTQXRNQzR6TENCNWJXRjRJRDBnTUM0eEtWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLmluc1Njb3JlIDwtIGdlbmUuaW5zU2NvcmUuYWxsICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAyLCBcXGdyb3VwMlxcLCBOQSkpKSAlPiUgXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X2luc1Njb3JlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAtMS41LCB5bWF4ID0gMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBcXC5cXCwgZmlsbCA9IGdyb3VwLCB5ID0gLXNjb3JlKSkgKyBcbiAgICBsYWJzKHggPSBOVUxMLCB5ID0gXFwtIEluc3VsYXRpb24gc2NvcmVcXCkgKyAgIyBSZW1vdmUgeC1heGlzIHRpdGxlXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcmV2KChjKFxcIzc3Nzc3N1xcLCBcXCNGMjhFMkNcXCkpKSkgK1xuXG4gICAgaW50cm9kYXRhdml6OjpnZW9tX3NwbGl0X3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gLjQpICtcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICAgKSArXG4gICAgXG4gICAgIyBcbiAgICAjIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBjb2xvciA9IFxcYmxhY2tcXCwgbGluZXdpZHRoID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgIyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsICBjb2xvciA9IFxcYmxhY2tcXCwgbGluZXdpZHRoID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgIyAgICAgICAgICAgICAgb3V0bGllci5zaXplID0gMSwgb3V0bGllci5zdHJva2UgPSBOQSkgK1xuICAgICMgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgKyBcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0KSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpKSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICAgIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgICkrICAgZ3VpZGVzKFxuICAgICAgZmlsbCA9IGd1aWRlX2xlZ2VuZChcbiAgICAgICAga2V5d2lkdGggPSAwLjIsICAjIEFkanVzdCB0aGUgd2lkdGggb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgICAgIGtleWhlaWdodCA9IDAuMiAgIyBBZGp1c3QgdGhlIGhlaWdodCBvZiB0aGUgbGVnZW5kIGtleXNcbiAgICAgICkpXG4gICAgICBcbiAgICAgIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxpbnN1bGF0aW9uX3Njb3JlX2JpbmFyeUdyb3VwX1xcLCBub3RlKVxuICB3aWR0aCA8LSBwYW5lbFNpemUoMS41NSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIERNU09cbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfRE1TT19iaW5hcnlHcm91cFxcLCB5bWluID0gLTEuMSwgeW1heCA9IC0wLjUpXG5cbiMgZFRBR1xudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBib3VuZGFyeUluc1Njb3JlX2RUQUcpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kVEFHX2JpbmFyeUdyb3VwXFwsIHltaW4gPSAgLTEuMSwgeW1heCA9IC0wLjUpXG5cbiMgZGlmZlxudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kaWZmX2JpbmFyeUdyb3VwXFwsIHltaW4gPSAtMC4zLCB5bWF4ID0gMC4xKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.insScore <- gene.insScore.all %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\, NA))) %>% 
  dplyr::filter(!is.na(group))


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$score
  distance2 <- (data %>% dplyr::filter(group ==group2) )$score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_insScore <- function(temp.tb, note, ymin = -1.5, ymax = 0){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = \.\, fill = group, y = -score)) + 
    labs(x = NULL, y = \- Insulation score\) +  # Remove x-axis title
    scale_fill_manual(values = rev((c(\#777777\, \#F28E2C\)))) +

    introdataviz::geom_split_violin(linewidth = lineMedium * mmToLineUnit, lineend = \square\,
                                    alpha = .4) +
    geom_boxplot(width = 0.3, color = \black\,
                 linewidth = lineMedium * mmToLineUnit, lineend = \square\,
                 outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + theme_classic() +
    stat_summary(
      aes(group = group), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) +
    
    # 
    # geom_violin(aes(fill = group), color = \black\, linewidth = lineThick*mmToLineUnit, lineend = \square\, show.legend = FALSE) + 
    # geom_boxplot(width = 0.1,  color = \black\, linewidth = lineThick*mmToLineUnit, lineend = \square\,
    #              outlier.size = 1, outlier.stroke = NA) +
    # stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 1, fill = \red\, color = \black\) + 
    geom_hline(yintercept = 0, linewidth = lineThick*mmToLineUnit) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p12: \, convPvalue(p12)),
             color = \black\, hjust = 0, size = 3) +
    theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )+   guides(
      fill = guide_legend(
        keywidth = 0.2,  # Adjust the width of the legend keys
        keyheight = 0.2  # Adjust the height of the legend keys
      ))
      
      
  fileName <- paste0(\insulation_score_binaryGroup_\, note)
  width <- panelSize(1.55)*mmToInch
height <- panelSize(1.2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO_binaryGroup\, ymin = -1.1, ymax = -0.5)

# dTAG
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_dTAG)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_dTAG_binaryGroup\, ymin =  -1.1, ymax = -0.5)

# diff
temp.tb <- gene.insScore %>% dplyr::select(group, diff_boundaryInsScore)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_diff_binaryGroup\, ymin = -0.3, ymax = 0.1)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNERXVkSE4yWEZ3cEtTUm5aVzVsWEc1bmNtOTFjRElnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJKcGJtRnllVWR5YjNWd01pNTBjM1pjWENrcEpHZGxibVZjYmx4dVhHNW5aVzVsTG1sdWMxTmpiM0psSUR3dElHZGxibVV1YVc1elUyTnZjbVV1WVd4c0lDVStKU0J5YjNkM2FYTmxLQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lHZHliM1Z3SUQwZ2FXWmxiSE5sS0dWdWMyVnRZbXdnSldsdUpTQm5jbTkxY0RFc0lGeGNaM0p2ZFhBeFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnWjNKdmRYQXlMQ0JjWEdkeWIzVndNbHhjTENCT1FTa3BLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcG1hV3gwWlhJb0lXbHpMbTVoS0dkeWIzVndLU2xjYmx4dVhHNW5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOVozSnZkWEF4S1NBcEpITmpiM0psWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TWlrZ0tTUnpZMjl5WlZ4dUlDQjNhV3dnUEMwZ2QybHNZMjk0TG5SbGMzUW9aR2x6ZEdGdVkyVXhMQ0JrYVhOMFlXNWpaVElwWEc0Z0lISmxkSFZ5YmloM2FXd2tjQzUyWVd4MVpTbGNibjFjYmx4dVhHNXdiRzkwWDJsdWMxTmpiM0psSUR3dElHWjFibU4wYVc5dUtIUmxiWEF1ZEdJc0lHNXZkR1VzSUhsdGFXNGdQU0F0TVM0MUxDQjViV0Y0SUQwZ01DbDdYRzRnSUhBeE1pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ4Y1ozSnZkWEF4WEZ3c0lGeGNaM0p2ZFhBeVhGd3BMQ0ExS1Z4dUlDQmNiaUFnY0NBOExTQm5aM0JzYjNRb2RHVnRjQzUwWWl3Z1lXVnpLSGdnUFNCY1hDNWNYQ3dnWm1sc2JDQTlJR2R5YjNWd0xDQjVJRDBnTFhOamIzSmxLU2tnS3lCY2JpQWdJQ0JzWVdKektIZ2dQU0JPVlV4TUxDQjVJRDBnWEZ3dElFbHVjM1ZzWVhScGIyNGdjMk52Y21WY1hDa2dLeUFnSXlCU1pXMXZkbVVnZUMxaGVHbHpJSFJwZEd4bFhHNGdJQ0FnYzJOaGJHVmZabWxzYkY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnY21WMktDaGpLRnhjSXpjM056YzNOMXhjTENCY1hDTkdNamhGTWtOY1hDa3BLU2tnSzF4dVhHNGdJQ0FnYVc1MGNtOWtZWFJoZG1sNk9qcG5aVzl0WDNOd2JHbDBYM1pwYjJ4cGJpaHNhVzVsZDJsa2RHZ2dQU0JzYVc1bFRXVmthWFZ0SUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnNjR2hoSUQwZ0xqUXBJQ3RjYmlBZ0lDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpNc0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFRXVmthWFZ0SUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QkxDQWdZV3h3YUdFZ1BTQXdMallzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDdGNiaUFnSUNCemRHRjBYM04xYlcxaGNua29YRzRnSUNBZ0lDQmhaWE1vWjNKdmRYQWdQU0JuY205MWNDa3NJR1oxYmlBOUlHMWxZVzRzWEc0Z0lDQWdJQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTUM0MUxGeHVJQ0FnSUNBZ1ptbHNiQ0E5SUZ4Y1lteGhZMnRjWEN3Z1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lIQnZjMmwwYVc5dUlEMGdjRzl6YVhScGIyNWZaRzlrWjJVb0xqTXBYRzRnSUNBZ0tTQXJYRzRnSUNBZ1hHNGdJQ0FnSXlCY2JpQWdJQ0FqSUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdaM0p2ZFhBcExDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDd2diR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRndzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUNBZ0l5Qm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDd2diR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRndzWEc0Z0lDQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ2IzVjBiR2xsY2k1emFYcGxJRDBnTVN3Z2IzVjBiR2xsY2k1emRISnZhMlVnUFNCT1FTa2dLMXh1SUNBZ0lDTWdjM1JoZEY5emRXMXRZWEo1S0dGbGN5aG5jbTkxY0NBOUlHZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpd2daMlZ2YlNBOUlGeGNjRzlwYm5SY1hDd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJREVzSUdacGJHd2dQU0JjWEhKbFpGeGNMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ2tnS3lCY2JpQWdJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBLU0FyWEc0Z0lDQWdkR2hsYldWZlkyeGhjM05wWXlncElDc2dZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktIbHRhVzRzSUhsdFlYZ3BLU0FyWEc0Z0lDQWdZVzV1YjNSaGRHVW9YRngwWlhoMFhGd3NJSGdnUFNBeExDQjVJRDBnZVcxcGJpQXJJREVzSUd4aFltVnNJRDBnY0dGemRHVXdLRnhjY0RFeU9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod01USXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNeWtnSzF4dUlDQWdJSFJvWlcxbEtGeHVJQ0FnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQmhibWRzWlNBOUlEUTFMQ0FnSUNBZ0lDTWdVbTkwWVhSbElIZ3RZWGhwY3lCc1lXSmxiSE1nTkRVZ1pHVm5jbVZsYzF4dUlDQWdJQ0FnYUdwMWMzUWdQU0F4TENBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0JvYjNKcGVtOXVkR0ZzSUdwMWMzUnBabWxqWVhScGIyNWNiaUFnSUNBZ0lIWnFkWE4wSUQwZ01TQWdJQ0FnSUNBZ0l5QkJaR3AxYzNRZ2RtVnlkR2xqWVd3Z2FuVnpkR2xtYVdOaGRHbHZibHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hGeDBjbUZ1YzNCaGNtVnVkRnhjS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdiR1ZuWlc1a0xuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLVnh1SUNBZ0lDa3JJQ0FnWjNWcFpHVnpLRnh1SUNBZ0lDQWdabWxzYkNBOUlHZDFhV1JsWDJ4bFoyVnVaQ2hjYmlBZ0lDQWdJQ0FnYTJWNWQybGtkR2dnUFNBd0xqSXNJQ0FqSUVGa2FuVnpkQ0IwYUdVZ2QybGtkR2dnYjJZZ2RHaGxJR3hsWjJWdVpDQnJaWGx6WEc0Z0lDQWdJQ0FnSUd0bGVXaGxhV2RvZENBOUlEQXVNaUFnSXlCQlpHcDFjM1FnZEdobElHaGxhV2RvZENCdlppQjBhR1VnYkdWblpXNWtJR3RsZVhOY2JpQWdJQ0FnSUNrcFhHNGdJQ0FnSUNCY2JpQWdJQ0FnSUZ4dUlDQm1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhwYm5OMWJHRjBhVzl1WDNOamIzSmxYMkpwYm1GeWVVZHliM1Z3WDF4Y0xDQnViM1JsS1Z4dUlDQjNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NUzQxTlNrcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzR5S1NwdGJWUnZTVzVqYUZ4dUlDQndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dWZWeHVYRzRqSUVSTlUwOWNiblJsYlhBdWRHSWdQQzBnWjJWdVpTNXBibk5UWTI5eVpTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaG5jbTkxY0N3Z1ltOTFibVJoY25sSmJuTlRZMjl5WlY5RVRWTlBLVnh1WTI5c2JtRnRaWE1vZEdWdGNDNTBZaWtnUEMwZ1l5aGNYR2R5YjNWd1hGd3NJRnhjYzJOdmNtVmNYQ2xjYm5Cc2IzUmZhVzV6VTJOdmNtVW9kR1Z0Y0M1MFlpd2dYRnh1WldGeVpYTjBRbTkxYm1SaGNubGZSRTFUVDE5aWFXNWhjbmxIY205MWNGeGNMQ0I1YldsdUlEMGdMVEV1TVN3Z2VXMWhlQ0E5SUMwd0xqVXBYRzVjYmlNZ1pGUkJSMXh1ZEdWdGNDNTBZaUE4TFNCblpXNWxMbWx1YzFOamIzSmxJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR2R5YjNWd0xDQmliM1Z1WkdGeWVVbHVjMU5qYjNKbFgyUlVRVWNwWEc1amIyeHVZVzFsY3loMFpXMXdMblJpS1NBOExTQmpLRnhjWjNKdmRYQmNYQ3dnWEZ4elkyOXlaVnhjS1Z4dWNHeHZkRjlwYm5OVFkyOXlaU2gwWlcxd0xuUmlMQ0JjWEc1bFlYSmxjM1JDYjNWdVpHRnllVjlrVkVGSFgySnBibUZ5ZVVkeWIzVndYRndzSUhsdGFXNGdQU0FnTFRFdU1Td2dlVzFoZUNBOUlDMHdMalVwWEc1Y2JpTWdaR2xtWmx4dWRHVnRjQzUwWWlBOExTQm5aVzVsTG1sdWMxTmpiM0psSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dkeWIzVndMQ0JrYVdabVgySnZkVzVrWVhKNVNXNXpVMk52Y21VcFhHNWpiMnh1WVcxbGN5aDBaVzF3TG5SaUtTQThMU0JqS0Z4Y1ozSnZkWEJjWEN3Z1hGeHpZMjl5WlZ4Y0tWeHVjR3h2ZEY5cGJuTlRZMjl5WlNoMFpXMXdMblJpTENCY1hHNWxZWEpsYzNSQ2IzVnVaR0Z5ZVY5a2FXWm1YMkpwYm1GeWVVZHliM1Z3WEZ3c0lIbHRhVzRnUFNBdE1DNHpMQ0I1YldGNElEMGdNQzR4S1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cblxuZ2VuZS5pbnNTY29yZSA8LSBnZW5lLmluc1Njb3JlLmFsbCAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAxLCBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMiwgXFxncm91cDJcXCwgTkEpKSkgJT4lIFxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRzY29yZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkc2NvcmVcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gLTEuNSwgeW1heCA9IDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gXFwuXFwsIGZpbGwgPSBncm91cCwgeSA9IC1zY29yZSkpICsgXG4gICAgbGFicyh4ID0gTlVMTCwgeSA9IFxcLSBJbnN1bGF0aW9uIHNjb3JlXFwpICsgICMgUmVtb3ZlIHgtYXhpcyB0aXRsZVxuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHJldigoYyhcXCM3Nzc3NzdcXCwgXFwjRjI4RTJDXFwpKSkpICtcblxuICAgIGludHJvZGF0YXZpejo6Z2VvbV9zcGxpdF92aW9saW4obGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IC40KSArXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgc3RhdF9zdW1tYXJ5KFxuICAgICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKVxuICAgICkgK1xuICAgIFxuICAgICMgXG4gICAgIyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgY29sb3IgPSBcXGJsYWNrXFwsIGxpbmV3aWR0aCA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgICMgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCAgY29sb3IgPSBcXGJsYWNrXFwsIGxpbmV3aWR0aCA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICMgICAgICAgICAgICAgIG91dGxpZXIuc2l6ZSA9IDEsIG91dGxpZXIuc3Ryb2tlID0gTkEpICtcbiAgICAjIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICsgXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5bWluLCB5bWF4KSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IHltaW4gKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApKyAgIGd1aWRlcyhcbiAgICAgIGZpbGwgPSBndWlkZV9sZWdlbmQoXG4gICAgICAgIGtleXdpZHRoID0gMC4yLCAgIyBBZGp1c3QgdGhlIHdpZHRoIG9mIHRoZSBsZWdlbmQga2V5c1xuICAgICAgICBrZXloZWlnaHQgPSAwLjIgICMgQWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgICApKVxuICAgICAgXG4gICAgICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbl9zY29yZV9iaW5hcnlHcm91cF9cXCwgbm90ZSlcbiAgd2lkdGggPC0gcGFuZWxTaXplKDEuNTUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cblxuIyBETVNPXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfRE1TTylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X0RNU09fYmluYXJ5R3JvdXBcXCwgeW1pbiA9IC0xLjEsIHltYXggPSAtMC41KVxuXG4jIGRUQUdcbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9kVEFHKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfZFRBR19iaW5hcnlHcm91cFxcLCB5bWluID0gIC0xLjEsIHltYXggPSAtMC41KVxuXG4jIGRpZmZcbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgZGlmZl9ib3VuZGFyeUluc1Njb3JlKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfZGlmZl9iaW5hcnlHcm91cFxcLCB5bWluID0gLTAuMywgeW1heCA9IDAuMSlcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLmluc1Njb3JlIDwtIGdlbmUuaW5zU2NvcmUuYWxsICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAyLCBcXGdyb3VwMlxcLCBOQSkpKSAlPiUgXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X2luc1Njb3JlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAtMS41LCB5bWF4ID0gMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBcXC5cXCwgZmlsbCA9IGdyb3VwLCB5ID0gLXNjb3JlKSkgKyBcbiAgICBsYWJzKHggPSBOVUxMLCB5ID0gXFwtIEluc3VsYXRpb24gc2NvcmVcXCkgKyAgIyBSZW1vdmUgeC1heGlzIHRpdGxlXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcmV2KChjKFxcIzc3Nzc3N1xcLCBcXCNGMjhFMkNcXCkpKSkgK1xuXG4gICAgaW50cm9kYXRhdml6OjpnZW9tX3NwbGl0X3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gLjQpICtcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICAgKSArXG4gICAgXG4gICAgIyBcbiAgICAjIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBjb2xvciA9IFxcYmxhY2tcXCwgbGluZXdpZHRoID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgIyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsICBjb2xvciA9IFxcYmxhY2tcXCwgbGluZXdpZHRoID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgIyAgICAgICAgICAgICAgb3V0bGllci5zaXplID0gMSwgb3V0bGllci5zdHJva2UgPSBOQSkgK1xuICAgICMgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgKyBcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0KSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpKSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICAgIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgICkrICAgZ3VpZGVzKFxuICAgICAgZmlsbCA9IGd1aWRlX2xlZ2VuZChcbiAgICAgICAga2V5d2lkdGggPSAwLjIsICAjIEFkanVzdCB0aGUgd2lkdGggb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgICAgIGtleWhlaWdodCA9IDAuMiAgIyBBZGp1c3QgdGhlIGhlaWdodCBvZiB0aGUgbGVnZW5kIGtleXNcbiAgICAgICkpXG4gICAgICBcbiAgICAgIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxpbnN1bGF0aW9uX3Njb3JlX2JpbmFyeUdyb3VwX1xcLCBub3RlKVxuICB3aWR0aCA8LSBwYW5lbFNpemUoMS41NSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIERNU09cbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfRE1TT19iaW5hcnlHcm91cFxcLCB5bWluID0gLTEuMSwgeW1heCA9IC0wLjUpXG5cbiMgZFRBR1xudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBib3VuZGFyeUluc1Njb3JlX2RUQUcpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kVEFHX2JpbmFyeUdyb3VwXFwsIHltaW4gPSAgLTEuMSwgeW1heCA9IC0wLjUpXG5cbiMgZGlmZlxudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kaWZmX2JpbmFyeUdyb3VwXFwsIHltaW4gPSAtMC4zLCB5bWF4ID0gMC4xKVxuYGBgXG5gYGAifQ== -->

```r
```r
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.insScore <- gene.insScore.all %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\, NA))) %>% 
  dplyr::filter(!is.na(group))


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$score
  distance2 <- (data %>% dplyr::filter(group ==group2) )$score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_insScore <- function(temp.tb, note, ymin = -1.5, ymax = 0){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = \.\, fill = group, y = -score)) + 
    labs(x = NULL, y = \- Insulation score\) +  # Remove x-axis title
    scale_fill_manual(values = rev((c(\#777777\, \#F28E2C\)))) +

    introdataviz::geom_split_violin(linewidth = lineMedium * mmToLineUnit, lineend = \square\,
                                    alpha = .4) +
    geom_boxplot(width = 0.3, color = \black\,
                 linewidth = lineMedium * mmToLineUnit, lineend = \square\,
                 outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + theme_classic() +
    stat_summary(
      aes(group = group), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) +
    
    # 
    # geom_violin(aes(fill = group), color = \black\, linewidth = lineThick*mmToLineUnit, lineend = \square\, show.legend = FALSE) + 
    # geom_boxplot(width = 0.1,  color = \black\, linewidth = lineThick*mmToLineUnit, lineend = \square\,
    #              outlier.size = 1, outlier.stroke = NA) +
    # stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 1, fill = \red\, color = \black\) + 
    geom_hline(yintercept = 0, linewidth = lineThick*mmToLineUnit) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p12: \, convPvalue(p12)),
             color = \black\, hjust = 0, size = 3) +
    theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )+   guides(
      fill = guide_legend(
        keywidth = 0.2,  # Adjust the width of the legend keys
        keyheight = 0.2  # Adjust the height of the legend keys
      ))
      
      
  fileName <- paste0(\insulation_score_binaryGroup_\, note)
  width <- panelSize(1.55)*mmToInch
height <- panelSize(1.2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO_binaryGroup\, ymin = -1.1, ymax = -0.5)

# dTAG
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_dTAG)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_dTAG_binaryGroup\, ymin =  -1.1, ymax = -0.5)

# diff
temp.tb <- gene.insScore %>% dplyr::select(group, diff_boundaryInsScore)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_diff_binaryGroup\, ymin = -0.3, ymax = 0.1)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Checking insulation score of the nearest TAD

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RFdWRITjJYQ0lwS1NSblpXNWxYRzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd01pNTBjM1pjSWlrcEpHZGxibVZjYm1keWIzVndOU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSm5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQTFMblJ6ZGx3aUtTa2taMlZ1WlZ4dVozSnZkWEE0SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbWRsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjRGd1ZEhOMlhDSXBLU1JuWlc1bFhHNWNibHh1WjJWdVpTNXBibk5UWTI5eVpTQThMU0JuWlc1bExtbHVjMU5qYjNKbExtRnNiQ0FsUGlVZ2NtOTNkMmx6WlNncElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0JuY205MWNDQTlJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnWjNKdmRYQXhMQ0JjSW1keWIzVndNVndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWlc1elpXMWliQ0FsYVc0bElHZHliM1Z3TWl3Z1hDSm5jbTkxY0RKY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdaM0p2ZFhBMUxDQmNJbWR5YjNWd05Wd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdaM0p2ZFhBNExDQmNJbWR5YjNWd09Gd2lMQ0JPUVNrcEtTa3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lnaGFYTXVibUVvWjNKdmRYQXBLVnh1WEc1Y2JtZGxkRkIyWVd4WGFXeGpiM2dnUEMwZ1puVnVZM1JwYjI0b1pHRjBZU3dnWjNKdmRYQXhMQ0JuY205MWNESXBlMXh1SUNCa2FYTjBZVzVqWlRFZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQxbmNtOTFjREVwSUNra2MyTnZjbVZjYmlBZ1pHbHpkR0Z1WTJVeUlEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOVozSnZkWEF5S1NBcEpITmpiM0psWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WEc1Y2JuQnNiM1JmYVc1elUyTnZjbVVnUEMwZ1puVnVZM1JwYjI0b2RHVnRjQzUwWWl3Z2JtOTBaU3dnZVcxcGJpQTlJREFzSUhsdFlYZ2dQU0F4TGpVcGUxeHVJQ0J3TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjSW1keWIzVndNVndpTENCY0ltZHliM1Z3TWx3aUtTd2dOU2xjYmlBZ2NERTFJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hDSm5jbTkxY0RGY0lpd2dYQ0puY205MWNEVmNJaWtzSURVcFhHNGdJSEF4T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRndpWjNKdmRYQXhYQ0lzSUZ3aVozSnZkWEE0WENJcExDQTFLVnh1SUNCd01qVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0ltZHliM1Z3TWx3aUxDQmNJbWR5YjNWd05Wd2lLU3dnTlNsY2JpQWdjREk0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYQ0puY205MWNESmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzRnSUhBMU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ3aVozSnZkWEExWENJc0lGd2laM0p2ZFhBNFhDSXBMQ0ExS1Z4dUlDQmNiaUFnY0NBOExTQm5aM0JzYjNRb2RHVnRjQzUwWWl3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlITmpiM0psS1NrZ0t5Qm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUdkeWIzVndLU3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnSUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMakVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0sxeHVJQ0FnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0JuY205MWNDa3NJR1oxYmlBOUlHMWxZVzRzSUdkbGIyMGdQU0JjSW5CdmFXNTBYQ0lzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBeUxDQm1hV3hzSUQwZ1hDSnlaV1JjSWl3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJcElDdGNiaUFnSUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vZVcxcGJpd2dlVzFoZUNrcElDdGNiaUFnSUNCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQjViV2x1SUNzZ01Td2diR0ZpWld3Z1BTQndZWE4wWlRBb1hDSndNVEk2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEF4TWlrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5BeE5Ub2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NERTFLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljREU0T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3TVRncExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd01qVTZJRndpTENCamIyNTJVSFpoYkhWbEtIQXlOU2tzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkF5T0RvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0RJNEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNEVTRPaUJjSWl4amIyNTJVSFpoYkhWbEtDQndOVGdwTENCY0lseGNibHdpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXdnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTXlsY2JpQWdYRzRnSUZ4dUlDQm1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0pwYm5OMWJHRjBhVzl1WDNOamIzSmxYMXdpTENCdWIzUmxLVnh1SUNCb1pXbG5hSFFnUEMwZ00xeHVJQ0IzYVdSMGFDQThMU0F6WEc0Z0lIQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUhOMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpQWdjSEpwYm5Rb2NDbGNiaUFnWkdWMkxtOW1aaWdwWEc1OVhHNWNiaU1nUkUxVFQxeHVkR1Z0Y0M1MFlpQThMU0JuWlc1bExtbHVjMU5qYjNKbElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHZHliM1Z3TENCaWIzVnVaR0Z5ZVVsdWMxTmpiM0psWDBSTlUwOHBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xuUmlLU0E4TFNCaktGd2laM0p2ZFhCY0lpd2dYQ0p6WTI5eVpWd2lLVnh1Y0d4dmRGOXBibk5UWTI5eVpTaDBaVzF3TG5SaUxDQmNJbTVsWVhKbGMzUkNiM1Z1WkdGeWVWOUVUVk5QWENJcFhHNWNiaU1nWkZSQlIxeHVkR1Z0Y0M1MFlpQThMU0JuWlc1bExtbHVjMU5qYjNKbElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHZHliM1Z3TENCaWIzVnVaR0Z5ZVVsdWMxTmpiM0psWDJSVVFVY3BYRzVqYjJ4dVlXMWxjeWgwWlcxd0xuUmlLU0E4TFNCaktGd2laM0p2ZFhCY0lpd2dYQ0p6WTI5eVpWd2lLVnh1Y0d4dmRGOXBibk5UWTI5eVpTaDBaVzF3TG5SaUxDQmNJbTVsWVhKbGMzUkNiM1Z1WkdGeWVWOWtWRUZIWENJcFhHNWNiaU1nWkdsbVpseHVkR1Z0Y0M1MFlpQThMU0JuWlc1bExtbHVjMU5qYjNKbElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHZHliM1Z3TENCa2FXWm1YMkp2ZFc1a1lYSjVTVzV6VTJOdmNtVXBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xuUmlLU0E4TFNCaktGd2laM0p2ZFhCY0lpd2dYQ0p6WTI5eVpWd2lLVnh1Y0d4dmRGOXBibk5UWTI5eVpTaDBaVzF3TG5SaUxDQmNJbTVsWVhKbGMzUkNiM1Z1WkdGeWVWOWthV1ptWENJc0lIbHRhVzRnUFNBdE1DNDFMQ0I1YldGNElEMGdNU2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDIudHN2XFwpKSRnZW5lXG5ncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwNS50c3ZcXCkpJGdlbmVcbmdyb3VwOCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA4LnRzdlxcKSkkZ2VuZVxuXG5cbmdlbmUuaW5zU2NvcmUgPC0gZ2VuZS5pbnNTY29yZS5hbGwgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwNSwgXFxncm91cDVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwOCwgXFxncm91cDhcXCwgTkEpKSkpKSAlPiUgXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X2luc1Njb3JlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMS41KXtcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gIHAxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4gIHAyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwNTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTU6IFxcLCBjb252UHZhbHVlKHAxNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxODogXFwsIGNvbnZQdmFsdWUocDE4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI1OiBcXCwgY29udlB2YWx1ZShwMjUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjg6IFxcLCBjb252UHZhbHVlKHAyOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA1ODogXFwsY29udlB2YWx1ZSggcDU4KSwgXFxcXG5cXCksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbl9zY29yZV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIERNU09cbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfRE1TT1xcKVxuXG4jIGRUQUdcbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9kVEFHKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfZFRBR1xcKVxuXG4jIGRpZmZcbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgZGlmZl9ib3VuZGFyeUluc1Njb3JlKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfZGlmZlxcLCB5bWluID0gLTAuNSwgeW1heCA9IDEpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene


gene.insScore <- gene.insScore.all %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\,
                        ifelse(ensembl %in% group5, \group5\,
                               ifelse(ensembl %in% group8, \group8\, NA))))) %>% 
  dplyr::filter(!is.na(group))


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$score
  distance2 <- (data %>% dplyr::filter(group ==group2) )$score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_insScore <- function(temp.tb, note, ymin = 0, ymax = 1.5){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO\)

# dTAG
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_dTAG)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_dTAG\)

# diff
temp.tb <- gene.insScore %>% dplyr::select(group, diff_boundaryInsScore)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_diff\, ymin = -0.5, ymax = 1)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjREV1ZEhOMlhGd3BLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3TWk1MGMzWmNYQ2twSkdkbGJtVmNibWR5YjNWd05TQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4blpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBMUxuUnpkbHhjS1Nra1oyVnVaVnh1WjNKdmRYQTRJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNEZ3VkSE4yWEZ3cEtTUm5aVzVsWEc1Y2JseHVaMlZ1WlM1cGJuTlRZMjl5WlNBOExTQm5aVzVsTG1sdWMxTmpiM0psTG1Gc2JDQWxQaVVnY205M2QybHpaU2dwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQm5jbTkxY0NBOUlHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdaM0p2ZFhBeExDQmNYR2R5YjNWd01WeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aVzV6WlcxaWJDQWxhVzRsSUdkeWIzVndNaXdnWEZ4bmNtOTFjREpjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEExTENCY1hHZHliM1Z3TlZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEE0TENCY1hHZHliM1Z3T0Z4Y0xDQk9RU2twS1NrcElDVStKU0JjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWdoYVhNdWJtRW9aM0p2ZFhBcEtWeHVYRzVjYm1kbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDFuY205MWNERXBJQ2trYzJOdmNtVmNiaUFnWkdsemRHRnVZMlV5SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXlLU0FwSkhOamIzSmxYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzVjYm5Cc2IzUmZhVzV6VTJOdmNtVWdQQzBnWm5WdVkzUnBiMjRvZEdWdGNDNTBZaXdnYm05MFpTd2dlVzFwYmlBOUlEQXNJSGx0WVhnZ1BTQXhMalVwZTF4dUlDQndNVElnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNYR2R5YjNWd01WeGNMQ0JjWEdkeWIzVndNbHhjS1N3Z05TbGNiaUFnY0RFMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWEZ4bmNtOTFjREZjWEN3Z1hGeG5jbTkxY0RWY1hDa3NJRFVwWEc0Z0lIQXhPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGeGNaM0p2ZFhBeFhGd3NJRnhjWjNKdmRYQTRYRndwTENBMUtWeHVJQ0J3TWpVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEdkeWIzVndNbHhjTENCY1hHZHliM1Z3TlZ4Y0tTd2dOU2xjYmlBZ2NESTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hGeG5jbTkxY0RKY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNGdJSEExT0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRnhjWjNKdmRYQTFYRndzSUZ4Y1ozSnZkWEE0WEZ3cExDQTFLVnh1SUNCY2JpQWdjQ0E4TFNCblozQnNiM1FvZEdWdGNDNTBZaXdnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUhOamIzSmxLU2tnS3lCblpXOXRYM1pwYjJ4cGJpaGhaWE1vWm1sc2JDQTlJR2R5YjNWd0tTd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnS3lCY2JpQWdJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnSzF4dUlDQWdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNYSEJ2YVc1MFhGd3NJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWEZ4eVpXUmNYQ3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndwSUN0Y2JpQWdJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9lVzFwYml3Z2VXMWhlQ2twSUN0Y2JpQWdJQ0JoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNCNWJXbHVJQ3NnTVN3Z2JHRmlaV3dnUFNCd1lYTjBaVEFvWEZ4d01USTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQXhNaWtzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEF4TlRvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0RFMUtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NERTRPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdNVGdwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3TWpVNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hBeU5Ta3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQXlPRG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jREk0S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0RVNE9pQmNYQ3hqYjI1MlVIWmhiSFZsS0NCd05UZ3BMQ0JjWEZ4Y2JseGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNeWxjYmlBZ1hHNGdJRnh1SUNCbWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hGeHBibk4xYkdGMGFXOXVYM05qYjNKbFgxeGNMQ0J1YjNSbEtWeHVJQ0JvWldsbmFIUWdQQzBnTTF4dUlDQjNhV1IwYUNBOExTQXpYRzRnSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzU5WEc1Y2JpTWdSRTFUVDF4dWRHVnRjQzUwWWlBOExTQm5aVzVsTG1sdWMxTmpiM0psSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dkeWIzVndMQ0JpYjNWdVpHRnllVWx1YzFOamIzSmxYMFJOVTA4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG5SaUtTQThMU0JqS0Z4Y1ozSnZkWEJjWEN3Z1hGeHpZMjl5WlZ4Y0tWeHVjR3h2ZEY5cGJuTlRZMjl5WlNoMFpXMXdMblJpTENCY1hHNWxZWEpsYzNSQ2IzVnVaR0Z5ZVY5RVRWTlBYRndwWEc1Y2JpTWdaRlJCUjF4dWRHVnRjQzUwWWlBOExTQm5aVzVsTG1sdWMxTmpiM0psSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dkeWIzVndMQ0JpYjNWdVpHRnllVWx1YzFOamIzSmxYMlJVUVVjcFhHNWpiMnh1WVcxbGN5aDBaVzF3TG5SaUtTQThMU0JqS0Z4Y1ozSnZkWEJjWEN3Z1hGeHpZMjl5WlZ4Y0tWeHVjR3h2ZEY5cGJuTlRZMjl5WlNoMFpXMXdMblJpTENCY1hHNWxZWEpsYzNSQ2IzVnVaR0Z5ZVY5a1ZFRkhYRndwWEc1Y2JpTWdaR2xtWmx4dWRHVnRjQzUwWWlBOExTQm5aVzVsTG1sdWMxTmpiM0psSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dkeWIzVndMQ0JrYVdabVgySnZkVzVrWVhKNVNXNXpVMk52Y21VcFhHNWpiMnh1WVcxbGN5aDBaVzF3TG5SaUtTQThMU0JqS0Z4Y1ozSnZkWEJjWEN3Z1hGeHpZMjl5WlZ4Y0tWeHVjR3h2ZEY5cGJuTlRZMjl5WlNoMFpXMXdMblJpTENCY1hHNWxZWEpsYzNSQ2IzVnVaR0Z5ZVY5a2FXWm1YRndzSUhsdGFXNGdQU0F0TUM0MUxDQjViV0Y0SUQwZ01TbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAyLnRzdlxcKSkkZ2VuZVxuZ3JvdXA1IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDUudHN2XFwpKSRnZW5lXG5ncm91cDggPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwOC50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLmluc1Njb3JlIDwtIGdlbmUuaW5zU2NvcmUuYWxsICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAyLCBcXGdyb3VwMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDgsIFxcZ3JvdXA4XFwsIE5BKSkpKSkgJT4lIFxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRzY29yZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkc2NvcmVcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5bWluLCB5bWF4KSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IHltaW4gKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNTogXFwsIGNvbnZQdmFsdWUocDI1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25fc2NvcmVfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cblxuIyBETVNPXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfRE1TTylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X0RNU09cXClcblxuIyBkVEFHXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X2RUQUdcXClcblxuIyBkaWZmXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGRpZmZfYm91bmRhcnlJbnNTY29yZSlcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X2RpZmZcXCwgeW1pbiA9IC0wLjUsIHltYXggPSAxKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCkpJGdlbmVcbmdyb3VwNSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdlxcKSkkZ2VuZVxuZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpKSRnZW5lXG5cblxuZ2VuZS5pbnNTY29yZSA8LSBnZW5lLmluc1Njb3JlLmFsbCAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAxLCBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMiwgXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA1LCBcXGdyb3VwNVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA4LCBcXGdyb3VwOFxcLCBOQSkpKSkpICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkc2NvcmVcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJHNjb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnBsb3RfaW5zU2NvcmUgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAxLjUpe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4gIHAxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4gIHA1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IHNjb3JlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeW1pbiwgeW1heCkpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSB5bWluICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNTogXFwsIGNvbnZQdmFsdWUocDE1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE4OiBcXCwgY29udlB2YWx1ZShwMTgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyODogXFwsIGNvbnZQdmFsdWUocDI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDU4OiBcXCxjb252UHZhbHVlKCBwNTgpLCBcXFxcblxcKSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxpbnN1bGF0aW9uX3Njb3JlX1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAzXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5cbiMgRE1TT1xudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBib3VuZGFyeUluc1Njb3JlX0RNU08pXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9ETVNPXFwpXG5cbiMgZFRBR1xudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBib3VuZGFyeUluc1Njb3JlX2RUQUcpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kVEFHXFwpXG5cbiMgZGlmZlxudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kaWZmXFwsIHltaW4gPSAtMC41LCB5bWF4ID0gMSlcbmBgYFxuYGBgIn0= -->

```r
```r
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene


gene.insScore <- gene.insScore.all %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\,
                        ifelse(ensembl %in% group5, \group5\,
                               ifelse(ensembl %in% group8, \group8\, NA))))) %>% 
  dplyr::filter(!is.na(group))


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$score
  distance2 <- (data %>% dplyr::filter(group ==group2) )$score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_insScore <- function(temp.tb, note, ymin = 0, ymax = 1.5){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO\)

# dTAG
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_dTAG)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_dTAG\)

# diff
temp.tb <- gene.insScore %>% dplyr::select(group, diff_boundaryInsScore)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_diff\, ymin = -0.5, ymax = 1)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### Plotting for binary groups

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR1Z0Y0RJZ1BDMGdjbVZoWkZKRVV5aG9aWEpsS0hKbGMzVnNkRVJwY2l3Z1hDSm5aVzVsWDJ4dmIzQmZiR2x1YXk1eVpITmNJaWtwWEc1Y2JuQnVUM1psY2pnZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIUnZkR0ZzSUQ0OUlEZ3BLU1JuWlc1bFhHNXdiazkyWlhJMklEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaDBiM1JoYkNBK1BTQTJMQ0IwYjNSaGJDQThJRGdwS1NSblpXNWxYRzV3Yms5MlpYSTBJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWgwYjNSaGJDQStQU0EwTENCMGIzUmhiQ0E4SURZcEtTUm5aVzVsWEc1d2JrOTJaWEl5SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loMGIzUmhiQ0ErUFNBeUxDQjBiM1JoYkNBOElEUXBLU1JuWlc1bFhHNXdiazkyWlhJd0lEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaDBiM1JoYkNBOElESXBLU1JuWlc1bFhHNWNibHh1WjJWdVpTNXBibk5UWTI5eVpTQThMU0JuWlc1bExtbHVjMU5qYjNKbExtRnNiQ0FsUGlVZ2NtOTNkMmx6WlNncElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0JuY205MWNDQTlJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnY0c1UGRtVnlPQ3dnWENKd09Gd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aVzV6WlcxaWJDQWxhVzRsSUhCdVQzWmxjallzSUZ3aWNEWmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnY0c1UGRtVnlOQ3dnWENKd05Gd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdjRzVQZG1WeU1pd2dYQ0p3TWx3aUxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR1Z1YzJWdFltd2dKV2x1SlNCd2JrOTJaWEl3TENCY0luQXdYQ0lzSUU1QktTa3BLU2twSUNBbFBpVWdYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9JV2x6TG01aEtHZHliM1Z3S1NsY2JseHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TVNrZ0tTUnpZMjl5WlZ4dUlDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMW5jbTkxY0RJcElDa2tjMk52Y21WY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1Y2JuQnNiM1JmYVc1elUyTnZjbVVnUEMwZ1puVnVZM1JwYjI0b2RHVnRjQzUwWWl3Z2JtOTBaU3dnZVcxcGJpQTlJREFzSUhsdFlYZ2dQU0F4TGpVcGUxeHVJQ0J3TURJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjSW5Bd1hDSXNJRndpY0RKY0lpa3NJRFVwWEc0Z0lIQXlOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGd2ljREpjSWl3Z1hDSndORndpS1N3Z05TbGNiaUFnY0RRMklEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWENKd05Gd2lMQ0JjSW5BMlhDSXBMQ0ExS1Z4dUlDQndOamdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbkEyWENJc0lGd2ljRGhjSWlrc0lEVXBYRzRnSUhBME9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ3aWNEUmNJaXdnWENKd09Gd2lLU3dnTlNsY2JpQWdjREk0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYQ0p3TWx3aUxDQmNJbkE0WENJcExDQTFLVnh1SUNCd01EZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0luQXdYQ0lzSUZ3aWNEaGNJaWtzSURVcFhHNGdJRnh1SUNCd0lEd3RJR2RuY0d4dmRDaDBaVzF3TG5SaUxDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdjMk52Y21VcEtTQXJJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ1ozSnZkWEFwTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJJRnh1SUNBZ0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJYRzRnSUNBZ2MzUmhkRjl6ZFcxdFlYSjVLR0ZsY3lobmNtOTFjQ0E5SUdkeWIzVndLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNJbkpsWkZ3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpa2dLMXh1SUNBZ0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHTnZiM0prWDJOaGNuUmxjMmxoYmloNWJHbHRJRDBnWXloNWJXbHVMQ0I1YldGNEtTa2dLMXh1SUNBZ0lHRnVibTkwWVhSbEtGd2lkR1Y0ZEZ3aUxDQjRJRDBnTVN3Z2VTQTlJSGx0YVc0Z0t5QXhMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkF3TWpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0RBeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNESTBPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNalFwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3TkRZNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBME5pa3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQTJPRG9nWENJc0lHTnZiblpRZG1Gc2RXVW9jRFk0S1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0RRNE9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod05EZ3BMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndNamc2SUZ3aUxHTnZiblpRZG1Gc2RXVW9JSEF5T0Nrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5Bd09Eb2dYQ0lzWTI5dWRsQjJZV3gxWlNnZ2NEQTRLU3dnWENKY1hHNWNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wSUNBclhHNGdJQ0FnYzJOaGJHVmZabWxzYkY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY0lpTmtPV1E1WkRsY0lpd2dYQ0lqWW1SaVpHSmtYQ0lzSUZ3aUl6azJPVFk1Tmx3aUxDQmNJaU0zTXpjek56TmNJaXdnWENJak5USTFNalV5WENJcEtWeHVJQ0JjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW1sdWMzVnNZWFJwYjI1ZmMyTnZjbVZmWENJc0lHNXZkR1VwWEc0Z0lHaGxhV2RvZENBOExTQXpYRzRnSUhkcFpIUm9JRHd0SUROY2JpQWdjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUlDQndjbWx1ZENod0tWeHVJQ0JrWlhZdWIyWm1LQ2xjYmlBZ2MzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVJQ0J3Y21sdWRDaHdLVnh1SUNCa1pYWXViMlptS0NsY2JuMWNibHh1SXlCRVRWTlBYRzUwWlcxd0xuUmlJRHd0SUdkbGJtVXVhVzV6VTJOdmNtVWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHSnZkVzVrWVhKNVNXNXpVMk52Y21WZlJFMVRUeWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXVkR0lwSUR3dElHTW9YQ0puY205MWNGd2lMQ0JjSW5OamIzSmxYQ0lwWEc1d2JHOTBYMmx1YzFOamIzSmxLSFJsYlhBdWRHSXNJRndpYm1WaGNtVnpkRUp2ZFc1a1lYSjVYMFJOVTA5ZlVDMU9YQ0lwWEc1Y2JpTWdaRlJCUjF4dWRHVnRjQzUwWWlBOExTQm5aVzVsTG1sdWMxTmpiM0psSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dkeWIzVndMQ0JpYjNWdVpHRnllVWx1YzFOamIzSmxYMlJVUVVjcFhHNWpiMnh1WVcxbGN5aDBaVzF3TG5SaUtTQThMU0JqS0Z3aVozSnZkWEJjSWl3Z1hDSnpZMjl5WlZ3aUtWeHVjR3h2ZEY5cGJuTlRZMjl5WlNoMFpXMXdMblJpTENCY0ltNWxZWEpsYzNSQ2IzVnVaR0Z5ZVY5a1ZFRkhYMUF0VGx3aUtWeHVYRzRqSUdScFptWmNiblJsYlhBdWRHSWdQQzBnWjJWdVpTNXBibk5UWTI5eVpTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaG5jbTkxY0N3Z1pHbG1abDlpYjNWdVpHRnllVWx1YzFOamIzSmxLVnh1WTI5c2JtRnRaWE1vZEdWdGNDNTBZaWtnUEMwZ1l5aGNJbWR5YjNWd1hDSXNJRndpYzJOdmNtVmNJaWxjYm5Cc2IzUmZhVzV6VTJOdmNtVW9kR1Z0Y0M1MFlpd2dYQ0p1WldGeVpYTjBRbTkxYm1SaGNubGZaR2xtWmw5UUxVNWNJaXdnZVcxcGJpQTlJQzB3TGpVc0lIbHRZWGdnUFNBeEtWeHVYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbnRlbXAyIDwtIHJlYWRSRFMoaGVyZShyZXN1bHREaXIsIFxcZ2VuZV9sb29wX2xpbmsucmRzXFwpKVxuXG5wbk92ZXI4IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSA4KSkkZ2VuZVxucG5PdmVyNiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gNiwgdG90YWwgPCA4KSkkZ2VuZVxucG5PdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gNCwgdG90YWwgPCA2KSkkZ2VuZVxucG5PdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gMiwgdG90YWwgPCA0KSkkZ2VuZVxucG5PdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPCAyKSkkZ2VuZVxuXG5cbmdlbmUuaW5zU2NvcmUgPC0gZ2VuZS5pbnNTY29yZS5hbGwgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZW5zZW1ibCAlaW4lIHBuT3ZlcjgsIFxccDhcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwbk92ZXI2LCBcXHA2XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBuT3ZlcjQsIFxccDRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBuT3ZlcjIsIFxccDJcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcG5PdmVyMCwgXFxwMFxcLCBOQSkpKSkpKSAgJT4lIFxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkc2NvcmVcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJHNjb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5wbG90X2luc1Njb3JlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMS41KXtcbiAgcDAyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMFxcLCBcXHAyXFwpLCA1KVxuICBwMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAyXFwsIFxccDRcXCksIDUpXG4gIHA0NiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDRcXCwgXFxwNlxcKSwgNSlcbiAgcDY4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwNlxcLCBcXHA4XFwpLCA1KVxuICBwNDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHA0XFwsIFxccDhcXCksIDUpXG4gIHAyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDJcXCwgXFxwOFxcKSwgNSlcbiAgcDA4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMFxcLCBcXHA4XFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IHNjb3JlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeW1pbiwgeW1heCkpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSB5bWluICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMDI6IFxcLCBjb252UHZhbHVlKHAwMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNDogXFwsIGNvbnZQdmFsdWUocDI0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDQ2OiBcXCwgY29udlB2YWx1ZShwNDYpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNjg6IFxcLCBjb252UHZhbHVlKHA2OCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA0ODogXFwsIGNvbnZQdmFsdWUocDQ4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCxjb252UHZhbHVlKCBwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMDg6IFxcLGNvbnZQdmFsdWUoIHAwOCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSAgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjZDlkOWQ5XFwsIFxcI2JkYmRiZFxcLCBcXCM5Njk2OTZcXCwgXFwjNzM3MzczXFwsIFxcIzUyNTI1MlxcKSlcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxpbnN1bGF0aW9uX3Njb3JlX1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAzXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5cbiMgRE1TT1xudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBib3VuZGFyeUluc1Njb3JlX0RNU08pXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9ETVNPX1AtTlxcKVxuXG4jIGRUQUdcbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9kVEFHKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfZFRBR19QLU5cXClcblxuIyBkaWZmXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGRpZmZfYm91bmRhcnlJbnNTY29yZSlcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X2RpZmZfUC1OXFwsIHltaW4gPSAtMC41LCB5bWF4ID0gMSlcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

pnOver8 <- (temp2 %>% dplyr::filter(total >= 8))$gene
pnOver6 <- (temp2 %>% dplyr::filter(total >= 6, total < 8))$gene
pnOver4 <- (temp2 %>% dplyr::filter(total >= 4, total < 6))$gene
pnOver2 <- (temp2 %>% dplyr::filter(total >= 2, total < 4))$gene
pnOver0 <- (temp2 %>% dplyr::filter(total < 2))$gene


gene.insScore <- gene.insScore.all %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% pnOver8, \p8\,
                 ifelse(ensembl %in% pnOver6, \p6\,
                        ifelse(ensembl %in% pnOver4, \p4\,
                               ifelse(ensembl %in% pnOver2, \p2\, 
                                      ifelse(ensembl %in% pnOver0, \p0\, NA))))))  %>% 
  dplyr::filter(!is.na(group))

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$score
  distance2 <- (data %>% dplyr::filter(group ==group2) )$score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

plot_insScore <- function(temp.tb, note, ymin = 0, ymax = 1.5){
  p02 <- round(getPvalWilcox(temp.tb, \p0\, \p2\), 5)
  p24 <- round(getPvalWilcox(temp.tb, \p2\, \p4\), 5)
  p46 <- round(getPvalWilcox(temp.tb, \p4\, \p6\), 5)
  p68 <- round(getPvalWilcox(temp.tb, \p6\, \p8\), 5)
  p48 <- round(getPvalWilcox(temp.tb, \p4\, \p8\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \p2\, \p8\), 5)
  p08 <- round(getPvalWilcox(temp.tb, \p0\, \p8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p02: \, convPvalue(p02), \\n\,
                                                         \p24: \, convPvalue(p24), \\n\,
                                                         \p46: \, convPvalue(p46), \\n\,
                                                         \p68: \, convPvalue(p68), \\n\,
                                                         \p48: \, convPvalue(p48), \\n\,
                                                         \p28: \,convPvalue( p28), \\n\,
                                                         \p08: \,convPvalue( p08), \\n\),
             color = \black\, hjust = 0, size = 3)  +
    scale_fill_manual(values = c(\#d9d9d9\, \#bdbdbd\, \#969696\, \#737373\, \#525252\))
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO_P-N\)

# dTAG
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_dTAG)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_dTAG_P-N\)

# diff
temp.tb <- gene.insScore %>% dplyr::select(group, diff_boundaryInsScore)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_diff_P-N\, ymin = -0.5, ymax = 1)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRHVnRjRElnUEMwZ2NtVmhaRkpFVXlob1pYSmxLSEpsYzNWc2RFUnBjaXdnWEZ4blpXNWxYMnh2YjNCZmJHbHVheTV5WkhOY1hDa3BYRzVjYm5CdVQzWmxjamdnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hSdmRHRnNJRDQ5SURncEtTUm5aVzVsWEc1d2JrOTJaWEkySUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loMGIzUmhiQ0ErUFNBMkxDQjBiM1JoYkNBOElEZ3BLU1JuWlc1bFhHNXdiazkyWlhJMElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaDBiM1JoYkNBK1BTQTBMQ0IwYjNSaGJDQThJRFlwS1NSblpXNWxYRzV3Yms5MlpYSXlJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWgwYjNSaGJDQStQU0F5TENCMGIzUmhiQ0E4SURRcEtTUm5aVzVsWEc1d2JrOTJaWEl3SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loMGIzUmhiQ0E4SURJcEtTUm5aVzVsWEc1Y2JseHVaMlZ1WlM1cGJuTlRZMjl5WlNBOExTQm5aVzVsTG1sdWMxTmpiM0psTG1Gc2JDQWxQaVVnY205M2QybHpaU2dwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQm5jbTkxY0NBOUlHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdjRzVQZG1WeU9Dd2dYRnh3T0Z4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1pXNXpaVzFpYkNBbGFXNGxJSEJ1VDNabGNqWXNJRnhjY0RaY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdjRzVQZG1WeU5Dd2dYRnh3TkZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hsYm5ObGJXSnNJQ1ZwYmlVZ2NHNVBkbVZ5TWl3Z1hGeHdNbHhjTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHVnVjMlZ0WW13Z0pXbHVKU0J3Yms5MlpYSXdMQ0JjWEhBd1hGd3NJRTVCS1NrcEtTa3BJQ0FsUGlVZ1hHNGdJR1J3YkhseU9qcG1hV3gwWlhJb0lXbHpMbTVoS0dkeWIzVndLU2xjYmx4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNU2tnS1NSelkyOXlaVnh1SUNCa2FYTjBZVzVqWlRJZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQxbmNtOTFjRElwSUNra2MyTnZjbVZjYmlBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SUNCeVpYUjFjbTRvZDJsc0pIQXVkbUZzZFdVcFhHNTlYRzVjYm5Cc2IzUmZhVzV6VTJOdmNtVWdQQzBnWm5WdVkzUnBiMjRvZEdWdGNDNTBZaXdnYm05MFpTd2dlVzFwYmlBOUlEQXNJSGx0WVhnZ1BTQXhMalVwZTF4dUlDQndNRElnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNYSEF3WEZ3c0lGeGNjREpjWENrc0lEVXBYRzRnSUhBeU5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ4Y2NESmNYQ3dnWEZ4d05GeGNLU3dnTlNsY2JpQWdjRFEySUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYRnh3TkZ4Y0xDQmNYSEEyWEZ3cExDQTFLVnh1SUNCd05qZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hIQTJYRndzSUZ4Y2NEaGNYQ2tzSURVcFhHNGdJSEEwT0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRnhjY0RSY1hDd2dYRnh3T0Z4Y0tTd2dOU2xjYmlBZ2NESTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hGeHdNbHhjTENCY1hIQTRYRndwTENBMUtWeHVJQ0J3TURnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEhBd1hGd3NJRnhjY0RoY1hDa3NJRFVwWEc0Z0lGeHVJQ0J3SUR3dElHZG5jR3h2ZENoMFpXMXdMblJpTENCaFpYTW9lQ0E5SUdkeWIzVndMQ0I1SUQwZ2MyTnZjbVVwS1NBcklHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnWjNKdmRYQXBMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBcklGeHVJQ0FnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBclhHNGdJQ0FnYzNSaGRGOXpkVzF0WVhKNUtHRmxjeWhuY205MWNDQTlJR2R5YjNWd0tTd2dablZ1SUQwZ2JXVmhiaXdnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURJc0lHWnBiR3dnUFNCY1hISmxaRnhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWENrZ0sxeHVJQ0FnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWg1YldsdUxDQjViV0Y0S1NrZ0sxeHVJQ0FnSUdGdWJtOTBZWFJsS0Z4Y2RHVjRkRnhjTENCNElEMGdNU3dnZVNBOUlIbHRhVzRnS3lBeExDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQXdNam9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jREF5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0RJME9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod01qUXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdORFk2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEEwTmlrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhBMk9Eb2dYRndzSUdOdmJuWlFkbUZzZFdVb2NEWTRLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjRFE0T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3TkRncExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d01qZzZJRnhjTEdOdmJuWlFkbUZzZFdVb0lIQXlPQ2tzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEF3T0RvZ1hGd3NZMjl1ZGxCMllXeDFaU2dnY0RBNEtTd2dYRnhjWEc1Y1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBJQ0FyWEc0Z0lDQWdjMk5oYkdWZlptbHNiRjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjWENOa09XUTVaRGxjWEN3Z1hGd2pZbVJpWkdKa1hGd3NJRnhjSXprMk9UWTVObHhjTENCY1hDTTNNemN6TnpOY1hDd2dYRndqTlRJMU1qVXlYRndwS1Z4dUlDQmNiaUFnWEc0Z0lHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYR2x1YzNWc1lYUnBiMjVmYzJOdmNtVmZYRndzSUc1dmRHVXBYRzRnSUdobGFXZG9kQ0E4TFNBelhHNGdJSGRwWkhSb0lEd3RJRE5jYmlBZ2NHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1SUNCd2NtbHVkQ2h3S1Z4dUlDQmtaWFl1YjJabUtDbGNiaUFnYzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUlDQndjbWx1ZENod0tWeHVJQ0JrWlhZdWIyWm1LQ2xjYm4xY2JseHVJeUJFVFZOUFhHNTBaVzF3TG5SaUlEd3RJR2RsYm1VdWFXNXpVMk52Y21VZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1ozSnZkWEFzSUdKdmRXNWtZWEo1U1c1elUyTnZjbVZmUkUxVFR5bGNibU52Ykc1aGJXVnpLSFJsYlhBdWRHSXBJRHd0SUdNb1hGeG5jbTkxY0Z4Y0xDQmNYSE5qYjNKbFhGd3BYRzV3Ykc5MFgybHVjMU5qYjNKbEtIUmxiWEF1ZEdJc0lGeGNibVZoY21WemRFSnZkVzVrWVhKNVgwUk5VMDlmVUMxT1hGd3BYRzVjYmlNZ1pGUkJSMXh1ZEdWdGNDNTBZaUE4TFNCblpXNWxMbWx1YzFOamIzSmxJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR2R5YjNWd0xDQmliM1Z1WkdGeWVVbHVjMU5qYjNKbFgyUlVRVWNwWEc1amIyeHVZVzFsY3loMFpXMXdMblJpS1NBOExTQmpLRnhjWjNKdmRYQmNYQ3dnWEZ4elkyOXlaVnhjS1Z4dWNHeHZkRjlwYm5OVFkyOXlaU2gwWlcxd0xuUmlMQ0JjWEc1bFlYSmxjM1JDYjNWdVpHRnllVjlrVkVGSFgxQXRUbHhjS1Z4dVhHNGpJR1JwWm1aY2JuUmxiWEF1ZEdJZ1BDMGdaMlZ1WlM1cGJuTlRZMjl5WlNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENobmNtOTFjQ3dnWkdsbVpsOWliM1Z1WkdGeWVVbHVjMU5qYjNKbEtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0M1MFlpa2dQQzBnWXloY1hHZHliM1Z3WEZ3c0lGeGNjMk52Y21WY1hDbGNibkJzYjNSZmFXNXpVMk52Y21Vb2RHVnRjQzUwWWl3Z1hGeHVaV0Z5WlhOMFFtOTFibVJoY25sZlpHbG1abDlRTFU1Y1hDd2dlVzFwYmlBOUlDMHdMalVzSUhsdFlYZ2dQU0F4S1Z4dVhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbnRlbXAyIDwtIHJlYWRSRFMoaGVyZShyZXN1bHREaXIsIFxcZ2VuZV9sb29wX2xpbmsucmRzXFwpKVxuXG5wbk92ZXI4IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSA4KSkkZ2VuZVxucG5PdmVyNiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gNiwgdG90YWwgPCA4KSkkZ2VuZVxucG5PdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gNCwgdG90YWwgPCA2KSkkZ2VuZVxucG5PdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gMiwgdG90YWwgPCA0KSkkZ2VuZVxucG5PdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPCAyKSkkZ2VuZVxuXG5cbmdlbmUuaW5zU2NvcmUgPC0gZ2VuZS5pbnNTY29yZS5hbGwgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZW5zZW1ibCAlaW4lIHBuT3ZlcjgsIFxccDhcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwbk92ZXI2LCBcXHA2XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBuT3ZlcjQsIFxccDRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBuT3ZlcjIsIFxccDJcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcG5PdmVyMCwgXFxwMFxcLCBOQSkpKSkpKSAgJT4lIFxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkc2NvcmVcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJHNjb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5wbG90X2luc1Njb3JlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMS41KXtcbiAgcDAyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMFxcLCBcXHAyXFwpLCA1KVxuICBwMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAyXFwsIFxccDRcXCksIDUpXG4gIHA0NiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDRcXCwgXFxwNlxcKSwgNSlcbiAgcDY4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwNlxcLCBcXHA4XFwpLCA1KVxuICBwNDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHA0XFwsIFxccDhcXCksIDUpXG4gIHAyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDJcXCwgXFxwOFxcKSwgNSlcbiAgcDA4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMFxcLCBcXHA4XFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IHNjb3JlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeW1pbiwgeW1heCkpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSB5bWluICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMDI6IFxcLCBjb252UHZhbHVlKHAwMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNDogXFwsIGNvbnZQdmFsdWUocDI0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDQ2OiBcXCwgY29udlB2YWx1ZShwNDYpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNjg6IFxcLCBjb252UHZhbHVlKHA2OCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA0ODogXFwsIGNvbnZQdmFsdWUocDQ4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCxjb252UHZhbHVlKCBwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMDg6IFxcLGNvbnZQdmFsdWUoIHAwOCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKSAgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjZDlkOWQ5XFwsIFxcI2JkYmRiZFxcLCBcXCM5Njk2OTZcXCwgXFwjNzM3MzczXFwsIFxcIzUyNTI1MlxcKSlcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxpbnN1bGF0aW9uX3Njb3JlX1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAzXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5cbiMgRE1TT1xudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBib3VuZGFyeUluc1Njb3JlX0RNU08pXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9ETVNPX1AtTlxcKVxuXG4jIGRUQUdcbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9kVEFHKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfZFRBR19QLU5cXClcblxuIyBkaWZmXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGRpZmZfYm91bmRhcnlJbnNTY29yZSlcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X2RpZmZfUC1OXFwsIHltaW4gPSAtMC41LCB5bWF4ID0gMSlcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGluay5yZHNcXCkpXG5cbnBuT3ZlcjggPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDgpKSRnZW5lXG5wbk92ZXI2IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSA2LCB0b3RhbCA8IDgpKSRnZW5lXG5wbk92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSA0LCB0b3RhbCA8IDYpKSRnZW5lXG5wbk92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSAyLCB0b3RhbCA8IDQpKSRnZW5lXG5wbk92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA8IDIpKSRnZW5lXG5cblxuZ2VuZS5pbnNTY29yZSA8LSBnZW5lLmluc1Njb3JlLmFsbCAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgcG5PdmVyOCwgXFxwOFxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBuT3ZlcjYsIFxccDZcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcG5PdmVyNCwgXFxwNFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcG5PdmVyMiwgXFxwMlxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwbk92ZXIwLCBcXHAwXFwsIE5BKSkpKSkpICAlPiUgXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRzY29yZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkc2NvcmVcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnBsb3RfaW5zU2NvcmUgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAxLjUpe1xuICBwMDIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAwXFwsIFxccDJcXCksIDUpXG4gIHAyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDJcXCwgXFxwNFxcKSwgNSlcbiAgcDQ2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwNFxcLCBcXHA2XFwpLCA1KVxuICBwNjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHA2XFwsIFxccDhcXCksIDUpXG4gIHA0OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDRcXCwgXFxwOFxcKSwgNSlcbiAgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMlxcLCBcXHA4XFwpLCA1KVxuICBwMDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAwXFwsIFxccDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5bWluLCB5bWF4KSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IHltaW4gKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAwMjogXFwsIGNvbnZQdmFsdWUocDAyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI0OiBcXCwgY29udlB2YWx1ZShwMjQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNDY6IFxcLCBjb252UHZhbHVlKHA0NiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA2ODogXFwsIGNvbnZQdmFsdWUocDY4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDQ4OiBcXCwgY29udlB2YWx1ZShwNDgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjg6IFxcLGNvbnZQdmFsdWUoIHAyOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAwODogXFwsY29udlB2YWx1ZSggcDA4KSwgXFxcXG5cXCksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCNkOWQ5ZDlcXCwgXFwjYmRiZGJkXFwsIFxcIzk2OTY5NlxcLCBcXCM3MzczNzNcXCwgXFwjNTI1MjUyXFwpKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25fc2NvcmVfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cblxuIyBETVNPXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfRE1TTylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X0RNU09fUC1OXFwpXG5cbiMgZFRBR1xudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBib3VuZGFyeUluc1Njb3JlX2RUQUcpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kVEFHX1AtTlxcKVxuXG4jIGRpZmZcbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgZGlmZl9ib3VuZGFyeUluc1Njb3JlKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfZGlmZl9QLU5cXCwgeW1pbiA9IC0wLjUsIHltYXggPSAxKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

pnOver8 <- (temp2 %>% dplyr::filter(total >= 8))$gene
pnOver6 <- (temp2 %>% dplyr::filter(total >= 6, total < 8))$gene
pnOver4 <- (temp2 %>% dplyr::filter(total >= 4, total < 6))$gene
pnOver2 <- (temp2 %>% dplyr::filter(total >= 2, total < 4))$gene
pnOver0 <- (temp2 %>% dplyr::filter(total < 2))$gene


gene.insScore <- gene.insScore.all %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% pnOver8, \p8\,
                 ifelse(ensembl %in% pnOver6, \p6\,
                        ifelse(ensembl %in% pnOver4, \p4\,
                               ifelse(ensembl %in% pnOver2, \p2\, 
                                      ifelse(ensembl %in% pnOver0, \p0\, NA))))))  %>% 
  dplyr::filter(!is.na(group))

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$score
  distance2 <- (data %>% dplyr::filter(group ==group2) )$score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

plot_insScore <- function(temp.tb, note, ymin = 0, ymax = 1.5){
  p02 <- round(getPvalWilcox(temp.tb, \p0\, \p2\), 5)
  p24 <- round(getPvalWilcox(temp.tb, \p2\, \p4\), 5)
  p46 <- round(getPvalWilcox(temp.tb, \p4\, \p6\), 5)
  p68 <- round(getPvalWilcox(temp.tb, \p6\, \p8\), 5)
  p48 <- round(getPvalWilcox(temp.tb, \p4\, \p8\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \p2\, \p8\), 5)
  p08 <- round(getPvalWilcox(temp.tb, \p0\, \p8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p02: \, convPvalue(p02), \\n\,
                                                         \p24: \, convPvalue(p24), \\n\,
                                                         \p46: \, convPvalue(p46), \\n\,
                                                         \p68: \, convPvalue(p68), \\n\,
                                                         \p48: \, convPvalue(p48), \\n\,
                                                         \p28: \,convPvalue( p28), \\n\,
                                                         \p08: \,convPvalue( p08), \\n\),
             color = \black\, hjust = 0, size = 3)  +
    scale_fill_manual(values = c(\#d9d9d9\, \#bdbdbd\, \#969696\, \#737373\, \#525252\))
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO_P-N\)

# dTAG
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_dTAG)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_dTAG_P-N\)

# diff
temp.tb <- gene.insScore %>% dplyr::select(group, diff_boundaryInsScore)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_diff_P-N\, ymin = -0.5, ymax = 1)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### Plotting for groups

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR1Z0Y0RJZ1BDMGdjbVZoWkZKRVV5aG9aWEpsS0hKbGMzVnNkRVJwY2l3Z1hDSm5aVzVsWDJ4dmIzQmZiR2x1YXk1eVpITmNJaWtwWEc1Y2JuQnpUM1psY2pRZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y3lBK1BTQTBLU2trWjJWdVpWeHVjSE5QZG1WeU15QThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCeklENDlJRE1zSUc1MWJWOXdjeUE4SURRcEtTUm5aVzVsWEc1d2MwOTJaWEl5SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSE1nUGowZ01pd2diblZ0WDNCeklEd2dNeWtwSkdkbGJtVmNibkJ6VDNabGNqRWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2N5QStQU0F4TENCdWRXMWZjSE1nUENBeUtTa2taMlZ1WlZ4dWNITlBkbVZ5TUNBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J6SUR3Z01Ta3BKR2RsYm1WY2JseHVYRzVuWlc1bExtbHVjMU5qYjNKbElEd3RJR2RsYm1VdWFXNXpVMk52Y21VdVlXeHNJQ1UrSlNCeWIzZDNhWE5sS0NrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1hHNGdJR2R5YjNWd0lEMGdhV1psYkhObEtHVnVjMlZ0WW13Z0pXbHVKU0J3YzA5MlpYSTBMQ0JjSW5BMFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnY0hOUGRtVnlNeXdnWENKd00xd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHVnVjMlZ0WW13Z0pXbHVKU0J3YzA5MlpYSXlMQ0JjSW5BeVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dWdWMyVnRZbXdnSldsdUpTQndjMDkyWlhJeExDQmNJbkF4WENJc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aVzV6WlcxaWJDQWxhVzRsSUhCelQzWmxjakFzSUZ3aWNEQmNJaXdnVGtFcEtTa3BLU2tnSUNVK0pTQmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpZ2hhWE11Ym1Fb1ozSnZkWEFwS1Z4dVhHNW5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOVozSnZkWEF4S1NBcEpITmpiM0psWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TWlrZ0tTUnpZMjl5WlZ4dUlDQjNhV3dnUEMwZ2QybHNZMjk0TG5SbGMzUW9aR2x6ZEdGdVkyVXhMQ0JrYVhOMFlXNWpaVElwWEc0Z0lISmxkSFZ5YmloM2FXd2tjQzUyWVd4MVpTbGNibjFjYmx4dWNHeHZkRjlwYm5OVFkyOXlaU0E4TFNCbWRXNWpkR2x2YmloMFpXMXdMblJpTENCdWIzUmxMQ0I1YldsdUlEMGdNQ3dnZVcxaGVDQTlJREV1TlNsN1hHNGdJSEF3TVNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRndpY0RCY0lpd2dYQ0p3TVZ3aUtTd2dOU2xjYmlBZ2NERXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hDSndNVndpTENCY0luQXlYQ0lwTENBMUtWeHVJQ0J3TWpNZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjSW5BeVhDSXNJRndpY0ROY0lpa3NJRFVwWEc0Z0lIQXpOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGd2ljRE5jSWl3Z1hDSndORndpS1N3Z05TbGNiaUFnY0RJMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWENKd01sd2lMQ0JjSW5BMFhDSXBMQ0ExS1Z4dUlDQndNVFFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbkF4WENJc0lGd2ljRFJjSWlrc0lEVXBYRzRnSUhBd05DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ3aWNEQmNJaXdnWENKd05Gd2lLU3dnTlNsY2JpQWdYRzRnSUhBZ1BDMGdaMmR3Ykc5MEtIUmxiWEF1ZEdJc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQnpZMjl5WlNrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCbmNtOTFjQ2tzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUNBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDdGNiaUFnSUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGd2ljbVZrWENJc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUtTQXJYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1kyOXZjbVJmWTJGeWRHVnphV0Z1S0hsc2FXMGdQU0JqS0hsdGFXNHNJSGx0WVhncEtTQXJYRzRnSUNBZ1lXNXViM1JoZEdVb1hDSjBaWGgwWENJc0lIZ2dQU0F4TENCNUlEMGdlVzFwYmlBcklERXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGd2ljREF4T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3TURFcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd01USTZJRndpTENCamIyNTJVSFpoYkhWbEtIQXhNaWtzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkF5TXpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0RJektTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNETTBPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNelFwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3TWpRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeU5Da3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQXhORG9nWENJc1kyOXVkbEIyWVd4MVpTZ2djREUwS1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0RBME9pQmNJaXhqYjI1MlVIWmhiSFZsS0NCd01EUXBMQ0JjSWx4Y2Jsd2lLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wSUN0Y2JpQWdJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aUkyUTVaRGxrT1Z3aUxDQmNJaU5pWkdKa1ltUmNJaXdnWENJak9UWTVOamsyWENJc0lGd2lJemN6TnpNM00xd2lMQ0JjSWlNMU1qVXlOVEpjSWlrcFhHNGdJRnh1SUNCY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpYVc1emRXeGhkR2x2Ymw5elkyOXlaVjljSWl3Z2JtOTBaU2xjYmlBZ2FHVnBaMmgwSUR3dElETmNiaUFnZDJsa2RHZ2dQQzBnTTF4dUlDQndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dWZWeHVYRzRqSUVSTlUwOWNiblJsYlhBdWRHSWdQQzBnWjJWdVpTNXBibk5UWTI5eVpTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaG5jbTkxY0N3Z1ltOTFibVJoY25sSmJuTlRZMjl5WlY5RVRWTlBLVnh1WTI5c2JtRnRaWE1vZEdWdGNDNTBZaWtnUEMwZ1l5aGNJbWR5YjNWd1hDSXNJRndpYzJOdmNtVmNJaWxjYm5Cc2IzUmZhVzV6VTJOdmNtVW9kR1Z0Y0M1MFlpd2dYQ0p1WldGeVpYTjBRbTkxYm1SaGNubGZSRTFUVDE5UUxWTmNJaWxjYmx4dUl5QmtWRUZIWEc1MFpXMXdMblJpSUR3dElHZGxibVV1YVc1elUyTnZjbVVnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJR0p2ZFc1a1lYSjVTVzV6VTJOdmNtVmZaRlJCUnlsY2JtTnZiRzVoYldWektIUmxiWEF1ZEdJcElEd3RJR01vWENKbmNtOTFjRndpTENCY0luTmpiM0psWENJcFhHNXdiRzkwWDJsdWMxTmpiM0psS0hSbGJYQXVkR0lzSUZ3aWJtVmhjbVZ6ZEVKdmRXNWtZWEo1WDJSVVFVZGZVQzFUWENJcFhHNWNiaU1nWkdsbVpseHVkR1Z0Y0M1MFlpQThMU0JuWlc1bExtbHVjMU5qYjNKbElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHZHliM1Z3TENCa2FXWm1YMkp2ZFc1a1lYSjVTVzV6VTJOdmNtVXBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xuUmlLU0E4TFNCaktGd2laM0p2ZFhCY0lpd2dYQ0p6WTI5eVpWd2lLVnh1Y0d4dmRGOXBibk5UWTI5eVpTaDBaVzF3TG5SaUxDQmNJbTVsWVhKbGMzUkNiM1Z1WkdGeWVWOWthV1ptWDFBdFUxd2lMQ0I1YldsdUlEMGdMVEF1TlN3Z2VXMWhlQ0E5SURFcFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGluay5yZHNcXCkpXG5cbnBzT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSA0KSkkZ2VuZVxucHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDMsIG51bV9wcyA8IDQpKSRnZW5lXG5wc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMiwgbnVtX3BzIDwgMykpJGdlbmVcbnBzT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAxLCBudW1fcHMgPCAyKSkkZ2VuZVxucHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzIDwgMSkpJGdlbmVcblxuXG5nZW5lLmluc1Njb3JlIDwtIGdlbmUuaW5zU2NvcmUuYWxsICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBwc092ZXI0LCBcXHA0XFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcHNPdmVyMywgXFxwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwc092ZXIyLCBcXHAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwc092ZXIxLCBcXHAxXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBzT3ZlcjAsIFxccDBcXCwgTkEpKSkpKSkgICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7XG4gIHAwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwMVxcKSwgNSlcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMVxcLCBcXHAyXFwpLCA1KVxuICBwMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAyXFwsIFxccDNcXCksIDUpXG4gIHAzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDNcXCwgXFxwNFxcKSwgNSlcbiAgcDI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMlxcLCBcXHA0XFwpLCA1KVxuICBwMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAxXFwsIFxccDRcXCksIDUpXG4gIHAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwNFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDAxOiBcXCwgY29udlB2YWx1ZShwMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyMzogXFwsIGNvbnZQdmFsdWUocDIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDM0OiBcXCwgY29udlB2YWx1ZShwMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjQ6IFxcLCBjb252UHZhbHVlKHAyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNDogXFwsY29udlB2YWx1ZSggcDE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDA0OiBcXCxjb252UHZhbHVlKCBwMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI2Q5ZDlkOVxcLCBcXCNiZGJkYmRcXCwgXFwjOTY5Njk2XFwsIFxcIzczNzM3M1xcLCBcXCM1MjUyNTJcXCkpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbl9zY29yZV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIERNU09cbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfRE1TT19QLVNcXClcblxuIyBkVEFHXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X2RUQUdfUC1TXFwpXG5cbiMgZGlmZlxudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kaWZmX1AtU1xcLCB5bWluID0gLTAuNSwgeW1heCA9IDEpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene


gene.insScore <- gene.insScore.all %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% psOver4, \p4\,
                 ifelse(ensembl %in% psOver3, \p3\,
                        ifelse(ensembl %in% psOver2, \p2\,
                               ifelse(ensembl %in% psOver1, \p1\, 
                                      ifelse(ensembl %in% psOver0, \p0\, NA))))))  %>% 
  dplyr::filter(!is.na(group))

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$score
  distance2 <- (data %>% dplyr::filter(group ==group2) )$score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

plot_insScore <- function(temp.tb, note, ymin = 0, ymax = 1.5){
  p01 <- round(getPvalWilcox(temp.tb, \p0\, \p1\), 5)
  p12 <- round(getPvalWilcox(temp.tb, \p1\, \p2\), 5)
  p23 <- round(getPvalWilcox(temp.tb, \p2\, \p3\), 5)
  p34 <- round(getPvalWilcox(temp.tb, \p3\, \p4\), 5)
  p24 <- round(getPvalWilcox(temp.tb, \p2\, \p4\), 5)
  p14 <- round(getPvalWilcox(temp.tb, \p1\, \p4\), 5)
  p04 <- round(getPvalWilcox(temp.tb, \p0\, \p4\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p01: \, convPvalue(p01), \\n\,
                                                         \p12: \, convPvalue(p12), \\n\,
                                                         \p23: \, convPvalue(p23), \\n\,
                                                         \p34: \, convPvalue(p34), \\n\,
                                                         \p24: \, convPvalue(p24), \\n\,
                                                         \p14: \,convPvalue( p14), \\n\,
                                                         \p04: \,convPvalue( p04), \\n\), 
             color = \black\, hjust = 0, size = 3) +
    scale_fill_manual(values = c(\#d9d9d9\, \#bdbdbd\, \#969696\, \#737373\, \#525252\))
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO_P-S\)

# dTAG
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_dTAG)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_dTAG_P-S\)

# diff
temp.tb <- gene.insScore %>% dplyr::select(group, diff_boundaryInsScore)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_diff_P-S\, ymin = -0.5, ymax = 1)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRHVnRjRElnUEMwZ2NtVmhaRkpFVXlob1pYSmxLSEpsYzNWc2RFUnBjaXdnWEZ4blpXNWxYMnh2YjNCZmJHbHVheTV5WkhOY1hDa3BYRzVjYm5CelQzWmxjalFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjeUErUFNBMEtTa2taMlZ1WlZ4dWNITlBkbVZ5TXlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J6SUQ0OUlETXNJRzUxYlY5d2N5QThJRFFwS1NSblpXNWxYRzV3YzA5MlpYSXlJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNITWdQajBnTWl3Z2JuVnRYM0J6SUR3Z015a3BKR2RsYm1WY2JuQnpUM1psY2pFZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y3lBK1BTQXhMQ0J1ZFcxZmNITWdQQ0F5S1Nra1oyVnVaVnh1Y0hOUGRtVnlNQ0E4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQnpJRHdnTVNrcEpHZGxibVZjYmx4dVhHNW5aVzVsTG1sdWMxTmpiM0psSUR3dElHZGxibVV1YVc1elUyTnZjbVV1WVd4c0lDVStKU0J5YjNkM2FYTmxLQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lHZHliM1Z3SUQwZ2FXWmxiSE5sS0dWdWMyVnRZbXdnSldsdUpTQndjMDkyWlhJMExDQmNYSEEwWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdjSE5QZG1WeU15d2dYRnh3TTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dWdWMyVnRZbXdnSldsdUpTQndjMDkyWlhJeUxDQmNYSEF5WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR1Z1YzJWdFltd2dKV2x1SlNCd2MwOTJaWEl4TENCY1hIQXhYRndzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1pXNXpaVzFpYkNBbGFXNGxJSEJ6VDNabGNqQXNJRnhjY0RCY1hDd2dUa0VwS1NrcEtTa2dJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lnaGFYTXVibUVvWjNKdmRYQXBLVnh1WEc1blpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaUFnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXhLU0FwSkhOamIzSmxYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNaWtnS1NSelkyOXlaVnh1SUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JuMWNibHh1Y0d4dmRGOXBibk5UWTI5eVpTQThMU0JtZFc1amRHbHZiaWgwWlcxd0xuUmlMQ0J1YjNSbExDQjViV2x1SUQwZ01Dd2dlVzFoZUNBOUlERXVOU2w3WEc0Z0lIQXdNU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGeGNjREJjWEN3Z1hGeHdNVnhjS1N3Z05TbGNiaUFnY0RFeUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWEZ4d01WeGNMQ0JjWEhBeVhGd3BMQ0ExS1Z4dUlDQndNak1nUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNYSEF5WEZ3c0lGeGNjRE5jWENrc0lEVXBYRzRnSUhBek5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ4Y2NETmNYQ3dnWEZ4d05GeGNLU3dnTlNsY2JpQWdjREkwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYRnh3TWx4Y0xDQmNYSEEwWEZ3cExDQTFLVnh1SUNCd01UUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hIQXhYRndzSUZ4Y2NEUmNYQ2tzSURVcFhHNGdJSEF3TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRnhjY0RCY1hDd2dYRnh3TkZ4Y0tTd2dOU2xjYmlBZ1hHNGdJSEFnUEMwZ1oyZHdiRzkwS0hSbGJYQXVkR0lzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCelkyOXlaU2twSUNzZ1oyVnZiVjkyYVc5c2FXNG9ZV1Z6S0dacGJHd2dQU0JuY205MWNDa3NJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ1hHNGdJQ0FnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUN0Y2JpQWdJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ4Y2NtVmtYRndzSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjS1NBclhHNGdJQ0FnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLSGx0YVc0c0lIbHRZWGdwS1NBclhHNGdJQ0FnWVc1dWIzUmhkR1VvWEZ4MFpYaDBYRndzSUhnZ1BTQXhMQ0I1SUQwZ2VXMXBiaUFySURFc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z4Y2NEQXhPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdNREVwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3TVRJNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hBeE1pa3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQXlNem9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jREl6S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0RNME9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod016UXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdNalE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF5TkNrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhBeE5Eb2dYRndzWTI5dWRsQjJZV3gxWlNnZ2NERTBLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjREEwT2lCY1hDeGpiMjUyVUhaaGJIVmxLQ0J3TURRcExDQmNYRnhjYmx4Y0tTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBJQ3RjYmlBZ0lDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjSTJRNVpEbGtPVnhjTENCY1hDTmlaR0prWW1SY1hDd2dYRndqT1RZNU5qazJYRndzSUZ4Y0l6Y3pOek0zTTF4Y0xDQmNYQ00xTWpVeU5USmNYQ2twWEc0Z0lGeHVJQ0JjYmlBZ1ptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNhVzV6ZFd4aGRHbHZibDl6WTI5eVpWOWNYQ3dnYm05MFpTbGNiaUFnYUdWcFoyaDBJRHd0SUROY2JpQWdkMmxrZEdnZ1BDMGdNMXh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0J6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1ZlZ4dVhHNGpJRVJOVTA5Y2JuUmxiWEF1ZEdJZ1BDMGdaMlZ1WlM1cGJuTlRZMjl5WlNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENobmNtOTFjQ3dnWW05MWJtUmhjbmxKYm5OVFkyOXlaVjlFVFZOUEtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0M1MFlpa2dQQzBnWXloY1hHZHliM1Z3WEZ3c0lGeGNjMk52Y21WY1hDbGNibkJzYjNSZmFXNXpVMk52Y21Vb2RHVnRjQzUwWWl3Z1hGeHVaV0Z5WlhOMFFtOTFibVJoY25sZlJFMVRUMTlRTFZOY1hDbGNibHh1SXlCa1ZFRkhYRzUwWlcxd0xuUmlJRHd0SUdkbGJtVXVhVzV6VTJOdmNtVWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHSnZkVzVrWVhKNVNXNXpVMk52Y21WZlpGUkJSeWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXVkR0lwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEhOamIzSmxYRndwWEc1d2JHOTBYMmx1YzFOamIzSmxLSFJsYlhBdWRHSXNJRnhjYm1WaGNtVnpkRUp2ZFc1a1lYSjVYMlJVUVVkZlVDMVRYRndwWEc1Y2JpTWdaR2xtWmx4dWRHVnRjQzUwWWlBOExTQm5aVzVsTG1sdWMxTmpiM0psSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dkeWIzVndMQ0JrYVdabVgySnZkVzVrWVhKNVNXNXpVMk52Y21VcFhHNWpiMnh1WVcxbGN5aDBaVzF3TG5SaUtTQThMU0JqS0Z4Y1ozSnZkWEJjWEN3Z1hGeHpZMjl5WlZ4Y0tWeHVjR3h2ZEY5cGJuTlRZMjl5WlNoMFpXMXdMblJpTENCY1hHNWxZWEpsYzNSQ2IzVnVaR0Z5ZVY5a2FXWm1YMUF0VTF4Y0xDQjViV2x1SUQwZ0xUQXVOU3dnZVcxaGVDQTlJREVwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGluay5yZHNcXCkpXG5cbnBzT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSA0KSkkZ2VuZVxucHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDMsIG51bV9wcyA8IDQpKSRnZW5lXG5wc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMiwgbnVtX3BzIDwgMykpJGdlbmVcbnBzT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAxLCBudW1fcHMgPCAyKSkkZ2VuZVxucHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzIDwgMSkpJGdlbmVcblxuXG5nZW5lLmluc1Njb3JlIDwtIGdlbmUuaW5zU2NvcmUuYWxsICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBwc092ZXI0LCBcXHA0XFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcHNPdmVyMywgXFxwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwc092ZXIyLCBcXHAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwc092ZXIxLCBcXHAxXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBzT3ZlcjAsIFxccDBcXCwgTkEpKSkpKSkgICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7XG4gIHAwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwMVxcKSwgNSlcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMVxcLCBcXHAyXFwpLCA1KVxuICBwMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAyXFwsIFxccDNcXCksIDUpXG4gIHAzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDNcXCwgXFxwNFxcKSwgNSlcbiAgcDI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMlxcLCBcXHA0XFwpLCA1KVxuICBwMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAxXFwsIFxccDRcXCksIDUpXG4gIHAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwNFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDAxOiBcXCwgY29udlB2YWx1ZShwMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyMzogXFwsIGNvbnZQdmFsdWUocDIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDM0OiBcXCwgY29udlB2YWx1ZShwMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjQ6IFxcLCBjb252UHZhbHVlKHAyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNDogXFwsY29udlB2YWx1ZSggcDE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDA0OiBcXCxjb252UHZhbHVlKCBwMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI2Q5ZDlkOVxcLCBcXCNiZGJkYmRcXCwgXFwjOTY5Njk2XFwsIFxcIzczNzM3M1xcLCBcXCM1MjUyNTJcXCkpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbl9zY29yZV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIERNU09cbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfRE1TT19QLVNcXClcblxuIyBkVEFHXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X2RUQUdfUC1TXFwpXG5cbiMgZGlmZlxudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kaWZmX1AtU1xcLCB5bWluID0gLTAuNSwgeW1heCA9IDEpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGluay5yZHNcXCkpXG5cbnBzT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSA0KSkkZ2VuZVxucHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDMsIG51bV9wcyA8IDQpKSRnZW5lXG5wc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMiwgbnVtX3BzIDwgMykpJGdlbmVcbnBzT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAxLCBudW1fcHMgPCAyKSkkZ2VuZVxucHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzIDwgMSkpJGdlbmVcblxuXG5nZW5lLmluc1Njb3JlIDwtIGdlbmUuaW5zU2NvcmUuYWxsICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBwc092ZXI0LCBcXHA0XFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcHNPdmVyMywgXFxwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwc092ZXIyLCBcXHAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwc092ZXIxLCBcXHAxXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBzT3ZlcjAsIFxccDBcXCwgTkEpKSkpKSkgICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7XG4gIHAwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwMVxcKSwgNSlcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMVxcLCBcXHAyXFwpLCA1KVxuICBwMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAyXFwsIFxccDNcXCksIDUpXG4gIHAzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDNcXCwgXFxwNFxcKSwgNSlcbiAgcDI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMlxcLCBcXHA0XFwpLCA1KVxuICBwMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAxXFwsIFxccDRcXCksIDUpXG4gIHAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwNFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDAxOiBcXCwgY29udlB2YWx1ZShwMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyMzogXFwsIGNvbnZQdmFsdWUocDIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDM0OiBcXCwgY29udlB2YWx1ZShwMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjQ6IFxcLCBjb252UHZhbHVlKHAyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNDogXFwsY29udlB2YWx1ZSggcDE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDA0OiBcXCxjb252UHZhbHVlKCBwMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI2Q5ZDlkOVxcLCBcXCNiZGJkYmRcXCwgXFwjOTY5Njk2XFwsIFxcIzczNzM3M1xcLCBcXCM1MjUyNTJcXCkpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbl9zY29yZV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIERNU09cbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfRE1TT19QLVNcXClcblxuIyBkVEFHXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X2RUQUdfUC1TXFwpXG5cbiMgZGlmZlxudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kaWZmX1AtU1xcLCB5bWluID0gLTAuNSwgeW1heCA9IDEpXG5gYGBcbmBgYCJ9 -->

```r
```r
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene


gene.insScore <- gene.insScore.all %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% psOver4, \p4\,
                 ifelse(ensembl %in% psOver3, \p3\,
                        ifelse(ensembl %in% psOver2, \p2\,
                               ifelse(ensembl %in% psOver1, \p1\, 
                                      ifelse(ensembl %in% psOver0, \p0\, NA))))))  %>% 
  dplyr::filter(!is.na(group))

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$score
  distance2 <- (data %>% dplyr::filter(group ==group2) )$score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

plot_insScore <- function(temp.tb, note, ymin = 0, ymax = 1.5){
  p01 <- round(getPvalWilcox(temp.tb, \p0\, \p1\), 5)
  p12 <- round(getPvalWilcox(temp.tb, \p1\, \p2\), 5)
  p23 <- round(getPvalWilcox(temp.tb, \p2\, \p3\), 5)
  p34 <- round(getPvalWilcox(temp.tb, \p3\, \p4\), 5)
  p24 <- round(getPvalWilcox(temp.tb, \p2\, \p4\), 5)
  p14 <- round(getPvalWilcox(temp.tb, \p1\, \p4\), 5)
  p04 <- round(getPvalWilcox(temp.tb, \p0\, \p4\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p01: \, convPvalue(p01), \\n\,
                                                         \p12: \, convPvalue(p12), \\n\,
                                                         \p23: \, convPvalue(p23), \\n\,
                                                         \p34: \, convPvalue(p34), \\n\,
                                                         \p24: \, convPvalue(p24), \\n\,
                                                         \p14: \,convPvalue( p14), \\n\,
                                                         \p04: \,convPvalue( p04), \\n\), 
             color = \black\, hjust = 0, size = 3) +
    scale_fill_manual(values = c(\#d9d9d9\, \#bdbdbd\, \#969696\, \#737373\, \#525252\))
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO_P-S\)

# dTAG
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_dTAG)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_dTAG_P-S\)

# diff
temp.tb <- gene.insScore %>% dplyr::select(group, diff_boundaryInsScore)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_diff_P-S\, ymin = -0.5, ymax = 1)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### Plotting for P-N

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR1Z0Y0RJZ1BDMGdjbVZoWkZKRVV5aG9aWEpsS0hKbGMzVnNkRVJwY2l3Z1hDSm5aVzVsWDJ4dmIzQmZiR2x1YXk1eVpITmNJaWtwWEc1Y2JuQmxUM1psY2pRZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3WlNBK1BTQTBLU2trWjJWdVpWeHVjR1ZQZG1WeU15QThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCbElENDlJRE1zSUc1MWJWOXdaU0E4SURRcEtTUm5aVzVsWEc1d1pVOTJaWEl5SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjR1VnUGowZ01pd2diblZ0WDNCbElEd2dNeWtwSkdkbGJtVmNibkJsVDNabGNqRWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d1pTQStQU0F4TENCdWRXMWZjR1VnUENBeUtTa2taMlZ1WlZ4dWNHVlBkbVZ5TUNBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0JsSUR3Z01Ta3BKR2RsYm1WY2JseHVYRzVuWlc1bExtbHVjMU5qYjNKbElEd3RJR2RsYm1VdWFXNXpVMk52Y21VdVlXeHNJQ1UrSlNCeWIzZDNhWE5sS0NrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1hHNGdJR2R5YjNWd0lEMGdhV1psYkhObEtHVnVjMlZ0WW13Z0pXbHVKU0J3WlU5MlpYSTBMQ0JjSW5BMFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnY0dWUGRtVnlNeXdnWENKd00xd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHVnVjMlZ0WW13Z0pXbHVKU0J3WlU5MlpYSXlMQ0JjSW5BeVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dWdWMyVnRZbXdnSldsdUpTQndaVTkyWlhJeExDQmNJbkF4WENJc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aVzV6WlcxaWJDQWxhVzRsSUhCbFQzWmxjakFzSUZ3aWNEQmNJaXdnVGtFcEtTa3BLU2tnSUNVK0pTQmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpZ2hhWE11Ym1Fb1ozSnZkWEFwS1Z4dVhHNW5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOVozSnZkWEF4S1NBcEpITmpiM0psWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TWlrZ0tTUnpZMjl5WlZ4dUlDQjNhV3dnUEMwZ2QybHNZMjk0TG5SbGMzUW9aR2x6ZEdGdVkyVXhMQ0JrYVhOMFlXNWpaVElwWEc0Z0lISmxkSFZ5YmloM2FXd2tjQzUyWVd4MVpTbGNibjFjYmx4dWNHeHZkRjlwYm5OVFkyOXlaU0E4TFNCbWRXNWpkR2x2YmloMFpXMXdMblJpTENCdWIzUmxMQ0I1YldsdUlEMGdNQ3dnZVcxaGVDQTlJREV1TlNsN1hHNGdJSEF3TVNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRndpY0RCY0lpd2dYQ0p3TVZ3aUtTd2dOU2xjYmlBZ2NERXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hDSndNVndpTENCY0luQXlYQ0lwTENBMUtWeHVJQ0J3TWpNZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjSW5BeVhDSXNJRndpY0ROY0lpa3NJRFVwWEc0Z0lIQXpOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGd2ljRE5jSWl3Z1hDSndORndpS1N3Z05TbGNiaUFnY0RJMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWENKd01sd2lMQ0JjSW5BMFhDSXBMQ0ExS1Z4dUlDQndNVFFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbkF4WENJc0lGd2ljRFJjSWlrc0lEVXBYRzRnSUhBd05DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ3aWNEQmNJaXdnWENKd05Gd2lLU3dnTlNsY2JpQWdYRzRnSUhBZ1BDMGdaMmR3Ykc5MEtIUmxiWEF1ZEdJc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQnpZMjl5WlNrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCbmNtOTFjQ2tzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUNBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDdGNiaUFnSUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGd2ljbVZrWENJc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUtTQXJYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1kyOXZjbVJmWTJGeWRHVnphV0Z1S0hsc2FXMGdQU0JqS0hsdGFXNHNJSGx0WVhncEtTQXJYRzRnSUNBZ1lXNXViM1JoZEdVb1hDSjBaWGgwWENJc0lIZ2dQU0F4TENCNUlEMGdlVzFwYmlBcklERXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGd2ljREF4T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3TURFcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd01USTZJRndpTENCamIyNTJVSFpoYkhWbEtIQXhNaWtzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkF5TXpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0RJektTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNETTBPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNelFwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3TWpRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeU5Da3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQXhORG9nWENJc1kyOXVkbEIyWVd4MVpTZ2djREUwS1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0RBME9pQmNJaXhqYjI1MlVIWmhiSFZsS0NCd01EUXBMQ0JjSWx4Y2Jsd2lLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wSUN0Y2JpQWdJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aUkyUTVaRGxrT1Z3aUxDQmNJaU5pWkdKa1ltUmNJaXdnWENJak9UWTVOamsyWENJc0lGd2lJemN6TnpNM00xd2lMQ0JjSWlNMU1qVXlOVEpjSWlrcFhHNGdJRnh1SUNCY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpYVc1emRXeGhkR2x2Ymw5elkyOXlaVjljSWl3Z2JtOTBaU2xjYmlBZ2FHVnBaMmgwSUR3dElETmNiaUFnZDJsa2RHZ2dQQzBnTTF4dUlDQndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dWZWeHVYRzRqSUVSTlUwOWNiblJsYlhBdWRHSWdQQzBnWjJWdVpTNXBibk5UWTI5eVpTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaG5jbTkxY0N3Z1ltOTFibVJoY25sSmJuTlRZMjl5WlY5RVRWTlBLVnh1WTI5c2JtRnRaWE1vZEdWdGNDNTBZaWtnUEMwZ1l5aGNJbWR5YjNWd1hDSXNJRndpYzJOdmNtVmNJaWxjYm5Cc2IzUmZhVzV6VTJOdmNtVW9kR1Z0Y0M1MFlpd2dYQ0p1WldGeVpYTjBRbTkxYm1SaGNubGZSRTFUVDE5UUxVVmNJaWxjYmx4dUl5QmtWRUZIWEc1MFpXMXdMblJpSUR3dElHZGxibVV1YVc1elUyTnZjbVVnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJR0p2ZFc1a1lYSjVTVzV6VTJOdmNtVmZaRlJCUnlsY2JtTnZiRzVoYldWektIUmxiWEF1ZEdJcElEd3RJR01vWENKbmNtOTFjRndpTENCY0luTmpiM0psWENJcFhHNXdiRzkwWDJsdWMxTmpiM0psS0hSbGJYQXVkR0lzSUZ3aWJtVmhjbVZ6ZEVKdmRXNWtZWEo1WDJSVVFVZGZVQzFGWENJcFhHNWNiaU1nWkdsbVpseHVkR1Z0Y0M1MFlpQThMU0JuWlc1bExtbHVjMU5qYjNKbElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHZHliM1Z3TENCa2FXWm1YMkp2ZFc1a1lYSjVTVzV6VTJOdmNtVXBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xuUmlLU0E4TFNCaktGd2laM0p2ZFhCY0lpd2dYQ0p6WTI5eVpWd2lLVnh1Y0d4dmRGOXBibk5UWTI5eVpTaDBaVzF3TG5SaUxDQmNJbTVsWVhKbGMzUkNiM1Z1WkdGeWVWOWthV1ptWDFBdFJWd2lMQ0I1YldsdUlEMGdMVEF1TlN3Z2VXMWhlQ0E5SURFcFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGluay5yZHNcXCkpXG5cbnBlT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSA0KSkkZ2VuZVxucGVPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lXG5wZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmVcbnBlT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAxLCBudW1fcGUgPCAyKSkkZ2VuZVxucGVPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmVcblxuXG5nZW5lLmluc1Njb3JlIDwtIGdlbmUuaW5zU2NvcmUuYWxsICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBwZU92ZXI0LCBcXHA0XFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcGVPdmVyMywgXFxwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwZU92ZXIyLCBcXHAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwZU92ZXIxLCBcXHAxXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBlT3ZlcjAsIFxccDBcXCwgTkEpKSkpKSkgICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7XG4gIHAwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwMVxcKSwgNSlcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMVxcLCBcXHAyXFwpLCA1KVxuICBwMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAyXFwsIFxccDNcXCksIDUpXG4gIHAzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDNcXCwgXFxwNFxcKSwgNSlcbiAgcDI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMlxcLCBcXHA0XFwpLCA1KVxuICBwMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAxXFwsIFxccDRcXCksIDUpXG4gIHAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwNFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDAxOiBcXCwgY29udlB2YWx1ZShwMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyMzogXFwsIGNvbnZQdmFsdWUocDIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDM0OiBcXCwgY29udlB2YWx1ZShwMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjQ6IFxcLCBjb252UHZhbHVlKHAyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNDogXFwsY29udlB2YWx1ZSggcDE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDA0OiBcXCxjb252UHZhbHVlKCBwMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI2Q5ZDlkOVxcLCBcXCNiZGJkYmRcXCwgXFwjOTY5Njk2XFwsIFxcIzczNzM3M1xcLCBcXCM1MjUyNTJcXCkpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbl9zY29yZV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIERNU09cbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfRE1TT19QLUVcXClcblxuIyBkVEFHXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X2RUQUdfUC1FXFwpXG5cbiMgZGlmZlxudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kaWZmX1AtRVxcLCB5bWluID0gLTAuNSwgeW1heCA9IDEpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene


gene.insScore <- gene.insScore.all %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% peOver4, \p4\,
                 ifelse(ensembl %in% peOver3, \p3\,
                        ifelse(ensembl %in% peOver2, \p2\,
                               ifelse(ensembl %in% peOver1, \p1\, 
                                      ifelse(ensembl %in% peOver0, \p0\, NA))))))  %>% 
  dplyr::filter(!is.na(group))

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$score
  distance2 <- (data %>% dplyr::filter(group ==group2) )$score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

plot_insScore <- function(temp.tb, note, ymin = 0, ymax = 1.5){
  p01 <- round(getPvalWilcox(temp.tb, \p0\, \p1\), 5)
  p12 <- round(getPvalWilcox(temp.tb, \p1\, \p2\), 5)
  p23 <- round(getPvalWilcox(temp.tb, \p2\, \p3\), 5)
  p34 <- round(getPvalWilcox(temp.tb, \p3\, \p4\), 5)
  p24 <- round(getPvalWilcox(temp.tb, \p2\, \p4\), 5)
  p14 <- round(getPvalWilcox(temp.tb, \p1\, \p4\), 5)
  p04 <- round(getPvalWilcox(temp.tb, \p0\, \p4\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p01: \, convPvalue(p01), \\n\,
                                                         \p12: \, convPvalue(p12), \\n\,
                                                         \p23: \, convPvalue(p23), \\n\,
                                                         \p34: \, convPvalue(p34), \\n\,
                                                         \p24: \, convPvalue(p24), \\n\,
                                                         \p14: \,convPvalue( p14), \\n\,
                                                         \p04: \,convPvalue( p04), \\n\), 
             color = \black\, hjust = 0, size = 3) +
    scale_fill_manual(values = c(\#d9d9d9\, \#bdbdbd\, \#969696\, \#737373\, \#525252\))
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO_P-E\)

# dTAG
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_dTAG)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_dTAG_P-E\)

# diff
temp.tb <- gene.insScore %>% dplyr::select(group, diff_boundaryInsScore)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_diff_P-E\, ymin = -0.5, ymax = 1)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRHVnRjRElnUEMwZ2NtVmhaRkpFVXlob1pYSmxLSEpsYzNWc2RFUnBjaXdnWEZ4blpXNWxYMnh2YjNCZmJHbHVheTV5WkhOY1hDa3BYRzVjYm5CbFQzWmxjalFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdaU0ErUFNBMEtTa2taMlZ1WlZ4dWNHVlBkbVZ5TXlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0JsSUQ0OUlETXNJRzUxYlY5d1pTQThJRFFwS1NSblpXNWxYRzV3WlU5MlpYSXlJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNHVWdQajBnTWl3Z2JuVnRYM0JsSUR3Z015a3BKR2RsYm1WY2JuQmxUM1psY2pFZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3WlNBK1BTQXhMQ0J1ZFcxZmNHVWdQQ0F5S1Nra1oyVnVaVnh1Y0dWUGRtVnlNQ0E4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQmxJRHdnTVNrcEpHZGxibVZjYmx4dVhHNW5aVzVsTG1sdWMxTmpiM0psSUR3dElHZGxibVV1YVc1elUyTnZjbVV1WVd4c0lDVStKU0J5YjNkM2FYTmxLQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lHZHliM1Z3SUQwZ2FXWmxiSE5sS0dWdWMyVnRZbXdnSldsdUpTQndaVTkyWlhJMExDQmNYSEEwWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdjR1ZQZG1WeU15d2dYRnh3TTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dWdWMyVnRZbXdnSldsdUpTQndaVTkyWlhJeUxDQmNYSEF5WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR1Z1YzJWdFltd2dKV2x1SlNCd1pVOTJaWEl4TENCY1hIQXhYRndzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1pXNXpaVzFpYkNBbGFXNGxJSEJsVDNabGNqQXNJRnhjY0RCY1hDd2dUa0VwS1NrcEtTa2dJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lnaGFYTXVibUVvWjNKdmRYQXBLVnh1WEc1blpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaUFnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXhLU0FwSkhOamIzSmxYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNaWtnS1NSelkyOXlaVnh1SUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JuMWNibHh1Y0d4dmRGOXBibk5UWTI5eVpTQThMU0JtZFc1amRHbHZiaWgwWlcxd0xuUmlMQ0J1YjNSbExDQjViV2x1SUQwZ01Dd2dlVzFoZUNBOUlERXVOU2w3WEc0Z0lIQXdNU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGeGNjREJjWEN3Z1hGeHdNVnhjS1N3Z05TbGNiaUFnY0RFeUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWEZ4d01WeGNMQ0JjWEhBeVhGd3BMQ0ExS1Z4dUlDQndNak1nUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNYSEF5WEZ3c0lGeGNjRE5jWENrc0lEVXBYRzRnSUhBek5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ4Y2NETmNYQ3dnWEZ4d05GeGNLU3dnTlNsY2JpQWdjREkwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYRnh3TWx4Y0xDQmNYSEEwWEZ3cExDQTFLVnh1SUNCd01UUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hIQXhYRndzSUZ4Y2NEUmNYQ2tzSURVcFhHNGdJSEF3TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRnhjY0RCY1hDd2dYRnh3TkZ4Y0tTd2dOU2xjYmlBZ1hHNGdJSEFnUEMwZ1oyZHdiRzkwS0hSbGJYQXVkR0lzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCelkyOXlaU2twSUNzZ1oyVnZiVjkyYVc5c2FXNG9ZV1Z6S0dacGJHd2dQU0JuY205MWNDa3NJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ1hHNGdJQ0FnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUN0Y2JpQWdJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ4Y2NtVmtYRndzSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjS1NBclhHNGdJQ0FnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLSGx0YVc0c0lIbHRZWGdwS1NBclhHNGdJQ0FnWVc1dWIzUmhkR1VvWEZ4MFpYaDBYRndzSUhnZ1BTQXhMQ0I1SUQwZ2VXMXBiaUFySURFc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z4Y2NEQXhPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdNREVwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3TVRJNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hBeE1pa3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQXlNem9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jREl6S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0RNME9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod016UXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdNalE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF5TkNrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhBeE5Eb2dYRndzWTI5dWRsQjJZV3gxWlNnZ2NERTBLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjREEwT2lCY1hDeGpiMjUyVUhaaGJIVmxLQ0J3TURRcExDQmNYRnhjYmx4Y0tTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBJQ3RjYmlBZ0lDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjSTJRNVpEbGtPVnhjTENCY1hDTmlaR0prWW1SY1hDd2dYRndqT1RZNU5qazJYRndzSUZ4Y0l6Y3pOek0zTTF4Y0xDQmNYQ00xTWpVeU5USmNYQ2twWEc0Z0lGeHVJQ0JjYmlBZ1ptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNhVzV6ZFd4aGRHbHZibDl6WTI5eVpWOWNYQ3dnYm05MFpTbGNiaUFnYUdWcFoyaDBJRHd0SUROY2JpQWdkMmxrZEdnZ1BDMGdNMXh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0J6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1ZlZ4dVhHNGpJRVJOVTA5Y2JuUmxiWEF1ZEdJZ1BDMGdaMlZ1WlM1cGJuTlRZMjl5WlNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENobmNtOTFjQ3dnWW05MWJtUmhjbmxKYm5OVFkyOXlaVjlFVFZOUEtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0M1MFlpa2dQQzBnWXloY1hHZHliM1Z3WEZ3c0lGeGNjMk52Y21WY1hDbGNibkJzYjNSZmFXNXpVMk52Y21Vb2RHVnRjQzUwWWl3Z1hGeHVaV0Z5WlhOMFFtOTFibVJoY25sZlJFMVRUMTlRTFVWY1hDbGNibHh1SXlCa1ZFRkhYRzUwWlcxd0xuUmlJRHd0SUdkbGJtVXVhVzV6VTJOdmNtVWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHSnZkVzVrWVhKNVNXNXpVMk52Y21WZlpGUkJSeWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXVkR0lwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEhOamIzSmxYRndwWEc1d2JHOTBYMmx1YzFOamIzSmxLSFJsYlhBdWRHSXNJRnhjYm1WaGNtVnpkRUp2ZFc1a1lYSjVYMlJVUVVkZlVDMUZYRndwWEc1Y2JpTWdaR2xtWmx4dWRHVnRjQzUwWWlBOExTQm5aVzVsTG1sdWMxTmpiM0psSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dkeWIzVndMQ0JrYVdabVgySnZkVzVrWVhKNVNXNXpVMk52Y21VcFhHNWpiMnh1WVcxbGN5aDBaVzF3TG5SaUtTQThMU0JqS0Z4Y1ozSnZkWEJjWEN3Z1hGeHpZMjl5WlZ4Y0tWeHVjR3h2ZEY5cGJuTlRZMjl5WlNoMFpXMXdMblJpTENCY1hHNWxZWEpsYzNSQ2IzVnVaR0Z5ZVY5a2FXWm1YMUF0UlZ4Y0xDQjViV2x1SUQwZ0xUQXVOU3dnZVcxaGVDQTlJREVwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGluay5yZHNcXCkpXG5cbnBlT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSA0KSkkZ2VuZVxucGVPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lXG5wZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmVcbnBlT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAxLCBudW1fcGUgPCAyKSkkZ2VuZVxucGVPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmVcblxuXG5nZW5lLmluc1Njb3JlIDwtIGdlbmUuaW5zU2NvcmUuYWxsICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBwZU92ZXI0LCBcXHA0XFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcGVPdmVyMywgXFxwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwZU92ZXIyLCBcXHAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwZU92ZXIxLCBcXHAxXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBlT3ZlcjAsIFxccDBcXCwgTkEpKSkpKSkgICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7XG4gIHAwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwMVxcKSwgNSlcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMVxcLCBcXHAyXFwpLCA1KVxuICBwMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAyXFwsIFxccDNcXCksIDUpXG4gIHAzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDNcXCwgXFxwNFxcKSwgNSlcbiAgcDI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMlxcLCBcXHA0XFwpLCA1KVxuICBwMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAxXFwsIFxccDRcXCksIDUpXG4gIHAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwNFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDAxOiBcXCwgY29udlB2YWx1ZShwMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyMzogXFwsIGNvbnZQdmFsdWUocDIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDM0OiBcXCwgY29udlB2YWx1ZShwMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjQ6IFxcLCBjb252UHZhbHVlKHAyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNDogXFwsY29udlB2YWx1ZSggcDE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDA0OiBcXCxjb252UHZhbHVlKCBwMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI2Q5ZDlkOVxcLCBcXCNiZGJkYmRcXCwgXFwjOTY5Njk2XFwsIFxcIzczNzM3M1xcLCBcXCM1MjUyNTJcXCkpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbl9zY29yZV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIERNU09cbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfRE1TT19QLUVcXClcblxuIyBkVEFHXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X2RUQUdfUC1FXFwpXG5cbiMgZGlmZlxudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kaWZmX1AtRVxcLCB5bWluID0gLTAuNSwgeW1heCA9IDEpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGluay5yZHNcXCkpXG5cbnBlT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSA0KSkkZ2VuZVxucGVPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lXG5wZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmVcbnBlT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAxLCBudW1fcGUgPCAyKSkkZ2VuZVxucGVPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmVcblxuXG5nZW5lLmluc1Njb3JlIDwtIGdlbmUuaW5zU2NvcmUuYWxsICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBwZU92ZXI0LCBcXHA0XFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcGVPdmVyMywgXFxwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwZU92ZXIyLCBcXHAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwZU92ZXIxLCBcXHAxXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBlT3ZlcjAsIFxccDBcXCwgTkEpKSkpKSkgICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7XG4gIHAwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwMVxcKSwgNSlcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMVxcLCBcXHAyXFwpLCA1KVxuICBwMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAyXFwsIFxccDNcXCksIDUpXG4gIHAzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDNcXCwgXFxwNFxcKSwgNSlcbiAgcDI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMlxcLCBcXHA0XFwpLCA1KVxuICBwMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAxXFwsIFxccDRcXCksIDUpXG4gIHAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwNFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDAxOiBcXCwgY29udlB2YWx1ZShwMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyMzogXFwsIGNvbnZQdmFsdWUocDIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDM0OiBcXCwgY29udlB2YWx1ZShwMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjQ6IFxcLCBjb252UHZhbHVlKHAyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNDogXFwsY29udlB2YWx1ZSggcDE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDA0OiBcXCxjb252UHZhbHVlKCBwMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI2Q5ZDlkOVxcLCBcXCNiZGJkYmRcXCwgXFwjOTY5Njk2XFwsIFxcIzczNzM3M1xcLCBcXCM1MjUyNTJcXCkpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbl9zY29yZV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIERNU09cbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfRE1TT19QLUVcXClcblxuIyBkVEFHXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X2RUQUdfUC1FXFwpXG5cbiMgZGlmZlxudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kaWZmX1AtRVxcLCB5bWluID0gLTAuNSwgeW1heCA9IDEpXG5gYGBcbmBgYCJ9 -->

```r
```r
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene


gene.insScore <- gene.insScore.all %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% peOver4, \p4\,
                 ifelse(ensembl %in% peOver3, \p3\,
                        ifelse(ensembl %in% peOver2, \p2\,
                               ifelse(ensembl %in% peOver1, \p1\, 
                                      ifelse(ensembl %in% peOver0, \p0\, NA))))))  %>% 
  dplyr::filter(!is.na(group))

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$score
  distance2 <- (data %>% dplyr::filter(group ==group2) )$score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

plot_insScore <- function(temp.tb, note, ymin = 0, ymax = 1.5){
  p01 <- round(getPvalWilcox(temp.tb, \p0\, \p1\), 5)
  p12 <- round(getPvalWilcox(temp.tb, \p1\, \p2\), 5)
  p23 <- round(getPvalWilcox(temp.tb, \p2\, \p3\), 5)
  p34 <- round(getPvalWilcox(temp.tb, \p3\, \p4\), 5)
  p24 <- round(getPvalWilcox(temp.tb, \p2\, \p4\), 5)
  p14 <- round(getPvalWilcox(temp.tb, \p1\, \p4\), 5)
  p04 <- round(getPvalWilcox(temp.tb, \p0\, \p4\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p01: \, convPvalue(p01), \\n\,
                                                         \p12: \, convPvalue(p12), \\n\,
                                                         \p23: \, convPvalue(p23), \\n\,
                                                         \p34: \, convPvalue(p34), \\n\,
                                                         \p24: \, convPvalue(p24), \\n\,
                                                         \p14: \,convPvalue( p14), \\n\,
                                                         \p04: \,convPvalue( p04), \\n\), 
             color = \black\, hjust = 0, size = 3) +
    scale_fill_manual(values = c(\#d9d9d9\, \#bdbdbd\, \#969696\, \#737373\, \#525252\))
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO_P-E\)

# dTAG
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_dTAG)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_dTAG_P-E\)

# diff
temp.tb <- gene.insScore %>% dplyr::select(group, diff_boundaryInsScore)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_diff_P-E\, ymin = -0.5, ymax = 1)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### Plotting for P-S

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR1Z0Y0RJZ1BDMGdjbVZoWkZKRVV5aG9aWEpsS0hKbGMzVnNkRVJwY2l3Z1hDSm5aVzVsWDJ4dmIzQmZiR2x1YXk1eVpITmNJaWtwWEc1Y2JuQndUM1psY2pRZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y0NBK1BTQTBLU2trWjJWdVpWeHVjSEJQZG1WeU15QThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCd0lENDlJRE1zSUc1MWJWOXdjQ0E4SURRcEtTUm5aVzVsWEc1d2NFOTJaWEl5SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSEFnUGowZ01pd2diblZ0WDNCd0lEd2dNeWtwSkdkbGJtVmNibkJ3VDNabGNqRWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2NDQStQU0F4TENCdWRXMWZjSEFnUENBeUtTa2taMlZ1WlZ4dWNIQlBkbVZ5TUNBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J3SUR3Z01Ta3BKR2RsYm1WY2JseHVYRzVuWlc1bExtbHVjMU5qYjNKbElEd3RJR2RsYm1VdWFXNXpVMk52Y21VdVlXeHNJQ1UrSlNCeWIzZDNhWE5sS0NrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1hHNGdJR2R5YjNWd0lEMGdhV1psYkhObEtHVnVjMlZ0WW13Z0pXbHVKU0J3Y0U5MlpYSTBMQ0JjSW5BMFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnY0hCUGRtVnlNeXdnWENKd00xd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHVnVjMlZ0WW13Z0pXbHVKU0J3Y0U5MlpYSXlMQ0JjSW5BeVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dWdWMyVnRZbXdnSldsdUpTQndjRTkyWlhJeExDQmNJbkF4WENJc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aVzV6WlcxaWJDQWxhVzRsSUhCd1QzWmxjakFzSUZ3aWNEQmNJaXdnVGtFcEtTa3BLU2tnSUNVK0pTQmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpZ2hhWE11Ym1Fb1ozSnZkWEFwS1Z4dVhHNW5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOVozSnZkWEF4S1NBcEpITmpiM0psWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TWlrZ0tTUnpZMjl5WlZ4dUlDQjNhV3dnUEMwZ2QybHNZMjk0TG5SbGMzUW9aR2x6ZEdGdVkyVXhMQ0JrYVhOMFlXNWpaVElwWEc0Z0lISmxkSFZ5YmloM2FXd2tjQzUyWVd4MVpTbGNibjFjYmx4dWNHeHZkRjlwYm5OVFkyOXlaU0E4TFNCbWRXNWpkR2x2YmloMFpXMXdMblJpTENCdWIzUmxMQ0I1YldsdUlEMGdNQ3dnZVcxaGVDQTlJREV1TlNsN1hHNGdJSEF3TVNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRndpY0RCY0lpd2dYQ0p3TVZ3aUtTd2dOU2xjYmlBZ2NERXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hDSndNVndpTENCY0luQXlYQ0lwTENBMUtWeHVJQ0J3TWpNZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjSW5BeVhDSXNJRndpY0ROY0lpa3NJRFVwWEc0Z0lIQXpOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGd2ljRE5jSWl3Z1hDSndORndpS1N3Z05TbGNiaUFnY0RJMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWENKd01sd2lMQ0JjSW5BMFhDSXBMQ0ExS1Z4dUlDQndNVFFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbkF4WENJc0lGd2ljRFJjSWlrc0lEVXBYRzRnSUhBd05DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ3aWNEQmNJaXdnWENKd05Gd2lLU3dnTlNsY2JpQWdYRzRnSUhBZ1BDMGdaMmR3Ykc5MEtIUmxiWEF1ZEdJc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQnpZMjl5WlNrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCbmNtOTFjQ2tzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUNBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDdGNiaUFnSUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGd2ljbVZrWENJc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUtTQXJYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1kyOXZjbVJmWTJGeWRHVnphV0Z1S0hsc2FXMGdQU0JqS0hsdGFXNHNJSGx0WVhncEtTQXJYRzRnSUNBZ1lXNXViM1JoZEdVb1hDSjBaWGgwWENJc0lIZ2dQU0F4TENCNUlEMGdlVzFwYmlBcklERXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGd2ljREF4T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3TURFcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd01USTZJRndpTENCamIyNTJVSFpoYkhWbEtIQXhNaWtzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkF5TXpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0RJektTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNETTBPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNelFwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3TWpRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeU5Da3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQXhORG9nWENJc1kyOXVkbEIyWVd4MVpTZ2djREUwS1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0RBME9pQmNJaXhqYjI1MlVIWmhiSFZsS0NCd01EUXBMQ0JjSWx4Y2Jsd2lLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wSUN0Y2JpQWdJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aUkyUTVaRGxrT1Z3aUxDQmNJaU5pWkdKa1ltUmNJaXdnWENJak9UWTVOamsyWENJc0lGd2lJemN6TnpNM00xd2lMQ0JjSWlNMU1qVXlOVEpjSWlrcFhHNGdJRnh1SUNCY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpYVc1emRXeGhkR2x2Ymw5elkyOXlaVjljSWl3Z2JtOTBaU2xjYmlBZ2FHVnBaMmgwSUR3dElETmNiaUFnZDJsa2RHZ2dQQzBnTTF4dUlDQndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dWZWeHVYRzRqSUVSTlUwOWNiblJsYlhBdWRHSWdQQzBnWjJWdVpTNXBibk5UWTI5eVpTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaG5jbTkxY0N3Z1ltOTFibVJoY25sSmJuTlRZMjl5WlY5RVRWTlBLVnh1WTI5c2JtRnRaWE1vZEdWdGNDNTBZaWtnUEMwZ1l5aGNJbWR5YjNWd1hDSXNJRndpYzJOdmNtVmNJaWxjYm5Cc2IzUmZhVzV6VTJOdmNtVW9kR1Z0Y0M1MFlpd2dYQ0p1WldGeVpYTjBRbTkxYm1SaGNubGZSRTFUVDE5UUxWQmNJaWxjYmx4dUl5QmtWRUZIWEc1MFpXMXdMblJpSUR3dElHZGxibVV1YVc1elUyTnZjbVVnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJR0p2ZFc1a1lYSjVTVzV6VTJOdmNtVmZaRlJCUnlsY2JtTnZiRzVoYldWektIUmxiWEF1ZEdJcElEd3RJR01vWENKbmNtOTFjRndpTENCY0luTmpiM0psWENJcFhHNXdiRzkwWDJsdWMxTmpiM0psS0hSbGJYQXVkR0lzSUZ3aWJtVmhjbVZ6ZEVKdmRXNWtZWEo1WDJSVVFVZGZVQzFRWENJcFhHNWNiaU1nWkdsbVpseHVkR1Z0Y0M1MFlpQThMU0JuWlc1bExtbHVjMU5qYjNKbElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHZHliM1Z3TENCa2FXWm1YMkp2ZFc1a1lYSjVTVzV6VTJOdmNtVXBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xuUmlLU0E4TFNCaktGd2laM0p2ZFhCY0lpd2dYQ0p6WTI5eVpWd2lLVnh1Y0d4dmRGOXBibk5UWTI5eVpTaDBaVzF3TG5SaUxDQmNJbTVsWVhKbGMzUkNiM1Z1WkdGeWVWOWthV1ptWDFBdFVGd2lMQ0I1YldsdUlEMGdMVEF1TlN3Z2VXMWhlQ0E5SURFcFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGluay5yZHNcXCkpXG5cbnBwT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSA0KSkkZ2VuZVxucHBPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lXG5wcE92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmVcbnBwT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAxLCBudW1fcHAgPCAyKSkkZ2VuZVxucHBPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmVcblxuXG5nZW5lLmluc1Njb3JlIDwtIGdlbmUuaW5zU2NvcmUuYWxsICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBwcE92ZXI0LCBcXHA0XFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcHBPdmVyMywgXFxwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwcE92ZXIyLCBcXHAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwcE92ZXIxLCBcXHAxXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBwT3ZlcjAsIFxccDBcXCwgTkEpKSkpKSkgICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7XG4gIHAwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwMVxcKSwgNSlcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMVxcLCBcXHAyXFwpLCA1KVxuICBwMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAyXFwsIFxccDNcXCksIDUpXG4gIHAzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDNcXCwgXFxwNFxcKSwgNSlcbiAgcDI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMlxcLCBcXHA0XFwpLCA1KVxuICBwMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAxXFwsIFxccDRcXCksIDUpXG4gIHAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwNFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDAxOiBcXCwgY29udlB2YWx1ZShwMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyMzogXFwsIGNvbnZQdmFsdWUocDIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDM0OiBcXCwgY29udlB2YWx1ZShwMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjQ6IFxcLCBjb252UHZhbHVlKHAyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNDogXFwsY29udlB2YWx1ZSggcDE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDA0OiBcXCxjb252UHZhbHVlKCBwMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI2Q5ZDlkOVxcLCBcXCNiZGJkYmRcXCwgXFwjOTY5Njk2XFwsIFxcIzczNzM3M1xcLCBcXCM1MjUyNTJcXCkpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbl9zY29yZV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIERNU09cbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfRE1TT19QLVBcXClcblxuIyBkVEFHXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X2RUQUdfUC1QXFwpXG5cbiMgZGlmZlxudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kaWZmX1AtUFxcLCB5bWluID0gLTAuNSwgeW1heCA9IDEpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene


gene.insScore <- gene.insScore.all %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% ppOver4, \p4\,
                 ifelse(ensembl %in% ppOver3, \p3\,
                        ifelse(ensembl %in% ppOver2, \p2\,
                               ifelse(ensembl %in% ppOver1, \p1\, 
                                      ifelse(ensembl %in% ppOver0, \p0\, NA))))))  %>% 
  dplyr::filter(!is.na(group))

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$score
  distance2 <- (data %>% dplyr::filter(group ==group2) )$score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

plot_insScore <- function(temp.tb, note, ymin = 0, ymax = 1.5){
  p01 <- round(getPvalWilcox(temp.tb, \p0\, \p1\), 5)
  p12 <- round(getPvalWilcox(temp.tb, \p1\, \p2\), 5)
  p23 <- round(getPvalWilcox(temp.tb, \p2\, \p3\), 5)
  p34 <- round(getPvalWilcox(temp.tb, \p3\, \p4\), 5)
  p24 <- round(getPvalWilcox(temp.tb, \p2\, \p4\), 5)
  p14 <- round(getPvalWilcox(temp.tb, \p1\, \p4\), 5)
  p04 <- round(getPvalWilcox(temp.tb, \p0\, \p4\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p01: \, convPvalue(p01), \\n\,
                                                         \p12: \, convPvalue(p12), \\n\,
                                                         \p23: \, convPvalue(p23), \\n\,
                                                         \p34: \, convPvalue(p34), \\n\,
                                                         \p24: \, convPvalue(p24), \\n\,
                                                         \p14: \,convPvalue( p14), \\n\,
                                                         \p04: \,convPvalue( p04), \\n\), 
             color = \black\, hjust = 0, size = 3) +
    scale_fill_manual(values = c(\#d9d9d9\, \#bdbdbd\, \#969696\, \#737373\, \#525252\))
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO_P-P\)

# dTAG
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_dTAG)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_dTAG_P-P\)

# diff
temp.tb <- gene.insScore %>% dplyr::select(group, diff_boundaryInsScore)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_diff_P-P\, ymin = -0.5, ymax = 1)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRHVnRjRElnUEMwZ2NtVmhaRkpFVXlob1pYSmxLSEpsYzNWc2RFUnBjaXdnWEZ4blpXNWxYMnh2YjNCZmJHbHVheTV5WkhOY1hDa3BYRzVjYm5Cd1QzWmxjalFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjQ0ErUFNBMEtTa2taMlZ1WlZ4dWNIQlBkbVZ5TXlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J3SUQ0OUlETXNJRzUxYlY5d2NDQThJRFFwS1NSblpXNWxYRzV3Y0U5MlpYSXlJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNIQWdQajBnTWl3Z2JuVnRYM0J3SUR3Z015a3BKR2RsYm1WY2JuQndUM1psY2pFZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y0NBK1BTQXhMQ0J1ZFcxZmNIQWdQQ0F5S1Nra1oyVnVaVnh1Y0hCUGRtVnlNQ0E4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQndJRHdnTVNrcEpHZGxibVZjYmx4dVhHNW5aVzVsTG1sdWMxTmpiM0psSUR3dElHZGxibVV1YVc1elUyTnZjbVV1WVd4c0lDVStKU0J5YjNkM2FYTmxLQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lHZHliM1Z3SUQwZ2FXWmxiSE5sS0dWdWMyVnRZbXdnSldsdUpTQndjRTkyWlhJMExDQmNYSEEwWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdjSEJQZG1WeU15d2dYRnh3TTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dWdWMyVnRZbXdnSldsdUpTQndjRTkyWlhJeUxDQmNYSEF5WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR1Z1YzJWdFltd2dKV2x1SlNCd2NFOTJaWEl4TENCY1hIQXhYRndzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1pXNXpaVzFpYkNBbGFXNGxJSEJ3VDNabGNqQXNJRnhjY0RCY1hDd2dUa0VwS1NrcEtTa2dJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lnaGFYTXVibUVvWjNKdmRYQXBLVnh1WEc1blpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaUFnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXhLU0FwSkhOamIzSmxYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNaWtnS1NSelkyOXlaVnh1SUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JuMWNibHh1Y0d4dmRGOXBibk5UWTI5eVpTQThMU0JtZFc1amRHbHZiaWgwWlcxd0xuUmlMQ0J1YjNSbExDQjViV2x1SUQwZ01Dd2dlVzFoZUNBOUlERXVOU2w3WEc0Z0lIQXdNU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGeGNjREJjWEN3Z1hGeHdNVnhjS1N3Z05TbGNiaUFnY0RFeUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWEZ4d01WeGNMQ0JjWEhBeVhGd3BMQ0ExS1Z4dUlDQndNak1nUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNYSEF5WEZ3c0lGeGNjRE5jWENrc0lEVXBYRzRnSUhBek5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ4Y2NETmNYQ3dnWEZ4d05GeGNLU3dnTlNsY2JpQWdjREkwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYRnh3TWx4Y0xDQmNYSEEwWEZ3cExDQTFLVnh1SUNCd01UUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hIQXhYRndzSUZ4Y2NEUmNYQ2tzSURVcFhHNGdJSEF3TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRnhjY0RCY1hDd2dYRnh3TkZ4Y0tTd2dOU2xjYmlBZ1hHNGdJSEFnUEMwZ1oyZHdiRzkwS0hSbGJYQXVkR0lzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCelkyOXlaU2twSUNzZ1oyVnZiVjkyYVc5c2FXNG9ZV1Z6S0dacGJHd2dQU0JuY205MWNDa3NJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ1hHNGdJQ0FnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUN0Y2JpQWdJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ4Y2NtVmtYRndzSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjS1NBclhHNGdJQ0FnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLSGx0YVc0c0lIbHRZWGdwS1NBclhHNGdJQ0FnWVc1dWIzUmhkR1VvWEZ4MFpYaDBYRndzSUhnZ1BTQXhMQ0I1SUQwZ2VXMXBiaUFySURFc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z4Y2NEQXhPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdNREVwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3TVRJNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hBeE1pa3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQXlNem9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jREl6S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0RNME9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod016UXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdNalE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF5TkNrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhBeE5Eb2dYRndzWTI5dWRsQjJZV3gxWlNnZ2NERTBLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjREEwT2lCY1hDeGpiMjUyVUhaaGJIVmxLQ0J3TURRcExDQmNYRnhjYmx4Y0tTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBJQ3RjYmlBZ0lDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjSTJRNVpEbGtPVnhjTENCY1hDTmlaR0prWW1SY1hDd2dYRndqT1RZNU5qazJYRndzSUZ4Y0l6Y3pOek0zTTF4Y0xDQmNYQ00xTWpVeU5USmNYQ2twWEc0Z0lGeHVJQ0JjYmlBZ1ptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNhVzV6ZFd4aGRHbHZibDl6WTI5eVpWOWNYQ3dnYm05MFpTbGNiaUFnYUdWcFoyaDBJRHd0SUROY2JpQWdkMmxrZEdnZ1BDMGdNMXh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0J6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1ZlZ4dVhHNGpJRVJOVTA5Y2JuUmxiWEF1ZEdJZ1BDMGdaMlZ1WlM1cGJuTlRZMjl5WlNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENobmNtOTFjQ3dnWW05MWJtUmhjbmxKYm5OVFkyOXlaVjlFVFZOUEtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0M1MFlpa2dQQzBnWXloY1hHZHliM1Z3WEZ3c0lGeGNjMk52Y21WY1hDbGNibkJzYjNSZmFXNXpVMk52Y21Vb2RHVnRjQzUwWWl3Z1hGeHVaV0Z5WlhOMFFtOTFibVJoY25sZlJFMVRUMTlRTFZCY1hDbGNibHh1SXlCa1ZFRkhYRzUwWlcxd0xuUmlJRHd0SUdkbGJtVXVhVzV6VTJOdmNtVWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHSnZkVzVrWVhKNVNXNXpVMk52Y21WZlpGUkJSeWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXVkR0lwSUR3dElHTW9YRnhuY205MWNGeGNMQ0JjWEhOamIzSmxYRndwWEc1d2JHOTBYMmx1YzFOamIzSmxLSFJsYlhBdWRHSXNJRnhjYm1WaGNtVnpkRUp2ZFc1a1lYSjVYMlJVUVVkZlVDMVFYRndwWEc1Y2JpTWdaR2xtWmx4dWRHVnRjQzUwWWlBOExTQm5aVzVsTG1sdWMxTmpiM0psSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dkeWIzVndMQ0JrYVdabVgySnZkVzVrWVhKNVNXNXpVMk52Y21VcFhHNWpiMnh1WVcxbGN5aDBaVzF3TG5SaUtTQThMU0JqS0Z4Y1ozSnZkWEJjWEN3Z1hGeHpZMjl5WlZ4Y0tWeHVjR3h2ZEY5cGJuTlRZMjl5WlNoMFpXMXdMblJpTENCY1hHNWxZWEpsYzNSQ2IzVnVaR0Z5ZVY5a2FXWm1YMUF0VUZ4Y0xDQjViV2x1SUQwZ0xUQXVOU3dnZVcxaGVDQTlJREVwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGluay5yZHNcXCkpXG5cbnBwT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSA0KSkkZ2VuZVxucHBPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lXG5wcE92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmVcbnBwT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAxLCBudW1fcHAgPCAyKSkkZ2VuZVxucHBPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmVcblxuXG5nZW5lLmluc1Njb3JlIDwtIGdlbmUuaW5zU2NvcmUuYWxsICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBwcE92ZXI0LCBcXHA0XFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcHBPdmVyMywgXFxwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwcE92ZXIyLCBcXHAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwcE92ZXIxLCBcXHAxXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBwT3ZlcjAsIFxccDBcXCwgTkEpKSkpKSkgICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7XG4gIHAwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwMVxcKSwgNSlcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMVxcLCBcXHAyXFwpLCA1KVxuICBwMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAyXFwsIFxccDNcXCksIDUpXG4gIHAzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDNcXCwgXFxwNFxcKSwgNSlcbiAgcDI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMlxcLCBcXHA0XFwpLCA1KVxuICBwMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAxXFwsIFxccDRcXCksIDUpXG4gIHAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwNFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDAxOiBcXCwgY29udlB2YWx1ZShwMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyMzogXFwsIGNvbnZQdmFsdWUocDIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDM0OiBcXCwgY29udlB2YWx1ZShwMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjQ6IFxcLCBjb252UHZhbHVlKHAyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNDogXFwsY29udlB2YWx1ZSggcDE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDA0OiBcXCxjb252UHZhbHVlKCBwMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI2Q5ZDlkOVxcLCBcXCNiZGJkYmRcXCwgXFwjOTY5Njk2XFwsIFxcIzczNzM3M1xcLCBcXCM1MjUyNTJcXCkpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbl9zY29yZV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIERNU09cbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfRE1TT19QLVBcXClcblxuIyBkVEFHXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X2RUQUdfUC1QXFwpXG5cbiMgZGlmZlxudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kaWZmX1AtUFxcLCB5bWluID0gLTAuNSwgeW1heCA9IDEpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGluay5yZHNcXCkpXG5cbnBwT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSA0KSkkZ2VuZVxucHBPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lXG5wcE92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmVcbnBwT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAxLCBudW1fcHAgPCAyKSkkZ2VuZVxucHBPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmVcblxuXG5nZW5lLmluc1Njb3JlIDwtIGdlbmUuaW5zU2NvcmUuYWxsICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBwcE92ZXI0LCBcXHA0XFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcHBPdmVyMywgXFxwM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwcE92ZXIyLCBcXHAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwcE92ZXIxLCBcXHAxXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBwT3ZlcjAsIFxccDBcXCwgTkEpKSkpKSkgICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7XG4gIHAwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwMVxcKSwgNSlcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMVxcLCBcXHAyXFwpLCA1KVxuICBwMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAyXFwsIFxccDNcXCksIDUpXG4gIHAzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDNcXCwgXFxwNFxcKSwgNSlcbiAgcDI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxwMlxcLCBcXHA0XFwpLCA1KVxuICBwMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXHAxXFwsIFxccDRcXCksIDUpXG4gIHAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxccDBcXCwgXFxwNFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDAxOiBcXCwgY29udlB2YWx1ZShwMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyMzogXFwsIGNvbnZQdmFsdWUocDIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDM0OiBcXCwgY29udlB2YWx1ZShwMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjQ6IFxcLCBjb252UHZhbHVlKHAyNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNDogXFwsY29udlB2YWx1ZSggcDE0KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDA0OiBcXCxjb252UHZhbHVlKCBwMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI2Q5ZDlkOVxcLCBcXCNiZGJkYmRcXCwgXFwjOTY5Njk2XFwsIFxcIzczNzM3M1xcLCBcXCM1MjUyNTJcXCkpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbl9zY29yZV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIERNU09cbnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKVxuY29sbmFtZXModGVtcC50YikgPC0gYyhcXGdyb3VwXFwsIFxcc2NvcmVcXClcbnBsb3RfaW5zU2NvcmUodGVtcC50YiwgXFxuZWFyZXN0Qm91bmRhcnlfRE1TT19QLVBcXClcblxuIyBkVEFHXG50ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRylcbmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoXFxncm91cFxcLCBcXHNjb3JlXFwpXG5wbG90X2luc1Njb3JlKHRlbXAudGIsIFxcbmVhcmVzdEJvdW5kYXJ5X2RUQUdfUC1QXFwpXG5cbiMgZGlmZlxudGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpXG5jb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKFxcZ3JvdXBcXCwgXFxzY29yZVxcKVxucGxvdF9pbnNTY29yZSh0ZW1wLnRiLCBcXG5lYXJlc3RCb3VuZGFyeV9kaWZmX1AtUFxcLCB5bWluID0gLTAuNSwgeW1heCA9IDEpXG5gYGBcbmBgYCJ9 -->

```r
```r
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene


gene.insScore <- gene.insScore.all %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% ppOver4, \p4\,
                 ifelse(ensembl %in% ppOver3, \p3\,
                        ifelse(ensembl %in% ppOver2, \p2\,
                               ifelse(ensembl %in% ppOver1, \p1\, 
                                      ifelse(ensembl %in% ppOver0, \p0\, NA))))))  %>% 
  dplyr::filter(!is.na(group))

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$score
  distance2 <- (data %>% dplyr::filter(group ==group2) )$score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

plot_insScore <- function(temp.tb, note, ymin = 0, ymax = 1.5){
  p01 <- round(getPvalWilcox(temp.tb, \p0\, \p1\), 5)
  p12 <- round(getPvalWilcox(temp.tb, \p1\, \p2\), 5)
  p23 <- round(getPvalWilcox(temp.tb, \p2\, \p3\), 5)
  p34 <- round(getPvalWilcox(temp.tb, \p3\, \p4\), 5)
  p24 <- round(getPvalWilcox(temp.tb, \p2\, \p4\), 5)
  p14 <- round(getPvalWilcox(temp.tb, \p1\, \p4\), 5)
  p04 <- round(getPvalWilcox(temp.tb, \p0\, \p4\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p01: \, convPvalue(p01), \\n\,
                                                         \p12: \, convPvalue(p12), \\n\,
                                                         \p23: \, convPvalue(p23), \\n\,
                                                         \p34: \, convPvalue(p34), \\n\,
                                                         \p24: \, convPvalue(p24), \\n\,
                                                         \p14: \,convPvalue( p14), \\n\,
                                                         \p04: \,convPvalue( p04), \\n\), 
             color = \black\, hjust = 0, size = 3) +
    scale_fill_manual(values = c(\#d9d9d9\, \#bdbdbd\, \#969696\, \#737373\, \#525252\))
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# DMSO
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_DMSO)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_DMSO_P-P\)

# dTAG
temp.tb <- gene.insScore %>% dplyr::select(group, boundaryInsScore_dTAG)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_dTAG_P-P\)

# diff
temp.tb <- gene.insScore %>% dplyr::select(group, diff_boundaryInsScore)
colnames(temp.tb) <- c(\group\, \score\)
plot_insScore(temp.tb, \nearestBoundary_diff_P-P\, ymin = -0.5, ymax = 1)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### Plotting for P-E

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjbVZtUkdseUlEd3RJR2hsY21Vb1hDSXVMaTh1TGx3aUxDQmNJbkpsWm1WeVpXNWpaVndpS1Z4dVhHNGpJRWx0Y0c5eWRHbHVaeUJVUVVRZ1ltOTFibVJoY25sY2JuUmhaRjlpYjNWdVpHRnllU0E4TFNCbWNtVmhaQ2hvWlhKbEtGd2lMaTR2TGk0dmNtVnpkV3gwTDFSQlJGd2lMQ0JjSWxSQlJGOHlOV3RpWHpFeU5XdGlYMjkwYzNWZlltOTFibVJoY21sbGMxOUhNVVJOVTA4dVltVmtYQ0lwS1Z4dVkyOXNibUZ0WlhNb2RHRmtYMkp2ZFc1a1lYSjVLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNiblJoWkY5aWIzVnVaR0Z5ZVNBOExTQjBZV1JmWW05MWJtUmhjbmtnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvZEdGa1gybGtJRDBnY0dGemRHVW9ZMmh5TENCemRHRnlkQ3dnWlc1a0xDQnpaWEFnUFNCY0lsOWNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTmxiblJsY2lBOUlDaHpkR0Z5ZENBcklHVnVaQ2t2TWlsY2JseHVJeUJKYlhCdmNuUnBibWNnVkVGRVhHNTBZV1FnUEMwZ1puSmxZV1FvYUdWeVpTaGNJaTR1THk0dUwzSmxjM1ZzZEM5VVFVUmNJaXdnWENKVVFVUmZNalZyWWw4eE1qVnJZbDl2ZEhOMVgwY3hSRTFUVHk1aVpXUndaVndpS1NsY2JtTnZiRzVoYldWektIUmhaQ2tnUEMwZ1l5aGNJbU5vY2pGY0lpd2dYQ0p6ZEdGeWRERmNJaXdnWENKbGJtUXhYQ0lzSUZ3aVkyaHlNbHdpTENCY0luTjBZWEowTWx3aUxDQmNJbVZ1WkRKY0lpbGNiblJoWkNBOExTQjBZV1FnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvZEdGa1NVUWdQU0J3WVhOMFpTaGphSEl4TENCemRHRnlkREVzSUdWdVpERXNJSE5sY0NBOUlGd2lYMXdpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR0ZrVTJsNlpTQTlJR1Z1WkRFZ0xTQnpkR0Z5ZERFcFhHNWNiaU1nU1cxd2IzSjBhVzVuSUdkbGJtVmNibWRsYm1VdVZGTlRMblJpSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbTF0TVRCZlIxSkRiVE00TG5BMlgyZGxibVZmYzI5eWRHVmtMbUpsWkZ3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvVkZOVElEMGdhV1psYkhObEtGWTBJRDA5SUZ3aUsxd2lMQ0JXTWl3Z1ZqTXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENoV05pd2dWalVzSUZZeExDQlVVMU1wWEc1amIyeHVZVzFsY3loblpXNWxMbFJUVXk1MFlpa2dQQzBnWXloY0ltVnVjMlZ0WW14Y0lpd2dYQ0puWlc1bFhDSXNJRndpWTJoeVhDSXNJRndpVkZOVFhDSXBYRzVjYmlNZ1JuVnVZM1JwYjI1elhHNW1hVzVrUkdsemRHRnVZMlZVYjFSQlJDQThMU0JtZFc1amRHbHZiaWhqYUhKdmJTd2dWRk5UTENCMFlXUmZZbTkxYm1SaGNua3BlMXh1SUNCMFpXMXdJRHd0SUhSaFpGOWliM1Z1WkdGeWVTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaGphSElnUFQwZ1kyaHliMjBwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0JoWW5Nb1kyVnVkR1Z5SUMwZ1ZGTlRLU2tnSlQ0bElITnNhV05sWDIxcGJpaGthWE4wWVc1alpTbGNiaUFnYVdZb2JuSnZkeWgwWlcxd0tTQTlQU0F4S1h0Y2JpQWdJQ0J5WlhSMWNtNG9kR1Z0Y0NSa2FYTjBZVzVqWlNsY2JpQWdmV1ZzYzJWN1hHNGdJQ0FnY21WMGRYSnVLRTVCS1Z4dUlDQjlYRzU5WEc1Y2JtWnBibVJKZEhOVVFVUWdQQzBnWm5WdVkzUnBiMjRvWTJoeWIyMHNJRlJUVXl3Z2RHRmtLWHRjYmlBZ2RHVnRjQ0E4TFNCMFlXUWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9ZMmh5TVNBOVBTQmphSEp2YlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNSaGNuUXhJRHdnVkZOVExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJtUXhJRDRnVkZOVEtWeHVJQ0JwWmlodWNtOTNLSFJsYlhBcElEMDlJREVwZTF4dUlDQWdJSEpsZEhWeWJpaDBaVzF3SkhSaFpFbEVLVnh1SUNCOVpXeHpaWHRjYmlBZ0lDQnlaWFIxY200b1RrRXBYRzRnSUgxY2JuMWNibHh1Wm1sdVpGUkJSRk5wZW1VZ1BDMW1kVzVqZEdsdmJpaGphSEp2YlN3Z1ZGTlRMQ0IwWVdRcGUxeHVJQ0IwWlcxd0lEd3RJSFJoWkNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loamFISXhJRDA5SUdOb2NtOXRMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpkR0Z5ZERFZ1BDQlVVMU1zWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1Z1WkRFZ1BpQlVVMU1wWEc0Z0lHbG1LRzV5YjNjb2RHVnRjQ2tnUFQwZ01TbDdYRzRnSUNBZ2NtVjBkWEp1S0hSbGJYQWtkR0ZrVTJsNlpTbGNiaUFnZldWc2MyVjdYRzRnSUNBZ2NtVjBkWEp1S0U1QktWeHVJQ0I5WEc1OVhHNWNibWRsYm1VdVZGTlRMblJpSUR3dElHZGxibVV1VkZOVExuUmlJQ1UrSlNCeWIzZDNhWE5sS0NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0JtYVc1a1JHbHpkR0Z1WTJWVWIxUkJSQ2hqYUhJc0lGUlRVeXdnZEdGa1gySnZkVzVrWVhKNUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVRVVFnUFNCbWFXNWtTWFJ6VkVGRUtHTm9jaXdnVkZOVExDQjBZV1FwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSQlJITnBlbVVnUFNCbWFXNWtWRUZFVTJsNlpTaGphSElzSUZSVFV5d2dkR0ZrS1NsY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5yZWZEaXIgPC0gaGVyZShcXC4uLy4uXFwsIFxccmVmZXJlbmNlXFwpXG5cbiMgSW1wb3J0aW5nIFRBRCBib3VuZGFyeVxudGFkX2JvdW5kYXJ5IDwtIGZyZWFkKGhlcmUoXFwuLi8uLi9yZXN1bHQvVEFEXFwsIFxcVEFEXzI1a2JfMTI1a2Jfb3RzdV9ib3VuZGFyaWVzX0cxRE1TTy5iZWRcXCkpXG5jb2xuYW1lcyh0YWRfYm91bmRhcnkpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxudGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6Om11dGF0ZSh0YWRfaWQgPSBwYXN0ZShjaHIsIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKVxuXG4jIEltcG9ydGluZyBUQURcbnRhZCA8LSBmcmVhZChoZXJlKFxcLi4vLi4vcmVzdWx0L1RBRFxcLCBcXFRBRF8yNWtiXzEyNWtiX290c3VfRzFETVNPLmJlZHBlXFwpKVxuY29sbmFtZXModGFkKSA8LSBjKFxcY2hyMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHIyXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcKVxudGFkIDwtIHRhZCAlPiUgZHBseXI6Om11dGF0ZSh0YWRJRCA9IHBhc3RlKGNocjEsIHN0YXJ0MSwgZW5kMSwgc2VwID0gXFxfXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWRTaXplID0gZW5kMSAtIHN0YXJ0MSlcblxuIyBJbXBvcnRpbmcgZ2VuZVxuZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMykpICU+JVxuICBkcGx5cjo6c2VsZWN0KFY2LCBWNSwgVjEsIFRTUylcbmNvbG5hbWVzKGdlbmUuVFNTLnRiKSA8LSBjKFxcZW5zZW1ibFxcLCBcXGdlbmVcXCwgXFxjaHJcXCwgXFxUU1NcXClcblxuIyBGdW5jdGlvbnNcbmZpbmREaXN0YW5jZVRvVEFEIDwtIGZ1bmN0aW9uKGNocm9tLCBUU1MsIHRhZF9ib3VuZGFyeSl7XG4gIHRlbXAgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IGFicyhjZW50ZXIgLSBUU1MpKSAlPiUgc2xpY2VfbWluKGRpc3RhbmNlKVxuICBpZihucm93KHRlbXApID09IDEpe1xuICAgIHJldHVybih0ZW1wJGRpc3RhbmNlKVxuICB9ZWxzZXtcbiAgICByZXR1cm4oTkEpXG4gIH1cbn1cblxuZmluZEl0c1RBRCA8LSBmdW5jdGlvbihjaHJvbSwgVFNTLCB0YWQpe1xuICB0ZW1wIDwtIHRhZCAlPiUgZHBseXI6OmZpbHRlcihjaHIxID09IGNocm9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDEgPCBUU1MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDEgPiBUU1MpXG4gIGlmKG5yb3codGVtcCkgPT0gMSl7XG4gICAgcmV0dXJuKHRlbXAkdGFkSUQpXG4gIH1lbHNle1xuICAgIHJldHVybihOQSlcbiAgfVxufVxuXG5maW5kVEFEU2l6ZSA8LWZ1bmN0aW9uKGNocm9tLCBUU1MsIHRhZCl7XG4gIHRlbXAgPC0gdGFkICU+JSBkcGx5cjo6ZmlsdGVyKGNocjEgPT0gY2hyb20sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0MSA8IFRTUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kMSA+IFRTUylcbiAgaWYobnJvdyh0ZW1wKSA9PSAxKXtcbiAgICByZXR1cm4odGVtcCR0YWRTaXplKVxuICB9ZWxzZXtcbiAgICByZXR1cm4oTkEpXG4gIH1cbn1cblxuZ2VuZS5UU1MudGIgPC0gZ2VuZS5UU1MudGIgJT4lIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IGZpbmREaXN0YW5jZVRvVEFEKGNociwgVFNTLCB0YWRfYm91bmRhcnkpLFxuICAgICAgICAgICAgICAgIFRBRCA9IGZpbmRJdHNUQUQoY2hyLCBUU1MsIHRhZCksXG4gICAgICAgICAgICAgICAgVEFEc2l6ZSA9IGZpbmRUQURTaXplKGNociwgVFNTLCB0YWQpKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
refDir <- here(\../..\, \reference\)

# Importing TAD boundary
tad_boundary <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_boundaries_G1DMSO.bed\))
colnames(tad_boundary) <- c(\chr\, \start\, \end\)
tad_boundary <- tad_boundary %>% dplyr::mutate(tad_id = paste(chr, start, end, sep = \_\),
                                               center = (start + end)/2)

# Importing TAD
tad <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_G1DMSO.bedpe\))
colnames(tad) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\)
tad <- tad %>% dplyr::mutate(tadID = paste(chr1, start1, end1, sep = \_\),
                             tadSize = end1 - start1)

# Importing gene
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, V5, V1, TSS)
colnames(gene.TSS.tb) <- c(\ensembl\, \gene\, \chr\, \TSS\)

# Functions
findDistanceToTAD <- function(chrom, TSS, tad_boundary){
  temp <- tad_boundary %>% dplyr::filter(chr == chrom) %>%
    dplyr::mutate(distance = abs(center - TSS)) %>% slice_min(distance)
  if(nrow(temp) == 1){
    return(temp$distance)
  }else{
    return(NA)
  }
}

findItsTAD <- function(chrom, TSS, tad){
  temp <- tad %>% dplyr::filter(chr1 == chrom,
                                start1 < TSS,
                                end1 > TSS)
  if(nrow(temp) == 1){
    return(temp$tadID)
  }else{
    return(NA)
  }
}

findTADSize <-function(chrom, TSS, tad){
  temp <- tad %>% dplyr::filter(chr1 == chrom,
                                start1 < TSS,
                                end1 > TSS)
  if(nrow(temp) == 1){
    return(temp$tadSize)
  }else{
    return(NA)
  }
}

gene.TSS.tb <- gene.TSS.tb %>% rowwise() %>%
  dplyr::mutate(distance = findDistanceToTAD(chr, TSS, tad_boundary),
                TAD = findItsTAD(chr, TSS, tad),
                TADsize = findTADSize(chr, TSS, tad))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNtVm1SR2x5SUR3dElHaGxjbVVvWEZ3dUxpOHVMbHhjTENCY1hISmxabVZ5Wlc1alpWeGNLVnh1WEc0aklFbHRjRzl5ZEdsdVp5QlVRVVFnWW05MWJtUmhjbmxjYm5SaFpGOWliM1Z1WkdGeWVTQThMU0JtY21WaFpDaG9aWEpsS0Z4Y0xpNHZMaTR2Y21WemRXeDBMMVJCUkZ4Y0xDQmNYRlJCUkY4eU5XdGlYekV5Tld0aVgyOTBjM1ZmWW05MWJtUmhjbWxsYzE5SE1VUk5VMDh1WW1Wa1hGd3BLVnh1WTI5c2JtRnRaWE1vZEdGa1gySnZkVzVrWVhKNUtTQThMU0JqS0Z4Y1kyaHlYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWENsY2JuUmhaRjlpYjNWdVpHRnllU0E4TFNCMFlXUmZZbTkxYm1SaGNua2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0ZrWDJsa0lEMGdjR0Z6ZEdVb1kyaHlMQ0J6ZEdGeWRDd2daVzVrTENCelpYQWdQU0JjWEY5Y1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdObGJuUmxjaUE5SUNoemRHRnlkQ0FySUdWdVpDa3ZNaWxjYmx4dUl5QkpiWEJ2Y25ScGJtY2dWRUZFWEc1MFlXUWdQQzBnWm5KbFlXUW9hR1Z5WlNoY1hDNHVMeTR1TDNKbGMzVnNkQzlVUVVSY1hDd2dYRnhVUVVSZk1qVnJZbDh4TWpWcllsOXZkSE4xWDBjeFJFMVRUeTVpWldSd1pWeGNLU2xjYm1OdmJHNWhiV1Z6S0hSaFpDa2dQQzBnWXloY1hHTm9jakZjWEN3Z1hGeHpkR0Z5ZERGY1hDd2dYRnhsYm1ReFhGd3NJRnhjWTJoeU1seGNMQ0JjWEhOMFlYSjBNbHhjTENCY1hHVnVaREpjWENsY2JuUmhaQ0E4TFNCMFlXUWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0ZrU1VRZ1BTQndZWE4wWlNoamFISXhMQ0J6ZEdGeWRERXNJR1Z1WkRFc0lITmxjQ0E5SUZ4Y1gxeGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHRmtVMmw2WlNBOUlHVnVaREVnTFNCemRHRnlkREVwWEc1Y2JpTWdTVzF3YjNKMGFXNW5JR2RsYm1WY2JtZGxibVV1VkZOVExuUmlJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHMXRNVEJmUjFKRGJUTTRMbkEyWDJkbGJtVmZjMjl5ZEdWa0xtSmxaRnhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9WRk5USUQwZ2FXWmxiSE5sS0ZZMElEMDlJRnhjSzF4Y0xDQldNaXdnVmpNcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hXTml3Z1ZqVXNJRll4TENCVVUxTXBYRzVqYjJ4dVlXMWxjeWhuWlc1bExsUlRVeTUwWWlrZ1BDMGdZeWhjWEdWdWMyVnRZbXhjWEN3Z1hGeG5aVzVsWEZ3c0lGeGNZMmh5WEZ3c0lGeGNWRk5UWEZ3cFhHNWNiaU1nUm5WdVkzUnBiMjV6WEc1bWFXNWtSR2x6ZEdGdVkyVlViMVJCUkNBOExTQm1kVzVqZEdsdmJpaGphSEp2YlN3Z1ZGTlRMQ0IwWVdSZlltOTFibVJoY25rcGUxeHVJQ0IwWlcxd0lEd3RJSFJoWkY5aWIzVnVaR0Z5ZVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loamFISWdQVDBnWTJoeWIyMHBJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb1pHbHpkR0Z1WTJVZ1BTQmhZbk1vWTJWdWRHVnlJQzBnVkZOVEtTa2dKVDRsSUhOc2FXTmxYMjFwYmloa2FYTjBZVzVqWlNsY2JpQWdhV1lvYm5KdmR5aDBaVzF3S1NBOVBTQXhLWHRjYmlBZ0lDQnlaWFIxY200b2RHVnRjQ1JrYVhOMFlXNWpaU2xjYmlBZ2ZXVnNjMlY3WEc0Z0lDQWdjbVYwZFhKdUtFNUJLVnh1SUNCOVhHNTlYRzVjYm1acGJtUkpkSE5VUVVRZ1BDMGdablZ1WTNScGIyNG9ZMmh5YjIwc0lGUlRVeXdnZEdGa0tYdGNiaUFnZEdWdGNDQThMU0IwWVdRZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1kyaHlNU0E5UFNCamFISnZiU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM1JoY25ReElEd2dWRk5UTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYm1ReElENGdWRk5US1Z4dUlDQnBaaWh1Y205M0tIUmxiWEFwSUQwOUlERXBlMXh1SUNBZ0lISmxkSFZ5YmloMFpXMXdKSFJoWkVsRUtWeHVJQ0I5Wld4elpYdGNiaUFnSUNCeVpYUjFjbTRvVGtFcFhHNGdJSDFjYm4xY2JseHVabWx1WkZSQlJGTnBlbVVnUEMxbWRXNWpkR2x2YmloamFISnZiU3dnVkZOVExDQjBZV1FwZTF4dUlDQjBaVzF3SUR3dElIUmhaQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhqYUhJeElEMDlJR05vY205dExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRHRnlkREVnUENCVVUxTXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnVaREVnUGlCVVUxTXBYRzRnSUdsbUtHNXliM2NvZEdWdGNDa2dQVDBnTVNsN1hHNGdJQ0FnY21WMGRYSnVLSFJsYlhBa2RHRmtVMmw2WlNsY2JpQWdmV1ZzYzJWN1hHNGdJQ0FnY21WMGRYSnVLRTVCS1Z4dUlDQjlYRzU5WEc1Y2JtZGxibVV1VkZOVExuUmlJRHd0SUdkbGJtVXVWRk5UTG5SaUlDVStKU0J5YjNkM2FYTmxLQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pHbHpkR0Z1WTJVZ1BTQm1hVzVrUkdsemRHRnVZMlZVYjFSQlJDaGphSElzSUZSVFV5d2dkR0ZrWDJKdmRXNWtZWEo1S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCVVFVUWdQU0JtYVc1a1NYUnpWRUZFS0dOb2Npd2dWRk5UTENCMFlXUXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRlJCUkhOcGVtVWdQU0JtYVc1a1ZFRkVVMmw2WlNoamFISXNJRlJUVXl3Z2RHRmtLU2xjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxucmVmRGlyIDwtIGhlcmUoXFwuLi8uLlxcLCBcXHJlZmVyZW5jZVxcKVxuXG4jIEltcG9ydGluZyBUQUQgYm91bmRhcnlcbnRhZF9ib3VuZGFyeSA8LSBmcmVhZChoZXJlKFxcLi4vLi4vcmVzdWx0L1RBRFxcLCBcXFRBRF8yNWtiXzEyNWtiX290c3VfYm91bmRhcmllc19HMURNU08uYmVkXFwpKVxuY29sbmFtZXModGFkX2JvdW5kYXJ5KSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnRhZF9ib3VuZGFyeSA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjptdXRhdGUodGFkX2lkID0gcGFzdGUoY2hyLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IChzdGFydCArIGVuZCkvMilcblxuIyBJbXBvcnRpbmcgVEFEXG50YWQgPC0gZnJlYWQoaGVyZShcXC4uLy4uL3Jlc3VsdC9UQURcXCwgXFxUQURfMjVrYl8xMjVrYl9vdHN1X0cxRE1TTy5iZWRwZVxcKSlcbmNvbG5hbWVzKHRhZCkgPC0gYyhcXGNocjFcXCwgXFxzdGFydDFcXCwgXFxlbmQxXFwsIFxcY2hyMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXClcbnRhZCA8LSB0YWQgJT4lIGRwbHlyOjptdXRhdGUodGFkSUQgPSBwYXN0ZShjaHIxLCBzdGFydDEsIGVuZDEsIHNlcCA9IFxcX1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFkU2l6ZSA9IGVuZDEgLSBzdGFydDEpXG5cbiMgSW1wb3J0aW5nIGdlbmVcbmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWNiwgVjUsIFYxLCBUU1MpXG5jb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYyhcXGVuc2VtYmxcXCwgXFxnZW5lXFwsIFxcY2hyXFwsIFxcVFNTXFwpXG5cbiMgRnVuY3Rpb25zXG5maW5kRGlzdGFuY2VUb1RBRCA8LSBmdW5jdGlvbihjaHJvbSwgVFNTLCB0YWRfYm91bmRhcnkpe1xuICB0ZW1wIDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6OmZpbHRlcihjaHIgPT0gY2hyb20pICU+JVxuICAgIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBhYnMoY2VudGVyIC0gVFNTKSkgJT4lIHNsaWNlX21pbihkaXN0YW5jZSlcbiAgaWYobnJvdyh0ZW1wKSA9PSAxKXtcbiAgICByZXR1cm4odGVtcCRkaXN0YW5jZSlcbiAgfWVsc2V7XG4gICAgcmV0dXJuKE5BKVxuICB9XG59XG5cbmZpbmRJdHNUQUQgPC0gZnVuY3Rpb24oY2hyb20sIFRTUywgdGFkKXtcbiAgdGVtcCA8LSB0YWQgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyMSA9PSBjaHJvbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQxIDwgVFNTLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQxID4gVFNTKVxuICBpZihucm93KHRlbXApID09IDEpe1xuICAgIHJldHVybih0ZW1wJHRhZElEKVxuICB9ZWxzZXtcbiAgICByZXR1cm4oTkEpXG4gIH1cbn1cblxuZmluZFRBRFNpemUgPC1mdW5jdGlvbihjaHJvbSwgVFNTLCB0YWQpe1xuICB0ZW1wIDwtIHRhZCAlPiUgZHBseXI6OmZpbHRlcihjaHIxID09IGNocm9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDEgPCBUU1MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDEgPiBUU1MpXG4gIGlmKG5yb3codGVtcCkgPT0gMSl7XG4gICAgcmV0dXJuKHRlbXAkdGFkU2l6ZSlcbiAgfWVsc2V7XG4gICAgcmV0dXJuKE5BKVxuICB9XG59XG5cbmdlbmUuVFNTLnRiIDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBmaW5kRGlzdGFuY2VUb1RBRChjaHIsIFRTUywgdGFkX2JvdW5kYXJ5KSxcbiAgICAgICAgICAgICAgICBUQUQgPSBmaW5kSXRzVEFEKGNociwgVFNTLCB0YWQpLFxuICAgICAgICAgICAgICAgIFRBRHNpemUgPSBmaW5kVEFEU2l6ZShjaHIsIFRTUywgdGFkKSlcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucmVmRGlyIDwtIGhlcmUoXFwuLi8uLlxcLCBcXHJlZmVyZW5jZVxcKVxuXG4jIEltcG9ydGluZyBUQUQgYm91bmRhcnlcbnRhZF9ib3VuZGFyeSA8LSBmcmVhZChoZXJlKFxcLi4vLi4vcmVzdWx0L1RBRFxcLCBcXFRBRF8yNWtiXzEyNWtiX290c3VfYm91bmRhcmllc19HMURNU08uYmVkXFwpKVxuY29sbmFtZXModGFkX2JvdW5kYXJ5KSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnRhZF9ib3VuZGFyeSA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjptdXRhdGUodGFkX2lkID0gcGFzdGUoY2hyLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IChzdGFydCArIGVuZCkvMilcblxuIyBJbXBvcnRpbmcgVEFEXG50YWQgPC0gZnJlYWQoaGVyZShcXC4uLy4uL3Jlc3VsdC9UQURcXCwgXFxUQURfMjVrYl8xMjVrYl9vdHN1X0cxRE1TTy5iZWRwZVxcKSlcbmNvbG5hbWVzKHRhZCkgPC0gYyhcXGNocjFcXCwgXFxzdGFydDFcXCwgXFxlbmQxXFwsIFxcY2hyMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXClcbnRhZCA8LSB0YWQgJT4lIGRwbHlyOjptdXRhdGUodGFkSUQgPSBwYXN0ZShjaHIxLCBzdGFydDEsIGVuZDEsIHNlcCA9IFxcX1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFkU2l6ZSA9IGVuZDEgLSBzdGFydDEpXG5cbiMgSW1wb3J0aW5nIGdlbmVcbmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWNiwgVjUsIFYxLCBUU1MpXG5jb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYyhcXGVuc2VtYmxcXCwgXFxnZW5lXFwsIFxcY2hyXFwsIFxcVFNTXFwpXG5cbiMgRnVuY3Rpb25zXG5maW5kRGlzdGFuY2VUb1RBRCA8LSBmdW5jdGlvbihjaHJvbSwgVFNTLCB0YWRfYm91bmRhcnkpe1xuICB0ZW1wIDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6OmZpbHRlcihjaHIgPT0gY2hyb20pICU+JVxuICAgIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBhYnMoY2VudGVyIC0gVFNTKSkgJT4lIHNsaWNlX21pbihkaXN0YW5jZSlcbiAgaWYobnJvdyh0ZW1wKSA9PSAxKXtcbiAgICByZXR1cm4odGVtcCRkaXN0YW5jZSlcbiAgfWVsc2V7XG4gICAgcmV0dXJuKE5BKVxuICB9XG59XG5cbmZpbmRJdHNUQUQgPC0gZnVuY3Rpb24oY2hyb20sIFRTUywgdGFkKXtcbiAgdGVtcCA8LSB0YWQgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyMSA9PSBjaHJvbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQxIDwgVFNTLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQxID4gVFNTKVxuICBpZihucm93KHRlbXApID09IDEpe1xuICAgIHJldHVybih0ZW1wJHRhZElEKVxuICB9ZWxzZXtcbiAgICByZXR1cm4oTkEpXG4gIH1cbn1cblxuZmluZFRBRFNpemUgPC1mdW5jdGlvbihjaHJvbSwgVFNTLCB0YWQpe1xuICB0ZW1wIDwtIHRhZCAlPiUgZHBseXI6OmZpbHRlcihjaHIxID09IGNocm9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDEgPCBUU1MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDEgPiBUU1MpXG4gIGlmKG5yb3codGVtcCkgPT0gMSl7XG4gICAgcmV0dXJuKHRlbXAkdGFkU2l6ZSlcbiAgfWVsc2V7XG4gICAgcmV0dXJuKE5BKVxuICB9XG59XG5cbmdlbmUuVFNTLnRiIDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBmaW5kRGlzdGFuY2VUb1RBRChjaHIsIFRTUywgdGFkX2JvdW5kYXJ5KSxcbiAgICAgICAgICAgICAgICBUQUQgPSBmaW5kSXRzVEFEKGNociwgVFNTLCB0YWQpLFxuICAgICAgICAgICAgICAgIFRBRHNpemUgPSBmaW5kVEFEU2l6ZShjaHIsIFRTUywgdGFkKSlcbmBgYFxuYGBgIn0= -->

```r
```r
refDir <- here(\../..\, \reference\)

# Importing TAD boundary
tad_boundary <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_boundaries_G1DMSO.bed\))
colnames(tad_boundary) <- c(\chr\, \start\, \end\)
tad_boundary <- tad_boundary %>% dplyr::mutate(tad_id = paste(chr, start, end, sep = \_\),
                                               center = (start + end)/2)

# Importing TAD
tad <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_G1DMSO.bedpe\))
colnames(tad) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\)
tad <- tad %>% dplyr::mutate(tadID = paste(chr1, start1, end1, sep = \_\),
                             tadSize = end1 - start1)

# Importing gene
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, V5, V1, TSS)
colnames(gene.TSS.tb) <- c(\ensembl\, \gene\, \chr\, \TSS\)

# Functions
findDistanceToTAD <- function(chrom, TSS, tad_boundary){
  temp <- tad_boundary %>% dplyr::filter(chr == chrom) %>%
    dplyr::mutate(distance = abs(center - TSS)) %>% slice_min(distance)
  if(nrow(temp) == 1){
    return(temp$distance)
  }else{
    return(NA)
  }
}

findItsTAD <- function(chrom, TSS, tad){
  temp <- tad %>% dplyr::filter(chr1 == chrom,
                                start1 < TSS,
                                end1 > TSS)
  if(nrow(temp) == 1){
    return(temp$tadID)
  }else{
    return(NA)
  }
}

findTADSize <-function(chrom, TSS, tad){
  temp <- tad %>% dplyr::filter(chr1 == chrom,
                                start1 < TSS,
                                end1 > TSS)
  if(nrow(temp) == 1){
    return(temp$tadSize)
  }else{
    return(NA)
  }
}

gene.TSS.tb <- gene.TSS.tb %>% rowwise() %>%
  dplyr::mutate(distance = findDistanceToTAD(chr, TSS, tad_boundary),
                TAD = findItsTAD(chr, TSS, tad),
                TADsize = findTADSize(chr, TSS, tad))
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### Plotting for P-P

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhDSXBLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNaTUwYzNaY0lpa3BKR2RsYm1WY2JseHVYRzVuWlc1bExsUlRVeTUwWWk1d2JHOTBJRHd0SUdkbGJtVXVWRk5UTG5SaUlDVStKU0J5YjNkM2FYTmxLQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lHZHliM1Z3SUQwZ2FXWmxiSE5sS0dWdWMyVnRZbXdnSldsdUpTQm5jbTkxY0RFc0lGd2laM0p2ZFhBeFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnWjNKdmRYQXlMQ0JjSW1keWIzVndNbHdpTENCT1FTa3BLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcG1hV3gwWlhJb0lXbHpMbTVoS0dkeWIzVndLU2xjYmx4dVhHNGpJeUJRYkc5MElHUnBjM1JoYm1ObFhHNW5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlHZHliM1Z3TVNrZ0tTUmthWE4wWVc1alpWeHVJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXlLU0FwSkdScGMzUmhibU5sWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WEc1Y2JuQnNiM1JmVkVGRVpHbHpkR0Z1WTJVZ1BDMGdablZ1WTNScGIyNG9kR1Z0Y0M1MFlpd2dibTkwWlN3Z2VXMXBiaUE5SURBc0lIbHRZWGdnUFNBeU1EQXdNREF3S1h0Y2JpQWdjREV5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYQ0puY205MWNERmNJaXdnWENKbmNtOTFjREpjSWlrc0lEVXBYRzRnSUZ4dUlDQndJRHd0SUdkbmNHeHZkQ2gwWlcxd0xuUmlMQ0JoWlhNb2VDQTlJRndpTGx3aUxDQm1hV3hzSUQwZ1ozSnZkWEFzSUhrZ1BTQmthWE4wWVc1alpTa3BJQ3RjYmlBZ0lDQWpJRk5sZENCaGVHbHpJR3hoWW1Wc2N5QW9ibThnZUMxaGVHbHpJSFJwZEd4bEtWeHVJQ0FnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUNnb1l5aGNJaU0zTnpjM056ZGNJaXdnWENJalJqSTRSVEpEWENJcEtTa3BJQ3RjYmlBZ0lDQnNZV0p6S0hnZ1BTQk9WVXhNTENCNUlEMGdYQ0pFYVhOMFlXNWpaU0JtY205dElGUkJSQ0JpYjNWdVpHRnllVndpS1NBclhHNGdJQ0FnSXlCV2FXOXNhVzRnY0d4dmRDQjNhWFJvSUdKc1lXTnJJRzkxZEd4cGJtVXNJR04xYzNSdmJXbDZaV1FnYkdsdVpTQjNhV1IwYUNCaGJtUWdaVzVrWEc0Z0lDQWdhVzUwY205a1lYUmhkbWw2T2pwblpXOXRYM053YkdsMFgzWnBiMnhwYmloY2JpQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzSUdGc2NHaGhJRDBnTUM0MExGeHVJQ0FnSUNBZ2JHbHVaWGRwWkhSb0lEMGdiR2x1WlUxbFpHbDFiU0FxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBJQ3RjYmlBZ0lDQWpJRUp2ZUNCd2JHOTBJSGRwZEdnZ1kzVnpkRzl0YVhwbFpDQnNhVzVsSUhkcFpIUm9MQ0J6Y1hWaGNtVWdaVzVrTENCaGJtUWdiM1YwYkdsbGNpQnphWHBsWEc0Z0lDQWdaMlZ2YlY5aWIzaHdiRzkwS0Z4dUlDQWdJQ0FnZDJsa2RHZ2dQU0F3TGpNc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxDQmhiSEJvWVNBOUlEQXVOaXhjYmlBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVk5aV1JwZFcwZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aUxGeHVJQ0FnSUNBZ2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QkxDQWdZV3h3YUdFZ1BTQXdMallzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBWY2JpQWdJQ0FwSUN0Y2JpQWdJQ0JjYmlBZ0lDQWpJRTFsWVc0Z2NHOXBiblFnYVc0Z1pXRmphQ0JuY205MWNGeHVJQ0FnSUhOMFlYUmZjM1Z0YldGeWVTaGNiaUFnSUNBZ0lHRmxjeWhuY205MWNDQTlJR2R5YjNWd0tTd2dablZ1SUQwZ2JXVmhiaXhjYmlBZ0lDQWdJR2RsYjIwZ1BTQmNJbkJ2YVc1MFhDSXNJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F3TGpVc1hHNGdJQ0FnSUNCbWFXeHNJRDBnWENKaWJHRmphMXdpTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2NHOXphWFJwYjI0Z1BTQndiM05wZEdsdmJsOWtiMlJuWlNndU15bGNiaUFnSUNBcElDdGNiaUFnSUNCY2JpQWdJQ0FqSUVodmNtbDZiMjUwWVd3Z2JHbHVaU0JoZENCNUlEMGdNRnh1SUNBZ0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBc0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDa2dLMXh1SUNBZ0lGeHVJQ0FnSUNNZ1EyOXZjbVJwYm1GMFpTQnNhVzFwZEhNZ1lXNWtJR04xYzNSdmJTQjVMV0Y0YVhNZ2JHRmlaV3h6WEc0Z0lDQWdZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktIbHRhVzRzSUhsdFlYZ3BLU0FyWEc0Z0lDQWdjMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR3hoWW1Wc2N5QTlJR3hoWW1Wc1gydGlYMjFpS1NBclhHNGdJQ0FnWEc0Z0lDQWdJeUJCYm01dmRHRjBaU0J3TFhaaGJIVmxJSFJsZUhSY2JpQWdJQ0JoYm01dmRHRjBaU2hjYmlBZ0lDQWdJRndpZEdWNGRGd2lMQ0I0SUQwZ01Td2dlU0E5SUhsdGFXNGdLeUF4TEZ4dUlDQWdJQ0FnYkdGaVpXd2dQU0J3WVhOMFpUQW9YQ0p3TVRJNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeE1pa3BMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE5jYmlBZ0lDQXBJQ3RjYmlBZ0lDQmNiaUFnSUNBaklGUm9aVzFsSUdOMWMzUnZiV2w2WVhScGIyNWNiaUFnSUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQWdJSFJvWlcxbEtGeHVJQ0FnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN3Z1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBZ0lDa3NYRzRnSUNBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0lDQXBMRnh1SUNBZ0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUdocWRYTjBJRDBnTVN3Z2RtcDFjM1FnUFNBeFhHNGdJQ0FnSUNBcExGeHVJQ0FnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxDQnphWHBsSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNBZ0tTeGNiaUFnSUNBZ0lHRjRhWE11ZEdsamEzTWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lYRzRnSUNBZ0lDQXBMRnh1SUNBZ0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWENKMGNtRnVjM0JoY21WdWRGd2lLU3hjYmlBZ0lDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtwSUN0Y2JpQWdJQ0JuZFdsa1pYTW9YRzRnSUNBZ0lDQm1hV3hzSUQwZ1ozVnBaR1ZmYkdWblpXNWtLRnh1SUNBZ0lDQWdJQ0JyWlhsM2FXUjBhQ0E5SURBdU1pd2dJQ01nUVdScWRYTjBJSFJvWlNCM2FXUjBhQ0J2WmlCMGFHVWdiR1ZuWlc1a0lHdGxlWE5jYmlBZ0lDQWdJQ0FnYTJWNWFHVnBaMmgwSUQwZ01DNHlJQ0FqSUVGa2FuVnpkQ0IwYUdVZ2FHVnBaMmgwSUc5bUlIUm9aU0JzWldkbGJtUWdhMlY1YzF4dUlDQWdJQ0FnS1Z4dUlDQWdJQ2xjYmlBZ1hHNGdJRnh1SUNCbWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSmthWE4wWVc1alpWOTBiMTlpYjNWdVpHRnllVjljSWl3Z2JtOTBaU2xjYmlBZ2QybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtERXVOVFVwS20xdFZHOUpibU5vWEc0Z0lHaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzR5S1NwdGJWUnZTVzVqYUZ4dUlDQndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dWZWeHVYRzV3Ykc5MFgxUkJSR1JwYzNSaGJtTmxLR2RsYm1VdVZGTlRMblJpTG5Cc2IzUXNJRndpWjNKdmRYQmZZbWx1WVhsSGNtOTFjRndpTENCNWJXRjRJRDBnTVRBd01EQXdNQ2xjYmx4dVhHNGpJeUJRYkc5MElGUkJSQ0J6YVhwbFhHNW5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlHZHliM1Z3TVNrZ0tTUlVRVVJ6YVhwbFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JuY205MWNESXBJQ2trVkVGRWMybDZaVnh1SUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JuMWNibHh1WEc1d2JHOTBYMVJCUkhOcGVtVWdQQzBnWm5WdVkzUnBiMjRvZEdWdGNDNTBZaXdnYm05MFpTd2dlVzFwYmlBOUlEQXNJSGx0WVhnZ1BTQXlNREF3TURBd0tYdGNiaUFnY0RFeUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWENKbmNtOTFjREZjSWl3Z1hDSm5jbTkxY0RKY0lpa3NJRFVwWEc0Z0lGeHVJQ0J3SUR3dElHZG5jR3h2ZENoMFpXMXdMblJpTENCaFpYTW9lQ0E5SUZ3aUxsd2lMQ0JtYVd4c0lEMGdaM0p2ZFhBc0lIa2dQU0JVUVVSemFYcGxLU2tnSzF4dUlDQWdJQ01nVTJWMElHRjRhWE1nYkdGaVpXeHpJQ2h1YnlCNExXRjRhWE1nZEdsMGJHVXBYRzRnSUNBZ2JHRmljeWg0SUQwZ1RsVk1UQ3dnZVNBOUlGd2lVMmw2WlNCdlppQlVRVVJjSWlrZ0sxeHVJQ0FnSUNBZ0lDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQW9LR01vWENJak56YzNOemMzWENJc0lGd2lJMFl5T0VVeVExd2lLU2twS1NBclhHNWNiaUFnSUNBaklGWnBiMnhwYmlCd2JHOTBJSGRwZEdnZ1lteGhZMnNnYjNWMGJHbHVaU3dnWTNWemRHOXRhWHBsWkNCc2FXNWxJSGRwWkhSb0lHRnVaQ0JsYm1SY2JpQWdJQ0JwYm5SeWIyUmhkR0YyYVhvNk9tZGxiMjFmYzNCc2FYUmZkbWx2YkdsdUtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc1hHNGdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVFdWa2FYVnRLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lMQ0JoYkhCb1lTQTlJQzQwWEc0Z0lDQWdLU0FyWEc0Z0lDQWdYRzRnSUNBZ0l5QkNiM2dnY0d4dmRDQjNhWFJvSUdOMWMzUnZiV2w2WldRZ2JHbHVaU0IzYVdSMGFDd2djM0YxWVhKbElHVnVaQ3dnWVc1a0lHOTFkR3hwWlhJZ2MybDZaVnh1SUNBZ0lHZGxiMjFmWW05NGNHeHZkQ2hjYmlBZ0lDQWdJSGRwWkhSb0lEMGdNQzR6TENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl4Y2JpQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZOWldScGRXMHFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNYRzRnSUNBZ0lDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRXNJQ0JoYkhCb1lTQTlJREF1Tml3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJWeHVJQ0FnSUNrZ0sxeHVJQ0FnSUZ4dUlDQWdJQ01nVFdWaGJpQndiMmx1ZENCcGJpQmxZV05vSUdkeWIzVndYRzRnSUNBZ2MzUmhkRjl6ZFcxdFlYSjVLRnh1SUNBZ0lDQWdZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TEZ4dUlDQWdJQ0FnWjJWdmJTQTlJRndpY0c5cGJuUmNJaXdnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURBdU5TeGNiaUFnSUNBZ0lHWnBiR3dnUFNCY0ltSnNZV05yWENJc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxDQndiM05wZEdsdmJpQTlJSEJ2YzJsMGFXOXVYMlJ2WkdkbEtDNHpLVnh1SUNBZ0lDa2dLMXh1SUNBZ0lGeHVJQ0FnSUNNZ1NHOXlhWHB2Ym5SaGJDQnNhVzVsSUdGMElIa2dQU0F3WEc0Z0lDQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Dd2diR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBLU0FyWEc0Z0lDQWdYRzRnSUNBZ0l5QkRiMjl5WkdsdVlYUmxJR3hwYldsMGN5QmhibVFnWTNWemRHOXRJSGt0WVhocGN5QnNZV0psYkhOY2JpQWdJQ0JqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9lVzFwYml3Z2VXMWhlQ2twSUN0Y2JpQWdJQ0J6WTJGc1pWOTVYMk52Ym5ScGJuVnZkWE1vYkdGaVpXeHpJRDBnYkdGaVpXeGZhMkpmYldJcElDdGNiaUFnSUNCY2JpQWdJQ0FqSUVGdWJtOTBZWFJsSUhBdGRtRnNkV1VnZEdWNGRGeHVJQ0FnSUdGdWJtOTBZWFJsS0Z4dUlDQWdJQ0FnWENKMFpYaDBYQ0lzSUhnZ1BTQXhMQ0I1SUQwZ2VXMXBiaUFySURFc1hHNGdJQ0FnSUNCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5BeE1qb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NERXlLU2tzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXdnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTTF4dUlDQWdJQ2tnSzF4dUlDQWdJRnh1SUNBZ0lDTWdWR2hsYldVZ1kzVnpkRzl0YVhwaGRHbHZibHh1SUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQjBhR1Z0WlNoY2JpQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTd2dabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUdocWRYTjBJRDBnTVN3Z2RtcDFjM1FnUFNBeFhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY0luUnlZVzV6Y0dGeVpXNTBYQ0lwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNrZ0t5Qm5kV2xrWlhNb1hHNGdJQ0FnSUNCbWFXeHNJRDBnWjNWcFpHVmZiR1ZuWlc1a0tGeHVJQ0FnSUNBZ0lDQnJaWGwzYVdSMGFDQTlJREF1TWl3Z0lDTWdRV1JxZFhOMElIUm9aU0IzYVdSMGFDQnZaaUIwYUdVZ2JHVm5aVzVrSUd0bGVYTmNiaUFnSUNBZ0lDQWdhMlY1YUdWcFoyaDBJRDBnTUM0eUlDQWpJRUZrYW5WemRDQjBhR1VnYUdWcFoyaDBJRzltSUhSb1pTQnNaV2RsYm1RZ2EyVjVjMXh1SUNBZ0lDQWdLU2xjYmlBZ1hHNGdJRnh1SUNCY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpYzJsNlpWOXZabDlpYjNWdVpHRnllVjljSWl3Z2JtOTBaU2xjYmlBZ2QybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtERXVOVFVwS20xdFZHOUpibU5vWEc0Z0lHaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzR5S1NwdGJWUnZTVzVqYUZ4dUlDQndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dWZWeHVjR3h2ZEY5VVFVUnphWHBsS0dkbGJtVXVWRk5UTG5SaUxuQnNiM1FzSUZ3aVozSnZkWEJmWW1sdVlYSjVSM0p2ZFhCY0lpd2dlVzFoZUNBOUlETmxOaWxjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cblxuZ2VuZS5UU1MudGIucGxvdCA8LSBnZW5lLlRTUy50YiAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAxLCBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMiwgXFxncm91cDJcXCwgTkEpKSkgJT4lIFxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cblxuIyMgUGxvdCBkaXN0YW5jZVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZGlzdGFuY2VcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRkaXN0YW5jZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X1RBRGRpc3RhbmNlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBcXC5cXCwgZmlsbCA9IGdyb3VwLCB5ID0gZGlzdGFuY2UpKSArXG4gICAgIyBTZXQgYXhpcyBsYWJlbHMgKG5vIHgtYXhpcyB0aXRsZSlcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSAoKGMoXFwjNzc3Nzc3XFwsIFxcI0YyOEUyQ1xcKSkpKSArXG4gICAgbGFicyh4ID0gTlVMTCwgeSA9IFxcRGlzdGFuY2UgZnJvbSBUQUQgYm91bmRhcnlcXCkgK1xuICAgICMgVmlvbGluIHBsb3Qgd2l0aCBibGFjayBvdXRsaW5lLCBjdXN0b21pemVkIGxpbmUgd2lkdGggYW5kIGVuZFxuICAgIGludHJvZGF0YXZpejo6Z2VvbV9zcGxpdF92aW9saW4oXG4gICAgIGNvbG9yID0gXFxibGFja1xcLCBhbHBoYSA9IDAuNCxcbiAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSArXG4gICAgIyBCb3ggcGxvdCB3aXRoIGN1c3RvbWl6ZWQgbGluZSB3aWR0aCwgc3F1YXJlIGVuZCwgYW5kIG91dGxpZXIgc2l6ZVxuICAgIGdlb21fYm94cGxvdChcbiAgICAgIHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCwgYWxwaGEgPSAwLjYsXG4gICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFXG4gICAgKSArXG4gICAgXG4gICAgIyBNZWFuIHBvaW50IGluIGVhY2ggZ3JvdXBcbiAgICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICAgKSArXG4gICAgXG4gICAgIyBIb3Jpem9udGFsIGxpbmUgYXQgeSA9IDBcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgICBcbiAgICAjIENvb3JkaW5hdGUgbGltaXRzIGFuZCBjdXN0b20geS1heGlzIGxhYmVsc1xuICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5bWluLCB5bWF4KSkgK1xuICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICAgIFxuICAgICMgQW5ub3RhdGUgcC12YWx1ZSB0ZXh0XG4gICAgYW5ub3RhdGUoXG4gICAgICBcXHRleHRcXCwgeCA9IDEsIHkgPSB5bWluICsgMSxcbiAgICAgIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpKSxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzXG4gICAgKSArXG4gICAgXG4gICAgIyBUaGVtZSBjdXN0b21pemF0aW9uXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICAgKSxcbiAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpKSArXG4gICAgZ3VpZGVzKFxuICAgICAgZmlsbCA9IGd1aWRlX2xlZ2VuZChcbiAgICAgICAga2V5d2lkdGggPSAwLjIsICAjIEFkanVzdCB0aGUgd2lkdGggb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgICAgIGtleWhlaWdodCA9IDAuMiAgIyBBZGp1c3QgdGhlIGhlaWdodCBvZiB0aGUgbGVnZW5kIGtleXNcbiAgICAgIClcbiAgICApXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZGlzdGFuY2VfdG9fYm91bmRhcnlfXFwsIG5vdGUpXG4gIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjU1KSptbVRvSW5jaFxuICBoZWlnaHQgPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cblxucGxvdF9UQURkaXN0YW5jZShnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwX2JpbmF5R3JvdXBcXCwgeW1heCA9IDEwMDAwMDApXG5cblxuIyMgUGxvdCBUQUQgc2l6ZVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkVEFEc2l6ZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJFRBRHNpemVcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9UQURzaXplIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBcXC5cXCwgZmlsbCA9IGdyb3VwLCB5ID0gVEFEc2l6ZSkpICtcbiAgICAjIFNldCBheGlzIGxhYmVscyAobm8geC1heGlzIHRpdGxlKVxuICAgIGxhYnMoeCA9IE5VTEwsIHkgPSBcXFNpemUgb2YgVEFEXFwpICtcbiAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gKChjKFxcIzc3Nzc3N1xcLCBcXCNGMjhFMkNcXCkpKSkgK1xuXG4gICAgIyBWaW9saW4gcGxvdCB3aXRoIGJsYWNrIG91dGxpbmUsIGN1c3RvbWl6ZWQgbGluZSB3aWR0aCBhbmQgZW5kXG4gICAgaW50cm9kYXRhdml6OjpnZW9tX3NwbGl0X3Zpb2xpbihcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgYWxwaGEgPSAuNFxuICAgICkgK1xuICAgIFxuICAgICMgQm94IHBsb3Qgd2l0aCBjdXN0b21pemVkIGxpbmUgd2lkdGgsIHNxdWFyZSBlbmQsIGFuZCBvdXRsaWVyIHNpemVcbiAgICBnZW9tX2JveHBsb3QoXG4gICAgICB3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0VcbiAgICApICtcbiAgICBcbiAgICAjIE1lYW4gcG9pbnQgaW4gZWFjaCBncm91cFxuICAgIHN0YXRfc3VtbWFyeShcbiAgICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgICApICtcbiAgICBcbiAgICAjIEhvcml6b250YWwgbGluZSBhdCB5ID0gMFxuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICAgIFxuICAgICMgQ29vcmRpbmF0ZSBsaW1pdHMgYW5kIGN1c3RvbSB5LWF4aXMgbGFiZWxzXG4gICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gICAgXG4gICAgIyBBbm5vdGF0ZSBwLXZhbHVlIHRleHRcbiAgICBhbm5vdGF0ZShcbiAgICAgIFxcdGV4dFxcLCB4ID0gMSwgeSA9IHltaW4gKyAxLFxuICAgICAgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMikpLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDNcbiAgICApICtcbiAgICBcbiAgICAjIFRoZW1lIGN1c3RvbWl6YXRpb25cbiAgdGhlbWVfY2xhc3NpYygpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApICsgZ3VpZGVzKFxuICAgICAgZmlsbCA9IGd1aWRlX2xlZ2VuZChcbiAgICAgICAga2V5d2lkdGggPSAwLjIsICAjIEFkanVzdCB0aGUgd2lkdGggb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgICAgIGtleWhlaWdodCA9IDAuMiAgIyBBZGp1c3QgdGhlIGhlaWdodCBvZiB0aGUgbGVnZW5kIGtleXNcbiAgICAgICkpXG4gIFxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHNpemVfb2ZfYm91bmRhcnlfXFwsIG5vdGUpXG4gIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjU1KSptbVRvSW5jaFxuICBoZWlnaHQgPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbnBsb3RfVEFEc2l6ZShnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwX2JpbmFyeUdyb3VwXFwsIHltYXggPSAzZTYpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.TSS.tb.plot <- gene.TSS.tb %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\, NA))) %>% 
  dplyr::filter(!is.na(group))


## Plot distance
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$distance
  distance2 <- (data %>% dplyr::filter(group == group2) )$distance
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_TADdistance <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = \.\, fill = group, y = distance)) +
    # Set axis labels (no x-axis title)
    scale_fill_manual(values = ((c(\#777777\, \#F28E2C\)))) +
    labs(x = NULL, y = \Distance from TAD boundary\) +
    # Violin plot with black outline, customized line width and end
    introdataviz::geom_split_violin(
     color = \black\, alpha = 0.4,
      linewidth = lineMedium * mmToLineUnit, lineend = \square\
    ) +
    # Box plot with customized line width, square end, and outlier size
    geom_boxplot(
      width = 0.3, color = \black\, alpha = 0.6,
      linewidth = lineMedium * mmToLineUnit, lineend = \square\,
      outlier.shape = NA,  alpha = 0.6, show.legend = FALSE
    ) +
    
    # Mean point in each group
    stat_summary(
      aes(group = group), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) +
    
    # Horizontal line at y = 0
    geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
    
    # Coordinate limits and custom y-axis labels
    coord_cartesian(ylim = c(ymin, ymax)) +
    scale_y_continuous(labels = label_kb_mb) +
    
    # Annotate p-value text
    annotate(
      \text\, x = 1, y = ymin + 1,
      label = paste0(\p12: \, convPvalue(p12)),
      color = \black\, hjust = 0, size = 3
    ) +
    
    # Theme customization
    theme_classic() +
    theme(
      axis.title = element_text(
        size = fontSizeM, family = fontType, color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS, family = fontType, color = \#000000\
      ),
      axis.text.x = element_text(
        angle = 45, hjust = 1, vjust = 1
      ),
      axis.line = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
      legend.text = element_text(family = fontType, size = fontSizeS),
      legend.title = element_text(family = fontType, size = fontSizeS)) +
    guides(
      fill = guide_legend(
        keywidth = 0.2,  # Adjust the width of the legend keys
        keyheight = 0.2  # Adjust the height of the legend keys
      )
    )
  
  
  fileName <- paste0(\distance_to_boundary_\, note)
  width <- panelSize(1.55)*mmToInch
  height <- panelSize(1.2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

plot_TADdistance(gene.TSS.tb.plot, \group_binayGroup\, ymax = 1000000)


## Plot TAD size
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$TADsize
  distance2 <- (data %>% dplyr::filter(group == group2) )$TADsize
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_TADsize <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = \.\, fill = group, y = TADsize)) +
    # Set axis labels (no x-axis title)
    labs(x = NULL, y = \Size of TAD\) +
        scale_fill_manual(values = ((c(\#777777\, \#F28E2C\)))) +

    # Violin plot with black outline, customized line width and end
    introdataviz::geom_split_violin(
      color = \black\,
      linewidth = lineMedium* mmToLineUnit, lineend = \square\, alpha = .4
    ) +
    
    # Box plot with customized line width, square end, and outlier size
    geom_boxplot(
      width = 0.3, color = \black\,
      linewidth = lineMedium* mmToLineUnit, lineend = \square\,
      outlier.shape = NA,  alpha = 0.6, show.legend = FALSE
    ) +
    
    # Mean point in each group
    stat_summary(
      aes(group = group), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) +
    
    # Horizontal line at y = 0
    geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
    
    # Coordinate limits and custom y-axis labels
    coord_cartesian(ylim = c(ymin, ymax)) +
    scale_y_continuous(labels = label_kb_mb) +
    
    # Annotate p-value text
    annotate(
      \text\, x = 1, y = ymin + 1,
      label = paste0(\p12: \, convPvalue(p12)),
      color = \black\, hjust = 0, size = 3
    ) +
    
    # Theme customization
  theme_classic() +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) + guides(
      fill = guide_legend(
        keywidth = 0.2,  # Adjust the width of the legend keys
        keyheight = 0.2  # Adjust the height of the legend keys
      ))
  
  
  
  fileName <- paste0(\size_of_boundary_\, note)
  width <- panelSize(1.55)*mmToInch
  height <- panelSize(1.2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_TADsize(gene.TSS.tb.plot, \group_binaryGroup\, ymax = 3e6)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNERXVkSE4yWEZ3cEtTUm5aVzVsWEc1bmNtOTFjRElnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJKcGJtRnllVWR5YjNWd01pNTBjM1pjWENrcEpHZGxibVZjYmx4dVhHNW5aVzVsTGxSVFV5NTBZaTV3Ykc5MElEd3RJR2RsYm1VdVZGTlRMblJpSUNVK0pTQnliM2QzYVhObEtDa2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9YRzRnSUdkeWIzVndJRDBnYVdabGJITmxLR1Z1YzJWdFltd2dKV2x1SlNCbmNtOTFjREVzSUZ4Y1ozSnZkWEF4WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdaM0p2ZFhBeUxDQmNYR2R5YjNWd01seGNMQ0JPUVNrcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvSVdsekxtNWhLR2R5YjNWd0tTbGNibHh1WEc0akl5QlFiRzkwSUdScGMzUmhibU5sWEc1blpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaUFnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SUdkeWIzVndNU2tnS1NSa2FYTjBZVzVqWlZ4dUlDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdaM0p2ZFhBeUtTQXBKR1JwYzNSaGJtTmxYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzVjYm5Cc2IzUmZWRUZFWkdsemRHRnVZMlVnUEMwZ1puVnVZM1JwYjI0b2RHVnRjQzUwWWl3Z2JtOTBaU3dnZVcxcGJpQTlJREFzSUhsdFlYZ2dQU0F5TURBd01EQXdLWHRjYmlBZ2NERXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNESmNYQ2tzSURVcFhHNGdJRnh1SUNCd0lEd3RJR2RuY0d4dmRDaDBaVzF3TG5SaUxDQmhaWE1vZUNBOUlGeGNMbHhjTENCbWFXeHNJRDBnWjNKdmRYQXNJSGtnUFNCa2FYTjBZVzVqWlNrcElDdGNiaUFnSUNBaklGTmxkQ0JoZUdseklHeGhZbVZzY3lBb2JtOGdlQzFoZUdseklIUnBkR3hsS1Z4dUlDQWdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJQ2dvWXloY1hDTTNOemMzTnpkY1hDd2dYRndqUmpJNFJUSkRYRndwS1NrcElDdGNiaUFnSUNCc1lXSnpLSGdnUFNCT1ZVeE1MQ0I1SUQwZ1hGeEVhWE4wWVc1alpTQm1jbTl0SUZSQlJDQmliM1Z1WkdGeWVWeGNLU0FyWEc0Z0lDQWdJeUJXYVc5c2FXNGdjR3h2ZENCM2FYUm9JR0pzWVdOcklHOTFkR3hwYm1Vc0lHTjFjM1J2YldsNlpXUWdiR2x1WlNCM2FXUjBhQ0JoYm1RZ1pXNWtYRzRnSUNBZ2FXNTBjbTlrWVhSaGRtbDZPanBuWlc5dFgzTndiR2wwWDNacGIyeHBiaWhjYmlBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NJR0ZzY0doaElEMGdNQzQwTEZ4dUlDQWdJQ0FnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVTFsWkdsMWJTQXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcElDdGNiaUFnSUNBaklFSnZlQ0J3Ykc5MElIZHBkR2dnWTNWemRHOXRhWHBsWkNCc2FXNWxJSGRwWkhSb0xDQnpjWFZoY21VZ1pXNWtMQ0JoYm1RZ2IzVjBiR2xsY2lCemFYcGxYRzRnSUNBZ1oyVnZiVjlpYjNod2JHOTBLRnh1SUNBZ0lDQWdkMmxrZEdnZ1BTQXdMak1zSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTENCaGJIQm9ZU0E5SURBdU5peGNiaUFnSUNBZ0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WTlpXUnBkVzBnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjTEZ4dUlDQWdJQ0FnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCTENBZ1lXeHdhR0VnUFNBd0xqWXNJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFZjYmlBZ0lDQXBJQ3RjYmlBZ0lDQmNiaUFnSUNBaklFMWxZVzRnY0c5cGJuUWdhVzRnWldGamFDQm5jbTkxY0Z4dUlDQWdJSE4wWVhSZmMzVnRiV0Z5ZVNoY2JpQWdJQ0FnSUdGbGN5aG5jbTkxY0NBOUlHZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpeGNiaUFnSUNBZ0lHZGxiMjBnUFNCY1hIQnZhVzUwWEZ3c0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXdMalVzWEc0Z0lDQWdJQ0JtYVd4c0lEMGdYRnhpYkdGamExeGNMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnY0c5emFYUnBiMjRnUFNCd2IzTnBkR2x2Ymw5a2IyUm5aU2d1TXlsY2JpQWdJQ0FwSUN0Y2JpQWdJQ0JjYmlBZ0lDQWpJRWh2Y21sNmIyNTBZV3dnYkdsdVpTQmhkQ0I1SUQwZ01GeHVJQ0FnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFzSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZENrZ0sxeHVJQ0FnSUZ4dUlDQWdJQ01nUTI5dmNtUnBibUYwWlNCc2FXMXBkSE1nWVc1a0lHTjFjM1J2YlNCNUxXRjRhWE1nYkdGaVpXeHpYRzRnSUNBZ1kyOXZjbVJmWTJGeWRHVnphV0Z1S0hsc2FXMGdQU0JqS0hsdGFXNHNJSGx0WVhncEtTQXJYRzRnSUNBZ2MyTmhiR1ZmZVY5amIyNTBhVzUxYjNWektHeGhZbVZzY3lBOUlHeGhZbVZzWDJ0aVgyMWlLU0FyWEc0Z0lDQWdYRzRnSUNBZ0l5QkJibTV2ZEdGMFpTQndMWFpoYkhWbElIUmxlSFJjYmlBZ0lDQmhibTV2ZEdGMFpTaGNiaUFnSUNBZ0lGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTVN3Z2VTQTlJSGx0YVc0Z0t5QXhMRnh1SUNBZ0lDQWdiR0ZpWld3Z1BTQndZWE4wWlRBb1hGeHdNVEk2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF4TWlrcExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETmNiaUFnSUNBcElDdGNiaUFnSUNCY2JpQWdJQ0FqSUZSb1pXMWxJR04xYzNSdmJXbDZZWFJwYjI1Y2JpQWdJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNBZ0lIUm9aVzFsS0Z4dUlDQWdJQ0FnWVhocGN5NTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3dnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnSUNBcExGeHVJQ0FnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJR2hxZFhOMElEMGdNU3dnZG1wMWMzUWdQU0F4WEc0Z0lDQWdJQ0FwTEZ4dUlDQWdJQ0FnWVhocGN5NXNhVzVsSUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y1hHNGdJQ0FnSUNBcExGeHVJQ0FnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYRngwY21GdWMzQmhjbVZ1ZEZ4Y0tTeGNiaUFnSUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5a3BJQ3RjYmlBZ0lDQm5kV2xrWlhNb1hHNGdJQ0FnSUNCbWFXeHNJRDBnWjNWcFpHVmZiR1ZuWlc1a0tGeHVJQ0FnSUNBZ0lDQnJaWGwzYVdSMGFDQTlJREF1TWl3Z0lDTWdRV1JxZFhOMElIUm9aU0IzYVdSMGFDQnZaaUIwYUdVZ2JHVm5aVzVrSUd0bGVYTmNiaUFnSUNBZ0lDQWdhMlY1YUdWcFoyaDBJRDBnTUM0eUlDQWpJRUZrYW5WemRDQjBhR1VnYUdWcFoyaDBJRzltSUhSb1pTQnNaV2RsYm1RZ2EyVjVjMXh1SUNBZ0lDQWdLVnh1SUNBZ0lDbGNiaUFnWEc0Z0lGeHVJQ0JtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4a2FYTjBZVzVqWlY5MGIxOWliM1Z1WkdGeWVWOWNYQ3dnYm05MFpTbGNiaUFnZDJsa2RHZ2dQQzBnY0dGdVpXeFRhWHBsS0RFdU5UVXBLbTF0Vkc5SmJtTm9YRzRnSUdobGFXZG9kQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNHlLU3B0YlZSdlNXNWphRnh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0J6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1ZlZ4dVhHNXdiRzkwWDFSQlJHUnBjM1JoYm1ObEtHZGxibVV1VkZOVExuUmlMbkJzYjNRc0lGeGNaM0p2ZFhCZlltbHVZWGxIY205MWNGeGNMQ0I1YldGNElEMGdNVEF3TURBd01DbGNibHh1WEc0akl5QlFiRzkwSUZSQlJDQnphWHBsWEc1blpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaUFnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SUdkeWIzVndNU2tnS1NSVVFVUnphWHBsWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQm5jbTkxY0RJcElDa2tWRUZFYzJsNlpWeHVJQ0IzYVd3Z1BDMGdkMmxzWTI5NExuUmxjM1FvWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcFhHNGdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYm4xY2JseHVYRzV3Ykc5MFgxUkJSSE5wZW1VZ1BDMGdablZ1WTNScGIyNG9kR1Z0Y0M1MFlpd2dibTkwWlN3Z2VXMXBiaUE5SURBc0lIbHRZWGdnUFNBeU1EQXdNREF3S1h0Y2JpQWdjREV5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYRnhuY205MWNERmNYQ3dnWEZ4bmNtOTFjREpjWENrc0lEVXBYRzRnSUZ4dUlDQndJRHd0SUdkbmNHeHZkQ2gwWlcxd0xuUmlMQ0JoWlhNb2VDQTlJRnhjTGx4Y0xDQm1hV3hzSUQwZ1ozSnZkWEFzSUhrZ1BTQlVRVVJ6YVhwbEtTa2dLMXh1SUNBZ0lDTWdVMlYwSUdGNGFYTWdiR0ZpWld4eklDaHVieUI0TFdGNGFYTWdkR2wwYkdVcFhHNGdJQ0FnYkdGaWN5aDRJRDBnVGxWTVRDd2dlU0E5SUZ4Y1UybDZaU0J2WmlCVVFVUmNYQ2tnSzF4dUlDQWdJQ0FnSUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNBb0tHTW9YRndqTnpjM056YzNYRndzSUZ4Y0kwWXlPRVV5UTF4Y0tTa3BLU0FyWEc1Y2JpQWdJQ0FqSUZacGIyeHBiaUJ3Ykc5MElIZHBkR2dnWW14aFkyc2diM1YwYkdsdVpTd2dZM1Z6ZEc5dGFYcGxaQ0JzYVc1bElIZHBaSFJvSUdGdVpDQmxibVJjYmlBZ0lDQnBiblJ5YjJSaGRHRjJhWG82T21kbGIyMWZjM0JzYVhSZmRtbHZiR2x1S0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzWEc0Z0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxUV1ZrYVhWdEtpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0xDQmhiSEJvWVNBOUlDNDBYRzRnSUNBZ0tTQXJYRzRnSUNBZ1hHNGdJQ0FnSXlCQ2IzZ2djR3h2ZENCM2FYUm9JR04xYzNSdmJXbDZaV1FnYkdsdVpTQjNhV1IwYUN3Z2MzRjFZWEpsSUdWdVpDd2dZVzVrSUc5MWRHeHBaWElnYzJsNlpWeHVJQ0FnSUdkbGIyMWZZbTk0Y0d4dmRDaGNiaUFnSUNBZ0lIZHBaSFJvSUQwZ01DNHpMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3hjYmlBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVk5aV1JwZFcwcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c1hHNGdJQ0FnSUNCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFc0lDQmhiSEJvWVNBOUlEQXVOaXdnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlZ4dUlDQWdJQ2tnSzF4dUlDQWdJRnh1SUNBZ0lDTWdUV1ZoYmlCd2IybHVkQ0JwYmlCbFlXTm9JR2R5YjNWd1hHNGdJQ0FnYzNSaGRGOXpkVzF0WVhKNUtGeHVJQ0FnSUNBZ1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMRnh1SUNBZ0lDQWdaMlZ2YlNBOUlGeGNjRzlwYm5SY1hDd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJREF1TlN4Y2JpQWdJQ0FnSUdacGJHd2dQU0JjWEdKc1lXTnJYRndzSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTENCd2IzTnBkR2x2YmlBOUlIQnZjMmwwYVc5dVgyUnZaR2RsS0M0ektWeHVJQ0FnSUNrZ0sxeHVJQ0FnSUZ4dUlDQWdJQ01nU0c5eWFYcHZiblJoYkNCc2FXNWxJR0YwSUhrZ1BTQXdYRzRnSUNBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUN3Z2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMEtTQXJYRzRnSUNBZ1hHNGdJQ0FnSXlCRGIyOXlaR2x1WVhSbElHeHBiV2wwY3lCaGJtUWdZM1Z6ZEc5dElIa3RZWGhwY3lCc1lXSmxiSE5jYmlBZ0lDQmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb2VXMXBiaXdnZVcxaGVDa3BJQ3RjYmlBZ0lDQnpZMkZzWlY5NVgyTnZiblJwYm5WdmRYTW9iR0ZpWld4eklEMGdiR0ZpWld4ZmEySmZiV0lwSUN0Y2JpQWdJQ0JjYmlBZ0lDQWpJRUZ1Ym05MFlYUmxJSEF0ZG1Gc2RXVWdkR1Y0ZEZ4dUlDQWdJR0Z1Ym05MFlYUmxLRnh1SUNBZ0lDQWdYRngwWlhoMFhGd3NJSGdnUFNBeExDQjVJRDBnZVcxcGJpQXJJREVzWEc0Z0lDQWdJQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEF4TWpvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0RFeUtTa3NYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNMXh1SUNBZ0lDa2dLMXh1SUNBZ0lGeHVJQ0FnSUNNZ1ZHaGxiV1VnWTNWemRHOXRhWHBoZEdsdmJseHVJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN3Z1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUXVlQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJR2hxZFhOMElEMGdNU3dnZG1wMWMzUWdQU0F4WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xDQnphWHBsSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjWEhSeVlXNXpjR0Z5Wlc1MFhGd3BMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2tnS3lCbmRXbGtaWE1vWEc0Z0lDQWdJQ0JtYVd4c0lEMGdaM1ZwWkdWZmJHVm5aVzVrS0Z4dUlDQWdJQ0FnSUNCclpYbDNhV1IwYUNBOUlEQXVNaXdnSUNNZ1FXUnFkWE4wSUhSb1pTQjNhV1IwYUNCdlppQjBhR1VnYkdWblpXNWtJR3RsZVhOY2JpQWdJQ0FnSUNBZ2EyVjVhR1ZwWjJoMElEMGdNQzR5SUNBaklFRmthblZ6ZENCMGFHVWdhR1ZwWjJoMElHOW1JSFJvWlNCc1pXZGxibVFnYTJWNWMxeHVJQ0FnSUNBZ0tTbGNiaUFnWEc0Z0lGeHVJQ0JjYmlBZ1ptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNjMmw2WlY5dlpsOWliM1Z1WkdGeWVWOWNYQ3dnYm05MFpTbGNiaUFnZDJsa2RHZ2dQQzBnY0dGdVpXeFRhWHBsS0RFdU5UVXBLbTF0Vkc5SmJtTm9YRzRnSUdobGFXZG9kQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNHlLU3B0YlZSdlNXNWphRnh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0J6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1ZlZ4dWNHeHZkRjlVUVVSemFYcGxLR2RsYm1VdVZGTlRMblJpTG5Cc2IzUXNJRnhjWjNKdmRYQmZZbWx1WVhKNVIzSnZkWEJjWEN3Z2VXMWhlQ0E5SURObE5pbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5cbmdlbmUuVFNTLnRiLnBsb3QgPC0gZ2VuZS5UU1MudGIgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDIsIFxcZ3JvdXAyXFwsIE5BKSkpICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbiMjIFBsb3QgZGlzdGFuY2VcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGRpc3RhbmNlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZGlzdGFuY2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9UQURkaXN0YW5jZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gXFwuXFwsIGZpbGwgPSBncm91cCwgeSA9IGRpc3RhbmNlKSkgK1xuICAgICMgU2V0IGF4aXMgbGFiZWxzIChubyB4LWF4aXMgdGl0bGUpXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gKChjKFxcIzc3Nzc3N1xcLCBcXCNGMjhFMkNcXCkpKSkgK1xuICAgIGxhYnMoeCA9IE5VTEwsIHkgPSBcXERpc3RhbmNlIGZyb20gVEFEIGJvdW5kYXJ5XFwpICtcbiAgICAjIFZpb2xpbiBwbG90IHdpdGggYmxhY2sgb3V0bGluZSwgY3VzdG9taXplZCBsaW5lIHdpZHRoIGFuZCBlbmRcbiAgICBpbnRyb2RhdGF2aXo6Omdlb21fc3BsaXRfdmlvbGluKFxuICAgICBjb2xvciA9IFxcYmxhY2tcXCwgYWxwaGEgPSAwLjQsXG4gICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICkgK1xuICAgICMgQm94IHBsb3Qgd2l0aCBjdXN0b21pemVkIGxpbmUgd2lkdGgsIHNxdWFyZSBlbmQsIGFuZCBvdXRsaWVyIHNpemVcbiAgICBnZW9tX2JveHBsb3QoXG4gICAgICB3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsIGFscGhhID0gMC42LFxuICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRVxuICAgICkgK1xuICAgIFxuICAgICMgTWVhbiBwb2ludCBpbiBlYWNoIGdyb3VwXG4gICAgc3RhdF9zdW1tYXJ5KFxuICAgICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKVxuICAgICkgK1xuICAgIFxuICAgICMgSG9yaXpvbnRhbCBsaW5lIGF0IHkgPSAwXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gICAgXG4gICAgIyBDb29yZGluYXRlIGxpbWl0cyBhbmQgY3VzdG9tIHktYXhpcyBsYWJlbHNcbiAgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeW1pbiwgeW1heCkpICtcbiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgICBcbiAgICAjIEFubm90YXRlIHAtdmFsdWUgdGV4dFxuICAgIGFubm90YXRlKFxuICAgICAgXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsXG4gICAgICBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSksXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gM1xuICAgICkgK1xuICAgIFxuICAgICMgVGhlbWUgY3VzdG9taXphdGlvblxuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICAgICksXG4gICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgICApLFxuICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSkgK1xuICAgIGd1aWRlcyhcbiAgICAgIGZpbGwgPSBndWlkZV9sZWdlbmQoXG4gICAgICAgIGtleXdpZHRoID0gMC4yLCAgIyBBZGp1c3QgdGhlIHdpZHRoIG9mIHRoZSBsZWdlbmQga2V5c1xuICAgICAgICBrZXloZWlnaHQgPSAwLjIgICMgQWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgICApXG4gICAgKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGRpc3RhbmNlX3RvX2JvdW5kYXJ5X1xcLCBub3RlKVxuICB3aWR0aCA8LSBwYW5lbFNpemUoMS41NSkqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5cbnBsb3RfVEFEZGlzdGFuY2UoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cF9iaW5heUdyb3VwXFwsIHltYXggPSAxMDAwMDAwKVxuXG5cbiMjIFBsb3QgVEFEIHNpemVcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJFRBRHNpemVcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRUQURzaXplXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnBsb3RfVEFEc2l6ZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gXFwuXFwsIGZpbGwgPSBncm91cCwgeSA9IFRBRHNpemUpKSArXG4gICAgIyBTZXQgYXhpcyBsYWJlbHMgKG5vIHgtYXhpcyB0aXRsZSlcbiAgICBsYWJzKHggPSBOVUxMLCB5ID0gXFxTaXplIG9mIFRBRFxcKSArXG4gICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9ICgoYyhcXCM3Nzc3NzdcXCwgXFwjRjI4RTJDXFwpKSkpICtcblxuICAgICMgVmlvbGluIHBsb3Qgd2l0aCBibGFjayBvdXRsaW5lLCBjdXN0b21pemVkIGxpbmUgd2lkdGggYW5kIGVuZFxuICAgIGludHJvZGF0YXZpejo6Z2VvbV9zcGxpdF92aW9saW4oXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0qIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjRcbiAgICApICtcbiAgICBcbiAgICAjIEJveCBwbG90IHdpdGggY3VzdG9taXplZCBsaW5lIHdpZHRoLCBzcXVhcmUgZW5kLCBhbmQgb3V0bGllciBzaXplXG4gICAgZ2VvbV9ib3hwbG90KFxuICAgICAgd2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFXG4gICAgKSArXG4gICAgXG4gICAgIyBNZWFuIHBvaW50IGluIGVhY2ggZ3JvdXBcbiAgICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICAgKSArXG4gICAgXG4gICAgIyBIb3Jpem9udGFsIGxpbmUgYXQgeSA9IDBcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgICBcbiAgICAjIENvb3JkaW5hdGUgbGltaXRzIGFuZCBjdXN0b20geS1heGlzIGxhYmVsc1xuICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5bWluLCB5bWF4KSkgK1xuICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICAgIFxuICAgICMgQW5ub3RhdGUgcC12YWx1ZSB0ZXh0XG4gICAgYW5ub3RhdGUoXG4gICAgICBcXHRleHRcXCwgeCA9IDEsIHkgPSB5bWluICsgMSxcbiAgICAgIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpKSxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzXG4gICAgKSArXG4gICAgXG4gICAgIyBUaGVtZSBjdXN0b21pemF0aW9uXG4gIHRoZW1lX2NsYXNzaWMoKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArIGd1aWRlcyhcbiAgICAgIGZpbGwgPSBndWlkZV9sZWdlbmQoXG4gICAgICAgIGtleXdpZHRoID0gMC4yLCAgIyBBZGp1c3QgdGhlIHdpZHRoIG9mIHRoZSBsZWdlbmQga2V5c1xuICAgICAgICBrZXloZWlnaHQgPSAwLjIgICMgQWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgICApKVxuICBcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzaXplX29mX2JvdW5kYXJ5X1xcLCBub3RlKVxuICB3aWR0aCA8LSBwYW5lbFNpemUoMS41NSkqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5wbG90X1RBRHNpemUoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cF9iaW5hcnlHcm91cFxcLCB5bWF4ID0gM2U2KVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLlRTUy50Yi5wbG90IDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAyLCBcXGdyb3VwMlxcLCBOQSkpKSAlPiUgXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuXG4jIyBQbG90IGRpc3RhbmNlXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRkaXN0YW5jZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJGRpc3RhbmNlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnBsb3RfVEFEZGlzdGFuY2UgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXtcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IFxcLlxcLCBmaWxsID0gZ3JvdXAsIHkgPSBkaXN0YW5jZSkpICtcbiAgICAjIFNldCBheGlzIGxhYmVscyAobm8geC1heGlzIHRpdGxlKVxuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9ICgoYyhcXCM3Nzc3NzdcXCwgXFwjRjI4RTJDXFwpKSkpICtcbiAgICBsYWJzKHggPSBOVUxMLCB5ID0gXFxEaXN0YW5jZSBmcm9tIFRBRCBib3VuZGFyeVxcKSArXG4gICAgIyBWaW9saW4gcGxvdCB3aXRoIGJsYWNrIG91dGxpbmUsIGN1c3RvbWl6ZWQgbGluZSB3aWR0aCBhbmQgZW5kXG4gICAgaW50cm9kYXRhdml6OjpnZW9tX3NwbGl0X3Zpb2xpbihcbiAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGFscGhhID0gMC40LFxuICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApICtcbiAgICAjIEJveCBwbG90IHdpdGggY3VzdG9taXplZCBsaW5lIHdpZHRoLCBzcXVhcmUgZW5kLCBhbmQgb3V0bGllciBzaXplXG4gICAgZ2VvbV9ib3hwbG90KFxuICAgICAgd2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLCBhbHBoYSA9IDAuNixcbiAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0VcbiAgICApICtcbiAgICBcbiAgICAjIE1lYW4gcG9pbnQgaW4gZWFjaCBncm91cFxuICAgIHN0YXRfc3VtbWFyeShcbiAgICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgICApICtcbiAgICBcbiAgICAjIEhvcml6b250YWwgbGluZSBhdCB5ID0gMFxuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICAgIFxuICAgICMgQ29vcmRpbmF0ZSBsaW1pdHMgYW5kIGN1c3RvbSB5LWF4aXMgbGFiZWxzXG4gICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gICAgXG4gICAgIyBBbm5vdGF0ZSBwLXZhbHVlIHRleHRcbiAgICBhbm5vdGF0ZShcbiAgICAgIFxcdGV4dFxcLCB4ID0gMSwgeSA9IHltaW4gKyAxLFxuICAgICAgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMikpLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDNcbiAgICApICtcbiAgICBcbiAgICAjIFRoZW1lIGN1c3RvbWl6YXRpb25cbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgICApLFxuICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgICApLFxuICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykpICtcbiAgICBndWlkZXMoXG4gICAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKFxuICAgICAgICBrZXl3aWR0aCA9IDAuMiwgICMgQWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgbGVnZW5kIGtleXNcbiAgICAgICAga2V5aGVpZ2h0ID0gMC4yICAjIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWdlbmQga2V5c1xuICAgICAgKVxuICAgIClcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxkaXN0YW5jZV90b19ib3VuZGFyeV9cXCwgbm90ZSlcbiAgd2lkdGggPC0gcGFuZWxTaXplKDEuNTUpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG5wbG90X1RBRGRpc3RhbmNlKGdlbmUuVFNTLnRiLnBsb3QsIFxcZ3JvdXBfYmluYXlHcm91cFxcLCB5bWF4ID0gMTAwMDAwMClcblxuXG4jIyBQbG90IFRBRCBzaXplXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRUQURzaXplXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkVEFEc2l6ZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X1RBRHNpemUgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXtcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IFxcLlxcLCBmaWxsID0gZ3JvdXAsIHkgPSBUQURzaXplKSkgK1xuICAgICMgU2V0IGF4aXMgbGFiZWxzIChubyB4LWF4aXMgdGl0bGUpXG4gICAgbGFicyh4ID0gTlVMTCwgeSA9IFxcU2l6ZSBvZiBUQURcXCkgK1xuICAgICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSAoKGMoXFwjNzc3Nzc3XFwsIFxcI0YyOEUyQ1xcKSkpKSArXG5cbiAgICAjIFZpb2xpbiBwbG90IHdpdGggYmxhY2sgb3V0bGluZSwgY3VzdG9taXplZCBsaW5lIHdpZHRoIGFuZCBlbmRcbiAgICBpbnRyb2RhdGF2aXo6Omdlb21fc3BsaXRfdmlvbGluKFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBhbHBoYSA9IC40XG4gICAgKSArXG4gICAgXG4gICAgIyBCb3ggcGxvdCB3aXRoIGN1c3RvbWl6ZWQgbGluZSB3aWR0aCwgc3F1YXJlIGVuZCwgYW5kIG91dGxpZXIgc2l6ZVxuICAgIGdlb21fYm94cGxvdChcbiAgICAgIHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0qIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRVxuICAgICkgK1xuICAgIFxuICAgICMgTWVhbiBwb2ludCBpbiBlYWNoIGdyb3VwXG4gICAgc3RhdF9zdW1tYXJ5KFxuICAgICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKVxuICAgICkgK1xuICAgIFxuICAgICMgSG9yaXpvbnRhbCBsaW5lIGF0IHkgPSAwXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gICAgXG4gICAgIyBDb29yZGluYXRlIGxpbWl0cyBhbmQgY3VzdG9tIHktYXhpcyBsYWJlbHNcbiAgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeW1pbiwgeW1heCkpICtcbiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgICBcbiAgICAjIEFubm90YXRlIHAtdmFsdWUgdGV4dFxuICAgIGFubm90YXRlKFxuICAgICAgXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsXG4gICAgICBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSksXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gM1xuICAgICkgK1xuICAgIFxuICAgICMgVGhlbWUgY3VzdG9taXphdGlvblxuICB0aGVtZV9jbGFzc2ljKCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgKyBndWlkZXMoXG4gICAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKFxuICAgICAgICBrZXl3aWR0aCA9IDAuMiwgICMgQWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgbGVnZW5kIGtleXNcbiAgICAgICAga2V5aGVpZ2h0ID0gMC4yICAjIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWdlbmQga2V5c1xuICAgICAgKSlcbiAgXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2l6ZV9vZl9ib3VuZGFyeV9cXCwgbm90ZSlcbiAgd2lkdGggPC0gcGFuZWxTaXplKDEuNTUpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxucGxvdF9UQURzaXplKGdlbmUuVFNTLnRiLnBsb3QsIFxcZ3JvdXBfYmluYXJ5R3JvdXBcXCwgeW1heCA9IDNlNilcbmBgYFxuYGBgIn0= -->

```r
```r
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.TSS.tb.plot <- gene.TSS.tb %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\, NA))) %>% 
  dplyr::filter(!is.na(group))


## Plot distance
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$distance
  distance2 <- (data %>% dplyr::filter(group == group2) )$distance
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_TADdistance <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = \.\, fill = group, y = distance)) +
    # Set axis labels (no x-axis title)
    scale_fill_manual(values = ((c(\#777777\, \#F28E2C\)))) +
    labs(x = NULL, y = \Distance from TAD boundary\) +
    # Violin plot with black outline, customized line width and end
    introdataviz::geom_split_violin(
     color = \black\, alpha = 0.4,
      linewidth = lineMedium * mmToLineUnit, lineend = \square\
    ) +
    # Box plot with customized line width, square end, and outlier size
    geom_boxplot(
      width = 0.3, color = \black\, alpha = 0.6,
      linewidth = lineMedium * mmToLineUnit, lineend = \square\,
      outlier.shape = NA,  alpha = 0.6, show.legend = FALSE
    ) +
    
    # Mean point in each group
    stat_summary(
      aes(group = group), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) +
    
    # Horizontal line at y = 0
    geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
    
    # Coordinate limits and custom y-axis labels
    coord_cartesian(ylim = c(ymin, ymax)) +
    scale_y_continuous(labels = label_kb_mb) +
    
    # Annotate p-value text
    annotate(
      \text\, x = 1, y = ymin + 1,
      label = paste0(\p12: \, convPvalue(p12)),
      color = \black\, hjust = 0, size = 3
    ) +
    
    # Theme customization
    theme_classic() +
    theme(
      axis.title = element_text(
        size = fontSizeM, family = fontType, color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS, family = fontType, color = \#000000\
      ),
      axis.text.x = element_text(
        angle = 45, hjust = 1, vjust = 1
      ),
      axis.line = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
      legend.text = element_text(family = fontType, size = fontSizeS),
      legend.title = element_text(family = fontType, size = fontSizeS)) +
    guides(
      fill = guide_legend(
        keywidth = 0.2,  # Adjust the width of the legend keys
        keyheight = 0.2  # Adjust the height of the legend keys
      )
    )
  
  
  fileName <- paste0(\distance_to_boundary_\, note)
  width <- panelSize(1.55)*mmToInch
  height <- panelSize(1.2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

plot_TADdistance(gene.TSS.tb.plot, \group_binayGroup\, ymax = 1000000)


## Plot TAD size
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$TADsize
  distance2 <- (data %>% dplyr::filter(group == group2) )$TADsize
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_TADsize <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = \.\, fill = group, y = TADsize)) +
    # Set axis labels (no x-axis title)
    labs(x = NULL, y = \Size of TAD\) +
        scale_fill_manual(values = ((c(\#777777\, \#F28E2C\)))) +

    # Violin plot with black outline, customized line width and end
    introdataviz::geom_split_violin(
      color = \black\,
      linewidth = lineMedium* mmToLineUnit, lineend = \square\, alpha = .4
    ) +
    
    # Box plot with customized line width, square end, and outlier size
    geom_boxplot(
      width = 0.3, color = \black\,
      linewidth = lineMedium* mmToLineUnit, lineend = \square\,
      outlier.shape = NA,  alpha = 0.6, show.legend = FALSE
    ) +
    
    # Mean point in each group
    stat_summary(
      aes(group = group), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) +
    
    # Horizontal line at y = 0
    geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
    
    # Coordinate limits and custom y-axis labels
    coord_cartesian(ylim = c(ymin, ymax)) +
    scale_y_continuous(labels = label_kb_mb) +
    
    # Annotate p-value text
    annotate(
      \text\, x = 1, y = ymin + 1,
      label = paste0(\p12: \, convPvalue(p12)),
      color = \black\, hjust = 0, size = 3
    ) +
    
    # Theme customization
  theme_classic() +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) + guides(
      fill = guide_legend(
        keywidth = 0.2,  # Adjust the width of the legend keys
        keyheight = 0.2  # Adjust the height of the legend keys
      ))
  
  
  
  fileName <- paste0(\size_of_boundary_\, note)
  width <- panelSize(1.55)*mmToInch
  height <- panelSize(1.2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_TADsize(gene.TSS.tb.plot, \group_binaryGroup\, ymax = 3e6)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## [2.15] TAD distance/size
#### Link TAD

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RFdWRITjJYQ0lwS1NSblpXNWxYRzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd01pNTBjM1pjSWlrcEpHZGxibVZjYm1keWIzVndOU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSm5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQTFMblJ6ZGx3aUtTa2taMlZ1WlZ4dVozSnZkWEE0SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbWRsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjRGd1ZEhOMlhDSXBLU1JuWlc1bFhHNWNibHh1WjJWdVpTNVVVMU11ZEdJdWNHeHZkQ0E4TFNCblpXNWxMbFJUVXk1MFlpQWxQaVVnY205M2QybHpaU2dwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQm5jbTkxY0NBOUlHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdaM0p2ZFhBeExDQmNJbWR5YjNWd01Wd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aVzV6WlcxaWJDQWxhVzRsSUdkeWIzVndNaXdnWENKbmNtOTFjREpjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEExTENCY0ltZHliM1Z3TlZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEE0TENCY0ltZHliM1Z3T0Z3aUxDQk9RU2twS1NrcElDVStKU0JjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWdoYVhNdWJtRW9aM0p2ZFhBcEtWeHVYRzVjYmlNaklGQnNiM1FnWkdsemRHRnVZMlZjYm1kbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXhLU0FwSkdScGMzUmhibU5sWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQm5jbTkxY0RJcElDa2taR2x6ZEdGdVkyVmNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNWNibHh1Y0d4dmRGOVVRVVJrYVhOMFlXNWpaU0E4TFNCbWRXNWpkR2x2YmloMFpXMXdMblJpTENCdWIzUmxMQ0I1YldsdUlEMGdNQ3dnZVcxaGVDQTlJREl3TURBd01EQXBlMXh1SUNCd01USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLU3dnTlNsY2JpQWdjREUxSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYQ0puY205MWNERmNJaXdnWENKbmNtOTFjRFZjSWlrc0lEVXBYRzRnSUhBeE9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ3aVozSnZkWEF4WENJc0lGd2laM0p2ZFhBNFhDSXBMQ0ExS1Z4dUlDQndNalVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbWR5YjNWd01sd2lMQ0JjSW1keWIzVndOVndpS1N3Z05TbGNiaUFnY0RJNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWENKbmNtOTFjREpjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc0Z0lIQTFPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGd2laM0p2ZFhBMVhDSXNJRndpWjNKdmRYQTRYQ0lwTENBMUtWeHVJQ0JjYmlBZ2NDQThMU0JuWjNCc2IzUW9kR1Z0Y0M1MFlpd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJR1JwYzNSaGJtTmxLU2tnS3lCblpXOXRYM1pwYjJ4cGJpaGhaWE1vWm1sc2JDQTlJR2R5YjNWd0tTd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnS3lCY2JpQWdJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnSzF4dUlDQWdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNJbkJ2YVc1MFhDSXNJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWENKeVpXUmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwSUN0Y2JpQWdJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJ6WTJGc1pWOTVYMk52Ym5ScGJuVnZkWE1vYkdGaVpXeHpJRDBnYkdGaVpXeGZhMkpmYldJcElDdGNiaUFnSUNCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQW9lVzFwYmlBcklIbHRZWGdwTHpJZ0t5QXhMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkF4TWpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0RFeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNERTFPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNVFVwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3TVRnNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeE9Da3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQXlOVG9nWENJc0lHTnZiblpRZG1Gc2RXVW9jREkxS1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0RJNE9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod01qZ3BMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndOVGc2SUZ3aUxHTnZiblpRZG1Gc2RXVW9JSEExT0Nrc0lGd2lYRnh1WENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektWeHVJQ0JjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW1ScGMzUmhibU5sWDNSdlgySnZkVzVrWVhKNVgxd2lMQ0J1YjNSbEtWeHVJQ0JvWldsbmFIUWdQQzBnTTF4dUlDQjNhV1IwYUNBOExTQXpYRzRnSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzU5WEc1Y2JuQnNiM1JmVkVGRVpHbHpkR0Z1WTJVb1oyVnVaUzVVVTFNdWRHSXVjR3h2ZEN3Z1hDSm5jbTkxY0Z3aUtWeHVYRzVjYmlNaklGQnNiM1FnVkVGRUlITnBlbVZjYm1kbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXhLU0FwSkZSQlJITnBlbVZjYmlBZ1pHbHpkR0Z1WTJVeUlEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlHZHliM1Z3TWlrZ0tTUlVRVVJ6YVhwbFhHNGdJSGRwYkNBOExTQjNhV3hqYjNndWRHVnpkQ2hrYVhOMFlXNWpaVEVzSUdScGMzUmhibU5sTWlsY2JpQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1ZlZ4dVhHNWNibkJzYjNSZlZFRkVjMmw2WlNBOExTQm1kVzVqZEdsdmJpaDBaVzF3TG5SaUxDQnViM1JsTENCNWJXbHVJRDBnTUN3Z2VXMWhlQ0E5SURJd01EQXdNREFwZTF4dUlDQndNVElnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbWR5YjNWd01Wd2lMQ0JjSW1keWIzVndNbHdpS1N3Z05TbGNiaUFnY0RFMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWENKbmNtOTFjREZjSWl3Z1hDSm5jbTkxY0RWY0lpa3NJRFVwWEc0Z0lIQXhPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGd2laM0p2ZFhBeFhDSXNJRndpWjNKdmRYQTRYQ0lwTENBMUtWeHVJQ0J3TWpVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3TlZ3aUtTd2dOU2xjYmlBZ2NESTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hDSm5jbTkxY0RKY0lpd2dYQ0puY205MWNEaGNJaWtzSURVcFhHNGdJSEExT0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRndpWjNKdmRYQTFYQ0lzSUZ3aVozSnZkWEE0WENJcExDQTFLVnh1SUNCY2JpQWdjQ0E4TFNCblozQnNiM1FvZEdWdGNDNTBZaXdnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUZSQlJITnBlbVVwS1NBcklHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnWjNKdmRYQXBMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBcklGeHVJQ0FnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBclhHNGdJQ0FnYzNSaGRGOXpkVzF0WVhKNUtHRmxjeWhuY205MWNDQTlJR2R5YjNWd0tTd2dablZ1SUQwZ2JXVmhiaXdnWjJWdmJTQTlJRndpY0c5cGJuUmNJaXdnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURJc0lHWnBiR3dnUFNCY0luSmxaRndpTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWlrZ0sxeHVJQ0FnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUhOallXeGxYM2xmWTI5dWRHbHVkVzkxY3loc1lXSmxiSE1nUFNCc1lXSmxiRjlyWWw5dFlpa2dLMXh1SUNBZ0lHRnVibTkwWVhSbEtGd2lkR1Y0ZEZ3aUxDQjRJRDBnTVN3Z2VTQTlJQ2g1YldsdUlDc2dlVzFoZUNrdk1pQXJJREVzSUd4aFltVnNJRDBnY0dGemRHVXdLRndpY0RFeU9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod01USXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndNVFU2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEF4TlNrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5BeE9Eb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NERTRLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljREkxT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3TWpVcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd01qZzZJRndpTENCamIyNTJVSFpoYkhWbEtIQXlPQ2tzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkExT0RvZ1hDSXNZMjl1ZGxCMllXeDFaU2dnY0RVNEtTd2dYQ0pjWEc1Y0lpa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBYRzRnSUZ4dUlDQmNiaUFnWm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWMybDZaVjl2Wmw5aWIzVnVaR0Z5ZVY5Y0lpd2dibTkwWlNsY2JpQWdhR1ZwWjJoMElEd3RJRE5jYmlBZ2QybGtkR2dnUEMwZ00xeHVJQ0J3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dUlDQnpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVmVnh1Y0d4dmRGOVVRVVJ6YVhwbEtHZGxibVV1VkZOVExuUmlMbkJzYjNRc0lGd2laM0p2ZFhCY0lpd2dlVzFoZUNBOUlEWmxOaWxjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDIudHN2XFwpKSRnZW5lXG5ncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwNS50c3ZcXCkpJGdlbmVcbmdyb3VwOCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA4LnRzdlxcKSkkZ2VuZVxuXG5cbmdlbmUuVFNTLnRiLnBsb3QgPC0gZ2VuZS5UU1MudGIgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwNSwgXFxncm91cDVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwOCwgXFxncm91cDhcXCwgTkEpKSkpKSAlPiUgXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuXG4jIyBQbG90IGRpc3RhbmNlXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRkaXN0YW5jZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJGRpc3RhbmNlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnBsb3RfVEFEZGlzdGFuY2UgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXtcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gIHAxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4gIHAyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwNTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaXN0YW5jZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNTogXFwsIGNvbnZQdmFsdWUocDE1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE4OiBcXCwgY29udlB2YWx1ZShwMTgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyODogXFwsIGNvbnZQdmFsdWUocDI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDU4OiBcXCxjb252UHZhbHVlKCBwNTgpLCBcXFxcblxcKSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxkaXN0YW5jZV90b19ib3VuZGFyeV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG5wbG90X1RBRGRpc3RhbmNlKGdlbmUuVFNTLnRiLnBsb3QsIFxcZ3JvdXBcXClcblxuXG4jIyBQbG90IFRBRCBzaXplXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRUQURzaXplXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkVEFEc2l6ZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X1RBRHNpemUgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXtcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gIHAxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4gIHAyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwNTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBUQURzaXplKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNTogXFwsIGNvbnZQdmFsdWUocDI1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHNpemVfb2ZfYm91bmRhcnlfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbnBsb3RfVEFEc2l6ZShnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwXFwsIHltYXggPSA2ZTYpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene


gene.TSS.tb.plot <- gene.TSS.tb %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\,
                        ifelse(ensembl %in% group5, \group5\,
                               ifelse(ensembl %in% group8, \group8\, NA))))) %>% 
  dplyr::filter(!is.na(group))


## Plot distance
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$distance
  distance2 <- (data %>% dplyr::filter(group == group2) )$distance
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_TADdistance <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = distance)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + scale_y_continuous(labels = label_kb_mb) +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\distance_to_boundary_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

plot_TADdistance(gene.TSS.tb.plot, \group\)


## Plot TAD size
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$TADsize
  distance2 <- (data %>% dplyr::filter(group == group2) )$TADsize
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_TADsize <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = TADsize)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + scale_y_continuous(labels = label_kb_mb) +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\size_of_boundary_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_TADsize(gene.TSS.tb.plot, \group\, ymax = 6e6)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjREV1ZEhOMlhGd3BLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3TWk1MGMzWmNYQ2twSkdkbGJtVmNibWR5YjNWd05TQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4blpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBMUxuUnpkbHhjS1Nra1oyVnVaVnh1WjNKdmRYQTRJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNEZ3VkSE4yWEZ3cEtTUm5aVzVsWEc1Y2JseHVaMlZ1WlM1VVUxTXVkR0l1Y0d4dmRDQThMU0JuWlc1bExsUlRVeTUwWWlBbFBpVWdjbTkzZDJselpTZ3BJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNCbmNtOTFjQ0E5SUdsbVpXeHpaU2hsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEF4TENCY1hHZHliM1Z3TVZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd01pd2dYRnhuY205MWNESmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnWjNKdmRYQTFMQ0JjWEdkeWIzVndOVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnWjNKdmRYQTRMQ0JjWEdkeWIzVndPRnhjTENCT1FTa3BLU2twSUNVK0pTQmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpZ2hhWE11Ym1Fb1ozSnZkWEFwS1Z4dVhHNWNiaU1qSUZCc2IzUWdaR2x6ZEdGdVkyVmNibWRsZEZCMllXeFhhV3hqYjNnZ1BDMGdablZ1WTNScGIyNG9aR0YwWVN3Z1ozSnZkWEF4TENCbmNtOTFjRElwZTF4dUlDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdaM0p2ZFhBeEtTQXBKR1JwYzNSaGJtTmxYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCbmNtOTFjRElwSUNra1pHbHpkR0Z1WTJWY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1Y2JseHVjR3h2ZEY5VVFVUmthWE4wWVc1alpTQThMU0JtZFc1amRHbHZiaWgwWlcxd0xuUmlMQ0J1YjNSbExDQjViV2x1SUQwZ01Dd2dlVzFoZUNBOUlESXdNREF3TURBcGUxeHVJQ0J3TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tTd2dOU2xjYmlBZ2NERTFJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNEVmNYQ2tzSURVcFhHNGdJSEF4T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRnhjWjNKdmRYQXhYRndzSUZ4Y1ozSnZkWEE0WEZ3cExDQTFLVnh1SUNCd01qVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hHZHliM1Z3TWx4Y0xDQmNYR2R5YjNWd05WeGNLU3dnTlNsY2JpQWdjREk0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYRnhuY205MWNESmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzRnSUhBMU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ4Y1ozSnZkWEExWEZ3c0lGeGNaM0p2ZFhBNFhGd3BMQ0ExS1Z4dUlDQmNiaUFnY0NBOExTQm5aM0JzYjNRb2RHVnRjQzUwWWl3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlHUnBjM1JoYm1ObEtTa2dLeUJuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlHZHliM1Z3S1N3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ0lDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLMXh1SUNBZ0lITjBZWFJmYzNWdGJXRnllU2hoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c0lHZGxiMjBnUFNCY1hIQnZhVzUwWEZ3c0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXlMQ0JtYVd4c0lEMGdYRnh5WldSY1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BJQ3RjYmlBZ0lDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QnpZMkZzWlY5NVgyTnZiblJwYm5WdmRYTW9iR0ZpWld4eklEMGdiR0ZpWld4ZmEySmZiV0lwSUN0Y2JpQWdJQ0JoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBb2VXMXBiaUFySUhsdFlYZ3BMeklnS3lBeExDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQXhNam9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jREV5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0RFMU9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod01UVXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdNVGc2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF4T0Nrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhBeU5Ub2dYRndzSUdOdmJuWlFkbUZzZFdVb2NESTFLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjREk0T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3TWpncExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d05UZzZJRnhjTEdOdmJuWlFkbUZzZFdVb0lIQTFPQ2tzSUZ4Y1hGeHVYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F6S1Z4dUlDQmNiaUFnWEc0Z0lHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYR1JwYzNSaGJtTmxYM1J2WDJKdmRXNWtZWEo1WDF4Y0xDQnViM1JsS1Z4dUlDQm9aV2xuYUhRZ1BDMGdNMXh1SUNCM2FXUjBhQ0E4TFNBelhHNGdJSEJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpQWdjSEpwYm5Rb2NDbGNiaUFnWkdWMkxtOW1aaWdwWEc0Z0lITjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNTlYRzVjYm5Cc2IzUmZWRUZFWkdsemRHRnVZMlVvWjJWdVpTNVVVMU11ZEdJdWNHeHZkQ3dnWEZ4bmNtOTFjRnhjS1Z4dVhHNWNiaU1qSUZCc2IzUWdWRUZFSUhOcGVtVmNibWRsZEZCMllXeFhhV3hqYjNnZ1BDMGdablZ1WTNScGIyNG9aR0YwWVN3Z1ozSnZkWEF4TENCbmNtOTFjRElwZTF4dUlDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdaM0p2ZFhBeEtTQXBKRlJCUkhOcGVtVmNiaUFnWkdsemRHRnVZMlV5SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SUdkeWIzVndNaWtnS1NSVVFVUnphWHBsWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WEc1Y2JuQnNiM1JmVkVGRWMybDZaU0E4TFNCbWRXNWpkR2x2YmloMFpXMXdMblJpTENCdWIzUmxMQ0I1YldsdUlEMGdNQ3dnZVcxaGVDQTlJREl3TURBd01EQXBlMXh1SUNCd01USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hHZHliM1Z3TVZ4Y0xDQmNYR2R5YjNWd01seGNLU3dnTlNsY2JpQWdjREUxSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYRnhuY205MWNERmNYQ3dnWEZ4bmNtOTFjRFZjWENrc0lEVXBYRzRnSUhBeE9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ4Y1ozSnZkWEF4WEZ3c0lGeGNaM0p2ZFhBNFhGd3BMQ0ExS1Z4dUlDQndNalVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndOVnhjS1N3Z05TbGNiaUFnY0RJNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWEZ4bmNtOTFjREpjWEN3Z1hGeG5jbTkxY0RoY1hDa3NJRFVwWEc0Z0lIQTFPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGeGNaM0p2ZFhBMVhGd3NJRnhjWjNKdmRYQTRYRndwTENBMUtWeHVJQ0JjYmlBZ2NDQThMU0JuWjNCc2IzUW9kR1Z0Y0M1MFlpd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJRlJCUkhOcGVtVXBLU0FySUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdaM0p2ZFhBcExDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FySUZ4dUlDQWdJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU1Td2diM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJLU0FyWEc0Z0lDQWdjM1JoZEY5emRXMXRZWEo1S0dGbGN5aG5jbTkxY0NBOUlHZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpd2daMlZ2YlNBOUlGeGNjRzlwYm5SY1hDd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJRElzSUdacGJHd2dQU0JjWEhKbFpGeGNMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ2tnSzF4dUlDQWdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJSE5qWVd4bFgzbGZZMjl1ZEdsdWRXOTFjeWhzWVdKbGJITWdQU0JzWVdKbGJGOXJZbDl0WWlrZ0sxeHVJQ0FnSUdGdWJtOTBZWFJsS0Z4Y2RHVjRkRnhjTENCNElEMGdNU3dnZVNBOUlDaDViV2x1SUNzZ2VXMWhlQ2t2TWlBcklERXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGeGNjREV5T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3TVRJcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d01UVTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQXhOU2tzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEF4T0RvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0RFNEtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NESTFPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdNalVwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3TWpnNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hBeU9Da3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQTFPRG9nWEZ3c1kyOXVkbEIyWVd4MVpTZ2djRFU0S1N3Z1hGeGNYRzVjWENrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzSUdocWRYTjBJRDBnTUN3Z2MybDZaU0E5SURNcFhHNGdJRnh1SUNCY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjYzJsNlpWOXZabDlpYjNWdVpHRnllVjljWEN3Z2JtOTBaU2xjYmlBZ2FHVnBaMmgwSUR3dElETmNiaUFnZDJsa2RHZ2dQQzBnTTF4dUlDQndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dWZWeHVjR3h2ZEY5VVFVUnphWHBsS0dkbGJtVXVWRk5UTG5SaUxuQnNiM1FzSUZ4Y1ozSnZkWEJjWEN3Z2VXMWhlQ0E5SURabE5pbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAyLnRzdlxcKSkkZ2VuZVxuZ3JvdXA1IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDUudHN2XFwpKSRnZW5lXG5ncm91cDggPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwOC50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLlRTUy50Yi5wbG90IDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAyLCBcXGdyb3VwMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDgsIFxcZ3JvdXA4XFwsIE5BKSkpKSkgJT4lIFxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cblxuIyMgUGxvdCBkaXN0YW5jZVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZGlzdGFuY2VcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRkaXN0YW5jZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X1RBRGRpc3RhbmNlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlzdGFuY2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTU6IFxcLCBjb252UHZhbHVlKHAxNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxODogXFwsIGNvbnZQdmFsdWUocDE4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI1OiBcXCwgY29udlB2YWx1ZShwMjUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjg6IFxcLCBjb252UHZhbHVlKHAyOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA1ODogXFwsY29udlB2YWx1ZSggcDU4KSwgXFxcXG5cXCksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZGlzdGFuY2VfdG9fYm91bmRhcnlfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cblxucGxvdF9UQURkaXN0YW5jZShnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwXFwpXG5cblxuIyMgUGxvdCBUQUQgc2l6ZVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkVEFEc2l6ZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJFRBRHNpemVcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9UQURzaXplIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gVEFEc2l6ZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNTogXFwsIGNvbnZQdmFsdWUocDE1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE4OiBcXCwgY29udlB2YWx1ZShwMTgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyODogXFwsIGNvbnZQdmFsdWUocDI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDU4OiBcXCxjb252UHZhbHVlKCBwNTgpLCBcXFxcblxcKSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzaXplX29mX2JvdW5kYXJ5X1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAzXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5wbG90X1RBRHNpemUoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cFxcLCB5bWF4ID0gNmU2KVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCkpJGdlbmVcbmdyb3VwNSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdlxcKSkkZ2VuZVxuZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpKSRnZW5lXG5cblxuZ2VuZS5UU1MudGIucGxvdCA8LSBnZW5lLlRTUy50YiAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAxLCBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMiwgXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA1LCBcXGdyb3VwNVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA4LCBcXGdyb3VwOFxcLCBOQSkpKSkpICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbiMjIFBsb3QgZGlzdGFuY2VcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGRpc3RhbmNlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZGlzdGFuY2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9UQURkaXN0YW5jZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4gIHAxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4gIHA1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IGRpc3RhbmNlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNTogXFwsIGNvbnZQdmFsdWUocDI1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGRpc3RhbmNlX3RvX2JvdW5kYXJ5X1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAzXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5cbnBsb3RfVEFEZGlzdGFuY2UoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cFxcKVxuXG5cbiMjIFBsb3QgVEFEIHNpemVcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJFRBRHNpemVcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRUQURzaXplXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnBsb3RfVEFEc2l6ZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4gIHAxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4gIHA1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IFRBRHNpemUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTU6IFxcLCBjb252UHZhbHVlKHAxNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxODogXFwsIGNvbnZQdmFsdWUocDE4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI1OiBcXCwgY29udlB2YWx1ZShwMjUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjg6IFxcLCBjb252UHZhbHVlKHAyOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA1ODogXFwsY29udlB2YWx1ZSggcDU4KSwgXFxcXG5cXCksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2l6ZV9vZl9ib3VuZGFyeV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxucGxvdF9UQURzaXplKGdlbmUuVFNTLnRiLnBsb3QsIFxcZ3JvdXBcXCwgeW1heCA9IDZlNilcbmBgYFxuYGBgIn0= -->

```r
```r
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene


gene.TSS.tb.plot <- gene.TSS.tb %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\,
                        ifelse(ensembl %in% group5, \group5\,
                               ifelse(ensembl %in% group8, \group8\, NA))))) %>% 
  dplyr::filter(!is.na(group))


## Plot distance
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$distance
  distance2 <- (data %>% dplyr::filter(group == group2) )$distance
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_TADdistance <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = distance)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + scale_y_continuous(labels = label_kb_mb) +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\distance_to_boundary_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

plot_TADdistance(gene.TSS.tb.plot, \group\)


## Plot TAD size
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$TADsize
  distance2 <- (data %>% dplyr::filter(group == group2) )$TADsize
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_TADsize <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = TADsize)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + scale_y_continuous(labels = label_kb_mb) +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\size_of_boundary_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_TADsize(gene.TSS.tb.plot, \group\, ymax = 6e6)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### dTAG - binaryGroup

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDBFME9EVmZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RFdWRITjJYQ0lwS1NSblpXNWxYRzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlFUUTROVjkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd01pNTBjM1pjSWlrcEpHZGxibVZjYm1keWIzVndNeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSm5aVzVsVEdsemRGOUJORGcxWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQXpMblJ6ZGx3aUtTa2taMlZ1WlZ4dVozSnZkWEEwSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbWRsYm1WTWFYTjBYMEUwT0RWZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjRFF1ZEhOMlhDSXBLU1JuWlc1bFhHNW5jbTkxY0RVZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmUVRRNE5WOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3TlM1MGMzWmNJaWtwSkdkbGJtVmNibWR5YjNWd05pQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKblpXNWxUR2x6ZEY5Qk5EZzFYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBMkxuUnpkbHdpS1Nra1oyVnVaVnh1WjNKdmRYQTNJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltZGxibVZNYVhOMFgwRTBPRFZmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNEY3VkSE4yWENJcEtTUm5aVzVsWEc1bmNtOTFjRGdnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laMlZ1WlV4cGMzUmZRVFE0TlY5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJkeWIzVndPQzUwYzNaY0lpa3BKR2RsYm1WY2JtZHliM1Z3T1NBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0puWlc1bFRHbHpkRjlCTkRnMVgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlozSnZkWEE1TG5SemRsd2lLU2trWjJWdVpWeHVYRzVjYm1kbGJtVXVWRk5UTG5SaUxuQnNiM1FnUEMwZ1oyVnVaUzVVVTFNdWRHSWdKVDRsWEc0Z0lISnZkM2RwYzJVb0tTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hjYmlBZ0lDQm5jbTkxY0NBOUlHUndiSGx5T2pwallYTmxYM2RvWlc0b1hHNGdJQ0FnSUNCbGJuTmxiV0pzSUNWcGJpVWdaM0p2ZFhBeElINGdYQ0puY205MWNERmNJaXhjYmlBZ0lDQWdJR1Z1YzJWdFltd2dKV2x1SlNCbmNtOTFjRElnZmlCY0ltZHliM1Z3TWx3aUxGeHVJQ0FnSUNBZ1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd015QitJRndpWjNKdmRYQXpYQ0lzWEc0Z0lDQWdJQ0JsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEEwSUg0Z1hDSm5jbTkxY0RSY0lpeGNiaUFnSUNBZ0lHVnVjMlZ0WW13Z0pXbHVKU0JuY205MWNEVWdmaUJjSW1keWIzVndOVndpTEZ4dUlDQWdJQ0FnWlc1elpXMWliQ0FsYVc0bElHZHliM1Z3TmlCK0lGd2laM0p2ZFhBMlhDSXNYRzRnSUNBZ0lDQmxibk5sYldKc0lDVnBiaVVnWjNKdmRYQTNJSDRnWENKbmNtOTFjRGRjSWl4Y2JpQWdJQ0FnSUdWdWMyVnRZbXdnSldsdUpTQm5jbTkxY0RnZ2ZpQmNJbWR5YjNWd09Gd2lMRnh1SUNBZ0lDQWdaVzV6WlcxaWJDQWxhVzRsSUdkeWIzVndPU0IrSUZ3aVozSnZkWEE1WENJc1hHNGdJQ0FnSUNCVVVsVkZJSDRnVGtGZlkyaGhjbUZqZEdWeVgxeHVJQ0FnSUNsY2JpQWdLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lnaGFYTXVibUVvWjNKdmRYQXBLVnh1WEc0akl5QlFiRzkwSUdScGMzUmhibU5sWEc0aklHZGxkRkIyWVd4WGFXeGpiM2dnUEMwZ1puVnVZM1JwYjI0b1pHRjBZU3dnWjNKdmRYQXhMQ0JuY205MWNESXBlMXh1SXlBZ0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQm5jbTkxY0RFcElDa2taR2x6ZEdGdVkyVmNiaU1nSUNCa2FYTjBZVzVqWlRJZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1ozSnZkWEF5S1NBcEpHUnBjM1JoYm1ObFhHNGpJQ0FnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJeUFnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JpTWdmVnh1WEc1Y2JuQnNiM1JmVkVGRVpHbHpkR0Z1WTJVZ1BDMGdablZ1WTNScGIyNG9kR1Z0Y0M1MFlpd2dibTkwWlN3Z2VXMXBiaUE5SURBc0lIbHRZWGdnUFNBeU1EQXdNREF3S1h0Y2JpQWdJeUJ3TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjSW1keWIzVndNVndpTENCY0ltZHliM1Z3TWx3aUtTd2dOU2xjYmlBZ0l5QndNVFVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbWR5YjNWd01Wd2lMQ0JjSW1keWIzVndOVndpS1N3Z05TbGNiaUFnSXlCd01UZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd09Gd2lLU3dnTlNsY2JpQWdJeUJ3TWpVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3TlZ3aUtTd2dOU2xjYmlBZ0l5QndNamdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbWR5YjNWd01sd2lMQ0JjSW1keWIzVndPRndpS1N3Z05TbGNiaUFnSXlCd05UZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0ltZHliM1Z3TlZ3aUxDQmNJbWR5YjNWd09Gd2lLU3dnTlNsY2JpQWdJeUJjYmlBZ2NDQThMU0JuWjNCc2IzUW9kR1Z0Y0M1MFlpd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJR1JwYzNSaGJtTmxLU2tnS3lCblpXOXRYM1pwYjJ4cGJpaGhaWE1vWm1sc2JDQTlJR2R5YjNWd0tTd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnS3lCY2JpQWdJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnSzF4dUlDQWdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNJbkJ2YVc1MFhDSXNJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWENKeVpXUmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwSUN0Y2JpQWdJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJ6WTJGc1pWOTVYMk52Ym5ScGJuVnZkWE1vYkdGaVpXeHpJRDBnYkdGaVpXeGZhMkpmYldJcFhHNGdJQ0FnSXlCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQW9lVzFwYmlBcklIbHRZWGdwTHpJZ0t5QXhMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkF4TWpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0RFeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndNVFU2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEF4TlNrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNERTRPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNVGdwTENCY0lseGNibHdpTEZ4dUlDQWdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5BeU5Ub2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NESTFLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3TWpnNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeU9Da3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljRFU0T2lCY0lpeGpiMjUyVUhaaGJIVmxLQ0J3TlRncExDQmNJbHhjYmx3aUtTeGNiaUFnSUNBaklDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXpLVnh1SUNCY2JpQWdYRzRnSUdacGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0ltUnBjM1JoYm1ObFgzUnZYMkp2ZFc1a1lYSjVYMXdpTENCdWIzUmxLVnh1SUNCb1pXbG5hSFFnUEMwZ00xeHVJQ0IzYVdSMGFDQThMU0F6WEc0Z0lIQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUhOMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpQWdjSEpwYm5Rb2NDbGNiaUFnWkdWMkxtOW1aaWdwWEc1OVhHNWNibkJzYjNSZlZFRkVaR2x6ZEdGdVkyVW9aMlZ1WlM1VVUxTXVkR0l1Y0d4dmRDd2dYQ0puY205MWNGOUJORGcxWENJcFhHNWNibHh1SXlNZ1VHeHZkQ0JVUVVRZ2MybDZaVnh1SXlCblpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaU1nSUNCa2FYTjBZVzVqWlRFZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1ozSnZkWEF4S1NBcEpGUkJSSE5wZW1WY2JpTWdJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXlLU0FwSkZSQlJITnBlbVZjYmlNZ0lDQjNhV3dnUEMwZ2QybHNZMjk0TG5SbGMzUW9aR2x6ZEdGdVkyVXhMQ0JrYVhOMFlXNWpaVElwWEc0aklDQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1SXlCOVhHNGpJRnh1WEc1d2JHOTBYMVJCUkhOcGVtVWdQQzBnWm5WdVkzUnBiMjRvZEdWdGNDNTBZaXdnYm05MFpTd2dlVzFwYmlBOUlEQXNJSGx0WVhnZ1BTQXlNREF3TURBd0tYdGNiaUFnSXlCd01USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLU3dnTlNsY2JpQWdJeUJ3TVRVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjSW1keWIzVndNVndpTENCY0ltZHliM1Z3TlZ3aUtTd2dOU2xjYmlBZ0l5QndNVGdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbWR5YjNWd01Wd2lMQ0JjSW1keWIzVndPRndpS1N3Z05TbGNiaUFnSXlCd01qVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0ltZHliM1Z3TWx3aUxDQmNJbWR5YjNWd05Wd2lLU3dnTlNsY2JpQWdJeUJ3TWpnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjSW1keWIzVndNbHdpTENCY0ltZHliM1Z3T0Z3aUtTd2dOU2xjYmlBZ0l5QndOVGdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbWR5YjNWd05Wd2lMQ0JjSW1keWIzVndPRndpS1N3Z05TbGNiaUFnWEc0Z0lIQWdQQzBnWjJkd2JHOTBLSFJsYlhBdWRHSXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JVUVVSemFYcGxLU2tnS3lCblpXOXRYM1pwYjJ4cGJpaGhaWE1vWm1sc2JDQTlJR2R5YjNWd0tTd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnS3lCY2JpQWdJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnSzF4dUlDQWdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNJbkJ2YVc1MFhDSXNJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWENKeVpXUmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwSUN0Y2JpQWdJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJ6WTJGc1pWOTVYMk52Ym5ScGJuVnZkWE1vYkdGaVpXeHpJRDBnYkdGaVpXeGZhMkpmYldJcElGeHVJQ0FnSUNNZ1lXNXViM1JoZEdVb1hDSjBaWGgwWENJc0lIZ2dQU0F4TENCNUlEMGdLSGx0YVc0Z0t5QjViV0Y0S1M4eUlDc2dNU3dnYkdGaVpXd2dQU0J3WVhOMFpUQW9YQ0p3TVRJNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeE1pa3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljREUxT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3TVRVcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQXhPRG9nWENJc0lHTnZiblpRZG1Gc2RXVW9jREU0S1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd01qVTZJRndpTENCamIyNTJVSFpoYkhWbEtIQXlOU2tzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0RJNE9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod01qZ3BMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkExT0RvZ1hDSXNZMjl1ZGxCMllXeDFaU2dnY0RVNEtTd2dYQ0pjWEc1Y0lpa3NYRzRnSUNBZ0l5QWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNeWxjYmlBZ1hHNGdJRnh1SUNCbWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSnphWHBsWDI5bVgySnZkVzVrWVhKNVgxd2lMQ0J1YjNSbEtWeHVJQ0JvWldsbmFIUWdQQzBnTTF4dUlDQjNhV1IwYUNBOExTQXpYRzRnSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzU5WEc1d2JHOTBYMVJCUkhOcGVtVW9aMlZ1WlM1VVUxTXVkR0l1Y0d4dmRDd2dYQ0puY205MWNGOUJORGcxWENJc0lIbHRZWGdnUFNBMlpUWXBYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDIudHN2XFwpKSRnZW5lXG5ncm91cDMgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwMy50c3ZcXCkpJGdlbmVcbmdyb3VwNCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA0LnRzdlxcKSkkZ2VuZVxuZ3JvdXA1IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDUudHN2XFwpKSRnZW5lXG5ncm91cDYgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNi50c3ZcXCkpJGdlbmVcbmdyb3VwNyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA3LnRzdlxcKSkkZ2VuZVxuZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpKSRnZW5lXG5ncm91cDkgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwOS50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLlRTUy50Yi5wbG90IDwtIGdlbmUuVFNTLnRiICU+JVxuICByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3JvdXAgPSBkcGx5cjo6Y2FzZV93aGVuKFxuICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwMSB+IFxcZ3JvdXAxXFwsXG4gICAgICBlbnNlbWJsICVpbiUgZ3JvdXAyIH4gXFxncm91cDJcXCxcbiAgICAgIGVuc2VtYmwgJWluJSBncm91cDMgfiBcXGdyb3VwM1xcLFxuICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwNCB+IFxcZ3JvdXA0XFwsXG4gICAgICBlbnNlbWJsICVpbiUgZ3JvdXA1IH4gXFxncm91cDVcXCxcbiAgICAgIGVuc2VtYmwgJWluJSBncm91cDYgfiBcXGdyb3VwNlxcLFxuICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwNyB+IFxcZ3JvdXA3XFwsXG4gICAgICBlbnNlbWJsICVpbiUgZ3JvdXA4IH4gXFxncm91cDhcXCxcbiAgICAgIGVuc2VtYmwgJWluJSBncm91cDkgfiBcXGdyb3VwOVxcLFxuICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl9cbiAgICApXG4gICkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuIyMgUGxvdCBkaXN0YW5jZVxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGRpc3RhbmNlXG4jICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRkaXN0YW5jZVxuIyAgIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiMgICByZXR1cm4od2lsJHAudmFsdWUpXG4jIH1cblxuXG5wbG90X1RBRGRpc3RhbmNlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gICMgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gICMgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4gICMgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gICMgcDI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4gICMgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4gICMgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gICMgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaXN0YW5jZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKVxuICAgICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxODogXFwsIGNvbnZQdmFsdWUocDE4KSwgXFxcXG5cXCxcbiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA1ODogXFwsY29udlB2YWx1ZSggcDU4KSwgXFxcXG5cXCksXG4gICAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxkaXN0YW5jZV90b19ib3VuZGFyeV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG5wbG90X1RBRGRpc3RhbmNlKGdlbmUuVFNTLnRiLnBsb3QsIFxcZ3JvdXBfQTQ4NVxcKVxuXG5cbiMjIFBsb3QgVEFEIHNpemVcbiMgZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4jICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRUQURzaXplXG4jICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRUQURzaXplXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcblxucGxvdF9UQURzaXplIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gICMgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gICMgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4gICMgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gICMgcDI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4gICMgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4gICMgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gVEFEc2l6ZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSBcbiAgICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNTogXFwsIGNvbnZQdmFsdWUocDE1KSwgXFxcXG5cXCxcbiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI1OiBcXCwgY29udlB2YWx1ZShwMjUpLCBcXFxcblxcLFxuICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyODogXFwsIGNvbnZQdmFsdWUocDI4KSwgXFxcXG5cXCxcbiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2l6ZV9vZl9ib3VuZGFyeV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxucGxvdF9UQURzaXplKGdlbmUuVFNTLnRiLnBsb3QsIFxcZ3JvdXBfQTQ4NVxcLCB5bWF4ID0gNmU2KVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
group1 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group2.tsv\))$gene
group3 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group3.tsv\))$gene
group4 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group4.tsv\))$gene
group5 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group5.tsv\))$gene
group6 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group6.tsv\))$gene
group7 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group7.tsv\))$gene
group8 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group8.tsv\))$gene
group9 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group9.tsv\))$gene


gene.TSS.tb.plot <- gene.TSS.tb %>%
  rowwise() %>%
  dplyr::mutate(
    group = dplyr::case_when(
      ensembl %in% group1 ~ \group1\,
      ensembl %in% group2 ~ \group2\,
      ensembl %in% group3 ~ \group3\,
      ensembl %in% group4 ~ \group4\,
      ensembl %in% group5 ~ \group5\,
      ensembl %in% group6 ~ \group6\,
      ensembl %in% group7 ~ \group7\,
      ensembl %in% group8 ~ \group8\,
      ensembl %in% group9 ~ \group9\,
      TRUE ~ NA_character_
    )
  ) %>%
  dplyr::filter(!is.na(group))

## Plot distance
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(group == group1) )$distance
#   distance2 <- (data %>% dplyr::filter(group == group2) )$distance
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }


plot_TADdistance <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  # p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  # p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  # p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  # p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  # p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  # p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  # 
  p <- ggplot(temp.tb, aes(x = group, y = distance)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + scale_y_continuous(labels = label_kb_mb)
    # annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
    #                                                      \p15: \, convPvalue(p15), \\n\,
    #                                                      \p18: \, convPvalue(p18), \\n\,
    #                                                      \p25: \, convPvalue(p25), \\n\,
    #                                                      \p28: \, convPvalue(p28), \\n\,
    #                                                      \p58: \,convPvalue( p58), \\n\),
    #          color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\distance_to_boundary_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

plot_TADdistance(gene.TSS.tb.plot, \group_A485\)


## Plot TAD size
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(group == group1) )$TADsize
#   distance2 <- (data %>% dplyr::filter(group == group2) )$TADsize
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 

plot_TADsize <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  # p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  # p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  # p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  # p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  # p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  # p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = TADsize)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + scale_y_continuous(labels = label_kb_mb) 
    # annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
    #                                                      \p15: \, convPvalue(p15), \\n\,
    #                                                      \p18: \, convPvalue(p18), \\n\,
    #                                                      \p25: \, convPvalue(p25), \\n\,
    #                                                      \p28: \, convPvalue(p28), \\n\,
    #                                                      \p58: \,convPvalue( p58), \\n\),
    #          color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\size_of_boundary_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_TADsize(gene.TSS.tb.plot, \group_A485\, ymax = 6e6)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMEUwT0RWZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjREV1ZEhOMlhGd3BLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmUVRRNE5WOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3TWk1MGMzWmNYQ2twSkdkbGJtVmNibWR5YjNWd015QThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4blpXNWxUR2x6ZEY5Qk5EZzFYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBekxuUnpkbHhjS1Nra1oyVnVaVnh1WjNKdmRYQTBJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHZGxibVZNYVhOMFgwRTBPRFZmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNEUXVkSE4yWEZ3cEtTUm5aVzVsWEc1bmNtOTFjRFVnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZRVFE0TlY5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJkeWIzVndOUzUwYzNaY1hDa3BKR2RsYm1WY2JtZHliM1Z3TmlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhuWlc1bFRHbHpkRjlCTkRnMVgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlozSnZkWEEyTG5SemRseGNLU2trWjJWdVpWeHVaM0p2ZFhBM0lEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdkbGJtVk1hWE4wWDBFME9EVmZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RjdWRITjJYRndwS1NSblpXNWxYRzVuY205MWNEZ2dQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1oyVnVaVXhwYzNSZlFUUTROVjkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd09DNTBjM1pjWENrcEpHZGxibVZjYm1keWIzVndPU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeG5aVzVsVEdsemRGOUJORGcxWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQTVMblJ6ZGx4Y0tTa2taMlZ1WlZ4dVhHNWNibWRsYm1VdVZGTlRMblJpTG5Cc2IzUWdQQzBnWjJWdVpTNVVVMU11ZEdJZ0pUNGxYRzRnSUhKdmQzZHBjMlVvS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnSUNCbmNtOTFjQ0E5SUdSd2JIbHlPanBqWVhObFgzZG9aVzRvWEc0Z0lDQWdJQ0JsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEF4SUg0Z1hGeG5jbTkxY0RGY1hDeGNiaUFnSUNBZ0lHVnVjMlZ0WW13Z0pXbHVKU0JuY205MWNESWdmaUJjWEdkeWIzVndNbHhjTEZ4dUlDQWdJQ0FnWlc1elpXMWliQ0FsYVc0bElHZHliM1Z3TXlCK0lGeGNaM0p2ZFhBelhGd3NYRzRnSUNBZ0lDQmxibk5sYldKc0lDVnBiaVVnWjNKdmRYQTBJSDRnWEZ4bmNtOTFjRFJjWEN4Y2JpQWdJQ0FnSUdWdWMyVnRZbXdnSldsdUpTQm5jbTkxY0RVZ2ZpQmNYR2R5YjNWd05WeGNMRnh1SUNBZ0lDQWdaVzV6WlcxaWJDQWxhVzRsSUdkeWIzVndOaUIrSUZ4Y1ozSnZkWEEyWEZ3c1hHNGdJQ0FnSUNCbGJuTmxiV0pzSUNWcGJpVWdaM0p2ZFhBM0lINGdYRnhuY205MWNEZGNYQ3hjYmlBZ0lDQWdJR1Z1YzJWdFltd2dKV2x1SlNCbmNtOTFjRGdnZmlCY1hHZHliM1Z3T0Z4Y0xGeHVJQ0FnSUNBZ1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd09TQitJRnhjWjNKdmRYQTVYRndzWEc0Z0lDQWdJQ0JVVWxWRklINGdUa0ZmWTJoaGNtRmpkR1Z5WDF4dUlDQWdJQ2xjYmlBZ0tTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWdoYVhNdWJtRW9aM0p2ZFhBcEtWeHVYRzRqSXlCUWJHOTBJR1JwYzNSaGJtTmxYRzRqSUdkbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJeUFnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCbmNtOTFjREVwSUNra1pHbHpkR0Z1WTJWY2JpTWdJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXlLU0FwSkdScGMzUmhibU5sWEc0aklDQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUl5QWdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYmlNZ2ZWeHVYRzVjYm5Cc2IzUmZWRUZFWkdsemRHRnVZMlVnUEMwZ1puVnVZM1JwYjI0b2RHVnRjQzUwWWl3Z2JtOTBaU3dnZVcxcGJpQTlJREFzSUhsdFlYZ2dQU0F5TURBd01EQXdLWHRjYmlBZ0l5QndNVElnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNYR2R5YjNWd01WeGNMQ0JjWEdkeWIzVndNbHhjS1N3Z05TbGNiaUFnSXlCd01UVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hHZHliM1Z3TVZ4Y0xDQmNYR2R5YjNWd05WeGNLU3dnTlNsY2JpQWdJeUJ3TVRnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3T0Z4Y0tTd2dOU2xjYmlBZ0l5QndNalVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndOVnhjS1N3Z05TbGNiaUFnSXlCd01qZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hHZHliM1Z3TWx4Y0xDQmNYR2R5YjNWd09GeGNLU3dnTlNsY2JpQWdJeUJ3TlRnZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEdkeWIzVndOVnhjTENCY1hHZHliM1Z3T0Z4Y0tTd2dOU2xjYmlBZ0l5QmNiaUFnY0NBOExTQm5aM0JzYjNRb2RHVnRjQzUwWWl3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlHUnBjM1JoYm1ObEtTa2dLeUJuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlHZHliM1Z3S1N3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ0lDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLMXh1SUNBZ0lITjBZWFJmYzNWdGJXRnllU2hoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c0lHZGxiMjBnUFNCY1hIQnZhVzUwWEZ3c0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXlMQ0JtYVd4c0lEMGdYRnh5WldSY1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BJQ3RjYmlBZ0lDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QnpZMkZzWlY5NVgyTnZiblJwYm5WdmRYTW9iR0ZpWld4eklEMGdiR0ZpWld4ZmEySmZiV0lwWEc0Z0lDQWdJeUJoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBb2VXMXBiaUFySUhsdFlYZ3BMeklnS3lBeExDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQXhNam9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jREV5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d01UVTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQXhOU2tzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0RFNE9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod01UZ3BMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEF5TlRvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0RJMUtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdNamc2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF5T0Nrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NEVTRPaUJjWEN4amIyNTJVSFpoYkhWbEtDQndOVGdwTENCY1hGeGNibHhjS1N4Y2JpQWdJQ0FqSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektWeHVJQ0JjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEdScGMzUmhibU5sWDNSdlgySnZkVzVrWVhKNVgxeGNMQ0J1YjNSbEtWeHVJQ0JvWldsbmFIUWdQQzBnTTF4dUlDQjNhV1IwYUNBOExTQXpYRzRnSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzU5WEc1Y2JuQnNiM1JmVkVGRVpHbHpkR0Z1WTJVb1oyVnVaUzVVVTFNdWRHSXVjR3h2ZEN3Z1hGeG5jbTkxY0Y5Qk5EZzFYRndwWEc1Y2JseHVJeU1nVUd4dmRDQlVRVVFnYzJsNlpWeHVJeUJuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpTWdJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXhLU0FwSkZSQlJITnBlbVZjYmlNZ0lDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdaM0p2ZFhBeUtTQXBKRlJCUkhOcGVtVmNiaU1nSUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRqSUNBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVJeUI5WEc0aklGeHVYRzV3Ykc5MFgxUkJSSE5wZW1VZ1BDMGdablZ1WTNScGIyNG9kR1Z0Y0M1MFlpd2dibTkwWlN3Z2VXMXBiaUE5SURBc0lIbHRZWGdnUFNBeU1EQXdNREF3S1h0Y2JpQWdJeUJ3TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tTd2dOU2xjYmlBZ0l5QndNVFVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNYR2R5YjNWd01WeGNMQ0JjWEdkeWIzVndOVnhjS1N3Z05TbGNiaUFnSXlCd01UZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hHZHliM1Z3TVZ4Y0xDQmNYR2R5YjNWd09GeGNLU3dnTlNsY2JpQWdJeUJ3TWpVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEdkeWIzVndNbHhjTENCY1hHZHliM1Z3TlZ4Y0tTd2dOU2xjYmlBZ0l5QndNamdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNYR2R5YjNWd01seGNMQ0JjWEdkeWIzVndPRnhjS1N3Z05TbGNiaUFnSXlCd05UZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hHZHliM1Z3TlZ4Y0xDQmNYR2R5YjNWd09GeGNLU3dnTlNsY2JpQWdYRzRnSUhBZ1BDMGdaMmR3Ykc5MEtIUmxiWEF1ZEdJc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQlVRVVJ6YVhwbEtTa2dLeUJuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlHZHliM1Z3S1N3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ0lDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLMXh1SUNBZ0lITjBZWFJmYzNWdGJXRnllU2hoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c0lHZGxiMjBnUFNCY1hIQnZhVzUwWEZ3c0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXlMQ0JtYVd4c0lEMGdYRnh5WldSY1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BJQ3RjYmlBZ0lDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QnpZMkZzWlY5NVgyTnZiblJwYm5WdmRYTW9iR0ZpWld4eklEMGdiR0ZpWld4ZmEySmZiV0lwSUZ4dUlDQWdJQ01nWVc1dWIzUmhkR1VvWEZ4MFpYaDBYRndzSUhnZ1BTQXhMQ0I1SUQwZ0tIbHRhVzRnS3lCNWJXRjRLUzh5SUNzZ01Td2diR0ZpWld3Z1BTQndZWE4wWlRBb1hGeHdNVEk2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF4TWlrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NERTFPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdNVFVwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhBeE9Eb2dYRndzSUdOdmJuWlFkbUZzZFdVb2NERTRLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3TWpVNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hBeU5Ta3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjREk0T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3TWpncExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQTFPRG9nWEZ3c1kyOXVkbEIyWVd4MVpTZ2djRFU0S1N3Z1hGeGNYRzVjWENrc1hHNGdJQ0FnSXlBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ015bGNiaUFnWEc0Z0lGeHVJQ0JtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4emFYcGxYMjltWDJKdmRXNWtZWEo1WDF4Y0xDQnViM1JsS1Z4dUlDQm9aV2xuYUhRZ1BDMGdNMXh1SUNCM2FXUjBhQ0E4TFNBelhHNGdJSEJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpQWdjSEpwYm5Rb2NDbGNiaUFnWkdWMkxtOW1aaWdwWEc0Z0lITjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNTlYRzV3Ykc5MFgxUkJSSE5wZW1Vb1oyVnVaUzVVVTFNdWRHSXVjR3h2ZEN3Z1hGeG5jbTkxY0Y5Qk5EZzFYRndzSUhsdFlYZ2dQU0EyWlRZcFhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDIudHN2XFwpKSRnZW5lXG5ncm91cDMgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwMy50c3ZcXCkpJGdlbmVcbmdyb3VwNCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA0LnRzdlxcKSkkZ2VuZVxuZ3JvdXA1IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDUudHN2XFwpKSRnZW5lXG5ncm91cDYgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNi50c3ZcXCkpJGdlbmVcbmdyb3VwNyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA3LnRzdlxcKSkkZ2VuZVxuZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpKSRnZW5lXG5ncm91cDkgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwOS50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLlRTUy50Yi5wbG90IDwtIGdlbmUuVFNTLnRiICU+JVxuICByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3JvdXAgPSBkcGx5cjo6Y2FzZV93aGVuKFxuICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwMSB+IFxcZ3JvdXAxXFwsXG4gICAgICBlbnNlbWJsICVpbiUgZ3JvdXAyIH4gXFxncm91cDJcXCxcbiAgICAgIGVuc2VtYmwgJWluJSBncm91cDMgfiBcXGdyb3VwM1xcLFxuICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwNCB+IFxcZ3JvdXA0XFwsXG4gICAgICBlbnNlbWJsICVpbiUgZ3JvdXA1IH4gXFxncm91cDVcXCxcbiAgICAgIGVuc2VtYmwgJWluJSBncm91cDYgfiBcXGdyb3VwNlxcLFxuICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwNyB+IFxcZ3JvdXA3XFwsXG4gICAgICBlbnNlbWJsICVpbiUgZ3JvdXA4IH4gXFxncm91cDhcXCxcbiAgICAgIGVuc2VtYmwgJWluJSBncm91cDkgfiBcXGdyb3VwOVxcLFxuICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl9cbiAgICApXG4gICkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuIyMgUGxvdCBkaXN0YW5jZVxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGRpc3RhbmNlXG4jICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRkaXN0YW5jZVxuIyAgIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiMgICByZXR1cm4od2lsJHAudmFsdWUpXG4jIH1cblxuXG5wbG90X1RBRGRpc3RhbmNlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gICMgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gICMgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4gICMgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gICMgcDI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4gICMgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4gICMgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gICMgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaXN0YW5jZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKVxuICAgICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxODogXFwsIGNvbnZQdmFsdWUocDE4KSwgXFxcXG5cXCxcbiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA1ODogXFwsY29udlB2YWx1ZSggcDU4KSwgXFxcXG5cXCksXG4gICAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxkaXN0YW5jZV90b19ib3VuZGFyeV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG5wbG90X1RBRGRpc3RhbmNlKGdlbmUuVFNTLnRiLnBsb3QsIFxcZ3JvdXBfQTQ4NVxcKVxuXG5cbiMjIFBsb3QgVEFEIHNpemVcbiMgZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4jICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRUQURzaXplXG4jICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRUQURzaXplXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBcblxucGxvdF9UQURzaXplIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gICMgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gICMgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4gICMgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gICMgcDI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4gICMgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4gICMgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gVEFEc2l6ZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSBcbiAgICAjIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNTogXFwsIGNvbnZQdmFsdWUocDE1KSwgXFxcXG5cXCxcbiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI1OiBcXCwgY29udlB2YWx1ZShwMjUpLCBcXFxcblxcLFxuICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyODogXFwsIGNvbnZQdmFsdWUocDI4KSwgXFxcXG5cXCxcbiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICMgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2l6ZV9vZl9ib3VuZGFyeV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxucGxvdF9UQURzaXplKGdlbmUuVFNTLnRiLnBsb3QsIFxcZ3JvdXBfQTQ4NVxcLCB5bWF4ID0gNmU2KVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCkpJGdlbmVcbmdyb3VwMyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAzLnRzdlxcKSkkZ2VuZVxuZ3JvdXA0IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDQudHN2XFwpKSRnZW5lXG5ncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNS50c3ZcXCkpJGdlbmVcbmdyb3VwNiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA2LnRzdlxcKSkkZ2VuZVxuZ3JvdXA3IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDcudHN2XFwpKSRnZW5lXG5ncm91cDggPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwOC50c3ZcXCkpJGdlbmVcbmdyb3VwOSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA5LnRzdlxcKSkkZ2VuZVxuXG5cbmdlbmUuVFNTLnRiLnBsb3QgPC0gZ2VuZS5UU1MudGIgJT4lXG4gIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBncm91cCA9IGRwbHlyOjpjYXNlX3doZW4oXG4gICAgICBlbnNlbWJsICVpbiUgZ3JvdXAxIH4gXFxncm91cDFcXCxcbiAgICAgIGVuc2VtYmwgJWluJSBncm91cDIgfiBcXGdyb3VwMlxcLFxuICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwMyB+IFxcZ3JvdXAzXFwsXG4gICAgICBlbnNlbWJsICVpbiUgZ3JvdXA0IH4gXFxncm91cDRcXCxcbiAgICAgIGVuc2VtYmwgJWluJSBncm91cDUgfiBcXGdyb3VwNVxcLFxuICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwNiB+IFxcZ3JvdXA2XFwsXG4gICAgICBlbnNlbWJsICVpbiUgZ3JvdXA3IH4gXFxncm91cDdcXCxcbiAgICAgIGVuc2VtYmwgJWluJSBncm91cDggfiBcXGdyb3VwOFxcLFxuICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwOSB+IFxcZ3JvdXA5XFwsXG4gICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyX1xuICAgIClcbiAgKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG4jIyBQbG90IGRpc3RhbmNlXG4jIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuIyAgIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZGlzdGFuY2VcbiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJGRpc3RhbmNlXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuXG5cbnBsb3RfVEFEZGlzdGFuY2UgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXtcbiAgIyBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgIyBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgIyBwMTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgIyBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgIyBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgIyBwNTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgIyBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IGRpc3RhbmNlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpXG4gICAgIyBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSwgXFxcXG5cXCxcbiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTU6IFxcLCBjb252UHZhbHVlKHAxNSksIFxcXFxuXFwsXG4gICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE4OiBcXCwgY29udlB2YWx1ZShwMTgpLCBcXFxcblxcLFxuICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNTogXFwsIGNvbnZQdmFsdWUocDI1KSwgXFxcXG5cXCxcbiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjg6IFxcLCBjb252UHZhbHVlKHAyOCksIFxcXFxuXFwsXG4gICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDU4OiBcXCxjb252UHZhbHVlKCBwNTgpLCBcXFxcblxcKSxcbiAgICAjICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGRpc3RhbmNlX3RvX2JvdW5kYXJ5X1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAzXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5cbnBsb3RfVEFEZGlzdGFuY2UoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cF9BNDg1XFwpXG5cblxuIyMgUGxvdCBUQUQgc2l6ZVxuIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJFRBRHNpemVcbiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJFRBRHNpemVcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG4jIFxuXG5wbG90X1RBRHNpemUgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXtcbiAgIyBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgIyBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgIyBwMTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgIyBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgIyBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgIyBwNTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBUQURzaXplKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpIFxuICAgICMgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxODogXFwsIGNvbnZQdmFsdWUocDE4KSwgXFxcXG5cXCxcbiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA1ODogXFwsY29udlB2YWx1ZSggcDU4KSwgXFxcXG5cXCksXG4gICAgIyAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzaXplX29mX2JvdW5kYXJ5X1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAzXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5wbG90X1RBRHNpemUoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cF9BNDg1XFwsIHltYXggPSA2ZTYpXG5gYGBcbmBgYCJ9 -->

```r
```r
group1 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group2.tsv\))$gene
group3 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group3.tsv\))$gene
group4 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group4.tsv\))$gene
group5 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group5.tsv\))$gene
group6 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group6.tsv\))$gene
group7 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group7.tsv\))$gene
group8 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group8.tsv\))$gene
group9 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group9.tsv\))$gene


gene.TSS.tb.plot <- gene.TSS.tb %>%
  rowwise() %>%
  dplyr::mutate(
    group = dplyr::case_when(
      ensembl %in% group1 ~ \group1\,
      ensembl %in% group2 ~ \group2\,
      ensembl %in% group3 ~ \group3\,
      ensembl %in% group4 ~ \group4\,
      ensembl %in% group5 ~ \group5\,
      ensembl %in% group6 ~ \group6\,
      ensembl %in% group7 ~ \group7\,
      ensembl %in% group8 ~ \group8\,
      ensembl %in% group9 ~ \group9\,
      TRUE ~ NA_character_
    )
  ) %>%
  dplyr::filter(!is.na(group))

## Plot distance
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(group == group1) )$distance
#   distance2 <- (data %>% dplyr::filter(group == group2) )$distance
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }


plot_TADdistance <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  # p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  # p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  # p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  # p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  # p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  # p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  # 
  p <- ggplot(temp.tb, aes(x = group, y = distance)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + scale_y_continuous(labels = label_kb_mb)
    # annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
    #                                                      \p15: \, convPvalue(p15), \\n\,
    #                                                      \p18: \, convPvalue(p18), \\n\,
    #                                                      \p25: \, convPvalue(p25), \\n\,
    #                                                      \p28: \, convPvalue(p28), \\n\,
    #                                                      \p58: \,convPvalue( p58), \\n\),
    #          color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\distance_to_boundary_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

plot_TADdistance(gene.TSS.tb.plot, \group_A485\)


## Plot TAD size
# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(group == group1) )$TADsize
#   distance2 <- (data %>% dplyr::filter(group == group2) )$TADsize
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# 

plot_TADsize <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  # p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  # p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  # p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  # p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  # p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  # p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = TADsize)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + scale_y_continuous(labels = label_kb_mb) 
    # annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
    #                                                      \p15: \, convPvalue(p15), \\n\,
    #                                                      \p18: \, convPvalue(p18), \\n\,
    #                                                      \p25: \, convPvalue(p25), \\n\,
    #                                                      \p28: \, convPvalue(p28), \\n\,
    #                                                      \p58: \,convPvalue( p58), \\n\),
    #          color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\size_of_boundary_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_TADsize(gene.TSS.tb.plot, \group_A485\, ymax = 6e6)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### dTAG - Plotting for groups

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjbVZtUkdseUlEd3RJR2hsY21Vb1hDSXVMaTh1TGx3aUxDQmNJbkpsWm1WeVpXNWpaVndpS1Z4dVhHNGpJRWx0Y0c5eWRHbHVaeUJVUVVRZ1ltOTFibVJoY25sY2JuUmhaRjlpYjNWdVpHRnllU0E4TFNCbWNtVmhaQ2hvWlhKbEtGd2lMaTR2TGk0dmNtVnpkV3gwTDFSQlJGd2lMQ0JjSWxSQlJGOHlOV3RpWHpFeU5XdGlYMjkwYzNWZlltOTFibVJoY21sbGMxOUhNVVJOVTA4dVltVmtYQ0lwS1Z4dVkyOXNibUZ0WlhNb2RHRmtYMkp2ZFc1a1lYSjVLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNiblJoWkY5aWIzVnVaR0Z5ZVNBOExTQjBZV1JmWW05MWJtUmhjbmtnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvZEdGa1gybGtJRDBnY0dGemRHVW9ZMmh5TENCemRHRnlkQ3dnWlc1a0xDQnpaWEFnUFNCY0lsOWNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITjBZWEowSUQwZ2MzUmhjblFnTFRFM05UQXdNQzh5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxibVFnUFNCbGJtUWdLeUF4TnpVd01EQXZNaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyVnVkR1Z5SUQwZ0tITjBZWEowSUNzZ1pXNWtLUzh5S1Z4dVhHNGpJRWx0Y0c5eWRHbHVaeUJTUVVReU1TQmlhV2QzYVdjZ2RISmhZMnRjYm1KM0xsSkJSREl4SUR3dElHbHRjRzl5ZENob1pYSmxLSEpsWmtScGNpd2dYQ0l6TXpJMU1GOVNRVVF5TVY5aFlqazVNbDlDY25WalpTMDBYM1J5YVcxZmNUSXdYMlJsWkhWd1gySnNZV05yWDJSbGNIUm9UbTl5YlY5aWFXNDFNR0p3TG1KM1hDSXBLVnh1WEc0aklFTnlaV0YwWlNCSFVtRnVaMlZ6SUc5aWFtVmpkQ0JtYjNJZ1ZFRkVJR0p2ZFc1a1lYSnBaWE5jYm5SaFpGOXlZVzVuWlhNZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtIUmhaRjlpYjNWdVpHRnllU3dnYTJWbGNDNWxlSFJ5WVM1amIyeDFiVzV6SUQwZ1ZGSlZSU2xjYmx4dUl5QkdhVzVrSUc5MlpYSnNZWEJ6SUdKbGRIZGxaVzRnWVd4c0lGUkJSQ0JpYjNWdVpHRnlhV1Z6SUdGdVpDQlNRVVF5TVNCaWFXZDNhV2NnWkdGMFlWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektIUmhaRjl5WVc1blpYTXNJR0ozTGxKQlJESXhLVnh1WEc0aklFVjRkSEpoWTNRZ2IzWmxjbXhoY0hCcGJtY2djbVZuYVc5dWN5QmhibVFnYzJOdmNtVnpJR1p5YjIwZ2RHaGxJRUpwWjFkcFoxeHViM1psY214aGNIQnBibWRmWW5jZ1BDMGdZbmN1VWtGRU1qRmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFZ4dWIzWmxjbXhoY0hCcGJtZGZkR0ZrY3lBOExTQjBZV1JmY21GdVoyVnpXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkWEc1Y2JpTWdRV2RuY21WbllYUmxJSE5qYjNKbGN5QmllU0JVUVVRZ1ltOTFibVJoY25rZ2NtVm5hVzl1YzF4dVhHNWNibk5qYjNKbGN5QThMU0JoYzE5MGFXSmliR1VvYjNabGNteGhjSEJwYm1kZlluY3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaFpGOXBaQ0E5SUhSaFpGOXlZVzVuWlhOYmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMGtkR0ZrWDJsa0tTQWxQaVZjYmlBZ1ozSnZkWEJmWW5rb2RHRmtYMmxrS1NBbFBpVmNiaUFnYzNWdGJXRnlhWE5sS0hKaFpESXhVMk52Y21VZ1BTQnpkVzBvYzJOdmNtVXBLVnh1WEc1MFlXUmZZbTkxYm1SaGNua2dQQzBnZEdGa1gySnZkVzVrWVhKNUlDVStKVnh1SUNCc1pXWjBYMnB2YVc0b2MyTnZjbVZ6TENCaWVTQTlJRndpZEdGa1gybGtYQ0lwWEc1Y2JseHVYRzVjYmx4dUl5QkpiWEJ2Y25ScGJtY2daMlZ1WlZ4dVoyVnVaUzVVVTFNdWRHSWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aWJXMHhNRjlIVWtOdE16Z3VjRFpmWjJWdVpWOXpiM0owWldRdVltVmtYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaFVVMU1nUFNCcFptVnNjMlVvVmpRZ1BUMGdYQ0lyWENJc0lGWXlMQ0JXTXlrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLRlkyTENCV05Td2dWakVzSUZSVFV5bGNibU52Ykc1aGJXVnpLR2RsYm1VdVZGTlRMblJpS1NBOExTQmpLRndpWlc1elpXMWliRndpTENCY0ltZGxibVZjSWl3Z1hDSmphSEpjSWl3Z1hDSlVVMU5jSWlsY2JseHVYRzRqSUVacGJtUWdibVZoY21WemRDQlVRVVFnWW05MWJtUmhjbmxjYm1acGJtUkRiRzl6WlhOMFZFRkVRbTkxYm1SaGNubEpSQ0E4TFNCbWRXNWpkR2x2YmloamFISnZiU3dnVkZOVExDQjBZV1JmWW05MWJtUmhjbmtwZTF4dUlDQjBaVzF3SUR3dElIUmhaRjlpYjNWdVpHRnllU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhqYUhJZ1BUMGdZMmh5YjIwcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvWkdsemRHRnVZMlVnUFNCaFluTW9ZMlZ1ZEdWeUlDMGdWRk5US1NrZ0pUNGxYRzRnSUNBZ2MyeHBZMlZmYldsdUtHUnBjM1JoYm1ObEtWeHVJQ0JwWmlodWNtOTNLSFJsYlhBcElEMDlJREVwZTF4dUlDQWdJQ0FnY21WMGRYSnVLSFJsYlhBa2RHRmtYMmxrS1Z4dUlDQjlaV3h6Wlh0Y2JpQWdJQ0J5WlhSMWNtNG9Ua0VwWEc0Z0lIMWNibjFjYm1kbGJtVXVWRk5UTG5SaUlEd3RJR2RsYm1VdVZGTlRMblJpSUNVK0pTQnliM2QzYVhObEtDa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWTJ4dmMyVnpkRUp2ZFc1a1lYSjVJRDBnWm1sdVpFTnNiM05sYzNSVVFVUkNiM1Z1WkdGeWVVbEVLR05vY2l3Z1ZGTlRMQ0IwWVdSZlltOTFibVJoY25rcEtWeHVYRzUwWlcxd0lEd3RJSFJoWkY5aWIzVnVaR0Z5ZVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlXUmZhV1FzSUhKaFpESXhVMk52Y21VcFhHNWNibWRsYm1VdVZGTlRMblJpSUR3dElHZGxibVV1VkZOVExuUmlJQ1UrSlNCc1pXWjBYMnB2YVc0b2RHVnRjQ3dnWW5rZ1BTQmpLRndpWTJ4dmMyVnpkRUp2ZFc1a1lYSjVYQ0lnUFNCY0luUmhaRjlwWkZ3aUtTQXBYRzVjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbnJlZkRpciA8LSBoZXJlKFxcLi4vLi5cXCwgXFxyZWZlcmVuY2VcXClcblxuIyBJbXBvcnRpbmcgVEFEIGJvdW5kYXJ5XG50YWRfYm91bmRhcnkgPC0gZnJlYWQoaGVyZShcXC4uLy4uL3Jlc3VsdC9UQURcXCwgXFxUQURfMjVrYl8xMjVrYl9vdHN1X2JvdW5kYXJpZXNfRzFETVNPLmJlZFxcKSlcbmNvbG5hbWVzKHRhZF9ib3VuZGFyeSkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG50YWRfYm91bmRhcnkgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6bXV0YXRlKHRhZF9pZCA9IHBhc3RlKGNociwgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0IC0xNzUwMDAvMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gZW5kICsgMTc1MDAwLzIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IChzdGFydCArIGVuZCkvMilcblxuIyBJbXBvcnRpbmcgUkFEMjEgYmlnd2lnIHRyYWNrXG5idy5SQUQyMSA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm1fYmluNTBicC5id1xcKSlcblxuIyBDcmVhdGUgR1JhbmdlcyBvYmplY3QgZm9yIFRBRCBib3VuZGFyaWVzXG50YWRfcmFuZ2VzIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0YWRfYm91bmRhcnksIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpXG5cbiMgRmluZCBvdmVybGFwcyBiZXR3ZWVuIGFsbCBUQUQgYm91bmRhcmllcyBhbmQgUkFEMjEgYmlnd2lnIGRhdGFcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyh0YWRfcmFuZ2VzLCBidy5SQUQyMSlcblxuIyBFeHRyYWN0IG92ZXJsYXBwaW5nIHJlZ2lvbnMgYW5kIHNjb3JlcyBmcm9tIHRoZSBCaWdXaWdcbm92ZXJsYXBwaW5nX2J3IDwtIGJ3LlJBRDIxW3N1YmplY3RIaXRzKG92ZXJsYXBzKV1cbm92ZXJsYXBwaW5nX3RhZHMgPC0gdGFkX3Jhbmdlc1txdWVyeUhpdHMob3ZlcmxhcHMpXVxuXG4jIEFnZ3JlZ2F0ZSBzY29yZXMgYnkgVEFEIGJvdW5kYXJ5IHJlZ2lvbnNcblxuXG5zY29yZXMgPC0gYXNfdGliYmxlKG92ZXJsYXBwaW5nX2J3KSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YWRfaWQgPSB0YWRfcmFuZ2VzW3F1ZXJ5SGl0cyhvdmVybGFwcyldJHRhZF9pZCkgJT4lXG4gIGdyb3VwX2J5KHRhZF9pZCkgJT4lXG4gIHN1bW1hcmlzZShyYWQyMVNjb3JlID0gc3VtKHNjb3JlKSlcblxudGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiVcbiAgbGVmdF9qb2luKHNjb3JlcywgYnkgPSBcXHRhZF9pZFxcKVxuXG5cblxuXG5cbiMgSW1wb3J0aW5nIGdlbmVcbmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWNiwgVjUsIFYxLCBUU1MpXG5jb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYyhcXGVuc2VtYmxcXCwgXFxnZW5lXFwsIFxcY2hyXFwsIFxcVFNTXFwpXG5cblxuIyBGaW5kIG5lYXJlc3QgVEFEIGJvdW5kYXJ5XG5maW5kQ2xvc2VzdFRBREJvdW5kYXJ5SUQgPC0gZnVuY3Rpb24oY2hyb20sIFRTUywgdGFkX2JvdW5kYXJ5KXtcbiAgdGVtcCA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyID09IGNocm9tKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gYWJzKGNlbnRlciAtIFRTUykpICU+JVxuICAgIHNsaWNlX21pbihkaXN0YW5jZSlcbiAgaWYobnJvdyh0ZW1wKSA9PSAxKXtcbiAgICAgIHJldHVybih0ZW1wJHRhZF9pZClcbiAgfWVsc2V7XG4gICAgcmV0dXJuKE5BKVxuICB9XG59XG5nZW5lLlRTUy50YiA8LSBnZW5lLlRTUy50YiAlPiUgcm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKGNsb3Nlc3RCb3VuZGFyeSA9IGZpbmRDbG9zZXN0VEFEQm91bmRhcnlJRChjaHIsIFRTUywgdGFkX2JvdW5kYXJ5KSlcblxudGVtcCA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjpzZWxlY3QodGFkX2lkLCByYWQyMVNjb3JlKVxuXG5nZW5lLlRTUy50YiA8LSBnZW5lLlRTUy50YiAlPiUgbGVmdF9qb2luKHRlbXAsIGJ5ID0gYyhcXGNsb3Nlc3RCb3VuZGFyeVxcID0gXFx0YWRfaWRcXCkgKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
refDir <- here(\../..\, \reference\)

# Importing TAD boundary
tad_boundary <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_boundaries_G1DMSO.bed\))
colnames(tad_boundary) <- c(\chr\, \start\, \end\)
tad_boundary <- tad_boundary %>% dplyr::mutate(tad_id = paste(chr, start, end, sep = \_\),
                                               start = start -175000/2,
                                               end = end + 175000/2,
                                               center = (start + end)/2)

# Importing RAD21 bigwig track
bw.RAD21 <- import(here(refDir, \33250_RAD21_ab992_Bruce-4_trim_q20_dedup_black_depthNorm_bin50bp.bw\))

# Create GRanges object for TAD boundaries
tad_ranges <- makeGRangesFromDataFrame(tad_boundary, keep.extra.columns = TRUE)

# Find overlaps between all TAD boundaries and RAD21 bigwig data
overlaps <- findOverlaps(tad_ranges, bw.RAD21)

# Extract overlapping regions and scores from the BigWig
overlapping_bw <- bw.RAD21[subjectHits(overlaps)]
overlapping_tads <- tad_ranges[queryHits(overlaps)]

# Aggregate scores by TAD boundary regions


scores <- as_tibble(overlapping_bw) %>%
  dplyr::mutate(tad_id = tad_ranges[queryHits(overlaps)]$tad_id) %>%
  group_by(tad_id) %>%
  summarise(rad21Score = sum(score))

tad_boundary <- tad_boundary %>%
  left_join(scores, by = \tad_id\)





# Importing gene
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, V5, V1, TSS)
colnames(gene.TSS.tb) <- c(\ensembl\, \gene\, \chr\, \TSS\)


# Find nearest TAD boundary
findClosestTADBoundaryID <- function(chrom, TSS, tad_boundary){
  temp <- tad_boundary %>% dplyr::filter(chr == chrom) %>%
    dplyr::mutate(distance = abs(center - TSS)) %>%
    slice_min(distance)
  if(nrow(temp) == 1){
      return(temp$tad_id)
  }else{
    return(NA)
  }
}
gene.TSS.tb <- gene.TSS.tb %>% rowwise() %>%
  dplyr::mutate(closestBoundary = findClosestTADBoundaryID(chr, TSS, tad_boundary))

temp <- tad_boundary %>% dplyr::select(tad_id, rad21Score)

gene.TSS.tb <- gene.TSS.tb %>% left_join(temp, by = c(\closestBoundary\ = \tad_id\) )



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNtVm1SR2x5SUR3dElHaGxjbVVvWEZ3dUxpOHVMbHhjTENCY1hISmxabVZ5Wlc1alpWeGNLVnh1WEc0aklFbHRjRzl5ZEdsdVp5QlVRVVFnWW05MWJtUmhjbmxjYm5SaFpGOWliM1Z1WkdGeWVTQThMU0JtY21WaFpDaG9aWEpsS0Z4Y0xpNHZMaTR2Y21WemRXeDBMMVJCUkZ4Y0xDQmNYRlJCUkY4eU5XdGlYekV5Tld0aVgyOTBjM1ZmWW05MWJtUmhjbWxsYzE5SE1VUk5VMDh1WW1Wa1hGd3BLVnh1WTI5c2JtRnRaWE1vZEdGa1gySnZkVzVrWVhKNUtTQThMU0JqS0Z4Y1kyaHlYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWENsY2JuUmhaRjlpYjNWdVpHRnllU0E4TFNCMFlXUmZZbTkxYm1SaGNua2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0ZrWDJsa0lEMGdjR0Z6ZEdVb1kyaHlMQ0J6ZEdGeWRDd2daVzVrTENCelpYQWdQU0JjWEY5Y1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOMFlYSjBJRDBnYzNSaGNuUWdMVEUzTlRBd01DOHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJtUWdQU0JsYm1RZ0t5QXhOelV3TURBdk1peGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJWdWRHVnlJRDBnS0hOMFlYSjBJQ3NnWlc1a0tTOHlLVnh1WEc0aklFbHRjRzl5ZEdsdVp5QlNRVVF5TVNCaWFXZDNhV2NnZEhKaFkydGNibUozTGxKQlJESXhJRHd0SUdsdGNHOXlkQ2hvWlhKbEtISmxaa1JwY2l3Z1hGd3pNekkxTUY5U1FVUXlNVjloWWprNU1sOUNjblZqWlMwMFgzUnlhVzFmY1RJd1gyUmxaSFZ3WDJKc1lXTnJYMlJsY0hSb1RtOXliVjlpYVc0MU1HSndMbUozWEZ3cEtWeHVYRzRqSUVOeVpXRjBaU0JIVW1GdVoyVnpJRzlpYW1WamRDQm1iM0lnVkVGRUlHSnZkVzVrWVhKcFpYTmNiblJoWkY5eVlXNW5aWE1nUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0hSaFpGOWliM1Z1WkdGeWVTd2dhMlZsY0M1bGVIUnlZUzVqYjJ4MWJXNXpJRDBnVkZKVlJTbGNibHh1SXlCR2FXNWtJRzkyWlhKc1lYQnpJR0psZEhkbFpXNGdZV3hzSUZSQlJDQmliM1Z1WkdGeWFXVnpJR0Z1WkNCU1FVUXlNU0JpYVdkM2FXY2daR0YwWVZ4dWIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0hSaFpGOXlZVzVuWlhNc0lHSjNMbEpCUkRJeEtWeHVYRzRqSUVWNGRISmhZM1FnYjNabGNteGhjSEJwYm1jZ2NtVm5hVzl1Y3lCaGJtUWdjMk52Y21WeklHWnliMjBnZEdobElFSnBaMWRwWjF4dWIzWmxjbXhoY0hCcGJtZGZZbmNnUEMwZ1luY3VVa0ZFTWpGYmMzVmlhbVZqZEVocGRITW9iM1psY214aGNITXBYVnh1YjNabGNteGhjSEJwYm1kZmRHRmtjeUE4TFNCMFlXUmZjbUZ1WjJWelczRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGRYRzVjYmlNZ1FXZG5jbVZuWVhSbElITmpiM0psY3lCaWVTQlVRVVFnWW05MWJtUmhjbmtnY21WbmFXOXVjMXh1WEc1Y2JuTmpiM0psY3lBOExTQmhjMTkwYVdKaWJHVW9iM1psY214aGNIQnBibWRmWW5jcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoWkY5cFpDQTlJSFJoWkY5eVlXNW5aWE5iY1hWbGNubElhWFJ6S0c5MlpYSnNZWEJ6S1Ywa2RHRmtYMmxrS1NBbFBpVmNiaUFnWjNKdmRYQmZZbmtvZEdGa1gybGtLU0FsUGlWY2JpQWdjM1Z0YldGeWFYTmxLSEpoWkRJeFUyTnZjbVVnUFNCemRXMG9jMk52Y21VcEtWeHVYRzUwWVdSZlltOTFibVJoY25rZ1BDMGdkR0ZrWDJKdmRXNWtZWEo1SUNVK0pWeHVJQ0JzWldaMFgycHZhVzRvYzJOdmNtVnpMQ0JpZVNBOUlGeGNkR0ZrWDJsa1hGd3BYRzVjYmx4dVhHNWNibHh1SXlCSmJYQnZjblJwYm1jZ1oyVnVaVnh1WjJWdVpTNVVVMU11ZEdJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjYlcweE1GOUhVa050TXpndWNEWmZaMlZ1WlY5emIzSjBaV1F1WW1Wa1hGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoVVUxTWdQU0JwWm1Wc2MyVW9WalFnUFQwZ1hGd3JYRndzSUZZeUxDQldNeWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtGWTJMQ0JXTlN3Z1ZqRXNJRlJUVXlsY2JtTnZiRzVoYldWektHZGxibVV1VkZOVExuUmlLU0E4TFNCaktGeGNaVzV6WlcxaWJGeGNMQ0JjWEdkbGJtVmNYQ3dnWEZ4amFISmNYQ3dnWEZ4VVUxTmNYQ2xjYmx4dVhHNGpJRVpwYm1RZ2JtVmhjbVZ6ZENCVVFVUWdZbTkxYm1SaGNubGNibVpwYm1SRGJHOXpaWE4wVkVGRVFtOTFibVJoY25sSlJDQThMU0JtZFc1amRHbHZiaWhqYUhKdmJTd2dWRk5UTENCMFlXUmZZbTkxYm1SaGNua3BlMXh1SUNCMFpXMXdJRHd0SUhSaFpGOWliM1Z1WkdGeWVTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaGphSElnUFQwZ1kyaHliMjBwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0JoWW5Nb1kyVnVkR1Z5SUMwZ1ZGTlRLU2tnSlQ0bFhHNGdJQ0FnYzJ4cFkyVmZiV2x1S0dScGMzUmhibU5sS1Z4dUlDQnBaaWh1Y205M0tIUmxiWEFwSUQwOUlERXBlMXh1SUNBZ0lDQWdjbVYwZFhKdUtIUmxiWEFrZEdGa1gybGtLVnh1SUNCOVpXeHpaWHRjYmlBZ0lDQnlaWFIxY200b1RrRXBYRzRnSUgxY2JuMWNibWRsYm1VdVZGTlRMblJpSUR3dElHZGxibVV1VkZOVExuUmlJQ1UrSlNCeWIzZDNhWE5sS0NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9ZMnh2YzJWemRFSnZkVzVrWVhKNUlEMGdabWx1WkVOc2IzTmxjM1JVUVVSQ2IzVnVaR0Z5ZVVsRUtHTm9jaXdnVkZOVExDQjBZV1JmWW05MWJtUmhjbmtwS1Z4dVhHNTBaVzF3SUR3dElIUmhaRjlpYjNWdVpHRnllU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVdSZmFXUXNJSEpoWkRJeFUyTnZjbVVwWEc1Y2JtZGxibVV1VkZOVExuUmlJRHd0SUdkbGJtVXVWRk5UTG5SaUlDVStKU0JzWldaMFgycHZhVzRvZEdWdGNDd2dZbmtnUFNCaktGeGNZMnh2YzJWemRFSnZkVzVrWVhKNVhGd2dQU0JjWEhSaFpGOXBaRnhjS1NBcFhHNWNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5yZWZEaXIgPC0gaGVyZShcXC4uLy4uXFwsIFxccmVmZXJlbmNlXFwpXG5cbiMgSW1wb3J0aW5nIFRBRCBib3VuZGFyeVxudGFkX2JvdW5kYXJ5IDwtIGZyZWFkKGhlcmUoXFwuLi8uLi9yZXN1bHQvVEFEXFwsIFxcVEFEXzI1a2JfMTI1a2Jfb3RzdV9ib3VuZGFyaWVzX0cxRE1TTy5iZWRcXCkpXG5jb2xuYW1lcyh0YWRfYm91bmRhcnkpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxudGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6Om11dGF0ZSh0YWRfaWQgPSBwYXN0ZShjaHIsIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBzdGFydCAtMTc1MDAwLzIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGVuZCArIDE3NTAwMC8yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSAoc3RhcnQgKyBlbmQpLzIpXG5cbiMgSW1wb3J0aW5nIFJBRDIxIGJpZ3dpZyB0cmFja1xuYncuUkFEMjEgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXDMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfdHJpbV9xMjBfZGVkdXBfYmxhY2tfZGVwdGhOb3JtX2JpbjUwYnAuYndcXCkpXG5cbiMgQ3JlYXRlIEdSYW5nZXMgb2JqZWN0IGZvciBUQUQgYm91bmRhcmllc1xudGFkX3JhbmdlcyA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGFkX2JvdW5kYXJ5LCBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKVxuXG4jIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBhbGwgVEFEIGJvdW5kYXJpZXMgYW5kIFJBRDIxIGJpZ3dpZyBkYXRhXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHModGFkX3JhbmdlcywgYncuUkFEMjEpXG5cbiMgRXh0cmFjdCBvdmVybGFwcGluZyByZWdpb25zIGFuZCBzY29yZXMgZnJvbSB0aGUgQmlnV2lnXG5vdmVybGFwcGluZ19idyA8LSBidy5SQUQyMVtzdWJqZWN0SGl0cyhvdmVybGFwcyldXG5vdmVybGFwcGluZ190YWRzIDwtIHRhZF9yYW5nZXNbcXVlcnlIaXRzKG92ZXJsYXBzKV1cblxuIyBBZ2dyZWdhdGUgc2NvcmVzIGJ5IFRBRCBib3VuZGFyeSByZWdpb25zXG5cblxuc2NvcmVzIDwtIGFzX3RpYmJsZShvdmVybGFwcGluZ19idykgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFkX2lkID0gdGFkX3Jhbmdlc1txdWVyeUhpdHMob3ZlcmxhcHMpXSR0YWRfaWQpICU+JVxuICBncm91cF9ieSh0YWRfaWQpICU+JVxuICBzdW1tYXJpc2UocmFkMjFTY29yZSA9IHN1bShzY29yZSkpXG5cbnRhZF9ib3VuZGFyeSA8LSB0YWRfYm91bmRhcnkgJT4lXG4gIGxlZnRfam9pbihzY29yZXMsIGJ5ID0gXFx0YWRfaWRcXClcblxuXG5cblxuXG4jIEltcG9ydGluZyBnZW5lXG5nZW5lLlRTUy50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjYsIFY1LCBWMSwgVFNTKVxuY29sbmFtZXMoZ2VuZS5UU1MudGIpIDwtIGMoXFxlbnNlbWJsXFwsIFxcZ2VuZVxcLCBcXGNoclxcLCBcXFRTU1xcKVxuXG5cbiMgRmluZCBuZWFyZXN0IFRBRCBib3VuZGFyeVxuZmluZENsb3Nlc3RUQURCb3VuZGFyeUlEIDwtIGZ1bmN0aW9uKGNocm9tLCBUU1MsIHRhZF9ib3VuZGFyeSl7XG4gIHRlbXAgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IGFicyhjZW50ZXIgLSBUU1MpKSAlPiVcbiAgICBzbGljZV9taW4oZGlzdGFuY2UpXG4gIGlmKG5yb3codGVtcCkgPT0gMSl7XG4gICAgICByZXR1cm4odGVtcCR0YWRfaWQpXG4gIH1lbHNle1xuICAgIHJldHVybihOQSlcbiAgfVxufVxuZ2VuZS5UU1MudGIgPC0gZ2VuZS5UU1MudGIgJT4lIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShjbG9zZXN0Qm91bmRhcnkgPSBmaW5kQ2xvc2VzdFRBREJvdW5kYXJ5SUQoY2hyLCBUU1MsIHRhZF9ib3VuZGFyeSkpXG5cbnRlbXAgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6c2VsZWN0KHRhZF9pZCwgcmFkMjFTY29yZSlcblxuZ2VuZS5UU1MudGIgPC0gZ2VuZS5UU1MudGIgJT4lIGxlZnRfam9pbih0ZW1wLCBieSA9IGMoXFxjbG9zZXN0Qm91bmRhcnlcXCA9IFxcdGFkX2lkXFwpIClcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucmVmRGlyIDwtIGhlcmUoXFwuLi8uLlxcLCBcXHJlZmVyZW5jZVxcKVxuXG4jIEltcG9ydGluZyBUQUQgYm91bmRhcnlcbnRhZF9ib3VuZGFyeSA8LSBmcmVhZChoZXJlKFxcLi4vLi4vcmVzdWx0L1RBRFxcLCBcXFRBRF8yNWtiXzEyNWtiX290c3VfYm91bmRhcmllc19HMURNU08uYmVkXFwpKVxuY29sbmFtZXModGFkX2JvdW5kYXJ5KSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnRhZF9ib3VuZGFyeSA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjptdXRhdGUodGFkX2lkID0gcGFzdGUoY2hyLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQgLTE3NTAwMC8yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBlbmQgKyAxNzUwMDAvMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKVxuXG4jIEltcG9ydGluZyBSQUQyMSBiaWd3aWcgdHJhY2tcbmJ3LlJBRDIxIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybV9iaW41MGJwLmJ3XFwpKVxuXG4jIENyZWF0ZSBHUmFuZ2VzIG9iamVjdCBmb3IgVEFEIGJvdW5kYXJpZXNcbnRhZF9yYW5nZXMgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRhZF9ib3VuZGFyeSwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSlcblxuIyBGaW5kIG92ZXJsYXBzIGJldHdlZW4gYWxsIFRBRCBib3VuZGFyaWVzIGFuZCBSQUQyMSBiaWd3aWcgZGF0YVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKHRhZF9yYW5nZXMsIGJ3LlJBRDIxKVxuXG4jIEV4dHJhY3Qgb3ZlcmxhcHBpbmcgcmVnaW9ucyBhbmQgc2NvcmVzIGZyb20gdGhlIEJpZ1dpZ1xub3ZlcmxhcHBpbmdfYncgPC0gYncuUkFEMjFbc3ViamVjdEhpdHMob3ZlcmxhcHMpXVxub3ZlcmxhcHBpbmdfdGFkcyA8LSB0YWRfcmFuZ2VzW3F1ZXJ5SGl0cyhvdmVybGFwcyldXG5cbiMgQWdncmVnYXRlIHNjb3JlcyBieSBUQUQgYm91bmRhcnkgcmVnaW9uc1xuXG5cbnNjb3JlcyA8LSBhc190aWJibGUob3ZlcmxhcHBpbmdfYncpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhZF9pZCA9IHRhZF9yYW5nZXNbcXVlcnlIaXRzKG92ZXJsYXBzKV0kdGFkX2lkKSAlPiVcbiAgZ3JvdXBfYnkodGFkX2lkKSAlPiVcbiAgc3VtbWFyaXNlKHJhZDIxU2NvcmUgPSBzdW0oc2NvcmUpKVxuXG50YWRfYm91bmRhcnkgPC0gdGFkX2JvdW5kYXJ5ICU+JVxuICBsZWZ0X2pvaW4oc2NvcmVzLCBieSA9IFxcdGFkX2lkXFwpXG5cblxuXG5cblxuIyBJbXBvcnRpbmcgZ2VuZVxuZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMykpICU+JVxuICBkcGx5cjo6c2VsZWN0KFY2LCBWNSwgVjEsIFRTUylcbmNvbG5hbWVzKGdlbmUuVFNTLnRiKSA8LSBjKFxcZW5zZW1ibFxcLCBcXGdlbmVcXCwgXFxjaHJcXCwgXFxUU1NcXClcblxuXG4jIEZpbmQgbmVhcmVzdCBUQUQgYm91bmRhcnlcbmZpbmRDbG9zZXN0VEFEQm91bmRhcnlJRCA8LSBmdW5jdGlvbihjaHJvbSwgVFNTLCB0YWRfYm91bmRhcnkpe1xuICB0ZW1wIDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6OmZpbHRlcihjaHIgPT0gY2hyb20pICU+JVxuICAgIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBhYnMoY2VudGVyIC0gVFNTKSkgJT4lXG4gICAgc2xpY2VfbWluKGRpc3RhbmNlKVxuICBpZihucm93KHRlbXApID09IDEpe1xuICAgICAgcmV0dXJuKHRlbXAkdGFkX2lkKVxuICB9ZWxzZXtcbiAgICByZXR1cm4oTkEpXG4gIH1cbn1cbmdlbmUuVFNTLnRiIDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoY2xvc2VzdEJvdW5kYXJ5ID0gZmluZENsb3Nlc3RUQURCb3VuZGFyeUlEKGNociwgVFNTLCB0YWRfYm91bmRhcnkpKVxuXG50ZW1wIDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6OnNlbGVjdCh0YWRfaWQsIHJhZDIxU2NvcmUpXG5cbmdlbmUuVFNTLnRiIDwtIGdlbmUuVFNTLnRiICU+JSBsZWZ0X2pvaW4odGVtcCwgYnkgPSBjKFxcY2xvc2VzdEJvdW5kYXJ5XFwgPSBcXHRhZF9pZFxcKSApXG5cbmBgYFxuYGBgIn0= -->

```r
```r
refDir <- here(\../..\, \reference\)

# Importing TAD boundary
tad_boundary <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_boundaries_G1DMSO.bed\))
colnames(tad_boundary) <- c(\chr\, \start\, \end\)
tad_boundary <- tad_boundary %>% dplyr::mutate(tad_id = paste(chr, start, end, sep = \_\),
                                               start = start -175000/2,
                                               end = end + 175000/2,
                                               center = (start + end)/2)

# Importing RAD21 bigwig track
bw.RAD21 <- import(here(refDir, \33250_RAD21_ab992_Bruce-4_trim_q20_dedup_black_depthNorm_bin50bp.bw\))

# Create GRanges object for TAD boundaries
tad_ranges <- makeGRangesFromDataFrame(tad_boundary, keep.extra.columns = TRUE)

# Find overlaps between all TAD boundaries and RAD21 bigwig data
overlaps <- findOverlaps(tad_ranges, bw.RAD21)

# Extract overlapping regions and scores from the BigWig
overlapping_bw <- bw.RAD21[subjectHits(overlaps)]
overlapping_tads <- tad_ranges[queryHits(overlaps)]

# Aggregate scores by TAD boundary regions


scores <- as_tibble(overlapping_bw) %>%
  dplyr::mutate(tad_id = tad_ranges[queryHits(overlaps)]$tad_id) %>%
  group_by(tad_id) %>%
  summarise(rad21Score = sum(score))

tad_boundary <- tad_boundary %>%
  left_join(scores, by = \tad_id\)





# Importing gene
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, V5, V1, TSS)
colnames(gene.TSS.tb) <- c(\ensembl\, \gene\, \chr\, \TSS\)


# Find nearest TAD boundary
findClosestTADBoundaryID <- function(chrom, TSS, tad_boundary){
  temp <- tad_boundary %>% dplyr::filter(chr == chrom) %>%
    dplyr::mutate(distance = abs(center - TSS)) %>%
    slice_min(distance)
  if(nrow(temp) == 1){
      return(temp$tad_id)
  }else{
    return(NA)
  }
}
gene.TSS.tb <- gene.TSS.tb %>% rowwise() %>%
  dplyr::mutate(closestBoundary = findClosestTADBoundaryID(chr, TSS, tad_boundary))

temp <- tad_boundary %>% dplyr::select(tad_id, rad21Score)

gene.TSS.tb <- gene.TSS.tb %>% left_join(temp, by = c(\closestBoundary\ = \tad_id\) )

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### A485 - Plotting for groups

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RFdWRITjJYQ0lwS1NSblpXNWxYRzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd01pNTBjM1pjSWlrcEpHZGxibVZjYm1keWIzVndOU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSm5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQTFMblJ6ZGx3aUtTa2taMlZ1WlZ4dVozSnZkWEE0SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbWRsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjRGd1ZEhOMlhDSXBLU1JuWlc1bFhHNWNibHh1WjJWdVpTNVVVMU11ZEdJdWNHeHZkQ0E4TFNCblpXNWxMbFJUVXk1MFlpQWxQaVVnY205M2QybHpaU2dwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQm5jbTkxY0NBOUlHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdaM0p2ZFhBeExDQmNJbWR5YjNWd01Wd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aVzV6WlcxaWJDQWxhVzRsSUdkeWIzVndNaXdnWENKbmNtOTFjREpjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEExTENCY0ltZHliM1Z3TlZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEE0TENCY0ltZHliM1Z3T0Z3aUxDQk9RU2twS1NrcElDVStKU0JjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWdoYVhNdWJtRW9aM0p2ZFhBcEtWeHVYRzVjYmlNaklGQnNiM1FnWkdsemRHRnVZMlZjYm1kbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXhLU0FwSkhKaFpESXhVMk52Y21WY2JpQWdaR2x6ZEdGdVkyVXlJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJR2R5YjNWd01pa2dLU1J5WVdReU1WTmpiM0psWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WEc1Y2JuQnNiM1JmY21Ga01qRlRZMjl5WlVGMFFtOTFibVJoY25rZ1BDMGdablZ1WTNScGIyNG9kR1Z0Y0M1MFlpd2dibTkwWlNsN1hHNGdJSEF4TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRndpWjNKdmRYQXhYQ0lzSUZ3aVozSnZkWEF5WENJcExDQTFLVnh1SUNCd01UVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd05Wd2lLU3dnTlNsY2JpQWdjREU0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYQ0puY205MWNERmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzRnSUhBeU5TQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ3aVozSnZkWEF5WENJc0lGd2laM0p2ZFhBMVhDSXBMQ0ExS1Z4dUlDQndNamdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbWR5YjNWd01sd2lMQ0JjSW1keWIzVndPRndpS1N3Z05TbGNiaUFnY0RVNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWENKbmNtOTFjRFZjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc0Z0lGeHVJQ0J3SUR3dElHZG5jR3h2ZENoMFpXMXdMblJpTENCaFpYTW9lQ0E5SUdkeWIzVndMQ0I1SUQwZ2NtRmtNakZUWTI5eVpTa3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQm5jbTkxY0Nrc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnWEc0Z0lDQWdaMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0eExDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRXBJQ3RjYmlBZ0lDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRndpY21Wa1hDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lLU0FyWEc0Z0lDQWdkR2hsYldWZlkyeGhjM05wWXlncElDc2dYRzRnSUNBZ1lXNXViM1JoZEdVb1hDSjBaWGgwWENJc0lIZ2dQU0F4TENCNUlEMGdNakFnS3lBeExDQnNZV0psYkNBOUlIQmhjM1JsTUNoY0luQXhNam9nWENJc0lHTnZiblpRZG1Gc2RXVW9jREV5S1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0RFMU9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod01UVXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndNVGc2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEF4T0Nrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5BeU5Ub2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NESTFLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljREk0T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3TWpncExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd05UZzZJRndpTEdOdmJuWlFkbUZzZFdVb0lIQTFPQ2tzSUZ3aVhGeHVYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F6S1Z4dUlDQmNiaUFnWEc0Z0lHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbkpoWkRJeFUyTnZjbVZmWENJc0lHNXZkR1VwWEc0Z0lHaGxhV2RvZENBOExTQXpYRzRnSUhkcFpIUm9JRHd0SUROY2JpQWdjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUlDQndjbWx1ZENod0tWeHVJQ0JrWlhZdWIyWm1LQ2xjYmlBZ2MzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVJQ0J3Y21sdWRDaHdLVnh1SUNCa1pYWXViMlptS0NsY2JuMWNibHh1Y0d4dmRGOXlZV1F5TVZOamIzSmxRWFJDYjNWdVpHRnllU2huWlc1bExsUlRVeTUwWWk1d2JHOTBMQ0JjSW1keWIzVndYQ0lwWEc1Y2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCkpJGdlbmVcbmdyb3VwNSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdlxcKSkkZ2VuZVxuZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpKSRnZW5lXG5cblxuZ2VuZS5UU1MudGIucGxvdCA8LSBnZW5lLlRTUy50YiAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAxLCBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMiwgXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA1LCBcXGdyb3VwNVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA4LCBcXGdyb3VwOFxcLCBOQSkpKSkpICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbiMjIFBsb3QgZGlzdGFuY2VcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJHJhZDIxU2NvcmVcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRyYWQyMVNjb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnBsb3RfcmFkMjFTY29yZUF0Qm91bmRhcnkgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gcmFkMjFTY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMjAgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNTogXFwsIGNvbnZQdmFsdWUocDI1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHJhZDIxU2NvcmVfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cblxucGxvdF9yYWQyMVNjb3JlQXRCb3VuZGFyeShnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwXFwpXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene


gene.TSS.tb.plot <- gene.TSS.tb %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\,
                        ifelse(ensembl %in% group5, \group5\,
                               ifelse(ensembl %in% group8, \group8\, NA))))) %>% 
  dplyr::filter(!is.na(group))


## Plot distance
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$rad21Score
  distance2 <- (data %>% dplyr::filter(group == group2) )$rad21Score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_rad21ScoreAtBoundary <- function(temp.tb, note){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = rad21Score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + 
    annotate(\text\, x = 1, y = 20 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\rad21Score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

plot_rad21ScoreAtBoundary(gene.TSS.tb.plot, \group\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjREV1ZEhOMlhGd3BLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3TWk1MGMzWmNYQ2twSkdkbGJtVmNibWR5YjNWd05TQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4blpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBMUxuUnpkbHhjS1Nra1oyVnVaVnh1WjNKdmRYQTRJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNEZ3VkSE4yWEZ3cEtTUm5aVzVsWEc1Y2JseHVaMlZ1WlM1VVUxTXVkR0l1Y0d4dmRDQThMU0JuWlc1bExsUlRVeTUwWWlBbFBpVWdjbTkzZDJselpTZ3BJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNCbmNtOTFjQ0E5SUdsbVpXeHpaU2hsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEF4TENCY1hHZHliM1Z3TVZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd01pd2dYRnhuY205MWNESmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnWjNKdmRYQTFMQ0JjWEdkeWIzVndOVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnWjNKdmRYQTRMQ0JjWEdkeWIzVndPRnhjTENCT1FTa3BLU2twSUNVK0pTQmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpZ2hhWE11Ym1Fb1ozSnZkWEFwS1Z4dVhHNWNiaU1qSUZCc2IzUWdaR2x6ZEdGdVkyVmNibWRsZEZCMllXeFhhV3hqYjNnZ1BDMGdablZ1WTNScGIyNG9aR0YwWVN3Z1ozSnZkWEF4TENCbmNtOTFjRElwZTF4dUlDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdaM0p2ZFhBeEtTQXBKSEpoWkRJeFUyTnZjbVZjYmlBZ1pHbHpkR0Z1WTJVeUlEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlHZHliM1Z3TWlrZ0tTUnlZV1F5TVZOamIzSmxYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzVjYm5Cc2IzUmZjbUZrTWpGVFkyOXlaVUYwUW05MWJtUmhjbmtnUEMwZ1puVnVZM1JwYjI0b2RHVnRjQzUwWWl3Z2JtOTBaU2w3WEc0Z0lIQXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGeGNaM0p2ZFhBeFhGd3NJRnhjWjNKdmRYQXlYRndwTENBMUtWeHVJQ0J3TVRVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TlZ4Y0tTd2dOU2xjYmlBZ2NERTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNGdJSEF5TlNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRnhjWjNKdmRYQXlYRndzSUZ4Y1ozSnZkWEExWEZ3cExDQTFLVnh1SUNCd01qZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hHZHliM1Z3TWx4Y0xDQmNYR2R5YjNWd09GeGNLU3dnTlNsY2JpQWdjRFU0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYRnhuY205MWNEVmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzRnSUZ4dUlDQndJRHd0SUdkbmNHeHZkQ2gwWlcxd0xuUmlMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnY21Ga01qRlRZMjl5WlNrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCbmNtOTFjQ2tzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUNBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDdGNiaUFnSUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGeGNjbVZrWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0tTQXJYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1hHNGdJQ0FnWVc1dWIzUmhkR1VvWEZ4MFpYaDBYRndzSUhnZ1BTQXhMQ0I1SUQwZ01qQWdLeUF4TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjWEhBeE1qb2dYRndzSUdOdmJuWlFkbUZzZFdVb2NERXlLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjREUxT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3TVRVcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d01UZzZJRnhjTENCamIyNTJVSFpoYkhWbEtIQXhPQ2tzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEF5TlRvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0RJMUtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NESTRPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdNamdwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3TlRnNklGeGNMR052Ym5aUWRtRnNkV1VvSUhBMU9Da3NJRnhjWEZ4dVhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXpLVnh1SUNCY2JpQWdYRzRnSUdacGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hISmhaREl4VTJOdmNtVmZYRndzSUc1dmRHVXBYRzRnSUdobGFXZG9kQ0E4TFNBelhHNGdJSGRwWkhSb0lEd3RJRE5jYmlBZ2NHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1SUNCd2NtbHVkQ2h3S1Z4dUlDQmtaWFl1YjJabUtDbGNiaUFnYzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUlDQndjbWx1ZENod0tWeHVJQ0JrWlhZdWIyWm1LQ2xjYm4xY2JseHVjR3h2ZEY5eVlXUXlNVk5qYjNKbFFYUkNiM1Z1WkdGeWVTaG5aVzVsTGxSVFV5NTBZaTV3Ykc5MExDQmNYR2R5YjNWd1hGd3BYRzVjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDIudHN2XFwpKSRnZW5lXG5ncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwNS50c3ZcXCkpJGdlbmVcbmdyb3VwOCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA4LnRzdlxcKSkkZ2VuZVxuXG5cbmdlbmUuVFNTLnRiLnBsb3QgPC0gZ2VuZS5UU1MudGIgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwNSwgXFxncm91cDVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwOCwgXFxncm91cDhcXCwgTkEpKSkpKSAlPiUgXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuXG4jIyBQbG90IGRpc3RhbmNlXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRyYWQyMVNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkcmFkMjFTY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X3JhZDIxU2NvcmVBdEJvdW5kYXJ5IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUpe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4gIHAxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4gIHA1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IHJhZDIxU2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIFxuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDIwICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNTogXFwsIGNvbnZQdmFsdWUocDE1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE4OiBcXCwgY29udlB2YWx1ZShwMTgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyODogXFwsIGNvbnZQdmFsdWUocDI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDU4OiBcXCxjb252UHZhbHVlKCBwNTgpLCBcXFxcblxcKSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxyYWQyMVNjb3JlX1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAzXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5cbnBsb3RfcmFkMjFTY29yZUF0Qm91bmRhcnkoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cFxcKVxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCkpJGdlbmVcbmdyb3VwNSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdlxcKSkkZ2VuZVxuZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpKSRnZW5lXG5cblxuZ2VuZS5UU1MudGIucGxvdCA8LSBnZW5lLlRTUy50YiAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAxLCBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMiwgXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA1LCBcXGdyb3VwNVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA4LCBcXGdyb3VwOFxcLCBOQSkpKSkpICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbiMjIFBsb3QgZGlzdGFuY2VcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJHJhZDIxU2NvcmVcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRyYWQyMVNjb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnBsb3RfcmFkMjFTY29yZUF0Qm91bmRhcnkgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gcmFkMjFTY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMjAgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNTogXFwsIGNvbnZQdmFsdWUocDI1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHJhZDIxU2NvcmVfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cblxucGxvdF9yYWQyMVNjb3JlQXRCb3VuZGFyeShnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwXFwpXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene


gene.TSS.tb.plot <- gene.TSS.tb %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\,
                        ifelse(ensembl %in% group5, \group5\,
                               ifelse(ensembl %in% group8, \group8\, NA))))) %>% 
  dplyr::filter(!is.na(group))


## Plot distance
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$rad21Score
  distance2 <- (data %>% dplyr::filter(group == group2) )$rad21Score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_rad21ScoreAtBoundary <- function(temp.tb, note){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = rad21Score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + 
    annotate(\text\, x = 1, y = 20 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\rad21Score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

plot_rad21ScoreAtBoundary(gene.TSS.tb.plot, \group\)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


## [2.16] Checking the intensity of RAD21 at TAD boundary
#### Calculating RAD21 intensity of the nearest TAD boundary

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSUVsTlVFOVNWRWxPUnlCU1JWRlZTVkpGUkNCRVFWUkJYRzRqSUVsdGNHOXlkR2x1WnlCVVFVUmNiblJoWkNBOExTQm1jbVZoWkNob1pYSmxLRndpTGk0dkxpNHZjbVZ6ZFd4MEwxUkJSRndpTENCY0lsUkJSRjh5Tld0aVh6RXlOV3RpWDI5MGMzVmZSekZFVFZOUExtSmxaSEJsWENJcEtWeHVZMjlzYm1GdFpYTW9kR0ZrS1NBOExTQmpLRndpWTJoeU1Wd2lMQ0JjSW5OMFlYSjBNVndpTENCY0ltVnVaREZjSWl3Z1hDSmphSEl5WENJc0lGd2ljM1JoY25ReVhDSXNJRndpWlc1a01sd2lLVnh1ZEdGa0lEd3RJSFJoWkNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlXUkpSQ0E5SUhCaGMzUmxLR05vY2pFc0lITjBZWEowTVN3Z1pXNWtNU3dnYzJWd0lEMGdYQ0pmWENJcEtWeHVYRzVjYmlNZ1NXMXdiM0owYVc1bklHZGxibVZjYm1kbGJtVXVWRk5UTG5SaUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW0xdE1UQmZSMUpEYlRNNExuQTJYMmRsYm1WZmMyOXlkR1ZrTG1KbFpGd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ZGTlRJRDBnYVdabGJITmxLRlkwSUQwOUlGd2lLMXdpTENCV01pd2dWak1wS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaFdOaXdnVmpVc0lGWXhMQ0JVVTFNcFhHNWpiMnh1WVcxbGN5aG5aVzVsTGxSVFV5NTBZaWtnUEMwZ1l5aGNJbVZ1YzJWdFlteGNJaXdnWENKblpXNWxYQ0lzSUZ3aVkyaHlYQ0lzSUZ3aVZGTlRYQ0lwWEc1Y2JpTWdTVzF3YjNKMGFXNW5JR1Z1YUdGdVkyVnlYRzV3WldGckxrZ3pTekkzWVdNZ1BDMGdZWE5mZEdsaVlteGxLR2x0Y0c5eWRGQmxZV3NvYUdWeVpTaHlaV1pFYVhJc0lGd2lSMU5OTWpRek9EUTNObDlGUXkxRVJ5MHpORFU0TFVnelN6STNRVU5mUVZOWlRsOHhMbTVoY25KdmQxQmxZV3N1WW1Wa1hDSXBLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1kyVnVkR1Z5SUQwZ0tITjBZWEowSUNzZ1pXNWtLUzh5S1Z4dVhHNWNiaU1qSXlCR1ZVNURWRWxQVGlCR1QxSWdRMDlWVGxSSlRrZGNibVpwYm1SSmRITlVRVVFnUEMwZ1puVnVZM1JwYjI0b1kyaHliMjBzSUdOdmIzSmthVzVoZEdVc0lIUmhaQ2w3WEc0Z0lIUmxiWEFnUEMwZ2RHRmtJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR05vY2pFZ1BUMGdZMmh5YjIwc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOMFlYSjBNU0E4SUdOdmIzSmthVzVoZEdVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWdVpERWdQaUJqYjI5eVpHbHVZWFJsS1Z4dUlDQnBaaWh1Y205M0tIUmxiWEFwSUQwOUlERXBlMXh1SUNBZ0lISmxkSFZ5YmloMFpXMXdKSFJoWkVsRUtWeHVJQ0I5Wld4elpYdGNiaUFnSUNCeVpYUjFjbTRvVGtFcFhHNGdJSDFjYm4xY2JseHVJeU1qSUVOdmRXNTBhVzVuSUdWaFkyZ2dabVZoZEhWeVpYTWdabTl5SUZSQlJGeHVJeU1qSUVOdmRXNTBhVzVuSUdkbGJtVmNibWRsYm1WRGIzVnVkRkJsY2xSQlJDQThMU0JuWlc1bExsUlRVeTUwWWlBbFBpVWdjbTkzZDJselpTZ3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0ZSQlJDQTlJR1pwYm1SSmRITlVRVVFvWTJoeUxDQlVVMU1zSUhSaFpDa3BJQ1UrSlZ4dUlDQmtjbTl3WDI1aEtDa2dKVDRsWEc0Z0lHZHliM1Z3WDJKNUtGUkJSQ2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2hqYjNWdWRDQTlJRzRvS1NsY2JseHVJeU1qSUVOdmRXNTBhVzVuSUdWdWFHRnVZMlZ5WEc1Y2JtVnVhRU52ZFc1MFVHVnlWRUZFSUR3dElIQmxZV3N1U0ROTE1qZGhZeUFsUGlVZ2NtOTNkMmx6WlNncElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRlJCUkNBOUlHWnBibVJKZEhOVVFVUW9jMlZ4Ym1GdFpYTXNJR05sYm5SbGNpd2dkR0ZrS1NrZ0pUNGxYRzRnSUdSeWIzQmZibUVvS1NBbFBpVmNiaUFnWjNKdmRYQmZZbmtvVkVGRUtTQWxQaVZjYmlBZ2MzVnRiV0Z5YVhwbEtHTnZkVzUwSUQwZ2JpZ3BLVnh1WEc0akl5TWdSMlYwSUZSQlJDQnphWHBsZWx4dWRHRmtMbVJpSUR3dElIUmhaQ0FsUGlVZ2JHVm1kRjlxYjJsdUtHZGxibVZEYjNWdWRGQmxjbFJCUkN3Z1lua2dQU0JqS0Z3aWRHRmtTVVJjSWlBOUlGd2lWRUZFWENJcExDQXBJQ1UrSlZ4dUlDQnNaV1owWDJwdmFXNG9aVzVvUTI5MWJuUlFaWEpVUVVRc0lHSjVJRDBnWXloY0luUmhaRWxFWENJZ1BTQmNJbFJCUkZ3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWXlneExDQXlMQ0F6TENBM0xDQTRMQ0E1S1NrZ0pUNGxYRzRnSUcxMWRHRjBaVjloYkd3b2ZuSmxjR3hoWTJVb0xpd2dhWE11Ym1Fb0xpa3NJREFwS1Z4dVhHNWpiMnh1WVcxbGN5aDBZV1F1WkdJcElEd3RJR01vWENKamFISmNJaXdnWENKemRHRnlkRndpTENCY0ltVnVaRndpTENCY0luUmhaRWxFWENJc0lGd2laMlZ1WlVOdmRXNTBYQ0lzSUZ3aVpXNW9RMjkxYm5SY0lpbGNibHh1ZEdGa0xtUmlJRHd0SUhSaFpDNWtZaUFsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hjYmlBZ2RHRmtVMmw2WlNBOUlHVnVaQ0F0SUhOMFlYSjBMRnh1SUNCblpXNWxSR1Z1YzJsMGVTQTlJR2RsYm1WRGIzVnVkQzkwWVdSVGFYcGxJQ29nTVRBd1pUTXNYRzRnSUdWdWFFUmxibk5wZEhrZ1BTQmxibWhEYjNWdWRDOTBZV1JUYVhwbEtpQXhNREJsTXl4Y2JpQWdjbVZuUkdWdWMybDBlU0E5SUNoblpXNWxRMjkxYm5RZ0t5QmxibWhEYjNWdWRDa3ZkR0ZrVTJsNlpTb2dNVEF3WlROY2JpbGNibHh1WEc1Y2JpTWpJeUJCYzNOcFoyNGdWRUZFSUdGdVpDQnBibVp2Y20xaGRHbHZiaUIwYnlCblpXNWxYRzVuWlc1bExsUlRVeTUwWWlBOExTQm5aVzVsTGxSVFV5NTBZaUFsUGlVZ2NtOTNkMmx6WlNncElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRlJCUkNBOUlHWnBibVJKZEhOVVFVUW9ZMmh5TENCVVUxTXNJSFJoWkNrcFhHNGpaMlZ1WlM1VVUxTXVkR0lnUEMwZ1oyVnVaUzVVVTFNdWRHSWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9JV2x6TG01aEtGUkJSQ2twWEc1MFpXMXdJRHd0SUhSaFpDNWtZaUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2d0WXlneExDQXlMQ0F6S1NsY2JseHVaMlZ1WlM1VVUxTXVkR0lnUEMwZ1oyVnVaUzVVVTFNdWRHSWdKVDRsSUdSd2JIbHlPanBzWldaMFgycHZhVzRvZEdWdGNDd2dZbmtnUFNCaktGd2lWRUZFWENJZ1BTQmNJblJoWkVsRVhDSXBLVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbiMjIyBJTVBPUlRJTkcgUkVRVUlSRUQgREFUQVxuIyBJbXBvcnRpbmcgVEFEXG50YWQgPC0gZnJlYWQoaGVyZShcXC4uLy4uL3Jlc3VsdC9UQURcXCwgXFxUQURfMjVrYl8xMjVrYl9vdHN1X0cxRE1TTy5iZWRwZVxcKSlcbmNvbG5hbWVzKHRhZCkgPC0gYyhcXGNocjFcXCwgXFxzdGFydDFcXCwgXFxlbmQxXFwsIFxcY2hyMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXClcbnRhZCA8LSB0YWQgJT4lIGRwbHlyOjptdXRhdGUodGFkSUQgPSBwYXN0ZShjaHIxLCBzdGFydDEsIGVuZDEsIHNlcCA9IFxcX1xcKSlcblxuXG4jIEltcG9ydGluZyBnZW5lXG5nZW5lLlRTUy50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjYsIFY1LCBWMSwgVFNTKVxuY29sbmFtZXMoZ2VuZS5UU1MudGIpIDwtIGMoXFxlbnNlbWJsXFwsIFxcZ2VuZVxcLCBcXGNoclxcLCBcXFRTU1xcKVxuXG4jIEltcG9ydGluZyBlbmhhbmNlclxucGVhay5IM0syN2FjIDwtIGFzX3RpYmJsZShpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5uYXJyb3dQZWFrLmJlZFxcKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGNlbnRlciA9IChzdGFydCArIGVuZCkvMilcblxuXG4jIyMgRlVOQ1RJT04gRk9SIENPVU5USU5HXG5maW5kSXRzVEFEIDwtIGZ1bmN0aW9uKGNocm9tLCBjb29yZGluYXRlLCB0YWQpe1xuICB0ZW1wIDwtIHRhZCAlPiUgZHBseXI6OmZpbHRlcihjaHIxID09IGNocm9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDEgPCBjb29yZGluYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQxID4gY29vcmRpbmF0ZSlcbiAgaWYobnJvdyh0ZW1wKSA9PSAxKXtcbiAgICByZXR1cm4odGVtcCR0YWRJRClcbiAgfWVsc2V7XG4gICAgcmV0dXJuKE5BKVxuICB9XG59XG5cbiMjIyBDb3VudGluZyBlYWNoIGZlYXR1cmVzIGZvciBUQURcbiMjIyBDb3VudGluZyBnZW5lXG5nZW5lQ291bnRQZXJUQUQgPC0gZ2VuZS5UU1MudGIgJT4lIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUQUQgPSBmaW5kSXRzVEFEKGNociwgVFNTLCB0YWQpKSAlPiVcbiAgZHJvcF9uYSgpICU+JVxuICBncm91cF9ieShUQUQpICU+JVxuICBzdW1tYXJpemUoY291bnQgPSBuKCkpXG5cbiMjIyBDb3VudGluZyBlbmhhbmNlclxuXG5lbmhDb3VudFBlclRBRCA8LSBwZWFrLkgzSzI3YWMgJT4lIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUQUQgPSBmaW5kSXRzVEFEKHNlcW5hbWVzLCBjZW50ZXIsIHRhZCkpICU+JVxuICBkcm9wX25hKCkgJT4lXG4gIGdyb3VwX2J5KFRBRCkgJT4lXG4gIHN1bW1hcml6ZShjb3VudCA9IG4oKSlcblxuIyMjIEdldCBUQUQgc2l6ZXpcbnRhZC5kYiA8LSB0YWQgJT4lIGxlZnRfam9pbihnZW5lQ291bnRQZXJUQUQsIGJ5ID0gYyhcXHRhZElEXFwgPSBcXFRBRFxcKSwgKSAlPiVcbiAgbGVmdF9qb2luKGVuaENvdW50UGVyVEFELCBieSA9IGMoXFx0YWRJRFxcID0gXFxUQURcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNywgOCwgOSkpICU+JVxuICBtdXRhdGVfYWxsKH5yZXBsYWNlKC4sIGlzLm5hKC4pLCAwKSlcblxuY29sbmFtZXModGFkLmRiKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFx0YWRJRFxcLCBcXGdlbmVDb3VudFxcLCBcXGVuaENvdW50XFwpXG5cbnRhZC5kYiA8LSB0YWQuZGIgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHRhZFNpemUgPSBlbmQgLSBzdGFydCxcbiAgZ2VuZURlbnNpdHkgPSBnZW5lQ291bnQvdGFkU2l6ZSAqIDEwMGUzLFxuICBlbmhEZW5zaXR5ID0gZW5oQ291bnQvdGFkU2l6ZSogMTAwZTMsXG4gIHJlZ0RlbnNpdHkgPSAoZ2VuZUNvdW50ICsgZW5oQ291bnQpL3RhZFNpemUqIDEwMGUzXG4pXG5cblxuXG4jIyMgQXNzaWduIFRBRCBhbmQgaW5mb3JtYXRpb24gdG8gZ2VuZVxuZ2VuZS5UU1MudGIgPC0gZ2VuZS5UU1MudGIgJT4lIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUQUQgPSBmaW5kSXRzVEFEKGNociwgVFNTLCB0YWQpKVxuI2dlbmUuVFNTLnRiIDwtIGdlbmUuVFNTLnRiICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShUQUQpKVxudGVtcCA8LSB0YWQuZGIgJT4lIGRwbHlyOjpzZWxlY3QoLWMoMSwgMiwgMykpXG5cbmdlbmUuVFNTLnRiIDwtIGdlbmUuVFNTLnRiICU+JSBkcGx5cjo6bGVmdF9qb2luKHRlbXAsIGJ5ID0gYyhcXFRBRFxcID0gXFx0YWRJRFxcKSlcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
### IMPORTING REQUIRED DATA
# Importing TAD
tad <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_G1DMSO.bedpe\))
colnames(tad) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\)
tad <- tad %>% dplyr::mutate(tadID = paste(chr1, start1, end1, sep = \_\))


# Importing gene
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, V5, V1, TSS)
colnames(gene.TSS.tb) <- c(\ensembl\, \gene\, \chr\, \TSS\)

# Importing enhancer
peak.H3K27ac <- as_tibble(importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))) %>%
  dplyr::mutate(center = (start + end)/2)


### FUNCTION FOR COUNTING
findItsTAD <- function(chrom, coordinate, tad){
  temp <- tad %>% dplyr::filter(chr1 == chrom,
                                         start1 < coordinate,
                                         end1 > coordinate)
  if(nrow(temp) == 1){
    return(temp$tadID)
  }else{
    return(NA)
  }
}

### Counting each features for TAD
### Counting gene
geneCountPerTAD <- gene.TSS.tb %>% rowwise() %>%
  dplyr::mutate(TAD = findItsTAD(chr, TSS, tad)) %>%
  drop_na() %>%
  group_by(TAD) %>%
  summarize(count = n())

### Counting enhancer

enhCountPerTAD <- peak.H3K27ac %>% rowwise() %>%
  dplyr::mutate(TAD = findItsTAD(seqnames, center, tad)) %>%
  drop_na() %>%
  group_by(TAD) %>%
  summarize(count = n())

### Get TAD sizez
tad.db <- tad %>% left_join(geneCountPerTAD, by = c(\tadID\ = \TAD\), ) %>%
  left_join(enhCountPerTAD, by = c(\tadID\ = \TAD\)) %>%
  dplyr::select(c(1, 2, 3, 7, 8, 9)) %>%
  mutate_all(~replace(., is.na(.), 0))

colnames(tad.db) <- c(\chr\, \start\, \end\, \tadID\, \geneCount\, \enhCount\)

tad.db <- tad.db %>% dplyr::mutate(
  tadSize = end - start,
  geneDensity = geneCount/tadSize * 100e3,
  enhDensity = enhCount/tadSize* 100e3,
  regDensity = (geneCount + enhCount)/tadSize* 100e3
)



### Assign TAD and information to gene
gene.TSS.tb <- gene.TSS.tb %>% rowwise() %>%
  dplyr::mutate(TAD = findItsTAD(chr, TSS, tad))
#gene.TSS.tb <- gene.TSS.tb %>% dplyr::filter(!is.na(TAD))
temp <- tad.db %>% dplyr::select(-c(1, 2, 3))

gene.TSS.tb <- gene.TSS.tb %>% dplyr::left_join(temp, by = c(\TAD\ = \tadID\))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJRWxOVUU5U1ZFbE9SeUJTUlZGVlNWSkZSQ0JFUVZSQlhHNGpJRWx0Y0c5eWRHbHVaeUJVUVVSY2JuUmhaQ0E4TFNCbWNtVmhaQ2hvWlhKbEtGeGNMaTR2TGk0dmNtVnpkV3gwTDFSQlJGeGNMQ0JjWEZSQlJGOHlOV3RpWHpFeU5XdGlYMjkwYzNWZlJ6RkVUVk5QTG1KbFpIQmxYRndwS1Z4dVkyOXNibUZ0WlhNb2RHRmtLU0E4TFNCaktGeGNZMmh5TVZ4Y0xDQmNYSE4wWVhKME1WeGNMQ0JjWEdWdVpERmNYQ3dnWEZ4amFISXlYRndzSUZ4Y2MzUmhjblF5WEZ3c0lGeGNaVzVrTWx4Y0tWeHVkR0ZrSUR3dElIUmhaQ0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVdSSlJDQTlJSEJoYzNSbEtHTm9jakVzSUhOMFlYSjBNU3dnWlc1a01Td2djMlZ3SUQwZ1hGeGZYRndwS1Z4dVhHNWNiaU1nU1cxd2IzSjBhVzVuSUdkbGJtVmNibWRsYm1VdVZGTlRMblJpSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYRzF0TVRCZlIxSkRiVE00TG5BMlgyZGxibVZmYzI5eWRHVmtMbUpsWkZ4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvVkZOVElEMGdhV1psYkhObEtGWTBJRDA5SUZ4Y0sxeGNMQ0JXTWl3Z1ZqTXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENoV05pd2dWalVzSUZZeExDQlVVMU1wWEc1amIyeHVZVzFsY3loblpXNWxMbFJUVXk1MFlpa2dQQzBnWXloY1hHVnVjMlZ0WW14Y1hDd2dYRnhuWlc1bFhGd3NJRnhjWTJoeVhGd3NJRnhjVkZOVFhGd3BYRzVjYmlNZ1NXMXdiM0owYVc1bklHVnVhR0Z1WTJWeVhHNXdaV0ZyTGtnelN6STNZV01nUEMwZ1lYTmZkR2xpWW14bEtHbHRjRzl5ZEZCbFlXc29hR1Z5WlNoeVpXWkVhWElzSUZ4Y1IxTk5NalF6T0RRM05sOUZReTFFUnkwek5EVTRMVWd6U3pJM1FVTmZRVk5aVGw4eExtNWhjbkp2ZDFCbFlXc3VZbVZrWEZ3cEtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWTJWdWRHVnlJRDBnS0hOMFlYSjBJQ3NnWlc1a0tTOHlLVnh1WEc1Y2JpTWpJeUJHVlU1RFZFbFBUaUJHVDFJZ1EwOVZUbFJKVGtkY2JtWnBibVJKZEhOVVFVUWdQQzBnWm5WdVkzUnBiMjRvWTJoeWIyMHNJR052YjNKa2FXNWhkR1VzSUhSaFpDbDdYRzRnSUhSbGJYQWdQQzBnZEdGa0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHTm9jakVnUFQwZ1kyaHliMjBzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE4wWVhKME1TQThJR052YjNKa2FXNWhkR1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1Z1WkRFZ1BpQmpiMjl5WkdsdVlYUmxLVnh1SUNCcFppaHVjbTkzS0hSbGJYQXBJRDA5SURFcGUxeHVJQ0FnSUhKbGRIVnliaWgwWlcxd0pIUmhaRWxFS1Z4dUlDQjlaV3h6Wlh0Y2JpQWdJQ0J5WlhSMWNtNG9Ua0VwWEc0Z0lIMWNibjFjYmx4dUl5TWpJRU52ZFc1MGFXNW5JR1ZoWTJnZ1ptVmhkSFZ5WlhNZ1ptOXlJRlJCUkZ4dUl5TWpJRU52ZFc1MGFXNW5JR2RsYm1WY2JtZGxibVZEYjNWdWRGQmxjbFJCUkNBOExTQm5aVzVsTGxSVFV5NTBZaUFsUGlVZ2NtOTNkMmx6WlNncElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRlJCUkNBOUlHWnBibVJKZEhOVVFVUW9ZMmh5TENCVVUxTXNJSFJoWkNrcElDVStKVnh1SUNCa2NtOXdYMjVoS0NrZ0pUNGxYRzRnSUdkeWIzVndYMko1S0ZSQlJDa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaGpiM1Z1ZENBOUlHNG9LU2xjYmx4dUl5TWpJRU52ZFc1MGFXNW5JR1Z1YUdGdVkyVnlYRzVjYm1WdWFFTnZkVzUwVUdWeVZFRkVJRHd0SUhCbFlXc3VTRE5MTWpkaFl5QWxQaVVnY205M2QybHpaU2dwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGUkJSQ0E5SUdacGJtUkpkSE5VUVVRb2MyVnhibUZ0WlhNc0lHTmxiblJsY2l3Z2RHRmtLU2tnSlQ0bFhHNGdJR1J5YjNCZmJtRW9LU0FsUGlWY2JpQWdaM0p2ZFhCZllua29WRUZFS1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0dOdmRXNTBJRDBnYmlncEtWeHVYRzRqSXlNZ1IyVjBJRlJCUkNCemFYcGxlbHh1ZEdGa0xtUmlJRHd0SUhSaFpDQWxQaVVnYkdWbWRGOXFiMmx1S0dkbGJtVkRiM1Z1ZEZCbGNsUkJSQ3dnWW5rZ1BTQmpLRnhjZEdGa1NVUmNYQ0E5SUZ4Y1ZFRkVYRndwTENBcElDVStKVnh1SUNCc1pXWjBYMnB2YVc0b1pXNW9RMjkxYm5SUVpYSlVRVVFzSUdKNUlEMGdZeWhjWEhSaFpFbEVYRndnUFNCY1hGUkJSRnhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWd4TENBeUxDQXpMQ0EzTENBNExDQTVLU2tnSlQ0bFhHNGdJRzExZEdGMFpWOWhiR3dvZm5KbGNHeGhZMlVvTGl3Z2FYTXVibUVvTGlrc0lEQXBLVnh1WEc1amIyeHVZVzFsY3loMFlXUXVaR0lwSUR3dElHTW9YRnhqYUhKY1hDd2dYRnh6ZEdGeWRGeGNMQ0JjWEdWdVpGeGNMQ0JjWEhSaFpFbEVYRndzSUZ4Y1oyVnVaVU52ZFc1MFhGd3NJRnhjWlc1b1EyOTFiblJjWENsY2JseHVkR0ZrTG1SaUlEd3RJSFJoWkM1a1lpQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnZEdGa1UybDZaU0E5SUdWdVpDQXRJSE4wWVhKMExGeHVJQ0JuWlc1bFJHVnVjMmwwZVNBOUlHZGxibVZEYjNWdWRDOTBZV1JUYVhwbElDb2dNVEF3WlRNc1hHNGdJR1Z1YUVSbGJuTnBkSGtnUFNCbGJtaERiM1Z1ZEM5MFlXUlRhWHBsS2lBeE1EQmxNeXhjYmlBZ2NtVm5SR1Z1YzJsMGVTQTlJQ2huWlc1bFEyOTFiblFnS3lCbGJtaERiM1Z1ZENrdmRHRmtVMmw2WlNvZ01UQXdaVE5jYmlsY2JseHVYRzVjYmlNakl5QkJjM05wWjI0Z1ZFRkVJR0Z1WkNCcGJtWnZjbTFoZEdsdmJpQjBieUJuWlc1bFhHNW5aVzVsTGxSVFV5NTBZaUE4TFNCblpXNWxMbFJUVXk1MFlpQWxQaVVnY205M2QybHpaU2dwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGUkJSQ0E5SUdacGJtUkpkSE5VUVVRb1kyaHlMQ0JVVTFNc0lIUmhaQ2twWEc0aloyVnVaUzVVVTFNdWRHSWdQQzBnWjJWdVpTNVVVMU11ZEdJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb0lXbHpMbTVoS0ZSQlJDa3BYRzUwWlcxd0lEd3RJSFJoWkM1a1lpQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDZ3RZeWd4TENBeUxDQXpLU2xjYmx4dVoyVnVaUzVVVTFNdWRHSWdQQzBnWjJWdVpTNVVVMU11ZEdJZ0pUNGxJR1J3YkhseU9qcHNaV1owWDJwdmFXNG9kR1Z0Y0N3Z1lua2dQU0JqS0Z4Y1ZFRkVYRndnUFNCY1hIUmhaRWxFWEZ3cEtWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG4jIyMgSU1QT1JUSU5HIFJFUVVJUkVEIERBVEFcbiMgSW1wb3J0aW5nIFRBRFxudGFkIDwtIGZyZWFkKGhlcmUoXFwuLi8uLi9yZXN1bHQvVEFEXFwsIFxcVEFEXzI1a2JfMTI1a2Jfb3RzdV9HMURNU08uYmVkcGVcXCkpXG5jb2xuYW1lcyh0YWQpIDwtIGMoXFxjaHIxXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocjJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwpXG50YWQgPC0gdGFkICU+JSBkcGx5cjo6bXV0YXRlKHRhZElEID0gcGFzdGUoY2hyMSwgc3RhcnQxLCBlbmQxLCBzZXAgPSBcXF9cXCkpXG5cblxuIyBJbXBvcnRpbmcgZ2VuZVxuZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMykpICU+JVxuICBkcGx5cjo6c2VsZWN0KFY2LCBWNSwgVjEsIFRTUylcbmNvbG5hbWVzKGdlbmUuVFNTLnRiKSA8LSBjKFxcZW5zZW1ibFxcLCBcXGdlbmVcXCwgXFxjaHJcXCwgXFxUU1NcXClcblxuIyBJbXBvcnRpbmcgZW5oYW5jZXJcbnBlYWsuSDNLMjdhYyA8LSBhc190aWJibGUoaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWRcXCkpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShjZW50ZXIgPSAoc3RhcnQgKyBlbmQpLzIpXG5cblxuIyMjIEZVTkNUSU9OIEZPUiBDT1VOVElOR1xuZmluZEl0c1RBRCA8LSBmdW5jdGlvbihjaHJvbSwgY29vcmRpbmF0ZSwgdGFkKXtcbiAgdGVtcCA8LSB0YWQgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyMSA9PSBjaHJvbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQxIDwgY29vcmRpbmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kMSA+IGNvb3JkaW5hdGUpXG4gIGlmKG5yb3codGVtcCkgPT0gMSl7XG4gICAgcmV0dXJuKHRlbXAkdGFkSUQpXG4gIH1lbHNle1xuICAgIHJldHVybihOQSlcbiAgfVxufVxuXG4jIyMgQ291bnRpbmcgZWFjaCBmZWF0dXJlcyBmb3IgVEFEXG4jIyMgQ291bnRpbmcgZ2VuZVxuZ2VuZUNvdW50UGVyVEFEIDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVEFEID0gZmluZEl0c1RBRChjaHIsIFRTUywgdGFkKSkgJT4lXG4gIGRyb3BfbmEoKSAlPiVcbiAgZ3JvdXBfYnkoVEFEKSAlPiVcbiAgc3VtbWFyaXplKGNvdW50ID0gbigpKVxuXG4jIyMgQ291bnRpbmcgZW5oYW5jZXJcblxuZW5oQ291bnRQZXJUQUQgPC0gcGVhay5IM0syN2FjICU+JSByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVEFEID0gZmluZEl0c1RBRChzZXFuYW1lcywgY2VudGVyLCB0YWQpKSAlPiVcbiAgZHJvcF9uYSgpICU+JVxuICBncm91cF9ieShUQUQpICU+JVxuICBzdW1tYXJpemUoY291bnQgPSBuKCkpXG5cbiMjIyBHZXQgVEFEIHNpemV6XG50YWQuZGIgPC0gdGFkICU+JSBsZWZ0X2pvaW4oZ2VuZUNvdW50UGVyVEFELCBieSA9IGMoXFx0YWRJRFxcID0gXFxUQURcXCksICkgJT4lXG4gIGxlZnRfam9pbihlbmhDb3VudFBlclRBRCwgYnkgPSBjKFxcdGFkSURcXCA9IFxcVEFEXFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDcsIDgsIDkpKSAlPiVcbiAgbXV0YXRlX2FsbCh+cmVwbGFjZSguLCBpcy5uYSguKSwgMCkpXG5cbmNvbG5hbWVzKHRhZC5kYikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcdGFkSURcXCwgXFxnZW5lQ291bnRcXCwgXFxlbmhDb3VudFxcKVxuXG50YWQuZGIgPC0gdGFkLmRiICU+JSBkcGx5cjo6bXV0YXRlKFxuICB0YWRTaXplID0gZW5kIC0gc3RhcnQsXG4gIGdlbmVEZW5zaXR5ID0gZ2VuZUNvdW50L3RhZFNpemUgKiAxMDBlMyxcbiAgZW5oRGVuc2l0eSA9IGVuaENvdW50L3RhZFNpemUqIDEwMGUzLFxuICByZWdEZW5zaXR5ID0gKGdlbmVDb3VudCArIGVuaENvdW50KS90YWRTaXplKiAxMDBlM1xuKVxuXG5cblxuIyMjIEFzc2lnbiBUQUQgYW5kIGluZm9ybWF0aW9uIHRvIGdlbmVcbmdlbmUuVFNTLnRiIDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVEFEID0gZmluZEl0c1RBRChjaHIsIFRTUywgdGFkKSlcbiNnZW5lLlRTUy50YiA8LSBnZW5lLlRTUy50YiAlPiUgZHBseXI6OmZpbHRlcighaXMubmEoVEFEKSlcbnRlbXAgPC0gdGFkLmRiICU+JSBkcGx5cjo6c2VsZWN0KC1jKDEsIDIsIDMpKVxuXG5nZW5lLlRTUy50YiA8LSBnZW5lLlRTUy50YiAlPiUgZHBseXI6OmxlZnRfam9pbih0ZW1wLCBieSA9IGMoXFxUQURcXCA9IFxcdGFkSURcXCkpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIElNUE9SVElORyBSRVFVSVJFRCBEQVRBXG4jIEltcG9ydGluZyBUQURcbnRhZCA8LSBmcmVhZChoZXJlKFxcLi4vLi4vcmVzdWx0L1RBRFxcLCBcXFRBRF8yNWtiXzEyNWtiX290c3VfRzFETVNPLmJlZHBlXFwpKVxuY29sbmFtZXModGFkKSA8LSBjKFxcY2hyMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHIyXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcKVxudGFkIDwtIHRhZCAlPiUgZHBseXI6Om11dGF0ZSh0YWRJRCA9IHBhc3RlKGNocjEsIHN0YXJ0MSwgZW5kMSwgc2VwID0gXFxfXFwpKVxuXG5cbiMgSW1wb3J0aW5nIGdlbmVcbmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWNiwgVjUsIFYxLCBUU1MpXG5jb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYyhcXGVuc2VtYmxcXCwgXFxnZW5lXFwsIFxcY2hyXFwsIFxcVFNTXFwpXG5cbiMgSW1wb3J0aW5nIGVuaGFuY2VyXG5wZWFrLkgzSzI3YWMgPC0gYXNfdGliYmxlKGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkXFwpKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKVxuXG5cbiMjIyBGVU5DVElPTiBGT1IgQ09VTlRJTkdcbmZpbmRJdHNUQUQgPC0gZnVuY3Rpb24oY2hyb20sIGNvb3JkaW5hdGUsIHRhZCl7XG4gIHRlbXAgPC0gdGFkICU+JSBkcGx5cjo6ZmlsdGVyKGNocjEgPT0gY2hyb20sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0MSA8IGNvb3JkaW5hdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDEgPiBjb29yZGluYXRlKVxuICBpZihucm93KHRlbXApID09IDEpe1xuICAgIHJldHVybih0ZW1wJHRhZElEKVxuICB9ZWxzZXtcbiAgICByZXR1cm4oTkEpXG4gIH1cbn1cblxuIyMjIENvdW50aW5nIGVhY2ggZmVhdHVyZXMgZm9yIFRBRFxuIyMjIENvdW50aW5nIGdlbmVcbmdlbmVDb3VudFBlclRBRCA8LSBnZW5lLlRTUy50YiAlPiUgcm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRBRCA9IGZpbmRJdHNUQUQoY2hyLCBUU1MsIHRhZCkpICU+JVxuICBkcm9wX25hKCkgJT4lXG4gIGdyb3VwX2J5KFRBRCkgJT4lXG4gIHN1bW1hcml6ZShjb3VudCA9IG4oKSlcblxuIyMjIENvdW50aW5nIGVuaGFuY2VyXG5cbmVuaENvdW50UGVyVEFEIDwtIHBlYWsuSDNLMjdhYyAlPiUgcm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRBRCA9IGZpbmRJdHNUQUQoc2VxbmFtZXMsIGNlbnRlciwgdGFkKSkgJT4lXG4gIGRyb3BfbmEoKSAlPiVcbiAgZ3JvdXBfYnkoVEFEKSAlPiVcbiAgc3VtbWFyaXplKGNvdW50ID0gbigpKVxuXG4jIyMgR2V0IFRBRCBzaXplelxudGFkLmRiIDwtIHRhZCAlPiUgbGVmdF9qb2luKGdlbmVDb3VudFBlclRBRCwgYnkgPSBjKFxcdGFkSURcXCA9IFxcVEFEXFwpLCApICU+JVxuICBsZWZ0X2pvaW4oZW5oQ291bnRQZXJUQUQsIGJ5ID0gYyhcXHRhZElEXFwgPSBcXFRBRFxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA3LCA4LCA5KSkgJT4lXG4gIG11dGF0ZV9hbGwofnJlcGxhY2UoLiwgaXMubmEoLiksIDApKVxuXG5jb2xuYW1lcyh0YWQuZGIpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXHRhZElEXFwsIFxcZ2VuZUNvdW50XFwsIFxcZW5oQ291bnRcXClcblxudGFkLmRiIDwtIHRhZC5kYiAlPiUgZHBseXI6Om11dGF0ZShcbiAgdGFkU2l6ZSA9IGVuZCAtIHN0YXJ0LFxuICBnZW5lRGVuc2l0eSA9IGdlbmVDb3VudC90YWRTaXplICogMTAwZTMsXG4gIGVuaERlbnNpdHkgPSBlbmhDb3VudC90YWRTaXplKiAxMDBlMyxcbiAgcmVnRGVuc2l0eSA9IChnZW5lQ291bnQgKyBlbmhDb3VudCkvdGFkU2l6ZSogMTAwZTNcbilcblxuXG5cbiMjIyBBc3NpZ24gVEFEIGFuZCBpbmZvcm1hdGlvbiB0byBnZW5lXG5nZW5lLlRTUy50YiA8LSBnZW5lLlRTUy50YiAlPiUgcm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRBRCA9IGZpbmRJdHNUQUQoY2hyLCBUU1MsIHRhZCkpXG4jZ2VuZS5UU1MudGIgPC0gZ2VuZS5UU1MudGIgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKFRBRCkpXG50ZW1wIDwtIHRhZC5kYiAlPiUgZHBseXI6OnNlbGVjdCgtYygxLCAyLCAzKSlcblxuZ2VuZS5UU1MudGIgPC0gZ2VuZS5UU1MudGIgJT4lIGRwbHlyOjpsZWZ0X2pvaW4odGVtcCwgYnkgPSBjKFxcVEFEXFwgPSBcXHRhZElEXFwpKVxuYGBgXG5gYGAifQ== -->

```r
```r
### IMPORTING REQUIRED DATA
# Importing TAD
tad <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_G1DMSO.bedpe\))
colnames(tad) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\)
tad <- tad %>% dplyr::mutate(tadID = paste(chr1, start1, end1, sep = \_\))


# Importing gene
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, V5, V1, TSS)
colnames(gene.TSS.tb) <- c(\ensembl\, \gene\, \chr\, \TSS\)

# Importing enhancer
peak.H3K27ac <- as_tibble(importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))) %>%
  dplyr::mutate(center = (start + end)/2)


### FUNCTION FOR COUNTING
findItsTAD <- function(chrom, coordinate, tad){
  temp <- tad %>% dplyr::filter(chr1 == chrom,
                                         start1 < coordinate,
                                         end1 > coordinate)
  if(nrow(temp) == 1){
    return(temp$tadID)
  }else{
    return(NA)
  }
}

### Counting each features for TAD
### Counting gene
geneCountPerTAD <- gene.TSS.tb %>% rowwise() %>%
  dplyr::mutate(TAD = findItsTAD(chr, TSS, tad)) %>%
  drop_na() %>%
  group_by(TAD) %>%
  summarize(count = n())

### Counting enhancer

enhCountPerTAD <- peak.H3K27ac %>% rowwise() %>%
  dplyr::mutate(TAD = findItsTAD(seqnames, center, tad)) %>%
  drop_na() %>%
  group_by(TAD) %>%
  summarize(count = n())

### Get TAD sizez
tad.db <- tad %>% left_join(geneCountPerTAD, by = c(\tadID\ = \TAD\), ) %>%
  left_join(enhCountPerTAD, by = c(\tadID\ = \TAD\)) %>%
  dplyr::select(c(1, 2, 3, 7, 8, 9)) %>%
  mutate_all(~replace(., is.na(.), 0))

colnames(tad.db) <- c(\chr\, \start\, \end\, \tadID\, \geneCount\, \enhCount\)

tad.db <- tad.db %>% dplyr::mutate(
  tadSize = end - start,
  geneDensity = geneCount/tadSize * 100e3,
  enhDensity = enhCount/tadSize* 100e3,
  regDensity = (geneCount + enhCount)/tadSize* 100e3
)



### Assign TAD and information to gene
gene.TSS.tb <- gene.TSS.tb %>% rowwise() %>%
  dplyr::mutate(TAD = findItsTAD(chr, TSS, tad))
#gene.TSS.tb <- gene.TSS.tb %>% dplyr::filter(!is.na(TAD))
temp <- tad.db %>% dplyr::select(-c(1, 2, 3))

gene.TSS.tb <- gene.TSS.tb %>% dplyr::left_join(temp, by = c(\TAD\ = \tadID\))
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



##### Plotting for groups

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhDSXBLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNaTUwYzNaY0lpa3BKR2RsYm1WY2JseHVYRzVuWlc1bExsUlRVeTUwWWk1d2JHOTBJRHd0SUdkbGJtVXVWRk5UTG5SaUlDVStKU0J5YjNkM2FYTmxLQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lHZHliM1Z3SUQwZ2FXWmxiSE5sS0dWdWMyVnRZbXdnSldsdUpTQm5jbTkxY0RFc0lGd2laM0p2ZFhBeFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnWjNKdmRYQXlMQ0JjSW1keWIzVndNbHdpTENCT1FTa3BLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcG1hV3gwWlhJb0lXbHpMbTVoS0dkeWIzVndLU2xjYmx4dVhHNGpJeUJuWlc1bFEyOTFiblJjYm1kbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXhLU0FwSkdkbGJtVkRiM1Z1ZEZ4dUlDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdaM0p2ZFhBeUtTQXBKR2RsYm1WRGIzVnVkRnh1SUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JuMWNibHh1WEc1d2JHOTBYMmRsYm1WRGIzVnVkQ0E4TFNCbWRXNWpkR2x2YmloMFpXMXdMblJpTENCdWIzUmxMQ0I1YldsdUlEMGdNQ3dnZVcxaGVDQTlJREl3TURBd01EQXBlMXh1SUNCd01USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLU3dnTlNsY2JpQWdYRzRnSUhBZ1BDMGdaMmR3Ykc5MEtIUmxiWEF1ZEdJc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQm5aVzVsUTI5MWJuUXBLU0FySUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdaM0p2ZFhBcExDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FySUZ4dUlDQWdJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU1Td2diM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJLU0FyWEc0Z0lDQWdjM1JoZEY5emRXMXRZWEo1S0dGbGN5aG5jbTkxY0NBOUlHZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpd2daMlZ2YlNBOUlGd2ljRzlwYm5SY0lpd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJRElzSUdacGJHd2dQU0JjSW5KbFpGd2lMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaWtnSzF4dUlDQWdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJYRzRnSUNBZ1lXNXViM1JoZEdVb1hDSjBaWGgwWENJc0lIZ2dQU0F4TENCNUlEMGdLSGx0YVc0Z0t5QjViV0Y0S1M4eUlDc2dNU3dnYkdGaVpXd2dQU0J3WVhOMFpUQW9YQ0p3TVRJNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeE1pa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxDQm9hblZ6ZENBOUlEQXNJSE5wZW1VZ1BTQXpLVnh1SUNCY2JpQWdYRzRnSUdacGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0ltZGxibVZEYjNWdWRGOWNJaXdnYm05MFpTbGNiaUFnYUdWcFoyaDBJRHd0SUROY2JpQWdkMmxrZEdnZ1BDMGdNUzQxWEc0Z0lIQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUhOMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpQWdjSEpwYm5Rb2NDbGNiaUFnWkdWMkxtOW1aaWdwWEc1OVhHNXdiRzkwWDJkbGJtVkRiM1Z1ZENoblpXNWxMbFJUVXk1MFlpNXdiRzkwTENCY0ltZHliM1Z3WDJKcGJtRnllVWR5YjNWd1hDSXNJSGx0WVhnZ1BTQXlNREFwWEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5cbmdlbmUuVFNTLnRiLnBsb3QgPC0gZ2VuZS5UU1MudGIgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDIsIFxcZ3JvdXAyXFwsIE5BKSkpICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbiMjIGdlbmVDb3VudFxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZ2VuZUNvdW50XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZ2VuZUNvdW50XG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnBsb3RfZ2VuZUNvdW50IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IGdlbmVDb3VudCkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZ2VuZUNvdW50X1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAxLjVcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbnBsb3RfZ2VuZUNvdW50KGdlbmUuVFNTLnRiLnBsb3QsIFxcZ3JvdXBfYmluYXJ5R3JvdXBcXCwgeW1heCA9IDIwMClcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.TSS.tb.plot <- gene.TSS.tb %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\, NA))) %>% 
  dplyr::filter(!is.na(group))


## geneCount
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$geneCount
  distance2 <- (data %>% dplyr::filter(group == group2) )$geneCount
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_geneCount <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = geneCount)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12)),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\geneCount_\, note)
  height <- 3
  width <- 1.5
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_geneCount(gene.TSS.tb.plot, \group_binaryGroup\, ymax = 200)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNERXVkSE4yWEZ3cEtTUm5aVzVsWEc1bmNtOTFjRElnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJKcGJtRnllVWR5YjNWd01pNTBjM1pjWENrcEpHZGxibVZjYmx4dVhHNW5aVzVsTGxSVFV5NTBZaTV3Ykc5MElEd3RJR2RsYm1VdVZGTlRMblJpSUNVK0pTQnliM2QzYVhObEtDa2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9YRzRnSUdkeWIzVndJRDBnYVdabGJITmxLR1Z1YzJWdFltd2dKV2x1SlNCbmNtOTFjREVzSUZ4Y1ozSnZkWEF4WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdaM0p2ZFhBeUxDQmNYR2R5YjNWd01seGNMQ0JPUVNrcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvSVdsekxtNWhLR2R5YjNWd0tTbGNibHh1WEc0akl5Qm5aVzVsUTI5MWJuUmNibWRsZEZCMllXeFhhV3hqYjNnZ1BDMGdablZ1WTNScGIyNG9aR0YwWVN3Z1ozSnZkWEF4TENCbmNtOTFjRElwZTF4dUlDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdaM0p2ZFhBeEtTQXBKR2RsYm1WRGIzVnVkRnh1SUNCa2FYTjBZVzVqWlRJZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1ozSnZkWEF5S1NBcEpHZGxibVZEYjNWdWRGeHVJQ0IzYVd3Z1BDMGdkMmxzWTI5NExuUmxjM1FvWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcFhHNGdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYm4xY2JseHVYRzV3Ykc5MFgyZGxibVZEYjNWdWRDQThMU0JtZFc1amRHbHZiaWgwWlcxd0xuUmlMQ0J1YjNSbExDQjViV2x1SUQwZ01Dd2dlVzFoZUNBOUlESXdNREF3TURBcGUxeHVJQ0J3TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tTd2dOU2xjYmlBZ1hHNGdJSEFnUEMwZ1oyZHdiRzkwS0hSbGJYQXVkR0lzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCblpXNWxRMjkxYm5RcEtTQXJJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ1ozSnZkWEFwTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJJRnh1SUNBZ0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJYRzRnSUNBZ2MzUmhkRjl6ZFcxdFlYSjVLR0ZsY3lobmNtOTFjQ0E5SUdkeWIzVndLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ4Y2NHOXBiblJjWEN3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNYSEpsWkZ4Y0xDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDa2dLMXh1SUNBZ0lIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJQ0FnWVc1dWIzUmhkR1VvWEZ4MFpYaDBYRndzSUhnZ1BTQXhMQ0I1SUQwZ0tIbHRhVzRnS3lCNWJXRjRLUzh5SUNzZ01Td2diR0ZpWld3Z1BTQndZWE4wWlRBb1hGeHdNVEk2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF4TWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektWeHVJQ0JjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEdkbGJtVkRiM1Z1ZEY5Y1hDd2dibTkwWlNsY2JpQWdhR1ZwWjJoMElEd3RJRE5jYmlBZ2QybGtkR2dnUEMwZ01TNDFYRzRnSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzU5WEc1d2JHOTBYMmRsYm1WRGIzVnVkQ2huWlc1bExsUlRVeTUwWWk1d2JHOTBMQ0JjWEdkeWIzVndYMkpwYm1GeWVVZHliM1Z3WEZ3c0lIbHRZWGdnUFNBeU1EQXBYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLlRTUy50Yi5wbG90IDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAyLCBcXGdyb3VwMlxcLCBOQSkpKSAlPiUgXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuXG4jIyBnZW5lQ291bnRcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGdlbmVDb3VudFxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJGdlbmVDb3VudFxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X2dlbmVDb3VudCA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBnZW5lQ291bnQpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMikpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGdlbmVDb3VudF9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gMS41XG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5wbG90X2dlbmVDb3VudChnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwX2JpbmFyeUdyb3VwXFwsIHltYXggPSAyMDApXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLlRTUy50Yi5wbG90IDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAyLCBcXGdyb3VwMlxcLCBOQSkpKSAlPiUgXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuXG4jIyBnZW5lQ291bnRcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGdlbmVDb3VudFxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJGdlbmVDb3VudFxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X2dlbmVDb3VudCA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBnZW5lQ291bnQpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMikpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGdlbmVDb3VudF9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gMS41XG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5wbG90X2dlbmVDb3VudChnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwX2JpbmFyeUdyb3VwXFwsIHltYXggPSAyMDApXG5cbmBgYFxuYGBgIn0= -->

```r
```r
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.TSS.tb.plot <- gene.TSS.tb %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\, NA))) %>% 
  dplyr::filter(!is.na(group))


## geneCount
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$geneCount
  distance2 <- (data %>% dplyr::filter(group == group2) )$geneCount
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_geneCount <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = geneCount)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12)),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\geneCount_\, note)
  height <- 3
  width <- 1.5
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_geneCount(gene.TSS.tb.plot, \group_binaryGroup\, ymax = 200)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## [2.17] Checking the density of gene / enhancer within designated TAD
#### Making TAD gene count

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RFdWRITjJYQ0lwS1NSblpXNWxYRzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd01pNTBjM1pjSWlrcEpHZGxibVZjYm1keWIzVndOU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSm5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQTFMblJ6ZGx3aUtTa2taMlZ1WlZ4dVozSnZkWEE0SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbWRsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjRGd1ZEhOMlhDSXBLU1JuWlc1bFhHNWNibHh1WjJWdVpTNVVVMU11ZEdJdWNHeHZkQ0E4TFNCblpXNWxMbFJUVXk1MFlpQWxQaVVnY205M2QybHpaU2dwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQm5jbTkxY0NBOUlHbG1aV3h6WlNobGJuTmxiV0pzSUNWcGJpVWdaM0p2ZFhBeExDQmNJbWR5YjNWd01Wd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aVzV6WlcxaWJDQWxhVzRsSUdkeWIzVndNaXdnWENKbmNtOTFjREpjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEExTENCY0ltZHliM1Z3TlZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEE0TENCY0ltZHliM1Z3T0Z3aUxDQk9RU2twS1NrcElDVStKU0JjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWdoYVhNdWJtRW9aM0p2ZFhBcEtWeHVYRzVjYmlNaklHZGxibVZEYjNWdWRGeHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQm5jbTkxY0RFcElDa2taMlZ1WlVOdmRXNTBYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCbmNtOTFjRElwSUNra1oyVnVaVU52ZFc1MFhHNGdJSGRwYkNBOExTQjNhV3hqYjNndWRHVnpkQ2hrYVhOMFlXNWpaVEVzSUdScGMzUmhibU5sTWlsY2JpQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1ZlZ4dVhHNWNibkJzYjNSZloyVnVaVU52ZFc1MElEd3RJR1oxYm1OMGFXOXVLSFJsYlhBdWRHSXNJRzV2ZEdVc0lIbHRhVzRnUFNBd0xDQjViV0Y0SUQwZ01qQXdNREF3TUNsN1hHNGdJSEF4TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRndpWjNKdmRYQXhYQ0lzSUZ3aVozSnZkWEF5WENJcExDQTFLVnh1SUNCd01UVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd05Wd2lLU3dnTlNsY2JpQWdjREU0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYQ0puY205MWNERmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzRnSUhBeU5TQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ3aVozSnZkWEF5WENJc0lGd2laM0p2ZFhBMVhDSXBMQ0ExS1Z4dUlDQndNamdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbWR5YjNWd01sd2lMQ0JjSW1keWIzVndPRndpS1N3Z05TbGNiaUFnY0RVNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWENKbmNtOTFjRFZjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc0Z0lGeHVJQ0J3SUR3dElHZG5jR3h2ZENoMFpXMXdMblJpTENCaFpYTW9lQ0E5SUdkeWIzVndMQ0I1SUQwZ1oyVnVaVU52ZFc1MEtTa2dLeUJuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlHZHliM1Z3S1N3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ0lDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLMXh1SUNBZ0lITjBZWFJmYzNWdGJXRnllU2hoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c0lHZGxiMjBnUFNCY0luQnZhVzUwWENJc0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXlMQ0JtYVd4c0lEMGdYQ0p5WldSY0lpd2dZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXBJQ3RjYmlBZ0lDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJQ0FnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdNU3dnZVNBOUlDaDViV2x1SUNzZ2VXMWhlQ2t2TWlBcklERXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGd2ljREV5T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3TVRJcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd01UVTZJRndpTENCamIyNTJVSFpoYkhWbEtIQXhOU2tzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkF4T0RvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0RFNEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNESTFPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNalVwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3TWpnNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeU9Da3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQTFPRG9nWENJc1kyOXVkbEIyWVd4MVpTZ2djRFU0S1N3Z1hDSmNYRzVjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzSUdocWRYTjBJRDBnTUN3Z2MybDZaU0E5SURNcFhHNGdJRnh1SUNCY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpWjJWdVpVTnZkVzUwWDF3aUxDQnViM1JsS1Z4dUlDQm9aV2xuYUhRZ1BDMGdNMXh1SUNCM2FXUjBhQ0E4TFNBelhHNGdJSEJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpQWdjSEpwYm5Rb2NDbGNiaUFnWkdWMkxtOW1aaWdwWEc0Z0lITjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNTlYRzV3Ykc5MFgyZGxibVZEYjNWdWRDaG5aVzVsTGxSVFV5NTBZaTV3Ykc5MExDQmNJbWR5YjNWd1hDSXNJSGx0WVhnZ1BTQXlNREFwWEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAyLnRzdlxcKSkkZ2VuZVxuZ3JvdXA1IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDUudHN2XFwpKSRnZW5lXG5ncm91cDggPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwOC50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLlRTUy50Yi5wbG90IDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAyLCBcXGdyb3VwMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDgsIFxcZ3JvdXA4XFwsIE5BKSkpKSkgJT4lIFxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cblxuIyMgZ2VuZUNvdW50XG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRnZW5lQ291bnRcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRnZW5lQ291bnRcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9nZW5lQ291bnQgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXtcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gIHAxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDVcXCksIDUpXG4gIHAyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwNTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwNVxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBnZW5lQ291bnQpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNTogXFwsIGNvbnZQdmFsdWUocDE1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE4OiBcXCwgY29udlB2YWx1ZShwMTgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyODogXFwsIGNvbnZQdmFsdWUocDI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDU4OiBcXCxjb252UHZhbHVlKCBwNTgpLCBcXFxcblxcKSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxnZW5lQ291bnRfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbnBsb3RfZ2VuZUNvdW50KGdlbmUuVFNTLnRiLnBsb3QsIFxcZ3JvdXBcXCwgeW1heCA9IDIwMClcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene


gene.TSS.tb.plot <- gene.TSS.tb %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\,
                        ifelse(ensembl %in% group5, \group5\,
                               ifelse(ensembl %in% group8, \group8\, NA))))) %>% 
  dplyr::filter(!is.na(group))


## geneCount
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$geneCount
  distance2 <- (data %>% dplyr::filter(group == group2) )$geneCount
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_geneCount <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = geneCount)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\geneCount_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_geneCount(gene.TSS.tb.plot, \group\, ymax = 200)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjREV1ZEhOMlhGd3BLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3TWk1MGMzWmNYQ2twSkdkbGJtVmNibWR5YjNWd05TQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4blpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBMUxuUnpkbHhjS1Nra1oyVnVaVnh1WjNKdmRYQTRJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNEZ3VkSE4yWEZ3cEtTUm5aVzVsWEc1Y2JseHVaMlZ1WlM1VVUxTXVkR0l1Y0d4dmRDQThMU0JuWlc1bExsUlRVeTUwWWlBbFBpVWdjbTkzZDJselpTZ3BJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNCbmNtOTFjQ0E5SUdsbVpXeHpaU2hsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEF4TENCY1hHZHliM1Z3TVZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd01pd2dYRnhuY205MWNESmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnWjNKdmRYQTFMQ0JjWEdkeWIzVndOVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGxibk5sYldKc0lDVnBiaVVnWjNKdmRYQTRMQ0JjWEdkeWIzVndPRnhjTENCT1FTa3BLU2twSUNVK0pTQmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpZ2hhWE11Ym1Fb1ozSnZkWEFwS1Z4dVhHNWNiaU1qSUdkbGJtVkRiM1Z1ZEZ4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCbmNtOTFjREVwSUNra1oyVnVaVU52ZFc1MFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JuY205MWNESXBJQ2trWjJWdVpVTnZkVzUwWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WEc1Y2JuQnNiM1JmWjJWdVpVTnZkVzUwSUR3dElHWjFibU4wYVc5dUtIUmxiWEF1ZEdJc0lHNXZkR1VzSUhsdGFXNGdQU0F3TENCNWJXRjRJRDBnTWpBd01EQXdNQ2w3WEc0Z0lIQXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGeGNaM0p2ZFhBeFhGd3NJRnhjWjNKdmRYQXlYRndwTENBMUtWeHVJQ0J3TVRVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TlZ4Y0tTd2dOU2xjYmlBZ2NERTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNGdJSEF5TlNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRnhjWjNKdmRYQXlYRndzSUZ4Y1ozSnZkWEExWEZ3cExDQTFLVnh1SUNCd01qZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hHZHliM1Z3TWx4Y0xDQmNYR2R5YjNWd09GeGNLU3dnTlNsY2JpQWdjRFU0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYRnhuY205MWNEVmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzRnSUZ4dUlDQndJRHd0SUdkbmNHeHZkQ2gwWlcxd0xuUmlMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnWjJWdVpVTnZkVzUwS1NrZ0t5Qm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUdkeWIzVndLU3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnSUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMakVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0sxeHVJQ0FnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0JuY205MWNDa3NJR1oxYmlBOUlHMWxZVzRzSUdkbGIyMGdQU0JjWEhCdmFXNTBYRndzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBeUxDQm1hV3hzSUQwZ1hGeHlaV1JjWEN3Z1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3cElDdGNiaUFnSUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQWdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ01Td2dlU0E5SUNoNWJXbHVJQ3NnZVcxaGVDa3ZNaUFySURFc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z4Y2NERXlPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdNVElwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3TVRVNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hBeE5Ta3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQXhPRG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jREU0S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0RJMU9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod01qVXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdNamc2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF5T0Nrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhBMU9Eb2dYRndzWTI5dWRsQjJZV3gxWlNnZ2NEVTRLU3dnWEZ4Y1hHNWNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wWEc0Z0lGeHVJQ0JjYmlBZ1ptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNaMlZ1WlVOdmRXNTBYMXhjTENCdWIzUmxLVnh1SUNCb1pXbG5hSFFnUEMwZ00xeHVJQ0IzYVdSMGFDQThMU0F6WEc0Z0lIQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUhOMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpQWdjSEpwYm5Rb2NDbGNiaUFnWkdWMkxtOW1aaWdwWEc1OVhHNXdiRzkwWDJkbGJtVkRiM1Z1ZENoblpXNWxMbFJUVXk1MFlpNXdiRzkwTENCY1hHZHliM1Z3WEZ3c0lIbHRZWGdnUFNBeU1EQXBYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCkpJGdlbmVcbmdyb3VwNSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdlxcKSkkZ2VuZVxuZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpKSRnZW5lXG5cblxuZ2VuZS5UU1MudGIucGxvdCA8LSBnZW5lLlRTUy50YiAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAxLCBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMiwgXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA1LCBcXGdyb3VwNVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA4LCBcXGdyb3VwOFxcLCBOQSkpKSkpICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbiMjIGdlbmVDb3VudFxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZ2VuZUNvdW50XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZ2VuZUNvdW50XG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnBsb3RfZ2VuZUNvdW50IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZ2VuZUNvdW50KSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTU6IFxcLCBjb252UHZhbHVlKHAxNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxODogXFwsIGNvbnZQdmFsdWUocDE4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI1OiBcXCwgY29udlB2YWx1ZShwMjUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjg6IFxcLCBjb252UHZhbHVlKHAyOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA1ODogXFwsY29udlB2YWx1ZSggcDU4KSwgXFxcXG5cXCksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZ2VuZUNvdW50X1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAzXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5wbG90X2dlbmVDb3VudChnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwXFwsIHltYXggPSAyMDApXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCkpJGdlbmVcbmdyb3VwNSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdlxcKSkkZ2VuZVxuZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpKSRnZW5lXG5cblxuZ2VuZS5UU1MudGIucGxvdCA8LSBnZW5lLlRTUy50YiAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAxLCBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMiwgXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA1LCBcXGdyb3VwNVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA4LCBcXGdyb3VwOFxcLCBOQSkpKSkpICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbiMjIGdlbmVDb3VudFxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZ2VuZUNvdW50XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZ2VuZUNvdW50XG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnBsb3RfZ2VuZUNvdW50IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZ2VuZUNvdW50KSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTU6IFxcLCBjb252UHZhbHVlKHAxNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxODogXFwsIGNvbnZQdmFsdWUocDE4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI1OiBcXCwgY29udlB2YWx1ZShwMjUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjg6IFxcLCBjb252UHZhbHVlKHAyOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA1ODogXFwsY29udlB2YWx1ZSggcDU4KSwgXFxcXG5cXCksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZ2VuZUNvdW50X1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAzXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5wbG90X2dlbmVDb3VudChnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwXFwsIHltYXggPSAyMDApXG5cbmBgYFxuYGBgIn0= -->

```r
```r
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene


gene.TSS.tb.plot <- gene.TSS.tb %>% rowwise() %>% dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\,
                        ifelse(ensembl %in% group5, \group5\,
                               ifelse(ensembl %in% group8, \group8\, NA))))) %>% 
  dplyr::filter(!is.na(group))


## geneCount
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$geneCount
  distance2 <- (data %>% dplyr::filter(group == group2) )$geneCount
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_geneCount <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = geneCount)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\geneCount_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_geneCount(gene.TSS.tb.plot, \group\, ymax = 200)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Plotting for groups
##### geneCount
###### Binary group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1nWlc1b1EyOTFiblJjYm1kbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXhLU0FwSkdWdWFFTnZkVzUwWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQm5jbTkxY0RJcElDa2taVzVvUTI5MWJuUmNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNWNibHh1Y0d4dmRGOWxibWhEYjNWdWRDQThMU0JtZFc1amRHbHZiaWgwWlcxd0xuUmlMQ0J1YjNSbExDQjViV2x1SUQwZ01Dd2dlVzFoZUNBOUlESXdNREF3TURBcGUxeHVJQ0J3TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjSW1keWIzVndNVndpTENCY0ltZHliM1Z3TWx3aUtTd2dOU2xjYmlBZ1hHNGdJSEFnUEMwZ1oyZHdiRzkwS0hSbGJYQXVkR0lzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCbGJtaERiM1Z1ZENrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCbmNtOTFjQ2tzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUNBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDdGNiaUFnSUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGd2ljbVZrWENJc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUtTQXJYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdJQ0JoYm01dmRHRjBaU2hjSW5SbGVIUmNJaXdnZUNBOUlERXNJSGtnUFNBb2VXMXBiaUFySUhsdFlYZ3BMeklnS3lBeExDQnNZV0psYkNBOUlIQmhjM1JsTUNoY0luQXhNam9nWENJc0lHTnZiblpRZG1Gc2RXVW9jREV5S1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzSUdocWRYTjBJRDBnTUN3Z2MybDZaU0E5SURNcFhHNGdJRnh1SUNCY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpWlc1b1EyOTFiblJmWENJc0lHNXZkR1VwWEc0Z0lHaGxhV2RvZENBOExTQXpYRzRnSUhkcFpIUm9JRHd0SURFdU5WeHVJQ0J3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dUlDQnpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVmVnh1Y0d4dmRGOWxibWhEYjNWdWRDaG5aVzVsTGxSVFV5NTBZaTV3Ykc5MExDQmNJbWR5YjNWd1gySnBibUZ5ZVVkeWIzVndYQ0lzSUhsdFlYZ2dQU0F5TURBcFhHNWNibUJnWUNKOSAtLT5cblxuYGBgclxuIyMgZW5oQ291bnRcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGVuaENvdW50XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZW5oQ291bnRcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9lbmhDb3VudCA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBlbmhDb3VudCkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZW5oQ291bnRfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDEuNVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxucGxvdF9lbmhDb3VudChnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwX2JpbmFyeUdyb3VwXFwsIHltYXggPSAyMDApXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
## enhCount
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$enhCount
  distance2 <- (data %>% dplyr::filter(group == group2) )$enhCount
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_enhCount <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = enhCount)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12)),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\enhCount_\, note)
  height <- 3
  width <- 1.5
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_enhCount(gene.TSS.tb.plot, \group_binaryGroup\, ymax = 200)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWdaVzVvUTI5MWJuUmNibWRsZEZCMllXeFhhV3hqYjNnZ1BDMGdablZ1WTNScGIyNG9aR0YwWVN3Z1ozSnZkWEF4TENCbmNtOTFjRElwZTF4dUlDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdaM0p2ZFhBeEtTQXBKR1Z1YUVOdmRXNTBYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCbmNtOTFjRElwSUNra1pXNW9RMjkxYm5SY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1Y2JseHVjR3h2ZEY5bGJtaERiM1Z1ZENBOExTQm1kVzVqZEdsdmJpaDBaVzF3TG5SaUxDQnViM1JsTENCNWJXbHVJRDBnTUN3Z2VXMWhlQ0E5SURJd01EQXdNREFwZTF4dUlDQndNVElnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNYR2R5YjNWd01WeGNMQ0JjWEdkeWIzVndNbHhjS1N3Z05TbGNiaUFnWEc0Z0lIQWdQQzBnWjJkd2JHOTBLSFJsYlhBdWRHSXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JsYm1oRGIzVnVkQ2twSUNzZ1oyVnZiVjkyYVc5c2FXNG9ZV1Z6S0dacGJHd2dQU0JuY205MWNDa3NJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ1hHNGdJQ0FnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUN0Y2JpQWdJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ4Y2NtVmtYRndzSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjS1NBclhHNGdJQ0FnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3RjYmlBZ0lDQmhibTV2ZEdGMFpTaGNYSFJsZUhSY1hDd2dlQ0E5SURFc0lIa2dQU0FvZVcxcGJpQXJJSGx0WVhncEx6SWdLeUF4TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjWEhBeE1qb2dYRndzSUdOdmJuWlFkbUZzZFdVb2NERXlLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wWEc0Z0lGeHVJQ0JjYmlBZ1ptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNaVzVvUTI5MWJuUmZYRndzSUc1dmRHVXBYRzRnSUdobGFXZG9kQ0E4TFNBelhHNGdJSGRwWkhSb0lEd3RJREV1TlZ4dUlDQndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dWZWeHVjR3h2ZEY5bGJtaERiM1Z1ZENoblpXNWxMbFJUVXk1MFlpNXdiRzkwTENCY1hHZHliM1Z3WDJKcGJtRnllVWR5YjNWd1hGd3NJSGx0WVhnZ1BTQXlNREFwWEc1Y2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbiMjIGVuaENvdW50XG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRlbmhDb3VudFxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJGVuaENvdW50XG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnBsb3RfZW5oQ291bnQgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXtcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZW5oQ291bnQpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMikpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGVuaENvdW50X1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAxLjVcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbnBsb3RfZW5oQ291bnQoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cF9iaW5hcnlHcm91cFxcLCB5bWF4ID0gMjAwKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMgZW5oQ291bnRcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGVuaENvdW50XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZW5oQ291bnRcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9lbmhDb3VudCA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBlbmhDb3VudCkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZW5oQ291bnRfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDEuNVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxucGxvdF9lbmhDb3VudChnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwX2JpbmFyeUdyb3VwXFwsIHltYXggPSAyMDApXG5cbmBgYFxuYGBgIn0= -->

```r
```r
## enhCount
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$enhCount
  distance2 <- (data %>% dplyr::filter(group == group2) )$enhCount
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_enhCount <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = enhCount)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12)),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\enhCount_\, note)
  height <- 3
  width <- 1.5
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_enhCount(gene.TSS.tb.plot, \group_binaryGroup\, ymax = 200)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

###### Group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1nWlc1b1EyOTFiblJjYm1kbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXhLU0FwSkdWdWFFTnZkVzUwWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQm5jbTkxY0RJcElDa2taVzVvUTI5MWJuUmNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNWNibHh1Y0d4dmRGOWxibWhEYjNWdWRDQThMU0JtZFc1amRHbHZiaWgwWlcxd0xuUmlMQ0J1YjNSbExDQjViV2x1SUQwZ01Dd2dlVzFoZUNBOUlESXdNREF3TURBcGUxeHVJQ0J3TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjSW1keWIzVndNVndpTENCY0ltZHliM1Z3TWx3aUtTd2dOU2xjYmlBZ2NERTFJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hDSm5jbTkxY0RGY0lpd2dYQ0puY205MWNEVmNJaWtzSURVcFhHNGdJSEF4T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRndpWjNKdmRYQXhYQ0lzSUZ3aVozSnZkWEE0WENJcExDQTFLVnh1SUNCd01qVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0ltZHliM1Z3TWx3aUxDQmNJbWR5YjNWd05Wd2lLU3dnTlNsY2JpQWdjREk0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYQ0puY205MWNESmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzRnSUhBMU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ3aVozSnZkWEExWENJc0lGd2laM0p2ZFhBNFhDSXBMQ0ExS1Z4dUlDQmNiaUFnY0NBOExTQm5aM0JzYjNRb2RHVnRjQzUwWWl3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlHVnVhRU52ZFc1MEtTa2dLeUJuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlHZHliM1Z3S1N3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ0lDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLMXh1SUNBZ0lITjBZWFJmYzNWdGJXRnllU2hoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c0lHZGxiMjBnUFNCY0luQnZhVzUwWENJc0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXlMQ0JtYVd4c0lEMGdYQ0p5WldSY0lpd2dZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXBJQ3RjYmlBZ0lDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJQ0FnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdNU3dnZVNBOUlDaDViV2x1SUNzZ2VXMWhlQ2t2TWlBcklERXNJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGd2ljREV5T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3TVRJcExDQmNJbHhjYmx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKd01UVTZJRndpTENCamIyNTJVSFpoYkhWbEtIQXhOU2tzSUZ3aVhGeHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkF4T0RvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0RFNEtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNESTFPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNalVwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3TWpnNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeU9Da3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQTFPRG9nWENJc1kyOXVkbEIyWVd4MVpTZ2djRFU0S1N3Z1hDSmNYRzVjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzSUdocWRYTjBJRDBnTUN3Z2MybDZaU0E5SURNcFhHNGdJRnh1SUNCY2JpQWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpWlc1b1EyOTFiblJmWENJc0lHNXZkR1VwWEc0Z0lHaGxhV2RvZENBOExTQXpYRzRnSUhkcFpIUm9JRHd0SUROY2JpQWdjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUlDQndjbWx1ZENod0tWeHVJQ0JrWlhZdWIyWm1LQ2xjYmlBZ2MzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVJQ0J3Y21sdWRDaHdLVnh1SUNCa1pYWXViMlptS0NsY2JuMWNibkJzYjNSZlpXNW9RMjkxYm5Rb1oyVnVaUzVVVTFNdWRHSXVjR3h2ZEN3Z1hDSm5jbTkxY0Z3aUxDQjViV0Y0SUQwZ01qQXdLVnh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG4jIyBlbmhDb3VudFxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZW5oQ291bnRcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRlbmhDb3VudFxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X2VuaENvdW50IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZW5oQ291bnQpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNTogXFwsIGNvbnZQdmFsdWUocDE1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE4OiBcXCwgY29udlB2YWx1ZShwMTgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyODogXFwsIGNvbnZQdmFsdWUocDI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDU4OiBcXCxjb252UHZhbHVlKCBwNTgpLCBcXFxcblxcKSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxlbmhDb3VudF9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxucGxvdF9lbmhDb3VudChnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwXFwsIHltYXggPSAyMDApXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
## enhCount
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$enhCount
  distance2 <- (data %>% dplyr::filter(group == group2) )$enhCount
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_enhCount <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = enhCount)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\enhCount_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_enhCount(gene.TSS.tb.plot, \group\, ymax = 200)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWdaVzVvUTI5MWJuUmNibWRsZEZCMllXeFhhV3hqYjNnZ1BDMGdablZ1WTNScGIyNG9aR0YwWVN3Z1ozSnZkWEF4TENCbmNtOTFjRElwZTF4dUlDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdaM0p2ZFhBeEtTQXBKR1Z1YUVOdmRXNTBYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCbmNtOTFjRElwSUNra1pXNW9RMjkxYm5SY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1Y2JseHVjR3h2ZEY5bGJtaERiM1Z1ZENBOExTQm1kVzVqZEdsdmJpaDBaVzF3TG5SaUxDQnViM1JsTENCNWJXbHVJRDBnTUN3Z2VXMWhlQ0E5SURJd01EQXdNREFwZTF4dUlDQndNVElnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNYR2R5YjNWd01WeGNMQ0JjWEdkeWIzVndNbHhjS1N3Z05TbGNiaUFnY0RFMUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWEZ4bmNtOTFjREZjWEN3Z1hGeG5jbTkxY0RWY1hDa3NJRFVwWEc0Z0lIQXhPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGeGNaM0p2ZFhBeFhGd3NJRnhjWjNKdmRYQTRYRndwTENBMUtWeHVJQ0J3TWpVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEdkeWIzVndNbHhjTENCY1hHZHliM1Z3TlZ4Y0tTd2dOU2xjYmlBZ2NESTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hGeG5jbTkxY0RKY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNGdJSEExT0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRnhjWjNKdmRYQTFYRndzSUZ4Y1ozSnZkWEE0WEZ3cExDQTFLVnh1SUNCY2JpQWdjQ0E4TFNCblozQnNiM1FvZEdWdGNDNTBZaXdnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUdWdWFFTnZkVzUwS1NrZ0t5Qm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUdkeWIzVndLU3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnSUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMakVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0sxeHVJQ0FnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0JuY205MWNDa3NJR1oxYmlBOUlHMWxZVzRzSUdkbGIyMGdQU0JjWEhCdmFXNTBYRndzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBeUxDQm1hV3hzSUQwZ1hGeHlaV1JjWEN3Z1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3cElDdGNiaUFnSUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQWdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ01Td2dlU0E5SUNoNWJXbHVJQ3NnZVcxaGVDa3ZNaUFySURFc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z4Y2NERXlPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdNVElwTENCY1hGeGNibHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnh3TVRVNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hBeE5Ta3NJRnhjWEZ4dVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQXhPRG9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jREU0S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0RJMU9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod01qVXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdNamc2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF5T0Nrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhBMU9Eb2dYRndzWTI5dWRsQjJZV3gxWlNnZ2NEVTRLU3dnWEZ4Y1hHNWNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wWEc0Z0lGeHVJQ0JjYmlBZ1ptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNaVzVvUTI5MWJuUmZYRndzSUc1dmRHVXBYRzRnSUdobGFXZG9kQ0E4TFNBelhHNGdJSGRwWkhSb0lEd3RJRE5jYmlBZ2NHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1SUNCd2NtbHVkQ2h3S1Z4dUlDQmtaWFl1YjJabUtDbGNiaUFnYzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUlDQndjbWx1ZENod0tWeHVJQ0JrWlhZdWIyWm1LQ2xjYm4xY2JuQnNiM1JmWlc1b1EyOTFiblFvWjJWdVpTNVVVMU11ZEdJdWNHeHZkQ3dnWEZ4bmNtOTFjRnhjTENCNWJXRjRJRDBnTWpBd0tWeHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG4jIyBlbmhDb3VudFxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZW5oQ291bnRcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRlbmhDb3VudFxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X2VuaENvdW50IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZW5oQ291bnQpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNTogXFwsIGNvbnZQdmFsdWUocDE1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE4OiBcXCwgY29udlB2YWx1ZShwMTgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyODogXFwsIGNvbnZQdmFsdWUocDI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDU4OiBcXCxjb252UHZhbHVlKCBwNTgpLCBcXFxcblxcKSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxlbmhDb3VudF9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxucGxvdF9lbmhDb3VudChnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwXFwsIHltYXggPSAyMDApXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMgZW5oQ291bnRcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGVuaENvdW50XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZW5oQ291bnRcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9lbmhDb3VudCA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4gIHAxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4gIHA1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IGVuaENvdW50KSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTU6IFxcLCBjb252UHZhbHVlKHAxNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxODogXFwsIGNvbnZQdmFsdWUocDE4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI1OiBcXCwgY29udlB2YWx1ZShwMjUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjg6IFxcLCBjb252UHZhbHVlKHAyOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA1ODogXFwsY29udlB2YWx1ZSggcDU4KSwgXFxcXG5cXCksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZW5oQ291bnRfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbnBsb3RfZW5oQ291bnQoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cFxcLCB5bWF4ID0gMjAwKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
## enhCount
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$enhCount
  distance2 <- (data %>% dplyr::filter(group == group2) )$enhCount
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_enhCount <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = enhCount)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\enhCount_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_enhCount(gene.TSS.tb.plot, \group\, ymax = 200)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### enhCount
###### Binary Group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1nWjJWdVpVUmxibk5wZEhsY2JtZGxkRkIyWVd4WGFXeGpiM2dnUEMwZ1puVnVZM1JwYjI0b1pHRjBZU3dnWjNKdmRYQXhMQ0JuY205MWNESXBlMXh1SUNCa2FYTjBZVzVqWlRFZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1ozSnZkWEF4S1NBcEpHZGxibVZFWlc1emFYUjVYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCbmNtOTFjRElwSUNra1oyVnVaVVJsYm5OcGRIbGNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNWNibHh1Y0d4dmRGOW5aVzVsUkdWdWMybDBlU0E4TFNCbWRXNWpkR2x2YmloMFpXMXdMblJpTENCdWIzUmxMQ0I1YldsdUlEMGdNQ3dnZVcxaGVDQTlJREV3S1h0Y2JpQWdjREV5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYQ0puY205MWNERmNJaXdnWENKbmNtOTFjREpjSWlrc0lEVXBYRzRnSUZ4dUlDQndJRHd0SUdkbmNHeHZkQ2gwWlcxd0xuUmlMQ0JoWlhNb2VDQTlJRndpTGx3aUxDQm1hV3hzSUQwZ1ozSnZkWEFzSUhrZ1BTQm5aVzVsUkdWdWMybDBlU2twSUN0Y2JpQWdJQ0FqSUZObGRDQmhlR2x6SUd4aFltVnNjeUFvYm04Z2VDMWhlR2x6SUhScGRHeGxLVnh1SUNBZ0lHeGhZbk1vZUNBOUlFNVZURXdzSUhrZ1BTQmNJa2RsYm1VZ1pHVnVjMmwwZVNCM2FYUm9hVzRnVkVGRVhDSXBJQ3RjYmlBZ0lDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQW9jbVYyS0dNb1hDSWpOemMzTnpjM1hDSXNYQ0lqUmpJNFJUSkRYQ0lwS1NrcElDdGNiaUFnSUNBaklGWnBiMnhwYmlCd2JHOTBJSGRwZEdnZ1lteGhZMnNnYjNWMGJHbHVaU3dnWTNWemRHOXRhWHBsWkNCc2FXNWxJSGRwWkhSb0lHRnVaQ0JsYm1SY2JpQWdJQ0JwYm5SeWIyUmhkR0YyYVhvNk9tZGxiMjFmYzNCc2FYUmZkbWx2YkdsdUtHeHBibVYzYVdSMGFDQTlJR3hwYm1WTlpXUnBkVzBnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXeHdhR0VnUFNBdU5GeHVJQ0FnSUNrZ0sxeHVJQ0FnSUZ4dUlDQWdJQ01nUW05NElIQnNiM1FnZDJsMGFDQmpkWE4wYjIxcGVtVmtJR3hwYm1VZ2QybGtkR2dzSUhOeGRXRnlaU0JsYm1Rc0lHRnVaQ0J2ZFhSc2FXVnlJSE5wZW1WY2JpQWdJQ0JuWlc5dFgySnZlSEJzYjNRb1hHNGdJQ0FnSUNCM2FXUjBhQ0E5SURBdU15d2dZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNYRzRnSUNBZ0lDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFRXVmthWFZ0SUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWl4Y2JpQWdJQ0FnSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVN3Z0lHRnNjR2hoSUQwZ01DNDJMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GWEc0Z0lDQWdLU0FyWEc0Z0lDQWdYRzRnSUNBZ0l5Qk5aV0Z1SUhCdmFXNTBJR2x1SUdWaFkyZ2daM0p2ZFhCY2JpQWdJQ0J6ZEdGMFgzTjFiVzFoY25rb1hHNGdJQ0FnSUNCaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNYRzRnSUNBZ0lDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNQzQxTEZ4dUlDQWdJQ0FnWm1sc2JDQTlJRndpWW14aFkydGNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzSUhCdmMybDBhVzl1SUQwZ2NHOXphWFJwYjI1ZlpHOWtaMlVvTGpNcFhHNGdJQ0FnS1NBclhHNGdJQ0FnWEc0Z0lDQWdJeUJJYjNKcGVtOXVkR0ZzSUd4cGJtVWdZWFFnZVNBOUlEQmNiaUFnSUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRcElDdGNiaUFnSUNCY2JpQWdJQ0FqSUVOdmIzSmthVzVoZEdVZ2JHbHRhWFJ6SUdGdVpDQmpkWE4wYjIwZ2VTMWhlR2x6SUd4aFltVnNjMXh1SUNBZ0lHTnZiM0prWDJOaGNuUmxjMmxoYmloNWJHbHRJRDBnWXloNWJXbHVMQ0I1YldGNEtTa2dLMXh1SUNBZ0lGeHVJQ0FnSUNNZ1FXNXViM1JoZEdVZ2NDMTJZV3gxWlNCMFpYaDBYRzRnSUNBZ1lXNXViM1JoZEdVb1hHNGdJQ0FnSUNCY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQjViV2x1SUNzZ01TeGNiaUFnSUNBZ0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z3aWNERXlPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNVElwS1N4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBelhHNGdJQ0FnS1NBclhHNGdJQ0FnWEc0Z0lDQWdJeUJVYUdWdFpTQmpkWE4wYjIxcGVtRjBhVzl1WEc0Z0lDQWdkR2hsYldWZlkyeGhjM05wWXlncElDdGNiaUFnSUNCMGFHVnRaU2hjYmlBZ0lDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpVMHNJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpWEc0Z0lDQWdJQ0FwTEZ4dUlDQWdJQ0FnWVhocGN5NTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUdGNGFYTXVkR1Y0ZEM1NElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnSUNCaGJtZHNaU0E5SURRMUxDQm9hblZ6ZENBOUlERXNJSFpxZFhOMElEMGdNVnh1SUNBZ0lDQWdLU3hjYmlBZ0lDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXdnYzJsNlpTQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQWdJQ2tzWEc0Z0lDQWdJQ0JoZUdsekxuUnBZMnR6SUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGd2lkSEpoYm5Od1lYSmxiblJjSWlrc1hHNGdJQ0FnSUNCc1pXZGxibVF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ0FnS1NzZ0lDQmNiaUFnSUNCbmRXbGtaWE1vWEc0Z0lDQWdJQ0JtYVd4c0lEMGdaM1ZwWkdWZmJHVm5aVzVrS0Z4dUlDQWdJQ0FnSUNCclpYbDNhV1IwYUNBOUlEQXVNaXdnSUNNZ1FXUnFkWE4wSUhSb1pTQjNhV1IwYUNCdlppQjBhR1VnYkdWblpXNWtJR3RsZVhOY2JpQWdJQ0FnSUNBZ2EyVjVhR1ZwWjJoMElEMGdNQzR5SUNBaklFRmthblZ6ZENCMGFHVWdhR1ZwWjJoMElHOW1JSFJvWlNCc1pXZGxibVFnYTJWNWMxeHVJQ0FnSUNBZ0tTbGNiaUFnWEc0Z0lGeHVJQ0JjYmlBZ1hHNGdJRnh1SUNCbWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSm5aVzVsUkdWdWMybDBlVjljSWl3Z2JtOTBaU2xjYmlBZ2QybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtERXVOU2txYlcxVWIwbHVZMmhjYmlBZ2FHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3hMaklwS20xdFZHOUpibU5vWEc0Z0lIQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUhOMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpQWdjSEpwYm5Rb2NDbGNiaUFnWkdWMkxtOW1aaWdwWEc1OVhHNXdiRzkwWDJkbGJtVkVaVzV6YVhSNUtHZGxibVV1VkZOVExuUmlMbkJzYjNRc0lGd2laM0p2ZFhCZlltbHVZWEo1UjNKdmRYQmNJaXdnZVcxaGVDQTlJRGdwWEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG4jIyBnZW5lRGVuc2l0eVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZ2VuZURlbnNpdHlcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRnZW5lRGVuc2l0eVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X2dlbmVEZW5zaXR5IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMTApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gXFwuXFwsIGZpbGwgPSBncm91cCwgeSA9IGdlbmVEZW5zaXR5KSkgK1xuICAgICMgU2V0IGF4aXMgbGFiZWxzIChubyB4LWF4aXMgdGl0bGUpXG4gICAgbGFicyh4ID0gTlVMTCwgeSA9IFxcR2VuZSBkZW5zaXR5IHdpdGhpbiBUQURcXCkgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IChyZXYoYyhcXCM3Nzc3NzdcXCxcXCNGMjhFMkNcXCkpKSkgK1xuICAgICMgVmlvbGluIHBsb3Qgd2l0aCBibGFjayBvdXRsaW5lLCBjdXN0b21pemVkIGxpbmUgd2lkdGggYW5kIGVuZFxuICAgIGludHJvZGF0YXZpejo6Z2VvbV9zcGxpdF92aW9saW4obGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IC40XG4gICAgKSArXG4gICAgXG4gICAgIyBCb3ggcGxvdCB3aXRoIGN1c3RvbWl6ZWQgbGluZSB3aWR0aCwgc3F1YXJlIGVuZCwgYW5kIG91dGxpZXIgc2l6ZVxuICAgIGdlb21fYm94cGxvdChcbiAgICAgIHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0VcbiAgICApICtcbiAgICBcbiAgICAjIE1lYW4gcG9pbnQgaW4gZWFjaCBncm91cFxuICAgIHN0YXRfc3VtbWFyeShcbiAgICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgICApICtcbiAgICBcbiAgICAjIEhvcml6b250YWwgbGluZSBhdCB5ID0gMFxuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICAgIFxuICAgICMgQ29vcmRpbmF0ZSBsaW1pdHMgYW5kIGN1c3RvbSB5LWF4aXMgbGFiZWxzXG4gICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgXG4gICAgIyBBbm5vdGF0ZSBwLXZhbHVlIHRleHRcbiAgICBhbm5vdGF0ZShcbiAgICAgIFxcdGV4dFxcLCB4ID0gMSwgeSA9IHltaW4gKyAxLFxuICAgICAgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMikpLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDNcbiAgICApICtcbiAgICBcbiAgICAjIFRoZW1lIGN1c3RvbWl6YXRpb25cbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgICApLFxuICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgICApLFxuICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApKyAgIFxuICAgIGd1aWRlcyhcbiAgICAgIGZpbGwgPSBndWlkZV9sZWdlbmQoXG4gICAgICAgIGtleXdpZHRoID0gMC4yLCAgIyBBZGp1c3QgdGhlIHdpZHRoIG9mIHRoZSBsZWdlbmQga2V5c1xuICAgICAgICBrZXloZWlnaHQgPSAwLjIgICMgQWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgICApKVxuICBcbiAgXG4gIFxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGdlbmVEZW5zaXR5X1xcLCBub3RlKVxuICB3aWR0aCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxuICBoZWlnaHQgPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbnBsb3RfZ2VuZURlbnNpdHkoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cF9iaW5hcnlHcm91cFxcLCB5bWF4ID0gOClcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
## geneDensity
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$geneDensity
  distance2 <- (data %>% dplyr::filter(group == group2) )$geneDensity
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_geneDensity <- function(temp.tb, note, ymin = 0, ymax = 10){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = \.\, fill = group, y = geneDensity)) +
    # Set axis labels (no x-axis title)
    labs(x = NULL, y = \Gene density within TAD\) +
    scale_fill_manual(values = (rev(c(\#777777\,\#F28E2C\)))) +
    # Violin plot with black outline, customized line width and end
    introdataviz::geom_split_violin(linewidth = lineMedium * mmToLineUnit, lineend = \square\,
                                    alpha = .4
    ) +
    
    # Box plot with customized line width, square end, and outlier size
    geom_boxplot(
      width = 0.3, color = \black\,
      linewidth = lineMedium * mmToLineUnit, lineend = \square\,
      outlier.shape = NA,  alpha = 0.6, show.legend = FALSE
    ) +
    
    # Mean point in each group
    stat_summary(
      aes(group = group), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) +
    
    # Horizontal line at y = 0
    geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
    
    # Coordinate limits and custom y-axis labels
    coord_cartesian(ylim = c(ymin, ymax)) +
    
    # Annotate p-value text
    annotate(
      \text\, x = 1, y = ymin + 1,
      label = paste0(\p12: \, convPvalue(p12)),
      color = \black\, hjust = 0, size = 3
    ) +
    
    # Theme customization
    theme_classic() +
    theme(
      axis.title = element_text(
        size = fontSizeM, family = fontType, color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS, family = fontType, color = \#000000\
      ),
      axis.text.x = element_text(
        angle = 45, hjust = 1, vjust = 1
      ),
      axis.line = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
      legend.text = element_text(family = fontType, size = fontSizeS),
      legend.title = element_text(family = fontType, size = fontSizeS)
    )+   
    guides(
      fill = guide_legend(
        keywidth = 0.2,  # Adjust the width of the legend keys
        keyheight = 0.2  # Adjust the height of the legend keys
      ))
  
  
  
  
  
  fileName <- paste0(\geneDensity_\, note)
  width <- panelSize(1.5)*mmToInch
  height <- panelSize(1.2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_geneDensity(gene.TSS.tb.plot, \group_binaryGroup\, ymax = 8)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWdaMlZ1WlVSbGJuTnBkSGxjYm1kbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXhLU0FwSkdkbGJtVkVaVzV6YVhSNVhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JuY205MWNESXBJQ2trWjJWdVpVUmxibk5wZEhsY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1Y2JseHVjR3h2ZEY5blpXNWxSR1Z1YzJsMGVTQThMU0JtZFc1amRHbHZiaWgwWlcxd0xuUmlMQ0J1YjNSbExDQjViV2x1SUQwZ01Dd2dlVzFoZUNBOUlERXdLWHRjYmlBZ2NERXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNESmNYQ2tzSURVcFhHNGdJRnh1SUNCd0lEd3RJR2RuY0d4dmRDaDBaVzF3TG5SaUxDQmhaWE1vZUNBOUlGeGNMbHhjTENCbWFXeHNJRDBnWjNKdmRYQXNJSGtnUFNCblpXNWxSR1Z1YzJsMGVTa3BJQ3RjYmlBZ0lDQWpJRk5sZENCaGVHbHpJR3hoWW1Wc2N5QW9ibThnZUMxaGVHbHpJSFJwZEd4bEtWeHVJQ0FnSUd4aFluTW9lQ0E5SUU1VlRFd3NJSGtnUFNCY1hFZGxibVVnWkdWdWMybDBlU0IzYVhSb2FXNGdWRUZFWEZ3cElDdGNiaUFnSUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNBb2NtVjJLR01vWEZ3ak56YzNOemMzWEZ3c1hGd2pSakk0UlRKRFhGd3BLU2twSUN0Y2JpQWdJQ0FqSUZacGIyeHBiaUJ3Ykc5MElIZHBkR2dnWW14aFkyc2diM1YwYkdsdVpTd2dZM1Z6ZEc5dGFYcGxaQ0JzYVc1bElIZHBaSFJvSUdGdVpDQmxibVJjYmlBZ0lDQnBiblJ5YjJSaGRHRjJhWG82T21kbGIyMWZjM0JzYVhSZmRtbHZiR2x1S0d4cGJtVjNhV1IwYUNBOUlHeHBibVZOWldScGRXMGdLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVd4d2FHRWdQU0F1TkZ4dUlDQWdJQ2tnSzF4dUlDQWdJRnh1SUNBZ0lDTWdRbTk0SUhCc2IzUWdkMmwwYUNCamRYTjBiMjFwZW1Wa0lHeHBibVVnZDJsa2RHZ3NJSE54ZFdGeVpTQmxibVFzSUdGdVpDQnZkWFJzYVdWeUlITnBlbVZjYmlBZ0lDQm5aVzl0WDJKdmVIQnNiM1FvWEc0Z0lDQWdJQ0IzYVdSMGFDQTlJREF1TXl3Z1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c1hHNGdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVFdWa2FYVnRJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ3hjYmlBZ0lDQWdJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU3dnSUdGc2NHaGhJRDBnTUM0MkxDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZYRzRnSUNBZ0tTQXJYRzRnSUNBZ1hHNGdJQ0FnSXlCTlpXRnVJSEJ2YVc1MElHbHVJR1ZoWTJnZ1ozSnZkWEJjYmlBZ0lDQnpkR0YwWDNOMWJXMWhjbmtvWEc0Z0lDQWdJQ0JoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnSUNCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01DNDFMRnh1SUNBZ0lDQWdabWxzYkNBOUlGeGNZbXhoWTJ0Y1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NJSEJ2YzJsMGFXOXVJRDBnY0c5emFYUnBiMjVmWkc5a1oyVW9Mak1wWEc0Z0lDQWdLU0FyWEc0Z0lDQWdYRzRnSUNBZ0l5QkliM0pwZW05dWRHRnNJR3hwYm1VZ1lYUWdlU0E5SURCY2JpQWdJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFwSUN0Y2JpQWdJQ0JjYmlBZ0lDQWpJRU52YjNKa2FXNWhkR1VnYkdsdGFYUnpJR0Z1WkNCamRYTjBiMjBnZVMxaGVHbHpJR3hoWW1Wc2MxeHVJQ0FnSUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWg1YldsdUxDQjViV0Y0S1NrZ0sxeHVJQ0FnSUZ4dUlDQWdJQ01nUVc1dWIzUmhkR1VnY0MxMllXeDFaU0IwWlhoMFhHNGdJQ0FnWVc1dWIzUmhkR1VvWEc0Z0lDQWdJQ0JjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNCNWJXbHVJQ3NnTVN4Y2JpQWdJQ0FnSUd4aFltVnNJRDBnY0dGemRHVXdLRnhjY0RFeU9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod01USXBLU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F6WEc0Z0lDQWdLU0FyWEc0Z0lDQWdYRzRnSUNBZ0l5QlVhR1Z0WlNCamRYTjBiMjFwZW1GMGFXOXVYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdJQ0IwYUdWdFpTaGNiaUFnSUNBZ0lHRjRhWE11ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNYRzRnSUNBZ0lDQXBMRnh1SUNBZ0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2dZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDQWdLU3hjYmlBZ0lDQWdJR0Y0YVhNdWRHVjRkQzU0SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdJQ0JoYm1kc1pTQTlJRFExTENCb2FuVnpkQ0E5SURFc0lIWnFkWE4wSUQwZ01WeHVJQ0FnSUNBZ0tTeGNiaUFnSUNBZ0lHRjRhWE11YkdsdVpTQTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hDd2djMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBZ0lDa3NYRzRnSUNBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDQWdLU3hjYmlBZ0lDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ4Y2RISmhibk53WVhKbGJuUmNYQ2tzWEc0Z0lDQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDQWdLU3NnSUNCY2JpQWdJQ0JuZFdsa1pYTW9YRzRnSUNBZ0lDQm1hV3hzSUQwZ1ozVnBaR1ZmYkdWblpXNWtLRnh1SUNBZ0lDQWdJQ0JyWlhsM2FXUjBhQ0E5SURBdU1pd2dJQ01nUVdScWRYTjBJSFJvWlNCM2FXUjBhQ0J2WmlCMGFHVWdiR1ZuWlc1a0lHdGxlWE5jYmlBZ0lDQWdJQ0FnYTJWNWFHVnBaMmgwSUQwZ01DNHlJQ0FqSUVGa2FuVnpkQ0IwYUdVZ2FHVnBaMmgwSUc5bUlIUm9aU0JzWldkbGJtUWdhMlY1YzF4dUlDQWdJQ0FnS1NsY2JpQWdYRzRnSUZ4dUlDQmNiaUFnWEc0Z0lGeHVJQ0JtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4blpXNWxSR1Z1YzJsMGVWOWNYQ3dnYm05MFpTbGNiaUFnZDJsa2RHZ2dQQzBnY0dGdVpXeFRhWHBsS0RFdU5Ta3FiVzFVYjBsdVkyaGNiaUFnYUdWcFoyaDBJRHd0SUhCaGJtVnNVMmw2WlNneExqSXBLbTF0Vkc5SmJtTm9YRzRnSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzU5WEc1d2JHOTBYMmRsYm1WRVpXNXphWFI1S0dkbGJtVXVWRk5UTG5SaUxuQnNiM1FzSUZ4Y1ozSnZkWEJmWW1sdVlYSjVSM0p2ZFhCY1hDd2dlVzFoZUNBOUlEZ3BYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuIyMgZ2VuZURlbnNpdHlcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGdlbmVEZW5zaXR5XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZ2VuZURlbnNpdHlcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9nZW5lRGVuc2l0eSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEwKXtcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IFxcLlxcLCBmaWxsID0gZ3JvdXAsIHkgPSBnZW5lRGVuc2l0eSkpICtcbiAgICAjIFNldCBheGlzIGxhYmVscyAobm8geC1heGlzIHRpdGxlKVxuICAgIGxhYnMoeCA9IE5VTEwsIHkgPSBcXEdlbmUgZGVuc2l0eSB3aXRoaW4gVEFEXFwpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSAocmV2KGMoXFwjNzc3Nzc3XFwsXFwjRjI4RTJDXFwpKSkpICtcbiAgICAjIFZpb2xpbiBwbG90IHdpdGggYmxhY2sgb3V0bGluZSwgY3VzdG9taXplZCBsaW5lIHdpZHRoIGFuZCBlbmRcbiAgICBpbnRyb2RhdGF2aXo6Omdlb21fc3BsaXRfdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAuNFxuICAgICkgK1xuICAgIFxuICAgICMgQm94IHBsb3Qgd2l0aCBjdXN0b21pemVkIGxpbmUgd2lkdGgsIHNxdWFyZSBlbmQsIGFuZCBvdXRsaWVyIHNpemVcbiAgICBnZW9tX2JveHBsb3QoXG4gICAgICB3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFXG4gICAgKSArXG4gICAgXG4gICAgIyBNZWFuIHBvaW50IGluIGVhY2ggZ3JvdXBcbiAgICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICAgKSArXG4gICAgXG4gICAgIyBIb3Jpem9udGFsIGxpbmUgYXQgeSA9IDBcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgICBcbiAgICAjIENvb3JkaW5hdGUgbGltaXRzIGFuZCBjdXN0b20geS1heGlzIGxhYmVsc1xuICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5bWluLCB5bWF4KSkgK1xuICAgIFxuICAgICMgQW5ub3RhdGUgcC12YWx1ZSB0ZXh0XG4gICAgYW5ub3RhdGUoXG4gICAgICBcXHRleHRcXCwgeCA9IDEsIHkgPSB5bWluICsgMSxcbiAgICAgIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpKSxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzXG4gICAgKSArXG4gICAgXG4gICAgIyBUaGVtZSBjdXN0b21pemF0aW9uXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICAgKSxcbiAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKSsgICBcbiAgICBndWlkZXMoXG4gICAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKFxuICAgICAgICBrZXl3aWR0aCA9IDAuMiwgICMgQWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgbGVnZW5kIGtleXNcbiAgICAgICAga2V5aGVpZ2h0ID0gMC4yICAjIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWdlbmQga2V5c1xuICAgICAgKSlcbiAgXG4gIFxuICBcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxnZW5lRGVuc2l0eV9cXCwgbm90ZSlcbiAgd2lkdGggPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5wbG90X2dlbmVEZW5zaXR5KGdlbmUuVFNTLnRiLnBsb3QsIFxcZ3JvdXBfYmluYXJ5R3JvdXBcXCwgeW1heCA9IDgpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMgZ2VuZURlbnNpdHlcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGdlbmVEZW5zaXR5XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZ2VuZURlbnNpdHlcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9nZW5lRGVuc2l0eSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEwKXtcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IFxcLlxcLCBmaWxsID0gZ3JvdXAsIHkgPSBnZW5lRGVuc2l0eSkpICtcbiAgICAjIFNldCBheGlzIGxhYmVscyAobm8geC1heGlzIHRpdGxlKVxuICAgIGxhYnMoeCA9IE5VTEwsIHkgPSBcXEdlbmUgZGVuc2l0eSB3aXRoaW4gVEFEXFwpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSAocmV2KGMoXFwjNzc3Nzc3XFwsXFwjRjI4RTJDXFwpKSkpICtcbiAgICAjIFZpb2xpbiBwbG90IHdpdGggYmxhY2sgb3V0bGluZSwgY3VzdG9taXplZCBsaW5lIHdpZHRoIGFuZCBlbmRcbiAgICBpbnRyb2RhdGF2aXo6Omdlb21fc3BsaXRfdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAuNFxuICAgICkgK1xuICAgIFxuICAgICMgQm94IHBsb3Qgd2l0aCBjdXN0b21pemVkIGxpbmUgd2lkdGgsIHNxdWFyZSBlbmQsIGFuZCBvdXRsaWVyIHNpemVcbiAgICBnZW9tX2JveHBsb3QoXG4gICAgICB3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFXG4gICAgKSArXG4gICAgXG4gICAgIyBNZWFuIHBvaW50IGluIGVhY2ggZ3JvdXBcbiAgICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICAgKSArXG4gICAgXG4gICAgIyBIb3Jpem9udGFsIGxpbmUgYXQgeSA9IDBcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgICBcbiAgICAjIENvb3JkaW5hdGUgbGltaXRzIGFuZCBjdXN0b20geS1heGlzIGxhYmVsc1xuICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5bWluLCB5bWF4KSkgK1xuICAgIFxuICAgICMgQW5ub3RhdGUgcC12YWx1ZSB0ZXh0XG4gICAgYW5ub3RhdGUoXG4gICAgICBcXHRleHRcXCwgeCA9IDEsIHkgPSB5bWluICsgMSxcbiAgICAgIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpKSxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzXG4gICAgKSArXG4gICAgXG4gICAgIyBUaGVtZSBjdXN0b21pemF0aW9uXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICAgKSxcbiAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKSsgICBcbiAgICBndWlkZXMoXG4gICAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKFxuICAgICAgICBrZXl3aWR0aCA9IDAuMiwgICMgQWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgbGVnZW5kIGtleXNcbiAgICAgICAga2V5aGVpZ2h0ID0gMC4yICAjIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWdlbmQga2V5c1xuICAgICAgKSlcbiAgXG4gIFxuICBcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxnZW5lRGVuc2l0eV9cXCwgbm90ZSlcbiAgd2lkdGggPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5wbG90X2dlbmVEZW5zaXR5KGdlbmUuVFNTLnRiLnBsb3QsIFxcZ3JvdXBfYmluYXJ5R3JvdXBcXCwgeW1heCA9IDgpXG5cbmBgYFxuYGBgIn0= -->

```r
```r
## geneDensity
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$geneDensity
  distance2 <- (data %>% dplyr::filter(group == group2) )$geneDensity
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_geneDensity <- function(temp.tb, note, ymin = 0, ymax = 10){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = \.\, fill = group, y = geneDensity)) +
    # Set axis labels (no x-axis title)
    labs(x = NULL, y = \Gene density within TAD\) +
    scale_fill_manual(values = (rev(c(\#777777\,\#F28E2C\)))) +
    # Violin plot with black outline, customized line width and end
    introdataviz::geom_split_violin(linewidth = lineMedium * mmToLineUnit, lineend = \square\,
                                    alpha = .4
    ) +
    
    # Box plot with customized line width, square end, and outlier size
    geom_boxplot(
      width = 0.3, color = \black\,
      linewidth = lineMedium * mmToLineUnit, lineend = \square\,
      outlier.shape = NA,  alpha = 0.6, show.legend = FALSE
    ) +
    
    # Mean point in each group
    stat_summary(
      aes(group = group), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) +
    
    # Horizontal line at y = 0
    geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
    
    # Coordinate limits and custom y-axis labels
    coord_cartesian(ylim = c(ymin, ymax)) +
    
    # Annotate p-value text
    annotate(
      \text\, x = 1, y = ymin + 1,
      label = paste0(\p12: \, convPvalue(p12)),
      color = \black\, hjust = 0, size = 3
    ) +
    
    # Theme customization
    theme_classic() +
    theme(
      axis.title = element_text(
        size = fontSizeM, family = fontType, color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS, family = fontType, color = \#000000\
      ),
      axis.text.x = element_text(
        angle = 45, hjust = 1, vjust = 1
      ),
      axis.line = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
      legend.text = element_text(family = fontType, size = fontSizeS),
      legend.title = element_text(family = fontType, size = fontSizeS)
    )+   
    guides(
      fill = guide_legend(
        keywidth = 0.2,  # Adjust the width of the legend keys
        keyheight = 0.2  # Adjust the height of the legend keys
      ))
  
  
  
  
  
  fileName <- paste0(\geneDensity_\, note)
  width <- panelSize(1.5)*mmToInch
  height <- panelSize(1.2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_geneDensity(gene.TSS.tb.plot, \group_binaryGroup\, ymax = 8)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

###### Group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1nWjJWdVpVUmxibk5wZEhsY2JtZGxkRkIyWVd4WGFXeGpiM2dnUEMwZ1puVnVZM1JwYjI0b1pHRjBZU3dnWjNKdmRYQXhMQ0JuY205MWNESXBlMXh1SUNCa2FYTjBZVzVqWlRFZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1ozSnZkWEF4S1NBcEpHZGxibVZFWlc1emFYUjVYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCbmNtOTFjRElwSUNra1oyVnVaVVJsYm5OcGRIbGNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNWNibHh1Y0d4dmRGOW5aVzVsUkdWdWMybDBlU0E4TFNCbWRXNWpkR2x2YmloMFpXMXdMblJpTENCdWIzUmxMQ0I1YldsdUlEMGdNQ3dnZVcxaGVDQTlJREl3TURBd01EQXBlMXh1SUNCd01USWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLU3dnTlNsY2JpQWdjREUxSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYQ0puY205MWNERmNJaXdnWENKbmNtOTFjRFZjSWlrc0lEVXBYRzRnSUhBeE9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ3aVozSnZkWEF4WENJc0lGd2laM0p2ZFhBNFhDSXBMQ0ExS1Z4dUlDQndNalVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbWR5YjNWd01sd2lMQ0JjSW1keWIzVndOVndpS1N3Z05TbGNiaUFnY0RJNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWENKbmNtOTFjREpjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc0Z0lIQTFPQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGd2laM0p2ZFhBMVhDSXNJRndpWjNKdmRYQTRYQ0lwTENBMUtWeHVJQ0JjYmlBZ2NDQThMU0JuWjNCc2IzUW9kR1Z0Y0M1MFlpd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJR2RsYm1WRVpXNXphWFI1S1NrZ0t5Qm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUdkeWIzVndLU3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnSUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMakVzSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0sxeHVJQ0FnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0JuY205MWNDa3NJR1oxYmlBOUlHMWxZVzRzSUdkbGIyMGdQU0JjSW5CdmFXNTBYQ0lzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBeUxDQm1hV3hzSUQwZ1hDSnlaV1JjSWl3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJcElDdGNiaUFnSUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQWdJR0Z1Ym05MFlYUmxLRndpZEdWNGRGd2lMQ0I0SUQwZ01Td2dlU0E5SUNoNWJXbHVJQ3NnZVcxaGVDa3ZNaUFySURFc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z3aWNERXlPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNVElwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3TVRVNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeE5Ta3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQXhPRG9nWENJc0lHTnZiblpRZG1Gc2RXVW9jREU0S1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0RJMU9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod01qVXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndNamc2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEF5T0Nrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5BMU9Eb2dYQ0lzWTI5dWRsQjJZV3gxWlNnZ2NEVTRLU3dnWENKY1hHNWNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wWEc0Z0lGeHVJQ0JjYmlBZ1ptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2laMlZ1WlVSbGJuTnBkSGxmWENJc0lHNXZkR1VwWEc0Z0lHaGxhV2RvZENBOExTQXpYRzRnSUhkcFpIUm9JRHd0SUROY2JpQWdjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUlDQndjbWx1ZENod0tWeHVJQ0JrWlhZdWIyWm1LQ2xjYmlBZ2MzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVJQ0J3Y21sdWRDaHdLVnh1SUNCa1pYWXViMlptS0NsY2JuMWNibkJzYjNSZloyVnVaVVJsYm5OcGRIa29aMlZ1WlM1VVUxTXVkR0l1Y0d4dmRDd2dYQ0puY205MWNGd2lMQ0I1YldGNElEMGdNVEFwWEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG4jIyBnZW5lRGVuc2l0eVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZ2VuZURlbnNpdHlcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRnZW5lRGVuc2l0eVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X2dlbmVEZW5zaXR5IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZ2VuZURlbnNpdHkpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNTogXFwsIGNvbnZQdmFsdWUocDE1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE4OiBcXCwgY29udlB2YWx1ZShwMTgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyODogXFwsIGNvbnZQdmFsdWUocDI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDU4OiBcXCxjb252UHZhbHVlKCBwNTgpLCBcXFxcblxcKSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxnZW5lRGVuc2l0eV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxucGxvdF9nZW5lRGVuc2l0eShnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwXFwsIHltYXggPSAxMClcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
## geneDensity
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$geneDensity
  distance2 <- (data %>% dplyr::filter(group == group2) )$geneDensity
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_geneDensity <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = geneDensity)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\geneDensity_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_geneDensity(gene.TSS.tb.plot, \group\, ymax = 10)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWdaMlZ1WlVSbGJuTnBkSGxjYm1kbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXhLU0FwSkdkbGJtVkVaVzV6YVhSNVhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JuY205MWNESXBJQ2trWjJWdVpVUmxibk5wZEhsY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1Y2JseHVjR3h2ZEY5blpXNWxSR1Z1YzJsMGVTQThMU0JtZFc1amRHbHZiaWgwWlcxd0xuUmlMQ0J1YjNSbExDQjViV2x1SUQwZ01Dd2dlVzFoZUNBOUlESXdNREF3TURBcGUxeHVJQ0J3TVRJZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tTd2dOU2xjYmlBZ2NERTFJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNEVmNYQ2tzSURVcFhHNGdJSEF4T0NBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRnhjWjNKdmRYQXhYRndzSUZ4Y1ozSnZkWEE0WEZ3cExDQTFLVnh1SUNCd01qVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hHZHliM1Z3TWx4Y0xDQmNYR2R5YjNWd05WeGNLU3dnTlNsY2JpQWdjREk0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYRnhuY205MWNESmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzRnSUhBMU9DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ4Y1ozSnZkWEExWEZ3c0lGeGNaM0p2ZFhBNFhGd3BMQ0ExS1Z4dUlDQmNiaUFnY0NBOExTQm5aM0JzYjNRb2RHVnRjQzUwWWl3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlHZGxibVZFWlc1emFYUjVLU2tnS3lCblpXOXRYM1pwYjJ4cGJpaGhaWE1vWm1sc2JDQTlJR2R5YjNWd0tTd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnS3lCY2JpQWdJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnSzF4dUlDQWdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNYSEJ2YVc1MFhGd3NJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWEZ4eVpXUmNYQ3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndwSUN0Y2JpQWdJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNBZ0lHRnVibTkwWVhSbEtGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTVN3Z2VTQTlJQ2g1YldsdUlDc2dlVzFoZUNrdk1pQXJJREVzSUd4aFltVnNJRDBnY0dGemRHVXdLRnhjY0RFeU9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod01USXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdNVFU2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF4TlNrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhBeE9Eb2dYRndzSUdOdmJuWlFkbUZzZFdVb2NERTRLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjREkxT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3TWpVcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d01qZzZJRnhjTENCamIyNTJVSFpoYkhWbEtIQXlPQ2tzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEExT0RvZ1hGd3NZMjl1ZGxCMllXeDFaU2dnY0RVNEtTd2dYRnhjWEc1Y1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBYRzRnSUZ4dUlDQmNiaUFnWm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y1oyVnVaVVJsYm5OcGRIbGZYRndzSUc1dmRHVXBYRzRnSUdobGFXZG9kQ0E4TFNBelhHNGdJSGRwWkhSb0lEd3RJRE5jYmlBZ2NHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1SUNCd2NtbHVkQ2h3S1Z4dUlDQmtaWFl1YjJabUtDbGNiaUFnYzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUlDQndjbWx1ZENod0tWeHVJQ0JrWlhZdWIyWm1LQ2xjYm4xY2JuQnNiM1JmWjJWdVpVUmxibk5wZEhrb1oyVnVaUzVVVTFNdWRHSXVjR3h2ZEN3Z1hGeG5jbTkxY0Z4Y0xDQjViV0Y0SUQwZ01UQXBYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuIyMgZ2VuZURlbnNpdHlcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGdlbmVEZW5zaXR5XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZ2VuZURlbnNpdHlcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9nZW5lRGVuc2l0eSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4gIHAxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4gIHA1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IGdlbmVEZW5zaXR5KSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTU6IFxcLCBjb252UHZhbHVlKHAxNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxODogXFwsIGNvbnZQdmFsdWUocDE4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI1OiBcXCwgY29udlB2YWx1ZShwMjUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjg6IFxcLCBjb252UHZhbHVlKHAyOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA1ODogXFwsY29udlB2YWx1ZSggcDU4KSwgXFxcXG5cXCksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZ2VuZURlbnNpdHlfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbnBsb3RfZ2VuZURlbnNpdHkoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cFxcLCB5bWF4ID0gMTApXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMgZ2VuZURlbnNpdHlcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGdlbmVEZW5zaXR5XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZ2VuZURlbnNpdHlcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9nZW5lRGVuc2l0eSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4gIHAxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4gIHA1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IGdlbmVEZW5zaXR5KSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTU6IFxcLCBjb252UHZhbHVlKHAxNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxODogXFwsIGNvbnZQdmFsdWUocDE4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI1OiBcXCwgY29udlB2YWx1ZShwMjUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjg6IFxcLCBjb252UHZhbHVlKHAyOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA1ODogXFwsY29udlB2YWx1ZSggcDU4KSwgXFxcXG5cXCksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZ2VuZURlbnNpdHlfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbnBsb3RfZ2VuZURlbnNpdHkoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cFxcLCB5bWF4ID0gMTApXG5cbmBgYFxuYGBgIn0= -->

```r
```r
## geneDensity
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$geneDensity
  distance2 <- (data %>% dplyr::filter(group == group2) )$geneDensity
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_geneDensity <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = geneDensity)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\geneDensity_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_geneDensity(gene.TSS.tb.plot, \group\, ymax = 10)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### geneDensity
###### binaryGroup

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1nWlc1b1JHVnVjMmwwZVZ4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCbmNtOTFjREVwSUNra1pXNW9SR1Z1YzJsMGVWeHVJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXlLU0FwSkdWdWFFUmxibk5wZEhsY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1Y2JseHVjR3h2ZEY5bGJtaEVaVzV6YVhSNUlEd3RJR1oxYm1OMGFXOXVLSFJsYlhBdWRHSXNJRzV2ZEdVc0lIbHRhVzRnUFNBd0xDQjViV0Y0SUQwZ01qQXdNREF3TUNsN1hHNGdJSEF4TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRndpWjNKdmRYQXhYQ0lzSUZ3aVozSnZkWEF5WENJcExDQTFLVnh1SUNCY2JpQWdjQ0E4TFNCblozQnNiM1FvZEdWdGNDNTBZaXdnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUdWdWFFUmxibk5wZEhrcEtTQXJJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ1ozSnZkWEFwTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJJRnh1SUNBZ0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJYRzRnSUNBZ2MzUmhkRjl6ZFcxdFlYSjVLR0ZsY3lobmNtOTFjQ0E5SUdkeWIzVndLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNJbkpsWkZ3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpa2dLMXh1SUNBZ0lIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJQ0FnWVc1dWIzUmhkR1VvWENKMFpYaDBYQ0lzSUhnZ1BTQXhMQ0I1SUQwZ0tIbHRhVzRnS3lCNWJXRjRLUzh5SUNzZ01Td2diR0ZpWld3Z1BTQndZWE4wWlRBb1hDSndNVEk2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEF4TWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektWeHVJQ0JjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW1WdWFFUmxibk5wZEhsZlhDSXNJRzV2ZEdVcFhHNGdJR2hsYVdkb2RDQThMU0F6WEc0Z0lIZHBaSFJvSUR3dElERXVOVnh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0J6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1ZlZ4dWNHeHZkRjlsYm1oRVpXNXphWFI1S0dkbGJtVXVWRk5UTG5SaUxuQnNiM1FzSUZ3aVozSnZkWEJmWW1sdVlYSjVSM0p2ZFhCY0lpd2dlVzFoZUNBOUlERXdLVnh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG4jIyBlbmhEZW5zaXR5XG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRlbmhEZW5zaXR5XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZW5oRGVuc2l0eVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X2VuaERlbnNpdHkgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXtcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZW5oRGVuc2l0eSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZW5oRGVuc2l0eV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gMS41XG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5wbG90X2VuaERlbnNpdHkoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cF9iaW5hcnlHcm91cFxcLCB5bWF4ID0gMTApXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
## enhDensity
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$enhDensity
  distance2 <- (data %>% dplyr::filter(group == group2) )$enhDensity
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_enhDensity <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = enhDensity)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12)),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\enhDensity_\, note)
  height <- 3
  width <- 1.5
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_enhDensity(gene.TSS.tb.plot, \group_binaryGroup\, ymax = 10)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWdaVzVvUkdWdWMybDBlVnh1WjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGdJR1JwYzNSaGJtTmxNU0E4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JuY205MWNERXBJQ2trWlc1b1JHVnVjMmwwZVZ4dUlDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdaM0p2ZFhBeUtTQXBKR1Z1YUVSbGJuTnBkSGxjYmlBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SUNCeVpYUjFjbTRvZDJsc0pIQXVkbUZzZFdVcFhHNTlYRzVjYmx4dWNHeHZkRjlsYm1oRVpXNXphWFI1SUR3dElHWjFibU4wYVc5dUtIUmxiWEF1ZEdJc0lHNXZkR1VzSUhsdGFXNGdQU0F3TENCNWJXRjRJRDBnTWpBd01EQXdNQ2w3WEc0Z0lIQXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGeGNaM0p2ZFhBeFhGd3NJRnhjWjNKdmRYQXlYRndwTENBMUtWeHVJQ0JjYmlBZ2NDQThMU0JuWjNCc2IzUW9kR1Z0Y0M1MFlpd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJR1Z1YUVSbGJuTnBkSGtwS1NBcklHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnWjNKdmRYQXBMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBcklGeHVJQ0FnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBclhHNGdJQ0FnYzNSaGRGOXpkVzF0WVhKNUtHRmxjeWhuY205MWNDQTlJR2R5YjNWd0tTd2dablZ1SUQwZ2JXVmhiaXdnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURJc0lHWnBiR3dnUFNCY1hISmxaRnhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWENrZ0sxeHVJQ0FnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FyWEc0Z0lDQWdZVzV1YjNSaGRHVW9YRngwWlhoMFhGd3NJSGdnUFNBeExDQjVJRDBnS0hsdGFXNGdLeUI1YldGNEtTOHlJQ3NnTVN3Z2JHRmlaV3dnUFNCd1lYTjBaVEFvWEZ4d01USTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQXhNaWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F6S1Z4dUlDQmNiaUFnWEc0Z0lHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYR1Z1YUVSbGJuTnBkSGxmWEZ3c0lHNXZkR1VwWEc0Z0lHaGxhV2RvZENBOExTQXpYRzRnSUhkcFpIUm9JRHd0SURFdU5WeHVJQ0J3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dUlDQnpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVmVnh1Y0d4dmRGOWxibWhFWlc1emFYUjVLR2RsYm1VdVZGTlRMblJpTG5Cc2IzUXNJRnhjWjNKdmRYQmZZbWx1WVhKNVIzSnZkWEJjWEN3Z2VXMWhlQ0E5SURFd0tWeHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG4jIyBlbmhEZW5zaXR5XG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRlbmhEZW5zaXR5XG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZW5oRGVuc2l0eVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5wbG90X2VuaERlbnNpdHkgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXtcbiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDJcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZW5oRGVuc2l0eSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcZW5oRGVuc2l0eV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gMS41XG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5wbG90X2VuaERlbnNpdHkoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cF9iaW5hcnlHcm91cFxcLCB5bWF4ID0gMTApXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMgZW5oRGVuc2l0eVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZW5oRGVuc2l0eVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJGVuaERlbnNpdHlcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9lbmhEZW5zaXR5IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IGVuaERlbnNpdHkpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMikpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGVuaERlbnNpdHlfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDEuNVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxucGxvdF9lbmhEZW5zaXR5KGdlbmUuVFNTLnRiLnBsb3QsIFxcZ3JvdXBfYmluYXJ5R3JvdXBcXCwgeW1heCA9IDEwKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
## enhDensity
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$enhDensity
  distance2 <- (data %>% dplyr::filter(group == group2) )$enhDensity
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_enhDensity <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = enhDensity)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12)),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\enhDensity_\, note)
  height <- 3
  width <- 1.5
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_enhDensity(gene.TSS.tb.plot, \group_binaryGroup\, ymax = 10)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

###### Group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1nWlc1b1JHVnVjMmwwZVZ4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCbmNtOTFjREVwSUNra1pXNW9SR1Z1YzJsMGVWeHVJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXlLU0FwSkdWdWFFUmxibk5wZEhsY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1Y2JseHVjR3h2ZEY5bGJtaEVaVzV6YVhSNUlEd3RJR1oxYm1OMGFXOXVLSFJsYlhBdWRHSXNJRzV2ZEdVc0lIbHRhVzRnUFNBd0xDQjViV0Y0SUQwZ01qQXdNREF3TUNsN1hHNGdJSEF4TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRndpWjNKdmRYQXhYQ0lzSUZ3aVozSnZkWEF5WENJcExDQTFLVnh1SUNCd01UVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd05Wd2lLU3dnTlNsY2JpQWdjREU0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYQ0puY205MWNERmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzRnSUhBeU5TQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ3aVozSnZkWEF5WENJc0lGd2laM0p2ZFhBMVhDSXBMQ0ExS1Z4dUlDQndNamdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbWR5YjNWd01sd2lMQ0JjSW1keWIzVndPRndpS1N3Z05TbGNiaUFnY0RVNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWENKbmNtOTFjRFZjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc0Z0lGeHVJQ0J3SUR3dElHZG5jR3h2ZENoMFpXMXdMblJpTENCaFpYTW9lQ0E5SUdkeWIzVndMQ0I1SUQwZ1pXNW9SR1Z1YzJsMGVTa3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQm5jbTkxY0Nrc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnWEc0Z0lDQWdaMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0eExDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRXBJQ3RjYmlBZ0lDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRndpY21Wa1hDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lLU0FyWEc0Z0lDQWdkR2hsYldWZlkyeGhjM05wWXlncElDdGNiaUFnSUNCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQW9lVzFwYmlBcklIbHRZWGdwTHpJZ0t5QXhMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkF4TWpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0RFeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNERTFPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNVFVwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3TVRnNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeE9Da3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQXlOVG9nWENJc0lHTnZiblpRZG1Gc2RXVW9jREkxS1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0RJNE9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod01qZ3BMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndOVGc2SUZ3aUxHTnZiblpRZG1Gc2RXVW9JSEExT0Nrc0lGd2lYRnh1WENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektWeHVJQ0JjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW1WdWFFUmxibk5wZEhsZlhDSXNJRzV2ZEdVcFhHNGdJR2hsYVdkb2RDQThMU0F6WEc0Z0lIZHBaSFJvSUR3dElETmNiaUFnY0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ3aWFXNWNJaXdnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVJQ0J3Y21sdWRDaHdLVnh1SUNCa1pYWXViMlptS0NsY2JpQWdjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1SUNCd2NtbHVkQ2h3S1Z4dUlDQmtaWFl1YjJabUtDbGNibjFjYm5Cc2IzUmZaVzVvUkdWdWMybDBlU2huWlc1bExsUlRVeTUwWWk1d2JHOTBMQ0JjSW1keWIzVndYQ0lzSUhsdFlYZ2dQU0F4TUNsY2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxuIyMgZW5oRGVuc2l0eVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZW5oRGVuc2l0eVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJGVuaERlbnNpdHlcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9lbmhEZW5zaXR5IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZW5oRGVuc2l0eSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNTogXFwsIGNvbnZQdmFsdWUocDI1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGVuaERlbnNpdHlfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbnBsb3RfZW5oRGVuc2l0eShnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwXFwsIHltYXggPSAxMClcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
## enhDensity
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$enhDensity
  distance2 <- (data %>% dplyr::filter(group == group2) )$enhDensity
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_enhDensity <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = enhDensity)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\enhDensity_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_enhDensity(gene.TSS.tb.plot, \group\, ymax = 10)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWdaVzVvUkdWdWMybDBlVnh1WjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGdJR1JwYzNSaGJtTmxNU0E4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JuY205MWNERXBJQ2trWlc1b1JHVnVjMmwwZVZ4dUlDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdaM0p2ZFhBeUtTQXBKR1Z1YUVSbGJuTnBkSGxjYmlBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SUNCeVpYUjFjbTRvZDJsc0pIQXVkbUZzZFdVcFhHNTlYRzVjYmx4dWNHeHZkRjlsYm1oRVpXNXphWFI1SUR3dElHWjFibU4wYVc5dUtIUmxiWEF1ZEdJc0lHNXZkR1VzSUhsdGFXNGdQU0F3TENCNWJXRjRJRDBnTWpBd01EQXdNQ2w3WEc0Z0lIQXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGeGNaM0p2ZFhBeFhGd3NJRnhjWjNKdmRYQXlYRndwTENBMUtWeHVJQ0J3TVRVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TlZ4Y0tTd2dOU2xjYmlBZ2NERTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNGdJSEF5TlNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRnhjWjNKdmRYQXlYRndzSUZ4Y1ozSnZkWEExWEZ3cExDQTFLVnh1SUNCd01qZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hHZHliM1Z3TWx4Y0xDQmNYR2R5YjNWd09GeGNLU3dnTlNsY2JpQWdjRFU0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYRnhuY205MWNEVmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzRnSUZ4dUlDQndJRHd0SUdkbmNHeHZkQ2gwWlcxd0xuUmlMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnWlc1b1JHVnVjMmwwZVNrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCbmNtOTFjQ2tzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUNBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDdGNiaUFnSUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGeGNjbVZrWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0tTQXJYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdJQ0JoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBb2VXMXBiaUFySUhsdFlYZ3BMeklnS3lBeExDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQXhNam9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jREV5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0RFMU9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod01UVXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdNVGc2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF4T0Nrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhBeU5Ub2dYRndzSUdOdmJuWlFkbUZzZFdVb2NESTFLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjREk0T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3TWpncExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d05UZzZJRnhjTEdOdmJuWlFkbUZzZFdVb0lIQTFPQ2tzSUZ4Y1hGeHVYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F6S1Z4dUlDQmNiaUFnWEc0Z0lHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYR1Z1YUVSbGJuTnBkSGxmWEZ3c0lHNXZkR1VwWEc0Z0lHaGxhV2RvZENBOExTQXpYRzRnSUhkcFpIUm9JRHd0SUROY2JpQWdjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRnhjYVc1Y1hDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUlDQndjbWx1ZENod0tWeHVJQ0JrWlhZdWIyWm1LQ2xjYmlBZ2MzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVJQ0J3Y21sdWRDaHdLVnh1SUNCa1pYWXViMlptS0NsY2JuMWNibkJzYjNSZlpXNW9SR1Z1YzJsMGVTaG5aVzVsTGxSVFV5NTBZaTV3Ykc5MExDQmNYR2R5YjNWd1hGd3NJSGx0WVhnZ1BTQXhNQ2xjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbiMjIGVuaERlbnNpdHlcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGVuaERlbnNpdHlcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRlbmhEZW5zaXR5XG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnBsb3RfZW5oRGVuc2l0eSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4gIHAxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4gIHA1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IGVuaERlbnNpdHkpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNTogXFwsIGNvbnZQdmFsdWUocDE1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE4OiBcXCwgY29udlB2YWx1ZShwMTgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyODogXFwsIGNvbnZQdmFsdWUocDI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDU4OiBcXCxjb252UHZhbHVlKCBwNTgpLCBcXFxcblxcKSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxlbmhEZW5zaXR5X1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAzXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5wbG90X2VuaERlbnNpdHkoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cFxcLCB5bWF4ID0gMTApXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMgZW5oRGVuc2l0eVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZW5oRGVuc2l0eVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJGVuaERlbnNpdHlcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9lbmhEZW5zaXR5IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZW5oRGVuc2l0eSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNTogXFwsIGNvbnZQdmFsdWUocDI1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGVuaERlbnNpdHlfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbnBsb3RfZW5oRGVuc2l0eShnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwXFwsIHltYXggPSAxMClcblxuYGBgXG5gYGAifQ== -->

```r
```r
## enhDensity
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$enhDensity
  distance2 <- (data %>% dplyr::filter(group == group2) )$enhDensity
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_enhDensity <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = enhDensity)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\enhDensity_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_enhDensity(gene.TSS.tb.plot, \group\, ymax = 10)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### enhDensity
###### Binary group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1nY21WblJHVnVjMmwwZVZ4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCbmNtOTFjREVwSUNra2NtVm5SR1Z1YzJsMGVWeHVJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWjNKdmRYQXlLU0FwSkhKbFowUmxibk5wZEhsY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1Y2JseHVjR3h2ZEY5eVpXZEVaVzV6YVhSNUlEd3RJR1oxYm1OMGFXOXVLSFJsYlhBdWRHSXNJRzV2ZEdVc0lIbHRhVzRnUFNBd0xDQjViV0Y0SUQwZ01qQXdNREF3TUNsN1hHNGdJSEF4TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRndpWjNKdmRYQXhYQ0lzSUZ3aVozSnZkWEF5WENJcExDQTFLVnh1SUNCd01UVWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd05Wd2lLU3dnTlNsY2JpQWdjREU0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYQ0puY205MWNERmNJaXdnWENKbmNtOTFjRGhjSWlrc0lEVXBYRzRnSUhBeU5TQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXVkR0lzSUZ3aVozSnZkWEF5WENJc0lGd2laM0p2ZFhBMVhDSXBMQ0ExS1Z4dUlDQndNamdnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TG5SaUxDQmNJbWR5YjNWd01sd2lMQ0JjSW1keWIzVndPRndpS1N3Z05TbGNiaUFnY0RVNElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDNTBZaXdnWENKbmNtOTFjRFZjSWl3Z1hDSm5jbTkxY0RoY0lpa3NJRFVwWEc0Z0lGeHVJQ0J3SUR3dElHZG5jR3h2ZENoMFpXMXdMblJpTENCaFpYTW9lQ0E5SUdkeWIzVndMQ0I1SUQwZ2NtVm5SR1Z1YzJsMGVTa3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQm5jbTkxY0Nrc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnWEc0Z0lDQWdaMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0eExDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRXBJQ3RjYmlBZ0lDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRndpY21Wa1hDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lLU0FyWEc0Z0lDQWdkR2hsYldWZlkyeGhjM05wWXlncElDdGNiaUFnSUNCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQW9lVzFwYmlBcklIbHRZWGdwTHpJZ0t5QXhMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkF4TWpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0RFeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNERTFPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNVFVwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3TVRnNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeE9Da3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQXlOVG9nWENJc0lHTnZiblpRZG1Gc2RXVW9jREkxS1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0RJNE9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod01qZ3BMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndOVGc2SUZ3aUxHTnZiblpRZG1Gc2RXVW9JSEExT0Nrc0lGd2lYRnh1WENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBektWeHVJQ0JjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW5KbFowUmxibk5wZEhsZlhDSXNJRzV2ZEdVcFhHNGdJR2hsYVdkb2RDQThMU0F6WEc0Z0lIZHBaSFJvSUR3dElETmNiaUFnY0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ3aWFXNWNJaXdnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVJQ0J3Y21sdWRDaHdLVnh1SUNCa1pYWXViMlptS0NsY2JpQWdjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1SUNCd2NtbHVkQ2h3S1Z4dUlDQmtaWFl1YjJabUtDbGNibjFjYm5Cc2IzUmZjbVZuUkdWdWMybDBlU2huWlc1bExsUlRVeTUwWWk1d2JHOTBMQ0JjSW1keWIzVndYQ0lzSUhsdFlYZ2dQU0F4TUNsY2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxuIyMgcmVnRGVuc2l0eVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkcmVnRGVuc2l0eVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJHJlZ0RlbnNpdHlcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9yZWdEZW5zaXR5IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gcmVnRGVuc2l0eSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNTogXFwsIGNvbnZQdmFsdWUocDI1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHJlZ0RlbnNpdHlfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbnBsb3RfcmVnRGVuc2l0eShnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwXFwsIHltYXggPSAxMClcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
## regDensity
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$regDensity
  distance2 <- (data %>% dplyr::filter(group == group2) )$regDensity
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_regDensity <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = regDensity)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\regDensity_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_regDensity(gene.TSS.tb.plot, \group\, ymax = 10)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWdjbVZuUkdWdWMybDBlVnh1WjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGdJR1JwYzNSaGJtTmxNU0E4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JuY205MWNERXBJQ2trY21WblJHVnVjMmwwZVZ4dUlDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdaM0p2ZFhBeUtTQXBKSEpsWjBSbGJuTnBkSGxjYmlBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SUNCeVpYUjFjbTRvZDJsc0pIQXVkbUZzZFdVcFhHNTlYRzVjYmx4dWNHeHZkRjl5WldkRVpXNXphWFI1SUR3dElHWjFibU4wYVc5dUtIUmxiWEF1ZEdJc0lHNXZkR1VzSUhsdGFXNGdQU0F3TENCNWJXRjRJRDBnTWpBd01EQXdNQ2w3WEc0Z0lIQXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEF1ZEdJc0lGeGNaM0p2ZFhBeFhGd3NJRnhjWjNKdmRYQXlYRndwTENBMUtWeHVJQ0J3TVRVZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xuUmlMQ0JjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TlZ4Y0tTd2dOU2xjYmlBZ2NERTRJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQzUwWWl3Z1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNEaGNYQ2tzSURVcFhHNGdJSEF5TlNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBdWRHSXNJRnhjWjNKdmRYQXlYRndzSUZ4Y1ozSnZkWEExWEZ3cExDQTFLVnh1SUNCd01qZ2dQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMblJpTENCY1hHZHliM1Z3TWx4Y0xDQmNYR2R5YjNWd09GeGNLU3dnTlNsY2JpQWdjRFU0SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0M1MFlpd2dYRnhuY205MWNEVmNYQ3dnWEZ4bmNtOTFjRGhjWENrc0lEVXBYRzRnSUZ4dUlDQndJRHd0SUdkbmNHeHZkQ2gwWlcxd0xuUmlMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnY21WblJHVnVjMmwwZVNrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCbmNtOTFjQ2tzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUNBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDdGNiaUFnSUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGeGNjbVZrWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0tTQXJYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdJQ0JoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBb2VXMXBiaUFySUhsdFlYZ3BMeklnS3lBeExDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQXhNam9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jREV5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0RFMU9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod01UVXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdNVGc2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF4T0Nrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhBeU5Ub2dYRndzSUdOdmJuWlFkbUZzZFdVb2NESTFLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjREk0T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3TWpncExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d05UZzZJRnhjTEdOdmJuWlFkbUZzZFdVb0lIQTFPQ2tzSUZ4Y1hGeHVYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F6S1Z4dUlDQmNiaUFnWEc0Z0lHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYSEpsWjBSbGJuTnBkSGxmWEZ3c0lHNXZkR1VwWEc0Z0lHaGxhV2RvZENBOExTQXpYRzRnSUhkcFpIUm9JRHd0SUROY2JpQWdjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRnhjYVc1Y1hDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUlDQndjbWx1ZENod0tWeHVJQ0JrWlhZdWIyWm1LQ2xjYmlBZ2MzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVJQ0J3Y21sdWRDaHdLVnh1SUNCa1pYWXViMlptS0NsY2JuMWNibkJzYjNSZmNtVm5SR1Z1YzJsMGVTaG5aVzVsTGxSVFV5NTBZaTV3Ykc5MExDQmNYR2R5YjNWd1hGd3NJSGx0WVhnZ1BTQXhNQ2xjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbiMjIHJlZ0RlbnNpdHlcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJHJlZ0RlbnNpdHlcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRyZWdEZW5zaXR5XG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnBsb3RfcmVnRGVuc2l0eSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApe1xuICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSwgNSlcbiAgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDVcXCksIDUpXG4gIHAxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDJcXCwgXFxncm91cDhcXCksIDUpXG4gIHA1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXA1XFwsIFxcZ3JvdXA4XFwpLCA1KVxuICBcbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IHJlZ0RlbnNpdHkpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNTogXFwsIGNvbnZQdmFsdWUocDE1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE4OiBcXCwgY29udlB2YWx1ZShwMTgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyODogXFwsIGNvbnZQdmFsdWUocDI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDU4OiBcXCxjb252UHZhbHVlKCBwNTgpLCBcXFxcblxcKSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxyZWdEZW5zaXR5X1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAzXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5wbG90X3JlZ0RlbnNpdHkoZ2VuZS5UU1MudGIucGxvdCwgXFxncm91cFxcLCB5bWF4ID0gMTApXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMgcmVnRGVuc2l0eVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkcmVnRGVuc2l0eVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJHJlZ0RlbnNpdHlcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxucGxvdF9yZWdEZW5zaXR5IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7XG4gIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpLCA1KVxuICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMVxcLCBcXGdyb3VwNVxcKSwgNSlcbiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDFcXCwgXFxncm91cDhcXCksIDUpXG4gIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsIFxcZ3JvdXAyXFwsIFxcZ3JvdXA1XFwpLCA1KVxuICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCBcXGdyb3VwMlxcLCBcXGdyb3VwOFxcKSwgNSlcbiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgXFxncm91cDVcXCwgXFxncm91cDhcXCksIDUpXG4gIFxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gcmVnRGVuc2l0eSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNTogXFwsIGNvbnZQdmFsdWUocDI1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHJlZ0RlbnNpdHlfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cbnBsb3RfcmVnRGVuc2l0eShnZW5lLlRTUy50Yi5wbG90LCBcXGdyb3VwXFwsIHltYXggPSAxMClcblxuYGBgXG5gYGAifQ== -->

```r
```r
## regDensity
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$regDensity
  distance2 <- (data %>% dplyr::filter(group == group2) )$regDensity
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


plot_regDensity <- function(temp.tb, note, ymin = 0, ymax = 2000000){
  p12 <- round(getPvalWilcox(temp.tb, \group1\, \group2\), 5)
  p15 <- round(getPvalWilcox(temp.tb, \group1\, \group5\), 5)
  p18 <- round(getPvalWilcox(temp.tb, \group1\, \group8\), 5)
  p25 <- round(getPvalWilcox(temp.tb, \group2\, \group5\), 5)
  p28 <- round(getPvalWilcox(temp.tb, \group2\, \group8\), 5)
  p58 <- round(getPvalWilcox(temp.tb, \group5\, \group8\), 5)
  
  p <- ggplot(temp.tb, aes(x = group, y = regDensity)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() +
    annotate(\text\, x = 1, y = (ymin + ymax)/2 + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\regDensity_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}
plot_regDensity(gene.TSS.tb.plot, \group\, ymax = 10)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

###### Group

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaR2xtWmk1U1RrRWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVpHbG1abDlITVM1a1ZFRkhYMGN4TGpKcExtUlVRVWRmZG5OZlJ6RXVNbWt1UkUxVFR5NTBjM1pjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR1Z1YzJWdFlteGZaMlZ1WlY5cFpDd2diRzluTWtadmJHUkRhR0Z1WjJVc0lITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2NHRmthaWxjYmx4dWRHVnRjQ0E4TFNCc1pXWjBYMnB2YVc0b1oyVnVaUzVVVTFNdWRHSXNJR1JwWm1ZdVVrNUJMQ0JpZVNBOUlHTW9YQ0psYm5ObGJXSnNYQ0lnUFNCY0ltVnVjMlZ0WW14ZloyVnVaVjlwWkZ3aUtTa2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9JV2x6TG01aEtHeHZaekpHYjJ4a1EyaGhibWRsS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lXbHpMbTVoS0ZSQlJDa3BYRzVjYmx4dVpHRjBZU0E4TFNCMFpXMXdJQ1UrSlNCbmNtOTFjRjlpZVNoVVFVUXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMzVnRiV0Z5YVhObEtHRmljMEYyWjB4dlp6SkdReUE5SUdGaWN5aHRaV0Z1S0d4dlp6SkdiMnhrUTJoaGJtZGxLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lYWm5URzluTWtaRElEMGdiV1ZoYmloc2IyY3lSbTlzWkVOb1lXNW5aU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1oyVnVaVVJsYm5OcGRIa2dQU0J0WldGdUtHZGxibVZFWlc1emFYUjVLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJtaEVaVzV6YVhSNUlEMGdiV1ZoYmlobGJtaEVaVzV6YVhSNUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WldkRVpXNXphWFI1SUQwZ2JXVmhiaWh5WldkRVpXNXphWFI1S1NsY2JseHVaR0YwWVNSblpXNWxSR1Z1YzJsMGVVZHliM1Z3SUR3dElHTjFkQ2hjYmlBZ1pHRjBZU1JuWlc1bFJHVnVjMmwwZVN4Y2JpQWdZbkpsWVd0eklEMGdjWFZoYm5ScGJHVW9aR0YwWVNSblpXNWxSR1Z1YzJsMGVTd2djSEp2WW5NZ1BTQnpaWEVvTUN3Z01Td2dNQzR5S1N3Z2JtRXVjbTBnUFNCVVVsVkZLU3hjYmlBZ2FXNWpiSFZrWlM1c2IzZGxjM1FnUFNCVVVsVkZMRnh1SUNCc1lXSmxiSE1nUFNCd1lYTjBaVEFvYzJWeEtEQXNJRGd3TENBeU1Da3NJRndpTFZ3aUxDQnpaWEVvTWpBc0lERXdNQ3dnTWpBcExDQmNJaVZjSWlsY2JpbGNibHh1WkdGMFlTUmxibWhFWlc1emFYUjVSM0p2ZFhBZ1BDMGdZM1YwS0Z4dUlDQmtZWFJoSkdWdWFFUmxibk5wZEhrc1hHNGdJR0p5WldGcmN5QTlJSEYxWVc1MGFXeGxLR1JoZEdFa1pXNW9SR1Z1YzJsMGVTd2djSEp2WW5NZ1BTQnpaWEVvTUN3Z01Td2dNQzR5S1N3Z2JtRXVjbTBnUFNCVVVsVkZLU3hjYmlBZ2FXNWpiSFZrWlM1c2IzZGxjM1FnUFNCVVVsVkZMRnh1SUNCc1lXSmxiSE1nUFNCd1lYTjBaVEFvYzJWeEtEQXNJRGd3TENBeU1Da3NJRndpTFZ3aUxDQnpaWEVvTWpBc0lERXdNQ3dnTWpBcExDQmNJaVZjSWlsY2JpbGNibHh1WEc0akl5TWdVR3h2ZEdsdVp5QWdaM0p2ZFhCcGJtZGNibHh1Y0NBOExTQm5aM0JzYjNRb1pHRjBZU3dnWVdWektIZ2dQU0JsYm1oRVpXNXphWFI1UjNKdmRYQXNJSGtnUFNCbGJtaEVaVzV6YVhSNUxDQm1hV3hzSUQwZ1pXNW9SR1Z1YzJsMGVVZHliM1Z3S1NrZ0t5QmNiaUFnWjJWdmJWOWliM2h3Ykc5MEtHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb01Dd2djWFZoYm5ScGJHVW9aR0YwWVNSbGJtaEVaVzV6YVhSNUxDQXdMams1S1NrcElDdGNiaUFnYkdGaWN5aDRJRDBnWENKRmJtaGhibU5sY2lCRVpXNXphWFI1SUVkeWIzVndYQ0lnTENCNUlEMGdYQ0pVUVVRZ1pXNW9ZVzVqWlhJZ1pHVnVjMmwwZVZ3aUtTQXJYRzRnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSWpSRGxFT1VRNVhDSXNJRndpSTBKR1FrWkNSbHdpTENCY0lpTkJOa0UyUVRaY0lpd2dYQ0lqT0VNNFF6aERYQ0lzSUZ3aUl6Y3pOek0zTTF3aUtTa2dLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQnNaV2RsYm1RdWNHOXphWFJwYjI0Z1BTQmNJbTV2Ym1WY0lpeGNiaUFnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3dnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRdWVDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lHaHFkWE4wSUQwZ01Td2dkbXAxYzNRZ1BTQXhYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNJblJ5WVc1emNHRnlaVzUwWENJcExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWRHRmtSM0p2ZFhCZlpXNW9SR1Z1YzJsMGVWd2lLVnh1ZDJsa2RHZ2dQQzBnY0dGdVpXeFRhWHBsS0RFdU1pa3FiVzFVYjBsdVkyaGNibWhsYVdkb2RDQThMU0J3WVc1bGJGTnBlbVVvTVM0MUtTcHRiVlJ2U1c1amFGeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVhHNWNibHh1WEc1d0lEd3RJR2RuY0d4dmRDaGtZWFJoTENCaFpYTW9lQ0E5SUdkbGJtVkVaVzV6YVhSNVIzSnZkWEFzSUhrZ1BTQm5aVzVsUkdWdWMybDBlU3dnWm1sc2JDQTlJR2RsYm1WRVpXNXphWFI1UjNKdmRYQXBLU0FySUZ4dUlDQm5aVzl0WDJKdmVIQnNiM1FvWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxUV1ZrYVhWdElDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTUN3Z2NYVmhiblJwYkdVb1pHRjBZU1JuWlc1bFJHVnVjMmwwZVN3Z01DNDVPU2twS1NBclhHNGdJR3hoWW5Nb2VDQTlJRndpUjJWdVpTQkVaVzV6YVhSNUlFZHliM1Z3WENJZ0xDQjVJRDBnWENKSFpXNWxJR1JsYm5OcGRIbGNJaWtnSzF4dUlDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRndpSXpjM056YzNOMXdpTENCY0lpTTRRamRGTmpWY0lpd2dYQ0lqUVRJNE5EVXlYQ0lzSUZ3aUkwTXlPRGcwUkZ3aUxDQmNJaU5HTWpoRk1rTmNJaWtwSUN0Y2JpQWdkR2hsYldVb1hHNGdJQ0FnYkdWblpXNWtMbkJ2YzJsMGFXOXVJRDBnWENKdWIyNWxYQ0lzWEc0Z0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQmhibWRzWlNBOUlEUTFMQ0JvYW5WemRDQTlJREVzSUhacWRYTjBJRDBnTVZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1c2FXNWxJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpd2djMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWENKMGNtRnVjM0JoY21WdWRGd2lLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5a3NYRzRnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtWeHVJQ0FwWEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSjBZV1JIY205MWNGOW5aVzVsUkdWdWMybDBlVndpS1Z4dWQybGtkR2dnUEMwZ016RXFiVzFVYjBsdVkyaGNibWhsYVdkb2RDQThMU0F6T0NwdGJWUnZTVzVqYUZ4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc1Y2JpTWpJeUJRYkc5MGRHbHVaeUJrYVhOMGNtbGlkWFJwYjI0Z0xTQmxibWhjYmlCblpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaUFnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dWdWFFUmxibk5wZEhsSGNtOTFjQ0E5UFdkeWIzVndNU2tnS1NSaGRtZE1iMmN5UmtOY2JpQWdaR2x6ZEdGdVkyVXlJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR1Z1YUVSbGJuTnBkSGxIY205MWNDQTlQV2R5YjNWd01pa2dLU1JoZG1kTWIyY3lSa05jYmlBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SUNCeVpYUjFjbTRvZDJsc0pIQXVkbUZzZFdVcFhHNTlYRzVjYmx4dUl5TWpJeUJCVEV4Y2JpTWdlV3hwYlNBOExTQnRZWGdvWVdKektIRjFZVzUwYVd4bEtHUmhkR0VrWVhablRHOW5Na1pETENBd0xqQXhLU2tzSUdGaWN5aHhkV0Z1ZEdsc1pTaGtZWFJoSkdGMloweHZaekpHUXl3Z01DNDVPU2twS1Z4dUl5QndJRHd0SUdkbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlHVnVhRVJsYm5OcGRIbEhjbTkxY0N3Z2VTQTlJR0YyWjB4dlp6SkdReWtwSUNzZ1oyVnZiVjkyYVc5c2FXNG9ZV1Z6S0dacGJHd2dQU0JsYm1oRVpXNXphWFI1UjNKdmRYQXBLU3NnWEc0aklDQWdaMlZ2YlY5aWIzaHdiRzkwS0c5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVN3Z2QybGtkR2dnUFNBd0xqRXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3RjYmlNZ0lDQmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb0xYbHNhVzBzSUhsc2FXMHBLU0FyWEc0aklDQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Da2dLeUFnSUhSb1pXMWxLR3hsWjJWdVpDNXdiM05wZEdsdmJpQTlJRndpYm05dVpWd2lLU0FyWEc0aklDQWdjMk5oYkdWZlptbHNiRjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWlOa09XUTVaRGxjSWl3Z1hDSWpZbVJpWkdKa1hDSXNJRndpSXprMk9UWTVObHdpTENCY0lpTTNNemN6TnpOY0lpd2dYQ0lqTlRJMU1qVXlYQ0lwS1Z4dUl5QmNiaU1nWm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z3aWRHRmtSM0p2ZFhCZlpXNW9SR1Z1YzJsMGVWOWhkbWRNYjJjeVJrTmNJaWxjYmlNZ2FHVnBaMmgwSUR3dElETmNiaU1nZDJsa2RHZ2dQQzBnTTF4dUl5QndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0aklIQnlhVzUwS0hBcFhHNGpJR1JsZGk1dlptWW9LVnh1SXlCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGpJSEJ5YVc1MEtIQXBYRzRqSUdSbGRpNXZabVlvS1Z4dUl5TWpJeUJWVUZ4dVpHRjBZUzV3YkhWeklEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1lYWm5URzluTWtaRElENGdNQ2xjYm5Cek1ERWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMbkJzZFhNc0lGd2lNQzB5TUNWY0lpd2dYQ0l5TUMwME1DVmNJaWtzSURVcFhHNXdjekV5SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVM1d2JIVnpMQ0JjSWpJd0xUUXdKVndpTENCY0lqUXdMVFl3SlZ3aUtTd2dOU2xjYm5Cek1qTWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMbkJzZFhNc0lGd2lOREF0TmpBbFhDSXNJRndpTmpBdE9EQWxYQ0lwTENBMUtWeHVjSE16TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFdWNHeDFjeXdnWENJMk1DMDRNQ1ZjSWl3Z1hDSTRNQzB4TURBbFhDSXBMQ0ExS1Z4dVhHNWNibHh1Y0NBOExTQm5aM0JzYjNRb1pHRjBZUzV3YkhWekxDQmhaWE1vZUNBOUlHVnVhRVJsYm5OcGRIbEhjbTkxY0N3Z2VTQTlJR0YyWjB4dlp6SkdReWtwSUNzZ1hHNGdJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ1pXNW9SR1Z1YzJsMGVVZHliM1Z3S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcEt5QmNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ3dnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwS1NBclhHNGdJR3hoWW5Nb2VDQTlJRndpUlc1b1lXNWpaWElnWkdWdWMybDBlU0JuY205MWNGd2lJQ3dnZVNBOUlGd2lZWFpuSUd4dlp6SW9abTlzWkNCamFHRnVaMlVwWENJcElDdGNiaUFnYzNSaGRGOXpkVzF0WVhKNUtGeHVJQ0FnSUdGbGN5aG5jbTkxY0NBOUlHVnVhRVJsYm5OcGRIbEhjbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNYRzRnSUNBZ1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlERXNYRzRnSUNBZ1ptbHNiQ0E5SUZ3aWNtVmtYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpWEc0Z0lDa2dLMXh1SUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2lJMFE1UkRsRU9Wd2lMQ0JjSWlOQ1JrSkdRa1pjSWl3Z1hDSWpRVFpCTmtFMlhDSXNJRndpSXpoRE9FTTRRMXdpTENCY0lpTTNNemN6TnpOY0lpa3BJQ3RjYmlBZ2RHaGxiV1VvWEc0Z0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQmhibWRzWlNBOUlEUTFMQ0JvYW5WemRDQTlJREVzSUhacWRYTjBJRDBnTVZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1c2FXNWxJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpd2djMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWENKMGNtRnVjM0JoY21WdWRGd2lLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5a3NYRzRnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtWeHVJQ0FwS3lCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTUN3Z01TNDFLU2tnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SURFc0lIa2dQU0F4TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5Cek1ERTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNREVwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pFeU9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6RXlLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE15TXpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNeU15a3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNelE2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TXpRcExDQmNJbHhjYmx3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBeUtWeHVYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0luUmhaRWR5YjNWd1gyVnVhRVJsYm5OcGRIbGZZWFpuVEc5bk1rWkRYM1Z3WENJcFhHNTNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NUzR4TlNrcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzR3TnlrcWJXMVViMGx1WTJoY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dVhHNGpJeU1qSUVSUFYwNWNibVJoZEdFdWJXbHVkWE1nUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhoZG1kTWIyY3lSa01nUENBd0tWeHVjSE13TVNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFdWJXbHVkWE1zSUZ3aU1DMHlNQ1ZjSWl3Z1hDSXlNQzAwTUNWY0lpa3NJRFVwWEc1d2N6RXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZUzV0YVc1MWN5d2dYQ0l5TUMwME1DVmNJaXdnWENJME1DMDJNQ1ZjSWlrc0lEVXBYRzV3Y3pJeklEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTNXRhVzUxY3l3Z1hDSTBNQzAyTUNWY0lpd2dYQ0kyTUMwNE1DVmNJaWtzSURVcFhHNXdjek0wSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVM1dGFXNTFjeXdnWENJMk1DMDRNQ1ZjSWl3Z1hDSTRNQzB4TURBbFhDSXBMQ0ExS1Z4dVhHNWNibkFnUEMwZ1oyZHdiRzkwS0dSaGRHRXViV2x1ZFhNc0lHRmxjeWg0SUQwZ1pXNW9SR1Z1YzJsMGVVZHliM1Z3TENCNUlEMGdZWFpuVEc5bk1rWkRLU2tnS3lCY2JpQWdaMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCbGJtaEVaVzV6YVhSNVIzSnZkWEFwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrcklGeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFwSUN0Y2JpQWdiR0ZpY3loNElEMGdYQ0pGYm1oaGJtTmxjaUJrWlc1emFYUjVJR2R5YjNWd1hDSWdMQ0I1SUQwZ1hDSmhkbWNnYkc5bk1paG1iMnhrSUdOb1lXNW5aU2xjSWlrZ0sxeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1hHNGdJQ0FnWVdWektHZHliM1Z3SUQwZ1pXNW9SR1Z1YzJsMGVVZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpeGNiaUFnSUNCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01TeGNiaUFnSUNCbWFXeHNJRDBnWENKeVpXUmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0pjYmlBZ0tTQXJYRzRnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSWpSRGxFT1VRNVhDSXNJRndpSTBKR1FrWkNSbHdpTENCY0lpTkJOa0UyUVRaY0lpd2dYQ0lqT0VNNFF6aERYQ0lzSUZ3aUl6Y3pOek0zTTF3aUtTa2dLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl3Z1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUXVlQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJR2hxZFhOMElEMGdNU3dnZG1wMWMzUWdQU0F4WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxDQnphWHBsSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjSW5SeVlXNXpjR0Z5Wlc1MFhDSXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2tySUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWd0TVM0MUxDQXdLU2tyWEc0Z0lHRnVibTkwWVhSbEtGd2lkR1Y0ZEZ3aUxDQjRJRDBnTVN3Z2VTQTlJQzB4TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5Cek1ERTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNREVwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pFeU9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6RXlLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE15TXpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNeU15a3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNelE2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TXpRcExDQmNJbHhjYmx3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBeUtWeHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKMFlXUkhjbTkxY0Y5bGJtaEVaVzV6YVhSNVgyRjJaMHh2WnpKR1ExOWtiM2R1WENJcFhHNTNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NUzR4TnpVcEttMXRWRzlKYm1Ob1hHNW9aV2xuYUhRZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TURjcEttMXRWRzlKYm1Ob1hHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Y2JseHVYRzRqSXlNZ1VHeHZkSFJwYm1jZ1pHbHpkSEpwWW5WMGFXOXVJQzBnWjJWdVpWeHVJeU1qSXlCQlRFeGNiaU1nZVd4cGJTQThMU0J0WVhnb1lXSnpLSEYxWVc1MGFXeGxLR1JoZEdFa1lYWm5URzluTWtaRExDQXdMakF4S1Nrc0lHRmljeWh4ZFdGdWRHbHNaU2hrWVhSaEpHRjJaMHh2WnpKR1F5d2dNQzQ1T1NrcEtWeHVJeUJ3SUR3dElHZG5jR3h2ZENoa1lYUmhMQ0JoWlhNb2VDQTlJR2RsYm1WRVpXNXphWFI1UjNKdmRYQXNJSGtnUFNCaGRtZE1iMmN5UmtNcEtTQXJJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ1oyVnVaVVJsYm5OcGRIbEhjbTkxY0NrcEt5QmNiaU1nSUNCblpXOXRYMkp2ZUhCc2IzUW9iM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJMQ0IzYVdSMGFDQTlJREF1TVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJeUFnSUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWd0ZVd4cGJTd2dlV3hwYlNrcElDdGNiaU1nSUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBcklDQWdkR2hsYldVb2JHVm5aVzVrTG5CdmMybDBhVzl1SUQwZ1hDSnViMjVsWENJcElDdGNiaU1nSUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2lJMlE1WkRsa09Wd2lMQ0JjSWlOaVpHSmtZbVJjSWl3Z1hDSWpPVFk1TmprMlhDSXNJRndpSXpjek56TTNNMXdpTENCY0lpTTFNalV5TlRKY0lpa3BYRzRqSUZ4dUl5Qm1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0owWVdSSGNtOTFjRjluWlc1bFJHVnVjMmwwZVY5aGRtZE1iMmN5UmtOY0lpbGNiaU1nYUdWcFoyaDBJRHd0SUROY2JpTWdkMmxrZEdnZ1BDMGdNMXh1SXlCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRqSUhCeWFXNTBLSEFwWEc0aklHUmxkaTV2Wm1Zb0tWeHVJeUJ6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0aklIQnlhVzUwS0hBcFhHNGpJR1JsZGk1dlptWW9LVnh1SUdkbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjJWdVpVUmxibk5wZEhsSGNtOTFjQ0E5UFdkeWIzVndNU2tnS1NSaGRtZE1iMmN5UmtOY2JpQWdaR2x6ZEdGdVkyVXlJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2RsYm1WRVpXNXphWFI1UjNKdmRYQWdQVDFuY205MWNESXBJQ2trWVhablRHOW5Na1pEWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WEc1Y2JtUmhkR0V1Y0d4MWN5QThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHRjJaMHh2WnpKR1F5QStJREFwWEc1d2N6QXhJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZUzV3YkhWekxDQmNJakF0TWpBbFhDSXNJRndpTWpBdE5EQWxYQ0lwTENBMUtWeHVjSE14TWlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFdWNHeDFjeXdnWENJeU1DMDBNQ1ZjSWl3Z1hDSTBNQzAyTUNWY0lpa3NJRFVwWEc1d2N6SXpJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZUzV3YkhWekxDQmNJalF3TFRZd0pWd2lMQ0JjSWpZd0xUZ3dKVndpS1N3Z05TbGNibkJ6TXpRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExuQnNkWE1zSUZ3aU5qQXRPREFsWENJc0lGd2lPREF0TVRBd0pWd2lLU3dnTlNsY2JseHVYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtHUmhkR0V1Y0d4MWN5d2dZV1Z6S0hnZ1BTQm5aVzVsUkdWdWMybDBlVWR5YjNWd0xDQjVJRDBnWVhablRHOW5Na1pES1NrZ0t5QmNiaUFnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQm5aVzVsUkdWdWMybDBlVWR5YjNWd0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBLeUJjYmlBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUN3Z2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMEtTQXJYRzRnSUd4aFluTW9lQ0E5SUZ3aVIyVnVaU0JrWlc1emFYUjVJR2R5YjNWd1hDSWdMQ0I1SUQwZ1hDSmhkbWNnYkc5bk1paG1iMnhrSUdOb1lXNW5aU2xjSWlrZ0sxeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1hHNGdJQ0FnWVdWektHZHliM1Z3SUQwZ1oyVnVaVVJsYm5OcGRIbEhjbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNYRzRnSUNBZ1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlERXNYRzRnSUNBZ1ptbHNiQ0E5SUZ3aWNtVmtYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpWEc0Z0lDa2dLMXh1SUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2lJMFE1UkRsRU9Wd2lMQ0JjSWlOQ1JrSkdRa1pjSWl3Z1hDSWpRVFpCTmtFMlhDSXNJRndpSXpoRE9FTTRRMXdpTENCY0lpTTNNemN6TnpOY0lpa3BJQ3RjYmlBZ2RHaGxiV1VvWEc0Z0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQmhibWRzWlNBOUlEUTFMQ0JvYW5WemRDQTlJREVzSUhacWRYTjBJRDBnTVZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1c2FXNWxJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpd2djMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWENKMGNtRnVjM0JoY21WdWRGd2lLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5a3NYRzRnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtWeHVJQ0FwS3lCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTUN3Z01TNDFLU2tnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SURFc0lIa2dQU0F4TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5Cek1ERTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNREVwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pFeU9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6RXlLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE15TXpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNeU15a3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNelE2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TXpRcExDQmNJbHhjYmx3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBeUtWeHVYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0luUmhaRWR5YjNWd1gyZGxibVZFWlc1emFYUjVYMkYyWjB4dlp6SkdRMTkxY0Z3aUtWeHVkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TVRVcEttMXRWRzlKYm1Ob1hHNW9aV2xuYUhRZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TURjcEttMXRWRzlKYm1Ob1hHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Y2JseHVJeU1qSXlCRVQxZE9YRzVrWVhSaExtMXBiblZ6SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWVhablRHOW5Na1pESUR3Z01DbGNibkJ6TURFZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExtMXBiblZ6TENCY0lqQXRNakFsWENJc0lGd2lNakF0TkRBbFhDSXBMQ0ExS1Z4dWNITXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0V1YldsdWRYTXNJRndpTWpBdE5EQWxYQ0lzSUZ3aU5EQXROakFsWENJcExDQTFLVnh1Y0hNeU15QThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXViV2x1ZFhNc0lGd2lOREF0TmpBbFhDSXNJRndpTmpBdE9EQWxYQ0lwTENBMUtWeHVjSE16TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFdWJXbHVkWE1zSUZ3aU5qQXRPREFsWENJc0lGd2lPREF0TVRBd0pWd2lLU3dnTlNsY2JseHVYRzV3SUR3dElHZG5jR3h2ZENoa1lYUmhMbTFwYm5WekxDQmhaWE1vZUNBOUlHZGxibVZFWlc1emFYUjVSM0p2ZFhBc0lIa2dQU0JoZG1kTWIyY3lSa01wS1NBcklGeHVJQ0JuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlHZGxibVZFWlc1emFYUjVSM0p2ZFhBcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa3JJRnh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMakVzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRcElDdGNiaUFnYkdGaWN5aDRJRDBnWENKSFpXNWxJR1JsYm5OcGRIa2daM0p2ZFhCY0lpQXNJSGtnUFNCY0ltRjJaeUJzYjJjeUtHWnZiR1FnWTJoaGJtZGxLVndpS1NBclhHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoY2JpQWdJQ0JoWlhNb1ozSnZkWEFnUFNCblpXNWxSR1Z1YzJsMGVVZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpeGNiaUFnSUNCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01TeGNiaUFnSUNCbWFXeHNJRDBnWENKeVpXUmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0pjYmlBZ0tTQXJYRzRnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSWpSRGxFT1VRNVhDSXNJRndpSTBKR1FrWkNSbHdpTENCY0lpTkJOa0UyUVRaY0lpd2dYQ0lqT0VNNFF6aERYQ0lzSUZ3aUl6Y3pOek0zTTF3aUtTa2dLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl3Z1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUXVlQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJR2hxZFhOMElEMGdNU3dnZG1wMWMzUWdQU0F4WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxDQnphWHBsSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjSW5SeVlXNXpjR0Z5Wlc1MFhDSXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2tySUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWd0TVM0MUxDQXdLU2tyWEc0Z0lHRnVibTkwWVhSbEtGd2lkR1Y0ZEZ3aUxDQjRJRDBnTVN3Z2VTQTlJQzB4TENCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5Cek1ERTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNREVwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pFeU9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6RXlLU3dnWENKY1hHNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2ljSE15TXpvZ1hDSXNJR052Ym5aUWRtRnNkV1VvY0hNeU15a3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQnpNelE2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEJ6TXpRcExDQmNJbHhjYmx3aUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCb2FuVnpkQ0E5SURBc0lITnBlbVVnUFNBeUtWeHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKMFlXUkhjbTkxY0Y5blpXNWxSR1Z1YzJsMGVWOWhkbWRNYjJjeVJrTmZaRzkzYmx3aUtWeHVkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TVRjMUtTcHRiVlJ2U1c1amFGeHVhR1ZwWjJoMElEd3RJSEJoYm1Wc1UybDZaU2d4TGpBM0tTcHRiVlJ2U1c1amFGeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVhHNWNiaU1qSXlCRFJFWWdjR3h2ZEZ4dVhHNXJjMTl5WlhOMWJIUWdQQzBnYTNNdWRHVnpkQ2hjYmlBZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuWlc1bFJHVnVjMmwwZVVkeWIzVndJRDA5SUZ3aU1DMHlNQ1ZjSWlrZ0pUNGxJSEIxYkd3b1lXSnpRWFpuVEc5bk1rWkRLU3hjYmlBZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuWlc1bFJHVnVjMmwwZVVkeWIzVndJRDA5SUZ3aU1qQXROREFsWENJcElDVStKU0J3ZFd4c0tHRmljMEYyWjB4dlp6SkdReWxjYmlsY2JseHVYRzV3SUR3dElHZG5jR3h2ZENoa1lYUmhMQ0JoWlhNb2VDQTlJR0ZpYzBGMloweHZaekpHUXl3Z1kyOXNiM0lnUFNCblpXNWxSR1Z1YzJsMGVVZHliM1Z3S1NrZ0sxeHVJQ0J6WTJGc1pWOWpiMnh2Y2w5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnY21WMktHTW9YQ0lqTnpjM056YzNYQ0lzSUZ3aUl6aENOMFUyTlZ3aUxDQmNJaU5CTWpnME5USmNJaXdnWENJalF6STRPRFJFWENJc0lGd2lJMFl5T0VVeVExd2lLU2twSUN0Y2JpQWdjM1JoZEY5bFkyUm1LSE5wZW1VZ1BTQXdMalFzSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZOWldScGRXMGdLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lJQ2tnS3lBaklGVnpaU0J6ZEdGMFgyVmpaR1lnZEc4Z2NHeHZkQ0IwYUdVZ1pXMXdhWEpwWTJGc0lFTkVSbHh1SUNCc1lXSnpLRnh1SUNBZ0lIZ2dQU0JjSWtGaWN5NGdiRzluTWlobWIyeGtJR05vWVc1blpTbGNJaXhjYmlBZ0lDQjVJRDBnWENKRGRXMTFiR0YwYVhabElGQnliMkpoWW1sc2FYUjVYQ0pjYmlBZ0tTQXJJR052YjNKa1gyTmhjblJsYzJsaGJpaDRiR2x0SUQwZ1l5Z3dMQ0F4TGpVcEtTQXJYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUNNZ1EyeGxZVzRnZEdobGJXVmNiaUFnZEdobGJXVW9YRzRnSUNBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjSW5SeVlXNXpjR0Z5Wlc1MFhDSXBMRnh1SUNBZ0lHeGxaMlZ1WkM1d2IzTnBkR2x2YmlBOUlGd2libTl1WlZ3aUxGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJQ2tnS3lCelkyRnNaVjk1WDJOdmJuUnBiblZ2ZFhNb2JHRmlaV3h6SUQwZ2MyTmhiR1Z6T2pwdWRXMWlaWEpmWm05eWJXRjBLR0ZqWTNWeVlXTjVJRDBnTUM0eEtTbGNibHh1WEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSjBZV1JIY205MWNGOW5aVzVsUkdWdWMybDBlVjloZG1kTWIyY3lSa05mWTJSbVhDSXBYRzUzYVdSMGFDQThMU0F6TXlwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dE16TXFiVzFVYjBsdVkyaGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JseHVaR0YwWVNBOExTQmtZWFJoTG0xcGJuVnpYRzVjYm1keWIzVndNVjlrWVhSaElEd3RJR1JoZEdFa1lXSnpRWFpuVEc5bk1rWkRXMlJoZEdFa1oyVnVaVVJsYm5OcGRIbEhjbTkxY0NBOVBTQmNJakF0TWpBbFhDSmRYRzVuY205MWNESmZaR0YwWVNBOExTQmtZWFJoSkdGaWMwRjJaMHh2WnpKR1ExdGtZWFJoSkdkbGJtVkVaVzV6YVhSNVIzSnZkWEFnUFQwZ1hDSXlNQzAwTUNWY0lsMWNibXR6TG5SbGMzUW9aM0p2ZFhBeFgyUmhkR0VzSUdkeWIzVndNbDlrWVhSaEtWeHVYRzVuY205MWNERmZaR0YwWVNBOExTQmtZWFJoSkdGaWMwRjJaMHh2WnpKR1ExdGtZWFJoSkdkbGJtVkVaVzV6YVhSNVIzSnZkWEFnUFQwZ1hDSXlNQzAwTUNWY0lsMWNibWR5YjNWd01sOWtZWFJoSUR3dElHUmhkR0VrWVdKelFYWm5URzluTWtaRFcyUmhkR0VrWjJWdVpVUmxibk5wZEhsSGNtOTFjQ0E5UFNCY0lqUXdMVFl3SlZ3aVhWeHVhM011ZEdWemRDaG5jbTkxY0RGZlpHRjBZU3dnWjNKdmRYQXlYMlJoZEdFcFhHNWNibWR5YjNWd01WOWtZWFJoSUR3dElHUmhkR0VrWVdKelFYWm5URzluTWtaRFcyUmhkR0VrWjJWdVpVUmxibk5wZEhsSGNtOTFjQ0E5UFNCY0lqUXdMVFl3SlZ3aVhWeHVaM0p2ZFhBeVgyUmhkR0VnUEMwZ1pHRjBZU1JoWW5OQmRtZE1iMmN5UmtOYlpHRjBZU1JuWlc1bFJHVnVjMmwwZVVkeWIzVndJRDA5SUZ3aU5qQXRPREFsWENKZFhHNXJjeTUwWlhOMEtHZHliM1Z3TVY5a1lYUmhMQ0JuY205MWNESmZaR0YwWVNsY2JseHVaM0p2ZFhBeFgyUmhkR0VnUEMwZ1pHRjBZU1JoWW5OQmRtZE1iMmN5UmtOYlpHRjBZU1JuWlc1bFJHVnVjMmwwZVVkeWIzVndJRDA5SUZ3aU5qQXRPREFsWENKZFhHNW5jbTkxY0RKZlpHRjBZU0E4TFNCa1lYUmhKR0ZpYzBGMloweHZaekpHUTF0a1lYUmhKR2RsYm1WRVpXNXphWFI1UjNKdmRYQWdQVDBnWENJNE1DMHhNREFsWENKZFhHNXJjeTUwWlhOMEtHZHliM1Z3TVY5a1lYUmhMQ0JuY205MWNESmZaR0YwWVNsY2JseHVYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGopXG5cbnRlbXAgPC0gbGVmdF9qb2luKGdlbmUuVFNTLnRiLCBkaWZmLlJOQSwgYnkgPSBjKFxcZW5zZW1ibFxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShsb2cyRm9sZENoYW5nZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpcy5uYShUQUQpKVxuXG5cbmRhdGEgPC0gdGVtcCAlPiUgZ3JvdXBfYnkoVEFEKSAlPiVcbiAgZHBseXI6OnN1bW1hcmlzZShhYnNBdmdMb2cyRkMgPSBhYnMobWVhbihsb2cyRm9sZENoYW5nZSkpLFxuICAgICAgICAgICAgICAgICAgIGF2Z0xvZzJGQyA9IG1lYW4obG9nMkZvbGRDaGFuZ2UpLFxuICAgICAgICAgICAgICAgICAgIGdlbmVEZW5zaXR5ID0gbWVhbihnZW5lRGVuc2l0eSksXG4gICAgICAgICAgICAgICAgICAgZW5oRGVuc2l0eSA9IG1lYW4oZW5oRGVuc2l0eSksXG4gICAgICAgICAgICAgICAgICAgcmVnRGVuc2l0eSA9IG1lYW4ocmVnRGVuc2l0eSkpXG5cbmRhdGEkZ2VuZURlbnNpdHlHcm91cCA8LSBjdXQoXG4gIGRhdGEkZ2VuZURlbnNpdHksXG4gIGJyZWFrcyA9IHF1YW50aWxlKGRhdGEkZ2VuZURlbnNpdHksIHByb2JzID0gc2VxKDAsIDEsIDAuMiksIG5hLnJtID0gVFJVRSksXG4gIGluY2x1ZGUubG93ZXN0ID0gVFJVRSxcbiAgbGFiZWxzID0gcGFzdGUwKHNlcSgwLCA4MCwgMjApLCBcXC1cXCwgc2VxKDIwLCAxMDAsIDIwKSwgXFwlXFwpXG4pXG5cbmRhdGEkZW5oRGVuc2l0eUdyb3VwIDwtIGN1dChcbiAgZGF0YSRlbmhEZW5zaXR5LFxuICBicmVha3MgPSBxdWFudGlsZShkYXRhJGVuaERlbnNpdHksIHByb2JzID0gc2VxKDAsIDEsIDAuMiksIG5hLnJtID0gVFJVRSksXG4gIGluY2x1ZGUubG93ZXN0ID0gVFJVRSxcbiAgbGFiZWxzID0gcGFzdGUwKHNlcSgwLCA4MCwgMjApLCBcXC1cXCwgc2VxKDIwLCAxMDAsIDIwKSwgXFwlXFwpXG4pXG5cblxuIyMjIFBsb3RpbmcgIGdyb3VwaW5nXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZW5oRGVuc2l0eUdyb3VwLCB5ID0gZW5oRGVuc2l0eSwgZmlsbCA9IGVuaERlbnNpdHlHcm91cCkpICsgXG4gIGdlb21fYm94cGxvdChjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIHF1YW50aWxlKGRhdGEkZW5oRGVuc2l0eSwgMC45OSkpKSArXG4gIGxhYnMoeCA9IFxcRW5oYW5jZXIgRGVuc2l0eSBHcm91cFxcICwgeSA9IFxcVEFEIGVuaGFuY2VyIGRlbnNpdHlcXCkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICtcbiAgdGhlbWUoXG4gICAgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXHRhZEdyb3VwX2VuaERlbnNpdHlcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBnZW5lRGVuc2l0eUdyb3VwLCB5ID0gZ2VuZURlbnNpdHksIGZpbGwgPSBnZW5lRGVuc2l0eUdyb3VwKSkgKyBcbiAgZ2VvbV9ib3hwbG90KGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIHF1YW50aWxlKGRhdGEkZ2VuZURlbnNpdHksIDAuOTkpKSkgK1xuICBsYWJzKHggPSBcXEdlbmUgRGVuc2l0eSBHcm91cFxcICwgeSA9IFxcR2VuZSBkZW5zaXR5XFwpICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCM3Nzc3NzdcXCwgXFwjOEI3RTY1XFwsIFxcI0EyODQ1MlxcLCBcXCNDMjg4NERcXCwgXFwjRjI4RTJDXFwpKSArXG4gIHRoZW1lKFxuICAgIGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcLFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKVxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcdGFkR3JvdXBfZ2VuZURlbnNpdHlcXClcbndpZHRoIDwtIDMxKm1tVG9JbmNoXG5oZWlnaHQgPC0gMzgqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG4jIyMgUGxvdHRpbmcgZGlzdHJpYnV0aW9uIC0gZW5oXG4gZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihlbmhEZW5zaXR5R3JvdXAgPT1ncm91cDEpICkkYXZnTG9nMkZDXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihlbmhEZW5zaXR5R3JvdXAgPT1ncm91cDIpICkkYXZnTG9nMkZDXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbiMjIyMgQUxMXG4jIHlsaW0gPC0gbWF4KGFicyhxdWFudGlsZShkYXRhJGF2Z0xvZzJGQywgMC4wMSkpLCBhYnMocXVhbnRpbGUoZGF0YSRhdmdMb2cyRkMsIDAuOTkpKSlcbiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBlbmhEZW5zaXR5R3JvdXAsIHkgPSBhdmdMb2cyRkMpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZW5oRGVuc2l0eUdyb3VwKSkrIFxuIyAgIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4xKSArIHRoZW1lX2NsYXNzaWMoKSArXG4jICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC15bGltLCB5bGltKSkgK1xuIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCkgK1xuIyAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjZDlkOWQ5XFwsIFxcI2JkYmRiZFxcLCBcXCM5Njk2OTZcXCwgXFwjNzM3MzczXFwsIFxcIzUyNTI1MlxcKSlcbiMgXG4jIGZpbGVOYW1lIDwtIHBhc3RlMChcXHRhZEdyb3VwX2VuaERlbnNpdHlfYXZnTG9nMkZDXFwpXG4jIGhlaWdodCA8LSAzXG4jIHdpZHRoIDwtIDNcbiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMjIyMgVVBcbmRhdGEucGx1cyA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGF2Z0xvZzJGQyA+IDApXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5wbHVzLCBcXDAtMjAlXFwsIFxcMjAtNDAlXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEucGx1cywgXFwyMC00MCVcXCwgXFw0MC02MCVcXCksIDUpXG5wczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5wbHVzLCBcXDQwLTYwJVxcLCBcXDYwLTgwJVxcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLnBsdXMsIFxcNjAtODAlXFwsIFxcODAtMTAwJVxcKSwgNSlcblxuXG5cbnAgPC0gZ2dwbG90KGRhdGEucGx1cywgYWVzKHggPSBlbmhEZW5zaXR5R3JvdXAsIHkgPSBhdmdMb2cyRkMpKSArIFxuICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGVuaERlbnNpdHlHcm91cCksXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICBsYWJzKHggPSBcXEVuaGFuY2VyIGRlbnNpdHkgZ3JvdXBcXCAsIHkgPSBcXGF2ZyBsb2cyKGZvbGQgY2hhbmdlKVxcKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBlbmhEZW5zaXR5R3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLFxuICAgIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCNEOUQ5RDlcXCwgXFwjQkZCRkJGXFwsIFxcI0E2QTZBNlxcLCBcXCM4QzhDOENcXCwgXFwjNzM3MzczXFwpKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEuNSkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMilcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFx0YWRHcm91cF9lbmhEZW5zaXR5X2F2Z0xvZzJGQ191cFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMTUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMDcpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuIyMjIyBET1dOXG5kYXRhLm1pbnVzIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoYXZnTG9nMkZDIDwgMClcbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLm1pbnVzLCBcXDAtMjAlXFwsIFxcMjAtNDAlXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEubWludXMsIFxcMjAtNDAlXFwsIFxcNDAtNjAlXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEubWludXMsIFxcNDAtNjAlXFwsIFxcNjAtODAlXFwpLCA1KVxucHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEubWludXMsIFxcNjAtODAlXFwsIFxcODAtMTAwJVxcKSwgNSlcblxuXG5wIDwtIGdncGxvdChkYXRhLm1pbnVzLCBhZXMoeCA9IGVuaERlbnNpdHlHcm91cCwgeSA9IGF2Z0xvZzJGQykpICsgXG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZW5oRGVuc2l0eUdyb3VwKSxcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gIGxhYnMoeCA9IFxcRW5oYW5jZXIgZGVuc2l0eSBncm91cFxcICwgeSA9IFxcYXZnIGxvZzIoZm9sZCBjaGFuZ2UpXFwpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGVuaERlbnNpdHlHcm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsXG4gICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEuNSwgMCkpK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAtMSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMilcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcdGFkR3JvdXBfZW5oRGVuc2l0eV9hdmdMb2cyRkNfZG93blxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMTc1KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjA3KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cblxuIyMjIFBsb3R0aW5nIGRpc3RyaWJ1dGlvbiAtIGdlbmVcbiMjIyMgQUxMXG4jIHlsaW0gPC0gbWF4KGFicyhxdWFudGlsZShkYXRhJGF2Z0xvZzJGQywgMC4wMSkpLCBhYnMocXVhbnRpbGUoZGF0YSRhdmdMb2cyRkMsIDAuOTkpKSlcbiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBnZW5lRGVuc2l0eUdyb3VwLCB5ID0gYXZnTG9nMkZDKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdlbmVEZW5zaXR5R3JvdXApKSsgXG4jICAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjEpICsgdGhlbWVfY2xhc3NpYygpICtcbiMgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLXlsaW0sIHlsaW0pKSArXG4jICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcKSArXG4jICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCNkOWQ5ZDlcXCwgXFwjYmRiZGJkXFwsIFxcIzk2OTY5NlxcLCBcXCM3MzczNzNcXCwgXFwjNTI1MjUyXFwpKVxuIyBcbiMgZmlsZU5hbWUgPC0gcGFzdGUwKFxcdGFkR3JvdXBfZ2VuZURlbnNpdHlfYXZnTG9nMkZDXFwpXG4jIGhlaWdodCA8LSAzXG4jIHdpZHRoIDwtIDNcbiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVEZW5zaXR5R3JvdXAgPT1ncm91cDEpICkkYXZnTG9nMkZDXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihnZW5lRGVuc2l0eUdyb3VwID09Z3JvdXAyKSApJGF2Z0xvZzJGQ1xuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5kYXRhLnBsdXMgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihhdmdMb2cyRkMgPiAwKVxucHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEucGx1cywgXFwwLTIwJVxcLCBcXDIwLTQwJVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLnBsdXMsIFxcMjAtNDAlXFwsIFxcNDAtNjAlXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEucGx1cywgXFw0MC02MCVcXCwgXFw2MC04MCVcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5wbHVzLCBcXDYwLTgwJVxcLCBcXDgwLTEwMCVcXCksIDUpXG5cblxuXG5wIDwtIGdncGxvdChkYXRhLnBsdXMsIGFlcyh4ID0gZ2VuZURlbnNpdHlHcm91cCwgeSA9IGF2Z0xvZzJGQykpICsgXG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ2VuZURlbnNpdHlHcm91cCksXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICBsYWJzKHggPSBcXEdlbmUgZGVuc2l0eSBncm91cFxcICwgeSA9IFxcYXZnIGxvZzIoZm9sZCBjaGFuZ2UpXFwpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdlbmVEZW5zaXR5R3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLFxuICAgIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCNEOUQ5RDlcXCwgXFwjQkZCRkJGXFwsIFxcI0E2QTZBNlxcLCBcXCM4QzhDOENcXCwgXFwjNzM3MzczXFwpKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEuNSkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMilcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFx0YWRHcm91cF9nZW5lRGVuc2l0eV9hdmdMb2cyRkNfdXBcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjE1KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjA3KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cbiMjIyMgRE9XTlxuZGF0YS5taW51cyA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGF2Z0xvZzJGQyA8IDApXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5taW51cywgXFwwLTIwJVxcLCBcXDIwLTQwJVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLm1pbnVzLCBcXDIwLTQwJVxcLCBcXDQwLTYwJVxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLm1pbnVzLCBcXDQwLTYwJVxcLCBcXDYwLTgwJVxcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLm1pbnVzLCBcXDYwLTgwJVxcLCBcXDgwLTEwMCVcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QoZGF0YS5taW51cywgYWVzKHggPSBnZW5lRGVuc2l0eUdyb3VwLCB5ID0gYXZnTG9nMkZDKSkgKyBcbiAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBnZW5lRGVuc2l0eUdyb3VwKSxcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gIGxhYnMoeCA9IFxcR2VuZSBkZW5zaXR5IGdyb3VwXFwgLCB5ID0gXFxhdmcgbG9nMihmb2xkIGNoYW5nZSlcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ2VuZURlbnNpdHlHcm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsXG4gICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEuNSwgMCkpK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAtMSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMilcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcdGFkR3JvdXBfZ2VuZURlbnNpdHlfYXZnTG9nMkZDX2Rvd25cXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjE3NSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4wNykqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG4jIyMgQ0RGIHBsb3Rcblxua3NfcmVzdWx0IDwtIGtzLnRlc3QoXG4gIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZURlbnNpdHlHcm91cCA9PSBcXDAtMjAlXFwpICU+JSBwdWxsKGFic0F2Z0xvZzJGQyksXG4gIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZURlbnNpdHlHcm91cCA9PSBcXDIwLTQwJVxcKSAlPiUgcHVsbChhYnNBdmdMb2cyRkMpXG4pXG5cblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBhYnNBdmdMb2cyRkMsIGNvbG9yID0gZ2VuZURlbnNpdHlHcm91cCkpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJldihjKFxcIzc3Nzc3N1xcLCBcXCM4QjdFNjVcXCwgXFwjQTI4NDUyXFwsIFxcI0MyODg0RFxcLCBcXCNGMjhFMkNcXCkpKSArXG4gIHN0YXRfZWNkZihzaXplID0gMC40LCBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCApICsgIyBVc2Ugc3RhdF9lY2RmIHRvIHBsb3QgdGhlIGVtcGlyaWNhbCBDREZcbiAgbGFicyhcbiAgICB4ID0gXFxBYnMuIGxvZzIoZm9sZCBjaGFuZ2UpXFwsXG4gICAgeSA9IFxcQ3VtdWxhdGl2ZSBQcm9iYWJpbGl0eVxcXG4gICkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMS41KSkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyAjIENsZWFuIHRoZW1lXG4gIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICApICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDAuMSkpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcdGFkR3JvdXBfZ2VuZURlbnNpdHlfYXZnTG9nMkZDX2NkZlxcKVxud2lkdGggPC0gMzMqbW1Ub0luY2hcbmhlaWdodCA8LTMzKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbmRhdGEgPC0gZGF0YS5taW51c1xuXG5ncm91cDFfZGF0YSA8LSBkYXRhJGFic0F2Z0xvZzJGQ1tkYXRhJGdlbmVEZW5zaXR5R3JvdXAgPT0gXFwwLTIwJVxcXVxuZ3JvdXAyX2RhdGEgPC0gZGF0YSRhYnNBdmdMb2cyRkNbZGF0YSRnZW5lRGVuc2l0eUdyb3VwID09IFxcMjAtNDAlXFxdXG5rcy50ZXN0KGdyb3VwMV9kYXRhLCBncm91cDJfZGF0YSlcblxuZ3JvdXAxX2RhdGEgPC0gZGF0YSRhYnNBdmdMb2cyRkNbZGF0YSRnZW5lRGVuc2l0eUdyb3VwID09IFxcMjAtNDAlXFxdXG5ncm91cDJfZGF0YSA8LSBkYXRhJGFic0F2Z0xvZzJGQ1tkYXRhJGdlbmVEZW5zaXR5R3JvdXAgPT0gXFw0MC02MCVcXF1cbmtzLnRlc3QoZ3JvdXAxX2RhdGEsIGdyb3VwMl9kYXRhKVxuXG5ncm91cDFfZGF0YSA8LSBkYXRhJGFic0F2Z0xvZzJGQ1tkYXRhJGdlbmVEZW5zaXR5R3JvdXAgPT0gXFw0MC02MCVcXF1cbmdyb3VwMl9kYXRhIDwtIGRhdGEkYWJzQXZnTG9nMkZDW2RhdGEkZ2VuZURlbnNpdHlHcm91cCA9PSBcXDYwLTgwJVxcXVxua3MudGVzdChncm91cDFfZGF0YSwgZ3JvdXAyX2RhdGEpXG5cbmdyb3VwMV9kYXRhIDwtIGRhdGEkYWJzQXZnTG9nMkZDW2RhdGEkZ2VuZURlbnNpdHlHcm91cCA9PSBcXDYwLTgwJVxcXVxuZ3JvdXAyX2RhdGEgPC0gZGF0YSRhYnNBdmdMb2cyRkNbZGF0YSRnZW5lRGVuc2l0eUdyb3VwID09IFxcODAtMTAwJVxcXVxua3MudGVzdChncm91cDFfZGF0YSwgZ3JvdXAyX2RhdGEpXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj)

temp <- left_join(gene.TSS.tb, diff.RNA, by = c(\ensembl\ = \ensembl_gene_id\)) %>% dplyr::filter(!is.na(log2FoldChange),
                                                                                                  !is.na(TAD))


data <- temp %>% group_by(TAD) %>%
  dplyr::summarise(absAvgLog2FC = abs(mean(log2FoldChange)),
                   avgLog2FC = mean(log2FoldChange),
                   geneDensity = mean(geneDensity),
                   enhDensity = mean(enhDensity),
                   regDensity = mean(regDensity))

data$geneDensityGroup <- cut(
  data$geneDensity,
  breaks = quantile(data$geneDensity, probs = seq(0, 1, 0.2), na.rm = TRUE),
  include.lowest = TRUE,
  labels = paste0(seq(0, 80, 20), \-\, seq(20, 100, 20), \%\)
)

data$enhDensityGroup <- cut(
  data$enhDensity,
  breaks = quantile(data$enhDensity, probs = seq(0, 1, 0.2), na.rm = TRUE),
  include.lowest = TRUE,
  labels = paste0(seq(0, 80, 20), \-\, seq(20, 100, 20), \%\)
)


### Ploting  grouping

p <- ggplot(data, aes(x = enhDensityGroup, y = enhDensity, fill = enhDensityGroup)) + 
  geom_boxplot(color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA) + theme_classic() +
  coord_cartesian(ylim = c(0, quantile(data$enhDensity, 0.99))) +
  labs(x = \Enhancer Density Group\ , y = \TAD enhancer density\) +
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) +
  theme(
    legend.position = \none\,
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- paste0(\tadGroup_enhDensity\)
width <- panelSize(1.2)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()




p <- ggplot(data, aes(x = geneDensityGroup, y = geneDensity, fill = geneDensityGroup)) + 
  geom_boxplot(color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA) + theme_classic() +
  coord_cartesian(ylim = c(0, quantile(data$geneDensity, 0.99))) +
  labs(x = \Gene Density Group\ , y = \Gene density\) +
  scale_fill_manual(values = c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\)) +
  theme(
    legend.position = \none\,
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )
fileName <- paste0(\tadGroup_geneDensity\)
width <- 31*mmToInch
height <- 38*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


### Plotting distribution - enh
 getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(enhDensityGroup ==group1) )$avgLog2FC
  distance2 <- (data %>% dplyr::filter(enhDensityGroup ==group2) )$avgLog2FC
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


#### ALL
# ylim <- max(abs(quantile(data$avgLog2FC, 0.01)), abs(quantile(data$avgLog2FC, 0.99)))
# p <- ggplot(data, aes(x = enhDensityGroup, y = avgLog2FC)) + geom_violin(aes(fill = enhDensityGroup))+ 
#   geom_boxplot(outlier.shape = NA, width = 0.1) + theme_classic() +
#   coord_cartesian(ylim = c(-ylim, ylim)) +
#   geom_hline(yintercept = 0) +   theme(legend.position = \none\) +
#   scale_fill_manual(values = c(\#d9d9d9\, \#bdbdbd\, \#969696\, \#737373\, \#525252\))
# 
# fileName <- paste0(\tadGroup_enhDensity_avgLog2FC\)
# height <- 3
# width <- 3
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()
#### UP
data.plus <- data %>% dplyr::filter(avgLog2FC > 0)
ps01 <- round(getPvalWilcox(data.plus, \0-20%\, \20-40%\), 5)
ps12 <- round(getPvalWilcox(data.plus, \20-40%\, \40-60%\), 5)
ps23 <- round(getPvalWilcox(data.plus, \40-60%\, \60-80%\), 5)
ps34 <- round(getPvalWilcox(data.plus, \60-80%\, \80-100%\), 5)



p <- ggplot(data.plus, aes(x = enhDensityGroup, y = avgLog2FC)) + 
  geom_violin(aes(fill = enhDensityGroup),
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE)+ 
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  labs(x = \Enhancer density group\ , y = \avg log2(fold change)\) +
  stat_summary(
    aes(group = enhDensityGroup), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+ coord_cartesian(ylim = c(0, 1.5)) +
  annotate(\text\, x = 1, y = 1, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\), 
           color = \black\, hjust = 0, size = 2)


fileName <- paste0(\tadGroup_enhDensity_avgLog2FC_up\)
width <- panelSize(1.15)*mmToInch
height <- panelSize(1.07)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


#### DOWN
data.minus <- data %>% dplyr::filter(avgLog2FC < 0)
ps01 <- round(getPvalWilcox(data.minus, \0-20%\, \20-40%\), 5)
ps12 <- round(getPvalWilcox(data.minus, \20-40%\, \40-60%\), 5)
ps23 <- round(getPvalWilcox(data.minus, \40-60%\, \60-80%\), 5)
ps34 <- round(getPvalWilcox(data.minus, \60-80%\, \80-100%\), 5)


p <- ggplot(data.minus, aes(x = enhDensityGroup, y = avgLog2FC)) + 
  geom_violin(aes(fill = enhDensityGroup),
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE)+ 
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  labs(x = \Enhancer density group\ , y = \avg log2(fold change)\) +
  stat_summary(
    aes(group = enhDensityGroup), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+ coord_cartesian(ylim = c(-1.5, 0))+
  annotate(\text\, x = 1, y = -1, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\), 
           color = \black\, hjust = 0, size = 2)

fileName <- paste0(\tadGroup_enhDensity_avgLog2FC_down\)
width <- panelSize(1.175)*mmToInch
height <- panelSize(1.07)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



### Plotting distribution - gene
#### ALL
# ylim <- max(abs(quantile(data$avgLog2FC, 0.01)), abs(quantile(data$avgLog2FC, 0.99)))
# p <- ggplot(data, aes(x = geneDensityGroup, y = avgLog2FC)) + geom_violin(aes(fill = geneDensityGroup))+ 
#   geom_boxplot(outlier.shape = NA, width = 0.1) + theme_classic() +
#   coord_cartesian(ylim = c(-ylim, ylim)) +
#   geom_hline(yintercept = 0) +   theme(legend.position = \none\) +
#   scale_fill_manual(values = c(\#d9d9d9\, \#bdbdbd\, \#969696\, \#737373\, \#525252\))
# 
# fileName <- paste0(\tadGroup_geneDensity_avgLog2FC\)
# height <- 3
# width <- 3
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()
 getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(geneDensityGroup ==group1) )$avgLog2FC
  distance2 <- (data %>% dplyr::filter(geneDensityGroup ==group2) )$avgLog2FC
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


data.plus <- data %>% dplyr::filter(avgLog2FC > 0)
ps01 <- round(getPvalWilcox(data.plus, \0-20%\, \20-40%\), 5)
ps12 <- round(getPvalWilcox(data.plus, \20-40%\, \40-60%\), 5)
ps23 <- round(getPvalWilcox(data.plus, \40-60%\, \60-80%\), 5)
ps34 <- round(getPvalWilcox(data.plus, \60-80%\, \80-100%\), 5)



p <- ggplot(data.plus, aes(x = geneDensityGroup, y = avgLog2FC)) + 
  geom_violin(aes(fill = geneDensityGroup),
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE)+ 
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  labs(x = \Gene density group\ , y = \avg log2(fold change)\) +
  stat_summary(
    aes(group = geneDensityGroup), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+ coord_cartesian(ylim = c(0, 1.5)) +
  annotate(\text\, x = 1, y = 1, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\), 
           color = \black\, hjust = 0, size = 2)


fileName <- paste0(\tadGroup_geneDensity_avgLog2FC_up\)
width <- panelSize(1.15)*mmToInch
height <- panelSize(1.07)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


#### DOWN
data.minus <- data %>% dplyr::filter(avgLog2FC < 0)
ps01 <- round(getPvalWilcox(data.minus, \0-20%\, \20-40%\), 5)
ps12 <- round(getPvalWilcox(data.minus, \20-40%\, \40-60%\), 5)
ps23 <- round(getPvalWilcox(data.minus, \40-60%\, \60-80%\), 5)
ps34 <- round(getPvalWilcox(data.minus, \60-80%\, \80-100%\), 5)


p <- ggplot(data.minus, aes(x = geneDensityGroup, y = avgLog2FC)) + 
  geom_violin(aes(fill = geneDensityGroup),
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE)+ 
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  labs(x = \Gene density group\ , y = \avg log2(fold change)\) +
  stat_summary(
    aes(group = geneDensityGroup), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+ coord_cartesian(ylim = c(-1.5, 0))+
  annotate(\text\, x = 1, y = -1, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\), 
           color = \black\, hjust = 0, size = 2)

fileName <- paste0(\tadGroup_geneDensity_avgLog2FC_down\)
width <- panelSize(1.175)*mmToInch
height <- panelSize(1.07)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


### CDF plot

ks_result <- ks.test(
  data %>% dplyr::filter(geneDensityGroup == \0-20%\) %>% pull(absAvgLog2FC),
  data %>% dplyr::filter(geneDensityGroup == \20-40%\) %>% pull(absAvgLog2FC)
)


p <- ggplot(data, aes(x = absAvgLog2FC, color = geneDensityGroup)) +
  scale_color_manual(values = rev(c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\))) +
  stat_ecdf(size = 0.4, linewidth = lineMedium * mmToLineUnit, lineend = \square\ ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Abs. log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.position = \none\,
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS),
    ) + scale_y_continuous(labels = scales::number_format(accuracy = 0.1))


fileName <- paste0(\tadGroup_geneDensity_avgLog2FC_cdf\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

data <- data.minus

group1_data <- data$absAvgLog2FC[data$geneDensityGroup == \0-20%\]
group2_data <- data$absAvgLog2FC[data$geneDensityGroup == \20-40%\]
ks.test(group1_data, group2_data)

group1_data <- data$absAvgLog2FC[data$geneDensityGroup == \20-40%\]
group2_data <- data$absAvgLog2FC[data$geneDensityGroup == \40-60%\]
ks.test(group1_data, group2_data)

group1_data <- data$absAvgLog2FC[data$geneDensityGroup == \40-60%\]
group2_data <- data$absAvgLog2FC[data$geneDensityGroup == \60-80%\]
ks.test(group1_data, group2_data)

group1_data <- data$absAvgLog2FC[data$geneDensityGroup == \60-80%\]
group2_data <- data$absAvgLog2FC[data$geneDensityGroup == \80-100%\]
ks.test(group1_data, group2_data)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVpHbG1aaTVTVGtFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHVnVjMlZ0WW14ZloyVnVaVjlwWkN3Z2JHOW5Na1p2YkdSRGFHRnVaMlVzSUhOb2NtbHVhMlZrWDJ4dlp6SkdReXdnY0dGa2FpbGNibHh1ZEdWdGNDQThMU0JzWldaMFgycHZhVzRvWjJWdVpTNVVVMU11ZEdJc0lHUnBabVl1VWs1QkxDQmllU0E5SUdNb1hGeGxibk5sYldKc1hGd2dQU0JjWEdWdWMyVnRZbXhmWjJWdVpWOXBaRnhjS1NrZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb0lXbHpMbTVoS0d4dlp6SkdiMnhrUTJoaGJtZGxLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSVdsekxtNWhLRlJCUkNrcFhHNWNibHh1WkdGMFlTQThMU0IwWlcxd0lDVStKU0JuY205MWNGOWllU2hVUVVRcElDVStKVnh1SUNCa2NHeDVjam82YzNWdGJXRnlhWE5sS0dGaWMwRjJaMHh2WnpKR1F5QTlJR0ZpY3lodFpXRnVLR3h2WnpKR2IyeGtRMmhoYm1kbEtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVhablRHOW5Na1pESUQwZ2JXVmhiaWhzYjJjeVJtOXNaRU5vWVc1blpTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjJWdVpVUmxibk5wZEhrZ1BTQnRaV0Z1S0dkbGJtVkVaVzV6YVhSNUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYm1oRVpXNXphWFI1SUQwZ2JXVmhiaWhsYm1oRVpXNXphWFI1S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaV2RFWlc1emFYUjVJRDBnYldWaGJpaHlaV2RFWlc1emFYUjVLU2xjYmx4dVpHRjBZU1JuWlc1bFJHVnVjMmwwZVVkeWIzVndJRHd0SUdOMWRDaGNiaUFnWkdGMFlTUm5aVzVsUkdWdWMybDBlU3hjYmlBZ1luSmxZV3R6SUQwZ2NYVmhiblJwYkdVb1pHRjBZU1JuWlc1bFJHVnVjMmwwZVN3Z2NISnZZbk1nUFNCelpYRW9NQ3dnTVN3Z01DNHlLU3dnYm1FdWNtMGdQU0JVVWxWRktTeGNiaUFnYVc1amJIVmtaUzVzYjNkbGMzUWdQU0JVVWxWRkxGeHVJQ0JzWVdKbGJITWdQU0J3WVhOMFpUQW9jMlZ4S0RBc0lEZ3dMQ0F5TUNrc0lGeGNMVnhjTENCelpYRW9NakFzSURFd01Dd2dNakFwTENCY1hDVmNYQ2xjYmlsY2JseHVaR0YwWVNSbGJtaEVaVzV6YVhSNVIzSnZkWEFnUEMwZ1kzVjBLRnh1SUNCa1lYUmhKR1Z1YUVSbGJuTnBkSGtzWEc0Z0lHSnlaV0ZyY3lBOUlIRjFZVzUwYVd4bEtHUmhkR0VrWlc1b1JHVnVjMmwwZVN3Z2NISnZZbk1nUFNCelpYRW9NQ3dnTVN3Z01DNHlLU3dnYm1FdWNtMGdQU0JVVWxWRktTeGNiaUFnYVc1amJIVmtaUzVzYjNkbGMzUWdQU0JVVWxWRkxGeHVJQ0JzWVdKbGJITWdQU0J3WVhOMFpUQW9jMlZ4S0RBc0lEZ3dMQ0F5TUNrc0lGeGNMVnhjTENCelpYRW9NakFzSURFd01Dd2dNakFwTENCY1hDVmNYQ2xjYmlsY2JseHVYRzRqSXlNZ1VHeHZkR2x1WnlBZ1ozSnZkWEJwYm1kY2JseHVjQ0E4TFNCblozQnNiM1FvWkdGMFlTd2dZV1Z6S0hnZ1BTQmxibWhFWlc1emFYUjVSM0p2ZFhBc0lIa2dQU0JsYm1oRVpXNXphWFI1TENCbWFXeHNJRDBnWlc1b1JHVnVjMmwwZVVkeWIzVndLU2tnS3lCY2JpQWdaMlZ2YlY5aWIzaHdiRzkwS0dOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTUN3Z2NYVmhiblJwYkdVb1pHRjBZU1JsYm1oRVpXNXphWFI1TENBd0xqazVLU2twSUN0Y2JpQWdiR0ZpY3loNElEMGdYRnhGYm1oaGJtTmxjaUJFWlc1emFYUjVJRWR5YjNWd1hGd2dMQ0I1SUQwZ1hGeFVRVVFnWlc1b1lXNWpaWElnWkdWdWMybDBlVnhjS1NBclhHNGdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWEZ3alJEbEVPVVE1WEZ3c0lGeGNJMEpHUWtaQ1JseGNMQ0JjWENOQk5rRTJRVFpjWEN3Z1hGd2pPRU00UXpoRFhGd3NJRnhjSXpjek56TTNNMXhjS1NrZ0sxeHVJQ0IwYUdWdFpTaGNiaUFnSUNCc1pXZGxibVF1Y0c5emFYUnBiMjRnUFNCY1hHNXZibVZjWEN4Y2JpQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTd2dabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUdocWRYTjBJRDBnTVN3Z2RtcDFjM1FnUFNBeFhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY1hIUnlZVzV6Y0dGeVpXNTBYRndwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjZEdGa1IzSnZkWEJmWlc1b1JHVnVjMmwwZVZ4Y0tWeHVkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TWlrcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzQxS1NwdGJWUnZTVzVqYUZ4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc1Y2JseHVYRzV3SUR3dElHZG5jR3h2ZENoa1lYUmhMQ0JoWlhNb2VDQTlJR2RsYm1WRVpXNXphWFI1UjNKdmRYQXNJSGtnUFNCblpXNWxSR1Z1YzJsMGVTd2dabWxzYkNBOUlHZGxibVZFWlc1emFYUjVSM0p2ZFhBcEtTQXJJRnh1SUNCblpXOXRYMkp2ZUhCc2IzUW9ZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFRXVmthWFZ0SUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJQ0JqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9NQ3dnY1hWaGJuUnBiR1VvWkdGMFlTUm5aVzVsUkdWdWMybDBlU3dnTUM0NU9Ta3BLU0FyWEc0Z0lHeGhZbk1vZUNBOUlGeGNSMlZ1WlNCRVpXNXphWFI1SUVkeWIzVndYRndnTENCNUlEMGdYRnhIWlc1bElHUmxibk5wZEhsY1hDa2dLMXh1SUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGeGNJemMzTnpjM04xeGNMQ0JjWENNNFFqZEZOalZjWEN3Z1hGd2pRVEk0TkRVeVhGd3NJRnhjSTBNeU9EZzBSRnhjTENCY1hDTkdNamhGTWtOY1hDa3BJQ3RjYmlBZ2RHaGxiV1VvWEc0Z0lDQWdiR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdYRnh1YjI1bFhGd3NYRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVTBzSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2dZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCaGJtZHNaU0E5SURRMUxDQm9hblZ6ZENBOUlERXNJSFpxZFhOMElEMGdNVnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN3Z2MybDZaU0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHbGphM01nUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYRngwY21GdWMzQmhjbVZ1ZEZ4Y0tTeGNiaUFnSUNCc1pXZGxibVF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnYkdWblpXNWtMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1Z4dUlDQXBYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4MFlXUkhjbTkxY0Y5blpXNWxSR1Z1YzJsMGVWeGNLVnh1ZDJsa2RHZ2dQQzBnTXpFcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQXpPQ3B0YlZSdlNXNWphRnh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVYRzVjYmlNakl5QlFiRzkwZEdsdVp5QmthWE4wY21saWRYUnBiMjRnTFNCbGJtaGNiaUJuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpQWdaR2x6ZEdGdVkyVXhJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR1Z1YUVSbGJuTnBkSGxIY205MWNDQTlQV2R5YjNWd01Ta2dLU1JoZG1kTWIyY3lSa05jYmlBZ1pHbHpkR0Z1WTJVeUlEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHVnVhRVJsYm5OcGRIbEhjbTkxY0NBOVBXZHliM1Z3TWlrZ0tTUmhkbWRNYjJjeVJrTmNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNWNibHh1SXlNakl5QkJURXhjYmlNZ2VXeHBiU0E4TFNCdFlYZ29ZV0p6S0hGMVlXNTBhV3hsS0dSaGRHRWtZWFpuVEc5bk1rWkRMQ0F3TGpBeEtTa3NJR0ZpY3loeGRXRnVkR2xzWlNoa1lYUmhKR0YyWjB4dlp6SkdReXdnTUM0NU9Ta3BLVnh1SXlCd0lEd3RJR2RuY0d4dmRDaGtZWFJoTENCaFpYTW9lQ0E5SUdWdWFFUmxibk5wZEhsSGNtOTFjQ3dnZVNBOUlHRjJaMHh2WnpKR1F5a3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQmxibWhFWlc1emFYUjVSM0p2ZFhBcEtTc2dYRzRqSUNBZ1oyVnZiVjlpYjNod2JHOTBLRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU3dnZDJsa2RHZ2dQU0F3TGpFcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDdGNiaU1nSUNCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTFhsc2FXMHNJSGxzYVcwcEtTQXJYRzRqSUNBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUNrZ0t5QWdJSFJvWlcxbEtHeGxaMlZ1WkM1d2IzTnBkR2x2YmlBOUlGeGNibTl1WlZ4Y0tTQXJYRzRqSUNBZ2MyTmhiR1ZmWm1sc2JGOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYQ05rT1dRNVpEbGNYQ3dnWEZ3alltUmlaR0prWEZ3c0lGeGNJemsyT1RZNU5seGNMQ0JjWENNM016Y3pOek5jWEN3Z1hGd2pOVEkxTWpVeVhGd3BLVnh1SXlCY2JpTWdabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRnhjZEdGa1IzSnZkWEJmWlc1b1JHVnVjMmwwZVY5aGRtZE1iMmN5UmtOY1hDbGNiaU1nYUdWcFoyaDBJRHd0SUROY2JpTWdkMmxrZEdnZ1BDMGdNMXh1SXlCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRqSUhCeWFXNTBLSEFwWEc0aklHUmxkaTV2Wm1Zb0tWeHVJeUJ6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0aklIQnlhVzUwS0hBcFhHNGpJR1JsZGk1dlptWW9LVnh1SXlNakl5QlZVRnh1WkdGMFlTNXdiSFZ6SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWVhablRHOW5Na1pESUQ0Z01DbGNibkJ6TURFZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExuQnNkWE1zSUZ4Y01DMHlNQ1ZjWEN3Z1hGd3lNQzAwTUNWY1hDa3NJRFVwWEc1d2N6RXlJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZUzV3YkhWekxDQmNYREl3TFRRd0pWeGNMQ0JjWERRd0xUWXdKVnhjS1N3Z05TbGNibkJ6TWpNZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExuQnNkWE1zSUZ4Y05EQXROakFsWEZ3c0lGeGNOakF0T0RBbFhGd3BMQ0ExS1Z4dWNITXpOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0V1Y0d4MWN5d2dYRncyTUMwNE1DVmNYQ3dnWEZ3NE1DMHhNREFsWEZ3cExDQTFLVnh1WEc1Y2JseHVjQ0E4TFNCblozQnNiM1FvWkdGMFlTNXdiSFZ6TENCaFpYTW9lQ0E5SUdWdWFFUmxibk5wZEhsSGNtOTFjQ3dnZVNBOUlHRjJaMHh2WnpKR1F5a3BJQ3NnWEc0Z0lHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnWlc1b1JHVnVjMmwwZVVkeWIzVndLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwS3lCY2JpQWdaMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0eExDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Dd2diR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBLU0FyWEc0Z0lHeGhZbk1vZUNBOUlGeGNSVzVvWVc1alpYSWdaR1Z1YzJsMGVTQm5jbTkxY0Z4Y0lDd2dlU0E5SUZ4Y1lYWm5JR3h2WnpJb1ptOXNaQ0JqYUdGdVoyVXBYRndwSUN0Y2JpQWdjM1JoZEY5emRXMXRZWEo1S0Z4dUlDQWdJR0ZsY3lobmNtOTFjQ0E5SUdWdWFFUmxibk5wZEhsSGNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURFc1hHNGdJQ0FnWm1sc2JDQTlJRnhjY21Wa1hGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNYRzRnSUNrZ0sxeHVJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y0kwUTVSRGxFT1Z4Y0xDQmNYQ05DUmtKR1FrWmNYQ3dnWEZ3alFUWkJOa0UyWEZ3c0lGeGNJemhET0VNNFExeGNMQ0JjWENNM016Y3pOek5jWENrcElDdGNiaUFnZEdobGJXVW9YRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2dZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCaGJtZHNaU0E5SURRMUxDQm9hblZ6ZENBOUlERXNJSFpxZFhOMElEMGdNVnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN3Z2MybDZaU0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHbGphM01nUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYRngwY21GdWMzQmhjbVZ1ZEZ4Y0tTeGNiaUFnSUNCc1pXZGxibVF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnYkdWblpXNWtMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1Z4dUlDQXBLeUJqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9NQ3dnTVM0MUtTa2dLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJREVzSUhrZ1BTQXhMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEJ6TURFNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek1ERXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekV5T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pFeUtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXlNem9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE15TXlrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek16UTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNelFwTENCY1hGeGNibHhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F5S1Z4dVhHNWNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEhSaFpFZHliM1Z3WDJWdWFFUmxibk5wZEhsZllYWm5URzluTWtaRFgzVndYRndwWEc1M2FXUjBhQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNHhOU2txYlcxVWIwbHVZMmhjYm1obGFXZG9kQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNHdOeWtxYlcxVWIwbHVZMmhjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibHh1WEc0akl5TWpJRVJQVjA1Y2JtUmhkR0V1YldsdWRYTWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaGhkbWRNYjJjeVJrTWdQQ0F3S1Z4dWNITXdNU0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0V1YldsdWRYTXNJRnhjTUMweU1DVmNYQ3dnWEZ3eU1DMDBNQ1ZjWENrc0lEVXBYRzV3Y3pFeUlEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTNXRhVzUxY3l3Z1hGd3lNQzAwTUNWY1hDd2dYRncwTUMwMk1DVmNYQ2tzSURVcFhHNXdjekl6SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVM1dGFXNTFjeXdnWEZ3ME1DMDJNQ1ZjWEN3Z1hGdzJNQzA0TUNWY1hDa3NJRFVwWEc1d2N6TTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZUzV0YVc1MWN5d2dYRncyTUMwNE1DVmNYQ3dnWEZ3NE1DMHhNREFsWEZ3cExDQTFLVnh1WEc1Y2JuQWdQQzBnWjJkd2JHOTBLR1JoZEdFdWJXbHVkWE1zSUdGbGN5aDRJRDBnWlc1b1JHVnVjMmwwZVVkeWIzVndMQ0I1SUQwZ1lYWm5URzluTWtaREtTa2dLeUJjYmlBZ1oyVnZiVjkyYVc5c2FXNG9ZV1Z6S0dacGJHd2dQU0JsYm1oRVpXNXphWFI1UjNKdmRYQXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tySUZ4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXBJQ3RjYmlBZ2JHRmljeWg0SUQwZ1hGeEZibWhoYm1ObGNpQmtaVzV6YVhSNUlHZHliM1Z3WEZ3Z0xDQjVJRDBnWEZ4aGRtY2diRzluTWlobWIyeGtJR05vWVc1blpTbGNYQ2tnSzF4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWEc0Z0lDQWdZV1Z6S0dkeWIzVndJRDBnWlc1b1JHVnVjMmwwZVVkeWIzVndLU3dnWm5WdUlEMGdiV1ZoYml4Y2JpQWdJQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTVN4Y2JpQWdJQ0JtYVd4c0lEMGdYRnh5WldSY1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGeGNiaUFnS1NBclhHNGdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWEZ3alJEbEVPVVE1WEZ3c0lGeGNJMEpHUWtaQ1JseGNMQ0JjWENOQk5rRTJRVFpjWEN3Z1hGd2pPRU00UXpoRFhGd3NJRnhjSXpjek56TTNNMXhjS1NrZ0sxeHVJQ0IwYUdWdFpTaGNiaUFnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXdnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRdWVDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lHaHFkWE4wSUQwZ01Td2dkbXAxYzNRZ1BTQXhYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNYSFJ5WVc1emNHRnlaVzUwWEZ3cExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDa3JJR052YjNKa1gyTmhjblJsYzJsaGJpaDViR2x0SUQwZ1l5Z3RNUzQxTENBd0tTa3JYRzRnSUdGdWJtOTBZWFJsS0Z4Y2RHVjRkRnhjTENCNElEMGdNU3dnZVNBOUlDMHhMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEJ6TURFNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek1ERXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekV5T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pFeUtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXlNem9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE15TXlrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek16UTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNelFwTENCY1hGeGNibHhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F5S1Z4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRngwWVdSSGNtOTFjRjlsYm1oRVpXNXphWFI1WDJGMloweHZaekpHUTE5a2IzZHVYRndwWEc1M2FXUjBhQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNHhOelVwS20xdFZHOUpibU5vWEc1b1pXbG5hSFFnUEMwZ2NHRnVaV3hUYVhwbEtERXVNRGNwS20xdFZHOUpibU5vWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVjYmx4dVhHNGpJeU1nVUd4dmRIUnBibWNnWkdsemRISnBZblYwYVc5dUlDMGdaMlZ1WlZ4dUl5TWpJeUJCVEV4Y2JpTWdlV3hwYlNBOExTQnRZWGdvWVdKektIRjFZVzUwYVd4bEtHUmhkR0VrWVhablRHOW5Na1pETENBd0xqQXhLU2tzSUdGaWN5aHhkV0Z1ZEdsc1pTaGtZWFJoSkdGMloweHZaekpHUXl3Z01DNDVPU2twS1Z4dUl5QndJRHd0SUdkbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlHZGxibVZFWlc1emFYUjVSM0p2ZFhBc0lIa2dQU0JoZG1kTWIyY3lSa01wS1NBcklHZGxiMjFmZG1sdmJHbHVLR0ZsY3lobWFXeHNJRDBnWjJWdVpVUmxibk5wZEhsSGNtOTFjQ2twS3lCY2JpTWdJQ0JuWlc5dFgySnZlSEJzYjNRb2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QkxDQjNhV1IwYUNBOUlEQXVNU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUl5QWdJR052YjNKa1gyTmhjblJsYzJsaGJpaDViR2x0SUQwZ1l5Z3RlV3hwYlN3Z2VXeHBiU2twSUN0Y2JpTWdJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLU0FySUNBZ2RHaGxiV1VvYkdWblpXNWtMbkJ2YzJsMGFXOXVJRDBnWEZ4dWIyNWxYRndwSUN0Y2JpTWdJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y0kyUTVaRGxrT1Z4Y0xDQmNYQ05pWkdKa1ltUmNYQ3dnWEZ3ak9UWTVOamsyWEZ3c0lGeGNJemN6TnpNM00xeGNMQ0JjWENNMU1qVXlOVEpjWENrcFhHNGpJRnh1SXlCbWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hGeDBZV1JIY205MWNGOW5aVzVsUkdWdWMybDBlVjloZG1kTWIyY3lSa05jWENsY2JpTWdhR1ZwWjJoMElEd3RJRE5jYmlNZ2QybGtkR2dnUEMwZ00xeHVJeUJ3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGpJSEJ5YVc1MEtIQXBYRzRqSUdSbGRpNXZabVlvS1Z4dUl5QnpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRqSUhCeWFXNTBLSEFwWEc0aklHUmxkaTV2Wm1Zb0tWeHVJR2RsZEZCMllXeFhhV3hqYjNnZ1BDMGdablZ1WTNScGIyNG9aR0YwWVN3Z1ozSnZkWEF4TENCbmNtOTFjRElwZTF4dUlDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aMlZ1WlVSbGJuTnBkSGxIY205MWNDQTlQV2R5YjNWd01Ta2dLU1JoZG1kTWIyY3lSa05jYmlBZ1pHbHpkR0Z1WTJVeUlEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZGxibVZFWlc1emFYUjVSM0p2ZFhBZ1BUMW5jbTkxY0RJcElDa2tZWFpuVEc5bk1rWkRYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzVjYm1SaGRHRXVjR3gxY3lBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dGMloweHZaekpHUXlBK0lEQXBYRzV3Y3pBeElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTNXdiSFZ6TENCY1hEQXRNakFsWEZ3c0lGeGNNakF0TkRBbFhGd3BMQ0ExS1Z4dWNITXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0V1Y0d4MWN5d2dYRnd5TUMwME1DVmNYQ3dnWEZ3ME1DMDJNQ1ZjWENrc0lEVXBYRzV3Y3pJeklEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTNXdiSFZ6TENCY1hEUXdMVFl3SlZ4Y0xDQmNYRFl3TFRnd0pWeGNLU3dnTlNsY2JuQnpNelFnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTG5Cc2RYTXNJRnhjTmpBdE9EQWxYRndzSUZ4Y09EQXRNVEF3SlZ4Y0tTd2dOU2xjYmx4dVhHNWNibkFnUEMwZ1oyZHdiRzkwS0dSaGRHRXVjR3gxY3l3Z1lXVnpLSGdnUFNCblpXNWxSR1Z1YzJsMGVVZHliM1Z3TENCNUlEMGdZWFpuVEc5bk1rWkRLU2tnS3lCY2JpQWdaMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCblpXNWxSR1Z1YzJsMGVVZHliM1Z3S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcEt5QmNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ3dnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwS1NBclhHNGdJR3hoWW5Nb2VDQTlJRnhjUjJWdVpTQmtaVzV6YVhSNUlHZHliM1Z3WEZ3Z0xDQjVJRDBnWEZ4aGRtY2diRzluTWlobWIyeGtJR05vWVc1blpTbGNYQ2tnSzF4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWEc0Z0lDQWdZV1Z6S0dkeWIzVndJRDBnWjJWdVpVUmxibk5wZEhsSGNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURFc1hHNGdJQ0FnWm1sc2JDQTlJRnhjY21Wa1hGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNYRzRnSUNrZ0sxeHVJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y0kwUTVSRGxFT1Z4Y0xDQmNYQ05DUmtKR1FrWmNYQ3dnWEZ3alFUWkJOa0UyWEZ3c0lGeGNJemhET0VNNFExeGNMQ0JjWENNM016Y3pOek5jWENrcElDdGNiaUFnZEdobGJXVW9YRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2dZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCaGJtZHNaU0E5SURRMUxDQm9hblZ6ZENBOUlERXNJSFpxZFhOMElEMGdNVnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN3Z2MybDZaU0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHbGphM01nUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYRngwY21GdWMzQmhjbVZ1ZEZ4Y0tTeGNiaUFnSUNCc1pXZGxibVF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnYkdWblpXNWtMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1Z4dUlDQXBLeUJqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9NQ3dnTVM0MUtTa2dLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJREVzSUhrZ1BTQXhMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEJ6TURFNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek1ERXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekV5T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pFeUtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXlNem9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE15TXlrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek16UTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNelFwTENCY1hGeGNibHhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F5S1Z4dVhHNWNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEhSaFpFZHliM1Z3WDJkbGJtVkVaVzV6YVhSNVgyRjJaMHh2WnpKR1ExOTFjRnhjS1Z4dWQybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtERXVNVFVwS20xdFZHOUpibU5vWEc1b1pXbG5hSFFnUEMwZ2NHRnVaV3hUYVhwbEtERXVNRGNwS20xdFZHOUpibU5vWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVjYmx4dUl5TWpJeUJFVDFkT1hHNWtZWFJoTG0xcGJuVnpJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9ZWFpuVEc5bk1rWkRJRHdnTUNsY2JuQnpNREVnUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTG0xcGJuVnpMQ0JjWERBdE1qQWxYRndzSUZ4Y01qQXROREFsWEZ3cExDQTFLVnh1Y0hNeE1pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXViV2x1ZFhNc0lGeGNNakF0TkRBbFhGd3NJRnhjTkRBdE5qQWxYRndwTENBMUtWeHVjSE15TXlBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFdWJXbHVkWE1zSUZ4Y05EQXROakFsWEZ3c0lGeGNOakF0T0RBbFhGd3BMQ0ExS1Z4dWNITXpOQ0E4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0V1YldsdWRYTXNJRnhjTmpBdE9EQWxYRndzSUZ4Y09EQXRNVEF3SlZ4Y0tTd2dOU2xjYmx4dVhHNXdJRHd0SUdkbmNHeHZkQ2hrWVhSaExtMXBiblZ6TENCaFpYTW9lQ0E5SUdkbGJtVkVaVzV6YVhSNVIzSnZkWEFzSUhrZ1BTQmhkbWRNYjJjeVJrTXBLU0FySUZ4dUlDQm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUdkbGJtVkVaVzV6YVhSNVIzSnZkWEFwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrcklGeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFwSUN0Y2JpQWdiR0ZpY3loNElEMGdYRnhIWlc1bElHUmxibk5wZEhrZ1ozSnZkWEJjWENBc0lIa2dQU0JjWEdGMlp5QnNiMmN5S0dadmJHUWdZMmhoYm1kbEtWeGNLU0FyWEc0Z0lITjBZWFJmYzNWdGJXRnllU2hjYmlBZ0lDQmhaWE1vWjNKdmRYQWdQU0JuWlc1bFJHVnVjMmwwZVVkeWIzVndLU3dnWm5WdUlEMGdiV1ZoYml4Y2JpQWdJQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTVN4Y2JpQWdJQ0JtYVd4c0lEMGdYRnh5WldSY1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGeGNiaUFnS1NBclhHNGdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWEZ3alJEbEVPVVE1WEZ3c0lGeGNJMEpHUWtaQ1JseGNMQ0JjWENOQk5rRTJRVFpjWEN3Z1hGd2pPRU00UXpoRFhGd3NJRnhjSXpjek56TTNNMXhjS1NrZ0sxeHVJQ0IwYUdWdFpTaGNiaUFnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXdnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRdWVDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lHaHFkWE4wSUQwZ01Td2dkbXAxYzNRZ1BTQXhYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNYSFJ5WVc1emNHRnlaVzUwWEZ3cExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDa3JJR052YjNKa1gyTmhjblJsYzJsaGJpaDViR2x0SUQwZ1l5Z3RNUzQxTENBd0tTa3JYRzRnSUdGdWJtOTBZWFJsS0Z4Y2RHVjRkRnhjTENCNElEMGdNU3dnZVNBOUlDMHhMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEJ6TURFNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek1ERXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekV5T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pFeUtTd2dYRnhjWEc1Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y2NITXlNem9nWEZ3c0lHTnZiblpRZG1Gc2RXVW9jSE15TXlrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhCek16UTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQnpNelFwTENCY1hGeGNibHhjS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0JvYW5WemRDQTlJREFzSUhOcGVtVWdQU0F5S1Z4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRngwWVdSSGNtOTFjRjluWlc1bFJHVnVjMmwwZVY5aGRtZE1iMmN5UmtOZlpHOTNibHhjS1Z4dWQybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtERXVNVGMxS1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3hMakEzS1NwdGJWUnZTVzVqYUZ4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc1Y2JpTWpJeUJEUkVZZ2NHeHZkRnh1WEc1cmMxOXlaWE4xYkhRZ1BDMGdhM011ZEdWemRDaGNiaUFnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5aVzVsUkdWdWMybDBlVWR5YjNWd0lEMDlJRnhjTUMweU1DVmNYQ2tnSlQ0bElIQjFiR3dvWVdKelFYWm5URzluTWtaREtTeGNiaUFnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5aVzVsUkdWdWMybDBlVWR5YjNWd0lEMDlJRnhjTWpBdE5EQWxYRndwSUNVK0pTQndkV3hzS0dGaWMwRjJaMHh2WnpKR1F5bGNiaWxjYmx4dVhHNXdJRHd0SUdkbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlHRmljMEYyWjB4dlp6SkdReXdnWTI5c2IzSWdQU0JuWlc1bFJHVnVjMmwwZVVkeWIzVndLU2tnSzF4dUlDQnpZMkZzWlY5amIyeHZjbDl0WVc1MVlXd29kbUZzZFdWeklEMGdjbVYyS0dNb1hGd2pOemMzTnpjM1hGd3NJRnhjSXpoQ04wVTJOVnhjTENCY1hDTkJNamcwTlRKY1hDd2dYRndqUXpJNE9EUkVYRndzSUZ4Y0kwWXlPRVV5UTF4Y0tTa3BJQ3RjYmlBZ2MzUmhkRjlsWTJSbUtITnBlbVVnUFNBd0xqUXNJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVk5aV1JwZFcwZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0lDa2dLeUFqSUZWelpTQnpkR0YwWDJWalpHWWdkRzhnY0d4dmRDQjBhR1VnWlcxd2FYSnBZMkZzSUVORVJseHVJQ0JzWVdKektGeHVJQ0FnSUhnZ1BTQmNYRUZpY3k0Z2JHOW5NaWhtYjJ4a0lHTm9ZVzVuWlNsY1hDeGNiaUFnSUNCNUlEMGdYRnhEZFcxMWJHRjBhWFpsSUZCeWIySmhZbWxzYVhSNVhGeGNiaUFnS1NBcklHTnZiM0prWDJOaGNuUmxjMmxoYmloNGJHbHRJRDBnWXlnd0xDQXhMalVwS1NBclhHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJQ01nUTJ4bFlXNGdkR2hsYldWY2JpQWdkR2hsYldVb1hHNGdJQ0FnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNYSFJ5WVc1emNHRnlaVzUwWEZ3cExGeHVJQ0FnSUd4bFoyVnVaQzV3YjNOcGRHbHZiaUE5SUZ4Y2JtOXVaVnhjTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBMRnh1SUNBZ0lDa2dLeUJ6WTJGc1pWOTVYMk52Ym5ScGJuVnZkWE1vYkdGaVpXeHpJRDBnYzJOaGJHVnpPanB1ZFcxaVpYSmZabTl5YldGMEtHRmpZM1Z5WVdONUlEMGdNQzR4S1NsY2JseHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4MFlXUkhjbTkxY0Y5blpXNWxSR1Z1YzJsMGVWOWhkbWRNYjJjeVJrTmZZMlJtWEZ3cFhHNTNhV1IwYUNBOExTQXpNeXB0YlZSdlNXNWphRnh1YUdWcFoyaDBJRHd0TXpNcWJXMVViMGx1WTJoY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dVpHRjBZU0E4TFNCa1lYUmhMbTFwYm5WelhHNWNibWR5YjNWd01WOWtZWFJoSUR3dElHUmhkR0VrWVdKelFYWm5URzluTWtaRFcyUmhkR0VrWjJWdVpVUmxibk5wZEhsSGNtOTFjQ0E5UFNCY1hEQXRNakFsWEZ4ZFhHNW5jbTkxY0RKZlpHRjBZU0E4TFNCa1lYUmhKR0ZpYzBGMloweHZaekpHUTF0a1lYUmhKR2RsYm1WRVpXNXphWFI1UjNKdmRYQWdQVDBnWEZ3eU1DMDBNQ1ZjWEYxY2JtdHpMblJsYzNRb1ozSnZkWEF4WDJSaGRHRXNJR2R5YjNWd01sOWtZWFJoS1Z4dVhHNW5jbTkxY0RGZlpHRjBZU0E4TFNCa1lYUmhKR0ZpYzBGMloweHZaekpHUTF0a1lYUmhKR2RsYm1WRVpXNXphWFI1UjNKdmRYQWdQVDBnWEZ3eU1DMDBNQ1ZjWEYxY2JtZHliM1Z3TWw5a1lYUmhJRHd0SUdSaGRHRWtZV0p6UVhablRHOW5Na1pEVzJSaGRHRWtaMlZ1WlVSbGJuTnBkSGxIY205MWNDQTlQU0JjWERRd0xUWXdKVnhjWFZ4dWEzTXVkR1Z6ZENobmNtOTFjREZmWkdGMFlTd2daM0p2ZFhBeVgyUmhkR0VwWEc1Y2JtZHliM1Z3TVY5a1lYUmhJRHd0SUdSaGRHRWtZV0p6UVhablRHOW5Na1pEVzJSaGRHRWtaMlZ1WlVSbGJuTnBkSGxIY205MWNDQTlQU0JjWERRd0xUWXdKVnhjWFZ4dVozSnZkWEF5WDJSaGRHRWdQQzBnWkdGMFlTUmhZbk5CZG1kTWIyY3lSa05iWkdGMFlTUm5aVzVsUkdWdWMybDBlVWR5YjNWd0lEMDlJRnhjTmpBdE9EQWxYRnhkWEc1cmN5NTBaWE4wS0dkeWIzVndNVjlrWVhSaExDQm5jbTkxY0RKZlpHRjBZU2xjYmx4dVozSnZkWEF4WDJSaGRHRWdQQzBnWkdGMFlTUmhZbk5CZG1kTWIyY3lSa05iWkdGMFlTUm5aVzVsUkdWdWMybDBlVWR5YjNWd0lEMDlJRnhjTmpBdE9EQWxYRnhkWEc1bmNtOTFjREpmWkdGMFlTQThMU0JrWVhSaEpHRmljMEYyWjB4dlp6SkdRMXRrWVhSaEpHZGxibVZFWlc1emFYUjVSM0p2ZFhBZ1BUMGdYRnc0TUMweE1EQWxYRnhkWEc1cmN5NTBaWE4wS0dkeWIzVndNVjlrWVhSaExDQm5jbTkxY0RKZlpHRjBZU2xjYmx4dVhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGopXG5cbnRlbXAgPC0gbGVmdF9qb2luKGdlbmUuVFNTLnRiLCBkaWZmLlJOQSwgYnkgPSBjKFxcZW5zZW1ibFxcID0gXFxlbnNlbWJsX2dlbmVfaWRcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShsb2cyRm9sZENoYW5nZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpcy5uYShUQUQpKVxuXG5cbmRhdGEgPC0gdGVtcCAlPiUgZ3JvdXBfYnkoVEFEKSAlPiVcbiAgZHBseXI6OnN1bW1hcmlzZShhYnNBdmdMb2cyRkMgPSBhYnMobWVhbihsb2cyRm9sZENoYW5nZSkpLFxuICAgICAgICAgICAgICAgICAgIGF2Z0xvZzJGQyA9IG1lYW4obG9nMkZvbGRDaGFuZ2UpLFxuICAgICAgICAgICAgICAgICAgIGdlbmVEZW5zaXR5ID0gbWVhbihnZW5lRGVuc2l0eSksXG4gICAgICAgICAgICAgICAgICAgZW5oRGVuc2l0eSA9IG1lYW4oZW5oRGVuc2l0eSksXG4gICAgICAgICAgICAgICAgICAgcmVnRGVuc2l0eSA9IG1lYW4ocmVnRGVuc2l0eSkpXG5cbmRhdGEkZ2VuZURlbnNpdHlHcm91cCA8LSBjdXQoXG4gIGRhdGEkZ2VuZURlbnNpdHksXG4gIGJyZWFrcyA9IHF1YW50aWxlKGRhdGEkZ2VuZURlbnNpdHksIHByb2JzID0gc2VxKDAsIDEsIDAuMiksIG5hLnJtID0gVFJVRSksXG4gIGluY2x1ZGUubG93ZXN0ID0gVFJVRSxcbiAgbGFiZWxzID0gcGFzdGUwKHNlcSgwLCA4MCwgMjApLCBcXC1cXCwgc2VxKDIwLCAxMDAsIDIwKSwgXFwlXFwpXG4pXG5cbmRhdGEkZW5oRGVuc2l0eUdyb3VwIDwtIGN1dChcbiAgZGF0YSRlbmhEZW5zaXR5LFxuICBicmVha3MgPSBxdWFudGlsZShkYXRhJGVuaERlbnNpdHksIHByb2JzID0gc2VxKDAsIDEsIDAuMiksIG5hLnJtID0gVFJVRSksXG4gIGluY2x1ZGUubG93ZXN0ID0gVFJVRSxcbiAgbGFiZWxzID0gcGFzdGUwKHNlcSgwLCA4MCwgMjApLCBcXC1cXCwgc2VxKDIwLCAxMDAsIDIwKSwgXFwlXFwpXG4pXG5cblxuIyMjIFBsb3RpbmcgIGdyb3VwaW5nXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZW5oRGVuc2l0eUdyb3VwLCB5ID0gZW5oRGVuc2l0eSwgZmlsbCA9IGVuaERlbnNpdHlHcm91cCkpICsgXG4gIGdlb21fYm94cGxvdChjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIHF1YW50aWxlKGRhdGEkZW5oRGVuc2l0eSwgMC45OSkpKSArXG4gIGxhYnMoeCA9IFxcRW5oYW5jZXIgRGVuc2l0eSBHcm91cFxcICwgeSA9IFxcVEFEIGVuaGFuY2VyIGRlbnNpdHlcXCkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICtcbiAgdGhlbWUoXG4gICAgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXHRhZEdyb3VwX2VuaERlbnNpdHlcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBnZW5lRGVuc2l0eUdyb3VwLCB5ID0gZ2VuZURlbnNpdHksIGZpbGwgPSBnZW5lRGVuc2l0eUdyb3VwKSkgKyBcbiAgZ2VvbV9ib3hwbG90KGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIHF1YW50aWxlKGRhdGEkZ2VuZURlbnNpdHksIDAuOTkpKSkgK1xuICBsYWJzKHggPSBcXEdlbmUgRGVuc2l0eSBHcm91cFxcICwgeSA9IFxcR2VuZSBkZW5zaXR5XFwpICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCM3Nzc3NzdcXCwgXFwjOEI3RTY1XFwsIFxcI0EyODQ1MlxcLCBcXCNDMjg4NERcXCwgXFwjRjI4RTJDXFwpKSArXG4gIHRoZW1lKFxuICAgIGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcLFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKVxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcdGFkR3JvdXBfZ2VuZURlbnNpdHlcXClcbndpZHRoIDwtIDMxKm1tVG9JbmNoXG5oZWlnaHQgPC0gMzgqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG4jIyMgUGxvdHRpbmcgZGlzdHJpYnV0aW9uIC0gZW5oXG4gZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihlbmhEZW5zaXR5R3JvdXAgPT1ncm91cDEpICkkYXZnTG9nMkZDXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihlbmhEZW5zaXR5R3JvdXAgPT1ncm91cDIpICkkYXZnTG9nMkZDXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbiMjIyMgQUxMXG4jIHlsaW0gPC0gbWF4KGFicyhxdWFudGlsZShkYXRhJGF2Z0xvZzJGQywgMC4wMSkpLCBhYnMocXVhbnRpbGUoZGF0YSRhdmdMb2cyRkMsIDAuOTkpKSlcbiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBlbmhEZW5zaXR5R3JvdXAsIHkgPSBhdmdMb2cyRkMpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZW5oRGVuc2l0eUdyb3VwKSkrIFxuIyAgIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4xKSArIHRoZW1lX2NsYXNzaWMoKSArXG4jICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC15bGltLCB5bGltKSkgK1xuIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCkgK1xuIyAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjZDlkOWQ5XFwsIFxcI2JkYmRiZFxcLCBcXCM5Njk2OTZcXCwgXFwjNzM3MzczXFwsIFxcIzUyNTI1MlxcKSlcbiMgXG4jIGZpbGVOYW1lIDwtIHBhc3RlMChcXHRhZEdyb3VwX2VuaERlbnNpdHlfYXZnTG9nMkZDXFwpXG4jIGhlaWdodCA8LSAzXG4jIHdpZHRoIDwtIDNcbiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMjIyMgVVBcbmRhdGEucGx1cyA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGF2Z0xvZzJGQyA+IDApXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5wbHVzLCBcXDAtMjAlXFwsIFxcMjAtNDAlXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEucGx1cywgXFwyMC00MCVcXCwgXFw0MC02MCVcXCksIDUpXG5wczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5wbHVzLCBcXDQwLTYwJVxcLCBcXDYwLTgwJVxcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLnBsdXMsIFxcNjAtODAlXFwsIFxcODAtMTAwJVxcKSwgNSlcblxuXG5cbnAgPC0gZ2dwbG90KGRhdGEucGx1cywgYWVzKHggPSBlbmhEZW5zaXR5R3JvdXAsIHkgPSBhdmdMb2cyRkMpKSArIFxuICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGVuaERlbnNpdHlHcm91cCksXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICBsYWJzKHggPSBcXEVuaGFuY2VyIGRlbnNpdHkgZ3JvdXBcXCAsIHkgPSBcXGF2ZyBsb2cyKGZvbGQgY2hhbmdlKVxcKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBlbmhEZW5zaXR5R3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLFxuICAgIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCNEOUQ5RDlcXCwgXFwjQkZCRkJGXFwsIFxcI0E2QTZBNlxcLCBcXCM4QzhDOENcXCwgXFwjNzM3MzczXFwpKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEuNSkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMilcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFx0YWRHcm91cF9lbmhEZW5zaXR5X2F2Z0xvZzJGQ191cFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMTUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMDcpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuIyMjIyBET1dOXG5kYXRhLm1pbnVzIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoYXZnTG9nMkZDIDwgMClcbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLm1pbnVzLCBcXDAtMjAlXFwsIFxcMjAtNDAlXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEubWludXMsIFxcMjAtNDAlXFwsIFxcNDAtNjAlXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEubWludXMsIFxcNDAtNjAlXFwsIFxcNjAtODAlXFwpLCA1KVxucHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEubWludXMsIFxcNjAtODAlXFwsIFxcODAtMTAwJVxcKSwgNSlcblxuXG5wIDwtIGdncGxvdChkYXRhLm1pbnVzLCBhZXMoeCA9IGVuaERlbnNpdHlHcm91cCwgeSA9IGF2Z0xvZzJGQykpICsgXG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZW5oRGVuc2l0eUdyb3VwKSxcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gIGxhYnMoeCA9IFxcRW5oYW5jZXIgZGVuc2l0eSBncm91cFxcICwgeSA9IFxcYXZnIGxvZzIoZm9sZCBjaGFuZ2UpXFwpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGVuaERlbnNpdHlHcm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsXG4gICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEuNSwgMCkpK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAtMSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMilcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcdGFkR3JvdXBfZW5oRGVuc2l0eV9hdmdMb2cyRkNfZG93blxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMTc1KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjA3KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cblxuIyMjIFBsb3R0aW5nIGRpc3RyaWJ1dGlvbiAtIGdlbmVcbiMjIyMgQUxMXG4jIHlsaW0gPC0gbWF4KGFicyhxdWFudGlsZShkYXRhJGF2Z0xvZzJGQywgMC4wMSkpLCBhYnMocXVhbnRpbGUoZGF0YSRhdmdMb2cyRkMsIDAuOTkpKSlcbiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBnZW5lRGVuc2l0eUdyb3VwLCB5ID0gYXZnTG9nMkZDKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdlbmVEZW5zaXR5R3JvdXApKSsgXG4jICAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjEpICsgdGhlbWVfY2xhc3NpYygpICtcbiMgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLXlsaW0sIHlsaW0pKSArXG4jICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcKSArXG4jICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCNkOWQ5ZDlcXCwgXFwjYmRiZGJkXFwsIFxcIzk2OTY5NlxcLCBcXCM3MzczNzNcXCwgXFwjNTI1MjUyXFwpKVxuIyBcbiMgZmlsZU5hbWUgPC0gcGFzdGUwKFxcdGFkR3JvdXBfZ2VuZURlbnNpdHlfYXZnTG9nMkZDXFwpXG4jIGhlaWdodCA8LSAzXG4jIHdpZHRoIDwtIDNcbiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVEZW5zaXR5R3JvdXAgPT1ncm91cDEpICkkYXZnTG9nMkZDXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihnZW5lRGVuc2l0eUdyb3VwID09Z3JvdXAyKSApJGF2Z0xvZzJGQ1xuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuXG5kYXRhLnBsdXMgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihhdmdMb2cyRkMgPiAwKVxucHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEucGx1cywgXFwwLTIwJVxcLCBcXDIwLTQwJVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLnBsdXMsIFxcMjAtNDAlXFwsIFxcNDAtNjAlXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEucGx1cywgXFw0MC02MCVcXCwgXFw2MC04MCVcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5wbHVzLCBcXDYwLTgwJVxcLCBcXDgwLTEwMCVcXCksIDUpXG5cblxuXG5wIDwtIGdncGxvdChkYXRhLnBsdXMsIGFlcyh4ID0gZ2VuZURlbnNpdHlHcm91cCwgeSA9IGF2Z0xvZzJGQykpICsgXG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ2VuZURlbnNpdHlHcm91cCksXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICBsYWJzKHggPSBcXEdlbmUgZGVuc2l0eSBncm91cFxcICwgeSA9IFxcYXZnIGxvZzIoZm9sZCBjaGFuZ2UpXFwpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdlbmVEZW5zaXR5R3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLFxuICAgIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXFxuICApICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCNEOUQ5RDlcXCwgXFwjQkZCRkJGXFwsIFxcI0E2QTZBNlxcLCBcXCM4QzhDOENcXCwgXFwjNzM3MzczXFwpKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEuNSkpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMilcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFx0YWRHcm91cF9nZW5lRGVuc2l0eV9hdmdMb2cyRkNfdXBcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjE1KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjA3KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cbiMjIyMgRE9XTlxuZGF0YS5taW51cyA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGF2Z0xvZzJGQyA8IDApXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5taW51cywgXFwwLTIwJVxcLCBcXDIwLTQwJVxcKSwgNSlcbnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLm1pbnVzLCBcXDIwLTQwJVxcLCBcXDQwLTYwJVxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLm1pbnVzLCBcXDQwLTYwJVxcLCBcXDYwLTgwJVxcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLm1pbnVzLCBcXDYwLTgwJVxcLCBcXDgwLTEwMCVcXCksIDUpXG5cblxucCA8LSBnZ3Bsb3QoZGF0YS5taW51cywgYWVzKHggPSBnZW5lRGVuc2l0eUdyb3VwLCB5ID0gYXZnTG9nMkZDKSkgKyBcbiAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBnZW5lRGVuc2l0eUdyb3VwKSxcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gIGxhYnMoeCA9IFxcR2VuZSBkZW5zaXR5IGdyb3VwXFwgLCB5ID0gXFxhdmcgbG9nMihmb2xkIGNoYW5nZSlcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ2VuZURlbnNpdHlHcm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsXG4gICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEuNSwgMCkpK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAtMSwgbGFiZWwgPSBwYXN0ZTAoXFxwczAxOiBcXCwgY29udlB2YWx1ZShwczAxKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxMjogXFwsIGNvbnZQdmFsdWUocHMxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjM6IFxcLCBjb252UHZhbHVlKHBzMjMpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczM0OiBcXCwgY29udlB2YWx1ZShwczM0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMilcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcdGFkR3JvdXBfZ2VuZURlbnNpdHlfYXZnTG9nMkZDX2Rvd25cXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjE3NSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4wNykqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG4jIyMgQ0RGIHBsb3Rcblxua3NfcmVzdWx0IDwtIGtzLnRlc3QoXG4gIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZURlbnNpdHlHcm91cCA9PSBcXDAtMjAlXFwpICU+JSBwdWxsKGFic0F2Z0xvZzJGQyksXG4gIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZURlbnNpdHlHcm91cCA9PSBcXDIwLTQwJVxcKSAlPiUgcHVsbChhYnNBdmdMb2cyRkMpXG4pXG5cblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBhYnNBdmdMb2cyRkMsIGNvbG9yID0gZ2VuZURlbnNpdHlHcm91cCkpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJldihjKFxcIzc3Nzc3N1xcLCBcXCM4QjdFNjVcXCwgXFwjQTI4NDUyXFwsIFxcI0MyODg0RFxcLCBcXCNGMjhFMkNcXCkpKSArXG4gIHN0YXRfZWNkZihzaXplID0gMC40LCBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCApICsgIyBVc2Ugc3RhdF9lY2RmIHRvIHBsb3QgdGhlIGVtcGlyaWNhbCBDREZcbiAgbGFicyhcbiAgICB4ID0gXFxBYnMuIGxvZzIoZm9sZCBjaGFuZ2UpXFwsXG4gICAgeSA9IFxcQ3VtdWxhdGl2ZSBQcm9iYWJpbGl0eVxcXG4gICkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMS41KSkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyAjIENsZWFuIHRoZW1lXG4gIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICApICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDAuMSkpXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcdGFkR3JvdXBfZ2VuZURlbnNpdHlfYXZnTG9nMkZDX2NkZlxcKVxud2lkdGggPC0gMzMqbW1Ub0luY2hcbmhlaWdodCA8LTMzKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbmRhdGEgPC0gZGF0YS5taW51c1xuXG5ncm91cDFfZGF0YSA8LSBkYXRhJGFic0F2Z0xvZzJGQ1tkYXRhJGdlbmVEZW5zaXR5R3JvdXAgPT0gXFwwLTIwJVxcXVxuZ3JvdXAyX2RhdGEgPC0gZGF0YSRhYnNBdmdMb2cyRkNbZGF0YSRnZW5lRGVuc2l0eUdyb3VwID09IFxcMjAtNDAlXFxdXG5rcy50ZXN0KGdyb3VwMV9kYXRhLCBncm91cDJfZGF0YSlcblxuZ3JvdXAxX2RhdGEgPC0gZGF0YSRhYnNBdmdMb2cyRkNbZGF0YSRnZW5lRGVuc2l0eUdyb3VwID09IFxcMjAtNDAlXFxdXG5ncm91cDJfZGF0YSA8LSBkYXRhJGFic0F2Z0xvZzJGQ1tkYXRhJGdlbmVEZW5zaXR5R3JvdXAgPT0gXFw0MC02MCVcXF1cbmtzLnRlc3QoZ3JvdXAxX2RhdGEsIGdyb3VwMl9kYXRhKVxuXG5ncm91cDFfZGF0YSA8LSBkYXRhJGFic0F2Z0xvZzJGQ1tkYXRhJGdlbmVEZW5zaXR5R3JvdXAgPT0gXFw0MC02MCVcXF1cbmdyb3VwMl9kYXRhIDwtIGRhdGEkYWJzQXZnTG9nMkZDW2RhdGEkZ2VuZURlbnNpdHlHcm91cCA9PSBcXDYwLTgwJVxcXVxua3MudGVzdChncm91cDFfZGF0YSwgZ3JvdXAyX2RhdGEpXG5cbmdyb3VwMV9kYXRhIDwtIGRhdGEkYWJzQXZnTG9nMkZDW2RhdGEkZ2VuZURlbnNpdHlHcm91cCA9PSBcXDYwLTgwJVxcXVxuZ3JvdXAyX2RhdGEgPC0gZGF0YSRhYnNBdmdMb2cyRkNbZGF0YSRnZW5lRGVuc2l0eUdyb3VwID09IFxcODAtMTAwJVxcXVxua3MudGVzdChncm91cDFfZGF0YSwgZ3JvdXAyX2RhdGEpXG5cblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkailcblxudGVtcCA8LSBsZWZ0X2pvaW4oZ2VuZS5UU1MudGIsIGRpZmYuUk5BLCBieSA9IGMoXFxlbnNlbWJsXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGxvZzJGb2xkQ2hhbmdlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzLm5hKFRBRCkpXG5cblxuZGF0YSA8LSB0ZW1wICU+JSBncm91cF9ieShUQUQpICU+JVxuICBkcGx5cjo6c3VtbWFyaXNlKGFic0F2Z0xvZzJGQyA9IGFicyhtZWFuKGxvZzJGb2xkQ2hhbmdlKSksXG4gICAgICAgICAgICAgICAgICAgYXZnTG9nMkZDID0gbWVhbihsb2cyRm9sZENoYW5nZSksXG4gICAgICAgICAgICAgICAgICAgZ2VuZURlbnNpdHkgPSBtZWFuKGdlbmVEZW5zaXR5KSxcbiAgICAgICAgICAgICAgICAgICBlbmhEZW5zaXR5ID0gbWVhbihlbmhEZW5zaXR5KSxcbiAgICAgICAgICAgICAgICAgICByZWdEZW5zaXR5ID0gbWVhbihyZWdEZW5zaXR5KSlcblxuZGF0YSRnZW5lRGVuc2l0eUdyb3VwIDwtIGN1dChcbiAgZGF0YSRnZW5lRGVuc2l0eSxcbiAgYnJlYWtzID0gcXVhbnRpbGUoZGF0YSRnZW5lRGVuc2l0eSwgcHJvYnMgPSBzZXEoMCwgMSwgMC4yKSwgbmEucm0gPSBUUlVFKSxcbiAgaW5jbHVkZS5sb3dlc3QgPSBUUlVFLFxuICBsYWJlbHMgPSBwYXN0ZTAoc2VxKDAsIDgwLCAyMCksIFxcLVxcLCBzZXEoMjAsIDEwMCwgMjApLCBcXCVcXClcbilcblxuZGF0YSRlbmhEZW5zaXR5R3JvdXAgPC0gY3V0KFxuICBkYXRhJGVuaERlbnNpdHksXG4gIGJyZWFrcyA9IHF1YW50aWxlKGRhdGEkZW5oRGVuc2l0eSwgcHJvYnMgPSBzZXEoMCwgMSwgMC4yKSwgbmEucm0gPSBUUlVFKSxcbiAgaW5jbHVkZS5sb3dlc3QgPSBUUlVFLFxuICBsYWJlbHMgPSBwYXN0ZTAoc2VxKDAsIDgwLCAyMCksIFxcLVxcLCBzZXEoMjAsIDEwMCwgMjApLCBcXCVcXClcbilcblxuXG4jIyMgUGxvdGluZyAgZ3JvdXBpbmdcblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBlbmhEZW5zaXR5R3JvdXAsIHkgPSBlbmhEZW5zaXR5LCBmaWxsID0gZW5oRGVuc2l0eUdyb3VwKSkgKyBcbiAgZ2VvbV9ib3hwbG90KGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgcXVhbnRpbGUoZGF0YSRlbmhEZW5zaXR5LCAwLjk5KSkpICtcbiAgbGFicyh4ID0gXFxFbmhhbmNlciBEZW5zaXR5IEdyb3VwXFwgLCB5ID0gXFxUQUQgZW5oYW5jZXIgZGVuc2l0eVxcKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjRDlEOUQ5XFwsIFxcI0JGQkZCRlxcLCBcXCNBNkE2QTZcXCwgXFwjOEM4QzhDXFwsIFxcIzczNzM3M1xcKSkgK1xuICB0aGVtZShcbiAgICBsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCxcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcdGFkR3JvdXBfZW5oRGVuc2l0eVxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cblxuXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdlbmVEZW5zaXR5R3JvdXAsIHkgPSBnZW5lRGVuc2l0eSwgZmlsbCA9IGdlbmVEZW5zaXR5R3JvdXApKSArIFxuICBnZW9tX2JveHBsb3QoY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgcXVhbnRpbGUoZGF0YSRnZW5lRGVuc2l0eSwgMC45OSkpKSArXG4gIGxhYnMoeCA9IFxcR2VuZSBEZW5zaXR5IEdyb3VwXFwgLCB5ID0gXFxHZW5lIGRlbnNpdHlcXCkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcIzc3Nzc3N1xcLCBcXCM4QjdFNjVcXCwgXFwjQTI4NDUyXFwsIFxcI0MyODg0RFxcLCBcXCNGMjhFMkNcXCkpICtcbiAgdGhlbWUoXG4gICAgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFx0YWRHcm91cF9nZW5lRGVuc2l0eVxcKVxud2lkdGggPC0gMzEqbW1Ub0luY2hcbmhlaWdodCA8LSAzOCptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cbiMjIyBQbG90dGluZyBkaXN0cmlidXRpb24gLSBlbmhcbiBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGVuaERlbnNpdHlHcm91cCA9PWdyb3VwMSkgKSRhdmdMb2cyRkNcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGVuaERlbnNpdHlHcm91cCA9PWdyb3VwMikgKSRhdmdMb2cyRkNcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cblxuIyMjIyBBTExcbiMgeWxpbSA8LSBtYXgoYWJzKHF1YW50aWxlKGRhdGEkYXZnTG9nMkZDLCAwLjAxKSksIGFicyhxdWFudGlsZShkYXRhJGF2Z0xvZzJGQywgMC45OSkpKVxuIyBwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGVuaERlbnNpdHlHcm91cCwgeSA9IGF2Z0xvZzJGQykpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBlbmhEZW5zaXR5R3JvdXApKSsgXG4jICAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjEpICsgdGhlbWVfY2xhc3NpYygpICtcbiMgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLXlsaW0sIHlsaW0pKSArXG4jICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcKSArXG4jICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCNkOWQ5ZDlcXCwgXFwjYmRiZGJkXFwsIFxcIzk2OTY5NlxcLCBcXCM3MzczNzNcXCwgXFwjNTI1MjUyXFwpKVxuIyBcbiMgZmlsZU5hbWUgPC0gcGFzdGUwKFxcdGFkR3JvdXBfZW5oRGVuc2l0eV9hdmdMb2cyRkNcXClcbiMgaGVpZ2h0IDwtIDNcbiMgd2lkdGggPC0gM1xuIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuIyMjIyBVUFxuZGF0YS5wbHVzIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoYXZnTG9nMkZDID4gMClcbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLnBsdXMsIFxcMC0yMCVcXCwgXFwyMC00MCVcXCksIDUpXG5wczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5wbHVzLCBcXDIwLTQwJVxcLCBcXDQwLTYwJVxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLnBsdXMsIFxcNDAtNjAlXFwsIFxcNjAtODAlXFwpLCA1KVxucHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEucGx1cywgXFw2MC04MCVcXCwgXFw4MC0xMDAlXFwpLCA1KVxuXG5cblxucCA8LSBnZ3Bsb3QoZGF0YS5wbHVzLCBhZXMoeCA9IGVuaERlbnNpdHlHcm91cCwgeSA9IGF2Z0xvZzJGQykpICsgXG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZW5oRGVuc2l0eUdyb3VwKSxcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gIGxhYnMoeCA9IFxcRW5oYW5jZXIgZGVuc2l0eSBncm91cFxcICwgeSA9IFxcYXZnIGxvZzIoZm9sZCBjaGFuZ2UpXFwpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGVuaERlbnNpdHlHcm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsXG4gICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMS41KSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAxLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAyKVxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXHRhZEdyb3VwX2VuaERlbnNpdHlfYXZnTG9nMkZDX3VwXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMS4xNSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4wNykqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG4jIyMjIERPV05cbmRhdGEubWludXMgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihhdmdMb2cyRkMgPCAwKVxucHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEubWludXMsIFxcMC0yMCVcXCwgXFwyMC00MCVcXCksIDUpXG5wczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5taW51cywgXFwyMC00MCVcXCwgXFw0MC02MCVcXCksIDUpXG5wczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5taW51cywgXFw0MC02MCVcXCwgXFw2MC04MCVcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5taW51cywgXFw2MC04MCVcXCwgXFw4MC0xMDAlXFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KGRhdGEubWludXMsIGFlcyh4ID0gZW5oRGVuc2l0eUdyb3VwLCB5ID0gYXZnTG9nMkZDKSkgKyBcbiAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBlbmhEZW5zaXR5R3JvdXApLFxuICAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkrIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgbGFicyh4ID0gXFxFbmhhbmNlciBkZW5zaXR5IGdyb3VwXFwgLCB5ID0gXFxhdmcgbG9nMihmb2xkIGNoYW5nZSlcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZW5oRGVuc2l0eUdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjRDlEOUQ5XFwsIFxcI0JGQkZCRlxcLCBcXCNBNkE2QTZcXCwgXFwjOEM4QzhDXFwsIFxcIzczNzM3M1xcKSkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkrIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMS41LCAwKSkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IC0xLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAyKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFx0YWRHcm91cF9lbmhEZW5zaXR5X2F2Z0xvZzJGQ19kb3duXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMS4xNzUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMDcpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG4jIyMgUGxvdHRpbmcgZGlzdHJpYnV0aW9uIC0gZ2VuZVxuIyMjIyBBTExcbiMgeWxpbSA8LSBtYXgoYWJzKHF1YW50aWxlKGRhdGEkYXZnTG9nMkZDLCAwLjAxKSksIGFicyhxdWFudGlsZShkYXRhJGF2Z0xvZzJGQywgMC45OSkpKVxuIyBwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdlbmVEZW5zaXR5R3JvdXAsIHkgPSBhdmdMb2cyRkMpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ2VuZURlbnNpdHlHcm91cCkpKyBcbiMgICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BLCB3aWR0aCA9IDAuMSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuIyAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygteWxpbSwgeWxpbSkpICtcbiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpICtcbiMgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI2Q5ZDlkOVxcLCBcXCNiZGJkYmRcXCwgXFwjOTY5Njk2XFwsIFxcIzczNzM3M1xcLCBcXCM1MjUyNTJcXCkpXG4jIFxuIyBmaWxlTmFtZSA8LSBwYXN0ZTAoXFx0YWRHcm91cF9nZW5lRGVuc2l0eV9hdmdMb2cyRkNcXClcbiMgaGVpZ2h0IDwtIDNcbiMgd2lkdGggPC0gM1xuIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZURlbnNpdHlHcm91cCA9PWdyb3VwMSkgKSRhdmdMb2cyRkNcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVEZW5zaXR5R3JvdXAgPT1ncm91cDIpICkkYXZnTG9nMkZDXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbmRhdGEucGx1cyA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGF2Z0xvZzJGQyA+IDApXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5wbHVzLCBcXDAtMjAlXFwsIFxcMjAtNDAlXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEucGx1cywgXFwyMC00MCVcXCwgXFw0MC02MCVcXCksIDUpXG5wczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5wbHVzLCBcXDQwLTYwJVxcLCBcXDYwLTgwJVxcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLnBsdXMsIFxcNjAtODAlXFwsIFxcODAtMTAwJVxcKSwgNSlcblxuXG5cbnAgPC0gZ2dwbG90KGRhdGEucGx1cywgYWVzKHggPSBnZW5lRGVuc2l0eUdyb3VwLCB5ID0gYXZnTG9nMkZDKSkgKyBcbiAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBnZW5lRGVuc2l0eUdyb3VwKSxcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArXG4gIGxhYnMoeCA9IFxcR2VuZSBkZW5zaXR5IGdyb3VwXFwgLCB5ID0gXFxhdmcgbG9nMihmb2xkIGNoYW5nZSlcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ2VuZURlbnNpdHlHcm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsXG4gICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcI0Q5RDlEOVxcLCBcXCNCRkJGQkZcXCwgXFwjQTZBNkE2XFwsIFxcIzhDOEM4Q1xcLCBcXCM3MzczNzNcXCkpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMS41KSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAxLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAyKVxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXHRhZEdyb3VwX2dlbmVEZW5zaXR5X2F2Z0xvZzJGQ191cFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMTUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMDcpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuIyMjIyBET1dOXG5kYXRhLm1pbnVzIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoYXZnTG9nMkZDIDwgMClcbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLm1pbnVzLCBcXDAtMjAlXFwsIFxcMjAtNDAlXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEubWludXMsIFxcMjAtNDAlXFwsIFxcNDAtNjAlXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEubWludXMsIFxcNDAtNjAlXFwsIFxcNjAtODAlXFwpLCA1KVxucHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEubWludXMsIFxcNjAtODAlXFwsIFxcODAtMTAwJVxcKSwgNSlcblxuXG5wIDwtIGdncGxvdChkYXRhLm1pbnVzLCBhZXMoeCA9IGdlbmVEZW5zaXR5R3JvdXAsIHkgPSBhdmdMb2cyRkMpKSArIFxuICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdlbmVEZW5zaXR5R3JvdXApLFxuICAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkrIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgbGFicyh4ID0gXFxHZW5lIGRlbnNpdHkgZ3JvdXBcXCAsIHkgPSBcXGF2ZyBsb2cyKGZvbGQgY2hhbmdlKVxcKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBnZW5lRGVuc2l0eUdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjRDlEOUQ5XFwsIFxcI0JGQkZCRlxcLCBcXCNBNkE2QTZcXCwgXFwjOEM4QzhDXFwsIFxcIzczNzM3M1xcKSkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkrIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMS41LCAwKSkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IC0xLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAyKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFx0YWRHcm91cF9nZW5lRGVuc2l0eV9hdmdMb2cyRkNfZG93blxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMTc1KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjA3KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cbiMjIyBDREYgcGxvdFxuXG5rc19yZXN1bHQgPC0ga3MudGVzdChcbiAgZGF0YSAlPiUgZHBseXI6OmZpbHRlcihnZW5lRGVuc2l0eUdyb3VwID09IFxcMC0yMCVcXCkgJT4lIHB1bGwoYWJzQXZnTG9nMkZDKSxcbiAgZGF0YSAlPiUgZHBseXI6OmZpbHRlcihnZW5lRGVuc2l0eUdyb3VwID09IFxcMjAtNDAlXFwpICU+JSBwdWxsKGFic0F2Z0xvZzJGQylcbilcblxuXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGFic0F2Z0xvZzJGQywgY29sb3IgPSBnZW5lRGVuc2l0eUdyb3VwKSkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcmV2KGMoXFwjNzc3Nzc3XFwsIFxcIzhCN0U2NVxcLCBcXCNBMjg0NTJcXCwgXFwjQzI4ODREXFwsIFxcI0YyOEUyQ1xcKSkpICtcbiAgc3RhdF9lY2RmKHNpemUgPSAwLjQsIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcICkgKyAjIFVzZSBzdGF0X2VjZGYgdG8gcGxvdCB0aGUgZW1waXJpY2FsIENERlxuICBsYWJzKFxuICAgIHggPSBcXEFicy4gbG9nMihmb2xkIGNoYW5nZSlcXCxcbiAgICB5ID0gXFxDdW11bGF0aXZlIFByb2JhYmlsaXR5XFxcbiAgKSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxLjUpKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArICMgQ2xlYW4gdGhlbWVcbiAgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgICkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMC4xKSlcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFx0YWRHcm91cF9nZW5lRGVuc2l0eV9hdmdMb2cyRkNfY2RmXFwpXG53aWR0aCA8LSAzMyptbVRvSW5jaFxuaGVpZ2h0IDwtMzMqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuZGF0YSA8LSBkYXRhLm1pbnVzXG5cbmdyb3VwMV9kYXRhIDwtIGRhdGEkYWJzQXZnTG9nMkZDW2RhdGEkZ2VuZURlbnNpdHlHcm91cCA9PSBcXDAtMjAlXFxdXG5ncm91cDJfZGF0YSA8LSBkYXRhJGFic0F2Z0xvZzJGQ1tkYXRhJGdlbmVEZW5zaXR5R3JvdXAgPT0gXFwyMC00MCVcXF1cbmtzLnRlc3QoZ3JvdXAxX2RhdGEsIGdyb3VwMl9kYXRhKVxuXG5ncm91cDFfZGF0YSA8LSBkYXRhJGFic0F2Z0xvZzJGQ1tkYXRhJGdlbmVEZW5zaXR5R3JvdXAgPT0gXFwyMC00MCVcXF1cbmdyb3VwMl9kYXRhIDwtIGRhdGEkYWJzQXZnTG9nMkZDW2RhdGEkZ2VuZURlbnNpdHlHcm91cCA9PSBcXDQwLTYwJVxcXVxua3MudGVzdChncm91cDFfZGF0YSwgZ3JvdXAyX2RhdGEpXG5cbmdyb3VwMV9kYXRhIDwtIGRhdGEkYWJzQXZnTG9nMkZDW2RhdGEkZ2VuZURlbnNpdHlHcm91cCA9PSBcXDQwLTYwJVxcXVxuZ3JvdXAyX2RhdGEgPC0gZGF0YSRhYnNBdmdMb2cyRkNbZGF0YSRnZW5lRGVuc2l0eUdyb3VwID09IFxcNjAtODAlXFxdXG5rcy50ZXN0KGdyb3VwMV9kYXRhLCBncm91cDJfZGF0YSlcblxuZ3JvdXAxX2RhdGEgPC0gZGF0YSRhYnNBdmdMb2cyRkNbZGF0YSRnZW5lRGVuc2l0eUdyb3VwID09IFxcNjAtODAlXFxdXG5ncm91cDJfZGF0YSA8LSBkYXRhJGFic0F2Z0xvZzJGQ1tkYXRhJGdlbmVEZW5zaXR5R3JvdXAgPT0gXFw4MC0xMDAlXFxdXG5rcy50ZXN0KGdyb3VwMV9kYXRhLCBncm91cDJfZGF0YSlcblxuXG5gYGBcbmBgYCJ9 -->

```r
```r
diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj)

temp <- left_join(gene.TSS.tb, diff.RNA, by = c(\ensembl\ = \ensembl_gene_id\)) %>% dplyr::filter(!is.na(log2FoldChange),
                                                                                                  !is.na(TAD))


data <- temp %>% group_by(TAD) %>%
  dplyr::summarise(absAvgLog2FC = abs(mean(log2FoldChange)),
                   avgLog2FC = mean(log2FoldChange),
                   geneDensity = mean(geneDensity),
                   enhDensity = mean(enhDensity),
                   regDensity = mean(regDensity))

data$geneDensityGroup <- cut(
  data$geneDensity,
  breaks = quantile(data$geneDensity, probs = seq(0, 1, 0.2), na.rm = TRUE),
  include.lowest = TRUE,
  labels = paste0(seq(0, 80, 20), \-\, seq(20, 100, 20), \%\)
)

data$enhDensityGroup <- cut(
  data$enhDensity,
  breaks = quantile(data$enhDensity, probs = seq(0, 1, 0.2), na.rm = TRUE),
  include.lowest = TRUE,
  labels = paste0(seq(0, 80, 20), \-\, seq(20, 100, 20), \%\)
)


### Ploting  grouping

p <- ggplot(data, aes(x = enhDensityGroup, y = enhDensity, fill = enhDensityGroup)) + 
  geom_boxplot(color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA) + theme_classic() +
  coord_cartesian(ylim = c(0, quantile(data$enhDensity, 0.99))) +
  labs(x = \Enhancer Density Group\ , y = \TAD enhancer density\) +
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) +
  theme(
    legend.position = \none\,
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- paste0(\tadGroup_enhDensity\)
width <- panelSize(1.2)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()




p <- ggplot(data, aes(x = geneDensityGroup, y = geneDensity, fill = geneDensityGroup)) + 
  geom_boxplot(color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA) + theme_classic() +
  coord_cartesian(ylim = c(0, quantile(data$geneDensity, 0.99))) +
  labs(x = \Gene Density Group\ , y = \Gene density\) +
  scale_fill_manual(values = c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\)) +
  theme(
    legend.position = \none\,
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )
fileName <- paste0(\tadGroup_geneDensity\)
width <- 31*mmToInch
height <- 38*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


### Plotting distribution - enh
 getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(enhDensityGroup ==group1) )$avgLog2FC
  distance2 <- (data %>% dplyr::filter(enhDensityGroup ==group2) )$avgLog2FC
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


#### ALL
# ylim <- max(abs(quantile(data$avgLog2FC, 0.01)), abs(quantile(data$avgLog2FC, 0.99)))
# p <- ggplot(data, aes(x = enhDensityGroup, y = avgLog2FC)) + geom_violin(aes(fill = enhDensityGroup))+ 
#   geom_boxplot(outlier.shape = NA, width = 0.1) + theme_classic() +
#   coord_cartesian(ylim = c(-ylim, ylim)) +
#   geom_hline(yintercept = 0) +   theme(legend.position = \none\) +
#   scale_fill_manual(values = c(\#d9d9d9\, \#bdbdbd\, \#969696\, \#737373\, \#525252\))
# 
# fileName <- paste0(\tadGroup_enhDensity_avgLog2FC\)
# height <- 3
# width <- 3
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()
#### UP
data.plus <- data %>% dplyr::filter(avgLog2FC > 0)
ps01 <- round(getPvalWilcox(data.plus, \0-20%\, \20-40%\), 5)
ps12 <- round(getPvalWilcox(data.plus, \20-40%\, \40-60%\), 5)
ps23 <- round(getPvalWilcox(data.plus, \40-60%\, \60-80%\), 5)
ps34 <- round(getPvalWilcox(data.plus, \60-80%\, \80-100%\), 5)



p <- ggplot(data.plus, aes(x = enhDensityGroup, y = avgLog2FC)) + 
  geom_violin(aes(fill = enhDensityGroup),
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE)+ 
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  labs(x = \Enhancer density group\ , y = \avg log2(fold change)\) +
  stat_summary(
    aes(group = enhDensityGroup), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+ coord_cartesian(ylim = c(0, 1.5)) +
  annotate(\text\, x = 1, y = 1, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\), 
           color = \black\, hjust = 0, size = 2)


fileName <- paste0(\tadGroup_enhDensity_avgLog2FC_up\)
width <- panelSize(1.15)*mmToInch
height <- panelSize(1.07)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


#### DOWN
data.minus <- data %>% dplyr::filter(avgLog2FC < 0)
ps01 <- round(getPvalWilcox(data.minus, \0-20%\, \20-40%\), 5)
ps12 <- round(getPvalWilcox(data.minus, \20-40%\, \40-60%\), 5)
ps23 <- round(getPvalWilcox(data.minus, \40-60%\, \60-80%\), 5)
ps34 <- round(getPvalWilcox(data.minus, \60-80%\, \80-100%\), 5)


p <- ggplot(data.minus, aes(x = enhDensityGroup, y = avgLog2FC)) + 
  geom_violin(aes(fill = enhDensityGroup),
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE)+ 
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  labs(x = \Enhancer density group\ , y = \avg log2(fold change)\) +
  stat_summary(
    aes(group = enhDensityGroup), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+ coord_cartesian(ylim = c(-1.5, 0))+
  annotate(\text\, x = 1, y = -1, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\), 
           color = \black\, hjust = 0, size = 2)

fileName <- paste0(\tadGroup_enhDensity_avgLog2FC_down\)
width <- panelSize(1.175)*mmToInch
height <- panelSize(1.07)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



### Plotting distribution - gene
#### ALL
# ylim <- max(abs(quantile(data$avgLog2FC, 0.01)), abs(quantile(data$avgLog2FC, 0.99)))
# p <- ggplot(data, aes(x = geneDensityGroup, y = avgLog2FC)) + geom_violin(aes(fill = geneDensityGroup))+ 
#   geom_boxplot(outlier.shape = NA, width = 0.1) + theme_classic() +
#   coord_cartesian(ylim = c(-ylim, ylim)) +
#   geom_hline(yintercept = 0) +   theme(legend.position = \none\) +
#   scale_fill_manual(values = c(\#d9d9d9\, \#bdbdbd\, \#969696\, \#737373\, \#525252\))
# 
# fileName <- paste0(\tadGroup_geneDensity_avgLog2FC\)
# height <- 3
# width <- 3
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()
 getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(geneDensityGroup ==group1) )$avgLog2FC
  distance2 <- (data %>% dplyr::filter(geneDensityGroup ==group2) )$avgLog2FC
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


data.plus <- data %>% dplyr::filter(avgLog2FC > 0)
ps01 <- round(getPvalWilcox(data.plus, \0-20%\, \20-40%\), 5)
ps12 <- round(getPvalWilcox(data.plus, \20-40%\, \40-60%\), 5)
ps23 <- round(getPvalWilcox(data.plus, \40-60%\, \60-80%\), 5)
ps34 <- round(getPvalWilcox(data.plus, \60-80%\, \80-100%\), 5)



p <- ggplot(data.plus, aes(x = geneDensityGroup, y = avgLog2FC)) + 
  geom_violin(aes(fill = geneDensityGroup),
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE)+ 
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  labs(x = \Gene density group\ , y = \avg log2(fold change)\) +
  stat_summary(
    aes(group = geneDensityGroup), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+ coord_cartesian(ylim = c(0, 1.5)) +
  annotate(\text\, x = 1, y = 1, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\), 
           color = \black\, hjust = 0, size = 2)


fileName <- paste0(\tadGroup_geneDensity_avgLog2FC_up\)
width <- panelSize(1.15)*mmToInch
height <- panelSize(1.07)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


#### DOWN
data.minus <- data %>% dplyr::filter(avgLog2FC < 0)
ps01 <- round(getPvalWilcox(data.minus, \0-20%\, \20-40%\), 5)
ps12 <- round(getPvalWilcox(data.minus, \20-40%\, \40-60%\), 5)
ps23 <- round(getPvalWilcox(data.minus, \40-60%\, \60-80%\), 5)
ps34 <- round(getPvalWilcox(data.minus, \60-80%\, \80-100%\), 5)


p <- ggplot(data.minus, aes(x = geneDensityGroup, y = avgLog2FC)) + 
  geom_violin(aes(fill = geneDensityGroup),
              color = \black\,
              linewidth = lineThick * mmToLineUnit, lineend = \square\,
              show.legend = FALSE)+ 
  geom_boxplot(width = 0.1, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  labs(x = \Gene density group\ , y = \avg log2(fold change)\) +
  stat_summary(
    aes(group = geneDensityGroup), fun = mean,
    geom = \point\, shape = 21, size = 1,
    fill = \red\, color = \black\
  ) +
  scale_fill_manual(values = c(\#D9D9D9\, \#BFBFBF\, \#A6A6A6\, \#8C8C8C\, \#737373\)) +
  theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+ coord_cartesian(ylim = c(-1.5, 0))+
  annotate(\text\, x = 1, y = -1, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\), 
           color = \black\, hjust = 0, size = 2)

fileName <- paste0(\tadGroup_geneDensity_avgLog2FC_down\)
width <- panelSize(1.175)*mmToInch
height <- panelSize(1.07)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


### CDF plot

ks_result <- ks.test(
  data %>% dplyr::filter(geneDensityGroup == \0-20%\) %>% pull(absAvgLog2FC),
  data %>% dplyr::filter(geneDensityGroup == \20-40%\) %>% pull(absAvgLog2FC)
)


p <- ggplot(data, aes(x = absAvgLog2FC, color = geneDensityGroup)) +
  scale_color_manual(values = rev(c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\))) +
  stat_ecdf(size = 0.4, linewidth = lineMedium * mmToLineUnit, lineend = \square\ ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Abs. log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.position = \none\,
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS),
    ) + scale_y_continuous(labels = scales::number_format(accuracy = 0.1))


fileName <- paste0(\tadGroup_geneDensity_avgLog2FC_cdf\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

data <- data.minus

group1_data <- data$absAvgLog2FC[data$geneDensityGroup == \0-20%\]
group2_data <- data$absAvgLog2FC[data$geneDensityGroup == \20-40%\]
ks.test(group1_data, group2_data)

group1_data <- data$absAvgLog2FC[data$geneDensityGroup == \20-40%\]
group2_data <- data$absAvgLog2FC[data$geneDensityGroup == \40-60%\]
ks.test(group1_data, group2_data)

group1_data <- data$absAvgLog2FC[data$geneDensityGroup == \40-60%\]
group2_data <- data$absAvgLog2FC[data$geneDensityGroup == \60-80%\]
ks.test(group1_data, group2_data)

group1_data <- data$absAvgLog2FC[data$geneDensityGroup == \60-80%\]
group2_data <- data$absAvgLog2FC[data$geneDensityGroup == \80-100%\]
ks.test(group1_data, group2_data)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### regdensity

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WTI5dWMyVnVjM1Z6TG14dmIzQXVZVzV1Ynk1MFlpQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aUxuUnpkbHdpS1NrcFhHNWNiaU1nU1cxd2IzSjBJR2x1YzNWc1lYUnBiMjRnYzJOdmNtVWdZMkZzWTNWc1lYUmxaQ0IzYVhSb0lIQjVkR2h2Ymx4dWNtVnpkV3gwUkdseUlEd3RJR2hsY21Vb1hDSXVMaTh1TGk5eVpYTjFiSFJjSWlsY2JtbHVjMU5qYjNKbExrUk5VMDhnUEMwZ1puSmxZV1FvYUdWeVpTaHlaWE4xYkhSRWFYSXNJRndpVkVGRVhDSXNJRndpYVc1emRXeGhkR2x2YmxOamIzSmxYekkxYTJKZlJ6RkVUVk5QTG5SemRsd2lLU2tnSlQ0bElGeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHTW9YQ0pqYUhKdmJWd2lMQ0JjSW5OMFlYSjBYQ0lzSUZ3aVpXNWtYQ0lzSUZ3aWJHOW5NbDlwYm5OMWJHRjBhVzl1WDNOamIzSmxYekV5TlRBd01Gd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ltbHVTVVFnUFNCd1lYTjBaU2hqYUhKdmJTd2djM1JoY25Rc0lHVnVaQ3dnYzJWd0lEMGdYQ0pmWENJcEtWeHVZMjlzYm1GdFpYTW9hVzV6VTJOdmNtVXVSRTFUVHlrZ1BDMGdZeWhjSW1Ob2NtOXRYQ0lzSUZ3aWMzUmhjblJjSWl3Z1hDSmxibVJjSWl3Z1hDSnBibk4xYkdGMGFXOXVVMk52Y21WY0lpd2dYQ0ppYVc1SlJGd2lLVnh1YVc1elUyTnZjbVV1WkZSQlJ5QThMU0JtY21WaFpDaG9aWEpsS0hKbGMzVnNkRVJwY2l3Z1hDSlVRVVJjSWl3Z1hDSnBibk4xYkdGMGFXOXVVMk52Y21WZk1qVnJZbDlITVdSVVFVY3VkSE4yWENJcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWXloY0ltTm9jbTl0WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpd2dYQ0pzYjJjeVgybHVjM1ZzWVhScGIyNWZjMk52Y21WZk1USTFNREF3WENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hpYVc1SlJDQTlJSEJoYzNSbEtHTm9jbTl0TENCemRHRnlkQ3dnWlc1a0xDQnpaWEFnUFNCY0lsOWNJaWtwWEc1amIyeHVZVzFsY3locGJuTlRZMjl5WlM1a1ZFRkhLU0E4TFNCaktGd2lZMmh5YjIxY0lpd2dYQ0p6ZEdGeWRGd2lMQ0JjSW1WdVpGd2lMQ0JjSW1sdWMzVnNZWFJwYjI1VFkyOXlaVndpTENCY0ltSnBia2xFWENJcFhHNXBibk5UWTI5eVpTNUJORGcxSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZ6ZFd4MFJHbHlMQ0JjSWxSQlJGd2lMQ0JjSW1sdWMzVnNZWFJwYjI1VFkyOXlaVjh5Tld0aVgwY3hRVFE0TlM1MGMzWmNJaWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGpLRndpWTJoeWIyMWNJaXdnWENKemRHRnlkRndpTENCY0ltVnVaRndpTENCY0lteHZaekpmYVc1emRXeGhkR2x2Ymw5elkyOXlaVjh4TWpVd01EQmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHSnBia2xFSUQwZ2NHRnpkR1VvWTJoeWIyMHNJSE4wWVhKMExDQmxibVFzSUhObGNDQTlJRndpWDF3aUtTbGNibU52Ykc1aGJXVnpLR2x1YzFOamIzSmxMa0UwT0RVcElEd3RJR01vWENKamFISnZiVndpTENCY0luTjBZWEowWENJc0lGd2laVzVrWENJc0lGd2lhVzV6ZFd4aGRHbHZibE5qYjNKbFhDSXNJRndpWW1sdVNVUmNJaWxjYmx4dVoyVjBTVzV6ZFd4aGRHbHZibE5qYjNKbElEd3RJR1oxYm1OMGFXOXVLR05vY2l3Z1kyOXZjbVJwYm1GMFpTd2dhVzV6VTJOdmNtVXVkR0lwZTF4dUlDQjBaVzF3TG5SaUlEd3RJR2x1YzFOamIzSmxMblJpSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dOb2NtOXRJRDA5SUdOb2Npd2djM1JoY25RZ1BDQmpiMjl5WkdsdVlYUmxMQ0JsYm1RZ1BpQmpiMjl5WkdsdVlYUmxLVnh1SUNCdmRYUWdQQzBnZEdWdGNDNTBZaVJwYm5OMWJHRjBhVzl1VTJOdmNtVmNiaUFnYVdZb2JHVnVaM1JvS0c5MWRDa2dQQ0F4S1h0Y2JpQWdJQ0J5WlhSMWNtNG9Ua0VwWEc0Z0lIMWxiSE5sZTF4dUlDQWdJSEpsZEhWeWJpaDBaVzF3TG5SaUpHbHVjM1ZzWVhScGIyNVRZMjl5WlNsY2JpQWdmVnh1ZlZ4dVhHNGpJRWx0Y0c5eWRHbHVaeUJVUVVRZ1ltOTFibVJoY21sbGMxeHVkR0ZrWDJKdmRXNWtZWEo1SUR3dElHWnlaV0ZrS0dobGNtVW9YQ0l1TGk4dUxpOXlaWE4xYkhRdlZFRkVYQ0lzSUZ3aVZFRkVYekkxYTJKZk1USTFhMkpmYjNSemRWOWliM1Z1WkdGeWFXVnpYMGN4UkUxVFR5NWlaV1JjSWlrcFhHNWpiMnh1WVcxbGN5aDBZV1JmWW05MWJtUmhjbmtwSUR3dElHTW9YQ0pqYUhKY0lpd2dYQ0p6ZEdGeWRGd2lMQ0JjSW1WdVpGd2lLVnh1ZEdGa1gySnZkVzVrWVhKNUlEd3RJSFJoWkY5aWIzVnVaR0Z5ZVNBbFBpVWdjbTkzZDJselpTZ3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaFpGOXBaQ0E5SUhCaGMzUmxLR05vY2l3Z2MzUmhjblFzSUdWdVpDd2djMlZ3SUQwZ1hDSmZYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdObGJuUmxjaUE5SUNoemRHRnlkQ0FySUdWdVpDa3ZNaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwYm5OVFkyOXlaVjlFVFZOUElEMGdaMlYwU1c1emRXeGhkR2x2YmxOamIzSmxLR05vY2l3Z1kyVnVkR1Z5TENCcGJuTlRZMjl5WlM1RVRWTlBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwYm5OVFkyOXlaVjlrVkVGSElEMGdaMlYwU1c1emRXeGhkR2x2YmxOamIzSmxLR05vY2l3Z1kyVnVkR1Z5TENCcGJuTlRZMjl5WlM1a1ZFRkhLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwYm5OVFkyOXlaVjlCTkRnMUlEMGdaMlYwU1c1emRXeGhkR2x2YmxOamIzSmxLR05vY2l3Z1kyVnVkR1Z5TENCcGJuTlRZMjl5WlM1Qk5EZzFLU2xjYmx4dWRHRmtYMkp2ZFc1a1lYSjVJRHd0SUhSaFpGOWliM1Z1WkdGeWVTQWxQaVVnWm1sc2RHVnlLQ0ZwWmw5aGJua29aWFpsY25sMGFHbHVaeWdwTENCcGN5NXVZU2twWEc1Y2JuUmhaRjlpYjNWdVpHRnllU1JrWlc1emFYUjVJRHd0SUdkbGRGOWtaVzV6YVhSNUtIUmhaRjlpYjNWdVpHRnllU1JwYm5OVFkyOXlaVjlFVFZOUExDQjBZV1JmWW05MWJtUmhjbmtrYVc1elUyTnZjbVZmWkZSQlJ5d2diaUE5SURFd01DbGNiblJoWkY5aWIzVnVaR0Z5ZVNBOExTQjBZV1JmWW05MWJtUmhjbmtnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dSbGJuTnBkSGtwWEc1blozQnNiM1FvZEdGa1gySnZkVzVrWVhKNUxDQmhaWE1vZUNBOUlHbHVjMU5qYjNKbFgwUk5VMDhzSUhrZ1BTQnBibk5UWTI5eVpWOWtWRUZITENCamIyeHZjaUE5SUdSbGJuTnBkSGtwS1NBcklGeHVJQ0JuWlc5dFgzQnZhVzUwS0hOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUhOallXeGxYMk52Ykc5eVgzWnBjbWxrYVhNb0tTQXJJR052YjNKa1gyWnBlR1ZrS0NrZ0sxeHVJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJREFwSUNzZ2RHaGxiV1ZmWW5jb0tWeHVYRzVjYmx4dWRHRmtYMkp2ZFc1a1lYSjVKR1JsYm5OcGRIa2dQQzBnWjJWMFgyUmxibk5wZEhrb2RHRmtYMkp2ZFc1a1lYSjVKR2x1YzFOamIzSmxYMFJOVTA4c0lIUmhaRjlpYjNWdVpHRnllU1JwYm5OVFkyOXlaVjlCTkRnMUxDQnVJRDBnTVRBd0tWeHVkR0ZrWDJKdmRXNWtZWEo1SUR3dElIUmhaRjlpYjNWdVpHRnllU0FsUGlVZ1pIQnNlWEk2T21GeWNtRnVaMlVvWkdWdWMybDBlU2xjYm1kbmNHeHZkQ2gwWVdSZlltOTFibVJoY25rc0lHRmxjeWg0SUQwZ2FXNXpVMk52Y21WZlJFMVRUeXdnZVNBOUlHbHVjMU5qYjNKbFgwRTBPRFVzSUdOdmJHOXlJRDBnWkdWdWMybDBlU2twSUNzZ1hHNGdJR2RsYjIxZmNHOXBiblFvYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnYzJOaGJHVmZZMjlzYjNKZmRtbHlhV1JwY3lncElDc2dZMjl2Y21SZlptbDRaV1FvS1NBclhHNGdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdNQ2tnS3lCMGFHVnRaVjlpZHlncFhHNWNibHh1WEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5jb25zZW5zdXMubG9vcC5hbm5vLnRiIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSlcblxuIyBJbXBvcnQgaW5zdWxhdGlvbiBzY29yZSBjYWxjdWxhdGVkIHdpdGggcHl0aG9uXG5yZXN1bHREaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdFxcKVxuaW5zU2NvcmUuRE1TTyA8LSBmcmVhZChoZXJlKHJlc3VsdERpciwgXFxUQURcXCwgXFxpbnN1bGF0aW9uU2NvcmVfMjVrYl9HMURNU08udHN2XFwpKSAlPiUgXG4gIGRwbHlyOjpzZWxlY3QoYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxsb2cyX2luc3VsYXRpb25fc2NvcmVfMTI1MDAwXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShiaW5JRCA9IHBhc3RlKGNocm9tLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCkpXG5jb2xuYW1lcyhpbnNTY29yZS5ETVNPKSA8LSBjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGluc3VsYXRpb25TY29yZVxcLCBcXGJpbklEXFwpXG5pbnNTY29yZS5kVEFHIDwtIGZyZWFkKGhlcmUocmVzdWx0RGlyLCBcXFRBRFxcLCBcXGluc3VsYXRpb25TY29yZV8yNWtiX0cxZFRBRy50c3ZcXCkpICU+JSBcbiAgZHBseXI6OnNlbGVjdChjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGxvZzJfaW5zdWxhdGlvbl9zY29yZV8xMjUwMDBcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGJpbklEID0gcGFzdGUoY2hyb20sIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSlcbmNvbG5hbWVzKGluc1Njb3JlLmRUQUcpIDwtIGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcaW5zdWxhdGlvblNjb3JlXFwsIFxcYmluSURcXClcbmluc1Njb3JlLkE0ODUgPC0gZnJlYWQoaGVyZShyZXN1bHREaXIsIFxcVEFEXFwsIFxcaW5zdWxhdGlvblNjb3JlXzI1a2JfRzFBNDg1LnRzdlxcKSkgJT4lIFxuICBkcGx5cjo6c2VsZWN0KGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcbG9nMl9pbnN1bGF0aW9uX3Njb3JlXzEyNTAwMFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoYmluSUQgPSBwYXN0ZShjaHJvbSwgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpKVxuY29sbmFtZXMoaW5zU2NvcmUuQTQ4NSkgPC0gYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxpbnN1bGF0aW9uU2NvcmVcXCwgXFxiaW5JRFxcKVxuXG5nZXRJbnN1bGF0aW9uU2NvcmUgPC0gZnVuY3Rpb24oY2hyLCBjb29yZGluYXRlLCBpbnNTY29yZS50Yil7XG4gIHRlbXAudGIgPC0gaW5zU2NvcmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyb20gPT0gY2hyLCBzdGFydCA8IGNvb3JkaW5hdGUsIGVuZCA+IGNvb3JkaW5hdGUpXG4gIG91dCA8LSB0ZW1wLnRiJGluc3VsYXRpb25TY29yZVxuICBpZihsZW5ndGgob3V0KSA8IDEpe1xuICAgIHJldHVybihOQSlcbiAgfWVsc2V7XG4gICAgcmV0dXJuKHRlbXAudGIkaW5zdWxhdGlvblNjb3JlKVxuICB9XG59XG5cbiMgSW1wb3J0aW5nIFRBRCBib3VuZGFyaWVzXG50YWRfYm91bmRhcnkgPC0gZnJlYWQoaGVyZShcXC4uLy4uL3Jlc3VsdC9UQURcXCwgXFxUQURfMjVrYl8xMjVrYl9vdHN1X2JvdW5kYXJpZXNfRzFETVNPLmJlZFxcKSlcbmNvbG5hbWVzKHRhZF9ib3VuZGFyeSkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG50YWRfYm91bmRhcnkgPC0gdGFkX2JvdW5kYXJ5ICU+JSByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFkX2lkID0gcGFzdGUoY2hyLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCksXG4gICAgICAgICAgICAgICAgY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yLFxuICAgICAgICAgICAgICAgIGluc1Njb3JlX0RNU08gPSBnZXRJbnN1bGF0aW9uU2NvcmUoY2hyLCBjZW50ZXIsIGluc1Njb3JlLkRNU08pLFxuICAgICAgICAgICAgICAgIGluc1Njb3JlX2RUQUcgPSBnZXRJbnN1bGF0aW9uU2NvcmUoY2hyLCBjZW50ZXIsIGluc1Njb3JlLmRUQUcpLFxuICAgICAgICAgICAgICAgIGluc1Njb3JlX0E0ODUgPSBnZXRJbnN1bGF0aW9uU2NvcmUoY2hyLCBjZW50ZXIsIGluc1Njb3JlLkE0ODUpKVxuXG50YWRfYm91bmRhcnkgPC0gdGFkX2JvdW5kYXJ5ICU+JSBmaWx0ZXIoIWlmX2FueShldmVyeXRoaW5nKCksIGlzLm5hKSlcblxudGFkX2JvdW5kYXJ5JGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGFkX2JvdW5kYXJ5JGluc1Njb3JlX0RNU08sIHRhZF9ib3VuZGFyeSRpbnNTY29yZV9kVEFHLCBuID0gMTAwKVxudGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmdncGxvdCh0YWRfYm91bmRhcnksIGFlcyh4ID0gaW5zU2NvcmVfRE1TTywgeSA9IGluc1Njb3JlX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKyB0aGVtZV9idygpXG5cblxuXG50YWRfYm91bmRhcnkkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0YWRfYm91bmRhcnkkaW5zU2NvcmVfRE1TTywgdGFkX2JvdW5kYXJ5JGluc1Njb3JlX0E0ODUsIG4gPSAxMDApXG50YWRfYm91bmRhcnkgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZ2dwbG90KHRhZF9ib3VuZGFyeSwgYWVzKHggPSBpbnNTY29yZV9ETVNPLCB5ID0gaW5zU2NvcmVfQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKyBjb29yZF9maXhlZCgpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArIHRoZW1lX2J3KClcblxuXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
name <- \chromo_cons_annoHierarchy\
consensus.loop.anno.tb <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import insulation score calculated with python
resultDir <- here(\../../result\)
insScore.DMSO <- fread(here(resultDir, \TAD\, \insulationScore_25kb_G1DMSO.tsv\)) %>% 
  dplyr::select(c(\chrom\, \start\, \end\, \log2_insulation_score_125000\)) %>%
  dplyr::mutate(binID = paste(chrom, start, end, sep = \_\))
colnames(insScore.DMSO) <- c(\chrom\, \start\, \end\, \insulationScore\, \binID\)
insScore.dTAG <- fread(here(resultDir, \TAD\, \insulationScore_25kb_G1dTAG.tsv\)) %>% 
  dplyr::select(c(\chrom\, \start\, \end\, \log2_insulation_score_125000\)) %>%
  dplyr::mutate(binID = paste(chrom, start, end, sep = \_\))
colnames(insScore.dTAG) <- c(\chrom\, \start\, \end\, \insulationScore\, \binID\)
insScore.A485 <- fread(here(resultDir, \TAD\, \insulationScore_25kb_G1A485.tsv\)) %>% 
  dplyr::select(c(\chrom\, \start\, \end\, \log2_insulation_score_125000\)) %>%
  dplyr::mutate(binID = paste(chrom, start, end, sep = \_\))
colnames(insScore.A485) <- c(\chrom\, \start\, \end\, \insulationScore\, \binID\)

getInsulationScore <- function(chr, coordinate, insScore.tb){
  temp.tb <- insScore.tb %>% dplyr::filter(chrom == chr, start < coordinate, end > coordinate)
  out <- temp.tb$insulationScore
  if(length(out) < 1){
    return(NA)
  }else{
    return(temp.tb$insulationScore)
  }
}

# Importing TAD boundaries
tad_boundary <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_boundaries_G1DMSO.bed\))
colnames(tad_boundary) <- c(\chr\, \start\, \end\)
tad_boundary <- tad_boundary %>% rowwise() %>%
  dplyr::mutate(tad_id = paste(chr, start, end, sep = \_\),
                center = (start + end)/2,
                insScore_DMSO = getInsulationScore(chr, center, insScore.DMSO),
                insScore_dTAG = getInsulationScore(chr, center, insScore.dTAG),
                insScore_A485 = getInsulationScore(chr, center, insScore.A485))

tad_boundary <- tad_boundary %>% filter(!if_any(everything(), is.na))

tad_boundary$density <- get_density(tad_boundary$insScore_DMSO, tad_boundary$insScore_dTAG, n = 100)
tad_boundary <- tad_boundary %>% dplyr::arrange(density)
ggplot(tad_boundary, aes(x = insScore_DMSO, y = insScore_dTAG, color = density)) + 
  geom_point(show.legend = FALSE) + 
  scale_color_viridis() + coord_fixed() +
  geom_abline(slope = 1, intercept = 0) + theme_bw()



tad_boundary$density <- get_density(tad_boundary$insScore_DMSO, tad_boundary$insScore_A485, n = 100)
tad_boundary <- tad_boundary %>% dplyr::arrange(density)
ggplot(tad_boundary, aes(x = insScore_DMSO, y = insScore_A485, color = density)) + 
  geom_point(show.legend = FALSE) + 
  scale_color_viridis() + coord_fixed() +
  geom_abline(slope = 1, intercept = 0) + theme_bw()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVZMjl1YzJWdWMzVnpMbXh2YjNBdVlXNXVieTUwWWlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjTG5SemRseGNLU2twWEc1Y2JpTWdTVzF3YjNKMElHbHVjM1ZzWVhScGIyNGdjMk52Y21VZ1kyRnNZM1ZzWVhSbFpDQjNhWFJvSUhCNWRHaHZibHh1Y21WemRXeDBSR2x5SUR3dElHaGxjbVVvWEZ3dUxpOHVMaTl5WlhOMWJIUmNYQ2xjYm1sdWMxTmpiM0psTGtSTlUwOGdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpYTjFiSFJFYVhJc0lGeGNWRUZFWEZ3c0lGeGNhVzV6ZFd4aGRHbHZibE5qYjNKbFh6STFhMkpmUnpGRVRWTlBMblJ6ZGx4Y0tTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dNb1hGeGphSEp2YlZ4Y0xDQmNYSE4wWVhKMFhGd3NJRnhjWlc1a1hGd3NJRnhjYkc5bk1sOXBibk4xYkdGMGFXOXVYM05qYjNKbFh6RXlOVEF3TUZ4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWW1sdVNVUWdQU0J3WVhOMFpTaGphSEp2YlN3Z2MzUmhjblFzSUdWdVpDd2djMlZ3SUQwZ1hGeGZYRndwS1Z4dVkyOXNibUZ0WlhNb2FXNXpVMk52Y21VdVJFMVRUeWtnUEMwZ1l5aGNYR05vY205dFhGd3NJRnhjYzNSaGNuUmNYQ3dnWEZ4bGJtUmNYQ3dnWEZ4cGJuTjFiR0YwYVc5dVUyTnZjbVZjWEN3Z1hGeGlhVzVKUkZ4Y0tWeHVhVzV6VTJOdmNtVXVaRlJCUnlBOExTQm1jbVZoWkNob1pYSmxLSEpsYzNWc2RFUnBjaXdnWEZ4VVFVUmNYQ3dnWEZ4cGJuTjFiR0YwYVc5dVUyTnZjbVZmTWpWcllsOUhNV1JVUVVjdWRITjJYRndwS1NBbFBpVWdYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWhjWEdOb2NtOXRYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWEN3Z1hGeHNiMmN5WDJsdWMzVnNZWFJwYjI1ZmMyTnZjbVZmTVRJMU1EQXdYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGlhVzVKUkNBOUlIQmhjM1JsS0dOb2NtOXRMQ0J6ZEdGeWRDd2daVzVrTENCelpYQWdQU0JjWEY5Y1hDa3BYRzVqYjJ4dVlXMWxjeWhwYm5OVFkyOXlaUzVrVkVGSEtTQThMU0JqS0Z4Y1kyaHliMjFjWEN3Z1hGeHpkR0Z5ZEZ4Y0xDQmNYR1Z1WkZ4Y0xDQmNYR2x1YzNWc1lYUnBiMjVUWTI5eVpWeGNMQ0JjWEdKcGJrbEVYRndwWEc1cGJuTlRZMjl5WlM1Qk5EZzFJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVnpkV3gwUkdseUxDQmNYRlJCUkZ4Y0xDQmNYR2x1YzNWc1lYUnBiMjVUWTI5eVpWOHlOV3RpWDBjeFFUUTROUzUwYzNaY1hDa3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENoaktGeGNZMmh5YjIxY1hDd2dYRnh6ZEdGeWRGeGNMQ0JjWEdWdVpGeGNMQ0JjWEd4dlp6SmZhVzV6ZFd4aGRHbHZibDl6WTI5eVpWOHhNalV3TURCY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dKcGJrbEVJRDBnY0dGemRHVW9ZMmh5YjIwc0lITjBZWEowTENCbGJtUXNJSE5sY0NBOUlGeGNYMXhjS1NsY2JtTnZiRzVoYldWektHbHVjMU5qYjNKbExrRTBPRFVwSUR3dElHTW9YRnhqYUhKdmJWeGNMQ0JjWEhOMFlYSjBYRndzSUZ4Y1pXNWtYRndzSUZ4Y2FXNXpkV3hoZEdsdmJsTmpiM0psWEZ3c0lGeGNZbWx1U1VSY1hDbGNibHh1WjJWMFNXNXpkV3hoZEdsdmJsTmpiM0psSUR3dElHWjFibU4wYVc5dUtHTm9jaXdnWTI5dmNtUnBibUYwWlN3Z2FXNXpVMk52Y21VdWRHSXBlMXh1SUNCMFpXMXdMblJpSUR3dElHbHVjMU5qYjNKbExuUmlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR05vY205dElEMDlJR05vY2l3Z2MzUmhjblFnUENCamIyOXlaR2x1WVhSbExDQmxibVFnUGlCamIyOXlaR2x1WVhSbEtWeHVJQ0J2ZFhRZ1BDMGdkR1Z0Y0M1MFlpUnBibk4xYkdGMGFXOXVVMk52Y21WY2JpQWdhV1lvYkdWdVozUm9LRzkxZENrZ1BDQXhLWHRjYmlBZ0lDQnlaWFIxY200b1RrRXBYRzRnSUgxbGJITmxlMXh1SUNBZ0lISmxkSFZ5YmloMFpXMXdMblJpSkdsdWMzVnNZWFJwYjI1VFkyOXlaU2xjYmlBZ2ZWeHVmVnh1WEc0aklFbHRjRzl5ZEdsdVp5QlVRVVFnWW05MWJtUmhjbWxsYzF4dWRHRmtYMkp2ZFc1a1lYSjVJRHd0SUdaeVpXRmtLR2hsY21Vb1hGd3VMaTh1TGk5eVpYTjFiSFF2VkVGRVhGd3NJRnhjVkVGRVh6STFhMkpmTVRJMWEySmZiM1J6ZFY5aWIzVnVaR0Z5YVdWelgwY3hSRTFUVHk1aVpXUmNYQ2twWEc1amIyeHVZVzFsY3loMFlXUmZZbTkxYm1SaGNua3BJRHd0SUdNb1hGeGphSEpjWEN3Z1hGeHpkR0Z5ZEZ4Y0xDQmNYR1Z1WkZ4Y0tWeHVkR0ZrWDJKdmRXNWtZWEo1SUR3dElIUmhaRjlpYjNWdVpHRnllU0FsUGlVZ2NtOTNkMmx6WlNncElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoWkY5cFpDQTlJSEJoYzNSbEtHTm9jaXdnYzNSaGNuUXNJR1Z1WkN3Z2MyVndJRDBnWEZ4ZlhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05sYm5SbGNpQTlJQ2h6ZEdGeWRDQXJJR1Z1WkNrdk1peGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBibk5UWTI5eVpWOUVUVk5QSUQwZ1oyVjBTVzV6ZFd4aGRHbHZibE5qYjNKbEtHTm9jaXdnWTJWdWRHVnlMQ0JwYm5OVFkyOXlaUzVFVFZOUEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBibk5UWTI5eVpWOWtWRUZISUQwZ1oyVjBTVzV6ZFd4aGRHbHZibE5qYjNKbEtHTm9jaXdnWTJWdWRHVnlMQ0JwYm5OVFkyOXlaUzVrVkVGSEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBibk5UWTI5eVpWOUJORGcxSUQwZ1oyVjBTVzV6ZFd4aGRHbHZibE5qYjNKbEtHTm9jaXdnWTJWdWRHVnlMQ0JwYm5OVFkyOXlaUzVCTkRnMUtTbGNibHh1ZEdGa1gySnZkVzVrWVhKNUlEd3RJSFJoWkY5aWIzVnVaR0Z5ZVNBbFBpVWdabWxzZEdWeUtDRnBabDloYm5rb1pYWmxjbmwwYUdsdVp5Z3BMQ0JwY3k1dVlTa3BYRzVjYm5SaFpGOWliM1Z1WkdGeWVTUmtaVzV6YVhSNUlEd3RJR2RsZEY5a1pXNXphWFI1S0hSaFpGOWliM1Z1WkdGeWVTUnBibk5UWTI5eVpWOUVUVk5QTENCMFlXUmZZbTkxYm1SaGNua2thVzV6VTJOdmNtVmZaRlJCUnl3Z2JpQTlJREV3TUNsY2JuUmhaRjlpYjNWdVpHRnllU0E4TFNCMFlXUmZZbTkxYm1SaGNua2dKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JsYm5OcGRIa3BYRzVuWjNCc2IzUW9kR0ZrWDJKdmRXNWtZWEo1TENCaFpYTW9lQ0E5SUdsdWMxTmpiM0psWDBSTlUwOHNJSGtnUFNCcGJuTlRZMjl5WlY5a1ZFRkhMQ0JqYjJ4dmNpQTlJR1JsYm5OcGRIa3BLU0FySUZ4dUlDQm5aVzl0WDNCdmFXNTBLSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ1hHNGdJSE5qWVd4bFgyTnZiRzl5WDNacGNtbGthWE1vS1NBcklHTnZiM0prWDJacGVHVmtLQ2tnSzF4dUlDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3NnZEdobGJXVmZZbmNvS1Z4dVhHNWNibHh1ZEdGa1gySnZkVzVrWVhKNUpHUmxibk5wZEhrZ1BDMGdaMlYwWDJSbGJuTnBkSGtvZEdGa1gySnZkVzVrWVhKNUpHbHVjMU5qYjNKbFgwUk5VMDhzSUhSaFpGOWliM1Z1WkdGeWVTUnBibk5UWTI5eVpWOUJORGcxTENCdUlEMGdNVEF3S1Z4dWRHRmtYMkp2ZFc1a1lYSjVJRHd0SUhSaFpGOWliM1Z1WkdGeWVTQWxQaVVnWkhCc2VYSTZPbUZ5Y21GdVoyVW9aR1Z1YzJsMGVTbGNibWRuY0d4dmRDaDBZV1JmWW05MWJtUmhjbmtzSUdGbGN5aDRJRDBnYVc1elUyTnZjbVZmUkUxVFR5d2dlU0E5SUdsdWMxTmpiM0psWDBFME9EVXNJR052Ykc5eUlEMGdaR1Z1YzJsMGVTa3BJQ3NnWEc0Z0lHZGxiMjFmY0c5cGJuUW9jMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnS3lCY2JpQWdjMk5oYkdWZlkyOXNiM0pmZG1seWFXUnBjeWdwSUNzZ1kyOXZjbVJmWm1sNFpXUW9LU0FyWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ01Da2dLeUIwYUdWdFpWOWlkeWdwWEc1Y2JseHVYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuY29uc2Vuc3VzLmxvb3AuYW5uby50YiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5cbiMgSW1wb3J0IGluc3VsYXRpb24gc2NvcmUgY2FsY3VsYXRlZCB3aXRoIHB5dGhvblxucmVzdWx0RGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHRcXClcbmluc1Njb3JlLkRNU08gPC0gZnJlYWQoaGVyZShyZXN1bHREaXIsIFxcVEFEXFwsIFxcaW5zdWxhdGlvblNjb3JlXzI1a2JfRzFETVNPLnRzdlxcKSkgJT4lIFxuICBkcGx5cjo6c2VsZWN0KGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcbG9nMl9pbnN1bGF0aW9uX3Njb3JlXzEyNTAwMFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoYmluSUQgPSBwYXN0ZShjaHJvbSwgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpKVxuY29sbmFtZXMoaW5zU2NvcmUuRE1TTykgPC0gYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxpbnN1bGF0aW9uU2NvcmVcXCwgXFxiaW5JRFxcKVxuaW5zU2NvcmUuZFRBRyA8LSBmcmVhZChoZXJlKHJlc3VsdERpciwgXFxUQURcXCwgXFxpbnN1bGF0aW9uU2NvcmVfMjVrYl9HMWRUQUcudHN2XFwpKSAlPiUgXG4gIGRwbHlyOjpzZWxlY3QoYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxsb2cyX2luc3VsYXRpb25fc2NvcmVfMTI1MDAwXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShiaW5JRCA9IHBhc3RlKGNocm9tLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCkpXG5jb2xuYW1lcyhpbnNTY29yZS5kVEFHKSA8LSBjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGluc3VsYXRpb25TY29yZVxcLCBcXGJpbklEXFwpXG5pbnNTY29yZS5BNDg1IDwtIGZyZWFkKGhlcmUocmVzdWx0RGlyLCBcXFRBRFxcLCBcXGluc3VsYXRpb25TY29yZV8yNWtiX0cxQTQ4NS50c3ZcXCkpICU+JSBcbiAgZHBseXI6OnNlbGVjdChjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGxvZzJfaW5zdWxhdGlvbl9zY29yZV8xMjUwMDBcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGJpbklEID0gcGFzdGUoY2hyb20sIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSlcbmNvbG5hbWVzKGluc1Njb3JlLkE0ODUpIDwtIGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcaW5zdWxhdGlvblNjb3JlXFwsIFxcYmluSURcXClcblxuZ2V0SW5zdWxhdGlvblNjb3JlIDwtIGZ1bmN0aW9uKGNociwgY29vcmRpbmF0ZSwgaW5zU2NvcmUudGIpe1xuICB0ZW1wLnRiIDwtIGluc1Njb3JlLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGNocm9tID09IGNociwgc3RhcnQgPCBjb29yZGluYXRlLCBlbmQgPiBjb29yZGluYXRlKVxuICBvdXQgPC0gdGVtcC50YiRpbnN1bGF0aW9uU2NvcmVcbiAgaWYobGVuZ3RoKG91dCkgPCAxKXtcbiAgICByZXR1cm4oTkEpXG4gIH1lbHNle1xuICAgIHJldHVybih0ZW1wLnRiJGluc3VsYXRpb25TY29yZSlcbiAgfVxufVxuXG4jIEltcG9ydGluZyBUQUQgYm91bmRhcmllc1xudGFkX2JvdW5kYXJ5IDwtIGZyZWFkKGhlcmUoXFwuLi8uLi9yZXN1bHQvVEFEXFwsIFxcVEFEXzI1a2JfMTI1a2Jfb3RzdV9ib3VuZGFyaWVzX0cxRE1TTy5iZWRcXCkpXG5jb2xuYW1lcyh0YWRfYm91bmRhcnkpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxudGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgcm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhZF9pZCA9IHBhc3RlKGNociwgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpLFxuICAgICAgICAgICAgICAgIGNlbnRlciA9IChzdGFydCArIGVuZCkvMixcbiAgICAgICAgICAgICAgICBpbnNTY29yZV9ETVNPID0gZ2V0SW5zdWxhdGlvblNjb3JlKGNociwgY2VudGVyLCBpbnNTY29yZS5ETVNPKSxcbiAgICAgICAgICAgICAgICBpbnNTY29yZV9kVEFHID0gZ2V0SW5zdWxhdGlvblNjb3JlKGNociwgY2VudGVyLCBpbnNTY29yZS5kVEFHKSxcbiAgICAgICAgICAgICAgICBpbnNTY29yZV9BNDg1ID0gZ2V0SW5zdWxhdGlvblNjb3JlKGNociwgY2VudGVyLCBpbnNTY29yZS5BNDg1KSlcblxudGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZmlsdGVyKCFpZl9hbnkoZXZlcnl0aGluZygpLCBpcy5uYSkpXG5cbnRhZF9ib3VuZGFyeSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRhZF9ib3VuZGFyeSRpbnNTY29yZV9ETVNPLCB0YWRfYm91bmRhcnkkaW5zU2NvcmVfZFRBRywgbiA9IDEwMClcbnRhZF9ib3VuZGFyeSA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nZ3Bsb3QodGFkX2JvdW5kYXJ5LCBhZXMoeCA9IGluc1Njb3JlX0RNU08sIHkgPSBpbnNTY29yZV9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsgdGhlbWVfYncoKVxuXG5cblxudGFkX2JvdW5kYXJ5JGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGFkX2JvdW5kYXJ5JGluc1Njb3JlX0RNU08sIHRhZF9ib3VuZGFyeSRpbnNTY29yZV9BNDg1LCBuID0gMTAwKVxudGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmdncGxvdCh0YWRfYm91bmRhcnksIGFlcyh4ID0gaW5zU2NvcmVfRE1TTywgeSA9IGluc1Njb3JlX0E0ODUsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKyB0aGVtZV9idygpXG5cblxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuY29uc2Vuc3VzLmxvb3AuYW5uby50YiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5cbiMgSW1wb3J0IGluc3VsYXRpb24gc2NvcmUgY2FsY3VsYXRlZCB3aXRoIHB5dGhvblxucmVzdWx0RGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHRcXClcbmluc1Njb3JlLkRNU08gPC0gZnJlYWQoaGVyZShyZXN1bHREaXIsIFxcVEFEXFwsIFxcaW5zdWxhdGlvblNjb3JlXzI1a2JfRzFETVNPLnRzdlxcKSkgJT4lIFxuICBkcGx5cjo6c2VsZWN0KGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcbG9nMl9pbnN1bGF0aW9uX3Njb3JlXzEyNTAwMFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoYmluSUQgPSBwYXN0ZShjaHJvbSwgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpKVxuY29sbmFtZXMoaW5zU2NvcmUuRE1TTykgPC0gYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxpbnN1bGF0aW9uU2NvcmVcXCwgXFxiaW5JRFxcKVxuaW5zU2NvcmUuZFRBRyA8LSBmcmVhZChoZXJlKHJlc3VsdERpciwgXFxUQURcXCwgXFxpbnN1bGF0aW9uU2NvcmVfMjVrYl9HMWRUQUcudHN2XFwpKSAlPiUgXG4gIGRwbHlyOjpzZWxlY3QoYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxsb2cyX2luc3VsYXRpb25fc2NvcmVfMTI1MDAwXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShiaW5JRCA9IHBhc3RlKGNocm9tLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCkpXG5jb2xuYW1lcyhpbnNTY29yZS5kVEFHKSA8LSBjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGluc3VsYXRpb25TY29yZVxcLCBcXGJpbklEXFwpXG5pbnNTY29yZS5BNDg1IDwtIGZyZWFkKGhlcmUocmVzdWx0RGlyLCBcXFRBRFxcLCBcXGluc3VsYXRpb25TY29yZV8yNWtiX0cxQTQ4NS50c3ZcXCkpICU+JSBcbiAgZHBseXI6OnNlbGVjdChjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGxvZzJfaW5zdWxhdGlvbl9zY29yZV8xMjUwMDBcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGJpbklEID0gcGFzdGUoY2hyb20sIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSlcbmNvbG5hbWVzKGluc1Njb3JlLkE0ODUpIDwtIGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcaW5zdWxhdGlvblNjb3JlXFwsIFxcYmluSURcXClcblxuZ2V0SW5zdWxhdGlvblNjb3JlIDwtIGZ1bmN0aW9uKGNociwgY29vcmRpbmF0ZSwgaW5zU2NvcmUudGIpe1xuICB0ZW1wLnRiIDwtIGluc1Njb3JlLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGNocm9tID09IGNociwgc3RhcnQgPCBjb29yZGluYXRlLCBlbmQgPiBjb29yZGluYXRlKVxuICBvdXQgPC0gdGVtcC50YiRpbnN1bGF0aW9uU2NvcmVcbiAgaWYobGVuZ3RoKG91dCkgPCAxKXtcbiAgICByZXR1cm4oTkEpXG4gIH1lbHNle1xuICAgIHJldHVybih0ZW1wLnRiJGluc3VsYXRpb25TY29yZSlcbiAgfVxufVxuXG4jIEltcG9ydGluZyBUQUQgYm91bmRhcmllc1xudGFkX2JvdW5kYXJ5IDwtIGZyZWFkKGhlcmUoXFwuLi8uLi9yZXN1bHQvVEFEXFwsIFxcVEFEXzI1a2JfMTI1a2Jfb3RzdV9ib3VuZGFyaWVzX0cxRE1TTy5iZWRcXCkpXG5jb2xuYW1lcyh0YWRfYm91bmRhcnkpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxudGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgcm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhZF9pZCA9IHBhc3RlKGNociwgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpLFxuICAgICAgICAgICAgICAgIGNlbnRlciA9IChzdGFydCArIGVuZCkvMixcbiAgICAgICAgICAgICAgICBpbnNTY29yZV9ETVNPID0gZ2V0SW5zdWxhdGlvblNjb3JlKGNociwgY2VudGVyLCBpbnNTY29yZS5ETVNPKSxcbiAgICAgICAgICAgICAgICBpbnNTY29yZV9kVEFHID0gZ2V0SW5zdWxhdGlvblNjb3JlKGNociwgY2VudGVyLCBpbnNTY29yZS5kVEFHKSxcbiAgICAgICAgICAgICAgICBpbnNTY29yZV9BNDg1ID0gZ2V0SW5zdWxhdGlvblNjb3JlKGNociwgY2VudGVyLCBpbnNTY29yZS5BNDg1KSlcblxudGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZmlsdGVyKCFpZl9hbnkoZXZlcnl0aGluZygpLCBpcy5uYSkpXG5cbnRhZF9ib3VuZGFyeSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRhZF9ib3VuZGFyeSRpbnNTY29yZV9ETVNPLCB0YWRfYm91bmRhcnkkaW5zU2NvcmVfZFRBRywgbiA9IDEwMClcbnRhZF9ib3VuZGFyeSA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nZ3Bsb3QodGFkX2JvdW5kYXJ5LCBhZXMoeCA9IGluc1Njb3JlX0RNU08sIHkgPSBpbnNTY29yZV9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArIGNvb3JkX2ZpeGVkKCkgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsgdGhlbWVfYncoKVxuXG5cblxudGFkX2JvdW5kYXJ5JGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGFkX2JvdW5kYXJ5JGluc1Njb3JlX0RNU08sIHRhZF9ib3VuZGFyeSRpbnNTY29yZV9BNDg1LCBuID0gMTAwKVxudGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmdncGxvdCh0YWRfYm91bmRhcnksIGFlcyh4ID0gaW5zU2NvcmVfRE1TTywgeSA9IGluc1Njb3JlX0E0ODUsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsgY29vcmRfZml4ZWQoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKyB0aGVtZV9idygpXG5cblxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
name <- \chromo_cons_annoHierarchy\
consensus.loop.anno.tb <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import insulation score calculated with python
resultDir <- here(\../../result\)
insScore.DMSO <- fread(here(resultDir, \TAD\, \insulationScore_25kb_G1DMSO.tsv\)) %>% 
  dplyr::select(c(\chrom\, \start\, \end\, \log2_insulation_score_125000\)) %>%
  dplyr::mutate(binID = paste(chrom, start, end, sep = \_\))
colnames(insScore.DMSO) <- c(\chrom\, \start\, \end\, \insulationScore\, \binID\)
insScore.dTAG <- fread(here(resultDir, \TAD\, \insulationScore_25kb_G1dTAG.tsv\)) %>% 
  dplyr::select(c(\chrom\, \start\, \end\, \log2_insulation_score_125000\)) %>%
  dplyr::mutate(binID = paste(chrom, start, end, sep = \_\))
colnames(insScore.dTAG) <- c(\chrom\, \start\, \end\, \insulationScore\, \binID\)
insScore.A485 <- fread(here(resultDir, \TAD\, \insulationScore_25kb_G1A485.tsv\)) %>% 
  dplyr::select(c(\chrom\, \start\, \end\, \log2_insulation_score_125000\)) %>%
  dplyr::mutate(binID = paste(chrom, start, end, sep = \_\))
colnames(insScore.A485) <- c(\chrom\, \start\, \end\, \insulationScore\, \binID\)

getInsulationScore <- function(chr, coordinate, insScore.tb){
  temp.tb <- insScore.tb %>% dplyr::filter(chrom == chr, start < coordinate, end > coordinate)
  out <- temp.tb$insulationScore
  if(length(out) < 1){
    return(NA)
  }else{
    return(temp.tb$insulationScore)
  }
}

# Importing TAD boundaries
tad_boundary <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_boundaries_G1DMSO.bed\))
colnames(tad_boundary) <- c(\chr\, \start\, \end\)
tad_boundary <- tad_boundary %>% rowwise() %>%
  dplyr::mutate(tad_id = paste(chr, start, end, sep = \_\),
                center = (start + end)/2,
                insScore_DMSO = getInsulationScore(chr, center, insScore.DMSO),
                insScore_dTAG = getInsulationScore(chr, center, insScore.dTAG),
                insScore_A485 = getInsulationScore(chr, center, insScore.A485))

tad_boundary <- tad_boundary %>% filter(!if_any(everything(), is.na))

tad_boundary$density <- get_density(tad_boundary$insScore_DMSO, tad_boundary$insScore_dTAG, n = 100)
tad_boundary <- tad_boundary %>% dplyr::arrange(density)
ggplot(tad_boundary, aes(x = insScore_DMSO, y = insScore_dTAG, color = density)) + 
  geom_point(show.legend = FALSE) + 
  scale_color_viridis() + coord_fixed() +
  geom_abline(slope = 1, intercept = 0) + theme_bw()



tad_boundary$density <- get_density(tad_boundary$insScore_DMSO, tad_boundary$insScore_A485, n = 100)
tad_boundary <- tad_boundary %>% dplyr::arrange(density)
ggplot(tad_boundary, aes(x = insScore_DMSO, y = insScore_A485, color = density)) + 
  geom_point(show.legend = FALSE) + 
  scale_color_viridis() + coord_fixed() +
  geom_abline(slope = 1, intercept = 0) + theme_bw()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Checking TAD average log2FC

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSUVsdGNHOXlkR2x1WnlCa2FXWm1aWEpsYm5ScFlXd2djbVZuZFd4aGRHOXllU0JzYjI5d2MxeHVYRzVzYjI5d0xuVndJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZaRlJCUjNaelJFMVRUMTlWVUY5a2FXWm1NQzR5TG1KbFpIQmxYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGd2lWVkF2VGs5Y0lpbGNibU52Ykc1aGJXVnpLR3h2YjNBdWRYQXBJRHd0SUdNb1hDSmphSEl4WENJc0lGd2ljM1JoY25ReFhDSXNJRndpWlc1a01Wd2lMQ0JjSW1Ob2NqSmNJaXdnWENKemRHRnlkREpjSWl3Z1hDSmxibVF5WENJc0lGd2laM0p2ZFhCY0lpbGNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pWOWtWRUZIZG5ORVRWTlBYMDVQWDJScFptWXdMakl1WW1Wa2NHVmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHZHliM1Z3SUQwZ1hDSlZVQzlPVDF3aUtWeHVZMjlzYm1GdFpYTW9iRzl2Y0M1dWJ5a2dQQzBnWXloY0ltTm9jakZjSWl3Z1hDSnpkR0Z5ZERGY0lpd2dYQ0psYm1ReFhDSXNJRndpWTJoeU1sd2lMQ0JjSW5OMFlYSjBNbHdpTENCY0ltVnVaREpjSWl3Z1hDSm5jbTkxY0Z3aUtWeHViRzl2Y0M1a2IzZHVJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZaRlJCUjNaelJFMVRUMTlFVDFkT1gyUnBabVl3TGpJdVltVmtjR1ZjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdYQ0pFVDFkT1hDSXBYRzVqYjJ4dVlXMWxjeWhzYjI5d0xtUnZkMjRwSUR3dElHTW9YQ0pqYUhJeFhDSXNJRndpYzNSaGNuUXhYQ0lzSUZ3aVpXNWtNVndpTENCY0ltTm9jakpjSWl3Z1hDSnpkR0Z5ZERKY0lpd2dYQ0psYm1ReVhDSXNJRndpWjNKdmRYQmNJaWxjYmx4dWJHOXZjSE1nUEMwZ1ltbHVaRjl5YjNkektHSnBibVJmY205M2N5aHNiMjl3TG5Wd0xDQnNiMjl3TG01dktTd2diRzl2Y0M1a2IzZHVLVnh1WEc0akl5TWdTVzF3YjNKMGFXNW5JRlJCUkNCaWIzVnVaR0Z5ZVZ4dWRHRmtYMkp2ZFc1a1lYSjVJRHd0SUdaeVpXRmtLR2hsY21Vb1hDSXVMaTh1TGk5eVpYTjFiSFF2VkVGRVhDSXNJRndpVkVGRVh6STFhMkpmTVRJMWEySmZiM1J6ZFY5aWIzVnVaR0Z5YVdWelgwY3hSRTFUVHk1aVpXUmNJaWtwWEc1amIyeHVZVzFsY3loMFlXUmZZbTkxYm1SaGNua3BJRHd0SUdNb1hDSmphSEpjSWl3Z1hDSnpkR0Z5ZEZ3aUxDQmNJbVZ1WkZ3aUtWeHVkR0ZrWDJKdmRXNWtZWEo1SUR3dElIUmhaRjlpYjNWdVpHRnllU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVdSZmFXUWdQU0J3WVhOMFpTaGphSElzSUhOMFlYSjBMQ0JsYm1Rc0lITmxjQ0E5SUZ3aVgxd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzUmhjblFnUFNCemRHRnlkQ0F0TVRjMU1EQXdMeklzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnVaQ0E5SUdWdVpDQXJJREUzTlRBd01DOHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCalpXNTBaWElnUFNBb2MzUmhjblFnS3lCbGJtUXBMeklwWEc0akl5TWdSblZ1WTNScGIyNXpYRzVqYUdWamEwSnZkVzVrWVhKNVEzSnZjM01nUEMwZ1puVnVZM1JwYjI0b1kyaHliMjB4TENCemRHRnlkREVzSUdWdVpESXNJSFJoWkY5aWIzVnVaR0Z5ZVNsN1hHNGdJSFJsYlhBZ1BDMGdkR0ZrWDJKdmRXNWtZWEo1SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dOb2NpQTlQU0JqYUhKdmJURXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpaVzUwWlhJZ1BpQnpkR0Z5ZERFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCalpXNTBaWElnUENCbGJtUXlLVnh1SUNCeVpYUjFjbTRvYkdWdVozUm9LSFJsYlhBa1kyVnVkR1Z5S1NsY2JuMWNibHh1SXlNaklFTm9aV05ySUc5MlpYSnNZWEJjYm14dmIzQnpJRHd0SUd4dmIzQnpJQ1UrSlNCeWIzZDNhWE5sS0NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9ZbTkxYm1SaGNubERjbTl6Y3lBOUlHTm9aV05yUW05MWJtUmhjbmxEY205emN5aGphSEl4TENCemRHRnlkREVzSUdWdVpESXNJSFJoWkY5aWIzVnVaR0Z5ZVNrcFhHNWNiaU1qSXlCUWJHOTBkR2x1WjF4dWMzVnRiV0Z5ZVY5a1lYUmhJRHd0SUd4dmIzQnpJQ1UrSlZ4dUlDQm5jbTkxY0Y5aWVTaG5jbTkxY0NrZ0pUNGxYRzRnSUhOMWJXMWhjbWx6WlNod1pYSmpaVzUwWVdkbElEMGdiV1ZoYmloaWIzVnVaR0Z5ZVVOeWIzTnpJRDRnTUNrZ0tpQXhNREFwWEc1Y2JuTjFiVzFoY25sZlpHRjBZU1JuY205MWNDQThMU0JtWVdOMGIzSW9jM1Z0YldGeWVWOWtZWFJoSkdkeWIzVndMQ0JzWlhabGJITWdQU0JqS0Z3aVZWQXZUazljSWl3Z1hDSkVUMWRPWENJcEtWeHVYRzV3SUR3dElHZG5jR3h2ZENoemRXMXRZWEo1WDJSaGRHRXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0J3WlhKalpXNTBZV2RsS1NrZ0sxeHVJQ0JuWlc5dFgySmhjaWh6ZEdGMElEMGdYQ0pwWkdWdWRHbDBlVndpTENCbWFXeHNJRDBnWkdGeWEyVnVLSE4wY205dVoxOW5jbVZsYml3Z1lXMXZkVzUwSUQwZ01DNHlLU2tnSzF4dUlDQnNZV0p6S0hrZ1BTQmNJaVVnYjJZZ2JHOXZjSE1nWTNKdmMzTnBibWNnVkVGRUlHSnZkVzVrWVhKNVhDSXNJSGdnUFNCT1ZVeE1LU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklIbHNhVzBvTUN3Z01UQXdLU0FyWEc0Z0lIUm9aVzFsS0Z4dUlDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUNBZ0lDQWdJeUJTYjNSaGRHVWdlQzFoZUdseklHeGhZbVZzY3lBME5TQmtaV2R5WldWelhHNGdJQ0FnSUNCb2FuVnpkQ0E5SURFc0lDQWdJQ0FnSUNNZ1FXUnFkWE4wSUdodmNtbDZiMjUwWVd3Z2FuVnpkR2xtYVdOaGRHbHZibHh1SUNBZ0lDQWdkbXAxYzNRZ1BTQXhJQ0FnSUNBZ0lDQWpJRUZrYW5WemRDQjJaWEowYVdOaGJDQnFkWE4wYVdacFkyRjBhVzl1WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNJblJ5WVc1emNHRnlaVzUwWENJcExGeHVJQ0FwWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbUp2ZFc1a1lYSjVRM0p2YzNOU1lYUnBiMXdpS1Z4dWQybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtERXBLbTF0Vkc5SmJtTm9YRzVvWldsbmFIUWdQQzBnY0dGdVpXeFRhWHBsS0RFdU5Ta3FiVzFVYjBsdVkyaGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG4jIyMgSW1wb3J0aW5nIGRpZmZlcmVudGlhbCByZWd1bGF0b3J5IGxvb3BzXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxVUC9OT1xcKVxuY29sbmFtZXMobG9vcC51cCkgPC0gYyhcXGNocjFcXCwgXFxzdGFydDFcXCwgXFxlbmQxXFwsIFxcY2hyMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCwgXFxncm91cFxcKVxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXFVQL05PXFwpXG5jb2xuYW1lcyhsb29wLm5vKSA8LSBjKFxcY2hyMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHIyXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcLCBcXGdyb3VwXFwpXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXERPV05cXClcbmNvbG5hbWVzKGxvb3AuZG93bikgPC0gYyhcXGNocjFcXCwgXFxzdGFydDFcXCwgXFxlbmQxXFwsIFxcY2hyMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCwgXFxncm91cFxcKVxuXG5sb29wcyA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pLCBsb29wLmRvd24pXG5cbiMjIyBJbXBvcnRpbmcgVEFEIGJvdW5kYXJ5XG50YWRfYm91bmRhcnkgPC0gZnJlYWQoaGVyZShcXC4uLy4uL3Jlc3VsdC9UQURcXCwgXFxUQURfMjVrYl8xMjVrYl9vdHN1X2JvdW5kYXJpZXNfRzFETVNPLmJlZFxcKSlcbmNvbG5hbWVzKHRhZF9ib3VuZGFyeSkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG50YWRfYm91bmRhcnkgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6bXV0YXRlKHRhZF9pZCA9IHBhc3RlKGNociwgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0IC0xNzUwMDAvMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gZW5kICsgMTc1MDAwLzIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IChzdGFydCArIGVuZCkvMilcbiMjIyBGdW5jdGlvbnNcbmNoZWNrQm91bmRhcnlDcm9zcyA8LSBmdW5jdGlvbihjaHJvbTEsIHN0YXJ0MSwgZW5kMiwgdGFkX2JvdW5kYXJ5KXtcbiAgdGVtcCA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyID09IGNocm9tMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA+IHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA8IGVuZDIpXG4gIHJldHVybihsZW5ndGgodGVtcCRjZW50ZXIpKVxufVxuXG4jIyMgQ2hlY2sgb3ZlcmxhcFxubG9vcHMgPC0gbG9vcHMgJT4lIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShib3VuZGFyeUNyb3NzID0gY2hlY2tCb3VuZGFyeUNyb3NzKGNocjEsIHN0YXJ0MSwgZW5kMiwgdGFkX2JvdW5kYXJ5KSlcblxuIyMjIFBsb3R0aW5nXG5zdW1tYXJ5X2RhdGEgPC0gbG9vcHMgJT4lXG4gIGdyb3VwX2J5KGdyb3VwKSAlPiVcbiAgc3VtbWFyaXNlKHBlcmNlbnRhZ2UgPSBtZWFuKGJvdW5kYXJ5Q3Jvc3MgPiAwKSAqIDEwMClcblxuc3VtbWFyeV9kYXRhJGdyb3VwIDwtIGZhY3RvcihzdW1tYXJ5X2RhdGEkZ3JvdXAsIGxldmVscyA9IGMoXFxVUC9OT1xcLCBcXERPV05cXCkpXG5cbnAgPC0gZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IHBlcmNlbnRhZ2UpKSArXG4gIGdlb21fYmFyKHN0YXQgPSBcXGlkZW50aXR5XFwsIGZpbGwgPSBkYXJrZW4oc3Ryb25nX2dyZWVuLCBhbW91bnQgPSAwLjIpKSArXG4gIGxhYnMoeSA9IFxcJSBvZiBsb29wcyBjcm9zc2luZyBUQUQgYm91bmRhcnlcXCwgeCA9IE5VTEwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgeWxpbSgwLCAxMDApICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gIClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcYm91bmRhcnlDcm9zc1JhdGlvXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
### Importing differential regulatory loops

loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>%
  dplyr::mutate(group = \UP/NO\)
colnames(loop.up) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\, \group\)
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>%
  dplyr::mutate(group = \UP/NO\)
colnames(loop.no) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\, \group\)
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>%
  dplyr::mutate(group = \DOWN\)
colnames(loop.down) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\, \group\)

loops <- bind_rows(bind_rows(loop.up, loop.no), loop.down)

### Importing TAD boundary
tad_boundary <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_boundaries_G1DMSO.bed\))
colnames(tad_boundary) <- c(\chr\, \start\, \end\)
tad_boundary <- tad_boundary %>% dplyr::mutate(tad_id = paste(chr, start, end, sep = \_\),
                                               start = start -175000/2,
                                               end = end + 175000/2,
                                               center = (start + end)/2)
### Functions
checkBoundaryCross <- function(chrom1, start1, end2, tad_boundary){
  temp <- tad_boundary %>% dplyr::filter(chr == chrom1,
                                 center > start1,
                                 center < end2)
  return(length(temp$center))
}

### Check overlap
loops <- loops %>% rowwise() %>%
  dplyr::mutate(boundaryCross = checkBoundaryCross(chr1, start1, end2, tad_boundary))

### Plotting
summary_data <- loops %>%
  group_by(group) %>%
  summarise(percentage = mean(boundaryCross > 0) * 100)

summary_data$group <- factor(summary_data$group, levels = c(\UP/NO\, \DOWN\))

p <- ggplot(summary_data, aes(x = group, y = percentage)) +
  geom_bar(stat = \identity\, fill = darken(strong_green, amount = 0.2)) +
  labs(y = \% of loops crossing TAD boundary\, x = NULL) +
  theme_classic() + ylim(0, 100) +
  theme(
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
  )

fileName <- paste0(\boundaryCrossRatio\)
width <- panelSize(1)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJRWx0Y0c5eWRHbHVaeUJrYVdabVpYSmxiblJwWVd3Z2NtVm5kV3hoZEc5eWVTQnNiMjl3YzF4dVhHNXNiMjl3TG5Wd0lEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjR1V0Y0dWZlpGUkJSM1p6UkUxVFQxOVZVRjlrYVdabU1DNHlMbUpsWkhCbFhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ4Y1ZWQXZUazljWENsY2JtTnZiRzVoYldWektHeHZiM0F1ZFhBcElEd3RJR01vWEZ4amFISXhYRndzSUZ4Y2MzUmhjblF4WEZ3c0lGeGNaVzVrTVZ4Y0xDQmNYR05vY2pKY1hDd2dYRnh6ZEdGeWRESmNYQ3dnWEZ4bGJtUXlYRndzSUZ4Y1ozSnZkWEJjWENsY2JteHZiM0F1Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5a1ZFRkhkbk5FVFZOUFgwNVBYMlJwWm1Zd0xqSXVZbVZrY0dWY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dkeWIzVndJRDBnWEZ4VlVDOU9UMXhjS1Z4dVkyOXNibUZ0WlhNb2JHOXZjQzV1YnlrZ1BDMGdZeWhjWEdOb2NqRmNYQ3dnWEZ4emRHRnlkREZjWEN3Z1hGeGxibVF4WEZ3c0lGeGNZMmh5TWx4Y0xDQmNYSE4wWVhKME1seGNMQ0JjWEdWdVpESmNYQ3dnWEZ4bmNtOTFjRnhjS1Z4dWJHOXZjQzVrYjNkdUlEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjR1V0Y0dWZlpGUkJSM1p6UkUxVFQxOUVUMWRPWDJScFptWXdMakl1WW1Wa2NHVmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHZHliM1Z3SUQwZ1hGeEVUMWRPWEZ3cFhHNWpiMnh1WVcxbGN5aHNiMjl3TG1SdmQyNHBJRHd0SUdNb1hGeGphSEl4WEZ3c0lGeGNjM1JoY25ReFhGd3NJRnhjWlc1a01WeGNMQ0JjWEdOb2NqSmNYQ3dnWEZ4emRHRnlkREpjWEN3Z1hGeGxibVF5WEZ3c0lGeGNaM0p2ZFhCY1hDbGNibHh1Ykc5dmNITWdQQzBnWW1sdVpGOXliM2R6S0dKcGJtUmZjbTkzY3loc2IyOXdMblZ3TENCc2IyOXdMbTV2S1N3Z2JHOXZjQzVrYjNkdUtWeHVYRzRqSXlNZ1NXMXdiM0owYVc1bklGUkJSQ0JpYjNWdVpHRnllVnh1ZEdGa1gySnZkVzVrWVhKNUlEd3RJR1p5WldGa0tHaGxjbVVvWEZ3dUxpOHVMaTl5WlhOMWJIUXZWRUZFWEZ3c0lGeGNWRUZFWHpJMWEySmZNVEkxYTJKZmIzUnpkVjlpYjNWdVpHRnlhV1Z6WDBjeFJFMVRUeTVpWldSY1hDa3BYRzVqYjJ4dVlXMWxjeWgwWVdSZlltOTFibVJoY25rcElEd3RJR01vWEZ4amFISmNYQ3dnWEZ4emRHRnlkRnhjTENCY1hHVnVaRnhjS1Z4dWRHRmtYMkp2ZFc1a1lYSjVJRHd0SUhSaFpGOWliM1Z1WkdGeWVTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaDBZV1JmYVdRZ1BTQndZWE4wWlNoamFISXNJSE4wWVhKMExDQmxibVFzSUhObGNDQTlJRnhjWDF4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNSaGNuUWdQU0J6ZEdGeWRDQXRNVGMxTURBd0x6SXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWdVpDQTlJR1Z1WkNBcklERTNOVEF3TUM4eUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWlc1MFpYSWdQU0FvYzNSaGNuUWdLeUJsYm1RcEx6SXBYRzRqSXlNZ1JuVnVZM1JwYjI1elhHNWphR1ZqYTBKdmRXNWtZWEo1UTNKdmMzTWdQQzBnWm5WdVkzUnBiMjRvWTJoeWIyMHhMQ0J6ZEdGeWRERXNJR1Z1WkRJc0lIUmhaRjlpYjNWdVpHRnllU2w3WEc0Z0lIUmxiWEFnUEMwZ2RHRmtYMkp2ZFc1a1lYSjVJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR05vY2lBOVBTQmphSEp2YlRFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCalpXNTBaWElnUGlCemRHRnlkREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWlc1MFpYSWdQQ0JsYm1ReUtWeHVJQ0J5WlhSMWNtNG9iR1Z1WjNSb0tIUmxiWEFrWTJWdWRHVnlLU2xjYm4xY2JseHVJeU1qSUVOb1pXTnJJRzkyWlhKc1lYQmNibXh2YjNCeklEd3RJR3h2YjNCeklDVStKU0J5YjNkM2FYTmxLQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ltOTFibVJoY25sRGNtOXpjeUE5SUdOb1pXTnJRbTkxYm1SaGNubERjbTl6Y3loamFISXhMQ0J6ZEdGeWRERXNJR1Z1WkRJc0lIUmhaRjlpYjNWdVpHRnllU2twWEc1Y2JpTWpJeUJRYkc5MGRHbHVaMXh1YzNWdGJXRnllVjlrWVhSaElEd3RJR3h2YjNCeklDVStKVnh1SUNCbmNtOTFjRjlpZVNobmNtOTFjQ2tnSlQ0bFhHNGdJSE4xYlcxaGNtbHpaU2h3WlhKalpXNTBZV2RsSUQwZ2JXVmhiaWhpYjNWdVpHRnllVU55YjNOeklENGdNQ2tnS2lBeE1EQXBYRzVjYm5OMWJXMWhjbmxmWkdGMFlTUm5jbTkxY0NBOExTQm1ZV04wYjNJb2MzVnRiV0Z5ZVY5a1lYUmhKR2R5YjNWd0xDQnNaWFpsYkhNZ1BTQmpLRnhjVlZBdlRrOWNYQ3dnWEZ4RVQxZE9YRndwS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2h6ZFcxdFlYSjVYMlJoZEdFc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQndaWEpqWlc1MFlXZGxLU2tnSzF4dUlDQm5aVzl0WDJKaGNpaHpkR0YwSUQwZ1hGeHBaR1Z1ZEdsMGVWeGNMQ0JtYVd4c0lEMGdaR0Z5YTJWdUtITjBjbTl1WjE5bmNtVmxiaXdnWVcxdmRXNTBJRDBnTUM0eUtTa2dLMXh1SUNCc1lXSnpLSGtnUFNCY1hDVWdiMllnYkc5dmNITWdZM0p2YzNOcGJtY2dWRUZFSUdKdmRXNWtZWEo1WEZ3c0lIZ2dQU0JPVlV4TUtTQXJYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUhsc2FXMG9NQ3dnTVRBd0tTQXJYRzRnSUhSb1pXMWxLRnh1SUNBZ0lHRjRhWE11ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUXVlQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJQ0FnSUNBZ0l5QlNiM1JoZEdVZ2VDMWhlR2x6SUd4aFltVnNjeUEwTlNCa1pXZHlaV1Z6WEc0Z0lDQWdJQ0JvYW5WemRDQTlJREVzSUNBZ0lDQWdJQ01nUVdScWRYTjBJR2h2Y21sNmIyNTBZV3dnYW5WemRHbG1hV05oZEdsdmJseHVJQ0FnSUNBZ2RtcDFjM1FnUFNBeElDQWdJQ0FnSUNBaklFRmthblZ6ZENCMlpYSjBhV05oYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY1hIUnlZVzV6Y0dGeVpXNTBYRndwTEZ4dUlDQXBYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hHSnZkVzVrWVhKNVEzSnZjM05TWVhScGIxeGNLVnh1ZDJsa2RHZ2dQQzBnY0dGdVpXeFRhWHBsS0RFcEttMXRWRzlKYm1Ob1hHNW9aV2xuYUhRZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TlNrcWJXMVViMGx1WTJoY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuIyMjIEltcG9ydGluZyBkaWZmZXJlbnRpYWwgcmVndWxhdG9yeSBsb29wc1xuXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IFxcVVAvTk9cXClcbmNvbG5hbWVzKGxvb3AudXApIDwtIGMoXFxjaHIxXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocjJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcZ3JvdXBcXClcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxVUC9OT1xcKVxuY29sbmFtZXMobG9vcC5ubykgPC0gYyhcXGNocjFcXCwgXFxzdGFydDFcXCwgXFxlbmQxXFwsIFxcY2hyMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCwgXFxncm91cFxcKVxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxET1dOXFwpXG5jb2xuYW1lcyhsb29wLmRvd24pIDwtIGMoXFxjaHIxXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocjJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcZ3JvdXBcXClcblxubG9vcHMgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSwgbG9vcC5kb3duKVxuXG4jIyMgSW1wb3J0aW5nIFRBRCBib3VuZGFyeVxudGFkX2JvdW5kYXJ5IDwtIGZyZWFkKGhlcmUoXFwuLi8uLi9yZXN1bHQvVEFEXFwsIFxcVEFEXzI1a2JfMTI1a2Jfb3RzdV9ib3VuZGFyaWVzX0cxRE1TTy5iZWRcXCkpXG5jb2xuYW1lcyh0YWRfYm91bmRhcnkpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxudGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6Om11dGF0ZSh0YWRfaWQgPSBwYXN0ZShjaHIsIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBzdGFydCAtMTc1MDAwLzIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGVuZCArIDE3NTAwMC8yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSAoc3RhcnQgKyBlbmQpLzIpXG4jIyMgRnVuY3Rpb25zXG5jaGVja0JvdW5kYXJ5Q3Jvc3MgPC0gZnVuY3Rpb24oY2hyb20xLCBzdGFydDEsIGVuZDIsIHRhZF9ib3VuZGFyeSl7XG4gIHRlbXAgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPiBzdGFydDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPCBlbmQyKVxuICByZXR1cm4obGVuZ3RoKHRlbXAkY2VudGVyKSlcbn1cblxuIyMjIENoZWNrIG92ZXJsYXBcbmxvb3BzIDwtIGxvb3BzICU+JSByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoYm91bmRhcnlDcm9zcyA9IGNoZWNrQm91bmRhcnlDcm9zcyhjaHIxLCBzdGFydDEsIGVuZDIsIHRhZF9ib3VuZGFyeSkpXG5cbiMjIyBQbG90dGluZ1xuc3VtbWFyeV9kYXRhIDwtIGxvb3BzICU+JVxuICBncm91cF9ieShncm91cCkgJT4lXG4gIHN1bW1hcmlzZShwZXJjZW50YWdlID0gbWVhbihib3VuZGFyeUNyb3NzID4gMCkgKiAxMDApXG5cbnN1bW1hcnlfZGF0YSRncm91cCA8LSBmYWN0b3Ioc3VtbWFyeV9kYXRhJGdyb3VwLCBsZXZlbHMgPSBjKFxcVVAvTk9cXCwgXFxET1dOXFwpKVxuXG5wIDwtIGdncGxvdChzdW1tYXJ5X2RhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBwZXJjZW50YWdlKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBmaWxsID0gZGFya2VuKHN0cm9uZ19ncmVlbiwgYW1vdW50ID0gMC4yKSkgK1xuICBsYWJzKHkgPSBcXCUgb2YgbG9vcHMgY3Jvc3NpbmcgVEFEIGJvdW5kYXJ5XFwsIHggPSBOVUxMKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIHlsaW0oMCwgMTAwKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICApXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGJvdW5kYXJ5Q3Jvc3NSYXRpb1xcKVxud2lkdGggPC0gcGFuZWxTaXplKDEpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIEltcG9ydGluZyBkaWZmZXJlbnRpYWwgcmVndWxhdG9yeSBsb29wc1xuXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IFxcVVAvTk9cXClcbmNvbG5hbWVzKGxvb3AudXApIDwtIGMoXFxjaHIxXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocjJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcZ3JvdXBcXClcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxVUC9OT1xcKVxuY29sbmFtZXMobG9vcC5ubykgPC0gYyhcXGNocjFcXCwgXFxzdGFydDFcXCwgXFxlbmQxXFwsIFxcY2hyMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCwgXFxncm91cFxcKVxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxET1dOXFwpXG5jb2xuYW1lcyhsb29wLmRvd24pIDwtIGMoXFxjaHIxXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocjJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcZ3JvdXBcXClcblxubG9vcHMgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSwgbG9vcC5kb3duKVxuXG4jIyMgSW1wb3J0aW5nIFRBRCBib3VuZGFyeVxudGFkX2JvdW5kYXJ5IDwtIGZyZWFkKGhlcmUoXFwuLi8uLi9yZXN1bHQvVEFEXFwsIFxcVEFEXzI1a2JfMTI1a2Jfb3RzdV9ib3VuZGFyaWVzX0cxRE1TTy5iZWRcXCkpXG5jb2xuYW1lcyh0YWRfYm91bmRhcnkpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxudGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6Om11dGF0ZSh0YWRfaWQgPSBwYXN0ZShjaHIsIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBzdGFydCAtMTc1MDAwLzIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGVuZCArIDE3NTAwMC8yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSAoc3RhcnQgKyBlbmQpLzIpXG4jIyMgRnVuY3Rpb25zXG5jaGVja0JvdW5kYXJ5Q3Jvc3MgPC0gZnVuY3Rpb24oY2hyb20xLCBzdGFydDEsIGVuZDIsIHRhZF9ib3VuZGFyeSl7XG4gIHRlbXAgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPiBzdGFydDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPCBlbmQyKVxuICByZXR1cm4obGVuZ3RoKHRlbXAkY2VudGVyKSlcbn1cblxuIyMjIENoZWNrIG92ZXJsYXBcbmxvb3BzIDwtIGxvb3BzICU+JSByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoYm91bmRhcnlDcm9zcyA9IGNoZWNrQm91bmRhcnlDcm9zcyhjaHIxLCBzdGFydDEsIGVuZDIsIHRhZF9ib3VuZGFyeSkpXG5cbiMjIyBQbG90dGluZ1xuc3VtbWFyeV9kYXRhIDwtIGxvb3BzICU+JVxuICBncm91cF9ieShncm91cCkgJT4lXG4gIHN1bW1hcmlzZShwZXJjZW50YWdlID0gbWVhbihib3VuZGFyeUNyb3NzID4gMCkgKiAxMDApXG5cbnN1bW1hcnlfZGF0YSRncm91cCA8LSBmYWN0b3Ioc3VtbWFyeV9kYXRhJGdyb3VwLCBsZXZlbHMgPSBjKFxcVVAvTk9cXCwgXFxET1dOXFwpKVxuXG5wIDwtIGdncGxvdChzdW1tYXJ5X2RhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBwZXJjZW50YWdlKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBmaWxsID0gZGFya2VuKHN0cm9uZ19ncmVlbiwgYW1vdW50ID0gMC4yKSkgK1xuICBsYWJzKHkgPSBcXCUgb2YgbG9vcHMgY3Jvc3NpbmcgVEFEIGJvdW5kYXJ5XFwsIHggPSBOVUxMKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIHlsaW0oMCwgMTAwKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICApXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGJvdW5kYXJ5Q3Jvc3NSYXRpb1xcKVxud2lkdGggPC0gcGFuZWxTaXplKDEpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
### Importing differential regulatory loops

loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>%
  dplyr::mutate(group = \UP/NO\)
colnames(loop.up) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\, \group\)
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>%
  dplyr::mutate(group = \UP/NO\)
colnames(loop.no) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\, \group\)
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>%
  dplyr::mutate(group = \DOWN\)
colnames(loop.down) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\, \group\)

loops <- bind_rows(bind_rows(loop.up, loop.no), loop.down)

### Importing TAD boundary
tad_boundary <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_boundaries_G1DMSO.bed\))
colnames(tad_boundary) <- c(\chr\, \start\, \end\)
tad_boundary <- tad_boundary %>% dplyr::mutate(tad_id = paste(chr, start, end, sep = \_\),
                                               start = start -175000/2,
                                               end = end + 175000/2,
                                               center = (start + end)/2)
### Functions
checkBoundaryCross <- function(chrom1, start1, end2, tad_boundary){
  temp <- tad_boundary %>% dplyr::filter(chr == chrom1,
                                 center > start1,
                                 center < end2)
  return(length(temp$center))
}

### Check overlap
loops <- loops %>% rowwise() %>%
  dplyr::mutate(boundaryCross = checkBoundaryCross(chr1, start1, end2, tad_boundary))

### Plotting
summary_data <- loops %>%
  group_by(group) %>%
  summarise(percentage = mean(boundaryCross > 0) * 100)

summary_data$group <- factor(summary_data$group, levels = c(\UP/NO\, \DOWN\))

p <- ggplot(summary_data, aes(x = group, y = percentage)) +
  geom_bar(stat = \identity\, fill = darken(strong_green, amount = 0.2)) +
  labs(y = \% of loops crossing TAD boundary\, x = NULL) +
  theme_classic() + ylim(0, 100) +
  theme(
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
  )

fileName <- paste0(\boundaryCrossRatio\)
width <- panelSize(1)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## [2.18] Comparing TAD insulation score across samples
Checking how insulation score changes by treatment at DMSO TAD boundaries

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSUVsdGNHOXlkR2x1WnlCa2FXWm1aWEpsYm5ScFlXd2djbVZuZFd4aGRHOXllU0JzYjI5d2MxeHViRzl2Y0M1MWNDQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbFgwRTBPRFYyYzBSTlUwOWZWVkJmWkdsbVpqQXVNaTVpWldSd1pWd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCY0luVndYQ0lwWEc1amIyeHVZVzFsY3loc2IyOXdMblZ3S1NBOExTQmpLRndpWTJoeU1Wd2lMQ0JjSW5OMFlYSjBNVndpTENCY0ltVnVaREZjSWl3Z1hDSmphSEl5WENJc0lGd2ljM1JoY25ReVhDSXNJRndpWlc1a01sd2lMQ0JjSW1keWIzVndYQ0lwWEc1c2IyOXdMbTV2SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZmNHVXRjR1ZmUVRRNE5YWnpSRTFUVDE5T1QxOWthV1ptTUM0eUxtSmxaSEJsWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRndpYm05Y0lpbGNibU52Ykc1aGJXVnpLR3h2YjNBdWJtOHBJRHd0SUdNb1hDSmphSEl4WENJc0lGd2ljM1JoY25ReFhDSXNJRndpWlc1a01Wd2lMQ0JjSW1Ob2NqSmNJaXdnWENKemRHRnlkREpjSWl3Z1hDSmxibVF5WENJc0lGd2laM0p2ZFhCY0lpbGNibXh2YjNBdVpHOTNiaUE4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKamFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNCbExYQmxYMEUwT0RWMmMwUk5VMDlmUkU5WFRsOWthV1ptTUM0eUxtSmxaSEJsWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRndpWkc5M2Jsd2lLVnh1WTI5c2JtRnRaWE1vYkc5dmNDNWtiM2R1S1NBOExTQmpLRndpWTJoeU1Wd2lMQ0JjSW5OMFlYSjBNVndpTENCY0ltVnVaREZjSWl3Z1hDSmphSEl5WENJc0lGd2ljM1JoY25ReVhDSXNJRndpWlc1a01sd2lMQ0JjSW1keWIzVndYQ0lwWEc1Y2JteHZiM0J6SUR3dElHSnBibVJmY205M2N5aGlhVzVrWDNKdmQzTW9iRzl2Y0M1MWNDd2diRzl2Y0M1dWJ5a3NJR3h2YjNBdVpHOTNiaWxjYmx4dUl5TWpJRWx0Y0c5eWRHbHVaeUJVUVVRZ1ltOTFibVJoY25sY2JuUmhaRjlpYjNWdVpHRnllU0E4TFNCbWNtVmhaQ2hvWlhKbEtGd2lMaTR2TGk0dmNtVnpkV3gwTDFSQlJGd2lMQ0JjSWxSQlJGOHlOV3RpWHpFeU5XdGlYMjkwYzNWZlltOTFibVJoY21sbGMxOUhNVVJOVTA4dVltVmtYQ0lwS1Z4dVkyOXNibUZ0WlhNb2RHRmtYMkp2ZFc1a1lYSjVLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNiblJoWkY5aWIzVnVaR0Z5ZVNBOExTQjBZV1JmWW05MWJtUmhjbmtnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvZEdGa1gybGtJRDBnY0dGemRHVW9ZMmh5TENCemRHRnlkQ3dnWlc1a0xDQnpaWEFnUFNCY0lsOWNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITjBZWEowSUQwZ2MzUmhjblFnTFRFM05UQXdNQzh5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxibVFnUFNCbGJtUWdLeUF4TnpVd01EQXZNaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyVnVkR1Z5SUQwZ0tITjBZWEowSUNzZ1pXNWtLUzh5S1Z4dUl5TWpJRVoxYm1OMGFXOXVjMXh1WTJobFkydENiM1Z1WkdGeWVVTnliM056SUR3dElHWjFibU4wYVc5dUtHTm9jbTl0TVN3Z2MzUmhjblF4TENCbGJtUXlMQ0IwWVdSZlltOTFibVJoY25rcGUxeHVJQ0IwWlcxd0lEd3RJSFJoWkY5aWIzVnVaR0Z5ZVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loamFISWdQVDBnWTJoeWIyMHhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMlZ1ZEdWeUlENGdjM1JoY25ReExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyVnVkR1Z5SUR3Z1pXNWtNaWxjYmlBZ2NtVjBkWEp1S0d4bGJtZDBhQ2gwWlcxd0pHTmxiblJsY2lrcFhHNTlYRzVjYmlNakl5QkRhR1ZqYXlCdmRtVnliR0Z3WEc1c2IyOXdjeUE4TFNCc2IyOXdjeUFsUGlVZ2NtOTNkMmx6WlNncElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR0p2ZFc1a1lYSjVRM0p2YzNNZ1BTQmphR1ZqYTBKdmRXNWtZWEo1UTNKdmMzTW9ZMmh5TVN3Z2MzUmhjblF4TENCbGJtUXlMQ0IwWVdSZlltOTFibVJoY25rcEtWeHVYRzRqSXlNZ1VHeHZkSFJwYm1kY2JuTjFiVzFoY25sZlpHRjBZU0E4TFNCc2IyOXdjeUFsUGlWY2JpQWdaM0p2ZFhCZllua29aM0p2ZFhBcElDVStKVnh1SUNCemRXMXRZWEpwYzJVb2NHVnlZMlZ1ZEdGblpTQTlJRzFsWVc0b1ltOTFibVJoY25sRGNtOXpjeUErSURBcElDb2dNVEF3S1Z4dVhHNWNibkFnUEMwZ1oyZHdiRzkwS0hOMWJXMWhjbmxmWkdGMFlTd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJSEJsY21ObGJuUmhaMlVwS1NBclhHNGdJR2RsYjIxZlltRnlLSE4wWVhRZ1BTQmNJbWxrWlc1MGFYUjVYQ0lzSUdacGJHd2dQU0JjSW5OcmVXSnNkV1ZjSWlrZ0sxeHVJQ0JzWVdKektIUnBkR3hsSUQwZ1hDSlFaWEpqWlc1MFlXZGxJRzltSUZKdmQzTWdkMmwwYUNCaWIzVnVaR0Z5ZVVOeWIzTnpJRDRnTUNCd1pYSWdSM0p2ZFhCY0lpeGNiaUFnSUNBZ0lDQjRJRDBnWENKSGNtOTFjRndpTEZ4dUlDQWdJQ0FnSUhrZ1BTQmNJbEJsY21ObGJuUmhaMlZjSWlrZ0sxeHVJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUI1YkdsdEtEQXNJREV3TUNsY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpWW05MWJtUmhjbmxEY205emMxSmhkR2x2WDBFME9EVmNJaWxjYm1obGFXZG9kQ0E4TFNBelhHNTNhV1IwYUNBOExTQXpYRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuIyMjIEltcG9ydGluZyBkaWZmZXJlbnRpYWwgcmVndWxhdG9yeSBsb29wc1xubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHVwXFwpXG5jb2xuYW1lcyhsb29wLnVwKSA8LSBjKFxcY2hyMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHIyXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcLCBcXGdyb3VwXFwpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IFxcbm9cXClcbmNvbG5hbWVzKGxvb3Aubm8pIDwtIGMoXFxjaHIxXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocjJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcZ3JvdXBcXClcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IFxcZG93blxcKVxuY29sbmFtZXMobG9vcC5kb3duKSA8LSBjKFxcY2hyMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHIyXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcLCBcXGdyb3VwXFwpXG5cbmxvb3BzIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubyksIGxvb3AuZG93bilcblxuIyMjIEltcG9ydGluZyBUQUQgYm91bmRhcnlcbnRhZF9ib3VuZGFyeSA8LSBmcmVhZChoZXJlKFxcLi4vLi4vcmVzdWx0L1RBRFxcLCBcXFRBRF8yNWtiXzEyNWtiX290c3VfYm91bmRhcmllc19HMURNU08uYmVkXFwpKVxuY29sbmFtZXModGFkX2JvdW5kYXJ5KSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnRhZF9ib3VuZGFyeSA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjptdXRhdGUodGFkX2lkID0gcGFzdGUoY2hyLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQgLTE3NTAwMC8yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBlbmQgKyAxNzUwMDAvMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKVxuIyMjIEZ1bmN0aW9uc1xuY2hlY2tCb3VuZGFyeUNyb3NzIDwtIGZ1bmN0aW9uKGNocm9tMSwgc3RhcnQxLCBlbmQyLCB0YWRfYm91bmRhcnkpe1xuICB0ZW1wIDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6OmZpbHRlcihjaHIgPT0gY2hyb20xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID4gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyIDwgZW5kMilcbiAgcmV0dXJuKGxlbmd0aCh0ZW1wJGNlbnRlcikpXG59XG5cbiMjIyBDaGVjayBvdmVybGFwXG5sb29wcyA8LSBsb29wcyAlPiUgcm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKGJvdW5kYXJ5Q3Jvc3MgPSBjaGVja0JvdW5kYXJ5Q3Jvc3MoY2hyMSwgc3RhcnQxLCBlbmQyLCB0YWRfYm91bmRhcnkpKVxuXG4jIyMgUGxvdHRpbmdcbnN1bW1hcnlfZGF0YSA8LSBsb29wcyAlPiVcbiAgZ3JvdXBfYnkoZ3JvdXApICU+JVxuICBzdW1tYXJpc2UocGVyY2VudGFnZSA9IG1lYW4oYm91bmRhcnlDcm9zcyA+IDApICogMTAwKVxuXG5cbnAgPC0gZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IHBlcmNlbnRhZ2UpKSArXG4gIGdlb21fYmFyKHN0YXQgPSBcXGlkZW50aXR5XFwsIGZpbGwgPSBcXHNreWJsdWVcXCkgK1xuICBsYWJzKHRpdGxlID0gXFxQZXJjZW50YWdlIG9mIFJvd3Mgd2l0aCBib3VuZGFyeUNyb3NzID4gMCBwZXIgR3JvdXBcXCxcbiAgICAgICB4ID0gXFxHcm91cFxcLFxuICAgICAgIHkgPSBcXFBlcmNlbnRhZ2VcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyB5bGltKDAsIDEwMClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcYm91bmRhcnlDcm9zc1JhdGlvX0E0ODVcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
### Importing differential regulatory loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.bedpe\)) %>%
  dplyr::mutate(group = \up\)
colnames(loop.up) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\, \group\)
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.bedpe\)) %>%
  dplyr::mutate(group = \no\)
colnames(loop.no) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\, \group\)
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.bedpe\)) %>%
  dplyr::mutate(group = \down\)
colnames(loop.down) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\, \group\)

loops <- bind_rows(bind_rows(loop.up, loop.no), loop.down)

### Importing TAD boundary
tad_boundary <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_boundaries_G1DMSO.bed\))
colnames(tad_boundary) <- c(\chr\, \start\, \end\)
tad_boundary <- tad_boundary %>% dplyr::mutate(tad_id = paste(chr, start, end, sep = \_\),
                                               start = start -175000/2,
                                               end = end + 175000/2,
                                               center = (start + end)/2)
### Functions
checkBoundaryCross <- function(chrom1, start1, end2, tad_boundary){
  temp <- tad_boundary %>% dplyr::filter(chr == chrom1,
                                 center > start1,
                                 center < end2)
  return(length(temp$center))
}

### Check overlap
loops <- loops %>% rowwise() %>%
  dplyr::mutate(boundaryCross = checkBoundaryCross(chr1, start1, end2, tad_boundary))

### Plotting
summary_data <- loops %>%
  group_by(group) %>%
  summarise(percentage = mean(boundaryCross > 0) * 100)


p <- ggplot(summary_data, aes(x = group, y = percentage)) +
  geom_bar(stat = \identity\, fill = \skyblue\) +
  labs(title = \Percentage of Rows with boundaryCross > 0 per Group\,
       x = \Group\,
       y = \Percentage\) +
  theme_classic() + ylim(0, 100)

fileName <- paste0(\boundaryCrossRatio_A485\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJRWx0Y0c5eWRHbHVaeUJrYVdabVpYSmxiblJwWVd3Z2NtVm5kV3hoZEc5eWVTQnNiMjl3YzF4dWJHOXZjQzUxY0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDBFME9EVjJjMFJOVTA5ZlZWQmZaR2xtWmpBdU1pNWlaV1J3WlZ4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JjWEhWd1hGd3BYRzVqYjJ4dVlXMWxjeWhzYjI5d0xuVndLU0E4TFNCaktGeGNZMmh5TVZ4Y0xDQmNYSE4wWVhKME1WeGNMQ0JjWEdWdVpERmNYQ3dnWEZ4amFISXlYRndzSUZ4Y2MzUmhjblF5WEZ3c0lGeGNaVzVrTWx4Y0xDQmNYR2R5YjNWd1hGd3BYRzVzYjI5d0xtNXZJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZRVFE0TlhaelJFMVRUMTlPVDE5a2FXWm1NQzR5TG1KbFpIQmxYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGeGNibTljWENsY2JtTnZiRzVoYldWektHeHZiM0F1Ym04cElEd3RJR01vWEZ4amFISXhYRndzSUZ4Y2MzUmhjblF4WEZ3c0lGeGNaVzVrTVZ4Y0xDQmNYR05vY2pKY1hDd2dYRnh6ZEdGeWRESmNYQ3dnWEZ4bGJtUXlYRndzSUZ4Y1ozSnZkWEJjWENsY2JteHZiM0F1Wkc5M2JpQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbFgwRTBPRFYyYzBSTlUwOWZSRTlYVGw5a2FXWm1NQzR5TG1KbFpIQmxYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGeGNaRzkzYmx4Y0tWeHVZMjlzYm1GdFpYTW9iRzl2Y0M1a2IzZHVLU0E4TFNCaktGeGNZMmh5TVZ4Y0xDQmNYSE4wWVhKME1WeGNMQ0JjWEdWdVpERmNYQ3dnWEZ4amFISXlYRndzSUZ4Y2MzUmhjblF5WEZ3c0lGeGNaVzVrTWx4Y0xDQmNYR2R5YjNWd1hGd3BYRzVjYm14dmIzQnpJRHd0SUdKcGJtUmZjbTkzY3loaWFXNWtYM0p2ZDNNb2JHOXZjQzUxY0N3Z2JHOXZjQzV1Ynlrc0lHeHZiM0F1Wkc5M2JpbGNibHh1SXlNaklFbHRjRzl5ZEdsdVp5QlVRVVFnWW05MWJtUmhjbmxjYm5SaFpGOWliM1Z1WkdGeWVTQThMU0JtY21WaFpDaG9aWEpsS0Z4Y0xpNHZMaTR2Y21WemRXeDBMMVJCUkZ4Y0xDQmNYRlJCUkY4eU5XdGlYekV5Tld0aVgyOTBjM1ZmWW05MWJtUmhjbWxsYzE5SE1VUk5VMDh1WW1Wa1hGd3BLVnh1WTI5c2JtRnRaWE1vZEdGa1gySnZkVzVrWVhKNUtTQThMU0JqS0Z4Y1kyaHlYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWENsY2JuUmhaRjlpYjNWdVpHRnllU0E4TFNCMFlXUmZZbTkxYm1SaGNua2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0ZrWDJsa0lEMGdjR0Z6ZEdVb1kyaHlMQ0J6ZEdGeWRDd2daVzVrTENCelpYQWdQU0JjWEY5Y1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOMFlYSjBJRDBnYzNSaGNuUWdMVEUzTlRBd01DOHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJtUWdQU0JsYm1RZ0t5QXhOelV3TURBdk1peGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJWdWRHVnlJRDBnS0hOMFlYSjBJQ3NnWlc1a0tTOHlLVnh1SXlNaklFWjFibU4wYVc5dWMxeHVZMmhsWTJ0Q2IzVnVaR0Z5ZVVOeWIzTnpJRHd0SUdaMWJtTjBhVzl1S0dOb2NtOXRNU3dnYzNSaGNuUXhMQ0JsYm1ReUxDQjBZV1JmWW05MWJtUmhjbmtwZTF4dUlDQjBaVzF3SUR3dElIUmhaRjlpYjNWdVpHRnllU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhqYUhJZ1BUMGdZMmh5YjIweExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyVnVkR1Z5SUQ0Z2MzUmhjblF4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJWdWRHVnlJRHdnWlc1a01pbGNiaUFnY21WMGRYSnVLR3hsYm1kMGFDaDBaVzF3SkdObGJuUmxjaWtwWEc1OVhHNWNiaU1qSXlCRGFHVmpheUJ2ZG1WeWJHRndYRzVzYjI5d2N5QThMU0JzYjI5d2N5QWxQaVVnY205M2QybHpaU2dwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHSnZkVzVrWVhKNVEzSnZjM01nUFNCamFHVmphMEp2ZFc1a1lYSjVRM0p2YzNNb1kyaHlNU3dnYzNSaGNuUXhMQ0JsYm1ReUxDQjBZV1JmWW05MWJtUmhjbmtwS1Z4dVhHNGpJeU1nVUd4dmRIUnBibWRjYm5OMWJXMWhjbmxmWkdGMFlTQThMU0JzYjI5d2N5QWxQaVZjYmlBZ1ozSnZkWEJmWW5rb1ozSnZkWEFwSUNVK0pWeHVJQ0J6ZFcxdFlYSnBjMlVvY0dWeVkyVnVkR0ZuWlNBOUlHMWxZVzRvWW05MWJtUmhjbmxEY205emN5QStJREFwSUNvZ01UQXdLVnh1WEc1Y2JuQWdQQzBnWjJkd2JHOTBLSE4xYlcxaGNubGZaR0YwWVN3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlIQmxjbU5sYm5SaFoyVXBLU0FyWEc0Z0lHZGxiMjFmWW1GeUtITjBZWFFnUFNCY1hHbGtaVzUwYVhSNVhGd3NJR1pwYkd3Z1BTQmNYSE5yZVdKc2RXVmNYQ2tnSzF4dUlDQnNZV0p6S0hScGRHeGxJRDBnWEZ4UVpYSmpaVzUwWVdkbElHOW1JRkp2ZDNNZ2QybDBhQ0JpYjNWdVpHRnllVU55YjNOeklENGdNQ0J3WlhJZ1IzSnZkWEJjWEN4Y2JpQWdJQ0FnSUNCNElEMGdYRnhIY205MWNGeGNMRnh1SUNBZ0lDQWdJSGtnUFNCY1hGQmxjbU5sYm5SaFoyVmNYQ2tnSzF4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QjViR2x0S0RBc0lERXdNQ2xjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNZbTkxYm1SaGNubERjbTl6YzFKaGRHbHZYMEUwT0RWY1hDbGNibWhsYVdkb2RDQThMU0F6WEc1M2FXUjBhQ0E4TFNBelhHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuIyMjIEltcG9ydGluZyBkaWZmZXJlbnRpYWwgcmVndWxhdG9yeSBsb29wc1xubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHVwXFwpXG5jb2xuYW1lcyhsb29wLnVwKSA8LSBjKFxcY2hyMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHIyXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcLCBcXGdyb3VwXFwpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IFxcbm9cXClcbmNvbG5hbWVzKGxvb3Aubm8pIDwtIGMoXFxjaHIxXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocjJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcZ3JvdXBcXClcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IFxcZG93blxcKVxuY29sbmFtZXMobG9vcC5kb3duKSA8LSBjKFxcY2hyMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHIyXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcLCBcXGdyb3VwXFwpXG5cbmxvb3BzIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubyksIGxvb3AuZG93bilcblxuIyMjIEltcG9ydGluZyBUQUQgYm91bmRhcnlcbnRhZF9ib3VuZGFyeSA8LSBmcmVhZChoZXJlKFxcLi4vLi4vcmVzdWx0L1RBRFxcLCBcXFRBRF8yNWtiXzEyNWtiX290c3VfYm91bmRhcmllc19HMURNU08uYmVkXFwpKVxuY29sbmFtZXModGFkX2JvdW5kYXJ5KSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnRhZF9ib3VuZGFyeSA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjptdXRhdGUodGFkX2lkID0gcGFzdGUoY2hyLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQgLTE3NTAwMC8yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBlbmQgKyAxNzUwMDAvMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKVxuIyMjIEZ1bmN0aW9uc1xuY2hlY2tCb3VuZGFyeUNyb3NzIDwtIGZ1bmN0aW9uKGNocm9tMSwgc3RhcnQxLCBlbmQyLCB0YWRfYm91bmRhcnkpe1xuICB0ZW1wIDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6OmZpbHRlcihjaHIgPT0gY2hyb20xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID4gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyIDwgZW5kMilcbiAgcmV0dXJuKGxlbmd0aCh0ZW1wJGNlbnRlcikpXG59XG5cbiMjIyBDaGVjayBvdmVybGFwXG5sb29wcyA8LSBsb29wcyAlPiUgcm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKGJvdW5kYXJ5Q3Jvc3MgPSBjaGVja0JvdW5kYXJ5Q3Jvc3MoY2hyMSwgc3RhcnQxLCBlbmQyLCB0YWRfYm91bmRhcnkpKVxuXG4jIyMgUGxvdHRpbmdcbnN1bW1hcnlfZGF0YSA8LSBsb29wcyAlPiVcbiAgZ3JvdXBfYnkoZ3JvdXApICU+JVxuICBzdW1tYXJpc2UocGVyY2VudGFnZSA9IG1lYW4oYm91bmRhcnlDcm9zcyA+IDApICogMTAwKVxuXG5cbnAgPC0gZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IHBlcmNlbnRhZ2UpKSArXG4gIGdlb21fYmFyKHN0YXQgPSBcXGlkZW50aXR5XFwsIGZpbGwgPSBcXHNreWJsdWVcXCkgK1xuICBsYWJzKHRpdGxlID0gXFxQZXJjZW50YWdlIG9mIFJvd3Mgd2l0aCBib3VuZGFyeUNyb3NzID4gMCBwZXIgR3JvdXBcXCxcbiAgICAgICB4ID0gXFxHcm91cFxcLFxuICAgICAgIHkgPSBcXFBlcmNlbnRhZ2VcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyB5bGltKDAsIDEwMClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcYm91bmRhcnlDcm9zc1JhdGlvX0E0ODVcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIEltcG9ydGluZyBkaWZmZXJlbnRpYWwgcmVndWxhdG9yeSBsb29wc1xubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXHVwXFwpXG5jb2xuYW1lcyhsb29wLnVwKSA8LSBjKFxcY2hyMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHIyXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcLCBcXGdyb3VwXFwpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IFxcbm9cXClcbmNvbG5hbWVzKGxvb3Aubm8pIDwtIGMoXFxjaHIxXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocjJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcZ3JvdXBcXClcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IFxcZG93blxcKVxuY29sbmFtZXMobG9vcC5kb3duKSA8LSBjKFxcY2hyMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHIyXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcLCBcXGdyb3VwXFwpXG5cbmxvb3BzIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubyksIGxvb3AuZG93bilcblxuIyMjIEltcG9ydGluZyBUQUQgYm91bmRhcnlcbnRhZF9ib3VuZGFyeSA8LSBmcmVhZChoZXJlKFxcLi4vLi4vcmVzdWx0L1RBRFxcLCBcXFRBRF8yNWtiXzEyNWtiX290c3VfYm91bmRhcmllc19HMURNU08uYmVkXFwpKVxuY29sbmFtZXModGFkX2JvdW5kYXJ5KSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnRhZF9ib3VuZGFyeSA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjptdXRhdGUodGFkX2lkID0gcGFzdGUoY2hyLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQgLTE3NTAwMC8yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBlbmQgKyAxNzUwMDAvMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKVxuIyMjIEZ1bmN0aW9uc1xuY2hlY2tCb3VuZGFyeUNyb3NzIDwtIGZ1bmN0aW9uKGNocm9tMSwgc3RhcnQxLCBlbmQyLCB0YWRfYm91bmRhcnkpe1xuICB0ZW1wIDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6OmZpbHRlcihjaHIgPT0gY2hyb20xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID4gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyIDwgZW5kMilcbiAgcmV0dXJuKGxlbmd0aCh0ZW1wJGNlbnRlcikpXG59XG5cbiMjIyBDaGVjayBvdmVybGFwXG5sb29wcyA8LSBsb29wcyAlPiUgcm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKGJvdW5kYXJ5Q3Jvc3MgPSBjaGVja0JvdW5kYXJ5Q3Jvc3MoY2hyMSwgc3RhcnQxLCBlbmQyLCB0YWRfYm91bmRhcnkpKVxuXG4jIyMgUGxvdHRpbmdcbnN1bW1hcnlfZGF0YSA8LSBsb29wcyAlPiVcbiAgZ3JvdXBfYnkoZ3JvdXApICU+JVxuICBzdW1tYXJpc2UocGVyY2VudGFnZSA9IG1lYW4oYm91bmRhcnlDcm9zcyA+IDApICogMTAwKVxuXG5cbnAgPC0gZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IHBlcmNlbnRhZ2UpKSArXG4gIGdlb21fYmFyKHN0YXQgPSBcXGlkZW50aXR5XFwsIGZpbGwgPSBcXHNreWJsdWVcXCkgK1xuICBsYWJzKHRpdGxlID0gXFxQZXJjZW50YWdlIG9mIFJvd3Mgd2l0aCBib3VuZGFyeUNyb3NzID4gMCBwZXIgR3JvdXBcXCxcbiAgICAgICB4ID0gXFxHcm91cFxcLFxuICAgICAgIHkgPSBcXFBlcmNlbnRhZ2VcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyB5bGltKDAsIDEwMClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcYm91bmRhcnlDcm9zc1JhdGlvX0E0ODVcXClcbmhlaWdodCA8LSAzXG53aWR0aCA8LSAzXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
### Importing differential regulatory loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.bedpe\)) %>%
  dplyr::mutate(group = \up\)
colnames(loop.up) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\, \group\)
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.bedpe\)) %>%
  dplyr::mutate(group = \no\)
colnames(loop.no) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\, \group\)
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.bedpe\)) %>%
  dplyr::mutate(group = \down\)
colnames(loop.down) <- c(\chr1\, \start1\, \end1\, \chr2\, \start2\, \end2\, \group\)

loops <- bind_rows(bind_rows(loop.up, loop.no), loop.down)

### Importing TAD boundary
tad_boundary <- fread(here(\../../result/TAD\, \TAD_25kb_125kb_otsu_boundaries_G1DMSO.bed\))
colnames(tad_boundary) <- c(\chr\, \start\, \end\)
tad_boundary <- tad_boundary %>% dplyr::mutate(tad_id = paste(chr, start, end, sep = \_\),
                                               start = start -175000/2,
                                               end = end + 175000/2,
                                               center = (start + end)/2)
### Functions
checkBoundaryCross <- function(chrom1, start1, end2, tad_boundary){
  temp <- tad_boundary %>% dplyr::filter(chr == chrom1,
                                 center > start1,
                                 center < end2)
  return(length(temp$center))
}

### Check overlap
loops <- loops %>% rowwise() %>%
  dplyr::mutate(boundaryCross = checkBoundaryCross(chr1, start1, end2, tad_boundary))

### Plotting
summary_data <- loops %>%
  group_by(group) %>%
  summarise(percentage = mean(boundaryCross > 0) * 100)


p <- ggplot(summary_data, aes(x = group, y = percentage)) +
  geom_bar(stat = \identity\, fill = \skyblue\) +
  labs(title = \Percentage of Rows with boundaryCross > 0 per Group\,
       x = \Group\,
       y = \Percentage\) +
  theme_classic() + ylim(0, 100)

fileName <- paste0(\boundaryCrossRatio_A485\)
height <- 3
width <- 3
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## [2.20] Checking how many loops cross the boundary?
Previously, I tried to check the percentage of loops crossing the boundary per group which wasn't fruitful.
This time, try to do this on the differential loops.
#### dTAG

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJNVDBGRVNVNUhJRXhQVEVFZ1JFSmNibXhwWW5KaGNua29YQ0p6YVcxd2JHVkRZV05vWlZ3aUtWeHViR2xpY21GeWVTaGNJa3hQVEVGY0lpbGNibXh2YkdGRVFpQTlJR3h2WVdSU1pXZHBiMjVFUWloY0lpOVdiMngxYldWekwxVkxTa2xPWDFOVFJDOUhaVzV2YldsamMxOHdNMTlCYm1Gc2VYTnBjMTlYYjNKcmFXNW5MM0psWm1WeVpXNWpaUzlNVDB4QlEyOXlaVjlqWVdOb1pXUXZiVzB4TUZ3aUtWeHVYRzRqSUVaVlRrTlVTVTlPVTF4dVpYaDBjbUZqZEVGdVkyaHZjaUE4TFNCbWRXNWpkR2x2Ymloc2IyOXdLWHRjYmlBZ1lXNWphRzl5TVNBOExTQnNiMjl3SUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dNb01Td2dNaXdnTXlrcFhHNGdJR052Ykc1aGJXVnpLR0Z1WTJodmNqRXBJRHd0SUdNb1hDSmphSEpjSWl3Z1hDSnpkR0Z5ZEZ3aUxDQmNJbVZ1WkZ3aUtWeHVJQ0JoYm1Ob2IzSXlJRHd0SUd4dmIzQWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWcwTENBMUxDQTJLU2xjYmlBZ1kyOXNibUZ0WlhNb1lXNWphRzl5TWlrZ1BDMGdZeWhjSW1Ob2Nsd2lMQ0JjSW5OMFlYSjBYQ0lzSUZ3aVpXNWtYQ0lwWEc0Z0lHRnVZMmh2Y25NZ1BDMGdjbVZrZFdObEtHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoaWFXNWtYM0p2ZDNNb1lXNWphRzl5TVN3Z1lXNWphRzl5TWlrcEtWeHVJQ0FnSUhKbGRIVnliaWhoYm1Ob2IzSnpLVnh1ZlZ4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuIyBMT0FESU5HIExPTEEgREJcbmxpYnJhcnkoXFxzaW1wbGVDYWNoZVxcKVxubGlicmFyeShcXExPTEFcXClcbmxvbGFEQiA9IGxvYWRSZWdpb25EQihcXC9Wb2x1bWVzL1VLSklOX1NTRC9HZW5vbWljc18wM19BbmFseXNpc19Xb3JraW5nL3JlZmVyZW5jZS9MT0xBQ29yZV9jYWNoZWQvbW0xMFxcKVxuXG4jIEZVTkNUSU9OU1xuZXh0cmFjdEFuY2hvciA8LSBmdW5jdGlvbihsb29wKXtcbiAgYW5jaG9yMSA8LSBsb29wICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG4gIGNvbG5hbWVzKGFuY2hvcjEpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICBhbmNob3IyIDwtIGxvb3AgJT4lIGRwbHlyOjpzZWxlY3QoYyg0LCA1LCA2KSlcbiAgY29sbmFtZXMoYW5jaG9yMikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIGFuY2hvcnMgPC0gcmVkdWNlKG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShiaW5kX3Jvd3MoYW5jaG9yMSwgYW5jaG9yMikpKVxuICAgIHJldHVybihhbmNob3JzKVxufVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# LOADING LOLA DB
library(\simpleCache\)
library(\LOLA\)
lolaDB = loadRegionDB(\/Volumes/UKJIN_SSD/Genomics_03_Analysis_Working/reference/LOLACore_cached/mm10\)

# FUNCTIONS
extractAnchor <- function(loop){
  anchor1 <- loop %>% dplyr::select(c(1, 2, 3))
  colnames(anchor1) <- c(\chr\, \start\, \end\)
  anchor2 <- loop %>% dplyr::select(c(4, 5, 6))
  colnames(anchor2) <- c(\chr\, \start\, \end\)
  anchors <- reduce(makeGRangesFromDataFrame(bind_rows(anchor1, anchor2)))
    return(anchors)
}



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5Qk1UMEZFU1U1SElFeFBURUVnUkVKY2JteHBZbkpoY25rb1hGeHphVzF3YkdWRFlXTm9aVnhjS1Z4dWJHbGljbUZ5ZVNoY1hFeFBURUZjWENsY2JteHZiR0ZFUWlBOUlHeHZZV1JTWldkcGIyNUVRaWhjWEM5V2IyeDFiV1Z6TDFWTFNrbE9YMU5UUkM5SFpXNXZiV2xqYzE4d00xOUJibUZzZVhOcGMxOVhiM0pyYVc1bkwzSmxabVZ5Wlc1alpTOU1UMHhCUTI5eVpWOWpZV05vWldRdmJXMHhNRnhjS1Z4dVhHNGpJRVpWVGtOVVNVOU9VMXh1WlhoMGNtRmpkRUZ1WTJodmNpQThMU0JtZFc1amRHbHZiaWhzYjI5d0tYdGNiaUFnWVc1amFHOXlNU0E4TFNCc2IyOXdJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR01vTVN3Z01pd2dNeWtwWEc0Z0lHTnZiRzVoYldWektHRnVZMmh2Y2pFcElEd3RJR01vWEZ4amFISmNYQ3dnWEZ4emRHRnlkRnhjTENCY1hHVnVaRnhjS1Z4dUlDQmhibU5vYjNJeUlEd3RJR3h2YjNBZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1l5ZzBMQ0ExTENBMktTbGNiaUFnWTI5c2JtRnRaWE1vWVc1amFHOXlNaWtnUEMwZ1l5aGNYR05vY2x4Y0xDQmNYSE4wWVhKMFhGd3NJRnhjWlc1a1hGd3BYRzRnSUdGdVkyaHZjbk1nUEMwZ2NtVmtkV05sS0cxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2hpYVc1a1gzSnZkM01vWVc1amFHOXlNU3dnWVc1amFHOXlNaWtwS1Z4dUlDQWdJSEpsZEhWeWJpaGhibU5vYjNKektWeHVmVnh1WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuIyBMT0FESU5HIExPTEEgREJcbmxpYnJhcnkoXFxzaW1wbGVDYWNoZVxcKVxubGlicmFyeShcXExPTEFcXClcbmxvbGFEQiA9IGxvYWRSZWdpb25EQihcXC9Wb2x1bWVzL1VLSklOX1NTRC9HZW5vbWljc18wM19BbmFseXNpc19Xb3JraW5nL3JlZmVyZW5jZS9MT0xBQ29yZV9jYWNoZWQvbW0xMFxcKVxuXG4jIEZVTkNUSU9OU1xuZXh0cmFjdEFuY2hvciA8LSBmdW5jdGlvbihsb29wKXtcbiAgYW5jaG9yMSA8LSBsb29wICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG4gIGNvbG5hbWVzKGFuY2hvcjEpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICBhbmNob3IyIDwtIGxvb3AgJT4lIGRwbHlyOjpzZWxlY3QoYyg0LCA1LCA2KSlcbiAgY29sbmFtZXMoYW5jaG9yMikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIGFuY2hvcnMgPC0gcmVkdWNlKG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShiaW5kX3Jvd3MoYW5jaG9yMSwgYW5jaG9yMikpKVxuICAgIHJldHVybihhbmNob3JzKVxufVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBMT0FESU5HIExPTEEgREJcbmxpYnJhcnkoXFxzaW1wbGVDYWNoZVxcKVxubGlicmFyeShcXExPTEFcXClcbmxvbGFEQiA9IGxvYWRSZWdpb25EQihcXC9Wb2x1bWVzL1VLSklOX1NTRC9HZW5vbWljc18wM19BbmFseXNpc19Xb3JraW5nL3JlZmVyZW5jZS9MT0xBQ29yZV9jYWNoZWQvbW0xMFxcKVxuXG4jIEZVTkNUSU9OU1xuZXh0cmFjdEFuY2hvciA8LSBmdW5jdGlvbihsb29wKXtcbiAgYW5jaG9yMSA8LSBsb29wICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG4gIGNvbG5hbWVzKGFuY2hvcjEpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICBhbmNob3IyIDwtIGxvb3AgJT4lIGRwbHlyOjpzZWxlY3QoYyg0LCA1LCA2KSlcbiAgY29sbmFtZXMoYW5jaG9yMikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIGFuY2hvcnMgPC0gcmVkdWNlKG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShiaW5kX3Jvd3MoYW5jaG9yMSwgYW5jaG9yMikpKVxuICAgIHJldHVybihhbmNob3JzKVxufVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
# LOADING LOLA DB
library(\simpleCache\)
library(\LOLA\)
lolaDB = loadRegionDB(\/Volumes/UKJIN_SSD/Genomics_03_Analysis_Working/reference/LOLACore_cached/mm10\)

# FUNCTIONS
extractAnchor <- function(loop){
  anchor1 <- loop %>% dplyr::select(c(1, 2, 3))
  colnames(anchor1) <- c(\chr\, \start\, \end\)
  anchor2 <- loop %>% dplyr::select(c(4, 5, 6))
  colnames(anchor2) <- c(\chr\, \start\, \end\)
  anchors <- reduce(makeGRangesFromDataFrame(bind_rows(anchor1, anchor2)))
    return(anchors)
}

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### A485

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZWFJoWXlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0pIVTAwek1UQTJNalUzWDBGVVFVTmZSVk5EWHpFdVltVmtYQ0lwS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoV01Td2dWaklzSUZZektWeHVZMjlzYm1GdFpYTW9ZWFJoWXlrZ1BDMGdZeWhjSW1Ob2Nsd2lMQ0JjSW5OMFlYSjBYQ0lzSUZ3aVpXNWtYQ0lwWEc1aGRHRmpMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoaGRHRmpLVnh1WEc0aklFeFBRVVJKVGtjZ1RFOVBVRk5jYmlNakl5QkpiWEJ2Y25ScGJtY2daR2xtWm1WeVpXNTBhV0ZzSUhKbFozVnNZWFJ2Y25rZ2JHOXZjSE1nSmlCbGVIUnlZV04wSUdGdVkyaHZjbHh1Ykc5dmNDNWhiR3dnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVM1MGMzWmNJaWtwSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHlJQ1ZwYmlVZ1l5aGNJbEF0VUZ3aUxDQmNJbEF0UlZ3aUxDQmNJa1V0UlZ3aUtTbGNibUZ1WTJodmNpNWhiR3dnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWhiR3dwS1Z4dWIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjaTVoYkd3c0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVlXeHNJRHd0SUhCcGJuUmxjbk5sWTNRb1lXNWphRzl5TG1Gc2JGdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVjYmx4dWJHOXZjQzR4SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZmNHVXRjR1ZmUnpGMmMwRnplVzVqWDJKdmRHaFNaWFJoYVc1bFpDNWlaV1J3WlZ3aUtTbGNibUZ1WTJodmNpNHhJRHd0SUNobGVIUnlZV04wUVc1amFHOXlLR3h2YjNBdU1Ta3BYRzV2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxqRXNJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVNU0E4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k0eFczRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGRMQ0JoZEdGakxtZHlXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1YwcFhHNWNibXh2YjNBdU1pQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbFgwY3hkbk5CYzNsdVkxOUJjM2x1WTFOd1pXTnBabWxqVUdWeWRDNWlaV1J3WlZ3aUtTbGNibUZ1WTJodmNpNHlJRHd0SUNobGVIUnlZV04wUVc1amFHOXlLR3h2YjNBdU1pa3BYRzV2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxqSXNJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVNaUE4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k0eVczRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGRMQ0JoZEdGakxtZHlXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1YwcFhHNWNibXh2YjNBdU15QThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbFgwY3hkbk5CYzNsdVkxOUhNVk53WldOcFptbGpVR1Z5ZEM1aVpXUndaVndpS1NsY2JtRnVZMmh2Y2k0eklEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1TXlrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TGpNc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdU15QThMU0J3YVc1MFpYSnpaV04wS0dGdVkyaHZjaTR6VzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZExDQmhkR0ZqTG1keVczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjBwWEc1Y2JteHZiM0F1TkNBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDBjeGRuTkJjM2x1WTE5aWIzUm9VR1Z5ZEM1aVpXUndaVndpS1NsY2JtRnVZMmh2Y2k0MElEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1TkNrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TGpRc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdU5DQThMU0J3YVc1MFpYSnpaV04wS0dGdVkyaHZjaTQwVzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZExDQmhkR0ZqTG1keVczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjBwWEc1Y2JseHVZVzVqYUc5eWN5QThMU0JzYVhOMEtHRnVZMmh2Y2k0eExDQmhibU5vYjNJdU1pd2dZVzVqYUc5eUxqTXNJR0Z1WTJodmNpNDBLVnh1ZEdKeklEd3RJR3hwYzNRb0tWeHVkR1Z0Y0hNZ1BDMGdiR2x6ZENncFhHNWNiaU1nVUhKdlkyVnpjeUJqYkhWemRHVnljeUJqTVNCMGJ5QmpPRnh1Wm05eUlDaHBJR2x1SURFNk5Da2dlMXh1SUNCY2JpQWdZVzVqYUc5eUlEd3RJR0Z1WTJodmNuTmJXMmxkWFZ4dUlDQWpJRkoxYmlCTVQweEJYRzRnSUhKbGMzVnNkQ0E4TFNCeWRXNU1UMHhCS0dGdVkyaHZjaXdnWVc1amFHOXlMbUZzYkN3Z2JHOXNZVVJDS1Z4dUlDQjBZaUE4TFNCaGMxOTBhV0ppYkdVb2NtVnpkV3gwS1Z4dUlDQmNiaUFnSXlCR2FXeDBaWElnWVc1a0lITjFiVzFoY21sNlpWeHVJQ0IwWWlBOExTQjBZaUFsUGlWY2JpQWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtIUmhjbWRsZENBOUlIUnZkWEJ3WlhJb1lXNTBhV0p2WkhrcEtTQWxQaVZjYmlBZ0lDQm1hV3gwWlhJb2MzUnlYM1J2WDJ4dmQyVnlLR05sYkd4VWVYQmxLU0E5UFNCY0ltVnRZbko1YjI1cFl5QnpkR1Z0SUdObGJHeGNJaWtnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbVpwYkhSbGNpaHhWbUZzZFdVZ1BDQmhiSEJvWVNrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGdJQ0FnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dUlDQmNiaUFnSXlCVGRHOXlaU0IwWWx4dUlDQjBZbk5iVzJsZFhTQThMU0IwWWx4dUlDQmNiaUFnSXlCVFpXeGxZM1FnWVc1a0lISmxibUZ0WlNCdlpHUnpVbUYwYVc5Y2JpQWdkR1Z0Y0NBOExTQjBZaUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJRzlrWkhOU1lYUnBieWxjYmlBZ1kyOXNibUZ0WlhNb2RHVnRjQ2tnUEMwZ1l5aGNJblJoY21kbGRGd2lMQ0J3WVhOMFpUQW9YQ0pQVWw5alhDSXNJR2twS1Z4dUlDQmNiaUFnSXlCVGRHOXlaU0IwWlcxd1hHNGdJSFJsYlhCelcxdHBYVjBnUEMwZ2RHVnRjRnh1ZlZ4dVhHNGpJRTFsY21kbElHRnNiQ0IwWlcxd0lIUmhZbXhsY3lCcGJuUnZJRzl1WlZ4dWRHVnRjQ0E4TFNCU1pXUjFZMlVvWm5WdVkzUnBiMjRvZUN3Z2VTa2dablZzYkY5cWIybHVLSGdzSUhrc0lHSjVJRDBnWENKMFlYSm5aWFJjSWlrc0lIUmxiWEJ6S1NBbFBpVmNiaUFnYlhWMFlYUmxYMkZzYkNoK2NtVndiR0ZqWlY5dVlTZ3VMQ0F4S1NsY2JtTnZiRzVoYldWektIUmxiWEFwSUR3dElHTW9YQ0owWVhKblpYUmNJaXdnWENKaWIzUm9VbVYwWVdsdVpXUmNJaXdnWENKQmMzbHVZMU53WldOcFptbGpVR1Z5ZEhWeVlsd2lMQ0JjSWtjeFUzQmxZMmxtYVdOUVpYSjBkWEppWENJc0lGd2lZbTkwYUZCbGNuUjFjbUpjSWlsY2JtUmhkR0VnUEMwZ2RHVnRjQ0FsUGlVZ1kyOXNkVzF1WDNSdlgzSnZkMjVoYldWektGd2lkR0Z5WjJWMFhDSXBJQ1UrSlNCaGN5NXRZWFJ5YVhnb0tWeHVYRzVzYVdKeVlYSjVLR05wY21Oc2FYcGxLVnh1WTI5c1gyWjFiaUE4TFNCamIyeHZjbEpoYlhBeUtHTW9NU3dnYldGNEtHUmhkR0VwS1N3Z1l5aGNJbmRvYVhSbFhDSXNJRndpY21Wa1hDSXBLVnh1WEc1Y2JpTm1kbWw2WDI1aVkyeDFjM1FvWkdGMFlTd2dhMjFsWVc1ekxDQnRaWFJvYjJRZ1BTQmNJbmR6YzF3aUtWeHVYRzV3SUR3dElFaGxZWFJ0WVhBb1hHNGdJR1JoZEdFc1hHNGdJRzVoYldVZ1BTQmNJazlrWkhNZ1VtRjBhVzljSWl3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5Qk9ZVzFsSUc5bUlIUm9aU0JvWldGMGJXRndJR3hsWjJWdVpGeHVJQ0JqYkhWemRHVnlYMk52YkhWdGJuTWdQU0JHUVV4VFJTd2dJQ0FnSUNBZ0lDQWdJQ0FqSUZKbGJXOTJaU0JqYjJ4MWJXNGdaR1Z1WkhKdlozSmhiVnh1SUNCemFHOTNYM0p2ZDE5a1pXNWtJRDBnUmtGTVUwVXNYRzRnSUdOdmJDQTlJR052YkY5bWRXNHNYRzRnSUdKdmNtUmxjaUE5SUZSU1ZVVmNiaWxjYmx4dVhHNWNibUJnWUNKOSAtLT5cblxuYGBgclxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvclxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSlcbmFuY2hvci5hbGwgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5hbGwpKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5hbGwsIGF0YWMuZ3IpXG5hbmNob3IuYWxsIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cblxubG9vcC4xIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX2JvdGhSZXRhaW5lZC5iZWRwZVxcKSlcbmFuY2hvci4xIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuMSkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLjEsIGF0YWMuZ3IpXG5hbmNob3IuMSA8LSBwaW50ZXJzZWN0KGFuY2hvci4xW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AuMiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19Bc3luY1NwZWNpZmljUGVydC5iZWRwZVxcKSlcbmFuY2hvci4yIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuMikpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLjIsIGF0YWMuZ3IpXG5hbmNob3IuMiA8LSBwaW50ZXJzZWN0KGFuY2hvci4yW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AuMyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19HMVNwZWNpZmljUGVydC5iZWRwZVxcKSlcbmFuY2hvci4zIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuMykpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLjMsIGF0YWMuZ3IpXG5hbmNob3IuMyA8LSBwaW50ZXJzZWN0KGFuY2hvci4zW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AuNCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19ib3RoUGVydC5iZWRwZVxcKSlcbmFuY2hvci40IDwtIChleHRyYWN0QW5jaG9yKGxvb3AuNCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLjQsIGF0YWMuZ3IpXG5hbmNob3IuNCA8LSBwaW50ZXJzZWN0KGFuY2hvci40W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cblxuYW5jaG9ycyA8LSBsaXN0KGFuY2hvci4xLCBhbmNob3IuMiwgYW5jaG9yLjMsIGFuY2hvci40KVxudGJzIDwtIGxpc3QoKVxudGVtcHMgPC0gbGlzdCgpXG5cbiMgUHJvY2VzcyBjbHVzdGVycyBjMSB0byBjOFxuZm9yIChpIGluIDE6NCkge1xuICBcbiAgYW5jaG9yIDwtIGFuY2hvcnNbW2ldXVxuICAjIFJ1biBMT0xBXG4gIHJlc3VsdCA8LSBydW5MT0xBKGFuY2hvciwgYW5jaG9yLmFsbCwgbG9sYURCKVxuICB0YiA8LSBhc190aWJibGUocmVzdWx0KVxuICBcbiAgIyBGaWx0ZXIgYW5kIHN1bW1hcml6ZVxuICB0YiA8LSB0YiAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lXG4gICAgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuICBcbiAgIyBTdG9yZSB0YlxuICB0YnNbW2ldXSA8LSB0YlxuICBcbiAgIyBTZWxlY3QgYW5kIHJlbmFtZSBvZGRzUmF0aW9cbiAgdGVtcCA8LSB0YiAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbiAgY29sbmFtZXModGVtcCkgPC0gYyhcXHRhcmdldFxcLCBwYXN0ZTAoXFxPUl9jXFwsIGkpKVxuICBcbiAgIyBTdG9yZSB0ZW1wXG4gIHRlbXBzW1tpXV0gPC0gdGVtcFxufVxuXG4jIE1lcmdlIGFsbCB0ZW1wIHRhYmxlcyBpbnRvIG9uZVxudGVtcCA8LSBSZWR1Y2UoZnVuY3Rpb24oeCwgeSkgZnVsbF9qb2luKHgsIHksIGJ5ID0gXFx0YXJnZXRcXCksIHRlbXBzKSAlPiVcbiAgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFx0YXJnZXRcXCwgXFxib3RoUmV0YWluZWRcXCwgXFxBc3luY1NwZWNpZmljUGVydHVyYlxcLCBcXEcxU3BlY2lmaWNQZXJ0dXJiXFwsIFxcYm90aFBlcnR1cmJcXClcbmRhdGEgPC0gdGVtcCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKFxcdGFyZ2V0XFwpICU+JSBhcy5tYXRyaXgoKVxuXG5saWJyYXJ5KGNpcmNsaXplKVxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMSwgbWF4KGRhdGEpKSwgYyhcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5cbiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSBcXHdzc1xcKVxuXG5wIDwtIEhlYXRtYXAoXG4gIGRhdGEsXG4gIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZFxuICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbVxuICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gIGNvbCA9IGNvbF9mdW4sXG4gIGJvcmRlciA9IFRSVUVcbilcblxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\)) %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])



loop.1 <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_bothRetained.bedpe\))
anchor.1 <- (extractAnchor(loop.1))
overlaps <- findOverlaps(anchor.1, atac.gr)
anchor.1 <- pintersect(anchor.1[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.2 <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_AsyncSpecificPert.bedpe\))
anchor.2 <- (extractAnchor(loop.2))
overlaps <- findOverlaps(anchor.2, atac.gr)
anchor.2 <- pintersect(anchor.2[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.3 <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_G1SpecificPert.bedpe\))
anchor.3 <- (extractAnchor(loop.3))
overlaps <- findOverlaps(anchor.3, atac.gr)
anchor.3 <- pintersect(anchor.3[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.4 <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_bothPert.bedpe\))
anchor.4 <- (extractAnchor(loop.4))
overlaps <- findOverlaps(anchor.4, atac.gr)
anchor.4 <- pintersect(anchor.4[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])


anchors <- list(anchor.1, anchor.2, anchor.3, anchor.4)
tbs <- list()
temps <- list()

# Process clusters c1 to c8
for (i in 1:4) {
  
  anchor <- anchors[[i]]
  # Run LOLA
  result <- runLOLA(anchor, anchor.all, lolaDB)
  tb <- as_tibble(result)
  
  # Filter and summarize
  tb <- tb %>%
    dplyr::mutate(target = toupper(antibody)) %>%
    filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
    dplyr::filter(qValue < alpha) %>%
    dplyr::group_by(target) %>%
    slice_min(meanRnk, with_ties = FALSE)
  
  # Store tb
  tbs[[i]] <- tb
  
  # Select and rename oddsRatio
  temp <- tb %>% dplyr::select(target, oddsRatio)
  colnames(temp) <- c(\target\, paste0(\OR_c\, i))
  
  # Store temp
  temps[[i]] <- temp
}

# Merge all temp tables into one
temp <- Reduce(function(x, y) full_join(x, y, by = \target\), temps) %>%
  mutate_all(~replace_na(., 1))
colnames(temp) <- c(\target\, \bothRetained\, \AsyncSpecificPerturb\, \G1SpecificPerturb\, \bothPerturb\)
data <- temp %>% column_to_rownames(\target\) %>% as.matrix()

library(circlize)
col_fun <- colorRamp2(c(1, max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlYUmhZeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeEhVMDB6TVRBMk1qVTNYMEZVUVVOZlJWTkRYekV1WW1Wa1hGd3BLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hXTVN3Z1ZqSXNJRll6S1Z4dVkyOXNibUZ0WlhNb1lYUmhZeWtnUEMwZ1l5aGNYR05vY2x4Y0xDQmNYSE4wWVhKMFhGd3NJRnhjWlc1a1hGd3BYRzVoZEdGakxtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2hoZEdGaktWeHVYRzRqSUV4UFFVUkpUa2NnVEU5UFVGTmNiaU1qSXlCSmJYQnZjblJwYm1jZ1pHbG1abVZ5Wlc1MGFXRnNJSEpsWjNWc1lYUnZjbmtnYkc5dmNITWdKaUJsZUhSeVlXTjBJR0Z1WTJodmNseHViRzl2Y0M1aGJHd2dQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lUzUwYzNaY1hDa3BJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRUZ1Ym04eUlDVnBiaVVnWXloY1hGQXRVRnhjTENCY1hGQXRSVnhjTENCY1hFVXRSVnhjS1NsY2JtRnVZMmh2Y2k1aGJHd2dQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1aGJHd3BLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNWhiR3dzSUdGMFlXTXVaM0lwWEc1aGJtTm9iM0l1WVd4c0lEd3RJSEJwYm5SbGNuTmxZM1FvWVc1amFHOXlMbUZzYkZ0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0hNcFhTd2dZWFJoWXk1bmNsdHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWxkS1Z4dVhHNWNibHh1Ykc5dmNDNHhJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZSekYyYzBGemVXNWpYMkp2ZEdoU1pYUmhhVzVsWkM1aVpXUndaVnhjS1NsY2JtRnVZMmh2Y2k0eElEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1TVNrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TGpFc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdU1TQThMU0J3YVc1MFpYSnpaV04wS0dGdVkyaHZjaTR4VzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZExDQmhkR0ZqTG1keVczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjBwWEc1Y2JteHZiM0F1TWlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDBjeGRuTkJjM2x1WTE5QmMzbHVZMU53WldOcFptbGpVR1Z5ZEM1aVpXUndaVnhjS1NsY2JtRnVZMmh2Y2k0eUlEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1TWlrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TGpJc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdU1pQThMU0J3YVc1MFpYSnpaV04wS0dGdVkyaHZjaTR5VzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZExDQmhkR0ZqTG1keVczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjBwWEc1Y2JteHZiM0F1TXlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDBjeGRuTkJjM2x1WTE5SE1WTndaV05wWm1salVHVnlkQzVpWldSd1pWeGNLU2xjYm1GdVkyaHZjaTR6SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVNeWtwWEc1dmRtVnliR0Z3Y3lBOExTQm1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlMak1zSUdGMFlXTXVaM0lwWEc1aGJtTm9iM0l1TXlBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNHpXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkTENCaGRHRmpMbWR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVjYm14dmIzQXVOQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNCbExYQmxYMGN4ZG5OQmMzbHVZMTlpYjNSb1VHVnlkQzVpWldSd1pWeGNLU2xjYm1GdVkyaHZjaTQwSUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVOQ2twWEc1dmRtVnliR0Z3Y3lBOExTQm1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlMalFzSUdGMFlXTXVaM0lwWEc1aGJtTm9iM0l1TkNBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNDBXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkTENCaGRHRmpMbWR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVjYmx4dVlXNWphRzl5Y3lBOExTQnNhWE4wS0dGdVkyaHZjaTR4TENCaGJtTm9iM0l1TWl3Z1lXNWphRzl5TGpNc0lHRnVZMmh2Y2k0MEtWeHVkR0p6SUR3dElHeHBjM1FvS1Z4dWRHVnRjSE1nUEMwZ2JHbHpkQ2dwWEc1Y2JpTWdVSEp2WTJWemN5QmpiSFZ6ZEdWeWN5QmpNU0IwYnlCak9GeHVabTl5SUNocElHbHVJREU2TkNrZ2UxeHVJQ0JjYmlBZ1lXNWphRzl5SUR3dElHRnVZMmh2Y25OYlcybGRYVnh1SUNBaklGSjFiaUJNVDB4QlhHNGdJSEpsYzNWc2RDQThMU0J5ZFc1TVQweEJLR0Z1WTJodmNpd2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1SUNCMFlpQThMU0JoYzE5MGFXSmliR1VvY21WemRXeDBLVnh1SUNCY2JpQWdJeUJHYVd4MFpYSWdZVzVrSUhOMWJXMWhjbWw2WlZ4dUlDQjBZaUE4TFNCMFlpQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwS1NBbFBpVmNiaUFnSUNCbWFXeDBaWElvYzNSeVgzUnZYMnh2ZDJWeUtHTmxiR3hVZVhCbEtTQTlQU0JjWEdWdFluSjViMjVwWXlCemRHVnRJR05sYkd4Y1hDa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lDQWdjMnhwWTJWZmJXbHVLRzFsWVc1U2Jtc3NJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLVnh1SUNCY2JpQWdJeUJUZEc5eVpTQjBZbHh1SUNCMFluTmJXMmxkWFNBOExTQjBZbHh1SUNCY2JpQWdJeUJUWld4bFkzUWdZVzVrSUhKbGJtRnRaU0J2WkdSelVtRjBhVzljYmlBZ2RHVnRjQ0E4TFNCMFlpQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHOWtaSE5TWVhScGJ5bGNiaUFnWTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY1hIUmhjbWRsZEZ4Y0xDQndZWE4wWlRBb1hGeFBVbDlqWEZ3c0lHa3BLVnh1SUNCY2JpQWdJeUJUZEc5eVpTQjBaVzF3WEc0Z0lIUmxiWEJ6VzF0cFhWMGdQQzBnZEdWdGNGeHVmVnh1WEc0aklFMWxjbWRsSUdGc2JDQjBaVzF3SUhSaFlteGxjeUJwYm5SdklHOXVaVnh1ZEdWdGNDQThMU0JTWldSMVkyVW9ablZ1WTNScGIyNG9lQ3dnZVNrZ1puVnNiRjlxYjJsdUtIZ3NJSGtzSUdKNUlEMGdYRngwWVhKblpYUmNYQ2tzSUhSbGJYQnpLU0FsUGlWY2JpQWdiWFYwWVhSbFgyRnNiQ2grY21Wd2JHRmpaVjl1WVNndUxDQXhLU2xjYm1OdmJHNWhiV1Z6S0hSbGJYQXBJRHd0SUdNb1hGeDBZWEpuWlhSY1hDd2dYRnhpYjNSb1VtVjBZV2x1WldSY1hDd2dYRnhCYzNsdVkxTndaV05wWm1salVHVnlkSFZ5WWx4Y0xDQmNYRWN4VTNCbFkybG1hV05RWlhKMGRYSmlYRndzSUZ4Y1ltOTBhRkJsY25SMWNtSmNYQ2xjYm1SaGRHRWdQQzBnZEdWdGNDQWxQaVVnWTI5c2RXMXVYM1J2WDNKdmQyNWhiV1Z6S0Z4Y2RHRnlaMlYwWEZ3cElDVStKU0JoY3k1dFlYUnlhWGdvS1Z4dVhHNXNhV0p5WVhKNUtHTnBjbU5zYVhwbEtWeHVZMjlzWDJaMWJpQThMU0JqYjJ4dmNsSmhiWEF5S0dNb01Td2diV0Y0S0dSaGRHRXBLU3dnWXloY1hIZG9hWFJsWEZ3c0lGeGNjbVZrWEZ3cEtWeHVYRzVjYmlObWRtbDZYMjVpWTJ4MWMzUW9aR0YwWVN3Z2EyMWxZVzV6TENCdFpYUm9iMlFnUFNCY1hIZHpjMXhjS1Z4dVhHNXdJRHd0SUVobFlYUnRZWEFvWEc0Z0lHUmhkR0VzWEc0Z0lHNWhiV1VnUFNCY1hFOWtaSE1nVW1GMGFXOWNYQ3dnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlCT1lXMWxJRzltSUhSb1pTQm9aV0YwYldGd0lHeGxaMlZ1WkZ4dUlDQmpiSFZ6ZEdWeVgyTnZiSFZ0Ym5NZ1BTQkdRVXhUUlN3Z0lDQWdJQ0FnSUNBZ0lDQWpJRkpsYlc5MlpTQmpiMngxYlc0Z1pHVnVaSEp2WjNKaGJWeHVJQ0J6YUc5M1gzSnZkMTlrWlc1a0lEMGdSa0ZNVTBVc1hHNGdJR052YkNBOUlHTnZiRjltZFc0c1hHNGdJR0p2Y21SbGNpQTlJRlJTVlVWY2JpbGNibHh1WEc1Y2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbmF0YWMgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcR1NNMzEwNjI1N19BVEFDX0VTQ18xLmJlZFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMylcbmNvbG5hbWVzKGF0YWMpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuYXRhYy5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYXRhYylcblxuIyBMT0FESU5HIExPT1BTXG4jIyMgSW1wb3J0aW5nIGRpZmZlcmVudGlhbCByZWd1bGF0b3J5IGxvb3BzICYgZXh0cmFjdCBhbmNob3Jcbmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCkpXG5hbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKVxuYW5jaG9yLmFsbCA8LSBwaW50ZXJzZWN0KGFuY2hvci5hbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuXG5cbmxvb3AuMSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19ib3RoUmV0YWluZWQuYmVkcGVcXCkpXG5hbmNob3IuMSA8LSAoZXh0cmFjdEFuY2hvcihsb29wLjEpKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci4xLCBhdGFjLmdyKVxuYW5jaG9yLjEgPC0gcGludGVyc2VjdChhbmNob3IuMVtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLjIgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9HMXZzQXN5bmNfQXN5bmNTcGVjaWZpY1BlcnQuYmVkcGVcXCkpXG5hbmNob3IuMiA8LSAoZXh0cmFjdEFuY2hvcihsb29wLjIpKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci4yLCBhdGFjLmdyKVxuYW5jaG9yLjIgPC0gcGludGVyc2VjdChhbmNob3IuMltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLjMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9HMXZzQXN5bmNfRzFTcGVjaWZpY1BlcnQuYmVkcGVcXCkpXG5hbmNob3IuMyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLjMpKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci4zLCBhdGFjLmdyKVxuYW5jaG9yLjMgPC0gcGludGVyc2VjdChhbmNob3IuM1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLjQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9HMXZzQXN5bmNfYm90aFBlcnQuYmVkcGVcXCkpXG5hbmNob3IuNCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLjQpKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci40LCBhdGFjLmdyKVxuYW5jaG9yLjQgPC0gcGludGVyc2VjdChhbmNob3IuNFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cbmFuY2hvcnMgPC0gbGlzdChhbmNob3IuMSwgYW5jaG9yLjIsIGFuY2hvci4zLCBhbmNob3IuNClcbnRicyA8LSBsaXN0KClcbnRlbXBzIDwtIGxpc3QoKVxuXG4jIFByb2Nlc3MgY2x1c3RlcnMgYzEgdG8gYzhcbmZvciAoaSBpbiAxOjQpIHtcbiAgXG4gIGFuY2hvciA8LSBhbmNob3JzW1tpXV1cbiAgIyBSdW4gTE9MQVxuICByZXN1bHQgPC0gcnVuTE9MQShhbmNob3IsIGFuY2hvci5hbGwsIGxvbGFEQilcbiAgdGIgPC0gYXNfdGliYmxlKHJlc3VsdClcbiAgXG4gICMgRmlsdGVyIGFuZCBzdW1tYXJpemVcbiAgdGIgPC0gdGIgJT4lXG4gICAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JVxuICAgIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICAgIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbiAgXG4gICMgU3RvcmUgdGJcbiAgdGJzW1tpXV0gPC0gdGJcbiAgXG4gICMgU2VsZWN0IGFuZCByZW5hbWUgb2Rkc1JhdGlvXG4gIHRlbXAgPC0gdGIgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG4gIGNvbG5hbWVzKHRlbXApIDwtIGMoXFx0YXJnZXRcXCwgcGFzdGUwKFxcT1JfY1xcLCBpKSlcbiAgXG4gICMgU3RvcmUgdGVtcFxuICB0ZW1wc1tbaV1dIDwtIHRlbXBcbn1cblxuIyBNZXJnZSBhbGwgdGVtcCB0YWJsZXMgaW50byBvbmVcbnRlbXAgPC0gUmVkdWNlKGZ1bmN0aW9uKHgsIHkpIGZ1bGxfam9pbih4LCB5LCBieSA9IFxcdGFyZ2V0XFwpLCB0ZW1wcykgJT4lXG4gIG11dGF0ZV9hbGwofnJlcGxhY2VfbmEoLiwgMSkpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcdGFyZ2V0XFwsIFxcYm90aFJldGFpbmVkXFwsIFxcQXN5bmNTcGVjaWZpY1BlcnR1cmJcXCwgXFxHMVNwZWNpZmljUGVydHVyYlxcLCBcXGJvdGhQZXJ0dXJiXFwpXG5kYXRhIDwtIHRlbXAgJT4lIGNvbHVtbl90b19yb3duYW1lcyhcXHRhcmdldFxcKSAlPiUgYXMubWF0cml4KClcblxubGlicmFyeShjaXJjbGl6ZSlcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDEsIG1heChkYXRhKSksIGMoXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuXG4jZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gXFx3c3NcXClcblxucCA8LSBIZWF0bWFwKFxuICBkYXRhLFxuICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmRcbiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsICAgICAgICAgICAgIyBSZW1vdmUgY29sdW1uIGRlbmRyb2dyYW1cbiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICBjb2wgPSBjb2xfZnVuLFxuICBib3JkZXIgPSBUUlVFXG4pXG5cblxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvclxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSlcbmFuY2hvci5hbGwgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5hbGwpKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5hbGwsIGF0YWMuZ3IpXG5hbmNob3IuYWxsIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cblxubG9vcC4xIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX2JvdGhSZXRhaW5lZC5iZWRwZVxcKSlcbmFuY2hvci4xIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuMSkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLjEsIGF0YWMuZ3IpXG5hbmNob3IuMSA8LSBwaW50ZXJzZWN0KGFuY2hvci4xW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AuMiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19Bc3luY1NwZWNpZmljUGVydC5iZWRwZVxcKSlcbmFuY2hvci4yIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuMikpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLjIsIGF0YWMuZ3IpXG5hbmNob3IuMiA8LSBwaW50ZXJzZWN0KGFuY2hvci4yW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AuMyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19HMVNwZWNpZmljUGVydC5iZWRwZVxcKSlcbmFuY2hvci4zIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuMykpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLjMsIGF0YWMuZ3IpXG5hbmNob3IuMyA8LSBwaW50ZXJzZWN0KGFuY2hvci4zW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AuNCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19ib3RoUGVydC5iZWRwZVxcKSlcbmFuY2hvci40IDwtIChleHRyYWN0QW5jaG9yKGxvb3AuNCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLjQsIGF0YWMuZ3IpXG5hbmNob3IuNCA8LSBwaW50ZXJzZWN0KGFuY2hvci40W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cblxuYW5jaG9ycyA8LSBsaXN0KGFuY2hvci4xLCBhbmNob3IuMiwgYW5jaG9yLjMsIGFuY2hvci40KVxudGJzIDwtIGxpc3QoKVxudGVtcHMgPC0gbGlzdCgpXG5cbiMgUHJvY2VzcyBjbHVzdGVycyBjMSB0byBjOFxuZm9yIChpIGluIDE6NCkge1xuICBcbiAgYW5jaG9yIDwtIGFuY2hvcnNbW2ldXVxuICAjIFJ1biBMT0xBXG4gIHJlc3VsdCA8LSBydW5MT0xBKGFuY2hvciwgYW5jaG9yLmFsbCwgbG9sYURCKVxuICB0YiA8LSBhc190aWJibGUocmVzdWx0KVxuICBcbiAgIyBGaWx0ZXIgYW5kIHN1bW1hcml6ZVxuICB0YiA8LSB0YiAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lXG4gICAgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuICBcbiAgIyBTdG9yZSB0YlxuICB0YnNbW2ldXSA8LSB0YlxuICBcbiAgIyBTZWxlY3QgYW5kIHJlbmFtZSBvZGRzUmF0aW9cbiAgdGVtcCA8LSB0YiAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbiAgY29sbmFtZXModGVtcCkgPC0gYyhcXHRhcmdldFxcLCBwYXN0ZTAoXFxPUl9jXFwsIGkpKVxuICBcbiAgIyBTdG9yZSB0ZW1wXG4gIHRlbXBzW1tpXV0gPC0gdGVtcFxufVxuXG4jIE1lcmdlIGFsbCB0ZW1wIHRhYmxlcyBpbnRvIG9uZVxudGVtcCA8LSBSZWR1Y2UoZnVuY3Rpb24oeCwgeSkgZnVsbF9qb2luKHgsIHksIGJ5ID0gXFx0YXJnZXRcXCksIHRlbXBzKSAlPiVcbiAgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFx0YXJnZXRcXCwgXFxib3RoUmV0YWluZWRcXCwgXFxBc3luY1NwZWNpZmljUGVydHVyYlxcLCBcXEcxU3BlY2lmaWNQZXJ0dXJiXFwsIFxcYm90aFBlcnR1cmJcXClcbmRhdGEgPC0gdGVtcCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKFxcdGFyZ2V0XFwpICU+JSBhcy5tYXRyaXgoKVxuXG5saWJyYXJ5KGNpcmNsaXplKVxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMSwgbWF4KGRhdGEpKSwgYyhcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5cbiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSBcXHdzc1xcKVxuXG5wIDwtIEhlYXRtYXAoXG4gIGRhdGEsXG4gIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZFxuICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbVxuICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gIGNvbCA9IGNvbF9mdW4sXG4gIGJvcmRlciA9IFRSVUVcbilcblxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\)) %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])



loop.1 <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_bothRetained.bedpe\))
anchor.1 <- (extractAnchor(loop.1))
overlaps <- findOverlaps(anchor.1, atac.gr)
anchor.1 <- pintersect(anchor.1[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.2 <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_AsyncSpecificPert.bedpe\))
anchor.2 <- (extractAnchor(loop.2))
overlaps <- findOverlaps(anchor.2, atac.gr)
anchor.2 <- pintersect(anchor.2[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.3 <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_G1SpecificPert.bedpe\))
anchor.3 <- (extractAnchor(loop.3))
overlaps <- findOverlaps(anchor.3, atac.gr)
anchor.3 <- pintersect(anchor.3[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.4 <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_bothPert.bedpe\))
anchor.4 <- (extractAnchor(loop.4))
overlaps <- findOverlaps(anchor.4, atac.gr)
anchor.4 <- pintersect(anchor.4[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])


anchors <- list(anchor.1, anchor.2, anchor.3, anchor.4)
tbs <- list()
temps <- list()

# Process clusters c1 to c8
for (i in 1:4) {
  
  anchor <- anchors[[i]]
  # Run LOLA
  result <- runLOLA(anchor, anchor.all, lolaDB)
  tb <- as_tibble(result)
  
  # Filter and summarize
  tb <- tb %>%
    dplyr::mutate(target = toupper(antibody)) %>%
    filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
    dplyr::filter(qValue < alpha) %>%
    dplyr::group_by(target) %>%
    slice_min(meanRnk, with_ties = FALSE)
  
  # Store tb
  tbs[[i]] <- tb
  
  # Select and rename oddsRatio
  temp <- tb %>% dplyr::select(target, oddsRatio)
  colnames(temp) <- c(\target\, paste0(\OR_c\, i))
  
  # Store temp
  temps[[i]] <- temp
}

# Merge all temp tables into one
temp <- Reduce(function(x, y) full_join(x, y, by = \target\), temps) %>%
  mutate_all(~replace_na(., 1))
colnames(temp) <- c(\target\, \bothRetained\, \AsyncSpecificPerturb\, \G1SpecificPerturb\, \bothPerturb\)
data <- temp %>% column_to_rownames(\target\) %>% as.matrix()

library(circlize)
col_fun <- colorRamp2(c(1, max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## [2.21] LOLA on differential loop anchors
##### LOADING LOLA

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZWFJoWXlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0pIVTAwek1UQTJNalUzWDBGVVFVTmZSVk5EWHpFdVltVmtYQ0lwS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoV01Td2dWaklzSUZZektWeHVZMjlzYm1GdFpYTW9ZWFJoWXlrZ1BDMGdZeWhjSW1Ob2Nsd2lMQ0JjSW5OMFlYSjBYQ0lzSUZ3aVpXNWtYQ0lwWEc1aGRHRmpMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoaGRHRmpLVnh1WEc0aklFeFBRVVJKVGtjZ1RFOVBVRk5jYmlNakl5QkpiWEJ2Y25ScGJtY2daR2xtWm1WeVpXNTBhV0ZzSUhKbFozVnNZWFJ2Y25rZ2JHOXZjSE1nSmlCbGVIUnlZV04wSUdGdVkyaHZjbHh1Ykc5dmNDNWhiR3dnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVM1MGMzWmNJaWtwSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHlJQ1ZwYmlVZ1l5aGNJbEF0VUZ3aUxDQmNJbEF0UlZ3aUxDQmNJa1V0UlZ3aUtTbGNibUZ1WTJodmNpNWhiR3dnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWhiR3dwS1Z4dWIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjaTVoYkd3c0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVlXeHNJRHd0SUhCcGJuUmxjbk5sWTNRb1lXNWphRzl5TG1Gc2JGdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVjYm14dmIzQXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlrVkVGSGRuTkVUVk5QWDFWUVgyUnBabVl3TGpJdVltVmtjR1ZjSWlrcFhHNWhibU5vYjNJdWRYQWdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1MWNDa3BYRzV2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxuVndMQ0JoZEdGakxtZHlLVnh1WVc1amFHOXlMblZ3SUR3dElIQnBiblJsY25ObFkzUW9ZVzVqYUc5eUxuVndXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkTENCaGRHRmpMbWR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVjYm14dmIzQXVibThnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlrVkVGSGRuTkVUVk5QWDA1UFgyUnBabVl3TGpJdVltVmtjR1ZjSWlrcFhHNWhibU5vYjNJdWJtOGdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1dWJ5a3BYRzV2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxtNXZMQ0JoZEdGakxtZHlLVnh1WVc1amFHOXlMbTV2SUR3dElIQnBiblJsY25ObFkzUW9ZVzVqYUc5eUxtNXZXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkTENCaGRHRmpMbWR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVjYm14dmIzQXVkWEJ1YnlBOExTQmlhVzVrWDNKdmQzTW9iRzl2Y0M1MWNDd2diRzl2Y0M1dWJ5bGNibUZ1WTJodmNpNTFjRzV2SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVkWEJ1YnlrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG5Wd2JtOHNJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVkWEJ1YnlBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNTFjRzV2VzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZExDQmhkR0ZqTG1keVczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjBwWEc1Y2JteHZiM0F1Wkc5M2JpQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbFgyUlVRVWQyYzBSTlUwOWZSRTlYVGw5a2FXWm1NQzR5TG1KbFpIQmxYQ0lwS1Z4dVlXNWphRzl5TG1SdmQyNGdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1a2IzZHVLU2xjYm05MlpYSnNZWEJ6SUR3dElHWnBibVJQZG1WeWJHRndjeWhoYm1Ob2IzSXVaRzkzYml3Z1lYUmhZeTVuY2lsY2JtRnVZMmh2Y2k1a2IzZHVJRHd0SUhCcGJuUmxjbk5sWTNRb1lXNWphRzl5TG1SdmQyNWJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzSUdGMFlXTXVaM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhTbGNibHh1WEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5hdGFjIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXEdTTTMxMDYyNTdfQVRBQ19FU0NfMS5iZWRcXCkpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpXG5jb2xuYW1lcyhhdGFjKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbmF0YWMuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGF0YWMpXG5cbiMgTE9BRElORyBMT09QU1xuIyMjIEltcG9ydGluZyBkaWZmZXJlbnRpYWwgcmVndWxhdG9yeSBsb29wcyAmIGV4dHJhY3QgYW5jaG9yXG5sb29wLmFsbCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5LnRzdlxcKSkgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpKVxuYW5jaG9yLmFsbCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmFsbCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmFsbCwgYXRhYy5ncilcbmFuY2hvci5hbGwgPC0gcGludGVyc2VjdChhbmNob3IuYWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci51cCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXAsIGF0YWMuZ3IpXG5hbmNob3IudXAgPC0gcGludGVyc2VjdChhbmNob3IudXBbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3Iubm8sIGF0YWMuZ3IpXG5hbmNob3Iubm8gPC0gcGludGVyc2VjdChhbmNob3Iubm9bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC51cG5vIDwtIGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKVxuYW5jaG9yLnVwbm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cG5vKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXBubywgYXRhYy5ncilcbmFuY2hvci51cG5vIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwbm9bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBhdGFjLmdyKVxuYW5jaG9yLmRvd24gPC0gcGludGVyc2VjdChhbmNob3IuZG93bltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\)) %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])


loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
overlaps <- findOverlaps(anchor.up, atac.gr)
anchor.up <- pintersect(anchor.up[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
overlaps <- findOverlaps(anchor.no, atac.gr)
anchor.no <- pintersect(anchor.no[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.upno <- bind_rows(loop.up, loop.no)
anchor.upno <- (extractAnchor(loop.upno))
overlaps <- findOverlaps(anchor.upno, atac.gr)
anchor.upno <- pintersect(anchor.upno[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))
overlaps <- findOverlaps(anchor.down, atac.gr)
anchor.down <- pintersect(anchor.down[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlYUmhZeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeEhVMDB6TVRBMk1qVTNYMEZVUVVOZlJWTkRYekV1WW1Wa1hGd3BLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hXTVN3Z1ZqSXNJRll6S1Z4dVkyOXNibUZ0WlhNb1lYUmhZeWtnUEMwZ1l5aGNYR05vY2x4Y0xDQmNYSE4wWVhKMFhGd3NJRnhjWlc1a1hGd3BYRzVoZEdGakxtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2hoZEdGaktWeHVYRzRqSUV4UFFVUkpUa2NnVEU5UFVGTmNiaU1qSXlCSmJYQnZjblJwYm1jZ1pHbG1abVZ5Wlc1MGFXRnNJSEpsWjNWc1lYUnZjbmtnYkc5dmNITWdKaUJsZUhSeVlXTjBJR0Z1WTJodmNseHViRzl2Y0M1aGJHd2dQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lUzUwYzNaY1hDa3BJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRUZ1Ym04eUlDVnBiaVVnWXloY1hGQXRVRnhjTENCY1hGQXRSVnhjTENCY1hFVXRSVnhjS1NsY2JtRnVZMmh2Y2k1aGJHd2dQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1aGJHd3BLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNWhiR3dzSUdGMFlXTXVaM0lwWEc1aGJtTm9iM0l1WVd4c0lEd3RJSEJwYm5SbGNuTmxZM1FvWVc1amFHOXlMbUZzYkZ0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0hNcFhTd2dZWFJoWXk1bmNsdHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWxkS1Z4dVhHNWNibXh2YjNBdWRYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pWOWtWRUZIZG5ORVRWTlBYMVZRWDJScFptWXdMakl1WW1Wa2NHVmNYQ2twWEc1aGJtTm9iM0l1ZFhBZ1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzUxY0NrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG5Wd0xDQmhkR0ZqTG1keUtWeHVZVzVqYUc5eUxuVndJRHd0SUhCcGJuUmxjbk5sWTNRb1lXNWphRzl5TG5Wd1czRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGRMQ0JoZEdGakxtZHlXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1YwcFhHNWNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pWOWtWRUZIZG5ORVRWTlBYMDVQWDJScFptWXdMakl1WW1Wa2NHVmNYQ2twWEc1aGJtTm9iM0l1Ym04Z1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzV1YnlrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG01dkxDQmhkR0ZqTG1keUtWeHVZVzVqYUc5eUxtNXZJRHd0SUhCcGJuUmxjbk5sWTNRb1lXNWphRzl5TG01dlczRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGRMQ0JoZEdGakxtZHlXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1YwcFhHNWNibXh2YjNBdWRYQnVieUE4TFNCaWFXNWtYM0p2ZDNNb2JHOXZjQzUxY0N3Z2JHOXZjQzV1YnlsY2JtRnVZMmh2Y2k1MWNHNXZJRHd0SUNobGVIUnlZV04wUVc1amFHOXlLR3h2YjNBdWRYQnVieWtwWEc1dmRtVnliR0Z3Y3lBOExTQm1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlMblZ3Ym04c0lHRjBZV011WjNJcFhHNWhibU5vYjNJdWRYQnVieUE4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1MWNHNXZXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkTENCaGRHRmpMbWR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVjYm14dmIzQXVaRzkzYmlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDJSVVFVZDJjMFJOVTA5ZlJFOVhUbDlrYVdabU1DNHlMbUpsWkhCbFhGd3BLVnh1WVc1amFHOXlMbVJ2ZDI0Z1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzVrYjNkdUtTbGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVpHOTNiaXdnWVhSaFl5NW5jaWxjYm1GdVkyaHZjaTVrYjNkdUlEd3RJSEJwYm5SbGNuTmxZM1FvWVc1amFHOXlMbVJ2ZDI1YmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMHNJR0YwWVdNdVozSmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFNsY2JseHVYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvclxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSlcbmFuY2hvci5hbGwgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5hbGwpKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5hbGwsIGF0YWMuZ3IpXG5hbmNob3IuYWxsIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwLCBhdGFjLmdyKVxuYW5jaG9yLnVwIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3Iubm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vLCBhdGFjLmdyKVxuYW5jaG9yLm5vIDwtIHBpbnRlcnNlY3QoYW5jaG9yLm5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AudXBubyA8LSBiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubylcbmFuY2hvci51cG5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXBubykpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwbm8sIGF0YWMuZ3IpXG5hbmNob3IudXBubyA8LSBwaW50ZXJzZWN0KGFuY2hvci51cG5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgYXRhYy5ncilcbmFuY2hvci5kb3duIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmRvd25bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvclxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSlcbmFuY2hvci5hbGwgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5hbGwpKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5hbGwsIGF0YWMuZ3IpXG5hbmNob3IuYWxsIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwLCBhdGFjLmdyKVxuYW5jaG9yLnVwIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3Iubm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vLCBhdGFjLmdyKVxuYW5jaG9yLm5vIDwtIHBpbnRlcnNlY3QoYW5jaG9yLm5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AudXBubyA8LSBiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubylcbmFuY2hvci51cG5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXBubykpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwbm8sIGF0YWMuZ3IpXG5hbmNob3IudXBubyA8LSBwaW50ZXJzZWN0KGFuY2hvci51cG5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgYXRhYy5ncilcbmFuY2hvci5kb3duIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmRvd25bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\)) %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])


loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
overlaps <- findOverlaps(anchor.up, atac.gr)
anchor.up <- pintersect(anchor.up[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
overlaps <- findOverlaps(anchor.no, atac.gr)
anchor.no <- pintersect(anchor.no[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.upno <- bind_rows(loop.up, loop.no)
anchor.upno <- (extractAnchor(loop.upno))
overlaps <- findOverlaps(anchor.upno, atac.gr)
anchor.upno <- pintersect(anchor.upno[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))
overlaps <- findOverlaps(anchor.down, atac.gr)
anchor.down <- pintersect(anchor.down[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### dTAG, Comparing to Async
##### - Limited to ATAC-seq signal, reg loop backgroupd

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJTVlU1T1NVNUhJRXhQVEVGY2JteHZiR0ZFYVhJZ1BDMGdhR1Z5WlNoY0lpNHVMeTR1TDNKbGMzVnNkQzlzYjJ4aFhDSXBYRzVrYVhJdVkzSmxZWFJsS0d4dmJHRkVhWElzSUhOb2IzZFhZWEp1YVc1bmN5QTlJRVpCVEZORkxDQnlaV04xY25OcGRtVWdQU0JVVWxWRktWeHVYRzRqSUZWUVhHNXlaWE4xYkhRZ1BTQnlkVzVNVDB4QktHRnVZMmh2Y2k1MWNDd2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVabmR5YVhSbEtIUmlMQ0JvWlhKbEtHeHZiR0ZFYVhJc0lGd2lURTlNUVY5a1ZFRkhYM1p6WDBSTlUwOWZaR2xtWmpBdU1sOTFjRjloZEdGakxuUnpkbHdpS1N3Z2MyVndJRDBnWENKY1hIUmNJaWxjYmx4dUl5Qk9UMXh1Y21WemRXeDBJRDBnY25WdVRFOU1RU2hoYm1Ob2IzSXVibThzSUdGdVkyaHZjaTVoYkd3c0lHeHZiR0ZFUWlsY2JuUmlJRDBnWVhOZmRHbGlZbXhsS0hKbGMzVnNkQ2xjYm1aM2NtbDBaU2gwWWl3Z2FHVnlaU2hzYjJ4aFJHbHlMQ0JjSWt4UFRFRmZaRlJCUjE5MmMxOUVUVk5QWDJScFptWXdMakpmYm05ZllYUmhZeTUwYzNaY0lpa3NJSE5sY0NBOUlGd2lYRngwWENJcFhHNWNiaU1nVlZCT1QxeHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdWRYQnVieXdnWVc1amFHOXlMbUZzYkN3Z2JHOXNZVVJDS1Z4dWRHSWdQU0JoYzE5MGFXSmliR1VvY21WemRXeDBLVnh1Wm5keWFYUmxLSFJpTENCb1pYSmxLR3h2YkdGRWFYSXNJRndpVEU5TVFWOWtWRUZIWDNaelgwUk5VMDlmWkdsbVpqQXVNbDkxY0c1dlgyRjBZV011ZEhOMlhDSXBMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUtWeHVYRzRqSUVSUFYwNWNibkpsYzNWc2RDQTlJSEoxYmt4UFRFRW9ZVzVqYUc5eUxtUnZkMjRzSUdGdVkyaHZjaTVoYkd3c0lHeHZiR0ZFUWlsY2JuUmlJRDBnWVhOZmRHbGlZbXhsS0hKbGMzVnNkQ2xjYm1aM2NtbDBaU2gwWWl3Z2FHVnlaU2hzYjJ4aFJHbHlMQ0JjSWt4UFRFRmZaRlJCUjE5MmMxOUVUVk5QWDJScFptWXdMakpmWkc5M2JsOWhkR0ZqTG5SemRsd2lLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNibHh1WEc0akl5TWdTRVZCVkUxQlVGeHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dWRHSXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaHNiMnhoUkdseUxDQmNJa3hQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZkWEJmWVhSaFl5NTBjM1pjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoY21kbGRDQTlJSFJ2ZFhCd1pYSW9ZVzUwYVdKdlpIa3BLU0FsUGlWY2JpQWdabWxzZEdWeUtITjBjbDkwYjE5c2IzZGxjaWhqWld4c1ZIbHdaU2tnUFQwZ1hDSmxiV0p5ZVc5dWFXTWdjM1JsYlNCalpXeHNYQ0lwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIRldZV3gxWlNBOElHRnNjR2hoS1NBbFBpVWdaSEJzZVhJNk9tZHliM1Z3WDJKNUtIUmhjbWRsZENrZ0pUNGxYRzRnSUhOc2FXTmxYMjFwYmlodFpXRnVVbTVyTENCM2FYUm9YM1JwWlhNZ1BTQkdRVXhUUlNsY2JuUmlMbTV2SUR3dElHWnlaV0ZrS0dobGNtVW9iRzlzWVVScGNpd2dYQ0pNVDB4QlgyUlVRVWRmZG5OZlJFMVRUMTlrYVdabU1DNHlYMjV2WDJGMFlXTXVkSE4yWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU2tnSlQ0bFhHNGdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGd2laVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRndpS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaHhWbUZzZFdVZ1BDQmhiSEJvWVNrZ0pUNGxJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNTBZaTVrYjNkdUlEd3RJR1p5WldGa0tHaGxjbVVvYkc5c1lVUnBjaXdnWENKTVQweEJYMlJVUVVkZmRuTmZSRTFUVDE5a2FXWm1NQzR5WDJSdmQyNWZZWFJoWXk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtIUmhjbWRsZENBOUlIUnZkWEJ3WlhJb1lXNTBhV0p2WkhrcEtTQWxQaVZjYmlBZ1ptbHNkR1Z5S0hOMGNsOTBiMTlzYjNkbGNpaGpaV3hzVkhsd1pTa2dQVDBnWENKbGJXSnllVzl1YVdNZ2MzUmxiU0JqWld4c1hDSXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlVZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGdJSE5zYVdObFgyMXBiaWh0WldGdVVtNXJMQ0IzYVhSb1gzUnBaWE1nUFNCR1FVeFRSU2xjYmx4dWRHVnRjQzUxY0NBOExTQjBZaTUxY0NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUc5a1pITlNZWFJwYnlsY2JtTnZiRzVoYldWektIUmxiWEF1ZFhBcElEd3RJR01vWENKMFlYSm5aWFJjSWl3Z1hDSlBVbDkxY0Z3aUtWeHVkR1Z0Y0M1dWJ5QThMU0IwWWk1dWJ5QWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHOWtaSE5TWVhScGJ5bGNibU52Ykc1aGJXVnpLSFJsYlhBdWJtOHBJRHd0SUdNb1hDSjBZWEpuWlhSY0lpd2dYQ0pQVWw5dWIxd2lLVnh1ZEdWdGNDNWtiM2R1SUR3dElIUmlMbVJ2ZDI0Z0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG1SdmQyNHBJRHd0SUdNb1hDSjBZWEpuWlhSY0lpd2dYQ0pQVWw5a2IzZHVYQ0lwWEc1Y2JseHVkR1Z0Y0NBOExTQm1kV3hzWDJwdmFXNG9ablZzYkY5cWIybHVLSFJsYlhBdWRYQXNJSFJsYlhBdWJtOHNJR0o1SUQwZ1l5aGNJblJoY21kbGRGd2lLU2tzSUhSbGJYQXVaRzkzYml3Z1lua2dQU0JqS0Z3aWRHRnlaMlYwWENJcEtTQWxQaVVnYlhWMFlYUmxYMkZzYkNoK2NtVndiR0ZqWlY5dVlTZ3VMQ0F4S1NsY2JseHVaR0YwWVNBOExTQmhjeTV0WVhSeWFYZ29kR1Z0Y0ZzeU9qUmRLVnh1Y205M2JtRnRaWE1vWkdGMFlTa2dQQzBnZEdWdGNDUjBZWEpuWlhSY2JseHViR2xpY21GeWVTaGphWEpqYkdsNlpTbGNibU52YkY5bWRXNGdQQzBnWTI5c2IzSlNZVzF3TWloaktHMXBiaWhrWVhSaEtTd2diV0Y0S0dSaGRHRXBLU3dnWXloY0luZG9hWFJsWENJc0lGd2ljbVZrWENJcEtWeHVYRzVjYmlObWRtbDZYMjVpWTJ4MWMzUW9aR0YwWVN3Z2EyMWxZVzV6TENCdFpYUm9iMlFnUFNCY0luZHpjMXdpS1Z4dVhHNGpJSEFnUEMwZ1NHVmhkRzFoY0NoY2JpTWdJQ0JrWVhSaExGeHVJeUFnSUc1aGJXVWdQU0JjSWs5a1pITWdVbUYwYVc5Y0lpd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJPWVcxbElHOW1JSFJvWlNCb1pXRjBiV0Z3SUd4bFoyVnVaRnh1SXlBZ0lHTnNkWE4wWlhKZlkyOXNkVzF1Y3lBOUlFWkJURk5GTENBZ0lDQWdJQ0FnSUNBZ0lDTWdVbVZ0YjNabElHTnZiSFZ0YmlCa1pXNWtjbTluY21GdFhHNGpJQ0FnY205M1gydHRJRDBnTkN3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlCRVpXWnBibVVnZEdobElHNTFiV0psY2lCdlppQnJMVzFsWVc1eklHTnNkWE4wWlhKeklHWnZjaUJ5YjNkeklDaGhaR3AxYzNRZ1lYTWdibVZsWkdWa0tWeHVJeUFnSUhOb2IzZGZjbTkzWDJSbGJtUWdQU0JHUVV4VFJTeGNiaU1nSUNCamIyd2dQU0JqYjJ4ZlpuVnVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklGVnpaU0IwYUdVZ2NtVmtJR2R5WVdScFpXNTBJR052Ykc5eUlITmpZV3hsWEc0aklDbGNiaU1nWEc0aklHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbUZ1WTJodmNreFBURUZmWkZSQlIxOTJjMTlFVFZOUFgyUnBabVl3TGpKZmNtVm5RVzVqYUc5eVFtRmphMmR5YjNWdVpGOWhkR0ZqWENJcFhHNGpJR2hsYVdkb2RDQThMU0EzWEc0aklIZHBaSFJvSUR3dElETXVOVnh1SXlCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRqSUhCeWFXNTBLSEFwWEc0aklHUmxkaTV2Wm1Zb0tWeHVJeUJ6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0aklIQnlhVzUwS0hBcFhHNGpJR1JsZGk1dlptWW9LVnh1SXlCY2JseHVYRzRqSXlNZ1ZtbHpkV0ZzYVhwcGJtY2djQzEyWVd4MVpTQmhibVFnVDFKY2JtRnNjR2hoSUR3dElEQXVNRFZjYmlNZ2RHSXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaHNiMnhoUkdseUxDQmNJa3hQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZkWEJmWVhSaFl5NTBjM1pjSWlrcElDVStKVnh1SXlBZ0lHUndiSGx5T2pwdGRYUmhkR1VvZEdGeVoyVjBJRDBnZEc5MWNIQmxjaWhoYm5ScFltOWtlU2tzWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeFZtRnNkV1ZNYjJjZ1BTQXRiRzluTWloeFZtRnNkV1VwTEZ4dUl5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ozSnZkWEFnUFNCY0lsVlFYQ0lwSUNVK0pWeHVJeUFnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRndpWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ3aUtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlVZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGpJQ0FnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dUl5QjBZaTV1YnlBOExTQm1jbVZoWkNob1pYSmxLR3h2YkdGRWFYSXNJRndpVEU5TVFWOWtWRUZIWDNaelgwUk5VMDlmWkdsbVpqQXVNbDl1YjE5aGRHRmpMblJ6ZGx3aUtTa2dKVDRsWEc0aklDQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1N4Y2JpTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIRldZV3gxWlV4dlp5QTlJQzFzYjJjeUtIRldZV3gxWlNrc1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5jbTkxY0NBOUlGd2lUazljSWlrZ0pUNGxYRzRqSUNBZ1ptbHNkR1Z5S0hOMGNsOTBiMTlzYjNkbGNpaGpaV3hzVkhsd1pTa2dQVDBnWENKbGJXSnllVzl1YVdNZ2MzUmxiU0JqWld4c1hDSXBJQ1UrSlZ4dUl5QWdJR1J3YkhseU9qcG1hV3gwWlhJb2NWWmhiSFZsSUR3Z1lXeHdhR0VwSUNVK0pTQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaU1nSUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNWNiblJpTG5Wd2JtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoc2IyeGhSR2x5TENCY0lreFBURUZmWkZSQlIxOTJjMTlFVFZOUFgyUnBabVl3TGpKZmRYQnViMTloZEdGakxuUnpkbHdpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0Z5WjJWMElEMGdkRzkxY0hCbGNpaGhiblJwWW05a2VTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjVlpoYkhWbFRHOW5JRDBnTFd4dlp6RXdLSEZXWVd4MVpTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaM0p2ZFhBZ1BTQmNJbFZRTDA1UFhDSXBJQ1UrSlZ4dUlDQm1hV3gwWlhJb2MzUnlYM1J2WDJ4dmQyVnlLR05sYkd4VWVYQmxLU0E5UFNCY0ltVnRZbko1YjI1cFl5QnpkR1Z0SUdObGJHeGNJaWtnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NWWmhiSFZsSUR3Z1lXeHdhR0VwSUNVK0pTQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dVpuZHlhWFJsS0hSaUxuVndibThnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWXlneU5Dd2dNVFlzSURJd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQTBMQ0F5TlN3Z05TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdOeXdnT0N3Z09Td2dNVEFzSURFeExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXhNaXdnTVRNc0lERTBLU2tzSUdobGNtVW9iRzlzWVVScGNpd2dYQ0pNVDB4QlgyUlVRVWRmZG5OZlJFMVRUMTlrYVdabU1DNHlYM1Z3Ym05ZllYUmhZMTl3ZFdJdWRITjJYQ0lwTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1WEc1MFlpNWtiM2R1SUR3dElHWnlaV0ZrS0dobGNtVW9iRzlzWVVScGNpd2dYQ0pNVDB4QlgyUlVRVWRmZG5OZlJFMVRUMTlrYVdabU1DNHlYMlJ2ZDI1ZllYUmhZeTUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGV1lXeDFaVXh2WnlBOUlDMXNiMmN4TUNoeFZtRnNkV1VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkeWIzVndJRDBnWENKRVQxZE9YQ0lwSUNVK0pWeHVJQ0JtYVd4MFpYSW9jM1J5WDNSdlgyeHZkMlZ5S0dObGJHeFVlWEJsS1NBOVBTQmNJbVZ0WW5KNWIyNXBZeUJ6ZEdWdElHTmxiR3hjSWlrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKU0JrY0d4NWNqbzZaM0p2ZFhCZllua29kR0Z5WjJWMEtTQWxQaVZjYmlBZ2MyeHBZMlZmYldsdUtHMWxZVzVTYm1zc0lIZHBkR2hmZEdsbGN5QTlJRVpCVEZORktWeHVabmR5YVhSbEtIUmlMbVJ2ZDI0Z0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1l5Z3lOQ3dnTVRZc0lESXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0EwTENBeU5Td2dOU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTnl3Z09Dd2dPU3dnTVRBc0lERXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F4TWl3Z01UTXNJREUwS1Nrc0lHaGxjbVVvYkc5c1lVUnBjaXdnWENKTVQweEJYMlJVUVVkZmRuTmZSRTFUVDE5a2FXWm1NQzR5WDJSdmQyNWZZWFJoWTE5d2RXSXVkSE4yWENJcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVhHNWNiblJsYlhBdWRYQnVieUE4TFNCMFlpNTFjRzV2SUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYjJSa2MxSmhkR2x2TENCeFZtRnNkV1ZNYjJjc0lHZHliM1Z3S1Z4dWRHVnRjQzVrYjNkdUlEd3RJSFJpTG1SdmQyNGdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHNJSEZXWVd4MVpVeHZaeXdnWjNKdmRYQXBYRzVjYm5SbGJYQWdQQzBnWW1sdVpGOXliM2R6S0hSbGJYQXVkWEJ1Ynl3Z2RHVnRjQzVrYjNkdUtWeHVYRzRqSUc5eVpHVnlJRHd0SUdNb0tIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWENKVlVDOU9UMXdpS1NBbFBpVWdZWEp5WVc1blpTaGtaWE5qS0c5a1pITlNZWFJwYnlrcEtTUjBZWEpuWlhRc0lGeHVJeUFnSUNBZ0lDQWdJQ0FnSUNoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRndpUkU5WFRsd2lLU0FsUGlVZ1lYSnlZVzVuWlNoa1pYTmpLRzlrWkhOU1lYUnBieWtwS1NSMFlYSm5aWFFwWEc1Y2JpTWdkR1Z0Y0NSMFlYSm5aWFFnUEMwZ1ptRmpkRzl5S0hSbGJYQWtkR0Z5WjJWMExDQnNaWFpsYkhNZ1BTQnlaWFlvYjNKa1pYSXBLVnh1ZEdWdGNDUm5jbTkxY0NBOExTQm1ZV04wYjNJb2RHVnRjQ1JuY205MWNDd2diR1YyWld4eklEMGdZeWhjSWxWUUwwNVBYQ0lzSUZ3aVJFOVhUbHdpS1NsY2JseHVkR0Z5WjJWMFRHbHpkQ0E4TFNCaktGd2lVRTlNVWpKQlhDSXNJRndpUTFSU09Wd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpUVVaR05Gd2lMQ0JjSWtWTVRESmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWsxRlJERmNJaXdnWENKTlJVUXhNbHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVZFSlFYQ0lzSUZ3aVZFRkdNVndpTENCY0lsUkJSak5jSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lrVXlSakZjSWl3Z1hDSlpXVEZjSWl3Z1hDSk9TVkJDVEZ3aUxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJa1ZRTXpBd1hDSXNJRndpUkZCWk16QmNJaXdnWENKVFJWUkVRakZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lsSkJSREl4WENJc0lGd2lVMDFETVVGY0lpd2dYQ0pUVFVNelhDSXNJRndpUTFSRFJsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpVTFWYU1USmNJaXdnWENKUVNFWXhPVndpWEc0cFhHNTBaVzF3SUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvZEdGeVoyVjBJQ1ZwYmlVZ2RHRnlaMlYwVEdsemRDbGNiblJsYlhBa2RHRnlaMlYwSUR3dElHWmhZM1J2Y2loMFpXMXdKSFJoY21kbGRDd2diR1YyWld4eklEMGdjbVYyS0hSaGNtZGxkRXhwYzNRcEtWeHVYRzVjYm5GV1lXeDFaVXh2WjAxaGVDQThMU0ExTUZ4dWRHVnRjRElnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2h4Vm1Gc2RXVk1iMmNnUFNCdGFXNG9jVlpoYkhWbFRHOW5MQ0J4Vm1Gc2RXVk1iMmROWVhncEtWeHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdNaXdnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUhSaGNtZGxkQ3dnWm1sc2JDQTlJRzlrWkhOU1lYUnBieXdnYzJsNlpTQTlJSEZXWVd4MVpVeHZaeWtwSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2h6YUdGd1pTQTlJREl4TENBZ0lDQWdJQ0FnSXlCRmJuTjFjbVZ6SUdFZ2NHOXBiblFnZDJsMGFDQmhiaUJ2ZFhSc2FXNWxYRzRnSUNBZ0lDQWdJQ0FnSUNBZ2MzUnliMnRsSUQwZ01TcHdkRlJ2VFUwZ0lDQWdJQ0FqSUV4cGJtVWdkMmxrZEdnZ1ptOXlJSFJvWlNCaWIzSmtaWEpjYmlBZ0tTQXJJSFJvWlcxbFgySjNLQ2tnS3lCY2JpQWdjMk5oYkdWZmMybDZaVjlqYjI1MGFXNTFiM1Z6S0hKaGJtZGxJRDBnWXlnd0xqVXNJRElwS1NBcklDQWpJRk5sZENCdGFXNGdZVzVrSUcxaGVDQndiMmx1ZENCemFYcGxjeUJvWlhKbFhHNGdJSE5qWVd4bFgyWnBiR3hmWjNKaFpHbGxiblFvYkc5M0lEMGdYQ0ozYUdsMFpWd2lMQ0JvYVdkb0lEMGdYQ0lqUTBJek16TkJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x0YVhSeklEMGdZeWd4TENBektTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmIySWdQU0J6WTJGc1pYTTZPbk54ZFdsemFDd2dJeUJFWldacGJtVWdaM0poWkdsbGJuUWdZMjlzYjNKelhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjNWcFpHVWdQU0JuZFdsa1pWOWpiMnh2Y21KaGNpaGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhjbmRwWkhSb0lEMGdNUzQxTHpVdU1EZ3NJQ0FqSUVGa2FuVnpkQ0IzYVdSMGFDQnZaaUIwYUdVZ1kyOXNiM0lnWW1GeVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlYSm9aV2xuYUhRZ1BTQXhOUzgxTGpBNElDQWdJeUJCWkdwMWMzUWdhR1ZwWjJoMElHOW1JSFJvWlNCamIyeHZjaUJpWVhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FwWEc0Z0lDa2dLeUJjYmlBZ2JHRmljeWg0SUQwZ1RsVk1UQ3dnZVNBOUlFNVZURXdwSUNBclhHNGdJSFJvWlcxbEtGeHVJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRdWVDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lDQWdJQ0FnSXlCU2IzUmhkR1VnZUMxaGVHbHpJR3hoWW1Wc2N5QTBOU0JrWldkeVpXVnpYRzRnSUNBZ0lDQm9hblZ6ZENBOUlERXNJQ0FnSUNBZ0lDTWdRV1JxZFhOMElHaHZjbWw2YjI1MFlXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUlDQWdJQ0FnZG1wMWMzUWdQU0F4SUNBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0IyWlhKMGFXTmhiQ0JxZFhOMGFXWnBZMkYwYVc5dVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjSW5SeVlXNXpjR0Z5Wlc1MFhDSXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2xjYmlNZ2NDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlIUmhjbWRsZEN3Z1kyOXNiM0lnUFNCeFZtRnNkV1ZNYjJjc0lITnBlbVVnUFNCdlpHUnpVbUYwYVc4cEtTQXJYRzRqSUNBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnZEdobGJXVmZZbmNvS1NBcklGeHVJeUFnSUhOallXeGxYM05wZW1WZlkyOXVkR2x1ZFc5MWN5aHlZVzVuWlNBOUlHTW9NU3dnTXlrcElDc2dJQ01nVTJWMElHMXBiaUJoYm1RZ2JXRjRJSEJ2YVc1MElITnBlbVZ6SUdobGNtVmNiaU1nSUNCelkyRnNaVjlqYjJ4dmNsOW5jbUZrYVdWdWRDaHNiM2NnUFNCY0ltSnNkV1ZjSWl3Z2FHbG5hQ0E5SUZ3aWNtVmtYQ0lzWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjNWcFpHVWdQU0JuZFdsa1pWOWpiMnh2Y21KaGNpaGNiaU1nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poY25kcFpIUm9JRDBnTVM0MUx6VXVNRGdzSUNBaklFRmthblZ6ZENCM2FXUjBhQ0J2WmlCMGFHVWdZMjlzYjNJZ1ltRnlYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVhKb1pXbG5hSFFnUFNBeE5TODFMakE0SUNBZ0lDTWdRV1JxZFhOMElHaGxhV2RvZENCdlppQjBhR1VnWTI5c2IzSWdZbUZ5WEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS1NrZ0sxeHVJeUFnSUd4aFluTW9lQ0E5SUU1VlRFd3NJSGtnUFNCT1ZVeE1LU0FnSzF4dUl5QWdJSFJvWlcxbEtGeHVJeUFnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpTWdJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl4Y2JpTWdJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGpJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaU1nSUNBZ0lDa3NYRzRqSUNBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGpJQ0FnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc1hHNGpJQ0FnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJeUFnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRqSUNBZ0lDQXBMRnh1SXlBZ0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRqSUNBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUNBZ0lDQWdJeUJTYjNSaGRHVWdlQzFoZUdseklHeGhZbVZzY3lBME5TQmtaV2R5WldWelhHNGpJQ0FnSUNBZ0lHaHFkWE4wSUQwZ01Td2dJQ0FnSUNBZ0l5QkJaR3AxYzNRZ2FHOXlhWHB2Ym5SaGJDQnFkWE4wYVdacFkyRjBhVzl1WEc0aklDQWdJQ0FnSUhacWRYTjBJRDBnTVNBZ0lDQWdJQ0FnSXlCQlpHcDFjM1FnZG1WeWRHbGpZV3dnYW5WemRHbG1hV05oZEdsdmJseHVJeUFnSUNBZ0tTeGNiaU1nSUNBZ0lHRjRhWE11YkdsdVpTQTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpTWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpeGNiaU1nSUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0aklDQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGpJQ0FnSUNBcExGeHVJeUFnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpTWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpeGNiaU1nSUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0aklDQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGpJQ0FnSUNBcExGeHVJeUFnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYQ0owY21GdWMzQmhjbVZ1ZEZ3aUtTeGNiaU1nSUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaU1nSUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5bGNiaU1nSUNBcFhHNWNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW1GdVkyaHZja3hQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZUMUpmY1ZaaGJIVmxYM0psWjBGdVkyaHZja0poWTJ0bmNtOTFibVJmWVhSaFkxOTFjRzV2WENJcFhHNTNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NUzQxS1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3hMamtwS20xdFZHOUpibU5vWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbiMgUlVOTklORyBMT0xBXG5sb2xhRGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHQvbG9sYVxcKVxuZGlyLmNyZWF0ZShsb2xhRGlyLCBzaG93V2FybmluZ3MgPSBGQUxTRSwgcmVjdXJzaXZlID0gVFJVRSlcblxuIyBVUFxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IudXAsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBfYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbiMgTk9cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLm5vLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG4jIFVQTk9cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLnVwbm8sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBub19hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBET1dOXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5kb3duLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2Rvd25fYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cblxuIyMjIEhFQVRNQVBcbmFscGhhIDwtIDAuMDVcbnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3VwX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9ub19hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRlbXAudXAgPC0gdGIudXAgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLnVwKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfdXBcXClcbnRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLm5vKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1Jfbm9cXClcbnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5kb3duKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfZG93blxcKVxuXG5cbnRlbXAgPC0gZnVsbF9qb2luKGZ1bGxfam9pbih0ZW1wLnVwLCB0ZW1wLm5vLCBieSA9IGMoXFx0YXJnZXRcXCkpLCB0ZW1wLmRvd24sIGJ5ID0gYyhcXHRhcmdldFxcKSkgJT4lIG11dGF0ZV9hbGwofnJlcGxhY2VfbmEoLiwgMSkpXG5cbmRhdGEgPC0gYXMubWF0cml4KHRlbXBbMjo0XSlcbnJvd25hbWVzKGRhdGEpIDwtIHRlbXAkdGFyZ2V0XG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYyhtaW4oZGF0YSksIG1heChkYXRhKSksIGMoXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuXG4jZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gXFx3c3NcXClcblxuIyBwIDwtIEhlYXRtYXAoXG4jICAgZGF0YSxcbiMgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmRcbiMgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbVxuIyAgIHJvd19rbSA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgICMgRGVmaW5lIHRoZSBudW1iZXIgb2Ygay1tZWFucyBjbHVzdGVycyBmb3Igcm93cyAoYWRqdXN0IGFzIG5lZWRlZClcbiMgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4jICAgY29sID0gY29sX2Z1biAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgdGhlIHJlZCBncmFkaWVudCBjb2xvciBzY2FsZVxuIyApXG4jIFxuIyBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3JlZ0FuY2hvckJhY2tncm91bmRfYXRhY1xcKVxuIyBoZWlnaHQgPC0gN1xuIyB3aWR0aCA8LSAzLjVcbiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMgXG5cblxuIyMjIFZpc3VhbGl6aW5nIHAtdmFsdWUgYW5kIE9SXG5hbHBoYSA8LSAwLjA1XG4jIHRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3VwX2F0YWMudHN2XFwpKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuIyAgICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiMgICAgICAgICAgICAgICAgIGdyb3VwID0gXFxVUFxcKSAlPiVcbiMgICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4jICAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuIyAgIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbiMgdGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfbm9fYXRhYy50c3ZcXCkpICU+JVxuIyAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4jICAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuIyAgICAgICAgICAgICAgICAgZ3JvdXAgPSBcXE5PXFwpICU+JVxuIyAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4jICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50Yi51cG5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3Vwbm9fYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxVUC9OT1xcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbmZ3cml0ZSh0Yi51cG5vICU+JSBkcGx5cjo6c2VsZWN0KGMoMjQsIDE2LCAyMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMjUsIDUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIDgsIDksIDEwLCAxMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDEzLCAxNCkpLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl91cG5vX2F0YWNfcHViLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMTAocVZhbHVlKSxcbiAgICAgICAgICAgICAgICBncm91cCA9IFxcRE9XTlxcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbmZ3cml0ZSh0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KGMoMjQsIDE2LCAyMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMjUsIDUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIDgsIDksIDEwLCAxMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDEzLCAxNCkpLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWNfcHViLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuXG50ZW1wLnVwbm8gPC0gdGIudXBubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxuXG50ZW1wIDwtIGJpbmRfcm93cyh0ZW1wLnVwbm8sIHRlbXAuZG93bilcblxuIyBvcmRlciA8LSBjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcVVAvTk9cXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0LCBcbiMgICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXERPV05cXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0KVxuXG4jIHRlbXAkdGFyZ2V0IDwtIGZhY3Rvcih0ZW1wJHRhcmdldCwgbGV2ZWxzID0gcmV2KG9yZGVyKSlcbnRlbXAkZ3JvdXAgPC0gZmFjdG9yKHRlbXAkZ3JvdXAsIGxldmVscyA9IGMoXFxVUC9OT1xcLCBcXERPV05cXCkpXG5cbnRhcmdldExpc3QgPC0gYyhcXFBPTFIyQVxcLCBcXENUUjlcXCxcbiAgICAgICAgICAgICAgICBcXEFGRjRcXCwgXFxFTEwyXFwsXG4gICAgICAgICAgICAgICAgXFxNRUQxXFwsIFxcTUVEMTJcXCxcbiAgICAgICAgICAgICAgICBcXFRCUFxcLCBcXFRBRjFcXCwgXFxUQUYzXFwsXG4gICAgICAgICAgICAgICAgXFxFMkYxXFwsIFxcWVkxXFwsIFxcTklQQkxcXCwgXG4gICAgICAgICAgICAgICAgXFxFUDMwMFxcLCBcXERQWTMwXFwsIFxcU0VUREIxXFwsXG4gICAgICAgICAgICAgICAgXFxSQUQyMVxcLCBcXFNNQzFBXFwsIFxcU01DM1xcLCBcXENUQ0ZcXCxcbiAgICAgICAgICAgICAgICBcXFNVWjEyXFwsIFxcUEhGMTlcXFxuKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHRhcmdldCAlaW4lIHRhcmdldExpc3QpXG50ZW1wJHRhcmdldCA8LSBmYWN0b3IodGVtcCR0YXJnZXQsIGxldmVscyA9IHJldih0YXJnZXRMaXN0KSlcblxuXG5xVmFsdWVMb2dNYXggPC0gNTBcbnRlbXAyIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUocVZhbHVlTG9nID0gbWluKHFWYWx1ZUxvZywgcVZhbHVlTG9nTWF4KSlcblxucCA8LSBnZ3Bsb3QodGVtcDIsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGZpbGwgPSBvZGRzUmF0aW8sIHNpemUgPSBxVmFsdWVMb2cpKSArXG4gIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZVxuICAgICAgICAgICAgIHN0cm9rZSA9IDEqcHRUb01NICAgICAgIyBMaW5lIHdpZHRoIGZvciB0aGUgYm9yZGVyXG4gICkgKyB0aGVtZV9idygpICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9IFxcd2hpdGVcXCwgaGlnaCA9IFxcI0NCMzMzQVxcLFxuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICsgXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG4jIHAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGNvbG9yID0gcVZhbHVlTG9nLCBzaXplID0gb2Rkc1JhdGlvKSkgK1xuIyAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBcbiMgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDMpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlXG4jICAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gXFxibHVlXFwsIGhpZ2ggPSBcXHJlZFxcLFxuIyAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4jICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuIyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuIyAgICAgICAgICAgICAgICAgICAgICAgICkpICtcbiMgICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICtcbiMgICB0aGVtZShcbiMgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4jICAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4jICAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuIyAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4jICAgICApLFxuIyAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuIyAgICAgICBzaXplID0gZm9udFNpemVTLFxuIyAgICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiMgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuIyAgICAgKSxcbiMgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuIyAgICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuIyAgICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuIyAgICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiMgICAgICksXG4jICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4jICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4jICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuIyAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuIyAgICAgKSxcbiMgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4jICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4jICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuIyAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuIyAgICAgKSxcbiMgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4jICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4jICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4jICAgKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX09SX3FWYWx1ZV9yZWdBbmNob3JCYWNrZ3JvdW5kX2F0YWNfdXBub1xcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS45KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# RUNNING LOLA
lolaDir <- here(\../../result/lola\)
dir.create(lolaDir, showWarnings = FALSE, recursive = TRUE)

# UP
result = runLOLA(anchor.up, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_atac.tsv\), sep = \\t\)

# NO
result = runLOLA(anchor.no, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_atac.tsv\), sep = \\t\)

# UPNO
result = runLOLA(anchor.upno, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_upno_atac.tsv\), sep = \\t\)

# DOWN
result = runLOLA(anchor.down, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_atac.tsv\), sep = \\t\)


### HEATMAP
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio)
colnames(temp.up) <- c(\target\, \OR_up\)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio)
colnames(temp.no) <- c(\target\, \OR_no\)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio)
colnames(temp.down) <- c(\target\, \OR_down\)


temp <- full_join(full_join(temp.up, temp.no, by = c(\target\)), temp.down, by = c(\target\)) %>% mutate_all(~replace_na(., 1))

data <- as.matrix(temp[2:4])
rownames(data) <- temp$target

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

# p <- Heatmap(
#   data,
#   name = \Odds Ratio\,                   # Name of the heatmap legend
#   cluster_columns = FALSE,            # Remove column dendrogram
#   row_km = 4,                         # Define the number of k-means clusters for rows (adjust as needed)
#   show_row_dend = FALSE,
#   col = col_fun                       # Use the red gradient color scale
# )
# 
# fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_diff0.2_regAnchorBackground_atac\)
# height <- 7
# width <- 3.5
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()
# 


### Visualizing p-value and OR
alpha <- 0.05
# tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \UP\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)
# tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \NO\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)

tb.upno <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_upno_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log10(qValue),
                group = \UP/NO\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
fwrite(tb.upno %>% dplyr::select(c(24, 16, 20,
                                   4, 25, 5,
                                   7, 8, 9, 10, 11,
                                   12, 13, 14)), here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_upno_atac_pub.tsv\), sep = \\t\)

tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log10(qValue),
                group = \DOWN\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
fwrite(tb.down %>% dplyr::select(c(24, 16, 20,
                                   4, 25, 5,
                                   7, 8, 9, 10, 11,
                                   12, 13, 14)), here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_atac_pub.tsv\), sep = \\t\)


temp.upno <- tb.upno %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio, qValueLog, group)

temp <- bind_rows(temp.upno, temp.down)

# order <- c((temp %>% dplyr::filter(group == \UP/NO\) %>% arrange(desc(oddsRatio)))$target, 
#            (temp %>% dplyr::filter(group == \DOWN\) %>% arrange(desc(oddsRatio)))$target)

# temp$target <- factor(temp$target, levels = rev(order))
temp$group <- factor(temp$group, levels = c(\UP/NO\, \DOWN\))

targetList <- c(\POLR2A\, \CTR9\,
                \AFF4\, \ELL2\,
                \MED1\, \MED12\,
                \TBP\, \TAF1\, \TAF3\,
                \E2F1\, \YY1\, \NIPBL\, 
                \EP300\, \DPY30\, \SETDB1\,
                \RAD21\, \SMC1A\, \SMC3\, \CTCF\,
                \SUZ12\, \PHF19\
)
temp <- temp %>% dplyr::filter(target %in% targetList)
temp$target <- factor(temp$target, levels = rev(targetList))


qValueLogMax <- 50
temp2 <- temp %>% dplyr::mutate(qValueLog = min(qValueLog, qValueLogMax))

p <- ggplot(temp2, aes(x = group, y = target, fill = oddsRatio, size = qValueLog)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = \white\, high = \#CB333A\,
                      limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )
# p <- ggplot(temp, aes(x = group, y = target, color = qValueLog, size = oddsRatio)) +
#   geom_point() + theme_bw() + 
#   scale_size_continuous(range = c(1, 3)) +  # Set min and max point sizes here
#   scale_color_gradient(low = \blue\, high = \red\,
#                        guide = guide_colorbar(
#                          barwidth = 1.5/5.08,  # Adjust width of the color bar
#                          barheight = 15/5.08    # Adjust height of the color bar
#                        )) +
#   labs(x = NULL, y = NULL)  +
#   theme(
#     axis.title = element_text(
#       size = fontSizeS,
#       family = fontType,
#       color = \#000000\
#     ),
#     axis.text = element_text(
#       size = fontSizeS,
#       family = fontType,
#       color = \#000000\
#     ),
#     axis.text.x = element_text(
#       angle = 45,      # Rotate x-axis labels 45 degrees
#       hjust = 1,       # Adjust horizontal justification
#       vjust = 1        # Adjust vertical justification
#     ),
#     axis.line = element_line(
#       color = \#000000\,
#       size = lineThick*mmToLineUnit,
#       lineend = \square\
#     ),
#     axis.ticks = element_line(
#       color = \#000000\,
#       size = lineThick*mmToLineUnit,
#       lineend = \square\
#     ),
#     panel.background = element_rect(fill = \transparent\),
#     legend.text = element_text(family = fontType, size = fontSizeS),
#     legend.title = element_text(family = fontType, size = fontSizeS)
#   )

fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_diff0.2_OR_qValue_regAnchorBackground_atac_upno\)
width <- panelSize(1.5)*mmToInch
height <- panelSize(1.9)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QlNWVTVPU1U1SElFeFBURUZjYm14dmJHRkVhWElnUEMwZ2FHVnlaU2hjWEM0dUx5NHVMM0psYzNWc2RDOXNiMnhoWEZ3cFhHNWthWEl1WTNKbFlYUmxLR3h2YkdGRWFYSXNJSE5vYjNkWFlYSnVhVzVuY3lBOUlFWkJURk5GTENCeVpXTjFjbk5wZG1VZ1BTQlVVbFZGS1Z4dVhHNGpJRlZRWEc1eVpYTjFiSFFnUFNCeWRXNU1UMHhCS0dGdVkyaHZjaTUxY0N3Z1lXNWphRzl5TG1Gc2JDd2diRzlzWVVSQ0tWeHVkR0lnUFNCaGMxOTBhV0ppYkdVb2NtVnpkV3gwS1Z4dVpuZHlhWFJsS0hSaUxDQm9aWEpsS0d4dmJHRkVhWElzSUZ4Y1RFOU1RVjlrVkVGSFgzWnpYMFJOVTA5ZlpHbG1aakF1TWw5MWNGOWhkR0ZqTG5SemRseGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDbGNibHh1SXlCT1QxeHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdWJtOHNJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYm5SaUlEMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNibVozY21sMFpTaDBZaXdnYUdWeVpTaHNiMnhoUkdseUxDQmNYRXhQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZibTlmWVhSaFl5NTBjM1pjWENrc0lITmxjQ0E5SUZ4Y1hGeDBYRndwWEc1Y2JpTWdWVkJPVDF4dWNtVnpkV3gwSUQwZ2NuVnVURTlNUVNoaGJtTm9iM0l1ZFhCdWJ5d2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVabmR5YVhSbEtIUmlMQ0JvWlhKbEtHeHZiR0ZFYVhJc0lGeGNURTlNUVY5a1ZFRkhYM1p6WDBSTlUwOWZaR2xtWmpBdU1sOTFjRzV2WDJGMFlXTXVkSE4yWEZ3cExDQnpaWEFnUFNCY1hGeGNkRnhjS1Z4dVhHNGpJRVJQVjA1Y2JuSmxjM1ZzZENBOUlISjFia3hQVEVFb1lXNWphRzl5TG1SdmQyNHNJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYm5SaUlEMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNibVozY21sMFpTaDBZaXdnYUdWeVpTaHNiMnhoUkdseUxDQmNYRXhQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZaRzkzYmw5aGRHRmpMblJ6ZGx4Y0tTd2djMlZ3SUQwZ1hGeGNYSFJjWENsY2JseHVYRzRqSXlNZ1NFVkJWRTFCVUZ4dVlXeHdhR0VnUEMwZ01DNHdOVnh1ZEdJdWRYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoc2IyeGhSR2x5TENCY1hFeFBURUZmWkZSQlIxOTJjMTlFVFZOUFgyUnBabVl3TGpKZmRYQmZZWFJoWXk1MGMzWmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtIUmhjbWRsZENBOUlIUnZkWEJ3WlhJb1lXNTBhV0p2WkhrcEtTQWxQaVZjYmlBZ1ptbHNkR1Z5S0hOMGNsOTBiMTlzYjNkbGNpaGpaV3hzVkhsd1pTa2dQVDBnWEZ4bGJXSnllVzl1YVdNZ2MzUmxiU0JqWld4c1hGd3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlVZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGdJSE5zYVdObFgyMXBiaWh0WldGdVVtNXJMQ0IzYVhSb1gzUnBaWE1nUFNCR1FVeFRSU2xjYm5SaUxtNXZJRHd0SUdaeVpXRmtLR2hsY21Vb2JHOXNZVVJwY2l3Z1hGeE1UMHhCWDJSVVFVZGZkbk5mUkUxVFQxOWthV1ptTUM0eVgyNXZYMkYwWVdNdWRITjJYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTa2dKVDRsWEc0Z0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ4Y1pXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGeGNLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bElHUndiSGx5T2pwbmNtOTFjRjlpZVNoMFlYSm5aWFFwSUNVK0pWeHVJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc1MFlpNWtiM2R1SUR3dElHWnlaV0ZrS0dobGNtVW9iRzlzWVVScGNpd2dYRnhNVDB4QlgyUlVRVWRmZG5OZlJFMVRUMTlrYVdabU1DNHlYMlJ2ZDI1ZllYUmhZeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwS1NBbFBpVmNiaUFnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYRnhsYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWEZ3cElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVVnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNibHh1ZEdWdGNDNTFjQ0E4TFNCMFlpNTFjQ0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJRzlrWkhOU1lYUnBieWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXVkWEFwSUR3dElHTW9YRngwWVhKblpYUmNYQ3dnWEZ4UFVsOTFjRnhjS1Z4dWRHVnRjQzV1YnlBOExTQjBZaTV1YnlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUc5a1pITlNZWFJwYnlsY2JtTnZiRzVoYldWektIUmxiWEF1Ym04cElEd3RJR01vWEZ4MFlYSm5aWFJjWEN3Z1hGeFBVbDl1YjF4Y0tWeHVkR1Z0Y0M1a2IzZHVJRHd0SUhSaUxtUnZkMjRnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0J2WkdSelVtRjBhVzhwWEc1amIyeHVZVzFsY3loMFpXMXdMbVJ2ZDI0cElEd3RJR01vWEZ4MFlYSm5aWFJjWEN3Z1hGeFBVbDlrYjNkdVhGd3BYRzVjYmx4dWRHVnRjQ0E4TFNCbWRXeHNYMnB2YVc0b1puVnNiRjlxYjJsdUtIUmxiWEF1ZFhBc0lIUmxiWEF1Ym04c0lHSjVJRDBnWXloY1hIUmhjbWRsZEZ4Y0tTa3NJSFJsYlhBdVpHOTNiaXdnWW5rZ1BTQmpLRnhjZEdGeVoyVjBYRndwS1NBbFBpVWdiWFYwWVhSbFgyRnNiQ2grY21Wd2JHRmpaVjl1WVNndUxDQXhLU2xjYmx4dVpHRjBZU0E4TFNCaGN5NXRZWFJ5YVhnb2RHVnRjRnN5T2pSZEtWeHVjbTkzYm1GdFpYTW9aR0YwWVNrZ1BDMGdkR1Z0Y0NSMFlYSm5aWFJjYmx4dWJHbGljbUZ5ZVNoamFYSmpiR2w2WlNsY2JtTnZiRjltZFc0Z1BDMGdZMjlzYjNKU1lXMXdNaWhqS0cxcGJpaGtZWFJoS1N3Z2JXRjRLR1JoZEdFcEtTd2dZeWhjWEhkb2FYUmxYRndzSUZ4Y2NtVmtYRndwS1Z4dVhHNWNiaU5tZG1sNlgyNWlZMngxYzNRb1pHRjBZU3dnYTIxbFlXNXpMQ0J0WlhSb2IyUWdQU0JjWEhkemMxeGNLVnh1WEc0aklIQWdQQzBnU0dWaGRHMWhjQ2hjYmlNZ0lDQmtZWFJoTEZ4dUl5QWdJRzVoYldVZ1BTQmNYRTlrWkhNZ1VtRjBhVzljWEN3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5Qk9ZVzFsSUc5bUlIUm9aU0JvWldGMGJXRndJR3hsWjJWdVpGeHVJeUFnSUdOc2RYTjBaWEpmWTI5c2RXMXVjeUE5SUVaQlRGTkZMQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1VtVnRiM1psSUdOdmJIVnRiaUJrWlc1a2NtOW5jbUZ0WEc0aklDQWdjbTkzWDJ0dElEMGdOQ3dnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJFWldacGJtVWdkR2hsSUc1MWJXSmxjaUJ2WmlCckxXMWxZVzV6SUdOc2RYTjBaWEp6SUdadmNpQnliM2R6SUNoaFpHcDFjM1FnWVhNZ2JtVmxaR1ZrS1Z4dUl5QWdJSE5vYjNkZmNtOTNYMlJsYm1RZ1BTQkdRVXhUUlN4Y2JpTWdJQ0JqYjJ3Z1BTQmpiMnhmWm5WdUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUZWelpTQjBhR1VnY21Wa0lHZHlZV1JwWlc1MElHTnZiRzl5SUhOallXeGxYRzRqSUNsY2JpTWdYRzRqSUdacGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hHRnVZMmh2Y2t4UFRFRmZaRlJCUjE5MmMxOUVUVk5QWDJScFptWXdMakpmY21WblFXNWphRzl5UW1GamEyZHliM1Z1WkY5aGRHRmpYRndwWEc0aklHaGxhV2RvZENBOExTQTNYRzRqSUhkcFpIUm9JRHd0SURNdU5WeHVJeUJ3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGpJSEJ5YVc1MEtIQXBYRzRqSUdSbGRpNXZabVlvS1Z4dUl5QnpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRqSUhCeWFXNTBLSEFwWEc0aklHUmxkaTV2Wm1Zb0tWeHVJeUJjYmx4dVhHNGpJeU1nVm1semRXRnNhWHBwYm1jZ2NDMTJZV3gxWlNCaGJtUWdUMUpjYm1Gc2NHaGhJRHd0SURBdU1EVmNiaU1nZEdJdWRYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoc2IyeGhSR2x5TENCY1hFeFBURUZmWkZSQlIxOTJjMTlFVFZOUFgyUnBabVl3TGpKZmRYQmZZWFJoWXk1MGMzWmNYQ2twSUNVK0pWeHVJeUFnSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0Z5WjJWMElEMGdkRzkxY0hCbGNpaGhiblJwWW05a2VTa3NYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J4Vm1Gc2RXVk1iMmNnUFNBdGJHOW5NaWh4Vm1Gc2RXVXBMRnh1SXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjNKdmRYQWdQU0JjWEZWUVhGd3BJQ1UrSlZ4dUl5QWdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGeGNaVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRnhjS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVVnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0aklDQWdjMnhwWTJWZmJXbHVLRzFsWVc1U2Jtc3NJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLVnh1SXlCMFlpNXVieUE4TFNCbWNtVmhaQ2hvWlhKbEtHeHZiR0ZFYVhJc0lGeGNURTlNUVY5a1ZFRkhYM1p6WDBSTlUwOWZaR2xtWmpBdU1sOXViMTloZEdGakxuUnpkbHhjS1NrZ0pUNGxYRzRqSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU3hjYmlNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGV1lXeDFaVXh2WnlBOUlDMXNiMmN5S0hGV1lXeDFaU2tzWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbmNtOTFjQ0E5SUZ4Y1RrOWNYQ2tnSlQ0bFhHNGpJQ0FnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYRnhsYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWEZ3cElDVStKVnh1SXlBZ0lHUndiSGx5T2pwbWFXeDBaWElvY1ZaaGJIVmxJRHdnWVd4d2FHRXBJQ1UrSlNCa2NHeDVjam82WjNKdmRYQmZZbmtvZEdGeVoyVjBLU0FsUGlWY2JpTWdJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc1Y2JuUmlMblZ3Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hzYjJ4aFJHbHlMQ0JjWEV4UFRFRmZaRlJCUjE5MmMxOUVUVk5QWDJScFptWXdMakpmZFhCdWIxOWhkR0ZqTG5SemRseGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2RHRnlaMlYwSUQwZ2RHOTFjSEJsY2loaGJuUnBZbTlrZVNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NWWmhiSFZsVEc5bklEMGdMV3h2WnpFd0tIRldZV3gxWlNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ozSnZkWEFnUFNCY1hGVlFMMDVQWEZ3cElDVStKVnh1SUNCbWFXeDBaWElvYzNSeVgzUnZYMnh2ZDJWeUtHTmxiR3hVZVhCbEtTQTlQU0JjWEdWdFluSjViMjVwWXlCemRHVnRJR05sYkd4Y1hDa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY1ZaaGJIVmxJRHdnWVd4d2FHRXBJQ1UrSlNCa2NHeDVjam82WjNKdmRYQmZZbmtvZEdGeVoyVjBLU0FsUGlWY2JpQWdjMnhwWTJWZmJXbHVLRzFsWVc1U2Jtc3NJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLVnh1Wm5keWFYUmxLSFJpTG5Wd2JtOGdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWd5TkN3Z01UWXNJREl3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBMExDQXlOU3dnTlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ055d2dPQ3dnT1N3Z01UQXNJREV4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBeE1pd2dNVE1zSURFMEtTa3NJR2hsY21Vb2JHOXNZVVJwY2l3Z1hGeE1UMHhCWDJSVVFVZGZkbk5mUkUxVFQxOWthV1ptTUM0eVgzVndibTlmWVhSaFkxOXdkV0l1ZEhOMlhGd3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVYRzUwWWk1a2IzZHVJRHd0SUdaeVpXRmtLR2hsY21Vb2JHOXNZVVJwY2l3Z1hGeE1UMHhCWDJSVVFVZGZkbk5mUkUxVFQxOWthV1ptTUM0eVgyUnZkMjVmWVhSaFl5NTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoY21kbGRDQTlJSFJ2ZFhCd1pYSW9ZVzUwYVdKdlpIa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEZXWVd4MVpVeHZaeUE5SUMxc2IyY3hNQ2h4Vm1Gc2RXVXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2R5YjNWd0lEMGdYRnhFVDFkT1hGd3BJQ1UrSlZ4dUlDQm1hV3gwWlhJb2MzUnlYM1J2WDJ4dmQyVnlLR05sYkd4VWVYQmxLU0E5UFNCY1hHVnRZbko1YjI1cFl5QnpkR1Z0SUdObGJHeGNYQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NWWmhiSFZsSUR3Z1lXeHdhR0VwSUNVK0pTQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dVpuZHlhWFJsS0hSaUxtUnZkMjRnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWXlneU5Dd2dNVFlzSURJd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQTBMQ0F5TlN3Z05TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdOeXdnT0N3Z09Td2dNVEFzSURFeExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXhNaXdnTVRNc0lERTBLU2tzSUdobGNtVW9iRzlzWVVScGNpd2dYRnhNVDB4QlgyUlVRVWRmZG5OZlJFMVRUMTlrYVdabU1DNHlYMlJ2ZDI1ZllYUmhZMTl3ZFdJdWRITjJYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1WEc1Y2JuUmxiWEF1ZFhCdWJ5QThMU0IwWWk1MWNHNXZJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSFJoY21kbGRDd2diMlJrYzFKaGRHbHZMQ0J4Vm1Gc2RXVk1iMmNzSUdkeWIzVndLVnh1ZEdWdGNDNWtiM2R1SUR3dElIUmlMbVJ2ZDI0Z0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4c0lIRldZV3gxWlV4dlp5d2daM0p2ZFhBcFhHNWNiblJsYlhBZ1BDMGdZbWx1WkY5eWIzZHpLSFJsYlhBdWRYQnVieXdnZEdWdGNDNWtiM2R1S1Z4dVhHNGpJRzl5WkdWeUlEd3RJR01vS0hSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdYRnhWVUM5T1QxeGNLU0FsUGlVZ1lYSnlZVzVuWlNoa1pYTmpLRzlrWkhOU1lYUnBieWtwS1NSMFlYSm5aWFFzSUZ4dUl5QWdJQ0FnSUNBZ0lDQWdJQ2gwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlGeGNSRTlYVGx4Y0tTQWxQaVVnWVhKeVlXNW5aU2hrWlhOaktHOWtaSE5TWVhScGJ5a3BLU1IwWVhKblpYUXBYRzVjYmlNZ2RHVnRjQ1IwWVhKblpYUWdQQzBnWm1GamRHOXlLSFJsYlhBa2RHRnlaMlYwTENCc1pYWmxiSE1nUFNCeVpYWW9iM0prWlhJcEtWeHVkR1Z0Y0NSbmNtOTFjQ0E4TFNCbVlXTjBiM0lvZEdWdGNDUm5jbTkxY0N3Z2JHVjJaV3h6SUQwZ1l5aGNYRlZRTDA1UFhGd3NJRnhjUkU5WFRseGNLU2xjYmx4dWRHRnlaMlYwVEdsemRDQThMU0JqS0Z4Y1VFOU1VakpCWEZ3c0lGeGNRMVJTT1Z4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNRVVpHTkZ4Y0xDQmNYRVZNVERKY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRTFGUkRGY1hDd2dYRnhOUlVReE1seGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjVkVKUVhGd3NJRnhjVkVGR01WeGNMQ0JjWEZSQlJqTmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEVVeVJqRmNYQ3dnWEZ4WldURmNYQ3dnWEZ4T1NWQkNURnhjTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hFVlFNekF3WEZ3c0lGeGNSRkJaTXpCY1hDd2dYRnhUUlZSRVFqRmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEZKQlJESXhYRndzSUZ4Y1UwMURNVUZjWEN3Z1hGeFRUVU16WEZ3c0lGeGNRMVJEUmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNVMVZhTVRKY1hDd2dYRnhRU0VZeE9WeGNYRzRwWEc1MFpXMXdJRHd0SUhSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9kR0Z5WjJWMElDVnBiaVVnZEdGeVoyVjBUR2x6ZENsY2JuUmxiWEFrZEdGeVoyVjBJRHd0SUdaaFkzUnZjaWgwWlcxd0pIUmhjbWRsZEN3Z2JHVjJaV3h6SUQwZ2NtVjJLSFJoY21kbGRFeHBjM1FwS1Z4dVhHNWNibkZXWVd4MVpVeHZaMDFoZUNBOExTQTFNRnh1ZEdWdGNESWdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaHhWbUZzZFdWTWIyY2dQU0J0YVc0b2NWWmhiSFZsVEc5bkxDQnhWbUZzZFdWTWIyZE5ZWGdwS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd01pd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJSFJoY21kbGRDd2dabWxzYkNBOUlHOWtaSE5TWVhScGJ5d2djMmw2WlNBOUlIRldZV3gxWlV4dlp5a3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDaHphR0Z3WlNBOUlESXhMQ0FnSUNBZ0lDQWdJeUJGYm5OMWNtVnpJR0VnY0c5cGJuUWdkMmwwYUNCaGJpQnZkWFJzYVc1bFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnYzNSeWIydGxJRDBnTVNwd2RGUnZUVTBnSUNBZ0lDQWpJRXhwYm1VZ2QybGtkR2dnWm05eUlIUm9aU0JpYjNKa1pYSmNiaUFnS1NBcklIUm9aVzFsWDJKM0tDa2dLeUJjYmlBZ2MyTmhiR1ZmYzJsNlpWOWpiMjUwYVc1MWIzVnpLSEpoYm1kbElEMGdZeWd3TGpVc0lESXBLU0FySUNBaklGTmxkQ0J0YVc0Z1lXNWtJRzFoZUNCd2IybHVkQ0J6YVhwbGN5Qm9aWEpsWEc0Z0lITmpZV3hsWDJacGJHeGZaM0poWkdsbGJuUW9iRzkzSUQwZ1hGeDNhR2wwWlZ4Y0xDQm9hV2RvSUQwZ1hGd2pRMEl6TXpOQlhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHRhWFJ6SUQwZ1l5Z3hMQ0F6S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2YjJJZ1BTQnpZMkZzWlhNNk9uTnhkV2x6YUN3Z0l5QkVaV1pwYm1VZ1ozSmhaR2xsYm5RZ1kyOXNiM0p6WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaM1ZwWkdVZ1BTQm5kV2xrWlY5amIyeHZjbUpoY2loY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaGNuZHBaSFJvSUQwZ01TNDFMelV1TURnc0lDQWpJRUZrYW5WemRDQjNhV1IwYUNCdlppQjBhR1VnWTI5c2IzSWdZbUZ5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVhKb1pXbG5hSFFnUFNBeE5TODFMakE0SUNBZ0l5QkJaR3AxYzNRZ2FHVnBaMmgwSUc5bUlIUm9aU0JqYjJ4dmNpQmlZWEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXBYRzRnSUNrZ0t5QmNiaUFnYkdGaWN5aDRJRDBnVGxWTVRDd2dlU0E5SUU1VlRFd3BJQ0FyWEc0Z0lIUm9aVzFsS0Z4dUlDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUNBZ0lDQWdJeUJTYjNSaGRHVWdlQzFoZUdseklHeGhZbVZzY3lBME5TQmtaV2R5WldWelhHNGdJQ0FnSUNCb2FuVnpkQ0E5SURFc0lDQWdJQ0FnSUNNZ1FXUnFkWE4wSUdodmNtbDZiMjUwWVd3Z2FuVnpkR2xtYVdOaGRHbHZibHh1SUNBZ0lDQWdkbXAxYzNRZ1BTQXhJQ0FnSUNBZ0lDQWpJRUZrYW5WemRDQjJaWEowYVdOaGJDQnFkWE4wYVdacFkyRjBhVzl1WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNYSFJ5WVc1emNHRnlaVzUwWEZ3cExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDbGNiaU1nY0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUhSaGNtZGxkQ3dnWTI5c2IzSWdQU0J4Vm1Gc2RXVk1iMmNzSUhOcGVtVWdQU0J2WkdSelVtRjBhVzhwS1NBclhHNGpJQ0FnWjJWdmJWOXdiMmx1ZENncElDc2dkR2hsYldWZlluY29LU0FySUZ4dUl5QWdJSE5qWVd4bFgzTnBlbVZmWTI5dWRHbHVkVzkxY3loeVlXNW5aU0E5SUdNb01Td2dNeWtwSUNzZ0lDTWdVMlYwSUcxcGJpQmhibVFnYldGNElIQnZhVzUwSUhOcGVtVnpJR2hsY21WY2JpTWdJQ0J6WTJGc1pWOWpiMnh2Y2w5bmNtRmthV1Z1ZENoc2IzY2dQU0JjWEdKc2RXVmNYQ3dnYUdsbmFDQTlJRnhjY21Wa1hGd3NYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaM1ZwWkdVZ1BTQm5kV2xrWlY5amIyeHZjbUpoY2loY2JpTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhjbmRwWkhSb0lEMGdNUzQxTHpVdU1EZ3NJQ0FqSUVGa2FuVnpkQ0IzYVdSMGFDQnZaaUIwYUdVZ1kyOXNiM0lnWW1GeVhHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZWEpvWldsbmFIUWdQU0F4TlM4MUxqQTRJQ0FnSUNNZ1FXUnFkWE4wSUdobGFXZG9kQ0J2WmlCMGFHVWdZMjlzYjNJZ1ltRnlYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLU2tnSzF4dUl5QWdJR3hoWW5Nb2VDQTlJRTVWVEV3c0lIa2dQU0JPVlV4TUtTQWdLMXh1SXlBZ0lIUm9aVzFsS0Z4dUl5QWdJQ0FnWVhocGN5NTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlNZ0lDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlNZ0lDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0aklDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpTWdJQ0FnSUNrc1hHNGpJQ0FnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0aklDQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zWEc0aklDQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUl5QWdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGpJQ0FnSUNBcExGeHVJeUFnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGpJQ0FnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJQ0FnSUNBZ0l5QlNiM1JoZEdVZ2VDMWhlR2x6SUd4aFltVnNjeUEwTlNCa1pXZHlaV1Z6WEc0aklDQWdJQ0FnSUdocWRYTjBJRDBnTVN3Z0lDQWdJQ0FnSXlCQlpHcDFjM1FnYUc5eWFYcHZiblJoYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRqSUNBZ0lDQWdJSFpxZFhOMElEMGdNU0FnSUNBZ0lDQWdJeUJCWkdwMWMzUWdkbVZ5ZEdsallXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUl5QWdJQ0FnS1N4Y2JpTWdJQ0FnSUdGNGFYTXViR2x1WlNBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlNZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN4Y2JpTWdJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRqSUNBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0aklDQWdJQ0FwTEZ4dUl5QWdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlNZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN4Y2JpTWdJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRqSUNBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0aklDQWdJQ0FwTEZ4dUl5QWdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hGeDBjbUZ1YzNCaGNtVnVkRnhjS1N4Y2JpTWdJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpTWdJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlsY2JpTWdJQ0FwWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYR0Z1WTJodmNreFBURUZmWkZSQlIxOTJjMTlFVFZOUFgyUnBabVl3TGpKZlQxSmZjVlpoYkhWbFgzSmxaMEZ1WTJodmNrSmhZMnRuY205MWJtUmZZWFJoWTE5MWNHNXZYRndwWEc1M2FXUjBhQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNDFLU3B0YlZSdlNXNWphRnh1YUdWcFoyaDBJRHd0SUhCaGJtVnNVMmw2WlNneExqa3BLbTF0Vkc5SmJtTm9YRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbiMgUlVOTklORyBMT0xBXG5sb2xhRGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHQvbG9sYVxcKVxuZGlyLmNyZWF0ZShsb2xhRGlyLCBzaG93V2FybmluZ3MgPSBGQUxTRSwgcmVjdXJzaXZlID0gVFJVRSlcblxuIyBVUFxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IudXAsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBfYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbiMgTk9cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLm5vLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG4jIFVQTk9cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLnVwbm8sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBub19hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBET1dOXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5kb3duLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2Rvd25fYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cblxuIyMjIEhFQVRNQVBcbmFscGhhIDwtIDAuMDVcbnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3VwX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9ub19hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRlbXAudXAgPC0gdGIudXAgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLnVwKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfdXBcXClcbnRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLm5vKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1Jfbm9cXClcbnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5kb3duKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfZG93blxcKVxuXG5cbnRlbXAgPC0gZnVsbF9qb2luKGZ1bGxfam9pbih0ZW1wLnVwLCB0ZW1wLm5vLCBieSA9IGMoXFx0YXJnZXRcXCkpLCB0ZW1wLmRvd24sIGJ5ID0gYyhcXHRhcmdldFxcKSkgJT4lIG11dGF0ZV9hbGwofnJlcGxhY2VfbmEoLiwgMSkpXG5cbmRhdGEgPC0gYXMubWF0cml4KHRlbXBbMjo0XSlcbnJvd25hbWVzKGRhdGEpIDwtIHRlbXAkdGFyZ2V0XG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYyhtaW4oZGF0YSksIG1heChkYXRhKSksIGMoXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuXG4jZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gXFx3c3NcXClcblxuIyBwIDwtIEhlYXRtYXAoXG4jICAgZGF0YSxcbiMgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmRcbiMgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbVxuIyAgIHJvd19rbSA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgICMgRGVmaW5lIHRoZSBudW1iZXIgb2Ygay1tZWFucyBjbHVzdGVycyBmb3Igcm93cyAoYWRqdXN0IGFzIG5lZWRlZClcbiMgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4jICAgY29sID0gY29sX2Z1biAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgdGhlIHJlZCBncmFkaWVudCBjb2xvciBzY2FsZVxuIyApXG4jIFxuIyBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3JlZ0FuY2hvckJhY2tncm91bmRfYXRhY1xcKVxuIyBoZWlnaHQgPC0gN1xuIyB3aWR0aCA8LSAzLjVcbiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMgXG5cblxuIyMjIFZpc3VhbGl6aW5nIHAtdmFsdWUgYW5kIE9SXG5hbHBoYSA8LSAwLjA1XG4jIHRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3VwX2F0YWMudHN2XFwpKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuIyAgICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiMgICAgICAgICAgICAgICAgIGdyb3VwID0gXFxVUFxcKSAlPiVcbiMgICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4jICAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuIyAgIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbiMgdGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfbm9fYXRhYy50c3ZcXCkpICU+JVxuIyAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4jICAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuIyAgICAgICAgICAgICAgICAgZ3JvdXAgPSBcXE5PXFwpICU+JVxuIyAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4jICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50Yi51cG5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3Vwbm9fYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxVUC9OT1xcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbmZ3cml0ZSh0Yi51cG5vICU+JSBkcGx5cjo6c2VsZWN0KGMoMjQsIDE2LCAyMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMjUsIDUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIDgsIDksIDEwLCAxMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDEzLCAxNCkpLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl91cG5vX2F0YWNfcHViLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMTAocVZhbHVlKSxcbiAgICAgICAgICAgICAgICBncm91cCA9IFxcRE9XTlxcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbmZ3cml0ZSh0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KGMoMjQsIDE2LCAyMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMjUsIDUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIDgsIDksIDEwLCAxMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDEzLCAxNCkpLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWNfcHViLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuXG50ZW1wLnVwbm8gPC0gdGIudXBubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxuXG50ZW1wIDwtIGJpbmRfcm93cyh0ZW1wLnVwbm8sIHRlbXAuZG93bilcblxuIyBvcmRlciA8LSBjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcVVAvTk9cXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0LCBcbiMgICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXERPV05cXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0KVxuXG4jIHRlbXAkdGFyZ2V0IDwtIGZhY3Rvcih0ZW1wJHRhcmdldCwgbGV2ZWxzID0gcmV2KG9yZGVyKSlcbnRlbXAkZ3JvdXAgPC0gZmFjdG9yKHRlbXAkZ3JvdXAsIGxldmVscyA9IGMoXFxVUC9OT1xcLCBcXERPV05cXCkpXG5cbnRhcmdldExpc3QgPC0gYyhcXFBPTFIyQVxcLCBcXENUUjlcXCxcbiAgICAgICAgICAgICAgICBcXEFGRjRcXCwgXFxFTEwyXFwsXG4gICAgICAgICAgICAgICAgXFxNRUQxXFwsIFxcTUVEMTJcXCxcbiAgICAgICAgICAgICAgICBcXFRCUFxcLCBcXFRBRjFcXCwgXFxUQUYzXFwsXG4gICAgICAgICAgICAgICAgXFxFMkYxXFwsIFxcWVkxXFwsIFxcTklQQkxcXCwgXG4gICAgICAgICAgICAgICAgXFxFUDMwMFxcLCBcXERQWTMwXFwsIFxcU0VUREIxXFwsXG4gICAgICAgICAgICAgICAgXFxSQUQyMVxcLCBcXFNNQzFBXFwsIFxcU01DM1xcLCBcXENUQ0ZcXCxcbiAgICAgICAgICAgICAgICBcXFNVWjEyXFwsIFxcUEhGMTlcXFxuKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHRhcmdldCAlaW4lIHRhcmdldExpc3QpXG50ZW1wJHRhcmdldCA8LSBmYWN0b3IodGVtcCR0YXJnZXQsIGxldmVscyA9IHJldih0YXJnZXRMaXN0KSlcblxuXG5xVmFsdWVMb2dNYXggPC0gNTBcbnRlbXAyIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUocVZhbHVlTG9nID0gbWluKHFWYWx1ZUxvZywgcVZhbHVlTG9nTWF4KSlcblxucCA8LSBnZ3Bsb3QodGVtcDIsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGZpbGwgPSBvZGRzUmF0aW8sIHNpemUgPSBxVmFsdWVMb2cpKSArXG4gIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZVxuICAgICAgICAgICAgIHN0cm9rZSA9IDEqcHRUb01NICAgICAgIyBMaW5lIHdpZHRoIGZvciB0aGUgYm9yZGVyXG4gICkgKyB0aGVtZV9idygpICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9IFxcd2hpdGVcXCwgaGlnaCA9IFxcI0NCMzMzQVxcLFxuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICsgXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG4jIHAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGNvbG9yID0gcVZhbHVlTG9nLCBzaXplID0gb2Rkc1JhdGlvKSkgK1xuIyAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBcbiMgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDMpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlXG4jICAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gXFxibHVlXFwsIGhpZ2ggPSBcXHJlZFxcLFxuIyAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4jICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuIyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuIyAgICAgICAgICAgICAgICAgICAgICAgICkpICtcbiMgICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICtcbiMgICB0aGVtZShcbiMgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4jICAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4jICAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuIyAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4jICAgICApLFxuIyAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuIyAgICAgICBzaXplID0gZm9udFNpemVTLFxuIyAgICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiMgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuIyAgICAgKSxcbiMgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuIyAgICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuIyAgICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuIyAgICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiMgICAgICksXG4jICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4jICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4jICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuIyAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuIyAgICAgKSxcbiMgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4jICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4jICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuIyAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuIyAgICAgKSxcbiMgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4jICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4jICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4jICAgKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX09SX3FWYWx1ZV9yZWdBbmNob3JCYWNrZ3JvdW5kX2F0YWNfdXBub1xcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS45KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBSVU5OSU5HIExPTEFcbmxvbGFEaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdC9sb2xhXFwpXG5kaXIuY3JlYXRlKGxvbGFEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKVxuXG4jIFVQXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci51cCwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl91cF9hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBOT1xucmVzdWx0ID0gcnVuTE9MQShhbmNob3Iubm8sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfbm9fYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbiMgVVBOT1xucmVzdWx0ID0gcnVuTE9MQShhbmNob3IudXBubywgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl91cG5vX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG4jIERPV05cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmRvd24sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfZG93bl9hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuXG4jIyMgSEVBVE1BUFxuYWxwaGEgPC0gMC4wNVxudGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2Rvd25fYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAudXApIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl91cFxcKVxudGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAubm8pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9ub1xcKVxudGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmRvd24pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9kb3duXFwpXG5cblxudGVtcCA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAudXAsIHRlbXAubm8sIGJ5ID0gYyhcXHRhcmdldFxcKSksIHRlbXAuZG93biwgYnkgPSBjKFxcdGFyZ2V0XFwpKSAlPiUgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcblxuZGF0YSA8LSBhcy5tYXRyaXgodGVtcFsyOjRdKVxucm93bmFtZXMoZGF0YSkgPC0gdGVtcCR0YXJnZXRcblxubGlicmFyeShjaXJjbGl6ZSlcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKG1pbihkYXRhKSwgbWF4KGRhdGEpKSwgYyhcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5cbiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSBcXHdzc1xcKVxuXG4jIHAgPC0gSGVhdG1hcChcbiMgICBkYXRhLFxuIyAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZFxuIyAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4jICAgcm93X2ttID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAgIyBEZWZpbmUgdGhlIG51bWJlciBvZiBrLW1lYW5zIGNsdXN0ZXJzIGZvciByb3dzIChhZGp1c3QgYXMgbmVlZGVkKVxuIyAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiMgICBjb2wgPSBjb2xfZnVuICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSB0aGUgcmVkIGdyYWRpZW50IGNvbG9yIHNjYWxlXG4jIClcbiMgXG4jIGZpbGVOYW1lIDwtIHBhc3RlMChcXGFuY2hvckxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG4jIGhlaWdodCA8LSA3XG4jIHdpZHRoIDwtIDMuNVxuIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuIyBcblxuXG4jIyMgVmlzdWFsaXppbmcgcC12YWx1ZSBhbmQgT1JcbmFscGhhIDwtIDAuMDVcbiMgdGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBfYXRhYy50c3ZcXCkpICU+JVxuIyAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4jICAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuIyAgICAgICAgICAgICAgICAgZ3JvdXAgPSBcXFVQXFwpICU+JVxuIyAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4jICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuIyB0Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9ub19hdGFjLnRzdlxcKSkgJT4lXG4jICAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiMgICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4jICAgICAgICAgICAgICAgICBncm91cCA9IFxcTk9cXCkgJT4lXG4jICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuIyAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiMgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRiLnVwbm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBub19hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4gICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzEwKHFWYWx1ZSksXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBcXFVQL05PXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuZndyaXRlKHRiLnVwbm8gJT4lIGRwbHlyOjpzZWxlY3QoYygyNCwgMTYsIDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAyNSwgNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgOCwgOSwgMTAsIDExLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgMTMsIDE0KSksIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3Vwbm9fYXRhY19wdWIudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG50Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2Rvd25fYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxET1dOXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuZndyaXRlKHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QoYygyNCwgMTYsIDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAyNSwgNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgOCwgOSwgMTAsIDExLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgMTMsIDE0KSksIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2Rvd25fYXRhY19wdWIudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cbnRlbXAudXBubyA8LSB0Yi51cG5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxudGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG5cbnRlbXAgPC0gYmluZF9yb3dzKHRlbXAudXBubywgdGVtcC5kb3duKVxuXG4jIG9yZGVyIDwtIGMoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxVUC9OT1xcKSAlPiUgYXJyYW5nZShkZXNjKG9kZHNSYXRpbykpKSR0YXJnZXQsIFxuIyAgICAgICAgICAgICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcRE9XTlxcKSAlPiUgYXJyYW5nZShkZXNjKG9kZHNSYXRpbykpKSR0YXJnZXQpXG5cbiMgdGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYob3JkZXIpKVxudGVtcCRncm91cCA8LSBmYWN0b3IodGVtcCRncm91cCwgbGV2ZWxzID0gYyhcXFVQL05PXFwsIFxcRE9XTlxcKSlcblxudGFyZ2V0TGlzdCA8LSBjKFxcUE9MUjJBXFwsIFxcQ1RSOVxcLFxuICAgICAgICAgICAgICAgIFxcQUZGNFxcLCBcXEVMTDJcXCxcbiAgICAgICAgICAgICAgICBcXE1FRDFcXCwgXFxNRUQxMlxcLFxuICAgICAgICAgICAgICAgIFxcVEJQXFwsIFxcVEFGMVxcLCBcXFRBRjNcXCxcbiAgICAgICAgICAgICAgICBcXEUyRjFcXCwgXFxZWTFcXCwgXFxOSVBCTFxcLCBcbiAgICAgICAgICAgICAgICBcXEVQMzAwXFwsIFxcRFBZMzBcXCwgXFxTRVREQjFcXCxcbiAgICAgICAgICAgICAgICBcXFJBRDIxXFwsIFxcU01DMUFcXCwgXFxTTUMzXFwsIFxcQ1RDRlxcLFxuICAgICAgICAgICAgICAgIFxcU1VaMTJcXCwgXFxQSEYxOVxcXG4pXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIodGFyZ2V0ICVpbiUgdGFyZ2V0TGlzdClcbnRlbXAkdGFyZ2V0IDwtIGZhY3Rvcih0ZW1wJHRhcmdldCwgbGV2ZWxzID0gcmV2KHRhcmdldExpc3QpKVxuXG5cbnFWYWx1ZUxvZ01heCA8LSA1MFxudGVtcDIgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShxVmFsdWVMb2cgPSBtaW4ocVZhbHVlTG9nLCBxVmFsdWVMb2dNYXgpKVxuXG5wIDwtIGdncGxvdCh0ZW1wMiwgYWVzKHggPSBncm91cCwgeSA9IHRhcmdldCwgZmlsbCA9IG9kZHNSYXRpbywgc2l6ZSA9IHFWYWx1ZUxvZykpICtcbiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lXG4gICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0gICAgICAjIExpbmUgd2lkdGggZm9yIHRoZSBib3JkZXJcbiAgKSArIHRoZW1lX2J3KCkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjUsIDIpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlXG4gIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gXFx3aGl0ZVxcLCBoaWdoID0gXFwjQ0IzMzNBXFwsXG4gICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLCAzKSxcbiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcbiMgcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IHRhcmdldCwgY29sb3IgPSBxVmFsdWVMb2csIHNpemUgPSBvZGRzUmF0aW8pKSArXG4jICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIFxuIyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgMykpICsgICMgU2V0IG1pbiBhbmQgbWF4IHBvaW50IHNpemVzIGhlcmVcbiMgICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXGJsdWVcXCwgaGlnaCA9IFxccmVkXFwsXG4jICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihcbiMgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4jICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4jICAgICAgICAgICAgICAgICAgICAgICAgKSkgK1xuIyAgIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgK1xuIyAgIHRoZW1lKFxuIyAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiMgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiMgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4jICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiMgICAgICksXG4jICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4jICAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4jICAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuIyAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4jICAgICApLFxuIyAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4jICAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4jICAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4jICAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuIyAgICAgKSxcbiMgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiMgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiMgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4jICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4jICAgICApLFxuIyAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiMgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiMgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4jICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4jICAgICApLFxuIyAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiMgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiMgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiMgICApXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGFuY2hvckxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfT1JfcVZhbHVlX3JlZ0FuY2hvckJhY2tncm91bmRfYXRhY191cG5vXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjkpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
# RUNNING LOLA
lolaDir <- here(\../../result/lola\)
dir.create(lolaDir, showWarnings = FALSE, recursive = TRUE)

# UP
result = runLOLA(anchor.up, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_atac.tsv\), sep = \\t\)

# NO
result = runLOLA(anchor.no, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_atac.tsv\), sep = \\t\)

# UPNO
result = runLOLA(anchor.upno, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_upno_atac.tsv\), sep = \\t\)

# DOWN
result = runLOLA(anchor.down, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_atac.tsv\), sep = \\t\)


### HEATMAP
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio)
colnames(temp.up) <- c(\target\, \OR_up\)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio)
colnames(temp.no) <- c(\target\, \OR_no\)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio)
colnames(temp.down) <- c(\target\, \OR_down\)


temp <- full_join(full_join(temp.up, temp.no, by = c(\target\)), temp.down, by = c(\target\)) %>% mutate_all(~replace_na(., 1))

data <- as.matrix(temp[2:4])
rownames(data) <- temp$target

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

# p <- Heatmap(
#   data,
#   name = \Odds Ratio\,                   # Name of the heatmap legend
#   cluster_columns = FALSE,            # Remove column dendrogram
#   row_km = 4,                         # Define the number of k-means clusters for rows (adjust as needed)
#   show_row_dend = FALSE,
#   col = col_fun                       # Use the red gradient color scale
# )
# 
# fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_diff0.2_regAnchorBackground_atac\)
# height <- 7
# width <- 3.5
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()
# 


### Visualizing p-value and OR
alpha <- 0.05
# tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \UP\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)
# tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \NO\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)

tb.upno <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_upno_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log10(qValue),
                group = \UP/NO\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
fwrite(tb.upno %>% dplyr::select(c(24, 16, 20,
                                   4, 25, 5,
                                   7, 8, 9, 10, 11,
                                   12, 13, 14)), here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_upno_atac_pub.tsv\), sep = \\t\)

tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log10(qValue),
                group = \DOWN\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
fwrite(tb.down %>% dplyr::select(c(24, 16, 20,
                                   4, 25, 5,
                                   7, 8, 9, 10, 11,
                                   12, 13, 14)), here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_atac_pub.tsv\), sep = \\t\)


temp.upno <- tb.upno %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio, qValueLog, group)

temp <- bind_rows(temp.upno, temp.down)

# order <- c((temp %>% dplyr::filter(group == \UP/NO\) %>% arrange(desc(oddsRatio)))$target, 
#            (temp %>% dplyr::filter(group == \DOWN\) %>% arrange(desc(oddsRatio)))$target)

# temp$target <- factor(temp$target, levels = rev(order))
temp$group <- factor(temp$group, levels = c(\UP/NO\, \DOWN\))

targetList <- c(\POLR2A\, \CTR9\,
                \AFF4\, \ELL2\,
                \MED1\, \MED12\,
                \TBP\, \TAF1\, \TAF3\,
                \E2F1\, \YY1\, \NIPBL\, 
                \EP300\, \DPY30\, \SETDB1\,
                \RAD21\, \SMC1A\, \SMC3\, \CTCF\,
                \SUZ12\, \PHF19\
)
temp <- temp %>% dplyr::filter(target %in% targetList)
temp$target <- factor(temp$target, levels = rev(targetList))


qValueLogMax <- 50
temp2 <- temp %>% dplyr::mutate(qValueLog = min(qValueLog, qValueLogMax))

p <- ggplot(temp2, aes(x = group, y = target, fill = oddsRatio, size = qValueLog)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = \white\, high = \#CB333A\,
                      limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )
# p <- ggplot(temp, aes(x = group, y = target, color = qValueLog, size = oddsRatio)) +
#   geom_point() + theme_bw() + 
#   scale_size_continuous(range = c(1, 3)) +  # Set min and max point sizes here
#   scale_color_gradient(low = \blue\, high = \red\,
#                        guide = guide_colorbar(
#                          barwidth = 1.5/5.08,  # Adjust width of the color bar
#                          barheight = 15/5.08    # Adjust height of the color bar
#                        )) +
#   labs(x = NULL, y = NULL)  +
#   theme(
#     axis.title = element_text(
#       size = fontSizeS,
#       family = fontType,
#       color = \#000000\
#     ),
#     axis.text = element_text(
#       size = fontSizeS,
#       family = fontType,
#       color = \#000000\
#     ),
#     axis.text.x = element_text(
#       angle = 45,      # Rotate x-axis labels 45 degrees
#       hjust = 1,       # Adjust horizontal justification
#       vjust = 1        # Adjust vertical justification
#     ),
#     axis.line = element_line(
#       color = \#000000\,
#       size = lineThick*mmToLineUnit,
#       lineend = \square\
#     ),
#     axis.ticks = element_line(
#       color = \#000000\,
#       size = lineThick*mmToLineUnit,
#       lineend = \square\
#     ),
#     panel.background = element_rect(fill = \transparent\),
#     legend.text = element_text(family = fontType, size = fontSizeS),
#     legend.title = element_text(family = fontType, size = fontSizeS)
#   )

fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_diff0.2_OR_qValue_regAnchorBackground_atac_upno\)
width <- panelSize(1.5)*mmToInch
height <- panelSize(1.9)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### dTAG
##### - Limiting to ATAC-seq signal, reg loop background

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSURJME1UQXhOU0JVWlhOMGFXNW5JRzl1SUhOMVluTmxkQ0J2WmlCc2IyOXdjMXh1WVc1amFHOXlMbU14SUR3dElHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWpiSFZ6ZEdWeU1TbGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVl6RXNJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVZekVnUEMwZ2NHbHVkR1Z5YzJWamRDaGhibU5vYjNJdVl6RmJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzSUdGMFlXTXVaM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhTbGNibHh1WVc1amFHOXlMbU15SUR3dElHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWpiSFZ6ZEdWeU1pbGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVl6SXNJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVZeklnUEMwZ2NHbHVkR1Z5YzJWamRDaGhibU5vYjNJdVl6SmJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzSUdGMFlXTXVaM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhTbGNibHh1WVc1amFHOXlMbU16SUR3dElHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWpiSFZ6ZEdWeU15bGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVl6TXNJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVZek1nUEMwZ2NHbHVkR1Z5YzJWamRDaGhibU5vYjNJdVl6TmJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzSUdGMFlXTXVaM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhTbGNibHh1WVc1amFHOXlMbU0wSUR3dElHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWpiSFZ6ZEdWeU5DbGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVl6UXNJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVZelFnUEMwZ2NHbHVkR1Z5YzJWamRDaGhibU5vYjNJdVl6UmJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzSUdGMFlXTXVaM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhTbGNibHh1WVc1amFHOXlMbU0xSUR3dElHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWpiSFZ6ZEdWeU5TbGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVl6VXNJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVZelVnUEMwZ2NHbHVkR1Z5YzJWamRDaGhibU5vYjNJdVl6VmJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzSUdGMFlXTXVaM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhTbGNibHh1WVc1amFHOXlMbU0ySUR3dElHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWpiSFZ6ZEdWeU5pbGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVl6WXNJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVZellnUEMwZ2NHbHVkR1Z5YzJWamRDaGhibU5vYjNJdVl6WmJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzSUdGMFlXTXVaM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhTbGNibHh1WVc1amFHOXlMbU0zSUR3dElHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWpiSFZ6ZEdWeU55bGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVl6Y3NJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVZemNnUEMwZ2NHbHVkR1Z5YzJWamRDaGhibU5vYjNJdVl6ZGJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzSUdGMFlXTXVaM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhTbGNibHh1WVc1amFHOXlMbU00SUR3dElHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWpiSFZ6ZEdWeU9DbGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVl6Z3NJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVZemdnUEMwZ2NHbHVkR1Z5YzJWamRDaGhibU5vYjNJdVl6aGJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzSUdGMFlXTXVaM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhTbGNibHh1Y21WemRXeDBJRDBnY25WdVRFOU1RU2hoYm1Ob2IzSXVZekVzSUdGdVkyaHZjaTVoYkd3c0lHeHZiR0ZFUWlsY2JuUmlMbU14SUQwZ1lYTmZkR2xpWW14bEtISmxjM1ZzZENsY2JseHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdVl6SXNJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYm5SaUxtTXlJRDBnWVhOZmRHbGlZbXhsS0hKbGMzVnNkQ2xjYmx4dWNtVnpkV3gwSUQwZ2NuVnVURTlNUVNoaGJtTm9iM0l1WXpNc0lHRnVZMmh2Y2k1aGJHd3NJR3h2YkdGRVFpbGNiblJpTG1NeklEMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNibHh1Y21WemRXeDBJRDBnY25WdVRFOU1RU2hoYm1Ob2IzSXVZelFzSUdGdVkyaHZjaTVoYkd3c0lHeHZiR0ZFUWlsY2JuUmlMbU0wSUQwZ1lYTmZkR2xpWW14bEtISmxjM1ZzZENsY2JuSmxjM1ZzZENBOUlISjFia3hQVEVFb1lXNWphRzl5TG1NMUxDQmhibU5vYjNJdVlXeHNMQ0JzYjJ4aFJFSXBYRzUwWWk1ak5TQTlJR0Z6WDNScFltSnNaU2h5WlhOMWJIUXBYRzVjYm5KbGMzVnNkQ0E5SUhKMWJreFBURUVvWVc1amFHOXlMbU0yTENCaGJtTm9iM0l1WVd4c0xDQnNiMnhoUkVJcFhHNTBZaTVqTmlBOUlHRnpYM1JwWW1Kc1pTaHlaWE4xYkhRcFhHNWNibkpsYzNWc2RDQTlJSEoxYmt4UFRFRW9ZVzVqYUc5eUxtTTNMQ0JoYm1Ob2IzSXVZV3hzTENCc2IyeGhSRUlwWEc1MFlpNWpOeUE5SUdGelgzUnBZbUpzWlNoeVpYTjFiSFFwWEc1Y2JuSmxjM1ZzZENBOUlISjFia3hQVEVFb1lXNWphRzl5TG1NNExDQmhibU5vYjNJdVlXeHNMQ0JzYjJ4aFJFSXBYRzUwWWk1ak9DQTlJR0Z6WDNScFltSnNaU2h5WlhOMWJIUXBYRzVjYmlNakl5QklSVUZVVFVGUVhHNWhiSEJvWVNBOExTQXdMakExWEc1MFlpNWpNU0E4TFNCMFlpNWpNU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1NrZ0pUNGxYRzRnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRndpWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ3aUtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh4Vm1Gc2RXVWdQQ0JoYkhCb1lTa2dKVDRsSUdSd2JIbHlPanBuY205MWNGOWllU2gwWVhKblpYUXBJQ1UrSlZ4dUlDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzUwWWk1ak1pQThMU0IwWWk1ak1pQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU2tnSlQ0bFhHNGdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGd2laVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRndpS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaHhWbUZzZFdVZ1BDQmhiSEJvWVNrZ0pUNGxJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNTBZaTVqTXlBOExTQjBZaTVqTXlBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTa2dKVDRsWEc0Z0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ3aVpXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGd2lLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bElHUndiSGx5T2pwbmNtOTFjRjlpZVNoMFlYSm5aWFFwSUNVK0pWeHVJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc1MFlpNWpOQ0E4TFNCMFlpNWpOQ0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1NrZ0pUNGxYRzRnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRndpWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ3aUtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh4Vm1Gc2RXVWdQQ0JoYkhCb1lTa2dKVDRsSUdSd2JIbHlPanBuY205MWNGOWllU2gwWVhKblpYUXBJQ1UrSlZ4dUlDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzUwWWk1ak5TQThMU0IwWWk1ak5TQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU2tnSlQ0bFhHNGdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGd2laVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRndpS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaHhWbUZzZFdVZ1BDQmhiSEJvWVNrZ0pUNGxYRzRnSUdSd2JIbHlPanBuY205MWNGOWllU2gwWVhKblpYUXBJQ1UrSlZ4dUlDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzVjYm5SaUxtTTJJRHd0SUhSaUxtTTJJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwS1NBbFBpVmNiaUFnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYQ0psYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWENJcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGdJSE5zYVdObFgyMXBiaWh0WldGdVVtNXJMQ0IzYVhSb1gzUnBaWE1nUFNCR1FVeFRSU2xjYmx4dWRHSXVZemNnUEMwZ2RHSXVZemNnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2RHRnlaMlYwSUQwZ2RHOTFjSEJsY2loaGJuUnBZbTlrZVNrcElDVStKVnh1SUNCbWFXeDBaWElvYzNSeVgzUnZYMnh2ZDJWeUtHTmxiR3hVZVhCbEtTQTlQU0JjSW1WdFluSjViMjVwWXlCemRHVnRJR05sYkd4Y0lpa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY1ZaaGJIVmxJRHdnWVd4d2FHRXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dVhHNTBZaTVqT0NBOExTQjBZaTVqT0NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTa2dKVDRsWEc0Z0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ3aVpXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGd2lLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bFhHNGdJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNWNiblJsYlhBdVl6RWdQQzBnZEdJdVl6RWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xtTXhLU0E4TFNCaktGd2lkR0Z5WjJWMFhDSXNJRndpVDFKZll6RmNJaWxjYm5SbGJYQXVZeklnUEMwZ2RHSXVZeklnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0J2WkdSelVtRjBhVzhwWEc1amIyeHVZVzFsY3loMFpXMXdMbU15S1NBOExTQmpLRndpZEdGeVoyVjBYQ0lzSUZ3aVQxSmZZekpjSWlsY2JuUmxiWEF1WXpNZ1BDMGdkR0l1WXpNZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG1NektTQThMU0JqS0Z3aWRHRnlaMlYwWENJc0lGd2lUMUpmWXpOY0lpbGNiblJsYlhBdVl6UWdQQzBnZEdJdVl6UWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xtTTBLU0E4TFNCaktGd2lkR0Z5WjJWMFhDSXNJRndpVDFKZll6UmNJaWxjYm5SbGJYQXVZelVnUEMwZ2RHSXVZelVnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0J2WkdSelVtRjBhVzhwWEc1amIyeHVZVzFsY3loMFpXMXdMbU0xS1NBOExTQmpLRndpZEdGeVoyVjBYQ0lzSUZ3aVQxSmZZelZjSWlsY2JuUmxiWEF1WXpZZ1BDMGdkR0l1WXpZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG1NMktTQThMU0JqS0Z3aWRHRnlaMlYwWENJc0lGd2lUMUpmWXpaY0lpbGNiblJsYlhBdVl6Y2dQQzBnZEdJdVl6Y2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xtTTNLU0E4TFNCaktGd2lkR0Z5WjJWMFhDSXNJRndpVDFKZll6ZGNJaWxjYm5SbGJYQXVZemdnUEMwZ2RHSXVZemdnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0J2WkdSelVtRjBhVzhwWEc1amIyeHVZVzFsY3loMFpXMXdMbU00S1NBOExTQmpLRndpZEdGeVoyVjBYQ0lzSUZ3aVQxSmZZemhjSWlsY2JseHVkR1Z0Y0NBOExTQm1kV3hzWDJwdmFXNG9kR1Z0Y0M1ak1Td2dkR1Z0Y0M1ak1pd2dZbmtnUFNCY0luUmhjbWRsZEZ3aUtTQWxQaVZjYmlBZ1puVnNiRjlxYjJsdUtIUmxiWEF1WXpNc0lHSjVJRDBnWENKMFlYSm5aWFJjSWlrZ0pUNGxYRzRnSUdaMWJHeGZhbTlwYmloMFpXMXdMbU0wTENCaWVTQTlJRndpZEdGeVoyVjBYQ0lwSUNVK0pWeHVJQ0JtZFd4c1gycHZhVzRvZEdWdGNDNWpOU3dnWW5rZ1BTQmNJblJoY21kbGRGd2lLU0FsUGlWY2JpQWdablZzYkY5cWIybHVLSFJsYlhBdVl6WXNJR0o1SUQwZ1hDSjBZWEpuWlhSY0lpa2dKVDRsWEc0Z0lHWjFiR3hmYW05cGJpaDBaVzF3TG1NM0xDQmllU0E5SUZ3aWRHRnlaMlYwWENJcElDVStKVnh1SUNCbWRXeHNYMnB2YVc0b2RHVnRjQzVqT0N3Z1lua2dQU0JjSW5SaGNtZGxkRndpS1NBbFBpVmNiaUFnYlhWMFlYUmxYMkZzYkNoK2NtVndiR0ZqWlY5dVlTZ3VMQ0F4S1NsY2JseHVaR0YwWVNBOExTQjBaVzF3SUNVK0pTQmpiMngxYlc1ZmRHOWZjbTkzYm1GdFpYTW9YQ0owWVhKblpYUmNJaWtnSlQ0bElHRnpMbTFoZEhKcGVDZ3BYRzVjYm14cFluSmhjbmtvWTJseVkyeHBlbVVwWEc1amIyeGZablZ1SUR3dElHTnZiRzl5VW1GdGNESW9ZeWd4TENCdFlYZ29aR0YwWVNrcExDQmpLRndpZDJocGRHVmNJaXdnWENKeVpXUmNJaWtwWEc1Y2JseHVJMloyYVhwZmJtSmpiSFZ6ZENoa1lYUmhMQ0JyYldWaGJuTXNJRzFsZEdodlpDQTlJRndpZDNOelhDSXBYRzVjYm5BZ1BDMGdTR1ZoZEcxaGNDaGNiaUFnWkdGMFlTeGNiaUFnYm1GdFpTQTlJRndpVDJSa2N5QlNZWFJwYjF3aUxDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpJRTVoYldVZ2IyWWdkR2hsSUdobFlYUnRZWEFnYkdWblpXNWtYRzRnSUdOc2RYTjBaWEpmWTI5c2RXMXVjeUE5SUVaQlRGTkZMQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1VtVnRiM1psSUdOdmJIVnRiaUJrWlc1a2NtOW5jbUZ0WEc0Z0lITm9iM2RmY205M1gyUmxibVFnUFNCR1FVeFRSU3hjYmlBZ1kyOXNJRDBnWTI5c1gyWjFiaXhjYmlBZ1ltOXlaR1Z5SUQwZ1ZGSlZSVnh1S1Z4dVhHNWNiaU1nU1c1cGRHbGhiR2w2WlNCc2FYTjBjeUIwYnlCemRHOXlaU0J5WlhOMWJIUnpYRzVoYm1Ob2IzSnpJRHd0SUd4cGMzUW9LVnh1ZEdKeklEd3RJR3hwYzNRb0tWeHVkR1Z0Y0hNZ1BDMGdiR2x6ZENncFhHNWNiaU1nVUhKdlkyVnpjeUJqYkhWemRHVnljeUJqTVNCMGJ5QmpPRnh1Wm05eUlDaHBJR2x1SURFNk5Da2dlMXh1SUNBaklFVjRkSEpoWTNRZ1lXNWphRzl5WEc0Z0lHeHZiM0JmWTJ4MWMzUmxjaUE4TFNCblpYUW9jR0Z6ZEdVd0tGd2liRzl2Y0M1amJIVnpkR1Z5WENJc0lHa3BLVnh1SUNCaGJtTm9iM0lnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d1gyTnNkWE4wWlhJcFhHNGdJRnh1SUNBaklFWnBibVFnYjNabGNteGhjSE1nWVc1a0lHbHVkR1Z5YzJWamRGeHVJQ0J2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxDQmhkR0ZqTG1keUtWeHVJQ0JoYm1Ob2IzSWdQQzBnY0dsdWRHVnljMlZqZENoaGJtTm9iM0piY1hWbGNubElhWFJ6S0c5MlpYSnNZWEJ6S1Ywc0lHRjBZV011WjNKYmMzVmlhbVZqZEVocGRITW9iM1psY214aGNITXBYU2xjYmlBZ1hHNGdJQ01nVTNSdmNtVWdZVzVqYUc5eVhHNGdJR0Z1WTJodmNuTmJXMmxkWFNBOExTQmhibU5vYjNKY2JpQWdYRzRnSUNNZ1VuVnVJRXhQVEVGY2JpQWdjbVZ6ZFd4MElEd3RJSEoxYmt4UFRFRW9ZVzVqYUc5eUxDQmhibU5vYjNJdVlXeHNMQ0JzYjJ4aFJFSXBYRzRnSUhSaUlEd3RJR0Z6WDNScFltSnNaU2h5WlhOMWJIUXBYRzRnSUZ4dUlDQWpJRVpwYkhSbGNpQmhibVFnYzNWdGJXRnlhWHBsWEc0Z0lIUmlJRHd0SUhSaUlDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvZEdGeVoyVjBJRDBnZEc5MWNIQmxjaWhoYm5ScFltOWtlU2twSUNVK0pWeHVJQ0FnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRndpWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ3aUtTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZaM0p2ZFhCZllua29kR0Z5WjJWMEtTQWxQaVZjYmlBZ0lDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzRnSUZ4dUlDQWpJRk4wYjNKbElIUmlYRzRnSUhSaWMxdGJhVjFkSUR3dElIUmlYRzRnSUZ4dUlDQWpJRk5sYkdWamRDQmhibVFnY21WdVlXMWxJRzlrWkhOU1lYUnBiMXh1SUNCMFpXMXdJRHd0SUhSaUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2IyUmtjMUpoZEdsdktWeHVJQ0JqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z3aWRHRnlaMlYwWENJc0lIQmhjM1JsTUNoY0lrOVNYMk5jSWl3Z2FTa3BYRzRnSUZ4dUlDQWpJRk4wYjNKbElIUmxiWEJjYmlBZ2RHVnRjSE5iVzJsZFhTQThMU0IwWlcxd1hHNTlYRzVjYmlNZ1RXVnlaMlVnWVd4c0lIUmxiWEFnZEdGaWJHVnpJR2x1ZEc4Z2IyNWxYRzUwWlcxd0lEd3RJRkpsWkhWalpTaG1kVzVqZEdsdmJpaDRMQ0I1S1NCbWRXeHNYMnB2YVc0b2VDd2dlU3dnWW5rZ1BTQmNJblJoY21kbGRGd2lLU3dnZEdWdGNITXBJQ1UrSlZ4dUlDQnRkWFJoZEdWZllXeHNLSDV5WlhCc1lXTmxYMjVoS0M0c0lERXBLVnh1WkdGMFlTQThMU0IwWlcxd0lDVStKU0JqYjJ4MWJXNWZkRzlmY205M2JtRnRaWE1vWENKMFlYSm5aWFJjSWlrZ0pUNGxJR0Z6TG0xaGRISnBlQ2dwWEc1Y2JteHBZbkpoY25rb1kybHlZMnhwZW1VcFhHNWpiMnhmWm5WdUlEd3RJR052Ykc5eVVtRnRjRElvWXlneExDQnRZWGdvWkdGMFlTa3BMQ0JqS0Z3aWQyaHBkR1ZjSWl3Z1hDSnlaV1JjSWlrcFhHNWNibHh1STJaMmFYcGZibUpqYkhWemRDaGtZWFJoTENCcmJXVmhibk1zSUcxbGRHaHZaQ0E5SUZ3aWQzTnpYQ0lwWEc1Y2JuQWdQQzBnU0dWaGRHMWhjQ2hjYmlBZ1pHRjBZU3hjYmlBZ2JtRnRaU0E5SUZ3aVQyUmtjeUJTWVhScGIxd2lMQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUU1aGJXVWdiMllnZEdobElHaGxZWFJ0WVhBZ2JHVm5aVzVrWEc0Z0lHTnNkWE4wWlhKZlkyOXNkVzF1Y3lBOUlFWkJURk5GTENBZ0lDQWdJQ0FnSUNBZ0lDTWdVbVZ0YjNabElHTnZiSFZ0YmlCa1pXNWtjbTluY21GdFhHNGdJSE5vYjNkZmNtOTNYMlJsYm1RZ1BTQkdRVXhUUlN4Y2JpQWdZMjlzSUQwZ1kyOXNYMloxYml4Y2JpQWdZbTl5WkdWeUlEMGdWRkpWUlZ4dUtWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuIyMjIDI0MTAxNSBUZXN0aW5nIG9uIHN1YnNldCBvZiBsb29wc1xuYW5jaG9yLmMxIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzEsIGF0YWMuZ3IpXG5hbmNob3IuYzEgPC0gcGludGVyc2VjdChhbmNob3IuYzFbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmMyIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMilcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzIsIGF0YWMuZ3IpXG5hbmNob3IuYzIgPC0gcGludGVyc2VjdChhbmNob3IuYzJbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmMzIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMylcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzMsIGF0YWMuZ3IpXG5hbmNob3IuYzMgPC0gcGludGVyc2VjdChhbmNob3IuYzNbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM0IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNClcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzQsIGF0YWMuZ3IpXG5hbmNob3IuYzQgPC0gcGludGVyc2VjdChhbmNob3IuYzRbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM1IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzUsIGF0YWMuZ3IpXG5hbmNob3IuYzUgPC0gcGludGVyc2VjdChhbmNob3IuYzVbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM2IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNilcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzYsIGF0YWMuZ3IpXG5hbmNob3IuYzYgPC0gcGludGVyc2VjdChhbmNob3IuYzZbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM3IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNylcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzcsIGF0YWMuZ3IpXG5hbmNob3IuYzcgPC0gcGludGVyc2VjdChhbmNob3IuYzdbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM4IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyOClcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzgsIGF0YWMuZ3IpXG5hbmNob3IuYzggPC0gcGludGVyc2VjdChhbmNob3IuYzhbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzEsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmMxID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzIsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmMyID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzMsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmMzID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzQsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmM0ID0gYXNfdGliYmxlKHJlc3VsdClcbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM1LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jNSA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM2LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jNiA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM3LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jNyA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM4LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jOCA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbiMjIyBIRUFUTUFQXG5hbHBoYSA8LSAwLjA1XG50Yi5jMSA8LSB0Yi5jMSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jMiA8LSB0Yi5jMiAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jMyA8LSB0Yi5jMyAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jNCA8LSB0Yi5jNCAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jNSA8LSB0Yi5jNSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lXG4gIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRiLmM2IDwtIHRiLmM2ICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiVcbiAgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGIuYzcgPC0gdGIuYzcgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JVxuICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50Yi5jOCA8LSB0Yi5jOCAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lXG4gIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRlbXAuYzEgPC0gdGIuYzEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmMxKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzFcXClcbnRlbXAuYzIgPC0gdGIuYzIgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmMyKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzJcXClcbnRlbXAuYzMgPC0gdGIuYzMgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmMzKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzNcXClcbnRlbXAuYzQgPC0gdGIuYzQgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM0KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzRcXClcbnRlbXAuYzUgPC0gdGIuYzUgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM1KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzVcXClcbnRlbXAuYzYgPC0gdGIuYzYgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM2KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzZcXClcbnRlbXAuYzcgPC0gdGIuYzcgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM3KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzdcXClcbnRlbXAuYzggPC0gdGIuYzggJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM4KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzhcXClcblxudGVtcCA8LSBmdWxsX2pvaW4odGVtcC5jMSwgdGVtcC5jMiwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgZnVsbF9qb2luKHRlbXAuYzMsIGJ5ID0gXFx0YXJnZXRcXCkgJT4lXG4gIGZ1bGxfam9pbih0ZW1wLmM0LCBieSA9IFxcdGFyZ2V0XFwpICU+JVxuICBmdWxsX2pvaW4odGVtcC5jNSwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgZnVsbF9qb2luKHRlbXAuYzYsIGJ5ID0gXFx0YXJnZXRcXCkgJT4lXG4gIGZ1bGxfam9pbih0ZW1wLmM3LCBieSA9IFxcdGFyZ2V0XFwpICU+JVxuICBmdWxsX2pvaW4odGVtcC5jOCwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcblxuZGF0YSA8LSB0ZW1wICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoXFx0YXJnZXRcXCkgJT4lIGFzLm1hdHJpeCgpXG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygxLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1bixcbiAgYm9yZGVyID0gVFJVRVxuKVxuXG5cbiMgSW5pdGlhbGl6ZSBsaXN0cyB0byBzdG9yZSByZXN1bHRzXG5hbmNob3JzIDwtIGxpc3QoKVxudGJzIDwtIGxpc3QoKVxudGVtcHMgPC0gbGlzdCgpXG5cbiMgUHJvY2VzcyBjbHVzdGVycyBjMSB0byBjOFxuZm9yIChpIGluIDE6NCkge1xuICAjIEV4dHJhY3QgYW5jaG9yXG4gIGxvb3BfY2x1c3RlciA8LSBnZXQocGFzdGUwKFxcbG9vcC5jbHVzdGVyXFwsIGkpKVxuICBhbmNob3IgPC0gZXh0cmFjdEFuY2hvcihsb29wX2NsdXN0ZXIpXG4gIFxuICAjIEZpbmQgb3ZlcmxhcHMgYW5kIGludGVyc2VjdFxuICBvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLCBhdGFjLmdyKVxuICBhbmNob3IgPC0gcGludGVyc2VjdChhbmNob3JbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcbiAgXG4gICMgU3RvcmUgYW5jaG9yXG4gIGFuY2hvcnNbW2ldXSA8LSBhbmNob3JcbiAgXG4gICMgUnVuIExPTEFcbiAgcmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLCBhbmNob3IuYWxsLCBsb2xhREIpXG4gIHRiIDwtIGFzX3RpYmJsZShyZXN1bHQpXG4gIFxuICAjIEZpbHRlciBhbmQgc3VtbWFyaXplXG4gIHRiIDwtIHRiICU+JVxuICAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiVcbiAgICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG4gIFxuICAjIFN0b3JlIHRiXG4gIHRic1tbaV1dIDwtIHRiXG4gIFxuICAjIFNlbGVjdCBhbmQgcmVuYW1lIG9kZHNSYXRpb1xuICB0ZW1wIDwtIHRiICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuICBjb2xuYW1lcyh0ZW1wKSA8LSBjKFxcdGFyZ2V0XFwsIHBhc3RlMChcXE9SX2NcXCwgaSkpXG4gIFxuICAjIFN0b3JlIHRlbXBcbiAgdGVtcHNbW2ldXSA8LSB0ZW1wXG59XG5cbiMgTWVyZ2UgYWxsIHRlbXAgdGFibGVzIGludG8gb25lXG50ZW1wIDwtIFJlZHVjZShmdW5jdGlvbih4LCB5KSBmdWxsX2pvaW4oeCwgeSwgYnkgPSBcXHRhcmdldFxcKSwgdGVtcHMpICU+JVxuICBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKVxuZGF0YSA8LSB0ZW1wICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoXFx0YXJnZXRcXCkgJT4lIGFzLm1hdHJpeCgpXG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygxLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1bixcbiAgYm9yZGVyID0gVFJVRVxuKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
### 241015 Testing on subset of loops
anchor.c1 <- extractAnchor(loop.cluster1)
overlaps <- findOverlaps(anchor.c1, atac.gr)
anchor.c1 <- pintersect(anchor.c1[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c2 <- extractAnchor(loop.cluster2)
overlaps <- findOverlaps(anchor.c2, atac.gr)
anchor.c2 <- pintersect(anchor.c2[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c3 <- extractAnchor(loop.cluster3)
overlaps <- findOverlaps(anchor.c3, atac.gr)
anchor.c3 <- pintersect(anchor.c3[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c4 <- extractAnchor(loop.cluster4)
overlaps <- findOverlaps(anchor.c4, atac.gr)
anchor.c4 <- pintersect(anchor.c4[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c5 <- extractAnchor(loop.cluster5)
overlaps <- findOverlaps(anchor.c5, atac.gr)
anchor.c5 <- pintersect(anchor.c5[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c6 <- extractAnchor(loop.cluster6)
overlaps <- findOverlaps(anchor.c6, atac.gr)
anchor.c6 <- pintersect(anchor.c6[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c7 <- extractAnchor(loop.cluster7)
overlaps <- findOverlaps(anchor.c7, atac.gr)
anchor.c7 <- pintersect(anchor.c7[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c8 <- extractAnchor(loop.cluster8)
overlaps <- findOverlaps(anchor.c8, atac.gr)
anchor.c8 <- pintersect(anchor.c8[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

result = runLOLA(anchor.c1, anchor.all, lolaDB)
tb.c1 = as_tibble(result)

result = runLOLA(anchor.c2, anchor.all, lolaDB)
tb.c2 = as_tibble(result)

result = runLOLA(anchor.c3, anchor.all, lolaDB)
tb.c3 = as_tibble(result)

result = runLOLA(anchor.c4, anchor.all, lolaDB)
tb.c4 = as_tibble(result)
result = runLOLA(anchor.c5, anchor.all, lolaDB)
tb.c5 = as_tibble(result)

result = runLOLA(anchor.c6, anchor.all, lolaDB)
tb.c6 = as_tibble(result)

result = runLOLA(anchor.c7, anchor.all, lolaDB)
tb.c7 = as_tibble(result)

result = runLOLA(anchor.c8, anchor.all, lolaDB)
tb.c8 = as_tibble(result)

### HEATMAP
alpha <- 0.05
tb.c1 <- tb.c1 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c2 <- tb.c2 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c3 <- tb.c3 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c4 <- tb.c4 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c5 <- tb.c5 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

tb.c6 <- tb.c6 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

tb.c7 <- tb.c7 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

tb.c8 <- tb.c8 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.c1 <- tb.c1 %>% dplyr::select(target, oddsRatio)
colnames(temp.c1) <- c(\target\, \OR_c1\)
temp.c2 <- tb.c2 %>% dplyr::select(target, oddsRatio)
colnames(temp.c2) <- c(\target\, \OR_c2\)
temp.c3 <- tb.c3 %>% dplyr::select(target, oddsRatio)
colnames(temp.c3) <- c(\target\, \OR_c3\)
temp.c4 <- tb.c4 %>% dplyr::select(target, oddsRatio)
colnames(temp.c4) <- c(\target\, \OR_c4\)
temp.c5 <- tb.c5 %>% dplyr::select(target, oddsRatio)
colnames(temp.c5) <- c(\target\, \OR_c5\)
temp.c6 <- tb.c6 %>% dplyr::select(target, oddsRatio)
colnames(temp.c6) <- c(\target\, \OR_c6\)
temp.c7 <- tb.c7 %>% dplyr::select(target, oddsRatio)
colnames(temp.c7) <- c(\target\, \OR_c7\)
temp.c8 <- tb.c8 %>% dplyr::select(target, oddsRatio)
colnames(temp.c8) <- c(\target\, \OR_c8\)

temp <- full_join(temp.c1, temp.c2, by = \target\) %>%
  full_join(temp.c3, by = \target\) %>%
  full_join(temp.c4, by = \target\) %>%
  full_join(temp.c5, by = \target\) %>%
  full_join(temp.c6, by = \target\) %>%
  full_join(temp.c7, by = \target\) %>%
  full_join(temp.c8, by = \target\) %>%
  mutate_all(~replace_na(., 1))

data <- temp %>% column_to_rownames(\target\) %>% as.matrix()

library(circlize)
col_fun <- colorRamp2(c(1, max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)


# Initialize lists to store results
anchors <- list()
tbs <- list()
temps <- list()

# Process clusters c1 to c8
for (i in 1:4) {
  # Extract anchor
  loop_cluster <- get(paste0(\loop.cluster\, i))
  anchor <- extractAnchor(loop_cluster)
  
  # Find overlaps and intersect
  overlaps <- findOverlaps(anchor, atac.gr)
  anchor <- pintersect(anchor[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])
  
  # Store anchor
  anchors[[i]] <- anchor
  
  # Run LOLA
  result <- runLOLA(anchor, anchor.all, lolaDB)
  tb <- as_tibble(result)
  
  # Filter and summarize
  tb <- tb %>%
    dplyr::mutate(target = toupper(antibody)) %>%
    filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
    dplyr::filter(qValue < alpha) %>%
    dplyr::group_by(target) %>%
    slice_min(meanRnk, with_ties = FALSE)
  
  # Store tb
  tbs[[i]] <- tb
  
  # Select and rename oddsRatio
  temp <- tb %>% dplyr::select(target, oddsRatio)
  colnames(temp) <- c(\target\, paste0(\OR_c\, i))
  
  # Store temp
  temps[[i]] <- temp
}

# Merge all temp tables into one
temp <- Reduce(function(x, y) full_join(x, y, by = \target\), temps) %>%
  mutate_all(~replace_na(., 1))
data <- temp %>% column_to_rownames(\target\) %>% as.matrix()

library(circlize)
col_fun <- colorRamp2(c(1, max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJREkwTVRBeE5TQlVaWE4wYVc1bklHOXVJSE4xWW5ObGRDQnZaaUJzYjI5d2MxeHVZVzVqYUc5eUxtTXhJRHd0SUdWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1amJIVnpkR1Z5TVNsY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l1WXpFc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVl6RWdQQzBnY0dsdWRHVnljMlZqZENoaGJtTm9iM0l1WXpGYmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMHNJR0YwWVdNdVozSmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFNsY2JseHVZVzVqYUc5eUxtTXlJRHd0SUdWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1amJIVnpkR1Z5TWlsY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l1WXpJc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVl6SWdQQzBnY0dsdWRHVnljMlZqZENoaGJtTm9iM0l1WXpKYmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMHNJR0YwWVdNdVozSmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFNsY2JseHVZVzVqYUc5eUxtTXpJRHd0SUdWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1amJIVnpkR1Z5TXlsY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l1WXpNc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVl6TWdQQzBnY0dsdWRHVnljMlZqZENoaGJtTm9iM0l1WXpOYmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMHNJR0YwWVdNdVozSmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFNsY2JseHVZVzVqYUc5eUxtTTBJRHd0SUdWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1amJIVnpkR1Z5TkNsY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l1WXpRc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVl6UWdQQzBnY0dsdWRHVnljMlZqZENoaGJtTm9iM0l1WXpSYmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMHNJR0YwWVdNdVozSmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFNsY2JseHVZVzVqYUc5eUxtTTFJRHd0SUdWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1amJIVnpkR1Z5TlNsY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l1WXpVc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVl6VWdQQzBnY0dsdWRHVnljMlZqZENoaGJtTm9iM0l1WXpWYmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMHNJR0YwWVdNdVozSmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFNsY2JseHVZVzVqYUc5eUxtTTJJRHd0SUdWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1amJIVnpkR1Z5TmlsY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l1WXpZc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVl6WWdQQzBnY0dsdWRHVnljMlZqZENoaGJtTm9iM0l1WXpaYmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMHNJR0YwWVdNdVozSmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFNsY2JseHVZVzVqYUc5eUxtTTNJRHd0SUdWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1amJIVnpkR1Z5TnlsY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l1WXpjc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVl6Y2dQQzBnY0dsdWRHVnljMlZqZENoaGJtTm9iM0l1WXpkYmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMHNJR0YwWVdNdVozSmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFNsY2JseHVZVzVqYUc5eUxtTTRJRHd0SUdWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1amJIVnpkR1Z5T0NsY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l1WXpnc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVl6Z2dQQzBnY0dsdWRHVnljMlZqZENoaGJtTm9iM0l1WXpoYmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMHNJR0YwWVdNdVozSmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFNsY2JseHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdVl6RXNJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYm5SaUxtTXhJRDBnWVhOZmRHbGlZbXhsS0hKbGMzVnNkQ2xjYmx4dWNtVnpkV3gwSUQwZ2NuVnVURTlNUVNoaGJtTm9iM0l1WXpJc0lHRnVZMmh2Y2k1aGJHd3NJR3h2YkdGRVFpbGNiblJpTG1NeUlEMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNibHh1Y21WemRXeDBJRDBnY25WdVRFOU1RU2hoYm1Ob2IzSXVZek1zSUdGdVkyaHZjaTVoYkd3c0lHeHZiR0ZFUWlsY2JuUmlMbU16SUQwZ1lYTmZkR2xpWW14bEtISmxjM1ZzZENsY2JseHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdVl6UXNJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYm5SaUxtTTBJRDBnWVhOZmRHbGlZbXhsS0hKbGMzVnNkQ2xjYm5KbGMzVnNkQ0E5SUhKMWJreFBURUVvWVc1amFHOXlMbU0xTENCaGJtTm9iM0l1WVd4c0xDQnNiMnhoUkVJcFhHNTBZaTVqTlNBOUlHRnpYM1JwWW1Kc1pTaHlaWE4xYkhRcFhHNWNibkpsYzNWc2RDQTlJSEoxYmt4UFRFRW9ZVzVqYUc5eUxtTTJMQ0JoYm1Ob2IzSXVZV3hzTENCc2IyeGhSRUlwWEc1MFlpNWpOaUE5SUdGelgzUnBZbUpzWlNoeVpYTjFiSFFwWEc1Y2JuSmxjM1ZzZENBOUlISjFia3hQVEVFb1lXNWphRzl5TG1NM0xDQmhibU5vYjNJdVlXeHNMQ0JzYjJ4aFJFSXBYRzUwWWk1ak55QTlJR0Z6WDNScFltSnNaU2h5WlhOMWJIUXBYRzVjYm5KbGMzVnNkQ0E5SUhKMWJreFBURUVvWVc1amFHOXlMbU00TENCaGJtTm9iM0l1WVd4c0xDQnNiMnhoUkVJcFhHNTBZaTVqT0NBOUlHRnpYM1JwWW1Kc1pTaHlaWE4xYkhRcFhHNWNiaU1qSXlCSVJVRlVUVUZRWEc1aGJIQm9ZU0E4TFNBd0xqQTFYRzUwWWk1ak1TQThMU0IwWWk1ak1TQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU2tnSlQ0bFhHNGdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGeGNaVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRnhjS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaHhWbUZzZFdVZ1BDQmhiSEJvWVNrZ0pUNGxJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNTBZaTVqTWlBOExTQjBZaTVqTWlBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTa2dKVDRsWEc0Z0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ4Y1pXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGeGNLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bElHUndiSGx5T2pwbmNtOTFjRjlpZVNoMFlYSm5aWFFwSUNVK0pWeHVJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc1MFlpNWpNeUE4TFNCMFlpNWpNeUFsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1NrZ0pUNGxYRzRnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRnhjWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ4Y0tTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh4Vm1Gc2RXVWdQQ0JoYkhCb1lTa2dKVDRsSUdSd2JIbHlPanBuY205MWNGOWllU2gwWVhKblpYUXBJQ1UrSlZ4dUlDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzUwWWk1ak5DQThMU0IwWWk1ak5DQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU2tnSlQ0bFhHNGdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGeGNaVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRnhjS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaHhWbUZzZFdVZ1BDQmhiSEJvWVNrZ0pUNGxJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNTBZaTVqTlNBOExTQjBZaTVqTlNBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTa2dKVDRsWEc0Z0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ4Y1pXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGeGNLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bFhHNGdJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNWNiblJpTG1NMklEd3RJSFJpTG1NMklDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoY21kbGRDQTlJSFJ2ZFhCd1pYSW9ZVzUwYVdKdlpIa3BLU0FsUGlWY2JpQWdabWxzZEdWeUtITjBjbDkwYjE5c2IzZGxjaWhqWld4c1ZIbHdaU2tnUFQwZ1hGeGxiV0p5ZVc5dWFXTWdjM1JsYlNCalpXeHNYRndwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIRldZV3gxWlNBOElHRnNjR2hoS1NBbFBpVmNiaUFnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNibHh1ZEdJdVl6Y2dQQzBnZEdJdVl6Y2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvZEdGeVoyVjBJRDBnZEc5MWNIQmxjaWhoYm5ScFltOWtlU2twSUNVK0pWeHVJQ0JtYVd4MFpYSW9jM1J5WDNSdlgyeHZkMlZ5S0dObGJHeFVlWEJsS1NBOVBTQmNYR1Z0WW5KNWIyNXBZeUJ6ZEdWdElHTmxiR3hjWENrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKVnh1SUNCa2NHeDVjam82WjNKdmRYQmZZbmtvZEdGeVoyVjBLU0FsUGlWY2JpQWdjMnhwWTJWZmJXbHVLRzFsWVc1U2Jtc3NJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLVnh1WEc1MFlpNWpPQ0E4TFNCMFlpNWpPQ0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1NrZ0pUNGxYRzRnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRnhjWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ4Y0tTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh4Vm1Gc2RXVWdQQ0JoYkhCb1lTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbmNtOTFjRjlpZVNoMFlYSm5aWFFwSUNVK0pWeHVJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc1Y2JuUmxiWEF1WXpFZ1BDMGdkR0l1WXpFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG1NeEtTQThMU0JqS0Z4Y2RHRnlaMlYwWEZ3c0lGeGNUMUpmWXpGY1hDbGNiblJsYlhBdVl6SWdQQzBnZEdJdVl6SWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xtTXlLU0E4TFNCaktGeGNkR0Z5WjJWMFhGd3NJRnhjVDFKZll6SmNYQ2xjYm5SbGJYQXVZek1nUEMwZ2RHSXVZek1nSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0J2WkdSelVtRjBhVzhwWEc1amIyeHVZVzFsY3loMFpXMXdMbU16S1NBOExTQmpLRnhjZEdGeVoyVjBYRndzSUZ4Y1QxSmZZek5jWENsY2JuUmxiWEF1WXpRZ1BDMGdkR0l1WXpRZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG1NMEtTQThMU0JqS0Z4Y2RHRnlaMlYwWEZ3c0lGeGNUMUpmWXpSY1hDbGNiblJsYlhBdVl6VWdQQzBnZEdJdVl6VWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xtTTFLU0E4TFNCaktGeGNkR0Z5WjJWMFhGd3NJRnhjVDFKZll6VmNYQ2xjYm5SbGJYQXVZellnUEMwZ2RHSXVZellnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0J2WkdSelVtRjBhVzhwWEc1amIyeHVZVzFsY3loMFpXMXdMbU0yS1NBOExTQmpLRnhjZEdGeVoyVjBYRndzSUZ4Y1QxSmZZelpjWENsY2JuUmxiWEF1WXpjZ1BDMGdkR0l1WXpjZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG1NM0tTQThMU0JqS0Z4Y2RHRnlaMlYwWEZ3c0lGeGNUMUpmWXpkY1hDbGNiblJsYlhBdVl6Z2dQQzBnZEdJdVl6Z2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xtTTRLU0E4TFNCaktGeGNkR0Z5WjJWMFhGd3NJRnhjVDFKZll6aGNYQ2xjYmx4dWRHVnRjQ0E4TFNCbWRXeHNYMnB2YVc0b2RHVnRjQzVqTVN3Z2RHVnRjQzVqTWl3Z1lua2dQU0JjWEhSaGNtZGxkRnhjS1NBbFBpVmNiaUFnWm5Wc2JGOXFiMmx1S0hSbGJYQXVZek1zSUdKNUlEMGdYRngwWVhKblpYUmNYQ2tnSlQ0bFhHNGdJR1oxYkd4ZmFtOXBiaWgwWlcxd0xtTTBMQ0JpZVNBOUlGeGNkR0Z5WjJWMFhGd3BJQ1UrSlZ4dUlDQm1kV3hzWDJwdmFXNG9kR1Z0Y0M1ak5Td2dZbmtnUFNCY1hIUmhjbWRsZEZ4Y0tTQWxQaVZjYmlBZ1puVnNiRjlxYjJsdUtIUmxiWEF1WXpZc0lHSjVJRDBnWEZ4MFlYSm5aWFJjWENrZ0pUNGxYRzRnSUdaMWJHeGZhbTlwYmloMFpXMXdMbU0zTENCaWVTQTlJRnhjZEdGeVoyVjBYRndwSUNVK0pWeHVJQ0JtZFd4c1gycHZhVzRvZEdWdGNDNWpPQ3dnWW5rZ1BTQmNYSFJoY21kbGRGeGNLU0FsUGlWY2JpQWdiWFYwWVhSbFgyRnNiQ2grY21Wd2JHRmpaVjl1WVNndUxDQXhLU2xjYmx4dVpHRjBZU0E4TFNCMFpXMXdJQ1UrSlNCamIyeDFiVzVmZEc5ZmNtOTNibUZ0WlhNb1hGeDBZWEpuWlhSY1hDa2dKVDRsSUdGekxtMWhkSEpwZUNncFhHNWNibXhwWW5KaGNua29ZMmx5WTJ4cGVtVXBYRzVqYjJ4ZlpuVnVJRHd0SUdOdmJHOXlVbUZ0Y0RJb1l5Z3hMQ0J0WVhnb1pHRjBZU2twTENCaktGeGNkMmhwZEdWY1hDd2dYRnh5WldSY1hDa3BYRzVjYmx4dUkyWjJhWHBmYm1KamJIVnpkQ2hrWVhSaExDQnJiV1ZoYm5Nc0lHMWxkR2h2WkNBOUlGeGNkM056WEZ3cFhHNWNibkFnUEMwZ1NHVmhkRzFoY0NoY2JpQWdaR0YwWVN4Y2JpQWdibUZ0WlNBOUlGeGNUMlJrY3lCU1lYUnBiMXhjTENBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklFNWhiV1VnYjJZZ2RHaGxJR2hsWVhSdFlYQWdiR1ZuWlc1a1hHNGdJR05zZFhOMFpYSmZZMjlzZFcxdWN5QTlJRVpCVEZORkxDQWdJQ0FnSUNBZ0lDQWdJQ01nVW1WdGIzWmxJR052YkhWdGJpQmtaVzVrY205bmNtRnRYRzRnSUhOb2IzZGZjbTkzWDJSbGJtUWdQU0JHUVV4VFJTeGNiaUFnWTI5c0lEMGdZMjlzWDJaMWJpeGNiaUFnWW05eVpHVnlJRDBnVkZKVlJWeHVLVnh1WEc1Y2JpTWdTVzVwZEdsaGJHbDZaU0JzYVhOMGN5QjBieUJ6ZEc5eVpTQnlaWE4xYkhSelhHNWhibU5vYjNKeklEd3RJR3hwYzNRb0tWeHVkR0p6SUR3dElHeHBjM1FvS1Z4dWRHVnRjSE1nUEMwZ2JHbHpkQ2dwWEc1Y2JpTWdVSEp2WTJWemN5QmpiSFZ6ZEdWeWN5QmpNU0IwYnlCak9GeHVabTl5SUNocElHbHVJREU2TkNrZ2UxeHVJQ0FqSUVWNGRISmhZM1FnWVc1amFHOXlYRzRnSUd4dmIzQmZZMngxYzNSbGNpQThMU0JuWlhRb2NHRnpkR1V3S0Z4Y2JHOXZjQzVqYkhWemRHVnlYRndzSUdrcEtWeHVJQ0JoYm1Ob2IzSWdQQzBnWlhoMGNtRmpkRUZ1WTJodmNpaHNiMjl3WDJOc2RYTjBaWElwWEc0Z0lGeHVJQ0FqSUVacGJtUWdiM1psY214aGNITWdZVzVrSUdsdWRHVnljMlZqZEZ4dUlDQnZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TENCaGRHRmpMbWR5S1Z4dUlDQmhibU5vYjNJZ1BDMGdjR2x1ZEdWeWMyVmpkQ2hoYm1Ob2IzSmJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzSUdGMFlXTXVaM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhTbGNiaUFnWEc0Z0lDTWdVM1J2Y21VZ1lXNWphRzl5WEc0Z0lHRnVZMmh2Y25OYlcybGRYU0E4TFNCaGJtTm9iM0pjYmlBZ1hHNGdJQ01nVW5WdUlFeFBURUZjYmlBZ2NtVnpkV3gwSUR3dElISjFia3hQVEVFb1lXNWphRzl5TENCaGJtTm9iM0l1WVd4c0xDQnNiMnhoUkVJcFhHNGdJSFJpSUR3dElHRnpYM1JwWW1Kc1pTaHlaWE4xYkhRcFhHNGdJRnh1SUNBaklFWnBiSFJsY2lCaGJtUWdjM1Z0YldGeWFYcGxYRzRnSUhSaUlEd3RJSFJpSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0Z5WjJWMElEMGdkRzkxY0hCbGNpaGhiblJwWW05a2VTa3BJQ1UrSlZ4dUlDQWdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGeGNaVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRnhjS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnSUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNGdJRnh1SUNBaklGTjBiM0psSUhSaVhHNGdJSFJpYzF0YmFWMWRJRHd0SUhSaVhHNGdJRnh1SUNBaklGTmxiR1ZqZENCaGJtUWdjbVZ1WVcxbElHOWtaSE5TWVhScGIxeHVJQ0IwWlcxd0lEd3RJSFJpSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYjJSa2MxSmhkR2x2S1Z4dUlDQmpiMnh1WVcxbGN5aDBaVzF3S1NBOExTQmpLRnhjZEdGeVoyVjBYRndzSUhCaGMzUmxNQ2hjWEU5U1gyTmNYQ3dnYVNrcFhHNGdJRnh1SUNBaklGTjBiM0psSUhSbGJYQmNiaUFnZEdWdGNITmJXMmxkWFNBOExTQjBaVzF3WEc1OVhHNWNiaU1nVFdWeVoyVWdZV3hzSUhSbGJYQWdkR0ZpYkdWeklHbHVkRzhnYjI1bFhHNTBaVzF3SUR3dElGSmxaSFZqWlNobWRXNWpkR2x2YmloNExDQjVLU0JtZFd4c1gycHZhVzRvZUN3Z2VTd2dZbmtnUFNCY1hIUmhjbWRsZEZ4Y0tTd2dkR1Z0Y0hNcElDVStKVnh1SUNCdGRYUmhkR1ZmWVd4c0tINXlaWEJzWVdObFgyNWhLQzRzSURFcEtWeHVaR0YwWVNBOExTQjBaVzF3SUNVK0pTQmpiMngxYlc1ZmRHOWZjbTkzYm1GdFpYTW9YRngwWVhKblpYUmNYQ2tnSlQ0bElHRnpMbTFoZEhKcGVDZ3BYRzVjYm14cFluSmhjbmtvWTJseVkyeHBlbVVwWEc1amIyeGZablZ1SUR3dElHTnZiRzl5VW1GdGNESW9ZeWd4TENCdFlYZ29aR0YwWVNrcExDQmpLRnhjZDJocGRHVmNYQ3dnWEZ4eVpXUmNYQ2twWEc1Y2JseHVJMloyYVhwZmJtSmpiSFZ6ZENoa1lYUmhMQ0JyYldWaGJuTXNJRzFsZEdodlpDQTlJRnhjZDNOelhGd3BYRzVjYm5BZ1BDMGdTR1ZoZEcxaGNDaGNiaUFnWkdGMFlTeGNiaUFnYm1GdFpTQTlJRnhjVDJSa2N5QlNZWFJwYjF4Y0xDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpJRTVoYldVZ2IyWWdkR2hsSUdobFlYUnRZWEFnYkdWblpXNWtYRzRnSUdOc2RYTjBaWEpmWTI5c2RXMXVjeUE5SUVaQlRGTkZMQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1VtVnRiM1psSUdOdmJIVnRiaUJrWlc1a2NtOW5jbUZ0WEc0Z0lITm9iM2RmY205M1gyUmxibVFnUFNCR1FVeFRSU3hjYmlBZ1kyOXNJRDBnWTI5c1gyWjFiaXhjYmlBZ1ltOXlaR1Z5SUQwZ1ZGSlZSVnh1S1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbiMjIyAyNDEwMTUgVGVzdGluZyBvbiBzdWJzZXQgb2YgbG9vcHNcbmFuY2hvci5jMSA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjEpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmMxLCBhdGFjLmdyKVxuYW5jaG9yLmMxIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmMxW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmFuY2hvci5jMiA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjIpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmMyLCBhdGFjLmdyKVxuYW5jaG9yLmMyIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmMyW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmFuY2hvci5jMyA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjMpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmMzLCBhdGFjLmdyKVxuYW5jaG9yLmMzIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmMzW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmFuY2hvci5jNCA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjQpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmM0LCBhdGFjLmdyKVxuYW5jaG9yLmM0IDwtIHBpbnRlcnNlY3QoYW5jaG9yLmM0W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmFuY2hvci5jNSA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjUpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmM1LCBhdGFjLmdyKVxuYW5jaG9yLmM1IDwtIHBpbnRlcnNlY3QoYW5jaG9yLmM1W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmFuY2hvci5jNiA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjYpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmM2LCBhdGFjLmdyKVxuYW5jaG9yLmM2IDwtIHBpbnRlcnNlY3QoYW5jaG9yLmM2W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmFuY2hvci5jNyA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjcpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmM3LCBhdGFjLmdyKVxuYW5jaG9yLmM3IDwtIHBpbnRlcnNlY3QoYW5jaG9yLmM3W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmFuY2hvci5jOCA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjgpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmM4LCBhdGFjLmdyKVxuYW5jaG9yLmM4IDwtIHBpbnRlcnNlY3QoYW5jaG9yLmM4W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmMxLCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jMSA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmMyLCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jMiA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmMzLCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jMyA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM0LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jNCA9IGFzX3RpYmJsZShyZXN1bHQpXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jNSwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIuYzUgPSBhc190aWJibGUocmVzdWx0KVxuXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jNiwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIuYzYgPSBhc190aWJibGUocmVzdWx0KVxuXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jNywgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIuYzcgPSBhc190aWJibGUocmVzdWx0KVxuXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jOCwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIuYzggPSBhc190aWJibGUocmVzdWx0KVxuXG4jIyMgSEVBVE1BUFxuYWxwaGEgPC0gMC4wNVxudGIuYzEgPC0gdGIuYzEgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuYzIgPC0gdGIuYzIgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuYzMgPC0gdGIuYzMgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuYzQgPC0gdGIuYzQgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuYzUgPC0gdGIuYzUgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JVxuICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50Yi5jNiA8LSB0Yi5jNiAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lXG4gIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRiLmM3IDwtIHRiLmM3ICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiVcbiAgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGIuYzggPC0gdGIuYzggJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JVxuICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50ZW1wLmMxIDwtIHRiLmMxICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5jMSkgPC0gYyhcXHRhcmdldFxcLCBcXE9SX2MxXFwpXG50ZW1wLmMyIDwtIHRiLmMyICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5jMikgPC0gYyhcXHRhcmdldFxcLCBcXE9SX2MyXFwpXG50ZW1wLmMzIDwtIHRiLmMzICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5jMykgPC0gYyhcXHRhcmdldFxcLCBcXE9SX2MzXFwpXG50ZW1wLmM0IDwtIHRiLmM0ICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5jNCkgPC0gYyhcXHRhcmdldFxcLCBcXE9SX2M0XFwpXG50ZW1wLmM1IDwtIHRiLmM1ICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5jNSkgPC0gYyhcXHRhcmdldFxcLCBcXE9SX2M1XFwpXG50ZW1wLmM2IDwtIHRiLmM2ICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5jNikgPC0gYyhcXHRhcmdldFxcLCBcXE9SX2M2XFwpXG50ZW1wLmM3IDwtIHRiLmM3ICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5jNykgPC0gYyhcXHRhcmdldFxcLCBcXE9SX2M3XFwpXG50ZW1wLmM4IDwtIHRiLmM4ICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5jOCkgPC0gYyhcXHRhcmdldFxcLCBcXE9SX2M4XFwpXG5cbnRlbXAgPC0gZnVsbF9qb2luKHRlbXAuYzEsIHRlbXAuYzIsIGJ5ID0gXFx0YXJnZXRcXCkgJT4lXG4gIGZ1bGxfam9pbih0ZW1wLmMzLCBieSA9IFxcdGFyZ2V0XFwpICU+JVxuICBmdWxsX2pvaW4odGVtcC5jNCwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgZnVsbF9qb2luKHRlbXAuYzUsIGJ5ID0gXFx0YXJnZXRcXCkgJT4lXG4gIGZ1bGxfam9pbih0ZW1wLmM2LCBieSA9IFxcdGFyZ2V0XFwpICU+JVxuICBmdWxsX2pvaW4odGVtcC5jNywgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgZnVsbF9qb2luKHRlbXAuYzgsIGJ5ID0gXFx0YXJnZXRcXCkgJT4lXG4gIG11dGF0ZV9hbGwofnJlcGxhY2VfbmEoLiwgMSkpXG5cbmRhdGEgPC0gdGVtcCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKFxcdGFyZ2V0XFwpICU+JSBhcy5tYXRyaXgoKVxuXG5saWJyYXJ5KGNpcmNsaXplKVxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMSwgbWF4KGRhdGEpKSwgYyhcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5cbiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSBcXHdzc1xcKVxuXG5wIDwtIEhlYXRtYXAoXG4gIGRhdGEsXG4gIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZFxuICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbVxuICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gIGNvbCA9IGNvbF9mdW4sXG4gIGJvcmRlciA9IFRSVUVcbilcblxuXG4jIEluaXRpYWxpemUgbGlzdHMgdG8gc3RvcmUgcmVzdWx0c1xuYW5jaG9ycyA8LSBsaXN0KClcbnRicyA8LSBsaXN0KClcbnRlbXBzIDwtIGxpc3QoKVxuXG4jIFByb2Nlc3MgY2x1c3RlcnMgYzEgdG8gYzhcbmZvciAoaSBpbiAxOjQpIHtcbiAgIyBFeHRyYWN0IGFuY2hvclxuICBsb29wX2NsdXN0ZXIgPC0gZ2V0KHBhc3RlMChcXGxvb3AuY2x1c3RlclxcLCBpKSlcbiAgYW5jaG9yIDwtIGV4dHJhY3RBbmNob3IobG9vcF9jbHVzdGVyKVxuICBcbiAgIyBGaW5kIG92ZXJsYXBzIGFuZCBpbnRlcnNlY3RcbiAgb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvciwgYXRhYy5ncilcbiAgYW5jaG9yIDwtIHBpbnRlcnNlY3QoYW5jaG9yW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG4gIFxuICAjIFN0b3JlIGFuY2hvclxuICBhbmNob3JzW1tpXV0gPC0gYW5jaG9yXG4gIFxuICAjIFJ1biBMT0xBXG4gIHJlc3VsdCA8LSBydW5MT0xBKGFuY2hvciwgYW5jaG9yLmFsbCwgbG9sYURCKVxuICB0YiA8LSBhc190aWJibGUocmVzdWx0KVxuICBcbiAgIyBGaWx0ZXIgYW5kIHN1bW1hcml6ZVxuICB0YiA8LSB0YiAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lXG4gICAgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuICBcbiAgIyBTdG9yZSB0YlxuICB0YnNbW2ldXSA8LSB0YlxuICBcbiAgIyBTZWxlY3QgYW5kIHJlbmFtZSBvZGRzUmF0aW9cbiAgdGVtcCA8LSB0YiAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbiAgY29sbmFtZXModGVtcCkgPC0gYyhcXHRhcmdldFxcLCBwYXN0ZTAoXFxPUl9jXFwsIGkpKVxuICBcbiAgIyBTdG9yZSB0ZW1wXG4gIHRlbXBzW1tpXV0gPC0gdGVtcFxufVxuXG4jIE1lcmdlIGFsbCB0ZW1wIHRhYmxlcyBpbnRvIG9uZVxudGVtcCA8LSBSZWR1Y2UoZnVuY3Rpb24oeCwgeSkgZnVsbF9qb2luKHgsIHksIGJ5ID0gXFx0YXJnZXRcXCksIHRlbXBzKSAlPiVcbiAgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcbmRhdGEgPC0gdGVtcCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKFxcdGFyZ2V0XFwpICU+JSBhcy5tYXRyaXgoKVxuXG5saWJyYXJ5KGNpcmNsaXplKVxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMSwgbWF4KGRhdGEpKSwgYyhcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5cbiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSBcXHdzc1xcKVxuXG5wIDwtIEhlYXRtYXAoXG4gIGRhdGEsXG4gIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZFxuICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbVxuICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gIGNvbCA9IGNvbF9mdW4sXG4gIGJvcmRlciA9IFRSVUVcbilcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIDI0MTAxNSBUZXN0aW5nIG9uIHN1YnNldCBvZiBsb29wc1xuYW5jaG9yLmMxIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzEsIGF0YWMuZ3IpXG5hbmNob3IuYzEgPC0gcGludGVyc2VjdChhbmNob3IuYzFbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmMyIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMilcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzIsIGF0YWMuZ3IpXG5hbmNob3IuYzIgPC0gcGludGVyc2VjdChhbmNob3IuYzJbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmMzIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMylcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzMsIGF0YWMuZ3IpXG5hbmNob3IuYzMgPC0gcGludGVyc2VjdChhbmNob3IuYzNbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM0IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNClcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzQsIGF0YWMuZ3IpXG5hbmNob3IuYzQgPC0gcGludGVyc2VjdChhbmNob3IuYzRbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM1IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzUsIGF0YWMuZ3IpXG5hbmNob3IuYzUgPC0gcGludGVyc2VjdChhbmNob3IuYzVbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM2IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNilcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzYsIGF0YWMuZ3IpXG5hbmNob3IuYzYgPC0gcGludGVyc2VjdChhbmNob3IuYzZbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM3IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNylcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzcsIGF0YWMuZ3IpXG5hbmNob3IuYzcgPC0gcGludGVyc2VjdChhbmNob3IuYzdbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM4IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyOClcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzgsIGF0YWMuZ3IpXG5hbmNob3IuYzggPC0gcGludGVyc2VjdChhbmNob3IuYzhbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzEsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmMxID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzIsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmMyID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzMsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmMzID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzQsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmM0ID0gYXNfdGliYmxlKHJlc3VsdClcbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM1LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jNSA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM2LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jNiA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM3LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jNyA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM4LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jOCA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbiMjIyBIRUFUTUFQXG5hbHBoYSA8LSAwLjA1XG50Yi5jMSA8LSB0Yi5jMSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jMiA8LSB0Yi5jMiAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jMyA8LSB0Yi5jMyAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jNCA8LSB0Yi5jNCAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jNSA8LSB0Yi5jNSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lXG4gIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRiLmM2IDwtIHRiLmM2ICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiVcbiAgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGIuYzcgPC0gdGIuYzcgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JVxuICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50Yi5jOCA8LSB0Yi5jOCAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lXG4gIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRlbXAuYzEgPC0gdGIuYzEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmMxKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzFcXClcbnRlbXAuYzIgPC0gdGIuYzIgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmMyKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzJcXClcbnRlbXAuYzMgPC0gdGIuYzMgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmMzKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzNcXClcbnRlbXAuYzQgPC0gdGIuYzQgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM0KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzRcXClcbnRlbXAuYzUgPC0gdGIuYzUgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM1KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzVcXClcbnRlbXAuYzYgPC0gdGIuYzYgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM2KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzZcXClcbnRlbXAuYzcgPC0gdGIuYzcgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM3KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzdcXClcbnRlbXAuYzggPC0gdGIuYzggJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM4KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzhcXClcblxudGVtcCA8LSBmdWxsX2pvaW4odGVtcC5jMSwgdGVtcC5jMiwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgZnVsbF9qb2luKHRlbXAuYzMsIGJ5ID0gXFx0YXJnZXRcXCkgJT4lXG4gIGZ1bGxfam9pbih0ZW1wLmM0LCBieSA9IFxcdGFyZ2V0XFwpICU+JVxuICBmdWxsX2pvaW4odGVtcC5jNSwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgZnVsbF9qb2luKHRlbXAuYzYsIGJ5ID0gXFx0YXJnZXRcXCkgJT4lXG4gIGZ1bGxfam9pbih0ZW1wLmM3LCBieSA9IFxcdGFyZ2V0XFwpICU+JVxuICBmdWxsX2pvaW4odGVtcC5jOCwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcblxuZGF0YSA8LSB0ZW1wICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoXFx0YXJnZXRcXCkgJT4lIGFzLm1hdHJpeCgpXG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygxLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1bixcbiAgYm9yZGVyID0gVFJVRVxuKVxuXG5cbiMgSW5pdGlhbGl6ZSBsaXN0cyB0byBzdG9yZSByZXN1bHRzXG5hbmNob3JzIDwtIGxpc3QoKVxudGJzIDwtIGxpc3QoKVxudGVtcHMgPC0gbGlzdCgpXG5cbiMgUHJvY2VzcyBjbHVzdGVycyBjMSB0byBjOFxuZm9yIChpIGluIDE6NCkge1xuICAjIEV4dHJhY3QgYW5jaG9yXG4gIGxvb3BfY2x1c3RlciA8LSBnZXQocGFzdGUwKFxcbG9vcC5jbHVzdGVyXFwsIGkpKVxuICBhbmNob3IgPC0gZXh0cmFjdEFuY2hvcihsb29wX2NsdXN0ZXIpXG4gIFxuICAjIEZpbmQgb3ZlcmxhcHMgYW5kIGludGVyc2VjdFxuICBvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLCBhdGFjLmdyKVxuICBhbmNob3IgPC0gcGludGVyc2VjdChhbmNob3JbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcbiAgXG4gICMgU3RvcmUgYW5jaG9yXG4gIGFuY2hvcnNbW2ldXSA8LSBhbmNob3JcbiAgXG4gICMgUnVuIExPTEFcbiAgcmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLCBhbmNob3IuYWxsLCBsb2xhREIpXG4gIHRiIDwtIGFzX3RpYmJsZShyZXN1bHQpXG4gIFxuICAjIEZpbHRlciBhbmQgc3VtbWFyaXplXG4gIHRiIDwtIHRiICU+JVxuICAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiVcbiAgICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG4gIFxuICAjIFN0b3JlIHRiXG4gIHRic1tbaV1dIDwtIHRiXG4gIFxuICAjIFNlbGVjdCBhbmQgcmVuYW1lIG9kZHNSYXRpb1xuICB0ZW1wIDwtIHRiICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuICBjb2xuYW1lcyh0ZW1wKSA8LSBjKFxcdGFyZ2V0XFwsIHBhc3RlMChcXE9SX2NcXCwgaSkpXG4gIFxuICAjIFN0b3JlIHRlbXBcbiAgdGVtcHNbW2ldXSA8LSB0ZW1wXG59XG5cbiMgTWVyZ2UgYWxsIHRlbXAgdGFibGVzIGludG8gb25lXG50ZW1wIDwtIFJlZHVjZShmdW5jdGlvbih4LCB5KSBmdWxsX2pvaW4oeCwgeSwgYnkgPSBcXHRhcmdldFxcKSwgdGVtcHMpICU+JVxuICBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKVxuZGF0YSA8LSB0ZW1wICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoXFx0YXJnZXRcXCkgJT4lIGFzLm1hdHJpeCgpXG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygxLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1bixcbiAgYm9yZGVyID0gVFJVRVxuKVxuYGBgXG5gYGAifQ== -->

```r
```r
### 241015 Testing on subset of loops
anchor.c1 <- extractAnchor(loop.cluster1)
overlaps <- findOverlaps(anchor.c1, atac.gr)
anchor.c1 <- pintersect(anchor.c1[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c2 <- extractAnchor(loop.cluster2)
overlaps <- findOverlaps(anchor.c2, atac.gr)
anchor.c2 <- pintersect(anchor.c2[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c3 <- extractAnchor(loop.cluster3)
overlaps <- findOverlaps(anchor.c3, atac.gr)
anchor.c3 <- pintersect(anchor.c3[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c4 <- extractAnchor(loop.cluster4)
overlaps <- findOverlaps(anchor.c4, atac.gr)
anchor.c4 <- pintersect(anchor.c4[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c5 <- extractAnchor(loop.cluster5)
overlaps <- findOverlaps(anchor.c5, atac.gr)
anchor.c5 <- pintersect(anchor.c5[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c6 <- extractAnchor(loop.cluster6)
overlaps <- findOverlaps(anchor.c6, atac.gr)
anchor.c6 <- pintersect(anchor.c6[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c7 <- extractAnchor(loop.cluster7)
overlaps <- findOverlaps(anchor.c7, atac.gr)
anchor.c7 <- pintersect(anchor.c7[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c8 <- extractAnchor(loop.cluster8)
overlaps <- findOverlaps(anchor.c8, atac.gr)
anchor.c8 <- pintersect(anchor.c8[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

result = runLOLA(anchor.c1, anchor.all, lolaDB)
tb.c1 = as_tibble(result)

result = runLOLA(anchor.c2, anchor.all, lolaDB)
tb.c2 = as_tibble(result)

result = runLOLA(anchor.c3, anchor.all, lolaDB)
tb.c3 = as_tibble(result)

result = runLOLA(anchor.c4, anchor.all, lolaDB)
tb.c4 = as_tibble(result)
result = runLOLA(anchor.c5, anchor.all, lolaDB)
tb.c5 = as_tibble(result)

result = runLOLA(anchor.c6, anchor.all, lolaDB)
tb.c6 = as_tibble(result)

result = runLOLA(anchor.c7, anchor.all, lolaDB)
tb.c7 = as_tibble(result)

result = runLOLA(anchor.c8, anchor.all, lolaDB)
tb.c8 = as_tibble(result)

### HEATMAP
alpha <- 0.05
tb.c1 <- tb.c1 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c2 <- tb.c2 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c3 <- tb.c3 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c4 <- tb.c4 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c5 <- tb.c5 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

tb.c6 <- tb.c6 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

tb.c7 <- tb.c7 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

tb.c8 <- tb.c8 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.c1 <- tb.c1 %>% dplyr::select(target, oddsRatio)
colnames(temp.c1) <- c(\target\, \OR_c1\)
temp.c2 <- tb.c2 %>% dplyr::select(target, oddsRatio)
colnames(temp.c2) <- c(\target\, \OR_c2\)
temp.c3 <- tb.c3 %>% dplyr::select(target, oddsRatio)
colnames(temp.c3) <- c(\target\, \OR_c3\)
temp.c4 <- tb.c4 %>% dplyr::select(target, oddsRatio)
colnames(temp.c4) <- c(\target\, \OR_c4\)
temp.c5 <- tb.c5 %>% dplyr::select(target, oddsRatio)
colnames(temp.c5) <- c(\target\, \OR_c5\)
temp.c6 <- tb.c6 %>% dplyr::select(target, oddsRatio)
colnames(temp.c6) <- c(\target\, \OR_c6\)
temp.c7 <- tb.c7 %>% dplyr::select(target, oddsRatio)
colnames(temp.c7) <- c(\target\, \OR_c7\)
temp.c8 <- tb.c8 %>% dplyr::select(target, oddsRatio)
colnames(temp.c8) <- c(\target\, \OR_c8\)

temp <- full_join(temp.c1, temp.c2, by = \target\) %>%
  full_join(temp.c3, by = \target\) %>%
  full_join(temp.c4, by = \target\) %>%
  full_join(temp.c5, by = \target\) %>%
  full_join(temp.c6, by = \target\) %>%
  full_join(temp.c7, by = \target\) %>%
  full_join(temp.c8, by = \target\) %>%
  mutate_all(~replace_na(., 1))

data <- temp %>% column_to_rownames(\target\) %>% as.matrix()

library(circlize)
col_fun <- colorRamp2(c(1, max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)


# Initialize lists to store results
anchors <- list()
tbs <- list()
temps <- list()

# Process clusters c1 to c8
for (i in 1:4) {
  # Extract anchor
  loop_cluster <- get(paste0(\loop.cluster\, i))
  anchor <- extractAnchor(loop_cluster)
  
  # Find overlaps and intersect
  overlaps <- findOverlaps(anchor, atac.gr)
  anchor <- pintersect(anchor[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])
  
  # Store anchor
  anchors[[i]] <- anchor
  
  # Run LOLA
  result <- runLOLA(anchor, anchor.all, lolaDB)
  tb <- as_tibble(result)
  
  # Filter and summarize
  tb <- tb %>%
    dplyr::mutate(target = toupper(antibody)) %>%
    filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
    dplyr::filter(qValue < alpha) %>%
    dplyr::group_by(target) %>%
    slice_min(meanRnk, with_ties = FALSE)
  
  # Store tb
  tbs[[i]] <- tb
  
  # Select and rename oddsRatio
  temp <- tb %>% dplyr::select(target, oddsRatio)
  colnames(temp) <- c(\target\, paste0(\OR_c\, i))
  
  # Store temp
  temps[[i]] <- temp
}

# Merge all temp tables into one
temp <- Reduce(function(x, y) full_join(x, y, by = \target\), temps) %>%
  mutate_all(~replace_na(., 1))
data <- temp %>% column_to_rownames(\target\) %>% as.matrix()

library(circlize)
col_fun <- colorRamp2(c(1, max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZWFJoWXlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0pIVTAwek1UQTJNalUzWDBGVVFVTmZSVk5EWHpFdVltVmtYQ0lwS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoV01Td2dWaklzSUZZektWeHVZMjlzYm1GdFpYTW9ZWFJoWXlrZ1BDMGdZeWhjSW1Ob2Nsd2lMQ0JjSW5OMFlYSjBYQ0lzSUZ3aVpXNWtYQ0lwWEc1aGRHRmpMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoaGRHRmpLVnh1WEc0aklFeFBRVVJKVGtjZ1RFOVBVRk5jYmlNakl5QkpiWEJ2Y25ScGJtY2daR2xtWm1WeVpXNTBhV0ZzSUhKbFozVnNZWFJ2Y25rZ2JHOXZjSE1nSmlCbGVIUnlZV04wSUdGdVkyaHZjbHh1Ykc5dmNDNWhiR3dnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVM1MGMzWmNJaWtwWEc1aGJtTm9iM0l1WVd4c0lEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1WVd4c0tTbGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVlXeHNMQ0JoZEdGakxtZHlLVnh1WVc1amFHOXlMbUZzYkNBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWhiR3hiY1hWbGNubElhWFJ6S0c5MlpYSnNZWEJ6S1Ywc0lHRjBZV011WjNKYmMzVmlhbVZqZEVocGRITW9iM1psY214aGNITXBYU2xjYmx4dWJHOXZjQzUxY0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgyRnNiRjlrVkVGSGRuTkVUVk5QWDFWUVgyUnBabVl3TGpJdVltVmtjR1ZjSWlrcFhHNWhibU5vYjNJdWRYQWdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1MWNDa3BYRzV2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxuVndMQ0JoZEdGakxtZHlLVnh1WVc1amFHOXlMblZ3SUR3dElIQnBiblJsY25ObFkzUW9ZVzVqYUc5eUxuVndXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkTENCaGRHRmpMbWR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVjYm14dmIzQXVibThnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5aGJHeGZaRlJCUjNaelJFMVRUMTlPVDE5a2FXWm1NQzR5TG1KbFpIQmxYQ0lwS1Z4dVlXNWphRzl5TG01dklEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1Ym04cEtWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1dWJ5d2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNXVieUE4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1dWIxdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVzYjI5d0xuVndibThnUEMwZ1ltbHVaRjl5YjNkektHeHZiM0F1ZFhBc0lHeHZiM0F1Ym04cFhHNWhibU5vYjNJdWRYQnVieUE4TFNBb1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xuVndibThwS1Z4dWIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjaTUxY0c1dkxDQmhkR0ZqTG1keUtWeHVZVzVqYUc5eUxuVndibThnUEMwZ2NHbHVkR1Z5YzJWamRDaGhibU5vYjNJdWRYQnViMXR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1WEc1Y2JteHZiM0JPZFcwZ1BDMGdibkp2ZHloc2IyOXdMblZ3Ym04cFhHNWNiaU1nVTJWc1pXTjBhVzVuSUhOaGJXVWdiblZ0WW1WeUlHOW1JR1Y0ZEhKbGJXVWdaRzkzYmlCc2IyOXdjMXh1Ykc5dmNDNWtiM2R1SUR3dElHeHZiM0F1WVd4c0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHUnBabVpmWkZSQlIxOUVUVk5QSUR3Z0xUQXVNaWtnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dScFptWmZaRlJCUjE5RVRWTlBLU0FsUGlVZ2MyeHBZMlZmYUdWaFpDaHVJRDBnYkc5dmNFNTFiU2xjYm1GdVkyaHZjaTVrYjNkdUlEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1Wkc5M2Jpa3BYRzV2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxtUnZkMjRzSUdGMFlXTXVaM0lwWEc1aGJtTm9iM0l1Wkc5M2JpQThMU0J3YVc1MFpYSnpaV04wS0dGdVkyaHZjaTVrYjNkdVczRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGRMQ0JoZEdGakxtZHlXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1YwcFhHNWNibUJnWUNKOSAtLT5cblxuYGBgclxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvclxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpXG5hbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKVxuYW5jaG9yLmFsbCA8LSBwaW50ZXJzZWN0KGFuY2hvci5hbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwLCBhdGFjLmdyKVxuYW5jaG9yLnVwIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ubywgYXRhYy5ncilcbmFuY2hvci5ubyA8LSBwaW50ZXJzZWN0KGFuY2hvci5ub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLnVwbm8gPC0gYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pXG5hbmNob3IudXBubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwbm8pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cG5vLCBhdGFjLmdyKVxuYW5jaG9yLnVwbm8gPC0gcGludGVyc2VjdChhbmNob3IudXBub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cbmxvb3BOdW0gPC0gbnJvdyhsb29wLnVwbm8pXG5cbiMgU2VsZWN0aW5nIHNhbWUgbnVtYmVyIG9mIGV4dHJlbWUgZG93biBsb29wc1xubG9vcC5kb3duIDwtIGxvb3AuYWxsICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmZfZFRBR19ETVNPIDwgLTAuMikgJT4lIGRwbHlyOjphcnJhbmdlKGRpZmZfZFRBR19ETVNPKSAlPiUgc2xpY2VfaGVhZChuID0gbG9vcE51bSlcbmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGF0YWMuZ3IpXG5hbmNob3IuZG93biA8LSBwaW50ZXJzZWN0KGFuY2hvci5kb3duW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
overlaps <- findOverlaps(anchor.up, atac.gr)
anchor.up <- pintersect(anchor.up[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
overlaps <- findOverlaps(anchor.no, atac.gr)
anchor.no <- pintersect(anchor.no[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.upno <- bind_rows(loop.up, loop.no)
anchor.upno <- (extractAnchor(loop.upno))
overlaps <- findOverlaps(anchor.upno, atac.gr)
anchor.upno <- pintersect(anchor.upno[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])


loopNum <- nrow(loop.upno)

# Selecting same number of extreme down loops
loop.down <- loop.all %>% dplyr::filter(diff_dTAG_DMSO < -0.2) %>% dplyr::arrange(diff_dTAG_DMSO) %>% slice_head(n = loopNum)
anchor.down <- (extractAnchor(loop.down))
overlaps <- findOverlaps(anchor.down, atac.gr)
anchor.down <- pintersect(anchor.down[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlYUmhZeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeEhVMDB6TVRBMk1qVTNYMEZVUVVOZlJWTkRYekV1WW1Wa1hGd3BLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hXTVN3Z1ZqSXNJRll6S1Z4dVkyOXNibUZ0WlhNb1lYUmhZeWtnUEMwZ1l5aGNYR05vY2x4Y0xDQmNYSE4wWVhKMFhGd3NJRnhjWlc1a1hGd3BYRzVoZEdGakxtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2hoZEdGaktWeHVYRzRqSUV4UFFVUkpUa2NnVEU5UFVGTmNiaU1qSXlCSmJYQnZjblJwYm1jZ1pHbG1abVZ5Wlc1MGFXRnNJSEpsWjNWc1lYUnZjbmtnYkc5dmNITWdKaUJsZUhSeVlXTjBJR0Z1WTJodmNseHViRzl2Y0M1aGJHd2dQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lUzUwYzNaY1hDa3BYRzVoYm1Ob2IzSXVZV3hzSUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVZV3hzS1NsY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l1WVd4c0xDQmhkR0ZqTG1keUtWeHVZVzVqYUc5eUxtRnNiQ0E4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1aGJHeGJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzSUdGMFlXTXVaM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhTbGNibHh1Ykc5dmNDNTFjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDJGc2JGOWtWRUZIZG5ORVRWTlBYMVZRWDJScFptWXdMakl1WW1Wa2NHVmNYQ2twWEc1aGJtTm9iM0l1ZFhBZ1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzUxY0NrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG5Wd0xDQmhkR0ZqTG1keUtWeHVZVzVqYUc5eUxuVndJRHd0SUhCcGJuUmxjbk5sWTNRb1lXNWphRzl5TG5Wd1czRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGRMQ0JoZEdGakxtZHlXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1YwcFhHNWNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjloYkd4ZlpGUkJSM1p6UkUxVFQxOU9UMTlrYVdabU1DNHlMbUpsWkhCbFhGd3BLVnh1WVc1amFHOXlMbTV2SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVibThwS1Z4dWIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjaTV1Ynl3Z1lYUmhZeTVuY2lsY2JtRnVZMmh2Y2k1dWJ5QThMU0J3YVc1MFpYSnpaV04wS0dGdVkyaHZjaTV1YjF0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0hNcFhTd2dZWFJoWXk1bmNsdHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWxkS1Z4dVhHNXNiMjl3TG5Wd2JtOGdQQzBnWW1sdVpGOXliM2R6S0d4dmIzQXVkWEFzSUd4dmIzQXVibThwWEc1aGJtTm9iM0l1ZFhCdWJ5QThMU0FvWlhoMGNtRmpkRUZ1WTJodmNpaHNiMjl3TG5Wd2JtOHBLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNTFjRzV2TENCaGRHRmpMbWR5S1Z4dVlXNWphRzl5TG5Wd2JtOGdQQzBnY0dsdWRHVnljMlZqZENoaGJtTm9iM0l1ZFhCdWIxdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVjYm14dmIzQk9kVzBnUEMwZ2JuSnZkeWhzYjI5d0xuVndibThwWEc1Y2JpTWdVMlZzWldOMGFXNW5JSE5oYldVZ2JuVnRZbVZ5SUc5bUlHVjRkSEpsYldVZ1pHOTNiaUJzYjI5d2MxeHViRzl2Y0M1a2IzZHVJRHd0SUd4dmIzQXVZV3hzSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dScFptWmZaRlJCUjE5RVRWTlBJRHdnTFRBdU1pa2dKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JwWm1aZlpGUkJSMTlFVFZOUEtTQWxQaVVnYzJ4cFkyVmZhR1ZoWkNodUlEMGdiRzl2Y0U1MWJTbGNibUZ1WTJodmNpNWtiM2R1SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVaRzkzYmlrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG1SdmQyNHNJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVaRzkzYmlBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWtiM2R1VzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZExDQmhkR0ZqTG1keVczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjBwWEc1Y2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbmF0YWMgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcR1NNMzEwNjI1N19BVEFDX0VTQ18xLmJlZFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMylcbmNvbG5hbWVzKGF0YWMpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuYXRhYy5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYXRhYylcblxuIyBMT0FESU5HIExPT1BTXG4jIyMgSW1wb3J0aW5nIGRpZmZlcmVudGlhbCByZWd1bGF0b3J5IGxvb3BzICYgZXh0cmFjdCBhbmNob3Jcbmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKVxuYW5jaG9yLmFsbCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmFsbCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmFsbCwgYXRhYy5ncilcbmFuY2hvci5hbGwgPC0gcGludGVyc2VjdChhbmNob3IuYWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cCwgYXRhYy5ncilcbmFuY2hvci51cCA8LSBwaW50ZXJzZWN0KGFuY2hvci51cFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3Iubm8sIGF0YWMuZ3IpXG5hbmNob3Iubm8gPC0gcGludGVyc2VjdChhbmNob3Iubm9bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC51cG5vIDwtIGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKVxuYW5jaG9yLnVwbm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cG5vKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXBubywgYXRhYy5ncilcbmFuY2hvci51cG5vIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwbm9bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuXG5sb29wTnVtIDwtIG5yb3cobG9vcC51cG5vKVxuXG4jIFNlbGVjdGluZyBzYW1lIG51bWJlciBvZiBleHRyZW1lIGRvd24gbG9vcHNcbmxvb3AuZG93biA8LSBsb29wLmFsbCAlPiUgZHBseXI6OmZpbHRlcihkaWZmX2RUQUdfRE1TTyA8IC0wLjIpICU+JSBkcGx5cjo6YXJyYW5nZShkaWZmX2RUQUdfRE1TTykgJT4lIHNsaWNlX2hlYWQobiA9IGxvb3BOdW0pXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBhdGFjLmdyKVxuYW5jaG9yLmRvd24gPC0gcGludGVyc2VjdChhbmNob3IuZG93bltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvclxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpXG5hbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKVxuYW5jaG9yLmFsbCA8LSBwaW50ZXJzZWN0KGFuY2hvci5hbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwLCBhdGFjLmdyKVxuYW5jaG9yLnVwIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ubywgYXRhYy5ncilcbmFuY2hvci5ubyA8LSBwaW50ZXJzZWN0KGFuY2hvci5ub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLnVwbm8gPC0gYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pXG5hbmNob3IudXBubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwbm8pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cG5vLCBhdGFjLmdyKVxuYW5jaG9yLnVwbm8gPC0gcGludGVyc2VjdChhbmNob3IudXBub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cbmxvb3BOdW0gPC0gbnJvdyhsb29wLnVwbm8pXG5cbiMgU2VsZWN0aW5nIHNhbWUgbnVtYmVyIG9mIGV4dHJlbWUgZG93biBsb29wc1xubG9vcC5kb3duIDwtIGxvb3AuYWxsICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmZfZFRBR19ETVNPIDwgLTAuMikgJT4lIGRwbHlyOjphcnJhbmdlKGRpZmZfZFRBR19ETVNPKSAlPiUgc2xpY2VfaGVhZChuID0gbG9vcE51bSlcbmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGF0YWMuZ3IpXG5hbmNob3IuZG93biA8LSBwaW50ZXJzZWN0KGFuY2hvci5kb3duW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmBgYFxuYGBgIn0= -->

```r
```r
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
overlaps <- findOverlaps(anchor.up, atac.gr)
anchor.up <- pintersect(anchor.up[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
overlaps <- findOverlaps(anchor.no, atac.gr)
anchor.no <- pintersect(anchor.no[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.upno <- bind_rows(loop.up, loop.no)
anchor.upno <- (extractAnchor(loop.upno))
overlaps <- findOverlaps(anchor.upno, atac.gr)
anchor.upno <- pintersect(anchor.upno[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])


loopNum <- nrow(loop.upno)

# Selecting same number of extreme down loops
loop.down <- loop.all %>% dplyr::filter(diff_dTAG_DMSO < -0.2) %>% dplyr::arrange(diff_dTAG_DMSO) %>% slice_head(n = loopNum)
anchor.down <- (extractAnchor(loop.down))
overlaps <- findOverlaps(anchor.down, atac.gr)
anchor.down <- pintersect(anchor.down[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJTVlU1T1NVNUhJRXhQVEVGY2JteHZiR0ZFYVhJZ1BDMGdhR1Z5WlNoY0lpNHVMeTR1TDNKbGMzVnNkQzlzYjJ4aFhDSXBYRzVrYVhJdVkzSmxZWFJsS0d4dmJHRkVhWElzSUhOb2IzZFhZWEp1YVc1bmN5QTlJRVpCVEZORkxDQnlaV04xY25OcGRtVWdQU0JVVWxWRktWeHVYRzRqSUZWUVhHNXlaWE4xYkhRZ1BTQnlkVzVNVDB4QktHRnVZMmh2Y2k1MWNDd2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVJMlozY21sMFpTaDBZaXdnYUdWeVpTaHNiMnhoUkdseUxDQmNJa3hQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZkWEJmWVd4c1RHOXZjSE5mWlhoMGNtVnRaVjloZEdGakxuUnpkbHdpS1N3Z2MyVndJRDBnWENKY1hIUmNJaWxjYmx4dUl5Qk9UMXh1Y21WemRXeDBJRDBnY25WdVRFOU1RU2hoYm1Ob2IzSXVibThzSUdGdVkyaHZjaTVoYkd3c0lHeHZiR0ZFUWlsY2JuUmlJRDBnWVhOZmRHbGlZbXhsS0hKbGMzVnNkQ2xjYmlObWQzSnBkR1VvZEdJc0lHaGxjbVVvYkc5c1lVUnBjaXdnWENKTVQweEJYMlJVUVVkZmRuTmZSRTFUVDE5a2FXWm1NQzR5WDI1dlgyRnNiRXh2YjNCelgyVjRkSEpsYldWZllYUmhZeTUwYzNaY0lpa3NJSE5sY0NBOUlGd2lYRngwWENJcFhHNWNiaU1nVlZCT1QxeHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdWRYQnVieXdnWVc1amFHOXlMbUZzYkN3Z2JHOXNZVVJDS1Z4dWRHSWdQU0JoYzE5MGFXSmliR1VvY21WemRXeDBLVnh1STJaM2NtbDBaU2gwWWl3Z2FHVnlaU2hzYjJ4aFJHbHlMQ0JjSWt4UFRFRmZaRlJCUjE5MmMxOUVUVk5QWDJScFptWXdMakpmZFhCdWIxOWhiR3hNYjI5d2MxOWxlSFJ5WlcxbFgyRjBZV011ZEhOMlhDSXBMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUtWeHVYRzVjYmlNZ1JFOVhUbHh1Y21WemRXeDBJRDBnY25WdVRFOU1RU2hoYm1Ob2IzSXVaRzkzYml3Z1lXNWphRzl5TG1Gc2JDd2diRzlzWVVSQ0tWeHVkR0lnUFNCaGMxOTBhV0ppYkdVb2NtVnpkV3gwS1Z4dUkyWjNjbWwwWlNoMFlpd2dhR1Z5WlNoc2IyeGhSR2x5TENCY0lreFBURUZmWkZSQlIxOTJjMTlFVFZOUFgyUnBabVl3TGpKZlpHOTNibDloYkd4TWIyOXdjMTlsZUhSeVpXMWxYMkYwWVdNdWRITjJYQ0lwTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1WEc1Y2JseHVJeU1qSUVoRlFWUk5RVkJjYm1Gc2NHaGhJRHd0SURBdU1EVmNiblJpTG5Wd0lEd3RJR1p5WldGa0tHaGxjbVVvYkc5c1lVUnBjaXdnWENKTVQweEJYMlJVUVVkZmRuTmZSRTFUVDE5a2FXWm1NQzR5WDNWd1gyRnNiRXh2YjNCelgyVjRkSEpsYldWZllYUmhZeTUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwS1NBbFBpVmNiaUFnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYQ0psYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWENJcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVVnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNiblJpTG01dklEd3RJR1p5WldGa0tHaGxjbVVvYkc5c1lVUnBjaXdnWENKTVQweEJYMlJVUVVkZmRuTmZSRTFUVDE5a2FXWm1NQzR5WDI1dlgyRnNiRXh2YjNCelgyVjRkSEpsYldWZllYUmhZeTUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwS1NBbFBpVmNiaUFnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYQ0psYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWENJcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVVnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNiblJpTG1SdmQyNGdQQzBnWm5KbFlXUW9hR1Z5WlNoc2IyeGhSR2x5TENCY0lreFBURUZmWkZSQlIxOTJjMTlFVFZOUFgyUnBabVl3TGpKZlpHOTNibDloYkd4TWIyOXdjMTlsZUhSeVpXMWxYMkYwWVdNdWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTa2dKVDRsWEc0Z0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ3aVpXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGd2lLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bElHUndiSGx5T2pwbmNtOTFjRjlpZVNoMFlYSm5aWFFwSUNVK0pWeHVJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc1Y2JuUmxiWEF1ZFhBZ1BDMGdkR0l1ZFhBZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG5Wd0tTQThMU0JqS0Z3aWRHRnlaMlYwWENJc0lGd2lUMUpmZFhCY0lpbGNiblJsYlhBdWJtOGdQQzBnZEdJdWJtOGdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xtNXZLU0E4TFNCaktGd2lkR0Z5WjJWMFhDSXNJRndpVDFKZmJtOWNJaWxjYm5SbGJYQXVaRzkzYmlBOExTQjBZaTVrYjNkdUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2IyUmtjMUpoZEdsdktWeHVZMjlzYm1GdFpYTW9kR1Z0Y0M1a2IzZHVLU0E4TFNCaktGd2lkR0Z5WjJWMFhDSXNJRndpVDFKZlpHOTNibHdpS1Z4dVhHNWNiblJsYlhBZ1BDMGdablZzYkY5cWIybHVLR1oxYkd4ZmFtOXBiaWgwWlcxd0xuVndMQ0IwWlcxd0xtNXZMQ0JpZVNBOUlHTW9YQ0owWVhKblpYUmNJaWtwTENCMFpXMXdMbVJ2ZDI0c0lHSjVJRDBnWXloY0luUmhjbWRsZEZ3aUtTa2dKVDRsSUcxMWRHRjBaVjloYkd3b2ZuSmxjR3hoWTJWZmJtRW9MaXdnTVNrcFhHNWNibVJoZEdFZ1BDMGdZWE11YldGMGNtbDRLSFJsYlhCYk1qbzBYU2xjYm5KdmQyNWhiV1Z6S0dSaGRHRXBJRHd0SUhSbGJYQWtkR0Z5WjJWMFhHNWNibXhwWW5KaGNua29ZMmx5WTJ4cGVtVXBYRzVqYjJ4ZlpuVnVJRHd0SUdOdmJHOXlVbUZ0Y0RJb1l5aHRhVzRvWkdGMFlTa3NJRzFoZUNoa1lYUmhLU2tzSUdNb1hDSjNhR2wwWlZ3aUxDQmNJbkpsWkZ3aUtTbGNibHh1WEc0alpuWnBlbDl1WW1Oc2RYTjBLR1JoZEdFc0lHdHRaV0Z1Y3l3Z2JXVjBhRzlrSUQwZ1hDSjNjM05jSWlsY2JseHVJeUJ3SUR3dElFaGxZWFJ0WVhBb1hHNGpJQ0FnWkdGMFlTeGNiaU1nSUNCdVlXMWxJRDBnWENKUFpHUnpJRkpoZEdsdlhDSXNJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ01nVG1GdFpTQnZaaUIwYUdVZ2FHVmhkRzFoY0NCc1pXZGxibVJjYmlNZ0lDQmpiSFZ6ZEdWeVgyTnZiSFZ0Ym5NZ1BTQkdRVXhUUlN3Z0lDQWdJQ0FnSUNBZ0lDQWpJRkpsYlc5MlpTQmpiMngxYlc0Z1pHVnVaSEp2WjNKaGJWeHVJeUFnSUhKdmQxOXJiU0E5SURFd0xDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklFUmxabWx1WlNCMGFHVWdiblZ0WW1WeUlHOW1JR3N0YldWaGJuTWdZMngxYzNSbGNuTWdabTl5SUhKdmQzTWdLR0ZrYW5WemRDQmhjeUJ1WldWa1pXUXBYRzRqSUNBZ2MyaHZkMTl5YjNkZlpHVnVaQ0E5SUVaQlRGTkZMRnh1SXlBZ0lHTnZiQ0E5SUdOdmJGOW1kVzRzWEc0aklDQWdZbTl5WkdWeUlEMGdWRkpWUlZ4dUl5QXBYRzRqSUZ4dUl5Qm1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0poYm1Ob2IzSk1UMHhCWDJSVVFVZGZkbk5mUkUxVFQxOWthV1ptTUM0eVgyRnNiRXh2YjNCelgyVjRkSEpsYldWZllXeHNRVzVqYUc5eVFtRmphMmR5YjNWdVpGOWhkR0ZqWENJcFhHNGpJR2hsYVdkb2RDQThMU0EzWEc0aklIZHBaSFJvSUR3dElETXVOVnh1SXlCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRqSUhCeWFXNTBLSEFwWEc0aklHUmxkaTV2Wm1Zb0tWeHVJeUJ6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0aklIQnlhVzUwS0hBcFhHNGpJR1JsZGk1dlptWW9LVnh1WEc1Y2JseHVYRzRqSXlNZ1ZtbHpkV0ZzYVhwcGJtY2djQzEyWVd4MVpTQmhibVFnVDFKY2JtRnNjR2hoSUR3dElEQXVNRFZjYmlNZ2RHSXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaHNiMnhoUkdseUxDQmNJa3hQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZkWEJmWVd4c1RHOXZjSE5mWlhoMGNtVnRaVjloZEdGakxuUnpkbHdpS1NrZ0pUNGxYRzRqSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU3hjYmlNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGV1lXeDFaVXh2WnlBOUlDMXNiMmN5S0hGV1lXeDFaU2tzWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbmNtOTFjQ0E5SUZ3aVZWQmNJaWtnSlQ0bFhHNGpJQ0FnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYQ0psYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWENJcElDVStKVnh1SXlBZ0lHUndiSGx5T2pwbWFXeDBaWElvY1ZaaGJIVmxJRHdnWVd4d2FHRXBJQ1UrSlNCa2NHeDVjam82WjNKdmRYQmZZbmtvZEdGeVoyVjBLU0FsUGlWY2JpTWdJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc0aklIUmlMbTV2SUR3dElHWnlaV0ZrS0dobGNtVW9iRzlzWVVScGNpd2dYQ0pNVDB4QlgyUlVRVWRmZG5OZlJFMVRUMTlrYVdabU1DNHlYMjV2WDJGc2JFeHZiM0J6WDJWNGRISmxiV1ZmWVhSaFl5NTBjM1pjSWlrcElDVStKVnh1SXlBZ0lHUndiSGx5T2pwdGRYUmhkR1VvZEdGeVoyVjBJRDBnZEc5MWNIQmxjaWhoYm5ScFltOWtlU2tzWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeFZtRnNkV1ZNYjJjZ1BTQXRiRzluTWloeFZtRnNkV1VwTEZ4dUl5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ozSnZkWEFnUFNCY0lrNVBYQ0lwSUNVK0pWeHVJeUFnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRndpWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ3aUtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlVZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGpJQ0FnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dWRHSXVkWEJ1YnlBOExTQm1jbVZoWkNob1pYSmxLR3h2YkdGRWFYSXNJRndpVEU5TVFWOWtWRUZIWDNaelgwUk5VMDlmWkdsbVpqQXVNbDkxY0c1dlgyRnNiRXh2YjNCelgyVjRkSEpsYldWZllYUmhZeTUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGV1lXeDFaVXh2WnlBOUlDMXNiMmN4TUNoeFZtRnNkV1VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkeWIzVndJRDBnWENKVlVDOU9UMXdpS1NBbFBpVmNiaUFnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYQ0psYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWENJcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVVnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNibVozY21sMFpTaDBZaTUxY0c1dklDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHTW9NalFzSURFMkxDQXlNQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTkN3Z01qVXNJRFVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSURjc0lEZ3NJRGtzSURFd0xDQXhNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTVRJc0lERXpMQ0F4TkNrcExDQm9aWEpsS0d4dmJHRkVhWElzSUZ3aVRFOU1RVjlrVkVGSFgzWnpYMFJOVTA5ZlpHbG1aakF1TWw5MWNHNXZYMkZzYkV4dmIzQnpYMlY0ZEhKbGJXVmZZWFJoWTE5d2RXSXVkSE4yWENJcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dWRHSXVaRzkzYmlBOExTQm1jbVZoWkNob1pYSmxLR3h2YkdGRWFYSXNJRndpVEU5TVFWOWtWRUZIWDNaelgwUk5VMDlmWkdsbVpqQXVNbDlrYjNkdVgyRnNiRXh2YjNCelgyVjRkSEpsYldWZllYUmhZeTUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGV1lXeDFaVXh2WnlBOUlDMXNiMmN4TUNoeFZtRnNkV1VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkeWIzVndJRDBnWENKRVQxZE9YQ0lwSUNVK0pWeHVJQ0JtYVd4MFpYSW9jM1J5WDNSdlgyeHZkMlZ5S0dObGJHeFVlWEJsS1NBOVBTQmNJbVZ0WW5KNWIyNXBZeUJ6ZEdWdElHTmxiR3hjSWlrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKU0JrY0d4NWNqbzZaM0p2ZFhCZllua29kR0Z5WjJWMEtTQWxQaVZjYmlBZ2MyeHBZMlZmYldsdUtHMWxZVzVTYm1zc0lIZHBkR2hmZEdsbGN5QTlJRVpCVEZORktWeHVabmR5YVhSbEtIUmlMbVJ2ZDI0Z0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1l5Z3lOQ3dnTVRZc0lESXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0EwTENBeU5Td2dOU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTnl3Z09Dd2dPU3dnTVRBc0lERXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F4TWl3Z01UTXNJREUwS1Nrc0lHaGxjbVVvYkc5c1lVUnBjaXdnWENKTVQweEJYMlJVUVVkZmRuTmZSRTFUVDE5a2FXWm1NQzR5WDJSdmQyNWZZV3hzVEc5dmNITmZaWGgwY21WdFpWOWhkR0ZqWDNCMVlpNTBjM1pjSWlrc0lITmxjQ0E5SUZ3aVhGeDBYQ0lwWEc1Y2JpTWdkR1Z0Y0M1MWNDQThMU0IwWWk1MWNDQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHOWtaSE5TWVhScGJ5d2djVlpoYkhWbFRHOW5MQ0JuY205MWNDbGNiaU1nZEdWdGNDNXVieUE4TFNCMFlpNXVieUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJRzlrWkhOU1lYUnBieXdnY1ZaaGJIVmxURzluTENCbmNtOTFjQ2xjYm5SbGJYQXVkWEJ1YnlBOExTQjBZaTUxY0c1dklDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2IyUmtjMUpoZEdsdkxDQnhWbUZzZFdWTWIyY3NJR2R5YjNWd0tWeHVkR1Z0Y0M1a2IzZHVJRHd0SUhSaUxtUnZkMjRnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0J2WkdSelVtRjBhVzhzSUhGV1lXeDFaVXh2Wnl3Z1ozSnZkWEFwWEc1Y2JuUmxiWEFnUEMwZ1ltbHVaRjl5YjNkektIUmxiWEF1ZFhCdWJ5d2dkR1Z0Y0M1a2IzZHVLVnh1SXlCY2JpTWdiM0prWlhJZ1BDMGdZeWdvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNJbFZRTDA1UFhDSXBJQ1UrSlNCaGNuSmhibWRsS0dSbGMyTW9iMlJrYzFKaGRHbHZLU2twSkhSaGNtZGxkQ3dnWEc0aklDQWdJQ0FnSUNBZ0lDQWdLSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1hDSkVUMWRPWENJcElDVStKU0JoY25KaGJtZGxLR1JsYzJNb2IyUmtjMUpoZEdsdktTa3BKSFJoY21kbGRDbGNiaU1nZEdWdGNDUjBZWEpuWlhRZ1BDMGdabUZqZEc5eUtIUmxiWEFrZEdGeVoyVjBMQ0JzWlhabGJITWdQU0J5WlhZb2IzSmtaWElwS1Z4dWRHVnRjQ1JuY205MWNDQThMU0JtWVdOMGIzSW9kR1Z0Y0NSbmNtOTFjQ3dnYkdWMlpXeHpJRDBnWXloY0lsVlFMMDVQWENJc0lGd2lSRTlYVGx3aUtTbGNibHh1WEc1MFlYSm5aWFJNYVhOMElEd3RJR01vWENKUVQweFNNa0ZjSWl3Z1hDSkRWRkk1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSkJSa1kwWENJc0lGd2lSVXhNTWx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lUVVZFTVZ3aUxDQmNJazFGUkRFeVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0pVUWxCY0lpd2dYQ0pVUVVZeFhDSXNJRndpVkVGR00xd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpUlZOU1VrSmNJaXdnWENKTFRFWTBYQ0lzSUZ3aVRrRk9UMGRjSWl3Z1hDSlFUMVUxUmpGY0lpd2dYQ0pUVDFneVhDSXNJRndpVTFSQlZETmNJaXdnWENKRk1rWXhYQ0lzSUZ3aVdWa3hYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKRlVETXdNRndpTENCY0lrUlFXVE13WENJc0lGd2lSVnBJTWx3aUxDQmNJa3RFVFRKQ1hDSXNJRndpUzBSQ05FSmNJaXdnWENKTFJFMDBRMXdpTENCY0lrdEVUVFpDWENJc0lGd2lVa0pDVURWY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbEpCUkRJeFhDSXNJRndpVTAxRE1VRmNJaXdnWENKVFRVTXpYQ0lzSUZ3aVExUkRSbHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVNrRlNTVVF5WENJc0lGd2lVMVZhTVRKY0lseHVLVnh1ZEdWdGNDQThMU0IwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIUmhjbWRsZENBbGFXNGxJSFJoY21kbGRFeHBjM1FwWEc1Y2JuUmxiWEFrZEdGeVoyVjBJRHd0SUdaaFkzUnZjaWgwWlcxd0pIUmhjbWRsZEN3Z2JHVjJaV3h6SUQwZ2NtVjJLSFJoY21kbGRFeHBjM1FwS1Z4dUl5Qk5RVmdnY1ZaaGJIVmxURzluSUhSdklEVXdYRzV4Vm1Gc2RXVk1iMmROWVhnZ1BDMGdOVEJjYm5SbGJYQXlJRHd0SUhSbGJYQWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9jVlpoYkhWbFRHOW5JRDBnYldsdUtIRldZV3gxWlV4dlp5d2djVlpoYkhWbFRHOW5UV0Y0S1NsY2JuQWdQQzBnWjJkd2JHOTBLSFJsYlhBeUxDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdkR0Z5WjJWMExDQm1hV3hzSUQwZ2IyUmtjMUpoZEdsdkxDQnphWHBsSUQwZ2NWWmhiSFZsVEc5bktTa2dLMXh1SUNCblpXOXRYM0J2YVc1MEtITm9ZWEJsSUQwZ01qRXNJQ0FnSUNBZ0lDQWpJRVZ1YzNWeVpYTWdZU0J3YjJsdWRDQjNhWFJvSUdGdUlHOTFkR3hwYm1WY2JpQWdJQ0FnSUNBZ0lDQWdJQ0J6ZEhKdmEyVWdQU0F3TGpVcWNIUlViMDFOSUNBZ0lDQWdJeUJNYVc1bElIZHBaSFJvSUdadmNpQjBhR1VnWW05eVpHVnlYRzRnSUNrZ0t5QjBhR1Z0WlY5aWR5Z3BJQ3NnWEc0Z0lITmpZV3hsWDNOcGVtVmZZMjl1ZEdsdWRXOTFjeWh5WVc1blpTQTlJR01vTUM0MUxDQXlLU2tnS3lBZ0l5QlRaWFFnYldsdUlHRnVaQ0J0WVhnZ2NHOXBiblFnYzJsNlpYTWdhR1Z5WlZ4dUlDQnpZMkZzWlY5bWFXeHNYMmR5WVdScFpXNTBLR3h2ZHlBOUlGd2lkMmhwZEdWY0lpd2dhR2xuYUNBOUlGd2lJME5DTXpNelFWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHBiV2wwY3lBOUlHTW9NU3dnTXlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjI5aUlEMGdjMk5oYkdWek9qcHpjWFZwYzJnc0lDTWdSR1ZtYVc1bElHZHlZV1JwWlc1MElHTnZiRzl5YzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2QxYVdSbElEMGdaM1ZwWkdWZlkyOXNiM0ppWVhJb1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlYSjNhV1IwYUNBOUlERXVOUzgxTGpBNExDQWdJeUJCWkdwMWMzUWdkMmxrZEdnZ2IyWWdkR2hsSUdOdmJHOXlJR0poY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GeWFHVnBaMmgwSUQwZ01UVXZOUzR3T0NBZ0lDTWdRV1JxZFhOMElHaGxhV2RvZENCdlppQjBhR1VnWTI5c2IzSWdZbUZ5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLVnh1SUNBcElDc2dYRzRnSUd4aFluTW9lQ0E5SUU1VlRFd3NJSGtnUFNCT1ZVeE1LU0FnSzF4dUlDQjBhR1Z0WlNoY2JpQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5eGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5eGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0JoYm1kc1pTQTlJRFExTENBZ0lDQWdJQ01nVW05MFlYUmxJSGd0WVhocGN5QnNZV0psYkhNZ05EVWdaR1ZuY21WbGMxeHVJQ0FnSUNBZ2FHcDFjM1FnUFNBeExDQWdJQ0FnSUNBaklFRmthblZ6ZENCb2IzSnBlbTl1ZEdGc0lHcDFjM1JwWm1sallYUnBiMjVjYmlBZ0lDQWdJSFpxZFhOMElEMGdNU0FnSUNBZ0lDQWdJeUJCWkdwMWMzUWdkbVZ5ZEdsallXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1c2FXNWxJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdsamEzTWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYQ0owY21GdWMzQmhjbVZ1ZEZ3aUtTeGNiaUFnSUNCc1pXZGxibVF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnYkdWblpXNWtMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1Z4dUlDQXBYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0ltRnVZMmh2Y2t4UFRFRmZaRlJCUjE5MmMxOUVUVk5QWDJScFptWXdMakpmWVd4c1RHOXZjSE5mWlhoMGNtVnRaVjlQVWw5eFZtRnNkV1ZmWVd4c1FXNWphRzl5UW1GamEyZHliM1Z1WkY5aGRHRmpYMjl5WkdWeVpXUmNJaWxjYm5kcFpIUm9JRHd0SUhCaGJtVnNVMmw2WlNneExqVXBLbTF0Vkc5SmJtTm9YRzVvWldsbmFIUWdQQzBnY0dGdVpXeFRhWHBsS0RJdU5Ta3FiVzFVYjBsdVkyaGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JseHVYRzVjYmx4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jIFJVTk5JTkcgTE9MQVxubG9sYURpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0L2xvbGFcXClcbmRpci5jcmVhdGUobG9sYURpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpXG5cbiMgVVBcbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLnVwLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG4jZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl91cF9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG4jIE5PXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5ubywgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuI2Z3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfbm9fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBVUE5PXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci51cG5vLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG4jZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl91cG5vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cblxuIyBET1dOXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5kb3duLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG4jZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cblxuXG4jIyMgSEVBVE1BUFxuYWxwaGEgPC0gMC4wNVxudGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBfYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfbm9fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAudXApIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl91cFxcKVxudGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAubm8pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9ub1xcKVxudGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmRvd24pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9kb3duXFwpXG5cblxudGVtcCA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAudXAsIHRlbXAubm8sIGJ5ID0gYyhcXHRhcmdldFxcKSksIHRlbXAuZG93biwgYnkgPSBjKFxcdGFyZ2V0XFwpKSAlPiUgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcblxuZGF0YSA8LSBhcy5tYXRyaXgodGVtcFsyOjRdKVxucm93bmFtZXMoZGF0YSkgPC0gdGVtcCR0YXJnZXRcblxubGlicmFyeShjaXJjbGl6ZSlcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKG1pbihkYXRhKSwgbWF4KGRhdGEpKSwgYyhcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5cbiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSBcXHdzc1xcKVxuXG4jIHAgPC0gSGVhdG1hcChcbiMgICBkYXRhLFxuIyAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZFxuIyAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4jICAgcm93X2ttID0gMTAsICAgICAgICAgICAgICAgICAgICAgICAgICMgRGVmaW5lIHRoZSBudW1iZXIgb2Ygay1tZWFucyBjbHVzdGVycyBmb3Igcm93cyAoYWRqdXN0IGFzIG5lZWRlZClcbiMgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4jICAgY29sID0gY29sX2Z1bixcbiMgICBib3JkZXIgPSBUUlVFXG4jIClcbiMgXG4jIGZpbGVOYW1lIDwtIHBhc3RlMChcXGFuY2hvckxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfYWxsTG9vcHNfZXh0cmVtZV9hbGxBbmNob3JCYWNrZ3JvdW5kX2F0YWNcXClcbiMgaGVpZ2h0IDwtIDdcbiMgd2lkdGggPC0gMy41XG4jIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG4jIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5cblxuXG5cbiMjIyBWaXN1YWxpemluZyBwLXZhbHVlIGFuZCBPUlxuYWxwaGEgPC0gMC4wNVxuIyB0Yi51cCA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl91cF9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuIyAgICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiMgICAgICAgICAgICAgICAgIGdyb3VwID0gXFxVUFxcKSAlPiVcbiMgICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4jICAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuIyAgIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbiMgdGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfbm9fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSkgJT4lXG4jICAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiMgICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4jICAgICAgICAgICAgICAgICBncm91cCA9IFxcTk9cXCkgJT4lXG4jICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuIyAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiMgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi51cG5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3Vwbm9fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4gICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzEwKHFWYWx1ZSksXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBcXFVQL05PXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuZndyaXRlKHRiLnVwbm8gJT4lIGRwbHlyOjpzZWxlY3QoYygyNCwgMTYsIDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAyNSwgNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgOCwgOSwgMTAsIDExLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgMTMsIDE0KSksIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3Vwbm9fYWxsTG9vcHNfZXh0cmVtZV9hdGFjX3B1Yi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG50Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2Rvd25fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4gICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzEwKHFWYWx1ZSksXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBcXERPV05cXCkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5md3JpdGUodGIuZG93biAlPiUgZHBseXI6OnNlbGVjdChjKDI0LCAxNiwgMjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDI1LCA1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCA4LCA5LCAxMCwgMTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCAxMywgMTQpKSwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfZG93bl9hbGxMb29wc19leHRyZW1lX2F0YWNfcHViLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyB0ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxuIyB0ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxudGVtcC51cG5vIDwtIHRiLnVwbm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG50ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcblxudGVtcCA8LSBiaW5kX3Jvd3ModGVtcC51cG5vLCB0ZW1wLmRvd24pXG4jIFxuIyBvcmRlciA8LSBjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcVVAvTk9cXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0LCBcbiMgICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXERPV05cXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0KVxuIyB0ZW1wJHRhcmdldCA8LSBmYWN0b3IodGVtcCR0YXJnZXQsIGxldmVscyA9IHJldihvcmRlcikpXG50ZW1wJGdyb3VwIDwtIGZhY3Rvcih0ZW1wJGdyb3VwLCBsZXZlbHMgPSBjKFxcVVAvTk9cXCwgXFxET1dOXFwpKVxuXG5cbnRhcmdldExpc3QgPC0gYyhcXFBPTFIyQVxcLCBcXENUUjlcXCxcbiAgICAgICAgICAgICAgICBcXEFGRjRcXCwgXFxFTEwyXFwsXG4gICAgICAgICAgICAgICAgXFxNRUQxXFwsIFxcTUVEMTJcXCxcbiAgICAgICAgICAgICAgICBcXFRCUFxcLCBcXFRBRjFcXCwgXFxUQUYzXFwsXG4gICAgICAgICAgICAgICAgXFxFU1JSQlxcLCBcXEtMRjRcXCwgXFxOQU5PR1xcLCBcXFBPVTVGMVxcLCBcXFNPWDJcXCwgXFxTVEFUM1xcLCBcXEUyRjFcXCwgXFxZWTFcXCxcbiAgICAgICAgICAgICAgICBcXEVQMzAwXFwsIFxcRFBZMzBcXCwgXFxFWkgyXFwsIFxcS0RNMkJcXCwgXFxLREI0QlxcLCBcXEtETTRDXFwsIFxcS0RNNkJcXCwgXFxSQkJQNVxcLFxuICAgICAgICAgICAgICAgIFxcUkFEMjFcXCwgXFxTTUMxQVxcLCBcXFNNQzNcXCwgXFxDVENGXFwsXG4gICAgICAgICAgICAgICAgXFxKQVJJRDJcXCwgXFxTVVoxMlxcXG4pXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIodGFyZ2V0ICVpbiUgdGFyZ2V0TGlzdClcblxudGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYodGFyZ2V0TGlzdCkpXG4jIE1BWCBxVmFsdWVMb2cgdG8gNTBcbnFWYWx1ZUxvZ01heCA8LSA1MFxudGVtcDIgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShxVmFsdWVMb2cgPSBtaW4ocVZhbHVlTG9nLCBxVmFsdWVMb2dNYXgpKVxucCA8LSBnZ3Bsb3QodGVtcDIsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGZpbGwgPSBvZGRzUmF0aW8sIHNpemUgPSBxVmFsdWVMb2cpKSArXG4gIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZVxuICAgICAgICAgICAgIHN0cm9rZSA9IDAuNSpwdFRvTU0gICAgICAjIExpbmUgd2lkdGggZm9yIHRoZSBib3JkZXJcbiAgKSArIHRoZW1lX2J3KCkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjUsIDIpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlXG4gIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gXFx3aGl0ZVxcLCBoaWdoID0gXFwjQ0IzMzNBXFwsXG4gICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLCAzKSxcbiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICkgKyBcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcYW5jaG9yTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9hbGxMb29wc19leHRyZW1lX09SX3FWYWx1ZV9hbGxBbmNob3JCYWNrZ3JvdW5kX2F0YWNfb3JkZXJlZFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMi41KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cblxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# RUNNING LOLA
lolaDir <- here(\../../result/lola\)
dir.create(lolaDir, showWarnings = FALSE, recursive = TRUE)

# UP
result = runLOLA(anchor.up, anchor.all, lolaDB)
tb = as_tibble(result)
#fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_allLoops_extreme_atac.tsv\), sep = \\t\)

# NO
result = runLOLA(anchor.no, anchor.all, lolaDB)
tb = as_tibble(result)
#fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_allLoops_extreme_atac.tsv\), sep = \\t\)

# UPNO
result = runLOLA(anchor.upno, anchor.all, lolaDB)
tb = as_tibble(result)
#fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_upno_allLoops_extreme_atac.tsv\), sep = \\t\)


# DOWN
result = runLOLA(anchor.down, anchor.all, lolaDB)
tb = as_tibble(result)
#fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_allLoops_extreme_atac.tsv\), sep = \\t\)



### HEATMAP
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio)
colnames(temp.up) <- c(\target\, \OR_up\)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio)
colnames(temp.no) <- c(\target\, \OR_no\)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio)
colnames(temp.down) <- c(\target\, \OR_down\)


temp <- full_join(full_join(temp.up, temp.no, by = c(\target\)), temp.down, by = c(\target\)) %>% mutate_all(~replace_na(., 1))

data <- as.matrix(temp[2:4])
rownames(data) <- temp$target

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

# p <- Heatmap(
#   data,
#   name = \Odds Ratio\,                   # Name of the heatmap legend
#   cluster_columns = FALSE,            # Remove column dendrogram
#   row_km = 10,                         # Define the number of k-means clusters for rows (adjust as needed)
#   show_row_dend = FALSE,
#   col = col_fun,
#   border = TRUE
# )
# 
# fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_diff0.2_allLoops_extreme_allAnchorBackground_atac\)
# height <- 7
# width <- 3.5
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()




### Visualizing p-value and OR
alpha <- 0.05
# tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_allLoops_extreme_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \UP\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)
# tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_allLoops_extreme_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \NO\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)
tb.upno <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_upno_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log10(qValue),
                group = \UP/NO\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
fwrite(tb.upno %>% dplyr::select(c(24, 16, 20,
                                   4, 25, 5,
                                   7, 8, 9, 10, 11,
                                   12, 13, 14)), here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_upno_allLoops_extreme_atac_pub.tsv\), sep = \\t\)
tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log10(qValue),
                group = \DOWN\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
fwrite(tb.down %>% dplyr::select(c(24, 16, 20,
                                   4, 25, 5,
                                   7, 8, 9, 10, 11,
                                   12, 13, 14)), here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_allLoops_extreme_atac_pub.tsv\), sep = \\t\)

# temp.up <- tb.up %>% dplyr::select(target, oddsRatio, qValueLog, group)
# temp.no <- tb.no %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.upno <- tb.upno %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio, qValueLog, group)

temp <- bind_rows(temp.upno, temp.down)
# 
# order <- c((temp %>% dplyr::filter(group == \UP/NO\) %>% arrange(desc(oddsRatio)))$target, 
#            (temp %>% dplyr::filter(group == \DOWN\) %>% arrange(desc(oddsRatio)))$target)
# temp$target <- factor(temp$target, levels = rev(order))
temp$group <- factor(temp$group, levels = c(\UP/NO\, \DOWN\))


targetList <- c(\POLR2A\, \CTR9\,
                \AFF4\, \ELL2\,
                \MED1\, \MED12\,
                \TBP\, \TAF1\, \TAF3\,
                \ESRRB\, \KLF4\, \NANOG\, \POU5F1\, \SOX2\, \STAT3\, \E2F1\, \YY1\,
                \EP300\, \DPY30\, \EZH2\, \KDM2B\, \KDB4B\, \KDM4C\, \KDM6B\, \RBBP5\,
                \RAD21\, \SMC1A\, \SMC3\, \CTCF\,
                \JARID2\, \SUZ12\
)
temp <- temp %>% dplyr::filter(target %in% targetList)

temp$target <- factor(temp$target, levels = rev(targetList))
# MAX qValueLog to 50
qValueLogMax <- 50
temp2 <- temp %>% dplyr::mutate(qValueLog = min(qValueLog, qValueLogMax))
p <- ggplot(temp2, aes(x = group, y = target, fill = oddsRatio, size = qValueLog)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 0.5*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = \white\, high = \#CB333A\,
                      limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_diff0.2_allLoops_extreme_OR_qValue_allAnchorBackground_atac_ordered\)
width <- panelSize(1.5)*mmToInch
height <- panelSize(2.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QlNWVTVPU1U1SElFeFBURUZjYm14dmJHRkVhWElnUEMwZ2FHVnlaU2hjWEM0dUx5NHVMM0psYzNWc2RDOXNiMnhoWEZ3cFhHNWthWEl1WTNKbFlYUmxLR3h2YkdGRWFYSXNJSE5vYjNkWFlYSnVhVzVuY3lBOUlFWkJURk5GTENCeVpXTjFjbk5wZG1VZ1BTQlVVbFZGS1Z4dVhHNGpJRlZRWEc1eVpYTjFiSFFnUFNCeWRXNU1UMHhCS0dGdVkyaHZjaTUxY0N3Z1lXNWphRzl5TG1Gc2JDd2diRzlzWVVSQ0tWeHVkR0lnUFNCaGMxOTBhV0ppYkdVb2NtVnpkV3gwS1Z4dUkyWjNjbWwwWlNoMFlpd2dhR1Z5WlNoc2IyeGhSR2x5TENCY1hFeFBURUZmWkZSQlIxOTJjMTlFVFZOUFgyUnBabVl3TGpKZmRYQmZZV3hzVEc5dmNITmZaWGgwY21WdFpWOWhkR0ZqTG5SemRseGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDbGNibHh1SXlCT1QxeHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdWJtOHNJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYm5SaUlEMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNiaU5tZDNKcGRHVW9kR0lzSUdobGNtVW9iRzlzWVVScGNpd2dYRnhNVDB4QlgyUlVRVWRmZG5OZlJFMVRUMTlrYVdabU1DNHlYMjV2WDJGc2JFeHZiM0J6WDJWNGRISmxiV1ZmWVhSaFl5NTBjM1pjWENrc0lITmxjQ0E5SUZ4Y1hGeDBYRndwWEc1Y2JpTWdWVkJPVDF4dWNtVnpkV3gwSUQwZ2NuVnVURTlNUVNoaGJtTm9iM0l1ZFhCdWJ5d2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVJMlozY21sMFpTaDBZaXdnYUdWeVpTaHNiMnhoUkdseUxDQmNYRXhQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZkWEJ1YjE5aGJHeE1iMjl3YzE5bGVIUnlaVzFsWDJGMFlXTXVkSE4yWEZ3cExDQnpaWEFnUFNCY1hGeGNkRnhjS1Z4dVhHNWNiaU1nUkU5WFRseHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdVpHOTNiaXdnWVc1amFHOXlMbUZzYkN3Z2JHOXNZVVJDS1Z4dWRHSWdQU0JoYzE5MGFXSmliR1VvY21WemRXeDBLVnh1STJaM2NtbDBaU2gwWWl3Z2FHVnlaU2hzYjJ4aFJHbHlMQ0JjWEV4UFRFRmZaRlJCUjE5MmMxOUVUVk5QWDJScFptWXdMakpmWkc5M2JsOWhiR3hNYjI5d2MxOWxlSFJ5WlcxbFgyRjBZV011ZEhOMlhGd3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVYRzVjYmx4dUl5TWpJRWhGUVZSTlFWQmNibUZzY0doaElEd3RJREF1TURWY2JuUmlMblZ3SUR3dElHWnlaV0ZrS0dobGNtVW9iRzlzWVVScGNpd2dYRnhNVDB4QlgyUlVRVWRmZG5OZlJFMVRUMTlrYVdabU1DNHlYM1Z3WDJGc2JFeHZiM0J6WDJWNGRISmxiV1ZmWVhSaFl5NTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoY21kbGRDQTlJSFJ2ZFhCd1pYSW9ZVzUwYVdKdlpIa3BLU0FsUGlWY2JpQWdabWxzZEdWeUtITjBjbDkwYjE5c2IzZGxjaWhqWld4c1ZIbHdaU2tnUFQwZ1hGeGxiV0p5ZVc5dWFXTWdjM1JsYlNCalpXeHNYRndwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIRldZV3gxWlNBOElHRnNjR2hoS1NBbFBpVWdaSEJzZVhJNk9tZHliM1Z3WDJKNUtIUmhjbWRsZENrZ0pUNGxYRzRnSUhOc2FXTmxYMjFwYmlodFpXRnVVbTVyTENCM2FYUm9YM1JwWlhNZ1BTQkdRVXhUUlNsY2JuUmlMbTV2SUR3dElHWnlaV0ZrS0dobGNtVW9iRzlzWVVScGNpd2dYRnhNVDB4QlgyUlVRVWRmZG5OZlJFMVRUMTlrYVdabU1DNHlYMjV2WDJGc2JFeHZiM0J6WDJWNGRISmxiV1ZmWVhSaFl5NTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoY21kbGRDQTlJSFJ2ZFhCd1pYSW9ZVzUwYVdKdlpIa3BLU0FsUGlWY2JpQWdabWxzZEdWeUtITjBjbDkwYjE5c2IzZGxjaWhqWld4c1ZIbHdaU2tnUFQwZ1hGeGxiV0p5ZVc5dWFXTWdjM1JsYlNCalpXeHNYRndwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIRldZV3gxWlNBOElHRnNjR2hoS1NBbFBpVWdaSEJzZVhJNk9tZHliM1Z3WDJKNUtIUmhjbWRsZENrZ0pUNGxYRzRnSUhOc2FXTmxYMjFwYmlodFpXRnVVbTVyTENCM2FYUm9YM1JwWlhNZ1BTQkdRVXhUUlNsY2JuUmlMbVJ2ZDI0Z1BDMGdabkpsWVdRb2FHVnlaU2hzYjJ4aFJHbHlMQ0JjWEV4UFRFRmZaRlJCUjE5MmMxOUVUVk5QWDJScFptWXdMakpmWkc5M2JsOWhiR3hNYjI5d2MxOWxlSFJ5WlcxbFgyRjBZV011ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1NrZ0pUNGxYRzRnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRnhjWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ4Y0tTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh4Vm1Gc2RXVWdQQ0JoYkhCb1lTa2dKVDRsSUdSd2JIbHlPanBuY205MWNGOWllU2gwWVhKblpYUXBJQ1UrSlZ4dUlDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzVjYm5SbGJYQXVkWEFnUEMwZ2RHSXVkWEFnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0J2WkdSelVtRjBhVzhwWEc1amIyeHVZVzFsY3loMFpXMXdMblZ3S1NBOExTQmpLRnhjZEdGeVoyVjBYRndzSUZ4Y1QxSmZkWEJjWENsY2JuUmxiWEF1Ym04Z1BDMGdkR0l1Ym04Z0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG01dktTQThMU0JqS0Z4Y2RHRnlaMlYwWEZ3c0lGeGNUMUpmYm05Y1hDbGNiblJsYlhBdVpHOTNiaUE4TFNCMFlpNWtiM2R1SUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYjJSa2MxSmhkR2x2S1Z4dVkyOXNibUZ0WlhNb2RHVnRjQzVrYjNkdUtTQThMU0JqS0Z4Y2RHRnlaMlYwWEZ3c0lGeGNUMUpmWkc5M2JseGNLVnh1WEc1Y2JuUmxiWEFnUEMwZ1puVnNiRjlxYjJsdUtHWjFiR3hmYW05cGJpaDBaVzF3TG5Wd0xDQjBaVzF3TG01dkxDQmllU0E5SUdNb1hGeDBZWEpuWlhSY1hDa3BMQ0IwWlcxd0xtUnZkMjRzSUdKNUlEMGdZeWhjWEhSaGNtZGxkRnhjS1NrZ0pUNGxJRzExZEdGMFpWOWhiR3dvZm5KbGNHeGhZMlZmYm1Fb0xpd2dNU2twWEc1Y2JtUmhkR0VnUEMwZ1lYTXViV0YwY21sNEtIUmxiWEJiTWpvMFhTbGNibkp2ZDI1aGJXVnpLR1JoZEdFcElEd3RJSFJsYlhBa2RHRnlaMlYwWEc1Y2JteHBZbkpoY25rb1kybHlZMnhwZW1VcFhHNWpiMnhmWm5WdUlEd3RJR052Ykc5eVVtRnRjRElvWXlodGFXNG9aR0YwWVNrc0lHMWhlQ2hrWVhSaEtTa3NJR01vWEZ4M2FHbDBaVnhjTENCY1hISmxaRnhjS1NsY2JseHVYRzRqWm5acGVsOXVZbU5zZFhOMEtHUmhkR0VzSUd0dFpXRnVjeXdnYldWMGFHOWtJRDBnWEZ4M2MzTmNYQ2xjYmx4dUl5QndJRHd0SUVobFlYUnRZWEFvWEc0aklDQWdaR0YwWVN4Y2JpTWdJQ0J1WVcxbElEMGdYRnhQWkdSeklGSmhkR2x2WEZ3c0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDTWdUbUZ0WlNCdlppQjBhR1VnYUdWaGRHMWhjQ0JzWldkbGJtUmNiaU1nSUNCamJIVnpkR1Z5WDJOdmJIVnRibk1nUFNCR1FVeFRSU3dnSUNBZ0lDQWdJQ0FnSUNBaklGSmxiVzkyWlNCamIyeDFiVzRnWkdWdVpISnZaM0poYlZ4dUl5QWdJSEp2ZDE5cmJTQTlJREV3TENBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUVSbFptbHVaU0IwYUdVZ2JuVnRZbVZ5SUc5bUlHc3RiV1ZoYm5NZ1kyeDFjM1JsY25NZ1ptOXlJSEp2ZDNNZ0tHRmthblZ6ZENCaGN5QnVaV1ZrWldRcFhHNGpJQ0FnYzJodmQxOXliM2RmWkdWdVpDQTlJRVpCVEZORkxGeHVJeUFnSUdOdmJDQTlJR052YkY5bWRXNHNYRzRqSUNBZ1ltOXlaR1Z5SUQwZ1ZGSlZSVnh1SXlBcFhHNGpJRnh1SXlCbWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hGeGhibU5vYjNKTVQweEJYMlJVUVVkZmRuTmZSRTFUVDE5a2FXWm1NQzR5WDJGc2JFeHZiM0J6WDJWNGRISmxiV1ZmWVd4c1FXNWphRzl5UW1GamEyZHliM1Z1WkY5aGRHRmpYRndwWEc0aklHaGxhV2RvZENBOExTQTNYRzRqSUhkcFpIUm9JRHd0SURNdU5WeHVJeUJ3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGpJSEJ5YVc1MEtIQXBYRzRqSUdSbGRpNXZabVlvS1Z4dUl5QnpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRqSUhCeWFXNTBLSEFwWEc0aklHUmxkaTV2Wm1Zb0tWeHVYRzVjYmx4dVhHNGpJeU1nVm1semRXRnNhWHBwYm1jZ2NDMTJZV3gxWlNCaGJtUWdUMUpjYm1Gc2NHaGhJRHd0SURBdU1EVmNiaU1nZEdJdWRYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoc2IyeGhSR2x5TENCY1hFeFBURUZmWkZSQlIxOTJjMTlFVFZOUFgyUnBabVl3TGpKZmRYQmZZV3hzVEc5dmNITmZaWGgwY21WdFpWOWhkR0ZqTG5SemRseGNLU2tnSlQ0bFhHNGpJQ0FnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTeGNiaU1nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEZXWVd4MVpVeHZaeUE5SUMxc2IyY3lLSEZXWVd4MVpTa3NYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuY205MWNDQTlJRnhjVlZCY1hDa2dKVDRsWEc0aklDQWdabWxzZEdWeUtITjBjbDkwYjE5c2IzZGxjaWhqWld4c1ZIbHdaU2tnUFQwZ1hGeGxiV0p5ZVc5dWFXTWdjM1JsYlNCalpXeHNYRndwSUNVK0pWeHVJeUFnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKU0JrY0d4NWNqbzZaM0p2ZFhCZllua29kR0Z5WjJWMEtTQWxQaVZjYmlNZ0lDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzRqSUhSaUxtNXZJRHd0SUdaeVpXRmtLR2hsY21Vb2JHOXNZVVJwY2l3Z1hGeE1UMHhCWDJSVVFVZGZkbk5mUkUxVFQxOWthV1ptTUM0eVgyNXZYMkZzYkV4dmIzQnpYMlY0ZEhKbGJXVmZZWFJoWXk1MGMzWmNYQ2twSUNVK0pWeHVJeUFnSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0Z5WjJWMElEMGdkRzkxY0hCbGNpaGhiblJwWW05a2VTa3NYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J4Vm1Gc2RXVk1iMmNnUFNBdGJHOW5NaWh4Vm1Gc2RXVXBMRnh1SXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjNKdmRYQWdQU0JjWEU1UFhGd3BJQ1UrSlZ4dUl5QWdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGeGNaVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRnhjS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVVnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0aklDQWdjMnhwWTJWZmJXbHVLRzFsWVc1U2Jtc3NJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLVnh1ZEdJdWRYQnVieUE4TFNCbWNtVmhaQ2hvWlhKbEtHeHZiR0ZFYVhJc0lGeGNURTlNUVY5a1ZFRkhYM1p6WDBSTlUwOWZaR2xtWmpBdU1sOTFjRzV2WDJGc2JFeHZiM0J6WDJWNGRISmxiV1ZmWVhSaFl5NTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoY21kbGRDQTlJSFJ2ZFhCd1pYSW9ZVzUwYVdKdlpIa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEZXWVd4MVpVeHZaeUE5SUMxc2IyY3hNQ2h4Vm1Gc2RXVXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2R5YjNWd0lEMGdYRnhWVUM5T1QxeGNLU0FsUGlWY2JpQWdabWxzZEdWeUtITjBjbDkwYjE5c2IzZGxjaWhqWld4c1ZIbHdaU2tnUFQwZ1hGeGxiV0p5ZVc5dWFXTWdjM1JsYlNCalpXeHNYRndwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIRldZV3gxWlNBOElHRnNjR2hoS1NBbFBpVWdaSEJzZVhJNk9tZHliM1Z3WDJKNUtIUmhjbWRsZENrZ0pUNGxYRzRnSUhOc2FXTmxYMjFwYmlodFpXRnVVbTVyTENCM2FYUm9YM1JwWlhNZ1BTQkdRVXhUUlNsY2JtWjNjbWwwWlNoMFlpNTFjRzV2SUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dNb01qUXNJREUyTENBeU1DeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdOQ3dnTWpVc0lEVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRGNzSURnc0lEa3NJREV3TENBeE1TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdNVElzSURFekxDQXhOQ2twTENCb1pYSmxLR3h2YkdGRWFYSXNJRnhjVEU5TVFWOWtWRUZIWDNaelgwUk5VMDlmWkdsbVpqQXVNbDkxY0c1dlgyRnNiRXh2YjNCelgyVjRkSEpsYldWZllYUmhZMTl3ZFdJdWRITjJYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1ZEdJdVpHOTNiaUE4TFNCbWNtVmhaQ2hvWlhKbEtHeHZiR0ZFYVhJc0lGeGNURTlNUVY5a1ZFRkhYM1p6WDBSTlUwOWZaR2xtWmpBdU1sOWtiM2R1WDJGc2JFeHZiM0J6WDJWNGRISmxiV1ZmWVhSaFl5NTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoY21kbGRDQTlJSFJ2ZFhCd1pYSW9ZVzUwYVdKdlpIa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEZXWVd4MVpVeHZaeUE5SUMxc2IyY3hNQ2h4Vm1Gc2RXVXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2R5YjNWd0lEMGdYRnhFVDFkT1hGd3BJQ1UrSlZ4dUlDQm1hV3gwWlhJb2MzUnlYM1J2WDJ4dmQyVnlLR05sYkd4VWVYQmxLU0E5UFNCY1hHVnRZbko1YjI1cFl5QnpkR1Z0SUdObGJHeGNYQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NWWmhiSFZsSUR3Z1lXeHdhR0VwSUNVK0pTQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dVpuZHlhWFJsS0hSaUxtUnZkMjRnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWXlneU5Dd2dNVFlzSURJd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQTBMQ0F5TlN3Z05TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdOeXdnT0N3Z09Td2dNVEFzSURFeExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXhNaXdnTVRNc0lERTBLU2tzSUdobGNtVW9iRzlzWVVScGNpd2dYRnhNVDB4QlgyUlVRVWRmZG5OZlJFMVRUMTlrYVdabU1DNHlYMlJ2ZDI1ZllXeHNURzl2Y0hOZlpYaDBjbVZ0WlY5aGRHRmpYM0IxWWk1MGMzWmNYQ2tzSUhObGNDQTlJRnhjWEZ4MFhGd3BYRzVjYmlNZ2RHVnRjQzUxY0NBOExTQjBZaTUxY0NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUc5a1pITlNZWFJwYnl3Z2NWWmhiSFZsVEc5bkxDQm5jbTkxY0NsY2JpTWdkR1Z0Y0M1dWJ5QThMU0IwWWk1dWJ5QWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHOWtaSE5TWVhScGJ5d2djVlpoYkhWbFRHOW5MQ0JuY205MWNDbGNiblJsYlhBdWRYQnVieUE4TFNCMFlpNTFjRzV2SUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYjJSa2MxSmhkR2x2TENCeFZtRnNkV1ZNYjJjc0lHZHliM1Z3S1Z4dWRHVnRjQzVrYjNkdUlEd3RJSFJpTG1SdmQyNGdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHNJSEZXWVd4MVpVeHZaeXdnWjNKdmRYQXBYRzVjYm5SbGJYQWdQQzBnWW1sdVpGOXliM2R6S0hSbGJYQXVkWEJ1Ynl3Z2RHVnRjQzVrYjNkdUtWeHVJeUJjYmlNZ2IzSmtaWElnUEMwZ1l5Z29kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY1hGVlFMMDVQWEZ3cElDVStKU0JoY25KaGJtZGxLR1JsYzJNb2IyUmtjMUpoZEdsdktTa3BKSFJoY21kbGRDd2dYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0tIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWEZ4RVQxZE9YRndwSUNVK0pTQmhjbkpoYm1kbEtHUmxjMk1vYjJSa2MxSmhkR2x2S1NrcEpIUmhjbWRsZENsY2JpTWdkR1Z0Y0NSMFlYSm5aWFFnUEMwZ1ptRmpkRzl5S0hSbGJYQWtkR0Z5WjJWMExDQnNaWFpsYkhNZ1BTQnlaWFlvYjNKa1pYSXBLVnh1ZEdWdGNDUm5jbTkxY0NBOExTQm1ZV04wYjNJb2RHVnRjQ1JuY205MWNDd2diR1YyWld4eklEMGdZeWhjWEZWUUwwNVBYRndzSUZ4Y1JFOVhUbHhjS1NsY2JseHVYRzUwWVhKblpYUk1hWE4wSUR3dElHTW9YRnhRVDB4U01rRmNYQ3dnWEZ4RFZGSTVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4QlJrWTBYRndzSUZ4Y1JVeE1NbHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y1RVVkVNVnhjTENCY1hFMUZSREV5WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeFVRbEJjWEN3Z1hGeFVRVVl4WEZ3c0lGeGNWRUZHTTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNSVk5TVWtKY1hDd2dYRnhMVEVZMFhGd3NJRnhjVGtGT1QwZGNYQ3dnWEZ4UVQxVTFSakZjWEN3Z1hGeFRUMWd5WEZ3c0lGeGNVMVJCVkROY1hDd2dYRnhGTWtZeFhGd3NJRnhjV1ZreFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnhGVURNd01GeGNMQ0JjWEVSUVdUTXdYRndzSUZ4Y1JWcElNbHhjTENCY1hFdEVUVEpDWEZ3c0lGeGNTMFJDTkVKY1hDd2dYRnhMUkUwMFExeGNMQ0JjWEV0RVRUWkNYRndzSUZ4Y1VrSkNVRFZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hGSkJSREl4WEZ3c0lGeGNVMDFETVVGY1hDd2dYRnhUVFVNelhGd3NJRnhjUTFSRFJseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjU2tGU1NVUXlYRndzSUZ4Y1UxVmFNVEpjWEZ4dUtWeHVkR1Z0Y0NBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hSaGNtZGxkQ0FsYVc0bElIUmhjbWRsZEV4cGMzUXBYRzVjYm5SbGJYQWtkR0Z5WjJWMElEd3RJR1poWTNSdmNpaDBaVzF3SkhSaGNtZGxkQ3dnYkdWMlpXeHpJRDBnY21WMktIUmhjbWRsZEV4cGMzUXBLVnh1SXlCTlFWZ2djVlpoYkhWbFRHOW5JSFJ2SURVd1hHNXhWbUZzZFdWTWIyZE5ZWGdnUEMwZ05UQmNiblJsYlhBeUlEd3RJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb2NWWmhiSFZsVEc5bklEMGdiV2x1S0hGV1lXeDFaVXh2Wnl3Z2NWWmhiSFZsVEc5blRXRjRLU2xjYm5BZ1BDMGdaMmR3Ykc5MEtIUmxiWEF5TENCaFpYTW9lQ0E5SUdkeWIzVndMQ0I1SUQwZ2RHRnlaMlYwTENCbWFXeHNJRDBnYjJSa2MxSmhkR2x2TENCemFYcGxJRDBnY1ZaaGJIVmxURzluS1NrZ0sxeHVJQ0JuWlc5dFgzQnZhVzUwS0hOb1lYQmxJRDBnTWpFc0lDQWdJQ0FnSUNBaklFVnVjM1Z5WlhNZ1lTQndiMmx1ZENCM2FYUm9JR0Z1SUc5MWRHeHBibVZjYmlBZ0lDQWdJQ0FnSUNBZ0lDQnpkSEp2YTJVZ1BTQXdMalVxY0hSVWIwMU5JQ0FnSUNBZ0l5Qk1hVzVsSUhkcFpIUm9JR1p2Y2lCMGFHVWdZbTl5WkdWeVhHNGdJQ2tnS3lCMGFHVnRaVjlpZHlncElDc2dYRzRnSUhOallXeGxYM05wZW1WZlkyOXVkR2x1ZFc5MWN5aHlZVzVuWlNBOUlHTW9NQzQxTENBeUtTa2dLeUFnSXlCVFpYUWdiV2x1SUdGdVpDQnRZWGdnY0c5cGJuUWdjMmw2WlhNZ2FHVnlaVnh1SUNCelkyRnNaVjltYVd4c1gyZHlZV1JwWlc1MEtHeHZkeUE5SUZ4Y2QyaHBkR1ZjWEN3Z2FHbG5hQ0E5SUZ4Y0kwTkNNek16UVZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJXbDBjeUE5SUdNb01Td2dNeWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiMjlpSUQwZ2MyTmhiR1Z6T2pwemNYVnBjMmdzSUNNZ1JHVm1hVzVsSUdkeVlXUnBaVzUwSUdOdmJHOXljMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZDFhV1JsSUQwZ1ozVnBaR1ZmWTI5c2IzSmlZWElvWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVhKM2FXUjBhQ0E5SURFdU5TODFMakE0TENBZ0l5QkJaR3AxYzNRZ2QybGtkR2dnYjJZZ2RHaGxJR052Ykc5eUlHSmhjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZ5YUdWcFoyaDBJRDBnTVRVdk5TNHdPQ0FnSUNNZ1FXUnFkWE4wSUdobGFXZG9kQ0J2WmlCMGFHVWdZMjlzYjNJZ1ltRnlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tWeHVJQ0FwSUNzZ1hHNGdJR3hoWW5Nb2VDQTlJRTVWVEV3c0lIa2dQU0JPVlV4TUtTQWdLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQmhibWRzWlNBOUlEUTFMQ0FnSUNBZ0lDTWdVbTkwWVhSbElIZ3RZWGhwY3lCc1lXSmxiSE1nTkRVZ1pHVm5jbVZsYzF4dUlDQWdJQ0FnYUdwMWMzUWdQU0F4TENBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0JvYjNKcGVtOXVkR0ZzSUdwMWMzUnBabWxqWVhScGIyNWNiaUFnSUNBZ0lIWnFkWE4wSUQwZ01TQWdJQ0FnSUNBZ0l5QkJaR3AxYzNRZ2RtVnlkR2xqWVd3Z2FuVnpkR2xtYVdOaGRHbHZibHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hGeDBjbUZ1YzNCaGNtVnVkRnhjS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdiR1ZuWlc1a0xuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLVnh1SUNBcFhHNWNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEdGdVkyaHZja3hQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZZV3hzVEc5dmNITmZaWGgwY21WdFpWOVBVbDl4Vm1Gc2RXVmZZV3hzUVc1amFHOXlRbUZqYTJkeWIzVnVaRjloZEdGalgyOXlaR1Z5WldSY1hDbGNibmRwWkhSb0lEd3RJSEJoYm1Wc1UybDZaU2d4TGpVcEttMXRWRzlKYm1Ob1hHNW9aV2xuYUhRZ1BDMGdjR0Z1Wld4VGFYcGxLREl1TlNrcWJXMVViMGx1WTJoY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dVhHNWNibHh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuIyBSVU5OSU5HIExPTEFcbmxvbGFEaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdC9sb2xhXFwpXG5kaXIuY3JlYXRlKGxvbGFEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKVxuXG4jIFVQXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci51cCwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuI2Z3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBfYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBOT1xucmVzdWx0ID0gcnVuTE9MQShhbmNob3Iubm8sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbiNmd3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbiMgVVBOT1xucmVzdWx0ID0gcnVuTE9MQShhbmNob3IudXBubywgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuI2Z3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBub19hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cbiMgRE9XTlxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuZG93biwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuI2Z3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfZG93bl9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cblxuIyMjIEhFQVRNQVBcbmFscGhhIDwtIDAuMDVcbnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3VwX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLmRvd24gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfZG93bl9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRlbXAudXAgPC0gdGIudXAgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLnVwKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfdXBcXClcbnRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLm5vKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1Jfbm9cXClcbnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5kb3duKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfZG93blxcKVxuXG5cbnRlbXAgPC0gZnVsbF9qb2luKGZ1bGxfam9pbih0ZW1wLnVwLCB0ZW1wLm5vLCBieSA9IGMoXFx0YXJnZXRcXCkpLCB0ZW1wLmRvd24sIGJ5ID0gYyhcXHRhcmdldFxcKSkgJT4lIG11dGF0ZV9hbGwofnJlcGxhY2VfbmEoLiwgMSkpXG5cbmRhdGEgPC0gYXMubWF0cml4KHRlbXBbMjo0XSlcbnJvd25hbWVzKGRhdGEpIDwtIHRlbXAkdGFyZ2V0XG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYyhtaW4oZGF0YSksIG1heChkYXRhKSksIGMoXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuXG4jZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gXFx3c3NcXClcblxuIyBwIDwtIEhlYXRtYXAoXG4jICAgZGF0YSxcbiMgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmRcbiMgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbVxuIyAgIHJvd19rbSA9IDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmluZSB0aGUgbnVtYmVyIG9mIGstbWVhbnMgY2x1c3RlcnMgZm9yIHJvd3MgKGFkanVzdCBhcyBuZWVkZWQpXG4jICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuIyAgIGNvbCA9IGNvbF9mdW4sXG4jICAgYm9yZGVyID0gVFJVRVxuIyApXG4jIFxuIyBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2FsbExvb3BzX2V4dHJlbWVfYWxsQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG4jIGhlaWdodCA8LSA3XG4jIHdpZHRoIDwtIDMuNVxuIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuXG5cblxuXG4jIyMgVmlzdWFsaXppbmcgcC12YWx1ZSBhbmQgT1JcbmFscGhhIDwtIDAuMDVcbiMgdGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBfYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSkgJT4lXG4jICAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiMgICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4jICAgICAgICAgICAgICAgICBncm91cCA9IFxcVVBcXCkgJT4lXG4jICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuIyAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiMgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG4jIHRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuIyAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4jICAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuIyAgICAgICAgICAgICAgICAgZ3JvdXAgPSBcXE5PXFwpICU+JVxuIyAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4jICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIudXBubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl91cG5vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxVUC9OT1xcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbmZ3cml0ZSh0Yi51cG5vICU+JSBkcGx5cjo6c2VsZWN0KGMoMjQsIDE2LCAyMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMjUsIDUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIDgsIDksIDEwLCAxMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDEzLCAxNCkpLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl91cG5vX2FsbExvb3BzX2V4dHJlbWVfYXRhY19wdWIudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxET1dOXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuZndyaXRlKHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QoYygyNCwgMTYsIDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAyNSwgNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgOCwgOSwgMTAsIDExLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgMTMsIDE0KSksIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2Rvd25fYWxsTG9vcHNfZXh0cmVtZV9hdGFjX3B1Yi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbiMgdGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbiMgdGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbnRlbXAudXBubyA8LSB0Yi51cG5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxudGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG5cbnRlbXAgPC0gYmluZF9yb3dzKHRlbXAudXBubywgdGVtcC5kb3duKVxuIyBcbiMgb3JkZXIgPC0gYygodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXFVQL05PXFwpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCwgXG4jICAgICAgICAgICAgKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxET1dOXFwpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldClcbiMgdGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYob3JkZXIpKVxudGVtcCRncm91cCA8LSBmYWN0b3IodGVtcCRncm91cCwgbGV2ZWxzID0gYyhcXFVQL05PXFwsIFxcRE9XTlxcKSlcblxuXG50YXJnZXRMaXN0IDwtIGMoXFxQT0xSMkFcXCwgXFxDVFI5XFwsXG4gICAgICAgICAgICAgICAgXFxBRkY0XFwsIFxcRUxMMlxcLFxuICAgICAgICAgICAgICAgIFxcTUVEMVxcLCBcXE1FRDEyXFwsXG4gICAgICAgICAgICAgICAgXFxUQlBcXCwgXFxUQUYxXFwsIFxcVEFGM1xcLFxuICAgICAgICAgICAgICAgIFxcRVNSUkJcXCwgXFxLTEY0XFwsIFxcTkFOT0dcXCwgXFxQT1U1RjFcXCwgXFxTT1gyXFwsIFxcU1RBVDNcXCwgXFxFMkYxXFwsIFxcWVkxXFwsXG4gICAgICAgICAgICAgICAgXFxFUDMwMFxcLCBcXERQWTMwXFwsIFxcRVpIMlxcLCBcXEtETTJCXFwsIFxcS0RCNEJcXCwgXFxLRE00Q1xcLCBcXEtETTZCXFwsIFxcUkJCUDVcXCxcbiAgICAgICAgICAgICAgICBcXFJBRDIxXFwsIFxcU01DMUFcXCwgXFxTTUMzXFwsIFxcQ1RDRlxcLFxuICAgICAgICAgICAgICAgIFxcSkFSSUQyXFwsIFxcU1VaMTJcXFxuKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHRhcmdldCAlaW4lIHRhcmdldExpc3QpXG5cbnRlbXAkdGFyZ2V0IDwtIGZhY3Rvcih0ZW1wJHRhcmdldCwgbGV2ZWxzID0gcmV2KHRhcmdldExpc3QpKVxuIyBNQVggcVZhbHVlTG9nIHRvIDUwXG5xVmFsdWVMb2dNYXggPC0gNTBcbnRlbXAyIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUocVZhbHVlTG9nID0gbWluKHFWYWx1ZUxvZywgcVZhbHVlTG9nTWF4KSlcbnAgPC0gZ2dwbG90KHRlbXAyLCBhZXMoeCA9IGdyb3VwLCB5ID0gdGFyZ2V0LCBmaWxsID0gb2Rkc1JhdGlvLCBzaXplID0gcVZhbHVlTG9nKSkgK1xuICBnZW9tX3BvaW50KHNoYXBlID0gMjEsICAgICAgICAjIEVuc3VyZXMgYSBwb2ludCB3aXRoIGFuIG91dGxpbmVcbiAgICAgICAgICAgICBzdHJva2UgPSAwLjUqcHRUb01NICAgICAgIyBMaW5lIHdpZHRoIGZvciB0aGUgYm9yZGVyXG4gICkgKyB0aGVtZV9idygpICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9IFxcd2hpdGVcXCwgaGlnaCA9IFxcI0NCMzMzQVxcLFxuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICsgXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGFuY2hvckxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfYWxsTG9vcHNfZXh0cmVtZV9PUl9xVmFsdWVfYWxsQW5jaG9yQmFja2dyb3VuZF9hdGFjX29yZGVyZWRcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDIuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBSVU5OSU5HIExPTEFcbmxvbGFEaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdC9sb2xhXFwpXG5kaXIuY3JlYXRlKGxvbGFEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKVxuXG4jIFVQXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci51cCwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuI2Z3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBfYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBOT1xucmVzdWx0ID0gcnVuTE9MQShhbmNob3Iubm8sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbiNmd3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbiMgVVBOT1xucmVzdWx0ID0gcnVuTE9MQShhbmNob3IudXBubywgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuI2Z3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBub19hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cbiMgRE9XTlxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuZG93biwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuI2Z3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfZG93bl9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cblxuIyMjIEhFQVRNQVBcbmFscGhhIDwtIDAuMDVcbnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3VwX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLmRvd24gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfZG93bl9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRlbXAudXAgPC0gdGIudXAgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLnVwKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfdXBcXClcbnRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLm5vKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1Jfbm9cXClcbnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5kb3duKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfZG93blxcKVxuXG5cbnRlbXAgPC0gZnVsbF9qb2luKGZ1bGxfam9pbih0ZW1wLnVwLCB0ZW1wLm5vLCBieSA9IGMoXFx0YXJnZXRcXCkpLCB0ZW1wLmRvd24sIGJ5ID0gYyhcXHRhcmdldFxcKSkgJT4lIG11dGF0ZV9hbGwofnJlcGxhY2VfbmEoLiwgMSkpXG5cbmRhdGEgPC0gYXMubWF0cml4KHRlbXBbMjo0XSlcbnJvd25hbWVzKGRhdGEpIDwtIHRlbXAkdGFyZ2V0XG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYyhtaW4oZGF0YSksIG1heChkYXRhKSksIGMoXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuXG4jZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gXFx3c3NcXClcblxuIyBwIDwtIEhlYXRtYXAoXG4jICAgZGF0YSxcbiMgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmRcbiMgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbVxuIyAgIHJvd19rbSA9IDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmluZSB0aGUgbnVtYmVyIG9mIGstbWVhbnMgY2x1c3RlcnMgZm9yIHJvd3MgKGFkanVzdCBhcyBuZWVkZWQpXG4jICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuIyAgIGNvbCA9IGNvbF9mdW4sXG4jICAgYm9yZGVyID0gVFJVRVxuIyApXG4jIFxuIyBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2FsbExvb3BzX2V4dHJlbWVfYWxsQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG4jIGhlaWdodCA8LSA3XG4jIHdpZHRoIDwtIDMuNVxuIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuXG5cblxuXG4jIyMgVmlzdWFsaXppbmcgcC12YWx1ZSBhbmQgT1JcbmFscGhhIDwtIDAuMDVcbiMgdGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBfYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSkgJT4lXG4jICAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiMgICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4jICAgICAgICAgICAgICAgICBncm91cCA9IFxcVVBcXCkgJT4lXG4jICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuIyAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiMgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG4jIHRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuIyAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4jICAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuIyAgICAgICAgICAgICAgICAgZ3JvdXAgPSBcXE5PXFwpICU+JVxuIyAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4jICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIudXBubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl91cG5vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxVUC9OT1xcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbmZ3cml0ZSh0Yi51cG5vICU+JSBkcGx5cjo6c2VsZWN0KGMoMjQsIDE2LCAyMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMjUsIDUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIDgsIDksIDEwLCAxMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDEzLCAxNCkpLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl91cG5vX2FsbExvb3BzX2V4dHJlbWVfYXRhY19wdWIudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxET1dOXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuZndyaXRlKHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QoYygyNCwgMTYsIDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAyNSwgNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgOCwgOSwgMTAsIDExLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgMTMsIDE0KSksIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2Rvd25fYWxsTG9vcHNfZXh0cmVtZV9hdGFjX3B1Yi50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbiMgdGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbiMgdGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbnRlbXAudXBubyA8LSB0Yi51cG5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxudGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG5cbnRlbXAgPC0gYmluZF9yb3dzKHRlbXAudXBubywgdGVtcC5kb3duKVxuIyBcbiMgb3JkZXIgPC0gYygodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXFVQL05PXFwpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCwgXG4jICAgICAgICAgICAgKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxET1dOXFwpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldClcbiMgdGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYob3JkZXIpKVxudGVtcCRncm91cCA8LSBmYWN0b3IodGVtcCRncm91cCwgbGV2ZWxzID0gYyhcXFVQL05PXFwsIFxcRE9XTlxcKSlcblxuXG50YXJnZXRMaXN0IDwtIGMoXFxQT0xSMkFcXCwgXFxDVFI5XFwsXG4gICAgICAgICAgICAgICAgXFxBRkY0XFwsIFxcRUxMMlxcLFxuICAgICAgICAgICAgICAgIFxcTUVEMVxcLCBcXE1FRDEyXFwsXG4gICAgICAgICAgICAgICAgXFxUQlBcXCwgXFxUQUYxXFwsIFxcVEFGM1xcLFxuICAgICAgICAgICAgICAgIFxcRVNSUkJcXCwgXFxLTEY0XFwsIFxcTkFOT0dcXCwgXFxQT1U1RjFcXCwgXFxTT1gyXFwsIFxcU1RBVDNcXCwgXFxFMkYxXFwsIFxcWVkxXFwsXG4gICAgICAgICAgICAgICAgXFxFUDMwMFxcLCBcXERQWTMwXFwsIFxcRVpIMlxcLCBcXEtETTJCXFwsIFxcS0RCNEJcXCwgXFxLRE00Q1xcLCBcXEtETTZCXFwsIFxcUkJCUDVcXCxcbiAgICAgICAgICAgICAgICBcXFJBRDIxXFwsIFxcU01DMUFcXCwgXFxTTUMzXFwsIFxcQ1RDRlxcLFxuICAgICAgICAgICAgICAgIFxcSkFSSUQyXFwsIFxcU1VaMTJcXFxuKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHRhcmdldCAlaW4lIHRhcmdldExpc3QpXG5cbnRlbXAkdGFyZ2V0IDwtIGZhY3Rvcih0ZW1wJHRhcmdldCwgbGV2ZWxzID0gcmV2KHRhcmdldExpc3QpKVxuIyBNQVggcVZhbHVlTG9nIHRvIDUwXG5xVmFsdWVMb2dNYXggPC0gNTBcbnRlbXAyIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUocVZhbHVlTG9nID0gbWluKHFWYWx1ZUxvZywgcVZhbHVlTG9nTWF4KSlcbnAgPC0gZ2dwbG90KHRlbXAyLCBhZXMoeCA9IGdyb3VwLCB5ID0gdGFyZ2V0LCBmaWxsID0gb2Rkc1JhdGlvLCBzaXplID0gcVZhbHVlTG9nKSkgK1xuICBnZW9tX3BvaW50KHNoYXBlID0gMjEsICAgICAgICAjIEVuc3VyZXMgYSBwb2ludCB3aXRoIGFuIG91dGxpbmVcbiAgICAgICAgICAgICBzdHJva2UgPSAwLjUqcHRUb01NICAgICAgIyBMaW5lIHdpZHRoIGZvciB0aGUgYm9yZGVyXG4gICkgKyB0aGVtZV9idygpICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9IFxcd2hpdGVcXCwgaGlnaCA9IFxcI0NCMzMzQVxcLFxuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICsgXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGFuY2hvckxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfYWxsTG9vcHNfZXh0cmVtZV9PUl9xVmFsdWVfYWxsQW5jaG9yQmFja2dyb3VuZF9hdGFjX29yZGVyZWRcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDIuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
# RUNNING LOLA
lolaDir <- here(\../../result/lola\)
dir.create(lolaDir, showWarnings = FALSE, recursive = TRUE)

# UP
result = runLOLA(anchor.up, anchor.all, lolaDB)
tb = as_tibble(result)
#fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_allLoops_extreme_atac.tsv\), sep = \\t\)

# NO
result = runLOLA(anchor.no, anchor.all, lolaDB)
tb = as_tibble(result)
#fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_allLoops_extreme_atac.tsv\), sep = \\t\)

# UPNO
result = runLOLA(anchor.upno, anchor.all, lolaDB)
tb = as_tibble(result)
#fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_upno_allLoops_extreme_atac.tsv\), sep = \\t\)


# DOWN
result = runLOLA(anchor.down, anchor.all, lolaDB)
tb = as_tibble(result)
#fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_allLoops_extreme_atac.tsv\), sep = \\t\)



### HEATMAP
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio)
colnames(temp.up) <- c(\target\, \OR_up\)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio)
colnames(temp.no) <- c(\target\, \OR_no\)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio)
colnames(temp.down) <- c(\target\, \OR_down\)


temp <- full_join(full_join(temp.up, temp.no, by = c(\target\)), temp.down, by = c(\target\)) %>% mutate_all(~replace_na(., 1))

data <- as.matrix(temp[2:4])
rownames(data) <- temp$target

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

# p <- Heatmap(
#   data,
#   name = \Odds Ratio\,                   # Name of the heatmap legend
#   cluster_columns = FALSE,            # Remove column dendrogram
#   row_km = 10,                         # Define the number of k-means clusters for rows (adjust as needed)
#   show_row_dend = FALSE,
#   col = col_fun,
#   border = TRUE
# )
# 
# fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_diff0.2_allLoops_extreme_allAnchorBackground_atac\)
# height <- 7
# width <- 3.5
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()




### Visualizing p-value and OR
alpha <- 0.05
# tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_allLoops_extreme_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \UP\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)
# tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_allLoops_extreme_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \NO\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)
tb.upno <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_upno_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log10(qValue),
                group = \UP/NO\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
fwrite(tb.upno %>% dplyr::select(c(24, 16, 20,
                                   4, 25, 5,
                                   7, 8, 9, 10, 11,
                                   12, 13, 14)), here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_upno_allLoops_extreme_atac_pub.tsv\), sep = \\t\)
tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log10(qValue),
                group = \DOWN\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
fwrite(tb.down %>% dplyr::select(c(24, 16, 20,
                                   4, 25, 5,
                                   7, 8, 9, 10, 11,
                                   12, 13, 14)), here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_allLoops_extreme_atac_pub.tsv\), sep = \\t\)

# temp.up <- tb.up %>% dplyr::select(target, oddsRatio, qValueLog, group)
# temp.no <- tb.no %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.upno <- tb.upno %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio, qValueLog, group)

temp <- bind_rows(temp.upno, temp.down)
# 
# order <- c((temp %>% dplyr::filter(group == \UP/NO\) %>% arrange(desc(oddsRatio)))$target, 
#            (temp %>% dplyr::filter(group == \DOWN\) %>% arrange(desc(oddsRatio)))$target)
# temp$target <- factor(temp$target, levels = rev(order))
temp$group <- factor(temp$group, levels = c(\UP/NO\, \DOWN\))


targetList <- c(\POLR2A\, \CTR9\,
                \AFF4\, \ELL2\,
                \MED1\, \MED12\,
                \TBP\, \TAF1\, \TAF3\,
                \ESRRB\, \KLF4\, \NANOG\, \POU5F1\, \SOX2\, \STAT3\, \E2F1\, \YY1\,
                \EP300\, \DPY30\, \EZH2\, \KDM2B\, \KDB4B\, \KDM4C\, \KDM6B\, \RBBP5\,
                \RAD21\, \SMC1A\, \SMC3\, \CTCF\,
                \JARID2\, \SUZ12\
)
temp <- temp %>% dplyr::filter(target %in% targetList)

temp$target <- factor(temp$target, levels = rev(targetList))
# MAX qValueLog to 50
qValueLogMax <- 50
temp2 <- temp %>% dplyr::mutate(qValueLog = min(qValueLog, qValueLogMax))
p <- ggplot(temp2, aes(x = group, y = target, fill = oddsRatio, size = qValueLog)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 0.5*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(0.5, 2)) +  # Set min and max point sizes here
  scale_fill_gradient(low = \white\, high = \#CB333A\,
                      limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + 
  labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_diff0.2_allLoops_extreme_OR_qValue_allAnchorBackground_atac_ordered\)
width <- panelSize(1.5)*mmToInch
height <- panelSize(2.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




##### - Limited to ATAC-seq signal, all loop backgroup

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZWFJoWXlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0pIVTAwek1UQTJNalUzWDBGVVFVTmZSVk5EWHpFdVltVmtYQ0lwS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoV01Td2dWaklzSUZZektWeHVZMjlzYm1GdFpYTW9ZWFJoWXlrZ1BDMGdZeWhjSW1Ob2Nsd2lMQ0JjSW5OMFlYSjBYQ0lzSUZ3aVpXNWtYQ0lwWEc1aGRHRmpMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoaGRHRmpLVnh1WEc0aklFeFBRVVJKVGtjZ1RFOVBVRk5jYmlNakl5QkpiWEJ2Y25ScGJtY2daR2xtWm1WeVpXNTBhV0ZzSUhKbFozVnNZWFJ2Y25rZ2JHOXZjSE1nSmlCbGVIUnlZV04wSUdGdVkyaHZjbHh1Ykc5dmNDNWhiR3dnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVM1MGMzWmNJaWtwWEc1aGJtTm9iM0l1WVd4c0lEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1WVd4c0tTbGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVlXeHNMQ0JoZEdGakxtZHlLVnh1WVc1amFHOXlMbUZzYkNBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWhiR3hiY1hWbGNubElhWFJ6S0c5MlpYSnNZWEJ6S1Ywc0lHRjBZV011WjNKYmMzVmlhbVZqZEVocGRITW9iM1psY214aGNITXBYU2xjYmx4dWJHOXZjQzUxY0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgyeHZaMDlGWDJGc2JGOWtWRUZIZG5ORVRWTlBYMVZRWDJScFptWXdMalV1WW1Wa2NHVmNJaWtwWEc1aGJtTm9iM0l1ZFhBZ1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzUxY0NrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG5Wd0xDQmhkR0ZqTG1keUtWeHVZVzVqYUc5eUxuVndJRHd0SUhCcGJuUmxjbk5sWTNRb1lXNWphRzl5TG5Wd1czRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGRMQ0JoZEdGakxtZHlXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1YwcFhHNWNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjlzYjJkUFJWOWhiR3hmWkZSQlIzWnpSRTFUVDE5T1QxOWthV1ptTUM0MUxtSmxaSEJsWENJcEtWeHVZVzVqYUc5eUxtNXZJRHd0SUNobGVIUnlZV04wUVc1amFHOXlLR3h2YjNBdWJtOHBLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNXVieXdnWVhSaFl5NW5jaWxjYm1GdVkyaHZjaTV1YnlBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNXViMXR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1WEc1Y2JteHZiM0F1Wkc5M2JpQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYMnh2WjA5RlgyRnNiRjlrVkVGSGRuTkVUVk5QWDBSUFYwNWZaR2xtWmpBdU5TNWlaV1J3WlZ3aUtTbGNibUZ1WTJodmNpNWtiM2R1SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVaRzkzYmlrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG1SdmQyNHNJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVaRzkzYmlBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWtiM2R1VzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZExDQmhkR0ZqTG1keVczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjBwWEc1Y2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvclxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpXG5hbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKVxuYW5jaG9yLmFsbCA8LSBwaW50ZXJzZWN0KGFuY2hvci5hbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2xvZ09FX2FsbF9kVEFHdnNETVNPX1VQX2RpZmYwLjUuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwLCBhdGFjLmdyKVxuYW5jaG9yLnVwIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9sb2dPRV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC41LmJlZHBlXFwpKVxuYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ubywgYXRhYy5ncilcbmFuY2hvci5ubyA8LSBwaW50ZXJzZWN0KGFuY2hvci5ub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2xvZ09FX2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuNS5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGF0YWMuZ3IpXG5hbmNob3IuZG93biA8LSBwaW50ZXJzZWN0KGFuY2hvci5kb3duW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_logOE_all_dTAGvsDMSO_UP_diff0.5.bedpe\))
anchor.up <- (extractAnchor(loop.up))
overlaps <- findOverlaps(anchor.up, atac.gr)
anchor.up <- pintersect(anchor.up[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_logOE_all_dTAGvsDMSO_NO_diff0.5.bedpe\))
anchor.no <- (extractAnchor(loop.no))
overlaps <- findOverlaps(anchor.no, atac.gr)
anchor.no <- pintersect(anchor.no[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])


loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_logOE_all_dTAGvsDMSO_DOWN_diff0.5.bedpe\))
anchor.down <- (extractAnchor(loop.down))
overlaps <- findOverlaps(anchor.down, atac.gr)
anchor.down <- pintersect(anchor.down[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlYUmhZeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeEhVMDB6TVRBMk1qVTNYMEZVUVVOZlJWTkRYekV1WW1Wa1hGd3BLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hXTVN3Z1ZqSXNJRll6S1Z4dVkyOXNibUZ0WlhNb1lYUmhZeWtnUEMwZ1l5aGNYR05vY2x4Y0xDQmNYSE4wWVhKMFhGd3NJRnhjWlc1a1hGd3BYRzVoZEdGakxtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2hoZEdGaktWeHVYRzRqSUV4UFFVUkpUa2NnVEU5UFVGTmNiaU1qSXlCSmJYQnZjblJwYm1jZ1pHbG1abVZ5Wlc1MGFXRnNJSEpsWjNWc1lYUnZjbmtnYkc5dmNITWdKaUJsZUhSeVlXTjBJR0Z1WTJodmNseHViRzl2Y0M1aGJHd2dQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lUzUwYzNaY1hDa3BYRzVoYm1Ob2IzSXVZV3hzSUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVZV3hzS1NsY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l1WVd4c0xDQmhkR0ZqTG1keUtWeHVZVzVqYUc5eUxtRnNiQ0E4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1aGJHeGJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzSUdGMFlXTXVaM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhTbGNibHh1Ykc5dmNDNTFjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDJ4dlowOUZYMkZzYkY5a1ZFRkhkbk5FVFZOUFgxVlFYMlJwWm1Zd0xqVXVZbVZrY0dWY1hDa3BYRzVoYm1Ob2IzSXVkWEFnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNTFjQ2twWEc1dmRtVnliR0Z3Y3lBOExTQm1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlMblZ3TENCaGRHRmpMbWR5S1Z4dVlXNWphRzl5TG5Wd0lEd3RJSEJwYm5SbGNuTmxZM1FvWVc1amFHOXlMblZ3VzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZExDQmhkR0ZqTG1keVczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjBwWEc1Y2JteHZiM0F1Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXNiMmRQUlY5aGJHeGZaRlJCUjNaelJFMVRUMTlPVDE5a2FXWm1NQzQxTG1KbFpIQmxYRndwS1Z4dVlXNWphRzl5TG01dklEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1Ym04cEtWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1dWJ5d2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNXVieUE4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1dWIxdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVjYm14dmIzQXVaRzkzYmlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgyeHZaMDlGWDJGc2JGOWtWRUZIZG5ORVRWTlBYMFJQVjA1ZlpHbG1aakF1TlM1aVpXUndaVnhjS1NsY2JtRnVZMmh2Y2k1a2IzZHVJRHd0SUNobGVIUnlZV04wUVc1amFHOXlLR3h2YjNBdVpHOTNiaWtwWEc1dmRtVnliR0Z3Y3lBOExTQm1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlMbVJ2ZDI0c0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVpHOTNiaUE4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1a2IzZHVXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkTENCaGRHRmpMbWR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbmF0YWMgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcR1NNMzEwNjI1N19BVEFDX0VTQ18xLmJlZFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMylcbmNvbG5hbWVzKGF0YWMpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuYXRhYy5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYXRhYylcblxuIyBMT0FESU5HIExPT1BTXG4jIyMgSW1wb3J0aW5nIGRpZmZlcmVudGlhbCByZWd1bGF0b3J5IGxvb3BzICYgZXh0cmFjdCBhbmNob3Jcbmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKVxuYW5jaG9yLmFsbCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmFsbCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmFsbCwgYXRhYy5ncilcbmFuY2hvci5hbGwgPC0gcGludGVyc2VjdChhbmNob3IuYWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9sb2dPRV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC41LmJlZHBlXFwpKVxuYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cCwgYXRhYy5ncilcbmFuY2hvci51cCA8LSBwaW50ZXJzZWN0KGFuY2hvci51cFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfbG9nT0VfYWxsX2RUQUd2c0RNU09fTk9fZGlmZjAuNS5iZWRwZVxcKSlcbmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3Iubm8sIGF0YWMuZ3IpXG5hbmNob3Iubm8gPC0gcGludGVyc2VjdChhbmNob3Iubm9bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9sb2dPRV9hbGxfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjUuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBhdGFjLmdyKVxuYW5jaG9yLmRvd24gPC0gcGludGVyc2VjdChhbmNob3IuZG93bltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvclxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpXG5hbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKVxuYW5jaG9yLmFsbCA8LSBwaW50ZXJzZWN0KGFuY2hvci5hbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2xvZ09FX2FsbF9kVEFHdnNETVNPX1VQX2RpZmYwLjUuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwLCBhdGFjLmdyKVxuYW5jaG9yLnVwIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9sb2dPRV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC41LmJlZHBlXFwpKVxuYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ubywgYXRhYy5ncilcbmFuY2hvci5ubyA8LSBwaW50ZXJzZWN0KGFuY2hvci5ub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2xvZ09FX2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuNS5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGF0YWMuZ3IpXG5hbmNob3IuZG93biA8LSBwaW50ZXJzZWN0KGFuY2hvci5kb3duW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_logOE_all_dTAGvsDMSO_UP_diff0.5.bedpe\))
anchor.up <- (extractAnchor(loop.up))
overlaps <- findOverlaps(anchor.up, atac.gr)
anchor.up <- pintersect(anchor.up[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_logOE_all_dTAGvsDMSO_NO_diff0.5.bedpe\))
anchor.no <- (extractAnchor(loop.no))
overlaps <- findOverlaps(anchor.no, atac.gr)
anchor.no <- pintersect(anchor.no[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])


loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_logOE_all_dTAGvsDMSO_DOWN_diff0.5.bedpe\))
anchor.down <- (extractAnchor(loop.down))
overlaps <- findOverlaps(anchor.down, atac.gr)
anchor.down <- pintersect(anchor.down[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJTVlU1T1NVNUhJRXhQVEVGY2JteHZiR0ZFYVhJZ1BDMGdhR1Z5WlNoY0lpNHVMeTR1TDNKbGMzVnNkQzlzYjJ4aFhDSXBYRzVrYVhJdVkzSmxZWFJsS0d4dmJHRkVhWElzSUhOb2IzZFhZWEp1YVc1bmN5QTlJRVpCVEZORkxDQnlaV04xY25OcGRtVWdQU0JVVWxWRktWeHVYRzRqSUZWUVhHNXlaWE4xYkhRZ1BTQnlkVzVNVDB4QktHRnVZMmh2Y2k1MWNDd2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVabmR5YVhSbEtIUmlMQ0JvWlhKbEtHeHZiR0ZFYVhJc0lGd2lURTlNUVY5a1ZFRkhYM1p6WDBSTlUwOWZiRzluVDBWZlpHbG1aakF1TlY5MWNGOWhiR3hNYjI5d2MxOWhkR0ZqTG5SemRsd2lLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNibHh1SXlCT1QxeHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdWJtOHNJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYm5SaUlEMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNibVozY21sMFpTaDBZaXdnYUdWeVpTaHNiMnhoUkdseUxDQmNJa3hQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMnh2WjA5RlgyUnBabVl3TGpWZmJtOWZZV3hzVEc5dmNITmZZWFJoWXk1MGMzWmNJaWtzSUhObGNDQTlJRndpWEZ4MFhDSXBYRzVjYmlNZ1JFOVhUbHh1Y21WemRXeDBJRDBnY25WdVRFOU1RU2hoYm1Ob2IzSXVaRzkzYml3Z1lXNWphRzl5TG1Gc2JDd2diRzlzWVVSQ0tWeHVkR0lnUFNCaGMxOTBhV0ppYkdVb2NtVnpkV3gwS1Z4dVpuZHlhWFJsS0hSaUxDQm9aWEpsS0d4dmJHRkVhWElzSUZ3aVRFOU1RVjlrVkVGSFgzWnpYMFJOVTA5ZmJHOW5UMFZmWkdsbVpqQXVOVjlrYjNkdVgyRnNiRXh2YjNCelgyRjBZV011ZEhOMlhDSXBMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUtWeHVYRzVjYmx4dUl5TWpJRWhGUVZSTlFWQmNibUZzY0doaElEd3RJREF1TURWY2JuUmlMblZ3SUR3dElHWnlaV0ZrS0dobGNtVW9iRzlzWVVScGNpd2dYQ0pNVDB4QlgyUlVRVWRmZG5OZlJFMVRUMTlzYjJkUFJWOWthV1ptTUM0MVgzVndYMkZzYkV4dmIzQnpYMkYwWVdNdWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTa2dKVDRsWEc0Z0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ3aVpXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGd2lLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bElHUndiSGx5T2pwbmNtOTFjRjlpZVNoMFlYSm5aWFFwSUNVK0pWeHVJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc1MFlpNXVieUE4TFNCbWNtVmhaQ2hvWlhKbEtHeHZiR0ZFYVhJc0lGd2lURTlNUVY5a1ZFRkhYM1p6WDBSTlUwOWZiRzluVDBWZlpHbG1aakF1TlY5dWIxOWhiR3hNYjI5d2MxOWhkR0ZqTG5SemRsd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2RHRnlaMlYwSUQwZ2RHOTFjSEJsY2loaGJuUnBZbTlrZVNrcElDVStKVnh1SUNCbWFXeDBaWElvYzNSeVgzUnZYMnh2ZDJWeUtHTmxiR3hVZVhCbEtTQTlQU0JjSW1WdFluSjViMjVwWXlCemRHVnRJR05sYkd4Y0lpa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY1ZaaGJIVmxJRHdnWVd4d2FHRXBJQ1UrSlNCa2NHeDVjam82WjNKdmRYQmZZbmtvZEdGeVoyVjBLU0FsUGlWY2JpQWdjMnhwWTJWZmJXbHVLRzFsWVc1U2Jtc3NJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLVnh1ZEdJdVpHOTNiaUE4TFNCbWNtVmhaQ2hvWlhKbEtHeHZiR0ZFYVhJc0lGd2lURTlNUVY5a1ZFRkhYM1p6WDBSTlUwOWZiRzluVDBWZlpHbG1aakF1TlY5a2IzZHVYMkZzYkV4dmIzQnpYMkYwWVdNdWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTa2dKVDRsWEc0Z0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ3aVpXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGd2lLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bElHUndiSGx5T2pwbmNtOTFjRjlpZVNoMFlYSm5aWFFwSUNVK0pWeHVJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc1Y2JuUmxiWEF1ZFhBZ1BDMGdkR0l1ZFhBZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG5Wd0tTQThMU0JqS0Z3aWRHRnlaMlYwWENJc0lGd2lUMUpmZFhCY0lpbGNiblJsYlhBdWJtOGdQQzBnZEdJdWJtOGdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xtNXZLU0E4TFNCaktGd2lkR0Z5WjJWMFhDSXNJRndpVDFKZmJtOWNJaWxjYm5SbGJYQXVaRzkzYmlBOExTQjBZaTVrYjNkdUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2IyUmtjMUpoZEdsdktWeHVZMjlzYm1GdFpYTW9kR1Z0Y0M1a2IzZHVLU0E4TFNCaktGd2lkR0Z5WjJWMFhDSXNJRndpVDFKZlpHOTNibHdpS1Z4dVhHNWNiblJsYlhBZ1BDMGdablZzYkY5cWIybHVLR1oxYkd4ZmFtOXBiaWgwWlcxd0xuVndMQ0IwWlcxd0xtNXZMQ0JpZVNBOUlHTW9YQ0owWVhKblpYUmNJaWtwTENCMFpXMXdMbVJ2ZDI0c0lHSjVJRDBnWXloY0luUmhjbWRsZEZ3aUtTa2dKVDRsSUcxMWRHRjBaVjloYkd3b2ZuSmxjR3hoWTJWZmJtRW9MaXdnTVNrcFhHNWNibVJoZEdFZ1BDMGdZWE11YldGMGNtbDRLSFJsYlhCYk1qbzBYU2xjYm5KdmQyNWhiV1Z6S0dSaGRHRXBJRHd0SUhSbGJYQWtkR0Z5WjJWMFhHNWNibXhwWW5KaGNua29ZMmx5WTJ4cGVtVXBYRzVqYjJ4ZlpuVnVJRHd0SUdOdmJHOXlVbUZ0Y0RJb1l5aHRhVzRvWkdGMFlTa3NJRzFoZUNoa1lYUmhLU2tzSUdNb1hDSjNhR2wwWlZ3aUxDQmNJbkpsWkZ3aUtTbGNibHh1WEc0alpuWnBlbDl1WW1Oc2RYTjBLR1JoZEdFc0lHdHRaV0Z1Y3l3Z2JXVjBhRzlrSUQwZ1hDSjNjM05jSWlsY2JseHVjQ0E4TFNCSVpXRjBiV0Z3S0Z4dUlDQmtZWFJoTEZ4dUlDQnVZVzFsSUQwZ1hDSlBaR1J6SUZKaGRHbHZYQ0lzSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1RtRnRaU0J2WmlCMGFHVWdhR1ZoZEcxaGNDQnNaV2RsYm1SY2JpQWdZMngxYzNSbGNsOWpiMngxYlc1eklEMGdSa0ZNVTBVc0lDQWdJQ0FnSUNBZ0lDQWdJeUJTWlcxdmRtVWdZMjlzZFcxdUlHUmxibVJ5YjJkeVlXMWNiaUFnY205M1gydHRJRDBnTkN3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUVSbFptbHVaU0IwYUdVZ2JuVnRZbVZ5SUc5bUlHc3RiV1ZoYm5NZ1kyeDFjM1JsY25NZ1ptOXlJSEp2ZDNNZ0tHRmthblZ6ZENCaGN5QnVaV1ZrWldRcFhHNGdJSE5vYjNkZmNtOTNYMlJsYm1RZ1BTQkdRVXhUUlN4Y2JpQWdZMjlzSUQwZ1kyOXNYMloxYml4Y2JpQWdZbTl5WkdWeUlEMGdWRkpWUlZ4dUtWeHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKaGJtTm9iM0pNVDB4QlgyUlVRVWRmZG5OZlJFMVRUMTlzYjJkUFJWOWthV1ptTUM0MVgyRnNiRXh2YjNCelgyRnNiRUZ1WTJodmNrSmhZMnRuY205MWJtUmZZWFJoWTF3aUtWeHVhR1ZwWjJoMElEd3RJRGRjYm5kcFpIUm9JRHd0SURNdU5WeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVhHNWNiaU1qSXlNakl5TWpJeU1qSTF4dUl5QmNiaU1nSXlNaklGWnBjM1ZoYkdsNmFXNW5JSEF0ZG1Gc2RXVWdZVzVrSUU5U1hHNGpJR0ZzY0doaElEd3RJREF1TURWY2JpTWdkR0l1ZFhBZ1BDMGdabkpsWVdRb2FHVnlaU2hzYjJ4aFJHbHlMQ0JjSWt4UFRFRmZaRlJCUjE5MmMxOUVUVk5QWDJ4dlowOUZYMlJwWm1Zd0xqVmZkWEJmWVd4c1RHOXZjSE5mWVhSaFl5NTBjM1pjSWlrcElDVStKVnh1SXlBZ0lHUndiSGx5T2pwdGRYUmhkR1VvZEdGeVoyVjBJRDBnZEc5MWNIQmxjaWhoYm5ScFltOWtlU2tzWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeFZtRnNkV1ZNYjJjZ1BTQXRiRzluTWloeFZtRnNkV1VwTEZ4dUl5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ozSnZkWEFnUFNCY0lsVlFYQ0lwSUNVK0pWeHVJeUFnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRndpWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ3aUtTQWxQaVZjYmlNZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlVZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGpJQ0FnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dUl5QjBZaTV1YnlBOExTQm1jbVZoWkNob1pYSmxLR3h2YkdGRWFYSXNJRndpVEU5TVFWOWtWRUZIWDNaelgwUk5VMDlmYkc5blQwVmZaR2xtWmpBdU5WOXViMTloYkd4TWIyOXdjMTloZEdGakxuUnpkbHdpS1NrZ0pUNGxYRzRqSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU3hjYmlNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGV1lXeDFaVXh2WnlBOUlDMXNiMmN5S0hGV1lXeDFaU2tzWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbmNtOTFjQ0E5SUZ3aVRrOWNJaWtnSlQ0bFhHNGpJQ0FnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYQ0psYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWENJcElDVStKVnh1SXlBZ0lHUndiSGx5T2pwbWFXeDBaWElvY1ZaaGJIVmxJRHdnWVd4d2FHRXBJQ1UrSlNCa2NHeDVjam82WjNKdmRYQmZZbmtvZEdGeVoyVjBLU0FsUGlWY2JpTWdJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc0aklIUmlMbVJ2ZDI0Z1BDMGdabkpsWVdRb2FHVnlaU2hzYjJ4aFJHbHlMQ0JjSWt4UFRFRmZaRlJCUjE5MmMxOUVUVk5QWDJ4dlowOUZYMlJwWm1Zd0xqVmZaRzkzYmw5aGJHeE1iMjl3YzE5aGRHRmpMblJ6ZGx3aUtTa2dKVDRsWEc0aklDQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1N4Y2JpTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIRldZV3gxWlV4dlp5QTlJQzFzYjJjeUtIRldZV3gxWlNrc1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5jbTkxY0NBOUlGd2lSRTlYVGx3aUtTQWxQaVZjYmlNZ0lDQm1hV3gwWlhJb2MzUnlYM1J2WDJ4dmQyVnlLR05sYkd4VWVYQmxLU0E5UFNCY0ltVnRZbko1YjI1cFl5QnpkR1Z0SUdObGJHeGNJaWtnSlQ0bFhHNGpJQ0FnWkhCc2VYSTZPbVpwYkhSbGNpaHhWbUZzZFdVZ1BDQmhiSEJvWVNrZ0pUNGxJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SXlBZ0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNiaU1nWEc0aklIUmxiWEF1ZFhBZ1BDMGdkR0l1ZFhBZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4c0lIRldZV3gxWlV4dlp5d2daM0p2ZFhBcFhHNGpJSFJsYlhBdWJtOGdQQzBnZEdJdWJtOGdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHNJSEZXWVd4MVpVeHZaeXdnWjNKdmRYQXBYRzRqSUhSbGJYQXVaRzkzYmlBOExTQjBZaTVrYjNkdUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2IyUmtjMUpoZEdsdkxDQnhWbUZzZFdWTWIyY3NJR2R5YjNWd0tWeHVJeUJjYmlNZ2RHVnRjQ0E4TFNCaWFXNWtYM0p2ZDNNb2RHVnRjQzUxY0N3Z2RHVnRjQzVrYjNkdUtWeHVJeUJjYmlNZ2IzSmtaWElnUEMwZ1l5Z29kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY0lsVlFYQ0lwSUNVK0pTQmhjbkpoYm1kbEtHUmxjMk1vYjJSa2MxSmhkR2x2S1NrcEpIUmhjbWRsZEN3Z1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnS0hSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdYQ0pFVDFkT1hDSXBJQ1UrSlNCaGNuSmhibWRsS0dSbGMyTW9iMlJrYzFKaGRHbHZLU2twSkhSaGNtZGxkQ2xjYmlNZ2RHVnRjQ1IwWVhKblpYUWdQQzBnWm1GamRHOXlLSFJsYlhBa2RHRnlaMlYwTENCc1pYWmxiSE1nUFNCeVpYWW9iM0prWlhJcEtWeHVJeUJ3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnZEdGeVoyVjBMQ0JqYjJ4dmNpQTlJSEZXWVd4MVpVeHZaeXdnYzJsNlpTQTlJRzlrWkhOU1lYUnBieWtwSUN0Y2JpTWdJQ0JuWlc5dFgzQnZhVzUwS0NrZ0t5QjBhR1Z0WlY5aWR5Z3BJQ3NnYzJOaGJHVmZZMjlzYjNKZlozSmhaR2xsYm5Rb2JHOTNJRDBnWENKaWJIVmxYQ0lzSUdocFoyZ2dQU0JjSW5KbFpGd2lLU0FyWEc0aklDQWdiR0ZpY3loNElEMGdUbFZNVEN3Z2VTQTlJRTVWVEV3cElDQXJJQ0FnYzJOaGJHVmZjMmw2WlY5amIyNTBhVzUxYjNWektISmhibWRsSUQwZ1l5Z3hMQ0F6S1NrZ0sxeHVJeUFnSUhSb1pXMWxLR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3NJQ0FqSUZObGRDQmhlR2x6SUhSbGVIUWdjMmw2WlZ4dUl5QWdJQ0FnSUNBZ0lHRjRhWE11ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb2MybDZaU0E5SURZcExDQWpJRk5sZENCaGVHbHpJSFJwZEd4bElITnBlbVVnS0dsbUlHNXZkQ0J5WlcxdmRtVmtLVnh1SXlBZ0lDQWdJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0hOcGVtVWdQU0EyS1N3Z0l5QlRaWFFnYkdWblpXNWtJSFJsZUhRZ2MybDZaVnh1SXlBZ0lDQWdJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTmlrcElGeHVJeUJjYmlNZ1ptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2lZVzVqYUc5eVRFOU1RVjlrVkVGSFgzWnpYMFJOVTA5ZmJHOW5UMFZmWkdsbVpqQXVOVjloYkd4TWIyOXdjMTlQVWw5aGJHeEJibU5vYjNKQ1lXTnJaM0p2ZFc1a1gyRjBZV05jSWlsY2JpTWdhR1ZwWjJoMElEd3RNMXh1SXlCM2FXUjBhQ0E4TFNBeVhHNGpJSEJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpTWdjSEpwYm5Rb2NDbGNiaU1nWkdWMkxtOW1aaWdwWEc0aklITjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaU1nY0hKcGJuUW9jQ2xjYmlNZ1pHVjJMbTltWmlncFhHNWNibHh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbiMgUlVOTklORyBMT0xBXG5sb2xhRGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHQvbG9sYVxcKVxuZGlyLmNyZWF0ZShsb2xhRGlyLCBzaG93V2FybmluZ3MgPSBGQUxTRSwgcmVjdXJzaXZlID0gVFJVRSlcblxuIyBVUFxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IudXAsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfdXBfYWxsTG9vcHNfYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbiMgTk9cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLm5vLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X25vX2FsbExvb3BzX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG4jIERPV05cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmRvd24sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfZG93bl9hbGxMb29wc19hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuXG5cbiMjIyBIRUFUTUFQXG5hbHBoYSA8LSAwLjA1XG50Yi51cCA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV91cF9hbGxMb29wc19hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfbm9fYWxsTG9vcHNfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLmRvd24gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfZG93bl9hbGxMb29wc19hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC51cCkgPC0gYyhcXHRhcmdldFxcLCBcXE9SX3VwXFwpXG50ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5ubykgPC0gYyhcXHRhcmdldFxcLCBcXE9SX25vXFwpXG50ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAuZG93bikgPC0gYyhcXHRhcmdldFxcLCBcXE9SX2Rvd25cXClcblxuXG50ZW1wIDwtIGZ1bGxfam9pbihmdWxsX2pvaW4odGVtcC51cCwgdGVtcC5ubywgYnkgPSBjKFxcdGFyZ2V0XFwpKSwgdGVtcC5kb3duLCBieSA9IGMoXFx0YXJnZXRcXCkpICU+JSBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKVxuXG5kYXRhIDwtIGFzLm1hdHJpeCh0ZW1wWzI6NF0pXG5yb3duYW1lcyhkYXRhKSA8LSB0ZW1wJHRhcmdldFxuXG5saWJyYXJ5KGNpcmNsaXplKVxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMobWluKGRhdGEpLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHJvd19rbSA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgIyBEZWZpbmUgdGhlIG51bWJlciBvZiBrLW1lYW5zIGNsdXN0ZXJzIGZvciByb3dzIChhZGp1c3QgYXMgbmVlZGVkKVxuICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gIGNvbCA9IGNvbF9mdW4sXG4gIGJvcmRlciA9IFRSVUVcbilcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcYW5jaG9yTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9hbGxMb29wc19hbGxBbmNob3JCYWNrZ3JvdW5kX2F0YWNcXClcbmhlaWdodCA8LSA3XG53aWR0aCA8LSAzLjVcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG4jIyMjIyMjIyMjIyNcbiMgXG4jICMjIyBWaXN1YWxpemluZyBwLXZhbHVlIGFuZCBPUlxuIyBhbHBoYSA8LSAwLjA1XG4jIHRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X3VwX2FsbExvb3BzX2F0YWMudHN2XFwpKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuIyAgICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiMgICAgICAgICAgICAgICAgIGdyb3VwID0gXFxVUFxcKSAlPiVcbiMgICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4jICAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuIyAgIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbiMgdGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfbm9fYWxsTG9vcHNfYXRhYy50c3ZcXCkpICU+JVxuIyAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4jICAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuIyAgICAgICAgICAgICAgICAgZ3JvdXAgPSBcXE5PXFwpICU+JVxuIyAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4jICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuIyB0Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X2Rvd25fYWxsTG9vcHNfYXRhYy50c3ZcXCkpICU+JVxuIyAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4jICAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuIyAgICAgICAgICAgICAgICAgZ3JvdXAgPSBcXERPV05cXCkgJT4lXG4jICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuIyAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiMgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG4jIFxuIyB0ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxuIyB0ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxuIyB0ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbiMgXG4jIHRlbXAgPC0gYmluZF9yb3dzKHRlbXAudXAsIHRlbXAuZG93bilcbiMgXG4jIG9yZGVyIDwtIGMoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxVUFxcKSAlPiUgYXJyYW5nZShkZXNjKG9kZHNSYXRpbykpKSR0YXJnZXQsIFxuIyAgICAgICAgICAgICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcRE9XTlxcKSAlPiUgYXJyYW5nZShkZXNjKG9kZHNSYXRpbykpKSR0YXJnZXQpXG4jIHRlbXAkdGFyZ2V0IDwtIGZhY3Rvcih0ZW1wJHRhcmdldCwgbGV2ZWxzID0gcmV2KG9yZGVyKSlcbiMgcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IHRhcmdldCwgY29sb3IgPSBxVmFsdWVMb2csIHNpemUgPSBvZGRzUmF0aW8pKSArXG4jICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxcYmx1ZVxcLCBoaWdoID0gXFxyZWRcXCkgK1xuIyAgIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgKyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgMykpICtcbiMgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZClcbiMgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemVcbiMgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcbiMgXG4jIGZpbGVOYW1lIDwtIHBhc3RlMChcXGFuY2hvckxPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfYWxsTG9vcHNfT1JfYWxsQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG4jIGhlaWdodCA8LTNcbiMgd2lkdGggPC0gMlxuIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# RUNNING LOLA
lolaDir <- here(\../../result/lola\)
dir.create(lolaDir, showWarnings = FALSE, recursive = TRUE)

# UP
result = runLOLA(anchor.up, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_up_allLoops_atac.tsv\), sep = \\t\)

# NO
result = runLOLA(anchor.no, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_no_allLoops_atac.tsv\), sep = \\t\)

# DOWN
result = runLOLA(anchor.down, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_down_allLoops_atac.tsv\), sep = \\t\)



### HEATMAP
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_up_allLoops_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_no_allLoops_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_down_allLoops_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio)
colnames(temp.up) <- c(\target\, \OR_up\)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio)
colnames(temp.no) <- c(\target\, \OR_no\)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio)
colnames(temp.down) <- c(\target\, \OR_down\)


temp <- full_join(full_join(temp.up, temp.no, by = c(\target\)), temp.down, by = c(\target\)) %>% mutate_all(~replace_na(., 1))

data <- as.matrix(temp[2:4])
rownames(data) <- temp$target

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  row_km = 4,                        # Define the number of k-means clusters for rows (adjust as needed)
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)

fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_logOE_diff0.5_allLoops_allAnchorBackground_atac\)
height <- 7
width <- 3.5
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


############
# 
# ### Visualizing p-value and OR
# alpha <- 0.05
# tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_up_allLoops_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \UP\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)
# tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_no_allLoops_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \NO\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)
# tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_down_allLoops_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \DOWN\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)
# 
# temp.up <- tb.up %>% dplyr::select(target, oddsRatio, qValueLog, group)
# temp.no <- tb.no %>% dplyr::select(target, oddsRatio, qValueLog, group)
# temp.down <- tb.down %>% dplyr::select(target, oddsRatio, qValueLog, group)
# 
# temp <- bind_rows(temp.up, temp.down)
# 
# order <- c((temp %>% dplyr::filter(group == \UP\) %>% arrange(desc(oddsRatio)))$target, 
#            (temp %>% dplyr::filter(group == \DOWN\) %>% arrange(desc(oddsRatio)))$target)
# temp$target <- factor(temp$target, levels = rev(order))
# p <- ggplot(temp, aes(x = group, y = target, color = qValueLog, size = oddsRatio)) +
#   geom_point() + theme_bw() + scale_color_gradient(low = \blue\, high = \red\) +
#   labs(x = NULL, y = NULL)  +   scale_size_continuous(range = c(1, 3)) +
#   theme(axis.text = element_text(size = 6),  # Set axis text size
#         axis.title = element_text(size = 6), # Set axis title size (if not removed)
#         legend.text = element_text(size = 6), # Set legend text size
#         legend.title = element_text(size = 6)) 
# 
# fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_logOE_diff0.5_allLoops_OR_allAnchorBackground_atac\)
# height <-3
# width <- 2
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QlNWVTVPU1U1SElFeFBURUZjYm14dmJHRkVhWElnUEMwZ2FHVnlaU2hjWEM0dUx5NHVMM0psYzNWc2RDOXNiMnhoWEZ3cFhHNWthWEl1WTNKbFlYUmxLR3h2YkdGRWFYSXNJSE5vYjNkWFlYSnVhVzVuY3lBOUlFWkJURk5GTENCeVpXTjFjbk5wZG1VZ1BTQlVVbFZGS1Z4dVhHNGpJRlZRWEc1eVpYTjFiSFFnUFNCeWRXNU1UMHhCS0dGdVkyaHZjaTUxY0N3Z1lXNWphRzl5TG1Gc2JDd2diRzlzWVVSQ0tWeHVkR0lnUFNCaGMxOTBhV0ppYkdVb2NtVnpkV3gwS1Z4dVpuZHlhWFJsS0hSaUxDQm9aWEpsS0d4dmJHRkVhWElzSUZ4Y1RFOU1RVjlrVkVGSFgzWnpYMFJOVTA5ZmJHOW5UMFZmWkdsbVpqQXVOVjkxY0Y5aGJHeE1iMjl3YzE5aGRHRmpMblJ6ZGx4Y0tTd2djMlZ3SUQwZ1hGeGNYSFJjWENsY2JseHVJeUJPVDF4dWNtVnpkV3gwSUQwZ2NuVnVURTlNUVNoaGJtTm9iM0l1Ym04c0lHRnVZMmh2Y2k1aGJHd3NJR3h2YkdGRVFpbGNiblJpSUQwZ1lYTmZkR2xpWW14bEtISmxjM1ZzZENsY2JtWjNjbWwwWlNoMFlpd2dhR1Z5WlNoc2IyeGhSR2x5TENCY1hFeFBURUZmWkZSQlIxOTJjMTlFVFZOUFgyeHZaMDlGWDJScFptWXdMalZmYm05ZllXeHNURzl2Y0hOZllYUmhZeTUwYzNaY1hDa3NJSE5sY0NBOUlGeGNYRngwWEZ3cFhHNWNiaU1nUkU5WFRseHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdVpHOTNiaXdnWVc1amFHOXlMbUZzYkN3Z2JHOXNZVVJDS1Z4dWRHSWdQU0JoYzE5MGFXSmliR1VvY21WemRXeDBLVnh1Wm5keWFYUmxLSFJpTENCb1pYSmxLR3h2YkdGRWFYSXNJRnhjVEU5TVFWOWtWRUZIWDNaelgwUk5VMDlmYkc5blQwVmZaR2xtWmpBdU5WOWtiM2R1WDJGc2JFeHZiM0J6WDJGMFlXTXVkSE4yWEZ3cExDQnpaWEFnUFNCY1hGeGNkRnhjS1Z4dVhHNWNibHh1SXlNaklFaEZRVlJOUVZCY2JtRnNjR2hoSUR3dElEQXVNRFZjYm5SaUxuVndJRHd0SUdaeVpXRmtLR2hsY21Vb2JHOXNZVVJwY2l3Z1hGeE1UMHhCWDJSVVFVZGZkbk5mUkUxVFQxOXNiMmRQUlY5a2FXWm1NQzQxWDNWd1gyRnNiRXh2YjNCelgyRjBZV011ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1NrZ0pUNGxYRzRnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRnhjWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ4Y0tTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh4Vm1Gc2RXVWdQQ0JoYkhCb1lTa2dKVDRsSUdSd2JIbHlPanBuY205MWNGOWllU2gwWVhKblpYUXBJQ1UrSlZ4dUlDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzUwWWk1dWJ5QThMU0JtY21WaFpDaG9aWEpsS0d4dmJHRkVhWElzSUZ4Y1RFOU1RVjlrVkVGSFgzWnpYMFJOVTA5ZmJHOW5UMFZmWkdsbVpqQXVOVjl1YjE5aGJHeE1iMjl3YzE5aGRHRmpMblJ6ZGx4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvZEdGeVoyVjBJRDBnZEc5MWNIQmxjaWhoYm5ScFltOWtlU2twSUNVK0pWeHVJQ0JtYVd4MFpYSW9jM1J5WDNSdlgyeHZkMlZ5S0dObGJHeFVlWEJsS1NBOVBTQmNYR1Z0WW5KNWIyNXBZeUJ6ZEdWdElHTmxiR3hjWENrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKU0JrY0d4NWNqbzZaM0p2ZFhCZllua29kR0Z5WjJWMEtTQWxQaVZjYmlBZ2MyeHBZMlZmYldsdUtHMWxZVzVTYm1zc0lIZHBkR2hmZEdsbGN5QTlJRVpCVEZORktWeHVkR0l1Wkc5M2JpQThMU0JtY21WaFpDaG9aWEpsS0d4dmJHRkVhWElzSUZ4Y1RFOU1RVjlrVkVGSFgzWnpYMFJOVTA5ZmJHOW5UMFZmWkdsbVpqQXVOVjlrYjNkdVgyRnNiRXh2YjNCelgyRjBZV011ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1NrZ0pUNGxYRzRnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRnhjWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ4Y0tTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh4Vm1Gc2RXVWdQQ0JoYkhCb1lTa2dKVDRsSUdSd2JIbHlPanBuY205MWNGOWllU2gwWVhKblpYUXBJQ1UrSlZ4dUlDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzVjYm5SbGJYQXVkWEFnUEMwZ2RHSXVkWEFnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0J2WkdSelVtRjBhVzhwWEc1amIyeHVZVzFsY3loMFpXMXdMblZ3S1NBOExTQmpLRnhjZEdGeVoyVjBYRndzSUZ4Y1QxSmZkWEJjWENsY2JuUmxiWEF1Ym04Z1BDMGdkR0l1Ym04Z0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG01dktTQThMU0JqS0Z4Y2RHRnlaMlYwWEZ3c0lGeGNUMUpmYm05Y1hDbGNiblJsYlhBdVpHOTNiaUE4TFNCMFlpNWtiM2R1SUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYjJSa2MxSmhkR2x2S1Z4dVkyOXNibUZ0WlhNb2RHVnRjQzVrYjNkdUtTQThMU0JqS0Z4Y2RHRnlaMlYwWEZ3c0lGeGNUMUpmWkc5M2JseGNLVnh1WEc1Y2JuUmxiWEFnUEMwZ1puVnNiRjlxYjJsdUtHWjFiR3hmYW05cGJpaDBaVzF3TG5Wd0xDQjBaVzF3TG01dkxDQmllU0E5SUdNb1hGeDBZWEpuWlhSY1hDa3BMQ0IwWlcxd0xtUnZkMjRzSUdKNUlEMGdZeWhjWEhSaGNtZGxkRnhjS1NrZ0pUNGxJRzExZEdGMFpWOWhiR3dvZm5KbGNHeGhZMlZmYm1Fb0xpd2dNU2twWEc1Y2JtUmhkR0VnUEMwZ1lYTXViV0YwY21sNEtIUmxiWEJiTWpvMFhTbGNibkp2ZDI1aGJXVnpLR1JoZEdFcElEd3RJSFJsYlhBa2RHRnlaMlYwWEc1Y2JteHBZbkpoY25rb1kybHlZMnhwZW1VcFhHNWpiMnhmWm5WdUlEd3RJR052Ykc5eVVtRnRjRElvWXlodGFXNG9aR0YwWVNrc0lHMWhlQ2hrWVhSaEtTa3NJR01vWEZ4M2FHbDBaVnhjTENCY1hISmxaRnhjS1NsY2JseHVYRzRqWm5acGVsOXVZbU5zZFhOMEtHUmhkR0VzSUd0dFpXRnVjeXdnYldWMGFHOWtJRDBnWEZ4M2MzTmNYQ2xjYmx4dWNDQThMU0JJWldGMGJXRndLRnh1SUNCa1lYUmhMRnh1SUNCdVlXMWxJRDBnWEZ4UFpHUnpJRkpoZEdsdlhGd3NJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ01nVG1GdFpTQnZaaUIwYUdVZ2FHVmhkRzFoY0NCc1pXZGxibVJjYmlBZ1kyeDFjM1JsY2w5amIyeDFiVzV6SUQwZ1JrRk1VMFVzSUNBZ0lDQWdJQ0FnSUNBZ0l5QlNaVzF2ZG1VZ1kyOXNkVzF1SUdSbGJtUnliMmR5WVcxY2JpQWdjbTkzWDJ0dElEMGdOQ3dnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpJRVJsWm1sdVpTQjBhR1VnYm5WdFltVnlJRzltSUdzdGJXVmhibk1nWTJ4MWMzUmxjbk1nWm05eUlISnZkM01nS0dGa2FuVnpkQ0JoY3lCdVpXVmtaV1FwWEc0Z0lITm9iM2RmY205M1gyUmxibVFnUFNCR1FVeFRSU3hjYmlBZ1kyOXNJRDBnWTI5c1gyWjFiaXhjYmlBZ1ltOXlaR1Z5SUQwZ1ZGSlZSVnh1S1Z4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhoYm1Ob2IzSk1UMHhCWDJSVVFVZGZkbk5mUkUxVFQxOXNiMmRQUlY5a2FXWm1NQzQxWDJGc2JFeHZiM0J6WDJGc2JFRnVZMmh2Y2tKaFkydG5jbTkxYm1SZllYUmhZMXhjS1Z4dWFHVnBaMmgwSUR3dElEZGNibmRwWkhSb0lEd3RJRE11TlZ4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc1Y2JpTWpJeU1qSXlNakl5TWpJMXh1SXlCY2JpTWdJeU1qSUZacGMzVmhiR2w2YVc1bklIQXRkbUZzZFdVZ1lXNWtJRTlTWEc0aklHRnNjR2hoSUR3dElEQXVNRFZjYmlNZ2RHSXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaHNiMnhoUkdseUxDQmNYRXhQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMnh2WjA5RlgyUnBabVl3TGpWZmRYQmZZV3hzVEc5dmNITmZZWFJoWXk1MGMzWmNYQ2twSUNVK0pWeHVJeUFnSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0Z5WjJWMElEMGdkRzkxY0hCbGNpaGhiblJwWW05a2VTa3NYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J4Vm1Gc2RXVk1iMmNnUFNBdGJHOW5NaWh4Vm1Gc2RXVXBMRnh1SXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjNKdmRYQWdQU0JjWEZWUVhGd3BJQ1UrSlZ4dUl5QWdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGeGNaVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRnhjS1NBbFBpVmNiaU1nSUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVVnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0aklDQWdjMnhwWTJWZmJXbHVLRzFsWVc1U2Jtc3NJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLVnh1SXlCMFlpNXVieUE4TFNCbWNtVmhaQ2hvWlhKbEtHeHZiR0ZFYVhJc0lGeGNURTlNUVY5a1ZFRkhYM1p6WDBSTlUwOWZiRzluVDBWZlpHbG1aakF1TlY5dWIxOWhiR3hNYjI5d2MxOWhkR0ZqTG5SemRseGNLU2tnSlQ0bFhHNGpJQ0FnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTeGNiaU1nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEZXWVd4MVpVeHZaeUE5SUMxc2IyY3lLSEZXWVd4MVpTa3NYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuY205MWNDQTlJRnhjVGs5Y1hDa2dKVDRsWEc0aklDQWdabWxzZEdWeUtITjBjbDkwYjE5c2IzZGxjaWhqWld4c1ZIbHdaU2tnUFQwZ1hGeGxiV0p5ZVc5dWFXTWdjM1JsYlNCalpXeHNYRndwSUNVK0pWeHVJeUFnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKU0JrY0d4NWNqbzZaM0p2ZFhCZllua29kR0Z5WjJWMEtTQWxQaVZjYmlNZ0lDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzRqSUhSaUxtUnZkMjRnUEMwZ1puSmxZV1FvYUdWeVpTaHNiMnhoUkdseUxDQmNYRXhQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMnh2WjA5RlgyUnBabVl3TGpWZlpHOTNibDloYkd4TWIyOXdjMTloZEdGakxuUnpkbHhjS1NrZ0pUNGxYRzRqSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU3hjYmlNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGV1lXeDFaVXh2WnlBOUlDMXNiMmN5S0hGV1lXeDFaU2tzWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbmNtOTFjQ0E5SUZ4Y1JFOVhUbHhjS1NBbFBpVmNiaU1nSUNCbWFXeDBaWElvYzNSeVgzUnZYMnh2ZDJWeUtHTmxiR3hVZVhCbEtTQTlQU0JjWEdWdFluSjViMjVwWXlCemRHVnRJR05sYkd4Y1hDa2dKVDRsWEc0aklDQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bElHUndiSGx5T2pwbmNtOTFjRjlpZVNoMFlYSm5aWFFwSUNVK0pWeHVJeUFnSUhOc2FXTmxYMjFwYmlodFpXRnVVbTVyTENCM2FYUm9YM1JwWlhNZ1BTQkdRVXhUUlNsY2JpTWdYRzRqSUhSbGJYQXVkWEFnUEMwZ2RHSXVkWEFnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0J2WkdSelVtRjBhVzhzSUhGV1lXeDFaVXh2Wnl3Z1ozSnZkWEFwWEc0aklIUmxiWEF1Ym04Z1BDMGdkR0l1Ym04Z0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4c0lIRldZV3gxWlV4dlp5d2daM0p2ZFhBcFhHNGpJSFJsYlhBdVpHOTNiaUE4TFNCMFlpNWtiM2R1SUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYjJSa2MxSmhkR2x2TENCeFZtRnNkV1ZNYjJjc0lHZHliM1Z3S1Z4dUl5QmNiaU1nZEdWdGNDQThMU0JpYVc1a1gzSnZkM01vZEdWdGNDNTFjQ3dnZEdWdGNDNWtiM2R1S1Z4dUl5QmNiaU1nYjNKa1pYSWdQQzBnWXlnb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JjWEZWUVhGd3BJQ1UrSlNCaGNuSmhibWRsS0dSbGMyTW9iMlJrYzFKaGRHbHZLU2twSkhSaGNtZGxkQ3dnWEc0aklDQWdJQ0FnSUNBZ0lDQWdLSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1hGeEVUMWRPWEZ3cElDVStKU0JoY25KaGJtZGxLR1JsYzJNb2IyUmtjMUpoZEdsdktTa3BKSFJoY21kbGRDbGNiaU1nZEdWdGNDUjBZWEpuWlhRZ1BDMGdabUZqZEc5eUtIUmxiWEFrZEdGeVoyVjBMQ0JzWlhabGJITWdQU0J5WlhZb2IzSmtaWElwS1Z4dUl5QndJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdkR0Z5WjJWMExDQmpiMnh2Y2lBOUlIRldZV3gxWlV4dlp5d2djMmw2WlNBOUlHOWtaSE5TWVhScGJ5a3BJQ3RjYmlNZ0lDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCMGFHVnRaVjlpZHlncElDc2djMk5oYkdWZlkyOXNiM0pmWjNKaFpHbGxiblFvYkc5M0lEMGdYRnhpYkhWbFhGd3NJR2hwWjJnZ1BTQmNYSEpsWkZ4Y0tTQXJYRzRqSUNBZ2JHRmljeWg0SUQwZ1RsVk1UQ3dnZVNBOUlFNVZURXdwSUNBcklDQWdjMk5oYkdWZmMybDZaVjlqYjI1MGFXNTFiM1Z6S0hKaGJtZGxJRDBnWXlneExDQXpLU2tnSzF4dUl5QWdJSFJvWlcxbEtHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTmlrc0lDQWpJRk5sZENCaGVHbHpJSFJsZUhRZ2MybDZaVnh1SXlBZ0lDQWdJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFlwTENBaklGTmxkQ0JoZUdseklIUnBkR3hsSUhOcGVtVWdLR2xtSUc1dmRDQnlaVzF2ZG1Wa0tWeHVJeUFnSUNBZ0lDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTJLU3dnSXlCVFpYUWdiR1ZuWlc1a0lIUmxlSFFnYzJsNlpWeHVJeUFnSUNBZ0lDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOaWtwSUZ4dUl5QmNiaU1nWm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y1lXNWphRzl5VEU5TVFWOWtWRUZIWDNaelgwUk5VMDlmYkc5blQwVmZaR2xtWmpBdU5WOWhiR3hNYjI5d2MxOVBVbDloYkd4QmJtTm9iM0pDWVdOclozSnZkVzVrWDJGMFlXTmNYQ2xjYmlNZ2FHVnBaMmgwSUR3dE0xeHVJeUIzYVdSMGFDQThMU0F5WEc0aklIQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlNZ2NISnBiblFvY0NsY2JpTWdaR1YyTG05bVppZ3BYRzRqSUhOMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpTWdjSEpwYm5Rb2NDbGNiaU1nWkdWMkxtOW1aaWdwWEc1Y2JseHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG4jIFJVTk5JTkcgTE9MQVxubG9sYURpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0L2xvbGFcXClcbmRpci5jcmVhdGUobG9sYURpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpXG5cbiMgVVBcbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLnVwLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X3VwX2FsbExvb3BzX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG4jIE5PXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5ubywgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9ub19hbGxMb29wc19hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBET1dOXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5kb3duLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X2Rvd25fYWxsTG9vcHNfYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cblxuXG4jIyMgSEVBVE1BUFxuYWxwaGEgPC0gMC4wNVxudGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfdXBfYWxsTG9vcHNfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X25vX2FsbExvb3BzX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X2Rvd25fYWxsTG9vcHNfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAudXApIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl91cFxcKVxudGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAubm8pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9ub1xcKVxudGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmRvd24pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9kb3duXFwpXG5cblxudGVtcCA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAudXAsIHRlbXAubm8sIGJ5ID0gYyhcXHRhcmdldFxcKSksIHRlbXAuZG93biwgYnkgPSBjKFxcdGFyZ2V0XFwpKSAlPiUgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcblxuZGF0YSA8LSBhcy5tYXRyaXgodGVtcFsyOjRdKVxucm93bmFtZXMoZGF0YSkgPC0gdGVtcCR0YXJnZXRcblxubGlicmFyeShjaXJjbGl6ZSlcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKG1pbihkYXRhKSwgbWF4KGRhdGEpKSwgYyhcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5cbiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSBcXHdzc1xcKVxuXG5wIDwtIEhlYXRtYXAoXG4gIGRhdGEsXG4gIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZFxuICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbVxuICByb3dfa20gPSA0LCAgICAgICAgICAgICAgICAgICAgICAgICMgRGVmaW5lIHRoZSBudW1iZXIgb2Ygay1tZWFucyBjbHVzdGVycyBmb3Igcm93cyAoYWRqdXN0IGFzIG5lZWRlZClcbiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICBjb2wgPSBjb2xfZnVuLFxuICBib3JkZXIgPSBUUlVFXG4pXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGFuY2hvckxPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfYWxsTG9vcHNfYWxsQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG5oZWlnaHQgPC0gN1xud2lkdGggPC0gMy41XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuIyMjIyMjIyMjIyMjXG4jIFxuIyAjIyMgVmlzdWFsaXppbmcgcC12YWx1ZSBhbmQgT1JcbiMgYWxwaGEgPC0gMC4wNVxuIyB0Yi51cCA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV91cF9hbGxMb29wc19hdGFjLnRzdlxcKSkgJT4lXG4jICAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiMgICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4jICAgICAgICAgICAgICAgICBncm91cCA9IFxcVVBcXCkgJT4lXG4jICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuIyAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiMgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG4jIHRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X25vX2FsbExvb3BzX2F0YWMudHN2XFwpKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuIyAgICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiMgICAgICAgICAgICAgICAgIGdyb3VwID0gXFxOT1xcKSAlPiVcbiMgICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4jICAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuIyAgIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbiMgdGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9kb3duX2FsbExvb3BzX2F0YWMudHN2XFwpKSAlPiVcbiMgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuIyAgICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiMgICAgICAgICAgICAgICAgIGdyb3VwID0gXFxET1dOXFwpICU+JVxuIyAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4jICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuIyBcbiMgdGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbiMgdGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbiMgdGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG4jIFxuIyB0ZW1wIDwtIGJpbmRfcm93cyh0ZW1wLnVwLCB0ZW1wLmRvd24pXG4jIFxuIyBvcmRlciA8LSBjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcVVBcXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0LCBcbiMgICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXERPV05cXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0KVxuIyB0ZW1wJHRhcmdldCA8LSBmYWN0b3IodGVtcCR0YXJnZXQsIGxldmVscyA9IHJldihvcmRlcikpXG4jIHAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGNvbG9yID0gcVZhbHVlTG9nLCBzaXplID0gb2Rkc1JhdGlvKSkgK1xuIyAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXGJsdWVcXCwgaGlnaCA9IFxccmVkXFwpICtcbiMgICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICsgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDMpKSArXG4jICAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgICMgU2V0IGF4aXMgdGV4dCBzaXplXG4jICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGF4aXMgdGl0bGUgc2l6ZSAoaWYgbm90IHJlbW92ZWQpXG4jICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBsZWdlbmQgdGV4dCBzaXplXG4jICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkgXG4jIFxuIyBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X2FsbExvb3BzX09SX2FsbEFuY2hvckJhY2tncm91bmRfYXRhY1xcKVxuIyBoZWlnaHQgPC0zXG4jIHdpZHRoIDwtIDJcbiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcblxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBSVU5OSU5HIExPTEFcbmxvbGFEaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdC9sb2xhXFwpXG5kaXIuY3JlYXRlKGxvbGFEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKVxuXG4jIFVQXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci51cCwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV91cF9hbGxMb29wc19hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBOT1xucmVzdWx0ID0gcnVuTE9MQShhbmNob3Iubm8sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfbm9fYWxsTG9vcHNfYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbiMgRE9XTlxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuZG93biwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9kb3duX2FsbExvb3BzX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cblxuIyMjIEhFQVRNQVBcbmFscGhhIDwtIDAuMDVcbnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X3VwX2FsbExvb3BzX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9ub19hbGxMb29wc19hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9kb3duX2FsbExvb3BzX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRlbXAudXAgPC0gdGIudXAgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLnVwKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfdXBcXClcbnRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLm5vKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1Jfbm9cXClcbnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5kb3duKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfZG93blxcKVxuXG5cbnRlbXAgPC0gZnVsbF9qb2luKGZ1bGxfam9pbih0ZW1wLnVwLCB0ZW1wLm5vLCBieSA9IGMoXFx0YXJnZXRcXCkpLCB0ZW1wLmRvd24sIGJ5ID0gYyhcXHRhcmdldFxcKSkgJT4lIG11dGF0ZV9hbGwofnJlcGxhY2VfbmEoLiwgMSkpXG5cbmRhdGEgPC0gYXMubWF0cml4KHRlbXBbMjo0XSlcbnJvd25hbWVzKGRhdGEpIDwtIHRlbXAkdGFyZ2V0XG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYyhtaW4oZGF0YSksIG1heChkYXRhKSksIGMoXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuXG4jZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gXFx3c3NcXClcblxucCA8LSBIZWF0bWFwKFxuICBkYXRhLFxuICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmRcbiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsICAgICAgICAgICAgIyBSZW1vdmUgY29sdW1uIGRlbmRyb2dyYW1cbiAgcm93X2ttID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmluZSB0aGUgbnVtYmVyIG9mIGstbWVhbnMgY2x1c3RlcnMgZm9yIHJvd3MgKGFkanVzdCBhcyBuZWVkZWQpXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1bixcbiAgYm9yZGVyID0gVFJVRVxuKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X2FsbExvb3BzX2FsbEFuY2hvckJhY2tncm91bmRfYXRhY1xcKVxuaGVpZ2h0IDwtIDdcbndpZHRoIDwtIDMuNVxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cbiMjIyMjIyMjIyMjI1xuIyBcbiMgIyMjIFZpc3VhbGl6aW5nIHAtdmFsdWUgYW5kIE9SXG4jIGFscGhhIDwtIDAuMDVcbiMgdGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfdXBfYWxsTG9vcHNfYXRhYy50c3ZcXCkpICU+JVxuIyAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4jICAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuIyAgICAgICAgICAgICAgICAgZ3JvdXAgPSBcXFVQXFwpICU+JVxuIyAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiMgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4jICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuIyB0Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9ub19hbGxMb29wc19hdGFjLnRzdlxcKSkgJT4lXG4jICAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiMgICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4jICAgICAgICAgICAgICAgICBncm91cCA9IFxcTk9cXCkgJT4lXG4jICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuIyAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiMgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG4jIHRiLmRvd24gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfZG93bl9hbGxMb29wc19hdGFjLnRzdlxcKSkgJT4lXG4jICAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiMgICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4jICAgICAgICAgICAgICAgICBncm91cCA9IFxcRE9XTlxcKSAlPiVcbiMgICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4jICAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuIyAgIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbiMgXG4jIHRlbXAudXAgPC0gdGIudXAgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG4jIHRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG4jIHRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxuIyBcbiMgdGVtcCA8LSBiaW5kX3Jvd3ModGVtcC51cCwgdGVtcC5kb3duKVxuIyBcbiMgb3JkZXIgPC0gYygodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXFVQXFwpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCwgXG4jICAgICAgICAgICAgKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxET1dOXFwpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldClcbiMgdGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYob3JkZXIpKVxuIyBwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gdGFyZ2V0LCBjb2xvciA9IHFWYWx1ZUxvZywgc2l6ZSA9IG9kZHNSYXRpbykpICtcbiMgICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gXFxibHVlXFwsIGhpZ2ggPSBcXHJlZFxcKSArXG4jICAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArICAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCAzKSkgK1xuIyAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuIyAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuIyAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuIyBcbiMgZmlsZU5hbWUgPC0gcGFzdGUwKFxcYW5jaG9yTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9hbGxMb29wc19PUl9hbGxBbmNob3JCYWNrZ3JvdW5kX2F0YWNcXClcbiMgaGVpZ2h0IDwtM1xuIyB3aWR0aCA8LSAyXG4jIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG4jIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
# RUNNING LOLA
lolaDir <- here(\../../result/lola\)
dir.create(lolaDir, showWarnings = FALSE, recursive = TRUE)

# UP
result = runLOLA(anchor.up, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_up_allLoops_atac.tsv\), sep = \\t\)

# NO
result = runLOLA(anchor.no, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_no_allLoops_atac.tsv\), sep = \\t\)

# DOWN
result = runLOLA(anchor.down, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_down_allLoops_atac.tsv\), sep = \\t\)



### HEATMAP
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_up_allLoops_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_no_allLoops_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_down_allLoops_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio)
colnames(temp.up) <- c(\target\, \OR_up\)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio)
colnames(temp.no) <- c(\target\, \OR_no\)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio)
colnames(temp.down) <- c(\target\, \OR_down\)


temp <- full_join(full_join(temp.up, temp.no, by = c(\target\)), temp.down, by = c(\target\)) %>% mutate_all(~replace_na(., 1))

data <- as.matrix(temp[2:4])
rownames(data) <- temp$target

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  row_km = 4,                        # Define the number of k-means clusters for rows (adjust as needed)
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)

fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_logOE_diff0.5_allLoops_allAnchorBackground_atac\)
height <- 7
width <- 3.5
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


############
# 
# ### Visualizing p-value and OR
# alpha <- 0.05
# tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_up_allLoops_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \UP\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)
# tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_no_allLoops_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \NO\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)
# tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_down_allLoops_atac.tsv\)) %>%
#   dplyr::mutate(target = toupper(antibody),
#                 qValueLog = -log2(qValue),
#                 group = \DOWN\) %>%
#   filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
#   dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
#   slice_min(meanRnk, with_ties = FALSE)
# 
# temp.up <- tb.up %>% dplyr::select(target, oddsRatio, qValueLog, group)
# temp.no <- tb.no %>% dplyr::select(target, oddsRatio, qValueLog, group)
# temp.down <- tb.down %>% dplyr::select(target, oddsRatio, qValueLog, group)
# 
# temp <- bind_rows(temp.up, temp.down)
# 
# order <- c((temp %>% dplyr::filter(group == \UP\) %>% arrange(desc(oddsRatio)))$target, 
#            (temp %>% dplyr::filter(group == \DOWN\) %>% arrange(desc(oddsRatio)))$target)
# temp$target <- factor(temp$target, levels = rev(order))
# p <- ggplot(temp, aes(x = group, y = target, color = qValueLog, size = oddsRatio)) +
#   geom_point() + theme_bw() + scale_color_gradient(low = \blue\, high = \red\) +
#   labs(x = NULL, y = NULL)  +   scale_size_continuous(range = c(1, 3)) +
#   theme(axis.text = element_text(size = 6),  # Set axis text size
#         axis.title = element_text(size = 6), # Set axis title size (if not removed)
#         legend.text = element_text(size = 6), # Set legend text size
#         legend.title = element_text(size = 6)) 
# 
# fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_logOE_diff0.5_allLoops_OR_allAnchorBackground_atac\)
# height <-3
# width <- 2
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
# svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
# print(p)
# dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### dTAG, obsexp

##### - Limited to ATAC-seq signal, all loop backgroup

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZWFJoWXlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0pIVTAwek1UQTJNalUzWDBGVVFVTmZSVk5EWHpFdVltVmtYQ0lwS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoV01Td2dWaklzSUZZektWeHVZMjlzYm1GdFpYTW9ZWFJoWXlrZ1BDMGdZeWhjSW1Ob2Nsd2lMQ0JjSW5OMFlYSjBYQ0lzSUZ3aVpXNWtYQ0lwWEc1aGRHRmpMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoaGRHRmpLVnh1WEc0aklFeFBRVVJKVGtjZ1RFOVBVRk5jYmlNakl5QkpiWEJ2Y25ScGJtY2daR2xtWm1WeVpXNTBhV0ZzSUhKbFozVnNZWFJ2Y25rZ2JHOXZjSE1nSmlCbGVIUnlZV04wSUdGdVkyaHZjbHh1Ykc5dmNDNWhiR3dnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVM1MGMzWmNJaWtwSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHlJQ1ZwYmlVZ1l5aGNJbEF0VUZ3aUxDQmNJbEF0UlZ3aUxDQmNJa1V0UlZ3aUtTbGNibUZ1WTJodmNpNWhiR3dnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWhiR3dwS1Z4dWIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjaTVoYkd3c0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVlXeHNJRHd0SUhCcGJuUmxjbk5sWTNRb1lXNWphRzl5TG1Gc2JGdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVjYm14dmIzQXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5c2IyZFBSVjl3WlMxd1pWOWtWRUZIZG5ORVRWTlBYMVZRWDJScFptWXdMalV1WW1Wa2NHVmNJaWtwWEc1aGJtTm9iM0l1ZFhBZ1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzUxY0NrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG5Wd0xDQmhkR0ZqTG1keUtWeHVZVzVqYUc5eUxuVndJRHd0SUhCcGJuUmxjbk5sWTNRb1lXNWphRzl5TG5Wd1czRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGRMQ0JoZEdGakxtZHlXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1YwcFhHNWNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjlzYjJkUFJWOXdaUzF3WlY5a1ZFRkhkbk5FVFZOUFgwNVBYMlJwWm1Zd0xqVXVZbVZrY0dWY0lpa3BYRzVoYm1Ob2IzSXVibThnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNXVieWtwWEc1dmRtVnliR0Z3Y3lBOExTQm1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlMbTV2TENCaGRHRmpMbWR5S1Z4dVlXNWphRzl5TG01dklEd3RJSEJwYm5SbGNuTmxZM1FvWVc1amFHOXlMbTV2VzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZExDQmhkR0ZqTG1keVczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjBwWEc1Y2JseHViRzl2Y0M1a2IzZHVJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmYkc5blQwVmZjR1V0Y0dWZlpGUkJSM1p6UkUxVFQxOUVUMWRPWDJScFptWXdMalV1WW1Wa2NHVmNJaWtwWEc1aGJtTm9iM0l1Wkc5M2JpQThMU0FvWlhoMGNtRmpkRUZ1WTJodmNpaHNiMjl3TG1SdmQyNHBLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNWtiM2R1TENCaGRHRmpMbWR5S1Z4dVlXNWphRzl5TG1SdmQyNGdQQzBnY0dsdWRHVnljMlZqZENoaGJtTm9iM0l1Wkc5M2JsdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVjYmx4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5hdGFjIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXEdTTTMxMDYyNTdfQVRBQ19FU0NfMS5iZWRcXCkpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpXG5jb2xuYW1lcyhhdGFjKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbmF0YWMuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGF0YWMpXG5cbiMgTE9BRElORyBMT09QU1xuIyMjIEltcG9ydGluZyBkaWZmZXJlbnRpYWwgcmVndWxhdG9yeSBsb29wcyAmIGV4dHJhY3QgYW5jaG9yXG5sb29wLmFsbCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5LnRzdlxcKSkgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpKVxuYW5jaG9yLmFsbCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmFsbCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmFsbCwgYXRhYy5ncilcbmFuY2hvci5hbGwgPC0gcGludGVyc2VjdChhbmNob3IuYWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2xvZ09FX3BlLXBlX2RUQUd2c0RNU09fVVBfZGlmZjAuNS5iZWRwZVxcKSlcbmFuY2hvci51cCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXAsIGF0YWMuZ3IpXG5hbmNob3IudXAgPC0gcGludGVyc2VjdChhbmNob3IudXBbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2xvZ09FX3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuNS5iZWRwZVxcKSlcbmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3Iubm8sIGF0YWMuZ3IpXG5hbmNob3Iubm8gPC0gcGludGVyc2VjdChhbmNob3Iubm9bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9sb2dPRV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuNS5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGF0YWMuZ3IpXG5hbmNob3IuZG93biA8LSBwaW50ZXJzZWN0KGFuY2hvci5kb3duW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cblxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\)) %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])


loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_logOE_pe-pe_dTAGvsDMSO_UP_diff0.5.bedpe\))
anchor.up <- (extractAnchor(loop.up))
overlaps <- findOverlaps(anchor.up, atac.gr)
anchor.up <- pintersect(anchor.up[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_logOE_pe-pe_dTAGvsDMSO_NO_diff0.5.bedpe\))
anchor.no <- (extractAnchor(loop.no))
overlaps <- findOverlaps(anchor.no, atac.gr)
anchor.no <- pintersect(anchor.no[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])


loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_logOE_pe-pe_dTAGvsDMSO_DOWN_diff0.5.bedpe\))
anchor.down <- (extractAnchor(loop.down))
overlaps <- findOverlaps(anchor.down, atac.gr)
anchor.down <- pintersect(anchor.down[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlYUmhZeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeEhVMDB6TVRBMk1qVTNYMEZVUVVOZlJWTkRYekV1WW1Wa1hGd3BLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hXTVN3Z1ZqSXNJRll6S1Z4dVkyOXNibUZ0WlhNb1lYUmhZeWtnUEMwZ1l5aGNYR05vY2x4Y0xDQmNYSE4wWVhKMFhGd3NJRnhjWlc1a1hGd3BYRzVoZEdGakxtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2hoZEdGaktWeHVYRzRqSUV4UFFVUkpUa2NnVEU5UFVGTmNiaU1qSXlCSmJYQnZjblJwYm1jZ1pHbG1abVZ5Wlc1MGFXRnNJSEpsWjNWc1lYUnZjbmtnYkc5dmNITWdKaUJsZUhSeVlXTjBJR0Z1WTJodmNseHViRzl2Y0M1aGJHd2dQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lUzUwYzNaY1hDa3BJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRUZ1Ym04eUlDVnBiaVVnWXloY1hGQXRVRnhjTENCY1hGQXRSVnhjTENCY1hFVXRSVnhjS1NsY2JtRnVZMmh2Y2k1aGJHd2dQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1aGJHd3BLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNWhiR3dzSUdGMFlXTXVaM0lwWEc1aGJtTm9iM0l1WVd4c0lEd3RJSEJwYm5SbGNuTmxZM1FvWVc1amFHOXlMbUZzYkZ0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0hNcFhTd2dZWFJoWXk1bmNsdHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWxkS1Z4dVhHNWNibXh2YjNBdWRYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjlzYjJkUFJWOXdaUzF3WlY5a1ZFRkhkbk5FVFZOUFgxVlFYMlJwWm1Zd0xqVXVZbVZrY0dWY1hDa3BYRzVoYm1Ob2IzSXVkWEFnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNTFjQ2twWEc1dmRtVnliR0Z3Y3lBOExTQm1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlMblZ3TENCaGRHRmpMbWR5S1Z4dVlXNWphRzl5TG5Wd0lEd3RJSEJwYm5SbGNuTmxZM1FvWVc1amFHOXlMblZ3VzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZExDQmhkR0ZqTG1keVczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjBwWEc1Y2JteHZiM0F1Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXNiMmRQUlY5d1pTMXdaVjlrVkVGSGRuTkVUVk5QWDA1UFgyUnBabVl3TGpVdVltVmtjR1ZjWENrcFhHNWhibU5vYjNJdWJtOGdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1dWJ5a3BYRzV2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxtNXZMQ0JoZEdGakxtZHlLVnh1WVc1amFHOXlMbTV2SUR3dElIQnBiblJsY25ObFkzUW9ZVzVqYUc5eUxtNXZXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkTENCaGRHRmpMbWR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVjYmx4dWJHOXZjQzVrYjNkdUlEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZiRzluVDBWZmNHVXRjR1ZmWkZSQlIzWnpSRTFUVDE5RVQxZE9YMlJwWm1Zd0xqVXVZbVZrY0dWY1hDa3BYRzVoYm1Ob2IzSXVaRzkzYmlBOExTQW9aWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbVJ2ZDI0cEtWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1a2IzZHVMQ0JoZEdGakxtZHlLVnh1WVc1amFHOXlMbVJ2ZDI0Z1BDMGdjR2x1ZEdWeWMyVmpkQ2hoYm1Ob2IzSXVaRzkzYmx0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0hNcFhTd2dZWFJoWXk1bmNsdHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWxkS1Z4dVhHNWNibHh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvclxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSlcbmFuY2hvci5hbGwgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5hbGwpKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5hbGwsIGF0YWMuZ3IpXG5hbmNob3IuYWxsIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9sb2dPRV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjUuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwLCBhdGFjLmdyKVxuYW5jaG9yLnVwIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9sb2dPRV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjUuYmVkcGVcXCkpXG5hbmNob3Iubm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vLCBhdGFjLmdyKVxuYW5jaG9yLm5vIDwtIHBpbnRlcnNlY3QoYW5jaG9yLm5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cblxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfbG9nT0VfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjUuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBhdGFjLmdyKVxuYW5jaG9yLmRvd24gPC0gcGludGVyc2VjdChhbmNob3IuZG93bltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvclxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSlcbmFuY2hvci5hbGwgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5hbGwpKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5hbGwsIGF0YWMuZ3IpXG5hbmNob3IuYWxsIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9sb2dPRV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjUuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwLCBhdGFjLmdyKVxuYW5jaG9yLnVwIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9sb2dPRV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjUuYmVkcGVcXCkpXG5hbmNob3Iubm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vLCBhdGFjLmdyKVxuYW5jaG9yLm5vIDwtIHBpbnRlcnNlY3QoYW5jaG9yLm5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cblxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfbG9nT0VfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjUuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBhdGFjLmdyKVxuYW5jaG9yLmRvd24gPC0gcGludGVyc2VjdChhbmNob3IuZG93bltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\)) %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])


loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_logOE_pe-pe_dTAGvsDMSO_UP_diff0.5.bedpe\))
anchor.up <- (extractAnchor(loop.up))
overlaps <- findOverlaps(anchor.up, atac.gr)
anchor.up <- pintersect(anchor.up[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_logOE_pe-pe_dTAGvsDMSO_NO_diff0.5.bedpe\))
anchor.no <- (extractAnchor(loop.no))
overlaps <- findOverlaps(anchor.no, atac.gr)
anchor.no <- pintersect(anchor.no[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])


loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_logOE_pe-pe_dTAGvsDMSO_DOWN_diff0.5.bedpe\))
anchor.down <- (extractAnchor(loop.down))
overlaps <- findOverlaps(anchor.down, atac.gr)
anchor.down <- pintersect(anchor.down[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJTVlU1T1NVNUhJRXhQVEVGY2JteHZiR0ZFYVhJZ1BDMGdhR1Z5WlNoY0lpNHVMeTR1TDNKbGMzVnNkQzlzYjJ4aFhDSXBYRzVrYVhJdVkzSmxZWFJsS0d4dmJHRkVhWElzSUhOb2IzZFhZWEp1YVc1bmN5QTlJRVpCVEZORkxDQnlaV04xY25OcGRtVWdQU0JVVWxWRktWeHVYRzRqSUZWUVhHNXlaWE4xYkhRZ1BTQnlkVzVNVDB4QktHRnVZMmh2Y2k1MWNDd2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVabmR5YVhSbEtIUmlMQ0JvWlhKbEtHeHZiR0ZFYVhJc0lGd2lURTlNUVY5a1ZFRkhYM1p6WDBSTlUwOWZiRzluVDBWZlpHbG1aakF1TlY5MWNGOXdaUzF3WlV4dmIzQnpYMkYwWVdNdWRITjJYQ0lwTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1WEc0aklFNVBYRzV5WlhOMWJIUWdQU0J5ZFc1TVQweEJLR0Z1WTJodmNpNXVieXdnWVc1amFHOXlMbUZzYkN3Z2JHOXNZVVJDS1Z4dWRHSWdQU0JoYzE5MGFXSmliR1VvY21WemRXeDBLVnh1Wm5keWFYUmxLSFJpTENCb1pYSmxLR3h2YkdGRWFYSXNJRndpVEU5TVFWOWtWRUZIWDNaelgwUk5VMDlmYkc5blQwVmZaR2xtWmpBdU5WOXViMTl3WlMxd1pVeHZiM0J6WDJGMFlXTXVkSE4yWENJcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVhHNGpJRVJQVjA1Y2JuSmxjM1ZzZENBOUlISjFia3hQVEVFb1lXNWphRzl5TG1SdmQyNHNJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYm5SaUlEMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNibVozY21sMFpTaDBZaXdnYUdWeVpTaHNiMnhoUkdseUxDQmNJa3hQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMnh2WjA5RlgyUnBabVl3TGpWZlpHOTNibDl3WlMxd1pVeHZiM0J6WDJGMFlXTXVkSE4yWENJcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVhHNWNiaU1qSXlCSVJVRlVUVUZRWEc1aGJIQm9ZU0E4TFNBd0xqQTFYRzUwWWk1MWNDQThMU0JtY21WaFpDaG9aWEpsS0d4dmJHRkVhWElzSUZ3aVRFOU1RVjlrVkVGSFgzWnpYMFJOVTA5ZmJHOW5UMFZmWkdsbVpqQXVOVjkxY0Y5d1pTMXdaVXh2YjNCelgyRjBZV011ZEhOMlhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1NrZ0pUNGxYRzRnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRndpWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ3aUtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh4Vm1Gc2RXVWdQQ0JoYkhCb1lTa2dKVDRsSUdSd2JIbHlPanBuY205MWNGOWllU2gwWVhKblpYUXBJQ1UrSlZ4dUlDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzUwWWk1dWJ5QThMU0JtY21WaFpDaG9aWEpsS0d4dmJHRkVhWElzSUZ3aVRFOU1RVjlrVkVGSFgzWnpYMFJOVTA5ZmJHOW5UMFZmWkdsbVpqQXVOVjl1YjE5d1pTMXdaVXh2YjNCelgyRjBZV011ZEhOMlhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1NrZ0pUNGxYRzRnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRndpWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ3aUtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh4Vm1Gc2RXVWdQQ0JoYkhCb1lTa2dKVDRsSUdSd2JIbHlPanBuY205MWNGOWllU2gwWVhKblpYUXBJQ1UrSlZ4dUlDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzUwWWk1a2IzZHVJRHd0SUdaeVpXRmtLR2hsY21Vb2JHOXNZVVJwY2l3Z1hDSk1UMHhCWDJSVVFVZGZkbk5mUkUxVFQxOXNiMmRQUlY5a2FXWm1NQzQxWDJSdmQyNWZjR1V0Y0dWTWIyOXdjMTloZEdGakxuUnpkbHdpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0Z5WjJWMElEMGdkRzkxY0hCbGNpaGhiblJwWW05a2VTa3BJQ1UrSlZ4dUlDQm1hV3gwWlhJb2MzUnlYM1J2WDJ4dmQyVnlLR05sYkd4VWVYQmxLU0E5UFNCY0ltVnRZbko1YjI1cFl5QnpkR1Z0SUdObGJHeGNJaWtnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NWWmhiSFZsSUR3Z1lXeHdhR0VwSUNVK0pTQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dVhHNTBaVzF3TG5Wd0lEd3RJSFJpTG5Wd0lDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2IyUmtjMUpoZEdsdktWeHVZMjlzYm1GdFpYTW9kR1Z0Y0M1MWNDa2dQQzBnWXloY0luUmhjbWRsZEZ3aUxDQmNJazlTWDNWd1hDSXBYRzUwWlcxd0xtNXZJRHd0SUhSaUxtNXZJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSFJoY21kbGRDd2diMlJrYzFKaGRHbHZLVnh1WTI5c2JtRnRaWE1vZEdWdGNDNXVieWtnUEMwZ1l5aGNJblJoY21kbGRGd2lMQ0JjSWs5U1gyNXZYQ0lwWEc1MFpXMXdMbVJ2ZDI0Z1BDMGdkR0l1Wkc5M2JpQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHOWtaSE5TWVhScGJ5bGNibU52Ykc1aGJXVnpLSFJsYlhBdVpHOTNiaWtnUEMwZ1l5aGNJblJoY21kbGRGd2lMQ0JjSWs5U1gyUnZkMjVjSWlsY2JseHVYRzUwWlcxd0lEd3RJR1oxYkd4ZmFtOXBiaWhtZFd4c1gycHZhVzRvZEdWdGNDNTFjQ3dnZEdWdGNDNXVieXdnWW5rZ1BTQmpLRndpZEdGeVoyVjBYQ0lwS1N3Z2RHVnRjQzVrYjNkdUxDQmllU0E5SUdNb1hDSjBZWEpuWlhSY0lpa3BJQ1UrSlNCdGRYUmhkR1ZmWVd4c0tINXlaWEJzWVdObFgyNWhLQzRzSURFcEtWeHVYRzVrWVhSaElEd3RJR0Z6TG0xaGRISnBlQ2gwWlcxd1d6STZORjBwWEc1eWIzZHVZVzFsY3loa1lYUmhLU0E4TFNCMFpXMXdKSFJoY21kbGRGeHVYRzVzYVdKeVlYSjVLR05wY21Oc2FYcGxLVnh1WTI5c1gyWjFiaUE4TFNCamIyeHZjbEpoYlhBeUtHTW9iV2x1S0dSaGRHRXBMQ0J0WVhnb1pHRjBZU2twTENCaktGd2lkMmhwZEdWY0lpd2dYQ0p5WldSY0lpa3BYRzVjYmx4dUkyWjJhWHBmYm1KamJIVnpkQ2hrWVhSaExDQnJiV1ZoYm5Nc0lHMWxkR2h2WkNBOUlGd2lkM056WENJcFhHNWNibkFnUEMwZ1NHVmhkRzFoY0NoY2JpQWdaR0YwWVN4Y2JpQWdibUZ0WlNBOUlGd2lUMlJrY3lCU1lYUnBiMXdpTENBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklFNWhiV1VnYjJZZ2RHaGxJR2hsWVhSdFlYQWdiR1ZuWlc1a1hHNGdJR05zZFhOMFpYSmZZMjlzZFcxdWN5QTlJRVpCVEZORkxDQWdJQ0FnSUNBZ0lDQWdJQ01nVW1WdGIzWmxJR052YkhWdGJpQmtaVzVrY205bmNtRnRYRzRnSUhKdmQxOXJiU0E5SURRc0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1JHVm1hVzVsSUhSb1pTQnVkVzFpWlhJZ2IyWWdheTF0WldGdWN5QmpiSFZ6ZEdWeWN5Qm1iM0lnY205M2N5QW9ZV1JxZFhOMElHRnpJRzVsWldSbFpDbGNiaUFnYzJodmQxOXliM2RmWkdWdVpDQTlJRVpCVEZORkxGeHVJQ0JqYjJ3Z1BTQmpiMnhmWm5WdUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUZWelpTQjBhR1VnY21Wa0lHZHlZV1JwWlc1MElHTnZiRzl5SUhOallXeGxYRzRwWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbUZ1WTJodmNreFBURUZmWkZSQlIxOTJjMTlFVFZOUFgyeHZaMDlGWDJScFptWXdMalZmY0dVdGNHVk1iMjl3YzE5eVpXZEJibU5vYjNKQ1lXTnJaM0p2ZFc1a1gyRjBZV05jSWlsY2JtaGxhV2RvZENBOExTQTNYRzUzYVdSMGFDQThMU0F6TGpWY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYmx4dVhHNWNiaU1qSXlCV2FYTjFZV3hwZW1sdVp5QndMWFpoYkhWbElHRnVaQ0JQVWx4dVlXeHdhR0VnUEMwZ01DNHdOVnh1ZEdJdWRYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoc2IyeGhSR2x5TENCY0lreFBURUZmWkZSQlIxOTJjMTlFVFZOUFgyUnBabVl3TGpKZmRYQmZZWFJoWXk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtIUmhjbWRsZENBOUlIUnZkWEJ3WlhJb1lXNTBhV0p2WkhrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIRldZV3gxWlV4dlp5QTlJQzFzYjJjeUtIRldZV3gxWlNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ozSnZkWEFnUFNCY0lsVlFYQ0lwSUNVK0pWeHVJQ0JtYVd4MFpYSW9jM1J5WDNSdlgyeHZkMlZ5S0dObGJHeFVlWEJsS1NBOVBTQmNJbVZ0WW5KNWIyNXBZeUJ6ZEdWdElHTmxiR3hjSWlrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKU0JrY0d4NWNqbzZaM0p2ZFhCZllua29kR0Z5WjJWMEtTQWxQaVZjYmlBZ2MyeHBZMlZmYldsdUtHMWxZVzVTYm1zc0lIZHBkR2hmZEdsbGN5QTlJRVpCVEZORktWeHVkR0l1Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hzYjJ4aFJHbHlMQ0JjSWt4UFRFRmZaRlJCUjE5MmMxOUVUVk5QWDJScFptWXdMakpmYm05ZllYUmhZeTUwYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGV1lXeDFaVXh2WnlBOUlDMXNiMmN5S0hGV1lXeDFaU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjNKdmRYQWdQU0JjSWs1UFhDSXBJQ1UrSlZ4dUlDQm1hV3gwWlhJb2MzUnlYM1J2WDJ4dmQyVnlLR05sYkd4VWVYQmxLU0E5UFNCY0ltVnRZbko1YjI1cFl5QnpkR1Z0SUdObGJHeGNJaWtnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NWWmhiSFZsSUR3Z1lXeHdhR0VwSUNVK0pTQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dWRHSXVaRzkzYmlBOExTQm1jbVZoWkNob1pYSmxLR3h2YkdGRWFYSXNJRndpVEU5TVFWOWtWRUZIWDNaelgwUk5VMDlmWkdsbVpqQXVNbDlrYjNkdVgyRjBZV011ZEhOMlhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeFZtRnNkV1ZNYjJjZ1BTQXRiRzluTWloeFZtRnNkV1VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkeWIzVndJRDBnWENKRVQxZE9YQ0lwSUNVK0pWeHVJQ0JtYVd4MFpYSW9jM1J5WDNSdlgyeHZkMlZ5S0dObGJHeFVlWEJsS1NBOVBTQmNJbVZ0WW5KNWIyNXBZeUJ6ZEdWdElHTmxiR3hjSWlrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKU0JrY0d4NWNqbzZaM0p2ZFhCZllua29kR0Z5WjJWMEtTQWxQaVZjYmlBZ2MyeHBZMlZmYldsdUtHMWxZVzVTYm1zc0lIZHBkR2hmZEdsbGN5QTlJRVpCVEZORktWeHVYRzUwWlcxd0xuVndJRHd0SUhSaUxuVndJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSFJoY21kbGRDd2diMlJrYzFKaGRHbHZMQ0J4Vm1Gc2RXVk1iMmNzSUdkeWIzVndLVnh1ZEdWdGNDNXVieUE4TFNCMFlpNXVieUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJRzlrWkhOU1lYUnBieXdnY1ZaaGJIVmxURzluTENCbmNtOTFjQ2xjYm5SbGJYQXVaRzkzYmlBOExTQjBZaTVrYjNkdUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2IyUmtjMUpoZEdsdkxDQnhWbUZzZFdWTWIyY3NJR2R5YjNWd0tWeHVYRzUwWlcxd0lEd3RJR0pwYm1SZmNtOTNjeWgwWlcxd0xuVndMQ0IwWlcxd0xtUnZkMjRwWEc1Y2JtOXlaR1Z5SUR3dElHTW9LSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1hDSlZVRndpS1NBbFBpVWdZWEp5WVc1blpTaGtaWE5qS0c5a1pITlNZWFJwYnlrcEtTUjBZWEpuWlhRc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNJa1JQVjA1Y0lpa2dKVDRsSUdGeWNtRnVaMlVvWkdWell5aHZaR1J6VW1GMGFXOHBLU2trZEdGeVoyVjBLVnh1ZEdWdGNDUjBZWEpuWlhRZ1BDMGdabUZqZEc5eUtIUmxiWEFrZEdGeVoyVjBMQ0JzWlhabGJITWdQU0J5WlhZb2IzSmtaWElwS1Z4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlIUmhjbWRsZEN3Z1kyOXNiM0lnUFNCeFZtRnNkV1ZNYjJjc0lITnBlbVVnUFNCdlpHUnpVbUYwYVc4cEtTQXJYRzRnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJSFJvWlcxbFgySjNLQ2tnS3lCelkyRnNaVjlqYjJ4dmNsOW5jbUZrYVdWdWRDaHNiM2NnUFNCY0ltSnNkV1ZjSWl3Z2FHbG5hQ0E5SUZ3aWNtVmtYQ0lwSUN0Y2JpQWdiR0ZpY3loNElEMGdUbFZNVEN3Z2VTQTlJRTVWVEV3cElDQXJYRzRnSUhSb1pXMWxLR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3NJQ0FqSUZObGRDQmhlR2x6SUhSbGVIUWdjMmw2WlZ4dUlDQWdJQ0FnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0hOcGVtVWdQU0EyS1N3Z0l5QlRaWFFnWVhocGN5QjBhWFJzWlNCemFYcGxJQ2hwWmlCdWIzUWdjbVZ0YjNabFpDbGNiaUFnSUNBZ0lDQWdiR1ZuWlc1a0xuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9jMmw2WlNBOUlEWXBMQ0FqSUZObGRDQnNaV2RsYm1RZ2RHVjRkQ0J6YVhwbFhHNGdJQ0FnSUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3BJRnh1WEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSmhibU5vYjNKTVQweEJYMlJVUVVkZmRuTmZSRTFUVDE5a2FXWm1NQzR5WDA5U1gzRldZV3gxWlY5eVpXZEJibU5vYjNKQ1lXTnJaM0p2ZFc1a1gyRjBZV05jSWlsY2JtaGxhV2RvZENBOExUTmNibmRwWkhSb0lEd3RJREpjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibHh1WEc1Y2JseHVYRzRqSXlNZ01qUXhNREUxSUZSbGMzUnBibWNnYjI0Z2MzVmljMlYwSUc5bUlHeHZiM0J6WEc1aGJtTm9iM0l1WXpFZ1BDMGdaWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbU5zZFhOMFpYSXhLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNWpNU3dnWVhSaFl5NW5jaWxjYm1GdVkyaHZjaTVqTVNBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWpNVnR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1WEc1aGJtTm9iM0l1WXpJZ1BDMGdaWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbU5zZFhOMFpYSXlLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNWpNaXdnWVhSaFl5NW5jaWxjYm1GdVkyaHZjaTVqTWlBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWpNbHR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1WEc1aGJtTm9iM0l1WXpNZ1BDMGdaWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbU5zZFhOMFpYSXpLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNWpNeXdnWVhSaFl5NW5jaWxjYm1GdVkyaHZjaTVqTXlBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWpNMXR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1WEc1aGJtTm9iM0l1WXpRZ1BDMGdaWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbU5zZFhOMFpYSTBLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNWpOQ3dnWVhSaFl5NW5jaWxjYm1GdVkyaHZjaTVqTkNBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWpORnR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1WEc1aGJtTm9iM0l1WXpVZ1BDMGdaWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbU5zZFhOMFpYSTFLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNWpOU3dnWVhSaFl5NW5jaWxjYm1GdVkyaHZjaTVqTlNBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWpOVnR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1WEc1aGJtTm9iM0l1WXpZZ1BDMGdaWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbU5zZFhOMFpYSTJLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNWpOaXdnWVhSaFl5NW5jaWxjYm1GdVkyaHZjaTVqTmlBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWpObHR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1WEc1aGJtTm9iM0l1WXpjZ1BDMGdaWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbU5zZFhOMFpYSTNLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNWpOeXdnWVhSaFl5NW5jaWxjYm1GdVkyaHZjaTVqTnlBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWpOMXR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1WEc1aGJtTm9iM0l1WXpnZ1BDMGdaWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbU5zZFhOMFpYSTRLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNWpPQ3dnWVhSaFl5NW5jaWxjYm1GdVkyaHZjaTVqT0NBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWpPRnR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1WEc1eVpYTjFiSFFnUFNCeWRXNU1UMHhCS0dGdVkyaHZjaTVqTVN3Z1lXNWphRzl5TG1Gc2JDd2diRzlzWVVSQ0tWeHVkR0l1WXpFZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVYRzV5WlhOMWJIUWdQU0J5ZFc1TVQweEJLR0Z1WTJodmNpNWpNaXdnWVc1amFHOXlMbUZzYkN3Z2JHOXNZVVJDS1Z4dWRHSXVZeklnUFNCaGMxOTBhV0ppYkdVb2NtVnpkV3gwS1Z4dVhHNXlaWE4xYkhRZ1BTQnlkVzVNVDB4QktHRnVZMmh2Y2k1ak15d2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJdVl6TWdQU0JoYzE5MGFXSmliR1VvY21WemRXeDBLVnh1WEc1eVpYTjFiSFFnUFNCeWRXNU1UMHhCS0dGdVkyaHZjaTVqTkN3Z1lXNWphRzl5TG1Gc2JDd2diRzlzWVVSQ0tWeHVkR0l1WXpRZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdVl6VXNJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYm5SaUxtTTFJRDBnWVhOZmRHbGlZbXhsS0hKbGMzVnNkQ2xjYmx4dWNtVnpkV3gwSUQwZ2NuVnVURTlNUVNoaGJtTm9iM0l1WXpZc0lHRnVZMmh2Y2k1aGJHd3NJR3h2YkdGRVFpbGNiblJpTG1NMklEMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNibHh1Y21WemRXeDBJRDBnY25WdVRFOU1RU2hoYm1Ob2IzSXVZemNzSUdGdVkyaHZjaTVoYkd3c0lHeHZiR0ZFUWlsY2JuUmlMbU0zSUQwZ1lYTmZkR2xpWW14bEtISmxjM1ZzZENsY2JseHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdVl6Z3NJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYm5SaUxtTTRJRDBnWVhOZmRHbGlZbXhsS0hKbGMzVnNkQ2xjYmx4dUl5TWpJRWhGUVZSTlFWQmNibUZzY0doaElEd3RJREF1TURWY2JuUmlMbU14SUR3dElIUmlMbU14SUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtIUmhjbWRsZENBOUlIUnZkWEJ3WlhJb1lXNTBhV0p2WkhrcEtTQWxQaVZjYmlBZ1ptbHNkR1Z5S0hOMGNsOTBiMTlzYjNkbGNpaGpaV3hzVkhsd1pTa2dQVDBnWENKbGJXSnllVzl1YVdNZ2MzUmxiU0JqWld4c1hDSXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlVZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGdJSE5zYVdObFgyMXBiaWh0WldGdVVtNXJMQ0IzYVhSb1gzUnBaWE1nUFNCR1FVeFRSU2xjYm5SaUxtTXlJRHd0SUhSaUxtTXlJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwS1NBbFBpVmNiaUFnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYQ0psYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWENJcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVVnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNiblJpTG1NeklEd3RJSFJpTG1NeklDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoY21kbGRDQTlJSFJ2ZFhCd1pYSW9ZVzUwYVdKdlpIa3BLU0FsUGlWY2JpQWdabWxzZEdWeUtITjBjbDkwYjE5c2IzZGxjaWhqWld4c1ZIbHdaU2tnUFQwZ1hDSmxiV0p5ZVc5dWFXTWdjM1JsYlNCalpXeHNYQ0lwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIRldZV3gxWlNBOElHRnNjR2hoS1NBbFBpVWdaSEJzZVhJNk9tZHliM1Z3WDJKNUtIUmhjbWRsZENrZ0pUNGxYRzRnSUhOc2FXTmxYMjFwYmlodFpXRnVVbTVyTENCM2FYUm9YM1JwWlhNZ1BTQkdRVXhUUlNsY2JuUmlMbU0wSUR3dElIUmlMbU0wSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtIUmhjbWRsZENBOUlIUnZkWEJ3WlhJb1lXNTBhV0p2WkhrcEtTQWxQaVZjYmlBZ1ptbHNkR1Z5S0hOMGNsOTBiMTlzYjNkbGNpaGpaV3hzVkhsd1pTa2dQVDBnWENKbGJXSnllVzl1YVdNZ2MzUmxiU0JqWld4c1hDSXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlVZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGdJSE5zYVdObFgyMXBiaWh0WldGdVVtNXJMQ0IzYVhSb1gzUnBaWE1nUFNCR1FVeFRSU2xjYm5SaUxtTTFJRHd0SUhSaUxtTTFJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwS1NBbFBpVmNiaUFnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYQ0psYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWENJcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGdJSE5zYVdObFgyMXBiaWh0WldGdVVtNXJMQ0IzYVhSb1gzUnBaWE1nUFNCR1FVeFRSU2xjYmx4dWRHSXVZellnUEMwZ2RHSXVZellnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2RHRnlaMlYwSUQwZ2RHOTFjSEJsY2loaGJuUnBZbTlrZVNrcElDVStKVnh1SUNCbWFXeDBaWElvYzNSeVgzUnZYMnh2ZDJWeUtHTmxiR3hVZVhCbEtTQTlQU0JjSW1WdFluSjViMjVwWXlCemRHVnRJR05sYkd4Y0lpa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY1ZaaGJIVmxJRHdnWVd4d2FHRXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dVhHNTBZaTVqTnlBOExTQjBZaTVqTnlBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTa2dKVDRsWEc0Z0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ3aVpXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGd2lLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bFhHNGdJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNWNiblJpTG1NNElEd3RJSFJpTG1NNElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoY21kbGRDQTlJSFJ2ZFhCd1pYSW9ZVzUwYVdKdlpIa3BLU0FsUGlWY2JpQWdabWxzZEdWeUtITjBjbDkwYjE5c2IzZGxjaWhqWld4c1ZIbHdaU2tnUFQwZ1hDSmxiV0p5ZVc5dWFXTWdjM1JsYlNCalpXeHNYQ0lwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIRldZV3gxWlNBOElHRnNjR2hoS1NBbFBpVmNiaUFnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNibHh1ZEdWdGNDNWpNU0E4TFNCMFlpNWpNU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJRzlrWkhOU1lYUnBieWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXVZekVwSUR3dElHTW9YQ0owWVhKblpYUmNJaXdnWENKUFVsOWpNVndpS1Z4dWRHVnRjQzVqTWlBOExTQjBZaTVqTWlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUc5a1pITlNZWFJwYnlsY2JtTnZiRzVoYldWektIUmxiWEF1WXpJcElEd3RJR01vWENKMFlYSm5aWFJjSWl3Z1hDSlBVbDlqTWx3aUtWeHVkR1Z0Y0M1ak15QThMU0IwWWk1ak15QWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHOWtaSE5TWVhScGJ5bGNibU52Ykc1aGJXVnpLSFJsYlhBdVl6TXBJRHd0SUdNb1hDSjBZWEpuWlhSY0lpd2dYQ0pQVWw5ak0xd2lLVnh1ZEdWdGNDNWpOQ0E4TFNCMFlpNWpOQ0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJRzlrWkhOU1lYUnBieWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXVZelFwSUR3dElHTW9YQ0owWVhKblpYUmNJaXdnWENKUFVsOWpORndpS1Z4dWRHVnRjQzVqTlNBOExTQjBZaTVqTlNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUc5a1pITlNZWFJwYnlsY2JtTnZiRzVoYldWektIUmxiWEF1WXpVcElEd3RJR01vWENKMFlYSm5aWFJjSWl3Z1hDSlBVbDlqTlZ3aUtWeHVkR1Z0Y0M1ak5pQThMU0IwWWk1ak5pQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHOWtaSE5TWVhScGJ5bGNibU52Ykc1aGJXVnpLSFJsYlhBdVl6WXBJRHd0SUdNb1hDSjBZWEpuWlhSY0lpd2dYQ0pQVWw5ak5sd2lLVnh1ZEdWdGNDNWpOeUE4TFNCMFlpNWpOeUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJRzlrWkhOU1lYUnBieWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXVZemNwSUR3dElHTW9YQ0owWVhKblpYUmNJaXdnWENKUFVsOWpOMXdpS1Z4dWRHVnRjQzVqT0NBOExTQjBZaTVqT0NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUc5a1pITlNZWFJwYnlsY2JtTnZiRzVoYldWektIUmxiWEF1WXpncElEd3RJR01vWENKMFlYSm5aWFJjSWl3Z1hDSlBVbDlqT0Z3aUtWeHVYRzUwWlcxd0lEd3RJR1oxYkd4ZmFtOXBiaWgwWlcxd0xtTXhMQ0IwWlcxd0xtTXlMQ0JpZVNBOUlGd2lkR0Z5WjJWMFhDSXBJQ1UrSlZ4dUlDQm1kV3hzWDJwdmFXNG9kR1Z0Y0M1ak15d2dZbmtnUFNCY0luUmhjbWRsZEZ3aUtTQWxQaVZjYmlBZ1puVnNiRjlxYjJsdUtIUmxiWEF1WXpRc0lHSjVJRDBnWENKMFlYSm5aWFJjSWlrZ0pUNGxYRzRnSUdaMWJHeGZhbTlwYmloMFpXMXdMbU0xTENCaWVTQTlJRndpZEdGeVoyVjBYQ0lwSUNVK0pWeHVJQ0JtZFd4c1gycHZhVzRvZEdWdGNDNWpOaXdnWW5rZ1BTQmNJblJoY21kbGRGd2lLU0FsUGlWY2JpQWdablZzYkY5cWIybHVLSFJsYlhBdVl6Y3NJR0o1SUQwZ1hDSjBZWEpuWlhSY0lpa2dKVDRsWEc0Z0lHWjFiR3hmYW05cGJpaDBaVzF3TG1NNExDQmllU0E5SUZ3aWRHRnlaMlYwWENJcElDVStKVnh1SUNCdGRYUmhkR1ZmWVd4c0tINXlaWEJzWVdObFgyNWhLQzRzSURFcEtWeHVYRzVrWVhSaElEd3RJSFJsYlhBZ0pUNGxJR052YkhWdGJsOTBiMTl5YjNkdVlXMWxjeWhjSW5SaGNtZGxkRndpS1NBbFBpVWdZWE11YldGMGNtbDRLQ2xjYmx4dWJHbGljbUZ5ZVNoamFYSmpiR2w2WlNsY2JtTnZiRjltZFc0Z1BDMGdZMjlzYjNKU1lXMXdNaWhqS0RFc0lHMWhlQ2hrWVhSaEtTa3NJR01vWENKM2FHbDBaVndpTENCY0luSmxaRndpS1NsY2JseHVYRzRqWm5acGVsOXVZbU5zZFhOMEtHUmhkR0VzSUd0dFpXRnVjeXdnYldWMGFHOWtJRDBnWENKM2MzTmNJaWxjYmx4dWNDQThMU0JJWldGMGJXRndLRnh1SUNCa1lYUmhMRnh1SUNCdVlXMWxJRDBnWENKUFpHUnpJRkpoZEdsdlhDSXNJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ01nVG1GdFpTQnZaaUIwYUdVZ2FHVmhkRzFoY0NCc1pXZGxibVJjYmlBZ1kyeDFjM1JsY2w5amIyeDFiVzV6SUQwZ1JrRk1VMFVzSUNBZ0lDQWdJQ0FnSUNBZ0l5QlNaVzF2ZG1VZ1kyOXNkVzF1SUdSbGJtUnliMmR5WVcxY2JpQWdjMmh2ZDE5eWIzZGZaR1Z1WkNBOUlFWkJURk5GTEZ4dUlDQmpiMndnUFNCamIyeGZablZ1TEZ4dUlDQmliM0prWlhJZ1BTQlVVbFZGWEc0cFhHNWNibHh1SXlCSmJtbDBhV0ZzYVhwbElHeHBjM1J6SUhSdklITjBiM0psSUhKbGMzVnNkSE5jYm1GdVkyaHZjbk1nUEMwZ2JHbHpkQ2dwWEc1MFluTWdQQzBnYkdsemRDZ3BYRzUwWlcxd2N5QThMU0JzYVhOMEtDbGNibHh1SXlCUWNtOWpaWE56SUdOc2RYTjBaWEp6SUdNeElIUnZJR000WEc1bWIzSWdLR2tnYVc0Z01UbzBLU0I3WEc0Z0lDTWdSWGgwY21GamRDQmhibU5vYjNKY2JpQWdiRzl2Y0Y5amJIVnpkR1Z5SUR3dElHZGxkQ2h3WVhOMFpUQW9YQ0pzYjI5d0xtTnNkWE4wWlhKY0lpd2dhU2twWEc0Z0lHRnVZMmh2Y2lBOExTQmxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQmZZMngxYzNSbGNpbGNiaUFnWEc0Z0lDTWdSbWx1WkNCdmRtVnliR0Z3Y3lCaGJtUWdhVzUwWlhKelpXTjBYRzRnSUc5MlpYSnNZWEJ6SUR3dElHWnBibVJQZG1WeWJHRndjeWhoYm1Ob2IzSXNJR0YwWVdNdVozSXBYRzRnSUdGdVkyaHZjaUE4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2x0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0hNcFhTd2dZWFJoWXk1bmNsdHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWxkS1Z4dUlDQmNiaUFnSXlCVGRHOXlaU0JoYm1Ob2IzSmNiaUFnWVc1amFHOXljMXRiYVYxZElEd3RJR0Z1WTJodmNseHVJQ0JjYmlBZ0l5QlNkVzRnVEU5TVFWeHVJQ0J5WlhOMWJIUWdQQzBnY25WdVRFOU1RU2hoYm1Ob2IzSXNJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYmlBZ2RHSWdQQzBnWVhOZmRHbGlZbXhsS0hKbGMzVnNkQ2xjYmlBZ1hHNGdJQ01nUm1sc2RHVnlJR0Z1WkNCemRXMXRZWEpwZW1WY2JpQWdkR0lnUEMwZ2RHSWdKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1NrZ0pUNGxYRzRnSUNBZ1ptbHNkR1Z5S0hOMGNsOTBiMTlzYjNkbGNpaGpaV3hzVkhsd1pTa2dQVDBnWENKbGJXSnllVzl1YVdNZ2MzUmxiU0JqWld4c1hDSXBJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcG1hV3gwWlhJb2NWWmhiSFZsSUR3Z1lXeHdhR0VwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanBuY205MWNGOWllU2gwWVhKblpYUXBJQ1UrSlZ4dUlDQWdJSE5zYVdObFgyMXBiaWh0WldGdVVtNXJMQ0IzYVhSb1gzUnBaWE1nUFNCR1FVeFRSU2xjYmlBZ1hHNGdJQ01nVTNSdmNtVWdkR0pjYmlBZ2RHSnpXMXRwWFYwZ1BDMGdkR0pjYmlBZ1hHNGdJQ01nVTJWc1pXTjBJR0Z1WkNCeVpXNWhiV1VnYjJSa2MxSmhkR2x2WEc0Z0lIUmxiWEFnUEMwZ2RHSWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHBYRzRnSUdOdmJHNWhiV1Z6S0hSbGJYQXBJRHd0SUdNb1hDSjBZWEpuWlhSY0lpd2djR0Z6ZEdVd0tGd2lUMUpmWTF3aUxDQnBLU2xjYmlBZ1hHNGdJQ01nVTNSdmNtVWdkR1Z0Y0Z4dUlDQjBaVzF3YzF0YmFWMWRJRHd0SUhSbGJYQmNibjFjYmx4dUl5Qk5aWEpuWlNCaGJHd2dkR1Z0Y0NCMFlXSnNaWE1nYVc1MGJ5QnZibVZjYm5SbGJYQWdQQzBnVW1Wa2RXTmxLR1oxYm1OMGFXOXVLSGdzSUhrcElHWjFiR3hmYW05cGJpaDRMQ0I1TENCaWVTQTlJRndpZEdGeVoyVjBYQ0lwTENCMFpXMXdjeWtnSlQ0bFhHNGdJRzExZEdGMFpWOWhiR3dvZm5KbGNHeGhZMlZmYm1Fb0xpd2dNU2twWEc1a1lYUmhJRHd0SUhSbGJYQWdKVDRsSUdOdmJIVnRibDkwYjE5eWIzZHVZVzFsY3loY0luUmhjbWRsZEZ3aUtTQWxQaVVnWVhNdWJXRjBjbWw0S0NsY2JseHViR2xpY21GeWVTaGphWEpqYkdsNlpTbGNibU52YkY5bWRXNGdQQzBnWTI5c2IzSlNZVzF3TWloaktERXNJRzFoZUNoa1lYUmhLU2tzSUdNb1hDSjNhR2wwWlZ3aUxDQmNJbkpsWkZ3aUtTbGNibHh1WEc0alpuWnBlbDl1WW1Oc2RYTjBLR1JoZEdFc0lHdHRaV0Z1Y3l3Z2JXVjBhRzlrSUQwZ1hDSjNjM05jSWlsY2JseHVjQ0E4TFNCSVpXRjBiV0Z3S0Z4dUlDQmtZWFJoTEZ4dUlDQnVZVzFsSUQwZ1hDSlBaR1J6SUZKaGRHbHZYQ0lzSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1RtRnRaU0J2WmlCMGFHVWdhR1ZoZEcxaGNDQnNaV2RsYm1SY2JpQWdZMngxYzNSbGNsOWpiMngxYlc1eklEMGdSa0ZNVTBVc0lDQWdJQ0FnSUNBZ0lDQWdJeUJTWlcxdmRtVWdZMjlzZFcxdUlHUmxibVJ5YjJkeVlXMWNiaUFnYzJodmQxOXliM2RmWkdWdVpDQTlJRVpCVEZORkxGeHVJQ0JqYjJ3Z1BTQmpiMnhmWm5WdUxGeHVJQ0JpYjNKa1pYSWdQU0JVVWxWRlhHNHBYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbiMgUlVOTklORyBMT0xBXG5sb2xhRGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHQvbG9sYVxcKVxuZGlyLmNyZWF0ZShsb2xhRGlyLCBzaG93V2FybmluZ3MgPSBGQUxTRSwgcmVjdXJzaXZlID0gVFJVRSlcblxuIyBVUFxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IudXAsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfdXBfcGUtcGVMb29wc19hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBOT1xucmVzdWx0ID0gcnVuTE9MQShhbmNob3Iubm8sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfbm9fcGUtcGVMb29wc19hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBET1dOXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5kb3duLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X2Rvd25fcGUtcGVMb29wc19hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuXG4jIyMgSEVBVE1BUFxuYWxwaGEgPC0gMC4wNVxudGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfdXBfcGUtcGVMb29wc19hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfbm9fcGUtcGVMb29wc19hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9kb3duX3BlLXBlTG9vcHNfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAudXApIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl91cFxcKVxudGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAubm8pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9ub1xcKVxudGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmRvd24pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9kb3duXFwpXG5cblxudGVtcCA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAudXAsIHRlbXAubm8sIGJ5ID0gYyhcXHRhcmdldFxcKSksIHRlbXAuZG93biwgYnkgPSBjKFxcdGFyZ2V0XFwpKSAlPiUgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcblxuZGF0YSA8LSBhcy5tYXRyaXgodGVtcFsyOjRdKVxucm93bmFtZXMoZGF0YSkgPC0gdGVtcCR0YXJnZXRcblxubGlicmFyeShjaXJjbGl6ZSlcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKG1pbihkYXRhKSwgbWF4KGRhdGEpKSwgYyhcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5cbiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSBcXHdzc1xcKVxuXG5wIDwtIEhlYXRtYXAoXG4gIGRhdGEsXG4gIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZFxuICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbVxuICByb3dfa20gPSA0LCAgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmluZSB0aGUgbnVtYmVyIG9mIGstbWVhbnMgY2x1c3RlcnMgZm9yIHJvd3MgKGFkanVzdCBhcyBuZWVkZWQpXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1biAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgdGhlIHJlZCBncmFkaWVudCBjb2xvciBzY2FsZVxuKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X3BlLXBlTG9vcHNfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG5oZWlnaHQgPC0gN1xud2lkdGggPC0gMy41XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG4jIyMgVmlzdWFsaXppbmcgcC12YWx1ZSBhbmQgT1JcbmFscGhhIDwtIDAuMDVcbnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3VwX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxVUFxcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxOT1xcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLmRvd24gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfZG93bl9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4gICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiAgICAgICAgICAgICAgICBncm91cCA9IFxcRE9XTlxcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbnRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG50ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcblxudGVtcCA8LSBiaW5kX3Jvd3ModGVtcC51cCwgdGVtcC5kb3duKVxuXG5vcmRlciA8LSBjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcVVBcXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0LCBcbiAgICAgICAgICAgKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxET1dOXFwpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldClcbnRlbXAkdGFyZ2V0IDwtIGZhY3Rvcih0ZW1wJHRhcmdldCwgbGV2ZWxzID0gcmV2KG9yZGVyKSlcbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGNvbG9yID0gcVZhbHVlTG9nLCBzaXplID0gb2Rkc1JhdGlvKSkgK1xuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gXFxibHVlXFwsIGhpZ2ggPSBcXHJlZFxcKSArXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgK1xuICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGF4aXMgdGl0bGUgc2l6ZSAoaWYgbm90IHJlbW92ZWQpXG4gICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcYW5jaG9yTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9PUl9xVmFsdWVfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG5oZWlnaHQgPC0zXG53aWR0aCA8LSAyXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG5cblxuIyMjIDI0MTAxNSBUZXN0aW5nIG9uIHN1YnNldCBvZiBsb29wc1xuYW5jaG9yLmMxIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzEsIGF0YWMuZ3IpXG5hbmNob3IuYzEgPC0gcGludGVyc2VjdChhbmNob3IuYzFbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmMyIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMilcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzIsIGF0YWMuZ3IpXG5hbmNob3IuYzIgPC0gcGludGVyc2VjdChhbmNob3IuYzJbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmMzIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMylcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzMsIGF0YWMuZ3IpXG5hbmNob3IuYzMgPC0gcGludGVyc2VjdChhbmNob3IuYzNbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM0IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNClcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzQsIGF0YWMuZ3IpXG5hbmNob3IuYzQgPC0gcGludGVyc2VjdChhbmNob3IuYzRbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM1IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzUsIGF0YWMuZ3IpXG5hbmNob3IuYzUgPC0gcGludGVyc2VjdChhbmNob3IuYzVbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM2IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNilcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzYsIGF0YWMuZ3IpXG5hbmNob3IuYzYgPC0gcGludGVyc2VjdChhbmNob3IuYzZbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM3IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNylcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzcsIGF0YWMuZ3IpXG5hbmNob3IuYzcgPC0gcGludGVyc2VjdChhbmNob3IuYzdbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM4IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyOClcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzgsIGF0YWMuZ3IpXG5hbmNob3IuYzggPC0gcGludGVyc2VjdChhbmNob3IuYzhbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzEsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmMxID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzIsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmMyID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzMsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmMzID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzQsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmM0ID0gYXNfdGliYmxlKHJlc3VsdClcbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM1LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jNSA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM2LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jNiA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM3LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jNyA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM4LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jOCA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbiMjIyBIRUFUTUFQXG5hbHBoYSA8LSAwLjA1XG50Yi5jMSA8LSB0Yi5jMSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jMiA8LSB0Yi5jMiAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jMyA8LSB0Yi5jMyAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jNCA8LSB0Yi5jNCAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jNSA8LSB0Yi5jNSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lXG4gIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRiLmM2IDwtIHRiLmM2ICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiVcbiAgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGIuYzcgPC0gdGIuYzcgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JVxuICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50Yi5jOCA8LSB0Yi5jOCAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lXG4gIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRlbXAuYzEgPC0gdGIuYzEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmMxKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzFcXClcbnRlbXAuYzIgPC0gdGIuYzIgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmMyKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzJcXClcbnRlbXAuYzMgPC0gdGIuYzMgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmMzKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzNcXClcbnRlbXAuYzQgPC0gdGIuYzQgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM0KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzRcXClcbnRlbXAuYzUgPC0gdGIuYzUgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM1KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzVcXClcbnRlbXAuYzYgPC0gdGIuYzYgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM2KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzZcXClcbnRlbXAuYzcgPC0gdGIuYzcgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM3KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzdcXClcbnRlbXAuYzggPC0gdGIuYzggJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM4KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzhcXClcblxudGVtcCA8LSBmdWxsX2pvaW4odGVtcC5jMSwgdGVtcC5jMiwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgZnVsbF9qb2luKHRlbXAuYzMsIGJ5ID0gXFx0YXJnZXRcXCkgJT4lXG4gIGZ1bGxfam9pbih0ZW1wLmM0LCBieSA9IFxcdGFyZ2V0XFwpICU+JVxuICBmdWxsX2pvaW4odGVtcC5jNSwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgZnVsbF9qb2luKHRlbXAuYzYsIGJ5ID0gXFx0YXJnZXRcXCkgJT4lXG4gIGZ1bGxfam9pbih0ZW1wLmM3LCBieSA9IFxcdGFyZ2V0XFwpICU+JVxuICBmdWxsX2pvaW4odGVtcC5jOCwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcblxuZGF0YSA8LSB0ZW1wICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoXFx0YXJnZXRcXCkgJT4lIGFzLm1hdHJpeCgpXG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygxLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1bixcbiAgYm9yZGVyID0gVFJVRVxuKVxuXG5cbiMgSW5pdGlhbGl6ZSBsaXN0cyB0byBzdG9yZSByZXN1bHRzXG5hbmNob3JzIDwtIGxpc3QoKVxudGJzIDwtIGxpc3QoKVxudGVtcHMgPC0gbGlzdCgpXG5cbiMgUHJvY2VzcyBjbHVzdGVycyBjMSB0byBjOFxuZm9yIChpIGluIDE6NCkge1xuICAjIEV4dHJhY3QgYW5jaG9yXG4gIGxvb3BfY2x1c3RlciA8LSBnZXQocGFzdGUwKFxcbG9vcC5jbHVzdGVyXFwsIGkpKVxuICBhbmNob3IgPC0gZXh0cmFjdEFuY2hvcihsb29wX2NsdXN0ZXIpXG4gIFxuICAjIEZpbmQgb3ZlcmxhcHMgYW5kIGludGVyc2VjdFxuICBvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLCBhdGFjLmdyKVxuICBhbmNob3IgPC0gcGludGVyc2VjdChhbmNob3JbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcbiAgXG4gICMgU3RvcmUgYW5jaG9yXG4gIGFuY2hvcnNbW2ldXSA8LSBhbmNob3JcbiAgXG4gICMgUnVuIExPTEFcbiAgcmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLCBhbmNob3IuYWxsLCBsb2xhREIpXG4gIHRiIDwtIGFzX3RpYmJsZShyZXN1bHQpXG4gIFxuICAjIEZpbHRlciBhbmQgc3VtbWFyaXplXG4gIHRiIDwtIHRiICU+JVxuICAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiVcbiAgICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG4gIFxuICAjIFN0b3JlIHRiXG4gIHRic1tbaV1dIDwtIHRiXG4gIFxuICAjIFNlbGVjdCBhbmQgcmVuYW1lIG9kZHNSYXRpb1xuICB0ZW1wIDwtIHRiICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuICBjb2xuYW1lcyh0ZW1wKSA8LSBjKFxcdGFyZ2V0XFwsIHBhc3RlMChcXE9SX2NcXCwgaSkpXG4gIFxuICAjIFN0b3JlIHRlbXBcbiAgdGVtcHNbW2ldXSA8LSB0ZW1wXG59XG5cbiMgTWVyZ2UgYWxsIHRlbXAgdGFibGVzIGludG8gb25lXG50ZW1wIDwtIFJlZHVjZShmdW5jdGlvbih4LCB5KSBmdWxsX2pvaW4oeCwgeSwgYnkgPSBcXHRhcmdldFxcKSwgdGVtcHMpICU+JVxuICBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKVxuZGF0YSA8LSB0ZW1wICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoXFx0YXJnZXRcXCkgJT4lIGFzLm1hdHJpeCgpXG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygxLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1bixcbiAgYm9yZGVyID0gVFJVRVxuKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# RUNNING LOLA
lolaDir <- here(\../../result/lola\)
dir.create(lolaDir, showWarnings = FALSE, recursive = TRUE)

# UP
result = runLOLA(anchor.up, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_up_pe-peLoops_atac.tsv\), sep = \\t\)

# NO
result = runLOLA(anchor.no, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_no_pe-peLoops_atac.tsv\), sep = \\t\)

# DOWN
result = runLOLA(anchor.down, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_down_pe-peLoops_atac.tsv\), sep = \\t\)


### HEATMAP
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_up_pe-peLoops_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_no_pe-peLoops_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_down_pe-peLoops_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio)
colnames(temp.up) <- c(\target\, \OR_up\)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio)
colnames(temp.no) <- c(\target\, \OR_no\)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio)
colnames(temp.down) <- c(\target\, \OR_down\)


temp <- full_join(full_join(temp.up, temp.no, by = c(\target\)), temp.down, by = c(\target\)) %>% mutate_all(~replace_na(., 1))

data <- as.matrix(temp[2:4])
rownames(data) <- temp$target

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  row_km = 4,                         # Define the number of k-means clusters for rows (adjust as needed)
  show_row_dend = FALSE,
  col = col_fun                       # Use the red gradient color scale
)

fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_logOE_diff0.5_pe-peLoops_regAnchorBackground_atac\)
height <- 7
width <- 3.5
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



### Visualizing p-value and OR
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \UP\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \NO\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \DOWN\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio, qValueLog, group)

temp <- bind_rows(temp.up, temp.down)

order <- c((temp %>% dplyr::filter(group == \UP\) %>% arrange(desc(oddsRatio)))$target, 
           (temp %>% dplyr::filter(group == \DOWN\) %>% arrange(desc(oddsRatio)))$target)
temp$target <- factor(temp$target, levels = rev(order))
p <- ggplot(temp, aes(x = group, y = target, color = qValueLog, size = oddsRatio)) +
  geom_point() + theme_bw() + scale_color_gradient(low = \blue\, high = \red\) +
  labs(x = NULL, y = NULL)  +
  theme(axis.text = element_text(size = 6),  # Set axis text size
        axis.title = element_text(size = 6), # Set axis title size (if not removed)
        legend.text = element_text(size = 6), # Set legend text size
        legend.title = element_text(size = 6)) 

fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_diff0.2_OR_qValue_regAnchorBackground_atac\)
height <-3
width <- 2
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()





### 241015 Testing on subset of loops
anchor.c1 <- extractAnchor(loop.cluster1)
overlaps <- findOverlaps(anchor.c1, atac.gr)
anchor.c1 <- pintersect(anchor.c1[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c2 <- extractAnchor(loop.cluster2)
overlaps <- findOverlaps(anchor.c2, atac.gr)
anchor.c2 <- pintersect(anchor.c2[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c3 <- extractAnchor(loop.cluster3)
overlaps <- findOverlaps(anchor.c3, atac.gr)
anchor.c3 <- pintersect(anchor.c3[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c4 <- extractAnchor(loop.cluster4)
overlaps <- findOverlaps(anchor.c4, atac.gr)
anchor.c4 <- pintersect(anchor.c4[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c5 <- extractAnchor(loop.cluster5)
overlaps <- findOverlaps(anchor.c5, atac.gr)
anchor.c5 <- pintersect(anchor.c5[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c6 <- extractAnchor(loop.cluster6)
overlaps <- findOverlaps(anchor.c6, atac.gr)
anchor.c6 <- pintersect(anchor.c6[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c7 <- extractAnchor(loop.cluster7)
overlaps <- findOverlaps(anchor.c7, atac.gr)
anchor.c7 <- pintersect(anchor.c7[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c8 <- extractAnchor(loop.cluster8)
overlaps <- findOverlaps(anchor.c8, atac.gr)
anchor.c8 <- pintersect(anchor.c8[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

result = runLOLA(anchor.c1, anchor.all, lolaDB)
tb.c1 = as_tibble(result)

result = runLOLA(anchor.c2, anchor.all, lolaDB)
tb.c2 = as_tibble(result)

result = runLOLA(anchor.c3, anchor.all, lolaDB)
tb.c3 = as_tibble(result)

result = runLOLA(anchor.c4, anchor.all, lolaDB)
tb.c4 = as_tibble(result)
result = runLOLA(anchor.c5, anchor.all, lolaDB)
tb.c5 = as_tibble(result)

result = runLOLA(anchor.c6, anchor.all, lolaDB)
tb.c6 = as_tibble(result)

result = runLOLA(anchor.c7, anchor.all, lolaDB)
tb.c7 = as_tibble(result)

result = runLOLA(anchor.c8, anchor.all, lolaDB)
tb.c8 = as_tibble(result)

### HEATMAP
alpha <- 0.05
tb.c1 <- tb.c1 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c2 <- tb.c2 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c3 <- tb.c3 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c4 <- tb.c4 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c5 <- tb.c5 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

tb.c6 <- tb.c6 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

tb.c7 <- tb.c7 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

tb.c8 <- tb.c8 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.c1 <- tb.c1 %>% dplyr::select(target, oddsRatio)
colnames(temp.c1) <- c(\target\, \OR_c1\)
temp.c2 <- tb.c2 %>% dplyr::select(target, oddsRatio)
colnames(temp.c2) <- c(\target\, \OR_c2\)
temp.c3 <- tb.c3 %>% dplyr::select(target, oddsRatio)
colnames(temp.c3) <- c(\target\, \OR_c3\)
temp.c4 <- tb.c4 %>% dplyr::select(target, oddsRatio)
colnames(temp.c4) <- c(\target\, \OR_c4\)
temp.c5 <- tb.c5 %>% dplyr::select(target, oddsRatio)
colnames(temp.c5) <- c(\target\, \OR_c5\)
temp.c6 <- tb.c6 %>% dplyr::select(target, oddsRatio)
colnames(temp.c6) <- c(\target\, \OR_c6\)
temp.c7 <- tb.c7 %>% dplyr::select(target, oddsRatio)
colnames(temp.c7) <- c(\target\, \OR_c7\)
temp.c8 <- tb.c8 %>% dplyr::select(target, oddsRatio)
colnames(temp.c8) <- c(\target\, \OR_c8\)

temp <- full_join(temp.c1, temp.c2, by = \target\) %>%
  full_join(temp.c3, by = \target\) %>%
  full_join(temp.c4, by = \target\) %>%
  full_join(temp.c5, by = \target\) %>%
  full_join(temp.c6, by = \target\) %>%
  full_join(temp.c7, by = \target\) %>%
  full_join(temp.c8, by = \target\) %>%
  mutate_all(~replace_na(., 1))

data <- temp %>% column_to_rownames(\target\) %>% as.matrix()

library(circlize)
col_fun <- colorRamp2(c(1, max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)


# Initialize lists to store results
anchors <- list()
tbs <- list()
temps <- list()

# Process clusters c1 to c8
for (i in 1:4) {
  # Extract anchor
  loop_cluster <- get(paste0(\loop.cluster\, i))
  anchor <- extractAnchor(loop_cluster)
  
  # Find overlaps and intersect
  overlaps <- findOverlaps(anchor, atac.gr)
  anchor <- pintersect(anchor[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])
  
  # Store anchor
  anchors[[i]] <- anchor
  
  # Run LOLA
  result <- runLOLA(anchor, anchor.all, lolaDB)
  tb <- as_tibble(result)
  
  # Filter and summarize
  tb <- tb %>%
    dplyr::mutate(target = toupper(antibody)) %>%
    filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
    dplyr::filter(qValue < alpha) %>%
    dplyr::group_by(target) %>%
    slice_min(meanRnk, with_ties = FALSE)
  
  # Store tb
  tbs[[i]] <- tb
  
  # Select and rename oddsRatio
  temp <- tb %>% dplyr::select(target, oddsRatio)
  colnames(temp) <- c(\target\, paste0(\OR_c\, i))
  
  # Store temp
  temps[[i]] <- temp
}

# Merge all temp tables into one
temp <- Reduce(function(x, y) full_join(x, y, by = \target\), temps) %>%
  mutate_all(~replace_na(., 1))
data <- temp %>% column_to_rownames(\target\) %>% as.matrix()

library(circlize)
col_fun <- colorRamp2(c(1, max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QlNWVTVPU1U1SElFeFBURUZjYm14dmJHRkVhWElnUEMwZ2FHVnlaU2hjWEM0dUx5NHVMM0psYzNWc2RDOXNiMnhoWEZ3cFhHNWthWEl1WTNKbFlYUmxLR3h2YkdGRWFYSXNJSE5vYjNkWFlYSnVhVzVuY3lBOUlFWkJURk5GTENCeVpXTjFjbk5wZG1VZ1BTQlVVbFZGS1Z4dVhHNGpJRlZRWEc1eVpYTjFiSFFnUFNCeWRXNU1UMHhCS0dGdVkyaHZjaTUxY0N3Z1lXNWphRzl5TG1Gc2JDd2diRzlzWVVSQ0tWeHVkR0lnUFNCaGMxOTBhV0ppYkdVb2NtVnpkV3gwS1Z4dVpuZHlhWFJsS0hSaUxDQm9aWEpsS0d4dmJHRkVhWElzSUZ4Y1RFOU1RVjlrVkVGSFgzWnpYMFJOVTA5ZmJHOW5UMFZmWkdsbVpqQXVOVjkxY0Y5d1pTMXdaVXh2YjNCelgyRjBZV011ZEhOMlhGd3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVYRzRqSUU1UFhHNXlaWE4xYkhRZ1BTQnlkVzVNVDB4QktHRnVZMmh2Y2k1dWJ5d2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVabmR5YVhSbEtIUmlMQ0JvWlhKbEtHeHZiR0ZFYVhJc0lGeGNURTlNUVY5a1ZFRkhYM1p6WDBSTlUwOWZiRzluVDBWZlpHbG1aakF1TlY5dWIxOXdaUzF3WlV4dmIzQnpYMkYwWVdNdWRITjJYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1WEc0aklFUlBWMDVjYm5KbGMzVnNkQ0E5SUhKMWJreFBURUVvWVc1amFHOXlMbVJ2ZDI0c0lHRnVZMmh2Y2k1aGJHd3NJR3h2YkdGRVFpbGNiblJpSUQwZ1lYTmZkR2xpWW14bEtISmxjM1ZzZENsY2JtWjNjbWwwWlNoMFlpd2dhR1Z5WlNoc2IyeGhSR2x5TENCY1hFeFBURUZmWkZSQlIxOTJjMTlFVFZOUFgyeHZaMDlGWDJScFptWXdMalZmWkc5M2JsOXdaUzF3WlV4dmIzQnpYMkYwWVdNdWRITjJYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1WEc1Y2JpTWpJeUJJUlVGVVRVRlFYRzVoYkhCb1lTQThMU0F3TGpBMVhHNTBZaTUxY0NBOExTQm1jbVZoWkNob1pYSmxLR3h2YkdGRWFYSXNJRnhjVEU5TVFWOWtWRUZIWDNaelgwUk5VMDlmYkc5blQwVmZaR2xtWmpBdU5WOTFjRjl3WlMxd1pVeHZiM0J6WDJGMFlXTXVkSE4yWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU2tnSlQ0bFhHNGdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGeGNaVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRnhjS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaHhWbUZzZFdVZ1BDQmhiSEJvWVNrZ0pUNGxJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNTBZaTV1YnlBOExTQm1jbVZoWkNob1pYSmxLR3h2YkdGRWFYSXNJRnhjVEU5TVFWOWtWRUZIWDNaelgwUk5VMDlmYkc5blQwVmZaR2xtWmpBdU5WOXViMTl3WlMxd1pVeHZiM0J6WDJGMFlXTXVkSE4yWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU2tnSlQ0bFhHNGdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGeGNaVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRnhjS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaHhWbUZzZFdVZ1BDQmhiSEJvWVNrZ0pUNGxJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNTBZaTVrYjNkdUlEd3RJR1p5WldGa0tHaGxjbVVvYkc5c1lVUnBjaXdnWEZ4TVQweEJYMlJVUVVkZmRuTmZSRTFUVDE5c2IyZFBSVjlrYVdabU1DNDFYMlJ2ZDI1ZmNHVXRjR1ZNYjI5d2MxOWhkR0ZqTG5SemRseGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2RHRnlaMlYwSUQwZ2RHOTFjSEJsY2loaGJuUnBZbTlrZVNrcElDVStKVnh1SUNCbWFXeDBaWElvYzNSeVgzUnZYMnh2ZDJWeUtHTmxiR3hVZVhCbEtTQTlQU0JjWEdWdFluSjViMjVwWXlCemRHVnRJR05sYkd4Y1hDa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY1ZaaGJIVmxJRHdnWVd4d2FHRXBJQ1UrSlNCa2NHeDVjam82WjNKdmRYQmZZbmtvZEdGeVoyVjBLU0FsUGlWY2JpQWdjMnhwWTJWZmJXbHVLRzFsWVc1U2Jtc3NJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLVnh1WEc1MFpXMXdMblZ3SUR3dElIUmlMblZ3SUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYjJSa2MxSmhkR2x2S1Z4dVkyOXNibUZ0WlhNb2RHVnRjQzUxY0NrZ1BDMGdZeWhjWEhSaGNtZGxkRnhjTENCY1hFOVNYM1Z3WEZ3cFhHNTBaVzF3TG01dklEd3RJSFJpTG01dklDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2IyUmtjMUpoZEdsdktWeHVZMjlzYm1GdFpYTW9kR1Z0Y0M1dWJ5a2dQQzBnWXloY1hIUmhjbWRsZEZ4Y0xDQmNYRTlTWDI1dlhGd3BYRzUwWlcxd0xtUnZkMjRnUEMwZ2RHSXVaRzkzYmlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUc5a1pITlNZWFJwYnlsY2JtTnZiRzVoYldWektIUmxiWEF1Wkc5M2Jpa2dQQzBnWXloY1hIUmhjbWRsZEZ4Y0xDQmNYRTlTWDJSdmQyNWNYQ2xjYmx4dVhHNTBaVzF3SUR3dElHWjFiR3hmYW05cGJpaG1kV3hzWDJwdmFXNG9kR1Z0Y0M1MWNDd2dkR1Z0Y0M1dWJ5d2dZbmtnUFNCaktGeGNkR0Z5WjJWMFhGd3BLU3dnZEdWdGNDNWtiM2R1TENCaWVTQTlJR01vWEZ4MFlYSm5aWFJjWENrcElDVStKU0J0ZFhSaGRHVmZZV3hzS0g1eVpYQnNZV05sWDI1aEtDNHNJREVwS1Z4dVhHNWtZWFJoSUR3dElHRnpMbTFoZEhKcGVDaDBaVzF3V3pJNk5GMHBYRzV5YjNkdVlXMWxjeWhrWVhSaEtTQThMU0IwWlcxd0pIUmhjbWRsZEZ4dVhHNXNhV0p5WVhKNUtHTnBjbU5zYVhwbEtWeHVZMjlzWDJaMWJpQThMU0JqYjJ4dmNsSmhiWEF5S0dNb2JXbHVLR1JoZEdFcExDQnRZWGdvWkdGMFlTa3BMQ0JqS0Z4Y2QyaHBkR1ZjWEN3Z1hGeHlaV1JjWENrcFhHNWNibHh1STJaMmFYcGZibUpqYkhWemRDaGtZWFJoTENCcmJXVmhibk1zSUcxbGRHaHZaQ0E5SUZ4Y2QzTnpYRndwWEc1Y2JuQWdQQzBnU0dWaGRHMWhjQ2hjYmlBZ1pHRjBZU3hjYmlBZ2JtRnRaU0E5SUZ4Y1QyUmtjeUJTWVhScGIxeGNMQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUU1aGJXVWdiMllnZEdobElHaGxZWFJ0WVhBZ2JHVm5aVzVrWEc0Z0lHTnNkWE4wWlhKZlkyOXNkVzF1Y3lBOUlFWkJURk5GTENBZ0lDQWdJQ0FnSUNBZ0lDTWdVbVZ0YjNabElHTnZiSFZ0YmlCa1pXNWtjbTluY21GdFhHNGdJSEp2ZDE5cmJTQTlJRFFzSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ01nUkdWbWFXNWxJSFJvWlNCdWRXMWlaWElnYjJZZ2F5MXRaV0Z1Y3lCamJIVnpkR1Z5Y3lCbWIzSWdjbTkzY3lBb1lXUnFkWE4wSUdGeklHNWxaV1JsWkNsY2JpQWdjMmh2ZDE5eWIzZGZaR1Z1WkNBOUlFWkJURk5GTEZ4dUlDQmpiMndnUFNCamIyeGZablZ1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpJRlZ6WlNCMGFHVWdjbVZrSUdkeVlXUnBaVzUwSUdOdmJHOXlJSE5qWVd4bFhHNHBYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hHRnVZMmh2Y2t4UFRFRmZaRlJCUjE5MmMxOUVUVk5QWDJ4dlowOUZYMlJwWm1Zd0xqVmZjR1V0Y0dWTWIyOXdjMTl5WldkQmJtTm9iM0pDWVdOclozSnZkVzVrWDJGMFlXTmNYQ2xjYm1obGFXZG9kQ0E4TFNBM1hHNTNhV1IwYUNBOExTQXpMalZjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibHh1WEc1Y2JpTWpJeUJXYVhOMVlXeHBlbWx1WnlCd0xYWmhiSFZsSUdGdVpDQlBVbHh1WVd4d2FHRWdQQzBnTUM0d05WeHVkR0l1ZFhBZ1BDMGdabkpsWVdRb2FHVnlaU2hzYjJ4aFJHbHlMQ0JjWEV4UFRFRmZaRlJCUjE5MmMxOUVUVk5QWDJScFptWXdMakpmZFhCZllYUmhZeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGV1lXeDFaVXh2WnlBOUlDMXNiMmN5S0hGV1lXeDFaU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjNKdmRYQWdQU0JjWEZWUVhGd3BJQ1UrSlZ4dUlDQm1hV3gwWlhJb2MzUnlYM1J2WDJ4dmQyVnlLR05sYkd4VWVYQmxLU0E5UFNCY1hHVnRZbko1YjI1cFl5QnpkR1Z0SUdObGJHeGNYQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NWWmhiSFZsSUR3Z1lXeHdhR0VwSUNVK0pTQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dWRHSXVibThnUEMwZ1puSmxZV1FvYUdWeVpTaHNiMnhoUkdseUxDQmNYRXhQVEVGZlpGUkJSMTkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZibTlmWVhSaFl5NTBjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoY21kbGRDQTlJSFJ2ZFhCd1pYSW9ZVzUwYVdKdlpIa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEZXWVd4MVpVeHZaeUE5SUMxc2IyY3lLSEZXWVd4MVpTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaM0p2ZFhBZ1BTQmNYRTVQWEZ3cElDVStKVnh1SUNCbWFXeDBaWElvYzNSeVgzUnZYMnh2ZDJWeUtHTmxiR3hVZVhCbEtTQTlQU0JjWEdWdFluSjViMjVwWXlCemRHVnRJR05sYkd4Y1hDa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY1ZaaGJIVmxJRHdnWVd4d2FHRXBJQ1UrSlNCa2NHeDVjam82WjNKdmRYQmZZbmtvZEdGeVoyVjBLU0FsUGlWY2JpQWdjMnhwWTJWZmJXbHVLRzFsWVc1U2Jtc3NJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLVnh1ZEdJdVpHOTNiaUE4TFNCbWNtVmhaQ2hvWlhKbEtHeHZiR0ZFYVhJc0lGeGNURTlNUVY5a1ZFRkhYM1p6WDBSTlUwOWZaR2xtWmpBdU1sOWtiM2R1WDJGMFlXTXVkSE4yWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J4Vm1Gc2RXVk1iMmNnUFNBdGJHOW5NaWh4Vm1Gc2RXVXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2R5YjNWd0lEMGdYRnhFVDFkT1hGd3BJQ1UrSlZ4dUlDQm1hV3gwWlhJb2MzUnlYM1J2WDJ4dmQyVnlLR05sYkd4VWVYQmxLU0E5UFNCY1hHVnRZbko1YjI1cFl5QnpkR1Z0SUdObGJHeGNYQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NWWmhiSFZsSUR3Z1lXeHdhR0VwSUNVK0pTQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dVhHNTBaVzF3TG5Wd0lEd3RJSFJpTG5Wd0lDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2IyUmtjMUpoZEdsdkxDQnhWbUZzZFdWTWIyY3NJR2R5YjNWd0tWeHVkR1Z0Y0M1dWJ5QThMU0IwWWk1dWJ5QWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHOWtaSE5TWVhScGJ5d2djVlpoYkhWbFRHOW5MQ0JuY205MWNDbGNiblJsYlhBdVpHOTNiaUE4TFNCMFlpNWtiM2R1SUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYjJSa2MxSmhkR2x2TENCeFZtRnNkV1ZNYjJjc0lHZHliM1Z3S1Z4dVhHNTBaVzF3SUR3dElHSnBibVJmY205M2N5aDBaVzF3TG5Wd0xDQjBaVzF3TG1SdmQyNHBYRzVjYm05eVpHVnlJRHd0SUdNb0tIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWEZ4VlVGeGNLU0FsUGlVZ1lYSnlZVzVuWlNoa1pYTmpLRzlrWkhOU1lYUnBieWtwS1NSMFlYSm5aWFFzSUZ4dUlDQWdJQ0FnSUNBZ0lDQW9kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY1hFUlBWMDVjWENrZ0pUNGxJR0Z5Y21GdVoyVW9aR1Z6WXlodlpHUnpVbUYwYVc4cEtTa2tkR0Z5WjJWMEtWeHVkR1Z0Y0NSMFlYSm5aWFFnUEMwZ1ptRmpkRzl5S0hSbGJYQWtkR0Z5WjJWMExDQnNaWFpsYkhNZ1BTQnlaWFlvYjNKa1pYSXBLVnh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUhSaGNtZGxkQ3dnWTI5c2IzSWdQU0J4Vm1Gc2RXVk1iMmNzSUhOcGVtVWdQU0J2WkdSelVtRjBhVzhwS1NBclhHNGdJR2RsYjIxZmNHOXBiblFvS1NBcklIUm9aVzFsWDJKM0tDa2dLeUJ6WTJGc1pWOWpiMnh2Y2w5bmNtRmthV1Z1ZENoc2IzY2dQU0JjWEdKc2RXVmNYQ3dnYUdsbmFDQTlJRnhjY21Wa1hGd3BJQ3RjYmlBZ2JHRmljeWg0SUQwZ1RsVk1UQ3dnZVNBOUlFNVZURXdwSUNBclhHNGdJSFJvWlcxbEtHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTmlrc0lDQWpJRk5sZENCaGVHbHpJSFJsZUhRZ2MybDZaVnh1SUNBZ0lDQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTJLU3dnSXlCVFpYUWdZWGhwY3lCMGFYUnNaU0J6YVhwbElDaHBaaUJ1YjNRZ2NtVnRiM1psWkNsY2JpQWdJQ0FnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb2MybDZaU0E5SURZcExDQWpJRk5sZENCc1pXZGxibVFnZEdWNGRDQnphWHBsWEc0Z0lDQWdJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTmlrcElGeHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4aGJtTm9iM0pNVDB4QlgyUlVRVWRmZG5OZlJFMVRUMTlrYVdabU1DNHlYMDlTWDNGV1lXeDFaVjl5WldkQmJtTm9iM0pDWVdOclozSnZkVzVrWDJGMFlXTmNYQ2xjYm1obGFXZG9kQ0E4TFROY2JuZHBaSFJvSUR3dElESmNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JseHVYRzVjYmx4dVhHNGpJeU1nTWpReE1ERTFJRlJsYzNScGJtY2diMjRnYzNWaWMyVjBJRzltSUd4dmIzQnpYRzVoYm1Ob2IzSXVZekVnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtTnNkWE4wWlhJeEtWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1ak1Td2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNWpNU0E4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1ak1WdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVoYm1Ob2IzSXVZeklnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtTnNkWE4wWlhJeUtWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1ak1pd2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNWpNaUE4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1ak1sdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVoYm1Ob2IzSXVZek1nUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtTnNkWE4wWlhJektWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1ak15d2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNWpNeUE4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1ak0xdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVoYm1Ob2IzSXVZelFnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtTnNkWE4wWlhJMEtWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1ak5Dd2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNWpOQ0E4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1ak5GdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVoYm1Ob2IzSXVZelVnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtTnNkWE4wWlhJMUtWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1ak5Td2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNWpOU0E4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1ak5WdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVoYm1Ob2IzSXVZellnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtTnNkWE4wWlhJMktWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1ak5pd2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNWpOaUE4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1ak5sdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVoYm1Ob2IzSXVZemNnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtTnNkWE4wWlhJM0tWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1ak55d2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNWpOeUE4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1ak4xdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVoYm1Ob2IzSXVZemdnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtTnNkWE4wWlhJNEtWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1ak9Dd2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNWpPQ0E4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1ak9GdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzV5WlhOMWJIUWdQU0J5ZFc1TVQweEJLR0Z1WTJodmNpNWpNU3dnWVc1amFHOXlMbUZzYkN3Z2JHOXNZVVJDS1Z4dWRHSXVZekVnUFNCaGMxOTBhV0ppYkdVb2NtVnpkV3gwS1Z4dVhHNXlaWE4xYkhRZ1BTQnlkVzVNVDB4QktHRnVZMmh2Y2k1ak1pd2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJdVl6SWdQU0JoYzE5MGFXSmliR1VvY21WemRXeDBLVnh1WEc1eVpYTjFiSFFnUFNCeWRXNU1UMHhCS0dGdVkyaHZjaTVqTXl3Z1lXNWphRzl5TG1Gc2JDd2diRzlzWVVSQ0tWeHVkR0l1WXpNZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVYRzV5WlhOMWJIUWdQU0J5ZFc1TVQweEJLR0Z1WTJodmNpNWpOQ3dnWVc1amFHOXlMbUZzYkN3Z2JHOXNZVVJDS1Z4dWRHSXVZelFnUFNCaGMxOTBhV0ppYkdVb2NtVnpkV3gwS1Z4dWNtVnpkV3gwSUQwZ2NuVnVURTlNUVNoaGJtTm9iM0l1WXpVc0lHRnVZMmh2Y2k1aGJHd3NJR3h2YkdGRVFpbGNiblJpTG1NMUlEMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNibHh1Y21WemRXeDBJRDBnY25WdVRFOU1RU2hoYm1Ob2IzSXVZellzSUdGdVkyaHZjaTVoYkd3c0lHeHZiR0ZFUWlsY2JuUmlMbU0ySUQwZ1lYTmZkR2xpWW14bEtISmxjM1ZzZENsY2JseHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdVl6Y3NJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYm5SaUxtTTNJRDBnWVhOZmRHbGlZbXhsS0hKbGMzVnNkQ2xjYmx4dWNtVnpkV3gwSUQwZ2NuVnVURTlNUVNoaGJtTm9iM0l1WXpnc0lHRnVZMmh2Y2k1aGJHd3NJR3h2YkdGRVFpbGNiblJpTG1NNElEMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNibHh1SXlNaklFaEZRVlJOUVZCY2JtRnNjR2hoSUR3dElEQXVNRFZjYm5SaUxtTXhJRHd0SUhSaUxtTXhJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwS1NBbFBpVmNiaUFnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYRnhsYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWEZ3cElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVVnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNiblJpTG1NeUlEd3RJSFJpTG1NeUlDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoY21kbGRDQTlJSFJ2ZFhCd1pYSW9ZVzUwYVdKdlpIa3BLU0FsUGlWY2JpQWdabWxzZEdWeUtITjBjbDkwYjE5c2IzZGxjaWhqWld4c1ZIbHdaU2tnUFQwZ1hGeGxiV0p5ZVc5dWFXTWdjM1JsYlNCalpXeHNYRndwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIRldZV3gxWlNBOElHRnNjR2hoS1NBbFBpVWdaSEJzZVhJNk9tZHliM1Z3WDJKNUtIUmhjbWRsZENrZ0pUNGxYRzRnSUhOc2FXTmxYMjFwYmlodFpXRnVVbTVyTENCM2FYUm9YM1JwWlhNZ1BTQkdRVXhUUlNsY2JuUmlMbU16SUR3dElIUmlMbU16SUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtIUmhjbWRsZENBOUlIUnZkWEJ3WlhJb1lXNTBhV0p2WkhrcEtTQWxQaVZjYmlBZ1ptbHNkR1Z5S0hOMGNsOTBiMTlzYjNkbGNpaGpaV3hzVkhsd1pTa2dQVDBnWEZ4bGJXSnllVzl1YVdNZ2MzUmxiU0JqWld4c1hGd3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlVZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGdJSE5zYVdObFgyMXBiaWh0WldGdVVtNXJMQ0IzYVhSb1gzUnBaWE1nUFNCR1FVeFRSU2xjYm5SaUxtTTBJRHd0SUhSaUxtTTBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwS1NBbFBpVmNiaUFnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYRnhsYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWEZ3cElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVVnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNiblJpTG1NMUlEd3RJSFJpTG1NMUlDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoY21kbGRDQTlJSFJ2ZFhCd1pYSW9ZVzUwYVdKdlpIa3BLU0FsUGlWY2JpQWdabWxzZEdWeUtITjBjbDkwYjE5c2IzZGxjaWhqWld4c1ZIbHdaU2tnUFQwZ1hGeGxiV0p5ZVc5dWFXTWdjM1JsYlNCalpXeHNYRndwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIRldZV3gxWlNBOElHRnNjR2hoS1NBbFBpVmNiaUFnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNibHh1ZEdJdVl6WWdQQzBnZEdJdVl6WWdKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvZEdGeVoyVjBJRDBnZEc5MWNIQmxjaWhoYm5ScFltOWtlU2twSUNVK0pWeHVJQ0JtYVd4MFpYSW9jM1J5WDNSdlgyeHZkMlZ5S0dObGJHeFVlWEJsS1NBOVBTQmNYR1Z0WW5KNWIyNXBZeUJ6ZEdWdElHTmxiR3hjWENrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKVnh1SUNCa2NHeDVjam82WjNKdmRYQmZZbmtvZEdGeVoyVjBLU0FsUGlWY2JpQWdjMnhwWTJWZmJXbHVLRzFsWVc1U2Jtc3NJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLVnh1WEc1MFlpNWpOeUE4TFNCMFlpNWpOeUFsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1NrZ0pUNGxYRzRnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRnhjWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ4Y0tTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh4Vm1Gc2RXVWdQQ0JoYkhCb1lTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbmNtOTFjRjlpZVNoMFlYSm5aWFFwSUNVK0pWeHVJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc1Y2JuUmlMbU00SUR3dElIUmlMbU00SUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtIUmhjbWRsZENBOUlIUnZkWEJ3WlhJb1lXNTBhV0p2WkhrcEtTQWxQaVZjYmlBZ1ptbHNkR1Z5S0hOMGNsOTBiMTlzYjNkbGNpaGpaV3hzVkhsd1pTa2dQVDBnWEZ4bGJXSnllVzl1YVdNZ2MzUmxiU0JqWld4c1hGd3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlWY2JpQWdaSEJzZVhJNk9tZHliM1Z3WDJKNUtIUmhjbWRsZENrZ0pUNGxYRzRnSUhOc2FXTmxYMjFwYmlodFpXRnVVbTVyTENCM2FYUm9YM1JwWlhNZ1BTQkdRVXhUUlNsY2JseHVkR1Z0Y0M1ak1TQThMU0IwWWk1ak1TQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHOWtaSE5TWVhScGJ5bGNibU52Ykc1aGJXVnpLSFJsYlhBdVl6RXBJRHd0SUdNb1hGeDBZWEpuWlhSY1hDd2dYRnhQVWw5ak1WeGNLVnh1ZEdWdGNDNWpNaUE4TFNCMFlpNWpNaUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJRzlrWkhOU1lYUnBieWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXVZeklwSUR3dElHTW9YRngwWVhKblpYUmNYQ3dnWEZ4UFVsOWpNbHhjS1Z4dWRHVnRjQzVqTXlBOExTQjBZaTVqTXlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUc5a1pITlNZWFJwYnlsY2JtTnZiRzVoYldWektIUmxiWEF1WXpNcElEd3RJR01vWEZ4MFlYSm5aWFJjWEN3Z1hGeFBVbDlqTTF4Y0tWeHVkR1Z0Y0M1ak5DQThMU0IwWWk1ak5DQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHOWtaSE5TWVhScGJ5bGNibU52Ykc1aGJXVnpLSFJsYlhBdVl6UXBJRHd0SUdNb1hGeDBZWEpuWlhSY1hDd2dYRnhQVWw5ak5GeGNLVnh1ZEdWdGNDNWpOU0E4TFNCMFlpNWpOU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJRzlrWkhOU1lYUnBieWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXVZelVwSUR3dElHTW9YRngwWVhKblpYUmNYQ3dnWEZ4UFVsOWpOVnhjS1Z4dWRHVnRjQzVqTmlBOExTQjBZaTVqTmlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUc5a1pITlNZWFJwYnlsY2JtTnZiRzVoYldWektIUmxiWEF1WXpZcElEd3RJR01vWEZ4MFlYSm5aWFJjWEN3Z1hGeFBVbDlqTmx4Y0tWeHVkR1Z0Y0M1ak55QThMU0IwWWk1ak55QWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHOWtaSE5TWVhScGJ5bGNibU52Ykc1aGJXVnpLSFJsYlhBdVl6Y3BJRHd0SUdNb1hGeDBZWEpuWlhSY1hDd2dYRnhQVWw5ak4xeGNLVnh1ZEdWdGNDNWpPQ0E4TFNCMFlpNWpPQ0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJRzlrWkhOU1lYUnBieWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXVZemdwSUR3dElHTW9YRngwWVhKblpYUmNYQ3dnWEZ4UFVsOWpPRnhjS1Z4dVhHNTBaVzF3SUR3dElHWjFiR3hmYW05cGJpaDBaVzF3TG1NeExDQjBaVzF3TG1NeUxDQmllU0E5SUZ4Y2RHRnlaMlYwWEZ3cElDVStKVnh1SUNCbWRXeHNYMnB2YVc0b2RHVnRjQzVqTXl3Z1lua2dQU0JjWEhSaGNtZGxkRnhjS1NBbFBpVmNiaUFnWm5Wc2JGOXFiMmx1S0hSbGJYQXVZelFzSUdKNUlEMGdYRngwWVhKblpYUmNYQ2tnSlQ0bFhHNGdJR1oxYkd4ZmFtOXBiaWgwWlcxd0xtTTFMQ0JpZVNBOUlGeGNkR0Z5WjJWMFhGd3BJQ1UrSlZ4dUlDQm1kV3hzWDJwdmFXNG9kR1Z0Y0M1ak5pd2dZbmtnUFNCY1hIUmhjbWRsZEZ4Y0tTQWxQaVZjYmlBZ1puVnNiRjlxYjJsdUtIUmxiWEF1WXpjc0lHSjVJRDBnWEZ4MFlYSm5aWFJjWENrZ0pUNGxYRzRnSUdaMWJHeGZhbTlwYmloMFpXMXdMbU00TENCaWVTQTlJRnhjZEdGeVoyVjBYRndwSUNVK0pWeHVJQ0J0ZFhSaGRHVmZZV3hzS0g1eVpYQnNZV05sWDI1aEtDNHNJREVwS1Z4dVhHNWtZWFJoSUR3dElIUmxiWEFnSlQ0bElHTnZiSFZ0Ymw5MGIxOXliM2R1WVcxbGN5aGNYSFJoY21kbGRGeGNLU0FsUGlVZ1lYTXViV0YwY21sNEtDbGNibHh1YkdsaWNtRnllU2hqYVhKamJHbDZaU2xjYm1OdmJGOW1kVzRnUEMwZ1kyOXNiM0pTWVcxd01paGpLREVzSUcxaGVDaGtZWFJoS1Nrc0lHTW9YRngzYUdsMFpWeGNMQ0JjWEhKbFpGeGNLU2xjYmx4dVhHNGpablpwZWw5dVltTnNkWE4wS0dSaGRHRXNJR3R0WldGdWN5d2diV1YwYUc5a0lEMGdYRngzYzNOY1hDbGNibHh1Y0NBOExTQklaV0YwYldGd0tGeHVJQ0JrWVhSaExGeHVJQ0J1WVcxbElEMGdYRnhQWkdSeklGSmhkR2x2WEZ3c0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDTWdUbUZ0WlNCdlppQjBhR1VnYUdWaGRHMWhjQ0JzWldkbGJtUmNiaUFnWTJ4MWMzUmxjbDlqYjJ4MWJXNXpJRDBnUmtGTVUwVXNJQ0FnSUNBZ0lDQWdJQ0FnSXlCU1pXMXZkbVVnWTI5c2RXMXVJR1JsYm1SeWIyZHlZVzFjYmlBZ2MyaHZkMTl5YjNkZlpHVnVaQ0E5SUVaQlRGTkZMRnh1SUNCamIyd2dQU0JqYjJ4ZlpuVnVMRnh1SUNCaWIzSmtaWElnUFNCVVVsVkZYRzRwWEc1Y2JseHVJeUJKYm1sMGFXRnNhWHBsSUd4cGMzUnpJSFJ2SUhOMGIzSmxJSEpsYzNWc2RITmNibUZ1WTJodmNuTWdQQzBnYkdsemRDZ3BYRzUwWW5NZ1BDMGdiR2x6ZENncFhHNTBaVzF3Y3lBOExTQnNhWE4wS0NsY2JseHVJeUJRY205alpYTnpJR05zZFhOMFpYSnpJR014SUhSdklHTTRYRzVtYjNJZ0tHa2dhVzRnTVRvMEtTQjdYRzRnSUNNZ1JYaDBjbUZqZENCaGJtTm9iM0pjYmlBZ2JHOXZjRjlqYkhWemRHVnlJRHd0SUdkbGRDaHdZWE4wWlRBb1hGeHNiMjl3TG1Oc2RYTjBaWEpjWEN3Z2FTa3BYRzRnSUdGdVkyaHZjaUE4TFNCbGVIUnlZV04wUVc1amFHOXlLR3h2YjNCZlkyeDFjM1JsY2lsY2JpQWdYRzRnSUNNZ1JtbHVaQ0J2ZG1WeWJHRndjeUJoYm1RZ2FXNTBaWEp6WldOMFhHNGdJRzkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJc0lHRjBZV011WjNJcFhHNGdJR0Z1WTJodmNpQThMU0J3YVc1MFpYSnpaV04wS0dGdVkyaHZjbHR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1SUNCY2JpQWdJeUJUZEc5eVpTQmhibU5vYjNKY2JpQWdZVzVqYUc5eWMxdGJhVjFkSUR3dElHRnVZMmh2Y2x4dUlDQmNiaUFnSXlCU2RXNGdURTlNUVZ4dUlDQnlaWE4xYkhRZ1BDMGdjblZ1VEU5TVFTaGhibU5vYjNJc0lHRnVZMmh2Y2k1aGJHd3NJR3h2YkdGRVFpbGNiaUFnZEdJZ1BDMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNiaUFnWEc0Z0lDTWdSbWxzZEdWeUlHRnVaQ0J6ZFcxdFlYSnBlbVZjYmlBZ2RHSWdQQzBnZEdJZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU2tnSlQ0bFhHNGdJQ0FnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYRnhsYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWEZ3cElDVStKVnh1SUNBZ0lHUndiSGx5T2pwbWFXeDBaWElvY1ZaaGJIVmxJRHdnWVd4d2FHRXBJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SUNBZ0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNiaUFnWEc0Z0lDTWdVM1J2Y21VZ2RHSmNiaUFnZEdKelcxdHBYVjBnUEMwZ2RHSmNiaUFnWEc0Z0lDTWdVMlZzWldOMElHRnVaQ0J5Wlc1aGJXVWdiMlJrYzFKaGRHbHZYRzRnSUhSbGJYQWdQQzBnZEdJZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNGdJR052Ykc1aGJXVnpLSFJsYlhBcElEd3RJR01vWEZ4MFlYSm5aWFJjWEN3Z2NHRnpkR1V3S0Z4Y1QxSmZZMXhjTENCcEtTbGNiaUFnWEc0Z0lDTWdVM1J2Y21VZ2RHVnRjRnh1SUNCMFpXMXdjMXRiYVYxZElEd3RJSFJsYlhCY2JuMWNibHh1SXlCTlpYSm5aU0JoYkd3Z2RHVnRjQ0IwWVdKc1pYTWdhVzUwYnlCdmJtVmNiblJsYlhBZ1BDMGdVbVZrZFdObEtHWjFibU4wYVc5dUtIZ3NJSGtwSUdaMWJHeGZhbTlwYmloNExDQjVMQ0JpZVNBOUlGeGNkR0Z5WjJWMFhGd3BMQ0IwWlcxd2N5a2dKVDRsWEc0Z0lHMTFkR0YwWlY5aGJHd29mbkpsY0d4aFkyVmZibUVvTGl3Z01Ta3BYRzVrWVhSaElEd3RJSFJsYlhBZ0pUNGxJR052YkhWdGJsOTBiMTl5YjNkdVlXMWxjeWhjWEhSaGNtZGxkRnhjS1NBbFBpVWdZWE11YldGMGNtbDRLQ2xjYmx4dWJHbGljbUZ5ZVNoamFYSmpiR2w2WlNsY2JtTnZiRjltZFc0Z1BDMGdZMjlzYjNKU1lXMXdNaWhqS0RFc0lHMWhlQ2hrWVhSaEtTa3NJR01vWEZ4M2FHbDBaVnhjTENCY1hISmxaRnhjS1NsY2JseHVYRzRqWm5acGVsOXVZbU5zZFhOMEtHUmhkR0VzSUd0dFpXRnVjeXdnYldWMGFHOWtJRDBnWEZ4M2MzTmNYQ2xjYmx4dWNDQThMU0JJWldGMGJXRndLRnh1SUNCa1lYUmhMRnh1SUNCdVlXMWxJRDBnWEZ4UFpHUnpJRkpoZEdsdlhGd3NJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ01nVG1GdFpTQnZaaUIwYUdVZ2FHVmhkRzFoY0NCc1pXZGxibVJjYmlBZ1kyeDFjM1JsY2w5amIyeDFiVzV6SUQwZ1JrRk1VMFVzSUNBZ0lDQWdJQ0FnSUNBZ0l5QlNaVzF2ZG1VZ1kyOXNkVzF1SUdSbGJtUnliMmR5WVcxY2JpQWdjMmh2ZDE5eWIzZGZaR1Z1WkNBOUlFWkJURk5GTEZ4dUlDQmpiMndnUFNCamIyeGZablZ1TEZ4dUlDQmliM0prWlhJZ1BTQlVVbFZGWEc0cFhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbiMgUlVOTklORyBMT0xBXG5sb2xhRGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHQvbG9sYVxcKVxuZGlyLmNyZWF0ZShsb2xhRGlyLCBzaG93V2FybmluZ3MgPSBGQUxTRSwgcmVjdXJzaXZlID0gVFJVRSlcblxuIyBVUFxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IudXAsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfdXBfcGUtcGVMb29wc19hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBOT1xucmVzdWx0ID0gcnVuTE9MQShhbmNob3Iubm8sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfbm9fcGUtcGVMb29wc19hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBET1dOXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5kb3duLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X2Rvd25fcGUtcGVMb29wc19hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuXG4jIyMgSEVBVE1BUFxuYWxwaGEgPC0gMC4wNVxudGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfdXBfcGUtcGVMb29wc19hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfbm9fcGUtcGVMb29wc19hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9kb3duX3BlLXBlTG9vcHNfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAudXApIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl91cFxcKVxudGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAubm8pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9ub1xcKVxudGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmRvd24pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9kb3duXFwpXG5cblxudGVtcCA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAudXAsIHRlbXAubm8sIGJ5ID0gYyhcXHRhcmdldFxcKSksIHRlbXAuZG93biwgYnkgPSBjKFxcdGFyZ2V0XFwpKSAlPiUgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcblxuZGF0YSA8LSBhcy5tYXRyaXgodGVtcFsyOjRdKVxucm93bmFtZXMoZGF0YSkgPC0gdGVtcCR0YXJnZXRcblxubGlicmFyeShjaXJjbGl6ZSlcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKG1pbihkYXRhKSwgbWF4KGRhdGEpKSwgYyhcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5cbiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSBcXHdzc1xcKVxuXG5wIDwtIEhlYXRtYXAoXG4gIGRhdGEsXG4gIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZFxuICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbVxuICByb3dfa20gPSA0LCAgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmluZSB0aGUgbnVtYmVyIG9mIGstbWVhbnMgY2x1c3RlcnMgZm9yIHJvd3MgKGFkanVzdCBhcyBuZWVkZWQpXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1biAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgdGhlIHJlZCBncmFkaWVudCBjb2xvciBzY2FsZVxuKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X3BlLXBlTG9vcHNfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG5oZWlnaHQgPC0gN1xud2lkdGggPC0gMy41XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG4jIyMgVmlzdWFsaXppbmcgcC12YWx1ZSBhbmQgT1JcbmFscGhhIDwtIDAuMDVcbnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3VwX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxVUFxcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxOT1xcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLmRvd24gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfZG93bl9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4gICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiAgICAgICAgICAgICAgICBncm91cCA9IFxcRE9XTlxcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbnRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG50ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcblxudGVtcCA8LSBiaW5kX3Jvd3ModGVtcC51cCwgdGVtcC5kb3duKVxuXG5vcmRlciA8LSBjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcVVBcXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0LCBcbiAgICAgICAgICAgKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxET1dOXFwpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldClcbnRlbXAkdGFyZ2V0IDwtIGZhY3Rvcih0ZW1wJHRhcmdldCwgbGV2ZWxzID0gcmV2KG9yZGVyKSlcbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGNvbG9yID0gcVZhbHVlTG9nLCBzaXplID0gb2Rkc1JhdGlvKSkgK1xuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gXFxibHVlXFwsIGhpZ2ggPSBcXHJlZFxcKSArXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgK1xuICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGF4aXMgdGl0bGUgc2l6ZSAoaWYgbm90IHJlbW92ZWQpXG4gICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcYW5jaG9yTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9PUl9xVmFsdWVfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG5oZWlnaHQgPC0zXG53aWR0aCA8LSAyXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG5cblxuIyMjIDI0MTAxNSBUZXN0aW5nIG9uIHN1YnNldCBvZiBsb29wc1xuYW5jaG9yLmMxIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzEsIGF0YWMuZ3IpXG5hbmNob3IuYzEgPC0gcGludGVyc2VjdChhbmNob3IuYzFbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmMyIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMilcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzIsIGF0YWMuZ3IpXG5hbmNob3IuYzIgPC0gcGludGVyc2VjdChhbmNob3IuYzJbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmMzIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMylcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzMsIGF0YWMuZ3IpXG5hbmNob3IuYzMgPC0gcGludGVyc2VjdChhbmNob3IuYzNbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM0IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNClcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzQsIGF0YWMuZ3IpXG5hbmNob3IuYzQgPC0gcGludGVyc2VjdChhbmNob3IuYzRbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM1IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzUsIGF0YWMuZ3IpXG5hbmNob3IuYzUgPC0gcGludGVyc2VjdChhbmNob3IuYzVbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM2IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNilcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzYsIGF0YWMuZ3IpXG5hbmNob3IuYzYgPC0gcGludGVyc2VjdChhbmNob3IuYzZbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM3IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNylcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzcsIGF0YWMuZ3IpXG5hbmNob3IuYzcgPC0gcGludGVyc2VjdChhbmNob3IuYzdbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYW5jaG9yLmM4IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyOClcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzgsIGF0YWMuZ3IpXG5hbmNob3IuYzggPC0gcGludGVyc2VjdChhbmNob3IuYzhbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzEsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmMxID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzIsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmMyID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzMsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmMzID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzQsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmM0ID0gYXNfdGliYmxlKHJlc3VsdClcbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM1LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jNSA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM2LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jNiA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM3LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jNyA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM4LCBhbmNob3IuYWxsLCBsb2xhREIpXG50Yi5jOCA9IGFzX3RpYmJsZShyZXN1bHQpXG5cbiMjIyBIRUFUTUFQXG5hbHBoYSA8LSAwLjA1XG50Yi5jMSA8LSB0Yi5jMSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jMiA8LSB0Yi5jMiAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jMyA8LSB0Yi5jMyAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jNCA8LSB0Yi5jNCAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5jNSA8LSB0Yi5jNSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lXG4gIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRiLmM2IDwtIHRiLmM2ICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiVcbiAgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGIuYzcgPC0gdGIuYzcgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JVxuICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50Yi5jOCA8LSB0Yi5jOCAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lXG4gIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRlbXAuYzEgPC0gdGIuYzEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmMxKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzFcXClcbnRlbXAuYzIgPC0gdGIuYzIgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmMyKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzJcXClcbnRlbXAuYzMgPC0gdGIuYzMgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmMzKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzNcXClcbnRlbXAuYzQgPC0gdGIuYzQgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM0KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzRcXClcbnRlbXAuYzUgPC0gdGIuYzUgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM1KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzVcXClcbnRlbXAuYzYgPC0gdGIuYzYgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM2KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzZcXClcbnRlbXAuYzcgPC0gdGIuYzcgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM3KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzdcXClcbnRlbXAuYzggPC0gdGIuYzggJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmM4KSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfYzhcXClcblxudGVtcCA8LSBmdWxsX2pvaW4odGVtcC5jMSwgdGVtcC5jMiwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgZnVsbF9qb2luKHRlbXAuYzMsIGJ5ID0gXFx0YXJnZXRcXCkgJT4lXG4gIGZ1bGxfam9pbih0ZW1wLmM0LCBieSA9IFxcdGFyZ2V0XFwpICU+JVxuICBmdWxsX2pvaW4odGVtcC5jNSwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgZnVsbF9qb2luKHRlbXAuYzYsIGJ5ID0gXFx0YXJnZXRcXCkgJT4lXG4gIGZ1bGxfam9pbih0ZW1wLmM3LCBieSA9IFxcdGFyZ2V0XFwpICU+JVxuICBmdWxsX2pvaW4odGVtcC5jOCwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcblxuZGF0YSA8LSB0ZW1wICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoXFx0YXJnZXRcXCkgJT4lIGFzLm1hdHJpeCgpXG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygxLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1bixcbiAgYm9yZGVyID0gVFJVRVxuKVxuXG5cbiMgSW5pdGlhbGl6ZSBsaXN0cyB0byBzdG9yZSByZXN1bHRzXG5hbmNob3JzIDwtIGxpc3QoKVxudGJzIDwtIGxpc3QoKVxudGVtcHMgPC0gbGlzdCgpXG5cbiMgUHJvY2VzcyBjbHVzdGVycyBjMSB0byBjOFxuZm9yIChpIGluIDE6NCkge1xuICAjIEV4dHJhY3QgYW5jaG9yXG4gIGxvb3BfY2x1c3RlciA8LSBnZXQocGFzdGUwKFxcbG9vcC5jbHVzdGVyXFwsIGkpKVxuICBhbmNob3IgPC0gZXh0cmFjdEFuY2hvcihsb29wX2NsdXN0ZXIpXG4gIFxuICAjIEZpbmQgb3ZlcmxhcHMgYW5kIGludGVyc2VjdFxuICBvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLCBhdGFjLmdyKVxuICBhbmNob3IgPC0gcGludGVyc2VjdChhbmNob3JbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcbiAgXG4gICMgU3RvcmUgYW5jaG9yXG4gIGFuY2hvcnNbW2ldXSA8LSBhbmNob3JcbiAgXG4gICMgUnVuIExPTEFcbiAgcmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLCBhbmNob3IuYWxsLCBsb2xhREIpXG4gIHRiIDwtIGFzX3RpYmJsZShyZXN1bHQpXG4gIFxuICAjIEZpbHRlciBhbmQgc3VtbWFyaXplXG4gIHRiIDwtIHRiICU+JVxuICAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiVcbiAgICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG4gIFxuICAjIFN0b3JlIHRiXG4gIHRic1tbaV1dIDwtIHRiXG4gIFxuICAjIFNlbGVjdCBhbmQgcmVuYW1lIG9kZHNSYXRpb1xuICB0ZW1wIDwtIHRiICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuICBjb2xuYW1lcyh0ZW1wKSA8LSBjKFxcdGFyZ2V0XFwsIHBhc3RlMChcXE9SX2NcXCwgaSkpXG4gIFxuICAjIFN0b3JlIHRlbXBcbiAgdGVtcHNbW2ldXSA8LSB0ZW1wXG59XG5cbiMgTWVyZ2UgYWxsIHRlbXAgdGFibGVzIGludG8gb25lXG50ZW1wIDwtIFJlZHVjZShmdW5jdGlvbih4LCB5KSBmdWxsX2pvaW4oeCwgeSwgYnkgPSBcXHRhcmdldFxcKSwgdGVtcHMpICU+JVxuICBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKVxuZGF0YSA8LSB0ZW1wICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoXFx0YXJnZXRcXCkgJT4lIGFzLm1hdHJpeCgpXG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygxLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1bixcbiAgYm9yZGVyID0gVFJVRVxuKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBSVU5OSU5HIExPTEFcbmxvbGFEaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdC9sb2xhXFwpXG5kaXIuY3JlYXRlKGxvbGFEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKVxuXG4jIFVQXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci51cCwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV91cF9wZS1wZUxvb3BzX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG4jIE5PXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5ubywgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9ub19wZS1wZUxvb3BzX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG4jIERPV05cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmRvd24sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfZG93bl9wZS1wZUxvb3BzX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cbiMjIyBIRUFUTUFQXG5hbHBoYSA8LSAwLjA1XG50Yi51cCA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV91cF9wZS1wZUxvb3BzX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9ub19wZS1wZUxvb3BzX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X2Rvd25fcGUtcGVMb29wc19hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC51cCkgPC0gYyhcXHRhcmdldFxcLCBcXE9SX3VwXFwpXG50ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5ubykgPC0gYyhcXHRhcmdldFxcLCBcXE9SX25vXFwpXG50ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAuZG93bikgPC0gYyhcXHRhcmdldFxcLCBcXE9SX2Rvd25cXClcblxuXG50ZW1wIDwtIGZ1bGxfam9pbihmdWxsX2pvaW4odGVtcC51cCwgdGVtcC5ubywgYnkgPSBjKFxcdGFyZ2V0XFwpKSwgdGVtcC5kb3duLCBieSA9IGMoXFx0YXJnZXRcXCkpICU+JSBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKVxuXG5kYXRhIDwtIGFzLm1hdHJpeCh0ZW1wWzI6NF0pXG5yb3duYW1lcyhkYXRhKSA8LSB0ZW1wJHRhcmdldFxuXG5saWJyYXJ5KGNpcmNsaXplKVxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMobWluKGRhdGEpLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHJvd19rbSA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgICMgRGVmaW5lIHRoZSBudW1iZXIgb2Ygay1tZWFucyBjbHVzdGVycyBmb3Igcm93cyAoYWRqdXN0IGFzIG5lZWRlZClcbiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICBjb2wgPSBjb2xfZnVuICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSB0aGUgcmVkIGdyYWRpZW50IGNvbG9yIHNjYWxlXG4pXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGFuY2hvckxPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfcGUtcGVMb29wc19yZWdBbmNob3JCYWNrZ3JvdW5kX2F0YWNcXClcbmhlaWdodCA8LSA3XG53aWR0aCA8LSAzLjVcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbiMjIyBWaXN1YWxpemluZyBwLXZhbHVlIGFuZCBPUlxuYWxwaGEgPC0gMC4wNVxudGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBcXFVQXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfbm9fYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBcXE5PXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxET1dOXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxudGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxuXG50ZW1wIDwtIGJpbmRfcm93cyh0ZW1wLnVwLCB0ZW1wLmRvd24pXG5cbm9yZGVyIDwtIGMoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxVUFxcKSAlPiUgYXJyYW5nZShkZXNjKG9kZHNSYXRpbykpKSR0YXJnZXQsIFxuICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXERPV05cXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0KVxudGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYob3JkZXIpKVxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IHRhcmdldCwgY29sb3IgPSBxVmFsdWVMb2csIHNpemUgPSBvZGRzUmF0aW8pKSArXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXGJsdWVcXCwgaGlnaCA9IFxccmVkXFwpICtcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArXG4gIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZClcbiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBsZWdlbmQgdGV4dCBzaXplXG4gICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX09SX3FWYWx1ZV9yZWdBbmNob3JCYWNrZ3JvdW5kX2F0YWNcXClcbmhlaWdodCA8LTNcbndpZHRoIDwtIDJcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cblxuXG4jIyMgMjQxMDE1IFRlc3Rpbmcgb24gc3Vic2V0IG9mIGxvb3BzXG5hbmNob3IuYzEgPC0gZXh0cmFjdEFuY2hvcihsb29wLmNsdXN0ZXIxKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5jMSwgYXRhYy5ncilcbmFuY2hvci5jMSA8LSBwaW50ZXJzZWN0KGFuY2hvci5jMVtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5hbmNob3IuYzIgPC0gZXh0cmFjdEFuY2hvcihsb29wLmNsdXN0ZXIyKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5jMiwgYXRhYy5ncilcbmFuY2hvci5jMiA8LSBwaW50ZXJzZWN0KGFuY2hvci5jMltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5hbmNob3IuYzMgPC0gZXh0cmFjdEFuY2hvcihsb29wLmNsdXN0ZXIzKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5jMywgYXRhYy5ncilcbmFuY2hvci5jMyA8LSBwaW50ZXJzZWN0KGFuY2hvci5jM1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5hbmNob3IuYzQgPC0gZXh0cmFjdEFuY2hvcihsb29wLmNsdXN0ZXI0KVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5jNCwgYXRhYy5ncilcbmFuY2hvci5jNCA8LSBwaW50ZXJzZWN0KGFuY2hvci5jNFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5hbmNob3IuYzUgPC0gZXh0cmFjdEFuY2hvcihsb29wLmNsdXN0ZXI1KVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5jNSwgYXRhYy5ncilcbmFuY2hvci5jNSA8LSBwaW50ZXJzZWN0KGFuY2hvci5jNVtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5hbmNob3IuYzYgPC0gZXh0cmFjdEFuY2hvcihsb29wLmNsdXN0ZXI2KVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5jNiwgYXRhYy5ncilcbmFuY2hvci5jNiA8LSBwaW50ZXJzZWN0KGFuY2hvci5jNltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5hbmNob3IuYzcgPC0gZXh0cmFjdEFuY2hvcihsb29wLmNsdXN0ZXI3KVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5jNywgYXRhYy5ncilcbmFuY2hvci5jNyA8LSBwaW50ZXJzZWN0KGFuY2hvci5jN1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5hbmNob3IuYzggPC0gZXh0cmFjdEFuY2hvcihsb29wLmNsdXN0ZXI4KVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5jOCwgYXRhYy5ncilcbmFuY2hvci5jOCA8LSBwaW50ZXJzZWN0KGFuY2hvci5jOFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jMSwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIuYzEgPSBhc190aWJibGUocmVzdWx0KVxuXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jMiwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIuYzIgPSBhc190aWJibGUocmVzdWx0KVxuXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jMywgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIuYzMgPSBhc190aWJibGUocmVzdWx0KVxuXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jNCwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIuYzQgPSBhc190aWJibGUocmVzdWx0KVxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzUsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmM1ID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzYsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmM2ID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzcsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmM3ID0gYXNfdGliYmxlKHJlc3VsdClcblxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzgsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiLmM4ID0gYXNfdGliYmxlKHJlc3VsdClcblxuIyMjIEhFQVRNQVBcbmFscGhhIDwtIDAuMDVcbnRiLmMxIDwtIHRiLmMxICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLmMyIDwtIHRiLmMyICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLmMzIDwtIHRiLmMzICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLmM0IDwtIHRiLmM0ICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLmM1IDwtIHRiLmM1ICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiVcbiAgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGIuYzYgPC0gdGIuYzYgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JVxuICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50Yi5jNyA8LSB0Yi5jNyAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lXG4gIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRiLmM4IDwtIHRiLmM4ICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiVcbiAgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGVtcC5jMSA8LSB0Yi5jMSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAuYzEpIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9jMVxcKVxudGVtcC5jMiA8LSB0Yi5jMiAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAuYzIpIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9jMlxcKVxudGVtcC5jMyA8LSB0Yi5jMyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAuYzMpIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9jM1xcKVxudGVtcC5jNCA8LSB0Yi5jNCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAuYzQpIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9jNFxcKVxudGVtcC5jNSA8LSB0Yi5jNSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAuYzUpIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9jNVxcKVxudGVtcC5jNiA8LSB0Yi5jNiAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAuYzYpIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9jNlxcKVxudGVtcC5jNyA8LSB0Yi5jNyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAuYzcpIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9jN1xcKVxudGVtcC5jOCA8LSB0Yi5jOCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAuYzgpIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9jOFxcKVxuXG50ZW1wIDwtIGZ1bGxfam9pbih0ZW1wLmMxLCB0ZW1wLmMyLCBieSA9IFxcdGFyZ2V0XFwpICU+JVxuICBmdWxsX2pvaW4odGVtcC5jMywgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgZnVsbF9qb2luKHRlbXAuYzQsIGJ5ID0gXFx0YXJnZXRcXCkgJT4lXG4gIGZ1bGxfam9pbih0ZW1wLmM1LCBieSA9IFxcdGFyZ2V0XFwpICU+JVxuICBmdWxsX2pvaW4odGVtcC5jNiwgYnkgPSBcXHRhcmdldFxcKSAlPiVcbiAgZnVsbF9qb2luKHRlbXAuYzcsIGJ5ID0gXFx0YXJnZXRcXCkgJT4lXG4gIGZ1bGxfam9pbih0ZW1wLmM4LCBieSA9IFxcdGFyZ2V0XFwpICU+JVxuICBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKVxuXG5kYXRhIDwtIHRlbXAgJT4lIGNvbHVtbl90b19yb3duYW1lcyhcXHRhcmdldFxcKSAlPiUgYXMubWF0cml4KClcblxubGlicmFyeShjaXJjbGl6ZSlcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDEsIG1heChkYXRhKSksIGMoXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuXG4jZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gXFx3c3NcXClcblxucCA8LSBIZWF0bWFwKFxuICBkYXRhLFxuICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmRcbiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsICAgICAgICAgICAgIyBSZW1vdmUgY29sdW1uIGRlbmRyb2dyYW1cbiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICBjb2wgPSBjb2xfZnVuLFxuICBib3JkZXIgPSBUUlVFXG4pXG5cblxuIyBJbml0aWFsaXplIGxpc3RzIHRvIHN0b3JlIHJlc3VsdHNcbmFuY2hvcnMgPC0gbGlzdCgpXG50YnMgPC0gbGlzdCgpXG50ZW1wcyA8LSBsaXN0KClcblxuIyBQcm9jZXNzIGNsdXN0ZXJzIGMxIHRvIGM4XG5mb3IgKGkgaW4gMTo0KSB7XG4gICMgRXh0cmFjdCBhbmNob3JcbiAgbG9vcF9jbHVzdGVyIDwtIGdldChwYXN0ZTAoXFxsb29wLmNsdXN0ZXJcXCwgaSkpXG4gIGFuY2hvciA8LSBleHRyYWN0QW5jaG9yKGxvb3BfY2x1c3RlcilcbiAgXG4gICMgRmluZCBvdmVybGFwcyBhbmQgaW50ZXJzZWN0XG4gIG92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IsIGF0YWMuZ3IpXG4gIGFuY2hvciA8LSBwaW50ZXJzZWN0KGFuY2hvcltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuICBcbiAgIyBTdG9yZSBhbmNob3JcbiAgYW5jaG9yc1tbaV1dIDwtIGFuY2hvclxuICBcbiAgIyBSdW4gTE9MQVxuICByZXN1bHQgPC0gcnVuTE9MQShhbmNob3IsIGFuY2hvci5hbGwsIGxvbGFEQilcbiAgdGIgPC0gYXNfdGliYmxlKHJlc3VsdClcbiAgXG4gICMgRmlsdGVyIGFuZCBzdW1tYXJpemVcbiAgdGIgPC0gdGIgJT4lXG4gICAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JVxuICAgIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICAgIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbiAgXG4gICMgU3RvcmUgdGJcbiAgdGJzW1tpXV0gPC0gdGJcbiAgXG4gICMgU2VsZWN0IGFuZCByZW5hbWUgb2Rkc1JhdGlvXG4gIHRlbXAgPC0gdGIgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG4gIGNvbG5hbWVzKHRlbXApIDwtIGMoXFx0YXJnZXRcXCwgcGFzdGUwKFxcT1JfY1xcLCBpKSlcbiAgXG4gICMgU3RvcmUgdGVtcFxuICB0ZW1wc1tbaV1dIDwtIHRlbXBcbn1cblxuIyBNZXJnZSBhbGwgdGVtcCB0YWJsZXMgaW50byBvbmVcbnRlbXAgPC0gUmVkdWNlKGZ1bmN0aW9uKHgsIHkpIGZ1bGxfam9pbih4LCB5LCBieSA9IFxcdGFyZ2V0XFwpLCB0ZW1wcykgJT4lXG4gIG11dGF0ZV9hbGwofnJlcGxhY2VfbmEoLiwgMSkpXG5kYXRhIDwtIHRlbXAgJT4lIGNvbHVtbl90b19yb3duYW1lcyhcXHRhcmdldFxcKSAlPiUgYXMubWF0cml4KClcblxubGlicmFyeShjaXJjbGl6ZSlcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDEsIG1heChkYXRhKSksIGMoXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuXG4jZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gXFx3c3NcXClcblxucCA8LSBIZWF0bWFwKFxuICBkYXRhLFxuICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmRcbiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsICAgICAgICAgICAgIyBSZW1vdmUgY29sdW1uIGRlbmRyb2dyYW1cbiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICBjb2wgPSBjb2xfZnVuLFxuICBib3JkZXIgPSBUUlVFXG4pXG5gYGBcbmBgYCJ9 -->

```r
```r
# RUNNING LOLA
lolaDir <- here(\../../result/lola\)
dir.create(lolaDir, showWarnings = FALSE, recursive = TRUE)

# UP
result = runLOLA(anchor.up, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_up_pe-peLoops_atac.tsv\), sep = \\t\)

# NO
result = runLOLA(anchor.no, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_no_pe-peLoops_atac.tsv\), sep = \\t\)

# DOWN
result = runLOLA(anchor.down, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_down_pe-peLoops_atac.tsv\), sep = \\t\)


### HEATMAP
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_up_pe-peLoops_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_no_pe-peLoops_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_logOE_diff0.5_down_pe-peLoops_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio)
colnames(temp.up) <- c(\target\, \OR_up\)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio)
colnames(temp.no) <- c(\target\, \OR_no\)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio)
colnames(temp.down) <- c(\target\, \OR_down\)


temp <- full_join(full_join(temp.up, temp.no, by = c(\target\)), temp.down, by = c(\target\)) %>% mutate_all(~replace_na(., 1))

data <- as.matrix(temp[2:4])
rownames(data) <- temp$target

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  row_km = 4,                         # Define the number of k-means clusters for rows (adjust as needed)
  show_row_dend = FALSE,
  col = col_fun                       # Use the red gradient color scale
)

fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_logOE_diff0.5_pe-peLoops_regAnchorBackground_atac\)
height <- 7
width <- 3.5
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



### Visualizing p-value and OR
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_up_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \UP\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_no_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \NO\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_dTAG_vs_DMSO_diff0.2_down_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \DOWN\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio, qValueLog, group)

temp <- bind_rows(temp.up, temp.down)

order <- c((temp %>% dplyr::filter(group == \UP\) %>% arrange(desc(oddsRatio)))$target, 
           (temp %>% dplyr::filter(group == \DOWN\) %>% arrange(desc(oddsRatio)))$target)
temp$target <- factor(temp$target, levels = rev(order))
p <- ggplot(temp, aes(x = group, y = target, color = qValueLog, size = oddsRatio)) +
  geom_point() + theme_bw() + scale_color_gradient(low = \blue\, high = \red\) +
  labs(x = NULL, y = NULL)  +
  theme(axis.text = element_text(size = 6),  # Set axis text size
        axis.title = element_text(size = 6), # Set axis title size (if not removed)
        legend.text = element_text(size = 6), # Set legend text size
        legend.title = element_text(size = 6)) 

fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_diff0.2_OR_qValue_regAnchorBackground_atac\)
height <-3
width <- 2
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()





### 241015 Testing on subset of loops
anchor.c1 <- extractAnchor(loop.cluster1)
overlaps <- findOverlaps(anchor.c1, atac.gr)
anchor.c1 <- pintersect(anchor.c1[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c2 <- extractAnchor(loop.cluster2)
overlaps <- findOverlaps(anchor.c2, atac.gr)
anchor.c2 <- pintersect(anchor.c2[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c3 <- extractAnchor(loop.cluster3)
overlaps <- findOverlaps(anchor.c3, atac.gr)
anchor.c3 <- pintersect(anchor.c3[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c4 <- extractAnchor(loop.cluster4)
overlaps <- findOverlaps(anchor.c4, atac.gr)
anchor.c4 <- pintersect(anchor.c4[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c5 <- extractAnchor(loop.cluster5)
overlaps <- findOverlaps(anchor.c5, atac.gr)
anchor.c5 <- pintersect(anchor.c5[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c6 <- extractAnchor(loop.cluster6)
overlaps <- findOverlaps(anchor.c6, atac.gr)
anchor.c6 <- pintersect(anchor.c6[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c7 <- extractAnchor(loop.cluster7)
overlaps <- findOverlaps(anchor.c7, atac.gr)
anchor.c7 <- pintersect(anchor.c7[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

anchor.c8 <- extractAnchor(loop.cluster8)
overlaps <- findOverlaps(anchor.c8, atac.gr)
anchor.c8 <- pintersect(anchor.c8[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

result = runLOLA(anchor.c1, anchor.all, lolaDB)
tb.c1 = as_tibble(result)

result = runLOLA(anchor.c2, anchor.all, lolaDB)
tb.c2 = as_tibble(result)

result = runLOLA(anchor.c3, anchor.all, lolaDB)
tb.c3 = as_tibble(result)

result = runLOLA(anchor.c4, anchor.all, lolaDB)
tb.c4 = as_tibble(result)
result = runLOLA(anchor.c5, anchor.all, lolaDB)
tb.c5 = as_tibble(result)

result = runLOLA(anchor.c6, anchor.all, lolaDB)
tb.c6 = as_tibble(result)

result = runLOLA(anchor.c7, anchor.all, lolaDB)
tb.c7 = as_tibble(result)

result = runLOLA(anchor.c8, anchor.all, lolaDB)
tb.c8 = as_tibble(result)

### HEATMAP
alpha <- 0.05
tb.c1 <- tb.c1 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c2 <- tb.c2 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c3 <- tb.c3 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c4 <- tb.c4 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.c5 <- tb.c5 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

tb.c6 <- tb.c6 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

tb.c7 <- tb.c7 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

tb.c8 <- tb.c8 %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>%
  dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.c1 <- tb.c1 %>% dplyr::select(target, oddsRatio)
colnames(temp.c1) <- c(\target\, \OR_c1\)
temp.c2 <- tb.c2 %>% dplyr::select(target, oddsRatio)
colnames(temp.c2) <- c(\target\, \OR_c2\)
temp.c3 <- tb.c3 %>% dplyr::select(target, oddsRatio)
colnames(temp.c3) <- c(\target\, \OR_c3\)
temp.c4 <- tb.c4 %>% dplyr::select(target, oddsRatio)
colnames(temp.c4) <- c(\target\, \OR_c4\)
temp.c5 <- tb.c5 %>% dplyr::select(target, oddsRatio)
colnames(temp.c5) <- c(\target\, \OR_c5\)
temp.c6 <- tb.c6 %>% dplyr::select(target, oddsRatio)
colnames(temp.c6) <- c(\target\, \OR_c6\)
temp.c7 <- tb.c7 %>% dplyr::select(target, oddsRatio)
colnames(temp.c7) <- c(\target\, \OR_c7\)
temp.c8 <- tb.c8 %>% dplyr::select(target, oddsRatio)
colnames(temp.c8) <- c(\target\, \OR_c8\)

temp <- full_join(temp.c1, temp.c2, by = \target\) %>%
  full_join(temp.c3, by = \target\) %>%
  full_join(temp.c4, by = \target\) %>%
  full_join(temp.c5, by = \target\) %>%
  full_join(temp.c6, by = \target\) %>%
  full_join(temp.c7, by = \target\) %>%
  full_join(temp.c8, by = \target\) %>%
  mutate_all(~replace_na(., 1))

data <- temp %>% column_to_rownames(\target\) %>% as.matrix()

library(circlize)
col_fun <- colorRamp2(c(1, max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)


# Initialize lists to store results
anchors <- list()
tbs <- list()
temps <- list()

# Process clusters c1 to c8
for (i in 1:4) {
  # Extract anchor
  loop_cluster <- get(paste0(\loop.cluster\, i))
  anchor <- extractAnchor(loop_cluster)
  
  # Find overlaps and intersect
  overlaps <- findOverlaps(anchor, atac.gr)
  anchor <- pintersect(anchor[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])
  
  # Store anchor
  anchors[[i]] <- anchor
  
  # Run LOLA
  result <- runLOLA(anchor, anchor.all, lolaDB)
  tb <- as_tibble(result)
  
  # Filter and summarize
  tb <- tb %>%
    dplyr::mutate(target = toupper(antibody)) %>%
    filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
    dplyr::filter(qValue < alpha) %>%
    dplyr::group_by(target) %>%
    slice_min(meanRnk, with_ties = FALSE)
  
  # Store tb
  tbs[[i]] <- tb
  
  # Select and rename oddsRatio
  temp <- tb %>% dplyr::select(target, oddsRatio)
  colnames(temp) <- c(\target\, paste0(\OR_c\, i))
  
  # Store temp
  temps[[i]] <- temp
}

# Merge all temp tables into one
temp <- Reduce(function(x, y) full_join(x, y, by = \target\), temps) %>%
  mutate_all(~replace_na(., 1))
data <- temp %>% column_to_rownames(\target\) %>% as.matrix()

library(circlize)
col_fun <- colorRamp2(c(1, max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Limiting to ATAC-seq signal, reg loop background

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZWFJoWXlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0pIVTAwek1UQTJNalUzWDBGVVFVTmZSVk5EWHpFdVltVmtYQ0lwS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoV01Td2dWaklzSUZZektWeHVZMjlzYm1GdFpYTW9ZWFJoWXlrZ1BDMGdZeWhjSW1Ob2Nsd2lMQ0JjSW5OMFlYSjBYQ0lzSUZ3aVpXNWtYQ0lwWEc1aGRHRmpMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoaGRHRmpLVnh1WEc0aklFeFBRVVJKVGtjZ1RFOVBVRk5jYmlNakl5QkpiWEJ2Y25ScGJtY2daR2xtWm1WeVpXNTBhV0ZzSUhKbFozVnNZWFJ2Y25rZ2JHOXZjSE1nSmlCbGVIUnlZV04wSUdGdVkyaHZjbHh1Ykc5dmNDNWhiR3dnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVM1MGMzWmNJaWtwWEc1aGJtTm9iM0l1WVd4c0lEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1WVd4c0tTbGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVlXeHNMQ0JoZEdGakxtZHlLVnh1WVc1amFHOXlMbUZzYkNBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWhiR3hiY1hWbGNubElhWFJ6S0c5MlpYSnNZWEJ6S1Ywc0lHRjBZV011WjNKYmMzVmlhbVZqZEVocGRITW9iM1psY214aGNITXBYU2xjYmx4dWJHOXZjQzUxY0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgyRnNiRjlCTkRnMWRuTkVUVk5QWDFWUVgyUnBabVl3TGpJdVltVmtjR1ZjSWlrcFhHNWhibU5vYjNJdWRYQWdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1MWNDa3BYRzV2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxuVndMQ0JoZEdGakxtZHlLVnh1WVc1amFHOXlMblZ3SUR3dElIQnBiblJsY25ObFkzUW9ZVzVqYUc5eUxuVndXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkTENCaGRHRmpMbWR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVjYm14dmIzQXVaRzkzYmlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgyRnNiRjlCTkRnMWRuTkVUVk5QWDBSUFYwNWZaR2xtWmpBdU1pNWlaV1J3WlZ3aUtTbGNibUZ1WTJodmNpNWtiM2R1SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVaRzkzYmlrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG1SdmQyNHNJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVaRzkzYmlBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWtiM2R1VzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZExDQmhkR0ZqTG1keVczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjBwWEc1Y2JteHZiM0JPZFcwZ1BDMGdibkp2ZHloc2IyOXdMbVJ2ZDI0cFhHNWNiaU1nVTJWc1pXTjBhVzVuSUhOaGJXVWdiblZ0WW1WeUlHOW1JR1Y0ZEhKbGJXVWdibThnYkc5dmNITmNibXh2YjNBdWJtOGdQQzBnYkc5dmNDNWhiR3dnSlQ0bElGeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHRmljMFJwWm1ZZ1BTQmhZbk1vWkdsbVpsOUJORGcxWDBSTlUwOHBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loaFluTkVhV1ptSUR3Z01DNHlLU0FsUGlWY2JpQWdaSEJzZVhJNk9tRnljbUZ1WjJVb1lXSnpSR2xtWmlrZ0pUNGxJSE5zYVdObFgyaGxZV1FvYmlBOUlHeHZiM0JPZFcwcFhHNWhibU5vYjNJdWJtOGdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1dWJ5a3BYRzV2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxtNXZMQ0JoZEdGakxtZHlLVnh1WVc1amFHOXlMbTV2SUR3dElIQnBiblJsY25ObFkzUW9ZVzVqYUc5eUxtNXZXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkTENCaGRHRmpMbWR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmF0YWMgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcR1NNMzEwNjI1N19BVEFDX0VTQ18xLmJlZFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMylcbmNvbG5hbWVzKGF0YWMpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuYXRhYy5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYXRhYylcblxuIyBMT0FESU5HIExPT1BTXG4jIyMgSW1wb3J0aW5nIGRpZmZlcmVudGlhbCByZWd1bGF0b3J5IGxvb3BzICYgZXh0cmFjdCBhbmNob3Jcbmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKVxuYW5jaG9yLmFsbCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmFsbCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmFsbCwgYXRhYy5ncilcbmFuY2hvci5hbGwgPC0gcGludGVyc2VjdChhbmNob3IuYWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cCwgYXRhYy5ncilcbmFuY2hvci51cCA8LSBwaW50ZXJzZWN0KGFuY2hvci51cFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBhdGFjLmdyKVxuYW5jaG9yLmRvd24gPC0gcGludGVyc2VjdChhbmNob3IuZG93bltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wTnVtIDwtIG5yb3cobG9vcC5kb3duKVxuXG4jIFNlbGVjdGluZyBzYW1lIG51bWJlciBvZiBleHRyZW1lIG5vIGxvb3BzXG5sb29wLm5vIDwtIGxvb3AuYWxsICU+JSBcbiAgZHBseXI6Om11dGF0ZShhYnNEaWZmID0gYWJzKGRpZmZfQTQ4NV9ETVNPKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoYWJzRGlmZiA8IDAuMikgJT4lXG4gIGRwbHlyOjphcnJhbmdlKGFic0RpZmYpICU+JSBzbGljZV9oZWFkKG4gPSBsb29wTnVtKVxuYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ubywgYXRhYy5ncilcbmFuY2hvci5ubyA8LSBwaW50ZXJzZWN0KGFuY2hvci5ub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
overlaps <- findOverlaps(anchor.up, atac.gr)
anchor.up <- pintersect(anchor.up[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))
overlaps <- findOverlaps(anchor.down, atac.gr)
anchor.down <- pintersect(anchor.down[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loopNum <- nrow(loop.down)

# Selecting same number of extreme no loops
loop.no <- loop.all %>% 
  dplyr::mutate(absDiff = abs(diff_A485_DMSO)) %>%
  dplyr::filter(absDiff < 0.2) %>%
  dplyr::arrange(absDiff) %>% slice_head(n = loopNum)
anchor.no <- (extractAnchor(loop.no))
overlaps <- findOverlaps(anchor.no, atac.gr)
anchor.no <- pintersect(anchor.no[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlYUmhZeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeEhVMDB6TVRBMk1qVTNYMEZVUVVOZlJWTkRYekV1WW1Wa1hGd3BLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hXTVN3Z1ZqSXNJRll6S1Z4dVkyOXNibUZ0WlhNb1lYUmhZeWtnUEMwZ1l5aGNYR05vY2x4Y0xDQmNYSE4wWVhKMFhGd3NJRnhjWlc1a1hGd3BYRzVoZEdGakxtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2hoZEdGaktWeHVYRzRqSUV4UFFVUkpUa2NnVEU5UFVGTmNiaU1qSXlCSmJYQnZjblJwYm1jZ1pHbG1abVZ5Wlc1MGFXRnNJSEpsWjNWc1lYUnZjbmtnYkc5dmNITWdKaUJsZUhSeVlXTjBJR0Z1WTJodmNseHViRzl2Y0M1aGJHd2dQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lUzUwYzNaY1hDa3BYRzVoYm1Ob2IzSXVZV3hzSUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVZV3hzS1NsY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l1WVd4c0xDQmhkR0ZqTG1keUtWeHVZVzVqYUc5eUxtRnNiQ0E4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1aGJHeGJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzSUdGMFlXTXVaM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhTbGNibHh1Ykc5dmNDNTFjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDJGc2JGOUJORGcxZG5ORVRWTlBYMVZRWDJScFptWXdMakl1WW1Wa2NHVmNYQ2twWEc1aGJtTm9iM0l1ZFhBZ1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzUxY0NrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG5Wd0xDQmhkR0ZqTG1keUtWeHVZVzVqYUc5eUxuVndJRHd0SUhCcGJuUmxjbk5sWTNRb1lXNWphRzl5TG5Wd1czRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGRMQ0JoZEdGakxtZHlXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1YwcFhHNWNibXh2YjNBdVpHOTNiaUE4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDJGc2JGOUJORGcxZG5ORVRWTlBYMFJQVjA1ZlpHbG1aakF1TWk1aVpXUndaVnhjS1NsY2JtRnVZMmh2Y2k1a2IzZHVJRHd0SUNobGVIUnlZV04wUVc1amFHOXlLR3h2YjNBdVpHOTNiaWtwWEc1dmRtVnliR0Z3Y3lBOExTQm1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlMbVJ2ZDI0c0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVpHOTNiaUE4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1a2IzZHVXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkTENCaGRHRmpMbWR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVjYm14dmIzQk9kVzBnUEMwZ2JuSnZkeWhzYjI5d0xtUnZkMjRwWEc1Y2JpTWdVMlZzWldOMGFXNW5JSE5oYldVZ2JuVnRZbVZ5SUc5bUlHVjRkSEpsYldVZ2JtOGdiRzl2Y0hOY2JteHZiM0F1Ym04Z1BDMGdiRzl2Y0M1aGJHd2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dGaWMwUnBabVlnUFNCaFluTW9aR2xtWmw5Qk5EZzFYMFJOVTA4cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWhoWW5ORWFXWm1JRHdnTUM0eUtTQWxQaVZjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvWVdKelJHbG1aaWtnSlQ0bElITnNhV05sWDJobFlXUW9iaUE5SUd4dmIzQk9kVzBwWEc1aGJtTm9iM0l1Ym04Z1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzV1YnlrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG01dkxDQmhkR0ZqTG1keUtWeHVZVzVqYUc5eUxtNXZJRHd0SUhCcGJuUmxjbk5sWTNRb1lXNWphRzl5TG01dlczRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGRMQ0JoZEdGakxtZHlXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1YwcFhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbmF0YWMgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcR1NNMzEwNjI1N19BVEFDX0VTQ18xLmJlZFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMylcbmNvbG5hbWVzKGF0YWMpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuYXRhYy5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYXRhYylcblxuIyBMT0FESU5HIExPT1BTXG4jIyMgSW1wb3J0aW5nIGRpZmZlcmVudGlhbCByZWd1bGF0b3J5IGxvb3BzICYgZXh0cmFjdCBhbmNob3Jcbmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKVxuYW5jaG9yLmFsbCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmFsbCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmFsbCwgYXRhYy5ncilcbmFuY2hvci5hbGwgPC0gcGludGVyc2VjdChhbmNob3IuYWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cCwgYXRhYy5ncilcbmFuY2hvci51cCA8LSBwaW50ZXJzZWN0KGFuY2hvci51cFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBhdGFjLmdyKVxuYW5jaG9yLmRvd24gPC0gcGludGVyc2VjdChhbmNob3IuZG93bltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wTnVtIDwtIG5yb3cobG9vcC5kb3duKVxuXG4jIFNlbGVjdGluZyBzYW1lIG51bWJlciBvZiBleHRyZW1lIG5vIGxvb3BzXG5sb29wLm5vIDwtIGxvb3AuYWxsICU+JSBcbiAgZHBseXI6Om11dGF0ZShhYnNEaWZmID0gYWJzKGRpZmZfQTQ4NV9ETVNPKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoYWJzRGlmZiA8IDAuMikgJT4lXG4gIGRwbHlyOjphcnJhbmdlKGFic0RpZmYpICU+JSBzbGljZV9oZWFkKG4gPSBsb29wTnVtKVxuYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ubywgYXRhYy5ncilcbmFuY2hvci5ubyA8LSBwaW50ZXJzZWN0KGFuY2hvci5ub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvclxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpXG5hbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKVxuYW5jaG9yLmFsbCA8LSBwaW50ZXJzZWN0KGFuY2hvci5hbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwLCBhdGFjLmdyKVxuYW5jaG9yLnVwIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGF0YWMuZ3IpXG5hbmNob3IuZG93biA8LSBwaW50ZXJzZWN0KGFuY2hvci5kb3duW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbmxvb3BOdW0gPC0gbnJvdyhsb29wLmRvd24pXG5cbiMgU2VsZWN0aW5nIHNhbWUgbnVtYmVyIG9mIGV4dHJlbWUgbm8gbG9vcHNcbmxvb3Aubm8gPC0gbG9vcC5hbGwgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGFic0RpZmYgPSBhYnMoZGlmZl9BNDg1X0RNU08pKSAlPiVcbiAgZHBseXI6OmZpbHRlcihhYnNEaWZmIDwgMC4yKSAlPiVcbiAgZHBseXI6OmFycmFuZ2UoYWJzRGlmZikgJT4lIHNsaWNlX2hlYWQobiA9IGxvb3BOdW0pXG5hbmNob3Iubm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vLCBhdGFjLmdyKVxuYW5jaG9yLm5vIDwtIHBpbnRlcnNlY3QoYW5jaG9yLm5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5gYGBcbmBgYCJ9 -->

```r
```r
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
overlaps <- findOverlaps(anchor.up, atac.gr)
anchor.up <- pintersect(anchor.up[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))
overlaps <- findOverlaps(anchor.down, atac.gr)
anchor.down <- pintersect(anchor.down[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loopNum <- nrow(loop.down)

# Selecting same number of extreme no loops
loop.no <- loop.all %>% 
  dplyr::mutate(absDiff = abs(diff_A485_DMSO)) %>%
  dplyr::filter(absDiff < 0.2) %>%
  dplyr::arrange(absDiff) %>% slice_head(n = loopNum)
anchor.no <- (extractAnchor(loop.no))
overlaps <- findOverlaps(anchor.no, atac.gr)
anchor.no <- pintersect(anchor.no[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJTVlU1T1NVNUhJRXhQVEVGY2JteHZiR0ZFYVhJZ1BDMGdhR1Z5WlNoY0lpNHVMeTR1TDNKbGMzVnNkQzlzYjJ4aFhDSXBYRzVrYVhJdVkzSmxZWFJsS0d4dmJHRkVhWElzSUhOb2IzZFhZWEp1YVc1bmN5QTlJRVpCVEZORkxDQnlaV04xY25OcGRtVWdQU0JVVWxWRktWeHVYRzRqSUZWUVhHNXlaWE4xYkhRZ1BTQnlkVzVNVDB4QktHRnVZMmh2Y2k1MWNDd2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVabmR5YVhSbEtIUmlMQ0JvWlhKbEtHeHZiR0ZFYVhJc0lGd2lURTlNUVY5Qk5EZzFYM1p6WDBSTlUwOWZaR2xtWmpBdU1sOTFjRjloYkd4TWIyOXdjMTlsZUhSeVpXMWxYMkYwWVdNdWRITjJYQ0lwTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1WEc0aklFNVBYRzV5WlhOMWJIUWdQU0J5ZFc1TVQweEJLR0Z1WTJodmNpNXVieXdnWVc1amFHOXlMbUZzYkN3Z2JHOXNZVVJDS1Z4dWRHSWdQU0JoYzE5MGFXSmliR1VvY21WemRXeDBLVnh1Wm5keWFYUmxLSFJpTENCb1pYSmxLR3h2YkdGRWFYSXNJRndpVEU5TVFWOUJORGcxWDNaelgwUk5VMDlmWkdsbVpqQXVNbDl1YjE5aGJHeE1iMjl3YzE5bGVIUnlaVzFsWDJGMFlXTXVkSE4yWENJcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVhHNGpJRVJQVjA1Y2JuSmxjM1ZzZENBOUlISjFia3hQVEVFb1lXNWphRzl5TG1SdmQyNHNJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYm5SaUlEMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNibVozY21sMFpTaDBZaXdnYUdWeVpTaHNiMnhoUkdseUxDQmNJa3hQVEVGZlFUUTROVjkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZaRzkzYmw5aGJHeE1iMjl3YzE5bGVIUnlaVzFsWDJGMFlXTXVkSE4yWENJcExDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVhHNWNibHh1SXlNaklFaEZRVlJOUVZCY2JtRnNjR2hoSUR3dElEQXVNRFZjYm5SaUxuVndJRHd0SUdaeVpXRmtLR2hsY21Vb2JHOXNZVVJwY2l3Z1hDSk1UMHhCWDBFME9EVmZkbk5mUkUxVFQxOWthV1ptTUM0eVgzVndYMkZzYkV4dmIzQnpYMlY0ZEhKbGJXVmZZWFJoWXk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtIUmhjbWRsZENBOUlIUnZkWEJ3WlhJb1lXNTBhV0p2WkhrcEtTQWxQaVZjYmlBZ1ptbHNkR1Z5S0hOMGNsOTBiMTlzYjNkbGNpaGpaV3hzVkhsd1pTa2dQVDBnWENKbGJXSnllVzl1YVdNZ2MzUmxiU0JqWld4c1hDSXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlVZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGdJSE5zYVdObFgyMXBiaWh0WldGdVVtNXJMQ0IzYVhSb1gzUnBaWE1nUFNCR1FVeFRSU2xjYm5SaUxtNXZJRHd0SUdaeVpXRmtLR2hsY21Vb2JHOXNZVVJwY2l3Z1hDSk1UMHhCWDBFME9EVmZkbk5mUkUxVFQxOWthV1ptTUM0eVgyNXZYMkZzYkV4dmIzQnpYMlY0ZEhKbGJXVmZZWFJoWXk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtIUmhjbWRsZENBOUlIUnZkWEJ3WlhJb1lXNTBhV0p2WkhrcEtTQWxQaVZjYmlBZ1ptbHNkR1Z5S0hOMGNsOTBiMTlzYjNkbGNpaGpaV3hzVkhsd1pTa2dQVDBnWENKbGJXSnllVzl1YVdNZ2MzUmxiU0JqWld4c1hDSXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlVZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGdJSE5zYVdObFgyMXBiaWh0WldGdVVtNXJMQ0IzYVhSb1gzUnBaWE1nUFNCR1FVeFRSU2xjYm5SaUxtUnZkMjRnUEMwZ1puSmxZV1FvYUdWeVpTaHNiMnhoUkdseUxDQmNJa3hQVEVGZlFUUTROVjkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZaRzkzYmw5aGJHeE1iMjl3YzE5bGVIUnlaVzFsWDJGMFlXTXVkSE4yWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU2tnSlQ0bFhHNGdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGd2laVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRndpS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaHhWbUZzZFdVZ1BDQmhiSEJvWVNrZ0pUNGxJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNWNiblJsYlhBdWRYQWdQQzBnZEdJdWRYQWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xuVndLU0E4TFNCaktGd2lkR0Z5WjJWMFhDSXNJRndpVDFKZmRYQmNJaWxjYm5SbGJYQXVibThnUEMwZ2RHSXVibThnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0J2WkdSelVtRjBhVzhwWEc1amIyeHVZVzFsY3loMFpXMXdMbTV2S1NBOExTQmpLRndpZEdGeVoyVjBYQ0lzSUZ3aVQxSmZibTljSWlsY2JuUmxiWEF1Wkc5M2JpQThMU0IwWWk1a2IzZHVJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSFJoY21kbGRDd2diMlJrYzFKaGRHbHZLVnh1WTI5c2JtRnRaWE1vZEdWdGNDNWtiM2R1S1NBOExTQmpLRndpZEdGeVoyVjBYQ0lzSUZ3aVQxSmZaRzkzYmx3aUtWeHVYRzVjYm5SbGJYQWdQQzBnWm5Wc2JGOXFiMmx1S0daMWJHeGZhbTlwYmloMFpXMXdMblZ3TENCMFpXMXdMbTV2TENCaWVTQTlJR01vWENKMFlYSm5aWFJjSWlrcExDQjBaVzF3TG1SdmQyNHNJR0o1SUQwZ1l5aGNJblJoY21kbGRGd2lLU2tnSlQ0bElHMTFkR0YwWlY5aGJHd29mbkpsY0d4aFkyVmZibUVvTGl3Z01Ta3BYRzVjYm1SaGRHRWdQQzBnWVhNdWJXRjBjbWw0S0hSbGJYQmJNam8wWFNsY2JuSnZkMjVoYldWektHUmhkR0VwSUR3dElIUmxiWEFrZEdGeVoyVjBYRzVjYm14cFluSmhjbmtvWTJseVkyeHBlbVVwWEc1amIyeGZablZ1SUR3dElHTnZiRzl5VW1GdGNESW9ZeWh0YVc0b1pHRjBZU2tzSUcxaGVDaGtZWFJoS1Nrc0lHTW9YQ0ozYUdsMFpWd2lMQ0JjSW5KbFpGd2lLU2xjYmx4dVhHNGpablpwZWw5dVltTnNkWE4wS0dSaGRHRXNJR3R0WldGdWN5d2diV1YwYUc5a0lEMGdYQ0ozYzNOY0lpbGNibHh1Y0NBOExTQklaV0YwYldGd0tGeHVJQ0JrWVhSaExGeHVJQ0J1WVcxbElEMGdYQ0pQWkdSeklGSmhkR2x2WENJc0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDTWdUbUZ0WlNCdlppQjBhR1VnYUdWaGRHMWhjQ0JzWldkbGJtUmNiaUFnWTJ4MWMzUmxjbDlqYjJ4MWJXNXpJRDBnUmtGTVUwVXNJQ0FnSUNBZ0lDQWdJQ0FnSXlCU1pXMXZkbVVnWTI5c2RXMXVJR1JsYm1SeWIyZHlZVzFjYmlBZ2NtOTNYMnR0SUQwZ05Td2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5QkVaV1pwYm1VZ2RHaGxJRzUxYldKbGNpQnZaaUJyTFcxbFlXNXpJR05zZFhOMFpYSnpJR1p2Y2lCeWIzZHpJQ2hoWkdwMWMzUWdZWE1nYm1WbFpHVmtLVnh1SUNCemFHOTNYM0p2ZDE5a1pXNWtJRDBnUmtGTVUwVXNYRzRnSUdOdmJDQTlJR052YkY5bWRXNHNYRzRnSUdKdmNtUmxjaUE5SUZSU1ZVVmNiaWxjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2lZVzVqYUc5eVRFOU1RVjlCTkRnMVgzWnpYMFJOVTA5ZlpHbG1aakF1TWw5aGJHeE1iMjl3YzE5bGVIUnlaVzFsWDNKbFowRnVZMmh2Y2tKaFkydG5jbTkxYm1SZllYUmhZMXdpS1Z4dWFHVnBaMmgwSUR3dElEZGNibmRwWkhSb0lEd3RJRE11TlZ4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc1Y2JseHVYRzRqSXlNZ1ZtbHpkV0ZzYVhwcGJtY2djQzEyWVd4MVpTQmhibVFnVDFKY2JtRnNjR2hoSUR3dElEQXVNRFZjYm5SaUxuVndJRHd0SUdaeVpXRmtLR2hsY21Vb2JHOXNZVVJwY2l3Z1hDSk1UMHhCWDBFME9EVmZkbk5mUkUxVFQxOWthV1ptTUM0eVgzVndYMkZzYkV4dmIzQnpYMlY0ZEhKbGJXVmZZWFJoWXk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtIUmhjbWRsZENBOUlIUnZkWEJ3WlhJb1lXNTBhV0p2WkhrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIRldZV3gxWlV4dlp5QTlJQzFzYjJjeUtIRldZV3gxWlNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ozSnZkWEFnUFNCY0lsVlFYQ0lwSUNVK0pWeHVJQ0JtYVd4MFpYSW9jM1J5WDNSdlgyeHZkMlZ5S0dObGJHeFVlWEJsS1NBOVBTQmNJbVZ0WW5KNWIyNXBZeUJ6ZEdWdElHTmxiR3hjSWlrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKU0JrY0d4NWNqbzZaM0p2ZFhCZllua29kR0Z5WjJWMEtTQWxQaVZjYmlBZ2MyeHBZMlZmYldsdUtHMWxZVzVTYm1zc0lIZHBkR2hmZEdsbGN5QTlJRVpCVEZORktWeHVkR0l1Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hzYjJ4aFJHbHlMQ0JjSWt4UFRFRmZRVFE0TlY5MmMxOUVUVk5QWDJScFptWXdMakpmYm05ZllXeHNURzl2Y0hOZlpYaDBjbVZ0WlY5aGRHRmpMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvZEdGeVoyVjBJRDBnZEc5MWNIQmxjaWhoYm5ScFltOWtlU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY1ZaaGJIVmxURzluSUQwZ0xXeHZaeklvY1ZaaGJIVmxLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuY205MWNDQTlJRndpVGs5Y0lpa2dKVDRsWEc0Z0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ3aVpXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGd2lLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bElHUndiSGx5T2pwbmNtOTFjRjlpZVNoMFlYSm5aWFFwSUNVK0pWeHVJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc1MFlpNWtiM2R1SUR3dElHWnlaV0ZrS0dobGNtVW9iRzlzWVVScGNpd2dYQ0pNVDB4QlgwRTBPRFZmZG5OZlJFMVRUMTlrYVdabU1DNHlYMlJ2ZDI1ZllXeHNURzl2Y0hOZlpYaDBjbVZ0WlY5aGRHRmpMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvZEdGeVoyVjBJRDBnZEc5MWNIQmxjaWhoYm5ScFltOWtlU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY1ZaaGJIVmxURzluSUQwZ0xXeHZaeklvY1ZaaGJIVmxLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuY205MWNDQTlJRndpUkU5WFRsd2lLU0FsUGlWY2JpQWdabWxzZEdWeUtITjBjbDkwYjE5c2IzZGxjaWhqWld4c1ZIbHdaU2tnUFQwZ1hDSmxiV0p5ZVc5dWFXTWdjM1JsYlNCalpXeHNYQ0lwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIRldZV3gxWlNBOElHRnNjR2hoS1NBbFBpVWdaSEJzZVhJNk9tZHliM1Z3WDJKNUtIUmhjbWRsZENrZ0pUNGxYRzRnSUhOc2FXTmxYMjFwYmlodFpXRnVVbTVyTENCM2FYUm9YM1JwWlhNZ1BTQkdRVXhUUlNsY2JseHVkR1Z0Y0M1MWNDQThMU0IwWWk1MWNDQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHOWtaSE5TWVhScGJ5d2djVlpoYkhWbFRHOW5MQ0JuY205MWNDbGNiblJsYlhBdWJtOGdQQzBnZEdJdWJtOGdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHNJSEZXWVd4MVpVeHZaeXdnWjNKdmRYQXBYRzUwWlcxd0xtUnZkMjRnUEMwZ2RHSXVaRzkzYmlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUc5a1pITlNZWFJwYnl3Z2NWWmhiSFZsVEc5bkxDQm5jbTkxY0NsY2JseHVkR1Z0Y0NBOExTQmlhVzVrWDNKdmQzTW9kR1Z0Y0M1MWNDd2dkR1Z0Y0M1a2IzZHVLVnh1WEc1dmNtUmxjaUE4TFNCMWJtbHhkV1VvWXlnb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JjSWxWUVhDSXBJQ1UrSlNCaGNuSmhibWRsS0dSbGMyTW9iMlJrYzFKaGRHbHZLU2twSkhSaGNtZGxkQ3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDaDBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SUZ3aVJFOVhUbHdpS1NBbFBpVWdZWEp5WVc1blpTaGtaWE5qS0c5a1pITlNZWFJwYnlrcEtTUjBZWEpuWlhRcEtWeHVkR1Z0Y0NSMFlYSm5aWFFnUEMwZ1ptRmpkRzl5S0hSbGJYQWtkR0Z5WjJWMExDQnNaWFpsYkhNZ1BTQnlaWFlvYjNKa1pYSXBLVnh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUhSaGNtZGxkQ3dnWTI5c2IzSWdQU0J4Vm1Gc2RXVk1iMmNzSUhOcGVtVWdQU0J2WkdSelVtRjBhVzhwS1NBclhHNGdJR2RsYjIxZmNHOXBiblFvS1NBcklIUm9aVzFsWDJKM0tDa2dLeUJ6WTJGc1pWOWpiMnh2Y2w5bmNtRmthV1Z1ZENoc2IzY2dQU0JjSW1Kc2RXVmNJaXdnYUdsbmFDQTlJRndpY21Wa1hDSXBJQ3RjYmlBZ2JHRmljeWg0SUQwZ1RsVk1UQ3dnZVNBOUlFNVZURXdwSUNBcklDQWdjMk5oYkdWZmMybDZaVjlqYjI1MGFXNTFiM1Z6S0hKaGJtZGxJRDBnWXlneExDQXpLU2tnSzF4dUlDQjBhR1Z0WlNoaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFlwTENBZ0l5QlRaWFFnWVhocGN5QjBaWGgwSUhOcGVtVmNiaUFnSUNBZ0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3NJQ01nVTJWMElHRjRhWE1nZEdsMGJHVWdjMmw2WlNBb2FXWWdibTkwSUhKbGJXOTJaV1FwWEc0Z0lDQWdJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0hOcGVtVWdQU0EyS1N3Z0l5QlRaWFFnYkdWblpXNWtJSFJsZUhRZ2MybDZaVnh1SUNBZ0lDQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFlwS1NCY2JseHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpWVc1amFHOXlURTlNUVY5Qk5EZzFYM1p6WDBSTlUwOWZaR2xtWmpBdU1sOWhiR3hNYjI5d2MxOWxlSFJ5WlcxbFgwOVNYM0ZXWVd4MVpWOXlaV2RCYm1Ob2IzSkNZV05yWjNKdmRXNWtYMkYwWVdOY0lpbGNibWhsYVdkb2RDQThMVE5jYm5kcFpIUm9JRHd0SURKY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiMgUlVOTklORyBMT0xBXG5sb2xhRGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHQvbG9sYVxcKVxuZGlyLmNyZWF0ZShsb2xhRGlyLCBzaG93V2FybmluZ3MgPSBGQUxTRSwgcmVjdXJzaXZlID0gVFJVRSlcblxuIyBVUFxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IudXAsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfdXBfYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBOT1xucmVzdWx0ID0gcnVuTE9MQShhbmNob3Iubm8sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfbm9fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBET1dOXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5kb3duLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX2Rvd25fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuXG5cbiMjIyBIRUFUTUFQXG5hbHBoYSA8LSAwLjA1XG50Yi51cCA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl91cF9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9ub19hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX2Rvd25fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC51cCkgPC0gYyhcXHRhcmdldFxcLCBcXE9SX3VwXFwpXG50ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5ubykgPC0gYyhcXHRhcmdldFxcLCBcXE9SX25vXFwpXG50ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAuZG93bikgPC0gYyhcXHRhcmdldFxcLCBcXE9SX2Rvd25cXClcblxuXG50ZW1wIDwtIGZ1bGxfam9pbihmdWxsX2pvaW4odGVtcC51cCwgdGVtcC5ubywgYnkgPSBjKFxcdGFyZ2V0XFwpKSwgdGVtcC5kb3duLCBieSA9IGMoXFx0YXJnZXRcXCkpICU+JSBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKVxuXG5kYXRhIDwtIGFzLm1hdHJpeCh0ZW1wWzI6NF0pXG5yb3duYW1lcyhkYXRhKSA8LSB0ZW1wJHRhcmdldFxuXG5saWJyYXJ5KGNpcmNsaXplKVxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMobWluKGRhdGEpLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHJvd19rbSA9IDUsICAgICAgICAgICAgICAgICAgICAgICAgICMgRGVmaW5lIHRoZSBudW1iZXIgb2Ygay1tZWFucyBjbHVzdGVycyBmb3Igcm93cyAoYWRqdXN0IGFzIG5lZWRlZClcbiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICBjb2wgPSBjb2xfZnVuLFxuICBib3JkZXIgPSBUUlVFXG4pXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGFuY2hvckxPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfYWxsTG9vcHNfZXh0cmVtZV9yZWdBbmNob3JCYWNrZ3JvdW5kX2F0YWNcXClcbmhlaWdodCA8LSA3XG53aWR0aCA8LSAzLjVcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cblxuIyMjIFZpc3VhbGl6aW5nIHAtdmFsdWUgYW5kIE9SXG5hbHBoYSA8LSAwLjA1XG50Yi51cCA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl91cF9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxVUFxcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX25vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBcXE5PXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9kb3duX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBcXERPV05cXCkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRlbXAudXAgPC0gdGIudXAgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG50ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxudGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG5cbnRlbXAgPC0gYmluZF9yb3dzKHRlbXAudXAsIHRlbXAuZG93bilcblxub3JkZXIgPC0gdW5pcXVlKGMoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxVUFxcKSAlPiUgYXJyYW5nZShkZXNjKG9kZHNSYXRpbykpKSR0YXJnZXQsIFxuICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXERPV05cXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0KSlcbnRlbXAkdGFyZ2V0IDwtIGZhY3Rvcih0ZW1wJHRhcmdldCwgbGV2ZWxzID0gcmV2KG9yZGVyKSlcbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGNvbG9yID0gcVZhbHVlTG9nLCBzaXplID0gb2Rkc1JhdGlvKSkgK1xuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gXFxibHVlXFwsIGhpZ2ggPSBcXHJlZFxcKSArXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgKyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgMykpICtcbiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgICMgU2V0IGF4aXMgdGV4dCBzaXplXG4gICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemVcbiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkgXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGFuY2hvckxPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfYWxsTG9vcHNfZXh0cmVtZV9PUl9xVmFsdWVfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG5oZWlnaHQgPC0zXG53aWR0aCA8LSAyXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# RUNNING LOLA
lolaDir <- here(\../../result/lola\)
dir.create(lolaDir, showWarnings = FALSE, recursive = TRUE)

# UP
result = runLOLA(anchor.up, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_up_allLoops_extreme_atac.tsv\), sep = \\t\)

# NO
result = runLOLA(anchor.no, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_no_allLoops_extreme_atac.tsv\), sep = \\t\)

# DOWN
result = runLOLA(anchor.down, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_down_allLoops_extreme_atac.tsv\), sep = \\t\)



### HEATMAP
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_up_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_no_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_down_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio)
colnames(temp.up) <- c(\target\, \OR_up\)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio)
colnames(temp.no) <- c(\target\, \OR_no\)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio)
colnames(temp.down) <- c(\target\, \OR_down\)


temp <- full_join(full_join(temp.up, temp.no, by = c(\target\)), temp.down, by = c(\target\)) %>% mutate_all(~replace_na(., 1))

data <- as.matrix(temp[2:4])
rownames(data) <- temp$target

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  row_km = 5,                         # Define the number of k-means clusters for rows (adjust as needed)
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)

fileName <- paste0(\anchorLOLA_A485_vs_DMSO_diff0.2_allLoops_extreme_regAnchorBackground_atac\)
height <- 7
width <- 3.5
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()




### Visualizing p-value and OR
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_up_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \UP\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_no_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \NO\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_down_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \DOWN\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio, qValueLog, group)

temp <- bind_rows(temp.up, temp.down)

order <- unique(c((temp %>% dplyr::filter(group == \UP\) %>% arrange(desc(oddsRatio)))$target, 
           (temp %>% dplyr::filter(group == \DOWN\) %>% arrange(desc(oddsRatio)))$target))
temp$target <- factor(temp$target, levels = rev(order))
p <- ggplot(temp, aes(x = group, y = target, color = qValueLog, size = oddsRatio)) +
  geom_point() + theme_bw() + scale_color_gradient(low = \blue\, high = \red\) +
  labs(x = NULL, y = NULL)  +   scale_size_continuous(range = c(1, 3)) +
  theme(axis.text = element_text(size = 6),  # Set axis text size
        axis.title = element_text(size = 6), # Set axis title size (if not removed)
        legend.text = element_text(size = 6), # Set legend text size
        legend.title = element_text(size = 6)) 

fileName <- paste0(\anchorLOLA_A485_vs_DMSO_diff0.2_allLoops_extreme_OR_qValue_regAnchorBackground_atac\)
height <-3
width <- 2
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QlNWVTVPU1U1SElFeFBURUZjYm14dmJHRkVhWElnUEMwZ2FHVnlaU2hjWEM0dUx5NHVMM0psYzNWc2RDOXNiMnhoWEZ3cFhHNWthWEl1WTNKbFlYUmxLR3h2YkdGRWFYSXNJSE5vYjNkWFlYSnVhVzVuY3lBOUlFWkJURk5GTENCeVpXTjFjbk5wZG1VZ1BTQlVVbFZGS1Z4dVhHNGpJRlZRWEc1eVpYTjFiSFFnUFNCeWRXNU1UMHhCS0dGdVkyaHZjaTUxY0N3Z1lXNWphRzl5TG1Gc2JDd2diRzlzWVVSQ0tWeHVkR0lnUFNCaGMxOTBhV0ppYkdVb2NtVnpkV3gwS1Z4dVpuZHlhWFJsS0hSaUxDQm9aWEpsS0d4dmJHRkVhWElzSUZ4Y1RFOU1RVjlCTkRnMVgzWnpYMFJOVTA5ZlpHbG1aakF1TWw5MWNGOWhiR3hNYjI5d2MxOWxlSFJ5WlcxbFgyRjBZV011ZEhOMlhGd3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVYRzRqSUU1UFhHNXlaWE4xYkhRZ1BTQnlkVzVNVDB4QktHRnVZMmh2Y2k1dWJ5d2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVabmR5YVhSbEtIUmlMQ0JvWlhKbEtHeHZiR0ZFYVhJc0lGeGNURTlNUVY5Qk5EZzFYM1p6WDBSTlUwOWZaR2xtWmpBdU1sOXViMTloYkd4TWIyOXdjMTlsZUhSeVpXMWxYMkYwWVdNdWRITjJYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1WEc0aklFUlBWMDVjYm5KbGMzVnNkQ0E5SUhKMWJreFBURUVvWVc1amFHOXlMbVJ2ZDI0c0lHRnVZMmh2Y2k1aGJHd3NJR3h2YkdGRVFpbGNiblJpSUQwZ1lYTmZkR2xpWW14bEtISmxjM1ZzZENsY2JtWjNjbWwwWlNoMFlpd2dhR1Z5WlNoc2IyeGhSR2x5TENCY1hFeFBURUZmUVRRNE5WOTJjMTlFVFZOUFgyUnBabVl3TGpKZlpHOTNibDloYkd4TWIyOXdjMTlsZUhSeVpXMWxYMkYwWVdNdWRITjJYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1WEc1Y2JseHVJeU1qSUVoRlFWUk5RVkJjYm1Gc2NHaGhJRHd0SURBdU1EVmNiblJpTG5Wd0lEd3RJR1p5WldGa0tHaGxjbVVvYkc5c1lVUnBjaXdnWEZ4TVQweEJYMEUwT0RWZmRuTmZSRTFUVDE5a2FXWm1NQzR5WDNWd1gyRnNiRXh2YjNCelgyVjRkSEpsYldWZllYUmhZeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwS1NBbFBpVmNiaUFnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYRnhsYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWEZ3cElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVVnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNiblJpTG01dklEd3RJR1p5WldGa0tHaGxjbVVvYkc5c1lVUnBjaXdnWEZ4TVQweEJYMEUwT0RWZmRuTmZSRTFUVDE5a2FXWm1NQzR5WDI1dlgyRnNiRXh2YjNCelgyVjRkSEpsYldWZllYUmhZeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwS1NBbFBpVmNiaUFnWm1sc2RHVnlLSE4wY2w5MGIxOXNiM2RsY2loalpXeHNWSGx3WlNrZ1BUMGdYRnhsYldKeWVXOXVhV01nYzNSbGJTQmpaV3hzWEZ3cElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVVnWkhCc2VYSTZPbWR5YjNWd1gySjVLSFJoY21kbGRDa2dKVDRsWEc0Z0lITnNhV05sWDIxcGJpaHRaV0Z1VW01ckxDQjNhWFJvWDNScFpYTWdQU0JHUVV4VFJTbGNiblJpTG1SdmQyNGdQQzBnWm5KbFlXUW9hR1Z5WlNoc2IyeGhSR2x5TENCY1hFeFBURUZmUVRRNE5WOTJjMTlFVFZOUFgyUnBabVl3TGpKZlpHOTNibDloYkd4TWIyOXdjMTlsZUhSeVpXMWxYMkYwWVdNdWRITjJYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTa2dKVDRsWEc0Z0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ4Y1pXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGeGNLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bElHUndiSGx5T2pwbmNtOTFjRjlpZVNoMFlYSm5aWFFwSUNVK0pWeHVJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc1Y2JuUmxiWEF1ZFhBZ1BDMGdkR0l1ZFhBZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG5Wd0tTQThMU0JqS0Z4Y2RHRnlaMlYwWEZ3c0lGeGNUMUpmZFhCY1hDbGNiblJsYlhBdWJtOGdQQzBnZEdJdWJtOGdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xtNXZLU0E4TFNCaktGeGNkR0Z5WjJWMFhGd3NJRnhjVDFKZmJtOWNYQ2xjYm5SbGJYQXVaRzkzYmlBOExTQjBZaTVrYjNkdUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2IyUmtjMUpoZEdsdktWeHVZMjlzYm1GdFpYTW9kR1Z0Y0M1a2IzZHVLU0E4TFNCaktGeGNkR0Z5WjJWMFhGd3NJRnhjVDFKZlpHOTNibHhjS1Z4dVhHNWNiblJsYlhBZ1BDMGdablZzYkY5cWIybHVLR1oxYkd4ZmFtOXBiaWgwWlcxd0xuVndMQ0IwWlcxd0xtNXZMQ0JpZVNBOUlHTW9YRngwWVhKblpYUmNYQ2twTENCMFpXMXdMbVJ2ZDI0c0lHSjVJRDBnWXloY1hIUmhjbWRsZEZ4Y0tTa2dKVDRsSUcxMWRHRjBaVjloYkd3b2ZuSmxjR3hoWTJWZmJtRW9MaXdnTVNrcFhHNWNibVJoZEdFZ1BDMGdZWE11YldGMGNtbDRLSFJsYlhCYk1qbzBYU2xjYm5KdmQyNWhiV1Z6S0dSaGRHRXBJRHd0SUhSbGJYQWtkR0Z5WjJWMFhHNWNibXhwWW5KaGNua29ZMmx5WTJ4cGVtVXBYRzVqYjJ4ZlpuVnVJRHd0SUdOdmJHOXlVbUZ0Y0RJb1l5aHRhVzRvWkdGMFlTa3NJRzFoZUNoa1lYUmhLU2tzSUdNb1hGeDNhR2wwWlZ4Y0xDQmNYSEpsWkZ4Y0tTbGNibHh1WEc0alpuWnBlbDl1WW1Oc2RYTjBLR1JoZEdFc0lHdHRaV0Z1Y3l3Z2JXVjBhRzlrSUQwZ1hGeDNjM05jWENsY2JseHVjQ0E4TFNCSVpXRjBiV0Z3S0Z4dUlDQmtZWFJoTEZ4dUlDQnVZVzFsSUQwZ1hGeFBaR1J6SUZKaGRHbHZYRndzSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1RtRnRaU0J2WmlCMGFHVWdhR1ZoZEcxaGNDQnNaV2RsYm1SY2JpQWdZMngxYzNSbGNsOWpiMngxYlc1eklEMGdSa0ZNVTBVc0lDQWdJQ0FnSUNBZ0lDQWdJeUJTWlcxdmRtVWdZMjlzZFcxdUlHUmxibVJ5YjJkeVlXMWNiaUFnY205M1gydHRJRDBnTlN3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlCRVpXWnBibVVnZEdobElHNTFiV0psY2lCdlppQnJMVzFsWVc1eklHTnNkWE4wWlhKeklHWnZjaUJ5YjNkeklDaGhaR3AxYzNRZ1lYTWdibVZsWkdWa0tWeHVJQ0J6YUc5M1gzSnZkMTlrWlc1a0lEMGdSa0ZNVTBVc1hHNGdJR052YkNBOUlHTnZiRjltZFc0c1hHNGdJR0p2Y21SbGNpQTlJRlJTVlVWY2JpbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y1lXNWphRzl5VEU5TVFWOUJORGcxWDNaelgwUk5VMDlmWkdsbVpqQXVNbDloYkd4TWIyOXdjMTlsZUhSeVpXMWxYM0psWjBGdVkyaHZja0poWTJ0bmNtOTFibVJmWVhSaFkxeGNLVnh1YUdWcFoyaDBJRHd0SURkY2JuZHBaSFJvSUR3dElETXVOVnh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVYRzVjYmx4dVhHNGpJeU1nVm1semRXRnNhWHBwYm1jZ2NDMTJZV3gxWlNCaGJtUWdUMUpjYm1Gc2NHaGhJRHd0SURBdU1EVmNiblJpTG5Wd0lEd3RJR1p5WldGa0tHaGxjbVVvYkc5c1lVUnBjaXdnWEZ4TVQweEJYMEUwT0RWZmRuTmZSRTFUVDE5a2FXWm1NQzR5WDNWd1gyRnNiRXh2YjNCelgyVjRkSEpsYldWZllYUmhZeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGV1lXeDFaVXh2WnlBOUlDMXNiMmN5S0hGV1lXeDFaU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjNKdmRYQWdQU0JjWEZWUVhGd3BJQ1UrSlZ4dUlDQm1hV3gwWlhJb2MzUnlYM1J2WDJ4dmQyVnlLR05sYkd4VWVYQmxLU0E5UFNCY1hHVnRZbko1YjI1cFl5QnpkR1Z0SUdObGJHeGNYQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NWWmhiSFZsSUR3Z1lXeHdhR0VwSUNVK0pTQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dWRHSXVibThnUEMwZ1puSmxZV1FvYUdWeVpTaHNiMnhoUkdseUxDQmNYRXhQVEVGZlFUUTROVjkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZibTlmWVd4c1RHOXZjSE5mWlhoMGNtVnRaVjloZEdGakxuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0Z5WjJWMElEMGdkRzkxY0hCbGNpaGhiblJwWW05a2VTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjVlpoYkhWbFRHOW5JRDBnTFd4dlp6SW9jVlpoYkhWbEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5jbTkxY0NBOUlGeGNUazljWENrZ0pUNGxYRzRnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRnhjWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ4Y0tTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh4Vm1Gc2RXVWdQQ0JoYkhCb1lTa2dKVDRsSUdSd2JIbHlPanBuY205MWNGOWllU2gwWVhKblpYUXBJQ1UrSlZ4dUlDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzUwWWk1a2IzZHVJRHd0SUdaeVpXRmtLR2hsY21Vb2JHOXNZVVJwY2l3Z1hGeE1UMHhCWDBFME9EVmZkbk5mUkUxVFQxOWthV1ptTUM0eVgyUnZkMjVmWVd4c1RHOXZjSE5mWlhoMGNtVnRaVjloZEdGakxuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0Z5WjJWMElEMGdkRzkxY0hCbGNpaGhiblJwWW05a2VTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjVlpoYkhWbFRHOW5JRDBnTFd4dlp6SW9jVlpoYkhWbEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5jbTkxY0NBOUlGeGNSRTlYVGx4Y0tTQWxQaVZjYmlBZ1ptbHNkR1Z5S0hOMGNsOTBiMTlzYjNkbGNpaGpaV3hzVkhsd1pTa2dQVDBnWEZ4bGJXSnllVzl1YVdNZ2MzUmxiU0JqWld4c1hGd3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0hGV1lXeDFaU0E4SUdGc2NHaGhLU0FsUGlVZ1pIQnNlWEk2T21keWIzVndYMko1S0hSaGNtZGxkQ2tnSlQ0bFhHNGdJSE5zYVdObFgyMXBiaWh0WldGdVVtNXJMQ0IzYVhSb1gzUnBaWE1nUFNCR1FVeFRSU2xjYmx4dWRHVnRjQzUxY0NBOExTQjBZaTUxY0NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUc5a1pITlNZWFJwYnl3Z2NWWmhiSFZsVEc5bkxDQm5jbTkxY0NsY2JuUmxiWEF1Ym04Z1BDMGdkR0l1Ym04Z0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4c0lIRldZV3gxWlV4dlp5d2daM0p2ZFhBcFhHNTBaVzF3TG1SdmQyNGdQQzBnZEdJdVpHOTNiaUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJRzlrWkhOU1lYUnBieXdnY1ZaaGJIVmxURzluTENCbmNtOTFjQ2xjYmx4dWRHVnRjQ0E4TFNCaWFXNWtYM0p2ZDNNb2RHVnRjQzUxY0N3Z2RHVnRjQzVrYjNkdUtWeHVYRzV2Y21SbGNpQThMU0IxYm1seGRXVW9ZeWdvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNYRlZRWEZ3cElDVStKU0JoY25KaGJtZGxLR1JsYzJNb2IyUmtjMUpoZEdsdktTa3BKSFJoY21kbGRDd2dYRzRnSUNBZ0lDQWdJQ0FnSUNoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRnhjUkU5WFRseGNLU0FsUGlVZ1lYSnlZVzVuWlNoa1pYTmpLRzlrWkhOU1lYUnBieWtwS1NSMFlYSm5aWFFwS1Z4dWRHVnRjQ1IwWVhKblpYUWdQQzBnWm1GamRHOXlLSFJsYlhBa2RHRnlaMlYwTENCc1pYWmxiSE1nUFNCeVpYWW9iM0prWlhJcEtWeHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJSFJoY21kbGRDd2dZMjlzYjNJZ1BTQnhWbUZzZFdWTWIyY3NJSE5wZW1VZ1BTQnZaR1J6VW1GMGFXOHBLU0FyWEc0Z0lHZGxiMjFmY0c5cGJuUW9LU0FySUhSb1pXMWxYMkozS0NrZ0t5QnpZMkZzWlY5amIyeHZjbDluY21Ga2FXVnVkQ2hzYjNjZ1BTQmNYR0pzZFdWY1hDd2dhR2xuYUNBOUlGeGNjbVZrWEZ3cElDdGNiaUFnYkdGaWN5aDRJRDBnVGxWTVRDd2dlU0E5SUU1VlRFd3BJQ0FySUNBZ2MyTmhiR1ZmYzJsNlpWOWpiMjUwYVc1MWIzVnpLSEpoYm1kbElEMGdZeWd4TENBektTa2dLMXh1SUNCMGFHVnRaU2hoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9jMmw2WlNBOUlEWXBMQ0FnSXlCVFpYUWdZWGhwY3lCMFpYaDBJSE5wZW1WY2JpQWdJQ0FnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTmlrc0lDTWdVMlYwSUdGNGFYTWdkR2wwYkdVZ2MybDZaU0FvYVdZZ2JtOTBJSEpsYlc5MlpXUXBYRzRnSUNBZ0lDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTJLU3dnSXlCVFpYUWdiR1ZuWlc1a0lIUmxlSFFnYzJsNlpWeHVJQ0FnSUNBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9jMmw2WlNBOUlEWXBLU0JjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNZVzVqYUc5eVRFOU1RVjlCTkRnMVgzWnpYMFJOVTA5ZlpHbG1aakF1TWw5aGJHeE1iMjl3YzE5bGVIUnlaVzFsWDA5U1gzRldZV3gxWlY5eVpXZEJibU5vYjNKQ1lXTnJaM0p2ZFc1a1gyRjBZV05jWENsY2JtaGxhV2RvZENBOExUTmNibmRwWkhSb0lEd3RJREpjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG4jIFJVTk5JTkcgTE9MQVxubG9sYURpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0L2xvbGFcXClcbmRpci5jcmVhdGUobG9sYURpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpXG5cbiMgVVBcbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLnVwLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX3VwX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbiMgTk9cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLm5vLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX25vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbiMgRE9XTlxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuZG93biwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9kb3duX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cblxuXG4jIyMgSEVBVE1BUFxuYWxwaGEgPC0gMC4wNVxudGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfdXBfYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfbm9fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9kb3duX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAudXApIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl91cFxcKVxudGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAubm8pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9ub1xcKVxudGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmRvd24pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9kb3duXFwpXG5cblxudGVtcCA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAudXAsIHRlbXAubm8sIGJ5ID0gYyhcXHRhcmdldFxcKSksIHRlbXAuZG93biwgYnkgPSBjKFxcdGFyZ2V0XFwpKSAlPiUgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcblxuZGF0YSA8LSBhcy5tYXRyaXgodGVtcFsyOjRdKVxucm93bmFtZXMoZGF0YSkgPC0gdGVtcCR0YXJnZXRcblxubGlicmFyeShjaXJjbGl6ZSlcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKG1pbihkYXRhKSwgbWF4KGRhdGEpKSwgYyhcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5cbiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSBcXHdzc1xcKVxuXG5wIDwtIEhlYXRtYXAoXG4gIGRhdGEsXG4gIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZFxuICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbVxuICByb3dfa20gPSA1LCAgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmluZSB0aGUgbnVtYmVyIG9mIGstbWVhbnMgY2x1c3RlcnMgZm9yIHJvd3MgKGFkanVzdCBhcyBuZWVkZWQpXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1bixcbiAgYm9yZGVyID0gVFJVRVxuKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX2FsbExvb3BzX2V4dHJlbWVfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG5oZWlnaHQgPC0gN1xud2lkdGggPC0gMy41XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG5cbiMjIyBWaXN1YWxpemluZyBwLXZhbHVlIGFuZCBPUlxuYWxwaGEgPC0gMC4wNVxudGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfdXBfYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4gICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiAgICAgICAgICAgICAgICBncm91cCA9IFxcVVBcXCkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9ub19hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxOT1xcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLmRvd24gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfZG93bl9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxET1dOXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxudGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxuXG50ZW1wIDwtIGJpbmRfcm93cyh0ZW1wLnVwLCB0ZW1wLmRvd24pXG5cbm9yZGVyIDwtIHVuaXF1ZShjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcVVBcXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0LCBcbiAgICAgICAgICAgKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxET1dOXFwpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCkpXG50ZW1wJHRhcmdldCA8LSBmYWN0b3IodGVtcCR0YXJnZXQsIGxldmVscyA9IHJldihvcmRlcikpXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gdGFyZ2V0LCBjb2xvciA9IHFWYWx1ZUxvZywgc2l6ZSA9IG9kZHNSYXRpbykpICtcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxcYmx1ZVxcLCBoaWdoID0gXFxyZWRcXCkgK1xuICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICsgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDMpKSArXG4gIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZClcbiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBsZWdlbmQgdGV4dCBzaXplXG4gICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX2FsbExvb3BzX2V4dHJlbWVfT1JfcVZhbHVlX3JlZ0FuY2hvckJhY2tncm91bmRfYXRhY1xcKVxuaGVpZ2h0IDwtM1xud2lkdGggPC0gMlxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBSVU5OSU5HIExPTEFcbmxvbGFEaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdC9sb2xhXFwpXG5kaXIuY3JlYXRlKGxvbGFEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKVxuXG4jIFVQXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci51cCwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl91cF9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG4jIE5PXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5ubywgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9ub19hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG4jIERPV05cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmRvd24sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfZG93bl9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cblxuIyMjIEhFQVRNQVBcbmFscGhhIDwtIDAuMDVcbnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX3VwX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX25vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLmRvd24gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfZG93bl9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRlbXAudXAgPC0gdGIudXAgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLnVwKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfdXBcXClcbnRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLm5vKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1Jfbm9cXClcbnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5kb3duKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfZG93blxcKVxuXG5cbnRlbXAgPC0gZnVsbF9qb2luKGZ1bGxfam9pbih0ZW1wLnVwLCB0ZW1wLm5vLCBieSA9IGMoXFx0YXJnZXRcXCkpLCB0ZW1wLmRvd24sIGJ5ID0gYyhcXHRhcmdldFxcKSkgJT4lIG11dGF0ZV9hbGwofnJlcGxhY2VfbmEoLiwgMSkpXG5cbmRhdGEgPC0gYXMubWF0cml4KHRlbXBbMjo0XSlcbnJvd25hbWVzKGRhdGEpIDwtIHRlbXAkdGFyZ2V0XG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYyhtaW4oZGF0YSksIG1heChkYXRhKSksIGMoXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuXG4jZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gXFx3c3NcXClcblxucCA8LSBIZWF0bWFwKFxuICBkYXRhLFxuICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmRcbiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsICAgICAgICAgICAgIyBSZW1vdmUgY29sdW1uIGRlbmRyb2dyYW1cbiAgcm93X2ttID0gNSwgICAgICAgICAgICAgICAgICAgICAgICAgIyBEZWZpbmUgdGhlIG51bWJlciBvZiBrLW1lYW5zIGNsdXN0ZXJzIGZvciByb3dzIChhZGp1c3QgYXMgbmVlZGVkKVxuICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gIGNvbCA9IGNvbF9mdW4sXG4gIGJvcmRlciA9IFRSVUVcbilcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcYW5jaG9yTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9hbGxMb29wc19leHRyZW1lX3JlZ0FuY2hvckJhY2tncm91bmRfYXRhY1xcKVxuaGVpZ2h0IDwtIDdcbndpZHRoIDwtIDMuNVxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cblxuXG4jIyMgVmlzdWFsaXppbmcgcC12YWx1ZSBhbmQgT1JcbmFscGhhIDwtIDAuMDVcbnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX3VwX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBcXFVQXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfbm9fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4gICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiAgICAgICAgICAgICAgICBncm91cCA9IFxcTk9cXCkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX2Rvd25fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4gICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiAgICAgICAgICAgICAgICBncm91cCA9IFxcRE9XTlxcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbnRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG50ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcblxudGVtcCA8LSBiaW5kX3Jvd3ModGVtcC51cCwgdGVtcC5kb3duKVxuXG5vcmRlciA8LSB1bmlxdWUoYygodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXFVQXFwpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCwgXG4gICAgICAgICAgICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcRE9XTlxcKSAlPiUgYXJyYW5nZShkZXNjKG9kZHNSYXRpbykpKSR0YXJnZXQpKVxudGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYob3JkZXIpKVxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IHRhcmdldCwgY29sb3IgPSBxVmFsdWVMb2csIHNpemUgPSBvZGRzUmF0aW8pKSArXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXGJsdWVcXCwgaGlnaCA9IFxccmVkXFwpICtcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArICAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCAzKSkgK1xuICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGF4aXMgdGl0bGUgc2l6ZSAoaWYgbm90IHJlbW92ZWQpXG4gICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcYW5jaG9yTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9hbGxMb29wc19leHRyZW1lX09SX3FWYWx1ZV9yZWdBbmNob3JCYWNrZ3JvdW5kX2F0YWNcXClcbmhlaWdodCA8LTNcbndpZHRoIDwtIDJcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
# RUNNING LOLA
lolaDir <- here(\../../result/lola\)
dir.create(lolaDir, showWarnings = FALSE, recursive = TRUE)

# UP
result = runLOLA(anchor.up, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_up_allLoops_extreme_atac.tsv\), sep = \\t\)

# NO
result = runLOLA(anchor.no, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_no_allLoops_extreme_atac.tsv\), sep = \\t\)

# DOWN
result = runLOLA(anchor.down, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_down_allLoops_extreme_atac.tsv\), sep = \\t\)



### HEATMAP
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_up_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_no_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_down_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio)
colnames(temp.up) <- c(\target\, \OR_up\)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio)
colnames(temp.no) <- c(\target\, \OR_no\)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio)
colnames(temp.down) <- c(\target\, \OR_down\)


temp <- full_join(full_join(temp.up, temp.no, by = c(\target\)), temp.down, by = c(\target\)) %>% mutate_all(~replace_na(., 1))

data <- as.matrix(temp[2:4])
rownames(data) <- temp$target

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  row_km = 5,                         # Define the number of k-means clusters for rows (adjust as needed)
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)

fileName <- paste0(\anchorLOLA_A485_vs_DMSO_diff0.2_allLoops_extreme_regAnchorBackground_atac\)
height <- 7
width <- 3.5
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()




### Visualizing p-value and OR
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_up_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \UP\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_no_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \NO\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_down_allLoops_extreme_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \DOWN\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio, qValueLog, group)

temp <- bind_rows(temp.up, temp.down)

order <- unique(c((temp %>% dplyr::filter(group == \UP\) %>% arrange(desc(oddsRatio)))$target, 
           (temp %>% dplyr::filter(group == \DOWN\) %>% arrange(desc(oddsRatio)))$target))
temp$target <- factor(temp$target, levels = rev(order))
p <- ggplot(temp, aes(x = group, y = target, color = qValueLog, size = oddsRatio)) +
  geom_point() + theme_bw() + scale_color_gradient(low = \blue\, high = \red\) +
  labs(x = NULL, y = NULL)  +   scale_size_continuous(range = c(1, 3)) +
  theme(axis.text = element_text(size = 6),  # Set axis text size
        axis.title = element_text(size = 6), # Set axis title size (if not removed)
        legend.text = element_text(size = 6), # Set legend text size
        legend.title = element_text(size = 6)) 

fileName <- paste0(\anchorLOLA_A485_vs_DMSO_diff0.2_allLoops_extreme_OR_qValue_regAnchorBackground_atac\)
height <-3
width <- 2
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



### A485
##### - Limited to ATAC-seq signal, all loop backgroupd

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZWFJoWXlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0pIVTAwek1UQTJNalUzWDBGVVFVTmZSVk5EWHpFdVltVmtYQ0lwS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoV01Td2dWaklzSUZZektWeHVZMjlzYm1GdFpYTW9ZWFJoWXlrZ1BDMGdZeWhjSW1Ob2Nsd2lMQ0JjSW5OMFlYSjBYQ0lzSUZ3aVpXNWtYQ0lwWEc1aGRHRmpMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoaGRHRmpLVnh1WEc0aklFeFBRVVJKVGtjZ1RFOVBVRk5jYmlNakl5QkpiWEJ2Y25ScGJtY2daR2xtWm1WeVpXNTBhV0ZzSUhKbFozVnNZWFJ2Y25rZ2JHOXZjSE1nSmlCbGVIUnlZV04wSUdGdVkyaHZjbHh1Ykc5dmNDNWhiR3dnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVM1MGMzWmNJaWtwSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHlJQ1ZwYmlVZ1l5aGNJbEF0VUZ3aUxDQmNJbEF0UlZ3aUxDQmNJa1V0UlZ3aUtTbGNibUZ1WTJodmNpNWhiR3dnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWhiR3dwS1Z4dWIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjaTVoYkd3c0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVlXeHNJRHd0SUhCcGJuUmxjbk5sWTNRb1lXNWphRzl5TG1Gc2JGdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVzYjI5d0xuVndJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZRVFE0TlhaelJFMVRUMTlWVUY5a2FXWm1NQzR5TG1KbFpIQmxYQ0lwS1Z4dVlXNWphRzl5TG5Wd0lEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1ZFhBcEtWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1MWNDd2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNTFjQ0E4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1MWNGdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVzYjI5d0xtNXZJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZRVFE0TlhaelJFMVRUMTlPVDE5a2FXWm1NQzR5TG1KbFpIQmxYQ0lwS1Z4dVlXNWphRzl5TG01dklEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1Ym04cEtWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1dWJ5d2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNXVieUE4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1dWIxdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVzYjI5d0xtUnZkMjRnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlCTkRnMWRuTkVUVk5QWDBSUFYwNWZaR2xtWmpBdU1pNWlaV1J3WlZ3aUtTbGNibUZ1WTJodmNpNWtiM2R1SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVaRzkzYmlrcFhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG1SdmQyNHNJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXVaRzkzYmlBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWtiM2R1VzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZExDQmhkR0ZqTG1keVczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjBwWEc1Y2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvclxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSlcbmFuY2hvci5hbGwgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5hbGwpKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5hbGwsIGF0YWMuZ3IpXG5hbmNob3IuYWxsIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cCwgYXRhYy5ncilcbmFuY2hvci51cCA8LSBwaW50ZXJzZWN0KGFuY2hvci51cFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ubywgYXRhYy5ncilcbmFuY2hvci5ubyA8LSBwaW50ZXJzZWN0KGFuY2hvci5ub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGF0YWMuZ3IpXG5hbmNob3IuZG93biA8LSBwaW50ZXJzZWN0KGFuY2hvci5kb3duW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\)) %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
overlaps <- findOverlaps(anchor.up, atac.gr)
anchor.up <- pintersect(anchor.up[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
overlaps <- findOverlaps(anchor.no, atac.gr)
anchor.no <- pintersect(anchor.no[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))
overlaps <- findOverlaps(anchor.down, atac.gr)
anchor.down <- pintersect(anchor.down[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVlYUmhZeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeEhVMDB6TVRBMk1qVTNYMEZVUVVOZlJWTkRYekV1WW1Wa1hGd3BLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hXTVN3Z1ZqSXNJRll6S1Z4dVkyOXNibUZ0WlhNb1lYUmhZeWtnUEMwZ1l5aGNYR05vY2x4Y0xDQmNYSE4wWVhKMFhGd3NJRnhjWlc1a1hGd3BYRzVoZEdGakxtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2hoZEdGaktWeHVYRzRqSUV4UFFVUkpUa2NnVEU5UFVGTmNiaU1qSXlCSmJYQnZjblJwYm1jZ1pHbG1abVZ5Wlc1MGFXRnNJSEpsWjNWc1lYUnZjbmtnYkc5dmNITWdKaUJsZUhSeVlXTjBJR0Z1WTJodmNseHViRzl2Y0M1aGJHd2dQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lUzUwYzNaY1hDa3BJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRUZ1Ym04eUlDVnBiaVVnWXloY1hGQXRVRnhjTENCY1hGQXRSVnhjTENCY1hFVXRSVnhjS1NsY2JtRnVZMmh2Y2k1aGJHd2dQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1aGJHd3BLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNWhiR3dzSUdGMFlXTXVaM0lwWEc1aGJtTm9iM0l1WVd4c0lEd3RJSEJwYm5SbGNuTmxZM1FvWVc1amFHOXlMbUZzYkZ0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0hNcFhTd2dZWFJoWXk1bmNsdHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWxkS1Z4dVhHNXNiMjl3TG5Wd0lEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjR1V0Y0dWZlFUUTROWFp6UkUxVFQxOVZVRjlrYVdabU1DNHlMbUpsWkhCbFhGd3BLVnh1WVc1amFHOXlMblZ3SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVkWEFwS1Z4dWIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjaTUxY0N3Z1lYUmhZeTVuY2lsY2JtRnVZMmh2Y2k1MWNDQThMU0J3YVc1MFpYSnpaV04wS0dGdVkyaHZjaTUxY0Z0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0hNcFhTd2dZWFJoWXk1bmNsdHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWxkS1Z4dVhHNXNiMjl3TG01dklEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjR1V0Y0dWZlFUUTROWFp6UkUxVFQxOU9UMTlrYVdabU1DNHlMbUpsWkhCbFhGd3BLVnh1WVc1amFHOXlMbTV2SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVibThwS1Z4dWIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjaTV1Ynl3Z1lYUmhZeTVuY2lsY2JtRnVZMmh2Y2k1dWJ5QThMU0J3YVc1MFpYSnpaV04wS0dGdVkyaHZjaTV1YjF0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0hNcFhTd2dZWFJoWXk1bmNsdHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWxkS1Z4dVhHNXNiMjl3TG1SdmQyNGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pWOUJORGcxZG5ORVRWTlBYMFJQVjA1ZlpHbG1aakF1TWk1aVpXUndaVnhjS1NsY2JtRnVZMmh2Y2k1a2IzZHVJRHd0SUNobGVIUnlZV04wUVc1amFHOXlLR3h2YjNBdVpHOTNiaWtwWEc1dmRtVnliR0Z3Y3lBOExTQm1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlMbVJ2ZDI0c0lHRjBZV011WjNJcFhHNWhibU5vYjNJdVpHOTNiaUE4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1a2IzZHVXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWxkTENCaGRHRmpMbWR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbmF0YWMgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcR1NNMzEwNjI1N19BVEFDX0VTQ18xLmJlZFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMylcbmNvbG5hbWVzKGF0YWMpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuYXRhYy5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYXRhYylcblxuIyBMT0FESU5HIExPT1BTXG4jIyMgSW1wb3J0aW5nIGRpZmZlcmVudGlhbCByZWd1bGF0b3J5IGxvb3BzICYgZXh0cmFjdCBhbmNob3Jcbmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCkpXG5hbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKVxuYW5jaG9yLmFsbCA8LSBwaW50ZXJzZWN0KGFuY2hvci5hbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci51cCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXAsIGF0YWMuZ3IpXG5hbmNob3IudXAgPC0gcGludGVyc2VjdChhbmNob3IudXBbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3Iubm8sIGF0YWMuZ3IpXG5hbmNob3Iubm8gPC0gcGludGVyc2VjdChhbmNob3Iubm9bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBhdGFjLmdyKVxuYW5jaG9yLmRvd24gPC0gcGludGVyc2VjdChhbmNob3IuZG93bltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvclxubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSlcbmFuY2hvci5hbGwgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5hbGwpKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5hbGwsIGF0YWMuZ3IpXG5hbmNob3IuYWxsIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cCwgYXRhYy5ncilcbmFuY2hvci51cCA8LSBwaW50ZXJzZWN0KGFuY2hvci51cFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ubywgYXRhYy5ncilcbmFuY2hvci5ubyA8LSBwaW50ZXJzZWN0KGFuY2hvci5ub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGF0YWMuZ3IpXG5hbmNob3IuZG93biA8LSBwaW50ZXJzZWN0KGFuY2hvci5kb3duW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
### Importing differential regulatory loops & extract anchor
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\)) %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
overlaps <- findOverlaps(anchor.up, atac.gr)
anchor.up <- pintersect(anchor.up[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
overlaps <- findOverlaps(anchor.no, atac.gr)
anchor.no <- pintersect(anchor.no[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))
overlaps <- findOverlaps(anchor.down, atac.gr)
anchor.down <- pintersect(anchor.down[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJTVlU1T1NVNUhJRXhQVEVGY2JteHZiR0ZFYVhJZ1BDMGdhR1Z5WlNoY0lpNHVMeTR1TDNKbGMzVnNkQzlzYjJ4aFhDSXBYRzVrYVhJdVkzSmxZWFJsS0d4dmJHRkVhWElzSUhOb2IzZFhZWEp1YVc1bmN5QTlJRVpCVEZORkxDQnlaV04xY25OcGRtVWdQU0JVVWxWRktWeHVYRzRqSUZWUVhHNXlaWE4xYkhRZ1BTQnlkVzVNVDB4QktHRnVZMmh2Y2k1MWNDd2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVabmR5YVhSbEtIUmlMQ0JvWlhKbEtHeHZiR0ZFYVhJc0lGd2lURTlNUVY5Qk5EZzFYM1p6WDBSTlUwOWZaR2xtWmpBdU1sOTFjRjloZEdGakxuUnpkbHdpS1N3Z2MyVndJRDBnWENKY1hIUmNJaWxjYmx4dUl5Qk9UMXh1Y21WemRXeDBJRDBnY25WdVRFOU1RU2hoYm1Ob2IzSXVibThzSUdGdVkyaHZjaTVoYkd3c0lHeHZiR0ZFUWlsY2JuUmlJRDBnWVhOZmRHbGlZbXhsS0hKbGMzVnNkQ2xjYm1aM2NtbDBaU2gwWWl3Z2FHVnlaU2hzYjJ4aFJHbHlMQ0JjSWt4UFRFRmZRVFE0TlY5MmMxOUVUVk5QWDJScFptWXdMakpmYm05ZllYUmhZeTUwYzNaY0lpa3NJSE5sY0NBOUlGd2lYRngwWENJcFhHNWNiaU1nUkU5WFRseHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdVpHOTNiaXdnWVc1amFHOXlMbUZzYkN3Z2JHOXNZVVJDS1Z4dWRHSWdQU0JoYzE5MGFXSmliR1VvY21WemRXeDBLVnh1Wm5keWFYUmxLSFJpTENCb1pYSmxLR3h2YkdGRWFYSXNJRndpVEU5TVFWOUJORGcxWDNaelgwUk5VMDlmWkdsbVpqQXVNbDlrYjNkdVgyRjBZV011ZEhOMlhDSXBMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUtWeHVYRzVjYmx4dUl5TWpJRWhGUVZSTlFWQmNibUZzY0doaElEd3RJREF1TURWY2JuUmlMblZ3SUR3dElHWnlaV0ZrS0dobGNtVW9iRzlzWVVScGNpd2dYQ0pNVDB4QlgwRTBPRFZmZG5OZlJFMVRUMTlrYVdabU1DNHlYM1Z3WDJGMFlXTXVkSE4yWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2gwWVhKblpYUWdQU0IwYjNWd2NHVnlLR0Z1ZEdsaWIyUjVLU2tnSlQ0bFhHNGdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGd2laVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRndpS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaHhWbUZzZFdVZ1BDQmhiSEJvWVNrZ0pUNGxJR1J3YkhseU9qcG5jbTkxY0Y5aWVTaDBZWEpuWlhRcElDVStKVnh1SUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNTBZaTV1YnlBOExTQm1jbVZoWkNob1pYSmxLR3h2YkdGRWFYSXNJRndpVEU5TVFWOUJORGcxWDNaelgwUk5VMDlmWkdsbVpqQXVNbDl1YjE5aGRHRmpMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvZEdGeVoyVjBJRDBnZEc5MWNIQmxjaWhoYm5ScFltOWtlU2twSUNVK0pWeHVJQ0JtYVd4MFpYSW9jM1J5WDNSdlgyeHZkMlZ5S0dObGJHeFVlWEJsS1NBOVBTQmNJbVZ0WW5KNWIyNXBZeUJ6ZEdWdElHTmxiR3hjSWlrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKU0JrY0d4NWNqbzZaM0p2ZFhCZllua29kR0Z5WjJWMEtTQWxQaVZjYmlBZ2MyeHBZMlZmYldsdUtHMWxZVzVTYm1zc0lIZHBkR2hmZEdsbGN5QTlJRVpCVEZORktWeHVkR0l1Wkc5M2JpQThMU0JtY21WaFpDaG9aWEpsS0d4dmJHRkVhWElzSUZ3aVRFOU1RVjlCTkRnMVgzWnpYMFJOVTA5ZlpHbG1aakF1TWw5a2IzZHVYMkYwWVdNdWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTa2dKVDRsWEc0Z0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ3aVpXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGd2lLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bElHUndiSGx5T2pwbmNtOTFjRjlpZVNoMFlYSm5aWFFwSUNVK0pWeHVJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc1Y2JuUmxiWEF1ZFhBZ1BDMGdkR0l1ZFhBZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG5Wd0tTQThMU0JqS0Z3aWRHRnlaMlYwWENJc0lGd2lUMUpmZFhCY0lpbGNiblJsYlhBdWJtOGdQQzBnZEdJdWJtOGdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnZaR1J6VW1GMGFXOHBYRzVqYjJ4dVlXMWxjeWgwWlcxd0xtNXZLU0E4TFNCaktGd2lkR0Z5WjJWMFhDSXNJRndpVDFKZmJtOWNJaWxjYm5SbGJYQXVaRzkzYmlBOExTQjBZaTVrYjNkdUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2IyUmtjMUpoZEdsdktWeHVZMjlzYm1GdFpYTW9kR1Z0Y0M1a2IzZHVLU0E4TFNCaktGd2lkR0Z5WjJWMFhDSXNJRndpVDFKZlpHOTNibHdpS1Z4dVhHNWNiblJsYlhBZ1BDMGdablZzYkY5cWIybHVLR1oxYkd4ZmFtOXBiaWgwWlcxd0xuVndMQ0IwWlcxd0xtNXZMQ0JpZVNBOUlHTW9YQ0owWVhKblpYUmNJaWtwTENCMFpXMXdMbVJ2ZDI0c0lHSjVJRDBnWXloY0luUmhjbWRsZEZ3aUtTa2dKVDRsSUcxMWRHRjBaVjloYkd3b2ZuSmxjR3hoWTJWZmJtRW9MaXdnTVNrcFhHNWNibVJoZEdFZ1BDMGdZWE11YldGMGNtbDRLSFJsYlhCYk1qbzBYU2xjYm5KdmQyNWhiV1Z6S0dSaGRHRXBJRHd0SUhSbGJYQWtkR0Z5WjJWMFhHNWNibXhwWW5KaGNua29ZMmx5WTJ4cGVtVXBYRzVqYjJ4ZlpuVnVJRHd0SUdOdmJHOXlVbUZ0Y0RJb1l5aHRhVzRvWkdGMFlTa3NJRzFoZUNoa1lYUmhLU2tzSUdNb1hDSjNhR2wwWlZ3aUxDQmNJbkpsWkZ3aUtTbGNibHh1WEc1d0lEd3RJRWhsWVhSdFlYQW9YRzRnSUdSaGRHRXNYRzRnSUc1aGJXVWdQU0JjSWs5a1pITWdVbUYwYVc5Y0lpd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJPWVcxbElHOW1JSFJvWlNCb1pXRjBiV0Z3SUd4bFoyVnVaRnh1SUNCamJIVnpkR1Z5WDJOdmJIVnRibk1nUFNCR1FVeFRSU3dnSUNBZ0lDQWdJQ0FnSUNBaklGSmxiVzkyWlNCamIyeDFiVzRnWkdWdVpISnZaM0poYlZ4dUlDQnliM2RmYTIwZ1BTQTBMQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpJRVJsWm1sdVpTQjBhR1VnYm5WdFltVnlJRzltSUdzdGJXVmhibk1nWTJ4MWMzUmxjbk1nWm05eUlISnZkM01nS0dGa2FuVnpkQ0JoY3lCdVpXVmtaV1FwWEc0Z0lITm9iM2RmY205M1gyUmxibVFnUFNCR1FVeFRSU3hjYmlBZ1kyOXNJRDBnWTI5c1gyWjFiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5QlZjMlVnZEdobElISmxaQ0JuY21Ga2FXVnVkQ0JqYjJ4dmNpQnpZMkZzWlZ4dUtWeHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKaGJtTm9iM0pNVDB4QlgwRTBPRFZmZG5OZlJFMVRUMTlrYVdabU1DNHlYM0psWjBGdVkyaHZja0poWTJ0bmNtOTFibVJmWVhSaFkxd2lLVnh1YUdWcFoyaDBJRHd0SURkY2JuZHBaSFJvSUR3dElETXVOVnh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ3aWFXNWNJaXdnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXpkbWRjSWlrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVYRzVjYmlNakl5QldhWE4xWVd4cGVtbHVaeUJ3TFhaaGJIVmxJR0Z1WkNCUFVseHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dWRHSXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaHNiMnhoUkdseUxDQmNJa3hQVEVGZlFUUTROVjkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZkWEJmWVhSaFl5NTBjM1pjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSFJoY21kbGRDQTlJSFJ2ZFhCd1pYSW9ZVzUwYVdKdlpIa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEZXWVd4MVpVeHZaeUE5SUMxc2IyY3lLSEZXWVd4MVpTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaM0p2ZFhBZ1BTQmNJbFZRWENJcElDVStKVnh1SUNCbWFXeDBaWElvYzNSeVgzUnZYMnh2ZDJWeUtHTmxiR3hVZVhCbEtTQTlQU0JjSW1WdFluSjViMjVwWXlCemRHVnRJR05sYkd4Y0lpa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY1ZaaGJIVmxJRHdnWVd4d2FHRXBJQ1UrSlNCa2NHeDVjam82WjNKdmRYQmZZbmtvZEdGeVoyVjBLU0FsUGlWY2JpQWdjMnhwWTJWZmJXbHVLRzFsWVc1U2Jtc3NJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLVnh1ZEdJdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoc2IyeGhSR2x5TENCY0lreFBURUZmUVRRNE5WOTJjMTlFVFZOUFgyUnBabVl3TGpKZmJtOWZZWFJoWXk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtIUmhjbWRsZENBOUlIUnZkWEJ3WlhJb1lXNTBhV0p2WkhrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIRldZV3gxWlV4dlp5QTlJQzFzYjJjeUtIRldZV3gxWlNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ozSnZkWEFnUFNCY0lrNVBYQ0lwSUNVK0pWeHVJQ0JtYVd4MFpYSW9jM1J5WDNSdlgyeHZkMlZ5S0dObGJHeFVlWEJsS1NBOVBTQmNJbVZ0WW5KNWIyNXBZeUJ6ZEdWdElHTmxiR3hjSWlrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKU0JrY0d4NWNqbzZaM0p2ZFhCZllua29kR0Z5WjJWMEtTQWxQaVZjYmlBZ2MyeHBZMlZmYldsdUtHMWxZVzVTYm1zc0lIZHBkR2hmZEdsbGN5QTlJRVpCVEZORktWeHVkR0l1Wkc5M2JpQThMU0JtY21WaFpDaG9aWEpsS0d4dmJHRkVhWElzSUZ3aVRFOU1RVjlCTkRnMVgzWnpYMFJOVTA5ZlpHbG1aakF1TWw5a2IzZHVYMkYwWVdNdWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnhWbUZzZFdWTWIyY2dQU0F0Ykc5bk1paHhWbUZzZFdVcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZHliM1Z3SUQwZ1hDSkVUMWRPWENJcElDVStKVnh1SUNCbWFXeDBaWElvYzNSeVgzUnZYMnh2ZDJWeUtHTmxiR3hVZVhCbEtTQTlQU0JjSW1WdFluSjViMjVwWXlCemRHVnRJR05sYkd4Y0lpa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvY1ZaaGJIVmxJRHdnWVd4d2FHRXBJQ1UrSlNCa2NHeDVjam82WjNKdmRYQmZZbmtvZEdGeVoyVjBLU0FsUGlWY2JpQWdjMnhwWTJWZmJXbHVLRzFsWVc1U2Jtc3NJSGRwZEdoZmRHbGxjeUE5SUVaQlRGTkZLVnh1WEc1MFpXMXdMblZ3SUR3dElIUmlMblZ3SUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYjJSa2MxSmhkR2x2TENCeFZtRnNkV1ZNYjJjc0lHZHliM1Z3S1Z4dWRHVnRjQzV1YnlBOExTQjBZaTV1YnlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUc5a1pITlNZWFJwYnl3Z2NWWmhiSFZsVEc5bkxDQm5jbTkxY0NsY2JuUmxiWEF1Wkc5M2JpQThMU0IwWWk1a2IzZHVJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSFJoY21kbGRDd2diMlJrYzFKaGRHbHZMQ0J4Vm1Gc2RXVk1iMmNzSUdkeWIzVndLVnh1WEc1MFpXMXdJRHd0SUdKcGJtUmZjbTkzY3loMFpXMXdMblZ3TENCMFpXMXdMbVJ2ZDI0cFhHNWNibTl5WkdWeUlEd3RJR01vS0hSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdYQ0pWVUZ3aUtTQWxQaVVnWVhKeVlXNW5aU2hrWlhOaktHOWtaSE5TWVhScGJ5a3BLU1IwWVhKblpYUXNJRnh1SUNBZ0lDQWdJQ0FnSUNBb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JjSWtSUFYwNWNJaWtnSlQ0bElHRnljbUZ1WjJVb1pHVnpZeWh2WkdSelVtRjBhVzhwS1Nra2RHRnlaMlYwS1Z4dWRHVnRjQ1IwWVhKblpYUWdQQzBnWm1GamRHOXlLSFJsYlhBa2RHRnlaMlYwTENCc1pYWmxiSE1nUFNCeVpYWW9iM0prWlhJcEtWeHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJSFJoY21kbGRDd2dZMjlzYjNJZ1BTQnhWbUZzZFdWTWIyY3NJSE5wZW1VZ1BTQnZaR1J6VW1GMGFXOHBLU0FyWEc0Z0lHZGxiMjFmY0c5cGJuUW9LU0FySUhSb1pXMWxYMkozS0NrZ0t5QnpZMkZzWlY5amIyeHZjbDluY21Ga2FXVnVkQ2hzYjNjZ1BTQmNJbUpzZFdWY0lpd2dhR2xuYUNBOUlGd2ljbVZrWENJcElDdGNiaUFnYkdGaWN5aDRJRDBnVGxWTVRDd2dlU0E5SUU1VlRFd3BJQ0FyWEc0Z0lIUm9aVzFsS0dGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOaWtzSUNBaklGTmxkQ0JoZUdseklIUmxlSFFnYzJsNlpWeHVJQ0FnSUNBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBMktTd2dJeUJUWlhRZ1lYaHBjeUIwYVhSc1pTQnphWHBsSUNocFppQnViM1FnY21WdGIzWmxaQ2xjYmlBZ0lDQWdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFlwTENBaklGTmxkQ0JzWldkbGJtUWdkR1Y0ZENCemFYcGxYRzRnSUNBZ0lDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOaWtwSUZ4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0poYm1Ob2IzSk1UMHhCWDBFME9EVmZkbk5mUkUxVFQxOWthV1ptTUM0eVgwOVNYM0ZXWVd4MVpWOXlaV2RCYm1Ob2IzSkNZV05yWjNKdmRXNWtYMkYwWVdOY0lpbGNibWhsYVdkb2RDQThMVE5jYm5kcFpIUm9JRHd0SURKY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiMgUlVOTklORyBMT0xBXG5sb2xhRGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHQvbG9sYVxcKVxuZGlyLmNyZWF0ZShsb2xhRGlyLCBzaG93V2FybmluZ3MgPSBGQUxTRSwgcmVjdXJzaXZlID0gVFJVRSlcblxuIyBVUFxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IudXAsIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfdXBfYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbiMgTk9cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLm5vLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX25vX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG4jIERPV05cbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmRvd24sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfZG93bl9hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuXG5cbiMjIyBIRUFUTUFQXG5hbHBoYSA8LSAwLjA1XG50Yi51cCA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl91cF9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfbm9fYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLmRvd24gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfZG93bl9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC51cCkgPC0gYyhcXHRhcmdldFxcLCBcXE9SX3VwXFwpXG50ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5ubykgPC0gYyhcXHRhcmdldFxcLCBcXE9SX25vXFwpXG50ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAuZG93bikgPC0gYyhcXHRhcmdldFxcLCBcXE9SX2Rvd25cXClcblxuXG50ZW1wIDwtIGZ1bGxfam9pbihmdWxsX2pvaW4odGVtcC51cCwgdGVtcC5ubywgYnkgPSBjKFxcdGFyZ2V0XFwpKSwgdGVtcC5kb3duLCBieSA9IGMoXFx0YXJnZXRcXCkpICU+JSBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKVxuXG5kYXRhIDwtIGFzLm1hdHJpeCh0ZW1wWzI6NF0pXG5yb3duYW1lcyhkYXRhKSA8LSB0ZW1wJHRhcmdldFxuXG5saWJyYXJ5KGNpcmNsaXplKVxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMobWluKGRhdGEpLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxucCA8LSBIZWF0bWFwKFxuICBkYXRhLFxuICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmRcbiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsICAgICAgICAgICAgIyBSZW1vdmUgY29sdW1uIGRlbmRyb2dyYW1cbiAgcm93X2ttID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAgIyBEZWZpbmUgdGhlIG51bWJlciBvZiBrLW1lYW5zIGNsdXN0ZXJzIGZvciByb3dzIChhZGp1c3QgYXMgbmVlZGVkKVxuICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gIGNvbCA9IGNvbF9mdW4gICAgICAgICAgICAgICAgICAgICAgICMgVXNlIHRoZSByZWQgZ3JhZGllbnQgY29sb3Igc2NhbGVcbilcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcYW5jaG9yTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9yZWdBbmNob3JCYWNrZ3JvdW5kX2F0YWNcXClcbmhlaWdodCA8LSA3XG53aWR0aCA8LSAzLjVcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG4jIyMgVmlzdWFsaXppbmcgcC12YWx1ZSBhbmQgT1JcbmFscGhhIDwtIDAuMDVcbnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX3VwX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxVUFxcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX25vX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxOT1xcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLmRvd24gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfZG93bl9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4gICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiAgICAgICAgICAgICAgICBncm91cCA9IFxcRE9XTlxcKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbnRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG50ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcblxudGVtcCA8LSBiaW5kX3Jvd3ModGVtcC51cCwgdGVtcC5kb3duKVxuXG5vcmRlciA8LSBjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcVVBcXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0LCBcbiAgICAgICAgICAgKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxET1dOXFwpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldClcbnRlbXAkdGFyZ2V0IDwtIGZhY3Rvcih0ZW1wJHRhcmdldCwgbGV2ZWxzID0gcmV2KG9yZGVyKSlcbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGNvbG9yID0gcVZhbHVlTG9nLCBzaXplID0gb2Rkc1JhdGlvKSkgK1xuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gXFxibHVlXFwsIGhpZ2ggPSBcXHJlZFxcKSArXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgK1xuICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGF4aXMgdGl0bGUgc2l6ZSAoaWYgbm90IHJlbW92ZWQpXG4gICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcYW5jaG9yTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9PUl9xVmFsdWVfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG5oZWlnaHQgPC0zXG53aWR0aCA8LSAyXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# RUNNING LOLA
lolaDir <- here(\../../result/lola\)
dir.create(lolaDir, showWarnings = FALSE, recursive = TRUE)

# UP
result = runLOLA(anchor.up, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_up_atac.tsv\), sep = \\t\)

# NO
result = runLOLA(anchor.no, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_no_atac.tsv\), sep = \\t\)

# DOWN
result = runLOLA(anchor.down, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_down_atac.tsv\), sep = \\t\)



### HEATMAP
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_up_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_no_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_down_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio)
colnames(temp.up) <- c(\target\, \OR_up\)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio)
colnames(temp.no) <- c(\target\, \OR_no\)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio)
colnames(temp.down) <- c(\target\, \OR_down\)


temp <- full_join(full_join(temp.up, temp.no, by = c(\target\)), temp.down, by = c(\target\)) %>% mutate_all(~replace_na(., 1))

data <- as.matrix(temp[2:4])
rownames(data) <- temp$target

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  row_km = 4,                         # Define the number of k-means clusters for rows (adjust as needed)
  show_row_dend = FALSE,
  col = col_fun                       # Use the red gradient color scale
)

fileName <- paste0(\anchorLOLA_A485_vs_DMSO_diff0.2_regAnchorBackground_atac\)
height <- 7
width <- 3.5
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


### Visualizing p-value and OR
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_up_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \UP\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_no_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \NO\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_down_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \DOWN\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio, qValueLog, group)

temp <- bind_rows(temp.up, temp.down)

order <- c((temp %>% dplyr::filter(group == \UP\) %>% arrange(desc(oddsRatio)))$target, 
           (temp %>% dplyr::filter(group == \DOWN\) %>% arrange(desc(oddsRatio)))$target)
temp$target <- factor(temp$target, levels = rev(order))
p <- ggplot(temp, aes(x = group, y = target, color = qValueLog, size = oddsRatio)) +
  geom_point() + theme_bw() + scale_color_gradient(low = \blue\, high = \red\) +
  labs(x = NULL, y = NULL)  +
  theme(axis.text = element_text(size = 6),  # Set axis text size
        axis.title = element_text(size = 6), # Set axis title size (if not removed)
        legend.text = element_text(size = 6), # Set legend text size
        legend.title = element_text(size = 6)) 

fileName <- paste0(\anchorLOLA_A485_vs_DMSO_diff0.2_OR_qValue_regAnchorBackground_atac\)
height <-3
width <- 2
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QlNWVTVPU1U1SElFeFBURUZjYm14dmJHRkVhWElnUEMwZ2FHVnlaU2hjWEM0dUx5NHVMM0psYzNWc2RDOXNiMnhoWEZ3cFhHNWthWEl1WTNKbFlYUmxLR3h2YkdGRWFYSXNJSE5vYjNkWFlYSnVhVzVuY3lBOUlFWkJURk5GTENCeVpXTjFjbk5wZG1VZ1BTQlVVbFZGS1Z4dVhHNGpJRlZRWEc1eVpYTjFiSFFnUFNCeWRXNU1UMHhCS0dGdVkyaHZjaTUxY0N3Z1lXNWphRzl5TG1Gc2JDd2diRzlzWVVSQ0tWeHVkR0lnUFNCaGMxOTBhV0ppYkdVb2NtVnpkV3gwS1Z4dVpuZHlhWFJsS0hSaUxDQm9aWEpsS0d4dmJHRkVhWElzSUZ4Y1RFOU1RVjlCTkRnMVgzWnpYMFJOVTA5ZlpHbG1aakF1TWw5MWNGOWhkR0ZqTG5SemRseGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDbGNibHh1SXlCT1QxeHVjbVZ6ZFd4MElEMGdjblZ1VEU5TVFTaGhibU5vYjNJdWJtOHNJR0Z1WTJodmNpNWhiR3dzSUd4dmJHRkVRaWxjYm5SaUlEMGdZWE5mZEdsaVlteGxLSEpsYzNWc2RDbGNibVozY21sMFpTaDBZaXdnYUdWeVpTaHNiMnhoUkdseUxDQmNYRXhQVEVGZlFUUTROVjkyYzE5RVRWTlBYMlJwWm1Zd0xqSmZibTlmWVhSaFl5NTBjM1pjWENrc0lITmxjQ0E5SUZ4Y1hGeDBYRndwWEc1Y2JpTWdSRTlYVGx4dWNtVnpkV3gwSUQwZ2NuVnVURTlNUVNoaGJtTm9iM0l1Wkc5M2Jpd2dZVzVqYUc5eUxtRnNiQ3dnYkc5c1lVUkNLVnh1ZEdJZ1BTQmhjMTkwYVdKaWJHVW9jbVZ6ZFd4MEtWeHVabmR5YVhSbEtIUmlMQ0JvWlhKbEtHeHZiR0ZFYVhJc0lGeGNURTlNUVY5Qk5EZzFYM1p6WDBSTlUwOWZaR2xtWmpBdU1sOWtiM2R1WDJGMFlXTXVkSE4yWEZ3cExDQnpaWEFnUFNCY1hGeGNkRnhjS1Z4dVhHNWNibHh1SXlNaklFaEZRVlJOUVZCY2JtRnNjR2hoSUR3dElEQXVNRFZjYm5SaUxuVndJRHd0SUdaeVpXRmtLR2hsY21Vb2JHOXNZVVJwY2l3Z1hGeE1UMHhCWDBFME9EVmZkbk5mUkUxVFQxOWthV1ptTUM0eVgzVndYMkYwWVdNdWRITjJYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaDBZWEpuWlhRZ1BTQjBiM1Z3Y0dWeUtHRnVkR2xpYjJSNUtTa2dKVDRsWEc0Z0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ4Y1pXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGeGNLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2loeFZtRnNkV1VnUENCaGJIQm9ZU2tnSlQ0bElHUndiSGx5T2pwbmNtOTFjRjlpZVNoMFlYSm5aWFFwSUNVK0pWeHVJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc1MFlpNXVieUE4TFNCbWNtVmhaQ2hvWlhKbEtHeHZiR0ZFYVhJc0lGeGNURTlNUVY5Qk5EZzFYM1p6WDBSTlUwOWZaR2xtWmpBdU1sOXViMTloZEdGakxuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0Z5WjJWMElEMGdkRzkxY0hCbGNpaGhiblJwWW05a2VTa3BJQ1UrSlZ4dUlDQm1hV3gwWlhJb2MzUnlYM1J2WDJ4dmQyVnlLR05sYkd4VWVYQmxLU0E5UFNCY1hHVnRZbko1YjI1cFl5QnpkR1Z0SUdObGJHeGNYQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NWWmhiSFZsSUR3Z1lXeHdhR0VwSUNVK0pTQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dWRHSXVaRzkzYmlBOExTQm1jbVZoWkNob1pYSmxLR3h2YkdGRWFYSXNJRnhjVEU5TVFWOUJORGcxWDNaelgwUk5VMDlmWkdsbVpqQXVNbDlrYjNkdVgyRjBZV011ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1NrZ0pUNGxYRzRnSUdacGJIUmxjaWh6ZEhKZmRHOWZiRzkzWlhJb1kyVnNiRlI1Y0dVcElEMDlJRnhjWlcxaWNubHZibWxqSUhOMFpXMGdZMlZzYkZ4Y0tTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh4Vm1Gc2RXVWdQQ0JoYkhCb1lTa2dKVDRsSUdSd2JIbHlPanBuY205MWNGOWllU2gwWVhKblpYUXBJQ1UrSlZ4dUlDQnpiR2xqWlY5dGFXNG9iV1ZoYmxKdWF5d2dkMmwwYUY5MGFXVnpJRDBnUmtGTVUwVXBYRzVjYm5SbGJYQXVkWEFnUEMwZ2RHSXVkWEFnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0J2WkdSelVtRjBhVzhwWEc1amIyeHVZVzFsY3loMFpXMXdMblZ3S1NBOExTQmpLRnhjZEdGeVoyVjBYRndzSUZ4Y1QxSmZkWEJjWENsY2JuUmxiWEF1Ym04Z1BDMGdkR0l1Ym04Z0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCdlpHUnpVbUYwYVc4cFhHNWpiMnh1WVcxbGN5aDBaVzF3TG01dktTQThMU0JqS0Z4Y2RHRnlaMlYwWEZ3c0lGeGNUMUpmYm05Y1hDbGNiblJsYlhBdVpHOTNiaUE4TFNCMFlpNWtiM2R1SUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYjJSa2MxSmhkR2x2S1Z4dVkyOXNibUZ0WlhNb2RHVnRjQzVrYjNkdUtTQThMU0JqS0Z4Y2RHRnlaMlYwWEZ3c0lGeGNUMUpmWkc5M2JseGNLVnh1WEc1Y2JuUmxiWEFnUEMwZ1puVnNiRjlxYjJsdUtHWjFiR3hmYW05cGJpaDBaVzF3TG5Wd0xDQjBaVzF3TG01dkxDQmllU0E5SUdNb1hGeDBZWEpuWlhSY1hDa3BMQ0IwWlcxd0xtUnZkMjRzSUdKNUlEMGdZeWhjWEhSaGNtZGxkRnhjS1NrZ0pUNGxJRzExZEdGMFpWOWhiR3dvZm5KbGNHeGhZMlZmYm1Fb0xpd2dNU2twWEc1Y2JtUmhkR0VnUEMwZ1lYTXViV0YwY21sNEtIUmxiWEJiTWpvMFhTbGNibkp2ZDI1aGJXVnpLR1JoZEdFcElEd3RJSFJsYlhBa2RHRnlaMlYwWEc1Y2JteHBZbkpoY25rb1kybHlZMnhwZW1VcFhHNWpiMnhmWm5WdUlEd3RJR052Ykc5eVVtRnRjRElvWXlodGFXNG9aR0YwWVNrc0lHMWhlQ2hrWVhSaEtTa3NJR01vWEZ4M2FHbDBaVnhjTENCY1hISmxaRnhjS1NsY2JseHVYRzV3SUR3dElFaGxZWFJ0WVhBb1hHNGdJR1JoZEdFc1hHNGdJRzVoYldVZ1BTQmNYRTlrWkhNZ1VtRjBhVzljWEN3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5Qk9ZVzFsSUc5bUlIUm9aU0JvWldGMGJXRndJR3hsWjJWdVpGeHVJQ0JqYkhWemRHVnlYMk52YkhWdGJuTWdQU0JHUVV4VFJTd2dJQ0FnSUNBZ0lDQWdJQ0FqSUZKbGJXOTJaU0JqYjJ4MWJXNGdaR1Z1WkhKdlozSmhiVnh1SUNCeWIzZGZhMjBnUFNBMExDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklFUmxabWx1WlNCMGFHVWdiblZ0WW1WeUlHOW1JR3N0YldWaGJuTWdZMngxYzNSbGNuTWdabTl5SUhKdmQzTWdLR0ZrYW5WemRDQmhjeUJ1WldWa1pXUXBYRzRnSUhOb2IzZGZjbTkzWDJSbGJtUWdQU0JHUVV4VFJTeGNiaUFnWTI5c0lEMGdZMjlzWDJaMWJpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlCVmMyVWdkR2hsSUhKbFpDQm5jbUZrYVdWdWRDQmpiMnh2Y2lCelkyRnNaVnh1S1Z4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhoYm1Ob2IzSk1UMHhCWDBFME9EVmZkbk5mUkUxVFQxOWthV1ptTUM0eVgzSmxaMEZ1WTJodmNrSmhZMnRuY205MWJtUmZZWFJoWTF4Y0tWeHVhR1ZwWjJoMElEd3RJRGRjYm5kcFpIUm9JRHd0SURNdU5WeHVjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRnhjYVc1Y1hDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1emRtZGNYQ2twTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVhHNWNiaU1qSXlCV2FYTjFZV3hwZW1sdVp5QndMWFpoYkhWbElHRnVaQ0JQVWx4dVlXeHdhR0VnUEMwZ01DNHdOVnh1ZEdJdWRYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoc2IyeGhSR2x5TENCY1hFeFBURUZmUVRRNE5WOTJjMTlFVFZOUFgyUnBabVl3TGpKZmRYQmZZWFJoWXk1MGMzWmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtIUmhjbWRsZENBOUlIUnZkWEJ3WlhJb1lXNTBhV0p2WkhrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIRldZV3gxWlV4dlp5QTlJQzFzYjJjeUtIRldZV3gxWlNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ozSnZkWEFnUFNCY1hGVlFYRndwSUNVK0pWeHVJQ0JtYVd4MFpYSW9jM1J5WDNSdlgyeHZkMlZ5S0dObGJHeFVlWEJsS1NBOVBTQmNYR1Z0WW5KNWIyNXBZeUJ6ZEdWdElHTmxiR3hjWENrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKU0JrY0d4NWNqbzZaM0p2ZFhCZllua29kR0Z5WjJWMEtTQWxQaVZjYmlBZ2MyeHBZMlZmYldsdUtHMWxZVzVTYm1zc0lIZHBkR2hmZEdsbGN5QTlJRVpCVEZORktWeHVkR0l1Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hzYjJ4aFJHbHlMQ0JjWEV4UFRFRmZRVFE0TlY5MmMxOUVUVk5QWDJScFptWXdMakpmYm05ZllYUmhZeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hSaGNtZGxkQ0E5SUhSdmRYQndaWElvWVc1MGFXSnZaSGtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGV1lXeDFaVXh2WnlBOUlDMXNiMmN5S0hGV1lXeDFaU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjNKdmRYQWdQU0JjWEU1UFhGd3BJQ1UrSlZ4dUlDQm1hV3gwWlhJb2MzUnlYM1J2WDJ4dmQyVnlLR05sYkd4VWVYQmxLU0E5UFNCY1hHVnRZbko1YjI1cFl5QnpkR1Z0SUdObGJHeGNYQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb2NWWmhiSFZsSUR3Z1lXeHdhR0VwSUNVK0pTQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnYzJ4cFkyVmZiV2x1S0cxbFlXNVNibXNzSUhkcGRHaGZkR2xsY3lBOUlFWkJURk5GS1Z4dWRHSXVaRzkzYmlBOExTQm1jbVZoWkNob1pYSmxLR3h2YkdGRWFYSXNJRnhjVEU5TVFWOUJORGcxWDNaelgwUk5VMDlmWkdsbVpqQXVNbDlrYjNkdVgyRjBZV011ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoMFlYSm5aWFFnUFNCMGIzVndjR1Z5S0dGdWRHbGliMlI1S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeFZtRnNkV1ZNYjJjZ1BTQXRiRzluTWloeFZtRnNkV1VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkeWIzVndJRDBnWEZ4RVQxZE9YRndwSUNVK0pWeHVJQ0JtYVd4MFpYSW9jM1J5WDNSdlgyeHZkMlZ5S0dObGJHeFVlWEJsS1NBOVBTQmNYR1Z0WW5KNWIyNXBZeUJ6ZEdWdElHTmxiR3hjWENrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9jVlpoYkhWbElEd2dZV3h3YUdFcElDVStKU0JrY0d4NWNqbzZaM0p2ZFhCZllua29kR0Z5WjJWMEtTQWxQaVZjYmlBZ2MyeHBZMlZmYldsdUtHMWxZVzVTYm1zc0lIZHBkR2hmZEdsbGN5QTlJRVpCVEZORktWeHVYRzUwWlcxd0xuVndJRHd0SUhSaUxuVndJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSFJoY21kbGRDd2diMlJrYzFKaGRHbHZMQ0J4Vm1Gc2RXVk1iMmNzSUdkeWIzVndLVnh1ZEdWdGNDNXVieUE4TFNCMFlpNXVieUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJRzlrWkhOU1lYUnBieXdnY1ZaaGJIVmxURzluTENCbmNtOTFjQ2xjYm5SbGJYQXVaRzkzYmlBOExTQjBZaTVrYjNkdUlDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2IyUmtjMUpoZEdsdkxDQnhWbUZzZFdWTWIyY3NJR2R5YjNWd0tWeHVYRzUwWlcxd0lEd3RJR0pwYm1SZmNtOTNjeWgwWlcxd0xuVndMQ0IwWlcxd0xtUnZkMjRwWEc1Y2JtOXlaR1Z5SUR3dElHTW9LSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1hGeFZVRnhjS1NBbFBpVWdZWEp5WVc1blpTaGtaWE5qS0c5a1pITlNZWFJwYnlrcEtTUjBZWEpuWlhRc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNYRVJQVjA1Y1hDa2dKVDRsSUdGeWNtRnVaMlVvWkdWell5aHZaR1J6VW1GMGFXOHBLU2trZEdGeVoyVjBLVnh1ZEdWdGNDUjBZWEpuWlhRZ1BDMGdabUZqZEc5eUtIUmxiWEFrZEdGeVoyVjBMQ0JzWlhabGJITWdQU0J5WlhZb2IzSmtaWElwS1Z4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlIUmhjbWRsZEN3Z1kyOXNiM0lnUFNCeFZtRnNkV1ZNYjJjc0lITnBlbVVnUFNCdlpHUnpVbUYwYVc4cEtTQXJYRzRnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJSFJvWlcxbFgySjNLQ2tnS3lCelkyRnNaVjlqYjJ4dmNsOW5jbUZrYVdWdWRDaHNiM2NnUFNCY1hHSnNkV1ZjWEN3Z2FHbG5hQ0E5SUZ4Y2NtVmtYRndwSUN0Y2JpQWdiR0ZpY3loNElEMGdUbFZNVEN3Z2VTQTlJRTVWVEV3cElDQXJYRzRnSUhSb1pXMWxLR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3NJQ0FqSUZObGRDQmhlR2x6SUhSbGVIUWdjMmw2WlZ4dUlDQWdJQ0FnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0hOcGVtVWdQU0EyS1N3Z0l5QlRaWFFnWVhocGN5QjBhWFJzWlNCemFYcGxJQ2hwWmlCdWIzUWdjbVZ0YjNabFpDbGNiaUFnSUNBZ0lDQWdiR1ZuWlc1a0xuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9jMmw2WlNBOUlEWXBMQ0FqSUZObGRDQnNaV2RsYm1RZ2RHVjRkQ0J6YVhwbFhHNGdJQ0FnSUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3BJRnh1WEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hGeGhibU5vYjNKTVQweEJYMEUwT0RWZmRuTmZSRTFUVDE5a2FXWm1NQzR5WDA5U1gzRldZV3gxWlY5eVpXZEJibU5vYjNKQ1lXTnJaM0p2ZFc1a1gyRjBZV05jWENsY2JtaGxhV2RvZENBOExUTmNibmRwWkhSb0lEd3RJREpjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG4jIFJVTk5JTkcgTE9MQVxubG9sYURpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0L2xvbGFcXClcbmRpci5jcmVhdGUobG9sYURpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpXG5cbiMgVVBcbnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLnVwLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX3VwX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG4jIE5PXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5ubywgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9ub19hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBET1dOXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci5kb3duLCBhbmNob3IuYWxsLCBsb2xhREIpXG50YiA9IGFzX3RpYmJsZShyZXN1bHQpXG5md3JpdGUodGIsIGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX2Rvd25fYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cblxuXG4jIyMgSEVBVE1BUFxuYWxwaGEgPC0gMC4wNVxudGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfdXBfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbnRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX25vX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX2Rvd25fYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiVcbiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lXG4gIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcblxudGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAudXApIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl91cFxcKVxudGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbylcbmNvbG5hbWVzKHRlbXAubm8pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9ub1xcKVxudGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLmRvd24pIDwtIGMoXFx0YXJnZXRcXCwgXFxPUl9kb3duXFwpXG5cblxudGVtcCA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAudXAsIHRlbXAubm8sIGJ5ID0gYyhcXHRhcmdldFxcKSksIHRlbXAuZG93biwgYnkgPSBjKFxcdGFyZ2V0XFwpKSAlPiUgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSlcblxuZGF0YSA8LSBhcy5tYXRyaXgodGVtcFsyOjRdKVxucm93bmFtZXMoZGF0YSkgPC0gdGVtcCR0YXJnZXRcblxubGlicmFyeShjaXJjbGl6ZSlcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKG1pbihkYXRhKSwgbWF4KGRhdGEpKSwgYyhcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHJvd19rbSA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgICMgRGVmaW5lIHRoZSBudW1iZXIgb2Ygay1tZWFucyBjbHVzdGVycyBmb3Igcm93cyAoYWRqdXN0IGFzIG5lZWRlZClcbiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICBjb2wgPSBjb2xfZnVuICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSB0aGUgcmVkIGdyYWRpZW50IGNvbG9yIHNjYWxlXG4pXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGFuY2hvckxPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG5oZWlnaHQgPC0gN1xud2lkdGggPC0gMy41XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuIyMjIFZpc3VhbGl6aW5nIHAtdmFsdWUgYW5kIE9SXG5hbHBoYSA8LSAwLjA1XG50Yi51cCA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl91cF9hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4gICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiAgICAgICAgICAgICAgICBncm91cCA9IFxcVVBcXCkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9ub19hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksXG4gICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSxcbiAgICAgICAgICAgICAgICBncm91cCA9IFxcTk9cXCkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX2Rvd25fYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBcXERPV05cXCkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRlbXAudXAgPC0gdGIudXAgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG50ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxudGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApXG5cbnRlbXAgPC0gYmluZF9yb3dzKHRlbXAudXAsIHRlbXAuZG93bilcblxub3JkZXIgPC0gYygodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXFVQXFwpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCwgXG4gICAgICAgICAgICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcRE9XTlxcKSAlPiUgYXJyYW5nZShkZXNjKG9kZHNSYXRpbykpKSR0YXJnZXQpXG50ZW1wJHRhcmdldCA8LSBmYWN0b3IodGVtcCR0YXJnZXQsIGxldmVscyA9IHJldihvcmRlcikpXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gdGFyZ2V0LCBjb2xvciA9IHFWYWx1ZUxvZywgc2l6ZSA9IG9kZHNSYXRpbykpICtcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9IFxcYmx1ZVxcLCBoaWdoID0gXFxyZWRcXCkgK1xuICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICtcbiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgICMgU2V0IGF4aXMgdGV4dCBzaXplXG4gICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemVcbiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkgXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGFuY2hvckxPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfT1JfcVZhbHVlX3JlZ0FuY2hvckJhY2tncm91bmRfYXRhY1xcKVxuaGVpZ2h0IDwtM1xud2lkdGggPC0gMlxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBSVU5OSU5HIExPTEFcbmxvbGFEaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdC9sb2xhXFwpXG5kaXIuY3JlYXRlKGxvbGFEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKVxuXG4jIFVQXG5yZXN1bHQgPSBydW5MT0xBKGFuY2hvci51cCwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl91cF9hdGFjLnRzdlxcKSwgc2VwID0gXFxcXHRcXClcblxuIyBOT1xucmVzdWx0ID0gcnVuTE9MQShhbmNob3Iubm8sIGFuY2hvci5hbGwsIGxvbGFEQilcbnRiID0gYXNfdGliYmxlKHJlc3VsdClcbmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfbm9fYXRhYy50c3ZcXCksIHNlcCA9IFxcXFx0XFwpXG5cbiMgRE9XTlxucmVzdWx0ID0gcnVuTE9MQShhbmNob3IuZG93biwgYW5jaG9yLmFsbCwgbG9sYURCKVxudGIgPSBhc190aWJibGUocmVzdWx0KVxuZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWMudHN2XFwpLCBzZXAgPSBcXFxcdFxcKVxuXG5cblxuIyMjIEhFQVRNQVBcbmFscGhhIDwtIDAuMDVcbnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgXFxMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX3VwX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG50Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9ub19hdGFjLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG5cbnRlbXAudXAgPC0gdGIudXAgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLnVwKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfdXBcXClcbnRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG5jb2xuYW1lcyh0ZW1wLm5vKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1Jfbm9cXClcbnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuY29sbmFtZXModGVtcC5kb3duKSA8LSBjKFxcdGFyZ2V0XFwsIFxcT1JfZG93blxcKVxuXG5cbnRlbXAgPC0gZnVsbF9qb2luKGZ1bGxfam9pbih0ZW1wLnVwLCB0ZW1wLm5vLCBieSA9IGMoXFx0YXJnZXRcXCkpLCB0ZW1wLmRvd24sIGJ5ID0gYyhcXHRhcmdldFxcKSkgJT4lIG11dGF0ZV9hbGwofnJlcGxhY2VfbmEoLiwgMSkpXG5cbmRhdGEgPC0gYXMubWF0cml4KHRlbXBbMjo0XSlcbnJvd25hbWVzKGRhdGEpIDwtIHRlbXAkdGFyZ2V0XG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYyhtaW4oZGF0YSksIG1heChkYXRhKSksIGMoXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuXG5wIDwtIEhlYXRtYXAoXG4gIGRhdGEsXG4gIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZFxuICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbVxuICByb3dfa20gPSA0LCAgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmluZSB0aGUgbnVtYmVyIG9mIGstbWVhbnMgY2x1c3RlcnMgZm9yIHJvd3MgKGFkanVzdCBhcyBuZWVkZWQpXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1biAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgdGhlIHJlZCBncmFkaWVudCBjb2xvciBzY2FsZVxuKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX3JlZ0FuY2hvckJhY2tncm91bmRfYXRhY1xcKVxuaGVpZ2h0IDwtIDdcbndpZHRoIDwtIDMuNVxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cbiMjIyBWaXN1YWxpemluZyBwLXZhbHVlIGFuZCBPUlxuYWxwaGEgPC0gMC4wNVxudGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfdXBfYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBcXFVQXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBcXExPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfbm9fYXRhYy50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLFxuICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBcXE5PXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxudGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIFxcTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWMudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSxcbiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLFxuICAgICAgICAgICAgICAgIGdyb3VwID0gXFxET1dOXFwpICU+JVxuICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSBcXGVtYnJ5b25pYyBzdGVtIGNlbGxcXCkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKVxuXG50ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxudGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cClcbnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKVxuXG50ZW1wIDwtIGJpbmRfcm93cyh0ZW1wLnVwLCB0ZW1wLmRvd24pXG5cbm9yZGVyIDwtIGMoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxVUFxcKSAlPiUgYXJyYW5nZShkZXNjKG9kZHNSYXRpbykpKSR0YXJnZXQsIFxuICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXERPV05cXCkgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0KVxudGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYob3JkZXIpKVxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IHRhcmdldCwgY29sb3IgPSBxVmFsdWVMb2csIHNpemUgPSBvZGRzUmF0aW8pKSArXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXGJsdWVcXCwgaGlnaCA9IFxccmVkXFwpICtcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArXG4gIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZVxuICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZClcbiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBsZWdlbmQgdGV4dCBzaXplXG4gICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIFxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX09SX3FWYWx1ZV9yZWdBbmNob3JCYWNrZ3JvdW5kX2F0YWNcXClcbmhlaWdodCA8LTNcbndpZHRoIDwtIDJcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
# RUNNING LOLA
lolaDir <- here(\../../result/lola\)
dir.create(lolaDir, showWarnings = FALSE, recursive = TRUE)

# UP
result = runLOLA(anchor.up, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_up_atac.tsv\), sep = \\t\)

# NO
result = runLOLA(anchor.no, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_no_atac.tsv\), sep = \\t\)

# DOWN
result = runLOLA(anchor.down, anchor.all, lolaDB)
tb = as_tibble(result)
fwrite(tb, here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_down_atac.tsv\), sep = \\t\)



### HEATMAP
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_up_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_no_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_down_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody)) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio)
colnames(temp.up) <- c(\target\, \OR_up\)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio)
colnames(temp.no) <- c(\target\, \OR_no\)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio)
colnames(temp.down) <- c(\target\, \OR_down\)


temp <- full_join(full_join(temp.up, temp.no, by = c(\target\)), temp.down, by = c(\target\)) %>% mutate_all(~replace_na(., 1))

data <- as.matrix(temp[2:4])
rownames(data) <- temp$target

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  row_km = 4,                         # Define the number of k-means clusters for rows (adjust as needed)
  show_row_dend = FALSE,
  col = col_fun                       # Use the red gradient color scale
)

fileName <- paste0(\anchorLOLA_A485_vs_DMSO_diff0.2_regAnchorBackground_atac\)
height <- 7
width <- 3.5
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()


### Visualizing p-value and OR
alpha <- 0.05
tb.up <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_up_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \UP\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.no <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_no_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \NO\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)
tb.down <- fread(here(lolaDir, \LOLA_A485_vs_DMSO_diff0.2_down_atac.tsv\)) %>%
  dplyr::mutate(target = toupper(antibody),
                qValueLog = -log2(qValue),
                group = \DOWN\) %>%
  filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
  dplyr::filter(qValue < alpha) %>% dplyr::group_by(target) %>%
  slice_min(meanRnk, with_ties = FALSE)

temp.up <- tb.up %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.no <- tb.no %>% dplyr::select(target, oddsRatio, qValueLog, group)
temp.down <- tb.down %>% dplyr::select(target, oddsRatio, qValueLog, group)

temp <- bind_rows(temp.up, temp.down)

order <- c((temp %>% dplyr::filter(group == \UP\) %>% arrange(desc(oddsRatio)))$target, 
           (temp %>% dplyr::filter(group == \DOWN\) %>% arrange(desc(oddsRatio)))$target)
temp$target <- factor(temp$target, levels = rev(order))
p <- ggplot(temp, aes(x = group, y = target, color = qValueLog, size = oddsRatio)) +
  geom_point() + theme_bw() + scale_color_gradient(low = \blue\, high = \red\) +
  labs(x = NULL, y = NULL)  +
  theme(axis.text = element_text(size = 6),  # Set axis text size
        axis.title = element_text(size = 6), # Set axis title size (if not removed)
        legend.text = element_text(size = 6), # Set legend text size
        legend.title = element_text(size = 6)) 

fileName <- paste0(\anchorLOLA_A485_vs_DMSO_diff0.2_OR_qValue_regAnchorBackground_atac\)
height <-3
width <- 2
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### - Limited to ATAC-seq signal, reg loop backgrouund 

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1nU1cxd2IzSjBhVzVuSUdkeWIzVndjMXh1WjNKdmRYQXhJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNERXVkSE4yWENJcEtTUm5aVzVsWEc1bmNtOTFjRElnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJkeWIzVndNaTUwYzNaY0lpa3BKR2RsYm1WY2JtZHliM1Z3TlNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0puWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlozSnZkWEExTG5SemRsd2lLU2trWjJWdVpWeHVaM0p2ZFhBNElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RndWRITjJYQ0lwS1NSblpXNWxYRzVjYmlNaklFbHRjRzl5ZEdsdVp5QlNUa0V0YzJWeElGUlFUU0JtYjNJZ1JFMVRUMXh1ZEhCdExuTmxiR1ZqZEdWa0lEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW5KbFlXUkRiM1Z1ZEM1bWFXeDBaWEpsWkM1VVVFMHVZV3hzTG5SemRsd2lLU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvTVN3Z015d2dOQ3dnTlNsY2JtTnZiRzVoYldWektIUndiUzV6Wld4bFkzUmxaQ2tnUEMwZ1l5aGNJbVZ1YzJWdFlteGNJaXdnWENKeVpYQXhYQ0lzSUZ3aWNtVndNbHdpTENCY0luSmxjRE5jSWlsY2JseHVkSEJ0TG5ObGJHVmpkR1ZrSUR3dElIUndiUzV6Wld4bFkzUmxaQ0FsUGlVZ1pIQnNlWEk2T25KdmQzZHBjMlVvS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnWjNKdmRYQWdQU0JwWm1Wc2MyVW9aVzV6WlcxaWJDQWxhVzRsSUdkeWIzVndNU3dnWENKbmNtOTFjREZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dWdWMyVnRZbXdnSldsdUpTQm5jbTkxY0RJc0lGd2laM0p2ZFhBeVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd05Td2dYQ0puY205MWNEVmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd09Dd2dYQ0puY205MWNEaGNJaXdnVGtFcEtTa3BLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcG1hV3gwWlhJb0lXbHpMbTVoS0dkeWIzVndLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1lYWm5WRkJOSUQwZ2JXVmhiaWh5WlhBeExDQnlaWEF5TENCeVpYQXpLU2xjYmx4dVhHNW5aM0JzYjNRb2RIQnRMbk5sYkdWamRHVmtMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnWVhablZGQk5LU2tnSzF4dUlDQm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUdkeWIzVndLU3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0sxeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnS3lCY2JpQWdjMk5oYkdWZmVWOXNiMmN4TUNncElDdGNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BYRzVjYmx4dVhHNGdJSEFnUEMwZ1oyZHdiRzkwS0hSbGJYQXVkR0lzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCelkyOXlaU2twSUNzZ1oyVnZiVjkyYVc5c2FXNG9ZV1Z6S0dacGJHd2dQU0JuY205MWNDa3NJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ1hHNGdJQ0FnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUN0Y2JpQWdJQ0J6ZEdGMFgzTjFiVzFoY25rb1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMQ0JuWlc5dElEMGdYQ0p3YjJsdWRGd2lMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ3aWNtVmtYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpS1NBclhHNGdJQ0FnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLSGx0YVc0c0lIbHRZWGdwS1NBclhHNGdJQ0FnWVc1dWIzUmhkR1VvWENKMFpYaDBYQ0lzSUhnZ1BTQXhMQ0I1SUQwZ2VXMXBiaUFySURFc0lHeGhZbVZzSUQwZ2NHRnpkR1V3S0Z3aWNERXlPaUJjSWl3Z1kyOXVkbEIyWVd4MVpTaHdNVElwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3TVRVNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hBeE5Ta3NJRndpWEZ4dVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luQXhPRG9nWENJc0lHTnZiblpRZG1Gc2RXVW9jREU0S1N3Z1hDSmNYRzVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0RJMU9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod01qVXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndNamc2SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEF5T0Nrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5BMU9Eb2dYQ0lzWTI5dWRsQjJZV3gxWlNnZ2NEVTRLU3dnWENKY1hHNWNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE1wWEc0Z0lGeHVJQ0JjYmlBZ1ptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2lhVzV6ZFd4aGRHbHZibDl6WTI5eVpWOWNJaXdnYm05MFpTbGNiaUFnYUdWcFoyaDBJRHd0SUROY2JpQWdkMmxrZEdnZ1BDMGdNMXh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0J6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbiMjIEltcG9ydGluZyBncm91cHNcbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDIudHN2XFwpKSRnZW5lXG5ncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwNS50c3ZcXCkpJGdlbmVcbmdyb3VwOCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA4LnRzdlxcKSkkZ2VuZVxuXG4jIyBJbXBvcnRpbmcgUk5BLXNlcSBUUE0gZm9yIERNU09cbnRwbS5zZWxlY3RlZCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxyZWFkQ291bnQuZmlsdGVyZWQuVFBNLmFsbC50c3ZcXCkpICU+JSBkcGx5cjo6c2VsZWN0KDEsIDMsIDQsIDUpXG5jb2xuYW1lcyh0cG0uc2VsZWN0ZWQpIDwtIGMoXFxlbnNlbWJsXFwsIFxccmVwMVxcLCBcXHJlcDJcXCwgXFxyZXAzXFwpXG5cbnRwbS5zZWxlY3RlZCA8LSB0cG0uc2VsZWN0ZWQgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDEsIFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAyLCBcXGdyb3VwMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDUsIFxcZ3JvdXA1XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDgsIFxcZ3JvdXA4XFwsIE5BKSkpKSkgJT4lIFxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGF2Z1RQTSA9IG1lYW4ocmVwMSwgcmVwMiwgcmVwMykpXG5cblxuZ2dwbG90KHRwbS5zZWxlY3RlZCwgYWVzKHggPSBncm91cCwgeSA9IGF2Z1RQTSkpICtcbiAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgXG4gIHNjYWxlX3lfbG9nMTAoKSArXG4gIHRoZW1lX2NsYXNzaWMoKVxuXG5cblxuICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5bWluLCB5bWF4KSkgK1xuICAgIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IHltaW4gKyAxLCBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE1OiBcXCwgY29udlB2YWx1ZShwMTUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTg6IFxcLCBjb252UHZhbHVlKHAxOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyNTogXFwsIGNvbnZQdmFsdWUocDI1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI4OiBcXCwgY29udlB2YWx1ZShwMjgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwNTg6IFxcLGNvbnZQdmFsdWUoIHA1OCksIFxcXFxuXFwpLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuICBcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25fc2NvcmVfXFwsIG5vdGUpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDNcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
## Importing groups
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene

## Importing RNA-seq TPM for DMSO
tpm.selected <- fread(here(refDir, \readCount.filtered.TPM.all.tsv\)) %>% dplyr::select(1, 3, 4, 5)
colnames(tpm.selected) <- c(\ensembl\, \rep1\, \rep2\, \rep3\)

tpm.selected <- tpm.selected %>% dplyr::rowwise() %>%
  dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\,
                        ifelse(ensembl %in% group5, \group5\,
                               ifelse(ensembl %in% group8, \group8\, NA))))) %>% 
  dplyr::filter(!is.na(group)) %>%
  dplyr::mutate(avgTPM = mean(rep1, rep2, rep3))


ggplot(tpm.selected, aes(x = group, y = avgTPM)) +
  geom_violin(aes(fill = group), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + 
  scale_y_log10() +
  theme_classic()



  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWdTVzF3YjNKMGFXNW5JR2R5YjNWd2MxeHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdkbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RFdWRITjJYRndwS1NSblpXNWxYRzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1oyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd01pNTBjM1pjWENrcEpHZGxibVZjYm1keWIzVndOU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeG5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQTFMblJ6ZGx4Y0tTa2taMlZ1WlZ4dVozSnZkWEE0SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjRGd1ZEhOMlhGd3BLU1JuWlc1bFhHNWNiaU1qSUVsdGNHOXlkR2x1WnlCU1RrRXRjMlZ4SUZSUVRTQm1iM0lnUkUxVFQxeHVkSEJ0TG5ObGJHVmpkR1ZrSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYSEpsWVdSRGIzVnVkQzVtYVd4MFpYSmxaQzVVVUUwdVlXeHNMblJ6ZGx4Y0tTa2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9NU3dnTXl3Z05Dd2dOU2xjYm1OdmJHNWhiV1Z6S0hSd2JTNXpaV3hsWTNSbFpDa2dQQzBnWXloY1hHVnVjMlZ0WW14Y1hDd2dYRnh5WlhBeFhGd3NJRnhjY21Wd01seGNMQ0JjWEhKbGNETmNYQ2xjYmx4dWRIQnRMbk5sYkdWamRHVmtJRHd0SUhSd2JTNXpaV3hsWTNSbFpDQWxQaVVnWkhCc2VYSTZPbkp2ZDNkcGMyVW9LU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoY2JpQWdaM0p2ZFhBZ1BTQnBabVZzYzJVb1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd01Td2dYRnhuY205MWNERmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR1Z1YzJWdFltd2dKV2x1SlNCbmNtOTFjRElzSUZ4Y1ozSnZkWEF5WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWlc1elpXMWliQ0FsYVc0bElHZHliM1Z3TlN3Z1hGeG5jbTkxY0RWY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWlc1elpXMWliQ0FsYVc0bElHZHliM1Z3T0N3Z1hGeG5jbTkxY0RoY1hDd2dUa0VwS1NrcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvSVdsekxtNWhLR2R5YjNWd0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWVhablZGQk5JRDBnYldWaGJpaHlaWEF4TENCeVpYQXlMQ0J5WlhBektTbGNibHh1WEc1blozQnNiM1FvZEhCdExuTmxiR1ZqZEdWa0xDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdZWFpuVkZCTktTa2dLMXh1SUNCblpXOXRYM1pwYjJ4cGJpaGhaWE1vWm1sc2JDQTlJR2R5YjNWd0tTd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnSzF4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUJjYmlBZ2MyTmhiR1ZmZVY5c2IyY3hNQ2dwSUN0Y2JpQWdkR2hsYldWZlkyeGhjM05wWXlncFhHNWNibHh1WEc0Z0lIQWdQQzBnWjJkd2JHOTBLSFJsYlhBdWRHSXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0J6WTI5eVpTa3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQm5jbTkxY0Nrc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnWEc0Z0lDQWdaMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0eExDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRXBJQ3RjYmlBZ0lDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hGeHdiMmx1ZEZ4Y0xDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRnhjY21Wa1hGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNLU0FyWEc0Z0lDQWdkR2hsYldWZlkyeGhjM05wWXlncElDc2dZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktIbHRhVzRzSUhsdFlYZ3BLU0FyWEc0Z0lDQWdZVzV1YjNSaGRHVW9YRngwWlhoMFhGd3NJSGdnUFNBeExDQjVJRDBnZVcxcGJpQXJJREVzSUd4aFltVnNJRDBnY0dGemRHVXdLRnhjY0RFeU9pQmNYQ3dnWTI5dWRsQjJZV3gxWlNod01USXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdNVFU2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEF4TlNrc0lGeGNYRnh1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhBeE9Eb2dYRndzSUdOdmJuWlFkbUZzZFdVb2NERTRLU3dnWEZ4Y1hHNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjREkxT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3TWpVcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d01qZzZJRnhjTENCamIyNTJVSFpoYkhWbEtIQXlPQ2tzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEExT0RvZ1hGd3NZMjl1ZGxCMllXeDFaU2dnY0RVNEtTd2dYRnhjWEc1Y1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETXBYRzRnSUZ4dUlDQmNiaUFnWm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y2FXNXpkV3hoZEdsdmJsOXpZMjl5WlY5Y1hDd2dibTkwWlNsY2JpQWdhR1ZwWjJoMElEd3RJRE5jYmlBZ2QybGtkR2dnUEMwZ00xeHVJQ0J3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dUlDQnpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG4jIyBJbXBvcnRpbmcgZ3JvdXBzXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAyLnRzdlxcKSkkZ2VuZVxuZ3JvdXA1IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDUudHN2XFwpKSRnZW5lXG5ncm91cDggPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwOC50c3ZcXCkpJGdlbmVcblxuIyMgSW1wb3J0aW5nIFJOQS1zZXEgVFBNIGZvciBETVNPXG50cG0uc2VsZWN0ZWQgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxccmVhZENvdW50LmZpbHRlcmVkLlRQTS5hbGwudHN2XFwpKSAlPiUgZHBseXI6OnNlbGVjdCgxLCAzLCA0LCA1KVxuY29sbmFtZXModHBtLnNlbGVjdGVkKSA8LSBjKFxcZW5zZW1ibFxcLCBcXHJlcDFcXCwgXFxyZXAyXFwsIFxccmVwM1xcKVxuXG50cG0uc2VsZWN0ZWQgPC0gdHBtLnNlbGVjdGVkICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAxLCBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMiwgXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA1LCBcXGdyb3VwNVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA4LCBcXGdyb3VwOFxcLCBOQSkpKSkpICU+JSBcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKSAlPiVcbiAgZHBseXI6Om11dGF0ZShhdmdUUE0gPSBtZWFuKHJlcDEsIHJlcDIsIHJlcDMpKVxuXG5cbmdncGxvdCh0cG0uc2VsZWN0ZWQsIGFlcyh4ID0gZ3JvdXAsIHkgPSBhdmdUUE0pKSArXG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIFxuICBzY2FsZV95X2xvZzEwKCkgK1xuICB0aGVtZV9jbGFzc2ljKClcblxuXG5cbiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IHNjb3JlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeW1pbiwgeW1heCkpICtcbiAgICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSB5bWluICsgMSwgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxNTogXFwsIGNvbnZQdmFsdWUocDE1KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDE4OiBcXCwgY29udlB2YWx1ZShwMTgpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjU6IFxcLCBjb252UHZhbHVlKHAyNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAyODogXFwsIGNvbnZQdmFsdWUocDI4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDU4OiBcXCxjb252UHZhbHVlKCBwNTgpLCBcXFxcblxcKSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMylcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxpbnN1bGF0aW9uX3Njb3JlX1xcLCBub3RlKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSAzXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMgSW1wb3J0aW5nIGdyb3Vwc1xuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCkpJGdlbmVcbmdyb3VwNSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdlxcKSkkZ2VuZVxuZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpKSRnZW5lXG5cbiMjIEltcG9ydGluZyBSTkEtc2VxIFRQTSBmb3IgRE1TT1xudHBtLnNlbGVjdGVkIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXHJlYWRDb3VudC5maWx0ZXJlZC5UUE0uYWxsLnRzdlxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoMSwgMywgNCwgNSlcbmNvbG5hbWVzKHRwbS5zZWxlY3RlZCkgPC0gYyhcXGVuc2VtYmxcXCwgXFxyZXAxXFwsIFxccmVwMlxcLCBcXHJlcDNcXClcblxudHBtLnNlbGVjdGVkIDwtIHRwbS5zZWxlY3RlZCAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgZ3JvdXAgPSBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMSwgXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDIsIFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwNSwgXFxncm91cDVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwOCwgXFxncm91cDhcXCwgTkEpKSkpKSAlPiUgXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoYXZnVFBNID0gbWVhbihyZXAxLCByZXAyLCByZXAzKSlcblxuXG5nZ3Bsb3QodHBtLnNlbGVjdGVkLCBhZXMoeCA9IGdyb3VwLCB5ID0gYXZnVFBNKSkgK1xuICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyBcbiAgc2NhbGVfeV9sb2cxMCgpICtcbiAgdGhlbWVfY2xhc3NpYygpXG5cblxuXG4gIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArXG4gICAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMTU6IFxcLCBjb252UHZhbHVlKHAxNSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHAxODogXFwsIGNvbnZQdmFsdWUocDE4KSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccDI1OiBcXCwgY29udlB2YWx1ZShwMjUpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwMjg6IFxcLCBjb252UHZhbHVlKHAyOCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHA1ODogXFwsY29udlB2YWx1ZSggcDU4KSwgXFxcXG5cXCksXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbl9zY29yZV9cXCwgbm90ZSlcbiAgaGVpZ2h0IDwtIDNcbiAgd2lkdGggPC0gM1xuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
## Importing groups
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene

## Importing RNA-seq TPM for DMSO
tpm.selected <- fread(here(refDir, \readCount.filtered.TPM.all.tsv\)) %>% dplyr::select(1, 3, 4, 5)
colnames(tpm.selected) <- c(\ensembl\, \rep1\, \rep2\, \rep3\)

tpm.selected <- tpm.selected %>% dplyr::rowwise() %>%
  dplyr::mutate(
  group = ifelse(ensembl %in% group1, \group1\,
                 ifelse(ensembl %in% group2, \group2\,
                        ifelse(ensembl %in% group5, \group5\,
                               ifelse(ensembl %in% group8, \group8\, NA))))) %>% 
  dplyr::filter(!is.na(group)) %>%
  dplyr::mutate(avgTPM = mean(rep1, rep2, rep3))


ggplot(tpm.selected, aes(x = group, y = avgTPM)) +
  geom_violin(aes(fill = group), show.legend = FALSE) +
  geom_boxplot(width = 0.1, outlier.shape = NA) + 
  scale_y_log10() +
  theme_classic()



  p <- ggplot(temp.tb, aes(x = group, y = score)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + coord_cartesian(ylim = c(ymin, ymax)) +
    annotate(\text\, x = 1, y = ymin + 1, label = paste0(\p12: \, convPvalue(p12), \\n\,
                                                         \p15: \, convPvalue(p15), \\n\,
                                                         \p18: \, convPvalue(p18), \\n\,
                                                         \p25: \, convPvalue(p25), \\n\,
                                                         \p28: \, convPvalue(p28), \\n\,
                                                         \p58: \,convPvalue( p58), \\n\),
             color = \black\, hjust = 0, size = 3)
  
  
  fileName <- paste0(\insulation_score_\, note)
  height <- 3
  width <- 3
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1nU1cxd2IzSjBhVzVuSUdkeWIzVndjMXh1WjNKdmRYQXhJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNERXVkSE4yWENJcEtTUm5aVzVsWEc1bmNtOTFjRElnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJkeWIzVndNaTUwYzNaY0lpa3BKR2RsYm1WY2JtZHliM1Z3TlNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0puWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlozSnZkWEExTG5SemRsd2lLU2trWjJWdVpWeHVaM0p2ZFhBNElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RndWRITjJYQ0lwS1NSblpXNWxYRzVjYmx4dUl5TWdTVzF3YjNKMGFXNW5JRUp2WW1KcFpTQm5aVzVsSUdOc1lYTnphV1pwWTJGMGFXOXVYRzVuWlc1bFEyeDFjM1JsY2lBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0ppYjJKaWFXVmZaMlZ1WlY5amJHRnpjMmxtYVdOaGRHbHZiaTVqYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dkbGJtVXNJR1Z1YzNRc0lFTnNkWE4wWlhJcFhHNWpiMnh1WVcxbGN5aG5aVzVsUTJ4MWMzUmxjaWtnUEMwZ1l5aGNJbWRsYm1WY0lpd2dYQ0psYm5ObGJXSnNYM1J5WVc1elkzSnBjSFJmYVdSY0lpd2dYQ0pqYkhWemRHVnlYQ0lwWEc1Y2JseHVJeU1nUTI5dWRtVnlkR2x1WnlCMGNtRnVjMk55YVhCMElFbEVJSFJ2SUdkbGJtVWdTVVJjYm1sa1VHRnBjbDkwWnlBOExTQm5aWFJDVFNoaGRIUnlhV0oxZEdWeklEMGdZeWhjSW1WdWMyVnRZbXhmZEhKaGJuTmpjbWx3ZEY5cFpGd2lMQ0JjSW1WdWMyVnRZbXhmWjJWdVpWOXBaRndpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptbHNkR1Z5Y3lBOUlGd2laVzV6WlcxaWJGOTBjbUZ1YzJOeWFYQjBYMmxrWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhiSFZsY3lBOUlHZGxibVZEYkhWemRHVnlKR1Z1YzJWdFlteGZkSEpoYm5OamNtbHdkQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYldGeWRDQTlJR1Z1YzJWdFltd3VkakV3TWlsY2JtZGxibVZEYkhWemRHVnlJRHd0SUdkbGJtVkRiSFZ6ZEdWeUlDVStKU0JrY0d4NWNqbzZiR1ZtZEY5cWIybHVLR2xrVUdGcGNsOTBaeXdnWW5rZ1BTQmpLRndpWlc1elpXMWliRjkwY21GdWMyTnlhWEIwWDJsa1hDSXBLVnh1WEc0aklFMWhhMmx1WnlCa1lYUmhJR1p2Y2lCemRHRmphMlZrSUdKaGNuQnNiM1JjYm1OdmRXNTBSMlZ1WlNBOExTQm1kVzVqZEdsdmJpaG5aVzVsUTJ4MWMzUmxjaXdnWjNKdmRYQk9ZVzFsTENCamJIVnpkR1Z5VG1GdFpTbDdYRzRnSUc1MWJTQThMU0J1Y205M0tHZGxibVZEYkhWemRHVnlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR1Z1YzJWdFlteGZaMlZ1WlY5cFpDQWxhVzRsSUdkeWIzVndUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyeDFjM1JsY2lBbGFXNGxJR05zZFhOMFpYSk9ZVzFsS1NsY2JpQWdjbVYwZFhKdUtHNTFiU2xjYm4xY2JtTnZkVzUwUjJWdVpVeHBjM1FnUEMwZ1puVnVZM1JwYjI0b1oyVnVaVU5zZFhOMFpYSXNJR2R5YjNWd1RtRnRaU2w3WEc0Z0lHNHhJRHd0SUdOdmRXNTBSMlZ1WlNoblpXNWxRMngxYzNSbGNpd2daM0p2ZFhCT1lXMWxMQ0JjSWtWaGNteDVYQ0lwWEc0Z0lHNHlJRHd0SUdOdmRXNTBSMlZ1WlNoblpXNWxRMngxYzNSbGNpd2daM0p2ZFhCT1lXMWxMQ0JjSWsxcFpHUnNaVndpS1Z4dUlDQnVNeUE4TFdOdmRXNTBSMlZ1WlNoblpXNWxRMngxYzNSbGNpd2daM0p2ZFhCT1lXMWxMQ0JjSWt4aGRHVmNJaWxjYmlBZ2JqUWdQQzBnWTI5MWJuUkhaVzVsS0dkbGJtVkRiSFZ6ZEdWeUxDQm5jbTkxY0U1aGJXVXNJRndpVkhKaGJuTnBaVzUwWENJcFhHNGdJSEpsZEhWeWJpaGpLRzR4TENCdU1pd2diak1zSUc0MEtTbGNibjFjYmx4dVozSnZkWEFnUEMwZ1l5aHlaWEFvWENKbmNtOTFjREZjSWl3Z05Da3NJSEpsY0NoY0ltZHliM1Z3TWx3aUxDQTBLU3dnY21Wd0tGd2laM0p2ZFhBelhDSXNJRFFwTENCeVpYQW9YQ0puY205MWNEUmNJaXdnTkNrcFhHNWpiSFZ6ZEdWeUlEd3RJSEpsY0NoaktGd2lSV0Z5YkhsY0lpd2dYQ0pOYVdSa2JHVmNJaXdnWENKTVlYUmxYQ0lzSUZ3aVZISmhibk5wWlc1MFhDSXBMQ0EwS1Z4dVkyeDFjM1JsY2lBOExTQm1ZV04wYjNJb1kyeDFjM1JsY2l3Z2JHVjJaV3h6SUQwZ1l5aGNJa1ZoY214NVhDSXNJRndpVFdsa1pHeGxYQ0lzSUZ3aVRHRjBaVndpTENCY0lsUnlZVzV6YVdWdWRGd2lLU2xjYm5aaGJIVmxJRHd0SUdNb1kyOTFiblJIWlc1bFRHbHpkQ2huWlc1bFEyeDFjM1JsY2l3Z1ozSnZkWEF4S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdZMjkxYm5SSFpXNWxUR2x6ZENoblpXNWxRMngxYzNSbGNpd2daM0p2ZFhBeUtTeGNiaUFnSUNBZ0lDQWdJQ0FnWTI5MWJuUkhaVzVsVEdsemRDaG5aVzVsUTJ4MWMzUmxjaXdnWjNKdmRYQTFLU3hjYmlBZ0lDQWdJQ0FnSUNBZ1kyOTFiblJIWlc1bFRHbHpkQ2huWlc1bFEyeDFjM1JsY2l3Z1ozSnZkWEE0S1NsY2JseHVaR0YwWVNBOExTQmtZWFJoTG1aeVlXMWxLR2R5YjNWd0xDQmpiSFZ6ZEdWeUxDQjJZV3gxWlNsY2JseHVYRzRqSUZCc2IzUjBhVzVuWEc1blozQnNiM1FvWkdGMFlTd2dZV1Z6S0dacGJHdzlZMngxYzNSbGNpd2dlVDEyWVd4MVpTd2dlRDFuY205MWNDa3BJQ3NnWEc0Z0lDQWdaMlZ2YlY5aVlYSW9jRzl6YVhScGIyNDlYQ0ptYVd4c1hDSXNJSE4wWVhROVhDSnBaR1Z1ZEdsMGVWd2lLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LVnh1WEc1Y2JpTWdVM1JoZEdsemRHbGpZV3dnWVc1aGJIbHphWE1nWEc0aklGTnBiV2xzWVhJZ2RHOGdkR2hsSUVOb2FTMVRjWFZoY21VZ2RHVnpkQ3dnUm1semFHVnk0b0NaY3lCRmVHRmpkQ0JVWlhOMElHbHpJSFZ6WldRZ2QyaGxiaUI1YjNVZ2FHRjJaU0J6YldGc2JHVnlJSE5oYlhCc1pTQnphWHBsY3lCdmNpQjNhR1Z1SUhSb1pTQmxlSEJsWTNSbFpDQm1jbVZ4ZFdWdVkza2dhVzRnWVc1NUlHTmxiR3dnYjJZZ2RHaGxJR052Ym5ScGJtZGxibU41SUhSaFlteGxJR2x6SUdKbGJHOTNJRFV1WEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ0pXbHVKU0JqS0Z3aVozSnZkWEF4WENJc0lGd2laM0p2ZFhBeVhDSXBLVnh1WTI5dWRHbHVaMlZ1WTNsZmRHRmliR1VnUEMwZ2VIUmhZbk1vZG1Gc2RXVWdmaUJuY205MWNDQXJJR05zZFhOMFpYSXNJR1JoZEdFZ1BTQjBaVzF3S1Z4dVptbHphR1Z5WDNKbGMzVnNkQ0E4TFNCbWFYTm9aWEl1ZEdWemRDaGpiMjUwYVc1blpXNWplVjkwWVdKc1pTd2djMmx0ZFd4aGRHVXVjQzUyWVd4MVpTQTlJRlJTVlVVc0lFSWdQU0F4TURBd01EQXBYRzVtYVhOb1pYSmZjbVZ6ZFd4MFhHNWNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0FsYVc0bElHTW9YQ0puY205MWNERmNJaXdnWENKbmNtOTFjRE5jSWlrcFhHNWpiMjUwYVc1blpXNWplVjkwWVdKc1pTQThMU0I0ZEdGaWN5aDJZV3gxWlNCK0lHZHliM1Z3SUNzZ1kyeDFjM1JsY2l3Z1pHRjBZU0E5SUhSbGJYQXBYRzVtYVhOb1pYSmZjbVZ6ZFd4MElEd3RJR1pwYzJobGNpNTBaWE4wS0dOdmJuUnBibWRsYm1ONVgzUmhZbXhsTENCemFXMTFiR0YwWlM1d0xuWmhiSFZsSUQwZ1ZGSlZSU3dnUWlBOUlERXdNREF3TUNsY2JtWnBjMmhsY2w5eVpYTjFiSFJjYmx4dWRHVnRjQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lDVnBiaVVnWXloY0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd05Gd2lLU2xjYm1OdmJuUnBibWRsYm1ONVgzUmhZbXhsSUR3dElIaDBZV0p6S0haaGJIVmxJSDRnWjNKdmRYQWdLeUJqYkhWemRHVnlMQ0JrWVhSaElEMGdkR1Z0Y0NsY2JtWnBjMmhsY2w5eVpYTjFiSFFnUEMwZ1ptbHphR1Z5TG5SbGMzUW9ZMjl1ZEdsdVoyVnVZM2xmZEdGaWJHVXNJSE5wYlhWc1lYUmxMbkF1ZG1Gc2RXVWdQU0JVVWxWRkxDQkNJRDBnTVRBd01EQXdLVnh1Wm1semFHVnlYM0psYzNWc2RGeHVYRzVjYmlNakl5QlFMVTVjYm5KbGMzVnNkRVJwY2lBOExTQm9aWEpsS0Z3aUxpNHZMaTR2Y21WemRXeDBYQ0lwWEc1MFpXMXdNaUE4TFNCeVpXRmtVa1JUS0dobGNtVW9jbVZ6ZFd4MFJHbHlMQ0JjSW1kbGJtVmZiRzl2Y0Y5c2FXNXJMbkprYzF3aUtTbGNibHh1Y0c1UGRtVnlPQ0E4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvZEc5MFlXd2dQajBnT0NrcEpHZGxibVZjYm5CdVQzWmxjallnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hSdmRHRnNJRDQ5SURZc0lIUnZkR0ZzSUR3Z09Da3BKR2RsYm1WY2JuQnVUM1psY2pRZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIUnZkR0ZzSUQ0OUlEUXNJSFJ2ZEdGc0lEd2dOaWtwSkdkbGJtVmNibkJ1VDNabGNqSWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSFJ2ZEdGc0lENDlJRElzSUhSdmRHRnNJRHdnTkNrcEpHZGxibVZjYm5CdVQzWmxjakFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hSdmRHRnNJRHdnTWlrcEpHZGxibVZjYmx4dVozSnZkWEFnUEMwZ1l5aHlaWEFvWENKd2JrOTJaWEk0WENJc0lEUXBMQ0J5WlhBb1hDSndiazkyWlhJMlhDSXNJRFFwTENCeVpYQW9YQ0p3Yms5MlpYSTBYQ0lzSURRcExDQnlaWEFvWENKd2JrOTJaWEl5WENJc0lEUXBMQ0J5WlhBb1hDSndiazkyWlhJd1hDSXNJRFFwS1Z4dVkyeDFjM1JsY2lBOExTQnlaWEFvWXloY0lrVmhjbXg1WENJc0lGd2lUV2xrWkd4bFhDSXNJRndpVEdGMFpWd2lMQ0JjSWxSeVlXNXphV1Z1ZEZ3aUtTd2dOU2xjYm1Oc2RYTjBaWElnUEMwZ1ptRmpkRzl5S0dOc2RYTjBaWElzSUd4bGRtVnNjeUE5SUdNb1hDSkZZWEpzZVZ3aUxDQmNJazFwWkdSc1pWd2lMQ0JjSWt4aGRHVmNJaXdnWENKVWNtRnVjMmxsYm5SY0lpa3BYRzUyWVd4MVpTQThMU0JqS0dOdmRXNTBSMlZ1WlV4cGMzUW9aMlZ1WlVOc2RYTjBaWElzSUhCdVQzWmxjamdwTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQndiazkyWlhJMktTeGNiaUFnSUNBZ0lDQWdJQ0FnWTI5MWJuUkhaVzVsVEdsemRDaG5aVzVsUTJ4MWMzUmxjaXdnY0c1UGRtVnlOQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lHTnZkVzUwUjJWdVpVeHBjM1FvWjJWdVpVTnNkWE4wWlhJc0lIQnVUM1psY2pJcExGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0J3Yms5MlpYSXdLU2xjYmx4dVpHRjBZU0E4TFNCa1lYUmhMbVp5WVcxbEtHZHliM1Z3TENCamJIVnpkR1Z5TENCMllXeDFaU2xjYmlNZ1VHeHZkSFJwYm1kY2JtZG5jR3h2ZENoa1lYUmhMQ0JoWlhNb1ptbHNiRDFqYkhWemRHVnlMQ0I1UFhaaGJIVmxMQ0I0UFdkeWIzVndLU2tnS3lCY2JpQWdJQ0JuWlc5dFgySmhjaWh3YjNOcGRHbHZiajFjSW1acGJHeGNJaXdnYzNSaGREMWNJbWxrWlc1MGFYUjVYQ0lwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwWEc1Y2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQWxhVzRsSUdNb1hDSndiazkyWlhJeVhDSXNJRndpY0c1UGRtVnlPRndpS1NsY2JtTnZiblJwYm1kbGJtTjVYM1JoWW14bElEd3RJSGgwWVdKektIWmhiSFZsSUg0Z1ozSnZkWEFnS3lCamJIVnpkR1Z5TENCa1lYUmhJRDBnZEdWdGNDbGNibVpwYzJobGNsOXlaWE4xYkhRZ1BDMGdabWx6YUdWeUxuUmxjM1FvWTI5dWRHbHVaMlZ1WTNsZmRHRmliR1VzSUhOcGJYVnNZWFJsTG5BdWRtRnNkV1VnUFNCVVVsVkZMQ0JDSUQwZ01UQXdNREF3S1Z4dVptbHphR1Z5WDNKbGMzVnNkRnh1WEc0akl5TWdVQzFUWEc1d2MwOTJaWEkwSUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSE1nUGowZ05Da3BKR2RsYm1WY2JuQnpUM1psY2pNZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y3lBK1BTQXpMQ0J1ZFcxZmNITWdQQ0EwS1Nra1oyVnVaVnh1Y0hOUGRtVnlNaUE4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQnpJRDQ5SURJc0lHNTFiVjl3Y3lBOElETXBLU1JuWlc1bFhHNXdjMDkyWlhJeElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hNZ1BqMGdNU3dnYm5WdFgzQnpJRHdnTWlrcEpHZGxibVZjYm5CelQzWmxjakFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjeUE4SURFcEtTUm5aVzVsWEc1Y2JtZHliM1Z3SUR3dElHTW9jbVZ3S0Z3aWNITlBkbVZ5TkZ3aUxDQTBLU3dnY21Wd0tGd2ljSE5QZG1WeU0xd2lMQ0EwS1N3Z2NtVndLRndpY0hOUGRtVnlNbHdpTENBMEtTd2djbVZ3S0Z3aWNITlBkbVZ5TVZ3aUxDQTBLU3dnY21Wd0tGd2ljSE5QZG1WeU1Gd2lMQ0EwS1NsY2JtTnNkWE4wWlhJZ1BDMGdjbVZ3S0dNb1hDSkZZWEpzZVZ3aUxDQmNJazFwWkdSc1pWd2lMQ0JjSWt4aGRHVmNJaXdnWENKVWNtRnVjMmxsYm5SY0lpa3NJRFVwWEc1amJIVnpkR1Z5SUR3dElHWmhZM1J2Y2loamJIVnpkR1Z5TENCc1pYWmxiSE1nUFNCaktGd2lSV0Z5YkhsY0lpd2dYQ0pOYVdSa2JHVmNJaXdnWENKTVlYUmxYQ0lzSUZ3aVZISmhibk5wWlc1MFhDSXBLVnh1ZG1Gc2RXVWdQQzBnWXloamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCd2MwOTJaWEkwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdZMjkxYm5SSFpXNWxUR2x6ZENoblpXNWxRMngxYzNSbGNpd2djSE5QZG1WeU15a3NYRzRnSUNBZ0lDQWdJQ0FnSUdOdmRXNTBSMlZ1WlV4cGMzUW9aMlZ1WlVOc2RYTjBaWElzSUhCelQzWmxjaklwTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQndjMDkyWlhJeEtTeGNiaUFnSUNBZ0lDQWdJQ0FnWTI5MWJuUkhaVzVsVEdsemRDaG5aVzVsUTJ4MWMzUmxjaXdnY0hOUGRtVnlNQ2twWEc1Y2JtUmhkR0VnUEMwZ1pHRjBZUzVtY21GdFpTaG5jbTkxY0N3Z1kyeDFjM1JsY2l3Z2RtRnNkV1VwWEc0aklGQnNiM1IwYVc1blhHNW5aM0JzYjNRb1pHRjBZU3dnWVdWektHWnBiR3c5WTJ4MWMzUmxjaXdnZVQxMllXeDFaU3dnZUQxbmNtOTFjQ2twSUNzZ1hHNGdJQ0FnWjJWdmJWOWlZWElvY0c5emFYUnBiMjQ5WENKbWFXeHNYQ0lzSUhOMFlYUTlYQ0pwWkdWdWRHbDBlVndpS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1Z4dWRHVnRjQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lDVnBiaVVnWXloY0luQnpUM1psY2pKY0lpd2dYQ0p3YzA5MlpYSTBYQ0lwS1Z4dVkyOXVkR2x1WjJWdVkzbGZkR0ZpYkdVZ1BDMGdlSFJoWW5Nb2RtRnNkV1VnZmlCbmNtOTFjQ0FySUdOc2RYTjBaWElzSUdSaGRHRWdQU0IwWlcxd0tWeHVabWx6YUdWeVgzSmxjM1ZzZENBOExTQm1hWE5vWlhJdWRHVnpkQ2hqYjI1MGFXNW5aVzVqZVY5MFlXSnNaU3dnYzJsdGRXeGhkR1V1Y0M1MllXeDFaU0E5SUZSU1ZVVXNJRUlnUFNBeE1EQXdNREFwWEc1bWFYTm9aWEpmY21WemRXeDBYRzVjYmlNakl5QlFMVVZjYm5CbFQzWmxjalFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdaU0ErUFNBMEtTa2taMlZ1WlZ4dWNHVlBkbVZ5TXlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0JsSUQ0OUlETXNJRzUxYlY5d1pTQThJRFFwS1NSblpXNWxYRzV3WlU5MlpYSXlJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNHVWdQajBnTWl3Z2JuVnRYM0JsSUR3Z015a3BKR2RsYm1WY2JuQmxUM1psY2pFZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3WlNBK1BTQXhMQ0J1ZFcxZmNHVWdQQ0F5S1Nra1oyVnVaVnh1Y0dWUGRtVnlNQ0E4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQmxJRHdnTVNrcEpHZGxibVZjYmx4dVozSnZkWEFnUEMwZ1l5aHlaWEFvWENKd1pVOTJaWEkwWENJc0lEUXBMQ0J5WlhBb1hDSndaVTkyWlhJelhDSXNJRFFwTENCeVpYQW9YQ0p3WlU5MlpYSXlYQ0lzSURRcExDQnlaWEFvWENKd1pVOTJaWEl4WENJc0lEUXBMQ0J5WlhBb1hDSndaVTkyWlhJd1hDSXNJRFFwS1Z4dVkyeDFjM1JsY2lBOExTQnlaWEFvWXloY0lrVmhjbXg1WENJc0lGd2lUV2xrWkd4bFhDSXNJRndpVEdGMFpWd2lMQ0JjSWxSeVlXNXphV1Z1ZEZ3aUtTd2dOU2xjYm1Oc2RYTjBaWElnUEMwZ1ptRmpkRzl5S0dOc2RYTjBaWElzSUd4bGRtVnNjeUE5SUdNb1hDSkZZWEpzZVZ3aUxDQmNJazFwWkdSc1pWd2lMQ0JjSWt4aGRHVmNJaXdnWENKVWNtRnVjMmxsYm5SY0lpa3BYRzUyWVd4MVpTQThMU0JqS0dOdmRXNTBSMlZ1WlV4cGMzUW9aMlZ1WlVOc2RYTjBaWElzSUhCbFQzWmxjalFwTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQndaVTkyWlhJektTeGNiaUFnSUNBZ0lDQWdJQ0FnWTI5MWJuUkhaVzVsVEdsemRDaG5aVzVsUTJ4MWMzUmxjaXdnY0dWUGRtVnlNaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lHTnZkVzUwUjJWdVpVeHBjM1FvWjJWdVpVTnNkWE4wWlhJc0lIQmxUM1psY2pFcExGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0J3WlU5MlpYSXdLU2xjYmx4dVpHRjBZU0E4TFNCa1lYUmhMbVp5WVcxbEtHZHliM1Z3TENCamJIVnpkR1Z5TENCMllXeDFaU2xjYmlNZ1VHeHZkSFJwYm1kY2JtZG5jR3h2ZENoa1lYUmhMQ0JoWlhNb1ptbHNiRDFqYkhWemRHVnlMQ0I1UFhaaGJIVmxMQ0I0UFdkeWIzVndLU2tnS3lCY2JpQWdJQ0JuWlc5dFgySmhjaWh3YjNOcGRHbHZiajFjSW1acGJHeGNJaXdnYzNSaGREMWNJbWxrWlc1MGFYUjVYQ0lwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwWEc1Y2JpTWpJeUJRTFZCY2JuQndUM1psY2pRZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y0NBK1BTQTBLU2trWjJWdVpWeHVjSEJQZG1WeU15QThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCd0lENDlJRE1zSUc1MWJWOXdjQ0E4SURRcEtTUm5aVzVsWEc1d2NFOTJaWEl5SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSEFnUGowZ01pd2diblZ0WDNCd0lEd2dNeWtwSkdkbGJtVmNibkJ3VDNabGNqRWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2NDQStQU0F4TENCdWRXMWZjSEFnUENBeUtTa2taMlZ1WlZ4dWNIQlBkbVZ5TUNBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J3SUR3Z01Ta3BKR2RsYm1WY2JseHVaM0p2ZFhBZ1BDMGdZeWh5WlhBb1hDSndjRTkyWlhJMFhDSXNJRFFwTENCeVpYQW9YQ0p3Y0U5MlpYSXpYQ0lzSURRcExDQnlaWEFvWENKd2NFOTJaWEl5WENJc0lEUXBMQ0J5WlhBb1hDSndjRTkyWlhJeFhDSXNJRFFwTENCeVpYQW9YQ0p3Y0U5MlpYSXdYQ0lzSURRcEtWeHVZMngxYzNSbGNpQThMU0J5WlhBb1l5aGNJa1ZoY214NVhDSXNJRndpVFdsa1pHeGxYQ0lzSUZ3aVRHRjBaVndpTENCY0lsUnlZVzV6YVdWdWRGd2lLU3dnTlNsY2JtTnNkWE4wWlhJZ1BDMGdabUZqZEc5eUtHTnNkWE4wWlhJc0lHeGxkbVZzY3lBOUlHTW9YQ0pGWVhKc2VWd2lMQ0JjSWsxcFpHUnNaVndpTENCY0lreGhkR1ZjSWl3Z1hDSlVjbUZ1YzJsbGJuUmNJaWtwWEc1MllXeDFaU0E4TFNCaktHTnZkVzUwUjJWdVpVeHBjM1FvWjJWdVpVTnNkWE4wWlhJc0lIQndUM1psY2pRcExGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0J3Y0U5MlpYSXpLU3hjYmlBZ0lDQWdJQ0FnSUNBZ1kyOTFiblJIWlc1bFRHbHpkQ2huWlc1bFEyeDFjM1JsY2l3Z2NIQlBkbVZ5TWlrc1hHNGdJQ0FnSUNBZ0lDQWdJR052ZFc1MFIyVnVaVXhwYzNRb1oyVnVaVU5zZFhOMFpYSXNJSEJ3VDNabGNqRXBMRnh1SUNBZ0lDQWdJQ0FnSUNCamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCd2NFOTJaWEl3S1NsY2JtUmhkR0VnUEMwZ1pHRjBZUzVtY21GdFpTaG5jbTkxY0N3Z1kyeDFjM1JsY2l3Z2RtRnNkV1VwWEc0aklGQnNiM1IwYVc1blhHNW5aM0JzYjNRb1pHRjBZU3dnWVdWektHWnBiR3c5WTJ4MWMzUmxjaXdnZVQxMllXeDFaU3dnZUQxbmNtOTFjQ2twSUNzZ1hHNGdJQ0FnWjJWdmJWOWlZWElvY0c5emFYUnBiMjQ5WENKbWFXeHNYQ0lzSUhOMFlYUTlYQ0pwWkdWdWRHbDBlVndpS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1Z4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuIyMgSW1wb3J0aW5nIGdyb3Vwc1xuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCkpJGdlbmVcbmdyb3VwNSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdlxcKSkkZ2VuZVxuZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpKSRnZW5lXG5cblxuIyMgSW1wb3J0aW5nIEJvYmJpZSBnZW5lIGNsYXNzaWZpY2F0aW9uXG5nZW5lQ2x1c3RlciA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxib2JiaWVfZ2VuZV9jbGFzc2lmaWNhdGlvbi5jc3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGdlbmUsIGVuc3QsIENsdXN0ZXIpXG5jb2xuYW1lcyhnZW5lQ2x1c3RlcikgPC0gYyhcXGdlbmVcXCwgXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCwgXFxjbHVzdGVyXFwpXG5cblxuIyMgQ29udmVydGluZyB0cmFuc2NyaXB0IElEIHRvIGdlbmUgSURcbmlkUGFpcl90ZyA8LSBnZXRCTShhdHRyaWJ1dGVzID0gYyhcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcLCBcXGVuc2VtYmxfZ2VuZV9pZFxcKSxcbiAgICAgICAgICAgICAgICAgZmlsdGVycyA9IFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwsXG4gICAgICAgICAgICAgICAgIHZhbHVlcyA9IGdlbmVDbHVzdGVyJGVuc2VtYmxfdHJhbnNjcmlwdCxcbiAgICAgICAgICAgICAgICAgbWFydCA9IGVuc2VtYmwudjEwMilcbmdlbmVDbHVzdGVyIDwtIGdlbmVDbHVzdGVyICU+JSBkcGx5cjo6bGVmdF9qb2luKGlkUGFpcl90ZywgYnkgPSBjKFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwpKVxuXG4jIE1ha2luZyBkYXRhIGZvciBzdGFja2VkIGJhcnBsb3RcbmNvdW50R2VuZSA8LSBmdW5jdGlvbihnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBjbHVzdGVyTmFtZSl7XG4gIG51bSA8LSBucm93KGdlbmVDbHVzdGVyICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdyb3VwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciAlaW4lIGNsdXN0ZXJOYW1lKSlcbiAgcmV0dXJuKG51bSlcbn1cbmNvdW50R2VuZUxpc3QgPC0gZnVuY3Rpb24oZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSl7XG4gIG4xIDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXEVhcmx5XFwpXG4gIG4yIDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXE1pZGRsZVxcKVxuICBuMyA8LWNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXExhdGVcXClcbiAgbjQgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcVHJhbnNpZW50XFwpXG4gIHJldHVybihjKG4xLCBuMiwgbjMsIG40KSlcbn1cblxuZ3JvdXAgPC0gYyhyZXAoXFxncm91cDFcXCwgNCksIHJlcChcXGdyb3VwMlxcLCA0KSwgcmVwKFxcZ3JvdXAzXFwsIDQpLCByZXAoXFxncm91cDRcXCwgNCkpXG5jbHVzdGVyIDwtIHJlcChjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpLCA0KVxuY2x1c3RlciA8LSBmYWN0b3IoY2x1c3RlciwgbGV2ZWxzID0gYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSlcbnZhbHVlIDwtIGMoY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXAxKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXAyKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA1KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA4KSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcblxuXG4jIFBsb3R0aW5nXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5cbiMgU3RhdGlzdGljYWwgYW5hbHlzaXMgXG4jIFNpbWlsYXIgdG8gdGhlIENoaS1TcXVhcmUgdGVzdCwgRmlzaGVy4oCZcyBFeGFjdCBUZXN0IGlzIHVzZWQgd2hlbiB5b3UgaGF2ZSBzbWFsbGVyIHNhbXBsZSBzaXplcyBvciB3aGVuIHRoZSBleHBlY3RlZCBmcmVxdWVuY3kgaW4gYW55IGNlbGwgb2YgdGhlIGNvbnRpbmdlbmN5IHRhYmxlIGlzIGJlbG93IDUuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpKVxuY29udGluZ2VuY3lfdGFibGUgPC0geHRhYnModmFsdWUgfiBncm91cCArIGNsdXN0ZXIsIGRhdGEgPSB0ZW1wKVxuZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEIgPSAxMDAwMDApXG5maXNoZXJfcmVzdWx0XG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxncm91cDFcXCwgXFxncm91cDNcXCkpXG5jb250aW5nZW5jeV90YWJsZSA8LSB4dGFicyh2YWx1ZSB+IGdyb3VwICsgY2x1c3RlciwgZGF0YSA9IHRlbXApXG5maXNoZXJfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSwgQiA9IDEwMDAwMClcbmZpc2hlcl9yZXN1bHRcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYyhcXGdyb3VwMVxcLCBcXGdyb3VwNFxcKSlcbmNvbnRpbmdlbmN5X3RhYmxlIDwtIHh0YWJzKHZhbHVlIH4gZ3JvdXAgKyBjbHVzdGVyLCBkYXRhID0gdGVtcClcbmZpc2hlcl9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCBCID0gMTAwMDAwKVxuZmlzaGVyX3Jlc3VsdFxuXG5cbiMjIyBQLU5cbnJlc3VsdERpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0XFwpXG50ZW1wMiA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rLnJkc1xcKSlcblxucG5PdmVyOCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gOCkpJGdlbmVcbnBuT3ZlcjYgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDYsIHRvdGFsIDwgOCkpJGdlbmVcbnBuT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDQsIHRvdGFsIDwgNikpJGdlbmVcbnBuT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDIsIHRvdGFsIDwgNCkpJGdlbmVcbnBuT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsIDwgMikpJGdlbmVcblxuZ3JvdXAgPC0gYyhyZXAoXFxwbk92ZXI4XFwsIDQpLCByZXAoXFxwbk92ZXI2XFwsIDQpLCByZXAoXFxwbk92ZXI0XFwsIDQpLCByZXAoXFxwbk92ZXIyXFwsIDQpLCByZXAoXFxwbk92ZXIwXFwsIDQpKVxuY2x1c3RlciA8LSByZXAoYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSwgNSlcbmNsdXN0ZXIgPC0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCkpXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBuT3ZlcjgpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwbk92ZXI2KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcG5PdmVyNCksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBuT3ZlcjIpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwbk92ZXIwKSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcbiMgUGxvdHRpbmdcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdD1cXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxwbk92ZXIyXFwsIFxccG5PdmVyOFxcKSlcbmNvbnRpbmdlbmN5X3RhYmxlIDwtIHh0YWJzKHZhbHVlIH4gZ3JvdXAgKyBjbHVzdGVyLCBkYXRhID0gdGVtcClcbmZpc2hlcl9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCBCID0gMTAwMDAwKVxuZmlzaGVyX3Jlc3VsdFxuXG4jIyMgUC1TXG5wc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gNCkpJGdlbmVcbnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZVxucHNPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDIsIG51bV9wcyA8IDMpKSRnZW5lXG5wc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMSwgbnVtX3BzIDwgMikpJGdlbmVcbnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lXG5cbmdyb3VwIDwtIGMocmVwKFxccHNPdmVyNFxcLCA0KSwgcmVwKFxccHNPdmVyM1xcLCA0KSwgcmVwKFxccHNPdmVyMlxcLCA0KSwgcmVwKFxccHNPdmVyMVxcLCA0KSwgcmVwKFxccHNPdmVyMFxcLCA0KSlcbmNsdXN0ZXIgPC0gcmVwKGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCksIDUpXG5jbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpKVxudmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwc092ZXI0KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcHNPdmVyMyksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBzT3ZlcjIpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwc092ZXIxKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcHNPdmVyMCkpXG5cbmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpXG4jIFBsb3R0aW5nXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYyhcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpKVxuY29udGluZ2VuY3lfdGFibGUgPC0geHRhYnModmFsdWUgfiBncm91cCArIGNsdXN0ZXIsIGRhdGEgPSB0ZW1wKVxuZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEIgPSAxMDAwMDApXG5maXNoZXJfcmVzdWx0XG5cbiMjIyBQLUVcbnBlT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSA0KSkkZ2VuZVxucGVPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lXG5wZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmVcbnBlT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAxLCBudW1fcGUgPCAyKSkkZ2VuZVxucGVPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmVcblxuZ3JvdXAgPC0gYyhyZXAoXFxwZU92ZXI0XFwsIDQpLCByZXAoXFxwZU92ZXIzXFwsIDQpLCByZXAoXFxwZU92ZXIyXFwsIDQpLCByZXAoXFxwZU92ZXIxXFwsIDQpLCByZXAoXFxwZU92ZXIwXFwsIDQpKVxuY2x1c3RlciA8LSByZXAoYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSwgNSlcbmNsdXN0ZXIgPC0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCkpXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBlT3ZlcjQpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwZU92ZXIzKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcGVPdmVyMiksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBlT3ZlcjEpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwZU92ZXIwKSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcbiMgUGxvdHRpbmdcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdD1cXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cbiMjIyBQLVBcbnBwT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSA0KSkkZ2VuZVxucHBPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lXG5wcE92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmVcbnBwT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAxLCBudW1fcHAgPCAyKSkkZ2VuZVxucHBPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmVcblxuZ3JvdXAgPC0gYyhyZXAoXFxwcE92ZXI0XFwsIDQpLCByZXAoXFxwcE92ZXIzXFwsIDQpLCByZXAoXFxwcE92ZXIyXFwsIDQpLCByZXAoXFxwcE92ZXIxXFwsIDQpLCByZXAoXFxwcE92ZXIwXFwsIDQpKVxuY2x1c3RlciA8LSByZXAoYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSwgNSlcbmNsdXN0ZXIgPC0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCkpXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBwT3ZlcjQpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwcE92ZXIzKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcHBPdmVyMiksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBwT3ZlcjEpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwcE92ZXIwKSlcbmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpXG4jIFBsb3R0aW5nXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
## Importing groups
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene


## Importing Bobbie gene classification
geneCluster <- fread(here(refDir, \bobbie_gene_classification.csv\)) %>%
  dplyr::select(gene, enst, Cluster)
colnames(geneCluster) <- c(\gene\, \ensembl_transcript_id\, \cluster\)


## Converting transcript ID to gene ID
idPair_tg <- getBM(attributes = c(\ensembl_transcript_id\, \ensembl_gene_id\),
                 filters = \ensembl_transcript_id\,
                 values = geneCluster$ensembl_transcript,
                 mart = ensembl.v102)
geneCluster <- geneCluster %>% dplyr::left_join(idPair_tg, by = c(\ensembl_transcript_id\))

# Making data for stacked barplot
countGene <- function(geneCluster, groupName, clusterName){
  num <- nrow(geneCluster %>% dplyr::filter(ensembl_gene_id %in% groupName,
                                            cluster %in% clusterName))
  return(num)
}
countGeneList <- function(geneCluster, groupName){
  n1 <- countGene(geneCluster, groupName, \Early\)
  n2 <- countGene(geneCluster, groupName, \Middle\)
  n3 <-countGene(geneCluster, groupName, \Late\)
  n4 <- countGene(geneCluster, groupName, \Transient\)
  return(c(n1, n2, n3, n4))
}

group <- c(rep(\group1\, 4), rep(\group2\, 4), rep(\group3\, 4), rep(\group4\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 4)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, group1),
           countGeneList(geneCluster, group2),
           countGeneList(geneCluster, group5),
           countGeneList(geneCluster, group8))

data <- data.frame(group, cluster, value)


# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()


# Statistical analysis 
# Similar to the Chi-Square test, Fisher’s Exact Test is used when you have smaller sample sizes or when the expected frequency in any cell of the contingency table is below 5.
temp <- data %>% dplyr::filter(group %in% c(\group1\, \group2\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result

temp <- data %>% dplyr::filter(group %in% c(\group1\, \group3\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result

temp <- data %>% dplyr::filter(group %in% c(\group1\, \group4\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result


### P-N
resultDir <- here(\../../result\)
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

pnOver8 <- (temp2 %>% dplyr::filter(total >= 8))$gene
pnOver6 <- (temp2 %>% dplyr::filter(total >= 6, total < 8))$gene
pnOver4 <- (temp2 %>% dplyr::filter(total >= 4, total < 6))$gene
pnOver2 <- (temp2 %>% dplyr::filter(total >= 2, total < 4))$gene
pnOver0 <- (temp2 %>% dplyr::filter(total < 2))$gene

group <- c(rep(\pnOver8\, 4), rep(\pnOver6\, 4), rep(\pnOver4\, 4), rep(\pnOver2\, 4), rep(\pnOver0\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 5)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, pnOver8),
           countGeneList(geneCluster, pnOver6),
           countGeneList(geneCluster, pnOver4),
           countGeneList(geneCluster, pnOver2),
           countGeneList(geneCluster, pnOver0))

data <- data.frame(group, cluster, value)
# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()

temp <- data %>% dplyr::filter(group %in% c(\pnOver2\, \pnOver8\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result

### P-S
psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene

group <- c(rep(\psOver4\, 4), rep(\psOver3\, 4), rep(\psOver2\, 4), rep(\psOver1\, 4), rep(\psOver0\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 5)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, psOver4),
           countGeneList(geneCluster, psOver3),
           countGeneList(geneCluster, psOver2),
           countGeneList(geneCluster, psOver1),
           countGeneList(geneCluster, psOver0))

data <- data.frame(group, cluster, value)
# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()
temp <- data %>% dplyr::filter(group %in% c(\psOver2\, \psOver4\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result

### P-E
peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene

group <- c(rep(\peOver4\, 4), rep(\peOver3\, 4), rep(\peOver2\, 4), rep(\peOver1\, 4), rep(\peOver0\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 5)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, peOver4),
           countGeneList(geneCluster, peOver3),
           countGeneList(geneCluster, peOver2),
           countGeneList(geneCluster, peOver1),
           countGeneList(geneCluster, peOver0))

data <- data.frame(group, cluster, value)
# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()

### P-P
ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene

group <- c(rep(\ppOver4\, 4), rep(\ppOver3\, 4), rep(\ppOver2\, 4), rep(\ppOver1\, 4), rep(\ppOver0\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 5)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, ppOver4),
           countGeneList(geneCluster, ppOver3),
           countGeneList(geneCluster, ppOver2),
           countGeneList(geneCluster, ppOver1),
           countGeneList(geneCluster, ppOver0))
data <- data.frame(group, cluster, value)
# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWdTVzF3YjNKMGFXNW5JR2R5YjNWd2MxeHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdkbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RFdWRITjJYRndwS1NSblpXNWxYRzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1oyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd01pNTBjM1pjWENrcEpHZGxibVZjYm1keWIzVndOU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeG5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQTFMblJ6ZGx4Y0tTa2taMlZ1WlZ4dVozSnZkWEE0SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjRGd1ZEhOMlhGd3BLU1JuWlc1bFhHNWNibHh1SXlNZ1NXMXdiM0owYVc1bklFSnZZbUpwWlNCblpXNWxJR05zWVhOemFXWnBZMkYwYVc5dVhHNW5aVzVsUTJ4MWMzUmxjaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeGliMkppYVdWZloyVnVaVjlqYkdGemMybG1hV05oZEdsdmJpNWpjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR2RsYm1Vc0lHVnVjM1FzSUVOc2RYTjBaWElwWEc1amIyeHVZVzFsY3loblpXNWxRMngxYzNSbGNpa2dQQzBnWXloY1hHZGxibVZjWEN3Z1hGeGxibk5sYldKc1gzUnlZVzV6WTNKcGNIUmZhV1JjWEN3Z1hGeGpiSFZ6ZEdWeVhGd3BYRzVjYmx4dUl5TWdRMjl1ZG1WeWRHbHVaeUIwY21GdWMyTnlhWEIwSUVsRUlIUnZJR2RsYm1VZ1NVUmNibWxrVUdGcGNsOTBaeUE4TFNCblpYUkNUU2hoZEhSeWFXSjFkR1Z6SUQwZ1l5aGNYR1Z1YzJWdFlteGZkSEpoYm5OamNtbHdkRjlwWkZ4Y0xDQmNYR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm1sc2RHVnljeUE5SUZ4Y1pXNXpaVzFpYkY5MGNtRnVjMk55YVhCMFgybGtYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGJIVmxjeUE5SUdkbGJtVkRiSFZ6ZEdWeUpHVnVjMlZ0WW14ZmRISmhibk5qY21sd2RDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0Z5ZENBOUlHVnVjMlZ0WW13dWRqRXdNaWxjYm1kbGJtVkRiSFZ6ZEdWeUlEd3RJR2RsYm1WRGJIVnpkR1Z5SUNVK0pTQmtjR3g1Y2pvNmJHVm1kRjlxYjJsdUtHbGtVR0ZwY2w5MFp5d2dZbmtnUFNCaktGeGNaVzV6WlcxaWJGOTBjbUZ1YzJOeWFYQjBYMmxrWEZ3cEtWeHVYRzRqSUUxaGEybHVaeUJrWVhSaElHWnZjaUJ6ZEdGamEyVmtJR0poY25Cc2IzUmNibU52ZFc1MFIyVnVaU0E4TFNCbWRXNWpkR2x2YmloblpXNWxRMngxYzNSbGNpd2daM0p2ZFhCT1lXMWxMQ0JqYkhWemRHVnlUbUZ0WlNsN1hHNGdJRzUxYlNBOExTQnVjbTkzS0dkbGJtVkRiSFZ6ZEdWeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHVnVjMlZ0WW14ZloyVnVaVjlwWkNBbGFXNGxJR2R5YjNWd1RtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJ4MWMzUmxjaUFsYVc0bElHTnNkWE4wWlhKT1lXMWxLU2xjYmlBZ2NtVjBkWEp1S0c1MWJTbGNibjFjYm1OdmRXNTBSMlZ1WlV4cGMzUWdQQzBnWm5WdVkzUnBiMjRvWjJWdVpVTnNkWE4wWlhJc0lHZHliM1Z3VG1GdFpTbDdYRzRnSUc0eElEd3RJR052ZFc1MFIyVnVaU2huWlc1bFEyeDFjM1JsY2l3Z1ozSnZkWEJPWVcxbExDQmNYRVZoY214NVhGd3BYRzRnSUc0eUlEd3RJR052ZFc1MFIyVnVaU2huWlc1bFEyeDFjM1JsY2l3Z1ozSnZkWEJPWVcxbExDQmNYRTFwWkdSc1pWeGNLVnh1SUNCdU15QThMV052ZFc1MFIyVnVaU2huWlc1bFEyeDFjM1JsY2l3Z1ozSnZkWEJPWVcxbExDQmNYRXhoZEdWY1hDbGNiaUFnYmpRZ1BDMGdZMjkxYm5SSFpXNWxLR2RsYm1WRGJIVnpkR1Z5TENCbmNtOTFjRTVoYldVc0lGeGNWSEpoYm5OcFpXNTBYRndwWEc0Z0lISmxkSFZ5YmloaktHNHhMQ0J1TWl3Z2JqTXNJRzQwS1NsY2JuMWNibHh1WjNKdmRYQWdQQzBnWXloeVpYQW9YRnhuY205MWNERmNYQ3dnTkNrc0lISmxjQ2hjWEdkeWIzVndNbHhjTENBMEtTd2djbVZ3S0Z4Y1ozSnZkWEF6WEZ3c0lEUXBMQ0J5WlhBb1hGeG5jbTkxY0RSY1hDd2dOQ2twWEc1amJIVnpkR1Z5SUR3dElISmxjQ2hqS0Z4Y1JXRnliSGxjWEN3Z1hGeE5hV1JrYkdWY1hDd2dYRnhNWVhSbFhGd3NJRnhjVkhKaGJuTnBaVzUwWEZ3cExDQTBLVnh1WTJ4MWMzUmxjaUE4TFNCbVlXTjBiM0lvWTJ4MWMzUmxjaXdnYkdWMlpXeHpJRDBnWXloY1hFVmhjbXg1WEZ3c0lGeGNUV2xrWkd4bFhGd3NJRnhjVEdGMFpWeGNMQ0JjWEZSeVlXNXphV1Z1ZEZ4Y0tTbGNiblpoYkhWbElEd3RJR01vWTI5MWJuUkhaVzVsVEdsemRDaG5aVzVsUTJ4MWMzUmxjaXdnWjNKdmRYQXhLU3hjYmlBZ0lDQWdJQ0FnSUNBZ1kyOTFiblJIWlc1bFRHbHpkQ2huWlc1bFEyeDFjM1JsY2l3Z1ozSnZkWEF5S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdZMjkxYm5SSFpXNWxUR2x6ZENoblpXNWxRMngxYzNSbGNpd2daM0p2ZFhBMUtTeGNiaUFnSUNBZ0lDQWdJQ0FnWTI5MWJuUkhaVzVsVEdsemRDaG5aVzVsUTJ4MWMzUmxjaXdnWjNKdmRYQTRLU2xjYmx4dVpHRjBZU0E4TFNCa1lYUmhMbVp5WVcxbEtHZHliM1Z3TENCamJIVnpkR1Z5TENCMllXeDFaU2xjYmx4dVhHNGpJRkJzYjNSMGFXNW5YRzVuWjNCc2IzUW9aR0YwWVN3Z1lXVnpLR1pwYkd3OVkyeDFjM1JsY2l3Z2VUMTJZV3gxWlN3Z2VEMW5jbTkxY0NrcElDc2dYRzRnSUNBZ1oyVnZiVjlpWVhJb2NHOXphWFJwYjI0OVhGeG1hV3hzWEZ3c0lITjBZWFE5WEZ4cFpHVnVkR2wwZVZ4Y0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tWeHVYRzVjYmlNZ1UzUmhkR2x6ZEdsallXd2dZVzVoYkhsemFYTWdYRzRqSUZOcGJXbHNZWElnZEc4Z2RHaGxJRU5vYVMxVGNYVmhjbVVnZEdWemRDd2dSbWx6YUdWeTRvQ1pjeUJGZUdGamRDQlVaWE4wSUdseklIVnpaV1FnZDJobGJpQjViM1VnYUdGMlpTQnpiV0ZzYkdWeUlITmhiWEJzWlNCemFYcGxjeUJ2Y2lCM2FHVnVJSFJvWlNCbGVIQmxZM1JsWkNCbWNtVnhkV1Z1WTNrZ2FXNGdZVzU1SUdObGJHd2diMllnZEdobElHTnZiblJwYm1kbGJtTjVJSFJoWW14bElHbHpJR0psYkc5M0lEVXVYRzUwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnSldsdUpTQmpLRnhjWjNKdmRYQXhYRndzSUZ4Y1ozSnZkWEF5WEZ3cEtWeHVZMjl1ZEdsdVoyVnVZM2xmZEdGaWJHVWdQQzBnZUhSaFluTW9kbUZzZFdVZ2ZpQm5jbTkxY0NBcklHTnNkWE4wWlhJc0lHUmhkR0VnUFNCMFpXMXdLVnh1Wm1semFHVnlYM0psYzNWc2RDQThMU0JtYVhOb1pYSXVkR1Z6ZENoamIyNTBhVzVuWlc1amVWOTBZV0pzWlN3Z2MybHRkV3hoZEdVdWNDNTJZV3gxWlNBOUlGUlNWVVVzSUVJZ1BTQXhNREF3TURBcFhHNW1hWE5vWlhKZmNtVnpkV3gwWEc1Y2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQWxhVzRsSUdNb1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNETmNYQ2twWEc1amIyNTBhVzVuWlc1amVWOTBZV0pzWlNBOExTQjRkR0ZpY3loMllXeDFaU0IrSUdkeWIzVndJQ3NnWTJ4MWMzUmxjaXdnWkdGMFlTQTlJSFJsYlhBcFhHNW1hWE5vWlhKZmNtVnpkV3gwSUR3dElHWnBjMmhsY2k1MFpYTjBLR052Ym5ScGJtZGxibU41WDNSaFlteGxMQ0J6YVcxMWJHRjBaUzV3TG5aaGJIVmxJRDBnVkZKVlJTd2dRaUE5SURFd01EQXdNQ2xjYm1acGMyaGxjbDl5WlhOMWJIUmNibHh1ZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUNWcGJpVWdZeWhjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TkZ4Y0tTbGNibU52Ym5ScGJtZGxibU41WDNSaFlteGxJRHd0SUhoMFlXSnpLSFpoYkhWbElINGdaM0p2ZFhBZ0t5QmpiSFZ6ZEdWeUxDQmtZWFJoSUQwZ2RHVnRjQ2xjYm1acGMyaGxjbDl5WlhOMWJIUWdQQzBnWm1semFHVnlMblJsYzNRb1kyOXVkR2x1WjJWdVkzbGZkR0ZpYkdVc0lITnBiWFZzWVhSbExuQXVkbUZzZFdVZ1BTQlVVbFZGTENCQ0lEMGdNVEF3TURBd0tWeHVabWx6YUdWeVgzSmxjM1ZzZEZ4dVhHNWNiaU1qSXlCUUxVNWNibkpsYzNWc2RFUnBjaUE4TFNCb1pYSmxLRnhjTGk0dkxpNHZjbVZ6ZFd4MFhGd3BYRzUwWlcxd01pQThMU0J5WldGa1VrUlRLR2hsY21Vb2NtVnpkV3gwUkdseUxDQmNYR2RsYm1WZmJHOXZjRjlzYVc1ckxuSmtjMXhjS1NsY2JseHVjRzVQZG1WeU9DQThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9kRzkwWVd3Z1BqMGdPQ2twSkdkbGJtVmNibkJ1VDNabGNqWWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSFJ2ZEdGc0lENDlJRFlzSUhSdmRHRnNJRHdnT0NrcEpHZGxibVZjYm5CdVQzWmxjalFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hSdmRHRnNJRDQ5SURRc0lIUnZkR0ZzSUR3Z05pa3BKR2RsYm1WY2JuQnVUM1psY2pJZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIUnZkR0ZzSUQ0OUlESXNJSFJ2ZEdGc0lEd2dOQ2twSkdkbGJtVmNibkJ1VDNabGNqQWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSFJ2ZEdGc0lEd2dNaWtwSkdkbGJtVmNibHh1WjNKdmRYQWdQQzBnWXloeVpYQW9YRnh3Yms5MlpYSTRYRndzSURRcExDQnlaWEFvWEZ4d2JrOTJaWEkyWEZ3c0lEUXBMQ0J5WlhBb1hGeHdiazkyWlhJMFhGd3NJRFFwTENCeVpYQW9YRnh3Yms5MlpYSXlYRndzSURRcExDQnlaWEFvWEZ4d2JrOTJaWEl3WEZ3c0lEUXBLVnh1WTJ4MWMzUmxjaUE4TFNCeVpYQW9ZeWhjWEVWaGNteDVYRndzSUZ4Y1RXbGtaR3hsWEZ3c0lGeGNUR0YwWlZ4Y0xDQmNYRlJ5WVc1emFXVnVkRnhjS1N3Z05TbGNibU5zZFhOMFpYSWdQQzBnWm1GamRHOXlLR05zZFhOMFpYSXNJR3hsZG1Wc2N5QTlJR01vWEZ4RllYSnNlVnhjTENCY1hFMXBaR1JzWlZ4Y0xDQmNYRXhoZEdWY1hDd2dYRnhVY21GdWMybGxiblJjWENrcFhHNTJZV3gxWlNBOExTQmpLR052ZFc1MFIyVnVaVXhwYzNRb1oyVnVaVU5zZFhOMFpYSXNJSEJ1VDNabGNqZ3BMRnh1SUNBZ0lDQWdJQ0FnSUNCamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCd2JrOTJaWEkyS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdZMjkxYm5SSFpXNWxUR2x6ZENoblpXNWxRMngxYzNSbGNpd2djRzVQZG1WeU5Da3NYRzRnSUNBZ0lDQWdJQ0FnSUdOdmRXNTBSMlZ1WlV4cGMzUW9aMlZ1WlVOc2RYTjBaWElzSUhCdVQzWmxjaklwTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQndiazkyWlhJd0tTbGNibHh1WkdGMFlTQThMU0JrWVhSaExtWnlZVzFsS0dkeWIzVndMQ0JqYkhWemRHVnlMQ0IyWVd4MVpTbGNiaU1nVUd4dmRIUnBibWRjYm1kbmNHeHZkQ2hrWVhSaExDQmhaWE1vWm1sc2JEMWpiSFZ6ZEdWeUxDQjVQWFpoYkhWbExDQjRQV2R5YjNWd0tTa2dLeUJjYmlBZ0lDQm5aVzl0WDJKaGNpaHdiM05wZEdsdmJqMWNYR1pwYkd4Y1hDd2djM1JoZEQxY1hHbGtaVzUwYVhSNVhGd3BJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BYRzVjYm5SbGJYQWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBbGFXNGxJR01vWEZ4d2JrOTJaWEl5WEZ3c0lGeGNjRzVQZG1WeU9GeGNLU2xjYm1OdmJuUnBibWRsYm1ONVgzUmhZbXhsSUR3dElIaDBZV0p6S0haaGJIVmxJSDRnWjNKdmRYQWdLeUJqYkhWemRHVnlMQ0JrWVhSaElEMGdkR1Z0Y0NsY2JtWnBjMmhsY2w5eVpYTjFiSFFnUEMwZ1ptbHphR1Z5TG5SbGMzUW9ZMjl1ZEdsdVoyVnVZM2xmZEdGaWJHVXNJSE5wYlhWc1lYUmxMbkF1ZG1Gc2RXVWdQU0JVVWxWRkxDQkNJRDBnTVRBd01EQXdLVnh1Wm1semFHVnlYM0psYzNWc2RGeHVYRzRqSXlNZ1VDMVRYRzV3YzA5MlpYSTBJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNITWdQajBnTkNrcEpHZGxibVZjYm5CelQzWmxjak1nUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjeUErUFNBekxDQnVkVzFmY0hNZ1BDQTBLU2trWjJWdVpWeHVjSE5QZG1WeU1pQThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCeklENDlJRElzSUc1MWJWOXdjeUE4SURNcEtTUm5aVzVsWEc1d2MwOTJaWEl4SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSE1nUGowZ01Td2diblZ0WDNCeklEd2dNaWtwSkdkbGJtVmNibkJ6VDNabGNqQWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2N5QThJREVwS1NSblpXNWxYRzVjYm1keWIzVndJRHd0SUdNb2NtVndLRnhjY0hOUGRtVnlORnhjTENBMEtTd2djbVZ3S0Z4Y2NITlBkbVZ5TTF4Y0xDQTBLU3dnY21Wd0tGeGNjSE5QZG1WeU1seGNMQ0EwS1N3Z2NtVndLRnhjY0hOUGRtVnlNVnhjTENBMEtTd2djbVZ3S0Z4Y2NITlBkbVZ5TUZ4Y0xDQTBLU2xjYm1Oc2RYTjBaWElnUEMwZ2NtVndLR01vWEZ4RllYSnNlVnhjTENCY1hFMXBaR1JzWlZ4Y0xDQmNYRXhoZEdWY1hDd2dYRnhVY21GdWMybGxiblJjWENrc0lEVXBYRzVqYkhWemRHVnlJRHd0SUdaaFkzUnZjaWhqYkhWemRHVnlMQ0JzWlhabGJITWdQU0JqS0Z4Y1JXRnliSGxjWEN3Z1hGeE5hV1JrYkdWY1hDd2dYRnhNWVhSbFhGd3NJRnhjVkhKaGJuTnBaVzUwWEZ3cEtWeHVkbUZzZFdVZ1BDMGdZeWhqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0J3YzA5MlpYSTBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ1kyOTFiblJIWlc1bFRHbHpkQ2huWlc1bFEyeDFjM1JsY2l3Z2NITlBkbVZ5TXlrc1hHNGdJQ0FnSUNBZ0lDQWdJR052ZFc1MFIyVnVaVXhwYzNRb1oyVnVaVU5zZFhOMFpYSXNJSEJ6VDNabGNqSXBMRnh1SUNBZ0lDQWdJQ0FnSUNCamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCd2MwOTJaWEl4S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdZMjkxYm5SSFpXNWxUR2x6ZENoblpXNWxRMngxYzNSbGNpd2djSE5QZG1WeU1Da3BYRzVjYm1SaGRHRWdQQzBnWkdGMFlTNW1jbUZ0WlNobmNtOTFjQ3dnWTJ4MWMzUmxjaXdnZG1Gc2RXVXBYRzRqSUZCc2IzUjBhVzVuWEc1blozQnNiM1FvWkdGMFlTd2dZV1Z6S0dacGJHdzlZMngxYzNSbGNpd2dlVDEyWVd4MVpTd2dlRDFuY205MWNDa3BJQ3NnWEc0Z0lDQWdaMlZ2YlY5aVlYSW9jRzl6YVhScGIyNDlYRnhtYVd4c1hGd3NJSE4wWVhROVhGeHBaR1Z1ZEdsMGVWeGNLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LVnh1ZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUNWcGJpVWdZeWhjWEhCelQzWmxjakpjWEN3Z1hGeHdjMDkyWlhJMFhGd3BLVnh1WTI5dWRHbHVaMlZ1WTNsZmRHRmliR1VnUEMwZ2VIUmhZbk1vZG1Gc2RXVWdmaUJuY205MWNDQXJJR05zZFhOMFpYSXNJR1JoZEdFZ1BTQjBaVzF3S1Z4dVptbHphR1Z5WDNKbGMzVnNkQ0E4TFNCbWFYTm9aWEl1ZEdWemRDaGpiMjUwYVc1blpXNWplVjkwWVdKc1pTd2djMmx0ZFd4aGRHVXVjQzUyWVd4MVpTQTlJRlJTVlVVc0lFSWdQU0F4TURBd01EQXBYRzVtYVhOb1pYSmZjbVZ6ZFd4MFhHNWNiaU1qSXlCUUxVVmNibkJsVDNabGNqUWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d1pTQStQU0EwS1Nra1oyVnVaVnh1Y0dWUGRtVnlNeUE4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQmxJRDQ5SURNc0lHNTFiVjl3WlNBOElEUXBLU1JuWlc1bFhHNXdaVTkyWlhJeUlEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0dVZ1BqMGdNaXdnYm5WdFgzQmxJRHdnTXlrcEpHZGxibVZjYm5CbFQzWmxjakVnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdaU0ErUFNBeExDQnVkVzFmY0dVZ1BDQXlLU2trWjJWdVpWeHVjR1ZQZG1WeU1DQThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCbElEd2dNU2twSkdkbGJtVmNibHh1WjNKdmRYQWdQQzBnWXloeVpYQW9YRnh3WlU5MlpYSTBYRndzSURRcExDQnlaWEFvWEZ4d1pVOTJaWEl6WEZ3c0lEUXBMQ0J5WlhBb1hGeHdaVTkyWlhJeVhGd3NJRFFwTENCeVpYQW9YRnh3WlU5MlpYSXhYRndzSURRcExDQnlaWEFvWEZ4d1pVOTJaWEl3WEZ3c0lEUXBLVnh1WTJ4MWMzUmxjaUE4TFNCeVpYQW9ZeWhjWEVWaGNteDVYRndzSUZ4Y1RXbGtaR3hsWEZ3c0lGeGNUR0YwWlZ4Y0xDQmNYRlJ5WVc1emFXVnVkRnhjS1N3Z05TbGNibU5zZFhOMFpYSWdQQzBnWm1GamRHOXlLR05zZFhOMFpYSXNJR3hsZG1Wc2N5QTlJR01vWEZ4RllYSnNlVnhjTENCY1hFMXBaR1JzWlZ4Y0xDQmNYRXhoZEdWY1hDd2dYRnhVY21GdWMybGxiblJjWENrcFhHNTJZV3gxWlNBOExTQmpLR052ZFc1MFIyVnVaVXhwYzNRb1oyVnVaVU5zZFhOMFpYSXNJSEJsVDNabGNqUXBMRnh1SUNBZ0lDQWdJQ0FnSUNCamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCd1pVOTJaWEl6S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdZMjkxYm5SSFpXNWxUR2x6ZENoblpXNWxRMngxYzNSbGNpd2djR1ZQZG1WeU1pa3NYRzRnSUNBZ0lDQWdJQ0FnSUdOdmRXNTBSMlZ1WlV4cGMzUW9aMlZ1WlVOc2RYTjBaWElzSUhCbFQzWmxjakVwTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQndaVTkyWlhJd0tTbGNibHh1WkdGMFlTQThMU0JrWVhSaExtWnlZVzFsS0dkeWIzVndMQ0JqYkhWemRHVnlMQ0IyWVd4MVpTbGNiaU1nVUd4dmRIUnBibWRjYm1kbmNHeHZkQ2hrWVhSaExDQmhaWE1vWm1sc2JEMWpiSFZ6ZEdWeUxDQjVQWFpoYkhWbExDQjRQV2R5YjNWd0tTa2dLeUJjYmlBZ0lDQm5aVzl0WDJKaGNpaHdiM05wZEdsdmJqMWNYR1pwYkd4Y1hDd2djM1JoZEQxY1hHbGtaVzUwYVhSNVhGd3BJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BYRzVjYmlNakl5QlFMVkJjYm5Cd1QzWmxjalFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjQ0ErUFNBMEtTa2taMlZ1WlZ4dWNIQlBkbVZ5TXlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J3SUQ0OUlETXNJRzUxYlY5d2NDQThJRFFwS1NSblpXNWxYRzV3Y0U5MlpYSXlJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNIQWdQajBnTWl3Z2JuVnRYM0J3SUR3Z015a3BKR2RsYm1WY2JuQndUM1psY2pFZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y0NBK1BTQXhMQ0J1ZFcxZmNIQWdQQ0F5S1Nra1oyVnVaVnh1Y0hCUGRtVnlNQ0E4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQndJRHdnTVNrcEpHZGxibVZjYmx4dVozSnZkWEFnUEMwZ1l5aHlaWEFvWEZ4d2NFOTJaWEkwWEZ3c0lEUXBMQ0J5WlhBb1hGeHdjRTkyWlhJelhGd3NJRFFwTENCeVpYQW9YRnh3Y0U5MlpYSXlYRndzSURRcExDQnlaWEFvWEZ4d2NFOTJaWEl4WEZ3c0lEUXBMQ0J5WlhBb1hGeHdjRTkyWlhJd1hGd3NJRFFwS1Z4dVkyeDFjM1JsY2lBOExTQnlaWEFvWXloY1hFVmhjbXg1WEZ3c0lGeGNUV2xrWkd4bFhGd3NJRnhjVEdGMFpWeGNMQ0JjWEZSeVlXNXphV1Z1ZEZ4Y0tTd2dOU2xjYm1Oc2RYTjBaWElnUEMwZ1ptRmpkRzl5S0dOc2RYTjBaWElzSUd4bGRtVnNjeUE5SUdNb1hGeEZZWEpzZVZ4Y0xDQmNYRTFwWkdSc1pWeGNMQ0JjWEV4aGRHVmNYQ3dnWEZ4VWNtRnVjMmxsYm5SY1hDa3BYRzUyWVd4MVpTQThMU0JqS0dOdmRXNTBSMlZ1WlV4cGMzUW9aMlZ1WlVOc2RYTjBaWElzSUhCd1QzWmxjalFwTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQndjRTkyWlhJektTeGNiaUFnSUNBZ0lDQWdJQ0FnWTI5MWJuUkhaVzVsVEdsemRDaG5aVzVsUTJ4MWMzUmxjaXdnY0hCUGRtVnlNaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lHTnZkVzUwUjJWdVpVeHBjM1FvWjJWdVpVTnNkWE4wWlhJc0lIQndUM1psY2pFcExGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0J3Y0U5MlpYSXdLU2xjYm1SaGRHRWdQQzBnWkdGMFlTNW1jbUZ0WlNobmNtOTFjQ3dnWTJ4MWMzUmxjaXdnZG1Gc2RXVXBYRzRqSUZCc2IzUjBhVzVuWEc1blozQnNiM1FvWkdGMFlTd2dZV1Z6S0dacGJHdzlZMngxYzNSbGNpd2dlVDEyWVd4MVpTd2dlRDFuY205MWNDa3BJQ3NnWEc0Z0lDQWdaMlZ2YlY5aVlYSW9jRzl6YVhScGIyNDlYRnhtYVd4c1hGd3NJSE4wWVhROVhGeHBaR1Z1ZEdsMGVWeGNLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LVnh1WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuIyMgSW1wb3J0aW5nIGdyb3Vwc1xuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCkpJGdlbmVcbmdyb3VwNSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdlxcKSkkZ2VuZVxuZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpKSRnZW5lXG5cblxuIyMgSW1wb3J0aW5nIEJvYmJpZSBnZW5lIGNsYXNzaWZpY2F0aW9uXG5nZW5lQ2x1c3RlciA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxib2JiaWVfZ2VuZV9jbGFzc2lmaWNhdGlvbi5jc3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGdlbmUsIGVuc3QsIENsdXN0ZXIpXG5jb2xuYW1lcyhnZW5lQ2x1c3RlcikgPC0gYyhcXGdlbmVcXCwgXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCwgXFxjbHVzdGVyXFwpXG5cblxuIyMgQ29udmVydGluZyB0cmFuc2NyaXB0IElEIHRvIGdlbmUgSURcbmlkUGFpcl90ZyA8LSBnZXRCTShhdHRyaWJ1dGVzID0gYyhcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcLCBcXGVuc2VtYmxfZ2VuZV9pZFxcKSxcbiAgICAgICAgICAgICAgICAgZmlsdGVycyA9IFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwsXG4gICAgICAgICAgICAgICAgIHZhbHVlcyA9IGdlbmVDbHVzdGVyJGVuc2VtYmxfdHJhbnNjcmlwdCxcbiAgICAgICAgICAgICAgICAgbWFydCA9IGVuc2VtYmwudjEwMilcbmdlbmVDbHVzdGVyIDwtIGdlbmVDbHVzdGVyICU+JSBkcGx5cjo6bGVmdF9qb2luKGlkUGFpcl90ZywgYnkgPSBjKFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwpKVxuXG4jIE1ha2luZyBkYXRhIGZvciBzdGFja2VkIGJhcnBsb3RcbmNvdW50R2VuZSA8LSBmdW5jdGlvbihnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBjbHVzdGVyTmFtZSl7XG4gIG51bSA8LSBucm93KGdlbmVDbHVzdGVyICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdyb3VwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciAlaW4lIGNsdXN0ZXJOYW1lKSlcbiAgcmV0dXJuKG51bSlcbn1cbmNvdW50R2VuZUxpc3QgPC0gZnVuY3Rpb24oZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSl7XG4gIG4xIDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXEVhcmx5XFwpXG4gIG4yIDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXE1pZGRsZVxcKVxuICBuMyA8LWNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXExhdGVcXClcbiAgbjQgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcVHJhbnNpZW50XFwpXG4gIHJldHVybihjKG4xLCBuMiwgbjMsIG40KSlcbn1cblxuZ3JvdXAgPC0gYyhyZXAoXFxncm91cDFcXCwgNCksIHJlcChcXGdyb3VwMlxcLCA0KSwgcmVwKFxcZ3JvdXAzXFwsIDQpLCByZXAoXFxncm91cDRcXCwgNCkpXG5jbHVzdGVyIDwtIHJlcChjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpLCA0KVxuY2x1c3RlciA8LSBmYWN0b3IoY2x1c3RlciwgbGV2ZWxzID0gYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSlcbnZhbHVlIDwtIGMoY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXAxKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXAyKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA1KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA4KSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcblxuXG4jIFBsb3R0aW5nXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5cbiMgU3RhdGlzdGljYWwgYW5hbHlzaXMgXG4jIFNpbWlsYXIgdG8gdGhlIENoaS1TcXVhcmUgdGVzdCwgRmlzaGVy4oCZcyBFeGFjdCBUZXN0IGlzIHVzZWQgd2hlbiB5b3UgaGF2ZSBzbWFsbGVyIHNhbXBsZSBzaXplcyBvciB3aGVuIHRoZSBleHBlY3RlZCBmcmVxdWVuY3kgaW4gYW55IGNlbGwgb2YgdGhlIGNvbnRpbmdlbmN5IHRhYmxlIGlzIGJlbG93IDUuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpKVxuY29udGluZ2VuY3lfdGFibGUgPC0geHRhYnModmFsdWUgfiBncm91cCArIGNsdXN0ZXIsIGRhdGEgPSB0ZW1wKVxuZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEIgPSAxMDAwMDApXG5maXNoZXJfcmVzdWx0XG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxncm91cDFcXCwgXFxncm91cDNcXCkpXG5jb250aW5nZW5jeV90YWJsZSA8LSB4dGFicyh2YWx1ZSB+IGdyb3VwICsgY2x1c3RlciwgZGF0YSA9IHRlbXApXG5maXNoZXJfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSwgQiA9IDEwMDAwMClcbmZpc2hlcl9yZXN1bHRcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYyhcXGdyb3VwMVxcLCBcXGdyb3VwNFxcKSlcbmNvbnRpbmdlbmN5X3RhYmxlIDwtIHh0YWJzKHZhbHVlIH4gZ3JvdXAgKyBjbHVzdGVyLCBkYXRhID0gdGVtcClcbmZpc2hlcl9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCBCID0gMTAwMDAwKVxuZmlzaGVyX3Jlc3VsdFxuXG5cbiMjIyBQLU5cbnJlc3VsdERpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0XFwpXG50ZW1wMiA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rLnJkc1xcKSlcblxucG5PdmVyOCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gOCkpJGdlbmVcbnBuT3ZlcjYgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDYsIHRvdGFsIDwgOCkpJGdlbmVcbnBuT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDQsIHRvdGFsIDwgNikpJGdlbmVcbnBuT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDIsIHRvdGFsIDwgNCkpJGdlbmVcbnBuT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsIDwgMikpJGdlbmVcblxuZ3JvdXAgPC0gYyhyZXAoXFxwbk92ZXI4XFwsIDQpLCByZXAoXFxwbk92ZXI2XFwsIDQpLCByZXAoXFxwbk92ZXI0XFwsIDQpLCByZXAoXFxwbk92ZXIyXFwsIDQpLCByZXAoXFxwbk92ZXIwXFwsIDQpKVxuY2x1c3RlciA8LSByZXAoYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSwgNSlcbmNsdXN0ZXIgPC0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCkpXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBuT3ZlcjgpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwbk92ZXI2KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcG5PdmVyNCksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBuT3ZlcjIpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwbk92ZXIwKSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcbiMgUGxvdHRpbmdcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdD1cXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxwbk92ZXIyXFwsIFxccG5PdmVyOFxcKSlcbmNvbnRpbmdlbmN5X3RhYmxlIDwtIHh0YWJzKHZhbHVlIH4gZ3JvdXAgKyBjbHVzdGVyLCBkYXRhID0gdGVtcClcbmZpc2hlcl9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCBCID0gMTAwMDAwKVxuZmlzaGVyX3Jlc3VsdFxuXG4jIyMgUC1TXG5wc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gNCkpJGdlbmVcbnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZVxucHNPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDIsIG51bV9wcyA8IDMpKSRnZW5lXG5wc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMSwgbnVtX3BzIDwgMikpJGdlbmVcbnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lXG5cbmdyb3VwIDwtIGMocmVwKFxccHNPdmVyNFxcLCA0KSwgcmVwKFxccHNPdmVyM1xcLCA0KSwgcmVwKFxccHNPdmVyMlxcLCA0KSwgcmVwKFxccHNPdmVyMVxcLCA0KSwgcmVwKFxccHNPdmVyMFxcLCA0KSlcbmNsdXN0ZXIgPC0gcmVwKGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCksIDUpXG5jbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpKVxudmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwc092ZXI0KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcHNPdmVyMyksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBzT3ZlcjIpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwc092ZXIxKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcHNPdmVyMCkpXG5cbmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpXG4jIFBsb3R0aW5nXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYyhcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpKVxuY29udGluZ2VuY3lfdGFibGUgPC0geHRhYnModmFsdWUgfiBncm91cCArIGNsdXN0ZXIsIGRhdGEgPSB0ZW1wKVxuZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEIgPSAxMDAwMDApXG5maXNoZXJfcmVzdWx0XG5cbiMjIyBQLUVcbnBlT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSA0KSkkZ2VuZVxucGVPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lXG5wZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmVcbnBlT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAxLCBudW1fcGUgPCAyKSkkZ2VuZVxucGVPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmVcblxuZ3JvdXAgPC0gYyhyZXAoXFxwZU92ZXI0XFwsIDQpLCByZXAoXFxwZU92ZXIzXFwsIDQpLCByZXAoXFxwZU92ZXIyXFwsIDQpLCByZXAoXFxwZU92ZXIxXFwsIDQpLCByZXAoXFxwZU92ZXIwXFwsIDQpKVxuY2x1c3RlciA8LSByZXAoYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSwgNSlcbmNsdXN0ZXIgPC0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCkpXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBlT3ZlcjQpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwZU92ZXIzKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcGVPdmVyMiksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBlT3ZlcjEpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwZU92ZXIwKSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcbiMgUGxvdHRpbmdcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdD1cXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cbiMjIyBQLVBcbnBwT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSA0KSkkZ2VuZVxucHBPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lXG5wcE92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmVcbnBwT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAxLCBudW1fcHAgPCAyKSkkZ2VuZVxucHBPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmVcblxuZ3JvdXAgPC0gYyhyZXAoXFxwcE92ZXI0XFwsIDQpLCByZXAoXFxwcE92ZXIzXFwsIDQpLCByZXAoXFxwcE92ZXIyXFwsIDQpLCByZXAoXFxwcE92ZXIxXFwsIDQpLCByZXAoXFxwcE92ZXIwXFwsIDQpKVxuY2x1c3RlciA8LSByZXAoYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSwgNSlcbmNsdXN0ZXIgPC0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCkpXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBwT3ZlcjQpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwcE92ZXIzKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcHBPdmVyMiksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBwT3ZlcjEpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwcE92ZXIwKSlcbmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpXG4jIFBsb3R0aW5nXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMgSW1wb3J0aW5nIGdyb3Vwc1xuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCkpJGdlbmVcbmdyb3VwNSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdlxcKSkkZ2VuZVxuZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpKSRnZW5lXG5cblxuIyMgSW1wb3J0aW5nIEJvYmJpZSBnZW5lIGNsYXNzaWZpY2F0aW9uXG5nZW5lQ2x1c3RlciA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxib2JiaWVfZ2VuZV9jbGFzc2lmaWNhdGlvbi5jc3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGdlbmUsIGVuc3QsIENsdXN0ZXIpXG5jb2xuYW1lcyhnZW5lQ2x1c3RlcikgPC0gYyhcXGdlbmVcXCwgXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCwgXFxjbHVzdGVyXFwpXG5cblxuIyMgQ29udmVydGluZyB0cmFuc2NyaXB0IElEIHRvIGdlbmUgSURcbmlkUGFpcl90ZyA8LSBnZXRCTShhdHRyaWJ1dGVzID0gYyhcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcLCBcXGVuc2VtYmxfZ2VuZV9pZFxcKSxcbiAgICAgICAgICAgICAgICAgZmlsdGVycyA9IFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwsXG4gICAgICAgICAgICAgICAgIHZhbHVlcyA9IGdlbmVDbHVzdGVyJGVuc2VtYmxfdHJhbnNjcmlwdCxcbiAgICAgICAgICAgICAgICAgbWFydCA9IGVuc2VtYmwudjEwMilcbmdlbmVDbHVzdGVyIDwtIGdlbmVDbHVzdGVyICU+JSBkcGx5cjo6bGVmdF9qb2luKGlkUGFpcl90ZywgYnkgPSBjKFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwpKVxuXG4jIE1ha2luZyBkYXRhIGZvciBzdGFja2VkIGJhcnBsb3RcbmNvdW50R2VuZSA8LSBmdW5jdGlvbihnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBjbHVzdGVyTmFtZSl7XG4gIG51bSA8LSBucm93KGdlbmVDbHVzdGVyICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdyb3VwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciAlaW4lIGNsdXN0ZXJOYW1lKSlcbiAgcmV0dXJuKG51bSlcbn1cbmNvdW50R2VuZUxpc3QgPC0gZnVuY3Rpb24oZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSl7XG4gIG4xIDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXEVhcmx5XFwpXG4gIG4yIDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXE1pZGRsZVxcKVxuICBuMyA8LWNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXExhdGVcXClcbiAgbjQgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcVHJhbnNpZW50XFwpXG4gIHJldHVybihjKG4xLCBuMiwgbjMsIG40KSlcbn1cblxuZ3JvdXAgPC0gYyhyZXAoXFxncm91cDFcXCwgNCksIHJlcChcXGdyb3VwMlxcLCA0KSwgcmVwKFxcZ3JvdXAzXFwsIDQpLCByZXAoXFxncm91cDRcXCwgNCkpXG5jbHVzdGVyIDwtIHJlcChjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpLCA0KVxuY2x1c3RlciA8LSBmYWN0b3IoY2x1c3RlciwgbGV2ZWxzID0gYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSlcbnZhbHVlIDwtIGMoY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXAxKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXAyKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA1KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA4KSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcblxuXG4jIFBsb3R0aW5nXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5cbiMgU3RhdGlzdGljYWwgYW5hbHlzaXMgXG4jIFNpbWlsYXIgdG8gdGhlIENoaS1TcXVhcmUgdGVzdCwgRmlzaGVy4oCZcyBFeGFjdCBUZXN0IGlzIHVzZWQgd2hlbiB5b3UgaGF2ZSBzbWFsbGVyIHNhbXBsZSBzaXplcyBvciB3aGVuIHRoZSBleHBlY3RlZCBmcmVxdWVuY3kgaW4gYW55IGNlbGwgb2YgdGhlIGNvbnRpbmdlbmN5IHRhYmxlIGlzIGJlbG93IDUuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpKVxuY29udGluZ2VuY3lfdGFibGUgPC0geHRhYnModmFsdWUgfiBncm91cCArIGNsdXN0ZXIsIGRhdGEgPSB0ZW1wKVxuZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEIgPSAxMDAwMDApXG5maXNoZXJfcmVzdWx0XG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxncm91cDFcXCwgXFxncm91cDNcXCkpXG5jb250aW5nZW5jeV90YWJsZSA8LSB4dGFicyh2YWx1ZSB+IGdyb3VwICsgY2x1c3RlciwgZGF0YSA9IHRlbXApXG5maXNoZXJfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSwgQiA9IDEwMDAwMClcbmZpc2hlcl9yZXN1bHRcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYyhcXGdyb3VwMVxcLCBcXGdyb3VwNFxcKSlcbmNvbnRpbmdlbmN5X3RhYmxlIDwtIHh0YWJzKHZhbHVlIH4gZ3JvdXAgKyBjbHVzdGVyLCBkYXRhID0gdGVtcClcbmZpc2hlcl9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCBCID0gMTAwMDAwKVxuZmlzaGVyX3Jlc3VsdFxuXG5cbiMjIyBQLU5cbnJlc3VsdERpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0XFwpXG50ZW1wMiA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rLnJkc1xcKSlcblxucG5PdmVyOCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gOCkpJGdlbmVcbnBuT3ZlcjYgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDYsIHRvdGFsIDwgOCkpJGdlbmVcbnBuT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDQsIHRvdGFsIDwgNikpJGdlbmVcbnBuT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDIsIHRvdGFsIDwgNCkpJGdlbmVcbnBuT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsIDwgMikpJGdlbmVcblxuZ3JvdXAgPC0gYyhyZXAoXFxwbk92ZXI4XFwsIDQpLCByZXAoXFxwbk92ZXI2XFwsIDQpLCByZXAoXFxwbk92ZXI0XFwsIDQpLCByZXAoXFxwbk92ZXIyXFwsIDQpLCByZXAoXFxwbk92ZXIwXFwsIDQpKVxuY2x1c3RlciA8LSByZXAoYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSwgNSlcbmNsdXN0ZXIgPC0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCkpXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBuT3ZlcjgpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwbk92ZXI2KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcG5PdmVyNCksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBuT3ZlcjIpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwbk92ZXIwKSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcbiMgUGxvdHRpbmdcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdD1cXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxwbk92ZXIyXFwsIFxccG5PdmVyOFxcKSlcbmNvbnRpbmdlbmN5X3RhYmxlIDwtIHh0YWJzKHZhbHVlIH4gZ3JvdXAgKyBjbHVzdGVyLCBkYXRhID0gdGVtcClcbmZpc2hlcl9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCBCID0gMTAwMDAwKVxuZmlzaGVyX3Jlc3VsdFxuXG4jIyMgUC1TXG5wc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gNCkpJGdlbmVcbnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZVxucHNPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDIsIG51bV9wcyA8IDMpKSRnZW5lXG5wc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMSwgbnVtX3BzIDwgMikpJGdlbmVcbnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lXG5cbmdyb3VwIDwtIGMocmVwKFxccHNPdmVyNFxcLCA0KSwgcmVwKFxccHNPdmVyM1xcLCA0KSwgcmVwKFxccHNPdmVyMlxcLCA0KSwgcmVwKFxccHNPdmVyMVxcLCA0KSwgcmVwKFxccHNPdmVyMFxcLCA0KSlcbmNsdXN0ZXIgPC0gcmVwKGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCksIDUpXG5jbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpKVxudmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwc092ZXI0KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcHNPdmVyMyksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBzT3ZlcjIpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwc092ZXIxKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcHNPdmVyMCkpXG5cbmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpXG4jIFBsb3R0aW5nXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYyhcXHBzT3ZlcjJcXCwgXFxwc092ZXI0XFwpKVxuY29udGluZ2VuY3lfdGFibGUgPC0geHRhYnModmFsdWUgfiBncm91cCArIGNsdXN0ZXIsIGRhdGEgPSB0ZW1wKVxuZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEIgPSAxMDAwMDApXG5maXNoZXJfcmVzdWx0XG5cbiMjIyBQLUVcbnBlT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSA0KSkkZ2VuZVxucGVPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lXG5wZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmVcbnBlT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAxLCBudW1fcGUgPCAyKSkkZ2VuZVxucGVPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmVcblxuZ3JvdXAgPC0gYyhyZXAoXFxwZU92ZXI0XFwsIDQpLCByZXAoXFxwZU92ZXIzXFwsIDQpLCByZXAoXFxwZU92ZXIyXFwsIDQpLCByZXAoXFxwZU92ZXIxXFwsIDQpLCByZXAoXFxwZU92ZXIwXFwsIDQpKVxuY2x1c3RlciA8LSByZXAoYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSwgNSlcbmNsdXN0ZXIgPC0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCkpXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBlT3ZlcjQpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwZU92ZXIzKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcGVPdmVyMiksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBlT3ZlcjEpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwZU92ZXIwKSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcbiMgUGxvdHRpbmdcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdD1cXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cbiMjIyBQLVBcbnBwT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSA0KSkkZ2VuZVxucHBPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lXG5wcE92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmVcbnBwT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAxLCBudW1fcHAgPCAyKSkkZ2VuZVxucHBPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmVcblxuZ3JvdXAgPC0gYyhyZXAoXFxwcE92ZXI0XFwsIDQpLCByZXAoXFxwcE92ZXIzXFwsIDQpLCByZXAoXFxwcE92ZXIyXFwsIDQpLCByZXAoXFxwcE92ZXIxXFwsIDQpLCByZXAoXFxwcE92ZXIwXFwsIDQpKVxuY2x1c3RlciA8LSByZXAoYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSwgNSlcbmNsdXN0ZXIgPC0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCkpXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBwT3ZlcjQpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwcE92ZXIzKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcHBPdmVyMiksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBwT3ZlcjEpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBwcE92ZXIwKSlcbmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpXG4jIFBsb3R0aW5nXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
## Importing groups
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group2.tsv\))$gene
group5 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group5.tsv\))$gene
group8 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_group8.tsv\))$gene


## Importing Bobbie gene classification
geneCluster <- fread(here(refDir, \bobbie_gene_classification.csv\)) %>%
  dplyr::select(gene, enst, Cluster)
colnames(geneCluster) <- c(\gene\, \ensembl_transcript_id\, \cluster\)


## Converting transcript ID to gene ID
idPair_tg <- getBM(attributes = c(\ensembl_transcript_id\, \ensembl_gene_id\),
                 filters = \ensembl_transcript_id\,
                 values = geneCluster$ensembl_transcript,
                 mart = ensembl.v102)
geneCluster <- geneCluster %>% dplyr::left_join(idPair_tg, by = c(\ensembl_transcript_id\))

# Making data for stacked barplot
countGene <- function(geneCluster, groupName, clusterName){
  num <- nrow(geneCluster %>% dplyr::filter(ensembl_gene_id %in% groupName,
                                            cluster %in% clusterName))
  return(num)
}
countGeneList <- function(geneCluster, groupName){
  n1 <- countGene(geneCluster, groupName, \Early\)
  n2 <- countGene(geneCluster, groupName, \Middle\)
  n3 <-countGene(geneCluster, groupName, \Late\)
  n4 <- countGene(geneCluster, groupName, \Transient\)
  return(c(n1, n2, n3, n4))
}

group <- c(rep(\group1\, 4), rep(\group2\, 4), rep(\group3\, 4), rep(\group4\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 4)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, group1),
           countGeneList(geneCluster, group2),
           countGeneList(geneCluster, group5),
           countGeneList(geneCluster, group8))

data <- data.frame(group, cluster, value)


# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()


# Statistical analysis 
# Similar to the Chi-Square test, Fisher’s Exact Test is used when you have smaller sample sizes or when the expected frequency in any cell of the contingency table is below 5.
temp <- data %>% dplyr::filter(group %in% c(\group1\, \group2\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result

temp <- data %>% dplyr::filter(group %in% c(\group1\, \group3\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result

temp <- data %>% dplyr::filter(group %in% c(\group1\, \group4\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result


### P-N
resultDir <- here(\../../result\)
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

pnOver8 <- (temp2 %>% dplyr::filter(total >= 8))$gene
pnOver6 <- (temp2 %>% dplyr::filter(total >= 6, total < 8))$gene
pnOver4 <- (temp2 %>% dplyr::filter(total >= 4, total < 6))$gene
pnOver2 <- (temp2 %>% dplyr::filter(total >= 2, total < 4))$gene
pnOver0 <- (temp2 %>% dplyr::filter(total < 2))$gene

group <- c(rep(\pnOver8\, 4), rep(\pnOver6\, 4), rep(\pnOver4\, 4), rep(\pnOver2\, 4), rep(\pnOver0\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 5)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, pnOver8),
           countGeneList(geneCluster, pnOver6),
           countGeneList(geneCluster, pnOver4),
           countGeneList(geneCluster, pnOver2),
           countGeneList(geneCluster, pnOver0))

data <- data.frame(group, cluster, value)
# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()

temp <- data %>% dplyr::filter(group %in% c(\pnOver2\, \pnOver8\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result

### P-S
psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene

group <- c(rep(\psOver4\, 4), rep(\psOver3\, 4), rep(\psOver2\, 4), rep(\psOver1\, 4), rep(\psOver0\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 5)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, psOver4),
           countGeneList(geneCluster, psOver3),
           countGeneList(geneCluster, psOver2),
           countGeneList(geneCluster, psOver1),
           countGeneList(geneCluster, psOver0))

data <- data.frame(group, cluster, value)
# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()
temp <- data %>% dplyr::filter(group %in% c(\psOver2\, \psOver4\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result

### P-E
peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene

group <- c(rep(\peOver4\, 4), rep(\peOver3\, 4), rep(\peOver2\, 4), rep(\peOver1\, 4), rep(\peOver0\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 5)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, peOver4),
           countGeneList(geneCluster, peOver3),
           countGeneList(geneCluster, peOver2),
           countGeneList(geneCluster, peOver1),
           countGeneList(geneCluster, peOver0))

data <- data.frame(group, cluster, value)
# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()

### P-P
ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene

group <- c(rep(\ppOver4\, 4), rep(\ppOver3\, 4), rep(\ppOver2\, 4), rep(\ppOver1\, 4), rep(\ppOver0\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 5)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, ppOver4),
           countGeneList(geneCluster, ppOver3),
           countGeneList(geneCluster, ppOver2),
           countGeneList(geneCluster, ppOver1),
           countGeneList(geneCluster, ppOver0))
data <- data.frame(group, cluster, value)
# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## [2.22] Comparing absolute RNA expression level across group
The aim is to see if there is a trend in RNA expression level among group 1, 2, 3, 4.
It would be making comparison among genes. For this, TPM should be used.

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1nU1cxd2IzSjBhVzVuSUdkeWIzVndjMXh1WjNKdmRYQXhJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltZGxibVZNYVhOMFgwRTBPRFZmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNERXVkSE4yWENJcEtTUm5aVzVsWEc1bmNtOTFjRElnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laMlZ1WlV4cGMzUmZRVFE0TlY5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJkeWIzVndNaTUwYzNaY0lpa3BKR2RsYm1WY2JtZHliM1Z3TXlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0puWlc1bFRHbHpkRjlCTkRnMVgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlozSnZkWEF6TG5SemRsd2lLU2trWjJWdVpWeHVaM0p2ZFhBMElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDBFME9EVmZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RRdWRITjJYQ0lwS1NSblpXNWxYRzVuY205MWNEVWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlFUUTROVjkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd05TNTBjM1pjSWlrcEpHZGxibVZjYm1keWIzVndOaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSm5aVzVsVEdsemRGOUJORGcxWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQTJMblJ6ZGx3aUtTa2taMlZ1WlZ4dVozSnZkWEEzSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbWRsYm1WTWFYTjBYMEUwT0RWZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjRGN1ZEhOMlhDSXBLU1JuWlc1bFhHNW5jbTkxY0RnZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmUVRRNE5WOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3T0M1MGMzWmNJaWtwSkdkbGJtVmNibWR5YjNWd09TQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKblpXNWxUR2x6ZEY5Qk5EZzFYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBNUxuUnpkbHdpS1Nra1oyVnVaVnh1WEc1Y2JpTWpJRWx0Y0c5eWRHbHVaeUJDYjJKaWFXVWdaMlZ1WlNCamJHRnpjMmxtYVdOaGRHbHZibHh1WjJWdVpVTnNkWE4wWlhJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWW05aVltbGxYMmRsYm1WZlkyeGhjM05wWm1sallYUnBiMjR1WTNOMlhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENoblpXNWxMQ0JsYm5OMExDQkRiSFZ6ZEdWeUtWeHVZMjlzYm1GdFpYTW9aMlZ1WlVOc2RYTjBaWElwSUR3dElHTW9YQ0puWlc1bFhDSXNJRndpWlc1elpXMWliRjkwY21GdWMyTnlhWEIwWDJsa1hDSXNJRndpWTJ4MWMzUmxjbHdpS1Z4dVhHNWNiaU1qSUVOdmJuWmxjblJwYm1jZ2RISmhibk5qY21sd2RDQkpSQ0IwYnlCblpXNWxJRWxFWEc1cFpGQmhhWEpmZEdjZ1BDMGdaMlYwUWswb1lYUjBjbWxpZFhSbGN5QTlJR01vWENKbGJuTmxiV0pzWDNSeVlXNXpZM0pwY0hSZmFXUmNJaXdnWENKbGJuTmxiV0pzWDJkbGJtVmZhV1JjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnBiSFJsY25NZ1BTQmNJbVZ1YzJWdFlteGZkSEpoYm5OamNtbHdkRjlwWkZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZV3gxWlhNZ1BTQm5aVzVsUTJ4MWMzUmxjaVJsYm5ObGJXSnNYM1J5WVc1elkzSnBjSFFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxaGNuUWdQU0JsYm5ObGJXSnNMbll4TURJcFhHNW5aVzVsUTJ4MWMzUmxjaUE4TFNCblpXNWxRMngxYzNSbGNpQWxQaVVnWkhCc2VYSTZPbXhsWm5SZmFtOXBiaWhwWkZCaGFYSmZkR2NzSUdKNUlEMGdZeWhjSW1WdWMyVnRZbXhmZEhKaGJuTmpjbWx3ZEY5cFpGd2lLU2xjYmx4dUl5Qk5ZV3RwYm1jZ1pHRjBZU0JtYjNJZ2MzUmhZMnRsWkNCaVlYSndiRzkwWEc1amIzVnVkRWRsYm1VZ1BDMGdablZ1WTNScGIyNG9aMlZ1WlVOc2RYTjBaWElzSUdkeWIzVndUbUZ0WlN3Z1kyeDFjM1JsY2s1aGJXVXBlMXh1SUNCdWRXMGdQQzBnYm5KdmR5aG5aVzVsUTJ4MWMzUmxjaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhsYm5ObGJXSnNYMmRsYm1WZmFXUWdKV2x1SlNCbmNtOTFjRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnNkWE4wWlhJZ0pXbHVKU0JqYkhWemRHVnlUbUZ0WlNrcFhHNGdJSEpsZEhWeWJpaHVkVzBwWEc1OVhHNWpiM1Z1ZEVkbGJtVk1hWE4wSUR3dElHWjFibU4wYVc5dUtHZGxibVZEYkhWemRHVnlMQ0JuY205MWNFNWhiV1VwZTF4dUlDQnVNU0E4TFNCamIzVnVkRWRsYm1Vb1oyVnVaVU5zZFhOMFpYSXNJR2R5YjNWd1RtRnRaU3dnWENKRllYSnNlVndpS1Z4dUlDQnVNaUE4TFNCamIzVnVkRWRsYm1Vb1oyVnVaVU5zZFhOMFpYSXNJR2R5YjNWd1RtRnRaU3dnWENKTmFXUmtiR1ZjSWlsY2JpQWdiak1nUEMxamIzVnVkRWRsYm1Vb1oyVnVaVU5zZFhOMFpYSXNJR2R5YjNWd1RtRnRaU3dnWENKTVlYUmxYQ0lwWEc0Z0lHNDBJRHd0SUdOdmRXNTBSMlZ1WlNoblpXNWxRMngxYzNSbGNpd2daM0p2ZFhCT1lXMWxMQ0JjSWxSeVlXNXphV1Z1ZEZ3aUtWeHVJQ0J5WlhSMWNtNG9ZeWh1TVN3Z2JqSXNJRzR6TENCdU5Da3BYRzU5WEc1Y2JtZHliM1Z3SUR3dElHTW9jbVZ3S0Z3aVozSnZkWEF4WENJc0lEUXBMQ0J5WlhBb1hDSm5jbTkxY0RKY0lpd2dOQ2tzSUhKbGNDaGNJbWR5YjNWd00xd2lMQ0EwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdjbVZ3S0Z3aVozSnZkWEEwWENJc0lEUXBMQ0J5WlhBb1hDSm5jbTkxY0RWY0lpd2dOQ2tzSUhKbGNDaGNJbWR5YjNWd05sd2lMQ0EwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdjbVZ3S0Z3aVozSnZkWEEzWENJc0lEUXBMQ0J5WlhBb1hDSm5jbTkxY0RoY0lpd2dOQ2tzSUhKbGNDaGNJbWR5YjNWd09Wd2lMQ0EwS1NsY2JtTnNkWE4wWlhJZ1BDMGdjbVZ3S0dNb1hDSkZZWEpzZVZ3aUxDQmNJazFwWkdSc1pWd2lMQ0JjSWt4aGRHVmNJaXdnWENKVWNtRnVjMmxsYm5SY0lpa3NJRGtwWEc1amJIVnpkR1Z5SUR3dElHWmhZM1J2Y2loamJIVnpkR1Z5TENCc1pYWmxiSE1nUFNCaktGd2lSV0Z5YkhsY0lpd2dYQ0pOYVdSa2JHVmNJaXdnWENKTVlYUmxYQ0lzSUZ3aVZISmhibk5wWlc1MFhDSXBLVnh1ZG1Gc2RXVWdQQzBnWXloamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCbmNtOTFjREVwTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQm5jbTkxY0RJcExGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0JuY205MWNETXBMRnh1SUNBZ0lDQWdJQ0FnSUNCamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCbmNtOTFjRFFwTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQm5jbTkxY0RVcExGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0JuY205MWNEWXBMRnh1SUNBZ0lDQWdJQ0FnSUNCamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCbmNtOTFjRGNwTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQm5jbTkxY0RncExGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0JuY205MWNEa3BLVnh1WEc1a1lYUmhJRHd0SUdSaGRHRXVabkpoYldVb1ozSnZkWEFzSUdOc2RYTjBaWElzSUhaaGJIVmxLVnh1WEc1Y2JpTWdVR3h2ZEhScGJtZGNibWRuY0d4dmRDaGtZWFJoTENCaFpYTW9abWxzYkQxamJIVnpkR1Z5TENCNVBYWmhiSFZsTENCNFBXZHliM1Z3S1NrZ0t5QmNiaUFnSUNCblpXOXRYMkpoY2lod2IzTnBkR2x2YmoxY0ltWnBiR3hjSWl3Z2MzUmhkRDFjSW1sa1pXNTBhWFI1WENJcElDc2dkR2hsYldWZlkyeGhjM05wWXlncFhHNWNibHh1SXlCVGRHRjBhWE4wYVdOaGJDQmhibUZzZVhOcGN5QmNiaU1nVTJsdGFXeGhjaUIwYnlCMGFHVWdRMmhwTFZOeGRXRnlaU0IwWlhOMExDQkdhWE5vWlhMaWdKbHpJRVY0WVdOMElGUmxjM1FnYVhNZ2RYTmxaQ0IzYUdWdUlIbHZkU0JvWVhabElITnRZV3hzWlhJZ2MyRnRjR3hsSUhOcGVtVnpJRzl5SUhkb1pXNGdkR2hsSUdWNGNHVmpkR1ZrSUdaeVpYRjFaVzVqZVNCcGJpQmhibmtnWTJWc2JDQnZaaUIwYUdVZ1kyOXVkR2x1WjJWdVkza2dkR0ZpYkdVZ2FYTWdZbVZzYjNjZ05TNWNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0FsYVc0bElHTW9YQ0puY205MWNERmNJaXdnWENKbmNtOTFjREpjSWlrcFhHNWpiMjUwYVc1blpXNWplVjkwWVdKc1pTQThMU0I0ZEdGaWN5aDJZV3gxWlNCK0lHZHliM1Z3SUNzZ1kyeDFjM1JsY2l3Z1pHRjBZU0E5SUhSbGJYQXBYRzVtYVhOb1pYSmZjbVZ6ZFd4MElEd3RJR1pwYzJobGNpNTBaWE4wS0dOdmJuUnBibWRsYm1ONVgzUmhZbXhsTENCemFXMTFiR0YwWlM1d0xuWmhiSFZsSUQwZ1ZGSlZSU3dnUWlBOUlERXdNREF3TUNsY2JtWnBjMmhsY2w5eVpYTjFiSFJjYmx4dWRHVnRjQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lDVnBiaVVnWXloY0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd00xd2lLU2xjYm1OdmJuUnBibWRsYm1ONVgzUmhZbXhsSUR3dElIaDBZV0p6S0haaGJIVmxJSDRnWjNKdmRYQWdLeUJqYkhWemRHVnlMQ0JrWVhSaElEMGdkR1Z0Y0NsY2JtWnBjMmhsY2w5eVpYTjFiSFFnUEMwZ1ptbHphR1Z5TG5SbGMzUW9ZMjl1ZEdsdVoyVnVZM2xmZEdGaWJHVXNJSE5wYlhWc1lYUmxMbkF1ZG1Gc2RXVWdQU0JVVWxWRkxDQkNJRDBnTVRBd01EQXdLVnh1Wm1semFHVnlYM0psYzNWc2RGeHVYRzUwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnSldsdUpTQmpLRndpWjNKdmRYQXhYQ0lzSUZ3aVozSnZkWEEwWENJcEtWeHVZMjl1ZEdsdVoyVnVZM2xmZEdGaWJHVWdQQzBnZUhSaFluTW9kbUZzZFdVZ2ZpQm5jbTkxY0NBcklHTnNkWE4wWlhJc0lHUmhkR0VnUFNCMFpXMXdLVnh1Wm1semFHVnlYM0psYzNWc2RDQThMU0JtYVhOb1pYSXVkR1Z6ZENoamIyNTBhVzVuWlc1amVWOTBZV0pzWlN3Z2MybHRkV3hoZEdVdWNDNTJZV3gxWlNBOUlGUlNWVVVzSUVJZ1BTQXhNREF3TURBcFhHNW1hWE5vWlhKZmNtVnpkV3gwWEc1Y2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxuIyMgSW1wb3J0aW5nIGdyb3Vwc1xuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCkpJGdlbmVcbmdyb3VwMyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAzLnRzdlxcKSkkZ2VuZVxuZ3JvdXA0IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDQudHN2XFwpKSRnZW5lXG5ncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNS50c3ZcXCkpJGdlbmVcbmdyb3VwNiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA2LnRzdlxcKSkkZ2VuZVxuZ3JvdXA3IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDcudHN2XFwpKSRnZW5lXG5ncm91cDggPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwOC50c3ZcXCkpJGdlbmVcbmdyb3VwOSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA5LnRzdlxcKSkkZ2VuZVxuXG5cbiMjIEltcG9ydGluZyBCb2JiaWUgZ2VuZSBjbGFzc2lmaWNhdGlvblxuZ2VuZUNsdXN0ZXIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcYm9iYmllX2dlbmVfY2xhc3NpZmljYXRpb24uY3N2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChnZW5lLCBlbnN0LCBDbHVzdGVyKVxuY29sbmFtZXMoZ2VuZUNsdXN0ZXIpIDwtIGMoXFxnZW5lXFwsIFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwsIFxcY2x1c3RlclxcKVxuXG5cbiMjIENvbnZlcnRpbmcgdHJhbnNjcmlwdCBJRCB0byBnZW5lIElEXG5pZFBhaXJfdGcgPC0gZ2V0Qk0oYXR0cmlidXRlcyA9IGMoXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCwgXFxlbnNlbWJsX2dlbmVfaWRcXCksXG4gICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcLFxuICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBnZW5lQ2x1c3RlciRlbnNlbWJsX3RyYW5zY3JpcHQsXG4gICAgICAgICAgICAgICAgIG1hcnQgPSBlbnNlbWJsLnYxMDIpXG5nZW5lQ2x1c3RlciA8LSBnZW5lQ2x1c3RlciAlPiUgZHBseXI6OmxlZnRfam9pbihpZFBhaXJfdGcsIGJ5ID0gYyhcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcKSlcblxuIyBNYWtpbmcgZGF0YSBmb3Igc3RhY2tlZCBiYXJwbG90XG5jb3VudEdlbmUgPC0gZnVuY3Rpb24oZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgY2x1c3Rlck5hbWUpe1xuICBudW0gPC0gbnJvdyhnZW5lQ2x1c3RlciAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsX2dlbmVfaWQgJWluJSBncm91cE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIgJWluJSBjbHVzdGVyTmFtZSkpXG4gIHJldHVybihudW0pXG59XG5jb3VudEdlbmVMaXN0IDwtIGZ1bmN0aW9uKGdlbmVDbHVzdGVyLCBncm91cE5hbWUpe1xuICBuMSA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgXFxFYXJseVxcKVxuICBuMiA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgXFxNaWRkbGVcXClcbiAgbjMgPC1jb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgXFxMYXRlXFwpXG4gIG40IDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXFRyYW5zaWVudFxcKVxuICByZXR1cm4oYyhuMSwgbjIsIG4zLCBuNCkpXG59XG5cbmdyb3VwIDwtIGMocmVwKFxcZ3JvdXAxXFwsIDQpLCByZXAoXFxncm91cDJcXCwgNCksIHJlcChcXGdyb3VwM1xcLCA0KSxcbiAgICAgICAgICAgcmVwKFxcZ3JvdXA0XFwsIDQpLCByZXAoXFxncm91cDVcXCwgNCksIHJlcChcXGdyb3VwNlxcLCA0KSxcbiAgICAgICAgICAgcmVwKFxcZ3JvdXA3XFwsIDQpLCByZXAoXFxncm91cDhcXCwgNCksIHJlcChcXGdyb3VwOVxcLCA0KSlcbmNsdXN0ZXIgPC0gcmVwKGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCksIDkpXG5jbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpKVxudmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDEpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDIpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDMpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDQpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDUpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDYpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDcpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDgpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDkpKVxuXG5kYXRhIDwtIGRhdGEuZnJhbWUoZ3JvdXAsIGNsdXN0ZXIsIHZhbHVlKVxuXG5cbiMgUGxvdHRpbmdcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdD1cXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cblxuIyBTdGF0aXN0aWNhbCBhbmFseXNpcyBcbiMgU2ltaWxhciB0byB0aGUgQ2hpLVNxdWFyZSB0ZXN0LCBGaXNoZXLigJlzIEV4YWN0IFRlc3QgaXMgdXNlZCB3aGVuIHlvdSBoYXZlIHNtYWxsZXIgc2FtcGxlIHNpemVzIG9yIHdoZW4gdGhlIGV4cGVjdGVkIGZyZXF1ZW5jeSBpbiBhbnkgY2VsbCBvZiB0aGUgY29udGluZ2VuY3kgdGFibGUgaXMgYmVsb3cgNS5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxncm91cDFcXCwgXFxncm91cDJcXCkpXG5jb250aW5nZW5jeV90YWJsZSA8LSB4dGFicyh2YWx1ZSB+IGdyb3VwICsgY2x1c3RlciwgZGF0YSA9IHRlbXApXG5maXNoZXJfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSwgQiA9IDEwMDAwMClcbmZpc2hlcl9yZXN1bHRcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYyhcXGdyb3VwMVxcLCBcXGdyb3VwM1xcKSlcbmNvbnRpbmdlbmN5X3RhYmxlIDwtIHh0YWJzKHZhbHVlIH4gZ3JvdXAgKyBjbHVzdGVyLCBkYXRhID0gdGVtcClcbmZpc2hlcl9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCBCID0gMTAwMDAwKVxuZmlzaGVyX3Jlc3VsdFxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKFxcZ3JvdXAxXFwsIFxcZ3JvdXA0XFwpKVxuY29udGluZ2VuY3lfdGFibGUgPC0geHRhYnModmFsdWUgfiBncm91cCArIGNsdXN0ZXIsIGRhdGEgPSB0ZW1wKVxuZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEIgPSAxMDAwMDApXG5maXNoZXJfcmVzdWx0XG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
## Importing groups
group1 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group2.tsv\))$gene
group3 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group3.tsv\))$gene
group4 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group4.tsv\))$gene
group5 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group5.tsv\))$gene
group6 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group6.tsv\))$gene
group7 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group7.tsv\))$gene
group8 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group8.tsv\))$gene
group9 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group9.tsv\))$gene


## Importing Bobbie gene classification
geneCluster <- fread(here(refDir, \bobbie_gene_classification.csv\)) %>%
  dplyr::select(gene, enst, Cluster)
colnames(geneCluster) <- c(\gene\, \ensembl_transcript_id\, \cluster\)


## Converting transcript ID to gene ID
idPair_tg <- getBM(attributes = c(\ensembl_transcript_id\, \ensembl_gene_id\),
                 filters = \ensembl_transcript_id\,
                 values = geneCluster$ensembl_transcript,
                 mart = ensembl.v102)
geneCluster <- geneCluster %>% dplyr::left_join(idPair_tg, by = c(\ensembl_transcript_id\))

# Making data for stacked barplot
countGene <- function(geneCluster, groupName, clusterName){
  num <- nrow(geneCluster %>% dplyr::filter(ensembl_gene_id %in% groupName,
                                            cluster %in% clusterName))
  return(num)
}
countGeneList <- function(geneCluster, groupName){
  n1 <- countGene(geneCluster, groupName, \Early\)
  n2 <- countGene(geneCluster, groupName, \Middle\)
  n3 <-countGene(geneCluster, groupName, \Late\)
  n4 <- countGene(geneCluster, groupName, \Transient\)
  return(c(n1, n2, n3, n4))
}

group <- c(rep(\group1\, 4), rep(\group2\, 4), rep(\group3\, 4),
           rep(\group4\, 4), rep(\group5\, 4), rep(\group6\, 4),
           rep(\group7\, 4), rep(\group8\, 4), rep(\group9\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 9)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, group1),
           countGeneList(geneCluster, group2),
           countGeneList(geneCluster, group3),
           countGeneList(geneCluster, group4),
           countGeneList(geneCluster, group5),
           countGeneList(geneCluster, group6),
           countGeneList(geneCluster, group7),
           countGeneList(geneCluster, group8),
           countGeneList(geneCluster, group9))

data <- data.frame(group, cluster, value)


# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()


# Statistical analysis 
# Similar to the Chi-Square test, Fisher’s Exact Test is used when you have smaller sample sizes or when the expected frequency in any cell of the contingency table is below 5.
temp <- data %>% dplyr::filter(group %in% c(\group1\, \group2\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result

temp <- data %>% dplyr::filter(group %in% c(\group1\, \group3\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result

temp <- data %>% dplyr::filter(group %in% c(\group1\, \group4\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWdTVzF3YjNKMGFXNW5JR2R5YjNWd2MxeHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdkbGJtVk1hWE4wWDBFME9EVmZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOW5jbTkxY0RFdWRITjJYRndwS1NSblpXNWxYRzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1oyVnVaVXhwYzNSZlFUUTROVjkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMmR5YjNWd01pNTBjM1pjWENrcEpHZGxibVZjYm1keWIzVndNeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeG5aVzVsVEdsemRGOUJORGcxWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWjNKdmRYQXpMblJ6ZGx4Y0tTa2taMlZ1WlZ4dVozSnZkWEEwSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMEUwT0RWZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5bmNtOTFjRFF1ZEhOMlhGd3BLU1JuWlc1bFhHNW5jbTkxY0RVZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmUVRRNE5WOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gyZHliM1Z3TlM1MGMzWmNYQ2twSkdkbGJtVmNibWR5YjNWd05pQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4blpXNWxUR2x6ZEY5Qk5EZzFYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZaM0p2ZFhBMkxuUnpkbHhjS1Nra1oyVnVaVnh1WjNKdmRYQTNJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHZGxibVZNYVhOMFgwRTBPRFZmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjluY205MWNEY3VkSE4yWEZ3cEtTUm5aVzVsWEc1bmNtOTFjRGdnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZRVFE0TlY5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJkeWIzVndPQzUwYzNaY1hDa3BKR2RsYm1WY2JtZHliM1Z3T1NBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhuWlc1bFRHbHpkRjlCTkRnMVgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlozSnZkWEE1TG5SemRseGNLU2trWjJWdVpWeHVYRzVjYmlNaklFbHRjRzl5ZEdsdVp5QkNiMkppYVdVZ1oyVnVaU0JqYkdGemMybG1hV05oZEdsdmJseHVaMlZ1WlVOc2RYTjBaWElnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNZbTlpWW1sbFgyZGxibVZmWTJ4aGMzTnBabWxqWVhScGIyNHVZM04yWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2huWlc1bExDQmxibk4wTENCRGJIVnpkR1Z5S1Z4dVkyOXNibUZ0WlhNb1oyVnVaVU5zZFhOMFpYSXBJRHd0SUdNb1hGeG5aVzVsWEZ3c0lGeGNaVzV6WlcxaWJGOTBjbUZ1YzJOeWFYQjBYMmxrWEZ3c0lGeGNZMngxYzNSbGNseGNLVnh1WEc1Y2JpTWpJRU52Ym5abGNuUnBibWNnZEhKaGJuTmpjbWx3ZENCSlJDQjBieUJuWlc1bElFbEVYRzVwWkZCaGFYSmZkR2NnUEMwZ1oyVjBRazBvWVhSMGNtbGlkWFJsY3lBOUlHTW9YRnhsYm5ObGJXSnNYM1J5WVc1elkzSnBjSFJmYVdSY1hDd2dYRnhsYm5ObGJXSnNYMmRsYm1WZmFXUmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdacGJIUmxjbk1nUFNCY1hHVnVjMlZ0WW14ZmRISmhibk5qY21sd2RGOXBaRnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllXeDFaWE1nUFNCblpXNWxRMngxYzNSbGNpUmxibk5sYldKc1gzUnlZVzV6WTNKcGNIUXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzFoY25RZ1BTQmxibk5sYldKc0xuWXhNRElwWEc1blpXNWxRMngxYzNSbGNpQThMU0JuWlc1bFEyeDFjM1JsY2lBbFBpVWdaSEJzZVhJNk9teGxablJmYW05cGJpaHBaRkJoYVhKZmRHY3NJR0o1SUQwZ1l5aGNYR1Z1YzJWdFlteGZkSEpoYm5OamNtbHdkRjlwWkZ4Y0tTbGNibHh1SXlCTllXdHBibWNnWkdGMFlTQm1iM0lnYzNSaFkydGxaQ0JpWVhKd2JHOTBYRzVqYjNWdWRFZGxibVVnUEMwZ1puVnVZM1JwYjI0b1oyVnVaVU5zZFhOMFpYSXNJR2R5YjNWd1RtRnRaU3dnWTJ4MWMzUmxjazVoYldVcGUxeHVJQ0J1ZFcwZ1BDMGdibkp2ZHloblpXNWxRMngxYzNSbGNpQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaGxibk5sYldKc1gyZGxibVZmYVdRZ0pXbHVKU0JuY205MWNFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOc2RYTjBaWElnSldsdUpTQmpiSFZ6ZEdWeVRtRnRaU2twWEc0Z0lISmxkSFZ5YmlodWRXMHBYRzU5WEc1amIzVnVkRWRsYm1WTWFYTjBJRHd0SUdaMWJtTjBhVzl1S0dkbGJtVkRiSFZ6ZEdWeUxDQm5jbTkxY0U1aGJXVXBlMXh1SUNCdU1TQThMU0JqYjNWdWRFZGxibVVvWjJWdVpVTnNkWE4wWlhJc0lHZHliM1Z3VG1GdFpTd2dYRnhGWVhKc2VWeGNLVnh1SUNCdU1pQThMU0JqYjNWdWRFZGxibVVvWjJWdVpVTnNkWE4wWlhJc0lHZHliM1Z3VG1GdFpTd2dYRnhOYVdSa2JHVmNYQ2xjYmlBZ2JqTWdQQzFqYjNWdWRFZGxibVVvWjJWdVpVTnNkWE4wWlhJc0lHZHliM1Z3VG1GdFpTd2dYRnhNWVhSbFhGd3BYRzRnSUc0MElEd3RJR052ZFc1MFIyVnVaU2huWlc1bFEyeDFjM1JsY2l3Z1ozSnZkWEJPWVcxbExDQmNYRlJ5WVc1emFXVnVkRnhjS1Z4dUlDQnlaWFIxY200b1l5aHVNU3dnYmpJc0lHNHpMQ0J1TkNrcFhHNTlYRzVjYm1keWIzVndJRHd0SUdNb2NtVndLRnhjWjNKdmRYQXhYRndzSURRcExDQnlaWEFvWEZ4bmNtOTFjREpjWEN3Z05Da3NJSEpsY0NoY1hHZHliM1Z3TTF4Y0xDQTBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ2NtVndLRnhjWjNKdmRYQTBYRndzSURRcExDQnlaWEFvWEZ4bmNtOTFjRFZjWEN3Z05Da3NJSEpsY0NoY1hHZHliM1Z3Tmx4Y0xDQTBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ2NtVndLRnhjWjNKdmRYQTNYRndzSURRcExDQnlaWEFvWEZ4bmNtOTFjRGhjWEN3Z05Da3NJSEpsY0NoY1hHZHliM1Z3T1Z4Y0xDQTBLU2xjYm1Oc2RYTjBaWElnUEMwZ2NtVndLR01vWEZ4RllYSnNlVnhjTENCY1hFMXBaR1JzWlZ4Y0xDQmNYRXhoZEdWY1hDd2dYRnhVY21GdWMybGxiblJjWENrc0lEa3BYRzVqYkhWemRHVnlJRHd0SUdaaFkzUnZjaWhqYkhWemRHVnlMQ0JzWlhabGJITWdQU0JqS0Z4Y1JXRnliSGxjWEN3Z1hGeE5hV1JrYkdWY1hDd2dYRnhNWVhSbFhGd3NJRnhjVkhKaGJuTnBaVzUwWEZ3cEtWeHVkbUZzZFdVZ1BDMGdZeWhqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0JuY205MWNERXBMRnh1SUNBZ0lDQWdJQ0FnSUNCamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCbmNtOTFjRElwTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQm5jbTkxY0RNcExGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0JuY205MWNEUXBMRnh1SUNBZ0lDQWdJQ0FnSUNCamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCbmNtOTFjRFVwTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQm5jbTkxY0RZcExGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0JuY205MWNEY3BMRnh1SUNBZ0lDQWdJQ0FnSUNCamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCbmNtOTFjRGdwTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQm5jbTkxY0RrcEtWeHVYRzVrWVhSaElEd3RJR1JoZEdFdVpuSmhiV1VvWjNKdmRYQXNJR05zZFhOMFpYSXNJSFpoYkhWbEtWeHVYRzVjYmlNZ1VHeHZkSFJwYm1kY2JtZG5jR3h2ZENoa1lYUmhMQ0JoWlhNb1ptbHNiRDFqYkhWemRHVnlMQ0I1UFhaaGJIVmxMQ0I0UFdkeWIzVndLU2tnS3lCY2JpQWdJQ0JuWlc5dFgySmhjaWh3YjNOcGRHbHZiajFjWEdacGJHeGNYQ3dnYzNSaGREMWNYR2xrWlc1MGFYUjVYRndwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwWEc1Y2JseHVJeUJUZEdGMGFYTjBhV05oYkNCaGJtRnNlWE5wY3lCY2JpTWdVMmx0YVd4aGNpQjBieUIwYUdVZ1EyaHBMVk54ZFdGeVpTQjBaWE4wTENCR2FYTm9aWExpZ0pseklFVjRZV04wSUZSbGMzUWdhWE1nZFhObFpDQjNhR1Z1SUhsdmRTQm9ZWFpsSUhOdFlXeHNaWElnYzJGdGNHeGxJSE5wZW1WeklHOXlJSGRvWlc0Z2RHaGxJR1Y0Y0dWamRHVmtJR1p5WlhGMVpXNWplU0JwYmlCaGJua2dZMlZzYkNCdlppQjBhR1VnWTI5dWRHbHVaMlZ1WTNrZ2RHRmliR1VnYVhNZ1ltVnNiM2NnTlM1Y2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQWxhVzRsSUdNb1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNESmNYQ2twWEc1amIyNTBhVzVuWlc1amVWOTBZV0pzWlNBOExTQjRkR0ZpY3loMllXeDFaU0IrSUdkeWIzVndJQ3NnWTJ4MWMzUmxjaXdnWkdGMFlTQTlJSFJsYlhBcFhHNW1hWE5vWlhKZmNtVnpkV3gwSUR3dElHWnBjMmhsY2k1MFpYTjBLR052Ym5ScGJtZGxibU41WDNSaFlteGxMQ0J6YVcxMWJHRjBaUzV3TG5aaGJIVmxJRDBnVkZKVlJTd2dRaUE5SURFd01EQXdNQ2xjYm1acGMyaGxjbDl5WlhOMWJIUmNibHh1ZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUNWcGJpVWdZeWhjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TTF4Y0tTbGNibU52Ym5ScGJtZGxibU41WDNSaFlteGxJRHd0SUhoMFlXSnpLSFpoYkhWbElINGdaM0p2ZFhBZ0t5QmpiSFZ6ZEdWeUxDQmtZWFJoSUQwZ2RHVnRjQ2xjYm1acGMyaGxjbDl5WlhOMWJIUWdQQzBnWm1semFHVnlMblJsYzNRb1kyOXVkR2x1WjJWdVkzbGZkR0ZpYkdVc0lITnBiWFZzWVhSbExuQXVkbUZzZFdVZ1BTQlVVbFZGTENCQ0lEMGdNVEF3TURBd0tWeHVabWx6YUdWeVgzSmxjM1ZzZEZ4dVhHNTBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdKV2x1SlNCaktGeGNaM0p2ZFhBeFhGd3NJRnhjWjNKdmRYQTBYRndwS1Z4dVkyOXVkR2x1WjJWdVkzbGZkR0ZpYkdVZ1BDMGdlSFJoWW5Nb2RtRnNkV1VnZmlCbmNtOTFjQ0FySUdOc2RYTjBaWElzSUdSaGRHRWdQU0IwWlcxd0tWeHVabWx6YUdWeVgzSmxjM1ZzZENBOExTQm1hWE5vWlhJdWRHVnpkQ2hqYjI1MGFXNW5aVzVqZVY5MFlXSnNaU3dnYzJsdGRXeGhkR1V1Y0M1MllXeDFaU0E5SUZSU1ZVVXNJRUlnUFNBeE1EQXdNREFwWEc1bWFYTm9aWEpmY21WemRXeDBYRzVjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbiMjIEltcG9ydGluZyBncm91cHNcbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDIudHN2XFwpKSRnZW5lXG5ncm91cDMgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwMy50c3ZcXCkpJGdlbmVcbmdyb3VwNCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA0LnRzdlxcKSkkZ2VuZVxuZ3JvdXA1IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDUudHN2XFwpKSRnZW5lXG5ncm91cDYgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNi50c3ZcXCkpJGdlbmVcbmdyb3VwNyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA3LnRzdlxcKSkkZ2VuZVxuZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2XFwpKSRnZW5lXG5ncm91cDkgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwOS50c3ZcXCkpJGdlbmVcblxuXG4jIyBJbXBvcnRpbmcgQm9iYmllIGdlbmUgY2xhc3NpZmljYXRpb25cbmdlbmVDbHVzdGVyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGJvYmJpZV9nZW5lX2NsYXNzaWZpY2F0aW9uLmNzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZ2VuZSwgZW5zdCwgQ2x1c3RlcilcbmNvbG5hbWVzKGdlbmVDbHVzdGVyKSA8LSBjKFxcZ2VuZVxcLCBcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcLCBcXGNsdXN0ZXJcXClcblxuXG4jIyBDb252ZXJ0aW5nIHRyYW5zY3JpcHQgSUQgdG8gZ2VuZSBJRFxuaWRQYWlyX3RnIDwtIGdldEJNKGF0dHJpYnV0ZXMgPSBjKFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwsIFxcZW5zZW1ibF9nZW5lX2lkXFwpLFxuICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCxcbiAgICAgICAgICAgICAgICAgdmFsdWVzID0gZ2VuZUNsdXN0ZXIkZW5zZW1ibF90cmFuc2NyaXB0LFxuICAgICAgICAgICAgICAgICBtYXJ0ID0gZW5zZW1ibC52MTAyKVxuZ2VuZUNsdXN0ZXIgPC0gZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oaWRQYWlyX3RnLCBieSA9IGMoXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCkpXG5cbiMgTWFraW5nIGRhdGEgZm9yIHN0YWNrZWQgYmFycGxvdFxuY291bnRHZW5lIDwtIGZ1bmN0aW9uKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIGNsdXN0ZXJOYW1lKXtcbiAgbnVtIDwtIG5yb3coZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibF9nZW5lX2lkICVpbiUgZ3JvdXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyICVpbiUgY2x1c3Rlck5hbWUpKVxuICByZXR1cm4obnVtKVxufVxuY291bnRHZW5lTGlzdCA8LSBmdW5jdGlvbihnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lKXtcbiAgbjEgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcRWFybHlcXClcbiAgbjIgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcTWlkZGxlXFwpXG4gIG4zIDwtY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcTGF0ZVxcKVxuICBuNCA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgXFxUcmFuc2llbnRcXClcbiAgcmV0dXJuKGMobjEsIG4yLCBuMywgbjQpKVxufVxuXG5ncm91cCA8LSBjKHJlcChcXGdyb3VwMVxcLCA0KSwgcmVwKFxcZ3JvdXAyXFwsIDQpLCByZXAoXFxncm91cDNcXCwgNCksXG4gICAgICAgICAgIHJlcChcXGdyb3VwNFxcLCA0KSwgcmVwKFxcZ3JvdXA1XFwsIDQpLCByZXAoXFxncm91cDZcXCwgNCksXG4gICAgICAgICAgIHJlcChcXGdyb3VwN1xcLCA0KSwgcmVwKFxcZ3JvdXA4XFwsIDQpLCByZXAoXFxncm91cDlcXCwgNCkpXG5jbHVzdGVyIDwtIHJlcChjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpLCA5KVxuY2x1c3RlciA8LSBmYWN0b3IoY2x1c3RlciwgbGV2ZWxzID0gYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSlcbnZhbHVlIDwtIGMoY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXAxKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXAyKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXAzKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA0KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA1KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA2KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA3KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA4KSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA5KSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcblxuXG4jIFBsb3R0aW5nXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5cbiMgU3RhdGlzdGljYWwgYW5hbHlzaXMgXG4jIFNpbWlsYXIgdG8gdGhlIENoaS1TcXVhcmUgdGVzdCwgRmlzaGVy4oCZcyBFeGFjdCBUZXN0IGlzIHVzZWQgd2hlbiB5b3UgaGF2ZSBzbWFsbGVyIHNhbXBsZSBzaXplcyBvciB3aGVuIHRoZSBleHBlY3RlZCBmcmVxdWVuY3kgaW4gYW55IGNlbGwgb2YgdGhlIGNvbnRpbmdlbmN5IHRhYmxlIGlzIGJlbG93IDUuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpKVxuY29udGluZ2VuY3lfdGFibGUgPC0geHRhYnModmFsdWUgfiBncm91cCArIGNsdXN0ZXIsIGRhdGEgPSB0ZW1wKVxuZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEIgPSAxMDAwMDApXG5maXNoZXJfcmVzdWx0XG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxncm91cDFcXCwgXFxncm91cDNcXCkpXG5jb250aW5nZW5jeV90YWJsZSA8LSB4dGFicyh2YWx1ZSB+IGdyb3VwICsgY2x1c3RlciwgZGF0YSA9IHRlbXApXG5maXNoZXJfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSwgQiA9IDEwMDAwMClcbmZpc2hlcl9yZXN1bHRcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYyhcXGdyb3VwMVxcLCBcXGdyb3VwNFxcKSlcbmNvbnRpbmdlbmN5X3RhYmxlIDwtIHh0YWJzKHZhbHVlIH4gZ3JvdXAgKyBjbHVzdGVyLCBkYXRhID0gdGVtcClcbmZpc2hlcl9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCBCID0gMTAwMDAwKVxuZmlzaGVyX3Jlc3VsdFxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMgSW1wb3J0aW5nIGdyb3Vwc1xuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3ZcXCkpJGdlbmVcbmdyb3VwMyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAzLnRzdlxcKSkkZ2VuZVxuZ3JvdXA0IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDQudHN2XFwpKSRnZW5lXG5ncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNS50c3ZcXCkpJGdlbmVcbmdyb3VwNiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA2LnRzdlxcKSkkZ2VuZVxuZ3JvdXA3IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDcudHN2XFwpKSRnZW5lXG5ncm91cDggPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwOC50c3ZcXCkpJGdlbmVcbmdyb3VwOSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA5LnRzdlxcKSkkZ2VuZVxuXG5cbiMjIEltcG9ydGluZyBCb2JiaWUgZ2VuZSBjbGFzc2lmaWNhdGlvblxuZ2VuZUNsdXN0ZXIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcYm9iYmllX2dlbmVfY2xhc3NpZmljYXRpb24uY3N2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChnZW5lLCBlbnN0LCBDbHVzdGVyKVxuY29sbmFtZXMoZ2VuZUNsdXN0ZXIpIDwtIGMoXFxnZW5lXFwsIFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwsIFxcY2x1c3RlclxcKVxuXG5cbiMjIENvbnZlcnRpbmcgdHJhbnNjcmlwdCBJRCB0byBnZW5lIElEXG5pZFBhaXJfdGcgPC0gZ2V0Qk0oYXR0cmlidXRlcyA9IGMoXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCwgXFxlbnNlbWJsX2dlbmVfaWRcXCksXG4gICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcLFxuICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBnZW5lQ2x1c3RlciRlbnNlbWJsX3RyYW5zY3JpcHQsXG4gICAgICAgICAgICAgICAgIG1hcnQgPSBlbnNlbWJsLnYxMDIpXG5nZW5lQ2x1c3RlciA8LSBnZW5lQ2x1c3RlciAlPiUgZHBseXI6OmxlZnRfam9pbihpZFBhaXJfdGcsIGJ5ID0gYyhcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcKSlcblxuIyBNYWtpbmcgZGF0YSBmb3Igc3RhY2tlZCBiYXJwbG90XG5jb3VudEdlbmUgPC0gZnVuY3Rpb24oZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgY2x1c3Rlck5hbWUpe1xuICBudW0gPC0gbnJvdyhnZW5lQ2x1c3RlciAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsX2dlbmVfaWQgJWluJSBncm91cE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIgJWluJSBjbHVzdGVyTmFtZSkpXG4gIHJldHVybihudW0pXG59XG5jb3VudEdlbmVMaXN0IDwtIGZ1bmN0aW9uKGdlbmVDbHVzdGVyLCBncm91cE5hbWUpe1xuICBuMSA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgXFxFYXJseVxcKVxuICBuMiA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgXFxNaWRkbGVcXClcbiAgbjMgPC1jb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgXFxMYXRlXFwpXG4gIG40IDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXFRyYW5zaWVudFxcKVxuICByZXR1cm4oYyhuMSwgbjIsIG4zLCBuNCkpXG59XG5cbmdyb3VwIDwtIGMocmVwKFxcZ3JvdXAxXFwsIDQpLCByZXAoXFxncm91cDJcXCwgNCksIHJlcChcXGdyb3VwM1xcLCA0KSxcbiAgICAgICAgICAgcmVwKFxcZ3JvdXA0XFwsIDQpLCByZXAoXFxncm91cDVcXCwgNCksIHJlcChcXGdyb3VwNlxcLCA0KSxcbiAgICAgICAgICAgcmVwKFxcZ3JvdXA3XFwsIDQpLCByZXAoXFxncm91cDhcXCwgNCksIHJlcChcXGdyb3VwOVxcLCA0KSlcbmNsdXN0ZXIgPC0gcmVwKGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCksIDkpXG5jbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpKVxudmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDEpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDIpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDMpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDQpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDUpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDYpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDcpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDgpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDkpKVxuXG5kYXRhIDwtIGRhdGEuZnJhbWUoZ3JvdXAsIGNsdXN0ZXIsIHZhbHVlKVxuXG5cbiMgUGxvdHRpbmdcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdD1cXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cblxuIyBTdGF0aXN0aWNhbCBhbmFseXNpcyBcbiMgU2ltaWxhciB0byB0aGUgQ2hpLVNxdWFyZSB0ZXN0LCBGaXNoZXLigJlzIEV4YWN0IFRlc3QgaXMgdXNlZCB3aGVuIHlvdSBoYXZlIHNtYWxsZXIgc2FtcGxlIHNpemVzIG9yIHdoZW4gdGhlIGV4cGVjdGVkIGZyZXF1ZW5jeSBpbiBhbnkgY2VsbCBvZiB0aGUgY29udGluZ2VuY3kgdGFibGUgaXMgYmVsb3cgNS5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxncm91cDFcXCwgXFxncm91cDJcXCkpXG5jb250aW5nZW5jeV90YWJsZSA8LSB4dGFicyh2YWx1ZSB+IGdyb3VwICsgY2x1c3RlciwgZGF0YSA9IHRlbXApXG5maXNoZXJfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSwgQiA9IDEwMDAwMClcbmZpc2hlcl9yZXN1bHRcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYyhcXGdyb3VwMVxcLCBcXGdyb3VwM1xcKSlcbmNvbnRpbmdlbmN5X3RhYmxlIDwtIHh0YWJzKHZhbHVlIH4gZ3JvdXAgKyBjbHVzdGVyLCBkYXRhID0gdGVtcClcbmZpc2hlcl9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCBCID0gMTAwMDAwKVxuZmlzaGVyX3Jlc3VsdFxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKFxcZ3JvdXAxXFwsIFxcZ3JvdXA0XFwpKVxuY29udGluZ2VuY3lfdGFibGUgPC0geHRhYnModmFsdWUgfiBncm91cCArIGNsdXN0ZXIsIGRhdGEgPSB0ZW1wKVxuZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEIgPSAxMDAwMDApXG5maXNoZXJfcmVzdWx0XG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
## Importing groups
group1 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group2.tsv\))$gene
group3 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group3.tsv\))$gene
group4 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group4.tsv\))$gene
group5 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group5.tsv\))$gene
group6 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group6.tsv\))$gene
group7 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group7.tsv\))$gene
group8 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group8.tsv\))$gene
group9 <- fread(here(refDir, \geneList_A485_vs_DMSO_RNA_loop_group9.tsv\))$gene


## Importing Bobbie gene classification
geneCluster <- fread(here(refDir, \bobbie_gene_classification.csv\)) %>%
  dplyr::select(gene, enst, Cluster)
colnames(geneCluster) <- c(\gene\, \ensembl_transcript_id\, \cluster\)


## Converting transcript ID to gene ID
idPair_tg <- getBM(attributes = c(\ensembl_transcript_id\, \ensembl_gene_id\),
                 filters = \ensembl_transcript_id\,
                 values = geneCluster$ensembl_transcript,
                 mart = ensembl.v102)
geneCluster <- geneCluster %>% dplyr::left_join(idPair_tg, by = c(\ensembl_transcript_id\))

# Making data for stacked barplot
countGene <- function(geneCluster, groupName, clusterName){
  num <- nrow(geneCluster %>% dplyr::filter(ensembl_gene_id %in% groupName,
                                            cluster %in% clusterName))
  return(num)
}
countGeneList <- function(geneCluster, groupName){
  n1 <- countGene(geneCluster, groupName, \Early\)
  n2 <- countGene(geneCluster, groupName, \Middle\)
  n3 <-countGene(geneCluster, groupName, \Late\)
  n4 <- countGene(geneCluster, groupName, \Transient\)
  return(c(n1, n2, n3, n4))
}

group <- c(rep(\group1\, 4), rep(\group2\, 4), rep(\group3\, 4),
           rep(\group4\, 4), rep(\group5\, 4), rep(\group6\, 4),
           rep(\group7\, 4), rep(\group8\, 4), rep(\group9\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 9)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, group1),
           countGeneList(geneCluster, group2),
           countGeneList(geneCluster, group3),
           countGeneList(geneCluster, group4),
           countGeneList(geneCluster, group5),
           countGeneList(geneCluster, group6),
           countGeneList(geneCluster, group7),
           countGeneList(geneCluster, group8),
           countGeneList(geneCluster, group9))

data <- data.frame(group, cluster, value)


# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()


# Statistical analysis 
# Similar to the Chi-Square test, Fisher’s Exact Test is used when you have smaller sample sizes or when the expected frequency in any cell of the contingency table is below 5.
temp <- data %>% dplyr::filter(group %in% c(\group1\, \group2\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result

temp <- data %>% dplyr::filter(group %in% c(\group1\, \group3\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result

temp <- data %>% dplyr::filter(group %in% c(\group1\, \group4\))
contingency_table <- xtabs(value ~ group + cluster, data = temp)
fisher_result <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 100000)
fisher_result

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


## [2.23] Checking Early gene from Bobbie
#### dTAG

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaWGgwY21GamRFRnVZMmh2Y2lBOExTQm1kVzVqZEdsdmJpaHNiMjl3S1h0Y2JpQWdZVzVqYUc5eU1TQThMU0JzYjI5d0lDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHTW9NU3dnTWl3Z015a3BYRzRnSUdOdmJHNWhiV1Z6S0dGdVkyaHZjakVwSUR3dElHTW9YQ0pqYUhKY0lpd2dYQ0p6ZEdGeWRGd2lMQ0JjSW1WdVpGd2lLVnh1SUNCaGJtTm9iM0l5SUR3dElHeHZiM0FnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWXlnMExDQTFMQ0EyS1NsY2JpQWdZMjlzYm1GdFpYTW9ZVzVqYUc5eU1pa2dQQzBnWXloY0ltTm9jbHdpTENCY0luTjBZWEowWENJc0lGd2laVzVrWENJcFhHNGdJR0Z1WTJodmNuTWdQQzBnY21Wa2RXTmxLRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaGlhVzVrWDNKdmQzTW9ZVzVqYUc5eU1Td2dZVzVqYUc5eU1pa3BLVnh1SUNBZ0lISmxkSFZ5YmloaGJtTm9iM0p6S1Z4dWZWeHVYRzV5ZFc1R2FYTm9aWEpGZUdGamRDQThMU0JtZFc1amRHbHZiaWhwYm5SbGNtVnpkQzVuY2l3Z1ltRmphMmR5YjNWdVpDNW5jaXdnY1hWbGNua3VaM0lwZTF4dUlDQnZkbVZ5YkdGd2MxOXBiblJsY21WemRDQThMU0JqYjNWdWRFOTJaWEpzWVhCektHbHVkR1Z5WlhOMExtZHlMQ0J4ZFdWeWVTNW5jaWxjYmlBZ1lTQThMU0J6ZFcwb2IzWmxjbXhoY0hOZmFXNTBaWEpsYzNRZ1BpQXdLVnh1SUNCMGIzUmhiRjlwYm5SbGNtVnpkQ0E4TFNCc1pXNW5kR2dvYVc1MFpYSmxjM1F1WjNJcFhHNGdJR01nUEMwZ2RHOTBZV3hmYVc1MFpYSmxjM1FnTFNCaFhHNGdJRnh1SUNCdmRtVnliR0Z3YzE5aVlXTnJaM0p2ZFc1a0lEd3RJR052ZFc1MFQzWmxjbXhoY0hNb1ltRmphMmR5YjNWdVpDNW5jaXdnY1hWbGNua3VaM0lwWEc0Z0lHSWdQQzBnYzNWdEtHOTJaWEpzWVhCelgySmhZMnRuY205MWJtUWdQaUF3S1Z4dUlDQjBiM1JoYkY5aVlXTnJaM0p2ZFc1a0lEd3RJR3hsYm1kMGFDaGlZV05yWjNKdmRXNWtMbWR5S1Z4dUlDQmtJRHd0SUhSdmRHRnNYMkpoWTJ0bmNtOTFibVFnTFNCaVhHNGdJRnh1SUNBaklFTnZibk4wY25WamRDQmpiMjUwYVc1blpXNWplU0IwWVdKc1pWeHVJQ0JqYjI1MGFXNW5aVzVqZVY5MFlXSnNaU0E4TFNCdFlYUnlhWGdvWXloaExDQmpMQ0JpTENCa0tTd2dibkp2ZHoweUxDQmllWEp2ZHoxVVVsVkZMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHbHRibUZ0WlhNOWJHbHpkQ2hjSWxKbFoybHZibHdpSUQwZ1l5aGNJbWx1ZEdWeVpYTjBMbWR5WENJc0lGd2lZbUZqYTJkeWIzVnVaQzVuY2x3aUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0pQZG1WeWJHRndYQ0lnUFNCaktGd2lXV1Z6WENJc0lGd2lUbTljSWlrcEtWeHVJQ0JjYmlBZ0l5QlFaWEptYjNKdElFWnBjMmhsY2lkeklHVjRZV04wSUhSbGMzUmNiaUFnWm1semFHVnlYM0psYzNWc2RDQThMU0JtYVhOb1pYSXVkR1Z6ZENoamIyNTBhVzVuWlc1amVWOTBZV0pzWlNsY2JpQWdYRzRnSUhKbGRIVnliaWhtYVhOb1pYSmZjbVZ6ZFd4MEtWeHVmVnh1WEc1eWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1SUR3dElHWjFibU4wYVc5dUtHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwWVhKblpYUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFJoYVc1bFpDNW5jaXdnYkc5emRDNW5jaWw3WEc0Z0lDTWdVMFZGUkVsT1IxeHVJQ0IwWlcxd0lEd3RJSEoxYmtacGMyaGxja1Y0WVdOMEtHeHZiM0F1ZFhBdVozSXNJR0poWTJ0bmNtOTFibVF1WjNJc0lISmxkR0ZwYm1Wa0xtZHlLVnh1SUNCeVpYTjFiSFF1ZEdJZ1BDMGdkR2xpWW14bEtHbHVkR1Z5WlhOMElEMGdjR0Z6ZEdVd0tHbHVkR1Z5WlhOMFRtRnRaU3dnWENKZlZWQmNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR0Z5WjJWMElEMGdjR0Z6ZEdVd0tIUmhjbWRsZEU1aGJXVXNJRndpWDNKbGRHRnBibVZrWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCMllXeDFaU0E5SUhSbGJYQWtjQzUyWVd4MVpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdlpHUnpVbUYwYVc4Z1BTQjBaVzF3SkdWemRHbHRZWFJsS1Z4dUlDQmNiaUFnSXlCQlJFUkpUa2NnVWs5WFUxeHVJQ0IwWlcxd0lEd3RJSEoxYmtacGMyaGxja1Y0WVdOMEtHeHZiM0F1Ym04dVozSXNJR0poWTJ0bmNtOTFibVF1WjNJc0lISmxkR0ZwYm1Wa0xtZHlLVnh1SUNCeVpYTjFiSFF1ZEdJZ1BDMGdjbVZ6ZFd4MExuUmlJQ1UrSlNCY2JpQWdJQ0JoWkdSZmNtOTNLR2x1ZEdWeVpYTjBJRDBnY0dGemRHVXdLR2x1ZEdWeVpYTjBUbUZ0WlN3Z1hDSmZUazljSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwWVhKblpYUWdQU0J3WVhOMFpUQW9kR0Z5WjJWMFRtRnRaU3dnWENKZmNtVjBZV2x1WldSY0lpa3NYRzRnSUNBZ0lDQWdJQ0FnSUNCd2RtRnNkV1VnUFNCMFpXMXdKSEF1ZG1Gc2RXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNCdlpHUnpVbUYwYVc4Z1BTQjBaVzF3SkdWemRHbHRZWFJsS1Z4dUlDQmNiaUFnSXlCQlJFUkpUa2NnVWs5WFUxeHVJQ0IwWlcxd0lEd3RJSEoxYmtacGMyaGxja1Y0WVdOMEtHeHZiM0F1Wkc5M2JpNW5jaXdnWW1GamEyZHliM1Z1WkM1bmNpd2djbVYwWVdsdVpXUXVaM0lwWEc0Z0lISmxjM1ZzZEM1MFlpQThMU0J5WlhOMWJIUXVkR0lnSlQ0bElGeHVJQ0FnSUdGa1pGOXliM2NvYVc1MFpYSmxjM1FnUFNCd1lYTjBaVEFvYVc1MFpYSmxjM1JPWVcxbExDQmNJbDlFVDFkT1hDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2RHRnlaMlYwSUQwZ2NHRnpkR1V3S0hSaGNtZGxkRTVoYldVc0lGd2lYM0psZEdGcGJtVmtYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdjSFpoYkhWbElEMGdkR1Z0Y0NSd0xuWmhiSFZsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdiMlJrYzFKaGRHbHZJRDBnZEdWdGNDUmxjM1JwYldGMFpTbGNiaUFnWEc0Z0lDTWdRVVJFU1U1SElGSlBWMU5jYmlBZ2RHVnRjQ0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkQ2hzYjI5d0xuVndMbWR5TENCaVlXTnJaM0p2ZFc1a0xtZHlMQ0JzYjNOMExtZHlLVnh1SUNCeVpYTjFiSFF1ZEdJZ1BDMGdjbVZ6ZFd4MExuUmlJQ1UrSlNCY2JpQWdJQ0JoWkdSZmNtOTNLR2x1ZEdWeVpYTjBJRDBnY0dGemRHVXdLR2x1ZEdWeVpYTjBUbUZ0WlN3Z1hDSmZWVkJjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwWVhKblpYUWdQU0J3WVhOMFpUQW9kR0Z5WjJWMFRtRnRaU3dnWENKZmJHOXpkRndpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJSEIyWVd4MVpTQTlJSFJsYlhBa2NDNTJZV3gxWlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzlrWkhOU1lYUnBieUE5SUhSbGJYQWtaWE4wYVcxaGRHVXBYRzRnSUZ4dUlDQWpJRUZFUkVsT1J5QlNUMWRUWEc0Z0lIUmxiWEFnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1FvYkc5dmNDNXVieTVuY2l3Z1ltRmphMmR5YjNWdVpDNW5jaXdnYkc5emRDNW5jaWxjYmlBZ2NtVnpkV3gwTG5SaUlEd3RJSEpsYzNWc2RDNTBZaUFsUGlVZ1hHNGdJQ0FnWVdSa1gzSnZkeWhwYm5SbGNtVnpkQ0E5SUhCaGMzUmxNQ2hwYm5SbGNtVnpkRTVoYldVc0lGd2lYMDVQWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdGeVoyVjBJRDBnY0dGemRHVXdLSFJoY21kbGRFNWhiV1VzSUZ3aVgyeHZjM1JjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0J3ZG1Gc2RXVWdQU0IwWlcxd0pIQXVkbUZzZFdVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0J2WkdSelVtRjBhVzhnUFNCMFpXMXdKR1Z6ZEdsdFlYUmxLVnh1SUNCY2JpQWdJeUJCUkVSSlRrY2dVazlYVTF4dUlDQjBaVzF3SUR3dElISjFia1pwYzJobGNrVjRZV04wS0d4dmIzQXVaRzkzYmk1bmNpd2dZbUZqYTJkeWIzVnVaQzVuY2l3Z2JHOXpkQzVuY2lsY2JpQWdjbVZ6ZFd4MExuUmlJRHd0SUhKbGMzVnNkQzUwWWlBbFBpVWdYRzRnSUNBZ1lXUmtYM0p2ZHlocGJuUmxjbVZ6ZENBOUlIQmhjM1JsTUNocGJuUmxjbVZ6ZEU1aGJXVXNJRndpWDBSUFYwNWNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQjBZWEpuWlhRZ1BTQndZWE4wWlRBb2RHRnlaMlYwVG1GdFpTd2dYQ0pmYkc5emRGd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lIQjJZV3gxWlNBOUlIUmxiWEFrY0M1MllXeDFaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHOWtaSE5TWVhScGJ5QTlJSFJsYlhBa1pYTjBhVzFoZEdVcFhHNGdJRnh1SUNCeVpYUjFjbTRvY21WemRXeDBMblJpS1Z4dWZWeHVYRzV5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVRbWx1WVhKNUlEd3RJR1oxYm1OMGFXOXVLR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNHNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSaGNtZGxkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEdGcGJtVmtMbWR5TENCc2IzTjBMbWR5S1h0Y2JpQWdJeUJUUlVWRVNVNUhYRzRnSUhSbGJYQWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUW9iRzl2Y0M1MWNHNXZMbWR5TENCaVlXTnJaM0p2ZFc1a0xtZHlMQ0J5WlhSaGFXNWxaQzVuY2lsY2JpQWdjbVZ6ZFd4MExuUmlJRHd0SUhScFltSnNaU2hwYm5SbGNtVnpkQ0E5SUhCaGMzUmxNQ2hwYm5SbGNtVnpkRTVoYldVc0lGd2lYMVZRTDA1UFhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUmhjbWRsZENBOUlIQmhjM1JsTUNoMFlYSm5aWFJPWVcxbExDQmNJbDl5WlhSaGFXNWxaRndpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J3ZG1Gc2RXVWdQU0IwWlcxd0pIQXVkbUZzZFdVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjJSa2MxSmhkR2x2SUQwZ2RHVnRjQ1JsYzNScGJXRjBaU2xjYmlBZ1hHNWNiaUFnSXlCQlJFUkpUa2NnVWs5WFUxeHVJQ0IwWlcxd0lEd3RJSEoxYmtacGMyaGxja1Y0WVdOMEtHeHZiM0F1Wkc5M2JpNW5jaXdnWW1GamEyZHliM1Z1WkM1bmNpd2djbVYwWVdsdVpXUXVaM0lwWEc0Z0lISmxjM1ZzZEM1MFlpQThMU0J5WlhOMWJIUXVkR0lnSlQ0bElGeHVJQ0FnSUdGa1pGOXliM2NvYVc1MFpYSmxjM1FnUFNCd1lYTjBaVEFvYVc1MFpYSmxjM1JPWVcxbExDQmNJbDlFVDFkT1hDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2RHRnlaMlYwSUQwZ2NHRnpkR1V3S0hSaGNtZGxkRTVoYldVc0lGd2lYM0psZEdGcGJtVmtYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdjSFpoYkhWbElEMGdkR1Z0Y0NSd0xuWmhiSFZsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdiMlJrYzFKaGRHbHZJRDBnZEdWdGNDUmxjM1JwYldGMFpTbGNiaUFnWEc0Z0lDTWdRVVJFU1U1SElGSlBWMU5jYmlBZ2RHVnRjQ0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkQ2hzYjI5d0xuVndibTh1WjNJc0lHSmhZMnRuY205MWJtUXVaM0lzSUd4dmMzUXVaM0lwWEc0Z0lISmxjM1ZzZEM1MFlpQThMU0J5WlhOMWJIUXVkR0lnSlQ0bElGeHVJQ0FnSUdGa1pGOXliM2NvYVc1MFpYSmxjM1FnUFNCd1lYTjBaVEFvYVc1MFpYSmxjM1JPWVcxbExDQmNJbDlWVUM5T1Qxd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lIUmhjbWRsZENBOUlIQmhjM1JsTUNoMFlYSm5aWFJPWVcxbExDQmNJbDlzYjNOMFhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2NIWmhiSFZsSUQwZ2RHVnRjQ1J3TG5aaGJIVmxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2IyUmtjMUpoZEdsdklEMGdkR1Z0Y0NSbGMzUnBiV0YwWlNsY2JseHVJQ0JjYmlBZ0l5QkJSRVJKVGtjZ1VrOVhVMXh1SUNCMFpXMXdJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBLR3h2YjNBdVpHOTNiaTVuY2l3Z1ltRmphMmR5YjNWdVpDNW5jaXdnYkc5emRDNW5jaWxjYmlBZ2NtVnpkV3gwTG5SaUlEd3RJSEpsYzNWc2RDNTBZaUFsUGlVZ1hHNGdJQ0FnWVdSa1gzSnZkeWhwYm5SbGNtVnpkQ0E5SUhCaGMzUmxNQ2hwYm5SbGNtVnpkRTVoYldVc0lGd2lYMFJQVjA1Y0lpa3NYRzRnSUNBZ0lDQWdJQ0FnSUNCMFlYSm5aWFFnUFNCd1lYTjBaVEFvZEdGeVoyVjBUbUZ0WlN3Z1hDSmZiRzl6ZEZ3aUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUhCMllXeDFaU0E5SUhSbGJYQWtjQzUyWVd4MVpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUc5a1pITlNZWFJwYnlBOUlIUmxiWEFrWlhOMGFXMWhkR1VwWEc0Z0lGeHVJQ0J5WlhSMWNtNG9jbVZ6ZFd4MExuUmlLVnh1ZlZ4dVhHNXlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVVtVjBZV2x1WldRZ1BDMGdablZ1WTNScGIyNG9hVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSaGNtZGxkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEdGcGJtVmtMbWR5S1h0Y2JpQWdJeUJUUlVWRVNVNUhYRzRnSUhSbGJYQWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUW9iRzl2Y0M1MWNDNW5jaXdnWW1GamEyZHliM1Z1WkM1bmNpd2djbVYwWVdsdVpXUXVaM0lwWEc0Z0lISmxjM1ZzZEM1MFlpQThMU0IwYVdKaWJHVW9hVzUwWlhKbGMzUWdQU0J3WVhOMFpUQW9hVzUwWlhKbGMzUk9ZVzFsTENCY0lsOVZVRndpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwWVhKblpYUWdQU0J3WVhOMFpUQW9kR0Z5WjJWMFRtRnRaU3dnWENKZmNtVjBZV2x1WldSY0lpa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NIWmhiSFZsSUQwZ2RHVnRjQ1J3TG5aaGJIVmxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOWtaSE5TWVhScGJ5QTlJSFJsYlhBa1pYTjBhVzFoZEdVcFhHNGdJRnh1SUNBaklFRkVSRWxPUnlCU1QxZFRYRzRnSUhSbGJYQWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUW9iRzl2Y0M1dWJ5NW5jaXdnWW1GamEyZHliM1Z1WkM1bmNpd2djbVYwWVdsdVpXUXVaM0lwWEc0Z0lISmxjM1ZzZEM1MFlpQThMU0J5WlhOMWJIUXVkR0lnSlQ0bElGeHVJQ0FnSUdGa1pGOXliM2NvYVc1MFpYSmxjM1FnUFNCd1lYTjBaVEFvYVc1MFpYSmxjM1JPWVcxbExDQmNJbDlPVDF3aUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUhSaGNtZGxkQ0E5SUhCaGMzUmxNQ2gwWVhKblpYUk9ZVzFsTENCY0lsOXlaWFJoYVc1bFpGd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lIQjJZV3gxWlNBOUlIUmxiWEFrY0M1MllXeDFaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHOWtaSE5TWVhScGJ5QTlJSFJsYlhBa1pYTjBhVzFoZEdVcFhHNGdJRnh1SUNBaklFRkVSRWxPUnlCU1QxZFRYRzRnSUhSbGJYQWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUW9iRzl2Y0M1a2IzZHVMbWR5TENCaVlXTnJaM0p2ZFc1a0xtZHlMQ0J5WlhSaGFXNWxaQzVuY2lsY2JpQWdjbVZ6ZFd4MExuUmlJRHd0SUhKbGMzVnNkQzUwWWlBbFBpVWdYRzRnSUNBZ1lXUmtYM0p2ZHlocGJuUmxjbVZ6ZENBOUlIQmhjM1JsTUNocGJuUmxjbVZ6ZEU1aGJXVXNJRndpWDBSUFYwNWNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQjBZWEpuWlhRZ1BTQndZWE4wWlRBb2RHRnlaMlYwVG1GdFpTd2dYQ0pmY21WMFlXbHVaV1JjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0J3ZG1Gc2RXVWdQU0IwWlcxd0pIQXVkbUZzZFdVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0J2WkdSelVtRjBhVzhnUFNCMFpXMXdKR1Z6ZEdsdFlYUmxLVnh1SUNCY2JseHVJQ0J5WlhSMWNtNG9jbVZ6ZFd4MExuUmlLVnh1ZlZ4dVhHNXlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwSUR3dElHWjFibU4wYVc5dUtIUmhjbWRsZEU1aGJXVXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLWHRjYmlBZ0l5QlNSVlJCU1U1RlJDQnNiMjl3WEc0Z0lISmxkR0ZwYm1Wa0lEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSWxSR1gySnZiMnR0WVhKcmFXNW5YQ0lzSUhSaGNtZGxkRTVoYldVc0lGd2lZVzFmWVM1aVpXUmNJaWtwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dNb01Td2dNaXdnTXlrcFhHNGdJR052Ykc1aGJXVnpLSEpsZEdGcGJtVmtLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNiaUFnY21WMFlXbHVaV1F1WjNJZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtISmxkR0ZwYm1Wa0tWeHVJQ0FqSUV4UFUxUWdiRzl2Y0Z4dUlDQnNiM04wSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbFJHWDJKdmIydHRZWEpyYVc1blhDSXNJSFJoY21kbGRFNWhiV1VzSUZ3aWIyRXVZbVZrWENJcEtTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLREVzSURJc0lETXBLVnh1SUNCamIyeHVZVzFsY3loc2IzTjBLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNiaUFnYkc5emRDNW5jaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvYkc5emRDbGNiaUFnWEc0Z0lISmxjM1ZzZENBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dUtHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwWVhKblpYUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFJoYVc1bFpDNW5jaXdnYkc5emRDNW5jaWxjYmlBZ1hHNGdJSEpsZEhWeWJpaHlaWE4xYkhRcFhHNTlYRzVjYm5KMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUkNhVzVoY25rZ1BDMGdablZ1WTNScGIyNG9kR0Z5WjJWMFRtRnRaU3dnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWw3WEc0Z0lDTWdVa1ZVUVVsT1JVUWdiRzl2Y0Z4dUlDQnlaWFJoYVc1bFpDQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKVVJsOWliMjlyYldGeWEybHVaMXdpTENCMFlYSm5aWFJPWVcxbExDQmNJbUZ0WDJFdVltVmtYQ0lwS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNcEtWeHVJQ0JqYjJ4dVlXMWxjeWh5WlhSaGFXNWxaQ2tnUEMwZ1l5aGNJbU5vY2x3aUxDQmNJbk4wWVhKMFhDSXNJRndpWlc1a1hDSXBYRzRnSUhKbGRHRnBibVZrTG1keUlEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaHlaWFJoYVc1bFpDbGNiaUFnSXlCTVQxTlVJR3h2YjNCY2JpQWdiRzl6ZENBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0pVUmw5aWIyOXJiV0Z5YTJsdVoxd2lMQ0IwWVhKblpYUk9ZVzFsTENCY0ltOWhMbUpsWkZ3aUtTa2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWd4TENBeUxDQXpLU2xjYmlBZ1kyOXNibUZ0WlhNb2JHOXpkQ2tnUEMwZ1l5aGNJbU5vY2x3aUxDQmNJbk4wWVhKMFhDSXNJRndpWlc1a1hDSXBYRzRnSUd4dmMzUXVaM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0d4dmMzUXBYRzRnSUZ4dUlDQnlaWE4xYkhRZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJrSnBibUZ5ZVNocGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEJ1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBZWEpuWlhST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUmhhVzVsWkM1bmNpd2diRzl6ZEM1bmNpbGNiaUFnWEc0Z0lISmxkSFZ5YmloeVpYTjFiSFFwWEc1OVhHNWNibkoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhSU1pYUmhhVzVsWkNBOExTQm1kVzVqZEdsdmJpaDBZWEpuWlhST1lXMWxMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWw3WEc0Z0lDTWdVa1ZVUVVsT1JVUWdiRzl2Y0Z4dUlDQnlaWFJoYVc1bFpDQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKVVJsOWliMjlyYldGeWEybHVaMXdpTENCMFlYSm5aWFJPWVcxbExDQmNJbUZ0WDJFdVltVmtYQ0lwS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNcEtWeHVJQ0JqYjJ4dVlXMWxjeWh5WlhSaGFXNWxaQ2tnUEMwZ1l5aGNJbU5vY2x3aUxDQmNJbk4wWVhKMFhDSXNJRndpWlc1a1hDSXBYRzRnSUhKbGRHRnBibVZrTG1keUlEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaHlaWFJoYVc1bFpDbGNiaUFnSXlCTVQxTlVJR3h2YjNCY2JpQWdjbVZ6ZFd4MElEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVNaWFJoYVc1bFpDaHBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdGeVoyVjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwWVdsdVpXUXVaM0lwWEc0Z0lGeHVJQ0J5WlhSMWNtNG9jbVZ6ZFd4MEtWeHVmVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmV4dHJhY3RBbmNob3IgPC0gZnVuY3Rpb24obG9vcCl7XG4gIGFuY2hvcjEgPC0gbG9vcCAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyhhbmNob3IxKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgYW5jaG9yMiA8LSBsb29wICU+JSBkcGx5cjo6c2VsZWN0KGMoNCwgNSwgNikpXG4gIGNvbG5hbWVzKGFuY2hvcjIpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICBhbmNob3JzIDwtIHJlZHVjZShtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYmluZF9yb3dzKGFuY2hvcjEsIGFuY2hvcjIpKSlcbiAgICByZXR1cm4oYW5jaG9ycylcbn1cblxucnVuRmlzaGVyRXhhY3QgPC0gZnVuY3Rpb24oaW50ZXJlc3QuZ3IsIGJhY2tncm91bmQuZ3IsIHF1ZXJ5LmdyKXtcbiAgb3ZlcmxhcHNfaW50ZXJlc3QgPC0gY291bnRPdmVybGFwcyhpbnRlcmVzdC5nciwgcXVlcnkuZ3IpXG4gIGEgPC0gc3VtKG92ZXJsYXBzX2ludGVyZXN0ID4gMClcbiAgdG90YWxfaW50ZXJlc3QgPC0gbGVuZ3RoKGludGVyZXN0LmdyKVxuICBjIDwtIHRvdGFsX2ludGVyZXN0IC0gYVxuICBcbiAgb3ZlcmxhcHNfYmFja2dyb3VuZCA8LSBjb3VudE92ZXJsYXBzKGJhY2tncm91bmQuZ3IsIHF1ZXJ5LmdyKVxuICBiIDwtIHN1bShvdmVybGFwc19iYWNrZ3JvdW5kID4gMClcbiAgdG90YWxfYmFja2dyb3VuZCA8LSBsZW5ndGgoYmFja2dyb3VuZC5ncilcbiAgZCA8LSB0b3RhbF9iYWNrZ3JvdW5kIC0gYlxuICBcbiAgIyBDb25zdHJ1Y3QgY29udGluZ2VuY3kgdGFibGVcbiAgY29udGluZ2VuY3lfdGFibGUgPC0gbWF0cml4KGMoYSwgYywgYiwgZCksIG5yb3c9MiwgYnlyb3c9VFJVRSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbW5hbWVzPWxpc3QoXFxSZWdpb25cXCA9IGMoXFxpbnRlcmVzdC5nclxcLCBcXGJhY2tncm91bmQuZ3JcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcT3ZlcmxhcFxcID0gYyhcXFllc1xcLCBcXE5vXFwpKSlcbiAgXG4gICMgUGVyZm9ybSBGaXNoZXIncyBleGFjdCB0ZXN0XG4gIGZpc2hlcl9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUpXG4gIFxuICByZXR1cm4oZmlzaGVyX3Jlc3VsdClcbn1cblxucnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvbiA8LSBmdW5jdGlvbihpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWQuZ3IsIGxvc3QuZ3Ipe1xuICAjIFNFRURJTkdcbiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLnVwLmdyLCBiYWNrZ3JvdW5kLmdyLCByZXRhaW5lZC5ncilcbiAgcmVzdWx0LnRiIDwtIHRpYmJsZShpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX1VQXFwpLFxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9yZXRhaW5lZFxcKSxcbiAgICAgICAgICAgICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgXG4gICMgQURESU5HIFJPV1NcbiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLm5vLmdyLCBiYWNrZ3JvdW5kLmdyLCByZXRhaW5lZC5ncilcbiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gICAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX05PXFwpLFxuICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX3JldGFpbmVkXFwpLFxuICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgXG4gICMgQURESU5HIFJPV1NcbiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLmRvd24uZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKVxuICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfRE9XTlxcKSxcbiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9yZXRhaW5lZFxcKSxcbiAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIFxuICAjIEFERElORyBST1dTXG4gIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC51cC5nciwgYmFja2dyb3VuZC5nciwgbG9zdC5ncilcbiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gICAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX1VQXFwpLFxuICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX2xvc3RcXCksXG4gICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICBcbiAgIyBBRERJTkcgUk9XU1xuICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3Aubm8uZ3IsIGJhY2tncm91bmQuZ3IsIGxvc3QuZ3IpXG4gIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9OT1xcKSxcbiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9sb3N0XFwpLFxuICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgXG4gICMgQURESU5HIFJPV1NcbiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLmRvd24uZ3IsIGJhY2tncm91bmQuZ3IsIGxvc3QuZ3IpXG4gIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9ET1dOXFwpLFxuICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX2xvc3RcXCksXG4gICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICBcbiAgcmV0dXJuKHJlc3VsdC50Yilcbn1cblxucnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvbkJpbmFyeSA8LSBmdW5jdGlvbihpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXBuby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZC5nciwgbG9zdC5ncil7XG4gICMgU0VFRElOR1xuICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AudXBuby5nciwgYmFja2dyb3VuZC5nciwgcmV0YWluZWQuZ3IpXG4gIHJlc3VsdC50YiA8LSB0aWJibGUoaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9VUC9OT1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfcmV0YWluZWRcXCksXG4gICAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIFxuXG4gICMgQURESU5HIFJPV1NcbiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLmRvd24uZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKVxuICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfRE9XTlxcKSxcbiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9yZXRhaW5lZFxcKSxcbiAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIFxuICAjIEFERElORyBST1dTXG4gIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC51cG5vLmdyLCBiYWNrZ3JvdW5kLmdyLCBsb3N0LmdyKVxuICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfVVAvTk9cXCksXG4gICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfbG9zdFxcKSxcbiAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cbiAgXG4gICMgQURESU5HIFJPV1NcbiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLmRvd24uZ3IsIGJhY2tncm91bmQuZ3IsIGxvc3QuZ3IpXG4gIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9ET1dOXFwpLFxuICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX2xvc3RcXCksXG4gICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICBcbiAgcmV0dXJuKHJlc3VsdC50Yilcbn1cblxucnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblJldGFpbmVkIDwtIGZ1bmN0aW9uKGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZC5ncil7XG4gICMgU0VFRElOR1xuICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AudXAuZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKVxuICByZXN1bHQudGIgPC0gdGliYmxlKGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfVVBcXCksXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX3JldGFpbmVkXFwpLFxuICAgICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICBcbiAgIyBBRERJTkcgUk9XU1xuICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3Aubm8uZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKVxuICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfTk9cXCksXG4gICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfcmV0YWluZWRcXCksXG4gICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICBcbiAgIyBBRERJTkcgUk9XU1xuICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AuZG93bi5nciwgYmFja2dyb3VuZC5nciwgcmV0YWluZWQuZ3IpXG4gIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9ET1dOXFwpLFxuICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX3JldGFpbmVkXFwpLFxuICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgXG5cbiAgcmV0dXJuKHJlc3VsdC50Yilcbn1cblxucnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCA8LSBmdW5jdGlvbih0YXJnZXROYW1lLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncil7XG4gICMgUkVUQUlORUQgbG9vcFxuICByZXRhaW5lZCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxURl9ib29rbWFya2luZ1xcLCB0YXJnZXROYW1lLCBcXGFtX2EuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyhyZXRhaW5lZCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIHJldGFpbmVkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShyZXRhaW5lZClcbiAgIyBMT1NUIGxvb3BcbiAgbG9zdCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxURl9ib29rbWFya2luZ1xcLCB0YXJnZXROYW1lLCBcXG9hLmJlZFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbiAgY29sbmFtZXMobG9zdCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIGxvc3QuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGxvc3QpXG4gIFxuICByZXN1bHQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvbihpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWQuZ3IsIGxvc3QuZ3IpXG4gIFxuICByZXR1cm4ocmVzdWx0KVxufVxuXG5ydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0QmluYXJ5IDwtIGZ1bmN0aW9uKHRhcmdldE5hbWUsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cG5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3Ipe1xuICAjIFJFVEFJTkVEIGxvb3BcbiAgcmV0YWluZWQgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcVEZfYm9va21hcmtpbmdcXCwgdGFyZ2V0TmFtZSwgXFxhbV9hLmJlZFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbiAgY29sbmFtZXMocmV0YWluZWQpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICByZXRhaW5lZC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmV0YWluZWQpXG4gICMgTE9TVCBsb29wXG4gIGxvc3QgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcVEZfYm9va21hcmtpbmdcXCwgdGFyZ2V0TmFtZSwgXFxvYS5iZWRcXCkpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG4gIGNvbG5hbWVzKGxvc3QpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICBsb3N0LmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShsb3N0KVxuICBcbiAgcmVzdWx0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25CaW5hcnkoaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwbm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWQuZ3IsIGxvc3QuZ3IpXG4gIFxuICByZXR1cm4ocmVzdWx0KVxufVxuXG5ydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQgPC0gZnVuY3Rpb24odGFyZ2V0TmFtZSwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3Ipe1xuICAjIFJFVEFJTkVEIGxvb3BcbiAgcmV0YWluZWQgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcVEZfYm9va21hcmtpbmdcXCwgdGFyZ2V0TmFtZSwgXFxhbV9hLmJlZFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbiAgY29sbmFtZXMocmV0YWluZWQpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICByZXRhaW5lZC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmV0YWluZWQpXG4gICMgTE9TVCBsb29wXG4gIHJlc3VsdCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uUmV0YWluZWQoaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkLmdyKVxuICBcbiAgcmV0dXJuKHJlc3VsdClcbn1cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
extractAnchor <- function(loop){
  anchor1 <- loop %>% dplyr::select(c(1, 2, 3))
  colnames(anchor1) <- c(\chr\, \start\, \end\)
  anchor2 <- loop %>% dplyr::select(c(4, 5, 6))
  colnames(anchor2) <- c(\chr\, \start\, \end\)
  anchors <- reduce(makeGRangesFromDataFrame(bind_rows(anchor1, anchor2)))
    return(anchors)
}

runFisherExact <- function(interest.gr, background.gr, query.gr){
  overlaps_interest <- countOverlaps(interest.gr, query.gr)
  a <- sum(overlaps_interest > 0)
  total_interest <- length(interest.gr)
  c <- total_interest - a
  
  overlaps_background <- countOverlaps(background.gr, query.gr)
  b <- sum(overlaps_background > 0)
  total_background <- length(background.gr)
  d <- total_background - b
  
  # Construct contingency table
  contingency_table <- matrix(c(a, c, b, d), nrow=2, byrow=TRUE,
                              dimnames=list(\Region\ = c(\interest.gr\, \background.gr\),
                                            \Overlap\ = c(\Yes\, \No\)))
  
  # Perform Fisher's exact test
  fisher_result <- fisher.test(contingency_table)
  
  return(fisher_result)
}

runFisherExactCombination <- function(interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr,
                                      targetName,
                                      retained.gr, lost.gr){
  # SEEDING
  temp <- runFisherExact(loop.up.gr, background.gr, retained.gr)
  result.tb <- tibble(interest = paste0(interestName, \_UP\),
                      target = paste0(targetName, \_retained\),
                      pvalue = temp$p.value,
                      oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.no.gr, background.gr, retained.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_NO\),
            target = paste0(targetName, \_retained\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.down.gr, background.gr, retained.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_DOWN\),
            target = paste0(targetName, \_retained\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.up.gr, background.gr, lost.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_UP\),
            target = paste0(targetName, \_lost\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.no.gr, background.gr, lost.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_NO\),
            target = paste0(targetName, \_lost\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.down.gr, background.gr, lost.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_DOWN\),
            target = paste0(targetName, \_lost\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  return(result.tb)
}

runFisherExactCombinationBinary <- function(interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr,
                                      targetName,
                                      retained.gr, lost.gr){
  # SEEDING
  temp <- runFisherExact(loop.upno.gr, background.gr, retained.gr)
  result.tb <- tibble(interest = paste0(interestName, \_UP/NO\),
                      target = paste0(targetName, \_retained\),
                      pvalue = temp$p.value,
                      oddsRatio = temp$estimate)
  

  # ADDING ROWS
  temp <- runFisherExact(loop.down.gr, background.gr, retained.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_DOWN\),
            target = paste0(targetName, \_retained\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.upno.gr, background.gr, lost.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_UP/NO\),
            target = paste0(targetName, \_lost\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)

  
  # ADDING ROWS
  temp <- runFisherExact(loop.down.gr, background.gr, lost.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_DOWN\),
            target = paste0(targetName, \_lost\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  return(result.tb)
}

runFisherExactCombinationRetained <- function(interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr,
                                      targetName,
                                      retained.gr){
  # SEEDING
  temp <- runFisherExact(loop.up.gr, background.gr, retained.gr)
  result.tb <- tibble(interest = paste0(interestName, \_UP\),
                      target = paste0(targetName, \_retained\),
                      pvalue = temp$p.value,
                      oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.no.gr, background.gr, retained.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_NO\),
            target = paste0(targetName, \_retained\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.down.gr, background.gr, retained.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_DOWN\),
            target = paste0(targetName, \_retained\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  

  return(result.tb)
}

runFisherExactCombinationTarget <- function(targetName, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr){
  # RETAINED loop
  retained <- fread(here(refDir, \TF_bookmarking\, targetName, \am_a.bed\)) %>% dplyr::select(c(1, 2, 3))
  colnames(retained) <- c(\chr\, \start\, \end\)
  retained.gr <- makeGRangesFromDataFrame(retained)
  # LOST loop
  lost <- fread(here(refDir, \TF_bookmarking\, targetName, \oa.bed\)) %>% dplyr::select(c(1, 2, 3))
  colnames(lost) <- c(\chr\, \start\, \end\)
  lost.gr <- makeGRangesFromDataFrame(lost)
  
  result <- runFisherExactCombination(interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr,
                                      targetName,
                                      retained.gr, lost.gr)
  
  return(result)
}

runFisherExactCombinationTargetBinary <- function(targetName, interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr){
  # RETAINED loop
  retained <- fread(here(refDir, \TF_bookmarking\, targetName, \am_a.bed\)) %>% dplyr::select(c(1, 2, 3))
  colnames(retained) <- c(\chr\, \start\, \end\)
  retained.gr <- makeGRangesFromDataFrame(retained)
  # LOST loop
  lost <- fread(here(refDir, \TF_bookmarking\, targetName, \oa.bed\)) %>% dplyr::select(c(1, 2, 3))
  colnames(lost) <- c(\chr\, \start\, \end\)
  lost.gr <- makeGRangesFromDataFrame(lost)
  
  result <- runFisherExactCombinationBinary(interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr,
                                      targetName,
                                      retained.gr, lost.gr)
  
  return(result)
}

runFisherExactCombinationTargetRetained <- function(targetName, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr){
  # RETAINED loop
  retained <- fread(here(refDir, \TF_bookmarking\, targetName, \am_a.bed\)) %>% dplyr::select(c(1, 2, 3))
  colnames(retained) <- c(\chr\, \start\, \end\)
  retained.gr <- makeGRangesFromDataFrame(retained)
  # LOST loop
  result <- runFisherExactCombinationRetained(interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr,
                                      targetName,
                                      retained.gr)
  
  return(result)
}



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVpYaDBjbUZqZEVGdVkyaHZjaUE4TFNCbWRXNWpkR2x2Ymloc2IyOXdLWHRjYmlBZ1lXNWphRzl5TVNBOExTQnNiMjl3SUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dNb01Td2dNaXdnTXlrcFhHNGdJR052Ykc1aGJXVnpLR0Z1WTJodmNqRXBJRHd0SUdNb1hGeGphSEpjWEN3Z1hGeHpkR0Z5ZEZ4Y0xDQmNYR1Z1WkZ4Y0tWeHVJQ0JoYm1Ob2IzSXlJRHd0SUd4dmIzQWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWcwTENBMUxDQTJLU2xjYmlBZ1kyOXNibUZ0WlhNb1lXNWphRzl5TWlrZ1BDMGdZeWhjWEdOb2NseGNMQ0JjWEhOMFlYSjBYRndzSUZ4Y1pXNWtYRndwWEc0Z0lHRnVZMmh2Y25NZ1BDMGdjbVZrZFdObEtHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoaWFXNWtYM0p2ZDNNb1lXNWphRzl5TVN3Z1lXNWphRzl5TWlrcEtWeHVJQ0FnSUhKbGRIVnliaWhoYm1Ob2IzSnpLVnh1ZlZ4dVhHNXlkVzVHYVhOb1pYSkZlR0ZqZENBOExTQm1kVzVqZEdsdmJpaHBiblJsY21WemRDNW5jaXdnWW1GamEyZHliM1Z1WkM1bmNpd2djWFZsY25rdVozSXBlMXh1SUNCdmRtVnliR0Z3YzE5cGJuUmxjbVZ6ZENBOExTQmpiM1Z1ZEU5MlpYSnNZWEJ6S0dsdWRHVnlaWE4wTG1keUxDQnhkV1Z5ZVM1bmNpbGNiaUFnWVNBOExTQnpkVzBvYjNabGNteGhjSE5mYVc1MFpYSmxjM1FnUGlBd0tWeHVJQ0IwYjNSaGJGOXBiblJsY21WemRDQThMU0JzWlc1bmRHZ29hVzUwWlhKbGMzUXVaM0lwWEc0Z0lHTWdQQzBnZEc5MFlXeGZhVzUwWlhKbGMzUWdMU0JoWEc0Z0lGeHVJQ0J2ZG1WeWJHRndjMTlpWVdOclozSnZkVzVrSUR3dElHTnZkVzUwVDNabGNteGhjSE1vWW1GamEyZHliM1Z1WkM1bmNpd2djWFZsY25rdVozSXBYRzRnSUdJZ1BDMGdjM1Z0S0c5MlpYSnNZWEJ6WDJKaFkydG5jbTkxYm1RZ1BpQXdLVnh1SUNCMGIzUmhiRjlpWVdOclozSnZkVzVrSUR3dElHeGxibWQwYUNoaVlXTnJaM0p2ZFc1a0xtZHlLVnh1SUNCa0lEd3RJSFJ2ZEdGc1gySmhZMnRuY205MWJtUWdMU0JpWEc0Z0lGeHVJQ0FqSUVOdmJuTjBjblZqZENCamIyNTBhVzVuWlc1amVTQjBZV0pzWlZ4dUlDQmpiMjUwYVc1blpXNWplVjkwWVdKc1pTQThMU0J0WVhSeWFYZ29ZeWhoTENCakxDQmlMQ0JrS1N3Z2JuSnZkejB5TENCaWVYSnZkejFVVWxWRkxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsdGJtRnRaWE05YkdsemRDaGNYRkpsWjJsdmJseGNJRDBnWXloY1hHbHVkR1Z5WlhOMExtZHlYRndzSUZ4Y1ltRmphMmR5YjNWdVpDNW5jbHhjS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeFBkbVZ5YkdGd1hGd2dQU0JqS0Z4Y1dXVnpYRndzSUZ4Y1RtOWNYQ2twS1Z4dUlDQmNiaUFnSXlCUVpYSm1iM0p0SUVacGMyaGxjaWR6SUdWNFlXTjBJSFJsYzNSY2JpQWdabWx6YUdWeVgzSmxjM1ZzZENBOExTQm1hWE5vWlhJdWRHVnpkQ2hqYjI1MGFXNW5aVzVqZVY5MFlXSnNaU2xjYmlBZ1hHNGdJSEpsZEhWeWJpaG1hWE5vWlhKZmNtVnpkV3gwS1Z4dWZWeHVYRzV5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVJRHd0SUdaMWJtTjBhVzl1S0dsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBZWEpuWlhST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUmhhVzVsWkM1bmNpd2diRzl6ZEM1bmNpbDdYRzRnSUNNZ1UwVkZSRWxPUjF4dUlDQjBaVzF3SUR3dElISjFia1pwYzJobGNrVjRZV04wS0d4dmIzQXVkWEF1WjNJc0lHSmhZMnRuY205MWJtUXVaM0lzSUhKbGRHRnBibVZrTG1keUtWeHVJQ0J5WlhOMWJIUXVkR0lnUEMwZ2RHbGlZbXhsS0dsdWRHVnlaWE4wSUQwZ2NHRnpkR1V3S0dsdWRHVnlaWE4wVG1GdFpTd2dYRnhmVlZCY1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHRnlaMlYwSUQwZ2NHRnpkR1V3S0hSaGNtZGxkRTVoYldVc0lGeGNYM0psZEdGcGJtVmtYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEIyWVd4MVpTQTlJSFJsYlhBa2NDNTJZV3gxWlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2WkdSelVtRjBhVzhnUFNCMFpXMXdKR1Z6ZEdsdFlYUmxLVnh1SUNCY2JpQWdJeUJCUkVSSlRrY2dVazlYVTF4dUlDQjBaVzF3SUR3dElISjFia1pwYzJobGNrVjRZV04wS0d4dmIzQXVibTh1WjNJc0lHSmhZMnRuY205MWJtUXVaM0lzSUhKbGRHRnBibVZrTG1keUtWeHVJQ0J5WlhOMWJIUXVkR0lnUEMwZ2NtVnpkV3gwTG5SaUlDVStKU0JjYmlBZ0lDQmhaR1JmY205M0tHbHVkR1Z5WlhOMElEMGdjR0Z6ZEdVd0tHbHVkR1Z5WlhOMFRtRnRaU3dnWEZ4ZlRrOWNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQjBZWEpuWlhRZ1BTQndZWE4wWlRBb2RHRnlaMlYwVG1GdFpTd2dYRnhmY21WMFlXbHVaV1JjWENrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0J3ZG1Gc2RXVWdQU0IwWlcxd0pIQXVkbUZzZFdVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0J2WkdSelVtRjBhVzhnUFNCMFpXMXdKR1Z6ZEdsdFlYUmxLVnh1SUNCY2JpQWdJeUJCUkVSSlRrY2dVazlYVTF4dUlDQjBaVzF3SUR3dElISjFia1pwYzJobGNrVjRZV04wS0d4dmIzQXVaRzkzYmk1bmNpd2dZbUZqYTJkeWIzVnVaQzVuY2l3Z2NtVjBZV2x1WldRdVozSXBYRzRnSUhKbGMzVnNkQzUwWWlBOExTQnlaWE4xYkhRdWRHSWdKVDRsSUZ4dUlDQWdJR0ZrWkY5eWIzY29hVzUwWlhKbGMzUWdQU0J3WVhOMFpUQW9hVzUwWlhKbGMzUk9ZVzFsTENCY1hGOUVUMWRPWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdGeVoyVjBJRDBnY0dGemRHVXdLSFJoY21kbGRFNWhiV1VzSUZ4Y1gzSmxkR0ZwYm1Wa1hGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2NIWmhiSFZsSUQwZ2RHVnRjQ1J3TG5aaGJIVmxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2IyUmtjMUpoZEdsdklEMGdkR1Z0Y0NSbGMzUnBiV0YwWlNsY2JpQWdYRzRnSUNNZ1FVUkVTVTVISUZKUFYxTmNiaUFnZEdWdGNDQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRDaHNiMjl3TG5Wd0xtZHlMQ0JpWVdOclozSnZkVzVrTG1keUxDQnNiM04wTG1keUtWeHVJQ0J5WlhOMWJIUXVkR0lnUEMwZ2NtVnpkV3gwTG5SaUlDVStKU0JjYmlBZ0lDQmhaR1JmY205M0tHbHVkR1Z5WlhOMElEMGdjR0Z6ZEdVd0tHbHVkR1Z5WlhOMFRtRnRaU3dnWEZ4ZlZWQmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQjBZWEpuWlhRZ1BTQndZWE4wWlRBb2RHRnlaMlYwVG1GdFpTd2dYRnhmYkc5emRGeGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lIQjJZV3gxWlNBOUlIUmxiWEFrY0M1MllXeDFaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHOWtaSE5TWVhScGJ5QTlJSFJsYlhBa1pYTjBhVzFoZEdVcFhHNGdJRnh1SUNBaklFRkVSRWxPUnlCU1QxZFRYRzRnSUhSbGJYQWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUW9iRzl2Y0M1dWJ5NW5jaXdnWW1GamEyZHliM1Z1WkM1bmNpd2diRzl6ZEM1bmNpbGNiaUFnY21WemRXeDBMblJpSUR3dElISmxjM1ZzZEM1MFlpQWxQaVVnWEc0Z0lDQWdZV1JrWDNKdmR5aHBiblJsY21WemRDQTlJSEJoYzNSbE1DaHBiblJsY21WemRFNWhiV1VzSUZ4Y1gwNVBYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdkR0Z5WjJWMElEMGdjR0Z6ZEdVd0tIUmhjbWRsZEU1aGJXVXNJRnhjWDJ4dmMzUmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQndkbUZzZFdVZ1BTQjBaVzF3SkhBdWRtRnNkV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnZaR1J6VW1GMGFXOGdQU0IwWlcxd0pHVnpkR2x0WVhSbEtWeHVJQ0JjYmlBZ0l5QkJSRVJKVGtjZ1VrOVhVMXh1SUNCMFpXMXdJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBLR3h2YjNBdVpHOTNiaTVuY2l3Z1ltRmphMmR5YjNWdVpDNW5jaXdnYkc5emRDNW5jaWxjYmlBZ2NtVnpkV3gwTG5SaUlEd3RJSEpsYzNWc2RDNTBZaUFsUGlVZ1hHNGdJQ0FnWVdSa1gzSnZkeWhwYm5SbGNtVnpkQ0E5SUhCaGMzUmxNQ2hwYm5SbGNtVnpkRTVoYldVc0lGeGNYMFJQVjA1Y1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNCMFlYSm5aWFFnUFNCd1lYTjBaVEFvZEdGeVoyVjBUbUZ0WlN3Z1hGeGZiRzl6ZEZ4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUhCMllXeDFaU0E5SUhSbGJYQWtjQzUyWVd4MVpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUc5a1pITlNZWFJwYnlBOUlIUmxiWEFrWlhOMGFXMWhkR1VwWEc0Z0lGeHVJQ0J5WlhSMWNtNG9jbVZ6ZFd4MExuUmlLVnh1ZlZ4dVhHNXlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVFtbHVZWEo1SUR3dElHWjFibU4wYVc5dUtHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0c1dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJoY21kbGRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkR0ZwYm1Wa0xtZHlMQ0JzYjNOMExtZHlLWHRjYmlBZ0l5QlRSVVZFU1U1SFhHNGdJSFJsYlhBZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNRb2JHOXZjQzUxY0c1dkxtZHlMQ0JpWVdOclozSnZkVzVrTG1keUxDQnlaWFJoYVc1bFpDNW5jaWxjYmlBZ2NtVnpkV3gwTG5SaUlEd3RJSFJwWW1Kc1pTaHBiblJsY21WemRDQTlJSEJoYzNSbE1DaHBiblJsY21WemRFNWhiV1VzSUZ4Y1gxVlFMMDVQWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSaGNtZGxkQ0E5SUhCaGMzUmxNQ2gwWVhKblpYUk9ZVzFsTENCY1hGOXlaWFJoYVc1bFpGeGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndkbUZzZFdVZ1BTQjBaVzF3SkhBdWRtRnNkV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiMlJrYzFKaGRHbHZJRDBnZEdWdGNDUmxjM1JwYldGMFpTbGNiaUFnWEc1Y2JpQWdJeUJCUkVSSlRrY2dVazlYVTF4dUlDQjBaVzF3SUR3dElISjFia1pwYzJobGNrVjRZV04wS0d4dmIzQXVaRzkzYmk1bmNpd2dZbUZqYTJkeWIzVnVaQzVuY2l3Z2NtVjBZV2x1WldRdVozSXBYRzRnSUhKbGMzVnNkQzUwWWlBOExTQnlaWE4xYkhRdWRHSWdKVDRsSUZ4dUlDQWdJR0ZrWkY5eWIzY29hVzUwWlhKbGMzUWdQU0J3WVhOMFpUQW9hVzUwWlhKbGMzUk9ZVzFsTENCY1hGOUVUMWRPWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdGeVoyVjBJRDBnY0dGemRHVXdLSFJoY21kbGRFNWhiV1VzSUZ4Y1gzSmxkR0ZwYm1Wa1hGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2NIWmhiSFZsSUQwZ2RHVnRjQ1J3TG5aaGJIVmxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2IyUmtjMUpoZEdsdklEMGdkR1Z0Y0NSbGMzUnBiV0YwWlNsY2JpQWdYRzRnSUNNZ1FVUkVTVTVISUZKUFYxTmNiaUFnZEdWdGNDQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRDaHNiMjl3TG5Wd2JtOHVaM0lzSUdKaFkydG5jbTkxYm1RdVozSXNJR3h2YzNRdVozSXBYRzRnSUhKbGMzVnNkQzUwWWlBOExTQnlaWE4xYkhRdWRHSWdKVDRsSUZ4dUlDQWdJR0ZrWkY5eWIzY29hVzUwWlhKbGMzUWdQU0J3WVhOMFpUQW9hVzUwWlhKbGMzUk9ZVzFsTENCY1hGOVZVQzlPVDF4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUhSaGNtZGxkQ0E5SUhCaGMzUmxNQ2gwWVhKblpYUk9ZVzFsTENCY1hGOXNiM04wWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnY0haaGJIVmxJRDBnZEdWdGNDUndMblpoYkhWbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnYjJSa2MxSmhkR2x2SUQwZ2RHVnRjQ1JsYzNScGJXRjBaU2xjYmx4dUlDQmNiaUFnSXlCQlJFUkpUa2NnVWs5WFUxeHVJQ0IwWlcxd0lEd3RJSEoxYmtacGMyaGxja1Y0WVdOMEtHeHZiM0F1Wkc5M2JpNW5jaXdnWW1GamEyZHliM1Z1WkM1bmNpd2diRzl6ZEM1bmNpbGNiaUFnY21WemRXeDBMblJpSUR3dElISmxjM1ZzZEM1MFlpQWxQaVVnWEc0Z0lDQWdZV1JrWDNKdmR5aHBiblJsY21WemRDQTlJSEJoYzNSbE1DaHBiblJsY21WemRFNWhiV1VzSUZ4Y1gwUlBWMDVjWENrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwWVhKblpYUWdQU0J3WVhOMFpUQW9kR0Z5WjJWMFRtRnRaU3dnWEZ4ZmJHOXpkRnhjS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJSEIyWVd4MVpTQTlJSFJsYlhBa2NDNTJZV3gxWlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzlrWkhOU1lYUnBieUE5SUhSbGJYQWtaWE4wYVcxaGRHVXBYRzRnSUZ4dUlDQnlaWFIxY200b2NtVnpkV3gwTG5SaUtWeHVmVnh1WEc1eWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VW1WMFlXbHVaV1FnUEMwZ1puVnVZM1JwYjI0b2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJoY21kbGRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkR0ZwYm1Wa0xtZHlLWHRjYmlBZ0l5QlRSVVZFU1U1SFhHNGdJSFJsYlhBZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNRb2JHOXZjQzUxY0M1bmNpd2dZbUZqYTJkeWIzVnVaQzVuY2l3Z2NtVjBZV2x1WldRdVozSXBYRzRnSUhKbGMzVnNkQzUwWWlBOExTQjBhV0ppYkdVb2FXNTBaWEpsYzNRZ1BTQndZWE4wWlRBb2FXNTBaWEpsYzNST1lXMWxMQ0JjWEY5VlVGeGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBZWEpuWlhRZ1BTQndZWE4wWlRBb2RHRnlaMlYwVG1GdFpTd2dYRnhmY21WMFlXbHVaV1JjWENrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0haaGJIVmxJRDBnZEdWdGNDUndMblpoYkhWbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5a1pITlNZWFJwYnlBOUlIUmxiWEFrWlhOMGFXMWhkR1VwWEc0Z0lGeHVJQ0FqSUVGRVJFbE9SeUJTVDFkVFhHNGdJSFJsYlhBZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNRb2JHOXZjQzV1Ynk1bmNpd2dZbUZqYTJkeWIzVnVaQzVuY2l3Z2NtVjBZV2x1WldRdVozSXBYRzRnSUhKbGMzVnNkQzUwWWlBOExTQnlaWE4xYkhRdWRHSWdKVDRsSUZ4dUlDQWdJR0ZrWkY5eWIzY29hVzUwWlhKbGMzUWdQU0J3WVhOMFpUQW9hVzUwWlhKbGMzUk9ZVzFsTENCY1hGOU9UMXhjS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJSFJoY21kbGRDQTlJSEJoYzNSbE1DaDBZWEpuWlhST1lXMWxMQ0JjWEY5eVpYUmhhVzVsWkZ4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUhCMllXeDFaU0E5SUhSbGJYQWtjQzUyWVd4MVpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUc5a1pITlNZWFJwYnlBOUlIUmxiWEFrWlhOMGFXMWhkR1VwWEc0Z0lGeHVJQ0FqSUVGRVJFbE9SeUJTVDFkVFhHNGdJSFJsYlhBZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNRb2JHOXZjQzVrYjNkdUxtZHlMQ0JpWVdOclozSnZkVzVrTG1keUxDQnlaWFJoYVc1bFpDNW5jaWxjYmlBZ2NtVnpkV3gwTG5SaUlEd3RJSEpsYzNWc2RDNTBZaUFsUGlVZ1hHNGdJQ0FnWVdSa1gzSnZkeWhwYm5SbGNtVnpkQ0E5SUhCaGMzUmxNQ2hwYm5SbGNtVnpkRTVoYldVc0lGeGNYMFJQVjA1Y1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNCMFlYSm5aWFFnUFNCd1lYTjBaVEFvZEdGeVoyVjBUbUZ0WlN3Z1hGeGZjbVYwWVdsdVpXUmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQndkbUZzZFdVZ1BTQjBaVzF3SkhBdWRtRnNkV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnZaR1J6VW1GMGFXOGdQU0IwWlcxd0pHVnpkR2x0WVhSbEtWeHVJQ0JjYmx4dUlDQnlaWFIxY200b2NtVnpkV3gwTG5SaUtWeHVmVnh1WEc1eWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBJRHd0SUdaMWJtTjBhVzl1S0hSaGNtZGxkRTVoYldVc0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtYdGNiaUFnSXlCU1JWUkJTVTVGUkNCc2IyOXdYRzRnSUhKbGRHRnBibVZrSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYRlJHWDJKdmIydHRZWEpyYVc1blhGd3NJSFJoY21kbGRFNWhiV1VzSUZ4Y1lXMWZZUzVpWldSY1hDa3BJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR01vTVN3Z01pd2dNeWtwWEc0Z0lHTnZiRzVoYldWektISmxkR0ZwYm1Wa0tTQThMU0JqS0Z4Y1kyaHlYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWENsY2JpQWdjbVYwWVdsdVpXUXVaM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0hKbGRHRnBibVZrS1Z4dUlDQWpJRXhQVTFRZ2JHOXZjRnh1SUNCc2IzTjBJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hGUkdYMkp2YjJ0dFlYSnJhVzVuWEZ3c0lIUmhjbWRsZEU1aGJXVXNJRnhjYjJFdVltVmtYRndwS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNcEtWeHVJQ0JqYjJ4dVlXMWxjeWhzYjNOMEtTQThMU0JqS0Z4Y1kyaHlYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWENsY2JpQWdiRzl6ZEM1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9iRzl6ZENsY2JpQWdYRzRnSUhKbGMzVnNkQ0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1S0dsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBZWEpuWlhST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUmhhVzVsWkM1bmNpd2diRzl6ZEM1bmNpbGNiaUFnWEc0Z0lISmxkSFZ5YmloeVpYTjFiSFFwWEc1OVhHNWNibkoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhSQ2FXNWhjbmtnUEMwZ1puVnVZM1JwYjI0b2RHRnlaMlYwVG1GdFpTd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd2JtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbDdYRzRnSUNNZ1VrVlVRVWxPUlVRZ2JHOXZjRnh1SUNCeVpYUmhhVzVsWkNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhVUmw5aWIyOXJiV0Z5YTJsdVoxeGNMQ0IwWVhKblpYUk9ZVzFsTENCY1hHRnRYMkV1WW1Wa1hGd3BLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hqS0RFc0lESXNJRE1wS1Z4dUlDQmpiMnh1WVcxbGN5aHlaWFJoYVc1bFpDa2dQQzBnWXloY1hHTm9jbHhjTENCY1hITjBZWEowWEZ3c0lGeGNaVzVrWEZ3cFhHNGdJSEpsZEdGcGJtVmtMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoeVpYUmhhVzVsWkNsY2JpQWdJeUJNVDFOVUlHeHZiM0JjYmlBZ2JHOXpkQ0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeFVSbDlpYjI5cmJXRnlhMmx1WjF4Y0xDQjBZWEpuWlhST1lXMWxMQ0JjWEc5aExtSmxaRnhjS1NrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1l5Z3hMQ0F5TENBektTbGNiaUFnWTI5c2JtRnRaWE1vYkc5emRDa2dQQzBnWXloY1hHTm9jbHhjTENCY1hITjBZWEowWEZ3c0lGeGNaVzVrWEZ3cFhHNGdJR3h2YzNRdVozSWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLR3h2YzNRcFhHNGdJRnh1SUNCeVpYTjFiSFFnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmtKcGJtRnllU2hwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQnVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMFlYSm5aWFJPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSaGFXNWxaQzVuY2l3Z2JHOXpkQzVuY2lsY2JpQWdYRzRnSUhKbGRIVnliaWh5WlhOMWJIUXBYRzU5WEc1Y2JuSjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFJTWlhSaGFXNWxaQ0E4TFNCbWRXNWpkR2x2YmloMFlYSm5aWFJPWVcxbExDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbDdYRzRnSUNNZ1VrVlVRVWxPUlVRZ2JHOXZjRnh1SUNCeVpYUmhhVzVsWkNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhVUmw5aWIyOXJiV0Z5YTJsdVoxeGNMQ0IwWVhKblpYUk9ZVzFsTENCY1hHRnRYMkV1WW1Wa1hGd3BLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hqS0RFc0lESXNJRE1wS1Z4dUlDQmpiMnh1WVcxbGN5aHlaWFJoYVc1bFpDa2dQQzBnWXloY1hHTm9jbHhjTENCY1hITjBZWEowWEZ3c0lGeGNaVzVrWEZ3cFhHNGdJSEpsZEdGcGJtVmtMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoeVpYUmhhVzVsWkNsY2JpQWdJeUJNVDFOVUlHeHZiM0JjYmlBZ2NtVnpkV3gwSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1U1pYUmhhVzVsWkNocGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR0Z5WjJWMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBZV2x1WldRdVozSXBYRzRnSUZ4dUlDQnlaWFIxY200b2NtVnpkV3gwS1Z4dWZWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG5leHRyYWN0QW5jaG9yIDwtIGZ1bmN0aW9uKGxvb3Ape1xuICBhbmNob3IxIDwtIGxvb3AgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbiAgY29sbmFtZXMoYW5jaG9yMSkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIGFuY2hvcjIgPC0gbG9vcCAlPiUgZHBseXI6OnNlbGVjdChjKDQsIDUsIDYpKVxuICBjb2xuYW1lcyhhbmNob3IyKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgYW5jaG9ycyA8LSByZWR1Y2UobWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGJpbmRfcm93cyhhbmNob3IxLCBhbmNob3IyKSkpXG4gICAgcmV0dXJuKGFuY2hvcnMpXG59XG5cbnJ1bkZpc2hlckV4YWN0IDwtIGZ1bmN0aW9uKGludGVyZXN0LmdyLCBiYWNrZ3JvdW5kLmdyLCBxdWVyeS5ncil7XG4gIG92ZXJsYXBzX2ludGVyZXN0IDwtIGNvdW50T3ZlcmxhcHMoaW50ZXJlc3QuZ3IsIHF1ZXJ5LmdyKVxuICBhIDwtIHN1bShvdmVybGFwc19pbnRlcmVzdCA+IDApXG4gIHRvdGFsX2ludGVyZXN0IDwtIGxlbmd0aChpbnRlcmVzdC5ncilcbiAgYyA8LSB0b3RhbF9pbnRlcmVzdCAtIGFcbiAgXG4gIG92ZXJsYXBzX2JhY2tncm91bmQgPC0gY291bnRPdmVybGFwcyhiYWNrZ3JvdW5kLmdyLCBxdWVyeS5ncilcbiAgYiA8LSBzdW0ob3ZlcmxhcHNfYmFja2dyb3VuZCA+IDApXG4gIHRvdGFsX2JhY2tncm91bmQgPC0gbGVuZ3RoKGJhY2tncm91bmQuZ3IpXG4gIGQgPC0gdG90YWxfYmFja2dyb3VuZCAtIGJcbiAgXG4gICMgQ29uc3RydWN0IGNvbnRpbmdlbmN5IHRhYmxlXG4gIGNvbnRpbmdlbmN5X3RhYmxlIDwtIG1hdHJpeChjKGEsIGMsIGIsIGQpLCBucm93PTIsIGJ5cm93PVRSVUUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1uYW1lcz1saXN0KFxcUmVnaW9uXFwgPSBjKFxcaW50ZXJlc3QuZ3JcXCwgXFxiYWNrZ3JvdW5kLmdyXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXE92ZXJsYXBcXCA9IGMoXFxZZXNcXCwgXFxOb1xcKSkpXG4gIFxuICAjIFBlcmZvcm0gRmlzaGVyJ3MgZXhhY3QgdGVzdFxuICBmaXNoZXJfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlKVxuICBcbiAgcmV0dXJuKGZpc2hlcl9yZXN1bHQpXG59XG5cbnJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb24gPC0gZnVuY3Rpb24oaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkLmdyLCBsb3N0LmdyKXtcbiAgIyBTRUVESU5HXG4gIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC51cC5nciwgYmFja2dyb3VuZC5nciwgcmV0YWluZWQuZ3IpXG4gIHJlc3VsdC50YiA8LSB0aWJibGUoaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9VUFxcKSxcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfcmV0YWluZWRcXCksXG4gICAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIFxuICAjIEFERElORyBST1dTXG4gIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC5uby5nciwgYmFja2dyb3VuZC5nciwgcmV0YWluZWQuZ3IpXG4gIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9OT1xcKSxcbiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9yZXRhaW5lZFxcKSxcbiAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIFxuICAjIEFERElORyBST1dTXG4gIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC5kb3duLmdyLCBiYWNrZ3JvdW5kLmdyLCByZXRhaW5lZC5ncilcbiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gICAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX0RPV05cXCksXG4gICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfcmV0YWluZWRcXCksXG4gICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICBcbiAgIyBBRERJTkcgUk9XU1xuICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AudXAuZ3IsIGJhY2tncm91bmQuZ3IsIGxvc3QuZ3IpXG4gIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9VUFxcKSxcbiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9sb3N0XFwpLFxuICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgXG4gICMgQURESU5HIFJPV1NcbiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLm5vLmdyLCBiYWNrZ3JvdW5kLmdyLCBsb3N0LmdyKVxuICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfTk9cXCksXG4gICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfbG9zdFxcKSxcbiAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIFxuICAjIEFERElORyBST1dTXG4gIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC5kb3duLmdyLCBiYWNrZ3JvdW5kLmdyLCBsb3N0LmdyKVxuICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfRE9XTlxcKSxcbiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9sb3N0XFwpLFxuICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgXG4gIHJldHVybihyZXN1bHQudGIpXG59XG5cbnJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25CaW5hcnkgPC0gZnVuY3Rpb24oaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwbm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWQuZ3IsIGxvc3QuZ3Ipe1xuICAjIFNFRURJTkdcbiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLnVwbm8uZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKVxuICByZXN1bHQudGIgPC0gdGliYmxlKGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfVVAvTk9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX3JldGFpbmVkXFwpLFxuICAgICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICBcblxuICAjIEFERElORyBST1dTXG4gIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC5kb3duLmdyLCBiYWNrZ3JvdW5kLmdyLCByZXRhaW5lZC5ncilcbiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gICAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX0RPV05cXCksXG4gICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfcmV0YWluZWRcXCksXG4gICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICBcbiAgIyBBRERJTkcgUk9XU1xuICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AudXBuby5nciwgYmFja2dyb3VuZC5nciwgbG9zdC5ncilcbiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gICAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX1VQL05PXFwpLFxuICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX2xvc3RcXCksXG4gICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG4gIFxuICAjIEFERElORyBST1dTXG4gIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC5kb3duLmdyLCBiYWNrZ3JvdW5kLmdyLCBsb3N0LmdyKVxuICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfRE9XTlxcKSxcbiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9sb3N0XFwpLFxuICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgXG4gIHJldHVybihyZXN1bHQudGIpXG59XG5cbnJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25SZXRhaW5lZCA8LSBmdW5jdGlvbihpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWQuZ3Ipe1xuICAjIFNFRURJTkdcbiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLnVwLmdyLCBiYWNrZ3JvdW5kLmdyLCByZXRhaW5lZC5ncilcbiAgcmVzdWx0LnRiIDwtIHRpYmJsZShpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX1VQXFwpLFxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9yZXRhaW5lZFxcKSxcbiAgICAgICAgICAgICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgXG4gICMgQURESU5HIFJPV1NcbiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLm5vLmdyLCBiYWNrZ3JvdW5kLmdyLCByZXRhaW5lZC5ncilcbiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gICAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX05PXFwpLFxuICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX3JldGFpbmVkXFwpLFxuICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgXG4gICMgQURESU5HIFJPV1NcbiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLmRvd24uZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKVxuICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfRE9XTlxcKSxcbiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9yZXRhaW5lZFxcKSxcbiAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIFxuXG4gIHJldHVybihyZXN1bHQudGIpXG59XG5cbnJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQgPC0gZnVuY3Rpb24odGFyZ2V0TmFtZSwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3Ipe1xuICAjIFJFVEFJTkVEIGxvb3BcbiAgcmV0YWluZWQgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcVEZfYm9va21hcmtpbmdcXCwgdGFyZ2V0TmFtZSwgXFxhbV9hLmJlZFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbiAgY29sbmFtZXMocmV0YWluZWQpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICByZXRhaW5lZC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmV0YWluZWQpXG4gICMgTE9TVCBsb29wXG4gIGxvc3QgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcVEZfYm9va21hcmtpbmdcXCwgdGFyZ2V0TmFtZSwgXFxvYS5iZWRcXCkpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG4gIGNvbG5hbWVzKGxvc3QpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICBsb3N0LmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShsb3N0KVxuICBcbiAgcmVzdWx0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb24oaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkLmdyLCBsb3N0LmdyKVxuICBcbiAgcmV0dXJuKHJlc3VsdClcbn1cblxucnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldEJpbmFyeSA8LSBmdW5jdGlvbih0YXJnZXROYW1lLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXBuby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKXtcbiAgIyBSRVRBSU5FRCBsb29wXG4gIHJldGFpbmVkIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXFRGX2Jvb2ttYXJraW5nXFwsIHRhcmdldE5hbWUsIFxcYW1fYS5iZWRcXCkpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG4gIGNvbG5hbWVzKHJldGFpbmVkKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgcmV0YWluZWQuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHJldGFpbmVkKVxuICAjIExPU1QgbG9vcFxuICBsb3N0IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXFRGX2Jvb2ttYXJraW5nXFwsIHRhcmdldE5hbWUsIFxcb2EuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyhsb3N0KSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgbG9zdC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUobG9zdClcbiAgXG4gIHJlc3VsdCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uQmluYXJ5KGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cG5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkLmdyLCBsb3N0LmdyKVxuICBcbiAgcmV0dXJuKHJlc3VsdClcbn1cblxucnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkIDwtIGZ1bmN0aW9uKHRhcmdldE5hbWUsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKXtcbiAgIyBSRVRBSU5FRCBsb29wXG4gIHJldGFpbmVkIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXFRGX2Jvb2ttYXJraW5nXFwsIHRhcmdldE5hbWUsIFxcYW1fYS5iZWRcXCkpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG4gIGNvbG5hbWVzKHJldGFpbmVkKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgcmV0YWluZWQuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHJldGFpbmVkKVxuICAjIExPU1QgbG9vcFxuICByZXN1bHQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblJldGFpbmVkKGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZC5ncilcbiAgXG4gIHJldHVybihyZXN1bHQpXG59XG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZXh0cmFjdEFuY2hvciA8LSBmdW5jdGlvbihsb29wKXtcbiAgYW5jaG9yMSA8LSBsb29wICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG4gIGNvbG5hbWVzKGFuY2hvcjEpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICBhbmNob3IyIDwtIGxvb3AgJT4lIGRwbHlyOjpzZWxlY3QoYyg0LCA1LCA2KSlcbiAgY29sbmFtZXMoYW5jaG9yMikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIGFuY2hvcnMgPC0gcmVkdWNlKG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShiaW5kX3Jvd3MoYW5jaG9yMSwgYW5jaG9yMikpKVxuICAgIHJldHVybihhbmNob3JzKVxufVxuXG5ydW5GaXNoZXJFeGFjdCA8LSBmdW5jdGlvbihpbnRlcmVzdC5nciwgYmFja2dyb3VuZC5nciwgcXVlcnkuZ3Ipe1xuICBvdmVybGFwc19pbnRlcmVzdCA8LSBjb3VudE92ZXJsYXBzKGludGVyZXN0LmdyLCBxdWVyeS5ncilcbiAgYSA8LSBzdW0ob3ZlcmxhcHNfaW50ZXJlc3QgPiAwKVxuICB0b3RhbF9pbnRlcmVzdCA8LSBsZW5ndGgoaW50ZXJlc3QuZ3IpXG4gIGMgPC0gdG90YWxfaW50ZXJlc3QgLSBhXG4gIFxuICBvdmVybGFwc19iYWNrZ3JvdW5kIDwtIGNvdW50T3ZlcmxhcHMoYmFja2dyb3VuZC5nciwgcXVlcnkuZ3IpXG4gIGIgPC0gc3VtKG92ZXJsYXBzX2JhY2tncm91bmQgPiAwKVxuICB0b3RhbF9iYWNrZ3JvdW5kIDwtIGxlbmd0aChiYWNrZ3JvdW5kLmdyKVxuICBkIDwtIHRvdGFsX2JhY2tncm91bmQgLSBiXG4gIFxuICAjIENvbnN0cnVjdCBjb250aW5nZW5jeSB0YWJsZVxuICBjb250aW5nZW5jeV90YWJsZSA8LSBtYXRyaXgoYyhhLCBjLCBiLCBkKSwgbnJvdz0yLCBieXJvdz1UUlVFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltbmFtZXM9bGlzdChcXFJlZ2lvblxcID0gYyhcXGludGVyZXN0LmdyXFwsIFxcYmFja2dyb3VuZC5nclxcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxPdmVybGFwXFwgPSBjKFxcWWVzXFwsIFxcTm9cXCkpKVxuICBcbiAgIyBQZXJmb3JtIEZpc2hlcidzIGV4YWN0IHRlc3RcbiAgZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSlcbiAgXG4gIHJldHVybihmaXNoZXJfcmVzdWx0KVxufVxuXG5ydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uIDwtIGZ1bmN0aW9uKGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZC5nciwgbG9zdC5ncil7XG4gICMgU0VFRElOR1xuICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AudXAuZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKVxuICByZXN1bHQudGIgPC0gdGliYmxlKGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfVVBcXCksXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX3JldGFpbmVkXFwpLFxuICAgICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICBcbiAgIyBBRERJTkcgUk9XU1xuICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3Aubm8uZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKVxuICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfTk9cXCksXG4gICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfcmV0YWluZWRcXCksXG4gICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICBcbiAgIyBBRERJTkcgUk9XU1xuICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AuZG93bi5nciwgYmFja2dyb3VuZC5nciwgcmV0YWluZWQuZ3IpXG4gIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9ET1dOXFwpLFxuICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX3JldGFpbmVkXFwpLFxuICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgXG4gICMgQURESU5HIFJPV1NcbiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLnVwLmdyLCBiYWNrZ3JvdW5kLmdyLCBsb3N0LmdyKVxuICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfVVBcXCksXG4gICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfbG9zdFxcKSxcbiAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIFxuICAjIEFERElORyBST1dTXG4gIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC5uby5nciwgYmFja2dyb3VuZC5nciwgbG9zdC5ncilcbiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gICAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX05PXFwpLFxuICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX2xvc3RcXCksXG4gICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICBcbiAgIyBBRERJTkcgUk9XU1xuICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AuZG93bi5nciwgYmFja2dyb3VuZC5nciwgbG9zdC5ncilcbiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gICAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX0RPV05cXCksXG4gICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfbG9zdFxcKSxcbiAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIFxuICByZXR1cm4ocmVzdWx0LnRiKVxufVxuXG5ydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uQmluYXJ5IDwtIGZ1bmN0aW9uKGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cG5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkLmdyLCBsb3N0LmdyKXtcbiAgIyBTRUVESU5HXG4gIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC51cG5vLmdyLCBiYWNrZ3JvdW5kLmdyLCByZXRhaW5lZC5ncilcbiAgcmVzdWx0LnRiIDwtIHRpYmJsZShpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX1VQL05PXFwpLFxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9yZXRhaW5lZFxcKSxcbiAgICAgICAgICAgICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgXG5cbiAgIyBBRERJTkcgUk9XU1xuICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AuZG93bi5nciwgYmFja2dyb3VuZC5nciwgcmV0YWluZWQuZ3IpXG4gIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9ET1dOXFwpLFxuICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX3JldGFpbmVkXFwpLFxuICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgXG4gICMgQURESU5HIFJPV1NcbiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLnVwbm8uZ3IsIGJhY2tncm91bmQuZ3IsIGxvc3QuZ3IpXG4gIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9VUC9OT1xcKSxcbiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9sb3N0XFwpLFxuICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuICBcbiAgIyBBRERJTkcgUk9XU1xuICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AuZG93bi5nciwgYmFja2dyb3VuZC5nciwgbG9zdC5ncilcbiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gICAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX0RPV05cXCksXG4gICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfbG9zdFxcKSxcbiAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIFxuICByZXR1cm4ocmVzdWx0LnRiKVxufVxuXG5ydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uUmV0YWluZWQgPC0gZnVuY3Rpb24oaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkLmdyKXtcbiAgIyBTRUVESU5HXG4gIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC51cC5nciwgYmFja2dyb3VuZC5nciwgcmV0YWluZWQuZ3IpXG4gIHJlc3VsdC50YiA8LSB0aWJibGUoaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9VUFxcKSxcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfcmV0YWluZWRcXCksXG4gICAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIFxuICAjIEFERElORyBST1dTXG4gIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC5uby5nciwgYmFja2dyb3VuZC5nciwgcmV0YWluZWQuZ3IpXG4gIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9OT1xcKSxcbiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9yZXRhaW5lZFxcKSxcbiAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIFxuICAjIEFERElORyBST1dTXG4gIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC5kb3duLmdyLCBiYWNrZ3JvdW5kLmdyLCByZXRhaW5lZC5ncilcbiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gICAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX0RPV05cXCksXG4gICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfcmV0YWluZWRcXCksXG4gICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICBcblxuICByZXR1cm4ocmVzdWx0LnRiKVxufVxuXG5ydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0IDwtIGZ1bmN0aW9uKHRhcmdldE5hbWUsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKXtcbiAgIyBSRVRBSU5FRCBsb29wXG4gIHJldGFpbmVkIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXFRGX2Jvb2ttYXJraW5nXFwsIHRhcmdldE5hbWUsIFxcYW1fYS5iZWRcXCkpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG4gIGNvbG5hbWVzKHJldGFpbmVkKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgcmV0YWluZWQuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHJldGFpbmVkKVxuICAjIExPU1QgbG9vcFxuICBsb3N0IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXFRGX2Jvb2ttYXJraW5nXFwsIHRhcmdldE5hbWUsIFxcb2EuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyhsb3N0KSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgbG9zdC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUobG9zdClcbiAgXG4gIHJlc3VsdCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uKGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZC5nciwgbG9zdC5ncilcbiAgXG4gIHJldHVybihyZXN1bHQpXG59XG5cbnJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRCaW5hcnkgPC0gZnVuY3Rpb24odGFyZ2V0TmFtZSwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwbm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncil7XG4gICMgUkVUQUlORUQgbG9vcFxuICByZXRhaW5lZCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxURl9ib29rbWFya2luZ1xcLCB0YXJnZXROYW1lLCBcXGFtX2EuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyhyZXRhaW5lZCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIHJldGFpbmVkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShyZXRhaW5lZClcbiAgIyBMT1NUIGxvb3BcbiAgbG9zdCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxURl9ib29rbWFya2luZ1xcLCB0YXJnZXROYW1lLCBcXG9hLmJlZFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbiAgY29sbmFtZXMobG9zdCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIGxvc3QuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGxvc3QpXG4gIFxuICByZXN1bHQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvbkJpbmFyeShpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXBuby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZC5nciwgbG9zdC5ncilcbiAgXG4gIHJldHVybihyZXN1bHQpXG59XG5cbnJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZCA8LSBmdW5jdGlvbih0YXJnZXROYW1lLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncil7XG4gICMgUkVUQUlORUQgbG9vcFxuICByZXRhaW5lZCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxURl9ib29rbWFya2luZ1xcLCB0YXJnZXROYW1lLCBcXGFtX2EuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyhyZXRhaW5lZCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIHJldGFpbmVkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShyZXRhaW5lZClcbiAgIyBMT1NUIGxvb3BcbiAgcmVzdWx0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25SZXRhaW5lZChpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWQuZ3IpXG4gIFxuICByZXR1cm4ocmVzdWx0KVxufVxuYGBgXG5gYGAifQ== -->

```r
```r
extractAnchor <- function(loop){
  anchor1 <- loop %>% dplyr::select(c(1, 2, 3))
  colnames(anchor1) <- c(\chr\, \start\, \end\)
  anchor2 <- loop %>% dplyr::select(c(4, 5, 6))
  colnames(anchor2) <- c(\chr\, \start\, \end\)
  anchors <- reduce(makeGRangesFromDataFrame(bind_rows(anchor1, anchor2)))
    return(anchors)
}

runFisherExact <- function(interest.gr, background.gr, query.gr){
  overlaps_interest <- countOverlaps(interest.gr, query.gr)
  a <- sum(overlaps_interest > 0)
  total_interest <- length(interest.gr)
  c <- total_interest - a
  
  overlaps_background <- countOverlaps(background.gr, query.gr)
  b <- sum(overlaps_background > 0)
  total_background <- length(background.gr)
  d <- total_background - b
  
  # Construct contingency table
  contingency_table <- matrix(c(a, c, b, d), nrow=2, byrow=TRUE,
                              dimnames=list(\Region\ = c(\interest.gr\, \background.gr\),
                                            \Overlap\ = c(\Yes\, \No\)))
  
  # Perform Fisher's exact test
  fisher_result <- fisher.test(contingency_table)
  
  return(fisher_result)
}

runFisherExactCombination <- function(interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr,
                                      targetName,
                                      retained.gr, lost.gr){
  # SEEDING
  temp <- runFisherExact(loop.up.gr, background.gr, retained.gr)
  result.tb <- tibble(interest = paste0(interestName, \_UP\),
                      target = paste0(targetName, \_retained\),
                      pvalue = temp$p.value,
                      oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.no.gr, background.gr, retained.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_NO\),
            target = paste0(targetName, \_retained\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.down.gr, background.gr, retained.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_DOWN\),
            target = paste0(targetName, \_retained\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.up.gr, background.gr, lost.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_UP\),
            target = paste0(targetName, \_lost\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.no.gr, background.gr, lost.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_NO\),
            target = paste0(targetName, \_lost\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.down.gr, background.gr, lost.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_DOWN\),
            target = paste0(targetName, \_lost\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  return(result.tb)
}

runFisherExactCombinationBinary <- function(interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr,
                                      targetName,
                                      retained.gr, lost.gr){
  # SEEDING
  temp <- runFisherExact(loop.upno.gr, background.gr, retained.gr)
  result.tb <- tibble(interest = paste0(interestName, \_UP/NO\),
                      target = paste0(targetName, \_retained\),
                      pvalue = temp$p.value,
                      oddsRatio = temp$estimate)
  

  # ADDING ROWS
  temp <- runFisherExact(loop.down.gr, background.gr, retained.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_DOWN\),
            target = paste0(targetName, \_retained\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.upno.gr, background.gr, lost.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_UP/NO\),
            target = paste0(targetName, \_lost\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)

  
  # ADDING ROWS
  temp <- runFisherExact(loop.down.gr, background.gr, lost.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_DOWN\),
            target = paste0(targetName, \_lost\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  return(result.tb)
}

runFisherExactCombinationRetained <- function(interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr,
                                      targetName,
                                      retained.gr){
  # SEEDING
  temp <- runFisherExact(loop.up.gr, background.gr, retained.gr)
  result.tb <- tibble(interest = paste0(interestName, \_UP\),
                      target = paste0(targetName, \_retained\),
                      pvalue = temp$p.value,
                      oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.no.gr, background.gr, retained.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_NO\),
            target = paste0(targetName, \_retained\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  # ADDING ROWS
  temp <- runFisherExact(loop.down.gr, background.gr, retained.gr)
  result.tb <- result.tb %>% 
    add_row(interest = paste0(interestName, \_DOWN\),
            target = paste0(targetName, \_retained\),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  

  return(result.tb)
}

runFisherExactCombinationTarget <- function(targetName, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr){
  # RETAINED loop
  retained <- fread(here(refDir, \TF_bookmarking\, targetName, \am_a.bed\)) %>% dplyr::select(c(1, 2, 3))
  colnames(retained) <- c(\chr\, \start\, \end\)
  retained.gr <- makeGRangesFromDataFrame(retained)
  # LOST loop
  lost <- fread(here(refDir, \TF_bookmarking\, targetName, \oa.bed\)) %>% dplyr::select(c(1, 2, 3))
  colnames(lost) <- c(\chr\, \start\, \end\)
  lost.gr <- makeGRangesFromDataFrame(lost)
  
  result <- runFisherExactCombination(interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr,
                                      targetName,
                                      retained.gr, lost.gr)
  
  return(result)
}

runFisherExactCombinationTargetBinary <- function(targetName, interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr){
  # RETAINED loop
  retained <- fread(here(refDir, \TF_bookmarking\, targetName, \am_a.bed\)) %>% dplyr::select(c(1, 2, 3))
  colnames(retained) <- c(\chr\, \start\, \end\)
  retained.gr <- makeGRangesFromDataFrame(retained)
  # LOST loop
  lost <- fread(here(refDir, \TF_bookmarking\, targetName, \oa.bed\)) %>% dplyr::select(c(1, 2, 3))
  colnames(lost) <- c(\chr\, \start\, \end\)
  lost.gr <- makeGRangesFromDataFrame(lost)
  
  result <- runFisherExactCombinationBinary(interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr,
                                      targetName,
                                      retained.gr, lost.gr)
  
  return(result)
}

runFisherExactCombinationTargetRetained <- function(targetName, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr){
  # RETAINED loop
  retained <- fread(here(refDir, \TF_bookmarking\, targetName, \am_a.bed\)) %>% dplyr::select(c(1, 2, 3))
  colnames(retained) <- c(\chr\, \start\, \end\)
  retained.gr <- makeGRangesFromDataFrame(retained)
  # LOST loop
  result <- runFisherExactCombinationRetained(interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr,
                                      targetName,
                                      retained.gr)
  
  return(result)
}
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### A485

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlCSmJYQnZjblJwYm1jZ2JHOXZjSE1nYjJZZ2FXNTBaWEpsYzNSY2JtbHVkR1Z5WlhOMFRtRnRaU0E4TFNCY0ltRnNiRXh2YjNCY0lseHVJeUJDUVVOTFIxSlBWVTVFSUd4dmIzQmNibUpoWTJ0bmNtOTFibVFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5aGJHd3VZbVZrY0dWY0lpa3BYRzVpWVdOclozSnZkVzVrTG1keUlEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHSmhZMnRuY205MWJtUXBLVnh1SXlCVlVDQnNiMjl3WEc1c2IyOXdMblZ3SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZllXeHNYMlJVUVVkMmMwUk5VMDlmVlZCZlpHbG1aakF1TWk1aVpXUndaVndpS1NsY2JteHZiM0F1ZFhBdVozSWdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1MWNDa3BYRzRqSUU1UElHeHZiM0JjYm14dmIzQXVibThnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5aGJHeGZaRlJCUjNaelJFMVRUMTlPVDE5a2FXWm1NQzR5TG1KbFpIQmxYQ0lwS1Z4dWJHOXZjQzV1Ynk1bmNpQThMU0FvWlhoMGNtRmpkRUZ1WTJodmNpaHNiMjl3TG01dktTbGNiaU1nUkU5WFRpQnNiMjl3WEc1c2IyOXdUblZ0SUR3dElHNXliM2NvYkc5dmNDNXVieWxjYm14dmIzQXVZV3hzSUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhrdWRITjJYQ0lwS1Z4dWJHOXZjQzVrYjNkdUlEd3RJR3h2YjNBdVlXeHNJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR1JwWm1aZlpGUkJSMTlFVFZOUElEd2dMVEF1TWlrZ0pUNGxJR1J3YkhseU9qcGhjbkpoYm1kbEtHUnBabVpmWkZSQlIxOUVUVk5QS1NBbFBpVWdjMnhwWTJWZmFHVmhaQ2h1SUQwZ2JHOXZjRTUxYlNsY2JteHZiM0F1Wkc5M2JpNW5jaUE4TFNBb1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtUnZkMjRwS1Z4dVhHNGpJeU1qSUVsdGNHOXlkR2x1WnlCc2IyOXdjeUJ2WmlCMFlYSm5aWFJjYm5SbGJYQXhJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YQ0pCVkVGRFgyVm1abWxsWENJc0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RJZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY0lrTlVRMFpjSWl3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TXlBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z3aVJWTlNVa0pmWkhOblhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNEUWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJa1ZUVWxKQ1gwNURRbHdpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEExSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWENKRlUxSlNRbDl3Wm1GY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd05pQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMEtGd2lTRE5MTWpkaFkxOWxabVpwWlZ3aUxDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBM0lEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hDSkxURVkwWDJWbVptbGxYQ0lzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5S1Z4dWRHVnRjRGdnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkQ2hjSWs1QlRrOUhYMlJ6WjF3aUxDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBNUlEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hDSk9RVTVQUjE5d1ptRmNJaXdnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdNVEFnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkQ2hjSWs5RFZEUmZaV1ptYVdWY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01URWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJazlEVkRSZlpITm5YQ0lzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5S1Z4dWRHVnRjREV5SUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWENKUFExUTBYM0JtWVZ3aUxDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBeE15QThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMEtGd2lVMDFETVZ3aUxDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBeE5DQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMEtGd2lVMDlZTWw5bFptWnBaVndpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEF4TlNBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z3aVUwOVlNbDlrYzJkY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01UWWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJbE5QV0RKZmNHWmhYQ0lzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5S1Z4dWRHVnRjREUzSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWENKVVFsQmNJaXdnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1Y2JseHVYRzVjYm1SaGRHRWdQQzBnWW1sdVpGOXliM2R6S0hSbGJYQXhMQ0IwWlcxd01pd2dkR1Z0Y0RNc0lIUmxiWEEwTENCMFpXMXdOU3hjYmlBZ0lDQWdJQ0FnSUhSbGJYQTJMQ0IwWlcxd055d2dkR1Z0Y0Rnc0lIUmxiWEE1TENCMFpXMXdNVEFzWEc0Z0lDQWdJQ0FnSUNCMFpXMXdNVEVzSUhSbGJYQXhNaXdnZEdWdGNERXpMQ0IwWlcxd01UUXNJSFJsYlhBeE5Td2dkR1Z0Y0RFMklDeDBaVzF3TVRjcFhHNWNiaU1nVm1semRXRnNhWHBoZEdsdmJseHViR2xpY21GeWVTaGphWEpqYkdsNlpTbGNibHh1YUdWaGRHMWhjRjlrWVhSaElEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCcGJuUmxjbVZ6ZEN3Z2IyUmtjMUpoZEdsdktTQWxQaVZjYm5CcGRtOTBYM2RwWkdWeUtHNWhiV1Z6WDJaeWIyMGdQU0JwYm5SbGNtVnpkQ3dnZG1Gc2RXVnpYMlp5YjIwZ1BTQnZaR1J6VW1GMGFXOHBJQ1UrSlZ4dUlDQmpiMngxYlc1ZmRHOWZjbTkzYm1GdFpYTW9kbUZ5SUQwZ1hDSjBZWEpuWlhSY0lpbGNibHh1Y0haaGJIVmxYMlJoZEdFZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUdsdWRHVnlaWE4wTENCd2RtRnNkV1VwSUNVK0pWeHVJQ0J3YVhadmRGOTNhV1JsY2lodVlXMWxjMTltY205dElEMGdhVzUwWlhKbGMzUXNJSFpoYkhWbGMxOW1jbTl0SUQwZ2NIWmhiSFZsS1NBbFBpVmNiaUFnWTI5c2RXMXVYM1J2WDNKdmQyNWhiV1Z6S0haaGNpQTlJRndpZEdGeVoyVjBYQ0lwWEc1Y2JtTnZiRjltZFc0Z1BDMGdZMjlzYjNKU1lXMXdNaWhqS0RBc0lERXNJRFVwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqS0Z3aVlteDFaVndpTENCY0luZG9hWFJsWENJc0lGd2ljbVZrWENJcEtWeHVYRzVJWldGMGJXRndLR0Z6TG0xaGRISnBlQ2hvWldGMGJXRndYMlJoZEdFcExGeHVJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hDSlBaR1J6SUZKaGRHbHZYQ0lzWEc0Z0lDQWdJQ0FnSUdOdmJDQTlJR052YkY5bWRXNHNYRzRnSUNBZ0lDQWdJQ01nUVdSa0lHRnVibTkwWVhScGIyNGdabTl5SUhBdGRtRnNkV1Z6WEc0Z0lDQWdJQ0FnSUdObGJHeGZablZ1SUQwZ1puVnVZM1JwYjI0b2Fpd2dhU3dnZUN3Z2VTd2dkMmxrZEdnc0lHaGxhV2RvZEN3Z1ptbHNiQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lIQjJZV3dnUEMwZ2NIWmhiSFZsWDJSaGRHRmJhU3dnYWwxY2JpQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOExTQnBabVZzYzJVb2NIWmhiQ0ErSURBdU1EVXNJRndpYmk1ekxsd2lMQ0J6Y0hKcGJuUm1LRndpSlM0eVpWd2lMQ0J3ZG1Gc0tTbGNiaUFnSUNBZ0lDQWdJQ0JuY21sa0xuUmxlSFFvYkdGaVpXd3NJSGdzSUhrc0lHZHdJRDBnWjNCaGNpaG1iMjUwYzJsNlpTQTlJREV3S1NsY2JpQWdJQ0FnSUNBZ2ZTeGNiaUFnSUNBZ0lDQWdJeUJEZFhOMGIyMXBlbVVnZEdobElHaGxZWFJ0WVhBZ2JHRjViM1YwWEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpmY205M2N5QTlJRVpCVEZORkxGeHVJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeVgyTnZiSFZ0Ym5NZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ1kyOXNkVzF1WDNScGRHeGxJRDBnWENKSmJuUmxjbVZ6ZEZ3aUxGeHVJQ0FnSUNBZ0lDQnliM2RmZEdsMGJHVWdQU0JjSWxSaGNtZGxkRndpTEZ4dUlDQWdJQ0FnSUNCb1pXRjBiV0Z3WDJ4bFoyVnVaRjl3WVhKaGJTQTlJR3hwYzNRb1lYUWdQU0JqS0RBc0lERXNJRElzSURNc0lEUXNJRFVwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeGhZbVZzY3lBOUlHTW9YQ0l3WENJc0lGd2lNVndpTENCY0lqSmNJaXdnWENJelhDSXNJRndpTkZ3aUxDQmNJalZjSWlrcEtWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgaW50ZXJlc3RcbmludGVyZXN0TmFtZSA8LSBcXGFsbExvb3BcXFxuIyBCQUNLR1JPVU5EIGxvb3BcbmJhY2tncm91bmQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGwuYmVkcGVcXCkpXG5iYWNrZ3JvdW5kLmdyIDwtIChleHRyYWN0QW5jaG9yKGJhY2tncm91bmQpKVxuIyBVUCBsb29wXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3AudXAuZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG4jIE5PIGxvb3Bcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5uby5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbiMgRE9XTiBsb29wXG5sb29wTnVtIDwtIG5yb3cobG9vcC5ubylcbmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKVxubG9vcC5kb3duIDwtIGxvb3AuYWxsICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmZfZFRBR19ETVNPIDwgLTAuMikgJT4lIGRwbHlyOjphcnJhbmdlKGRpZmZfZFRBR19ETVNPKSAlPiUgc2xpY2VfaGVhZChuID0gbG9vcE51bSlcbmxvb3AuZG93bi5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxuXG4jIyMjIEltcG9ydGluZyBsb29wcyBvZiB0YXJnZXRcbnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxBVEFDX2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDIgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXENUQ0ZcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcRVNSUkJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEVTUlJCX05DQlxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxFU1JSQl9wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxLTEY0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDggPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE5BTk9HX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA5IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxOQU5PR19wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE9DVDRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE9DVDRfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDEyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X3BmYVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU01DMVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxNCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU09YMl9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNPWDJfcGZhXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDE3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxUQlBcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG5cblxuXG5cbmRhdGEgPC0gYmluZF9yb3dzKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSxcbiAgICAgICAgIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsXG4gICAgICAgICB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2ICx0ZW1wMTcpXG5cbiMgVmlzdWFsaXphdGlvblxubGlicmFyeShjaXJjbGl6ZSlcblxuaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiVcbnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxucHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JVxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDUpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5IZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLFxuICAgICAgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4sXG4gICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzXG4gICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkge1xuICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal1cbiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsIFxcbi5zLlxcLCBzcHJpbnRmKFxcJS4yZVxcLCBwdmFsKSlcbiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSlcbiAgICAgICAgfSxcbiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0XG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY29sdW1uX3RpdGxlID0gXFxJbnRlcmVzdFxcLFxuICAgICAgICByb3dfdGl0bGUgPSBcXFRhcmdldFxcLFxuICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIsIDMsIDQsIDUpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoXFwwXFwsIFxcMVxcLCBcXDJcXCwgXFwzXFwsIFxcNFxcLCBcXDVcXCkpKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
#### Importing loops of interest
interestName <- \allLoop\
# BACKGROUND loop
background <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all.bedpe\))
background.gr <- (extractAnchor(background))
# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.up.gr <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\))
loop.no.gr <- (extractAnchor(loop.no))
# DOWN loop
loopNum <- nrow(loop.no)
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\))
loop.down <- loop.all %>% dplyr::filter(diff_dTAG_DMSO < -0.2) %>% dplyr::arrange(diff_dTAG_DMSO) %>% slice_head(n = loopNum)
loop.down.gr <- (extractAnchor(loop.down))

#### Importing loops of target
temp1 <- runFisherExactCombinationTarget(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTarget(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTarget(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTarget(\ESRRB_NCB\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTarget(\ESRRB_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTarget(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTarget(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTarget(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTarget(\NANOG_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTarget(\OCT4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp11 <- runFisherExactCombinationTarget(\OCT4_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp12 <- runFisherExactCombinationTarget(\OCT4_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp13 <- runFisherExactCombinationTarget(\SMC1\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp14 <- runFisherExactCombinationTarget(\SOX2_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp15 <- runFisherExactCombinationTarget(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp16 <- runFisherExactCombinationTarget(\SOX2_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp17 <- runFisherExactCombinationTarget(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10,
         temp11, temp12, temp13, temp14, temp15, temp16 ,temp17)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 5), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3, 4, 5), 
                                    labels = c(\0\, \1\, \2\, \3\, \4\, \5\)))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeUJKYlhCdmNuUnBibWNnYkc5dmNITWdiMllnYVc1MFpYSmxjM1JjYm1sdWRHVnlaWE4wVG1GdFpTQThMU0JjWEdGc2JFeHZiM0JjWEZ4dUl5QkNRVU5MUjFKUFZVNUVJR3h2YjNCY2JtSmhZMnRuY205MWJtUWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjloYkd3dVltVmtjR1ZjWENrcFhHNWlZV05yWjNKdmRXNWtMbWR5SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0dKaFkydG5jbTkxYm1RcEtWeHVJeUJWVUNCc2IyOXdYRzVzYjI5d0xuVndJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmWVd4c1gyUlVRVWQyYzBSTlUwOWZWVkJmWkdsbVpqQXVNaTVpWldSd1pWeGNLU2xjYm14dmIzQXVkWEF1WjNJZ1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzUxY0NrcFhHNGpJRTVQSUd4dmIzQmNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjloYkd4ZlpGUkJSM1p6UkUxVFQxOU9UMTlrYVdabU1DNHlMbUpsWkhCbFhGd3BLVnh1Ykc5dmNDNXVieTVuY2lBOExTQW9aWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbTV2S1NsY2JpTWdSRTlYVGlCc2IyOXdYRzVzYjI5d1RuVnRJRHd0SUc1eWIzY29iRzl2Y0M1dWJ5bGNibXh2YjNBdVlXeHNJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGt1ZEhOMlhGd3BLVnh1Ykc5dmNDNWtiM2R1SUR3dElHeHZiM0F1WVd4c0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHUnBabVpmWkZSQlIxOUVUVk5QSUR3Z0xUQXVNaWtnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dScFptWmZaRlJCUjE5RVRWTlBLU0FsUGlVZ2MyeHBZMlZmYUdWaFpDaHVJRDBnYkc5dmNFNTFiU2xjYm14dmIzQXVaRzkzYmk1bmNpQThMU0FvWlhoMGNtRmpkRUZ1WTJodmNpaHNiMjl3TG1SdmQyNHBLVnh1WEc0akl5TWpJRWx0Y0c5eWRHbHVaeUJzYjI5d2N5QnZaaUIwWVhKblpYUmNiblJsYlhBeElEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hGeEJWRUZEWDJWbVptbGxYRndzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5S1Z4dWRHVnRjRElnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkQ2hjWEVOVVEwWmNYQ3dnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdNeUE4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRnhjUlZOU1VrSmZaSE5uWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RRZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hFVlRVbEpDWDA1RFFseGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTFJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YRnhGVTFKU1FsOXdabUZjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TmlBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z4Y1NETkxNamRoWTE5bFptWnBaVnhjTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEEzSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWEZ4TFRFWTBYMlZtWm1sbFhGd3NJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNEZ2dQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNYRTVCVGs5SFgyUnpaMXhjTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEE1SUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWEZ4T1FVNVBSMTl3Wm1GY1hDd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01UQWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNYRTlEVkRSZlpXWm1hV1ZjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TVRFZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hFOURWRFJmWkhOblhGd3NJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNERXlJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YRnhQUTFRMFgzQm1ZVnhjTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEF4TXlBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z4Y1UwMURNVnhjTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEF4TkNBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z4Y1UwOVlNbDlsWm1acFpWeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXhOU0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRnhjVTA5WU1sOWtjMmRjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TVRZZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hGTlBXREpmY0daaFhGd3NJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNERTNJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YRnhVUWxCY1hDd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzVjYmx4dVhHNWNibVJoZEdFZ1BDMGdZbWx1WkY5eWIzZHpLSFJsYlhBeExDQjBaVzF3TWl3Z2RHVnRjRE1zSUhSbGJYQTBMQ0IwWlcxd05TeGNiaUFnSUNBZ0lDQWdJSFJsYlhBMkxDQjBaVzF3Tnl3Z2RHVnRjRGdzSUhSbGJYQTVMQ0IwWlcxd01UQXNYRzRnSUNBZ0lDQWdJQ0IwWlcxd01URXNJSFJsYlhBeE1pd2dkR1Z0Y0RFekxDQjBaVzF3TVRRc0lIUmxiWEF4TlN3Z2RHVnRjREUySUN4MFpXMXdNVGNwWEc1Y2JpTWdWbWx6ZFdGc2FYcGhkR2x2Ymx4dWJHbGljbUZ5ZVNoamFYSmpiR2w2WlNsY2JseHVhR1ZoZEcxaGNGOWtZWFJoSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0JwYm5SbGNtVnpkQ3dnYjJSa2MxSmhkR2x2S1NBbFBpVmNibkJwZG05MFgzZHBaR1Z5S0c1aGJXVnpYMlp5YjIwZ1BTQnBiblJsY21WemRDd2dkbUZzZFdWelgyWnliMjBnUFNCdlpHUnpVbUYwYVc4cElDVStKVnh1SUNCamIyeDFiVzVmZEc5ZmNtOTNibUZ0WlhNb2RtRnlJRDBnWEZ4MFlYSm5aWFJjWENsY2JseHVjSFpoYkhWbFgyUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJR2x1ZEdWeVpYTjBMQ0J3ZG1Gc2RXVXBJQ1UrSlZ4dUlDQndhWFp2ZEY5M2FXUmxjaWh1WVcxbGMxOW1jbTl0SUQwZ2FXNTBaWEpsYzNRc0lIWmhiSFZsYzE5bWNtOXRJRDBnY0haaGJIVmxLU0FsUGlWY2JpQWdZMjlzZFcxdVgzUnZYM0p2ZDI1aGJXVnpLSFpoY2lBOUlGeGNkR0Z5WjJWMFhGd3BYRzVjYm1OdmJGOW1kVzRnUEMwZ1kyOXNiM0pTWVcxd01paGpLREFzSURFc0lEVXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpLRnhjWW14MVpWeGNMQ0JjWEhkb2FYUmxYRndzSUZ4Y2NtVmtYRndwS1Z4dVhHNUlaV0YwYldGd0tHRnpMbTFoZEhKcGVDaG9aV0YwYldGd1gyUmhkR0VwTEZ4dUlDQWdJQ0FnSUNCdVlXMWxJRDBnWEZ4UFpHUnpJRkpoZEdsdlhGd3NYRzRnSUNBZ0lDQWdJR052YkNBOUlHTnZiRjltZFc0c1hHNGdJQ0FnSUNBZ0lDTWdRV1JrSUdGdWJtOTBZWFJwYjI0Z1ptOXlJSEF0ZG1Gc2RXVnpYRzRnSUNBZ0lDQWdJR05sYkd4ZlpuVnVJRDBnWm5WdVkzUnBiMjRvYWl3Z2FTd2dlQ3dnZVN3Z2QybGtkR2dzSUdobGFXZG9kQ3dnWm1sc2JDa2dlMXh1SUNBZ0lDQWdJQ0FnSUhCMllXd2dQQzBnY0haaGJIVmxYMlJoZEdGYmFTd2dhbDFjYmlBZ0lDQWdJQ0FnSUNCc1lXSmxiQ0E4TFNCcFptVnNjMlVvY0haaGJDQStJREF1TURVc0lGeGNiaTV6TGx4Y0xDQnpjSEpwYm5SbUtGeGNKUzR5WlZ4Y0xDQndkbUZzS1NsY2JpQWdJQ0FnSUNBZ0lDQm5jbWxrTG5SbGVIUW9iR0ZpWld3c0lIZ3NJSGtzSUdkd0lEMGdaM0JoY2lobWIyNTBjMmw2WlNBOUlERXdLU2xjYmlBZ0lDQWdJQ0FnZlN4Y2JpQWdJQ0FnSUNBZ0l5QkRkWE4wYjIxcGVtVWdkR2hsSUdobFlYUnRZWEFnYkdGNWIzVjBYRzRnSUNBZ0lDQWdJR05zZFhOMFpYSmZjbTkzY3lBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5WDJOdmJIVnRibk1nUFNCR1FVeFRSU3hjYmlBZ0lDQWdJQ0FnWTI5c2RXMXVYM1JwZEd4bElEMGdYRnhKYm5SbGNtVnpkRnhjTEZ4dUlDQWdJQ0FnSUNCeWIzZGZkR2wwYkdVZ1BTQmNYRlJoY21kbGRGeGNMRnh1SUNBZ0lDQWdJQ0JvWldGMGJXRndYMnhsWjJWdVpGOXdZWEpoYlNBOUlHeHBjM1FvWVhRZ1BTQmpLREFzSURFc0lESXNJRE1zSURRc0lEVXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4aFltVnNjeUE5SUdNb1hGd3dYRndzSUZ4Y01WeGNMQ0JjWERKY1hDd2dYRnd6WEZ3c0lGeGNORnhjTENCY1hEVmNYQ2twS1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIGludGVyZXN0XG5pbnRlcmVzdE5hbWUgPC0gXFxhbGxMb29wXFxcbiMgQkFDS0dST1VORCBsb29wXG5iYWNrZ3JvdW5kIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsLmJlZHBlXFwpKVxuYmFja2dyb3VuZC5nciA8LSAoZXh0cmFjdEFuY2hvcihiYWNrZ3JvdW5kKSlcbiMgVVAgbG9vcFxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLnVwLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxuIyBOTyBsb29wXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3Aubm8uZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpXG4jIERPV04gbG9vcFxubG9vcE51bSA8LSBucm93KGxvb3Aubm8pXG5sb29wLmFsbCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5LnRzdlxcKSlcbmxvb3AuZG93biA8LSBsb29wLmFsbCAlPiUgZHBseXI6OmZpbHRlcihkaWZmX2RUQUdfRE1TTyA8IC0wLjIpICU+JSBkcGx5cjo6YXJyYW5nZShkaWZmX2RUQUdfRE1TTykgJT4lIHNsaWNlX2hlYWQobiA9IGxvb3BOdW0pXG5sb29wLmRvd24uZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSlcblxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgdGFyZ2V0XG50ZW1wMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcQVRBQ19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxDVENGXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEVTUlJCX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxFU1JSQl9OQ0JcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcRVNSUkJfcGZhXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEgzSzI3YWNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcS0xGNF9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxOQU5PR19kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcTkFOT0dfcGZhXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDEwIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDExIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcT0NUNF9wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNNQzFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNPWDJfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNPWDJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDE2IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxTT1gyX3BmYVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcVEJQXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxuXG5cblxuXG5kYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsXG4gICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLFxuICAgICAgICAgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiAsdGVtcDE3KVxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCA1KSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIGNvbHVtbl90aXRsZSA9IFxcSW50ZXJlc3RcXCxcbiAgICAgICAgcm93X3RpdGxlID0gXFxUYXJnZXRcXCxcbiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGF0ID0gYygwLCAxLCAyLCAzLCA0LCA1KSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKFxcMFxcLCBcXDFcXCwgXFwyXFwsIFxcM1xcLCBcXDRcXCwgXFw1XFwpKSlcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgaW50ZXJlc3RcbmludGVyZXN0TmFtZSA8LSBcXGFsbExvb3BcXFxuIyBCQUNLR1JPVU5EIGxvb3BcbmJhY2tncm91bmQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGwuYmVkcGVcXCkpXG5iYWNrZ3JvdW5kLmdyIDwtIChleHRyYWN0QW5jaG9yKGJhY2tncm91bmQpKVxuIyBVUCBsb29wXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3AudXAuZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG4jIE5PIGxvb3Bcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5uby5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbiMgRE9XTiBsb29wXG5sb29wTnVtIDwtIG5yb3cobG9vcC5ubylcbmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKVxubG9vcC5kb3duIDwtIGxvb3AuYWxsICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmZfZFRBR19ETVNPIDwgLTAuMikgJT4lIGRwbHlyOjphcnJhbmdlKGRpZmZfZFRBR19ETVNPKSAlPiUgc2xpY2VfaGVhZChuID0gbG9vcE51bSlcbmxvb3AuZG93bi5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxuXG4jIyMjIEltcG9ydGluZyBsb29wcyBvZiB0YXJnZXRcbnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxBVEFDX2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDIgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXENUQ0ZcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcRVNSUkJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEVTUlJCX05DQlxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxFU1JSQl9wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxLTEY0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDggPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE5BTk9HX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA5IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxOQU5PR19wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE9DVDRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE9DVDRfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDEyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X3BmYVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU01DMVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxNCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU09YMl9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNPWDJfcGZhXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDE3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxUQlBcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG5cblxuXG5cbmRhdGEgPC0gYmluZF9yb3dzKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSxcbiAgICAgICAgIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsXG4gICAgICAgICB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2ICx0ZW1wMTcpXG5cbiMgVmlzdWFsaXphdGlvblxubGlicmFyeShjaXJjbGl6ZSlcblxuaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiVcbnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxucHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JVxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDUpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5IZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLFxuICAgICAgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4sXG4gICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzXG4gICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkge1xuICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal1cbiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsIFxcbi5zLlxcLCBzcHJpbnRmKFxcJS4yZVxcLCBwdmFsKSlcbiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSlcbiAgICAgICAgfSxcbiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0XG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY29sdW1uX3RpdGxlID0gXFxJbnRlcmVzdFxcLFxuICAgICAgICByb3dfdGl0bGUgPSBcXFRhcmdldFxcLFxuICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIsIDMsIDQsIDUpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoXFwwXFwsIFxcMVxcLCBcXDJcXCwgXFwzXFwsIFxcNFxcLCBcXDVcXCkpKVxuYGBgXG5gYGAifQ== -->

```r
```r
#### Importing loops of interest
interestName <- \allLoop\
# BACKGROUND loop
background <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all.bedpe\))
background.gr <- (extractAnchor(background))
# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.up.gr <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\))
loop.no.gr <- (extractAnchor(loop.no))
# DOWN loop
loopNum <- nrow(loop.no)
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\))
loop.down <- loop.all %>% dplyr::filter(diff_dTAG_DMSO < -0.2) %>% dplyr::arrange(diff_dTAG_DMSO) %>% slice_head(n = loopNum)
loop.down.gr <- (extractAnchor(loop.down))

#### Importing loops of target
temp1 <- runFisherExactCombinationTarget(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTarget(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTarget(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTarget(\ESRRB_NCB\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTarget(\ESRRB_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTarget(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTarget(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTarget(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTarget(\NANOG_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTarget(\OCT4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp11 <- runFisherExactCombinationTarget(\OCT4_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp12 <- runFisherExactCombinationTarget(\OCT4_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp13 <- runFisherExactCombinationTarget(\SMC1\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp14 <- runFisherExactCombinationTarget(\SOX2_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp15 <- runFisherExactCombinationTarget(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp16 <- runFisherExactCombinationTarget(\SOX2_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp17 <- runFisherExactCombinationTarget(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10,
         temp11, temp12, temp13, temp14, temp15, temp16 ,temp17)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 5), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3, 4, 5), 
                                    labels = c(\0\, \1\, \2\, \3\, \4\, \5\)))
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


## [2.24] Checking bookmarking
(1) Checking whether subset of regulatory loop have bookmarking
(2) Checking whether loops related to genes have bookmarking
H3K27ac_effie
ATAC_effie
TBP
Oct4_effie, Oct4_dsg
Sox2_effie, Sox2_dsg
Esrrb_dsg
Klf4_effie
CTCF
##### Functions

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzVjYmlNakl5TWdTVzF3YjNKMGFXNW5JR3h2YjNCeklHOW1JSFJoY21kbGRGeHVkR1Z0Y0RFZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY0lrRlVRVU5mWldabWFXVmNJaXdnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdNaUE4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRndpUTFSRFJsd2lMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXpJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YQ0pGVTFKU1FsOWtjMmRjSWl3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TkNBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z3aVNETkxNamRoWTE5bFptWnBaVndpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEExSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWENKTFRFWTBYMlZtWm1sbFhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNEWWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJazVCVGs5SFgyUnpaMXdpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEEzSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWENKUFExUTBYMlJ6WjF3aUxDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBNElEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hDSlRUVU14WENJc0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3T1NBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z3aVUwOVlNbDlrYzJkY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01UQWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJbFJDVUZ3aUxDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNibHh1WEc1Y2JseHVaR0YwWVNBOExTQmlhVzVrWDNKdmQzTW9kR1Z0Y0RFc0lIUmxiWEF5TENCMFpXMXdNeXdnZEdWdGNEUXNJSFJsYlhBMUxGeHVJQ0FnSUNBZ0lDQWdkR1Z0Y0RZc0lIUmxiWEEzTENCMFpXMXdPQ3dnZEdWdGNEa3NJSFJsYlhBeE1DbGNibHh1SXlCV2FYTjFZV3hwZW1GMGFXOXVYRzVzYVdKeVlYSjVLR05wY21Oc2FYcGxLVnh1WEc1b1pXRjBiV0Z3WDJSaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHbHVkR1Z5WlhOMExDQnZaR1J6VW1GMGFXOHBJQ1UrSlZ4dWNHbDJiM1JmZDJsa1pYSW9ibUZ0WlhOZlpuSnZiU0E5SUdsdWRHVnlaWE4wTENCMllXeDFaWE5mWm5KdmJTQTlJRzlrWkhOU1lYUnBieWtnSlQ0bFhHNGdJR052YkhWdGJsOTBiMTl5YjNkdVlXMWxjeWgyWVhJZ1BTQmNJblJoY21kbGRGd2lLVnh1WEc1d2RtRnNkV1ZmWkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2FXNTBaWEpsYzNRc0lIQjJZV3gxWlNrZ0pUNGxYRzRnSUhCcGRtOTBYM2RwWkdWeUtHNWhiV1Z6WDJaeWIyMGdQU0JwYm5SbGNtVnpkQ3dnZG1Gc2RXVnpYMlp5YjIwZ1BTQndkbUZzZFdVcElDVStKVnh1SUNCamIyeDFiVzVmZEc5ZmNtOTNibUZ0WlhNb2RtRnlJRDBnWENKMFlYSm5aWFJjSWlsY2JseHVZMjlzWDJaMWJpQThMU0JqYjJ4dmNsSmhiWEF5S0dNb01Dd2dNU3dnTXlrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdNb1hDSmliSFZsWENJc0lGd2lkMmhwZEdWY0lpd2dYQ0p5WldSY0lpa3BYRzVjYmtobFlYUnRZWEFvWVhNdWJXRjBjbWw0S0dobFlYUnRZWEJmWkdGMFlTa3NYRzRnSUNBZ0lDQWdJRzVoYldVZ1BTQmNJazlrWkhNZ1VtRjBhVzljSWl4Y2JpQWdJQ0FnSUNBZ1kyOXNJRDBnWTI5c1gyWjFiaXhjYmlBZ0lDQWdJQ0FnSXlCQlpHUWdZVzV1YjNSaGRHbHZiaUJtYjNJZ2NDMTJZV3gxWlhOY2JpQWdJQ0FnSUNBZ1kyVnNiRjltZFc0Z1BTQm1kVzVqZEdsdmJpaHFMQ0JwTENCNExDQjVMQ0IzYVdSMGFDd2dhR1ZwWjJoMExDQm1hV3hzS1NCN1hHNGdJQ0FnSUNBZ0lDQWdjSFpoYkNBOExTQndkbUZzZFdWZlpHRjBZVnRwTENCcVhWeHVJQ0FnSUNBZ0lDQWdJR3hoWW1Wc0lEd3RJR2xtWld4elpTaHdkbUZzSUQ0Z01DNHdOU3dnWENKdUxuTXVYQ0lzSUhOd2NtbHVkR1lvWENJbExqSmxYQ0lzSUhCMllXd3BLVnh1SUNBZ0lDQWdJQ0FnSUdkeWFXUXVkR1Y0ZENoc1lXSmxiQ3dnZUN3Z2VTd2daM0FnUFNCbmNHRnlLR1p2Ym5SemFYcGxJRDBnTVRBcEtWeHVJQ0FnSUNBZ0lDQjlMRnh1SUNBZ0lDQWdJQ0FqSUVOMWMzUnZiV2w2WlNCMGFHVWdhR1ZoZEcxaGNDQnNZWGx2ZFhSY2JpQWdJQ0FnSUNBZ1kyeDFjM1JsY2w5eWIzZHpJRDBnVkZKVlJTeGNiaUFnSUNBZ0lDQWdjMmh2ZDE5eWIzZGZaR1Z1WkNBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5WDJOdmJIVnRibk1nUFNCR1FVeFRSU3hjYmlBZ0lDQWdJQ0FnWTI5c2RXMXVYM1JwZEd4bElEMGdYQ0pKYm5SbGNtVnpkRndpTEZ4dUlDQWdJQ0FnSUNCeWIzZGZkR2wwYkdVZ1BTQmNJbFJoY21kbGRGd2lMRnh1SUNBZ0lDQWdJQ0JvWldGMGJXRndYMnhsWjJWdVpGOXdZWEpoYlNBOUlHeHBjM1FvWVhRZ1BTQmpLREFzSURFc0lESXNJRE1wTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeGhZbVZzY3lBOUlHTW9YQ0l3WENJc0lGd2lNVndpTENCY0lqSmNJaXdnWENJelhDSXBLU2xjYmx4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5cblxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgdGFyZ2V0XG50ZW1wMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcQVRBQ19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxDVENGXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEVTUlJCX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxIM0syN2FjX2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEtMRjRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcTkFOT0dfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDcgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE9DVDRfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDggPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNNQzFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA5IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxTT1gyX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcVEJQXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxuXG5cblxuXG5kYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsXG4gICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwKVxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAzKSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjb2x1bW5fdGl0bGUgPSBcXEludGVyZXN0XFwsXG4gICAgICAgIHJvd190aXRsZSA9IFxcVGFyZ2V0XFwsXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcLCBcXDNcXCkpKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


#### Importing loops of target
temp1 <- runFisherExactCombinationTarget(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTarget(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTarget(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTarget(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTarget(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTarget(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTarget(\OCT4_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTarget(\SMC1\, interestName,
                                     loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTarget(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTarget(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 3), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3), 
                                    labels = c(\0\, \1\, \2\, \3\)))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNWNiaU1qSXlNZ1NXMXdiM0owYVc1bklHeHZiM0J6SUc5bUlIUmhjbWRsZEZ4dWRHVnRjREVnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkQ2hjWEVGVVFVTmZaV1ptYVdWY1hDd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01pQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMEtGeGNRMVJEUmx4Y0xDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBeklEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hGeEZVMUpTUWw5a2MyZGNYQ3dnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdOQ0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRnhjU0ROTE1qZGhZMTlsWm1acFpWeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTFJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YRnhMVEVZMFgyVm1abWxsWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RZZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hFNUJUazlIWDJSeloxeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTNJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YRnhQUTFRMFgyUnpaMXhjTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEE0SUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWEZ4VFRVTXhYRndzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdPU0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRnhjVTA5WU1sOWtjMmRjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TVRBZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hGUkNVRnhjTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JseHVYRzVjYmx4dVpHRjBZU0E4TFNCaWFXNWtYM0p2ZDNNb2RHVnRjREVzSUhSbGJYQXlMQ0IwWlcxd015d2dkR1Z0Y0RRc0lIUmxiWEExTEZ4dUlDQWdJQ0FnSUNBZ2RHVnRjRFlzSUhSbGJYQTNMQ0IwWlcxd09Dd2dkR1Z0Y0Rrc0lIUmxiWEF4TUNsY2JseHVJeUJXYVhOMVlXeHBlbUYwYVc5dVhHNXNhV0p5WVhKNUtHTnBjbU5zYVhwbEtWeHVYRzVvWldGMGJXRndYMlJoZEdFZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUdsdWRHVnlaWE4wTENCdlpHUnpVbUYwYVc4cElDVStKVnh1Y0dsMmIzUmZkMmxrWlhJb2JtRnRaWE5mWm5KdmJTQTlJR2x1ZEdWeVpYTjBMQ0IyWVd4MVpYTmZabkp2YlNBOUlHOWtaSE5TWVhScGJ5a2dKVDRsWEc0Z0lHTnZiSFZ0Ymw5MGIxOXliM2R1WVcxbGN5aDJZWElnUFNCY1hIUmhjbWRsZEZ4Y0tWeHVYRzV3ZG1Gc2RXVmZaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYVc1MFpYSmxjM1FzSUhCMllXeDFaU2tnSlQ0bFhHNGdJSEJwZG05MFgzZHBaR1Z5S0c1aGJXVnpYMlp5YjIwZ1BTQnBiblJsY21WemRDd2dkbUZzZFdWelgyWnliMjBnUFNCd2RtRnNkV1VwSUNVK0pWeHVJQ0JqYjJ4MWJXNWZkRzlmY205M2JtRnRaWE1vZG1GeUlEMGdYRngwWVhKblpYUmNYQ2xjYmx4dVkyOXNYMloxYmlBOExTQmpiMnh2Y2xKaGJYQXlLR01vTUN3Z01Td2dNeWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR01vWEZ4aWJIVmxYRndzSUZ4Y2QyaHBkR1ZjWEN3Z1hGeHlaV1JjWENrcFhHNWNia2hsWVhSdFlYQW9ZWE11YldGMGNtbDRLR2hsWVhSdFlYQmZaR0YwWVNrc1hHNGdJQ0FnSUNBZ0lHNWhiV1VnUFNCY1hFOWtaSE1nVW1GMGFXOWNYQ3hjYmlBZ0lDQWdJQ0FnWTI5c0lEMGdZMjlzWDJaMWJpeGNiaUFnSUNBZ0lDQWdJeUJCWkdRZ1lXNXViM1JoZEdsdmJpQm1iM0lnY0MxMllXeDFaWE5jYmlBZ0lDQWdJQ0FnWTJWc2JGOW1kVzRnUFNCbWRXNWpkR2x2YmlocUxDQnBMQ0I0TENCNUxDQjNhV1IwYUN3Z2FHVnBaMmgwTENCbWFXeHNLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2NIWmhiQ0E4TFNCd2RtRnNkV1ZmWkdGMFlWdHBMQ0JxWFZ4dUlDQWdJQ0FnSUNBZ0lHeGhZbVZzSUR3dElHbG1aV3h6WlNod2RtRnNJRDRnTUM0d05Td2dYRnh1TG5NdVhGd3NJSE53Y21sdWRHWW9YRndsTGpKbFhGd3NJSEIyWVd3cEtWeHVJQ0FnSUNBZ0lDQWdJR2R5YVdRdWRHVjRkQ2hzWVdKbGJDd2dlQ3dnZVN3Z1ozQWdQU0JuY0dGeUtHWnZiblJ6YVhwbElEMGdNVEFwS1Z4dUlDQWdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ0lDQWpJRU4xYzNSdmJXbDZaU0IwYUdVZ2FHVmhkRzFoY0NCc1lYbHZkWFJjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjbDl5YjNkeklEMGdWRkpWUlN4Y2JpQWdJQ0FnSUNBZ2MyaHZkMTl5YjNkZlpHVnVaQ0E5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JqYkhWemRHVnlYMk52YkhWdGJuTWdQU0JHUVV4VFJTeGNiaUFnSUNBZ0lDQWdZMjlzZFcxdVgzUnBkR3hsSUQwZ1hGeEpiblJsY21WemRGeGNMRnh1SUNBZ0lDQWdJQ0J5YjNkZmRHbDBiR1VnUFNCY1hGUmhjbWRsZEZ4Y0xGeHVJQ0FnSUNBZ0lDQm9aV0YwYldGd1gyeGxaMlZ1WkY5d1lYSmhiU0E5SUd4cGMzUW9ZWFFnUFNCaktEQXNJREVzSURJc0lETXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4aFltVnNjeUE5SUdNb1hGd3dYRndzSUZ4Y01WeGNMQ0JjWERKY1hDd2dYRnd6WEZ3cEtTbGNibHh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuXG5cbiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIHRhcmdldFxudGVtcDEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEFUQUNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcQ1RDRlxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAzIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxFU1JSQl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxLTEY0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE5BTk9HX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxTTUMxXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFRCUFxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcblxuXG5cblxuZGF0YSA8LSBiaW5kX3Jvd3ModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LFxuICAgICAgICAgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMClcblxuIyBWaXN1YWxpemF0aW9uXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksXG4gICAgICAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCxcbiAgICAgICAgY29sID0gY29sX2Z1bixcbiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXNcbiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7XG4gICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXVxuICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgXFxuLnMuXFwsIHNwcmludGYoXFwlLjJlXFwsIHB2YWwpKVxuICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKVxuICAgICAgICB9LFxuICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXRcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY29sdW1uX3RpdGxlID0gXFxJbnRlcmVzdFxcLFxuICAgICAgICByb3dfdGl0bGUgPSBcXFRhcmdldFxcLFxuICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIsIDMpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoXFwwXFwsIFxcMVxcLCBcXDJcXCwgXFwzXFwpKSlcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5cbiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIHRhcmdldFxudGVtcDEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEFUQUNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcQ1RDRlxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAzIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxFU1JSQl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxLTEY0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE5BTk9HX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxTTUMxXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFRCUFxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcblxuXG5cblxuZGF0YSA8LSBiaW5kX3Jvd3ModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LFxuICAgICAgICAgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMClcblxuIyBWaXN1YWxpemF0aW9uXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksXG4gICAgICAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCxcbiAgICAgICAgY29sID0gY29sX2Z1bixcbiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXNcbiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7XG4gICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXVxuICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgXFxuLnMuXFwsIHNwcmludGYoXFwlLjJlXFwsIHB2YWwpKVxuICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKVxuICAgICAgICB9LFxuICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXRcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY29sdW1uX3RpdGxlID0gXFxJbnRlcmVzdFxcLFxuICAgICAgICByb3dfdGl0bGUgPSBcXFRhcmdldFxcLFxuICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIsIDMpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoXFwwXFwsIFxcMVxcLCBcXDJcXCwgXFwzXFwpKSlcblxuYGBgXG5gYGAifQ== -->

```r
```r


#### Importing loops of target
temp1 <- runFisherExactCombinationTarget(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTarget(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTarget(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTarget(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTarget(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTarget(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTarget(\OCT4_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTarget(\SMC1\, interestName,
                                     loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTarget(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTarget(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 3), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3), 
                                    labels = c(\0\, \1\, \2\, \3\)))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### All loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlCSmJYQnZjblJwYm1jZ2JHOXZjSE1nYjJZZ2FXNTBaWEpsYzNSY2JtbHVkR1Z5WlhOMFRtRnRaU0E4TFNCY0luSmxaMHh2YjNCY0lseHVJeUJDUVVOTFIxSlBWVTVFSUd4dmIzQmNibUpoWTJ0bmNtOTFibVFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaUzVpWldSd1pWd2lLU2xjYm1KaFkydG5jbTkxYm1RdVozSWdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9ZbUZqYTJkeWIzVnVaQ2twWEc0aklGVlFJR3h2YjNCY2JteHZiM0F1ZFhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5a1ZFRkhkbk5FVFZOUFgxVlFYMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BYRzVzYjI5d0xuVndMbWR5SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVkWEFwS1Z4dUl5Qk9UeUJzYjI5d1hHNXNiMjl3TG01dklEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjR1V0Y0dWZlpGUkJSM1p6UkUxVFQxOU9UMTlrYVdabU1DNHlMbUpsWkhCbFhDSXBLVnh1Ykc5dmNDNXVieTVuY2lBOExTQW9aWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbTV2S1NsY2JpTWdWVkJPVHlCc2IyOXdYRzVzYjI5d0xuVndibThnUEMwZ1ltbHVaRjl5YjNkektHeHZiM0F1ZFhBc0lHeHZiM0F1Ym04cFhHNXNiMjl3TG5Wd2JtOHVaM0lnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xuVndibThwWEc0aklFUlBWMDRnYkc5dmNGeHViRzl2Y0M1a2IzZHVJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZaRlJCUjNaelJFMVRUMTlFVDFkT1gyUnBabVl3TGpJdVltVmtjR1ZjSWlrcFhHNXNiMjl3TG1SdmQyNHVaM0lnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWtiM2R1S1NsY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG4jIyMjIEltcG9ydGluZyBsb29wcyBvZiBpbnRlcmVzdFxuaW50ZXJlc3ROYW1lIDwtIFxccmVnTG9vcFxcXG4jIEJBQ0tHUk9VTkQgbG9vcFxuYmFja2dyb3VuZCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlXFwpKVxuYmFja2dyb3VuZC5nciA8LSAoZXh0cmFjdEFuY2hvcihiYWNrZ3JvdW5kKSlcbiMgVVAgbG9vcFxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3AudXAuZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG4jIE5PIGxvb3Bcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxuIyBVUE5PIGxvb3Bcbmxvb3AudXBubyA8LSBiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubylcbmxvb3AudXBuby5nciA8LSBleHRyYWN0QW5jaG9yKGxvb3AudXBubylcbiMgRE9XTiBsb29wXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3AuZG93bi5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
#### Importing loops of interest
interestName <- \regLoop\
# BACKGROUND loop
background <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\))
background.gr <- (extractAnchor(background))
# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.up.gr <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
loop.no.gr <- (extractAnchor(loop.no))
# UPNO loop
loop.upno <- bind_rows(loop.up, loop.no)
loop.upno.gr <- extractAnchor(loop.upno)
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
loop.down.gr <- (extractAnchor(loop.down))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeUJKYlhCdmNuUnBibWNnYkc5dmNITWdiMllnYVc1MFpYSmxjM1JjYm1sdWRHVnlaWE4wVG1GdFpTQThMU0JjWEhKbFoweHZiM0JjWEZ4dUl5QkNRVU5MUjFKUFZVNUVJR3h2YjNCY2JtSmhZMnRuY205MWJtUWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pTNWlaV1J3WlZ4Y0tTbGNibUpoWTJ0bmNtOTFibVF1WjNJZ1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb1ltRmphMmR5YjNWdVpDa3BYRzRqSUZWUUlHeHZiM0JjYm14dmIzQXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlrVkVGSGRuTkVUVk5QWDFWUVgyUnBabVl3TGpJdVltVmtjR1ZjWENrcFhHNXNiMjl3TG5Wd0xtZHlJRHd0SUNobGVIUnlZV04wUVc1amFHOXlLR3h2YjNBdWRYQXBLVnh1SXlCT1R5QnNiMjl3WEc1c2IyOXdMbTV2SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZmNHVXRjR1ZmWkZSQlIzWnpSRTFUVDE5T1QxOWthV1ptTUM0eUxtSmxaSEJsWEZ3cEtWeHViRzl2Y0M1dWJ5NW5jaUE4TFNBb1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtNXZLU2xjYmlNZ1ZWQk9UeUJzYjI5d1hHNXNiMjl3TG5Wd2JtOGdQQzBnWW1sdVpGOXliM2R6S0d4dmIzQXVkWEFzSUd4dmIzQXVibThwWEc1c2IyOXdMblZ3Ym04dVozSWdQQzBnWlhoMGNtRmpkRUZ1WTJodmNpaHNiMjl3TG5Wd2JtOHBYRzRqSUVSUFYwNGdiRzl2Y0Z4dWJHOXZjQzVrYjNkdUlEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjR1V0Y0dWZlpGUkJSM1p6UkUxVFQxOUVUMWRPWDJScFptWXdMakl1WW1Wa2NHVmNYQ2twWEc1c2IyOXdMbVJ2ZDI0dVozSWdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1a2IzZHVLU2xjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgaW50ZXJlc3RcbmludGVyZXN0TmFtZSA8LSBcXHJlZ0xvb3BcXFxuIyBCQUNLR1JPVU5EIGxvb3BcbmJhY2tncm91bmQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZS5iZWRwZVxcKSlcbmJhY2tncm91bmQuZ3IgPC0gKGV4dHJhY3RBbmNob3IoYmFja2dyb3VuZCkpXG4jIFVQIGxvb3Bcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLnVwLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxuIyBOTyBsb29wXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5uby5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbiMgVVBOTyBsb29wXG5sb29wLnVwbm8gPC0gYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pXG5sb29wLnVwbm8uZ3IgPC0gZXh0cmFjdEFuY2hvcihsb29wLnVwbm8pXG4jIERPV04gbG9vcFxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLmRvd24uZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSlcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgaW50ZXJlc3RcbmludGVyZXN0TmFtZSA8LSBcXHJlZ0xvb3BcXFxuIyBCQUNLR1JPVU5EIGxvb3BcbmJhY2tncm91bmQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZS5iZWRwZVxcKSlcbmJhY2tncm91bmQuZ3IgPC0gKGV4dHJhY3RBbmNob3IoYmFja2dyb3VuZCkpXG4jIFVQIGxvb3Bcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLnVwLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxuIyBOTyBsb29wXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5uby5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbiMgVVBOTyBsb29wXG5sb29wLnVwbm8gPC0gYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pXG5sb29wLnVwbm8uZ3IgPC0gZXh0cmFjdEFuY2hvcihsb29wLnVwbm8pXG4jIERPV04gbG9vcFxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLmRvd24uZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSlcbmBgYFxuYGBgIn0= -->

```r
```r
#### Importing loops of interest
interestName <- \regLoop\
# BACKGROUND loop
background <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\))
background.gr <- (extractAnchor(background))
# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.up.gr <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
loop.no.gr <- (extractAnchor(loop.no))
# UPNO loop
loop.upno <- bind_rows(loop.up, loop.no)
loop.upno.gr <- extractAnchor(loop.upno)
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
loop.down.gr <- (extractAnchor(loop.down))
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### All loops refined

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR0Z5WjJWMFRtRnRaU0E4TFNCY0lrZ3pTekkzWVdOZlpXWm1hV1ZjSWx4dUl5QlNSVlJCU1U1RlJDQnNiMjl3WEc1eVpYUmhhVzVsWkNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0pVUmw5aWIyOXJiV0Z5YTJsdVoxd2lMQ0IwWVhKblpYUk9ZVzFsTENCY0ltRnRYMkV1WW1Wa1hDSXBLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hqS0RFc0lESXNJRE1wS1Z4dVkyOXNibUZ0WlhNb2NtVjBZV2x1WldRcElEd3RJR01vWENKamFISmNJaXdnWENKemRHRnlkRndpTENCY0ltVnVaRndpS1Z4dWNtVjBZV2x1WldRdVozSWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLSEpsZEdGcGJtVmtLVnh1SXlCTVQxTlVJR3h2YjNCY2JteHZjM1FnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2lWRVpmWW05dmEyMWhjbXRwYm1kY0lpd2dkR0Z5WjJWMFRtRnRaU3dnWENKdllTNWlaV1JjSWlrcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHTW9NU3dnTWl3Z015a3BYRzVqYjJ4dVlXMWxjeWhzYjNOMEtTQThMU0JqS0Z3aVkyaHlYQ0lzSUZ3aWMzUmhjblJjSWl3Z1hDSmxibVJjSWlsY2JteHZjM1F1WjNJZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtHeHZjM1FwWEc1Y2JseHVJeUJUUlVWRVNVNUhYRzUwWlcxd0lEd3RJSEoxYmtacGMyaGxja1Y0WVdOMEtHeHZiM0F1ZFhCdWJ5NW5jaXdnWW1GamEyZHliM1Z1WkM1bmNpd2djbVYwWVdsdVpXUXVaM0lwWEc1eVpYTjFiSFF1ZEdJZ1BDMGdkR2xpWW14bEtHbHVkR1Z5WlhOMElEMGdjR0Z6ZEdVd0tHbHVkR1Z5WlhOMFRtRnRaU3dnWENKZlZWQXZUazljSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJoY21kbGRDQTlJSEJoYzNSbE1DaDBZWEpuWlhST1lXMWxMQ0JjSWw5eVpYUmhhVzVsWkZ3aUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0haaGJIVmxJRDBnZEdWdGNDUndMblpoYkhWbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2WkdSelVtRjBhVzhnUFNCMFpXMXdKR1Z6ZEdsdFlYUmxLVnh1WEc0aklFRkVSRWxPUnlCU1QxZFRYRzUwWlcxd0lEd3RJSEoxYmtacGMyaGxja1Y0WVdOMEtHeHZiM0F1Wkc5M2JpNW5jaXdnWW1GamEyZHliM1Z1WkM1bmNpd2djbVYwWVdsdVpXUXVaM0lwWEc1eVpYTjFiSFF1ZEdJZ1BDMGdjbVZ6ZFd4MExuUmlJQ1UrSlNCY2JpQWdZV1JrWDNKdmR5aHBiblJsY21WemRDQTlJSEJoYzNSbE1DaHBiblJsY21WemRFNWhiV1VzSUZ3aVgwUlBWMDVjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdkR0Z5WjJWMElEMGdjR0Z6ZEdVd0tIUmhjbWRsZEU1aGJXVXNJRndpWDNKbGRHRnBibVZrWENJcExGeHVJQ0FnSUNBZ0lDQWdJSEIyWVd4MVpTQTlJSFJsYlhBa2NDNTJZV3gxWlN4Y2JpQWdJQ0FnSUNBZ0lDQnZaR1J6VW1GMGFXOGdQU0IwWlcxd0pHVnpkR2x0WVhSbEtWeHVYRzRqSUVGRVJFbE9SeUJTVDFkVFhHNTBaVzF3SUR3dElISjFia1pwYzJobGNrVjRZV04wS0d4dmIzQXVkWEJ1Ynk1bmNpd2dZbUZqYTJkeWIzVnVaQzVuY2l3Z2JHOXpkQzVuY2lsY2JuSmxjM1ZzZEM1MFlpQThMU0J5WlhOMWJIUXVkR0lnSlQ0bElGeHVJQ0JoWkdSZmNtOTNLR2x1ZEdWeVpYTjBJRDBnY0dGemRHVXdLR2x1ZEdWeVpYTjBUbUZ0WlN3Z1hDSmZWVkF2VGs5Y0lpa3NYRzRnSUNBZ0lDQWdJQ0FnZEdGeVoyVjBJRDBnY0dGemRHVXdLSFJoY21kbGRFNWhiV1VzSUZ3aVgyeHZjM1JjSWlrc1hHNGdJQ0FnSUNBZ0lDQWdjSFpoYkhWbElEMGdkR1Z0Y0NSd0xuWmhiSFZsTEZ4dUlDQWdJQ0FnSUNBZ0lHOWtaSE5TWVhScGJ5QTlJSFJsYlhBa1pYTjBhVzFoZEdVcFhHNWNiaU1nUVVSRVNVNUhJRkpQVjFOY2JuUmxiWEFnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1FvYkc5dmNDNWtiM2R1TG1keUxDQmlZV05yWjNKdmRXNWtMbWR5TENCc2IzTjBMbWR5S1Z4dWNtVnpkV3gwTG5SaUlEd3RJSEpsYzNWc2RDNTBZaUFsUGlVZ1hHNGdJR0ZrWkY5eWIzY29hVzUwWlhKbGMzUWdQU0J3WVhOMFpUQW9hVzUwWlhKbGMzUk9ZVzFsTENCY0lsOUVUMWRPWENJcExGeHVJQ0FnSUNBZ0lDQWdJSFJoY21kbGRDQTlJSEJoYzNSbE1DaDBZWEpuWlhST1lXMWxMQ0JjSWw5c2IzTjBYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lIQjJZV3gxWlNBOUlIUmxiWEFrY0M1MllXeDFaU3hjYmlBZ0lDQWdJQ0FnSUNCdlpHUnpVbUYwYVc4Z1BTQjBaVzF3SkdWemRHbHRZWFJsS1Z4dVhHNWNibkpsYzNWc2RDNTBZaUE4TFNCeVpYTjFiSFF1ZEdJZ0pUNGxYRzRnSUcxMWRHRjBaU2hwYm5SbGNtVnpkQ0E5SUhKbFkyOWtaU2hwYm5SbGNtVnpkQ3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luSmxaMHh2YjNCZlZWQXZUazljSWlBOUlGd2lWVkF2VGs5Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY21WblRHOXZjRjlFVDFkT1hDSWdQU0JjSWtSUFYwNWNJaWtzWEc0Z0lDQWdJQ0FnSUNCMFlYSm5aWFFnUFNCeVpXTnZaR1VvZEdGeVoyVjBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpU0ROTE1qZGhZMTlsWm1acFpWOXlaWFJoYVc1bFpGd2lJRDBnWENKU1pYUmhhVzVsWkZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lTRE5MTWpkaFkxOWxabVpwWlY5c2IzTjBYQ0lnUFNCY0lreHZjM1JjSWlrcFhHNWNibkpsYzNWc2RDNTBZaVJwYm5SbGNtVnpkQ0E4TFNCbVlXTjBiM0lvY21WemRXeDBMblJpSkdsdWRHVnlaWE4wTENCc1pYWmxiSE1nUFNCaktGd2lWVkF2VGs5Y0lpd2dYQ0pFVDFkT1hDSXBLVnh1WEc1d0lEd3RJR2RuY0d4dmRDaHlaWE4xYkhRdWRHSXNJR0ZsY3loNElEMGdhVzUwWlhKbGMzUXNJSGtnUFNCMFlYSm5aWFFzSUhOcGVtVWdQU0F0Ykc5bk1UQW9jSFpoYkhWbEtTd2dabWxzYkNBOUlHOWtaSE5TWVhScGJ5a3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDaHphR0Z3WlNBOUlESXhMQ0FnSUNBZ0lDQWdJeUJGYm5OMWNtVnpJR0VnY0c5cGJuUWdkMmwwYUNCaGJpQnZkWFJzYVc1bFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnYzNSeWIydGxJRDBnTUM0MUtuQjBWRzlOVFNBZ0lDQWdJQ01nVEdsdVpTQjNhV1IwYUNCbWIzSWdkR2hsSUdKdmNtUmxjbHh1SUNBcElDc2dkR2hsYldWZlluY29LU0FySUZ4dUlDQnpZMkZzWlY5emFYcGxYMk52Ym5ScGJuVnZkWE1vY21GdVoyVWdQU0JqS0RFc0lETXBLU0FySUNBaklGTmxkQ0J0YVc0Z1lXNWtJRzFoZUNCd2IybHVkQ0J6YVhwbGN5Qm9aWEpsWEc0Z0lITmpZV3hsWDJacGJHeGZaM0poWkdsbGJuUnVLR052Ykc5eWN5QTlJR01vWENJak5EZzFNa0V3WENJc0lGd2lkMmhwZEdWY0lpd2dYQ0lqUTBJek16TkJYQ0lwTENBZ0l5QkVaV1pwYm1VZ1ozSmhaR2xsYm5RZ1kyOXNiM0p6WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZzZFdWeklEMGdjMk5oYkdWek9qcHlaWE5qWVd4bEtHTW9NQzQxTENBeExDQXhMalVwS1N3Z2JHbHRhWFJ6SUQwZ1l5Z3dMalVzSURFdU5Ta3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDTnNiM2NnUFNCY0luZG9hWFJsWENJc0lHaHBaMmdnUFNCY0lpTkRRak16TTBGY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHRhWFJ6SUQwZ1l5Z3hMQ0F6S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2YjJJZ1BTQnpZMkZzWlhNNk9uTnhkV2x6YUN3Z0l5QkVaV1pwYm1VZ1ozSmhaR2xsYm5RZ1kyOXNiM0p6WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaM1ZwWkdVZ1BTQm5kV2xrWlY5amIyeHZjbUpoY2loY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaGNuZHBaSFJvSUQwZ01TNDFMelV1TURnc0lDQWpJRUZrYW5WemRDQjNhV1IwYUNCdlppQjBhR1VnWTI5c2IzSWdZbUZ5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVhKb1pXbG5hSFFnUFNBeE5TODFMakE0SUNBZ0l5QkJaR3AxYzNRZ2FHVnBaMmgwSUc5bUlIUm9aU0JqYjJ4dmNpQmlZWEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXBYRzRnSUNrZ0sxeHVJQ0JzWVdKektIZ2dQU0JPVlV4TUxDQjVJRDBnVGxWTVRDa2dJQ3RjYmlBZ2RHaGxiV1VvWEc0Z0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQzU0SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdZVzVuYkdVZ1BTQTBOU3dnSUNBZ0lDQWpJRkp2ZEdGMFpTQjRMV0Y0YVhNZ2JHRmlaV3h6SURRMUlHUmxaM0psWlhOY2JpQWdJQ0FnSUdocWRYTjBJRDBnTVN3Z0lDQWdJQ0FnSXlCQlpHcDFjM1FnYUc5eWFYcHZiblJoYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0lDQjJhblZ6ZENBOUlERWdJQ0FnSUNBZ0lDTWdRV1JxZFhOMElIWmxjblJwWTJGc0lHcDFjM1JwWm1sallYUnBiMjVjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11YkdsdVpTQTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJwWTJ0eklEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBcExGeHVJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGd2lkSEpoYm5Od1lYSmxiblJjSWlrc1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWxjYmlBZ0tWeHVYRzVtYVd4bFRtRnRaU0E4TFNCb1pYSmxLR1pwWjBScGNpd2dYQ0pvWldGMGJXRndYMGd6U3pJM1lXTmZZbTl2YTIxaGNtdHBibWRmY21WblgyUnZkSEJzYjNSY0lpbGNibmRwWkhSb0lEd3RJSEJoYm1Wc1UybDZaU2d4TGpjcEttMXRWRzlKYm1Ob1hHNW9aV2xuYUhRZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TVNrcWJXMVViMGx1WTJoY2JpTWdjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUl5QndjbWx1ZENod0tWeHVJeUJrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1emRtZGNJaWtzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Y2JpQWdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbnRhcmdldE5hbWUgPC0gXFxIM0syN2FjX2VmZmllXFxcbiMgUkVUQUlORUQgbG9vcFxucmV0YWluZWQgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcVEZfYm9va21hcmtpbmdcXCwgdGFyZ2V0TmFtZSwgXFxhbV9hLmJlZFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbmNvbG5hbWVzKHJldGFpbmVkKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnJldGFpbmVkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShyZXRhaW5lZClcbiMgTE9TVCBsb29wXG5sb3N0IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXFRGX2Jvb2ttYXJraW5nXFwsIHRhcmdldE5hbWUsIFxcb2EuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuY29sbmFtZXMobG9zdCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5sb3N0LmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShsb3N0KVxuXG5cbiMgU0VFRElOR1xudGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLnVwbm8uZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKVxucmVzdWx0LnRiIDwtIHRpYmJsZShpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX1VQL05PXFwpLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfcmV0YWluZWRcXCksXG4gICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuIyBBRERJTkcgUk9XU1xudGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLmRvd24uZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKVxucmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9ET1dOXFwpLFxuICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9yZXRhaW5lZFxcKSxcbiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuIyBBRERJTkcgUk9XU1xudGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLnVwbm8uZ3IsIGJhY2tncm91bmQuZ3IsIGxvc3QuZ3IpXG5yZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX1VQL05PXFwpLFxuICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9sb3N0XFwpLFxuICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG4jIEFERElORyBST1dTXG50ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AuZG93bi5nciwgYmFja2dyb3VuZC5nciwgbG9zdC5ncilcbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfRE9XTlxcKSxcbiAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfbG9zdFxcKSxcbiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuXG5yZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JVxuICBtdXRhdGUoaW50ZXJlc3QgPSByZWNvZGUoaW50ZXJlc3QsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxyZWdMb29wX1VQL05PXFwgPSBcXFVQL05PXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcXHJlZ0xvb3BfRE9XTlxcID0gXFxET1dOXFwpLFxuICAgICAgICAgdGFyZ2V0ID0gcmVjb2RlKHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXEgzSzI3YWNfZWZmaWVfcmV0YWluZWRcXCA9IFxcUmV0YWluZWRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXEgzSzI3YWNfZWZmaWVfbG9zdFxcID0gXFxMb3N0XFwpKVxuXG5yZXN1bHQudGIkaW50ZXJlc3QgPC0gZmFjdG9yKHJlc3VsdC50YiRpbnRlcmVzdCwgbGV2ZWxzID0gYyhcXFVQL05PXFwsIFxcRE9XTlxcKSlcblxucCA8LSBnZ3Bsb3QocmVzdWx0LnRiLCBhZXMoeCA9IGludGVyZXN0LCB5ID0gdGFyZ2V0LCBzaXplID0gLWxvZzEwKHB2YWx1ZSksIGZpbGwgPSBvZGRzUmF0aW8pKSArXG4gIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZVxuICAgICAgICAgICAgIHN0cm9rZSA9IDAuNSpwdFRvTU0gICAgICAjIExpbmUgd2lkdGggZm9yIHRoZSBib3JkZXJcbiAgKSArIHRoZW1lX2J3KCkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCAzKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnMgPSBjKFxcIzQ4NTJBMFxcLCBcXHdoaXRlXFwsIFxcI0NCMzMzQVxcKSwgICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHNjYWxlczo6cmVzY2FsZShjKDAuNSwgMSwgMS41KSksIGxpbWl0cyA9IGMoMC41LCAxLjUpLCBcbiAgICAgICAgICAgICAgICAgICAgICAjbG93ID0gXFx3aGl0ZVxcLCBoaWdoID0gXFwjQ0IzMzNBXFwsXG4gICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICtcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcaGVhdG1hcF9IM0syN2FjX2Jvb2ttYXJraW5nX3JlZ19kb3RwbG90XFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMS43KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjEpKm1tVG9JbmNoXG4jIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5zdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4gIFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
targetName <- \H3K27ac_effie\
# RETAINED loop
retained <- fread(here(refDir, \TF_bookmarking\, targetName, \am_a.bed\)) %>% dplyr::select(c(1, 2, 3))
colnames(retained) <- c(\chr\, \start\, \end\)
retained.gr <- makeGRangesFromDataFrame(retained)
# LOST loop
lost <- fread(here(refDir, \TF_bookmarking\, targetName, \oa.bed\)) %>% dplyr::select(c(1, 2, 3))
colnames(lost) <- c(\chr\, \start\, \end\)
lost.gr <- makeGRangesFromDataFrame(lost)


# SEEDING
temp <- runFisherExact(loop.upno.gr, background.gr, retained.gr)
result.tb <- tibble(interest = paste0(interestName, \_UP/NO\),
                    target = paste0(targetName, \_retained\),
                    pvalue = temp$p.value,
                    oddsRatio = temp$estimate)

# ADDING ROWS
temp <- runFisherExact(loop.down.gr, background.gr, retained.gr)
result.tb <- result.tb %>% 
  add_row(interest = paste0(interestName, \_DOWN\),
          target = paste0(targetName, \_retained\),
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

# ADDING ROWS
temp <- runFisherExact(loop.upno.gr, background.gr, lost.gr)
result.tb <- result.tb %>% 
  add_row(interest = paste0(interestName, \_UP/NO\),
          target = paste0(targetName, \_lost\),
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

# ADDING ROWS
temp <- runFisherExact(loop.down.gr, background.gr, lost.gr)
result.tb <- result.tb %>% 
  add_row(interest = paste0(interestName, \_DOWN\),
          target = paste0(targetName, \_lost\),
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)


result.tb <- result.tb %>%
  mutate(interest = recode(interest, 
                           \regLoop_UP/NO\ = \UP/NO\,
                           \regLoop_DOWN\ = \DOWN\),
         target = recode(target,
                         \H3K27ac_effie_retained\ = \Retained\,
                         \H3K27ac_effie_lost\ = \Lost\))

result.tb$interest <- factor(result.tb$interest, levels = c(\UP/NO\, \DOWN\))

p <- ggplot(result.tb, aes(x = interest, y = target, size = -log10(pvalue), fill = oddsRatio)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 0.5*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(1, 3)) +  # Set min and max point sizes here
  scale_fill_gradientn(colors = c(\#4852A0\, \white\, \#CB333A\),  # Define gradient colors
                      values = scales::rescale(c(0.5, 1, 1.5)), limits = c(0.5, 1.5), 
                      #low = \white\, high = \#CB333A\,
                      #                  limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) +
  labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- here(figDir, \heatmap_H3K27ac_bookmarking_reg_dotplot\)
width <- panelSize(1.7)*mmToInch
height <- panelSize(1.1)*mmToInch
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
svglite(paste0(fileName, \.svg\),  height = height, width = width)
print(p)
dev.off()

  



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRHRnlaMlYwVG1GdFpTQThMU0JjWEVnelN6STNZV05mWldabWFXVmNYRnh1SXlCU1JWUkJTVTVGUkNCc2IyOXdYRzV5WlhSaGFXNWxaQ0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeFVSbDlpYjI5cmJXRnlhMmx1WjF4Y0xDQjBZWEpuWlhST1lXMWxMQ0JjWEdGdFgyRXVZbVZrWEZ3cEtTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLREVzSURJc0lETXBLVnh1WTI5c2JtRnRaWE1vY21WMFlXbHVaV1FwSUR3dElHTW9YRnhqYUhKY1hDd2dYRnh6ZEdGeWRGeGNMQ0JjWEdWdVpGeGNLVnh1Y21WMFlXbHVaV1F1WjNJZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtISmxkR0ZwYm1Wa0tWeHVJeUJNVDFOVUlHeHZiM0JjYm14dmMzUWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1ZFWmZZbTl2YTIxaGNtdHBibWRjWEN3Z2RHRnlaMlYwVG1GdFpTd2dYRnh2WVM1aVpXUmNYQ2twSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dNb01Td2dNaXdnTXlrcFhHNWpiMnh1WVcxbGN5aHNiM04wS1NBOExTQmpLRnhjWTJoeVhGd3NJRnhjYzNSaGNuUmNYQ3dnWEZ4bGJtUmNYQ2xjYm14dmMzUXVaM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0d4dmMzUXBYRzVjYmx4dUl5QlRSVVZFU1U1SFhHNTBaVzF3SUR3dElISjFia1pwYzJobGNrVjRZV04wS0d4dmIzQXVkWEJ1Ynk1bmNpd2dZbUZqYTJkeWIzVnVaQzVuY2l3Z2NtVjBZV2x1WldRdVozSXBYRzV5WlhOMWJIUXVkR0lnUEMwZ2RHbGlZbXhsS0dsdWRHVnlaWE4wSUQwZ2NHRnpkR1V3S0dsdWRHVnlaWE4wVG1GdFpTd2dYRnhmVlZBdlRrOWNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUmhjbWRsZENBOUlIQmhjM1JsTUNoMFlYSm5aWFJPWVcxbExDQmNYRjl5WlhSaGFXNWxaRnhjS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjSFpoYkhWbElEMGdkR1Z0Y0NSd0xuWmhiSFZsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZaR1J6VW1GMGFXOGdQU0IwWlcxd0pHVnpkR2x0WVhSbEtWeHVYRzRqSUVGRVJFbE9SeUJTVDFkVFhHNTBaVzF3SUR3dElISjFia1pwYzJobGNrVjRZV04wS0d4dmIzQXVaRzkzYmk1bmNpd2dZbUZqYTJkeWIzVnVaQzVuY2l3Z2NtVjBZV2x1WldRdVozSXBYRzV5WlhOMWJIUXVkR0lnUEMwZ2NtVnpkV3gwTG5SaUlDVStKU0JjYmlBZ1lXUmtYM0p2ZHlocGJuUmxjbVZ6ZENBOUlIQmhjM1JsTUNocGJuUmxjbVZ6ZEU1aGJXVXNJRnhjWDBSUFYwNWNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ2RHRnlaMlYwSUQwZ2NHRnpkR1V3S0hSaGNtZGxkRTVoYldVc0lGeGNYM0psZEdGcGJtVmtYRndwTEZ4dUlDQWdJQ0FnSUNBZ0lIQjJZV3gxWlNBOUlIUmxiWEFrY0M1MllXeDFaU3hjYmlBZ0lDQWdJQ0FnSUNCdlpHUnpVbUYwYVc4Z1BTQjBaVzF3SkdWemRHbHRZWFJsS1Z4dVhHNGpJRUZFUkVsT1J5QlNUMWRUWEc1MFpXMXdJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBLR3h2YjNBdWRYQnVieTVuY2l3Z1ltRmphMmR5YjNWdVpDNW5jaXdnYkc5emRDNW5jaWxjYm5KbGMzVnNkQzUwWWlBOExTQnlaWE4xYkhRdWRHSWdKVDRsSUZ4dUlDQmhaR1JmY205M0tHbHVkR1Z5WlhOMElEMGdjR0Z6ZEdVd0tHbHVkR1Z5WlhOMFRtRnRaU3dnWEZ4ZlZWQXZUazljWENrc1hHNGdJQ0FnSUNBZ0lDQWdkR0Z5WjJWMElEMGdjR0Z6ZEdVd0tIUmhjbWRsZEU1aGJXVXNJRnhjWDJ4dmMzUmNYQ2tzWEc0Z0lDQWdJQ0FnSUNBZ2NIWmhiSFZsSUQwZ2RHVnRjQ1J3TG5aaGJIVmxMRnh1SUNBZ0lDQWdJQ0FnSUc5a1pITlNZWFJwYnlBOUlIUmxiWEFrWlhOMGFXMWhkR1VwWEc1Y2JpTWdRVVJFU1U1SElGSlBWMU5jYm5SbGJYQWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUW9iRzl2Y0M1a2IzZHVMbWR5TENCaVlXTnJaM0p2ZFc1a0xtZHlMQ0JzYjNOMExtZHlLVnh1Y21WemRXeDBMblJpSUR3dElISmxjM1ZzZEM1MFlpQWxQaVVnWEc0Z0lHRmtaRjl5YjNjb2FXNTBaWEpsYzNRZ1BTQndZWE4wWlRBb2FXNTBaWEpsYzNST1lXMWxMQ0JjWEY5RVQxZE9YRndwTEZ4dUlDQWdJQ0FnSUNBZ0lIUmhjbWRsZENBOUlIQmhjM1JsTUNoMFlYSm5aWFJPWVcxbExDQmNYRjlzYjNOMFhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUhCMllXeDFaU0E5SUhSbGJYQWtjQzUyWVd4MVpTeGNiaUFnSUNBZ0lDQWdJQ0J2WkdSelVtRjBhVzhnUFNCMFpXMXdKR1Z6ZEdsdFlYUmxLVnh1WEc1Y2JuSmxjM1ZzZEM1MFlpQThMU0J5WlhOMWJIUXVkR0lnSlQ0bFhHNGdJRzExZEdGMFpTaHBiblJsY21WemRDQTlJSEpsWTI5a1pTaHBiblJsY21WemRDd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhKbFoweHZiM0JmVlZBdlRrOWNYQ0E5SUZ4Y1ZWQXZUazljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjbVZuVEc5dmNGOUVUMWRPWEZ3Z1BTQmNYRVJQVjA1Y1hDa3NYRzRnSUNBZ0lDQWdJQ0IwWVhKblpYUWdQU0J5WldOdlpHVW9kR0Z5WjJWMExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNTRE5MTWpkaFkxOWxabVpwWlY5eVpYUmhhVzVsWkZ4Y0lEMGdYRnhTWlhSaGFXNWxaRnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4Y1NETkxNamRoWTE5bFptWnBaVjlzYjNOMFhGd2dQU0JjWEV4dmMzUmNYQ2twWEc1Y2JuSmxjM1ZzZEM1MFlpUnBiblJsY21WemRDQThMU0JtWVdOMGIzSW9jbVZ6ZFd4MExuUmlKR2x1ZEdWeVpYTjBMQ0JzWlhabGJITWdQU0JqS0Z4Y1ZWQXZUazljWEN3Z1hGeEVUMWRPWEZ3cEtWeHVYRzV3SUR3dElHZG5jR3h2ZENoeVpYTjFiSFF1ZEdJc0lHRmxjeWg0SUQwZ2FXNTBaWEpsYzNRc0lIa2dQU0IwWVhKblpYUXNJSE5wZW1VZ1BTQXRiRzluTVRBb2NIWmhiSFZsS1N3Z1ptbHNiQ0E5SUc5a1pITlNZWFJwYnlrcElDdGNiaUFnWjJWdmJWOXdiMmx1ZENoemFHRndaU0E5SURJeExDQWdJQ0FnSUNBZ0l5QkZibk4xY21WeklHRWdjRzlwYm5RZ2QybDBhQ0JoYmlCdmRYUnNhVzVsWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdjM1J5YjJ0bElEMGdNQzQxS25CMFZHOU5UU0FnSUNBZ0lDTWdUR2x1WlNCM2FXUjBhQ0JtYjNJZ2RHaGxJR0p2Y21SbGNseHVJQ0FwSUNzZ2RHaGxiV1ZmWW5jb0tTQXJJRnh1SUNCelkyRnNaVjl6YVhwbFgyTnZiblJwYm5WdmRYTW9jbUZ1WjJVZ1BTQmpLREVzSURNcEtTQXJJQ0FqSUZObGRDQnRhVzRnWVc1a0lHMWhlQ0J3YjJsdWRDQnphWHBsY3lCb1pYSmxYRzRnSUhOallXeGxYMlpwYkd4ZlozSmhaR2xsYm5SdUtHTnZiRzl5Y3lBOUlHTW9YRndqTkRnMU1rRXdYRndzSUZ4Y2QyaHBkR1ZjWEN3Z1hGd2pRMEl6TXpOQlhGd3BMQ0FnSXlCRVpXWnBibVVnWjNKaFpHbGxiblFnWTI5c2IzSnpYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnNkV1Z6SUQwZ2MyTmhiR1Z6T2pweVpYTmpZV3hsS0dNb01DNDFMQ0F4TENBeExqVXBLU3dnYkdsdGFYUnpJRDBnWXlnd0xqVXNJREV1TlNrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNOc2IzY2dQU0JjWEhkb2FYUmxYRndzSUdocFoyZ2dQU0JjWENORFFqTXpNMEZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdGFYUnpJRDBnWXlneExDQXpLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZiMklnUFNCelkyRnNaWE02T25OeGRXbHphQ3dnSXlCRVpXWnBibVVnWjNKaFpHbGxiblFnWTI5c2IzSnpYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ozVnBaR1VnUFNCbmRXbGtaVjlqYjJ4dmNtSmhjaWhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poY25kcFpIUm9JRDBnTVM0MUx6VXVNRGdzSUNBaklFRmthblZ6ZENCM2FXUjBhQ0J2WmlCMGFHVWdZMjlzYjNJZ1ltRnlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZWEpvWldsbmFIUWdQU0F4TlM4MUxqQTRJQ0FnSXlCQlpHcDFjM1FnYUdWcFoyaDBJRzltSUhSb1pTQmpiMnh2Y2lCaVlYSmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBcFhHNGdJQ2tnSzF4dUlDQnNZV0p6S0hnZ1BTQk9WVXhNTENCNUlEMGdUbFZNVENrZ0lDdGNiaUFnZEdobGJXVW9YRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVTBzWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVTBzWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDNTRJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ1lXNW5iR1VnUFNBME5Td2dJQ0FnSUNBaklGSnZkR0YwWlNCNExXRjRhWE1nYkdGaVpXeHpJRFExSUdSbFozSmxaWE5jYmlBZ0lDQWdJR2hxZFhOMElEMGdNU3dnSUNBZ0lDQWdJeUJCWkdwMWMzUWdhRzl5YVhwdmJuUmhiQ0JxZFhOMGFXWnBZMkYwYVc5dVhHNGdJQ0FnSUNCMmFuVnpkQ0E5SURFZ0lDQWdJQ0FnSUNNZ1FXUnFkWE4wSUhabGNuUnBZMkZzSUdwMWMzUnBabWxqWVhScGIyNWNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXViR2x1WlNBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUnBZMnR6SUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3hjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ4Y2RISmhibk53WVhKbGJuUmNYQ2tzWEc0Z0lDQWdiR1ZuWlc1a0xuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5bGNiaUFnS1Z4dVhHNW1hV3hsVG1GdFpTQThMU0JvWlhKbEtHWnBaMFJwY2l3Z1hGeG9aV0YwYldGd1gwZ3pTekkzWVdOZlltOXZhMjFoY210cGJtZGZjbVZuWDJSdmRIQnNiM1JjWENsY2JuZHBaSFJvSUR3dElIQmhibVZzVTJsNlpTZ3hMamNwS20xdFZHOUpibU5vWEc1b1pXbG5hSFFnUEMwZ2NHRnVaV3hUYVhwbEtERXVNU2txYlcxVWIwbHVZMmhjYmlNZ2NHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGeGNhVzVjWEN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1SXlCd2NtbHVkQ2h3S1Z4dUl5QmtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9jR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV6ZG1kY1hDa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVjYmlBZ1hHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbnRhcmdldE5hbWUgPC0gXFxIM0syN2FjX2VmZmllXFxcbiMgUkVUQUlORUQgbG9vcFxucmV0YWluZWQgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcVEZfYm9va21hcmtpbmdcXCwgdGFyZ2V0TmFtZSwgXFxhbV9hLmJlZFxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbmNvbG5hbWVzKHJldGFpbmVkKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnJldGFpbmVkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShyZXRhaW5lZClcbiMgTE9TVCBsb29wXG5sb3N0IDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXFRGX2Jvb2ttYXJraW5nXFwsIHRhcmdldE5hbWUsIFxcb2EuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuY29sbmFtZXMobG9zdCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5sb3N0LmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShsb3N0KVxuXG5cbiMgU0VFRElOR1xudGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLnVwbm8uZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKVxucmVzdWx0LnRiIDwtIHRpYmJsZShpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX1VQL05PXFwpLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfcmV0YWluZWRcXCksXG4gICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuIyBBRERJTkcgUk9XU1xudGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLmRvd24uZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKVxucmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9ET1dOXFwpLFxuICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9yZXRhaW5lZFxcKSxcbiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuIyBBRERJTkcgUk9XU1xudGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLnVwbm8uZ3IsIGJhY2tncm91bmQuZ3IsIGxvc3QuZ3IpXG5yZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX1VQL05PXFwpLFxuICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9sb3N0XFwpLFxuICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG4jIEFERElORyBST1dTXG50ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AuZG93bi5nciwgYmFja2dyb3VuZC5nciwgbG9zdC5ncilcbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfRE9XTlxcKSxcbiAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgXFxfbG9zdFxcKSxcbiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuXG5yZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JVxuICBtdXRhdGUoaW50ZXJlc3QgPSByZWNvZGUoaW50ZXJlc3QsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxyZWdMb29wX1VQL05PXFwgPSBcXFVQL05PXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcXHJlZ0xvb3BfRE9XTlxcID0gXFxET1dOXFwpLFxuICAgICAgICAgdGFyZ2V0ID0gcmVjb2RlKHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXEgzSzI3YWNfZWZmaWVfcmV0YWluZWRcXCA9IFxcUmV0YWluZWRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXEgzSzI3YWNfZWZmaWVfbG9zdFxcID0gXFxMb3N0XFwpKVxuXG5yZXN1bHQudGIkaW50ZXJlc3QgPC0gZmFjdG9yKHJlc3VsdC50YiRpbnRlcmVzdCwgbGV2ZWxzID0gYyhcXFVQL05PXFwsIFxcRE9XTlxcKSlcblxucCA8LSBnZ3Bsb3QocmVzdWx0LnRiLCBhZXMoeCA9IGludGVyZXN0LCB5ID0gdGFyZ2V0LCBzaXplID0gLWxvZzEwKHB2YWx1ZSksIGZpbGwgPSBvZGRzUmF0aW8pKSArXG4gIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZVxuICAgICAgICAgICAgIHN0cm9rZSA9IDAuNSpwdFRvTU0gICAgICAjIExpbmUgd2lkdGggZm9yIHRoZSBib3JkZXJcbiAgKSArIHRoZW1lX2J3KCkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCAzKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnMgPSBjKFxcIzQ4NTJBMFxcLCBcXHdoaXRlXFwsIFxcI0NCMzMzQVxcKSwgICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHNjYWxlczo6cmVzY2FsZShjKDAuNSwgMSwgMS41KSksIGxpbWl0cyA9IGMoMC41LCAxLjUpLCBcbiAgICAgICAgICAgICAgICAgICAgICAjbG93ID0gXFx3aGl0ZVxcLCBoaWdoID0gXFwjQ0IzMzNBXFwsXG4gICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICtcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcaGVhdG1hcF9IM0syN2FjX2Jvb2ttYXJraW5nX3JlZ19kb3RwbG90XFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMS43KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjEpKm1tVG9JbmNoXG4jIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5zdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4gIFxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGFyZ2V0TmFtZSA8LSBcXEgzSzI3YWNfZWZmaWVcXFxuIyBSRVRBSU5FRCBsb29wXG5yZXRhaW5lZCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxURl9ib29rbWFya2luZ1xcLCB0YXJnZXROYW1lLCBcXGFtX2EuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuY29sbmFtZXMocmV0YWluZWQpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxucmV0YWluZWQuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHJldGFpbmVkKVxuIyBMT1NUIGxvb3Bcbmxvc3QgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcVEZfYm9va21hcmtpbmdcXCwgdGFyZ2V0TmFtZSwgXFxvYS5iZWRcXCkpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG5jb2xuYW1lcyhsb3N0KSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbmxvc3QuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGxvc3QpXG5cblxuIyBTRUVESU5HXG50ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AudXBuby5nciwgYmFja2dyb3VuZC5nciwgcmV0YWluZWQuZ3IpXG5yZXN1bHQudGIgPC0gdGliYmxlKGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfVVAvTk9cXCksXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9yZXRhaW5lZFxcKSxcbiAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG4jIEFERElORyBST1dTXG50ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AuZG93bi5nciwgYmFja2dyb3VuZC5nciwgcmV0YWluZWQuZ3IpXG5yZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsIFxcX0RPV05cXCksXG4gICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX3JldGFpbmVkXFwpLFxuICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG4jIEFERElORyBST1dTXG50ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AudXBuby5nciwgYmFja2dyb3VuZC5nciwgbG9zdC5ncilcbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgXFxfVVAvTk9cXCksXG4gICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsIFxcX2xvc3RcXCksXG4gICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cbiMgQURESU5HIFJPV1NcbnRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC5kb3duLmdyLCBiYWNrZ3JvdW5kLmdyLCBsb3N0LmdyKVxucmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCBcXF9ET1dOXFwpLFxuICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCBcXF9sb3N0XFwpLFxuICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG5cbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lXG4gIG11dGF0ZShpbnRlcmVzdCA9IHJlY29kZShpbnRlcmVzdCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcXHJlZ0xvb3BfVVAvTk9cXCA9IFxcVVAvTk9cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccmVnTG9vcF9ET1dOXFwgPSBcXERPV05cXCksXG4gICAgICAgICB0YXJnZXQgPSByZWNvZGUodGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcSDNLMjdhY19lZmZpZV9yZXRhaW5lZFxcID0gXFxSZXRhaW5lZFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcSDNLMjdhY19lZmZpZV9sb3N0XFwgPSBcXExvc3RcXCkpXG5cbnJlc3VsdC50YiRpbnRlcmVzdCA8LSBmYWN0b3IocmVzdWx0LnRiJGludGVyZXN0LCBsZXZlbHMgPSBjKFxcVVAvTk9cXCwgXFxET1dOXFwpKVxuXG5wIDwtIGdncGxvdChyZXN1bHQudGIsIGFlcyh4ID0gaW50ZXJlc3QsIHkgPSB0YXJnZXQsIHNpemUgPSAtbG9nMTAocHZhbHVlKSwgZmlsbCA9IG9kZHNSYXRpbykpICtcbiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lXG4gICAgICAgICAgICAgc3Ryb2tlID0gMC41KnB0VG9NTSAgICAgICMgTGluZSB3aWR0aCBmb3IgdGhlIGJvcmRlclxuICApICsgdGhlbWVfYncoKSArIFxuICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDMpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlXG4gIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycyA9IGMoXFwjNDg1MkEwXFwsIFxcd2hpdGVcXCwgXFwjQ0IzMzNBXFwpLCAgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gc2NhbGVzOjpyZXNjYWxlKGMoMC41LCAxLCAxLjUpKSwgbGltaXRzID0gYygwLjUsIDEuNSksIFxuICAgICAgICAgICAgICAgICAgICAgICNsb3cgPSBcXHdoaXRlXFwsIGhpZ2ggPSBcXCNDQjMzM0FcXCxcbiAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLCAzKSxcbiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICkgK1xuICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKVxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFxoZWF0bWFwX0gzSzI3YWNfYm9va21hcmtpbmdfcmVnX2RvdHBsb3RcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjcpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMSkqbW1Ub0luY2hcbiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbiAgXG5gYGBcbmBgYCJ9 -->

```r
```r
targetName <- \H3K27ac_effie\
# RETAINED loop
retained <- fread(here(refDir, \TF_bookmarking\, targetName, \am_a.bed\)) %>% dplyr::select(c(1, 2, 3))
colnames(retained) <- c(\chr\, \start\, \end\)
retained.gr <- makeGRangesFromDataFrame(retained)
# LOST loop
lost <- fread(here(refDir, \TF_bookmarking\, targetName, \oa.bed\)) %>% dplyr::select(c(1, 2, 3))
colnames(lost) <- c(\chr\, \start\, \end\)
lost.gr <- makeGRangesFromDataFrame(lost)


# SEEDING
temp <- runFisherExact(loop.upno.gr, background.gr, retained.gr)
result.tb <- tibble(interest = paste0(interestName, \_UP/NO\),
                    target = paste0(targetName, \_retained\),
                    pvalue = temp$p.value,
                    oddsRatio = temp$estimate)

# ADDING ROWS
temp <- runFisherExact(loop.down.gr, background.gr, retained.gr)
result.tb <- result.tb %>% 
  add_row(interest = paste0(interestName, \_DOWN\),
          target = paste0(targetName, \_retained\),
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

# ADDING ROWS
temp <- runFisherExact(loop.upno.gr, background.gr, lost.gr)
result.tb <- result.tb %>% 
  add_row(interest = paste0(interestName, \_UP/NO\),
          target = paste0(targetName, \_lost\),
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

# ADDING ROWS
temp <- runFisherExact(loop.down.gr, background.gr, lost.gr)
result.tb <- result.tb %>% 
  add_row(interest = paste0(interestName, \_DOWN\),
          target = paste0(targetName, \_lost\),
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)


result.tb <- result.tb %>%
  mutate(interest = recode(interest, 
                           \regLoop_UP/NO\ = \UP/NO\,
                           \regLoop_DOWN\ = \DOWN\),
         target = recode(target,
                         \H3K27ac_effie_retained\ = \Retained\,
                         \H3K27ac_effie_lost\ = \Lost\))

result.tb$interest <- factor(result.tb$interest, levels = c(\UP/NO\, \DOWN\))

p <- ggplot(result.tb, aes(x = interest, y = target, size = -log10(pvalue), fill = oddsRatio)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 0.5*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(1, 3)) +  # Set min and max point sizes here
  scale_fill_gradientn(colors = c(\#4852A0\, \white\, \#CB333A\),  # Define gradient colors
                      values = scales::rescale(c(0.5, 1, 1.5)), limits = c(0.5, 1.5), 
                      #low = \white\, high = \#CB333A\,
                      #                  limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) +
  labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- here(figDir, \heatmap_H3K27ac_bookmarking_reg_dotplot\)
width <- panelSize(1.7)*mmToInch
height <- panelSize(1.1)*mmToInch
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
svglite(paste0(fileName, \.svg\),  height = height, width = width)
print(p)
dev.off()

  
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



##### Reg loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlCSmJYQnZjblJwYm1jZ2JHOXZjSE1nYjJZZ2RHRnlaMlYwWEc1Y2JuUmxiWEF4SUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFJDYVc1aGNua29YQ0pGVTFKU1FsOWtjMmRjSWl3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEF5SUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFJDYVc1aGNua29YQ0pJTTBzeU4yRmpYMlZtWm1sbFhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNHNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd015QThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMFFtbHVZWEo1S0Z3aVMweEdORjlsWm1acFpWd2lMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQnVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNEUWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRFSnBibUZ5ZVNoY0lrOURWRFJmWldabWFXVmNJaXdnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTFJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUkNhVzVoY25rb1hDSlRUMWd5WDJWbVptbGxYQ0lzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjRzV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1Y2JseHVaR0YwWVNBOExTQmlhVzVrWDNKdmQzTW9kR1Z0Y0RFc0lIUmxiWEF5TENCMFpXMXdNeXdnZEdWdGNEUXNJSFJsYlhBMUtWeHVYRzVjYmx4dWNtVnpkV3gwTG5SaUlEd3RJR1JoZEdFZ0pUNGxYRzRnSUcxMWRHRjBaU2hwYm5SbGNtVnpkQ0E5SUhKbFkyOWtaU2hwYm5SbGNtVnpkQ3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0luSmxaMHh2YjNCZlZWQXZUazljSWlBOUlGd2lWVkF2VGs5Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY21WblRHOXZjRjlFVDFkT1hDSWdQU0JjSWtSUFYwNWNJaWtzWEc0Z0lDQWdJQ0FnSUNCMFlYSm5aWFFnUFNCeVpXTnZaR1VvZEdGeVoyVjBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpU0ROTE1qZGhZMTlsWm1acFpWOXlaWFJoYVc1bFpGd2lJRDBnWENKSU0wc3lOMkZqWDNKbGRHRnBibVZrWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSklNMHN5TjJGalgyVm1abWxsWDJ4dmMzUmNJaUE5SUZ3aVNETkxNamRoWTE5c2IzTjBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKRlUxSlNRbDlrYzJkZmNtVjBZV2x1WldSY0lpQTlJRndpUlZOU1VrSmZjbVYwWVdsdVpXUmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWtWVFVsSkNYMlJ6WjE5c2IzTjBYQ0lnUFNCY0lrVlRVbEpDWDJ4dmMzUmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWt0TVJqUmZaV1ptYVdWZmNtVjBZV2x1WldSY0lpQTlJRndpUzB4R05GOXlaWFJoYVc1bFpGd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpUzB4R05GOWxabVpwWlY5c2IzTjBYQ0lnUFNCY0lrdE1SalJmYkc5emRGd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpVDBOVU5GOWxabVpwWlY5eVpYUmhhVzVsWkZ3aUlEMGdYQ0pQUTFRMFgzSmxkR0ZwYm1Wa1hDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0pQUTFRMFgyVm1abWxsWDJ4dmMzUmNJaUE5SUZ3aVQwTlVORjlzYjNOMFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0pUVDFneVgyVm1abWxsWDNKbGRHRnBibVZrWENJZ1BTQmNJbE5QV0RKZmNtVjBZV2x1WldSY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbE5QV0RKZlpXWm1hV1ZmYkc5emRGd2lJRDBnWENKVFQxZ3lYMnh2YzNSY0lpa3BYRzVjYm5KbGMzVnNkQzUwWWlScGJuUmxjbVZ6ZENBOExTQm1ZV04wYjNJb2NtVnpkV3gwTG5SaUpHbHVkR1Z5WlhOMExDQnNaWFpsYkhNZ1BTQmpLRndpVlZBdlRrOWNJaXdnWENKRVQxZE9YQ0lwS1Z4dWNtVnpkV3gwTG5SaUpIUmhjbWRsZENBOExTQm1ZV04wYjNJb2NtVnpkV3gwTG5SaUpIUmhjbWRsZEN3Z2JHVjJaV3h6SUQwZ2NtVjJLR01vWENKSU0wc3lOMkZqWDNKbGRHRnBibVZrWENJc0lGd2lTRE5MTWpkaFkxOXNiM04wWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpUlZOU1VrSmZjbVYwWVdsdVpXUmNJaXdnWENKRlUxSlNRbDlzYjNOMFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVMweEdORjl5WlhSaGFXNWxaRndpTENCY0lrdE1SalJmYkc5emRGd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lrOURWRFJmY21WMFlXbHVaV1JjSWl3Z1hDSlBRMVEwWDJ4dmMzUmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSlRUMWd5WDNKbGRHRnBibVZrWENJc1hDSlRUMWd5WDJ4dmMzUmNJaWtwS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2h5WlhOMWJIUXVkR0lzSUdGbGN5aDRJRDBnYVc1MFpYSmxjM1FzSUhrZ1BTQjBZWEpuWlhRc0lITnBlbVVnUFNBdGJHOW5NVEFvY0haaGJIVmxLU3dnWm1sc2JDQTlJRzlrWkhOU1lYUnBieWtwSUN0Y2JpQWdaMlZ2YlY5d2IybHVkQ2h6YUdGd1pTQTlJREl4TENBZ0lDQWdJQ0FnSXlCRmJuTjFjbVZ6SUdFZ2NHOXBiblFnZDJsMGFDQmhiaUJ2ZFhSc2FXNWxYRzRnSUNBZ0lDQWdJQ0FnSUNBZ2MzUnliMnRsSUQwZ01TcHdkRlJ2VFUwZ0lDQWdJQ0FqSUV4cGJtVWdkMmxrZEdnZ1ptOXlJSFJvWlNCaWIzSmtaWEpjYmlBZ0tTQXJJSFJvWlcxbFgySjNLQ2tnS3lCY2JpQWdjMk5oYkdWZmMybDZaVjlqYjI1MGFXNTFiM1Z6S0hKaGJtZGxJRDBnWXlneExDQXpLU2tnS3lBZ0l5QlRaWFFnYldsdUlHRnVaQ0J0WVhnZ2NHOXBiblFnYzJsNlpYTWdhR1Z5WlZ4dUlDQnpZMkZzWlY5bWFXeHNYMmR5WVdScFpXNTBiaWhqYjJ4dmNuTWdQU0JqS0Z3aUl6UTROVEpCTUZ3aUxDQmNJbmRvYVhSbFhDSXNJRndpSTBOQ016TXpRVndpS1N3Z0lDTWdSR1ZtYVc1bElHZHlZV1JwWlc1MElHTnZiRzl5YzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoYkhWbGN5QTlJSE5qWVd4bGN6bzZjbVZ6WTJGc1pTaGpLREF1TlN3Z01Td2dNUzQxS1Nrc0lHeHBiV2wwY3lBOUlHTW9NQzQxTENBeExqVXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpiRzkzSUQwZ1hDSjNhR2wwWlZ3aUxDQm9hV2RvSUQwZ1hDSWpRMEl6TXpOQlhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHBiV2wwY3lBOUlHTW9NU3dnTXlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjI5aUlEMGdjMk5oYkdWek9qcHpjWFZwYzJnc0lDTWdSR1ZtYVc1bElHZHlZV1JwWlc1MElHTnZiRzl5YzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2QxYVdSbElEMGdaM1ZwWkdWZlkyOXNiM0ppWVhJb1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlYSjNhV1IwYUNBOUlERXVOUzgxTGpBNExDQWdJeUJCWkdwMWMzUWdkMmxrZEdnZ2IyWWdkR2hsSUdOdmJHOXlJR0poY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GeWFHVnBaMmgwSUQwZ01UVXZOUzR3T0NBZ0lDTWdRV1JxZFhOMElHaGxhV2RvZENCdlppQjBhR1VnWTI5c2IzSWdZbUZ5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLVnh1SUNBcElDdGNiaUFnYkdGaWN5aDRJRDBnVGxWTVRDd2dlU0E5SUU1VlRFd3BJQ0FyWEc0Z0lIUm9aVzFsS0Z4dUlDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUNBZ0lDQWdJeUJTYjNSaGRHVWdlQzFoZUdseklHeGhZbVZzY3lBME5TQmtaV2R5WldWelhHNGdJQ0FnSUNCb2FuVnpkQ0E5SURFc0lDQWdJQ0FnSUNNZ1FXUnFkWE4wSUdodmNtbDZiMjUwWVd3Z2FuVnpkR2xtYVdOaGRHbHZibHh1SUNBZ0lDQWdkbXAxYzNRZ1BTQXhJQ0FnSUNBZ0lDQWpJRUZrYW5WemRDQjJaWEowYVdOaGJDQnFkWE4wYVdacFkyRjBhVzl1WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNJblJ5WVc1emNHRnlaVzUwWENJcExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2FHVnlaU2htYVdkRWFYSXNJRndpYUdWaGRHMWhjRjloYkd4MFlYSm5aWFJmWW05dmEyMWhjbXRwYm1kZmNtVm5YMlJ2ZEhCc2IzUmNJaWxjYm5kcFpIUm9JRHd0SUhCaGJtVnNVMmw2WlNneUxqSXBLbTF0Vkc5SmJtTm9YRzVvWldsbmFIUWdQQzBnY0dGdVpXeFRhWHBsS0RJcEttMXRWRzlKYm1Ob1hHNGpJSEJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpTWdjSEpwYm5Rb2NDbGNiaU1nWkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0hCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwTENBZ2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dVhHNWNibHh1WEc1Y2JseHVYRzVjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIHRhcmdldFxuXG50ZW1wMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0QmluYXJ5KFxcRVNSUkJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cG5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0QmluYXJ5KFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXBuby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldEJpbmFyeShcXEtMRjRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwbm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRCaW5hcnkoXFxPQ1Q0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cG5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0QmluYXJ5KFxcU09YMl9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXBuby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxuXG5cbmRhdGEgPC0gYmluZF9yb3dzKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSlcblxuXG5cbnJlc3VsdC50YiA8LSBkYXRhICU+JVxuICBtdXRhdGUoaW50ZXJlc3QgPSByZWNvZGUoaW50ZXJlc3QsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxyZWdMb29wX1VQL05PXFwgPSBcXFVQL05PXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcXHJlZ0xvb3BfRE9XTlxcID0gXFxET1dOXFwpLFxuICAgICAgICAgdGFyZ2V0ID0gcmVjb2RlKHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXEgzSzI3YWNfZWZmaWVfcmV0YWluZWRcXCA9IFxcSDNLMjdhY19yZXRhaW5lZFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcSDNLMjdhY19lZmZpZV9sb3N0XFwgPSBcXEgzSzI3YWNfbG9zdFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcRVNSUkJfZHNnX3JldGFpbmVkXFwgPSBcXEVTUlJCX3JldGFpbmVkXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxFU1JSQl9kc2dfbG9zdFxcID0gXFxFU1JSQl9sb3N0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxLTEY0X2VmZmllX3JldGFpbmVkXFwgPSBcXEtMRjRfcmV0YWluZWRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXEtMRjRfZWZmaWVfbG9zdFxcID0gXFxLTEY0X2xvc3RcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXE9DVDRfZWZmaWVfcmV0YWluZWRcXCA9IFxcT0NUNF9yZXRhaW5lZFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcT0NUNF9lZmZpZV9sb3N0XFwgPSBcXE9DVDRfbG9zdFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcU09YMl9lZmZpZV9yZXRhaW5lZFxcID0gXFxTT1gyX3JldGFpbmVkXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxTT1gyX2VmZmllX2xvc3RcXCA9IFxcU09YMl9sb3N0XFwpKVxuXG5yZXN1bHQudGIkaW50ZXJlc3QgPC0gZmFjdG9yKHJlc3VsdC50YiRpbnRlcmVzdCwgbGV2ZWxzID0gYyhcXFVQL05PXFwsIFxcRE9XTlxcKSlcbnJlc3VsdC50YiR0YXJnZXQgPC0gZmFjdG9yKHJlc3VsdC50YiR0YXJnZXQsIGxldmVscyA9IHJldihjKFxcSDNLMjdhY19yZXRhaW5lZFxcLCBcXEgzSzI3YWNfbG9zdFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEVTUlJCX3JldGFpbmVkXFwsIFxcRVNSUkJfbG9zdFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEtMRjRfcmV0YWluZWRcXCwgXFxLTEY0X2xvc3RcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxPQ1Q0X3JldGFpbmVkXFwsIFxcT0NUNF9sb3N0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcU09YMl9yZXRhaW5lZFxcLFxcU09YMl9sb3N0XFwpKSlcblxucCA8LSBnZ3Bsb3QocmVzdWx0LnRiLCBhZXMoeCA9IGludGVyZXN0LCB5ID0gdGFyZ2V0LCBzaXplID0gLWxvZzEwKHB2YWx1ZSksIGZpbGwgPSBvZGRzUmF0aW8pKSArXG4gIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZVxuICAgICAgICAgICAgIHN0cm9rZSA9IDEqcHRUb01NICAgICAgIyBMaW5lIHdpZHRoIGZvciB0aGUgYm9yZGVyXG4gICkgKyB0aGVtZV9idygpICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgMykpICsgICMgU2V0IG1pbiBhbmQgbWF4IHBvaW50IHNpemVzIGhlcmVcbiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3JzID0gYyhcXCM0ODUyQTBcXCwgXFx3aGl0ZVxcLCBcXCNDQjMzM0FcXCksICAjIERlZmluZSBncmFkaWVudCBjb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBzY2FsZXM6OnJlc2NhbGUoYygwLjUsIDEsIDEuNSkpLCBsaW1pdHMgPSBjKDAuNSwgMS41KSwgXG4gICAgICAgICAgICAgICAgICAgICAgI2xvdyA9IFxcd2hpdGVcXCwgaGlnaCA9IFxcI0NCMzMzQVxcLFxuICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEsIDMpLFxuICAgICAgICAgICAgICAgICAgICAgIG9vYiA9IHNjYWxlczo6c3F1aXNoLCAjIERlZmluZSBncmFkaWVudCBjb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgKSArXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXGhlYXRtYXBfYWxsdGFyZ2V0X2Jvb2ttYXJraW5nX3JlZ19kb3RwbG90XFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMi4yKSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jIHByaW50KHApXG4jIGRldi5vZmYoKVxuc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cblxuXG5cblxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
#### Importing loops of target

temp1 <- runFisherExactCombinationTargetBinary(\ESRRB_dsg\, interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTargetBinary(\H3K27ac_effie\, interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTargetBinary(\KLF4_effie\, interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTargetBinary(\OCT4_effie\, interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTargetBinary(\SOX2_effie\, interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr)


data <- bind_rows(temp1, temp2, temp3, temp4, temp5)



result.tb <- data %>%
  mutate(interest = recode(interest, 
                           \regLoop_UP/NO\ = \UP/NO\,
                           \regLoop_DOWN\ = \DOWN\),
         target = recode(target,
                         \H3K27ac_effie_retained\ = \H3K27ac_retained\,
                         \H3K27ac_effie_lost\ = \H3K27ac_lost\,
                         \ESRRB_dsg_retained\ = \ESRRB_retained\,
                         \ESRRB_dsg_lost\ = \ESRRB_lost\,
                         \KLF4_effie_retained\ = \KLF4_retained\,
                         \KLF4_effie_lost\ = \KLF4_lost\,
                         \OCT4_effie_retained\ = \OCT4_retained\,
                         \OCT4_effie_lost\ = \OCT4_lost\,
                         \SOX2_effie_retained\ = \SOX2_retained\,
                         \SOX2_effie_lost\ = \SOX2_lost\))

result.tb$interest <- factor(result.tb$interest, levels = c(\UP/NO\, \DOWN\))
result.tb$target <- factor(result.tb$target, levels = rev(c(\H3K27ac_retained\, \H3K27ac_lost\,
                                                        \ESRRB_retained\, \ESRRB_lost\,
                                                        \KLF4_retained\, \KLF4_lost\,
                                                        \OCT4_retained\, \OCT4_lost\,
                                                        \SOX2_retained\,\SOX2_lost\)))

p <- ggplot(result.tb, aes(x = interest, y = target, size = -log10(pvalue), fill = oddsRatio)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(1, 3)) +  # Set min and max point sizes here
  scale_fill_gradientn(colors = c(\#4852A0\, \white\, \#CB333A\),  # Define gradient colors
                      values = scales::rescale(c(0.5, 1, 1.5)), limits = c(0.5, 1.5), 
                      #low = \white\, high = \#CB333A\,
                      #                  limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) +
  labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- here(figDir, \heatmap_alltarget_bookmarking_reg_dotplot\)
width <- panelSize(2.2)*mmToInch
height <- panelSize(2)*mmToInch
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
svglite(paste0(fileName, \.svg\),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeUJKYlhCdmNuUnBibWNnYkc5dmNITWdiMllnZEdGeVoyVjBYRzVjYm5SbGJYQXhJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUkNhVzVoY25rb1hGeEZVMUpTUWw5a2MyZGNYQ3dnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXlJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUkNhVzVoY25rb1hGeElNMHN5TjJGalgyVm1abWxsWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0c1dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TXlBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwUW1sdVlYSjVLRnhjUzB4R05GOWxabVpwWlZ4Y0xDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhCdWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RRZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZEVKcGJtRnllU2hjWEU5RFZEUmZaV1ptYVdWY1hDd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd2JtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBMUlEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhSQ2FXNWhjbmtvWEZ4VFQxZ3lYMlZtWm1sbFhGd3NJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNHNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzVjYmx4dVpHRjBZU0E4TFNCaWFXNWtYM0p2ZDNNb2RHVnRjREVzSUhSbGJYQXlMQ0IwWlcxd015d2dkR1Z0Y0RRc0lIUmxiWEExS1Z4dVhHNWNibHh1Y21WemRXeDBMblJpSUR3dElHUmhkR0VnSlQ0bFhHNGdJRzExZEdGMFpTaHBiblJsY21WemRDQTlJSEpsWTI5a1pTaHBiblJsY21WemRDd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEhKbFoweHZiM0JmVlZBdlRrOWNYQ0E5SUZ4Y1ZWQXZUazljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNjbVZuVEc5dmNGOUVUMWRPWEZ3Z1BTQmNYRVJQVjA1Y1hDa3NYRzRnSUNBZ0lDQWdJQ0IwWVhKblpYUWdQU0J5WldOdlpHVW9kR0Z5WjJWMExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNTRE5MTWpkaFkxOWxabVpwWlY5eVpYUmhhVzVsWkZ4Y0lEMGdYRnhJTTBzeU4yRmpYM0psZEdGcGJtVmtYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4SU0wc3lOMkZqWDJWbVptbGxYMnh2YzNSY1hDQTlJRnhjU0ROTE1qZGhZMTlzYjNOMFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnhGVTFKU1FsOWtjMmRmY21WMFlXbHVaV1JjWENBOUlGeGNSVk5TVWtKZmNtVjBZV2x1WldSY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRVZUVWxKQ1gyUnpaMTlzYjNOMFhGd2dQU0JjWEVWVFVsSkNYMnh2YzNSY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRXRNUmpSZlpXWm1hV1ZmY21WMFlXbHVaV1JjWENBOUlGeGNTMHhHTkY5eVpYUmhhVzVsWkZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNTMHhHTkY5bFptWnBaVjlzYjNOMFhGd2dQU0JjWEV0TVJqUmZiRzl6ZEZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNUME5VTkY5bFptWnBaVjl5WlhSaGFXNWxaRnhjSUQwZ1hGeFBRMVEwWDNKbGRHRnBibVZrWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeFBRMVEwWDJWbVptbGxYMnh2YzNSY1hDQTlJRnhjVDBOVU5GOXNiM04wWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeFRUMWd5WDJWbVptbGxYM0psZEdGcGJtVmtYRndnUFNCY1hGTlBXREpmY21WMFlXbHVaV1JjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hGTlBXREpmWldabWFXVmZiRzl6ZEZ4Y0lEMGdYRnhUVDFneVgyeHZjM1JjWENrcFhHNWNibkpsYzNWc2RDNTBZaVJwYm5SbGNtVnpkQ0E4TFNCbVlXTjBiM0lvY21WemRXeDBMblJpSkdsdWRHVnlaWE4wTENCc1pYWmxiSE1nUFNCaktGeGNWVkF2VGs5Y1hDd2dYRnhFVDFkT1hGd3BLVnh1Y21WemRXeDBMblJpSkhSaGNtZGxkQ0E4TFNCbVlXTjBiM0lvY21WemRXeDBMblJpSkhSaGNtZGxkQ3dnYkdWMlpXeHpJRDBnY21WMktHTW9YRnhJTTBzeU4yRmpYM0psZEdGcGJtVmtYRndzSUZ4Y1NETkxNamRoWTE5c2IzTjBYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNSVk5TVWtKZmNtVjBZV2x1WldSY1hDd2dYRnhGVTFKU1FsOXNiM04wWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjUzB4R05GOXlaWFJoYVc1bFpGeGNMQ0JjWEV0TVJqUmZiRzl6ZEZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEU5RFZEUmZjbVYwWVdsdVpXUmNYQ3dnWEZ4UFExUTBYMnh2YzNSY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4VFQxZ3lYM0psZEdGcGJtVmtYRndzWEZ4VFQxZ3lYMnh2YzNSY1hDa3BLVnh1WEc1d0lEd3RJR2RuY0d4dmRDaHlaWE4xYkhRdWRHSXNJR0ZsY3loNElEMGdhVzUwWlhKbGMzUXNJSGtnUFNCMFlYSm5aWFFzSUhOcGVtVWdQU0F0Ykc5bk1UQW9jSFpoYkhWbEtTd2dabWxzYkNBOUlHOWtaSE5TWVhScGJ5a3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDaHphR0Z3WlNBOUlESXhMQ0FnSUNBZ0lDQWdJeUJGYm5OMWNtVnpJR0VnY0c5cGJuUWdkMmwwYUNCaGJpQnZkWFJzYVc1bFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnYzNSeWIydGxJRDBnTVNwd2RGUnZUVTBnSUNBZ0lDQWpJRXhwYm1VZ2QybGtkR2dnWm05eUlIUm9aU0JpYjNKa1pYSmNiaUFnS1NBcklIUm9aVzFsWDJKM0tDa2dLeUJjYmlBZ2MyTmhiR1ZmYzJsNlpWOWpiMjUwYVc1MWIzVnpLSEpoYm1kbElEMGdZeWd4TENBektTa2dLeUFnSXlCVFpYUWdiV2x1SUdGdVpDQnRZWGdnY0c5cGJuUWdjMmw2WlhNZ2FHVnlaVnh1SUNCelkyRnNaVjltYVd4c1gyZHlZV1JwWlc1MGJpaGpiMnh2Y25NZ1BTQmpLRnhjSXpRNE5USkJNRnhjTENCY1hIZG9hWFJsWEZ3c0lGeGNJME5DTXpNelFWeGNLU3dnSUNNZ1JHVm1hVzVsSUdkeVlXUnBaVzUwSUdOdmJHOXljMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhiSFZsY3lBOUlITmpZV3hsY3pvNmNtVnpZMkZzWlNoaktEQXVOU3dnTVN3Z01TNDFLU2tzSUd4cGJXbDBjeUE5SUdNb01DNDFMQ0F4TGpVcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBamJHOTNJRDBnWEZ4M2FHbDBaVnhjTENCb2FXZG9JRDBnWEZ3alEwSXpNek5CWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJXbDBjeUE5SUdNb01Td2dNeWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiMjlpSUQwZ2MyTmhiR1Z6T2pwemNYVnBjMmdzSUNNZ1JHVm1hVzVsSUdkeVlXUnBaVzUwSUdOdmJHOXljMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZDFhV1JsSUQwZ1ozVnBaR1ZmWTI5c2IzSmlZWElvWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVhKM2FXUjBhQ0E5SURFdU5TODFMakE0TENBZ0l5QkJaR3AxYzNRZ2QybGtkR2dnYjJZZ2RHaGxJR052Ykc5eUlHSmhjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZ5YUdWcFoyaDBJRDBnTVRVdk5TNHdPQ0FnSUNNZ1FXUnFkWE4wSUdobGFXZG9kQ0J2WmlCMGFHVWdZMjlzYjNJZ1ltRnlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tWeHVJQ0FwSUN0Y2JpQWdiR0ZpY3loNElEMGdUbFZNVEN3Z2VTQTlJRTVWVEV3cElDQXJYRzRnSUhSb1pXMWxLRnh1SUNBZ0lHRjRhWE11ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUXVlQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJQ0FnSUNBZ0l5QlNiM1JoZEdVZ2VDMWhlR2x6SUd4aFltVnNjeUEwTlNCa1pXZHlaV1Z6WEc0Z0lDQWdJQ0JvYW5WemRDQTlJREVzSUNBZ0lDQWdJQ01nUVdScWRYTjBJR2h2Y21sNmIyNTBZV3dnYW5WemRHbG1hV05oZEdsdmJseHVJQ0FnSUNBZ2RtcDFjM1FnUFNBeElDQWdJQ0FnSUNBaklFRmthblZ6ZENCMlpYSjBhV05oYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY1hIUnlZVzV6Y0dGeVpXNTBYRndwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNsY2JseHVabWxzWlU1aGJXVWdQQzBnYUdWeVpTaG1hV2RFYVhJc0lGeGNhR1ZoZEcxaGNGOWhiR3gwWVhKblpYUmZZbTl2YTIxaGNtdHBibWRmY21WblgyUnZkSEJzYjNSY1hDbGNibmRwWkhSb0lEd3RJSEJoYm1Wc1UybDZaU2d5TGpJcEttMXRWRzlKYm1Ob1hHNW9aV2xuYUhRZ1BDMGdjR0Z1Wld4VGFYcGxLRElwS20xdFZHOUpibU5vWEc0aklIQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlNZ2NISnBiblFvY0NsY2JpTWdaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc1Y2JseHVYRzVjYmx4dVhHNWNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG4jIyMjIEltcG9ydGluZyBsb29wcyBvZiB0YXJnZXRcblxudGVtcDEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldEJpbmFyeShcXEVTUlJCX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXBuby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDIgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldEJpbmFyeShcXEgzSzI3YWNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwbm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAzIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRCaW5hcnkoXFxLTEY0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cG5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0QmluYXJ5KFxcT0NUNF9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXBuby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldEJpbmFyeShcXFNPWDJfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwbm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcblxuXG5kYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUpXG5cblxuXG5yZXN1bHQudGIgPC0gZGF0YSAlPiVcbiAgbXV0YXRlKGludGVyZXN0ID0gcmVjb2RlKGludGVyZXN0LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccmVnTG9vcF9VUC9OT1xcID0gXFxVUC9OT1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxyZWdMb29wX0RPV05cXCA9IFxcRE9XTlxcKSxcbiAgICAgICAgIHRhcmdldCA9IHJlY29kZSh0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxIM0syN2FjX2VmZmllX3JldGFpbmVkXFwgPSBcXEgzSzI3YWNfcmV0YWluZWRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXEgzSzI3YWNfZWZmaWVfbG9zdFxcID0gXFxIM0syN2FjX2xvc3RcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXEVTUlJCX2RzZ19yZXRhaW5lZFxcID0gXFxFU1JSQl9yZXRhaW5lZFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcRVNSUkJfZHNnX2xvc3RcXCA9IFxcRVNSUkJfbG9zdFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcS0xGNF9lZmZpZV9yZXRhaW5lZFxcID0gXFxLTEY0X3JldGFpbmVkXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxLTEY0X2VmZmllX2xvc3RcXCA9IFxcS0xGNF9sb3N0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxPQ1Q0X2VmZmllX3JldGFpbmVkXFwgPSBcXE9DVDRfcmV0YWluZWRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXE9DVDRfZWZmaWVfbG9zdFxcID0gXFxPQ1Q0X2xvc3RcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXFNPWDJfZWZmaWVfcmV0YWluZWRcXCA9IFxcU09YMl9yZXRhaW5lZFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcU09YMl9lZmZpZV9sb3N0XFwgPSBcXFNPWDJfbG9zdFxcKSlcblxucmVzdWx0LnRiJGludGVyZXN0IDwtIGZhY3RvcihyZXN1bHQudGIkaW50ZXJlc3QsIGxldmVscyA9IGMoXFxVUC9OT1xcLCBcXERPV05cXCkpXG5yZXN1bHQudGIkdGFyZ2V0IDwtIGZhY3RvcihyZXN1bHQudGIkdGFyZ2V0LCBsZXZlbHMgPSByZXYoYyhcXEgzSzI3YWNfcmV0YWluZWRcXCwgXFxIM0syN2FjX2xvc3RcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxFU1JSQl9yZXRhaW5lZFxcLCBcXEVTUlJCX2xvc3RcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxLTEY0X3JldGFpbmVkXFwsIFxcS0xGNF9sb3N0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcT0NUNF9yZXRhaW5lZFxcLCBcXE9DVDRfbG9zdFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFNPWDJfcmV0YWluZWRcXCxcXFNPWDJfbG9zdFxcKSkpXG5cbnAgPC0gZ2dwbG90KHJlc3VsdC50YiwgYWVzKHggPSBpbnRlcmVzdCwgeSA9IHRhcmdldCwgc2l6ZSA9IC1sb2cxMChwdmFsdWUpLCBmaWxsID0gb2Rkc1JhdGlvKSkgK1xuICBnZW9tX3BvaW50KHNoYXBlID0gMjEsICAgICAgICAjIEVuc3VyZXMgYSBwb2ludCB3aXRoIGFuIG91dGxpbmVcbiAgICAgICAgICAgICBzdHJva2UgPSAxKnB0VG9NTSAgICAgICMgTGluZSB3aWR0aCBmb3IgdGhlIGJvcmRlclxuICApICsgdGhlbWVfYncoKSArIFxuICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDMpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlXG4gIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycyA9IGMoXFwjNDg1MkEwXFwsIFxcd2hpdGVcXCwgXFwjQ0IzMzNBXFwpLCAgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gc2NhbGVzOjpyZXNjYWxlKGMoMC41LCAxLCAxLjUpKSwgbGltaXRzID0gYygwLjUsIDEuNSksIFxuICAgICAgICAgICAgICAgICAgICAgICNsb3cgPSBcXHdoaXRlXFwsIGhpZ2ggPSBcXCNDQjMzM0FcXCxcbiAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLCAzKSxcbiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICkgK1xuICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKVxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFxoZWF0bWFwX2FsbHRhcmdldF9ib29rbWFya2luZ19yZWdfZG90cGxvdFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDIuMikqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cblxuXG5cblxuXG5cblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgdGFyZ2V0XG5cbnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRCaW5hcnkoXFxFU1JSQl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwbm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRCaW5hcnkoXFxIM0syN2FjX2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cG5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0QmluYXJ5KFxcS0xGNF9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXBuby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldEJpbmFyeShcXE9DVDRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwbm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRCaW5hcnkoXFxTT1gyX2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cG5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG5cblxuZGF0YSA8LSBiaW5kX3Jvd3ModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1KVxuXG5cblxucmVzdWx0LnRiIDwtIGRhdGEgJT4lXG4gIG11dGF0ZShpbnRlcmVzdCA9IHJlY29kZShpbnRlcmVzdCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcXHJlZ0xvb3BfVVAvTk9cXCA9IFxcVVAvTk9cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccmVnTG9vcF9ET1dOXFwgPSBcXERPV05cXCksXG4gICAgICAgICB0YXJnZXQgPSByZWNvZGUodGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcSDNLMjdhY19lZmZpZV9yZXRhaW5lZFxcID0gXFxIM0syN2FjX3JldGFpbmVkXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxIM0syN2FjX2VmZmllX2xvc3RcXCA9IFxcSDNLMjdhY19sb3N0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxFU1JSQl9kc2dfcmV0YWluZWRcXCA9IFxcRVNSUkJfcmV0YWluZWRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXEVTUlJCX2RzZ19sb3N0XFwgPSBcXEVTUlJCX2xvc3RcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXEtMRjRfZWZmaWVfcmV0YWluZWRcXCA9IFxcS0xGNF9yZXRhaW5lZFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcS0xGNF9lZmZpZV9sb3N0XFwgPSBcXEtMRjRfbG9zdFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcT0NUNF9lZmZpZV9yZXRhaW5lZFxcID0gXFxPQ1Q0X3JldGFpbmVkXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxPQ1Q0X2VmZmllX2xvc3RcXCA9IFxcT0NUNF9sb3N0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxTT1gyX2VmZmllX3JldGFpbmVkXFwgPSBcXFNPWDJfcmV0YWluZWRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXFNPWDJfZWZmaWVfbG9zdFxcID0gXFxTT1gyX2xvc3RcXCkpXG5cbnJlc3VsdC50YiRpbnRlcmVzdCA8LSBmYWN0b3IocmVzdWx0LnRiJGludGVyZXN0LCBsZXZlbHMgPSBjKFxcVVAvTk9cXCwgXFxET1dOXFwpKVxucmVzdWx0LnRiJHRhcmdldCA8LSBmYWN0b3IocmVzdWx0LnRiJHRhcmdldCwgbGV2ZWxzID0gcmV2KGMoXFxIM0syN2FjX3JldGFpbmVkXFwsIFxcSDNLMjdhY19sb3N0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcRVNSUkJfcmV0YWluZWRcXCwgXFxFU1JSQl9sb3N0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcS0xGNF9yZXRhaW5lZFxcLCBcXEtMRjRfbG9zdFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXE9DVDRfcmV0YWluZWRcXCwgXFxPQ1Q0X2xvc3RcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTT1gyX3JldGFpbmVkXFwsXFxTT1gyX2xvc3RcXCkpKVxuXG5wIDwtIGdncGxvdChyZXN1bHQudGIsIGFlcyh4ID0gaW50ZXJlc3QsIHkgPSB0YXJnZXQsIHNpemUgPSAtbG9nMTAocHZhbHVlKSwgZmlsbCA9IG9kZHNSYXRpbykpICtcbiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lXG4gICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0gICAgICAjIExpbmUgd2lkdGggZm9yIHRoZSBib3JkZXJcbiAgKSArIHRoZW1lX2J3KCkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCAzKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnMgPSBjKFxcIzQ4NTJBMFxcLCBcXHdoaXRlXFwsIFxcI0NCMzMzQVxcKSwgICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHNjYWxlczo6cmVzY2FsZShjKDAuNSwgMSwgMS41KSksIGxpbWl0cyA9IGMoMC41LCAxLjUpLCBcbiAgICAgICAgICAgICAgICAgICAgICAjbG93ID0gXFx3aGl0ZVxcLCBoaWdoID0gXFwjQ0IzMzNBXFwsXG4gICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICtcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcaGVhdG1hcF9hbGx0YXJnZXRfYm9va21hcmtpbmdfcmVnX2RvdHBsb3RcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgyLjIpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoXG4jIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5zdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cblxuXG5cblxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
#### Importing loops of target

temp1 <- runFisherExactCombinationTargetBinary(\ESRRB_dsg\, interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTargetBinary(\H3K27ac_effie\, interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTargetBinary(\KLF4_effie\, interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTargetBinary(\OCT4_effie\, interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTargetBinary(\SOX2_effie\, interestName,
                                      loop.upno.gr, loop.down.gr,
                                      background.gr)


data <- bind_rows(temp1, temp2, temp3, temp4, temp5)



result.tb <- data %>%
  mutate(interest = recode(interest, 
                           \regLoop_UP/NO\ = \UP/NO\,
                           \regLoop_DOWN\ = \DOWN\),
         target = recode(target,
                         \H3K27ac_effie_retained\ = \H3K27ac_retained\,
                         \H3K27ac_effie_lost\ = \H3K27ac_lost\,
                         \ESRRB_dsg_retained\ = \ESRRB_retained\,
                         \ESRRB_dsg_lost\ = \ESRRB_lost\,
                         \KLF4_effie_retained\ = \KLF4_retained\,
                         \KLF4_effie_lost\ = \KLF4_lost\,
                         \OCT4_effie_retained\ = \OCT4_retained\,
                         \OCT4_effie_lost\ = \OCT4_lost\,
                         \SOX2_effie_retained\ = \SOX2_retained\,
                         \SOX2_effie_lost\ = \SOX2_lost\))

result.tb$interest <- factor(result.tb$interest, levels = c(\UP/NO\, \DOWN\))
result.tb$target <- factor(result.tb$target, levels = rev(c(\H3K27ac_retained\, \H3K27ac_lost\,
                                                        \ESRRB_retained\, \ESRRB_lost\,
                                                        \KLF4_retained\, \KLF4_lost\,
                                                        \OCT4_retained\, \OCT4_lost\,
                                                        \SOX2_retained\,\SOX2_lost\)))

p <- ggplot(result.tb, aes(x = interest, y = target, size = -log10(pvalue), fill = oddsRatio)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(1, 3)) +  # Set min and max point sizes here
  scale_fill_gradientn(colors = c(\#4852A0\, \white\, \#CB333A\),  # Define gradient colors
                      values = scales::rescale(c(0.5, 1, 1.5)), limits = c(0.5, 1.5), 
                      #low = \white\, high = \#CB333A\,
                      #                  limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) +
  labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- here(figDir, \heatmap_alltarget_bookmarking_reg_dotplot\)
width <- panelSize(2.2)*mmToInch
height <- panelSize(2)*mmToInch
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
svglite(paste0(fileName, \.svg\),  height = height, width = width)
print(p)
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

###### Figure - H3K27ac only

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlCSmJYQnZjblJwYm1jZ2JHOXZjSE1nYjJZZ2RHRnlaMlYwWEc1MFpXMXdNU0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRndpUVZSQlExOWxabVpwWlZ3aUxDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBeUlEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hDSkRWRU5HWENJc0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RNZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY0lrVlRVbEpDWDJSeloxd2lMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTBJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YQ0pGVTFKU1FsOU9RMEpjSWl3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TlNBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z3aVJWTlNVa0pmY0daaFhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNEWWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJa2d6U3pJM1lXTmZaV1ptYVdWY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd055QThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMEtGd2lTMHhHTkY5bFptWnBaVndpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEE0SUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWENKT1FVNVBSMTlrYzJkY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd09TQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMEtGd2lUa0ZPVDBkZmNHWmhYQ0lzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5S1Z4dWRHVnRjREV3SUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWENKUFExUTBYMlZtWm1sbFhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNERXhJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YQ0pQUTFRMFgyUnpaMXdpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEF4TWlBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z3aVQwTlVORjl3Wm1GY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01UTWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJbE5OUXpGY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01UUWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJbE5QV0RKZlpXWm1hV1ZjSWl3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TVRVZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY0lsTlBXREpmWkhOblhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNERTJJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YQ0pUVDFneVgzQm1ZVndpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEF4TnlBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z3aVZFSlFYQ0lzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5S1Z4dVhHNWNibHh1WEc1a1lYUmhJRHd0SUdKcGJtUmZjbTkzY3loMFpXMXdNU3dnZEdWdGNESXNJSFJsYlhBekxDQjBaVzF3TkN3Z2RHVnRjRFVzWEc0Z0lDQWdJQ0FnSUNCMFpXMXdOaXdnZEdWdGNEY3NJSFJsYlhBNExDQjBaVzF3T1N3Z2RHVnRjREV3TEZ4dUlDQWdJQ0FnSUNBZ2RHVnRjREV4TENCMFpXMXdNVElzSUhSbGJYQXhNeXdnZEdWdGNERTBMQ0IwWlcxd01UVXNJSFJsYlhBeE5pQXNkR1Z0Y0RFM0tWeHVYRzRqSUZacGMzVmhiR2w2WVhScGIyNWNibXhwWW5KaGNua29ZMmx5WTJ4cGVtVXBYRzVjYm1obFlYUnRZWEJmWkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2FXNTBaWEpsYzNRc0lHOWtaSE5TWVhScGJ5a2dKVDRsWEc1d2FYWnZkRjkzYVdSbGNpaHVZVzFsYzE5bWNtOXRJRDBnYVc1MFpYSmxjM1FzSUhaaGJIVmxjMTltY205dElEMGdiMlJrYzFKaGRHbHZLU0FsUGlWY2JpQWdZMjlzZFcxdVgzUnZYM0p2ZDI1aGJXVnpLSFpoY2lBOUlGd2lkR0Z5WjJWMFhDSXBYRzVjYm5CMllXeDFaVjlrWVhSaElEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCcGJuUmxjbVZ6ZEN3Z2NIWmhiSFZsS1NBbFBpVmNiaUFnY0dsMmIzUmZkMmxrWlhJb2JtRnRaWE5mWm5KdmJTQTlJR2x1ZEdWeVpYTjBMQ0IyWVd4MVpYTmZabkp2YlNBOUlIQjJZV3gxWlNrZ0pUNGxYRzRnSUdOdmJIVnRibDkwYjE5eWIzZHVZVzFsY3loMllYSWdQU0JjSW5SaGNtZGxkRndpS1Z4dVhHNWpiMnhmWm5WdUlEd3RJR052Ykc5eVVtRnRjRElvWXlnd0xDQXhMQ0ExS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWXloY0ltSnNkV1ZjSWl3Z1hDSjNhR2wwWlZ3aUxDQmNJbkpsWkZ3aUtTbGNibHh1U0dWaGRHMWhjQ2hoY3k1dFlYUnlhWGdvYUdWaGRHMWhjRjlrWVhSaEtTeGNiaUFnSUNBZ0lDQWdibUZ0WlNBOUlGd2lUMlJrY3lCU1lYUnBiMXdpTEZ4dUlDQWdJQ0FnSUNCamIyd2dQU0JqYjJ4ZlpuVnVMRnh1SUNBZ0lDQWdJQ0FqSUVGa1pDQmhibTV2ZEdGMGFXOXVJR1p2Y2lCd0xYWmhiSFZsYzF4dUlDQWdJQ0FnSUNCalpXeHNYMloxYmlBOUlHWjFibU4wYVc5dUtHb3NJR2tzSUhnc0lIa3NJSGRwWkhSb0xDQm9aV2xuYUhRc0lHWnBiR3dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQndkbUZzSUR3dElIQjJZV3gxWlY5a1lYUmhXMmtzSUdwZFhHNGdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BDMGdhV1psYkhObEtIQjJZV3dnUGlBd0xqQTFMQ0JjSW00dWN5NWNJaXdnYzNCeWFXNTBaaWhjSWlVdU1tVmNJaXdnY0haaGJDa3BYRzRnSUNBZ0lDQWdJQ0FnWjNKcFpDNTBaWGgwS0d4aFltVnNMQ0I0TENCNUxDQm5jQ0E5SUdkd1lYSW9abTl1ZEhOcGVtVWdQU0F4TUNrcFhHNGdJQ0FnSUNBZ0lIMHNYRzRnSUNBZ0lDQWdJQ01nUTNWemRHOXRhWHBsSUhSb1pTQm9aV0YwYldGd0lHeGhlVzkxZEZ4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5WDNKdmQzTWdQU0JVVWxWRkxGeHVJQ0FnSUNBZ0lDQnphRzkzWDNKdmQxOWtaVzVrSUQwZ1JrRk1VMFVzWEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpmWTI5c2RXMXVjeUE5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JqYjJ4MWJXNWZkR2wwYkdVZ1BTQmNJa2x1ZEdWeVpYTjBYQ0lzWEc0Z0lDQWdJQ0FnSUhKdmQxOTBhWFJzWlNBOUlGd2lWR0Z5WjJWMFhDSXNYRzRnSUNBZ0lDQWdJR2hsWVhSdFlYQmZiR1ZuWlc1a1gzQmhjbUZ0SUQwZ2JHbHpkQ2hoZENBOUlHTW9NQ3dnTVN3Z01pd2dNeXdnTkN3Z05Ta3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdGaVpXeHpJRDBnWXloY0lqQmNJaXdnWENJeFhDSXNJRndpTWx3aUxDQmNJak5jSWl3Z1hDSTBYQ0lzSUZ3aU5Wd2lLU2twWEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG4jIyMjIEltcG9ydGluZyBsb29wcyBvZiB0YXJnZXRcbnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxBVEFDX2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDIgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXENUQ0ZcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcRVNSUkJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEVTUlJCX05DQlxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxFU1JSQl9wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxLTEY0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDggPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE5BTk9HX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA5IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxOQU5PR19wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE9DVDRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE9DVDRfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDEyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X3BmYVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU01DMVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxNCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU09YMl9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNPWDJfcGZhXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDE3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxUQlBcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG5cblxuXG5cbmRhdGEgPC0gYmluZF9yb3dzKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSxcbiAgICAgICAgIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsXG4gICAgICAgICB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2ICx0ZW1wMTcpXG5cbiMgVmlzdWFsaXphdGlvblxubGlicmFyeShjaXJjbGl6ZSlcblxuaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiVcbnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxucHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JVxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDUpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5IZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLFxuICAgICAgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4sXG4gICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzXG4gICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkge1xuICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal1cbiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsIFxcbi5zLlxcLCBzcHJpbnRmKFxcJS4yZVxcLCBwdmFsKSlcbiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSlcbiAgICAgICAgfSxcbiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0XG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIGNvbHVtbl90aXRsZSA9IFxcSW50ZXJlc3RcXCxcbiAgICAgICAgcm93X3RpdGxlID0gXFxUYXJnZXRcXCxcbiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGF0ID0gYygwLCAxLCAyLCAzLCA0LCA1KSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKFxcMFxcLCBcXDFcXCwgXFwyXFwsIFxcM1xcLCBcXDRcXCwgXFw1XFwpKSlcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
#### Importing loops of target
temp1 <- runFisherExactCombinationTarget(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTarget(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTarget(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTarget(\ESRRB_NCB\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTarget(\ESRRB_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTarget(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTarget(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTarget(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTarget(\NANOG_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTarget(\OCT4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp11 <- runFisherExactCombinationTarget(\OCT4_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp12 <- runFisherExactCombinationTarget(\OCT4_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp13 <- runFisherExactCombinationTarget(\SMC1\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp14 <- runFisherExactCombinationTarget(\SOX2_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp15 <- runFisherExactCombinationTarget(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp16 <- runFisherExactCombinationTarget(\SOX2_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp17 <- runFisherExactCombinationTarget(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10,
         temp11, temp12, temp13, temp14, temp15, temp16 ,temp17)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 5), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3, 4, 5), 
                                    labels = c(\0\, \1\, \2\, \3\, \4\, \5\)))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeUJKYlhCdmNuUnBibWNnYkc5dmNITWdiMllnZEdGeVoyVjBYRzUwWlcxd01TQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMEtGeGNRVlJCUTE5bFptWnBaVnhjTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEF5SUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWEZ4RFZFTkdYRndzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5S1Z4dWRHVnRjRE1nUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkQ2hjWEVWVFVsSkNYMlJ6WjF4Y0xDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBMElEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hGeEZVMUpTUWw5T1EwSmNYQ3dnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdOU0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRnhjUlZOU1VrSmZjR1poWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RZZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hFZ3pTekkzWVdOZlpXWm1hV1ZjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TnlBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z4Y1MweEdORjlsWm1acFpWeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTRJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YRnhPUVU1UFIxOWtjMmRjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3T1NBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z4Y1RrRk9UMGRmY0daaFhGd3NJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNERXdJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YRnhQUTFRMFgyVm1abWxsWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RFeElEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hGeFBRMVEwWDJSeloxeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXhNaUE4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRnhjVDBOVU5GOXdabUZjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TVRNZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hGTk5RekZjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TVRRZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hGTlBXREpmWldabWFXVmNYQ3dnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdNVFVnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkQ2hjWEZOUFdESmZaSE5uWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RFMklEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hGeFRUMWd5WDNCbVlWeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXhOeUE4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRnhjVkVKUVhGd3NJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1WEc1Y2JseHVYRzVrWVhSaElEd3RJR0pwYm1SZmNtOTNjeWgwWlcxd01Td2dkR1Z0Y0RJc0lIUmxiWEF6TENCMFpXMXdOQ3dnZEdWdGNEVXNYRzRnSUNBZ0lDQWdJQ0IwWlcxd05pd2dkR1Z0Y0Rjc0lIUmxiWEE0TENCMFpXMXdPU3dnZEdWdGNERXdMRnh1SUNBZ0lDQWdJQ0FnZEdWdGNERXhMQ0IwWlcxd01USXNJSFJsYlhBeE15d2dkR1Z0Y0RFMExDQjBaVzF3TVRVc0lIUmxiWEF4TmlBc2RHVnRjREUzS1Z4dVhHNGpJRlpwYzNWaGJHbDZZWFJwYjI1Y2JteHBZbkpoY25rb1kybHlZMnhwZW1VcFhHNWNibWhsWVhSdFlYQmZaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYVc1MFpYSmxjM1FzSUc5a1pITlNZWFJwYnlrZ0pUNGxYRzV3YVhadmRGOTNhV1JsY2lodVlXMWxjMTltY205dElEMGdhVzUwWlhKbGMzUXNJSFpoYkhWbGMxOW1jbTl0SUQwZ2IyUmtjMUpoZEdsdktTQWxQaVZjYmlBZ1kyOXNkVzF1WDNSdlgzSnZkMjVoYldWektIWmhjaUE5SUZ4Y2RHRnlaMlYwWEZ3cFhHNWNibkIyWVd4MVpWOWtZWFJoSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0JwYm5SbGNtVnpkQ3dnY0haaGJIVmxLU0FsUGlWY2JpQWdjR2wyYjNSZmQybGtaWElvYm1GdFpYTmZabkp2YlNBOUlHbHVkR1Z5WlhOMExDQjJZV3gxWlhOZlpuSnZiU0E5SUhCMllXeDFaU2tnSlQ0bFhHNGdJR052YkhWdGJsOTBiMTl5YjNkdVlXMWxjeWgyWVhJZ1BTQmNYSFJoY21kbGRGeGNLVnh1WEc1amIyeGZablZ1SUR3dElHTnZiRzl5VW1GdGNESW9ZeWd3TENBeExDQTFLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZeWhjWEdKc2RXVmNYQ3dnWEZ4M2FHbDBaVnhjTENCY1hISmxaRnhjS1NsY2JseHVTR1ZoZEcxaGNDaGhjeTV0WVhSeWFYZ29hR1ZoZEcxaGNGOWtZWFJoS1N4Y2JpQWdJQ0FnSUNBZ2JtRnRaU0E5SUZ4Y1QyUmtjeUJTWVhScGIxeGNMRnh1SUNBZ0lDQWdJQ0JqYjJ3Z1BTQmpiMnhmWm5WdUxGeHVJQ0FnSUNBZ0lDQWpJRUZrWkNCaGJtNXZkR0YwYVc5dUlHWnZjaUJ3TFhaaGJIVmxjMXh1SUNBZ0lDQWdJQ0JqWld4c1gyWjFiaUE5SUdaMWJtTjBhVzl1S0dvc0lHa3NJSGdzSUhrc0lIZHBaSFJvTENCb1pXbG5hSFFzSUdacGJHd3BJSHRjYmlBZ0lDQWdJQ0FnSUNCd2RtRnNJRHd0SUhCMllXeDFaVjlrWVhSaFcya3NJR3BkWEc0Z0lDQWdJQ0FnSUNBZ2JHRmlaV3dnUEMwZ2FXWmxiSE5sS0hCMllXd2dQaUF3TGpBMUxDQmNYRzR1Y3k1Y1hDd2djM0J5YVc1MFppaGNYQ1V1TW1WY1hDd2djSFpoYkNrcFhHNGdJQ0FnSUNBZ0lDQWdaM0pwWkM1MFpYaDBLR3hoWW1Wc0xDQjRMQ0I1TENCbmNDQTlJR2R3WVhJb1ptOXVkSE5wZW1VZ1BTQXhNQ2twWEc0Z0lDQWdJQ0FnSUgwc1hHNGdJQ0FnSUNBZ0lDTWdRM1Z6ZEc5dGFYcGxJSFJvWlNCb1pXRjBiV0Z3SUd4aGVXOTFkRnh1SUNBZ0lDQWdJQ0JqYkhWemRHVnlYM0p2ZDNNZ1BTQlVVbFZGTEZ4dUlDQWdJQ0FnSUNCemFHOTNYM0p2ZDE5a1pXNWtJRDBnUmtGTVUwVXNYRzRnSUNBZ0lDQWdJR05zZFhOMFpYSmZZMjlzZFcxdWN5QTlJRVpCVEZORkxGeHVJQ0FnSUNBZ0lDQmpiMngxYlc1ZmRHbDBiR1VnUFNCY1hFbHVkR1Z5WlhOMFhGd3NYRzRnSUNBZ0lDQWdJSEp2ZDE5MGFYUnNaU0E5SUZ4Y1ZHRnlaMlYwWEZ3c1hHNGdJQ0FnSUNBZ0lHaGxZWFJ0WVhCZmJHVm5aVzVrWDNCaGNtRnRJRDBnYkdsemRDaGhkQ0E5SUdNb01Dd2dNU3dnTWl3Z015d2dOQ3dnTlNrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld4eklEMGdZeWhjWERCY1hDd2dYRnd4WEZ3c0lGeGNNbHhjTENCY1hETmNYQ3dnWEZ3MFhGd3NJRnhjTlZ4Y0tTa3BYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgdGFyZ2V0XG50ZW1wMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcQVRBQ19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxDVENGXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEVTUlJCX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxFU1JSQl9OQ0JcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcRVNSUkJfcGZhXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEgzSzI3YWNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcS0xGNF9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxOQU5PR19kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcTkFOT0dfcGZhXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDEwIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDExIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcT0NUNF9wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNNQzFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNPWDJfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNPWDJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDE2IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxTT1gyX3BmYVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcVEJQXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxuXG5cblxuXG5kYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsXG4gICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLFxuICAgICAgICAgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiAsdGVtcDE3KVxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCA1KSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjb2x1bW5fdGl0bGUgPSBcXEludGVyZXN0XFwsXG4gICAgICAgIHJvd190aXRsZSA9IFxcVGFyZ2V0XFwsXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMywgNCwgNSksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcLCBcXDNcXCwgXFw0XFwsIFxcNVxcKSkpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgdGFyZ2V0XG50ZW1wMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcQVRBQ19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxDVENGXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEVTUlJCX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxFU1JSQl9OQ0JcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcRVNSUkJfcGZhXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEgzSzI3YWNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcS0xGNF9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxOQU5PR19kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcTkFOT0dfcGZhXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDEwIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDExIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcT0NUNF9wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNNQzFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNPWDJfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNPWDJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDE2IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxTT1gyX3BmYVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcVEJQXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxuXG5cblxuXG5kYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsXG4gICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLFxuICAgICAgICAgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiAsdGVtcDE3KVxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCA1KSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjb2x1bW5fdGl0bGUgPSBcXEludGVyZXN0XFwsXG4gICAgICAgIHJvd190aXRsZSA9IFxcVGFyZ2V0XFwsXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMywgNCwgNSksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcLCBcXDNcXCwgXFw0XFwsIFxcNVxcKSkpXG5cbmBgYFxuYGBgIn0= -->

```r
```r
#### Importing loops of target
temp1 <- runFisherExactCombinationTarget(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTarget(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTarget(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTarget(\ESRRB_NCB\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTarget(\ESRRB_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTarget(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTarget(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTarget(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTarget(\NANOG_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTarget(\OCT4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp11 <- runFisherExactCombinationTarget(\OCT4_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp12 <- runFisherExactCombinationTarget(\OCT4_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp13 <- runFisherExactCombinationTarget(\SMC1\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp14 <- runFisherExactCombinationTarget(\SOX2_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp15 <- runFisherExactCombinationTarget(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp16 <- runFisherExactCombinationTarget(\SOX2_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp17 <- runFisherExactCombinationTarget(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10,
         temp11, temp12, temp13, temp14, temp15, temp16 ,temp17)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 5), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3, 4, 5), 
                                    labels = c(\0\, \1\, \2\, \3\, \4\, \5\)))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

###### Figure - all targets

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzRqSXlNaklFbHRjRzl5ZEdsdVp5QnNiMjl3Y3lCdlppQjBZWEpuWlhSY2JuUmxiWEF4SUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFJTWlhSaGFXNWxaQ2hjSWtGVVFVTmZaV1ptYVdWY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01pQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMFVtVjBZV2x1WldRb1hDSkRWRU5HWENJc0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RNZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZEZKbGRHRnBibVZrS0Z3aVJWTlNVa0pmWkhOblhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNEUWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRGSmxkR0ZwYm1Wa0tGd2lSVk5TVWtKZlRrTkNYQ0lzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5S1Z4dWRHVnRjRFVnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkRkpsZEdGcGJtVmtLRndpUlZOU1VrSmZjR1poWENJc0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RZZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZEZKbGRHRnBibVZrS0Z3aVNETkxNamRoWTE5bFptWnBaVndpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEEzSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFJTWlhSaGFXNWxaQ2hjSWt0TVJqUmZaV1ptYVdWY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd09DQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMFVtVjBZV2x1WldRb1hDSk9RVTVQUjE5a2MyZGNJaXdnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdPU0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBVbVYwWVdsdVpXUW9YQ0pPUVU1UFIxOXdabUZjSWl3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TVRBZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZEZKbGRHRnBibVZrS0Z3aVQwTlVORjlsWm1acFpWd2lMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXhNU0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBVbVYwWVdsdVpXUW9YQ0pQUTFRMFgyUnpaMXdpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEF4TWlBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwVW1WMFlXbHVaV1FvWENKUFExUTBYM0JtWVZ3aUxDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBeE15QThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMFVtVjBZV2x1WldRb1hDSlRUVU14WENJc0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RFMElEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhSU1pYUmhhVzVsWkNoY0lsTlBXREpmWldabWFXVmNJaXdnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdNVFVnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkRkpsZEdGcGJtVmtLRndpVTA5WU1sOWtjMmRjSWl3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TVRZZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZEZKbGRHRnBibVZrS0Z3aVUwOVlNbDl3Wm1GY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01UY2dQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRGSmxkR0ZwYm1Wa0tGd2lWRUpRWENJc0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVYRzVjYmx4dVhHNWtZWFJoSUR3dElHSnBibVJmY205M2N5aDBaVzF3TVN3Z2RHVnRjRElzSUhSbGJYQXpMQ0IwWlcxd05Dd2dkR1Z0Y0RVc1hHNGdJQ0FnSUNBZ0lDQjBaVzF3Tml3Z2RHVnRjRGNzSUhSbGJYQTRMQ0IwWlcxd09Td2dkR1Z0Y0RFd0xGeHVJQ0FnSUNBZ0lDQWdkR1Z0Y0RFeExDQjBaVzF3TVRJc0lIUmxiWEF4TXl3Z2RHVnRjREUwTENCMFpXMXdNVFVzSUhSbGJYQXhOaUFzZEdWdGNERTNLVnh1WEc0aklGWnBjM1ZoYkdsNllYUnBiMjVjYm14cFluSmhjbmtvWTJseVkyeHBlbVVwWEc1Y2JtaGxZWFJ0WVhCZlpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSFJoY21kbGRDd2dhVzUwWlhKbGMzUXNJRzlrWkhOU1lYUnBieWtnSlQ0bFhHNXdhWFp2ZEY5M2FXUmxjaWh1WVcxbGMxOW1jbTl0SUQwZ2FXNTBaWEpsYzNRc0lIWmhiSFZsYzE5bWNtOXRJRDBnYjJSa2MxSmhkR2x2S1NBbFBpVmNiaUFnWTI5c2RXMXVYM1J2WDNKdmQyNWhiV1Z6S0haaGNpQTlJRndpZEdGeVoyVjBYQ0lwWEc1Y2JuQjJZV3gxWlY5a1lYUmhJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnBiblJsY21WemRDd2djSFpoYkhWbEtTQWxQaVZjYmlBZ2NHbDJiM1JmZDJsa1pYSW9ibUZ0WlhOZlpuSnZiU0E5SUdsdWRHVnlaWE4wTENCMllXeDFaWE5mWm5KdmJTQTlJSEIyWVd4MVpTa2dKVDRsWEc0Z0lHTnZiSFZ0Ymw5MGIxOXliM2R1WVcxbGN5aDJZWElnUFNCY0luUmhjbWRsZEZ3aUtWeHVYRzVqYjJ4ZlpuVnVJRHd0SUdOdmJHOXlVbUZ0Y0RJb1l5Z3dMQ0F4TENBektTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1l5aGNJbUpzZFdWY0lpd2dYQ0ozYUdsMFpWd2lMQ0JjSW5KbFpGd2lLU2xjYmx4dVNHVmhkRzFoY0NoaGN5NXRZWFJ5YVhnb2FHVmhkRzFoY0Y5a1lYUmhLU3hjYmlBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpVDJSa2N5QlNZWFJwYjF3aUxGeHVJQ0FnSUNBZ0lDQmpiMndnUFNCamIyeGZablZ1TEZ4dUlDQWdJQ0FnSUNBaklFRmtaQ0JoYm01dmRHRjBhVzl1SUdadmNpQndMWFpoYkhWbGMxeHVJQ0FnSUNBZ0lDQmpaV3hzWDJaMWJpQTlJR1oxYm1OMGFXOXVLR29zSUdrc0lIZ3NJSGtzSUhkcFpIUm9MQ0JvWldsbmFIUXNJR1pwYkd3cElIdGNiaUFnSUNBZ0lDQWdJQ0J3ZG1Gc0lEd3RJSEIyWVd4MVpWOWtZWFJoVzJrc0lHcGRYRzRnSUNBZ0lDQWdJQ0FnYkdGaVpXd2dQQzBnYVdabGJITmxLSEIyWVd3Z1BpQXdMakExTENCY0ltNHVjeTVjSWl3Z2MzQnlhVzUwWmloY0lpVXVNbVZjSWl3Z2NIWmhiQ2twWEc0Z0lDQWdJQ0FnSUNBZ1ozSnBaQzUwWlhoMEtHeGhZbVZzTENCNExDQjVMQ0JuY0NBOUlHZHdZWElvWm05dWRITnBlbVVnUFNBeE1Da3BYRzRnSUNBZ0lDQWdJSDBzWEc0Z0lDQWdJQ0FnSUNNZ1EzVnpkRzl0YVhwbElIUm9aU0JvWldGMGJXRndJR3hoZVc5MWRGeHVJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeVgzSnZkM01nUFNCVVVsVkZMRnh1SUNBZ0lDQWdJQ0J6YUc5M1gzSnZkMTlrWlc1a0lEMGdSa0ZNVTBVc1hHNGdJQ0FnSUNBZ0lHTnNkWE4wWlhKZlkyOXNkVzF1Y3lBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCamIyeDFiVzVmZEdsMGJHVWdQU0JjSWtsdWRHVnlaWE4wWENJc1hHNGdJQ0FnSUNBZ0lISnZkMTkwYVhSc1pTQTlJRndpVkdGeVoyVjBYQ0lzWEc0Z0lDQWdJQ0FnSUdobFlYUnRZWEJmYkdWblpXNWtYM0JoY21GdElEMGdiR2x6ZENoaGRDQTlJR01vTUN3Z01Td2dNaXdnTXlrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld4eklEMGdZeWhjSWpCY0lpd2dYQ0l4WENJc0lGd2lNbHdpTENCY0lqTmNJaWtwS1Z4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuXG4jIyMjIEltcG9ydGluZyBsb29wcyBvZiB0YXJnZXRcbnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXEFUQUNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxDVENGXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcRVNSUkJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcRVNSUkJfTkNCXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcRVNSUkJfcGZhXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXEtMRjRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxOQU5PR19kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxOQU5PR19wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcT0NUNF9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxPQ1Q0X2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxPQ1Q0X3BmYVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxTTUMxXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDE0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXFNPWDJfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcU09YMl9wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTcgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcVEJQXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxuXG5cblxuXG5kYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsXG4gICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLFxuICAgICAgICAgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiAsdGVtcDE3KVxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAzKSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjb2x1bW5fdGl0bGUgPSBcXEludGVyZXN0XFwsXG4gICAgICAgIHJvd190aXRsZSA9IFxcVGFyZ2V0XFwsXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcLCBcXDNcXCkpKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->

#### Importing loops of target
temp1 <- runFisherExactCombinationTargetRetained(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTargetRetained(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTargetRetained(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTargetRetained(\ESRRB_NCB\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTargetRetained(\ESRRB_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTargetRetained(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTargetRetained(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTargetRetained(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTargetRetained(\NANOG_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTargetRetained(\OCT4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp11 <- runFisherExactCombinationTargetRetained(\OCT4_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp12 <- runFisherExactCombinationTargetRetained(\OCT4_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp13 <- runFisherExactCombinationTargetRetained(\SMC1\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp14 <- runFisherExactCombinationTargetRetained(\SOX2_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp15 <- runFisherExactCombinationTargetRetained(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp16 <- runFisherExactCombinationTargetRetained(\SOX2_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp17 <- runFisherExactCombinationTargetRetained(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10,
         temp11, temp12, temp13, temp14, temp15, temp16 ,temp17)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 3), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3), 
                                    labels = c(\0\, \1\, \2\, \3\)))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNGpJeU1qSUVsdGNHOXlkR2x1WnlCc2IyOXdjeUJ2WmlCMFlYSm5aWFJjYm5SbGJYQXhJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUlNaWFJoYVc1bFpDaGNYRUZVUVVOZlpXWm1hV1ZjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TWlBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwVW1WMFlXbHVaV1FvWEZ4RFZFTkdYRndzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5S1Z4dWRHVnRjRE1nUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkRkpsZEdGcGJtVmtLRnhjUlZOU1VrSmZaSE5uWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RRZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZEZKbGRHRnBibVZrS0Z4Y1JWTlNVa0pmVGtOQ1hGd3NJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNEVWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRGSmxkR0ZwYm1Wa0tGeGNSVk5TVWtKZmNHWmhYRndzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5S1Z4dWRHVnRjRFlnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkRkpsZEdGcGJtVmtLRnhjU0ROTE1qZGhZMTlsWm1acFpWeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTNJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUlNaWFJoYVc1bFpDaGNYRXRNUmpSZlpXWm1hV1ZjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3T0NBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwVW1WMFlXbHVaV1FvWEZ4T1FVNVBSMTlrYzJkY1hDd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd09TQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMFVtVjBZV2x1WldRb1hGeE9RVTVQUjE5d1ptRmNYQ3dnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdNVEFnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkRkpsZEdGcGJtVmtLRnhjVDBOVU5GOWxabVpwWlZ4Y0xDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBeE1TQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMFVtVjBZV2x1WldRb1hGeFBRMVEwWDJSeloxeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXhNaUE4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBVbVYwWVdsdVpXUW9YRnhQUTFRMFgzQm1ZVnhjTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEF4TXlBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwVW1WMFlXbHVaV1FvWEZ4VFRVTXhYRndzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5S1Z4dWRHVnRjREUwSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFJTWlhSaGFXNWxaQ2hjWEZOUFdESmZaV1ptYVdWY1hDd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01UVWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRGSmxkR0ZwYm1Wa0tGeGNVMDlZTWw5a2MyZGNYQ3dnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdNVFlnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkRkpsZEdGcGJtVmtLRnhjVTA5WU1sOXdabUZjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TVRjZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZEZKbGRHRnBibVZrS0Z4Y1ZFSlFYRndzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNDNTFjQzVuY2l3Z2JHOXZjQzV1Ynk1bmNpd2diRzl2Y0M1a2IzZHVMbWR5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMbWR5S1Z4dVhHNWNibHh1WEc1a1lYUmhJRHd0SUdKcGJtUmZjbTkzY3loMFpXMXdNU3dnZEdWdGNESXNJSFJsYlhBekxDQjBaVzF3TkN3Z2RHVnRjRFVzWEc0Z0lDQWdJQ0FnSUNCMFpXMXdOaXdnZEdWdGNEY3NJSFJsYlhBNExDQjBaVzF3T1N3Z2RHVnRjREV3TEZ4dUlDQWdJQ0FnSUNBZ2RHVnRjREV4TENCMFpXMXdNVElzSUhSbGJYQXhNeXdnZEdWdGNERTBMQ0IwWlcxd01UVXNJSFJsYlhBeE5pQXNkR1Z0Y0RFM0tWeHVYRzRqSUZacGMzVmhiR2w2WVhScGIyNWNibXhwWW5KaGNua29ZMmx5WTJ4cGVtVXBYRzVjYm1obFlYUnRZWEJmWkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2FXNTBaWEpsYzNRc0lHOWtaSE5TWVhScGJ5a2dKVDRsWEc1d2FYWnZkRjkzYVdSbGNpaHVZVzFsYzE5bWNtOXRJRDBnYVc1MFpYSmxjM1FzSUhaaGJIVmxjMTltY205dElEMGdiMlJrYzFKaGRHbHZLU0FsUGlWY2JpQWdZMjlzZFcxdVgzUnZYM0p2ZDI1aGJXVnpLSFpoY2lBOUlGeGNkR0Z5WjJWMFhGd3BYRzVjYm5CMllXeDFaVjlrWVhSaElEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCcGJuUmxjbVZ6ZEN3Z2NIWmhiSFZsS1NBbFBpVmNiaUFnY0dsMmIzUmZkMmxrWlhJb2JtRnRaWE5mWm5KdmJTQTlJR2x1ZEdWeVpYTjBMQ0IyWVd4MVpYTmZabkp2YlNBOUlIQjJZV3gxWlNrZ0pUNGxYRzRnSUdOdmJIVnRibDkwYjE5eWIzZHVZVzFsY3loMllYSWdQU0JjWEhSaGNtZGxkRnhjS1Z4dVhHNWpiMnhmWm5WdUlEd3RJR052Ykc5eVVtRnRjRElvWXlnd0xDQXhMQ0F6S1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWXloY1hHSnNkV1ZjWEN3Z1hGeDNhR2wwWlZ4Y0xDQmNYSEpsWkZ4Y0tTbGNibHh1U0dWaGRHMWhjQ2hoY3k1dFlYUnlhWGdvYUdWaGRHMWhjRjlrWVhSaEtTeGNiaUFnSUNBZ0lDQWdibUZ0WlNBOUlGeGNUMlJrY3lCU1lYUnBiMXhjTEZ4dUlDQWdJQ0FnSUNCamIyd2dQU0JqYjJ4ZlpuVnVMRnh1SUNBZ0lDQWdJQ0FqSUVGa1pDQmhibTV2ZEdGMGFXOXVJR1p2Y2lCd0xYWmhiSFZsYzF4dUlDQWdJQ0FnSUNCalpXeHNYMloxYmlBOUlHWjFibU4wYVc5dUtHb3NJR2tzSUhnc0lIa3NJSGRwWkhSb0xDQm9aV2xuYUhRc0lHWnBiR3dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQndkbUZzSUR3dElIQjJZV3gxWlY5a1lYUmhXMmtzSUdwZFhHNGdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BDMGdhV1psYkhObEtIQjJZV3dnUGlBd0xqQTFMQ0JjWEc0dWN5NWNYQ3dnYzNCeWFXNTBaaWhjWENVdU1tVmNYQ3dnY0haaGJDa3BYRzRnSUNBZ0lDQWdJQ0FnWjNKcFpDNTBaWGgwS0d4aFltVnNMQ0I0TENCNUxDQm5jQ0E5SUdkd1lYSW9abTl1ZEhOcGVtVWdQU0F4TUNrcFhHNGdJQ0FnSUNBZ0lIMHNYRzRnSUNBZ0lDQWdJQ01nUTNWemRHOXRhWHBsSUhSb1pTQm9aV0YwYldGd0lHeGhlVzkxZEZ4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5WDNKdmQzTWdQU0JVVWxWRkxGeHVJQ0FnSUNBZ0lDQnphRzkzWDNKdmQxOWtaVzVrSUQwZ1JrRk1VMFVzWEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpmWTI5c2RXMXVjeUE5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JqYjJ4MWJXNWZkR2wwYkdVZ1BTQmNYRWx1ZEdWeVpYTjBYRndzWEc0Z0lDQWdJQ0FnSUhKdmQxOTBhWFJzWlNBOUlGeGNWR0Z5WjJWMFhGd3NYRzRnSUNBZ0lDQWdJR2hsWVhSdFlYQmZiR1ZuWlc1a1gzQmhjbUZ0SUQwZ2JHbHpkQ2hoZENBOUlHTW9NQ3dnTVN3Z01pd2dNeWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHRmlaV3h6SUQwZ1l5aGNYREJjWEN3Z1hGd3hYRndzSUZ4Y01seGNMQ0JjWEROY1hDa3BLVnh1WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuXG4jIyMjIEltcG9ydGluZyBsb29wcyBvZiB0YXJnZXRcbnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXEFUQUNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxDVENGXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcRVNSUkJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcRVNSUkJfTkNCXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcRVNSUkJfcGZhXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXEtMRjRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxOQU5PR19kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxOQU5PR19wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcT0NUNF9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxPQ1Q0X2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxPQ1Q0X3BmYVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxTTUMxXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDE0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXFNPWDJfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcU09YMl9wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTcgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcVEJQXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxuXG5cblxuXG5kYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsXG4gICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLFxuICAgICAgICAgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiAsdGVtcDE3KVxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAzKSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjb2x1bW5fdGl0bGUgPSBcXEludGVyZXN0XFwsXG4gICAgICAgIHJvd190aXRsZSA9IFxcVGFyZ2V0XFwsXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcLCBcXDNcXCkpKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG4jIyMjIEltcG9ydGluZyBsb29wcyBvZiB0YXJnZXRcbnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXEFUQUNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxDVENGXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcRVNSUkJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcRVNSUkJfTkNCXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcRVNSUkJfcGZhXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXEtMRjRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxOQU5PR19kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxOQU5PR19wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcT0NUNF9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxPQ1Q0X2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxPQ1Q0X3BmYVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxTTUMxXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDE0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXFNPWDJfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcU09YMl9wZmFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTcgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcVEJQXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxuXG5cblxuXG5kYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsXG4gICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLFxuICAgICAgICAgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiAsdGVtcDE3KVxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAzKSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjb2x1bW5fdGl0bGUgPSBcXEludGVyZXN0XFwsXG4gICAgICAgIHJvd190aXRsZSA9IFxcVGFyZ2V0XFwsXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcLCBcXDNcXCkpKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r

#### Importing loops of target
temp1 <- runFisherExactCombinationTargetRetained(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTargetRetained(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTargetRetained(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTargetRetained(\ESRRB_NCB\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTargetRetained(\ESRRB_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTargetRetained(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTargetRetained(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTargetRetained(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTargetRetained(\NANOG_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTargetRetained(\OCT4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp11 <- runFisherExactCombinationTargetRetained(\OCT4_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp12 <- runFisherExactCombinationTargetRetained(\OCT4_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp13 <- runFisherExactCombinationTargetRetained(\SMC1\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp14 <- runFisherExactCombinationTargetRetained(\SOX2_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp15 <- runFisherExactCombinationTargetRetained(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp16 <- runFisherExactCombinationTargetRetained(\SOX2_pfa\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp17 <- runFisherExactCombinationTargetRetained(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10,
         temp11, temp12, temp13, temp14, temp15, temp16 ,temp17)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 3), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3), 
                                    labels = c(\0\, \1\, \2\, \3\)))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

###### Retained & Lost

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzVjYmlNakl5TWdTVzF3YjNKMGFXNW5JR3h2YjNCeklHOW1JSFJoY21kbGRGeHVkR1Z0Y0RFZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY0lrRlVRVU5mWldabWFXVmNJaXdnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdNaUE4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRndpUTFSRFJsd2lMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXpJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YQ0pGVTFKU1FsOWtjMmRjSWl3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TkNBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z3aVNETkxNamRoWTE5bFptWnBaVndpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEExSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWENKTFRFWTBYMlZtWm1sbFhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNEWWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJazVCVGs5SFgyUnpaMXdpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEEzSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWENKUFExUTBYMlZtWm1sbFhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNEZ2dQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJbE5OUXpGY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBNUlEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hDSlRUMWd5WDJSeloxd2lMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXhNQ0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRndpVkVKUVhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1WEc1Y2JseHVYRzVrWVhSaElEd3RJR0pwYm1SZmNtOTNjeWgwWlcxd01Td2dkR1Z0Y0RJc0lIUmxiWEF6TENCMFpXMXdOQ3dnZEdWdGNEVXNYRzRnSUNBZ0lDQWdJQ0IwWlcxd05pd2dkR1Z0Y0Rjc0lIUmxiWEE0TENCMFpXMXdPU3dnZEdWdGNERXdLVnh1WEc0aklGWnBjM1ZoYkdsNllYUnBiMjVjYm14cFluSmhjbmtvWTJseVkyeHBlbVVwWEc1Y2JtaGxZWFJ0WVhCZlpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSFJoY21kbGRDd2dhVzUwWlhKbGMzUXNJRzlrWkhOU1lYUnBieWtnSlQ0bFhHNXdhWFp2ZEY5M2FXUmxjaWh1WVcxbGMxOW1jbTl0SUQwZ2FXNTBaWEpsYzNRc0lIWmhiSFZsYzE5bWNtOXRJRDBnYjJSa2MxSmhkR2x2S1NBbFBpVmNiaUFnWTI5c2RXMXVYM1J2WDNKdmQyNWhiV1Z6S0haaGNpQTlJRndpZEdGeVoyVjBYQ0lwWEc1Y2JuQjJZV3gxWlY5a1lYUmhJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnBiblJsY21WemRDd2djSFpoYkhWbEtTQWxQaVZjYmlBZ2NHbDJiM1JmZDJsa1pYSW9ibUZ0WlhOZlpuSnZiU0E5SUdsdWRHVnlaWE4wTENCMllXeDFaWE5mWm5KdmJTQTlJSEIyWVd4MVpTa2dKVDRsWEc0Z0lHTnZiSFZ0Ymw5MGIxOXliM2R1WVcxbGN5aDJZWElnUFNCY0luUmhjbWRsZEZ3aUtWeHVYRzVqYjJ4ZlpuVnVJRHd0SUdOdmJHOXlVbUZ0Y0RJb1l5Z3dMQ0F4TENBektTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1l5aGNJbUpzZFdWY0lpd2dYQ0ozYUdsMFpWd2lMQ0JjSW5KbFpGd2lLU2xjYmx4dVNHVmhkRzFoY0NoaGN5NXRZWFJ5YVhnb2FHVmhkRzFoY0Y5a1lYUmhLU3hjYmlBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpVDJSa2N5QlNZWFJwYjF3aUxGeHVJQ0FnSUNBZ0lDQmpiMndnUFNCamIyeGZablZ1TEZ4dUlDQWdJQ0FnSUNBaklFRmtaQ0JoYm01dmRHRjBhVzl1SUdadmNpQndMWFpoYkhWbGMxeHVJQ0FnSUNBZ0lDQmpaV3hzWDJaMWJpQTlJR1oxYm1OMGFXOXVLR29zSUdrc0lIZ3NJSGtzSUhkcFpIUm9MQ0JvWldsbmFIUXNJR1pwYkd3cElIdGNiaUFnSUNBZ0lDQWdJQ0J3ZG1Gc0lEd3RJSEIyWVd4MVpWOWtZWFJoVzJrc0lHcGRYRzRnSUNBZ0lDQWdJQ0FnYkdGaVpXd2dQQzBnYVdabGJITmxLSEIyWVd3Z1BpQXdMakExTENCY0ltNHVjeTVjSWl3Z2MzQnlhVzUwWmloY0lpVXVNbVZjSWl3Z2NIWmhiQ2twWEc0Z0lDQWdJQ0FnSUNBZ1ozSnBaQzUwWlhoMEtHeGhZbVZzTENCNExDQjVMQ0JuY0NBOUlHZHdZWElvWm05dWRITnBlbVVnUFNBeE1Da3BYRzRnSUNBZ0lDQWdJSDBzWEc0Z0lDQWdJQ0FnSUNNZ1EzVnpkRzl0YVhwbElIUm9aU0JvWldGMGJXRndJR3hoZVc5MWRGeHVJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeVgzSnZkM01nUFNCVVVsVkZMRnh1SUNBZ0lDQWdJQ0J6YUc5M1gzSnZkMTlrWlc1a0lEMGdSa0ZNVTBVc1hHNGdJQ0FnSUNBZ0lHTnNkWE4wWlhKZlkyOXNkVzF1Y3lBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCamIyeDFiVzVmZEdsMGJHVWdQU0JjSWtsdWRHVnlaWE4wWENJc1hHNGdJQ0FnSUNBZ0lISnZkMTkwYVhSc1pTQTlJRndpVkdGeVoyVjBYQ0lzWEc0Z0lDQWdJQ0FnSUdobFlYUnRZWEJmYkdWblpXNWtYM0JoY21GdElEMGdiR2x6ZENoaGRDQTlJR01vTUN3Z01Td2dNaXdnTXlrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld4eklEMGdZeWhjSWpCY0lpd2dYQ0l4WENJc0lGd2lNbHdpTENCY0lqTmNJaWtwS1Z4dVhHNWNibHh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcblxuXG4jIyMjIEltcG9ydGluZyBsb29wcyBvZiB0YXJnZXRcbnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxBVEFDX2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDIgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXENUQ0ZcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcRVNSUkJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEgzSzI3YWNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcS0xGNF9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA2IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxOQU5PR19kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcT0NUNF9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxTTUMxXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFRCUFxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcblxuXG5cblxuZGF0YSA8LSBiaW5kX3Jvd3ModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LFxuICAgICAgICAgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMClcblxuIyBWaXN1YWxpemF0aW9uXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksXG4gICAgICAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCxcbiAgICAgICAgY29sID0gY29sX2Z1bixcbiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXNcbiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7XG4gICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXVxuICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgXFxuLnMuXFwsIHNwcmludGYoXFwlLjJlXFwsIHB2YWwpKVxuICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKVxuICAgICAgICB9LFxuICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXRcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY29sdW1uX3RpdGxlID0gXFxJbnRlcmVzdFxcLFxuICAgICAgICByb3dfdGl0bGUgPSBcXFRhcmdldFxcLFxuICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIsIDMpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoXFwwXFwsIFxcMVxcLCBcXDJcXCwgXFwzXFwpKSlcblxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


#### Importing loops of target
temp1 <- runFisherExactCombinationTarget(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTarget(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTarget(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTarget(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTarget(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTarget(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTarget(\OCT4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTarget(\SMC1\, interestName,
                                     loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTarget(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTarget(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 3), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3), 
                                    labels = c(\0\, \1\, \2\, \3\)))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNWNiaU1qSXlNZ1NXMXdiM0owYVc1bklHeHZiM0J6SUc5bUlIUmhjbWRsZEZ4dWRHVnRjREVnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkQ2hjWEVGVVFVTmZaV1ptYVdWY1hDd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01pQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMEtGeGNRMVJEUmx4Y0xDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBeklEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hGeEZVMUpTUWw5a2MyZGNYQ3dnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdOQ0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRnhjU0ROTE1qZGhZMTlsWm1acFpWeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTFJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YRnhMVEVZMFgyVm1abWxsWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RZZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hFNUJUazlIWDJSeloxeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTNJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YRnhQUTFRMFgyVm1abWxsWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RnZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hGTk5RekZjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEE1SUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWEZ4VFQxZ3lYMlJ6WjF4Y0xDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBeE1DQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMEtGeGNWRUpRWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVYRzVjYmx4dVhHNWtZWFJoSUR3dElHSnBibVJmY205M2N5aDBaVzF3TVN3Z2RHVnRjRElzSUhSbGJYQXpMQ0IwWlcxd05Dd2dkR1Z0Y0RVc1hHNGdJQ0FnSUNBZ0lDQjBaVzF3Tml3Z2RHVnRjRGNzSUhSbGJYQTRMQ0IwWlcxd09Td2dkR1Z0Y0RFd0tWeHVYRzRqSUZacGMzVmhiR2w2WVhScGIyNWNibXhwWW5KaGNua29ZMmx5WTJ4cGVtVXBYRzVjYm1obFlYUnRZWEJmWkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2FXNTBaWEpsYzNRc0lHOWtaSE5TWVhScGJ5a2dKVDRsWEc1d2FYWnZkRjkzYVdSbGNpaHVZVzFsYzE5bWNtOXRJRDBnYVc1MFpYSmxjM1FzSUhaaGJIVmxjMTltY205dElEMGdiMlJrYzFKaGRHbHZLU0FsUGlWY2JpQWdZMjlzZFcxdVgzUnZYM0p2ZDI1aGJXVnpLSFpoY2lBOUlGeGNkR0Z5WjJWMFhGd3BYRzVjYm5CMllXeDFaVjlrWVhSaElEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCcGJuUmxjbVZ6ZEN3Z2NIWmhiSFZsS1NBbFBpVmNiaUFnY0dsMmIzUmZkMmxrWlhJb2JtRnRaWE5mWm5KdmJTQTlJR2x1ZEdWeVpYTjBMQ0IyWVd4MVpYTmZabkp2YlNBOUlIQjJZV3gxWlNrZ0pUNGxYRzRnSUdOdmJIVnRibDkwYjE5eWIzZHVZVzFsY3loMllYSWdQU0JjWEhSaGNtZGxkRnhjS1Z4dVhHNWpiMnhmWm5WdUlEd3RJR052Ykc5eVVtRnRjRElvWXlnd0xDQXhMQ0F6S1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWXloY1hHSnNkV1ZjWEN3Z1hGeDNhR2wwWlZ4Y0xDQmNYSEpsWkZ4Y0tTbGNibHh1U0dWaGRHMWhjQ2hoY3k1dFlYUnlhWGdvYUdWaGRHMWhjRjlrWVhSaEtTeGNiaUFnSUNBZ0lDQWdibUZ0WlNBOUlGeGNUMlJrY3lCU1lYUnBiMXhjTEZ4dUlDQWdJQ0FnSUNCamIyd2dQU0JqYjJ4ZlpuVnVMRnh1SUNBZ0lDQWdJQ0FqSUVGa1pDQmhibTV2ZEdGMGFXOXVJR1p2Y2lCd0xYWmhiSFZsYzF4dUlDQWdJQ0FnSUNCalpXeHNYMloxYmlBOUlHWjFibU4wYVc5dUtHb3NJR2tzSUhnc0lIa3NJSGRwWkhSb0xDQm9aV2xuYUhRc0lHWnBiR3dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQndkbUZzSUR3dElIQjJZV3gxWlY5a1lYUmhXMmtzSUdwZFhHNGdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BDMGdhV1psYkhObEtIQjJZV3dnUGlBd0xqQTFMQ0JjWEc0dWN5NWNYQ3dnYzNCeWFXNTBaaWhjWENVdU1tVmNYQ3dnY0haaGJDa3BYRzRnSUNBZ0lDQWdJQ0FnWjNKcFpDNTBaWGgwS0d4aFltVnNMQ0I0TENCNUxDQm5jQ0E5SUdkd1lYSW9abTl1ZEhOcGVtVWdQU0F4TUNrcFhHNGdJQ0FnSUNBZ0lIMHNYRzRnSUNBZ0lDQWdJQ01nUTNWemRHOXRhWHBsSUhSb1pTQm9aV0YwYldGd0lHeGhlVzkxZEZ4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5WDNKdmQzTWdQU0JVVWxWRkxGeHVJQ0FnSUNBZ0lDQnphRzkzWDNKdmQxOWtaVzVrSUQwZ1JrRk1VMFVzWEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpmWTI5c2RXMXVjeUE5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JqYjJ4MWJXNWZkR2wwYkdVZ1BTQmNYRWx1ZEdWeVpYTjBYRndzWEc0Z0lDQWdJQ0FnSUhKdmQxOTBhWFJzWlNBOUlGeGNWR0Z5WjJWMFhGd3NYRzRnSUNBZ0lDQWdJR2hsWVhSdFlYQmZiR1ZuWlc1a1gzQmhjbUZ0SUQwZ2JHbHpkQ2hoZENBOUlHTW9NQ3dnTVN3Z01pd2dNeWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHRmlaV3h6SUQwZ1l5aGNYREJjWEN3Z1hGd3hYRndzSUZ4Y01seGNMQ0JjWEROY1hDa3BLVnh1WEc1Y2JseHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG5cblxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgdGFyZ2V0XG50ZW1wMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcQVRBQ19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxDVENGXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEVTUlJCX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxIM0syN2FjX2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEtMRjRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcTkFOT0dfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDcgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE9DVDRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU01DMVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDkgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNPWDJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDEwIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxUQlBcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG5cblxuXG5cbmRhdGEgPC0gYmluZF9yb3dzKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSxcbiAgICAgICAgIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTApXG5cbiMgVmlzdWFsaXphdGlvblxubGlicmFyeShjaXJjbGl6ZSlcblxuaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiVcbnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxucHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JVxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDMpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5IZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLFxuICAgICAgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4sXG4gICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzXG4gICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkge1xuICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal1cbiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsIFxcbi5zLlxcLCBzcHJpbnRmKFxcJS4yZVxcLCBwdmFsKSlcbiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSlcbiAgICAgICAgfSxcbiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0XG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIGNvbHVtbl90aXRsZSA9IFxcSW50ZXJlc3RcXCxcbiAgICAgICAgcm93X3RpdGxlID0gXFxUYXJnZXRcXCxcbiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGF0ID0gYygwLCAxLCAyLCAzKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKFxcMFxcLCBcXDFcXCwgXFwyXFwsIFxcM1xcKSkpXG5cblxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5cbiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIHRhcmdldFxudGVtcDEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEFUQUNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcQ1RDRlxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAzIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxFU1JSQl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxLTEY0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE5BTk9HX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDggPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNNQzFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA5IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxTT1gyX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcVEJQXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxuXG5cblxuXG5kYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsXG4gICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwKVxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAzKSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjb2x1bW5fdGl0bGUgPSBcXEludGVyZXN0XFwsXG4gICAgICAgIHJvd190aXRsZSA9IFxcVGFyZ2V0XFwsXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcLCBcXDNcXCkpKVxuXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r


#### Importing loops of target
temp1 <- runFisherExactCombinationTarget(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTarget(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTarget(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTarget(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTarget(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTarget(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTarget(\OCT4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTarget(\SMC1\, interestName,
                                     loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTarget(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTarget(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 3), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3), 
                                    labels = c(\0\, \1\, \2\, \3\)))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

######  Retained

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzVjYmlNakl5TWdTVzF3YjNKMGFXNW5JR3h2YjNCeklHOW1JSFJoY21kbGRGeHVkR1Z0Y0RFZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZEZKbGRHRnBibVZrS0Z3aVFWUkJRMTlsWm1acFpWd2lMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXlJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUlNaWFJoYVc1bFpDaGNJa05VUTBaY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd015QThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMFVtVjBZV2x1WldRb1hDSkZVMUpTUWw5a2MyZGNJaXdnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdOQ0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBVbVYwWVdsdVpXUW9YQ0pJTTBzeU4yRmpYMlZtWm1sbFhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNEVWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRGSmxkR0ZwYm1Wa0tGd2lTMHhHTkY5bFptWnBaVndpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEEySUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFJTWlhSaGFXNWxaQ2hjSWs1QlRrOUhYMlJ6WjF3aUxDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBM0lEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhSU1pYUmhhVzVsWkNoY0lrOURWRFJmWldabWFXVmNJaXdnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdPQ0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBVbVYwWVdsdVpXUW9YQ0pUVFVNeFhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd09TQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMFVtVjBZV2x1WldRb1hDSlRUMWd5WDJSeloxd2lMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXhNQ0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBVbVYwWVdsdVpXUW9YQ0pVUWxCY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzVjYmx4dVhHNWNibVJoZEdFZ1BDMGdZbWx1WkY5eWIzZHpLSFJsYlhBeExDQjBaVzF3TWl3Z2RHVnRjRE1zSUhSbGJYQTBMQ0IwWlcxd05TeGNiaUFnSUNBZ0lDQWdJSFJsYlhBMkxDQjBaVzF3Tnl3Z2RHVnRjRGdzSUhSbGJYQTVMQ0IwWlcxd01UQXBYRzVjYmlNZ1ZtbHpkV0ZzYVhwaGRHbHZibHh1YkdsaWNtRnllU2hqYVhKamJHbDZaU2xjYmx4dWFHVmhkRzFoY0Y5a1lYUmhJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnBiblJsY21WemRDd2diMlJrYzFKaGRHbHZLU0FsUGlWY2JuQnBkbTkwWDNkcFpHVnlLRzVoYldWelgyWnliMjBnUFNCcGJuUmxjbVZ6ZEN3Z2RtRnNkV1Z6WDJaeWIyMGdQU0J2WkdSelVtRjBhVzhwSUNVK0pWeHVJQ0JqYjJ4MWJXNWZkRzlmY205M2JtRnRaWE1vZG1GeUlEMGdYQ0owWVhKblpYUmNJaWxjYmx4dWNIWmhiSFZsWDJSaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHbHVkR1Z5WlhOMExDQndkbUZzZFdVcElDVStKVnh1SUNCd2FYWnZkRjkzYVdSbGNpaHVZVzFsYzE5bWNtOXRJRDBnYVc1MFpYSmxjM1FzSUhaaGJIVmxjMTltY205dElEMGdjSFpoYkhWbEtTQWxQaVZjYmlBZ1kyOXNkVzF1WDNSdlgzSnZkMjVoYldWektIWmhjaUE5SUZ3aWRHRnlaMlYwWENJcFhHNWNibU52YkY5bWRXNGdQQzBnWTI5c2IzSlNZVzF3TWloaktEQXNJREVzSURNcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaktGd2lZbXgxWlZ3aUxDQmNJbmRvYVhSbFhDSXNJRndpY21Wa1hDSXBLVnh1WEc1SVpXRjBiV0Z3S0dGekxtMWhkSEpwZUNob1pXRjBiV0Z3WDJSaGRHRXBMRnh1SUNBZ0lDQWdJQ0J1WVcxbElEMGdYQ0pQWkdSeklGSmhkR2x2WENJc1hHNGdJQ0FnSUNBZ0lHTnZiQ0E5SUdOdmJGOW1kVzRzWEc0Z0lDQWdJQ0FnSUNNZ1FXUmtJR0Z1Ym05MFlYUnBiMjRnWm05eUlIQXRkbUZzZFdWelhHNGdJQ0FnSUNBZ0lHTmxiR3hmWm5WdUlEMGdablZ1WTNScGIyNG9haXdnYVN3Z2VDd2dlU3dnZDJsa2RHZ3NJR2hsYVdkb2RDd2dabWxzYkNrZ2UxeHVJQ0FnSUNBZ0lDQWdJSEIyWVd3Z1BDMGdjSFpoYkhWbFgyUmhkR0ZiYVN3Z2FsMWNiaUFnSUNBZ0lDQWdJQ0JzWVdKbGJDQThMU0JwWm1Wc2MyVW9jSFpoYkNBK0lEQXVNRFVzSUZ3aWJpNXpMbHdpTENCemNISnBiblJtS0Z3aUpTNHlaVndpTENCd2RtRnNLU2xjYmlBZ0lDQWdJQ0FnSUNCbmNtbGtMblJsZUhRb2JHRmlaV3dzSUhnc0lIa3NJR2R3SUQwZ1ozQmhjaWhtYjI1MGMybDZaU0E5SURFd0tTbGNiaUFnSUNBZ0lDQWdmU3hjYmlBZ0lDQWdJQ0FnSXlCRGRYTjBiMjFwZW1VZ2RHaGxJR2hsWVhSdFlYQWdiR0Y1YjNWMFhHNGdJQ0FnSUNBZ0lHTnNkWE4wWlhKZmNtOTNjeUE5SUZSU1ZVVXNYRzRnSUNBZ0lDQWdJSE5vYjNkZmNtOTNYMlJsYm1RZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ1kyeDFjM1JsY2w5amIyeDFiVzV6SUQwZ1JrRk1VMFVzWEc0Z0lDQWdJQ0FnSUdOdmJIVnRibDkwYVhSc1pTQTlJRndpU1c1MFpYSmxjM1JjSWl4Y2JpQWdJQ0FnSUNBZ2NtOTNYM1JwZEd4bElEMGdYQ0pVWVhKblpYUmNJaXhjYmlBZ0lDQWdJQ0FnYUdWaGRHMWhjRjlzWldkbGJtUmZjR0Z5WVcwZ1BTQnNhWE4wS0dGMElEMGdZeWd3TENBeExDQXlMQ0F6S1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkhNZ1BTQmpLRndpTUZ3aUxDQmNJakZjSWl3Z1hDSXlYQ0lzSUZ3aU0xd2lLU2twWEc1Y2JseHVYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcblxuXG4jIyMjIEltcG9ydGluZyBsb29wcyBvZiB0YXJnZXRcbnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXEFUQUNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxDVENGXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcRVNSUkJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXEtMRjRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxOQU5PR19kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxPQ1Q0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDggPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcU01DMVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDkgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcVEJQXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxuXG5cblxuXG5kYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsXG4gICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwKVxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAzKSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjb2x1bW5fdGl0bGUgPSBcXEludGVyZXN0XFwsXG4gICAgICAgIHJvd190aXRsZSA9IFxcVGFyZ2V0XFwsXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcLCBcXDNcXCkpKVxuXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


#### Importing loops of target
temp1 <- runFisherExactCombinationTargetRetained(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTargetRetained(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTargetRetained(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTargetRetained(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTargetRetained(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTargetRetained(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTargetRetained(\OCT4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTargetRetained(\SMC1\, interestName,
                                     loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTargetRetained(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTargetRetained(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 3), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3), 
                                    labels = c(\0\, \1\, \2\, \3\)))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNWNiaU1qSXlNZ1NXMXdiM0owYVc1bklHeHZiM0J6SUc5bUlIUmhjbWRsZEZ4dWRHVnRjREVnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkRkpsZEdGcGJtVmtLRnhjUVZSQlExOWxabVpwWlZ4Y0xDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBeUlEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhSU1pYUmhhVzVsWkNoY1hFTlVRMFpjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TXlBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwVW1WMFlXbHVaV1FvWEZ4RlUxSlNRbDlrYzJkY1hDd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd05DQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMFVtVjBZV2x1WldRb1hGeElNMHN5TjJGalgyVm1abWxsWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RVZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZEZKbGRHRnBibVZrS0Z4Y1MweEdORjlsWm1acFpWeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTJJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUlNaWFJoYVc1bFpDaGNYRTVCVGs5SFgyUnpaMXhjTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEEzSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFJTWlhSaGFXNWxaQ2hjWEU5RFZEUmZaV1ptYVdWY1hDd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd09DQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMFVtVjBZV2x1WldRb1hGeFRUVU14WEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3T1NBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwVW1WMFlXbHVaV1FvWEZ4VFQxZ3lYMlJ6WjF4Y0xDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBeE1DQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMFVtVjBZV2x1WldRb1hGeFVRbEJjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNWNibHh1WEc1Y2JtUmhkR0VnUEMwZ1ltbHVaRjl5YjNkektIUmxiWEF4TENCMFpXMXdNaXdnZEdWdGNETXNJSFJsYlhBMExDQjBaVzF3TlN4Y2JpQWdJQ0FnSUNBZ0lIUmxiWEEyTENCMFpXMXdOeXdnZEdWdGNEZ3NJSFJsYlhBNUxDQjBaVzF3TVRBcFhHNWNiaU1nVm1semRXRnNhWHBoZEdsdmJseHViR2xpY21GeWVTaGphWEpqYkdsNlpTbGNibHh1YUdWaGRHMWhjRjlrWVhSaElEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCcGJuUmxjbVZ6ZEN3Z2IyUmtjMUpoZEdsdktTQWxQaVZjYm5CcGRtOTBYM2RwWkdWeUtHNWhiV1Z6WDJaeWIyMGdQU0JwYm5SbGNtVnpkQ3dnZG1Gc2RXVnpYMlp5YjIwZ1BTQnZaR1J6VW1GMGFXOHBJQ1UrSlZ4dUlDQmpiMngxYlc1ZmRHOWZjbTkzYm1GdFpYTW9kbUZ5SUQwZ1hGeDBZWEpuWlhSY1hDbGNibHh1Y0haaGJIVmxYMlJoZEdFZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUdsdWRHVnlaWE4wTENCd2RtRnNkV1VwSUNVK0pWeHVJQ0J3YVhadmRGOTNhV1JsY2lodVlXMWxjMTltY205dElEMGdhVzUwWlhKbGMzUXNJSFpoYkhWbGMxOW1jbTl0SUQwZ2NIWmhiSFZsS1NBbFBpVmNiaUFnWTI5c2RXMXVYM1J2WDNKdmQyNWhiV1Z6S0haaGNpQTlJRnhjZEdGeVoyVjBYRndwWEc1Y2JtTnZiRjltZFc0Z1BDMGdZMjlzYjNKU1lXMXdNaWhqS0RBc0lERXNJRE1wTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqS0Z4Y1lteDFaVnhjTENCY1hIZG9hWFJsWEZ3c0lGeGNjbVZrWEZ3cEtWeHVYRzVJWldGMGJXRndLR0Z6TG0xaGRISnBlQ2hvWldGMGJXRndYMlJoZEdFcExGeHVJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hGeFBaR1J6SUZKaGRHbHZYRndzWEc0Z0lDQWdJQ0FnSUdOdmJDQTlJR052YkY5bWRXNHNYRzRnSUNBZ0lDQWdJQ01nUVdSa0lHRnVibTkwWVhScGIyNGdabTl5SUhBdGRtRnNkV1Z6WEc0Z0lDQWdJQ0FnSUdObGJHeGZablZ1SUQwZ1puVnVZM1JwYjI0b2Fpd2dhU3dnZUN3Z2VTd2dkMmxrZEdnc0lHaGxhV2RvZEN3Z1ptbHNiQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lIQjJZV3dnUEMwZ2NIWmhiSFZsWDJSaGRHRmJhU3dnYWwxY2JpQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOExTQnBabVZzYzJVb2NIWmhiQ0ErSURBdU1EVXNJRnhjYmk1ekxseGNMQ0J6Y0hKcGJuUm1LRnhjSlM0eVpWeGNMQ0J3ZG1Gc0tTbGNiaUFnSUNBZ0lDQWdJQ0JuY21sa0xuUmxlSFFvYkdGaVpXd3NJSGdzSUhrc0lHZHdJRDBnWjNCaGNpaG1iMjUwYzJsNlpTQTlJREV3S1NsY2JpQWdJQ0FnSUNBZ2ZTeGNiaUFnSUNBZ0lDQWdJeUJEZFhOMGIyMXBlbVVnZEdobElHaGxZWFJ0WVhBZ2JHRjViM1YwWEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpmY205M2N5QTlJRlJTVlVVc1hHNGdJQ0FnSUNBZ0lITm9iM2RmY205M1gyUmxibVFnUFNCR1FVeFRSU3hjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjbDlqYjJ4MWJXNXpJRDBnUmtGTVUwVXNYRzRnSUNBZ0lDQWdJR052YkhWdGJsOTBhWFJzWlNBOUlGeGNTVzUwWlhKbGMzUmNYQ3hjYmlBZ0lDQWdJQ0FnY205M1gzUnBkR3hsSUQwZ1hGeFVZWEpuWlhSY1hDeGNiaUFnSUNBZ0lDQWdhR1ZoZEcxaGNGOXNaV2RsYm1SZmNHRnlZVzBnUFNCc2FYTjBLR0YwSUQwZ1l5Z3dMQ0F4TENBeUxDQXpLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1lXSmxiSE1nUFNCaktGeGNNRnhjTENCY1hERmNYQ3dnWEZ3eVhGd3NJRnhjTTF4Y0tTa3BYRzVjYmx4dVhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcblxuXG4jIyMjIEltcG9ydGluZyBsb29wcyBvZiB0YXJnZXRcbnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXEFUQUNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxDVENGXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcRVNSUkJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXEtMRjRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxOQU5PR19kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxPQ1Q0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDggPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcU01DMVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDkgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcVEJQXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxuXG5cblxuXG5kYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsXG4gICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwKVxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAzKSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjb2x1bW5fdGl0bGUgPSBcXEludGVyZXN0XFwsXG4gICAgICAgIHJvd190aXRsZSA9IFxcVGFyZ2V0XFwsXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcLCBcXDNcXCkpKVxuXG5cblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5cbiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIHRhcmdldFxudGVtcDEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcQVRBQ19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXENUQ0ZcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxFU1JSQl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxIM0syN2FjX2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKFxcS0xGNF9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA2IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXE5BTk9HX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZChcXE9DVDRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxTTUMxXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxTT1gyX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoXFxUQlBcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG5cblxuXG5cbmRhdGEgPC0gYmluZF9yb3dzKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSxcbiAgICAgICAgIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTApXG5cbiMgVmlzdWFsaXphdGlvblxubGlicmFyeShjaXJjbGl6ZSlcblxuaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiVcbnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxucHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JVxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDMpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5IZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLFxuICAgICAgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4sXG4gICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzXG4gICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkge1xuICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal1cbiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsIFxcbi5zLlxcLCBzcHJpbnRmKFxcJS4yZVxcLCBwdmFsKSlcbiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSlcbiAgICAgICAgfSxcbiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0XG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIGNvbHVtbl90aXRsZSA9IFxcSW50ZXJlc3RcXCxcbiAgICAgICAgcm93X3RpdGxlID0gXFxUYXJnZXRcXCxcbiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGF0ID0gYygwLCAxLCAyLCAzKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKFxcMFxcLCBcXDFcXCwgXFwyXFwsIFxcM1xcKSkpXG5cblxuXG5gYGBcbmBgYCJ9 -->

```r
```r


#### Importing loops of target
temp1 <- runFisherExactCombinationTargetRetained(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTargetRetained(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTargetRetained(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTargetRetained(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTargetRetained(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTargetRetained(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTargetRetained(\OCT4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTargetRetained(\SMC1\, interestName,
                                     loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTargetRetained(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTargetRetained(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 3), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3), 
                                    labels = c(\0\, \1\, \2\, \3\)))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Reg refined
###### Retained & Lost

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlCSmJYQnZjblJwYm1jZ2JHOXZjSE1nYjJZZ2FXNTBaWEpsYzNSY2JtbHVkR1Z5WlhOMFRtRnRaU0E4TFNCY0ltRnNiRXh2YjNCY0lseHVJeUJDUVVOTFIxSlBWVTVFSUd4dmIzQmNibUpoWTJ0bmNtOTFibVFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5aGJHd3VZbVZrY0dWY0lpa3BYRzVpWVdOclozSnZkVzVrTG1keUlEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHSmhZMnRuY205MWJtUXBLVnh1SXlCVlVDQnNiMjl3WEc1c2IyOXdMblZ3SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZllXeHNYMEUwT0RWMmMwUk5VMDlmVlZCZlpHbG1aakF1TWk1aVpXUndaVndpS1NsY2JteHZiM0F1ZFhBdVozSWdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1MWNDa3BYRzRqSUU1UElHeHZiM0JjYm14dmIzQXVibThnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5aGJHeGZRVFE0TlhaelJFMVRUMTlPVDE5a2FXWm1NQzR5TG1KbFpIQmxYQ0lwS1Z4dWJHOXZjQzV1Ynk1bmNpQThMU0FvWlhoMGNtRmpkRUZ1WTJodmNpaHNiMjl3TG01dktTbGNiaU1nUkU5WFRpQnNiMjl3WEc1c2IyOXdMbVJ2ZDI0Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOWhiR3hmUVRRNE5YWnpSRTFUVDE5RVQxZE9YMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BYRzVzYjI5d0xtUnZkMjR1WjNJZ1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzVrYjNkdUtTbGNibUJnWUNKOSAtLT5cblxuYGBgclxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgaW50ZXJlc3RcbmludGVyZXN0TmFtZSA8LSBcXGFsbExvb3BcXFxuIyBCQUNLR1JPVU5EIGxvb3BcbmJhY2tncm91bmQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGwuYmVkcGVcXCkpXG5iYWNrZ3JvdW5kLmdyIDwtIChleHRyYWN0QW5jaG9yKGJhY2tncm91bmQpKVxuIyBVUCBsb29wXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3AudXAuZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG4jIE5PIGxvb3Bcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5uby5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbiMgRE9XTiBsb29wXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLmRvd24uZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSlcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
#### Importing loops of interest
interestName <- \allLoop\
# BACKGROUND loop
background <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all.bedpe\))
background.gr <- (extractAnchor(background))
# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_UP_diff0.2.bedpe\))
loop.up.gr <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_NO_diff0.2.bedpe\))
loop.no.gr <- (extractAnchor(loop.no))
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_DOWN_diff0.2.bedpe\))
loop.down.gr <- (extractAnchor(loop.down))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeUJKYlhCdmNuUnBibWNnYkc5dmNITWdiMllnYVc1MFpYSmxjM1JjYm1sdWRHVnlaWE4wVG1GdFpTQThMU0JjWEdGc2JFeHZiM0JjWEZ4dUl5QkNRVU5MUjFKUFZVNUVJR3h2YjNCY2JtSmhZMnRuY205MWJtUWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjloYkd3dVltVmtjR1ZjWENrcFhHNWlZV05yWjNKdmRXNWtMbWR5SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0dKaFkydG5jbTkxYm1RcEtWeHVJeUJWVUNCc2IyOXdYRzVzYjI5d0xuVndJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmWVd4c1gwRTBPRFYyYzBSTlUwOWZWVkJmWkdsbVpqQXVNaTVpWldSd1pWeGNLU2xjYm14dmIzQXVkWEF1WjNJZ1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzUxY0NrcFhHNGpJRTVQSUd4dmIzQmNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjloYkd4ZlFUUTROWFp6UkUxVFQxOU9UMTlrYVdabU1DNHlMbUpsWkhCbFhGd3BLVnh1Ykc5dmNDNXVieTVuY2lBOExTQW9aWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbTV2S1NsY2JpTWdSRTlYVGlCc2IyOXdYRzVzYjI5d0xtUnZkMjRnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5aGJHeGZRVFE0TlhaelJFMVRUMTlFVDFkT1gyUnBabVl3TGpJdVltVmtjR1ZjWENrcFhHNXNiMjl3TG1SdmQyNHVaM0lnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWtiM2R1S1NsY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIGludGVyZXN0XG5pbnRlcmVzdE5hbWUgPC0gXFxhbGxMb29wXFxcbiMgQkFDS0dST1VORCBsb29wXG5iYWNrZ3JvdW5kIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsLmJlZHBlXFwpKVxuYmFja2dyb3VuZC5nciA8LSAoZXh0cmFjdEFuY2hvcihiYWNrZ3JvdW5kKSlcbiMgVVAgbG9vcFxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLnVwLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxuIyBOTyBsb29wXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX0E0ODV2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3Aubm8uZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpXG4jIERPV04gbG9vcFxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX0E0ODV2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5kb3duLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgaW50ZXJlc3RcbmludGVyZXN0TmFtZSA8LSBcXGFsbExvb3BcXFxuIyBCQUNLR1JPVU5EIGxvb3BcbmJhY2tncm91bmQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGwuYmVkcGVcXCkpXG5iYWNrZ3JvdW5kLmdyIDwtIChleHRyYWN0QW5jaG9yKGJhY2tncm91bmQpKVxuIyBVUCBsb29wXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3AudXAuZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG4jIE5PIGxvb3Bcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5uby5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbiMgRE9XTiBsb29wXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLmRvd24uZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSlcbmBgYFxuYGBgIn0= -->

```r
```r
#### Importing loops of interest
interestName <- \allLoop\
# BACKGROUND loop
background <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all.bedpe\))
background.gr <- (extractAnchor(background))
# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_UP_diff0.2.bedpe\))
loop.up.gr <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_NO_diff0.2.bedpe\))
loop.no.gr <- (extractAnchor(loop.no))
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_DOWN_diff0.2.bedpe\))
loop.down.gr <- (extractAnchor(loop.down))
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

###### Retained

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzVjYmlNakl5TWdTVzF3YjNKMGFXNW5JR3h2YjNCeklHOW1JSFJoY21kbGRGeHVkR1Z0Y0RFZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY0lrRlVRVU5mWldabWFXVmNJaXdnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdNaUE4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRndpUTFSRFJsd2lMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXpJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YQ0pGVTFKU1FsOWtjMmRjSWl3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TkNBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z3aVNETkxNamRoWTE5bFptWnBaVndpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEExSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWENKTFRFWTBYMlZtWm1sbFhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNEWWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJazVCVGs5SFgyUnpaMXdpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEEzSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWENKUFExUTBYMlJ6WjF3aUxDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBNElEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hDSlRUVU14WENJc0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3T1NBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z3aVUwOVlNbDlrYzJkY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01UQWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJbFJDVUZ3aUxDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNibHh1WEc1Y2JseHVaR0YwWVNBOExTQmlhVzVrWDNKdmQzTW9kR1Z0Y0RFc0lIUmxiWEF5TENCMFpXMXdNeXdnZEdWdGNEUXNJSFJsYlhBMUxGeHVJQ0FnSUNBZ0lDQWdkR1Z0Y0RZc0lIUmxiWEEzTENCMFpXMXdPQ3dnZEdWdGNEa3NJSFJsYlhBeE1DbGNibHh1SXlCV2FYTjFZV3hwZW1GMGFXOXVYRzVzYVdKeVlYSjVLR05wY21Oc2FYcGxLVnh1WEc1b1pXRjBiV0Z3WDJSaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHbHVkR1Z5WlhOMExDQnZaR1J6VW1GMGFXOHBJQ1UrSlZ4dWNHbDJiM1JmZDJsa1pYSW9ibUZ0WlhOZlpuSnZiU0E5SUdsdWRHVnlaWE4wTENCMllXeDFaWE5mWm5KdmJTQTlJRzlrWkhOU1lYUnBieWtnSlQ0bFhHNGdJR052YkhWdGJsOTBiMTl5YjNkdVlXMWxjeWgyWVhJZ1BTQmNJblJoY21kbGRGd2lLVnh1WEc1d2RtRnNkV1ZmWkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2FXNTBaWEpsYzNRc0lIQjJZV3gxWlNrZ0pUNGxYRzRnSUhCcGRtOTBYM2RwWkdWeUtHNWhiV1Z6WDJaeWIyMGdQU0JwYm5SbGNtVnpkQ3dnZG1Gc2RXVnpYMlp5YjIwZ1BTQndkbUZzZFdVcElDVStKVnh1SUNCamIyeDFiVzVmZEc5ZmNtOTNibUZ0WlhNb2RtRnlJRDBnWENKMFlYSm5aWFJjSWlsY2JseHVZMjlzWDJaMWJpQThMU0JqYjJ4dmNsSmhiWEF5S0dNb01Dd2dNU3dnTXlrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdNb1hDSmliSFZsWENJc0lGd2lkMmhwZEdWY0lpd2dYQ0p5WldSY0lpa3BYRzVjYmtobFlYUnRZWEFvWVhNdWJXRjBjbWw0S0dobFlYUnRZWEJmWkdGMFlTa3NYRzRnSUNBZ0lDQWdJRzVoYldVZ1BTQmNJazlrWkhNZ1VtRjBhVzljSWl4Y2JpQWdJQ0FnSUNBZ1kyOXNJRDBnWTI5c1gyWjFiaXhjYmlBZ0lDQWdJQ0FnSXlCQlpHUWdZVzV1YjNSaGRHbHZiaUJtYjNJZ2NDMTJZV3gxWlhOY2JpQWdJQ0FnSUNBZ1kyVnNiRjltZFc0Z1BTQm1kVzVqZEdsdmJpaHFMQ0JwTENCNExDQjVMQ0IzYVdSMGFDd2dhR1ZwWjJoMExDQm1hV3hzS1NCN1hHNGdJQ0FnSUNBZ0lDQWdjSFpoYkNBOExTQndkbUZzZFdWZlpHRjBZVnRwTENCcVhWeHVJQ0FnSUNBZ0lDQWdJR3hoWW1Wc0lEd3RJR2xtWld4elpTaHdkbUZzSUQ0Z01DNHdOU3dnWENKdUxuTXVYQ0lzSUhOd2NtbHVkR1lvWENJbExqSmxYQ0lzSUhCMllXd3BLVnh1SUNBZ0lDQWdJQ0FnSUdkeWFXUXVkR1Y0ZENoc1lXSmxiQ3dnZUN3Z2VTd2daM0FnUFNCbmNHRnlLR1p2Ym5SemFYcGxJRDBnTVRBcEtWeHVJQ0FnSUNBZ0lDQjlMRnh1SUNBZ0lDQWdJQ0FqSUVOMWMzUnZiV2w2WlNCMGFHVWdhR1ZoZEcxaGNDQnNZWGx2ZFhSY2JpQWdJQ0FnSUNBZ1kyeDFjM1JsY2w5eWIzZHpJRDBnVkZKVlJTeGNiaUFnSUNBZ0lDQWdjMmh2ZDE5eWIzZGZaR1Z1WkNBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5WDJOdmJIVnRibk1nUFNCR1FVeFRSU3hjYmlBZ0lDQWdJQ0FnWTI5c2RXMXVYM1JwZEd4bElEMGdYQ0pKYm5SbGNtVnpkRndpTEZ4dUlDQWdJQ0FnSUNCeWIzZGZkR2wwYkdVZ1BTQmNJbFJoY21kbGRGd2lMRnh1SUNBZ0lDQWdJQ0JvWldGMGJXRndYMnhsWjJWdVpGOXdZWEpoYlNBOUlHeHBjM1FvWVhRZ1BTQmpLREFzSURFc0lESXNJRE1wTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeGhZbVZzY3lBOUlHTW9YQ0l3WENJc0lGd2lNVndpTENCY0lqSmNJaXdnWENJelhDSXBLU2xjYmx4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5cblxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgdGFyZ2V0XG50ZW1wMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcQVRBQ19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxDVENGXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEVTUlJCX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxIM0syN2FjX2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEtMRjRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcTkFOT0dfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDcgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE9DVDRfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDggPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNNQzFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA5IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxTT1gyX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcVEJQXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxuXG5cblxuXG5kYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsXG4gICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwKVxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAzKSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjb2x1bW5fdGl0bGUgPSBcXEludGVyZXN0XFwsXG4gICAgICAgIHJvd190aXRsZSA9IFxcVGFyZ2V0XFwsXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcLCBcXDNcXCkpKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


#### Importing loops of target
temp1 <- runFisherExactCombinationTarget(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTarget(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTarget(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTarget(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTarget(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTarget(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTarget(\OCT4_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTarget(\SMC1\, interestName,
                                     loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTarget(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTarget(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 3), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3), 
                                    labels = c(\0\, \1\, \2\, \3\)))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNWNiaU1qSXlNZ1NXMXdiM0owYVc1bklHeHZiM0J6SUc5bUlIUmhjbWRsZEZ4dWRHVnRjREVnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkQ2hjWEVGVVFVTmZaV1ptYVdWY1hDd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01pQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMEtGeGNRMVJEUmx4Y0xDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBeklEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hGeEZVMUpTUWw5a2MyZGNYQ3dnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdOQ0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRnhjU0ROTE1qZGhZMTlsWm1acFpWeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTFJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YRnhMVEVZMFgyVm1abWxsWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RZZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hFNUJUazlIWDJSeloxeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTNJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YRnhQUTFRMFgyUnpaMXhjTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEE0SUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWEZ4VFRVTXhYRndzSUdsdWRHVnlaWE4wVG1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdPU0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRnhjVTA5WU1sOWtjMmRjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TVRBZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hGUkNVRnhjTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JseHVYRzVjYmx4dVpHRjBZU0E4TFNCaWFXNWtYM0p2ZDNNb2RHVnRjREVzSUhSbGJYQXlMQ0IwWlcxd015d2dkR1Z0Y0RRc0lIUmxiWEExTEZ4dUlDQWdJQ0FnSUNBZ2RHVnRjRFlzSUhSbGJYQTNMQ0IwWlcxd09Dd2dkR1Z0Y0Rrc0lIUmxiWEF4TUNsY2JseHVJeUJXYVhOMVlXeHBlbUYwYVc5dVhHNXNhV0p5WVhKNUtHTnBjbU5zYVhwbEtWeHVYRzVvWldGMGJXRndYMlJoZEdFZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUdsdWRHVnlaWE4wTENCdlpHUnpVbUYwYVc4cElDVStKVnh1Y0dsMmIzUmZkMmxrWlhJb2JtRnRaWE5mWm5KdmJTQTlJR2x1ZEdWeVpYTjBMQ0IyWVd4MVpYTmZabkp2YlNBOUlHOWtaSE5TWVhScGJ5a2dKVDRsWEc0Z0lHTnZiSFZ0Ymw5MGIxOXliM2R1WVcxbGN5aDJZWElnUFNCY1hIUmhjbWRsZEZ4Y0tWeHVYRzV3ZG1Gc2RXVmZaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYVc1MFpYSmxjM1FzSUhCMllXeDFaU2tnSlQ0bFhHNGdJSEJwZG05MFgzZHBaR1Z5S0c1aGJXVnpYMlp5YjIwZ1BTQnBiblJsY21WemRDd2dkbUZzZFdWelgyWnliMjBnUFNCd2RtRnNkV1VwSUNVK0pWeHVJQ0JqYjJ4MWJXNWZkRzlmY205M2JtRnRaWE1vZG1GeUlEMGdYRngwWVhKblpYUmNYQ2xjYmx4dVkyOXNYMloxYmlBOExTQmpiMnh2Y2xKaGJYQXlLR01vTUN3Z01Td2dNeWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR01vWEZ4aWJIVmxYRndzSUZ4Y2QyaHBkR1ZjWEN3Z1hGeHlaV1JjWENrcFhHNWNia2hsWVhSdFlYQW9ZWE11YldGMGNtbDRLR2hsWVhSdFlYQmZaR0YwWVNrc1hHNGdJQ0FnSUNBZ0lHNWhiV1VnUFNCY1hFOWtaSE1nVW1GMGFXOWNYQ3hjYmlBZ0lDQWdJQ0FnWTI5c0lEMGdZMjlzWDJaMWJpeGNiaUFnSUNBZ0lDQWdJeUJCWkdRZ1lXNXViM1JoZEdsdmJpQm1iM0lnY0MxMllXeDFaWE5jYmlBZ0lDQWdJQ0FnWTJWc2JGOW1kVzRnUFNCbWRXNWpkR2x2YmlocUxDQnBMQ0I0TENCNUxDQjNhV1IwYUN3Z2FHVnBaMmgwTENCbWFXeHNLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2NIWmhiQ0E4TFNCd2RtRnNkV1ZmWkdGMFlWdHBMQ0JxWFZ4dUlDQWdJQ0FnSUNBZ0lHeGhZbVZzSUR3dElHbG1aV3h6WlNod2RtRnNJRDRnTUM0d05Td2dYRnh1TG5NdVhGd3NJSE53Y21sdWRHWW9YRndsTGpKbFhGd3NJSEIyWVd3cEtWeHVJQ0FnSUNBZ0lDQWdJR2R5YVdRdWRHVjRkQ2hzWVdKbGJDd2dlQ3dnZVN3Z1ozQWdQU0JuY0dGeUtHWnZiblJ6YVhwbElEMGdNVEFwS1Z4dUlDQWdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ0lDQWpJRU4xYzNSdmJXbDZaU0IwYUdVZ2FHVmhkRzFoY0NCc1lYbHZkWFJjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjbDl5YjNkeklEMGdWRkpWUlN4Y2JpQWdJQ0FnSUNBZ2MyaHZkMTl5YjNkZlpHVnVaQ0E5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JqYkhWemRHVnlYMk52YkhWdGJuTWdQU0JHUVV4VFJTeGNiaUFnSUNBZ0lDQWdZMjlzZFcxdVgzUnBkR3hsSUQwZ1hGeEpiblJsY21WemRGeGNMRnh1SUNBZ0lDQWdJQ0J5YjNkZmRHbDBiR1VnUFNCY1hGUmhjbWRsZEZ4Y0xGeHVJQ0FnSUNBZ0lDQm9aV0YwYldGd1gyeGxaMlZ1WkY5d1lYSmhiU0E5SUd4cGMzUW9ZWFFnUFNCaktEQXNJREVzSURJc0lETXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4aFltVnNjeUE5SUdNb1hGd3dYRndzSUZ4Y01WeGNMQ0JjWERKY1hDd2dYRnd6WEZ3cEtTbGNibHh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuXG5cbiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIHRhcmdldFxudGVtcDEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEFUQUNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcQ1RDRlxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAzIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxFU1JSQl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxLTEY0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE5BTk9HX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxTTUMxXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFRCUFxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcblxuXG5cblxuZGF0YSA8LSBiaW5kX3Jvd3ModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LFxuICAgICAgICAgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMClcblxuIyBWaXN1YWxpemF0aW9uXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksXG4gICAgICAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCxcbiAgICAgICAgY29sID0gY29sX2Z1bixcbiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXNcbiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7XG4gICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXVxuICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgXFxuLnMuXFwsIHNwcmludGYoXFwlLjJlXFwsIHB2YWwpKVxuICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKVxuICAgICAgICB9LFxuICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXRcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY29sdW1uX3RpdGxlID0gXFxJbnRlcmVzdFxcLFxuICAgICAgICByb3dfdGl0bGUgPSBcXFRhcmdldFxcLFxuICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIsIDMpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoXFwwXFwsIFxcMVxcLCBcXDJcXCwgXFwzXFwpKSlcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5cbiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIHRhcmdldFxudGVtcDEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEFUQUNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcQ1RDRlxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAzIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxFU1JSQl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxLTEY0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE5BTk9HX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxTTUMxXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFRCUFxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcblxuXG5cblxuZGF0YSA8LSBiaW5kX3Jvd3ModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LFxuICAgICAgICAgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMClcblxuIyBWaXN1YWxpemF0aW9uXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksXG4gICAgICAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCxcbiAgICAgICAgY29sID0gY29sX2Z1bixcbiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXNcbiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7XG4gICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXVxuICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgXFxuLnMuXFwsIHNwcmludGYoXFwlLjJlXFwsIHB2YWwpKVxuICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKVxuICAgICAgICB9LFxuICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXRcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY29sdW1uX3RpdGxlID0gXFxJbnRlcmVzdFxcLFxuICAgICAgICByb3dfdGl0bGUgPSBcXFRhcmdldFxcLFxuICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIsIDMpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoXFwwXFwsIFxcMVxcLCBcXDJcXCwgXFwzXFwpKSlcblxuYGBgXG5gYGAifQ== -->

```r
```r


#### Importing loops of target
temp1 <- runFisherExactCombinationTarget(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTarget(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTarget(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTarget(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTarget(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTarget(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTarget(\OCT4_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTarget(\SMC1\, interestName,
                                     loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTarget(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTarget(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 3), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3), 
                                    labels = c(\0\, \1\, \2\, \3\)))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

## [2.24.2] Checking bookmarking - A485
#### All loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSXlCSmJYQnZjblJwYm1jZ2JHOXZjSE1nYjJZZ2FXNTBaWEpsYzNSY2JtbHVkR1Z5WlhOMFRtRnRaU0E4TFNCY0luSmxaMHh2YjNCY0lseHVJeUJDUVVOTFIxSlBWVTVFSUd4dmIzQmNibUpoWTJ0bmNtOTFibVFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaUzVpWldSd1pWd2lLU2xjYm1KaFkydG5jbTkxYm1RdVozSWdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9ZbUZqYTJkeWIzVnVaQ2twWEc0aklGVlFJR3h2YjNCY2JteHZiM0F1ZFhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5Qk5EZzFkbk5FVFZOUFgxVlFYMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BYRzVzYjI5d0xuVndMbWR5SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVkWEFwS1Z4dUl5Qk9UeUJzYjI5d1hHNXNiMjl3TG01dklEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjR1V0Y0dWZlFUUTROWFp6UkUxVFQxOU9UMTlrYVdabU1DNHlMbUpsWkhCbFhDSXBLVnh1Ykc5dmNDNXVieTVuY2lBOExTQW9aWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbTV2S1NsY2JpTWdSRTlYVGlCc2IyOXdYRzVzYjI5d0xtUnZkMjRnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlCTkRnMWRuTkVUVk5QWDBSUFYwNWZaR2xtWmpBdU1pNWlaV1J3WlZ3aUtTbGNibXh2YjNBdVpHOTNiaTVuY2lBOExTQW9aWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbVJ2ZDI0cEtWeHVYRzVtZDNKcGRHVW9ZWE5mZEdsaVlteGxLR3h2YjNBdWRYQXVaM0lwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hObGNXNWhiV1Z6TENCemRHRnlkQ3dnWlc1a0tTd2dhR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pWOUJORGcxZG5ORVRWTlBYMVZRWDJScFptWXdMakl1WVc1amFHOXlMbUpsWkZ3aUtTd2dZMjlzTG01aGJXVnpJRDBnUmtGTVUwVXNJSE5sY0NBOUlGd2lYRngwWENJcFhHNW1kM0pwZEdVb1lYTmZkR2xpWW14bEtHeHZiM0F1Ym04dVozSXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSE5sY1c1aGJXVnpMQ0J6ZEdGeWRDd2daVzVrS1N3Z2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5Qk5EZzFkbk5FVFZOUFgwNVBYMlJwWm1Zd0xqSXVZVzVqYUc5eUxtSmxaRndpS1N3Z1kyOXNMbTVoYldWeklEMGdSa0ZNVTBVc0lITmxjQ0E5SUZ3aVhGeDBYQ0lwWEc1bWQzSnBkR1VvWVhOZmRHbGlZbXhsS0d4dmIzQXVaRzkzYmk1bmNpa2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9jMlZ4Ym1GdFpYTXNJSE4wWVhKMExDQmxibVFwTENCb1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDBFME9EVjJjMFJOVTA5ZlJFOVhUbDlrYVdabU1DNHlMbUZ1WTJodmNpNWlaV1JjSWlrc0lHTnZiQzV1WVcxbGN5QTlJRVpCVEZORkxDQnpaWEFnUFNCY0lseGNkRndpS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jIyMjIEltcG9ydGluZyBsb29wcyBvZiBpbnRlcmVzdFxuaW50ZXJlc3ROYW1lIDwtIFxccmVnTG9vcFxcXG4jIEJBQ0tHUk9VTkQgbG9vcFxuYmFja2dyb3VuZCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlXFwpKVxuYmFja2dyb3VuZC5nciA8LSAoZXh0cmFjdEFuY2hvcihiYWNrZ3JvdW5kKSlcbiMgVVAgbG9vcFxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3AudXAuZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG4jIE5PIGxvb3Bcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxuIyBET1dOIGxvb3Bcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5kb3duLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpXG5cbmZ3cml0ZShhc190aWJibGUobG9vcC51cC5ncikgJT4lIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5hbmNob3IuYmVkXFwpLCBjb2wubmFtZXMgPSBGQUxTRSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZShhc190aWJibGUobG9vcC5uby5ncikgJT4lIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fTk9fZGlmZjAuMi5hbmNob3IuYmVkXFwpLCBjb2wubmFtZXMgPSBGQUxTRSwgc2VwID0gXFxcXHRcXClcbmZ3cml0ZShhc190aWJibGUobG9vcC5kb3duLmdyKSAlPiUgZHBseXI6OnNlbGVjdChzZXFuYW1lcywgc3RhcnQsIGVuZCksIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYW5jaG9yLmJlZFxcKSwgY29sLm5hbWVzID0gRkFMU0UsIHNlcCA9IFxcXFx0XFwpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
#### Importing loops of interest
interestName <- \regLoop\
# BACKGROUND loop
background <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\))
background.gr <- (extractAnchor(background))
# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.bedpe\))
loop.up.gr <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.bedpe\))
loop.no.gr <- (extractAnchor(loop.no))
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.bedpe\))
loop.down.gr <- (extractAnchor(loop.down))

fwrite(as_tibble(loop.up.gr) %>% dplyr::select(seqnames, start, end), here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.anchor.bed\), col.names = FALSE, sep = \\t\)
fwrite(as_tibble(loop.no.gr) %>% dplyr::select(seqnames, start, end), here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.anchor.bed\), col.names = FALSE, sep = \\t\)
fwrite(as_tibble(loop.down.gr) %>% dplyr::select(seqnames, start, end), here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.anchor.bed\), col.names = FALSE, sep = \\t\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJeUJKYlhCdmNuUnBibWNnYkc5dmNITWdiMllnYVc1MFpYSmxjM1JjYm1sdWRHVnlaWE4wVG1GdFpTQThMU0JjWEhKbFoweHZiM0JjWEZ4dUl5QkNRVU5MUjFKUFZVNUVJR3h2YjNCY2JtSmhZMnRuY205MWJtUWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pTNWlaV1J3WlZ4Y0tTbGNibUpoWTJ0bmNtOTFibVF1WjNJZ1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb1ltRmphMmR5YjNWdVpDa3BYRzRqSUZWUUlHeHZiM0JjYm14dmIzQXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlCTkRnMWRuTkVUVk5QWDFWUVgyUnBabVl3TGpJdVltVmtjR1ZjWENrcFhHNXNiMjl3TG5Wd0xtZHlJRHd0SUNobGVIUnlZV04wUVc1amFHOXlLR3h2YjNBdWRYQXBLVnh1SXlCT1R5QnNiMjl3WEc1c2IyOXdMbTV2SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZmNHVXRjR1ZmUVRRNE5YWnpSRTFUVDE5T1QxOWthV1ptTUM0eUxtSmxaSEJsWEZ3cEtWeHViRzl2Y0M1dWJ5NW5jaUE4TFNBb1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtNXZLU2xjYmlNZ1JFOVhUaUJzYjI5d1hHNXNiMjl3TG1SdmQyNGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pWOUJORGcxZG5ORVRWTlBYMFJQVjA1ZlpHbG1aakF1TWk1aVpXUndaVnhjS1NsY2JteHZiM0F1Wkc5M2JpNW5jaUE4TFNBb1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtUnZkMjRwS1Z4dVhHNW1kM0pwZEdVb1lYTmZkR2xpWW14bEtHeHZiM0F1ZFhBdVozSXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSE5sY1c1aGJXVnpMQ0J6ZEdGeWRDd2daVzVrS1N3Z2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5Qk5EZzFkbk5FVFZOUFgxVlFYMlJwWm1Zd0xqSXVZVzVqYUc5eUxtSmxaRnhjS1N3Z1kyOXNMbTVoYldWeklEMGdSa0ZNVTBVc0lITmxjQ0E5SUZ4Y1hGeDBYRndwWEc1bWQzSnBkR1VvWVhOZmRHbGlZbXhsS0d4dmIzQXVibTh1WjNJcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtITmxjVzVoYldWekxDQnpkR0Z5ZEN3Z1pXNWtLU3dnYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlCTkRnMWRuTkVUVk5QWDA1UFgyUnBabVl3TGpJdVlXNWphRzl5TG1KbFpGeGNLU3dnWTI5c0xtNWhiV1Z6SUQwZ1JrRk1VMFVzSUhObGNDQTlJRnhjWEZ4MFhGd3BYRzVtZDNKcGRHVW9ZWE5mZEdsaVlteGxLR3h2YjNBdVpHOTNiaTVuY2lrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2MyVnhibUZ0WlhNc0lITjBZWEowTENCbGJtUXBMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNCbExYQmxYMEUwT0RWMmMwUk5VMDlmUkU5WFRsOWthV1ptTUM0eUxtRnVZMmh2Y2k1aVpXUmNYQ2tzSUdOdmJDNXVZVzFsY3lBOUlFWkJURk5GTENCelpYQWdQU0JjWEZ4Y2RGeGNLVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgaW50ZXJlc3RcbmludGVyZXN0TmFtZSA8LSBcXHJlZ0xvb3BcXFxuIyBCQUNLR1JPVU5EIGxvb3BcbmJhY2tncm91bmQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZS5iZWRwZVxcKSlcbmJhY2tncm91bmQuZ3IgPC0gKGV4dHJhY3RBbmNob3IoYmFja2dyb3VuZCkpXG4jIFVQIGxvb3Bcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLnVwLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxuIyBOTyBsb29wXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5uby5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbiMgRE9XTiBsb29wXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3AuZG93bi5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxuXG5md3JpdGUoYXNfdGliYmxlKGxvb3AudXAuZ3IpICU+JSBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kKSwgaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYW5jaG9yLmJlZFxcKSwgY29sLm5hbWVzID0gRkFMU0UsIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoYXNfdGliYmxlKGxvb3Aubm8uZ3IpICU+JSBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kKSwgaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX05PX2RpZmYwLjIuYW5jaG9yLmJlZFxcKSwgY29sLm5hbWVzID0gRkFMU0UsIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoYXNfdGliYmxlKGxvb3AuZG93bi5ncikgJT4lIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fRE9XTl9kaWZmMC4yLmFuY2hvci5iZWRcXCksIGNvbC5uYW1lcyA9IEZBTFNFLCBzZXAgPSBcXFxcdFxcKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgaW50ZXJlc3RcbmludGVyZXN0TmFtZSA8LSBcXHJlZ0xvb3BcXFxuIyBCQUNLR1JPVU5EIGxvb3BcbmJhY2tncm91bmQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZS5iZWRwZVxcKSlcbmJhY2tncm91bmQuZ3IgPC0gKGV4dHJhY3RBbmNob3IoYmFja2dyb3VuZCkpXG4jIFVQIGxvb3Bcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLnVwLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxuIyBOTyBsb29wXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5uby5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbiMgRE9XTiBsb29wXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3AuZG93bi5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxuXG5md3JpdGUoYXNfdGliYmxlKGxvb3AudXAuZ3IpICU+JSBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kKSwgaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYW5jaG9yLmJlZFxcKSwgY29sLm5hbWVzID0gRkFMU0UsIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoYXNfdGliYmxlKGxvb3Aubm8uZ3IpICU+JSBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kKSwgaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX05PX2RpZmYwLjIuYW5jaG9yLmJlZFxcKSwgY29sLm5hbWVzID0gRkFMU0UsIHNlcCA9IFxcXFx0XFwpXG5md3JpdGUoYXNfdGliYmxlKGxvb3AuZG93bi5ncikgJT4lIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fRE9XTl9kaWZmMC4yLmFuY2hvci5iZWRcXCksIGNvbC5uYW1lcyA9IEZBTFNFLCBzZXAgPSBcXFxcdFxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
#### Importing loops of interest
interestName <- \regLoop\
# BACKGROUND loop
background <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\))
background.gr <- (extractAnchor(background))
# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.bedpe\))
loop.up.gr <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.bedpe\))
loop.no.gr <- (extractAnchor(loop.no))
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.bedpe\))
loop.down.gr <- (extractAnchor(loop.down))

fwrite(as_tibble(loop.up.gr) %>% dplyr::select(seqnames, start, end), here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.anchor.bed\), col.names = FALSE, sep = \\t\)
fwrite(as_tibble(loop.no.gr) %>% dplyr::select(seqnames, start, end), here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.anchor.bed\), col.names = FALSE, sep = \\t\)
fwrite(as_tibble(loop.down.gr) %>% dplyr::select(seqnames, start, end), here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.anchor.bed\), col.names = FALSE, sep = \\t\)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### All loops refined

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzVjYmlNakl5TWdTVzF3YjNKMGFXNW5JR3h2YjNCeklHOW1JSFJoY21kbGRGeHVkR1Z0Y0RFZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY0lrRlVRVU5mWldabWFXVmNJaXdnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdNaUE4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRndpUTFSRFJsd2lMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXpJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YQ0pGVTFKU1FsOWtjMmRjSWl3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyOXdMblZ3TG1keUxDQnNiMjl3TG01dkxtZHlMQ0JzYjI5d0xtUnZkMjR1WjNJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF1WjNJcFhHNTBaVzF3TkNBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z3aVNETkxNamRoWTE5bFptWnBaVndpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEExSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWENKTFRFWTBYMlZtWm1sbFhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNEWWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJazVCVGs5SFgyUnpaMXdpTENCcGJuUmxjbVZ6ZEU1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEEzSUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWENKUFExUTBYMlZtWm1sbFhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1ZEdWdGNEZ2dQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNJbE5OUXpGY0lpd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBNUlEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hDSlRUMWd5WDJSeloxd2lMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQXhNQ0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRndpVkVKUVhDSXNJR2x1ZEdWeVpYTjBUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0M1MWNDNW5jaXdnYkc5dmNDNXVieTVuY2l3Z2JHOXZjQzVrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xtZHlLVnh1WEc1Y2JseHVYRzVrWVhSaElEd3RJR0pwYm1SZmNtOTNjeWgwWlcxd01Td2dkR1Z0Y0RJc0lIUmxiWEF6TENCMFpXMXdOQ3dnZEdWdGNEVXNYRzRnSUNBZ0lDQWdJQ0IwWlcxd05pd2dkR1Z0Y0Rjc0lIUmxiWEE0TENCMFpXMXdPU3dnZEdWdGNERXdLVnh1WEc0aklGWnBjM1ZoYkdsNllYUnBiMjVjYm14cFluSmhjbmtvWTJseVkyeHBlbVVwWEc1Y2JtaGxZWFJ0WVhCZlpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSFJoY21kbGRDd2dhVzUwWlhKbGMzUXNJRzlrWkhOU1lYUnBieWtnSlQ0bFhHNXdhWFp2ZEY5M2FXUmxjaWh1WVcxbGMxOW1jbTl0SUQwZ2FXNTBaWEpsYzNRc0lIWmhiSFZsYzE5bWNtOXRJRDBnYjJSa2MxSmhkR2x2S1NBbFBpVmNiaUFnWTI5c2RXMXVYM1J2WDNKdmQyNWhiV1Z6S0haaGNpQTlJRndpZEdGeVoyVjBYQ0lwWEc1Y2JuQjJZV3gxWlY5a1lYUmhJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kR0Z5WjJWMExDQnBiblJsY21WemRDd2djSFpoYkhWbEtTQWxQaVZjYmlBZ2NHbDJiM1JmZDJsa1pYSW9ibUZ0WlhOZlpuSnZiU0E5SUdsdWRHVnlaWE4wTENCMllXeDFaWE5mWm5KdmJTQTlJSEIyWVd4MVpTa2dKVDRsWEc0Z0lHTnZiSFZ0Ymw5MGIxOXliM2R1WVcxbGN5aDJZWElnUFNCY0luUmhjbWRsZEZ3aUtWeHVYRzVqYjJ4ZlpuVnVJRHd0SUdOdmJHOXlVbUZ0Y0RJb1l5Z3dMQ0F4TENBektTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1l5aGNJbUpzZFdWY0lpd2dYQ0ozYUdsMFpWd2lMQ0JjSW5KbFpGd2lLU2xjYmx4dVNHVmhkRzFoY0NoaGN5NXRZWFJ5YVhnb2FHVmhkRzFoY0Y5a1lYUmhLU3hjYmlBZ0lDQWdJQ0FnYm1GdFpTQTlJRndpVDJSa2N5QlNZWFJwYjF3aUxGeHVJQ0FnSUNBZ0lDQmpiMndnUFNCamIyeGZablZ1TEZ4dUlDQWdJQ0FnSUNBaklFRmtaQ0JoYm01dmRHRjBhVzl1SUdadmNpQndMWFpoYkhWbGMxeHVJQ0FnSUNBZ0lDQmpaV3hzWDJaMWJpQTlJR1oxYm1OMGFXOXVLR29zSUdrc0lIZ3NJSGtzSUhkcFpIUm9MQ0JvWldsbmFIUXNJR1pwYkd3cElIdGNiaUFnSUNBZ0lDQWdJQ0J3ZG1Gc0lEd3RJSEIyWVd4MVpWOWtZWFJoVzJrc0lHcGRYRzRnSUNBZ0lDQWdJQ0FnYkdGaVpXd2dQQzBnYVdabGJITmxLSEIyWVd3Z1BpQXdMakExTENCY0ltNHVjeTVjSWl3Z2MzQnlhVzUwWmloY0lpVXVNbVZjSWl3Z2NIWmhiQ2twWEc0Z0lDQWdJQ0FnSUNBZ1ozSnBaQzUwWlhoMEtHeGhZbVZzTENCNExDQjVMQ0JuY0NBOUlHZHdZWElvWm05dWRITnBlbVVnUFNBeE1Da3BYRzRnSUNBZ0lDQWdJSDBzWEc0Z0lDQWdJQ0FnSUNNZ1EzVnpkRzl0YVhwbElIUm9aU0JvWldGMGJXRndJR3hoZVc5MWRGeHVJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeVgzSnZkM01nUFNCVVVsVkZMRnh1SUNBZ0lDQWdJQ0J6YUc5M1gzSnZkMTlrWlc1a0lEMGdSa0ZNVTBVc1hHNGdJQ0FnSUNBZ0lHTnNkWE4wWlhKZlkyOXNkVzF1Y3lBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCamIyeDFiVzVmZEdsMGJHVWdQU0JjSWtsdWRHVnlaWE4wWENJc1hHNGdJQ0FnSUNBZ0lISnZkMTkwYVhSc1pTQTlJRndpVkdGeVoyVjBYQ0lzWEc0Z0lDQWdJQ0FnSUdobFlYUnRZWEJmYkdWblpXNWtYM0JoY21GdElEMGdiR2x6ZENoaGRDQTlJR01vTUN3Z01Td2dNaXdnTXlrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld4eklEMGdZeWhjSWpCY0lpd2dYQ0l4WENJc0lGd2lNbHdpTENCY0lqTmNJaWtwS1Z4dVhHNWNibHh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcblxuXG4jIyMjIEltcG9ydGluZyBsb29wcyBvZiB0YXJnZXRcbnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxBVEFDX2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDIgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXENUQ0ZcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcRVNSUkJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEgzSzI3YWNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcS0xGNF9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA2IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxOQU5PR19kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcT0NUNF9lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxTTUMxXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU09YMl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFRCUFxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcblxuXG5cblxuZGF0YSA8LSBiaW5kX3Jvd3ModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LFxuICAgICAgICAgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMClcblxuIyBWaXN1YWxpemF0aW9uXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksXG4gICAgICAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCxcbiAgICAgICAgY29sID0gY29sX2Z1bixcbiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXNcbiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7XG4gICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXVxuICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgXFxuLnMuXFwsIHNwcmludGYoXFwlLjJlXFwsIHB2YWwpKVxuICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKVxuICAgICAgICB9LFxuICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXRcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY29sdW1uX3RpdGxlID0gXFxJbnRlcmVzdFxcLFxuICAgICAgICByb3dfdGl0bGUgPSBcXFRhcmdldFxcLFxuICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIsIDMpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoXFwwXFwsIFxcMVxcLCBcXDJcXCwgXFwzXFwpKSlcblxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


#### Importing loops of target
temp1 <- runFisherExactCombinationTarget(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTarget(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTarget(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTarget(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTarget(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTarget(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTarget(\OCT4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTarget(\SMC1\, interestName,
                                     loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTarget(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTarget(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 3), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3), 
                                    labels = c(\0\, \1\, \2\, \3\)))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNWNiaU1qSXlNZ1NXMXdiM0owYVc1bklHeHZiM0J6SUc5bUlIUmhjbWRsZEZ4dWRHVnRjREVnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkQ2hjWEVGVVFVTmZaV1ptYVdWY1hDd2dhVzUwWlhKbGMzUk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3TG5Wd0xtZHlMQ0JzYjI5d0xtNXZMbWR5TENCc2IyOXdMbVJ2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdVozSXBYRzUwWlcxd01pQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMEtGeGNRMVJEUmx4Y0xDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBeklEd3RJSEoxYmtacGMyaGxja1Y0WVdOMFEyOXRZbWx1WVhScGIyNVVZWEpuWlhRb1hGeEZVMUpTUWw5a2MyZGNYQ3dnYVc1MFpYSmxjM1JPWVcxbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d0xuVndMbWR5TENCc2IyOXdMbTV2TG1keUxDQnNiMjl3TG1SdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXVaM0lwWEc1MFpXMXdOQ0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRnhjU0ROTE1qZGhZMTlsWm1acFpWeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTFJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YRnhMVEVZMFgyVm1abWxsWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RZZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hFNUJUazlIWDJSeloxeGNMQ0JwYm5SbGNtVnpkRTVoYldVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNBdWRYQXVaM0lzSUd4dmIzQXVibTh1WjNJc0lHeHZiM0F1Wkc5M2JpNW5jaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDNW5jaWxjYm5SbGJYQTNJRHd0SUhKMWJrWnBjMmhsY2tWNFlXTjBRMjl0WW1sdVlYUnBiMjVVWVhKblpYUW9YRnhQUTFRMFgyVm1abWxsWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVkR1Z0Y0RnZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY1hGTk5RekZjWEN3Z2FXNTBaWEpsYzNST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQXVkWEF1WjNJc0lHeHZiM0F1Ym04dVozSXNJR3h2YjNBdVpHOTNiaTVuY2l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzVuY2lsY2JuUmxiWEE1SUR3dElISjFia1pwYzJobGNrVjRZV04wUTI5dFltbHVZWFJwYjI1VVlYSm5aWFFvWEZ4VFQxZ3lYMlJ6WjF4Y0xDQnBiblJsY21WemRFNWhiV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0F1ZFhBdVozSXNJR3h2YjNBdWJtOHVaM0lzSUd4dmIzQXVaRzkzYmk1bmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkM1bmNpbGNiblJsYlhBeE1DQThMU0J5ZFc1R2FYTm9aWEpGZUdGamRFTnZiV0pwYm1GMGFXOXVWR0Z5WjJWMEtGeGNWRUpRWEZ3c0lHbHVkR1Z5WlhOMFRtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjQzUxY0M1bmNpd2diRzl2Y0M1dWJ5NW5jaXdnYkc5dmNDNWtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTG1keUtWeHVYRzVjYmx4dVhHNWtZWFJoSUR3dElHSnBibVJmY205M2N5aDBaVzF3TVN3Z2RHVnRjRElzSUhSbGJYQXpMQ0IwWlcxd05Dd2dkR1Z0Y0RVc1hHNGdJQ0FnSUNBZ0lDQjBaVzF3Tml3Z2RHVnRjRGNzSUhSbGJYQTRMQ0IwWlcxd09Td2dkR1Z0Y0RFd0tWeHVYRzRqSUZacGMzVmhiR2w2WVhScGIyNWNibXhwWW5KaGNua29ZMmx5WTJ4cGVtVXBYRzVjYm1obFlYUnRZWEJmWkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2FXNTBaWEpsYzNRc0lHOWtaSE5TWVhScGJ5a2dKVDRsWEc1d2FYWnZkRjkzYVdSbGNpaHVZVzFsYzE5bWNtOXRJRDBnYVc1MFpYSmxjM1FzSUhaaGJIVmxjMTltY205dElEMGdiMlJrYzFKaGRHbHZLU0FsUGlWY2JpQWdZMjlzZFcxdVgzUnZYM0p2ZDI1aGJXVnpLSFpoY2lBOUlGeGNkR0Z5WjJWMFhGd3BYRzVjYm5CMllXeDFaVjlrWVhSaElEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCcGJuUmxjbVZ6ZEN3Z2NIWmhiSFZsS1NBbFBpVmNiaUFnY0dsMmIzUmZkMmxrWlhJb2JtRnRaWE5mWm5KdmJTQTlJR2x1ZEdWeVpYTjBMQ0IyWVd4MVpYTmZabkp2YlNBOUlIQjJZV3gxWlNrZ0pUNGxYRzRnSUdOdmJIVnRibDkwYjE5eWIzZHVZVzFsY3loMllYSWdQU0JjWEhSaGNtZGxkRnhjS1Z4dVhHNWpiMnhmWm5WdUlEd3RJR052Ykc5eVVtRnRjRElvWXlnd0xDQXhMQ0F6S1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWXloY1hHSnNkV1ZjWEN3Z1hGeDNhR2wwWlZ4Y0xDQmNYSEpsWkZ4Y0tTbGNibHh1U0dWaGRHMWhjQ2hoY3k1dFlYUnlhWGdvYUdWaGRHMWhjRjlrWVhSaEtTeGNiaUFnSUNBZ0lDQWdibUZ0WlNBOUlGeGNUMlJrY3lCU1lYUnBiMXhjTEZ4dUlDQWdJQ0FnSUNCamIyd2dQU0JqYjJ4ZlpuVnVMRnh1SUNBZ0lDQWdJQ0FqSUVGa1pDQmhibTV2ZEdGMGFXOXVJR1p2Y2lCd0xYWmhiSFZsYzF4dUlDQWdJQ0FnSUNCalpXeHNYMloxYmlBOUlHWjFibU4wYVc5dUtHb3NJR2tzSUhnc0lIa3NJSGRwWkhSb0xDQm9aV2xuYUhRc0lHWnBiR3dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQndkbUZzSUR3dElIQjJZV3gxWlY5a1lYUmhXMmtzSUdwZFhHNGdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BDMGdhV1psYkhObEtIQjJZV3dnUGlBd0xqQTFMQ0JjWEc0dWN5NWNYQ3dnYzNCeWFXNTBaaWhjWENVdU1tVmNYQ3dnY0haaGJDa3BYRzRnSUNBZ0lDQWdJQ0FnWjNKcFpDNTBaWGgwS0d4aFltVnNMQ0I0TENCNUxDQm5jQ0E5SUdkd1lYSW9abTl1ZEhOcGVtVWdQU0F4TUNrcFhHNGdJQ0FnSUNBZ0lIMHNYRzRnSUNBZ0lDQWdJQ01nUTNWemRHOXRhWHBsSUhSb1pTQm9aV0YwYldGd0lHeGhlVzkxZEZ4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5WDNKdmQzTWdQU0JVVWxWRkxGeHVJQ0FnSUNBZ0lDQnphRzkzWDNKdmQxOWtaVzVrSUQwZ1JrRk1VMFVzWEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpmWTI5c2RXMXVjeUE5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JqYjJ4MWJXNWZkR2wwYkdVZ1BTQmNYRWx1ZEdWeVpYTjBYRndzWEc0Z0lDQWdJQ0FnSUhKdmQxOTBhWFJzWlNBOUlGeGNWR0Z5WjJWMFhGd3NYRzRnSUNBZ0lDQWdJR2hsWVhSdFlYQmZiR1ZuWlc1a1gzQmhjbUZ0SUQwZ2JHbHpkQ2hoZENBOUlHTW9NQ3dnTVN3Z01pd2dNeWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHRmlaV3h6SUQwZ1l5aGNYREJjWEN3Z1hGd3hYRndzSUZ4Y01seGNMQ0JjWEROY1hDa3BLVnh1WEc1Y2JseHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG5cblxuIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgdGFyZ2V0XG50ZW1wMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcQVRBQ19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxDVENGXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEVTUlJCX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxIM0syN2FjX2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEtMRjRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcTkFOT0dfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDcgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE9DVDRfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wOCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcU01DMVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDkgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNPWDJfZHNnXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDEwIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxUQlBcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG5cblxuXG5cbmRhdGEgPC0gYmluZF9yb3dzKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSxcbiAgICAgICAgIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTApXG5cbiMgVmlzdWFsaXphdGlvblxubGlicmFyeShjaXJjbGl6ZSlcblxuaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiVcbnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxucHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JVxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDMpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5IZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLFxuICAgICAgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4sXG4gICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzXG4gICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkge1xuICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal1cbiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsIFxcbi5zLlxcLCBzcHJpbnRmKFxcJS4yZVxcLCBwdmFsKSlcbiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSlcbiAgICAgICAgfSxcbiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0XG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIGNvbHVtbl90aXRsZSA9IFxcSW50ZXJlc3RcXCxcbiAgICAgICAgcm93X3RpdGxlID0gXFxUYXJnZXRcXCxcbiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGF0ID0gYygwLCAxLCAyLCAzKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKFxcMFxcLCBcXDFcXCwgXFwyXFwsIFxcM1xcKSkpXG5cblxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5cbiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIHRhcmdldFxudGVtcDEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEFUQUNfZWZmaWVcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcQ1RDRlxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAzIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxFU1JSQl9kc2dcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpXG50ZW1wNCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcSDNLMjdhY19lZmZpZVxcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxLTEY0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXE5BTk9HX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxPQ1Q0X2VmZmllXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxudGVtcDggPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXFNNQzFcXCwgaW50ZXJlc3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXA5IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxTT1gyX2RzZ1xcLCBpbnRlcmVzdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncilcbnRlbXAxMCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcVEJQXFwsIGludGVyZXN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKVxuXG5cblxuXG5kYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsXG4gICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwKVxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAzKSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjb2x1bW5fdGl0bGUgPSBcXEludGVyZXN0XFwsXG4gICAgICAgIHJvd190aXRsZSA9IFxcVGFyZ2V0XFwsXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMyksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcLCBcXDNcXCkpKVxuXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r


#### Importing loops of target
temp1 <- runFisherExactCombinationTarget(\ATAC_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp2 <- runFisherExactCombinationTarget(\CTCF\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp3 <- runFisherExactCombinationTarget(\ESRRB_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp4 <- runFisherExactCombinationTarget(\H3K27ac_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp5 <- runFisherExactCombinationTarget(\KLF4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp6 <- runFisherExactCombinationTarget(\NANOG_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp7 <- runFisherExactCombinationTarget(\OCT4_effie\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp8 <- runFisherExactCombinationTarget(\SMC1\, interestName,
                                     loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp9 <- runFisherExactCombinationTarget(\SOX2_dsg\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)
temp10 <- runFisherExactCombinationTarget(\TBP\, interestName,
                                      loop.up.gr, loop.no.gr, loop.down.gr,
                                      background.gr)




data <- bind_rows(temp1, temp2, temp3, temp4, temp5,
         temp6, temp7, temp8, temp9, temp10)

# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 3), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3), 
                                    labels = c(\0\, \1\, \2\, \3\)))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Reg loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMlZ1WlM1MFlpQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKdGJURXdYMGRTUTIwek9DNXdObDluWlc1bFgzTnZjblJsWkM1aVpXUmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGUlRVeUE5SUdsbVpXeHpaU2hXTkNBOVBTQmNJaXRjSWl3Z1ZqSXNJRll6S1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9WakVzSUZSVFV5d2dWallwWEc1amIyeHVZVzFsY3loblpXNWxMblJpS1NBOExTQmpLRndpWTJoeVhDSXNJRndpVkZOVFhDSXNJRndpWlc1elpXMWliRndpS1Z4dVhHNWthV1ptTGxKT1FTQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKa2FXWm1YMGN4TGtFME9EVXVjMlZzWldOMFpXUXlYMGN4TGpKcExrRTBPRFZmZG5OZlJ6RXVNbWt1UkUxVFR5NTBjM1pjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR1Z1YzJWdFlteGZaMlZ1WlY5cFpDd2diRzluTWtadmJHUkRhR0Z1WjJVc0lITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2NHRmthaXdnWlhoMFpYSnVZV3hmWjJWdVpWOXVZVzFsS1Z4dVpHbG1aaTVTVGtFZ1BDMGdaR2xtWmk1U1RrRWdKVDRsSUdSd2JIbHlPanBzWldaMFgycHZhVzRvWjJWdVpTNTBZaXdnWW5rZ1BTQmpLRndpWlc1elpXMWliRjluWlc1bFgybGtYQ0lnUFNCY0ltVnVjMlZ0WW14Y0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0NGcGN5NXVZU2hVVTFNcEtWeHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dVptTkRkWFJ2Wm1ZZ1BDMGdNQzQxWEc1Y2JtUnBabVl1VWs1QklEd3RJR1JwWm1ZdVVrNUJJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR1JwWm1ZZ1BTQmpZWE5sWDNkb1pXNG9jR0ZrYWlBOElHRnNjR2hoSUNZZ2MyaHlhVzVyWldSZmJHOW5Na1pESUQ0Z1ptTkRkWFJ2Wm1ZZ2ZpQmNJbFZRWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJoWkdvZ1BDQmhiSEJvWVNBbUlITm9jbWx1YTJWa1gyeHZaekpHUXlBOElDMW1ZME4xZEc5bVppQitJRndpUkU5WFRsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCVVVsVkZJSDRnWENKT1Qxd2lLU2xjYmx4dVhHNTBaVzF3SUR3dElHUnBabVl1VWs1QklDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtITjBZWEowSUQwZ1ZGTlRJQzBnTWpVd01DeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1Z1WkNBOUlGUlRVeUFySURJMU1EQXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dOb2Npd2djM1JoY25Rc0lHVnVaQ3dnWlc1elpXMWliRjluWlc1bFgybGtMQ0JrYVdabUtWeHVYRzVjYm1SdmQyNHVaM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0hSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aR2xtWmlBOVBTQmNJa1JQVjA1Y0lpa3BYRzUxY0M1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loa2FXWm1JRDA5SUZ3aVZWQmNJaWtwWEc1dWJ5NW5jaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaGthV1ptSUQwOUlGd2lUazljSWlrcFhHNWhiR3d1WjNJZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtIUmxiWEFwWEc1Y2JtUmhkR0VnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkQ2hjSWtnelN6STNZV05mWldabWFXVmNJaXdnWENKVVUxTmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RYQXVaM0lzSUc1dkxtZHlMQ0JrYjNkdUxtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaGJHd3VaM0lwWEc1Y2JseHVJeUJXYVhOMVlXeHBlbUYwYVc5dVhHNXNhV0p5WVhKNUtHTnBjbU5zYVhwbEtWeHVYRzVvWldGMGJXRndYMlJoZEdFZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUdsdWRHVnlaWE4wTENCdlpHUnpVbUYwYVc4cElDVStKVnh1Y0dsMmIzUmZkMmxrWlhJb2JtRnRaWE5mWm5KdmJTQTlJR2x1ZEdWeVpYTjBMQ0IyWVd4MVpYTmZabkp2YlNBOUlHOWtaSE5TWVhScGJ5a2dKVDRsWEc0Z0lHTnZiSFZ0Ymw5MGIxOXliM2R1WVcxbGN5aDJZWElnUFNCY0luUmhjbWRsZEZ3aUtWeHVYRzV3ZG1Gc2RXVmZaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYVc1MFpYSmxjM1FzSUhCMllXeDFaU2tnSlQ0bFhHNGdJSEJwZG05MFgzZHBaR1Z5S0c1aGJXVnpYMlp5YjIwZ1BTQnBiblJsY21WemRDd2dkbUZzZFdWelgyWnliMjBnUFNCd2RtRnNkV1VwSUNVK0pWeHVJQ0JqYjJ4MWJXNWZkRzlmY205M2JtRnRaWE1vZG1GeUlEMGdYQ0owWVhKblpYUmNJaWxjYmx4dVkyOXNYMloxYmlBOExTQmpiMnh2Y2xKaGJYQXlLR01vTUN3Z01Td2dNaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR01vWENKaWJIVmxYQ0lzSUZ3aWQyaHBkR1ZjSWl3Z1hDSnlaV1JjSWlrcFhHNWNia2hsWVhSdFlYQW9ZWE11YldGMGNtbDRLR2hsWVhSdFlYQmZaR0YwWVNrc1hHNGdJQ0FnSUNBZ0lHNWhiV1VnUFNCY0lrOWtaSE1nVW1GMGFXOWNJaXhjYmlBZ0lDQWdJQ0FnWTI5c0lEMGdZMjlzWDJaMWJpeGNiaUFnSUNBZ0lDQWdJeUJCWkdRZ1lXNXViM1JoZEdsdmJpQm1iM0lnY0MxMllXeDFaWE5jYmlBZ0lDQWdJQ0FnWTJWc2JGOW1kVzRnUFNCbWRXNWpkR2x2YmlocUxDQnBMQ0I0TENCNUxDQjNhV1IwYUN3Z2FHVnBaMmgwTENCbWFXeHNLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2NIWmhiQ0E4TFNCd2RtRnNkV1ZmWkdGMFlWdHBMQ0JxWFZ4dUlDQWdJQ0FnSUNBZ0lHeGhZbVZzSUR3dElHbG1aV3h6WlNod2RtRnNJRDRnTUM0d05Td2dYQ0p1TG5NdVhDSXNJSE53Y21sdWRHWW9YQ0lsTGpKbFhDSXNJSEIyWVd3cEtWeHVJQ0FnSUNBZ0lDQWdJR2R5YVdRdWRHVjRkQ2hzWVdKbGJDd2dlQ3dnZVN3Z1ozQWdQU0JuY0dGeUtHWnZiblJ6YVhwbElEMGdNVEFwS1Z4dUlDQWdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ0lDQWpJRU4xYzNSdmJXbDZaU0IwYUdVZ2FHVmhkRzFoY0NCc1lYbHZkWFJjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjbDl5YjNkeklEMGdWRkpWUlN4Y2JpQWdJQ0FnSUNBZ2MyaHZkMTl5YjNkZlpHVnVaQ0E5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JqYkhWemRHVnlYMk52YkhWdGJuTWdQU0JHUVV4VFJTeGNiaUFnSUNBZ0lDQWdZMjlzZFcxdVgzUnBkR3hsSUQwZ1hDSkpiblJsY21WemRGd2lMRnh1SUNBZ0lDQWdJQ0J5YjNkZmRHbDBiR1VnUFNCY0lsUmhjbWRsZEZ3aUxGeHVJQ0FnSUNBZ0lDQm9aV0YwYldGd1gyeGxaMlZ1WkY5d1lYSmhiU0E5SUd4cGMzUW9ZWFFnUFNCaktEQXNJREVzSURJcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hoWW1Wc2N5QTlJR01vWENJd1hDSXNJRndpTVZ3aUxDQmNJakpjSWlrcEtWeHVYRzVjYmlNaklFZFBJRlJGVTFSY2JtUnBabVl1VWs1QklEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1ScFptWmZSekV1UVRRNE5TNXpaV3hsWTNSbFpESmZSekV1TW1rdVFUUTROVjkyYzE5SE1TNHlhUzVFVFZOUExuUnpkbHdpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9aVzV6WlcxaWJGOW5aVzVsWDJsa0xDQnNiMmN5Um05c1pFTm9ZVzVuWlN3Z2MyaHlhVzVyWldSZmJHOW5Na1pETENCd1lXUnFMQ0JsZUhSbGNtNWhiRjluWlc1bFgyNWhiV1VwWEc1a2FXWm1MbEpPUVNBOExTQmthV1ptTGxKT1FTQWxQaVVnWkhCc2VYSTZPbXhsWm5SZmFtOXBiaWhuWlc1bExuUmlMQ0JpZVNBOUlHTW9YQ0psYm5ObGJXSnNYMmRsYm1WZmFXUmNJaUE5SUZ3aVpXNXpaVzFpYkZ3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvSVdsekxtNWhLRlJUVXlrcFhHNWhiSEJvWVNBOExTQXdMakExWEc1bVkwTjFkRzltWmlBOExTQXdMalZjYmx4dVpHbG1aaTVTVGtFZ1BDMGdaR2xtWmk1U1RrRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2xtWmlBOUlHTmhjMlZmZDJobGJpaHdZV1JxSUR3Z1lXeHdhR0VnSmlCemFISnBibXRsWkY5c2IyY3lSa01nUGlCbVkwTjFkRzltWmlCK0lGd2lWVkJjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjR0ZrYWlBOElHRnNjR2hoSUNZZ2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z0xXWmpRM1YwYjJabUlINGdYQ0pFVDFkT1hDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSU1ZVVWdmaUJjSWs1UFhDSXBLVnh1WjJWdVpVeHBjM1FnUEMwZ0tHUnBabVl1VWs1QklDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHUnBabVlnUFQwZ1hDSkVUMWRPWENJcEtTUmxibk5sYldKc1gyZGxibVZmYVdSY2JrZFBJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bFRHbHpkQ3dnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUtWeHVSMDh1Y21WaFpHRmliR1VnUEMwZ2MyVjBVbVZoWkdGaWJHVW9SMDhzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUtWeHVYRzVrYjNkdVUzUmxiVWRsYm1VZ1BDMGdkVzVwY1hWbEtIVnViR2x6ZENnb1lYTXVaR0YwWVM1bWNtRnRaU2hIVHlrZ0pUNGxJR1J3YkhseU9qcHpiR2xqWlNoaktEUXNJRFVzSURFMExDQTJOaWtwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dkbGJtVkpSQ0E5SUhOMGNuTndiR2wwS0dkbGJtVkpSQ3dnWENJdlhDSXBLU2trWjJWdVpVbEVLU2xjYm1SdmQyNVRkR1Z0TG1keUlEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaDBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dWdWMyVnRZbXhmWjJWdVpWOXBaQ0FsYVc0bElHUnZkMjVUZEdWdFIyVnVaU2twWEc1Y2JuQnlhVzUwS0dSdmRIQnNiM1FvUjA4c0lITm9iM2REWVhSbFoyOXllU0E5SURFMUxDQjBhWFJzWlNBOUlGd2lYQ0lwSUNzZ1hHNGdJQ0FnSUNBZ0lITmpZV3hsWDJOdmJHOXlYMk52Ym5ScGJuVnZkWE1vYkdsdGFYUnpJRDBnWXlnd0xDQXdMakExS1N3Z2JHOTNJRDBnWENKeVpXUmNJaXdnYUdsbmFDQTlJRndpWW14aFkydGNJaWtwWEc1blpXNWxUR2x6ZENBOExTQW9aR2xtWmk1U1RrRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aR2xtWmlBOVBTQmNJbFZRWENJcEtTUmxibk5sYldKc1gyZGxibVZmYVdSY2JrZFBJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bFRHbHpkQ3dnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUtWeHVSMDh1Y21WaFpHRmliR1VnUEMwZ2MyVjBVbVZoWkdGaWJHVW9SMDhzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUtWeHVjSEpwYm5Rb1pHOTBjR3h2ZENoSFR5d2djMmh2ZDBOaGRHVm5iM0o1SUQwZ01UVXNJSFJwZEd4bElEMGdYQ0pjSWlrZ0t5QmNiaUFnSUNBZ0lDQWdjMk5oYkdWZlkyOXNiM0pmWTI5dWRHbHVkVzkxY3loc2FXMXBkSE1nUFNCaktEQXNJREF1TURVcExDQnNiM2NnUFNCY0luSmxaRndpTENCb2FXZG9JRDBnWENKaWJHRmphMXdpS1NsY2JseHVYRzVrYjNkdVRrOU9VM1JsYlM1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loa2FXWm1JRDA5SUZ3aVJFOVhUbHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lTaGxibk5sYldKc1gyZGxibVZmYVdRZ0pXbHVKU0JrYjNkdVUzUmxiVWRsYm1VcEtTbGNibHh1Y0hKcGJuUW9aRzkwY0d4dmRDaEhUeXdnYzJodmQwTmhkR1ZuYjNKNUlEMGdNVFVzSUhScGRHeGxJRDBnWENKY0lpa2dLeUJjYmlBZ0lDQWdJQ0FnYzJOaGJHVmZZMjlzYjNKZlkyOXVkR2x1ZFc5MWN5aHNhVzFwZEhNZ1BTQmpLREFzSURBdU1EVXBMQ0JzYjNjZ1BTQmNJbkpsWkZ3aUxDQm9hV2RvSUQwZ1hDSmliR0ZqYTF3aUtTbGNibWRsYm1WTWFYTjBJRHd0SUNoa2FXWm1MbEpPUVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loa2FXWm1JRDA5SUZ3aVZWQmNJaWtwSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1UjA4Z1BDMGdaVzV5YVdOb1IwOG9aMlZ1WlNBOUlHZGxibVZNYVhOMExDQlBjbWRFWWlBOUlHOXlaeTVOYlM1bFp5NWtZaXdnYTJWNVZIbHdaU0E5SUZ3aVJVNVRSVTFDVEZ3aUxDQnZiblFnUFNCY0lrSlFYQ0lwWEc1SFR5NXlaV0ZrWVdKc1pTQThMU0J6WlhSU1pXRmtZV0pzWlNoSFR5d2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lwWEc1d2NtbHVkQ2hrYjNSd2JHOTBLRWRQTENCemFHOTNRMkYwWldkdmNua2dQU0F4TlN3Z2RHbDBiR1VnUFNCY0lsd2lLU0FySUZ4dUlDQWdJQ0FnSUNCelkyRnNaVjlqYjJ4dmNsOWpiMjUwYVc1MWIzVnpLR3hwYldsMGN5QTlJR01vTUN3Z01DNHdOU2tzSUd4dmR5QTlJRndpY21Wa1hDSXNJR2hwWjJnZ1BTQmNJbUpzWVdOclhDSXBLVnh1WEc1Y2JseHVJeU1qSUVOb1pXTnJhVzVuSUdKdmIydHRZWEpyYVc1bklHOXViSGtnYVc0Z2MzUmxiU0JuWlc1bFhHNWNibVJoZEdFZ1BDMGdjblZ1Um1semFHVnlSWGhoWTNSRGIyMWlhVzVoZEdsdmJsUmhjbWRsZENoY0lrZ3pTekkzWVdOZlpXWm1hV1ZjSWl3Z1hDSlVVMU5jSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaRzkzYmk1bmNpd2daRzkzYms1UFRsTjBaVzB1WjNJc0lHUnZkMjVUZEdWdExtZHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaGJHd3VaM0lwWEc1Y2JseHVJeUJXYVhOMVlXeHBlbUYwYVc5dVhHNXNhV0p5WVhKNUtHTnBjbU5zYVhwbEtWeHVYRzVvWldGMGJXRndYMlJoZEdFZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUdsdWRHVnlaWE4wTENCdlpHUnpVbUYwYVc4cElDVStKVnh1Y0dsMmIzUmZkMmxrWlhJb2JtRnRaWE5mWm5KdmJTQTlJR2x1ZEdWeVpYTjBMQ0IyWVd4MVpYTmZabkp2YlNBOUlHOWtaSE5TWVhScGJ5a2dKVDRsWEc0Z0lHTnZiSFZ0Ymw5MGIxOXliM2R1WVcxbGN5aDJZWElnUFNCY0luUmhjbWRsZEZ3aUtWeHVYRzV3ZG1Gc2RXVmZaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYVc1MFpYSmxjM1FzSUhCMllXeDFaU2tnSlQ0bFhHNGdJSEJwZG05MFgzZHBaR1Z5S0c1aGJXVnpYMlp5YjIwZ1BTQnBiblJsY21WemRDd2dkbUZzZFdWelgyWnliMjBnUFNCd2RtRnNkV1VwSUNVK0pWeHVJQ0JqYjJ4MWJXNWZkRzlmY205M2JtRnRaWE1vZG1GeUlEMGdYQ0owWVhKblpYUmNJaWxjYmx4dVkyOXNYMloxYmlBOExTQmpiMnh2Y2xKaGJYQXlLR01vTUN3Z01Td2dNaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR01vWENKaWJIVmxYQ0lzSUZ3aWQyaHBkR1ZjSWl3Z1hDSnlaV1JjSWlrcFhHNWNia2hsWVhSdFlYQW9ZWE11YldGMGNtbDRLR2hsWVhSdFlYQmZaR0YwWVNrc1hHNGdJQ0FnSUNBZ0lHNWhiV1VnUFNCY0lrOWtaSE1nVW1GMGFXOWNJaXhjYmlBZ0lDQWdJQ0FnWTI5c0lEMGdZMjlzWDJaMWJpeGNiaUFnSUNBZ0lDQWdJeUJCWkdRZ1lXNXViM1JoZEdsdmJpQm1iM0lnY0MxMllXeDFaWE5jYmlBZ0lDQWdJQ0FnWTJWc2JGOW1kVzRnUFNCbWRXNWpkR2x2YmlocUxDQnBMQ0I0TENCNUxDQjNhV1IwYUN3Z2FHVnBaMmgwTENCbWFXeHNLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2NIWmhiQ0E4TFNCd2RtRnNkV1ZmWkdGMFlWdHBMQ0JxWFZ4dUlDQWdJQ0FnSUNBZ0lHeGhZbVZzSUR3dElHbG1aV3h6WlNod2RtRnNJRDRnTUM0d05Td2dYQ0p1TG5NdVhDSXNJSE53Y21sdWRHWW9YQ0lsTGpKbFhDSXNJSEIyWVd3cEtWeHVJQ0FnSUNBZ0lDQWdJR2R5YVdRdWRHVjRkQ2hzWVdKbGJDd2dlQ3dnZVN3Z1ozQWdQU0JuY0dGeUtHWnZiblJ6YVhwbElEMGdNVEFwS1Z4dUlDQWdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ0lDQWpJRU4xYzNSdmJXbDZaU0IwYUdVZ2FHVmhkRzFoY0NCc1lYbHZkWFJjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjbDl5YjNkeklEMGdWRkpWUlN4Y2JpQWdJQ0FnSUNBZ2MyaHZkMTl5YjNkZlpHVnVaQ0E5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JqYkhWemRHVnlYMk52YkhWdGJuTWdQU0JHUVV4VFJTeGNiaUFnSUNBZ0lDQWdZMjlzZFcxdVgzUnBkR3hsSUQwZ1hDSkpiblJsY21WemRGd2lMRnh1SUNBZ0lDQWdJQ0J5YjNkZmRHbDBiR1VnUFNCY0lsUmhjbWRsZEZ3aUxGeHVJQ0FnSUNBZ0lDQm9aV0YwYldGd1gyeGxaMlZ1WkY5d1lYSmhiU0E5SUd4cGMzUW9ZWFFnUFNCaktEQXNJREVzSURJcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hoWW1Wc2N5QTlJR01vWENJd1hDSXNJRndpTVZ3aUxDQmNJakpjSWlrcEtWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTUywgVjYpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyXFwsIFxcVFNTXFwsIFxcZW5zZW1ibFxcKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZS50YiwgYnkgPSBjKFxcZW5zZW1ibF9nZW5lX2lkXFwgPSBcXGVuc2VtYmxcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShUU1MpKVxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5cbmRpZmYuUk5BIDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bXV0YXRlKGRpZmYgPSBjYXNlX3doZW4ocGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDID4gZmNDdXRvZmYgfiBcXFVQXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiB+IFxcRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gXFxOT1xcKSlcblxuXG50ZW1wIDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gVFNTIC0gMjUwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IFRTUyArIDI1MDApICU+JVxuICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZCwgZW5zZW1ibF9nZW5lX2lkLCBkaWZmKVxuXG5cbmRvd24uZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSBcXERPV05cXCkpXG51cC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcVVBcXCkpXG5uby5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcTk9cXCkpXG5hbGwuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5cbmRhdGEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEgzSzI3YWNfZWZmaWVcXCwgXFxUU1NcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAuZ3IsIG5vLmdyLCBkb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwuZ3IpXG5cblxuIyBWaXN1YWxpemF0aW9uXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMiksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksXG4gICAgICAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCxcbiAgICAgICAgY29sID0gY29sX2Z1bixcbiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXNcbiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7XG4gICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXVxuICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgXFxuLnMuXFwsIHNwcmludGYoXFwlLjJlXFwsIHB2YWwpKVxuICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKVxuICAgICAgICB9LFxuICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXRcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY29sdW1uX3RpdGxlID0gXFxJbnRlcmVzdFxcLFxuICAgICAgICByb3dfdGl0bGUgPSBcXFRhcmdldFxcLFxuICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoXFwwXFwsIFxcMVxcLCBcXDJcXCkpKVxuXG5cbiMjIEdPIFRFU1RcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5kaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6OmxlZnRfam9pbihnZW5lLnRiLCBieSA9IGMoXFxlbnNlbWJsX2dlbmVfaWRcXCA9IFxcZW5zZW1ibFxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKFRTUykpXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcblxuZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjptdXRhdGUoZGlmZiA9IGNhc2Vfd2hlbihwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPiBmY0N1dG9mZiB+IFxcVVBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmIH4gXFxET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBcXE5PXFwpKVxuZ2VuZUxpc3QgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmYgPT0gXFxET1dOXFwpKSRlbnNlbWJsX2dlbmVfaWRcbkdPIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR08ucmVhZGFibGUgPC0gc2V0UmVhZGFibGUoR08sIE9yZ0RiID0gb3JnLk1tLmVnLmRiKVxuXG5kb3duU3RlbUdlbmUgPC0gdW5pcXVlKHVubGlzdCgoYXMuZGF0YS5mcmFtZShHTykgJT4lIGRwbHlyOjpzbGljZShjKDQsIDUsIDE0LCA2NikpICU+JSBkcGx5cjo6bXV0YXRlKGdlbmVJRCA9IHN0cnNwbGl0KGdlbmVJRCwgXFwvXFwpKSkkZ2VuZUlEKSlcbmRvd25TdGVtLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGRvd25TdGVtR2VuZSkpXG5cbnByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IDE1LCB0aXRsZSA9IFxcXFwpICsgXG4gICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gXFxyZWRcXCwgaGlnaCA9IFxcYmxhY2tcXCkpXG5nZW5lTGlzdCA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSBcXFVQXFwpKSRlbnNlbWJsX2dlbmVfaWRcbkdPIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR08ucmVhZGFibGUgPC0gc2V0UmVhZGFibGUoR08sIE9yZ0RiID0gb3JnLk1tLmVnLmRiKVxucHJpbnQoZG90cGxvdChHTywgc2hvd0NhdGVnb3J5ID0gMTUsIHRpdGxlID0gXFxcXCkgKyBcbiAgICAgICAgc2NhbGVfY29sb3JfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDAuMDUpLCBsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibGFja1xcKSlcblxuXG5kb3duTk9OU3RlbS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShlbnNlbWJsX2dlbmVfaWQgJWluJSBkb3duU3RlbUdlbmUpKSlcblxucHJpbnQoZG90cGxvdChHTywgc2hvd0NhdGVnb3J5ID0gMTUsIHRpdGxlID0gXFxcXCkgKyBcbiAgICAgICAgc2NhbGVfY29sb3JfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDAuMDUpLCBsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibGFja1xcKSlcbmdlbmVMaXN0IDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcVVBcXCkpJGVuc2VtYmxfZ2VuZV9pZFxuR08gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5HTy5yZWFkYWJsZSA8LSBzZXRSZWFkYWJsZShHTywgT3JnRGIgPSBvcmcuTW0uZWcuZGIpXG5wcmludChkb3RwbG90KEdPLCBzaG93Q2F0ZWdvcnkgPSAxNSwgdGl0bGUgPSBcXFxcKSArIFxuICAgICAgICBzY2FsZV9jb2xvcl9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMC4wNSksIGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsYWNrXFwpKVxuXG5cblxuIyMjIENoZWNraW5nIGJvb2ttYXJraW5nIG9ubHkgaW4gc3RlbSBnZW5lXG5cbmRhdGEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEgzSzI3YWNfZWZmaWVcXCwgXFxUU1NcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bi5nciwgZG93bk5PTlN0ZW0uZ3IsIGRvd25TdGVtLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwuZ3IpXG5cblxuIyBWaXN1YWxpemF0aW9uXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMiksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksXG4gICAgICAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCxcbiAgICAgICAgY29sID0gY29sX2Z1bixcbiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXNcbiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7XG4gICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXVxuICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgXFxuLnMuXFwsIHNwcmludGYoXFwlLjJlXFwsIHB2YWwpKVxuICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKVxuICAgICAgICB9LFxuICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXRcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY29sdW1uX3RpdGxlID0gXFxJbnRlcmVzdFxcLFxuICAgICAgICByb3dfdGl0bGUgPSBcXFRhcmdldFxcLFxuICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoXFwwXFwsIFxcMVxcLCBcXDJcXCkpKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V1, TSS, V6)
colnames(gene.tb) <- c(\chr\, \TSS\, \ensembl\)

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
diff.RNA <- diff.RNA %>% dplyr::left_join(gene.tb, by = c(\ensembl_gene_id\ = \ensembl\)) %>%
  dplyr::filter(!is.na(TSS))
alpha <- 0.05
fcCutoff <- 0.5

diff.RNA <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                                        padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                                        TRUE ~ \NO\))


temp <- diff.RNA %>% dplyr::mutate(start = TSS - 2500,
                           end = TSS + 2500) %>%
  dplyr::select(chr, start, end, ensembl_gene_id, diff)


down.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \DOWN\))
up.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \UP\))
no.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \NO\))
all.gr <- makeGRangesFromDataFrame(temp)

data <- runFisherExactCombinationTarget(\H3K27ac_effie\, \TSS\,
                                      up.gr, no.gr, down.gr,
                                      all.gr)


# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 2), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2), 
                                    labels = c(\0\, \1\, \2\)))


## GO TEST
diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
diff.RNA <- diff.RNA %>% dplyr::left_join(gene.tb, by = c(\ensembl_gene_id\ = \ensembl\)) %>%
  dplyr::filter(!is.na(TSS))
alpha <- 0.05
fcCutoff <- 0.5

diff.RNA <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                                        padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                                        TRUE ~ \NO\))
geneList <- (diff.RNA %>% dplyr::filter(diff == \DOWN\))$ensembl_gene_id
GO <- enrichGO(gene = geneList, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO.readable <- setReadable(GO, OrgDb = org.Mm.eg.db)

downStemGene <- unique(unlist((as.data.frame(GO) %>% dplyr::slice(c(4, 5, 14, 66)) %>% dplyr::mutate(geneID = strsplit(geneID, \/\)))$geneID))
downStem.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(ensembl_gene_id %in% downStemGene))

print(dotplot(GO, showCategory = 15, title = \\) + 
        scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))
geneList <- (diff.RNA %>% dplyr::filter(diff == \UP\))$ensembl_gene_id
GO <- enrichGO(gene = geneList, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO.readable <- setReadable(GO, OrgDb = org.Mm.eg.db)
print(dotplot(GO, showCategory = 15, title = \\) + 
        scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))


downNONStem.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \DOWN\,
                                                               !(ensembl_gene_id %in% downStemGene)))

print(dotplot(GO, showCategory = 15, title = \\) + 
        scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))
geneList <- (diff.RNA %>% dplyr::filter(diff == \UP\))$ensembl_gene_id
GO <- enrichGO(gene = geneList, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO.readable <- setReadable(GO, OrgDb = org.Mm.eg.db)
print(dotplot(GO, showCategory = 15, title = \\) + 
        scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))



### Checking bookmarking only in stem gene

data <- runFisherExactCombinationTarget(\H3K27ac_effie\, \TSS\,
                                      down.gr, downNONStem.gr, downStem.gr,
                                      all.gr)


# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 2), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2), 
                                    labels = c(\0\, \1\, \2\)))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVoyVnVaUzUwWWlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnh0YlRFd1gwZFNRMjB6T0M1d05sOW5aVzVsWDNOdmNuUmxaQzVpWldSY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0ZSVFV5QTlJR2xtWld4elpTaFdOQ0E5UFNCY1hDdGNYQ3dnVmpJc0lGWXpLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1ZqRXNJRlJUVXl3Z1ZqWXBYRzVqYjJ4dVlXMWxjeWhuWlc1bExuUmlLU0E4TFNCaktGeGNZMmh5WEZ3c0lGeGNWRk5UWEZ3c0lGeGNaVzV6WlcxaWJGeGNLVnh1WEc1a2FXWm1MbEpPUVNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhrYVdabVgwY3hMa0UwT0RVdWMyVnNaV04wWldReVgwY3hMakpwTGtFME9EVmZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHVnVjMlZ0WW14ZloyVnVaVjlwWkN3Z2JHOW5Na1p2YkdSRGFHRnVaMlVzSUhOb2NtbHVhMlZrWDJ4dlp6SkdReXdnY0dGa2Fpd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxLVnh1WkdsbVppNVNUa0VnUEMwZ1pHbG1aaTVTVGtFZ0pUNGxJR1J3YkhseU9qcHNaV1owWDJwdmFXNG9aMlZ1WlM1MFlpd2dZbmtnUFNCaktGeGNaVzV6WlcxaWJGOW5aVzVsWDJsa1hGd2dQU0JjWEdWdWMyVnRZbXhjWENrcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLQ0ZwY3k1dVlTaFVVMU1wS1Z4dVlXeHdhR0VnUEMwZ01DNHdOVnh1Wm1ORGRYUnZabVlnUEMwZ01DNDFYRzVjYm1ScFptWXVVazVCSUR3dElHUnBabVl1VWs1QklDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBabVlnUFNCallYTmxYM2RvWlc0b2NHRmthaUE4SUdGc2NHaGhJQ1lnYzJoeWFXNXJaV1JmYkc5bk1rWkRJRDRnWm1ORGRYUnZabVlnZmlCY1hGVlFYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQmhaR29nUENCaGJIQm9ZU0FtSUhOb2NtbHVhMlZrWDJ4dlp6SkdReUE4SUMxbVkwTjFkRzltWmlCK0lGeGNSRTlYVGx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JVVWxWRklINGdYRnhPVDF4Y0tTbGNibHh1WEc1MFpXMXdJRHd0SUdScFptWXVVazVCSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0hOMFlYSjBJRDBnVkZOVElDMGdNalV3TUN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnVaQ0E5SUZSVFV5QXJJREkxTURBcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR05vY2l3Z2MzUmhjblFzSUdWdVpDd2daVzV6WlcxaWJGOW5aVzVsWDJsa0xDQmthV1ptS1Z4dVhHNWNibVJ2ZDI0dVozSWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLSFJsYlhBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1pHbG1aaUE5UFNCY1hFUlBWMDVjWENrcFhHNTFjQzVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhrYVdabUlEMDlJRnhjVlZCY1hDa3BYRzV1Ynk1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9kR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loa2FXWm1JRDA5SUZ4Y1RrOWNYQ2twWEc1aGJHd3VaM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0hSbGJYQXBYRzVjYm1SaGRHRWdQQzBnY25WdVJtbHphR1Z5UlhoaFkzUkRiMjFpYVc1aGRHbHZibFJoY21kbGRDaGNYRWd6U3pJM1lXTmZaV1ptYVdWY1hDd2dYRnhVVTFOY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZFhBdVozSXNJRzV2TG1keUxDQmtiM2R1TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYkd3dVozSXBYRzVjYmx4dUl5QldhWE4xWVd4cGVtRjBhVzl1WEc1c2FXSnlZWEo1S0dOcGNtTnNhWHBsS1Z4dVhHNW9aV0YwYldGd1gyUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJR2x1ZEdWeVpYTjBMQ0J2WkdSelVtRjBhVzhwSUNVK0pWeHVjR2wyYjNSZmQybGtaWElvYm1GdFpYTmZabkp2YlNBOUlHbHVkR1Z5WlhOMExDQjJZV3gxWlhOZlpuSnZiU0E5SUc5a1pITlNZWFJwYnlrZ0pUNGxYRzRnSUdOdmJIVnRibDkwYjE5eWIzZHVZVzFsY3loMllYSWdQU0JjWEhSaGNtZGxkRnhjS1Z4dVhHNXdkbUZzZFdWZlpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSFJoY21kbGRDd2dhVzUwWlhKbGMzUXNJSEIyWVd4MVpTa2dKVDRsWEc0Z0lIQnBkbTkwWDNkcFpHVnlLRzVoYldWelgyWnliMjBnUFNCcGJuUmxjbVZ6ZEN3Z2RtRnNkV1Z6WDJaeWIyMGdQU0J3ZG1Gc2RXVXBJQ1UrSlZ4dUlDQmpiMngxYlc1ZmRHOWZjbTkzYm1GdFpYTW9kbUZ5SUQwZ1hGeDBZWEpuWlhSY1hDbGNibHh1WTI5c1gyWjFiaUE4TFNCamIyeHZjbEpoYlhBeUtHTW9NQ3dnTVN3Z01pa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTW9YRnhpYkhWbFhGd3NJRnhjZDJocGRHVmNYQ3dnWEZ4eVpXUmNYQ2twWEc1Y2JraGxZWFJ0WVhBb1lYTXViV0YwY21sNEtHaGxZWFJ0WVhCZlpHRjBZU2tzWEc0Z0lDQWdJQ0FnSUc1aGJXVWdQU0JjWEU5a1pITWdVbUYwYVc5Y1hDeGNiaUFnSUNBZ0lDQWdZMjlzSUQwZ1kyOXNYMloxYml4Y2JpQWdJQ0FnSUNBZ0l5QkJaR1FnWVc1dWIzUmhkR2x2YmlCbWIzSWdjQzEyWVd4MVpYTmNiaUFnSUNBZ0lDQWdZMlZzYkY5bWRXNGdQU0JtZFc1amRHbHZiaWhxTENCcExDQjRMQ0I1TENCM2FXUjBhQ3dnYUdWcFoyaDBMQ0JtYVd4c0tTQjdYRzRnSUNBZ0lDQWdJQ0FnY0haaGJDQThMU0J3ZG1Gc2RXVmZaR0YwWVZ0cExDQnFYVnh1SUNBZ0lDQWdJQ0FnSUd4aFltVnNJRHd0SUdsbVpXeHpaU2h3ZG1Gc0lENGdNQzR3TlN3Z1hGeHVMbk11WEZ3c0lITndjbWx1ZEdZb1hGd2xMakpsWEZ3c0lIQjJZV3dwS1Z4dUlDQWdJQ0FnSUNBZ0lHZHlhV1F1ZEdWNGRDaHNZV0psYkN3Z2VDd2dlU3dnWjNBZ1BTQm5jR0Z5S0dadmJuUnphWHBsSUQwZ01UQXBLVnh1SUNBZ0lDQWdJQ0I5TEZ4dUlDQWdJQ0FnSUNBaklFTjFjM1J2YldsNlpTQjBhR1VnYUdWaGRHMWhjQ0JzWVhsdmRYUmNiaUFnSUNBZ0lDQWdZMngxYzNSbGNsOXliM2R6SUQwZ1ZGSlZSU3hjYmlBZ0lDQWdJQ0FnYzJodmQxOXliM2RmWkdWdVpDQTlJRVpCVEZORkxGeHVJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeVgyTnZiSFZ0Ym5NZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ1kyOXNkVzF1WDNScGRHeGxJRDBnWEZ4SmJuUmxjbVZ6ZEZ4Y0xGeHVJQ0FnSUNBZ0lDQnliM2RmZEdsMGJHVWdQU0JjWEZSaGNtZGxkRnhjTEZ4dUlDQWdJQ0FnSUNCb1pXRjBiV0Z3WDJ4bFoyVnVaRjl3WVhKaGJTQTlJR3hwYzNRb1lYUWdQU0JqS0RBc0lERXNJRElwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeGhZbVZzY3lBOUlHTW9YRnd3WEZ3c0lGeGNNVnhjTENCY1hESmNYQ2twS1Z4dVhHNWNiaU1qSUVkUElGUkZVMVJjYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR1JwWm1aZlJ6RXVRVFE0TlM1elpXeGxZM1JsWkRKZlJ6RXVNbWt1UVRRNE5WOTJjMTlITVM0eWFTNUVUVk5QTG5SemRseGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1pXNXpaVzFpYkY5blpXNWxYMmxrTENCc2IyY3lSbTlzWkVOb1lXNW5aU3dnYzJoeWFXNXJaV1JmYkc5bk1rWkRMQ0J3WVdScUxDQmxlSFJsY201aGJGOW5aVzVsWDI1aGJXVXBYRzVrYVdabUxsSk9RU0E4TFNCa2FXWm1MbEpPUVNBbFBpVWdaSEJzZVhJNk9teGxablJmYW05cGJpaG5aVzVsTG5SaUxDQmllU0E5SUdNb1hGeGxibk5sYldKc1gyZGxibVZmYVdSY1hDQTlJRnhjWlc1elpXMWliRnhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9JV2x6TG01aEtGUlRVeWtwWEc1aGJIQm9ZU0E4TFNBd0xqQTFYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibHh1WkdsbVppNVNUa0VnUEMwZ1pHbG1aaTVTVGtFZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1pHbG1aaUE5SUdOaGMyVmZkMmhsYmlod1lXUnFJRHdnWVd4d2FHRWdKaUJ6YUhKcGJtdGxaRjlzYjJjeVJrTWdQaUJtWTBOMWRHOW1aaUIrSUZ4Y1ZWQmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NHRmthaUE4SUdGc2NHaGhJQ1lnYzJoeWFXNXJaV1JmYkc5bk1rWkRJRHdnTFdaalEzVjBiMlptSUg0Z1hGeEVUMWRPWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRlJTVlVVZ2ZpQmNYRTVQWEZ3cEtWeHVaMlZ1WlV4cGMzUWdQQzBnS0dScFptWXVVazVCSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dScFptWWdQVDBnWEZ4RVQxZE9YRndwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1JjYmtkUElEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsVEdsemRDd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjS1Z4dVIwOHVjbVZoWkdGaWJHVWdQQzBnYzJWMFVtVmhaR0ZpYkdVb1IwOHNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpS1Z4dVhHNWtiM2R1VTNSbGJVZGxibVVnUEMwZ2RXNXBjWFZsS0hWdWJHbHpkQ2dvWVhNdVpHRjBZUzVtY21GdFpTaEhUeWtnSlQ0bElHUndiSGx5T2pwemJHbGpaU2hqS0RRc0lEVXNJREUwTENBMk5pa3BJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR2RsYm1WSlJDQTlJSE4wY25Od2JHbDBLR2RsYm1WSlJDd2dYRnd2WEZ3cEtTa2taMlZ1WlVsRUtTbGNibVJ2ZDI1VGRHVnRMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR1Z1YzJWdFlteGZaMlZ1WlY5cFpDQWxhVzRsSUdSdmQyNVRkR1Z0UjJWdVpTa3BYRzVjYm5CeWFXNTBLR1J2ZEhCc2IzUW9SMDhzSUhOb2IzZERZWFJsWjI5eWVTQTlJREUxTENCMGFYUnNaU0E5SUZ4Y1hGd3BJQ3NnWEc0Z0lDQWdJQ0FnSUhOallXeGxYMk52Ykc5eVgyTnZiblJwYm5WdmRYTW9iR2x0YVhSeklEMGdZeWd3TENBd0xqQTFLU3dnYkc5M0lEMGdYRnh5WldSY1hDd2dhR2xuYUNBOUlGeGNZbXhoWTJ0Y1hDa3BYRzVuWlc1bFRHbHpkQ0E4TFNBb1pHbG1aaTVTVGtFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1pHbG1aaUE5UFNCY1hGVlFYRndwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1JjYmtkUElEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsVEdsemRDd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjS1Z4dVIwOHVjbVZoWkdGaWJHVWdQQzBnYzJWMFVtVmhaR0ZpYkdVb1IwOHNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpS1Z4dWNISnBiblFvWkc5MGNHeHZkQ2hIVHl3Z2MyaHZkME5oZEdWbmIzSjVJRDBnTVRVc0lIUnBkR3hsSUQwZ1hGeGNYQ2tnS3lCY2JpQWdJQ0FnSUNBZ2MyTmhiR1ZmWTI5c2IzSmZZMjl1ZEdsdWRXOTFjeWhzYVcxcGRITWdQU0JqS0RBc0lEQXVNRFVwTENCc2IzY2dQU0JjWEhKbFpGeGNMQ0JvYVdkb0lEMGdYRnhpYkdGamExeGNLU2xjYmx4dVhHNWtiM2R1VGs5T1UzUmxiUzVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhrYVdabUlEMDlJRnhjUkU5WFRseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSVNobGJuTmxiV0pzWDJkbGJtVmZhV1FnSldsdUpTQmtiM2R1VTNSbGJVZGxibVVwS1NsY2JseHVjSEpwYm5Rb1pHOTBjR3h2ZENoSFR5d2djMmh2ZDBOaGRHVm5iM0o1SUQwZ01UVXNJSFJwZEd4bElEMGdYRnhjWENrZ0t5QmNiaUFnSUNBZ0lDQWdjMk5oYkdWZlkyOXNiM0pmWTI5dWRHbHVkVzkxY3loc2FXMXBkSE1nUFNCaktEQXNJREF1TURVcExDQnNiM2NnUFNCY1hISmxaRnhjTENCb2FXZG9JRDBnWEZ4aWJHRmphMXhjS1NsY2JtZGxibVZNYVhOMElEd3RJQ2hrYVdabUxsSk9RU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhrYVdabUlEMDlJRnhjVlZCY1hDa3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVSMDhnUEMwZ1pXNXlhV05vUjA4b1oyVnVaU0E5SUdkbGJtVk1hWE4wTENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRnhjUlU1VFJVMUNURnhjTENCdmJuUWdQU0JjWEVKUVhGd3BYRzVIVHk1eVpXRmtZV0pzWlNBOExTQnpaWFJTWldGa1lXSnNaU2hIVHl3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXBYRzV3Y21sdWRDaGtiM1J3Ykc5MEtFZFBMQ0J6YUc5M1EyRjBaV2R2Y25rZ1BTQXhOU3dnZEdsMGJHVWdQU0JjWEZ4Y0tTQXJJRnh1SUNBZ0lDQWdJQ0J6WTJGc1pWOWpiMnh2Y2w5amIyNTBhVzUxYjNWektHeHBiV2wwY3lBOUlHTW9NQ3dnTUM0d05Ta3NJR3h2ZHlBOUlGeGNjbVZrWEZ3c0lHaHBaMmdnUFNCY1hHSnNZV05yWEZ3cEtWeHVYRzVjYmx4dUl5TWpJRU5vWldOcmFXNW5JR0p2YjJ0dFlYSnJhVzVuSUc5dWJIa2dhVzRnYzNSbGJTQm5aVzVsWEc1Y2JtUmhkR0VnUEMwZ2NuVnVSbWx6YUdWeVJYaGhZM1JEYjIxaWFXNWhkR2x2YmxSaGNtZGxkQ2hjWEVnelN6STNZV05mWldabWFXVmNYQ3dnWEZ4VVUxTmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHOTNiaTVuY2l3Z1pHOTNiazVQVGxOMFpXMHVaM0lzSUdSdmQyNVRkR1Z0TG1keUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYkd3dVozSXBYRzVjYmx4dUl5QldhWE4xWVd4cGVtRjBhVzl1WEc1c2FXSnlZWEo1S0dOcGNtTnNhWHBsS1Z4dVhHNW9aV0YwYldGd1gyUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJR2x1ZEdWeVpYTjBMQ0J2WkdSelVtRjBhVzhwSUNVK0pWeHVjR2wyYjNSZmQybGtaWElvYm1GdFpYTmZabkp2YlNBOUlHbHVkR1Z5WlhOMExDQjJZV3gxWlhOZlpuSnZiU0E5SUc5a1pITlNZWFJwYnlrZ0pUNGxYRzRnSUdOdmJIVnRibDkwYjE5eWIzZHVZVzFsY3loMllYSWdQU0JjWEhSaGNtZGxkRnhjS1Z4dVhHNXdkbUZzZFdWZlpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSFJoY21kbGRDd2dhVzUwWlhKbGMzUXNJSEIyWVd4MVpTa2dKVDRsWEc0Z0lIQnBkbTkwWDNkcFpHVnlLRzVoYldWelgyWnliMjBnUFNCcGJuUmxjbVZ6ZEN3Z2RtRnNkV1Z6WDJaeWIyMGdQU0J3ZG1Gc2RXVXBJQ1UrSlZ4dUlDQmpiMngxYlc1ZmRHOWZjbTkzYm1GdFpYTW9kbUZ5SUQwZ1hGeDBZWEpuWlhSY1hDbGNibHh1WTI5c1gyWjFiaUE4TFNCamIyeHZjbEpoYlhBeUtHTW9NQ3dnTVN3Z01pa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTW9YRnhpYkhWbFhGd3NJRnhjZDJocGRHVmNYQ3dnWEZ4eVpXUmNYQ2twWEc1Y2JraGxZWFJ0WVhBb1lYTXViV0YwY21sNEtHaGxZWFJ0WVhCZlpHRjBZU2tzWEc0Z0lDQWdJQ0FnSUc1aGJXVWdQU0JjWEU5a1pITWdVbUYwYVc5Y1hDeGNiaUFnSUNBZ0lDQWdZMjlzSUQwZ1kyOXNYMloxYml4Y2JpQWdJQ0FnSUNBZ0l5QkJaR1FnWVc1dWIzUmhkR2x2YmlCbWIzSWdjQzEyWVd4MVpYTmNiaUFnSUNBZ0lDQWdZMlZzYkY5bWRXNGdQU0JtZFc1amRHbHZiaWhxTENCcExDQjRMQ0I1TENCM2FXUjBhQ3dnYUdWcFoyaDBMQ0JtYVd4c0tTQjdYRzRnSUNBZ0lDQWdJQ0FnY0haaGJDQThMU0J3ZG1Gc2RXVmZaR0YwWVZ0cExDQnFYVnh1SUNBZ0lDQWdJQ0FnSUd4aFltVnNJRHd0SUdsbVpXeHpaU2h3ZG1Gc0lENGdNQzR3TlN3Z1hGeHVMbk11WEZ3c0lITndjbWx1ZEdZb1hGd2xMakpsWEZ3c0lIQjJZV3dwS1Z4dUlDQWdJQ0FnSUNBZ0lHZHlhV1F1ZEdWNGRDaHNZV0psYkN3Z2VDd2dlU3dnWjNBZ1BTQm5jR0Z5S0dadmJuUnphWHBsSUQwZ01UQXBLVnh1SUNBZ0lDQWdJQ0I5TEZ4dUlDQWdJQ0FnSUNBaklFTjFjM1J2YldsNlpTQjBhR1VnYUdWaGRHMWhjQ0JzWVhsdmRYUmNiaUFnSUNBZ0lDQWdZMngxYzNSbGNsOXliM2R6SUQwZ1ZGSlZSU3hjYmlBZ0lDQWdJQ0FnYzJodmQxOXliM2RmWkdWdVpDQTlJRVpCVEZORkxGeHVJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeVgyTnZiSFZ0Ym5NZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ1kyOXNkVzF1WDNScGRHeGxJRDBnWEZ4SmJuUmxjbVZ6ZEZ4Y0xGeHVJQ0FnSUNBZ0lDQnliM2RmZEdsMGJHVWdQU0JjWEZSaGNtZGxkRnhjTEZ4dUlDQWdJQ0FnSUNCb1pXRjBiV0Z3WDJ4bFoyVnVaRjl3WVhKaGJTQTlJR3hwYzNRb1lYUWdQU0JqS0RBc0lERXNJRElwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeGhZbVZzY3lBOUlHTW9YRnd3WEZ3c0lGeGNNVnhjTENCY1hESmNYQ2twS1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMykpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBUU1MsIFY2KVxuY29sbmFtZXMoZ2VuZS50YikgPC0gYyhcXGNoclxcLCBcXFRTU1xcLCBcXGVuc2VtYmxcXClcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmRpZmYuUk5BIDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bGVmdF9qb2luKGdlbmUudGIsIGJ5ID0gYyhcXGVuc2VtYmxfZ2VuZV9pZFxcID0gXFxlbnNlbWJsXFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoVFNTKSlcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuXG5kaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShkaWZmID0gY2FzZV93aGVuKHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmIH4gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYgfiBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFxcTk9cXCkpXG5cblxudGVtcCA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IFRTUyAtIDI1MDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBUU1MgKyAyNTAwKSAlPiVcbiAgZHBseXI6OnNlbGVjdChjaHIsIHN0YXJ0LCBlbmQsIGVuc2VtYmxfZ2VuZV9pZCwgZGlmZilcblxuXG5kb3duLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmYgPT0gXFxET1dOXFwpKVxudXAuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSBcXFVQXFwpKVxubm8uZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSBcXE5PXFwpKVxuYWxsLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxuXG5kYXRhIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxIM0syN2FjX2VmZmllXFwsIFxcVFNTXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwLmdyLCBuby5nciwgZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLmdyKVxuXG5cbiMgVmlzdWFsaXphdGlvblxubGlicmFyeShjaXJjbGl6ZSlcblxuaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiVcbnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxucHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JVxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDIpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5IZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLFxuICAgICAgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4sXG4gICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzXG4gICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkge1xuICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal1cbiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsIFxcbi5zLlxcLCBzcHJpbnRmKFxcJS4yZVxcLCBwdmFsKSlcbiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSlcbiAgICAgICAgfSxcbiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0XG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIGNvbHVtbl90aXRsZSA9IFxcSW50ZXJlc3RcXCxcbiAgICAgICAgcm93X3RpdGxlID0gXFxUYXJnZXRcXCxcbiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGF0ID0gYygwLCAxLCAyKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKFxcMFxcLCBcXDFcXCwgXFwyXFwpKSlcblxuXG4jIyBHTyBURVNUXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZS50YiwgYnkgPSBjKFxcZW5zZW1ibF9nZW5lX2lkXFwgPSBcXGVuc2VtYmxcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShUU1MpKVxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5cbmRpZmYuUk5BIDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bXV0YXRlKGRpZmYgPSBjYXNlX3doZW4ocGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDID4gZmNDdXRvZmYgfiBcXFVQXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiB+IFxcRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gXFxOT1xcKSlcbmdlbmVMaXN0IDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcRE9XTlxcKSkkZW5zZW1ibF9nZW5lX2lkXG5HTyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPLnJlYWRhYmxlIDwtIHNldFJlYWRhYmxlKEdPLCBPcmdEYiA9IG9yZy5NbS5lZy5kYilcblxuZG93blN0ZW1HZW5lIDwtIHVuaXF1ZSh1bmxpc3QoKGFzLmRhdGEuZnJhbWUoR08pICU+JSBkcGx5cjo6c2xpY2UoYyg0LCA1LCAxNCwgNjYpKSAlPiUgZHBseXI6Om11dGF0ZShnZW5lSUQgPSBzdHJzcGxpdChnZW5lSUQsIFxcL1xcKSkpJGdlbmVJRCkpXG5kb3duU3RlbS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsX2dlbmVfaWQgJWluJSBkb3duU3RlbUdlbmUpKVxuXG5wcmludChkb3RwbG90KEdPLCBzaG93Q2F0ZWdvcnkgPSAxNSwgdGl0bGUgPSBcXFxcKSArIFxuICAgICAgICBzY2FsZV9jb2xvcl9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMC4wNSksIGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsYWNrXFwpKVxuZ2VuZUxpc3QgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmYgPT0gXFxVUFxcKSkkZW5zZW1ibF9nZW5lX2lkXG5HTyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPLnJlYWRhYmxlIDwtIHNldFJlYWRhYmxlKEdPLCBPcmdEYiA9IG9yZy5NbS5lZy5kYilcbnByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IDE1LCB0aXRsZSA9IFxcXFwpICsgXG4gICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gXFxyZWRcXCwgaGlnaCA9IFxcYmxhY2tcXCkpXG5cblxuZG93bk5PTlN0ZW0uZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoZW5zZW1ibF9nZW5lX2lkICVpbiUgZG93blN0ZW1HZW5lKSkpXG5cbnByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IDE1LCB0aXRsZSA9IFxcXFwpICsgXG4gICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gXFxyZWRcXCwgaGlnaCA9IFxcYmxhY2tcXCkpXG5nZW5lTGlzdCA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSBcXFVQXFwpKSRlbnNlbWJsX2dlbmVfaWRcbkdPIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR08ucmVhZGFibGUgPC0gc2V0UmVhZGFibGUoR08sIE9yZ0RiID0gb3JnLk1tLmVnLmRiKVxucHJpbnQoZG90cGxvdChHTywgc2hvd0NhdGVnb3J5ID0gMTUsIHRpdGxlID0gXFxcXCkgKyBcbiAgICAgICAgc2NhbGVfY29sb3JfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDAuMDUpLCBsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibGFja1xcKSlcblxuXG5cbiMjIyBDaGVja2luZyBib29rbWFya2luZyBvbmx5IGluIHN0ZW0gZ2VuZVxuXG5kYXRhIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxIM0syN2FjX2VmZmllXFwsIFxcVFNTXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd24uZ3IsIGRvd25OT05TdGVtLmdyLCBkb3duU3RlbS5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLmdyKVxuXG5cbiMgVmlzdWFsaXphdGlvblxubGlicmFyeShjaXJjbGl6ZSlcblxuaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiVcbnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxucHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JVxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDIpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5IZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLFxuICAgICAgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4sXG4gICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzXG4gICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkge1xuICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal1cbiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsIFxcbi5zLlxcLCBzcHJpbnRmKFxcJS4yZVxcLCBwdmFsKSlcbiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSlcbiAgICAgICAgfSxcbiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0XG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIGNvbHVtbl90aXRsZSA9IFxcSW50ZXJlc3RcXCxcbiAgICAgICAgcm93X3RpdGxlID0gXFxUYXJnZXRcXCxcbiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGF0ID0gYygwLCAxLCAyKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKFxcMFxcLCBcXDFcXCwgXFwyXFwpKSlcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTUywgVjYpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyXFwsIFxcVFNTXFwsIFxcZW5zZW1ibFxcKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZS50YiwgYnkgPSBjKFxcZW5zZW1ibF9nZW5lX2lkXFwgPSBcXGVuc2VtYmxcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShUU1MpKVxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5cbmRpZmYuUk5BIDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bXV0YXRlKGRpZmYgPSBjYXNlX3doZW4ocGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDID4gZmNDdXRvZmYgfiBcXFVQXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiB+IFxcRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gXFxOT1xcKSlcblxuXG50ZW1wIDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gVFNTIC0gMjUwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IFRTUyArIDI1MDApICU+JVxuICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZCwgZW5zZW1ibF9nZW5lX2lkLCBkaWZmKVxuXG5cbmRvd24uZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSBcXERPV05cXCkpXG51cC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcVVBcXCkpXG5uby5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcTk9cXCkpXG5hbGwuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5cbmRhdGEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEgzSzI3YWNfZWZmaWVcXCwgXFxUU1NcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAuZ3IsIG5vLmdyLCBkb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwuZ3IpXG5cblxuIyBWaXN1YWxpemF0aW9uXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMiksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksXG4gICAgICAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCxcbiAgICAgICAgY29sID0gY29sX2Z1bixcbiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXNcbiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7XG4gICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXVxuICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgXFxuLnMuXFwsIHNwcmludGYoXFwlLjJlXFwsIHB2YWwpKVxuICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKVxuICAgICAgICB9LFxuICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXRcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY29sdW1uX3RpdGxlID0gXFxJbnRlcmVzdFxcLFxuICAgICAgICByb3dfdGl0bGUgPSBcXFRhcmdldFxcLFxuICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoXFwwXFwsIFxcMVxcLCBcXDJcXCkpKVxuXG5cbiMjIEdPIFRFU1RcbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5kaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6OmxlZnRfam9pbihnZW5lLnRiLCBieSA9IGMoXFxlbnNlbWJsX2dlbmVfaWRcXCA9IFxcZW5zZW1ibFxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKFRTUykpXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcblxuZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjptdXRhdGUoZGlmZiA9IGNhc2Vfd2hlbihwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPiBmY0N1dG9mZiB+IFxcVVBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmIH4gXFxET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBcXE5PXFwpKVxuZ2VuZUxpc3QgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmYgPT0gXFxET1dOXFwpKSRlbnNlbWJsX2dlbmVfaWRcbkdPIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR08ucmVhZGFibGUgPC0gc2V0UmVhZGFibGUoR08sIE9yZ0RiID0gb3JnLk1tLmVnLmRiKVxuXG5kb3duU3RlbUdlbmUgPC0gdW5pcXVlKHVubGlzdCgoYXMuZGF0YS5mcmFtZShHTykgJT4lIGRwbHlyOjpzbGljZShjKDQsIDUsIDE0LCA2NikpICU+JSBkcGx5cjo6bXV0YXRlKGdlbmVJRCA9IHN0cnNwbGl0KGdlbmVJRCwgXFwvXFwpKSkkZ2VuZUlEKSlcbmRvd25TdGVtLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGRvd25TdGVtR2VuZSkpXG5cbnByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IDE1LCB0aXRsZSA9IFxcXFwpICsgXG4gICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gXFxyZWRcXCwgaGlnaCA9IFxcYmxhY2tcXCkpXG5nZW5lTGlzdCA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSBcXFVQXFwpKSRlbnNlbWJsX2dlbmVfaWRcbkdPIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR08ucmVhZGFibGUgPC0gc2V0UmVhZGFibGUoR08sIE9yZ0RiID0gb3JnLk1tLmVnLmRiKVxucHJpbnQoZG90cGxvdChHTywgc2hvd0NhdGVnb3J5ID0gMTUsIHRpdGxlID0gXFxcXCkgKyBcbiAgICAgICAgc2NhbGVfY29sb3JfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDAuMDUpLCBsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibGFja1xcKSlcblxuXG5kb3duTk9OU3RlbS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShlbnNlbWJsX2dlbmVfaWQgJWluJSBkb3duU3RlbUdlbmUpKSlcblxucHJpbnQoZG90cGxvdChHTywgc2hvd0NhdGVnb3J5ID0gMTUsIHRpdGxlID0gXFxcXCkgKyBcbiAgICAgICAgc2NhbGVfY29sb3JfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDAuMDUpLCBsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibGFja1xcKSlcbmdlbmVMaXN0IDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcVVBcXCkpJGVuc2VtYmxfZ2VuZV9pZFxuR08gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5HTy5yZWFkYWJsZSA8LSBzZXRSZWFkYWJsZShHTywgT3JnRGIgPSBvcmcuTW0uZWcuZGIpXG5wcmludChkb3RwbG90KEdPLCBzaG93Q2F0ZWdvcnkgPSAxNSwgdGl0bGUgPSBcXFxcKSArIFxuICAgICAgICBzY2FsZV9jb2xvcl9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMC4wNSksIGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsYWNrXFwpKVxuXG5cblxuIyMjIENoZWNraW5nIGJvb2ttYXJraW5nIG9ubHkgaW4gc3RlbSBnZW5lXG5cbmRhdGEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEgzSzI3YWNfZWZmaWVcXCwgXFxUU1NcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bi5nciwgZG93bk5PTlN0ZW0uZ3IsIGRvd25TdGVtLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwuZ3IpXG5cblxuIyBWaXN1YWxpemF0aW9uXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMiksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksXG4gICAgICAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCxcbiAgICAgICAgY29sID0gY29sX2Z1bixcbiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXNcbiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7XG4gICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXVxuICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgXFxuLnMuXFwsIHNwcmludGYoXFwlLjJlXFwsIHB2YWwpKVxuICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKVxuICAgICAgICB9LFxuICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXRcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY29sdW1uX3RpdGxlID0gXFxJbnRlcmVzdFxcLFxuICAgICAgICByb3dfdGl0bGUgPSBcXFRhcmdldFxcLFxuICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoXFwwXFwsIFxcMVxcLCBcXDJcXCkpKVxuYGBgXG5gYGAifQ== -->

```r
```r
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V1, TSS, V6)
colnames(gene.tb) <- c(\chr\, \TSS\, \ensembl\)

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
diff.RNA <- diff.RNA %>% dplyr::left_join(gene.tb, by = c(\ensembl_gene_id\ = \ensembl\)) %>%
  dplyr::filter(!is.na(TSS))
alpha <- 0.05
fcCutoff <- 0.5

diff.RNA <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                                        padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                                        TRUE ~ \NO\))


temp <- diff.RNA %>% dplyr::mutate(start = TSS - 2500,
                           end = TSS + 2500) %>%
  dplyr::select(chr, start, end, ensembl_gene_id, diff)


down.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \DOWN\))
up.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \UP\))
no.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \NO\))
all.gr <- makeGRangesFromDataFrame(temp)

data <- runFisherExactCombinationTarget(\H3K27ac_effie\, \TSS\,
                                      up.gr, no.gr, down.gr,
                                      all.gr)


# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 2), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2), 
                                    labels = c(\0\, \1\, \2\)))


## GO TEST
diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
diff.RNA <- diff.RNA %>% dplyr::left_join(gene.tb, by = c(\ensembl_gene_id\ = \ensembl\)) %>%
  dplyr::filter(!is.na(TSS))
alpha <- 0.05
fcCutoff <- 0.5

diff.RNA <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                                        padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                                        TRUE ~ \NO\))
geneList <- (diff.RNA %>% dplyr::filter(diff == \DOWN\))$ensembl_gene_id
GO <- enrichGO(gene = geneList, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO.readable <- setReadable(GO, OrgDb = org.Mm.eg.db)

downStemGene <- unique(unlist((as.data.frame(GO) %>% dplyr::slice(c(4, 5, 14, 66)) %>% dplyr::mutate(geneID = strsplit(geneID, \/\)))$geneID))
downStem.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(ensembl_gene_id %in% downStemGene))

print(dotplot(GO, showCategory = 15, title = \\) + 
        scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))
geneList <- (diff.RNA %>% dplyr::filter(diff == \UP\))$ensembl_gene_id
GO <- enrichGO(gene = geneList, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO.readable <- setReadable(GO, OrgDb = org.Mm.eg.db)
print(dotplot(GO, showCategory = 15, title = \\) + 
        scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))


downNONStem.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \DOWN\,
                                                               !(ensembl_gene_id %in% downStemGene)))

print(dotplot(GO, showCategory = 15, title = \\) + 
        scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))
geneList <- (diff.RNA %>% dplyr::filter(diff == \UP\))$ensembl_gene_id
GO <- enrichGO(gene = geneList, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO.readable <- setReadable(GO, OrgDb = org.Mm.eg.db)
print(dotplot(GO, showCategory = 15, title = \\) + 
        scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))



### Checking bookmarking only in stem gene

data <- runFisherExactCombinationTarget(\H3K27ac_effie\, \TSS\,
                                      down.gr, downNONStem.gr, downStem.gr,
                                      all.gr)


# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 2), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2), 
                                    labels = c(\0\, \1\, \2\)))
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### Retained & Lost

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMlZ1WlM1MFlpQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKdGJURXdYMGRTUTIwek9DNXdObDluWlc1bFgzTnZjblJsWkM1aVpXUmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGUlRVeUE5SUdsbVpXeHpaU2hXTkNBOVBTQmNJaXRjSWl3Z1ZqSXNJRll6S1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9WakVzSUZSVFV5d2dWallwWEc1amIyeHVZVzFsY3loblpXNWxMblJpS1NBOExTQmpLRndpWTJoeVhDSXNJRndpVkZOVFhDSXNJRndpWlc1elpXMWliRndpS1Z4dVhHNWthV1ptTGxKT1FTQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKa2FXWm1YMGN4TGtFME9EVXVjMlZzWldOMFpXUXlYMGN4TGtWd2FTNUJORGcxWDNaelgwY3hMa1Z3YVM1RVRWTlBMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWlc1elpXMWliRjluWlc1bFgybGtMQ0JzYjJjeVJtOXNaRU5vWVc1blpTd2djMmh5YVc1clpXUmZiRzluTWtaRExDQndZV1JxTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVcFhHNWthV1ptTGxKT1FTQThMU0JrYVdabUxsSk9RU0FsUGlVZ1pIQnNlWEk2T214bFpuUmZhbTlwYmloblpXNWxMblJpTENCaWVTQTlJR01vWENKbGJuTmxiV0pzWDJkbGJtVmZhV1JjSWlBOUlGd2laVzV6WlcxaWJGd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb0lXbHpMbTVoS0ZSVFV5a3BYRzVoYkhCb1lTQThMU0F3TGpBMVhHNW1ZME4xZEc5bVppQThMU0F3TGpWY2JseHVaR2xtWmk1U1RrRWdQQzBnWkdsbVppNVNUa0VnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWkdsbVppQTlJR05oYzJWZmQyaGxiaWh3WVdScUlEd2dZV3h3YUdFZ0ppQnphSEpwYm10bFpGOXNiMmN5UmtNZ1BpQm1ZME4xZEc5bVppQitJRndpVlZCY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0dGa2FpQThJR0ZzY0doaElDWWdjMmh5YVc1clpXUmZiRzluTWtaRElEd2dMV1pqUTNWMGIyWm1JSDRnWENKRVQxZE9YQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlNWVVVnZmlCY0lrNVBYQ0lwS1Z4dVhHNWNiblJsYlhBZ1BDMGdaR2xtWmk1U1RrRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9jM1JoY25RZ1BTQlVVMU1nTFNBeU5UQXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWlc1a0lEMGdWRk5USUNzZ01qVXdNQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1kyaHlMQ0J6ZEdGeWRDd2daVzVrTENCbGJuTmxiV0pzWDJkbGJtVmZhV1FzSUdScFptWXBYRzVjYmx4dVpHOTNiaTVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhrYVdabUlEMDlJRndpUkU5WFRsd2lLU2xjYm5Wd0xtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2gwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHUnBabVlnUFQwZ1hDSlZVRndpS1NsY2JtNXZMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR1JwWm1ZZ1BUMGdYQ0pPVDF3aUtTbGNibUZzYkM1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9kR1Z0Y0NsY2JseHVaR0YwWVNBOExTQnlkVzVHYVhOb1pYSkZlR0ZqZEVOdmJXSnBibUYwYVc5dVZHRnlaMlYwS0Z3aVNETkxNamRoWTE5bFptWnBaVndpTENCY0lsUlRVMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjFjQzVuY2l3Z2JtOHVaM0lzSUdSdmQyNHVaM0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnNiQzVuY2lsY2JseHVYRzRqSUZacGMzVmhiR2w2WVhScGIyNWNibXhwWW5KaGNua29ZMmx5WTJ4cGVtVXBYRzVjYm1obFlYUnRZWEJmWkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2FXNTBaWEpsYzNRc0lHOWtaSE5TWVhScGJ5a2dKVDRsWEc1d2FYWnZkRjkzYVdSbGNpaHVZVzFsYzE5bWNtOXRJRDBnYVc1MFpYSmxjM1FzSUhaaGJIVmxjMTltY205dElEMGdiMlJrYzFKaGRHbHZLU0FsUGlWY2JpQWdZMjlzZFcxdVgzUnZYM0p2ZDI1aGJXVnpLSFpoY2lBOUlGd2lkR0Z5WjJWMFhDSXBYRzVjYm5CMllXeDFaVjlrWVhSaElEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCcGJuUmxjbVZ6ZEN3Z2NIWmhiSFZsS1NBbFBpVmNiaUFnY0dsMmIzUmZkMmxrWlhJb2JtRnRaWE5mWm5KdmJTQTlJR2x1ZEdWeVpYTjBMQ0IyWVd4MVpYTmZabkp2YlNBOUlIQjJZV3gxWlNrZ0pUNGxYRzRnSUdOdmJIVnRibDkwYjE5eWIzZHVZVzFsY3loMllYSWdQU0JjSW5SaGNtZGxkRndpS1Z4dVhHNWpiMnhmWm5WdUlEd3RJR052Ykc5eVVtRnRjRElvWXlnd0xDQXhMQ0F5S1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWXloY0ltSnNkV1ZjSWl3Z1hDSjNhR2wwWlZ3aUxDQmNJbkpsWkZ3aUtTbGNibHh1U0dWaGRHMWhjQ2hoY3k1dFlYUnlhWGdvYUdWaGRHMWhjRjlrWVhSaEtTeGNiaUFnSUNBZ0lDQWdibUZ0WlNBOUlGd2lUMlJrY3lCU1lYUnBiMXdpTEZ4dUlDQWdJQ0FnSUNCamIyd2dQU0JqYjJ4ZlpuVnVMRnh1SUNBZ0lDQWdJQ0FqSUVGa1pDQmhibTV2ZEdGMGFXOXVJR1p2Y2lCd0xYWmhiSFZsYzF4dUlDQWdJQ0FnSUNCalpXeHNYMloxYmlBOUlHWjFibU4wYVc5dUtHb3NJR2tzSUhnc0lIa3NJSGRwWkhSb0xDQm9aV2xuYUhRc0lHWnBiR3dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQndkbUZzSUR3dElIQjJZV3gxWlY5a1lYUmhXMmtzSUdwZFhHNGdJQ0FnSUNBZ0lDQWdiR0ZpWld3Z1BDMGdhV1psYkhObEtIQjJZV3dnUGlBd0xqQTFMQ0JjSW00dWN5NWNJaXdnYzNCeWFXNTBaaWhjSWlVdU1tVmNJaXdnY0haaGJDa3BYRzRnSUNBZ0lDQWdJQ0FnWjNKcFpDNTBaWGgwS0d4aFltVnNMQ0I0TENCNUxDQm5jQ0E5SUdkd1lYSW9abTl1ZEhOcGVtVWdQU0F4TUNrcFhHNGdJQ0FnSUNBZ0lIMHNYRzRnSUNBZ0lDQWdJQ01nUTNWemRHOXRhWHBsSUhSb1pTQm9aV0YwYldGd0lHeGhlVzkxZEZ4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5WDNKdmQzTWdQU0JVVWxWRkxGeHVJQ0FnSUNBZ0lDQnphRzkzWDNKdmQxOWtaVzVrSUQwZ1JrRk1VMFVzWEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpmWTI5c2RXMXVjeUE5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JqYjJ4MWJXNWZkR2wwYkdVZ1BTQmNJa2x1ZEdWeVpYTjBYQ0lzWEc0Z0lDQWdJQ0FnSUhKdmQxOTBhWFJzWlNBOUlGd2lWR0Z5WjJWMFhDSXNYRzRnSUNBZ0lDQWdJR2hsWVhSdFlYQmZiR1ZuWlc1a1gzQmhjbUZ0SUQwZ2JHbHpkQ2hoZENBOUlHTW9NQ3dnTVN3Z01pa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdGaVpXeHpJRDBnWXloY0lqQmNJaXdnWENJeFhDSXNJRndpTWx3aUtTa3BYRzVjYmx4dUl5TWdSMDljYm1ScFptWXVVazVCSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbVJwWm1aZlJ6RXVRVFE0TlM1elpXeGxZM1JsWkRKZlJ6RXVSWEJwTGtFME9EVmZkbk5mUnpFdVJYQnBMa1JOVTA4dWRITjJYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGxibk5sYldKc1gyZGxibVZmYVdRc0lHeHZaekpHYjJ4a1EyaGhibWRsTENCemFISnBibXRsWkY5c2IyY3lSa01zSUhCaFpHb3NJR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU2xjYm1ScFptWXVVazVCSUR3dElHUnBabVl1VWs1QklDVStKU0JrY0d4NWNqbzZiR1ZtZEY5cWIybHVLR2RsYm1VdWRHSXNJR0o1SUQwZ1l5aGNJbVZ1YzJWdFlteGZaMlZ1WlY5cFpGd2lJRDBnWENKbGJuTmxiV0pzWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWdoYVhNdWJtRW9WRk5US1NsY2JtRnNjR2hoSUR3dElEQXVNRFZjYm1aalEzVjBiMlptSUR3dElEQXVOVnh1WEc1a2FXWm1MbEpPUVNBOExTQmthV1ptTGxKT1FTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGthV1ptSUQwZ1kyRnpaVjkzYUdWdUtIQmhaR29nUENCaGJIQm9ZU0FtSUhOb2NtbHVhMlZrWDJ4dlp6SkdReUErSUdaalEzVjBiMlptSUg0Z1hDSlZVRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndZV1JxSUR3Z1lXeHdhR0VnSmlCemFISnBibXRsWkY5c2IyY3lSa01nUENBdFptTkRkWFJ2Wm1ZZ2ZpQmNJa1JQVjA1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnVkZKVlJTQitJRndpVGs5Y0lpa3BYRzVjYm1kbGJtVk1hWE4wSUR3dElDaGthV1ptTGxKT1FTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaGthV1ptSUQwOUlGd2lSRTlYVGx3aUtTa2taVzV6WlcxaWJGOW5aVzVsWDJsa1hHNUhUeUE4TFNCbGJuSnBZMmhIVHloblpXNWxJRDBnWjJWdVpVeHBjM1FzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYQ0pGVGxORlRVSk1YQ0lzSUc5dWRDQTlJRndpUWxCY0lpbGNia2RQTG5KbFlXUmhZbXhsSUR3dElITmxkRkpsWVdSaFlteGxLRWRQTENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpbGNibkJ5YVc1MEtHUnZkSEJzYjNRb1IwOHNJSE5vYjNkRFlYUmxaMjl5ZVNBOUlERTFMQ0IwYVhSc1pTQTlJRndpWENJcElDc2dYRzRnSUNBZ0lDQWdJSE5qWVd4bFgyTnZiRzl5WDJOdmJuUnBiblZ2ZFhNb2JHbHRhWFJ6SUQwZ1l5Z3dMQ0F3TGpBMUtTd2diRzkzSUQwZ1hDSnlaV1JjSWl3Z2FHbG5hQ0E5SUZ3aVlteGhZMnRjSWlrcFhHNW5aVzVsVEdsemRDQThMU0FvWkdsbVppNVNUa0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWkdsbVppQTlQU0JjSWxWUVhDSXBLU1JsYm5ObGJXSnNYMmRsYm1WZmFXUmNia2RQSUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxUR2x6ZEN3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lLVnh1UjA4dWNtVmhaR0ZpYkdVZ1BDMGdjMlYwVW1WaFpHRmliR1VvUjA4c0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlLVnh1Y0hKcGJuUW9aRzkwY0d4dmRDaEhUeXdnYzJodmQwTmhkR1ZuYjNKNUlEMGdNVFVzSUhScGRHeGxJRDBnWENKY0lpa2dLeUJjYmlBZ0lDQWdJQ0FnYzJOaGJHVmZZMjlzYjNKZlkyOXVkR2x1ZFc5MWN5aHNhVzFwZEhNZ1BTQmpLREFzSURBdU1EVXBMQ0JzYjNjZ1BTQmNJbkpsWkZ3aUxDQm9hV2RvSUQwZ1hDSmliR0ZqYTF3aUtTbGNibHh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMykpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBUU1MsIFY2KVxuY29sbmFtZXMoZ2VuZS50YikgPC0gYyhcXGNoclxcLCBcXFRTU1xcLCBcXGVuc2VtYmxcXClcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS5FcGkuQTQ4NV92c19HMS5FcGkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZS50YiwgYnkgPSBjKFxcZW5zZW1ibF9nZW5lX2lkXFwgPSBcXGVuc2VtYmxcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShUU1MpKVxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5cbmRpZmYuUk5BIDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bXV0YXRlKGRpZmYgPSBjYXNlX3doZW4ocGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDID4gZmNDdXRvZmYgfiBcXFVQXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiB+IFxcRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gXFxOT1xcKSlcblxuXG50ZW1wIDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gVFNTIC0gMjUwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IFRTUyArIDI1MDApICU+JVxuICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZCwgZW5zZW1ibF9nZW5lX2lkLCBkaWZmKVxuXG5cbmRvd24uZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSBcXERPV05cXCkpXG51cC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcVVBcXCkpXG5uby5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcTk9cXCkpXG5hbGwuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5cbmRhdGEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldChcXEgzSzI3YWNfZWZmaWVcXCwgXFxUU1NcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAuZ3IsIG5vLmdyLCBkb3duLmdyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwuZ3IpXG5cblxuIyBWaXN1YWxpemF0aW9uXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMiksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksXG4gICAgICAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCxcbiAgICAgICAgY29sID0gY29sX2Z1bixcbiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXNcbiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7XG4gICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXVxuICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgXFxuLnMuXFwsIHNwcmludGYoXFwlLjJlXFwsIHB2YWwpKVxuICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKVxuICAgICAgICB9LFxuICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXRcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY29sdW1uX3RpdGxlID0gXFxJbnRlcmVzdFxcLFxuICAgICAgICByb3dfdGl0bGUgPSBcXFRhcmdldFxcLFxuICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoXFwwXFwsIFxcMVxcLCBcXDJcXCkpKVxuXG5cbiMjIEdPXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLkVwaS5BNDg1X3ZzX0cxLkVwaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5kaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6OmxlZnRfam9pbihnZW5lLnRiLCBieSA9IGMoXFxlbnNlbWJsX2dlbmVfaWRcXCA9IFxcZW5zZW1ibFxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKFRTUykpXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcblxuZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjptdXRhdGUoZGlmZiA9IGNhc2Vfd2hlbihwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPiBmY0N1dG9mZiB+IFxcVVBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmIH4gXFxET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBcXE5PXFwpKVxuXG5nZW5lTGlzdCA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSBcXERPV05cXCkpJGVuc2VtYmxfZ2VuZV9pZFxuR08gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5HTy5yZWFkYWJsZSA8LSBzZXRSZWFkYWJsZShHTywgT3JnRGIgPSBvcmcuTW0uZWcuZGIpXG5wcmludChkb3RwbG90KEdPLCBzaG93Q2F0ZWdvcnkgPSAxNSwgdGl0bGUgPSBcXFxcKSArIFxuICAgICAgICBzY2FsZV9jb2xvcl9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMC4wNSksIGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsYWNrXFwpKVxuZ2VuZUxpc3QgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmYgPT0gXFxVUFxcKSkkZW5zZW1ibF9nZW5lX2lkXG5HTyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPLnJlYWRhYmxlIDwtIHNldFJlYWRhYmxlKEdPLCBPcmdEYiA9IG9yZy5NbS5lZy5kYilcbnByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IDE1LCB0aXRsZSA9IFxcXFwpICsgXG4gICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gXFxyZWRcXCwgaGlnaCA9IFxcYmxhY2tcXCkpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V1, TSS, V6)
colnames(gene.tb) <- c(\chr\, \TSS\, \ensembl\)

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.Epi.A485_vs_G1.Epi.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
diff.RNA <- diff.RNA %>% dplyr::left_join(gene.tb, by = c(\ensembl_gene_id\ = \ensembl\)) %>%
  dplyr::filter(!is.na(TSS))
alpha <- 0.05
fcCutoff <- 0.5

diff.RNA <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                                        padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                                        TRUE ~ \NO\))


temp <- diff.RNA %>% dplyr::mutate(start = TSS - 2500,
                           end = TSS + 2500) %>%
  dplyr::select(chr, start, end, ensembl_gene_id, diff)


down.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \DOWN\))
up.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \UP\))
no.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \NO\))
all.gr <- makeGRangesFromDataFrame(temp)

data <- runFisherExactCombinationTarget(\H3K27ac_effie\, \TSS\,
                                      up.gr, no.gr, down.gr,
                                      all.gr)


# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 2), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2), 
                                    labels = c(\0\, \1\, \2\)))


## GO
diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.Epi.A485_vs_G1.Epi.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
diff.RNA <- diff.RNA %>% dplyr::left_join(gene.tb, by = c(\ensembl_gene_id\ = \ensembl\)) %>%
  dplyr::filter(!is.na(TSS))
alpha <- 0.05
fcCutoff <- 0.5

diff.RNA <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                                        padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                                        TRUE ~ \NO\))

geneList <- (diff.RNA %>% dplyr::filter(diff == \DOWN\))$ensembl_gene_id
GO <- enrichGO(gene = geneList, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO.readable <- setReadable(GO, OrgDb = org.Mm.eg.db)
print(dotplot(GO, showCategory = 15, title = \\) + 
        scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))
geneList <- (diff.RNA %>% dplyr::filter(diff == \UP\))$ensembl_gene_id
GO <- enrichGO(gene = geneList, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO.readable <- setReadable(GO, OrgDb = org.Mm.eg.db)
print(dotplot(GO, showCategory = 15, title = \\) + 
        scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVoyVnVaUzUwWWlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnh0YlRFd1gwZFNRMjB6T0M1d05sOW5aVzVsWDNOdmNuUmxaQzVpWldSY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0ZSVFV5QTlJR2xtWld4elpTaFdOQ0E5UFNCY1hDdGNYQ3dnVmpJc0lGWXpLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1ZqRXNJRlJUVXl3Z1ZqWXBYRzVqYjJ4dVlXMWxjeWhuWlc1bExuUmlLU0E4TFNCaktGeGNZMmh5WEZ3c0lGeGNWRk5UWEZ3c0lGeGNaVzV6WlcxaWJGeGNLVnh1WEc1a2FXWm1MbEpPUVNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhrYVdabVgwY3hMa0UwT0RVdWMyVnNaV04wWldReVgwY3hMa1Z3YVM1Qk5EZzFYM1p6WDBjeExrVndhUzVFVFZOUExuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9aVzV6WlcxaWJGOW5aVzVsWDJsa0xDQnNiMmN5Um05c1pFTm9ZVzVuWlN3Z2MyaHlhVzVyWldSZmJHOW5Na1pETENCd1lXUnFMQ0JsZUhSbGNtNWhiRjluWlc1bFgyNWhiV1VwWEc1a2FXWm1MbEpPUVNBOExTQmthV1ptTGxKT1FTQWxQaVVnWkhCc2VYSTZPbXhsWm5SZmFtOXBiaWhuWlc1bExuUmlMQ0JpZVNBOUlHTW9YRnhsYm5ObGJXSnNYMmRsYm1WZmFXUmNYQ0E5SUZ4Y1pXNXpaVzFpYkZ4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvSVdsekxtNWhLRlJUVXlrcFhHNWhiSEJvWVNBOExTQXdMakExWEc1bVkwTjFkRzltWmlBOExTQXdMalZjYmx4dVpHbG1aaTVTVGtFZ1BDMGdaR2xtWmk1U1RrRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2xtWmlBOUlHTmhjMlZmZDJobGJpaHdZV1JxSUR3Z1lXeHdhR0VnSmlCemFISnBibXRsWkY5c2IyY3lSa01nUGlCbVkwTjFkRzltWmlCK0lGeGNWVkJjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjR0ZrYWlBOElHRnNjR2hoSUNZZ2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z0xXWmpRM1YwYjJabUlINGdYRnhFVDFkT1hGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSU1ZVVWdmaUJjWEU1UFhGd3BLVnh1WEc1Y2JuUmxiWEFnUEMwZ1pHbG1aaTVTVGtFZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb2MzUmhjblFnUFNCVVUxTWdMU0F5TlRBd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaVzVrSUQwZ1ZGTlRJQ3NnTWpVd01Da2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWTJoeUxDQnpkR0Z5ZEN3Z1pXNWtMQ0JsYm5ObGJXSnNYMmRsYm1WZmFXUXNJR1JwWm1ZcFhHNWNibHh1Wkc5M2JpNW5jaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvZEdWdGNDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaGthV1ptSUQwOUlGeGNSRTlYVGx4Y0tTbGNiblZ3TG1keUlEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaDBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dScFptWWdQVDBnWEZ4VlVGeGNLU2xjYm01dkxtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2gwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHUnBabVlnUFQwZ1hGeE9UMXhjS1NsY2JtRnNiQzVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb2RHVnRjQ2xjYmx4dVpHRjBZU0E4TFNCeWRXNUdhWE5vWlhKRmVHRmpkRU52YldKcGJtRjBhVzl1VkdGeVoyVjBLRnhjU0ROTE1qZGhZMTlsWm1acFpWeGNMQ0JjWEZSVFUxeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMWNDNW5jaXdnYm04dVozSXNJR1J2ZDI0dVozSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGc2JDNW5jaWxjYmx4dVhHNGpJRlpwYzNWaGJHbDZZWFJwYjI1Y2JteHBZbkpoY25rb1kybHlZMnhwZW1VcFhHNWNibWhsWVhSdFlYQmZaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYVc1MFpYSmxjM1FzSUc5a1pITlNZWFJwYnlrZ0pUNGxYRzV3YVhadmRGOTNhV1JsY2lodVlXMWxjMTltY205dElEMGdhVzUwWlhKbGMzUXNJSFpoYkhWbGMxOW1jbTl0SUQwZ2IyUmtjMUpoZEdsdktTQWxQaVZjYmlBZ1kyOXNkVzF1WDNSdlgzSnZkMjVoYldWektIWmhjaUE5SUZ4Y2RHRnlaMlYwWEZ3cFhHNWNibkIyWVd4MVpWOWtZWFJoSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0JwYm5SbGNtVnpkQ3dnY0haaGJIVmxLU0FsUGlWY2JpQWdjR2wyYjNSZmQybGtaWElvYm1GdFpYTmZabkp2YlNBOUlHbHVkR1Z5WlhOMExDQjJZV3gxWlhOZlpuSnZiU0E5SUhCMllXeDFaU2tnSlQ0bFhHNGdJR052YkhWdGJsOTBiMTl5YjNkdVlXMWxjeWgyWVhJZ1BTQmNYSFJoY21kbGRGeGNLVnh1WEc1amIyeGZablZ1SUR3dElHTnZiRzl5VW1GdGNESW9ZeWd3TENBeExDQXlLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZeWhjWEdKc2RXVmNYQ3dnWEZ4M2FHbDBaVnhjTENCY1hISmxaRnhjS1NsY2JseHVTR1ZoZEcxaGNDaGhjeTV0WVhSeWFYZ29hR1ZoZEcxaGNGOWtZWFJoS1N4Y2JpQWdJQ0FnSUNBZ2JtRnRaU0E5SUZ4Y1QyUmtjeUJTWVhScGIxeGNMRnh1SUNBZ0lDQWdJQ0JqYjJ3Z1BTQmpiMnhmWm5WdUxGeHVJQ0FnSUNBZ0lDQWpJRUZrWkNCaGJtNXZkR0YwYVc5dUlHWnZjaUJ3TFhaaGJIVmxjMXh1SUNBZ0lDQWdJQ0JqWld4c1gyWjFiaUE5SUdaMWJtTjBhVzl1S0dvc0lHa3NJSGdzSUhrc0lIZHBaSFJvTENCb1pXbG5hSFFzSUdacGJHd3BJSHRjYmlBZ0lDQWdJQ0FnSUNCd2RtRnNJRHd0SUhCMllXeDFaVjlrWVhSaFcya3NJR3BkWEc0Z0lDQWdJQ0FnSUNBZ2JHRmlaV3dnUEMwZ2FXWmxiSE5sS0hCMllXd2dQaUF3TGpBMUxDQmNYRzR1Y3k1Y1hDd2djM0J5YVc1MFppaGNYQ1V1TW1WY1hDd2djSFpoYkNrcFhHNGdJQ0FnSUNBZ0lDQWdaM0pwWkM1MFpYaDBLR3hoWW1Wc0xDQjRMQ0I1TENCbmNDQTlJR2R3WVhJb1ptOXVkSE5wZW1VZ1BTQXhNQ2twWEc0Z0lDQWdJQ0FnSUgwc1hHNGdJQ0FnSUNBZ0lDTWdRM1Z6ZEc5dGFYcGxJSFJvWlNCb1pXRjBiV0Z3SUd4aGVXOTFkRnh1SUNBZ0lDQWdJQ0JqYkhWemRHVnlYM0p2ZDNNZ1BTQlVVbFZGTEZ4dUlDQWdJQ0FnSUNCemFHOTNYM0p2ZDE5a1pXNWtJRDBnUmtGTVUwVXNYRzRnSUNBZ0lDQWdJR05zZFhOMFpYSmZZMjlzZFcxdWN5QTlJRVpCVEZORkxGeHVJQ0FnSUNBZ0lDQmpiMngxYlc1ZmRHbDBiR1VnUFNCY1hFbHVkR1Z5WlhOMFhGd3NYRzRnSUNBZ0lDQWdJSEp2ZDE5MGFYUnNaU0E5SUZ4Y1ZHRnlaMlYwWEZ3c1hHNGdJQ0FnSUNBZ0lHaGxZWFJ0WVhCZmJHVm5aVzVrWDNCaGNtRnRJRDBnYkdsemRDaGhkQ0E5SUdNb01Dd2dNU3dnTWlrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR0ZpWld4eklEMGdZeWhjWERCY1hDd2dYRnd4WEZ3c0lGeGNNbHhjS1NrcFhHNWNibHh1SXlNZ1IwOWNibVJwWm1ZdVVrNUJJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHUnBabVpmUnpFdVFUUTROUzV6Wld4bFkzUmxaREpmUnpFdVJYQnBMa0UwT0RWZmRuTmZSekV1UlhCcExrUk5VMDh1ZEhOMlhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzWDJkbGJtVmZhV1FzSUd4dlp6SkdiMnhrUTJoaGJtZGxMQ0J6YUhKcGJtdGxaRjlzYjJjeVJrTXNJSEJoWkdvc0lHVjRkR1Z5Ym1Gc1gyZGxibVZmYm1GdFpTbGNibVJwWm1ZdVVrNUJJRHd0SUdScFptWXVVazVCSUNVK0pTQmtjR3g1Y2pvNmJHVm1kRjlxYjJsdUtHZGxibVV1ZEdJc0lHSjVJRDBnWXloY1hHVnVjMlZ0WW14ZloyVnVaVjlwWkZ4Y0lEMGdYRnhsYm5ObGJXSnNYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpZ2hhWE11Ym1Fb1ZGTlRLU2xjYm1Gc2NHaGhJRHd0SURBdU1EVmNibVpqUTNWMGIyWm1JRHd0SURBdU5WeHVYRzVrYVdabUxsSk9RU0E4TFNCa2FXWm1MbEpPUVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FXWm1JRDBnWTJGelpWOTNhR1Z1S0hCaFpHb2dQQ0JoYkhCb1lTQW1JSE5vY21sdWEyVmtYMnh2WnpKR1F5QStJR1pqUTNWMGIyWm1JSDRnWEZ4VlVGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd1lXUnFJRHdnWVd4d2FHRWdKaUJ6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0F0Wm1ORGRYUnZabVlnZmlCY1hFUlBWMDVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdWRkpWUlNCK0lGeGNUazljWENrcFhHNWNibWRsYm1WTWFYTjBJRHd0SUNoa2FXWm1MbEpPUVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loa2FXWm1JRDA5SUZ4Y1JFOVhUbHhjS1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrWEc1SFR5QThMU0JsYm5KcFkyaEhUeWhuWlc1bElEMGdaMlZ1WlV4cGMzUXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hGeEZUbE5GVFVKTVhGd3NJRzl1ZENBOUlGeGNRbEJjWENsY2JrZFBMbkpsWVdSaFlteGxJRHd0SUhObGRGSmxZV1JoWW14bEtFZFBMQ0JQY21kRVlpQTlJRzl5Wnk1TmJTNWxaeTVrWWlsY2JuQnlhVzUwS0dSdmRIQnNiM1FvUjA4c0lITm9iM2REWVhSbFoyOXllU0E5SURFMUxDQjBhWFJzWlNBOUlGeGNYRndwSUNzZ1hHNGdJQ0FnSUNBZ0lITmpZV3hsWDJOdmJHOXlYMk52Ym5ScGJuVnZkWE1vYkdsdGFYUnpJRDBnWXlnd0xDQXdMakExS1N3Z2JHOTNJRDBnWEZ4eVpXUmNYQ3dnYUdsbmFDQTlJRnhjWW14aFkydGNYQ2twWEc1blpXNWxUR2x6ZENBOExTQW9aR2xtWmk1U1RrRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aR2xtWmlBOVBTQmNYRlZRWEZ3cEtTUmxibk5sYldKc1gyZGxibVZmYVdSY2JrZFBJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bFRHbHpkQ3dnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0tWeHVSMDh1Y21WaFpHRmliR1VnUEMwZ2MyVjBVbVZoWkdGaWJHVW9SMDhzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUtWeHVjSEpwYm5Rb1pHOTBjR3h2ZENoSFR5d2djMmh2ZDBOaGRHVm5iM0o1SUQwZ01UVXNJSFJwZEd4bElEMGdYRnhjWENrZ0t5QmNiaUFnSUNBZ0lDQWdjMk5oYkdWZlkyOXNiM0pmWTI5dWRHbHVkVzkxY3loc2FXMXBkSE1nUFNCaktEQXNJREF1TURVcExDQnNiM2NnUFNCY1hISmxaRnhjTENCb2FXZG9JRDBnWEZ4aWJHRmphMXhjS1NsY2JseHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgVFNTLCBWNilcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxjaHJcXCwgXFxUU1NcXCwgXFxlbnNlbWJsXFwpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuRXBpLkE0ODVfdnNfRzEuRXBpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmRpZmYuUk5BIDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bGVmdF9qb2luKGdlbmUudGIsIGJ5ID0gYyhcXGVuc2VtYmxfZ2VuZV9pZFxcID0gXFxlbnNlbWJsXFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoVFNTKSlcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuXG5kaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShkaWZmID0gY2FzZV93aGVuKHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmIH4gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYgfiBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFxcTk9cXCkpXG5cblxudGVtcCA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IFRTUyAtIDI1MDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBUU1MgKyAyNTAwKSAlPiVcbiAgZHBseXI6OnNlbGVjdChjaHIsIHN0YXJ0LCBlbmQsIGVuc2VtYmxfZ2VuZV9pZCwgZGlmZilcblxuXG5kb3duLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmYgPT0gXFxET1dOXFwpKVxudXAuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSBcXFVQXFwpKVxubm8uZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSBcXE5PXFwpKVxuYWxsLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxuXG5kYXRhIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoXFxIM0syN2FjX2VmZmllXFwsIFxcVFNTXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwLmdyLCBuby5nciwgZG93bi5ncixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLmdyKVxuXG5cbiMgVmlzdWFsaXphdGlvblxubGlicmFyeShjaXJjbGl6ZSlcblxuaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiVcbnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxucHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JVxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDIpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5IZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLFxuICAgICAgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4sXG4gICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzXG4gICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkge1xuICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal1cbiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsIFxcbi5zLlxcLCBzcHJpbnRmKFxcJS4yZVxcLCBwdmFsKSlcbiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSlcbiAgICAgICAgfSxcbiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0XG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIGNvbHVtbl90aXRsZSA9IFxcSW50ZXJlc3RcXCxcbiAgICAgICAgcm93X3RpdGxlID0gXFxUYXJnZXRcXCxcbiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGF0ID0gYygwLCAxLCAyKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKFxcMFxcLCBcXDFcXCwgXFwyXFwpKSlcblxuXG4jIyBHT1xuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS5FcGkuQTQ4NV92c19HMS5FcGkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZS50YiwgYnkgPSBjKFxcZW5zZW1ibF9nZW5lX2lkXFwgPSBcXGVuc2VtYmxcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShUU1MpKVxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5cbmRpZmYuUk5BIDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bXV0YXRlKGRpZmYgPSBjYXNlX3doZW4ocGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDID4gZmNDdXRvZmYgfiBcXFVQXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiB+IFxcRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gXFxOT1xcKSlcblxuZ2VuZUxpc3QgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmYgPT0gXFxET1dOXFwpKSRlbnNlbWJsX2dlbmVfaWRcbkdPIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR08ucmVhZGFibGUgPC0gc2V0UmVhZGFibGUoR08sIE9yZ0RiID0gb3JnLk1tLmVnLmRiKVxucHJpbnQoZG90cGxvdChHTywgc2hvd0NhdGVnb3J5ID0gMTUsIHRpdGxlID0gXFxcXCkgKyBcbiAgICAgICAgc2NhbGVfY29sb3JfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDAuMDUpLCBsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibGFja1xcKSlcbmdlbmVMaXN0IDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcVVBcXCkpJGVuc2VtYmxfZ2VuZV9pZFxuR08gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5HTy5yZWFkYWJsZSA8LSBzZXRSZWFkYWJsZShHTywgT3JnRGIgPSBvcmcuTW0uZWcuZGIpXG5wcmludChkb3RwbG90KEdPLCBzaG93Q2F0ZWdvcnkgPSAxNSwgdGl0bGUgPSBcXFxcKSArIFxuICAgICAgICBzY2FsZV9jb2xvcl9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMC4wNSksIGxvdyA9IFxccmVkXFwsIGhpZ2ggPSBcXGJsYWNrXFwpKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTUywgVjYpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyXFwsIFxcVFNTXFwsIFxcZW5zZW1ibFxcKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLkVwaS5BNDg1X3ZzX0cxLkVwaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5kaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6OmxlZnRfam9pbihnZW5lLnRiLCBieSA9IGMoXFxlbnNlbWJsX2dlbmVfaWRcXCA9IFxcZW5zZW1ibFxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKFRTUykpXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcblxuZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjptdXRhdGUoZGlmZiA9IGNhc2Vfd2hlbihwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPiBmY0N1dG9mZiB+IFxcVVBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmIH4gXFxET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBcXE5PXFwpKVxuXG5cbnRlbXAgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBUU1MgLSAyNTAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gVFNTICsgMjUwMCkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kLCBlbnNlbWJsX2dlbmVfaWQsIGRpZmYpXG5cblxuZG93bi5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcRE9XTlxcKSlcbnVwLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmYgPT0gXFxVUFxcKSlcbm5vLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmYgPT0gXFxOT1xcKSlcbmFsbC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcblxuZGF0YSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KFxcSDNLMjdhY19lZmZpZVxcLCBcXFRTU1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cC5nciwgbm8uZ3IsIGRvd24uZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbC5ncilcblxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAyKSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjb2x1bW5fdGl0bGUgPSBcXEludGVyZXN0XFwsXG4gICAgICAgIHJvd190aXRsZSA9IFxcVGFyZ2V0XFwsXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcKSkpXG5cblxuIyMgR09cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuRXBpLkE0ODVfdnNfRzEuRXBpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSlcbmRpZmYuUk5BIDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bGVmdF9qb2luKGdlbmUudGIsIGJ5ID0gYyhcXGVuc2VtYmxfZ2VuZV9pZFxcID0gXFxlbnNlbWJsXFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoVFNTKSlcbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuXG5kaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShkaWZmID0gY2FzZV93aGVuKHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmIH4gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYgfiBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFxcTk9cXCkpXG5cbmdlbmVMaXN0IDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09IFxcRE9XTlxcKSkkZW5zZW1ibF9nZW5lX2lkXG5HTyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbkdPLnJlYWRhYmxlIDwtIHNldFJlYWRhYmxlKEdPLCBPcmdEYiA9IG9yZy5NbS5lZy5kYilcbnByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IDE1LCB0aXRsZSA9IFxcXFwpICsgXG4gICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gXFxyZWRcXCwgaGlnaCA9IFxcYmxhY2tcXCkpXG5nZW5lTGlzdCA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSBcXFVQXFwpKSRlbnNlbWJsX2dlbmVfaWRcbkdPIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuR08ucmVhZGFibGUgPC0gc2V0UmVhZGFibGUoR08sIE9yZ0RiID0gb3JnLk1tLmVnLmRiKVxucHJpbnQoZG90cGxvdChHTywgc2hvd0NhdGVnb3J5ID0gMTUsIHRpdGxlID0gXFxcXCkgKyBcbiAgICAgICAgc2NhbGVfY29sb3JfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDAuMDUpLCBsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibGFja1xcKSlcblxuYGBgXG5gYGAifQ== -->

```r
```r
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V1, TSS, V6)
colnames(gene.tb) <- c(\chr\, \TSS\, \ensembl\)

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.Epi.A485_vs_G1.Epi.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
diff.RNA <- diff.RNA %>% dplyr::left_join(gene.tb, by = c(\ensembl_gene_id\ = \ensembl\)) %>%
  dplyr::filter(!is.na(TSS))
alpha <- 0.05
fcCutoff <- 0.5

diff.RNA <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                                        padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                                        TRUE ~ \NO\))


temp <- diff.RNA %>% dplyr::mutate(start = TSS - 2500,
                           end = TSS + 2500) %>%
  dplyr::select(chr, start, end, ensembl_gene_id, diff)


down.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \DOWN\))
up.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \UP\))
no.gr <- makeGRangesFromDataFrame(temp %>% dplyr::filter(diff == \NO\))
all.gr <- makeGRangesFromDataFrame(temp)

data <- runFisherExactCombinationTarget(\H3K27ac_effie\, \TSS\,
                                      up.gr, no.gr, down.gr,
                                      all.gr)


# Visualization
library(circlize)

heatmap_data <- data %>% dplyr::select(target, interest, oddsRatio) %>%
pivot_wider(names_from = interest, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, interest, pvalue) %>%
  pivot_wider(names_from = interest, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 2), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2), 
                                    labels = c(\0\, \1\, \2\)))


## GO
diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.Epi.A485_vs_G1.Epi.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
diff.RNA <- diff.RNA %>% dplyr::left_join(gene.tb, by = c(\ensembl_gene_id\ = \ensembl\)) %>%
  dplyr::filter(!is.na(TSS))
alpha <- 0.05
fcCutoff <- 0.5

diff.RNA <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                                        padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                                        TRUE ~ \NO\))

geneList <- (diff.RNA %>% dplyr::filter(diff == \DOWN\))$ensembl_gene_id
GO <- enrichGO(gene = geneList, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO.readable <- setReadable(GO, OrgDb = org.Mm.eg.db)
print(dotplot(GO, showCategory = 15, title = \\) + 
        scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))
geneList <- (diff.RNA %>% dplyr::filter(diff == \UP\))$ensembl_gene_id
GO <- enrichGO(gene = geneList, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
GO.readable <- setReadable(GO, OrgDb = org.Mm.eg.db)
print(dotplot(GO, showCategory = 15, title = \\) + 
        scale_color_continuous(limits = c(0, 0.05), low = \red\, high = \black\))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

### DEGs from RNA-seq
2.5kb from TSS, at least 1 bp overlap
#### 2i

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnYkc5aFpFeHZiM0JCYm01dlJHRjBZU2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYM0F0Y0dWZlpXNXpaVzFpYkV4cGMzUXVkSE4yWENJcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsbVprTjFkRzltWmlBOUlEQXVNaWxjYmx4dWFXUXVSekZUY0dWamFXWnBZMUJsY25RZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5SE1YWnpRWE41Ym1OZlJ6RlRjR1ZqYVdacFkxQmxjblF1WW1Wa2NHVmNJaWtwSkZZM1hHNXBaQzVCYzNsdVkxTndaV05wWm1salVHVnlkQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKamFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNCbExYQmxYMGN4ZG5OQmMzbHVZMTlCYzNsdVkxTndaV05wWm1salVHVnlkQzVpWldSd1pWd2lLU2trVmpkY2JtbGtMbUp2ZEdoUVpYSjBJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZSekYyYzBGemVXNWpYMkp2ZEdoUVpYSjBMbUpsWkhCbFhDSXBLU1JXTjF4dWFXUXVZbTkwYUZKbGRHRnBibVZrSUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZmNHVXRjR1ZmUnpGMmMwRnplVzVqWDJKdmRHaFNaWFJoYVc1bFpDNWlaV1J3WlZ3aUtTa2tWamRjYmx4dVhHNW5aVzVsVEdsemRDNUhNVk53WldOcFptbGpVR1Z5ZENBOExTQW9aMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dsa0lDVnBiaVVnYVdRdVJ6RlRjR1ZqYVdacFkxQmxjblFwSUNVK0pTQjFibTVsYzNRb1oyVnVaU2twSkdkbGJtVmNibWRsYm1WTWFYTjBMa0Z6ZVc1alUzQmxZMmxtYVdOUVpYSjBJRHd0SUNoblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9hV1FnSldsdUpTQnBaQzVCYzNsdVkxTndaV05wWm1salVHVnlkQ2tnSlQ0bElIVnVibVZ6ZENoblpXNWxLU2trWjJWdVpWeHVaMlZ1WlV4cGMzUXVZbTkwYUZCbGNuUWdQQzBnS0dkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHBaQ0FsYVc0bElHbGtMbUp2ZEdoUVpYSjBLU0FsUGlVZ2RXNXVaWE4wS0dkbGJtVXBLU1JuWlc1bFhHNW5aVzVsVEdsemRDNWliM1JvVW1WMFlXbHVaV1FnUEMwZ0tHZGxibVZCYm01dlJHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhwWkNBbGFXNGxJR2xrTG1KdmRHaFNaWFJoYVc1bFpDa2dKVDRsSUhWdWJtVnpkQ2huWlc1bEtTa2taMlZ1WlZ4dVhHNUhUeTVITVZOd1pXTnBabWxqVUdWeWRDNWtaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsVEdsemRDNUhNVk53WldOcFptbGpVR1Z5ZEN3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lLU2xjYmtkUExrRnplVzVqVTNCbFkybG1hV05RWlhJdVpHWWdQQzBnWVhNdVpHRjBZUzVtY21GdFpTaGxibkpwWTJoSFR5aG5aVzVsSUQwZ1oyVnVaVXhwYzNRdVFYTjVibU5UY0dWamFXWnBZMUJsY25Rc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWENKRlRsTkZUVUpNWENJc0lHOXVkQ0E5SUZ3aVFsQmNJaWtwWEc1SFR5NWliM1JvVUdWeWRDNWtaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsVEdsemRDNWliM1JvVUdWeWRDd2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY0lrVk9VMFZOUWt4Y0lpd2diMjUwSUQwZ1hDSkNVRndpS1NsY2JrZFBMbUp2ZEdoU1pYUmhhVzVsWkM1a1ppQThMU0JoY3k1a1lYUmhMbVp5WVcxbEtHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxUR2x6ZEM1aWIzUm9VbVYwWVdsdVpXUXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hDSkZUbE5GVFVKTVhDSXNJRzl1ZENBOUlGd2lRbEJjSWlrcFhHNWNibk4xWW5ObGRDNUhNVk53WldOcFptbGpVR1Z5ZENBOExTQkhUeTVITVZOd1pXTnBabWxqVUdWeWRDNWtaaUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hKUkN3Z1JHVnpZM0pwY0hScGIyNHNJRWRsYm1WU1lYUnBieXdnY0M1aFpHcDFjM1FwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dkeWIzVndJRDBnWENKSE1WTndaV05wWm1salVHVnlkRndpS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnSUNCbmNpQTlJSE5oY0hCc2VTaEhaVzVsVW1GMGFXOHNJR1oxYm1OMGFXOXVLSGdwSUh0Y2JpQWdJQ0FnSUNNZ1UzQnNhWFFnZEdobElITjBjbWx1WnlCaWVTQmNJaTljSWx4dUlDQWdJQ0FnY0dGeWRITWdQQzBnZFc1c2FYTjBLSE4wY25Od2JHbDBLSGdzSUZ3aUwxd2lLU2xjYmlBZ0lDQWdJQ01nUTI5dWRtVnlkQ0IwYnlCdWRXMWxjbWxqSUdGdVpDQndaWEptYjNKdElIUm9aU0JrYVhacGMybHZibHh1SUNBZ0lDQWdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3hYU2tnTHlCaGN5NXVkVzFsY21saktIQmhjblJ6V3pKZEtWeHVJQ0FnSUgwcFhHNGdJQ2tnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dSbGMyTW9aM0lwS1Z4dVhHNXpkV0p6WlhRdVFYTjVibU5UY0dWamFXWnBZMUJsY25RZ1BDMGdSMDh1UVhONWJtTlRjR1ZqYVdacFkxQmxjaTVrWmlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoSlJDd2dSR1Z6WTNKcGNIUnBiMjRzSUVkbGJtVlNZWFJwYnl3Z2NDNWhaR3AxYzNRcElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHZHliM1Z3SUQwZ1hDSkJjM2x1WTFOd1pXTnBabWxqVUdWeWRGd2lLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoY2JpQWdJQ0JuY2lBOUlITmhjSEJzZVNoSFpXNWxVbUYwYVc4c0lHWjFibU4wYVc5dUtIZ3BJSHRjYmlBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY0lpOWNJbHh1SUNBZ0lDQWdjR0Z5ZEhNZ1BDMGdkVzVzYVhOMEtITjBjbk53YkdsMEtIZ3NJRndpTDF3aUtTbGNiaUFnSUNBZ0lDTWdRMjl1ZG1WeWRDQjBieUJ1ZFcxbGNtbGpJR0Z1WkNCd1pYSm1iM0p0SUhSb1pTQmthWFpwYzJsdmJseHVJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUlDQWdJSDBwWEc0Z0lDa2dKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JsYzJNb1ozSXBLVnh1WEc1emRXSnpaWFF1WW05MGFGQmxjblFnUEMwZ1IwOHVZbTkwYUZCbGNuUXVaR1lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvU1VRc0lFUmxjMk55YVhCMGFXOXVMQ0JIWlc1bFVtRjBhVzhzSUhBdVlXUnFkWE4wS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUZ3aVltOTBhRkJsY25SY0lpa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lDQWdaM0lnUFNCellYQndiSGtvUjJWdVpWSmhkR2x2TENCbWRXNWpkR2x2YmloNEtTQjdYRzRnSUNBZ0lDQWpJRk53YkdsMElIUm9aU0J6ZEhKcGJtY2dZbmtnWENJdlhDSmNiaUFnSUNBZ0lIQmhjblJ6SUR3dElIVnViR2x6ZENoemRISnpjR3hwZENoNExDQmNJaTljSWlrcFhHNGdJQ0FnSUNBaklFTnZiblpsY25RZ2RHOGdiblZ0WlhKcFl5QmhibVFnY0dWeVptOXliU0IwYUdVZ1pHbDJhWE5wYjI1Y2JpQWdJQ0FnSUdGekxtNTFiV1Z5YVdNb2NHRnlkSE5iTVYwcElDOGdZWE11Ym5WdFpYSnBZeWh3WVhKMGMxc3lYU2xjYmlBZ0lDQjlLVnh1SUNBcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dkeUtTbGNibHh1YzNWaWMyVjBMbUp2ZEdoU1pYUmhhVzVsWkNBOExTQkhUeTVpYjNSb1VtVjBZV2x1WldRdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRndpWW05MGFGSmxkR0ZwYm1Wa1hDSXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQWdJR2R5SUQwZ2MyRndjR3g1S0VkbGJtVlNZWFJwYnl3Z1puVnVZM1JwYjI0b2VDa2dlMXh1SUNBZ0lDQWdJeUJUY0d4cGRDQjBhR1VnYzNSeWFXNW5JR0o1SUZ3aUwxd2lYRzRnSUNBZ0lDQndZWEowY3lBOExTQjFibXhwYzNRb2MzUnljM0JzYVhRb2VDd2dYQ0l2WENJcEtWeHVJQ0FnSUNBZ0l5QkRiMjUyWlhKMElIUnZJRzUxYldWeWFXTWdZVzVrSUhCbGNtWnZjbTBnZEdobElHUnBkbWx6YVc5dVhHNGdJQ0FnSUNCaGN5NXVkVzFsY21saktIQmhjblJ6V3pGZEtTQXZJR0Z6TG01MWJXVnlhV01vY0dGeWRITmJNbDBwWEc0Z0lDQWdmU2xjYmlBZ0tTQWxQaVVnWkhCc2VYSTZPbUZ5Y21GdVoyVW9aR1Z6WXlobmNpa3BYRzVjYm1SaGRHRWdQQzBnWW1sdVpGOXliM2R6S0dKcGJtUmZjbTkzY3loemRXSnpaWFF1UnpGVGNHVmphV1pwWTFCbGNuUXNJSE4xWW5ObGRDNWliM1JvVUdWeWRDa3NJSE4xWW5ObGRDNWliM1JvVW1WMFlXbHVaV1FwWEc1Y2JuQWdQQzBnWjJkd2JHOTBLSE4xWW5ObGRDNUhNVk53WldOcFptbGpVR1Z5ZEN3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlFUmxjMk55YVhCMGFXOXVMQ0JqYjJ4dmNpQTlJSEF1WVdScWRYTjBMQ0J6YVhwbElEMGdaM0lwS1NBcklGeHVJQ0JuWlc5dFgzQnZhVzUwS0NrZ0t5QjBhR1Z0WlY5aWR5Z3BJQ3RjYmlBZ2MyTmhiR1ZmWTI5c2IzSmZaM0poWkdsbGJuUW9iRzkzSUQwZ1hDSnlaV1JjSWl3Z2FHbG5hQ0E5SUZ3aVlteDFaVndpTENCc2FXMXBkSE1nUFNCaktEQXNJREF1TURVcEtTQXJYRzRnSUhOallXeGxYM05wZW1WZlkyOXVkR2x1ZFc5MWN5aHlZVzVuWlNBOUlHTW9NQ3dnTXlrcElDdGNiaUFnYkdGaWN5aDRJRDBnVGxWTVRDd2dlU0E5SUU1VlRFd3BJQ3RjYmlBZ2RHaGxiV1VvWVhocGN5NTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTJLU3dnSUNNZ1UyVjBJR0Y0YVhNZ2RHVjRkQ0J6YVhwbFhHNGdJQ0FnSUNBZ0lHRjRhWE11ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb2MybDZaU0E5SURZcExDQWpJRk5sZENCaGVHbHpJSFJwZEd4bElITnBlbVVnS0dsbUlHNXZkQ0J5WlcxdmRtVmtLVnh1SUNBZ0lDQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOaWtzSUNNZ1UyVjBJR3hsWjJWdVpDQjBaWGgwSUhOcGVtVmNiaUFnSUNBZ0lDQWdiR1ZuWlc1a0xuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQTJLU2tnWEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1wZV9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yKVxuXG5pZC5HMVNwZWNpZmljUGVydCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19HMVNwZWNpZmljUGVydC5iZWRwZVxcKSkkVjdcbmlkLkFzeW5jU3BlY2lmaWNQZXJ0IDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX0FzeW5jU3BlY2lmaWNQZXJ0LmJlZHBlXFwpKSRWN1xuaWQuYm90aFBlcnQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9HMXZzQXN5bmNfYm90aFBlcnQuYmVkcGVcXCkpJFY3XG5pZC5ib3RoUmV0YWluZWQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9HMXZzQXN5bmNfYm90aFJldGFpbmVkLmJlZHBlXFwpKSRWN1xuXG5cbmdlbmVMaXN0LkcxU3BlY2lmaWNQZXJ0IDwtIChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBpZC5HMVNwZWNpZmljUGVydCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZVxuZ2VuZUxpc3QuQXN5bmNTcGVjaWZpY1BlcnQgPC0gKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGlkLkFzeW5jU3BlY2lmaWNQZXJ0KSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lXG5nZW5lTGlzdC5ib3RoUGVydCA8LSAoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgaWQuYm90aFBlcnQpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmVcbmdlbmVMaXN0LmJvdGhSZXRhaW5lZCA8LSAoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgaWQuYm90aFJldGFpbmVkKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lXG5cbkdPLkcxU3BlY2lmaWNQZXJ0LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LkcxU3BlY2lmaWNQZXJ0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuR08uQXN5bmNTcGVjaWZpY1Blci5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5Bc3luY1NwZWNpZmljUGVydCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbkdPLmJvdGhQZXJ0LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmJvdGhQZXJ0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpKVxuR08uYm90aFJldGFpbmVkLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmJvdGhSZXRhaW5lZCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcblxuc3Vic2V0LkcxU3BlY2lmaWNQZXJ0IDwtIEdPLkcxU3BlY2lmaWNQZXJ0LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEcxU3BlY2lmaWNQZXJ0XFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4gICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4gICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4gICAgfSlcbiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG5cbnN1YnNldC5Bc3luY1NwZWNpZmljUGVydCA8LSBHTy5Bc3luY1NwZWNpZmljUGVyLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBcXEFzeW5jU3BlY2lmaWNQZXJ0XFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4gICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4gICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4gICAgfSlcbiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG5cbnN1YnNldC5ib3RoUGVydCA8LSBHTy5ib3RoUGVydC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxib3RoUGVydFxcKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHtcbiAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiAgICAgICMgQ29udmVydCB0byBudW1lcmljIGFuZCBwZXJmb3JtIHRoZSBkaXZpc2lvblxuICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuICAgIH0pXG4gICkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZ3IpKVxuXG5zdWJzZXQuYm90aFJldGFpbmVkIDwtIEdPLmJvdGhSZXRhaW5lZC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxib3RoUmV0YWluZWRcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcblxuZGF0YSA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKHN1YnNldC5HMVNwZWNpZmljUGVydCwgc3Vic2V0LmJvdGhQZXJ0KSwgc3Vic2V0LmJvdGhSZXRhaW5lZClcblxucCA8LSBnZ3Bsb3Qoc3Vic2V0LkcxU3BlY2lmaWNQZXJ0LCBhZXMoeCA9IGdyb3VwLCB5ID0gRGVzY3JpcHRpb24sIGNvbG9yID0gcC5hZGp1c3QsIHNpemUgPSBncikpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgK1xuICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSBcXHJlZFxcLCBoaWdoID0gXFxibHVlXFwsIGxpbWl0cyA9IGMoMCwgMC4wNSkpICtcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLCAzKSkgK1xuICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgK1xuICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemVcbiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGF4aXMgdGl0bGUgc2l6ZSAoaWYgbm90IHJlbW92ZWQpXG4gICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZVxuICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSBcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-pe_ensemblList.tsv\)),
                                      diffCutoff = 0.2)

id.G1SpecificPert <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_G1SpecificPert.bedpe\))$V7
id.AsyncSpecificPert <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_AsyncSpecificPert.bedpe\))$V7
id.bothPert <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_bothPert.bedpe\))$V7
id.bothRetained <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_bothRetained.bedpe\))$V7


geneList.G1SpecificPert <- (geneAnnoData %>% dplyr::filter(id %in% id.G1SpecificPert) %>% unnest(gene))$gene
geneList.AsyncSpecificPert <- (geneAnnoData %>% dplyr::filter(id %in% id.AsyncSpecificPert) %>% unnest(gene))$gene
geneList.bothPert <- (geneAnnoData %>% dplyr::filter(id %in% id.bothPert) %>% unnest(gene))$gene
geneList.bothRetained <- (geneAnnoData %>% dplyr::filter(id %in% id.bothRetained) %>% unnest(gene))$gene

GO.G1SpecificPert.df <- as.data.frame(enrichGO(gene = geneList.G1SpecificPert, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO.AsyncSpecificPer.df <- as.data.frame(enrichGO(gene = geneList.AsyncSpecificPert, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO.bothPert.df <- as.data.frame(enrichGO(gene = geneList.bothPert, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO.bothRetained.df <- as.data.frame(enrichGO(gene = geneList.bothRetained, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))

subset.G1SpecificPert <- GO.G1SpecificPert.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \G1SpecificPert\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))

subset.AsyncSpecificPert <- GO.AsyncSpecificPer.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \AsyncSpecificPert\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))

subset.bothPert <- GO.bothPert.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \bothPert\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))

subset.bothRetained <- GO.bothRetained.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \bothRetained\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))

data <- bind_rows(bind_rows(subset.G1SpecificPert, subset.bothPert), subset.bothRetained)

p <- ggplot(subset.G1SpecificPert, aes(x = group, y = Description, color = p.adjust, size = gr)) + 
  geom_point() + theme_bw() +
  scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
  scale_size_continuous(range = c(0, 3)) +
  labs(x = NULL, y = NULL) +
  theme(axis.text = element_text(size = 6),  # Set axis text size
        axis.title = element_text(size = 6), # Set axis title size (if not removed)
        legend.text = element_text(size = 6), # Set legend text size
        legend.title = element_text(size = 6)) 



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gzQXRjR1ZmWlc1elpXMWliRXhwYzNRdWRITjJYRndwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2xtWmtOMWRHOW1aaUE5SURBdU1pbGNibHh1YVdRdVJ6RlRjR1ZqYVdacFkxQmxjblFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlITVhaelFYTjVibU5mUnpGVGNHVmphV1pwWTFCbGNuUXVZbVZrY0dWY1hDa3BKRlkzWEc1cFpDNUJjM2x1WTFOd1pXTnBabWxqVUdWeWRDQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbFgwY3hkbk5CYzNsdVkxOUJjM2x1WTFOd1pXTnBabWxqVUdWeWRDNWlaV1J3WlZ4Y0tTa2tWamRjYm1sa0xtSnZkR2hRWlhKMElEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjR1V0Y0dWZlJ6RjJjMEZ6ZVc1algySnZkR2hRWlhKMExtSmxaSEJsWEZ3cEtTUldOMXh1YVdRdVltOTBhRkpsZEdGcGJtVmtJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZSekYyYzBGemVXNWpYMkp2ZEdoU1pYUmhhVzVsWkM1aVpXUndaVnhjS1Nra1ZqZGNibHh1WEc1blpXNWxUR2x6ZEM1SE1WTndaV05wWm1salVHVnlkQ0E4TFNBb1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2xrSUNWcGJpVWdhV1F1UnpGVGNHVmphV1pwWTFCbGNuUXBJQ1UrSlNCMWJtNWxjM1FvWjJWdVpTa3BKR2RsYm1WY2JtZGxibVZNYVhOMExrRnplVzVqVTNCbFkybG1hV05RWlhKMElEd3RJQ2huWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2FXUWdKV2x1SlNCcFpDNUJjM2x1WTFOd1pXTnBabWxqVUdWeWRDa2dKVDRsSUhWdWJtVnpkQ2huWlc1bEtTa2taMlZ1WlZ4dVoyVnVaVXhwYzNRdVltOTBhRkJsY25RZ1BDMGdLR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2locFpDQWxhVzRsSUdsa0xtSnZkR2hRWlhKMEtTQWxQaVVnZFc1dVpYTjBLR2RsYm1VcEtTUm5aVzVsWEc1blpXNWxUR2x6ZEM1aWIzUm9VbVYwWVdsdVpXUWdQQzBnS0dkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHBaQ0FsYVc0bElHbGtMbUp2ZEdoU1pYUmhhVzVsWkNrZ0pUNGxJSFZ1Ym1WemRDaG5aVzVsS1Nra1oyVnVaVnh1WEc1SFR5NUhNVk53WldOcFptbGpVR1Z5ZEM1a1ppQThMU0JoY3k1a1lYUmhMbVp5WVcxbEtHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxUR2x6ZEM1SE1WTndaV05wWm1salVHVnlkQ3dnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0tTbGNia2RQTGtGemVXNWpVM0JsWTJsbWFXTlFaWEl1WkdZZ1BDMGdZWE11WkdGMFlTNW1jbUZ0WlNobGJuSnBZMmhIVHloblpXNWxJRDBnWjJWdVpVeHBjM1F1UVhONWJtTlRjR1ZqYVdacFkxQmxjblFzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYRnhGVGxORlRVSk1YRndzSUc5dWRDQTlJRnhjUWxCY1hDa3BYRzVIVHk1aWIzUm9VR1Z5ZEM1a1ppQThMU0JoY3k1a1lYUmhMbVp5WVcxbEtHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxUR2x6ZEM1aWIzUm9VR1Z5ZEN3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjWEVWT1UwVk5Ra3hjWEN3Z2IyNTBJRDBnWEZ4Q1VGeGNLU2xjYmtkUExtSnZkR2hTWlhSaGFXNWxaQzVrWmlBOExTQmhjeTVrWVhSaExtWnlZVzFsS0dWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bFRHbHpkQzVpYjNSb1VtVjBZV2x1WldRc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWEZ4RlRsTkZUVUpNWEZ3c0lHOXVkQ0E5SUZ4Y1FsQmNYQ2twWEc1Y2JuTjFZbk5sZEM1SE1WTndaV05wWm1salVHVnlkQ0E4TFNCSFR5NUhNVk53WldOcFptbGpVR1Z5ZEM1a1ppQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaEpSQ3dnUkdWelkzSnBjSFJwYjI0c0lFZGxibVZTWVhScGJ5d2djQzVoWkdwMWMzUXBJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdYRnhITVZOd1pXTnBabWxqVUdWeWRGeGNLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoY2JpQWdJQ0JuY2lBOUlITmhjSEJzZVNoSFpXNWxVbUYwYVc4c0lHWjFibU4wYVc5dUtIZ3BJSHRjYmlBZ0lDQWdJQ01nVTNCc2FYUWdkR2hsSUhOMGNtbHVaeUJpZVNCY1hDOWNYRnh1SUNBZ0lDQWdjR0Z5ZEhNZ1BDMGdkVzVzYVhOMEtITjBjbk53YkdsMEtIZ3NJRnhjTDF4Y0tTbGNiaUFnSUNBZ0lDTWdRMjl1ZG1WeWRDQjBieUJ1ZFcxbGNtbGpJR0Z1WkNCd1pYSm1iM0p0SUhSb1pTQmthWFpwYzJsdmJseHVJQ0FnSUNBZ1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeFhTa2dMeUJoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekpkS1Z4dUlDQWdJSDBwWEc0Z0lDa2dKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JsYzJNb1ozSXBLVnh1WEc1emRXSnpaWFF1UVhONWJtTlRjR1ZqYVdacFkxQmxjblFnUEMwZ1IwOHVRWE41Ym1OVGNHVmphV1pwWTFCbGNpNWtaaUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hKUkN3Z1JHVnpZM0pwY0hScGIyNHNJRWRsYm1WU1lYUnBieXdnY0M1aFpHcDFjM1FwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dkeWIzVndJRDBnWEZ4QmMzbHVZMU53WldOcFptbGpVR1Z5ZEZ4Y0tTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hjYmlBZ0lDQm5jaUE5SUhOaGNIQnNlU2hIWlc1bFVtRjBhVzhzSUdaMWJtTjBhVzl1S0hncElIdGNiaUFnSUNBZ0lDTWdVM0JzYVhRZ2RHaGxJSE4wY21sdVp5QmllU0JjWEM5Y1hGeHVJQ0FnSUNBZ2NHRnlkSE1nUEMwZ2RXNXNhWE4wS0hOMGNuTndiR2wwS0hnc0lGeGNMMXhjS1NsY2JpQWdJQ0FnSUNNZ1EyOXVkbVZ5ZENCMGJ5QnVkVzFsY21saklHRnVaQ0J3WlhKbWIzSnRJSFJvWlNCa2FYWnBjMmx2Ymx4dUlDQWdJQ0FnWVhNdWJuVnRaWEpwWXlod1lYSjBjMXN4WFNrZ0x5QmhjeTV1ZFcxbGNtbGpLSEJoY25Seld6SmRLVnh1SUNBZ0lIMHBYRzRnSUNrZ0pUNGxJR1J3YkhseU9qcGhjbkpoYm1kbEtHUmxjMk1vWjNJcEtWeHVYRzV6ZFdKelpYUXVZbTkwYUZCbGNuUWdQQzBnUjA4dVltOTBhRkJsY25RdVpHWWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9TVVFzSUVSbGMyTnlhWEIwYVc5dUxDQkhaVzVsVW1GMGFXOHNJSEF1WVdScWRYTjBLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJRnhjWW05MGFGQmxjblJjWENrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9YRzRnSUNBZ1ozSWdQU0J6WVhCd2JIa29SMlZ1WlZKaGRHbHZMQ0JtZFc1amRHbHZiaWg0S1NCN1hHNGdJQ0FnSUNBaklGTndiR2wwSUhSb1pTQnpkSEpwYm1jZ1lua2dYRnd2WEZ4Y2JpQWdJQ0FnSUhCaGNuUnpJRHd0SUhWdWJHbHpkQ2h6ZEhKemNHeHBkQ2g0TENCY1hDOWNYQ2twWEc0Z0lDQWdJQ0FqSUVOdmJuWmxjblFnZEc4Z2JuVnRaWEpwWXlCaGJtUWdjR1Z5Wm05eWJTQjBhR1VnWkdsMmFYTnBiMjVjYmlBZ0lDQWdJR0Z6TG01MWJXVnlhV01vY0dGeWRITmJNVjBwSUM4Z1lYTXViblZ0WlhKcFl5aHdZWEowYzFzeVhTbGNiaUFnSUNCOUtWeHVJQ0FwSUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pYTmpLR2R5S1NsY2JseHVjM1ZpYzJWMExtSnZkR2hTWlhSaGFXNWxaQ0E4TFNCSFR5NWliM1JvVW1WMFlXbHVaV1F1WkdZZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1NVUXNJRVJsYzJOeWFYQjBhVzl1TENCSFpXNWxVbUYwYVc4c0lIQXVZV1JxZFhOMEtTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlGeGNZbTkwYUZKbGRHRnBibVZrWEZ3cElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNBZ0lHZHlJRDBnYzJGd2NHeDVLRWRsYm1WU1lYUnBieXdnWm5WdVkzUnBiMjRvZUNrZ2UxeHVJQ0FnSUNBZ0l5QlRjR3hwZENCMGFHVWdjM1J5YVc1bklHSjVJRnhjTDF4Y1hHNGdJQ0FnSUNCd1lYSjBjeUE4TFNCMWJteHBjM1FvYzNSeWMzQnNhWFFvZUN3Z1hGd3ZYRndwS1Z4dUlDQWdJQ0FnSXlCRGIyNTJaWEowSUhSdklHNTFiV1Z5YVdNZ1lXNWtJSEJsY21admNtMGdkR2hsSUdScGRtbHphVzl1WEc0Z0lDQWdJQ0JoY3k1dWRXMWxjbWxqS0hCaGNuUnpXekZkS1NBdklHRnpMbTUxYldWeWFXTW9jR0Z5ZEhOYk1sMHBYRzRnSUNBZ2ZTbGNiaUFnS1NBbFBpVWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pHVnpZeWhuY2lrcFhHNWNibVJoZEdFZ1BDMGdZbWx1WkY5eWIzZHpLR0pwYm1SZmNtOTNjeWh6ZFdKelpYUXVSekZUY0dWamFXWnBZMUJsY25Rc0lITjFZbk5sZEM1aWIzUm9VR1Z5ZENrc0lITjFZbk5sZEM1aWIzUm9VbVYwWVdsdVpXUXBYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtITjFZbk5sZEM1SE1WTndaV05wWm1salVHVnlkQ3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUVSbGMyTnlhWEIwYVc5dUxDQmpiMnh2Y2lBOUlIQXVZV1JxZFhOMExDQnphWHBsSUQwZ1ozSXBLU0FySUZ4dUlDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCMGFHVnRaVjlpZHlncElDdGNiaUFnYzJOaGJHVmZZMjlzYjNKZlozSmhaR2xsYm5Rb2JHOTNJRDBnWEZ4eVpXUmNYQ3dnYUdsbmFDQTlJRnhjWW14MVpWeGNMQ0JzYVcxcGRITWdQU0JqS0RBc0lEQXVNRFVwS1NBclhHNGdJSE5qWVd4bFgzTnBlbVZmWTI5dWRHbHVkVzkxY3loeVlXNW5aU0E5SUdNb01Dd2dNeWtwSUN0Y2JpQWdiR0ZpY3loNElEMGdUbFZNVEN3Z2VTQTlJRTVWVEV3cElDdGNiaUFnZEdobGJXVW9ZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBMktTd2dJQ01nVTJWMElHRjRhWE1nZEdWNGRDQnphWHBsWEc0Z0lDQWdJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJRFlwTENBaklGTmxkQ0JoZUdseklIUnBkR3hsSUhOcGVtVWdLR2xtSUc1dmRDQnlaVzF2ZG1Wa0tWeHVJQ0FnSUNBZ0lDQnNaV2RsYm1RdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ05pa3NJQ01nVTJWMElHeGxaMlZ1WkNCMFpYaDBJSE5wZW1WY2JpQWdJQ0FnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBMktTa2dYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3AtcGVfZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMilcblxuaWQuRzFTcGVjaWZpY1BlcnQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9HMXZzQXN5bmNfRzFTcGVjaWZpY1BlcnQuYmVkcGVcXCkpJFY3XG5pZC5Bc3luY1NwZWNpZmljUGVydCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19Bc3luY1NwZWNpZmljUGVydC5iZWRwZVxcKSkkVjdcbmlkLmJvdGhQZXJ0IDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX2JvdGhQZXJ0LmJlZHBlXFwpKSRWN1xuaWQuYm90aFJldGFpbmVkIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX2JvdGhSZXRhaW5lZC5iZWRwZVxcKSkkVjdcblxuXG5nZW5lTGlzdC5HMVNwZWNpZmljUGVydCA8LSAoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgaWQuRzFTcGVjaWZpY1BlcnQpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmVcbmdlbmVMaXN0LkFzeW5jU3BlY2lmaWNQZXJ0IDwtIChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBpZC5Bc3luY1NwZWNpZmljUGVydCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZVxuZ2VuZUxpc3QuYm90aFBlcnQgPC0gKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGlkLmJvdGhQZXJ0KSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lXG5nZW5lTGlzdC5ib3RoUmV0YWluZWQgPC0gKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGlkLmJvdGhSZXRhaW5lZCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZVxuXG5HTy5HMVNwZWNpZmljUGVydC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5HMVNwZWNpZmljUGVydCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbkdPLkFzeW5jU3BlY2lmaWNQZXIuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuQXN5bmNTcGVjaWZpY1BlcnQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG5HTy5ib3RoUGVydC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ib3RoUGVydCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbkdPLmJvdGhSZXRhaW5lZC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ib3RoUmV0YWluZWQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG5cbnN1YnNldC5HMVNwZWNpZmljUGVydCA8LSBHTy5HMVNwZWNpZmljUGVydC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHMVNwZWNpZmljUGVydFxcKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHtcbiAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiAgICAgICMgQ29udmVydCB0byBudW1lcmljIGFuZCBwZXJmb3JtIHRoZSBkaXZpc2lvblxuICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuICAgIH0pXG4gICkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZ3IpKVxuXG5zdWJzZXQuQXN5bmNTcGVjaWZpY1BlcnQgPC0gR08uQXN5bmNTcGVjaWZpY1Blci5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxBc3luY1NwZWNpZmljUGVydFxcKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHtcbiAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiAgICAgICMgQ29udmVydCB0byBudW1lcmljIGFuZCBwZXJmb3JtIHRoZSBkaXZpc2lvblxuICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuICAgIH0pXG4gICkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZ3IpKVxuXG5zdWJzZXQuYm90aFBlcnQgPC0gR08uYm90aFBlcnQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcYm90aFBlcnRcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcblxuc3Vic2V0LmJvdGhSZXRhaW5lZCA8LSBHTy5ib3RoUmV0YWluZWQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcYm90aFJldGFpbmVkXFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4gICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4gICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4gICAgfSlcbiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG5cbmRhdGEgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQuRzFTcGVjaWZpY1BlcnQsIHN1YnNldC5ib3RoUGVydCksIHN1YnNldC5ib3RoUmV0YWluZWQpXG5cbnAgPC0gZ2dwbG90KHN1YnNldC5HMVNwZWNpZmljUGVydCwgYWVzKHggPSBncm91cCwgeSA9IERlc2NyaXB0aW9uLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICtcbiAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gXFxyZWRcXCwgaGlnaCA9IFxcYmx1ZVxcLCBsaW1pdHMgPSBjKDAsIDAuMDUpKSArXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICtcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgICMgU2V0IGF4aXMgdGV4dCBzaXplXG4gICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemVcbiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkgXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3AtcGVfZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMilcblxuaWQuRzFTcGVjaWZpY1BlcnQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9HMXZzQXN5bmNfRzFTcGVjaWZpY1BlcnQuYmVkcGVcXCkpJFY3XG5pZC5Bc3luY1NwZWNpZmljUGVydCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19Bc3luY1NwZWNpZmljUGVydC5iZWRwZVxcKSkkVjdcbmlkLmJvdGhQZXJ0IDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX2JvdGhQZXJ0LmJlZHBlXFwpKSRWN1xuaWQuYm90aFJldGFpbmVkIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX2JvdGhSZXRhaW5lZC5iZWRwZVxcKSkkVjdcblxuXG5nZW5lTGlzdC5HMVNwZWNpZmljUGVydCA8LSAoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgaWQuRzFTcGVjaWZpY1BlcnQpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmVcbmdlbmVMaXN0LkFzeW5jU3BlY2lmaWNQZXJ0IDwtIChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBpZC5Bc3luY1NwZWNpZmljUGVydCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZVxuZ2VuZUxpc3QuYm90aFBlcnQgPC0gKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGlkLmJvdGhQZXJ0KSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lXG5nZW5lTGlzdC5ib3RoUmV0YWluZWQgPC0gKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGlkLmJvdGhSZXRhaW5lZCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZVxuXG5HTy5HMVNwZWNpZmljUGVydC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5HMVNwZWNpZmljUGVydCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbkdPLkFzeW5jU3BlY2lmaWNQZXIuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuQXN5bmNTcGVjaWZpY1BlcnQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG5HTy5ib3RoUGVydC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ib3RoUGVydCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKSlcbkdPLmJvdGhSZXRhaW5lZC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ib3RoUmV0YWluZWQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXCkpXG5cbnN1YnNldC5HMVNwZWNpZmljUGVydCA8LSBHTy5HMVNwZWNpZmljUGVydC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxHMVNwZWNpZmljUGVydFxcKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHtcbiAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiAgICAgICMgQ29udmVydCB0byBudW1lcmljIGFuZCBwZXJmb3JtIHRoZSBkaXZpc2lvblxuICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuICAgIH0pXG4gICkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZ3IpKVxuXG5zdWJzZXQuQXN5bmNTcGVjaWZpY1BlcnQgPC0gR08uQXN5bmNTcGVjaWZpY1Blci5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gXFxBc3luY1NwZWNpZmljUGVydFxcKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHtcbiAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSBcXC9cXFxuICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsIFxcL1xcKSlcbiAgICAgICMgQ29udmVydCB0byBudW1lcmljIGFuZCBwZXJmb3JtIHRoZSBkaXZpc2lvblxuICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKVxuICAgIH0pXG4gICkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZ3IpKVxuXG5zdWJzZXQuYm90aFBlcnQgPC0gR08uYm90aFBlcnQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcYm90aFBlcnRcXCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7XG4gICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgXFwvXFxcbiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCBcXC9cXCkpXG4gICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb25cbiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSlcbiAgICB9KVxuICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSlcblxuc3Vic2V0LmJvdGhSZXRhaW5lZCA8LSBHTy5ib3RoUmV0YWluZWQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IFxcYm90aFJldGFpbmVkXFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkge1xuICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5IFxcL1xcXG4gICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgXFwvXFwpKVxuICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uXG4gICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pXG4gICAgfSlcbiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpXG5cbmRhdGEgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQuRzFTcGVjaWZpY1BlcnQsIHN1YnNldC5ib3RoUGVydCksIHN1YnNldC5ib3RoUmV0YWluZWQpXG5cbnAgPC0gZ2dwbG90KHN1YnNldC5HMVNwZWNpZmljUGVydCwgYWVzKHggPSBncm91cCwgeSA9IERlc2NyaXB0aW9uLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICtcbiAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gXFxyZWRcXCwgaGlnaCA9IFxcYmx1ZVxcLCBsaW1pdHMgPSBjKDAsIDAuMDUpKSArXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICtcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICtcbiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgICMgU2V0IGF4aXMgdGV4dCBzaXplXG4gICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKVxuICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemVcbiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkgXG5cbmBgYFxuYGBgIn0= -->

```r
```r
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-pe_ensemblList.tsv\)),
                                      diffCutoff = 0.2)

id.G1SpecificPert <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_G1SpecificPert.bedpe\))$V7
id.AsyncSpecificPert <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_AsyncSpecificPert.bedpe\))$V7
id.bothPert <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_bothPert.bedpe\))$V7
id.bothRetained <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_G1vsAsync_bothRetained.bedpe\))$V7


geneList.G1SpecificPert <- (geneAnnoData %>% dplyr::filter(id %in% id.G1SpecificPert) %>% unnest(gene))$gene
geneList.AsyncSpecificPert <- (geneAnnoData %>% dplyr::filter(id %in% id.AsyncSpecificPert) %>% unnest(gene))$gene
geneList.bothPert <- (geneAnnoData %>% dplyr::filter(id %in% id.bothPert) %>% unnest(gene))$gene
geneList.bothRetained <- (geneAnnoData %>% dplyr::filter(id %in% id.bothRetained) %>% unnest(gene))$gene

GO.G1SpecificPert.df <- as.data.frame(enrichGO(gene = geneList.G1SpecificPert, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO.AsyncSpecificPer.df <- as.data.frame(enrichGO(gene = geneList.AsyncSpecificPert, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO.bothPert.df <- as.data.frame(enrichGO(gene = geneList.bothPert, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))
GO.bothRetained.df <- as.data.frame(enrichGO(gene = geneList.bothRetained, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\))

subset.G1SpecificPert <- GO.G1SpecificPert.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \G1SpecificPert\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))

subset.AsyncSpecificPert <- GO.AsyncSpecificPer.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \AsyncSpecificPert\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))

subset.bothPert <- GO.bothPert.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \bothPert\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))

subset.bothRetained <- GO.bothRetained.df %>% dplyr::select(ID, Description, GeneRatio, p.adjust) %>% dplyr::mutate(group = \bothRetained\) %>%
  dplyr::mutate(
    gr = sapply(GeneRatio, function(x) {
      # Split the string by \/\
      parts <- unlist(strsplit(x, \/\))
      # Convert to numeric and perform the division
      as.numeric(parts[1]) / as.numeric(parts[2])
    })
  ) %>% dplyr::arrange(desc(gr))

data <- bind_rows(bind_rows(subset.G1SpecificPert, subset.bothPert), subset.bothRetained)

p <- ggplot(subset.G1SpecificPert, aes(x = group, y = Description, color = p.adjust, size = gr)) + 
  geom_point() + theme_bw() +
  scale_color_gradient(low = \red\, high = \blue\, limits = c(0, 0.05)) +
  scale_size_continuous(range = c(0, 3)) +
  labs(x = NULL, y = NULL) +
  theme(axis.text = element_text(size = 6),  # Set axis text size
        axis.title = element_text(size = 6), # Set axis title size (if not removed)
        legend.text = element_text(size = 6), # Set legend text size
        legend.title = element_text(size = 6)) 

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Epi

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnYkc5aFpFeHZiM0JCYm01dlJHRjBZU2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYM0F0Y0dWZlpXNXpaVzFpYkV4cGMzUXVkSE4yWENJcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsbVprTjFkRzltWmlBOUlEQXVNaWxjYmx4dVoyVnVaVXhwYzNRdWRYQk1iMjl3SUR3dElIVnVhWEYxWlNnb1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSFZ3Wkc5M2JsOWtWRUZIWDBSTlUwOGdQVDBnWENKVlVGd2lLU0FsUGlVZ2RXNXVaWE4wS0dkbGJtVXBLU1JuWlc1bEtWeHVaMlZ1WlV4cGMzUXVibTlNYjI5d0lEd3RJSFZ1YVhGMVpTZ29aMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hWd1pHOTNibDlrVkVGSFgwUk5VMDhnUFQwZ1hDSk9UMXdpS1NBbFBpVWdkVzV1WlhOMEtHZGxibVVwS1NSblpXNWxLVnh1WjJWdVpVeHBjM1F1Wkc5M2JreHZiM0FnUEMwZ2RXNXBjWFZsS0NoblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9kWEJrYjNkdVgyUlVRVWRmUkUxVFR5QTlQU0JjSWtSUFYwNWNJaWtnSlQ0bElIVnVibVZ6ZENoblpXNWxLU2trWjJWdVpTbGNibHh1WEc1Y2JpTWdRMGhGUTB0SlRrY2dTRTlYSUUxQlRsa2dSMFZPUlZNZ1QxWkZVa3hCVUNCQlRVOU9SeUJWVUM5T1R5OUVUMWRPWEc1elpYUnpYMnhwYzNRZ1BDMGdiR2x6ZENoMWNDQTlJR2RsYm1WTWFYTjBMblZ3VEc5dmNDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzV2SUQwZ1oyVnVaVXhwYzNRdWJtOU1iMjl3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHOTNiaUE5SUdkbGJtVk1hWE4wTG1SdmQyNU1iMjl3S1Z4dVhHNGpJRU55WldGMFpTQjBhR1VnUlhWc1pYSWdjR3h2ZEZ4dVpYVnNaWEpmWm1sMElEd3RJR1YxYkdWeUtITmxkSE5mYkdsemRDbGNibkJzYjNRb1pYVnNaWEpmWm1sMExGeHVJQ0FnSUNCc1lXSmxiSE1nUFNCVVVsVkZMQ0FnSXlCRWFYTndiR0Y1SUhObGRDQnNZV0psYkhOY2JpQWdJQ0FnWm1sc2JITWdQU0JVVWxWRkxDQWdJQ01nUTI5c2IzSWdabWxzYkNCMGFHVWdjbVZuYVc5dWMxeHVJQ0FnSUNCeGRXRnVkR2wwYVdWeklEMGdWRkpWUlNsY2JseHVYRzRqSUVkUFhHNUhUeTUxY0NBOExTQmxibkpwWTJoSFR5aG5aVzVsSUQwZ1oyVnVaVXhwYzNRdWRYQk1iMjl3TENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRndpUlU1VFJVMUNURndpTENCdmJuUWdQU0JjSWtKUVhDSXBYRzVrYjNSd2JHOTBLRWRQTG5Wd0tWeHVSMDh1Ym04Z1BDMGdaVzV5YVdOb1IwOG9aMlZ1WlNBOUlHZGxibVZNYVhOMExtNXZURzl2Y0N3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lLVnh1Wkc5MGNHeHZkQ2hIVHk1dWJ5bGNia2RQTG1SdmQyNGdQQzBnWlc1eWFXTm9SMDhvWjJWdVpTQTlJR2RsYm1WTWFYTjBMbVJ2ZDI1TWIyOXdMQ0JQY21kRVlpQTlJRzl5Wnk1TmJTNWxaeTVrWWl3Z2EyVjVWSGx3WlNBOUlGd2lSVTVUUlUxQ1RGd2lMQ0J2Ym5RZ1BTQmNJa0pRWENJcFhHNWtiM1J3Ykc5MEtFZFBMbVJ2ZDI0cFhHNWNiaU1nUjA4Z2RHOGdiMjVzZVNCemNHVmphV1pwWXlCemRXSnpaWFJjYm1kbGJtVk1hWE4wTG5Wd1RHOXZjQzV6Y0dWamFXWnBZeUE4TFNCelpYUmthV1ptS0dkbGJtVk1hWE4wTG5Wd1RHOXZjQ3dnZFc1cGIyNG9aMlZ1WlV4cGMzUXVibTlNYjI5d0xDQm5aVzVsVEdsemRDNWtiM2R1VEc5dmNDa3BYRzVuWlc1bFRHbHpkQzV1YjB4dmIzQXVjM0JsWTJsbWFXTWdQQzBnYzJWMFpHbG1aaWhuWlc1bFRHbHpkQzV1YjB4dmIzQXNJSFZ1YVc5dUtHZGxibVZNYVhOMExuVndURzl2Y0N3Z1oyVnVaVXhwYzNRdVpHOTNia3h2YjNBcEtWeHVaMlZ1WlV4cGMzUXVaRzkzYmt4dmIzQXVjM0JsWTJsbWFXTWdQQzBnYzJWMFpHbG1aaWhuWlc1bFRHbHpkQzVrYjNkdVRHOXZjQ3dnZFc1cGIyNG9aMlZ1WlV4cGMzUXVibTlNYjI5d0xDQm5aVzVsVEdsemRDNTFjRXh2YjNBcEtWeHVSMDh1ZFhBZ1BDMGdaVzV5YVdOb1IwOG9aMlZ1WlNBOUlHZGxibVZNYVhOMExuVndURzl2Y0M1emNHVmphV1pwWXl3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lLVnh1Wkc5MGNHeHZkQ2hIVHk1MWNDbGNia2RQTG01dklEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsVEdsemRDNXViMHh2YjNBdWMzQmxZMmxtYVdNc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWENKRlRsTkZUVUpNWENJc0lHOXVkQ0E5SUZ3aVFsQmNJaWxjYm1SdmRIQnNiM1FvUjA4dWJtOHBYRzVIVHk1a2IzZHVJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bFRHbHpkQzVrYjNkdVRHOXZjQzV6Y0dWamFXWnBZeXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUtWeHVaRzkwY0d4dmRDaEhUeTVrYjNkdUtWeHVYRzVjYmlNaklFTm9aV05yYVc1bklIQmxjbU5sYm5SaFoyVWdiMllnWW05aVltbGxJR1ZoY214NUlHZGxibVZjYmx4dUl5TWdTVzF3YjNKMGFXNW5JRUp2WW1KcFpTQm5aVzVsSUdOc1lYTnphV1pwWTJGMGFXOXVYRzVuWlc1bFEyeDFjM1JsY2lBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0ppYjJKaWFXVmZaMlZ1WlY5amJHRnpjMmxtYVdOaGRHbHZiaTVqYzNaY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dkbGJtVXNJR1Z1YzNRc0lFTnNkWE4wWlhJcFhHNWpiMnh1WVcxbGN5aG5aVzVsUTJ4MWMzUmxjaWtnUEMwZ1l5aGNJbWRsYm1WY0lpd2dYQ0psYm5ObGJXSnNYM1J5WVc1elkzSnBjSFJmYVdSY0lpd2dYQ0pqYkhWemRHVnlYQ0lwWEc1Y2JseHVJeU1nUTI5dWRtVnlkR2x1WnlCMGNtRnVjMk55YVhCMElFbEVJSFJ2SUdkbGJtVWdTVVJjYm1sa1VHRnBjbDkwWnlBOExTQm5aWFJDVFNoaGRIUnlhV0oxZEdWeklEMGdZeWhjSW1WdWMyVnRZbXhmZEhKaGJuTmpjbWx3ZEY5cFpGd2lMQ0JjSW1WdWMyVnRZbXhmWjJWdVpWOXBaRndpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptbHNkR1Z5Y3lBOUlGd2laVzV6WlcxaWJGOTBjbUZ1YzJOeWFYQjBYMmxrWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhiSFZsY3lBOUlHZGxibVZEYkhWemRHVnlKR1Z1YzJWdFlteGZkSEpoYm5OamNtbHdkQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYldGeWRDQTlJR1Z1YzJWdFltd3VkakV3TWlsY2JtZGxibVZEYkhWemRHVnlJRHd0SUdkbGJtVkRiSFZ6ZEdWeUlDVStKU0JrY0d4NWNqbzZiR1ZtZEY5cWIybHVLR2xrVUdGcGNsOTBaeXdnWW5rZ1BTQmpLRndpWlc1elpXMWliRjkwY21GdWMyTnlhWEIwWDJsa1hDSXBLVnh1WEc0aklFMWhhMmx1WnlCa1lYUmhJR1p2Y2lCemRHRmphMlZrSUdKaGNuQnNiM1JjYm1OdmRXNTBSMlZ1WlNBOExTQm1kVzVqZEdsdmJpaG5aVzVsUTJ4MWMzUmxjaXdnWjNKdmRYQk9ZVzFsTENCamJIVnpkR1Z5VG1GdFpTbDdYRzRnSUc1MWJTQThMU0J1Y205M0tHZGxibVZEYkhWemRHVnlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR1Z1YzJWdFlteGZaMlZ1WlY5cFpDQWxhVzRsSUdkeWIzVndUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyeDFjM1JsY2lBbGFXNGxJR05zZFhOMFpYSk9ZVzFsS1NsY2JpQWdjbVYwZFhKdUtHNTFiU2xjYm4xY2JtTnZkVzUwUjJWdVpVeHBjM1FnUEMwZ1puVnVZM1JwYjI0b1oyVnVaVU5zZFhOMFpYSXNJR2R5YjNWd1RtRnRaU2w3WEc0Z0lHNHhJRHd0SUdOdmRXNTBSMlZ1WlNoblpXNWxRMngxYzNSbGNpd2daM0p2ZFhCT1lXMWxMQ0JjSWtWaGNteDVYQ0lwWEc0Z0lHNHlJRHd0SUdOdmRXNTBSMlZ1WlNoblpXNWxRMngxYzNSbGNpd2daM0p2ZFhCT1lXMWxMQ0JjSWsxcFpHUnNaVndpS1Z4dUlDQnVNeUE4TFdOdmRXNTBSMlZ1WlNoblpXNWxRMngxYzNSbGNpd2daM0p2ZFhCT1lXMWxMQ0JjSWt4aGRHVmNJaWxjYmlBZ2JqUWdQQzBnWTI5MWJuUkhaVzVsS0dkbGJtVkRiSFZ6ZEdWeUxDQm5jbTkxY0U1aGJXVXNJRndpVkhKaGJuTnBaVzUwWENJcFhHNGdJSEpsZEhWeWJpaGpLRzR4TENCdU1pd2diak1zSUc0MEtTbGNibjFjYmx4dVozSnZkWEFnUEMwZ1l5aHlaWEFvWENKMWNGd2lMQ0EwS1N3Z2NtVndLRndpYm05Y0lpd2dOQ2tzSUhKbGNDaGNJbVJ2ZDI1Y0lpd2dOQ2twWEc1amJIVnpkR1Z5SUR3dElISmxjQ2hqS0Z3aVJXRnliSGxjSWl3Z1hDSk5hV1JrYkdWY0lpd2dYQ0pNWVhSbFhDSXNJRndpVkhKaGJuTnBaVzUwWENJcExDQXpLVnh1WTJ4MWMzUmxjaUE4TFNCbVlXTjBiM0lvWTJ4MWMzUmxjaXdnYkdWMlpXeHpJRDBnWXloY0lrVmhjbXg1WENJc0lGd2lUV2xrWkd4bFhDSXNJRndpVEdGMFpWd2lMQ0JjSWxSeVlXNXphV1Z1ZEZ3aUtTbGNiblpoYkhWbElEd3RJR01vWTI5MWJuUkhaVzVsVEdsemRDaG5aVzVsUTJ4MWMzUmxjaXdnWjJWdVpVeHBjM1F1ZFhCTWIyOXdLU3hjYmlBZ0lDQWdJQ0FnSUNBZ1kyOTFiblJIWlc1bFRHbHpkQ2huWlc1bFEyeDFjM1JsY2l3Z1oyVnVaVXhwYzNRdWJtOU1iMjl3S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdZMjkxYm5SSFpXNWxUR2x6ZENoblpXNWxRMngxYzNSbGNpd2daMlZ1WlV4cGMzUXVaRzkzYmt4dmIzQXBLVnh1WEc1a1lYUmhJRHd0SUdSaGRHRXVabkpoYldVb1ozSnZkWEFzSUdOc2RYTjBaWElzSUhaaGJIVmxLVnh1WjJkd2JHOTBLR1JoZEdFc0lHRmxjeWhtYVd4c1BXTnNkWE4wWlhJc0lIazlkbUZzZFdVc0lIZzlaM0p2ZFhBcEtTQXJJRnh1SUNBZ0lHZGxiMjFmWW1GeUtIQnZjMmwwYVc5dVBWd2ljM1JoWTJ0Y0lpd2djM1JoZENBOUlGd2lhV1JsYm5ScGRIbGNJaWtnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2xjYm1kbmNHeHZkQ2hrWVhSaExDQmhaWE1vWm1sc2JEMWpiSFZ6ZEdWeUxDQjVQWFpoYkhWbExDQjRQV2R5YjNWd0tTa2dLeUJjYmlBZ0lDQm5aVzl0WDJKaGNpaHdiM05wZEdsdmJqMWNJbVpwYkd4Y0lpd2djM1JoZENBOUlGd2lhV1JsYm5ScGRIbGNJaWtnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2xjYmx4dWRtRnNkV1VnUEMwZ1l5aGpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQm5aVzVsVEdsemRDNTFjRXh2YjNBdWMzQmxZMmxtYVdNcExGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0JuWlc1bFRHbHpkQzV1YjB4dmIzQXVjM0JsWTJsbWFXTXBMRnh1SUNBZ0lDQWdJQ0FnSUNCamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCblpXNWxUR2x6ZEM1a2IzZHVURzl2Y0M1emNHVmphV1pwWXlrcFhHNWNibVJoZEdFZ1BDMGdaR0YwWVM1bWNtRnRaU2huY205MWNDd2dZMngxYzNSbGNpd2dkbUZzZFdVcFhHNGpJRkJzYjNSMGFXNW5YRzVuWjNCc2IzUW9aR0YwWVN3Z1lXVnpLR1pwYkd3OVkyeDFjM1JsY2l3Z2VUMTJZV3gxWlN3Z2VEMW5jbTkxY0NrcElDc2dYRzRnSUNBZ1oyVnZiVjlpWVhJb2NHOXphWFJwYjI0OVhDSnpkR0ZqYTF3aUxDQnpkR0YwSUQwZ1hDSnBaR1Z1ZEdsMGVWd2lLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LVnh1WjJkd2JHOTBLR1JoZEdFc0lHRmxjeWhtYVd4c1BXTnNkWE4wWlhJc0lIazlkbUZzZFdVc0lIZzlaM0p2ZFhBcEtTQXJJRnh1SUNBZ0lHZGxiMjFmWW1GeUtIQnZjMmwwYVc5dVBWd2labWxzYkZ3aUxDQnpkR0YwSUQwZ1hDSnBaR1Z1ZEdsMGVWd2lLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LVnh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1wZV9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yKVxuXG5nZW5lTGlzdC51cExvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXFVQXFwpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpXG5nZW5lTGlzdC5ub0xvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXE5PXFwpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpXG5nZW5lTGlzdC5kb3duTG9vcCA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fZFRBR19ETVNPID09IFxcRE9XTlxcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuXG5cblxuIyBDSEVDS0lORyBIT1cgTUFOWSBHRU5FUyBPVkVSTEFQIEFNT05HIFVQL05PL0RPV05cbnNldHNfbGlzdCA8LSBsaXN0KHVwID0gZ2VuZUxpc3QudXBMb29wLFxuICAgICAgICAgICAgICAgICAgbm8gPSBnZW5lTGlzdC5ub0xvb3AsXG4gICAgICAgICAgICAgICAgICBkb3duID0gZ2VuZUxpc3QuZG93bkxvb3ApXG5cbiMgQ3JlYXRlIHRoZSBFdWxlciBwbG90XG5ldWxlcl9maXQgPC0gZXVsZXIoc2V0c19saXN0KVxucGxvdChldWxlcl9maXQsXG4gICAgIGxhYmVscyA9IFRSVUUsICAjIERpc3BsYXkgc2V0IGxhYmVsc1xuICAgICBmaWxscyA9IFRSVUUsICAgIyBDb2xvciBmaWxsIHRoZSByZWdpb25zXG4gICAgIHF1YW50aXRpZXMgPSBUUlVFKVxuXG5cbiMgR09cbkdPLnVwIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC51cExvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08udXApXG5HTy5ubyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3Qubm9Mb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLm5vKVxuR08uZG93biA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuZG93bkxvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08uZG93bilcblxuIyBHTyB0byBvbmx5IHNwZWNpZmljIHN1YnNldFxuZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljIDwtIHNldGRpZmYoZ2VuZUxpc3QudXBMb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSlcbmdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0Lm5vTG9vcCwgdW5pb24oZ2VuZUxpc3QudXBMb29wLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5nZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0LmRvd25Mb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LnVwTG9vcCkpXG5HTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLnVwKVxuR08ubm8gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5ubylcbkdPLmRvd24gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLmRvd24pXG5cblxuIyMgQ2hlY2tpbmcgcGVyY2VudGFnZSBvZiBib2JiaWUgZWFybHkgZ2VuZVxuXG4jIyBJbXBvcnRpbmcgQm9iYmllIGdlbmUgY2xhc3NpZmljYXRpb25cbmdlbmVDbHVzdGVyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGJvYmJpZV9nZW5lX2NsYXNzaWZpY2F0aW9uLmNzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZ2VuZSwgZW5zdCwgQ2x1c3RlcilcbmNvbG5hbWVzKGdlbmVDbHVzdGVyKSA8LSBjKFxcZ2VuZVxcLCBcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcLCBcXGNsdXN0ZXJcXClcblxuXG4jIyBDb252ZXJ0aW5nIHRyYW5zY3JpcHQgSUQgdG8gZ2VuZSBJRFxuaWRQYWlyX3RnIDwtIGdldEJNKGF0dHJpYnV0ZXMgPSBjKFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwsIFxcZW5zZW1ibF9nZW5lX2lkXFwpLFxuICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCxcbiAgICAgICAgICAgICAgICAgdmFsdWVzID0gZ2VuZUNsdXN0ZXIkZW5zZW1ibF90cmFuc2NyaXB0LFxuICAgICAgICAgICAgICAgICBtYXJ0ID0gZW5zZW1ibC52MTAyKVxuZ2VuZUNsdXN0ZXIgPC0gZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oaWRQYWlyX3RnLCBieSA9IGMoXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCkpXG5cbiMgTWFraW5nIGRhdGEgZm9yIHN0YWNrZWQgYmFycGxvdFxuY291bnRHZW5lIDwtIGZ1bmN0aW9uKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIGNsdXN0ZXJOYW1lKXtcbiAgbnVtIDwtIG5yb3coZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibF9nZW5lX2lkICVpbiUgZ3JvdXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyICVpbiUgY2x1c3Rlck5hbWUpKVxuICByZXR1cm4obnVtKVxufVxuY291bnRHZW5lTGlzdCA8LSBmdW5jdGlvbihnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lKXtcbiAgbjEgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcRWFybHlcXClcbiAgbjIgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcTWlkZGxlXFwpXG4gIG4zIDwtY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcTGF0ZVxcKVxuICBuNCA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgXFxUcmFuc2llbnRcXClcbiAgcmV0dXJuKGMobjEsIG4yLCBuMywgbjQpKVxufVxuXG5ncm91cCA8LSBjKHJlcChcXHVwXFwsIDQpLCByZXAoXFxub1xcLCA0KSwgcmVwKFxcZG93blxcLCA0KSlcbmNsdXN0ZXIgPC0gcmVwKGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCksIDMpXG5jbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpKVxudmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC51cExvb3ApLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5ub0xvb3ApLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5cbmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxzdGFja1xcLCBzdGF0ID0gXFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuZ2dwbG90KGRhdGEsIGFlcyhmaWxsPWNsdXN0ZXIsIHk9dmFsdWUsIHg9Z3JvdXApKSArIFxuICAgIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcLCBzdGF0ID0gXFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYyksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYyksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljKSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcbiMgUGxvdHRpbmdcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXHN0YWNrXFwsIHN0YXQgPSBcXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQgPSBcXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-pe_ensemblList.tsv\)),
                                      diffCutoff = 0.2)

geneList.upLoop <- unique((geneAnnoData %>% dplyr::filter(updown_dTAG_DMSO == \UP\) %>% unnest(gene))$gene)
geneList.noLoop <- unique((geneAnnoData %>% dplyr::filter(updown_dTAG_DMSO == \NO\) %>% unnest(gene))$gene)
geneList.downLoop <- unique((geneAnnoData %>% dplyr::filter(updown_dTAG_DMSO == \DOWN\) %>% unnest(gene))$gene)



# CHECKING HOW MANY GENES OVERLAP AMONG UP/NO/DOWN
sets_list <- list(up = geneList.upLoop,
                  no = geneList.noLoop,
                  down = geneList.downLoop)

# Create the Euler plot
euler_fit <- euler(sets_list)
plot(euler_fit,
     labels = TRUE,  # Display set labels
     fills = TRUE,   # Color fill the regions
     quantities = TRUE)


# GO
GO.up <- enrichGO(gene = geneList.upLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down)

# GO to only specific subset
geneList.upLoop.specific <- setdiff(geneList.upLoop, union(geneList.noLoop, geneList.downLoop))
geneList.noLoop.specific <- setdiff(geneList.noLoop, union(geneList.upLoop, geneList.downLoop))
geneList.downLoop.specific <- setdiff(geneList.downLoop, union(geneList.noLoop, geneList.upLoop))
GO.up <- enrichGO(gene = geneList.upLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down)


## Checking percentage of bobbie early gene

## Importing Bobbie gene classification
geneCluster <- fread(here(refDir, \bobbie_gene_classification.csv\)) %>%
  dplyr::select(gene, enst, Cluster)
colnames(geneCluster) <- c(\gene\, \ensembl_transcript_id\, \cluster\)


## Converting transcript ID to gene ID
idPair_tg <- getBM(attributes = c(\ensembl_transcript_id\, \ensembl_gene_id\),
                 filters = \ensembl_transcript_id\,
                 values = geneCluster$ensembl_transcript,
                 mart = ensembl.v102)
geneCluster <- geneCluster %>% dplyr::left_join(idPair_tg, by = c(\ensembl_transcript_id\))

# Making data for stacked barplot
countGene <- function(geneCluster, groupName, clusterName){
  num <- nrow(geneCluster %>% dplyr::filter(ensembl_gene_id %in% groupName,
                                            cluster %in% clusterName))
  return(num)
}
countGeneList <- function(geneCluster, groupName){
  n1 <- countGene(geneCluster, groupName, \Early\)
  n2 <- countGene(geneCluster, groupName, \Middle\)
  n3 <-countGene(geneCluster, groupName, \Late\)
  n4 <- countGene(geneCluster, groupName, \Transient\)
  return(c(n1, n2, n3, n4))
}

group <- c(rep(\up\, 4), rep(\no\, 4), rep(\down\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 3)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, geneList.upLoop),
           countGeneList(geneCluster, geneList.noLoop),
           countGeneList(geneCluster, geneList.downLoop))

data <- data.frame(group, cluster, value)
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\stack\, stat = \identity\) + theme_classic()
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat = \identity\) + theme_classic()

value <- c(countGeneList(geneCluster, geneList.upLoop.specific),
           countGeneList(geneCluster, geneList.noLoop.specific),
           countGeneList(geneCluster, geneList.downLoop.specific))

data <- data.frame(group, cluster, value)
# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\stack\, stat = \identity\) + theme_classic()
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat = \identity\) + theme_classic()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gzQXRjR1ZmWlc1elpXMWliRXhwYzNRdWRITjJYRndwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2xtWmtOMWRHOW1aaUE5SURBdU1pbGNibHh1WjJWdVpVeHBjM1F1ZFhCTWIyOXdJRHd0SUhWdWFYRjFaU2dvWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIVndaRzkzYmw5a1ZFRkhYMFJOVTA4Z1BUMGdYRnhWVUZ4Y0tTQWxQaVVnZFc1dVpYTjBLR2RsYm1VcEtTUm5aVzVsS1Z4dVoyVnVaVXhwYzNRdWJtOU1iMjl3SUR3dElIVnVhWEYxWlNnb1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSFZ3Wkc5M2JsOWtWRUZIWDBSTlUwOGdQVDBnWEZ4T1QxeGNLU0FsUGlVZ2RXNXVaWE4wS0dkbGJtVXBLU1JuWlc1bEtWeHVaMlZ1WlV4cGMzUXVaRzkzYmt4dmIzQWdQQzBnZFc1cGNYVmxLQ2huWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2RYQmtiM2R1WDJSVVFVZGZSRTFUVHlBOVBTQmNYRVJQVjA1Y1hDa2dKVDRsSUhWdWJtVnpkQ2huWlc1bEtTa2taMlZ1WlNsY2JseHVYRzVjYmlNZ1EwaEZRMHRKVGtjZ1NFOVhJRTFCVGxrZ1IwVk9SVk1nVDFaRlVreEJVQ0JCVFU5T1J5QlZVQzlPVHk5RVQxZE9YRzV6WlhSelgyeHBjM1FnUEMwZ2JHbHpkQ2gxY0NBOUlHZGxibVZNYVhOMExuVndURzl2Y0N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNXZJRDBnWjJWdVpVeHBjM1F1Ym05TWIyOXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkc5M2JpQTlJR2RsYm1WTWFYTjBMbVJ2ZDI1TWIyOXdLVnh1WEc0aklFTnlaV0YwWlNCMGFHVWdSWFZzWlhJZ2NHeHZkRnh1WlhWc1pYSmZabWwwSUR3dElHVjFiR1Z5S0hObGRITmZiR2x6ZENsY2JuQnNiM1FvWlhWc1pYSmZabWwwTEZ4dUlDQWdJQ0JzWVdKbGJITWdQU0JVVWxWRkxDQWdJeUJFYVhOd2JHRjVJSE5sZENCc1lXSmxiSE5jYmlBZ0lDQWdabWxzYkhNZ1BTQlVVbFZGTENBZ0lDTWdRMjlzYjNJZ1ptbHNiQ0IwYUdVZ2NtVm5hVzl1YzF4dUlDQWdJQ0J4ZFdGdWRHbDBhV1Z6SUQwZ1ZGSlZSU2xjYmx4dVhHNGpJRWRQWEc1SFR5NTFjQ0E4TFNCbGJuSnBZMmhIVHloblpXNWxJRDBnWjJWdVpVeHBjM1F1ZFhCTWIyOXdMQ0JQY21kRVlpQTlJRzl5Wnk1TmJTNWxaeTVrWWl3Z2EyVjVWSGx3WlNBOUlGeGNSVTVUUlUxQ1RGeGNMQ0J2Ym5RZ1BTQmNYRUpRWEZ3cFhHNWtiM1J3Ykc5MEtFZFBMblZ3S1Z4dVIwOHVibThnUEMwZ1pXNXlhV05vUjA4b1oyVnVaU0E5SUdkbGJtVk1hWE4wTG01dlRHOXZjQ3dnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0tWeHVaRzkwY0d4dmRDaEhUeTV1YnlsY2JrZFBMbVJ2ZDI0Z1BDMGdaVzV5YVdOb1IwOG9aMlZ1WlNBOUlHZGxibVZNYVhOMExtUnZkMjVNYjI5d0xDQlBjbWRFWWlBOUlHOXlaeTVOYlM1bFp5NWtZaXdnYTJWNVZIbHdaU0E5SUZ4Y1JVNVRSVTFDVEZ4Y0xDQnZiblFnUFNCY1hFSlFYRndwWEc1a2IzUndiRzkwS0VkUExtUnZkMjRwWEc1Y2JpTWdSMDhnZEc4Z2IyNXNlU0J6Y0dWamFXWnBZeUJ6ZFdKelpYUmNibWRsYm1WTWFYTjBMblZ3VEc5dmNDNXpjR1ZqYVdacFl5QThMU0J6WlhSa2FXWm1LR2RsYm1WTWFYTjBMblZ3VEc5dmNDd2dkVzVwYjI0b1oyVnVaVXhwYzNRdWJtOU1iMjl3TENCblpXNWxUR2x6ZEM1a2IzZHVURzl2Y0NrcFhHNW5aVzVsVEdsemRDNXViMHh2YjNBdWMzQmxZMmxtYVdNZ1BDMGdjMlYwWkdsbVppaG5aVzVsVEdsemRDNXViMHh2YjNBc0lIVnVhVzl1S0dkbGJtVk1hWE4wTG5Wd1RHOXZjQ3dnWjJWdVpVeHBjM1F1Wkc5M2JreHZiM0FwS1Z4dVoyVnVaVXhwYzNRdVpHOTNia3h2YjNBdWMzQmxZMmxtYVdNZ1BDMGdjMlYwWkdsbVppaG5aVzVsVEdsemRDNWtiM2R1VEc5dmNDd2dkVzVwYjI0b1oyVnVaVXhwYzNRdWJtOU1iMjl3TENCblpXNWxUR2x6ZEM1MWNFeHZiM0FwS1Z4dVIwOHVkWEFnUEMwZ1pXNXlhV05vUjA4b1oyVnVaU0E5SUdkbGJtVk1hWE4wTG5Wd1RHOXZjQzV6Y0dWamFXWnBZeXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0tWeHVaRzkwY0d4dmRDaEhUeTUxY0NsY2JrZFBMbTV2SUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxUR2x6ZEM1dWIweHZiM0F1YzNCbFkybG1hV01zSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYRnhGVGxORlRVSk1YRndzSUc5dWRDQTlJRnhjUWxCY1hDbGNibVJ2ZEhCc2IzUW9SMDh1Ym04cFhHNUhUeTVrYjNkdUlEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsVEdsemRDNWtiM2R1VEc5dmNDNXpjR1ZqYVdacFl5d2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjS1Z4dVpHOTBjR3h2ZENoSFR5NWtiM2R1S1Z4dVhHNWNiaU1qSUVOb1pXTnJhVzVuSUhCbGNtTmxiblJoWjJVZ2IyWWdZbTlpWW1sbElHVmhjbXg1SUdkbGJtVmNibHh1SXlNZ1NXMXdiM0owYVc1bklFSnZZbUpwWlNCblpXNWxJR05zWVhOemFXWnBZMkYwYVc5dVhHNW5aVzVsUTJ4MWMzUmxjaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeGliMkppYVdWZloyVnVaVjlqYkdGemMybG1hV05oZEdsdmJpNWpjM1pjWENrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR2RsYm1Vc0lHVnVjM1FzSUVOc2RYTjBaWElwWEc1amIyeHVZVzFsY3loblpXNWxRMngxYzNSbGNpa2dQQzBnWXloY1hHZGxibVZjWEN3Z1hGeGxibk5sYldKc1gzUnlZVzV6WTNKcGNIUmZhV1JjWEN3Z1hGeGpiSFZ6ZEdWeVhGd3BYRzVjYmx4dUl5TWdRMjl1ZG1WeWRHbHVaeUIwY21GdWMyTnlhWEIwSUVsRUlIUnZJR2RsYm1VZ1NVUmNibWxrVUdGcGNsOTBaeUE4TFNCblpYUkNUU2hoZEhSeWFXSjFkR1Z6SUQwZ1l5aGNYR1Z1YzJWdFlteGZkSEpoYm5OamNtbHdkRjlwWkZ4Y0xDQmNYR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm1sc2RHVnljeUE5SUZ4Y1pXNXpaVzFpYkY5MGNtRnVjMk55YVhCMFgybGtYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGJIVmxjeUE5SUdkbGJtVkRiSFZ6ZEdWeUpHVnVjMlZ0WW14ZmRISmhibk5qY21sd2RDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0Z5ZENBOUlHVnVjMlZ0WW13dWRqRXdNaWxjYm1kbGJtVkRiSFZ6ZEdWeUlEd3RJR2RsYm1WRGJIVnpkR1Z5SUNVK0pTQmtjR3g1Y2pvNmJHVm1kRjlxYjJsdUtHbGtVR0ZwY2w5MFp5d2dZbmtnUFNCaktGeGNaVzV6WlcxaWJGOTBjbUZ1YzJOeWFYQjBYMmxrWEZ3cEtWeHVYRzRqSUUxaGEybHVaeUJrWVhSaElHWnZjaUJ6ZEdGamEyVmtJR0poY25Cc2IzUmNibU52ZFc1MFIyVnVaU0E4TFNCbWRXNWpkR2x2YmloblpXNWxRMngxYzNSbGNpd2daM0p2ZFhCT1lXMWxMQ0JqYkhWemRHVnlUbUZ0WlNsN1hHNGdJRzUxYlNBOExTQnVjbTkzS0dkbGJtVkRiSFZ6ZEdWeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHVnVjMlZ0WW14ZloyVnVaVjlwWkNBbGFXNGxJR2R5YjNWd1RtRnRaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJ4MWMzUmxjaUFsYVc0bElHTnNkWE4wWlhKT1lXMWxLU2xjYmlBZ2NtVjBkWEp1S0c1MWJTbGNibjFjYm1OdmRXNTBSMlZ1WlV4cGMzUWdQQzBnWm5WdVkzUnBiMjRvWjJWdVpVTnNkWE4wWlhJc0lHZHliM1Z3VG1GdFpTbDdYRzRnSUc0eElEd3RJR052ZFc1MFIyVnVaU2huWlc1bFEyeDFjM1JsY2l3Z1ozSnZkWEJPWVcxbExDQmNYRVZoY214NVhGd3BYRzRnSUc0eUlEd3RJR052ZFc1MFIyVnVaU2huWlc1bFEyeDFjM1JsY2l3Z1ozSnZkWEJPWVcxbExDQmNYRTFwWkdSc1pWeGNLVnh1SUNCdU15QThMV052ZFc1MFIyVnVaU2huWlc1bFEyeDFjM1JsY2l3Z1ozSnZkWEJPWVcxbExDQmNYRXhoZEdWY1hDbGNiaUFnYmpRZ1BDMGdZMjkxYm5SSFpXNWxLR2RsYm1WRGJIVnpkR1Z5TENCbmNtOTFjRTVoYldVc0lGeGNWSEpoYm5OcFpXNTBYRndwWEc0Z0lISmxkSFZ5YmloaktHNHhMQ0J1TWl3Z2JqTXNJRzQwS1NsY2JuMWNibHh1WjNKdmRYQWdQQzBnWXloeVpYQW9YRngxY0Z4Y0xDQTBLU3dnY21Wd0tGeGNibTljWEN3Z05Da3NJSEpsY0NoY1hHUnZkMjVjWEN3Z05Da3BYRzVqYkhWemRHVnlJRHd0SUhKbGNDaGpLRnhjUldGeWJIbGNYQ3dnWEZ4TmFXUmtiR1ZjWEN3Z1hGeE1ZWFJsWEZ3c0lGeGNWSEpoYm5OcFpXNTBYRndwTENBektWeHVZMngxYzNSbGNpQThMU0JtWVdOMGIzSW9ZMngxYzNSbGNpd2diR1YyWld4eklEMGdZeWhjWEVWaGNteDVYRndzSUZ4Y1RXbGtaR3hsWEZ3c0lGeGNUR0YwWlZ4Y0xDQmNYRlJ5WVc1emFXVnVkRnhjS1NsY2JuWmhiSFZsSUR3dElHTW9ZMjkxYm5SSFpXNWxUR2x6ZENoblpXNWxRMngxYzNSbGNpd2daMlZ1WlV4cGMzUXVkWEJNYjI5d0tTeGNiaUFnSUNBZ0lDQWdJQ0FnWTI5MWJuUkhaVzVsVEdsemRDaG5aVzVsUTJ4MWMzUmxjaXdnWjJWdVpVeHBjM1F1Ym05TWIyOXdLU3hjYmlBZ0lDQWdJQ0FnSUNBZ1kyOTFiblJIWlc1bFRHbHpkQ2huWlc1bFEyeDFjM1JsY2l3Z1oyVnVaVXhwYzNRdVpHOTNia3h2YjNBcEtWeHVYRzVrWVhSaElEd3RJR1JoZEdFdVpuSmhiV1VvWjNKdmRYQXNJR05zZFhOMFpYSXNJSFpoYkhWbEtWeHVaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aG1hV3hzUFdOc2RYTjBaWElzSUhrOWRtRnNkV1VzSUhnOVozSnZkWEFwS1NBcklGeHVJQ0FnSUdkbGIyMWZZbUZ5S0hCdmMybDBhVzl1UFZ4Y2MzUmhZMnRjWEN3Z2MzUmhkQ0E5SUZ4Y2FXUmxiblJwZEhsY1hDa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDbGNibWRuY0d4dmRDaGtZWFJoTENCaFpYTW9abWxzYkQxamJIVnpkR1Z5TENCNVBYWmhiSFZsTENCNFBXZHliM1Z3S1NrZ0t5QmNiaUFnSUNCblpXOXRYMkpoY2lod2IzTnBkR2x2YmoxY1hHWnBiR3hjWEN3Z2MzUmhkQ0E5SUZ4Y2FXUmxiblJwZEhsY1hDa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDbGNibHh1ZG1Gc2RXVWdQQzBnWXloamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCblpXNWxUR2x6ZEM1MWNFeHZiM0F1YzNCbFkybG1hV01wTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQm5aVzVsVEdsemRDNXViMHh2YjNBdWMzQmxZMmxtYVdNcExGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0JuWlc1bFRHbHpkQzVrYjNkdVRHOXZjQzV6Y0dWamFXWnBZeWtwWEc1Y2JtUmhkR0VnUEMwZ1pHRjBZUzVtY21GdFpTaG5jbTkxY0N3Z1kyeDFjM1JsY2l3Z2RtRnNkV1VwWEc0aklGQnNiM1IwYVc1blhHNW5aM0JzYjNRb1pHRjBZU3dnWVdWektHWnBiR3c5WTJ4MWMzUmxjaXdnZVQxMllXeDFaU3dnZUQxbmNtOTFjQ2twSUNzZ1hHNGdJQ0FnWjJWdmJWOWlZWElvY0c5emFYUnBiMjQ5WEZ4emRHRmphMXhjTENCemRHRjBJRDBnWEZ4cFpHVnVkR2wwZVZ4Y0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tWeHVaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aG1hV3hzUFdOc2RYTjBaWElzSUhrOWRtRnNkV1VzSUhnOVozSnZkWEFwS1NBcklGeHVJQ0FnSUdkbGIyMWZZbUZ5S0hCdmMybDBhVzl1UFZ4Y1ptbHNiRnhjTENCemRHRjBJRDBnWEZ4cFpHVnVkR2wwZVZ4Y0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tWeHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1wZV9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yKVxuXG5nZW5lTGlzdC51cExvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXFVQXFwpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpXG5nZW5lTGlzdC5ub0xvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXE5PXFwpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpXG5nZW5lTGlzdC5kb3duTG9vcCA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fZFRBR19ETVNPID09IFxcRE9XTlxcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuXG5cblxuIyBDSEVDS0lORyBIT1cgTUFOWSBHRU5FUyBPVkVSTEFQIEFNT05HIFVQL05PL0RPV05cbnNldHNfbGlzdCA8LSBsaXN0KHVwID0gZ2VuZUxpc3QudXBMb29wLFxuICAgICAgICAgICAgICAgICAgbm8gPSBnZW5lTGlzdC5ub0xvb3AsXG4gICAgICAgICAgICAgICAgICBkb3duID0gZ2VuZUxpc3QuZG93bkxvb3ApXG5cbiMgQ3JlYXRlIHRoZSBFdWxlciBwbG90XG5ldWxlcl9maXQgPC0gZXVsZXIoc2V0c19saXN0KVxucGxvdChldWxlcl9maXQsXG4gICAgIGxhYmVscyA9IFRSVUUsICAjIERpc3BsYXkgc2V0IGxhYmVsc1xuICAgICBmaWxscyA9IFRSVUUsICAgIyBDb2xvciBmaWxsIHRoZSByZWdpb25zXG4gICAgIHF1YW50aXRpZXMgPSBUUlVFKVxuXG5cbiMgR09cbkdPLnVwIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC51cExvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08udXApXG5HTy5ubyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3Qubm9Mb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLm5vKVxuR08uZG93biA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuZG93bkxvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08uZG93bilcblxuIyBHTyB0byBvbmx5IHNwZWNpZmljIHN1YnNldFxuZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljIDwtIHNldGRpZmYoZ2VuZUxpc3QudXBMb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSlcbmdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0Lm5vTG9vcCwgdW5pb24oZ2VuZUxpc3QudXBMb29wLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5nZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0LmRvd25Mb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LnVwTG9vcCkpXG5HTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLnVwKVxuR08ubm8gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5ubylcbkdPLmRvd24gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLmRvd24pXG5cblxuIyMgQ2hlY2tpbmcgcGVyY2VudGFnZSBvZiBib2JiaWUgZWFybHkgZ2VuZVxuXG4jIyBJbXBvcnRpbmcgQm9iYmllIGdlbmUgY2xhc3NpZmljYXRpb25cbmdlbmVDbHVzdGVyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGJvYmJpZV9nZW5lX2NsYXNzaWZpY2F0aW9uLmNzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZ2VuZSwgZW5zdCwgQ2x1c3RlcilcbmNvbG5hbWVzKGdlbmVDbHVzdGVyKSA8LSBjKFxcZ2VuZVxcLCBcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcLCBcXGNsdXN0ZXJcXClcblxuXG4jIyBDb252ZXJ0aW5nIHRyYW5zY3JpcHQgSUQgdG8gZ2VuZSBJRFxuaWRQYWlyX3RnIDwtIGdldEJNKGF0dHJpYnV0ZXMgPSBjKFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwsIFxcZW5zZW1ibF9nZW5lX2lkXFwpLFxuICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCxcbiAgICAgICAgICAgICAgICAgdmFsdWVzID0gZ2VuZUNsdXN0ZXIkZW5zZW1ibF90cmFuc2NyaXB0LFxuICAgICAgICAgICAgICAgICBtYXJ0ID0gZW5zZW1ibC52MTAyKVxuZ2VuZUNsdXN0ZXIgPC0gZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oaWRQYWlyX3RnLCBieSA9IGMoXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCkpXG5cbiMgTWFraW5nIGRhdGEgZm9yIHN0YWNrZWQgYmFycGxvdFxuY291bnRHZW5lIDwtIGZ1bmN0aW9uKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIGNsdXN0ZXJOYW1lKXtcbiAgbnVtIDwtIG5yb3coZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibF9nZW5lX2lkICVpbiUgZ3JvdXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyICVpbiUgY2x1c3Rlck5hbWUpKVxuICByZXR1cm4obnVtKVxufVxuY291bnRHZW5lTGlzdCA8LSBmdW5jdGlvbihnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lKXtcbiAgbjEgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcRWFybHlcXClcbiAgbjIgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcTWlkZGxlXFwpXG4gIG4zIDwtY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcTGF0ZVxcKVxuICBuNCA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgXFxUcmFuc2llbnRcXClcbiAgcmV0dXJuKGMobjEsIG4yLCBuMywgbjQpKVxufVxuXG5ncm91cCA8LSBjKHJlcChcXHVwXFwsIDQpLCByZXAoXFxub1xcLCA0KSwgcmVwKFxcZG93blxcLCA0KSlcbmNsdXN0ZXIgPC0gcmVwKGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCksIDMpXG5jbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpKVxudmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC51cExvb3ApLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5ub0xvb3ApLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5cbmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxzdGFja1xcLCBzdGF0ID0gXFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuZ2dwbG90KGRhdGEsIGFlcyhmaWxsPWNsdXN0ZXIsIHk9dmFsdWUsIHg9Z3JvdXApKSArIFxuICAgIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcLCBzdGF0ID0gXFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYyksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYyksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljKSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcbiMgUGxvdHRpbmdcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXHN0YWNrXFwsIHN0YXQgPSBcXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQgPSBcXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3AtcGVfZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMilcblxuZ2VuZUxpc3QudXBMb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9kVEFHX0RNU08gPT0gXFxVUFxcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuZ2VuZUxpc3Qubm9Mb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9kVEFHX0RNU08gPT0gXFxOT1xcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuZ2VuZUxpc3QuZG93bkxvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXERPV05cXCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZSlcblxuXG5cbiMgQ0hFQ0tJTkcgSE9XIE1BTlkgR0VORVMgT1ZFUkxBUCBBTU9ORyBVUC9OTy9ET1dOXG5zZXRzX2xpc3QgPC0gbGlzdCh1cCA9IGdlbmVMaXN0LnVwTG9vcCxcbiAgICAgICAgICAgICAgICAgIG5vID0gZ2VuZUxpc3Qubm9Mb29wLFxuICAgICAgICAgICAgICAgICAgZG93biA9IGdlbmVMaXN0LmRvd25Mb29wKVxuXG4jIENyZWF0ZSB0aGUgRXVsZXIgcGxvdFxuZXVsZXJfZml0IDwtIGV1bGVyKHNldHNfbGlzdClcbnBsb3QoZXVsZXJfZml0LFxuICAgICBsYWJlbHMgPSBUUlVFLCAgIyBEaXNwbGF5IHNldCBsYWJlbHNcbiAgICAgZmlsbHMgPSBUUlVFLCAgICMgQ29sb3IgZmlsbCB0aGUgcmVnaW9uc1xuICAgICBxdWFudGl0aWVzID0gVFJVRSlcblxuXG4jIEdPXG5HTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLnVwKVxuR08ubm8gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0Lm5vTG9vcCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5ubylcbkdPLmRvd24gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmRvd25Mb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLmRvd24pXG5cbiMgR08gdG8gb25seSBzcGVjaWZpYyBzdWJzZXRcbmdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0LnVwTG9vcCwgdW5pb24oZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5nZW5lTGlzdC5ub0xvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5ub0xvb3AsIHVuaW9uKGdlbmVMaXN0LnVwTG9vcCwgZ2VuZUxpc3QuZG93bkxvb3ApKVxuZ2VuZUxpc3QuZG93bkxvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5kb3duTG9vcCwgdW5pb24oZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC51cExvb3ApKVxuR08udXAgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy51cClcbkdPLm5vIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ub0xvb3Auc3BlY2lmaWMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08ubm8pXG5HTy5kb3duIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5kb3duKVxuXG5cbiMjIENoZWNraW5nIHBlcmNlbnRhZ2Ugb2YgYm9iYmllIGVhcmx5IGdlbmVcblxuIyMgSW1wb3J0aW5nIEJvYmJpZSBnZW5lIGNsYXNzaWZpY2F0aW9uXG5nZW5lQ2x1c3RlciA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxib2JiaWVfZ2VuZV9jbGFzc2lmaWNhdGlvbi5jc3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGdlbmUsIGVuc3QsIENsdXN0ZXIpXG5jb2xuYW1lcyhnZW5lQ2x1c3RlcikgPC0gYyhcXGdlbmVcXCwgXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCwgXFxjbHVzdGVyXFwpXG5cblxuIyMgQ29udmVydGluZyB0cmFuc2NyaXB0IElEIHRvIGdlbmUgSURcbmlkUGFpcl90ZyA8LSBnZXRCTShhdHRyaWJ1dGVzID0gYyhcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcLCBcXGVuc2VtYmxfZ2VuZV9pZFxcKSxcbiAgICAgICAgICAgICAgICAgZmlsdGVycyA9IFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwsXG4gICAgICAgICAgICAgICAgIHZhbHVlcyA9IGdlbmVDbHVzdGVyJGVuc2VtYmxfdHJhbnNjcmlwdCxcbiAgICAgICAgICAgICAgICAgbWFydCA9IGVuc2VtYmwudjEwMilcbmdlbmVDbHVzdGVyIDwtIGdlbmVDbHVzdGVyICU+JSBkcGx5cjo6bGVmdF9qb2luKGlkUGFpcl90ZywgYnkgPSBjKFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwpKVxuXG4jIE1ha2luZyBkYXRhIGZvciBzdGFja2VkIGJhcnBsb3RcbmNvdW50R2VuZSA8LSBmdW5jdGlvbihnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBjbHVzdGVyTmFtZSl7XG4gIG51bSA8LSBucm93KGdlbmVDbHVzdGVyICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdyb3VwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciAlaW4lIGNsdXN0ZXJOYW1lKSlcbiAgcmV0dXJuKG51bSlcbn1cbmNvdW50R2VuZUxpc3QgPC0gZnVuY3Rpb24oZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSl7XG4gIG4xIDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXEVhcmx5XFwpXG4gIG4yIDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXE1pZGRsZVxcKVxuICBuMyA8LWNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBcXExhdGVcXClcbiAgbjQgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcVHJhbnNpZW50XFwpXG4gIHJldHVybihjKG4xLCBuMiwgbjMsIG40KSlcbn1cblxuZ3JvdXAgPC0gYyhyZXAoXFx1cFxcLCA0KSwgcmVwKFxcbm9cXCwgNCksIHJlcChcXGRvd25cXCwgNCkpXG5jbHVzdGVyIDwtIHJlcChjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpLCAzKVxuY2x1c3RlciA8LSBmYWN0b3IoY2x1c3RlciwgbGV2ZWxzID0gYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSlcbnZhbHVlIDwtIGMoY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ2VuZUxpc3QudXBMb29wKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ2VuZUxpc3Qubm9Mb29wKSxcbiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ2VuZUxpc3QuZG93bkxvb3ApKVxuXG5kYXRhIDwtIGRhdGEuZnJhbWUoZ3JvdXAsIGNsdXN0ZXIsIHZhbHVlKVxuZ2dwbG90KGRhdGEsIGFlcyhmaWxsPWNsdXN0ZXIsIHk9dmFsdWUsIHg9Z3JvdXApKSArIFxuICAgIGdlb21fYmFyKHBvc2l0aW9uPVxcc3RhY2tcXCwgc3RhdCA9IFxcaWRlbnRpdHlcXCkgKyB0aGVtZV9jbGFzc2ljKClcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdCA9IFxcaWRlbnRpdHlcXCkgKyB0aGVtZV9jbGFzc2ljKClcblxudmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC51cExvb3Auc3BlY2lmaWMpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5ub0xvb3Auc3BlY2lmaWMpLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYykpXG5cbmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpXG4jIFBsb3R0aW5nXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxzdGFja1xcLCBzdGF0ID0gXFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuZ2dwbG90KGRhdGEsIGFlcyhmaWxsPWNsdXN0ZXIsIHk9dmFsdWUsIHg9Z3JvdXApKSArIFxuICAgIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcLCBzdGF0ID0gXFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-pe_ensemblList.tsv\)),
                                      diffCutoff = 0.2)

geneList.upLoop <- unique((geneAnnoData %>% dplyr::filter(updown_dTAG_DMSO == \UP\) %>% unnest(gene))$gene)
geneList.noLoop <- unique((geneAnnoData %>% dplyr::filter(updown_dTAG_DMSO == \NO\) %>% unnest(gene))$gene)
geneList.downLoop <- unique((geneAnnoData %>% dplyr::filter(updown_dTAG_DMSO == \DOWN\) %>% unnest(gene))$gene)



# CHECKING HOW MANY GENES OVERLAP AMONG UP/NO/DOWN
sets_list <- list(up = geneList.upLoop,
                  no = geneList.noLoop,
                  down = geneList.downLoop)

# Create the Euler plot
euler_fit <- euler(sets_list)
plot(euler_fit,
     labels = TRUE,  # Display set labels
     fills = TRUE,   # Color fill the regions
     quantities = TRUE)


# GO
GO.up <- enrichGO(gene = geneList.upLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down)

# GO to only specific subset
geneList.upLoop.specific <- setdiff(geneList.upLoop, union(geneList.noLoop, geneList.downLoop))
geneList.noLoop.specific <- setdiff(geneList.noLoop, union(geneList.upLoop, geneList.downLoop))
geneList.downLoop.specific <- setdiff(geneList.downLoop, union(geneList.noLoop, geneList.upLoop))
GO.up <- enrichGO(gene = geneList.upLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down)


## Checking percentage of bobbie early gene

## Importing Bobbie gene classification
geneCluster <- fread(here(refDir, \bobbie_gene_classification.csv\)) %>%
  dplyr::select(gene, enst, Cluster)
colnames(geneCluster) <- c(\gene\, \ensembl_transcript_id\, \cluster\)


## Converting transcript ID to gene ID
idPair_tg <- getBM(attributes = c(\ensembl_transcript_id\, \ensembl_gene_id\),
                 filters = \ensembl_transcript_id\,
                 values = geneCluster$ensembl_transcript,
                 mart = ensembl.v102)
geneCluster <- geneCluster %>% dplyr::left_join(idPair_tg, by = c(\ensembl_transcript_id\))

# Making data for stacked barplot
countGene <- function(geneCluster, groupName, clusterName){
  num <- nrow(geneCluster %>% dplyr::filter(ensembl_gene_id %in% groupName,
                                            cluster %in% clusterName))
  return(num)
}
countGeneList <- function(geneCluster, groupName){
  n1 <- countGene(geneCluster, groupName, \Early\)
  n2 <- countGene(geneCluster, groupName, \Middle\)
  n3 <-countGene(geneCluster, groupName, \Late\)
  n4 <- countGene(geneCluster, groupName, \Transient\)
  return(c(n1, n2, n3, n4))
}

group <- c(rep(\up\, 4), rep(\no\, 4), rep(\down\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 3)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, geneList.upLoop),
           countGeneList(geneCluster, geneList.noLoop),
           countGeneList(geneCluster, geneList.downLoop))

data <- data.frame(group, cluster, value)
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\stack\, stat = \identity\) + theme_classic()
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat = \identity\) + theme_classic()

value <- c(countGeneList(geneCluster, geneList.upLoop.specific),
           countGeneList(geneCluster, geneList.noLoop.specific),
           countGeneList(geneCluster, geneList.downLoop.specific))

data <- data.frame(group, cluster, value)
# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\stack\, stat = \identity\) + theme_classic()
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat = \identity\) + theme_classic()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## [2.25] Checking genes related to regulatory loops
### dTAG, Comparing to Async
#### P-P, P-E

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnYkc5aFpFeHZiM0JCYm01dlJHRjBZU2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYM0F0Ymw5bGJuTmxiV0pzVEdsemRDNTBjM1pjSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVdabVEzVjBiMlptSUQwZ01DNHlLVnh1WEc1blpXNWxUR2x6ZEM1MWNFeHZiM0FnUEMwZ2RXNXBjWFZsS0NoblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9kWEJrYjNkdVgyUlVRVWRmUkUxVFR5QTlQU0JjSWxWUVhDSXBJQ1UrSlNCMWJtNWxjM1FvWjJWdVpTa3BKR2RsYm1VcFhHNW5aVzVsVEdsemRDNXViMHh2YjNBZ1BDMGdkVzVwY1hWbEtDaG5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvZFhCa2IzZHVYMlJVUVVkZlJFMVRUeUE5UFNCY0lrNVBYQ0lwSUNVK0pTQjFibTVsYzNRb1oyVnVaU2twSkdkbGJtVXBYRzVuWlc1bFRHbHpkQzVrYjNkdVRHOXZjQ0E4TFNCMWJtbHhkV1VvS0dkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaDFjR1J2ZDI1ZlpGUkJSMTlFVFZOUElEMDlJRndpUkU5WFRsd2lLU0FsUGlVZ2RXNXVaWE4wS0dkbGJtVXBLU1JuWlc1bEtWeHVYRzVjYmx4dUl5QkRTRVZEUzBsT1J5QklUMWNnVFVGT1dTQkhSVTVGVXlCUFZrVlNURUZRSUVGTlQwNUhJRlZRTDA1UEwwUlBWMDVjYm5ObGRITmZiR2x6ZENBOExTQnNhWE4wS0hWd0lEMGdaMlZ1WlV4cGMzUXVkWEJNYjI5d0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibThnUFNCblpXNWxUR2x6ZEM1dWIweHZiM0FzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2IzZHVJRDBnWjJWdVpVeHBjM1F1Wkc5M2JreHZiM0FwWEc1Y2JpTWdRM0psWVhSbElIUm9aU0JGZFd4bGNpQndiRzkwWEc1bGRXeGxjbDltYVhRZ1BDMGdaWFZzWlhJb2MyVjBjMTlzYVhOMEtWeHVjR3h2ZENobGRXeGxjbDltYVhRc1hHNGdJQ0FnSUd4aFltVnNjeUE5SUZSU1ZVVXNJQ0FqSUVScGMzQnNZWGtnYzJWMElHeGhZbVZzYzF4dUlDQWdJQ0JtYVd4c2N5QTlJRlJTVlVVc0lDQWdJeUJEYjJ4dmNpQm1hV3hzSUhSb1pTQnlaV2RwYjI1elhHNGdJQ0FnSUhGMVlXNTBhWFJwWlhNZ1BTQlVVbFZGS1Z4dVhHNWNiaU1nUjA5Y2JrZFBMblZ3SUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxUR2x6ZEM1MWNFeHZiM0FzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYQ0pGVGxORlRVSk1YQ0lzSUc5dWRDQTlJRndpUWxCY0lpbGNibVJ2ZEhCc2IzUW9SMDh1ZFhBcFhHNUhUeTV1YnlBOExTQmxibkpwWTJoSFR5aG5aVzVsSUQwZ1oyVnVaVXhwYzNRdWJtOU1iMjl3TENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRndpUlU1VFJVMUNURndpTENCdmJuUWdQU0JjSWtKUVhDSXBYRzVrYjNSd2JHOTBLRWRQTG01dktWeHVSMDh1Wkc5M2JpQThMU0JsYm5KcFkyaEhUeWhuWlc1bElEMGdaMlZ1WlV4cGMzUXVaRzkzYmt4dmIzQXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hDSkZUbE5GVFVKTVhDSXNJRzl1ZENBOUlGd2lRbEJjSWlsY2JtUnZkSEJzYjNRb1IwOHVaRzkzYmlsY2JseHVJeUJIVHlCMGJ5QnZibXg1SUhOd1pXTnBabWxqSUhOMVluTmxkRnh1WjJWdVpVeHBjM1F1ZFhCTWIyOXdMbk53WldOcFptbGpJRHd0SUhObGRHUnBabVlvWjJWdVpVeHBjM1F1ZFhCTWIyOXdMQ0IxYm1sdmJpaG5aVzVsVEdsemRDNXViMHh2YjNBc0lHZGxibVZNYVhOMExtUnZkMjVNYjI5d0tTbGNibWRsYm1WTWFYTjBMbTV2VEc5dmNDNXpjR1ZqYVdacFl5QThMU0J6WlhSa2FXWm1LR2RsYm1WTWFYTjBMbTV2VEc5dmNDd2dkVzVwYjI0b1oyVnVaVXhwYzNRdWRYQk1iMjl3TENCblpXNWxUR2x6ZEM1a2IzZHVURzl2Y0NrcFhHNW5aVzVsVEdsemRDNWtiM2R1VEc5dmNDNXpjR1ZqYVdacFl5QThMU0J6WlhSa2FXWm1LR2RsYm1WTWFYTjBMbVJ2ZDI1TWIyOXdMQ0IxYm1sdmJpaG5aVzVsVEdsemRDNXViMHh2YjNBc0lHZGxibVZNYVhOMExuVndURzl2Y0NrcFhHNUhUeTUxY0NBOExTQmxibkpwWTJoSFR5aG5aVzVsSUQwZ1oyVnVaVXhwYzNRdWRYQk1iMjl3TG5Od1pXTnBabWxqTENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRndpUlU1VFJVMUNURndpTENCdmJuUWdQU0JjSWtKUVhDSXBYRzVrYjNSd2JHOTBLRWRQTG5Wd0tWeHVSMDh1Ym04Z1BDMGdaVzV5YVdOb1IwOG9aMlZ1WlNBOUlHZGxibVZNYVhOMExtNXZURzl2Y0M1emNHVmphV1pwWXl3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lLVnh1Wkc5MGNHeHZkQ2hIVHk1dWJ5bGNia2RQTG1SdmQyNGdQQzBnWlc1eWFXTm9SMDhvWjJWdVpTQTlJR2RsYm1WTWFYTjBMbVJ2ZDI1TWIyOXdMbk53WldOcFptbGpMQ0JQY21kRVlpQTlJRzl5Wnk1TmJTNWxaeTVrWWl3Z2EyVjVWSGx3WlNBOUlGd2lSVTVUUlUxQ1RGd2lMQ0J2Ym5RZ1BTQmNJa0pRWENJcFhHNWtiM1J3Ykc5MEtFZFBMbVJ2ZDI0cFhHNWNibHh1SXlNZ1EyaGxZMnRwYm1jZ2NHVnlZMlZ1ZEdGblpTQnZaaUJpYjJKaWFXVWdaV0Z5YkhrZ1oyVnVaVnh1WEc0akl5QkpiWEJ2Y25ScGJtY2dRbTlpWW1sbElHZGxibVVnWTJ4aGMzTnBabWxqWVhScGIyNWNibWRsYm1WRGJIVnpkR1Z5SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbUp2WW1KcFpWOW5aVzVsWDJOc1lYTnphV1pwWTJGMGFXOXVMbU56ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWjJWdVpTd2daVzV6ZEN3Z1EyeDFjM1JsY2lsY2JtTnZiRzVoYldWektHZGxibVZEYkhWemRHVnlLU0E4TFNCaktGd2laMlZ1WlZ3aUxDQmNJbVZ1YzJWdFlteGZkSEpoYm5OamNtbHdkRjlwWkZ3aUxDQmNJbU5zZFhOMFpYSmNJaWxjYmx4dVhHNGpJeUJEYjI1MlpYSjBhVzVuSUhSeVlXNXpZM0pwY0hRZ1NVUWdkRzhnWjJWdVpTQkpSRnh1YVdSUVlXbHlYM1JuSUR3dElHZGxkRUpOS0dGMGRISnBZblYwWlhNZ1BTQmpLRndpWlc1elpXMWliRjkwY21GdWMyTnlhWEIwWDJsa1hDSXNJRndpWlc1elpXMWliRjluWlc1bFgybGtYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWFXeDBaWEp6SUQwZ1hDSmxibk5sYldKc1gzUnlZVzV6WTNKcGNIUmZhV1JjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnNkV1Z6SUQwZ1oyVnVaVU5zZFhOMFpYSWtaVzV6WlcxaWJGOTBjbUZ1YzJOeWFYQjBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhKMElEMGdaVzV6WlcxaWJDNTJNVEF5S1Z4dVoyVnVaVU5zZFhOMFpYSWdQQzBnWjJWdVpVTnNkWE4wWlhJZ0pUNGxJR1J3YkhseU9qcHNaV1owWDJwdmFXNG9hV1JRWVdseVgzUm5MQ0JpZVNBOUlHTW9YQ0psYm5ObGJXSnNYM1J5WVc1elkzSnBjSFJmYVdSY0lpa3BYRzVjYmlNZ1RXRnJhVzVuSUdSaGRHRWdabTl5SUhOMFlXTnJaV1FnWW1GeWNHeHZkRnh1WTI5MWJuUkhaVzVsSUR3dElHWjFibU4wYVc5dUtHZGxibVZEYkhWemRHVnlMQ0JuY205MWNFNWhiV1VzSUdOc2RYTjBaWEpPWVcxbEtYdGNiaUFnYm5WdElEd3RJRzV5YjNjb1oyVnVaVU5zZFhOMFpYSWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aVzV6WlcxaWJGOW5aVzVsWDJsa0lDVnBiaVVnWjNKdmRYQk9ZVzFsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamJIVnpkR1Z5SUNWcGJpVWdZMngxYzNSbGNrNWhiV1VwS1Z4dUlDQnlaWFIxY200b2JuVnRLVnh1ZlZ4dVkyOTFiblJIWlc1bFRHbHpkQ0E4TFNCbWRXNWpkR2x2YmloblpXNWxRMngxYzNSbGNpd2daM0p2ZFhCT1lXMWxLWHRjYmlBZ2JqRWdQQzBnWTI5MWJuUkhaVzVsS0dkbGJtVkRiSFZ6ZEdWeUxDQm5jbTkxY0U1aGJXVXNJRndpUldGeWJIbGNJaWxjYmlBZ2JqSWdQQzBnWTI5MWJuUkhaVzVsS0dkbGJtVkRiSFZ6ZEdWeUxDQm5jbTkxY0U1aGJXVXNJRndpVFdsa1pHeGxYQ0lwWEc0Z0lHNHpJRHd0WTI5MWJuUkhaVzVsS0dkbGJtVkRiSFZ6ZEdWeUxDQm5jbTkxY0U1aGJXVXNJRndpVEdGMFpWd2lLVnh1SUNCdU5DQThMU0JqYjNWdWRFZGxibVVvWjJWdVpVTnNkWE4wWlhJc0lHZHliM1Z3VG1GdFpTd2dYQ0pVY21GdWMybGxiblJjSWlsY2JpQWdjbVYwZFhKdUtHTW9iakVzSUc0eUxDQnVNeXdnYmpRcEtWeHVmVnh1WEc1bmNtOTFjQ0E4TFNCaktISmxjQ2hjSW5Wd1hDSXNJRFFwTENCeVpYQW9YQ0p1YjF3aUxDQTBLU3dnY21Wd0tGd2laRzkzYmx3aUxDQTBLU2xjYm1Oc2RYTjBaWElnUEMwZ2NtVndLR01vWENKRllYSnNlVndpTENCY0lrMXBaR1JzWlZ3aUxDQmNJa3hoZEdWY0lpd2dYQ0pVY21GdWMybGxiblJjSWlrc0lETXBYRzVqYkhWemRHVnlJRHd0SUdaaFkzUnZjaWhqYkhWemRHVnlMQ0JzWlhabGJITWdQU0JqS0Z3aVJXRnliSGxjSWl3Z1hDSk5hV1JrYkdWY0lpd2dYQ0pNWVhSbFhDSXNJRndpVkhKaGJuTnBaVzUwWENJcEtWeHVkbUZzZFdVZ1BDMGdZeWhqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0JuWlc1bFRHbHpkQzUxY0V4dmIzQXBMRnh1SUNBZ0lDQWdJQ0FnSUNCamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCblpXNWxUR2x6ZEM1dWIweHZiM0FwTEZ4dUlDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQm5aVzVsVEdsemRDNWtiM2R1VEc5dmNDa3BYRzVjYm1SaGRHRWdQQzBnWkdGMFlTNW1jbUZ0WlNobmNtOTFjQ3dnWTJ4MWMzUmxjaXdnZG1Gc2RXVXBYRzVuWjNCc2IzUW9aR0YwWVN3Z1lXVnpLR1pwYkd3OVkyeDFjM1JsY2l3Z2VUMTJZV3gxWlN3Z2VEMW5jbTkxY0NrcElDc2dYRzRnSUNBZ1oyVnZiVjlpWVhJb2NHOXphWFJwYjI0OVhDSnpkR0ZqYTF3aUxDQnpkR0YwSUQwZ1hDSnBaR1Z1ZEdsMGVWd2lLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LVnh1WjJkd2JHOTBLR1JoZEdFc0lHRmxjeWhtYVd4c1BXTnNkWE4wWlhJc0lIazlkbUZzZFdVc0lIZzlaM0p2ZFhBcEtTQXJJRnh1SUNBZ0lHZGxiMjFmWW1GeUtIQnZjMmwwYVc5dVBWd2labWxzYkZ3aUxDQnpkR0YwSUQwZ1hDSnBaR1Z1ZEdsMGVWd2lLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LVnh1WEc1MllXeDFaU0E4TFNCaktHTnZkVzUwUjJWdVpVeHBjM1FvWjJWdVpVTnNkWE4wWlhJc0lHZGxibVZNYVhOMExuVndURzl2Y0M1emNHVmphV1pwWXlrc1hHNGdJQ0FnSUNBZ0lDQWdJR052ZFc1MFIyVnVaVXhwYzNRb1oyVnVaVU5zZFhOMFpYSXNJR2RsYm1WTWFYTjBMbTV2VEc5dmNDNXpjR1ZqYVdacFl5a3NYRzRnSUNBZ0lDQWdJQ0FnSUdOdmRXNTBSMlZ1WlV4cGMzUW9aMlZ1WlVOc2RYTjBaWElzSUdkbGJtVk1hWE4wTG1SdmQyNU1iMjl3TG5Od1pXTnBabWxqS1NsY2JseHVaR0YwWVNBOExTQmtZWFJoTG1aeVlXMWxLR2R5YjNWd0xDQmpiSFZ6ZEdWeUxDQjJZV3gxWlNsY2JpTWdVR3h2ZEhScGJtZGNibWRuY0d4dmRDaGtZWFJoTENCaFpYTW9abWxzYkQxamJIVnpkR1Z5TENCNVBYWmhiSFZsTENCNFBXZHliM1Z3S1NrZ0t5QmNiaUFnSUNCblpXOXRYMkpoY2lod2IzTnBkR2x2YmoxY0luTjBZV05yWENJc0lITjBZWFFnUFNCY0ltbGtaVzUwYVhSNVhDSXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BYRzVuWjNCc2IzUW9aR0YwWVN3Z1lXVnpLR1pwYkd3OVkyeDFjM1JsY2l3Z2VUMTJZV3gxWlN3Z2VEMW5jbTkxY0NrcElDc2dYRzRnSUNBZ1oyVnZiVjlpWVhJb2NHOXphWFJwYjI0OVhDSm1hV3hzWENJc0lITjBZWFFnUFNCY0ltbGtaVzUwYVhSNVhDSXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BYRzVjYmx4dVhHNGpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWdRMmhsWTJ0cGJtY2dhRzkzSUhSb2IzTmxJR2RsYm1WeklHSmxhR0YyWlNCcGJpQkJORGcxWEc1a2FXWm1MbEpPUVNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0prYVdabVgwY3hMa0UwT0RVdWMyVnNaV04wWldReVgwY3hMakpwTGtFME9EVmZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHVnVjMlZ0WW14ZloyVnVaVjlwWkN3Z2JHOW5Na1p2YkdSRGFHRnVaMlVzSUhOb2NtbHVhMlZrWDJ4dlp6SkdReXdnY0dGa2Fpd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxLVnh1WEc1aGJIQm9ZU0E4TFNBd0xqQTFYRzVtWTBOMWRHOW1aaUE4TFNBd0xqVmNibVJwWm1ZdVVrNUJMbTkxZENBOExTQmthV1ptTGxKT1FTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGthV1ptSUQwZ1kyRnpaVjkzYUdWdUtIQmhaR29nUENCaGJIQm9ZU0FtSUhOb2NtbHVhMlZrWDJ4dlp6SkdReUErSUdaalEzVjBiMlptSUg0Z1hDSlZVRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd1lXUnFJRHdnWVd4d2FHRWdKaUJ6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0F0Wm1ORGRYUnZabVlnZmlCY0lrUlBWMDVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ZGSlZSU0IrSUZ3aVRrOWNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCblpXNWxSM0p2ZFhBZ1BTQmpZWE5sWDNkb1pXNG9aVzV6WlcxaWJGOW5aVzVsWDJsa0lDVnBiaVVnWjJWdVpVeHBjM1F1ZFhCTWIyOXdJSDRnWENKamIyaGxjMmx1TFhWd1RHOXZjRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1Z1YzJWdFlteGZaMlZ1WlY5cFpDQWxhVzRsSUdkbGJtVk1hWE4wTG01dlRHOXZjQ0IrSUZ3aVkyOW9aWE5wYmkxdWIweHZiM0JjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYm5ObGJXSnNYMmRsYm1WZmFXUWdKV2x1SlNCblpXNWxUR2x6ZEM1a2IzZHVURzl2Y0NCK0lGd2lZMjlvWlhOcGJpMWtiM2R1VEc5dmNGd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlNWVVVnZmlCY0lrNUJYQ0lwS1Z4dVhHNWNibWRuY0d4dmRDaGthV1ptTGxKT1FTNXZkWFFzSUdGbGN5aDRJRDBnWjJWdVpVZHliM1Z3TENCbWFXeHNJRDBnWkdsbVppa3BJQ3RjYmlBZ1oyVnZiVjlpWVhJb2NHOXphWFJwYjI0OVhDSm1hV3hzWENJcElDc2dkR2hsYldWZlluY29LVnh1WEc1Y2JuVndURzl2Y0M1a2IzZHVVR1Z5WXlBOExTQnVjbTkzS0dScFptWXVVazVCTG05MWRDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5aVzVsUjNKdmRYQWdQVDBnWENKamIyaGxjMmx1TFhWd1RHOXZjRndpTENCa2FXWm1JRDA5SUZ3aVJFOVhUbHdpS1NrdmJuSnZkeWhrYVdabUxsSk9RUzV2ZFhRZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1oyVnVaVWR5YjNWd0lEMDlJRndpWTI5b1pYTnBiaTExY0V4dmIzQmNJaWtwWEc1MWNFeHZiM0F1ZFhCUVpYSmpJRHd0SUc1eWIzY29aR2xtWmk1U1RrRXViM1YwSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkbGJtVkhjbTkxY0NBOVBTQmNJbU52YUdWemFXNHRkWEJNYjI5d1hDSXNJR1JwWm1ZZ1BUMGdYQ0pWVUZ3aUtTa3Zibkp2ZHloa2FXWm1MbEpPUVM1dmRYUWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aMlZ1WlVkeWIzVndJRDA5SUZ3aVkyOW9aWE5wYmkxMWNFeHZiM0JjSWlrcFhHNWNibTV2VEc5dmNDNWtiM2R1VUdWeVl5QThMU0J1Y205M0tHUnBabVl1VWs1QkxtOTFkQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuWlc1bFIzSnZkWEFnUFQwZ1hDSmpiMmhsYzJsdUxXNXZURzl2Y0Z3aUxDQmthV1ptSUQwOUlGd2lSRTlYVGx3aUtTa3Zibkp2ZHloa2FXWm1MbEpPUVM1dmRYUWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aMlZ1WlVkeWIzVndJRDA5SUZ3aVkyOW9aWE5wYmkxdWIweHZiM0JjSWlrcFhHNXViMHh2YjNBdWRYQlFaWEpqSUR3dElHNXliM2NvWkdsbVppNVNUa0V1YjNWMElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZGxibVZIY205MWNDQTlQU0JjSW1OdmFHVnphVzR0Ym05TWIyOXdYQ0lzSUdScFptWWdQVDBnWENKVlVGd2lLU2t2Ym5KdmR5aGthV1ptTGxKT1FTNXZkWFFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjJWdVpVZHliM1Z3SUQwOUlGd2lZMjlvWlhOcGJpMXViMHh2YjNCY0lpa3BYRzVjYm1SdmQyNU1iMjl3TG1SdmQyNVFaWEpqSUR3dElHNXliM2NvWkdsbVppNVNUa0V1YjNWMElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZGxibVZIY205MWNDQTlQU0JjSW1OdmFHVnphVzR0Wkc5M2JreHZiM0JjSWl3Z1pHbG1aaUE5UFNCY0lrUlBWMDVjSWlrcEwyNXliM2NvWkdsbVppNVNUa0V1YjNWMElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZGxibVZIY205MWNDQTlQU0JjSW1OdmFHVnphVzR0Wkc5M2JreHZiM0JjSWlrcFhHNWtiM2R1VEc5dmNDNTFjRkJsY21NZ1BDMGdibkp2ZHloa2FXWm1MbEpPUVM1dmRYUWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aMlZ1WlVkeWIzVndJRDA5SUZ3aVkyOW9aWE5wYmkxa2IzZHVURzl2Y0Z3aUxDQmthV1ptSUQwOUlGd2lWVkJjSWlrcEwyNXliM2NvWkdsbVppNVNUa0V1YjNWMElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZGxibVZIY205MWNDQTlQU0JjSW1OdmFHVnphVzR0Wkc5M2JreHZiM0JjSWlrcFhHNWNibHh1WkdGMFlTQThMU0IwYVdKaWJHVW9aMlZ1WlVkeWIzVndJRDBnWXloY0ltTnZhR1Z6YVc0dGRYQk1iMjl3WENJc0lGd2lZMjlvWlhOcGJpMTFjRXh2YjNCY0lpd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0ltTnZhR1Z6YVc0dGJtOU1iMjl3WENJc0lGd2lZMjlvWlhOcGJpMXViMHh2YjNCY0lpd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0ltTnZhR1Z6YVc0dFpHOTNia3h2YjNCY0lpd2dYQ0pqYjJobGMybHVMV1J2ZDI1TWIyOXdYQ0lwTEZ4dUlDQWdJQ0FnSUdScFptWWdQU0J5WlhBb1l5aGNJa1JQVjA1Y0lpd2dYQ0pWVUZ3aUtTd2dNeWtzWEc0Z0lDQWdJQ0FnY0dWeVl5QTlJR01vZFhCTWIyOXdMbVJ2ZDI1UVpYSmpMQ0IxY0V4dmIzQXVkWEJRWlhKakxDQnViMHh2YjNBdVpHOTNibEJsY21Nc0lHNXZURzl2Y0M1MWNGQmxjbU1zSUdSdmQyNU1iMjl3TG1SdmQyNVFaWEpqTENCa2IzZHVURzl2Y0M1MWNGQmxjbU1wS2pFd01DbGNibHh1WjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1oyVnVaVWR5YjNWd0xDQjVJRDBnY0dWeVl5d2dabWxzYkNBOUlHUnBabVlnS1NrZ0sxeHVJQ0JuWlc5dFgySmhjaWh6ZEdGMElEMGdYQ0pwWkdWdWRHbDBlVndpTENCd2IzTnBkR2x2YmlBOUlGd2laRzlrWjJWY0lpa2dLeUIwYUdWdFpWOWlkeWdwWEc1Y2JseHVYRzVjYm1kbGJtVk1hWE4wTG01dlRHOXZjRlZ1YVhGMVpTQThMU0JuWlc1bFRHbHpkQzV1YjB4dmIzQmJJV2RsYm1WTWFYTjBMbTV2VEc5dmNDQWxhVzRsSUhWdWFYRjFaU2hqS0dkbGJtVk1hWE4wTG1SdmQyNU1iMjl3TENCblpXNWxUR2x6ZEM1MWNFeHZiM0FwS1YxY2JtZGxibVZNYVhOMExtUnZkMjVNYjI5d1ZXNXBjWFZsSUR3dElHZGxibVZNYVhOMExtUnZkMjVNYjI5d1d5Rm5aVzVsVEdsemRDNWtiM2R1VEc5dmNDQWxhVzRsSUhWdWFYRjFaU2hqS0dkbGJtVk1hWE4wTG01dlRHOXZjQ3dnWjJWdVpVeHBjM1F1ZFhCTWIyOXdLU2xkWEc1blpXNWxUR2x6ZEM1MWNFeHZiM0JWYm1seGRXVWdQQzBnWjJWdVpVeHBjM1F1ZFhCTWIyOXdXeUZuWlc1bFRHbHpkQzUxY0V4dmIzQWdKV2x1SlNCMWJtbHhkV1VvWXloblpXNWxUR2x6ZEM1dWIweHZiM0FzSUdkbGJtVk1hWE4wTG1SdmQyNU1iMjl3S1NsZFhHNWNibVJwWm1ZdVVrNUJMbTkxZENBOExTQmthV1ptTGxKT1FTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGthV1ptSUQwZ1kyRnpaVjkzYUdWdUtIQmhaR29nUENCaGJIQm9ZU0FtSUhOb2NtbHVhMlZrWDJ4dlp6SkdReUErSUdaalEzVjBiMlptSUg0Z1hDSlZVRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd1lXUnFJRHdnWVd4d2FHRWdKaUJ6YUhKcGJtdGxaRjlzYjJjeVJrTWdQQ0F0Wm1ORGRYUnZabVlnZmlCY0lrUlBWMDVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ZGSlZSU0IrSUZ3aVRrOWNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCblpXNWxSM0p2ZFhBZ1BTQmpZWE5sWDNkb1pXNG9aVzV6WlcxaWJGOW5aVzVsWDJsa0lDVnBiaVVnWjJWdVpVeHBjM1F1ZFhCTWIyOXdWVzVwY1hWbElDQitJRndpWTI5b1pYTnBiaTExY0V4dmIzQmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxibk5sYldKc1gyZGxibVZmYVdRZ0pXbHVKU0JuWlc1bFRHbHpkQzV1YjB4dmIzQlZibWx4ZFdVZ2ZpQmNJbU52YUdWemFXNHRibTlNYjI5d1hDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pXNXpaVzFpYkY5blpXNWxYMmxrSUNWcGJpVWdaMlZ1WlV4cGMzUXVaRzkzYmt4dmIzQlZibWx4ZFdVZ2ZpQmNJbU52YUdWemFXNHRaRzkzYmt4dmIzQmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVbFZGSUg0Z1hDSk9RVndpS1NsY2JseHVYRzVuWjNCc2IzUW9aR2xtWmk1U1RrRXViM1YwTENCaFpYTW9lQ0E5SUdkbGJtVkhjbTkxY0N3Z1ptbHNiQ0E5SUdScFptWXBLU0FyWEc0Z0lHZGxiMjFmWW1GeUtIQnZjMmwwYVc5dVBWd2labWxzYkZ3aUtTQXJJSFJvWlcxbFgySjNLQ2xjYmx4dVhHNTFjRXh2YjNBdVpHOTNibEJsY21NZ1BDMGdibkp2ZHloa2FXWm1MbEpPUVM1dmRYUWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aMlZ1WlVkeWIzVndJRDA5SUZ3aVkyOW9aWE5wYmkxMWNFeHZiM0JjSWl3Z1pHbG1aaUE5UFNCY0lrUlBWMDVjSWlrcEwyNXliM2NvWkdsbVppNVNUa0V1YjNWMElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZGxibVZIY205MWNDQTlQU0JjSW1OdmFHVnphVzR0ZFhCTWIyOXdYQ0lwS1Z4dWRYQk1iMjl3TG5Wd1VHVnlZeUE4TFNCdWNtOTNLR1JwWm1ZdVVrNUJMbTkxZENBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loblpXNWxSM0p2ZFhBZ1BUMGdYQ0pqYjJobGMybHVMWFZ3VEc5dmNGd2lMQ0JrYVdabUlEMDlJRndpVlZCY0lpa3BMMjV5YjNjb1pHbG1aaTVTVGtFdWIzVjBJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2RsYm1WSGNtOTFjQ0E5UFNCY0ltTnZhR1Z6YVc0dGRYQk1iMjl3WENJcEtWeHVYRzV1YjB4dmIzQXVaRzkzYmxCbGNtTWdQQzBnYm5KdmR5aGthV1ptTGxKT1FTNXZkWFFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjJWdVpVZHliM1Z3SUQwOUlGd2lZMjlvWlhOcGJpMXViMHh2YjNCY0lpd2daR2xtWmlBOVBTQmNJa1JQVjA1Y0lpa3BMMjV5YjNjb1pHbG1aaTVTVGtFdWIzVjBJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2RsYm1WSGNtOTFjQ0E5UFNCY0ltTnZhR1Z6YVc0dGJtOU1iMjl3WENJcEtWeHVibTlNYjI5d0xuVndVR1Z5WXlBOExTQnVjbTkzS0dScFptWXVVazVCTG05MWRDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5aVzVsUjNKdmRYQWdQVDBnWENKamIyaGxjMmx1TFc1dlRHOXZjRndpTENCa2FXWm1JRDA5SUZ3aVZWQmNJaWtwTDI1eWIzY29aR2xtWmk1U1RrRXViM1YwSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkbGJtVkhjbTkxY0NBOVBTQmNJbU52YUdWemFXNHRibTlNYjI5d1hDSXBLVnh1WEc1a2IzZHVURzl2Y0M1a2IzZHVVR1Z5WXlBOExTQnVjbTkzS0dScFptWXVVazVCTG05MWRDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5aVzVsUjNKdmRYQWdQVDBnWENKamIyaGxjMmx1TFdSdmQyNU1iMjl3WENJc0lHUnBabVlnUFQwZ1hDSkVUMWRPWENJcEtTOXVjbTkzS0dScFptWXVVazVCTG05MWRDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5aVzVsUjNKdmRYQWdQVDBnWENKamIyaGxjMmx1TFdSdmQyNU1iMjl3WENJcEtWeHVaRzkzYmt4dmIzQXVkWEJRWlhKaklEd3RJRzV5YjNjb1pHbG1aaTVTVGtFdWIzVjBJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2RsYm1WSGNtOTFjQ0E5UFNCY0ltTnZhR1Z6YVc0dFpHOTNia3h2YjNCY0lpd2daR2xtWmlBOVBTQmNJbFZRWENJcEtTOXVjbTkzS0dScFptWXVVazVCTG05MWRDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5aVzVsUjNKdmRYQWdQVDBnWENKamIyaGxjMmx1TFdSdmQyNU1iMjl3WENJcEtWeHVYRzVjYm1SaGRHRWdQQzBnZEdsaVlteGxLR2RsYm1WSGNtOTFjQ0E5SUdNb1hDSmpiMmhsYzJsdUxYVndURzl2Y0Z3aUxDQmNJbU52YUdWemFXNHRkWEJNYjI5d1hDSXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSmpiMmhsYzJsdUxXNXZURzl2Y0Z3aUxDQmNJbU52YUdWemFXNHRibTlNYjI5d1hDSXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSmpiMmhsYzJsdUxXUnZkMjVNYjI5d1hDSXNJRndpWTI5b1pYTnBiaTFrYjNkdVRHOXZjRndpS1N4Y2JpQWdJQ0FnSUNCa2FXWm1JRDBnY21Wd0tHTW9YQ0pFVDFkT1hDSXNJRndpVlZCY0lpa3NJRE1wTEZ4dUlDQWdJQ0FnSUhCbGNtTWdQU0JqS0hWd1RHOXZjQzVrYjNkdVVHVnlZeXdnZFhCTWIyOXdMblZ3VUdWeVl5d2dibTlNYjI5d0xtUnZkMjVRWlhKakxDQnViMHh2YjNBdWRYQlFaWEpqTENCa2IzZHVURzl2Y0M1a2IzZHVVR1Z5WXl3Z1pHOTNia3h2YjNBdWRYQlFaWEpqS1NveE1EQXBYRzVjYm1kbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlHZGxibVZIY205MWNDd2dlU0E5SUhCbGNtTXNJR1pwYkd3Z1BTQmthV1ptSUNrcElDdGNiaUFnWjJWdmJWOWlZWElvYzNSaGRDQTlJRndpYVdSbGJuUnBkSGxjSWl3Z2NHOXphWFJwYjI0Z1BTQmNJbVJ2WkdkbFhDSXBJQ3NnZEdobGJXVmZZbmNvS1Z4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yKVxuXG5nZW5lTGlzdC51cExvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXFVQXFwpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpXG5nZW5lTGlzdC5ub0xvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXE5PXFwpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpXG5nZW5lTGlzdC5kb3duTG9vcCA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fZFRBR19ETVNPID09IFxcRE9XTlxcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuXG5cblxuIyBDSEVDS0lORyBIT1cgTUFOWSBHRU5FUyBPVkVSTEFQIEFNT05HIFVQL05PL0RPV05cbnNldHNfbGlzdCA8LSBsaXN0KHVwID0gZ2VuZUxpc3QudXBMb29wLFxuICAgICAgICAgICAgICAgICAgbm8gPSBnZW5lTGlzdC5ub0xvb3AsXG4gICAgICAgICAgICAgICAgICBkb3duID0gZ2VuZUxpc3QuZG93bkxvb3ApXG5cbiMgQ3JlYXRlIHRoZSBFdWxlciBwbG90XG5ldWxlcl9maXQgPC0gZXVsZXIoc2V0c19saXN0KVxucGxvdChldWxlcl9maXQsXG4gICAgIGxhYmVscyA9IFRSVUUsICAjIERpc3BsYXkgc2V0IGxhYmVsc1xuICAgICBmaWxscyA9IFRSVUUsICAgIyBDb2xvciBmaWxsIHRoZSByZWdpb25zXG4gICAgIHF1YW50aXRpZXMgPSBUUlVFKVxuXG5cbiMgR09cbkdPLnVwIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC51cExvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08udXApXG5HTy5ubyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3Qubm9Mb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLm5vKVxuR08uZG93biA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuZG93bkxvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08uZG93bilcblxuIyBHTyB0byBvbmx5IHNwZWNpZmljIHN1YnNldFxuZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljIDwtIHNldGRpZmYoZ2VuZUxpc3QudXBMb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSlcbmdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0Lm5vTG9vcCwgdW5pb24oZ2VuZUxpc3QudXBMb29wLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5nZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0LmRvd25Mb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LnVwTG9vcCkpXG5HTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLnVwKVxuR08ubm8gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5ubylcbkdPLmRvd24gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLmRvd24pXG5cblxuIyMgQ2hlY2tpbmcgcGVyY2VudGFnZSBvZiBib2JiaWUgZWFybHkgZ2VuZVxuXG4jIyBJbXBvcnRpbmcgQm9iYmllIGdlbmUgY2xhc3NpZmljYXRpb25cbmdlbmVDbHVzdGVyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGJvYmJpZV9nZW5lX2NsYXNzaWZpY2F0aW9uLmNzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZ2VuZSwgZW5zdCwgQ2x1c3RlcilcbmNvbG5hbWVzKGdlbmVDbHVzdGVyKSA8LSBjKFxcZ2VuZVxcLCBcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcLCBcXGNsdXN0ZXJcXClcblxuXG4jIyBDb252ZXJ0aW5nIHRyYW5zY3JpcHQgSUQgdG8gZ2VuZSBJRFxuaWRQYWlyX3RnIDwtIGdldEJNKGF0dHJpYnV0ZXMgPSBjKFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwsIFxcZW5zZW1ibF9nZW5lX2lkXFwpLFxuICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCxcbiAgICAgICAgICAgICAgICAgdmFsdWVzID0gZ2VuZUNsdXN0ZXIkZW5zZW1ibF90cmFuc2NyaXB0LFxuICAgICAgICAgICAgICAgICBtYXJ0ID0gZW5zZW1ibC52MTAyKVxuZ2VuZUNsdXN0ZXIgPC0gZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oaWRQYWlyX3RnLCBieSA9IGMoXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCkpXG5cbiMgTWFraW5nIGRhdGEgZm9yIHN0YWNrZWQgYmFycGxvdFxuY291bnRHZW5lIDwtIGZ1bmN0aW9uKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIGNsdXN0ZXJOYW1lKXtcbiAgbnVtIDwtIG5yb3coZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibF9nZW5lX2lkICVpbiUgZ3JvdXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyICVpbiUgY2x1c3Rlck5hbWUpKVxuICByZXR1cm4obnVtKVxufVxuY291bnRHZW5lTGlzdCA8LSBmdW5jdGlvbihnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lKXtcbiAgbjEgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcRWFybHlcXClcbiAgbjIgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcTWlkZGxlXFwpXG4gIG4zIDwtY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcTGF0ZVxcKVxuICBuNCA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgXFxUcmFuc2llbnRcXClcbiAgcmV0dXJuKGMobjEsIG4yLCBuMywgbjQpKVxufVxuXG5ncm91cCA8LSBjKHJlcChcXHVwXFwsIDQpLCByZXAoXFxub1xcLCA0KSwgcmVwKFxcZG93blxcLCA0KSlcbmNsdXN0ZXIgPC0gcmVwKGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCksIDMpXG5jbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpKVxudmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC51cExvb3ApLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5ub0xvb3ApLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5cbmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxzdGFja1xcLCBzdGF0ID0gXFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuZ2dwbG90KGRhdGEsIGFlcyhmaWxsPWNsdXN0ZXIsIHk9dmFsdWUsIHg9Z3JvdXApKSArIFxuICAgIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcLCBzdGF0ID0gXFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYyksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYyksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljKSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcbiMgUGxvdHRpbmdcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXHN0YWNrXFwsIHN0YXQgPSBcXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQgPSBcXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMgQ2hlY2tpbmcgaG93IHRob3NlIGdlbmVzIGJlaGF2ZSBpbiBBNDg1XG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUk5BLm91dCA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShkaWZmID0gY2FzZV93aGVuKHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmIH4gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYgfiBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFxcTk9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lR3JvdXAgPSBjYXNlX3doZW4oZW5zZW1ibF9nZW5lX2lkICVpbiUgZ2VuZUxpc3QudXBMb29wIH4gXFxjb2hlc2luLXVwTG9vcFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmVMaXN0Lm5vTG9vcCB+IFxcY29oZXNpbi1ub0xvb3BcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lTGlzdC5kb3duTG9vcCB+IFxcY29oZXNpbi1kb3duTG9vcFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBcXE5BXFwpKVxuXG5cbmdncGxvdChkaWZmLlJOQS5vdXQsIGFlcyh4ID0gZ2VuZUdyb3VwLCBmaWxsID0gZGlmZikpICtcbiAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwpICsgdGhlbWVfYncoKVxuXG5cbnVwTG9vcC5kb3duUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLXVwTG9vcFxcLCBkaWZmID09IFxcRE9XTlxcKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi11cExvb3BcXCkpXG51cExvb3AudXBQZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tdXBMb29wXFwsIGRpZmYgPT0gXFxVUFxcKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi11cExvb3BcXCkpXG5cbm5vTG9vcC5kb3duUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLW5vTG9vcFxcLCBkaWZmID09IFxcRE9XTlxcKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi1ub0xvb3BcXCkpXG5ub0xvb3AudXBQZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tbm9Mb29wXFwsIGRpZmYgPT0gXFxVUFxcKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi1ub0xvb3BcXCkpXG5cbmRvd25Mb29wLmRvd25QZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tZG93bkxvb3BcXCwgZGlmZiA9PSBcXERPV05cXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tZG93bkxvb3BcXCkpXG5kb3duTG9vcC51cFBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi1kb3duTG9vcFxcLCBkaWZmID09IFxcVVBcXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tZG93bkxvb3BcXCkpXG5cblxuZGF0YSA8LSB0aWJibGUoZ2VuZUdyb3VwID0gYyhcXGNvaGVzaW4tdXBMb29wXFwsIFxcY29oZXNpbi11cExvb3BcXCwgXG4gICAgICAgICAgICAgICAgICAgICBcXGNvaGVzaW4tbm9Mb29wXFwsIFxcY29oZXNpbi1ub0xvb3BcXCwgXG4gICAgICAgICAgICAgICAgICAgICBcXGNvaGVzaW4tZG93bkxvb3BcXCwgXFxjb2hlc2luLWRvd25Mb29wXFwpLFxuICAgICAgIGRpZmYgPSByZXAoYyhcXERPV05cXCwgXFxVUFxcKSwgMyksXG4gICAgICAgcGVyYyA9IGModXBMb29wLmRvd25QZXJjLCB1cExvb3AudXBQZXJjLCBub0xvb3AuZG93blBlcmMsIG5vTG9vcC51cFBlcmMsIGRvd25Mb29wLmRvd25QZXJjLCBkb3duTG9vcC51cFBlcmMpKjEwMClcblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ2VuZUdyb3VwLCB5ID0gcGVyYywgZmlsbCA9IGRpZmYgKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBwb3NpdGlvbiA9IFxcZG9kZ2VcXCkgKyB0aGVtZV9idygpXG5cblxuXG5cbmdlbmVMaXN0Lm5vTG9vcFVuaXF1ZSA8LSBnZW5lTGlzdC5ub0xvb3BbIWdlbmVMaXN0Lm5vTG9vcCAlaW4lIHVuaXF1ZShjKGdlbmVMaXN0LmRvd25Mb29wLCBnZW5lTGlzdC51cExvb3ApKV1cbmdlbmVMaXN0LmRvd25Mb29wVW5pcXVlIDwtIGdlbmVMaXN0LmRvd25Mb29wWyFnZW5lTGlzdC5kb3duTG9vcCAlaW4lIHVuaXF1ZShjKGdlbmVMaXN0Lm5vTG9vcCwgZ2VuZUxpc3QudXBMb29wKSldXG5nZW5lTGlzdC51cExvb3BVbmlxdWUgPC0gZ2VuZUxpc3QudXBMb29wWyFnZW5lTGlzdC51cExvb3AgJWluJSB1bmlxdWUoYyhnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSldXG5cbmRpZmYuUk5BLm91dCA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShkaWZmID0gY2FzZV93aGVuKHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmIH4gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYgfiBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFxcTk9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lR3JvdXAgPSBjYXNlX3doZW4oZW5zZW1ibF9nZW5lX2lkICVpbiUgZ2VuZUxpc3QudXBMb29wVW5pcXVlICB+IFxcY29oZXNpbi11cExvb3BcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lTGlzdC5ub0xvb3BVbmlxdWUgfiBcXGNvaGVzaW4tbm9Mb29wXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zZW1ibF9nZW5lX2lkICVpbiUgZ2VuZUxpc3QuZG93bkxvb3BVbmlxdWUgfiBcXGNvaGVzaW4tZG93bkxvb3BcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gXFxOQVxcKSlcblxuXG5nZ3Bsb3QoZGlmZi5STkEub3V0LCBhZXMoeCA9IGdlbmVHcm91cCwgZmlsbCA9IGRpZmYpKSArXG4gIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcKSArIHRoZW1lX2J3KClcblxuXG51cExvb3AuZG93blBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi11cExvb3BcXCwgZGlmZiA9PSBcXERPV05cXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tdXBMb29wXFwpKVxudXBMb29wLnVwUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLXVwTG9vcFxcLCBkaWZmID09IFxcVVBcXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tdXBMb29wXFwpKVxuXG5ub0xvb3AuZG93blBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi1ub0xvb3BcXCwgZGlmZiA9PSBcXERPV05cXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tbm9Mb29wXFwpKVxubm9Mb29wLnVwUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLW5vTG9vcFxcLCBkaWZmID09IFxcVVBcXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tbm9Mb29wXFwpKVxuXG5kb3duTG9vcC5kb3duUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLWRvd25Mb29wXFwsIGRpZmYgPT0gXFxET1dOXFwpKS9ucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLWRvd25Mb29wXFwpKVxuZG93bkxvb3AudXBQZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tZG93bkxvb3BcXCwgZGlmZiA9PSBcXFVQXFwpKS9ucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLWRvd25Mb29wXFwpKVxuXG5cbmRhdGEgPC0gdGliYmxlKGdlbmVHcm91cCA9IGMoXFxjb2hlc2luLXVwTG9vcFxcLCBcXGNvaGVzaW4tdXBMb29wXFwsIFxuICAgICAgICAgICAgICAgICAgICAgXFxjb2hlc2luLW5vTG9vcFxcLCBcXGNvaGVzaW4tbm9Mb29wXFwsIFxuICAgICAgICAgICAgICAgICAgICAgXFxjb2hlc2luLWRvd25Mb29wXFwsIFxcY29oZXNpbi1kb3duTG9vcFxcKSxcbiAgICAgICBkaWZmID0gcmVwKGMoXFxET1dOXFwsIFxcVVBcXCksIDMpLFxuICAgICAgIHBlcmMgPSBjKHVwTG9vcC5kb3duUGVyYywgdXBMb29wLnVwUGVyYywgbm9Mb29wLmRvd25QZXJjLCBub0xvb3AudXBQZXJjLCBkb3duTG9vcC5kb3duUGVyYywgZG93bkxvb3AudXBQZXJjKSoxMDApXG5cbmdncGxvdChkYXRhLCBhZXMoeCA9IGdlbmVHcm91cCwgeSA9IHBlcmMsIGZpbGwgPSBkaWZmICkpICtcbiAgZ2VvbV9iYXIoc3RhdCA9IFxcaWRlbnRpdHlcXCwgcG9zaXRpb24gPSBcXGRvZGdlXFwpICsgdGhlbWVfYncoKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2)

geneList.upLoop <- unique((geneAnnoData %>% dplyr::filter(updown_dTAG_DMSO == \UP\) %>% unnest(gene))$gene)
geneList.noLoop <- unique((geneAnnoData %>% dplyr::filter(updown_dTAG_DMSO == \NO\) %>% unnest(gene))$gene)
geneList.downLoop <- unique((geneAnnoData %>% dplyr::filter(updown_dTAG_DMSO == \DOWN\) %>% unnest(gene))$gene)



# CHECKING HOW MANY GENES OVERLAP AMONG UP/NO/DOWN
sets_list <- list(up = geneList.upLoop,
                  no = geneList.noLoop,
                  down = geneList.downLoop)

# Create the Euler plot
euler_fit <- euler(sets_list)
plot(euler_fit,
     labels = TRUE,  # Display set labels
     fills = TRUE,   # Color fill the regions
     quantities = TRUE)


# GO
GO.up <- enrichGO(gene = geneList.upLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down)

# GO to only specific subset
geneList.upLoop.specific <- setdiff(geneList.upLoop, union(geneList.noLoop, geneList.downLoop))
geneList.noLoop.specific <- setdiff(geneList.noLoop, union(geneList.upLoop, geneList.downLoop))
geneList.downLoop.specific <- setdiff(geneList.downLoop, union(geneList.noLoop, geneList.upLoop))
GO.up <- enrichGO(gene = geneList.upLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down)


## Checking percentage of bobbie early gene

## Importing Bobbie gene classification
geneCluster <- fread(here(refDir, \bobbie_gene_classification.csv\)) %>%
  dplyr::select(gene, enst, Cluster)
colnames(geneCluster) <- c(\gene\, \ensembl_transcript_id\, \cluster\)


## Converting transcript ID to gene ID
idPair_tg <- getBM(attributes = c(\ensembl_transcript_id\, \ensembl_gene_id\),
                 filters = \ensembl_transcript_id\,
                 values = geneCluster$ensembl_transcript,
                 mart = ensembl.v102)
geneCluster <- geneCluster %>% dplyr::left_join(idPair_tg, by = c(\ensembl_transcript_id\))

# Making data for stacked barplot
countGene <- function(geneCluster, groupName, clusterName){
  num <- nrow(geneCluster %>% dplyr::filter(ensembl_gene_id %in% groupName,
                                            cluster %in% clusterName))
  return(num)
}
countGeneList <- function(geneCluster, groupName){
  n1 <- countGene(geneCluster, groupName, \Early\)
  n2 <- countGene(geneCluster, groupName, \Middle\)
  n3 <-countGene(geneCluster, groupName, \Late\)
  n4 <- countGene(geneCluster, groupName, \Transient\)
  return(c(n1, n2, n3, n4))
}

group <- c(rep(\up\, 4), rep(\no\, 4), rep(\down\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 3)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, geneList.upLoop),
           countGeneList(geneCluster, geneList.noLoop),
           countGeneList(geneCluster, geneList.downLoop))

data <- data.frame(group, cluster, value)
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\stack\, stat = \identity\) + theme_classic()
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat = \identity\) + theme_classic()

value <- c(countGeneList(geneCluster, geneList.upLoop.specific),
           countGeneList(geneCluster, geneList.noLoop.specific),
           countGeneList(geneCluster, geneList.downLoop.specific))

data <- data.frame(group, cluster, value)
# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\stack\, stat = \identity\) + theme_classic()
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat = \identity\) + theme_classic()



################## Checking how those genes behave in A485
diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

alpha <- 0.05
fcCutoff <- 0.5
diff.RNA.out <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                            padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                            TRUE ~ \NO\),
                           geneGroup = case_when(ensembl_gene_id %in% geneList.upLoop ~ \cohesin-upLoop\,
                                                 ensembl_gene_id %in% geneList.noLoop ~ \cohesin-noLoop\,
                                                 ensembl_gene_id %in% geneList.downLoop ~ \cohesin-downLoop\,
                                                 TRUE ~ \NA\))


ggplot(diff.RNA.out, aes(x = geneGroup, fill = diff)) +
  geom_bar(position=\fill\) + theme_bw()


upLoop.downPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\, diff == \DOWN\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\))
upLoop.upPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\, diff == \UP\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\))

noLoop.downPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\, diff == \DOWN\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\))
noLoop.upPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\, diff == \UP\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\))

downLoop.downPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\, diff == \DOWN\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\))
downLoop.upPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\, diff == \UP\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\))


data <- tibble(geneGroup = c(\cohesin-upLoop\, \cohesin-upLoop\, 
                     \cohesin-noLoop\, \cohesin-noLoop\, 
                     \cohesin-downLoop\, \cohesin-downLoop\),
       diff = rep(c(\DOWN\, \UP\), 3),
       perc = c(upLoop.downPerc, upLoop.upPerc, noLoop.downPerc, noLoop.upPerc, downLoop.downPerc, downLoop.upPerc)*100)

ggplot(data, aes(x = geneGroup, y = perc, fill = diff )) +
  geom_bar(stat = \identity\, position = \dodge\) + theme_bw()




geneList.noLoopUnique <- geneList.noLoop[!geneList.noLoop %in% unique(c(geneList.downLoop, geneList.upLoop))]
geneList.downLoopUnique <- geneList.downLoop[!geneList.downLoop %in% unique(c(geneList.noLoop, geneList.upLoop))]
geneList.upLoopUnique <- geneList.upLoop[!geneList.upLoop %in% unique(c(geneList.noLoop, geneList.downLoop))]

diff.RNA.out <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                            padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                            TRUE ~ \NO\),
                           geneGroup = case_when(ensembl_gene_id %in% geneList.upLoopUnique  ~ \cohesin-upLoop\,
                                                 ensembl_gene_id %in% geneList.noLoopUnique ~ \cohesin-noLoop\,
                                                 ensembl_gene_id %in% geneList.downLoopUnique ~ \cohesin-downLoop\,
                                                 TRUE ~ \NA\))


ggplot(diff.RNA.out, aes(x = geneGroup, fill = diff)) +
  geom_bar(position=\fill\) + theme_bw()


upLoop.downPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\, diff == \DOWN\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\))
upLoop.upPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\, diff == \UP\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\))

noLoop.downPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\, diff == \DOWN\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\))
noLoop.upPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\, diff == \UP\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\))

downLoop.downPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\, diff == \DOWN\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\))
downLoop.upPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\, diff == \UP\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\))


data <- tibble(geneGroup = c(\cohesin-upLoop\, \cohesin-upLoop\, 
                     \cohesin-noLoop\, \cohesin-noLoop\, 
                     \cohesin-downLoop\, \cohesin-downLoop\),
       diff = rep(c(\DOWN\, \UP\), 3),
       perc = c(upLoop.downPerc, upLoop.upPerc, noLoop.downPerc, noLoop.upPerc, downLoop.downPerc, downLoop.upPerc)*100)

ggplot(data, aes(x = geneGroup, y = perc, fill = diff )) +
  geom_bar(stat = \identity\, position = \dodge\) + theme_bw()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gzQXRibDlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptUTNWMGIyWm1JRDBnTUM0eUtWeHVYRzVuWlc1bFRHbHpkQzUxY0V4dmIzQWdQQzBnZFc1cGNYVmxLQ2huWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2RYQmtiM2R1WDJSVVFVZGZSRTFUVHlBOVBTQmNYRlZRWEZ3cElDVStKU0IxYm01bGMzUW9aMlZ1WlNrcEpHZGxibVVwWEc1blpXNWxUR2x6ZEM1dWIweHZiM0FnUEMwZ2RXNXBjWFZsS0NoblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9kWEJrYjNkdVgyUlVRVWRmUkUxVFR5QTlQU0JjWEU1UFhGd3BJQ1UrSlNCMWJtNWxjM1FvWjJWdVpTa3BKR2RsYm1VcFhHNW5aVzVsVEdsemRDNWtiM2R1VEc5dmNDQThMU0IxYm1seGRXVW9LR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loMWNHUnZkMjVmWkZSQlIxOUVUVk5QSUQwOUlGeGNSRTlYVGx4Y0tTQWxQaVVnZFc1dVpYTjBLR2RsYm1VcEtTUm5aVzVsS1Z4dVhHNWNibHh1SXlCRFNFVkRTMGxPUnlCSVQxY2dUVUZPV1NCSFJVNUZVeUJQVmtWU1RFRlFJRUZOVDA1SElGVlFMMDVQTDBSUFYwNWNibk5sZEhOZmJHbHpkQ0E4TFNCc2FYTjBLSFZ3SUQwZ1oyVnVaVXhwYzNRdWRYQk1iMjl3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtOGdQU0JuWlc1bFRHbHpkQzV1YjB4dmIzQXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYjNkdUlEMGdaMlZ1WlV4cGMzUXVaRzkzYmt4dmIzQXBYRzVjYmlNZ1EzSmxZWFJsSUhSb1pTQkZkV3hsY2lCd2JHOTBYRzVsZFd4bGNsOW1hWFFnUEMwZ1pYVnNaWElvYzJWMGMxOXNhWE4wS1Z4dWNHeHZkQ2hsZFd4bGNsOW1hWFFzWEc0Z0lDQWdJR3hoWW1Wc2N5QTlJRlJTVlVVc0lDQWpJRVJwYzNCc1lYa2djMlYwSUd4aFltVnNjMXh1SUNBZ0lDQm1hV3hzY3lBOUlGUlNWVVVzSUNBZ0l5QkRiMnh2Y2lCbWFXeHNJSFJvWlNCeVpXZHBiMjV6WEc0Z0lDQWdJSEYxWVc1MGFYUnBaWE1nUFNCVVVsVkZLVnh1WEc1Y2JpTWdSMDljYmtkUExuVndJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bFRHbHpkQzUxY0V4dmIzQXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hGeEZUbE5GVFVKTVhGd3NJRzl1ZENBOUlGeGNRbEJjWENsY2JtUnZkSEJzYjNRb1IwOHVkWEFwWEc1SFR5NXVieUE4TFNCbGJuSnBZMmhIVHloblpXNWxJRDBnWjJWdVpVeHBjM1F1Ym05TWIyOXdMQ0JQY21kRVlpQTlJRzl5Wnk1TmJTNWxaeTVrWWl3Z2EyVjVWSGx3WlNBOUlGeGNSVTVUUlUxQ1RGeGNMQ0J2Ym5RZ1BTQmNYRUpRWEZ3cFhHNWtiM1J3Ykc5MEtFZFBMbTV2S1Z4dVIwOHVaRzkzYmlBOExTQmxibkpwWTJoSFR5aG5aVzVsSUQwZ1oyVnVaVXhwYzNRdVpHOTNia3h2YjNBc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWEZ4RlRsTkZUVUpNWEZ3c0lHOXVkQ0E5SUZ4Y1FsQmNYQ2xjYm1SdmRIQnNiM1FvUjA4dVpHOTNiaWxjYmx4dUl5QkhUeUIwYnlCdmJteDVJSE53WldOcFptbGpJSE4xWW5ObGRGeHVaMlZ1WlV4cGMzUXVkWEJNYjI5d0xuTndaV05wWm1saklEd3RJSE5sZEdScFptWW9aMlZ1WlV4cGMzUXVkWEJNYjI5d0xDQjFibWx2YmloblpXNWxUR2x6ZEM1dWIweHZiM0FzSUdkbGJtVk1hWE4wTG1SdmQyNU1iMjl3S1NsY2JtZGxibVZNYVhOMExtNXZURzl2Y0M1emNHVmphV1pwWXlBOExTQnpaWFJrYVdabUtHZGxibVZNYVhOMExtNXZURzl2Y0N3Z2RXNXBiMjRvWjJWdVpVeHBjM1F1ZFhCTWIyOXdMQ0JuWlc1bFRHbHpkQzVrYjNkdVRHOXZjQ2twWEc1blpXNWxUR2x6ZEM1a2IzZHVURzl2Y0M1emNHVmphV1pwWXlBOExTQnpaWFJrYVdabUtHZGxibVZNYVhOMExtUnZkMjVNYjI5d0xDQjFibWx2YmloblpXNWxUR2x6ZEM1dWIweHZiM0FzSUdkbGJtVk1hWE4wTG5Wd1RHOXZjQ2twWEc1SFR5NTFjQ0E4TFNCbGJuSnBZMmhIVHloblpXNWxJRDBnWjJWdVpVeHBjM1F1ZFhCTWIyOXdMbk53WldOcFptbGpMQ0JQY21kRVlpQTlJRzl5Wnk1TmJTNWxaeTVrWWl3Z2EyVjVWSGx3WlNBOUlGeGNSVTVUUlUxQ1RGeGNMQ0J2Ym5RZ1BTQmNYRUpRWEZ3cFhHNWtiM1J3Ykc5MEtFZFBMblZ3S1Z4dVIwOHVibThnUEMwZ1pXNXlhV05vUjA4b1oyVnVaU0E5SUdkbGJtVk1hWE4wTG01dlRHOXZjQzV6Y0dWamFXWnBZeXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0tWeHVaRzkwY0d4dmRDaEhUeTV1YnlsY2JrZFBMbVJ2ZDI0Z1BDMGdaVzV5YVdOb1IwOG9aMlZ1WlNBOUlHZGxibVZNYVhOMExtUnZkMjVNYjI5d0xuTndaV05wWm1sakxDQlBjbWRFWWlBOUlHOXlaeTVOYlM1bFp5NWtZaXdnYTJWNVZIbHdaU0E5SUZ4Y1JVNVRSVTFDVEZ4Y0xDQnZiblFnUFNCY1hFSlFYRndwWEc1a2IzUndiRzkwS0VkUExtUnZkMjRwWEc1Y2JseHVJeU1nUTJobFkydHBibWNnY0dWeVkyVnVkR0ZuWlNCdlppQmliMkppYVdVZ1pXRnliSGtnWjJWdVpWeHVYRzRqSXlCSmJYQnZjblJwYm1jZ1FtOWlZbWxsSUdkbGJtVWdZMnhoYzNOcFptbGpZWFJwYjI1Y2JtZGxibVZEYkhWemRHVnlJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHSnZZbUpwWlY5blpXNWxYMk5zWVhOemFXWnBZMkYwYVc5dUxtTnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9aMlZ1WlN3Z1pXNXpkQ3dnUTJ4MWMzUmxjaWxjYm1OdmJHNWhiV1Z6S0dkbGJtVkRiSFZ6ZEdWeUtTQThMU0JqS0Z4Y1oyVnVaVnhjTENCY1hHVnVjMlZ0WW14ZmRISmhibk5qY21sd2RGOXBaRnhjTENCY1hHTnNkWE4wWlhKY1hDbGNibHh1WEc0akl5QkRiMjUyWlhKMGFXNW5JSFJ5WVc1elkzSnBjSFFnU1VRZ2RHOGdaMlZ1WlNCSlJGeHVhV1JRWVdseVgzUm5JRHd0SUdkbGRFSk5LR0YwZEhKcFluVjBaWE1nUFNCaktGeGNaVzV6WlcxaWJGOTBjbUZ1YzJOeWFYQjBYMmxrWEZ3c0lGeGNaVzV6WlcxaWJGOW5aVzVsWDJsa1hGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtYVd4MFpYSnpJRDBnWEZ4bGJuTmxiV0pzWDNSeVlXNXpZM0pwY0hSZmFXUmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1Gc2RXVnpJRDBnWjJWdVpVTnNkWE4wWlhJa1pXNXpaVzFpYkY5MGNtRnVjMk55YVhCMExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRZWEowSUQwZ1pXNXpaVzFpYkM1Mk1UQXlLVnh1WjJWdVpVTnNkWE4wWlhJZ1BDMGdaMlZ1WlVOc2RYTjBaWElnSlQ0bElHUndiSGx5T2pwc1pXWjBYMnB2YVc0b2FXUlFZV2x5WDNSbkxDQmllU0E5SUdNb1hGeGxibk5sYldKc1gzUnlZVzV6WTNKcGNIUmZhV1JjWENrcFhHNWNiaU1nVFdGcmFXNW5JR1JoZEdFZ1ptOXlJSE4wWVdOclpXUWdZbUZ5Y0d4dmRGeHVZMjkxYm5SSFpXNWxJRHd0SUdaMWJtTjBhVzl1S0dkbGJtVkRiSFZ6ZEdWeUxDQm5jbTkxY0U1aGJXVXNJR05zZFhOMFpYSk9ZVzFsS1h0Y2JpQWdiblZ0SUR3dElHNXliM2NvWjJWdVpVTnNkWE4wWlhJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1pXNXpaVzFpYkY5blpXNWxYMmxrSUNWcGJpVWdaM0p2ZFhCT1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYkhWemRHVnlJQ1ZwYmlVZ1kyeDFjM1JsY2s1aGJXVXBLVnh1SUNCeVpYUjFjbTRvYm5WdEtWeHVmVnh1WTI5MWJuUkhaVzVsVEdsemRDQThMU0JtZFc1amRHbHZiaWhuWlc1bFEyeDFjM1JsY2l3Z1ozSnZkWEJPWVcxbEtYdGNiaUFnYmpFZ1BDMGdZMjkxYm5SSFpXNWxLR2RsYm1WRGJIVnpkR1Z5TENCbmNtOTFjRTVoYldVc0lGeGNSV0Z5YkhsY1hDbGNiaUFnYmpJZ1BDMGdZMjkxYm5SSFpXNWxLR2RsYm1WRGJIVnpkR1Z5TENCbmNtOTFjRTVoYldVc0lGeGNUV2xrWkd4bFhGd3BYRzRnSUc0eklEd3RZMjkxYm5SSFpXNWxLR2RsYm1WRGJIVnpkR1Z5TENCbmNtOTFjRTVoYldVc0lGeGNUR0YwWlZ4Y0tWeHVJQ0J1TkNBOExTQmpiM1Z1ZEVkbGJtVW9aMlZ1WlVOc2RYTjBaWElzSUdkeWIzVndUbUZ0WlN3Z1hGeFVjbUZ1YzJsbGJuUmNYQ2xjYmlBZ2NtVjBkWEp1S0dNb2JqRXNJRzR5TENCdU15d2dialFwS1Z4dWZWeHVYRzVuY205MWNDQThMU0JqS0hKbGNDaGNYSFZ3WEZ3c0lEUXBMQ0J5WlhBb1hGeHViMXhjTENBMEtTd2djbVZ3S0Z4Y1pHOTNibHhjTENBMEtTbGNibU5zZFhOMFpYSWdQQzBnY21Wd0tHTW9YRnhGWVhKc2VWeGNMQ0JjWEUxcFpHUnNaVnhjTENCY1hFeGhkR1ZjWEN3Z1hGeFVjbUZ1YzJsbGJuUmNYQ2tzSURNcFhHNWpiSFZ6ZEdWeUlEd3RJR1poWTNSdmNpaGpiSFZ6ZEdWeUxDQnNaWFpsYkhNZ1BTQmpLRnhjUldGeWJIbGNYQ3dnWEZ4TmFXUmtiR1ZjWEN3Z1hGeE1ZWFJsWEZ3c0lGeGNWSEpoYm5OcFpXNTBYRndwS1Z4dWRtRnNkV1VnUEMwZ1l5aGpiM1Z1ZEVkbGJtVk1hWE4wS0dkbGJtVkRiSFZ6ZEdWeUxDQm5aVzVsVEdsemRDNTFjRXh2YjNBcExGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjNWdWRFZGxibVZNYVhOMEtHZGxibVZEYkhWemRHVnlMQ0JuWlc1bFRHbHpkQzV1YjB4dmIzQXBMRnh1SUNBZ0lDQWdJQ0FnSUNCamIzVnVkRWRsYm1WTWFYTjBLR2RsYm1WRGJIVnpkR1Z5TENCblpXNWxUR2x6ZEM1a2IzZHVURzl2Y0NrcFhHNWNibVJoZEdFZ1BDMGdaR0YwWVM1bWNtRnRaU2huY205MWNDd2dZMngxYzNSbGNpd2dkbUZzZFdVcFhHNW5aM0JzYjNRb1pHRjBZU3dnWVdWektHWnBiR3c5WTJ4MWMzUmxjaXdnZVQxMllXeDFaU3dnZUQxbmNtOTFjQ2twSUNzZ1hHNGdJQ0FnWjJWdmJWOWlZWElvY0c5emFYUnBiMjQ5WEZ4emRHRmphMXhjTENCemRHRjBJRDBnWEZ4cFpHVnVkR2wwZVZ4Y0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tWeHVaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aG1hV3hzUFdOc2RYTjBaWElzSUhrOWRtRnNkV1VzSUhnOVozSnZkWEFwS1NBcklGeHVJQ0FnSUdkbGIyMWZZbUZ5S0hCdmMybDBhVzl1UFZ4Y1ptbHNiRnhjTENCemRHRjBJRDBnWEZ4cFpHVnVkR2wwZVZ4Y0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tWeHVYRzUyWVd4MVpTQThMU0JqS0dOdmRXNTBSMlZ1WlV4cGMzUW9aMlZ1WlVOc2RYTjBaWElzSUdkbGJtVk1hWE4wTG5Wd1RHOXZjQzV6Y0dWamFXWnBZeWtzWEc0Z0lDQWdJQ0FnSUNBZ0lHTnZkVzUwUjJWdVpVeHBjM1FvWjJWdVpVTnNkWE4wWlhJc0lHZGxibVZNYVhOMExtNXZURzl2Y0M1emNHVmphV1pwWXlrc1hHNGdJQ0FnSUNBZ0lDQWdJR052ZFc1MFIyVnVaVXhwYzNRb1oyVnVaVU5zZFhOMFpYSXNJR2RsYm1WTWFYTjBMbVJ2ZDI1TWIyOXdMbk53WldOcFptbGpLU2xjYmx4dVpHRjBZU0E4TFNCa1lYUmhMbVp5WVcxbEtHZHliM1Z3TENCamJIVnpkR1Z5TENCMllXeDFaU2xjYmlNZ1VHeHZkSFJwYm1kY2JtZG5jR3h2ZENoa1lYUmhMQ0JoWlhNb1ptbHNiRDFqYkhWemRHVnlMQ0I1UFhaaGJIVmxMQ0I0UFdkeWIzVndLU2tnS3lCY2JpQWdJQ0JuWlc5dFgySmhjaWh3YjNOcGRHbHZiajFjWEhOMFlXTnJYRndzSUhOMFlYUWdQU0JjWEdsa1pXNTBhWFI1WEZ3cElDc2dkR2hsYldWZlkyeGhjM05wWXlncFhHNW5aM0JzYjNRb1pHRjBZU3dnWVdWektHWnBiR3c5WTJ4MWMzUmxjaXdnZVQxMllXeDFaU3dnZUQxbmNtOTFjQ2twSUNzZ1hHNGdJQ0FnWjJWdmJWOWlZWElvY0c5emFYUnBiMjQ5WEZ4bWFXeHNYRndzSUhOMFlYUWdQU0JjWEdsa1pXNTBhWFI1WEZ3cElDc2dkR2hsYldWZlkyeGhjM05wWXlncFhHNWNibHh1WEc0akl5TWpJeU1qSXlNakl5TWpJeU1qSXlNZ1EyaGxZMnRwYm1jZ2FHOTNJSFJvYjNObElHZGxibVZ6SUdKbGFHRjJaU0JwYmlCQk5EZzFYRzVrYVdabUxsSk9RU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeGthV1ptWDBjeExrRTBPRFV1YzJWc1pXTjBaV1F5WDBjeExqSnBMa0UwT0RWZmRuTmZSekV1TW1rdVJFMVRUeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dWdWMyVnRZbXhmWjJWdVpWOXBaQ3dnYkc5bk1rWnZiR1JEYUdGdVoyVXNJSE5vY21sdWEyVmtYMnh2WnpKR1F5d2djR0ZrYWl3Z1pYaDBaWEp1WVd4ZloyVnVaVjl1WVcxbEtWeHVYRzVoYkhCb1lTQThMU0F3TGpBMVhHNW1ZME4xZEc5bVppQThMU0F3TGpWY2JtUnBabVl1VWs1QkxtOTFkQ0E4TFNCa2FXWm1MbEpPUVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FXWm1JRDBnWTJGelpWOTNhR1Z1S0hCaFpHb2dQQ0JoYkhCb1lTQW1JSE5vY21sdWEyVmtYMnh2WnpKR1F5QStJR1pqUTNWMGIyWm1JSDRnWEZ4VlVGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J3WVdScUlEd2dZV3h3YUdFZ0ppQnphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXRabU5EZFhSdlptWWdmaUJjWEVSUFYwNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnVkZKVlJTQitJRnhjVGs5Y1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuWlc1bFIzSnZkWEFnUFNCallYTmxYM2RvWlc0b1pXNXpaVzFpYkY5blpXNWxYMmxrSUNWcGJpVWdaMlZ1WlV4cGMzUXVkWEJNYjI5d0lINGdYRnhqYjJobGMybHVMWFZ3VEc5dmNGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnVjMlZ0WW14ZloyVnVaVjlwWkNBbGFXNGxJR2RsYm1WTWFYTjBMbTV2VEc5dmNDQitJRnhjWTI5b1pYTnBiaTF1YjB4dmIzQmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxibk5sYldKc1gyZGxibVZmYVdRZ0pXbHVKU0JuWlc1bFRHbHpkQzVrYjNkdVRHOXZjQ0IrSUZ4Y1kyOW9aWE5wYmkxa2IzZHVURzl2Y0Z4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSU1ZVVWdmaUJjWEU1QlhGd3BLVnh1WEc1Y2JtZG5jR3h2ZENoa2FXWm1MbEpPUVM1dmRYUXNJR0ZsY3loNElEMGdaMlZ1WlVkeWIzVndMQ0JtYVd4c0lEMGdaR2xtWmlrcElDdGNiaUFnWjJWdmJWOWlZWElvY0c5emFYUnBiMjQ5WEZ4bWFXeHNYRndwSUNzZ2RHaGxiV1ZmWW5jb0tWeHVYRzVjYm5Wd1RHOXZjQzVrYjNkdVVHVnlZeUE4TFNCdWNtOTNLR1JwWm1ZdVVrNUJMbTkxZENBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loblpXNWxSM0p2ZFhBZ1BUMGdYRnhqYjJobGMybHVMWFZ3VEc5dmNGeGNMQ0JrYVdabUlEMDlJRnhjUkU5WFRseGNLU2t2Ym5KdmR5aGthV1ptTGxKT1FTNXZkWFFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjJWdVpVZHliM1Z3SUQwOUlGeGNZMjlvWlhOcGJpMTFjRXh2YjNCY1hDa3BYRzUxY0V4dmIzQXVkWEJRWlhKaklEd3RJRzV5YjNjb1pHbG1aaTVTVGtFdWIzVjBJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2RsYm1WSGNtOTFjQ0E5UFNCY1hHTnZhR1Z6YVc0dGRYQk1iMjl3WEZ3c0lHUnBabVlnUFQwZ1hGeFZVRnhjS1NrdmJuSnZkeWhrYVdabUxsSk9RUzV2ZFhRZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1oyVnVaVWR5YjNWd0lEMDlJRnhjWTI5b1pYTnBiaTExY0V4dmIzQmNYQ2twWEc1Y2JtNXZURzl2Y0M1a2IzZHVVR1Z5WXlBOExTQnVjbTkzS0dScFptWXVVazVCTG05MWRDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5aVzVsUjNKdmRYQWdQVDBnWEZ4amIyaGxjMmx1TFc1dlRHOXZjRnhjTENCa2FXWm1JRDA5SUZ4Y1JFOVhUbHhjS1NrdmJuSnZkeWhrYVdabUxsSk9RUzV2ZFhRZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1oyVnVaVWR5YjNWd0lEMDlJRnhjWTI5b1pYTnBiaTF1YjB4dmIzQmNYQ2twWEc1dWIweHZiM0F1ZFhCUVpYSmpJRHd0SUc1eWIzY29aR2xtWmk1U1RrRXViM1YwSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkbGJtVkhjbTkxY0NBOVBTQmNYR052YUdWemFXNHRibTlNYjI5d1hGd3NJR1JwWm1ZZ1BUMGdYRnhWVUZ4Y0tTa3Zibkp2ZHloa2FXWm1MbEpPUVM1dmRYUWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aMlZ1WlVkeWIzVndJRDA5SUZ4Y1kyOW9aWE5wYmkxdWIweHZiM0JjWENrcFhHNWNibVJ2ZDI1TWIyOXdMbVJ2ZDI1UVpYSmpJRHd0SUc1eWIzY29aR2xtWmk1U1RrRXViM1YwSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkbGJtVkhjbTkxY0NBOVBTQmNYR052YUdWemFXNHRaRzkzYmt4dmIzQmNYQ3dnWkdsbVppQTlQU0JjWEVSUFYwNWNYQ2twTDI1eWIzY29aR2xtWmk1U1RrRXViM1YwSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkbGJtVkhjbTkxY0NBOVBTQmNYR052YUdWemFXNHRaRzkzYmt4dmIzQmNYQ2twWEc1a2IzZHVURzl2Y0M1MWNGQmxjbU1nUEMwZ2JuSnZkeWhrYVdabUxsSk9RUzV2ZFhRZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1oyVnVaVWR5YjNWd0lEMDlJRnhjWTI5b1pYTnBiaTFrYjNkdVRHOXZjRnhjTENCa2FXWm1JRDA5SUZ4Y1ZWQmNYQ2twTDI1eWIzY29aR2xtWmk1U1RrRXViM1YwSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkbGJtVkhjbTkxY0NBOVBTQmNYR052YUdWemFXNHRaRzkzYmt4dmIzQmNYQ2twWEc1Y2JseHVaR0YwWVNBOExTQjBhV0ppYkdVb1oyVnVaVWR5YjNWd0lEMGdZeWhjWEdOdmFHVnphVzR0ZFhCTWIyOXdYRndzSUZ4Y1kyOW9aWE5wYmkxMWNFeHZiM0JjWEN3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEdOdmFHVnphVzR0Ym05TWIyOXdYRndzSUZ4Y1kyOW9aWE5wYmkxdWIweHZiM0JjWEN3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjWEdOdmFHVnphVzR0Wkc5M2JreHZiM0JjWEN3Z1hGeGpiMmhsYzJsdUxXUnZkMjVNYjI5d1hGd3BMRnh1SUNBZ0lDQWdJR1JwWm1ZZ1BTQnlaWEFvWXloY1hFUlBWMDVjWEN3Z1hGeFZVRnhjS1N3Z015a3NYRzRnSUNBZ0lDQWdjR1Z5WXlBOUlHTW9kWEJNYjI5d0xtUnZkMjVRWlhKakxDQjFjRXh2YjNBdWRYQlFaWEpqTENCdWIweHZiM0F1Wkc5M2JsQmxjbU1zSUc1dlRHOXZjQzUxY0ZCbGNtTXNJR1J2ZDI1TWIyOXdMbVJ2ZDI1UVpYSmpMQ0JrYjNkdVRHOXZjQzUxY0ZCbGNtTXBLakV3TUNsY2JseHVaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjJWdVpVZHliM1Z3TENCNUlEMGdjR1Z5WXl3Z1ptbHNiQ0E5SUdScFptWWdLU2tnSzF4dUlDQm5aVzl0WDJKaGNpaHpkR0YwSUQwZ1hGeHBaR1Z1ZEdsMGVWeGNMQ0J3YjNOcGRHbHZiaUE5SUZ4Y1pHOWtaMlZjWENrZ0t5QjBhR1Z0WlY5aWR5Z3BYRzVjYmx4dVhHNWNibWRsYm1WTWFYTjBMbTV2VEc5dmNGVnVhWEYxWlNBOExTQm5aVzVsVEdsemRDNXViMHh2YjNCYklXZGxibVZNYVhOMExtNXZURzl2Y0NBbGFXNGxJSFZ1YVhGMVpTaGpLR2RsYm1WTWFYTjBMbVJ2ZDI1TWIyOXdMQ0JuWlc1bFRHbHpkQzUxY0V4dmIzQXBLVjFjYm1kbGJtVk1hWE4wTG1SdmQyNU1iMjl3Vlc1cGNYVmxJRHd0SUdkbGJtVk1hWE4wTG1SdmQyNU1iMjl3V3lGblpXNWxUR2x6ZEM1a2IzZHVURzl2Y0NBbGFXNGxJSFZ1YVhGMVpTaGpLR2RsYm1WTWFYTjBMbTV2VEc5dmNDd2daMlZ1WlV4cGMzUXVkWEJNYjI5d0tTbGRYRzVuWlc1bFRHbHpkQzUxY0V4dmIzQlZibWx4ZFdVZ1BDMGdaMlZ1WlV4cGMzUXVkWEJNYjI5d1d5Rm5aVzVsVEdsemRDNTFjRXh2YjNBZ0pXbHVKU0IxYm1seGRXVW9ZeWhuWlc1bFRHbHpkQzV1YjB4dmIzQXNJR2RsYm1WTWFYTjBMbVJ2ZDI1TWIyOXdLU2xkWEc1Y2JtUnBabVl1VWs1QkxtOTFkQ0E4TFNCa2FXWm1MbEpPUVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FXWm1JRDBnWTJGelpWOTNhR1Z1S0hCaFpHb2dQQ0JoYkhCb1lTQW1JSE5vY21sdWEyVmtYMnh2WnpKR1F5QStJR1pqUTNWMGIyWm1JSDRnWEZ4VlVGeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J3WVdScUlEd2dZV3h3YUdFZ0ppQnphSEpwYm10bFpGOXNiMmN5UmtNZ1BDQXRabU5EZFhSdlptWWdmaUJjWEVSUFYwNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnVkZKVlJTQitJRnhjVGs5Y1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuWlc1bFIzSnZkWEFnUFNCallYTmxYM2RvWlc0b1pXNXpaVzFpYkY5blpXNWxYMmxrSUNWcGJpVWdaMlZ1WlV4cGMzUXVkWEJNYjI5d1ZXNXBjWFZsSUNCK0lGeGNZMjlvWlhOcGJpMTFjRXh2YjNCY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJuTmxiV0pzWDJkbGJtVmZhV1FnSldsdUpTQm5aVzVsVEdsemRDNXViMHh2YjNCVmJtbHhkV1VnZmlCY1hHTnZhR1Z6YVc0dGJtOU1iMjl3WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWlc1elpXMWliRjluWlc1bFgybGtJQ1ZwYmlVZ1oyVnVaVXhwYzNRdVpHOTNia3h2YjNCVmJtbHhkV1VnZmlCY1hHTnZhR1Z6YVc0dFpHOTNia3h2YjNCY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCVVVsVkZJSDRnWEZ4T1FWeGNLU2xjYmx4dVhHNW5aM0JzYjNRb1pHbG1aaTVTVGtFdWIzVjBMQ0JoWlhNb2VDQTlJR2RsYm1WSGNtOTFjQ3dnWm1sc2JDQTlJR1JwWm1ZcEtTQXJYRzRnSUdkbGIyMWZZbUZ5S0hCdmMybDBhVzl1UFZ4Y1ptbHNiRnhjS1NBcklIUm9aVzFsWDJKM0tDbGNibHh1WEc1MWNFeHZiM0F1Wkc5M2JsQmxjbU1nUEMwZ2JuSnZkeWhrYVdabUxsSk9RUzV2ZFhRZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1oyVnVaVWR5YjNWd0lEMDlJRnhjWTI5b1pYTnBiaTExY0V4dmIzQmNYQ3dnWkdsbVppQTlQU0JjWEVSUFYwNWNYQ2twTDI1eWIzY29aR2xtWmk1U1RrRXViM1YwSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkbGJtVkhjbTkxY0NBOVBTQmNYR052YUdWemFXNHRkWEJNYjI5d1hGd3BLVnh1ZFhCTWIyOXdMblZ3VUdWeVl5QThMU0J1Y205M0tHUnBabVl1VWs1QkxtOTFkQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuWlc1bFIzSnZkWEFnUFQwZ1hGeGpiMmhsYzJsdUxYVndURzl2Y0Z4Y0xDQmthV1ptSUQwOUlGeGNWVkJjWENrcEwyNXliM2NvWkdsbVppNVNUa0V1YjNWMElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZGxibVZIY205MWNDQTlQU0JjWEdOdmFHVnphVzR0ZFhCTWIyOXdYRndwS1Z4dVhHNXViMHh2YjNBdVpHOTNibEJsY21NZ1BDMGdibkp2ZHloa2FXWm1MbEpPUVM1dmRYUWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aMlZ1WlVkeWIzVndJRDA5SUZ4Y1kyOW9aWE5wYmkxdWIweHZiM0JjWEN3Z1pHbG1aaUE5UFNCY1hFUlBWMDVjWENrcEwyNXliM2NvWkdsbVppNVNUa0V1YjNWMElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZGxibVZIY205MWNDQTlQU0JjWEdOdmFHVnphVzR0Ym05TWIyOXdYRndwS1Z4dWJtOU1iMjl3TG5Wd1VHVnlZeUE4TFNCdWNtOTNLR1JwWm1ZdVVrNUJMbTkxZENBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loblpXNWxSM0p2ZFhBZ1BUMGdYRnhqYjJobGMybHVMVzV2VEc5dmNGeGNMQ0JrYVdabUlEMDlJRnhjVlZCY1hDa3BMMjV5YjNjb1pHbG1aaTVTVGtFdWIzVjBJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2RsYm1WSGNtOTFjQ0E5UFNCY1hHTnZhR1Z6YVc0dGJtOU1iMjl3WEZ3cEtWeHVYRzVrYjNkdVRHOXZjQzVrYjNkdVVHVnlZeUE4TFNCdWNtOTNLR1JwWm1ZdVVrNUJMbTkxZENBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loblpXNWxSM0p2ZFhBZ1BUMGdYRnhqYjJobGMybHVMV1J2ZDI1TWIyOXdYRndzSUdScFptWWdQVDBnWEZ4RVQxZE9YRndwS1M5dWNtOTNLR1JwWm1ZdVVrNUJMbTkxZENBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loblpXNWxSM0p2ZFhBZ1BUMGdYRnhqYjJobGMybHVMV1J2ZDI1TWIyOXdYRndwS1Z4dVpHOTNia3h2YjNBdWRYQlFaWEpqSUR3dElHNXliM2NvWkdsbVppNVNUa0V1YjNWMElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZGxibVZIY205MWNDQTlQU0JjWEdOdmFHVnphVzR0Wkc5M2JreHZiM0JjWEN3Z1pHbG1aaUE5UFNCY1hGVlFYRndwS1M5dWNtOTNLR1JwWm1ZdVVrNUJMbTkxZENBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loblpXNWxSM0p2ZFhBZ1BUMGdYRnhqYjJobGMybHVMV1J2ZDI1TWIyOXdYRndwS1Z4dVhHNWNibVJoZEdFZ1BDMGdkR2xpWW14bEtHZGxibVZIY205MWNDQTlJR01vWEZ4amIyaGxjMmx1TFhWd1RHOXZjRnhjTENCY1hHTnZhR1Z6YVc0dGRYQk1iMjl3WEZ3c0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4amIyaGxjMmx1TFc1dlRHOXZjRnhjTENCY1hHTnZhR1Z6YVc0dGJtOU1iMjl3WEZ3c0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4amIyaGxjMmx1TFdSdmQyNU1iMjl3WEZ3c0lGeGNZMjlvWlhOcGJpMWtiM2R1VEc5dmNGeGNLU3hjYmlBZ0lDQWdJQ0JrYVdabUlEMGdjbVZ3S0dNb1hGeEVUMWRPWEZ3c0lGeGNWVkJjWENrc0lETXBMRnh1SUNBZ0lDQWdJSEJsY21NZ1BTQmpLSFZ3VEc5dmNDNWtiM2R1VUdWeVl5d2dkWEJNYjI5d0xuVndVR1Z5WXl3Z2JtOU1iMjl3TG1SdmQyNVFaWEpqTENCdWIweHZiM0F1ZFhCUVpYSmpMQ0JrYjNkdVRHOXZjQzVrYjNkdVVHVnlZeXdnWkc5M2JreHZiM0F1ZFhCUVpYSmpLU294TURBcFhHNWNibWRuY0d4dmRDaGtZWFJoTENCaFpYTW9lQ0E5SUdkbGJtVkhjbTkxY0N3Z2VTQTlJSEJsY21Nc0lHWnBiR3dnUFNCa2FXWm1JQ2twSUN0Y2JpQWdaMlZ2YlY5aVlYSW9jM1JoZENBOUlGeGNhV1JsYm5ScGRIbGNYQ3dnY0c5emFYUnBiMjRnUFNCY1hHUnZaR2RsWEZ3cElDc2dkR2hsYldWZlluY29LVnh1WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yKVxuXG5nZW5lTGlzdC51cExvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXFVQXFwpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpXG5nZW5lTGlzdC5ub0xvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXE5PXFwpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpXG5nZW5lTGlzdC5kb3duTG9vcCA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fZFRBR19ETVNPID09IFxcRE9XTlxcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuXG5cblxuIyBDSEVDS0lORyBIT1cgTUFOWSBHRU5FUyBPVkVSTEFQIEFNT05HIFVQL05PL0RPV05cbnNldHNfbGlzdCA8LSBsaXN0KHVwID0gZ2VuZUxpc3QudXBMb29wLFxuICAgICAgICAgICAgICAgICAgbm8gPSBnZW5lTGlzdC5ub0xvb3AsXG4gICAgICAgICAgICAgICAgICBkb3duID0gZ2VuZUxpc3QuZG93bkxvb3ApXG5cbiMgQ3JlYXRlIHRoZSBFdWxlciBwbG90XG5ldWxlcl9maXQgPC0gZXVsZXIoc2V0c19saXN0KVxucGxvdChldWxlcl9maXQsXG4gICAgIGxhYmVscyA9IFRSVUUsICAjIERpc3BsYXkgc2V0IGxhYmVsc1xuICAgICBmaWxscyA9IFRSVUUsICAgIyBDb2xvciBmaWxsIHRoZSByZWdpb25zXG4gICAgIHF1YW50aXRpZXMgPSBUUlVFKVxuXG5cbiMgR09cbkdPLnVwIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC51cExvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08udXApXG5HTy5ubyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3Qubm9Mb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLm5vKVxuR08uZG93biA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuZG93bkxvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08uZG93bilcblxuIyBHTyB0byBvbmx5IHNwZWNpZmljIHN1YnNldFxuZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljIDwtIHNldGRpZmYoZ2VuZUxpc3QudXBMb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSlcbmdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0Lm5vTG9vcCwgdW5pb24oZ2VuZUxpc3QudXBMb29wLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5nZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0LmRvd25Mb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LnVwTG9vcCkpXG5HTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLnVwKVxuR08ubm8gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5ubylcbkdPLmRvd24gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLmRvd24pXG5cblxuIyMgQ2hlY2tpbmcgcGVyY2VudGFnZSBvZiBib2JiaWUgZWFybHkgZ2VuZVxuXG4jIyBJbXBvcnRpbmcgQm9iYmllIGdlbmUgY2xhc3NpZmljYXRpb25cbmdlbmVDbHVzdGVyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGJvYmJpZV9nZW5lX2NsYXNzaWZpY2F0aW9uLmNzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZ2VuZSwgZW5zdCwgQ2x1c3RlcilcbmNvbG5hbWVzKGdlbmVDbHVzdGVyKSA8LSBjKFxcZ2VuZVxcLCBcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcLCBcXGNsdXN0ZXJcXClcblxuXG4jIyBDb252ZXJ0aW5nIHRyYW5zY3JpcHQgSUQgdG8gZ2VuZSBJRFxuaWRQYWlyX3RnIDwtIGdldEJNKGF0dHJpYnV0ZXMgPSBjKFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwsIFxcZW5zZW1ibF9nZW5lX2lkXFwpLFxuICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCxcbiAgICAgICAgICAgICAgICAgdmFsdWVzID0gZ2VuZUNsdXN0ZXIkZW5zZW1ibF90cmFuc2NyaXB0LFxuICAgICAgICAgICAgICAgICBtYXJ0ID0gZW5zZW1ibC52MTAyKVxuZ2VuZUNsdXN0ZXIgPC0gZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oaWRQYWlyX3RnLCBieSA9IGMoXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCkpXG5cbiMgTWFraW5nIGRhdGEgZm9yIHN0YWNrZWQgYmFycGxvdFxuY291bnRHZW5lIDwtIGZ1bmN0aW9uKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIGNsdXN0ZXJOYW1lKXtcbiAgbnVtIDwtIG5yb3coZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibF9nZW5lX2lkICVpbiUgZ3JvdXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyICVpbiUgY2x1c3Rlck5hbWUpKVxuICByZXR1cm4obnVtKVxufVxuY291bnRHZW5lTGlzdCA8LSBmdW5jdGlvbihnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lKXtcbiAgbjEgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcRWFybHlcXClcbiAgbjIgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcTWlkZGxlXFwpXG4gIG4zIDwtY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcTGF0ZVxcKVxuICBuNCA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgXFxUcmFuc2llbnRcXClcbiAgcmV0dXJuKGMobjEsIG4yLCBuMywgbjQpKVxufVxuXG5ncm91cCA8LSBjKHJlcChcXHVwXFwsIDQpLCByZXAoXFxub1xcLCA0KSwgcmVwKFxcZG93blxcLCA0KSlcbmNsdXN0ZXIgPC0gcmVwKGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCksIDMpXG5jbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpKVxudmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC51cExvb3ApLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5ub0xvb3ApLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5cbmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxzdGFja1xcLCBzdGF0ID0gXFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuZ2dwbG90KGRhdGEsIGFlcyhmaWxsPWNsdXN0ZXIsIHk9dmFsdWUsIHg9Z3JvdXApKSArIFxuICAgIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcLCBzdGF0ID0gXFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYyksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYyksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljKSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcbiMgUGxvdHRpbmdcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXHN0YWNrXFwsIHN0YXQgPSBcXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQgPSBcXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMgQ2hlY2tpbmcgaG93IHRob3NlIGdlbmVzIGJlaGF2ZSBpbiBBNDg1XG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUk5BLm91dCA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShkaWZmID0gY2FzZV93aGVuKHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmIH4gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYgfiBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFxcTk9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lR3JvdXAgPSBjYXNlX3doZW4oZW5zZW1ibF9nZW5lX2lkICVpbiUgZ2VuZUxpc3QudXBMb29wIH4gXFxjb2hlc2luLXVwTG9vcFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmVMaXN0Lm5vTG9vcCB+IFxcY29oZXNpbi1ub0xvb3BcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lTGlzdC5kb3duTG9vcCB+IFxcY29oZXNpbi1kb3duTG9vcFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBcXE5BXFwpKVxuXG5cbmdncGxvdChkaWZmLlJOQS5vdXQsIGFlcyh4ID0gZ2VuZUdyb3VwLCBmaWxsID0gZGlmZikpICtcbiAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwpICsgdGhlbWVfYncoKVxuXG5cbnVwTG9vcC5kb3duUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLXVwTG9vcFxcLCBkaWZmID09IFxcRE9XTlxcKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi11cExvb3BcXCkpXG51cExvb3AudXBQZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tdXBMb29wXFwsIGRpZmYgPT0gXFxVUFxcKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi11cExvb3BcXCkpXG5cbm5vTG9vcC5kb3duUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLW5vTG9vcFxcLCBkaWZmID09IFxcRE9XTlxcKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi1ub0xvb3BcXCkpXG5ub0xvb3AudXBQZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tbm9Mb29wXFwsIGRpZmYgPT0gXFxVUFxcKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi1ub0xvb3BcXCkpXG5cbmRvd25Mb29wLmRvd25QZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tZG93bkxvb3BcXCwgZGlmZiA9PSBcXERPV05cXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tZG93bkxvb3BcXCkpXG5kb3duTG9vcC51cFBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi1kb3duTG9vcFxcLCBkaWZmID09IFxcVVBcXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tZG93bkxvb3BcXCkpXG5cblxuZGF0YSA8LSB0aWJibGUoZ2VuZUdyb3VwID0gYyhcXGNvaGVzaW4tdXBMb29wXFwsIFxcY29oZXNpbi11cExvb3BcXCwgXG4gICAgICAgICAgICAgICAgICAgICBcXGNvaGVzaW4tbm9Mb29wXFwsIFxcY29oZXNpbi1ub0xvb3BcXCwgXG4gICAgICAgICAgICAgICAgICAgICBcXGNvaGVzaW4tZG93bkxvb3BcXCwgXFxjb2hlc2luLWRvd25Mb29wXFwpLFxuICAgICAgIGRpZmYgPSByZXAoYyhcXERPV05cXCwgXFxVUFxcKSwgMyksXG4gICAgICAgcGVyYyA9IGModXBMb29wLmRvd25QZXJjLCB1cExvb3AudXBQZXJjLCBub0xvb3AuZG93blBlcmMsIG5vTG9vcC51cFBlcmMsIGRvd25Mb29wLmRvd25QZXJjLCBkb3duTG9vcC51cFBlcmMpKjEwMClcblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ2VuZUdyb3VwLCB5ID0gcGVyYywgZmlsbCA9IGRpZmYgKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBwb3NpdGlvbiA9IFxcZG9kZ2VcXCkgKyB0aGVtZV9idygpXG5cblxuXG5cbmdlbmVMaXN0Lm5vTG9vcFVuaXF1ZSA8LSBnZW5lTGlzdC5ub0xvb3BbIWdlbmVMaXN0Lm5vTG9vcCAlaW4lIHVuaXF1ZShjKGdlbmVMaXN0LmRvd25Mb29wLCBnZW5lTGlzdC51cExvb3ApKV1cbmdlbmVMaXN0LmRvd25Mb29wVW5pcXVlIDwtIGdlbmVMaXN0LmRvd25Mb29wWyFnZW5lTGlzdC5kb3duTG9vcCAlaW4lIHVuaXF1ZShjKGdlbmVMaXN0Lm5vTG9vcCwgZ2VuZUxpc3QudXBMb29wKSldXG5nZW5lTGlzdC51cExvb3BVbmlxdWUgPC0gZ2VuZUxpc3QudXBMb29wWyFnZW5lTGlzdC51cExvb3AgJWluJSB1bmlxdWUoYyhnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSldXG5cbmRpZmYuUk5BLm91dCA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShkaWZmID0gY2FzZV93aGVuKHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmIH4gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYgfiBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFxcTk9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lR3JvdXAgPSBjYXNlX3doZW4oZW5zZW1ibF9nZW5lX2lkICVpbiUgZ2VuZUxpc3QudXBMb29wVW5pcXVlICB+IFxcY29oZXNpbi11cExvb3BcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lTGlzdC5ub0xvb3BVbmlxdWUgfiBcXGNvaGVzaW4tbm9Mb29wXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zZW1ibF9nZW5lX2lkICVpbiUgZ2VuZUxpc3QuZG93bkxvb3BVbmlxdWUgfiBcXGNvaGVzaW4tZG93bkxvb3BcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gXFxOQVxcKSlcblxuXG5nZ3Bsb3QoZGlmZi5STkEub3V0LCBhZXMoeCA9IGdlbmVHcm91cCwgZmlsbCA9IGRpZmYpKSArXG4gIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcKSArIHRoZW1lX2J3KClcblxuXG51cExvb3AuZG93blBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi11cExvb3BcXCwgZGlmZiA9PSBcXERPV05cXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tdXBMb29wXFwpKVxudXBMb29wLnVwUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLXVwTG9vcFxcLCBkaWZmID09IFxcVVBcXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tdXBMb29wXFwpKVxuXG5ub0xvb3AuZG93blBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi1ub0xvb3BcXCwgZGlmZiA9PSBcXERPV05cXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tbm9Mb29wXFwpKVxubm9Mb29wLnVwUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLW5vTG9vcFxcLCBkaWZmID09IFxcVVBcXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tbm9Mb29wXFwpKVxuXG5kb3duTG9vcC5kb3duUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLWRvd25Mb29wXFwsIGRpZmYgPT0gXFxET1dOXFwpKS9ucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLWRvd25Mb29wXFwpKVxuZG93bkxvb3AudXBQZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tZG93bkxvb3BcXCwgZGlmZiA9PSBcXFVQXFwpKS9ucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLWRvd25Mb29wXFwpKVxuXG5cbmRhdGEgPC0gdGliYmxlKGdlbmVHcm91cCA9IGMoXFxjb2hlc2luLXVwTG9vcFxcLCBcXGNvaGVzaW4tdXBMb29wXFwsIFxuICAgICAgICAgICAgICAgICAgICAgXFxjb2hlc2luLW5vTG9vcFxcLCBcXGNvaGVzaW4tbm9Mb29wXFwsIFxuICAgICAgICAgICAgICAgICAgICAgXFxjb2hlc2luLWRvd25Mb29wXFwsIFxcY29oZXNpbi1kb3duTG9vcFxcKSxcbiAgICAgICBkaWZmID0gcmVwKGMoXFxET1dOXFwsIFxcVVBcXCksIDMpLFxuICAgICAgIHBlcmMgPSBjKHVwTG9vcC5kb3duUGVyYywgdXBMb29wLnVwUGVyYywgbm9Mb29wLmRvd25QZXJjLCBub0xvb3AudXBQZXJjLCBkb3duTG9vcC5kb3duUGVyYywgZG93bkxvb3AudXBQZXJjKSoxMDApXG5cbmdncGxvdChkYXRhLCBhZXMoeCA9IGdlbmVHcm91cCwgeSA9IHBlcmMsIGZpbGwgPSBkaWZmICkpICtcbiAgZ2VvbV9iYXIoc3RhdCA9IFxcaWRlbnRpdHlcXCwgcG9zaXRpb24gPSBcXGRvZGdlXFwpICsgdGhlbWVfYncoKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yKVxuXG5nZW5lTGlzdC51cExvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXFVQXFwpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpXG5nZW5lTGlzdC5ub0xvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcXE5PXFwpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpXG5nZW5lTGlzdC5kb3duTG9vcCA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fZFRBR19ETVNPID09IFxcRE9XTlxcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuXG5cblxuIyBDSEVDS0lORyBIT1cgTUFOWSBHRU5FUyBPVkVSTEFQIEFNT05HIFVQL05PL0RPV05cbnNldHNfbGlzdCA8LSBsaXN0KHVwID0gZ2VuZUxpc3QudXBMb29wLFxuICAgICAgICAgICAgICAgICAgbm8gPSBnZW5lTGlzdC5ub0xvb3AsXG4gICAgICAgICAgICAgICAgICBkb3duID0gZ2VuZUxpc3QuZG93bkxvb3ApXG5cbiMgQ3JlYXRlIHRoZSBFdWxlciBwbG90XG5ldWxlcl9maXQgPC0gZXVsZXIoc2V0c19saXN0KVxucGxvdChldWxlcl9maXQsXG4gICAgIGxhYmVscyA9IFRSVUUsICAjIERpc3BsYXkgc2V0IGxhYmVsc1xuICAgICBmaWxscyA9IFRSVUUsICAgIyBDb2xvciBmaWxsIHRoZSByZWdpb25zXG4gICAgIHF1YW50aXRpZXMgPSBUUlVFKVxuXG5cbiMgR09cbkdPLnVwIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC51cExvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08udXApXG5HTy5ubyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3Qubm9Mb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLm5vKVxuR08uZG93biA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuZG93bkxvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08uZG93bilcblxuIyBHTyB0byBvbmx5IHNwZWNpZmljIHN1YnNldFxuZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljIDwtIHNldGRpZmYoZ2VuZUxpc3QudXBMb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSlcbmdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0Lm5vTG9vcCwgdW5pb24oZ2VuZUxpc3QudXBMb29wLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5nZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0LmRvd25Mb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LnVwTG9vcCkpXG5HTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLnVwKVxuR08ubm8gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5ubylcbkdPLmRvd24gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLmRvd24pXG5cblxuIyMgQ2hlY2tpbmcgcGVyY2VudGFnZSBvZiBib2JiaWUgZWFybHkgZ2VuZVxuXG4jIyBJbXBvcnRpbmcgQm9iYmllIGdlbmUgY2xhc3NpZmljYXRpb25cbmdlbmVDbHVzdGVyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGJvYmJpZV9nZW5lX2NsYXNzaWZpY2F0aW9uLmNzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZ2VuZSwgZW5zdCwgQ2x1c3RlcilcbmNvbG5hbWVzKGdlbmVDbHVzdGVyKSA8LSBjKFxcZ2VuZVxcLCBcXGVuc2VtYmxfdHJhbnNjcmlwdF9pZFxcLCBcXGNsdXN0ZXJcXClcblxuXG4jIyBDb252ZXJ0aW5nIHRyYW5zY3JpcHQgSUQgdG8gZ2VuZSBJRFxuaWRQYWlyX3RnIDwtIGdldEJNKGF0dHJpYnV0ZXMgPSBjKFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwsIFxcZW5zZW1ibF9nZW5lX2lkXFwpLFxuICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCxcbiAgICAgICAgICAgICAgICAgdmFsdWVzID0gZ2VuZUNsdXN0ZXIkZW5zZW1ibF90cmFuc2NyaXB0LFxuICAgICAgICAgICAgICAgICBtYXJ0ID0gZW5zZW1ibC52MTAyKVxuZ2VuZUNsdXN0ZXIgPC0gZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oaWRQYWlyX3RnLCBieSA9IGMoXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCkpXG5cbiMgTWFraW5nIGRhdGEgZm9yIHN0YWNrZWQgYmFycGxvdFxuY291bnRHZW5lIDwtIGZ1bmN0aW9uKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIGNsdXN0ZXJOYW1lKXtcbiAgbnVtIDwtIG5yb3coZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibF9nZW5lX2lkICVpbiUgZ3JvdXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyICVpbiUgY2x1c3Rlck5hbWUpKVxuICByZXR1cm4obnVtKVxufVxuY291bnRHZW5lTGlzdCA8LSBmdW5jdGlvbihnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lKXtcbiAgbjEgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcRWFybHlcXClcbiAgbjIgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcTWlkZGxlXFwpXG4gIG4zIDwtY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIFxcTGF0ZVxcKVxuICBuNCA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgXFxUcmFuc2llbnRcXClcbiAgcmV0dXJuKGMobjEsIG4yLCBuMywgbjQpKVxufVxuXG5ncm91cCA8LSBjKHJlcChcXHVwXFwsIDQpLCByZXAoXFxub1xcLCA0KSwgcmVwKFxcZG93blxcLCA0KSlcbmNsdXN0ZXIgPC0gcmVwKGMoXFxFYXJseVxcLCBcXE1pZGRsZVxcLCBcXExhdGVcXCwgXFxUcmFuc2llbnRcXCksIDMpXG5jbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpKVxudmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC51cExvb3ApLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5ub0xvb3ApLFxuICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5cbmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxzdGFja1xcLCBzdGF0ID0gXFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuZ2dwbG90KGRhdGEsIGFlcyhmaWxsPWNsdXN0ZXIsIHk9dmFsdWUsIHg9Z3JvdXApKSArIFxuICAgIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcLCBzdGF0ID0gXFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG52YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYyksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYyksXG4gICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljKSlcblxuZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSlcbiMgUGxvdHRpbmdcbmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXHN0YWNrXFwsIHN0YXQgPSBcXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQgPSBcXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMgQ2hlY2tpbmcgaG93IHRob3NlIGdlbmVzIGJlaGF2ZSBpbiBBNDg1XG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUk5BLm91dCA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShkaWZmID0gY2FzZV93aGVuKHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmIH4gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYgfiBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFxcTk9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lR3JvdXAgPSBjYXNlX3doZW4oZW5zZW1ibF9nZW5lX2lkICVpbiUgZ2VuZUxpc3QudXBMb29wIH4gXFxjb2hlc2luLXVwTG9vcFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmVMaXN0Lm5vTG9vcCB+IFxcY29oZXNpbi1ub0xvb3BcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lTGlzdC5kb3duTG9vcCB+IFxcY29oZXNpbi1kb3duTG9vcFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBcXE5BXFwpKVxuXG5cbmdncGxvdChkaWZmLlJOQS5vdXQsIGFlcyh4ID0gZ2VuZUdyb3VwLCBmaWxsID0gZGlmZikpICtcbiAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwpICsgdGhlbWVfYncoKVxuXG5cbnVwTG9vcC5kb3duUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLXVwTG9vcFxcLCBkaWZmID09IFxcRE9XTlxcKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi11cExvb3BcXCkpXG51cExvb3AudXBQZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tdXBMb29wXFwsIGRpZmYgPT0gXFxVUFxcKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi11cExvb3BcXCkpXG5cbm5vTG9vcC5kb3duUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLW5vTG9vcFxcLCBkaWZmID09IFxcRE9XTlxcKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi1ub0xvb3BcXCkpXG5ub0xvb3AudXBQZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tbm9Mb29wXFwsIGRpZmYgPT0gXFxVUFxcKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi1ub0xvb3BcXCkpXG5cbmRvd25Mb29wLmRvd25QZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tZG93bkxvb3BcXCwgZGlmZiA9PSBcXERPV05cXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tZG93bkxvb3BcXCkpXG5kb3duTG9vcC51cFBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi1kb3duTG9vcFxcLCBkaWZmID09IFxcVVBcXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tZG93bkxvb3BcXCkpXG5cblxuZGF0YSA8LSB0aWJibGUoZ2VuZUdyb3VwID0gYyhcXGNvaGVzaW4tdXBMb29wXFwsIFxcY29oZXNpbi11cExvb3BcXCwgXG4gICAgICAgICAgICAgICAgICAgICBcXGNvaGVzaW4tbm9Mb29wXFwsIFxcY29oZXNpbi1ub0xvb3BcXCwgXG4gICAgICAgICAgICAgICAgICAgICBcXGNvaGVzaW4tZG93bkxvb3BcXCwgXFxjb2hlc2luLWRvd25Mb29wXFwpLFxuICAgICAgIGRpZmYgPSByZXAoYyhcXERPV05cXCwgXFxVUFxcKSwgMyksXG4gICAgICAgcGVyYyA9IGModXBMb29wLmRvd25QZXJjLCB1cExvb3AudXBQZXJjLCBub0xvb3AuZG93blBlcmMsIG5vTG9vcC51cFBlcmMsIGRvd25Mb29wLmRvd25QZXJjLCBkb3duTG9vcC51cFBlcmMpKjEwMClcblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ2VuZUdyb3VwLCB5ID0gcGVyYywgZmlsbCA9IGRpZmYgKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBwb3NpdGlvbiA9IFxcZG9kZ2VcXCkgKyB0aGVtZV9idygpXG5cblxuXG5cbmdlbmVMaXN0Lm5vTG9vcFVuaXF1ZSA8LSBnZW5lTGlzdC5ub0xvb3BbIWdlbmVMaXN0Lm5vTG9vcCAlaW4lIHVuaXF1ZShjKGdlbmVMaXN0LmRvd25Mb29wLCBnZW5lTGlzdC51cExvb3ApKV1cbmdlbmVMaXN0LmRvd25Mb29wVW5pcXVlIDwtIGdlbmVMaXN0LmRvd25Mb29wWyFnZW5lTGlzdC5kb3duTG9vcCAlaW4lIHVuaXF1ZShjKGdlbmVMaXN0Lm5vTG9vcCwgZ2VuZUxpc3QudXBMb29wKSldXG5nZW5lTGlzdC51cExvb3BVbmlxdWUgPC0gZ2VuZUxpc3QudXBMb29wWyFnZW5lTGlzdC51cExvb3AgJWluJSB1bmlxdWUoYyhnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSldXG5cbmRpZmYuUk5BLm91dCA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShkaWZmID0gY2FzZV93aGVuKHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmIH4gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYgfiBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFxcTk9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lR3JvdXAgPSBjYXNlX3doZW4oZW5zZW1ibF9nZW5lX2lkICVpbiUgZ2VuZUxpc3QudXBMb29wVW5pcXVlICB+IFxcY29oZXNpbi11cExvb3BcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lTGlzdC5ub0xvb3BVbmlxdWUgfiBcXGNvaGVzaW4tbm9Mb29wXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zZW1ibF9nZW5lX2lkICVpbiUgZ2VuZUxpc3QuZG93bkxvb3BVbmlxdWUgfiBcXGNvaGVzaW4tZG93bkxvb3BcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gXFxOQVxcKSlcblxuXG5nZ3Bsb3QoZGlmZi5STkEub3V0LCBhZXMoeCA9IGdlbmVHcm91cCwgZmlsbCA9IGRpZmYpKSArXG4gIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcKSArIHRoZW1lX2J3KClcblxuXG51cExvb3AuZG93blBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi11cExvb3BcXCwgZGlmZiA9PSBcXERPV05cXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tdXBMb29wXFwpKVxudXBMb29wLnVwUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLXVwTG9vcFxcLCBkaWZmID09IFxcVVBcXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tdXBMb29wXFwpKVxuXG5ub0xvb3AuZG93blBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09IFxcY29oZXNpbi1ub0xvb3BcXCwgZGlmZiA9PSBcXERPV05cXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tbm9Mb29wXFwpKVxubm9Mb29wLnVwUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLW5vTG9vcFxcLCBkaWZmID09IFxcVVBcXCkpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tbm9Mb29wXFwpKVxuXG5kb3duTG9vcC5kb3duUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLWRvd25Mb29wXFwsIGRpZmYgPT0gXFxET1dOXFwpKS9ucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLWRvd25Mb29wXFwpKVxuZG93bkxvb3AudXBQZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSBcXGNvaGVzaW4tZG93bkxvb3BcXCwgZGlmZiA9PSBcXFVQXFwpKS9ucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gXFxjb2hlc2luLWRvd25Mb29wXFwpKVxuXG5cbmRhdGEgPC0gdGliYmxlKGdlbmVHcm91cCA9IGMoXFxjb2hlc2luLXVwTG9vcFxcLCBcXGNvaGVzaW4tdXBMb29wXFwsIFxuICAgICAgICAgICAgICAgICAgICAgXFxjb2hlc2luLW5vTG9vcFxcLCBcXGNvaGVzaW4tbm9Mb29wXFwsIFxuICAgICAgICAgICAgICAgICAgICAgXFxjb2hlc2luLWRvd25Mb29wXFwsIFxcY29oZXNpbi1kb3duTG9vcFxcKSxcbiAgICAgICBkaWZmID0gcmVwKGMoXFxET1dOXFwsIFxcVVBcXCksIDMpLFxuICAgICAgIHBlcmMgPSBjKHVwTG9vcC5kb3duUGVyYywgdXBMb29wLnVwUGVyYywgbm9Mb29wLmRvd25QZXJjLCBub0xvb3AudXBQZXJjLCBkb3duTG9vcC5kb3duUGVyYywgZG93bkxvb3AudXBQZXJjKSoxMDApXG5cbmdncGxvdChkYXRhLCBhZXMoeCA9IGdlbmVHcm91cCwgeSA9IHBlcmMsIGZpbGwgPSBkaWZmICkpICtcbiAgZ2VvbV9iYXIoc3RhdCA9IFxcaWRlbnRpdHlcXCwgcG9zaXRpb24gPSBcXGRvZGdlXFwpICsgdGhlbWVfYncoKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2)

geneList.upLoop <- unique((geneAnnoData %>% dplyr::filter(updown_dTAG_DMSO == \UP\) %>% unnest(gene))$gene)
geneList.noLoop <- unique((geneAnnoData %>% dplyr::filter(updown_dTAG_DMSO == \NO\) %>% unnest(gene))$gene)
geneList.downLoop <- unique((geneAnnoData %>% dplyr::filter(updown_dTAG_DMSO == \DOWN\) %>% unnest(gene))$gene)



# CHECKING HOW MANY GENES OVERLAP AMONG UP/NO/DOWN
sets_list <- list(up = geneList.upLoop,
                  no = geneList.noLoop,
                  down = geneList.downLoop)

# Create the Euler plot
euler_fit <- euler(sets_list)
plot(euler_fit,
     labels = TRUE,  # Display set labels
     fills = TRUE,   # Color fill the regions
     quantities = TRUE)


# GO
GO.up <- enrichGO(gene = geneList.upLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down)

# GO to only specific subset
geneList.upLoop.specific <- setdiff(geneList.upLoop, union(geneList.noLoop, geneList.downLoop))
geneList.noLoop.specific <- setdiff(geneList.noLoop, union(geneList.upLoop, geneList.downLoop))
geneList.downLoop.specific <- setdiff(geneList.downLoop, union(geneList.noLoop, geneList.upLoop))
GO.up <- enrichGO(gene = geneList.upLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down)


## Checking percentage of bobbie early gene

## Importing Bobbie gene classification
geneCluster <- fread(here(refDir, \bobbie_gene_classification.csv\)) %>%
  dplyr::select(gene, enst, Cluster)
colnames(geneCluster) <- c(\gene\, \ensembl_transcript_id\, \cluster\)


## Converting transcript ID to gene ID
idPair_tg <- getBM(attributes = c(\ensembl_transcript_id\, \ensembl_gene_id\),
                 filters = \ensembl_transcript_id\,
                 values = geneCluster$ensembl_transcript,
                 mart = ensembl.v102)
geneCluster <- geneCluster %>% dplyr::left_join(idPair_tg, by = c(\ensembl_transcript_id\))

# Making data for stacked barplot
countGene <- function(geneCluster, groupName, clusterName){
  num <- nrow(geneCluster %>% dplyr::filter(ensembl_gene_id %in% groupName,
                                            cluster %in% clusterName))
  return(num)
}
countGeneList <- function(geneCluster, groupName){
  n1 <- countGene(geneCluster, groupName, \Early\)
  n2 <- countGene(geneCluster, groupName, \Middle\)
  n3 <-countGene(geneCluster, groupName, \Late\)
  n4 <- countGene(geneCluster, groupName, \Transient\)
  return(c(n1, n2, n3, n4))
}

group <- c(rep(\up\, 4), rep(\no\, 4), rep(\down\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 3)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(countGeneList(geneCluster, geneList.upLoop),
           countGeneList(geneCluster, geneList.noLoop),
           countGeneList(geneCluster, geneList.downLoop))

data <- data.frame(group, cluster, value)
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\stack\, stat = \identity\) + theme_classic()
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat = \identity\) + theme_classic()

value <- c(countGeneList(geneCluster, geneList.upLoop.specific),
           countGeneList(geneCluster, geneList.noLoop.specific),
           countGeneList(geneCluster, geneList.downLoop.specific))

data <- data.frame(group, cluster, value)
# Plotting
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\stack\, stat = \identity\) + theme_classic()
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat = \identity\) + theme_classic()



################## Checking how those genes behave in A485
diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

alpha <- 0.05
fcCutoff <- 0.5
diff.RNA.out <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                            padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                            TRUE ~ \NO\),
                           geneGroup = case_when(ensembl_gene_id %in% geneList.upLoop ~ \cohesin-upLoop\,
                                                 ensembl_gene_id %in% geneList.noLoop ~ \cohesin-noLoop\,
                                                 ensembl_gene_id %in% geneList.downLoop ~ \cohesin-downLoop\,
                                                 TRUE ~ \NA\))


ggplot(diff.RNA.out, aes(x = geneGroup, fill = diff)) +
  geom_bar(position=\fill\) + theme_bw()


upLoop.downPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\, diff == \DOWN\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\))
upLoop.upPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\, diff == \UP\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\))

noLoop.downPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\, diff == \DOWN\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\))
noLoop.upPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\, diff == \UP\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\))

downLoop.downPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\, diff == \DOWN\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\))
downLoop.upPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\, diff == \UP\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\))


data <- tibble(geneGroup = c(\cohesin-upLoop\, \cohesin-upLoop\, 
                     \cohesin-noLoop\, \cohesin-noLoop\, 
                     \cohesin-downLoop\, \cohesin-downLoop\),
       diff = rep(c(\DOWN\, \UP\), 3),
       perc = c(upLoop.downPerc, upLoop.upPerc, noLoop.downPerc, noLoop.upPerc, downLoop.downPerc, downLoop.upPerc)*100)

ggplot(data, aes(x = geneGroup, y = perc, fill = diff )) +
  geom_bar(stat = \identity\, position = \dodge\) + theme_bw()




geneList.noLoopUnique <- geneList.noLoop[!geneList.noLoop %in% unique(c(geneList.downLoop, geneList.upLoop))]
geneList.downLoopUnique <- geneList.downLoop[!geneList.downLoop %in% unique(c(geneList.noLoop, geneList.upLoop))]
geneList.upLoopUnique <- geneList.upLoop[!geneList.upLoop %in% unique(c(geneList.noLoop, geneList.downLoop))]

diff.RNA.out <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                            padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                            TRUE ~ \NO\),
                           geneGroup = case_when(ensembl_gene_id %in% geneList.upLoopUnique  ~ \cohesin-upLoop\,
                                                 ensembl_gene_id %in% geneList.noLoopUnique ~ \cohesin-noLoop\,
                                                 ensembl_gene_id %in% geneList.downLoopUnique ~ \cohesin-downLoop\,
                                                 TRUE ~ \NA\))


ggplot(diff.RNA.out, aes(x = geneGroup, fill = diff)) +
  geom_bar(position=\fill\) + theme_bw()


upLoop.downPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\, diff == \DOWN\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\))
upLoop.upPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\, diff == \UP\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-upLoop\))

noLoop.downPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\, diff == \DOWN\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\))
noLoop.upPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\, diff == \UP\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-noLoop\))

downLoop.downPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\, diff == \DOWN\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\))
downLoop.upPerc <- nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\, diff == \UP\))/nrow(diff.RNA.out %>% dplyr::filter(geneGroup == \cohesin-downLoop\))


data <- tibble(geneGroup = c(\cohesin-upLoop\, \cohesin-upLoop\, 
                     \cohesin-noLoop\, \cohesin-noLoop\, 
                     \cohesin-downLoop\, \cohesin-downLoop\),
       diff = rep(c(\DOWN\, \UP\), 3),
       perc = c(upLoop.downPerc, upLoop.upPerc, noLoop.downPerc, noLoop.upPerc, downLoop.downPerc, downLoop.upPerc)*100)

ggplot(data, aes(x = geneGroup, y = perc, fill = diff )) +
  geom_bar(stat = \identity\, position = \dodge\) + theme_bw()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### dTAG
#### P-P, P-E

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnYkc5aFpFeHZiM0JCYm01dlJHRjBZU2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYM0F0Y0dWZlpXNXpaVzFpYkV4cGMzUXVkSE4yWENJcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsbVprTjFkRzltWmlBOUlEQXVNaWxjYmx4dVoyVnVaVXhwYzNRdWRYQk1iMjl3SUR3dElIVnVhWEYxWlNnb1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSFZ3Wkc5M2JsOUJORGcxWDBSTlUwOGdQVDBnWENKVlVGd2lLU0FsUGlVZ2RXNXVaWE4wS0dkbGJtVXBLU1JuWlc1bEtWeHVaMlZ1WlV4cGMzUXVibTlNYjI5d0lEd3RJSFZ1YVhGMVpTZ29aMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hWd1pHOTNibDlCTkRnMVgwUk5VMDhnUFQwZ1hDSk9UMXdpS1NBbFBpVWdkVzV1WlhOMEtHZGxibVVwS1NSblpXNWxLVnh1WjJWdVpVeHBjM1F1Wkc5M2JreHZiM0FnUEMwZ2RXNXBjWFZsS0NoblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9kWEJrYjNkdVgwRTBPRFZmUkUxVFR5QTlQU0JjSWtSUFYwNWNJaWtnSlQ0bElIVnVibVZ6ZENoblpXNWxLU2trWjJWdVpTbGNibHh1WEc1Y2JpTWdRMGhGUTB0SlRrY2dTRTlYSUUxQlRsa2dSMFZPUlZNZ1QxWkZVa3hCVUNCQlRVOU9SeUJWVUM5T1R5OUVUMWRPWEc1elpYUnpYMnhwYzNRZ1BDMGdiR2x6ZENoMWNDQTlJR2RsYm1WTWFYTjBMblZ3VEc5dmNDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzV2SUQwZ1oyVnVaVXhwYzNRdWJtOU1iMjl3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHOTNiaUE5SUdkbGJtVk1hWE4wTG1SdmQyNU1iMjl3S1Z4dVhHNGpJRU55WldGMFpTQjBhR1VnUlhWc1pYSWdjR3h2ZEZ4dVpYVnNaWEpmWm1sMElEd3RJR1YxYkdWeUtITmxkSE5mYkdsemRDbGNibkJzYjNRb1pYVnNaWEpmWm1sMExGeHVJQ0FnSUNCc1lXSmxiSE1nUFNCVVVsVkZMQ0FnSXlCRWFYTndiR0Y1SUhObGRDQnNZV0psYkhOY2JpQWdJQ0FnWm1sc2JITWdQU0JVVWxWRkxDQWdJQ01nUTI5c2IzSWdabWxzYkNCMGFHVWdjbVZuYVc5dWMxeHVJQ0FnSUNCeGRXRnVkR2wwYVdWeklEMGdWRkpWUlNsY2JseHVYRzRqSUVkUFhHNUhUeTUxY0NBOExTQmxibkpwWTJoSFR5aG5aVzVsSUQwZ1oyVnVaVXhwYzNRdWRYQk1iMjl3TENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRndpUlU1VFJVMUNURndpTENCdmJuUWdQU0JjSWtKUVhDSXBYRzVrYjNSd2JHOTBLRWRQTG5Wd0xDQnphRzkzUTJGMFpXZHZjbmtnUFNBeE5TbGNia2RQTG01dklEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsVEdsemRDNXViMHh2YjNBc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWENKRlRsTkZUVUpNWENJc0lHOXVkQ0E5SUZ3aVFsQmNJaWxjYm1SdmRIQnNiM1FvUjA4dWJtOHNJSE5vYjNkRFlYUmxaMjl5ZVNBOUlERTFLVnh1UjA4dVpHOTNiaUE4TFNCbGJuSnBZMmhIVHloblpXNWxJRDBnWjJWdVpVeHBjM1F1Wkc5M2JreHZiM0FzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYQ0pGVGxORlRVSk1YQ0lzSUc5dWRDQTlJRndpUWxCY0lpbGNibVJ2ZEhCc2IzUW9SMDh1Wkc5M2Jpd2djMmh2ZDBOaGRHVm5iM0o1SUQwZ01qQXBYRzVjYmlNZ1IwOGdkRzhnYjI1c2VTQnpjR1ZqYVdacFl5QnpkV0p6WlhSY2JtZGxibVZNYVhOMExuVndURzl2Y0M1emNHVmphV1pwWXlBOExTQnpaWFJrYVdabUtHZGxibVZNYVhOMExuVndURzl2Y0N3Z2RXNXBiMjRvWjJWdVpVeHBjM1F1Ym05TWIyOXdMQ0JuWlc1bFRHbHpkQzVrYjNkdVRHOXZjQ2twWEc1blpXNWxUR2x6ZEM1dWIweHZiM0F1YzNCbFkybG1hV01nUEMwZ2MyVjBaR2xtWmloblpXNWxUR2x6ZEM1dWIweHZiM0FzSUhWdWFXOXVLR2RsYm1WTWFYTjBMblZ3VEc5dmNDd2daMlZ1WlV4cGMzUXVaRzkzYmt4dmIzQXBLVnh1WjJWdVpVeHBjM1F1Wkc5M2JreHZiM0F1YzNCbFkybG1hV01nUEMwZ2MyVjBaR2xtWmloblpXNWxUR2x6ZEM1a2IzZHVURzl2Y0N3Z2RXNXBiMjRvWjJWdVpVeHBjM1F1Ym05TWIyOXdMQ0JuWlc1bFRHbHpkQzUxY0V4dmIzQXBLVnh1UjA4dWRYQWdQQzBnWlc1eWFXTm9SMDhvWjJWdVpTQTlJR2RsYm1WTWFYTjBMblZ3VEc5dmNDNXpjR1ZqYVdacFl5d2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY0lrVk9VMFZOUWt4Y0lpd2diMjUwSUQwZ1hDSkNVRndpS1Z4dVpHOTBjR3h2ZENoSFR5NTFjQ2xjYmtkUExtNXZJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bFRHbHpkQzV1YjB4dmIzQXVjM0JsWTJsbWFXTXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hDSkZUbE5GVFVKTVhDSXNJRzl1ZENBOUlGd2lRbEJjSWlsY2JtUnZkSEJzYjNRb1IwOHVibThwWEc1SFR5NWtiM2R1SUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxUR2x6ZEM1a2IzZHVURzl2Y0M1emNHVmphV1pwWXl3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lLVnh1Wkc5MGNHeHZkQ2hIVHk1a2IzZHVMQ0J6YUc5M1EyRjBaV2R2Y25rZ1BTQXlNQ2xjYmx4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3AtcGVfZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMilcblxuZ2VuZUxpc3QudXBMb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gXFxVUFxcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuZ2VuZUxpc3Qubm9Mb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gXFxOT1xcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuZ2VuZUxpc3QuZG93bkxvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX0E0ODVfRE1TTyA9PSBcXERPV05cXCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZSlcblxuXG5cbiMgQ0hFQ0tJTkcgSE9XIE1BTlkgR0VORVMgT1ZFUkxBUCBBTU9ORyBVUC9OTy9ET1dOXG5zZXRzX2xpc3QgPC0gbGlzdCh1cCA9IGdlbmVMaXN0LnVwTG9vcCxcbiAgICAgICAgICAgICAgICAgIG5vID0gZ2VuZUxpc3Qubm9Mb29wLFxuICAgICAgICAgICAgICAgICAgZG93biA9IGdlbmVMaXN0LmRvd25Mb29wKVxuXG4jIENyZWF0ZSB0aGUgRXVsZXIgcGxvdFxuZXVsZXJfZml0IDwtIGV1bGVyKHNldHNfbGlzdClcbnBsb3QoZXVsZXJfZml0LFxuICAgICBsYWJlbHMgPSBUUlVFLCAgIyBEaXNwbGF5IHNldCBsYWJlbHNcbiAgICAgZmlsbHMgPSBUUlVFLCAgICMgQ29sb3IgZmlsbCB0aGUgcmVnaW9uc1xuICAgICBxdWFudGl0aWVzID0gVFJVRSlcblxuXG4jIEdPXG5HTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLnVwLCBzaG93Q2F0ZWdvcnkgPSAxNSlcbkdPLm5vIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ub0xvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08ubm8sIHNob3dDYXRlZ29yeSA9IDE1KVxuR08uZG93biA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuZG93bkxvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08uZG93biwgc2hvd0NhdGVnb3J5ID0gMjApXG5cbiMgR08gdG8gb25seSBzcGVjaWZpYyBzdWJzZXRcbmdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0LnVwTG9vcCwgdW5pb24oZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5nZW5lTGlzdC5ub0xvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5ub0xvb3AsIHVuaW9uKGdlbmVMaXN0LnVwTG9vcCwgZ2VuZUxpc3QuZG93bkxvb3ApKVxuZ2VuZUxpc3QuZG93bkxvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5kb3duTG9vcCwgdW5pb24oZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC51cExvb3ApKVxuR08udXAgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy51cClcbkdPLm5vIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ub0xvb3Auc3BlY2lmaWMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08ubm8pXG5HTy5kb3duIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5kb3duLCBzaG93Q2F0ZWdvcnkgPSAyMClcblxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-pe_ensemblList.tsv\)),
                                      diffCutoff = 0.2)

geneList.upLoop <- unique((geneAnnoData %>% dplyr::filter(updown_A485_DMSO == \UP\) %>% unnest(gene))$gene)
geneList.noLoop <- unique((geneAnnoData %>% dplyr::filter(updown_A485_DMSO == \NO\) %>% unnest(gene))$gene)
geneList.downLoop <- unique((geneAnnoData %>% dplyr::filter(updown_A485_DMSO == \DOWN\) %>% unnest(gene))$gene)



# CHECKING HOW MANY GENES OVERLAP AMONG UP/NO/DOWN
sets_list <- list(up = geneList.upLoop,
                  no = geneList.noLoop,
                  down = geneList.downLoop)

# Create the Euler plot
euler_fit <- euler(sets_list)
plot(euler_fit,
     labels = TRUE,  # Display set labels
     fills = TRUE,   # Color fill the regions
     quantities = TRUE)


# GO
GO.up <- enrichGO(gene = geneList.upLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up, showCategory = 15)
GO.no <- enrichGO(gene = geneList.noLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no, showCategory = 15)
GO.down <- enrichGO(gene = geneList.downLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down, showCategory = 20)

# GO to only specific subset
geneList.upLoop.specific <- setdiff(geneList.upLoop, union(geneList.noLoop, geneList.downLoop))
geneList.noLoop.specific <- setdiff(geneList.noLoop, union(geneList.upLoop, geneList.downLoop))
geneList.downLoop.specific <- setdiff(geneList.downLoop, union(geneList.noLoop, geneList.upLoop))
GO.up <- enrichGO(gene = geneList.upLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down, showCategory = 20)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gzQXRjR1ZmWlc1elpXMWliRXhwYzNRdWRITjJYRndwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2xtWmtOMWRHOW1aaUE5SURBdU1pbGNibHh1WjJWdVpVeHBjM1F1ZFhCTWIyOXdJRHd0SUhWdWFYRjFaU2dvWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIVndaRzkzYmw5Qk5EZzFYMFJOVTA4Z1BUMGdYRnhWVUZ4Y0tTQWxQaVVnZFc1dVpYTjBLR2RsYm1VcEtTUm5aVzVsS1Z4dVoyVnVaVXhwYzNRdWJtOU1iMjl3SUR3dElIVnVhWEYxWlNnb1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSFZ3Wkc5M2JsOUJORGcxWDBSTlUwOGdQVDBnWEZ4T1QxeGNLU0FsUGlVZ2RXNXVaWE4wS0dkbGJtVXBLU1JuWlc1bEtWeHVaMlZ1WlV4cGMzUXVaRzkzYmt4dmIzQWdQQzBnZFc1cGNYVmxLQ2huWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2RYQmtiM2R1WDBFME9EVmZSRTFUVHlBOVBTQmNYRVJQVjA1Y1hDa2dKVDRsSUhWdWJtVnpkQ2huWlc1bEtTa2taMlZ1WlNsY2JseHVYRzVjYmlNZ1EwaEZRMHRKVGtjZ1NFOVhJRTFCVGxrZ1IwVk9SVk1nVDFaRlVreEJVQ0JCVFU5T1J5QlZVQzlPVHk5RVQxZE9YRzV6WlhSelgyeHBjM1FnUEMwZ2JHbHpkQ2gxY0NBOUlHZGxibVZNYVhOMExuVndURzl2Y0N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNXZJRDBnWjJWdVpVeHBjM1F1Ym05TWIyOXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkc5M2JpQTlJR2RsYm1WTWFYTjBMbVJ2ZDI1TWIyOXdLVnh1WEc0aklFTnlaV0YwWlNCMGFHVWdSWFZzWlhJZ2NHeHZkRnh1WlhWc1pYSmZabWwwSUR3dElHVjFiR1Z5S0hObGRITmZiR2x6ZENsY2JuQnNiM1FvWlhWc1pYSmZabWwwTEZ4dUlDQWdJQ0JzWVdKbGJITWdQU0JVVWxWRkxDQWdJeUJFYVhOd2JHRjVJSE5sZENCc1lXSmxiSE5jYmlBZ0lDQWdabWxzYkhNZ1BTQlVVbFZGTENBZ0lDTWdRMjlzYjNJZ1ptbHNiQ0IwYUdVZ2NtVm5hVzl1YzF4dUlDQWdJQ0J4ZFdGdWRHbDBhV1Z6SUQwZ1ZGSlZSU2xjYmx4dVhHNGpJRWRQWEc1SFR5NTFjQ0E4TFNCbGJuSnBZMmhIVHloblpXNWxJRDBnWjJWdVpVeHBjM1F1ZFhCTWIyOXdMQ0JQY21kRVlpQTlJRzl5Wnk1TmJTNWxaeTVrWWl3Z2EyVjVWSGx3WlNBOUlGeGNSVTVUUlUxQ1RGeGNMQ0J2Ym5RZ1BTQmNYRUpRWEZ3cFhHNWtiM1J3Ykc5MEtFZFBMblZ3TENCemFHOTNRMkYwWldkdmNua2dQU0F4TlNsY2JrZFBMbTV2SUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxUR2x6ZEM1dWIweHZiM0FzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYRnhGVGxORlRVSk1YRndzSUc5dWRDQTlJRnhjUWxCY1hDbGNibVJ2ZEhCc2IzUW9SMDh1Ym04c0lITm9iM2REWVhSbFoyOXllU0E5SURFMUtWeHVSMDh1Wkc5M2JpQThMU0JsYm5KcFkyaEhUeWhuWlc1bElEMGdaMlZ1WlV4cGMzUXVaRzkzYmt4dmIzQXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hGeEZUbE5GVFVKTVhGd3NJRzl1ZENBOUlGeGNRbEJjWENsY2JtUnZkSEJzYjNRb1IwOHVaRzkzYml3Z2MyaHZkME5oZEdWbmIzSjVJRDBnTWpBcFhHNWNiaU1nUjA4Z2RHOGdiMjVzZVNCemNHVmphV1pwWXlCemRXSnpaWFJjYm1kbGJtVk1hWE4wTG5Wd1RHOXZjQzV6Y0dWamFXWnBZeUE4TFNCelpYUmthV1ptS0dkbGJtVk1hWE4wTG5Wd1RHOXZjQ3dnZFc1cGIyNG9aMlZ1WlV4cGMzUXVibTlNYjI5d0xDQm5aVzVsVEdsemRDNWtiM2R1VEc5dmNDa3BYRzVuWlc1bFRHbHpkQzV1YjB4dmIzQXVjM0JsWTJsbWFXTWdQQzBnYzJWMFpHbG1aaWhuWlc1bFRHbHpkQzV1YjB4dmIzQXNJSFZ1YVc5dUtHZGxibVZNYVhOMExuVndURzl2Y0N3Z1oyVnVaVXhwYzNRdVpHOTNia3h2YjNBcEtWeHVaMlZ1WlV4cGMzUXVaRzkzYmt4dmIzQXVjM0JsWTJsbWFXTWdQQzBnYzJWMFpHbG1aaWhuWlc1bFRHbHpkQzVrYjNkdVRHOXZjQ3dnZFc1cGIyNG9aMlZ1WlV4cGMzUXVibTlNYjI5d0xDQm5aVzVsVEdsemRDNTFjRXh2YjNBcEtWeHVSMDh1ZFhBZ1BDMGdaVzV5YVdOb1IwOG9aMlZ1WlNBOUlHZGxibVZNYVhOMExuVndURzl2Y0M1emNHVmphV1pwWXl3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjWEVWT1UwVk5Ra3hjWEN3Z2IyNTBJRDBnWEZ4Q1VGeGNLVnh1Wkc5MGNHeHZkQ2hIVHk1MWNDbGNia2RQTG01dklEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsVEdsemRDNXViMHh2YjNBdWMzQmxZMmxtYVdNc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWEZ4RlRsTkZUVUpNWEZ3c0lHOXVkQ0E5SUZ4Y1FsQmNYQ2xjYm1SdmRIQnNiM1FvUjA4dWJtOHBYRzVIVHk1a2IzZHVJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bFRHbHpkQzVrYjNkdVRHOXZjQzV6Y0dWamFXWnBZeXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0tWeHVaRzkwY0d4dmRDaEhUeTVrYjNkdUxDQnphRzkzUTJGMFpXZHZjbmtnUFNBeU1DbGNibHh1WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3AtcGVfZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMilcblxuZ2VuZUxpc3QudXBMb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gXFxVUFxcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuZ2VuZUxpc3Qubm9Mb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gXFxOT1xcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuZ2VuZUxpc3QuZG93bkxvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX0E0ODVfRE1TTyA9PSBcXERPV05cXCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZSlcblxuXG5cbiMgQ0hFQ0tJTkcgSE9XIE1BTlkgR0VORVMgT1ZFUkxBUCBBTU9ORyBVUC9OTy9ET1dOXG5zZXRzX2xpc3QgPC0gbGlzdCh1cCA9IGdlbmVMaXN0LnVwTG9vcCxcbiAgICAgICAgICAgICAgICAgIG5vID0gZ2VuZUxpc3Qubm9Mb29wLFxuICAgICAgICAgICAgICAgICAgZG93biA9IGdlbmVMaXN0LmRvd25Mb29wKVxuXG4jIENyZWF0ZSB0aGUgRXVsZXIgcGxvdFxuZXVsZXJfZml0IDwtIGV1bGVyKHNldHNfbGlzdClcbnBsb3QoZXVsZXJfZml0LFxuICAgICBsYWJlbHMgPSBUUlVFLCAgIyBEaXNwbGF5IHNldCBsYWJlbHNcbiAgICAgZmlsbHMgPSBUUlVFLCAgICMgQ29sb3IgZmlsbCB0aGUgcmVnaW9uc1xuICAgICBxdWFudGl0aWVzID0gVFJVRSlcblxuXG4jIEdPXG5HTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLnVwLCBzaG93Q2F0ZWdvcnkgPSAxNSlcbkdPLm5vIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ub0xvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08ubm8sIHNob3dDYXRlZ29yeSA9IDE1KVxuR08uZG93biA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuZG93bkxvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08uZG93biwgc2hvd0NhdGVnb3J5ID0gMjApXG5cbiMgR08gdG8gb25seSBzcGVjaWZpYyBzdWJzZXRcbmdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0LnVwTG9vcCwgdW5pb24oZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5nZW5lTGlzdC5ub0xvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5ub0xvb3AsIHVuaW9uKGdlbmVMaXN0LnVwTG9vcCwgZ2VuZUxpc3QuZG93bkxvb3ApKVxuZ2VuZUxpc3QuZG93bkxvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5kb3duTG9vcCwgdW5pb24oZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC51cExvb3ApKVxuR08udXAgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy51cClcbkdPLm5vIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ub0xvb3Auc3BlY2lmaWMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08ubm8pXG5HTy5kb3duIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5kb3duLCBzaG93Q2F0ZWdvcnkgPSAyMClcblxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3AtcGVfZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMilcblxuZ2VuZUxpc3QudXBMb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gXFxVUFxcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuZ2VuZUxpc3Qubm9Mb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gXFxOT1xcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuZ2VuZUxpc3QuZG93bkxvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX0E0ODVfRE1TTyA9PSBcXERPV05cXCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZSlcblxuXG5cbiMgQ0hFQ0tJTkcgSE9XIE1BTlkgR0VORVMgT1ZFUkxBUCBBTU9ORyBVUC9OTy9ET1dOXG5zZXRzX2xpc3QgPC0gbGlzdCh1cCA9IGdlbmVMaXN0LnVwTG9vcCxcbiAgICAgICAgICAgICAgICAgIG5vID0gZ2VuZUxpc3Qubm9Mb29wLFxuICAgICAgICAgICAgICAgICAgZG93biA9IGdlbmVMaXN0LmRvd25Mb29wKVxuXG4jIENyZWF0ZSB0aGUgRXVsZXIgcGxvdFxuZXVsZXJfZml0IDwtIGV1bGVyKHNldHNfbGlzdClcbnBsb3QoZXVsZXJfZml0LFxuICAgICBsYWJlbHMgPSBUUlVFLCAgIyBEaXNwbGF5IHNldCBsYWJlbHNcbiAgICAgZmlsbHMgPSBUUlVFLCAgICMgQ29sb3IgZmlsbCB0aGUgcmVnaW9uc1xuICAgICBxdWFudGl0aWVzID0gVFJVRSlcblxuXG4jIEdPXG5HTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLnVwLCBzaG93Q2F0ZWdvcnkgPSAxNSlcbkdPLm5vIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ub0xvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08ubm8sIHNob3dDYXRlZ29yeSA9IDE1KVxuR08uZG93biA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuZG93bkxvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08uZG93biwgc2hvd0NhdGVnb3J5ID0gMjApXG5cbiMgR08gdG8gb25seSBzcGVjaWZpYyBzdWJzZXRcbmdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0LnVwTG9vcCwgdW5pb24oZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5nZW5lTGlzdC5ub0xvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5ub0xvb3AsIHVuaW9uKGdlbmVMaXN0LnVwTG9vcCwgZ2VuZUxpc3QuZG93bkxvb3ApKVxuZ2VuZUxpc3QuZG93bkxvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5kb3duTG9vcCwgdW5pb24oZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC51cExvb3ApKVxuR08udXAgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy51cClcbkdPLm5vIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ub0xvb3Auc3BlY2lmaWMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08ubm8pXG5HTy5kb3duIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5kb3duLCBzaG93Q2F0ZWdvcnkgPSAyMClcblxuXG5gYGBcbmBgYCJ9 -->

```r
```r
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-pe_ensemblList.tsv\)),
                                      diffCutoff = 0.2)

geneList.upLoop <- unique((geneAnnoData %>% dplyr::filter(updown_A485_DMSO == \UP\) %>% unnest(gene))$gene)
geneList.noLoop <- unique((geneAnnoData %>% dplyr::filter(updown_A485_DMSO == \NO\) %>% unnest(gene))$gene)
geneList.downLoop <- unique((geneAnnoData %>% dplyr::filter(updown_A485_DMSO == \DOWN\) %>% unnest(gene))$gene)



# CHECKING HOW MANY GENES OVERLAP AMONG UP/NO/DOWN
sets_list <- list(up = geneList.upLoop,
                  no = geneList.noLoop,
                  down = geneList.downLoop)

# Create the Euler plot
euler_fit <- euler(sets_list)
plot(euler_fit,
     labels = TRUE,  # Display set labels
     fills = TRUE,   # Color fill the regions
     quantities = TRUE)


# GO
GO.up <- enrichGO(gene = geneList.upLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up, showCategory = 15)
GO.no <- enrichGO(gene = geneList.noLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no, showCategory = 15)
GO.down <- enrichGO(gene = geneList.downLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down, showCategory = 20)

# GO to only specific subset
geneList.upLoop.specific <- setdiff(geneList.upLoop, union(geneList.noLoop, geneList.downLoop))
geneList.noLoop.specific <- setdiff(geneList.noLoop, union(geneList.upLoop, geneList.downLoop))
geneList.downLoop.specific <- setdiff(geneList.downLoop, union(geneList.noLoop, geneList.upLoop))
GO.up <- enrichGO(gene = geneList.upLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down, showCategory = 20)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



#### P-N

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnYkc5aFpFeHZiM0JCYm01dlJHRjBZU2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYM0F0Ymw5bGJuTmxiV0pzVEdsemRDNTBjM1pjSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVdabVEzVjBiMlptSUQwZ01DNHlLVnh1WEc1blpXNWxUR2x6ZEM1MWNFeHZiM0FnUEMwZ2RXNXBjWFZsS0NoblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9kWEJrYjNkdVgwRTBPRFZmUkUxVFR5QTlQU0JjSWxWUVhDSXBJQ1UrSlNCMWJtNWxjM1FvWjJWdVpTa3BKR2RsYm1VcFhHNW5aVzVsVEdsemRDNXViMHh2YjNBZ1BDMGdkVzVwY1hWbEtDaG5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvZFhCa2IzZHVYMEUwT0RWZlJFMVRUeUE5UFNCY0lrNVBYQ0lwSUNVK0pTQjFibTVsYzNRb1oyVnVaU2twSkdkbGJtVXBYRzVuWlc1bFRHbHpkQzVrYjNkdVRHOXZjQ0E4TFNCMWJtbHhkV1VvS0dkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaDFjR1J2ZDI1ZlFUUTROVjlFVFZOUElEMDlJRndpUkU5WFRsd2lLU0FsUGlVZ2RXNXVaWE4wS0dkbGJtVXBLU1JuWlc1bEtWeHVYRzVjYmx4dUl5QkRTRVZEUzBsT1J5QklUMWNnVFVGT1dTQkhSVTVGVXlCUFZrVlNURUZRSUVGTlQwNUhJRlZRTDA1UEwwUlBWMDVjYm5ObGRITmZiR2x6ZENBOExTQnNhWE4wS0hWd0lEMGdaMlZ1WlV4cGMzUXVkWEJNYjI5d0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibThnUFNCblpXNWxUR2x6ZEM1dWIweHZiM0FzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2IzZHVJRDBnWjJWdVpVeHBjM1F1Wkc5M2JreHZiM0FwWEc1Y2JpTWdRM0psWVhSbElIUm9aU0JGZFd4bGNpQndiRzkwWEc1bGRXeGxjbDltYVhRZ1BDMGdaWFZzWlhJb2MyVjBjMTlzYVhOMEtWeHVjR3h2ZENobGRXeGxjbDltYVhRc1hHNGdJQ0FnSUd4aFltVnNjeUE5SUZSU1ZVVXNJQ0FqSUVScGMzQnNZWGtnYzJWMElHeGhZbVZzYzF4dUlDQWdJQ0JtYVd4c2N5QTlJRlJTVlVVc0lDQWdJeUJEYjJ4dmNpQm1hV3hzSUhSb1pTQnlaV2RwYjI1elhHNGdJQ0FnSUhGMVlXNTBhWFJwWlhNZ1BTQlVVbFZGS1Z4dVhHNWNiaU1nUjA5Y2JrZFBMblZ3SUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxUR2x6ZEM1MWNFeHZiM0FzSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYQ0pGVGxORlRVSk1YQ0lzSUc5dWRDQTlJRndpUWxCY0lpbGNibVJ2ZEhCc2IzUW9SMDh1ZFhBcFhHNUhUeTV1YnlBOExTQmxibkpwWTJoSFR5aG5aVzVsSUQwZ1oyVnVaVXhwYzNRdWJtOU1iMjl3TENCUGNtZEVZaUE5SUc5eVp5NU5iUzVsWnk1a1lpd2dhMlY1Vkhsd1pTQTlJRndpUlU1VFJVMUNURndpTENCdmJuUWdQU0JjSWtKUVhDSXBYRzVrYjNSd2JHOTBLRWRQTG01dktWeHVSMDh1Wkc5M2JpQThMU0JsYm5KcFkyaEhUeWhuWlc1bElEMGdaMlZ1WlV4cGMzUXVaRzkzYmt4dmIzQXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hDSkZUbE5GVFVKTVhDSXNJRzl1ZENBOUlGd2lRbEJjSWlsY2JtUnZkSEJzYjNRb1IwOHVaRzkzYml3Z2MyaHZkME5oZEdWbmIzSjVJRDBnTWpBcFhHNWNiaU1nUjA4Z2RHOGdiMjVzZVNCemNHVmphV1pwWXlCemRXSnpaWFJjYm1kbGJtVk1hWE4wTG5Wd1RHOXZjQzV6Y0dWamFXWnBZeUE4TFNCelpYUmthV1ptS0dkbGJtVk1hWE4wTG5Wd1RHOXZjQ3dnZFc1cGIyNG9aMlZ1WlV4cGMzUXVibTlNYjI5d0xDQm5aVzVsVEdsemRDNWtiM2R1VEc5dmNDa3BYRzVuWlc1bFRHbHpkQzV1YjB4dmIzQXVjM0JsWTJsbWFXTWdQQzBnYzJWMFpHbG1aaWhuWlc1bFRHbHpkQzV1YjB4dmIzQXNJSFZ1YVc5dUtHZGxibVZNYVhOMExuVndURzl2Y0N3Z1oyVnVaVXhwYzNRdVpHOTNia3h2YjNBcEtWeHVaMlZ1WlV4cGMzUXVaRzkzYmt4dmIzQXVjM0JsWTJsbWFXTWdQQzBnYzJWMFpHbG1aaWhuWlc1bFRHbHpkQzVrYjNkdVRHOXZjQ3dnZFc1cGIyNG9aMlZ1WlV4cGMzUXVibTlNYjI5d0xDQm5aVzVsVEdsemRDNTFjRXh2YjNBcEtWeHVSMDh1ZFhBZ1BDMGdaVzV5YVdOb1IwOG9aMlZ1WlNBOUlHZGxibVZNYVhOMExuVndURzl2Y0M1emNHVmphV1pwWXl3Z1QzSm5SR0lnUFNCdmNtY3VUVzB1WldjdVpHSXNJR3RsZVZSNWNHVWdQU0JjSWtWT1UwVk5Ra3hjSWl3Z2IyNTBJRDBnWENKQ1VGd2lLVnh1Wkc5MGNHeHZkQ2hIVHk1MWNDbGNia2RQTG01dklEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsVEdsemRDNXViMHh2YjNBdWMzQmxZMmxtYVdNc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWENKRlRsTkZUVUpNWENJc0lHOXVkQ0E5SUZ3aVFsQmNJaWxjYm1SdmRIQnNiM1FvUjA4dWJtOHBYRzVIVHk1a2IzZHVJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bFRHbHpkQzVrYjNkdVRHOXZjQzV6Y0dWamFXWnBZeXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNJa1ZPVTBWTlFreGNJaXdnYjI1MElEMGdYQ0pDVUZ3aUtWeHVaRzkwY0d4dmRDaEhUeTVrYjNkdUtWeHVYRzVjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMilcblxuZ2VuZUxpc3QudXBMb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gXFxVUFxcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuZ2VuZUxpc3Qubm9Mb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gXFxOT1xcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuZ2VuZUxpc3QuZG93bkxvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX0E0ODVfRE1TTyA9PSBcXERPV05cXCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZSlcblxuXG5cbiMgQ0hFQ0tJTkcgSE9XIE1BTlkgR0VORVMgT1ZFUkxBUCBBTU9ORyBVUC9OTy9ET1dOXG5zZXRzX2xpc3QgPC0gbGlzdCh1cCA9IGdlbmVMaXN0LnVwTG9vcCxcbiAgICAgICAgICAgICAgICAgIG5vID0gZ2VuZUxpc3Qubm9Mb29wLFxuICAgICAgICAgICAgICAgICAgZG93biA9IGdlbmVMaXN0LmRvd25Mb29wKVxuXG4jIENyZWF0ZSB0aGUgRXVsZXIgcGxvdFxuZXVsZXJfZml0IDwtIGV1bGVyKHNldHNfbGlzdClcbnBsb3QoZXVsZXJfZml0LFxuICAgICBsYWJlbHMgPSBUUlVFLCAgIyBEaXNwbGF5IHNldCBsYWJlbHNcbiAgICAgZmlsbHMgPSBUUlVFLCAgICMgQ29sb3IgZmlsbCB0aGUgcmVnaW9uc1xuICAgICBxdWFudGl0aWVzID0gVFJVRSlcblxuXG4jIEdPXG5HTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLnVwKVxuR08ubm8gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0Lm5vTG9vcCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5ubylcbkdPLmRvd24gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmRvd25Mb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLmRvd24sIHNob3dDYXRlZ29yeSA9IDIwKVxuXG4jIEdPIHRvIG9ubHkgc3BlY2lmaWMgc3Vic2V0XG5nZW5lTGlzdC51cExvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC51cExvb3AsIHVuaW9uKGdlbmVMaXN0Lm5vTG9vcCwgZ2VuZUxpc3QuZG93bkxvb3ApKVxuZ2VuZUxpc3Qubm9Mb29wLnNwZWNpZmljIDwtIHNldGRpZmYoZ2VuZUxpc3Qubm9Mb29wLCB1bmlvbihnZW5lTGlzdC51cExvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSlcbmdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljIDwtIHNldGRpZmYoZ2VuZUxpc3QuZG93bkxvb3AsIHVuaW9uKGdlbmVMaXN0Lm5vTG9vcCwgZ2VuZUxpc3QudXBMb29wKSlcbkdPLnVwIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC51cExvb3Auc3BlY2lmaWMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08udXApXG5HTy5ubyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3Qubm9Mb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLm5vKVxuR08uZG93biA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuZG93bkxvb3Auc3BlY2lmaWMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08uZG93bilcblxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2)

geneList.upLoop <- unique((geneAnnoData %>% dplyr::filter(updown_A485_DMSO == \UP\) %>% unnest(gene))$gene)
geneList.noLoop <- unique((geneAnnoData %>% dplyr::filter(updown_A485_DMSO == \NO\) %>% unnest(gene))$gene)
geneList.downLoop <- unique((geneAnnoData %>% dplyr::filter(updown_A485_DMSO == \DOWN\) %>% unnest(gene))$gene)



# CHECKING HOW MANY GENES OVERLAP AMONG UP/NO/DOWN
sets_list <- list(up = geneList.upLoop,
                  no = geneList.noLoop,
                  down = geneList.downLoop)

# Create the Euler plot
euler_fit <- euler(sets_list)
plot(euler_fit,
     labels = TRUE,  # Display set labels
     fills = TRUE,   # Color fill the regions
     quantities = TRUE)


# GO
GO.up <- enrichGO(gene = geneList.upLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down, showCategory = 20)

# GO to only specific subset
geneList.upLoop.specific <- setdiff(geneList.upLoop, union(geneList.noLoop, geneList.downLoop))
geneList.noLoop.specific <- setdiff(geneList.noLoop, union(geneList.upLoop, geneList.downLoop))
geneList.downLoop.specific <- setdiff(geneList.downLoop, union(geneList.noLoop, geneList.upLoop))
GO.up <- enrichGO(gene = geneList.upLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gzQXRibDlsYm5ObGJXSnNUR2x6ZEM1MGMzWmNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptUTNWMGIyWm1JRDBnTUM0eUtWeHVYRzVuWlc1bFRHbHpkQzUxY0V4dmIzQWdQQzBnZFc1cGNYVmxLQ2huWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2RYQmtiM2R1WDBFME9EVmZSRTFUVHlBOVBTQmNYRlZRWEZ3cElDVStKU0IxYm01bGMzUW9aMlZ1WlNrcEpHZGxibVVwWEc1blpXNWxUR2x6ZEM1dWIweHZiM0FnUEMwZ2RXNXBjWFZsS0NoblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9kWEJrYjNkdVgwRTBPRFZmUkUxVFR5QTlQU0JjWEU1UFhGd3BJQ1UrSlNCMWJtNWxjM1FvWjJWdVpTa3BKR2RsYm1VcFhHNW5aVzVsVEdsemRDNWtiM2R1VEc5dmNDQThMU0IxYm1seGRXVW9LR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loMWNHUnZkMjVmUVRRNE5WOUVUVk5QSUQwOUlGeGNSRTlYVGx4Y0tTQWxQaVVnZFc1dVpYTjBLR2RsYm1VcEtTUm5aVzVsS1Z4dVhHNWNibHh1SXlCRFNFVkRTMGxPUnlCSVQxY2dUVUZPV1NCSFJVNUZVeUJQVmtWU1RFRlFJRUZOVDA1SElGVlFMMDVQTDBSUFYwNWNibk5sZEhOZmJHbHpkQ0E4TFNCc2FYTjBLSFZ3SUQwZ1oyVnVaVXhwYzNRdWRYQk1iMjl3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtOGdQU0JuWlc1bFRHbHpkQzV1YjB4dmIzQXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYjNkdUlEMGdaMlZ1WlV4cGMzUXVaRzkzYmt4dmIzQXBYRzVjYmlNZ1EzSmxZWFJsSUhSb1pTQkZkV3hsY2lCd2JHOTBYRzVsZFd4bGNsOW1hWFFnUEMwZ1pYVnNaWElvYzJWMGMxOXNhWE4wS1Z4dWNHeHZkQ2hsZFd4bGNsOW1hWFFzWEc0Z0lDQWdJR3hoWW1Wc2N5QTlJRlJTVlVVc0lDQWpJRVJwYzNCc1lYa2djMlYwSUd4aFltVnNjMXh1SUNBZ0lDQm1hV3hzY3lBOUlGUlNWVVVzSUNBZ0l5QkRiMnh2Y2lCbWFXeHNJSFJvWlNCeVpXZHBiMjV6WEc0Z0lDQWdJSEYxWVc1MGFYUnBaWE1nUFNCVVVsVkZLVnh1WEc1Y2JpTWdSMDljYmtkUExuVndJRHd0SUdWdWNtbGphRWRQS0dkbGJtVWdQU0JuWlc1bFRHbHpkQzUxY0V4dmIzQXNJRTl5WjBSaUlEMGdiM0puTGsxdExtVm5MbVJpTENCclpYbFVlWEJsSUQwZ1hGeEZUbE5GVFVKTVhGd3NJRzl1ZENBOUlGeGNRbEJjWENsY2JtUnZkSEJzYjNRb1IwOHVkWEFwWEc1SFR5NXVieUE4TFNCbGJuSnBZMmhIVHloblpXNWxJRDBnWjJWdVpVeHBjM1F1Ym05TWIyOXdMQ0JQY21kRVlpQTlJRzl5Wnk1TmJTNWxaeTVrWWl3Z2EyVjVWSGx3WlNBOUlGeGNSVTVUUlUxQ1RGeGNMQ0J2Ym5RZ1BTQmNYRUpRWEZ3cFhHNWtiM1J3Ykc5MEtFZFBMbTV2S1Z4dVIwOHVaRzkzYmlBOExTQmxibkpwWTJoSFR5aG5aVzVsSUQwZ1oyVnVaVXhwYzNRdVpHOTNia3h2YjNBc0lFOXlaMFJpSUQwZ2IzSm5MazF0TG1WbkxtUmlMQ0JyWlhsVWVYQmxJRDBnWEZ4RlRsTkZUVUpNWEZ3c0lHOXVkQ0E5SUZ4Y1FsQmNYQ2xjYm1SdmRIQnNiM1FvUjA4dVpHOTNiaXdnYzJodmQwTmhkR1ZuYjNKNUlEMGdNakFwWEc1Y2JpTWdSMDhnZEc4Z2IyNXNlU0J6Y0dWamFXWnBZeUJ6ZFdKelpYUmNibWRsYm1WTWFYTjBMblZ3VEc5dmNDNXpjR1ZqYVdacFl5QThMU0J6WlhSa2FXWm1LR2RsYm1WTWFYTjBMblZ3VEc5dmNDd2dkVzVwYjI0b1oyVnVaVXhwYzNRdWJtOU1iMjl3TENCblpXNWxUR2x6ZEM1a2IzZHVURzl2Y0NrcFhHNW5aVzVsVEdsemRDNXViMHh2YjNBdWMzQmxZMmxtYVdNZ1BDMGdjMlYwWkdsbVppaG5aVzVsVEdsemRDNXViMHh2YjNBc0lIVnVhVzl1S0dkbGJtVk1hWE4wTG5Wd1RHOXZjQ3dnWjJWdVpVeHBjM1F1Wkc5M2JreHZiM0FwS1Z4dVoyVnVaVXhwYzNRdVpHOTNia3h2YjNBdWMzQmxZMmxtYVdNZ1BDMGdjMlYwWkdsbVppaG5aVzVsVEdsemRDNWtiM2R1VEc5dmNDd2dkVzVwYjI0b1oyVnVaVXhwYzNRdWJtOU1iMjl3TENCblpXNWxUR2x6ZEM1MWNFeHZiM0FwS1Z4dVIwOHVkWEFnUEMwZ1pXNXlhV05vUjA4b1oyVnVaU0E5SUdkbGJtVk1hWE4wTG5Wd1RHOXZjQzV6Y0dWamFXWnBZeXdnVDNKblJHSWdQU0J2Y21jdVRXMHVaV2N1WkdJc0lHdGxlVlI1Y0dVZ1BTQmNYRVZPVTBWTlFreGNYQ3dnYjI1MElEMGdYRnhDVUZ4Y0tWeHVaRzkwY0d4dmRDaEhUeTUxY0NsY2JrZFBMbTV2SUR3dElHVnVjbWxqYUVkUEtHZGxibVVnUFNCblpXNWxUR2x6ZEM1dWIweHZiM0F1YzNCbFkybG1hV01zSUU5eVowUmlJRDBnYjNKbkxrMXRMbVZuTG1SaUxDQnJaWGxVZVhCbElEMGdYRnhGVGxORlRVSk1YRndzSUc5dWRDQTlJRnhjUWxCY1hDbGNibVJ2ZEhCc2IzUW9SMDh1Ym04cFhHNUhUeTVrYjNkdUlEd3RJR1Z1Y21samFFZFBLR2RsYm1VZ1BTQm5aVzVsVEdsemRDNWtiM2R1VEc5dmNDNXpjR1ZqYVdacFl5d2dUM0puUkdJZ1BTQnZjbWN1VFcwdVpXY3VaR0lzSUd0bGVWUjVjR1VnUFNCY1hFVk9VMFZOUWt4Y1hDd2diMjUwSUQwZ1hGeENVRnhjS1Z4dVpHOTBjR3h2ZENoSFR5NWtiM2R1S1Z4dVhHNWNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIpXG5cbmdlbmVMaXN0LnVwTG9vcCA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fQTQ4NV9ETVNPID09IFxcVVBcXCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZSlcbmdlbmVMaXN0Lm5vTG9vcCA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fQTQ4NV9ETVNPID09IFxcTk9cXCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZSlcbmdlbmVMaXN0LmRvd25Mb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gXFxET1dOXFwpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpXG5cblxuXG4jIENIRUNLSU5HIEhPVyBNQU5ZIEdFTkVTIE9WRVJMQVAgQU1PTkcgVVAvTk8vRE9XTlxuc2V0c19saXN0IDwtIGxpc3QodXAgPSBnZW5lTGlzdC51cExvb3AsXG4gICAgICAgICAgICAgICAgICBubyA9IGdlbmVMaXN0Lm5vTG9vcCxcbiAgICAgICAgICAgICAgICAgIGRvd24gPSBnZW5lTGlzdC5kb3duTG9vcClcblxuIyBDcmVhdGUgdGhlIEV1bGVyIHBsb3RcbmV1bGVyX2ZpdCA8LSBldWxlcihzZXRzX2xpc3QpXG5wbG90KGV1bGVyX2ZpdCxcbiAgICAgbGFiZWxzID0gVFJVRSwgICMgRGlzcGxheSBzZXQgbGFiZWxzXG4gICAgIGZpbGxzID0gVFJVRSwgICAjIENvbG9yIGZpbGwgdGhlIHJlZ2lvbnNcbiAgICAgcXVhbnRpdGllcyA9IFRSVUUpXG5cblxuIyBHT1xuR08udXAgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LnVwTG9vcCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy51cClcbkdPLm5vIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ub0xvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08ubm8pXG5HTy5kb3duIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5kb3duTG9vcCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5kb3duLCBzaG93Q2F0ZWdvcnkgPSAyMClcblxuIyBHTyB0byBvbmx5IHNwZWNpZmljIHN1YnNldFxuZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljIDwtIHNldGRpZmYoZ2VuZUxpc3QudXBMb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSlcbmdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0Lm5vTG9vcCwgdW5pb24oZ2VuZUxpc3QudXBMb29wLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5nZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0LmRvd25Mb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LnVwTG9vcCkpXG5HTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLnVwKVxuR08ubm8gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5ubylcbkdPLmRvd24gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLmRvd24pXG5cblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yKVxuXG5nZW5lTGlzdC51cExvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX0E0ODVfRE1TTyA9PSBcXFVQXFwpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpXG5nZW5lTGlzdC5ub0xvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX0E0ODVfRE1TTyA9PSBcXE5PXFwpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpXG5nZW5lTGlzdC5kb3duTG9vcCA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fQTQ4NV9ETVNPID09IFxcRE9XTlxcKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKVxuXG5cblxuIyBDSEVDS0lORyBIT1cgTUFOWSBHRU5FUyBPVkVSTEFQIEFNT05HIFVQL05PL0RPV05cbnNldHNfbGlzdCA8LSBsaXN0KHVwID0gZ2VuZUxpc3QudXBMb29wLFxuICAgICAgICAgICAgICAgICAgbm8gPSBnZW5lTGlzdC5ub0xvb3AsXG4gICAgICAgICAgICAgICAgICBkb3duID0gZ2VuZUxpc3QuZG93bkxvb3ApXG5cbiMgQ3JlYXRlIHRoZSBFdWxlciBwbG90XG5ldWxlcl9maXQgPC0gZXVsZXIoc2V0c19saXN0KVxucGxvdChldWxlcl9maXQsXG4gICAgIGxhYmVscyA9IFRSVUUsICAjIERpc3BsYXkgc2V0IGxhYmVsc1xuICAgICBmaWxscyA9IFRSVUUsICAgIyBDb2xvciBmaWxsIHRoZSByZWdpb25zXG4gICAgIHF1YW50aXRpZXMgPSBUUlVFKVxuXG5cbiMgR09cbkdPLnVwIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC51cExvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08udXApXG5HTy5ubyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3Qubm9Mb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9IFxcRU5TRU1CTFxcLCBvbnQgPSBcXEJQXFwpXG5kb3RwbG90KEdPLm5vKVxuR08uZG93biA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuZG93bkxvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08uZG93biwgc2hvd0NhdGVnb3J5ID0gMjApXG5cbiMgR08gdG8gb25seSBzcGVjaWZpYyBzdWJzZXRcbmdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0LnVwTG9vcCwgdW5pb24oZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC5kb3duTG9vcCkpXG5nZW5lTGlzdC5ub0xvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5ub0xvb3AsIHVuaW9uKGdlbmVMaXN0LnVwTG9vcCwgZ2VuZUxpc3QuZG93bkxvb3ApKVxuZ2VuZUxpc3QuZG93bkxvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5kb3duTG9vcCwgdW5pb24oZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC51cExvb3ApKVxuR08udXAgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy51cClcbkdPLm5vIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ub0xvb3Auc3BlY2lmaWMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gXFxFTlNFTUJMXFwsIG9udCA9IFxcQlBcXClcbmRvdHBsb3QoR08ubm8pXG5HTy5kb3duIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSBcXEVOU0VNQkxcXCwgb250ID0gXFxCUFxcKVxuZG90cGxvdChHTy5kb3duKVxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2)

geneList.upLoop <- unique((geneAnnoData %>% dplyr::filter(updown_A485_DMSO == \UP\) %>% unnest(gene))$gene)
geneList.noLoop <- unique((geneAnnoData %>% dplyr::filter(updown_A485_DMSO == \NO\) %>% unnest(gene))$gene)
geneList.downLoop <- unique((geneAnnoData %>% dplyr::filter(updown_A485_DMSO == \DOWN\) %>% unnest(gene))$gene)



# CHECKING HOW MANY GENES OVERLAP AMONG UP/NO/DOWN
sets_list <- list(up = geneList.upLoop,
                  no = geneList.noLoop,
                  down = geneList.downLoop)

# Create the Euler plot
euler_fit <- euler(sets_list)
plot(euler_fit,
     labels = TRUE,  # Display set labels
     fills = TRUE,   # Color fill the regions
     quantities = TRUE)


# GO
GO.up <- enrichGO(gene = geneList.upLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down, showCategory = 20)

# GO to only specific subset
geneList.upLoop.specific <- setdiff(geneList.upLoop, union(geneList.noLoop, geneList.downLoop))
geneList.noLoop.specific <- setdiff(geneList.noLoop, union(geneList.upLoop, geneList.downLoop))
geneList.downLoop.specific <- setdiff(geneList.downLoop, union(geneList.noLoop, geneList.upLoop))
GO.up <- enrichGO(gene = geneList.upLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.up)
GO.no <- enrichGO(gene = geneList.noLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.no)
GO.down <- enrichGO(gene = geneList.downLoop.specific, OrgDb = org.Mm.eg.db, keyType = \ENSEMBL\, ont = \BP\)
dotplot(GO.down)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

### A485
#### P-P, P-E

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHNiMjl3SUQwOVozSnZkWEF4S1NBcEpITjFiVk5qYjNKbFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhzYjI5d0lEMDlaM0p2ZFhBeUtTQXBKSE4xYlZOamIzSmxYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzV1WVcxbElEd3RJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVndpWEc1Y2JpTWdWVkFnYkc5dmNGeHViRzl2Y0M1MWNDQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbFgyUlVRVWQyYzBSTlUwOWZWVkJmWkdsbVpqQXVNaTVpWldSd1pWd2lLU2xjYm1GdVkyaHZjaTUxY0NBOExTQW9aWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMblZ3S1NsY2JpTWdUazhnYkc5dmNGeHViRzl2Y0M1dWJ5QThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbFgyUlVRVWQyYzBSTlUwOWZUazlmWkdsbVpqQXVNaTVpWldSd1pWd2lLU2xjYm1GdVkyaHZjaTV1YnlBOExTQW9aWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbTV2S1NsY2JpTWdWVkFnVGs5Y2JteHZiM0F1ZFhCdWJ5QThMU0JpYVc1a1gzSnZkM01vYkc5dmNDNTFjQ3dnYkc5dmNDNXVieWxjYm1GdVkyaHZjaTUxY0c1dklEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1ZFhCdWJ5a3BYRzRqSUVSUFYwNGdiRzl2Y0Z4dWJHOXZjQzVrYjNkdUlEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjR1V0Y0dWZlpGUkJSM1p6UkUxVFQxOUVUMWRPWDJScFptWXdMakl1WW1Wa2NHVmNJaWtwWEc1aGJtTm9iM0l1Wkc5M2JpQThMU0FvWlhoMGNtRmpkRUZ1WTJodmNpaHNiMjl3TG1SdmQyNHBLVnh1WEc1blpYUlRkVzFUWTI5eVpYTWdQQzBnWm5WdVkzUnBiMjRvZEhKaFkyc3NJR0Z1WTJodmNpa2dlMXh1SUNBaklFWnBibVFnYjNabGNteGhjSE1nWW1WMGQyVmxiaUJoYkd3Z1lXNWphRzl5Y3lCaGJtUWdkSEpoWTJzZ2NtVm5hVzl1Y3lCaGRDQnZibU5sWEc0Z0lHOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0lzSUhSeVlXTnJLVnh1SUNCY2JpQWdJeUJGZUhSeVlXTjBJSFJvWlNCelkyOXlaWE1nWVc1a0lHTnZjbkpsYzNCdmJtUnBibWNnWVc1amFHOXlJR2x1WkdsalpYTmNiaUFnWVc1amFHOXlYMmx1WkdsalpYTWdQQzBnY1hWbGNubElhWFJ6S0c5MlpYSnNZWEJ6S1Z4dUlDQjBjbUZqYTE5elkyOXlaWE1nUEMwZ2MyTnZjbVVvZEhKaFkyc3BXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1YxY2JpQWdYRzRnSUNNZ1ZYTmxJSFJoY0hCc2VTQjBieUJqWVd4amRXeGhkR1VnZEdobElHMWxaR2xoYmlCelkyOXlaWE1nWm05eUlHVmhZMmdnWVc1amFHOXlYRzRnSUcxbFpHbGhibDl6WTI5eVpYTWdQQzBnZEdGd2NHeDVLSFJ5WVdOclgzTmpiM0psY3l3Z1lXNWphRzl5WDJsdVpHbGpaWE1zSUcxbFlXNHNJRzVoTG5KdElEMGdWRkpWUlNsY2JpQWdYRzRnSUNNZ1NXNXBkR2xoYkdsNlpTQmhJRzUxYldWeWFXTWdkbVZqZEc5eUlIUnZJSE4wYjNKbElIUm9aU0J0WldScFlXNGdjMk52Y21WeklHWnZjaUJsWVdOb0lHRnVZMmh2Y2x4dUlDQmhiR3hmYldWa2FXRnVYM05qYjNKbGN5QThMU0J5WlhBb1RrRXNJR3hsYm1kMGFDaGhibU5vYjNJcEtWeHVJQ0JjYmlBZ0l5QlFiM0IxYkdGMFpTQjBhR1VnYldWa2FXRnVJSE5qYjNKbGN5Qm1iM0lnZEdobElHRnVZMmh2Y25NZ2RHaGhkQ0JvWVhabElHOTJaWEpzWVhCelhHNGdJR0ZzYkY5dFpXUnBZVzVmYzJOdmNtVnpXMkZ6TG01MWJXVnlhV01vYm1GdFpYTW9iV1ZrYVdGdVgzTmpiM0psY3lrcFhTQThMU0J0WldScFlXNWZjMk52Y21WelhHNGdJRnh1SUNCeVpYUjFjbTRvWVd4c1gyMWxaR2xoYmw5elkyOXlaWE1wWEc1OVhHNWNibkJzYjNSVGRXMVRZMjl5WlhNZ1BDMGdablZ1WTNScGIyNG9kSEpoWTJzc0lIQmxZV3NzSUc1aGJXVXBlMXh1SUNCd1pXRnJWSEpoWTJzZ1BDMGdkSEpoWTJ0YmRXNXBjWFZsS0hGMVpYSjVTR2wwY3lobWFXNWtUM1psY214aGNITW9kSEpoWTJzc0lIQmxZV3NwS1NsZFhHNGdJR0VnUEMwZ1oyVjBVM1Z0VTJOdmNtVnpLSEJsWVd0VWNtRmpheXdnWVc1amFHOXlMblZ3S1Z4dUlDQmlJRHd0SUdkbGRGTjFiVk5qYjNKbGN5aHdaV0ZyVkhKaFkyc3NJR0Z1WTJodmNpNXVieWxjYmlBZ1l5QThMU0JuWlhSVGRXMVRZMjl5WlhNb2NHVmhhMVJ5WVdOckxDQmhibU5vYjNJdVpHOTNiaWxjYmlBZ1lTNTBZaUE4TFNCMGFXSmliR1VvYkc5dmNDQTlJRndpVlZCY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM1Z0VTJOdmNtVWdQU0JoS1Z4dUlDQmlMblJpSUR3dElIUnBZbUpzWlNoc2IyOXdJRDBnWENKT1Qxd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZFcxVFkyOXlaU0E5SUdJcFhHNGdJR011ZEdJZ1BDMGdkR2xpWW14bEtHeHZiM0FnUFNCY0lrUlBWMDVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzVnRVMk52Y21VZ1BTQmpLVnh1SUNCa1lYUmhJRHd0SUdKcGJtUmZjbTkzY3loaExuUmlMQ0JpTG5SaUxDQmpMblJpS1NBbFBpVWdaSEp2Y0Y5dVlTZ3BYRzRnSUdkbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlHeHZiM0FzSUhrZ1BTQnpkVzFUWTI5eVpTa3BJQ3NnWEc0Z0lDQWdiR0ZpY3loNElEMGdUbFZNVEN3Z2VTQTlJSEJoYzNSbE1DaHVZVzFsTENCY0lpQmhkbVZ5WVdkbElIQmxZV3NnYzJOdmNtVWdjR1Z5SUdGdVkyaHZjbHdpS1NrZ0sxeHVJQ0FnSUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdaM0p2ZFhBcExDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDdGNiaUFnSUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMakVzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2ZFhSc2FXVnlMbk5wZW1VZ1BTQXhMQ0J2ZFhSc2FXVnlMbk4wY205clpTQTlJRTVCS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJQ0FnYzNSaGRGOXpkVzF0WVhKNUtGeHVJQ0FnSUNBZ1lXVnpLR2R5YjNWd0lEMGdiRzl2Y0Nrc0lHWjFiaUE5SUcxbFlXNHNYRzRnSUNBZ0lDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNU3hjYmlBZ0lDQWdJR1pwYkd3Z1BTQmNJbkpsWkZ3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lseHVJQ0FnSUNrZ0sxeHVJQ0FnSUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWd3TENCeGRXRnVkR2xzWlNoa1lYUmhKSE4xYlZOamIzSmxMQ0F3TGprMUtTa3BJQ3NnZEdobGJXVW9YRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2dZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCaGJtZHNaU0E5SURRMUxDQm9hblZ6ZENBOUlERXNJSFpxZFhOMElEMGdNVnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl3Z2MybDZaU0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHbGphM01nUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYQ0owY21GdWMzQmhjbVZ1ZEZ3aUtTeGNiaUFnSUNCc1pXZGxibVF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnYkdWblpXNWtMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1Z4dUlDQXBYRzU5WEc1Y2JuQnNiM1JUZFcxVFkyOXlaWE5DYVc1aGNua2dQQzBnWm5WdVkzUnBiMjRvZEhKaFkyc3NJSEJsWVdzc0lHNWhiV1VzSUdGdVkyaHZjaTUxY0c1dkxDQmhibU5vYjNJdVpHOTNiaWw3WEc0Z0lIQmxZV3RVY21GamF5QThMU0IwY21GamExdDFibWx4ZFdVb2NYVmxjbmxJYVhSektHWnBibVJQZG1WeWJHRndjeWgwY21GamF5d2djR1ZoYXlrcEtWMWNiaUFnWWlBOExTQm5aWFJUZFcxVFkyOXlaWE1vY0dWaGExUnlZV05yTENCaGJtTm9iM0l1ZFhCdWJ5bGNiaUFnWXlBOExTQm5aWFJUZFcxVFkyOXlaWE1vY0dWaGExUnlZV05yTENCaGJtTm9iM0l1Wkc5M2JpbGNiaUFnWWk1MFlpQThMU0IwYVdKaWJHVW9iRzl2Y0NBOUlGd2lWVkF2VGs5Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM1Z0VTJOdmNtVWdQU0JpS1Z4dUlDQmpMblJpSUR3dElIUnBZbUpzWlNoc2IyOXdJRDBnWENKRVQxZE9YQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOMWJWTmpiM0psSUQwZ1l5bGNiaUFnWkdGMFlTQThMU0JpYVc1a1gzSnZkM01vWWk1MFlpd2dZeTUwWWlrZ0pUNGxJR1J5YjNCZmJtRW9LVnh1SUNCa1lYUmhKR3h2YjNBZ1BDMGdabUZqZEc5eUtHUmhkR0VrYkc5dmNDd2diR1YyWld4eklEMGdZeWhjSWxWUUwwNVBYQ0lzSUZ3aVJFOVhUbHdpS1NsY2JpQWdYRzRnSUhBeE1pQThMU0JuWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0VzSUZ3aVZWQXZUazljSWl3Z1hDSkVUMWRPWENJcFhHNGdJSEFnUEMwZ0lHZG5jR3h2ZENoa1lYUmhMQ0JoWlhNb2VDQTlJRzVoYldVc0lHWnBiR3dnUFNCc2IyOXdMQ0I1SUQwZ2MzVnRVMk52Y21VcEtTQXJJRnh1SUNBZ0lHeGhZbk1vZUNBOUlFNVZURXdzSUhrZ1BTQndZWE4wWlRBb1hDSkJkbVZ5WVdkbElFTm9TVkFnY0dWaGF5QnpZMjl5WlNCaGRDQmhibU5vYjNJcFhDSXBLU0FyWEc0Z0lDQWdhVzUwY205a1lYUmhkbWw2T2pwblpXOXRYM053YkdsMFgzWnBiMnhwYmloc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVd4d2FHRWdQU0F1TkNrZ0sxeHVJQ0FnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNeXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU3dnSUdGc2NHaGhJRDBnTUM0MkxDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FyWEc0Z0lDQWdjM1JoZEY5emRXMXRZWEo1S0Z4dUlDQWdJQ0FnWVdWektHZHliM1Z3SUQwZ2JHOXZjQ2tzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnSUNCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01DNDFMRnh1SUNBZ0lDQWdabWxzYkNBOUlGd2lZbXhoWTJ0Y0lpd2dZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJSEJ2YzJsMGFXOXVJRDBnY0c5emFYUnBiMjVmWkc5a1oyVW9Mak1wWEc0Z0lDQWdLU0FySUhSb1pXMWxLRnh1SUNBZ0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTd2dabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0pjYmlBZ0lDQWdJQ2tzWEc0Z0lDQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpVMHNJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpWEc0Z0lDQWdJQ0FwTEZ4dUlDQWdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0FnSUdGdVoyeGxJRDBnTUN4Y2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCaGVHbHpMblJsZUhRdWVTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl4Y2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnSUNBcExGeHVJQ0FnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpd2djMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBZ0lDa3NYRzRnSUNBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjSW5SeVlXNXpjR0Z5Wlc1MFhDSXBMRnh1SUNBZ0lDQWdiR1ZuWlc1a0xuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBMRnh1SUNBZ0lDQWdiR1ZuWlc1a0xuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLVnh1SUNBZ0lDa2dLeUJjYmlBZ0lDQmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb2NYVmhiblJwYkdVb1pHRjBZU1J6ZFcxVFkyOXlaU3dnTUM0d0tTd2djWFZoYm5ScGJHVW9aR0YwWVNSemRXMVRZMjl5WlN3Z01DNDVLU2twSUNzZ1hHNGdJQ0FnWVc1dWIzUmhkR1VvWEc0Z0lDQWdJRndpZEdWNGRGd2lMQ0I0SUQwZ01Td2dlU0E5SUhGMVlXNTBhV3hsS0dSaGRHRWtjM1Z0VTJOdmNtVXNJREF1TlNrc1hHNGdJQ0FnSUd4aFltVnNJRDBnY0dGemRHVXdLRndpY0RFeU9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod01USXBLU3hjYmlBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJR2hxZFhOMElEMGdNQ3dnYzJsNlpTQTlJRE5jYmlBZ0lDa2dLeUFnSUdkMWFXUmxjeWhjYmlBZ0lDQm1hV3hzSUQwZ1ozVnBaR1ZmYkdWblpXNWtLRnh1SUNBZ0lDQWdJQ0JyWlhsM2FXUjBhQ0E5SURBdU1pd2dJQ01nUVdScWRYTjBJSFJvWlNCM2FXUjBhQ0J2WmlCMGFHVWdiR1ZuWlc1a0lHdGxlWE5jYmlBZ0lDQWdJQ0FnYTJWNWFHVnBaMmgwSUQwZ01DNHlJQ0FqSUVGa2FuVnpkQ0IwYUdVZ2FHVnBaMmgwSUc5bUlIUm9aU0JzWldkbGJtUWdhMlY1YzF4dUlDQWdJQ2xjYmlBZ0tWeHVJQ0JjYmlBZ0lHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJa05vU1ZCZmNHVmhhMTloZG1kUVpXRnJVMk52Y21WZlhDSXNJRzVoYldVcFhHNGdJSGRwWkhSb0lEd3RJSEJoYm1Wc1UybDZaU2d4TGpVcEttMXRWRzlKYm1Ob1hHNGdJR2hsYVdkb2RDQThMU0J3WVc1bGJGTnBlbVVvTVM0eUtTcHRiVlJ2U1c1amFGeHVJQ0J3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dUlDQnpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzRnSUhCeWFXNTBLSEFwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVmVnh1WEc0aklGTjFiU0J3WldGcklITmpiM0psWEc0akl5TWpYRzUwY21GamF5QThMU0JwYlhCdmNuUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aU16TXlOVFZmU0ROTE5HMWxNMTh3TkMwM05EVmZRbkoxWTJVdE5GOTBjbWx0WDNFeU1GOWtaV1IxY0Y5aWJHRmphMTlrWlhCMGFFNXZjbTB1WW5kY0lpa3NJR1p2Y20xaGRDQTlJRndpUW1sblYybG5YQ0lwWEc1d1pXRnJJRHd0SUdsdGNHOXlkRkJsWVdzb2FHVnlaU2h5WldaRWFYSXNJRndpTXpNeU5UVmZTRE5MTkcxbE0xOHdOQzAzTkRWZlFuSjFZMlV0TkY5d1pXRnJjeTV0WlhKblpWQmxZV3N1WW1Wa1hDSXBLVnh1STNCc2IzUlRkVzFUWTI5eVpYTW9kSEpoWTJzc0lIQmxZV3NzSUZ3aVNETkxORzFsTTF3aUtWeHVjR3h2ZEZOMWJWTmpiM0psYzBKcGJtRnllU2gwY21GamF5d2djR1ZoYXl3Z1hDSklNMHMwYldVelhDSXNJR0Z1WTJodmNpNTFjRzV2TENCaGJtTm9iM0l1Wkc5M2JpbGNibHh1ZEhKaFkyc2dQQzBnYVcxd2IzSjBLR2hsY21Vb2NtVm1SR2x5TENCY0lrZFRUVEkwTXpnME56WmZSVU10UkVjdE16UTFPQzFJTTBzeU4wRkRYMEZUV1U1Zk1TNWlkMXdpS1N3Z1ptOXliV0YwSUQwZ1hDSkNhV2RYYVdkY0lpbGNibkJsWVdzZ1BDMGdhVzF3YjNKMFVHVmhheWhvWlhKbEtISmxaa1JwY2l3Z1hDSkhVMDB5TkRNNE5EYzJYMFZETFVSSExUTTBOVGd0U0ROTE1qZEJRMTlCVTFsT1h6RXVibUZ5Y205M1VHVmhheTVpWldSY0lpa3BYRzRqY0d4dmRGTjFiVk5qYjNKbGN5aDBjbUZqYXl3Z2NHVmhheXdnWENKSU0wc3lOMkZqWENJcFhHNXdiRzkwVTNWdFUyTnZjbVZ6UW1sdVlYSjVLSFJ5WVdOckxDQndaV0ZyTENCY0lrZ3pTekkzWVdOY0lpd2dZVzVqYUc5eUxuVndibThzSUdGdVkyaHZjaTVrYjNkdUtWeHVYRzUwY21GamF5QThMU0JwYlhCdmNuUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVIxTk5Nalk0TXpRME1GOUtNVjlJTTBzeE5HRmpYMjF0TVRCTWFXWjBaV1F1WW14aFkyc3VZbmRjSWlrc0lHWnZjbTFoZENBOUlGd2lRbWxuVjJsblhDSXBYRzV3WldGcklEd3RJR2x0Y0c5eWRGQmxZV3NvYUdWeVpTaHlaV1pFYVhJc0lGd2lSMU5OTWpZNE16UTBNRjlLTVY5SU0wc3hOR0ZqWDIxdE1UQk1hV1owWldRdVltVmtYQ0lwS1Z4dUkzQnNiM1JUZFcxVFkyOXlaWE1vZEhKaFkyc3NJSEJsWVdzc0lGd2lTRE5MTVRSaFkxd2lLVnh1Y0d4dmRGTjFiVk5qYjNKbGMwSnBibUZ5ZVNoMGNtRmpheXdnY0dWaGF5d2dYQ0pJTTBzeE5HRmpYQ0lzSUdGdVkyaHZjaTUxY0c1dkxDQmhibU5vYjNJdVpHOTNiaWxjYmx4dWRISmhZMnNnUEMwZ2FXMXdiM0owS0dobGNtVW9jbVZtUkdseUxDQmNJak16TWpRNFgwTlVRMFpmTURjdE56STVYMEp5ZFdObExUUmZkSEpwYlY5eE1qQmZaR1ZrZFhCZllteGhZMnRmWkdWd2RHaE9iM0p0TG1KM1hDSXBMQ0JtYjNKdFlYUWdQU0JjSWtKcFoxZHBaMXdpS1Z4dWNHVmhheUE4TFNCcGJYQnZjblJRWldGcktHaGxjbVVvY21WbVJHbHlMQ0JjSWpNek1qUTRYME5VUTBaZk1EY3ROekk1WDBKeWRXTmxMVFJmY0dWaGEzTXViV1Z5WjJWUVpXRnJMbUpsWkZ3aUtTbGNiaU53Ykc5MFUzVnRVMk52Y21WektIUnlZV05yTENCd1pXRnJMQ0JjSWtOVVEwWmNJaWxjYm5Cc2IzUlRkVzFUWTI5eVpYTkNhVzVoY25rb2RISmhZMnNzSUhCbFlXc3NJRndpUTFSRFJsd2lMQ0JoYm1Ob2IzSXVkWEJ1Ynl3Z1lXNWphRzl5TG1SdmQyNHBYRzVjYm5SeVlXTnJJRHd0SUdsdGNHOXlkQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSXpNekkxTUY5U1FVUXlNVjloWWprNU1sOUNjblZqWlMwMFgzUnlhVzFmY1RJd1gyUmxaSFZ3WDJKc1lXTnJYMlJsY0hSb1RtOXliUzVpZDF3aUtTd2dabTl5YldGMElEMGdYQ0pDYVdkWGFXZGNJaWxjYm5CbFlXc2dQQzBnYVcxd2IzSjBVR1ZoYXlob1pYSmxLSEpsWmtScGNpd2dYQ0l6TXpJMU1GOVNRVVF5TVY5aFlqazVNbDlDY25WalpTMDBYM0JsWVd0ekxtMWxjbWRsVUdWaGF5NWlaV1JjSWlrcFhHNGpjR3h2ZEZOMWJWTmpiM0psY3loMGNtRmpheXdnY0dWaGF5d2dYQ0pTUVVReU1Wd2lLVnh1Y0d4dmRGTjFiVk5qYjNKbGMwSnBibUZ5ZVNoMGNtRmpheXdnY0dWaGF5d2dYQ0pTUVVReU1Wd2lMQ0JoYm1Ob2IzSXVkWEJ1Ynl3Z1lXNWphRzl5TG1SdmQyNHBYRzVjYmx4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGxvb3AgPT1ncm91cDEpICkkc3VtU2NvcmVcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGxvb3AgPT1ncm91cDIpICkkc3VtU2NvcmVcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuIyBVUCBsb29wXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxuIyBOTyBsb29wXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxuIyBVUCBOT1xubG9vcC51cG5vIDwtIGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKVxuYW5jaG9yLnVwbm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cG5vKSlcbiMgRE9XTiBsb29wXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpXG5cbmdldFN1bVNjb3JlcyA8LSBmdW5jdGlvbih0cmFjaywgYW5jaG9yKSB7XG4gICMgRmluZCBvdmVybGFwcyBiZXR3ZWVuIGFsbCBhbmNob3JzIGFuZCB0cmFjayByZWdpb25zIGF0IG9uY2VcbiAgb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvciwgdHJhY2spXG4gIFxuICAjIEV4dHJhY3QgdGhlIHNjb3JlcyBhbmQgY29ycmVzcG9uZGluZyBhbmNob3IgaW5kaWNlc1xuICBhbmNob3JfaW5kaWNlcyA8LSBxdWVyeUhpdHMob3ZlcmxhcHMpXG4gIHRyYWNrX3Njb3JlcyA8LSBzY29yZSh0cmFjaylbc3ViamVjdEhpdHMob3ZlcmxhcHMpXVxuICBcbiAgIyBVc2UgdGFwcGx5IHRvIGNhbGN1bGF0ZSB0aGUgbWVkaWFuIHNjb3JlcyBmb3IgZWFjaCBhbmNob3JcbiAgbWVkaWFuX3Njb3JlcyA8LSB0YXBwbHkodHJhY2tfc2NvcmVzLCBhbmNob3JfaW5kaWNlcywgbWVhbiwgbmEucm0gPSBUUlVFKVxuICBcbiAgIyBJbml0aWFsaXplIGEgbnVtZXJpYyB2ZWN0b3IgdG8gc3RvcmUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIGVhY2ggYW5jaG9yXG4gIGFsbF9tZWRpYW5fc2NvcmVzIDwtIHJlcChOQSwgbGVuZ3RoKGFuY2hvcikpXG4gIFxuICAjIFBvcHVsYXRlIHRoZSBtZWRpYW4gc2NvcmVzIGZvciB0aGUgYW5jaG9ycyB0aGF0IGhhdmUgb3ZlcmxhcHNcbiAgYWxsX21lZGlhbl9zY29yZXNbYXMubnVtZXJpYyhuYW1lcyhtZWRpYW5fc2NvcmVzKSldIDwtIG1lZGlhbl9zY29yZXNcbiAgXG4gIHJldHVybihhbGxfbWVkaWFuX3Njb3Jlcylcbn1cblxucGxvdFN1bVNjb3JlcyA8LSBmdW5jdGlvbih0cmFjaywgcGVhaywgbmFtZSl7XG4gIHBlYWtUcmFjayA8LSB0cmFja1t1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyh0cmFjaywgcGVhaykpKV1cbiAgYSA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IudXApXG4gIGIgPC0gZ2V0U3VtU2NvcmVzKHBlYWtUcmFjaywgYW5jaG9yLm5vKVxuICBjIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvci5kb3duKVxuICBhLnRiIDwtIHRpYmJsZShsb29wID0gXFxVUFxcLFxuICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGEpXG4gIGIudGIgPC0gdGliYmxlKGxvb3AgPSBcXE5PXFwsXG4gICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYilcbiAgYy50YiA8LSB0aWJibGUobG9vcCA9IFxcRE9XTlxcLFxuICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGMpXG4gIGRhdGEgPC0gYmluZF9yb3dzKGEudGIsIGIudGIsIGMudGIpICU+JSBkcm9wX25hKClcbiAgZ2dwbG90KGRhdGEsIGFlcyh4ID0gbG9vcCwgeSA9IHN1bVNjb3JlKSkgKyBcbiAgICBsYWJzKHggPSBOVUxMLCB5ID0gcGFzdGUwKG5hbWUsIFxcIGF2ZXJhZ2UgcGVhayBzY29yZSBwZXIgYW5jaG9yXFwpKSArXG4gICAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgIG91dGxpZXIuc2l6ZSA9IDEsIG91dGxpZXIuc3Ryb2tlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSBsb29wKSwgZnVuID0gbWVhbixcbiAgICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLFxuICAgICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICAgKSArXG4gICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIHF1YW50aWxlKGRhdGEkc3VtU2NvcmUsIDAuOTUpKSkgKyB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcbn1cblxucGxvdFN1bVNjb3Jlc0JpbmFyeSA8LSBmdW5jdGlvbih0cmFjaywgcGVhaywgbmFtZSwgYW5jaG9yLnVwbm8sIGFuY2hvci5kb3duKXtcbiAgcGVha1RyYWNrIDwtIHRyYWNrW3VuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKHRyYWNrLCBwZWFrKSkpXVxuICBiIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvci51cG5vKVxuICBjIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvci5kb3duKVxuICBiLnRiIDwtIHRpYmJsZShsb29wID0gXFxVUC9OT1xcLFxuICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGIpXG4gIGMudGIgPC0gdGliYmxlKGxvb3AgPSBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBjKVxuICBkYXRhIDwtIGJpbmRfcm93cyhiLnRiLCBjLnRiKSAlPiUgZHJvcF9uYSgpXG4gIGRhdGEkbG9vcCA8LSBmYWN0b3IoZGF0YSRsb29wLCBsZXZlbHMgPSBjKFxcVVAvTk9cXCwgXFxET1dOXFwpKVxuICBcbiAgcDEyIDwtIGdldFB2YWxXaWxjb3goZGF0YSwgXFxVUC9OT1xcLCBcXERPV05cXClcbiAgcCA8LSAgZ2dwbG90KGRhdGEsIGFlcyh4ID0gbmFtZSwgZmlsbCA9IGxvb3AsIHkgPSBzdW1TY29yZSkpICsgXG4gICAgbGFicyh4ID0gTlVMTCwgeSA9IHBhc3RlMChcXEF2ZXJhZ2UgQ2hJUCBwZWFrIHNjb3JlIGF0IGFuY2hvcilcXCkpICtcbiAgICBpbnRyb2RhdGF2aXo6Omdlb21fc3BsaXRfdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IC40KSArXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSBsb29wKSwgZnVuID0gbWVhbixcbiAgICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgICApICsgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgYW5nbGUgPSAwLFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgKSxcbiAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKSArIFxuICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyhxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjApLCBxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjkpKSkgKyBcbiAgICBhbm5vdGF0ZShcbiAgICAgXFx0ZXh0XFwsIHggPSAxLCB5ID0gcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC41KSxcbiAgICAgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMikpLFxuICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gM1xuICAgKSArICAgZ3VpZGVzKFxuICAgIGZpbGwgPSBndWlkZV9sZWdlbmQoXG4gICAgICAgIGtleXdpZHRoID0gMC4yLCAgIyBBZGp1c3QgdGhlIHdpZHRoIG9mIHRoZSBsZWdlbmQga2V5c1xuICAgICAgICBrZXloZWlnaHQgPSAwLjIgICMgQWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgKVxuICApXG4gIFxuICAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcQ2hJUF9wZWFrX2F2Z1BlYWtTY29yZV9cXCwgbmFtZSlcbiAgd2lkdGggPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5cbiMgU3VtIHBlYWsgc2NvcmVcbiMjIyNcbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFwzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG4jcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxIM0s0bWUzXFwpXG5wbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCBcXEgzSzRtZTNcXCwgYW5jaG9yLnVwbm8sIGFuY2hvci5kb3duKVxuXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5uYXJyb3dQZWFrLmJlZFxcKSlcbiNwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXEgzSzI3YWNcXClcbnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssIFxcSDNLMjdhY1xcLCBhbmNob3IudXBubywgYW5jaG9yLmRvd24pXG5cbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFxHU00yNjgzNDQwX0oxX0gzSzE0YWNfbW0xMExpZnRlZC5ibGFjay5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNjgzNDQwX0oxX0gzSzE0YWNfbW0xMExpZnRlZC5iZWRcXCkpXG4jcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxIM0sxNGFjXFwpXG5wbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCBcXEgzSzE0YWNcXCwgYW5jaG9yLnVwbm8sIGFuY2hvci5kb3duKVxuXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxuI3Bsb3RTdW1TY29yZXModHJhY2ssIHBlYWssIFxcQ1RDRlxcKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxDVENGXFwsIGFuY2hvci51cG5vLCBhbmNob3IuZG93bilcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXDMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfdHJpbV9xMjBfZGVkdXBfYmxhY2tfZGVwdGhOb3JtLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbiNwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXFJBRDIxXFwpXG5wbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCBcXFJBRDIxXFwsIGFuY2hvci51cG5vLCBhbmNob3IuZG93bilcblxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(loop ==group1) )$sumScore
  distance2 <- (data %>% dplyr::filter(loop ==group2) )$sumScore
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

name <- \chromo_cons_annoHierarchy\

# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
# UP NO
loop.upno <- bind_rows(loop.up, loop.no)
anchor.upno <- (extractAnchor(loop.upno))
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))

getSumScores <- function(track, anchor) {
  # Find overlaps between all anchors and track regions at once
  overlaps <- findOverlaps(anchor, track)
  
  # Extract the scores and corresponding anchor indices
  anchor_indices <- queryHits(overlaps)
  track_scores <- score(track)[subjectHits(overlaps)]
  
  # Use tapply to calculate the median scores for each anchor
  median_scores <- tapply(track_scores, anchor_indices, mean, na.rm = TRUE)
  
  # Initialize a numeric vector to store the median scores for each anchor
  all_median_scores <- rep(NA, length(anchor))
  
  # Populate the median scores for the anchors that have overlaps
  all_median_scores[as.numeric(names(median_scores))] <- median_scores
  
  return(all_median_scores)
}

plotSumScores <- function(track, peak, name){
  peakTrack <- track[unique(queryHits(findOverlaps(track, peak)))]
  a <- getSumScores(peakTrack, anchor.up)
  b <- getSumScores(peakTrack, anchor.no)
  c <- getSumScores(peakTrack, anchor.down)
  a.tb <- tibble(loop = \UP\,
                 sumScore = a)
  b.tb <- tibble(loop = \NO\,
                 sumScore = b)
  c.tb <- tibble(loop = \DOWN\,
                 sumScore = c)
  data <- bind_rows(a.tb, b.tb, c.tb) %>% drop_na()
  ggplot(data, aes(x = loop, y = sumScore)) + 
    labs(x = NULL, y = paste0(name, \ average peak score per anchor\)) +
    geom_violin(aes(fill = group), color = \black\,
                linewidth = lineThick * mmToLineUnit, lineend = \square\,
                show.legend = FALSE) +
    geom_boxplot(width = 0.1, color = \black\,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\,
                 outlier.size = 1, outlier.stroke = NA) + theme_classic() +
    stat_summary(
      aes(group = loop), fun = mean,
      geom = \point\, shape = 21, size = 1,
      fill = \red\, color = \black\
    ) +
    coord_cartesian(ylim = c(0, quantile(data$sumScore, 0.95))) + theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )
}

plotSumScoresBinary <- function(track, peak, name, anchor.upno, anchor.down){
  peakTrack <- track[unique(queryHits(findOverlaps(track, peak)))]
  b <- getSumScores(peakTrack, anchor.upno)
  c <- getSumScores(peakTrack, anchor.down)
  b.tb <- tibble(loop = \UP/NO\,
                 sumScore = b)
  c.tb <- tibble(loop = \DOWN\,
                 sumScore = c)
  data <- bind_rows(b.tb, c.tb) %>% drop_na()
  data$loop <- factor(data$loop, levels = c(\UP/NO\, \DOWN\))
  
  p12 <- getPvalWilcox(data, \UP/NO\, \DOWN\)
  p <-  ggplot(data, aes(x = name, fill = loop, y = sumScore)) + 
    labs(x = NULL, y = paste0(\Average ChIP peak score at anchor)\)) +
    introdataviz::geom_split_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\,
                                    alpha = .4) +
    geom_boxplot(width = 0.3, color = \black\,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\,
                 outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + theme_classic() +
    stat_summary(
      aes(group = loop), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) + theme(
      axis.title = element_text(
        size = fontSizeM, family = fontType, color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeM, family = fontType, color = \#000000\
      ),
      axis.text.x = element_text(
        angle = 0,
      ),
      axis.text.y = element_text(
        size = fontSizeS,
      ),
      axis.line = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
      legend.text = element_text(family = fontType, size = fontSizeS),
      legend.title = element_text(family = fontType, size = fontSizeS)
    ) + 
    coord_cartesian(ylim = c(quantile(data$sumScore, 0.0), quantile(data$sumScore, 0.9))) + 
    annotate(
     \text\, x = 1, y = quantile(data$sumScore, 0.5),
     label = paste0(\p12: \, convPvalue(p12)),
     color = \black\, hjust = 0, size = 3
   ) +   guides(
    fill = guide_legend(
        keywidth = 0.2,  # Adjust the width of the legend keys
        keyheight = 0.2  # Adjust the height of the legend keys
    )
  )
  
   fileName <- paste0(\ChIP_peak_avgPeakScore_\, name)
  width <- panelSize(1.5)*mmToInch
  height <- panelSize(1.2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# Sum peak score
####
track <- import(here(refDir, \33255_H3K4me3_04-745_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.bed\))
#plotSumScores(track, peak, \H3K4me3\)
plotSumScoresBinary(track, peak, \H3K4me3\, anchor.upno, anchor.down)

track <- import(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
#plotSumScores(track, peak, \H3K27ac\)
plotSumScoresBinary(track, peak, \H3K27ac\, anchor.upno, anchor.down)

track <- import(here(refDir, \GSM2683440_J1_H3K14ac_mm10Lifted.black.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM2683440_J1_H3K14ac_mm10Lifted.bed\))
#plotSumScores(track, peak, \H3K14ac\)
plotSumScoresBinary(track, peak, \H3K14ac\, anchor.upno, anchor.down)

track <- import(here(refDir, \33248_CTCF_07-729_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))
#plotSumScores(track, peak, \CTCF\)
plotSumScoresBinary(track, peak, \CTCF\, anchor.upno, anchor.down)

track <- import(here(refDir, \33250_RAD21_ab992_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))
#plotSumScores(track, peak, \RAD21\)
plotSumScoresBinary(track, peak, \RAD21\, anchor.upno, anchor.down)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loc2IyOXdJRDA5WjNKdmRYQXhLU0FwSkhOMWJWTmpiM0psWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHNiMjl3SUQwOVozSnZkWEF5S1NBcEpITjFiVk5qYjNKbFhHNGdJSGRwYkNBOExTQjNhV3hqYjNndWRHVnpkQ2hrYVhOMFlXNWpaVEVzSUdScGMzUmhibU5sTWlsY2JpQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1ZlZ4dVhHNXVZVzFsSUR3dElGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWeGNYRzVjYmlNZ1ZWQWdiRzl2Y0Z4dWJHOXZjQzUxY0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDJSVVFVZDJjMFJOVTA5ZlZWQmZaR2xtWmpBdU1pNWlaV1J3WlZ4Y0tTbGNibUZ1WTJodmNpNTFjQ0E4TFNBb1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xuVndLU2xjYmlNZ1RrOGdiRzl2Y0Z4dWJHOXZjQzV1YnlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDJSVVFVZDJjMFJOVTA5ZlRrOWZaR2xtWmpBdU1pNWlaV1J3WlZ4Y0tTbGNibUZ1WTJodmNpNXVieUE4TFNBb1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtNXZLU2xjYmlNZ1ZWQWdUazljYm14dmIzQXVkWEJ1YnlBOExTQmlhVzVrWDNKdmQzTW9iRzl2Y0M1MWNDd2diRzl2Y0M1dWJ5bGNibUZ1WTJodmNpNTFjRzV2SUR3dElDaGxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVkWEJ1YnlrcFhHNGpJRVJQVjA0Z2JHOXZjRnh1Ykc5dmNDNWtiM2R1SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZmNHVXRjR1ZmWkZSQlIzWnpSRTFUVDE5RVQxZE9YMlJwWm1Zd0xqSXVZbVZrY0dWY1hDa3BYRzVoYm1Ob2IzSXVaRzkzYmlBOExTQW9aWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbVJ2ZDI0cEtWeHVYRzVuWlhSVGRXMVRZMjl5WlhNZ1BDMGdablZ1WTNScGIyNG9kSEpoWTJzc0lHRnVZMmh2Y2lrZ2UxeHVJQ0FqSUVacGJtUWdiM1psY214aGNITWdZbVYwZDJWbGJpQmhiR3dnWVc1amFHOXljeUJoYm1RZ2RISmhZMnNnY21WbmFXOXVjeUJoZENCdmJtTmxYRzRnSUc5MlpYSnNZWEJ6SUR3dElHWnBibVJQZG1WeWJHRndjeWhoYm1Ob2IzSXNJSFJ5WVdOcktWeHVJQ0JjYmlBZ0l5QkZlSFJ5WVdOMElIUm9aU0J6WTI5eVpYTWdZVzVrSUdOdmNuSmxjM0J2Ym1ScGJtY2dZVzVqYUc5eUlHbHVaR2xqWlhOY2JpQWdZVzVqYUc5eVgybHVaR2xqWlhNZ1BDMGdjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVnh1SUNCMGNtRmphMTl6WTI5eVpYTWdQQzBnYzJOdmNtVW9kSEpoWTJzcFczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjFjYmlBZ1hHNGdJQ01nVlhObElIUmhjSEJzZVNCMGJ5QmpZV3hqZFd4aGRHVWdkR2hsSUcxbFpHbGhiaUJ6WTI5eVpYTWdabTl5SUdWaFkyZ2dZVzVqYUc5eVhHNGdJRzFsWkdsaGJsOXpZMjl5WlhNZ1BDMGdkR0Z3Y0d4NUtIUnlZV05yWDNOamIzSmxjeXdnWVc1amFHOXlYMmx1WkdsalpYTXNJRzFsWVc0c0lHNWhMbkp0SUQwZ1ZGSlZSU2xjYmlBZ1hHNGdJQ01nU1c1cGRHbGhiR2w2WlNCaElHNTFiV1Z5YVdNZ2RtVmpkRzl5SUhSdklITjBiM0psSUhSb1pTQnRaV1JwWVc0Z2MyTnZjbVZ6SUdadmNpQmxZV05vSUdGdVkyaHZjbHh1SUNCaGJHeGZiV1ZrYVdGdVgzTmpiM0psY3lBOExTQnlaWEFvVGtFc0lHeGxibWQwYUNoaGJtTm9iM0lwS1Z4dUlDQmNiaUFnSXlCUWIzQjFiR0YwWlNCMGFHVWdiV1ZrYVdGdUlITmpiM0psY3lCbWIzSWdkR2hsSUdGdVkyaHZjbk1nZEdoaGRDQm9ZWFpsSUc5MlpYSnNZWEJ6WEc0Z0lHRnNiRjl0WldScFlXNWZjMk52Y21WelcyRnpMbTUxYldWeWFXTW9ibUZ0WlhNb2JXVmthV0Z1WDNOamIzSmxjeWtwWFNBOExTQnRaV1JwWVc1ZmMyTnZjbVZ6WEc0Z0lGeHVJQ0J5WlhSMWNtNG9ZV3hzWDIxbFpHbGhibDl6WTI5eVpYTXBYRzU5WEc1Y2JuQnNiM1JUZFcxVFkyOXlaWE1nUEMwZ1puVnVZM1JwYjI0b2RISmhZMnNzSUhCbFlXc3NJRzVoYldVcGUxeHVJQ0J3WldGclZISmhZMnNnUEMwZ2RISmhZMnRiZFc1cGNYVmxLSEYxWlhKNVNHbDBjeWhtYVc1a1QzWmxjbXhoY0hNb2RISmhZMnNzSUhCbFlXc3BLU2xkWEc0Z0lHRWdQQzBnWjJWMFUzVnRVMk52Y21WektIQmxZV3RVY21GamF5d2dZVzVqYUc5eUxuVndLVnh1SUNCaUlEd3RJR2RsZEZOMWJWTmpiM0psY3lod1pXRnJWSEpoWTJzc0lHRnVZMmh2Y2k1dWJ5bGNiaUFnWXlBOExTQm5aWFJUZFcxVFkyOXlaWE1vY0dWaGExUnlZV05yTENCaGJtTm9iM0l1Wkc5M2JpbGNiaUFnWVM1MFlpQThMU0IwYVdKaWJHVW9iRzl2Y0NBOUlGeGNWVkJjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzVnRVMk52Y21VZ1BTQmhLVnh1SUNCaUxuUmlJRHd0SUhScFltSnNaU2hzYjI5d0lEMGdYRnhPVDF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpkVzFUWTI5eVpTQTlJR0lwWEc0Z0lHTXVkR0lnUEMwZ2RHbGlZbXhsS0d4dmIzQWdQU0JjWEVSUFYwNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNWdFUyTnZjbVVnUFNCaktWeHVJQ0JrWVhSaElEd3RJR0pwYm1SZmNtOTNjeWhoTG5SaUxDQmlMblJpTENCakxuUmlLU0FsUGlVZ1pISnZjRjl1WVNncFhHNGdJR2RuY0d4dmRDaGtZWFJoTENCaFpYTW9lQ0E5SUd4dmIzQXNJSGtnUFNCemRXMVRZMjl5WlNrcElDc2dYRzRnSUNBZ2JHRmljeWg0SUQwZ1RsVk1UQ3dnZVNBOUlIQmhjM1JsTUNodVlXMWxMQ0JjWENCaGRtVnlZV2RsSUhCbFlXc2djMk52Y21VZ2NHVnlJR0Z1WTJodmNseGNLU2tnSzF4dUlDQWdJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ1ozSnZkWEFwTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUN0Y2JpQWdJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZkWFJzYVdWeUxuTnBlbVVnUFNBeExDQnZkWFJzYVdWeUxuTjBjbTlyWlNBOUlFNUJLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FyWEc0Z0lDQWdjM1JoZEY5emRXMXRZWEo1S0Z4dUlDQWdJQ0FnWVdWektHZHliM1Z3SUQwZ2JHOXZjQ2tzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnSUNCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01TeGNiaUFnSUNBZ0lHWnBiR3dnUFNCY1hISmxaRnhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEZ4dUlDQWdJQ2tnSzF4dUlDQWdJR052YjNKa1gyTmhjblJsYzJsaGJpaDViR2x0SUQwZ1l5Z3dMQ0J4ZFdGdWRHbHNaU2hrWVhSaEpITjFiVk5qYjNKbExDQXdMamsxS1NrcElDc2dkR2hsYldVb1hHNGdJQ0FnWVhocGN5NTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTENCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0JoYm1kc1pTQTlJRFExTENCb2FuVnpkQ0E5SURFc0lIWnFkWE4wSUQwZ01WeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NXNhVzVsSUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3dnYzJsNlpTQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdsamEzTWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xDQnphWHBsSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hGeDBjbUZ1YzNCaGNtVnVkRnhjS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdiR1ZuWlc1a0xuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLVnh1SUNBcFhHNTlYRzVjYm5Cc2IzUlRkVzFUWTI5eVpYTkNhVzVoY25rZ1BDMGdablZ1WTNScGIyNG9kSEpoWTJzc0lIQmxZV3NzSUc1aGJXVXNJR0Z1WTJodmNpNTFjRzV2TENCaGJtTm9iM0l1Wkc5M2JpbDdYRzRnSUhCbFlXdFVjbUZqYXlBOExTQjBjbUZqYTF0MWJtbHhkV1VvY1hWbGNubElhWFJ6S0dacGJtUlBkbVZ5YkdGd2N5aDBjbUZqYXl3Z2NHVmhheWtwS1YxY2JpQWdZaUE4TFNCblpYUlRkVzFUWTI5eVpYTW9jR1ZoYTFSeVlXTnJMQ0JoYm1Ob2IzSXVkWEJ1YnlsY2JpQWdZeUE4TFNCblpYUlRkVzFUWTI5eVpYTW9jR1ZoYTFSeVlXTnJMQ0JoYm1Ob2IzSXVaRzkzYmlsY2JpQWdZaTUwWWlBOExTQjBhV0ppYkdVb2JHOXZjQ0E5SUZ4Y1ZWQXZUazljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzVnRVMk52Y21VZ1BTQmlLVnh1SUNCakxuUmlJRHd0SUhScFltSnNaU2hzYjI5d0lEMGdYRnhFVDFkT1hGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE4xYlZOamIzSmxJRDBnWXlsY2JpQWdaR0YwWVNBOExTQmlhVzVrWDNKdmQzTW9ZaTUwWWl3Z1l5NTBZaWtnSlQ0bElHUnliM0JmYm1Fb0tWeHVJQ0JrWVhSaEpHeHZiM0FnUEMwZ1ptRmpkRzl5S0dSaGRHRWtiRzl2Y0N3Z2JHVjJaV3h6SUQwZ1l5aGNYRlZRTDA1UFhGd3NJRnhjUkU5WFRseGNLU2xjYmlBZ1hHNGdJSEF4TWlBOExTQm5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNJRnhjVlZBdlRrOWNYQ3dnWEZ4RVQxZE9YRndwWEc0Z0lIQWdQQzBnSUdkbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlHNWhiV1VzSUdacGJHd2dQU0JzYjI5d0xDQjVJRDBnYzNWdFUyTnZjbVVwS1NBcklGeHVJQ0FnSUd4aFluTW9lQ0E5SUU1VlRFd3NJSGtnUFNCd1lYTjBaVEFvWEZ4QmRtVnlZV2RsSUVOb1NWQWdjR1ZoYXlCelkyOXlaU0JoZENCaGJtTm9iM0lwWEZ3cEtTQXJYRzRnSUNBZ2FXNTBjbTlrWVhSaGRtbDZPanBuWlc5dFgzTndiR2wwWDNacGIyeHBiaWhzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZV3h3YUdFZ1BTQXVOQ2tnSzF4dUlDQWdJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU15d2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTd2dJR0ZzY0doaElEMGdNQzQyTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJYRzRnSUNBZ2MzUmhkRjl6ZFcxdFlYSjVLRnh1SUNBZ0lDQWdZV1Z6S0dkeWIzVndJRDBnYkc5dmNDa3NJR1oxYmlBOUlHMWxZVzRzWEc0Z0lDQWdJQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTUM0MUxGeHVJQ0FnSUNBZ1ptbHNiQ0E5SUZ4Y1lteGhZMnRjWEN3Z1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lIQnZjMmwwYVc5dUlEMGdjRzl6YVhScGIyNWZaRzlrWjJVb0xqTXBYRzRnSUNBZ0tTQXJJSFJvWlcxbEtGeHVJQ0FnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN3Z1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGeGNiaUFnSUNBZ0lDa3NYRzRnSUNBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNYRzRnSUNBZ0lDQXBMRnh1SUNBZ0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQWdJR0Z1WjJ4bElEMGdNQ3hjYmlBZ0lDQWdJQ2tzWEc0Z0lDQWdJQ0JoZUdsekxuUmxlSFF1ZVNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJQ2tzWEc0Z0lDQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdJQ0FwTEZ4dUlDQWdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN3Z2MybDZaU0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ4Y2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNYSFJ5WVc1emNHRnlaVzUwWEZ3cExGeHVJQ0FnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtWeHVJQ0FnSUNrZ0t5QmNiaUFnSUNCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vY1hWaGJuUnBiR1VvWkdGMFlTUnpkVzFUWTI5eVpTd2dNQzR3S1N3Z2NYVmhiblJwYkdVb1pHRjBZU1J6ZFcxVFkyOXlaU3dnTUM0NUtTa3BJQ3NnWEc0Z0lDQWdZVzV1YjNSaGRHVW9YRzRnSUNBZ0lGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTVN3Z2VTQTlJSEYxWVc1MGFXeGxLR1JoZEdFa2MzVnRVMk52Y21Vc0lEQXVOU2tzWEc0Z0lDQWdJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGeGNjREV5T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3TVRJcEtTeGNiaUFnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lHaHFkWE4wSUQwZ01Dd2djMmw2WlNBOUlETmNiaUFnSUNrZ0t5QWdJR2QxYVdSbGN5aGNiaUFnSUNCbWFXeHNJRDBnWjNWcFpHVmZiR1ZuWlc1a0tGeHVJQ0FnSUNBZ0lDQnJaWGwzYVdSMGFDQTlJREF1TWl3Z0lDTWdRV1JxZFhOMElIUm9aU0IzYVdSMGFDQnZaaUIwYUdVZ2JHVm5aVzVrSUd0bGVYTmNiaUFnSUNBZ0lDQWdhMlY1YUdWcFoyaDBJRDBnTUM0eUlDQWpJRUZrYW5WemRDQjBhR1VnYUdWcFoyaDBJRzltSUhSb1pTQnNaV2RsYm1RZ2EyVjVjMXh1SUNBZ0lDbGNiaUFnS1Z4dUlDQmNiaUFnSUdacGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hFTm9TVkJmY0dWaGExOWhkbWRRWldGclUyTnZjbVZmWEZ3c0lHNWhiV1VwWEc0Z0lIZHBaSFJvSUR3dElIQmhibVZzVTJsNlpTZ3hMalVwS20xdFZHOUpibU5vWEc0Z0lHaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzR5S1NwdGJWUnZTVzVqYUZ4dUlDQndibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc0Z0lIQnlhVzUwS0hBcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCemRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNGdJSEJ5YVc1MEtIQXBYRzRnSUdSbGRpNXZabVlvS1Z4dWZWeHVYRzRqSUZOMWJTQndaV0ZySUhOamIzSmxYRzRqSXlNalhHNTBjbUZqYXlBOExTQnBiWEJ2Y25Rb2FHVnlaU2h5WldaRWFYSXNJRnhjTXpNeU5UVmZTRE5MTkcxbE0xOHdOQzAzTkRWZlFuSjFZMlV0TkY5MGNtbHRYM0V5TUY5a1pXUjFjRjlpYkdGamExOWtaWEIwYUU1dmNtMHVZbmRjWENrc0lHWnZjbTFoZENBOUlGeGNRbWxuVjJsblhGd3BYRzV3WldGcklEd3RJR2x0Y0c5eWRGQmxZV3NvYUdWeVpTaHlaV1pFYVhJc0lGeGNNek15TlRWZlNETkxORzFsTTE4d05DMDNORFZmUW5KMVkyVXRORjl3WldGcmN5NXRaWEpuWlZCbFlXc3VZbVZrWEZ3cEtWeHVJM0JzYjNSVGRXMVRZMjl5WlhNb2RISmhZMnNzSUhCbFlXc3NJRnhjU0ROTE5HMWxNMXhjS1Z4dWNHeHZkRk4xYlZOamIzSmxjMEpwYm1GeWVTaDBjbUZqYXl3Z2NHVmhheXdnWEZ4SU0wczBiV1V6WEZ3c0lHRnVZMmh2Y2k1MWNHNXZMQ0JoYm1Ob2IzSXVaRzkzYmlsY2JseHVkSEpoWTJzZ1BDMGdhVzF3YjNKMEtHaGxjbVVvY21WbVJHbHlMQ0JjWEVkVFRUSTBNemcwTnpaZlJVTXRSRWN0TXpRMU9DMUlNMHN5TjBGRFgwRlRXVTVmTVM1aWQxeGNLU3dnWm05eWJXRjBJRDBnWEZ4Q2FXZFhhV2RjWENsY2JuQmxZV3NnUEMwZ2FXMXdiM0owVUdWaGF5aG9aWEpsS0hKbFprUnBjaXdnWEZ4SFUwMHlORE00TkRjMlgwVkRMVVJITFRNME5UZ3RTRE5MTWpkQlExOUJVMWxPWHpFdWJtRnljbTkzVUdWaGF5NWlaV1JjWENrcFhHNGpjR3h2ZEZOMWJWTmpiM0psY3loMGNtRmpheXdnY0dWaGF5d2dYRnhJTTBzeU4yRmpYRndwWEc1d2JHOTBVM1Z0VTJOdmNtVnpRbWx1WVhKNUtIUnlZV05yTENCd1pXRnJMQ0JjWEVnelN6STNZV05jWEN3Z1lXNWphRzl5TG5Wd2JtOHNJR0Z1WTJodmNpNWtiM2R1S1Z4dVhHNTBjbUZqYXlBOExTQnBiWEJ2Y25Rb2FHVnlaU2h5WldaRWFYSXNJRnhjUjFOTk1qWTRNelEwTUY5S01WOUlNMHN4TkdGalgyMXRNVEJNYVdaMFpXUXVZbXhoWTJzdVluZGNYQ2tzSUdadmNtMWhkQ0E5SUZ4Y1FtbG5WMmxuWEZ3cFhHNXdaV0ZySUR3dElHbHRjRzl5ZEZCbFlXc29hR1Z5WlNoeVpXWkVhWElzSUZ4Y1IxTk5Nalk0TXpRME1GOUtNVjlJTTBzeE5HRmpYMjF0TVRCTWFXWjBaV1F1WW1Wa1hGd3BLVnh1STNCc2IzUlRkVzFUWTI5eVpYTW9kSEpoWTJzc0lIQmxZV3NzSUZ4Y1NETkxNVFJoWTF4Y0tWeHVjR3h2ZEZOMWJWTmpiM0psYzBKcGJtRnllU2gwY21GamF5d2djR1ZoYXl3Z1hGeElNMHN4TkdGalhGd3NJR0Z1WTJodmNpNTFjRzV2TENCaGJtTm9iM0l1Wkc5M2JpbGNibHh1ZEhKaFkyc2dQQzBnYVcxd2IzSjBLR2hsY21Vb2NtVm1SR2x5TENCY1hETXpNalE0WDBOVVEwWmZNRGN0TnpJNVgwSnlkV05sTFRSZmRISnBiVjl4TWpCZlpHVmtkWEJmWW14aFkydGZaR1Z3ZEdoT2IzSnRMbUozWEZ3cExDQm1iM0p0WVhRZ1BTQmNYRUpwWjFkcFoxeGNLVnh1Y0dWaGF5QThMU0JwYlhCdmNuUlFaV0ZyS0dobGNtVW9jbVZtUkdseUxDQmNYRE16TWpRNFgwTlVRMFpmTURjdE56STVYMEp5ZFdObExUUmZjR1ZoYTNNdWJXVnlaMlZRWldGckxtSmxaRnhjS1NsY2JpTndiRzkwVTNWdFUyTnZjbVZ6S0hSeVlXTnJMQ0J3WldGckxDQmNYRU5VUTBaY1hDbGNibkJzYjNSVGRXMVRZMjl5WlhOQ2FXNWhjbmtvZEhKaFkyc3NJSEJsWVdzc0lGeGNRMVJEUmx4Y0xDQmhibU5vYjNJdWRYQnVieXdnWVc1amFHOXlMbVJ2ZDI0cFhHNWNiblJ5WVdOcklEd3RJR2x0Y0c5eWRDaG9aWEpsS0hKbFprUnBjaXdnWEZ3ek16STFNRjlTUVVReU1WOWhZams1TWw5Q2NuVmpaUzAwWDNSeWFXMWZjVEl3WDJSbFpIVndYMkpzWVdOclgyUmxjSFJvVG05eWJTNWlkMXhjS1N3Z1ptOXliV0YwSUQwZ1hGeENhV2RYYVdkY1hDbGNibkJsWVdzZ1BDMGdhVzF3YjNKMFVHVmhheWhvWlhKbEtISmxaa1JwY2l3Z1hGd3pNekkxTUY5U1FVUXlNVjloWWprNU1sOUNjblZqWlMwMFgzQmxZV3R6TG0xbGNtZGxVR1ZoYXk1aVpXUmNYQ2twWEc0amNHeHZkRk4xYlZOamIzSmxjeWgwY21GamF5d2djR1ZoYXl3Z1hGeFNRVVF5TVZ4Y0tWeHVjR3h2ZEZOMWJWTmpiM0psYzBKcGJtRnllU2gwY21GamF5d2djR1ZoYXl3Z1hGeFNRVVF5TVZ4Y0xDQmhibU5vYjNJdWRYQnVieXdnWVc1amFHOXlMbVJ2ZDI0cFhHNWNibHh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihsb29wID09Z3JvdXAxKSApJHN1bVNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihsb29wID09Z3JvdXAyKSApJHN1bVNjb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbiMgVVAgbG9vcFxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci51cCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwKSlcbiMgTk8gbG9vcFxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbiMgVVAgTk9cbmxvb3AudXBubyA8LSBiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubylcbmFuY2hvci51cG5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXBubykpXG4jIERPV04gbG9vcFxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxuXG5nZXRTdW1TY29yZXMgPC0gZnVuY3Rpb24odHJhY2ssIGFuY2hvcikge1xuICAjIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBhbGwgYW5jaG9ycyBhbmQgdHJhY2sgcmVnaW9ucyBhdCBvbmNlXG4gIG92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IsIHRyYWNrKVxuICBcbiAgIyBFeHRyYWN0IHRoZSBzY29yZXMgYW5kIGNvcnJlc3BvbmRpbmcgYW5jaG9yIGluZGljZXNcbiAgYW5jaG9yX2luZGljZXMgPC0gcXVlcnlIaXRzKG92ZXJsYXBzKVxuICB0cmFja19zY29yZXMgPC0gc2NvcmUodHJhY2spW3N1YmplY3RIaXRzKG92ZXJsYXBzKV1cbiAgXG4gICMgVXNlIHRhcHBseSB0byBjYWxjdWxhdGUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIGVhY2ggYW5jaG9yXG4gIG1lZGlhbl9zY29yZXMgPC0gdGFwcGx5KHRyYWNrX3Njb3JlcywgYW5jaG9yX2luZGljZXMsIG1lYW4sIG5hLnJtID0gVFJVRSlcbiAgXG4gICMgSW5pdGlhbGl6ZSBhIG51bWVyaWMgdmVjdG9yIHRvIHN0b3JlIHRoZSBtZWRpYW4gc2NvcmVzIGZvciBlYWNoIGFuY2hvclxuICBhbGxfbWVkaWFuX3Njb3JlcyA8LSByZXAoTkEsIGxlbmd0aChhbmNob3IpKVxuICBcbiAgIyBQb3B1bGF0ZSB0aGUgbWVkaWFuIHNjb3JlcyBmb3IgdGhlIGFuY2hvcnMgdGhhdCBoYXZlIG92ZXJsYXBzXG4gIGFsbF9tZWRpYW5fc2NvcmVzW2FzLm51bWVyaWMobmFtZXMobWVkaWFuX3Njb3JlcykpXSA8LSBtZWRpYW5fc2NvcmVzXG4gIFxuICByZXR1cm4oYWxsX21lZGlhbl9zY29yZXMpXG59XG5cbnBsb3RTdW1TY29yZXMgPC0gZnVuY3Rpb24odHJhY2ssIHBlYWssIG5hbWUpe1xuICBwZWFrVHJhY2sgPC0gdHJhY2tbdW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHModHJhY2ssIHBlYWspKSldXG4gIGEgPC0gZ2V0U3VtU2NvcmVzKHBlYWtUcmFjaywgYW5jaG9yLnVwKVxuICBiIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvci5ubylcbiAgYyA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IuZG93bilcbiAgYS50YiA8LSB0aWJibGUobG9vcCA9IFxcVVBcXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBhKVxuICBiLnRiIDwtIHRpYmJsZShsb29wID0gXFxOT1xcLFxuICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGIpXG4gIGMudGIgPC0gdGliYmxlKGxvb3AgPSBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBjKVxuICBkYXRhIDwtIGJpbmRfcm93cyhhLnRiLCBiLnRiLCBjLnRiKSAlPiUgZHJvcF9uYSgpXG4gIGdncGxvdChkYXRhLCBhZXMoeCA9IGxvb3AsIHkgPSBzdW1TY29yZSkpICsgXG4gICAgbGFicyh4ID0gTlVMTCwgeSA9IHBhc3RlMChuYW1lLCBcXCBhdmVyYWdlIHBlYWsgc2NvcmUgcGVyIGFuY2hvclxcKSkgK1xuICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgICBvdXRsaWVyLnNpemUgPSAxLCBvdXRsaWVyLnN0cm9rZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgc3RhdF9zdW1tYXJ5KFxuICAgICAgYWVzKGdyb3VwID0gbG9vcCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICAgIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXFxuICAgICkgK1xuICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCBxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjk1KSkpICsgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG59XG5cbnBsb3RTdW1TY29yZXNCaW5hcnkgPC0gZnVuY3Rpb24odHJhY2ssIHBlYWssIG5hbWUsIGFuY2hvci51cG5vLCBhbmNob3IuZG93bil7XG4gIHBlYWtUcmFjayA8LSB0cmFja1t1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyh0cmFjaywgcGVhaykpKV1cbiAgYiA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IudXBubylcbiAgYyA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IuZG93bilcbiAgYi50YiA8LSB0aWJibGUobG9vcCA9IFxcVVAvTk9cXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBiKVxuICBjLnRiIDwtIHRpYmJsZShsb29wID0gXFxET1dOXFwsXG4gICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYylcbiAgZGF0YSA8LSBiaW5kX3Jvd3MoYi50YiwgYy50YikgJT4lIGRyb3BfbmEoKVxuICBkYXRhJGxvb3AgPC0gZmFjdG9yKGRhdGEkbG9vcCwgbGV2ZWxzID0gYyhcXFVQL05PXFwsIFxcRE9XTlxcKSlcbiAgXG4gIHAxMiA8LSBnZXRQdmFsV2lsY294KGRhdGEsIFxcVVAvTk9cXCwgXFxET1dOXFwpXG4gIHAgPC0gIGdncGxvdChkYXRhLCBhZXMoeCA9IG5hbWUsIGZpbGwgPSBsb29wLCB5ID0gc3VtU2NvcmUpKSArIFxuICAgIGxhYnMoeCA9IE5VTEwsIHkgPSBwYXN0ZTAoXFxBdmVyYWdlIENoSVAgcGVhayBzY29yZSBhdCBhbmNob3IpXFwpKSArXG4gICAgaW50cm9kYXRhdml6OjpnZW9tX3NwbGl0X3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAuNCkgK1xuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgc3RhdF9zdW1tYXJ5KFxuICAgICAgYWVzKGdyb3VwID0gbG9vcCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICAgKSArIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICAgIGFuZ2xlID0gMCxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICksXG4gICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgICApLFxuICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgICkgKyBcbiAgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMocXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC4wKSwgcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC45KSkpICsgXG4gICAgYW5ub3RhdGUoXG4gICAgIFxcdGV4dFxcLCB4ID0gMSwgeSA9IHF1YW50aWxlKGRhdGEkc3VtU2NvcmUsIDAuNSksXG4gICAgIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpKSxcbiAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDNcbiAgICkgKyAgIGd1aWRlcyhcbiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKFxuICAgICAgICBrZXl3aWR0aCA9IDAuMiwgICMgQWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgbGVnZW5kIGtleXNcbiAgICAgICAga2V5aGVpZ2h0ID0gMC4yICAjIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWdlbmQga2V5c1xuICAgIClcbiAgKVxuICBcbiAgIGZpbGVOYW1lIDwtIHBhc3RlMChcXENoSVBfcGVha19hdmdQZWFrU2NvcmVfXFwsIG5hbWUpXG4gIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIFN1bSBwZWFrIHNjb3JlXG4jIyMjXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxuI3Bsb3RTdW1TY29yZXModHJhY2ssIHBlYWssIFxcSDNLNG1lM1xcKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxIM0s0bWUzXFwsIGFuY2hvci51cG5vLCBhbmNob3IuZG93bilcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWRcXCkpXG4jcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxIM0syN2FjXFwpXG5wbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCBcXEgzSzI3YWNcXCwgYW5jaG9yLnVwbm8sIGFuY2hvci5kb3duKVxuXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcR1NNMjY4MzQ0MF9KMV9IM0sxNGFjX21tMTBMaWZ0ZWQuYmxhY2suYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcR1NNMjY4MzQ0MF9KMV9IM0sxNGFjX21tMTBMaWZ0ZWQuYmVkXFwpKVxuI3Bsb3RTdW1TY29yZXModHJhY2ssIHBlYWssIFxcSDNLMTRhY1xcKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxIM0sxNGFjXFwsIGFuY2hvci51cG5vLCBhbmNob3IuZG93bilcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfdHJpbV9xMjBfZGVkdXBfYmxhY2tfZGVwdGhOb3JtLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbiNwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXENUQ0ZcXClcbnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssIFxcQ1RDRlxcLCBhbmNob3IudXBubywgYW5jaG9yLmRvd24pXG5cbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG4jcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxSQUQyMVxcKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxSQUQyMVxcLCBhbmNob3IudXBubywgYW5jaG9yLmRvd24pXG5cblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihsb29wID09Z3JvdXAxKSApJHN1bVNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihsb29wID09Z3JvdXAyKSApJHN1bVNjb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbiMgVVAgbG9vcFxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci51cCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwKSlcbiMgTk8gbG9vcFxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbiMgVVAgTk9cbmxvb3AudXBubyA8LSBiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubylcbmFuY2hvci51cG5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXBubykpXG4jIERPV04gbG9vcFxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxuXG5nZXRTdW1TY29yZXMgPC0gZnVuY3Rpb24odHJhY2ssIGFuY2hvcikge1xuICAjIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBhbGwgYW5jaG9ycyBhbmQgdHJhY2sgcmVnaW9ucyBhdCBvbmNlXG4gIG92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IsIHRyYWNrKVxuICBcbiAgIyBFeHRyYWN0IHRoZSBzY29yZXMgYW5kIGNvcnJlc3BvbmRpbmcgYW5jaG9yIGluZGljZXNcbiAgYW5jaG9yX2luZGljZXMgPC0gcXVlcnlIaXRzKG92ZXJsYXBzKVxuICB0cmFja19zY29yZXMgPC0gc2NvcmUodHJhY2spW3N1YmplY3RIaXRzKG92ZXJsYXBzKV1cbiAgXG4gICMgVXNlIHRhcHBseSB0byBjYWxjdWxhdGUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIGVhY2ggYW5jaG9yXG4gIG1lZGlhbl9zY29yZXMgPC0gdGFwcGx5KHRyYWNrX3Njb3JlcywgYW5jaG9yX2luZGljZXMsIG1lYW4sIG5hLnJtID0gVFJVRSlcbiAgXG4gICMgSW5pdGlhbGl6ZSBhIG51bWVyaWMgdmVjdG9yIHRvIHN0b3JlIHRoZSBtZWRpYW4gc2NvcmVzIGZvciBlYWNoIGFuY2hvclxuICBhbGxfbWVkaWFuX3Njb3JlcyA8LSByZXAoTkEsIGxlbmd0aChhbmNob3IpKVxuICBcbiAgIyBQb3B1bGF0ZSB0aGUgbWVkaWFuIHNjb3JlcyBmb3IgdGhlIGFuY2hvcnMgdGhhdCBoYXZlIG92ZXJsYXBzXG4gIGFsbF9tZWRpYW5fc2NvcmVzW2FzLm51bWVyaWMobmFtZXMobWVkaWFuX3Njb3JlcykpXSA8LSBtZWRpYW5fc2NvcmVzXG4gIFxuICByZXR1cm4oYWxsX21lZGlhbl9zY29yZXMpXG59XG5cbnBsb3RTdW1TY29yZXMgPC0gZnVuY3Rpb24odHJhY2ssIHBlYWssIG5hbWUpe1xuICBwZWFrVHJhY2sgPC0gdHJhY2tbdW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHModHJhY2ssIHBlYWspKSldXG4gIGEgPC0gZ2V0U3VtU2NvcmVzKHBlYWtUcmFjaywgYW5jaG9yLnVwKVxuICBiIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvci5ubylcbiAgYyA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IuZG93bilcbiAgYS50YiA8LSB0aWJibGUobG9vcCA9IFxcVVBcXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBhKVxuICBiLnRiIDwtIHRpYmJsZShsb29wID0gXFxOT1xcLFxuICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGIpXG4gIGMudGIgPC0gdGliYmxlKGxvb3AgPSBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBjKVxuICBkYXRhIDwtIGJpbmRfcm93cyhhLnRiLCBiLnRiLCBjLnRiKSAlPiUgZHJvcF9uYSgpXG4gIGdncGxvdChkYXRhLCBhZXMoeCA9IGxvb3AsIHkgPSBzdW1TY29yZSkpICsgXG4gICAgbGFicyh4ID0gTlVMTCwgeSA9IHBhc3RlMChuYW1lLCBcXCBhdmVyYWdlIHBlYWsgc2NvcmUgcGVyIGFuY2hvclxcKSkgK1xuICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgICBvdXRsaWVyLnNpemUgPSAxLCBvdXRsaWVyLnN0cm9rZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgc3RhdF9zdW1tYXJ5KFxuICAgICAgYWVzKGdyb3VwID0gbG9vcCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICAgIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXFxuICAgICkgK1xuICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCBxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjk1KSkpICsgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG59XG5cbnBsb3RTdW1TY29yZXNCaW5hcnkgPC0gZnVuY3Rpb24odHJhY2ssIHBlYWssIG5hbWUsIGFuY2hvci51cG5vLCBhbmNob3IuZG93bil7XG4gIHBlYWtUcmFjayA8LSB0cmFja1t1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyh0cmFjaywgcGVhaykpKV1cbiAgYiA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IudXBubylcbiAgYyA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IuZG93bilcbiAgYi50YiA8LSB0aWJibGUobG9vcCA9IFxcVVAvTk9cXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBiKVxuICBjLnRiIDwtIHRpYmJsZShsb29wID0gXFxET1dOXFwsXG4gICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYylcbiAgZGF0YSA8LSBiaW5kX3Jvd3MoYi50YiwgYy50YikgJT4lIGRyb3BfbmEoKVxuICBkYXRhJGxvb3AgPC0gZmFjdG9yKGRhdGEkbG9vcCwgbGV2ZWxzID0gYyhcXFVQL05PXFwsIFxcRE9XTlxcKSlcbiAgXG4gIHAxMiA8LSBnZXRQdmFsV2lsY294KGRhdGEsIFxcVVAvTk9cXCwgXFxET1dOXFwpXG4gIHAgPC0gIGdncGxvdChkYXRhLCBhZXMoeCA9IG5hbWUsIGZpbGwgPSBsb29wLCB5ID0gc3VtU2NvcmUpKSArIFxuICAgIGxhYnMoeCA9IE5VTEwsIHkgPSBwYXN0ZTAoXFxBdmVyYWdlIENoSVAgcGVhayBzY29yZSBhdCBhbmNob3IpXFwpKSArXG4gICAgaW50cm9kYXRhdml6OjpnZW9tX3NwbGl0X3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAuNCkgK1xuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgc3RhdF9zdW1tYXJ5KFxuICAgICAgYWVzKGdyb3VwID0gbG9vcCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICAgKSArIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICAgIGFuZ2xlID0gMCxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgICksXG4gICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgICApLFxuICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgICkgKyBcbiAgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMocXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC4wKSwgcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC45KSkpICsgXG4gICAgYW5ub3RhdGUoXG4gICAgIFxcdGV4dFxcLCB4ID0gMSwgeSA9IHF1YW50aWxlKGRhdGEkc3VtU2NvcmUsIDAuNSksXG4gICAgIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpKSxcbiAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDNcbiAgICkgKyAgIGd1aWRlcyhcbiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKFxuICAgICAgICBrZXl3aWR0aCA9IDAuMiwgICMgQWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgbGVnZW5kIGtleXNcbiAgICAgICAga2V5aGVpZ2h0ID0gMC4yICAjIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWdlbmQga2V5c1xuICAgIClcbiAgKVxuICBcbiAgIGZpbGVOYW1lIDwtIHBhc3RlMChcXENoSVBfcGVha19hdmdQZWFrU2NvcmVfXFwsIG5hbWUpXG4gIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIFN1bSBwZWFrIHNjb3JlXG4jIyMjXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxuI3Bsb3RTdW1TY29yZXModHJhY2ssIHBlYWssIFxcSDNLNG1lM1xcKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxIM0s0bWUzXFwsIGFuY2hvci51cG5vLCBhbmNob3IuZG93bilcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWRcXCkpXG4jcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxIM0syN2FjXFwpXG5wbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCBcXEgzSzI3YWNcXCwgYW5jaG9yLnVwbm8sIGFuY2hvci5kb3duKVxuXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcR1NNMjY4MzQ0MF9KMV9IM0sxNGFjX21tMTBMaWZ0ZWQuYmxhY2suYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcR1NNMjY4MzQ0MF9KMV9IM0sxNGFjX21tMTBMaWZ0ZWQuYmVkXFwpKVxuI3Bsb3RTdW1TY29yZXModHJhY2ssIHBlYWssIFxcSDNLMTRhY1xcKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxIM0sxNGFjXFwsIGFuY2hvci51cG5vLCBhbmNob3IuZG93bilcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfdHJpbV9xMjBfZGVkdXBfYmxhY2tfZGVwdGhOb3JtLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbiNwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXENUQ0ZcXClcbnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssIFxcQ1RDRlxcLCBhbmNob3IudXBubywgYW5jaG9yLmRvd24pXG5cbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG4jcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxSQUQyMVxcKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxSQUQyMVxcLCBhbmNob3IudXBubywgYW5jaG9yLmRvd24pXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(loop ==group1) )$sumScore
  distance2 <- (data %>% dplyr::filter(loop ==group2) )$sumScore
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

name <- \chromo_cons_annoHierarchy\

# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
# UP NO
loop.upno <- bind_rows(loop.up, loop.no)
anchor.upno <- (extractAnchor(loop.upno))
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))

getSumScores <- function(track, anchor) {
  # Find overlaps between all anchors and track regions at once
  overlaps <- findOverlaps(anchor, track)
  
  # Extract the scores and corresponding anchor indices
  anchor_indices <- queryHits(overlaps)
  track_scores <- score(track)[subjectHits(overlaps)]
  
  # Use tapply to calculate the median scores for each anchor
  median_scores <- tapply(track_scores, anchor_indices, mean, na.rm = TRUE)
  
  # Initialize a numeric vector to store the median scores for each anchor
  all_median_scores <- rep(NA, length(anchor))
  
  # Populate the median scores for the anchors that have overlaps
  all_median_scores[as.numeric(names(median_scores))] <- median_scores
  
  return(all_median_scores)
}

plotSumScores <- function(track, peak, name){
  peakTrack <- track[unique(queryHits(findOverlaps(track, peak)))]
  a <- getSumScores(peakTrack, anchor.up)
  b <- getSumScores(peakTrack, anchor.no)
  c <- getSumScores(peakTrack, anchor.down)
  a.tb <- tibble(loop = \UP\,
                 sumScore = a)
  b.tb <- tibble(loop = \NO\,
                 sumScore = b)
  c.tb <- tibble(loop = \DOWN\,
                 sumScore = c)
  data <- bind_rows(a.tb, b.tb, c.tb) %>% drop_na()
  ggplot(data, aes(x = loop, y = sumScore)) + 
    labs(x = NULL, y = paste0(name, \ average peak score per anchor\)) +
    geom_violin(aes(fill = group), color = \black\,
                linewidth = lineThick * mmToLineUnit, lineend = \square\,
                show.legend = FALSE) +
    geom_boxplot(width = 0.1, color = \black\,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\,
                 outlier.size = 1, outlier.stroke = NA) + theme_classic() +
    stat_summary(
      aes(group = loop), fun = mean,
      geom = \point\, shape = 21, size = 1,
      fill = \red\, color = \black\
    ) +
    coord_cartesian(ylim = c(0, quantile(data$sumScore, 0.95))) + theme(
    axis.title = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )
}

plotSumScoresBinary <- function(track, peak, name, anchor.upno, anchor.down){
  peakTrack <- track[unique(queryHits(findOverlaps(track, peak)))]
  b <- getSumScores(peakTrack, anchor.upno)
  c <- getSumScores(peakTrack, anchor.down)
  b.tb <- tibble(loop = \UP/NO\,
                 sumScore = b)
  c.tb <- tibble(loop = \DOWN\,
                 sumScore = c)
  data <- bind_rows(b.tb, c.tb) %>% drop_na()
  data$loop <- factor(data$loop, levels = c(\UP/NO\, \DOWN\))
  
  p12 <- getPvalWilcox(data, \UP/NO\, \DOWN\)
  p <-  ggplot(data, aes(x = name, fill = loop, y = sumScore)) + 
    labs(x = NULL, y = paste0(\Average ChIP peak score at anchor)\)) +
    introdataviz::geom_split_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\,
                                    alpha = .4) +
    geom_boxplot(width = 0.3, color = \black\,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\,
                 outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + theme_classic() +
    stat_summary(
      aes(group = loop), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) + theme(
      axis.title = element_text(
        size = fontSizeM, family = fontType, color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeM, family = fontType, color = \#000000\
      ),
      axis.text.x = element_text(
        angle = 0,
      ),
      axis.text.y = element_text(
        size = fontSizeS,
      ),
      axis.line = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
      legend.text = element_text(family = fontType, size = fontSizeS),
      legend.title = element_text(family = fontType, size = fontSizeS)
    ) + 
    coord_cartesian(ylim = c(quantile(data$sumScore, 0.0), quantile(data$sumScore, 0.9))) + 
    annotate(
     \text\, x = 1, y = quantile(data$sumScore, 0.5),
     label = paste0(\p12: \, convPvalue(p12)),
     color = \black\, hjust = 0, size = 3
   ) +   guides(
    fill = guide_legend(
        keywidth = 0.2,  # Adjust the width of the legend keys
        keyheight = 0.2  # Adjust the height of the legend keys
    )
  )
  
   fileName <- paste0(\ChIP_peak_avgPeakScore_\, name)
  width <- panelSize(1.5)*mmToInch
  height <- panelSize(1.2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# Sum peak score
####
track <- import(here(refDir, \33255_H3K4me3_04-745_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.bed\))
#plotSumScores(track, peak, \H3K4me3\)
plotSumScoresBinary(track, peak, \H3K4me3\, anchor.upno, anchor.down)

track <- import(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
#plotSumScores(track, peak, \H3K27ac\)
plotSumScoresBinary(track, peak, \H3K27ac\, anchor.upno, anchor.down)

track <- import(here(refDir, \GSM2683440_J1_H3K14ac_mm10Lifted.black.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM2683440_J1_H3K14ac_mm10Lifted.bed\))
#plotSumScores(track, peak, \H3K14ac\)
plotSumScoresBinary(track, peak, \H3K14ac\, anchor.upno, anchor.down)

track <- import(here(refDir, \33248_CTCF_07-729_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))
#plotSumScores(track, peak, \CTCF\)
plotSumScoresBinary(track, peak, \CTCF\, anchor.upno, anchor.down)

track <- import(here(refDir, \33250_RAD21_ab992_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))
#plotSumScores(track, peak, \RAD21\)
plotSumScoresBinary(track, peak, \RAD21\, anchor.upno, anchor.down)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### P-N

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc0aklGVlFJR3h2YjNCY2JteHZiM0F1ZFhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5Qk5EZzFkbk5FVFZOUFgxVlFYMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BYRzVoYm1Ob2IzSXVkWEFnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNTFjQ2twWEc0aklFNVBJR3h2YjNCY2JteHZiM0F1Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5Qk5EZzFkbk5FVFZOUFgwNVBYMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BYRzVoYm1Ob2IzSXVibThnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNXVieWtwWEc0aklFUlBWMDRnYkc5dmNGeHViRzl2Y0M1a2IzZHVJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZRVFE0TlhaelJFMVRUMTlFVDFkT1gyUnBabVl3TGpJdVltVmtjR1ZjSWlrcFhHNWhibU5vYjNJdVpHOTNiaUE4TFNBb1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtUnZkMjRwS1Z4dVhHNW5aWFJUZFcxVFkyOXlaWE1nUEMwZ1puVnVZM1JwYjI0b2RISmhZMnNzSUdGdVkyaHZjaWtnZTF4dUlDQWpJRVpwYm1RZ2IzWmxjbXhoY0hNZ1ltVjBkMlZsYmlCaGJHd2dZVzVqYUc5eWN5QmhibVFnZEhKaFkyc2djbVZuYVc5dWN5QmhkQ0J2Ym1ObFhHNGdJRzkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJc0lIUnlZV05yS1Z4dUlDQmNiaUFnSXlCRmVIUnlZV04wSUhSb1pTQnpZMjl5WlhNZ1lXNWtJR052Y25KbGMzQnZibVJwYm1jZ1lXNWphRzl5SUdsdVpHbGpaWE5jYmlBZ1lXNWphRzl5WDJsdVpHbGpaWE1nUEMwZ2NYVmxjbmxJYVhSektHOTJaWEpzWVhCektWeHVJQ0IwY21GamExOXpZMjl5WlhNZ1BDMGdjMk52Y21Vb2RISmhZMnNwVzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMWNiaUFnWEc0Z0lDTWdWWE5sSUhSaGNIQnNlU0IwYnlCallXeGpkV3hoZEdVZ2RHaGxJRzFsWkdsaGJpQnpZMjl5WlhNZ1ptOXlJR1ZoWTJnZ1lXNWphRzl5WEc0Z0lHMWxaR2xoYmw5elkyOXlaWE1nUEMwZ2RHRndjR3g1S0hSeVlXTnJYM05qYjNKbGN5d2dZVzVqYUc5eVgybHVaR2xqWlhNc0lITjFiU3dnYm1FdWNtMGdQU0JVVWxWRktWeHVJQ0JjYmlBZ0l5QkpibWwwYVdGc2FYcGxJR0VnYm5WdFpYSnBZeUIyWldOMGIzSWdkRzhnYzNSdmNtVWdkR2hsSUcxbFpHbGhiaUJ6WTI5eVpYTWdabTl5SUdWaFkyZ2dZVzVqYUc5eVhHNGdJR0ZzYkY5dFpXUnBZVzVmYzJOdmNtVnpJRHd0SUhKbGNDaE9RU3dnYkdWdVozUm9LR0Z1WTJodmNpa3BYRzRnSUZ4dUlDQWpJRkJ2Y0hWc1lYUmxJSFJvWlNCdFpXUnBZVzRnYzJOdmNtVnpJR1p2Y2lCMGFHVWdZVzVqYUc5eWN5QjBhR0YwSUdoaGRtVWdiM1psY214aGNITmNiaUFnWVd4c1gyMWxaR2xoYmw5elkyOXlaWE5iWVhNdWJuVnRaWEpwWXlodVlXMWxjeWh0WldScFlXNWZjMk52Y21WektTbGRJRHd0SUcxbFpHbGhibDl6WTI5eVpYTmNiaUFnWEc0Z0lISmxkSFZ5YmloaGJHeGZiV1ZrYVdGdVgzTmpiM0psY3lsY2JuMWNibHh1Y0d4dmRGTjFiVk5qYjNKbGN5QThMU0JtZFc1amRHbHZiaWgwY21GamF5d2djR1ZoYXl3Z2JtRnRaU2w3WEc0Z0lIQmxZV3RVY21GamF5QThMU0IwY21GamExdDFibWx4ZFdVb2NYVmxjbmxJYVhSektHWnBibVJQZG1WeWJHRndjeWgwY21GamF5d2djR1ZoYXlrcEtWMWNiaUFnWVNBOExTQm5aWFJUZFcxVFkyOXlaWE1vY0dWaGExUnlZV05yTENCaGJtTm9iM0l1ZFhBcFhHNGdJR0lnUEMwZ1oyVjBVM1Z0VTJOdmNtVnpLSEJsWVd0VWNtRmpheXdnWVc1amFHOXlMbTV2S1Z4dUlDQmpJRHd0SUdkbGRGTjFiVk5qYjNKbGN5aHdaV0ZyVkhKaFkyc3NJR0Z1WTJodmNpNWtiM2R1S1Z4dUlDQmhMblJpSUR3dElIUnBZbUpzWlNoc2IyOXdJRDBnWENKVlVGd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZFcxVFkyOXlaU0E5SUdFcFhHNGdJR0l1ZEdJZ1BDMGdkR2xpWW14bEtHeHZiM0FnUFNCY0lrNVBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOMWJWTmpiM0psSUQwZ1lpbGNiaUFnWXk1MFlpQThMU0IwYVdKaWJHVW9iRzl2Y0NBOUlGd2lSRTlYVGx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpkVzFUWTI5eVpTQTlJR01wWEc0Z0lHUmhkR0VnUEMwZ1ltbHVaRjl5YjNkektHRXVkR0lzSUdJdWRHSXNJR011ZEdJcElDVStKU0JrY205d1gyNWhLQ2xjYmlBZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdiRzl2Y0N3Z2VTQTlJSE4xYlZOamIzSmxLU2tnS3lCblpXOXRYMkp2ZUhCc2IzUW9iM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUdkbmRHbDBiR1VvY0dGemRHVXdLRzVoYldVc0lGd2lJSE4xYlNCd1pXRnJYQ0lwS1NBclhHNGdJQ0FnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLREFzSUhGMVlXNTBhV3hsS0dSaGRHRWtjM1Z0VTJOdmNtVXNJREF1T1NrcEtWeHVmVnh1WEc0aklGTjFiU0J3WldGcklITmpiM0psWEc0akl5TWpYRzUwY21GamF5QThMU0JwYlhCdmNuUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aU16TXlOVFZmU0ROTE5HMWxNMTh3TkMwM05EVmZRbkoxWTJVdE5GOTBjbWx0WDNFeU1GOWtaV1IxY0Y5aWJHRmphMTlrWlhCMGFFNXZjbTB1WW5kY0lpa3NJR1p2Y20xaGRDQTlJRndpUW1sblYybG5YQ0lwWEc1d1pXRnJJRHd0SUdsdGNHOXlkRkJsWVdzb2FHVnlaU2h5WldaRWFYSXNJRndpTXpNeU5UVmZTRE5MTkcxbE0xOHdOQzAzTkRWZlFuSjFZMlV0TkY5d1pXRnJjeTV0WlhKblpWQmxZV3N1WW1Wa1hDSXBLVnh1Y0d4dmRGTjFiVk5qYjNKbGN5aDBjbUZqYXl3Z2NHVmhheXdnWENKSU0wczBiV1V6WENJcFhHNWNiblJ5WVdOcklEd3RJR2x0Y0c5eWRDaG9aWEpsS0hKbFprUnBjaXdnWENKSFUwMHlORE00TkRjMlgwVkRMVVJITFRNME5UZ3RTRE5MTWpkQlExOUJVMWxPWHpFdVluZGNJaWtzSUdadmNtMWhkQ0E5SUZ3aVFtbG5WMmxuWENJcFhHNXdaV0ZySUR3dElHbHRjRzl5ZEZCbFlXc29hR1Z5WlNoeVpXWkVhWElzSUZ3aVIxTk5NalF6T0RRM05sOUZReTFFUnkwek5EVTRMVWd6U3pJM1FVTmZRVk5aVGw4eExtNWhjbkp2ZDFCbFlXc3VZbVZrWENJcEtWeHVjR3h2ZEZOMWJWTmpiM0psY3loMGNtRmpheXdnY0dWaGF5d2dYQ0pJTTBzeU4yRmpYQ0lwWEc1Y2JuUnlZV05ySUR3dElHbHRjRzl5ZENob1pYSmxLSEpsWmtScGNpd2dYQ0pIVTAweU5qZ3pORFF3WDBveFgwZ3pTekUwWVdOZmJXMHhNRXhwWm5SbFpDNWliR0ZqYXk1aWQxd2lLU3dnWm05eWJXRjBJRDBnWENKQ2FXZFhhV2RjSWlsY2JuQmxZV3NnUEMwZ2FXMXdiM0owVUdWaGF5aG9aWEpsS0hKbFprUnBjaXdnWENKSFUwMHlOamd6TkRRd1gwb3hYMGd6U3pFMFlXTmZiVzB4TUV4cFpuUmxaQzVpWldSY0lpa3BYRzV3Ykc5MFUzVnRVMk52Y21WektIUnlZV05yTENCd1pXRnJMQ0JjSWtnelN6RTBZV05jSWlsY2JseHVkSEpoWTJzZ1BDMGdhVzF3YjNKMEtHaGxjbVVvY21WbVJHbHlMQ0JjSWpNek1qUTRYME5VUTBaZk1EY3ROekk1WDBKeWRXTmxMVFJmZEhKcGJWOXhNakJmWkdWa2RYQmZZbXhoWTJ0ZlpHVndkR2hPYjNKdExtSjNYQ0lwTENCbWIzSnRZWFFnUFNCY0lrSnBaMWRwWjF3aUtWeHVjR1ZoYXlBOExTQnBiWEJ2Y25SUVpXRnJLR2hsY21Vb2NtVm1SR2x5TENCY0lqTXpNalE0WDBOVVEwWmZNRGN0TnpJNVgwSnlkV05sTFRSZmNHVmhhM011YldWeVoyVlFaV0ZyTG1KbFpGd2lLU2xjYm5Cc2IzUlRkVzFUWTI5eVpYTW9kSEpoWTJzc0lIQmxZV3NzSUZ3aVExUkRSbHdpS1Z4dVhHNTBjbUZqYXlBOExTQnBiWEJ2Y25Rb2FHVnlaU2h5WldaRWFYSXNJRndpTXpNeU5UQmZVa0ZFTWpGZllXSTVPVEpmUW5KMVkyVXRORjkwY21sdFgzRXlNRjlrWldSMWNGOWliR0ZqYTE5a1pYQjBhRTV2Y20wdVluZGNJaWtzSUdadmNtMWhkQ0E5SUZ3aVFtbG5WMmxuWENJcFhHNXdaV0ZyTG5SbGJYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aU16TXlOVEJmVWtGRU1qRmZZV0k1T1RKZlFuSjFZMlV0TkY5d1pXRnJjeTV0WlhKblpWQmxZV3N1WW1Wa1hDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoV01pQTlJRll5SUMwZ01UQXdNQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JXTXlBOUlGWXpJQ3NnTVRBd01DbGNibU52Ykc1aGJXVnpLSEJsWVdzdWRHVnRjQ2tnUEMwZ1l5aGNJbU5vY2x3aUxDQmNJbk4wWVhKMFhDSXNJRndpWlc1a1hDSXBYRzV3WldGcklEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaHdaV0ZyTG5SbGJYQXBYRzV3Ykc5MFUzVnRVMk52Y21WektIUnlZV05yTENCd1pXRnJMQ0JjSWxsWk1Wd2lLVnh1WEc1Y2JpTWpJeUJHYjNJZ2RHaHZjMlVnZDJsMGFDQnZibXg1SUhOMWJXMXBkRnh1ZEhKaFkyc2dQQzBnYVcxd2IzSjBLR2hsY21Vb2NtVm1SR2x5TENCY0lrZFRUVFUxTnpFNE9UVmZSVk5EWDFsWk1WOHhMbUozWENJcExDQm1iM0p0WVhRZ1BTQmNJa0pwWjFkcFoxd2lLVnh1Y0dWaGF5QThMU0JwYlhCdmNuUlFaV0ZyS0dobGNtVW9jbVZtUkdseUxDQmNJa2RUVFRVMU56RTRPVFZmUlZORFgxbFpNVjl6ZFcxdGFYUXVZbVZrWENJcEtWeHVjR3h2ZEZOMWJWTmpiM0psY3loMGNtRmpheXdnY0dWaGF5d2dYQ0pTUVVReU1Wd2lLVnh1WEc0akl5TWdSazlTSUZSSVQxTkZJRmRKVkVoUFZWUWdVRVZCUzFOY2JuUnlZV05ySUR3dElHbHRjRzl5ZENob1pYSmxLSEpsWmtScGNpd2dYQ0pIVTAweU1EZ3lOekE0WDBWVFF5NUlNMHN5TjIxbE15NHhYMjF0TVRCTWFXWjBaV1F1WW14aFkyc3VZbmRjSWlrc0lHWnZjbTFoZENBOUlGd2lRbWxuVjJsblhDSXBYRzVoSUR3dElHZGxkRk4xYlZOamIzSmxjeWgwY21GamF5d2dZVzVqYUc5eUxuVndLVnh1WWlBOExTQm5aWFJUZFcxVFkyOXlaWE1vZEhKaFkyc3NJR0Z1WTJodmNpNXVieWxjYm1NZ1BDMGdaMlYwVTNWdFUyTnZjbVZ6S0hSeVlXTnJMQ0JoYm1Ob2IzSXVaRzkzYmlsY2JtRXVkR0lnUEMwZ2RHbGlZbXhsS0d4dmIzQWdQU0JjSWxWUVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpkVzFUWTI5eVpTQTlJR0VwWEc1aUxuUmlJRHd0SUhScFltSnNaU2hzYjI5d0lEMGdYQ0pPVDF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzVnRVMk52Y21VZ1BTQmlLVnh1WXk1MFlpQThMU0IwYVdKaWJHVW9iRzl2Y0NBOUlGd2lSRTlYVGx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzVnRVMk52Y21VZ1BTQmpLVnh1WkdGMFlTQThMU0JpYVc1a1gzSnZkM01vWVM1MFlpd2dZaTUwWWl3Z1l5NTBZaWtnSlQ0bElHUnliM0JmYm1Fb0tWeHVaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnYkc5dmNDd2dlU0E5SUhOMWJWTmpiM0psS1NrZ0t5Qm5aVzl0WDJKdmVIQnNiM1FvYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHZG5kR2wwYkdVb2NHRnpkR1V3S0Z3aVNETkxNamR0WlRNZ2MzVnRJRzV2SUhCbFlXdGNJaWtwSUN0Y2JpQWdZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktEQXNJSEYxWVc1MGFXeGxLR1JoZEdFa2MzVnRVMk52Y21Vc0lEQXVPU2twS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbiMgVVAgbG9vcFxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci51cCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwKSlcbiMgTk8gbG9vcFxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbiMgRE9XTiBsb29wXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpXG5cbmdldFN1bVNjb3JlcyA8LSBmdW5jdGlvbih0cmFjaywgYW5jaG9yKSB7XG4gICMgRmluZCBvdmVybGFwcyBiZXR3ZWVuIGFsbCBhbmNob3JzIGFuZCB0cmFjayByZWdpb25zIGF0IG9uY2VcbiAgb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvciwgdHJhY2spXG4gIFxuICAjIEV4dHJhY3QgdGhlIHNjb3JlcyBhbmQgY29ycmVzcG9uZGluZyBhbmNob3IgaW5kaWNlc1xuICBhbmNob3JfaW5kaWNlcyA8LSBxdWVyeUhpdHMob3ZlcmxhcHMpXG4gIHRyYWNrX3Njb3JlcyA8LSBzY29yZSh0cmFjaylbc3ViamVjdEhpdHMob3ZlcmxhcHMpXVxuICBcbiAgIyBVc2UgdGFwcGx5IHRvIGNhbGN1bGF0ZSB0aGUgbWVkaWFuIHNjb3JlcyBmb3IgZWFjaCBhbmNob3JcbiAgbWVkaWFuX3Njb3JlcyA8LSB0YXBwbHkodHJhY2tfc2NvcmVzLCBhbmNob3JfaW5kaWNlcywgc3VtLCBuYS5ybSA9IFRSVUUpXG4gIFxuICAjIEluaXRpYWxpemUgYSBudW1lcmljIHZlY3RvciB0byBzdG9yZSB0aGUgbWVkaWFuIHNjb3JlcyBmb3IgZWFjaCBhbmNob3JcbiAgYWxsX21lZGlhbl9zY29yZXMgPC0gcmVwKE5BLCBsZW5ndGgoYW5jaG9yKSlcbiAgXG4gICMgUG9wdWxhdGUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIHRoZSBhbmNob3JzIHRoYXQgaGF2ZSBvdmVybGFwc1xuICBhbGxfbWVkaWFuX3Njb3Jlc1thcy5udW1lcmljKG5hbWVzKG1lZGlhbl9zY29yZXMpKV0gPC0gbWVkaWFuX3Njb3Jlc1xuICBcbiAgcmV0dXJuKGFsbF9tZWRpYW5fc2NvcmVzKVxufVxuXG5wbG90U3VtU2NvcmVzIDwtIGZ1bmN0aW9uKHRyYWNrLCBwZWFrLCBuYW1lKXtcbiAgcGVha1RyYWNrIDwtIHRyYWNrW3VuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKHRyYWNrLCBwZWFrKSkpXVxuICBhIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvci51cClcbiAgYiA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3Iubm8pXG4gIGMgPC0gZ2V0U3VtU2NvcmVzKHBlYWtUcmFjaywgYW5jaG9yLmRvd24pXG4gIGEudGIgPC0gdGliYmxlKGxvb3AgPSBcXFVQXFwsXG4gICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYSlcbiAgYi50YiA8LSB0aWJibGUobG9vcCA9IFxcTk9cXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBiKVxuICBjLnRiIDwtIHRpYmJsZShsb29wID0gXFxET1dOXFwsXG4gICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYylcbiAgZGF0YSA8LSBiaW5kX3Jvd3MoYS50YiwgYi50YiwgYy50YikgJT4lIGRyb3BfbmEoKVxuICBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBsb29wLCB5ID0gc3VtU2NvcmUpKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAobmFtZSwgXFwgc3VtIHBlYWtcXCkpICtcbiAgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC45KSkpXG59XG5cbiMgU3VtIHBlYWsgc2NvcmVcbiMjIyNcbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFwzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG5wbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXEgzSzRtZTNcXClcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWRcXCkpXG5wbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXEgzSzI3YWNcXClcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXEdTTTI2ODM0NDBfSjFfSDNLMTRhY19tbTEwTGlmdGVkLmJsYWNrLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTI2ODM0NDBfSjFfSDNLMTRhY19tbTEwTGlmdGVkLmJlZFxcKSlcbnBsb3RTdW1TY29yZXModHJhY2ssIHBlYWssIFxcSDNLMTRhY1xcKVxuXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxucGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxDVENGXFwpXG5cbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsudGVtcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFYyID0gVjIgLSAxMDAwLFxuICAgICAgICAgICAgICAgIFYzID0gVjMgKyAxMDAwKVxuY29sbmFtZXMocGVhay50ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnBlYWsgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHBlYWsudGVtcClcbnBsb3RTdW1TY29yZXModHJhY2ssIHBlYWssIFxcWVkxXFwpXG5cblxuIyMjIEZvciB0aG9zZSB3aXRoIG9ubHkgc3VtbWl0XG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcR1NNNTU3MTg5NV9FU0NfWVkxXzEuYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcR1NNNTU3MTg5NV9FU0NfWVkxX3N1bW1pdC5iZWRcXCkpXG5wbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXFJBRDIxXFwpXG5cbiMjIyBGT1IgVEhPU0UgV0lUSE9VVCBQRUFLU1xudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXEdTTTIwODI3MDhfRVNDLkgzSzI3bWUzLjFfbW0xMExpZnRlZC5ibGFjay5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbmEgPC0gZ2V0U3VtU2NvcmVzKHRyYWNrLCBhbmNob3IudXApXG5iIDwtIGdldFN1bVNjb3Jlcyh0cmFjaywgYW5jaG9yLm5vKVxuYyA8LSBnZXRTdW1TY29yZXModHJhY2ssIGFuY2hvci5kb3duKVxuYS50YiA8LSB0aWJibGUobG9vcCA9IFxcVVBcXCxcbiAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYSlcbmIudGIgPC0gdGliYmxlKGxvb3AgPSBcXE5PXFwsXG4gICAgICAgICAgICAgICBzdW1TY29yZSA9IGIpXG5jLnRiIDwtIHRpYmJsZShsb29wID0gXFxET1dOXFwsXG4gICAgICAgICAgICAgICBzdW1TY29yZSA9IGMpXG5kYXRhIDwtIGJpbmRfcm93cyhhLnRiLCBiLnRiLCBjLnRiKSAlPiUgZHJvcF9uYSgpXG5nZ3Bsb3QoZGF0YSwgYWVzKHggPSBsb29wLCB5ID0gc3VtU2NvcmUpKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoXFxIM0syN21lMyBzdW0gbm8gcGVha1xcKSkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC45KSkpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
name <- \chromo_cons_annoHierarchy\

# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))

getSumScores <- function(track, anchor) {
  # Find overlaps between all anchors and track regions at once
  overlaps <- findOverlaps(anchor, track)
  
  # Extract the scores and corresponding anchor indices
  anchor_indices <- queryHits(overlaps)
  track_scores <- score(track)[subjectHits(overlaps)]
  
  # Use tapply to calculate the median scores for each anchor
  median_scores <- tapply(track_scores, anchor_indices, sum, na.rm = TRUE)
  
  # Initialize a numeric vector to store the median scores for each anchor
  all_median_scores <- rep(NA, length(anchor))
  
  # Populate the median scores for the anchors that have overlaps
  all_median_scores[as.numeric(names(median_scores))] <- median_scores
  
  return(all_median_scores)
}

plotSumScores <- function(track, peak, name){
  peakTrack <- track[unique(queryHits(findOverlaps(track, peak)))]
  a <- getSumScores(peakTrack, anchor.up)
  b <- getSumScores(peakTrack, anchor.no)
  c <- getSumScores(peakTrack, anchor.down)
  a.tb <- tibble(loop = \UP\,
                 sumScore = a)
  b.tb <- tibble(loop = \NO\,
                 sumScore = b)
  c.tb <- tibble(loop = \DOWN\,
                 sumScore = c)
  data <- bind_rows(a.tb, b.tb, c.tb) %>% drop_na()
  ggplot(data, aes(x = loop, y = sumScore)) + geom_boxplot(outlier.shape = NA) + theme_classic() + ggtitle(paste0(name, \ sum peak\)) +
    coord_cartesian(ylim = c(0, quantile(data$sumScore, 0.9)))
}

# Sum peak score
####
track <- import(here(refDir, \33255_H3K4me3_04-745_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.bed\))
plotSumScores(track, peak, \H3K4me3\)

track <- import(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
plotSumScores(track, peak, \H3K27ac\)

track <- import(here(refDir, \GSM2683440_J1_H3K14ac_mm10Lifted.black.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM2683440_J1_H3K14ac_mm10Lifted.bed\))
plotSumScores(track, peak, \H3K14ac\)

track <- import(here(refDir, \33248_CTCF_07-729_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))
plotSumScores(track, peak, \CTCF\)

track <- import(here(refDir, \33250_RAD21_ab992_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak.temp <- fread(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\)) %>%
  dplyr::mutate(V2 = V2 - 1000,
                V3 = V3 + 1000)
colnames(peak.temp) <- c(\chr\, \start\, \end\)
peak <- makeGRangesFromDataFrame(peak.temp)
plotSumScores(track, peak, \YY1\)


### For those with only summit
track <- import(here(refDir, \GSM5571895_ESC_YY1_1.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM5571895_ESC_YY1_summit.bed\))
plotSumScores(track, peak, \RAD21\)

### FOR THOSE WITHOUT PEAKS
track <- import(here(refDir, \GSM2082708_ESC.H3K27me3.1_mm10Lifted.black.bw\), format = \BigWig\)
a <- getSumScores(track, anchor.up)
b <- getSumScores(track, anchor.no)
c <- getSumScores(track, anchor.down)
a.tb <- tibble(loop = \UP\,
               sumScore = a)
b.tb <- tibble(loop = \NO\,
               sumScore = b)
c.tb <- tibble(loop = \DOWN\,
               sumScore = c)
data <- bind_rows(a.tb, b.tb, c.tb) %>% drop_na()
ggplot(data, aes(x = loop, y = sumScore)) + geom_boxplot(outlier.shape = NA) + theme_classic() + ggtitle(paste0(\H3K27me3 sum no peak\)) +
  coord_cartesian(ylim = c(0, quantile(data$sumScore, 0.9)))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzRqSUZWUUlHeHZiM0JjYm14dmIzQXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlCTkRnMWRuTkVUVk5QWDFWUVgyUnBabVl3TGpJdVltVmtjR1ZjWENrcFhHNWhibU5vYjNJdWRYQWdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1MWNDa3BYRzRqSUU1UElHeHZiM0JjYm14dmIzQXVibThnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlCTkRnMWRuTkVUVk5QWDA1UFgyUnBabVl3TGpJdVltVmtjR1ZjWENrcFhHNWhibU5vYjNJdWJtOGdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1dWJ5a3BYRzRqSUVSUFYwNGdiRzl2Y0Z4dWJHOXZjQzVrYjNkdUlEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjR1V0Y0dWZlFUUTROWFp6UkUxVFQxOUVUMWRPWDJScFptWXdMakl1WW1Wa2NHVmNYQ2twWEc1aGJtTm9iM0l1Wkc5M2JpQThMU0FvWlhoMGNtRmpkRUZ1WTJodmNpaHNiMjl3TG1SdmQyNHBLVnh1WEc1blpYUlRkVzFUWTI5eVpYTWdQQzBnWm5WdVkzUnBiMjRvZEhKaFkyc3NJR0Z1WTJodmNpa2dlMXh1SUNBaklFWnBibVFnYjNabGNteGhjSE1nWW1WMGQyVmxiaUJoYkd3Z1lXNWphRzl5Y3lCaGJtUWdkSEpoWTJzZ2NtVm5hVzl1Y3lCaGRDQnZibU5sWEc0Z0lHOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0lzSUhSeVlXTnJLVnh1SUNCY2JpQWdJeUJGZUhSeVlXTjBJSFJvWlNCelkyOXlaWE1nWVc1a0lHTnZjbkpsYzNCdmJtUnBibWNnWVc1amFHOXlJR2x1WkdsalpYTmNiaUFnWVc1amFHOXlYMmx1WkdsalpYTWdQQzBnY1hWbGNubElhWFJ6S0c5MlpYSnNZWEJ6S1Z4dUlDQjBjbUZqYTE5elkyOXlaWE1nUEMwZ2MyTnZjbVVvZEhKaFkyc3BXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1YxY2JpQWdYRzRnSUNNZ1ZYTmxJSFJoY0hCc2VTQjBieUJqWVd4amRXeGhkR1VnZEdobElHMWxaR2xoYmlCelkyOXlaWE1nWm05eUlHVmhZMmdnWVc1amFHOXlYRzRnSUcxbFpHbGhibDl6WTI5eVpYTWdQQzBnZEdGd2NHeDVLSFJ5WVdOclgzTmpiM0psY3l3Z1lXNWphRzl5WDJsdVpHbGpaWE1zSUhOMWJTd2dibUV1Y20wZ1BTQlVVbFZGS1Z4dUlDQmNiaUFnSXlCSmJtbDBhV0ZzYVhwbElHRWdiblZ0WlhKcFl5QjJaV04wYjNJZ2RHOGdjM1J2Y21VZ2RHaGxJRzFsWkdsaGJpQnpZMjl5WlhNZ1ptOXlJR1ZoWTJnZ1lXNWphRzl5WEc0Z0lHRnNiRjl0WldScFlXNWZjMk52Y21WeklEd3RJSEpsY0NoT1FTd2diR1Z1WjNSb0tHRnVZMmh2Y2lrcFhHNGdJRnh1SUNBaklGQnZjSFZzWVhSbElIUm9aU0J0WldScFlXNGdjMk52Y21WeklHWnZjaUIwYUdVZ1lXNWphRzl5Y3lCMGFHRjBJR2hoZG1VZ2IzWmxjbXhoY0hOY2JpQWdZV3hzWDIxbFpHbGhibDl6WTI5eVpYTmJZWE11Ym5WdFpYSnBZeWh1WVcxbGN5aHRaV1JwWVc1ZmMyTnZjbVZ6S1NsZElEd3RJRzFsWkdsaGJsOXpZMjl5WlhOY2JpQWdYRzRnSUhKbGRIVnliaWhoYkd4ZmJXVmthV0Z1WDNOamIzSmxjeWxjYm4xY2JseHVjR3h2ZEZOMWJWTmpiM0psY3lBOExTQm1kVzVqZEdsdmJpaDBjbUZqYXl3Z2NHVmhheXdnYm1GdFpTbDdYRzRnSUhCbFlXdFVjbUZqYXlBOExTQjBjbUZqYTF0MWJtbHhkV1VvY1hWbGNubElhWFJ6S0dacGJtUlBkbVZ5YkdGd2N5aDBjbUZqYXl3Z2NHVmhheWtwS1YxY2JpQWdZU0E4TFNCblpYUlRkVzFUWTI5eVpYTW9jR1ZoYTFSeVlXTnJMQ0JoYm1Ob2IzSXVkWEFwWEc0Z0lHSWdQQzBnWjJWMFUzVnRVMk52Y21WektIQmxZV3RVY21GamF5d2dZVzVqYUc5eUxtNXZLVnh1SUNCaklEd3RJR2RsZEZOMWJWTmpiM0psY3lod1pXRnJWSEpoWTJzc0lHRnVZMmh2Y2k1a2IzZHVLVnh1SUNCaExuUmlJRHd0SUhScFltSnNaU2hzYjI5d0lEMGdYRnhWVUZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpkVzFUWTI5eVpTQTlJR0VwWEc0Z0lHSXVkR0lnUEMwZ2RHbGlZbXhsS0d4dmIzQWdQU0JjWEU1UFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE4xYlZOamIzSmxJRDBnWWlsY2JpQWdZeTUwWWlBOExTQjBhV0ppYkdVb2JHOXZjQ0E5SUZ4Y1JFOVhUbHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRXMVRZMjl5WlNBOUlHTXBYRzRnSUdSaGRHRWdQQzBnWW1sdVpGOXliM2R6S0dFdWRHSXNJR0l1ZEdJc0lHTXVkR0lwSUNVK0pTQmtjbTl3WDI1aEtDbGNiaUFnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ2JHOXZjQ3dnZVNBOUlITjFiVk5qYjNKbEtTa2dLeUJuWlc5dFgySnZlSEJzYjNRb2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJR2RuZEdsMGJHVW9jR0Z6ZEdVd0tHNWhiV1VzSUZ4Y0lITjFiU0J3WldGclhGd3BLU0FyWEc0Z0lDQWdZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktEQXNJSEYxWVc1MGFXeGxLR1JoZEdFa2MzVnRVMk52Y21Vc0lEQXVPU2twS1Z4dWZWeHVYRzRqSUZOMWJTQndaV0ZySUhOamIzSmxYRzRqSXlNalhHNTBjbUZqYXlBOExTQnBiWEJ2Y25Rb2FHVnlaU2h5WldaRWFYSXNJRnhjTXpNeU5UVmZTRE5MTkcxbE0xOHdOQzAzTkRWZlFuSjFZMlV0TkY5MGNtbHRYM0V5TUY5a1pXUjFjRjlpYkdGamExOWtaWEIwYUU1dmNtMHVZbmRjWENrc0lHWnZjbTFoZENBOUlGeGNRbWxuVjJsblhGd3BYRzV3WldGcklEd3RJR2x0Y0c5eWRGQmxZV3NvYUdWeVpTaHlaV1pFYVhJc0lGeGNNek15TlRWZlNETkxORzFsTTE4d05DMDNORFZmUW5KMVkyVXRORjl3WldGcmN5NXRaWEpuWlZCbFlXc3VZbVZrWEZ3cEtWeHVjR3h2ZEZOMWJWTmpiM0psY3loMGNtRmpheXdnY0dWaGF5d2dYRnhJTTBzMGJXVXpYRndwWEc1Y2JuUnlZV05ySUR3dElHbHRjRzl5ZENob1pYSmxLSEpsWmtScGNpd2dYRnhIVTAweU5ETTRORGMyWDBWRExVUkhMVE0wTlRndFNETkxNamRCUTE5QlUxbE9YekV1WW5kY1hDa3NJR1p2Y20xaGRDQTlJRnhjUW1sblYybG5YRndwWEc1d1pXRnJJRHd0SUdsdGNHOXlkRkJsWVdzb2FHVnlaU2h5WldaRWFYSXNJRnhjUjFOTk1qUXpPRFEzTmw5RlF5MUVSeTB6TkRVNExVZ3pTekkzUVVOZlFWTlpUbDh4TG01aGNuSnZkMUJsWVdzdVltVmtYRndwS1Z4dWNHeHZkRk4xYlZOamIzSmxjeWgwY21GamF5d2djR1ZoYXl3Z1hGeElNMHN5TjJGalhGd3BYRzVjYm5SeVlXTnJJRHd0SUdsdGNHOXlkQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeEhVMDB5Tmpnek5EUXdYMG94WDBnelN6RTBZV05mYlcweE1FeHBablJsWkM1aWJHRmpheTVpZDF4Y0tTd2dabTl5YldGMElEMGdYRnhDYVdkWGFXZGNYQ2xjYm5CbFlXc2dQQzBnYVcxd2IzSjBVR1ZoYXlob1pYSmxLSEpsWmtScGNpd2dYRnhIVTAweU5qZ3pORFF3WDBveFgwZ3pTekUwWVdOZmJXMHhNRXhwWm5SbFpDNWlaV1JjWENrcFhHNXdiRzkwVTNWdFUyTnZjbVZ6S0hSeVlXTnJMQ0J3WldGckxDQmNYRWd6U3pFMFlXTmNYQ2xjYmx4dWRISmhZMnNnUEMwZ2FXMXdiM0owS0dobGNtVW9jbVZtUkdseUxDQmNYRE16TWpRNFgwTlVRMFpmTURjdE56STVYMEp5ZFdObExUUmZkSEpwYlY5eE1qQmZaR1ZrZFhCZllteGhZMnRmWkdWd2RHaE9iM0p0TG1KM1hGd3BMQ0JtYjNKdFlYUWdQU0JjWEVKcFoxZHBaMXhjS1Z4dWNHVmhheUE4TFNCcGJYQnZjblJRWldGcktHaGxjbVVvY21WbVJHbHlMQ0JjWERNek1qUTRYME5VUTBaZk1EY3ROekk1WDBKeWRXTmxMVFJmY0dWaGEzTXViV1Z5WjJWUVpXRnJMbUpsWkZ4Y0tTbGNibkJzYjNSVGRXMVRZMjl5WlhNb2RISmhZMnNzSUhCbFlXc3NJRnhjUTFSRFJseGNLVnh1WEc1MGNtRmpheUE4TFNCcGJYQnZjblFvYUdWeVpTaHlaV1pFYVhJc0lGeGNNek15TlRCZlVrRkVNakZmWVdJNU9USmZRbkoxWTJVdE5GOTBjbWx0WDNFeU1GOWtaV1IxY0Y5aWJHRmphMTlrWlhCMGFFNXZjbTB1WW5kY1hDa3NJR1p2Y20xaGRDQTlJRnhjUW1sblYybG5YRndwWEc1d1pXRnJMblJsYlhBZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjTXpNeU5UQmZVa0ZFTWpGZllXSTVPVEpmUW5KMVkyVXRORjl3WldGcmN5NXRaWEpuWlZCbFlXc3VZbVZrWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hXTWlBOUlGWXlJQzBnTVRBd01DeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQldNeUE5SUZZeklDc2dNVEF3TUNsY2JtTnZiRzVoYldWektIQmxZV3N1ZEdWdGNDa2dQQzBnWXloY1hHTm9jbHhjTENCY1hITjBZWEowWEZ3c0lGeGNaVzVrWEZ3cFhHNXdaV0ZySUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNod1pXRnJMblJsYlhBcFhHNXdiRzkwVTNWdFUyTnZjbVZ6S0hSeVlXTnJMQ0J3WldGckxDQmNYRmxaTVZ4Y0tWeHVYRzVjYmlNakl5QkdiM0lnZEdodmMyVWdkMmwwYUNCdmJteDVJSE4xYlcxcGRGeHVkSEpoWTJzZ1BDMGdhVzF3YjNKMEtHaGxjbVVvY21WbVJHbHlMQ0JjWEVkVFRUVTFOekU0T1RWZlJWTkRYMWxaTVY4eExtSjNYRndwTENCbWIzSnRZWFFnUFNCY1hFSnBaMWRwWjF4Y0tWeHVjR1ZoYXlBOExTQnBiWEJ2Y25SUVpXRnJLR2hsY21Vb2NtVm1SR2x5TENCY1hFZFRUVFUxTnpFNE9UVmZSVk5EWDFsWk1WOXpkVzF0YVhRdVltVmtYRndwS1Z4dWNHeHZkRk4xYlZOamIzSmxjeWgwY21GamF5d2djR1ZoYXl3Z1hGeFNRVVF5TVZ4Y0tWeHVYRzRqSXlNZ1JrOVNJRlJJVDFORklGZEpWRWhQVlZRZ1VFVkJTMU5jYm5SeVlXTnJJRHd0SUdsdGNHOXlkQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeEhVMDB5TURneU56QTRYMFZUUXk1SU0wc3lOMjFsTXk0eFgyMXRNVEJNYVdaMFpXUXVZbXhoWTJzdVluZGNYQ2tzSUdadmNtMWhkQ0E5SUZ4Y1FtbG5WMmxuWEZ3cFhHNWhJRHd0SUdkbGRGTjFiVk5qYjNKbGN5aDBjbUZqYXl3Z1lXNWphRzl5TG5Wd0tWeHVZaUE4TFNCblpYUlRkVzFUWTI5eVpYTW9kSEpoWTJzc0lHRnVZMmh2Y2k1dWJ5bGNibU1nUEMwZ1oyVjBVM1Z0VTJOdmNtVnpLSFJ5WVdOckxDQmhibU5vYjNJdVpHOTNiaWxjYm1FdWRHSWdQQzBnZEdsaVlteGxLR3h2YjNBZ1BTQmNYRlZRWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRXMVRZMjl5WlNBOUlHRXBYRzVpTG5SaUlEd3RJSFJwWW1Kc1pTaHNiMjl3SUQwZ1hGeE9UMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNWdFUyTnZjbVVnUFNCaUtWeHVZeTUwWWlBOExTQjBhV0ppYkdVb2JHOXZjQ0E5SUZ4Y1JFOVhUbHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNWdFUyTnZjbVVnUFNCaktWeHVaR0YwWVNBOExTQmlhVzVrWDNKdmQzTW9ZUzUwWWl3Z1lpNTBZaXdnWXk1MFlpa2dKVDRsSUdSeWIzQmZibUVvS1Z4dVoyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdiRzl2Y0N3Z2VTQTlJSE4xYlZOamIzSmxLU2tnS3lCblpXOXRYMkp2ZUhCc2IzUW9iM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUdkbmRHbDBiR1VvY0dGemRHVXdLRnhjU0ROTE1qZHRaVE1nYzNWdElHNXZJSEJsWVd0Y1hDa3BJQ3RjYmlBZ1kyOXZjbVJmWTJGeWRHVnphV0Z1S0hsc2FXMGdQU0JqS0RBc0lIRjFZVzUwYVd4bEtHUmhkR0VrYzNWdFUyTnZjbVVzSURBdU9Ta3BLVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG4jIFVQIGxvb3Bcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG4jIE5PIGxvb3Bcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3Iubm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpXG4jIERPV04gbG9vcFxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxuXG5nZXRTdW1TY29yZXMgPC0gZnVuY3Rpb24odHJhY2ssIGFuY2hvcikge1xuICAjIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBhbGwgYW5jaG9ycyBhbmQgdHJhY2sgcmVnaW9ucyBhdCBvbmNlXG4gIG92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IsIHRyYWNrKVxuICBcbiAgIyBFeHRyYWN0IHRoZSBzY29yZXMgYW5kIGNvcnJlc3BvbmRpbmcgYW5jaG9yIGluZGljZXNcbiAgYW5jaG9yX2luZGljZXMgPC0gcXVlcnlIaXRzKG92ZXJsYXBzKVxuICB0cmFja19zY29yZXMgPC0gc2NvcmUodHJhY2spW3N1YmplY3RIaXRzKG92ZXJsYXBzKV1cbiAgXG4gICMgVXNlIHRhcHBseSB0byBjYWxjdWxhdGUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIGVhY2ggYW5jaG9yXG4gIG1lZGlhbl9zY29yZXMgPC0gdGFwcGx5KHRyYWNrX3Njb3JlcywgYW5jaG9yX2luZGljZXMsIHN1bSwgbmEucm0gPSBUUlVFKVxuICBcbiAgIyBJbml0aWFsaXplIGEgbnVtZXJpYyB2ZWN0b3IgdG8gc3RvcmUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIGVhY2ggYW5jaG9yXG4gIGFsbF9tZWRpYW5fc2NvcmVzIDwtIHJlcChOQSwgbGVuZ3RoKGFuY2hvcikpXG4gIFxuICAjIFBvcHVsYXRlIHRoZSBtZWRpYW4gc2NvcmVzIGZvciB0aGUgYW5jaG9ycyB0aGF0IGhhdmUgb3ZlcmxhcHNcbiAgYWxsX21lZGlhbl9zY29yZXNbYXMubnVtZXJpYyhuYW1lcyhtZWRpYW5fc2NvcmVzKSldIDwtIG1lZGlhbl9zY29yZXNcbiAgXG4gIHJldHVybihhbGxfbWVkaWFuX3Njb3Jlcylcbn1cblxucGxvdFN1bVNjb3JlcyA8LSBmdW5jdGlvbih0cmFjaywgcGVhaywgbmFtZSl7XG4gIHBlYWtUcmFjayA8LSB0cmFja1t1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyh0cmFjaywgcGVhaykpKV1cbiAgYSA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IudXApXG4gIGIgPC0gZ2V0U3VtU2NvcmVzKHBlYWtUcmFjaywgYW5jaG9yLm5vKVxuICBjIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvci5kb3duKVxuICBhLnRiIDwtIHRpYmJsZShsb29wID0gXFxVUFxcLFxuICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGEpXG4gIGIudGIgPC0gdGliYmxlKGxvb3AgPSBcXE5PXFwsXG4gICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYilcbiAgYy50YiA8LSB0aWJibGUobG9vcCA9IFxcRE9XTlxcLFxuICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGMpXG4gIGRhdGEgPC0gYmluZF9yb3dzKGEudGIsIGIudGIsIGMudGIpICU+JSBkcm9wX25hKClcbiAgZ2dwbG90KGRhdGEsIGFlcyh4ID0gbG9vcCwgeSA9IHN1bVNjb3JlKSkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKG5hbWUsIFxcIHN1bSBwZWFrXFwpKSArXG4gICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIHF1YW50aWxlKGRhdGEkc3VtU2NvcmUsIDAuOSkpKVxufVxuXG4jIFN1bSBwZWFrIHNjb3JlXG4jIyMjXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxucGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxIM0s0bWUzXFwpXG5cbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEuYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkXFwpKVxucGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxIM0syN2FjXFwpXG5cbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFxHU00yNjgzNDQwX0oxX0gzSzE0YWNfbW0xMExpZnRlZC5ibGFjay5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNjgzNDQwX0oxX0gzSzE0YWNfbW0xMExpZnRlZC5iZWRcXCkpXG5wbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXEgzSzE0YWNcXClcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfdHJpbV9xMjBfZGVkdXBfYmxhY2tfZGVwdGhOb3JtLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbnBsb3RTdW1TY29yZXModHJhY2ssIHBlYWssIFxcQ1RDRlxcKVxuXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrLnRlbXAgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShWMiA9IFYyIC0gMTAwMCxcbiAgICAgICAgICAgICAgICBWMyA9IFYzICsgMTAwMClcbmNvbG5hbWVzKHBlYWsudGVtcCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5wZWFrIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShwZWFrLnRlbXApXG5wbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXFlZMVxcKVxuXG5cbiMjIyBGb3IgdGhvc2Ugd2l0aCBvbmx5IHN1bW1pdFxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXEdTTTU1NzE4OTVfRVNDX1lZMV8xLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTU1NzE4OTVfRVNDX1lZMV9zdW1taXQuYmVkXFwpKVxucGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxSQUQyMVxcKVxuXG4jIyMgRk9SIFRIT1NFIFdJVEhPVVQgUEVBS1NcbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFxHU00yMDgyNzA4X0VTQy5IM0syN21lMy4xX21tMTBMaWZ0ZWQuYmxhY2suYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5hIDwtIGdldFN1bVNjb3Jlcyh0cmFjaywgYW5jaG9yLnVwKVxuYiA8LSBnZXRTdW1TY29yZXModHJhY2ssIGFuY2hvci5ubylcbmMgPC0gZ2V0U3VtU2NvcmVzKHRyYWNrLCBhbmNob3IuZG93bilcbmEudGIgPC0gdGliYmxlKGxvb3AgPSBcXFVQXFwsXG4gICAgICAgICAgICAgICBzdW1TY29yZSA9IGEpXG5iLnRiIDwtIHRpYmJsZShsb29wID0gXFxOT1xcLFxuICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBiKVxuYy50YiA8LSB0aWJibGUobG9vcCA9IFxcRE9XTlxcLFxuICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBjKVxuZGF0YSA8LSBiaW5kX3Jvd3MoYS50YiwgYi50YiwgYy50YikgJT4lIGRyb3BfbmEoKVxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gbG9vcCwgeSA9IHN1bVNjb3JlKSkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcSDNLMjdtZTMgc3VtIG5vIHBlYWtcXCkpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIHF1YW50aWxlKGRhdGEkc3VtU2NvcmUsIDAuOSkpKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG4jIFVQIGxvb3Bcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG4jIE5PIGxvb3Bcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3Iubm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpXG4jIERPV04gbG9vcFxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxuXG5nZXRTdW1TY29yZXMgPC0gZnVuY3Rpb24odHJhY2ssIGFuY2hvcikge1xuICAjIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBhbGwgYW5jaG9ycyBhbmQgdHJhY2sgcmVnaW9ucyBhdCBvbmNlXG4gIG92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IsIHRyYWNrKVxuICBcbiAgIyBFeHRyYWN0IHRoZSBzY29yZXMgYW5kIGNvcnJlc3BvbmRpbmcgYW5jaG9yIGluZGljZXNcbiAgYW5jaG9yX2luZGljZXMgPC0gcXVlcnlIaXRzKG92ZXJsYXBzKVxuICB0cmFja19zY29yZXMgPC0gc2NvcmUodHJhY2spW3N1YmplY3RIaXRzKG92ZXJsYXBzKV1cbiAgXG4gICMgVXNlIHRhcHBseSB0byBjYWxjdWxhdGUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIGVhY2ggYW5jaG9yXG4gIG1lZGlhbl9zY29yZXMgPC0gdGFwcGx5KHRyYWNrX3Njb3JlcywgYW5jaG9yX2luZGljZXMsIHN1bSwgbmEucm0gPSBUUlVFKVxuICBcbiAgIyBJbml0aWFsaXplIGEgbnVtZXJpYyB2ZWN0b3IgdG8gc3RvcmUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIGVhY2ggYW5jaG9yXG4gIGFsbF9tZWRpYW5fc2NvcmVzIDwtIHJlcChOQSwgbGVuZ3RoKGFuY2hvcikpXG4gIFxuICAjIFBvcHVsYXRlIHRoZSBtZWRpYW4gc2NvcmVzIGZvciB0aGUgYW5jaG9ycyB0aGF0IGhhdmUgb3ZlcmxhcHNcbiAgYWxsX21lZGlhbl9zY29yZXNbYXMubnVtZXJpYyhuYW1lcyhtZWRpYW5fc2NvcmVzKSldIDwtIG1lZGlhbl9zY29yZXNcbiAgXG4gIHJldHVybihhbGxfbWVkaWFuX3Njb3Jlcylcbn1cblxucGxvdFN1bVNjb3JlcyA8LSBmdW5jdGlvbih0cmFjaywgcGVhaywgbmFtZSl7XG4gIHBlYWtUcmFjayA8LSB0cmFja1t1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyh0cmFjaywgcGVhaykpKV1cbiAgYSA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IudXApXG4gIGIgPC0gZ2V0U3VtU2NvcmVzKHBlYWtUcmFjaywgYW5jaG9yLm5vKVxuICBjIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvci5kb3duKVxuICBhLnRiIDwtIHRpYmJsZShsb29wID0gXFxVUFxcLFxuICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGEpXG4gIGIudGIgPC0gdGliYmxlKGxvb3AgPSBcXE5PXFwsXG4gICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYilcbiAgYy50YiA8LSB0aWJibGUobG9vcCA9IFxcRE9XTlxcLFxuICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGMpXG4gIGRhdGEgPC0gYmluZF9yb3dzKGEudGIsIGIudGIsIGMudGIpICU+JSBkcm9wX25hKClcbiAgZ2dwbG90KGRhdGEsIGFlcyh4ID0gbG9vcCwgeSA9IHN1bVNjb3JlKSkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKG5hbWUsIFxcIHN1bSBwZWFrXFwpKSArXG4gICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIHF1YW50aWxlKGRhdGEkc3VtU2NvcmUsIDAuOSkpKVxufVxuXG4jIFN1bSBwZWFrIHNjb3JlXG4jIyMjXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxucGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxIM0s0bWUzXFwpXG5cbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEuYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkXFwpKVxucGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxIM0syN2FjXFwpXG5cbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFxHU00yNjgzNDQwX0oxX0gzSzE0YWNfbW0xMExpZnRlZC5ibGFjay5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNjgzNDQwX0oxX0gzSzE0YWNfbW0xMExpZnRlZC5iZWRcXCkpXG5wbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXEgzSzE0YWNcXClcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfdHJpbV9xMjBfZGVkdXBfYmxhY2tfZGVwdGhOb3JtLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbnBsb3RTdW1TY29yZXModHJhY2ssIHBlYWssIFxcQ1RDRlxcKVxuXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrLnRlbXAgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShWMiA9IFYyIC0gMTAwMCxcbiAgICAgICAgICAgICAgICBWMyA9IFYzICsgMTAwMClcbmNvbG5hbWVzKHBlYWsudGVtcCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5wZWFrIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShwZWFrLnRlbXApXG5wbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXFlZMVxcKVxuXG5cbiMjIyBGb3IgdGhvc2Ugd2l0aCBvbmx5IHN1bW1pdFxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXEdTTTU1NzE4OTVfRVNDX1lZMV8xLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTU1NzE4OTVfRVNDX1lZMV9zdW1taXQuYmVkXFwpKVxucGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxSQUQyMVxcKVxuXG4jIyMgRk9SIFRIT1NFIFdJVEhPVVQgUEVBS1NcbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFxHU00yMDgyNzA4X0VTQy5IM0syN21lMy4xX21tMTBMaWZ0ZWQuYmxhY2suYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5hIDwtIGdldFN1bVNjb3Jlcyh0cmFjaywgYW5jaG9yLnVwKVxuYiA8LSBnZXRTdW1TY29yZXModHJhY2ssIGFuY2hvci5ubylcbmMgPC0gZ2V0U3VtU2NvcmVzKHRyYWNrLCBhbmNob3IuZG93bilcbmEudGIgPC0gdGliYmxlKGxvb3AgPSBcXFVQXFwsXG4gICAgICAgICAgICAgICBzdW1TY29yZSA9IGEpXG5iLnRiIDwtIHRpYmJsZShsb29wID0gXFxOT1xcLFxuICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBiKVxuYy50YiA8LSB0aWJibGUobG9vcCA9IFxcRE9XTlxcLFxuICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBjKVxuZGF0YSA8LSBiaW5kX3Jvd3MoYS50YiwgYi50YiwgYy50YikgJT4lIGRyb3BfbmEoKVxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gbG9vcCwgeSA9IHN1bVNjb3JlKSkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKFxcSDNLMjdtZTMgc3VtIG5vIHBlYWtcXCkpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIHF1YW50aWxlKGRhdGEkc3VtU2NvcmUsIDAuOSkpKVxuYGBgXG5gYGAifQ== -->

```r
```r
name <- \chromo_cons_annoHierarchy\

# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))

getSumScores <- function(track, anchor) {
  # Find overlaps between all anchors and track regions at once
  overlaps <- findOverlaps(anchor, track)
  
  # Extract the scores and corresponding anchor indices
  anchor_indices <- queryHits(overlaps)
  track_scores <- score(track)[subjectHits(overlaps)]
  
  # Use tapply to calculate the median scores for each anchor
  median_scores <- tapply(track_scores, anchor_indices, sum, na.rm = TRUE)
  
  # Initialize a numeric vector to store the median scores for each anchor
  all_median_scores <- rep(NA, length(anchor))
  
  # Populate the median scores for the anchors that have overlaps
  all_median_scores[as.numeric(names(median_scores))] <- median_scores
  
  return(all_median_scores)
}

plotSumScores <- function(track, peak, name){
  peakTrack <- track[unique(queryHits(findOverlaps(track, peak)))]
  a <- getSumScores(peakTrack, anchor.up)
  b <- getSumScores(peakTrack, anchor.no)
  c <- getSumScores(peakTrack, anchor.down)
  a.tb <- tibble(loop = \UP\,
                 sumScore = a)
  b.tb <- tibble(loop = \NO\,
                 sumScore = b)
  c.tb <- tibble(loop = \DOWN\,
                 sumScore = c)
  data <- bind_rows(a.tb, b.tb, c.tb) %>% drop_na()
  ggplot(data, aes(x = loop, y = sumScore)) + geom_boxplot(outlier.shape = NA) + theme_classic() + ggtitle(paste0(name, \ sum peak\)) +
    coord_cartesian(ylim = c(0, quantile(data$sumScore, 0.9)))
}

# Sum peak score
####
track <- import(here(refDir, \33255_H3K4me3_04-745_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.bed\))
plotSumScores(track, peak, \H3K4me3\)

track <- import(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
plotSumScores(track, peak, \H3K27ac\)

track <- import(here(refDir, \GSM2683440_J1_H3K14ac_mm10Lifted.black.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM2683440_J1_H3K14ac_mm10Lifted.bed\))
plotSumScores(track, peak, \H3K14ac\)

track <- import(here(refDir, \33248_CTCF_07-729_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))
plotSumScores(track, peak, \CTCF\)

track <- import(here(refDir, \33250_RAD21_ab992_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak.temp <- fread(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\)) %>%
  dplyr::mutate(V2 = V2 - 1000,
                V3 = V3 + 1000)
colnames(peak.temp) <- c(\chr\, \start\, \end\)
peak <- makeGRangesFromDataFrame(peak.temp)
plotSumScores(track, peak, \YY1\)


### For those with only summit
track <- import(here(refDir, \GSM5571895_ESC_YY1_1.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM5571895_ESC_YY1_summit.bed\))
plotSumScores(track, peak, \RAD21\)

### FOR THOSE WITHOUT PEAKS
track <- import(here(refDir, \GSM2082708_ESC.H3K27me3.1_mm10Lifted.black.bw\), format = \BigWig\)
a <- getSumScores(track, anchor.up)
b <- getSumScores(track, anchor.no)
c <- getSumScores(track, anchor.down)
a.tb <- tibble(loop = \UP\,
               sumScore = a)
b.tb <- tibble(loop = \NO\,
               sumScore = b)
c.tb <- tibble(loop = \DOWN\,
               sumScore = c)
data <- bind_rows(a.tb, b.tb, c.tb) %>% drop_na()
ggplot(data, aes(x = loop, y = sumScore)) + geom_boxplot(outlier.shape = NA) + theme_classic() + ggtitle(paste0(\H3K27me3 sum no peak\)) +
  coord_cartesian(ylim = c(0, quantile(data$sumScore, 0.9)))
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

## [2.26] Checking the ChIP intensity at anchors
This doesn't have to be restricted to P-N loops. Let's check all loops first.
Also instead of density (mean), median could be better choice. Sum is not appropriate here since
the size of anchors are not same.
#### Limited to peaks to reduce noise
##### dTAG

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc0aklGVlFJR3h2YjNCY2JteHZiM0F1ZFhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5a1ZFRkhkbk5FVFZOUFgxVlFYMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BYRzVoYm1Ob2IzSXVkWEFnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNTFjQ2twWEc0aklFNVBJR3h2YjNCY2JteHZiM0F1Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5a1ZFRkhkbk5FVFZOUFgwNVBYMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BYRzVoYm1Ob2IzSXVibThnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNXVieWtwWEc0aklFUlBWMDRnYkc5dmNGeHViRzl2Y0M1a2IzZHVJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZaRlJCUjNaelJFMVRUMTlFVDFkT1gyUnBabVl3TGpJdVltVmtjR1ZjSWlrcFhHNWhibU5vYjNJdVpHOTNiaUE4TFNBb1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtUnZkMjRwS1Z4dVhHNWNibkJsWVdzdVNETkxORzFsTXlBOExTQnBiWEJ2Y25SUVpXRnJLR2hsY21Vb2NtVm1SR2x5TENCY0lqTXpNalUxWDBnelN6UnRaVE5mTURRdE56UTFYMEp5ZFdObExUUmZjR1ZoYTNNdWJXVnlaMlZRWldGckxtSmxaRndpS1NsY2JuQmxZV3N1U0ROTE1qZGhZeUE4TFNCcGJYQnZjblJRWldGcktHaGxjbVVvY21WbVJHbHlMQ0JjSWtkVFRUSTBNemcwTnpaZlJVTXRSRWN0TXpRMU9DMUlNMHN5TjBGRFgwRlRXVTVmTVM1dVlYSnliM2RRWldGckxtSmxaRndpS1NsY2JuQmxZV3N1UTFSRFJpQThMU0JwYlhCdmNuUlFaV0ZyS0dobGNtVW9jbVZtUkdseUxDQmNJak16TWpRNFgwTlVRMFpmTURjdE56STVYMEp5ZFdObExUUmZjR1ZoYTNNdWJXVnlaMlZRWldGckxtSmxaRndpS1NsY2JuQmxZV3N1ZEdWdGNDQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENJek16STFNRjlTUVVReU1WOWhZams1TWw5Q2NuVmpaUzAwWDNCbFlXdHpMbTFsY21kbFVHVmhheTVpWldSY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0ZZeUlEMGdWaklnTFNBeE1EQXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRll6SUQwZ1ZqTWdLeUF4TURBd0tWeHVZMjlzYm1GdFpYTW9jR1ZoYXk1MFpXMXdLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNibkJsWVdzdVVrRkVNakVnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0hCbFlXc3VkR1Z0Y0NsY2JseHVYRzVqWVd4amRXeGhkR1ZRWldGclJHVnVjMmwwZVNBOExTQm1kVzVqZEdsdmJpaHdaV0ZyTENCdWIzUmxLWHRjYmlBZ1hHNGdJRzkyWlhKc1lYQmZZMjkxYm5SeklEd3RJR052ZFc1MFQzWmxjbXhoY0hNb1lXNWphRzl5TG5Wd0xDQndaV0ZyS1Z4dUlDQmhibU5vYjNKZmQybGtkR2h6SUR3dElDaDNhV1IwYUNoaGJtTm9iM0l1ZFhBcExURXBMekV3TURCY2JpQWdaR1Z1YzJsMGVTQThMU0J2ZG1WeWJHRndYMk52ZFc1MGN5QXZJR0Z1WTJodmNsOTNhV1IwYUhOY2JpQWdaR0YwWVRFZ1BDMGdkR2xpWW14bEtIUjVjR1VnUFNCY0lsVlFYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1pXNXphWFI1VUdWeVMySWdQU0JrWlc1emFYUjVLVnh1SUNCY2JpQWdiM1psY214aGNGOWpiM1Z1ZEhNZ1BDMGdZMjkxYm5SUGRtVnliR0Z3Y3loaGJtTm9iM0l1Ym04c0lIQmxZV3NwWEc0Z0lHRnVZMmh2Y2w5M2FXUjBhSE1nUEMwZ0tIZHBaSFJvS0dGdVkyaHZjaTV1YnlrdE1Ta3ZNVEF3TUZ4dUlDQmtaVzV6YVhSNUlEd3RJRzkyWlhKc1lYQmZZMjkxYm5SeklDOGdZVzVqYUc5eVgzZHBaSFJvYzF4dUlDQnRZMjlzY3loaGJtTm9iM0l1Ym04cEpHUmxibk5wZEhrZ1BDMGdaR1Z1YzJsMGVWeHVJQ0JrWVhSaE1pQThMU0IwYVdKaWJHVW9kSGx3WlNBOUlGd2lUazljSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUmxibk5wZEhsUVpYSkxZaUE5SUdSbGJuTnBkSGtwWEc0Z0lGeHVJQ0J2ZG1WeWJHRndYMk52ZFc1MGN5QThMU0JqYjNWdWRFOTJaWEpzWVhCektHRnVZMmh2Y2k1a2IzZHVMQ0J3WldGcktWeHVJQ0JoYm1Ob2IzSmZkMmxrZEdoeklEd3RJQ2gzYVdSMGFDaGhibU5vYjNJdVpHOTNiaWt0TVNrdk1UQXdNRnh1SUNCa1pXNXphWFI1SUR3dElHOTJaWEpzWVhCZlkyOTFiblJ6SUM4Z1lXNWphRzl5WDNkcFpIUm9jMXh1SUNCdFkyOXNjeWhoYm1Ob2IzSXVaRzkzYmlra1pHVnVjMmwwZVNBOExTQmtaVzV6YVhSNVhHNGdJR1JoZEdFeklEd3RJSFJwWW1Kc1pTaDBlWEJsSUQwZ1hDSkVUMWRPWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtaVzV6YVhSNVVHVnlTMklnUFNCa1pXNXphWFI1S1Z4dUlDQmNiaUFnWkdGMFlTQThMU0JpYVc1a1gzSnZkM01vWkdGMFlURXNJR1JoZEdFeUxDQmtZWFJoTXlsY2JpQWdYRzRnSUdkbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlIUjVjR1VzSUhrZ1BTQmtaVzV6YVhSNVVHVnlTMklwS1NBZ0t5Qm5aVzl0WDNacGIyeHBiaWdwSUNzZ1oyVnZiVjlpYjNod2JHOTBLRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU3dnZDJsa2RHZ2dQU0F3TGpFZ0tTQXJJSFJvWlcxbFgySjNLQ2tnS3lCblozUnBkR3hsS0c1dmRHVXBJQ3RjYmlBZ0lDQmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb01Dd2djWFZoYm5ScGJHVW9aR0YwWVNSemRXMVRZMjl5WlN3Z01DNDVLU2twWEc1OVhHNWNibU5oYkdOMWJHRjBaVkJsWVd0RVpXNXphWFI1S0hCbFlXc3VTRE5MTkcxbE15d2dYQ0pJTTBzMGJXVXpYQ0lwWEc1allXeGpkV3hoZEdWUVpXRnJSR1Z1YzJsMGVTaHdaV0ZyTGtnelN6STNZV01zSUZ3aVNETkxNamRoWTF3aUtWeHVZMkZzWTNWc1lYUmxVR1ZoYTBSbGJuTnBkSGtvY0dWaGF5NURWRU5HTENCY0lrTlVRMFpjSWlsY2JtTmhiR04xYkdGMFpWQmxZV3RFWlc1emFYUjVLSEJsWVdzdVVrRkVNakVzSUZ3aVVrRkVNakZjSWlsY2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG4jIFVQIGxvb3Bcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG4jIE5PIGxvb3Bcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3Iubm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpXG4jIERPV04gbG9vcFxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxuXG5cbnBlYWsuSDNLNG1lMyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjU1X0gzSzRtZTNfMDQtNzQ1X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbnBlYWsuSDNLMjdhYyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5uYXJyb3dQZWFrLmJlZFxcKSlcbnBlYWsuQ1RDRiA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbnBlYWsudGVtcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFYyID0gVjIgLSAxMDAwLFxuICAgICAgICAgICAgICAgIFYzID0gVjMgKyAxMDAwKVxuY29sbmFtZXMocGVhay50ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnBlYWsuUkFEMjEgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHBlYWsudGVtcClcblxuXG5jYWxjdWxhdGVQZWFrRGVuc2l0eSA8LSBmdW5jdGlvbihwZWFrLCBub3RlKXtcbiAgXG4gIG92ZXJsYXBfY291bnRzIDwtIGNvdW50T3ZlcmxhcHMoYW5jaG9yLnVwLCBwZWFrKVxuICBhbmNob3Jfd2lkdGhzIDwtICh3aWR0aChhbmNob3IudXApLTEpLzEwMDBcbiAgZGVuc2l0eSA8LSBvdmVybGFwX2NvdW50cyAvIGFuY2hvcl93aWR0aHNcbiAgZGF0YTEgPC0gdGliYmxlKHR5cGUgPSBcXFVQXFwsXG4gICAgICAgICAgICAgICAgICBkZW5zaXR5UGVyS2IgPSBkZW5zaXR5KVxuICBcbiAgb3ZlcmxhcF9jb3VudHMgPC0gY291bnRPdmVybGFwcyhhbmNob3Iubm8sIHBlYWspXG4gIGFuY2hvcl93aWR0aHMgPC0gKHdpZHRoKGFuY2hvci5ubyktMSkvMTAwMFxuICBkZW5zaXR5IDwtIG92ZXJsYXBfY291bnRzIC8gYW5jaG9yX3dpZHRoc1xuICBtY29scyhhbmNob3Iubm8pJGRlbnNpdHkgPC0gZGVuc2l0eVxuICBkYXRhMiA8LSB0aWJibGUodHlwZSA9IFxcTk9cXCxcbiAgICAgICAgICAgICAgICAgIGRlbnNpdHlQZXJLYiA9IGRlbnNpdHkpXG4gIFxuICBvdmVybGFwX2NvdW50cyA8LSBjb3VudE92ZXJsYXBzKGFuY2hvci5kb3duLCBwZWFrKVxuICBhbmNob3Jfd2lkdGhzIDwtICh3aWR0aChhbmNob3IuZG93biktMSkvMTAwMFxuICBkZW5zaXR5IDwtIG92ZXJsYXBfY291bnRzIC8gYW5jaG9yX3dpZHRoc1xuICBtY29scyhhbmNob3IuZG93bikkZGVuc2l0eSA8LSBkZW5zaXR5XG4gIGRhdGEzIDwtIHRpYmJsZSh0eXBlID0gXFxET1dOXFwsXG4gICAgICAgICAgICAgICAgICBkZW5zaXR5UGVyS2IgPSBkZW5zaXR5KVxuICBcbiAgZGF0YSA8LSBiaW5kX3Jvd3MoZGF0YTEsIGRhdGEyLCBkYXRhMylcbiAgXG4gIGdncGxvdChkYXRhLCBhZXMoeCA9IHR5cGUsIHkgPSBkZW5zaXR5UGVyS2IpKSAgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjEgKSArIHRoZW1lX2J3KCkgKyBnZ3RpdGxlKG5vdGUpICtcbiAgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC45KSkpXG59XG5cbmNhbGN1bGF0ZVBlYWtEZW5zaXR5KHBlYWsuSDNLNG1lMywgXFxIM0s0bWUzXFwpXG5jYWxjdWxhdGVQZWFrRGVuc2l0eShwZWFrLkgzSzI3YWMsIFxcSDNLMjdhY1xcKVxuY2FsY3VsYXRlUGVha0RlbnNpdHkocGVhay5DVENGLCBcXENUQ0ZcXClcbmNhbGN1bGF0ZVBlYWtEZW5zaXR5KHBlYWsuUkFEMjEsIFxcUkFEMjFcXClcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
name <- \chromo_cons_annoHierarchy\

# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))


peak.H3K4me3 <- importPeak(here(refDir, \33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.bed\))
peak.H3K27ac <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
peak.CTCF <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))
peak.temp <- fread(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\)) %>%
  dplyr::mutate(V2 = V2 - 1000,
                V3 = V3 + 1000)
colnames(peak.temp) <- c(\chr\, \start\, \end\)
peak.RAD21 <- makeGRangesFromDataFrame(peak.temp)


calculatePeakDensity <- function(peak, note){
  
  overlap_counts <- countOverlaps(anchor.up, peak)
  anchor_widths <- (width(anchor.up)-1)/1000
  density <- overlap_counts / anchor_widths
  data1 <- tibble(type = \UP\,
                  densityPerKb = density)
  
  overlap_counts <- countOverlaps(anchor.no, peak)
  anchor_widths <- (width(anchor.no)-1)/1000
  density <- overlap_counts / anchor_widths
  mcols(anchor.no)$density <- density
  data2 <- tibble(type = \NO\,
                  densityPerKb = density)
  
  overlap_counts <- countOverlaps(anchor.down, peak)
  anchor_widths <- (width(anchor.down)-1)/1000
  density <- overlap_counts / anchor_widths
  mcols(anchor.down)$density <- density
  data3 <- tibble(type = \DOWN\,
                  densityPerKb = density)
  
  data <- bind_rows(data1, data2, data3)
  
  ggplot(data, aes(x = type, y = densityPerKb))  + geom_violin() + geom_boxplot(outlier.shape = NA, width = 0.1 ) + theme_bw() + ggtitle(note) +
    coord_cartesian(ylim = c(0, quantile(data$sumScore, 0.9)))
}

calculatePeakDensity(peak.H3K4me3, \H3K4me3\)
calculatePeakDensity(peak.H3K27ac, \H3K27ac\)
calculatePeakDensity(peak.CTCF, \CTCF\)
calculatePeakDensity(peak.RAD21, \RAD21\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzRqSUZWUUlHeHZiM0JjYm14dmIzQXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlrVkVGSGRuTkVUVk5QWDFWUVgyUnBabVl3TGpJdVltVmtjR1ZjWENrcFhHNWhibU5vYjNJdWRYQWdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1MWNDa3BYRzRqSUU1UElHeHZiM0JjYm14dmIzQXVibThnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlrVkVGSGRuTkVUVk5QWDA1UFgyUnBabVl3TGpJdVltVmtjR1ZjWENrcFhHNWhibU5vYjNJdWJtOGdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1dWJ5a3BYRzRqSUVSUFYwNGdiRzl2Y0Z4dWJHOXZjQzVrYjNkdUlEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjR1V0Y0dWZlpGUkJSM1p6UkUxVFQxOUVUMWRPWDJScFptWXdMakl1WW1Wa2NHVmNYQ2twWEc1aGJtTm9iM0l1Wkc5M2JpQThMU0FvWlhoMGNtRmpkRUZ1WTJodmNpaHNiMjl3TG1SdmQyNHBLVnh1WEc1Y2JuQmxZV3N1U0ROTE5HMWxNeUE4TFNCcGJYQnZjblJRWldGcktHaGxjbVVvY21WbVJHbHlMQ0JjWERNek1qVTFYMGd6U3pSdFpUTmZNRFF0TnpRMVgwSnlkV05sTFRSZmNHVmhhM011YldWeVoyVlFaV0ZyTG1KbFpGeGNLU2xjYm5CbFlXc3VTRE5MTWpkaFl5QThMU0JwYlhCdmNuUlFaV0ZyS0dobGNtVW9jbVZtUkdseUxDQmNYRWRUVFRJME16ZzBOelpmUlVNdFJFY3RNelExT0MxSU0wc3lOMEZEWDBGVFdVNWZNUzV1WVhKeWIzZFFaV0ZyTG1KbFpGeGNLU2xjYm5CbFlXc3VRMVJEUmlBOExTQnBiWEJ2Y25SUVpXRnJLR2hsY21Vb2NtVm1SR2x5TENCY1hETXpNalE0WDBOVVEwWmZNRGN0TnpJNVgwSnlkV05sTFRSZmNHVmhhM011YldWeVoyVlFaV0ZyTG1KbFpGeGNLU2xjYm5CbFlXc3VkR1Z0Y0NBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnd6TXpJMU1GOVNRVVF5TVY5aFlqazVNbDlDY25WalpTMDBYM0JsWVd0ekxtMWxjbWRsVUdWaGF5NWlaV1JjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRll5SUQwZ1ZqSWdMU0F4TURBd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGWXpJRDBnVmpNZ0t5QXhNREF3S1Z4dVkyOXNibUZ0WlhNb2NHVmhheTUwWlcxd0tTQThMU0JqS0Z4Y1kyaHlYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWENsY2JuQmxZV3N1VWtGRU1qRWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLSEJsWVdzdWRHVnRjQ2xjYmx4dVhHNWpZV3hqZFd4aGRHVlFaV0ZyUkdWdWMybDBlU0E4TFNCbWRXNWpkR2x2Ymlod1pXRnJMQ0J1YjNSbEtYdGNiaUFnWEc0Z0lHOTJaWEpzWVhCZlkyOTFiblJ6SUR3dElHTnZkVzUwVDNabGNteGhjSE1vWVc1amFHOXlMblZ3TENCd1pXRnJLVnh1SUNCaGJtTm9iM0pmZDJsa2RHaHpJRHd0SUNoM2FXUjBhQ2hoYm1Ob2IzSXVkWEFwTFRFcEx6RXdNREJjYmlBZ1pHVnVjMmwwZVNBOExTQnZkbVZ5YkdGd1gyTnZkVzUwY3lBdklHRnVZMmh2Y2w5M2FXUjBhSE5jYmlBZ1pHRjBZVEVnUEMwZ2RHbGlZbXhsS0hSNWNHVWdQU0JjWEZWUVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrWlc1emFYUjVVR1Z5UzJJZ1BTQmtaVzV6YVhSNUtWeHVJQ0JjYmlBZ2IzWmxjbXhoY0Y5amIzVnVkSE1nUEMwZ1kyOTFiblJQZG1WeWJHRndjeWhoYm1Ob2IzSXVibThzSUhCbFlXc3BYRzRnSUdGdVkyaHZjbDkzYVdSMGFITWdQQzBnS0hkcFpIUm9LR0Z1WTJodmNpNXVieWt0TVNrdk1UQXdNRnh1SUNCa1pXNXphWFI1SUR3dElHOTJaWEpzWVhCZlkyOTFiblJ6SUM4Z1lXNWphRzl5WDNkcFpIUm9jMXh1SUNCdFkyOXNjeWhoYm1Ob2IzSXVibThwSkdSbGJuTnBkSGtnUEMwZ1pHVnVjMmwwZVZ4dUlDQmtZWFJoTWlBOExTQjBhV0ppYkdVb2RIbHdaU0E5SUZ4Y1RrOWNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdSbGJuTnBkSGxRWlhKTFlpQTlJR1JsYm5OcGRIa3BYRzRnSUZ4dUlDQnZkbVZ5YkdGd1gyTnZkVzUwY3lBOExTQmpiM1Z1ZEU5MlpYSnNZWEJ6S0dGdVkyaHZjaTVrYjNkdUxDQndaV0ZyS1Z4dUlDQmhibU5vYjNKZmQybGtkR2h6SUR3dElDaDNhV1IwYUNoaGJtTm9iM0l1Wkc5M2Jpa3RNU2t2TVRBd01GeHVJQ0JrWlc1emFYUjVJRHd0SUc5MlpYSnNZWEJmWTI5MWJuUnpJQzhnWVc1amFHOXlYM2RwWkhSb2MxeHVJQ0J0WTI5c2N5aGhibU5vYjNJdVpHOTNiaWtrWkdWdWMybDBlU0E4TFNCa1pXNXphWFI1WEc0Z0lHUmhkR0V6SUR3dElIUnBZbUpzWlNoMGVYQmxJRDBnWEZ4RVQxZE9YRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1pXNXphWFI1VUdWeVMySWdQU0JrWlc1emFYUjVLVnh1SUNCY2JpQWdaR0YwWVNBOExTQmlhVzVrWDNKdmQzTW9aR0YwWVRFc0lHUmhkR0V5TENCa1lYUmhNeWxjYmlBZ1hHNGdJR2RuY0d4dmRDaGtZWFJoTENCaFpYTW9lQ0E5SUhSNWNHVXNJSGtnUFNCa1pXNXphWFI1VUdWeVMySXBLU0FnS3lCblpXOXRYM1pwYjJ4cGJpZ3BJQ3NnWjJWdmJWOWliM2h3Ykc5MEtHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTd2dkMmxrZEdnZ1BTQXdMakVnS1NBcklIUm9aVzFsWDJKM0tDa2dLeUJuWjNScGRHeGxLRzV2ZEdVcElDdGNiaUFnSUNCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTUN3Z2NYVmhiblJwYkdVb1pHRjBZU1J6ZFcxVFkyOXlaU3dnTUM0NUtTa3BYRzU5WEc1Y2JtTmhiR04xYkdGMFpWQmxZV3RFWlc1emFYUjVLSEJsWVdzdVNETkxORzFsTXl3Z1hGeElNMHMwYldVelhGd3BYRzVqWVd4amRXeGhkR1ZRWldGclJHVnVjMmwwZVNod1pXRnJMa2d6U3pJM1lXTXNJRnhjU0ROTE1qZGhZMXhjS1Z4dVkyRnNZM1ZzWVhSbFVHVmhhMFJsYm5OcGRIa29jR1ZoYXk1RFZFTkdMQ0JjWEVOVVEwWmNYQ2xjYm1OaGJHTjFiR0YwWlZCbFlXdEVaVzV6YVhSNUtIQmxZV3N1VWtGRU1qRXNJRnhjVWtGRU1qRmNYQ2xjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuIyBVUCBsb29wXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKVxuIyBOTyBsb29wXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxuIyBET1dOIGxvb3Bcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSlcblxuXG5wZWFrLkgzSzRtZTMgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG5wZWFrLkgzSzI3YWMgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWRcXCkpXG5wZWFrLkNUQ0YgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG5wZWFrLnRlbXAgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShWMiA9IFYyIC0gMTAwMCxcbiAgICAgICAgICAgICAgICBWMyA9IFYzICsgMTAwMClcbmNvbG5hbWVzKHBlYWsudGVtcCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5wZWFrLlJBRDIxIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShwZWFrLnRlbXApXG5cblxuY2FsY3VsYXRlUGVha0RlbnNpdHkgPC0gZnVuY3Rpb24ocGVhaywgbm90ZSl7XG4gIFxuICBvdmVybGFwX2NvdW50cyA8LSBjb3VudE92ZXJsYXBzKGFuY2hvci51cCwgcGVhaylcbiAgYW5jaG9yX3dpZHRocyA8LSAod2lkdGgoYW5jaG9yLnVwKS0xKS8xMDAwXG4gIGRlbnNpdHkgPC0gb3ZlcmxhcF9jb3VudHMgLyBhbmNob3Jfd2lkdGhzXG4gIGRhdGExIDwtIHRpYmJsZSh0eXBlID0gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgZGVuc2l0eVBlcktiID0gZGVuc2l0eSlcbiAgXG4gIG92ZXJsYXBfY291bnRzIDwtIGNvdW50T3ZlcmxhcHMoYW5jaG9yLm5vLCBwZWFrKVxuICBhbmNob3Jfd2lkdGhzIDwtICh3aWR0aChhbmNob3Iubm8pLTEpLzEwMDBcbiAgZGVuc2l0eSA8LSBvdmVybGFwX2NvdW50cyAvIGFuY2hvcl93aWR0aHNcbiAgbWNvbHMoYW5jaG9yLm5vKSRkZW5zaXR5IDwtIGRlbnNpdHlcbiAgZGF0YTIgPC0gdGliYmxlKHR5cGUgPSBcXE5PXFwsXG4gICAgICAgICAgICAgICAgICBkZW5zaXR5UGVyS2IgPSBkZW5zaXR5KVxuICBcbiAgb3ZlcmxhcF9jb3VudHMgPC0gY291bnRPdmVybGFwcyhhbmNob3IuZG93biwgcGVhaylcbiAgYW5jaG9yX3dpZHRocyA8LSAod2lkdGgoYW5jaG9yLmRvd24pLTEpLzEwMDBcbiAgZGVuc2l0eSA8LSBvdmVybGFwX2NvdW50cyAvIGFuY2hvcl93aWR0aHNcbiAgbWNvbHMoYW5jaG9yLmRvd24pJGRlbnNpdHkgPC0gZGVuc2l0eVxuICBkYXRhMyA8LSB0aWJibGUodHlwZSA9IFxcRE9XTlxcLFxuICAgICAgICAgICAgICAgICAgZGVuc2l0eVBlcktiID0gZGVuc2l0eSlcbiAgXG4gIGRhdGEgPC0gYmluZF9yb3dzKGRhdGExLCBkYXRhMiwgZGF0YTMpXG4gIFxuICBnZ3Bsb3QoZGF0YSwgYWVzKHggPSB0eXBlLCB5ID0gZGVuc2l0eVBlcktiKSkgICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4xICkgKyB0aGVtZV9idygpICsgZ2d0aXRsZShub3RlKSArXG4gICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIHF1YW50aWxlKGRhdGEkc3VtU2NvcmUsIDAuOSkpKVxufVxuXG5jYWxjdWxhdGVQZWFrRGVuc2l0eShwZWFrLkgzSzRtZTMsIFxcSDNLNG1lM1xcKVxuY2FsY3VsYXRlUGVha0RlbnNpdHkocGVhay5IM0syN2FjLCBcXEgzSzI3YWNcXClcbmNhbGN1bGF0ZVBlYWtEZW5zaXR5KHBlYWsuQ1RDRiwgXFxDVENGXFwpXG5jYWxjdWxhdGVQZWFrRGVuc2l0eShwZWFrLlJBRDIxLCBcXFJBRDIxXFwpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG4jIFVQIGxvb3Bcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG4jIE5PIGxvb3Bcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3Iubm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpXG4jIERPV04gbG9vcFxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxuXG5cbnBlYWsuSDNLNG1lMyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjU1X0gzSzRtZTNfMDQtNzQ1X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbnBlYWsuSDNLMjdhYyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5uYXJyb3dQZWFrLmJlZFxcKSlcbnBlYWsuQ1RDRiA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbnBlYWsudGVtcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFYyID0gVjIgLSAxMDAwLFxuICAgICAgICAgICAgICAgIFYzID0gVjMgKyAxMDAwKVxuY29sbmFtZXMocGVhay50ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnBlYWsuUkFEMjEgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHBlYWsudGVtcClcblxuXG5jYWxjdWxhdGVQZWFrRGVuc2l0eSA8LSBmdW5jdGlvbihwZWFrLCBub3RlKXtcbiAgXG4gIG92ZXJsYXBfY291bnRzIDwtIGNvdW50T3ZlcmxhcHMoYW5jaG9yLnVwLCBwZWFrKVxuICBhbmNob3Jfd2lkdGhzIDwtICh3aWR0aChhbmNob3IudXApLTEpLzEwMDBcbiAgZGVuc2l0eSA8LSBvdmVybGFwX2NvdW50cyAvIGFuY2hvcl93aWR0aHNcbiAgZGF0YTEgPC0gdGliYmxlKHR5cGUgPSBcXFVQXFwsXG4gICAgICAgICAgICAgICAgICBkZW5zaXR5UGVyS2IgPSBkZW5zaXR5KVxuICBcbiAgb3ZlcmxhcF9jb3VudHMgPC0gY291bnRPdmVybGFwcyhhbmNob3Iubm8sIHBlYWspXG4gIGFuY2hvcl93aWR0aHMgPC0gKHdpZHRoKGFuY2hvci5ubyktMSkvMTAwMFxuICBkZW5zaXR5IDwtIG92ZXJsYXBfY291bnRzIC8gYW5jaG9yX3dpZHRoc1xuICBtY29scyhhbmNob3Iubm8pJGRlbnNpdHkgPC0gZGVuc2l0eVxuICBkYXRhMiA8LSB0aWJibGUodHlwZSA9IFxcTk9cXCxcbiAgICAgICAgICAgICAgICAgIGRlbnNpdHlQZXJLYiA9IGRlbnNpdHkpXG4gIFxuICBvdmVybGFwX2NvdW50cyA8LSBjb3VudE92ZXJsYXBzKGFuY2hvci5kb3duLCBwZWFrKVxuICBhbmNob3Jfd2lkdGhzIDwtICh3aWR0aChhbmNob3IuZG93biktMSkvMTAwMFxuICBkZW5zaXR5IDwtIG92ZXJsYXBfY291bnRzIC8gYW5jaG9yX3dpZHRoc1xuICBtY29scyhhbmNob3IuZG93bikkZGVuc2l0eSA8LSBkZW5zaXR5XG4gIGRhdGEzIDwtIHRpYmJsZSh0eXBlID0gXFxET1dOXFwsXG4gICAgICAgICAgICAgICAgICBkZW5zaXR5UGVyS2IgPSBkZW5zaXR5KVxuICBcbiAgZGF0YSA8LSBiaW5kX3Jvd3MoZGF0YTEsIGRhdGEyLCBkYXRhMylcbiAgXG4gIGdncGxvdChkYXRhLCBhZXMoeCA9IHR5cGUsIHkgPSBkZW5zaXR5UGVyS2IpKSAgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjEgKSArIHRoZW1lX2J3KCkgKyBnZ3RpdGxlKG5vdGUpICtcbiAgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC45KSkpXG59XG5cbmNhbGN1bGF0ZVBlYWtEZW5zaXR5KHBlYWsuSDNLNG1lMywgXFxIM0s0bWUzXFwpXG5jYWxjdWxhdGVQZWFrRGVuc2l0eShwZWFrLkgzSzI3YWMsIFxcSDNLMjdhY1xcKVxuY2FsY3VsYXRlUGVha0RlbnNpdHkocGVhay5DVENGLCBcXENUQ0ZcXClcbmNhbGN1bGF0ZVBlYWtEZW5zaXR5KHBlYWsuUkFEMjEsIFxcUkFEMjFcXClcblxuYGBgXG5gYGAifQ== -->

```r
```r
name <- \chromo_cons_annoHierarchy\

# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))


peak.H3K4me3 <- importPeak(here(refDir, \33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.bed\))
peak.H3K27ac <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
peak.CTCF <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))
peak.temp <- fread(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\)) %>%
  dplyr::mutate(V2 = V2 - 1000,
                V3 = V3 + 1000)
colnames(peak.temp) <- c(\chr\, \start\, \end\)
peak.RAD21 <- makeGRangesFromDataFrame(peak.temp)


calculatePeakDensity <- function(peak, note){
  
  overlap_counts <- countOverlaps(anchor.up, peak)
  anchor_widths <- (width(anchor.up)-1)/1000
  density <- overlap_counts / anchor_widths
  data1 <- tibble(type = \UP\,
                  densityPerKb = density)
  
  overlap_counts <- countOverlaps(anchor.no, peak)
  anchor_widths <- (width(anchor.no)-1)/1000
  density <- overlap_counts / anchor_widths
  mcols(anchor.no)$density <- density
  data2 <- tibble(type = \NO\,
                  densityPerKb = density)
  
  overlap_counts <- countOverlaps(anchor.down, peak)
  anchor_widths <- (width(anchor.down)-1)/1000
  density <- overlap_counts / anchor_widths
  mcols(anchor.down)$density <- density
  data3 <- tibble(type = \DOWN\,
                  densityPerKb = density)
  
  data <- bind_rows(data1, data2, data3)
  
  ggplot(data, aes(x = type, y = densityPerKb))  + geom_violin() + geom_boxplot(outlier.shape = NA, width = 0.1 ) + theme_bw() + ggtitle(note) +
    coord_cartesian(ylim = c(0, quantile(data$sumScore, 0.9)))
}

calculatePeakDensity(peak.H3K4me3, \H3K4me3\)
calculatePeakDensity(peak.H3K27ac, \H3K27ac\)
calculatePeakDensity(peak.CTCF, \CTCF\)
calculatePeakDensity(peak.RAD21, \RAD21\)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### A485

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1Ykc5dmNDQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbExtSmxaSEJsWENJcEtWeHVZVzVqYUc5eUlEd3RJR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQ2xjYmx4dUl5TWpJRmRvZVhSbFhHNXVJRHd0SUd4bGJtZDBhQ2gxYm1seGRXVW9jM1ZpYW1WamRFaHBkSE1vWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2l3Z2NHVmhheTVYYUhsMFpTNVRSU2twS1NsY2JuUnZkR0ZzSUR3dElHeGxibWQwYUNod1pXRnJMbGRvZVhSbExsTkZLVnh1WTI5MWJuUnpJRHd0SUdNb2Jpd2dkRzkwWVd3Z0xTQnVLVnh1YkdGaVpXeHpJRHd0SUhCaGMzUmxLR01vWENKamIzWmxjbVZrWENJc0lGd2lUazlVSUdOdmRtVnlaV1JjSWlrc0lHTnZkVzUwY3lsY2JuQnBaU2hqYjNWdWRITXNJR3hoWW1Wc2N5QTlJR3hoWW1Wc2N5d2dJRzFoYVc0Z1BTQndZWE4wWlRBb1hDSlhhSGwwWlNCVFJTQmpiM1psY21GblpTQmNYRzVjSWl3Z2RHOTBZV3dwTENCamIyd2dQU0JqS0Z3aVozSmxlVndpTENCY0luZG9hWFJsWENJcEtWeHVYRzVtYVd4bFRtRnRaU0E4TFNCb1pYSmxLR1pwWjBScGNpd2dYQ0p3YVdWZlUwVmZWMmg1ZEdWY0lpbGNibmRwWkhSb0lEd3RJSEJoYm1Wc1UybDZaU2cwS1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZzBLU3B0YlZSdlNXNWphRnh1SXlCemRtZHNhWFJsS0hCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwTENCM2FXUjBhQ0E5SUhkcFpIUm9MQ0JvWldsbmFIUWdQV2hsYVdkb2RDbGNiaU1nY0dsbEtHTnZkVzUwY3l3Z2JHRmlaV3h6SUQwZ2JHRmlaV3h6TENBZ2JXRnBiaUE5SUhCaGMzUmxNQ2hjSWxkb2VYUmxJRk5GSUdOdmRtVnlZV2RsSUZ4Y2Jsd2lMQ0IwYjNSaGJDa3NJR052YkNBOUlHTW9YQ0puY21WNVhDSXNJRndpZDJocGRHVmNJaWtzWEc0aklDQWdJQ0JqWlhnZ1BTQXhMQ0JqWlhndWJXRnBiaUE5SURFcFhHNGpJR1JsZGk1dlptWW9LVnh1WEc1Y2JseHVJeU1qSUVSNWJHRnVYRzV1SUR3dElHeGxibWQwYUNoMWJtbHhkV1VvYzNWaWFtVmpkRWhwZEhNb1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpd2djR1ZoYXk1RWVXeGhiaTVUUlNrcEtTbGNiblJ2ZEdGc0lEd3RJR3hsYm1kMGFDaHdaV0ZyTGtSNWJHRnVMbE5GS1Z4dVkyOTFiblJ6SUR3dElHTW9iaXdnZEc5MFlXd2dMU0J1S1Z4dWJHRmlaV3h6SUR3dElIQmhjM1JsS0dNb1hDSmpiM1psY21Wa1hDSXNJRndpVGs5VUlHTnZkbVZ5WldSY0lpa3NJR052ZFc1MGN5bGNibkJwWlNoamIzVnVkSE1zSUd4aFltVnNjeUE5SUd4aFltVnNjeXdnYldGcGJpQTlJSEJoYzNSbE1DaGNJa1I1YkdGdUlGTkZJR052ZG1WeVlXZGxJRnhjYmx3aUxDQjBiM1JoYkNrc0lHTnZiQ0E5SUdNb1hDSm5jbVY1WENJc0lGd2lkMmhwZEdWY0lpa3BYRzVjYm1acGJHVk9ZVzFsSUR3dElHaGxjbVVvWm1sblJHbHlMQ0JjSW5CcFpWOVRSVjlOZFhKd2FIbGNJaWxjYm5kcFpIUm9JRHd0SUhCaGJtVnNVMmw2WlNnMEtTcHRiVlJ2U1c1amFGeHVhR1ZwWjJoMElEd3RJSEJoYm1Wc1UybDZaU2cwS1NwdGJWUnZTVzVqYUZ4dUl5QnpkbWRzYVhSbEtIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcExDQjNhV1IwYUNBOUlIZHBaSFJvTENCb1pXbG5hSFFnUFdobGFXZG9kQ2xjYmlNZ2NHbGxLR052ZFc1MGN5d2diR0ZpWld4eklEMGdiR0ZpWld4ekxDQnRZV2x1SUQwZ2NHRnpkR1V3S0Z3aVRYVnljR2g1SUZORklHTnZkbVZ5WVdkbElGeGNibHdpTENCMGIzUmhiQ2tzSUdOdmJDQTlJR01vWENKbmNtVjVYQ0lzSUZ3aWQyaHBkR1ZjSWlrcFhHNGpJRnh1SXlCa1pYWXViMlptS0NsY2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxubG9vcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlXFwpKVxuYW5jaG9yIDwtIGV4dHJhY3RBbmNob3IobG9vcClcblxuIyMjIFdoeXRlXG5uIDwtIGxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMoZmluZE92ZXJsYXBzKGFuY2hvciwgcGVhay5XaHl0ZS5TRSkpKSlcbnRvdGFsIDwtIGxlbmd0aChwZWFrLldoeXRlLlNFKVxuY291bnRzIDwtIGMobiwgdG90YWwgLSBuKVxubGFiZWxzIDwtIHBhc3RlKGMoXFxjb3ZlcmVkXFwsIFxcTk9UIGNvdmVyZWRcXCksIGNvdW50cylcbnBpZShjb3VudHMsIGxhYmVscyA9IGxhYmVscywgIG1haW4gPSBwYXN0ZTAoXFxXaHl0ZSBTRSBjb3ZlcmFnZSBcXG5cXCwgdG90YWwpLCBjb2wgPSBjKFxcZ3JleVxcLCBcXHdoaXRlXFwpKVxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFxwaWVfU0VfV2h5dGVcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSg0KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSg0KSptbVRvSW5jaFxuIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPWhlaWdodClcbiMgcGllKGNvdW50cywgbGFiZWxzID0gbGFiZWxzLCAgbWFpbiA9IHBhc3RlMChcXFdoeXRlIFNFIGNvdmVyYWdlIFxcblxcLCB0b3RhbCksIGNvbCA9IGMoXFxncmV5XFwsIFxcd2hpdGVcXCksXG4jICAgICBjZXggPSAxLCBjZXgubWFpbiA9IDEpXG4jIGRldi5vZmYoKVxuXG5cblxuIyMjIER5bGFuXG5uIDwtIGxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMoZmluZE92ZXJsYXBzKGFuY2hvciwgcGVhay5EeWxhbi5TRSkpKSlcbnRvdGFsIDwtIGxlbmd0aChwZWFrLkR5bGFuLlNFKVxuY291bnRzIDwtIGMobiwgdG90YWwgLSBuKVxubGFiZWxzIDwtIHBhc3RlKGMoXFxjb3ZlcmVkXFwsIFxcTk9UIGNvdmVyZWRcXCksIGNvdW50cylcbnBpZShjb3VudHMsIGxhYmVscyA9IGxhYmVscywgbWFpbiA9IHBhc3RlMChcXER5bGFuIFNFIGNvdmVyYWdlIFxcblxcLCB0b3RhbCksIGNvbCA9IGMoXFxncmV5XFwsIFxcd2hpdGVcXCkpXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXHBpZV9TRV9NdXJwaHlcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSg0KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSg0KSptbVRvSW5jaFxuIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPWhlaWdodClcbiMgcGllKGNvdW50cywgbGFiZWxzID0gbGFiZWxzLCBtYWluID0gcGFzdGUwKFxcTXVycGh5IFNFIGNvdmVyYWdlIFxcblxcLCB0b3RhbCksIGNvbCA9IGMoXFxncmV5XFwsIFxcd2hpdGVcXCkpXG4jIFxuIyBkZXYub2ZmKClcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
name <- \chromo_cons_annoHierarchy\
loop <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\))
anchor <- extractAnchor(loop)

### Whyte
n <- length(unique(subjectHits(findOverlaps(anchor, peak.Whyte.SE))))
total <- length(peak.Whyte.SE)
counts <- c(n, total - n)
labels <- paste(c(\covered\, \NOT covered\), counts)
pie(counts, labels = labels,  main = paste0(\Whyte SE coverage \n\, total), col = c(\grey\, \white\))

fileName <- here(figDir, \pie_SE_Whyte\)
width <- panelSize(4)*mmToInch
height <- panelSize(4)*mmToInch
# svglite(paste0(fileName, \.svg\), width = width, height =height)
# pie(counts, labels = labels,  main = paste0(\Whyte SE coverage \n\, total), col = c(\grey\, \white\),
#     cex = 1, cex.main = 1)
# dev.off()



### Dylan
n <- length(unique(subjectHits(findOverlaps(anchor, peak.Dylan.SE))))
total <- length(peak.Dylan.SE)
counts <- c(n, total - n)
labels <- paste(c(\covered\, \NOT covered\), counts)
pie(counts, labels = labels, main = paste0(\Dylan SE coverage \n\, total), col = c(\grey\, \white\))

fileName <- here(figDir, \pie_SE_Murphy\)
width <- panelSize(4)*mmToInch
height <- panelSize(4)*mmToInch
# svglite(paste0(fileName, \.svg\), width = width, height =height)
# pie(counts, labels = labels, main = paste0(\Murphy SE coverage \n\, total), col = c(\grey\, \white\))
# 
# dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHViRzl2Y0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsTG1KbFpIQmxYRndwS1Z4dVlXNWphRzl5SUR3dElHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDbGNibHh1SXlNaklGZG9lWFJsWEc1dUlEd3RJR3hsYm1kMGFDaDFibWx4ZFdVb2MzVmlhbVZqZEVocGRITW9abWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjaXdnY0dWaGF5NVhhSGwwWlM1VFJTa3BLU2xjYm5SdmRHRnNJRHd0SUd4bGJtZDBhQ2h3WldGckxsZG9lWFJsTGxORktWeHVZMjkxYm5SeklEd3RJR01vYml3Z2RHOTBZV3dnTFNCdUtWeHViR0ZpWld4eklEd3RJSEJoYzNSbEtHTW9YRnhqYjNabGNtVmtYRndzSUZ4Y1RrOVVJR052ZG1WeVpXUmNYQ2tzSUdOdmRXNTBjeWxjYm5CcFpTaGpiM1Z1ZEhNc0lHeGhZbVZzY3lBOUlHeGhZbVZzY3l3Z0lHMWhhVzRnUFNCd1lYTjBaVEFvWEZ4WGFIbDBaU0JUUlNCamIzWmxjbUZuWlNCY1hHNWNYQ3dnZEc5MFlXd3BMQ0JqYjJ3Z1BTQmpLRnhjWjNKbGVWeGNMQ0JjWEhkb2FYUmxYRndwS1Z4dVhHNW1hV3hsVG1GdFpTQThMU0JvWlhKbEtHWnBaMFJwY2l3Z1hGeHdhV1ZmVTBWZlYyaDVkR1ZjWENsY2JuZHBaSFJvSUR3dElIQmhibVZzVTJsNlpTZzBLU3B0YlZSdlNXNWphRnh1YUdWcFoyaDBJRHd0SUhCaGJtVnNVMmw2WlNnMEtTcHRiVlJ2U1c1amFGeHVJeUJ6ZG1kc2FYUmxLSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BMQ0IzYVdSMGFDQTlJSGRwWkhSb0xDQm9aV2xuYUhRZ1BXaGxhV2RvZENsY2JpTWdjR2xsS0dOdmRXNTBjeXdnYkdGaVpXeHpJRDBnYkdGaVpXeHpMQ0FnYldGcGJpQTlJSEJoYzNSbE1DaGNYRmRvZVhSbElGTkZJR052ZG1WeVlXZGxJRnhjYmx4Y0xDQjBiM1JoYkNrc0lHTnZiQ0E5SUdNb1hGeG5jbVY1WEZ3c0lGeGNkMmhwZEdWY1hDa3NYRzRqSUNBZ0lDQmpaWGdnUFNBeExDQmpaWGd1YldGcGJpQTlJREVwWEc0aklHUmxkaTV2Wm1Zb0tWeHVYRzVjYmx4dUl5TWpJRVI1YkdGdVhHNXVJRHd0SUd4bGJtZDBhQ2gxYm1seGRXVW9jM1ZpYW1WamRFaHBkSE1vWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2l3Z2NHVmhheTVFZVd4aGJpNVRSU2twS1NsY2JuUnZkR0ZzSUR3dElHeGxibWQwYUNod1pXRnJMa1I1YkdGdUxsTkZLVnh1WTI5MWJuUnpJRHd0SUdNb2Jpd2dkRzkwWVd3Z0xTQnVLVnh1YkdGaVpXeHpJRHd0SUhCaGMzUmxLR01vWEZ4amIzWmxjbVZrWEZ3c0lGeGNUazlVSUdOdmRtVnlaV1JjWENrc0lHTnZkVzUwY3lsY2JuQnBaU2hqYjNWdWRITXNJR3hoWW1Wc2N5QTlJR3hoWW1Wc2N5d2diV0ZwYmlBOUlIQmhjM1JsTUNoY1hFUjViR0Z1SUZORklHTnZkbVZ5WVdkbElGeGNibHhjTENCMGIzUmhiQ2tzSUdOdmJDQTlJR01vWEZ4bmNtVjVYRndzSUZ4Y2QyaHBkR1ZjWENrcFhHNWNibVpwYkdWT1lXMWxJRHd0SUdobGNtVW9abWxuUkdseUxDQmNYSEJwWlY5VFJWOU5kWEp3YUhsY1hDbGNibmRwWkhSb0lEd3RJSEJoYm1Wc1UybDZaU2cwS1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZzBLU3B0YlZSdlNXNWphRnh1SXlCemRtZHNhWFJsS0hCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwTENCM2FXUjBhQ0E5SUhkcFpIUm9MQ0JvWldsbmFIUWdQV2hsYVdkb2RDbGNiaU1nY0dsbEtHTnZkVzUwY3l3Z2JHRmlaV3h6SUQwZ2JHRmlaV3h6TENCdFlXbHVJRDBnY0dGemRHVXdLRnhjVFhWeWNHaDVJRk5GSUdOdmRtVnlZV2RsSUZ4Y2JseGNMQ0IwYjNSaGJDa3NJR052YkNBOUlHTW9YRnhuY21WNVhGd3NJRnhjZDJocGRHVmNYQ2twWEc0aklGeHVJeUJrWlhZdWIyWm1LQ2xjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmxvb3AgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZS5iZWRwZVxcKSlcbmFuY2hvciA8LSBleHRyYWN0QW5jaG9yKGxvb3ApXG5cbiMjIyBXaHl0ZVxubiA8LSBsZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IsIHBlYWsuV2h5dGUuU0UpKSkpXG50b3RhbCA8LSBsZW5ndGgocGVhay5XaHl0ZS5TRSlcbmNvdW50cyA8LSBjKG4sIHRvdGFsIC0gbilcbmxhYmVscyA8LSBwYXN0ZShjKFxcY292ZXJlZFxcLCBcXE5PVCBjb3ZlcmVkXFwpLCBjb3VudHMpXG5waWUoY291bnRzLCBsYWJlbHMgPSBsYWJlbHMsICBtYWluID0gcGFzdGUwKFxcV2h5dGUgU0UgY292ZXJhZ2UgXFxuXFwsIHRvdGFsKSwgY29sID0gYyhcXGdyZXlcXCwgXFx3aGl0ZVxcKSlcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxccGllX1NFX1doeXRlXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoNCkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoNCkqbW1Ub0luY2hcbiMgc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID1oZWlnaHQpXG4jIHBpZShjb3VudHMsIGxhYmVscyA9IGxhYmVscywgIG1haW4gPSBwYXN0ZTAoXFxXaHl0ZSBTRSBjb3ZlcmFnZSBcXG5cXCwgdG90YWwpLCBjb2wgPSBjKFxcZ3JleVxcLCBcXHdoaXRlXFwpLFxuIyAgICAgY2V4ID0gMSwgY2V4Lm1haW4gPSAxKVxuIyBkZXYub2ZmKClcblxuXG5cbiMjIyBEeWxhblxubiA8LSBsZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IsIHBlYWsuRHlsYW4uU0UpKSkpXG50b3RhbCA8LSBsZW5ndGgocGVhay5EeWxhbi5TRSlcbmNvdW50cyA8LSBjKG4sIHRvdGFsIC0gbilcbmxhYmVscyA8LSBwYXN0ZShjKFxcY292ZXJlZFxcLCBcXE5PVCBjb3ZlcmVkXFwpLCBjb3VudHMpXG5waWUoY291bnRzLCBsYWJlbHMgPSBsYWJlbHMsIG1haW4gPSBwYXN0ZTAoXFxEeWxhbiBTRSBjb3ZlcmFnZSBcXG5cXCwgdG90YWwpLCBjb2wgPSBjKFxcZ3JleVxcLCBcXHdoaXRlXFwpKVxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFxwaWVfU0VfTXVycGh5XFwpXG53aWR0aCA8LSBwYW5lbFNpemUoNCkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoNCkqbW1Ub0luY2hcbiMgc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID1oZWlnaHQpXG4jIHBpZShjb3VudHMsIGxhYmVscyA9IGxhYmVscywgbWFpbiA9IHBhc3RlMChcXE11cnBoeSBTRSBjb3ZlcmFnZSBcXG5cXCwgdG90YWwpLCBjb2wgPSBjKFxcZ3JleVxcLCBcXHdoaXRlXFwpKVxuIyBcbiMgZGV2Lm9mZigpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxubG9vcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlXFwpKVxuYW5jaG9yIDwtIGV4dHJhY3RBbmNob3IobG9vcClcblxuIyMjIFdoeXRlXG5uIDwtIGxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMoZmluZE92ZXJsYXBzKGFuY2hvciwgcGVhay5XaHl0ZS5TRSkpKSlcbnRvdGFsIDwtIGxlbmd0aChwZWFrLldoeXRlLlNFKVxuY291bnRzIDwtIGMobiwgdG90YWwgLSBuKVxubGFiZWxzIDwtIHBhc3RlKGMoXFxjb3ZlcmVkXFwsIFxcTk9UIGNvdmVyZWRcXCksIGNvdW50cylcbnBpZShjb3VudHMsIGxhYmVscyA9IGxhYmVscywgIG1haW4gPSBwYXN0ZTAoXFxXaHl0ZSBTRSBjb3ZlcmFnZSBcXG5cXCwgdG90YWwpLCBjb2wgPSBjKFxcZ3JleVxcLCBcXHdoaXRlXFwpKVxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFxwaWVfU0VfV2h5dGVcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSg0KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSg0KSptbVRvSW5jaFxuIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPWhlaWdodClcbiMgcGllKGNvdW50cywgbGFiZWxzID0gbGFiZWxzLCAgbWFpbiA9IHBhc3RlMChcXFdoeXRlIFNFIGNvdmVyYWdlIFxcblxcLCB0b3RhbCksIGNvbCA9IGMoXFxncmV5XFwsIFxcd2hpdGVcXCksXG4jICAgICBjZXggPSAxLCBjZXgubWFpbiA9IDEpXG4jIGRldi5vZmYoKVxuXG5cblxuIyMjIER5bGFuXG5uIDwtIGxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMoZmluZE92ZXJsYXBzKGFuY2hvciwgcGVhay5EeWxhbi5TRSkpKSlcbnRvdGFsIDwtIGxlbmd0aChwZWFrLkR5bGFuLlNFKVxuY291bnRzIDwtIGMobiwgdG90YWwgLSBuKVxubGFiZWxzIDwtIHBhc3RlKGMoXFxjb3ZlcmVkXFwsIFxcTk9UIGNvdmVyZWRcXCksIGNvdW50cylcbnBpZShjb3VudHMsIGxhYmVscyA9IGxhYmVscywgbWFpbiA9IHBhc3RlMChcXER5bGFuIFNFIGNvdmVyYWdlIFxcblxcLCB0b3RhbCksIGNvbCA9IGMoXFxncmV5XFwsIFxcd2hpdGVcXCkpXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXHBpZV9TRV9NdXJwaHlcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSg0KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSg0KSptbVRvSW5jaFxuIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPWhlaWdodClcbiMgcGllKGNvdW50cywgbGFiZWxzID0gbGFiZWxzLCBtYWluID0gcGFzdGUwKFxcTXVycGh5IFNFIGNvdmVyYWdlIFxcblxcLCB0b3RhbCksIGNvbCA9IGMoXFxncmV5XFwsIFxcd2hpdGVcXCkpXG4jIFxuIyBkZXYub2ZmKClcblxuYGBgXG5gYGAifQ== -->

```r
```r
name <- \chromo_cons_annoHierarchy\
loop <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\))
anchor <- extractAnchor(loop)

### Whyte
n <- length(unique(subjectHits(findOverlaps(anchor, peak.Whyte.SE))))
total <- length(peak.Whyte.SE)
counts <- c(n, total - n)
labels <- paste(c(\covered\, \NOT covered\), counts)
pie(counts, labels = labels,  main = paste0(\Whyte SE coverage \n\, total), col = c(\grey\, \white\))

fileName <- here(figDir, \pie_SE_Whyte\)
width <- panelSize(4)*mmToInch
height <- panelSize(4)*mmToInch
# svglite(paste0(fileName, \.svg\), width = width, height =height)
# pie(counts, labels = labels,  main = paste0(\Whyte SE coverage \n\, total), col = c(\grey\, \white\),
#     cex = 1, cex.main = 1)
# dev.off()



### Dylan
n <- length(unique(subjectHits(findOverlaps(anchor, peak.Dylan.SE))))
total <- length(peak.Dylan.SE)
counts <- c(n, total - n)
labels <- paste(c(\covered\, \NOT covered\), counts)
pie(counts, labels = labels, main = paste0(\Dylan SE coverage \n\, total), col = c(\grey\, \white\))

fileName <- here(figDir, \pie_SE_Murphy\)
width <- panelSize(4)*mmToInch
height <- panelSize(4)*mmToInch
# svglite(paste0(fileName, \.svg\), width = width, height =height)
# pie(counts, labels = labels, main = paste0(\Murphy SE coverage \n\, total), col = c(\grey\, \white\))
# 
# dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Peak density instead of intensity

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1Ykc5dmNDQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbExtSmxaSEJsWENJcEtWeHVYRzVuWlhSUGRtVnliR0Z3VEc5dmNFNTFiU0E4TFNCbWRXNWpkR2x2Ymloc2IyOXdMQ0J3WldGcktYdGNiaUFnWVc1amFHOXlNU0E4TFNCSFVtRnVaMlZ6S0hObGNXNWhiV1Z6SUQwZ2JHOXZjQ1JXTVN3Z2NtRnVaMlZ6SUQwZ1NWSmhibWRsY3loemRHRnlkQ0E5SUd4dmIzQWtWaklzSUdWdVpDQTlJR3h2YjNBa1ZqTXBLVnh1SUNCaGJtTm9iM0l5SUR3dElFZFNZVzVuWlhNb2MyVnhibUZ0WlhNZ1BTQnNiMjl3SkZZMExDQnlZVzVuWlhNZ1BTQkpVbUZ1WjJWektITjBZWEowSUQwZ2JHOXZjQ1JXTlN3Z1pXNWtJRDBnYkc5dmNDUldOaWtwWEc0Z0lHRWdQQzBnY1hWbGNubElhWFJ6S0dacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJeExDQndaV0ZyS1NsY2JpQWdZaUE4TFNCeGRXVnllVWhwZEhNb1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNqSXNJSEJsWVdzcEtWeHVJQ0J5WlhSMWNtNG9iR1Z1WjNSb0tIVnVhWEYxWlNoaktHRXNJR0lwS1NrcFhHNTlYRzVjYm1kbGRGTkZUM1psY214aGNFWnBjMmhsY2lBOExTQm1kVzVqZEdsdmJpaGhiR3hNYjI5d0xDQnpkV0p6WlhSTWIyOXdMQ0J3WldGcktYdGNiaUFnWVd4c0xtOTJaWEpzWVhBZ1BDMGdaMlYwVDNabGNteGhjRXh2YjNCT2RXMG9ZV3hzVEc5dmNDd2djR1ZoYXlsY2JpQWdZV3hzTG01dmRFOTJaWEpzWVhBZ1BDMGdibkp2ZHloaGJHeE1iMjl3S1NBdElHRnNiQzV2ZG1WeWJHRndYRzRnSUZ4dUlDQnpkV0p6WlhRdWIzWmxjbXhoY0NBOExTQm5aWFJQZG1WeWJHRndURzl2Y0U1MWJTaHpkV0p6WlhSTWIyOXdMQ0J3WldGcktWeHVJQ0J6ZFdKelpYUXVibTkwVDNabGNteGhjQ0E4TFNCdWNtOTNLSE4xWW5ObGRFeHZiM0FwSUMwZ2MzVmljMlYwTG05MlpYSnNZWEJjYmlBZ1hHNGdJR052Ym5ScGJtZGxibU41WDNSaFlteGxJRHd0SUcxaGRISnBlQ2hqS0hOMVluTmxkQzV2ZG1WeWJHRndMQ0J6ZFdKelpYUXVibTkwVDNabGNteGhjQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZV3hzTG05MlpYSnNZWEFzSUdGc2JDNXViM1JQZG1WeWJHRndLU3dnYm5KdmR5QTlJRElzSUdKNWNtOTNJRDBnVkZKVlJTbGNiaUFnWTI5c2JtRnRaWE1vWTI5dWRHbHVaMlZ1WTNsZmRHRmliR1VwSUR3dElHTW9YQ0pQZG1WeWJHRndjR2x1WjF3aUxDQmNJazV2ZEY5UGRtVnliR0Z3Y0dsdVoxd2lLVnh1SUNCeWIzZHVZVzFsY3loamIyNTBhVzVuWlc1amVWOTBZV0pzWlNrZ1BDMGdZeWhjSWtGc2JDQnNiMjl3YzF3aUxDQmNJbE4xWW5ObGRDQnNiMjl3YzF3aUtWeHVJQ0JjYmlBZ0l5QlFaWEptYjNKdElFWnBjMmhsY2lkeklFVjRZV04wSUZSbGMzUmNiaUFnWm1semFHVnlYM1JsYzNSZmNtVnpkV3gwSUR3dElHWnBjMmhsY2k1MFpYTjBLR052Ym5ScGJtZGxibU41WDNSaFlteGxLVnh1SUNCeVpYUjFjbTRvWm1semFHVnlYM1JsYzNSZmNtVnpkV3gwS1Z4dWZWeHVYRzVjYmx4dWJHOXZjQzUxY0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDJSVVFVZDJjMFJOVTA5ZlZWQmZaR2xtWmpBdU1pNWlaV1J3WlZ3aUtTbGNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pWOWtWRUZIZG5ORVRWTlBYMDVQWDJScFptWXdMakl1WW1Wa2NHVmNJaWtwWEc1c2IyOXdMblZ3Ym04Z1BDMGdZbWx1WkY5eWIzZHpLR3h2YjNBdWRYQXNJR3h2YjNBdWJtOHBYRzVzYjI5d0xtUnZkMjRnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlrVkVGSGRuTkVUVk5QWDBSUFYwNWZaR2xtWmpBdU1pNWlaV1J3WlZ3aUtTbGNibHh1SXlNaklFUjViR0Z1WEc0aklGTmxaV1JwYm1kY2JuUmxiWEFnUEMwZ1oyVjBVMFZQZG1WeWJHRndSbWx6YUdWeUtHeHZiM0FzSUd4dmIzQXVkWEJ1Ynl3Z2NHVmhheTVFZVd4aGJpNVRSU2xjYm5KbGMzVnNkQzUwWWlBOExTQjBhV0ppYkdVb2JHOXZjRlI1Y0dVZ1BTQmNJbFZRTDA1UFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSaGNtZGxkQ0E5SUZ3aVJIbHNZVzRnVTBWY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0haaGJIVmxJRDBnZEdWdGNDUndMblpoYkhWbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2WkdSelVtRjBhVzhnUFNCMFpXMXdKR1Z6ZEdsdFlYUmxLVnh1WEc0aklIUmxiWEFnUEMwZ1oyVjBVMFZQZG1WeWJHRndSbWx6YUdWeUtHeHZiM0FzSUd4dmIzQXVkWEFzSUhCbFlXc3VSSGxzWVc0dVUwVXBYRzRqSUhKbGMzVnNkQzUwWWlBOExTQjBhV0ppYkdVb2JHOXZjRlI1Y0dVZ1BTQmNJbFZRWENJc1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdGeVoyVjBJRDBnWENKRWVXeGhiaUJUUlZ3aUxGeHVJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCMllXeDFaU0E5SUhSbGJYQWtjQzUyWVd4MVpTeGNiaU1nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdlpHUnpVbUYwYVc4Z1BTQjBaVzF3SkdWemRHbHRZWFJsS1Z4dUl5QkJaR1FnY205M1hHNGpJSFJsYlhBZ1BDMGdaMlYwVTBWUGRtVnliR0Z3Um1semFHVnlLR3h2YjNBc0lHeHZiM0F1Ym04c0lIQmxZV3N1Ukhsc1lXNHVVMFVwWEc0aklISmxjM1ZzZEM1MFlpQThMU0J5WlhOMWJIUXVkR0lnSlQ0bElGeHVJeUFnSUdGa1pGOXliM2NvYkc5dmNGUjVjR1VnUFNCY0lrNVBYQ0lzWEc0aklDQWdJQ0FnSUNBZ0lDQjBZWEpuWlhRZ1BTQmNJa1I1YkdGdUlGTkZYQ0lzWEc0aklDQWdJQ0FnSUNBZ0lDQndkbUZzZFdVZ1BTQjBaVzF3SkhBdWRtRnNkV1VzWEc0aklDQWdJQ0FnSUNBZ0lDQnZaR1J6VW1GMGFXOGdQU0IwWlcxd0pHVnpkR2x0WVhSbEtWeHVYRzUwWlcxd0lEd3RJR2RsZEZORlQzWmxjbXhoY0VacGMyaGxjaWhzYjI5d0xDQnNiMjl3TG1SdmQyNHNJSEJsWVdzdVJIbHNZVzR1VTBVcFhHNXlaWE4xYkhRdWRHSWdQQzBnY21WemRXeDBMblJpSUNVK0pTQmNiaUFnWVdSa1gzSnZkeWhzYjI5d1ZIbHdaU0E5SUZ3aVJFOVhUbHdpTEZ4dUlDQWdJQ0FnSUNBZ0lIUmhjbWRsZENBOUlGd2lSSGxzWVc0Z1UwVmNJaXhjYmlBZ0lDQWdJQ0FnSUNCd2RtRnNkV1VnUFNCMFpXMXdKSEF1ZG1Gc2RXVXNYRzRnSUNBZ0lDQWdJQ0FnYjJSa2MxSmhkR2x2SUQwZ2RHVnRjQ1JsYzNScGJXRjBaU2xjYmx4dUl5TWpJRmRvZVhSbFhHNGpJRk5sWldScGJtZGNiaU1nZEdWdGNDQThMU0JuWlhSVFJVOTJaWEpzWVhCR2FYTm9aWElvYkc5dmNDd2diRzl2Y0M1MWNDd2djR1ZoYXk1WGFIbDBaUzVUUlNsY2JpTWdjbVZ6ZFd4MExuUmlJRHd0SUhKbGMzVnNkQzUwWWlBbFBpVWdYRzRqSUNBZ1lXUmtYM0p2ZHloc2IyOXdWSGx3WlNBOUlGd2lWVkJjSWl4Y2JpTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwWVhKblpYUWdQU0JjSWxkb2VYUmxJRk5GWENJc1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0haaGJIVmxJRDBnZEdWdGNDUndMblpoYkhWbExGeHVJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5a1pITlNZWFJwYnlBOUlIUmxiWEFrWlhOMGFXMWhkR1VwWEc1Y2JpTWdRV1JrSUhKdmQxeHVkR1Z0Y0NBOExTQm5aWFJUUlU5MlpYSnNZWEJHYVhOb1pYSW9iRzl2Y0N3Z2JHOXZjQzUxY0c1dkxDQndaV0ZyTGxkb2VYUmxMbE5GS1Z4dWNtVnpkV3gwTG5SaUlEd3RJSEpsYzNWc2RDNTBZaUFsUGlVZ1hHNGdJR0ZrWkY5eWIzY29iRzl2Y0ZSNWNHVWdQU0JjSWxWUUwwNVBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ2RHRnlaMlYwSUQwZ1hDSlhhSGwwWlNCVFJWd2lMRnh1SUNBZ0lDQWdJQ0FnSUhCMllXeDFaU0E5SUhSbGJYQWtjQzUyWVd4MVpTeGNiaUFnSUNBZ0lDQWdJQ0J2WkdSelVtRjBhVzhnUFNCMFpXMXdKR1Z6ZEdsdFlYUmxLVnh1WEc1MFpXMXdJRHd0SUdkbGRGTkZUM1psY214aGNFWnBjMmhsY2loc2IyOXdMQ0JzYjI5d0xtUnZkMjRzSUhCbFlXc3VWMmg1ZEdVdVUwVXBYRzV5WlhOMWJIUXVkR0lnUEMwZ2NtVnpkV3gwTG5SaUlDVStKU0JjYmlBZ1lXUmtYM0p2ZHloc2IyOXdWSGx3WlNBOUlGd2lSRTlYVGx3aUxGeHVJQ0FnSUNBZ0lDQWdJSFJoY21kbGRDQTlJRndpVjJoNWRHVWdVMFZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQndkbUZzZFdVZ1BTQjBaVzF3SkhBdWRtRnNkV1VzWEc0Z0lDQWdJQ0FnSUNBZ2IyUmtjMUpoZEdsdklEMGdkR1Z0Y0NSbGMzUnBiV0YwWlNsY2JseHVYRzRqSUZacGMzVmhiR2w2WVhScGIyNWNibXhwWW5KaGNua29ZMmx5WTJ4cGVtVXBYRzVrWVhSaElEd3RJSEpsYzNWc2RDNTBZbHh1YUdWaGRHMWhjRjlrWVhSaElEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCc2IyOXdWSGx3WlN3Z2IyUmtjMUpoZEdsdktTQWxQaVZjYm5CcGRtOTBYM2RwWkdWeUtHNWhiV1Z6WDJaeWIyMGdQU0JzYjI5d1ZIbHdaU3dnZG1Gc2RXVnpYMlp5YjIwZ1BTQnZaR1J6VW1GMGFXOHBJQ1UrSlZ4dUlDQmpiMngxYlc1ZmRHOWZjbTkzYm1GdFpYTW9kbUZ5SUQwZ1hDSjBZWEpuWlhSY0lpbGNibHh1Y0haaGJIVmxYMlJoZEdFZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUd4dmIzQlVlWEJsTENCd2RtRnNkV1VwSUNVK0pWeHVJQ0J3YVhadmRGOTNhV1JsY2lodVlXMWxjMTltY205dElEMGdiRzl2Y0ZSNWNHVXNJSFpoYkhWbGMxOW1jbTl0SUQwZ2NIWmhiSFZsS1NBbFBpVmNiaUFnWTI5c2RXMXVYM1J2WDNKdmQyNWhiV1Z6S0haaGNpQTlJRndpZEdGeVoyVjBYQ0lwWEc1Y2JtTnZiRjltZFc0Z1BDMGdZMjlzYjNKU1lXMXdNaWhqS0RBc0lERXNJRElwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqS0Z3aUl6UTROVEpCTUZ3aUxDQmNJbmRvYVhSbFhDSXNJRndpSTBOQ016TXpRVndpS1NsY2JseHVjQ0E4TFNCSVpXRjBiV0Z3S0dGekxtMWhkSEpwZUNob1pXRjBiV0Z3WDJSaGRHRXBMRnh1SUNBZ0lDQWdJQ0J1WVcxbElEMGdYQ0pQWkdSeklGSmhkR2x2WENJc1hHNGdJQ0FnSUNBZ0lHTnZiQ0E5SUdOdmJGOW1kVzRzWEc0Z0lDQWdJQ0FnSUNNZ1FXUmtJR0Z1Ym05MFlYUnBiMjRnWm05eUlIQXRkbUZzZFdWelhHNGdJQ0FnSUNBZ0lHTmxiR3hmWm5WdUlEMGdablZ1WTNScGIyNG9haXdnYVN3Z2VDd2dlU3dnZDJsa2RHZ3NJR2hsYVdkb2RDd2dabWxzYkNrZ2UxeHVJQ0FnSUNBZ0lDQWdJSEIyWVd3Z1BDMGdjSFpoYkhWbFgyUmhkR0ZiYVN3Z2FsMWNiaUFnSUNBZ0lDQWdJQ0JzWVdKbGJDQThMU0JwWm1Wc2MyVW9jSFpoYkNBK0lEQXVNRFVzSUZ3aWJpNXpMbHdpTENCemNISnBiblJtS0Z3aUpTNHlaVndpTENCd2RtRnNLU2xjYmlBZ0lDQWdJQ0FnSUNCbmNtbGtMblJsZUhRb2JHRmlaV3dzSUhnc0lIa3NJR2R3SUQwZ1ozQmhjaWhtYjI1MGMybDZaU0E5SUdadmJuUlRhWHBsVXl3Z1ptOXVkR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxLU2xjYmlBZ0lDQWdJQ0FnZlN4Y2JpQWdJQ0FnSUNBZ0l5QkRkWE4wYjIxcGVtVWdkR2hsSUdobFlYUnRZWEFnYkdGNWIzVjBYRzRnSUNBZ0lDQWdJR05zZFhOMFpYSmZjbTkzY3lBOUlGUlNWVVVzWEc0Z0lDQWdJQ0FnSUhOb2IzZGZjbTkzWDJSbGJtUWdQU0JHUVV4VFJTeGNiaUFnSUNBZ0lDQWdZMngxYzNSbGNsOWpiMngxYlc1eklEMGdSa0ZNVTBVc1hHNGdJQ0FnSUNBZ0lISnZkMTl1WVcxbGMxOW5jQ0E5SUdkd1lYSW9abTl1ZEhOcGVtVWdQU0JtYjI1MFUybDZaVk1zSUdadmJuUm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTa3NYRzRnSUdOdmJIVnRibDl1WVcxbGMxOW5jQ0E5SUdkd1lYSW9abTl1ZEhOcGVtVWdQU0JtYjI1MFUybDZaVk1zSUdadmJuUm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTa3NYRzRnSUNBZ0lDQWdJR2hsWVhSdFlYQmZiR1ZuWlc1a1gzQmhjbUZ0SUQwZ2JHbHpkQ2hjYmlBZ0lDQWdJQ0FnSUNCaGRDQTlJR01vTUN3Z01Td2dNaWtzWEc0Z0lDQWdJQ0FnSUNBZ2JHRmlaV3h6SUQwZ1l5aGNJakJjSWl3Z1hDSXhYQ0lzSUZ3aU1sd2lLU3hjYmlBZ0lDQWdJQ0FnSUNCMGFYUnNaVjluY0NBOUlHZHdZWElvWm05dWRHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQm1iMjUwYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdJQ0FnSUNBZ2JHRmlaV3h6WDJkd0lEMGdaM0JoY2lobWIyNTBabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJR1p2Ym5SemFYcGxJRDBnWm05dWRGTnBlbVZUS1Z4dUlDQWdJQ0FnSUNBcFhHNHBYRzVjYmlNZ1ptbHNaVTVoYldVZ1BDMGdhR1Z5WlNobWFXZEVhWElzSUZ3aWFHVmhkRzFoY0Y5VFJWOWxibkpwWTJodFpXNTBYQ0lwWEc0aklIZHBaSFJvSUR3dElIQmhibVZzVTJsNlpTZ3hMalVwS20xdFZHOUpibU5vWEc0aklHaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NQzQzS1NwdGJWUnZTVzVqYUZ4dUl5QnpkbWRzYVhSbEtIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcExDQjNhV1IwYUNBOUlIZHBaSFJvTENCb1pXbG5hSFFnUFdobGFXZG9kQ2xjYmlNZ2NISnBiblFvY0NsY2JpTWdaR1YyTG05bVppZ3BYRzRqSUhCdVp5aHdZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTd2dkMmxrZEdnZ1BTQjNhV1IwYUN3Z2FHVnBaMmgwSUQxb1pXbG5hSFFzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ3aWFXNWNJaWxjYmlNZ2NISnBiblFvY0NsY2JpTWdaR1YyTG05bVppZ3BYRzVjYmlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpYRzVjYm1SaGRHRWtiRzl2Y0ZSNWNHVWdQQzBnWm1GamRHOXlLR1JoZEdFa2JHOXZjRlI1Y0dVc0lHeGxkbVZzY3lBOUlHTW9YQ0pWVUM5T1Qxd2lMQ0JjSWtSUFYwNWNJaWtwWEc1a1lYUmhKSFJoY21kbGRDQThMU0JtWVdOMGIzSW9aR0YwWVNSMFlYSm5aWFFzSUd4bGRtVnNjeUE5SUdNb1hDSlhhSGwwWlNCVFJWd2lMQ0JjSWtSNWJHRnVJRk5GWENJcEtWeHVYRzV3SUR3dElHZG5jR3h2ZENoa1lYUmhMQ0JoWlhNb2VDQTlJR3h2YjNCVWVYQmxMQ0I1SUQwZ2RHRnlaMlYwTENCemFYcGxJRDBnTFd4dlp6RXdLSEIyWVd4MVpTa3NJR1pwYkd3Z1BTQnZaR1J6VW1GMGFXOHBLU0FyWEc0Z0lHZGxiMjFmY0c5cGJuUW9jMmhoY0dVZ1BTQXlNU3dnSUNBZ0lDQWdJQ01nUlc1emRYSmxjeUJoSUhCdmFXNTBJSGRwZEdnZ1lXNGdiM1YwYkdsdVpWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUhOMGNtOXJaU0E5SURFcWNIUlViMDFOSUNBZ0lDQWdJeUJNYVc1bElIZHBaSFJvSUdadmNpQjBhR1VnWW05eVpHVnlYRzRnSUNrZ0t5QjBhR1Z0WlY5aWR5Z3BJQ3NnWEc0Z0lITmpZV3hsWDNOcGVtVmZZMjl1ZEdsdWRXOTFjeWh5WVc1blpTQTlJR01vTVN3Z015a3BJQ3NnSUNNZ1UyVjBJRzFwYmlCaGJtUWdiV0Y0SUhCdmFXNTBJSE5wZW1WeklHaGxjbVZjYmlBZ2MyTmhiR1ZmWm1sc2JGOW5jbUZrYVdWdWRHNG9ZMjlzYjNKeklEMGdZeWhjSWlNME9EVXlRVEJjSWl3Z1hDSjNhR2wwWlZ3aUxDQmNJaU5EUWpNek0wRmNJaWtzSUNBaklFUmxabWx1WlNCbmNtRmthV1Z1ZENCamIyeHZjbk5jYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZV3gxWlhNZ1BTQnpZMkZzWlhNNk9uSmxjMk5oYkdVb1l5Z3dMalVzSURFc0lERXVOU2twTENCc2FXMXBkSE1nUFNCaktEQXVOU3dnTVM0MUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0kyeHZkeUE5SUZ3aWQyaHBkR1ZjSWl3Z2FHbG5hQ0E5SUZ3aUkwTkNNek16UVZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FXMXBkSE1nUFNCaktERXNJRE1wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzl2WWlBOUlITmpZV3hsY3pvNmMzRjFhWE5vTENBaklFUmxabWx1WlNCbmNtRmthV1Z1ZENCamIyeHZjbk5jYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5kV2xrWlNBOUlHZDFhV1JsWDJOdmJHOXlZbUZ5S0Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GeWQybGtkR2dnUFNBeExqVXZOUzR3T0N3Z0lDTWdRV1JxZFhOMElIZHBaSFJvSUc5bUlIUm9aU0JqYjJ4dmNpQmlZWEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poY21obGFXZG9kQ0E5SURFMUx6VXVNRGdnSUNBaklFRmthblZ6ZENCb1pXbG5hSFFnYjJZZ2RHaGxJR052Ykc5eUlHSmhjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDbGNiaUFnS1NBclhHNGdJR3hoWW5Nb2VDQTlJRTVWVEV3c0lIa2dQU0JPVlV4TUtTQWdLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQmhibWRzWlNBOUlEUTFMQ0FnSUNBZ0lDTWdVbTkwWVhSbElIZ3RZWGhwY3lCc1lXSmxiSE1nTkRVZ1pHVm5jbVZsYzF4dUlDQWdJQ0FnYUdwMWMzUWdQU0F4TENBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0JvYjNKcGVtOXVkR0ZzSUdwMWMzUnBabWxqWVhScGIyNWNiaUFnSUNBZ0lIWnFkWE4wSUQwZ01TQWdJQ0FnSUNBZ0l5QkJaR3AxYzNRZ2RtVnlkR2xqWVd3Z2FuVnpkR2xtYVdOaGRHbHZibHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNrc1hHNGdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hDSjBjbUZ1YzNCaGNtVnVkRndpS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdiR1ZuWlc1a0xuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLVnh1SUNBcFhHNWNibVpwYkdWT1lXMWxJRHd0SUdobGNtVW9abWxuUkdseUxDQmNJbWhsWVhSdFlYQmZVMFZmWlc1eWFXTm9iV1Z1ZEY5a2IzUndiRzkwWENJcFhHNTNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NUzQ0S1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3hMakVwS20xdFZHOUpibU5vWEc0aklIQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlNZ2NISnBiblFvY0NsY2JpTWdaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5sb29wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGVcXCkpXG5cbmdldE92ZXJsYXBMb29wTnVtIDwtIGZ1bmN0aW9uKGxvb3AsIHBlYWspe1xuICBhbmNob3IxIDwtIEdSYW5nZXMoc2VxbmFtZXMgPSBsb29wJFYxLCByYW5nZXMgPSBJUmFuZ2VzKHN0YXJ0ID0gbG9vcCRWMiwgZW5kID0gbG9vcCRWMykpXG4gIGFuY2hvcjIgPC0gR1JhbmdlcyhzZXFuYW1lcyA9IGxvb3AkVjQsIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBsb29wJFY1LCBlbmQgPSBsb29wJFY2KSlcbiAgYSA8LSBxdWVyeUhpdHMoZmluZE92ZXJsYXBzKGFuY2hvcjEsIHBlYWspKVxuICBiIDwtIHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoYW5jaG9yMiwgcGVhaykpXG4gIHJldHVybihsZW5ndGgodW5pcXVlKGMoYSwgYikpKSlcbn1cblxuZ2V0U0VPdmVybGFwRmlzaGVyIDwtIGZ1bmN0aW9uKGFsbExvb3AsIHN1YnNldExvb3AsIHBlYWspe1xuICBhbGwub3ZlcmxhcCA8LSBnZXRPdmVybGFwTG9vcE51bShhbGxMb29wLCBwZWFrKVxuICBhbGwubm90T3ZlcmxhcCA8LSBucm93KGFsbExvb3ApIC0gYWxsLm92ZXJsYXBcbiAgXG4gIHN1YnNldC5vdmVybGFwIDwtIGdldE92ZXJsYXBMb29wTnVtKHN1YnNldExvb3AsIHBlYWspXG4gIHN1YnNldC5ub3RPdmVybGFwIDwtIG5yb3coc3Vic2V0TG9vcCkgLSBzdWJzZXQub3ZlcmxhcFxuICBcbiAgY29udGluZ2VuY3lfdGFibGUgPC0gbWF0cml4KGMoc3Vic2V0Lm92ZXJsYXAsIHN1YnNldC5ub3RPdmVybGFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwub3ZlcmxhcCwgYWxsLm5vdE92ZXJsYXApLCBucm93ID0gMiwgYnlyb3cgPSBUUlVFKVxuICBjb2xuYW1lcyhjb250aW5nZW5jeV90YWJsZSkgPC0gYyhcXE92ZXJsYXBwaW5nXFwsIFxcTm90X092ZXJsYXBwaW5nXFwpXG4gIHJvd25hbWVzKGNvbnRpbmdlbmN5X3RhYmxlKSA8LSBjKFxcQWxsIGxvb3BzXFwsIFxcU3Vic2V0IGxvb3BzXFwpXG4gIFxuICAjIFBlcmZvcm0gRmlzaGVyJ3MgRXhhY3QgVGVzdFxuICBmaXNoZXJfdGVzdF9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUpXG4gIHJldHVybihmaXNoZXJfdGVzdF9yZXN1bHQpXG59XG5cblxuXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3AudXBubyA8LSBiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubylcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuXG4jIyMgRHlsYW5cbiMgU2VlZGluZ1xudGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC51cG5vLCBwZWFrLkR5bGFuLlNFKVxucmVzdWx0LnRiIDwtIHRpYmJsZShsb29wVHlwZSA9IFxcVVAvTk9cXCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gXFxEeWxhbiBTRVxcLFxuICAgICAgICAgICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cbiMgdGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC51cCwgcGVhay5EeWxhbi5TRSlcbiMgcmVzdWx0LnRiIDwtIHRpYmJsZShsb29wVHlwZSA9IFxcVVBcXCxcbiMgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBcXER5bGFuIFNFXFwsXG4jICAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuIyAgICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4jIEFkZCByb3dcbiMgdGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5ubywgcGVhay5EeWxhbi5TRSlcbiMgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4jICAgYWRkX3Jvdyhsb29wVHlwZSA9IFxcTk9cXCxcbiMgICAgICAgICAgIHRhcmdldCA9IFxcRHlsYW4gU0VcXCxcbiMgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiMgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cbnRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AuZG93biwgcGVhay5EeWxhbi5TRSlcbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICBhZGRfcm93KGxvb3BUeXBlID0gXFxET1dOXFwsXG4gICAgICAgICAgdGFyZ2V0ID0gXFxEeWxhbiBTRVxcLFxuICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG4jIyMgV2h5dGVcbiMgU2VlZGluZ1xuIyB0ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwLCBwZWFrLldoeXRlLlNFKVxuIyByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiMgICBhZGRfcm93KGxvb3BUeXBlID0gXFxVUFxcLFxuIyAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IFxcV2h5dGUgU0VcXCxcbiMgICAgICAgICAgICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4jICAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuIyBBZGQgcm93XG50ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwbm8sIHBlYWsuV2h5dGUuU0UpXG5yZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgYWRkX3Jvdyhsb29wVHlwZSA9IFxcVVAvTk9cXCxcbiAgICAgICAgICB0YXJnZXQgPSBcXFdoeXRlIFNFXFwsXG4gICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cbnRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AuZG93biwgcGVhay5XaHl0ZS5TRSlcbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICBhZGRfcm93KGxvb3BUeXBlID0gXFxET1dOXFwsXG4gICAgICAgICAgdGFyZ2V0ID0gXFxXaHl0ZSBTRVxcLFxuICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG5cbiMgVmlzdWFsaXphdGlvblxubGlicmFyeShjaXJjbGl6ZSlcbmRhdGEgPC0gcmVzdWx0LnRiXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGxvb3BUeXBlLCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGxvb3BUeXBlLCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgbG9vcFR5cGUsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBsb29wVHlwZSwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMiksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFwjNDg1MkEwXFwsIFxcd2hpdGVcXCwgXFwjQ0IzMzNBXFwpKVxuXG5wIDwtIEhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksXG4gICAgICAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCxcbiAgICAgICAgY29sID0gY29sX2Z1bixcbiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXNcbiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7XG4gICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXVxuICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgXFxuLnMuXFwsIHNwcmludGYoXFwlLjJlXFwsIHB2YWwpKVxuICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gZm9udFNpemVTLCBmb250ZmFtaWx5ID0gZm9udFR5cGUpKVxuICAgICAgICB9LFxuICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXRcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgcm93X25hbWVzX2dwID0gZ3Bhcihmb250c2l6ZSA9IGZvbnRTaXplUywgZm9udGZhbWlseSA9IGZvbnRUeXBlKSxcbiAgY29sdW1uX25hbWVzX2dwID0gZ3Bhcihmb250c2l6ZSA9IGZvbnRTaXplUywgZm9udGZhbWlseSA9IGZvbnRUeXBlKSxcbiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KFxuICAgICAgICAgIGF0ID0gYygwLCAxLCAyKSxcbiAgICAgICAgICBsYWJlbHMgPSBjKFxcMFxcLCBcXDFcXCwgXFwyXFwpLFxuICAgICAgICAgIHRpdGxlX2dwID0gZ3Bhcihmb250ZmFtaWx5ID0gZm9udFR5cGUsIGZvbnRzaXplID0gZm9udFNpemVTKSxcbiAgICAgICAgICBsYWJlbHNfZ3AgPSBncGFyKGZvbnRmYW1pbHkgPSBmb250VHlwZSwgZm9udHNpemUgPSBmb250U2l6ZVMpXG4gICAgICAgIClcbilcblxuIyBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFxoZWF0bWFwX1NFX2VucmljaG1lbnRcXClcbiMgd2lkdGggPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbiMgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgwLjcpKm1tVG9JbmNoXG4jIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9aGVpZ2h0KVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMgcG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPWhlaWdodCwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuZGF0YSRsb29wVHlwZSA8LSBmYWN0b3IoZGF0YSRsb29wVHlwZSwgbGV2ZWxzID0gYyhcXFVQL05PXFwsIFxcRE9XTlxcKSlcbmRhdGEkdGFyZ2V0IDwtIGZhY3RvcihkYXRhJHRhcmdldCwgbGV2ZWxzID0gYyhcXFdoeXRlIFNFXFwsIFxcRHlsYW4gU0VcXCkpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gbG9vcFR5cGUsIHkgPSB0YXJnZXQsIHNpemUgPSAtbG9nMTAocHZhbHVlKSwgZmlsbCA9IG9kZHNSYXRpbykpICtcbiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lXG4gICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0gICAgICAjIExpbmUgd2lkdGggZm9yIHRoZSBib3JkZXJcbiAgKSArIHRoZW1lX2J3KCkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCAzKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnMgPSBjKFxcIzQ4NTJBMFxcLCBcXHdoaXRlXFwsIFxcI0NCMzMzQVxcKSwgICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHNjYWxlczo6cmVzY2FsZShjKDAuNSwgMSwgMS41KSksIGxpbWl0cyA9IGMoMC41LCAxLjUpLCBcbiAgICAgICAgICAgICAgICAgICAgICAjbG93ID0gXFx3aGl0ZVxcLCBoaWdoID0gXFwjQ0IzMzNBXFwsXG4gICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICtcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcaGVhdG1hcF9TRV9lbnJpY2htZW50X2RvdHBsb3RcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjgpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMSkqbW1Ub0luY2hcbiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
name <- \chromo_cons_annoHierarchy\
loop <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\))

getOverlapLoopNum <- function(loop, peak){
  anchor1 <- GRanges(seqnames = loop$V1, ranges = IRanges(start = loop$V2, end = loop$V3))
  anchor2 <- GRanges(seqnames = loop$V4, ranges = IRanges(start = loop$V5, end = loop$V6))
  a <- queryHits(findOverlaps(anchor1, peak))
  b <- queryHits(findOverlaps(anchor2, peak))
  return(length(unique(c(a, b))))
}

getSEOverlapFisher <- function(allLoop, subsetLoop, peak){
  all.overlap <- getOverlapLoopNum(allLoop, peak)
  all.notOverlap <- nrow(allLoop) - all.overlap
  
  subset.overlap <- getOverlapLoopNum(subsetLoop, peak)
  subset.notOverlap <- nrow(subsetLoop) - subset.overlap
  
  contingency_table <- matrix(c(subset.overlap, subset.notOverlap,
                                all.overlap, all.notOverlap), nrow = 2, byrow = TRUE)
  colnames(contingency_table) <- c(\Overlapping\, \Not_Overlapping\)
  rownames(contingency_table) <- c(\All loops\, \Subset loops\)
  
  # Perform Fisher's Exact Test
  fisher_test_result <- fisher.test(contingency_table)
  return(fisher_test_result)
}



loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
loop.upno <- bind_rows(loop.up, loop.no)
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))

### Dylan
# Seeding
temp <- getSEOverlapFisher(loop, loop.upno, peak.Dylan.SE)
result.tb <- tibble(loopType = \UP/NO\,
                    target = \Dylan SE\,
                    pvalue = temp$p.value,
                    oddsRatio = temp$estimate)

# temp <- getSEOverlapFisher(loop, loop.up, peak.Dylan.SE)
# result.tb <- tibble(loopType = \UP\,
#                     target = \Dylan SE\,
#                     pvalue = temp$p.value,
#                     oddsRatio = temp$estimate)
# Add row
# temp <- getSEOverlapFisher(loop, loop.no, peak.Dylan.SE)
# result.tb <- result.tb %>% 
#   add_row(loopType = \NO\,
#           target = \Dylan SE\,
#           pvalue = temp$p.value,
#           oddsRatio = temp$estimate)

temp <- getSEOverlapFisher(loop, loop.down, peak.Dylan.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \DOWN\,
          target = \Dylan SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

### Whyte
# Seeding
# temp <- getSEOverlapFisher(loop, loop.up, peak.Whyte.SE)
# result.tb <- result.tb %>% 
#   add_row(loopType = \UP\,
#                     target = \Whyte SE\,
#                     pvalue = temp$p.value,
#                     oddsRatio = temp$estimate)

# Add row
temp <- getSEOverlapFisher(loop, loop.upno, peak.Whyte.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \UP/NO\,
          target = \Whyte SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

temp <- getSEOverlapFisher(loop, loop.down, peak.Whyte.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \DOWN\,
          target = \Whyte SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)


# Visualization
library(circlize)
data <- result.tb
heatmap_data <- data %>% dplyr::select(target, loopType, oddsRatio) %>%
pivot_wider(names_from = loopType, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, loopType, pvalue) %>%
  pivot_wider(names_from = loopType, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 2), 
                      c(\#4852A0\, \white\, \#CB333A\))

p <- Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = fontSizeS, fontfamily = fontType))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        row_names_gp = gpar(fontsize = fontSizeS, fontfamily = fontType),
  column_names_gp = gpar(fontsize = fontSizeS, fontfamily = fontType),
        heatmap_legend_param = list(
          at = c(0, 1, 2),
          labels = c(\0\, \1\, \2\),
          title_gp = gpar(fontfamily = fontType, fontsize = fontSizeS),
          labels_gp = gpar(fontfamily = fontType, fontsize = fontSizeS)
        )
)

# fileName <- here(figDir, \heatmap_SE_enrichment\)
# width <- panelSize(1.5)*mmToInch
# height <- panelSize(0.7)*mmToInch
# svglite(paste0(fileName, \.svg\), width = width, height =height)
# print(p)
# dev.off()
# png(paste0(fileName, \.png\), width = width, height =height, res = 600, unit = \in\)
# print(p)
# dev.off()

#######################

data$loopType <- factor(data$loopType, levels = c(\UP/NO\, \DOWN\))
data$target <- factor(data$target, levels = c(\Whyte SE\, \Dylan SE\))

p <- ggplot(data, aes(x = loopType, y = target, size = -log10(pvalue), fill = oddsRatio)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(1, 3)) +  # Set min and max point sizes here
  scale_fill_gradientn(colors = c(\#4852A0\, \white\, \#CB333A\),  # Define gradient colors
                      values = scales::rescale(c(0.5, 1, 1.5)), limits = c(0.5, 1.5), 
                      #low = \white\, high = \#CB333A\,
                      #                  limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) +
  labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- here(figDir, \heatmap_SE_enrichment_dotplot\)
width <- panelSize(1.8)*mmToInch
height <- panelSize(1.1)*mmToInch
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
svglite(paste0(fileName, \.svg\),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHViRzl2Y0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsTG1KbFpIQmxYRndwS1Z4dVhHNW5aWFJQZG1WeWJHRndURzl2Y0U1MWJTQThMU0JtZFc1amRHbHZiaWhzYjI5d0xDQndaV0ZyS1h0Y2JpQWdZVzVqYUc5eU1TQThMU0JIVW1GdVoyVnpLSE5sY1c1aGJXVnpJRDBnYkc5dmNDUldNU3dnY21GdVoyVnpJRDBnU1ZKaGJtZGxjeWh6ZEdGeWRDQTlJR3h2YjNBa1ZqSXNJR1Z1WkNBOUlHeHZiM0FrVmpNcEtWeHVJQ0JoYm1Ob2IzSXlJRHd0SUVkU1lXNW5aWE1vYzJWeGJtRnRaWE1nUFNCc2IyOXdKRlkwTENCeVlXNW5aWE1nUFNCSlVtRnVaMlZ6S0hOMFlYSjBJRDBnYkc5dmNDUldOU3dnWlc1a0lEMGdiRzl2Y0NSV05pa3BYRzRnSUdFZ1BDMGdjWFZsY25sSWFYUnpLR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l4TENCd1pXRnJLU2xjYmlBZ1lpQThMU0J4ZFdWeWVVaHBkSE1vWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2pJc0lIQmxZV3NwS1Z4dUlDQnlaWFIxY200b2JHVnVaM1JvS0hWdWFYRjFaU2hqS0dFc0lHSXBLU2twWEc1OVhHNWNibWRsZEZORlQzWmxjbXhoY0VacGMyaGxjaUE4TFNCbWRXNWpkR2x2YmloaGJHeE1iMjl3TENCemRXSnpaWFJNYjI5d0xDQndaV0ZyS1h0Y2JpQWdZV3hzTG05MlpYSnNZWEFnUEMwZ1oyVjBUM1psY214aGNFeHZiM0JPZFcwb1lXeHNURzl2Y0N3Z2NHVmhheWxjYmlBZ1lXeHNMbTV2ZEU5MlpYSnNZWEFnUEMwZ2JuSnZkeWhoYkd4TWIyOXdLU0F0SUdGc2JDNXZkbVZ5YkdGd1hHNGdJRnh1SUNCemRXSnpaWFF1YjNabGNteGhjQ0E4TFNCblpYUlBkbVZ5YkdGd1RHOXZjRTUxYlNoemRXSnpaWFJNYjI5d0xDQndaV0ZyS1Z4dUlDQnpkV0p6WlhRdWJtOTBUM1psY214aGNDQThMU0J1Y205M0tITjFZbk5sZEV4dmIzQXBJQzBnYzNWaWMyVjBMbTkyWlhKc1lYQmNiaUFnWEc0Z0lHTnZiblJwYm1kbGJtTjVYM1JoWW14bElEd3RJRzFoZEhKcGVDaGpLSE4xWW5ObGRDNXZkbVZ5YkdGd0xDQnpkV0p6WlhRdWJtOTBUM1psY214aGNDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXeHNMbTkyWlhKc1lYQXNJR0ZzYkM1dWIzUlBkbVZ5YkdGd0tTd2dibkp2ZHlBOUlESXNJR0o1Y205M0lEMGdWRkpWUlNsY2JpQWdZMjlzYm1GdFpYTW9ZMjl1ZEdsdVoyVnVZM2xmZEdGaWJHVXBJRHd0SUdNb1hGeFBkbVZ5YkdGd2NHbHVaMXhjTENCY1hFNXZkRjlQZG1WeWJHRndjR2x1WjF4Y0tWeHVJQ0J5YjNkdVlXMWxjeWhqYjI1MGFXNW5aVzVqZVY5MFlXSnNaU2tnUEMwZ1l5aGNYRUZzYkNCc2IyOXdjMXhjTENCY1hGTjFZbk5sZENCc2IyOXdjMXhjS1Z4dUlDQmNiaUFnSXlCUVpYSm1iM0p0SUVacGMyaGxjaWR6SUVWNFlXTjBJRlJsYzNSY2JpQWdabWx6YUdWeVgzUmxjM1JmY21WemRXeDBJRHd0SUdacGMyaGxjaTUwWlhOMEtHTnZiblJwYm1kbGJtTjVYM1JoWW14bEtWeHVJQ0J5WlhSMWNtNG9abWx6YUdWeVgzUmxjM1JmY21WemRXeDBLVnh1ZlZ4dVhHNWNibHh1Ykc5dmNDNTFjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNCbExYQmxYMlJVUVVkMmMwUk5VMDlmVlZCZlpHbG1aakF1TWk1aVpXUndaVnhjS1NsY2JteHZiM0F1Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5a1ZFRkhkbk5FVFZOUFgwNVBYMlJwWm1Zd0xqSXVZbVZrY0dWY1hDa3BYRzVzYjI5d0xuVndibThnUEMwZ1ltbHVaRjl5YjNkektHeHZiM0F1ZFhBc0lHeHZiM0F1Ym04cFhHNXNiMjl3TG1SdmQyNGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pWOWtWRUZIZG5ORVRWTlBYMFJQVjA1ZlpHbG1aakF1TWk1aVpXUndaVnhjS1NsY2JseHVJeU1qSUVSNWJHRnVYRzRqSUZObFpXUnBibWRjYm5SbGJYQWdQQzBnWjJWMFUwVlBkbVZ5YkdGd1JtbHphR1Z5S0d4dmIzQXNJR3h2YjNBdWRYQnVieXdnY0dWaGF5NUVlV3hoYmk1VFJTbGNibkpsYzNWc2RDNTBZaUE4TFNCMGFXSmliR1VvYkc5dmNGUjVjR1VnUFNCY1hGVlFMMDVQWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJoY21kbGRDQTlJRnhjUkhsc1lXNGdVMFZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjSFpoYkhWbElEMGdkR1Z0Y0NSd0xuWmhiSFZsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZaR1J6VW1GMGFXOGdQU0IwWlcxd0pHVnpkR2x0WVhSbEtWeHVYRzRqSUhSbGJYQWdQQzBnWjJWMFUwVlBkbVZ5YkdGd1JtbHphR1Z5S0d4dmIzQXNJR3h2YjNBdWRYQXNJSEJsWVdzdVJIbHNZVzR1VTBVcFhHNGpJSEpsYzNWc2RDNTBZaUE4TFNCMGFXSmliR1VvYkc5dmNGUjVjR1VnUFNCY1hGVlFYRndzWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR0Z5WjJWMElEMGdYRnhFZVd4aGJpQlRSVnhjTEZ4dUl5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEIyWVd4MVpTQTlJSFJsYlhBa2NDNTJZV3gxWlN4Y2JpTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2WkdSelVtRjBhVzhnUFNCMFpXMXdKR1Z6ZEdsdFlYUmxLVnh1SXlCQlpHUWdjbTkzWEc0aklIUmxiWEFnUEMwZ1oyVjBVMFZQZG1WeWJHRndSbWx6YUdWeUtHeHZiM0FzSUd4dmIzQXVibThzSUhCbFlXc3VSSGxzWVc0dVUwVXBYRzRqSUhKbGMzVnNkQzUwWWlBOExTQnlaWE4xYkhRdWRHSWdKVDRsSUZ4dUl5QWdJR0ZrWkY5eWIzY29iRzl2Y0ZSNWNHVWdQU0JjWEU1UFhGd3NYRzRqSUNBZ0lDQWdJQ0FnSUNCMFlYSm5aWFFnUFNCY1hFUjViR0Z1SUZORlhGd3NYRzRqSUNBZ0lDQWdJQ0FnSUNCd2RtRnNkV1VnUFNCMFpXMXdKSEF1ZG1Gc2RXVXNYRzRqSUNBZ0lDQWdJQ0FnSUNCdlpHUnpVbUYwYVc4Z1BTQjBaVzF3SkdWemRHbHRZWFJsS1Z4dVhHNTBaVzF3SUR3dElHZGxkRk5GVDNabGNteGhjRVpwYzJobGNpaHNiMjl3TENCc2IyOXdMbVJ2ZDI0c0lIQmxZV3N1Ukhsc1lXNHVVMFVwWEc1eVpYTjFiSFF1ZEdJZ1BDMGdjbVZ6ZFd4MExuUmlJQ1UrSlNCY2JpQWdZV1JrWDNKdmR5aHNiMjl3Vkhsd1pTQTlJRnhjUkU5WFRseGNMRnh1SUNBZ0lDQWdJQ0FnSUhSaGNtZGxkQ0E5SUZ4Y1JIbHNZVzRnVTBWY1hDeGNiaUFnSUNBZ0lDQWdJQ0J3ZG1Gc2RXVWdQU0IwWlcxd0pIQXVkbUZzZFdVc1hHNGdJQ0FnSUNBZ0lDQWdiMlJrYzFKaGRHbHZJRDBnZEdWdGNDUmxjM1JwYldGMFpTbGNibHh1SXlNaklGZG9lWFJsWEc0aklGTmxaV1JwYm1kY2JpTWdkR1Z0Y0NBOExTQm5aWFJUUlU5MlpYSnNZWEJHYVhOb1pYSW9iRzl2Y0N3Z2JHOXZjQzUxY0N3Z2NHVmhheTVYYUhsMFpTNVRSU2xjYmlNZ2NtVnpkV3gwTG5SaUlEd3RJSEpsYzNWc2RDNTBZaUFsUGlVZ1hHNGpJQ0FnWVdSa1gzSnZkeWhzYjI5d1ZIbHdaU0E5SUZ4Y1ZWQmNYQ3hjYmlNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBZWEpuWlhRZ1BTQmNYRmRvZVhSbElGTkZYRndzWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjSFpoYkhWbElEMGdkR1Z0Y0NSd0xuWmhiSFZsTEZ4dUl5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzlrWkhOU1lYUnBieUE5SUhSbGJYQWtaWE4wYVcxaGRHVXBYRzVjYmlNZ1FXUmtJSEp2ZDF4dWRHVnRjQ0E4TFNCblpYUlRSVTkyWlhKc1lYQkdhWE5vWlhJb2JHOXZjQ3dnYkc5dmNDNTFjRzV2TENCd1pXRnJMbGRvZVhSbExsTkZLVnh1Y21WemRXeDBMblJpSUR3dElISmxjM1ZzZEM1MFlpQWxQaVVnWEc0Z0lHRmtaRjl5YjNjb2JHOXZjRlI1Y0dVZ1BTQmNYRlZRTDA1UFhGd3NYRzRnSUNBZ0lDQWdJQ0FnZEdGeVoyVjBJRDBnWEZ4WGFIbDBaU0JUUlZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJSEIyWVd4MVpTQTlJSFJsYlhBa2NDNTJZV3gxWlN4Y2JpQWdJQ0FnSUNBZ0lDQnZaR1J6VW1GMGFXOGdQU0IwWlcxd0pHVnpkR2x0WVhSbEtWeHVYRzUwWlcxd0lEd3RJR2RsZEZORlQzWmxjbXhoY0VacGMyaGxjaWhzYjI5d0xDQnNiMjl3TG1SdmQyNHNJSEJsWVdzdVYyaDVkR1V1VTBVcFhHNXlaWE4xYkhRdWRHSWdQQzBnY21WemRXeDBMblJpSUNVK0pTQmNiaUFnWVdSa1gzSnZkeWhzYjI5d1ZIbHdaU0E5SUZ4Y1JFOVhUbHhjTEZ4dUlDQWdJQ0FnSUNBZ0lIUmhjbWRsZENBOUlGeGNWMmg1ZEdVZ1UwVmNYQ3hjYmlBZ0lDQWdJQ0FnSUNCd2RtRnNkV1VnUFNCMFpXMXdKSEF1ZG1Gc2RXVXNYRzRnSUNBZ0lDQWdJQ0FnYjJSa2MxSmhkR2x2SUQwZ2RHVnRjQ1JsYzNScGJXRjBaU2xjYmx4dVhHNGpJRlpwYzNWaGJHbDZZWFJwYjI1Y2JteHBZbkpoY25rb1kybHlZMnhwZW1VcFhHNWtZWFJoSUR3dElISmxjM1ZzZEM1MFlseHVhR1ZoZEcxaGNGOWtZWFJoSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0JzYjI5d1ZIbHdaU3dnYjJSa2MxSmhkR2x2S1NBbFBpVmNibkJwZG05MFgzZHBaR1Z5S0c1aGJXVnpYMlp5YjIwZ1BTQnNiMjl3Vkhsd1pTd2dkbUZzZFdWelgyWnliMjBnUFNCdlpHUnpVbUYwYVc4cElDVStKVnh1SUNCamIyeDFiVzVmZEc5ZmNtOTNibUZ0WlhNb2RtRnlJRDBnWEZ4MFlYSm5aWFJjWENsY2JseHVjSFpoYkhWbFgyUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJR3h2YjNCVWVYQmxMQ0J3ZG1Gc2RXVXBJQ1UrSlZ4dUlDQndhWFp2ZEY5M2FXUmxjaWh1WVcxbGMxOW1jbTl0SUQwZ2JHOXZjRlI1Y0dVc0lIWmhiSFZsYzE5bWNtOXRJRDBnY0haaGJIVmxLU0FsUGlWY2JpQWdZMjlzZFcxdVgzUnZYM0p2ZDI1aGJXVnpLSFpoY2lBOUlGeGNkR0Z5WjJWMFhGd3BYRzVjYm1OdmJGOW1kVzRnUEMwZ1kyOXNiM0pTWVcxd01paGpLREFzSURFc0lESXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpLRnhjSXpRNE5USkJNRnhjTENCY1hIZG9hWFJsWEZ3c0lGeGNJME5DTXpNelFWeGNLU2xjYmx4dWNDQThMU0JJWldGMGJXRndLR0Z6TG0xaGRISnBlQ2hvWldGMGJXRndYMlJoZEdFcExGeHVJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hGeFBaR1J6SUZKaGRHbHZYRndzWEc0Z0lDQWdJQ0FnSUdOdmJDQTlJR052YkY5bWRXNHNYRzRnSUNBZ0lDQWdJQ01nUVdSa0lHRnVibTkwWVhScGIyNGdabTl5SUhBdGRtRnNkV1Z6WEc0Z0lDQWdJQ0FnSUdObGJHeGZablZ1SUQwZ1puVnVZM1JwYjI0b2Fpd2dhU3dnZUN3Z2VTd2dkMmxrZEdnc0lHaGxhV2RvZEN3Z1ptbHNiQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lIQjJZV3dnUEMwZ2NIWmhiSFZsWDJSaGRHRmJhU3dnYWwxY2JpQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOExTQnBabVZzYzJVb2NIWmhiQ0ErSURBdU1EVXNJRnhjYmk1ekxseGNMQ0J6Y0hKcGJuUm1LRnhjSlM0eVpWeGNMQ0J3ZG1Gc0tTbGNiaUFnSUNBZ0lDQWdJQ0JuY21sa0xuUmxlSFFvYkdGaVpXd3NJSGdzSUhrc0lHZHdJRDBnWjNCaGNpaG1iMjUwYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXdnWm05dWRHWmhiV2xzZVNBOUlHWnZiblJVZVhCbEtTbGNiaUFnSUNBZ0lDQWdmU3hjYmlBZ0lDQWdJQ0FnSXlCRGRYTjBiMjFwZW1VZ2RHaGxJR2hsWVhSdFlYQWdiR0Y1YjNWMFhHNGdJQ0FnSUNBZ0lHTnNkWE4wWlhKZmNtOTNjeUE5SUZSU1ZVVXNYRzRnSUNBZ0lDQWdJSE5vYjNkZmNtOTNYMlJsYm1RZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ1kyeDFjM1JsY2w5amIyeDFiVzV6SUQwZ1JrRk1VMFVzWEc0Z0lDQWdJQ0FnSUhKdmQxOXVZVzFsYzE5bmNDQTlJR2R3WVhJb1ptOXVkSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNJR1p2Ym5SbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlNrc1hHNGdJR052YkhWdGJsOXVZVzFsYzE5bmNDQTlJR2R3WVhJb1ptOXVkSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNJR1p2Ym5SbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlNrc1hHNGdJQ0FnSUNBZ0lHaGxZWFJ0WVhCZmJHVm5aVzVrWDNCaGNtRnRJRDBnYkdsemRDaGNiaUFnSUNBZ0lDQWdJQ0JoZENBOUlHTW9NQ3dnTVN3Z01pa3NYRzRnSUNBZ0lDQWdJQ0FnYkdGaVpXeHpJRDBnWXloY1hEQmNYQ3dnWEZ3eFhGd3NJRnhjTWx4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0IwYVhSc1pWOW5jQ0E5SUdkd1lYSW9abTl1ZEdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCbWIyNTBjMmw2WlNBOUlHWnZiblJUYVhwbFV5a3NYRzRnSUNBZ0lDQWdJQ0FnYkdGaVpXeHpYMmR3SUQwZ1ozQmhjaWhtYjI1MFptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lHWnZiblJ6YVhwbElEMGdabTl1ZEZOcGVtVlRLVnh1SUNBZ0lDQWdJQ0FwWEc0cFhHNWNiaU1nWm1sc1pVNWhiV1VnUEMwZ2FHVnlaU2htYVdkRWFYSXNJRnhjYUdWaGRHMWhjRjlUUlY5bGJuSnBZMmh0Wlc1MFhGd3BYRzRqSUhkcFpIUm9JRHd0SUhCaGJtVnNVMmw2WlNneExqVXBLbTF0Vkc5SmJtTm9YRzRqSUdobGFXZG9kQ0E4TFNCd1lXNWxiRk5wZW1Vb01DNDNLU3B0YlZSdlNXNWphRnh1SXlCemRtZHNhWFJsS0hCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwTENCM2FXUjBhQ0E5SUhkcFpIUm9MQ0JvWldsbmFIUWdQV2hsYVdkb2RDbGNiaU1nY0hKcGJuUW9jQ2xjYmlNZ1pHVjJMbTltWmlncFhHNGpJSEJ1Wnlod1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1N3Z2QybGtkR2dnUFNCM2FXUjBhQ3dnYUdWcFoyaDBJRDFvWldsbmFIUXNJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRnhjYVc1Y1hDbGNiaU1nY0hKcGJuUW9jQ2xjYmlNZ1pHVjJMbTltWmlncFhHNWNiaU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNalhHNWNibVJoZEdFa2JHOXZjRlI1Y0dVZ1BDMGdabUZqZEc5eUtHUmhkR0VrYkc5dmNGUjVjR1VzSUd4bGRtVnNjeUE5SUdNb1hGeFZVQzlPVDF4Y0xDQmNYRVJQVjA1Y1hDa3BYRzVrWVhSaEpIUmhjbWRsZENBOExTQm1ZV04wYjNJb1pHRjBZU1IwWVhKblpYUXNJR3hsZG1Wc2N5QTlJR01vWEZ4WGFIbDBaU0JUUlZ4Y0xDQmNYRVI1YkdGdUlGTkZYRndwS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlHeHZiM0JVZVhCbExDQjVJRDBnZEdGeVoyVjBMQ0J6YVhwbElEMGdMV3h2WnpFd0tIQjJZV3gxWlNrc0lHWnBiR3dnUFNCdlpHUnpVbUYwYVc4cEtTQXJYRzRnSUdkbGIyMWZjRzlwYm5Rb2MyaGhjR1VnUFNBeU1Td2dJQ0FnSUNBZ0lDTWdSVzV6ZFhKbGN5QmhJSEJ2YVc1MElIZHBkR2dnWVc0Z2IzVjBiR2x1WlZ4dUlDQWdJQ0FnSUNBZ0lDQWdJSE4wY205clpTQTlJREVxY0hSVWIwMU5JQ0FnSUNBZ0l5Qk1hVzVsSUhkcFpIUm9JR1p2Y2lCMGFHVWdZbTl5WkdWeVhHNGdJQ2tnS3lCMGFHVnRaVjlpZHlncElDc2dYRzRnSUhOallXeGxYM05wZW1WZlkyOXVkR2x1ZFc5MWN5aHlZVzVuWlNBOUlHTW9NU3dnTXlrcElDc2dJQ01nVTJWMElHMXBiaUJoYm1RZ2JXRjRJSEJ2YVc1MElITnBlbVZ6SUdobGNtVmNiaUFnYzJOaGJHVmZabWxzYkY5bmNtRmthV1Z1ZEc0b1kyOXNiM0p6SUQwZ1l5aGNYQ00wT0RVeVFUQmNYQ3dnWEZ4M2FHbDBaVnhjTENCY1hDTkRRak16TTBGY1hDa3NJQ0FqSUVSbFptbHVaU0JuY21Ga2FXVnVkQ0JqYjJ4dmNuTmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllXeDFaWE1nUFNCelkyRnNaWE02T25KbGMyTmhiR1VvWXlnd0xqVXNJREVzSURFdU5Ta3BMQ0JzYVcxcGRITWdQU0JqS0RBdU5Td2dNUzQxS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSTJ4dmR5QTlJRnhjZDJocGRHVmNYQ3dnYUdsbmFDQTlJRnhjSTBOQ016TXpRVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ01nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVcxcGRITWdQU0JqS0RFc0lETXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOXZZaUE5SUhOallXeGxjem82YzNGMWFYTm9MQ0FqSUVSbFptbHVaU0JuY21Ga2FXVnVkQ0JqYjJ4dmNuTmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbmRXbGtaU0E5SUdkMWFXUmxYMk52Ykc5eVltRnlLRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZ5ZDJsa2RHZ2dQU0F4TGpVdk5TNHdPQ3dnSUNNZ1FXUnFkWE4wSUhkcFpIUm9JRzltSUhSb1pTQmpiMnh2Y2lCaVlYSmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhjbWhsYVdkb2RDQTlJREUxTHpVdU1EZ2dJQ0FqSUVGa2FuVnpkQ0JvWldsbmFIUWdiMllnZEdobElHTnZiRzl5SUdKaGNseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNsY2JpQWdLU0FyWEc0Z0lHeGhZbk1vZUNBOUlFNVZURXdzSUhrZ1BTQk9WVXhNS1NBZ0sxeHVJQ0IwYUdWdFpTaGNiaUFnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3hjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3hjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCaGJtZHNaU0E5SURRMUxDQWdJQ0FnSUNNZ1VtOTBZWFJsSUhndFlYaHBjeUJzWVdKbGJITWdORFVnWkdWbmNtVmxjMXh1SUNBZ0lDQWdhR3AxYzNRZ1BTQXhMQ0FnSUNBZ0lDQWpJRUZrYW5WemRDQm9iM0pwZW05dWRHRnNJR3AxYzNScFptbGpZWFJwYjI1Y2JpQWdJQ0FnSUhacWRYTjBJRDBnTVNBZ0lDQWdJQ0FnSXlCQlpHcDFjM1FnZG1WeWRHbGpZV3dnYW5WemRHbG1hV05oZEdsdmJseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NXNhVzVsSUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3hjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHbGphM01nUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWEZ4MGNtRnVjM0JoY21WdWRGeGNLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5a3NYRzRnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtWeHVJQ0FwWEc1Y2JtWnBiR1ZPWVcxbElEd3RJR2hsY21Vb1ptbG5SR2x5TENCY1hHaGxZWFJ0WVhCZlUwVmZaVzV5YVdOb2JXVnVkRjlrYjNSd2JHOTBYRndwWEc1M2FXUjBhQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNDRLU3B0YlZSdlNXNWphRnh1YUdWcFoyaDBJRHd0SUhCaGJtVnNVMmw2WlNneExqRXBLbTF0Vkc5SmJtTm9YRzRqSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaU1nY0hKcGJuUW9jQ2xjYmlNZ1pHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5sb29wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGVcXCkpXG5cbmdldE92ZXJsYXBMb29wTnVtIDwtIGZ1bmN0aW9uKGxvb3AsIHBlYWspe1xuICBhbmNob3IxIDwtIEdSYW5nZXMoc2VxbmFtZXMgPSBsb29wJFYxLCByYW5nZXMgPSBJUmFuZ2VzKHN0YXJ0ID0gbG9vcCRWMiwgZW5kID0gbG9vcCRWMykpXG4gIGFuY2hvcjIgPC0gR1JhbmdlcyhzZXFuYW1lcyA9IGxvb3AkVjQsIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBsb29wJFY1LCBlbmQgPSBsb29wJFY2KSlcbiAgYSA8LSBxdWVyeUhpdHMoZmluZE92ZXJsYXBzKGFuY2hvcjEsIHBlYWspKVxuICBiIDwtIHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoYW5jaG9yMiwgcGVhaykpXG4gIHJldHVybihsZW5ndGgodW5pcXVlKGMoYSwgYikpKSlcbn1cblxuZ2V0U0VPdmVybGFwRmlzaGVyIDwtIGZ1bmN0aW9uKGFsbExvb3AsIHN1YnNldExvb3AsIHBlYWspe1xuICBhbGwub3ZlcmxhcCA8LSBnZXRPdmVybGFwTG9vcE51bShhbGxMb29wLCBwZWFrKVxuICBhbGwubm90T3ZlcmxhcCA8LSBucm93KGFsbExvb3ApIC0gYWxsLm92ZXJsYXBcbiAgXG4gIHN1YnNldC5vdmVybGFwIDwtIGdldE92ZXJsYXBMb29wTnVtKHN1YnNldExvb3AsIHBlYWspXG4gIHN1YnNldC5ub3RPdmVybGFwIDwtIG5yb3coc3Vic2V0TG9vcCkgLSBzdWJzZXQub3ZlcmxhcFxuICBcbiAgY29udGluZ2VuY3lfdGFibGUgPC0gbWF0cml4KGMoc3Vic2V0Lm92ZXJsYXAsIHN1YnNldC5ub3RPdmVybGFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwub3ZlcmxhcCwgYWxsLm5vdE92ZXJsYXApLCBucm93ID0gMiwgYnlyb3cgPSBUUlVFKVxuICBjb2xuYW1lcyhjb250aW5nZW5jeV90YWJsZSkgPC0gYyhcXE92ZXJsYXBwaW5nXFwsIFxcTm90X092ZXJsYXBwaW5nXFwpXG4gIHJvd25hbWVzKGNvbnRpbmdlbmN5X3RhYmxlKSA8LSBjKFxcQWxsIGxvb3BzXFwsIFxcU3Vic2V0IGxvb3BzXFwpXG4gIFxuICAjIFBlcmZvcm0gRmlzaGVyJ3MgRXhhY3QgVGVzdFxuICBmaXNoZXJfdGVzdF9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUpXG4gIHJldHVybihmaXNoZXJfdGVzdF9yZXN1bHQpXG59XG5cblxuXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3AudXBubyA8LSBiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubylcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuXG4jIyMgRHlsYW5cbiMgU2VlZGluZ1xudGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC51cG5vLCBwZWFrLkR5bGFuLlNFKVxucmVzdWx0LnRiIDwtIHRpYmJsZShsb29wVHlwZSA9IFxcVVAvTk9cXCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gXFxEeWxhbiBTRVxcLFxuICAgICAgICAgICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cbiMgdGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC51cCwgcGVhay5EeWxhbi5TRSlcbiMgcmVzdWx0LnRiIDwtIHRpYmJsZShsb29wVHlwZSA9IFxcVVBcXCxcbiMgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBcXER5bGFuIFNFXFwsXG4jICAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuIyAgICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4jIEFkZCByb3dcbiMgdGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5ubywgcGVhay5EeWxhbi5TRSlcbiMgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4jICAgYWRkX3Jvdyhsb29wVHlwZSA9IFxcTk9cXCxcbiMgICAgICAgICAgIHRhcmdldCA9IFxcRHlsYW4gU0VcXCxcbiMgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiMgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cbnRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AuZG93biwgcGVhay5EeWxhbi5TRSlcbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICBhZGRfcm93KGxvb3BUeXBlID0gXFxET1dOXFwsXG4gICAgICAgICAgdGFyZ2V0ID0gXFxEeWxhbiBTRVxcLFxuICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG4jIyMgV2h5dGVcbiMgU2VlZGluZ1xuIyB0ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwLCBwZWFrLldoeXRlLlNFKVxuIyByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiMgICBhZGRfcm93KGxvb3BUeXBlID0gXFxVUFxcLFxuIyAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IFxcV2h5dGUgU0VcXCxcbiMgICAgICAgICAgICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4jICAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuIyBBZGQgcm93XG50ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwbm8sIHBlYWsuV2h5dGUuU0UpXG5yZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgYWRkX3Jvdyhsb29wVHlwZSA9IFxcVVAvTk9cXCxcbiAgICAgICAgICB0YXJnZXQgPSBcXFdoeXRlIFNFXFwsXG4gICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cbnRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AuZG93biwgcGVhay5XaHl0ZS5TRSlcbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICBhZGRfcm93KGxvb3BUeXBlID0gXFxET1dOXFwsXG4gICAgICAgICAgdGFyZ2V0ID0gXFxXaHl0ZSBTRVxcLFxuICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG5cbiMgVmlzdWFsaXphdGlvblxubGlicmFyeShjaXJjbGl6ZSlcbmRhdGEgPC0gcmVzdWx0LnRiXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGxvb3BUeXBlLCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGxvb3BUeXBlLCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgbG9vcFR5cGUsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBsb29wVHlwZSwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMiksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFwjNDg1MkEwXFwsIFxcd2hpdGVcXCwgXFwjQ0IzMzNBXFwpKVxuXG5wIDwtIEhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksXG4gICAgICAgIG5hbWUgPSBcXE9kZHMgUmF0aW9cXCxcbiAgICAgICAgY29sID0gY29sX2Z1bixcbiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXNcbiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7XG4gICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXVxuICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgXFxuLnMuXFwsIHNwcmludGYoXFwlLjJlXFwsIHB2YWwpKVxuICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gZm9udFNpemVTLCBmb250ZmFtaWx5ID0gZm9udFR5cGUpKVxuICAgICAgICB9LFxuICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXRcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgcm93X25hbWVzX2dwID0gZ3Bhcihmb250c2l6ZSA9IGZvbnRTaXplUywgZm9udGZhbWlseSA9IGZvbnRUeXBlKSxcbiAgY29sdW1uX25hbWVzX2dwID0gZ3Bhcihmb250c2l6ZSA9IGZvbnRTaXplUywgZm9udGZhbWlseSA9IGZvbnRUeXBlKSxcbiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KFxuICAgICAgICAgIGF0ID0gYygwLCAxLCAyKSxcbiAgICAgICAgICBsYWJlbHMgPSBjKFxcMFxcLCBcXDFcXCwgXFwyXFwpLFxuICAgICAgICAgIHRpdGxlX2dwID0gZ3Bhcihmb250ZmFtaWx5ID0gZm9udFR5cGUsIGZvbnRzaXplID0gZm9udFNpemVTKSxcbiAgICAgICAgICBsYWJlbHNfZ3AgPSBncGFyKGZvbnRmYW1pbHkgPSBmb250VHlwZSwgZm9udHNpemUgPSBmb250U2l6ZVMpXG4gICAgICAgIClcbilcblxuIyBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFxoZWF0bWFwX1NFX2VucmljaG1lbnRcXClcbiMgd2lkdGggPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbiMgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgwLjcpKm1tVG9JbmNoXG4jIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9aGVpZ2h0KVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbiMgcG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPWhlaWdodCwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuZGF0YSRsb29wVHlwZSA8LSBmYWN0b3IoZGF0YSRsb29wVHlwZSwgbGV2ZWxzID0gYyhcXFVQL05PXFwsIFxcRE9XTlxcKSlcbmRhdGEkdGFyZ2V0IDwtIGZhY3RvcihkYXRhJHRhcmdldCwgbGV2ZWxzID0gYyhcXFdoeXRlIFNFXFwsIFxcRHlsYW4gU0VcXCkpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gbG9vcFR5cGUsIHkgPSB0YXJnZXQsIHNpemUgPSAtbG9nMTAocHZhbHVlKSwgZmlsbCA9IG9kZHNSYXRpbykpICtcbiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lXG4gICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0gICAgICAjIExpbmUgd2lkdGggZm9yIHRoZSBib3JkZXJcbiAgKSArIHRoZW1lX2J3KCkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCAzKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnMgPSBjKFxcIzQ4NTJBMFxcLCBcXHdoaXRlXFwsIFxcI0NCMzMzQVxcKSwgICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHNjYWxlczo6cmVzY2FsZShjKDAuNSwgMSwgMS41KSksIGxpbWl0cyA9IGMoMC41LCAxLjUpLCBcbiAgICAgICAgICAgICAgICAgICAgICAjbG93ID0gXFx3aGl0ZVxcLCBoaWdoID0gXFwjQ0IzMzNBXFwsXG4gICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICtcbiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcaGVhdG1hcF9TRV9lbnJpY2htZW50X2RvdHBsb3RcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjgpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMSkqbW1Ub0luY2hcbiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyBwcmludChwKVxuIyBkZXYub2ZmKClcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxubG9vcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlXFwpKVxuXG5nZXRPdmVybGFwTG9vcE51bSA8LSBmdW5jdGlvbihsb29wLCBwZWFrKXtcbiAgYW5jaG9yMSA8LSBHUmFuZ2VzKHNlcW5hbWVzID0gbG9vcCRWMSwgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGxvb3AkVjIsIGVuZCA9IGxvb3AkVjMpKVxuICBhbmNob3IyIDwtIEdSYW5nZXMoc2VxbmFtZXMgPSBsb29wJFY0LCByYW5nZXMgPSBJUmFuZ2VzKHN0YXJ0ID0gbG9vcCRWNSwgZW5kID0gbG9vcCRWNikpXG4gIGEgPC0gcXVlcnlIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IxLCBwZWFrKSlcbiAgYiA8LSBxdWVyeUhpdHMoZmluZE92ZXJsYXBzKGFuY2hvcjIsIHBlYWspKVxuICByZXR1cm4obGVuZ3RoKHVuaXF1ZShjKGEsIGIpKSkpXG59XG5cbmdldFNFT3ZlcmxhcEZpc2hlciA8LSBmdW5jdGlvbihhbGxMb29wLCBzdWJzZXRMb29wLCBwZWFrKXtcbiAgYWxsLm92ZXJsYXAgPC0gZ2V0T3ZlcmxhcExvb3BOdW0oYWxsTG9vcCwgcGVhaylcbiAgYWxsLm5vdE92ZXJsYXAgPC0gbnJvdyhhbGxMb29wKSAtIGFsbC5vdmVybGFwXG4gIFxuICBzdWJzZXQub3ZlcmxhcCA8LSBnZXRPdmVybGFwTG9vcE51bShzdWJzZXRMb29wLCBwZWFrKVxuICBzdWJzZXQubm90T3ZlcmxhcCA8LSBucm93KHN1YnNldExvb3ApIC0gc3Vic2V0Lm92ZXJsYXBcbiAgXG4gIGNvbnRpbmdlbmN5X3RhYmxlIDwtIG1hdHJpeChjKHN1YnNldC5vdmVybGFwLCBzdWJzZXQubm90T3ZlcmxhcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLm92ZXJsYXAsIGFsbC5ub3RPdmVybGFwKSwgbnJvdyA9IDIsIGJ5cm93ID0gVFJVRSlcbiAgY29sbmFtZXMoY29udGluZ2VuY3lfdGFibGUpIDwtIGMoXFxPdmVybGFwcGluZ1xcLCBcXE5vdF9PdmVybGFwcGluZ1xcKVxuICByb3duYW1lcyhjb250aW5nZW5jeV90YWJsZSkgPC0gYyhcXEFsbCBsb29wc1xcLCBcXFN1YnNldCBsb29wc1xcKVxuICBcbiAgIyBQZXJmb3JtIEZpc2hlcidzIEV4YWN0IFRlc3RcbiAgZmlzaGVyX3Rlc3RfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlKVxuICByZXR1cm4oZmlzaGVyX3Rlc3RfcmVzdWx0KVxufVxuXG5cblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLnVwbm8gPC0gYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcblxuIyMjIER5bGFuXG4jIFNlZWRpbmdcbnRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AudXBubywgcGVhay5EeWxhbi5TRSlcbnJlc3VsdC50YiA8LSB0aWJibGUobG9vcFR5cGUgPSBcXFVQL05PXFwsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IFxcRHlsYW4gU0VcXCxcbiAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG4jIHRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AudXAsIHBlYWsuRHlsYW4uU0UpXG4jIHJlc3VsdC50YiA8LSB0aWJibGUobG9vcFR5cGUgPSBcXFVQXFwsXG4jICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gXFxEeWxhbiBTRVxcLFxuIyAgICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiMgICAgICAgICAgICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuIyBBZGQgcm93XG4jIHRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3Aubm8sIHBlYWsuRHlsYW4uU0UpXG4jIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuIyAgIGFkZF9yb3cobG9vcFR5cGUgPSBcXE5PXFwsXG4jICAgICAgICAgICB0YXJnZXQgPSBcXER5bGFuIFNFXFwsXG4jICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4jICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG50ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLmRvd24sIHBlYWsuRHlsYW4uU0UpXG5yZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgYWRkX3Jvdyhsb29wVHlwZSA9IFxcRE9XTlxcLFxuICAgICAgICAgIHRhcmdldCA9IFxcRHlsYW4gU0VcXCxcbiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuIyMjIFdoeXRlXG4jIFNlZWRpbmdcbiMgdGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC51cCwgcGVhay5XaHl0ZS5TRSlcbiMgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4jICAgYWRkX3Jvdyhsb29wVHlwZSA9IFxcVVBcXCxcbiMgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBcXFdoeXRlIFNFXFwsXG4jICAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuIyAgICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cbiMgQWRkIHJvd1xudGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC51cG5vLCBwZWFrLldoeXRlLlNFKVxucmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gIGFkZF9yb3cobG9vcFR5cGUgPSBcXFVQL05PXFwsXG4gICAgICAgICAgdGFyZ2V0ID0gXFxXaHl0ZSBTRVxcLFxuICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG50ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLmRvd24sIHBlYWsuV2h5dGUuU0UpXG5yZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgYWRkX3Jvdyhsb29wVHlwZSA9IFxcRE9XTlxcLFxuICAgICAgICAgIHRhcmdldCA9IFxcV2h5dGUgU0VcXCxcbiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5kYXRhIDwtIHJlc3VsdC50YlxuaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBsb29wVHlwZSwgb2Rkc1JhdGlvKSAlPiVcbnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBsb29wVHlwZSwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxucHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGxvb3BUeXBlLCBwdmFsdWUpICU+JVxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbG9vcFR5cGUsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDIpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcIzQ4NTJBMFxcLCBcXHdoaXRlXFwsIFxcI0NCMzMzQVxcKSlcblxucCA8LSBIZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLFxuICAgICAgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4sXG4gICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzXG4gICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkge1xuICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal1cbiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsIFxcbi5zLlxcLCBzcHJpbnRmKFxcJS4yZVxcLCBwdmFsKSlcbiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IGZvbnRTaXplUywgZm9udGZhbWlseSA9IGZvbnRUeXBlKSlcbiAgICAgICAgfSxcbiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0XG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIHJvd19uYW1lc19ncCA9IGdwYXIoZm9udHNpemUgPSBmb250U2l6ZVMsIGZvbnRmYW1pbHkgPSBmb250VHlwZSksXG4gIGNvbHVtbl9uYW1lc19ncCA9IGdwYXIoZm9udHNpemUgPSBmb250U2l6ZVMsIGZvbnRmYW1pbHkgPSBmb250VHlwZSksXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChcbiAgICAgICAgICBhdCA9IGMoMCwgMSwgMiksXG4gICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcKSxcbiAgICAgICAgICB0aXRsZV9ncCA9IGdwYXIoZm9udGZhbWlseSA9IGZvbnRUeXBlLCBmb250c2l6ZSA9IGZvbnRTaXplUyksXG4gICAgICAgICAgbGFiZWxzX2dwID0gZ3Bhcihmb250ZmFtaWx5ID0gZm9udFR5cGUsIGZvbnRzaXplID0gZm9udFNpemVTKVxuICAgICAgICApXG4pXG5cbiMgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcaGVhdG1hcF9TRV9lbnJpY2htZW50XFwpXG4jIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG4jIGhlaWdodCA8LSBwYW5lbFNpemUoMC43KSptbVRvSW5jaFxuIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPWhlaWdodClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG4jIHBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID1oZWlnaHQsIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbmRhdGEkbG9vcFR5cGUgPC0gZmFjdG9yKGRhdGEkbG9vcFR5cGUsIGxldmVscyA9IGMoXFxVUC9OT1xcLCBcXERPV05cXCkpXG5kYXRhJHRhcmdldCA8LSBmYWN0b3IoZGF0YSR0YXJnZXQsIGxldmVscyA9IGMoXFxXaHl0ZSBTRVxcLCBcXER5bGFuIFNFXFwpKVxuXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGxvb3BUeXBlLCB5ID0gdGFyZ2V0LCBzaXplID0gLWxvZzEwKHB2YWx1ZSksIGZpbGwgPSBvZGRzUmF0aW8pKSArXG4gIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZVxuICAgICAgICAgICAgIHN0cm9rZSA9IDEqcHRUb01NICAgICAgIyBMaW5lIHdpZHRoIGZvciB0aGUgYm9yZGVyXG4gICkgKyB0aGVtZV9idygpICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgMykpICsgICMgU2V0IG1pbiBhbmQgbWF4IHBvaW50IHNpemVzIGhlcmVcbiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3JzID0gYyhcXCM0ODUyQTBcXCwgXFx3aGl0ZVxcLCBcXCNDQjMzM0FcXCksICAjIERlZmluZSBncmFkaWVudCBjb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBzY2FsZXM6OnJlc2NhbGUoYygwLjUsIDEsIDEuNSkpLCBsaW1pdHMgPSBjKDAuNSwgMS41KSwgXG4gICAgICAgICAgICAgICAgICAgICAgI2xvdyA9IFxcd2hpdGVcXCwgaGlnaCA9IFxcI0NCMzMzQVxcLFxuICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEsIDMpLFxuICAgICAgICAgICAgICAgICAgICAgIG9vYiA9IHNjYWxlczo6c3F1aXNoLCAjIERlZmluZSBncmFkaWVudCBjb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgKSArXG4gIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXGhlYXRtYXBfU0VfZW5yaWNobWVudF9kb3RwbG90XFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMS44KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjEpKm1tVG9JbmNoXG4jIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgcHJpbnQocClcbiMgZGV2Lm9mZigpXG5zdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
name <- \chromo_cons_annoHierarchy\
loop <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\))

getOverlapLoopNum <- function(loop, peak){
  anchor1 <- GRanges(seqnames = loop$V1, ranges = IRanges(start = loop$V2, end = loop$V3))
  anchor2 <- GRanges(seqnames = loop$V4, ranges = IRanges(start = loop$V5, end = loop$V6))
  a <- queryHits(findOverlaps(anchor1, peak))
  b <- queryHits(findOverlaps(anchor2, peak))
  return(length(unique(c(a, b))))
}

getSEOverlapFisher <- function(allLoop, subsetLoop, peak){
  all.overlap <- getOverlapLoopNum(allLoop, peak)
  all.notOverlap <- nrow(allLoop) - all.overlap
  
  subset.overlap <- getOverlapLoopNum(subsetLoop, peak)
  subset.notOverlap <- nrow(subsetLoop) - subset.overlap
  
  contingency_table <- matrix(c(subset.overlap, subset.notOverlap,
                                all.overlap, all.notOverlap), nrow = 2, byrow = TRUE)
  colnames(contingency_table) <- c(\Overlapping\, \Not_Overlapping\)
  rownames(contingency_table) <- c(\All loops\, \Subset loops\)
  
  # Perform Fisher's Exact Test
  fisher_test_result <- fisher.test(contingency_table)
  return(fisher_test_result)
}



loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
loop.upno <- bind_rows(loop.up, loop.no)
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))

### Dylan
# Seeding
temp <- getSEOverlapFisher(loop, loop.upno, peak.Dylan.SE)
result.tb <- tibble(loopType = \UP/NO\,
                    target = \Dylan SE\,
                    pvalue = temp$p.value,
                    oddsRatio = temp$estimate)

# temp <- getSEOverlapFisher(loop, loop.up, peak.Dylan.SE)
# result.tb <- tibble(loopType = \UP\,
#                     target = \Dylan SE\,
#                     pvalue = temp$p.value,
#                     oddsRatio = temp$estimate)
# Add row
# temp <- getSEOverlapFisher(loop, loop.no, peak.Dylan.SE)
# result.tb <- result.tb %>% 
#   add_row(loopType = \NO\,
#           target = \Dylan SE\,
#           pvalue = temp$p.value,
#           oddsRatio = temp$estimate)

temp <- getSEOverlapFisher(loop, loop.down, peak.Dylan.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \DOWN\,
          target = \Dylan SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

### Whyte
# Seeding
# temp <- getSEOverlapFisher(loop, loop.up, peak.Whyte.SE)
# result.tb <- result.tb %>% 
#   add_row(loopType = \UP\,
#                     target = \Whyte SE\,
#                     pvalue = temp$p.value,
#                     oddsRatio = temp$estimate)

# Add row
temp <- getSEOverlapFisher(loop, loop.upno, peak.Whyte.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \UP/NO\,
          target = \Whyte SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

temp <- getSEOverlapFisher(loop, loop.down, peak.Whyte.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \DOWN\,
          target = \Whyte SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)


# Visualization
library(circlize)
data <- result.tb
heatmap_data <- data %>% dplyr::select(target, loopType, oddsRatio) %>%
pivot_wider(names_from = loopType, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, loopType, pvalue) %>%
  pivot_wider(names_from = loopType, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 2), 
                      c(\#4852A0\, \white\, \#CB333A\))

p <- Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = fontSizeS, fontfamily = fontType))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        row_names_gp = gpar(fontsize = fontSizeS, fontfamily = fontType),
  column_names_gp = gpar(fontsize = fontSizeS, fontfamily = fontType),
        heatmap_legend_param = list(
          at = c(0, 1, 2),
          labels = c(\0\, \1\, \2\),
          title_gp = gpar(fontfamily = fontType, fontsize = fontSizeS),
          labels_gp = gpar(fontfamily = fontType, fontsize = fontSizeS)
        )
)

# fileName <- here(figDir, \heatmap_SE_enrichment\)
# width <- panelSize(1.5)*mmToInch
# height <- panelSize(0.7)*mmToInch
# svglite(paste0(fileName, \.svg\), width = width, height =height)
# print(p)
# dev.off()
# png(paste0(fileName, \.png\), width = width, height =height, res = 600, unit = \in\)
# print(p)
# dev.off()

#######################

data$loopType <- factor(data$loopType, levels = c(\UP/NO\, \DOWN\))
data$target <- factor(data$target, levels = c(\Whyte SE\, \Dylan SE\))

p <- ggplot(data, aes(x = loopType, y = target, size = -log10(pvalue), fill = oddsRatio)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(1, 3)) +  # Set min and max point sizes here
  scale_fill_gradientn(colors = c(\#4852A0\, \white\, \#CB333A\),  # Define gradient colors
                      values = scales::rescale(c(0.5, 1, 1.5)), limits = c(0.5, 1.5), 
                      #low = \white\, high = \#CB333A\,
                      #                  limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) +
  labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- here(figDir, \heatmap_SE_enrichment_dotplot\)
width <- panelSize(1.8)*mmToInch
height <- panelSize(1.1)*mmToInch
# png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# print(p)
# dev.off()
svglite(paste0(fileName, \.svg\),  height = height, width = width)
print(p)
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


## [2.27] Overlap with SE?
#### Q1. How many SEs are covered with Micro-C loops?

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1Ykc5dmNDQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbExtSmxaSEJsWENJcEtWeHVYRzVuWlhSUGRtVnliR0Z3VEc5dmNFNTFiU0E4TFNCbWRXNWpkR2x2Ymloc2IyOXdMQ0J3WldGcktYdGNiaUFnWVc1amFHOXlNU0E4TFNCSFVtRnVaMlZ6S0hObGNXNWhiV1Z6SUQwZ2JHOXZjQ1JXTVN3Z2NtRnVaMlZ6SUQwZ1NWSmhibWRsY3loemRHRnlkQ0E5SUd4dmIzQWtWaklzSUdWdVpDQTlJR3h2YjNBa1ZqTXBLVnh1SUNCaGJtTm9iM0l5SUR3dElFZFNZVzVuWlhNb2MyVnhibUZ0WlhNZ1BTQnNiMjl3SkZZMExDQnlZVzVuWlhNZ1BTQkpVbUZ1WjJWektITjBZWEowSUQwZ2JHOXZjQ1JXTlN3Z1pXNWtJRDBnYkc5dmNDUldOaWtwWEc0Z0lHRWdQQzBnY1hWbGNubElhWFJ6S0dacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJeExDQndaV0ZyS1NsY2JpQWdZaUE4TFNCeGRXVnllVWhwZEhNb1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNqSXNJSEJsWVdzcEtWeHVJQ0J5WlhSMWNtNG9iR1Z1WjNSb0tIVnVhWEYxWlNoaktHRXNJR0lwS1NrcFhHNTlYRzVjYm1kbGRGTkZUM1psY214aGNFWnBjMmhsY2lBOExTQm1kVzVqZEdsdmJpaGhiR3hNYjI5d0xDQnpkV0p6WlhSTWIyOXdMQ0J3WldGcktYdGNiaUFnWVd4c0xtOTJaWEpzWVhBZ1BDMGdaMlYwVDNabGNteGhjRXh2YjNCT2RXMG9ZV3hzVEc5dmNDd2djR1ZoYXlsY2JpQWdZV3hzTG01dmRFOTJaWEpzWVhBZ1BDMGdibkp2ZHloaGJHeE1iMjl3S1NBdElHRnNiQzV2ZG1WeWJHRndYRzRnSUZ4dUlDQnpkV0p6WlhRdWIzWmxjbXhoY0NBOExTQm5aWFJQZG1WeWJHRndURzl2Y0U1MWJTaHpkV0p6WlhSTWIyOXdMQ0J3WldGcktWeHVJQ0J6ZFdKelpYUXVibTkwVDNabGNteGhjQ0E4TFNCdWNtOTNLSE4xWW5ObGRFeHZiM0FwSUMwZ2MzVmljMlYwTG05MlpYSnNZWEJjYmlBZ1hHNGdJR052Ym5ScGJtZGxibU41WDNSaFlteGxJRHd0SUcxaGRISnBlQ2hqS0hOMVluTmxkQzV2ZG1WeWJHRndMQ0J6ZFdKelpYUXVibTkwVDNabGNteGhjQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZV3hzTG05MlpYSnNZWEFzSUdGc2JDNXViM1JQZG1WeWJHRndLU3dnYm5KdmR5QTlJRElzSUdKNWNtOTNJRDBnVkZKVlJTbGNiaUFnWTI5c2JtRnRaWE1vWTI5dWRHbHVaMlZ1WTNsZmRHRmliR1VwSUR3dElHTW9YQ0pQZG1WeWJHRndjR2x1WjF3aUxDQmNJazV2ZEY5UGRtVnliR0Z3Y0dsdVoxd2lLVnh1SUNCeWIzZHVZVzFsY3loamIyNTBhVzVuWlc1amVWOTBZV0pzWlNrZ1BDMGdZeWhjSWtGc2JDQnNiMjl3YzF3aUxDQmNJbE4xWW5ObGRDQnNiMjl3YzF3aUtWeHVJQ0JjYmlBZ0l5QlFaWEptYjNKdElFWnBjMmhsY2lkeklFVjRZV04wSUZSbGMzUmNiaUFnWm1semFHVnlYM1JsYzNSZmNtVnpkV3gwSUR3dElHWnBjMmhsY2k1MFpYTjBLR052Ym5ScGJtZGxibU41WDNSaFlteGxLVnh1SUNCeVpYUjFjbTRvWm1semFHVnlYM1JsYzNSZmNtVnpkV3gwS1Z4dWZWeHVYRzVjYmx4dWJHOXZjQzUxY0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDBFME9EVjJjMFJOVTA5ZlZWQmZaR2xtWmpBdU1pNWlaV1J3WlZ3aUtTbGNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pWOUJORGcxZG5ORVRWTlBYMDVQWDJScFptWXdMakl1WW1Wa2NHVmNJaWtwWEc1c2IyOXdMbVJ2ZDI0Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5Qk5EZzFkbk5FVFZOUFgwUlBWMDVmWkdsbVpqQXVNaTVpWldSd1pWd2lLU2xjYmx4dUl5TWpJRVI1YkdGdVhHNGpJRk5sWldScGJtZGNiblJsYlhBZ1BDMGdaMlYwVTBWUGRtVnliR0Z3Um1semFHVnlLR3h2YjNBc0lHeHZiM0F1ZFhBc0lIQmxZV3N1Ukhsc1lXNHVVMFVwWEc1eVpYTjFiSFF1ZEdJZ1BDMGdkR2xpWW14bEtHeHZiM0JVZVhCbElEMGdYQ0pWVUZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwWVhKblpYUWdQU0JjSWtSNWJHRnVJRk5GWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEIyWVd4MVpTQTlJSFJsYlhBa2NDNTJZV3gxWlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiMlJrYzFKaGRHbHZJRDBnZEdWdGNDUmxjM1JwYldGMFpTbGNiaU1nUVdSa0lISnZkMXh1ZEdWdGNDQThMU0JuWlhSVFJVOTJaWEpzWVhCR2FYTm9aWElvYkc5dmNDd2diRzl2Y0M1dWJ5d2djR1ZoYXk1RWVXeGhiaTVUUlNsY2JuSmxjM1ZzZEM1MFlpQThMU0J5WlhOMWJIUXVkR0lnSlQ0bElGeHVJQ0JoWkdSZmNtOTNLR3h2YjNCVWVYQmxJRDBnWENKT1Qxd2lMRnh1SUNBZ0lDQWdJQ0FnSUhSaGNtZGxkQ0E5SUZ3aVJIbHNZVzRnVTBWY0lpeGNiaUFnSUNBZ0lDQWdJQ0J3ZG1Gc2RXVWdQU0IwWlcxd0pIQXVkbUZzZFdVc1hHNGdJQ0FnSUNBZ0lDQWdiMlJrYzFKaGRHbHZJRDBnZEdWdGNDUmxjM1JwYldGMFpTbGNibHh1ZEdWdGNDQThMU0JuWlhSVFJVOTJaWEpzWVhCR2FYTm9aWElvYkc5dmNDd2diRzl2Y0M1a2IzZHVMQ0J3WldGckxrUjViR0Z1TGxORktWeHVjbVZ6ZFd4MExuUmlJRHd0SUhKbGMzVnNkQzUwWWlBbFBpVWdYRzRnSUdGa1pGOXliM2NvYkc5dmNGUjVjR1VnUFNCY0lrUlBWMDVjSWl4Y2JpQWdJQ0FnSUNBZ0lDQjBZWEpuWlhRZ1BTQmNJa1I1YkdGdUlGTkZYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ2NIWmhiSFZsSUQwZ2RHVnRjQ1J3TG5aaGJIVmxMRnh1SUNBZ0lDQWdJQ0FnSUc5a1pITlNZWFJwYnlBOUlIUmxiWEFrWlhOMGFXMWhkR1VwWEc1Y2JpTWpJeUJYYUhsMFpWeHVJeUJUWldWa2FXNW5YRzUwWlcxd0lEd3RJR2RsZEZORlQzWmxjbXhoY0VacGMyaGxjaWhzYjI5d0xDQnNiMjl3TG5Wd0xDQndaV0ZyTGxkb2VYUmxMbE5GS1Z4dWNtVnpkV3gwTG5SaUlEd3RJSEpsYzNWc2RDNTBZaUFsUGlVZ1hHNGdJR0ZrWkY5eWIzY29iRzl2Y0ZSNWNHVWdQU0JjSWxWUVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSaGNtZGxkQ0E5SUZ3aVYyaDVkR1VnVTBWY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0haaGJIVmxJRDBnZEdWdGNDUndMblpoYkhWbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2WkdSelVtRjBhVzhnUFNCMFpXMXdKR1Z6ZEdsdFlYUmxLVnh1SXlCQlpHUWdjbTkzWEc1MFpXMXdJRHd0SUdkbGRGTkZUM1psY214aGNFWnBjMmhsY2loc2IyOXdMQ0JzYjI5d0xtNXZMQ0J3WldGckxsZG9lWFJsTGxORktWeHVjbVZ6ZFd4MExuUmlJRHd0SUhKbGMzVnNkQzUwWWlBbFBpVWdYRzRnSUdGa1pGOXliM2NvYkc5dmNGUjVjR1VnUFNCY0lrNVBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ2RHRnlaMlYwSUQwZ1hDSlhhSGwwWlNCVFJWd2lMRnh1SUNBZ0lDQWdJQ0FnSUhCMllXeDFaU0E5SUhSbGJYQWtjQzUyWVd4MVpTeGNiaUFnSUNBZ0lDQWdJQ0J2WkdSelVtRjBhVzhnUFNCMFpXMXdKR1Z6ZEdsdFlYUmxLVnh1WEc1MFpXMXdJRHd0SUdkbGRGTkZUM1psY214aGNFWnBjMmhsY2loc2IyOXdMQ0JzYjI5d0xtUnZkMjRzSUhCbFlXc3VWMmg1ZEdVdVUwVXBYRzV5WlhOMWJIUXVkR0lnUEMwZ2NtVnpkV3gwTG5SaUlDVStKU0JjYmlBZ1lXUmtYM0p2ZHloc2IyOXdWSGx3WlNBOUlGd2lSRTlYVGx3aUxGeHVJQ0FnSUNBZ0lDQWdJSFJoY21kbGRDQTlJRndpVjJoNWRHVWdVMFZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQndkbUZzZFdVZ1BTQjBaVzF3SkhBdWRtRnNkV1VzWEc0Z0lDQWdJQ0FnSUNBZ2IyUmtjMUpoZEdsdklEMGdkR1Z0Y0NSbGMzUnBiV0YwWlNsY2JseHVYRzRqSUZacGMzVmhiR2w2WVhScGIyNWNibXhwWW5KaGNua29ZMmx5WTJ4cGVtVXBYRzVrWVhSaElEd3RJSEpsYzNWc2RDNTBZbHh1YUdWaGRHMWhjRjlrWVhSaElEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RHRnlaMlYwTENCc2IyOXdWSGx3WlN3Z2IyUmtjMUpoZEdsdktTQWxQaVZjYm5CcGRtOTBYM2RwWkdWeUtHNWhiV1Z6WDJaeWIyMGdQU0JzYjI5d1ZIbHdaU3dnZG1Gc2RXVnpYMlp5YjIwZ1BTQnZaR1J6VW1GMGFXOHBJQ1UrSlZ4dUlDQmpiMngxYlc1ZmRHOWZjbTkzYm1GdFpYTW9kbUZ5SUQwZ1hDSjBZWEpuWlhSY0lpbGNibHh1Y0haaGJIVmxYMlJoZEdFZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMFlYSm5aWFFzSUd4dmIzQlVlWEJsTENCd2RtRnNkV1VwSUNVK0pWeHVJQ0J3YVhadmRGOTNhV1JsY2lodVlXMWxjMTltY205dElEMGdiRzl2Y0ZSNWNHVXNJSFpoYkhWbGMxOW1jbTl0SUQwZ2NIWmhiSFZsS1NBbFBpVmNiaUFnWTI5c2RXMXVYM1J2WDNKdmQyNWhiV1Z6S0haaGNpQTlJRndpZEdGeVoyVjBYQ0lwWEc1Y2JtTnZiRjltZFc0Z1BDMGdZMjlzYjNKU1lXMXdNaWhqS0RBc0lERXNJRFVwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqS0Z3aVlteDFaVndpTENCY0luZG9hWFJsWENJc0lGd2ljbVZrWENJcEtWeHVYRzVJWldGMGJXRndLR0Z6TG0xaGRISnBlQ2hvWldGMGJXRndYMlJoZEdFcExGeHVJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1hDSlBaR1J6SUZKaGRHbHZYQ0lzWEc0Z0lDQWdJQ0FnSUdOdmJDQTlJR052YkY5bWRXNHNYRzRnSUNBZ0lDQWdJQ01nUVdSa0lHRnVibTkwWVhScGIyNGdabTl5SUhBdGRtRnNkV1Z6WEc0Z0lDQWdJQ0FnSUdObGJHeGZablZ1SUQwZ1puVnVZM1JwYjI0b2Fpd2dhU3dnZUN3Z2VTd2dkMmxrZEdnc0lHaGxhV2RvZEN3Z1ptbHNiQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lIQjJZV3dnUEMwZ2NIWmhiSFZsWDJSaGRHRmJhU3dnYWwxY2JpQWdJQ0FnSUNBZ0lDQnNZV0psYkNBOExTQnBabVZzYzJVb2NIWmhiQ0ErSURBdU1EVXNJRndpYmk1ekxsd2lMQ0J6Y0hKcGJuUm1LRndpSlM0eVpWd2lMQ0J3ZG1Gc0tTbGNiaUFnSUNBZ0lDQWdJQ0JuY21sa0xuUmxlSFFvYkdGaVpXd3NJSGdzSUhrc0lHZHdJRDBnWjNCaGNpaG1iMjUwYzJsNlpTQTlJREV3S1NsY2JpQWdJQ0FnSUNBZ2ZTeGNiaUFnSUNBZ0lDQWdJeUJEZFhOMGIyMXBlbVVnZEdobElHaGxZWFJ0WVhBZ2JHRjViM1YwWEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpmY205M2N5QTlJRlJTVlVVc1hHNGdJQ0FnSUNBZ0lITm9iM2RmY205M1gyUmxibVFnUFNCR1FVeFRSU3hjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjbDlqYjJ4MWJXNXpJRDBnUmtGTVUwVXNYRzRnSUNBZ0lDQWdJR052YkhWdGJsOTBhWFJzWlNBOUlGd2lTVzUwWlhKbGMzUmNJaXhjYmlBZ0lDQWdJQ0FnY205M1gzUnBkR3hsSUQwZ1hDSlVZWEpuWlhSY0lpeGNiaUFnSUNBZ0lDQWdhR1ZoZEcxaGNGOXNaV2RsYm1SZmNHRnlZVzBnUFNCc2FYTjBLR0YwSUQwZ1l5Z3dMQ0F4TENBeUxDQXpMQ0EwTENBMUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWVdKbGJITWdQU0JqS0Z3aU1Gd2lMQ0JjSWpGY0lpd2dYQ0l5WENJc0lGd2lNMXdpTENCY0lqUmNJaXdnWENJMVhDSXBLU2xjYmx4dVhHNWNibUJnWUNKOSAtLT5cblxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxubG9vcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlXFwpKVxuXG5nZXRPdmVybGFwTG9vcE51bSA8LSBmdW5jdGlvbihsb29wLCBwZWFrKXtcbiAgYW5jaG9yMSA8LSBHUmFuZ2VzKHNlcW5hbWVzID0gbG9vcCRWMSwgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGxvb3AkVjIsIGVuZCA9IGxvb3AkVjMpKVxuICBhbmNob3IyIDwtIEdSYW5nZXMoc2VxbmFtZXMgPSBsb29wJFY0LCByYW5nZXMgPSBJUmFuZ2VzKHN0YXJ0ID0gbG9vcCRWNSwgZW5kID0gbG9vcCRWNikpXG4gIGEgPC0gcXVlcnlIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IxLCBwZWFrKSlcbiAgYiA8LSBxdWVyeUhpdHMoZmluZE92ZXJsYXBzKGFuY2hvcjIsIHBlYWspKVxuICByZXR1cm4obGVuZ3RoKHVuaXF1ZShjKGEsIGIpKSkpXG59XG5cbmdldFNFT3ZlcmxhcEZpc2hlciA8LSBmdW5jdGlvbihhbGxMb29wLCBzdWJzZXRMb29wLCBwZWFrKXtcbiAgYWxsLm92ZXJsYXAgPC0gZ2V0T3ZlcmxhcExvb3BOdW0oYWxsTG9vcCwgcGVhaylcbiAgYWxsLm5vdE92ZXJsYXAgPC0gbnJvdyhhbGxMb29wKSAtIGFsbC5vdmVybGFwXG4gIFxuICBzdWJzZXQub3ZlcmxhcCA8LSBnZXRPdmVybGFwTG9vcE51bShzdWJzZXRMb29wLCBwZWFrKVxuICBzdWJzZXQubm90T3ZlcmxhcCA8LSBucm93KHN1YnNldExvb3ApIC0gc3Vic2V0Lm92ZXJsYXBcbiAgXG4gIGNvbnRpbmdlbmN5X3RhYmxlIDwtIG1hdHJpeChjKHN1YnNldC5vdmVybGFwLCBzdWJzZXQubm90T3ZlcmxhcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLm92ZXJsYXAsIGFsbC5ub3RPdmVybGFwKSwgbnJvdyA9IDIsIGJ5cm93ID0gVFJVRSlcbiAgY29sbmFtZXMoY29udGluZ2VuY3lfdGFibGUpIDwtIGMoXFxPdmVybGFwcGluZ1xcLCBcXE5vdF9PdmVybGFwcGluZ1xcKVxuICByb3duYW1lcyhjb250aW5nZW5jeV90YWJsZSkgPC0gYyhcXEFsbCBsb29wc1xcLCBcXFN1YnNldCBsb29wc1xcKVxuICBcbiAgIyBQZXJmb3JtIEZpc2hlcidzIEV4YWN0IFRlc3RcbiAgZmlzaGVyX3Rlc3RfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlKVxuICByZXR1cm4oZmlzaGVyX3Rlc3RfcmVzdWx0KVxufVxuXG5cblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcblxuIyMjIER5bGFuXG4jIFNlZWRpbmdcbnRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AudXAsIHBlYWsuRHlsYW4uU0UpXG5yZXN1bHQudGIgPC0gdGliYmxlKGxvb3BUeXBlID0gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBcXER5bGFuIFNFXFwsXG4gICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiMgQWRkIHJvd1xudGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5ubywgcGVhay5EeWxhbi5TRSlcbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICBhZGRfcm93KGxvb3BUeXBlID0gXFxOT1xcLFxuICAgICAgICAgIHRhcmdldCA9IFxcRHlsYW4gU0VcXCxcbiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxudGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5kb3duLCBwZWFrLkR5bGFuLlNFKVxucmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gIGFkZF9yb3cobG9vcFR5cGUgPSBcXERPV05cXCxcbiAgICAgICAgICB0YXJnZXQgPSBcXER5bGFuIFNFXFwsXG4gICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cbiMjIyBXaHl0ZVxuIyBTZWVkaW5nXG50ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwLCBwZWFrLldoeXRlLlNFKVxucmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gIGFkZF9yb3cobG9vcFR5cGUgPSBcXFVQXFwsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IFxcV2h5dGUgU0VcXCxcbiAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuIyBBZGQgcm93XG50ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLm5vLCBwZWFrLldoeXRlLlNFKVxucmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gIGFkZF9yb3cobG9vcFR5cGUgPSBcXE5PXFwsXG4gICAgICAgICAgdGFyZ2V0ID0gXFxXaHl0ZSBTRVxcLFxuICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG50ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLmRvd24sIHBlYWsuV2h5dGUuU0UpXG5yZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgYWRkX3Jvdyhsb29wVHlwZSA9IFxcRE9XTlxcLFxuICAgICAgICAgIHRhcmdldCA9IFxcV2h5dGUgU0VcXCxcbiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5kYXRhIDwtIHJlc3VsdC50YlxuaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBsb29wVHlwZSwgb2Rkc1JhdGlvKSAlPiVcbnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBsb29wVHlwZSwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxucHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGxvb3BUeXBlLCBwdmFsdWUpICU+JVxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbG9vcFR5cGUsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDUpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5IZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLFxuICAgICAgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4sXG4gICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzXG4gICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkge1xuICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal1cbiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsIFxcbi5zLlxcLCBzcHJpbnRmKFxcJS4yZVxcLCBwdmFsKSlcbiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSlcbiAgICAgICAgfSxcbiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0XG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIGNvbHVtbl90aXRsZSA9IFxcSW50ZXJlc3RcXCxcbiAgICAgICAgcm93X3RpdGxlID0gXFxUYXJnZXRcXCxcbiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGF0ID0gYygwLCAxLCAyLCAzLCA0LCA1KSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKFxcMFxcLCBcXDFcXCwgXFwyXFwsIFxcM1xcLCBcXDRcXCwgXFw1XFwpKSlcblxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
name <- \chromo_cons_annoHierarchy\
loop <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\))

getOverlapLoopNum <- function(loop, peak){
  anchor1 <- GRanges(seqnames = loop$V1, ranges = IRanges(start = loop$V2, end = loop$V3))
  anchor2 <- GRanges(seqnames = loop$V4, ranges = IRanges(start = loop$V5, end = loop$V6))
  a <- queryHits(findOverlaps(anchor1, peak))
  b <- queryHits(findOverlaps(anchor2, peak))
  return(length(unique(c(a, b))))
}

getSEOverlapFisher <- function(allLoop, subsetLoop, peak){
  all.overlap <- getOverlapLoopNum(allLoop, peak)
  all.notOverlap <- nrow(allLoop) - all.overlap
  
  subset.overlap <- getOverlapLoopNum(subsetLoop, peak)
  subset.notOverlap <- nrow(subsetLoop) - subset.overlap
  
  contingency_table <- matrix(c(subset.overlap, subset.notOverlap,
                                all.overlap, all.notOverlap), nrow = 2, byrow = TRUE)
  colnames(contingency_table) <- c(\Overlapping\, \Not_Overlapping\)
  rownames(contingency_table) <- c(\All loops\, \Subset loops\)
  
  # Perform Fisher's Exact Test
  fisher_test_result <- fisher.test(contingency_table)
  return(fisher_test_result)
}



loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.bedpe\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.bedpe\))

### Dylan
# Seeding
temp <- getSEOverlapFisher(loop, loop.up, peak.Dylan.SE)
result.tb <- tibble(loopType = \UP\,
                    target = \Dylan SE\,
                    pvalue = temp$p.value,
                    oddsRatio = temp$estimate)
# Add row
temp <- getSEOverlapFisher(loop, loop.no, peak.Dylan.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \NO\,
          target = \Dylan SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

temp <- getSEOverlapFisher(loop, loop.down, peak.Dylan.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \DOWN\,
          target = \Dylan SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

### Whyte
# Seeding
temp <- getSEOverlapFisher(loop, loop.up, peak.Whyte.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \UP\,
                    target = \Whyte SE\,
                    pvalue = temp$p.value,
                    oddsRatio = temp$estimate)
# Add row
temp <- getSEOverlapFisher(loop, loop.no, peak.Whyte.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \NO\,
          target = \Whyte SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

temp <- getSEOverlapFisher(loop, loop.down, peak.Whyte.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \DOWN\,
          target = \Whyte SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)


# Visualization
library(circlize)
data <- result.tb
heatmap_data <- data %>% dplyr::select(target, loopType, oddsRatio) %>%
pivot_wider(names_from = loopType, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, loopType, pvalue) %>%
  pivot_wider(names_from = loopType, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 5), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3, 4, 5), 
                                    labels = c(\0\, \1\, \2\, \3\, \4\, \5\)))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHViRzl2Y0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsTG1KbFpIQmxYRndwS1Z4dVhHNW5aWFJQZG1WeWJHRndURzl2Y0U1MWJTQThMU0JtZFc1amRHbHZiaWhzYjI5d0xDQndaV0ZyS1h0Y2JpQWdZVzVqYUc5eU1TQThMU0JIVW1GdVoyVnpLSE5sY1c1aGJXVnpJRDBnYkc5dmNDUldNU3dnY21GdVoyVnpJRDBnU1ZKaGJtZGxjeWh6ZEdGeWRDQTlJR3h2YjNBa1ZqSXNJR1Z1WkNBOUlHeHZiM0FrVmpNcEtWeHVJQ0JoYm1Ob2IzSXlJRHd0SUVkU1lXNW5aWE1vYzJWeGJtRnRaWE1nUFNCc2IyOXdKRlkwTENCeVlXNW5aWE1nUFNCSlVtRnVaMlZ6S0hOMFlYSjBJRDBnYkc5dmNDUldOU3dnWlc1a0lEMGdiRzl2Y0NSV05pa3BYRzRnSUdFZ1BDMGdjWFZsY25sSWFYUnpLR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l4TENCd1pXRnJLU2xjYmlBZ1lpQThMU0J4ZFdWeWVVaHBkSE1vWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2pJc0lIQmxZV3NwS1Z4dUlDQnlaWFIxY200b2JHVnVaM1JvS0hWdWFYRjFaU2hqS0dFc0lHSXBLU2twWEc1OVhHNWNibWRsZEZORlQzWmxjbXhoY0VacGMyaGxjaUE4TFNCbWRXNWpkR2x2YmloaGJHeE1iMjl3TENCemRXSnpaWFJNYjI5d0xDQndaV0ZyS1h0Y2JpQWdZV3hzTG05MlpYSnNZWEFnUEMwZ1oyVjBUM1psY214aGNFeHZiM0JPZFcwb1lXeHNURzl2Y0N3Z2NHVmhheWxjYmlBZ1lXeHNMbTV2ZEU5MlpYSnNZWEFnUEMwZ2JuSnZkeWhoYkd4TWIyOXdLU0F0SUdGc2JDNXZkbVZ5YkdGd1hHNGdJRnh1SUNCemRXSnpaWFF1YjNabGNteGhjQ0E4TFNCblpYUlBkbVZ5YkdGd1RHOXZjRTUxYlNoemRXSnpaWFJNYjI5d0xDQndaV0ZyS1Z4dUlDQnpkV0p6WlhRdWJtOTBUM1psY214aGNDQThMU0J1Y205M0tITjFZbk5sZEV4dmIzQXBJQzBnYzNWaWMyVjBMbTkyWlhKc1lYQmNiaUFnWEc0Z0lHTnZiblJwYm1kbGJtTjVYM1JoWW14bElEd3RJRzFoZEhKcGVDaGpLSE4xWW5ObGRDNXZkbVZ5YkdGd0xDQnpkV0p6WlhRdWJtOTBUM1psY214aGNDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXeHNMbTkyWlhKc1lYQXNJR0ZzYkM1dWIzUlBkbVZ5YkdGd0tTd2dibkp2ZHlBOUlESXNJR0o1Y205M0lEMGdWRkpWUlNsY2JpQWdZMjlzYm1GdFpYTW9ZMjl1ZEdsdVoyVnVZM2xmZEdGaWJHVXBJRHd0SUdNb1hGeFBkbVZ5YkdGd2NHbHVaMXhjTENCY1hFNXZkRjlQZG1WeWJHRndjR2x1WjF4Y0tWeHVJQ0J5YjNkdVlXMWxjeWhqYjI1MGFXNW5aVzVqZVY5MFlXSnNaU2tnUEMwZ1l5aGNYRUZzYkNCc2IyOXdjMXhjTENCY1hGTjFZbk5sZENCc2IyOXdjMXhjS1Z4dUlDQmNiaUFnSXlCUVpYSm1iM0p0SUVacGMyaGxjaWR6SUVWNFlXTjBJRlJsYzNSY2JpQWdabWx6YUdWeVgzUmxjM1JmY21WemRXeDBJRHd0SUdacGMyaGxjaTUwWlhOMEtHTnZiblJwYm1kbGJtTjVYM1JoWW14bEtWeHVJQ0J5WlhSMWNtNG9abWx6YUdWeVgzUmxjM1JmY21WemRXeDBLVnh1ZlZ4dVhHNWNibHh1Ykc5dmNDNTFjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNCbExYQmxYMEUwT0RWMmMwUk5VMDlmVlZCZlpHbG1aakF1TWk1aVpXUndaVnhjS1NsY2JteHZiM0F1Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5Qk5EZzFkbk5FVFZOUFgwNVBYMlJwWm1Zd0xqSXVZbVZrY0dWY1hDa3BYRzVzYjI5d0xtUnZkMjRnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlCTkRnMWRuTkVUVk5QWDBSUFYwNWZaR2xtWmpBdU1pNWlaV1J3WlZ4Y0tTbGNibHh1SXlNaklFUjViR0Z1WEc0aklGTmxaV1JwYm1kY2JuUmxiWEFnUEMwZ1oyVjBVMFZQZG1WeWJHRndSbWx6YUdWeUtHeHZiM0FzSUd4dmIzQXVkWEFzSUhCbFlXc3VSSGxzWVc0dVUwVXBYRzV5WlhOMWJIUXVkR0lnUEMwZ2RHbGlZbXhsS0d4dmIzQlVlWEJsSUQwZ1hGeFZVRnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBZWEpuWlhRZ1BTQmNYRVI1YkdGdUlGTkZYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQjJZV3gxWlNBOUlIUmxiWEFrY0M1MllXeDFaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IyUmtjMUpoZEdsdklEMGdkR1Z0Y0NSbGMzUnBiV0YwWlNsY2JpTWdRV1JrSUhKdmQxeHVkR1Z0Y0NBOExTQm5aWFJUUlU5MlpYSnNZWEJHYVhOb1pYSW9iRzl2Y0N3Z2JHOXZjQzV1Ynl3Z2NHVmhheTVFZVd4aGJpNVRSU2xjYm5KbGMzVnNkQzUwWWlBOExTQnlaWE4xYkhRdWRHSWdKVDRsSUZ4dUlDQmhaR1JmY205M0tHeHZiM0JVZVhCbElEMGdYRnhPVDF4Y0xGeHVJQ0FnSUNBZ0lDQWdJSFJoY21kbGRDQTlJRnhjUkhsc1lXNGdVMFZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQndkbUZzZFdVZ1BTQjBaVzF3SkhBdWRtRnNkV1VzWEc0Z0lDQWdJQ0FnSUNBZ2IyUmtjMUpoZEdsdklEMGdkR1Z0Y0NSbGMzUnBiV0YwWlNsY2JseHVkR1Z0Y0NBOExTQm5aWFJUUlU5MlpYSnNZWEJHYVhOb1pYSW9iRzl2Y0N3Z2JHOXZjQzVrYjNkdUxDQndaV0ZyTGtSNWJHRnVMbE5GS1Z4dWNtVnpkV3gwTG5SaUlEd3RJSEpsYzNWc2RDNTBZaUFsUGlVZ1hHNGdJR0ZrWkY5eWIzY29iRzl2Y0ZSNWNHVWdQU0JjWEVSUFYwNWNYQ3hjYmlBZ0lDQWdJQ0FnSUNCMFlYSm5aWFFnUFNCY1hFUjViR0Z1SUZORlhGd3NYRzRnSUNBZ0lDQWdJQ0FnY0haaGJIVmxJRDBnZEdWdGNDUndMblpoYkhWbExGeHVJQ0FnSUNBZ0lDQWdJRzlrWkhOU1lYUnBieUE5SUhSbGJYQWtaWE4wYVcxaGRHVXBYRzVjYmlNakl5QlhhSGwwWlZ4dUl5QlRaV1ZrYVc1blhHNTBaVzF3SUR3dElHZGxkRk5GVDNabGNteGhjRVpwYzJobGNpaHNiMjl3TENCc2IyOXdMblZ3TENCd1pXRnJMbGRvZVhSbExsTkZLVnh1Y21WemRXeDBMblJpSUR3dElISmxjM1ZzZEM1MFlpQWxQaVVnWEc0Z0lHRmtaRjl5YjNjb2JHOXZjRlI1Y0dVZ1BTQmNYRlZRWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJoY21kbGRDQTlJRnhjVjJoNWRHVWdVMFZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjSFpoYkhWbElEMGdkR1Z0Y0NSd0xuWmhiSFZsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZaR1J6VW1GMGFXOGdQU0IwWlcxd0pHVnpkR2x0WVhSbEtWeHVJeUJCWkdRZ2NtOTNYRzUwWlcxd0lEd3RJR2RsZEZORlQzWmxjbXhoY0VacGMyaGxjaWhzYjI5d0xDQnNiMjl3TG01dkxDQndaV0ZyTGxkb2VYUmxMbE5GS1Z4dWNtVnpkV3gwTG5SaUlEd3RJSEpsYzNWc2RDNTBZaUFsUGlVZ1hHNGdJR0ZrWkY5eWIzY29iRzl2Y0ZSNWNHVWdQU0JjWEU1UFhGd3NYRzRnSUNBZ0lDQWdJQ0FnZEdGeVoyVjBJRDBnWEZ4WGFIbDBaU0JUUlZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJSEIyWVd4MVpTQTlJSFJsYlhBa2NDNTJZV3gxWlN4Y2JpQWdJQ0FnSUNBZ0lDQnZaR1J6VW1GMGFXOGdQU0IwWlcxd0pHVnpkR2x0WVhSbEtWeHVYRzUwWlcxd0lEd3RJR2RsZEZORlQzWmxjbXhoY0VacGMyaGxjaWhzYjI5d0xDQnNiMjl3TG1SdmQyNHNJSEJsWVdzdVYyaDVkR1V1VTBVcFhHNXlaWE4xYkhRdWRHSWdQQzBnY21WemRXeDBMblJpSUNVK0pTQmNiaUFnWVdSa1gzSnZkeWhzYjI5d1ZIbHdaU0E5SUZ4Y1JFOVhUbHhjTEZ4dUlDQWdJQ0FnSUNBZ0lIUmhjbWRsZENBOUlGeGNWMmg1ZEdVZ1UwVmNYQ3hjYmlBZ0lDQWdJQ0FnSUNCd2RtRnNkV1VnUFNCMFpXMXdKSEF1ZG1Gc2RXVXNYRzRnSUNBZ0lDQWdJQ0FnYjJSa2MxSmhkR2x2SUQwZ2RHVnRjQ1JsYzNScGJXRjBaU2xjYmx4dVhHNGpJRlpwYzNWaGJHbDZZWFJwYjI1Y2JteHBZbkpoY25rb1kybHlZMnhwZW1VcFhHNWtZWFJoSUR3dElISmxjM1ZzZEM1MFlseHVhR1ZoZEcxaGNGOWtZWFJoSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZEdGeVoyVjBMQ0JzYjI5d1ZIbHdaU3dnYjJSa2MxSmhkR2x2S1NBbFBpVmNibkJwZG05MFgzZHBaR1Z5S0c1aGJXVnpYMlp5YjIwZ1BTQnNiMjl3Vkhsd1pTd2dkbUZzZFdWelgyWnliMjBnUFNCdlpHUnpVbUYwYVc4cElDVStKVnh1SUNCamIyeDFiVzVmZEc5ZmNtOTNibUZ0WlhNb2RtRnlJRDBnWEZ4MFlYSm5aWFJjWENsY2JseHVjSFpoYkhWbFgyUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJR3h2YjNCVWVYQmxMQ0J3ZG1Gc2RXVXBJQ1UrSlZ4dUlDQndhWFp2ZEY5M2FXUmxjaWh1WVcxbGMxOW1jbTl0SUQwZ2JHOXZjRlI1Y0dVc0lIWmhiSFZsYzE5bWNtOXRJRDBnY0haaGJIVmxLU0FsUGlWY2JpQWdZMjlzZFcxdVgzUnZYM0p2ZDI1aGJXVnpLSFpoY2lBOUlGeGNkR0Z5WjJWMFhGd3BYRzVjYm1OdmJGOW1kVzRnUEMwZ1kyOXNiM0pTWVcxd01paGpLREFzSURFc0lEVXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpLRnhjWW14MVpWeGNMQ0JjWEhkb2FYUmxYRndzSUZ4Y2NtVmtYRndwS1Z4dVhHNUlaV0YwYldGd0tHRnpMbTFoZEhKcGVDaG9aV0YwYldGd1gyUmhkR0VwTEZ4dUlDQWdJQ0FnSUNCdVlXMWxJRDBnWEZ4UFpHUnpJRkpoZEdsdlhGd3NYRzRnSUNBZ0lDQWdJR052YkNBOUlHTnZiRjltZFc0c1hHNGdJQ0FnSUNBZ0lDTWdRV1JrSUdGdWJtOTBZWFJwYjI0Z1ptOXlJSEF0ZG1Gc2RXVnpYRzRnSUNBZ0lDQWdJR05sYkd4ZlpuVnVJRDBnWm5WdVkzUnBiMjRvYWl3Z2FTd2dlQ3dnZVN3Z2QybGtkR2dzSUdobGFXZG9kQ3dnWm1sc2JDa2dlMXh1SUNBZ0lDQWdJQ0FnSUhCMllXd2dQQzBnY0haaGJIVmxYMlJoZEdGYmFTd2dhbDFjYmlBZ0lDQWdJQ0FnSUNCc1lXSmxiQ0E4TFNCcFptVnNjMlVvY0haaGJDQStJREF1TURVc0lGeGNiaTV6TGx4Y0xDQnpjSEpwYm5SbUtGeGNKUzR5WlZ4Y0xDQndkbUZzS1NsY2JpQWdJQ0FnSUNBZ0lDQm5jbWxrTG5SbGVIUW9iR0ZpWld3c0lIZ3NJSGtzSUdkd0lEMGdaM0JoY2lobWIyNTBjMmw2WlNBOUlERXdLU2xjYmlBZ0lDQWdJQ0FnZlN4Y2JpQWdJQ0FnSUNBZ0l5QkRkWE4wYjIxcGVtVWdkR2hsSUdobFlYUnRZWEFnYkdGNWIzVjBYRzRnSUNBZ0lDQWdJR05zZFhOMFpYSmZjbTkzY3lBOUlGUlNWVVVzWEc0Z0lDQWdJQ0FnSUhOb2IzZGZjbTkzWDJSbGJtUWdQU0JHUVV4VFJTeGNiaUFnSUNBZ0lDQWdZMngxYzNSbGNsOWpiMngxYlc1eklEMGdSa0ZNVTBVc1hHNGdJQ0FnSUNBZ0lHTnZiSFZ0Ymw5MGFYUnNaU0E5SUZ4Y1NXNTBaWEpsYzNSY1hDeGNiaUFnSUNBZ0lDQWdjbTkzWDNScGRHeGxJRDBnWEZ4VVlYSm5aWFJjWEN4Y2JpQWdJQ0FnSUNBZ2FHVmhkRzFoY0Y5c1pXZGxibVJmY0dGeVlXMGdQU0JzYVhOMEtHRjBJRDBnWXlnd0xDQXhMQ0F5TENBekxDQTBMQ0ExS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkhNZ1BTQmpLRnhjTUZ4Y0xDQmNYREZjWEN3Z1hGd3lYRndzSUZ4Y00xeGNMQ0JjWERSY1hDd2dYRncxWEZ3cEtTbGNibHh1WEc1Y2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmxvb3AgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZS5iZWRwZVxcKSlcblxuZ2V0T3ZlcmxhcExvb3BOdW0gPC0gZnVuY3Rpb24obG9vcCwgcGVhayl7XG4gIGFuY2hvcjEgPC0gR1JhbmdlcyhzZXFuYW1lcyA9IGxvb3AkVjEsIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBsb29wJFYyLCBlbmQgPSBsb29wJFYzKSlcbiAgYW5jaG9yMiA8LSBHUmFuZ2VzKHNlcW5hbWVzID0gbG9vcCRWNCwgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGxvb3AkVjUsIGVuZCA9IGxvb3AkVjYpKVxuICBhIDwtIHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoYW5jaG9yMSwgcGVhaykpXG4gIGIgPC0gcXVlcnlIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IyLCBwZWFrKSlcbiAgcmV0dXJuKGxlbmd0aCh1bmlxdWUoYyhhLCBiKSkpKVxufVxuXG5nZXRTRU92ZXJsYXBGaXNoZXIgPC0gZnVuY3Rpb24oYWxsTG9vcCwgc3Vic2V0TG9vcCwgcGVhayl7XG4gIGFsbC5vdmVybGFwIDwtIGdldE92ZXJsYXBMb29wTnVtKGFsbExvb3AsIHBlYWspXG4gIGFsbC5ub3RPdmVybGFwIDwtIG5yb3coYWxsTG9vcCkgLSBhbGwub3ZlcmxhcFxuICBcbiAgc3Vic2V0Lm92ZXJsYXAgPC0gZ2V0T3ZlcmxhcExvb3BOdW0oc3Vic2V0TG9vcCwgcGVhaylcbiAgc3Vic2V0Lm5vdE92ZXJsYXAgPC0gbnJvdyhzdWJzZXRMb29wKSAtIHN1YnNldC5vdmVybGFwXG4gIFxuICBjb250aW5nZW5jeV90YWJsZSA8LSBtYXRyaXgoYyhzdWJzZXQub3ZlcmxhcCwgc3Vic2V0Lm5vdE92ZXJsYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbC5vdmVybGFwLCBhbGwubm90T3ZlcmxhcCksIG5yb3cgPSAyLCBieXJvdyA9IFRSVUUpXG4gIGNvbG5hbWVzKGNvbnRpbmdlbmN5X3RhYmxlKSA8LSBjKFxcT3ZlcmxhcHBpbmdcXCwgXFxOb3RfT3ZlcmxhcHBpbmdcXClcbiAgcm93bmFtZXMoY29udGluZ2VuY3lfdGFibGUpIDwtIGMoXFxBbGwgbG9vcHNcXCwgXFxTdWJzZXQgbG9vcHNcXClcbiAgXG4gICMgUGVyZm9ybSBGaXNoZXIncyBFeGFjdCBUZXN0XG4gIGZpc2hlcl90ZXN0X3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSlcbiAgcmV0dXJuKGZpc2hlcl90ZXN0X3Jlc3VsdClcbn1cblxuXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5cbiMjIyBEeWxhblxuIyBTZWVkaW5nXG50ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwLCBwZWFrLkR5bGFuLlNFKVxucmVzdWx0LnRiIDwtIHRpYmJsZShsb29wVHlwZSA9IFxcVVBcXCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gXFxEeWxhbiBTRVxcLFxuICAgICAgICAgICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4jIEFkZCByb3dcbnRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3Aubm8sIHBlYWsuRHlsYW4uU0UpXG5yZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgYWRkX3Jvdyhsb29wVHlwZSA9IFxcTk9cXCxcbiAgICAgICAgICB0YXJnZXQgPSBcXER5bGFuIFNFXFwsXG4gICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cbnRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AuZG93biwgcGVhay5EeWxhbi5TRSlcbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICBhZGRfcm93KGxvb3BUeXBlID0gXFxET1dOXFwsXG4gICAgICAgICAgdGFyZ2V0ID0gXFxEeWxhbiBTRVxcLFxuICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG4jIyMgV2h5dGVcbiMgU2VlZGluZ1xudGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC51cCwgcGVhay5XaHl0ZS5TRSlcbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICBhZGRfcm93KGxvb3BUeXBlID0gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBcXFdoeXRlIFNFXFwsXG4gICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiMgQWRkIHJvd1xudGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5ubywgcGVhay5XaHl0ZS5TRSlcbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICBhZGRfcm93KGxvb3BUeXBlID0gXFxOT1xcLFxuICAgICAgICAgIHRhcmdldCA9IFxcV2h5dGUgU0VcXCxcbiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxudGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5kb3duLCBwZWFrLldoeXRlLlNFKVxucmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gIGFkZF9yb3cobG9vcFR5cGUgPSBcXERPV05cXCxcbiAgICAgICAgICB0YXJnZXQgPSBcXFdoeXRlIFNFXFwsXG4gICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cblxuIyBWaXN1YWxpemF0aW9uXG5saWJyYXJ5KGNpcmNsaXplKVxuZGF0YSA8LSByZXN1bHQudGJcbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgbG9vcFR5cGUsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gbG9vcFR5cGUsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBsb29wVHlwZSwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGxvb3BUeXBlLCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCA1KSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSxcbiAgICAgICAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlc1xuICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHtcbiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdXG4gICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCBcXG4ucy5cXCwgc3ByaW50ZihcXCUuMmVcXCwgcHZhbCkpXG4gICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpXG4gICAgICAgIH0sXG4gICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjb2x1bW5fdGl0bGUgPSBcXEludGVyZXN0XFwsXG4gICAgICAgIHJvd190aXRsZSA9IFxcVGFyZ2V0XFwsXG4gICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMywgNCwgNSksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhcXDBcXCwgXFwxXFwsIFxcMlxcLCBcXDNcXCwgXFw0XFwsIFxcNVxcKSkpXG5cblxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxubG9vcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlXFwpKVxuXG5nZXRPdmVybGFwTG9vcE51bSA8LSBmdW5jdGlvbihsb29wLCBwZWFrKXtcbiAgYW5jaG9yMSA8LSBHUmFuZ2VzKHNlcW5hbWVzID0gbG9vcCRWMSwgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGxvb3AkVjIsIGVuZCA9IGxvb3AkVjMpKVxuICBhbmNob3IyIDwtIEdSYW5nZXMoc2VxbmFtZXMgPSBsb29wJFY0LCByYW5nZXMgPSBJUmFuZ2VzKHN0YXJ0ID0gbG9vcCRWNSwgZW5kID0gbG9vcCRWNikpXG4gIGEgPC0gcXVlcnlIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IxLCBwZWFrKSlcbiAgYiA8LSBxdWVyeUhpdHMoZmluZE92ZXJsYXBzKGFuY2hvcjIsIHBlYWspKVxuICByZXR1cm4obGVuZ3RoKHVuaXF1ZShjKGEsIGIpKSkpXG59XG5cbmdldFNFT3ZlcmxhcEZpc2hlciA8LSBmdW5jdGlvbihhbGxMb29wLCBzdWJzZXRMb29wLCBwZWFrKXtcbiAgYWxsLm92ZXJsYXAgPC0gZ2V0T3ZlcmxhcExvb3BOdW0oYWxsTG9vcCwgcGVhaylcbiAgYWxsLm5vdE92ZXJsYXAgPC0gbnJvdyhhbGxMb29wKSAtIGFsbC5vdmVybGFwXG4gIFxuICBzdWJzZXQub3ZlcmxhcCA8LSBnZXRPdmVybGFwTG9vcE51bShzdWJzZXRMb29wLCBwZWFrKVxuICBzdWJzZXQubm90T3ZlcmxhcCA8LSBucm93KHN1YnNldExvb3ApIC0gc3Vic2V0Lm92ZXJsYXBcbiAgXG4gIGNvbnRpbmdlbmN5X3RhYmxlIDwtIG1hdHJpeChjKHN1YnNldC5vdmVybGFwLCBzdWJzZXQubm90T3ZlcmxhcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLm92ZXJsYXAsIGFsbC5ub3RPdmVybGFwKSwgbnJvdyA9IDIsIGJ5cm93ID0gVFJVRSlcbiAgY29sbmFtZXMoY29udGluZ2VuY3lfdGFibGUpIDwtIGMoXFxPdmVybGFwcGluZ1xcLCBcXE5vdF9PdmVybGFwcGluZ1xcKVxuICByb3duYW1lcyhjb250aW5nZW5jeV90YWJsZSkgPC0gYyhcXEFsbCBsb29wc1xcLCBcXFN1YnNldCBsb29wc1xcKVxuICBcbiAgIyBQZXJmb3JtIEZpc2hlcidzIEV4YWN0IFRlc3RcbiAgZmlzaGVyX3Rlc3RfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlKVxuICByZXR1cm4oZmlzaGVyX3Rlc3RfcmVzdWx0KVxufVxuXG5cblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcblxuIyMjIER5bGFuXG4jIFNlZWRpbmdcbnRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AudXAsIHBlYWsuRHlsYW4uU0UpXG5yZXN1bHQudGIgPC0gdGliYmxlKGxvb3BUeXBlID0gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBcXER5bGFuIFNFXFwsXG4gICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiMgQWRkIHJvd1xudGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5ubywgcGVhay5EeWxhbi5TRSlcbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICBhZGRfcm93KGxvb3BUeXBlID0gXFxOT1xcLFxuICAgICAgICAgIHRhcmdldCA9IFxcRHlsYW4gU0VcXCxcbiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxudGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5kb3duLCBwZWFrLkR5bGFuLlNFKVxucmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gIGFkZF9yb3cobG9vcFR5cGUgPSBcXERPV05cXCxcbiAgICAgICAgICB0YXJnZXQgPSBcXER5bGFuIFNFXFwsXG4gICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cbiMjIyBXaHl0ZVxuIyBTZWVkaW5nXG50ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwLCBwZWFrLldoeXRlLlNFKVxucmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gIGFkZF9yb3cobG9vcFR5cGUgPSBcXFVQXFwsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IFxcV2h5dGUgU0VcXCxcbiAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuIyBBZGQgcm93XG50ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLm5vLCBwZWFrLldoeXRlLlNFKVxucmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gIGFkZF9yb3cobG9vcFR5cGUgPSBcXE5PXFwsXG4gICAgICAgICAgdGFyZ2V0ID0gXFxXaHl0ZSBTRVxcLFxuICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG50ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLmRvd24sIHBlYWsuV2h5dGUuU0UpXG5yZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgYWRkX3Jvdyhsb29wVHlwZSA9IFxcRE9XTlxcLFxuICAgICAgICAgIHRhcmdldCA9IFxcV2h5dGUgU0VcXCxcbiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuXG4jIFZpc3VhbGl6YXRpb25cbmxpYnJhcnkoY2lyY2xpemUpXG5kYXRhIDwtIHJlc3VsdC50YlxuaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBsb29wVHlwZSwgb2Rkc1JhdGlvKSAlPiVcbnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBsb29wVHlwZSwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxucHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGxvb3BUeXBlLCBwdmFsdWUpICU+JVxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbG9vcFR5cGUsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDUpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5IZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLFxuICAgICAgICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4sXG4gICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzXG4gICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkge1xuICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal1cbiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsIFxcbi5zLlxcLCBzcHJpbnRmKFxcJS4yZVxcLCBwdmFsKSlcbiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSlcbiAgICAgICAgfSxcbiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0XG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIGNvbHVtbl90aXRsZSA9IFxcSW50ZXJlc3RcXCxcbiAgICAgICAgcm93X3RpdGxlID0gXFxUYXJnZXRcXCxcbiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGF0ID0gYygwLCAxLCAyLCAzLCA0LCA1KSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKFxcMFxcLCBcXDFcXCwgXFwyXFwsIFxcM1xcLCBcXDRcXCwgXFw1XFwpKSlcblxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
name <- \chromo_cons_annoHierarchy\
loop <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\))

getOverlapLoopNum <- function(loop, peak){
  anchor1 <- GRanges(seqnames = loop$V1, ranges = IRanges(start = loop$V2, end = loop$V3))
  anchor2 <- GRanges(seqnames = loop$V4, ranges = IRanges(start = loop$V5, end = loop$V6))
  a <- queryHits(findOverlaps(anchor1, peak))
  b <- queryHits(findOverlaps(anchor2, peak))
  return(length(unique(c(a, b))))
}

getSEOverlapFisher <- function(allLoop, subsetLoop, peak){
  all.overlap <- getOverlapLoopNum(allLoop, peak)
  all.notOverlap <- nrow(allLoop) - all.overlap
  
  subset.overlap <- getOverlapLoopNum(subsetLoop, peak)
  subset.notOverlap <- nrow(subsetLoop) - subset.overlap
  
  contingency_table <- matrix(c(subset.overlap, subset.notOverlap,
                                all.overlap, all.notOverlap), nrow = 2, byrow = TRUE)
  colnames(contingency_table) <- c(\Overlapping\, \Not_Overlapping\)
  rownames(contingency_table) <- c(\All loops\, \Subset loops\)
  
  # Perform Fisher's Exact Test
  fisher_test_result <- fisher.test(contingency_table)
  return(fisher_test_result)
}



loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.bedpe\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.bedpe\))

### Dylan
# Seeding
temp <- getSEOverlapFisher(loop, loop.up, peak.Dylan.SE)
result.tb <- tibble(loopType = \UP\,
                    target = \Dylan SE\,
                    pvalue = temp$p.value,
                    oddsRatio = temp$estimate)
# Add row
temp <- getSEOverlapFisher(loop, loop.no, peak.Dylan.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \NO\,
          target = \Dylan SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

temp <- getSEOverlapFisher(loop, loop.down, peak.Dylan.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \DOWN\,
          target = \Dylan SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

### Whyte
# Seeding
temp <- getSEOverlapFisher(loop, loop.up, peak.Whyte.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \UP\,
                    target = \Whyte SE\,
                    pvalue = temp$p.value,
                    oddsRatio = temp$estimate)
# Add row
temp <- getSEOverlapFisher(loop, loop.no, peak.Whyte.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \NO\,
          target = \Whyte SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)

temp <- getSEOverlapFisher(loop, loop.down, peak.Whyte.SE)
result.tb <- result.tb %>% 
  add_row(loopType = \DOWN\,
          target = \Whyte SE\,
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)


# Visualization
library(circlize)
data <- result.tb
heatmap_data <- data %>% dplyr::select(target, loopType, oddsRatio) %>%
pivot_wider(names_from = loopType, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, loopType, pvalue) %>%
  pivot_wider(names_from = loopType, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

col_fun <- colorRamp2(c(0, 1, 5), 
                      c(\blue\, \white\, \red\))

Heatmap(as.matrix(heatmap_data),
        name = \Odds Ratio\,
        col = col_fun,
        # Add annotation for p-values
        cell_fun = function(j, i, x, y, width, height, fill) {
          pval <- pvalue_data[i, j]
          label <- ifelse(pval > 0.05, \n.s.\, sprintf(\%.2e\, pval))
          grid.text(label, x, y, gp = gpar(fontsize = 10))
        },
        # Customize the heatmap layout
        cluster_rows = TRUE,
        show_row_dend = FALSE,
        cluster_columns = FALSE,
        column_title = \Interest\,
        row_title = \Target\,
        heatmap_legend_param = list(at = c(0, 1, 2, 3, 4, 5), 
                                    labels = c(\0\, \1\, \2\, \3\, \4\, \5\)))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Q2. Fisher's exact test?
##### dTAG

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaR2xtWmtOMWRHOW1aaUE4TFNBd0xqSmNibTVoYldVZ1BDMGdYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYQ0pjYm1SaGRHRWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lpNTBjM1pjSWlrcEtWeHVaR0YwWVNBOExTQmtZWFJoSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB0ZFhSaGRHVW9kWEJrYjNkdVgyUlVRVWRmUkUxVFR5QTlJR2xtWld4elpTaGthV1ptWDJSVVFVZGZSRTFUVHlBK0lHUnBabVpEZFhSdlptWXNJRndpVlZCY0lpd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtWld4elpTaGthV1ptWDJSVVFVZGZSRTFUVHlBK0lDMWthV1ptUTNWMGIyWm1MQ0JjSWs1UFhDSXNJRndpUkU5WFRsd2lLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMWNHUnZkMjVmUVRRNE5WOUVUVk5QSUQwZ2FXWmxiSE5sS0dScFptWmZRVFE0TlY5RVRWTlBJRDRnWkdsbVprTjFkRzltWml3Z1hDSlZVRndpTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dScFptWmZRVFE0TlY5RVRWTlBJRDRnTFdScFptWkRkWFJ2Wm1Zc0lGd2lUazljSWl3Z1hDSkVUMWRPWENJcEtTbGNibHh1SUhSbGJYQWdQQzBnWkdGMFlWeHVJQ0IwWlcxd0pHUmxibk5wZEhrZ1BDMGdaMlYwWDJSbGJuTnBkSGtvZEdWdGNDUmthV1ptWDJSVVFVZGZSRTFUVHl3Z2RHVnRjQ1JrYVdabVgwRTBPRFZmUkUxVFR5d2diaUE5SURFd01DbGNiaUFnZEdWdGNDQThMU0IwWlcxd0lDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaVzV6YVhSNUtWeHVJQ0JjYmlBZ2NERWdQQzBnWjJkd2JHOTBLSFJsYlhBc0lHRmxjeWg0SUQwZ1pHbG1abDlrVkVGSFgwUk5VMDhzSUhrZ1BTQmthV1ptWDBFME9EVmZSRTFUVHl3Z1kyOXNiM0lnUFNCa1pXNXphWFI1S1NrZ0sxeHVJQ0FnSUdkbGIyMWZjRzlwYm5Rb2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ0lDQnpZMkZzWlY5amIyeHZjbDkyYVhKcFpHbHpLQ2tnS3lCY2JpQWdJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQmthV1ptUTNWMGIyWm1MQ0JoYkhCb1lTQTlJREVzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpS1NBclhHNGdJQ0FnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdMV1JwWm1aRGRYUnZabVlzSUdGc2NHaGhJRDBnTVN3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJcElDdGNiaUFnSUNCblpXOXRYM1pzYVc1bEtIaHBiblJsY21ObGNIUWdQU0JrYVdabVEzVjBiMlptTENCaGJIQm9ZU0E5SURFc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUtTQXJYRzRnSUNBZ1oyVnZiVjkyYkdsdVpTaDRhVzUwWlhKalpYQjBJRDBnTFdScFptWkRkWFJ2Wm1Zc0lHRnNjR2hoSUQwZ01Td2dZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXBJQ3RjYmlBZ0lDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQWdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ3aVozSmxlVndpS1NBclkyOXZjbVJmWm1sNFpXUW9jbUYwYVc4Z1BTQXhMQ0I1YkdsdElEMGdZeWd0TVN3Z01Ta3NJSGhzYVcwZ1BTQmpLQzB4TENBeEtTa2dLeUJjYmlBZ0lDQjBhR1Z0WlY5amJHRnpjMmxqS0NsY2JpQWdYRzRnSUdacGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0luTmpZWFIwWlhKd2JHOTBYMXdpTENCdVlXMWxMQ0JjSWw5Y0lpd2daR2xtWmtOMWRHOW1aaXdnWENKZlpHbG1abDljSWl3Z2JHOXZjRTVoYldVc0lGd2lYMlJVUVVjdFhDSXNJR1JwWm1aT1lXMWxLVnh1SUNCd2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwY3lBOUlGd2lhVzVjSWl3Z2QybGtkR2dnUFNBekxqVXNJR2hsYVdkb2RDQTlJRE1wWEc0Z0lIQnlhVzUwS0hBeEtWeHVJQ0JrWlhZdWIyWm1LQ2xjYmlBZ2MzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0JjYmlBZ0lDQWdJQ0FnSUNCM2FXUjBhQ0E5SURNdU5Td2dhR1ZwWjJoMElEMGdNeWxjYmlBZ2NISnBiblFvY0RFcFhHNGdJR1JsZGk1dlptWW9LVnh1WEc1Y2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxuZGlmZkN1dG9mZiA8LSAwLjJcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuZGF0YSA8LSBkYXRhICU+JVxuICAgIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgICB1cGRvd25fQTQ4NV9ETVNPID0gaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSlcblxuIHRlbXAgPC0gZGF0YVxuICB0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRkaWZmX2RUQUdfRE1TTywgdGVtcCRkaWZmX0E0ODVfRE1TTywgbiA9IDEwMClcbiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuICBcbiAgcDEgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZGlmZl9kVEFHX0RNU08sIHkgPSBkaWZmX0E0ODVfRE1TTywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICAgIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKyBcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBhbHBoYSA9IDEsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGFscGhhID0gMSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBhbHBoYSA9IDEsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGFscGhhID0gMSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArY29vcmRfZml4ZWQocmF0aW8gPSAxLCB5bGltID0gYygtMSwgMSksIHhsaW0gPSBjKC0xLCAxKSkgKyBcbiAgICB0aGVtZV9jbGFzc2ljKClcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHNjYXR0ZXJwbG90X1xcLCBuYW1lLCBcXF9cXCwgZGlmZkN1dG9mZiwgXFxfZGlmZl9cXCwgbG9vcE5hbWUsIFxcX2RUQUctXFwsIGRpZmZOYW1lKVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAzLjUsIGhlaWdodCA9IDMpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBcbiAgICAgICAgICB3aWR0aCA9IDMuNSwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDEpXG4gIGRldi5vZmYoKVxuXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
diffCutoff <- 0.2
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
data <- data %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)))

 temp <- data
  temp$density <- get_density(temp$diff_dTAG_DMSO, temp$diff_A485_DMSO, n = 100)
  temp <- temp %>% dplyr::arrange(density)
  
  p1 <- ggplot(temp, aes(x = diff_dTAG_DMSO, y = diff_A485_DMSO, color = density)) +
    geom_point(show.legend = FALSE) + 
    scale_color_viridis() + 
    geom_hline(yintercept = diffCutoff, alpha = 1, color = \black\) +
    geom_hline(yintercept = -diffCutoff, alpha = 1, color = \black\) +
    geom_vline(xintercept = diffCutoff, alpha = 1, color = \black\) +
    geom_vline(xintercept = -diffCutoff, alpha = 1, color = \black\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +coord_fixed(ratio = 1, ylim = c(-1, 1), xlim = c(-1, 1)) + 
    theme_classic()
  
  fileName <- paste0(\scatterplot_\, name, \_\, diffCutoff, \_diff_\, loopName, \_dTAG-\, diffName)
  png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 3.5, height = 3)
  print(p1)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 3.5, height = 3)
  print(p1)
  dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVpHbG1aa04xZEc5bVppQThMU0F3TGpKY2JtNWhiV1VnUEMwZ1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVhGeGNibVJoZEdFZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEM1MGMzWmNYQ2twS1Z4dVpHRjBZU0E4TFNCa1lYUmhJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb2RYQmtiM2R1WDJSVVFVZGZSRTFUVHlBOUlHbG1aV3h6WlNoa2FXWm1YMlJVUVVkZlJFMVRUeUErSUdScFptWkRkWFJ2Wm1Zc0lGeGNWVkJjWEN3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNoa2FXWm1YMlJVUVVkZlJFMVRUeUErSUMxa2FXWm1RM1YwYjJabUxDQmNYRTVQWEZ3c0lGeGNSRTlYVGx4Y0tTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IxY0dSdmQyNWZRVFE0TlY5RVRWTlBJRDBnYVdabGJITmxLR1JwWm1aZlFUUTROVjlFVFZOUElENGdaR2xtWmtOMWRHOW1aaXdnWEZ4VlVGeGNMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR1JwWm1aZlFUUTROVjlFVFZOUElENGdMV1JwWm1aRGRYUnZabVlzSUZ4Y1RrOWNYQ3dnWEZ4RVQxZE9YRndwS1NsY2JseHVJSFJsYlhBZ1BDMGdaR0YwWVZ4dUlDQjBaVzF3SkdSbGJuTnBkSGtnUEMwZ1oyVjBYMlJsYm5OcGRIa29kR1Z0Y0NSa2FXWm1YMlJVUVVkZlJFMVRUeXdnZEdWdGNDUmthV1ptWDBFME9EVmZSRTFUVHl3Z2JpQTlJREV3TUNsY2JpQWdkR1Z0Y0NBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pXNXphWFI1S1Z4dUlDQmNiaUFnY0RFZ1BDMGdaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnWkdsbVpsOWtWRUZIWDBSTlUwOHNJSGtnUFNCa2FXWm1YMEUwT0RWZlJFMVRUeXdnWTI5c2IzSWdQU0JrWlc1emFYUjVLU2tnSzF4dUlDQWdJR2RsYjIxZmNHOXBiblFvYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnSUNCelkyRnNaVjlqYjJ4dmNsOTJhWEpwWkdsektDa2dLeUJjYmlBZ0lDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQmhiSEJvWVNBOUlERXNJR052Ykc5eUlEMGdYRnhpYkdGamExeGNLU0FyWEc0Z0lDQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ0xXUnBabVpEZFhSdlptWXNJR0ZzY0doaElEMGdNU3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndwSUN0Y2JpQWdJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQmthV1ptUTNWMGIyWm1MQ0JoYkhCb1lTQTlJREVzSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjS1NBclhHNGdJQ0FnWjJWdmJWOTJiR2x1WlNoNGFXNTBaWEpqWlhCMElEMGdMV1JwWm1aRGRYUnZabVlzSUdGc2NHaGhJRDBnTVN3Z1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3cElDdGNiaUFnSUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNBZ0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRnhjWjNKbGVWeGNLU0FyWTI5dmNtUmZabWw0WldRb2NtRjBhVzhnUFNBeExDQjViR2x0SUQwZ1l5Z3RNU3dnTVNrc0lIaHNhVzBnUFNCaktDMHhMQ0F4S1NrZ0t5QmNiaUFnSUNCMGFHVnRaVjlqYkdGemMybGpLQ2xjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEhOallYUjBaWEp3Ykc5MFgxeGNMQ0J1WVcxbExDQmNYRjljWEN3Z1pHbG1aa04xZEc5bVppd2dYRnhmWkdsbVpsOWNYQ3dnYkc5dmNFNWhiV1VzSUZ4Y1gyUlVRVWN0WEZ3c0lHUnBabVpPWVcxbEtWeHVJQ0J3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBjeUE5SUZ4Y2FXNWNYQ3dnZDJsa2RHZ2dQU0F6TGpVc0lHaGxhV2RvZENBOUlETXBYRzRnSUhCeWFXNTBLSEF4S1Z4dUlDQmtaWFl1YjJabUtDbGNiaUFnYzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQmNiaUFnSUNBZ0lDQWdJQ0IzYVdSMGFDQTlJRE11TlN3Z2FHVnBaMmgwSUQwZ015bGNiaUFnY0hKcGJuUW9jREVwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVYRzVjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbmRpZmZDdXRvZmYgPC0gMC4yXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSlcbmRhdGEgPC0gZGF0YSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiBkaWZmQ3V0b2ZmLCBcXFVQXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpLFxuICAgICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSkpXG5cbiB0ZW1wIDwtIGRhdGFcbiAgdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkZGlmZl9kVEFHX0RNU08sIHRlbXAkZGlmZl9BNDg1X0RNU08sIG4gPSAxMDApXG4gIHRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbiAgXG4gIHAxIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGRpZmZfZFRBR19ETVNPLCB5ID0gZGlmZl9BNDg1X0RNU08sIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsgXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgYWxwaGEgPSAxLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBhbHBoYSA9IDEsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgYWxwaGEgPSAxLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBhbHBoYSA9IDEsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK2Nvb3JkX2ZpeGVkKHJhdGlvID0gMSwgeWxpbSA9IGMoLTEsIDEpLCB4bGltID0gYygtMSwgMSkpICsgXG4gICAgdGhlbWVfY2xhc3NpYygpXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzY2F0dGVycGxvdF9cXCwgbmFtZSwgXFxfXFwsIGRpZmZDdXRvZmYsIFxcX2RpZmZfXFwsIGxvb3BOYW1lLCBcXF9kVEFHLVxcLCBkaWZmTmFtZSlcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgXG4gICAgICAgICAgd2lkdGggPSAzLjUsIGhlaWdodCA9IDMpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcblxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGlmZkN1dG9mZiA8LSAwLjJcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuZGF0YSA8LSBkYXRhICU+JVxuICAgIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgICB1cGRvd25fQTQ4NV9ETVNPID0gaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSlcblxuIHRlbXAgPC0gZGF0YVxuICB0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRkaWZmX2RUQUdfRE1TTywgdGVtcCRkaWZmX0E0ODVfRE1TTywgbiA9IDEwMClcbiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuICBcbiAgcDEgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZGlmZl9kVEFHX0RNU08sIHkgPSBkaWZmX0E0ODVfRE1TTywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICAgIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKyBcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBhbHBoYSA9IDEsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGFscGhhID0gMSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBhbHBoYSA9IDEsIGNvbG9yID0gXFxibGFja1xcKSArXG4gICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGFscGhhID0gMSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArY29vcmRfZml4ZWQocmF0aW8gPSAxLCB5bGltID0gYygtMSwgMSksIHhsaW0gPSBjKC0xLCAxKSkgKyBcbiAgICB0aGVtZV9jbGFzc2ljKClcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXHNjYXR0ZXJwbG90X1xcLCBuYW1lLCBcXF9cXCwgZGlmZkN1dG9mZiwgXFxfZGlmZl9cXCwgbG9vcE5hbWUsIFxcX2RUQUctXFwsIGRpZmZOYW1lKVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAzLjUsIGhlaWdodCA9IDMpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBcbiAgICAgICAgICB3aWR0aCA9IDMuNSwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDEpXG4gIGRldi5vZmYoKVxuXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
diffCutoff <- 0.2
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
data <- data %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)))

 temp <- data
  temp$density <- get_density(temp$diff_dTAG_DMSO, temp$diff_A485_DMSO, n = 100)
  temp <- temp %>% dplyr::arrange(density)
  
  p1 <- ggplot(temp, aes(x = diff_dTAG_DMSO, y = diff_A485_DMSO, color = density)) +
    geom_point(show.legend = FALSE) + 
    scale_color_viridis() + 
    geom_hline(yintercept = diffCutoff, alpha = 1, color = \black\) +
    geom_hline(yintercept = -diffCutoff, alpha = 1, color = \black\) +
    geom_vline(xintercept = diffCutoff, alpha = 1, color = \black\) +
    geom_vline(xintercept = -diffCutoff, alpha = 1, color = \black\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +coord_fixed(ratio = 1, ylim = c(-1, 1), xlim = c(-1, 1)) + 
    theme_classic()
  
  fileName <- paste0(\scatterplot_\, name, \_\, diffCutoff, \_diff_\, loopName, \_dTAG-\, diffName)
  png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 3.5, height = 3)
  print(p1)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 3.5, height = 3)
  print(p1)
  dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### A485

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aUxuUnpkbHdpS1NrcFhHNWtZWFJoSUR3dElHUmhkR0VnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbTExZEdGMFpTaDFjR1J2ZDI1ZlpGUkJSMTlFVFZOUElEMGdhV1psYkhObEtHUnBabVpmWkZSQlIxOUVUVk5QSUQ0Z1pHbG1aa04xZEc5bVppd2dYQ0pWVUZ3aUxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHUnBabVpmWkZSQlIxOUVUVk5QSUQ0Z0xXUnBabVpEZFhSdlptWXNJRndpVGs5Y0lpd2dYQ0pFVDFkT1hDSXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhWd1pHOTNibDlCTkRnMVgwUk5VMDhnUFNCcFptVnNjMlVvWkdsbVpsOUJORGcxWDBSTlUwOGdQaUJrYVdabVEzVjBiMlptTENCY0lsVlFYQ0lzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWkdsbVpsOUJORGcxWDBSTlUwOGdQaUF0WkdsbVprTjFkRzltWml3Z1hDSk9UMXdpTENCY0lrUlBWMDVjSWlrcEtWeHVYRzV0WVd0bFFXTnliM056VTJGdGNHeGxVMk5oZEhSbGNuQnNiM1JrVkVGSElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lFRnVibTlNYVhOMExDQmthV1ptTENCdVlXMWxMQ0JzYjI5d1RtRnRaU3dnWkdsbVprNWhiV1VwZTF4dUlDQjBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvUVc1dWJ6SWdKV2x1SlNCQmJtNXZUR2x6ZEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhWd1pHOTNibDlrVkVGSFgwUk5VMDhnSldsdUpTQmthV1ptS1Z4dUlDQjBaVzF3SkdSbGJuTnBkSGtnUEMwZ1oyVjBYMlJsYm5OcGRIa29kR1Z0Y0NSa2FXWm1YMlJVUVVkZlJFMVRUeXdnZEdWdGNDUmthV1ptWDBFME9EVmZSRTFUVHl3Z2JpQTlJREV3TUNsY2JpQWdkR1Z0Y0NBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNllYSnlZVzVuWlNoa1pXNXphWFI1S1Z4dVhHNGdJSEF4SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJR1JwWm1aZlpGUkJSMTlFVFZOUExDQjVJRDBnWkdsbVpsOUJORGcxWDBSTlUwOHNJR052Ykc5eUlEMGdaR1Z1YzJsMGVTa3BJQ3RjYmlBZ0lDQm5aVzl0WDNCdmFXNTBLSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ1hHNGdJQ0FnYzJOaGJHVmZZMjlzYjNKZmRtbHlhV1JwY3lncElDc2dYRzRnSUNBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBd0xDQmpiMndnUFNCY0ltZHlaWGsxTUZ3aUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUN0Y2JpQWdJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJQzFrYVdabVEzVjBiMlptTENCamIyd2dQU0JjSW1keVpYbGNJaXdnYkdsdVpYUjVjR1VnUFNCY0ltUnZkSFJsWkZ3aUtTQXJYRzRnSUNBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNCa2FXWm1RM1YwYjJabUxDQmpiMndnUFNCY0ltZHlaWGxjSWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJ2ZEhSbFpGd2lLU0FyWEc0Z0lDQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Dd2dZV3h3YUdFZ1BTQXdMalVzSUdOdmJHOXlJRDBnWENKbmNtVjVYQ0lwSUN0Y2JpQWdJQ0JuWlc5dFgzWnNhVzVsS0hocGJuUmxjbU5sY0hRZ1BTQXdMQ0JoYkhCb1lTQTlJREF1TlN3Z1kyOXNiM0lnUFNCY0ltZHlaWGxjSWlrZ0syTnZiM0prWDJacGVHVmtLSEpoZEdsdklEMGdNU3dnZVd4cGJTQTlJR01vTFRFc0lERXBMQ0I0YkdsdElEMGdZeWd0TVN3Z01Ta3BJQ3NnWEc0Z0lDQWdkR2hsYldWZlkyeGhjM05wWXlncElDc2daMmQwYVhSc1pTaHdZWE4wWlRBb2JtRnRaU3dnWENKZlhDSXNJR3h2YjNCT1lXMWxMQ0JjSWw5a1ZFRkhMVndpTENCa2FXWm1UbUZ0WlNrcElDc2dkR2hsYldVb2NHeHZkQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTlNrcFhHNGdJRnh1SUNCbWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSnpZMkYwZEdWeWNHeHZkRjljSWl3Z2JtRnRaU3dnWENKZlhDSXNJR1JwWm1aRGRYUnZabVlzSUZ3aVgyUnBabVpmWENJc0lHeHZiM0JPWVcxbExDQmNJbDlrVkVGSExWd2lMQ0JrYVdabVRtRnRaU2xjYmlBZ2NHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZEhNZ1BTQmNJbWx1WENJc0lIZHBaSFJvSUQwZ015NDFMQ0JvWldsbmFIUWdQU0F6S1Z4dUlDQndjbWx1ZENod01TbGNiaUFnWkdWMkxtOW1aaWdwWEc0Z0lITjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnWEc0Z0lDQWdJQ0FnSUNBZ2QybGtkR2dnUFNBekxqVXNJR2hsYVdkb2RDQTlJRE1wWEc0Z0lIQnlhVzUwS0hBeEtWeHVJQ0JrWlhZdWIyWm1LQ2xjYm4xY2JseHViV0ZyWlVGamNtOXpjMU5oYlhCc1pWTmpZWFIwWlhKd2JHOTBaRlJCUnloa1lYUmhMQ0IxYm1seGRXVW9aR0YwWVNSQmJtNXZNaWtzSUdNb1hDSlZVRndpTENCY0lrNVBYQ0lzSUZ3aVJFOVhUbHdpS1N3Z2JtRnRaU3dnWENKaGJHeGNJaXdnWENKaGJHeGNJaWxjYm0xaGEyVkJZM0p2YzNOVFlXMXdiR1ZUWTJGMGRHVnljR3h2ZEdSVVFVY29aR0YwWVN3Z2RXNXBjWFZsS0dSaGRHRWtRVzV1YnpJcExDQmpLRndpVlZCY0lpa3NJRzVoYldVc0lGd2lZV3hzWENJc0lGd2lWVkJjSWlsY2JtMWhhMlZCWTNKdmMzTlRZVzF3YkdWVFkyRjBkR1Z5Y0d4dmRHUlVRVWNvWkdGMFlTd2dkVzVwY1hWbEtHUmhkR0VrUVc1dWJ6SXBMQ0JqS0Z3aVRrOWNJaWtzSUc1aGJXVXNJRndpWVd4c1hDSXNJRndpVGs5Y0lpbGNibTFoYTJWQlkzSnZjM05UWVcxd2JHVlRZMkYwZEdWeWNHeHZkR1JVUVVjb1pHRjBZU3dnZFc1cGNYVmxLR1JoZEdFa1FXNXVieklwTENCaktGd2lSRTlYVGx3aUtTd2dibUZ0WlN3Z1hDSmhiR3hjSWl3Z1hDSkVUMWRPWENJcFhHNWNibTFoYTJWQlkzSnZjM05UWVcxd2JHVlRZMkYwZEdWeWNHeHZkR1JVUVVjb1pHRjBZU3dnWXloY0lsQXRVRndpTENCY0lsQXRSVndpTENCY0lrVXRSVndpS1N3Z1l5aGNJbFZRWENJc0lGd2lUazljSWl3Z1hDSkVUMWRPWENJcExDQnVZVzFsTENCY0luQmxMWEJsWENJc0lGd2lZV3hzWENJcFhHNXRZV3RsUVdOeWIzTnpVMkZ0Y0d4bFUyTmhkSFJsY25Cc2IzUmtWRUZIS0dSaGRHRXNJR01vWENKUUxWQmNJaXdnWENKUUxVVmNJaXdnWENKRkxVVmNJaWtzSUdNb1hDSlZVRndpS1N3Z2JtRnRaU3dnWENKd1pTMXdaVndpTENCY0lsVlFYQ0lwWEc1dFlXdGxRV055YjNOelUyRnRjR3hsVTJOaGRIUmxjbkJzYjNSa1ZFRkhLR1JoZEdFc0lHTW9YQ0pRTFZCY0lpd2dYQ0pRTFVWY0lpd2dYQ0pGTFVWY0lpa3NJR01vWENKT1Qxd2lLU3dnYm1GdFpTd2dYQ0p3WlMxd1pWd2lMQ0JjSWs1UFhDSXBYRzV0WVd0bFFXTnliM056VTJGdGNHeGxVMk5oZEhSbGNuQnNiM1JrVkVGSEtHUmhkR0VzSUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSkZMVVZjSWlrc0lHTW9YQ0pFVDFkT1hDSXBMQ0J1WVcxbExDQmNJbkJsTFhCbFhDSXNJRndpUkU5WFRsd2lLVnh1WEc1dFlXdGxRV055YjNOelUyRnRjR3hsVTJOaGRIUmxjbkJzYjNSa1ZFRkhLR1JoZEdFc0lHTW9YQ0pUTFZOY0lpd2dYQ0pUTFZoY0lpa3NJR01vWENKVlVGd2lMQ0JjSWs1UFhDSXNJRndpUkU5WFRsd2lLU3dnYm1GdFpTd2dYQ0p6ZEhKY0lpd2dYQ0poYkd4Y0lpbGNibTFoYTJWQlkzSnZjM05UWVcxd2JHVlRZMkYwZEdWeWNHeHZkR1JVUVVjb1pHRjBZU3dnWXloY0lsTXRVMXdpTENCY0lsTXRXRndpS1N3Z1l5aGNJbFZRWENJcExDQnVZVzFsTENCY0luTjBjbHdpTENCY0lsVlFYQ0lwWEc1dFlXdGxRV055YjNOelUyRnRjR3hsVTJOaGRIUmxjbkJzYjNSa1ZFRkhLR1JoZEdFc0lHTW9YQ0pUTFZOY0lpd2dYQ0pUTFZoY0lpa3NJR01vWENKT1Qxd2lLU3dnYm1GdFpTd2dYQ0p6ZEhKY0lpd2dYQ0pPVDF3aUtWeHViV0ZyWlVGamNtOXpjMU5oYlhCc1pWTmpZWFIwWlhKd2JHOTBaRlJCUnloa1lYUmhMQ0JqS0Z3aVV5MVRYQ0lzSUZ3aVV5MVlYQ0lwTENCaktGd2lSRTlYVGx3aUtTd2dibUZ0WlN3Z1hDSnpkSEpjSWl3Z1hDSkVUMWRPWENJcFhHNWNibTFoYTJWQlkzSnZjM05UWVcxd2JHVlRZMkYwZEdWeWNHeHZkRUUwT0RVZ1BDMGdablZ1WTNScGIyNG9aR0YwWVN3Z1FXNXViMHhwYzNRc0lHUnBabVlzSUc1aGJXVXNJR3h2YjNCT1lXMWxMQ0JrYVdabVRtRnRaU2w3WEc0Z0lIUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhCYm01dk1pQWxhVzRsSUVGdWJtOU1hWE4wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZFhCa2IzZHVYMEUwT0RWZlJFMVRUeUFsYVc0bElHUnBabVlwWEc0Z0lIUmxiWEFrWkdWdWMybDBlU0E4TFNCblpYUmZaR1Z1YzJsMGVTaDBaVzF3SkdScFptWmZaRlJCUjE5RVRWTlBMQ0IwWlcxd0pHUnBabVpmUVRRNE5WOUVUVk5QTENCdUlEMGdNVEF3S1Z4dUlDQjBaVzF3SUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dSbGJuTnBkSGtwWEc1Y2JpQWdjREVnUEMwZ1oyZHdiRzkwS0hSbGJYQXNJR0ZsY3loNElEMGdaR2xtWmw5a1ZFRkhYMFJOVTA4c0lIa2dQU0JrYVdabVgwRTBPRFZmUkUxVFR5d2dZMjlzYjNJZ1BTQmtaVzV6YVhSNUtTa2dLMXh1SUNBZ0lHZGxiMjFmY0c5cGJuUW9jMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnS3lCY2JpQWdJQ0J6WTJGc1pWOWpiMnh2Y2w5MmFYSnBaR2x6S0NrZ0t5QmNiaUFnSUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SURBc0lHTnZiQ0E5SUZ3aVozSmxlVFV3WENJc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQWdJR2RsYjIxZllXSnNhVzVsS0hOc2IzQmxJRDBnTVN3Z2FXNTBaWEpqWlhCMElEMGdMV1JwWm1aRGRYUnZabVlzSUdOdmJDQTlJRndpWjNKbGVWd2lMQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHOTBkR1ZrWENJcElDdGNiaUFnSUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SUdScFptWkRkWFJ2Wm1Zc0lHTnZiQ0E5SUZ3aVozSmxlVndpTENCc2FXNWxkSGx3WlNBOUlGd2laRzkwZEdWa1hDSXBJQ3RjYmlBZ0lDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjSW1keVpYbGNJaWtnSzF4dUlDQWdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ3aVozSmxlVndpS1NBclkyOXZjbVJmWm1sNFpXUW9jbUYwYVc4Z1BTQXhMQ0I1YkdsdElEMGdZeWd0TVN3Z01Ta3NJSGhzYVcwZ1BTQmpLQzB4TENBeEtTa2dLeUJjYmlBZ0lDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5Qm5aM1JwZEd4bEtIQmhjM1JsTUNodVlXMWxMQ0JjSWw5Y0lpd2diRzl2Y0U1aGJXVXNJRndpWDBFME9EVkhMVndpTENCa2FXWm1UbUZ0WlNrcElDc2dkR2hsYldVb2NHeHZkQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTlNrcFhHNGdJRnh1SUNCbWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSnpZMkYwZEdWeWNHeHZkRjljSWl3Z2JtRnRaU3dnWENKZlhDSXNJR1JwWm1aRGRYUnZabVlzSUZ3aVgyUnBabVpmWENJc0lHeHZiM0JPWVcxbExDQmNJbDlCTkRnMUxWd2lMQ0JrYVdabVRtRnRaU2xjYmlBZ2NHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZEhNZ1BTQmNJbWx1WENJc0lIZHBaSFJvSUQwZ015NDFMQ0JvWldsbmFIUWdQU0F6S1Z4dUlDQndjbWx1ZENod01TbGNiaUFnWkdWMkxtOW1aaWdwWEc0Z0lITjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBLU3dnWEc0Z0lDQWdJQ0FnSUNBZ2QybGtkR2dnUFNBekxqVXNJR2hsYVdkb2RDQTlJRE1wWEc0Z0lIQnlhVzUwS0hBeEtWeHVJQ0JrWlhZdWIyWm1LQ2xjYm4xY2JseHViV0ZyWlVGamNtOXpjMU5oYlhCc1pWTmpZWFIwWlhKd2JHOTBRVFE0TlNoa1lYUmhMQ0IxYm1seGRXVW9aR0YwWVNSQmJtNXZNaWtzSUdNb1hDSlZVRndpTENCY0lrNVBYQ0lzSUZ3aVJFOVhUbHdpS1N3Z2JtRnRaU3dnWENKaGJHeGNJaXdnWENKaGJHeGNJaWxjYm0xaGEyVkJZM0p2YzNOVFlXMXdiR1ZUWTJGMGRHVnljR3h2ZEVFME9EVW9aR0YwWVN3Z2RXNXBjWFZsS0dSaGRHRWtRVzV1YnpJcExDQmpLRndpVlZCY0lpa3NJRzVoYldVc0lGd2lZV3hzWENJc0lGd2lWVkJjSWlsY2JtMWhhMlZCWTNKdmMzTlRZVzF3YkdWVFkyRjBkR1Z5Y0d4dmRFRTBPRFVvWkdGMFlTd2dkVzVwY1hWbEtHUmhkR0VrUVc1dWJ6SXBMQ0JqS0Z3aVRrOWNJaWtzSUc1aGJXVXNJRndpWVd4c1hDSXNJRndpVGs5Y0lpbGNibTFoYTJWQlkzSnZjM05UWVcxd2JHVlRZMkYwZEdWeWNHeHZkRUUwT0RVb1pHRjBZU3dnZFc1cGNYVmxLR1JoZEdFa1FXNXVieklwTENCaktGd2lSRTlYVGx3aUtTd2dibUZ0WlN3Z1hDSmhiR3hjSWl3Z1hDSkVUMWRPWENJcFhHNWNibTFoYTJWQlkzSnZjM05UWVcxd2JHVlRZMkYwZEdWeWNHeHZkRUUwT0RVb1pHRjBZU3dnWXloY0lsQXRVRndpTENCY0lsQXRSVndpTENCY0lrVXRSVndpS1N3Z1l5aGNJbFZRWENJc0lGd2lUazljSWl3Z1hDSkVUMWRPWENJcExDQnVZVzFsTENCY0luQmxMWEJsWENJc0lGd2lZV3hzWENJcFhHNXRZV3RsUVdOeWIzTnpVMkZ0Y0d4bFUyTmhkSFJsY25Cc2IzUkJORGcxS0dSaGRHRXNJR01vWENKUUxWQmNJaXdnWENKUUxVVmNJaXdnWENKRkxVVmNJaWtzSUdNb1hDSlZVRndpS1N3Z2JtRnRaU3dnWENKd1pTMXdaVndpTENCY0lsVlFYQ0lwWEc1dFlXdGxRV055YjNOelUyRnRjR3hsVTJOaGRIUmxjbkJzYjNSQk5EZzFLR1JoZEdFc0lHTW9YQ0pRTFZCY0lpd2dYQ0pRTFVWY0lpd2dYQ0pGTFVWY0lpa3NJR01vWENKT1Qxd2lLU3dnYm1GdFpTd2dYQ0p3WlMxd1pWd2lMQ0JjSWs1UFhDSXBYRzV0WVd0bFFXTnliM056VTJGdGNHeGxVMk5oZEhSbGNuQnNiM1JCTkRnMUtHUmhkR0VzSUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSkZMVVZjSWlrc0lHTW9YQ0pFVDFkT1hDSXBMQ0J1WVcxbExDQmNJbkJsTFhCbFhDSXNJRndpUkU5WFRsd2lLVnh1WEc1dFlXdGxRV055YjNOelUyRnRjR3hsVTJOaGRIUmxjbkJzYjNSQk5EZzFLR1JoZEdFc0lHTW9YQ0pUTFZOY0lpd2dYQ0pUTFZoY0lpa3NJR01vWENKVlVGd2lMQ0JjSWs1UFhDSXNJRndpUkU5WFRsd2lLU3dnYm1GdFpTd2dYQ0p6ZEhKY0lpd2dYQ0poYkd4Y0lpbGNibTFoYTJWQlkzSnZjM05UWVcxd2JHVlRZMkYwZEdWeWNHeHZkRUUwT0RVb1pHRjBZU3dnWXloY0lsTXRVMXdpTENCY0lsTXRXRndpS1N3Z1l5aGNJbFZRWENJcExDQnVZVzFsTENCY0luTjBjbHdpTENCY0lsVlFYQ0lwWEc1dFlXdGxRV055YjNOelUyRnRjR3hsVTJOaGRIUmxjbkJzYjNSQk5EZzFLR1JoZEdFc0lHTW9YQ0pUTFZOY0lpd2dYQ0pUTFZoY0lpa3NJR01vWENKT1Qxd2lLU3dnYm1GdFpTd2dYQ0p6ZEhKY0lpd2dYQ0pPVDF3aUtWeHViV0ZyWlVGamNtOXpjMU5oYlhCc1pWTmpZWFIwWlhKd2JHOTBRVFE0TlNoa1lYUmhMQ0JqS0Z3aVV5MVRYQ0lzSUZ3aVV5MVlYQ0lwTENCaktGd2lSRTlYVGx3aUtTd2dibUZ0WlN3Z1hDSnpkSEpjSWl3Z1hDSkVUMWRPWENJcFhHNWNiaU1qSXlNakl5TWpJRUpoY25Cc2IzUmNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoMWNHUnZkMjVmWkZSQlIxOUVUVk5QTENCa2FXWm1YMEUwT0RWZlJFMVRUeWxjYm1kbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlIVndaRzkzYmw5a1ZFRkhYMFJOVTA4c0lIa2dQU0JrYVdabVgwRTBPRFZmUkUxVFR5a3BJQ3NnWjJWdmJWOWliM2h3Ykc5MEtHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXVNaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJQzB3TGpJc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnS3lCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTFRBdU5Td2dNQzQxS1NsY2JseHVkR1Z0Y0NBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHlJQ1ZwYmlVZ1l5aGNJbEF0VUZ3aUxDQmNJbEF0UlZ3aUxDQmNJa1V0UlZ3aUtTa2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kWEJrYjNkdVgyUlVRVWRmUkUxVFR5d2daR2xtWmw5Qk5EZzFYMFJOVTA4cElGeHVaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnZFhCa2IzZHVYMlJVUVVkZlJFMVRUeXdnZVNBOUlHUnBabVpmUVRRNE5WOUVUVk5QS1NrZ0t5Qm5aVzl0WDJKdmVIQnNiM1FvYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXBJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUM0eUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ0xUQXVNaXdnYkdsdVpYUjVjR1VnUFNCY0ltUmhjMmhsWkZ3aUtTQXJJR052YjNKa1gyTmhjblJsYzJsaGJpaDViR2x0SUQwZ1l5Z3RNQzQxTENBd0xqVXBLVnh1WEc1Y2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhCYm01dk1pQWxhVzRsSUdNb1hDSlRMVk5jSWl3Z1hDSlRMVmhjSWlrcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIVndaRzkzYmw5a1ZFRkhYMFJOVTA4c0lHUnBabVpmUVRRNE5WOUVUVk5QS1NCY2JtZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJSFZ3Wkc5M2JsOWtWRUZIWDBSTlUwOHNJSGtnUFNCa2FXWm1YMEUwT0RWZlJFMVRUeWtwSUNzZ1oyVnZiVjlpYjNod2JHOTBLRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREF1TWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJoYzJobFpGd2lLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUMwd0xqSXNJR3hwYm1WMGVYQmxJRDBnWENKa1lYTm9aV1JjSWlrZ0t5QmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb0xUQXVOU3dnTUM0MUtTbGNibHh1SXlNalhHNTBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvZFhCa2IzZHVYMEUwT0RWZlJFMVRUeXdnWkdsbVpsOWtWRUZIWDBSTlUwOHBYRzVuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCMWNHUnZkMjVmUVRRNE5WOUVUVk5QTENCNUlEMGdaR2xtWmw5a1ZFRkhYMFJOVTA4cEtTQXJJR2RsYjIxZlltOTRjR3h2ZENodmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xqSXNJR3hwYm1WMGVYQmxJRDBnWENKa1lYTm9aV1JjSWlrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXRNQzR5TENCc2FXNWxkSGx3WlNBOUlGd2laR0Z6YUdWa1hDSXBJQ3NnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLQzB3TGpVc0lEQXVOU2twWEc1Y2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhCYm01dk1pQWxhVzRsSUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSkZMVVZjSWlrcElDVStKU0JrY0d4NWNqbzZPbk5sYkdWamRDaDFjR1J2ZDI1ZlFUUTROVjlFVFZOUExDQmthV1ptWDJSVVFVZGZSRTFUVHlsY2JtZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJSFZ3Wkc5M2JsOUJORGcxWDBSTlUwOHNJSGtnUFNCa2FXWm1YMlJVUVVkZlJFMVRUeWtwSUNzZ1oyVnZiVjlpYjNod2JHOTBLRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREF1TWl3Z2JHbHVaWFI1Y0dVZ1BTQmNJbVJoYzJobFpGd2lLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUMwd0xqSXNJR3hwYm1WMGVYQmxJRDBnWENKa1lYTm9aV1JjSWlrZ0t5QmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb0xUQXVOU3dnTUM0MUtTbGNibHh1WEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9RVzV1YnpJZ0pXbHVKU0JqS0Z3aVV5MVRYQ0lzSUZ3aVV5MVlYQ0lwS1NBbFBpVWdaSEJzZVhJNk9qcHpaV3hsWTNRb2RYQmtiM2R1WDBFME9EVmZSRTFUVHl3Z1pHbG1abDlrVkVGSFgwUk5VMDhwWEc1blozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQjFjR1J2ZDI1ZlFUUTROVjlFVFZOUExDQjVJRDBnWkdsbVpsOWtWRUZIWDBSTlUwOHBLU0FySUdkbGIyMWZZbTk0Y0d4dmRDaHZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUNrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMaklzSUd4cGJtVjBlWEJsSUQwZ1hDSmtZWE5vWldSY0lpa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F0TUM0eUxDQnNhVzVsZEhsd1pTQTlJRndpWkdGemFHVmtYQ0lwSUNzZ1kyOXZjbVJmWTJGeWRHVnphV0Z1S0hsc2FXMGdQU0JqS0Mwd0xqVXNJREF1TlNrcFhHNWNibUJnWUNKOSAtLT5cblxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5kYXRhIDwtIGRhdGEgJT4lXG4gICAgZHBseXI6Om11dGF0ZSh1cGRvd25fZFRBR19ETVNPID0gaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSxcbiAgICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiBkaWZmQ3V0b2ZmLCBcXFVQXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpKVxuXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHIDwtIGZ1bmN0aW9uKGRhdGEsIEFubm9MaXN0LCBkaWZmLCBuYW1lLCBsb29wTmFtZSwgZGlmZk5hbWUpe1xuICB0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBBbm5vTGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZG93bl9kVEFHX0RNU08gJWluJSBkaWZmKVxuICB0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRkaWZmX2RUQUdfRE1TTywgdGVtcCRkaWZmX0E0ODVfRE1TTywgbiA9IDEwMClcbiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuXG4gIHAxIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGRpZmZfZFRBR19ETVNPLCB5ID0gZGlmZl9BNDg1X0RNU08sIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsgXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK2Nvb3JkX2ZpeGVkKHJhdGlvID0gMSwgeWxpbSA9IGMoLTEsIDEpLCB4bGltID0gYygtMSwgMSkpICsgXG4gICAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAobmFtZSwgXFxfXFwsIGxvb3BOYW1lLCBcXF9kVEFHLVxcLCBkaWZmTmFtZSkpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzY2F0dGVycGxvdF9cXCwgbmFtZSwgXFxfXFwsIGRpZmZDdXRvZmYsIFxcX2RpZmZfXFwsIGxvb3BOYW1lLCBcXF9kVEFHLVxcLCBkaWZmTmFtZSlcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgXG4gICAgICAgICAgd2lkdGggPSAzLjUsIGhlaWdodCA9IDMpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbn1cblxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyhkYXRhLCB1bmlxdWUoZGF0YSRBbm5vMiksIGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSwgbmFtZSwgXFxhbGxcXCwgXFxhbGxcXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcVVBcXCksIG5hbWUsIFxcYWxsXFwsIFxcVVBcXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcTk9cXCksIG5hbWUsIFxcYWxsXFwsIFxcTk9cXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcRE9XTlxcKSwgbmFtZSwgXFxhbGxcXCwgXFxET1dOXFwpXG5cbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSwgYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpLCBuYW1lLCBcXHBlLXBlXFwsIFxcYWxsXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxVUFxcKSwgbmFtZSwgXFxwZS1wZVxcLCBcXFVQXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxOT1xcKSwgbmFtZSwgXFxwZS1wZVxcLCBcXE5PXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxET1dOXFwpLCBuYW1lLCBcXHBlLXBlXFwsIFxcRE9XTlxcKVxuXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoXFxTLVNcXCwgXFxTLVhcXCksIGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSwgbmFtZSwgXFxzdHJcXCwgXFxhbGxcXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgYyhcXFMtU1xcLCBcXFMtWFxcKSwgYyhcXFVQXFwpLCBuYW1lLCBcXHN0clxcLCBcXFVQXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoXFxTLVNcXCwgXFxTLVhcXCksIGMoXFxOT1xcKSwgbmFtZSwgXFxzdHJcXCwgXFxOT1xcKVxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyhkYXRhLCBjKFxcUy1TXFwsIFxcUy1YXFwpLCBjKFxcRE9XTlxcKSwgbmFtZSwgXFxzdHJcXCwgXFxET1dOXFwpXG5cbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUgPC0gZnVuY3Rpb24oZGF0YSwgQW5ub0xpc3QsIGRpZmYsIG5hbWUsIGxvb3BOYW1lLCBkaWZmTmFtZSl7XG4gIHRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIEFubm9MaXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyAlaW4lIGRpZmYpXG4gIHRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGRpZmZfZFRBR19ETVNPLCB0ZW1wJGRpZmZfQTQ4NV9ETVNPLCBuID0gMTAwKVxuICB0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5cbiAgcDEgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZGlmZl9kVEFHX0RNU08sIHkgPSBkaWZmX0E0ODVfRE1TTywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICAgIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKyBcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArY29vcmRfZml4ZWQocmF0aW8gPSAxLCB5bGltID0gYygtMSwgMSksIHhsaW0gPSBjKC0xLCAxKSkgKyBcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChuYW1lLCBcXF9cXCwgbG9vcE5hbWUsIFxcX0E0ODVHLVxcLCBkaWZmTmFtZSkpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzY2F0dGVycGxvdF9cXCwgbmFtZSwgXFxfXFwsIGRpZmZDdXRvZmYsIFxcX2RpZmZfXFwsIGxvb3BOYW1lLCBcXF9BNDg1LVxcLCBkaWZmTmFtZSlcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgXG4gICAgICAgICAgd2lkdGggPSAzLjUsIGhlaWdodCA9IDMpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbn1cblxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NShkYXRhLCB1bmlxdWUoZGF0YSRBbm5vMiksIGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSwgbmFtZSwgXFxhbGxcXCwgXFxhbGxcXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcVVBcXCksIG5hbWUsIFxcYWxsXFwsIFxcVVBcXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcTk9cXCksIG5hbWUsIFxcYWxsXFwsIFxcTk9cXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcRE9XTlxcKSwgbmFtZSwgXFxhbGxcXCwgXFxET1dOXFwpXG5cbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSwgYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpLCBuYW1lLCBcXHBlLXBlXFwsIFxcYWxsXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxVUFxcKSwgbmFtZSwgXFxwZS1wZVxcLCBcXFVQXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxOT1xcKSwgbmFtZSwgXFxwZS1wZVxcLCBcXE5PXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxET1dOXFwpLCBuYW1lLCBcXHBlLXBlXFwsIFxcRE9XTlxcKVxuXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoXFxTLVNcXCwgXFxTLVhcXCksIGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSwgbmFtZSwgXFxzdHJcXCwgXFxhbGxcXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgYyhcXFMtU1xcLCBcXFMtWFxcKSwgYyhcXFVQXFwpLCBuYW1lLCBcXHN0clxcLCBcXFVQXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoXFxTLVNcXCwgXFxTLVhcXCksIGMoXFxOT1xcKSwgbmFtZSwgXFxzdHJcXCwgXFxOT1xcKVxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NShkYXRhLCBjKFxcUy1TXFwsIFxcUy1YXFwpLCBjKFxcRE9XTlxcKSwgbmFtZSwgXFxzdHJcXCwgXFxET1dOXFwpXG5cbiMjIyMjIyMjIEJhcnBsb3RcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh1cGRvd25fZFRBR19ETVNPLCBkaWZmX0E0ODVfRE1TTylcbmdncGxvdCh0ZW1wLCBhZXMoeCA9IHVwZG93bl9kVEFHX0RNU08sIHkgPSBkaWZmX0E0ODVfRE1TTykpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0wLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC41KSlcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSkgJT4lIGRwbHlyOjpzZWxlY3QodXBkb3duX2RUQUdfRE1TTywgZGlmZl9BNDg1X0RNU08pIFxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gdXBkb3duX2RUQUdfRE1TTywgeSA9IGRpZmZfQTQ4NV9ETVNPKSkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4yLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTAuMiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC41LCAwLjUpKVxuXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxTLVNcXCwgXFxTLVhcXCkpICU+JSBkcGx5cjo6c2VsZWN0KHVwZG93bl9kVEFHX0RNU08sIGRpZmZfQTQ4NV9ETVNPKSBcbmdncGxvdCh0ZW1wLCBhZXMoeCA9IHVwZG93bl9kVEFHX0RNU08sIHkgPSBkaWZmX0E0ODVfRE1TTykpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0wLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC41KSlcblxuIyMjXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodXBkb3duX0E0ODVfRE1TTywgZGlmZl9kVEFHX0RNU08pXG5nZ3Bsb3QodGVtcCwgYWVzKHggPSB1cGRvd25fQTQ4NV9ETVNPLCB5ID0gZGlmZl9kVEFHX0RNU08pKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuNSkpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCkpICU+JSBkcGx5cjo6OnNlbGVjdCh1cGRvd25fQTQ4NV9ETVNPLCBkaWZmX2RUQUdfRE1TTylcbmdncGxvdCh0ZW1wLCBhZXMoeCA9IHVwZG93bl9BNDg1X0RNU08sIHkgPSBkaWZmX2RUQUdfRE1TTykpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0wLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC41KSlcblxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUy1TXFwsIFxcUy1YXFwpKSAlPiUgZHBseXI6OjpzZWxlY3QodXBkb3duX0E0ODVfRE1TTywgZGlmZl9kVEFHX0RNU08pXG5nZ3Bsb3QodGVtcCwgYWVzKHggPSB1cGRvd25fQTQ4NV9ETVNPLCB5ID0gZGlmZl9kVEFHX0RNU08pKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuNSkpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
data <- data %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)))

makeAcrossSampleScatterplotdTAG <- function(data, AnnoList, diff, name, loopName, diffName){
  temp <- data %>% dplyr::filter(Anno2 %in% AnnoList,
                                 updown_dTAG_DMSO %in% diff)
  temp$density <- get_density(temp$diff_dTAG_DMSO, temp$diff_A485_DMSO, n = 100)
  temp <- temp %>% dplyr::arrange(density)

  p1 <- ggplot(temp, aes(x = diff_dTAG_DMSO, y = diff_A485_DMSO, color = density)) +
    geom_point(show.legend = FALSE) + 
    scale_color_viridis() + 
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +coord_fixed(ratio = 1, ylim = c(-1, 1), xlim = c(-1, 1)) + 
    theme_classic() + ggtitle(paste0(name, \_\, loopName, \_dTAG-\, diffName)) + theme(plot.title = element_text(size = 5))
  
  fileName <- paste0(\scatterplot_\, name, \_\, diffCutoff, \_diff_\, loopName, \_dTAG-\, diffName)
  png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 3.5, height = 3)
  print(p1)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 3.5, height = 3)
  print(p1)
  dev.off()
}

makeAcrossSampleScatterplotdTAG(data, unique(data$Anno2), c(\UP\, \NO\, \DOWN\), name, \all\, \all\)
makeAcrossSampleScatterplotdTAG(data, unique(data$Anno2), c(\UP\), name, \all\, \UP\)
makeAcrossSampleScatterplotdTAG(data, unique(data$Anno2), c(\NO\), name, \all\, \NO\)
makeAcrossSampleScatterplotdTAG(data, unique(data$Anno2), c(\DOWN\), name, \all\, \DOWN\)

makeAcrossSampleScatterplotdTAG(data, c(\P-P\, \P-E\, \E-E\), c(\UP\, \NO\, \DOWN\), name, \pe-pe\, \all\)
makeAcrossSampleScatterplotdTAG(data, c(\P-P\, \P-E\, \E-E\), c(\UP\), name, \pe-pe\, \UP\)
makeAcrossSampleScatterplotdTAG(data, c(\P-P\, \P-E\, \E-E\), c(\NO\), name, \pe-pe\, \NO\)
makeAcrossSampleScatterplotdTAG(data, c(\P-P\, \P-E\, \E-E\), c(\DOWN\), name, \pe-pe\, \DOWN\)

makeAcrossSampleScatterplotdTAG(data, c(\S-S\, \S-X\), c(\UP\, \NO\, \DOWN\), name, \str\, \all\)
makeAcrossSampleScatterplotdTAG(data, c(\S-S\, \S-X\), c(\UP\), name, \str\, \UP\)
makeAcrossSampleScatterplotdTAG(data, c(\S-S\, \S-X\), c(\NO\), name, \str\, \NO\)
makeAcrossSampleScatterplotdTAG(data, c(\S-S\, \S-X\), c(\DOWN\), name, \str\, \DOWN\)

makeAcrossSampleScatterplotA485 <- function(data, AnnoList, diff, name, loopName, diffName){
  temp <- data %>% dplyr::filter(Anno2 %in% AnnoList,
                                 updown_A485_DMSO %in% diff)
  temp$density <- get_density(temp$diff_dTAG_DMSO, temp$diff_A485_DMSO, n = 100)
  temp <- temp %>% dplyr::arrange(density)

  p1 <- ggplot(temp, aes(x = diff_dTAG_DMSO, y = diff_A485_DMSO, color = density)) +
    geom_point(show.legend = FALSE) + 
    scale_color_viridis() + 
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +coord_fixed(ratio = 1, ylim = c(-1, 1), xlim = c(-1, 1)) + 
    theme_classic() + ggtitle(paste0(name, \_\, loopName, \_A485G-\, diffName)) + theme(plot.title = element_text(size = 5))
  
  fileName <- paste0(\scatterplot_\, name, \_\, diffCutoff, \_diff_\, loopName, \_A485-\, diffName)
  png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 3.5, height = 3)
  print(p1)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 3.5, height = 3)
  print(p1)
  dev.off()
}

makeAcrossSampleScatterplotA485(data, unique(data$Anno2), c(\UP\, \NO\, \DOWN\), name, \all\, \all\)
makeAcrossSampleScatterplotA485(data, unique(data$Anno2), c(\UP\), name, \all\, \UP\)
makeAcrossSampleScatterplotA485(data, unique(data$Anno2), c(\NO\), name, \all\, \NO\)
makeAcrossSampleScatterplotA485(data, unique(data$Anno2), c(\DOWN\), name, \all\, \DOWN\)

makeAcrossSampleScatterplotA485(data, c(\P-P\, \P-E\, \E-E\), c(\UP\, \NO\, \DOWN\), name, \pe-pe\, \all\)
makeAcrossSampleScatterplotA485(data, c(\P-P\, \P-E\, \E-E\), c(\UP\), name, \pe-pe\, \UP\)
makeAcrossSampleScatterplotA485(data, c(\P-P\, \P-E\, \E-E\), c(\NO\), name, \pe-pe\, \NO\)
makeAcrossSampleScatterplotA485(data, c(\P-P\, \P-E\, \E-E\), c(\DOWN\), name, \pe-pe\, \DOWN\)

makeAcrossSampleScatterplotA485(data, c(\S-S\, \S-X\), c(\UP\, \NO\, \DOWN\), name, \str\, \all\)
makeAcrossSampleScatterplotA485(data, c(\S-S\, \S-X\), c(\UP\), name, \str\, \UP\)
makeAcrossSampleScatterplotA485(data, c(\S-S\, \S-X\), c(\NO\), name, \str\, \NO\)
makeAcrossSampleScatterplotA485(data, c(\S-S\, \S-X\), c(\DOWN\), name, \str\, \DOWN\)

######## Barplot
temp <- data %>% dplyr::select(updown_dTAG_DMSO, diff_A485_DMSO)
ggplot(temp, aes(x = updown_dTAG_DMSO, y = diff_A485_DMSO)) + geom_boxplot(outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = 0.2, linetype = \dashed\) +
  geom_hline(yintercept = -0.2, linetype = \dashed\) + coord_cartesian(ylim = c(-0.5, 0.5))

temp <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\)) %>% dplyr::select(updown_dTAG_DMSO, diff_A485_DMSO) 
ggplot(temp, aes(x = updown_dTAG_DMSO, y = diff_A485_DMSO)) + geom_boxplot(outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = 0.2, linetype = \dashed\) +
  geom_hline(yintercept = -0.2, linetype = \dashed\) + coord_cartesian(ylim = c(-0.5, 0.5))


temp <- data %>% dplyr::filter(Anno2 %in% c(\S-S\, \S-X\)) %>% dplyr::select(updown_dTAG_DMSO, diff_A485_DMSO) 
ggplot(temp, aes(x = updown_dTAG_DMSO, y = diff_A485_DMSO)) + geom_boxplot(outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = 0.2, linetype = \dashed\) +
  geom_hline(yintercept = -0.2, linetype = \dashed\) + coord_cartesian(ylim = c(-0.5, 0.5))

###
temp <- data %>% dplyr::select(updown_A485_DMSO, diff_dTAG_DMSO)
ggplot(temp, aes(x = updown_A485_DMSO, y = diff_dTAG_DMSO)) + geom_boxplot(outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = 0.2, linetype = \dashed\) +
  geom_hline(yintercept = -0.2, linetype = \dashed\) + coord_cartesian(ylim = c(-0.5, 0.5))

temp <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\)) %>% dplyr:::select(updown_A485_DMSO, diff_dTAG_DMSO)
ggplot(temp, aes(x = updown_A485_DMSO, y = diff_dTAG_DMSO)) + geom_boxplot(outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = 0.2, linetype = \dashed\) +
  geom_hline(yintercept = -0.2, linetype = \dashed\) + coord_cartesian(ylim = c(-0.5, 0.5))


temp <- data %>% dplyr::filter(Anno2 %in% c(\S-S\, \S-X\)) %>% dplyr:::select(updown_A485_DMSO, diff_dTAG_DMSO)
ggplot(temp, aes(x = updown_A485_DMSO, y = diff_dTAG_DMSO)) + geom_boxplot(outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = 0.2, linetype = \dashed\) +
  geom_hline(yintercept = -0.2, linetype = \dashed\) + coord_cartesian(ylim = c(-0.5, 0.5))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVaR0YwWVNBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjTG5SemRseGNLU2twWEc1a1lYUmhJRHd0SUdSaGRHRWdKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tMTFkR0YwWlNoMWNHUnZkMjVmWkZSQlIxOUVUVk5QSUQwZ2FXWmxiSE5sS0dScFptWmZaRlJCUjE5RVRWTlBJRDRnWkdsbVprTjFkRzltWml3Z1hGeFZVRnhjTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dScFptWmZaRlJCUjE5RVRWTlBJRDRnTFdScFptWkRkWFJ2Wm1Zc0lGeGNUazljWEN3Z1hGeEVUMWRPWEZ3cEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFZ3Wkc5M2JsOUJORGcxWDBSTlUwOGdQU0JwWm1Wc2MyVW9aR2xtWmw5Qk5EZzFYMFJOVTA4Z1BpQmthV1ptUTNWMGIyWm1MQ0JjWEZWUVhGd3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aR2xtWmw5Qk5EZzFYMFJOVTA4Z1BpQXRaR2xtWmtOMWRHOW1aaXdnWEZ4T1QxeGNMQ0JjWEVSUFYwNWNYQ2twS1Z4dVhHNXRZV3RsUVdOeWIzTnpVMkZ0Y0d4bFUyTmhkSFJsY25Cc2IzUmtWRUZISUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUVGdWJtOU1hWE4wTENCa2FXWm1MQ0J1WVcxbExDQnNiMjl3VG1GdFpTd2daR2xtWms1aGJXVXBlMXh1SUNCMFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9RVzV1YnpJZ0pXbHVKU0JCYm01dlRHbHpkQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFZ3Wkc5M2JsOWtWRUZIWDBSTlUwOGdKV2x1SlNCa2FXWm1LVnh1SUNCMFpXMXdKR1JsYm5OcGRIa2dQQzBnWjJWMFgyUmxibk5wZEhrb2RHVnRjQ1JrYVdabVgyUlVRVWRmUkUxVFR5d2dkR1Z0Y0NSa2FXWm1YMEUwT0RWZlJFMVRUeXdnYmlBOUlERXdNQ2xjYmlBZ2RHVnRjQ0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlc1emFYUjVLVnh1WEc0Z0lIQXhJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlHUnBabVpmWkZSQlIxOUVUVk5QTENCNUlEMGdaR2xtWmw5Qk5EZzFYMFJOVTA4c0lHTnZiRzl5SUQwZ1pHVnVjMmwwZVNrcElDdGNiaUFnSUNCblpXOXRYM0J2YVc1MEtITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnWEc0Z0lDQWdjMk5oYkdWZlkyOXNiM0pmZG1seWFXUnBjeWdwSUNzZ1hHNGdJQ0FnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0F3TENCamIyd2dQU0JjWEdkeVpYazFNRnhjTENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3RjYmlBZ0lDQm5aVzl0WDJGaWJHbHVaU2h6Ykc5d1pTQTlJREVzSUdsdWRHVnlZMlZ3ZENBOUlDMWthV1ptUTNWMGIyWm1MQ0JqYjJ3Z1BTQmNYR2R5WlhsY1hDd2diR2x1WlhSNWNHVWdQU0JjWEdSdmRIUmxaRnhjS1NBclhHNGdJQ0FnWjJWdmJWOWhZbXhwYm1Vb2MyeHZjR1VnUFNBeExDQnBiblJsY21ObGNIUWdQU0JrYVdabVEzVjBiMlptTENCamIyd2dQU0JjWEdkeVpYbGNYQ3dnYkdsdVpYUjVjR1VnUFNCY1hHUnZkSFJsWkZ4Y0tTQXJYRzRnSUNBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUN3Z1lXeHdhR0VnUFNBd0xqVXNJR052Ykc5eUlEMGdYRnhuY21WNVhGd3BJQ3RjYmlBZ0lDQm5aVzl0WDNac2FXNWxLSGhwYm5SbGNtTmxjSFFnUFNBd0xDQmhiSEJvWVNBOUlEQXVOU3dnWTI5c2IzSWdQU0JjWEdkeVpYbGNYQ2tnSzJOdmIzSmtYMlpwZUdWa0tISmhkR2x2SUQwZ01Td2dlV3hwYlNBOUlHTW9MVEVzSURFcExDQjRiR2x0SUQwZ1l5Z3RNU3dnTVNrcElDc2dYRzRnSUNBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1oyZDBhWFJzWlNod1lYTjBaVEFvYm1GdFpTd2dYRnhmWEZ3c0lHeHZiM0JPWVcxbExDQmNYRjlrVkVGSExWeGNMQ0JrYVdabVRtRnRaU2twSUNzZ2RHaGxiV1VvY0d4dmRDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOU2twWEc0Z0lGeHVJQ0JtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4elkyRjBkR1Z5Y0d4dmRGOWNYQ3dnYm1GdFpTd2dYRnhmWEZ3c0lHUnBabVpEZFhSdlptWXNJRnhjWDJScFptWmZYRndzSUd4dmIzQk9ZVzFsTENCY1hGOWtWRUZITFZ4Y0xDQmthV1ptVG1GdFpTbGNiaUFnY0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkSE1nUFNCY1hHbHVYRndzSUhkcFpIUm9JRDBnTXk0MUxDQm9aV2xuYUhRZ1BTQXpLVnh1SUNCd2NtbHVkQ2h3TVNsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUhOMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dYRzRnSUNBZ0lDQWdJQ0FnZDJsa2RHZ2dQU0F6TGpVc0lHaGxhV2RvZENBOUlETXBYRzRnSUhCeWFXNTBLSEF4S1Z4dUlDQmtaWFl1YjJabUtDbGNibjFjYmx4dWJXRnJaVUZqY205emMxTmhiWEJzWlZOallYUjBaWEp3Ykc5MFpGUkJSeWhrWVhSaExDQjFibWx4ZFdVb1pHRjBZU1JCYm01dk1pa3NJR01vWEZ4VlVGeGNMQ0JjWEU1UFhGd3NJRnhjUkU5WFRseGNLU3dnYm1GdFpTd2dYRnhoYkd4Y1hDd2dYRnhoYkd4Y1hDbGNibTFoYTJWQlkzSnZjM05UWVcxd2JHVlRZMkYwZEdWeWNHeHZkR1JVUVVjb1pHRjBZU3dnZFc1cGNYVmxLR1JoZEdFa1FXNXVieklwTENCaktGeGNWVkJjWENrc0lHNWhiV1VzSUZ4Y1lXeHNYRndzSUZ4Y1ZWQmNYQ2xjYm0xaGEyVkJZM0p2YzNOVFlXMXdiR1ZUWTJGMGRHVnljR3h2ZEdSVVFVY29aR0YwWVN3Z2RXNXBjWFZsS0dSaGRHRWtRVzV1YnpJcExDQmpLRnhjVGs5Y1hDa3NJRzVoYldVc0lGeGNZV3hzWEZ3c0lGeGNUazljWENsY2JtMWhhMlZCWTNKdmMzTlRZVzF3YkdWVFkyRjBkR1Z5Y0d4dmRHUlVRVWNvWkdGMFlTd2dkVzVwY1hWbEtHUmhkR0VrUVc1dWJ6SXBMQ0JqS0Z4Y1JFOVhUbHhjS1N3Z2JtRnRaU3dnWEZ4aGJHeGNYQ3dnWEZ4RVQxZE9YRndwWEc1Y2JtMWhhMlZCWTNKdmMzTlRZVzF3YkdWVFkyRjBkR1Z5Y0d4dmRHUlVRVWNvWkdGMFlTd2dZeWhjWEZBdFVGeGNMQ0JjWEZBdFJWeGNMQ0JjWEVVdFJWeGNLU3dnWXloY1hGVlFYRndzSUZ4Y1RrOWNYQ3dnWEZ4RVQxZE9YRndwTENCdVlXMWxMQ0JjWEhCbExYQmxYRndzSUZ4Y1lXeHNYRndwWEc1dFlXdGxRV055YjNOelUyRnRjR3hsVTJOaGRIUmxjbkJzYjNSa1ZFRkhLR1JoZEdFc0lHTW9YRnhRTFZCY1hDd2dYRnhRTFVWY1hDd2dYRnhGTFVWY1hDa3NJR01vWEZ4VlVGeGNLU3dnYm1GdFpTd2dYRnh3WlMxd1pWeGNMQ0JjWEZWUVhGd3BYRzV0WVd0bFFXTnliM056VTJGdGNHeGxVMk5oZEhSbGNuQnNiM1JrVkVGSEtHUmhkR0VzSUdNb1hGeFFMVkJjWEN3Z1hGeFFMVVZjWEN3Z1hGeEZMVVZjWENrc0lHTW9YRnhPVDF4Y0tTd2dibUZ0WlN3Z1hGeHdaUzF3WlZ4Y0xDQmNYRTVQWEZ3cFhHNXRZV3RsUVdOeWIzTnpVMkZ0Y0d4bFUyTmhkSFJsY25Cc2IzUmtWRUZIS0dSaGRHRXNJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4RkxVVmNYQ2tzSUdNb1hGeEVUMWRPWEZ3cExDQnVZVzFsTENCY1hIQmxMWEJsWEZ3c0lGeGNSRTlYVGx4Y0tWeHVYRzV0WVd0bFFXTnliM056VTJGdGNHeGxVMk5oZEhSbGNuQnNiM1JrVkVGSEtHUmhkR0VzSUdNb1hGeFRMVk5jWEN3Z1hGeFRMVmhjWENrc0lHTW9YRnhWVUZ4Y0xDQmNYRTVQWEZ3c0lGeGNSRTlYVGx4Y0tTd2dibUZ0WlN3Z1hGeHpkSEpjWEN3Z1hGeGhiR3hjWENsY2JtMWhhMlZCWTNKdmMzTlRZVzF3YkdWVFkyRjBkR1Z5Y0d4dmRHUlVRVWNvWkdGMFlTd2dZeWhjWEZNdFUxeGNMQ0JjWEZNdFdGeGNLU3dnWXloY1hGVlFYRndwTENCdVlXMWxMQ0JjWEhOMGNseGNMQ0JjWEZWUVhGd3BYRzV0WVd0bFFXTnliM056VTJGdGNHeGxVMk5oZEhSbGNuQnNiM1JrVkVGSEtHUmhkR0VzSUdNb1hGeFRMVk5jWEN3Z1hGeFRMVmhjWENrc0lHTW9YRnhPVDF4Y0tTd2dibUZ0WlN3Z1hGeHpkSEpjWEN3Z1hGeE9UMXhjS1Z4dWJXRnJaVUZqY205emMxTmhiWEJzWlZOallYUjBaWEp3Ykc5MFpGUkJSeWhrWVhSaExDQmpLRnhjVXkxVFhGd3NJRnhjVXkxWVhGd3BMQ0JqS0Z4Y1JFOVhUbHhjS1N3Z2JtRnRaU3dnWEZ4emRISmNYQ3dnWEZ4RVQxZE9YRndwWEc1Y2JtMWhhMlZCWTNKdmMzTlRZVzF3YkdWVFkyRjBkR1Z5Y0d4dmRFRTBPRFVnUEMwZ1puVnVZM1JwYjI0b1pHRjBZU3dnUVc1dWIweHBjM1FzSUdScFptWXNJRzVoYldVc0lHeHZiM0JPWVcxbExDQmthV1ptVG1GdFpTbDdYRzRnSUhSbGJYQWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJRUZ1Ym05TWFYTjBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkWEJrYjNkdVgwRTBPRFZmUkUxVFR5QWxhVzRsSUdScFptWXBYRzRnSUhSbGJYQWtaR1Z1YzJsMGVTQThMU0JuWlhSZlpHVnVjMmwwZVNoMFpXMXdKR1JwWm1aZlpGUkJSMTlFVFZOUExDQjBaVzF3SkdScFptWmZRVFE0TlY5RVRWTlBMQ0J1SUQwZ01UQXdLVnh1SUNCMFpXMXdJRHd0SUhSbGJYQWdKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JsYm5OcGRIa3BYRzVjYmlBZ2NERWdQQzBnWjJkd2JHOTBLSFJsYlhBc0lHRmxjeWg0SUQwZ1pHbG1abDlrVkVGSFgwUk5VMDhzSUhrZ1BTQmthV1ptWDBFME9EVmZSRTFUVHl3Z1kyOXNiM0lnUFNCa1pXNXphWFI1S1NrZ0sxeHVJQ0FnSUdkbGIyMWZjRzlwYm5Rb2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ0lDQnpZMkZzWlY5amIyeHZjbDkyYVhKcFpHbHpLQ2tnS3lCY2JpQWdJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJREFzSUdOdmJDQTlJRnhjWjNKbGVUVXdYRndzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNBZ0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ0xXUnBabVpEZFhSdlptWXNJR052YkNBOUlGeGNaM0psZVZ4Y0xDQnNhVzVsZEhsd1pTQTlJRnhjWkc5MGRHVmtYRndwSUN0Y2JpQWdJQ0JuWlc5dFgyRmliR2x1WlNoemJHOXdaU0E5SURFc0lHbHVkR1Z5WTJWd2RDQTlJR1JwWm1aRGRYUnZabVlzSUdOdmJDQTlJRnhjWjNKbGVWeGNMQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHOTBkR1ZrWEZ3cElDdGNiaUFnSUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCaGJIQm9ZU0E5SURBdU5Td2dZMjlzYjNJZ1BTQmNYR2R5WlhsY1hDa2dLMXh1SUNBZ0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRnhjWjNKbGVWeGNLU0FyWTI5dmNtUmZabWw0WldRb2NtRjBhVzhnUFNBeExDQjViR2x0SUQwZ1l5Z3RNU3dnTVNrc0lIaHNhVzBnUFNCaktDMHhMQ0F4S1NrZ0t5QmNiaUFnSUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCblozUnBkR3hsS0hCaGMzUmxNQ2h1WVcxbExDQmNYRjljWEN3Z2JHOXZjRTVoYldVc0lGeGNYMEUwT0RWSExWeGNMQ0JrYVdabVRtRnRaU2twSUNzZ2RHaGxiV1VvY0d4dmRDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdOU2twWEc0Z0lGeHVJQ0JtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4elkyRjBkR1Z5Y0d4dmRGOWNYQ3dnYm1GdFpTd2dYRnhmWEZ3c0lHUnBabVpEZFhSdlptWXNJRnhjWDJScFptWmZYRndzSUd4dmIzQk9ZVzFsTENCY1hGOUJORGcxTFZ4Y0xDQmthV1ptVG1GdFpTbGNiaUFnY0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkSE1nUFNCY1hHbHVYRndzSUhkcFpIUm9JRDBnTXk0MUxDQm9aV2xuYUhRZ1BTQXpLVnh1SUNCd2NtbHVkQ2h3TVNsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUhOMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cEtTd2dYRzRnSUNBZ0lDQWdJQ0FnZDJsa2RHZ2dQU0F6TGpVc0lHaGxhV2RvZENBOUlETXBYRzRnSUhCeWFXNTBLSEF4S1Z4dUlDQmtaWFl1YjJabUtDbGNibjFjYmx4dWJXRnJaVUZqY205emMxTmhiWEJzWlZOallYUjBaWEp3Ykc5MFFUUTROU2hrWVhSaExDQjFibWx4ZFdVb1pHRjBZU1JCYm01dk1pa3NJR01vWEZ4VlVGeGNMQ0JjWEU1UFhGd3NJRnhjUkU5WFRseGNLU3dnYm1GdFpTd2dYRnhoYkd4Y1hDd2dYRnhoYkd4Y1hDbGNibTFoYTJWQlkzSnZjM05UWVcxd2JHVlRZMkYwZEdWeWNHeHZkRUUwT0RVb1pHRjBZU3dnZFc1cGNYVmxLR1JoZEdFa1FXNXVieklwTENCaktGeGNWVkJjWENrc0lHNWhiV1VzSUZ4Y1lXeHNYRndzSUZ4Y1ZWQmNYQ2xjYm0xaGEyVkJZM0p2YzNOVFlXMXdiR1ZUWTJGMGRHVnljR3h2ZEVFME9EVW9aR0YwWVN3Z2RXNXBjWFZsS0dSaGRHRWtRVzV1YnpJcExDQmpLRnhjVGs5Y1hDa3NJRzVoYldVc0lGeGNZV3hzWEZ3c0lGeGNUazljWENsY2JtMWhhMlZCWTNKdmMzTlRZVzF3YkdWVFkyRjBkR1Z5Y0d4dmRFRTBPRFVvWkdGMFlTd2dkVzVwY1hWbEtHUmhkR0VrUVc1dWJ6SXBMQ0JqS0Z4Y1JFOVhUbHhjS1N3Z2JtRnRaU3dnWEZ4aGJHeGNYQ3dnWEZ4RVQxZE9YRndwWEc1Y2JtMWhhMlZCWTNKdmMzTlRZVzF3YkdWVFkyRjBkR1Z5Y0d4dmRFRTBPRFVvWkdGMFlTd2dZeWhjWEZBdFVGeGNMQ0JjWEZBdFJWeGNMQ0JjWEVVdFJWeGNLU3dnWXloY1hGVlFYRndzSUZ4Y1RrOWNYQ3dnWEZ4RVQxZE9YRndwTENCdVlXMWxMQ0JjWEhCbExYQmxYRndzSUZ4Y1lXeHNYRndwWEc1dFlXdGxRV055YjNOelUyRnRjR3hsVTJOaGRIUmxjbkJzYjNSQk5EZzFLR1JoZEdFc0lHTW9YRnhRTFZCY1hDd2dYRnhRTFVWY1hDd2dYRnhGTFVWY1hDa3NJR01vWEZ4VlVGeGNLU3dnYm1GdFpTd2dYRnh3WlMxd1pWeGNMQ0JjWEZWUVhGd3BYRzV0WVd0bFFXTnliM056VTJGdGNHeGxVMk5oZEhSbGNuQnNiM1JCTkRnMUtHUmhkR0VzSUdNb1hGeFFMVkJjWEN3Z1hGeFFMVVZjWEN3Z1hGeEZMVVZjWENrc0lHTW9YRnhPVDF4Y0tTd2dibUZ0WlN3Z1hGeHdaUzF3WlZ4Y0xDQmNYRTVQWEZ3cFhHNXRZV3RsUVdOeWIzTnpVMkZ0Y0d4bFUyTmhkSFJsY25Cc2IzUkJORGcxS0dSaGRHRXNJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4RkxVVmNYQ2tzSUdNb1hGeEVUMWRPWEZ3cExDQnVZVzFsTENCY1hIQmxMWEJsWEZ3c0lGeGNSRTlYVGx4Y0tWeHVYRzV0WVd0bFFXTnliM056VTJGdGNHeGxVMk5oZEhSbGNuQnNiM1JCTkRnMUtHUmhkR0VzSUdNb1hGeFRMVk5jWEN3Z1hGeFRMVmhjWENrc0lHTW9YRnhWVUZ4Y0xDQmNYRTVQWEZ3c0lGeGNSRTlYVGx4Y0tTd2dibUZ0WlN3Z1hGeHpkSEpjWEN3Z1hGeGhiR3hjWENsY2JtMWhhMlZCWTNKdmMzTlRZVzF3YkdWVFkyRjBkR1Z5Y0d4dmRFRTBPRFVvWkdGMFlTd2dZeWhjWEZNdFUxeGNMQ0JjWEZNdFdGeGNLU3dnWXloY1hGVlFYRndwTENCdVlXMWxMQ0JjWEhOMGNseGNMQ0JjWEZWUVhGd3BYRzV0WVd0bFFXTnliM056VTJGdGNHeGxVMk5oZEhSbGNuQnNiM1JCTkRnMUtHUmhkR0VzSUdNb1hGeFRMVk5jWEN3Z1hGeFRMVmhjWENrc0lHTW9YRnhPVDF4Y0tTd2dibUZ0WlN3Z1hGeHpkSEpjWEN3Z1hGeE9UMXhjS1Z4dWJXRnJaVUZqY205emMxTmhiWEJzWlZOallYUjBaWEp3Ykc5MFFUUTROU2hrWVhSaExDQmpLRnhjVXkxVFhGd3NJRnhjVXkxWVhGd3BMQ0JqS0Z4Y1JFOVhUbHhjS1N3Z2JtRnRaU3dnWEZ4emRISmNYQ3dnWEZ4RVQxZE9YRndwWEc1Y2JpTWpJeU1qSXlNaklFSmhjbkJzYjNSY2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gxY0dSdmQyNWZaRlJCUjE5RVRWTlBMQ0JrYVdabVgwRTBPRFZmUkUxVFR5bGNibWRuY0d4dmRDaDBaVzF3TENCaFpYTW9lQ0E5SUhWd1pHOTNibDlrVkVGSFgwUk5VMDhzSUhrZ1BTQmthV1ptWDBFME9EVmZSRTFUVHlrcElDc2daMlZ2YlY5aWIzaHdiRzkwS0c5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVNrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBdU1pd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMHdMaklzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLeUJqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9MVEF1TlN3Z01DNDFLU2xjYmx4dWRHVnRjQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRUZ1Ym04eUlDVnBiaVVnWXloY1hGQXRVRnhjTENCY1hGQXRSVnhjTENCY1hFVXRSVnhjS1NrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2RYQmtiM2R1WDJSVVFVZGZSRTFUVHl3Z1pHbG1abDlCTkRnMVgwUk5VMDhwSUZ4dVoyZHdiRzkwS0hSbGJYQXNJR0ZsY3loNElEMGdkWEJrYjNkdVgyUlVRVWRmUkUxVFR5d2dlU0E5SUdScFptWmZRVFE0TlY5RVRWTlBLU2tnS3lCblpXOXRYMkp2ZUhCc2IzUW9iM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBcElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQzR5TENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3RjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTFRBdU1pd2diR2x1WlhSNWNHVWdQU0JjWEdSaGMyaGxaRnhjS1NBcklHTnZiM0prWDJOaGNuUmxjMmxoYmloNWJHbHRJRDBnWXlndE1DNDFMQ0F3TGpVcEtWeHVYRzVjYm5SbGJYQWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJR01vWEZ4VExWTmNYQ3dnWEZ4VExWaGNYQ2twSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hWd1pHOTNibDlrVkVGSFgwUk5VMDhzSUdScFptWmZRVFE0TlY5RVRWTlBLU0JjYm1kbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlIVndaRzkzYmw5a1ZFRkhYMFJOVTA4c0lIa2dQU0JrYVdabVgwRTBPRFZmUkUxVFR5a3BJQ3NnWjJWdmJWOWliM2h3Ykc5MEtHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXVNaXdnYkdsdVpYUjVjR1VnUFNCY1hHUmhjMmhsWkZ4Y0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJQzB3TGpJc0lHeHBibVYwZVhCbElEMGdYRnhrWVhOb1pXUmNYQ2tnS3lCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTFRBdU5Td2dNQzQxS1NsY2JseHVJeU1qWEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9kWEJrYjNkdVgwRTBPRFZmUkUxVFR5d2daR2xtWmw5a1ZFRkhYMFJOVTA4cFhHNW5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0IxY0dSdmQyNWZRVFE0TlY5RVRWTlBMQ0I1SUQwZ1pHbG1abDlrVkVGSFgwUk5VMDhwS1NBcklHZGxiMjFmWW05NGNHeHZkQ2h2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01Da2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TGpJc0lHeHBibVYwZVhCbElEMGdYRnhrWVhOb1pXUmNYQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBdE1DNHlMQ0JzYVc1bGRIbHdaU0E5SUZ4Y1pHRnphR1ZrWEZ3cElDc2dZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktDMHdMalVzSURBdU5Ta3BYRzVjYm5SbGJYQWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4RkxVVmNYQ2twSUNVK0pTQmtjR3g1Y2pvNk9uTmxiR1ZqZENoMWNHUnZkMjVmUVRRNE5WOUVUVk5QTENCa2FXWm1YMlJVUVVkZlJFMVRUeWxjYm1kbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlIVndaRzkzYmw5Qk5EZzFYMFJOVTA4c0lIa2dQU0JrYVdabVgyUlVRVWRmUkUxVFR5a3BJQ3NnWjJWdmJWOWliM2h3Ykc5MEtHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3S1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXVNaXdnYkdsdVpYUjVjR1VnUFNCY1hHUmhjMmhsWkZ4Y0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJQzB3TGpJc0lHeHBibVYwZVhCbElEMGdYRnhrWVhOb1pXUmNYQ2tnS3lCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTFRBdU5Td2dNQzQxS1NsY2JseHVYRzUwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1FXNXVieklnSldsdUpTQmpLRnhjVXkxVFhGd3NJRnhjVXkxWVhGd3BLU0FsUGlVZ1pIQnNlWEk2T2pwelpXeGxZM1FvZFhCa2IzZHVYMEUwT0RWZlJFMVRUeXdnWkdsbVpsOWtWRUZIWDBSTlUwOHBYRzVuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCMWNHUnZkMjVmUVRRNE5WOUVUVk5QTENCNUlEMGdaR2xtWmw5a1ZFRkhYMFJOVTA4cEtTQXJJR2RsYjIxZlltOTRjR3h2ZENodmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDdGNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ2tnSzF4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xqSXNJR3hwYm1WMGVYQmxJRDBnWEZ4a1lYTm9aV1JjWENrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXRNQzR5TENCc2FXNWxkSGx3WlNBOUlGeGNaR0Z6YUdWa1hGd3BJQ3NnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLQzB3TGpVc0lEQXVOU2twWEc1Y2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuZGF0YSA8LSBkYXRhICU+JVxuICAgIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFxcVVBcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCBcXE5PXFwsIFxcRE9XTlxcKSksXG4gICAgICAgICAgICAgICAgICB1cGRvd25fQTQ4NV9ETVNPID0gaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSlcblxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyA8LSBmdW5jdGlvbihkYXRhLCBBbm5vTGlzdCwgZGlmZiwgbmFtZSwgbG9vcE5hbWUsIGRpZmZOYW1lKXtcbiAgdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgQW5ub0xpc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRvd25fZFRBR19ETVNPICVpbiUgZGlmZilcbiAgdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkZGlmZl9kVEFHX0RNU08sIHRlbXAkZGlmZl9BNDg1X0RNU08sIG4gPSAxMDApXG4gIHRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcblxuICBwMSA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBkaWZmX2RUQUdfRE1TTywgeSA9IGRpZmZfQTQ4NV9ETVNPLCBjb2xvciA9IGRlbnNpdHkpKSArXG4gICAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArIFxuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXFxncmV5XFwsIGxpbmV0eXBlID0gXFxkb3R0ZWRcXCkgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtjb29yZF9maXhlZChyYXRpbyA9IDEsIHlsaW0gPSBjKC0xLCAxKSwgeGxpbSA9IGMoLTEsIDEpKSArIFxuICAgIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKG5hbWUsIFxcX1xcLCBsb29wTmFtZSwgXFxfZFRBRy1cXCwgZGlmZk5hbWUpKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKVxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2NhdHRlcnBsb3RfXFwsIG5hbWUsIFxcX1xcLCBkaWZmQ3V0b2ZmLCBcXF9kaWZmX1xcLCBsb29wTmFtZSwgXFxfZFRBRy1cXCwgZGlmZk5hbWUpXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDMuNSwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDEpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICAgIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG59XG5cbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCksIG5hbWUsIFxcYWxsXFwsIFxcYWxsXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIHVuaXF1ZShkYXRhJEFubm8yKSwgYyhcXFVQXFwpLCBuYW1lLCBcXGFsbFxcLCBcXFVQXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIHVuaXF1ZShkYXRhJEFubm8yKSwgYyhcXE5PXFwpLCBuYW1lLCBcXGFsbFxcLCBcXE5PXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIHVuaXF1ZShkYXRhJEFubm8yKSwgYyhcXERPV05cXCksIG5hbWUsIFxcYWxsXFwsIFxcRE9XTlxcKVxuXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSwgbmFtZSwgXFxwZS1wZVxcLCBcXGFsbFxcKVxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyhkYXRhLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBjKFxcVVBcXCksIG5hbWUsIFxccGUtcGVcXCwgXFxVUFxcKVxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyhkYXRhLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBjKFxcTk9cXCksIG5hbWUsIFxccGUtcGVcXCwgXFxOT1xcKVxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyhkYXRhLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBjKFxcRE9XTlxcKSwgbmFtZSwgXFxwZS1wZVxcLCBcXERPV05cXClcblxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyhkYXRhLCBjKFxcUy1TXFwsIFxcUy1YXFwpLCBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCksIG5hbWUsIFxcc3RyXFwsIFxcYWxsXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoXFxTLVNcXCwgXFxTLVhcXCksIGMoXFxVUFxcKSwgbmFtZSwgXFxzdHJcXCwgXFxVUFxcKVxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyhkYXRhLCBjKFxcUy1TXFwsIFxcUy1YXFwpLCBjKFxcTk9cXCksIG5hbWUsIFxcc3RyXFwsIFxcTk9cXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgYyhcXFMtU1xcLCBcXFMtWFxcKSwgYyhcXERPV05cXCksIG5hbWUsIFxcc3RyXFwsIFxcRE9XTlxcKVxuXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1IDwtIGZ1bmN0aW9uKGRhdGEsIEFubm9MaXN0LCBkaWZmLCBuYW1lLCBsb29wTmFtZSwgZGlmZk5hbWUpe1xuICB0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBBbm5vTGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gJWluJSBkaWZmKVxuICB0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRkaWZmX2RUQUdfRE1TTywgdGVtcCRkaWZmX0E0ODVfRE1TTywgbiA9IDEwMClcbiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuXG4gIHAxIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGRpZmZfZFRBR19ETVNPLCB5ID0gZGlmZl9BNDg1X0RNU08sIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsgXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK2Nvb3JkX2ZpeGVkKHJhdGlvID0gMSwgeWxpbSA9IGMoLTEsIDEpLCB4bGltID0gYygtMSwgMSkpICsgXG4gICAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAobmFtZSwgXFxfXFwsIGxvb3BOYW1lLCBcXF9BNDg1Ry1cXCwgZGlmZk5hbWUpKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKVxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcc2NhdHRlcnBsb3RfXFwsIG5hbWUsIFxcX1xcLCBkaWZmQ3V0b2ZmLCBcXF9kaWZmX1xcLCBsb29wTmFtZSwgXFxfQTQ4NS1cXCwgZGlmZk5hbWUpXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDMuNSwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDEpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksIFxuICAgICAgICAgIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG59XG5cbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCksIG5hbWUsIFxcYWxsXFwsIFxcYWxsXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIHVuaXF1ZShkYXRhJEFubm8yKSwgYyhcXFVQXFwpLCBuYW1lLCBcXGFsbFxcLCBcXFVQXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIHVuaXF1ZShkYXRhJEFubm8yKSwgYyhcXE5PXFwpLCBuYW1lLCBcXGFsbFxcLCBcXE5PXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIHVuaXF1ZShkYXRhJEFubm8yKSwgYyhcXERPV05cXCksIG5hbWUsIFxcYWxsXFwsIFxcRE9XTlxcKVxuXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSwgbmFtZSwgXFxwZS1wZVxcLCBcXGFsbFxcKVxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NShkYXRhLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBjKFxcVVBcXCksIG5hbWUsIFxccGUtcGVcXCwgXFxVUFxcKVxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NShkYXRhLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBjKFxcTk9cXCksIG5hbWUsIFxccGUtcGVcXCwgXFxOT1xcKVxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NShkYXRhLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBjKFxcRE9XTlxcKSwgbmFtZSwgXFxwZS1wZVxcLCBcXERPV05cXClcblxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NShkYXRhLCBjKFxcUy1TXFwsIFxcUy1YXFwpLCBjKFxcVVBcXCwgXFxOT1xcLCBcXERPV05cXCksIG5hbWUsIFxcc3RyXFwsIFxcYWxsXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoXFxTLVNcXCwgXFxTLVhcXCksIGMoXFxVUFxcKSwgbmFtZSwgXFxzdHJcXCwgXFxVUFxcKVxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NShkYXRhLCBjKFxcUy1TXFwsIFxcUy1YXFwpLCBjKFxcTk9cXCksIG5hbWUsIFxcc3RyXFwsIFxcTk9cXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgYyhcXFMtU1xcLCBcXFMtWFxcKSwgYyhcXERPV05cXCksIG5hbWUsIFxcc3RyXFwsIFxcRE9XTlxcKVxuXG4jIyMjIyMjIyBCYXJwbG90XG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodXBkb3duX2RUQUdfRE1TTywgZGlmZl9BNDg1X0RNU08pXG5nZ3Bsb3QodGVtcCwgYWVzKHggPSB1cGRvd25fZFRBR19ETVNPLCB5ID0gZGlmZl9BNDg1X0RNU08pKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuNSkpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCkpICU+JSBkcGx5cjo6c2VsZWN0KHVwZG93bl9kVEFHX0RNU08sIGRpZmZfQTQ4NV9ETVNPKSBcbmdncGxvdCh0ZW1wLCBhZXMoeCA9IHVwZG93bl9kVEFHX0RNU08sIHkgPSBkaWZmX0E0ODVfRE1TTykpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0wLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC41KSlcblxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUy1TXFwsIFxcUy1YXFwpKSAlPiUgZHBseXI6OnNlbGVjdCh1cGRvd25fZFRBR19ETVNPLCBkaWZmX0E0ODVfRE1TTykgXG5nZ3Bsb3QodGVtcCwgYWVzKHggPSB1cGRvd25fZFRBR19ETVNPLCB5ID0gZGlmZl9BNDg1X0RNU08pKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuNSkpXG5cbiMjI1xudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHVwZG93bl9BNDg1X0RNU08sIGRpZmZfZFRBR19ETVNPKVxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gdXBkb3duX0E0ODVfRE1TTywgeSA9IGRpZmZfZFRBR19ETVNPKSkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4yLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTAuMiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC41LCAwLjUpKVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpKSAlPiUgZHBseXI6OjpzZWxlY3QodXBkb3duX0E0ODVfRE1TTywgZGlmZl9kVEFHX0RNU08pXG5nZ3Bsb3QodGVtcCwgYWVzKHggPSB1cGRvd25fQTQ4NV9ETVNPLCB5ID0gZGlmZl9kVEFHX0RNU08pKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuNSkpXG5cblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFMtU1xcLCBcXFMtWFxcKSkgJT4lIGRwbHlyOjo6c2VsZWN0KHVwZG93bl9BNDg1X0RNU08sIGRpZmZfZFRBR19ETVNPKVxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gdXBkb3duX0E0ODVfRE1TTywgeSA9IGRpZmZfZFRBR19ETVNPKSkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4yLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTAuMiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC41LCAwLjUpKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5kYXRhIDwtIGRhdGEgJT4lXG4gICAgZHBseXI6Om11dGF0ZSh1cGRvd25fZFRBR19ETVNPID0gaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gZGlmZkN1dG9mZiwgXFxVUFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gLWRpZmZDdXRvZmYsIFxcTk9cXCwgXFxET1dOXFwpKSxcbiAgICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiBkaWZmQ3V0b2ZmLCBcXFVQXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgXFxOT1xcLCBcXERPV05cXCkpKVxuXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHIDwtIGZ1bmN0aW9uKGRhdGEsIEFubm9MaXN0LCBkaWZmLCBuYW1lLCBsb29wTmFtZSwgZGlmZk5hbWUpe1xuICB0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBBbm5vTGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZG93bl9kVEFHX0RNU08gJWluJSBkaWZmKVxuICB0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRkaWZmX2RUQUdfRE1TTywgdGVtcCRkaWZmX0E0ODVfRE1TTywgbiA9IDEwMClcbiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuXG4gIHAxIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGRpZmZfZFRBR19ETVNPLCB5ID0gZGlmZl9BNDg1X0RNU08sIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsgXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcXGdyZXk1MFxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcXGdyZXlcXCwgbGluZXR5cGUgPSBcXGRvdHRlZFxcKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXFxncmV5XFwpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK2Nvb3JkX2ZpeGVkKHJhdGlvID0gMSwgeWxpbSA9IGMoLTEsIDEpLCB4bGltID0gYygtMSwgMSkpICsgXG4gICAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAobmFtZSwgXFxfXFwsIGxvb3BOYW1lLCBcXF9kVEFHLVxcLCBkaWZmTmFtZSkpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzY2F0dGVycGxvdF9cXCwgbmFtZSwgXFxfXFwsIGRpZmZDdXRvZmYsIFxcX2RpZmZfXFwsIGxvb3BOYW1lLCBcXF9kVEFHLVxcLCBkaWZmTmFtZSlcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgXG4gICAgICAgICAgd2lkdGggPSAzLjUsIGhlaWdodCA9IDMpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbn1cblxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyhkYXRhLCB1bmlxdWUoZGF0YSRBbm5vMiksIGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSwgbmFtZSwgXFxhbGxcXCwgXFxhbGxcXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcVVBcXCksIG5hbWUsIFxcYWxsXFwsIFxcVVBcXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcTk9cXCksIG5hbWUsIFxcYWxsXFwsIFxcTk9cXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcRE9XTlxcKSwgbmFtZSwgXFxhbGxcXCwgXFxET1dOXFwpXG5cbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSwgYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpLCBuYW1lLCBcXHBlLXBlXFwsIFxcYWxsXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxVUFxcKSwgbmFtZSwgXFxwZS1wZVxcLCBcXFVQXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxOT1xcKSwgbmFtZSwgXFxwZS1wZVxcLCBcXE5PXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxET1dOXFwpLCBuYW1lLCBcXHBlLXBlXFwsIFxcRE9XTlxcKVxuXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoXFxTLVNcXCwgXFxTLVhcXCksIGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSwgbmFtZSwgXFxzdHJcXCwgXFxhbGxcXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgYyhcXFMtU1xcLCBcXFMtWFxcKSwgYyhcXFVQXFwpLCBuYW1lLCBcXHN0clxcLCBcXFVQXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoXFxTLVNcXCwgXFxTLVhcXCksIGMoXFxOT1xcKSwgbmFtZSwgXFxzdHJcXCwgXFxOT1xcKVxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyhkYXRhLCBjKFxcUy1TXFwsIFxcUy1YXFwpLCBjKFxcRE9XTlxcKSwgbmFtZSwgXFxzdHJcXCwgXFxET1dOXFwpXG5cbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUgPC0gZnVuY3Rpb24oZGF0YSwgQW5ub0xpc3QsIGRpZmYsIG5hbWUsIGxvb3BOYW1lLCBkaWZmTmFtZSl7XG4gIHRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIEFubm9MaXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyAlaW4lIGRpZmYpXG4gIHRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGRpZmZfZFRBR19ETVNPLCB0ZW1wJGRpZmZfQTQ4NV9ETVNPLCBuID0gMTAwKVxuICB0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5cbiAgcDEgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZGlmZl9kVEFHX0RNU08sIHkgPSBkaWZmX0E0ODVfRE1TTywgY29sb3IgPSBkZW5zaXR5KSkgK1xuICAgIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKyBcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9IFxcZ3JleVxcLCBsaW5ldHlwZSA9IFxcZG90dGVkXFwpICtcbiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArY29vcmRfZml4ZWQocmF0aW8gPSAxLCB5bGltID0gYygtMSwgMSksIHhsaW0gPSBjKC0xLCAxKSkgKyBcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMChuYW1lLCBcXF9cXCwgbG9vcE5hbWUsIFxcX0E0ODVHLVxcLCBkaWZmTmFtZSkpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxzY2F0dGVycGxvdF9cXCwgbmFtZSwgXFxfXFwsIGRpZmZDdXRvZmYsIFxcX2RpZmZfXFwsIGxvb3BOYW1lLCBcXF9BNDg1LVxcLCBkaWZmTmFtZSlcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzKVxuICBwcmludChwMSlcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgXG4gICAgICAgICAgd2lkdGggPSAzLjUsIGhlaWdodCA9IDMpXG4gIHByaW50KHAxKVxuICBkZXYub2ZmKClcbn1cblxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NShkYXRhLCB1bmlxdWUoZGF0YSRBbm5vMiksIGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSwgbmFtZSwgXFxhbGxcXCwgXFxhbGxcXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcVVBcXCksIG5hbWUsIFxcYWxsXFwsIFxcVVBcXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcTk9cXCksIG5hbWUsIFxcYWxsXFwsIFxcTk9cXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKFxcRE9XTlxcKSwgbmFtZSwgXFxhbGxcXCwgXFxET1dOXFwpXG5cbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSwgYyhcXFVQXFwsIFxcTk9cXCwgXFxET1dOXFwpLCBuYW1lLCBcXHBlLXBlXFwsIFxcYWxsXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxVUFxcKSwgbmFtZSwgXFxwZS1wZVxcLCBcXFVQXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxOT1xcKSwgbmFtZSwgXFxwZS1wZVxcLCBcXE5PXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCksIGMoXFxET1dOXFwpLCBuYW1lLCBcXHBlLXBlXFwsIFxcRE9XTlxcKVxuXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoXFxTLVNcXCwgXFxTLVhcXCksIGMoXFxVUFxcLCBcXE5PXFwsIFxcRE9XTlxcKSwgbmFtZSwgXFxzdHJcXCwgXFxhbGxcXClcbm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgYyhcXFMtU1xcLCBcXFMtWFxcKSwgYyhcXFVQXFwpLCBuYW1lLCBcXHN0clxcLCBcXFVQXFwpXG5tYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoXFxTLVNcXCwgXFxTLVhcXCksIGMoXFxOT1xcKSwgbmFtZSwgXFxzdHJcXCwgXFxOT1xcKVxubWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NShkYXRhLCBjKFxcUy1TXFwsIFxcUy1YXFwpLCBjKFxcRE9XTlxcKSwgbmFtZSwgXFxzdHJcXCwgXFxET1dOXFwpXG5cbiMjIyMjIyMjIEJhcnBsb3RcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh1cGRvd25fZFRBR19ETVNPLCBkaWZmX0E0ODVfRE1TTylcbmdncGxvdCh0ZW1wLCBhZXMoeCA9IHVwZG93bl9kVEFHX0RNU08sIHkgPSBkaWZmX0E0ODVfRE1TTykpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0wLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC41KSlcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSkgJT4lIGRwbHlyOjpzZWxlY3QodXBkb3duX2RUQUdfRE1TTywgZGlmZl9BNDg1X0RNU08pIFxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gdXBkb3duX2RUQUdfRE1TTywgeSA9IGRpZmZfQTQ4NV9ETVNPKSkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4yLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTAuMiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC41LCAwLjUpKVxuXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxTLVNcXCwgXFxTLVhcXCkpICU+JSBkcGx5cjo6c2VsZWN0KHVwZG93bl9kVEFHX0RNU08sIGRpZmZfQTQ4NV9ETVNPKSBcbmdncGxvdCh0ZW1wLCBhZXMoeCA9IHVwZG93bl9kVEFHX0RNU08sIHkgPSBkaWZmX0E0ODVfRE1TTykpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0wLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC41KSlcblxuIyMjXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodXBkb3duX0E0ODVfRE1TTywgZGlmZl9kVEFHX0RNU08pXG5nZ3Bsb3QodGVtcCwgYWVzKHggPSB1cGRvd25fQTQ4NV9ETVNPLCB5ID0gZGlmZl9kVEFHX0RNU08pKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuNSkpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCkpICU+JSBkcGx5cjo6OnNlbGVjdCh1cGRvd25fQTQ4NV9ETVNPLCBkaWZmX2RUQUdfRE1TTylcbmdncGxvdCh0ZW1wLCBhZXMoeCA9IHVwZG93bl9BNDg1X0RNU08sIHkgPSBkaWZmX2RUQUdfRE1TTykpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMiwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0wLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC41KSlcblxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUy1TXFwsIFxcUy1YXFwpKSAlPiUgZHBseXI6OjpzZWxlY3QodXBkb3duX0E0ODVfRE1TTywgZGlmZl9kVEFHX0RNU08pXG5nZ3Bsb3QodGVtcCwgYWVzKHggPSB1cGRvd25fQTQ4NV9ETVNPLCB5ID0gZGlmZl9kVEFHX0RNU08pKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjIsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuNSkpXG5cbmBgYFxuYGBgIn0= -->

```r
```r
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
data <- data %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\)))

makeAcrossSampleScatterplotdTAG <- function(data, AnnoList, diff, name, loopName, diffName){
  temp <- data %>% dplyr::filter(Anno2 %in% AnnoList,
                                 updown_dTAG_DMSO %in% diff)
  temp$density <- get_density(temp$diff_dTAG_DMSO, temp$diff_A485_DMSO, n = 100)
  temp <- temp %>% dplyr::arrange(density)

  p1 <- ggplot(temp, aes(x = diff_dTAG_DMSO, y = diff_A485_DMSO, color = density)) +
    geom_point(show.legend = FALSE) + 
    scale_color_viridis() + 
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +coord_fixed(ratio = 1, ylim = c(-1, 1), xlim = c(-1, 1)) + 
    theme_classic() + ggtitle(paste0(name, \_\, loopName, \_dTAG-\, diffName)) + theme(plot.title = element_text(size = 5))
  
  fileName <- paste0(\scatterplot_\, name, \_\, diffCutoff, \_diff_\, loopName, \_dTAG-\, diffName)
  png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 3.5, height = 3)
  print(p1)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 3.5, height = 3)
  print(p1)
  dev.off()
}

makeAcrossSampleScatterplotdTAG(data, unique(data$Anno2), c(\UP\, \NO\, \DOWN\), name, \all\, \all\)
makeAcrossSampleScatterplotdTAG(data, unique(data$Anno2), c(\UP\), name, \all\, \UP\)
makeAcrossSampleScatterplotdTAG(data, unique(data$Anno2), c(\NO\), name, \all\, \NO\)
makeAcrossSampleScatterplotdTAG(data, unique(data$Anno2), c(\DOWN\), name, \all\, \DOWN\)

makeAcrossSampleScatterplotdTAG(data, c(\P-P\, \P-E\, \E-E\), c(\UP\, \NO\, \DOWN\), name, \pe-pe\, \all\)
makeAcrossSampleScatterplotdTAG(data, c(\P-P\, \P-E\, \E-E\), c(\UP\), name, \pe-pe\, \UP\)
makeAcrossSampleScatterplotdTAG(data, c(\P-P\, \P-E\, \E-E\), c(\NO\), name, \pe-pe\, \NO\)
makeAcrossSampleScatterplotdTAG(data, c(\P-P\, \P-E\, \E-E\), c(\DOWN\), name, \pe-pe\, \DOWN\)

makeAcrossSampleScatterplotdTAG(data, c(\S-S\, \S-X\), c(\UP\, \NO\, \DOWN\), name, \str\, \all\)
makeAcrossSampleScatterplotdTAG(data, c(\S-S\, \S-X\), c(\UP\), name, \str\, \UP\)
makeAcrossSampleScatterplotdTAG(data, c(\S-S\, \S-X\), c(\NO\), name, \str\, \NO\)
makeAcrossSampleScatterplotdTAG(data, c(\S-S\, \S-X\), c(\DOWN\), name, \str\, \DOWN\)

makeAcrossSampleScatterplotA485 <- function(data, AnnoList, diff, name, loopName, diffName){
  temp <- data %>% dplyr::filter(Anno2 %in% AnnoList,
                                 updown_A485_DMSO %in% diff)
  temp$density <- get_density(temp$diff_dTAG_DMSO, temp$diff_A485_DMSO, n = 100)
  temp <- temp %>% dplyr::arrange(density)

  p1 <- ggplot(temp, aes(x = diff_dTAG_DMSO, y = diff_A485_DMSO, color = density)) +
    geom_point(show.legend = FALSE) + 
    scale_color_viridis() + 
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +coord_fixed(ratio = 1, ylim = c(-1, 1), xlim = c(-1, 1)) + 
    theme_classic() + ggtitle(paste0(name, \_\, loopName, \_A485G-\, diffName)) + theme(plot.title = element_text(size = 5))
  
  fileName <- paste0(\scatterplot_\, name, \_\, diffCutoff, \_diff_\, loopName, \_A485-\, diffName)
  png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 3.5, height = 3)
  print(p1)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 3.5, height = 3)
  print(p1)
  dev.off()
}

makeAcrossSampleScatterplotA485(data, unique(data$Anno2), c(\UP\, \NO\, \DOWN\), name, \all\, \all\)
makeAcrossSampleScatterplotA485(data, unique(data$Anno2), c(\UP\), name, \all\, \UP\)
makeAcrossSampleScatterplotA485(data, unique(data$Anno2), c(\NO\), name, \all\, \NO\)
makeAcrossSampleScatterplotA485(data, unique(data$Anno2), c(\DOWN\), name, \all\, \DOWN\)

makeAcrossSampleScatterplotA485(data, c(\P-P\, \P-E\, \E-E\), c(\UP\, \NO\, \DOWN\), name, \pe-pe\, \all\)
makeAcrossSampleScatterplotA485(data, c(\P-P\, \P-E\, \E-E\), c(\UP\), name, \pe-pe\, \UP\)
makeAcrossSampleScatterplotA485(data, c(\P-P\, \P-E\, \E-E\), c(\NO\), name, \pe-pe\, \NO\)
makeAcrossSampleScatterplotA485(data, c(\P-P\, \P-E\, \E-E\), c(\DOWN\), name, \pe-pe\, \DOWN\)

makeAcrossSampleScatterplotA485(data, c(\S-S\, \S-X\), c(\UP\, \NO\, \DOWN\), name, \str\, \all\)
makeAcrossSampleScatterplotA485(data, c(\S-S\, \S-X\), c(\UP\), name, \str\, \UP\)
makeAcrossSampleScatterplotA485(data, c(\S-S\, \S-X\), c(\NO\), name, \str\, \NO\)
makeAcrossSampleScatterplotA485(data, c(\S-S\, \S-X\), c(\DOWN\), name, \str\, \DOWN\)

######## Barplot
temp <- data %>% dplyr::select(updown_dTAG_DMSO, diff_A485_DMSO)
ggplot(temp, aes(x = updown_dTAG_DMSO, y = diff_A485_DMSO)) + geom_boxplot(outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = 0.2, linetype = \dashed\) +
  geom_hline(yintercept = -0.2, linetype = \dashed\) + coord_cartesian(ylim = c(-0.5, 0.5))

temp <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\)) %>% dplyr::select(updown_dTAG_DMSO, diff_A485_DMSO) 
ggplot(temp, aes(x = updown_dTAG_DMSO, y = diff_A485_DMSO)) + geom_boxplot(outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = 0.2, linetype = \dashed\) +
  geom_hline(yintercept = -0.2, linetype = \dashed\) + coord_cartesian(ylim = c(-0.5, 0.5))


temp <- data %>% dplyr::filter(Anno2 %in% c(\S-S\, \S-X\)) %>% dplyr::select(updown_dTAG_DMSO, diff_A485_DMSO) 
ggplot(temp, aes(x = updown_dTAG_DMSO, y = diff_A485_DMSO)) + geom_boxplot(outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = 0.2, linetype = \dashed\) +
  geom_hline(yintercept = -0.2, linetype = \dashed\) + coord_cartesian(ylim = c(-0.5, 0.5))

###
temp <- data %>% dplyr::select(updown_A485_DMSO, diff_dTAG_DMSO)
ggplot(temp, aes(x = updown_A485_DMSO, y = diff_dTAG_DMSO)) + geom_boxplot(outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = 0.2, linetype = \dashed\) +
  geom_hline(yintercept = -0.2, linetype = \dashed\) + coord_cartesian(ylim = c(-0.5, 0.5))

temp <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\)) %>% dplyr:::select(updown_A485_DMSO, diff_dTAG_DMSO)
ggplot(temp, aes(x = updown_A485_DMSO, y = diff_dTAG_DMSO)) + geom_boxplot(outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = 0.2, linetype = \dashed\) +
  geom_hline(yintercept = -0.2, linetype = \dashed\) + coord_cartesian(ylim = c(-0.5, 0.5))


temp <- data %>% dplyr::filter(Anno2 %in% c(\S-S\, \S-X\)) %>% dplyr:::select(updown_A485_DMSO, diff_dTAG_DMSO)
ggplot(temp, aes(x = updown_A485_DMSO, y = diff_dTAG_DMSO)) + geom_boxplot(outlier.shape = NA) + theme_classic() +
  geom_hline(yintercept = 0) +
  geom_hline(yintercept = 0.2, linetype = \dashed\) +
  geom_hline(yintercept = -0.2, linetype = \dashed\) + coord_cartesian(ylim = c(-0.5, 0.5))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## [2.28] Comparing differential loops in dTAG to A485
The question I want to ask here is whether perturbed loops in dTAG experiments are either perturbed or not perturbed in A485 experiment. If there is compensation going on between RAD21 and A485, UP loop in RAD21 should be more DOWN in A485 and vice versa
#### Exploratory part

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSUVsTlVFOVNWRWxPUnlCRFQwMVFRVkpOVkU1RlZDQlRRMDlTUlZOY2JtTnZiWEJFYVhJZ1BDMGdhR1Z5WlNoY0lpNHVMeTR1WENJc0lGd2ljbVZ6ZFd4MFhDSXNJRndpWTI5dGNHRnlkRzFsYm5SY0lpd2dYQ0pEYzJOdmNtVlViMjlzYzF3aUtWeHVYRzVqYzJOdmNtVXVSRTFUVHlBOExTQmhjMTkwYVdKaWJHVW9abkpsWVdRb2FHVnlaU2hqYjIxd1JHbHlMQ0JjSWtjeFJFMVRUMTlOWlhKblpXUmZNVEJyWWw5amMyTnZjbVZmWm1sdVlXd3VZbVZrWjNKaGNHaGNJaWtzSUhOcmFYQWdQU0F4S1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9WaklnUFNCV01pQXJJREVwWEc1amIyeHVZVzFsY3loamMyTnZjbVV1UkUxVFR5a2dQQzBnWXloY0ltTm9jbHdpTENCY0luTjBZWEowWENJc0lGd2laVzVrWENJc0lGd2lZM05qYjNKbFgwUk5VMDljSWlsY2JseHVZM05qYjNKbExrRTBPRFVnUEMwZ1lYTmZkR2xpWW14bEtHWnlaV0ZrS0dobGNtVW9ZMjl0Y0VScGNpd2dYQ0pITVVFME9EVmZUV1Z5WjJWa1h6RXdhMkpmWTNOamIzSmxYMlpwYm1Gc0xtSmxaR2R5WVhCb1hDSXBMQ0J6YTJsd0lEMGdNU2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGWXlJRDBnVmpJZ0t5QXhLVnh1WTI5c2JtRnRaWE1vWTNOamIzSmxMa0UwT0RVcElEd3RJR01vWENKamFISmNJaXdnWENKemRHRnlkRndpTENCY0ltVnVaRndpTENCY0ltTnpZMjl5WlY5Qk5EZzFYQ0lwWEc1Y2JseHVZM05qYjNKbElEd3RJR1J3YkhseU9qcG1kV3hzWDJwdmFXNG9ZM05qYjNKbExrUk5VMDhzSUdOelkyOXlaUzVCTkRnMUxDQmllU0E5SUdNb1hDSmphSEpjSWl3Z1hDSnpkR0Z5ZEZ3aUxDQmNJbVZ1WkZ3aUtTbGNibHh1SXlCR1NVeFVSVklnVWs5WFV5QlhTVlJJSUU1QlhHNWpjMk52Y21VZ1BDMGdZM05qYjNKbElDVStKU0JtYVd4MFpYSW9JV2xtWDJGdWVTaGxkbVZ5ZVhSb2FXNW5LQ2tzSUdsekxtNWhLU2xjYmx4dUl5QkJibTV2ZEdGMGFXNW5JR2h2ZHlCMGFHVWdZMjl0Y0dGeWRHMWxiblFnWTJoaGJtZGxaRnh1ZEdoeVpYTm9iMnhrSUR3dElEQXVNVnh1WTNOamIzSmxJRHd0SUdOelkyOXlaU0FsUGlVZ2NtOTNkMmx6WlNncElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHbHpRVUpmUkUxVFR5QTlJR2xtWld4elpTaGpjMk52Y21WZlJFMVRUeUErSURBc0lGd2lRVndpTENCY0lrSmNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhWE5CUWw5Qk5EZzFJRDBnYVdabGJITmxLR056WTI5eVpWOUJORGcxSUQ0Z01Dd2dYQ0pCWENJc0lGd2lRbHdpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYUdGdVoyVlVlWEJsSUQwZ1kyRnpaVjkzYUdWdUtGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXSnpLR056WTI5eVpWOUVUVk5QSUMwZ1kzTmpiM0psWDBFME9EVXBJRHdnZEdoeVpYTm9iMnhrSUg0Z1hDSlZibU5vWVc1blpXUmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2x6UVVKZlJFMVRUeUE5UFNCY0lrRmNJaUFtSUdselFVSmZRVFE0TlNBOVBTQmNJa0pjSWlCK0lGd2lRWFJ2UWx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FYTkJRbDlFVFZOUElEMDlJRndpUWx3aUlDWWdhWE5CUWw5Qk5EZzFJRDA5SUZ3aVFWd2lJSDRnWENKQ2RHOUJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwYzBGQ1gwUk5VMDhnUFQwZ1hDSkJYQ0lnSmlCcGMwRkNYMEUwT0RVZ1BUMGdYQ0pCWENJZ0ppQmhZbk1vWTNOamIzSmxYMFJOVTA4cElENGdZV0p6S0dOelkyOXlaVjlCTkRnMUtTQitJRndpUVY5M1pXRnJaVzVwYm1kY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbHpRVUpmUkUxVFR5QTlQU0JjSWtGY0lpQW1JR2x6UVVKZlFUUTROU0E5UFNCY0lrRmNJaUFtSUdGaWN5aGpjMk52Y21WZlJFMVRUeWtnUEQwZ1lXSnpLR056WTI5eVpWOUJORGcxS1NCK0lGd2lRVjl6ZEhKbGJtZDBhR1Z1YVc1blhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBjMEZDWDBSTlUwOGdQVDBnWENKQ1hDSWdKaUJwYzBGQ1gwRTBPRFVnUFQwZ1hDSkNYQ0lnSmlCaFluTW9ZM05qYjNKbFgwUk5VMDhwSUQ0Z1lXSnpLR056WTI5eVpWOUJORGcxS1NCK0lGd2lRbDkzWldGclpXNXBibWRjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdselFVSmZSRTFUVHlBOVBTQmNJa0pjSWlBbUlHbHpRVUpmUVRRNE5TQTlQU0JjSWtKY0lpQW1JR0ZpY3loamMyTnZjbVZmUkUxVFR5a2dQRDBnWVdKektHTnpZMjl5WlY5Qk5EZzFLU0IrSUZ3aVFsOXpkSEpsYm1kMGFHVnVhVzVuWENJZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLU2xjYm1OelkyOXlaVjl6ZFcxdFlYSjVJRHd0SUhScFltSnNaU2hqYjIxd1lYSnBjMjl1SUQwZ2NtVndLRndpUVRRNE5WOTJjMTlFVFZOUFhDSXNJRGNwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOb1lXNW5aVlI1Y0dVZ1BTQmpLRndpUVhSdlFsd2lMQ0JjSWtKMGIwRmNJaXdnWENKQlgzZGxZV3RsYm1sdVoxd2lMQ0JjSWtGZmMzUnlaVzVuZEdobGJtbHVaMXdpTENCY0lrSmZkMlZoYTJWdWFXNW5YQ0lzSUZ3aVFsOXpkSEpsYm1kMGFHVnVhVzVuWENJc0lGd2lWVzVqYUdGdVoyVmtYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGJIVmxJRDBnWXloemRXMG9ZM05qYjNKbEpHTm9ZVzVuWlZSNWNHVWdQVDBnWENKQmRHOUNYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRXMG9ZM05qYjNKbEpHTm9ZVzVuWlZSNWNHVWdQVDBnWENKQ2RHOUJYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRXMG9ZM05qYjNKbEpHTm9ZVzVuWlZSNWNHVWdQVDBnWENKQlgzZGxZV3RsYm1sdVoxd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNWdEtHTnpZMjl5WlNSamFHRnVaMlZVZVhCbElEMDlJRndpUVY5emRISmxibWQwYUdWdWFXNW5YQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRXMG9ZM05qYjNKbEpHTm9ZVzVuWlZSNWNHVWdQVDBnWENKQ1gzZGxZV3RsYm1sdVoxd2lLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNWdEtHTnpZMjl5WlNSamFHRnVaMlZVZVhCbElEMDlJRndpUWw5emRISmxibWQwYUdWdWFXNW5YQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRXMG9ZM05qYjNKbEpHTm9ZVzVuWlZSNWNHVWdQVDBnWENKVmJtTm9ZVzVuWldSY0lpa3BLVnh1WTNOamIzSmxYM04xYlcxaGNua2tZMmhoYm1kbFZIbHdaU0E4TFNCbVlXTjBiM0lvWTNOamIzSmxYM04xYlcxaGNua2tZMmhoYm1kbFZIbHdaU3dnYkdWMlpXeHpJRDBnWXloY0lrRmZkMlZoYTJWdWFXNW5YQ0lzSUZ3aVFYUnZRbHdpTENCY0lrSmZjM1J5Wlc1bmRHaGxibWx1WjF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWtKZmQyVmhhMlZ1YVc1blhDSXNJRndpUW5SdlFWd2lMQ0JjSWtGZmMzUnlaVzVuZEdobGJtbHVaMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbFZ1WTJoaGJtZGxaRndpS1NsY2JtZG5jR3h2ZENoamMyTnZjbVZmYzNWdGJXRnllU3dnWVdWektIZ2dQU0JqYjIxd1lYSnBjMjl1TENCNUlEMGdkbUZzZFdVc0lHWnBiR3dnUFNCamFHRnVaMlZVZVhCbEtTa2dLeUJuWlc5dFgySmhjaWh3YjNOcGRHbHZiaUE5SUZ3aWMzUmhZMnRjSWl3Z2MzUmhkQ0E5SUZ3aWFXUmxiblJwZEhsY0lpa2dLMXh1SUNCMGFHVnRaVjlpZHlncElDdGNiaUFnYzJOaGJHVmZabWxzYkY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY0luTnJlV0pzZFdWY0lpd2dYQ0ppYkhWbFhDSXNJRndpWkdGeWEySnNkV1ZjSWl3Z1hDSndhVzVyWENJc0lGd2ljbVZrTWx3aUxDQmNJbVJoY210eVpXUmNJaUFzWENKbmNtVjVYQ0lwS1Z4dUlDQmNibUJnWUNKOSAtLT5cblxuYGBgclxuIyMjIElNUE9SVElORyBDT01QQVJNVE5FVCBTQ09SRVNcbmNvbXBEaXIgPC0gaGVyZShcXC4uLy4uXFwsIFxccmVzdWx0XFwsIFxcY29tcGFydG1lbnRcXCwgXFxDc2NvcmVUb29sc1xcKVxuXG5jc2NvcmUuRE1TTyA8LSBhc190aWJibGUoZnJlYWQoaGVyZShjb21wRGlyLCBcXEcxRE1TT19NZXJnZWRfMTBrYl9jc2NvcmVfZmluYWwuYmVkZ3JhcGhcXCksIHNraXAgPSAxKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVjIgPSBWMiArIDEpXG5jb2xuYW1lcyhjc2NvcmUuRE1TTykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcY3Njb3JlX0RNU09cXClcblxuY3Njb3JlLkE0ODUgPC0gYXNfdGliYmxlKGZyZWFkKGhlcmUoY29tcERpciwgXFxHMUE0ODVfTWVyZ2VkXzEwa2JfY3Njb3JlX2ZpbmFsLmJlZGdyYXBoXFwpLCBza2lwID0gMSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFYyID0gVjIgKyAxKVxuY29sbmFtZXMoY3Njb3JlLkE0ODUpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGNzY29yZV9BNDg1XFwpXG5cblxuY3Njb3JlIDwtIGRwbHlyOjpmdWxsX2pvaW4oY3Njb3JlLkRNU08sIGNzY29yZS5BNDg1LCBieSA9IGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKSlcblxuIyBGSUxURVIgUk9XUyBXSVRIIE5BXG5jc2NvcmUgPC0gY3Njb3JlICU+JSBmaWx0ZXIoIWlmX2FueShldmVyeXRoaW5nKCksIGlzLm5hKSlcblxuIyBBbm5vdGF0aW5nIGhvdyB0aGUgY29tcGFydG1lbnQgY2hhbmdlZFxudGhyZXNob2xkIDwtIDAuMVxuY3Njb3JlIDwtIGNzY29yZSAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKGlzQUJfRE1TTyA9IGlmZWxzZShjc2NvcmVfRE1TTyA+IDAsIFxcQVxcLCBcXEJcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBQl9BNDg1ID0gaWZlbHNlKGNzY29yZV9BNDg1ID4gMCwgXFxBXFwsIFxcQlxcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VUeXBlID0gY2FzZV93aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGNzY29yZV9ETVNPIC0gY3Njb3JlX0E0ODUpIDwgdGhyZXNob2xkIH4gXFxVbmNoYW5nZWRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUJfRE1TTyA9PSBcXEFcXCAmIGlzQUJfQTQ4NSA9PSBcXEJcXCB+IFxcQXRvQlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBQl9ETVNPID09IFxcQlxcICYgaXNBQl9BNDg1ID09IFxcQVxcIH4gXFxCdG9BXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FCX0RNU08gPT0gXFxBXFwgJiBpc0FCX0E0ODUgPT0gXFxBXFwgJiBhYnMoY3Njb3JlX0RNU08pID4gYWJzKGNzY29yZV9BNDg1KSB+IFxcQV93ZWFrZW5pbmdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUJfRE1TTyA9PSBcXEFcXCAmIGlzQUJfQTQ4NSA9PSBcXEFcXCAmIGFicyhjc2NvcmVfRE1TTykgPD0gYWJzKGNzY29yZV9BNDg1KSB+IFxcQV9zdHJlbmd0aGVuaW5nXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FCX0RNU08gPT0gXFxCXFwgJiBpc0FCX0E0ODUgPT0gXFxCXFwgJiBhYnMoY3Njb3JlX0RNU08pID4gYWJzKGNzY29yZV9BNDg1KSB+IFxcQl93ZWFrZW5pbmdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUJfRE1TTyA9PSBcXEJcXCAmIGlzQUJfQTQ4NSA9PSBcXEJcXCAmIGFicyhjc2NvcmVfRE1TTykgPD0gYWJzKGNzY29yZV9BNDg1KSB+IFxcQl9zdHJlbmd0aGVuaW5nXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlcbmNzY29yZV9zdW1tYXJ5IDwtIHRpYmJsZShjb21wYXJpc29uID0gcmVwKFxcQTQ4NV92c19ETVNPXFwsIDcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVR5cGUgPSBjKFxcQXRvQlxcLCBcXEJ0b0FcXCwgXFxBX3dlYWtlbmluZ1xcLCBcXEFfc3RyZW5ndGhlbmluZ1xcLCBcXEJfd2Vha2VuaW5nXFwsIFxcQl9zdHJlbmd0aGVuaW5nXFwsIFxcVW5jaGFuZ2VkXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYyhzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gXFxBdG9CXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gXFxCdG9BXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gXFxBX3dlYWtlbmluZ1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKGNzY29yZSRjaGFuZ2VUeXBlID09IFxcQV9zdHJlbmd0aGVuaW5nXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gXFxCX3dlYWtlbmluZ1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKGNzY29yZSRjaGFuZ2VUeXBlID09IFxcQl9zdHJlbmd0aGVuaW5nXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gXFxVbmNoYW5nZWRcXCkpKVxuY3Njb3JlX3N1bW1hcnkkY2hhbmdlVHlwZSA8LSBmYWN0b3IoY3Njb3JlX3N1bW1hcnkkY2hhbmdlVHlwZSwgbGV2ZWxzID0gYyhcXEFfd2Vha2VuaW5nXFwsIFxcQXRvQlxcLCBcXEJfc3RyZW5ndGhlbmluZ1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEJfd2Vha2VuaW5nXFwsIFxcQnRvQVxcLCBcXEFfc3RyZW5ndGhlbmluZ1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFVuY2hhbmdlZFxcKSlcbmdncGxvdChjc2NvcmVfc3VtbWFyeSwgYWVzKHggPSBjb21wYXJpc29uLCB5ID0gdmFsdWUsIGZpbGwgPSBjaGFuZ2VUeXBlKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9IFxcc3RhY2tcXCwgc3RhdCA9IFxcaWRlbnRpdHlcXCkgK1xuICB0aGVtZV9idygpICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXHNreWJsdWVcXCwgXFxibHVlXFwsIFxcZGFya2JsdWVcXCwgXFxwaW5rXFwsIFxccmVkMlxcLCBcXGRhcmtyZWRcXCAsXFxncmV5XFwpKVxuICBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
### IMPORTING COMPARMTNET SCORES
compDir <- here(\../..\, \result\, \compartment\, \CscoreTools\)

cscore.DMSO <- as_tibble(fread(here(compDir, \G1DMSO_Merged_10kb_cscore_final.bedgraph\), skip = 1)) %>%
  dplyr::mutate(V2 = V2 + 1)
colnames(cscore.DMSO) <- c(\chr\, \start\, \end\, \cscore_DMSO\)

cscore.A485 <- as_tibble(fread(here(compDir, \G1A485_Merged_10kb_cscore_final.bedgraph\), skip = 1)) %>%
  dplyr::mutate(V2 = V2 + 1)
colnames(cscore.A485) <- c(\chr\, \start\, \end\, \cscore_A485\)


cscore <- dplyr::full_join(cscore.DMSO, cscore.A485, by = c(\chr\, \start\, \end\))

# FILTER ROWS WITH NA
cscore <- cscore %>% filter(!if_any(everything(), is.na))

# Annotating how the compartment changed
threshold <- 0.1
cscore <- cscore %>% rowwise() %>% dplyr::mutate(isAB_DMSO = ifelse(cscore_DMSO > 0, \A\, \B\),
                                                 isAB_A485 = ifelse(cscore_A485 > 0, \A\, \B\),
                                                 changeType = case_when(
                                                   abs(cscore_DMSO - cscore_A485) < threshold ~ \Unchanged\,
                                                   isAB_DMSO == \A\ & isAB_A485 == \B\ ~ \AtoB\,
                                                   isAB_DMSO == \B\ & isAB_A485 == \A\ ~ \BtoA\,
                                                   isAB_DMSO == \A\ & isAB_A485 == \A\ & abs(cscore_DMSO) > abs(cscore_A485) ~ \A_weakening\,
                                                   isAB_DMSO == \A\ & isAB_A485 == \A\ & abs(cscore_DMSO) <= abs(cscore_A485) ~ \A_strengthening\,
                                                   isAB_DMSO == \B\ & isAB_A485 == \B\ & abs(cscore_DMSO) > abs(cscore_A485) ~ \B_weakening\,
                                                   isAB_DMSO == \B\ & isAB_A485 == \B\ & abs(cscore_DMSO) <= abs(cscore_A485) ~ \B_strengthening\                                                 ))
cscore_summary <- tibble(comparison = rep(\A485_vs_DMSO\, 7),
                         changeType = c(\AtoB\, \BtoA\, \A_weakening\, \A_strengthening\, \B_weakening\, \B_strengthening\, \Unchanged\),
                         value = c(sum(cscore$changeType == \AtoB\),
                                   sum(cscore$changeType == \BtoA\),
                                   sum(cscore$changeType == \A_weakening\),
                                   sum(cscore$changeType == \A_strengthening\),
                                   sum(cscore$changeType == \B_weakening\),
                                   sum(cscore$changeType == \B_strengthening\),
                                   sum(cscore$changeType == \Unchanged\)))
cscore_summary$changeType <- factor(cscore_summary$changeType, levels = c(\A_weakening\, \AtoB\, \B_strengthening\,
                                                                          \B_weakening\, \BtoA\, \A_strengthening\,
                                                                          \Unchanged\))
ggplot(cscore_summary, aes(x = comparison, y = value, fill = changeType)) + geom_bar(position = \stack\, stat = \identity\) +
  theme_bw() +
  scale_fill_manual(values = c(\skyblue\, \blue\, \darkblue\, \pink\, \red2\, \darkred\ ,\grey\))
  



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJRWxOVUU5U1ZFbE9SeUJEVDAxUVFWSk5WRTVGVkNCVFEwOVNSVk5jYm1OdmJYQkVhWElnUEMwZ2FHVnlaU2hjWEM0dUx5NHVYRndzSUZ4Y2NtVnpkV3gwWEZ3c0lGeGNZMjl0Y0dGeWRHMWxiblJjWEN3Z1hGeERjMk52Y21WVWIyOXNjMXhjS1Z4dVhHNWpjMk52Y21VdVJFMVRUeUE4TFNCaGMxOTBhV0ppYkdVb1puSmxZV1FvYUdWeVpTaGpiMjF3UkdseUxDQmNYRWN4UkUxVFQxOU5aWEpuWldSZk1UQnJZbDlqYzJOdmNtVmZabWx1WVd3dVltVmtaM0poY0doY1hDa3NJSE5yYVhBZ1BTQXhLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ZqSWdQU0JXTWlBcklERXBYRzVqYjJ4dVlXMWxjeWhqYzJOdmNtVXVSRTFUVHlrZ1BDMGdZeWhjWEdOb2NseGNMQ0JjWEhOMFlYSjBYRndzSUZ4Y1pXNWtYRndzSUZ4Y1kzTmpiM0psWDBSTlUwOWNYQ2xjYmx4dVkzTmpiM0psTGtFME9EVWdQQzBnWVhOZmRHbGlZbXhsS0daeVpXRmtLR2hsY21Vb1kyOXRjRVJwY2l3Z1hGeEhNVUUwT0RWZlRXVnlaMlZrWHpFd2EySmZZM05qYjNKbFgyWnBibUZzTG1KbFpHZHlZWEJvWEZ3cExDQnphMmx3SUQwZ01Ta3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0ZZeUlEMGdWaklnS3lBeEtWeHVZMjlzYm1GdFpYTW9ZM05qYjNKbExrRTBPRFVwSUR3dElHTW9YRnhqYUhKY1hDd2dYRnh6ZEdGeWRGeGNMQ0JjWEdWdVpGeGNMQ0JjWEdOelkyOXlaVjlCTkRnMVhGd3BYRzVjYmx4dVkzTmpiM0psSUR3dElHUndiSGx5T2pwbWRXeHNYMnB2YVc0b1kzTmpiM0psTGtSTlUwOHNJR056WTI5eVpTNUJORGcxTENCaWVTQTlJR01vWEZ4amFISmNYQ3dnWEZ4emRHRnlkRnhjTENCY1hHVnVaRnhjS1NsY2JseHVJeUJHU1V4VVJWSWdVazlYVXlCWFNWUklJRTVCWEc1amMyTnZjbVVnUEMwZ1kzTmpiM0psSUNVK0pTQm1hV3gwWlhJb0lXbG1YMkZ1ZVNobGRtVnllWFJvYVc1bktDa3NJR2x6TG01aEtTbGNibHh1SXlCQmJtNXZkR0YwYVc1bklHaHZkeUIwYUdVZ1kyOXRjR0Z5ZEcxbGJuUWdZMmhoYm1kbFpGeHVkR2h5WlhOb2IyeGtJRHd0SURBdU1WeHVZM05qYjNKbElEd3RJR056WTI5eVpTQWxQaVVnY205M2QybHpaU2dwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dselFVSmZSRTFUVHlBOUlHbG1aV3h6WlNoamMyTnZjbVZmUkUxVFR5QStJREFzSUZ4Y1FWeGNMQ0JjWEVKY1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FYTkJRbDlCTkRnMUlEMGdhV1psYkhObEtHTnpZMjl5WlY5Qk5EZzFJRDRnTUN3Z1hGeEJYRndzSUZ4Y1FseGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmphR0Z1WjJWVWVYQmxJRDBnWTJGelpWOTNhR1Z1S0Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVdKektHTnpZMjl5WlY5RVRWTlBJQzBnWTNOamIzSmxYMEUwT0RVcElEd2dkR2h5WlhOb2IyeGtJSDRnWEZ4VmJtTm9ZVzVuWldSY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbHpRVUpmUkUxVFR5QTlQU0JjWEVGY1hDQW1JR2x6UVVKZlFUUTROU0E5UFNCY1hFSmNYQ0IrSUZ4Y1FYUnZRbHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVhOQlFsOUVUVk5QSUQwOUlGeGNRbHhjSUNZZ2FYTkJRbDlCTkRnMUlEMDlJRnhjUVZ4Y0lINGdYRnhDZEc5QlhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBjMEZDWDBSTlUwOGdQVDBnWEZ4QlhGd2dKaUJwYzBGQ1gwRTBPRFVnUFQwZ1hGeEJYRndnSmlCaFluTW9ZM05qYjNKbFgwUk5VMDhwSUQ0Z1lXSnpLR056WTI5eVpWOUJORGcxS1NCK0lGeGNRVjkzWldGclpXNXBibWRjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdselFVSmZSRTFUVHlBOVBTQmNYRUZjWENBbUlHbHpRVUpmUVRRNE5TQTlQU0JjWEVGY1hDQW1JR0ZpY3loamMyTnZjbVZmUkUxVFR5a2dQRDBnWVdKektHTnpZMjl5WlY5Qk5EZzFLU0IrSUZ4Y1FWOXpkSEpsYm1kMGFHVnVhVzVuWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcGMwRkNYMFJOVTA4Z1BUMGdYRnhDWEZ3Z0ppQnBjMEZDWDBFME9EVWdQVDBnWEZ4Q1hGd2dKaUJoWW5Nb1kzTmpiM0psWDBSTlUwOHBJRDRnWVdKektHTnpZMjl5WlY5Qk5EZzFLU0IrSUZ4Y1FsOTNaV0ZyWlc1cGJtZGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2x6UVVKZlJFMVRUeUE5UFNCY1hFSmNYQ0FtSUdselFVSmZRVFE0TlNBOVBTQmNYRUpjWENBbUlHRmljeWhqYzJOdmNtVmZSRTFUVHlrZ1BEMGdZV0p6S0dOelkyOXlaVjlCTkRnMUtTQitJRnhjUWw5emRISmxibWQwYUdWdWFXNW5YRndnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tTbGNibU56WTI5eVpWOXpkVzF0WVhKNUlEd3RJSFJwWW1Kc1pTaGpiMjF3WVhKcGMyOXVJRDBnY21Wd0tGeGNRVFE0TlY5MmMxOUVUVk5QWEZ3c0lEY3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05vWVc1blpWUjVjR1VnUFNCaktGeGNRWFJ2UWx4Y0xDQmNYRUowYjBGY1hDd2dYRnhCWDNkbFlXdGxibWx1WjF4Y0xDQmNYRUZmYzNSeVpXNW5kR2hsYm1sdVoxeGNMQ0JjWEVKZmQyVmhhMlZ1YVc1blhGd3NJRnhjUWw5emRISmxibWQwYUdWdWFXNW5YRndzSUZ4Y1ZXNWphR0Z1WjJWa1hGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoYkhWbElEMGdZeWh6ZFcwb1kzTmpiM0psSkdOb1lXNW5aVlI1Y0dVZ1BUMGdYRnhCZEc5Q1hGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZFcwb1kzTmpiM0psSkdOb1lXNW5aVlI1Y0dVZ1BUMGdYRnhDZEc5QlhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZFcwb1kzTmpiM0psSkdOb1lXNW5aVlI1Y0dVZ1BUMGdYRnhCWDNkbFlXdGxibWx1WjF4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM1Z0S0dOelkyOXlaU1JqYUdGdVoyVlVlWEJsSUQwOUlGeGNRVjl6ZEhKbGJtZDBhR1Z1YVc1blhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZFcwb1kzTmpiM0psSkdOb1lXNW5aVlI1Y0dVZ1BUMGdYRnhDWDNkbFlXdGxibWx1WjF4Y0tTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM1Z0S0dOelkyOXlaU1JqYUdGdVoyVlVlWEJsSUQwOUlGeGNRbDl6ZEhKbGJtZDBhR1Z1YVc1blhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZFcwb1kzTmpiM0psSkdOb1lXNW5aVlI1Y0dVZ1BUMGdYRnhWYm1Ob1lXNW5aV1JjWENrcEtWeHVZM05qYjNKbFgzTjFiVzFoY25ra1kyaGhibWRsVkhsd1pTQThMU0JtWVdOMGIzSW9ZM05qYjNKbFgzTjFiVzFoY25ra1kyaGhibWRsVkhsd1pTd2diR1YyWld4eklEMGdZeWhjWEVGZmQyVmhhMlZ1YVc1blhGd3NJRnhjUVhSdlFseGNMQ0JjWEVKZmMzUnlaVzVuZEdobGJtbHVaMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYRUpmZDJWaGEyVnVhVzVuWEZ3c0lGeGNRblJ2UVZ4Y0xDQmNYRUZmYzNSeVpXNW5kR2hsYm1sdVoxeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hGVnVZMmhoYm1kbFpGeGNLU2xjYm1kbmNHeHZkQ2hqYzJOdmNtVmZjM1Z0YldGeWVTd2dZV1Z6S0hnZ1BTQmpiMjF3WVhKcGMyOXVMQ0I1SUQwZ2RtRnNkV1VzSUdacGJHd2dQU0JqYUdGdVoyVlVlWEJsS1NrZ0t5Qm5aVzl0WDJKaGNpaHdiM05wZEdsdmJpQTlJRnhjYzNSaFkydGNYQ3dnYzNSaGRDQTlJRnhjYVdSbGJuUnBkSGxjWENrZ0sxeHVJQ0IwYUdWdFpWOWlkeWdwSUN0Y2JpQWdjMk5oYkdWZlptbHNiRjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjWEhOcmVXSnNkV1ZjWEN3Z1hGeGliSFZsWEZ3c0lGeGNaR0Z5YTJKc2RXVmNYQ3dnWEZ4d2FXNXJYRndzSUZ4Y2NtVmtNbHhjTENCY1hHUmhjbXR5WldSY1hDQXNYRnhuY21WNVhGd3BLVnh1SUNCY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbiMjIyBJTVBPUlRJTkcgQ09NUEFSTVRORVQgU0NPUkVTXG5jb21wRGlyIDwtIGhlcmUoXFwuLi8uLlxcLCBcXHJlc3VsdFxcLCBcXGNvbXBhcnRtZW50XFwsIFxcQ3Njb3JlVG9vbHNcXClcblxuY3Njb3JlLkRNU08gPC0gYXNfdGliYmxlKGZyZWFkKGhlcmUoY29tcERpciwgXFxHMURNU09fTWVyZ2VkXzEwa2JfY3Njb3JlX2ZpbmFsLmJlZGdyYXBoXFwpLCBza2lwID0gMSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFYyID0gVjIgKyAxKVxuY29sbmFtZXMoY3Njb3JlLkRNU08pIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGNzY29yZV9ETVNPXFwpXG5cbmNzY29yZS5BNDg1IDwtIGFzX3RpYmJsZShmcmVhZChoZXJlKGNvbXBEaXIsIFxcRzFBNDg1X01lcmdlZF8xMGtiX2NzY29yZV9maW5hbC5iZWRncmFwaFxcKSwgc2tpcCA9IDEpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShWMiA9IFYyICsgMSlcbmNvbG5hbWVzKGNzY29yZS5BNDg1KSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxjc2NvcmVfQTQ4NVxcKVxuXG5cbmNzY29yZSA8LSBkcGx5cjo6ZnVsbF9qb2luKGNzY29yZS5ETVNPLCBjc2NvcmUuQTQ4NSwgYnkgPSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCkpXG5cbiMgRklMVEVSIFJPV1MgV0lUSCBOQVxuY3Njb3JlIDwtIGNzY29yZSAlPiUgZmlsdGVyKCFpZl9hbnkoZXZlcnl0aGluZygpLCBpcy5uYSkpXG5cbiMgQW5ub3RhdGluZyBob3cgdGhlIGNvbXBhcnRtZW50IGNoYW5nZWRcbnRocmVzaG9sZCA8LSAwLjFcbmNzY29yZSA8LSBjc2NvcmUgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShpc0FCX0RNU08gPSBpZmVsc2UoY3Njb3JlX0RNU08gPiAwLCBcXEFcXCwgXFxCXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUJfQTQ4NSA9IGlmZWxzZShjc2NvcmVfQTQ4NSA+IDAsIFxcQVxcLCBcXEJcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlVHlwZSA9IGNhc2Vfd2hlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhjc2NvcmVfRE1TTyAtIGNzY29yZV9BNDg1KSA8IHRocmVzaG9sZCB+IFxcVW5jaGFuZ2VkXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FCX0RNU08gPT0gXFxBXFwgJiBpc0FCX0E0ODUgPT0gXFxCXFwgfiBcXEF0b0JcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUJfRE1TTyA9PSBcXEJcXCAmIGlzQUJfQTQ4NSA9PSBcXEFcXCB+IFxcQnRvQVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBQl9ETVNPID09IFxcQVxcICYgaXNBQl9BNDg1ID09IFxcQVxcICYgYWJzKGNzY29yZV9ETVNPKSA+IGFicyhjc2NvcmVfQTQ4NSkgfiBcXEFfd2Vha2VuaW5nXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FCX0RNU08gPT0gXFxBXFwgJiBpc0FCX0E0ODUgPT0gXFxBXFwgJiBhYnMoY3Njb3JlX0RNU08pIDw9IGFicyhjc2NvcmVfQTQ4NSkgfiBcXEFfc3RyZW5ndGhlbmluZ1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBQl9ETVNPID09IFxcQlxcICYgaXNBQl9BNDg1ID09IFxcQlxcICYgYWJzKGNzY29yZV9ETVNPKSA+IGFicyhjc2NvcmVfQTQ4NSkgfiBcXEJfd2Vha2VuaW5nXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FCX0RNU08gPT0gXFxCXFwgJiBpc0FCX0E0ODUgPT0gXFxCXFwgJiBhYnMoY3Njb3JlX0RNU08pIDw9IGFicyhjc2NvcmVfQTQ4NSkgfiBcXEJfc3RyZW5ndGhlbmluZ1xcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXG5jc2NvcmVfc3VtbWFyeSA8LSB0aWJibGUoY29tcGFyaXNvbiA9IHJlcChcXEE0ODVfdnNfRE1TT1xcLCA3KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VUeXBlID0gYyhcXEF0b0JcXCwgXFxCdG9BXFwsIFxcQV93ZWFrZW5pbmdcXCwgXFxBX3N0cmVuZ3RoZW5pbmdcXCwgXFxCX3dlYWtlbmluZ1xcLCBcXEJfc3RyZW5ndGhlbmluZ1xcLCBcXFVuY2hhbmdlZFxcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGMoc3VtKGNzY29yZSRjaGFuZ2VUeXBlID09IFxcQXRvQlxcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKGNzY29yZSRjaGFuZ2VUeXBlID09IFxcQnRvQVxcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKGNzY29yZSRjaGFuZ2VUeXBlID09IFxcQV93ZWFrZW5pbmdcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShjc2NvcmUkY2hhbmdlVHlwZSA9PSBcXEFfc3RyZW5ndGhlbmluZ1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKGNzY29yZSRjaGFuZ2VUeXBlID09IFxcQl93ZWFrZW5pbmdcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShjc2NvcmUkY2hhbmdlVHlwZSA9PSBcXEJfc3RyZW5ndGhlbmluZ1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKGNzY29yZSRjaGFuZ2VUeXBlID09IFxcVW5jaGFuZ2VkXFwpKSlcbmNzY29yZV9zdW1tYXJ5JGNoYW5nZVR5cGUgPC0gZmFjdG9yKGNzY29yZV9zdW1tYXJ5JGNoYW5nZVR5cGUsIGxldmVscyA9IGMoXFxBX3dlYWtlbmluZ1xcLCBcXEF0b0JcXCwgXFxCX3N0cmVuZ3RoZW5pbmdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxCX3dlYWtlbmluZ1xcLCBcXEJ0b0FcXCwgXFxBX3N0cmVuZ3RoZW5pbmdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxVbmNoYW5nZWRcXCkpXG5nZ3Bsb3QoY3Njb3JlX3N1bW1hcnksIGFlcyh4ID0gY29tcGFyaXNvbiwgeSA9IHZhbHVlLCBmaWxsID0gY2hhbmdlVHlwZSkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSBcXHN0YWNrXFwsIHN0YXQgPSBcXGlkZW50aXR5XFwpICtcbiAgdGhlbWVfYncoKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFxza3libHVlXFwsIFxcYmx1ZVxcLCBcXGRhcmtibHVlXFwsIFxccGlua1xcLCBcXHJlZDJcXCwgXFxkYXJrcmVkXFwgLFxcZ3JleVxcKSlcbiAgXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIElNUE9SVElORyBDT01QQVJNVE5FVCBTQ09SRVNcbmNvbXBEaXIgPC0gaGVyZShcXC4uLy4uXFwsIFxccmVzdWx0XFwsIFxcY29tcGFydG1lbnRcXCwgXFxDc2NvcmVUb29sc1xcKVxuXG5jc2NvcmUuRE1TTyA8LSBhc190aWJibGUoZnJlYWQoaGVyZShjb21wRGlyLCBcXEcxRE1TT19NZXJnZWRfMTBrYl9jc2NvcmVfZmluYWwuYmVkZ3JhcGhcXCksIHNraXAgPSAxKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVjIgPSBWMiArIDEpXG5jb2xuYW1lcyhjc2NvcmUuRE1TTykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcY3Njb3JlX0RNU09cXClcblxuY3Njb3JlLkE0ODUgPC0gYXNfdGliYmxlKGZyZWFkKGhlcmUoY29tcERpciwgXFxHMUE0ODVfTWVyZ2VkXzEwa2JfY3Njb3JlX2ZpbmFsLmJlZGdyYXBoXFwpLCBza2lwID0gMSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFYyID0gVjIgKyAxKVxuY29sbmFtZXMoY3Njb3JlLkE0ODUpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGNzY29yZV9BNDg1XFwpXG5cblxuY3Njb3JlIDwtIGRwbHlyOjpmdWxsX2pvaW4oY3Njb3JlLkRNU08sIGNzY29yZS5BNDg1LCBieSA9IGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKSlcblxuIyBGSUxURVIgUk9XUyBXSVRIIE5BXG5jc2NvcmUgPC0gY3Njb3JlICU+JSBmaWx0ZXIoIWlmX2FueShldmVyeXRoaW5nKCksIGlzLm5hKSlcblxuIyBBbm5vdGF0aW5nIGhvdyB0aGUgY29tcGFydG1lbnQgY2hhbmdlZFxudGhyZXNob2xkIDwtIDAuMVxuY3Njb3JlIDwtIGNzY29yZSAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKGlzQUJfRE1TTyA9IGlmZWxzZShjc2NvcmVfRE1TTyA+IDAsIFxcQVxcLCBcXEJcXCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBQl9BNDg1ID0gaWZlbHNlKGNzY29yZV9BNDg1ID4gMCwgXFxBXFwsIFxcQlxcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VUeXBlID0gY2FzZV93aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGNzY29yZV9ETVNPIC0gY3Njb3JlX0E0ODUpIDwgdGhyZXNob2xkIH4gXFxVbmNoYW5nZWRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUJfRE1TTyA9PSBcXEFcXCAmIGlzQUJfQTQ4NSA9PSBcXEJcXCB+IFxcQXRvQlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBQl9ETVNPID09IFxcQlxcICYgaXNBQl9BNDg1ID09IFxcQVxcIH4gXFxCdG9BXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FCX0RNU08gPT0gXFxBXFwgJiBpc0FCX0E0ODUgPT0gXFxBXFwgJiBhYnMoY3Njb3JlX0RNU08pID4gYWJzKGNzY29yZV9BNDg1KSB+IFxcQV93ZWFrZW5pbmdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUJfRE1TTyA9PSBcXEFcXCAmIGlzQUJfQTQ4NSA9PSBcXEFcXCAmIGFicyhjc2NvcmVfRE1TTykgPD0gYWJzKGNzY29yZV9BNDg1KSB+IFxcQV9zdHJlbmd0aGVuaW5nXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FCX0RNU08gPT0gXFxCXFwgJiBpc0FCX0E0ODUgPT0gXFxCXFwgJiBhYnMoY3Njb3JlX0RNU08pID4gYWJzKGNzY29yZV9BNDg1KSB+IFxcQl93ZWFrZW5pbmdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUJfRE1TTyA9PSBcXEJcXCAmIGlzQUJfQTQ4NSA9PSBcXEJcXCAmIGFicyhjc2NvcmVfRE1TTykgPD0gYWJzKGNzY29yZV9BNDg1KSB+IFxcQl9zdHJlbmd0aGVuaW5nXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlcbmNzY29yZV9zdW1tYXJ5IDwtIHRpYmJsZShjb21wYXJpc29uID0gcmVwKFxcQTQ4NV92c19ETVNPXFwsIDcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVR5cGUgPSBjKFxcQXRvQlxcLCBcXEJ0b0FcXCwgXFxBX3dlYWtlbmluZ1xcLCBcXEFfc3RyZW5ndGhlbmluZ1xcLCBcXEJfd2Vha2VuaW5nXFwsIFxcQl9zdHJlbmd0aGVuaW5nXFwsIFxcVW5jaGFuZ2VkXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYyhzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gXFxBdG9CXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gXFxCdG9BXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gXFxBX3dlYWtlbmluZ1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKGNzY29yZSRjaGFuZ2VUeXBlID09IFxcQV9zdHJlbmd0aGVuaW5nXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gXFxCX3dlYWtlbmluZ1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKGNzY29yZSRjaGFuZ2VUeXBlID09IFxcQl9zdHJlbmd0aGVuaW5nXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gXFxVbmNoYW5nZWRcXCkpKVxuY3Njb3JlX3N1bW1hcnkkY2hhbmdlVHlwZSA8LSBmYWN0b3IoY3Njb3JlX3N1bW1hcnkkY2hhbmdlVHlwZSwgbGV2ZWxzID0gYyhcXEFfd2Vha2VuaW5nXFwsIFxcQXRvQlxcLCBcXEJfc3RyZW5ndGhlbmluZ1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEJfd2Vha2VuaW5nXFwsIFxcQnRvQVxcLCBcXEFfc3RyZW5ndGhlbmluZ1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFVuY2hhbmdlZFxcKSlcbmdncGxvdChjc2NvcmVfc3VtbWFyeSwgYWVzKHggPSBjb21wYXJpc29uLCB5ID0gdmFsdWUsIGZpbGwgPSBjaGFuZ2VUeXBlKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9IFxcc3RhY2tcXCwgc3RhdCA9IFxcaWRlbnRpdHlcXCkgK1xuICB0aGVtZV9idygpICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXHNreWJsdWVcXCwgXFxibHVlXFwsIFxcZGFya2JsdWVcXCwgXFxwaW5rXFwsIFxccmVkMlxcLCBcXGRhcmtyZWRcXCAsXFxncmV5XFwpKVxuICBcbmBgYFxuYGBgIn0= -->

```r
```r
### IMPORTING COMPARMTNET SCORES
compDir <- here(\../..\, \result\, \compartment\, \CscoreTools\)

cscore.DMSO <- as_tibble(fread(here(compDir, \G1DMSO_Merged_10kb_cscore_final.bedgraph\), skip = 1)) %>%
  dplyr::mutate(V2 = V2 + 1)
colnames(cscore.DMSO) <- c(\chr\, \start\, \end\, \cscore_DMSO\)

cscore.A485 <- as_tibble(fread(here(compDir, \G1A485_Merged_10kb_cscore_final.bedgraph\), skip = 1)) %>%
  dplyr::mutate(V2 = V2 + 1)
colnames(cscore.A485) <- c(\chr\, \start\, \end\, \cscore_A485\)


cscore <- dplyr::full_join(cscore.DMSO, cscore.A485, by = c(\chr\, \start\, \end\))

# FILTER ROWS WITH NA
cscore <- cscore %>% filter(!if_any(everything(), is.na))

# Annotating how the compartment changed
threshold <- 0.1
cscore <- cscore %>% rowwise() %>% dplyr::mutate(isAB_DMSO = ifelse(cscore_DMSO > 0, \A\, \B\),
                                                 isAB_A485 = ifelse(cscore_A485 > 0, \A\, \B\),
                                                 changeType = case_when(
                                                   abs(cscore_DMSO - cscore_A485) < threshold ~ \Unchanged\,
                                                   isAB_DMSO == \A\ & isAB_A485 == \B\ ~ \AtoB\,
                                                   isAB_DMSO == \B\ & isAB_A485 == \A\ ~ \BtoA\,
                                                   isAB_DMSO == \A\ & isAB_A485 == \A\ & abs(cscore_DMSO) > abs(cscore_A485) ~ \A_weakening\,
                                                   isAB_DMSO == \A\ & isAB_A485 == \A\ & abs(cscore_DMSO) <= abs(cscore_A485) ~ \A_strengthening\,
                                                   isAB_DMSO == \B\ & isAB_A485 == \B\ & abs(cscore_DMSO) > abs(cscore_A485) ~ \B_weakening\,
                                                   isAB_DMSO == \B\ & isAB_A485 == \B\ & abs(cscore_DMSO) <= abs(cscore_A485) ~ \B_strengthening\                                                 ))
cscore_summary <- tibble(comparison = rep(\A485_vs_DMSO\, 7),
                         changeType = c(\AtoB\, \BtoA\, \A_weakening\, \A_strengthening\, \B_weakening\, \B_strengthening\, \Unchanged\),
                         value = c(sum(cscore$changeType == \AtoB\),
                                   sum(cscore$changeType == \BtoA\),
                                   sum(cscore$changeType == \A_weakening\),
                                   sum(cscore$changeType == \A_strengthening\),
                                   sum(cscore$changeType == \B_weakening\),
                                   sum(cscore$changeType == \B_strengthening\),
                                   sum(cscore$changeType == \Unchanged\)))
cscore_summary$changeType <- factor(cscore_summary$changeType, levels = c(\A_weakening\, \AtoB\, \B_strengthening\,
                                                                          \B_weakening\, \BtoA\, \A_strengthening\,
                                                                          \Unchanged\))
ggplot(cscore_summary, aes(x = comparison, y = value, fill = changeType)) + geom_bar(position = \stack\, stat = \identity\) +
  theme_bw() +
  scale_fill_manual(values = c(\skyblue\, \blue\, \darkblue\, \pink\, \red2\, \darkred\ ,\grey\))
  
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



#### Scatterplot & box plot

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMlZ1WlM1MFlpQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKdGJURXdYMGRTUTIwek9DNXdObDluWlc1bFgzTnZjblJsWkM1aVpXUmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGUlRVeUE5SUdsbVpXeHpaU2hXTkNBOVBTQmNJaXRjSWl3Z1ZqSXNJRll6S1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9WakVzSUZSVFV5d2dWallwWEc1amIyeHVZVzFsY3loblpXNWxMblJpS1NBOExTQmpLRndpWTJoeVhDSXNJRndpVkZOVFhDSXNJRndpWlc1elpXMWliRndpS1Z4dVhHNWthV1ptTGxKT1FTQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKa2FXWm1YMGN4TGtFME9EVXVjMlZzWldOMFpXUXlYMGN4TGpKcExrRTBPRFZmZG5OZlJ6RXVNbWt1UkUxVFR5NTBjM1pjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR1Z1YzJWdFlteGZaMlZ1WlY5cFpDd2diRzluTWtadmJHUkRhR0Z1WjJVc0lITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2NHRmthaXdnWlhoMFpYSnVZV3hmWjJWdVpWOXVZVzFsS1Z4dVpHbG1aaTVTVGtFZ1BDMGdaR2xtWmk1U1RrRWdKVDRsSUdSd2JIbHlPanBzWldaMFgycHZhVzRvWjJWdVpTNTBZaXdnWW5rZ1BTQmpLRndpWlc1elpXMWliRjluWlc1bFgybGtYQ0lnUFNCY0ltVnVjMlZ0WW14Y0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0NGcGN5NXVZU2hVVTFNcEtWeHVYRzVoYkhCb1lTQThMU0F3TGpBMVhHNW1ZME4xZEc5bVppQThMU0F3TGpWY2JseHVaR2xtWmk1U1RrRWdQQzBnWkdsbVppNVNUa0VnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWkdsbVppQTlJR05oYzJWZmQyaGxiaWh3WVdScUlEd2dZV3h3YUdFZ0ppQnphSEpwYm10bFpGOXNiMmN5UmtNZ1BpQm1ZME4xZEc5bVppQitJRndpVlZCY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0dGa2FpQThJR0ZzY0doaElDWWdjMmh5YVc1clpXUmZiRzluTWtaRElEd2dMV1pqUTNWMGIyWm1JSDRnWENKRVQxZE9YQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlNWVVVnZmlCY0lrNVBYQ0lwS1Z4dVhHNWNibWRsZEVOdmJYQkRhR0Z1WjJWVWVYQmxJRHd0SUdaMWJtTjBhVzl1S0dOb2NtOXRMQ0JVVTFNc0lHTnpZMjl5WlM1MFlpbDdYRzRnSUhSbGJYQXVkR0lnUEMwZ1kzTmpiM0psTG5SaUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHTm9jaUE5UFNCamFISnZiU3dnYzNSaGNuUWdQQ0JVVTFNc0lHVnVaQ0ErSUZSVFV5bGNiaUFnYjNWMElEd3RJSFJsYlhBdWRHSWtZMmhoYm1kbFZIbHdaVnh1SUNCcFppaHNaVzVuZEdnb2IzVjBLU0E4SURFcGUxeHVJQ0FnSUhKbGRIVnliaWhPUVNsY2JpQWdmV1ZzYzJWN1hHNGdJQ0FnY21WMGRYSnVLRzkxZENsY2JpQWdmVnh1ZlZ4dVhHNWpjMk52Y21VdVozSWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLR056WTI5eVpWc3hPak5kS1Z4dWRHVnRjQ0E4TFdScFptWXVVazVCSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0hOMFlYSjBJRDBnVkZOVExDQmxibVFnUFNCVVUxTWdLekVwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHTm9jaXdnYzNSaGNuUXNJR1Z1WkNsY2JtUnBabVl1VWs1QkxtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2gwWlcxd0tWeHViM1psY214aGNDQThMU0JtYVc1a1QzWmxjbXhoY0hNb1pHbG1aaTVTVGtFdVozSXNJR056WTI5eVpTNW5jaWxjYmx4dUkyTnpZMjl5WlM1elpXeGxZM1JsWkNBOExTQmpjMk52Y21VZ0pUNGxJR1J3YkhseU9qcHpiR2xqWlNoemRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd0tTbGNiaU1qSUZCeWIySnNaVzBnYjJZZ1kyVnlkR0ZwYmlCblpXNWxjeUJ1YjNRZ1oyVjBkR2x1WnlCdmRtVnliR0Z3SUhkcGRHZ2dZM05qYjNKbElHUjFaU0IwYnlCemNHRnljMlVnWTJGc2JHbHVaejljYm1KaGRHTm9NU0E4TFNCaWFXNWtYMk52YkhNb1pHbG1aaTVTVGtGYmNYVmxjbmxJYVhSektHOTJaWEpzWVhBcFhTeGNiaUFnSUNBZ0lDQWdJQ0JrWVhSaExuUmhZbXhsS0dOelkyOXlaU2xiYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0NsZEtWeHVYRzVjYm0xcGMzTmxaQ0E4TFNCa2FXWm1MbEpPUVZzdGNYVmxjbmxJYVhSektHOTJaWEpzWVhBcFhWeHVkR1Z0Y0NBOExTQnRhWE56WldRZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ZGTlRJRDBnVkZOVElDc2dNVEF3TURBcElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtITjBZWEowSUQwZ1ZGTlRMQ0JsYm1RZ1BTQlVVMU1nS3pFcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR05vY2l3Z2MzUmhjblFzSUdWdVpDbGNibTFwYzNObFpDNW5jaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvZEdWdGNDbGNibTkyWlhKc1lYQWdQQzBnWm1sdVpFOTJaWEpzWVhCektHMXBjM05sWkM1bmNpd2dZM05qYjNKbExtZHlLVnh1WW1GMFkyZ3lJRHd0SUdKcGJtUmZZMjlzY3lodGFYTnpaV1JiY1hWbGNubElhWFJ6S0c5MlpYSnNZWEFwWFN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR0YwWVM1MFlXSnNaU2hqYzJOdmNtVXBXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEFwWFNsY2JseHViV2x6YzJWa01pQThMU0J0YVhOelpXUmJMWEYxWlhKNVNHbDBjeWh2ZG1WeWJHRndLVjFjYm5SbGJYQWdQQzBnYldsemMyVmtNaUFsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hVVTFNZ1BTQlVVMU1nTFNBeE1EQXdNQ2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvYzNSaGNuUWdQU0JVVTFNc0lHVnVaQ0E5SUZSVFV5QXJNU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1kyaHlMQ0J6ZEdGeWRDd2daVzVrS1Z4dWJXbHpjMlZrTG1keUlEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaDBaVzF3S1Z4dWIzWmxjbXhoY0NBOExTQm1hVzVrVDNabGNteGhjSE1vYldsemMyVmtMbWR5TENCamMyTnZjbVV1WjNJcFhHNWlZWFJqYURNZ1BDMGdZbWx1WkY5amIyeHpLRzFwYzNObFpESmJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQXBYU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHRjBZUzUwWVdKc1pTaGpjMk52Y21VcFczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQXBYU2xjYmx4dUkyMXBjM05sWkRNZ1BDMGdiV2x6YzJWa01sc3RjWFZsY25sSWFYUnpLRzkyWlhKc1lYQXBYVnh1WEc1Y2JtUnBabVl1VWs1QklEd3RJR0pwYm1SZmNtOTNjeWhpWVhSamFERXNJR0poZEdOb01pd2dZbUYwWTJnektWeHVYRzVjYmlNZ1ZrbFRWVUZNU1ZwRlhHNWthV1ptTGxKT1FTUmphR0Z1WjJWVWVYQmxJRHd0SUdaaFkzUnZjaWhrYVdabUxsSk9RU1JqYUdGdVoyVlVlWEJsTENCc1pYWmxiSE1nUFNCaktGd2lRVjkzWldGclpXNXBibWRjSWl3Z1hDSkJkRzlDWENJc0lGd2lRbDl6ZEhKbGJtZDBhR1Z1YVc1blhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVFsOTNaV0ZyWlc1cGJtZGNJaXdnWENKQ2RHOUJYQ0lzSUZ3aVFWOXpkSEpsYm1kMGFHVnVhVzVuWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpVlc1amFHRnVaMlZrWENJcEtWeHVaMmR3Ykc5MEtHUnBabVl1VWs1QkxDQmhaWE1vZUNBOUlHUnBabVlzSUdacGJHd2dQU0JqYUdGdVoyVlVlWEJsS1NrZ0sxeHVJQ0JuWlc5dFgySmhjaWh3YjNOcGRHbHZiaUE5SUZ3aVptbHNiRndpS1NBclhHNGdJR3hoWW5Nb2RHbDBiR1VnUFNCY0lsTjBZV05yWldRZ1FtRnlJRkJzYjNRZ2IyWWdRMmhoYm1kbElGUjVjR1VnWW5rZ1JHbG1abHdpTEZ4dUlDQWdJQ0FnSUhnZ1BTQmNJa1JwWm1aY0lpeGNiaUFnSUNBZ0lDQjVJRDBnWENKRGIzVnVkRndpS1NBclhHNGdJSFJvWlcxbFgySjNLQ2tnS3lBZ2MyTmhiR1ZmWm1sc2JGOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNJbk5yZVdKc2RXVmNJaXdnWENKaWJIVmxYQ0lzSUZ3aVpHRnlhMkpzZFdWY0lpd2dYQ0p3YVc1clhDSXNJRndpY21Wa01sd2lMQ0JjSW1SaGNtdHlaV1JjSWlBc1hDSm5jbVY1WENJcEtWeHVYRzVjYmx4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgVFNTLCBWNilcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxjaHJcXCwgXFxUU1NcXCwgXFxlbnNlbWJsXFwpXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5kaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6OmxlZnRfam9pbihnZW5lLnRiLCBieSA9IGMoXFxlbnNlbWJsX2dlbmVfaWRcXCA9IFxcZW5zZW1ibFxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKFRTUykpXG5cbmFscGhhIDwtIDAuMDVcbmZjQ3V0b2ZmIDwtIDAuNVxuXG5kaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShkaWZmID0gY2FzZV93aGVuKHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmIH4gXFxVUFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYgfiBcXERPV05cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFxcTk9cXCkpXG5cblxuZ2V0Q29tcENoYW5nZVR5cGUgPC0gZnVuY3Rpb24oY2hyb20sIFRTUywgY3Njb3JlLnRiKXtcbiAgdGVtcC50YiA8LSBjc2NvcmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyID09IGNocm9tLCBzdGFydCA8IFRTUywgZW5kID4gVFNTKVxuICBvdXQgPC0gdGVtcC50YiRjaGFuZ2VUeXBlXG4gIGlmKGxlbmd0aChvdXQpIDwgMSl7XG4gICAgcmV0dXJuKE5BKVxuICB9ZWxzZXtcbiAgICByZXR1cm4ob3V0KVxuICB9XG59XG5cbmNzY29yZS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoY3Njb3JlWzE6M10pXG50ZW1wIDwtZGlmZi5STkEgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBUU1MsIGVuZCA9IFRTUyArMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kKVxuZGlmZi5STkEuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5vdmVybGFwIDwtIGZpbmRPdmVybGFwcyhkaWZmLlJOQS5nciwgY3Njb3JlLmdyKVxuXG4jY3Njb3JlLnNlbGVjdGVkIDwtIGNzY29yZSAlPiUgZHBseXI6OnNsaWNlKHN1YmplY3RIaXRzKG92ZXJsYXApKVxuIyMgUHJvYmxlbSBvZiBjZXJ0YWluIGdlbmVzIG5vdCBnZXR0aW5nIG92ZXJsYXAgd2l0aCBjc2NvcmUgZHVlIHRvIHNwYXJzZSBjYWxsaW5nP1xuYmF0Y2gxIDwtIGJpbmRfY29scyhkaWZmLlJOQVtxdWVyeUhpdHMob3ZlcmxhcCldLFxuICAgICAgICAgIGRhdGEudGFibGUoY3Njb3JlKVtzdWJqZWN0SGl0cyhvdmVybGFwKV0pXG5cblxubWlzc2VkIDwtIGRpZmYuUk5BWy1xdWVyeUhpdHMob3ZlcmxhcCldXG50ZW1wIDwtIG1pc3NlZCAlPiUgZHBseXI6Om11dGF0ZShUU1MgPSBUU1MgKyAxMDAwMCkgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBUU1MsIGVuZCA9IFRTUyArMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kKVxubWlzc2VkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMobWlzc2VkLmdyLCBjc2NvcmUuZ3IpXG5iYXRjaDIgPC0gYmluZF9jb2xzKG1pc3NlZFtxdWVyeUhpdHMob3ZlcmxhcCldLFxuICAgICAgICAgICAgICAgICAgICBkYXRhLnRhYmxlKGNzY29yZSlbc3ViamVjdEhpdHMob3ZlcmxhcCldKVxuXG5taXNzZWQyIDwtIG1pc3NlZFstcXVlcnlIaXRzKG92ZXJsYXApXVxudGVtcCA8LSBtaXNzZWQyICU+JSBkcGx5cjo6bXV0YXRlKFRTUyA9IFRTUyAtIDEwMDAwKSAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IFRTUywgZW5kID0gVFNTICsxKSAlPiVcbiAgZHBseXI6OnNlbGVjdChjaHIsIHN0YXJ0LCBlbmQpXG5taXNzZWQuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5vdmVybGFwIDwtIGZpbmRPdmVybGFwcyhtaXNzZWQuZ3IsIGNzY29yZS5ncilcbmJhdGNoMyA8LSBiaW5kX2NvbHMobWlzc2VkMltxdWVyeUhpdHMob3ZlcmxhcCldLFxuICAgICAgICAgICAgICAgICAgICBkYXRhLnRhYmxlKGNzY29yZSlbc3ViamVjdEhpdHMob3ZlcmxhcCldKVxuXG4jbWlzc2VkMyA8LSBtaXNzZWQyWy1xdWVyeUhpdHMob3ZlcmxhcCldXG5cblxuZGlmZi5STkEgPC0gYmluZF9yb3dzKGJhdGNoMSwgYmF0Y2gyLCBiYXRjaDMpXG5cblxuIyBWSVNVQUxJWkVcbmRpZmYuUk5BJGNoYW5nZVR5cGUgPC0gZmFjdG9yKGRpZmYuUk5BJGNoYW5nZVR5cGUsIGxldmVscyA9IGMoXFxBX3dlYWtlbmluZ1xcLCBcXEF0b0JcXCwgXFxCX3N0cmVuZ3RoZW5pbmdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxCX3dlYWtlbmluZ1xcLCBcXEJ0b0FcXCwgXFxBX3N0cmVuZ3RoZW5pbmdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxVbmNoYW5nZWRcXCkpXG5nZ3Bsb3QoZGlmZi5STkEsIGFlcyh4ID0gZGlmZiwgZmlsbCA9IGNoYW5nZVR5cGUpKSArXG4gIGdlb21fYmFyKHBvc2l0aW9uID0gXFxmaWxsXFwpICtcbiAgbGFicyh0aXRsZSA9IFxcU3RhY2tlZCBCYXIgUGxvdCBvZiBDaGFuZ2UgVHlwZSBieSBEaWZmXFwsXG4gICAgICAgeCA9IFxcRGlmZlxcLFxuICAgICAgIHkgPSBcXENvdW50XFwpICtcbiAgdGhlbWVfYncoKSArICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcc2t5Ymx1ZVxcLCBcXGJsdWVcXCwgXFxkYXJrYmx1ZVxcLCBcXHBpbmtcXCwgXFxyZWQyXFwsIFxcZGFya3JlZFxcICxcXGdyZXlcXCkpXG5cblxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V1, TSS, V6)
colnames(gene.tb) <- c(\chr\, \TSS\, \ensembl\)

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
diff.RNA <- diff.RNA %>% dplyr::left_join(gene.tb, by = c(\ensembl_gene_id\ = \ensembl\)) %>%
  dplyr::filter(!is.na(TSS))

alpha <- 0.05
fcCutoff <- 0.5

diff.RNA <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                                        padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                                        TRUE ~ \NO\))


getCompChangeType <- function(chrom, TSS, cscore.tb){
  temp.tb <- cscore.tb %>% dplyr::filter(chr == chrom, start < TSS, end > TSS)
  out <- temp.tb$changeType
  if(length(out) < 1){
    return(NA)
  }else{
    return(out)
  }
}

cscore.gr <- makeGRangesFromDataFrame(cscore[1:3])
temp <-diff.RNA %>% dplyr::mutate(start = TSS, end = TSS +1) %>%
  dplyr::select(chr, start, end)
diff.RNA.gr <- makeGRangesFromDataFrame(temp)
overlap <- findOverlaps(diff.RNA.gr, cscore.gr)

#cscore.selected <- cscore %>% dplyr::slice(subjectHits(overlap))
## Problem of certain genes not getting overlap with cscore due to sparse calling?
batch1 <- bind_cols(diff.RNA[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


missed <- diff.RNA[-queryHits(overlap)]
temp <- missed %>% dplyr::mutate(TSS = TSS + 10000) %>% dplyr::mutate(start = TSS, end = TSS +1) %>%
  dplyr::select(chr, start, end)
missed.gr <- makeGRangesFromDataFrame(temp)
overlap <- findOverlaps(missed.gr, cscore.gr)
batch2 <- bind_cols(missed[queryHits(overlap)],
                    data.table(cscore)[subjectHits(overlap)])

missed2 <- missed[-queryHits(overlap)]
temp <- missed2 %>% dplyr::mutate(TSS = TSS - 10000) %>% dplyr::mutate(start = TSS, end = TSS +1) %>%
  dplyr::select(chr, start, end)
missed.gr <- makeGRangesFromDataFrame(temp)
overlap <- findOverlaps(missed.gr, cscore.gr)
batch3 <- bind_cols(missed2[queryHits(overlap)],
                    data.table(cscore)[subjectHits(overlap)])

#missed3 <- missed2[-queryHits(overlap)]


diff.RNA <- bind_rows(batch1, batch2, batch3)


# VISUALIZE
diff.RNA$changeType <- factor(diff.RNA$changeType, levels = c(\A_weakening\, \AtoB\, \B_strengthening\,
                                                                          \B_weakening\, \BtoA\, \A_strengthening\,
                                                                          \Unchanged\))
ggplot(diff.RNA, aes(x = diff, fill = changeType)) +
  geom_bar(position = \fill\) +
  labs(title = \Stacked Bar Plot of Change Type by Diff\,
       x = \Diff\,
       y = \Count\) +
  theme_bw() +  scale_fill_manual(values = c(\skyblue\, \blue\, \darkblue\, \pink\, \red2\, \darkred\ ,\grey\))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVoyVnVaUzUwWWlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnh0YlRFd1gwZFNRMjB6T0M1d05sOW5aVzVsWDNOdmNuUmxaQzVpWldSY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0ZSVFV5QTlJR2xtWld4elpTaFdOQ0E5UFNCY1hDdGNYQ3dnVmpJc0lGWXpLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1ZqRXNJRlJUVXl3Z1ZqWXBYRzVqYjJ4dVlXMWxjeWhuWlc1bExuUmlLU0E4TFNCaktGeGNZMmh5WEZ3c0lGeGNWRk5UWEZ3c0lGeGNaVzV6WlcxaWJGeGNLVnh1WEc1a2FXWm1MbEpPUVNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhrYVdabVgwY3hMa0UwT0RVdWMyVnNaV04wWldReVgwY3hMakpwTGtFME9EVmZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHVnVjMlZ0WW14ZloyVnVaVjlwWkN3Z2JHOW5Na1p2YkdSRGFHRnVaMlVzSUhOb2NtbHVhMlZrWDJ4dlp6SkdReXdnY0dGa2Fpd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxLVnh1WkdsbVppNVNUa0VnUEMwZ1pHbG1aaTVTVGtFZ0pUNGxJR1J3YkhseU9qcHNaV1owWDJwdmFXNG9aMlZ1WlM1MFlpd2dZbmtnUFNCaktGeGNaVzV6WlcxaWJGOW5aVzVsWDJsa1hGd2dQU0JjWEdWdWMyVnRZbXhjWENrcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLQ0ZwY3k1dVlTaFVVMU1wS1Z4dVhHNWhiSEJvWVNBOExTQXdMakExWEc1bVkwTjFkRzltWmlBOExTQXdMalZjYmx4dVpHbG1aaTVTVGtFZ1BDMGdaR2xtWmk1U1RrRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2xtWmlBOUlHTmhjMlZmZDJobGJpaHdZV1JxSUR3Z1lXeHdhR0VnSmlCemFISnBibXRsWkY5c2IyY3lSa01nUGlCbVkwTjFkRzltWmlCK0lGeGNWVkJjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjR0ZrYWlBOElHRnNjR2hoSUNZZ2MyaHlhVzVyWldSZmJHOW5Na1pESUR3Z0xXWmpRM1YwYjJabUlINGdYRnhFVDFkT1hGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSU1ZVVWdmaUJjWEU1UFhGd3BLVnh1WEc1Y2JtZGxkRU52YlhCRGFHRnVaMlZVZVhCbElEd3RJR1oxYm1OMGFXOXVLR05vY205dExDQlVVMU1zSUdOelkyOXlaUzUwWWlsN1hHNGdJSFJsYlhBdWRHSWdQQzBnWTNOamIzSmxMblJpSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dOb2NpQTlQU0JqYUhKdmJTd2djM1JoY25RZ1BDQlVVMU1zSUdWdVpDQStJRlJUVXlsY2JpQWdiM1YwSUR3dElIUmxiWEF1ZEdJa1kyaGhibWRsVkhsd1pWeHVJQ0JwWmloc1pXNW5kR2dvYjNWMEtTQThJREVwZTF4dUlDQWdJSEpsZEhWeWJpaE9RU2xjYmlBZ2ZXVnNjMlY3WEc0Z0lDQWdjbVYwZFhKdUtHOTFkQ2xjYmlBZ2ZWeHVmVnh1WEc1amMyTnZjbVV1WjNJZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtHTnpZMjl5WlZzeE9qTmRLVnh1ZEdWdGNDQThMV1JwWm1ZdVVrNUJJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLSE4wWVhKMElEMGdWRk5UTENCbGJtUWdQU0JVVTFNZ0t6RXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dOb2Npd2djM1JoY25Rc0lHVnVaQ2xjYm1ScFptWXVVazVCTG1keUlEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaDBaVzF3S1Z4dWIzWmxjbXhoY0NBOExTQm1hVzVrVDNabGNteGhjSE1vWkdsbVppNVNUa0V1WjNJc0lHTnpZMjl5WlM1bmNpbGNibHh1STJOelkyOXlaUzV6Wld4bFkzUmxaQ0E4TFNCamMyTnZjbVVnSlQ0bElHUndiSGx5T2pwemJHbGpaU2h6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3S1NsY2JpTWpJRkJ5YjJKc1pXMGdiMllnWTJWeWRHRnBiaUJuWlc1bGN5QnViM1FnWjJWMGRHbHVaeUJ2ZG1WeWJHRndJSGRwZEdnZ1kzTmpiM0psSUdSMVpTQjBieUJ6Y0dGeWMyVWdZMkZzYkdsdVp6OWNibUpoZEdOb01TQThMU0JpYVc1a1gyTnZiSE1vWkdsbVppNVNUa0ZiY1hWbGNubElhWFJ6S0c5MlpYSnNZWEFwWFN4Y2JpQWdJQ0FnSUNBZ0lDQmtZWFJoTG5SaFlteGxLR056WTI5eVpTbGJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjQ2xkS1Z4dVhHNWNibTFwYzNObFpDQThMU0JrYVdabUxsSk9RVnN0Y1hWbGNubElhWFJ6S0c5MlpYSnNZWEFwWFZ4dWRHVnRjQ0E4TFNCdGFYTnpaV1FnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvVkZOVElEMGdWRk5USUNzZ01UQXdNREFwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0hOMFlYSjBJRDBnVkZOVExDQmxibVFnUFNCVVUxTWdLekVwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHTm9jaXdnYzNSaGNuUXNJR1Z1WkNsY2JtMXBjM05sWkM1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9kR1Z0Y0NsY2JtOTJaWEpzWVhBZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0cxcGMzTmxaQzVuY2l3Z1kzTmpiM0psTG1keUtWeHVZbUYwWTJneUlEd3RJR0pwYm1SZlkyOXNjeWh0YVhOelpXUmJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQXBYU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHRjBZUzUwWVdKc1pTaGpjMk52Y21VcFczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQXBYU2xjYmx4dWJXbHpjMlZrTWlBOExTQnRhWE56WldSYkxYRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd0tWMWNiblJsYlhBZ1BDMGdiV2x6YzJWa01pQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaFVVMU1nUFNCVVUxTWdMU0F4TURBd01Da2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9jM1JoY25RZ1BTQlVVMU1zSUdWdVpDQTlJRlJUVXlBck1Ta2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWTJoeUxDQnpkR0Z5ZEN3Z1pXNWtLVnh1YldsemMyVmtMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoMFpXMXdLVnh1YjNabGNteGhjQ0E4TFNCbWFXNWtUM1psY214aGNITW9iV2x6YzJWa0xtZHlMQ0JqYzJOdmNtVXVaM0lwWEc1aVlYUmphRE1nUEMwZ1ltbHVaRjlqYjJ4ektHMXBjM05sWkRKYmNYVmxjbmxJYVhSektHOTJaWEpzWVhBcFhTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdGMFlTNTBZV0pzWlNoamMyTnZjbVVwVzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhBcFhTbGNibHh1STIxcGMzTmxaRE1nUEMwZ2JXbHpjMlZrTWxzdGNYVmxjbmxJYVhSektHOTJaWEpzWVhBcFhWeHVYRzVjYm1ScFptWXVVazVCSUR3dElHSnBibVJmY205M2N5aGlZWFJqYURFc0lHSmhkR05vTWl3Z1ltRjBZMmd6S1Z4dVhHNWNiaU1nVmtsVFZVRk1TVnBGWEc1a2FXWm1MbEpPUVNSamFHRnVaMlZVZVhCbElEd3RJR1poWTNSdmNpaGthV1ptTGxKT1FTUmphR0Z1WjJWVWVYQmxMQ0JzWlhabGJITWdQU0JqS0Z4Y1FWOTNaV0ZyWlc1cGJtZGNYQ3dnWEZ4QmRHOUNYRndzSUZ4Y1FsOXpkSEpsYm1kMGFHVnVhVzVuWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjUWw5M1pXRnJaVzVwYm1kY1hDd2dYRnhDZEc5QlhGd3NJRnhjUVY5emRISmxibWQwYUdWdWFXNW5YRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNWVzVqYUdGdVoyVmtYRndwS1Z4dVoyZHdiRzkwS0dScFptWXVVazVCTENCaFpYTW9lQ0E5SUdScFptWXNJR1pwYkd3Z1BTQmphR0Z1WjJWVWVYQmxLU2tnSzF4dUlDQm5aVzl0WDJKaGNpaHdiM05wZEdsdmJpQTlJRnhjWm1sc2JGeGNLU0FyWEc0Z0lHeGhZbk1vZEdsMGJHVWdQU0JjWEZOMFlXTnJaV1FnUW1GeUlGQnNiM1FnYjJZZ1EyaGhibWRsSUZSNWNHVWdZbmtnUkdsbVpseGNMRnh1SUNBZ0lDQWdJSGdnUFNCY1hFUnBabVpjWEN4Y2JpQWdJQ0FnSUNCNUlEMGdYRnhEYjNWdWRGeGNLU0FyWEc0Z0lIUm9aVzFsWDJKM0tDa2dLeUFnYzJOaGJHVmZabWxzYkY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY1hITnJlV0pzZFdWY1hDd2dYRnhpYkhWbFhGd3NJRnhjWkdGeWEySnNkV1ZjWEN3Z1hGeHdhVzVyWEZ3c0lGeGNjbVZrTWx4Y0xDQmNYR1JoY210eVpXUmNYQ0FzWEZ4bmNtVjVYRndwS1Z4dVhHNWNibHh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTUywgVjYpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyXFwsIFxcVFNTXFwsIFxcZW5zZW1ibFxcKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZS50YiwgYnkgPSBjKFxcZW5zZW1ibF9nZW5lX2lkXFwgPSBcXGVuc2VtYmxcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShUU1MpKVxuXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcblxuZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjptdXRhdGUoZGlmZiA9IGNhc2Vfd2hlbihwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPiBmY0N1dG9mZiB+IFxcVVBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmIH4gXFxET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBcXE5PXFwpKVxuXG5cbmdldENvbXBDaGFuZ2VUeXBlIDwtIGZ1bmN0aW9uKGNocm9tLCBUU1MsIGNzY29yZS50Yil7XG4gIHRlbXAudGIgPC0gY3Njb3JlLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbSwgc3RhcnQgPCBUU1MsIGVuZCA+IFRTUylcbiAgb3V0IDwtIHRlbXAudGIkY2hhbmdlVHlwZVxuICBpZihsZW5ndGgob3V0KSA8IDEpe1xuICAgIHJldHVybihOQSlcbiAgfWVsc2V7XG4gICAgcmV0dXJuKG91dClcbiAgfVxufVxuXG5jc2NvcmUuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGNzY29yZVsxOjNdKVxudGVtcCA8LWRpZmYuUk5BICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gVFNTLCBlbmQgPSBUU1MgKzEpICU+JVxuICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZClcbmRpZmYuUk5BLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMoZGlmZi5STkEuZ3IsIGNzY29yZS5ncilcblxuI2NzY29yZS5zZWxlY3RlZCA8LSBjc2NvcmUgJT4lIGRwbHlyOjpzbGljZShzdWJqZWN0SGl0cyhvdmVybGFwKSlcbiMjIFByb2JsZW0gb2YgY2VydGFpbiBnZW5lcyBub3QgZ2V0dGluZyBvdmVybGFwIHdpdGggY3Njb3JlIGR1ZSB0byBzcGFyc2UgY2FsbGluZz9cbmJhdGNoMSA8LSBiaW5kX2NvbHMoZGlmZi5STkFbcXVlcnlIaXRzKG92ZXJsYXApXSxcbiAgICAgICAgICBkYXRhLnRhYmxlKGNzY29yZSlbc3ViamVjdEhpdHMob3ZlcmxhcCldKVxuXG5cbm1pc3NlZCA8LSBkaWZmLlJOQVstcXVlcnlIaXRzKG92ZXJsYXApXVxudGVtcCA8LSBtaXNzZWQgJT4lIGRwbHlyOjptdXRhdGUoVFNTID0gVFNTICsgMTAwMDApICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gVFNTLCBlbmQgPSBUU1MgKzEpICU+JVxuICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZClcbm1pc3NlZC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcbm92ZXJsYXAgPC0gZmluZE92ZXJsYXBzKG1pc3NlZC5nciwgY3Njb3JlLmdyKVxuYmF0Y2gyIDwtIGJpbmRfY29scyhtaXNzZWRbcXVlcnlIaXRzKG92ZXJsYXApXSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSlcblxubWlzc2VkMiA8LSBtaXNzZWRbLXF1ZXJ5SGl0cyhvdmVybGFwKV1cbnRlbXAgPC0gbWlzc2VkMiAlPiUgZHBseXI6Om11dGF0ZShUU1MgPSBUU1MgLSAxMDAwMCkgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBUU1MsIGVuZCA9IFRTUyArMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kKVxubWlzc2VkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMobWlzc2VkLmdyLCBjc2NvcmUuZ3IpXG5iYXRjaDMgPC0gYmluZF9jb2xzKG1pc3NlZDJbcXVlcnlIaXRzKG92ZXJsYXApXSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSlcblxuI21pc3NlZDMgPC0gbWlzc2VkMlstcXVlcnlIaXRzKG92ZXJsYXApXVxuXG5cbmRpZmYuUk5BIDwtIGJpbmRfcm93cyhiYXRjaDEsIGJhdGNoMiwgYmF0Y2gzKVxuXG5cbiMgVklTVUFMSVpFXG5kaWZmLlJOQSRjaGFuZ2VUeXBlIDwtIGZhY3RvcihkaWZmLlJOQSRjaGFuZ2VUeXBlLCBsZXZlbHMgPSBjKFxcQV93ZWFrZW5pbmdcXCwgXFxBdG9CXFwsIFxcQl9zdHJlbmd0aGVuaW5nXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcQl93ZWFrZW5pbmdcXCwgXFxCdG9BXFwsIFxcQV9zdHJlbmd0aGVuaW5nXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcVW5jaGFuZ2VkXFwpKVxuZ2dwbG90KGRpZmYuUk5BLCBhZXMoeCA9IGRpZmYsIGZpbGwgPSBjaGFuZ2VUeXBlKSkgK1xuICBnZW9tX2Jhcihwb3NpdGlvbiA9IFxcZmlsbFxcKSArXG4gIGxhYnModGl0bGUgPSBcXFN0YWNrZWQgQmFyIFBsb3Qgb2YgQ2hhbmdlIFR5cGUgYnkgRGlmZlxcLFxuICAgICAgIHggPSBcXERpZmZcXCxcbiAgICAgICB5ID0gXFxDb3VudFxcKSArXG4gIHRoZW1lX2J3KCkgKyAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXHNreWJsdWVcXCwgXFxibHVlXFwsIFxcZGFya2JsdWVcXCwgXFxwaW5rXFwsIFxccmVkMlxcLCBcXGRhcmtyZWRcXCAsXFxncmV5XFwpKVxuXG5cblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTUywgVjYpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyXFwsIFxcVFNTXFwsIFxcZW5zZW1ibFxcKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZS50YiwgYnkgPSBjKFxcZW5zZW1ibF9nZW5lX2lkXFwgPSBcXGVuc2VtYmxcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShUU1MpKVxuXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcblxuZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjptdXRhdGUoZGlmZiA9IGNhc2Vfd2hlbihwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPiBmY0N1dG9mZiB+IFxcVVBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmIH4gXFxET1dOXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBcXE5PXFwpKVxuXG5cbmdldENvbXBDaGFuZ2VUeXBlIDwtIGZ1bmN0aW9uKGNocm9tLCBUU1MsIGNzY29yZS50Yil7XG4gIHRlbXAudGIgPC0gY3Njb3JlLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbSwgc3RhcnQgPCBUU1MsIGVuZCA+IFRTUylcbiAgb3V0IDwtIHRlbXAudGIkY2hhbmdlVHlwZVxuICBpZihsZW5ndGgob3V0KSA8IDEpe1xuICAgIHJldHVybihOQSlcbiAgfWVsc2V7XG4gICAgcmV0dXJuKG91dClcbiAgfVxufVxuXG5jc2NvcmUuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGNzY29yZVsxOjNdKVxudGVtcCA8LWRpZmYuUk5BICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gVFNTLCBlbmQgPSBUU1MgKzEpICU+JVxuICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZClcbmRpZmYuUk5BLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMoZGlmZi5STkEuZ3IsIGNzY29yZS5ncilcblxuI2NzY29yZS5zZWxlY3RlZCA8LSBjc2NvcmUgJT4lIGRwbHlyOjpzbGljZShzdWJqZWN0SGl0cyhvdmVybGFwKSlcbiMjIFByb2JsZW0gb2YgY2VydGFpbiBnZW5lcyBub3QgZ2V0dGluZyBvdmVybGFwIHdpdGggY3Njb3JlIGR1ZSB0byBzcGFyc2UgY2FsbGluZz9cbmJhdGNoMSA8LSBiaW5kX2NvbHMoZGlmZi5STkFbcXVlcnlIaXRzKG92ZXJsYXApXSxcbiAgICAgICAgICBkYXRhLnRhYmxlKGNzY29yZSlbc3ViamVjdEhpdHMob3ZlcmxhcCldKVxuXG5cbm1pc3NlZCA8LSBkaWZmLlJOQVstcXVlcnlIaXRzKG92ZXJsYXApXVxudGVtcCA8LSBtaXNzZWQgJT4lIGRwbHlyOjptdXRhdGUoVFNTID0gVFNTICsgMTAwMDApICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gVFNTLCBlbmQgPSBUU1MgKzEpICU+JVxuICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZClcbm1pc3NlZC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcbm92ZXJsYXAgPC0gZmluZE92ZXJsYXBzKG1pc3NlZC5nciwgY3Njb3JlLmdyKVxuYmF0Y2gyIDwtIGJpbmRfY29scyhtaXNzZWRbcXVlcnlIaXRzKG92ZXJsYXApXSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSlcblxubWlzc2VkMiA8LSBtaXNzZWRbLXF1ZXJ5SGl0cyhvdmVybGFwKV1cbnRlbXAgPC0gbWlzc2VkMiAlPiUgZHBseXI6Om11dGF0ZShUU1MgPSBUU1MgLSAxMDAwMCkgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBUU1MsIGVuZCA9IFRTUyArMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kKVxubWlzc2VkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMobWlzc2VkLmdyLCBjc2NvcmUuZ3IpXG5iYXRjaDMgPC0gYmluZF9jb2xzKG1pc3NlZDJbcXVlcnlIaXRzKG92ZXJsYXApXSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSlcblxuI21pc3NlZDMgPC0gbWlzc2VkMlstcXVlcnlIaXRzKG92ZXJsYXApXVxuXG5cbmRpZmYuUk5BIDwtIGJpbmRfcm93cyhiYXRjaDEsIGJhdGNoMiwgYmF0Y2gzKVxuXG5cbiMgVklTVUFMSVpFXG5kaWZmLlJOQSRjaGFuZ2VUeXBlIDwtIGZhY3RvcihkaWZmLlJOQSRjaGFuZ2VUeXBlLCBsZXZlbHMgPSBjKFxcQV93ZWFrZW5pbmdcXCwgXFxBdG9CXFwsIFxcQl9zdHJlbmd0aGVuaW5nXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcQl93ZWFrZW5pbmdcXCwgXFxCdG9BXFwsIFxcQV9zdHJlbmd0aGVuaW5nXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcVW5jaGFuZ2VkXFwpKVxuZ2dwbG90KGRpZmYuUk5BLCBhZXMoeCA9IGRpZmYsIGZpbGwgPSBjaGFuZ2VUeXBlKSkgK1xuICBnZW9tX2Jhcihwb3NpdGlvbiA9IFxcZmlsbFxcKSArXG4gIGxhYnModGl0bGUgPSBcXFN0YWNrZWQgQmFyIFBsb3Qgb2YgQ2hhbmdlIFR5cGUgYnkgRGlmZlxcLFxuICAgICAgIHggPSBcXERpZmZcXCxcbiAgICAgICB5ID0gXFxDb3VudFxcKSArXG4gIHRoZW1lX2J3KCkgKyAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXHNreWJsdWVcXCwgXFxibHVlXFwsIFxcZGFya2JsdWVcXCwgXFxwaW5rXFwsIFxccmVkMlxcLCBcXGRhcmtyZWRcXCAsXFxncmV5XFwpKVxuXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V1, TSS, V6)
colnames(gene.tb) <- c(\chr\, \TSS\, \ensembl\)

diff.RNA <- fread(here(refDir, \diff_G1.A485.selected2_G1.2i.A485_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)
diff.RNA <- diff.RNA %>% dplyr::left_join(gene.tb, by = c(\ensembl_gene_id\ = \ensembl\)) %>%
  dplyr::filter(!is.na(TSS))

alpha <- 0.05
fcCutoff <- 0.5

diff.RNA <- diff.RNA %>% dplyr::mutate(diff = case_when(padj < alpha & shrinked_log2FC > fcCutoff ~ \UP\,
                                                        padj < alpha & shrinked_log2FC < -fcCutoff ~ \DOWN\,
                                                        TRUE ~ \NO\))


getCompChangeType <- function(chrom, TSS, cscore.tb){
  temp.tb <- cscore.tb %>% dplyr::filter(chr == chrom, start < TSS, end > TSS)
  out <- temp.tb$changeType
  if(length(out) < 1){
    return(NA)
  }else{
    return(out)
  }
}

cscore.gr <- makeGRangesFromDataFrame(cscore[1:3])
temp <-diff.RNA %>% dplyr::mutate(start = TSS, end = TSS +1) %>%
  dplyr::select(chr, start, end)
diff.RNA.gr <- makeGRangesFromDataFrame(temp)
overlap <- findOverlaps(diff.RNA.gr, cscore.gr)

#cscore.selected <- cscore %>% dplyr::slice(subjectHits(overlap))
## Problem of certain genes not getting overlap with cscore due to sparse calling?
batch1 <- bind_cols(diff.RNA[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


missed <- diff.RNA[-queryHits(overlap)]
temp <- missed %>% dplyr::mutate(TSS = TSS + 10000) %>% dplyr::mutate(start = TSS, end = TSS +1) %>%
  dplyr::select(chr, start, end)
missed.gr <- makeGRangesFromDataFrame(temp)
overlap <- findOverlaps(missed.gr, cscore.gr)
batch2 <- bind_cols(missed[queryHits(overlap)],
                    data.table(cscore)[subjectHits(overlap)])

missed2 <- missed[-queryHits(overlap)]
temp <- missed2 %>% dplyr::mutate(TSS = TSS - 10000) %>% dplyr::mutate(start = TSS, end = TSS +1) %>%
  dplyr::select(chr, start, end)
missed.gr <- makeGRangesFromDataFrame(temp)
overlap <- findOverlaps(missed.gr, cscore.gr)
batch3 <- bind_cols(missed2[queryHits(overlap)],
                    data.table(cscore)[subjectHits(overlap)])

#missed3 <- missed2[-queryHits(overlap)]


diff.RNA <- bind_rows(batch1, batch2, batch3)


# VISUALIZE
diff.RNA$changeType <- factor(diff.RNA$changeType, levels = c(\A_weakening\, \AtoB\, \B_strengthening\,
                                                                          \B_weakening\, \BtoA\, \A_strengthening\,
                                                                          \Unchanged\))
ggplot(diff.RNA, aes(x = diff, fill = changeType)) +
  geom_bar(position = \fill\) +
  labs(title = \Stacked Bar Plot of Change Type by Diff\,
       x = \Diff\,
       y = \Count\) +
  theme_bw() +  scale_fill_manual(values = c(\skyblue\, \blue\, \darkblue\, \pink\, \red2\, \darkred\ ,\grey\))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


## [2.29] Compartment analysis
Q. What are the changes in compartment level upon A485 treatment?
#### Compartment change distribution

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc0aklGVlFJR3h2YjNCY2JteHZiM0F1ZFhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5Qk5EZzFkbk5FVFZOUFgxVlFYMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BYRzVoYm1Ob2IzSXVkWEFnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNTFjQ2twWEc1aGJtTm9iM0l1ZFhBdWRHSWdQQzBnWVhOZmRHbGlZbXhsS0dGdVkyaHZjaTUxY0NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9ZMlZ1ZEdWeUlEMGdLSE4wWVhKMElDc2daVzVrS1M4eUtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2h6ZEdGeWRDQTlJR05sYm5SbGNpMHhMQ0JsYm1RZ1BTQmpaVzUwWlhJck1Ta2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvYzJWeGJtRnRaWE1zSUhOMFlYSjBMQ0JsYm1RcFhHNWhibU5vYjNJdWRYQWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLR0Z1WTJodmNpNTFjQzUwWWlsY2JpTWdUazhnYkc5dmNGeHViRzl2Y0M1dWJ5QThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbFgwRTBPRFYyYzBSTlUwOWZUazlmWkdsbVpqQXVNaTVpWldSd1pWd2lLU2xjYm1GdVkyaHZjaTV1YnlBOExTQW9aWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbTV2S1NsY2JtRnVZMmh2Y2k1dWJ5NTBZaUE4TFNCaGMxOTBhV0ppYkdVb1lXNWphRzl5TG01dktTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hqWlc1MFpYSWdQU0FvYzNSaGNuUWdLeUJsYm1RcEx6SXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hOMFlYSjBJRDBnWTJWdWRHVnlMVEVzSUdWdVpDQTlJR05sYm5SbGNpc3hLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENoelpYRnVZVzFsY3l3Z2MzUmhjblFzSUdWdVpDbGNibUZ1WTJodmNpNXVieUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvWVc1amFHOXlMbTV2TG5SaUtWeHVJeUJFVDFkT0lHeHZiM0JjYm14dmIzQXVaRzkzYmlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDBFME9EVjJjMFJOVTA5ZlJFOVhUbDlrYVdabU1DNHlMbUpsWkhCbFhDSXBLVnh1WVc1amFHOXlMbVJ2ZDI0Z1BDMGdLR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzVrYjNkdUtTbGNibUZ1WTJodmNpNWtiM2R1TG5SaUlEd3RJR0Z6WDNScFltSnNaU2hoYm1Ob2IzSXVaRzkzYmlrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9ZMlZ1ZEdWeUlEMGdLSE4wWVhKMElDc2daVzVrS1M4eUtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2h6ZEdGeWRDQTlJR05sYm5SbGNpMHhMQ0JsYm1RZ1BTQmpaVzUwWlhJck1Ta2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvYzJWeGJtRnRaWE1zSUhOMFlYSjBMQ0JsYm1RcFhHNWhibU5vYjNJdVpHOTNiaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvWVc1amFHOXlMbVJ2ZDI0dWRHSXBYRzVjYmx4dUl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNalhHNGpJeU1nVDNabGNteGhjRnh1WTNOamIzSmxMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoamMyTnZjbVZiTVRvelhTbGNibTkyWlhKc1lYQWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1MWNDd2dZM05qYjNKbExtZHlLVnh1WEc0akl5QlFjbTlpYkdWdElHOW1JR05sY25SaGFXNGdaMlZ1WlhNZ2JtOTBJR2RsZEhScGJtY2diM1psY214aGNDQjNhWFJvSUdOelkyOXlaU0JrZFdVZ2RHOGdjM0JoY25ObElHTmhiR3hwYm1jL1hHNWlZWFJqYURFZ1BDMGdZbWx1WkY5amIyeHpLR1JoZEdFdWRHRmliR1VvWVc1amFHOXlMblZ3TG5SaUtWdHhkV1Z5ZVVocGRITW9iM1psY214aGNDbGRMRnh1SUNBZ0lDQWdJQ0FnSUdSaGRHRXVkR0ZpYkdVb1kzTmpiM0psS1Z0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd0tWMHBYRzVjYmx4dWJXbHpjMlZrSUR3dElHUmhkR0V1ZEdGaWJHVW9ZVzVqYUc5eUxuVndMblJpS1ZzdGNYVmxjbmxJYVhSektHOTJaWEpzWVhBcFhWeHVkR1Z0Y0NBOExTQnRhWE56WldRZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb2MzUmhjblFnUFNCemRHRnlkQ0F0SURFd01EQXdMQ0JsYm1RZ1BTQmxibVFnTFNBeE1EQXdNQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb2MyVnhibUZ0WlhNc0lITjBZWEowTENCbGJtUXBYRzV0YVhOelpXUXVaM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0hSbGJYQXBYRzV2ZG1WeWJHRndJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aHRhWE56WldRdVozSXNJR056WTI5eVpTNW5jaWxjYm1KaGRHTm9NaUE4TFNCaWFXNWtYMk52YkhNb0tHMXBjM05sWkNsYmNYVmxjbmxJYVhSektHOTJaWEpzWVhBcFhTeGNiaUFnSUNBZ0lDQWdJQ0JrWVhSaExuUmhZbXhsS0dOelkyOXlaU2xiYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0NsZEtWeHVYRzVjYm1SaGRHRXVkWEFnUEMwZ1ltbHVaRjl5YjNkektHSmhkR05vTVN3Z1ltRjBZMmd5S1Z4dVhHNGpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TmNiaU1qSXlCUGRtVnliR0Z3WEc1amMyTnZjbVV1WjNJZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtHTnpZMjl5WlZzeE9qTmRLVnh1YjNabGNteGhjQ0E4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxtNXZMQ0JqYzJOdmNtVXVaM0lwWEc1Y2JpTWpJRkJ5YjJKc1pXMGdiMllnWTJWeWRHRnBiaUJuWlc1bGN5QnViM1FnWjJWMGRHbHVaeUJ2ZG1WeWJHRndJSGRwZEdnZ1kzTmpiM0psSUdSMVpTQjBieUJ6Y0dGeWMyVWdZMkZzYkdsdVp6OWNibUpoZEdOb01TQThMU0JpYVc1a1gyTnZiSE1vWkdGMFlTNTBZV0pzWlNoaGJtTm9iM0l1Ym04dWRHSXBXM0YxWlhKNVNHbDBjeWh2ZG1WeWJHRndLVjBzWEc0Z0lDQWdJQ0FnSUNBZ1pHRjBZUzUwWVdKc1pTaGpjMk52Y21VcFczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQXBYU2xjYmx4dVhHNXRhWE56WldRZ1BDMGdaR0YwWVM1MFlXSnNaU2hoYm1Ob2IzSXVibTh1ZEdJcFd5MXhkV1Z5ZVVocGRITW9iM1psY214aGNDbGRYRzUwWlcxd0lEd3RJRzFwYzNObFpDQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaHpkR0Z5ZENBOUlITjBZWEowSUMwZ01UQXdNREFzSUdWdVpDQTlJR1Z1WkNBdElERXdNREF3S1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaHpaWEZ1WVcxbGN5d2djM1JoY25Rc0lHVnVaQ2xjYm0xcGMzTmxaQzVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb2RHVnRjQ2xjYm05MlpYSnNZWEFnUEMwZ1ptbHVaRTkyWlhKc1lYQnpLRzFwYzNObFpDNW5jaXdnWTNOamIzSmxMbWR5S1Z4dVltRjBZMmd5SUR3dElHSnBibVJmWTI5c2N5Z29iV2x6YzJWa0tWdHhkV1Z5ZVVocGRITW9iM1psY214aGNDbGRMRnh1SUNBZ0lDQWdJQ0FnSUdSaGRHRXVkR0ZpYkdVb1kzTmpiM0psS1Z0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd0tWMHBYRzVjYmx4dVpHRjBZUzV1YnlBOExTQmlhVzVrWDNKdmQzTW9ZbUYwWTJneExDQmlZWFJqYURJcFhHNWNiaU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJMXh1SXlNaklFOTJaWEpzWVhCY2JtTnpZMjl5WlM1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9ZM05qYjNKbFd6RTZNMTBwWEc1dmRtVnliR0Z3SUR3dElHWnBibVJQZG1WeWJHRndjeWhoYm1Ob2IzSXVaRzkzYml3Z1kzTmpiM0psTG1keUtWeHVYRzRqSXlCUWNtOWliR1Z0SUc5bUlHTmxjblJoYVc0Z1oyVnVaWE1nYm05MElHZGxkSFJwYm1jZ2IzWmxjbXhoY0NCM2FYUm9JR056WTI5eVpTQmtkV1VnZEc4Z2MzQmhjbk5sSUdOaGJHeHBibWMvWEc1aVlYUmphREVnUEMwZ1ltbHVaRjlqYjJ4ektHUmhkR0V1ZEdGaWJHVW9ZVzVqYUc5eUxtUnZkMjR1ZEdJcFczRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd0tWMHNYRzRnSUNBZ0lDQWdJQ0FnWkdGMFlTNTBZV0pzWlNoamMyTnZjbVVwVzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhBcFhTbGNibHh1WEc1dGFYTnpaV1FnUEMwZ1pHRjBZUzUwWVdKc1pTaGhibU5vYjNJdVpHOTNiaTUwWWlsYkxYRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd0tWMWNiblJsYlhBZ1BDMGdiV2x6YzJWa0lDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtITjBZWEowSUQwZ2MzUmhjblFnTFNBeE1EQXdNQ3dnWlc1a0lEMGdaVzVrSUMwZ01UQXdNREFwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtITmxjVzVoYldWekxDQnpkR0Z5ZEN3Z1pXNWtLVnh1YldsemMyVmtMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoMFpXMXdLVnh1YjNabGNteGhjQ0E4TFNCbWFXNWtUM1psY214aGNITW9iV2x6YzJWa0xtZHlMQ0JqYzJOdmNtVXVaM0lwWEc1aVlYUmphRElnUEMwZ1ltbHVaRjlqYjJ4ektDaHRhWE56WldRcFczRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd0tWMHNYRzRnSUNBZ0lDQWdJQ0FnWkdGMFlTNTBZV0pzWlNoamMyTnZjbVVwVzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhBcFhTbGNibHh1WEc1a1lYUmhMbVJ2ZDI0Z1BDMGdZbWx1WkY5eWIzZHpLR0poZEdOb01Td2dZbUYwWTJneUtWeHVYRzV1TG5Wd0lEd3RJRzV5YjNjb1pHRjBZUzUxY0NsY2JtNHVibThnUEMwZ2JuSnZkeWhrWVhSaExtNXZLVnh1Ymk1a2IzZHVJRHd0SUc1eWIzY29aR0YwWVM1a2IzZHVLVnh1WEc1a1lYUmhJRHd0SUhScFltSnNaU2hzYjI5d1JHbG1aaUE5SUdNb2NtVndLRndpVlZCY0lpd2diaTUxY0Nrc0lISmxjQ2hjSWs1UFhDSXNJRzR1Ym04cExDQnlaWEFvWENKRVQxZE9YQ0lzSUc0dVpHOTNiaWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JqYUdGdVoyVlVlWEJsSUQwZ1l5aGtZWFJoTG5Wd0pHTm9ZVzVuWlZSNWNHVXNJR1JoZEdFdWJtOGtZMmhoYm1kbFZIbHdaU3dnWkdGMFlTNWtiM2R1SkdOb1lXNW5aVlI1Y0dVcEtWeHVYRzRqSUZaSlUxVkJURWxhUlZ4dVpHRjBZU1JqYUdGdVoyVlVlWEJsSUR3dElHWmhZM1J2Y2loa1lYUmhKR05vWVc1blpWUjVjR1VzSUd4bGRtVnNjeUE5SUdNb1hDSkJYM2RsWVd0bGJtbHVaMXdpTENCY0lrRjBiMEpjSWl3Z1hDSkNYM04wY21WdVozUm9aVzVwYm1kY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKQ1gzZGxZV3RsYm1sdVoxd2lMQ0JjSWtKMGIwRmNJaXdnWENKQlgzTjBjbVZ1WjNSb1pXNXBibWRjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0pWYm1Ob1lXNW5aV1JjSWlrcFhHNW5aM0JzYjNRb1pHRjBZU3dnWVdWektIZ2dQU0JzYjI5d1JHbG1aaXdnWm1sc2JDQTlJR05vWVc1blpWUjVjR1VwS1NBclhHNGdJR2RsYjIxZlltRnlLSEJ2YzJsMGFXOXVJRDBnWENKbWFXeHNYQ0lwSUN0Y2JpQWdiR0ZpY3loMGFYUnNaU0E5SUZ3aVUzUmhZMnRsWkNCQ1lYSWdVR3h2ZENCdlppQkRhR0Z1WjJVZ1ZIbHdaU0JpZVNCRWFXWm1YQ0lzWEc0Z0lDQWdJQ0FnZUNBOUlGd2lSR2xtWmx3aUxGeHVJQ0FnSUNBZ0lIa2dQU0JjSWtOdmRXNTBYQ0lwSUN0Y2JpQWdkR2hsYldWZlluY29LU0FySUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2ljMnQ1WW14MVpWd2lMQ0JjSW1Kc2RXVmNJaXdnWENKa1lYSnJZbXgxWlZ3aUxDQmNJbkJwYm10Y0lpd2dYQ0p5WldReVhDSXNJRndpWkdGeWEzSmxaRndpSUN4Y0ltZHlaWGxjSWlrcFhHNWNibHh1WEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbiMgVVAgbG9vcFxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci51cCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwKSlcbmFuY2hvci51cC50YiA8LSBhc190aWJibGUoYW5jaG9yLnVwKSAlPiVcbiAgZHBseXI6Om11dGF0ZShjZW50ZXIgPSAoc3RhcnQgKyBlbmQpLzIpICU+JVxuICBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gY2VudGVyLTEsIGVuZCA9IGNlbnRlcisxKSAlPiVcbiAgZHBseXI6OnNlbGVjdChzZXFuYW1lcywgc3RhcnQsIGVuZClcbmFuY2hvci51cCA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYW5jaG9yLnVwLnRiKVxuIyBOTyBsb29wXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKVxuYW5jaG9yLm5vLnRiIDwtIGFzX3RpYmJsZShhbmNob3Iubm8pICU+JVxuICBkcGx5cjo6bXV0YXRlKGNlbnRlciA9IChzdGFydCArIGVuZCkvMikgJT4lXG4gIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBjZW50ZXItMSwgZW5kID0gY2VudGVyKzEpICU+JVxuICBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kKVxuYW5jaG9yLm5vIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhbmNob3Iubm8udGIpXG4jIERPV04gbG9vcFxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKVxuYW5jaG9yLmRvd24udGIgPC0gYXNfdGliYmxlKGFuY2hvci5kb3duKSAlPiVcbiAgZHBseXI6Om11dGF0ZShjZW50ZXIgPSAoc3RhcnQgKyBlbmQpLzIpICU+JVxuICBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gY2VudGVyLTEsIGVuZCA9IGNlbnRlcisxKSAlPiVcbiAgZHBseXI6OnNlbGVjdChzZXFuYW1lcywgc3RhcnQsIGVuZClcbmFuY2hvci5kb3duIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhbmNob3IuZG93bi50YilcblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMjIyBPdmVybGFwXG5jc2NvcmUuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGNzY29yZVsxOjNdKVxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwLCBjc2NvcmUuZ3IpXG5cbiMjIFByb2JsZW0gb2YgY2VydGFpbiBnZW5lcyBub3QgZ2V0dGluZyBvdmVybGFwIHdpdGggY3Njb3JlIGR1ZSB0byBzcGFyc2UgY2FsbGluZz9cbmJhdGNoMSA8LSBiaW5kX2NvbHMoZGF0YS50YWJsZShhbmNob3IudXAudGIpW3F1ZXJ5SGl0cyhvdmVybGFwKV0sXG4gICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSlcblxuXG5taXNzZWQgPC0gZGF0YS50YWJsZShhbmNob3IudXAudGIpWy1xdWVyeUhpdHMob3ZlcmxhcCldXG50ZW1wIDwtIG1pc3NlZCAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IHN0YXJ0IC0gMTAwMDAsIGVuZCA9IGVuZCAtIDEwMDAwKSAlPiVcbiAgZHBseXI6OnNlbGVjdChzZXFuYW1lcywgc3RhcnQsIGVuZClcbm1pc3NlZC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcbm92ZXJsYXAgPC0gZmluZE92ZXJsYXBzKG1pc3NlZC5nciwgY3Njb3JlLmdyKVxuYmF0Y2gyIDwtIGJpbmRfY29scygobWlzc2VkKVtxdWVyeUhpdHMob3ZlcmxhcCldLFxuICAgICAgICAgIGRhdGEudGFibGUoY3Njb3JlKVtzdWJqZWN0SGl0cyhvdmVybGFwKV0pXG5cblxuZGF0YS51cCA8LSBiaW5kX3Jvd3MoYmF0Y2gxLCBiYXRjaDIpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyMjIE92ZXJsYXBcbmNzY29yZS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoY3Njb3JlWzE6M10pXG5vdmVybGFwIDwtIGZpbmRPdmVybGFwcyhhbmNob3Iubm8sIGNzY29yZS5ncilcblxuIyMgUHJvYmxlbSBvZiBjZXJ0YWluIGdlbmVzIG5vdCBnZXR0aW5nIG92ZXJsYXAgd2l0aCBjc2NvcmUgZHVlIHRvIHNwYXJzZSBjYWxsaW5nP1xuYmF0Y2gxIDwtIGJpbmRfY29scyhkYXRhLnRhYmxlKGFuY2hvci5uby50YilbcXVlcnlIaXRzKG92ZXJsYXApXSxcbiAgICAgICAgICBkYXRhLnRhYmxlKGNzY29yZSlbc3ViamVjdEhpdHMob3ZlcmxhcCldKVxuXG5cbm1pc3NlZCA8LSBkYXRhLnRhYmxlKGFuY2hvci5uby50YilbLXF1ZXJ5SGl0cyhvdmVybGFwKV1cbnRlbXAgPC0gbWlzc2VkICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gc3RhcnQgLSAxMDAwMCwgZW5kID0gZW5kIC0gMTAwMDApICU+JVxuICBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kKVxubWlzc2VkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMobWlzc2VkLmdyLCBjc2NvcmUuZ3IpXG5iYXRjaDIgPC0gYmluZF9jb2xzKChtaXNzZWQpW3F1ZXJ5SGl0cyhvdmVybGFwKV0sXG4gICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSlcblxuXG5kYXRhLm5vIDwtIGJpbmRfcm93cyhiYXRjaDEsIGJhdGNoMilcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIyMgT3ZlcmxhcFxuY3Njb3JlLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShjc2NvcmVbMTozXSlcbm92ZXJsYXAgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBjc2NvcmUuZ3IpXG5cbiMjIFByb2JsZW0gb2YgY2VydGFpbiBnZW5lcyBub3QgZ2V0dGluZyBvdmVybGFwIHdpdGggY3Njb3JlIGR1ZSB0byBzcGFyc2UgY2FsbGluZz9cbmJhdGNoMSA8LSBiaW5kX2NvbHMoZGF0YS50YWJsZShhbmNob3IuZG93bi50YilbcXVlcnlIaXRzKG92ZXJsYXApXSxcbiAgICAgICAgICBkYXRhLnRhYmxlKGNzY29yZSlbc3ViamVjdEhpdHMob3ZlcmxhcCldKVxuXG5cbm1pc3NlZCA8LSBkYXRhLnRhYmxlKGFuY2hvci5kb3duLnRiKVstcXVlcnlIaXRzKG92ZXJsYXApXVxudGVtcCA8LSBtaXNzZWQgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBzdGFydCAtIDEwMDAwLCBlbmQgPSBlbmQgLSAxMDAwMCkgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpXG5taXNzZWQuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5vdmVybGFwIDwtIGZpbmRPdmVybGFwcyhtaXNzZWQuZ3IsIGNzY29yZS5ncilcbmJhdGNoMiA8LSBiaW5kX2NvbHMoKG1pc3NlZClbcXVlcnlIaXRzKG92ZXJsYXApXSxcbiAgICAgICAgICBkYXRhLnRhYmxlKGNzY29yZSlbc3ViamVjdEhpdHMob3ZlcmxhcCldKVxuXG5cbmRhdGEuZG93biA8LSBiaW5kX3Jvd3MoYmF0Y2gxLCBiYXRjaDIpXG5cbm4udXAgPC0gbnJvdyhkYXRhLnVwKVxubi5ubyA8LSBucm93KGRhdGEubm8pXG5uLmRvd24gPC0gbnJvdyhkYXRhLmRvd24pXG5cbmRhdGEgPC0gdGliYmxlKGxvb3BEaWZmID0gYyhyZXAoXFxVUFxcLCBuLnVwKSwgcmVwKFxcTk9cXCwgbi5ubyksIHJlcChcXERPV05cXCwgbi5kb3duKSksXG4gICAgICAgICAgICAgIGNoYW5nZVR5cGUgPSBjKGRhdGEudXAkY2hhbmdlVHlwZSwgZGF0YS5ubyRjaGFuZ2VUeXBlLCBkYXRhLmRvd24kY2hhbmdlVHlwZSkpXG5cbiMgVklTVUFMSVpFXG5kYXRhJGNoYW5nZVR5cGUgPC0gZmFjdG9yKGRhdGEkY2hhbmdlVHlwZSwgbGV2ZWxzID0gYyhcXEFfd2Vha2VuaW5nXFwsIFxcQXRvQlxcLCBcXEJfc3RyZW5ndGhlbmluZ1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXEJfd2Vha2VuaW5nXFwsIFxcQnRvQVxcLCBcXEFfc3RyZW5ndGhlbmluZ1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFVuY2hhbmdlZFxcKSlcbmdncGxvdChkYXRhLCBhZXMoeCA9IGxvb3BEaWZmLCBmaWxsID0gY2hhbmdlVHlwZSkpICtcbiAgZ2VvbV9iYXIocG9zaXRpb24gPSBcXGZpbGxcXCkgK1xuICBsYWJzKHRpdGxlID0gXFxTdGFja2VkIEJhciBQbG90IG9mIENoYW5nZSBUeXBlIGJ5IERpZmZcXCxcbiAgICAgICB4ID0gXFxEaWZmXFwsXG4gICAgICAgeSA9IFxcQ291bnRcXCkgK1xuICB0aGVtZV9idygpICsgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFxza3libHVlXFwsIFxcYmx1ZVxcLCBcXGRhcmtibHVlXFwsIFxccGlua1xcLCBcXHJlZDJcXCwgXFxkYXJrcmVkXFwgLFxcZ3JleVxcKSlcblxuXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
name <- \chromo_cons_annoHierarchy\

# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
anchor.up.tb <- as_tibble(anchor.up) %>%
  dplyr::mutate(center = (start + end)/2) %>%
  dplyr::mutate(start = center-1, end = center+1) %>%
  dplyr::select(seqnames, start, end)
anchor.up <- makeGRangesFromDataFrame(anchor.up.tb)
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
anchor.no.tb <- as_tibble(anchor.no) %>%
  dplyr::mutate(center = (start + end)/2) %>%
  dplyr::mutate(start = center-1, end = center+1) %>%
  dplyr::select(seqnames, start, end)
anchor.no <- makeGRangesFromDataFrame(anchor.no.tb)
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))
anchor.down.tb <- as_tibble(anchor.down) %>%
  dplyr::mutate(center = (start + end)/2) %>%
  dplyr::mutate(start = center-1, end = center+1) %>%
  dplyr::select(seqnames, start, end)
anchor.down <- makeGRangesFromDataFrame(anchor.down.tb)


########################################################################
### Overlap
cscore.gr <- makeGRangesFromDataFrame(cscore[1:3])
overlap <- findOverlaps(anchor.up, cscore.gr)

## Problem of certain genes not getting overlap with cscore due to sparse calling?
batch1 <- bind_cols(data.table(anchor.up.tb)[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


missed <- data.table(anchor.up.tb)[-queryHits(overlap)]
temp <- missed %>% dplyr::mutate(start = start - 10000, end = end - 10000) %>%
  dplyr::select(seqnames, start, end)
missed.gr <- makeGRangesFromDataFrame(temp)
overlap <- findOverlaps(missed.gr, cscore.gr)
batch2 <- bind_cols((missed)[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


data.up <- bind_rows(batch1, batch2)

########################################################################
### Overlap
cscore.gr <- makeGRangesFromDataFrame(cscore[1:3])
overlap <- findOverlaps(anchor.no, cscore.gr)

## Problem of certain genes not getting overlap with cscore due to sparse calling?
batch1 <- bind_cols(data.table(anchor.no.tb)[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


missed <- data.table(anchor.no.tb)[-queryHits(overlap)]
temp <- missed %>% dplyr::mutate(start = start - 10000, end = end - 10000) %>%
  dplyr::select(seqnames, start, end)
missed.gr <- makeGRangesFromDataFrame(temp)
overlap <- findOverlaps(missed.gr, cscore.gr)
batch2 <- bind_cols((missed)[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


data.no <- bind_rows(batch1, batch2)

########################################################################
### Overlap
cscore.gr <- makeGRangesFromDataFrame(cscore[1:3])
overlap <- findOverlaps(anchor.down, cscore.gr)

## Problem of certain genes not getting overlap with cscore due to sparse calling?
batch1 <- bind_cols(data.table(anchor.down.tb)[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


missed <- data.table(anchor.down.tb)[-queryHits(overlap)]
temp <- missed %>% dplyr::mutate(start = start - 10000, end = end - 10000) %>%
  dplyr::select(seqnames, start, end)
missed.gr <- makeGRangesFromDataFrame(temp)
overlap <- findOverlaps(missed.gr, cscore.gr)
batch2 <- bind_cols((missed)[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


data.down <- bind_rows(batch1, batch2)

n.up <- nrow(data.up)
n.no <- nrow(data.no)
n.down <- nrow(data.down)

data <- tibble(loopDiff = c(rep(\UP\, n.up), rep(\NO\, n.no), rep(\DOWN\, n.down)),
              changeType = c(data.up$changeType, data.no$changeType, data.down$changeType))

# VISUALIZE
data$changeType <- factor(data$changeType, levels = c(\A_weakening\, \AtoB\, \B_strengthening\,
                                                                          \B_weakening\, \BtoA\, \A_strengthening\,
                                                                          \Unchanged\))
ggplot(data, aes(x = loopDiff, fill = changeType)) +
  geom_bar(position = \fill\) +
  labs(title = \Stacked Bar Plot of Change Type by Diff\,
       x = \Diff\,
       y = \Count\) +
  theme_bw() +  scale_fill_manual(values = c(\skyblue\, \blue\, \darkblue\, \pink\, \red2\, \darkred\ ,\grey\))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzRqSUZWUUlHeHZiM0JjYm14dmIzQXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlCTkRnMWRuTkVUVk5QWDFWUVgyUnBabVl3TGpJdVltVmtjR1ZjWENrcFhHNWhibU5vYjNJdWRYQWdQQzBnS0dWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1MWNDa3BYRzVoYm1Ob2IzSXVkWEF1ZEdJZ1BDMGdZWE5mZEdsaVlteGxLR0Z1WTJodmNpNTFjQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1kyVnVkR1Z5SUQwZ0tITjBZWEowSUNzZ1pXNWtLUzh5S1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaHpkR0Z5ZENBOUlHTmxiblJsY2kweExDQmxibVFnUFNCalpXNTBaWElyTVNrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9jMlZ4Ym1GdFpYTXNJSE4wWVhKMExDQmxibVFwWEc1aGJtTm9iM0l1ZFhBZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtHRnVZMmh2Y2k1MWNDNTBZaWxjYmlNZ1RrOGdiRzl2Y0Z4dWJHOXZjQzV1YnlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDBFME9EVjJjMFJOVTA5ZlRrOWZaR2xtWmpBdU1pNWlaV1J3WlZ4Y0tTbGNibUZ1WTJodmNpNXVieUE4TFNBb1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtNXZLU2xjYm1GdVkyaHZjaTV1Ynk1MFlpQThMU0JoYzE5MGFXSmliR1VvWVc1amFHOXlMbTV2S1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGpaVzUwWlhJZ1BTQW9jM1JoY25RZ0t5QmxibVFwTHpJcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSE4wWVhKMElEMGdZMlZ1ZEdWeUxURXNJR1Z1WkNBOUlHTmxiblJsY2lzeEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2h6WlhGdVlXMWxjeXdnYzNSaGNuUXNJR1Z1WkNsY2JtRnVZMmh2Y2k1dWJ5QThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9ZVzVqYUc5eUxtNXZMblJpS1Z4dUl5QkVUMWRPSUd4dmIzQmNibXh2YjNBdVpHOTNiaUE4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNCbExYQmxYMEUwT0RWMmMwUk5VMDlmUkU5WFRsOWthV1ptTUM0eUxtSmxaSEJsWEZ3cEtWeHVZVzVqYUc5eUxtUnZkMjRnUEMwZ0tHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWtiM2R1S1NsY2JtRnVZMmh2Y2k1a2IzZHVMblJpSUR3dElHRnpYM1JwWW1Kc1pTaGhibU5vYjNJdVpHOTNiaWtnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1kyVnVkR1Z5SUQwZ0tITjBZWEowSUNzZ1pXNWtLUzh5S1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaHpkR0Z5ZENBOUlHTmxiblJsY2kweExDQmxibVFnUFNCalpXNTBaWElyTVNrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9jMlZ4Ym1GdFpYTXNJSE4wWVhKMExDQmxibVFwWEc1aGJtTm9iM0l1Wkc5M2JpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9ZVzVqYUc5eUxtUnZkMjR1ZEdJcFhHNWNibHh1SXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qWEc0akl5TWdUM1psY214aGNGeHVZM05qYjNKbExtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2hqYzJOdmNtVmJNVG96WFNsY2JtOTJaWEpzWVhBZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjaTUxY0N3Z1kzTmpiM0psTG1keUtWeHVYRzRqSXlCUWNtOWliR1Z0SUc5bUlHTmxjblJoYVc0Z1oyVnVaWE1nYm05MElHZGxkSFJwYm1jZ2IzWmxjbXhoY0NCM2FYUm9JR056WTI5eVpTQmtkV1VnZEc4Z2MzQmhjbk5sSUdOaGJHeHBibWMvWEc1aVlYUmphREVnUEMwZ1ltbHVaRjlqYjJ4ektHUmhkR0V1ZEdGaWJHVW9ZVzVqYUc5eUxuVndMblJpS1Z0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0NsZExGeHVJQ0FnSUNBZ0lDQWdJR1JoZEdFdWRHRmliR1VvWTNOamIzSmxLVnR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3S1YwcFhHNWNibHh1YldsemMyVmtJRHd0SUdSaGRHRXVkR0ZpYkdVb1lXNWphRzl5TG5Wd0xuUmlLVnN0Y1hWbGNubElhWFJ6S0c5MlpYSnNZWEFwWFZ4dWRHVnRjQ0E4TFNCdGFYTnpaV1FnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvYzNSaGNuUWdQU0J6ZEdGeWRDQXRJREV3TURBd0xDQmxibVFnUFNCbGJtUWdMU0F4TURBd01Da2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvYzJWeGJtRnRaWE1zSUhOMFlYSjBMQ0JsYm1RcFhHNXRhWE56WldRdVozSWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLSFJsYlhBcFhHNXZkbVZ5YkdGd0lEd3RJR1pwYm1SUGRtVnliR0Z3Y3lodGFYTnpaV1F1WjNJc0lHTnpZMjl5WlM1bmNpbGNibUpoZEdOb01pQThMU0JpYVc1a1gyTnZiSE1vS0cxcGMzTmxaQ2xiY1hWbGNubElhWFJ6S0c5MlpYSnNZWEFwWFN4Y2JpQWdJQ0FnSUNBZ0lDQmtZWFJoTG5SaFlteGxLR056WTI5eVpTbGJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjQ2xkS1Z4dVhHNWNibVJoZEdFdWRYQWdQQzBnWW1sdVpGOXliM2R6S0dKaGRHTm9NU3dnWW1GMFkyZ3lLVnh1WEc0akl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlOY2JpTWpJeUJQZG1WeWJHRndYRzVqYzJOdmNtVXVaM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0dOelkyOXlaVnN4T2pOZEtWeHViM1psY214aGNDQThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG01dkxDQmpjMk52Y21VdVozSXBYRzVjYmlNaklGQnliMkpzWlcwZ2IyWWdZMlZ5ZEdGcGJpQm5aVzVsY3lCdWIzUWdaMlYwZEdsdVp5QnZkbVZ5YkdGd0lIZHBkR2dnWTNOamIzSmxJR1IxWlNCMGJ5QnpjR0Z5YzJVZ1kyRnNiR2x1Wno5Y2JtSmhkR05vTVNBOExTQmlhVzVrWDJOdmJITW9aR0YwWVM1MFlXSnNaU2hoYm1Ob2IzSXVibTh1ZEdJcFczRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd0tWMHNYRzRnSUNBZ0lDQWdJQ0FnWkdGMFlTNTBZV0pzWlNoamMyTnZjbVVwVzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhBcFhTbGNibHh1WEc1dGFYTnpaV1FnUEMwZ1pHRjBZUzUwWVdKc1pTaGhibU5vYjNJdWJtOHVkR0lwV3kxeGRXVnllVWhwZEhNb2IzWmxjbXhoY0NsZFhHNTBaVzF3SUR3dElHMXBjM05sWkNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoemRHRnlkQ0E5SUhOMFlYSjBJQzBnTVRBd01EQXNJR1Z1WkNBOUlHVnVaQ0F0SURFd01EQXdLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENoelpYRnVZVzFsY3l3Z2MzUmhjblFzSUdWdVpDbGNibTFwYzNObFpDNW5jaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvZEdWdGNDbGNibTkyWlhKc1lYQWdQQzBnWm1sdVpFOTJaWEpzWVhCektHMXBjM05sWkM1bmNpd2dZM05qYjNKbExtZHlLVnh1WW1GMFkyZ3lJRHd0SUdKcGJtUmZZMjlzY3lnb2JXbHpjMlZrS1Z0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0NsZExGeHVJQ0FnSUNBZ0lDQWdJR1JoZEdFdWRHRmliR1VvWTNOamIzSmxLVnR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3S1YwcFhHNWNibHh1WkdGMFlTNXVieUE4TFNCaWFXNWtYM0p2ZDNNb1ltRjBZMmd4TENCaVlYUmphRElwWEc1Y2JpTWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakkxeHVJeU1qSUU5MlpYSnNZWEJjYm1OelkyOXlaUzVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1kzTmpiM0psV3pFNk0xMHBYRzV2ZG1WeWJHRndJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVpHOTNiaXdnWTNOamIzSmxMbWR5S1Z4dVhHNGpJeUJRY205aWJHVnRJRzltSUdObGNuUmhhVzRnWjJWdVpYTWdibTkwSUdkbGRIUnBibWNnYjNabGNteGhjQ0IzYVhSb0lHTnpZMjl5WlNCa2RXVWdkRzhnYzNCaGNuTmxJR05oYkd4cGJtYy9YRzVpWVhSamFERWdQQzBnWW1sdVpGOWpiMnh6S0dSaGRHRXVkR0ZpYkdVb1lXNWphRzl5TG1SdmQyNHVkR0lwVzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3S1Ywc1hHNGdJQ0FnSUNBZ0lDQWdaR0YwWVM1MFlXSnNaU2hqYzJOdmNtVXBXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEFwWFNsY2JseHVYRzV0YVhOelpXUWdQQzBnWkdGMFlTNTBZV0pzWlNoaGJtTm9iM0l1Wkc5M2JpNTBZaWxiTFhGMVpYSjVTR2wwY3lodmRtVnliR0Z3S1YxY2JuUmxiWEFnUEMwZ2JXbHpjMlZrSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0hOMFlYSjBJRDBnYzNSaGNuUWdMU0F4TURBd01Dd2daVzVrSUQwZ1pXNWtJQzBnTVRBd01EQXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0hObGNXNWhiV1Z6TENCemRHRnlkQ3dnWlc1a0tWeHViV2x6YzJWa0xtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2gwWlcxd0tWeHViM1psY214aGNDQThMU0JtYVc1a1QzWmxjbXhoY0hNb2JXbHpjMlZrTG1keUxDQmpjMk52Y21VdVozSXBYRzVpWVhSamFESWdQQzBnWW1sdVpGOWpiMnh6S0NodGFYTnpaV1FwVzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3S1Ywc1hHNGdJQ0FnSUNBZ0lDQWdaR0YwWVM1MFlXSnNaU2hqYzJOdmNtVXBXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEFwWFNsY2JseHVYRzVrWVhSaExtUnZkMjRnUEMwZ1ltbHVaRjl5YjNkektHSmhkR05vTVN3Z1ltRjBZMmd5S1Z4dVhHNXVMblZ3SUR3dElHNXliM2NvWkdGMFlTNTFjQ2xjYm00dWJtOGdQQzBnYm5KdmR5aGtZWFJoTG01dktWeHViaTVrYjNkdUlEd3RJRzV5YjNjb1pHRjBZUzVrYjNkdUtWeHVYRzVrWVhSaElEd3RJSFJwWW1Kc1pTaHNiMjl3UkdsbVppQTlJR01vY21Wd0tGeGNWVkJjWEN3Z2JpNTFjQ2tzSUhKbGNDaGNYRTVQWEZ3c0lHNHVibThwTENCeVpYQW9YRnhFVDFkT1hGd3NJRzR1Wkc5M2Jpa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQmphR0Z1WjJWVWVYQmxJRDBnWXloa1lYUmhMblZ3SkdOb1lXNW5aVlI1Y0dVc0lHUmhkR0V1Ym04a1kyaGhibWRsVkhsd1pTd2daR0YwWVM1a2IzZHVKR05vWVc1blpWUjVjR1VwS1Z4dVhHNGpJRlpKVTFWQlRFbGFSVnh1WkdGMFlTUmphR0Z1WjJWVWVYQmxJRHd0SUdaaFkzUnZjaWhrWVhSaEpHTm9ZVzVuWlZSNWNHVXNJR3hsZG1Wc2N5QTlJR01vWEZ4QlgzZGxZV3RsYm1sdVoxeGNMQ0JjWEVGMGIwSmNYQ3dnWEZ4Q1gzTjBjbVZ1WjNSb1pXNXBibWRjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYRnhDWDNkbFlXdGxibWx1WjF4Y0xDQmNYRUowYjBGY1hDd2dYRnhCWDNOMGNtVnVaM1JvWlc1cGJtZGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeFZibU5vWVc1blpXUmNYQ2twWEc1blozQnNiM1FvWkdGMFlTd2dZV1Z6S0hnZ1BTQnNiMjl3UkdsbVppd2dabWxzYkNBOUlHTm9ZVzVuWlZSNWNHVXBLU0FyWEc0Z0lHZGxiMjFmWW1GeUtIQnZjMmwwYVc5dUlEMGdYRnhtYVd4c1hGd3BJQ3RjYmlBZ2JHRmljeWgwYVhSc1pTQTlJRnhjVTNSaFkydGxaQ0JDWVhJZ1VHeHZkQ0J2WmlCRGFHRnVaMlVnVkhsd1pTQmllU0JFYVdabVhGd3NYRzRnSUNBZ0lDQWdlQ0E5SUZ4Y1JHbG1abHhjTEZ4dUlDQWdJQ0FnSUhrZ1BTQmNYRU52ZFc1MFhGd3BJQ3RjYmlBZ2RHaGxiV1ZmWW5jb0tTQXJJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y2MydDVZbXgxWlZ4Y0xDQmNYR0pzZFdWY1hDd2dYRnhrWVhKcllteDFaVnhjTENCY1hIQnBibXRjWEN3Z1hGeHlaV1F5WEZ3c0lGeGNaR0Z5YTNKbFpGeGNJQ3hjWEdkeVpYbGNYQ2twWEc1Y2JseHVYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG4jIFVQIGxvb3Bcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG5hbmNob3IudXAudGIgPC0gYXNfdGliYmxlKGFuY2hvci51cCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzdGFydCA9IGNlbnRlci0xLCBlbmQgPSBjZW50ZXIrMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpXG5hbmNob3IudXAgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGFuY2hvci51cC50YilcbiMgTk8gbG9vcFxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbmFuY2hvci5uby50YiA8LSBhc190aWJibGUoYW5jaG9yLm5vKSAlPiVcbiAgZHBseXI6Om11dGF0ZShjZW50ZXIgPSAoc3RhcnQgKyBlbmQpLzIpICU+JVxuICBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gY2VudGVyLTEsIGVuZCA9IGNlbnRlcisxKSAlPiVcbiAgZHBseXI6OnNlbGVjdChzZXFuYW1lcywgc3RhcnQsIGVuZClcbmFuY2hvci5ubyA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYW5jaG9yLm5vLnRiKVxuIyBET1dOIGxvb3Bcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSlcbmFuY2hvci5kb3duLnRiIDwtIGFzX3RpYmJsZShhbmNob3IuZG93bikgJT4lXG4gIGRwbHlyOjptdXRhdGUoY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzdGFydCA9IGNlbnRlci0xLCBlbmQgPSBjZW50ZXIrMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpXG5hbmNob3IuZG93biA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYW5jaG9yLmRvd24udGIpXG5cblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIyMgT3ZlcmxhcFxuY3Njb3JlLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShjc2NvcmVbMTozXSlcbm92ZXJsYXAgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cCwgY3Njb3JlLmdyKVxuXG4jIyBQcm9ibGVtIG9mIGNlcnRhaW4gZ2VuZXMgbm90IGdldHRpbmcgb3ZlcmxhcCB3aXRoIGNzY29yZSBkdWUgdG8gc3BhcnNlIGNhbGxpbmc/XG5iYXRjaDEgPC0gYmluZF9jb2xzKGRhdGEudGFibGUoYW5jaG9yLnVwLnRiKVtxdWVyeUhpdHMob3ZlcmxhcCldLFxuICAgICAgICAgIGRhdGEudGFibGUoY3Njb3JlKVtzdWJqZWN0SGl0cyhvdmVybGFwKV0pXG5cblxubWlzc2VkIDwtIGRhdGEudGFibGUoYW5jaG9yLnVwLnRiKVstcXVlcnlIaXRzKG92ZXJsYXApXVxudGVtcCA8LSBtaXNzZWQgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBzdGFydCAtIDEwMDAwLCBlbmQgPSBlbmQgLSAxMDAwMCkgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpXG5taXNzZWQuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5vdmVybGFwIDwtIGZpbmRPdmVybGFwcyhtaXNzZWQuZ3IsIGNzY29yZS5ncilcbmJhdGNoMiA8LSBiaW5kX2NvbHMoKG1pc3NlZClbcXVlcnlIaXRzKG92ZXJsYXApXSxcbiAgICAgICAgICBkYXRhLnRhYmxlKGNzY29yZSlbc3ViamVjdEhpdHMob3ZlcmxhcCldKVxuXG5cbmRhdGEudXAgPC0gYmluZF9yb3dzKGJhdGNoMSwgYmF0Y2gyKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMjIyBPdmVybGFwXG5jc2NvcmUuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGNzY29yZVsxOjNdKVxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vLCBjc2NvcmUuZ3IpXG5cbiMjIFByb2JsZW0gb2YgY2VydGFpbiBnZW5lcyBub3QgZ2V0dGluZyBvdmVybGFwIHdpdGggY3Njb3JlIGR1ZSB0byBzcGFyc2UgY2FsbGluZz9cbmJhdGNoMSA8LSBiaW5kX2NvbHMoZGF0YS50YWJsZShhbmNob3Iubm8udGIpW3F1ZXJ5SGl0cyhvdmVybGFwKV0sXG4gICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSlcblxuXG5taXNzZWQgPC0gZGF0YS50YWJsZShhbmNob3Iubm8udGIpWy1xdWVyeUhpdHMob3ZlcmxhcCldXG50ZW1wIDwtIG1pc3NlZCAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IHN0YXJ0IC0gMTAwMDAsIGVuZCA9IGVuZCAtIDEwMDAwKSAlPiVcbiAgZHBseXI6OnNlbGVjdChzZXFuYW1lcywgc3RhcnQsIGVuZClcbm1pc3NlZC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcbm92ZXJsYXAgPC0gZmluZE92ZXJsYXBzKG1pc3NlZC5nciwgY3Njb3JlLmdyKVxuYmF0Y2gyIDwtIGJpbmRfY29scygobWlzc2VkKVtxdWVyeUhpdHMob3ZlcmxhcCldLFxuICAgICAgICAgIGRhdGEudGFibGUoY3Njb3JlKVtzdWJqZWN0SGl0cyhvdmVybGFwKV0pXG5cblxuZGF0YS5ubyA8LSBiaW5kX3Jvd3MoYmF0Y2gxLCBiYXRjaDIpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyMjIE92ZXJsYXBcbmNzY29yZS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoY3Njb3JlWzE6M10pXG5vdmVybGFwIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgY3Njb3JlLmdyKVxuXG4jIyBQcm9ibGVtIG9mIGNlcnRhaW4gZ2VuZXMgbm90IGdldHRpbmcgb3ZlcmxhcCB3aXRoIGNzY29yZSBkdWUgdG8gc3BhcnNlIGNhbGxpbmc/XG5iYXRjaDEgPC0gYmluZF9jb2xzKGRhdGEudGFibGUoYW5jaG9yLmRvd24udGIpW3F1ZXJ5SGl0cyhvdmVybGFwKV0sXG4gICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSlcblxuXG5taXNzZWQgPC0gZGF0YS50YWJsZShhbmNob3IuZG93bi50YilbLXF1ZXJ5SGl0cyhvdmVybGFwKV1cbnRlbXAgPC0gbWlzc2VkICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gc3RhcnQgLSAxMDAwMCwgZW5kID0gZW5kIC0gMTAwMDApICU+JVxuICBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kKVxubWlzc2VkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMobWlzc2VkLmdyLCBjc2NvcmUuZ3IpXG5iYXRjaDIgPC0gYmluZF9jb2xzKChtaXNzZWQpW3F1ZXJ5SGl0cyhvdmVybGFwKV0sXG4gICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSlcblxuXG5kYXRhLmRvd24gPC0gYmluZF9yb3dzKGJhdGNoMSwgYmF0Y2gyKVxuXG5uLnVwIDwtIG5yb3coZGF0YS51cClcbm4ubm8gPC0gbnJvdyhkYXRhLm5vKVxubi5kb3duIDwtIG5yb3coZGF0YS5kb3duKVxuXG5kYXRhIDwtIHRpYmJsZShsb29wRGlmZiA9IGMocmVwKFxcVVBcXCwgbi51cCksIHJlcChcXE5PXFwsIG4ubm8pLCByZXAoXFxET1dOXFwsIG4uZG93bikpLFxuICAgICAgICAgICAgICBjaGFuZ2VUeXBlID0gYyhkYXRhLnVwJGNoYW5nZVR5cGUsIGRhdGEubm8kY2hhbmdlVHlwZSwgZGF0YS5kb3duJGNoYW5nZVR5cGUpKVxuXG4jIFZJU1VBTElaRVxuZGF0YSRjaGFuZ2VUeXBlIDwtIGZhY3RvcihkYXRhJGNoYW5nZVR5cGUsIGxldmVscyA9IGMoXFxBX3dlYWtlbmluZ1xcLCBcXEF0b0JcXCwgXFxCX3N0cmVuZ3RoZW5pbmdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxCX3dlYWtlbmluZ1xcLCBcXEJ0b0FcXCwgXFxBX3N0cmVuZ3RoZW5pbmdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxVbmNoYW5nZWRcXCkpXG5nZ3Bsb3QoZGF0YSwgYWVzKHggPSBsb29wRGlmZiwgZmlsbCA9IGNoYW5nZVR5cGUpKSArXG4gIGdlb21fYmFyKHBvc2l0aW9uID0gXFxmaWxsXFwpICtcbiAgbGFicyh0aXRsZSA9IFxcU3RhY2tlZCBCYXIgUGxvdCBvZiBDaGFuZ2UgVHlwZSBieSBEaWZmXFwsXG4gICAgICAgeCA9IFxcRGlmZlxcLFxuICAgICAgIHkgPSBcXENvdW50XFwpICtcbiAgdGhlbWVfYncoKSArICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcc2t5Ymx1ZVxcLCBcXGJsdWVcXCwgXFxkYXJrYmx1ZVxcLCBcXHBpbmtcXCwgXFxyZWQyXFwsIFxcZGFya3JlZFxcICxcXGdyZXlcXCkpXG5cblxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG4jIFVQIGxvb3Bcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpXG5hbmNob3IudXAudGIgPC0gYXNfdGliYmxlKGFuY2hvci51cCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzdGFydCA9IGNlbnRlci0xLCBlbmQgPSBjZW50ZXIrMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpXG5hbmNob3IudXAgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGFuY2hvci51cC50YilcbiMgTk8gbG9vcFxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSlcbmFuY2hvci5uby50YiA8LSBhc190aWJibGUoYW5jaG9yLm5vKSAlPiVcbiAgZHBseXI6Om11dGF0ZShjZW50ZXIgPSAoc3RhcnQgKyBlbmQpLzIpICU+JVxuICBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gY2VudGVyLTEsIGVuZCA9IGNlbnRlcisxKSAlPiVcbiAgZHBseXI6OnNlbGVjdChzZXFuYW1lcywgc3RhcnQsIGVuZClcbmFuY2hvci5ubyA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYW5jaG9yLm5vLnRiKVxuIyBET1dOIGxvb3Bcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSlcbmFuY2hvci5kb3duLnRiIDwtIGFzX3RpYmJsZShhbmNob3IuZG93bikgJT4lXG4gIGRwbHlyOjptdXRhdGUoY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzdGFydCA9IGNlbnRlci0xLCBlbmQgPSBjZW50ZXIrMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpXG5hbmNob3IuZG93biA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYW5jaG9yLmRvd24udGIpXG5cblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIyMgT3ZlcmxhcFxuY3Njb3JlLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShjc2NvcmVbMTozXSlcbm92ZXJsYXAgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cCwgY3Njb3JlLmdyKVxuXG4jIyBQcm9ibGVtIG9mIGNlcnRhaW4gZ2VuZXMgbm90IGdldHRpbmcgb3ZlcmxhcCB3aXRoIGNzY29yZSBkdWUgdG8gc3BhcnNlIGNhbGxpbmc/XG5iYXRjaDEgPC0gYmluZF9jb2xzKGRhdGEudGFibGUoYW5jaG9yLnVwLnRiKVtxdWVyeUhpdHMob3ZlcmxhcCldLFxuICAgICAgICAgIGRhdGEudGFibGUoY3Njb3JlKVtzdWJqZWN0SGl0cyhvdmVybGFwKV0pXG5cblxubWlzc2VkIDwtIGRhdGEudGFibGUoYW5jaG9yLnVwLnRiKVstcXVlcnlIaXRzKG92ZXJsYXApXVxudGVtcCA8LSBtaXNzZWQgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBzdGFydCAtIDEwMDAwLCBlbmQgPSBlbmQgLSAxMDAwMCkgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpXG5taXNzZWQuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5vdmVybGFwIDwtIGZpbmRPdmVybGFwcyhtaXNzZWQuZ3IsIGNzY29yZS5ncilcbmJhdGNoMiA8LSBiaW5kX2NvbHMoKG1pc3NlZClbcXVlcnlIaXRzKG92ZXJsYXApXSxcbiAgICAgICAgICBkYXRhLnRhYmxlKGNzY29yZSlbc3ViamVjdEhpdHMob3ZlcmxhcCldKVxuXG5cbmRhdGEudXAgPC0gYmluZF9yb3dzKGJhdGNoMSwgYmF0Y2gyKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMjIyBPdmVybGFwXG5jc2NvcmUuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGNzY29yZVsxOjNdKVxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vLCBjc2NvcmUuZ3IpXG5cbiMjIFByb2JsZW0gb2YgY2VydGFpbiBnZW5lcyBub3QgZ2V0dGluZyBvdmVybGFwIHdpdGggY3Njb3JlIGR1ZSB0byBzcGFyc2UgY2FsbGluZz9cbmJhdGNoMSA8LSBiaW5kX2NvbHMoZGF0YS50YWJsZShhbmNob3Iubm8udGIpW3F1ZXJ5SGl0cyhvdmVybGFwKV0sXG4gICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSlcblxuXG5taXNzZWQgPC0gZGF0YS50YWJsZShhbmNob3Iubm8udGIpWy1xdWVyeUhpdHMob3ZlcmxhcCldXG50ZW1wIDwtIG1pc3NlZCAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IHN0YXJ0IC0gMTAwMDAsIGVuZCA9IGVuZCAtIDEwMDAwKSAlPiVcbiAgZHBseXI6OnNlbGVjdChzZXFuYW1lcywgc3RhcnQsIGVuZClcbm1pc3NlZC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcbm92ZXJsYXAgPC0gZmluZE92ZXJsYXBzKG1pc3NlZC5nciwgY3Njb3JlLmdyKVxuYmF0Y2gyIDwtIGJpbmRfY29scygobWlzc2VkKVtxdWVyeUhpdHMob3ZlcmxhcCldLFxuICAgICAgICAgIGRhdGEudGFibGUoY3Njb3JlKVtzdWJqZWN0SGl0cyhvdmVybGFwKV0pXG5cblxuZGF0YS5ubyA8LSBiaW5kX3Jvd3MoYmF0Y2gxLCBiYXRjaDIpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyMjIE92ZXJsYXBcbmNzY29yZS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoY3Njb3JlWzE6M10pXG5vdmVybGFwIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgY3Njb3JlLmdyKVxuXG4jIyBQcm9ibGVtIG9mIGNlcnRhaW4gZ2VuZXMgbm90IGdldHRpbmcgb3ZlcmxhcCB3aXRoIGNzY29yZSBkdWUgdG8gc3BhcnNlIGNhbGxpbmc/XG5iYXRjaDEgPC0gYmluZF9jb2xzKGRhdGEudGFibGUoYW5jaG9yLmRvd24udGIpW3F1ZXJ5SGl0cyhvdmVybGFwKV0sXG4gICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSlcblxuXG5taXNzZWQgPC0gZGF0YS50YWJsZShhbmNob3IuZG93bi50YilbLXF1ZXJ5SGl0cyhvdmVybGFwKV1cbnRlbXAgPC0gbWlzc2VkICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gc3RhcnQgLSAxMDAwMCwgZW5kID0gZW5kIC0gMTAwMDApICU+JVxuICBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kKVxubWlzc2VkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxub3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMobWlzc2VkLmdyLCBjc2NvcmUuZ3IpXG5iYXRjaDIgPC0gYmluZF9jb2xzKChtaXNzZWQpW3F1ZXJ5SGl0cyhvdmVybGFwKV0sXG4gICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSlcblxuXG5kYXRhLmRvd24gPC0gYmluZF9yb3dzKGJhdGNoMSwgYmF0Y2gyKVxuXG5uLnVwIDwtIG5yb3coZGF0YS51cClcbm4ubm8gPC0gbnJvdyhkYXRhLm5vKVxubi5kb3duIDwtIG5yb3coZGF0YS5kb3duKVxuXG5kYXRhIDwtIHRpYmJsZShsb29wRGlmZiA9IGMocmVwKFxcVVBcXCwgbi51cCksIHJlcChcXE5PXFwsIG4ubm8pLCByZXAoXFxET1dOXFwsIG4uZG93bikpLFxuICAgICAgICAgICAgICBjaGFuZ2VUeXBlID0gYyhkYXRhLnVwJGNoYW5nZVR5cGUsIGRhdGEubm8kY2hhbmdlVHlwZSwgZGF0YS5kb3duJGNoYW5nZVR5cGUpKVxuXG4jIFZJU1VBTElaRVxuZGF0YSRjaGFuZ2VUeXBlIDwtIGZhY3RvcihkYXRhJGNoYW5nZVR5cGUsIGxldmVscyA9IGMoXFxBX3dlYWtlbmluZ1xcLCBcXEF0b0JcXCwgXFxCX3N0cmVuZ3RoZW5pbmdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxCX3dlYWtlbmluZ1xcLCBcXEJ0b0FcXCwgXFxBX3N0cmVuZ3RoZW5pbmdcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxVbmNoYW5nZWRcXCkpXG5nZ3Bsb3QoZGF0YSwgYWVzKHggPSBsb29wRGlmZiwgZmlsbCA9IGNoYW5nZVR5cGUpKSArXG4gIGdlb21fYmFyKHBvc2l0aW9uID0gXFxmaWxsXFwpICtcbiAgbGFicyh0aXRsZSA9IFxcU3RhY2tlZCBCYXIgUGxvdCBvZiBDaGFuZ2UgVHlwZSBieSBEaWZmXFwsXG4gICAgICAgeCA9IFxcRGlmZlxcLFxuICAgICAgIHkgPSBcXENvdW50XFwpICtcbiAgdGhlbWVfYncoKSArICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcc2t5Ymx1ZVxcLCBcXGJsdWVcXCwgXFxkYXJrYmx1ZVxcLCBcXHBpbmtcXCwgXFxyZWQyXFwsIFxcZGFya3JlZFxcICxcXGdyZXlcXCkpXG5cblxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
name <- \chromo_cons_annoHierarchy\

# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_UP_diff0.2.bedpe\))
anchor.up <- (extractAnchor(loop.up))
anchor.up.tb <- as_tibble(anchor.up) %>%
  dplyr::mutate(center = (start + end)/2) %>%
  dplyr::mutate(start = center-1, end = center+1) %>%
  dplyr::select(seqnames, start, end)
anchor.up <- makeGRangesFromDataFrame(anchor.up.tb)
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_NO_diff0.2.bedpe\))
anchor.no <- (extractAnchor(loop.no))
anchor.no.tb <- as_tibble(anchor.no) %>%
  dplyr::mutate(center = (start + end)/2) %>%
  dplyr::mutate(start = center-1, end = center+1) %>%
  dplyr::select(seqnames, start, end)
anchor.no <- makeGRangesFromDataFrame(anchor.no.tb)
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_A485vsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- (extractAnchor(loop.down))
anchor.down.tb <- as_tibble(anchor.down) %>%
  dplyr::mutate(center = (start + end)/2) %>%
  dplyr::mutate(start = center-1, end = center+1) %>%
  dplyr::select(seqnames, start, end)
anchor.down <- makeGRangesFromDataFrame(anchor.down.tb)


########################################################################
### Overlap
cscore.gr <- makeGRangesFromDataFrame(cscore[1:3])
overlap <- findOverlaps(anchor.up, cscore.gr)

## Problem of certain genes not getting overlap with cscore due to sparse calling?
batch1 <- bind_cols(data.table(anchor.up.tb)[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


missed <- data.table(anchor.up.tb)[-queryHits(overlap)]
temp <- missed %>% dplyr::mutate(start = start - 10000, end = end - 10000) %>%
  dplyr::select(seqnames, start, end)
missed.gr <- makeGRangesFromDataFrame(temp)
overlap <- findOverlaps(missed.gr, cscore.gr)
batch2 <- bind_cols((missed)[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


data.up <- bind_rows(batch1, batch2)

########################################################################
### Overlap
cscore.gr <- makeGRangesFromDataFrame(cscore[1:3])
overlap <- findOverlaps(anchor.no, cscore.gr)

## Problem of certain genes not getting overlap with cscore due to sparse calling?
batch1 <- bind_cols(data.table(anchor.no.tb)[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


missed <- data.table(anchor.no.tb)[-queryHits(overlap)]
temp <- missed %>% dplyr::mutate(start = start - 10000, end = end - 10000) %>%
  dplyr::select(seqnames, start, end)
missed.gr <- makeGRangesFromDataFrame(temp)
overlap <- findOverlaps(missed.gr, cscore.gr)
batch2 <- bind_cols((missed)[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


data.no <- bind_rows(batch1, batch2)

########################################################################
### Overlap
cscore.gr <- makeGRangesFromDataFrame(cscore[1:3])
overlap <- findOverlaps(anchor.down, cscore.gr)

## Problem of certain genes not getting overlap with cscore due to sparse calling?
batch1 <- bind_cols(data.table(anchor.down.tb)[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


missed <- data.table(anchor.down.tb)[-queryHits(overlap)]
temp <- missed %>% dplyr::mutate(start = start - 10000, end = end - 10000) %>%
  dplyr::select(seqnames, start, end)
missed.gr <- makeGRangesFromDataFrame(temp)
overlap <- findOverlaps(missed.gr, cscore.gr)
batch2 <- bind_cols((missed)[queryHits(overlap)],
          data.table(cscore)[subjectHits(overlap)])


data.down <- bind_rows(batch1, batch2)

n.up <- nrow(data.up)
n.no <- nrow(data.no)
n.down <- nrow(data.down)

data <- tibble(loopDiff = c(rep(\UP\, n.up), rep(\NO\, n.no), rep(\DOWN\, n.down)),
              changeType = c(data.up$changeType, data.no$changeType, data.down$changeType))

# VISUALIZE
data$changeType <- factor(data$changeType, levels = c(\A_weakening\, \AtoB\, \B_strengthening\,
                                                                          \B_weakening\, \BtoA\, \A_strengthening\,
                                                                          \Unchanged\))
ggplot(data, aes(x = loopDiff, fill = changeType)) +
  geom_bar(position = \fill\) +
  labs(title = \Stacked Bar Plot of Change Type by Diff\,
       x = \Diff\,
       y = \Count\) +
  theme_bw() +  scale_fill_manual(values = c(\skyblue\, \blue\, \darkblue\, \pink\, \red2\, \darkred\ ,\grey\))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Combining with RNA-seq

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjbVZ6ZFd4MFJHbHlJRHd0SUdobGNtVW9YQ0l1TGk4dUxpOXlaWE4xYkhSY0lpbGNibHh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0hKbGMzVnNkRVJwY2l3Z1hDSmphSEp2YlVoTlRWd2lMQ0JjSWtFME9EVmZjR1V0Y0dWZllXNWphRzl5YzF3aUxDQmNJbTkyWlhKc1lYQmZaVzV5YVdOb1h6RXdNRjl6ZEdGMFpTNTBlSFJjSWlrcFhHNWpiMnh1WVcxbGN5aGtZWFJoS1NBOExTQmpLRndpYzNSaGRHVmNJaXdnWENKblpXNXZiV1ZjSWl3Z1hDSndaUzF3WlY5Qk5EZzFYMlJ2ZDI1Y0lpd2dYQ0p3WlMxd1pWOUJORGcxWDI1dlhDSXNJRndpY0dVdGNHVmZRVFE0TlY5MWNGd2lLVnh1WkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtDMW5aVzV2YldVcFhHNWNibVJoZEdGZmJXRjBjbWw0SUR3dElHUmhkR0VnSlQ0bFhHNGdJR052YkhWdGJsOTBiMTl5YjNkdVlXMWxjeWgyWVhJZ1BTQmNJbk4wWVhSbFhDSXBJQ1UrSlZ4dUlDQmhjeTV0WVhSeWFYZ29LVnh1WEc1c2FXSnlZWEo1S0dOcGNtTnNhWHBsS1Z4dVhHNWpiMnhmWm5WdUlEd3RJR052Ykc5eVVtRnRjRElvWXlnd0xDQXhMQ0F4TUNrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdNb1hDSmliSFZsWENJc0lGd2lkMmhwZEdWY0lpd2dYQ0p5WldSY0lpa3BYRzVjYmtobFlYUnRZWEFvWEc0Z0lHUmhkR0ZmYldGMGNtbDRMRnh1SUNCdVlXMWxJRDBnWENKV1lXeDFaVndpTEZ4dUlDQnphRzkzWDNKdmQxOXVZVzFsY3lBOUlGUlNWVVVzWEc0Z0lITm9iM2RmWTI5c2RXMXVYMjVoYldWeklEMGdWRkpWUlN4Y2JpQWdZMngxYzNSbGNsOWpiMngxYlc1eklEMGdSa0ZNVTBVc1hHNGdJR05zZFhOMFpYSmZjbTkzY3lBOUlFWkJURk5GTEZ4dUlDQWdZMjlzSUQwZ1kyOXNYMloxYmx4dUtWeHVYRzRqSXlNakl5TWpYRzVrWVhSaE1pQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHTW9NU3dnTWl3Z05Da3BYRzVrWVhSaE1pQThMU0JrWVhSaE1pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaGdjR1V0Y0dWZlFUUTROVjlrYjNkdVlDQStJR0J3WlMxd1pWOUJORGcxWDNWd1lDbGNibVJoZEdGZmJXRjBjbWw0SUR3dElHUmhkR0V5SUNVK0pWeHVJQ0JqYjJ4MWJXNWZkRzlmY205M2JtRnRaWE1vZG1GeUlEMGdYQ0p6ZEdGMFpWd2lLU0FsUGlWY2JpQWdZWE11YldGMGNtbDRLQ2xjYmx4dWJHbGljbUZ5ZVNoamFYSmpiR2w2WlNsY2JseHVZMjlzWDJaMWJpQThMU0JqYjJ4dmNsSmhiWEF5S0dNb01Dd2dNU3dnTVRBcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaktGd2lZbXgxWlZ3aUxDQmNJbmRvYVhSbFhDSXNJRndpY21Wa1hDSXBLVnh1WEc1SVpXRjBiV0Z3S0Z4dUlDQmtZWFJoWDIxaGRISnBlQ3hjYmlBZ2JtRnRaU0E5SUZ3aVZtRnNkV1ZjSWl4Y2JpQWdjMmh2ZDE5eWIzZGZibUZ0WlhNZ1BTQlVVbFZGTEZ4dUlDQnphRzkzWDJOdmJIVnRibDl1WVcxbGN5QTlJRlJTVlVVc1hHNGdJR05zZFhOMFpYSmZZMjlzZFcxdWN5QTlJRVpCVEZORkxGeHVJQ0JqYkhWemRHVnlYM0p2ZDNNZ1BTQkdRVXhUUlN4Y2JpQWdJR052YkNBOUlHTnZiRjltZFc1Y2JpbGNibHh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5yZXN1bHREaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdFxcKVxuXG5kYXRhIDwtIGZyZWFkKGhlcmUocmVzdWx0RGlyLCBcXGNocm9tSE1NXFwsIFxcQTQ4NV9wZS1wZV9hbmNob3JzXFwsIFxcb3ZlcmxhcF9lbnJpY2hfMTAwX3N0YXRlLnR4dFxcKSlcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxzdGF0ZVxcLCBcXGdlbm9tZVxcLCBcXHBlLXBlX0E0ODVfZG93blxcLCBcXHBlLXBlX0E0ODVfbm9cXCwgXFxwZS1wZV9BNDg1X3VwXFwpXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoLWdlbm9tZSlcblxuZGF0YV9tYXRyaXggPC0gZGF0YSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcc3RhdGVcXCkgJT4lXG4gIGFzLm1hdHJpeCgpXG5cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDEwKSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChcbiAgZGF0YV9tYXRyaXgsXG4gIG5hbWUgPSBcXFZhbHVlXFwsXG4gIHNob3dfcm93X25hbWVzID0gVFJVRSxcbiAgc2hvd19jb2x1bW5fbmFtZXMgPSBUUlVFLFxuICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsXG4gICBjb2wgPSBjb2xfZnVuXG4pXG5cbiMjIyMjIyNcbmRhdGEyIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCA0KSlcbmRhdGEyIDwtIGRhdGEyICU+JSBkcGx5cjo6ZmlsdGVyKGBwZS1wZV9BNDg1X2Rvd25gID4gYHBlLXBlX0E0ODVfdXBgKVxuZGF0YV9tYXRyaXggPC0gZGF0YTIgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHN0YXRlXFwpICU+JVxuICBhcy5tYXRyaXgoKVxuXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAxMCksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoXG4gIGRhdGFfbWF0cml4LFxuICBuYW1lID0gXFxWYWx1ZVxcLFxuICBzaG93X3Jvd19uYW1lcyA9IFRSVUUsXG4gIHNob3dfY29sdW1uX25hbWVzID0gVFJVRSxcbiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gIGNsdXN0ZXJfcm93cyA9IEZBTFNFLFxuICAgY29sID0gY29sX2Z1blxuKVxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
resultDir <- here(\../../result\)

data <- fread(here(resultDir, \chromHMM\, \A485_pe-pe_anchors\, \overlap_enrich_100_state.txt\))
colnames(data) <- c(\state\, \genome\, \pe-pe_A485_down\, \pe-pe_A485_no\, \pe-pe_A485_up\)
data <- data %>% dplyr::select(-genome)

data_matrix <- data %>%
  column_to_rownames(var = \state\) %>%
  as.matrix()

library(circlize)

col_fun <- colorRamp2(c(0, 1, 10), 
                      c(\blue\, \white\, \red\))

Heatmap(
  data_matrix,
  name = \Value\,
  show_row_names = TRUE,
  show_column_names = TRUE,
  cluster_columns = FALSE,
  cluster_rows = FALSE,
   col = col_fun
)

#######
data2 <- data %>% dplyr::select(c(1, 2, 4))
data2 <- data2 %>% dplyr::filter(`pe-pe_A485_down` > `pe-pe_A485_up`)
data_matrix <- data2 %>%
  column_to_rownames(var = \state\) %>%
  as.matrix()

library(circlize)

col_fun <- colorRamp2(c(0, 1, 10), 
                      c(\blue\, \white\, \red\))

Heatmap(
  data_matrix,
  name = \Value\,
  show_row_names = TRUE,
  show_column_names = TRUE,
  cluster_columns = FALSE,
  cluster_rows = FALSE,
   col = col_fun
)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNtVnpkV3gwUkdseUlEd3RJR2hsY21Vb1hGd3VMaTh1TGk5eVpYTjFiSFJjWENsY2JseHVaR0YwWVNBOExTQm1jbVZoWkNob1pYSmxLSEpsYzNWc2RFUnBjaXdnWEZ4amFISnZiVWhOVFZ4Y0xDQmNYRUUwT0RWZmNHVXRjR1ZmWVc1amFHOXljMXhjTENCY1hHOTJaWEpzWVhCZlpXNXlhV05vWHpFd01GOXpkR0YwWlM1MGVIUmNYQ2twWEc1amIyeHVZVzFsY3loa1lYUmhLU0E4TFNCaktGeGNjM1JoZEdWY1hDd2dYRnhuWlc1dmJXVmNYQ3dnWEZ4d1pTMXdaVjlCTkRnMVgyUnZkMjVjWEN3Z1hGeHdaUzF3WlY5Qk5EZzFYMjV2WEZ3c0lGeGNjR1V0Y0dWZlFUUTROVjkxY0Z4Y0tWeHVaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0MxblpXNXZiV1VwWEc1Y2JtUmhkR0ZmYldGMGNtbDRJRHd0SUdSaGRHRWdKVDRsWEc0Z0lHTnZiSFZ0Ymw5MGIxOXliM2R1WVcxbGN5aDJZWElnUFNCY1hITjBZWFJsWEZ3cElDVStKVnh1SUNCaGN5NXRZWFJ5YVhnb0tWeHVYRzVzYVdKeVlYSjVLR05wY21Oc2FYcGxLVnh1WEc1amIyeGZablZ1SUR3dElHTnZiRzl5VW1GdGNESW9ZeWd3TENBeExDQXhNQ2tzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR01vWEZ4aWJIVmxYRndzSUZ4Y2QyaHBkR1ZjWEN3Z1hGeHlaV1JjWENrcFhHNWNia2hsWVhSdFlYQW9YRzRnSUdSaGRHRmZiV0YwY21sNExGeHVJQ0J1WVcxbElEMGdYRnhXWVd4MVpWeGNMRnh1SUNCemFHOTNYM0p2ZDE5dVlXMWxjeUE5SUZSU1ZVVXNYRzRnSUhOb2IzZGZZMjlzZFcxdVgyNWhiV1Z6SUQwZ1ZGSlZSU3hjYmlBZ1kyeDFjM1JsY2w5amIyeDFiVzV6SUQwZ1JrRk1VMFVzWEc0Z0lHTnNkWE4wWlhKZmNtOTNjeUE5SUVaQlRGTkZMRnh1SUNBZ1kyOXNJRDBnWTI5c1gyWjFibHh1S1Z4dVhHNGpJeU1qSXlNalhHNWtZWFJoTWlBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dNb01Td2dNaXdnTkNrcFhHNWtZWFJoTWlBOExTQmtZWFJoTWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loZ2NHVXRjR1ZmUVRRNE5WOWtiM2R1WUNBK0lHQndaUzF3WlY5Qk5EZzFYM1Z3WUNsY2JtUmhkR0ZmYldGMGNtbDRJRHd0SUdSaGRHRXlJQ1UrSlZ4dUlDQmpiMngxYlc1ZmRHOWZjbTkzYm1GdFpYTW9kbUZ5SUQwZ1hGeHpkR0YwWlZ4Y0tTQWxQaVZjYmlBZ1lYTXViV0YwY21sNEtDbGNibHh1YkdsaWNtRnllU2hqYVhKamJHbDZaU2xjYmx4dVkyOXNYMloxYmlBOExTQmpiMnh2Y2xKaGJYQXlLR01vTUN3Z01Td2dNVEFwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqS0Z4Y1lteDFaVnhjTENCY1hIZG9hWFJsWEZ3c0lGeGNjbVZrWEZ3cEtWeHVYRzVJWldGMGJXRndLRnh1SUNCa1lYUmhYMjFoZEhKcGVDeGNiaUFnYm1GdFpTQTlJRnhjVm1Gc2RXVmNYQ3hjYmlBZ2MyaHZkMTl5YjNkZmJtRnRaWE1nUFNCVVVsVkZMRnh1SUNCemFHOTNYMk52YkhWdGJsOXVZVzFsY3lBOUlGUlNWVVVzWEc0Z0lHTnNkWE4wWlhKZlkyOXNkVzF1Y3lBOUlFWkJURk5GTEZ4dUlDQmpiSFZ6ZEdWeVgzSnZkM01nUFNCR1FVeFRSU3hjYmlBZ0lHTnZiQ0E5SUdOdmJGOW1kVzVjYmlsY2JseHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5yZXN1bHREaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdFxcKVxuXG5kYXRhIDwtIGZyZWFkKGhlcmUocmVzdWx0RGlyLCBcXGNocm9tSE1NXFwsIFxcQTQ4NV9wZS1wZV9hbmNob3JzXFwsIFxcb3ZlcmxhcF9lbnJpY2hfMTAwX3N0YXRlLnR4dFxcKSlcbmNvbG5hbWVzKGRhdGEpIDwtIGMoXFxzdGF0ZVxcLCBcXGdlbm9tZVxcLCBcXHBlLXBlX0E0ODVfZG93blxcLCBcXHBlLXBlX0E0ODVfbm9cXCwgXFxwZS1wZV9BNDg1X3VwXFwpXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoLWdlbm9tZSlcblxuZGF0YV9tYXRyaXggPC0gZGF0YSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcc3RhdGVcXCkgJT4lXG4gIGFzLm1hdHJpeCgpXG5cbmxpYnJhcnkoY2lyY2xpemUpXG5cbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDEwKSwgXG4gICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuSGVhdG1hcChcbiAgZGF0YV9tYXRyaXgsXG4gIG5hbWUgPSBcXFZhbHVlXFwsXG4gIHNob3dfcm93X25hbWVzID0gVFJVRSxcbiAgc2hvd19jb2x1bW5fbmFtZXMgPSBUUlVFLFxuICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsXG4gICBjb2wgPSBjb2xfZnVuXG4pXG5cbiMjIyMjIyNcbmRhdGEyIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCA0KSlcbmRhdGEyIDwtIGRhdGEyICU+JSBkcGx5cjo6ZmlsdGVyKGBwZS1wZV9BNDg1X2Rvd25gID4gYHBlLXBlX0E0ODVfdXBgKVxuZGF0YV9tYXRyaXggPC0gZGF0YTIgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHN0YXRlXFwpICU+JVxuICBhcy5tYXRyaXgoKVxuXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAxMCksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoXG4gIGRhdGFfbWF0cml4LFxuICBuYW1lID0gXFxWYWx1ZVxcLFxuICBzaG93X3Jvd19uYW1lcyA9IFRSVUUsXG4gIHNob3dfY29sdW1uX25hbWVzID0gVFJVRSxcbiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gIGNsdXN0ZXJfcm93cyA9IEZBTFNFLFxuICAgY29sID0gY29sX2Z1blxuKVxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucmVzdWx0RGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHRcXClcblxuZGF0YSA8LSBmcmVhZChoZXJlKHJlc3VsdERpciwgXFxjaHJvbUhNTVxcLCBcXEE0ODVfcGUtcGVfYW5jaG9yc1xcLCBcXG92ZXJsYXBfZW5yaWNoXzEwMF9zdGF0ZS50eHRcXCkpXG5jb2xuYW1lcyhkYXRhKSA8LSBjKFxcc3RhdGVcXCwgXFxnZW5vbWVcXCwgXFxwZS1wZV9BNDg1X2Rvd25cXCwgXFxwZS1wZV9BNDg1X25vXFwsIFxccGUtcGVfQTQ4NV91cFxcKVxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KC1nZW5vbWUpXG5cbmRhdGFfbWF0cml4IDwtIGRhdGEgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHN0YXRlXFwpICU+JVxuICBhcy5tYXRyaXgoKVxuXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAxMCksIFxuICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbkhlYXRtYXAoXG4gIGRhdGFfbWF0cml4LFxuICBuYW1lID0gXFxWYWx1ZVxcLFxuICBzaG93X3Jvd19uYW1lcyA9IFRSVUUsXG4gIHNob3dfY29sdW1uX25hbWVzID0gVFJVRSxcbiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gIGNsdXN0ZXJfcm93cyA9IEZBTFNFLFxuICAgY29sID0gY29sX2Z1blxuKVxuXG4jIyMjIyMjXG5kYXRhMiA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgNCkpXG5kYXRhMiA8LSBkYXRhMiAlPiUgZHBseXI6OmZpbHRlcihgcGUtcGVfQTQ4NV9kb3duYCA+IGBwZS1wZV9BNDg1X3VwYClcbmRhdGFfbWF0cml4IDwtIGRhdGEyICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFxzdGF0ZVxcKSAlPiVcbiAgYXMubWF0cml4KClcblxubGlicmFyeShjaXJjbGl6ZSlcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMTApLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5IZWF0bWFwKFxuICBkYXRhX21hdHJpeCxcbiAgbmFtZSA9IFxcVmFsdWVcXCxcbiAgc2hvd19yb3dfbmFtZXMgPSBUUlVFLFxuICBzaG93X2NvbHVtbl9uYW1lcyA9IFRSVUUsXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSxcbiAgIGNvbCA9IGNvbF9mdW5cbilcblxuXG5gYGBcbmBgYCJ9 -->

```r
```r
resultDir <- here(\../../result\)

data <- fread(here(resultDir, \chromHMM\, \A485_pe-pe_anchors\, \overlap_enrich_100_state.txt\))
colnames(data) <- c(\state\, \genome\, \pe-pe_A485_down\, \pe-pe_A485_no\, \pe-pe_A485_up\)
data <- data %>% dplyr::select(-genome)

data_matrix <- data %>%
  column_to_rownames(var = \state\) %>%
  as.matrix()

library(circlize)

col_fun <- colorRamp2(c(0, 1, 10), 
                      c(\blue\, \white\, \red\))

Heatmap(
  data_matrix,
  name = \Value\,
  show_row_names = TRUE,
  show_column_names = TRUE,
  cluster_columns = FALSE,
  cluster_rows = FALSE,
   col = col_fun
)

#######
data2 <- data %>% dplyr::select(c(1, 2, 4))
data2 <- data2 %>% dplyr::filter(`pe-pe_A485_down` > `pe-pe_A485_up`)
data_matrix <- data2 %>%
  column_to_rownames(var = \state\) %>%
  as.matrix()

library(circlize)

col_fun <- colorRamp2(c(0, 1, 10), 
                      c(\blue\, \white\, \red\))

Heatmap(
  data_matrix,
  name = \Value\,
  show_row_names = TRUE,
  show_column_names = TRUE,
  cluster_columns = FALSE,
  cluster_rows = FALSE,
   col = col_fun
)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Combining with loop

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeU1qSUVkbGRIUnBibWNnYkc5dmNDQkpSRnh1ZEdWdGNDQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbExtSmxaSEJsWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2h5WlhNZ1BTQldNeUF0SUZZeUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbGtJRDBnY0dGemRHVW9WakVzSUhKbGN5d2dWaklzSUZZMUxDQnpaWEFnUFNCY0lsOWNJaWtwWEc1eVpXZEpSQ0E4TFNCMFpXMXdKR2xrWEc1Y2JuUmxiWEFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5emRISjFZM1IxY21VdVltVmtjR1ZjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSEpsY3lBOUlGWXpJQzBnVmpJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXUWdQU0J3WVhOMFpTaFdNU3dnY21WekxDQldNaXdnVmpVc0lITmxjQ0E5SUZ3aVgxd2lLU2xjYm5OMGNrbEVJRHd0SUhSbGJYQWthV1JjYmx4dUl5TWpJeU1qSXlNakl5TWpJeU1nVWtWSFhHNGpJeUJHYVd4MFpYSnBibWNnYkc5dmNITWdkRzhnY0d4dmRGeHVaR0YwWVNBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTl6WTI5eVpTNTBjM1pjSWlrcFhHNTBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYVdRZ0pXbHVKU0J5WldkSlJDd2daRlJCUnlBK0lEQXVOU2tnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dSbGMyTW9aRlJCUnlrcFhHNTBaVzF3SUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvYzJWeEtERXNJRFlwS1Z4dVkyOXNibUZ0WlhNb2RHVnRjQ2tnUEMwZ1l5aGNJbFl4WENJc0lGd2lWakpjSWl3Z1hDSldNMXdpTENCY0lsWTBYQ0lzSUZ3aVZqVmNJaXdnWENKV05sd2lLVnh1Ykc5dmNITWdQQzBnYVcxd2IzSjBRbVZrY0dVb2RHVnRjQ2xjYmx4dUl5QldhWE4xWVd4cGVtRjBhVzl1WEc1b2FXTkVhWElnUEMwZ1hDSXZWbTlzZFcxbGN5OVZTMHBKVGw5VFUwUXZaR0YwWVY5MllYVnNkRjh5TURJMGMzVnRiV1Z5WDIxcFkzSnZReTlvYVdOY0lseHVkMmx1Wkc5M1UybDZaU0E4TFNBeEtqRmxObHh1WEc1cElEMGdNVnh1SXlCbWIzSW9hU0JwYmlCelpYRW9NU3dnTWpVcEtYdGNiaUFnSXlNZ1RHOWhaR2x1WnlCb2FXTWdZVzVrSUhCc2IzUjBhVzVuWEc0Z0lHTm9jaUE4TFNCaGMxOTBhV0ppYkdVb2JHOXZjSE5iYVYwcEpITmxjVzVoYldWek1WeHVJQ0JqWlc1MFpYSWdQQzBnS0dGelgzUnBZbUpzWlNoc2IyOXdjMXRwWFNra2MzUmhjblF4SUNzZ1lYTmZkR2xpWW14bEtHeHZiM0J6VzJsZEtTUmxibVF5S1M4eVhHNGdJSE4wWVhKMElEd3RJR1pzYjI5eUtHTmxiblJsY2lBdElEQXVOU3AzYVc1a2IzZFRhWHBsS1Z4dUlDQmxibVFnUEMwZ1pteHZiM0lvWTJWdWRHVnlJQ3NnTUM0MUtuZHBibVJ2ZDFOcGVtVXBYRzRnSUZ4dUlDQmpaaTVITVVSTlUwOGdQQzBnU0dsalJtbHNaU2h3WVhSb0lEMGdhR1Z5WlNob2FXTkVhWElzSUZ3aVJ6RXVSRTFUVHk1TlpYSm5aV1F1YUdsalhDSXBLVnh1SUNCalppNUhNV1JVUVVjZ1BDMGdTR2xqUm1sc1pTaHdZWFJvSUQwZ2FHVnlaU2hvYVdORWFYSXNJRndpUnpFdVpGUkJSeTVOWlhKblpXUXVhR2xqWENJcEtWeHVJQ0FqWTJZdVJ6RmtWRUZISUR3dElFaHBZMFpwYkdVb2NHRjBhQ0E5SUdobGNtVW9hR2xqUkdseUxDQmNJa2N4TGtFME9EVXVUV1Z5WjJWa0xtaHBZMXdpS1NsY2JseHVJQ0J5WlhNZ1BDMGdNVEFxTVRBd01GeHVJQ0I2YldGNElEd3RJREl1TlZ4dUlDQm9hV014SUR3dElHbHRjRzl5ZENoalppNUhNVVJOVTA4c0lHWnZZM1Z6SUQwZ2NHRnpkR1V3S0dOb2Npd2dYQ0k2WENJc0lITjBZWEowTENCY0lpMWNJaXdnWlc1a0tTd2djbVZ6YjJ4MWRHbHZiaUE5SUhKbGN5bGNiaUFnYUdsak1pQThMU0JwYlhCdmNuUW9ZMll1UnpGa1ZFRkhMQ0JtYjJOMWN5QTlJSEJoYzNSbE1DaGphSElzSUZ3aU9sd2lMQ0J6ZEdGeWRDd2dYQ0l0WENJc0lHVnVaQ2tzSUhKbGMyOXNkWFJwYjI0Z1BTQnlaWE1wWEc0Z0lIQXhJRHd0SUhCc2IzUk5ZWFJ5YVhnb2FHbGpNU3dnWkhCcElEMGdNVEF3TUN3Z2JHbHRhWFJ6SUQwZ1l5Z3dMQ0I2YldGNEtTd2diRzl2Y0NBOUlHeHZiM0J6S1Z4dUlDQndNaUE4TFNCd2JHOTBUV0YwY21sNEtHaHBZeklzSUdSd2FTQTlJREV3TURBc0lHeHBiV2wwY3lBOUlHTW9NQ3dnZW0xaGVDa3NJR3h2YjNBZ1BTQnNiMjl3Y3lsY2JpQWdYRzRnSUdacGJHVk9ZVzFsSUR3dElHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9YQ0oyYVhOMWVteHBZWFJwYjI1ZmNtVm5URzl2Y0Y5a1ZFRkhYMXdpTENCcExDQmNJbDh4TUd0aVgyWnBaM1Z5WlZabGNsd2lLU2xjYmlBZ1hHNGdJSGRwWkhSb0lEd3RJSEJoYm1Wc1UybDZaU2d5TUNrcWJXMVViMGx1WTJoY2JpQWdhR1ZwWjJoMElEd3RJSEJoYm1Wc1UybDZaU2d4TUNrcWJXMVViMGx1WTJoY2JpQWdYRzRnSUhCdVp5aHdZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMGN5QTlJRndpYVc1Y0lpd2dkMmxrZEdnZ1BTQjNhV1IwYUN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwS1Z4dUlDQndjbWx1ZENoamIzZHdiRzkwT2pwd2JHOTBYMmR5YVdRb2NERXNJSEF5TENCaGJHbG5iaUE5SUZ3aWFGd2lLU2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJSE4yWjJ4cGRHVW9jR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3NJSGRwWkhSb0lEMGdkMmxrZEdnc0lHaGxhV2RvZENBOUlHaGxhV2RvZENsY2JpQWdjSEpwYm5Rb1kyOTNjR3h2ZERvNmNHeHZkRjluY21sa0tIQXhMQ0J3TWl3Z1lXeHBaMjRnUFNCY0ltaGNJaWtwWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0JjYmlBZ2NtVnpJRHd0SURJMUtqRXdNREJjYmlBZ2VtMWhlQ0E4TFNBelhHNGdJSE4wWVhKMElEd3RJR1pzYjI5eUtHTmxiblJsY2lBdElIZHBibVJ2ZDFOcGVtVXBYRzRnSUdWdVpDQThMU0JtYkc5dmNpaGpaVzUwWlhJZ0t5QjNhVzVrYjNkVGFYcGxLVnh1SUNCb2FXTXhJRHd0SUdsdGNHOXlkQ2hqWmk1SE1VUk5VMDhzSUdadlkzVnpJRDBnY0dGemRHVXdLR05vY2l3Z1hDSTZYQ0lzSUhOMFlYSjBMQ0JjSWkxY0lpd2daVzVrS1N3Z2NtVnpiMngxZEdsdmJpQTlJSEpsY3lsY2JpQWdhR2xqTWlBOExTQnBiWEJ2Y25Rb1kyWXVSekZrVkVGSExDQm1iMk4xY3lBOUlIQmhjM1JsTUNoamFISXNJRndpT2x3aUxDQnpkR0Z5ZEN3Z1hDSXRYQ0lzSUdWdVpDa3NJSEpsYzI5c2RYUnBiMjRnUFNCeVpYTXBYRzRnSUhBeElEd3RJSEJzYjNSTllYUnlhWGdvYUdsak1Td2daSEJwSUQwZ01UQXdNQ3dnYkdsdGFYUnpJRDBnWXlnd0xDQjZiV0Y0S1N3Z2JHOXZjQ0E5SUd4dmIzQnpLVnh1SUNCd01pQThMU0J3Ykc5MFRXRjBjbWw0S0docFl6SXNJR1J3YVNBOUlERXdNREFzSUd4cGJXbDBjeUE5SUdNb01Dd2dlbTFoZUNrc0lHeHZiM0FnUFNCc2IyOXdjeWxjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUdobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1hDSjJhWE4xZW14cFlYUnBiMjVmY21WblRHOXZjRjlrVkVGSFgxd2lMQ0JwTENCY0lsOHlOV3RpWENJcEtWeHVJQ0J3Ym1jb2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrc0lISmxjeUE5SURZd01Dd2dkVzVwZEhNZ1BTQmNJbWx1WENJc0lIZHBaSFJvSUQwZ01UQXNJR2hsYVdkb2RDQTlJRFVwWEc0Z0lIQnlhVzUwS0dOdmQzQnNiM1E2T25Cc2IzUmZaM0pwWkNod01Td2djRElzSUdGc2FXZHVJRDBnWENKb1hDSXBLVnh1SUNCa1pYWXViMlptS0NsY2JpQWdJeUJ6ZG1kc2FYUmxLSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1YzNablhDSXBMQ0IzYVdSMGFDQTlJREV3TENCb1pXbG5hSFFnUFNBMUtWeHVJQ0FqSUhCeWFXNTBLR052ZDNCc2IzUTZPbkJzYjNSZlozSnBaQ2h3TVN3Z2NESXNJR0ZzYVdkdUlEMGdYQ0pvWENJcEtWeHVJQ0FqSUdSbGRpNXZabVlvS1Z4dUl5QjlYRzVjYmlNakl5TWpJeU1qSXlNakl5TWpJRk4wY2x4dUl5TWdSbWxzZEdWeWFXNW5JR3h2YjNCeklIUnZJSEJzYjNSY2JtUmhkR0VnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZjMk52Y21VdWRITjJYQ0lwS1Z4dWRHVnRjQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2xrSUNWcGJpVWdjM1J5U1VRc0lHUlVRVWNnUGlBd0xqVXBJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlhOaktHUlVRVWNwS1Z4dWRHVnRjQ0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSE5sY1NneExDQTJLU2xjYm1OdmJHNWhiV1Z6S0hSbGJYQXBJRHd0SUdNb1hDSldNVndpTENCY0lsWXlYQ0lzSUZ3aVZqTmNJaXdnWENKV05Gd2lMQ0JjSWxZMVhDSXNJRndpVmpaY0lpbGNibXh2YjNCeklEd3RJR2x0Y0c5eWRFSmxaSEJsS0hSbGJYQXBYRzVjYmlNZ1ZtbHpkV0ZzYVhwaGRHbHZibHh1YUdsalJHbHlJRHd0SUZ3aUwxWnZiSFZ0WlhNdlZVdEtTVTVmVTFORUwwZGxibTl0YVdOelh6QXpYMEZ1WVd4NWMybHpYMWR2Y210cGJtY3ZaR0YwWVY5MllYVnNkRjh5TURJMGMzVnRiV1Z5WDIxcFkzSnZReTlvYVdOY0lseHVkMmx1Wkc5M1UybDZaU0E4TFNBeUtqRmxObHh1WEc1bWIzSW9hU0JwYmlCelpYRW9NU3dnTWpVcEtYdGNiaUFnSXlNZ1RHOWhaR2x1WnlCb2FXTWdZVzVrSUhCc2IzUjBhVzVuWEc0Z0lHTm9jaUE4TFNCaGMxOTBhV0ppYkdVb2JHOXZjSE5iYVYwcEpITmxjVzVoYldWek1WeHVJQ0JqWlc1MFpYSWdQQzBnS0dGelgzUnBZbUpzWlNoc2IyOXdjMXRwWFNra2MzUmhjblF4SUNzZ1lYTmZkR2xpWW14bEtHeHZiM0J6VzJsZEtTUmxibVF5S1M4eVhHNGdJSE4wWVhKMElEd3RJR1pzYjI5eUtHTmxiblJsY2lBdElEQXVOU3AzYVc1a2IzZFRhWHBsS1Z4dUlDQmxibVFnUEMwZ1pteHZiM0lvWTJWdWRHVnlJQ3NnTUM0MUtuZHBibVJ2ZDFOcGVtVXBYRzRnSUZ4dUlDQmpaaTVITVVSTlUwOGdQQzBnU0dsalJtbHNaU2h3WVhSb0lEMGdhR1Z5WlNob2FXTkVhWElzSUZ3aVJ6RXVSRTFUVHk1TlpYSm5aV1F1YUdsalhDSXBLVnh1SUNCalppNUhNV1JVUVVjZ1BDMGdTR2xqUm1sc1pTaHdZWFJvSUQwZ2FHVnlaU2hvYVdORWFYSXNJRndpUnpFdVpGUkJSeTVOWlhKblpXUXVhR2xqWENJcEtWeHVYRzRnSUhKbGN5QThMU0F4TUNveE1EQXdYRzRnSUhwdFlYZ2dQQzBnTWk0MVhHNGdJR2hwWXpFZ1BDMGdhVzF3YjNKMEtHTm1Ma2N4UkUxVFR5d2dabTlqZFhNZ1BTQndZWE4wWlRBb1kyaHlMQ0JjSWpwY0lpd2djM1JoY25Rc0lGd2lMVndpTENCbGJtUXBMQ0J5WlhOdmJIVjBhVzl1SUQwZ2NtVnpLVnh1SUNCb2FXTXlJRHd0SUdsdGNHOXlkQ2hqWmk1SE1XUlVRVWNzSUdadlkzVnpJRDBnY0dGemRHVXdLR05vY2l3Z1hDSTZYQ0lzSUhOMFlYSjBMQ0JjSWkxY0lpd2daVzVrS1N3Z2NtVnpiMngxZEdsdmJpQTlJSEpsY3lsY2JpQWdjREVnUEMwZ2NHeHZkRTFoZEhKcGVDaG9hV014TENCa2NHa2dQU0F4TURBd0xDQnNhVzFwZEhNZ1BTQmpLREFzSUhwdFlYZ3BMQ0JzYjI5d0lEMGdiRzl2Y0hNcFhHNGdJSEF5SUR3dElIQnNiM1JOWVhSeWFYZ29hR2xqTWl3Z1pIQnBJRDBnTVRBd01Dd2diR2x0YVhSeklEMGdZeWd3TENCNmJXRjRLU3dnYkc5dmNDQTlJR3h2YjNCektWeHVJQ0JjYmlBZ1ptbHNaVTVoYldVZ1BDMGdhR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2hjSW5acGMzVjZiR2xoZEdsdmJsOXpkSEpNYjI5d1gyUlVRVWRmWENJc0lHa3NJRndpWHpFd2EySmNJaWtwWEc0Z0lIQnVaeWh3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU3dnY21WeklEMGdOakF3TENCMWJtbDBjeUE5SUZ3aWFXNWNJaXdnZDJsa2RHZ2dQU0F4TUN3Z2FHVnBaMmgwSUQwZ05TbGNiaUFnY0hKcGJuUW9ZMjkzY0d4dmREbzZjR3h2ZEY5bmNtbGtLSEF4TENCd01pd2dZV3hwWjI0Z1BTQmNJbWhjSWlrcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCY2JpQWdYRzRnSUhKbGN5QThMU0F5TlNveE1EQXdYRzRnSUhwdFlYZ2dQQzBnTTF4dUlDQnpkR0Z5ZENBOExTQm1iRzl2Y2loalpXNTBaWElnTFNCM2FXNWtiM2RUYVhwbEtWeHVJQ0JsYm1RZ1BDMGdabXh2YjNJb1kyVnVkR1Z5SUNzZ2QybHVaRzkzVTJsNlpTbGNiaUFnYUdsak1TQThMU0JwYlhCdmNuUW9ZMll1UnpGRVRWTlBMQ0JtYjJOMWN5QTlJSEJoYzNSbE1DaGphSElzSUZ3aU9sd2lMQ0J6ZEdGeWRDd2dYQ0l0WENJc0lHVnVaQ2tzSUhKbGMyOXNkWFJwYjI0Z1BTQnlaWE1wWEc0Z0lHaHBZeklnUEMwZ2FXMXdiM0owS0dObUxrY3haRlJCUnl3Z1ptOWpkWE1nUFNCd1lYTjBaVEFvWTJoeUxDQmNJanBjSWl3Z2MzUmhjblFzSUZ3aUxWd2lMQ0JsYm1RcExDQnlaWE52YkhWMGFXOXVJRDBnY21WektWeHVJQ0J3TVNBOExTQndiRzkwVFdGMGNtbDRLR2hwWXpFc0lHUndhU0E5SURFd01EQXNJR3hwYldsMGN5QTlJR01vTUN3Z2VtMWhlQ2tzSUd4dmIzQWdQU0JzYjI5d2N5bGNiaUFnY0RJZ1BDMGdjR3h2ZEUxaGRISnBlQ2hvYVdNeUxDQmtjR2tnUFNBeE1EQXdMQ0JzYVcxcGRITWdQU0JqS0RBc0lIcHRZWGdwTENCc2IyOXdJRDBnYkc5dmNITXBYRzRnSUZ4dUlDQm1hV3hsVG1GdFpTQThMU0JvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0Z3aWRtbHpkWHBzYVdGMGFXOXVYM04wY2t4dmIzQmZaRlJCUjE5Y0lpd2dhU3dnWENKZk1qVnJZbHdpS1NsY2JpQWdjRzVuS0hCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwTENCeVpYTWdQU0EyTURBc0lIVnVhWFJ6SUQwZ1hDSnBibHdpTENCM2FXUjBhQ0E5SURFd0xDQm9aV2xuYUhRZ1BTQTFLVnh1SUNCd2NtbHVkQ2hqYjNkd2JHOTBPanB3Ykc5MFgyZHlhV1FvY0RFc0lIQXlMQ0JoYkdsbmJpQTlJRndpYUZ3aUtTbGNiaUFnWkdWMkxtOW1aaWdwWEc1OVhHNWNiaU1qSXlNakl5TWpJeU1qSXlNaklHUlVRVWNnWTJGc2JHVmtJR3h2YjNCelhHNGpJeUJHYVd4MFpYSnBibWNnYkc5dmNITWdkRzhnY0d4dmRGeHVaR0YwWVRFZ1BDMGdabkpsWVdRb2FHVnlaU2hzYjI5d1JHbHlMQ0JjSWtjeExtUlVRVWN1VFdWeVoyVmtYMk5vY205dGIzTnBaMmgwWHpJMWEySXVkSE4yWENJcEtWeHVaR0YwWVRJZ1BDMGdabkpsWVdRb2FHVnlaU2hzYjI5d1JHbHlMQ0JjSWtjeExtUlVRVWN1VFdWeVoyVmtYMk5vY205dGIzTnBaMmgwWHpFd2EySXVkSE4yWENJcEtWeHVaR0YwWVRNZ1BDMGdabkpsWVdRb2FHVnlaU2hzYjI5d1JHbHlMQ0JjSWtjeExtUlVRVWN1VFdWeVoyVmtYMk5vY205dGIzTnBaMmgwWHpWcllpNTBjM1pjSWlrcFhHNWtZWFJoSUR3dElHSnBibVJmY205M2N5aGtZWFJoTVN3Z1pHRjBZVElzSUdSaGRHRXpLVnh1WEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JsYzJNb2MyTnZjbVVwS1Z4dVhHNTBaVzF3SUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvYzJWeEtERXNJRFlwS1Z4dVkyOXNibUZ0WlhNb2RHVnRjQ2tnUEMwZ1l5aGNJbFl4WENJc0lGd2lWakpjSWl3Z1hDSldNMXdpTENCY0lsWTBYQ0lzSUZ3aVZqVmNJaXdnWENKV05sd2lLVnh1Ykc5dmNITWdQQzBnYVcxd2IzSjBRbVZrY0dVb2RHVnRjQ2xjYmx4dUl5QldhWE4xWVd4cGVtRjBhVzl1WEc1b2FXTkVhWElnUEMwZ1hDSXZWbTlzZFcxbGN5OVZTMHBKVGw5VFUwUXZSMlZ1YjIxcFkzTmZNRE5mUVc1aGJIbHphWE5mVjI5eWEybHVaeTlrWVhSaFgzWmhkV3gwWHpJd01qUnpkVzF0WlhKZmJXbGpjbTlETDJocFkxd2lYRzUzYVc1a2IzZFRhWHBsSUR3dElESXFNV1UyWEc1Y2JtWnZjaWhwSUdsdUlITmxjU2d4TENBeU5Ta3BlMXh1SUNBakl5Qk1iMkZrYVc1bklHaHBZeUJoYm1RZ2NHeHZkSFJwYm1kY2JpQWdZMmh5SUR3dElHRnpYM1JwWW1Kc1pTaHNiMjl3YzF0cFhTa2tjMlZ4Ym1GdFpYTXhYRzRnSUdObGJuUmxjaUE4TFNBb1lYTmZkR2xpWW14bEtHeHZiM0J6VzJsZEtTUnpkR0Z5ZERFZ0t5QmhjMTkwYVdKaWJHVW9iRzl2Y0hOYmFWMHBKR1Z1WkRJcEx6SmNiaUFnYzNSaGNuUWdQQzBnWm14dmIzSW9ZMlZ1ZEdWeUlDMGdNQzQxS25kcGJtUnZkMU5wZW1VcFhHNGdJR1Z1WkNBOExTQm1iRzl2Y2loalpXNTBaWElnS3lBd0xqVXFkMmx1Wkc5M1UybDZaU2xjYmlBZ1hHNGdJR05tTGtjeFJFMVRUeUE4TFNCSWFXTkdhV3hsS0hCaGRHZ2dQU0JvWlhKbEtHaHBZMFJwY2l3Z1hDSkhNUzVFVFZOUExrMWxjbWRsWkM1b2FXTmNJaWtwWEc0Z0lHTm1Ma2N4WkZSQlJ5QThMU0JJYVdOR2FXeGxLSEJoZEdnZ1BTQm9aWEpsS0docFkwUnBjaXdnWENKSE1TNWtWRUZITGsxbGNtZGxaQzVvYVdOY0lpa3BYRzVjYmlBZ2NtVnpJRHd0SURFd0tqRXdNREJjYmlBZ2VtMWhlQ0E4TFNBeUxqVmNiaUFnYUdsak1TQThMU0JwYlhCdmNuUW9ZMll1UnpGRVRWTlBMQ0JtYjJOMWN5QTlJSEJoYzNSbE1DaGphSElzSUZ3aU9sd2lMQ0J6ZEdGeWRDd2dYQ0l0WENJc0lHVnVaQ2tzSUhKbGMyOXNkWFJwYjI0Z1BTQnlaWE1wWEc0Z0lHaHBZeklnUEMwZ2FXMXdiM0owS0dObUxrY3haRlJCUnl3Z1ptOWpkWE1nUFNCd1lYTjBaVEFvWTJoeUxDQmNJanBjSWl3Z2MzUmhjblFzSUZ3aUxWd2lMQ0JsYm1RcExDQnlaWE52YkhWMGFXOXVJRDBnY21WektWeHVJQ0J3TVNBOExTQndiRzkwVFdGMGNtbDRLR2hwWXpFc0lHUndhU0E5SURFd01EQXNJR3hwYldsMGN5QTlJR01vTUN3Z2VtMWhlQ2tzSUd4dmIzQWdQU0JzYjI5d2N5bGNiaUFnY0RJZ1BDMGdjR3h2ZEUxaGRISnBlQ2hvYVdNeUxDQmtjR2tnUFNBeE1EQXdMQ0JzYVcxcGRITWdQU0JqS0RBc0lIcHRZWGdwTENCc2IyOXdJRDBnYkc5dmNITXBYRzRnSUZ4dUlDQm1hV3hsVG1GdFpTQThMU0JvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0Z3aWRtbHpkWHBzYVdGMGFXOXVYMlJVUVVkallXeHNaV1JNYjI5d1gyUlVRVWRmWENJc0lHa3NJRndpWHpFd2EySmNJaWtwWEc0Z0lIQnVaeWh3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU3dnY21WeklEMGdOakF3TENCMWJtbDBjeUE5SUZ3aWFXNWNJaXdnZDJsa2RHZ2dQU0F4TUN3Z2FHVnBaMmgwSUQwZ05TbGNiaUFnY0hKcGJuUW9ZMjkzY0d4dmREbzZjR3h2ZEY5bmNtbGtLSEF4TENCd01pd2dZV3hwWjI0Z1BTQmNJbWhjSWlrcFhHNGdJR1JsZGk1dlptWW9LVnh1SUNCY2JpQWdYRzRnSUhKbGN5QThMU0F5TlNveE1EQXdYRzRnSUhwdFlYZ2dQQzBnTTF4dUlDQnpkR0Z5ZENBOExTQm1iRzl2Y2loalpXNTBaWElnTFNCM2FXNWtiM2RUYVhwbEtWeHVJQ0JsYm1RZ1BDMGdabXh2YjNJb1kyVnVkR1Z5SUNzZ2QybHVaRzkzVTJsNlpTbGNiaUFnYUdsak1TQThMU0JwYlhCdmNuUW9ZMll1UnpGRVRWTlBMQ0JtYjJOMWN5QTlJSEJoYzNSbE1DaGphSElzSUZ3aU9sd2lMQ0J6ZEdGeWRDd2dYQ0l0WENJc0lHVnVaQ2tzSUhKbGMyOXNkWFJwYjI0Z1BTQnlaWE1wWEc0Z0lHaHBZeklnUEMwZ2FXMXdiM0owS0dObUxrY3haRlJCUnl3Z1ptOWpkWE1nUFNCd1lYTjBaVEFvWTJoeUxDQmNJanBjSWl3Z2MzUmhjblFzSUZ3aUxWd2lMQ0JsYm1RcExDQnlaWE52YkhWMGFXOXVJRDBnY21WektWeHVJQ0J3TVNBOExTQndiRzkwVFdGMGNtbDRLR2hwWXpFc0lHUndhU0E5SURFd01EQXNJR3hwYldsMGN5QTlJR01vTUN3Z2VtMWhlQ2tzSUd4dmIzQWdQU0JzYjI5d2N5bGNiaUFnY0RJZ1BDMGdjR3h2ZEUxaGRISnBlQ2hvYVdNeUxDQmtjR2tnUFNBeE1EQXdMQ0JzYVcxcGRITWdQU0JqS0RBc0lIcHRZWGdwTENCc2IyOXdJRDBnYkc5dmNITXBYRzRnSUZ4dUlDQm1hV3hsVG1GdFpTQThMU0JvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0Z3aWRtbHpkWHBzYVdGMGFXOXVYMlJVUVVkallXeHNaV1JNYjI5d1gyUlVRVWRmWENJc0lHa3NJRndpWHpJMWEySmNJaWtwWEc0Z0lIQnVaeWh3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5CdVoxd2lLU3dnY21WeklEMGdOakF3TENCMWJtbDBjeUE5SUZ3aWFXNWNJaXdnZDJsa2RHZ2dQU0F4TUN3Z2FHVnBaMmgwSUQwZ05TbGNiaUFnY0hKcGJuUW9ZMjkzY0d4dmREbzZjR3h2ZEY5bmNtbGtLSEF4TENCd01pd2dZV3hwWjI0Z1BTQmNJbWhjSWlrcFhHNGdJR1JsZGk1dlptWW9LVnh1ZlZ4dVhHNWphSElnUFNCY0ltTm9jakV6WENKY2JuTjBZWEowSUQwZ09UWTVNREF3TURCY2JtVnVaQ0E5SURrNE1UQXdNREF3WEc0Z0lISmxjeUE4TFNBeE1Db3hNREF3WEc0Z0lIcHRZWGdnUEMwZ01pNDFYRzRnSUdocFl6RWdQQzBnYVcxd2IzSjBLR05tTGtjeFJFMVRUeXdnWm05amRYTWdQU0J3WVhOMFpUQW9ZMmh5TENCY0lqcGNJaXdnYzNSaGNuUXNJRndpTFZ3aUxDQmxibVFwTENCeVpYTnZiSFYwYVc5dUlEMGdjbVZ6S1Z4dUlDQm9hV015SUR3dElHbHRjRzl5ZENoalppNUhNV1JVUVVjc0lHWnZZM1Z6SUQwZ2NHRnpkR1V3S0dOb2Npd2dYQ0k2WENJc0lITjBZWEowTENCY0lpMWNJaXdnWlc1a0tTd2djbVZ6YjJ4MWRHbHZiaUE5SUhKbGN5bGNiaUFnY0RFZ1BDMGdjR3h2ZEUxaGRISnBlQ2hvYVdNeExDQmtjR2tnUFNBeE1EQXdMQ0JzYVcxcGRITWdQU0JqS0RBc0lIcHRZWGdwS1Z4dUlDQndNaUE4TFNCd2JHOTBUV0YwY21sNEtHaHBZeklzSUdSd2FTQTlJREV3TURBc0lHeHBiV2wwY3lBOUlHTW9NQ3dnZW0xaGVDa3BYRzRnSUNBZ2NISnBiblFvWTI5M2NHeHZkRG82Y0d4dmRGOW5jbWxrS0hBeExDQndNaXdnWVd4cFoyNGdQU0JjSW1oY0lpa3BYRzVjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiMjIyBHZXR0aW5nIGxvb3AgSURcbnRlbXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZS5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUocmVzID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCByZXMsIFYyLCBWNSwgc2VwID0gXFxfXFwpKVxucmVnSUQgPC0gdGVtcCRpZFxuXG50ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShyZXMgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIHJlcywgVjIsIFY1LCBzZXAgPSBcXF9cXCkpXG5zdHJJRCA8LSB0ZW1wJGlkXG5cbiMjIyMjIyMjIyMjIyMjIFJFR1xuIyMgRmlsdGVyaW5nIGxvb3BzIHRvIHBsb3RcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgcmVnSUQsIGRUQUcgPiAwLjUpICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGRUQUcpKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6c2VsZWN0KHNlcSgxLCA2KSlcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxWMVxcLCBcXFYyXFwsIFxcVjNcXCwgXFxWNFxcLCBcXFY1XFwsIFxcVjZcXClcbmxvb3BzIDwtIGltcG9ydEJlZHBlKHRlbXApXG5cbiMgVmlzdWFsaXphdGlvblxuaGljRGlyIDwtIFxcL1ZvbHVtZXMvVUtKSU5fU1NEL2RhdGFfdmF1bHRfMjAyNHN1bW1lcl9taWNyb0MvaGljXFxcbndpbmRvd1NpemUgPC0gMSoxZTZcblxuaSA9IDFcbiMgZm9yKGkgaW4gc2VxKDEsIDI1KSl7XG4gICMjIExvYWRpbmcgaGljIGFuZCBwbG90dGluZ1xuICBjaHIgPC0gYXNfdGliYmxlKGxvb3BzW2ldKSRzZXFuYW1lczFcbiAgY2VudGVyIDwtIChhc190aWJibGUobG9vcHNbaV0pJHN0YXJ0MSArIGFzX3RpYmJsZShsb29wc1tpXSkkZW5kMikvMlxuICBzdGFydCA8LSBmbG9vcihjZW50ZXIgLSAwLjUqd2luZG93U2l6ZSlcbiAgZW5kIDwtIGZsb29yKGNlbnRlciArIDAuNSp3aW5kb3dTaXplKVxuICBcbiAgY2YuRzFETVNPIDwtIEhpY0ZpbGUocGF0aCA9IGhlcmUoaGljRGlyLCBcXEcxLkRNU08uTWVyZ2VkLmhpY1xcKSlcbiAgY2YuRzFkVEFHIDwtIEhpY0ZpbGUocGF0aCA9IGhlcmUoaGljRGlyLCBcXEcxLmRUQUcuTWVyZ2VkLmhpY1xcKSlcbiAgI2NmLkcxZFRBRyA8LSBIaWNGaWxlKHBhdGggPSBoZXJlKGhpY0RpciwgXFxHMS5BNDg1Lk1lcmdlZC5oaWNcXCkpXG5cbiAgcmVzIDwtIDEwKjEwMDBcbiAgem1heCA8LSAyLjVcbiAgaGljMSA8LSBpbXBvcnQoY2YuRzFETVNPLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIGhpYzIgPC0gaW1wb3J0KGNmLkcxZFRBRywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBwMSA8LSBwbG90TWF0cml4KGhpYzEsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcylcbiAgcDIgPC0gcGxvdE1hdHJpeChoaWMyLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpXG4gIFxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxcdmlzdXpsaWF0aW9uX3JlZ0xvb3BfZFRBR19cXCwgaSwgXFxfMTBrYl9maWd1cmVWZXJcXCkpXG4gIFxuICB3aWR0aCA8LSBwYW5lbFNpemUoMjApKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMTApKm1tVG9JbmNoXG4gIFxuICBwbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodClcbiAgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpXG4gIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gXFxoXFwpKVxuICBkZXYub2ZmKClcbiAgXG4gIHJlcyA8LSAyNSoxMDAwXG4gIHptYXggPC0gM1xuICBzdGFydCA8LSBmbG9vcihjZW50ZXIgLSB3aW5kb3dTaXplKVxuICBlbmQgPC0gZmxvb3IoY2VudGVyICsgd2luZG93U2l6ZSlcbiAgaGljMSA8LSBpbXBvcnQoY2YuRzFETVNPLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIGhpYzIgPC0gaW1wb3J0KGNmLkcxZFRBRywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBwMSA8LSBwbG90TWF0cml4KGhpYzEsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcylcbiAgcDIgPC0gcGxvdE1hdHJpeChoaWMyLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpXG4gIFxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxcdmlzdXpsaWF0aW9uX3JlZ0xvb3BfZFRBR19cXCwgaSwgXFxfMjVrYlxcKSlcbiAgcG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KVxuICBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgZGV2Lm9mZigpXG4gICMgc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSlcbiAgIyBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgIyBkZXYub2ZmKClcbiMgfVxuXG4jIyMjIyMjIyMjIyMjIyBTdHJcbiMjIEZpbHRlcmluZyBsb29wcyB0byBwbG90XG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX3Njb3JlLnRzdlxcKSlcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIHN0cklELCBkVEFHID4gMC41KSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhkVEFHKSlcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OnNlbGVjdChzZXEoMSwgNikpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcVjFcXCwgXFxWMlxcLCBcXFYzXFwsIFxcVjRcXCwgXFxWNVxcLCBcXFY2XFwpXG5sb29wcyA8LSBpbXBvcnRCZWRwZSh0ZW1wKVxuXG4jIFZpc3VhbGl6YXRpb25cbmhpY0RpciA8LSBcXC9Wb2x1bWVzL1VLSklOX1NTRC9HZW5vbWljc18wM19BbmFseXNpc19Xb3JraW5nL2RhdGFfdmF1bHRfMjAyNHN1bW1lcl9taWNyb0MvaGljXFxcbndpbmRvd1NpemUgPC0gMioxZTZcblxuZm9yKGkgaW4gc2VxKDEsIDI1KSl7XG4gICMjIExvYWRpbmcgaGljIGFuZCBwbG90dGluZ1xuICBjaHIgPC0gYXNfdGliYmxlKGxvb3BzW2ldKSRzZXFuYW1lczFcbiAgY2VudGVyIDwtIChhc190aWJibGUobG9vcHNbaV0pJHN0YXJ0MSArIGFzX3RpYmJsZShsb29wc1tpXSkkZW5kMikvMlxuICBzdGFydCA8LSBmbG9vcihjZW50ZXIgLSAwLjUqd2luZG93U2l6ZSlcbiAgZW5kIDwtIGZsb29yKGNlbnRlciArIDAuNSp3aW5kb3dTaXplKVxuICBcbiAgY2YuRzFETVNPIDwtIEhpY0ZpbGUocGF0aCA9IGhlcmUoaGljRGlyLCBcXEcxLkRNU08uTWVyZ2VkLmhpY1xcKSlcbiAgY2YuRzFkVEFHIDwtIEhpY0ZpbGUocGF0aCA9IGhlcmUoaGljRGlyLCBcXEcxLmRUQUcuTWVyZ2VkLmhpY1xcKSlcblxuICByZXMgPC0gMTAqMTAwMFxuICB6bWF4IDwtIDIuNVxuICBoaWMxIDwtIGltcG9ydChjZi5HMURNU08sIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgaGljMiA8LSBpbXBvcnQoY2YuRzFkVEFHLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIHAxIDwtIHBsb3RNYXRyaXgoaGljMSwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKVxuICBwMiA8LSBwbG90TWF0cml4KGhpYzIsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcylcbiAgXG4gIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFx2aXN1emxpYXRpb25fc3RyTG9vcF9kVEFHX1xcLCBpLCBcXF8xMGtiXFwpKVxuICBwbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUpXG4gIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gXFxoXFwpKVxuICBkZXYub2ZmKClcbiAgXG4gIFxuICByZXMgPC0gMjUqMTAwMFxuICB6bWF4IDwtIDNcbiAgc3RhcnQgPC0gZmxvb3IoY2VudGVyIC0gd2luZG93U2l6ZSlcbiAgZW5kIDwtIGZsb29yKGNlbnRlciArIHdpbmRvd1NpemUpXG4gIGhpYzEgPC0gaW1wb3J0KGNmLkcxRE1TTywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBoaWMyIDwtIGltcG9ydChjZi5HMWRUQUcsIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgcDEgPC0gcGxvdE1hdHJpeChoaWMxLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpXG4gIHAyIDwtIHBsb3RNYXRyaXgoaGljMiwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKVxuICBcbiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXHZpc3V6bGlhdGlvbl9zdHJMb29wX2RUQUdfXFwsIGksIFxcXzI1a2JcXCkpXG4gIHBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSlcbiAgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG4gIGRldi5vZmYoKVxufVxuXG4jIyMjIyMjIyMjIyMjIyBkVEFHIGNhbGxlZCBsb29wc1xuIyMgRmlsdGVyaW5nIGxvb3BzIHRvIHBsb3RcbmRhdGExIDwtIGZyZWFkKGhlcmUobG9vcERpciwgXFxHMS5kVEFHLk1lcmdlZF9jaHJvbW9zaWdodF8yNWtiLnRzdlxcKSlcbmRhdGEyIDwtIGZyZWFkKGhlcmUobG9vcERpciwgXFxHMS5kVEFHLk1lcmdlZF9jaHJvbW9zaWdodF8xMGtiLnRzdlxcKSlcbmRhdGEzIDwtIGZyZWFkKGhlcmUobG9vcERpciwgXFxHMS5kVEFHLk1lcmdlZF9jaHJvbW9zaWdodF81a2IudHN2XFwpKVxuZGF0YSA8LSBiaW5kX3Jvd3MoZGF0YTEsIGRhdGEyLCBkYXRhMylcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKHNjb3JlKSlcblxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6c2VsZWN0KHNlcSgxLCA2KSlcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxWMVxcLCBcXFYyXFwsIFxcVjNcXCwgXFxWNFxcLCBcXFY1XFwsIFxcVjZcXClcbmxvb3BzIDwtIGltcG9ydEJlZHBlKHRlbXApXG5cbiMgVmlzdWFsaXphdGlvblxuaGljRGlyIDwtIFxcL1ZvbHVtZXMvVUtKSU5fU1NEL0dlbm9taWNzXzAzX0FuYWx5c2lzX1dvcmtpbmcvZGF0YV92YXVsdF8yMDI0c3VtbWVyX21pY3JvQy9oaWNcXFxud2luZG93U2l6ZSA8LSAyKjFlNlxuXG5mb3IoaSBpbiBzZXEoMSwgMjUpKXtcbiAgIyMgTG9hZGluZyBoaWMgYW5kIHBsb3R0aW5nXG4gIGNociA8LSBhc190aWJibGUobG9vcHNbaV0pJHNlcW5hbWVzMVxuICBjZW50ZXIgPC0gKGFzX3RpYmJsZShsb29wc1tpXSkkc3RhcnQxICsgYXNfdGliYmxlKGxvb3BzW2ldKSRlbmQyKS8yXG4gIHN0YXJ0IDwtIGZsb29yKGNlbnRlciAtIDAuNSp3aW5kb3dTaXplKVxuICBlbmQgPC0gZmxvb3IoY2VudGVyICsgMC41KndpbmRvd1NpemUpXG4gIFxuICBjZi5HMURNU08gPC0gSGljRmlsZShwYXRoID0gaGVyZShoaWNEaXIsIFxcRzEuRE1TTy5NZXJnZWQuaGljXFwpKVxuICBjZi5HMWRUQUcgPC0gSGljRmlsZShwYXRoID0gaGVyZShoaWNEaXIsIFxcRzEuZFRBRy5NZXJnZWQuaGljXFwpKVxuXG4gIHJlcyA8LSAxMCoxMDAwXG4gIHptYXggPC0gMi41XG4gIGhpYzEgPC0gaW1wb3J0KGNmLkcxRE1TTywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBoaWMyIDwtIGltcG9ydChjZi5HMWRUQUcsIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgcDEgPC0gcGxvdE1hdHJpeChoaWMxLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpXG4gIHAyIDwtIHBsb3RNYXRyaXgoaGljMiwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKVxuICBcbiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXHZpc3V6bGlhdGlvbl9kVEFHY2FsbGVkTG9vcF9kVEFHX1xcLCBpLCBcXF8xMGtiXFwpKVxuICBwbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUpXG4gIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gXFxoXFwpKVxuICBkZXYub2ZmKClcbiAgXG4gIFxuICByZXMgPC0gMjUqMTAwMFxuICB6bWF4IDwtIDNcbiAgc3RhcnQgPC0gZmxvb3IoY2VudGVyIC0gd2luZG93U2l6ZSlcbiAgZW5kIDwtIGZsb29yKGNlbnRlciArIHdpbmRvd1NpemUpXG4gIGhpYzEgPC0gaW1wb3J0KGNmLkcxRE1TTywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBoaWMyIDwtIGltcG9ydChjZi5HMWRUQUcsIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgcDEgPC0gcGxvdE1hdHJpeChoaWMxLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpXG4gIHAyIDwtIHBsb3RNYXRyaXgoaGljMiwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKVxuICBcbiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXHZpc3V6bGlhdGlvbl9kVEFHY2FsbGVkTG9vcF9kVEFHX1xcLCBpLCBcXF8yNWtiXFwpKVxuICBwbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUpXG4gIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gXFxoXFwpKVxuICBkZXYub2ZmKClcbn1cblxuY2hyID0gXFxjaHIxM1xcXG5zdGFydCA9IDk2OTAwMDAwXG5lbmQgPSA5ODEwMDAwMFxuICByZXMgPC0gMTAqMTAwMFxuICB6bWF4IDwtIDIuNVxuICBoaWMxIDwtIGltcG9ydChjZi5HMURNU08sIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgaGljMiA8LSBpbXBvcnQoY2YuRzFkVEFHLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIHAxIDwtIHBsb3RNYXRyaXgoaGljMSwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSlcbiAgcDIgPC0gcGxvdE1hdHJpeChoaWMyLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpKVxuICAgIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gXFxoXFwpKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
### Getting loop ID
temp <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\)) %>%
  dplyr::mutate(res = V3 - V2,
                id = paste(V1, res, V2, V5, sep = \_\))
regID <- temp$id

temp <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure.bedpe\)) %>%
  dplyr::mutate(res = V3 - V2,
                id = paste(V1, res, V2, V5, sep = \_\))
strID <- temp$id

############## REG
## Filtering loops to plot
data <- fread(here(consensusDir, \chromo_cons_score.tsv\))
temp <- data %>% dplyr::filter(id %in% regID, dTAG > 0.5) %>% dplyr::arrange(desc(dTAG))
temp <- temp %>% dplyr::select(seq(1, 6))
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
loops <- importBedpe(temp)

# Visualization
hicDir <- \/Volumes/UKJIN_SSD/data_vault_2024summer_microC/hic\
windowSize <- 1*1e6

i = 1
# for(i in seq(1, 25)){
  ## Loading hic and plotting
  chr <- as_tibble(loops[i])$seqnames1
  center <- (as_tibble(loops[i])$start1 + as_tibble(loops[i])$end2)/2
  start <- floor(center - 0.5*windowSize)
  end <- floor(center + 0.5*windowSize)
  
  cf.G1DMSO <- HicFile(path = here(hicDir, \G1.DMSO.Merged.hic\))
  cf.G1dTAG <- HicFile(path = here(hicDir, \G1.dTAG.Merged.hic\))
  #cf.G1dTAG <- HicFile(path = here(hicDir, \G1.A485.Merged.hic\))

  res <- 10*1000
  zmax <- 2.5
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax), loop = loops)
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax), loop = loops)
  
  fileName <- here(figDir, paste0(\visuzliation_regLoop_dTAG_\, i, \_10kb_figureVer\))
  
  width <- panelSize(20)*mmToInch
  height <- panelSize(10)*mmToInch
  
  png(paste0(fileName, \.png\), res = 600, units = \in\, width = width, height = height)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
  svglite(paste0(fileName, \.svg\), width = width, height = height)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
  
  res <- 25*1000
  zmax <- 3
  start <- floor(center - windowSize)
  end <- floor(center + windowSize)
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax), loop = loops)
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax), loop = loops)
  
  fileName <- here(figDir, paste0(\visuzliation_regLoop_dTAG_\, i, \_25kb\))
  png(paste0(fileName, \.png\), res = 600, units = \in\, width = 10, height = 5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
  # svglite(paste0(fileName, \.svg\), width = 10, height = 5)
  # print(cowplot::plot_grid(p1, p2, align = \h\))
  # dev.off()
# }

############## Str
## Filtering loops to plot
data <- fread(here(consensusDir, \chromo_cons_score.tsv\))
temp <- data %>% dplyr::filter(id %in% strID, dTAG > 0.5) %>% dplyr::arrange(desc(dTAG))
temp <- temp %>% dplyr::select(seq(1, 6))
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
loops <- importBedpe(temp)

# Visualization
hicDir <- \/Volumes/UKJIN_SSD/Genomics_03_Analysis_Working/data_vault_2024summer_microC/hic\
windowSize <- 2*1e6

for(i in seq(1, 25)){
  ## Loading hic and plotting
  chr <- as_tibble(loops[i])$seqnames1
  center <- (as_tibble(loops[i])$start1 + as_tibble(loops[i])$end2)/2
  start <- floor(center - 0.5*windowSize)
  end <- floor(center + 0.5*windowSize)
  
  cf.G1DMSO <- HicFile(path = here(hicDir, \G1.DMSO.Merged.hic\))
  cf.G1dTAG <- HicFile(path = here(hicDir, \G1.dTAG.Merged.hic\))

  res <- 10*1000
  zmax <- 2.5
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax), loop = loops)
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax), loop = loops)
  
  fileName <- here(figDir, paste0(\visuzliation_strLoop_dTAG_\, i, \_10kb\))
  png(paste0(fileName, \.png\), res = 600, units = \in\, width = 10, height = 5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
  
  
  res <- 25*1000
  zmax <- 3
  start <- floor(center - windowSize)
  end <- floor(center + windowSize)
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax), loop = loops)
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax), loop = loops)
  
  fileName <- here(figDir, paste0(\visuzliation_strLoop_dTAG_\, i, \_25kb\))
  png(paste0(fileName, \.png\), res = 600, units = \in\, width = 10, height = 5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
}

############## dTAG called loops
## Filtering loops to plot
data1 <- fread(here(loopDir, \G1.dTAG.Merged_chromosight_25kb.tsv\))
data2 <- fread(here(loopDir, \G1.dTAG.Merged_chromosight_10kb.tsv\))
data3 <- fread(here(loopDir, \G1.dTAG.Merged_chromosight_5kb.tsv\))
data <- bind_rows(data1, data2, data3)

temp <- data %>% dplyr::arrange(desc(score))

temp <- temp %>% dplyr::select(seq(1, 6))
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
loops <- importBedpe(temp)

# Visualization
hicDir <- \/Volumes/UKJIN_SSD/Genomics_03_Analysis_Working/data_vault_2024summer_microC/hic\
windowSize <- 2*1e6

for(i in seq(1, 25)){
  ## Loading hic and plotting
  chr <- as_tibble(loops[i])$seqnames1
  center <- (as_tibble(loops[i])$start1 + as_tibble(loops[i])$end2)/2
  start <- floor(center - 0.5*windowSize)
  end <- floor(center + 0.5*windowSize)
  
  cf.G1DMSO <- HicFile(path = here(hicDir, \G1.DMSO.Merged.hic\))
  cf.G1dTAG <- HicFile(path = here(hicDir, \G1.dTAG.Merged.hic\))

  res <- 10*1000
  zmax <- 2.5
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax), loop = loops)
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax), loop = loops)
  
  fileName <- here(figDir, paste0(\visuzliation_dTAGcalledLoop_dTAG_\, i, \_10kb\))
  png(paste0(fileName, \.png\), res = 600, units = \in\, width = 10, height = 5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
  
  
  res <- 25*1000
  zmax <- 3
  start <- floor(center - windowSize)
  end <- floor(center + windowSize)
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax), loop = loops)
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax), loop = loops)
  
  fileName <- here(figDir, paste0(\visuzliation_dTAGcalledLoop_dTAG_\, i, \_25kb\))
  png(paste0(fileName, \.png\), res = 600, units = \in\, width = 10, height = 5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
}

chr = \chr13\
start = 96900000
end = 98100000
  res <- 10*1000
  zmax <- 2.5
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax))
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax))
    print(cowplot::plot_grid(p1, p2, align = \h\))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5TWpJRWRsZEhScGJtY2diRzl2Y0NCSlJGeHVkR1Z0Y0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsTG1KbFpIQmxYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaHlaWE1nUFNCV015QXRJRll5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsa0lEMGdjR0Z6ZEdVb1ZqRXNJSEpsY3l3Z1ZqSXNJRlkxTENCelpYQWdQU0JjWEY5Y1hDa3BYRzV5WldkSlJDQThMU0IwWlcxd0pHbGtYRzVjYm5SbGJYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl6ZEhKMVkzUjFjbVV1WW1Wa2NHVmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtISmxjeUE5SUZZeklDMGdWaklzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdRZ1BTQndZWE4wWlNoV01Td2djbVZ6TENCV01pd2dWalVzSUhObGNDQTlJRnhjWDF4Y0tTbGNibk4wY2tsRUlEd3RJSFJsYlhBa2FXUmNibHh1SXlNakl5TWpJeU1qSXlNakl5TWdVa1ZIWEc0akl5QkdhV3gwWlhKcGJtY2diRzl2Y0hNZ2RHOGdjR3h2ZEZ4dVpHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOXpZMjl5WlM1MGMzWmNYQ2twWEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9hV1FnSldsdUpTQnlaV2RKUkN3Z1pGUkJSeUErSURBdU5Ta2dKVDRsSUdSd2JIbHlPanBoY25KaGJtZGxLR1JsYzJNb1pGUkJSeWtwWEc1MFpXMXdJRHd0SUhSbGJYQWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9jMlZ4S0RFc0lEWXBLVnh1WTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY1hGWXhYRndzSUZ4Y1ZqSmNYQ3dnWEZ4V00xeGNMQ0JjWEZZMFhGd3NJRnhjVmpWY1hDd2dYRnhXTmx4Y0tWeHViRzl2Y0hNZ1BDMGdhVzF3YjNKMFFtVmtjR1VvZEdWdGNDbGNibHh1SXlCV2FYTjFZV3hwZW1GMGFXOXVYRzVvYVdORWFYSWdQQzBnWEZ3dlZtOXNkVzFsY3k5VlMwcEpUbDlUVTBRdlpHRjBZVjkyWVhWc2RGOHlNREkwYzNWdGJXVnlYMjFwWTNKdlF5OW9hV05jWEZ4dWQybHVaRzkzVTJsNlpTQThMU0F4S2pGbE5seHVYRzVwSUQwZ01WeHVJeUJtYjNJb2FTQnBiaUJ6WlhFb01Td2dNalVwS1h0Y2JpQWdJeU1nVEc5aFpHbHVaeUJvYVdNZ1lXNWtJSEJzYjNSMGFXNW5YRzRnSUdOb2NpQThMU0JoYzE5MGFXSmliR1VvYkc5dmNITmJhVjBwSkhObGNXNWhiV1Z6TVZ4dUlDQmpaVzUwWlhJZ1BDMGdLR0Z6WDNScFltSnNaU2hzYjI5d2MxdHBYU2trYzNSaGNuUXhJQ3NnWVhOZmRHbGlZbXhsS0d4dmIzQnpXMmxkS1NSbGJtUXlLUzh5WEc0Z0lITjBZWEowSUR3dElHWnNiMjl5S0dObGJuUmxjaUF0SURBdU5TcDNhVzVrYjNkVGFYcGxLVnh1SUNCbGJtUWdQQzBnWm14dmIzSW9ZMlZ1ZEdWeUlDc2dNQzQxS25kcGJtUnZkMU5wZW1VcFhHNGdJRnh1SUNCalppNUhNVVJOVTA4Z1BDMGdTR2xqUm1sc1pTaHdZWFJvSUQwZ2FHVnlaU2hvYVdORWFYSXNJRnhjUnpFdVJFMVRUeTVOWlhKblpXUXVhR2xqWEZ3cEtWeHVJQ0JqWmk1SE1XUlVRVWNnUEMwZ1NHbGpSbWxzWlNod1lYUm9JRDBnYUdWeVpTaG9hV05FYVhJc0lGeGNSekV1WkZSQlJ5NU5aWEpuWldRdWFHbGpYRndwS1Z4dUlDQWpZMll1UnpGa1ZFRkhJRHd0SUVocFkwWnBiR1VvY0dGMGFDQTlJR2hsY21Vb2FHbGpSR2x5TENCY1hFY3hMa0UwT0RVdVRXVnlaMlZrTG1ocFkxeGNLU2xjYmx4dUlDQnlaWE1nUEMwZ01UQXFNVEF3TUZ4dUlDQjZiV0Y0SUR3dElESXVOVnh1SUNCb2FXTXhJRHd0SUdsdGNHOXlkQ2hqWmk1SE1VUk5VMDhzSUdadlkzVnpJRDBnY0dGemRHVXdLR05vY2l3Z1hGdzZYRndzSUhOMFlYSjBMQ0JjWEMxY1hDd2daVzVrS1N3Z2NtVnpiMngxZEdsdmJpQTlJSEpsY3lsY2JpQWdhR2xqTWlBOExTQnBiWEJ2Y25Rb1kyWXVSekZrVkVGSExDQm1iMk4xY3lBOUlIQmhjM1JsTUNoamFISXNJRnhjT2x4Y0xDQnpkR0Z5ZEN3Z1hGd3RYRndzSUdWdVpDa3NJSEpsYzI5c2RYUnBiMjRnUFNCeVpYTXBYRzRnSUhBeElEd3RJSEJzYjNSTllYUnlhWGdvYUdsak1Td2daSEJwSUQwZ01UQXdNQ3dnYkdsdGFYUnpJRDBnWXlnd0xDQjZiV0Y0S1N3Z2JHOXZjQ0E5SUd4dmIzQnpLVnh1SUNCd01pQThMU0J3Ykc5MFRXRjBjbWw0S0docFl6SXNJR1J3YVNBOUlERXdNREFzSUd4cGJXbDBjeUE5SUdNb01Dd2dlbTFoZUNrc0lHeHZiM0FnUFNCc2IyOXdjeWxjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUdobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1hGeDJhWE4xZW14cFlYUnBiMjVmY21WblRHOXZjRjlrVkVGSFgxeGNMQ0JwTENCY1hGOHhNR3RpWDJacFozVnlaVlpsY2x4Y0tTbGNiaUFnWEc0Z0lIZHBaSFJvSUR3dElIQmhibVZzVTJsNlpTZ3lNQ2txYlcxVWIwbHVZMmhjYmlBZ2FHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3hNQ2txYlcxVWIwbHVZMmhjYmlBZ1hHNGdJSEJ1Wnlod1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuQnVaMXhjS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwY3lBOUlGeGNhVzVjWEN3Z2QybGtkR2dnUFNCM2FXUjBhQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBLVnh1SUNCd2NtbHVkQ2hqYjNkd2JHOTBPanB3Ykc5MFgyZHlhV1FvY0RFc0lIQXlMQ0JoYkdsbmJpQTlJRnhjYUZ4Y0tTbGNiaUFnWkdWMkxtOW1aaWdwWEc0Z0lITjJaMnhwZEdVb2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrc0lIZHBaSFJvSUQwZ2QybGtkR2dzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ2xjYmlBZ2NISnBiblFvWTI5M2NHeHZkRG82Y0d4dmRGOW5jbWxrS0hBeExDQndNaXdnWVd4cFoyNGdQU0JjWEdoY1hDa3BYRzRnSUdSbGRpNXZabVlvS1Z4dUlDQmNiaUFnY21WeklEd3RJREkxS2pFd01EQmNiaUFnZW0xaGVDQThMU0F6WEc0Z0lITjBZWEowSUR3dElHWnNiMjl5S0dObGJuUmxjaUF0SUhkcGJtUnZkMU5wZW1VcFhHNGdJR1Z1WkNBOExTQm1iRzl2Y2loalpXNTBaWElnS3lCM2FXNWtiM2RUYVhwbEtWeHVJQ0JvYVdNeElEd3RJR2x0Y0c5eWRDaGpaaTVITVVSTlUwOHNJR1p2WTNWeklEMGdjR0Z6ZEdVd0tHTm9jaXdnWEZ3NlhGd3NJSE4wWVhKMExDQmNYQzFjWEN3Z1pXNWtLU3dnY21WemIyeDFkR2x2YmlBOUlISmxjeWxjYmlBZ2FHbGpNaUE4TFNCcGJYQnZjblFvWTJZdVJ6RmtWRUZITENCbWIyTjFjeUE5SUhCaGMzUmxNQ2hqYUhJc0lGeGNPbHhjTENCemRHRnlkQ3dnWEZ3dFhGd3NJR1Z1WkNrc0lISmxjMjlzZFhScGIyNGdQU0J5WlhNcFhHNGdJSEF4SUR3dElIQnNiM1JOWVhSeWFYZ29hR2xqTVN3Z1pIQnBJRDBnTVRBd01Dd2diR2x0YVhSeklEMGdZeWd3TENCNmJXRjRLU3dnYkc5dmNDQTlJR3h2YjNCektWeHVJQ0J3TWlBOExTQndiRzkwVFdGMGNtbDRLR2hwWXpJc0lHUndhU0E5SURFd01EQXNJR3hwYldsMGN5QTlJR01vTUN3Z2VtMWhlQ2tzSUd4dmIzQWdQU0JzYjI5d2N5bGNiaUFnWEc0Z0lHWnBiR1ZPWVcxbElEd3RJR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWEZ4MmFYTjFlbXhwWVhScGIyNWZjbVZuVEc5dmNGOWtWRUZIWDF4Y0xDQnBMQ0JjWEY4eU5XdGlYRndwS1Z4dUlDQndibWNvY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkSE1nUFNCY1hHbHVYRndzSUhkcFpIUm9JRDBnTVRBc0lHaGxhV2RvZENBOUlEVXBYRzRnSUhCeWFXNTBLR052ZDNCc2IzUTZPbkJzYjNSZlozSnBaQ2h3TVN3Z2NESXNJR0ZzYVdkdUlEMGdYRnhvWEZ3cEtWeHVJQ0JrWlhZdWIyWm1LQ2xjYmlBZ0l5QnpkbWRzYVhSbEtIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjM1puWEZ3cExDQjNhV1IwYUNBOUlERXdMQ0JvWldsbmFIUWdQU0ExS1Z4dUlDQWpJSEJ5YVc1MEtHTnZkM0JzYjNRNk9uQnNiM1JmWjNKcFpDaHdNU3dnY0RJc0lHRnNhV2R1SUQwZ1hGeG9YRndwS1Z4dUlDQWpJR1JsZGk1dlptWW9LVnh1SXlCOVhHNWNiaU1qSXlNakl5TWpJeU1qSXlNaklGTjBjbHh1SXlNZ1JtbHNkR1Z5YVc1bklHeHZiM0J6SUhSdklIQnNiM1JjYm1SaGRHRWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZmMyTnZjbVV1ZEhOMlhGd3BLVnh1ZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHbGtJQ1ZwYmlVZ2MzUnlTVVFzSUdSVVFVY2dQaUF3TGpVcElDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaWE5qS0dSVVFVY3BLVnh1ZEdWdGNDQThMU0IwWlcxd0lDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtITmxjU2d4TENBMktTbGNibU52Ykc1aGJXVnpLSFJsYlhBcElEd3RJR01vWEZ4V01WeGNMQ0JjWEZZeVhGd3NJRnhjVmpOY1hDd2dYRnhXTkZ4Y0xDQmNYRlkxWEZ3c0lGeGNWalpjWENsY2JteHZiM0J6SUR3dElHbHRjRzl5ZEVKbFpIQmxLSFJsYlhBcFhHNWNiaU1nVm1semRXRnNhWHBoZEdsdmJseHVhR2xqUkdseUlEd3RJRnhjTDFadmJIVnRaWE12VlV0S1NVNWZVMU5FTDBkbGJtOXRhV056WHpBelgwRnVZV3g1YzJselgxZHZjbXRwYm1jdlpHRjBZVjkyWVhWc2RGOHlNREkwYzNWdGJXVnlYMjFwWTNKdlF5OW9hV05jWEZ4dWQybHVaRzkzVTJsNlpTQThMU0F5S2pGbE5seHVYRzVtYjNJb2FTQnBiaUJ6WlhFb01Td2dNalVwS1h0Y2JpQWdJeU1nVEc5aFpHbHVaeUJvYVdNZ1lXNWtJSEJzYjNSMGFXNW5YRzRnSUdOb2NpQThMU0JoYzE5MGFXSmliR1VvYkc5dmNITmJhVjBwSkhObGNXNWhiV1Z6TVZ4dUlDQmpaVzUwWlhJZ1BDMGdLR0Z6WDNScFltSnNaU2hzYjI5d2MxdHBYU2trYzNSaGNuUXhJQ3NnWVhOZmRHbGlZbXhsS0d4dmIzQnpXMmxkS1NSbGJtUXlLUzh5WEc0Z0lITjBZWEowSUR3dElHWnNiMjl5S0dObGJuUmxjaUF0SURBdU5TcDNhVzVrYjNkVGFYcGxLVnh1SUNCbGJtUWdQQzBnWm14dmIzSW9ZMlZ1ZEdWeUlDc2dNQzQxS25kcGJtUnZkMU5wZW1VcFhHNGdJRnh1SUNCalppNUhNVVJOVTA4Z1BDMGdTR2xqUm1sc1pTaHdZWFJvSUQwZ2FHVnlaU2hvYVdORWFYSXNJRnhjUnpFdVJFMVRUeTVOWlhKblpXUXVhR2xqWEZ3cEtWeHVJQ0JqWmk1SE1XUlVRVWNnUEMwZ1NHbGpSbWxzWlNod1lYUm9JRDBnYUdWeVpTaG9hV05FYVhJc0lGeGNSekV1WkZSQlJ5NU5aWEpuWldRdWFHbGpYRndwS1Z4dVhHNGdJSEpsY3lBOExTQXhNQ294TURBd1hHNGdJSHB0WVhnZ1BDMGdNaTQxWEc0Z0lHaHBZekVnUEMwZ2FXMXdiM0owS0dObUxrY3hSRTFUVHl3Z1ptOWpkWE1nUFNCd1lYTjBaVEFvWTJoeUxDQmNYRHBjWEN3Z2MzUmhjblFzSUZ4Y0xWeGNMQ0JsYm1RcExDQnlaWE52YkhWMGFXOXVJRDBnY21WektWeHVJQ0JvYVdNeUlEd3RJR2x0Y0c5eWRDaGpaaTVITVdSVVFVY3NJR1p2WTNWeklEMGdjR0Z6ZEdVd0tHTm9jaXdnWEZ3NlhGd3NJSE4wWVhKMExDQmNYQzFjWEN3Z1pXNWtLU3dnY21WemIyeDFkR2x2YmlBOUlISmxjeWxjYmlBZ2NERWdQQzBnY0d4dmRFMWhkSEpwZUNob2FXTXhMQ0JrY0drZ1BTQXhNREF3TENCc2FXMXBkSE1nUFNCaktEQXNJSHB0WVhncExDQnNiMjl3SUQwZ2JHOXZjSE1wWEc0Z0lIQXlJRHd0SUhCc2IzUk5ZWFJ5YVhnb2FHbGpNaXdnWkhCcElEMGdNVEF3TUN3Z2JHbHRhWFJ6SUQwZ1l5Z3dMQ0I2YldGNEtTd2diRzl2Y0NBOUlHeHZiM0J6S1Z4dUlDQmNiaUFnWm1sc1pVNWhiV1VnUEMwZ2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaGNYSFpwYzNWNmJHbGhkR2x2Ymw5emRISk1iMjl3WDJSVVFVZGZYRndzSUdrc0lGeGNYekV3YTJKY1hDa3BYRzRnSUhCdVp5aHdZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMGN5QTlJRnhjYVc1Y1hDd2dkMmxrZEdnZ1BTQXhNQ3dnYUdWcFoyaDBJRDBnTlNsY2JpQWdjSEpwYm5Rb1kyOTNjR3h2ZERvNmNHeHZkRjluY21sa0tIQXhMQ0J3TWl3Z1lXeHBaMjRnUFNCY1hHaGNYQ2twWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0JjYmlBZ1hHNGdJSEpsY3lBOExTQXlOU294TURBd1hHNGdJSHB0WVhnZ1BDMGdNMXh1SUNCemRHRnlkQ0E4TFNCbWJHOXZjaWhqWlc1MFpYSWdMU0IzYVc1a2IzZFRhWHBsS1Z4dUlDQmxibVFnUEMwZ1pteHZiM0lvWTJWdWRHVnlJQ3NnZDJsdVpHOTNVMmw2WlNsY2JpQWdhR2xqTVNBOExTQnBiWEJ2Y25Rb1kyWXVSekZFVFZOUExDQm1iMk4xY3lBOUlIQmhjM1JsTUNoamFISXNJRnhjT2x4Y0xDQnpkR0Z5ZEN3Z1hGd3RYRndzSUdWdVpDa3NJSEpsYzI5c2RYUnBiMjRnUFNCeVpYTXBYRzRnSUdocFl6SWdQQzBnYVcxd2IzSjBLR05tTGtjeFpGUkJSeXdnWm05amRYTWdQU0J3WVhOMFpUQW9ZMmh5TENCY1hEcGNYQ3dnYzNSaGNuUXNJRnhjTFZ4Y0xDQmxibVFwTENCeVpYTnZiSFYwYVc5dUlEMGdjbVZ6S1Z4dUlDQndNU0E4TFNCd2JHOTBUV0YwY21sNEtHaHBZekVzSUdSd2FTQTlJREV3TURBc0lHeHBiV2wwY3lBOUlHTW9NQ3dnZW0xaGVDa3NJR3h2YjNBZ1BTQnNiMjl3Y3lsY2JpQWdjRElnUEMwZ2NHeHZkRTFoZEhKcGVDaG9hV015TENCa2NHa2dQU0F4TURBd0xDQnNhVzFwZEhNZ1BTQmpLREFzSUhwdFlYZ3BMQ0JzYjI5d0lEMGdiRzl2Y0hNcFhHNGdJRnh1SUNCbWFXeGxUbUZ0WlNBOExTQm9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLRnhjZG1semRYcHNhV0YwYVc5dVgzTjBja3h2YjNCZlpGUkJSMTljWEN3Z2FTd2dYRnhmTWpWcllseGNLU2xjYmlBZ2NHNW5LSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUnpJRDBnWEZ4cGJseGNMQ0IzYVdSMGFDQTlJREV3TENCb1pXbG5hSFFnUFNBMUtWeHVJQ0J3Y21sdWRDaGpiM2R3Ykc5ME9qcHdiRzkwWDJkeWFXUW9jREVzSUhBeUxDQmhiR2xuYmlBOUlGeGNhRnhjS1NsY2JpQWdaR1YyTG05bVppZ3BYRzU5WEc1Y2JpTWpJeU1qSXlNakl5TWpJeU1qSUdSVVFVY2dZMkZzYkdWa0lHeHZiM0J6WEc0akl5QkdhV3gwWlhKcGJtY2diRzl2Y0hNZ2RHOGdjR3h2ZEZ4dVpHRjBZVEVnUEMwZ1puSmxZV1FvYUdWeVpTaHNiMjl3UkdseUxDQmNYRWN4TG1SVVFVY3VUV1Z5WjJWa1gyTm9jbTl0YjNOcFoyaDBYekkxYTJJdWRITjJYRndwS1Z4dVpHRjBZVElnUEMwZ1puSmxZV1FvYUdWeVpTaHNiMjl3UkdseUxDQmNYRWN4TG1SVVFVY3VUV1Z5WjJWa1gyTm9jbTl0YjNOcFoyaDBYekV3YTJJdWRITjJYRndwS1Z4dVpHRjBZVE1nUEMwZ1puSmxZV1FvYUdWeVpTaHNiMjl3UkdseUxDQmNYRWN4TG1SVVFVY3VUV1Z5WjJWa1gyTm9jbTl0YjNOcFoyaDBYelZyWWk1MGMzWmNYQ2twWEc1a1lYUmhJRHd0SUdKcGJtUmZjbTkzY3loa1lYUmhNU3dnWkdGMFlUSXNJR1JoZEdFektWeHVYRzUwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcGhjbkpoYm1kbEtHUmxjMk1vYzJOdmNtVXBLVnh1WEc1MFpXMXdJRHd0SUhSbGJYQWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9jMlZ4S0RFc0lEWXBLVnh1WTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY1hGWXhYRndzSUZ4Y1ZqSmNYQ3dnWEZ4V00xeGNMQ0JjWEZZMFhGd3NJRnhjVmpWY1hDd2dYRnhXTmx4Y0tWeHViRzl2Y0hNZ1BDMGdhVzF3YjNKMFFtVmtjR1VvZEdWdGNDbGNibHh1SXlCV2FYTjFZV3hwZW1GMGFXOXVYRzVvYVdORWFYSWdQQzBnWEZ3dlZtOXNkVzFsY3k5VlMwcEpUbDlUVTBRdlIyVnViMjFwWTNOZk1ETmZRVzVoYkhsemFYTmZWMjl5YTJsdVp5OWtZWFJoWDNaaGRXeDBYekl3TWpSemRXMXRaWEpmYldsamNtOURMMmhwWTF4Y1hHNTNhVzVrYjNkVGFYcGxJRHd0SURJcU1XVTJYRzVjYm1admNpaHBJR2x1SUhObGNTZ3hMQ0F5TlNrcGUxeHVJQ0FqSXlCTWIyRmthVzVuSUdocFl5QmhibVFnY0d4dmRIUnBibWRjYmlBZ1kyaHlJRHd0SUdGelgzUnBZbUpzWlNoc2IyOXdjMXRwWFNra2MyVnhibUZ0WlhNeFhHNGdJR05sYm5SbGNpQThMU0FvWVhOZmRHbGlZbXhsS0d4dmIzQnpXMmxkS1NSemRHRnlkREVnS3lCaGMxOTBhV0ppYkdVb2JHOXZjSE5iYVYwcEpHVnVaRElwTHpKY2JpQWdjM1JoY25RZ1BDMGdabXh2YjNJb1kyVnVkR1Z5SUMwZ01DNDFLbmRwYm1SdmQxTnBlbVVwWEc0Z0lHVnVaQ0E4TFNCbWJHOXZjaWhqWlc1MFpYSWdLeUF3TGpVcWQybHVaRzkzVTJsNlpTbGNiaUFnWEc0Z0lHTm1Ma2N4UkUxVFR5QThMU0JJYVdOR2FXeGxLSEJoZEdnZ1BTQm9aWEpsS0docFkwUnBjaXdnWEZ4SE1TNUVUVk5QTGsxbGNtZGxaQzVvYVdOY1hDa3BYRzRnSUdObUxrY3haRlJCUnlBOExTQklhV05HYVd4bEtIQmhkR2dnUFNCb1pYSmxLR2hwWTBScGNpd2dYRnhITVM1a1ZFRkhMazFsY21kbFpDNW9hV05jWENrcFhHNWNiaUFnY21WeklEd3RJREV3S2pFd01EQmNiaUFnZW0xaGVDQThMU0F5TGpWY2JpQWdhR2xqTVNBOExTQnBiWEJ2Y25Rb1kyWXVSekZFVFZOUExDQm1iMk4xY3lBOUlIQmhjM1JsTUNoamFISXNJRnhjT2x4Y0xDQnpkR0Z5ZEN3Z1hGd3RYRndzSUdWdVpDa3NJSEpsYzI5c2RYUnBiMjRnUFNCeVpYTXBYRzRnSUdocFl6SWdQQzBnYVcxd2IzSjBLR05tTGtjeFpGUkJSeXdnWm05amRYTWdQU0J3WVhOMFpUQW9ZMmh5TENCY1hEcGNYQ3dnYzNSaGNuUXNJRnhjTFZ4Y0xDQmxibVFwTENCeVpYTnZiSFYwYVc5dUlEMGdjbVZ6S1Z4dUlDQndNU0E4TFNCd2JHOTBUV0YwY21sNEtHaHBZekVzSUdSd2FTQTlJREV3TURBc0lHeHBiV2wwY3lBOUlHTW9NQ3dnZW0xaGVDa3NJR3h2YjNBZ1BTQnNiMjl3Y3lsY2JpQWdjRElnUEMwZ2NHeHZkRTFoZEhKcGVDaG9hV015TENCa2NHa2dQU0F4TURBd0xDQnNhVzFwZEhNZ1BTQmpLREFzSUhwdFlYZ3BMQ0JzYjI5d0lEMGdiRzl2Y0hNcFhHNGdJRnh1SUNCbWFXeGxUbUZ0WlNBOExTQm9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLRnhjZG1semRYcHNhV0YwYVc5dVgyUlVRVWRqWVd4c1pXUk1iMjl3WDJSVVFVZGZYRndzSUdrc0lGeGNYekV3YTJKY1hDa3BYRzRnSUhCdVp5aHdZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMGN5QTlJRnhjYVc1Y1hDd2dkMmxrZEdnZ1BTQXhNQ3dnYUdWcFoyaDBJRDBnTlNsY2JpQWdjSEpwYm5Rb1kyOTNjR3h2ZERvNmNHeHZkRjluY21sa0tIQXhMQ0J3TWl3Z1lXeHBaMjRnUFNCY1hHaGNYQ2twWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVJQ0JjYmlBZ1hHNGdJSEpsY3lBOExTQXlOU294TURBd1hHNGdJSHB0WVhnZ1BDMGdNMXh1SUNCemRHRnlkQ0E4TFNCbWJHOXZjaWhqWlc1MFpYSWdMU0IzYVc1a2IzZFRhWHBsS1Z4dUlDQmxibVFnUEMwZ1pteHZiM0lvWTJWdWRHVnlJQ3NnZDJsdVpHOTNVMmw2WlNsY2JpQWdhR2xqTVNBOExTQnBiWEJ2Y25Rb1kyWXVSekZFVFZOUExDQm1iMk4xY3lBOUlIQmhjM1JsTUNoamFISXNJRnhjT2x4Y0xDQnpkR0Z5ZEN3Z1hGd3RYRndzSUdWdVpDa3NJSEpsYzI5c2RYUnBiMjRnUFNCeVpYTXBYRzRnSUdocFl6SWdQQzBnYVcxd2IzSjBLR05tTGtjeFpGUkJSeXdnWm05amRYTWdQU0J3WVhOMFpUQW9ZMmh5TENCY1hEcGNYQ3dnYzNSaGNuUXNJRnhjTFZ4Y0xDQmxibVFwTENCeVpYTnZiSFYwYVc5dUlEMGdjbVZ6S1Z4dUlDQndNU0E4TFNCd2JHOTBUV0YwY21sNEtHaHBZekVzSUdSd2FTQTlJREV3TURBc0lHeHBiV2wwY3lBOUlHTW9NQ3dnZW0xaGVDa3NJR3h2YjNBZ1BTQnNiMjl3Y3lsY2JpQWdjRElnUEMwZ2NHeHZkRTFoZEhKcGVDaG9hV015TENCa2NHa2dQU0F4TURBd0xDQnNhVzFwZEhNZ1BTQmpLREFzSUhwdFlYZ3BMQ0JzYjI5d0lEMGdiRzl2Y0hNcFhHNGdJRnh1SUNCbWFXeGxUbUZ0WlNBOExTQm9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLRnhjZG1semRYcHNhV0YwYVc5dVgyUlVRVWRqWVd4c1pXUk1iMjl3WDJSVVFVZGZYRndzSUdrc0lGeGNYekkxYTJKY1hDa3BYRzRnSUhCdVp5aHdZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbkJ1WjF4Y0tTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMGN5QTlJRnhjYVc1Y1hDd2dkMmxrZEdnZ1BTQXhNQ3dnYUdWcFoyaDBJRDBnTlNsY2JpQWdjSEpwYm5Rb1kyOTNjR3h2ZERvNmNHeHZkRjluY21sa0tIQXhMQ0J3TWl3Z1lXeHBaMjRnUFNCY1hHaGNYQ2twWEc0Z0lHUmxkaTV2Wm1Zb0tWeHVmVnh1WEc1amFISWdQU0JjWEdOb2NqRXpYRnhjYm5OMFlYSjBJRDBnT1RZNU1EQXdNREJjYm1WdVpDQTlJRGs0TVRBd01EQXdYRzRnSUhKbGN5QThMU0F4TUNveE1EQXdYRzRnSUhwdFlYZ2dQQzBnTWk0MVhHNGdJR2hwWXpFZ1BDMGdhVzF3YjNKMEtHTm1Ma2N4UkUxVFR5d2dabTlqZFhNZ1BTQndZWE4wWlRBb1kyaHlMQ0JjWERwY1hDd2djM1JoY25Rc0lGeGNMVnhjTENCbGJtUXBMQ0J5WlhOdmJIVjBhVzl1SUQwZ2NtVnpLVnh1SUNCb2FXTXlJRHd0SUdsdGNHOXlkQ2hqWmk1SE1XUlVRVWNzSUdadlkzVnpJRDBnY0dGemRHVXdLR05vY2l3Z1hGdzZYRndzSUhOMFlYSjBMQ0JjWEMxY1hDd2daVzVrS1N3Z2NtVnpiMngxZEdsdmJpQTlJSEpsY3lsY2JpQWdjREVnUEMwZ2NHeHZkRTFoZEhKcGVDaG9hV014TENCa2NHa2dQU0F4TURBd0xDQnNhVzFwZEhNZ1BTQmpLREFzSUhwdFlYZ3BLVnh1SUNCd01pQThMU0J3Ykc5MFRXRjBjbWw0S0docFl6SXNJR1J3YVNBOUlERXdNREFzSUd4cGJXbDBjeUE5SUdNb01Dd2dlbTFoZUNrcFhHNGdJQ0FnY0hKcGJuUW9ZMjkzY0d4dmREbzZjR3h2ZEY5bmNtbGtLSEF4TENCd01pd2dZV3hwWjI0Z1BTQmNYR2hjWENrcFhHNWNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG4jIyMgR2V0dGluZyBsb29wIElEXG50ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHJlcyA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgcmVzLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcbnJlZ0lEIDwtIHRlbXAkaWRcblxudGVtcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZS5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUocmVzID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCByZXMsIFYyLCBWNSwgc2VwID0gXFxfXFwpKVxuc3RySUQgPC0gdGVtcCRpZFxuXG4jIyMjIyMjIyMjIyMjIyBSRUdcbiMjIEZpbHRlcmluZyBsb29wcyB0byBwbG90XG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX3Njb3JlLnRzdlxcKSlcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIHJlZ0lELCBkVEFHID4gMC41KSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhkVEFHKSlcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OnNlbGVjdChzZXEoMSwgNikpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcVjFcXCwgXFxWMlxcLCBcXFYzXFwsIFxcVjRcXCwgXFxWNVxcLCBcXFY2XFwpXG5sb29wcyA8LSBpbXBvcnRCZWRwZSh0ZW1wKVxuXG4jIFZpc3VhbGl6YXRpb25cbmhpY0RpciA8LSBcXC9Wb2x1bWVzL1VLSklOX1NTRC9kYXRhX3ZhdWx0XzIwMjRzdW1tZXJfbWljcm9DL2hpY1xcXG53aW5kb3dTaXplIDwtIDEqMWU2XG5cbmkgPSAxXG4jIGZvcihpIGluIHNlcSgxLCAyNSkpe1xuICAjIyBMb2FkaW5nIGhpYyBhbmQgcGxvdHRpbmdcbiAgY2hyIDwtIGFzX3RpYmJsZShsb29wc1tpXSkkc2VxbmFtZXMxXG4gIGNlbnRlciA8LSAoYXNfdGliYmxlKGxvb3BzW2ldKSRzdGFydDEgKyBhc190aWJibGUobG9vcHNbaV0pJGVuZDIpLzJcbiAgc3RhcnQgPC0gZmxvb3IoY2VudGVyIC0gMC41KndpbmRvd1NpemUpXG4gIGVuZCA8LSBmbG9vcihjZW50ZXIgKyAwLjUqd2luZG93U2l6ZSlcbiAgXG4gIGNmLkcxRE1TTyA8LSBIaWNGaWxlKHBhdGggPSBoZXJlKGhpY0RpciwgXFxHMS5ETVNPLk1lcmdlZC5oaWNcXCkpXG4gIGNmLkcxZFRBRyA8LSBIaWNGaWxlKHBhdGggPSBoZXJlKGhpY0RpciwgXFxHMS5kVEFHLk1lcmdlZC5oaWNcXCkpXG4gICNjZi5HMWRUQUcgPC0gSGljRmlsZShwYXRoID0gaGVyZShoaWNEaXIsIFxcRzEuQTQ4NS5NZXJnZWQuaGljXFwpKVxuXG4gIHJlcyA8LSAxMCoxMDAwXG4gIHptYXggPC0gMi41XG4gIGhpYzEgPC0gaW1wb3J0KGNmLkcxRE1TTywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBoaWMyIDwtIGltcG9ydChjZi5HMWRUQUcsIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgcDEgPC0gcGxvdE1hdHJpeChoaWMxLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpXG4gIHAyIDwtIHBsb3RNYXRyaXgoaGljMiwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKVxuICBcbiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXHZpc3V6bGlhdGlvbl9yZWdMb29wX2RUQUdfXFwsIGksIFxcXzEwa2JfZmlndXJlVmVyXFwpKVxuICBcbiAgd2lkdGggPC0gcGFuZWxTaXplKDIwKSptbVRvSW5jaFxuICBoZWlnaHQgPC0gcGFuZWxTaXplKDEwKSptbVRvSW5jaFxuICBcbiAgcG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpXG4gIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gXFxoXFwpKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KVxuICBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgZGV2Lm9mZigpXG4gIFxuICByZXMgPC0gMjUqMTAwMFxuICB6bWF4IDwtIDNcbiAgc3RhcnQgPC0gZmxvb3IoY2VudGVyIC0gd2luZG93U2l6ZSlcbiAgZW5kIDwtIGZsb29yKGNlbnRlciArIHdpbmRvd1NpemUpXG4gIGhpYzEgPC0gaW1wb3J0KGNmLkcxRE1TTywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBoaWMyIDwtIGltcG9ydChjZi5HMWRUQUcsIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgcDEgPC0gcGxvdE1hdHJpeChoaWMxLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpXG4gIHAyIDwtIHBsb3RNYXRyaXgoaGljMiwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKVxuICBcbiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXHZpc3V6bGlhdGlvbl9yZWdMb29wX2RUQUdfXFwsIGksIFxcXzI1a2JcXCkpXG4gIHBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSlcbiAgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG4gIGRldi5vZmYoKVxuICAjIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIHdpZHRoID0gMTAsIGhlaWdodCA9IDUpXG4gICMgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG4gICMgZGV2Lm9mZigpXG4jIH1cblxuIyMjIyMjIyMjIyMjIyMgU3RyXG4jIyBGaWx0ZXJpbmcgbG9vcHMgdG8gcGxvdFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZS50c3ZcXCkpXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBzdHJJRCwgZFRBRyA+IDAuNSkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZFRBRykpXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDYpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXFYxXFwsIFxcVjJcXCwgXFxWM1xcLCBcXFY0XFwsIFxcVjVcXCwgXFxWNlxcKVxubG9vcHMgPC0gaW1wb3J0QmVkcGUodGVtcClcblxuIyBWaXN1YWxpemF0aW9uXG5oaWNEaXIgPC0gXFwvVm9sdW1lcy9VS0pJTl9TU0QvR2Vub21pY3NfMDNfQW5hbHlzaXNfV29ya2luZy9kYXRhX3ZhdWx0XzIwMjRzdW1tZXJfbWljcm9DL2hpY1xcXG53aW5kb3dTaXplIDwtIDIqMWU2XG5cbmZvcihpIGluIHNlcSgxLCAyNSkpe1xuICAjIyBMb2FkaW5nIGhpYyBhbmQgcGxvdHRpbmdcbiAgY2hyIDwtIGFzX3RpYmJsZShsb29wc1tpXSkkc2VxbmFtZXMxXG4gIGNlbnRlciA8LSAoYXNfdGliYmxlKGxvb3BzW2ldKSRzdGFydDEgKyBhc190aWJibGUobG9vcHNbaV0pJGVuZDIpLzJcbiAgc3RhcnQgPC0gZmxvb3IoY2VudGVyIC0gMC41KndpbmRvd1NpemUpXG4gIGVuZCA8LSBmbG9vcihjZW50ZXIgKyAwLjUqd2luZG93U2l6ZSlcbiAgXG4gIGNmLkcxRE1TTyA8LSBIaWNGaWxlKHBhdGggPSBoZXJlKGhpY0RpciwgXFxHMS5ETVNPLk1lcmdlZC5oaWNcXCkpXG4gIGNmLkcxZFRBRyA8LSBIaWNGaWxlKHBhdGggPSBoZXJlKGhpY0RpciwgXFxHMS5kVEFHLk1lcmdlZC5oaWNcXCkpXG5cbiAgcmVzIDwtIDEwKjEwMDBcbiAgem1heCA8LSAyLjVcbiAgaGljMSA8LSBpbXBvcnQoY2YuRzFETVNPLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIGhpYzIgPC0gaW1wb3J0KGNmLkcxZFRBRywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBwMSA8LSBwbG90TWF0cml4KGhpYzEsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcylcbiAgcDIgPC0gcGxvdE1hdHJpeChoaWMyLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpXG4gIFxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxcdmlzdXpsaWF0aW9uX3N0ckxvb3BfZFRBR19cXCwgaSwgXFxfMTBrYlxcKSlcbiAgcG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KVxuICBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgZGV2Lm9mZigpXG4gIFxuICBcbiAgcmVzIDwtIDI1KjEwMDBcbiAgem1heCA8LSAzXG4gIHN0YXJ0IDwtIGZsb29yKGNlbnRlciAtIHdpbmRvd1NpemUpXG4gIGVuZCA8LSBmbG9vcihjZW50ZXIgKyB3aW5kb3dTaXplKVxuICBoaWMxIDwtIGltcG9ydChjZi5HMURNU08sIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgaGljMiA8LSBpbXBvcnQoY2YuRzFkVEFHLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIHAxIDwtIHBsb3RNYXRyaXgoaGljMSwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKVxuICBwMiA8LSBwbG90TWF0cml4KGhpYzIsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcylcbiAgXG4gIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFx2aXN1emxpYXRpb25fc3RyTG9vcF9kVEFHX1xcLCBpLCBcXF8yNWtiXFwpKVxuICBwbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUpXG4gIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gXFxoXFwpKVxuICBkZXYub2ZmKClcbn1cblxuIyMjIyMjIyMjIyMjIyMgZFRBRyBjYWxsZWQgbG9vcHNcbiMjIEZpbHRlcmluZyBsb29wcyB0byBwbG90XG5kYXRhMSA8LSBmcmVhZChoZXJlKGxvb3BEaXIsIFxcRzEuZFRBRy5NZXJnZWRfY2hyb21vc2lnaHRfMjVrYi50c3ZcXCkpXG5kYXRhMiA8LSBmcmVhZChoZXJlKGxvb3BEaXIsIFxcRzEuZFRBRy5NZXJnZWRfY2hyb21vc2lnaHRfMTBrYi50c3ZcXCkpXG5kYXRhMyA8LSBmcmVhZChoZXJlKGxvb3BEaXIsIFxcRzEuZFRBRy5NZXJnZWRfY2hyb21vc2lnaHRfNWtiLnRzdlxcKSlcbmRhdGEgPC0gYmluZF9yb3dzKGRhdGExLCBkYXRhMiwgZGF0YTMpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhzY29yZSkpXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OnNlbGVjdChzZXEoMSwgNikpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcVjFcXCwgXFxWMlxcLCBcXFYzXFwsIFxcVjRcXCwgXFxWNVxcLCBcXFY2XFwpXG5sb29wcyA8LSBpbXBvcnRCZWRwZSh0ZW1wKVxuXG4jIFZpc3VhbGl6YXRpb25cbmhpY0RpciA8LSBcXC9Wb2x1bWVzL1VLSklOX1NTRC9HZW5vbWljc18wM19BbmFseXNpc19Xb3JraW5nL2RhdGFfdmF1bHRfMjAyNHN1bW1lcl9taWNyb0MvaGljXFxcbndpbmRvd1NpemUgPC0gMioxZTZcblxuZm9yKGkgaW4gc2VxKDEsIDI1KSl7XG4gICMjIExvYWRpbmcgaGljIGFuZCBwbG90dGluZ1xuICBjaHIgPC0gYXNfdGliYmxlKGxvb3BzW2ldKSRzZXFuYW1lczFcbiAgY2VudGVyIDwtIChhc190aWJibGUobG9vcHNbaV0pJHN0YXJ0MSArIGFzX3RpYmJsZShsb29wc1tpXSkkZW5kMikvMlxuICBzdGFydCA8LSBmbG9vcihjZW50ZXIgLSAwLjUqd2luZG93U2l6ZSlcbiAgZW5kIDwtIGZsb29yKGNlbnRlciArIDAuNSp3aW5kb3dTaXplKVxuICBcbiAgY2YuRzFETVNPIDwtIEhpY0ZpbGUocGF0aCA9IGhlcmUoaGljRGlyLCBcXEcxLkRNU08uTWVyZ2VkLmhpY1xcKSlcbiAgY2YuRzFkVEFHIDwtIEhpY0ZpbGUocGF0aCA9IGhlcmUoaGljRGlyLCBcXEcxLmRUQUcuTWVyZ2VkLmhpY1xcKSlcblxuICByZXMgPC0gMTAqMTAwMFxuICB6bWF4IDwtIDIuNVxuICBoaWMxIDwtIGltcG9ydChjZi5HMURNU08sIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgaGljMiA8LSBpbXBvcnQoY2YuRzFkVEFHLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIHAxIDwtIHBsb3RNYXRyaXgoaGljMSwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKVxuICBwMiA8LSBwbG90TWF0cml4KGhpYzIsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcylcbiAgXG4gIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFx2aXN1emxpYXRpb25fZFRBR2NhbGxlZExvb3BfZFRBR19cXCwgaSwgXFxfMTBrYlxcKSlcbiAgcG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KVxuICBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgZGV2Lm9mZigpXG4gIFxuICBcbiAgcmVzIDwtIDI1KjEwMDBcbiAgem1heCA8LSAzXG4gIHN0YXJ0IDwtIGZsb29yKGNlbnRlciAtIHdpbmRvd1NpemUpXG4gIGVuZCA8LSBmbG9vcihjZW50ZXIgKyB3aW5kb3dTaXplKVxuICBoaWMxIDwtIGltcG9ydChjZi5HMURNU08sIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgaGljMiA8LSBpbXBvcnQoY2YuRzFkVEFHLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIHAxIDwtIHBsb3RNYXRyaXgoaGljMSwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKVxuICBwMiA8LSBwbG90TWF0cml4KGhpYzIsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcylcbiAgXG4gIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFx2aXN1emxpYXRpb25fZFRBR2NhbGxlZExvb3BfZFRBR19cXCwgaSwgXFxfMjVrYlxcKSlcbiAgcG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KVxuICBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgZGV2Lm9mZigpXG59XG5cbmNociA9IFxcY2hyMTNcXFxuc3RhcnQgPSA5NjkwMDAwMFxuZW5kID0gOTgxMDAwMDBcbiAgcmVzIDwtIDEwKjEwMDBcbiAgem1heCA8LSAyLjVcbiAgaGljMSA8LSBpbXBvcnQoY2YuRzFETVNPLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIGhpYzIgPC0gaW1wb3J0KGNmLkcxZFRBRywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBwMSA8LSBwbG90TWF0cml4KGhpYzEsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCkpXG4gIHAyIDwtIHBsb3RNYXRyaXgoaGljMiwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSlcbiAgICBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMjIEdldHRpbmcgbG9vcCBJRFxudGVtcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShyZXMgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIHJlcywgVjIsIFY1LCBzZXAgPSBcXF9cXCkpXG5yZWdJRCA8LSB0ZW1wJGlkXG5cbnRlbXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmUuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHJlcyA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgcmVzLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcbnN0cklEIDwtIHRlbXAkaWRcblxuIyMjIyMjIyMjIyMjIyMgUkVHXG4jIyBGaWx0ZXJpbmcgbG9vcHMgdG8gcGxvdFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZS50c3ZcXCkpXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSByZWdJRCwgZFRBRyA+IDAuNSkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZFRBRykpXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDYpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXFYxXFwsIFxcVjJcXCwgXFxWM1xcLCBcXFY0XFwsIFxcVjVcXCwgXFxWNlxcKVxubG9vcHMgPC0gaW1wb3J0QmVkcGUodGVtcClcblxuIyBWaXN1YWxpemF0aW9uXG5oaWNEaXIgPC0gXFwvVm9sdW1lcy9VS0pJTl9TU0QvZGF0YV92YXVsdF8yMDI0c3VtbWVyX21pY3JvQy9oaWNcXFxud2luZG93U2l6ZSA8LSAxKjFlNlxuXG5pID0gMVxuIyBmb3IoaSBpbiBzZXEoMSwgMjUpKXtcbiAgIyMgTG9hZGluZyBoaWMgYW5kIHBsb3R0aW5nXG4gIGNociA8LSBhc190aWJibGUobG9vcHNbaV0pJHNlcW5hbWVzMVxuICBjZW50ZXIgPC0gKGFzX3RpYmJsZShsb29wc1tpXSkkc3RhcnQxICsgYXNfdGliYmxlKGxvb3BzW2ldKSRlbmQyKS8yXG4gIHN0YXJ0IDwtIGZsb29yKGNlbnRlciAtIDAuNSp3aW5kb3dTaXplKVxuICBlbmQgPC0gZmxvb3IoY2VudGVyICsgMC41KndpbmRvd1NpemUpXG4gIFxuICBjZi5HMURNU08gPC0gSGljRmlsZShwYXRoID0gaGVyZShoaWNEaXIsIFxcRzEuRE1TTy5NZXJnZWQuaGljXFwpKVxuICBjZi5HMWRUQUcgPC0gSGljRmlsZShwYXRoID0gaGVyZShoaWNEaXIsIFxcRzEuZFRBRy5NZXJnZWQuaGljXFwpKVxuICAjY2YuRzFkVEFHIDwtIEhpY0ZpbGUocGF0aCA9IGhlcmUoaGljRGlyLCBcXEcxLkE0ODUuTWVyZ2VkLmhpY1xcKSlcblxuICByZXMgPC0gMTAqMTAwMFxuICB6bWF4IDwtIDIuNVxuICBoaWMxIDwtIGltcG9ydChjZi5HMURNU08sIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgaGljMiA8LSBpbXBvcnQoY2YuRzFkVEFHLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIHAxIDwtIHBsb3RNYXRyaXgoaGljMSwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKVxuICBwMiA8LSBwbG90TWF0cml4KGhpYzIsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcylcbiAgXG4gIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFx2aXN1emxpYXRpb25fcmVnTG9vcF9kVEFHX1xcLCBpLCBcXF8xMGtiX2ZpZ3VyZVZlclxcKSlcbiAgXG4gIHdpZHRoIDwtIHBhbmVsU2l6ZSgyMCkqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxMCkqbW1Ub0luY2hcbiAgXG4gIHBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KVxuICBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodClcbiAgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG4gIGRldi5vZmYoKVxuICBcbiAgcmVzIDwtIDI1KjEwMDBcbiAgem1heCA8LSAzXG4gIHN0YXJ0IDwtIGZsb29yKGNlbnRlciAtIHdpbmRvd1NpemUpXG4gIGVuZCA8LSBmbG9vcihjZW50ZXIgKyB3aW5kb3dTaXplKVxuICBoaWMxIDwtIGltcG9ydChjZi5HMURNU08sIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgaGljMiA8LSBpbXBvcnQoY2YuRzFkVEFHLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIHAxIDwtIHBsb3RNYXRyaXgoaGljMSwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKVxuICBwMiA8LSBwbG90TWF0cml4KGhpYzIsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcylcbiAgXG4gIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFx2aXN1emxpYXRpb25fcmVnTG9vcF9kVEFHX1xcLCBpLCBcXF8yNWtiXFwpKVxuICBwbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUpXG4gIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gXFxoXFwpKVxuICBkZXYub2ZmKClcbiAgIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KVxuICAjIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gXFxoXFwpKVxuICAjIGRldi5vZmYoKVxuIyB9XG5cbiMjIyMjIyMjIyMjIyMjIFN0clxuIyMgRmlsdGVyaW5nIGxvb3BzIHRvIHBsb3RcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKVxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgc3RySUQsIGRUQUcgPiAwLjUpICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGRUQUcpKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6c2VsZWN0KHNlcSgxLCA2KSlcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxWMVxcLCBcXFYyXFwsIFxcVjNcXCwgXFxWNFxcLCBcXFY1XFwsIFxcVjZcXClcbmxvb3BzIDwtIGltcG9ydEJlZHBlKHRlbXApXG5cbiMgVmlzdWFsaXphdGlvblxuaGljRGlyIDwtIFxcL1ZvbHVtZXMvVUtKSU5fU1NEL0dlbm9taWNzXzAzX0FuYWx5c2lzX1dvcmtpbmcvZGF0YV92YXVsdF8yMDI0c3VtbWVyX21pY3JvQy9oaWNcXFxud2luZG93U2l6ZSA8LSAyKjFlNlxuXG5mb3IoaSBpbiBzZXEoMSwgMjUpKXtcbiAgIyMgTG9hZGluZyBoaWMgYW5kIHBsb3R0aW5nXG4gIGNociA8LSBhc190aWJibGUobG9vcHNbaV0pJHNlcW5hbWVzMVxuICBjZW50ZXIgPC0gKGFzX3RpYmJsZShsb29wc1tpXSkkc3RhcnQxICsgYXNfdGliYmxlKGxvb3BzW2ldKSRlbmQyKS8yXG4gIHN0YXJ0IDwtIGZsb29yKGNlbnRlciAtIDAuNSp3aW5kb3dTaXplKVxuICBlbmQgPC0gZmxvb3IoY2VudGVyICsgMC41KndpbmRvd1NpemUpXG4gIFxuICBjZi5HMURNU08gPC0gSGljRmlsZShwYXRoID0gaGVyZShoaWNEaXIsIFxcRzEuRE1TTy5NZXJnZWQuaGljXFwpKVxuICBjZi5HMWRUQUcgPC0gSGljRmlsZShwYXRoID0gaGVyZShoaWNEaXIsIFxcRzEuZFRBRy5NZXJnZWQuaGljXFwpKVxuXG4gIHJlcyA8LSAxMCoxMDAwXG4gIHptYXggPC0gMi41XG4gIGhpYzEgPC0gaW1wb3J0KGNmLkcxRE1TTywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBoaWMyIDwtIGltcG9ydChjZi5HMWRUQUcsIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgcDEgPC0gcGxvdE1hdHJpeChoaWMxLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpXG4gIHAyIDwtIHBsb3RNYXRyaXgoaGljMiwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKVxuICBcbiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXHZpc3V6bGlhdGlvbl9zdHJMb29wX2RUQUdfXFwsIGksIFxcXzEwa2JcXCkpXG4gIHBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSlcbiAgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG4gIGRldi5vZmYoKVxuICBcbiAgXG4gIHJlcyA8LSAyNSoxMDAwXG4gIHptYXggPC0gM1xuICBzdGFydCA8LSBmbG9vcihjZW50ZXIgLSB3aW5kb3dTaXplKVxuICBlbmQgPC0gZmxvb3IoY2VudGVyICsgd2luZG93U2l6ZSlcbiAgaGljMSA8LSBpbXBvcnQoY2YuRzFETVNPLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIGhpYzIgPC0gaW1wb3J0KGNmLkcxZFRBRywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBwMSA8LSBwbG90TWF0cml4KGhpYzEsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcylcbiAgcDIgPC0gcGxvdE1hdHJpeChoaWMyLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpXG4gIFxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxcdmlzdXpsaWF0aW9uX3N0ckxvb3BfZFRBR19cXCwgaSwgXFxfMjVrYlxcKSlcbiAgcG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KVxuICBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFxcaFxcKSlcbiAgZGV2Lm9mZigpXG59XG5cbiMjIyMjIyMjIyMjIyMjIGRUQUcgY2FsbGVkIGxvb3BzXG4jIyBGaWx0ZXJpbmcgbG9vcHMgdG8gcGxvdFxuZGF0YTEgPC0gZnJlYWQoaGVyZShsb29wRGlyLCBcXEcxLmRUQUcuTWVyZ2VkX2Nocm9tb3NpZ2h0XzI1a2IudHN2XFwpKVxuZGF0YTIgPC0gZnJlYWQoaGVyZShsb29wRGlyLCBcXEcxLmRUQUcuTWVyZ2VkX2Nocm9tb3NpZ2h0XzEwa2IudHN2XFwpKVxuZGF0YTMgPC0gZnJlYWQoaGVyZShsb29wRGlyLCBcXEcxLmRUQUcuTWVyZ2VkX2Nocm9tb3NpZ2h0XzVrYi50c3ZcXCkpXG5kYXRhIDwtIGJpbmRfcm93cyhkYXRhMSwgZGF0YTIsIGRhdGEzKVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2Moc2NvcmUpKVxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDYpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXFYxXFwsIFxcVjJcXCwgXFxWM1xcLCBcXFY0XFwsIFxcVjVcXCwgXFxWNlxcKVxubG9vcHMgPC0gaW1wb3J0QmVkcGUodGVtcClcblxuIyBWaXN1YWxpemF0aW9uXG5oaWNEaXIgPC0gXFwvVm9sdW1lcy9VS0pJTl9TU0QvR2Vub21pY3NfMDNfQW5hbHlzaXNfV29ya2luZy9kYXRhX3ZhdWx0XzIwMjRzdW1tZXJfbWljcm9DL2hpY1xcXG53aW5kb3dTaXplIDwtIDIqMWU2XG5cbmZvcihpIGluIHNlcSgxLCAyNSkpe1xuICAjIyBMb2FkaW5nIGhpYyBhbmQgcGxvdHRpbmdcbiAgY2hyIDwtIGFzX3RpYmJsZShsb29wc1tpXSkkc2VxbmFtZXMxXG4gIGNlbnRlciA8LSAoYXNfdGliYmxlKGxvb3BzW2ldKSRzdGFydDEgKyBhc190aWJibGUobG9vcHNbaV0pJGVuZDIpLzJcbiAgc3RhcnQgPC0gZmxvb3IoY2VudGVyIC0gMC41KndpbmRvd1NpemUpXG4gIGVuZCA8LSBmbG9vcihjZW50ZXIgKyAwLjUqd2luZG93U2l6ZSlcbiAgXG4gIGNmLkcxRE1TTyA8LSBIaWNGaWxlKHBhdGggPSBoZXJlKGhpY0RpciwgXFxHMS5ETVNPLk1lcmdlZC5oaWNcXCkpXG4gIGNmLkcxZFRBRyA8LSBIaWNGaWxlKHBhdGggPSBoZXJlKGhpY0RpciwgXFxHMS5kVEFHLk1lcmdlZC5oaWNcXCkpXG5cbiAgcmVzIDwtIDEwKjEwMDBcbiAgem1heCA8LSAyLjVcbiAgaGljMSA8LSBpbXBvcnQoY2YuRzFETVNPLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIGhpYzIgPC0gaW1wb3J0KGNmLkcxZFRBRywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBwMSA8LSBwbG90TWF0cml4KGhpYzEsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcylcbiAgcDIgPC0gcGxvdE1hdHJpeChoaWMyLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpXG4gIFxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxcdmlzdXpsaWF0aW9uX2RUQUdjYWxsZWRMb29wX2RUQUdfXFwsIGksIFxcXzEwa2JcXCkpXG4gIHBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSlcbiAgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG4gIGRldi5vZmYoKVxuICBcbiAgXG4gIHJlcyA8LSAyNSoxMDAwXG4gIHptYXggPC0gM1xuICBzdGFydCA8LSBmbG9vcihjZW50ZXIgLSB3aW5kb3dTaXplKVxuICBlbmQgPC0gZmxvb3IoY2VudGVyICsgd2luZG93U2l6ZSlcbiAgaGljMSA8LSBpbXBvcnQoY2YuRzFETVNPLCBmb2N1cyA9IHBhc3RlMChjaHIsIFxcOlxcLCBzdGFydCwgXFwtXFwsIGVuZCksIHJlc29sdXRpb24gPSByZXMpXG4gIGhpYzIgPC0gaW1wb3J0KGNmLkcxZFRBRywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBwMSA8LSBwbG90TWF0cml4KGhpYzEsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcylcbiAgcDIgPC0gcGxvdE1hdHJpeChoaWMyLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpXG4gIFxuICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxcdmlzdXpsaWF0aW9uX2RUQUdjYWxsZWRMb29wX2RUQUdfXFwsIGksIFxcXzI1a2JcXCkpXG4gIHBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSlcbiAgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG4gIGRldi5vZmYoKVxufVxuXG5jaHIgPSBcXGNocjEzXFxcbnN0YXJ0ID0gOTY5MDAwMDBcbmVuZCA9IDk4MTAwMDAwXG4gIHJlcyA8LSAxMCoxMDAwXG4gIHptYXggPC0gMi41XG4gIGhpYzEgPC0gaW1wb3J0KGNmLkcxRE1TTywgZm9jdXMgPSBwYXN0ZTAoY2hyLCBcXDpcXCwgc3RhcnQsIFxcLVxcLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKVxuICBoaWMyIDwtIGltcG9ydChjZi5HMWRUQUcsIGZvY3VzID0gcGFzdGUwKGNociwgXFw6XFwsIHN0YXJ0LCBcXC1cXCwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcylcbiAgcDEgPC0gcGxvdE1hdHJpeChoaWMxLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpKVxuICBwMiA8LSBwbG90TWF0cml4KGhpYzIsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCkpXG4gICAgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcXGhcXCkpXG5cbmBgYFxuYGBgIn0= -->

```r
```r
### Getting loop ID
temp <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\)) %>%
  dplyr::mutate(res = V3 - V2,
                id = paste(V1, res, V2, V5, sep = \_\))
regID <- temp$id

temp <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure.bedpe\)) %>%
  dplyr::mutate(res = V3 - V2,
                id = paste(V1, res, V2, V5, sep = \_\))
strID <- temp$id

############## REG
## Filtering loops to plot
data <- fread(here(consensusDir, \chromo_cons_score.tsv\))
temp <- data %>% dplyr::filter(id %in% regID, dTAG > 0.5) %>% dplyr::arrange(desc(dTAG))
temp <- temp %>% dplyr::select(seq(1, 6))
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
loops <- importBedpe(temp)

# Visualization
hicDir <- \/Volumes/UKJIN_SSD/data_vault_2024summer_microC/hic\
windowSize <- 1*1e6

i = 1
# for(i in seq(1, 25)){
  ## Loading hic and plotting
  chr <- as_tibble(loops[i])$seqnames1
  center <- (as_tibble(loops[i])$start1 + as_tibble(loops[i])$end2)/2
  start <- floor(center - 0.5*windowSize)
  end <- floor(center + 0.5*windowSize)
  
  cf.G1DMSO <- HicFile(path = here(hicDir, \G1.DMSO.Merged.hic\))
  cf.G1dTAG <- HicFile(path = here(hicDir, \G1.dTAG.Merged.hic\))
  #cf.G1dTAG <- HicFile(path = here(hicDir, \G1.A485.Merged.hic\))

  res <- 10*1000
  zmax <- 2.5
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax), loop = loops)
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax), loop = loops)
  
  fileName <- here(figDir, paste0(\visuzliation_regLoop_dTAG_\, i, \_10kb_figureVer\))
  
  width <- panelSize(20)*mmToInch
  height <- panelSize(10)*mmToInch
  
  png(paste0(fileName, \.png\), res = 600, units = \in\, width = width, height = height)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
  svglite(paste0(fileName, \.svg\), width = width, height = height)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
  
  res <- 25*1000
  zmax <- 3
  start <- floor(center - windowSize)
  end <- floor(center + windowSize)
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax), loop = loops)
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax), loop = loops)
  
  fileName <- here(figDir, paste0(\visuzliation_regLoop_dTAG_\, i, \_25kb\))
  png(paste0(fileName, \.png\), res = 600, units = \in\, width = 10, height = 5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
  # svglite(paste0(fileName, \.svg\), width = 10, height = 5)
  # print(cowplot::plot_grid(p1, p2, align = \h\))
  # dev.off()
# }

############## Str
## Filtering loops to plot
data <- fread(here(consensusDir, \chromo_cons_score.tsv\))
temp <- data %>% dplyr::filter(id %in% strID, dTAG > 0.5) %>% dplyr::arrange(desc(dTAG))
temp <- temp %>% dplyr::select(seq(1, 6))
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
loops <- importBedpe(temp)

# Visualization
hicDir <- \/Volumes/UKJIN_SSD/Genomics_03_Analysis_Working/data_vault_2024summer_microC/hic\
windowSize <- 2*1e6

for(i in seq(1, 25)){
  ## Loading hic and plotting
  chr <- as_tibble(loops[i])$seqnames1
  center <- (as_tibble(loops[i])$start1 + as_tibble(loops[i])$end2)/2
  start <- floor(center - 0.5*windowSize)
  end <- floor(center + 0.5*windowSize)
  
  cf.G1DMSO <- HicFile(path = here(hicDir, \G1.DMSO.Merged.hic\))
  cf.G1dTAG <- HicFile(path = here(hicDir, \G1.dTAG.Merged.hic\))

  res <- 10*1000
  zmax <- 2.5
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax), loop = loops)
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax), loop = loops)
  
  fileName <- here(figDir, paste0(\visuzliation_strLoop_dTAG_\, i, \_10kb\))
  png(paste0(fileName, \.png\), res = 600, units = \in\, width = 10, height = 5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
  
  
  res <- 25*1000
  zmax <- 3
  start <- floor(center - windowSize)
  end <- floor(center + windowSize)
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax), loop = loops)
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax), loop = loops)
  
  fileName <- here(figDir, paste0(\visuzliation_strLoop_dTAG_\, i, \_25kb\))
  png(paste0(fileName, \.png\), res = 600, units = \in\, width = 10, height = 5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
}

############## dTAG called loops
## Filtering loops to plot
data1 <- fread(here(loopDir, \G1.dTAG.Merged_chromosight_25kb.tsv\))
data2 <- fread(here(loopDir, \G1.dTAG.Merged_chromosight_10kb.tsv\))
data3 <- fread(here(loopDir, \G1.dTAG.Merged_chromosight_5kb.tsv\))
data <- bind_rows(data1, data2, data3)

temp <- data %>% dplyr::arrange(desc(score))

temp <- temp %>% dplyr::select(seq(1, 6))
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
loops <- importBedpe(temp)

# Visualization
hicDir <- \/Volumes/UKJIN_SSD/Genomics_03_Analysis_Working/data_vault_2024summer_microC/hic\
windowSize <- 2*1e6

for(i in seq(1, 25)){
  ## Loading hic and plotting
  chr <- as_tibble(loops[i])$seqnames1
  center <- (as_tibble(loops[i])$start1 + as_tibble(loops[i])$end2)/2
  start <- floor(center - 0.5*windowSize)
  end <- floor(center + 0.5*windowSize)
  
  cf.G1DMSO <- HicFile(path = here(hicDir, \G1.DMSO.Merged.hic\))
  cf.G1dTAG <- HicFile(path = here(hicDir, \G1.dTAG.Merged.hic\))

  res <- 10*1000
  zmax <- 2.5
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax), loop = loops)
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax), loop = loops)
  
  fileName <- here(figDir, paste0(\visuzliation_dTAGcalledLoop_dTAG_\, i, \_10kb\))
  png(paste0(fileName, \.png\), res = 600, units = \in\, width = 10, height = 5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
  
  
  res <- 25*1000
  zmax <- 3
  start <- floor(center - windowSize)
  end <- floor(center + windowSize)
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax), loop = loops)
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax), loop = loops)
  
  fileName <- here(figDir, paste0(\visuzliation_dTAGcalledLoop_dTAG_\, i, \_25kb\))
  png(paste0(fileName, \.png\), res = 600, units = \in\, width = 10, height = 5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
}

chr = \chr13\
start = 96900000
end = 98100000
  res <- 10*1000
  zmax <- 2.5
  hic1 <- import(cf.G1DMSO, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  hic2 <- import(cf.G1dTAG, focus = paste0(chr, \:\, start, \-\, end), resolution = res)
  p1 <- plotMatrix(hic1, dpi = 1000, limits = c(0, zmax))
  p2 <- plotMatrix(hic2, dpi = 1000, limits = c(0, zmax))
    print(cowplot::plot_grid(p1, p2, align = \h\))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

## [2.30] ChromHMM

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHViR2xpY21GeWVTaGphWEpqYkdsNlpTbGNibHh1Ym1GdFpTQThMU0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjSWx4dVpHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lMblJ6ZGx3aUtTa3BYRzUwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2MyVnhLREVzSURZcEtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjSWxZeFhDSXNJRndpVmpKY0lpd2dYQ0pXTTF3aUxDQmNJbFkwWENJc0lGd2lWalZjSWl3Z1hDSldObHdpS1Z4dVkyOXVjeTVzYjI5d0lEd3RJR2x0Y0c5eWRFSmxaSEJsS0hSbGJYQXBYRzVjYmlNZ1EyaGxZMnRwYm1jZ1JFMVRUMXh1Ykc5dmNDNHlOV3RpSUR3dElHbHRjRzl5ZEVKbFpIQmxLR1p5WldGa0tHaGxjbVVvYkc5dmNFUnBjaXdnY0dGemRHVXdLRndpUnpFdVJFMVRUeTVOWlhKblpXUmZZMmh5YjIxdmMybG5hSFJmWENJc0lESTFMQ0JjSW10aUxtSmxaSEJsWENJcEtTa3BYRzVzYjI5d0xqRXdhMklnUEMwZ2FXMXdiM0owUW1Wa2NHVW9abkpsWVdRb2FHVnlaU2hzYjI5d1JHbHlMQ0J3WVhOMFpUQW9YQ0pITVM1RVRWTlBMazFsY21kbFpGOWphSEp2Ylc5emFXZG9kRjljSWl3Z01UQXNJRndpYTJJdVltVmtjR1ZjSWlrcEtTbGNibXh2YjNBdU5XdGlJRHd0SUdsdGNHOXlkRUpsWkhCbEtHWnlaV0ZrS0dobGNtVW9iRzl2Y0VScGNpd2djR0Z6ZEdVd0tGd2lSekV1UkUxVFR5NU5aWEpuWldSZlkyaHliMjF2YzJsbmFIUmZYQ0lzSURVc0lGd2lhMkl1WW1Wa2NHVmNJaWtwS1NsY2JseHVYRzV2ZG1WeWJHRndMakkxYTJJZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dOdmJuTXViRzl2Y0N3Z2JHOXZjQzR5Tld0aUtWeHViM1psY214aGNDNHhNR3RpSUR3dElHWnBibVJQZG1WeWJHRndjeWhqYjI1ekxteHZiM0FzSUd4dmIzQXVNVEJyWWlsY2JtOTJaWEpzWVhBdU5XdGlJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGpiMjV6TG14dmIzQXNJR3h2YjNBdU5XdGlLVnh1WEc1cGJtUmxlQ0E4TFNCemIzSjBLSFZ1YVhGMVpTaGpLSEYxWlhKNVNHbDBjeWh2ZG1WeWJHRndMakkxYTJJcExGeHVJQ0FnSUNBZ0lDQWdjWFZsY25sSWFYUnpLRzkyWlhKc1lYQXVNVEJyWWlrc1hHNGdJQ0FnSUNBZ0lDQnhkV1Z5ZVVocGRITW9iM1psY214aGNDNDFhMklwS1NrcFhHNWtZWFJoSkdOaGJHeGxaRUo1UkUxVFR5QThMU0F3WEc1a1lYUmhKR05oYkd4bFpFSjVSRTFUVDF0cGJtUmxlRjBnUEMwZ01WeHVYRzRqSUVOb1pXTnJhVzVuSUdSVVFVZGNibXh2YjNBdU1qVnJZaUE4TFNCcGJYQnZjblJDWldSd1pTaG1jbVZoWkNob1pYSmxLR3h2YjNCRWFYSXNJSEJoYzNSbE1DaGNJa2N4TG1SVVFVY3VUV1Z5WjJWa1gyTm9jbTl0YjNOcFoyaDBYMXdpTENBeU5Td2dYQ0pyWWk1aVpXUndaVndpS1NrcEtWeHViRzl2Y0M0eE1HdGlJRHd0SUdsdGNHOXlkRUpsWkhCbEtHWnlaV0ZrS0dobGNtVW9iRzl2Y0VScGNpd2djR0Z6ZEdVd0tGd2lSekV1WkZSQlJ5NU5aWEpuWldSZlkyaHliMjF2YzJsbmFIUmZYQ0lzSURFd0xDQmNJbXRpTG1KbFpIQmxYQ0lwS1NrcFhHNXNiMjl3TGpWcllpQThMU0JwYlhCdmNuUkNaV1J3WlNobWNtVmhaQ2hvWlhKbEtHeHZiM0JFYVhJc0lIQmhjM1JsTUNoY0lrY3hMbVJVUVVjdVRXVnlaMlZrWDJOb2NtOXRiM05wWjJoMFgxd2lMQ0ExTENCY0ltdGlMbUpsWkhCbFhDSXBLU2twWEc1Y2JseHViM1psY214aGNDNHlOV3RpSUR3dElHWnBibVJQZG1WeWJHRndjeWhqYjI1ekxteHZiM0FzSUd4dmIzQXVNalZyWWlsY2JtOTJaWEpzWVhBdU1UQnJZaUE4TFNCbWFXNWtUM1psY214aGNITW9ZMjl1Y3k1c2IyOXdMQ0JzYjI5d0xqRXdhMklwWEc1dmRtVnliR0Z3TGpWcllpQThMU0JtYVc1a1QzWmxjbXhoY0hNb1kyOXVjeTVzYjI5d0xDQnNiMjl3TGpWcllpbGNibHh1YVc1a1pYZ2dQQzBnYzI5eWRDaDFibWx4ZFdVb1l5aHhkV1Z5ZVVocGRITW9iM1psY214aGNDNHlOV3RpS1N4Y2JpQWdJQ0FnSUNBZ0lIRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd0xqRXdhMklwTEZ4dUlDQWdJQ0FnSUNBZ2NYVmxjbmxJYVhSektHOTJaWEpzWVhBdU5XdGlLU2twS1Z4dVpHRjBZU1JqWVd4c1pXUkNlV1JVUVVjZ1BDMGdNRnh1WkdGMFlTUmpZV3hzWldSQ2VXUlVRVWRiYVc1a1pYaGRJRHd0SURGY2JseHVJeUJEYUdWamEybHVaeUJCTkRnMVhHNXNiMjl3TGpJMWEySWdQQzBnYVcxd2IzSjBRbVZrY0dVb1puSmxZV1FvYUdWeVpTaHNiMjl3UkdseUxDQndZWE4wWlRBb1hDSkhNUzVCTkRnMUxrMWxjbWRsWkY5amFISnZiVzl6YVdkb2RGOWNJaXdnTWpVc0lGd2lhMkl1WW1Wa2NHVmNJaWtwS1NsY2JteHZiM0F1TVRCcllpQThMU0JwYlhCdmNuUkNaV1J3WlNobWNtVmhaQ2hvWlhKbEtHeHZiM0JFYVhJc0lIQmhjM1JsTUNoY0lrY3hMa0UwT0RVdVRXVnlaMlZrWDJOb2NtOXRiM05wWjJoMFgxd2lMQ0F4TUN3Z1hDSnJZaTVpWldSd1pWd2lLU2twS1Z4dWJHOXZjQzQxYTJJZ1BDMGdhVzF3YjNKMFFtVmtjR1VvWm5KbFlXUW9hR1Z5WlNoc2IyOXdSR2x5TENCd1lYTjBaVEFvWENKSE1TNUJORGcxTGsxbGNtZGxaRjlqYUhKdmJXOXphV2RvZEY5Y0lpd2dOU3dnWENKcllpNWlaV1J3WlZ3aUtTa3BLVnh1WEc1Y2JtOTJaWEpzWVhBdU1qVnJZaUE4TFNCbWFXNWtUM1psY214aGNITW9ZMjl1Y3k1c2IyOXdMQ0JzYjI5d0xqSTFhMklwWEc1dmRtVnliR0Z3TGpFd2EySWdQQzBnWm1sdVpFOTJaWEpzWVhCektHTnZibk11Ykc5dmNDd2diRzl2Y0M0eE1HdGlLVnh1YjNabGNteGhjQzQxYTJJZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dOdmJuTXViRzl2Y0N3Z2JHOXZjQzQxYTJJcFhHNWNibWx1WkdWNElEd3RJSE52Y25Rb2RXNXBjWFZsS0dNb2NYVmxjbmxJYVhSektHOTJaWEpzWVhBdU1qVnJZaWtzWEc0Z0lDQWdJQ0FnSUNCeGRXVnllVWhwZEhNb2IzWmxjbXhoY0M0eE1HdGlLU3hjYmlBZ0lDQWdJQ0FnSUhGMVpYSjVTR2wwY3lodmRtVnliR0Z3TGpWcllpa3BLU2xjYm1SaGRHRWtZMkZzYkdWa1FubEJORGcxSUR3dElEQmNibVJoZEdFa1kyRnNiR1ZrUW5sQk5EZzFXMmx1WkdWNFhTQThMU0F4WEc1Y2JseHVJeUJJWldGMGJXRndJQ2hqYUdWamEybHVaeUIzYUdWMGFHVnlJR05sY25SaGFXNGdjR1ZoYXlCcGN5QmpZV3hzWldRZ1lua2djM0JsWTJsbWFXTWdjMkZ0Y0d4bEtWeHVaR0YwWVZSdlVHeHZkQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR2xrTENCallXeHNaV1JDZVVSTlUwOHNJR05oYkd4bFpFSjVaRlJCUnl3Z1kyRnNiR1ZrUW5sQk5EZzFLVnh1WkdGMFlWUnZVR3h2ZENBOExTQmtZWFJoVkc5UWJHOTBJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR1pzWVdjZ1BTQTBLbU5oYkd4bFpFSjVSRTFUVHlBcklESXFZMkZzYkdWa1FubGtWRUZISUNzZ1kyRnNiR1ZrUW5sQk5EZzFLU0FsUGlWY2JpQWdaSEJzZVhJNk9tRnljbUZ1WjJVb1pHVnpZeWhtYkdGbktTbGNibHh1Y205M1gyZHliM1Z3Y3lBOExTQmtZWFJoVkc5UWJHOTBKR1pzWVdkY2JtUmhkR0ZmYldGMGNtbDRJRHd0SUdSaGRHRlViMUJzYjNRZ0pUNGxJR052YkhWdGJsOTBiMTl5YjNkdVlXMWxjeWgyWVhJZ1BTQmNJbWxrWENJcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtDMW1iR0ZuS1NBbFBpVWdZWE11YldGMGNtbDRLQ2xjYm1OdmJGOW1kVzRnUEMwZ1kyOXNiM0pTWVcxd01paGpLREFzSURFcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaktGd2lkMmhwZEdWY0lpd2dYQ0puY21WbGJsd2lLU2xjYm1neElEd3RJRWhsWVhSdFlYQW9aR0YwWVY5dFlYUnlhWGdzSUc1aGJXVWdQU0JjSW1OaGJHeGxaRUo1WENJc1hHNGdJQ0FnSUNBZ0lHTnNkWE4wWlhKZlkyOXNkVzF1Y3lBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5WDNKdmQzTWdQU0JHUVV4VFJTeGNiaUFnSUNBZ0lDQWdjMmh2ZDE5eWIzZGZaR1Z1WkNBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCaWIzSmtaWElnUFNCVVVsVkZMRnh1SUNBZ0lDQWdJQ0J6YUc5M1gzSnZkMTl1WVcxbGN5QTlJRVpCVEZORkxGeHVJQ0FnSUNBZ0lDQmpiMndnUFNCamIyeGZablZ1TEZ4dUlDQWdJQ0FnSUNCeWIzZGZjM0JzYVhRZ1BTQnliM2RmWjNKdmRYQnpLVnh1WEc1Y2JpTWdVSEpsY0dGeVpTQmtZWFJoSUdadmNpQjBhR1VnYzJWamIyNWtJR2hsWVhSdFlYQmNibVJoZEdGVWIxQnNiM1F5SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvYVdRc0lFUk5VMDhzSUdSVVFVY3NJRUUwT0RVcElDVStKVnh1SUNCaGNuSmhibWRsS0cxaGRHTm9LR2xrTENCa1lYUmhWRzlRYkc5MEpHbGtLU2xjYmx4dVpHRjBZVjl0WVhSeWFYZ3lJRHd0SUdSaGRHRlViMUJzYjNReUlDVStKU0JqYjJ4MWJXNWZkRzlmY205M2JtRnRaWE1vZG1GeUlEMGdYQ0pwWkZ3aUtTQWxQaVVnWVhNdWJXRjBjbWw0S0NsY2JseHVYRzVqYjJ4ZlpuVnVNaUE4TFNCamIyeHZjbEpoYlhBeUtHTW9MVEF1TlN3Z01Dd2dNU2tzSUdNb1hDSmliSFZsWENJc0lGd2lkMmhwZEdWY0lpd2dYQ0p5WldSY0lpa3BYRzVjYm1neUlEd3RJRWhsWVhSdFlYQW9aR0YwWVY5dFlYUnlhWGd5TENCdVlXMWxJRDBnWENKelkyOXlaVndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JqYkhWemRHVnlYMk52YkhWdGJuTWdQU0JHUVV4VFJTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ1kyeDFjM1JsY2w5eWIzZHpJRDBnVkZKVlJTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2MyaHZkMTl5YjNkZlpHVnVaQ0E5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQmliM0prWlhJZ1BTQlVVbFZGTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUc5M1gzSnZkMTl1WVcxbGN5QTlJRVpCVEZORkxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyd2dQU0JqYjJ4ZlpuVnVNaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdjbTkzWDNOd2JHbDBJRDBnY205M1gyZHliM1Z3Y3lsY2JseHVYRzVtYVd4bFRtRnRaU0E4TFNCb1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tGd2lhR1ZoZEcxaGNGOWphR1ZqYTJsdVoxTmhiWEJzWlVOaGJHeGxaRXh2YjNCelhDSXBLVnh1Y0c1bktIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhSeklEMGdYQ0pwYmx3aUxDQjNhV1IwYUNBOUlETXNJR2hsYVdkb2RDQTlJREV3S1Z4dWNISnBiblFvYURFZ0t5Qm9NaWxjYm1SbGRpNXZabVlvS1Z4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxubGlicmFyeShjaXJjbGl6ZSlcblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDYpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXFYxXFwsIFxcVjJcXCwgXFxWM1xcLCBcXFY0XFwsIFxcVjVcXCwgXFxWNlxcKVxuY29ucy5sb29wIDwtIGltcG9ydEJlZHBlKHRlbXApXG5cbiMgQ2hlY2tpbmcgRE1TT1xubG9vcC4yNWtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKFxcRzEuRE1TTy5NZXJnZWRfY2hyb21vc2lnaHRfXFwsIDI1LCBcXGtiLmJlZHBlXFwpKSkpXG5sb29wLjEwa2IgPC0gaW1wb3J0QmVkcGUoZnJlYWQoaGVyZShsb29wRGlyLCBwYXN0ZTAoXFxHMS5ETVNPLk1lcmdlZF9jaHJvbW9zaWdodF9cXCwgMTAsIFxca2IuYmVkcGVcXCkpKSlcbmxvb3AuNWtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKFxcRzEuRE1TTy5NZXJnZWRfY2hyb21vc2lnaHRfXFwsIDUsIFxca2IuYmVkcGVcXCkpKSlcblxuXG5vdmVybGFwLjI1a2IgPC0gZmluZE92ZXJsYXBzKGNvbnMubG9vcCwgbG9vcC4yNWtiKVxub3ZlcmxhcC4xMGtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuMTBrYilcbm92ZXJsYXAuNWtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuNWtiKVxuXG5pbmRleCA8LSBzb3J0KHVuaXF1ZShjKHF1ZXJ5SGl0cyhvdmVybGFwLjI1a2IpLFxuICAgICAgICAgcXVlcnlIaXRzKG92ZXJsYXAuMTBrYiksXG4gICAgICAgICBxdWVyeUhpdHMob3ZlcmxhcC41a2IpKSkpXG5kYXRhJGNhbGxlZEJ5RE1TTyA8LSAwXG5kYXRhJGNhbGxlZEJ5RE1TT1tpbmRleF0gPC0gMVxuXG4jIENoZWNraW5nIGRUQUdcbmxvb3AuMjVrYiA8LSBpbXBvcnRCZWRwZShmcmVhZChoZXJlKGxvb3BEaXIsIHBhc3RlMChcXEcxLmRUQUcuTWVyZ2VkX2Nocm9tb3NpZ2h0X1xcLCAyNSwgXFxrYi5iZWRwZVxcKSkpKVxubG9vcC4xMGtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKFxcRzEuZFRBRy5NZXJnZWRfY2hyb21vc2lnaHRfXFwsIDEwLCBcXGtiLmJlZHBlXFwpKSkpXG5sb29wLjVrYiA8LSBpbXBvcnRCZWRwZShmcmVhZChoZXJlKGxvb3BEaXIsIHBhc3RlMChcXEcxLmRUQUcuTWVyZ2VkX2Nocm9tb3NpZ2h0X1xcLCA1LCBcXGtiLmJlZHBlXFwpKSkpXG5cblxub3ZlcmxhcC4yNWtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuMjVrYilcbm92ZXJsYXAuMTBrYiA8LSBmaW5kT3ZlcmxhcHMoY29ucy5sb29wLCBsb29wLjEwa2IpXG5vdmVybGFwLjVrYiA8LSBmaW5kT3ZlcmxhcHMoY29ucy5sb29wLCBsb29wLjVrYilcblxuaW5kZXggPC0gc29ydCh1bmlxdWUoYyhxdWVyeUhpdHMob3ZlcmxhcC4yNWtiKSxcbiAgICAgICAgIHF1ZXJ5SGl0cyhvdmVybGFwLjEwa2IpLFxuICAgICAgICAgcXVlcnlIaXRzKG92ZXJsYXAuNWtiKSkpKVxuZGF0YSRjYWxsZWRCeWRUQUcgPC0gMFxuZGF0YSRjYWxsZWRCeWRUQUdbaW5kZXhdIDwtIDFcblxuIyBDaGVja2luZyBBNDg1XG5sb29wLjI1a2IgPC0gaW1wb3J0QmVkcGUoZnJlYWQoaGVyZShsb29wRGlyLCBwYXN0ZTAoXFxHMS5BNDg1Lk1lcmdlZF9jaHJvbW9zaWdodF9cXCwgMjUsIFxca2IuYmVkcGVcXCkpKSlcbmxvb3AuMTBrYiA8LSBpbXBvcnRCZWRwZShmcmVhZChoZXJlKGxvb3BEaXIsIHBhc3RlMChcXEcxLkE0ODUuTWVyZ2VkX2Nocm9tb3NpZ2h0X1xcLCAxMCwgXFxrYi5iZWRwZVxcKSkpKVxubG9vcC41a2IgPC0gaW1wb3J0QmVkcGUoZnJlYWQoaGVyZShsb29wRGlyLCBwYXN0ZTAoXFxHMS5BNDg1Lk1lcmdlZF9jaHJvbW9zaWdodF9cXCwgNSwgXFxrYi5iZWRwZVxcKSkpKVxuXG5cbm92ZXJsYXAuMjVrYiA8LSBmaW5kT3ZlcmxhcHMoY29ucy5sb29wLCBsb29wLjI1a2IpXG5vdmVybGFwLjEwa2IgPC0gZmluZE92ZXJsYXBzKGNvbnMubG9vcCwgbG9vcC4xMGtiKVxub3ZlcmxhcC41a2IgPC0gZmluZE92ZXJsYXBzKGNvbnMubG9vcCwgbG9vcC41a2IpXG5cbmluZGV4IDwtIHNvcnQodW5pcXVlKGMocXVlcnlIaXRzKG92ZXJsYXAuMjVrYiksXG4gICAgICAgICBxdWVyeUhpdHMob3ZlcmxhcC4xMGtiKSxcbiAgICAgICAgIHF1ZXJ5SGl0cyhvdmVybGFwLjVrYikpKSlcbmRhdGEkY2FsbGVkQnlBNDg1IDwtIDBcbmRhdGEkY2FsbGVkQnlBNDg1W2luZGV4XSA8LSAxXG5cblxuIyBIZWF0bWFwIChjaGVja2luZyB3aGV0aGVyIGNlcnRhaW4gcGVhayBpcyBjYWxsZWQgYnkgc3BlY2lmaWMgc2FtcGxlKVxuZGF0YVRvUGxvdCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KGlkLCBjYWxsZWRCeURNU08sIGNhbGxlZEJ5ZFRBRywgY2FsbGVkQnlBNDg1KVxuZGF0YVRvUGxvdCA8LSBkYXRhVG9QbG90ICU+JSBkcGx5cjo6bXV0YXRlKGZsYWcgPSA0KmNhbGxlZEJ5RE1TTyArIDIqY2FsbGVkQnlkVEFHICsgY2FsbGVkQnlBNDg1KSAlPiVcbiAgZHBseXI6OmFycmFuZ2UoZGVzYyhmbGFnKSlcblxucm93X2dyb3VwcyA8LSBkYXRhVG9QbG90JGZsYWdcbmRhdGFfbWF0cml4IDwtIGRhdGFUb1Bsb3QgJT4lIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXGlkXFwpICU+JSBkcGx5cjo6c2VsZWN0KC1mbGFnKSAlPiUgYXMubWF0cml4KClcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcd2hpdGVcXCwgXFxncmVlblxcKSlcbmgxIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgsIG5hbWUgPSBcXGNhbGxlZEJ5XFwsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBib3JkZXIgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICByb3dfc3BsaXQgPSByb3dfZ3JvdXBzKVxuXG5cbiMgUHJlcGFyZSBkYXRhIGZvciB0aGUgc2Vjb25kIGhlYXRtYXBcbmRhdGFUb1Bsb3QyIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoaWQsIERNU08sIGRUQUcsIEE0ODUpICU+JVxuICBhcnJhbmdlKG1hdGNoKGlkLCBkYXRhVG9QbG90JGlkKSlcblxuZGF0YV9tYXRyaXgyIDwtIGRhdGFUb1Bsb3QyICU+JSBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFxpZFxcKSAlPiUgYXMubWF0cml4KClcblxuXG5jb2xfZnVuMiA8LSBjb2xvclJhbXAyKGMoLTAuNSwgMCwgMSksIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbmgyIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgyLCBuYW1lID0gXFxzY29yZVxcLFxuICAgICAgICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICAgICAgICBib3JkZXIgPSBUUlVFLFxuICAgICAgICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLFxuICAgICAgICAgICAgICBjb2wgPSBjb2xfZnVuMixcbiAgICAgICAgICAgICAgcm93X3NwbGl0ID0gcm93X2dyb3VwcylcblxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxcaGVhdG1hcF9jaGVja2luZ1NhbXBsZUNhbGxlZExvb3BzXFwpKVxucG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDMsIGhlaWdodCA9IDEwKVxucHJpbnQoaDEgKyBoMilcbmRldi5vZmYoKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
library(circlize)

name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
temp <- data %>% dplyr::select(seq(1, 6))
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
cons.loop <- importBedpe(temp)

# Checking DMSO
loop.25kb <- importBedpe(fread(here(loopDir, paste0(\G1.DMSO.Merged_chromosight_\, 25, \kb.bedpe\))))
loop.10kb <- importBedpe(fread(here(loopDir, paste0(\G1.DMSO.Merged_chromosight_\, 10, \kb.bedpe\))))
loop.5kb <- importBedpe(fread(here(loopDir, paste0(\G1.DMSO.Merged_chromosight_\, 5, \kb.bedpe\))))


overlap.25kb <- findOverlaps(cons.loop, loop.25kb)
overlap.10kb <- findOverlaps(cons.loop, loop.10kb)
overlap.5kb <- findOverlaps(cons.loop, loop.5kb)

index <- sort(unique(c(queryHits(overlap.25kb),
         queryHits(overlap.10kb),
         queryHits(overlap.5kb))))
data$calledByDMSO <- 0
data$calledByDMSO[index] <- 1

# Checking dTAG
loop.25kb <- importBedpe(fread(here(loopDir, paste0(\G1.dTAG.Merged_chromosight_\, 25, \kb.bedpe\))))
loop.10kb <- importBedpe(fread(here(loopDir, paste0(\G1.dTAG.Merged_chromosight_\, 10, \kb.bedpe\))))
loop.5kb <- importBedpe(fread(here(loopDir, paste0(\G1.dTAG.Merged_chromosight_\, 5, \kb.bedpe\))))


overlap.25kb <- findOverlaps(cons.loop, loop.25kb)
overlap.10kb <- findOverlaps(cons.loop, loop.10kb)
overlap.5kb <- findOverlaps(cons.loop, loop.5kb)

index <- sort(unique(c(queryHits(overlap.25kb),
         queryHits(overlap.10kb),
         queryHits(overlap.5kb))))
data$calledBydTAG <- 0
data$calledBydTAG[index] <- 1

# Checking A485
loop.25kb <- importBedpe(fread(here(loopDir, paste0(\G1.A485.Merged_chromosight_\, 25, \kb.bedpe\))))
loop.10kb <- importBedpe(fread(here(loopDir, paste0(\G1.A485.Merged_chromosight_\, 10, \kb.bedpe\))))
loop.5kb <- importBedpe(fread(here(loopDir, paste0(\G1.A485.Merged_chromosight_\, 5, \kb.bedpe\))))


overlap.25kb <- findOverlaps(cons.loop, loop.25kb)
overlap.10kb <- findOverlaps(cons.loop, loop.10kb)
overlap.5kb <- findOverlaps(cons.loop, loop.5kb)

index <- sort(unique(c(queryHits(overlap.25kb),
         queryHits(overlap.10kb),
         queryHits(overlap.5kb))))
data$calledByA485 <- 0
data$calledByA485[index] <- 1


# Heatmap (checking whether certain peak is called by specific sample)
dataToPlot <- data %>% dplyr::select(id, calledByDMSO, calledBydTAG, calledByA485)
dataToPlot <- dataToPlot %>% dplyr::mutate(flag = 4*calledByDMSO + 2*calledBydTAG + calledByA485) %>%
  dplyr::arrange(desc(flag))

row_groups <- dataToPlot$flag
data_matrix <- dataToPlot %>% column_to_rownames(var = \id\) %>% dplyr::select(-flag) %>% as.matrix()
col_fun <- colorRamp2(c(0, 1), 
                      c(\white\, \green\))
h1 <- Heatmap(data_matrix, name = \calledBy\,
        cluster_columns = FALSE,
        cluster_rows = FALSE,
        show_row_dend = FALSE,
        border = TRUE,
        show_row_names = FALSE,
        col = col_fun,
        row_split = row_groups)


# Prepare data for the second heatmap
dataToPlot2 <- data %>% dplyr::select(id, DMSO, dTAG, A485) %>%
  arrange(match(id, dataToPlot$id))

data_matrix2 <- dataToPlot2 %>% column_to_rownames(var = \id\) %>% as.matrix()


col_fun2 <- colorRamp2(c(-0.5, 0, 1), c(\blue\, \white\, \red\))

h2 <- Heatmap(data_matrix2, name = \score\,
              cluster_columns = FALSE,
              cluster_rows = TRUE,
              show_row_dend = FALSE,
              border = TRUE,
              show_row_names = FALSE,
              col = col_fun2,
              row_split = row_groups)


fileName <- here(figDir, paste0(\heatmap_checkingSampleCalledLoops\))
png(paste0(fileName, \.png\), res = 600, units = \in\, width = 3, height = 10)
print(h1 + h2)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJHbGljbUZ5ZVNoamFYSmpiR2w2WlNsY2JseHVibUZ0WlNBOExTQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNYRnh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y0xuUnpkbHhjS1NrcFhHNTBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvYzJWeEtERXNJRFlwS1Z4dVkyOXNibUZ0WlhNb2RHVnRjQ2tnUEMwZ1l5aGNYRll4WEZ3c0lGeGNWakpjWEN3Z1hGeFdNMXhjTENCY1hGWTBYRndzSUZ4Y1ZqVmNYQ3dnWEZ4V05seGNLVnh1WTI5dWN5NXNiMjl3SUR3dElHbHRjRzl5ZEVKbFpIQmxLSFJsYlhBcFhHNWNiaU1nUTJobFkydHBibWNnUkUxVFQxeHViRzl2Y0M0eU5XdGlJRHd0SUdsdGNHOXlkRUpsWkhCbEtHWnlaV0ZrS0dobGNtVW9iRzl2Y0VScGNpd2djR0Z6ZEdVd0tGeGNSekV1UkUxVFR5NU5aWEpuWldSZlkyaHliMjF2YzJsbmFIUmZYRndzSURJMUxDQmNYR3RpTG1KbFpIQmxYRndwS1NrcFhHNXNiMjl3TGpFd2EySWdQQzBnYVcxd2IzSjBRbVZrY0dVb1puSmxZV1FvYUdWeVpTaHNiMjl3UkdseUxDQndZWE4wWlRBb1hGeEhNUzVFVFZOUExrMWxjbWRsWkY5amFISnZiVzl6YVdkb2RGOWNYQ3dnTVRBc0lGeGNhMkl1WW1Wa2NHVmNYQ2twS1NsY2JteHZiM0F1Tld0aUlEd3RJR2x0Y0c5eWRFSmxaSEJsS0daeVpXRmtLR2hsY21Vb2JHOXZjRVJwY2l3Z2NHRnpkR1V3S0Z4Y1J6RXVSRTFUVHk1TlpYSm5aV1JmWTJoeWIyMXZjMmxuYUhSZlhGd3NJRFVzSUZ4Y2EySXVZbVZrY0dWY1hDa3BLU2xjYmx4dVhHNXZkbVZ5YkdGd0xqSTFhMklnUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR052Ym5NdWJHOXZjQ3dnYkc5dmNDNHlOV3RpS1Z4dWIzWmxjbXhoY0M0eE1HdGlJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGpiMjV6TG14dmIzQXNJR3h2YjNBdU1UQnJZaWxjYm05MlpYSnNZWEF1Tld0aUlEd3RJR1pwYm1SUGRtVnliR0Z3Y3loamIyNXpMbXh2YjNBc0lHeHZiM0F1Tld0aUtWeHVYRzVwYm1SbGVDQThMU0J6YjNKMEtIVnVhWEYxWlNoaktIRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd0xqSTFhMklwTEZ4dUlDQWdJQ0FnSUNBZ2NYVmxjbmxJYVhSektHOTJaWEpzWVhBdU1UQnJZaWtzWEc0Z0lDQWdJQ0FnSUNCeGRXVnllVWhwZEhNb2IzWmxjbXhoY0M0MWEySXBLU2twWEc1a1lYUmhKR05oYkd4bFpFSjVSRTFUVHlBOExTQXdYRzVrWVhSaEpHTmhiR3hsWkVKNVJFMVRUMXRwYm1SbGVGMGdQQzBnTVZ4dVhHNGpJRU5vWldOcmFXNW5JR1JVUVVkY2JteHZiM0F1TWpWcllpQThMU0JwYlhCdmNuUkNaV1J3WlNobWNtVmhaQ2hvWlhKbEtHeHZiM0JFYVhJc0lIQmhjM1JsTUNoY1hFY3hMbVJVUVVjdVRXVnlaMlZrWDJOb2NtOXRiM05wWjJoMFgxeGNMQ0F5TlN3Z1hGeHJZaTVpWldSd1pWeGNLU2twS1Z4dWJHOXZjQzR4TUd0aUlEd3RJR2x0Y0c5eWRFSmxaSEJsS0daeVpXRmtLR2hsY21Vb2JHOXZjRVJwY2l3Z2NHRnpkR1V3S0Z4Y1J6RXVaRlJCUnk1TlpYSm5aV1JmWTJoeWIyMXZjMmxuYUhSZlhGd3NJREV3TENCY1hHdGlMbUpsWkhCbFhGd3BLU2twWEc1c2IyOXdMalZyWWlBOExTQnBiWEJ2Y25SQ1pXUndaU2htY21WaFpDaG9aWEpsS0d4dmIzQkVhWElzSUhCaGMzUmxNQ2hjWEVjeExtUlVRVWN1VFdWeVoyVmtYMk5vY205dGIzTnBaMmgwWDF4Y0xDQTFMQ0JjWEd0aUxtSmxaSEJsWEZ3cEtTa3BYRzVjYmx4dWIzWmxjbXhoY0M0eU5XdGlJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGpiMjV6TG14dmIzQXNJR3h2YjNBdU1qVnJZaWxjYm05MlpYSnNZWEF1TVRCcllpQThMU0JtYVc1a1QzWmxjbXhoY0hNb1kyOXVjeTVzYjI5d0xDQnNiMjl3TGpFd2EySXBYRzV2ZG1WeWJHRndMalZyWWlBOExTQm1hVzVrVDNabGNteGhjSE1vWTI5dWN5NXNiMjl3TENCc2IyOXdMalZyWWlsY2JseHVhVzVrWlhnZ1BDMGdjMjl5ZENoMWJtbHhkV1VvWXloeGRXVnllVWhwZEhNb2IzWmxjbXhoY0M0eU5XdGlLU3hjYmlBZ0lDQWdJQ0FnSUhGMVpYSjVTR2wwY3lodmRtVnliR0Z3TGpFd2EySXBMRnh1SUNBZ0lDQWdJQ0FnY1hWbGNubElhWFJ6S0c5MlpYSnNZWEF1Tld0aUtTa3BLVnh1WkdGMFlTUmpZV3hzWldSQ2VXUlVRVWNnUEMwZ01GeHVaR0YwWVNSallXeHNaV1JDZVdSVVFVZGJhVzVrWlhoZElEd3RJREZjYmx4dUl5QkRhR1ZqYTJsdVp5QkJORGcxWEc1c2IyOXdMakkxYTJJZ1BDMGdhVzF3YjNKMFFtVmtjR1VvWm5KbFlXUW9hR1Z5WlNoc2IyOXdSR2x5TENCd1lYTjBaVEFvWEZ4SE1TNUJORGcxTGsxbGNtZGxaRjlqYUhKdmJXOXphV2RvZEY5Y1hDd2dNalVzSUZ4Y2EySXVZbVZrY0dWY1hDa3BLU2xjYm14dmIzQXVNVEJyWWlBOExTQnBiWEJ2Y25SQ1pXUndaU2htY21WaFpDaG9aWEpsS0d4dmIzQkVhWElzSUhCaGMzUmxNQ2hjWEVjeExrRTBPRFV1VFdWeVoyVmtYMk5vY205dGIzTnBaMmgwWDF4Y0xDQXhNQ3dnWEZ4cllpNWlaV1J3WlZ4Y0tTa3BLVnh1Ykc5dmNDNDFhMklnUEMwZ2FXMXdiM0owUW1Wa2NHVW9abkpsWVdRb2FHVnlaU2hzYjI5d1JHbHlMQ0J3WVhOMFpUQW9YRnhITVM1Qk5EZzFMazFsY21kbFpGOWphSEp2Ylc5emFXZG9kRjljWEN3Z05Td2dYRnhyWWk1aVpXUndaVnhjS1NrcEtWeHVYRzVjYm05MlpYSnNZWEF1TWpWcllpQThMU0JtYVc1a1QzWmxjbXhoY0hNb1kyOXVjeTVzYjI5d0xDQnNiMjl3TGpJMWEySXBYRzV2ZG1WeWJHRndMakV3YTJJZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dOdmJuTXViRzl2Y0N3Z2JHOXZjQzR4TUd0aUtWeHViM1psY214aGNDNDFhMklnUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR052Ym5NdWJHOXZjQ3dnYkc5dmNDNDFhMklwWEc1Y2JtbHVaR1Y0SUR3dElITnZjblFvZFc1cGNYVmxLR01vY1hWbGNubElhWFJ6S0c5MlpYSnNZWEF1TWpWcllpa3NYRzRnSUNBZ0lDQWdJQ0J4ZFdWeWVVaHBkSE1vYjNabGNteGhjQzR4TUd0aUtTeGNiaUFnSUNBZ0lDQWdJSEYxWlhKNVNHbDBjeWh2ZG1WeWJHRndMalZyWWlrcEtTbGNibVJoZEdFa1kyRnNiR1ZrUW5sQk5EZzFJRHd0SURCY2JtUmhkR0VrWTJGc2JHVmtRbmxCTkRnMVcybHVaR1Y0WFNBOExTQXhYRzVjYmx4dUl5QklaV0YwYldGd0lDaGphR1ZqYTJsdVp5QjNhR1YwYUdWeUlHTmxjblJoYVc0Z2NHVmhheUJwY3lCallXeHNaV1FnWW5rZ2MzQmxZMmxtYVdNZ2MyRnRjR3hsS1Z4dVpHRjBZVlJ2VUd4dmRDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHbGtMQ0JqWVd4c1pXUkNlVVJOVTA4c0lHTmhiR3hsWkVKNVpGUkJSeXdnWTJGc2JHVmtRbmxCTkRnMUtWeHVaR0YwWVZSdlVHeHZkQ0E4TFNCa1lYUmhWRzlRYkc5MElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHWnNZV2NnUFNBMEttTmhiR3hsWkVKNVJFMVRUeUFySURJcVkyRnNiR1ZrUW5sa1ZFRkhJQ3NnWTJGc2JHVmtRbmxCTkRnMUtTQWxQaVZjYmlBZ1pIQnNlWEk2T21GeWNtRnVaMlVvWkdWell5aG1iR0ZuS1NsY2JseHVjbTkzWDJkeWIzVndjeUE4TFNCa1lYUmhWRzlRYkc5MEpHWnNZV2RjYm1SaGRHRmZiV0YwY21sNElEd3RJR1JoZEdGVWIxQnNiM1FnSlQ0bElHTnZiSFZ0Ymw5MGIxOXliM2R1WVcxbGN5aDJZWElnUFNCY1hHbGtYRndwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0MxbWJHRm5LU0FsUGlVZ1lYTXViV0YwY21sNEtDbGNibU52YkY5bWRXNGdQQzBnWTI5c2IzSlNZVzF3TWloaktEQXNJREVwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqS0Z4Y2QyaHBkR1ZjWEN3Z1hGeG5jbVZsYmx4Y0tTbGNibWd4SUR3dElFaGxZWFJ0WVhBb1pHRjBZVjl0WVhSeWFYZ3NJRzVoYldVZ1BTQmNYR05oYkd4bFpFSjVYRndzWEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpmWTI5c2RXMXVjeUE5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JqYkhWemRHVnlYM0p2ZDNNZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ2MyaHZkMTl5YjNkZlpHVnVaQ0E5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JpYjNKa1pYSWdQU0JVVWxWRkxGeHVJQ0FnSUNBZ0lDQnphRzkzWDNKdmQxOXVZVzFsY3lBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCamIyd2dQU0JqYjJ4ZlpuVnVMRnh1SUNBZ0lDQWdJQ0J5YjNkZmMzQnNhWFFnUFNCeWIzZGZaM0p2ZFhCektWeHVYRzVjYmlNZ1VISmxjR0Z5WlNCa1lYUmhJR1p2Y2lCMGFHVWdjMlZqYjI1a0lHaGxZWFJ0WVhCY2JtUmhkR0ZVYjFCc2IzUXlJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9hV1FzSUVSTlUwOHNJR1JVUVVjc0lFRTBPRFVwSUNVK0pWeHVJQ0JoY25KaGJtZGxLRzFoZEdOb0tHbGtMQ0JrWVhSaFZHOVFiRzkwSkdsa0tTbGNibHh1WkdGMFlWOXRZWFJ5YVhneUlEd3RJR1JoZEdGVWIxQnNiM1F5SUNVK0pTQmpiMngxYlc1ZmRHOWZjbTkzYm1GdFpYTW9kbUZ5SUQwZ1hGeHBaRnhjS1NBbFBpVWdZWE11YldGMGNtbDRLQ2xjYmx4dVhHNWpiMnhmWm5WdU1pQThMU0JqYjJ4dmNsSmhiWEF5S0dNb0xUQXVOU3dnTUN3Z01Ta3NJR01vWEZ4aWJIVmxYRndzSUZ4Y2QyaHBkR1ZjWEN3Z1hGeHlaV1JjWENrcFhHNWNibWd5SUR3dElFaGxZWFJ0WVhBb1pHRjBZVjl0WVhSeWFYZ3lMQ0J1WVcxbElEMGdYRnh6WTI5eVpWeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeVgyTnZiSFZ0Ym5NZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJ4MWMzUmxjbDl5YjNkeklEMGdWRkpWUlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJodmQxOXliM2RmWkdWdVpDQTlJRVpCVEZORkxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWIzSmtaWElnUFNCVVVsVkZMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQnphRzkzWDNKdmQxOXVZVzFsY3lBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ3Z1BTQmpiMnhmWm5WdU1peGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2NtOTNYM053YkdsMElEMGdjbTkzWDJkeWIzVndjeWxjYmx4dVhHNW1hV3hsVG1GdFpTQThMU0JvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0Z4Y2FHVmhkRzFoY0Y5amFHVmphMmx1WjFOaGJYQnNaVU5oYkd4bFpFeHZiM0J6WEZ3cEtWeHVjRzVuS0hCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwTENCeVpYTWdQU0EyTURBc0lIVnVhWFJ6SUQwZ1hGeHBibHhjTENCM2FXUjBhQ0E5SURNc0lHaGxhV2RvZENBOUlERXdLVnh1Y0hKcGJuUW9hREVnS3lCb01pbGNibVJsZGk1dlptWW9LVnh1WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxubGlicmFyeShjaXJjbGl6ZSlcblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDYpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXFYxXFwsIFxcVjJcXCwgXFxWM1xcLCBcXFY0XFwsIFxcVjVcXCwgXFxWNlxcKVxuY29ucy5sb29wIDwtIGltcG9ydEJlZHBlKHRlbXApXG5cbiMgQ2hlY2tpbmcgRE1TT1xubG9vcC4yNWtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKFxcRzEuRE1TTy5NZXJnZWRfY2hyb21vc2lnaHRfXFwsIDI1LCBcXGtiLmJlZHBlXFwpKSkpXG5sb29wLjEwa2IgPC0gaW1wb3J0QmVkcGUoZnJlYWQoaGVyZShsb29wRGlyLCBwYXN0ZTAoXFxHMS5ETVNPLk1lcmdlZF9jaHJvbW9zaWdodF9cXCwgMTAsIFxca2IuYmVkcGVcXCkpKSlcbmxvb3AuNWtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKFxcRzEuRE1TTy5NZXJnZWRfY2hyb21vc2lnaHRfXFwsIDUsIFxca2IuYmVkcGVcXCkpKSlcblxuXG5vdmVybGFwLjI1a2IgPC0gZmluZE92ZXJsYXBzKGNvbnMubG9vcCwgbG9vcC4yNWtiKVxub3ZlcmxhcC4xMGtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuMTBrYilcbm92ZXJsYXAuNWtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuNWtiKVxuXG5pbmRleCA8LSBzb3J0KHVuaXF1ZShjKHF1ZXJ5SGl0cyhvdmVybGFwLjI1a2IpLFxuICAgICAgICAgcXVlcnlIaXRzKG92ZXJsYXAuMTBrYiksXG4gICAgICAgICBxdWVyeUhpdHMob3ZlcmxhcC41a2IpKSkpXG5kYXRhJGNhbGxlZEJ5RE1TTyA8LSAwXG5kYXRhJGNhbGxlZEJ5RE1TT1tpbmRleF0gPC0gMVxuXG4jIENoZWNraW5nIGRUQUdcbmxvb3AuMjVrYiA8LSBpbXBvcnRCZWRwZShmcmVhZChoZXJlKGxvb3BEaXIsIHBhc3RlMChcXEcxLmRUQUcuTWVyZ2VkX2Nocm9tb3NpZ2h0X1xcLCAyNSwgXFxrYi5iZWRwZVxcKSkpKVxubG9vcC4xMGtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKFxcRzEuZFRBRy5NZXJnZWRfY2hyb21vc2lnaHRfXFwsIDEwLCBcXGtiLmJlZHBlXFwpKSkpXG5sb29wLjVrYiA8LSBpbXBvcnRCZWRwZShmcmVhZChoZXJlKGxvb3BEaXIsIHBhc3RlMChcXEcxLmRUQUcuTWVyZ2VkX2Nocm9tb3NpZ2h0X1xcLCA1LCBcXGtiLmJlZHBlXFwpKSkpXG5cblxub3ZlcmxhcC4yNWtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuMjVrYilcbm92ZXJsYXAuMTBrYiA8LSBmaW5kT3ZlcmxhcHMoY29ucy5sb29wLCBsb29wLjEwa2IpXG5vdmVybGFwLjVrYiA8LSBmaW5kT3ZlcmxhcHMoY29ucy5sb29wLCBsb29wLjVrYilcblxuaW5kZXggPC0gc29ydCh1bmlxdWUoYyhxdWVyeUhpdHMob3ZlcmxhcC4yNWtiKSxcbiAgICAgICAgIHF1ZXJ5SGl0cyhvdmVybGFwLjEwa2IpLFxuICAgICAgICAgcXVlcnlIaXRzKG92ZXJsYXAuNWtiKSkpKVxuZGF0YSRjYWxsZWRCeWRUQUcgPC0gMFxuZGF0YSRjYWxsZWRCeWRUQUdbaW5kZXhdIDwtIDFcblxuIyBDaGVja2luZyBBNDg1XG5sb29wLjI1a2IgPC0gaW1wb3J0QmVkcGUoZnJlYWQoaGVyZShsb29wRGlyLCBwYXN0ZTAoXFxHMS5BNDg1Lk1lcmdlZF9jaHJvbW9zaWdodF9cXCwgMjUsIFxca2IuYmVkcGVcXCkpKSlcbmxvb3AuMTBrYiA8LSBpbXBvcnRCZWRwZShmcmVhZChoZXJlKGxvb3BEaXIsIHBhc3RlMChcXEcxLkE0ODUuTWVyZ2VkX2Nocm9tb3NpZ2h0X1xcLCAxMCwgXFxrYi5iZWRwZVxcKSkpKVxubG9vcC41a2IgPC0gaW1wb3J0QmVkcGUoZnJlYWQoaGVyZShsb29wRGlyLCBwYXN0ZTAoXFxHMS5BNDg1Lk1lcmdlZF9jaHJvbW9zaWdodF9cXCwgNSwgXFxrYi5iZWRwZVxcKSkpKVxuXG5cbm92ZXJsYXAuMjVrYiA8LSBmaW5kT3ZlcmxhcHMoY29ucy5sb29wLCBsb29wLjI1a2IpXG5vdmVybGFwLjEwa2IgPC0gZmluZE92ZXJsYXBzKGNvbnMubG9vcCwgbG9vcC4xMGtiKVxub3ZlcmxhcC41a2IgPC0gZmluZE92ZXJsYXBzKGNvbnMubG9vcCwgbG9vcC41a2IpXG5cbmluZGV4IDwtIHNvcnQodW5pcXVlKGMocXVlcnlIaXRzKG92ZXJsYXAuMjVrYiksXG4gICAgICAgICBxdWVyeUhpdHMob3ZlcmxhcC4xMGtiKSxcbiAgICAgICAgIHF1ZXJ5SGl0cyhvdmVybGFwLjVrYikpKSlcbmRhdGEkY2FsbGVkQnlBNDg1IDwtIDBcbmRhdGEkY2FsbGVkQnlBNDg1W2luZGV4XSA8LSAxXG5cblxuIyBIZWF0bWFwIChjaGVja2luZyB3aGV0aGVyIGNlcnRhaW4gcGVhayBpcyBjYWxsZWQgYnkgc3BlY2lmaWMgc2FtcGxlKVxuZGF0YVRvUGxvdCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KGlkLCBjYWxsZWRCeURNU08sIGNhbGxlZEJ5ZFRBRywgY2FsbGVkQnlBNDg1KVxuZGF0YVRvUGxvdCA8LSBkYXRhVG9QbG90ICU+JSBkcGx5cjo6bXV0YXRlKGZsYWcgPSA0KmNhbGxlZEJ5RE1TTyArIDIqY2FsbGVkQnlkVEFHICsgY2FsbGVkQnlBNDg1KSAlPiVcbiAgZHBseXI6OmFycmFuZ2UoZGVzYyhmbGFnKSlcblxucm93X2dyb3VwcyA8LSBkYXRhVG9QbG90JGZsYWdcbmRhdGFfbWF0cml4IDwtIGRhdGFUb1Bsb3QgJT4lIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXGlkXFwpICU+JSBkcGx5cjo6c2VsZWN0KC1mbGFnKSAlPiUgYXMubWF0cml4KClcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcd2hpdGVcXCwgXFxncmVlblxcKSlcbmgxIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgsIG5hbWUgPSBcXGNhbGxlZEJ5XFwsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBib3JkZXIgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICByb3dfc3BsaXQgPSByb3dfZ3JvdXBzKVxuXG5cbiMgUHJlcGFyZSBkYXRhIGZvciB0aGUgc2Vjb25kIGhlYXRtYXBcbmRhdGFUb1Bsb3QyIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoaWQsIERNU08sIGRUQUcsIEE0ODUpICU+JVxuICBhcnJhbmdlKG1hdGNoKGlkLCBkYXRhVG9QbG90JGlkKSlcblxuZGF0YV9tYXRyaXgyIDwtIGRhdGFUb1Bsb3QyICU+JSBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFxpZFxcKSAlPiUgYXMubWF0cml4KClcblxuXG5jb2xfZnVuMiA8LSBjb2xvclJhbXAyKGMoLTAuNSwgMCwgMSksIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbmgyIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgyLCBuYW1lID0gXFxzY29yZVxcLFxuICAgICAgICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICAgICAgICBib3JkZXIgPSBUUlVFLFxuICAgICAgICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLFxuICAgICAgICAgICAgICBjb2wgPSBjb2xfZnVuMixcbiAgICAgICAgICAgICAgcm93X3NwbGl0ID0gcm93X2dyb3VwcylcblxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxcaGVhdG1hcF9jaGVja2luZ1NhbXBsZUNhbGxlZExvb3BzXFwpKVxucG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDMsIGhlaWdodCA9IDEwKVxucHJpbnQoaDEgKyBoMilcbmRldi5vZmYoKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubGlicmFyeShjaXJjbGl6ZSlcblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDYpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXFYxXFwsIFxcVjJcXCwgXFxWM1xcLCBcXFY0XFwsIFxcVjVcXCwgXFxWNlxcKVxuY29ucy5sb29wIDwtIGltcG9ydEJlZHBlKHRlbXApXG5cbiMgQ2hlY2tpbmcgRE1TT1xubG9vcC4yNWtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKFxcRzEuRE1TTy5NZXJnZWRfY2hyb21vc2lnaHRfXFwsIDI1LCBcXGtiLmJlZHBlXFwpKSkpXG5sb29wLjEwa2IgPC0gaW1wb3J0QmVkcGUoZnJlYWQoaGVyZShsb29wRGlyLCBwYXN0ZTAoXFxHMS5ETVNPLk1lcmdlZF9jaHJvbW9zaWdodF9cXCwgMTAsIFxca2IuYmVkcGVcXCkpKSlcbmxvb3AuNWtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKFxcRzEuRE1TTy5NZXJnZWRfY2hyb21vc2lnaHRfXFwsIDUsIFxca2IuYmVkcGVcXCkpKSlcblxuXG5vdmVybGFwLjI1a2IgPC0gZmluZE92ZXJsYXBzKGNvbnMubG9vcCwgbG9vcC4yNWtiKVxub3ZlcmxhcC4xMGtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuMTBrYilcbm92ZXJsYXAuNWtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuNWtiKVxuXG5pbmRleCA8LSBzb3J0KHVuaXF1ZShjKHF1ZXJ5SGl0cyhvdmVybGFwLjI1a2IpLFxuICAgICAgICAgcXVlcnlIaXRzKG92ZXJsYXAuMTBrYiksXG4gICAgICAgICBxdWVyeUhpdHMob3ZlcmxhcC41a2IpKSkpXG5kYXRhJGNhbGxlZEJ5RE1TTyA8LSAwXG5kYXRhJGNhbGxlZEJ5RE1TT1tpbmRleF0gPC0gMVxuXG4jIENoZWNraW5nIGRUQUdcbmxvb3AuMjVrYiA8LSBpbXBvcnRCZWRwZShmcmVhZChoZXJlKGxvb3BEaXIsIHBhc3RlMChcXEcxLmRUQUcuTWVyZ2VkX2Nocm9tb3NpZ2h0X1xcLCAyNSwgXFxrYi5iZWRwZVxcKSkpKVxubG9vcC4xMGtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKFxcRzEuZFRBRy5NZXJnZWRfY2hyb21vc2lnaHRfXFwsIDEwLCBcXGtiLmJlZHBlXFwpKSkpXG5sb29wLjVrYiA8LSBpbXBvcnRCZWRwZShmcmVhZChoZXJlKGxvb3BEaXIsIHBhc3RlMChcXEcxLmRUQUcuTWVyZ2VkX2Nocm9tb3NpZ2h0X1xcLCA1LCBcXGtiLmJlZHBlXFwpKSkpXG5cblxub3ZlcmxhcC4yNWtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuMjVrYilcbm92ZXJsYXAuMTBrYiA8LSBmaW5kT3ZlcmxhcHMoY29ucy5sb29wLCBsb29wLjEwa2IpXG5vdmVybGFwLjVrYiA8LSBmaW5kT3ZlcmxhcHMoY29ucy5sb29wLCBsb29wLjVrYilcblxuaW5kZXggPC0gc29ydCh1bmlxdWUoYyhxdWVyeUhpdHMob3ZlcmxhcC4yNWtiKSxcbiAgICAgICAgIHF1ZXJ5SGl0cyhvdmVybGFwLjEwa2IpLFxuICAgICAgICAgcXVlcnlIaXRzKG92ZXJsYXAuNWtiKSkpKVxuZGF0YSRjYWxsZWRCeWRUQUcgPC0gMFxuZGF0YSRjYWxsZWRCeWRUQUdbaW5kZXhdIDwtIDFcblxuIyBDaGVja2luZyBBNDg1XG5sb29wLjI1a2IgPC0gaW1wb3J0QmVkcGUoZnJlYWQoaGVyZShsb29wRGlyLCBwYXN0ZTAoXFxHMS5BNDg1Lk1lcmdlZF9jaHJvbW9zaWdodF9cXCwgMjUsIFxca2IuYmVkcGVcXCkpKSlcbmxvb3AuMTBrYiA8LSBpbXBvcnRCZWRwZShmcmVhZChoZXJlKGxvb3BEaXIsIHBhc3RlMChcXEcxLkE0ODUuTWVyZ2VkX2Nocm9tb3NpZ2h0X1xcLCAxMCwgXFxrYi5iZWRwZVxcKSkpKVxubG9vcC41a2IgPC0gaW1wb3J0QmVkcGUoZnJlYWQoaGVyZShsb29wRGlyLCBwYXN0ZTAoXFxHMS5BNDg1Lk1lcmdlZF9jaHJvbW9zaWdodF9cXCwgNSwgXFxrYi5iZWRwZVxcKSkpKVxuXG5cbm92ZXJsYXAuMjVrYiA8LSBmaW5kT3ZlcmxhcHMoY29ucy5sb29wLCBsb29wLjI1a2IpXG5vdmVybGFwLjEwa2IgPC0gZmluZE92ZXJsYXBzKGNvbnMubG9vcCwgbG9vcC4xMGtiKVxub3ZlcmxhcC41a2IgPC0gZmluZE92ZXJsYXBzKGNvbnMubG9vcCwgbG9vcC41a2IpXG5cbmluZGV4IDwtIHNvcnQodW5pcXVlKGMocXVlcnlIaXRzKG92ZXJsYXAuMjVrYiksXG4gICAgICAgICBxdWVyeUhpdHMob3ZlcmxhcC4xMGtiKSxcbiAgICAgICAgIHF1ZXJ5SGl0cyhvdmVybGFwLjVrYikpKSlcbmRhdGEkY2FsbGVkQnlBNDg1IDwtIDBcbmRhdGEkY2FsbGVkQnlBNDg1W2luZGV4XSA8LSAxXG5cblxuIyBIZWF0bWFwIChjaGVja2luZyB3aGV0aGVyIGNlcnRhaW4gcGVhayBpcyBjYWxsZWQgYnkgc3BlY2lmaWMgc2FtcGxlKVxuZGF0YVRvUGxvdCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KGlkLCBjYWxsZWRCeURNU08sIGNhbGxlZEJ5ZFRBRywgY2FsbGVkQnlBNDg1KVxuZGF0YVRvUGxvdCA8LSBkYXRhVG9QbG90ICU+JSBkcGx5cjo6bXV0YXRlKGZsYWcgPSA0KmNhbGxlZEJ5RE1TTyArIDIqY2FsbGVkQnlkVEFHICsgY2FsbGVkQnlBNDg1KSAlPiVcbiAgZHBseXI6OmFycmFuZ2UoZGVzYyhmbGFnKSlcblxucm93X2dyb3VwcyA8LSBkYXRhVG9QbG90JGZsYWdcbmRhdGFfbWF0cml4IDwtIGRhdGFUb1Bsb3QgJT4lIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXGlkXFwpICU+JSBkcGx5cjo6c2VsZWN0KC1mbGFnKSAlPiUgYXMubWF0cml4KClcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEpLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcd2hpdGVcXCwgXFxncmVlblxcKSlcbmgxIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgsIG5hbWUgPSBcXGNhbGxlZEJ5XFwsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBib3JkZXIgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLFxuICAgICAgICBjb2wgPSBjb2xfZnVuLFxuICAgICAgICByb3dfc3BsaXQgPSByb3dfZ3JvdXBzKVxuXG5cbiMgUHJlcGFyZSBkYXRhIGZvciB0aGUgc2Vjb25kIGhlYXRtYXBcbmRhdGFUb1Bsb3QyIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoaWQsIERNU08sIGRUQUcsIEE0ODUpICU+JVxuICBhcnJhbmdlKG1hdGNoKGlkLCBkYXRhVG9QbG90JGlkKSlcblxuZGF0YV9tYXRyaXgyIDwtIGRhdGFUb1Bsb3QyICU+JSBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFxpZFxcKSAlPiUgYXMubWF0cml4KClcblxuXG5jb2xfZnVuMiA8LSBjb2xvclJhbXAyKGMoLTAuNSwgMCwgMSksIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbmgyIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgyLCBuYW1lID0gXFxzY29yZVxcLFxuICAgICAgICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSxcbiAgICAgICAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICAgICAgICBib3JkZXIgPSBUUlVFLFxuICAgICAgICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLFxuICAgICAgICAgICAgICBjb2wgPSBjb2xfZnVuMixcbiAgICAgICAgICAgICAgcm93X3NwbGl0ID0gcm93X2dyb3VwcylcblxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxcaGVhdG1hcF9jaGVja2luZ1NhbXBsZUNhbGxlZExvb3BzXFwpKVxucG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDMsIGhlaWdodCA9IDEwKVxucHJpbnQoaDEgKyBoMilcbmRldi5vZmYoKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
library(circlize)

name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
temp <- data %>% dplyr::select(seq(1, 6))
colnames(temp) <- c(\V1\, \V2\, \V3\, \V4\, \V5\, \V6\)
cons.loop <- importBedpe(temp)

# Checking DMSO
loop.25kb <- importBedpe(fread(here(loopDir, paste0(\G1.DMSO.Merged_chromosight_\, 25, \kb.bedpe\))))
loop.10kb <- importBedpe(fread(here(loopDir, paste0(\G1.DMSO.Merged_chromosight_\, 10, \kb.bedpe\))))
loop.5kb <- importBedpe(fread(here(loopDir, paste0(\G1.DMSO.Merged_chromosight_\, 5, \kb.bedpe\))))


overlap.25kb <- findOverlaps(cons.loop, loop.25kb)
overlap.10kb <- findOverlaps(cons.loop, loop.10kb)
overlap.5kb <- findOverlaps(cons.loop, loop.5kb)

index <- sort(unique(c(queryHits(overlap.25kb),
         queryHits(overlap.10kb),
         queryHits(overlap.5kb))))
data$calledByDMSO <- 0
data$calledByDMSO[index] <- 1

# Checking dTAG
loop.25kb <- importBedpe(fread(here(loopDir, paste0(\G1.dTAG.Merged_chromosight_\, 25, \kb.bedpe\))))
loop.10kb <- importBedpe(fread(here(loopDir, paste0(\G1.dTAG.Merged_chromosight_\, 10, \kb.bedpe\))))
loop.5kb <- importBedpe(fread(here(loopDir, paste0(\G1.dTAG.Merged_chromosight_\, 5, \kb.bedpe\))))


overlap.25kb <- findOverlaps(cons.loop, loop.25kb)
overlap.10kb <- findOverlaps(cons.loop, loop.10kb)
overlap.5kb <- findOverlaps(cons.loop, loop.5kb)

index <- sort(unique(c(queryHits(overlap.25kb),
         queryHits(overlap.10kb),
         queryHits(overlap.5kb))))
data$calledBydTAG <- 0
data$calledBydTAG[index] <- 1

# Checking A485
loop.25kb <- importBedpe(fread(here(loopDir, paste0(\G1.A485.Merged_chromosight_\, 25, \kb.bedpe\))))
loop.10kb <- importBedpe(fread(here(loopDir, paste0(\G1.A485.Merged_chromosight_\, 10, \kb.bedpe\))))
loop.5kb <- importBedpe(fread(here(loopDir, paste0(\G1.A485.Merged_chromosight_\, 5, \kb.bedpe\))))


overlap.25kb <- findOverlaps(cons.loop, loop.25kb)
overlap.10kb <- findOverlaps(cons.loop, loop.10kb)
overlap.5kb <- findOverlaps(cons.loop, loop.5kb)

index <- sort(unique(c(queryHits(overlap.25kb),
         queryHits(overlap.10kb),
         queryHits(overlap.5kb))))
data$calledByA485 <- 0
data$calledByA485[index] <- 1


# Heatmap (checking whether certain peak is called by specific sample)
dataToPlot <- data %>% dplyr::select(id, calledByDMSO, calledBydTAG, calledByA485)
dataToPlot <- dataToPlot %>% dplyr::mutate(flag = 4*calledByDMSO + 2*calledBydTAG + calledByA485) %>%
  dplyr::arrange(desc(flag))

row_groups <- dataToPlot$flag
data_matrix <- dataToPlot %>% column_to_rownames(var = \id\) %>% dplyr::select(-flag) %>% as.matrix()
col_fun <- colorRamp2(c(0, 1), 
                      c(\white\, \green\))
h1 <- Heatmap(data_matrix, name = \calledBy\,
        cluster_columns = FALSE,
        cluster_rows = FALSE,
        show_row_dend = FALSE,
        border = TRUE,
        show_row_names = FALSE,
        col = col_fun,
        row_split = row_groups)


# Prepare data for the second heatmap
dataToPlot2 <- data %>% dplyr::select(id, DMSO, dTAG, A485) %>%
  arrange(match(id, dataToPlot$id))

data_matrix2 <- dataToPlot2 %>% column_to_rownames(var = \id\) %>% as.matrix()


col_fun2 <- colorRamp2(c(-0.5, 0, 1), c(\blue\, \white\, \red\))

h2 <- Heatmap(data_matrix2, name = \score\,
              cluster_columns = FALSE,
              cluster_rows = TRUE,
              show_row_dend = FALSE,
              border = TRUE,
              show_row_names = FALSE,
              col = col_fun2,
              row_split = row_groups)


fileName <- here(figDir, paste0(\heatmap_checkingSampleCalledLoops\))
png(paste0(fileName, \.png\), res = 600, units = \in\, width = 3, height = 10)
print(h1 + h2)
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


## [2.31] Making Visualization Easy
https://bioconductor.org/books/devel/OHCA/pages/visualization.html

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJJWldGMGJXRndYRzVzYVdKeVlYSjVLR05wY21Oc2FYcGxLVnh1WEc0aklFaGxZWFJ0WVhBZ01seHVjMlYwTG5ObFpXUW9NVEl6S1Z4dVhHNWthV1ptUTNWMGIyWm1JRHd0SURBdU1seHVaR0YwWVZSdlVHeHZkQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR2x6WkdsbVpsOWtWRUZIWDBSTlUwOGdQU0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTmhjMlZmZDJobGJpaGthV1ptWDJSVVFVZGZSRTFUVHlBK1BTQmthV1ptUTNWMGIyWm1JSDRnTVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoWW5Nb1pHbG1abDlrVkVGSFgwUk5VMDhwSUR3Z1pHbG1aa04xZEc5bVppQitJREFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2xtWmw5a1ZFRkhYMFJOVTA4Z1BEMGdMV1JwWm1aRGRYUnZabVlnZmlBdE1TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCVVVsVkZJSDRnVGtFcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2x6WkdsbVpsOUJORGcxWDBSTlUwOGdQU0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTmhjMlZmZDJobGJpaGthV1ptWDBFME9EVmZSRTFUVHlBK1BTQmthV1ptUTNWMGIyWm1JSDRnTVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoWW5Nb1pHbG1abDlCTkRnMVgwUk5VMDhwSUR3Z1pHbG1aa04xZEc5bVppQitJREFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2xtWmw5Qk5EZzFYMFJOVTA4Z1BEMGdMV1JwWm1aRGRYUnZabVlnZmlBdE1TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCVVVsVkZJSDRnVGtFcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hwWkN3Z2FYTmthV1ptWDJSVVFVZGZSRTFUVHl3Z2FYTmthV1ptWDBFME9EVmZSRTFUVHlsY2JtUmhkR0ZmYldGMGNtbDRJRHd0SUdSaGRHRlViMUJzYjNRZ0pUNGxJR052YkhWdGJsOTBiMTl5YjNkdVlXMWxjeWgyWVhJZ1BTQmNJbWxrWENJcEpUNGxJR0Z6TG0xaGRISnBlQ2dwWEc1amIyeGZablZ1SUR3dElHTnZiRzl5VW1GdGNESW9ZeWd0TVN3Z01Dd2dNU2tzSUdNb1hDSmliSFZsWENJc0lGd2laM0psZVZ3aUxDQmNJbkpsWkZ3aUtTbGNibWd4SUR3dElFaGxZWFJ0WVhBb1pHRjBZVjl0WVhSeWFYZ3NJRzVoYldVZ1BTQmNJbXh2YjNBZ2MyTnZjbVZjSWl4Y2JpQWdJQ0FnSUNBZ1kyeDFjM1JsY2w5amIyeDFiVzV6SUQwZ1JrRk1VMFVzWEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpmY205M2N5QTlJRVpCVEZORkxGeHVJQ0FnSUNBZ0lDQnliM2RmYTIwZ1BTQTVMRnh1SUNBZ0lDQWdJQ0J6YUc5M1gzSnZkMTlrWlc1a0lEMGdSa0ZNVTBVc1hHNGdJQ0FnSUNBZ0lHSnZjbVJsY2lBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCemFHOTNYM0p2ZDE5dVlXMWxjeUE5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JqYjJ3Z1BTQmpiMnhmWm5WdUtWeHVYRzVtYVd4bFRtRnRaU0E4TFNCb1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tGd2lhR1ZoZEcxaGNGOWphR1ZqYTJsdVowUmxiSFJoUVdOeWIzTnpRMjl1WkdsMGFXOXVYQ0lwS1Z4dWNHNW5LSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUnpJRDBnWENKcGJsd2lMQ0IzYVdSMGFDQTlJRElzSUdobGFXZG9kQ0E5SURFd0tWeHVjSEpwYm5Rb2FERXBYRzVrWlhZdWIyWm1LQ2xjYmx4dWMyVjBMbk5sWldRb01USXpLVnh1WEc1b2JWOWtjbUYzYmlBOExTQmtjbUYzS0dneEtWeHVjbTkzWDJOc2RYTjBaWEp6SUR3dElISnZkMTl2Y21SbGNpaG9iVjlrY21GM2JpbGNibHh1Ykc5dmNDNWpiSFZ6ZEdWeU1TQThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiTVYxZFhWeHViRzl2Y0M1amJIVnpkR1Z5TWlBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJNbDFkWFZ4dWJHOXZjQzVqYkhWemRHVnlNeUE4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk0xMWRYVnh1Ykc5dmNDNWpiSFZ6ZEdWeU5DQThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiTkYxZFhWeHViRzl2Y0M1amJIVnpkR1Z5TlNBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJOVjFkWFZ4dWJHOXZjQzVqYkhWemRHVnlOaUE4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk5sMWRYVnh1Ykc5dmNDNWpiSFZ6ZEdWeU55QThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiTjExZFhWeHViRzl2Y0M1amJIVnpkR1Z5T0NBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJPRjFkWFZ4dWJHOXZjQzVqYkhWemRHVnlPU0E4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk9WMWRYVnh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG4jIEhlYXRtYXBcbmxpYnJhcnkoY2lyY2xpemUpXG5cbiMgSGVhdG1hcCAyXG5zZXQuc2VlZCgxMjMpXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5kYXRhVG9QbG90IDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoaXNkaWZmX2RUQUdfRE1TTyA9IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZV93aGVuKGRpZmZfZFRBR19ETVNPID49IGRpZmZDdXRvZmYgfiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhkaWZmX2RUQUdfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmX2RUQUdfRE1TTyA8PSAtZGlmZkN1dG9mZiB+IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNkaWZmX0E0ODVfRE1TTyA9IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZV93aGVuKGRpZmZfQTQ4NV9ETVNPID49IGRpZmZDdXRvZmYgfiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhkaWZmX0E0ODVfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmX0E0ODVfRE1TTyA8PSAtZGlmZkN1dG9mZiB+IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGlkLCBpc2RpZmZfZFRBR19ETVNPLCBpc2RpZmZfQTQ4NV9ETVNPKVxuZGF0YV9tYXRyaXggPC0gZGF0YVRvUGxvdCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcaWRcXCklPiUgYXMubWF0cml4KClcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKC0xLCAwLCAxKSwgYyhcXGJsdWVcXCwgXFxncmV5XFwsIFxccmVkXFwpKVxuaDEgPC0gSGVhdG1hcChkYXRhX21hdHJpeCwgbmFtZSA9IFxcbG9vcCBzY29yZVxcLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsXG4gICAgICAgIHJvd19rbSA9IDksXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgYm9yZGVyID0gRkFMU0UsXG4gICAgICAgIHNob3dfcm93X25hbWVzID0gRkFMU0UsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4pXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxoZWF0bWFwX2NoZWNraW5nRGVsdGFBY3Jvc3NDb25kaXRpb25cXCkpXG5wbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMiwgaGVpZ2h0ID0gMTApXG5wcmludChoMSlcbmRldi5vZmYoKVxuXG5zZXQuc2VlZCgxMjMpXG5cbmhtX2RyYXduIDwtIGRyYXcoaDEpXG5yb3dfY2x1c3RlcnMgPC0gcm93X29yZGVyKGhtX2RyYXduKVxuXG5sb29wLmNsdXN0ZXIxIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1sxXV1dXG5sb29wLmNsdXN0ZXIyIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1syXV1dXG5sb29wLmNsdXN0ZXIzIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1szXV1dXG5sb29wLmNsdXN0ZXI0IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s0XV1dXG5sb29wLmNsdXN0ZXI1IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s1XV1dXG5sb29wLmNsdXN0ZXI2IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s2XV1dXG5sb29wLmNsdXN0ZXI3IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s3XV1dXG5sb29wLmNsdXN0ZXI4IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s4XV1dXG5sb29wLmNsdXN0ZXI5IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s5XV1dXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# Heatmap
library(circlize)

# Heatmap 2
set.seed(123)

diffCutoff <- 0.2
dataToPlot <- data %>% dplyr::mutate(isdiff_dTAG_DMSO = 
                                       case_when(diff_dTAG_DMSO >= diffCutoff ~ 1,
                                                 abs(diff_dTAG_DMSO) < diffCutoff ~ 0,
                                                 diff_dTAG_DMSO <= -diffCutoff ~ -1,
                                                 TRUE ~ NA),
                                     isdiff_A485_DMSO = 
                                       case_when(diff_A485_DMSO >= diffCutoff ~ 1,
                                                 abs(diff_A485_DMSO) < diffCutoff ~ 0,
                                                 diff_A485_DMSO <= -diffCutoff ~ -1,
                                                 TRUE ~ NA)) %>%
  dplyr::select(id, isdiff_dTAG_DMSO, isdiff_A485_DMSO)
data_matrix <- dataToPlot %>% column_to_rownames(var = \id\)%>% as.matrix()
col_fun <- colorRamp2(c(-1, 0, 1), c(\blue\, \grey\, \red\))
h1 <- Heatmap(data_matrix, name = \loop score\,
        cluster_columns = FALSE,
        cluster_rows = FALSE,
        row_km = 9,
        show_row_dend = FALSE,
        border = FALSE,
        show_row_names = FALSE,
        col = col_fun)

fileName <- here(figDir, paste0(\heatmap_checkingDeltaAcrossCondition\))
png(paste0(fileName, \.png\), res = 600, units = \in\, width = 2, height = 10)
print(h1)
dev.off()

set.seed(123)

hm_drawn <- draw(h1)
row_clusters <- row_order(hm_drawn)

loop.cluster1 <- temp[row_clusters[[1]]]
loop.cluster2 <- temp[row_clusters[[2]]]
loop.cluster3 <- temp[row_clusters[[3]]]
loop.cluster4 <- temp[row_clusters[[4]]]
loop.cluster5 <- temp[row_clusters[[5]]]
loop.cluster6 <- temp[row_clusters[[6]]]
loop.cluster7 <- temp[row_clusters[[7]]]
loop.cluster8 <- temp[row_clusters[[8]]]
loop.cluster9 <- temp[row_clusters[[9]]]



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QklaV0YwYldGd1hHNXNhV0p5WVhKNUtHTnBjbU5zYVhwbEtWeHVYRzRqSUVobFlYUnRZWEFnTWx4dWMyVjBMbk5sWldRb01USXpLVnh1WEc1a2FXWm1RM1YwYjJabUlEd3RJREF1TWx4dVpHRjBZVlJ2VUd4dmRDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHbHpaR2xtWmw5a1ZFRkhYMFJOVTA4Z1BTQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOaGMyVmZkMmhsYmloa2FXWm1YMlJVUVVkZlJFMVRUeUErUFNCa2FXWm1RM1YwYjJabUlINGdNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhZbk1vWkdsbVpsOWtWRUZIWDBSTlUwOHBJRHdnWkdsbVprTjFkRzltWmlCK0lEQXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHbG1abDlrVkVGSFgwUk5VMDhnUEQwZ0xXUnBabVpEZFhSdlptWWdmaUF0TVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JVVWxWRklINGdUa0VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbHpaR2xtWmw5Qk5EZzFYMFJOVTA4Z1BTQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOaGMyVmZkMmhsYmloa2FXWm1YMEUwT0RWZlJFMVRUeUErUFNCa2FXWm1RM1YwYjJabUlINGdNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhZbk1vWkdsbVpsOUJORGcxWDBSTlUwOHBJRHdnWkdsbVprTjFkRzltWmlCK0lEQXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHbG1abDlCTkRnMVgwUk5VMDhnUEQwZ0xXUnBabVpEZFhSdlptWWdmaUF0TVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JVVWxWRklINGdUa0VwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaHBaQ3dnYVhOa2FXWm1YMlJVUVVkZlJFMVRUeXdnYVhOa2FXWm1YMEUwT0RWZlJFMVRUeWxjYm1SaGRHRmZiV0YwY21sNElEd3RJR1JoZEdGVWIxQnNiM1FnSlQ0bElHTnZiSFZ0Ymw5MGIxOXliM2R1WVcxbGN5aDJZWElnUFNCY1hHbGtYRndwSlQ0bElHRnpMbTFoZEhKcGVDZ3BYRzVqYjJ4ZlpuVnVJRHd0SUdOdmJHOXlVbUZ0Y0RJb1l5Z3RNU3dnTUN3Z01Ta3NJR01vWEZ4aWJIVmxYRndzSUZ4Y1ozSmxlVnhjTENCY1hISmxaRnhjS1NsY2JtZ3hJRHd0SUVobFlYUnRZWEFvWkdGMFlWOXRZWFJ5YVhnc0lHNWhiV1VnUFNCY1hHeHZiM0FnYzJOdmNtVmNYQ3hjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjbDlqYjJ4MWJXNXpJRDBnUmtGTVUwVXNYRzRnSUNBZ0lDQWdJR05zZFhOMFpYSmZjbTkzY3lBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCeWIzZGZhMjBnUFNBNUxGeHVJQ0FnSUNBZ0lDQnphRzkzWDNKdmQxOWtaVzVrSUQwZ1JrRk1VMFVzWEc0Z0lDQWdJQ0FnSUdKdmNtUmxjaUE5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0J6YUc5M1gzSnZkMTl1WVcxbGN5QTlJRVpCVEZORkxGeHVJQ0FnSUNBZ0lDQmpiMndnUFNCamIyeGZablZ1S1Z4dVhHNW1hV3hsVG1GdFpTQThMU0JvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0Z4Y2FHVmhkRzFoY0Y5amFHVmphMmx1WjBSbGJIUmhRV055YjNOelEyOXVaR2wwYVc5dVhGd3BLVnh1Y0c1bktIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhSeklEMGdYRnhwYmx4Y0xDQjNhV1IwYUNBOUlESXNJR2hsYVdkb2RDQTlJREV3S1Z4dWNISnBiblFvYURFcFhHNWtaWFl1YjJabUtDbGNibHh1YzJWMExuTmxaV1FvTVRJektWeHVYRzVvYlY5a2NtRjNiaUE4TFNCa2NtRjNLR2d4S1Z4dWNtOTNYMk5zZFhOMFpYSnpJRHd0SUhKdmQxOXZjbVJsY2lob2JWOWtjbUYzYmlsY2JseHViRzl2Y0M1amJIVnpkR1Z5TVNBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJNVjFkWFZ4dWJHOXZjQzVqYkhWemRHVnlNaUE4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk1sMWRYVnh1Ykc5dmNDNWpiSFZ6ZEdWeU15QThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiTTExZFhWeHViRzl2Y0M1amJIVnpkR1Z5TkNBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJORjFkWFZ4dWJHOXZjQzVqYkhWemRHVnlOU0E4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk5WMWRYVnh1Ykc5dmNDNWpiSFZ6ZEdWeU5pQThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiTmwxZFhWeHViRzl2Y0M1amJIVnpkR1Z5TnlBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJOMTFkWFZ4dWJHOXZjQzVqYkhWemRHVnlPQ0E4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk9GMWRYVnh1Ykc5dmNDNWpiSFZ6ZEdWeU9TQThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiT1YxZFhWeHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG4jIEhlYXRtYXBcbmxpYnJhcnkoY2lyY2xpemUpXG5cbiMgSGVhdG1hcCAyXG5zZXQuc2VlZCgxMjMpXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5kYXRhVG9QbG90IDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoaXNkaWZmX2RUQUdfRE1TTyA9IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZV93aGVuKGRpZmZfZFRBR19ETVNPID49IGRpZmZDdXRvZmYgfiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhkaWZmX2RUQUdfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmX2RUQUdfRE1TTyA8PSAtZGlmZkN1dG9mZiB+IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNkaWZmX0E0ODVfRE1TTyA9IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZV93aGVuKGRpZmZfQTQ4NV9ETVNPID49IGRpZmZDdXRvZmYgfiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhkaWZmX0E0ODVfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmX0E0ODVfRE1TTyA8PSAtZGlmZkN1dG9mZiB+IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGlkLCBpc2RpZmZfZFRBR19ETVNPLCBpc2RpZmZfQTQ4NV9ETVNPKVxuZGF0YV9tYXRyaXggPC0gZGF0YVRvUGxvdCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcaWRcXCklPiUgYXMubWF0cml4KClcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKC0xLCAwLCAxKSwgYyhcXGJsdWVcXCwgXFxncmV5XFwsIFxccmVkXFwpKVxuaDEgPC0gSGVhdG1hcChkYXRhX21hdHJpeCwgbmFtZSA9IFxcbG9vcCBzY29yZVxcLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsXG4gICAgICAgIHJvd19rbSA9IDksXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgYm9yZGVyID0gRkFMU0UsXG4gICAgICAgIHNob3dfcm93X25hbWVzID0gRkFMU0UsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4pXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxoZWF0bWFwX2NoZWNraW5nRGVsdGFBY3Jvc3NDb25kaXRpb25cXCkpXG5wbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMiwgaGVpZ2h0ID0gMTApXG5wcmludChoMSlcbmRldi5vZmYoKVxuXG5zZXQuc2VlZCgxMjMpXG5cbmhtX2RyYXduIDwtIGRyYXcoaDEpXG5yb3dfY2x1c3RlcnMgPC0gcm93X29yZGVyKGhtX2RyYXduKVxuXG5sb29wLmNsdXN0ZXIxIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1sxXV1dXG5sb29wLmNsdXN0ZXIyIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1syXV1dXG5sb29wLmNsdXN0ZXIzIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1szXV1dXG5sb29wLmNsdXN0ZXI0IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s0XV1dXG5sb29wLmNsdXN0ZXI1IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s1XV1dXG5sb29wLmNsdXN0ZXI2IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s2XV1dXG5sb29wLmNsdXN0ZXI3IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s3XV1dXG5sb29wLmNsdXN0ZXI4IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s4XV1dXG5sb29wLmNsdXN0ZXI5IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s5XV1dXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBIZWF0bWFwXG5saWJyYXJ5KGNpcmNsaXplKVxuXG4jIEhlYXRtYXAgMlxuc2V0LnNlZWQoMTIzKVxuXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZGF0YVRvUGxvdCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGlzZGlmZl9kVEFHX0RNU08gPSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Vfd2hlbihkaWZmX2RUQUdfRE1TTyA+PSBkaWZmQ3V0b2ZmIH4gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMoZGlmZl9kVEFHX0RNU08pIDwgZGlmZkN1dG9mZiB+IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZl9kVEFHX0RNU08gPD0gLWRpZmZDdXRvZmYgfiAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZGlmZl9BNDg1X0RNU08gPSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Vfd2hlbihkaWZmX0E0ODVfRE1TTyA+PSBkaWZmQ3V0b2ZmIH4gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMoZGlmZl9BNDg1X0RNU08pIDwgZGlmZkN1dG9mZiB+IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZl9BNDg1X0RNU08gPD0gLWRpZmZDdXRvZmYgfiAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgaXNkaWZmX2RUQUdfRE1TTywgaXNkaWZmX0E0ODVfRE1TTylcbmRhdGFfbWF0cml4IDwtIGRhdGFUb1Bsb3QgJT4lIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXGlkXFwpJT4lIGFzLm1hdHJpeCgpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygtMSwgMCwgMSksIGMoXFxibHVlXFwsIFxcZ3JleVxcLCBcXHJlZFxcKSlcbmgxIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgsIG5hbWUgPSBcXGxvb3Agc2NvcmVcXCxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLFxuICAgICAgICByb3dfa20gPSA5LFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGJvcmRlciA9IEZBTFNFLFxuICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLFxuICAgICAgICBjb2wgPSBjb2xfZnVuKVxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxcaGVhdG1hcF9jaGVja2luZ0RlbHRhQWNyb3NzQ29uZGl0aW9uXFwpKVxucG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDIsIGhlaWdodCA9IDEwKVxucHJpbnQoaDEpXG5kZXYub2ZmKClcblxuc2V0LnNlZWQoMTIzKVxuXG5obV9kcmF3biA8LSBkcmF3KGgxKVxucm93X2NsdXN0ZXJzIDwtIHJvd19vcmRlcihobV9kcmF3bilcblxubG9vcC5jbHVzdGVyMSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbMV1dXVxubG9vcC5jbHVzdGVyMiA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbMl1dXVxubG9vcC5jbHVzdGVyMyA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbM11dXVxubG9vcC5jbHVzdGVyNCA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNF1dXVxubG9vcC5jbHVzdGVyNSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNV1dXVxubG9vcC5jbHVzdGVyNiA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNl1dXVxubG9vcC5jbHVzdGVyNyA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbN11dXVxubG9vcC5jbHVzdGVyOCA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbOF1dXVxubG9vcC5jbHVzdGVyOSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbOV1dXVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
# Heatmap
library(circlize)

# Heatmap 2
set.seed(123)

diffCutoff <- 0.2
dataToPlot <- data %>% dplyr::mutate(isdiff_dTAG_DMSO = 
                                       case_when(diff_dTAG_DMSO >= diffCutoff ~ 1,
                                                 abs(diff_dTAG_DMSO) < diffCutoff ~ 0,
                                                 diff_dTAG_DMSO <= -diffCutoff ~ -1,
                                                 TRUE ~ NA),
                                     isdiff_A485_DMSO = 
                                       case_when(diff_A485_DMSO >= diffCutoff ~ 1,
                                                 abs(diff_A485_DMSO) < diffCutoff ~ 0,
                                                 diff_A485_DMSO <= -diffCutoff ~ -1,
                                                 TRUE ~ NA)) %>%
  dplyr::select(id, isdiff_dTAG_DMSO, isdiff_A485_DMSO)
data_matrix <- dataToPlot %>% column_to_rownames(var = \id\)%>% as.matrix()
col_fun <- colorRamp2(c(-1, 0, 1), c(\blue\, \grey\, \red\))
h1 <- Heatmap(data_matrix, name = \loop score\,
        cluster_columns = FALSE,
        cluster_rows = FALSE,
        row_km = 9,
        show_row_dend = FALSE,
        border = FALSE,
        show_row_names = FALSE,
        col = col_fun)

fileName <- here(figDir, paste0(\heatmap_checkingDeltaAcrossCondition\))
png(paste0(fileName, \.png\), res = 600, units = \in\, width = 2, height = 10)
print(h1)
dev.off()

set.seed(123)

hm_drawn <- draw(h1)
row_clusters <- row_order(hm_drawn)

loop.cluster1 <- temp[row_clusters[[1]]]
loop.cluster2 <- temp[row_clusters[[2]]]
loop.cluster3 <- temp[row_clusters[[3]]]
loop.cluster4 <- temp[row_clusters[[4]]]
loop.cluster5 <- temp[row_clusters[[5]]]
loop.cluster6 <- temp[row_clusters[[6]]]
loop.cluster7 <- temp[row_clusters[[7]]]
loop.cluster8 <- temp[row_clusters[[8]]]
loop.cluster9 <- temp[row_clusters[[9]]]

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


## [2.32] Heatmap of loops
Strategy: check overlap of the union loops to the loops called at each condition
#### Check sample specific called loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJJWldGMGJXRndYRzVzYVdKeVlYSjVLR05wY21Oc2FYcGxLVnh1WEc0aklFaGxZWFJ0WVhBZ01seHVjMlYwTG5ObFpXUW9NVEl6S1Z4dVhHNWthV1ptUTNWMGIyWm1JRHd0SURBdU1seHVaR0YwWVZSdlVHeHZkQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRUZ1Ym04eUlDVnBiaVVnWXloY0lsQXRVRndpTENCY0lsQXRSVndpTENCY0lrVXRSVndpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9hWE5rYVdabVgyUlVRVWRmUkUxVFR5QTlJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGelpWOTNhR1Z1S0dScFptWmZaRlJCUjE5RVRWTlBJRDQ5SUdScFptWkRkWFJ2Wm1ZZ2ZpQXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGaWN5aGthV1ptWDJSVVFVZGZSRTFUVHlrZ1BDQmthV1ptUTNWMGIyWm1JSDRnTUN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptWDJSVVFVZGZSRTFUVHlBOFBTQXRaR2xtWmtOMWRHOW1aaUIrSUMweExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRlJTVlVVZ2ZpQk9RU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVhOa2FXWm1YMEUwT0RWZlJFMVRUeUE5SUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyRnpaVjkzYUdWdUtHUnBabVpmUVRRNE5WOUVUVk5QSUQ0OUlHUnBabVpEZFhSdlptWWdmaUF4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRmljeWhrYVdabVgwRTBPRFZmUkUxVFR5a2dQQ0JrYVdabVEzVjBiMlptSUg0Z01DeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVdabVgwRTBPRFZmUkUxVFR5QThQU0F0WkdsbVprTjFkRzltWmlCK0lDMHhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSU1ZVVWdmaUJPUVNrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR2xrTENCcGMyUnBabVpmWkZSQlIxOUVUVk5QTENCcGMyUnBabVpmUVRRNE5WOUVUVk5QS1Z4dVpHRjBZVjl0WVhSeWFYZ2dQQzBnWkdGMFlWUnZVR3h2ZENBbFBpVWdZMjlzZFcxdVgzUnZYM0p2ZDI1aGJXVnpLSFpoY2lBOUlGd2lhV1JjSWlrbFBpVWdZWE11YldGMGNtbDRLQ2xjYm1OdmJGOW1kVzRnUEMwZ1kyOXNiM0pTWVcxd01paGpLQzB4TENBd0xDQXhLU3dnWXloY0ltSnNkV1ZjSWl3Z1hDSm5jbVY1WENJc0lGd2ljbVZrWENJcEtWeHVhREVnUEMwZ1NHVmhkRzFoY0Noa1lYUmhYMjFoZEhKcGVDd2dibUZ0WlNBOUlGd2liRzl2Y0NCelkyOXlaVndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JqYkhWemRHVnlYMk52YkhWdGJuTWdQU0JHUVV4VFJTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ1kyeDFjM1JsY2w5eWIzZHpJRDBnUmtGTVUwVXNYRzRnSUNBZ0lDQWdJSEp2ZDE5cmJTQTlJRGdzWEc0Z0lDQWdJQ0FnSUhOb2IzZGZjbTkzWDJSbGJtUWdQU0JHUVV4VFJTeGNiaUFnSUNBZ0lDQWdZbTl5WkdWeUlEMGdSa0ZNVTBVc1hHNGdJQ0FnSUNBZ0lITm9iM2RmY205M1gyNWhiV1Z6SUQwZ1JrRk1VMFVzWEc0Z0lDQWdJQ0FnSUdOdmJDQTlJR052YkY5bWRXNHBYRzVjYm1acGJHVk9ZVzFsSUR3dElHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9YQ0pvWldGMGJXRndYMk5vWldOcmFXNW5SR1ZzZEdGQlkzSnZjM05EYjI1a2FYUnBiMjVmY21WblhDSXBLVnh1Y0c1bktIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhSeklEMGdYQ0pwYmx3aUxDQjNhV1IwYUNBOUlESXNJR2hsYVdkb2RDQTlJREV3S1Z4dWNISnBiblFvYURFcFhHNWtaWFl1YjJabUtDbGNibHh1YzJWMExuTmxaV1FvTVRJektWeHVYRzVvYlY5a2NtRjNiaUE4TFNCa2NtRjNLR2d4S1Z4dWNtOTNYMk5zZFhOMFpYSnpJRHd0SUhKdmQxOXZjbVJsY2lob2JWOWtjbUYzYmlsY2JseHViRzl2Y0M1amJIVnpkR1Z5TVNBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJNVjFkWFZ4dWJHOXZjQzVqYkhWemRHVnlNaUE4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk1sMWRYVnh1Ykc5dmNDNWpiSFZ6ZEdWeU15QThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiTTExZFhWeHViRzl2Y0M1amJIVnpkR1Z5TkNBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJORjFkWFZ4dWJHOXZjQzVqYkhWemRHVnlOU0E4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk5WMWRYVnh1Ykc5dmNDNWpiSFZ6ZEdWeU5pQThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiTmwxZFhWeHViRzl2Y0M1amJIVnpkR1Z5TnlBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJOMTFkWFZ4dWJHOXZjQzVqYkhWemRHVnlPQ0E4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk9GMWRYVnh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG4jIEhlYXRtYXBcbmxpYnJhcnkoY2lyY2xpemUpXG5cbiMgSGVhdG1hcCAyXG5zZXQuc2VlZCgxMjMpXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5kYXRhVG9QbG90IDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShpc2RpZmZfZFRBR19ETVNPID0gXG4gICAgICAgICAgICAgICAgICBjYXNlX3doZW4oZGlmZl9kVEFHX0RNU08gPj0gZGlmZkN1dG9mZiB+IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGRpZmZfZFRBR19ETVNPKSA8IGRpZmZDdXRvZmYgfiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZfZFRBR19ETVNPIDw9IC1kaWZmQ3V0b2ZmIH4gLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSxcbiAgICAgICAgICAgICAgICBpc2RpZmZfQTQ4NV9ETVNPID0gXG4gICAgICAgICAgICAgICAgICBjYXNlX3doZW4oZGlmZl9BNDg1X0RNU08gPj0gZGlmZkN1dG9mZiB+IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGRpZmZfQTQ4NV9ETVNPKSA8IGRpZmZDdXRvZmYgfiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZfQTQ4NV9ETVNPIDw9IC1kaWZmQ3V0b2ZmIH4gLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIGlzZGlmZl9kVEFHX0RNU08sIGlzZGlmZl9BNDg1X0RNU08pXG5kYXRhX21hdHJpeCA8LSBkYXRhVG9QbG90ICU+JSBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFxpZFxcKSU+JSBhcy5tYXRyaXgoKVxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoLTEsIDAsIDEpLCBjKFxcYmx1ZVxcLCBcXGdyZXlcXCwgXFxyZWRcXCkpXG5oMSA8LSBIZWF0bWFwKGRhdGFfbWF0cml4LCBuYW1lID0gXFxsb29wIHNjb3JlXFwsXG4gICAgICAgICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSxcbiAgICAgICAgcm93X2ttID0gOCxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBib3JkZXIgPSBGQUxTRSxcbiAgICAgICAgc2hvd19yb3dfbmFtZXMgPSBGQUxTRSxcbiAgICAgICAgY29sID0gY29sX2Z1bilcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXGhlYXRtYXBfY2hlY2tpbmdEZWx0YUFjcm9zc0NvbmRpdGlvbl9yZWdcXCkpXG5wbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMiwgaGVpZ2h0ID0gMTApXG5wcmludChoMSlcbmRldi5vZmYoKVxuXG5zZXQuc2VlZCgxMjMpXG5cbmhtX2RyYXduIDwtIGRyYXcoaDEpXG5yb3dfY2x1c3RlcnMgPC0gcm93X29yZGVyKGhtX2RyYXduKVxuXG5sb29wLmNsdXN0ZXIxIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1sxXV1dXG5sb29wLmNsdXN0ZXIyIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1syXV1dXG5sb29wLmNsdXN0ZXIzIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1szXV1dXG5sb29wLmNsdXN0ZXI0IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s0XV1dXG5sb29wLmNsdXN0ZXI1IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s1XV1dXG5sb29wLmNsdXN0ZXI2IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s2XV1dXG5sb29wLmNsdXN0ZXI3IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s3XV1dXG5sb29wLmNsdXN0ZXI4IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s4XV1dXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# Heatmap
library(circlize)

# Heatmap 2
set.seed(123)

diffCutoff <- 0.2
dataToPlot <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\)) %>%
  dplyr::mutate(isdiff_dTAG_DMSO = 
                  case_when(diff_dTAG_DMSO >= diffCutoff ~ 1,
                            abs(diff_dTAG_DMSO) < diffCutoff ~ 0,
                            diff_dTAG_DMSO <= -diffCutoff ~ -1,
                            TRUE ~ NA),
                isdiff_A485_DMSO = 
                  case_when(diff_A485_DMSO >= diffCutoff ~ 1,
                            abs(diff_A485_DMSO) < diffCutoff ~ 0,
                            diff_A485_DMSO <= -diffCutoff ~ -1,
                            TRUE ~ NA)) %>%
  dplyr::select(id, isdiff_dTAG_DMSO, isdiff_A485_DMSO)
data_matrix <- dataToPlot %>% column_to_rownames(var = \id\)%>% as.matrix()
col_fun <- colorRamp2(c(-1, 0, 1), c(\blue\, \grey\, \red\))
h1 <- Heatmap(data_matrix, name = \loop score\,
              cluster_columns = FALSE,
              cluster_rows = FALSE,
        row_km = 8,
        show_row_dend = FALSE,
        border = FALSE,
        show_row_names = FALSE,
        col = col_fun)

fileName <- here(figDir, paste0(\heatmap_checkingDeltaAcrossCondition_reg\))
png(paste0(fileName, \.png\), res = 600, units = \in\, width = 2, height = 10)
print(h1)
dev.off()

set.seed(123)

hm_drawn <- draw(h1)
row_clusters <- row_order(hm_drawn)

loop.cluster1 <- temp[row_clusters[[1]]]
loop.cluster2 <- temp[row_clusters[[2]]]
loop.cluster3 <- temp[row_clusters[[3]]]
loop.cluster4 <- temp[row_clusters[[4]]]
loop.cluster5 <- temp[row_clusters[[5]]]
loop.cluster6 <- temp[row_clusters[[6]]]
loop.cluster7 <- temp[row_clusters[[7]]]
loop.cluster8 <- temp[row_clusters[[8]]]



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QklaV0YwYldGd1hHNXNhV0p5WVhKNUtHTnBjbU5zYVhwbEtWeHVYRzRqSUVobFlYUnRZWEFnTWx4dWMyVjBMbk5sWldRb01USXpLVnh1WEc1a2FXWm1RM1YwYjJabUlEd3RJREF1TWx4dVpHRjBZVlJ2VUd4dmRDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtFRnVibTh5SUNWcGJpVWdZeWhjWEZBdFVGeGNMQ0JjWEZBdFJWeGNMQ0JjWEVVdFJWeGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2FYTmthV1ptWDJSVVFVZGZSRTFUVHlBOUlGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMkZ6WlY5M2FHVnVLR1JwWm1aZlpGUkJSMTlFVFZOUElENDlJR1JwWm1aRGRYUnZabVlnZmlBeExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0ZpY3loa2FXWm1YMlJVUVVkZlJFMVRUeWtnUENCa2FXWm1RM1YwYjJabUlINGdNQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2FXWm1YMlJVUVVkZlJFMVRUeUE4UFNBdFpHbG1aa04xZEc5bVppQitJQzB4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlNWVVVnZmlCT1FTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhWE5rYVdabVgwRTBPRFZmUkUxVFR5QTlJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGelpWOTNhR1Z1S0dScFptWmZRVFE0TlY5RVRWTlBJRDQ5SUdScFptWkRkWFJ2Wm1ZZ2ZpQXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGaWN5aGthV1ptWDBFME9EVmZSRTFUVHlrZ1BDQmthV1ptUTNWMGIyWm1JSDRnTUN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthV1ptWDBFME9EVmZSRTFUVHlBOFBTQXRaR2xtWmtOMWRHOW1aaUIrSUMweExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRlJTVlVVZ2ZpQk9RU2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHbGtMQ0JwYzJScFptWmZaRlJCUjE5RVRWTlBMQ0JwYzJScFptWmZRVFE0TlY5RVRWTlBLVnh1WkdGMFlWOXRZWFJ5YVhnZ1BDMGdaR0YwWVZSdlVHeHZkQ0FsUGlVZ1kyOXNkVzF1WDNSdlgzSnZkMjVoYldWektIWmhjaUE5SUZ4Y2FXUmNYQ2tsUGlVZ1lYTXViV0YwY21sNEtDbGNibU52YkY5bWRXNGdQQzBnWTI5c2IzSlNZVzF3TWloaktDMHhMQ0F3TENBeEtTd2dZeWhjWEdKc2RXVmNYQ3dnWEZ4bmNtVjVYRndzSUZ4Y2NtVmtYRndwS1Z4dWFERWdQQzBnU0dWaGRHMWhjQ2hrWVhSaFgyMWhkSEpwZUN3Z2JtRnRaU0E5SUZ4Y2JHOXZjQ0J6WTI5eVpWeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeVgyTnZiSFZ0Ym5NZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJ4MWMzUmxjbDl5YjNkeklEMGdSa0ZNVTBVc1hHNGdJQ0FnSUNBZ0lISnZkMTlyYlNBOUlEZ3NYRzRnSUNBZ0lDQWdJSE5vYjNkZmNtOTNYMlJsYm1RZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ1ltOXlaR1Z5SUQwZ1JrRk1VMFVzWEc0Z0lDQWdJQ0FnSUhOb2IzZGZjbTkzWDI1aGJXVnpJRDBnUmtGTVUwVXNYRzRnSUNBZ0lDQWdJR052YkNBOUlHTnZiRjltZFc0cFhHNWNibVpwYkdWT1lXMWxJRHd0SUdobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1hGeG9aV0YwYldGd1gyTm9aV05yYVc1blJHVnNkR0ZCWTNKdmMzTkRiMjVrYVhScGIyNWZjbVZuWEZ3cEtWeHVjRzVuS0hCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwTENCeVpYTWdQU0EyTURBc0lIVnVhWFJ6SUQwZ1hGeHBibHhjTENCM2FXUjBhQ0E5SURJc0lHaGxhV2RvZENBOUlERXdLVnh1Y0hKcGJuUW9hREVwWEc1a1pYWXViMlptS0NsY2JseHVjMlYwTG5ObFpXUW9NVEl6S1Z4dVhHNW9iVjlrY21GM2JpQThMU0JrY21GM0tHZ3hLVnh1Y205M1gyTnNkWE4wWlhKeklEd3RJSEp2ZDE5dmNtUmxjaWhvYlY5a2NtRjNiaWxjYmx4dWJHOXZjQzVqYkhWemRHVnlNU0E4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk1WMWRYVnh1Ykc5dmNDNWpiSFZ6ZEdWeU1pQThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiTWwxZFhWeHViRzl2Y0M1amJIVnpkR1Z5TXlBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJNMTFkWFZ4dWJHOXZjQzVqYkhWemRHVnlOQ0E4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk5GMWRYVnh1Ykc5dmNDNWpiSFZ6ZEdWeU5TQThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiTlYxZFhWeHViRzl2Y0M1amJIVnpkR1Z5TmlBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJObDFkWFZ4dWJHOXZjQzVqYkhWemRHVnlOeUE4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk4xMWRYVnh1Ykc5dmNDNWpiSFZ6ZEdWeU9DQThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiT0YxZFhWeHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG4jIEhlYXRtYXBcbmxpYnJhcnkoY2lyY2xpemUpXG5cbiMgSGVhdG1hcCAyXG5zZXQuc2VlZCgxMjMpXG5cbmRpZmZDdXRvZmYgPC0gMC4yXG5kYXRhVG9QbG90IDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShpc2RpZmZfZFRBR19ETVNPID0gXG4gICAgICAgICAgICAgICAgICBjYXNlX3doZW4oZGlmZl9kVEFHX0RNU08gPj0gZGlmZkN1dG9mZiB+IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGRpZmZfZFRBR19ETVNPKSA8IGRpZmZDdXRvZmYgfiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZfZFRBR19ETVNPIDw9IC1kaWZmQ3V0b2ZmIH4gLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSxcbiAgICAgICAgICAgICAgICBpc2RpZmZfQTQ4NV9ETVNPID0gXG4gICAgICAgICAgICAgICAgICBjYXNlX3doZW4oZGlmZl9BNDg1X0RNU08gPj0gZGlmZkN1dG9mZiB+IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGRpZmZfQTQ4NV9ETVNPKSA8IGRpZmZDdXRvZmYgfiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZfQTQ4NV9ETVNPIDw9IC1kaWZmQ3V0b2ZmIH4gLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIGlzZGlmZl9kVEFHX0RNU08sIGlzZGlmZl9BNDg1X0RNU08pXG5kYXRhX21hdHJpeCA8LSBkYXRhVG9QbG90ICU+JSBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFxpZFxcKSU+JSBhcy5tYXRyaXgoKVxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoLTEsIDAsIDEpLCBjKFxcYmx1ZVxcLCBcXGdyZXlcXCwgXFxyZWRcXCkpXG5oMSA8LSBIZWF0bWFwKGRhdGFfbWF0cml4LCBuYW1lID0gXFxsb29wIHNjb3JlXFwsXG4gICAgICAgICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSxcbiAgICAgICAgcm93X2ttID0gOCxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBib3JkZXIgPSBGQUxTRSxcbiAgICAgICAgc2hvd19yb3dfbmFtZXMgPSBGQUxTRSxcbiAgICAgICAgY29sID0gY29sX2Z1bilcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXGhlYXRtYXBfY2hlY2tpbmdEZWx0YUFjcm9zc0NvbmRpdGlvbl9yZWdcXCkpXG5wbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMiwgaGVpZ2h0ID0gMTApXG5wcmludChoMSlcbmRldi5vZmYoKVxuXG5zZXQuc2VlZCgxMjMpXG5cbmhtX2RyYXduIDwtIGRyYXcoaDEpXG5yb3dfY2x1c3RlcnMgPC0gcm93X29yZGVyKGhtX2RyYXduKVxuXG5sb29wLmNsdXN0ZXIxIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1sxXV1dXG5sb29wLmNsdXN0ZXIyIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1syXV1dXG5sb29wLmNsdXN0ZXIzIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1szXV1dXG5sb29wLmNsdXN0ZXI0IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s0XV1dXG5sb29wLmNsdXN0ZXI1IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s1XV1dXG5sb29wLmNsdXN0ZXI2IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s2XV1dXG5sb29wLmNsdXN0ZXI3IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s3XV1dXG5sb29wLmNsdXN0ZXI4IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s4XV1dXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBIZWF0bWFwXG5saWJyYXJ5KGNpcmNsaXplKVxuXG4jIEhlYXRtYXAgMlxuc2V0LnNlZWQoMTIzKVxuXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZGF0YVRvUGxvdCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoaXNkaWZmX2RUQUdfRE1TTyA9IFxuICAgICAgICAgICAgICAgICAgY2FzZV93aGVuKGRpZmZfZFRBR19ETVNPID49IGRpZmZDdXRvZmYgfiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhkaWZmX2RUQUdfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmX2RUQUdfRE1TTyA8PSAtZGlmZkN1dG9mZiB+IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSksXG4gICAgICAgICAgICAgICAgaXNkaWZmX0E0ODVfRE1TTyA9IFxuICAgICAgICAgICAgICAgICAgY2FzZV93aGVuKGRpZmZfQTQ4NV9ETVNPID49IGRpZmZDdXRvZmYgfiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhkaWZmX0E0ODVfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmX0E0ODVfRE1TTyA8PSAtZGlmZkN1dG9mZiB+IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGlkLCBpc2RpZmZfZFRBR19ETVNPLCBpc2RpZmZfQTQ4NV9ETVNPKVxuZGF0YV9tYXRyaXggPC0gZGF0YVRvUGxvdCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcaWRcXCklPiUgYXMubWF0cml4KClcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKC0xLCAwLCAxKSwgYyhcXGJsdWVcXCwgXFxncmV5XFwsIFxccmVkXFwpKVxuaDEgPC0gSGVhdG1hcChkYXRhX21hdHJpeCwgbmFtZSA9IFxcbG9vcCBzY29yZVxcLFxuICAgICAgICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsXG4gICAgICAgIHJvd19rbSA9IDgsXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgYm9yZGVyID0gRkFMU0UsXG4gICAgICAgIHNob3dfcm93X25hbWVzID0gRkFMU0UsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4pXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxoZWF0bWFwX2NoZWNraW5nRGVsdGFBY3Jvc3NDb25kaXRpb25fcmVnXFwpKVxucG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDIsIGhlaWdodCA9IDEwKVxucHJpbnQoaDEpXG5kZXYub2ZmKClcblxuc2V0LnNlZWQoMTIzKVxuXG5obV9kcmF3biA8LSBkcmF3KGgxKVxucm93X2NsdXN0ZXJzIDwtIHJvd19vcmRlcihobV9kcmF3bilcblxubG9vcC5jbHVzdGVyMSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbMV1dXVxubG9vcC5jbHVzdGVyMiA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbMl1dXVxubG9vcC5jbHVzdGVyMyA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbM11dXVxubG9vcC5jbHVzdGVyNCA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNF1dXVxubG9vcC5jbHVzdGVyNSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNV1dXVxubG9vcC5jbHVzdGVyNiA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNl1dXVxubG9vcC5jbHVzdGVyNyA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbN11dXVxubG9vcC5jbHVzdGVyOCA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbOF1dXVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
# Heatmap
library(circlize)

# Heatmap 2
set.seed(123)

diffCutoff <- 0.2
dataToPlot <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\)) %>%
  dplyr::mutate(isdiff_dTAG_DMSO = 
                  case_when(diff_dTAG_DMSO >= diffCutoff ~ 1,
                            abs(diff_dTAG_DMSO) < diffCutoff ~ 0,
                            diff_dTAG_DMSO <= -diffCutoff ~ -1,
                            TRUE ~ NA),
                isdiff_A485_DMSO = 
                  case_when(diff_A485_DMSO >= diffCutoff ~ 1,
                            abs(diff_A485_DMSO) < diffCutoff ~ 0,
                            diff_A485_DMSO <= -diffCutoff ~ -1,
                            TRUE ~ NA)) %>%
  dplyr::select(id, isdiff_dTAG_DMSO, isdiff_A485_DMSO)
data_matrix <- dataToPlot %>% column_to_rownames(var = \id\)%>% as.matrix()
col_fun <- colorRamp2(c(-1, 0, 1), c(\blue\, \grey\, \red\))
h1 <- Heatmap(data_matrix, name = \loop score\,
              cluster_columns = FALSE,
              cluster_rows = FALSE,
        row_km = 8,
        show_row_dend = FALSE,
        border = FALSE,
        show_row_names = FALSE,
        col = col_fun)

fileName <- here(figDir, paste0(\heatmap_checkingDeltaAcrossCondition_reg\))
png(paste0(fileName, \.png\), res = 600, units = \in\, width = 2, height = 10)
print(h1)
dev.off()

set.seed(123)

hm_drawn <- draw(h1)
row_clusters <- row_order(hm_drawn)

loop.cluster1 <- temp[row_clusters[[1]]]
loop.cluster2 <- temp[row_clusters[[2]]]
loop.cluster3 <- temp[row_clusters[[3]]]
loop.cluster4 <- temp[row_clusters[[4]]]
loop.cluster5 <- temp[row_clusters[[5]]]
loop.cluster6 <- temp[row_clusters[[6]]]
loop.cluster7 <- temp[row_clusters[[7]]]
loop.cluster8 <- temp[row_clusters[[8]]]

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Checking updown
##### All loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHViR2xpY21GeWVTaGphWEpqYkdsNlpTbGNibHh1YzJWMExuTmxaV1FvTVRJektWeHVaR0YwWVZSdlVHeHZkQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRUZ1Ym04eUlDVnBiaVVnWXloY0lsQXRVRndpTENCY0lsQXRSVndpTENCY0lrVXRSVndpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9hV1FzSUdScFptWmZaRlJCUjE5RVRWTlBMQ0JrYVdabVgwRTBPRFZmUkUxVFR5bGNibVJoZEdGZmJXRjBjbWw0SUR3dElHUmhkR0ZVYjFCc2IzUWdKVDRsSUdOdmJIVnRibDkwYjE5eWIzZHVZVzFsY3loMllYSWdQU0JjSW1sa1hDSXBKVDRsSUdGekxtMWhkSEpwZUNncFhHNWpiMnhmWm5WdUlEd3RJR052Ykc5eVVtRnRjRElvWXlndE1Td2dNQ3dnTVNrc0lHTW9YQ0ppYkhWbFhDSXNJRndpZDJocGRHVmNJaXdnWENKeVpXUmNJaWtwWEc1b01TQThMU0JJWldGMGJXRndLR1JoZEdGZmJXRjBjbWw0TENCdVlXMWxJRDBnWENKc2IyOXdJSE5qYjNKbFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnNkWE4wWlhKZlkyOXNkVzF1Y3lBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JqYkhWemRHVnlYM0p2ZDNNZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ2NtOTNYMnR0SUQwZ05DeGNiaUFnSUNBZ0lDQWdjMmh2ZDE5eWIzZGZaR1Z1WkNBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCaWIzSmtaWElnUFNCVVVsVkZMRnh1SUNBZ0lDQWdJQ0J6YUc5M1gzSnZkMTl1WVcxbGN5QTlJRVpCVEZORkxGeHVJQ0FnSUNBZ0lDQmpiMndnUFNCamIyeGZablZ1S1Z4dVhHNWNibVpwYkdWT1lXMWxJRHd0SUdobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1hDSm9aV0YwYldGd1gyUnBabVpUWTI5eVpWOXlaV2RmYXpSY0lpa3BYRzV3Ym1jb2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrc0lISmxjeUE5SURZd01Dd2dkVzVwZEhNZ1BTQmNJbWx1WENJc0lIZHBaSFJvSUQwZ01pd2dhR1ZwWjJoMElEMGdOaWxjYm5CeWFXNTBLR2d4S1Z4dVpHVjJMbTltWmlncFhHNWNibWh0WDJSeVlYZHVJRHd0SUdSeVlYY29hREVwWEc1eWIzZGZZMngxYzNSbGNuTWdQQzBnY205M1gyOXlaR1Z5S0dodFgyUnlZWGR1S1Z4dVhHNXNiMjl3TG1Oc2RYTjBaWEl4SUR3dElIUmxiWEJiY205M1gyTnNkWE4wWlhKelcxc3hYVjFkWEc1c2IyOXdMbU5zZFhOMFpYSXlJRHd0SUhSbGJYQmJjbTkzWDJOc2RYTjBaWEp6VzFzeVhWMWRYRzVzYjI5d0xtTnNkWE4wWlhJeklEd3RJSFJsYlhCYmNtOTNYMk5zZFhOMFpYSnpXMXN6WFYxZFhHNXNiMjl3TG1Oc2RYTjBaWEkwSUR3dElIUmxiWEJiY205M1gyTnNkWE4wWlhKelcxczBYVjFkWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5zZXQuc2VlZCgxMjMpXG5kYXRhVG9QbG90IDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgZGlmZl9kVEFHX0RNU08sIGRpZmZfQTQ4NV9ETVNPKVxuZGF0YV9tYXRyaXggPC0gZGF0YVRvUGxvdCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcaWRcXCklPiUgYXMubWF0cml4KClcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKC0xLCAwLCAxKSwgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcbmgxIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgsIG5hbWUgPSBcXGxvb3Agc2NvcmVcXCxcbiAgICAgICAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLFxuICAgICAgICByb3dfa20gPSA0LFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGJvcmRlciA9IFRSVUUsXG4gICAgICAgIHNob3dfcm93X25hbWVzID0gRkFMU0UsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4pXG5cblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXGhlYXRtYXBfZGlmZlNjb3JlX3JlZ19rNFxcKSlcbnBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAyLCBoZWlnaHQgPSA2KVxucHJpbnQoaDEpXG5kZXYub2ZmKClcblxuaG1fZHJhd24gPC0gZHJhdyhoMSlcbnJvd19jbHVzdGVycyA8LSByb3dfb3JkZXIoaG1fZHJhd24pXG5cbmxvb3AuY2x1c3RlcjEgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzFdXV1cbmxvb3AuY2x1c3RlcjIgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzJdXV1cbmxvb3AuY2x1c3RlcjMgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzNdXV1cbmxvb3AuY2x1c3RlcjQgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzRdXV1cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
library(circlize)

set.seed(123)
dataToPlot <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\)) %>%
  dplyr::select(id, diff_dTAG_DMSO, diff_A485_DMSO)
data_matrix <- dataToPlot %>% column_to_rownames(var = \id\)%>% as.matrix()
col_fun <- colorRamp2(c(-1, 0, 1), c(\blue\, \white\, \red\))
h1 <- Heatmap(data_matrix, name = \loop score\,
              cluster_columns = FALSE,
              cluster_rows = FALSE,
        row_km = 4,
        show_row_dend = FALSE,
        border = TRUE,
        show_row_names = FALSE,
        col = col_fun)


fileName <- here(figDir, paste0(\heatmap_diffScore_reg_k4\))
png(paste0(fileName, \.png\), res = 600, units = \in\, width = 2, height = 6)
print(h1)
dev.off()

hm_drawn <- draw(h1)
row_clusters <- row_order(hm_drawn)

loop.cluster1 <- temp[row_clusters[[1]]]
loop.cluster2 <- temp[row_clusters[[2]]]
loop.cluster3 <- temp[row_clusters[[3]]]
loop.cluster4 <- temp[row_clusters[[4]]]



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJHbGljbUZ5ZVNoamFYSmpiR2w2WlNsY2JseHVjMlYwTG5ObFpXUW9NVEl6S1Z4dVpHRjBZVlJ2VUd4dmRDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtFRnVibTh5SUNWcGJpVWdZeWhjWEZBdFVGeGNMQ0JjWEZBdFJWeGNMQ0JjWEVVdFJWeGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb2FXUXNJR1JwWm1aZlpGUkJSMTlFVFZOUExDQmthV1ptWDBFME9EVmZSRTFUVHlsY2JtUmhkR0ZmYldGMGNtbDRJRHd0SUdSaGRHRlViMUJzYjNRZ0pUNGxJR052YkhWdGJsOTBiMTl5YjNkdVlXMWxjeWgyWVhJZ1BTQmNYR2xrWEZ3cEpUNGxJR0Z6TG0xaGRISnBlQ2dwWEc1amIyeGZablZ1SUR3dElHTnZiRzl5VW1GdGNESW9ZeWd0TVN3Z01Dd2dNU2tzSUdNb1hGeGliSFZsWEZ3c0lGeGNkMmhwZEdWY1hDd2dYRnh5WldSY1hDa3BYRzVvTVNBOExTQklaV0YwYldGd0tHUmhkR0ZmYldGMGNtbDRMQ0J1WVcxbElEMGdYRnhzYjI5d0lITmpiM0psWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdOc2RYTjBaWEpmWTI5c2RXMXVjeUE5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeVgzSnZkM01nUFNCR1FVeFRSU3hjYmlBZ0lDQWdJQ0FnY205M1gydHRJRDBnTkN4Y2JpQWdJQ0FnSUNBZ2MyaHZkMTl5YjNkZlpHVnVaQ0E5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JpYjNKa1pYSWdQU0JVVWxWRkxGeHVJQ0FnSUNBZ0lDQnphRzkzWDNKdmQxOXVZVzFsY3lBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCamIyd2dQU0JqYjJ4ZlpuVnVLVnh1WEc1Y2JtWnBiR1ZPWVcxbElEd3RJR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWEZ4b1pXRjBiV0Z3WDJScFptWlRZMjl5WlY5eVpXZGZhelJjWENrcFhHNXdibWNvY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkSE1nUFNCY1hHbHVYRndzSUhkcFpIUm9JRDBnTWl3Z2FHVnBaMmgwSUQwZ05pbGNibkJ5YVc1MEtHZ3hLVnh1WkdWMkxtOW1aaWdwWEc1Y2JtaHRYMlJ5WVhkdUlEd3RJR1J5WVhjb2FERXBYRzV5YjNkZlkyeDFjM1JsY25NZ1BDMGdjbTkzWDI5eVpHVnlLR2h0WDJSeVlYZHVLVnh1WEc1c2IyOXdMbU5zZFhOMFpYSXhJRHd0SUhSbGJYQmJjbTkzWDJOc2RYTjBaWEp6VzFzeFhWMWRYRzVzYjI5d0xtTnNkWE4wWlhJeUlEd3RJSFJsYlhCYmNtOTNYMk5zZFhOMFpYSnpXMXN5WFYxZFhHNXNiMjl3TG1Oc2RYTjBaWEl6SUR3dElIUmxiWEJiY205M1gyTnNkWE4wWlhKelcxc3pYVjFkWEc1c2IyOXdMbU5zZFhOMFpYSTBJRHd0SUhSbGJYQmJjbTkzWDJOc2RYTjBaWEp6VzFzMFhWMWRYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5zZXQuc2VlZCgxMjMpXG5kYXRhVG9QbG90IDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgZGlmZl9kVEFHX0RNU08sIGRpZmZfQTQ4NV9ETVNPKVxuZGF0YV9tYXRyaXggPC0gZGF0YVRvUGxvdCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcaWRcXCklPiUgYXMubWF0cml4KClcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKC0xLCAwLCAxKSwgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcbmgxIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgsIG5hbWUgPSBcXGxvb3Agc2NvcmVcXCxcbiAgICAgICAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLFxuICAgICAgICByb3dfa20gPSA0LFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGJvcmRlciA9IFRSVUUsXG4gICAgICAgIHNob3dfcm93X25hbWVzID0gRkFMU0UsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4pXG5cblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXGhlYXRtYXBfZGlmZlNjb3JlX3JlZ19rNFxcKSlcbnBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAyLCBoZWlnaHQgPSA2KVxucHJpbnQoaDEpXG5kZXYub2ZmKClcblxuaG1fZHJhd24gPC0gZHJhdyhoMSlcbnJvd19jbHVzdGVycyA8LSByb3dfb3JkZXIoaG1fZHJhd24pXG5cbmxvb3AuY2x1c3RlcjEgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzFdXV1cbmxvb3AuY2x1c3RlcjIgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzJdXV1cbmxvb3AuY2x1c3RlcjMgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzNdXV1cbmxvb3AuY2x1c3RlcjQgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzRdXV1cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubGlicmFyeShjaXJjbGl6ZSlcblxuc2V0LnNlZWQoMTIzKVxuZGF0YVRvUGxvdCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIGRpZmZfZFRBR19ETVNPLCBkaWZmX0E0ODVfRE1TTylcbmRhdGFfbWF0cml4IDwtIGRhdGFUb1Bsb3QgJT4lIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXGlkXFwpJT4lIGFzLm1hdHJpeCgpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygtMSwgMCwgMSksIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5oMSA8LSBIZWF0bWFwKGRhdGFfbWF0cml4LCBuYW1lID0gXFxsb29wIHNjb3JlXFwsXG4gICAgICAgICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSxcbiAgICAgICAgcm93X2ttID0gNCxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBib3JkZXIgPSBUUlVFLFxuICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLFxuICAgICAgICBjb2wgPSBjb2xfZnVuKVxuXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxoZWF0bWFwX2RpZmZTY29yZV9yZWdfazRcXCkpXG5wbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMiwgaGVpZ2h0ID0gNilcbnByaW50KGgxKVxuZGV2Lm9mZigpXG5cbmhtX2RyYXduIDwtIGRyYXcoaDEpXG5yb3dfY2x1c3RlcnMgPC0gcm93X29yZGVyKGhtX2RyYXduKVxuXG5sb29wLmNsdXN0ZXIxIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1sxXV1dXG5sb29wLmNsdXN0ZXIyIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1syXV1dXG5sb29wLmNsdXN0ZXIzIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1szXV1dXG5sb29wLmNsdXN0ZXI0IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s0XV1dXG5gYGBcbmBgYCJ9 -->

```r
```r
library(circlize)

set.seed(123)
dataToPlot <- data %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\)) %>%
  dplyr::select(id, diff_dTAG_DMSO, diff_A485_DMSO)
data_matrix <- dataToPlot %>% column_to_rownames(var = \id\)%>% as.matrix()
col_fun <- colorRamp2(c(-1, 0, 1), c(\blue\, \white\, \red\))
h1 <- Heatmap(data_matrix, name = \loop score\,
              cluster_columns = FALSE,
              cluster_rows = FALSE,
        row_km = 4,
        show_row_dend = FALSE,
        border = TRUE,
        show_row_names = FALSE,
        col = col_fun)


fileName <- here(figDir, paste0(\heatmap_diffScore_reg_k4\))
png(paste0(fileName, \.png\), res = 600, units = \in\, width = 2, height = 6)
print(h1)
dev.off()

hm_drawn <- draw(h1)
row_clusters <- row_order(hm_drawn)

loop.cluster1 <- temp[row_clusters[[1]]]
loop.cluster2 <- temp[row_clusters[[2]]]
loop.cluster3 <- temp[row_clusters[[3]]]
loop.cluster4 <- temp[row_clusters[[4]]]
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### Reg loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJJWldGMGJXRndYRzVzYVdKeVlYSjVLR05wY21Oc2FYcGxLVnh1WEc1dVlXMWxJRHd0SUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVZ3aVhHNWtZWFJoSUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYQ0l1ZEhOMlhDSXBLU2xjYmlNZ1NHVmhkRzFoY0NBeVhHNXpaWFF1YzJWbFpDZ3hNak1wWEc1Y2JpTWdTVzF3YjNKMElHOWljeTlsZUhBZ2MyTnZjbVZ6SUdGdVpDQnRaWEpuWlNCMGJ5QjBhR1VnWkdGMFlYTmxkRnh1YldsdVZtRnNkV1VnUEMwZ0xUUmNibVJwWm1aRGRYUnZabVlnUEMwZ01DNDFYRzV2WW5ObGVIQWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaGNJbXh2YjNCVFkyOXlaVjlqYjI1elgyOWljMlY0Y0M1MGMzWmNJaWtwS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82YlhWMFlYUmxLR3h2WjE5dlluTmxlSEJmUkUxVFR5QTlJR2xtWDJWc2MyVW9iMkp6Wlhod1gwUk5VMDhnUFQwZ01Dd2diV2x1Vm1Gc2RXVXNJR3h2WnpJb2IySnpaWGh3WDBSTlUwOHBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dloxOXZZbk5sZUhCZlpGUkJSeUE5SUdsbVgyVnNjMlVvYjJKelpYaHdYMlJVUVVjZ1BUMGdNQ3dnYldsdVZtRnNkV1VzSUd4dlp6SW9iMkp6Wlhod1gyUlVRVWNwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5ObGVIQmZRVFE0TlNBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDBFME9EVWdQVDBnTUN3Z2JXbHVWbUZzZFdVc0lHeHZaeklvYjJKelpYaHdYMEUwT0RVcEtTbGNibHh1WEc0aklFMWxjbWRsSUdSaGRHRnpaWFJjYm1SaGRHRlViMUJzYjNRZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9teGxablJmYW05cGJpaHZZbk5sZUhBc0lHSjVJRDBnWXloY0ltbGtYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaHNiMmRmYjJKelpYaHdYMlJwWm1aZlpGUkJSMTlFVFZOUElEMGdiRzluWDI5aWMyVjRjRjlrVkVGSElDMGdiRzluWDI5aWMyVjRjRjlFVFZOUExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5ObGVIQmZaR2xtWmw5Qk5EZzFYMFJOVTA4Z1BTQnNiMmRmYjJKelpYaHdYMEUwT0RVZ0xTQnNiMmRmYjJKelpYaHdYMFJOVTA4c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FYTmthV1ptWDJSVVFVZGZSRTFUVHlBOUlHTmhjMlZmZDJobGJpaHNiMmRmYjJKelpYaHdYMlJwWm1aZlpGUkJSMTlFVFZOUElENDlJR1JwWm1aRGRYUnZabVlnZmlBeExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZV0p6S0d4dloxOXZZbk5sZUhCZlpHbG1abDlrVkVGSFgwUk5VMDhwSUR3Z1pHbG1aa04xZEc5bVppQitJREFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QSUR3OUlHUnBabVpEZFhSdlptWWdmaUF0TVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlNWVVVnZmlCT1FTQXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2x6WkdsbVpsOUJORGcxWDBSTlUwOGdQU0JqWVhObFgzZG9aVzRvYkc5blgyOWljMlY0Y0Y5a2FXWm1YMEUwT0RWZlJFMVRUeUErUFNCa2FXWm1RM1YwYjJabUlINGdNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGaWN5aHNiMmRmYjJKelpYaHdYMlJwWm1aZlFUUTROVjlFVFZOUEtTQThJR1JwWm1aRGRYUnZabVlnZmlBd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrYVdabVgwRTBPRFZmUkUxVFR5QThQU0JrYVdabVEzVjBiMlptSUg0Z0xURXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JVVWxWRklINGdUa0VwS1NVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHbGtMQ0JwYzJScFptWmZaRlJCUjE5RVRWTlBMQ0JwYzJScFptWmZRVFE0TlY5RVRWTlBLVnh1WEc1Y2JseHVaR0YwWVY5dFlYUnlhWGdnUEMwZ1pHRjBZVlJ2VUd4dmRDQWxQaVVnWTI5c2RXMXVYM1J2WDNKdmQyNWhiV1Z6S0haaGNpQTlJRndpYVdSY0lpa2xQaVVnWVhNdWJXRjBjbWw0S0NsY2JtTnZiRjltZFc0Z1BDMGdZMjlzYjNKU1lXMXdNaWhqS0MweExDQXdMQ0F4S1N3Z1l5aGNJbUpzZFdWY0lpd2dYQ0puY21WNVhDSXNJRndpY21Wa1hDSXBLVnh1YURFZ1BDMGdTR1ZoZEcxaGNDaGtZWFJoWDIxaGRISnBlQ3dnYm1GdFpTQTlJRndpYkc5dmNDQnpZMjl5WlZ3aUxGeHVJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeVgyTnZiSFZ0Ym5NZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ1kyeDFjM1JsY2w5eWIzZHpJRDBnUmtGTVUwVXNYRzRnSUNBZ0lDQWdJSEp2ZDE5cmJTQTlJRGtzWEc0Z0lDQWdJQ0FnSUhOb2IzZGZjbTkzWDJSbGJtUWdQU0JHUVV4VFJTeGNiaUFnSUNBZ0lDQWdZbTl5WkdWeUlEMGdSa0ZNVTBVc1hHNGdJQ0FnSUNBZ0lITm9iM2RmY205M1gyNWhiV1Z6SUQwZ1JrRk1VMFVzWEc0Z0lDQWdJQ0FnSUdOdmJDQTlJR052YkY5bWRXNHBYRzVjYm1acGJHVk9ZVzFsSUR3dElHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9YQ0pvWldGMGJXRndYMk5vWldOcmFXNW5SR1ZzZEdGQlkzSnZjM05EYjI1a2FYUnBiMjVmVDBWY0lpa3BYRzV3Ym1jb2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrc0lISmxjeUE5SURZd01Dd2dkVzVwZEhNZ1BTQmNJbWx1WENJc0lIZHBaSFJvSUQwZ01pd2dhR1ZwWjJoMElEMGdNVEFwWEc1d2NtbHVkQ2hvTVNsY2JtUmxkaTV2Wm1Zb0tWeHVJeUJjYmlNZ2MyVjBMbk5sWldRb01USXpLVnh1SXlCY2JpTWdhRzFmWkhKaGQyNGdQQzBnWkhKaGR5aG9NU2xjYmlNZ2NtOTNYMk5zZFhOMFpYSnpJRHd0SUhKdmQxOXZjbVJsY2lob2JWOWtjbUYzYmlsY2JpTWdYRzRqSUd4dmIzQXVZMngxYzNSbGNqRWdQQzBnZEdWdGNGdHliM2RmWTJ4MWMzUmxjbk5iV3pGZFhWMWNiaU1nYkc5dmNDNWpiSFZ6ZEdWeU1pQThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiTWwxZFhWeHVJeUJzYjI5d0xtTnNkWE4wWlhJeklEd3RJSFJsYlhCYmNtOTNYMk5zZFhOMFpYSnpXMXN6WFYxZFhHNGpJR3h2YjNBdVkyeDFjM1JsY2pRZ1BDMGdkR1Z0Y0Z0eWIzZGZZMngxYzNSbGNuTmJXelJkWFYxY2JpTWdiRzl2Y0M1amJIVnpkR1Z5TlNBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJOVjFkWFZ4dUl5QnNiMjl3TG1Oc2RYTjBaWEkySUR3dElIUmxiWEJiY205M1gyTnNkWE4wWlhKelcxczJYVjFkWEc0aklHeHZiM0F1WTJ4MWMzUmxjamNnUEMwZ2RHVnRjRnR5YjNkZlkyeDFjM1JsY25OYld6ZGRYVjFjYmlNZ2JHOXZjQzVqYkhWemRHVnlPQ0E4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk9GMWRYVnh1SXlCc2IyOXdMbU5zZFhOMFpYSTVJRHd0SUhSbGJYQmJjbTkzWDJOc2RYTjBaWEp6VzFzNVhWMWRYRzVjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiMgSGVhdG1hcFxubGlicmFyeShjaXJjbGl6ZSlcblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG4jIEhlYXRtYXAgMlxuc2V0LnNlZWQoMTIzKVxuXG4jIEltcG9ydCBvYnMvZXhwIHNjb3JlcyBhbmQgbWVyZ2UgdG8gdGhlIGRhdGFzZXRcbm1pblZhbHVlIDwtIC00XG5kaWZmQ3V0b2ZmIDwtIDAuNVxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSkpXG5cblxuIyBNZXJnZSBkYXRhc2V0XG5kYXRhVG9QbG90IDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoXFxpZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTyxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGlzZGlmZl9kVEFHX0RNU08gPSBjYXNlX3doZW4obG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA+PSBkaWZmQ3V0b2ZmIH4gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSA8IGRpZmZDdXRvZmYgfiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA8PSBkaWZmQ3V0b2ZmIH4gLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEgKSxcbiAgICAgICAgICAgICAgICBpc2RpZmZfQTQ4NV9ETVNPID0gY2FzZV93aGVuKGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPj0gZGlmZkN1dG9mZiB+IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMobG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPD0gZGlmZkN1dG9mZiB+IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSklPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgaXNkaWZmX2RUQUdfRE1TTywgaXNkaWZmX0E0ODVfRE1TTylcblxuXG5cbmRhdGFfbWF0cml4IDwtIGRhdGFUb1Bsb3QgJT4lIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXGlkXFwpJT4lIGFzLm1hdHJpeCgpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygtMSwgMCwgMSksIGMoXFxibHVlXFwsIFxcZ3JleVxcLCBcXHJlZFxcKSlcbmgxIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgsIG5hbWUgPSBcXGxvb3Agc2NvcmVcXCxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLFxuICAgICAgICByb3dfa20gPSA5LFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGJvcmRlciA9IEZBTFNFLFxuICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLFxuICAgICAgICBjb2wgPSBjb2xfZnVuKVxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxcaGVhdG1hcF9jaGVja2luZ0RlbHRhQWNyb3NzQ29uZGl0aW9uX09FXFwpKVxucG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDIsIGhlaWdodCA9IDEwKVxucHJpbnQoaDEpXG5kZXYub2ZmKClcbiMgXG4jIHNldC5zZWVkKDEyMylcbiMgXG4jIGhtX2RyYXduIDwtIGRyYXcoaDEpXG4jIHJvd19jbHVzdGVycyA8LSByb3dfb3JkZXIoaG1fZHJhd24pXG4jIFxuIyBsb29wLmNsdXN0ZXIxIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1sxXV1dXG4jIGxvb3AuY2x1c3RlcjIgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzJdXV1cbiMgbG9vcC5jbHVzdGVyMyA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbM11dXVxuIyBsb29wLmNsdXN0ZXI0IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s0XV1dXG4jIGxvb3AuY2x1c3RlcjUgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzVdXV1cbiMgbG9vcC5jbHVzdGVyNiA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNl1dXVxuIyBsb29wLmNsdXN0ZXI3IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s3XV1dXG4jIGxvb3AuY2x1c3RlcjggPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzhdXV1cbiMgbG9vcC5jbHVzdGVyOSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbOV1dXVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# Heatmap
library(circlize)

name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
# Heatmap 2
set.seed(123)

# Import obs/exp scores and merge to the dataset
minValue <- -4
diffCutoff <- 0.5
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))


# Merge dataset
dataToPlot <- data %>% dplyr::left_join(obsexp, by = c(\id\)) %>%
  dplyr::mutate(log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO,
                isdiff_dTAG_DMSO = case_when(log_obsexp_diff_dTAG_DMSO >= diffCutoff ~ 1,
                                             abs(log_obsexp_diff_dTAG_DMSO) < diffCutoff ~ 0,
                                             log_obsexp_diff_dTAG_DMSO <= diffCutoff ~ -1,
                                             TRUE ~ NA ),
                isdiff_A485_DMSO = case_when(log_obsexp_diff_A485_DMSO >= diffCutoff ~ 1,
                                             abs(log_obsexp_diff_A485_DMSO) < diffCutoff ~ 0,
                                             log_obsexp_diff_A485_DMSO <= diffCutoff ~ -1,
                                             TRUE ~ NA))%>%
  dplyr::select(id, isdiff_dTAG_DMSO, isdiff_A485_DMSO)



data_matrix <- dataToPlot %>% column_to_rownames(var = \id\)%>% as.matrix()
col_fun <- colorRamp2(c(-1, 0, 1), c(\blue\, \grey\, \red\))
h1 <- Heatmap(data_matrix, name = \loop score\,
        cluster_columns = FALSE,
        cluster_rows = FALSE,
        row_km = 9,
        show_row_dend = FALSE,
        border = FALSE,
        show_row_names = FALSE,
        col = col_fun)

fileName <- here(figDir, paste0(\heatmap_checkingDeltaAcrossCondition_OE\))
png(paste0(fileName, \.png\), res = 600, units = \in\, width = 2, height = 10)
print(h1)
dev.off()
# 
# set.seed(123)
# 
# hm_drawn <- draw(h1)
# row_clusters <- row_order(hm_drawn)
# 
# loop.cluster1 <- temp[row_clusters[[1]]]
# loop.cluster2 <- temp[row_clusters[[2]]]
# loop.cluster3 <- temp[row_clusters[[3]]]
# loop.cluster4 <- temp[row_clusters[[4]]]
# loop.cluster5 <- temp[row_clusters[[5]]]
# loop.cluster6 <- temp[row_clusters[[6]]]
# loop.cluster7 <- temp[row_clusters[[7]]]
# loop.cluster8 <- temp[row_clusters[[8]]]
# loop.cluster9 <- temp[row_clusters[[9]]]



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QklaV0YwYldGd1hHNXNhV0p5WVhKNUtHTnBjbU5zYVhwbEtWeHVYRzV1WVcxbElEd3RJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVnhjWEc1a1lYUmhJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hGd3VkSE4yWEZ3cEtTbGNiaU1nU0dWaGRHMWhjQ0F5WEc1elpYUXVjMlZsWkNneE1qTXBYRzVjYmlNZ1NXMXdiM0owSUc5aWN5OWxlSEFnYzJOdmNtVnpJR0Z1WkNCdFpYSm5aU0IwYnlCMGFHVWdaR0YwWVhObGRGeHViV2x1Vm1Gc2RXVWdQQzBnTFRSY2JtUnBabVpEZFhSdlptWWdQQzBnTUM0MVhHNXZZbk5sZUhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNoY1hHeHZiM0JUWTI5eVpWOWpiMjV6WDI5aWMyVjRjQzUwYzNaY1hDa3BLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHeHZaMTl2WW5ObGVIQmZSRTFUVHlBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDBSTlUwOGdQVDBnTUN3Z2JXbHVWbUZzZFdVc0lHeHZaeklvYjJKelpYaHdYMFJOVTA4cEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WjE5dlluTmxlSEJmWkZSQlJ5QTlJR2xtWDJWc2MyVW9iMkp6Wlhod1gyUlVRVWNnUFQwZ01Dd2diV2x1Vm1Gc2RXVXNJR3h2WnpJb2IySnpaWGh3WDJSVVFVY3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dloxOXZZbk5sZUhCZlFUUTROU0E5SUdsbVgyVnNjMlVvYjJKelpYaHdYMEUwT0RVZ1BUMGdNQ3dnYldsdVZtRnNkV1VzSUd4dlp6SW9iMkp6Wlhod1gwRTBPRFVwS1NsY2JseHVYRzRqSUUxbGNtZGxJR1JoZEdGelpYUmNibVJoZEdGVWIxQnNiM1FnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T214bFpuUmZhbTlwYmlodlluTmxlSEFzSUdKNUlEMGdZeWhjWEdsa1hGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QSUQwZ2JHOW5YMjlpYzJWNGNGOWtWRUZISUMwZ2JHOW5YMjlpYzJWNGNGOUVUVk5QTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dloxOXZZbk5sZUhCZlpHbG1abDlCTkRnMVgwUk5VMDhnUFNCc2IyZGZiMkp6Wlhod1gwRTBPRFVnTFNCc2IyZGZiMkp6Wlhod1gwUk5VMDhzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVhOa2FXWm1YMlJVUVVkZlJFMVRUeUE5SUdOaGMyVmZkMmhsYmloc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QSUQ0OUlHUnBabVpEZFhSdlptWWdmaUF4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXSnpLR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOHBJRHdnWkdsbVprTjFkRzltWmlCK0lEQXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDJScFptWmZaRlJCUjE5RVRWTlBJRHc5SUdScFptWkRkWFJ2Wm1ZZ2ZpQXRNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSU1ZVVWdmaUJPUVNBcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbHpaR2xtWmw5Qk5EZzFYMFJOVTA4Z1BTQmpZWE5sWDNkb1pXNG9iRzluWDI5aWMyVjRjRjlrYVdabVgwRTBPRFZmUkUxVFR5QStQU0JrYVdabVEzVjBiMlptSUg0Z01TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0ZpY3loc2IyZGZiMkp6Wlhod1gyUnBabVpmUVRRNE5WOUVUVk5QS1NBOElHUnBabVpEZFhSdlptWWdmaUF3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOW5YMjlpYzJWNGNGOWthV1ptWDBFME9EVmZSRTFUVHlBOFBTQmthV1ptUTNWMGIyWm1JSDRnTFRFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVbFZGSUg0Z1RrRXBLU1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dsa0xDQnBjMlJwWm1aZlpGUkJSMTlFVFZOUExDQnBjMlJwWm1aZlFUUTROVjlFVFZOUEtWeHVYRzVjYmx4dVpHRjBZVjl0WVhSeWFYZ2dQQzBnWkdGMFlWUnZVR3h2ZENBbFBpVWdZMjlzZFcxdVgzUnZYM0p2ZDI1aGJXVnpLSFpoY2lBOUlGeGNhV1JjWENrbFBpVWdZWE11YldGMGNtbDRLQ2xjYm1OdmJGOW1kVzRnUEMwZ1kyOXNiM0pTWVcxd01paGpLQzB4TENBd0xDQXhLU3dnWXloY1hHSnNkV1ZjWEN3Z1hGeG5jbVY1WEZ3c0lGeGNjbVZrWEZ3cEtWeHVhREVnUEMwZ1NHVmhkRzFoY0Noa1lYUmhYMjFoZEhKcGVDd2dibUZ0WlNBOUlGeGNiRzl2Y0NCelkyOXlaVnhjTEZ4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5WDJOdmJIVnRibk1nUFNCR1FVeFRSU3hjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjbDl5YjNkeklEMGdSa0ZNVTBVc1hHNGdJQ0FnSUNBZ0lISnZkMTlyYlNBOUlEa3NYRzRnSUNBZ0lDQWdJSE5vYjNkZmNtOTNYMlJsYm1RZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ1ltOXlaR1Z5SUQwZ1JrRk1VMFVzWEc0Z0lDQWdJQ0FnSUhOb2IzZGZjbTkzWDI1aGJXVnpJRDBnUmtGTVUwVXNYRzRnSUNBZ0lDQWdJR052YkNBOUlHTnZiRjltZFc0cFhHNWNibVpwYkdWT1lXMWxJRHd0SUdobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1hGeG9aV0YwYldGd1gyTm9aV05yYVc1blJHVnNkR0ZCWTNKdmMzTkRiMjVrYVhScGIyNWZUMFZjWENrcFhHNXdibWNvY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkSE1nUFNCY1hHbHVYRndzSUhkcFpIUm9JRDBnTWl3Z2FHVnBaMmgwSUQwZ01UQXBYRzV3Y21sdWRDaG9NU2xjYm1SbGRpNXZabVlvS1Z4dUl5QmNiaU1nYzJWMExuTmxaV1FvTVRJektWeHVJeUJjYmlNZ2FHMWZaSEpoZDI0Z1BDMGdaSEpoZHlob01TbGNiaU1nY205M1gyTnNkWE4wWlhKeklEd3RJSEp2ZDE5dmNtUmxjaWhvYlY5a2NtRjNiaWxjYmlNZ1hHNGpJR3h2YjNBdVkyeDFjM1JsY2pFZ1BDMGdkR1Z0Y0Z0eWIzZGZZMngxYzNSbGNuTmJXekZkWFYxY2JpTWdiRzl2Y0M1amJIVnpkR1Z5TWlBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJNbDFkWFZ4dUl5QnNiMjl3TG1Oc2RYTjBaWEl6SUR3dElIUmxiWEJiY205M1gyTnNkWE4wWlhKelcxc3pYVjFkWEc0aklHeHZiM0F1WTJ4MWMzUmxjalFnUEMwZ2RHVnRjRnR5YjNkZlkyeDFjM1JsY25OYld6UmRYVjFjYmlNZ2JHOXZjQzVqYkhWemRHVnlOU0E4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk5WMWRYVnh1SXlCc2IyOXdMbU5zZFhOMFpYSTJJRHd0SUhSbGJYQmJjbTkzWDJOc2RYTjBaWEp6VzFzMlhWMWRYRzRqSUd4dmIzQXVZMngxYzNSbGNqY2dQQzBnZEdWdGNGdHliM2RmWTJ4MWMzUmxjbk5iV3pkZFhWMWNiaU1nYkc5dmNDNWpiSFZ6ZEdWeU9DQThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiT0YxZFhWeHVJeUJzYjI5d0xtTnNkWE4wWlhJNUlEd3RJSFJsYlhCYmNtOTNYMk5zZFhOMFpYSnpXMXM1WFYxZFhHNWNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG4jIEhlYXRtYXBcbmxpYnJhcnkoY2lyY2xpemUpXG5cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuIyBIZWF0bWFwIDJcbnNldC5zZWVkKDEyMylcblxuIyBJbXBvcnQgb2JzL2V4cCBzY29yZXMgYW5kIG1lcmdlIHRvIHRoZSBkYXRhc2V0XG5taW5WYWx1ZSA8LSAtNFxuZGlmZkN1dG9mZiA8LSAwLjVcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuXG5cbiMgTWVyZ2UgZGF0YXNldFxuZGF0YVRvUGxvdCA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTyxcbiAgICAgICAgICAgICAgICBpc2RpZmZfZFRBR19ETVNPID0gY2FzZV93aGVuKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPj0gZGlmZkN1dG9mZiB+IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPD0gZGlmZkN1dG9mZiB+IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BICksXG4gICAgICAgICAgICAgICAgaXNkaWZmX0E0ODVfRE1TTyA9IGNhc2Vfd2hlbihsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID49IGRpZmZDdXRvZmYgfiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08pIDwgZGlmZkN1dG9mZiB+IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPIDw9IGRpZmZDdXRvZmYgfiAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIGlzZGlmZl9kVEFHX0RNU08sIGlzZGlmZl9BNDg1X0RNU08pXG5cblxuXG5kYXRhX21hdHJpeCA8LSBkYXRhVG9QbG90ICU+JSBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFxpZFxcKSU+JSBhcy5tYXRyaXgoKVxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoLTEsIDAsIDEpLCBjKFxcYmx1ZVxcLCBcXGdyZXlcXCwgXFxyZWRcXCkpXG5oMSA8LSBIZWF0bWFwKGRhdGFfbWF0cml4LCBuYW1lID0gXFxsb29wIHNjb3JlXFwsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSxcbiAgICAgICAgcm93X2ttID0gOSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBib3JkZXIgPSBGQUxTRSxcbiAgICAgICAgc2hvd19yb3dfbmFtZXMgPSBGQUxTRSxcbiAgICAgICAgY29sID0gY29sX2Z1bilcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXGhlYXRtYXBfY2hlY2tpbmdEZWx0YUFjcm9zc0NvbmRpdGlvbl9PRVxcKSlcbnBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAyLCBoZWlnaHQgPSAxMClcbnByaW50KGgxKVxuZGV2Lm9mZigpXG4jIFxuIyBzZXQuc2VlZCgxMjMpXG4jIFxuIyBobV9kcmF3biA8LSBkcmF3KGgxKVxuIyByb3dfY2x1c3RlcnMgPC0gcm93X29yZGVyKGhtX2RyYXduKVxuIyBcbiMgbG9vcC5jbHVzdGVyMSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbMV1dXVxuIyBsb29wLmNsdXN0ZXIyIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1syXV1dXG4jIGxvb3AuY2x1c3RlcjMgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzNdXV1cbiMgbG9vcC5jbHVzdGVyNCA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNF1dXVxuIyBsb29wLmNsdXN0ZXI1IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s1XV1dXG4jIGxvb3AuY2x1c3RlcjYgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzZdXV1cbiMgbG9vcC5jbHVzdGVyNyA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbN11dXVxuIyBsb29wLmNsdXN0ZXI4IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s4XV1dXG4jIGxvb3AuY2x1c3RlcjkgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzldXV1cblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBIZWF0bWFwXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSlcbiMgSGVhdG1hcCAyXG5zZXQuc2VlZCgxMjMpXG5cbiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldFxubWluVmFsdWUgPC0gLTRcbmRpZmZDdXRvZmYgPC0gMC41XG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSlcblxuXG4jIE1lcmdlIGRhdGFzZXRcbmRhdGFUb1Bsb3QgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgaXNkaWZmX2RUQUdfRE1TTyA9IGNhc2Vfd2hlbihsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID49IGRpZmZDdXRvZmYgfiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08pIDwgZGlmZkN1dG9mZiB+IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPIDw9IGRpZmZDdXRvZmYgfiAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSApLFxuICAgICAgICAgICAgICAgIGlzZGlmZl9BNDg1X0RNU08gPSBjYXNlX3doZW4obG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA+PSBkaWZmQ3V0b2ZmIH4gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPKSA8IGRpZmZDdXRvZmYgfiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA8PSBkaWZmQ3V0b2ZmIH4gLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKSU+JVxuICBkcGx5cjo6c2VsZWN0KGlkLCBpc2RpZmZfZFRBR19ETVNPLCBpc2RpZmZfQTQ4NV9ETVNPKVxuXG5cblxuZGF0YV9tYXRyaXggPC0gZGF0YVRvUGxvdCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcaWRcXCklPiUgYXMubWF0cml4KClcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKC0xLCAwLCAxKSwgYyhcXGJsdWVcXCwgXFxncmV5XFwsIFxccmVkXFwpKVxuaDEgPC0gSGVhdG1hcChkYXRhX21hdHJpeCwgbmFtZSA9IFxcbG9vcCBzY29yZVxcLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsXG4gICAgICAgIHJvd19rbSA9IDksXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgYm9yZGVyID0gRkFMU0UsXG4gICAgICAgIHNob3dfcm93X25hbWVzID0gRkFMU0UsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4pXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxoZWF0bWFwX2NoZWNraW5nRGVsdGFBY3Jvc3NDb25kaXRpb25fT0VcXCkpXG5wbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMiwgaGVpZ2h0ID0gMTApXG5wcmludChoMSlcbmRldi5vZmYoKVxuIyBcbiMgc2V0LnNlZWQoMTIzKVxuIyBcbiMgaG1fZHJhd24gPC0gZHJhdyhoMSlcbiMgcm93X2NsdXN0ZXJzIDwtIHJvd19vcmRlcihobV9kcmF3bilcbiMgXG4jIGxvb3AuY2x1c3RlcjEgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzFdXV1cbiMgbG9vcC5jbHVzdGVyMiA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbMl1dXVxuIyBsb29wLmNsdXN0ZXIzIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1szXV1dXG4jIGxvb3AuY2x1c3RlcjQgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzRdXV1cbiMgbG9vcC5jbHVzdGVyNSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNV1dXVxuIyBsb29wLmNsdXN0ZXI2IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s2XV1dXG4jIGxvb3AuY2x1c3RlcjcgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzddXV1cbiMgbG9vcC5jbHVzdGVyOCA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbOF1dXVxuIyBsb29wLmNsdXN0ZXI5IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s5XV1dXG5cbmBgYFxuYGBgIn0= -->

```r
```r
# Heatmap
library(circlize)

name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
# Heatmap 2
set.seed(123)

# Import obs/exp scores and merge to the dataset
minValue <- -4
diffCutoff <- 0.5
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))


# Merge dataset
dataToPlot <- data %>% dplyr::left_join(obsexp, by = c(\id\)) %>%
  dplyr::mutate(log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO,
                isdiff_dTAG_DMSO = case_when(log_obsexp_diff_dTAG_DMSO >= diffCutoff ~ 1,
                                             abs(log_obsexp_diff_dTAG_DMSO) < diffCutoff ~ 0,
                                             log_obsexp_diff_dTAG_DMSO <= diffCutoff ~ -1,
                                             TRUE ~ NA ),
                isdiff_A485_DMSO = case_when(log_obsexp_diff_A485_DMSO >= diffCutoff ~ 1,
                                             abs(log_obsexp_diff_A485_DMSO) < diffCutoff ~ 0,
                                             log_obsexp_diff_A485_DMSO <= diffCutoff ~ -1,
                                             TRUE ~ NA))%>%
  dplyr::select(id, isdiff_dTAG_DMSO, isdiff_A485_DMSO)



data_matrix <- dataToPlot %>% column_to_rownames(var = \id\)%>% as.matrix()
col_fun <- colorRamp2(c(-1, 0, 1), c(\blue\, \grey\, \red\))
h1 <- Heatmap(data_matrix, name = \loop score\,
        cluster_columns = FALSE,
        cluster_rows = FALSE,
        row_km = 9,
        show_row_dend = FALSE,
        border = FALSE,
        show_row_names = FALSE,
        col = col_fun)

fileName <- here(figDir, paste0(\heatmap_checkingDeltaAcrossCondition_OE\))
png(paste0(fileName, \.png\), res = 600, units = \in\, width = 2, height = 10)
print(h1)
dev.off()
# 
# set.seed(123)
# 
# hm_drawn <- draw(h1)
# row_clusters <- row_order(hm_drawn)
# 
# loop.cluster1 <- temp[row_clusters[[1]]]
# loop.cluster2 <- temp[row_clusters[[2]]]
# loop.cluster3 <- temp[row_clusters[[3]]]
# loop.cluster4 <- temp[row_clusters[[4]]]
# loop.cluster5 <- temp[row_clusters[[5]]]
# loop.cluster6 <- temp[row_clusters[[6]]]
# loop.cluster7 <- temp[row_clusters[[7]]]
# loop.cluster8 <- temp[row_clusters[[8]]]
# loop.cluster9 <- temp[row_clusters[[9]]]

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJJWldGMGJXRndYRzVzYVdKeVlYSjVLR05wY21Oc2FYcGxLVnh1WEc1dVlXMWxJRHd0SUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVZ3aVhHNWtZWFJoSUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYQ0l1ZEhOMlhDSXBLU2xjYmlNZ1NHVmhkRzFoY0NBeVhHNXpaWFF1YzJWbFpDZ3hNak1wWEc1Y2JpTWdTVzF3YjNKMElHOWljeTlsZUhBZ2MyTnZjbVZ6SUdGdVpDQnRaWEpuWlNCMGJ5QjBhR1VnWkdGMFlYTmxkRnh1YldsdVZtRnNkV1VnUEMwZ0xUUmNibVJwWm1aRGRYUnZabVlnUEMwZ01DNDFYRzV2WW5ObGVIQWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaGNJbXh2YjNCVFkyOXlaVjlqYjI1elgyOWljMlY0Y0M1MGMzWmNJaWtwS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82YlhWMFlYUmxLR3h2WjE5dlluTmxlSEJmUkUxVFR5QTlJR2xtWDJWc2MyVW9iMkp6Wlhod1gwUk5VMDhnUFQwZ01Dd2diV2x1Vm1Gc2RXVXNJR3h2WnpJb2IySnpaWGh3WDBSTlUwOHBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dloxOXZZbk5sZUhCZlpGUkJSeUE5SUdsbVgyVnNjMlVvYjJKelpYaHdYMlJVUVVjZ1BUMGdNQ3dnYldsdVZtRnNkV1VzSUd4dlp6SW9iMkp6Wlhod1gyUlVRVWNwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5ObGVIQmZRVFE0TlNBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDBFME9EVWdQVDBnTUN3Z2JXbHVWbUZzZFdVc0lHeHZaeklvYjJKelpYaHdYMEUwT0RVcEtTbGNibHh1WEc0aklFMWxjbWRsSUdSaGRHRnpaWFJjYm1SaGRHRlViMUJzYjNRZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9teGxablJmYW05cGJpaHZZbk5sZUhBc0lHSjVJRDBnWXloY0ltbGtYQ0lwS1NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loQmJtNXZNaUFsYVc0bElHTW9YQ0pRTFZCY0lpd2dYQ0pRTFVWY0lpd2dYQ0pGTFVWY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0d4dloxOXZZbk5sZUhCZlpHbG1abDlrVkVGSFgwUk5VMDhnUFNCc2IyZGZiMkp6Wlhod1gyUlVRVWNnTFNCc2IyZGZiMkp6Wlhod1gwUk5VMDhzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5a2FXWm1YMEUwT0RWZlJFMVRUeUE5SUd4dloxOXZZbk5sZUhCZlFUUTROU0F0SUd4dloxOXZZbk5sZUhCZlJFMVRUeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwYzJScFptWmZaRlJCUjE5RVRWTlBJRDBnWTJGelpWOTNhR1Z1S0d4dloxOXZZbk5sZUhCZlpHbG1abDlrVkVGSFgwUk5VMDhnUGowZ1pHbG1aa04xZEc5bVppQitJREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaFluTW9iRzluWDI5aWMyVjRjRjlrYVdabVgyUlVRVWRmUkUxVFR5a2dQQ0JrYVdabVEzVjBiMlptSUg0Z01DeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOGdQRDBnWkdsbVprTjFkRzltWmlCK0lDMHhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnVkZKVlJTQitJRTVCSUNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FYTmthV1ptWDBFME9EVmZSRTFUVHlBOUlHTmhjMlZmZDJobGJpaHNiMmRmYjJKelpYaHdYMlJwWm1aZlFUUTROVjlFVFZOUElENDlJR1JwWm1aRGRYUnZabVlnZmlBeExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZV0p6S0d4dloxOXZZbk5sZUhCZlpHbG1abDlCTkRnMVgwUk5VMDhwSUR3Z1pHbG1aa04xZEc5bVppQitJREFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyZGZiMkp6Wlhod1gyUnBabVpmUVRRNE5WOUVUVk5QSUR3OUlHUnBabVpEZFhSdlptWWdmaUF0TVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlNWVVVnZmlCT1FTa3BKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvYVdRc0lHbHpaR2xtWmw5a1ZFRkhYMFJOVTA4c0lHbHpaR2xtWmw5Qk5EZzFYMFJOVTA4cFhHNWNibHh1WEc1a1lYUmhYMjFoZEhKcGVDQThMU0JrWVhSaFZHOVFiRzkwSUNVK0pTQmpiMngxYlc1ZmRHOWZjbTkzYm1GdFpYTW9kbUZ5SUQwZ1hDSnBaRndpS1NVK0pTQmhjeTV0WVhSeWFYZ29LVnh1WTI5c1gyWjFiaUE4TFNCamIyeHZjbEpoYlhBeUtHTW9MVEVzSURBc0lERXBMQ0JqS0Z3aVlteDFaVndpTENCY0ltZHlaWGxjSWl3Z1hDSnlaV1JjSWlrcFhHNW9NU0E4TFNCSVpXRjBiV0Z3S0dSaGRHRmZiV0YwY21sNExDQnVZVzFsSUQwZ1hDSnNiMjl3SUhOamIzSmxYQ0lzWEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpmWTI5c2RXMXVjeUE5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JqYkhWemRHVnlYM0p2ZDNNZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ2NtOTNYMnR0SUQwZ09TeGNiaUFnSUNBZ0lDQWdjMmh2ZDE5eWIzZGZaR1Z1WkNBOUlFWkJURk5GTEZ4dUlDQWdJQ0FnSUNCaWIzSmtaWElnUFNCR1FVeFRSU3hjYmlBZ0lDQWdJQ0FnYzJodmQxOXliM2RmYm1GdFpYTWdQU0JHUVV4VFJTeGNiaUFnSUNBZ0lDQWdZMjlzSUQwZ1kyOXNYMloxYmlsY2JseHVabWxzWlU1aGJXVWdQQzBnYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNoY0ltaGxZWFJ0WVhCZlkyaGxZMnRwYm1kRVpXeDBZVUZqY205emMwTnZibVJwZEdsdmJsOXlaV2RmVDBWY0lpa3BYRzV3Ym1jb2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrc0lISmxjeUE5SURZd01Dd2dkVzVwZEhNZ1BTQmNJbWx1WENJc0lIZHBaSFJvSUQwZ01pd2dhR1ZwWjJoMElEMGdNVEFwWEc1d2NtbHVkQ2hvTVNsY2JtUmxkaTV2Wm1Zb0tWeHVJeUJjYmlNZ2MyVjBMbk5sWldRb01USXpLVnh1SXlCY2JpTWdhRzFmWkhKaGQyNGdQQzBnWkhKaGR5aG9NU2xjYmlNZ2NtOTNYMk5zZFhOMFpYSnpJRHd0SUhKdmQxOXZjbVJsY2lob2JWOWtjbUYzYmlsY2JpTWdYRzRqSUd4dmIzQXVZMngxYzNSbGNqRWdQQzBnZEdWdGNGdHliM2RmWTJ4MWMzUmxjbk5iV3pGZFhWMWNiaU1nYkc5dmNDNWpiSFZ6ZEdWeU1pQThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiTWwxZFhWeHVJeUJzYjI5d0xtTnNkWE4wWlhJeklEd3RJSFJsYlhCYmNtOTNYMk5zZFhOMFpYSnpXMXN6WFYxZFhHNGpJR3h2YjNBdVkyeDFjM1JsY2pRZ1BDMGdkR1Z0Y0Z0eWIzZGZZMngxYzNSbGNuTmJXelJkWFYxY2JpTWdiRzl2Y0M1amJIVnpkR1Z5TlNBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJOVjFkWFZ4dUl5QnNiMjl3TG1Oc2RYTjBaWEkySUR3dElIUmxiWEJiY205M1gyTnNkWE4wWlhKelcxczJYVjFkWEc0aklHeHZiM0F1WTJ4MWMzUmxjamNnUEMwZ2RHVnRjRnR5YjNkZlkyeDFjM1JsY25OYld6ZGRYVjFjYmlNZ2JHOXZjQzVqYkhWemRHVnlPQ0E4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk9GMWRYVnh1SXlCc2IyOXdMbU5zZFhOMFpYSTVJRHd0SUhSbGJYQmJjbTkzWDJOc2RYTjBaWEp6VzFzNVhWMWRYRzVjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbiMgSGVhdG1hcFxubGlicmFyeShjaXJjbGl6ZSlcblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG4jIEhlYXRtYXAgMlxuc2V0LnNlZWQoMTIzKVxuXG4jIEltcG9ydCBvYnMvZXhwIHNjb3JlcyBhbmQgbWVyZ2UgdG8gdGhlIGRhdGFzZXRcbm1pblZhbHVlIDwtIC00XG5kaWZmQ3V0b2ZmIDwtIDAuNVxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSkpXG5cblxuIyBNZXJnZSBkYXRhc2V0XG5kYXRhVG9QbG90IDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoXFxpZFxcKSkgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgaXNkaWZmX2RUQUdfRE1TTyA9IGNhc2Vfd2hlbihsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID49IGRpZmZDdXRvZmYgfiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08pIDwgZGlmZkN1dG9mZiB+IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPIDw9IGRpZmZDdXRvZmYgfiAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSApLFxuICAgICAgICAgICAgICAgIGlzZGlmZl9BNDg1X0RNU08gPSBjYXNlX3doZW4obG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA+PSBkaWZmQ3V0b2ZmIH4gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPKSA8IGRpZmZDdXRvZmYgfiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA8PSBkaWZmQ3V0b2ZmIH4gLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKSU+JVxuICBkcGx5cjo6c2VsZWN0KGlkLCBpc2RpZmZfZFRBR19ETVNPLCBpc2RpZmZfQTQ4NV9ETVNPKVxuXG5cblxuZGF0YV9tYXRyaXggPC0gZGF0YVRvUGxvdCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcaWRcXCklPiUgYXMubWF0cml4KClcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKC0xLCAwLCAxKSwgYyhcXGJsdWVcXCwgXFxncmV5XFwsIFxccmVkXFwpKVxuaDEgPC0gSGVhdG1hcChkYXRhX21hdHJpeCwgbmFtZSA9IFxcbG9vcCBzY29yZVxcLFxuICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxcbiAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsXG4gICAgICAgIHJvd19rbSA9IDksXG4gICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgICAgICAgYm9yZGVyID0gRkFMU0UsXG4gICAgICAgIHNob3dfcm93X25hbWVzID0gRkFMU0UsXG4gICAgICAgIGNvbCA9IGNvbF9mdW4pXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoXFxoZWF0bWFwX2NoZWNraW5nRGVsdGFBY3Jvc3NDb25kaXRpb25fcmVnX09FXFwpKVxucG5nKHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpLCByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IDIsIGhlaWdodCA9IDEwKVxucHJpbnQoaDEpXG5kZXYub2ZmKClcbiMgXG4jIHNldC5zZWVkKDEyMylcbiMgXG4jIGhtX2RyYXduIDwtIGRyYXcoaDEpXG4jIHJvd19jbHVzdGVycyA8LSByb3dfb3JkZXIoaG1fZHJhd24pXG4jIFxuIyBsb29wLmNsdXN0ZXIxIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1sxXV1dXG4jIGxvb3AuY2x1c3RlcjIgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzJdXV1cbiMgbG9vcC5jbHVzdGVyMyA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbM11dXVxuIyBsb29wLmNsdXN0ZXI0IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s0XV1dXG4jIGxvb3AuY2x1c3RlcjUgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzVdXV1cbiMgbG9vcC5jbHVzdGVyNiA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNl1dXVxuIyBsb29wLmNsdXN0ZXI3IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s3XV1dXG4jIGxvb3AuY2x1c3RlcjggPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzhdXV1cbiMgbG9vcC5jbHVzdGVyOSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbOV1dXVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# Heatmap
library(circlize)

name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
# Heatmap 2
set.seed(123)

# Import obs/exp scores and merge to the dataset
minValue <- -4
diffCutoff <- 0.5
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))


# Merge dataset
dataToPlot <- data %>% dplyr::left_join(obsexp, by = c(\id\)) %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\)) %>%
  dplyr::mutate(log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO,
                isdiff_dTAG_DMSO = case_when(log_obsexp_diff_dTAG_DMSO >= diffCutoff ~ 1,
                                             abs(log_obsexp_diff_dTAG_DMSO) < diffCutoff ~ 0,
                                             log_obsexp_diff_dTAG_DMSO <= diffCutoff ~ -1,
                                             TRUE ~ NA ),
                isdiff_A485_DMSO = case_when(log_obsexp_diff_A485_DMSO >= diffCutoff ~ 1,
                                             abs(log_obsexp_diff_A485_DMSO) < diffCutoff ~ 0,
                                             log_obsexp_diff_A485_DMSO <= diffCutoff ~ -1,
                                             TRUE ~ NA))%>%
  dplyr::select(id, isdiff_dTAG_DMSO, isdiff_A485_DMSO)



data_matrix <- dataToPlot %>% column_to_rownames(var = \id\)%>% as.matrix()
col_fun <- colorRamp2(c(-1, 0, 1), c(\blue\, \grey\, \red\))
h1 <- Heatmap(data_matrix, name = \loop score\,
        cluster_columns = FALSE,
        cluster_rows = FALSE,
        row_km = 9,
        show_row_dend = FALSE,
        border = FALSE,
        show_row_names = FALSE,
        col = col_fun)

fileName <- here(figDir, paste0(\heatmap_checkingDeltaAcrossCondition_reg_OE\))
png(paste0(fileName, \.png\), res = 600, units = \in\, width = 2, height = 10)
print(h1)
dev.off()
# 
# set.seed(123)
# 
# hm_drawn <- draw(h1)
# row_clusters <- row_order(hm_drawn)
# 
# loop.cluster1 <- temp[row_clusters[[1]]]
# loop.cluster2 <- temp[row_clusters[[2]]]
# loop.cluster3 <- temp[row_clusters[[3]]]
# loop.cluster4 <- temp[row_clusters[[4]]]
# loop.cluster5 <- temp[row_clusters[[5]]]
# loop.cluster6 <- temp[row_clusters[[6]]]
# loop.cluster7 <- temp[row_clusters[[7]]]
# loop.cluster8 <- temp[row_clusters[[8]]]
# loop.cluster9 <- temp[row_clusters[[9]]]



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QklaV0YwYldGd1hHNXNhV0p5WVhKNUtHTnBjbU5zYVhwbEtWeHVYRzV1WVcxbElEd3RJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVnhjWEc1a1lYUmhJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hGd3VkSE4yWEZ3cEtTbGNiaU1nU0dWaGRHMWhjQ0F5WEc1elpYUXVjMlZsWkNneE1qTXBYRzVjYmlNZ1NXMXdiM0owSUc5aWN5OWxlSEFnYzJOdmNtVnpJR0Z1WkNCdFpYSm5aU0IwYnlCMGFHVWdaR0YwWVhObGRGeHViV2x1Vm1Gc2RXVWdQQzBnTFRSY2JtUnBabVpEZFhSdlptWWdQQzBnTUM0MVhHNXZZbk5sZUhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNoY1hHeHZiM0JUWTI5eVpWOWpiMjV6WDI5aWMyVjRjQzUwYzNaY1hDa3BLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHeHZaMTl2WW5ObGVIQmZSRTFUVHlBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDBSTlUwOGdQVDBnTUN3Z2JXbHVWbUZzZFdVc0lHeHZaeklvYjJKelpYaHdYMFJOVTA4cEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WjE5dlluTmxlSEJmWkZSQlJ5QTlJR2xtWDJWc2MyVW9iMkp6Wlhod1gyUlVRVWNnUFQwZ01Dd2diV2x1Vm1Gc2RXVXNJR3h2WnpJb2IySnpaWGh3WDJSVVFVY3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dloxOXZZbk5sZUhCZlFUUTROU0E5SUdsbVgyVnNjMlVvYjJKelpYaHdYMEUwT0RVZ1BUMGdNQ3dnYldsdVZtRnNkV1VzSUd4dlp6SW9iMkp6Wlhod1gwRTBPRFVwS1NsY2JseHVYRzRqSUUxbGNtZGxJR1JoZEdGelpYUmNibVJoZEdGVWIxQnNiM1FnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T214bFpuUmZhbTlwYmlodlluTmxlSEFzSUdKNUlEMGdZeWhjWEdsa1hGd3BLU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhCYm01dk1pQWxhVzRsSUdNb1hGeFFMVkJjWEN3Z1hGeFFMVVZjWEN3Z1hGeEZMVVZjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOGdQU0JzYjJkZmIySnpaWGh3WDJSVVFVY2dMU0JzYjJkZmIySnpaWGh3WDBSTlUwOHNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrYVdabVgwRTBPRFZmUkUxVFR5QTlJR3h2WjE5dlluTmxlSEJmUVRRNE5TQXRJR3h2WjE5dlluTmxlSEJmUkUxVFR5eGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBjMlJwWm1aZlpGUkJSMTlFVFZOUElEMGdZMkZ6WlY5M2FHVnVLR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOGdQajBnWkdsbVprTjFkRzltWmlCK0lERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoWW5Nb2JHOW5YMjlpYzJWNGNGOWthV1ptWDJSVVFVZGZSRTFUVHlrZ1BDQmthV1ptUTNWMGIyWm1JSDRnTUN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5ObGVIQmZaR2xtWmw5a1ZFRkhYMFJOVTA4Z1BEMGdaR2xtWmtOMWRHOW1aaUIrSUMweExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdWRkpWUlNCK0lFNUJJQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVhOa2FXWm1YMEUwT0RWZlJFMVRUeUE5SUdOaGMyVmZkMmhsYmloc2IyZGZiMkp6Wlhod1gyUnBabVpmUVRRNE5WOUVUVk5QSUQ0OUlHUnBabVpEZFhSdlptWWdmaUF4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXSnpLR3h2WjE5dlluTmxlSEJmWkdsbVpsOUJORGcxWDBSTlUwOHBJRHdnWkdsbVprTjFkRzltWmlCK0lEQXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDJScFptWmZRVFE0TlY5RVRWTlBJRHc5SUdScFptWkRkWFJ2Wm1ZZ2ZpQXRNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSU1ZVVWdmaUJPUVNrcEpUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9hV1FzSUdselpHbG1abDlrVkVGSFgwUk5VMDhzSUdselpHbG1abDlCTkRnMVgwUk5VMDhwWEc1Y2JseHVYRzVrWVhSaFgyMWhkSEpwZUNBOExTQmtZWFJoVkc5UWJHOTBJQ1UrSlNCamIyeDFiVzVmZEc5ZmNtOTNibUZ0WlhNb2RtRnlJRDBnWEZ4cFpGeGNLU1UrSlNCaGN5NXRZWFJ5YVhnb0tWeHVZMjlzWDJaMWJpQThMU0JqYjJ4dmNsSmhiWEF5S0dNb0xURXNJREFzSURFcExDQmpLRnhjWW14MVpWeGNMQ0JjWEdkeVpYbGNYQ3dnWEZ4eVpXUmNYQ2twWEc1b01TQThMU0JJWldGMGJXRndLR1JoZEdGZmJXRjBjbWw0TENCdVlXMWxJRDBnWEZ4c2IyOXdJSE5qYjNKbFhGd3NYRzRnSUNBZ0lDQWdJR05zZFhOMFpYSmZZMjlzZFcxdWN5QTlJRVpCVEZORkxGeHVJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeVgzSnZkM01nUFNCR1FVeFRSU3hjYmlBZ0lDQWdJQ0FnY205M1gydHRJRDBnT1N4Y2JpQWdJQ0FnSUNBZ2MyaHZkMTl5YjNkZlpHVnVaQ0E5SUVaQlRGTkZMRnh1SUNBZ0lDQWdJQ0JpYjNKa1pYSWdQU0JHUVV4VFJTeGNiaUFnSUNBZ0lDQWdjMmh2ZDE5eWIzZGZibUZ0WlhNZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ1kyOXNJRDBnWTI5c1gyWjFiaWxjYmx4dVptbHNaVTVoYldVZ1BDMGdhR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2hjWEdobFlYUnRZWEJmWTJobFkydHBibWRFWld4MFlVRmpjbTl6YzBOdmJtUnBkR2x2Ymw5eVpXZGZUMFZjWENrcFhHNXdibWNvY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkSE1nUFNCY1hHbHVYRndzSUhkcFpIUm9JRDBnTWl3Z2FHVnBaMmgwSUQwZ01UQXBYRzV3Y21sdWRDaG9NU2xjYm1SbGRpNXZabVlvS1Z4dUl5QmNiaU1nYzJWMExuTmxaV1FvTVRJektWeHVJeUJjYmlNZ2FHMWZaSEpoZDI0Z1BDMGdaSEpoZHlob01TbGNiaU1nY205M1gyTnNkWE4wWlhKeklEd3RJSEp2ZDE5dmNtUmxjaWhvYlY5a2NtRjNiaWxjYmlNZ1hHNGpJR3h2YjNBdVkyeDFjM1JsY2pFZ1BDMGdkR1Z0Y0Z0eWIzZGZZMngxYzNSbGNuTmJXekZkWFYxY2JpTWdiRzl2Y0M1amJIVnpkR1Z5TWlBOExTQjBaVzF3VzNKdmQxOWpiSFZ6ZEdWeWMxdGJNbDFkWFZ4dUl5QnNiMjl3TG1Oc2RYTjBaWEl6SUR3dElIUmxiWEJiY205M1gyTnNkWE4wWlhKelcxc3pYVjFkWEc0aklHeHZiM0F1WTJ4MWMzUmxjalFnUEMwZ2RHVnRjRnR5YjNkZlkyeDFjM1JsY25OYld6UmRYVjFjYmlNZ2JHOXZjQzVqYkhWemRHVnlOU0E4TFNCMFpXMXdXM0p2ZDE5amJIVnpkR1Z5YzF0Yk5WMWRYVnh1SXlCc2IyOXdMbU5zZFhOMFpYSTJJRHd0SUhSbGJYQmJjbTkzWDJOc2RYTjBaWEp6VzFzMlhWMWRYRzRqSUd4dmIzQXVZMngxYzNSbGNqY2dQQzBnZEdWdGNGdHliM2RmWTJ4MWMzUmxjbk5iV3pkZFhWMWNiaU1nYkc5dmNDNWpiSFZ6ZEdWeU9DQThMU0IwWlcxd1czSnZkMTlqYkhWemRHVnljMXRiT0YxZFhWeHVJeUJzYjI5d0xtTnNkWE4wWlhJNUlEd3RJSFJsYlhCYmNtOTNYMk5zZFhOMFpYSnpXMXM1WFYxZFhHNWNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG4jIEhlYXRtYXBcbmxpYnJhcnkoY2lyY2xpemUpXG5cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuIyBIZWF0bWFwIDJcbnNldC5zZWVkKDEyMylcblxuIyBJbXBvcnQgb2JzL2V4cCBzY29yZXMgYW5kIG1lcmdlIHRvIHRoZSBkYXRhc2V0XG5taW5WYWx1ZSA8LSAtNFxuZGlmZkN1dG9mZiA8LSAwLjVcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuXG5cbiMgTWVyZ2UgZGF0YXNldFxuZGF0YVRvUGxvdCA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTyxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGlzZGlmZl9kVEFHX0RNU08gPSBjYXNlX3doZW4obG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA+PSBkaWZmQ3V0b2ZmIH4gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSA8IGRpZmZDdXRvZmYgfiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA8PSBkaWZmQ3V0b2ZmIH4gLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEgKSxcbiAgICAgICAgICAgICAgICBpc2RpZmZfQTQ4NV9ETVNPID0gY2FzZV93aGVuKGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPj0gZGlmZkN1dG9mZiB+IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMobG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPD0gZGlmZkN1dG9mZiB+IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSklPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgaXNkaWZmX2RUQUdfRE1TTywgaXNkaWZmX0E0ODVfRE1TTylcblxuXG5cbmRhdGFfbWF0cml4IDwtIGRhdGFUb1Bsb3QgJT4lIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXGlkXFwpJT4lIGFzLm1hdHJpeCgpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygtMSwgMCwgMSksIGMoXFxibHVlXFwsIFxcZ3JleVxcLCBcXHJlZFxcKSlcbmgxIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgsIG5hbWUgPSBcXGxvb3Agc2NvcmVcXCxcbiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsXG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLFxuICAgICAgICByb3dfa20gPSA5LFxuICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsXG4gICAgICAgIGJvcmRlciA9IEZBTFNFLFxuICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLFxuICAgICAgICBjb2wgPSBjb2xfZnVuKVxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKFxcaGVhdG1hcF9jaGVja2luZ0RlbHRhQWNyb3NzQ29uZGl0aW9uX3JlZ19PRVxcKSlcbnBuZyhwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSwgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSAyLCBoZWlnaHQgPSAxMClcbnByaW50KGgxKVxuZGV2Lm9mZigpXG4jIFxuIyBzZXQuc2VlZCgxMjMpXG4jIFxuIyBobV9kcmF3biA8LSBkcmF3KGgxKVxuIyByb3dfY2x1c3RlcnMgPC0gcm93X29yZGVyKGhtX2RyYXduKVxuIyBcbiMgbG9vcC5jbHVzdGVyMSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbMV1dXVxuIyBsb29wLmNsdXN0ZXIyIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1syXV1dXG4jIGxvb3AuY2x1c3RlcjMgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzNdXV1cbiMgbG9vcC5jbHVzdGVyNCA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNF1dXVxuIyBsb29wLmNsdXN0ZXI1IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s1XV1dXG4jIGxvb3AuY2x1c3RlcjYgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzZdXV1cbiMgbG9vcC5jbHVzdGVyNyA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbN11dXVxuIyBsb29wLmNsdXN0ZXI4IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s4XV1dXG4jIGxvb3AuY2x1c3RlcjkgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzldXV1cblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBIZWF0bWFwXG5saWJyYXJ5KGNpcmNsaXplKVxuXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSlcbiMgSGVhdG1hcCAyXG5zZXQuc2VlZCgxMjMpXG5cbiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldFxubWluVmFsdWUgPC0gLTRcbmRpZmZDdXRvZmYgPC0gMC41XG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSlcblxuXG4jIE1lcmdlIGRhdGFzZXRcbmRhdGFUb1Bsb3QgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTyxcbiAgICAgICAgICAgICAgICBpc2RpZmZfZFRBR19ETVNPID0gY2FzZV93aGVuKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPj0gZGlmZkN1dG9mZiB+IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPD0gZGlmZkN1dG9mZiB+IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BICksXG4gICAgICAgICAgICAgICAgaXNkaWZmX0E0ODVfRE1TTyA9IGNhc2Vfd2hlbihsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID49IGRpZmZDdXRvZmYgfiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08pIDwgZGlmZkN1dG9mZiB+IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPIDw9IGRpZmZDdXRvZmYgfiAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIGlzZGlmZl9kVEFHX0RNU08sIGlzZGlmZl9BNDg1X0RNU08pXG5cblxuXG5kYXRhX21hdHJpeCA8LSBkYXRhVG9QbG90ICU+JSBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFxpZFxcKSU+JSBhcy5tYXRyaXgoKVxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoLTEsIDAsIDEpLCBjKFxcYmx1ZVxcLCBcXGdyZXlcXCwgXFxyZWRcXCkpXG5oMSA8LSBIZWF0bWFwKGRhdGFfbWF0cml4LCBuYW1lID0gXFxsb29wIHNjb3JlXFwsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLFxuICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSxcbiAgICAgICAgcm93X2ttID0gOSxcbiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICAgICAgICBib3JkZXIgPSBGQUxTRSxcbiAgICAgICAgc2hvd19yb3dfbmFtZXMgPSBGQUxTRSxcbiAgICAgICAgY29sID0gY29sX2Z1bilcblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMChcXGhlYXRtYXBfY2hlY2tpbmdEZWx0YUFjcm9zc0NvbmRpdGlvbl9yZWdfT0VcXCkpXG5wbmcocGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCksIHJlcyA9IDYwMCwgdW5pdHMgPSBcXGluXFwsIHdpZHRoID0gMiwgaGVpZ2h0ID0gMTApXG5wcmludChoMSlcbmRldi5vZmYoKVxuIyBcbiMgc2V0LnNlZWQoMTIzKVxuIyBcbiMgaG1fZHJhd24gPC0gZHJhdyhoMSlcbiMgcm93X2NsdXN0ZXJzIDwtIHJvd19vcmRlcihobV9kcmF3bilcbiMgXG4jIGxvb3AuY2x1c3RlcjEgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzFdXV1cbiMgbG9vcC5jbHVzdGVyMiA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbMl1dXVxuIyBsb29wLmNsdXN0ZXIzIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1szXV1dXG4jIGxvb3AuY2x1c3RlcjQgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzRdXV1cbiMgbG9vcC5jbHVzdGVyNSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNV1dXVxuIyBsb29wLmNsdXN0ZXI2IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s2XV1dXG4jIGxvb3AuY2x1c3RlcjcgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzddXV1cbiMgbG9vcC5jbHVzdGVyOCA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbOF1dXVxuIyBsb29wLmNsdXN0ZXI5IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s5XV1dXG5cbmBgYFxuYGBgIn0= -->

```r
```r
# Heatmap
library(circlize)

name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))
# Heatmap 2
set.seed(123)

# Import obs/exp scores and merge to the dataset
minValue <- -4
diffCutoff <- 0.5
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))


# Merge dataset
dataToPlot <- data %>% dplyr::left_join(obsexp, by = c(\id\)) %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\)) %>%
  dplyr::mutate(log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO,
                isdiff_dTAG_DMSO = case_when(log_obsexp_diff_dTAG_DMSO >= diffCutoff ~ 1,
                                             abs(log_obsexp_diff_dTAG_DMSO) < diffCutoff ~ 0,
                                             log_obsexp_diff_dTAG_DMSO <= diffCutoff ~ -1,
                                             TRUE ~ NA ),
                isdiff_A485_DMSO = case_when(log_obsexp_diff_A485_DMSO >= diffCutoff ~ 1,
                                             abs(log_obsexp_diff_A485_DMSO) < diffCutoff ~ 0,
                                             log_obsexp_diff_A485_DMSO <= diffCutoff ~ -1,
                                             TRUE ~ NA))%>%
  dplyr::select(id, isdiff_dTAG_DMSO, isdiff_A485_DMSO)



data_matrix <- dataToPlot %>% column_to_rownames(var = \id\)%>% as.matrix()
col_fun <- colorRamp2(c(-1, 0, 1), c(\blue\, \grey\, \red\))
h1 <- Heatmap(data_matrix, name = \loop score\,
        cluster_columns = FALSE,
        cluster_rows = FALSE,
        row_km = 9,
        show_row_dend = FALSE,
        border = FALSE,
        show_row_names = FALSE,
        col = col_fun)

fileName <- here(figDir, paste0(\heatmap_checkingDeltaAcrossCondition_reg_OE\))
png(paste0(fileName, \.png\), res = 600, units = \in\, width = 2, height = 10)
print(h1)
dev.off()
# 
# set.seed(123)
# 
# hm_drawn <- draw(h1)
# row_clusters <- row_order(hm_drawn)
# 
# loop.cluster1 <- temp[row_clusters[[1]]]
# loop.cluster2 <- temp[row_clusters[[2]]]
# loop.cluster3 <- temp[row_clusters[[3]]]
# loop.cluster4 <- temp[row_clusters[[4]]]
# loop.cluster5 <- temp[row_clusters[[5]]]
# loop.cluster6 <- temp[row_clusters[[6]]]
# loop.cluster7 <- temp[row_clusters[[7]]]
# loop.cluster8 <- temp[row_clusters[[8]]]
# loop.cluster9 <- temp[row_clusters[[9]]]

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### All loops _OE

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHViV0Z5WjJsdVJYSnliM0lnUEMwZ1puVnVZM1JwYjI0b2JYbE1hWE4wS1NCN1hHNGdJSE5oYlhCc1pTNXVJRDBnYkdWdVozUm9LRzE1VEdsemRDbGNiaUFnYzJGdGNHeGxMbk5rSUQwZ2MyUW9iWGxNYVhOMEtWeHVJQ0J6WVcxd2JHVXVjMlVnUFNCellXMXdiR1V1YzJRdmMzRnlkQ2h6WVcxd2JHVXViaWxjYmlBZ1lXeHdhR0VnUFNBd0xqQTFYRzRnSUdSbFozSmxaWE11Wm5KbFpXUnZiU0E5SUhOaGJYQnNaUzV1SUMwZ01WeHVJQ0IwTG5OamIzSmxJRDBnY1hRb2NDQTlJR0ZzY0doaEx6SXNJR1JtSUQwZ1pHVm5jbVZsY3k1bWNtVmxaRzl0TENCc2IzZGxjaTUwWVdsc0lEMGdSaWxjYmlBZ2JXRnlaMmx1TG1WeWNtOXlJRDBnZEM1elkyOXlaU3B6WVcxd2JHVXVjMlZjYmlBZ2NtVjBkWEp1S0cxaGNtZHBiaTVsY25KdmNpbGNibjFjYmx4dVVGSlBjMlZ4TG1KdlltSnBaU0E4TFNCaGMxOTBhV0ppYkdVb1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2lZbTlpWW1sbFgyZGxibVZmWTJ4aGMzTnBabWxqWVhScGIyNHVZM04yWENJcEtTbGNibHh1WjJWdVpVeHBjM1F1UlhCcExtUlVRVWN1ZFhBZ1BDMGdLR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1ScFptWmZSekV1WkZSQlIxOUhNUzVGY0drdVpGUkJSMTkyYzE5SE1TNUZjR2t1UkUxVFR5NTBjM1pjSWlrcElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIQmhaR29nUENBd0xqQTFMQ0JzYjJjeVJtOXNaRU5vWVc1blpTQStJREFwS1NSbGJuTmxiV0pzWDJkbGJtVmZhV1JjYmx4dVoyVnVaVXhwYzNRdVJYQnBMbVJVUVVjdVpHOTNiaUE4TFNBb1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laR2xtWmw5SE1TNWtWRUZIWDBjeExrVndhUzVrVkVGSFgzWnpYMGN4TGtWd2FTNUVUVk5QTG5SemRsd2lLU2tnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvY0dGa2FpQThJREF1TURVc0lHeHZaekpHYjJ4a1EyaGhibWRsSUR3Z01Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVYRzRqSXlCRGIyNTJaWEowYVc1bklIUnlZVzV6WTNKcGNIUWdTVVFnZEc4Z1oyVnVaU0JKUkZ4dWFXUlFZV2x5WDNSbklEd3RJR2RsZEVKTktHRjBkSEpwWW5WMFpYTWdQU0JqS0Z3aVpXNXpaVzFpYkY5MGNtRnVjMk55YVhCMFgybGtYQ0lzSUZ3aVpXNXpaVzFpYkY5blpXNWxYMmxrWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1hV3gwWlhKeklEMGdYQ0psYm5ObGJXSnNYM1J5WVc1elkzSnBjSFJmYVdSY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZzZFdWeklEMGdVRkpQYzJWeExtSnZZbUpwWlNSbGJuTjBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhKMElEMGdaVzV6WlcxaWJDNTJNVEF5S1Z4dVVGSlBjMlZ4TG1KdlltSnBaU0E4TFNCUVVrOXpaWEV1WW05aVltbGxJQ1UrSlNCa2NHeDVjam82YkdWbWRGOXFiMmx1S0dsa1VHRnBjbDkwWnl3Z1lua2dQU0JqS0Z3aVpXNXpkRndpSUQwZ1hDSmxibk5sYldKc1gzUnlZVzV6WTNKcGNIUmZhV1JjSWlrcFhHNWNiaU1qSUVKaGNpQlFiRzkwWEc1MFpXMXdJRHd0SUZCU1QzTmxjUzVpYjJKaWFXVWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aVzV6WlcxaWJGOW5aVzVsWDJsa0lDVnBiaVVnWjJWdVpVeHBjM1F1UlhCcExtUlVRVWN1Wkc5M2JpbGNibHh1WjNKdmRYQWdQQzBnWXloeVpYQW9YQ0pGY0dsTVExOWtWRUZIZG5ORVRWTlBYMFJQVjA1Y0lpd2dOQ2twWEc1amJIVnpkR1Z5SUR3dElISmxjQ2hqS0Z3aVJXRnliSGxjSWl3Z1hDSk5hV1JrYkdWY0lpd2dYQ0pNWVhSbFhDSXNJRndpVkhKaGJuTnBaVzUwWENJcExDQXhLVnh1WTJ4MWMzUmxjaUE4TFNCbVlXTjBiM0lvWTJ4MWMzUmxjaXdnYkdWMlpXeHpJRDBnWXloY0lrVmhjbXg1WENJc0lGd2lUV2xrWkd4bFhDSXNJRndpVEdGMFpWd2lMQ0JjSWxSeVlXNXphV1Z1ZEZ3aUtTbGNiblpoYkhWbElEd3RJR01vYzNWdEtIUmxiWEFrUTJ4MWMzUmxjaUE5UFNCY0lrVmhjbXg1WENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0J6ZFcwb2RHVnRjQ1JEYkhWemRHVnlJRDA5SUZ3aVRXbGtaR3hsWENJcExGeHVJQ0FnSUNBZ0lDQWdJQ0J6ZFcwb2RHVnRjQ1JEYkhWemRHVnlJRDA5SUZ3aVRHRjBaVndpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdjM1Z0S0hSbGJYQWtRMngxYzNSbGNpQTlQU0JjSWxSeVlXNXphV1Z1ZEZ3aUtTbGNibVJoZEdFZ1BDMGdaR0YwWVM1bWNtRnRaU2huY205MWNDd2dZMngxYzNSbGNpd2dkbUZzZFdVcFhHNW5aM0JzYjNRb1pHRjBZU3dnWVdWektHWnBiR3c5WTJ4MWMzUmxjaXdnZVQxMllXeDFaU3dnZUQxbmNtOTFjQ2twSUNzZ1hHNGdJQ0FnWjJWdmJWOWlZWElvY0c5emFYUnBiMjQ5WENKbWFXeHNYQ0lzSUhOMFlYUTlYQ0pwWkdWdWRHbDBlVndpS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1Z4dVhHNGpJeUJNYVc1bElIQnNiM1JjYm5SbGJYQWdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLRFFzSURVc0lEWXNJRGNzSURnc0lEa3BLVnh1ZEdWdGNDNTBZV3hzSUQwZ2RHVnRjQ0FsUGlVZ2NHbDJiM1JmYkc5dVoyVnlLQzFqS0RFc0lESXBMQ0J1WVcxbGMxOTBieUE5SUZ3aWRHbHRaWEJ2YVc1MGMxd2lMQ0IyWVd4MVpYTmZkRzhnUFNCY0luWmhiSFZsWENJcFhHNWNibWRuTVNBOUlHZG5jR3h2ZENoMFpXMXdMblJoYkd3c1hHNGdJQ0FnSUNBZ1lXVnpLQ0I0SUQwZ1ptRmpkRzl5S0hScGJXVndiMmx1ZEhNc0lHeGxkbVZzSUQwZ1l5aGNJazFKVkZ3aUxDQmNJa1ZITVZ3aUxDQmNJa3hITVZ3aUxDQmNJa0ZUV1U1Y0lpa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2VTQTlJSFpoYkhWbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnWjNKdmRYQWdQU0JsYm5OMExDQmpiMndnUFNCbGJuTjBLU2tnSzF4dUlDQm5aVzl0WDJ4cGJtVW9LU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJR2RuZEdsMGJHVW9YQ0pDYjJKaWFXVXNJRkJTVHkxelpYRmNJaXdnYzNWaWRHbDBiR1VnUFNCY0luTmxiR1ZqZEdWa0lHZGxibVZ6WENJcElDdGNiaUFnZUd4aFlpQW9YQ0owYVcxbGNHOXBiblJ6WENJcElDc2dlV3hoWWloY0luWmhiSFZsWENJcElDdGNiaUFnZEdobGJXVW9jR3h2ZEM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaG9hblZ6ZENBOUlEQXVOU2tzWEc0Z0lDQWdJQ0FnSUhCc2IzUXVjM1ZpZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb2FHcDFjM1FnUFNBd0xqVXBMRnh1SUNBZ0lDQWdJQ0JzWldkbGJtUXVjRzl6YVhScGIyNGdQU0JjSW01dmJtVmNJaXhjYmlBZ0lDQWdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWVc1bmJHVWdQU0E1TUN3Z2RtcDFjM1FnUFNBd0xqVXNJR2hxZFhOMElEMGdNU2twWEc1Y2JtZG5jMkYyWlNobWFXeGxibUZ0WlNBOUlHaGxjbVVvWm1sblJHbHlMQ0JjSW1KdlltSnBaVjluWlc1bFgwVndhVXhEWDJSVVFVZDJjMFJOVTA5ZlJFOVhUaTV3Ym1kY0lpa3NJR2RuTVN3Z2QybGtkR2dnUFNBMExDQm9aV2xuYUhRZ1BTQTBMQ0JrY0drZ1BTQXpNREFzSUhWdWFYUnpJRDBnWENKcGJsd2lMQ0JrWlhacFkyVWdQU0JjSW5CdVoxd2lLVnh1WEc1Y2JpTWdSRkpCVnlCU1NVSkNUMDVjYmx4dVhHNTBaVzF3TG5KcFltSnZiaUE5SUhScFltSnNaU2hjSW5ScGJXVndiMmx1ZEhOY0lpQTlJR01vWENKTlNWUmNJaXdnWENKRlJ6RmNJaXdnWENKTVJ6RmNJaXdnWENKQlUxbE9YQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpZG1Gc2RXVmNJaUE5SUdNb2JXVmhiaWgwWlcxd0pFMUpWQ2tzSUcxbFlXNG9kR1Z0Y0NSRlJ6RXBMQ0J0WldGdUtIUmxiWEFrVEVjeEtTd2diV1ZoYmloMFpXMXdKRUZUV1U0cEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lteHZkMlZ5WENJZ1BTQmpLRzFsWVc0b2RHVnRjQ1JOU1ZRcElDMGdiV0Z5WjJsdVJYSnliM0lvZEdWdGNDUk5TVlFwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFpXRnVLSFJsYlhBa1JVY3hLU0F0SUcxaGNtZHBia1Z5Y205eUtIUmxiWEFrUlVjeEtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV1ZoYmloMFpXMXdKRXhITVNrZ0xTQnRZWEpuYVc1RmNuSnZjaWgwWlcxd0pFeEhNU2tzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxbFlXNG9kR1Z0Y0NSQlUxbE9LU0F0SUcxaGNtZHBia1Z5Y205eUtIUmxiWEFrUVZOWlRpa3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lkWEJ3WlhKY0lpQTlJR01vYldWaGJpaDBaVzF3SkUxSlZDa2dLeUJ0WVhKbmFXNUZjbkp2Y2loMFpXMXdKRTFKVkNrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWxZVzRvZEdWdGNDUkZSekVwSUNzZ2JXRnlaMmx1UlhKeWIzSW9kR1Z0Y0NSRlJ6RXBMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WldGdUtIUmxiWEFrVEVjeEtTQXJJRzFoY21kcGJrVnljbTl5S0hSbGJYQWtURWN4S1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXVmhiaWgwWlcxd0pFRlRXVTRwSUNzZ2JXRnlaMmx1UlhKeWIzSW9kR1Z0Y0NSQlUxbE9LU2twWEc1blp6RWdQU0JuWjNCc2IzUW9kR1Z0Y0M1eWFXSmliMjRzSUdGbGN5aDRJRDBnWm1GamRHOXlLSFJwYldWd2IybHVkSE1zSUd4bGRtVnNJRDBnWXloY0lrMUpWRndpTENCY0lrVkhNVndpTENCY0lreEhNVndpTENCY0lrRlRXVTVjSWlrcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIa2dQU0IyWVd4MVpTd2daM0p2ZFhBZ1BTQXhLU2tnSzF4dUlDQm5aVzl0WDJ4cGJtVW9ZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXBJQ3RjYmlBZ1oyVnZiVjl5YVdKaWIyNG9ZV1Z6S0hsdGFXNGdQU0JzYjNkbGNpd2dlVzFoZUNBOUlIVndjR1Z5S1N3Z1ptbHNiQ0E5SUZ3aVozSmxlVGN3WENJc0lHRnNjR2hoSUQwZ01DNHpLU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJR2RuZEdsMGJHVW9YQ0pDYjJKaWFXVXNJRkJTVHkxelpYRmNJaXdnYzNWaWRHbDBiR1VnUFNCY0luTmxiR1ZqZEdWa0lHZGxibVZ6WENJcElDdGNiaUFnZUd4aFlpQW9YQ0owYVcxbGNHOXBiblJ6WENJcElDc2dlV3hoWWloY0luWmhiSFZsWENJcElDc2dlV3hwYlNnd0xDQTJOU2tnSzF4dUlDQjBhR1Z0WlNod2JHOTBMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0docWRYTjBJRDBnTUM0MUtTeGNiaUFnSUNBZ0lDQWdjR3h2ZEM1emRXSjBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hvYW5WemRDQTlJREF1TlNrc1hHNGdJQ0FnSUNBZ0lHeGxaMlZ1WkM1d2IzTnBkR2x2YmlBOUlGd2libTl1WlZ3aUxGeHVJQ0FnSUNBZ0lDQmhlR2x6TG5SbGVIUXVlQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGhibWRzWlNBOUlEa3dMQ0IyYW5WemRDQTlJREF1TlN3Z2FHcDFjM1FnUFNBeEtTbGNibHh1WjJkellYWmxLR1pwYkdWdVlXMWxJRDBnYUdWeVpTaG1hV2RFYVhJc0lGd2lZbTlpWW1sbFgyZGxibVZmUlhCcFRFTmZaRlJCUjNaelJFMVRUMTlFVDFkT1h6azFRMGt1Y0c1blhDSXBMQ0JuWnpFc0lIZHBaSFJvSUQwZ05Dd2dhR1ZwWjJoMElEMGdOQ3dnWkhCcElEMGdNekF3TENCMWJtbDBjeUE5SUZ3aWFXNWNJaXdnWkdWMmFXTmxJRDBnWENKd2JtZGNJaWxjYmx4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxubWFyZ2luRXJyb3IgPC0gZnVuY3Rpb24obXlMaXN0KSB7XG4gIHNhbXBsZS5uID0gbGVuZ3RoKG15TGlzdClcbiAgc2FtcGxlLnNkID0gc2QobXlMaXN0KVxuICBzYW1wbGUuc2UgPSBzYW1wbGUuc2Qvc3FydChzYW1wbGUubilcbiAgYWxwaGEgPSAwLjA1XG4gIGRlZ3JlZXMuZnJlZWRvbSA9IHNhbXBsZS5uIC0gMVxuICB0LnNjb3JlID0gcXQocCA9IGFscGhhLzIsIGRmID0gZGVncmVlcy5mcmVlZG9tLCBsb3dlci50YWlsID0gRilcbiAgbWFyZ2luLmVycm9yID0gdC5zY29yZSpzYW1wbGUuc2VcbiAgcmV0dXJuKG1hcmdpbi5lcnJvcilcbn1cblxuUFJPc2VxLmJvYmJpZSA8LSBhc190aWJibGUoZnJlYWQoaGVyZShyZWZEaXIsIFxcYm9iYmllX2dlbmVfY2xhc3NpZmljYXRpb24uY3N2XFwpKSlcblxuZ2VuZUxpc3QuRXBpLmRUQUcudXAgPC0gKGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS5FcGkuZFRBR192c19HMS5FcGkuRE1TTy50c3ZcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKHBhZGogPCAwLjA1LCBsb2cyRm9sZENoYW5nZSA+IDApKSRlbnNlbWJsX2dlbmVfaWRcblxuZ2VuZUxpc3QuRXBpLmRUQUcuZG93biA8LSAoZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLkVwaS5kVEFHX3ZzX0cxLkVwaS5ETVNPLnRzdlxcKSkgJT4lIGRwbHlyOjpmaWx0ZXIocGFkaiA8IDAuMDUsIGxvZzJGb2xkQ2hhbmdlIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZFxuXG4jIyBDb252ZXJ0aW5nIHRyYW5zY3JpcHQgSUQgdG8gZ2VuZSBJRFxuaWRQYWlyX3RnIDwtIGdldEJNKGF0dHJpYnV0ZXMgPSBjKFxcZW5zZW1ibF90cmFuc2NyaXB0X2lkXFwsIFxcZW5zZW1ibF9nZW5lX2lkXFwpLFxuICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCxcbiAgICAgICAgICAgICAgICAgdmFsdWVzID0gUFJPc2VxLmJvYmJpZSRlbnN0LFxuICAgICAgICAgICAgICAgICBtYXJ0ID0gZW5zZW1ibC52MTAyKVxuUFJPc2VxLmJvYmJpZSA8LSBQUk9zZXEuYm9iYmllICU+JSBkcGx5cjo6bGVmdF9qb2luKGlkUGFpcl90ZywgYnkgPSBjKFxcZW5zdFxcID0gXFxlbnNlbWJsX3RyYW5zY3JpcHRfaWRcXCkpXG5cbiMjIEJhciBQbG90XG50ZW1wIDwtIFBST3NlcS5ib2JiaWUgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibF9nZW5lX2lkICVpbiUgZ2VuZUxpc3QuRXBpLmRUQUcuZG93bilcblxuZ3JvdXAgPC0gYyhyZXAoXFxFcGlMQ19kVEFHdnNETVNPX0RPV05cXCwgNCkpXG5jbHVzdGVyIDwtIHJlcChjKFxcRWFybHlcXCwgXFxNaWRkbGVcXCwgXFxMYXRlXFwsIFxcVHJhbnNpZW50XFwpLCAxKVxuY2x1c3RlciA8LSBmYWN0b3IoY2x1c3RlciwgbGV2ZWxzID0gYyhcXEVhcmx5XFwsIFxcTWlkZGxlXFwsIFxcTGF0ZVxcLCBcXFRyYW5zaWVudFxcKSlcbnZhbHVlIDwtIGMoc3VtKHRlbXAkQ2x1c3RlciA9PSBcXEVhcmx5XFwpLFxuICAgICAgICAgICBzdW0odGVtcCRDbHVzdGVyID09IFxcTWlkZGxlXFwpLFxuICAgICAgICAgICBzdW0odGVtcCRDbHVzdGVyID09IFxcTGF0ZVxcKSxcbiAgICAgICAgICAgc3VtKHRlbXAkQ2x1c3RlciA9PSBcXFRyYW5zaWVudFxcKSlcbmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpXG5nZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgXG4gICAgZ2VvbV9iYXIocG9zaXRpb249XFxmaWxsXFwsIHN0YXQ9XFxpZGVudGl0eVxcKSArIHRoZW1lX2NsYXNzaWMoKVxuXG4jIyBMaW5lIHBsb3RcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OnNlbGVjdChjKDQsIDUsIDYsIDcsIDgsIDkpKVxudGVtcC50YWxsID0gdGVtcCAlPiUgcGl2b3RfbG9uZ2VyKC1jKDEsIDIpLCBuYW1lc190byA9IFxcdGltZXBvaW50c1xcLCB2YWx1ZXNfdG8gPSBcXHZhbHVlXFwpXG5cbmdnMSA9IGdncGxvdCh0ZW1wLnRhbGwsXG4gICAgICAgYWVzKCB4ID0gZmFjdG9yKHRpbWVwb2ludHMsIGxldmVsID0gYyhcXE1JVFxcLCBcXEVHMVxcLCBcXExHMVxcLCBcXEFTWU5cXCkpLFxuICAgICAgICAgICAgeSA9IHZhbHVlLFxuICAgICAgICAgICAgZ3JvdXAgPSBlbnN0LCBjb2wgPSBlbnN0KSkgK1xuICBnZW9tX2xpbmUoKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdndGl0bGUoXFxCb2JiaWVcbiJ9 -->
marginError <- function(myList) {
  sample.n = length(myList)
  sample.sd = sd(myList)
  sample.se = sample.sd/sqrt(sample.n)
  alpha = 0.05
  degrees.freedom = sample.n - 1
  t.score = qt(p = alpha/2, df = degrees.freedom, lower.tail = F)
  margin.error = t.score*sample.se
  return(margin.error)
}

PROseq.bobbie <- as_tibble(fread(here(refDir, \bobbie_gene_classification.csv\)))

geneList.Epi.dTAG.up <- (fread(here(refDir, \diff_G1.dTAG_G1.Epi.dTAG_vs_G1.Epi.DMSO.tsv\)) %>% dplyr::filter(padj < 0.05, log2FoldChange > 0))$ensembl_gene_id

geneList.Epi.dTAG.down <- (fread(here(refDir, \diff_G1.dTAG_G1.Epi.dTAG_vs_G1.Epi.DMSO.tsv\)) %>% dplyr::filter(padj < 0.05, log2FoldChange < 0))$ensembl_gene_id

## Converting transcript ID to gene ID
idPair_tg <- getBM(attributes = c(\ensembl_transcript_id\, \ensembl_gene_id\),
                 filters = \ensembl_transcript_id\,
                 values = PROseq.bobbie$enst,
                 mart = ensembl.v102)
PROseq.bobbie <- PROseq.bobbie %>% dplyr::left_join(idPair_tg, by = c(\enst\ = \ensembl_transcript_id\))

## Bar Plot
temp <- PROseq.bobbie %>% dplyr::filter(ensembl_gene_id %in% geneList.Epi.dTAG.down)

group <- c(rep(\EpiLC_dTAGvsDMSO_DOWN\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 1)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(sum(temp$Cluster == \Early\),
           sum(temp$Cluster == \Middle\),
           sum(temp$Cluster == \Late\),
           sum(temp$Cluster == \Transient\))
data <- data.frame(group, cluster, value)
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()

## Line plot
temp <- temp %>% dplyr::select(c(4, 5, 6, 7, 8, 9))
temp.tall = temp %>% pivot_longer(-c(1, 2), names_to = \timepoints\, values_to = \value\)

gg1 = ggplot(temp.tall,
       aes( x = factor(timepoints, level = c(\MIT\, \EG1\, \LG1\, \ASYN\)),
            y = value,
            group = enst, col = enst)) +
  geom_line() +
  theme_classic() +
  ggtitle(\Bobbie
```r
marginError <- function(myList) {
  sample.n = length(myList)
  sample.sd = sd(myList)
  sample.se = sample.sd/sqrt(sample.n)
  alpha = 0.05
  degrees.freedom = sample.n - 1
  t.score = qt(p = alpha/2, df = degrees.freedom, lower.tail = F)
  margin.error = t.score*sample.se
  return(margin.error)
}

PROseq.bobbie <- as_tibble(fread(here(refDir, \bobbie_gene_classification.csv\)))

geneList.Epi.dTAG.up <- (fread(here(refDir, \diff_G1.dTAG_G1.Epi.dTAG_vs_G1.Epi.DMSO.tsv\)) %>% dplyr::filter(padj < 0.05, log2FoldChange > 0))$ensembl_gene_id

geneList.Epi.dTAG.down <- (fread(here(refDir, \diff_G1.dTAG_G1.Epi.dTAG_vs_G1.Epi.DMSO.tsv\)) %>% dplyr::filter(padj < 0.05, log2FoldChange < 0))$ensembl_gene_id

## Converting transcript ID to gene ID
idPair_tg <- getBM(attributes = c(\ensembl_transcript_id\, \ensembl_gene_id\),
                 filters = \ensembl_transcript_id\,
                 values = PROseq.bobbie$enst,
                 mart = ensembl.v102)
PROseq.bobbie <- PROseq.bobbie %>% dplyr::left_join(idPair_tg, by = c(\enst\ = \ensembl_transcript_id\))

## Bar Plot
temp <- PROseq.bobbie %>% dplyr::filter(ensembl_gene_id %in% geneList.Epi.dTAG.down)

group <- c(rep(\EpiLC_dTAGvsDMSO_DOWN\, 4))
cluster <- rep(c(\Early\, \Middle\, \Late\, \Transient\), 1)
cluster <- factor(cluster, levels = c(\Early\, \Middle\, \Late\, \Transient\))
value <- c(sum(temp$Cluster == \Early\),
           sum(temp$Cluster == \Middle\),
           sum(temp$Cluster == \Late\),
           sum(temp$Cluster == \Transient\))
data <- data.frame(group, cluster, value)
ggplot(data, aes(fill=cluster, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()

## Line plot
temp <- temp %>% dplyr::select(c(4, 5, 6, 7, 8, 9))
temp.tall = temp %>% pivot_longer(-c(1, 2), names_to = \timepoints\, values_to = \value\)

gg1 = ggplot(temp.tall,
       aes( x = factor(timepoints, level = c(\MIT\, \EG1\, \LG1\, \ASYN\)),
            y = value,
            group = enst, col = enst)) +
  geom_line() +
  theme_classic() +
  ggtitle(\Bobbie
Reg loops _OE

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXCJtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcIikpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcIitcIiwgVjIsIFYzKSwgZW5zZW1ibCA9IFY2LCBjaHIgPSBWMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibCwgY2hyLCBUU1MpXG5cbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXCJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlwiKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XCIpKSRnZW5lXG5cblxuZ2VuZS50YiA8LSBnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmwgJWluJSBjKGdyb3VwMSwgZ3JvdXAyKSlcbmdlbmVzLmdyIDwtIEdSYW5nZXMoXG4gIHNlcW5hbWVzID0gZ2VuZS50YiRjaHIsXG4gIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBnZW5lLnRiJFRTUywgZW5kID0gZ2VuZS50YiRUU1MpLFxuICBlbnNlbWJsID0gZ2VuZS50YiRlbnNlbWJsXG4pXG5cbmdlbmVib2R5LnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcIm1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFwiKSkgJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMylcbmNvbG5hbWVzKGdlbmVib2R5LnRiKSA8LSBjKFwiY2hyXCIsIFwic3RhcnRcIiwgXCJlbmRcIilcbmdlbmVib2R5LmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShnZW5lYm9keS50YilcblxuXG5wZWFrLkgzSzI3YWMgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXCJHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWRcIikpXG5wZWFrLkgzSzI3YWM8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZnJlYWQoaGVyZShyZWZEaXIsIFwiR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkXCIpKSAlPiUgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6bXV0YXRlKGNociA9IFYxLCBzdGFydCA9IChWMiArIFYzKS8yLCBlbmQgPSAoVjIgKyBWMykvMikgJT4lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZCkpXG5cbiMjIyMjIyMgRmlsdGVyaW5nIG91dCBwZWFrcyBvdmVybGFwcGluZyB3aXRoIHRoZSBnZW5lIGJvZHlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhnZW5lYm9keS5nciwgcGVhay5IM0syN2FjKVxuXG4jIEluZGljZXMgb2YgcGVha3MgdGhhdCBvdmVybGFwIHRoZSBUU1Ncbm92ZXJsYXBwaW5nX3BlYWtfaW5kaWNlcyA8LSB1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcHMpKVxuXG4jIEV4Y2x1ZGUgb3ZlcmxhcHBpbmcgcGVha3Ncbm5vbl9vdmVybGFwcGluZ19wZWFrcyA8LSBwZWFrLkgzSzI3YWNbLW92ZXJsYXBwaW5nX3BlYWtfaW5kaWNlc11cblxuXG4jIyMjIyMjIENhbGN1bGF0aW5nIGRpc3RhbmNlIHRvIG5lYXJlc3QgcGVha1xubmVhcmVzdF9wZWFrX2luZGljZXMgPC0gbmVhcmVzdChnZW5lcy5nciwgbm9uX292ZXJsYXBwaW5nX3BlYWtzKVxubmVhcmVzdF9wZWFrcyA8LSBub25fb3ZlcmxhcHBpbmdfcGVha3NbbmVhcmVzdF9wZWFrX2luZGljZXNdXG5kaXN0YW5jZXMgPC0gZGlzdGFuY2UoZ2VuZXMuZ3IsIG5lYXJlc3RfcGVha3MpXG5cblxucmVzdWx0cyA8LSBkYXRhLmZyYW1lKFxuICBlbnNlbWJsID0gbWNvbHMoZ2VuZXMuZ3IpJGVuc2VtYmwsXG4gIGdlbmVfY2hyID0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKGdlbmVzLmdyKSksXG4gIGdlbmVfVFNTID0gc3RhcnQoZ2VuZXMuZ3IpLFxuICBwZWFrX2NociA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhuZWFyZXN0X3BlYWtzKSksXG4gIHBlYWtfc3RhcnQgPSBzdGFydChuZWFyZXN0X3BlYWtzKSxcbiAgcGVha19lbmQgPSBlbmQobmVhcmVzdF9wZWFrcyksXG4gIGRpc3RhbmNlID0gZGlzdGFuY2VzXG4pXG5cbnJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihlbnNlbWJsICVpbiUgZ3JvdXAxIH4gXCJncm91cDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwMiB+IFwiZ3JvdXAyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpXG5cbmdncGxvdChyZXN1bHRzLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlzdGFuY2UsIGZpbGwgPSBncm91cCkpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4xLCBmaWxsID0gXCJ3aGl0ZVwiKSArIHRoZW1lX2J3KCkgKyBnZ3RpdGxlKFwiZGlzdGFuY2UgdG8gbmVhcmVzdCBIM0syN2FjIHBlYWsgZXhjbHVkaW5nIGdlbmUgYm9keVwiKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMjUwKjEwMDApKVxuXG4gIFxuYGBgIn0= -->

```r
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3), ensembl = V6, chr = V1) %>%
  dplyr::select(ensembl, chr, TSS)

group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.tb <- gene.tb %>% dplyr::filter(ensembl %in% c(group1, group2))
genes.gr <- GRanges(
  seqnames = gene.tb$chr,
  ranges = IRanges(start = gene.tb$TSS, end = gene.tb$TSS),
  ensembl = gene.tb$ensembl
)

genebody.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(genebody.tb) <- c(\chr\, \start\, \end\)
genebody.gr <- makeGRangesFromDataFrame(genebody.tb)


peak.H3K27ac <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
peak.H3K27ac<- makeGRangesFromDataFrame(fread(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\)) %>% 
                                          dplyr::mutate(chr = V1, start = (V2 + V3)/2, end = (V2 + V3)/2) %>%
                                          dplyr::select(chr, start, end))

####### Filtering out peaks overlapping with the gene body
overlaps <- findOverlaps(genebody.gr, peak.H3K27ac)

# Indices of peaks that overlap the TSS
overlapping_peak_indices <- unique(subjectHits(overlaps))

# Exclude overlapping peaks
non_overlapping_peaks <- peak.H3K27ac[-overlapping_peak_indices]


####### Calculating distance to nearest peak
nearest_peak_indices <- nearest(genes.gr, non_overlapping_peaks)
nearest_peaks <- non_overlapping_peaks[nearest_peak_indices]
distances <- distance(genes.gr, nearest_peaks)


results <- data.frame(
  ensembl = mcols(genes.gr)$ensembl,
  gene_chr = as.character(seqnames(genes.gr)),
  gene_TSS = start(genes.gr),
  peak_chr = as.character(seqnames(nearest_peaks)),
  peak_start = start(nearest_peaks),
  peak_end = end(nearest_peaks),
  distance = distances
)

results <- results %>% dplyr::mutate(group = case_when(ensembl %in% group1 ~ \group1\,
                                            ensembl %in% group2 ~ \group2\,
                                            TRUE ~ NA))

ggplot(results, aes(x = group, y = distance, fill = group)) + geom_violin() + geom_boxplot(outlier.shape = NA, width = 0.1, fill = \white\) + theme_bw() + ggtitle(\distance to nearest H3K27ac peak excluding gene body\) + scale_y_continuous(labels = label_kb_mb) + coord_cartesian(ylim = c(0, 250*1000))

  
```

<!-- rnb-source-end -->
```r
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3), ensembl = V6, chr = V1) %>%
  dplyr::select(ensembl, chr, TSS)

group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.tb <- gene.tb %>% dplyr::filter(ensembl %in% c(group1, group2))
genes.gr <- GRanges(
  seqnames = gene.tb$chr,
  ranges = IRanges(start = gene.tb$TSS, end = gene.tb$TSS),
  ensembl = gene.tb$ensembl
)

genebody.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(genebody.tb) <- c(\chr\, \start\, \end\)
genebody.gr <- makeGRangesFromDataFrame(genebody.tb)


peak.H3K27ac <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
peak.H3K27ac<- makeGRangesFromDataFrame(fread(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\)) %>% 
                                          dplyr::mutate(chr = V1, start = (V2 + V3)/2, end = (V2 + V3)/2) %>%
                                          dplyr::select(chr, start, end))

####### Filtering out peaks overlapping with the gene body
overlaps <- findOverlaps(genebody.gr, peak.H3K27ac)

# Indices of peaks that overlap the TSS
overlapping_peak_indices <- unique(subjectHits(overlaps))

# Exclude overlapping peaks
non_overlapping_peaks <- peak.H3K27ac[-overlapping_peak_indices]


####### Calculating distance to nearest peak
nearest_peak_indices <- nearest(genes.gr, non_overlapping_peaks)
nearest_peaks <- non_overlapping_peaks[nearest_peak_indices]
distances <- distance(genes.gr, nearest_peaks)


results <- data.frame(
  ensembl = mcols(genes.gr)$ensembl,
  gene_chr = as.character(seqnames(genes.gr)),
  gene_TSS = start(genes.gr),
  peak_chr = as.character(seqnames(nearest_peaks)),
  peak_start = start(nearest_peaks),
  peak_end = end(nearest_peaks),
  distance = distances
)

results <- results %>% dplyr::mutate(group = case_when(ensembl %in% group1 ~ \group1\,
                                            ensembl %in% group2 ~ \group2\,
                                            TRUE ~ NA))

ggplot(results, aes(x = group, y = distance, fill = group)) + geom_violin() + geom_boxplot(outlier.shape = NA, width = 0.1, fill = \white\) + theme_bw() + ggtitle(\distance to nearest H3K27ac peak excluding gene body\) + scale_y_continuous(labels = label_kb_mb) + coord_cartesian(ylim = c(0, 250*1000))

  

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

### [2.32] Comparing with Bobbie's data
Where does differentiated related genes fall into?

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhDSXBLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNaTUwYzNaY0lpa3BKR2RsYm1WY2JseHVYRzVuWlc1bExuUmlJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltMXRNVEJmUjFKRGJUTTRMbkEyWDJkbGJtVmZjMjl5ZEdWa0xtSmxaRndpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9WRk5USUQwZ2FXWmxiSE5sS0ZZMElEMDlJRndpSzF3aUxDQldNaXdnVmpNcExDQmxibk5sYldKc0lEMGdWallzSUdOb2NpQTlJRll4S1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGxibk5sYldKc0xDQmphSElzSUZSVFV5a2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aVzV6WlcxaWJDQWxhVzRsSUdNb1ozSnZkWEF4TENCbmNtOTFjRElwS1Z4dVoyVnVaWE11WjNJZ1BDMGdSMUpoYm1kbGN5aGNiaUFnYzJWeGJtRnRaWE1nUFNCblpXNWxMblJpSkdOb2NpeGNiaUFnY21GdVoyVnpJRDBnU1ZKaGJtZGxjeWh6ZEdGeWRDQTlJR2RsYm1VdWRHSWtWRk5UTENCbGJtUWdQU0JuWlc1bExuUmlKRlJUVXlrc1hHNGdJR1Z1YzJWdFltd2dQU0JuWlc1bExuUmlKR1Z1YzJWdFlteGNiaWxjYmx4dVoyVnVaV0p2WkhrdWRHSWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aWJXMHhNRjlIVWtOdE16Z3VjRFpmWjJWdVpWOXpiM0owWldRdVltVmtYQ0lwS1NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loV05pQWxhVzRsSUdNb1ozSnZkWEF4TENCbmNtOTFjRElwS1NVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0ZZeExDQldNaXdnVmpNcFhHNWpiMnh1WVcxbGN5aG5aVzVsWW05a2VTNTBZaWtnUEMwZ1l5aGNJbU5vY2x3aUxDQmNJbk4wWVhKMFhDSXNJRndpWlc1a1hDSXBYRzVuWlc1bFltOWtlUzVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1oyVnVaV0p2WkhrdWRHSXBYRzVjYmx4dUl5QlRkR1Z3SURFNklFWnBibVFnYjNabGNteGhjSE1nWW1WMGQyVmxiaUJuWlc1bElHSnZaR2xsY3lCaGJtUWdjR1ZoYTNOY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loblpXNWxZbTlrZVM1bmNpd2djR1ZoYXk1SU0wc3lOMkZqS1Z4dVhHNGpJRU55WldGMFpTQmhJR3hwYzNRZ2JXRndjR2x1WnlCbFlXTm9JR2RsYm1VZ2RHOGdkR2hsSUdsdVpHbGpaWE1nYjJZZ2NHVmhhM01nYjNabGNteGhjSEJwYm1jZ2QybDBhQ0JwZEhNZ1oyVnVaU0JpYjJSNVhHNXZkbVZ5YkdGd2NHbHVaMTl3WldGcmMxOXdaWEpmWjJWdVpTQThMU0J6Y0d4cGRDaHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWtzSUhGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lrcFhHNWNiaU1nU1c1cGRHbGhiR2w2WlNCaGJpQmxiWEIwZVNCc2FYTjBJSFJ2SUhOMGIzSmxJSEpsYzNWc2RITmNibkpsYzNWc2RITmZiR2x6ZENBOExTQjJaV04wYjNJb1hDSnNhWE4wWENJc0lHeGxibWQwYUNoblpXNWxjeTVuY2lrcFhHNWNiaU1nVTNSbGNDQXlPaUJHYjNJZ1pXRmphQ0JuWlc1bExDQmxlR05zZFdSbElHOTJaWEpzWVhCd2FXNW5JSEJsWVd0eklHRnVaQ0JtYVc1a0lIUm9aU0J1WldGeVpYTjBJSEJsWVdzZ2RHOGdhWFJ6SUZSVFUxeHVabTl5SUNocElHbHVJSE5sY1Y5aGJHOXVaeWhuWlc1bGN5NW5jaWtwSUh0Y2JpQWdaMlZ1WlNBOExTQm5aVzVsY3k1bmNsdHBYVnh1SUNCY2JpQWdJeUJIWlhRZ2FXNWthV05sY3lCdlppQndaV0ZyY3lCdmRtVnliR0Z3Y0dsdVp5QjNhWFJvSUhSb2FYTWdaMlZ1WlNkeklHSnZaSGxjYmlBZ2IzWmxjbXhoY0hCcGJtZGZjR1ZoYTE5cGJtUnBZMlZ6SUR3dElHOTJaWEpzWVhCd2FXNW5YM0JsWVd0elgzQmxjbDluWlc1bFcxdGhjeTVqYUdGeVlXTjBaWElvYVNsZFhWeHVJQ0JjYmlBZ0l5QkZlR05zZFdSbElHOTJaWEpzWVhCd2FXNW5JSEJsWVd0eklHWnZjaUIwYUdseklHZGxibVZjYmlBZ2FXWWdLQ0ZwY3k1dWRXeHNLRzkyWlhKc1lYQndhVzVuWDNCbFlXdGZhVzVrYVdObGN5a3BJSHRjYmlBZ0lDQndaV0ZyYzE5MGIxOWpiMjV6YVdSbGNpQThMU0J3WldGckxrZ3pTekkzWVdOYkxXOTJaWEpzWVhCd2FXNW5YM0JsWVd0ZmFXNWthV05sYzExY2JpQWdmU0JsYkhObElIdGNiaUFnSUNCd1pXRnJjMTkwYjE5amIyNXphV1JsY2lBOExTQndaV0ZyTGtnelN6STNZV05jYmlBZ2ZWeHVJQ0JjYmlBZ0l5QkdhVzVrSUhSb1pTQnVaV0Z5WlhOMElIQmxZV3NnZEc4Z2RHaGxJRlJUVXlCdlppQjBhR2x6SUdkbGJtVmNiaUFnYm1WaGNtVnpkRjl3WldGclgybHVaR1Y0SUR3dElHNWxZWEpsYzNRb1oyVnVaU3dnY0dWaGEzTmZkRzlmWTI5dWMybGtaWElwWEc0Z0lGeHVJQ0JwWmlBb2FYTXVibUVvYm1WaGNtVnpkRjl3WldGclgybHVaR1Y0S1NrZ2UxeHVJQ0FnSUNNZ1RtOGdjR1ZoYTNNZ1ptOTFibVE3SUhObGRDQk9RU0IyWVd4MVpYTmNiaUFnSUNCeVpYTjFiSFJ6WDJ4cGMzUmJXMmxkWFNBOExTQmtZWFJoTG1aeVlXMWxLRnh1SUNBZ0lDQWdaVzV6WlcxaWJDQTlJRzFqYjJ4ektHZGxibVVwSkdWdWMyVnRZbXdzWEc0Z0lDQWdJQ0JuWlc1bFgyTm9jaUE5SUdGekxtTm9ZWEpoWTNSbGNpaHpaWEZ1WVcxbGN5aG5aVzVsS1Nrc1hHNGdJQ0FnSUNCblpXNWxYMVJUVXlBOUlITjBZWEowS0dkbGJtVXBMRnh1SUNBZ0lDQWdjR1ZoYTE5amFISWdQU0JPUVN4Y2JpQWdJQ0FnSUhCbFlXdGZjM1JoY25RZ1BTQk9RU3hjYmlBZ0lDQWdJSEJsWVd0ZlpXNWtJRDBnVGtFc1hHNGdJQ0FnSUNCa2FYTjBZVzVqWlNBOUlFNUJYRzRnSUNBZ0tWeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHNWxZWEpsYzNSZmNHVmhheUE4TFNCd1pXRnJjMTkwYjE5amIyNXphV1JsY2x0dVpXRnlaWE4wWDNCbFlXdGZhVzVrWlhoZFhHNGdJQ0FnWkdsemRDQThMU0JrYVhOMFlXNWpaU2huWlc1bExDQnVaV0Z5WlhOMFgzQmxZV3NwWEc0Z0lDQWdYRzRnSUNBZ2NtVnpkV3gwYzE5c2FYTjBXMXRwWFYwZ1BDMGdaR0YwWVM1bWNtRnRaU2hjYmlBZ0lDQWdJR1Z1YzJWdFltd2dQU0J0WTI5c2N5aG5aVzVsS1NSbGJuTmxiV0pzTEZ4dUlDQWdJQ0FnWjJWdVpWOWphSElnUFNCaGN5NWphR0Z5WVdOMFpYSW9jMlZ4Ym1GdFpYTW9aMlZ1WlNrcExGeHVJQ0FnSUNBZ1oyVnVaVjlVVTFNZ1BTQnpkR0Z5ZENoblpXNWxLU3hjYmlBZ0lDQWdJSEJsWVd0ZlkyaHlJRDBnWVhNdVkyaGhjbUZqZEdWeUtITmxjVzVoYldWektHNWxZWEpsYzNSZmNHVmhheWtwTEZ4dUlDQWdJQ0FnY0dWaGExOXpkR0Z5ZENBOUlITjBZWEowS0c1bFlYSmxjM1JmY0dWaGF5a3NYRzRnSUNBZ0lDQndaV0ZyWDJWdVpDQTlJR1Z1WkNodVpXRnlaWE4wWDNCbFlXc3BMRnh1SUNBZ0lDQWdaR2x6ZEdGdVkyVWdQU0JrYVhOMFhHNGdJQ0FnS1Z4dUlDQjlYRzU5WEc1Y2JpTWdRMjl0WW1sdVpTQnlaWE4xYkhSeklHbHVkRzhnWVNCemFXNW5iR1VnWkdGMFlTQm1jbUZ0WlZ4dWNtVnpkV3gwY3lBOExTQmtieTVqWVd4c0tISmlhVzVrTENCeVpYTjFiSFJ6WDJ4cGMzUXBYRzVjYmlNZ1FXUmtJR2R5YjNWd0lHbHVabTl5YldGMGFXOXVYRzV5WlhOMWJIUnpJRHd0SUhKbGMzVnNkSE1nSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JqWVhObFgzZG9aVzRvWEc0Z0lHVnVjMlZ0WW13Z0pXbHVKU0JuY205MWNERWdmaUJjSW1keWIzVndNVndpTEZ4dUlDQmxibk5sYldKc0lDVnBiaVVnWjNKdmRYQXlJSDRnWENKbmNtOTFjREpjSWl4Y2JpQWdWRkpWUlNCK0lFNUJYMk5vWVhKaFkzUmxjbDljYmlrcFhHNWNiaU1nVUd4dmRIUnBibWRjYm1kbmNHeHZkQ2h5WlhOMWJIUnpMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnWkdsemRHRnVZMlVzSUdacGJHd2dQU0JuY205MWNDa3BJQ3RjYmlBZ1oyVnZiVjkyYVc5c2FXNG9LU0FyWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2h2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VzSUhkcFpIUm9JRDBnTUM0eExDQm1hV3hzSUQwZ1hDSjNhR2wwWlZ3aUtTQXJYRzRnSUhSb1pXMWxYMkozS0NrZ0sxeHVJQ0JuWjNScGRHeGxLRndpUkdsemRHRnVZMlVnZEc4Z1RtVmhjbVZ6ZENCSU0wc3lOMkZqSUZCbFlXc2dSWGhqYkhWa2FXNW5JRWRsYm1VZ1FtOWtlU0JQZG1WeWJHRndjMXdpS1NBclhHNGdJSE5qWVd4bFgzbGZZMjl1ZEdsdWRXOTFjeWhzWVdKbGJITWdQU0JzWVdKbGJGOXJZbDl0WWlrZ0sxeHVJQ0JqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9NQ3dnTlRBZ0tpQXhNREF3S1NsY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5cbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMyksIGVuc2VtYmwgPSBWNiwgY2hyID0gVjEpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmwsIGNociwgVFNTKSAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgYyhncm91cDEsIGdyb3VwMikpXG5nZW5lcy5nciA8LSBHUmFuZ2VzKFxuICBzZXFuYW1lcyA9IGdlbmUudGIkY2hyLFxuICByYW5nZXMgPSBJUmFuZ2VzKHN0YXJ0ID0gZ2VuZS50YiRUU1MsIGVuZCA9IGdlbmUudGIkVFNTKSxcbiAgZW5zZW1ibCA9IGdlbmUudGIkZW5zZW1ibFxuKVxuXG5nZW5lYm9keS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKFY2ICVpbiUgYyhncm91cDEsIGdyb3VwMikpJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMylcbmNvbG5hbWVzKGdlbmVib2R5LnRiKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbmdlbmVib2R5LmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShnZW5lYm9keS50YilcblxuXG4jIFN0ZXAgMTogRmluZCBvdmVybGFwcyBiZXR3ZWVuIGdlbmUgYm9kaWVzIGFuZCBwZWFrc1xub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGdlbmVib2R5LmdyLCBwZWFrLkgzSzI3YWMpXG5cbiMgQ3JlYXRlIGEgbGlzdCBtYXBwaW5nIGVhY2ggZ2VuZSB0byB0aGUgaW5kaWNlcyBvZiBwZWFrcyBvdmVybGFwcGluZyB3aXRoIGl0cyBnZW5lIGJvZHlcbm92ZXJsYXBwaW5nX3BlYWtzX3Blcl9nZW5lIDwtIHNwbGl0KHN1YmplY3RIaXRzKG92ZXJsYXBzKSwgcXVlcnlIaXRzKG92ZXJsYXBzKSlcblxuIyBJbml0aWFsaXplIGFuIGVtcHR5IGxpc3QgdG8gc3RvcmUgcmVzdWx0c1xucmVzdWx0c19saXN0IDwtIHZlY3RvcihcXGxpc3RcXCwgbGVuZ3RoKGdlbmVzLmdyKSlcblxuIyBTdGVwIDI6IEZvciBlYWNoIGdlbmUsIGV4Y2x1ZGUgb3ZlcmxhcHBpbmcgcGVha3MgYW5kIGZpbmQgdGhlIG5lYXJlc3QgcGVhayB0byBpdHMgVFNTXG5mb3IgKGkgaW4gc2VxX2Fsb25nKGdlbmVzLmdyKSkge1xuICBnZW5lIDwtIGdlbmVzLmdyW2ldXG4gIFxuICAjIEdldCBpbmRpY2VzIG9mIHBlYWtzIG92ZXJsYXBwaW5nIHdpdGggdGhpcyBnZW5lJ3MgYm9keVxuICBvdmVybGFwcGluZ19wZWFrX2luZGljZXMgPC0gb3ZlcmxhcHBpbmdfcGVha3NfcGVyX2dlbmVbW2FzLmNoYXJhY3RlcihpKV1dXG4gIFxuICAjIEV4Y2x1ZGUgb3ZlcmxhcHBpbmcgcGVha3MgZm9yIHRoaXMgZ2VuZVxuICBpZiAoIWlzLm51bGwob3ZlcmxhcHBpbmdfcGVha19pbmRpY2VzKSkge1xuICAgIHBlYWtzX3RvX2NvbnNpZGVyIDwtIHBlYWsuSDNLMjdhY1stb3ZlcmxhcHBpbmdfcGVha19pbmRpY2VzXVxuICB9IGVsc2Uge1xuICAgIHBlYWtzX3RvX2NvbnNpZGVyIDwtIHBlYWsuSDNLMjdhY1xuICB9XG4gIFxuICAjIEZpbmQgdGhlIG5lYXJlc3QgcGVhayB0byB0aGUgVFNTIG9mIHRoaXMgZ2VuZVxuICBuZWFyZXN0X3BlYWtfaW5kZXggPC0gbmVhcmVzdChnZW5lLCBwZWFrc190b19jb25zaWRlcilcbiAgXG4gIGlmIChpcy5uYShuZWFyZXN0X3BlYWtfaW5kZXgpKSB7XG4gICAgIyBObyBwZWFrcyBmb3VuZDsgc2V0IE5BIHZhbHVlc1xuICAgIHJlc3VsdHNfbGlzdFtbaV1dIDwtIGRhdGEuZnJhbWUoXG4gICAgICBlbnNlbWJsID0gbWNvbHMoZ2VuZSkkZW5zZW1ibCxcbiAgICAgIGdlbmVfY2hyID0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKGdlbmUpKSxcbiAgICAgIGdlbmVfVFNTID0gc3RhcnQoZ2VuZSksXG4gICAgICBwZWFrX2NociA9IE5BLFxuICAgICAgcGVha19zdGFydCA9IE5BLFxuICAgICAgcGVha19lbmQgPSBOQSxcbiAgICAgIGRpc3RhbmNlID0gTkFcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgbmVhcmVzdF9wZWFrIDwtIHBlYWtzX3RvX2NvbnNpZGVyW25lYXJlc3RfcGVha19pbmRleF1cbiAgICBkaXN0IDwtIGRpc3RhbmNlKGdlbmUsIG5lYXJlc3RfcGVhaylcbiAgICBcbiAgICByZXN1bHRzX2xpc3RbW2ldXSA8LSBkYXRhLmZyYW1lKFxuICAgICAgZW5zZW1ibCA9IG1jb2xzKGdlbmUpJGVuc2VtYmwsXG4gICAgICBnZW5lX2NociA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhnZW5lKSksXG4gICAgICBnZW5lX1RTUyA9IHN0YXJ0KGdlbmUpLFxuICAgICAgcGVha19jaHIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMobmVhcmVzdF9wZWFrKSksXG4gICAgICBwZWFrX3N0YXJ0ID0gc3RhcnQobmVhcmVzdF9wZWFrKSxcbiAgICAgIHBlYWtfZW5kID0gZW5kKG5lYXJlc3RfcGVhayksXG4gICAgICBkaXN0YW5jZSA9IGRpc3RcbiAgICApXG4gIH1cbn1cblxuIyBDb21iaW5lIHJlc3VsdHMgaW50byBhIHNpbmdsZSBkYXRhIGZyYW1lXG5yZXN1bHRzIDwtIGRvLmNhbGwocmJpbmQsIHJlc3VsdHNfbGlzdClcblxuIyBBZGQgZ3JvdXAgaW5mb3JtYXRpb25cbnJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihcbiAgZW5zZW1ibCAlaW4lIGdyb3VwMSB+IFxcZ3JvdXAxXFwsXG4gIGVuc2VtYmwgJWluJSBncm91cDIgfiBcXGdyb3VwMlxcLFxuICBUUlVFIH4gTkFfY2hhcmFjdGVyX1xuKSlcblxuIyBQbG90dGluZ1xuZ2dwbG90KHJlc3VsdHMsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaXN0YW5jZSwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX3Zpb2xpbigpICtcbiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjEsIGZpbGwgPSBcXHdoaXRlXFwpICtcbiAgdGhlbWVfYncoKSArXG4gIGdndGl0bGUoXFxEaXN0YW5jZSB0byBOZWFyZXN0IEgzSzI3YWMgUGVhayBFeGNsdWRpbmcgR2VuZSBCb2R5IE92ZXJsYXBzXFwpICtcbiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA1MCAqIDEwMDApKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3), ensembl = V6, chr = V1) %>%
  dplyr::select(ensembl, chr, TSS) %>% dplyr::filter(ensembl %in% c(group1, group2))
genes.gr <- GRanges(
  seqnames = gene.tb$chr,
  ranges = IRanges(start = gene.tb$TSS, end = gene.tb$TSS),
  ensembl = gene.tb$ensembl
)

genebody.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>% dplyr::filter(V6 %in% c(group1, group2))%>% dplyr::select(V1, V2, V3)
colnames(genebody.tb) <- c(\chr\, \start\, \end\)
genebody.gr <- makeGRangesFromDataFrame(genebody.tb)


# Step 1: Find overlaps between gene bodies and peaks
overlaps <- findOverlaps(genebody.gr, peak.H3K27ac)

# Create a list mapping each gene to the indices of peaks overlapping with its gene body
overlapping_peaks_per_gene <- split(subjectHits(overlaps), queryHits(overlaps))

# Initialize an empty list to store results
results_list <- vector(\list\, length(genes.gr))

# Step 2: For each gene, exclude overlapping peaks and find the nearest peak to its TSS
for (i in seq_along(genes.gr)) {
  gene <- genes.gr[i]
  
  # Get indices of peaks overlapping with this gene's body
  overlapping_peak_indices <- overlapping_peaks_per_gene[[as.character(i)]]
  
  # Exclude overlapping peaks for this gene
  if (!is.null(overlapping_peak_indices)) {
    peaks_to_consider <- peak.H3K27ac[-overlapping_peak_indices]
  } else {
    peaks_to_consider <- peak.H3K27ac
  }
  
  # Find the nearest peak to the TSS of this gene
  nearest_peak_index <- nearest(gene, peaks_to_consider)
  
  if (is.na(nearest_peak_index)) {
    # No peaks found; set NA values
    results_list[[i]] <- data.frame(
      ensembl = mcols(gene)$ensembl,
      gene_chr = as.character(seqnames(gene)),
      gene_TSS = start(gene),
      peak_chr = NA,
      peak_start = NA,
      peak_end = NA,
      distance = NA
    )
  } else {
    nearest_peak <- peaks_to_consider[nearest_peak_index]
    dist <- distance(gene, nearest_peak)
    
    results_list[[i]] <- data.frame(
      ensembl = mcols(gene)$ensembl,
      gene_chr = as.character(seqnames(gene)),
      gene_TSS = start(gene),
      peak_chr = as.character(seqnames(nearest_peak)),
      peak_start = start(nearest_peak),
      peak_end = end(nearest_peak),
      distance = dist
    )
  }
}

# Combine results into a single data frame
results <- do.call(rbind, results_list)

# Add group information
results <- results %>% dplyr::mutate(group = case_when(
  ensembl %in% group1 ~ \group1\,
  ensembl %in% group2 ~ \group2\,
  TRUE ~ NA_character_
))

# Plotting
ggplot(results, aes(x = group, y = distance, fill = group)) +
  geom_violin() +
  geom_boxplot(outlier.shape = NA, width = 0.1, fill = \white\) +
  theme_bw() +
  ggtitle(\Distance to Nearest H3K27ac Peak Excluding Gene Body Overlaps\) +
  scale_y_continuous(labels = label_kb_mb) +
  coord_cartesian(ylim = c(0, 50 * 1000))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNERXVkSE4yWEZ3cEtTUm5aVzVsWEc1bmNtOTFjRElnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJKcGJtRnllVWR5YjNWd01pNTBjM1pjWENrcEpHZGxibVZjYmx4dVhHNW5aVzVsTG5SaUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEcxdE1UQmZSMUpEYlRNNExuQTJYMmRsYm1WZmMyOXlkR1ZrTG1KbFpGeGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ZGTlRJRDBnYVdabGJITmxLRlkwSUQwOUlGeGNLMXhjTENCV01pd2dWak1wTENCbGJuTmxiV0pzSUQwZ1ZqWXNJR05vY2lBOUlGWXhLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzTENCamFISXNJRlJUVXlrZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1pXNXpaVzFpYkNBbGFXNGxJR01vWjNKdmRYQXhMQ0JuY205MWNESXBLVnh1WjJWdVpYTXVaM0lnUEMwZ1IxSmhibWRsY3loY2JpQWdjMlZ4Ym1GdFpYTWdQU0JuWlc1bExuUmlKR05vY2l4Y2JpQWdjbUZ1WjJWeklEMGdTVkpoYm1kbGN5aHpkR0Z5ZENBOUlHZGxibVV1ZEdJa1ZGTlRMQ0JsYm1RZ1BTQm5aVzVsTG5SaUpGUlRVeWtzWEc0Z0lHVnVjMlZ0WW13Z1BTQm5aVzVsTG5SaUpHVnVjMlZ0WW14Y2JpbGNibHh1WjJWdVpXSnZaSGt1ZEdJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjYlcweE1GOUhVa050TXpndWNEWmZaMlZ1WlY5emIzSjBaV1F1WW1Wa1hGd3BLU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhXTmlBbGFXNGxJR01vWjNKdmRYQXhMQ0JuY205MWNESXBLU1UrSlNCa2NHeDVjam82YzJWc1pXTjBLRll4TENCV01pd2dWak1wWEc1amIyeHVZVzFsY3loblpXNWxZbTlrZVM1MFlpa2dQQzBnWXloY1hHTm9jbHhjTENCY1hITjBZWEowWEZ3c0lGeGNaVzVrWEZ3cFhHNW5aVzVsWW05a2VTNW5jaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvWjJWdVpXSnZaSGt1ZEdJcFhHNWNibHh1SXlCVGRHVndJREU2SUVacGJtUWdiM1psY214aGNITWdZbVYwZDJWbGJpQm5aVzVsSUdKdlpHbGxjeUJoYm1RZ2NHVmhhM05jYm05MlpYSnNZWEJ6SUR3dElHWnBibVJQZG1WeWJHRndjeWhuWlc1bFltOWtlUzVuY2l3Z2NHVmhheTVJTTBzeU4yRmpLVnh1WEc0aklFTnlaV0YwWlNCaElHeHBjM1FnYldGd2NHbHVaeUJsWVdOb0lHZGxibVVnZEc4Z2RHaGxJR2x1WkdsalpYTWdiMllnY0dWaGEzTWdiM1psY214aGNIQnBibWNnZDJsMGFDQnBkSE1nWjJWdVpTQmliMlI1WEc1dmRtVnliR0Z3Y0dsdVoxOXdaV0ZyYzE5d1pYSmZaMlZ1WlNBOExTQnpjR3hwZENoemRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5a3NJSEYxWlhKNVNHbDBjeWh2ZG1WeWJHRndjeWtwWEc1Y2JpTWdTVzVwZEdsaGJHbDZaU0JoYmlCbGJYQjBlU0JzYVhOMElIUnZJSE4wYjNKbElISmxjM1ZzZEhOY2JuSmxjM1ZzZEhOZmJHbHpkQ0E4TFNCMlpXTjBiM0lvWEZ4c2FYTjBYRndzSUd4bGJtZDBhQ2huWlc1bGN5NW5jaWtwWEc1Y2JpTWdVM1JsY0NBeU9pQkdiM0lnWldGamFDQm5aVzVsTENCbGVHTnNkV1JsSUc5MlpYSnNZWEJ3YVc1bklIQmxZV3R6SUdGdVpDQm1hVzVrSUhSb1pTQnVaV0Z5WlhOMElIQmxZV3NnZEc4Z2FYUnpJRlJUVTF4dVptOXlJQ2hwSUdsdUlITmxjVjloYkc5dVp5aG5aVzVsY3k1bmNpa3BJSHRjYmlBZ1oyVnVaU0E4TFNCblpXNWxjeTVuY2x0cFhWeHVJQ0JjYmlBZ0l5QkhaWFFnYVc1a2FXTmxjeUJ2WmlCd1pXRnJjeUJ2ZG1WeWJHRndjR2x1WnlCM2FYUm9JSFJvYVhNZ1oyVnVaU2R6SUdKdlpIbGNiaUFnYjNabGNteGhjSEJwYm1kZmNHVmhhMTlwYm1ScFkyVnpJRHd0SUc5MlpYSnNZWEJ3YVc1blgzQmxZV3R6WDNCbGNsOW5aVzVsVzF0aGN5NWphR0Z5WVdOMFpYSW9hU2xkWFZ4dUlDQmNiaUFnSXlCRmVHTnNkV1JsSUc5MlpYSnNZWEJ3YVc1bklIQmxZV3R6SUdadmNpQjBhR2x6SUdkbGJtVmNiaUFnYVdZZ0tDRnBjeTV1ZFd4c0tHOTJaWEpzWVhCd2FXNW5YM0JsWVd0ZmFXNWthV05sY3lrcElIdGNiaUFnSUNCd1pXRnJjMTkwYjE5amIyNXphV1JsY2lBOExTQndaV0ZyTGtnelN6STNZV05iTFc5MlpYSnNZWEJ3YVc1blgzQmxZV3RmYVc1a2FXTmxjMTFjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0J3WldGcmMxOTBiMTlqYjI1emFXUmxjaUE4TFNCd1pXRnJMa2d6U3pJM1lXTmNiaUFnZlZ4dUlDQmNiaUFnSXlCR2FXNWtJSFJvWlNCdVpXRnlaWE4wSUhCbFlXc2dkRzhnZEdobElGUlRVeUJ2WmlCMGFHbHpJR2RsYm1WY2JpQWdibVZoY21WemRGOXdaV0ZyWDJsdVpHVjRJRHd0SUc1bFlYSmxjM1FvWjJWdVpTd2djR1ZoYTNOZmRHOWZZMjl1YzJsa1pYSXBYRzRnSUZ4dUlDQnBaaUFvYVhNdWJtRW9ibVZoY21WemRGOXdaV0ZyWDJsdVpHVjRLU2tnZTF4dUlDQWdJQ01nVG04Z2NHVmhhM01nWm05MWJtUTdJSE5sZENCT1FTQjJZV3gxWlhOY2JpQWdJQ0J5WlhOMWJIUnpYMnhwYzNSYlcybGRYU0E4TFNCa1lYUmhMbVp5WVcxbEtGeHVJQ0FnSUNBZ1pXNXpaVzFpYkNBOUlHMWpiMnh6S0dkbGJtVXBKR1Z1YzJWdFltd3NYRzRnSUNBZ0lDQm5aVzVsWDJOb2NpQTlJR0Z6TG1Ob1lYSmhZM1JsY2loelpYRnVZVzFsY3loblpXNWxLU2tzWEc0Z0lDQWdJQ0JuWlc1bFgxUlRVeUE5SUhOMFlYSjBLR2RsYm1VcExGeHVJQ0FnSUNBZ2NHVmhhMTlqYUhJZ1BTQk9RU3hjYmlBZ0lDQWdJSEJsWVd0ZmMzUmhjblFnUFNCT1FTeGNiaUFnSUNBZ0lIQmxZV3RmWlc1a0lEMGdUa0VzWEc0Z0lDQWdJQ0JrYVhOMFlXNWpaU0E5SUU1QlhHNGdJQ0FnS1Z4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUc1bFlYSmxjM1JmY0dWaGF5QThMU0J3WldGcmMxOTBiMTlqYjI1emFXUmxjbHR1WldGeVpYTjBYM0JsWVd0ZmFXNWtaWGhkWEc0Z0lDQWdaR2x6ZENBOExTQmthWE4wWVc1alpTaG5aVzVsTENCdVpXRnlaWE4wWDNCbFlXc3BYRzRnSUNBZ1hHNGdJQ0FnY21WemRXeDBjMTlzYVhOMFcxdHBYVjBnUEMwZ1pHRjBZUzVtY21GdFpTaGNiaUFnSUNBZ0lHVnVjMlZ0WW13Z1BTQnRZMjlzY3loblpXNWxLU1JsYm5ObGJXSnNMRnh1SUNBZ0lDQWdaMlZ1WlY5amFISWdQU0JoY3k1amFHRnlZV04wWlhJb2MyVnhibUZ0WlhNb1oyVnVaU2twTEZ4dUlDQWdJQ0FnWjJWdVpWOVVVMU1nUFNCemRHRnlkQ2huWlc1bEtTeGNiaUFnSUNBZ0lIQmxZV3RmWTJoeUlEMGdZWE11WTJoaGNtRmpkR1Z5S0hObGNXNWhiV1Z6S0c1bFlYSmxjM1JmY0dWaGF5a3BMRnh1SUNBZ0lDQWdjR1ZoYTE5emRHRnlkQ0E5SUhOMFlYSjBLRzVsWVhKbGMzUmZjR1ZoYXlrc1hHNGdJQ0FnSUNCd1pXRnJYMlZ1WkNBOUlHVnVaQ2h1WldGeVpYTjBYM0JsWVdzcExGeHVJQ0FnSUNBZ1pHbHpkR0Z1WTJVZ1BTQmthWE4wWEc0Z0lDQWdLVnh1SUNCOVhHNTlYRzVjYmlNZ1EyOXRZbWx1WlNCeVpYTjFiSFJ6SUdsdWRHOGdZU0J6YVc1bmJHVWdaR0YwWVNCbWNtRnRaVnh1Y21WemRXeDBjeUE4TFNCa2J5NWpZV3hzS0hKaWFXNWtMQ0J5WlhOMWJIUnpYMnhwYzNRcFhHNWNiaU1nUVdSa0lHZHliM1Z3SUdsdVptOXliV0YwYVc5dVhHNXlaWE4xYkhSeklEd3RJSEpsYzNWc2RITWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aM0p2ZFhBZ1BTQmpZWE5sWDNkb1pXNG9YRzRnSUdWdWMyVnRZbXdnSldsdUpTQm5jbTkxY0RFZ2ZpQmNYR2R5YjNWd01WeGNMRnh1SUNCbGJuTmxiV0pzSUNWcGJpVWdaM0p2ZFhBeUlINGdYRnhuY205MWNESmNYQ3hjYmlBZ1ZGSlZSU0IrSUU1QlgyTm9ZWEpoWTNSbGNsOWNiaWtwWEc1Y2JpTWdVR3h2ZEhScGJtZGNibWRuY0d4dmRDaHlaWE4xYkhSekxDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdaR2x6ZEdGdVkyVXNJR1pwYkd3Z1BTQm5jbTkxY0NrcElDdGNiaUFnWjJWdmJWOTJhVzlzYVc0b0tTQXJYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaHZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRXNJSGRwWkhSb0lEMGdNQzR4TENCbWFXeHNJRDBnWEZ4M2FHbDBaVnhjS1NBclhHNGdJSFJvWlcxbFgySjNLQ2tnSzF4dUlDQm5aM1JwZEd4bEtGeGNSR2x6ZEdGdVkyVWdkRzhnVG1WaGNtVnpkQ0JJTTBzeU4yRmpJRkJsWVdzZ1JYaGpiSFZrYVc1bklFZGxibVVnUW05a2VTQlBkbVZ5YkdGd2MxeGNLU0FyWEc0Z0lITmpZV3hsWDNsZlkyOXVkR2x1ZFc5MWN5aHNZV0psYkhNZ1BTQnNZV0psYkY5cllsOXRZaWtnSzF4dUlDQmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb01Dd2dOVEFnS2lBeE1EQXdLU2xjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLCBlbnNlbWJsID0gVjYsIGNociA9IFYxKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsLCBjaHIsIFRTUykgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGMoZ3JvdXAxLCBncm91cDIpKVxuZ2VuZXMuZ3IgPC0gR1JhbmdlcyhcbiAgc2VxbmFtZXMgPSBnZW5lLnRiJGNocixcbiAgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGdlbmUudGIkVFNTLCBlbmQgPSBnZW5lLnRiJFRTUyksXG4gIGVuc2VtYmwgPSBnZW5lLnRiJGVuc2VtYmxcbilcblxuZ2VuZWJvZHkudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiUgZHBseXI6OmZpbHRlcihWNiAlaW4lIGMoZ3JvdXAxLCBncm91cDIpKSU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpXG5jb2xuYW1lcyhnZW5lYm9keS50YikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5nZW5lYm9keS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZWJvZHkudGIpXG5cblxuIyBTdGVwIDE6IEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBnZW5lIGJvZGllcyBhbmQgcGVha3Ncbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhnZW5lYm9keS5nciwgcGVhay5IM0syN2FjKVxuXG4jIENyZWF0ZSBhIGxpc3QgbWFwcGluZyBlYWNoIGdlbmUgdG8gdGhlIGluZGljZXMgb2YgcGVha3Mgb3ZlcmxhcHBpbmcgd2l0aCBpdHMgZ2VuZSBib2R5XG5vdmVybGFwcGluZ19wZWFrc19wZXJfZ2VuZSA8LSBzcGxpdChzdWJqZWN0SGl0cyhvdmVybGFwcyksIHF1ZXJ5SGl0cyhvdmVybGFwcykpXG5cbiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSBsaXN0IHRvIHN0b3JlIHJlc3VsdHNcbnJlc3VsdHNfbGlzdCA8LSB2ZWN0b3IoXFxsaXN0XFwsIGxlbmd0aChnZW5lcy5ncikpXG5cbiMgU3RlcCAyOiBGb3IgZWFjaCBnZW5lLCBleGNsdWRlIG92ZXJsYXBwaW5nIHBlYWtzIGFuZCBmaW5kIHRoZSBuZWFyZXN0IHBlYWsgdG8gaXRzIFRTU1xuZm9yIChpIGluIHNlcV9hbG9uZyhnZW5lcy5ncikpIHtcbiAgZ2VuZSA8LSBnZW5lcy5ncltpXVxuICBcbiAgIyBHZXQgaW5kaWNlcyBvZiBwZWFrcyBvdmVybGFwcGluZyB3aXRoIHRoaXMgZ2VuZSdzIGJvZHlcbiAgb3ZlcmxhcHBpbmdfcGVha19pbmRpY2VzIDwtIG92ZXJsYXBwaW5nX3BlYWtzX3Blcl9nZW5lW1thcy5jaGFyYWN0ZXIoaSldXVxuICBcbiAgIyBFeGNsdWRlIG92ZXJsYXBwaW5nIHBlYWtzIGZvciB0aGlzIGdlbmVcbiAgaWYgKCFpcy5udWxsKG92ZXJsYXBwaW5nX3BlYWtfaW5kaWNlcykpIHtcbiAgICBwZWFrc190b19jb25zaWRlciA8LSBwZWFrLkgzSzI3YWNbLW92ZXJsYXBwaW5nX3BlYWtfaW5kaWNlc11cbiAgfSBlbHNlIHtcbiAgICBwZWFrc190b19jb25zaWRlciA8LSBwZWFrLkgzSzI3YWNcbiAgfVxuICBcbiAgIyBGaW5kIHRoZSBuZWFyZXN0IHBlYWsgdG8gdGhlIFRTUyBvZiB0aGlzIGdlbmVcbiAgbmVhcmVzdF9wZWFrX2luZGV4IDwtIG5lYXJlc3QoZ2VuZSwgcGVha3NfdG9fY29uc2lkZXIpXG4gIFxuICBpZiAoaXMubmEobmVhcmVzdF9wZWFrX2luZGV4KSkge1xuICAgICMgTm8gcGVha3MgZm91bmQ7IHNldCBOQSB2YWx1ZXNcbiAgICByZXN1bHRzX2xpc3RbW2ldXSA8LSBkYXRhLmZyYW1lKFxuICAgICAgZW5zZW1ibCA9IG1jb2xzKGdlbmUpJGVuc2VtYmwsXG4gICAgICBnZW5lX2NociA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhnZW5lKSksXG4gICAgICBnZW5lX1RTUyA9IHN0YXJ0KGdlbmUpLFxuICAgICAgcGVha19jaHIgPSBOQSxcbiAgICAgIHBlYWtfc3RhcnQgPSBOQSxcbiAgICAgIHBlYWtfZW5kID0gTkEsXG4gICAgICBkaXN0YW5jZSA9IE5BXG4gICAgKVxuICB9IGVsc2Uge1xuICAgIG5lYXJlc3RfcGVhayA8LSBwZWFrc190b19jb25zaWRlcltuZWFyZXN0X3BlYWtfaW5kZXhdXG4gICAgZGlzdCA8LSBkaXN0YW5jZShnZW5lLCBuZWFyZXN0X3BlYWspXG4gICAgXG4gICAgcmVzdWx0c19saXN0W1tpXV0gPC0gZGF0YS5mcmFtZShcbiAgICAgIGVuc2VtYmwgPSBtY29scyhnZW5lKSRlbnNlbWJsLFxuICAgICAgZ2VuZV9jaHIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMoZ2VuZSkpLFxuICAgICAgZ2VuZV9UU1MgPSBzdGFydChnZW5lKSxcbiAgICAgIHBlYWtfY2hyID0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKG5lYXJlc3RfcGVhaykpLFxuICAgICAgcGVha19zdGFydCA9IHN0YXJ0KG5lYXJlc3RfcGVhayksXG4gICAgICBwZWFrX2VuZCA9IGVuZChuZWFyZXN0X3BlYWspLFxuICAgICAgZGlzdGFuY2UgPSBkaXN0XG4gICAgKVxuICB9XG59XG5cbiMgQ29tYmluZSByZXN1bHRzIGludG8gYSBzaW5nbGUgZGF0YSBmcmFtZVxucmVzdWx0cyA8LSBkby5jYWxsKHJiaW5kLCByZXN1bHRzX2xpc3QpXG5cbiMgQWRkIGdyb3VwIGluZm9ybWF0aW9uXG5yZXN1bHRzIDwtIHJlc3VsdHMgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oXG4gIGVuc2VtYmwgJWluJSBncm91cDEgfiBcXGdyb3VwMVxcLFxuICBlbnNlbWJsICVpbiUgZ3JvdXAyIH4gXFxncm91cDJcXCxcbiAgVFJVRSB+IE5BX2NoYXJhY3Rlcl9cbikpXG5cbiMgUGxvdHRpbmdcbmdncGxvdChyZXN1bHRzLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlzdGFuY2UsIGZpbGwgPSBncm91cCkpICtcbiAgZ2VvbV92aW9saW4oKSArXG4gIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4xLCBmaWxsID0gXFx3aGl0ZVxcKSArXG4gIHRoZW1lX2J3KCkgK1xuICBnZ3RpdGxlKFxcRGlzdGFuY2UgdG8gTmVhcmVzdCBIM0syN2FjIFBlYWsgRXhjbHVkaW5nIEdlbmUgQm9keSBPdmVybGFwc1xcKSArXG4gIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNTAgKiAxMDAwKSlcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLCBlbnNlbWJsID0gVjYsIGNociA9IFYxKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsLCBjaHIsIFRTUykgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGMoZ3JvdXAxLCBncm91cDIpKVxuZ2VuZXMuZ3IgPC0gR1JhbmdlcyhcbiAgc2VxbmFtZXMgPSBnZW5lLnRiJGNocixcbiAgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGdlbmUudGIkVFNTLCBlbmQgPSBnZW5lLnRiJFRTUyksXG4gIGVuc2VtYmwgPSBnZW5lLnRiJGVuc2VtYmxcbilcblxuZ2VuZWJvZHkudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiUgZHBseXI6OmZpbHRlcihWNiAlaW4lIGMoZ3JvdXAxLCBncm91cDIpKSU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpXG5jb2xuYW1lcyhnZW5lYm9keS50YikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5nZW5lYm9keS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZWJvZHkudGIpXG5cblxuIyBTdGVwIDE6IEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBnZW5lIGJvZGllcyBhbmQgcGVha3Ncbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhnZW5lYm9keS5nciwgcGVhay5IM0syN2FjKVxuXG4jIENyZWF0ZSBhIGxpc3QgbWFwcGluZyBlYWNoIGdlbmUgdG8gdGhlIGluZGljZXMgb2YgcGVha3Mgb3ZlcmxhcHBpbmcgd2l0aCBpdHMgZ2VuZSBib2R5XG5vdmVybGFwcGluZ19wZWFrc19wZXJfZ2VuZSA8LSBzcGxpdChzdWJqZWN0SGl0cyhvdmVybGFwcyksIHF1ZXJ5SGl0cyhvdmVybGFwcykpXG5cbiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSBsaXN0IHRvIHN0b3JlIHJlc3VsdHNcbnJlc3VsdHNfbGlzdCA8LSB2ZWN0b3IoXFxsaXN0XFwsIGxlbmd0aChnZW5lcy5ncikpXG5cbiMgU3RlcCAyOiBGb3IgZWFjaCBnZW5lLCBleGNsdWRlIG92ZXJsYXBwaW5nIHBlYWtzIGFuZCBmaW5kIHRoZSBuZWFyZXN0IHBlYWsgdG8gaXRzIFRTU1xuZm9yIChpIGluIHNlcV9hbG9uZyhnZW5lcy5ncikpIHtcbiAgZ2VuZSA8LSBnZW5lcy5ncltpXVxuICBcbiAgIyBHZXQgaW5kaWNlcyBvZiBwZWFrcyBvdmVybGFwcGluZyB3aXRoIHRoaXMgZ2VuZSdzIGJvZHlcbiAgb3ZlcmxhcHBpbmdfcGVha19pbmRpY2VzIDwtIG92ZXJsYXBwaW5nX3BlYWtzX3Blcl9nZW5lW1thcy5jaGFyYWN0ZXIoaSldXVxuICBcbiAgIyBFeGNsdWRlIG92ZXJsYXBwaW5nIHBlYWtzIGZvciB0aGlzIGdlbmVcbiAgaWYgKCFpcy5udWxsKG92ZXJsYXBwaW5nX3BlYWtfaW5kaWNlcykpIHtcbiAgICBwZWFrc190b19jb25zaWRlciA8LSBwZWFrLkgzSzI3YWNbLW92ZXJsYXBwaW5nX3BlYWtfaW5kaWNlc11cbiAgfSBlbHNlIHtcbiAgICBwZWFrc190b19jb25zaWRlciA8LSBwZWFrLkgzSzI3YWNcbiAgfVxuICBcbiAgIyBGaW5kIHRoZSBuZWFyZXN0IHBlYWsgdG8gdGhlIFRTUyBvZiB0aGlzIGdlbmVcbiAgbmVhcmVzdF9wZWFrX2luZGV4IDwtIG5lYXJlc3QoZ2VuZSwgcGVha3NfdG9fY29uc2lkZXIpXG4gIFxuICBpZiAoaXMubmEobmVhcmVzdF9wZWFrX2luZGV4KSkge1xuICAgICMgTm8gcGVha3MgZm91bmQ7IHNldCBOQSB2YWx1ZXNcbiAgICByZXN1bHRzX2xpc3RbW2ldXSA8LSBkYXRhLmZyYW1lKFxuICAgICAgZW5zZW1ibCA9IG1jb2xzKGdlbmUpJGVuc2VtYmwsXG4gICAgICBnZW5lX2NociA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhnZW5lKSksXG4gICAgICBnZW5lX1RTUyA9IHN0YXJ0KGdlbmUpLFxuICAgICAgcGVha19jaHIgPSBOQSxcbiAgICAgIHBlYWtfc3RhcnQgPSBOQSxcbiAgICAgIHBlYWtfZW5kID0gTkEsXG4gICAgICBkaXN0YW5jZSA9IE5BXG4gICAgKVxuICB9IGVsc2Uge1xuICAgIG5lYXJlc3RfcGVhayA8LSBwZWFrc190b19jb25zaWRlcltuZWFyZXN0X3BlYWtfaW5kZXhdXG4gICAgZGlzdCA8LSBkaXN0YW5jZShnZW5lLCBuZWFyZXN0X3BlYWspXG4gICAgXG4gICAgcmVzdWx0c19saXN0W1tpXV0gPC0gZGF0YS5mcmFtZShcbiAgICAgIGVuc2VtYmwgPSBtY29scyhnZW5lKSRlbnNlbWJsLFxuICAgICAgZ2VuZV9jaHIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMoZ2VuZSkpLFxuICAgICAgZ2VuZV9UU1MgPSBzdGFydChnZW5lKSxcbiAgICAgIHBlYWtfY2hyID0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKG5lYXJlc3RfcGVhaykpLFxuICAgICAgcGVha19zdGFydCA9IHN0YXJ0KG5lYXJlc3RfcGVhayksXG4gICAgICBwZWFrX2VuZCA9IGVuZChuZWFyZXN0X3BlYWspLFxuICAgICAgZGlzdGFuY2UgPSBkaXN0XG4gICAgKVxuICB9XG59XG5cbiMgQ29tYmluZSByZXN1bHRzIGludG8gYSBzaW5nbGUgZGF0YSBmcmFtZVxucmVzdWx0cyA8LSBkby5jYWxsKHJiaW5kLCByZXN1bHRzX2xpc3QpXG5cbiMgQWRkIGdyb3VwIGluZm9ybWF0aW9uXG5yZXN1bHRzIDwtIHJlc3VsdHMgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oXG4gIGVuc2VtYmwgJWluJSBncm91cDEgfiBcXGdyb3VwMVxcLFxuICBlbnNlbWJsICVpbiUgZ3JvdXAyIH4gXFxncm91cDJcXCxcbiAgVFJVRSB+IE5BX2NoYXJhY3Rlcl9cbikpXG5cbiMgUGxvdHRpbmdcbmdncGxvdChyZXN1bHRzLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlzdGFuY2UsIGZpbGwgPSBncm91cCkpICtcbiAgZ2VvbV92aW9saW4oKSArXG4gIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4xLCBmaWxsID0gXFx3aGl0ZVxcKSArXG4gIHRoZW1lX2J3KCkgK1xuICBnZ3RpdGxlKFxcRGlzdGFuY2UgdG8gTmVhcmVzdCBIM0syN2FjIFBlYWsgRXhjbHVkaW5nIEdlbmUgQm9keSBPdmVybGFwc1xcKSArXG4gIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNTAgKiAxMDAwKSlcbmBgYFxuYGBgIn0= -->

```r
```r
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3), ensembl = V6, chr = V1) %>%
  dplyr::select(ensembl, chr, TSS) %>% dplyr::filter(ensembl %in% c(group1, group2))
genes.gr <- GRanges(
  seqnames = gene.tb$chr,
  ranges = IRanges(start = gene.tb$TSS, end = gene.tb$TSS),
  ensembl = gene.tb$ensembl
)

genebody.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>% dplyr::filter(V6 %in% c(group1, group2))%>% dplyr::select(V1, V2, V3)
colnames(genebody.tb) <- c(\chr\, \start\, \end\)
genebody.gr <- makeGRangesFromDataFrame(genebody.tb)


# Step 1: Find overlaps between gene bodies and peaks
overlaps <- findOverlaps(genebody.gr, peak.H3K27ac)

# Create a list mapping each gene to the indices of peaks overlapping with its gene body
overlapping_peaks_per_gene <- split(subjectHits(overlaps), queryHits(overlaps))

# Initialize an empty list to store results
results_list <- vector(\list\, length(genes.gr))

# Step 2: For each gene, exclude overlapping peaks and find the nearest peak to its TSS
for (i in seq_along(genes.gr)) {
  gene <- genes.gr[i]
  
  # Get indices of peaks overlapping with this gene's body
  overlapping_peak_indices <- overlapping_peaks_per_gene[[as.character(i)]]
  
  # Exclude overlapping peaks for this gene
  if (!is.null(overlapping_peak_indices)) {
    peaks_to_consider <- peak.H3K27ac[-overlapping_peak_indices]
  } else {
    peaks_to_consider <- peak.H3K27ac
  }
  
  # Find the nearest peak to the TSS of this gene
  nearest_peak_index <- nearest(gene, peaks_to_consider)
  
  if (is.na(nearest_peak_index)) {
    # No peaks found; set NA values
    results_list[[i]] <- data.frame(
      ensembl = mcols(gene)$ensembl,
      gene_chr = as.character(seqnames(gene)),
      gene_TSS = start(gene),
      peak_chr = NA,
      peak_start = NA,
      peak_end = NA,
      distance = NA
    )
  } else {
    nearest_peak <- peaks_to_consider[nearest_peak_index]
    dist <- distance(gene, nearest_peak)
    
    results_list[[i]] <- data.frame(
      ensembl = mcols(gene)$ensembl,
      gene_chr = as.character(seqnames(gene)),
      gene_TSS = start(gene),
      peak_chr = as.character(seqnames(nearest_peak)),
      peak_start = start(nearest_peak),
      peak_end = end(nearest_peak),
      distance = dist
    )
  }
}

# Combine results into a single data frame
results <- do.call(rbind, results_list)

# Add group information
results <- results %>% dplyr::mutate(group = case_when(
  ensembl %in% group1 ~ \group1\,
  ensembl %in% group2 ~ \group2\,
  TRUE ~ NA_character_
))

# Plotting
ggplot(results, aes(x = group, y = distance, fill = group)) +
  geom_violin() +
  geom_boxplot(outlier.shape = NA, width = 0.1, fill = \white\) +
  theme_bw() +
  ggtitle(\Distance to Nearest H3K27ac Peak Excluding Gene Body Overlaps\) +
  scale_y_continuous(labels = label_kb_mb) +
  coord_cartesian(ylim = c(0, 50 * 1000))
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


###[2.33] Finding closest enhancer
Here, enhancer will be defined by H3K27ac peak
It makes more sence to include the enhancer peak on gene body
(strategy 1) exclude +-10kb region from TSS only
(strategy 2) only check the E-P loops called in Micro-C
##### binary group - excluding all gene body

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMlZ1WlM1MFlpQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKdGJURXdYMGRTUTIwek9DNXdObDluWlc1bFgzTnZjblJsWkM1aVpXUmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGUlRVeUE5SUdsbVpXeHpaU2hXTkNBOVBTQmNJaXRjSWl3Z1ZqSXNJRll6S1N3Z1pXNXpaVzFpYkNBOUlGWTJMQ0JqYUhJZ1BTQldNU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1pXNXpaVzFpYkN3Z1kyaHlMQ0JVVTFNcFhHNWNibWR5YjNWd01TQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKblpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZZbWx1WVhKNVIzSnZkWEF4TG5SemRsd2lLU2trWjJWdVpWeHVaM0p2ZFhBeUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREl1ZEhOMlhDSXBLU1JuWlc1bFhHNWNibHh1WjJWdVpTNTBZaUE4TFNCblpXNWxMblJpSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dWdWMyVnRZbXdnSldsdUpTQmpLR2R5YjNWd01Td2daM0p2ZFhBeUtTbGNibWRsYm1WekxtZHlJRHd0SUVkU1lXNW5aWE1vWEc0Z0lITmxjVzVoYldWeklEMGdaMlZ1WlM1MFlpUmphSElzWEc0Z0lISmhibWRsY3lBOUlFbFNZVzVuWlhNb2MzUmhjblFnUFNCblpXNWxMblJpSkZSVFV5d2daVzVrSUQwZ1oyVnVaUzUwWWlSVVUxTXBMRnh1SUNCbGJuTmxiV0pzSUQwZ1oyVnVaUzUwWWlSbGJuTmxiV0pzWEc0cFhHNWNibWRsYm1WaWIyUjVMblJpSUR3dElHZGxibVV1ZEdJZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb2MzUmhjblFnUFNCVVUxTXRNVEFxTVRBd01Dd2daVzVrSUQwZ1ZGTlRJQ3NnTVRBcU1UQXdNQ2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1kyaHlMQ0J6ZEdGeWRDd2daVzVrS1Z4dVhHNW5aVzVsWW05a2VTNW5jaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvWjJWdVpXSnZaSGt1ZEdJcFhHNWNibHh1Y0dWaGF5NUlNMHN5TjJGaklEd3RJR2x0Y0c5eWRGQmxZV3NvYUdWeVpTaHlaV1pFYVhJc0lGd2lSMU5OTWpRek9EUTNObDlGUXkxRVJ5MHpORFU0TFVnelN6STNRVU5mUVZOWlRsOHhMbTVoY25KdmQxQmxZV3N1WW1Wa1hDSXBLVnh1SXlCd1pXRnJMa2d6U3pJM1lXTThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9abkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpUjFOTk1qUXpPRFEzTmw5RlF5MUVSeTB6TkRVNExVZ3pTekkzUVVOZlFWTlpUbDh4TG01aGNuSnZkMUJsWVdzdVltVmtYQ0lwS1NBbFBpVWdYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1J3YkhseU9qcHRkWFJoZEdVb1kyaHlJRDBnVmpFc0lITjBZWEowSUQwZ0tGWXlJQ3NnVmpNcEx6SXNJR1Z1WkNBOUlDaFdNaUFySUZZektTOHlLU0FsUGlWY2JpTWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pIQnNlWEk2T25ObGJHVmpkQ2hqYUhJc0lITjBZWEowTENCbGJtUXBLVnh1WEc0akl5TWpJeU1qSUVacGJIUmxjbWx1WnlCdmRYUWdjR1ZoYTNNZ2IzWmxjbXhoY0hCcGJtY2dkMmwwYUNCMGFHVWdaMlZ1WlNCaWIyUjVYRzV2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9aMlZ1WldKdlpIa3VaM0lzSUhCbFlXc3VTRE5MTWpkaFl5bGNibHh1SXlCSmJtUnBZMlZ6SUc5bUlIQmxZV3R6SUhSb1lYUWdiM1psY214aGNDQjBhR1VnVkZOVFhHNXZkbVZ5YkdGd2NHbHVaMTl3WldGclgybHVaR2xqWlhNZ1BDMGdkVzVwY1hWbEtITjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLU2xjYmx4dUl5QkZlR05zZFdSbElHOTJaWEpzWVhCd2FXNW5JSEJsWVd0elhHNXViMjVmYjNabGNteGhjSEJwYm1kZmNHVmhhM01nUEMwZ2NHVmhheTVJTTBzeU4yRmpXeTF2ZG1WeWJHRndjR2x1WjE5d1pXRnJYMmx1WkdsalpYTmRYRzVjYmx4dUl5TWpJeU1qSXlCRFlXeGpkV3hoZEdsdVp5QmthWE4wWVc1alpTQjBieUJ1WldGeVpYTjBJSEJsWVd0Y2JtNWxZWEpsYzNSZmNHVmhhMTlwYm1ScFkyVnpJRHd0SUc1bFlYSmxjM1FvWjJWdVpYTXVaM0lzSUc1dmJsOXZkbVZ5YkdGd2NHbHVaMTl3WldGcmN5bGNibTVsWVhKbGMzUmZjR1ZoYTNNZ1BDMGdibTl1WDI5MlpYSnNZWEJ3YVc1blgzQmxZV3R6VzI1bFlYSmxjM1JmY0dWaGExOXBibVJwWTJWelhWeHVaR2x6ZEdGdVkyVnpJRHd0SUdScGMzUmhibU5sS0dkbGJtVnpMbWR5TENCdVpXRnlaWE4wWDNCbFlXdHpLVnh1WEc1Y2JuSmxjM1ZzZEhNZ1BDMGdaR0YwWVM1bWNtRnRaU2hjYmlBZ1pXNXpaVzFpYkNBOUlHMWpiMnh6S0dkbGJtVnpMbWR5S1NSbGJuTmxiV0pzTEZ4dUlDQm5aVzVsWDJOb2NpQTlJR0Z6TG1Ob1lYSmhZM1JsY2loelpYRnVZVzFsY3loblpXNWxjeTVuY2lrcExGeHVJQ0JuWlc1bFgxUlRVeUE5SUhOMFlYSjBLR2RsYm1WekxtZHlLU3hjYmlBZ2NHVmhhMTlqYUhJZ1BTQmhjeTVqYUdGeVlXTjBaWElvYzJWeGJtRnRaWE1vYm1WaGNtVnpkRjl3WldGcmN5a3BMRnh1SUNCd1pXRnJYM04wWVhKMElEMGdjM1JoY25Rb2JtVmhjbVZ6ZEY5d1pXRnJjeWtzWEc0Z0lIQmxZV3RmWlc1a0lEMGdaVzVrS0c1bFlYSmxjM1JmY0dWaGEzTXBMRnh1SUNCa2FYTjBZVzVqWlNBOUlHUnBjM1JoYm1ObGMxeHVLVnh1WEc1eVpYTjFiSFJ6SUR3dElISmxjM1ZzZEhNZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCallYTmxYM2RvWlc0b1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd01TQitJRndpWjNKdmRYQXhYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWdWMyVnRZbXdnSldsdUpTQm5jbTkxY0RJZ2ZpQmNJbWR5YjNWd01sd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JVVWxWRklINGdUa0VwS1Z4dVhHNW5aM0JzYjNRb2NtVnpkV3gwY3l3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlHUnBjM1JoYm1ObExDQm1hV3hzSUQwZ1ozSnZkWEFwS1NBcklHZGxiMjFmZG1sdmJHbHVLQ2tnS3lCblpXOXRYMkp2ZUhCc2IzUW9iM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJMQ0IzYVdSMGFDQTlJREF1TVN3Z1ptbHNiQ0E5SUZ3aWQyaHBkR1ZjSWlrZ0t5QjBhR1Z0WlY5aWR5Z3BJQ3NnWjJkMGFYUnNaU2hjSW1ScGMzUmhibU5sSUhSdklHNWxZWEpsYzNRZ1NETkxNamRoWXlCd1pXRnJJR1Y0WTJ4MVpHbHVaeUJuWlc1bElHSnZaSGxjSWlrZ0t5QnpZMkZzWlY5NVgyTnZiblJwYm5WdmRYTW9iR0ZpWld4eklEMGdiR0ZpWld4ZmEySmZiV0lwSUNzZ1kyOXZjbVJmWTJGeWRHVnphV0Z1S0hsc2FXMGdQU0JqS0RBc0lESTFNQ294TURBd0tTbGNibHh1SUNCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLCBlbnNlbWJsID0gVjYsIGNociA9IFYxKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsLCBjaHIsIFRTUylcblxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLnRiIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGMoZ3JvdXAxLCBncm91cDIpKVxuZ2VuZXMuZ3IgPC0gR1JhbmdlcyhcbiAgc2VxbmFtZXMgPSBnZW5lLnRiJGNocixcbiAgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGdlbmUudGIkVFNTLCBlbmQgPSBnZW5lLnRiJFRTUyksXG4gIGVuc2VtYmwgPSBnZW5lLnRiJGVuc2VtYmxcbilcblxuZ2VuZWJvZHkudGIgPC0gZ2VuZS50YiAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IFRTUy0xMCoxMDAwLCBlbmQgPSBUU1MgKyAxMCoxMDAwKSAlPiVcbiAgZHBseXI6OnNlbGVjdChjaHIsIHN0YXJ0LCBlbmQpXG5cbmdlbmVib2R5LmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShnZW5lYm9keS50YilcblxuXG5wZWFrLkgzSzI3YWMgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWRcXCkpXG4jIHBlYWsuSDNLMjdhYzwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShmcmVhZChoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWRcXCkpICU+JSBcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6Om11dGF0ZShjaHIgPSBWMSwgc3RhcnQgPSAoVjIgKyBWMykvMiwgZW5kID0gKFYyICsgVjMpLzIpICU+JVxuIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZCkpXG5cbiMjIyMjIyMgRmlsdGVyaW5nIG91dCBwZWFrcyBvdmVybGFwcGluZyB3aXRoIHRoZSBnZW5lIGJvZHlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhnZW5lYm9keS5nciwgcGVhay5IM0syN2FjKVxuXG4jIEluZGljZXMgb2YgcGVha3MgdGhhdCBvdmVybGFwIHRoZSBUU1Ncbm92ZXJsYXBwaW5nX3BlYWtfaW5kaWNlcyA8LSB1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcHMpKVxuXG4jIEV4Y2x1ZGUgb3ZlcmxhcHBpbmcgcGVha3Ncbm5vbl9vdmVybGFwcGluZ19wZWFrcyA8LSBwZWFrLkgzSzI3YWNbLW92ZXJsYXBwaW5nX3BlYWtfaW5kaWNlc11cblxuXG4jIyMjIyMjIENhbGN1bGF0aW5nIGRpc3RhbmNlIHRvIG5lYXJlc3QgcGVha1xubmVhcmVzdF9wZWFrX2luZGljZXMgPC0gbmVhcmVzdChnZW5lcy5nciwgbm9uX292ZXJsYXBwaW5nX3BlYWtzKVxubmVhcmVzdF9wZWFrcyA8LSBub25fb3ZlcmxhcHBpbmdfcGVha3NbbmVhcmVzdF9wZWFrX2luZGljZXNdXG5kaXN0YW5jZXMgPC0gZGlzdGFuY2UoZ2VuZXMuZ3IsIG5lYXJlc3RfcGVha3MpXG5cblxucmVzdWx0cyA8LSBkYXRhLmZyYW1lKFxuICBlbnNlbWJsID0gbWNvbHMoZ2VuZXMuZ3IpJGVuc2VtYmwsXG4gIGdlbmVfY2hyID0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKGdlbmVzLmdyKSksXG4gIGdlbmVfVFNTID0gc3RhcnQoZ2VuZXMuZ3IpLFxuICBwZWFrX2NociA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhuZWFyZXN0X3BlYWtzKSksXG4gIHBlYWtfc3RhcnQgPSBzdGFydChuZWFyZXN0X3BlYWtzKSxcbiAgcGVha19lbmQgPSBlbmQobmVhcmVzdF9wZWFrcyksXG4gIGRpc3RhbmNlID0gZGlzdGFuY2VzXG4pXG5cbnJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihlbnNlbWJsICVpbiUgZ3JvdXAxIH4gXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwMiB+IFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpXG5cbmdncGxvdChyZXN1bHRzLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlzdGFuY2UsIGZpbGwgPSBncm91cCkpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4xLCBmaWxsID0gXFx3aGl0ZVxcKSArIHRoZW1lX2J3KCkgKyBnZ3RpdGxlKFxcZGlzdGFuY2UgdG8gbmVhcmVzdCBIM0syN2FjIHBlYWsgZXhjbHVkaW5nIGdlbmUgYm9keVxcKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMjUwKjEwMDApKVxuXG4gIFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3), ensembl = V6, chr = V1) %>%
  dplyr::select(ensembl, chr, TSS)

group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.tb <- gene.tb %>% dplyr::filter(ensembl %in% c(group1, group2))
genes.gr <- GRanges(
  seqnames = gene.tb$chr,
  ranges = IRanges(start = gene.tb$TSS, end = gene.tb$TSS),
  ensembl = gene.tb$ensembl
)

genebody.tb <- gene.tb %>% dplyr::mutate(start = TSS-10*1000, end = TSS + 10*1000) %>%
  dplyr::select(chr, start, end)

genebody.gr <- makeGRangesFromDataFrame(genebody.tb)


peak.H3K27ac <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
# peak.H3K27ac<- makeGRangesFromDataFrame(fread(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\)) %>% 
#                                           dplyr::mutate(chr = V1, start = (V2 + V3)/2, end = (V2 + V3)/2) %>%
#                                           dplyr::select(chr, start, end))

####### Filtering out peaks overlapping with the gene body
overlaps <- findOverlaps(genebody.gr, peak.H3K27ac)

# Indices of peaks that overlap the TSS
overlapping_peak_indices <- unique(subjectHits(overlaps))

# Exclude overlapping peaks
non_overlapping_peaks <- peak.H3K27ac[-overlapping_peak_indices]


####### Calculating distance to nearest peak
nearest_peak_indices <- nearest(genes.gr, non_overlapping_peaks)
nearest_peaks <- non_overlapping_peaks[nearest_peak_indices]
distances <- distance(genes.gr, nearest_peaks)


results <- data.frame(
  ensembl = mcols(genes.gr)$ensembl,
  gene_chr = as.character(seqnames(genes.gr)),
  gene_TSS = start(genes.gr),
  peak_chr = as.character(seqnames(nearest_peaks)),
  peak_start = start(nearest_peaks),
  peak_end = end(nearest_peaks),
  distance = distances
)

results <- results %>% dplyr::mutate(group = case_when(ensembl %in% group1 ~ \group1\,
                                            ensembl %in% group2 ~ \group2\,
                                            TRUE ~ NA))

ggplot(results, aes(x = group, y = distance, fill = group)) + geom_violin() + geom_boxplot(outlier.shape = NA, width = 0.1, fill = \white\) + theme_bw() + ggtitle(\distance to nearest H3K27ac peak excluding gene body\) + scale_y_continuous(labels = label_kb_mb) + coord_cartesian(ylim = c(0, 250*1000))

  



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVoyVnVaUzUwWWlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnh0YlRFd1gwZFNRMjB6T0M1d05sOW5aVzVsWDNOdmNuUmxaQzVpWldSY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0ZSVFV5QTlJR2xtWld4elpTaFdOQ0E5UFNCY1hDdGNYQ3dnVmpJc0lGWXpLU3dnWlc1elpXMWliQ0E5SUZZMkxDQmphSElnUFNCV01Ta2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWlc1elpXMWliQ3dnWTJoeUxDQlVVMU1wWEc1Y2JtZHliM1Z3TVNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhuWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlltbHVZWEo1UjNKdmRYQXhMblJ6ZGx4Y0tTa2taMlZ1WlZ4dVozSnZkWEF5SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNESXVkSE4yWEZ3cEtTUm5aVzVsWEc1Y2JseHVaMlZ1WlM1MFlpQThMU0JuWlc1bExuUmlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR1Z1YzJWdFltd2dKV2x1SlNCaktHZHliM1Z3TVN3Z1ozSnZkWEF5S1NsY2JtZGxibVZ6TG1keUlEd3RJRWRTWVc1blpYTW9YRzRnSUhObGNXNWhiV1Z6SUQwZ1oyVnVaUzUwWWlSamFISXNYRzRnSUhKaGJtZGxjeUE5SUVsU1lXNW5aWE1vYzNSaGNuUWdQU0JuWlc1bExuUmlKRlJUVXl3Z1pXNWtJRDBnWjJWdVpTNTBZaVJVVTFNcExGeHVJQ0JsYm5ObGJXSnNJRDBnWjJWdVpTNTBZaVJsYm5ObGJXSnNYRzRwWEc1Y2JtZGxibVZpYjJSNUxuUmlJRHd0SUdkbGJtVXVkR0lnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvYzNSaGNuUWdQU0JVVTFNdE1UQXFNVEF3TUN3Z1pXNWtJRDBnVkZOVElDc2dNVEFxTVRBd01Da2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWTJoeUxDQnpkR0Z5ZEN3Z1pXNWtLVnh1WEc1blpXNWxZbTlrZVM1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9aMlZ1WldKdlpIa3VkR0lwWEc1Y2JseHVjR1ZoYXk1SU0wc3lOMkZqSUR3dElHbHRjRzl5ZEZCbFlXc29hR1Z5WlNoeVpXWkVhWElzSUZ4Y1IxTk5NalF6T0RRM05sOUZReTFFUnkwek5EVTRMVWd6U3pJM1FVTmZRVk5aVGw4eExtNWhjbkp2ZDFCbFlXc3VZbVZrWEZ3cEtWeHVJeUJ3WldGckxrZ3pTekkzWVdNOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNSMU5OTWpRek9EUTNObDlGUXkxRVJ5MHpORFU0TFVnelN6STNRVU5mUVZOWlRsOHhMbTVoY25KdmQxQmxZV3N1WW1Wa1hGd3BLU0FsUGlVZ1hHNGpJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvWTJoeUlEMGdWakVzSUhOMFlYSjBJRDBnS0ZZeUlDc2dWak1wTHpJc0lHVnVaQ0E5SUNoV01pQXJJRll6S1M4eUtTQWxQaVZjYmlNZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkhCc2VYSTZPbk5sYkdWamRDaGphSElzSUhOMFlYSjBMQ0JsYm1RcEtWeHVYRzRqSXlNakl5TWpJRVpwYkhSbGNtbHVaeUJ2ZFhRZ2NHVmhhM01nYjNabGNteGhjSEJwYm1jZ2QybDBhQ0IwYUdVZ1oyVnVaU0JpYjJSNVhHNXZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1oyVnVaV0p2WkhrdVozSXNJSEJsWVdzdVNETkxNamRoWXlsY2JseHVJeUJKYm1ScFkyVnpJRzltSUhCbFlXdHpJSFJvWVhRZ2IzWmxjbXhoY0NCMGFHVWdWRk5UWEc1dmRtVnliR0Z3Y0dsdVoxOXdaV0ZyWDJsdVpHbGpaWE1nUEMwZ2RXNXBjWFZsS0hOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektTbGNibHh1SXlCRmVHTnNkV1JsSUc5MlpYSnNZWEJ3YVc1bklIQmxZV3R6WEc1dWIyNWZiM1psY214aGNIQnBibWRmY0dWaGEzTWdQQzBnY0dWaGF5NUlNMHN5TjJGald5MXZkbVZ5YkdGd2NHbHVaMTl3WldGclgybHVaR2xqWlhOZFhHNWNibHh1SXlNakl5TWpJeUJEWVd4amRXeGhkR2x1WnlCa2FYTjBZVzVqWlNCMGJ5QnVaV0Z5WlhOMElIQmxZV3RjYm01bFlYSmxjM1JmY0dWaGExOXBibVJwWTJWeklEd3RJRzVsWVhKbGMzUW9aMlZ1WlhNdVozSXNJRzV2Ymw5dmRtVnliR0Z3Y0dsdVoxOXdaV0ZyY3lsY2JtNWxZWEpsYzNSZmNHVmhhM01nUEMwZ2JtOXVYMjkyWlhKc1lYQndhVzVuWDNCbFlXdHpXMjVsWVhKbGMzUmZjR1ZoYTE5cGJtUnBZMlZ6WFZ4dVpHbHpkR0Z1WTJWeklEd3RJR1JwYzNSaGJtTmxLR2RsYm1WekxtZHlMQ0J1WldGeVpYTjBYM0JsWVd0ektWeHVYRzVjYm5KbGMzVnNkSE1nUEMwZ1pHRjBZUzVtY21GdFpTaGNiaUFnWlc1elpXMWliQ0E5SUcxamIyeHpLR2RsYm1WekxtZHlLU1JsYm5ObGJXSnNMRnh1SUNCblpXNWxYMk5vY2lBOUlHRnpMbU5vWVhKaFkzUmxjaWh6WlhGdVlXMWxjeWhuWlc1bGN5NW5jaWtwTEZ4dUlDQm5aVzVsWDFSVFV5QTlJSE4wWVhKMEtHZGxibVZ6TG1keUtTeGNiaUFnY0dWaGExOWphSElnUFNCaGN5NWphR0Z5WVdOMFpYSW9jMlZ4Ym1GdFpYTW9ibVZoY21WemRGOXdaV0ZyY3lrcExGeHVJQ0J3WldGclgzTjBZWEowSUQwZ2MzUmhjblFvYm1WaGNtVnpkRjl3WldGcmN5a3NYRzRnSUhCbFlXdGZaVzVrSUQwZ1pXNWtLRzVsWVhKbGMzUmZjR1ZoYTNNcExGeHVJQ0JrYVhOMFlXNWpaU0E5SUdScGMzUmhibU5sYzF4dUtWeHVYRzV5WlhOMWJIUnpJRHd0SUhKbGMzVnNkSE1nSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JqWVhObFgzZG9aVzRvWlc1elpXMWliQ0FsYVc0bElHZHliM1Z3TVNCK0lGeGNaM0p2ZFhBeFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1Z1YzJWdFltd2dKV2x1SlNCbmNtOTFjRElnZmlCY1hHZHliM1Z3TWx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVbFZGSUg0Z1RrRXBLVnh1WEc1blozQnNiM1FvY21WemRXeDBjeXdnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUdScGMzUmhibU5sTENCbWFXeHNJRDBnWjNKdmRYQXBLU0FySUdkbGIyMWZkbWx2YkdsdUtDa2dLeUJuWlc5dFgySnZlSEJzYjNRb2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QkxDQjNhV1IwYUNBOUlEQXVNU3dnWm1sc2JDQTlJRnhjZDJocGRHVmNYQ2tnS3lCMGFHVnRaVjlpZHlncElDc2daMmQwYVhSc1pTaGNYR1JwYzNSaGJtTmxJSFJ2SUc1bFlYSmxjM1FnU0ROTE1qZGhZeUJ3WldGcklHVjRZMngxWkdsdVp5Qm5aVzVsSUdKdlpIbGNYQ2tnS3lCelkyRnNaVjk1WDJOdmJuUnBiblZ2ZFhNb2JHRmlaV3h6SUQwZ2JHRmlaV3hmYTJKZmJXSXBJQ3NnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLREFzSURJMU1Db3hNREF3S1NsY2JseHVJQ0JjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSwgZW5zZW1ibCA9IFY2LCBjaHIgPSBWMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibCwgY2hyLCBUU1MpXG5cbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cblxuZ2VuZS50YiA8LSBnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmwgJWluJSBjKGdyb3VwMSwgZ3JvdXAyKSlcbmdlbmVzLmdyIDwtIEdSYW5nZXMoXG4gIHNlcW5hbWVzID0gZ2VuZS50YiRjaHIsXG4gIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBnZW5lLnRiJFRTUywgZW5kID0gZ2VuZS50YiRUU1MpLFxuICBlbnNlbWJsID0gZ2VuZS50YiRlbnNlbWJsXG4pXG5cbmdlbmVib2R5LnRiIDwtIGdlbmUudGIgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBUU1MtMTAqMTAwMCwgZW5kID0gVFNTICsgMTAqMTAwMCkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kKVxuXG5nZW5lYm9keS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZWJvZHkudGIpXG5cblxucGVhay5IM0syN2FjIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkXFwpKVxuIyBwZWFrLkgzSzI3YWM8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZnJlYWQoaGVyZShyZWZEaXIsIFxcR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkXFwpKSAlPiUgXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjptdXRhdGUoY2hyID0gVjEsIHN0YXJ0ID0gKFYyICsgVjMpLzIsIGVuZCA9IChWMiArIFYzKS8yKSAlPiVcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChjaHIsIHN0YXJ0LCBlbmQpKVxuXG4jIyMjIyMjIEZpbHRlcmluZyBvdXQgcGVha3Mgb3ZlcmxhcHBpbmcgd2l0aCB0aGUgZ2VuZSBib2R5XG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoZ2VuZWJvZHkuZ3IsIHBlYWsuSDNLMjdhYylcblxuIyBJbmRpY2VzIG9mIHBlYWtzIHRoYXQgb3ZlcmxhcCB0aGUgVFNTXG5vdmVybGFwcGluZ19wZWFrX2luZGljZXMgPC0gdW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXBzKSlcblxuIyBFeGNsdWRlIG92ZXJsYXBwaW5nIHBlYWtzXG5ub25fb3ZlcmxhcHBpbmdfcGVha3MgPC0gcGVhay5IM0syN2FjWy1vdmVybGFwcGluZ19wZWFrX2luZGljZXNdXG5cblxuIyMjIyMjIyBDYWxjdWxhdGluZyBkaXN0YW5jZSB0byBuZWFyZXN0IHBlYWtcbm5lYXJlc3RfcGVha19pbmRpY2VzIDwtIG5lYXJlc3QoZ2VuZXMuZ3IsIG5vbl9vdmVybGFwcGluZ19wZWFrcylcbm5lYXJlc3RfcGVha3MgPC0gbm9uX292ZXJsYXBwaW5nX3BlYWtzW25lYXJlc3RfcGVha19pbmRpY2VzXVxuZGlzdGFuY2VzIDwtIGRpc3RhbmNlKGdlbmVzLmdyLCBuZWFyZXN0X3BlYWtzKVxuXG5cbnJlc3VsdHMgPC0gZGF0YS5mcmFtZShcbiAgZW5zZW1ibCA9IG1jb2xzKGdlbmVzLmdyKSRlbnNlbWJsLFxuICBnZW5lX2NociA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhnZW5lcy5ncikpLFxuICBnZW5lX1RTUyA9IHN0YXJ0KGdlbmVzLmdyKSxcbiAgcGVha19jaHIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMobmVhcmVzdF9wZWFrcykpLFxuICBwZWFrX3N0YXJ0ID0gc3RhcnQobmVhcmVzdF9wZWFrcyksXG4gIHBlYWtfZW5kID0gZW5kKG5lYXJlc3RfcGVha3MpLFxuICBkaXN0YW5jZSA9IGRpc3RhbmNlc1xuKVxuXG5yZXN1bHRzIDwtIHJlc3VsdHMgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oZW5zZW1ibCAlaW4lIGdyb3VwMSB+IFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc2VtYmwgJWluJSBncm91cDIgfiBcXGdyb3VwMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKVxuXG5nZ3Bsb3QocmVzdWx0cywgYWVzKHggPSBncm91cCwgeSA9IGRpc3RhbmNlLCBmaWxsID0gZ3JvdXApKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BLCB3aWR0aCA9IDAuMSwgZmlsbCA9IFxcd2hpdGVcXCkgKyB0aGVtZV9idygpICsgZ2d0aXRsZShcXGRpc3RhbmNlIHRvIG5lYXJlc3QgSDNLMjdhYyBwZWFrIGV4Y2x1ZGluZyBnZW5lIGJvZHlcXCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDI1MCoxMDAwKSlcblxuICBcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSwgZW5zZW1ibCA9IFY2LCBjaHIgPSBWMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibCwgY2hyLCBUU1MpXG5cbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cblxuZ2VuZS50YiA8LSBnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmwgJWluJSBjKGdyb3VwMSwgZ3JvdXAyKSlcbmdlbmVzLmdyIDwtIEdSYW5nZXMoXG4gIHNlcW5hbWVzID0gZ2VuZS50YiRjaHIsXG4gIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBnZW5lLnRiJFRTUywgZW5kID0gZ2VuZS50YiRUU1MpLFxuICBlbnNlbWJsID0gZ2VuZS50YiRlbnNlbWJsXG4pXG5cbmdlbmVib2R5LnRiIDwtIGdlbmUudGIgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBUU1MtMTAqMTAwMCwgZW5kID0gVFNTICsgMTAqMTAwMCkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kKVxuXG5nZW5lYm9keS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZWJvZHkudGIpXG5cblxucGVhay5IM0syN2FjIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkXFwpKVxuIyBwZWFrLkgzSzI3YWM8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZnJlYWQoaGVyZShyZWZEaXIsIFxcR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkXFwpKSAlPiUgXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjptdXRhdGUoY2hyID0gVjEsIHN0YXJ0ID0gKFYyICsgVjMpLzIsIGVuZCA9IChWMiArIFYzKS8yKSAlPiVcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChjaHIsIHN0YXJ0LCBlbmQpKVxuXG4jIyMjIyMjIEZpbHRlcmluZyBvdXQgcGVha3Mgb3ZlcmxhcHBpbmcgd2l0aCB0aGUgZ2VuZSBib2R5XG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoZ2VuZWJvZHkuZ3IsIHBlYWsuSDNLMjdhYylcblxuIyBJbmRpY2VzIG9mIHBlYWtzIHRoYXQgb3ZlcmxhcCB0aGUgVFNTXG5vdmVybGFwcGluZ19wZWFrX2luZGljZXMgPC0gdW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXBzKSlcblxuIyBFeGNsdWRlIG92ZXJsYXBwaW5nIHBlYWtzXG5ub25fb3ZlcmxhcHBpbmdfcGVha3MgPC0gcGVhay5IM0syN2FjWy1vdmVybGFwcGluZ19wZWFrX2luZGljZXNdXG5cblxuIyMjIyMjIyBDYWxjdWxhdGluZyBkaXN0YW5jZSB0byBuZWFyZXN0IHBlYWtcbm5lYXJlc3RfcGVha19pbmRpY2VzIDwtIG5lYXJlc3QoZ2VuZXMuZ3IsIG5vbl9vdmVybGFwcGluZ19wZWFrcylcbm5lYXJlc3RfcGVha3MgPC0gbm9uX292ZXJsYXBwaW5nX3BlYWtzW25lYXJlc3RfcGVha19pbmRpY2VzXVxuZGlzdGFuY2VzIDwtIGRpc3RhbmNlKGdlbmVzLmdyLCBuZWFyZXN0X3BlYWtzKVxuXG5cbnJlc3VsdHMgPC0gZGF0YS5mcmFtZShcbiAgZW5zZW1ibCA9IG1jb2xzKGdlbmVzLmdyKSRlbnNlbWJsLFxuICBnZW5lX2NociA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhnZW5lcy5ncikpLFxuICBnZW5lX1RTUyA9IHN0YXJ0KGdlbmVzLmdyKSxcbiAgcGVha19jaHIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMobmVhcmVzdF9wZWFrcykpLFxuICBwZWFrX3N0YXJ0ID0gc3RhcnQobmVhcmVzdF9wZWFrcyksXG4gIHBlYWtfZW5kID0gZW5kKG5lYXJlc3RfcGVha3MpLFxuICBkaXN0YW5jZSA9IGRpc3RhbmNlc1xuKVxuXG5yZXN1bHRzIDwtIHJlc3VsdHMgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oZW5zZW1ibCAlaW4lIGdyb3VwMSB+IFxcZ3JvdXAxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc2VtYmwgJWluJSBncm91cDIgfiBcXGdyb3VwMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKVxuXG5nZ3Bsb3QocmVzdWx0cywgYWVzKHggPSBncm91cCwgeSA9IGRpc3RhbmNlLCBmaWxsID0gZ3JvdXApKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BLCB3aWR0aCA9IDAuMSwgZmlsbCA9IFxcd2hpdGVcXCkgKyB0aGVtZV9idygpICsgZ2d0aXRsZShcXGRpc3RhbmNlIHRvIG5lYXJlc3QgSDNLMjdhYyBwZWFrIGV4Y2x1ZGluZyBnZW5lIGJvZHlcXCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDI1MCoxMDAwKSlcblxuICBcbmBgYFxuYGBgIn0= -->

```r
```r
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3), ensembl = V6, chr = V1) %>%
  dplyr::select(ensembl, chr, TSS)

group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.tb <- gene.tb %>% dplyr::filter(ensembl %in% c(group1, group2))
genes.gr <- GRanges(
  seqnames = gene.tb$chr,
  ranges = IRanges(start = gene.tb$TSS, end = gene.tb$TSS),
  ensembl = gene.tb$ensembl
)

genebody.tb <- gene.tb %>% dplyr::mutate(start = TSS-10*1000, end = TSS + 10*1000) %>%
  dplyr::select(chr, start, end)

genebody.gr <- makeGRangesFromDataFrame(genebody.tb)


peak.H3K27ac <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
# peak.H3K27ac<- makeGRangesFromDataFrame(fread(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\)) %>% 
#                                           dplyr::mutate(chr = V1, start = (V2 + V3)/2, end = (V2 + V3)/2) %>%
#                                           dplyr::select(chr, start, end))

####### Filtering out peaks overlapping with the gene body
overlaps <- findOverlaps(genebody.gr, peak.H3K27ac)

# Indices of peaks that overlap the TSS
overlapping_peak_indices <- unique(subjectHits(overlaps))

# Exclude overlapping peaks
non_overlapping_peaks <- peak.H3K27ac[-overlapping_peak_indices]


####### Calculating distance to nearest peak
nearest_peak_indices <- nearest(genes.gr, non_overlapping_peaks)
nearest_peaks <- non_overlapping_peaks[nearest_peak_indices]
distances <- distance(genes.gr, nearest_peaks)


results <- data.frame(
  ensembl = mcols(genes.gr)$ensembl,
  gene_chr = as.character(seqnames(genes.gr)),
  gene_TSS = start(genes.gr),
  peak_chr = as.character(seqnames(nearest_peaks)),
  peak_start = start(nearest_peaks),
  peak_end = end(nearest_peaks),
  distance = distances
)

results <- results %>% dplyr::mutate(group = case_when(ensembl %in% group1 ~ \group1\,
                                            ensembl %in% group2 ~ \group2\,
                                            TRUE ~ NA))

ggplot(results, aes(x = group, y = distance, fill = group)) + geom_violin() + geom_boxplot(outlier.shape = NA, width = 0.1, fill = \white\) + theme_bw() + ggtitle(\distance to nearest H3K27ac peak excluding gene body\) + scale_y_continuous(labels = label_kb_mb) + coord_cartesian(ylim = c(0, 250*1000))

  
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

##### binary group - excluding specific gene body

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhDSXBLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNaTUwYzNaY0lpa3BKR2RsYm1WY2JseHVYRzVuWlc1bExuUmlJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltMXRNVEJmUjFKRGJUTTRMbkEyWDJkbGJtVmZjMjl5ZEdWa0xtSmxaRndpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9WRk5USUQwZ2FXWmxiSE5sS0ZZMElEMDlJRndpSzF3aUxDQldNaXdnVmpNcExDQmxibk5sYldKc0lEMGdWallzSUdOb2NpQTlJRll4S1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGxibk5sYldKc0xDQmphSElzSUZSVFV5a2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aVzV6WlcxaWJDQWxhVzRsSUdNb1ozSnZkWEF4TENCbmNtOTFjRElwS1Z4dVoyVnVaWE11WjNJZ1BDMGdSMUpoYm1kbGN5aGNiaUFnYzJWeGJtRnRaWE1nUFNCblpXNWxMblJpSkdOb2NpeGNiaUFnY21GdVoyVnpJRDBnU1ZKaGJtZGxjeWh6ZEdGeWRDQTlJR2RsYm1VdWRHSWtWRk5UTENCbGJtUWdQU0JuWlc1bExuUmlKRlJUVXlrc1hHNGdJR1Z1YzJWdFltd2dQU0JuWlc1bExuUmlKR1Z1YzJWdFlteGNiaWxjYmx4dVoyVnVaV0p2WkhrdWRHSWdQQzBnWjJWdVpTNTBZaUFsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2h6ZEdGeWRDQTlJRlJUVXkweE1Db3hNREF3TENCbGJtUWdQU0JVVTFNZ0t5QXhNQ294TURBd0tTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hqYUhJc0lITjBZWEowTENCbGJtUXBYRzVuWlc1bFltOWtlUzVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1oyVnVaV0p2WkhrdWRHSXBYRzVjYm5CbFlXc3VTRE5MTWpkaFl5QThMU0JwYlhCdmNuUlFaV0ZyS0dobGNtVW9jbVZtUkdseUxDQmNJa2RUVFRJME16ZzBOelpmUlVNdFJFY3RNelExT0MxSU0wc3lOMEZEWDBGVFdVNWZNUzV1WVhKeWIzZFFaV0ZyTG1KbFpGd2lLU2xjYmx4dVhHNGpJRk4wWlhBZ01Ub2dSbWx1WkNCdmRtVnliR0Z3Y3lCaVpYUjNaV1Z1SUdkbGJtVWdZbTlrYVdWeklHRnVaQ0J3WldGcmMxeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHZGxibVZpYjJSNUxtZHlMQ0J3WldGckxrZ3pTekkzWVdNcFhHNWNiaU1nUTNKbFlYUmxJR0VnYkdsemRDQnRZWEJ3YVc1bklHVmhZMmdnWjJWdVpTQjBieUIwYUdVZ2FXNWthV05sY3lCdlppQndaV0ZyY3lCdmRtVnliR0Z3Y0dsdVp5QjNhWFJvSUdsMGN5Qm5aVzVsSUdKdlpIbGNibTkyWlhKc1lYQndhVzVuWDNCbFlXdHpYM0JsY2w5blpXNWxJRHd0SUhOd2JHbDBLSE4xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1N3Z2NYVmxjbmxJYVhSektHOTJaWEpzWVhCektTbGNibHh1SXlCSmJtbDBhV0ZzYVhwbElHRnVJR1Z0Y0hSNUlHeHBjM1FnZEc4Z2MzUnZjbVVnY21WemRXeDBjMXh1Y21WemRXeDBjMTlzYVhOMElEd3RJSFpsWTNSdmNpaGNJbXhwYzNSY0lpd2diR1Z1WjNSb0tHZGxibVZ6TG1keUtTbGNibHh1SXlCVGRHVndJREk2SUVadmNpQmxZV05vSUdkbGJtVXNJR1Y0WTJ4MVpHVWdiM1psY214aGNIQnBibWNnY0dWaGEzTWdZVzVrSUdacGJtUWdkR2hsSUc1bFlYSmxjM1FnY0dWaGF5QjBieUJwZEhNZ1ZGTlRYRzVtYjNJZ0tHa2dhVzRnYzJWeFgyRnNiMjVuS0dkbGJtVnpMbWR5S1NrZ2UxeHVJQ0JuWlc1bElEd3RJR2RsYm1WekxtZHlXMmxkWEc0Z0lGeHVJQ0FqSUVkbGRDQnBibVJwWTJWeklHOW1JSEJsWVd0eklHOTJaWEpzWVhCd2FXNW5JSGRwZEdnZ2RHaHBjeUJuWlc1bEozTWdZbTlrZVZ4dUlDQnZkbVZ5YkdGd2NHbHVaMTl3WldGclgybHVaR2xqWlhNZ1BDMGdiM1psY214aGNIQnBibWRmY0dWaGEzTmZjR1Z5WDJkbGJtVmJXMkZ6TG1Ob1lYSmhZM1JsY2locEtWMWRYRzRnSUZ4dUlDQWpJRVY0WTJ4MVpHVWdiM1psY214aGNIQnBibWNnY0dWaGEzTWdabTl5SUhSb2FYTWdaMlZ1WlZ4dUlDQnBaaUFvSVdsekxtNTFiR3dvYjNabGNteGhjSEJwYm1kZmNHVmhhMTlwYm1ScFkyVnpLU2tnZTF4dUlDQWdJSEJsWVd0elgzUnZYMk52Ym5OcFpHVnlJRHd0SUhCbFlXc3VTRE5MTWpkaFkxc3RiM1psY214aGNIQnBibWRmY0dWaGExOXBibVJwWTJWelhWeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lIQmxZV3R6WDNSdlgyTnZibk5wWkdWeUlEd3RJSEJsWVdzdVNETkxNamRoWTF4dUlDQjlYRzRnSUZ4dUlDQWpJRVpwYm1RZ2RHaGxJRzVsWVhKbGMzUWdjR1ZoYXlCMGJ5QjBhR1VnVkZOVElHOW1JSFJvYVhNZ1oyVnVaVnh1SUNCdVpXRnlaWE4wWDNCbFlXdGZhVzVrWlhnZ1BDMGdibVZoY21WemRDaG5aVzVsTENCd1pXRnJjMTkwYjE5amIyNXphV1JsY2lsY2JpQWdYRzRnSUdsbUlDaHBjeTV1WVNodVpXRnlaWE4wWDNCbFlXdGZhVzVrWlhncEtTQjdYRzRnSUNBZ0l5Qk9ieUJ3WldGcmN5Qm1iM1Z1WkRzZ2MyVjBJRTVCSUhaaGJIVmxjMXh1SUNBZ0lISmxjM1ZzZEhOZmJHbHpkRnRiYVYxZElEd3RJR1JoZEdFdVpuSmhiV1VvWEc0Z0lDQWdJQ0JsYm5ObGJXSnNJRDBnYldOdmJITW9aMlZ1WlNra1pXNXpaVzFpYkN4Y2JpQWdJQ0FnSUdkbGJtVmZZMmh5SUQwZ1lYTXVZMmhoY21GamRHVnlLSE5sY1c1aGJXVnpLR2RsYm1VcEtTeGNiaUFnSUNBZ0lHZGxibVZmVkZOVElEMGdjM1JoY25Rb1oyVnVaU2tzWEc0Z0lDQWdJQ0J3WldGclgyTm9jaUE5SUU1QkxGeHVJQ0FnSUNBZ2NHVmhhMTl6ZEdGeWRDQTlJRTVCTEZ4dUlDQWdJQ0FnY0dWaGExOWxibVFnUFNCT1FTeGNiaUFnSUNBZ0lHUnBjM1JoYm1ObElEMGdUa0ZjYmlBZ0lDQXBYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdibVZoY21WemRGOXdaV0ZySUR3dElIQmxZV3R6WDNSdlgyTnZibk5wWkdWeVcyNWxZWEpsYzNSZmNHVmhhMTlwYm1SbGVGMWNiaUFnSUNCa2FYTjBJRHd0SUdScGMzUmhibU5sS0dkbGJtVXNJRzVsWVhKbGMzUmZjR1ZoYXlsY2JpQWdJQ0JjYmlBZ0lDQnlaWE4xYkhSelgyeHBjM1JiVzJsZFhTQThMU0JrWVhSaExtWnlZVzFsS0Z4dUlDQWdJQ0FnWlc1elpXMWliQ0E5SUcxamIyeHpLR2RsYm1VcEpHVnVjMlZ0WW13c1hHNGdJQ0FnSUNCblpXNWxYMk5vY2lBOUlHRnpMbU5vWVhKaFkzUmxjaWh6WlhGdVlXMWxjeWhuWlc1bEtTa3NYRzRnSUNBZ0lDQm5aVzVsWDFSVFV5QTlJSE4wWVhKMEtHZGxibVVwTEZ4dUlDQWdJQ0FnY0dWaGExOWphSElnUFNCaGN5NWphR0Z5WVdOMFpYSW9jMlZ4Ym1GdFpYTW9ibVZoY21WemRGOXdaV0ZyS1Nrc1hHNGdJQ0FnSUNCd1pXRnJYM04wWVhKMElEMGdjM1JoY25Rb2JtVmhjbVZ6ZEY5d1pXRnJLU3hjYmlBZ0lDQWdJSEJsWVd0ZlpXNWtJRDBnWlc1a0tHNWxZWEpsYzNSZmNHVmhheWtzWEc0Z0lDQWdJQ0JrYVhOMFlXNWpaU0E5SUdScGMzUmNiaUFnSUNBcFhHNGdJSDFjYm4xY2JseHVJeUJEYjIxaWFXNWxJSEpsYzNWc2RITWdhVzUwYnlCaElITnBibWRzWlNCa1lYUmhJR1p5WVcxbFhHNXlaWE4xYkhSeklEd3RJR1J2TG1OaGJHd29jbUpwYm1Rc0lISmxjM1ZzZEhOZmJHbHpkQ2xjYmx4dUl5QkJaR1FnWjNKdmRYQWdhVzVtYjNKdFlYUnBiMjVjYm5KbGMzVnNkSE1nUEMwZ2NtVnpkV3gwY3lBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUdOaGMyVmZkMmhsYmloY2JpQWdaVzV6WlcxaWJDQWxhVzRsSUdkeWIzVndNU0IrSUZ3aVozSnZkWEF4WENJc1hHNGdJR1Z1YzJWdFltd2dKV2x1SlNCbmNtOTFjRElnZmlCY0ltZHliM1Z3TWx3aUxGeHVJQ0JVVWxWRklINGdUa0ZmWTJoaGNtRmpkR1Z5WDF4dUtTbGNibHh1WjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGdJR1JwYzNSaGJtTmxNU0E4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JuY205MWNERXBJQ2trWkdsemRHRnVZMlZjYmlBZ1pHbHpkR0Z1WTJVeUlEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlHZHliM1Z3TWlrZ0tTUmthWE4wWVc1alpWeHVJQ0IzYVd3Z1BDMGdkMmxzWTI5NExuUmxjM1FvWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcFhHNGdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYm4xY2JseHVaMlYwVUhaaGJGZHBiR052ZUNoeVpYTjFiSFJ6TENCY0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLVnh1SXlCUWJHOTBkR2x1WjF4dVoyZHdiRzkwS0hKbGMzVnNkSE1zSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCa2FYTjBZVzVqWlN3Z1ptbHNiQ0E5SUdkeWIzVndLU2tnSzF4dUlDQm5aVzl0WDNacGIyeHBiaWdwSUN0Y2JpQWdaMlZ2YlY5aWIzaHdiRzkwS0c5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVN3Z2QybGtkR2dnUFNBd0xqRXNJR1pwYkd3Z1BTQmNJbmRvYVhSbFhDSXBJQ3RjYmlBZ2RHaGxiV1ZmWW5jb0tTQXJYRzRnSUdkbmRHbDBiR1VvWENKRWFYTjBZVzVqWlNCMGJ5Qk9aV0Z5WlhOMElFZ3pTekkzWVdNZ1VHVmhheUJGZUdOc2RXUnBibWNnUjJWdVpTQkNiMlI1SUU5MlpYSnNZWEJ6WENJcElDdGNiaUFnYzJOaGJHVmZlVjlqYjI1MGFXNTFiM1Z6S0d4aFltVnNjeUE5SUd4aFltVnNYMnRpWDIxaUtTQXJYRzRnSUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWd3TENBMU1DQXFJREV3TURBcEtTQXJYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0JuY205MWNDa3NJR1oxYmlBOUlHMWxZVzRzSUdkbGIyMGdQU0JjSW5CdmFXNTBYQ0lzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBeUxDQm1hV3hzSUQwZ1hDSnlaV1JjSWl3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJcElGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLCBlbnNlbWJsID0gVjYsIGNociA9IFYxKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsLCBjaHIsIFRTUykgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGMoZ3JvdXAxLCBncm91cDIpKVxuZ2VuZXMuZ3IgPC0gR1JhbmdlcyhcbiAgc2VxbmFtZXMgPSBnZW5lLnRiJGNocixcbiAgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGdlbmUudGIkVFNTLCBlbmQgPSBnZW5lLnRiJFRTUyksXG4gIGVuc2VtYmwgPSBnZW5lLnRiJGVuc2VtYmxcbilcblxuZ2VuZWJvZHkudGIgPC0gZ2VuZS50YiAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IFRTUy0xMCoxMDAwLCBlbmQgPSBUU1MgKyAxMCoxMDAwKSAlPiVcbiAgZHBseXI6OnNlbGVjdChjaHIsIHN0YXJ0LCBlbmQpXG5nZW5lYm9keS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZWJvZHkudGIpXG5cbnBlYWsuSDNLMjdhYyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5uYXJyb3dQZWFrLmJlZFxcKSlcblxuXG4jIFN0ZXAgMTogRmluZCBvdmVybGFwcyBiZXR3ZWVuIGdlbmUgYm9kaWVzIGFuZCBwZWFrc1xub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGdlbmVib2R5LmdyLCBwZWFrLkgzSzI3YWMpXG5cbiMgQ3JlYXRlIGEgbGlzdCBtYXBwaW5nIGVhY2ggZ2VuZSB0byB0aGUgaW5kaWNlcyBvZiBwZWFrcyBvdmVybGFwcGluZyB3aXRoIGl0cyBnZW5lIGJvZHlcbm92ZXJsYXBwaW5nX3BlYWtzX3Blcl9nZW5lIDwtIHNwbGl0KHN1YmplY3RIaXRzKG92ZXJsYXBzKSwgcXVlcnlIaXRzKG92ZXJsYXBzKSlcblxuIyBJbml0aWFsaXplIGFuIGVtcHR5IGxpc3QgdG8gc3RvcmUgcmVzdWx0c1xucmVzdWx0c19saXN0IDwtIHZlY3RvcihcXGxpc3RcXCwgbGVuZ3RoKGdlbmVzLmdyKSlcblxuIyBTdGVwIDI6IEZvciBlYWNoIGdlbmUsIGV4Y2x1ZGUgb3ZlcmxhcHBpbmcgcGVha3MgYW5kIGZpbmQgdGhlIG5lYXJlc3QgcGVhayB0byBpdHMgVFNTXG5mb3IgKGkgaW4gc2VxX2Fsb25nKGdlbmVzLmdyKSkge1xuICBnZW5lIDwtIGdlbmVzLmdyW2ldXG4gIFxuICAjIEdldCBpbmRpY2VzIG9mIHBlYWtzIG92ZXJsYXBwaW5nIHdpdGggdGhpcyBnZW5lJ3MgYm9keVxuICBvdmVybGFwcGluZ19wZWFrX2luZGljZXMgPC0gb3ZlcmxhcHBpbmdfcGVha3NfcGVyX2dlbmVbW2FzLmNoYXJhY3RlcihpKV1dXG4gIFxuICAjIEV4Y2x1ZGUgb3ZlcmxhcHBpbmcgcGVha3MgZm9yIHRoaXMgZ2VuZVxuICBpZiAoIWlzLm51bGwob3ZlcmxhcHBpbmdfcGVha19pbmRpY2VzKSkge1xuICAgIHBlYWtzX3RvX2NvbnNpZGVyIDwtIHBlYWsuSDNLMjdhY1stb3ZlcmxhcHBpbmdfcGVha19pbmRpY2VzXVxuICB9IGVsc2Uge1xuICAgIHBlYWtzX3RvX2NvbnNpZGVyIDwtIHBlYWsuSDNLMjdhY1xuICB9XG4gIFxuICAjIEZpbmQgdGhlIG5lYXJlc3QgcGVhayB0byB0aGUgVFNTIG9mIHRoaXMgZ2VuZVxuICBuZWFyZXN0X3BlYWtfaW5kZXggPC0gbmVhcmVzdChnZW5lLCBwZWFrc190b19jb25zaWRlcilcbiAgXG4gIGlmIChpcy5uYShuZWFyZXN0X3BlYWtfaW5kZXgpKSB7XG4gICAgIyBObyBwZWFrcyBmb3VuZDsgc2V0IE5BIHZhbHVlc1xuICAgIHJlc3VsdHNfbGlzdFtbaV1dIDwtIGRhdGEuZnJhbWUoXG4gICAgICBlbnNlbWJsID0gbWNvbHMoZ2VuZSkkZW5zZW1ibCxcbiAgICAgIGdlbmVfY2hyID0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKGdlbmUpKSxcbiAgICAgIGdlbmVfVFNTID0gc3RhcnQoZ2VuZSksXG4gICAgICBwZWFrX2NociA9IE5BLFxuICAgICAgcGVha19zdGFydCA9IE5BLFxuICAgICAgcGVha19lbmQgPSBOQSxcbiAgICAgIGRpc3RhbmNlID0gTkFcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgbmVhcmVzdF9wZWFrIDwtIHBlYWtzX3RvX2NvbnNpZGVyW25lYXJlc3RfcGVha19pbmRleF1cbiAgICBkaXN0IDwtIGRpc3RhbmNlKGdlbmUsIG5lYXJlc3RfcGVhaylcbiAgICBcbiAgICByZXN1bHRzX2xpc3RbW2ldXSA8LSBkYXRhLmZyYW1lKFxuICAgICAgZW5zZW1ibCA9IG1jb2xzKGdlbmUpJGVuc2VtYmwsXG4gICAgICBnZW5lX2NociA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhnZW5lKSksXG4gICAgICBnZW5lX1RTUyA9IHN0YXJ0KGdlbmUpLFxuICAgICAgcGVha19jaHIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMobmVhcmVzdF9wZWFrKSksXG4gICAgICBwZWFrX3N0YXJ0ID0gc3RhcnQobmVhcmVzdF9wZWFrKSxcbiAgICAgIHBlYWtfZW5kID0gZW5kKG5lYXJlc3RfcGVhayksXG4gICAgICBkaXN0YW5jZSA9IGRpc3RcbiAgICApXG4gIH1cbn1cblxuIyBDb21iaW5lIHJlc3VsdHMgaW50byBhIHNpbmdsZSBkYXRhIGZyYW1lXG5yZXN1bHRzIDwtIGRvLmNhbGwocmJpbmQsIHJlc3VsdHNfbGlzdClcblxuIyBBZGQgZ3JvdXAgaW5mb3JtYXRpb25cbnJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihcbiAgZW5zZW1ibCAlaW4lIGdyb3VwMSB+IFxcZ3JvdXAxXFwsXG4gIGVuc2VtYmwgJWluJSBncm91cDIgfiBcXGdyb3VwMlxcLFxuICBUUlVFIH4gTkFfY2hhcmFjdGVyX1xuKSlcblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZGlzdGFuY2VcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRkaXN0YW5jZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuZ2V0UHZhbFdpbGNveChyZXN1bHRzLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKVxuIyBQbG90dGluZ1xuZ2dwbG90KHJlc3VsdHMsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaXN0YW5jZSwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX3Zpb2xpbigpICtcbiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjEsIGZpbGwgPSBcXHdoaXRlXFwpICtcbiAgdGhlbWVfYncoKSArXG4gIGdndGl0bGUoXFxEaXN0YW5jZSB0byBOZWFyZXN0IEgzSzI3YWMgUGVhayBFeGNsdWRpbmcgR2VuZSBCb2R5IE92ZXJsYXBzXFwpICtcbiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA1MCAqIDEwMDApKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpIFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3), ensembl = V6, chr = V1) %>%
  dplyr::select(ensembl, chr, TSS) %>% dplyr::filter(ensembl %in% c(group1, group2))
genes.gr <- GRanges(
  seqnames = gene.tb$chr,
  ranges = IRanges(start = gene.tb$TSS, end = gene.tb$TSS),
  ensembl = gene.tb$ensembl
)

genebody.tb <- gene.tb %>% dplyr::mutate(start = TSS-10*1000, end = TSS + 10*1000) %>%
  dplyr::select(chr, start, end)
genebody.gr <- makeGRangesFromDataFrame(genebody.tb)

peak.H3K27ac <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))


# Step 1: Find overlaps between gene bodies and peaks
overlaps <- findOverlaps(genebody.gr, peak.H3K27ac)

# Create a list mapping each gene to the indices of peaks overlapping with its gene body
overlapping_peaks_per_gene <- split(subjectHits(overlaps), queryHits(overlaps))

# Initialize an empty list to store results
results_list <- vector(\list\, length(genes.gr))

# Step 2: For each gene, exclude overlapping peaks and find the nearest peak to its TSS
for (i in seq_along(genes.gr)) {
  gene <- genes.gr[i]
  
  # Get indices of peaks overlapping with this gene's body
  overlapping_peak_indices <- overlapping_peaks_per_gene[[as.character(i)]]
  
  # Exclude overlapping peaks for this gene
  if (!is.null(overlapping_peak_indices)) {
    peaks_to_consider <- peak.H3K27ac[-overlapping_peak_indices]
  } else {
    peaks_to_consider <- peak.H3K27ac
  }
  
  # Find the nearest peak to the TSS of this gene
  nearest_peak_index <- nearest(gene, peaks_to_consider)
  
  if (is.na(nearest_peak_index)) {
    # No peaks found; set NA values
    results_list[[i]] <- data.frame(
      ensembl = mcols(gene)$ensembl,
      gene_chr = as.character(seqnames(gene)),
      gene_TSS = start(gene),
      peak_chr = NA,
      peak_start = NA,
      peak_end = NA,
      distance = NA
    )
  } else {
    nearest_peak <- peaks_to_consider[nearest_peak_index]
    dist <- distance(gene, nearest_peak)
    
    results_list[[i]] <- data.frame(
      ensembl = mcols(gene)$ensembl,
      gene_chr = as.character(seqnames(gene)),
      gene_TSS = start(gene),
      peak_chr = as.character(seqnames(nearest_peak)),
      peak_start = start(nearest_peak),
      peak_end = end(nearest_peak),
      distance = dist
    )
  }
}

# Combine results into a single data frame
results <- do.call(rbind, results_list)

# Add group information
results <- results %>% dplyr::mutate(group = case_when(
  ensembl %in% group1 ~ \group1\,
  ensembl %in% group2 ~ \group2\,
  TRUE ~ NA_character_
))

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$distance
  distance2 <- (data %>% dplyr::filter(group == group2) )$distance
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

getPvalWilcox(results, \group1\, \group2\)
# Plotting
ggplot(results, aes(x = group, y = distance, fill = group)) +
  geom_violin() +
  geom_boxplot(outlier.shape = NA, width = 0.1, fill = \white\) +
  theme_bw() +
  ggtitle(\Distance to Nearest H3K27ac Peak Excluding Gene Body Overlaps\) +
  scale_y_continuous(labels = label_kb_mb) +
  coord_cartesian(ylim = c(0, 50 * 1000)) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) 



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNERXVkSE4yWEZ3cEtTUm5aVzVsWEc1bmNtOTFjRElnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJKcGJtRnllVWR5YjNWd01pNTBjM1pjWENrcEpHZGxibVZjYmx4dVhHNW5aVzVsTG5SaUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEcxdE1UQmZSMUpEYlRNNExuQTJYMmRsYm1WZmMyOXlkR1ZrTG1KbFpGeGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ZGTlRJRDBnYVdabGJITmxLRlkwSUQwOUlGeGNLMXhjTENCV01pd2dWak1wTENCbGJuTmxiV0pzSUQwZ1ZqWXNJR05vY2lBOUlGWXhLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobGJuTmxiV0pzTENCamFISXNJRlJUVXlrZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1pXNXpaVzFpYkNBbGFXNGxJR01vWjNKdmRYQXhMQ0JuY205MWNESXBLVnh1WjJWdVpYTXVaM0lnUEMwZ1IxSmhibWRsY3loY2JpQWdjMlZ4Ym1GdFpYTWdQU0JuWlc1bExuUmlKR05vY2l4Y2JpQWdjbUZ1WjJWeklEMGdTVkpoYm1kbGN5aHpkR0Z5ZENBOUlHZGxibVV1ZEdJa1ZGTlRMQ0JsYm1RZ1BTQm5aVzVsTG5SaUpGUlRVeWtzWEc0Z0lHVnVjMlZ0WW13Z1BTQm5aVzVsTG5SaUpHVnVjMlZ0WW14Y2JpbGNibHh1WjJWdVpXSnZaSGt1ZEdJZ1BDMGdaMlZ1WlM1MFlpQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaHpkR0Z5ZENBOUlGUlRVeTB4TUNveE1EQXdMQ0JsYm1RZ1BTQlVVMU1nS3lBeE1Db3hNREF3S1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGphSElzSUhOMFlYSjBMQ0JsYm1RcFhHNW5aVzVsWW05a2VTNW5jaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvWjJWdVpXSnZaSGt1ZEdJcFhHNWNibkJsWVdzdVNETkxNamRoWXlBOExTQnBiWEJ2Y25SUVpXRnJLR2hsY21Vb2NtVm1SR2x5TENCY1hFZFRUVEkwTXpnME56WmZSVU10UkVjdE16UTFPQzFJTTBzeU4wRkRYMEZUV1U1Zk1TNXVZWEp5YjNkUVpXRnJMbUpsWkZ4Y0tTbGNibHh1WEc0aklGTjBaWEFnTVRvZ1JtbHVaQ0J2ZG1WeWJHRndjeUJpWlhSM1pXVnVJR2RsYm1VZ1ltOWthV1Z6SUdGdVpDQndaV0ZyYzF4dWIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dkbGJtVmliMlI1TG1keUxDQndaV0ZyTGtnelN6STNZV01wWEc1Y2JpTWdRM0psWVhSbElHRWdiR2x6ZENCdFlYQndhVzVuSUdWaFkyZ2daMlZ1WlNCMGJ5QjBhR1VnYVc1a2FXTmxjeUJ2WmlCd1pXRnJjeUJ2ZG1WeWJHRndjR2x1WnlCM2FYUm9JR2wwY3lCblpXNWxJR0p2WkhsY2JtOTJaWEpzWVhCd2FXNW5YM0JsWVd0elgzQmxjbDluWlc1bElEd3RJSE53YkdsMEtITjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLU3dnY1hWbGNubElhWFJ6S0c5MlpYSnNZWEJ6S1NsY2JseHVJeUJKYm1sMGFXRnNhWHBsSUdGdUlHVnRjSFI1SUd4cGMzUWdkRzhnYzNSdmNtVWdjbVZ6ZFd4MGMxeHVjbVZ6ZFd4MGMxOXNhWE4wSUR3dElIWmxZM1J2Y2loY1hHeHBjM1JjWEN3Z2JHVnVaM1JvS0dkbGJtVnpMbWR5S1NsY2JseHVJeUJUZEdWd0lESTZJRVp2Y2lCbFlXTm9JR2RsYm1Vc0lHVjRZMngxWkdVZ2IzWmxjbXhoY0hCcGJtY2djR1ZoYTNNZ1lXNWtJR1pwYm1RZ2RHaGxJRzVsWVhKbGMzUWdjR1ZoYXlCMGJ5QnBkSE1nVkZOVFhHNW1iM0lnS0drZ2FXNGdjMlZ4WDJGc2IyNW5LR2RsYm1WekxtZHlLU2tnZTF4dUlDQm5aVzVsSUR3dElHZGxibVZ6TG1keVcybGRYRzRnSUZ4dUlDQWpJRWRsZENCcGJtUnBZMlZ6SUc5bUlIQmxZV3R6SUc5MlpYSnNZWEJ3YVc1bklIZHBkR2dnZEdocGN5Qm5aVzVsSjNNZ1ltOWtlVnh1SUNCdmRtVnliR0Z3Y0dsdVoxOXdaV0ZyWDJsdVpHbGpaWE1nUEMwZ2IzWmxjbXhoY0hCcGJtZGZjR1ZoYTNOZmNHVnlYMmRsYm1WYlcyRnpMbU5vWVhKaFkzUmxjaWhwS1YxZFhHNGdJRnh1SUNBaklFVjRZMngxWkdVZ2IzWmxjbXhoY0hCcGJtY2djR1ZoYTNNZ1ptOXlJSFJvYVhNZ1oyVnVaVnh1SUNCcFppQW9JV2x6TG01MWJHd29iM1psY214aGNIQnBibWRmY0dWaGExOXBibVJwWTJWektTa2dlMXh1SUNBZ0lIQmxZV3R6WDNSdlgyTnZibk5wWkdWeUlEd3RJSEJsWVdzdVNETkxNamRoWTFzdGIzWmxjbXhoY0hCcGJtZGZjR1ZoYTE5cGJtUnBZMlZ6WFZ4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUhCbFlXdHpYM1J2WDJOdmJuTnBaR1Z5SUR3dElIQmxZV3N1U0ROTE1qZGhZMXh1SUNCOVhHNGdJRnh1SUNBaklFWnBibVFnZEdobElHNWxZWEpsYzNRZ2NHVmhheUIwYnlCMGFHVWdWRk5USUc5bUlIUm9hWE1nWjJWdVpWeHVJQ0J1WldGeVpYTjBYM0JsWVd0ZmFXNWtaWGdnUEMwZ2JtVmhjbVZ6ZENoblpXNWxMQ0J3WldGcmMxOTBiMTlqYjI1emFXUmxjaWxjYmlBZ1hHNGdJR2xtSUNocGN5NXVZU2h1WldGeVpYTjBYM0JsWVd0ZmFXNWtaWGdwS1NCN1hHNGdJQ0FnSXlCT2J5QndaV0ZyY3lCbWIzVnVaRHNnYzJWMElFNUJJSFpoYkhWbGMxeHVJQ0FnSUhKbGMzVnNkSE5mYkdsemRGdGJhVjFkSUR3dElHUmhkR0V1Wm5KaGJXVW9YRzRnSUNBZ0lDQmxibk5sYldKc0lEMGdiV052YkhNb1oyVnVaU2trWlc1elpXMWliQ3hjYmlBZ0lDQWdJR2RsYm1WZlkyaHlJRDBnWVhNdVkyaGhjbUZqZEdWeUtITmxjVzVoYldWektHZGxibVVwS1N4Y2JpQWdJQ0FnSUdkbGJtVmZWRk5USUQwZ2MzUmhjblFvWjJWdVpTa3NYRzRnSUNBZ0lDQndaV0ZyWDJOb2NpQTlJRTVCTEZ4dUlDQWdJQ0FnY0dWaGExOXpkR0Z5ZENBOUlFNUJMRnh1SUNBZ0lDQWdjR1ZoYTE5bGJtUWdQU0JPUVN4Y2JpQWdJQ0FnSUdScGMzUmhibU5sSUQwZ1RrRmNiaUFnSUNBcFhHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2JtVmhjbVZ6ZEY5d1pXRnJJRHd0SUhCbFlXdHpYM1J2WDJOdmJuTnBaR1Z5VzI1bFlYSmxjM1JmY0dWaGExOXBibVJsZUYxY2JpQWdJQ0JrYVhOMElEd3RJR1JwYzNSaGJtTmxLR2RsYm1Vc0lHNWxZWEpsYzNSZmNHVmhheWxjYmlBZ0lDQmNiaUFnSUNCeVpYTjFiSFJ6WDJ4cGMzUmJXMmxkWFNBOExTQmtZWFJoTG1aeVlXMWxLRnh1SUNBZ0lDQWdaVzV6WlcxaWJDQTlJRzFqYjJ4ektHZGxibVVwSkdWdWMyVnRZbXdzWEc0Z0lDQWdJQ0JuWlc1bFgyTm9jaUE5SUdGekxtTm9ZWEpoWTNSbGNpaHpaWEZ1WVcxbGN5aG5aVzVsS1Nrc1hHNGdJQ0FnSUNCblpXNWxYMVJUVXlBOUlITjBZWEowS0dkbGJtVXBMRnh1SUNBZ0lDQWdjR1ZoYTE5amFISWdQU0JoY3k1amFHRnlZV04wWlhJb2MyVnhibUZ0WlhNb2JtVmhjbVZ6ZEY5d1pXRnJLU2tzWEc0Z0lDQWdJQ0J3WldGclgzTjBZWEowSUQwZ2MzUmhjblFvYm1WaGNtVnpkRjl3WldGcktTeGNiaUFnSUNBZ0lIQmxZV3RmWlc1a0lEMGdaVzVrS0c1bFlYSmxjM1JmY0dWaGF5a3NYRzRnSUNBZ0lDQmthWE4wWVc1alpTQTlJR1JwYzNSY2JpQWdJQ0FwWEc0Z0lIMWNibjFjYmx4dUl5QkRiMjFpYVc1bElISmxjM1ZzZEhNZ2FXNTBieUJoSUhOcGJtZHNaU0JrWVhSaElHWnlZVzFsWEc1eVpYTjFiSFJ6SUR3dElHUnZMbU5oYkd3b2NtSnBibVFzSUhKbGMzVnNkSE5mYkdsemRDbGNibHh1SXlCQlpHUWdaM0p2ZFhBZ2FXNW1iM0p0WVhScGIyNWNibkpsYzNWc2RITWdQQzBnY21WemRXeDBjeUFsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJR05oYzJWZmQyaGxiaWhjYmlBZ1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd01TQitJRnhjWjNKdmRYQXhYRndzWEc0Z0lHVnVjMlZ0WW13Z0pXbHVKU0JuY205MWNESWdmaUJjWEdkeWIzVndNbHhjTEZ4dUlDQlVVbFZGSUg0Z1RrRmZZMmhoY21GamRHVnlYMXh1S1NsY2JseHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQm5jbTkxY0RFcElDa2taR2x6ZEdGdVkyVmNiaUFnWkdsemRHRnVZMlV5SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SUdkeWIzVndNaWtnS1NSa2FYTjBZVzVqWlZ4dUlDQjNhV3dnUEMwZ2QybHNZMjk0TG5SbGMzUW9aR2x6ZEdGdVkyVXhMQ0JrYVhOMFlXNWpaVElwWEc0Z0lISmxkSFZ5YmloM2FXd2tjQzUyWVd4MVpTbGNibjFjYmx4dVoyVjBVSFpoYkZkcGJHTnZlQ2h5WlhOMWJIUnpMQ0JjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tWeHVJeUJRYkc5MGRHbHVaMXh1WjJkd2JHOTBLSEpsYzNWc2RITXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JrYVhOMFlXNWpaU3dnWm1sc2JDQTlJR2R5YjNWd0tTa2dLMXh1SUNCblpXOXRYM1pwYjJ4cGJpZ3BJQ3RjYmlBZ1oyVnZiVjlpYjNod2JHOTBLRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU3dnZDJsa2RHZ2dQU0F3TGpFc0lHWnBiR3dnUFNCY1hIZG9hWFJsWEZ3cElDdGNiaUFnZEdobGJXVmZZbmNvS1NBclhHNGdJR2RuZEdsMGJHVW9YRnhFYVhOMFlXNWpaU0IwYnlCT1pXRnlaWE4wSUVnelN6STNZV01nVUdWaGF5QkZlR05zZFdScGJtY2dSMlZ1WlNCQ2IyUjVJRTkyWlhKc1lYQnpYRndwSUN0Y2JpQWdjMk5oYkdWZmVWOWpiMjUwYVc1MWIzVnpLR3hoWW1Wc2N5QTlJR3hoWW1Wc1gydGlYMjFpS1NBclhHNGdJR052YjNKa1gyTmhjblJsYzJsaGJpaDViR2x0SUQwZ1l5Z3dMQ0ExTUNBcUlERXdNREFwS1NBclhHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNYSEJ2YVc1MFhGd3NJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWEZ4eVpXUmNYQ3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndwSUZ4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cblxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSwgZW5zZW1ibCA9IFY2LCBjaHIgPSBWMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibCwgY2hyLCBUU1MpICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmwgJWluJSBjKGdyb3VwMSwgZ3JvdXAyKSlcbmdlbmVzLmdyIDwtIEdSYW5nZXMoXG4gIHNlcW5hbWVzID0gZ2VuZS50YiRjaHIsXG4gIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBnZW5lLnRiJFRTUywgZW5kID0gZ2VuZS50YiRUU1MpLFxuICBlbnNlbWJsID0gZ2VuZS50YiRlbnNlbWJsXG4pXG5cbmdlbmVib2R5LnRiIDwtIGdlbmUudGIgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBUU1MtMTAqMTAwMCwgZW5kID0gVFNTICsgMTAqMTAwMCkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kKVxuZ2VuZWJvZHkuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmVib2R5LnRiKVxuXG5wZWFrLkgzSzI3YWMgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWRcXCkpXG5cblxuIyBTdGVwIDE6IEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBnZW5lIGJvZGllcyBhbmQgcGVha3Ncbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhnZW5lYm9keS5nciwgcGVhay5IM0syN2FjKVxuXG4jIENyZWF0ZSBhIGxpc3QgbWFwcGluZyBlYWNoIGdlbmUgdG8gdGhlIGluZGljZXMgb2YgcGVha3Mgb3ZlcmxhcHBpbmcgd2l0aCBpdHMgZ2VuZSBib2R5XG5vdmVybGFwcGluZ19wZWFrc19wZXJfZ2VuZSA8LSBzcGxpdChzdWJqZWN0SGl0cyhvdmVybGFwcyksIHF1ZXJ5SGl0cyhvdmVybGFwcykpXG5cbiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSBsaXN0IHRvIHN0b3JlIHJlc3VsdHNcbnJlc3VsdHNfbGlzdCA8LSB2ZWN0b3IoXFxsaXN0XFwsIGxlbmd0aChnZW5lcy5ncikpXG5cbiMgU3RlcCAyOiBGb3IgZWFjaCBnZW5lLCBleGNsdWRlIG92ZXJsYXBwaW5nIHBlYWtzIGFuZCBmaW5kIHRoZSBuZWFyZXN0IHBlYWsgdG8gaXRzIFRTU1xuZm9yIChpIGluIHNlcV9hbG9uZyhnZW5lcy5ncikpIHtcbiAgZ2VuZSA8LSBnZW5lcy5ncltpXVxuICBcbiAgIyBHZXQgaW5kaWNlcyBvZiBwZWFrcyBvdmVybGFwcGluZyB3aXRoIHRoaXMgZ2VuZSdzIGJvZHlcbiAgb3ZlcmxhcHBpbmdfcGVha19pbmRpY2VzIDwtIG92ZXJsYXBwaW5nX3BlYWtzX3Blcl9nZW5lW1thcy5jaGFyYWN0ZXIoaSldXVxuICBcbiAgIyBFeGNsdWRlIG92ZXJsYXBwaW5nIHBlYWtzIGZvciB0aGlzIGdlbmVcbiAgaWYgKCFpcy5udWxsKG92ZXJsYXBwaW5nX3BlYWtfaW5kaWNlcykpIHtcbiAgICBwZWFrc190b19jb25zaWRlciA8LSBwZWFrLkgzSzI3YWNbLW92ZXJsYXBwaW5nX3BlYWtfaW5kaWNlc11cbiAgfSBlbHNlIHtcbiAgICBwZWFrc190b19jb25zaWRlciA8LSBwZWFrLkgzSzI3YWNcbiAgfVxuICBcbiAgIyBGaW5kIHRoZSBuZWFyZXN0IHBlYWsgdG8gdGhlIFRTUyBvZiB0aGlzIGdlbmVcbiAgbmVhcmVzdF9wZWFrX2luZGV4IDwtIG5lYXJlc3QoZ2VuZSwgcGVha3NfdG9fY29uc2lkZXIpXG4gIFxuICBpZiAoaXMubmEobmVhcmVzdF9wZWFrX2luZGV4KSkge1xuICAgICMgTm8gcGVha3MgZm91bmQ7IHNldCBOQSB2YWx1ZXNcbiAgICByZXN1bHRzX2xpc3RbW2ldXSA8LSBkYXRhLmZyYW1lKFxuICAgICAgZW5zZW1ibCA9IG1jb2xzKGdlbmUpJGVuc2VtYmwsXG4gICAgICBnZW5lX2NociA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhnZW5lKSksXG4gICAgICBnZW5lX1RTUyA9IHN0YXJ0KGdlbmUpLFxuICAgICAgcGVha19jaHIgPSBOQSxcbiAgICAgIHBlYWtfc3RhcnQgPSBOQSxcbiAgICAgIHBlYWtfZW5kID0gTkEsXG4gICAgICBkaXN0YW5jZSA9IE5BXG4gICAgKVxuICB9IGVsc2Uge1xuICAgIG5lYXJlc3RfcGVhayA8LSBwZWFrc190b19jb25zaWRlcltuZWFyZXN0X3BlYWtfaW5kZXhdXG4gICAgZGlzdCA8LSBkaXN0YW5jZShnZW5lLCBuZWFyZXN0X3BlYWspXG4gICAgXG4gICAgcmVzdWx0c19saXN0W1tpXV0gPC0gZGF0YS5mcmFtZShcbiAgICAgIGVuc2VtYmwgPSBtY29scyhnZW5lKSRlbnNlbWJsLFxuICAgICAgZ2VuZV9jaHIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMoZ2VuZSkpLFxuICAgICAgZ2VuZV9UU1MgPSBzdGFydChnZW5lKSxcbiAgICAgIHBlYWtfY2hyID0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKG5lYXJlc3RfcGVhaykpLFxuICAgICAgcGVha19zdGFydCA9IHN0YXJ0KG5lYXJlc3RfcGVhayksXG4gICAgICBwZWFrX2VuZCA9IGVuZChuZWFyZXN0X3BlYWspLFxuICAgICAgZGlzdGFuY2UgPSBkaXN0XG4gICAgKVxuICB9XG59XG5cbiMgQ29tYmluZSByZXN1bHRzIGludG8gYSBzaW5nbGUgZGF0YSBmcmFtZVxucmVzdWx0cyA8LSBkby5jYWxsKHJiaW5kLCByZXN1bHRzX2xpc3QpXG5cbiMgQWRkIGdyb3VwIGluZm9ybWF0aW9uXG5yZXN1bHRzIDwtIHJlc3VsdHMgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oXG4gIGVuc2VtYmwgJWluJSBncm91cDEgfiBcXGdyb3VwMVxcLFxuICBlbnNlbWJsICVpbiUgZ3JvdXAyIH4gXFxncm91cDJcXCxcbiAgVFJVRSB+IE5BX2NoYXJhY3Rlcl9cbikpXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGRpc3RhbmNlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZGlzdGFuY2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbmdldFB2YWxXaWxjb3gocmVzdWx0cywgXFxncm91cDFcXCwgXFxncm91cDJcXClcbiMgUGxvdHRpbmdcbmdncGxvdChyZXN1bHRzLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlzdGFuY2UsIGZpbGwgPSBncm91cCkpICtcbiAgZ2VvbV92aW9saW4oKSArXG4gIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4xLCBmaWxsID0gXFx3aGl0ZVxcKSArXG4gIHRoZW1lX2J3KCkgK1xuICBnZ3RpdGxlKFxcRGlzdGFuY2UgdG8gTmVhcmVzdCBIM0syN2FjIFBlYWsgRXhjbHVkaW5nIEdlbmUgQm9keSBPdmVybGFwc1xcKSArXG4gIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNTAgKiAxMDAwKSkgK1xuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSBcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLCBlbnNlbWJsID0gVjYsIGNociA9IFYxKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsLCBjaHIsIFRTUykgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGMoZ3JvdXAxLCBncm91cDIpKVxuZ2VuZXMuZ3IgPC0gR1JhbmdlcyhcbiAgc2VxbmFtZXMgPSBnZW5lLnRiJGNocixcbiAgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGdlbmUudGIkVFNTLCBlbmQgPSBnZW5lLnRiJFRTUyksXG4gIGVuc2VtYmwgPSBnZW5lLnRiJGVuc2VtYmxcbilcblxuZ2VuZWJvZHkudGIgPC0gZ2VuZS50YiAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IFRTUy0xMCoxMDAwLCBlbmQgPSBUU1MgKyAxMCoxMDAwKSAlPiVcbiAgZHBseXI6OnNlbGVjdChjaHIsIHN0YXJ0LCBlbmQpXG5nZW5lYm9keS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZWJvZHkudGIpXG5cbnBlYWsuSDNLMjdhYyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5uYXJyb3dQZWFrLmJlZFxcKSlcblxuXG4jIFN0ZXAgMTogRmluZCBvdmVybGFwcyBiZXR3ZWVuIGdlbmUgYm9kaWVzIGFuZCBwZWFrc1xub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGdlbmVib2R5LmdyLCBwZWFrLkgzSzI3YWMpXG5cbiMgQ3JlYXRlIGEgbGlzdCBtYXBwaW5nIGVhY2ggZ2VuZSB0byB0aGUgaW5kaWNlcyBvZiBwZWFrcyBvdmVybGFwcGluZyB3aXRoIGl0cyBnZW5lIGJvZHlcbm92ZXJsYXBwaW5nX3BlYWtzX3Blcl9nZW5lIDwtIHNwbGl0KHN1YmplY3RIaXRzKG92ZXJsYXBzKSwgcXVlcnlIaXRzKG92ZXJsYXBzKSlcblxuIyBJbml0aWFsaXplIGFuIGVtcHR5IGxpc3QgdG8gc3RvcmUgcmVzdWx0c1xucmVzdWx0c19saXN0IDwtIHZlY3RvcihcXGxpc3RcXCwgbGVuZ3RoKGdlbmVzLmdyKSlcblxuIyBTdGVwIDI6IEZvciBlYWNoIGdlbmUsIGV4Y2x1ZGUgb3ZlcmxhcHBpbmcgcGVha3MgYW5kIGZpbmQgdGhlIG5lYXJlc3QgcGVhayB0byBpdHMgVFNTXG5mb3IgKGkgaW4gc2VxX2Fsb25nKGdlbmVzLmdyKSkge1xuICBnZW5lIDwtIGdlbmVzLmdyW2ldXG4gIFxuICAjIEdldCBpbmRpY2VzIG9mIHBlYWtzIG92ZXJsYXBwaW5nIHdpdGggdGhpcyBnZW5lJ3MgYm9keVxuICBvdmVybGFwcGluZ19wZWFrX2luZGljZXMgPC0gb3ZlcmxhcHBpbmdfcGVha3NfcGVyX2dlbmVbW2FzLmNoYXJhY3RlcihpKV1dXG4gIFxuICAjIEV4Y2x1ZGUgb3ZlcmxhcHBpbmcgcGVha3MgZm9yIHRoaXMgZ2VuZVxuICBpZiAoIWlzLm51bGwob3ZlcmxhcHBpbmdfcGVha19pbmRpY2VzKSkge1xuICAgIHBlYWtzX3RvX2NvbnNpZGVyIDwtIHBlYWsuSDNLMjdhY1stb3ZlcmxhcHBpbmdfcGVha19pbmRpY2VzXVxuICB9IGVsc2Uge1xuICAgIHBlYWtzX3RvX2NvbnNpZGVyIDwtIHBlYWsuSDNLMjdhY1xuICB9XG4gIFxuICAjIEZpbmQgdGhlIG5lYXJlc3QgcGVhayB0byB0aGUgVFNTIG9mIHRoaXMgZ2VuZVxuICBuZWFyZXN0X3BlYWtfaW5kZXggPC0gbmVhcmVzdChnZW5lLCBwZWFrc190b19jb25zaWRlcilcbiAgXG4gIGlmIChpcy5uYShuZWFyZXN0X3BlYWtfaW5kZXgpKSB7XG4gICAgIyBObyBwZWFrcyBmb3VuZDsgc2V0IE5BIHZhbHVlc1xuICAgIHJlc3VsdHNfbGlzdFtbaV1dIDwtIGRhdGEuZnJhbWUoXG4gICAgICBlbnNlbWJsID0gbWNvbHMoZ2VuZSkkZW5zZW1ibCxcbiAgICAgIGdlbmVfY2hyID0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKGdlbmUpKSxcbiAgICAgIGdlbmVfVFNTID0gc3RhcnQoZ2VuZSksXG4gICAgICBwZWFrX2NociA9IE5BLFxuICAgICAgcGVha19zdGFydCA9IE5BLFxuICAgICAgcGVha19lbmQgPSBOQSxcbiAgICAgIGRpc3RhbmNlID0gTkFcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgbmVhcmVzdF9wZWFrIDwtIHBlYWtzX3RvX2NvbnNpZGVyW25lYXJlc3RfcGVha19pbmRleF1cbiAgICBkaXN0IDwtIGRpc3RhbmNlKGdlbmUsIG5lYXJlc3RfcGVhaylcbiAgICBcbiAgICByZXN1bHRzX2xpc3RbW2ldXSA8LSBkYXRhLmZyYW1lKFxuICAgICAgZW5zZW1ibCA9IG1jb2xzKGdlbmUpJGVuc2VtYmwsXG4gICAgICBnZW5lX2NociA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhnZW5lKSksXG4gICAgICBnZW5lX1RTUyA9IHN0YXJ0KGdlbmUpLFxuICAgICAgcGVha19jaHIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMobmVhcmVzdF9wZWFrKSksXG4gICAgICBwZWFrX3N0YXJ0ID0gc3RhcnQobmVhcmVzdF9wZWFrKSxcbiAgICAgIHBlYWtfZW5kID0gZW5kKG5lYXJlc3RfcGVhayksXG4gICAgICBkaXN0YW5jZSA9IGRpc3RcbiAgICApXG4gIH1cbn1cblxuIyBDb21iaW5lIHJlc3VsdHMgaW50byBhIHNpbmdsZSBkYXRhIGZyYW1lXG5yZXN1bHRzIDwtIGRvLmNhbGwocmJpbmQsIHJlc3VsdHNfbGlzdClcblxuIyBBZGQgZ3JvdXAgaW5mb3JtYXRpb25cbnJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihcbiAgZW5zZW1ibCAlaW4lIGdyb3VwMSB+IFxcZ3JvdXAxXFwsXG4gIGVuc2VtYmwgJWluJSBncm91cDIgfiBcXGdyb3VwMlxcLFxuICBUUlVFIH4gTkFfY2hhcmFjdGVyX1xuKSlcblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZGlzdGFuY2VcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRkaXN0YW5jZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuZ2V0UHZhbFdpbGNveChyZXN1bHRzLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKVxuIyBQbG90dGluZ1xuZ2dwbG90KHJlc3VsdHMsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaXN0YW5jZSwgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX3Zpb2xpbigpICtcbiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjEsIGZpbGwgPSBcXHdoaXRlXFwpICtcbiAgdGhlbWVfYncoKSArXG4gIGdndGl0bGUoXFxEaXN0YW5jZSB0byBOZWFyZXN0IEgzSzI3YWMgUGVhayBFeGNsdWRpbmcgR2VuZSBCb2R5IE92ZXJsYXBzXFwpICtcbiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA1MCAqIDEwMDApKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpIFxuYGBgXG5gYGAifQ== -->

```r
```r
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3), ensembl = V6, chr = V1) %>%
  dplyr::select(ensembl, chr, TSS) %>% dplyr::filter(ensembl %in% c(group1, group2))
genes.gr <- GRanges(
  seqnames = gene.tb$chr,
  ranges = IRanges(start = gene.tb$TSS, end = gene.tb$TSS),
  ensembl = gene.tb$ensembl
)

genebody.tb <- gene.tb %>% dplyr::mutate(start = TSS-10*1000, end = TSS + 10*1000) %>%
  dplyr::select(chr, start, end)
genebody.gr <- makeGRangesFromDataFrame(genebody.tb)

peak.H3K27ac <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))


# Step 1: Find overlaps between gene bodies and peaks
overlaps <- findOverlaps(genebody.gr, peak.H3K27ac)

# Create a list mapping each gene to the indices of peaks overlapping with its gene body
overlapping_peaks_per_gene <- split(subjectHits(overlaps), queryHits(overlaps))

# Initialize an empty list to store results
results_list <- vector(\list\, length(genes.gr))

# Step 2: For each gene, exclude overlapping peaks and find the nearest peak to its TSS
for (i in seq_along(genes.gr)) {
  gene <- genes.gr[i]
  
  # Get indices of peaks overlapping with this gene's body
  overlapping_peak_indices <- overlapping_peaks_per_gene[[as.character(i)]]
  
  # Exclude overlapping peaks for this gene
  if (!is.null(overlapping_peak_indices)) {
    peaks_to_consider <- peak.H3K27ac[-overlapping_peak_indices]
  } else {
    peaks_to_consider <- peak.H3K27ac
  }
  
  # Find the nearest peak to the TSS of this gene
  nearest_peak_index <- nearest(gene, peaks_to_consider)
  
  if (is.na(nearest_peak_index)) {
    # No peaks found; set NA values
    results_list[[i]] <- data.frame(
      ensembl = mcols(gene)$ensembl,
      gene_chr = as.character(seqnames(gene)),
      gene_TSS = start(gene),
      peak_chr = NA,
      peak_start = NA,
      peak_end = NA,
      distance = NA
    )
  } else {
    nearest_peak <- peaks_to_consider[nearest_peak_index]
    dist <- distance(gene, nearest_peak)
    
    results_list[[i]] <- data.frame(
      ensembl = mcols(gene)$ensembl,
      gene_chr = as.character(seqnames(gene)),
      gene_TSS = start(gene),
      peak_chr = as.character(seqnames(nearest_peak)),
      peak_start = start(nearest_peak),
      peak_end = end(nearest_peak),
      distance = dist
    )
  }
}

# Combine results into a single data frame
results <- do.call(rbind, results_list)

# Add group information
results <- results %>% dplyr::mutate(group = case_when(
  ensembl %in% group1 ~ \group1\,
  ensembl %in% group2 ~ \group2\,
  TRUE ~ NA_character_
))

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group == group1) )$distance
  distance2 <- (data %>% dplyr::filter(group == group2) )$distance
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

getPvalWilcox(results, \group1\, \group2\)
# Plotting
ggplot(results, aes(x = group, y = distance, fill = group)) +
  geom_violin() +
  geom_boxplot(outlier.shape = NA, width = 0.1, fill = \white\) +
  theme_bw() +
  ggtitle(\Distance to Nearest H3K27ac Peak Excluding Gene Body Overlaps\) +
  scale_y_continuous(labels = label_kb_mb) +
  coord_cartesian(ylim = c(0, 50 * 1000)) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) 
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### binary group - excluding all TSS +- 10kb

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzVuY205MWNERWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMkpwYm1GeWVVZHliM1Z3TVM1MGMzWmNJaWtwSkdkbGJtVmNibWR5YjNWd01pQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKblpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZZbWx1WVhKNVIzSnZkWEF5TG5SemRsd2lLU2trWjJWdVpWeHVYRzVjYmx4dWJtRnRaU0E4TFNCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY0lseHVYRzVuWlc1bFFXNXViMFJoZEdFZ1BDMGdiRzloWkV4dmIzQkJibTV2UkdGMFlTaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgzQXRjR1ZmWlc1elpXMWliRXhwYzNRdWRITjJYQ0lwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdScFptWkRkWFJ2Wm1ZZ1BTQXdMaklwSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtFRnVibTh5SUQwOUlGd2lVQzFGWENJcFhHNWNiblJsYlhBZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQjFibTVsYzNRb1oyVnVaU2xjYmx4dVoyVnVaUzUwWWlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0p0YlRFd1gwZFNRMjB6T0M1d05sOW5aVzVsWDNOdmNuUmxaQzVpWldSY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0ZSVFV5QTlJR2xtWld4elpTaFdOQ0E5UFNCY0lpdGNJaXdnVmpJc0lGWXpLU3dnWlc1elpXMWliQ0E5SUZZMkxDQmphSElnUFNCV01Ta2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWlc1elpXMWliQ3dnWTJoeUxDQlVVMU1wWEc1Y2JuUmxiWEFnUEMwZ1pIQnNlWEk2T214bFpuUmZhbTlwYmloMFpXMXdMQ0JuWlc1bExuUmlMQ0JpZVNBOUlHTW9YQ0puWlc1bFhDSWdQU0JjSW1WdWMyVnRZbXhjSWlrcFhHNWNiblJsYlhBZ1BDMGdkR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoalpXNTBaWEl4SUQwZ0tITjBZWEowTVNBcklHVnVaREVwTHpJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJWdWRHVnlNaUE5SUNoemRHRnlkRElnS3lCbGJtUXlLUzh5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwYzNSaGJtTmxNU0E5SUdGaWN5aFVVMU10WTJWdWRHVnlNU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2x6ZEdGdVkyVXlJRDBnWVdKektGUlRVeTFqWlc1MFpYSXlLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pHbHpkR0Z1WTJVZ1BTQndiV0Y0S0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtTbGNibHh1ZEdWdGNDQThMU0IwWlcxd0lDVStKU0JuY205MWNGOWllU2huWlc1bEtTQWxQaVVnYzNWdGJXRnlhWHBsS0cxcGJsOWxibWhmWkdsemRHRnVZMlVnUFNCdGFXNG9aR2x6ZEdGdVkyVXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUdOaGMyVmZkMmhsYmloblpXNWxJQ1ZwYmlVZ1ozSnZkWEF4SUg0Z1hDSm5jbTkxY0RGY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5aVzVsSUNWcGJpVWdaM0p2ZFhBeUlINGdYQ0puY205MWNESmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JVVWxWRklINGdUa0VwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpZ2hhWE11Ym1Fb1ozSnZkWEFwS1Z4dVhHNWNibWRuY0d4dmRDaDBaVzF3TENCaFpYTW9lQ0E5SUdkeWIzVndMQ0I1SUQwZ2JXbHVYMlZ1YUY5a2FYTjBZVzVqWlN3Z1ptbHNiQ0E5SUdkeWIzVndLU2tnS3lCY2JpQWdaMlZ2YlY5MmFXOXNhVzRvS1NBclhHNGdJR2RsYjIxZlltOTRjR3h2ZENodmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFc0lIZHBaSFJvSUQwZ01DNHhMQ0JtYVd4c0lEMGdYQ0ozYUdsMFpWd2lLU0FyWEc0Z0lIUm9aVzFsWDJKM0tDa2dLMXh1SUNCblozUnBkR3hsS0Z3aVJHbHpkR0Z1WTJVZ2RHOGdUbVZoY21WemRDQkZibWhoYm1ObGNpQm1jbThnUlMxUVhDSXBJQ3RjYmlBZ2MyTmhiR1ZmZVY5amIyNTBhVzUxYjNWektHeGhZbVZzY3lBOUlHeGhZbVZzWDJ0aVgyMWlLU0FnSzF4dUlDQmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb01Dd2dNVEF3TUNBcUlERXdNREFwS1Z4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5cblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3AtcGVfZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIpICU+JVxuICBkcGx5cjo6ZmlsdGVyKEFubm8yID09IFxcUC1FXFwpXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSB1bm5lc3QoZ2VuZSlcblxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSwgZW5zZW1ibCA9IFY2LCBjaHIgPSBWMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibCwgY2hyLCBUU1MpXG5cbnRlbXAgPC0gZHBseXI6OmxlZnRfam9pbih0ZW1wLCBnZW5lLnRiLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxcXCkpXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShjZW50ZXIxID0gKHN0YXJ0MSArIGVuZDEpLzIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyMiA9IChzdGFydDIgKyBlbmQyKS8yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlMSA9IGFicyhUU1MtY2VudGVyMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UyID0gYWJzKFRTUy1jZW50ZXIyKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBwbWF4KGRpc3RhbmNlMSwgZGlzdGFuY2UyKSlcblxudGVtcCA8LSB0ZW1wICU+JSBncm91cF9ieShnZW5lKSAlPiUgc3VtbWFyaXplKG1pbl9lbmhfZGlzdGFuY2UgPSBtaW4oZGlzdGFuY2UpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihnZW5lICVpbiUgZ3JvdXAxIH4gXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgZ3JvdXAyIH4gXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbmdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gbWluX2VuaF9kaXN0YW5jZSwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4oKSArXG4gIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4xLCBmaWxsID0gXFx3aGl0ZVxcKSArXG4gIHRoZW1lX2J3KCkgK1xuICBnZ3RpdGxlKFxcRGlzdGFuY2UgdG8gTmVhcmVzdCBFbmhhbmNlciBmcm8gRS1QXFwpICtcbiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSAgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTAwMCAqIDEwMDApKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->

group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene



name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-pe_ensemblList.tsv\)),
                                 diffCutoff = 0.2) %>%
  dplyr::filter(Anno2 == \P-E\)

temp <- geneAnnoData %>% unnest(gene)

gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3), ensembl = V6, chr = V1) %>%
  dplyr::select(ensembl, chr, TSS)

temp <- dplyr::left_join(temp, gene.tb, by = c(\gene\ = \ensembl\))

temp <- temp %>% dplyr::mutate(center1 = (start1 + end1)/2,
                               center2 = (start2 + end2)/2,
                               distance1 = abs(TSS-center1),
                               distance2 = abs(TSS-center2)) %>%
  dplyr::mutate(distance = pmax(distance1, distance2))

temp <- temp %>% group_by(gene) %>% summarize(min_enh_distance = min(distance)) %>%
  dplyr::mutate(group = case_when(gene %in% group1 ~ \group1\,
                                  gene %in% group2 ~ \group2\,
                                  TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(temp, aes(x = group, y = min_enh_distance, fill = group)) + 
  geom_violin() +
  geom_boxplot(outlier.shape = NA, width = 0.1, fill = \white\) +
  theme_bw() +
  ggtitle(\Distance to Nearest Enhancer fro E-P\) +
  scale_y_continuous(labels = label_kb_mb)  +
  coord_cartesian(ylim = c(0, 1000 * 1000))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNW5jbTkxY0RFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNUzUwYzNaY1hDa3BKR2RsYm1WY2JtZHliM1Z3TWlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhuWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlltbHVZWEo1UjNKdmRYQXlMblJ6ZGx4Y0tTa2taMlZ1WlZ4dVhHNWNibHh1Ym1GdFpTQThMU0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjWEZ4dVhHNW5aVzVsUVc1dWIwUmhkR0VnUEMwZ2JHOWhaRXh2YjNCQmJtNXZSR0YwWVNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDNBdGNHVmZaVzV6WlcxaWJFeHBjM1F1ZEhOMlhGd3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwWm1aRGRYUnZabVlnUFNBd0xqSXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHlJRDA5SUZ4Y1VDMUZYRndwWEc1Y2JuUmxiWEFnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCMWJtNWxjM1FvWjJWdVpTbGNibHh1WjJWdVpTNTBZaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeHRiVEV3WDBkU1EyMHpPQzV3Tmw5blpXNWxYM052Y25SbFpDNWlaV1JjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRlJUVXlBOUlHbG1aV3h6WlNoV05DQTlQU0JjWEN0Y1hDd2dWaklzSUZZektTd2daVzV6WlcxaWJDQTlJRlkyTENCamFISWdQU0JXTVNrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9aVzV6WlcxaWJDd2dZMmh5TENCVVUxTXBYRzVjYm5SbGJYQWdQQzBnWkhCc2VYSTZPbXhsWm5SZmFtOXBiaWgwWlcxd0xDQm5aVzVsTG5SaUxDQmllU0E5SUdNb1hGeG5aVzVsWEZ3Z1BTQmNYR1Z1YzJWdFlteGNYQ2twWEc1Y2JuUmxiWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hqWlc1MFpYSXhJRDBnS0hOMFlYSjBNU0FySUdWdVpERXBMeklzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMlZ1ZEdWeU1pQTlJQ2h6ZEdGeWRESWdLeUJsYm1ReUtTOHlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnBjM1JoYm1ObE1TQTlJR0ZpY3loVVUxTXRZMlZ1ZEdWeU1Ta3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHbHpkR0Z1WTJVeUlEMGdZV0p6S0ZSVFV5MWpaVzUwWlhJeUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWkdsemRHRnVZMlVnUFNCd2JXRjRLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1NsY2JseHVkR1Z0Y0NBOExTQjBaVzF3SUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVWdjM1Z0YldGeWFYcGxLRzFwYmw5bGJtaGZaR2x6ZEdGdVkyVWdQU0J0YVc0b1pHbHpkR0Z1WTJVcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJR05oYzJWZmQyaGxiaWhuWlc1bElDVnBiaVVnWjNKdmRYQXhJSDRnWEZ4bmNtOTFjREZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCblpXNWxJQ1ZwYmlVZ1ozSnZkWEF5SUg0Z1hGeG5jbTkxY0RKY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVbFZGSUg0Z1RrRXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lnaGFYTXVibUVvWjNKdmRYQXBLVnh1WEc1Y2JtZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnYldsdVgyVnVhRjlrYVhOMFlXNWpaU3dnWm1sc2JDQTlJR2R5YjNWd0tTa2dLeUJjYmlBZ1oyVnZiVjkyYVc5c2FXNG9LU0FyWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2h2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VzSUhkcFpIUm9JRDBnTUM0eExDQm1hV3hzSUQwZ1hGeDNhR2wwWlZ4Y0tTQXJYRzRnSUhSb1pXMWxYMkozS0NrZ0sxeHVJQ0JuWjNScGRHeGxLRnhjUkdsemRHRnVZMlVnZEc4Z1RtVmhjbVZ6ZENCRmJtaGhibU5sY2lCbWNtOGdSUzFRWEZ3cElDdGNiaUFnYzJOaGJHVmZlVjlqYjI1MGFXNTFiM1Z6S0d4aFltVnNjeUE5SUd4aFltVnNYMnRpWDIxaUtTQWdLMXh1SUNCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTUN3Z01UQXdNQ0FxSURFd01EQXBLVnh1WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5cblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3AtcGVfZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIpICU+JVxuICBkcGx5cjo6ZmlsdGVyKEFubm8yID09IFxcUC1FXFwpXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSB1bm5lc3QoZ2VuZSlcblxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSwgZW5zZW1ibCA9IFY2LCBjaHIgPSBWMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibCwgY2hyLCBUU1MpXG5cbnRlbXAgPC0gZHBseXI6OmxlZnRfam9pbih0ZW1wLCBnZW5lLnRiLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxcXCkpXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShjZW50ZXIxID0gKHN0YXJ0MSArIGVuZDEpLzIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyMiA9IChzdGFydDIgKyBlbmQyKS8yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlMSA9IGFicyhUU1MtY2VudGVyMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UyID0gYWJzKFRTUy1jZW50ZXIyKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBwbWF4KGRpc3RhbmNlMSwgZGlzdGFuY2UyKSlcblxudGVtcCA8LSB0ZW1wICU+JSBncm91cF9ieShnZW5lKSAlPiUgc3VtbWFyaXplKG1pbl9lbmhfZGlzdGFuY2UgPSBtaW4oZGlzdGFuY2UpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihnZW5lICVpbiUgZ3JvdXAxIH4gXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgZ3JvdXAyIH4gXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbmdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gbWluX2VuaF9kaXN0YW5jZSwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4oKSArXG4gIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4xLCBmaWxsID0gXFx3aGl0ZVxcKSArXG4gIHRoZW1lX2J3KCkgK1xuICBnZ3RpdGxlKFxcRGlzdGFuY2UgdG8gTmVhcmVzdCBFbmhhbmNlciBmcm8gRS1QXFwpICtcbiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSAgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTAwMCAqIDEwMDApKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5cblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3AtcGVfZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIpICU+JVxuICBkcGx5cjo6ZmlsdGVyKEFubm8yID09IFxcUC1FXFwpXG5cbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSB1bm5lc3QoZ2VuZSlcblxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSwgZW5zZW1ibCA9IFY2LCBjaHIgPSBWMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibCwgY2hyLCBUU1MpXG5cbnRlbXAgPC0gZHBseXI6OmxlZnRfam9pbih0ZW1wLCBnZW5lLnRiLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxcXCkpXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShjZW50ZXIxID0gKHN0YXJ0MSArIGVuZDEpLzIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyMiA9IChzdGFydDIgKyBlbmQyKS8yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlMSA9IGFicyhUU1MtY2VudGVyMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UyID0gYWJzKFRTUy1jZW50ZXIyKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBwbWF4KGRpc3RhbmNlMSwgZGlzdGFuY2UyKSlcblxudGVtcCA8LSB0ZW1wICU+JSBncm91cF9ieShnZW5lKSAlPiUgc3VtbWFyaXplKG1pbl9lbmhfZGlzdGFuY2UgPSBtaW4oZGlzdGFuY2UpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihnZW5lICVpbiUgZ3JvdXAxIH4gXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgZ3JvdXAyIH4gXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbmdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gbWluX2VuaF9kaXN0YW5jZSwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4oKSArXG4gIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4xLCBmaWxsID0gXFx3aGl0ZVxcKSArXG4gIHRoZW1lX2J3KCkgK1xuICBnZ3RpdGxlKFxcRGlzdGFuY2UgdG8gTmVhcmVzdCBFbmhhbmNlciBmcm8gRS1QXFwpICtcbiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSAgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTAwMCAqIDEwMDApKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r

group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene



name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-pe_ensemblList.tsv\)),
                                 diffCutoff = 0.2) %>%
  dplyr::filter(Anno2 == \P-E\)

temp <- geneAnnoData %>% unnest(gene)

gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3), ensembl = V6, chr = V1) %>%
  dplyr::select(ensembl, chr, TSS)

temp <- dplyr::left_join(temp, gene.tb, by = c(\gene\ = \ensembl\))

temp <- temp %>% dplyr::mutate(center1 = (start1 + end1)/2,
                               center2 = (start2 + end2)/2,
                               distance1 = abs(TSS-center1),
                               distance2 = abs(TSS-center2)) %>%
  dplyr::mutate(distance = pmax(distance1, distance2))

temp <- temp %>% group_by(gene) %>% summarize(min_enh_distance = min(distance)) %>%
  dplyr::mutate(group = case_when(gene %in% group1 ~ \group1\,
                                  gene %in% group2 ~ \group2\,
                                  TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(temp, aes(x = group, y = min_enh_distance, fill = group)) + 
  geom_violin() +
  geom_boxplot(outlier.shape = NA, width = 0.1, fill = \white\) +
  theme_bw() +
  ggtitle(\Distance to Nearest Enhancer fro E-P\) +
  scale_y_continuous(labels = label_kb_mb)  +
  coord_cartesian(ylim = c(0, 1000 * 1000))

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### binary group - excluding specific TSS +- 10 kb

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WjJWdVpVRnVibTlFWVhSaElEd3RJR3h2WVdSTWIyOXdRVzV1YjBSaGRHRW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOXdMVzVmWlc1elpXMWliRXhwYzNRdWRITjJYQ0lwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdScFptWkRkWFJ2Wm1ZZ1BTQXdMaklwWEc1Y2JseHViRzl2Y0M1MWNDQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYMkZzYkY5a1ZFRkhkbk5FVFZOUFgxVlFYMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hOcGVtVWdQU0JXTXlBdElGWXlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xrSUQwZ2NHRnpkR1VvVmpFc0lITnBlbVVzSUZZeUxDQldOU3dnYzJWd0lEMGdYQ0pmWENJcEtWeHViRzl2Y0M1dWJ5QThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYMkZzYkY5a1ZFRkhkbk5FVFZOUFgwNVBYMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hOcGVtVWdQU0JXTXlBdElGWXlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xrSUQwZ2NHRnpkR1VvVmpFc0lITnBlbVVzSUZZeUxDQldOU3dnYzJWd0lEMGdYQ0pmWENJcEtWeHViRzl2Y0M1a2IzZHVJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmWVd4c1gyUlVRVWQyYzBSTlUwOWZSRTlYVGw5a2FXWm1NQzR5TG1KbFpIQmxYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaHphWHBsSUQwZ1ZqTWdMU0JXTWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFpDQTlJSEJoYzNSbEtGWXhMQ0J6YVhwbExDQldNaXdnVmpVc0lITmxjQ0E5SUZ3aVgxd2lLU2xjYmx4dVoyVnVaVUZ1Ym05RVlYUmhJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHBaQ0FsYVc0bElHTW9iRzl2Y0M1MWNDUnBaQ3dnYkc5dmNDNXVieVJwWkN3Z2JHOXZjQzVrYjNkdUpHbGtLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2JHOXZjRlI1Y0dVZ1BTQmpZWE5sWDNkb1pXNG9hV1FnSldsdUpTQmpLR3h2YjNBdWRYQWthV1FzSUd4dmIzQXVibThrYVdRcElINGdYQ0pwYm5ObGJuTnBkR2wyWlZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xrSUNWcGJpVWdZeWhzYjI5d0xtUnZkMjRrYVdRcElINGdYQ0p6Wlc1emFYUnBkbVZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVbFZGSUg0Z1RrRXBLVnh1WEc1a1lYUmhJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaG5aVzVsTENCcFpDd2diRzl2Y0ZSNWNHVXBJQ1UrSlNCMWJtNWxjM1FvWjJWdVpTa2dKVDRsWEc0Z0lHZHliM1Z3WDJKNUtHZGxibVVwSUNVK0pTQnpkVzF0WVhKcGVtVW9YRzRnSUNBZ2FXNXpaVzV6YVhScGRtVWdQU0J6ZFcwb2JHOXZjRlI1Y0dVZ1BUMGdYQ0pwYm5ObGJuTnBkR2wyWlZ3aUxDQnVZUzV5YlNBOUlGUlNWVVVwTEZ4dUlDQWdJSE5sYm5OcGRHbDJaU0E5SUhOMWJTaHNiMjl3Vkhsd1pTQTlQU0JjSW5ObGJuTnBkR2wyWlZ3aUxDQnVZUzV5YlNBOUlGUlNWVVVwS1Z4dVhHNWNibHh1SXlNalhHNWNibWR5YjNWd01TQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKblpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZZbWx1WVhKNVIzSnZkWEF4TG5SemRsd2lLU2trWjJWdVpWeHVaM0p2ZFhBeUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREl1ZEhOMlhDSXBLU1JuWlc1bFhHNWNibWRsYm1WSGNtOTFjQ0E4TFNCMGFXSmliR1VvWjNKdmRYQWdQU0JqS0hKbGNDaGNJbWR5YjNWd01Wd2lMQ0JzWlc1bmRHZ29aM0p2ZFhBeEtTa3NJSEpsY0NoY0ltZHliM1Z3TWx3aUxDQnNaVzVuZEdnb1ozSnZkWEF5S1NrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuWlc1bElEMGdZeWhuY205MWNERXNJR2R5YjNWd01pa3BYRzVjYm1SaGRHRWdQQzBnYkdWbWRGOXFiMmx1S0dkbGJtVkhjbTkxY0N3Z1pHRjBZU3dnWW5rZ1BTQmpLRndpWjJWdVpWd2lLU2tnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvYlhWMFlYUmxLR0ZqY205emN5aGxkbVZ5ZVhSb2FXNW5LQ2tzSUg1eVpYQnNZV05sWDI1aEtDNHNJREFwS1NrcFhHNWNibHh1SXlNalhHNWtZWFJoSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvY0hKbGMyVnVZMlZQWmxKbGRHRnBibVZrSUQwZ2FXWmZaV3h6WlNocGJuTmxibk5wZEdsMlpTQStJREFzSUZ3aVdVVlRYQ0lzSUZ3aVRrOWNJaWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJsY21OUFpsSmxkR0ZwYm1Wa0lEMGdhV1pmWld4elpTaHBibk5sYm5OcGRHbDJaU0FySUhObGJuTnBkR2wyWlNBOVBTQXdMQ0F3TENBeE1EQXFhVzV6Wlc1emFYUnBkbVV2S0dsdWMyVnVjMmwwYVhabElDc2djMlZ1YzJsMGFYWmxLU2twWEc1Y2JseHVJeU1qWEc1blozQnNiM1FvWkdGMFlTd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJSEJsY21OUFpsSmxkR0ZwYm1Wa0xDQm1hV3hzSUQwZ1ozSnZkWEFwS1NBcklHZGxiMjFmZG1sdmJHbHVLQ2tnS3lCY2JpQWdaMlZ2YlY5aWIzaHdiRzkwS0c5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVN3Z2QybGtkR2dnUFNBd0xqRXNJR1pwYkd3Z1BTQmNJbmRvYVhSbFhDSXBJQ3NnZEdobGJXVmZZbmNvS1Z4dVhHNWNiaU1qSXlCVGRHRmphMlZrSUdKaGNuQnNiM1JjYm1keWIzVndJRHd0SUdNb1hDSm5jbTkxY0RGY0lpd2dYQ0puY205MWNERmNJaXdnWENKbmNtOTFjREpjSWl3Z1hDSm5jbTkxY0RKY0lpbGNibkJ5WlhObGJtTmxUMlpTWlhSaGFXNWxaQ0E4TFNCeVpYQW9ZeWhjSWxsRlUxd2lMQ0JjSWs1UFhDSXBMQ0F5S1Z4dWNISmxjMlZ1WTJWUFpsSmxkR0ZwYm1Wa0lEd3RJR1poWTNSdmNpQW9jSEpsYzJWdVkyVlBabEpsZEdGcGJtVmtMQ0JzWlhabGJITWdQU0JqS0Z3aVdVVlRYQ0lzSUZ3aVRrOWNJaWtwWEc1MllXeDFaU0E4TFNCaktHNXliM2NvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNJbWR5YjNWd01Wd2lMQ0J3Y21WelpXNWpaVTltVW1WMFlXbHVaV1FnUFQwZ1hDSlpSVk5jSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0J1Y205M0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWENKbmNtOTFjREZjSWl3Z2NISmxjMlZ1WTJWUFpsSmxkR0ZwYm1Wa0lEMDlJRndpVGs5Y0lpa3BMRnh1SUNBZ0lDQWdJQ0FnSUNCdWNtOTNLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1hDSm5jbTkxY0RKY0lpd2djSEpsYzJWdVkyVlBabEpsZEdGcGJtVmtJRDA5SUZ3aVdVVlRYQ0lwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdibkp2ZHloa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRndpWjNKdmRYQXlYQ0lzSUhCeVpYTmxibU5sVDJaU1pYUmhhVzVsWkNBOVBTQmNJazVQWENJcEtTbGNibkJzYjNSRVlYUmhJRHd0SUdSaGRHRXVabkpoYldVb1ozSnZkWEFzSUhCeVpYTmxibU5sVDJaU1pYUmhhVzVsWkN3Z2RtRnNkV1VwWEc1Y2JtZG5jR3h2ZENod2JHOTBSR0YwWVN3Z1lXVnpLR1pwYkd3OWNISmxjMlZ1WTJWUFpsSmxkR0ZwYm1Wa0xDQjVQWFpoYkhWbExDQjRQV2R5YjNWd0tTa2dLeUJjYmlBZ0lDQm5aVzl0WDJKaGNpaHdiM05wZEdsdmJqMWNJbVpwYkd4Y0lpd2djM1JoZEQxY0ltbGtaVzUwYVhSNVhDSXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BYRzVjYmx4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMilcblxuXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoc2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgc2l6ZSwgVjIsIFY1LCBzZXAgPSBcXF9cXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoc2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgc2l6ZSwgVjIsIFY1LCBzZXAgPSBcXF9cXCkpXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHNpemUgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIHNpemUsIFYyLCBWNSwgc2VwID0gXFxfXFwpKVxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgYyhsb29wLnVwJGlkLCBsb29wLm5vJGlkLCBsb29wLmRvd24kaWQpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb29wVHlwZSA9IGNhc2Vfd2hlbihpZCAlaW4lIGMobG9vcC51cCRpZCwgbG9vcC5ubyRpZCkgfiBcXGluc2Vuc2l0aXZlXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgJWluJSBjKGxvb3AuZG93biRpZCkgfiBcXHNlbnNpdGl2ZVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpXG5cbmRhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGdlbmUsIGlkLCBsb29wVHlwZSkgJT4lIHVubmVzdChnZW5lKSAlPiVcbiAgZ3JvdXBfYnkoZ2VuZSkgJT4lIHN1bW1hcml6ZShcbiAgICBpbnNlbnNpdGl2ZSA9IHN1bShsb29wVHlwZSA9PSBcXGluc2Vuc2l0aXZlXFwsIG5hLnJtID0gVFJVRSksXG4gICAgc2Vuc2l0aXZlID0gc3VtKGxvb3BUeXBlID09IFxcc2Vuc2l0aXZlXFwsIG5hLnJtID0gVFJVRSkpXG5cblxuXG4jIyNcblxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuZ2VuZUdyb3VwIDwtIHRpYmJsZShncm91cCA9IGMocmVwKFxcZ3JvdXAxXFwsIGxlbmd0aChncm91cDEpKSwgcmVwKFxcZ3JvdXAyXFwsIGxlbmd0aChncm91cDIpKSksXG4gICAgICAgICAgICAgICAgICAgIGdlbmUgPSBjKGdyb3VwMSwgZ3JvdXAyKSlcblxuZGF0YSA8LSBsZWZ0X2pvaW4oZ2VuZUdyb3VwLCBkYXRhLCBieSA9IGMoXFxnZW5lXFwpKSAlPiUgZHBseXI6Om11dGF0ZShtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgfnJlcGxhY2VfbmEoLiwgMCkpKSlcblxuXG4jIyNcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShwcmVzZW5jZU9mUmV0YWluZWQgPSBpZl9lbHNlKGluc2Vuc2l0aXZlID4gMCwgXFxZRVNcXCwgXFxOT1xcKSxcbiAgICAgICAgICAgICAgICAgICAgICAgcGVyY09mUmV0YWluZWQgPSBpZl9lbHNlKGluc2Vuc2l0aXZlICsgc2Vuc2l0aXZlID09IDAsIDAsIDEwMCppbnNlbnNpdGl2ZS8oaW5zZW5zaXRpdmUgKyBzZW5zaXRpdmUpKSlcblxuXG4jIyNcbmdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gcGVyY09mUmV0YWluZWQsIGZpbGwgPSBncm91cCkpICsgZ2VvbV92aW9saW4oKSArIFxuICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BLCB3aWR0aCA9IDAuMSwgZmlsbCA9IFxcd2hpdGVcXCkgKyB0aGVtZV9idygpXG5cblxuIyMjIFN0YWNrZWQgYmFycGxvdFxuZ3JvdXAgPC0gYyhcXGdyb3VwMVxcLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcLCBcXGdyb3VwMlxcKVxucHJlc2VuY2VPZlJldGFpbmVkIDwtIHJlcChjKFxcWUVTXFwsIFxcTk9cXCksIDIpXG5wcmVzZW5jZU9mUmV0YWluZWQgPC0gZmFjdG9yIChwcmVzZW5jZU9mUmV0YWluZWQsIGxldmVscyA9IGMoXFxZRVNcXCwgXFxOT1xcKSlcbnZhbHVlIDwtIGMobnJvdyhkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXAxXFwsIHByZXNlbmNlT2ZSZXRhaW5lZCA9PSBcXFlFU1xcKSksXG4gICAgICAgICAgIG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMVxcLCBwcmVzZW5jZU9mUmV0YWluZWQgPT0gXFxOT1xcKSksXG4gICAgICAgICAgIG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMlxcLCBwcmVzZW5jZU9mUmV0YWluZWQgPT0gXFxZRVNcXCkpLFxuICAgICAgICAgICBucm93KGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDJcXCwgcHJlc2VuY2VPZlJldGFpbmVkID09IFxcTk9cXCkpKVxucGxvdERhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgcHJlc2VuY2VPZlJldGFpbmVkLCB2YWx1ZSlcblxuZ2dwbG90KHBsb3REYXRhLCBhZXMoZmlsbD1wcmVzZW5jZU9mUmV0YWluZWQsIHk9dmFsdWUsIHg9Z3JvdXApKSArIFxuICAgIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcLCBzdGF0PVxcaWRlbnRpdHlcXCkgKyB0aGVtZV9jbGFzc2ljKClcblxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
name <- \chromo_cons_annoHierarchy\
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                 diffCutoff = 0.2)


loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>%
  dplyr::mutate(size = V3 - V2,
                id = paste(V1, size, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>%
  dplyr::mutate(size = V3 - V2,
                id = paste(V1, size, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>%
  dplyr::mutate(size = V3 - V2,
                id = paste(V1, size, V2, V5, sep = \_\))

geneAnnoData <- geneAnnoData %>% dplyr::filter(id %in% c(loop.up$id, loop.no$id, loop.down$id)) %>%
  dplyr::mutate(loopType = case_when(id %in% c(loop.up$id, loop.no$id) ~ \insensitive\,
                                     id %in% c(loop.down$id) ~ \sensitive\,
                                     TRUE ~ NA))

data <- geneAnnoData %>% dplyr::select(gene, id, loopType) %>% unnest(gene) %>%
  group_by(gene) %>% summarize(
    insensitive = sum(loopType == \insensitive\, na.rm = TRUE),
    sensitive = sum(loopType == \sensitive\, na.rm = TRUE))



###

group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

geneGroup <- tibble(group = c(rep(\group1\, length(group1)), rep(\group2\, length(group2))),
                    gene = c(group1, group2))

data <- left_join(geneGroup, data, by = c(\gene\)) %>% dplyr::mutate(mutate(across(everything(), ~replace_na(., 0))))


###
data <- data %>% dplyr::mutate(presenceOfRetained = if_else(insensitive > 0, \YES\, \NO\),
                       percOfRetained = if_else(insensitive + sensitive == 0, 0, 100*insensitive/(insensitive + sensitive)))


###
ggplot(data, aes(x = group, y = percOfRetained, fill = group)) + geom_violin() + 
  geom_boxplot(outlier.shape = NA, width = 0.1, fill = \white\) + theme_bw()


### Stacked barplot
group <- c(\group1\, \group1\, \group2\, \group2\)
presenceOfRetained <- rep(c(\YES\, \NO\), 2)
presenceOfRetained <- factor (presenceOfRetained, levels = c(\YES\, \NO\))
value <- c(nrow(data %>% dplyr::filter(group == \group1\, presenceOfRetained == \YES\)),
           nrow(data %>% dplyr::filter(group == \group1\, presenceOfRetained == \NO\)),
           nrow(data %>% dplyr::filter(group == \group2\, presenceOfRetained == \YES\)),
           nrow(data %>% dplyr::filter(group == \group2\, presenceOfRetained == \NO\)))
plotData <- data.frame(group, presenceOfRetained, value)

ggplot(plotData, aes(fill=presenceOfRetained, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVaMlZ1WlVGdWJtOUVZWFJoSUR3dElHeHZZV1JNYjI5d1FXNXViMFJoZEdFb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5d0xXNWZaVzV6WlcxaWJFeHBjM1F1ZEhOMlhGd3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwWm1aRGRYUnZabVlnUFNBd0xqSXBYRzVjYmx4dWJHOXZjQzUxY0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgyRnNiRjlrVkVGSGRuTkVUVk5QWDFWUVgyUnBabVl3TGpJdVltVmtjR1ZjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSE5wZW1VZ1BTQldNeUF0SUZZeUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbGtJRDBnY0dGemRHVW9WakVzSUhOcGVtVXNJRll5TENCV05Td2djMlZ3SUQwZ1hGeGZYRndwS1Z4dWJHOXZjQzV1YnlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgyRnNiRjlrVkVGSGRuTkVUVk5QWDA1UFgyUnBabVl3TGpJdVltVmtjR1ZjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSE5wZW1VZ1BTQldNeUF0SUZZeUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbGtJRDBnY0dGemRHVW9WakVzSUhOcGVtVXNJRll5TENCV05Td2djMlZ3SUQwZ1hGeGZYRndwS1Z4dWJHOXZjQzVrYjNkdUlEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZZV3hzWDJSVVFVZDJjMFJOVTA5ZlJFOVhUbDlrYVdabU1DNHlMbUpsWkhCbFhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoemFYcGxJRDBnVmpNZ0xTQldNaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlIQmhjM1JsS0ZZeExDQnphWHBsTENCV01pd2dWalVzSUhObGNDQTlJRnhjWDF4Y0tTbGNibHh1WjJWdVpVRnVibTlFWVhSaElEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2locFpDQWxhVzRsSUdNb2JHOXZjQzUxY0NScFpDd2diRzl2Y0M1dWJ5UnBaQ3dnYkc5dmNDNWtiM2R1Skdsa0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvYkc5dmNGUjVjR1VnUFNCallYTmxYM2RvWlc0b2FXUWdKV2x1SlNCaktHeHZiM0F1ZFhBa2FXUXNJR3h2YjNBdWJtOGthV1FwSUg0Z1hGeHBibk5sYm5OcGRHbDJaVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbGtJQ1ZwYmlVZ1l5aHNiMjl3TG1SdmQyNGthV1FwSUg0Z1hGeHpaVzV6YVhScGRtVmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCVVVsVkZJSDRnVGtFcEtWeHVYRzVrWVhSaElEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoblpXNWxMQ0JwWkN3Z2JHOXZjRlI1Y0dVcElDVStKU0IxYm01bGMzUW9aMlZ1WlNrZ0pUNGxYRzRnSUdkeWIzVndYMko1S0dkbGJtVXBJQ1UrSlNCemRXMXRZWEpwZW1Vb1hHNGdJQ0FnYVc1elpXNXphWFJwZG1VZ1BTQnpkVzBvYkc5dmNGUjVjR1VnUFQwZ1hGeHBibk5sYm5OcGRHbDJaVnhjTENCdVlTNXliU0E5SUZSU1ZVVXBMRnh1SUNBZ0lITmxibk5wZEdsMlpTQTlJSE4xYlNoc2IyOXdWSGx3WlNBOVBTQmNYSE5sYm5OcGRHbDJaVnhjTENCdVlTNXliU0E5SUZSU1ZVVXBLVnh1WEc1Y2JseHVJeU1qWEc1Y2JtZHliM1Z3TVNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhuWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlltbHVZWEo1UjNKdmRYQXhMblJ6ZGx4Y0tTa2taMlZ1WlZ4dVozSnZkWEF5SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNESXVkSE4yWEZ3cEtTUm5aVzVsWEc1Y2JtZGxibVZIY205MWNDQThMU0IwYVdKaWJHVW9aM0p2ZFhBZ1BTQmpLSEpsY0NoY1hHZHliM1Z3TVZ4Y0xDQnNaVzVuZEdnb1ozSnZkWEF4S1Nrc0lISmxjQ2hjWEdkeWIzVndNbHhjTENCc1pXNW5kR2dvWjNKdmRYQXlLU2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5aVzVsSUQwZ1l5aG5jbTkxY0RFc0lHZHliM1Z3TWlrcFhHNWNibVJoZEdFZ1BDMGdiR1ZtZEY5cWIybHVLR2RsYm1WSGNtOTFjQ3dnWkdGMFlTd2dZbmtnUFNCaktGeGNaMlZ1WlZ4Y0tTa2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9iWFYwWVhSbEtHRmpjbTl6Y3lobGRtVnllWFJvYVc1bktDa3NJSDV5WlhCc1lXTmxYMjVoS0M0c0lEQXBLU2twWEc1Y2JseHVJeU1qWEc1a1lYUmhJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9jSEpsYzJWdVkyVlBabEpsZEdGcGJtVmtJRDBnYVdaZlpXeHpaU2hwYm5ObGJuTnBkR2wyWlNBK0lEQXNJRnhjV1VWVFhGd3NJRnhjVGs5Y1hDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQmxjbU5QWmxKbGRHRnBibVZrSUQwZ2FXWmZaV3h6WlNocGJuTmxibk5wZEdsMlpTQXJJSE5sYm5OcGRHbDJaU0E5UFNBd0xDQXdMQ0F4TURBcWFXNXpaVzV6YVhScGRtVXZLR2x1YzJWdWMybDBhWFpsSUNzZ2MyVnVjMmwwYVhabEtTa3BYRzVjYmx4dUl5TWpYRzVuWjNCc2IzUW9aR0YwWVN3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlIQmxjbU5QWmxKbGRHRnBibVZrTENCbWFXeHNJRDBnWjNKdmRYQXBLU0FySUdkbGIyMWZkbWx2YkdsdUtDa2dLeUJjYmlBZ1oyVnZiVjlpYjNod2JHOTBLRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU3dnZDJsa2RHZ2dQU0F3TGpFc0lHWnBiR3dnUFNCY1hIZG9hWFJsWEZ3cElDc2dkR2hsYldWZlluY29LVnh1WEc1Y2JpTWpJeUJUZEdGamEyVmtJR0poY25Cc2IzUmNibWR5YjNWd0lEd3RJR01vWEZ4bmNtOTFjREZjWEN3Z1hGeG5jbTkxY0RGY1hDd2dYRnhuY205MWNESmNYQ3dnWEZ4bmNtOTFjREpjWENsY2JuQnlaWE5sYm1ObFQyWlNaWFJoYVc1bFpDQThMU0J5WlhBb1l5aGNYRmxGVTF4Y0xDQmNYRTVQWEZ3cExDQXlLVnh1Y0hKbGMyVnVZMlZQWmxKbGRHRnBibVZrSUR3dElHWmhZM1J2Y2lBb2NISmxjMlZ1WTJWUFpsSmxkR0ZwYm1Wa0xDQnNaWFpsYkhNZ1BTQmpLRnhjV1VWVFhGd3NJRnhjVGs5Y1hDa3BYRzUyWVd4MVpTQThMU0JqS0c1eWIzY29aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY1hHZHliM1Z3TVZ4Y0xDQndjbVZ6Wlc1alpVOW1VbVYwWVdsdVpXUWdQVDBnWEZ4WlJWTmNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQnVjbTkzS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdYRnhuY205MWNERmNYQ3dnY0hKbGMyVnVZMlZQWmxKbGRHRnBibVZrSUQwOUlGeGNUazljWENrcExGeHVJQ0FnSUNBZ0lDQWdJQ0J1Y205M0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWEZ4bmNtOTFjREpjWEN3Z2NISmxjMlZ1WTJWUFpsSmxkR0ZwYm1Wa0lEMDlJRnhjV1VWVFhGd3BLU3hjYmlBZ0lDQWdJQ0FnSUNBZ2JuSnZkeWhrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlGeGNaM0p2ZFhBeVhGd3NJSEJ5WlhObGJtTmxUMlpTWlhSaGFXNWxaQ0E5UFNCY1hFNVBYRndwS1NsY2JuQnNiM1JFWVhSaElEd3RJR1JoZEdFdVpuSmhiV1VvWjNKdmRYQXNJSEJ5WlhObGJtTmxUMlpTWlhSaGFXNWxaQ3dnZG1Gc2RXVXBYRzVjYm1kbmNHeHZkQ2h3Ykc5MFJHRjBZU3dnWVdWektHWnBiR3c5Y0hKbGMyVnVZMlZQWmxKbGRHRnBibVZrTENCNVBYWmhiSFZsTENCNFBXZHliM1Z3S1NrZ0t5QmNiaUFnSUNCblpXOXRYMkpoY2lod2IzTnBkR2x2YmoxY1hHWnBiR3hjWEN3Z2MzUmhkRDFjWEdsa1pXNTBhWFI1WEZ3cElDc2dkR2hsYldWZlkyeGhjM05wWXlncFhHNWNibHh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIpXG5cblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHNpemUgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIHNpemUsIFYyLCBWNSwgc2VwID0gXFxfXFwpKVxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHNpemUgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIHNpemUsIFYyLCBWNSwgc2VwID0gXFxfXFwpKVxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBzaXplLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGMobG9vcC51cCRpZCwgbG9vcC5ubyRpZCwgbG9vcC5kb3duJGlkKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9vcFR5cGUgPSBjYXNlX3doZW4oaWQgJWluJSBjKGxvb3AudXAkaWQsIGxvb3Aubm8kaWQpIH4gXFxpbnNlbnNpdGl2ZVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkICVpbiUgYyhsb29wLmRvd24kaWQpIH4gXFxzZW5zaXRpdmVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKVxuXG5kYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChnZW5lLCBpZCwgbG9vcFR5cGUpICU+JSB1bm5lc3QoZ2VuZSkgJT4lXG4gIGdyb3VwX2J5KGdlbmUpICU+JSBzdW1tYXJpemUoXG4gICAgaW5zZW5zaXRpdmUgPSBzdW0obG9vcFR5cGUgPT0gXFxpbnNlbnNpdGl2ZVxcLCBuYS5ybSA9IFRSVUUpLFxuICAgIHNlbnNpdGl2ZSA9IHN1bShsb29wVHlwZSA9PSBcXHNlbnNpdGl2ZVxcLCBuYS5ybSA9IFRSVUUpKVxuXG5cblxuIyMjXG5cbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cbmdlbmVHcm91cCA8LSB0aWJibGUoZ3JvdXAgPSBjKHJlcChcXGdyb3VwMVxcLCBsZW5ndGgoZ3JvdXAxKSksIHJlcChcXGdyb3VwMlxcLCBsZW5ndGgoZ3JvdXAyKSkpLFxuICAgICAgICAgICAgICAgICAgICBnZW5lID0gYyhncm91cDEsIGdyb3VwMikpXG5cbmRhdGEgPC0gbGVmdF9qb2luKGdlbmVHcm91cCwgZGF0YSwgYnkgPSBjKFxcZ2VuZVxcKSkgJT4lIGRwbHlyOjptdXRhdGUobXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIH5yZXBsYWNlX25hKC4sIDApKSkpXG5cblxuIyMjXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUocHJlc2VuY2VPZlJldGFpbmVkID0gaWZfZWxzZShpbnNlbnNpdGl2ZSA+IDAsIFxcWUVTXFwsIFxcTk9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgIHBlcmNPZlJldGFpbmVkID0gaWZfZWxzZShpbnNlbnNpdGl2ZSArIHNlbnNpdGl2ZSA9PSAwLCAwLCAxMDAqaW5zZW5zaXRpdmUvKGluc2Vuc2l0aXZlICsgc2Vuc2l0aXZlKSkpXG5cblxuIyMjXG5nZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IHBlcmNPZlJldGFpbmVkLCBmaWxsID0gZ3JvdXApKSArIGdlb21fdmlvbGluKCkgKyBcbiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjEsIGZpbGwgPSBcXHdoaXRlXFwpICsgdGhlbWVfYncoKVxuXG5cbiMjIyBTdGFja2VkIGJhcnBsb3Rcbmdyb3VwIDwtIGMoXFxncm91cDFcXCwgXFxncm91cDFcXCwgXFxncm91cDJcXCwgXFxncm91cDJcXClcbnByZXNlbmNlT2ZSZXRhaW5lZCA8LSByZXAoYyhcXFlFU1xcLCBcXE5PXFwpLCAyKVxucHJlc2VuY2VPZlJldGFpbmVkIDwtIGZhY3RvciAocHJlc2VuY2VPZlJldGFpbmVkLCBsZXZlbHMgPSBjKFxcWUVTXFwsIFxcTk9cXCkpXG52YWx1ZSA8LSBjKG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMVxcLCBwcmVzZW5jZU9mUmV0YWluZWQgPT0gXFxZRVNcXCkpLFxuICAgICAgICAgICBucm93KGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDFcXCwgcHJlc2VuY2VPZlJldGFpbmVkID09IFxcTk9cXCkpLFxuICAgICAgICAgICBucm93KGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDJcXCwgcHJlc2VuY2VPZlJldGFpbmVkID09IFxcWUVTXFwpKSxcbiAgICAgICAgICAgbnJvdyhkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXAyXFwsIHByZXNlbmNlT2ZSZXRhaW5lZCA9PSBcXE5PXFwpKSlcbnBsb3REYXRhIDwtIGRhdGEuZnJhbWUoZ3JvdXAsIHByZXNlbmNlT2ZSZXRhaW5lZCwgdmFsdWUpXG5cbmdncGxvdChwbG90RGF0YSwgYWVzKGZpbGw9cHJlc2VuY2VPZlJldGFpbmVkLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdD1cXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIpXG5cblxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHNpemUgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIHNpemUsIFYyLCBWNSwgc2VwID0gXFxfXFwpKVxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHNpemUgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIHNpemUsIFYyLCBWNSwgc2VwID0gXFxfXFwpKVxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBzaXplLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGMobG9vcC51cCRpZCwgbG9vcC5ubyRpZCwgbG9vcC5kb3duJGlkKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9vcFR5cGUgPSBjYXNlX3doZW4oaWQgJWluJSBjKGxvb3AudXAkaWQsIGxvb3Aubm8kaWQpIH4gXFxpbnNlbnNpdGl2ZVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkICVpbiUgYyhsb29wLmRvd24kaWQpIH4gXFxzZW5zaXRpdmVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKVxuXG5kYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChnZW5lLCBpZCwgbG9vcFR5cGUpICU+JSB1bm5lc3QoZ2VuZSkgJT4lXG4gIGdyb3VwX2J5KGdlbmUpICU+JSBzdW1tYXJpemUoXG4gICAgaW5zZW5zaXRpdmUgPSBzdW0obG9vcFR5cGUgPT0gXFxpbnNlbnNpdGl2ZVxcLCBuYS5ybSA9IFRSVUUpLFxuICAgIHNlbnNpdGl2ZSA9IHN1bShsb29wVHlwZSA9PSBcXHNlbnNpdGl2ZVxcLCBuYS5ybSA9IFRSVUUpKVxuXG5cblxuIyMjXG5cbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cbmdlbmVHcm91cCA8LSB0aWJibGUoZ3JvdXAgPSBjKHJlcChcXGdyb3VwMVxcLCBsZW5ndGgoZ3JvdXAxKSksIHJlcChcXGdyb3VwMlxcLCBsZW5ndGgoZ3JvdXAyKSkpLFxuICAgICAgICAgICAgICAgICAgICBnZW5lID0gYyhncm91cDEsIGdyb3VwMikpXG5cbmRhdGEgPC0gbGVmdF9qb2luKGdlbmVHcm91cCwgZGF0YSwgYnkgPSBjKFxcZ2VuZVxcKSkgJT4lIGRwbHlyOjptdXRhdGUobXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIH5yZXBsYWNlX25hKC4sIDApKSkpXG5cblxuIyMjXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUocHJlc2VuY2VPZlJldGFpbmVkID0gaWZfZWxzZShpbnNlbnNpdGl2ZSA+IDAsIFxcWUVTXFwsIFxcTk9cXCksXG4gICAgICAgICAgICAgICAgICAgICAgIHBlcmNPZlJldGFpbmVkID0gaWZfZWxzZShpbnNlbnNpdGl2ZSArIHNlbnNpdGl2ZSA9PSAwLCAwLCAxMDAqaW5zZW5zaXRpdmUvKGluc2Vuc2l0aXZlICsgc2Vuc2l0aXZlKSkpXG5cblxuIyMjXG5nZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IHBlcmNPZlJldGFpbmVkLCBmaWxsID0gZ3JvdXApKSArIGdlb21fdmlvbGluKCkgKyBcbiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjEsIGZpbGwgPSBcXHdoaXRlXFwpICsgdGhlbWVfYncoKVxuXG5cbiMjIyBTdGFja2VkIGJhcnBsb3Rcbmdyb3VwIDwtIGMoXFxncm91cDFcXCwgXFxncm91cDFcXCwgXFxncm91cDJcXCwgXFxncm91cDJcXClcbnByZXNlbmNlT2ZSZXRhaW5lZCA8LSByZXAoYyhcXFlFU1xcLCBcXE5PXFwpLCAyKVxucHJlc2VuY2VPZlJldGFpbmVkIDwtIGZhY3RvciAocHJlc2VuY2VPZlJldGFpbmVkLCBsZXZlbHMgPSBjKFxcWUVTXFwsIFxcTk9cXCkpXG52YWx1ZSA8LSBjKG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMVxcLCBwcmVzZW5jZU9mUmV0YWluZWQgPT0gXFxZRVNcXCkpLFxuICAgICAgICAgICBucm93KGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDFcXCwgcHJlc2VuY2VPZlJldGFpbmVkID09IFxcTk9cXCkpLFxuICAgICAgICAgICBucm93KGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDJcXCwgcHJlc2VuY2VPZlJldGFpbmVkID09IFxcWUVTXFwpKSxcbiAgICAgICAgICAgbnJvdyhkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXAyXFwsIHByZXNlbmNlT2ZSZXRhaW5lZCA9PSBcXE5PXFwpKSlcbnBsb3REYXRhIDwtIGRhdGEuZnJhbWUoZ3JvdXAsIHByZXNlbmNlT2ZSZXRhaW5lZCwgdmFsdWUpXG5cbmdncGxvdChwbG90RGF0YSwgYWVzKGZpbGw9cHJlc2VuY2VPZlJldGFpbmVkLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbj1cXGZpbGxcXCwgc3RhdD1cXGlkZW50aXR5XFwpICsgdGhlbWVfY2xhc3NpYygpXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
name <- \chromo_cons_annoHierarchy\
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                 diffCutoff = 0.2)


loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>%
  dplyr::mutate(size = V3 - V2,
                id = paste(V1, size, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>%
  dplyr::mutate(size = V3 - V2,
                id = paste(V1, size, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>%
  dplyr::mutate(size = V3 - V2,
                id = paste(V1, size, V2, V5, sep = \_\))

geneAnnoData <- geneAnnoData %>% dplyr::filter(id %in% c(loop.up$id, loop.no$id, loop.down$id)) %>%
  dplyr::mutate(loopType = case_when(id %in% c(loop.up$id, loop.no$id) ~ \insensitive\,
                                     id %in% c(loop.down$id) ~ \sensitive\,
                                     TRUE ~ NA))

data <- geneAnnoData %>% dplyr::select(gene, id, loopType) %>% unnest(gene) %>%
  group_by(gene) %>% summarize(
    insensitive = sum(loopType == \insensitive\, na.rm = TRUE),
    sensitive = sum(loopType == \sensitive\, na.rm = TRUE))



###

group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

geneGroup <- tibble(group = c(rep(\group1\, length(group1)), rep(\group2\, length(group2))),
                    gene = c(group1, group2))

data <- left_join(geneGroup, data, by = c(\gene\)) %>% dplyr::mutate(mutate(across(everything(), ~replace_na(., 0))))


###
data <- data %>% dplyr::mutate(presenceOfRetained = if_else(insensitive > 0, \YES\, \NO\),
                       percOfRetained = if_else(insensitive + sensitive == 0, 0, 100*insensitive/(insensitive + sensitive)))


###
ggplot(data, aes(x = group, y = percOfRetained, fill = group)) + geom_violin() + 
  geom_boxplot(outlier.shape = NA, width = 0.1, fill = \white\) + theme_bw()


### Stacked barplot
group <- c(\group1\, \group1\, \group2\, \group2\)
presenceOfRetained <- rep(c(\YES\, \NO\), 2)
presenceOfRetained <- factor (presenceOfRetained, levels = c(\YES\, \NO\))
value <- c(nrow(data %>% dplyr::filter(group == \group1\, presenceOfRetained == \YES\)),
           nrow(data %>% dplyr::filter(group == \group1\, presenceOfRetained == \NO\)),
           nrow(data %>% dplyr::filter(group == \group2\, presenceOfRetained == \YES\)),
           nrow(data %>% dplyr::filter(group == \group2\, presenceOfRetained == \NO\)))
plotData <- data.frame(group, presenceOfRetained, value)

ggplot(plotData, aes(fill=presenceOfRetained, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### Only limiting to E-P loops from Micro-C

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WjJWdVpVRnVibTlFWVhSaElEd3RJR3h2WVdSTWIyOXdRVzV1YjBSaGRHRW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOXdMWEJsWDJWdWMyVnRZbXhNYVhOMExuUnpkbHdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2FXWm1RM1YwYjJabUlEMGdNQzR5S1Z4dVhHNWNibXh2YjNBdWRYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjloYkd4ZlpGUkJSM1p6UkUxVFQxOVZVRjlrYVdabU1DNHlMbUpsWkhCbFhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoemFYcGxJRDBnVmpNZ0xTQldNaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlIQmhjM1JsS0ZZeExDQnphWHBsTENCV01pd2dWalVzSUhObGNDQTlJRndpWDF3aUtTbGNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjloYkd4ZlpGUkJSM1p6UkUxVFQxOU9UMTlrYVdabU1DNHlMbUpsWkhCbFhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoemFYcGxJRDBnVmpNZ0xTQldNaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlIQmhjM1JsS0ZZeExDQnphWHBsTENCV01pd2dWalVzSUhObGNDQTlJRndpWDF3aUtTbGNibXh2YjNBdVpHOTNiaUE4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKamFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDJGc2JGOWtWRUZIZG5ORVRWTlBYMFJQVjA1ZlpHbG1aakF1TWk1aVpXUndaVndpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9jMmw2WlNBOUlGWXpJQzBnVmpJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXUWdQU0J3WVhOMFpTaFdNU3dnYzJsNlpTd2dWaklzSUZZMUxDQnpaWEFnUFNCY0lsOWNJaWtwWEc1Y2JtZGxibVZCYm01dlJHRjBZU0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9hV1FnSldsdUpTQmpLR3h2YjNBdWRYQWthV1FzSUd4dmIzQXVibThrYVdRc0lHeHZiM0F1Wkc5M2JpUnBaQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHeHZiM0JVZVhCbElEMGdZMkZ6WlY5M2FHVnVLR2xrSUNWcGJpVWdZeWhzYjI5d0xuVndKR2xrTENCc2IyOXdMbTV2Skdsa0tTQitJRndpYVc1elpXNXphWFJwZG1WY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBbGFXNGxJR01vYkc5dmNDNWtiM2R1Skdsa0tTQitJRndpYzJWdWMybDBhWFpsWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdWRkpWUlNCK0lFNUJLU2xjYmx4dVpHRjBZU0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aMlZ1WlN3Z2FXUXNJR3h2YjNCVWVYQmxLU0FsUGlVZ2RXNXVaWE4wS0dkbGJtVXBJQ1UrSlZ4dUlDQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVWdjM1Z0YldGeWFYcGxLRnh1SUNBZ0lHbHVjMlZ1YzJsMGFYWmxJRDBnYzNWdEtHeHZiM0JVZVhCbElEMDlJRndpYVc1elpXNXphWFJwZG1WY0lpd2dibUV1Y20wZ1BTQlVVbFZGS1N4Y2JpQWdJQ0J6Wlc1emFYUnBkbVVnUFNCemRXMG9iRzl2Y0ZSNWNHVWdQVDBnWENKelpXNXphWFJwZG1WY0lpd2dibUV1Y20wZ1BTQlVVbFZGS1NsY2JseHVYRzVjYmlNakkxeHVYRzVuY205MWNERWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMkpwYm1GeWVVZHliM1Z3TVM1MGMzWmNJaWtwSkdkbGJtVmNibWR5YjNWd01pQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKblpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZZbWx1WVhKNVIzSnZkWEF5TG5SemRsd2lLU2trWjJWdVpWeHVYRzVuWlc1bFIzSnZkWEFnUEMwZ2RHbGlZbXhsS0dkeWIzVndJRDBnWXloeVpYQW9YQ0puY205MWNERmNJaXdnYkdWdVozUm9LR2R5YjNWd01Ta3BMQ0J5WlhBb1hDSm5jbTkxY0RKY0lpd2diR1Z1WjNSb0tHZHliM1Z3TWlrcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjJWdVpTQTlJR01vWjNKdmRYQXhMQ0JuY205MWNESXBLVnh1WEc1a1lYUmhJRHd0SUd4bFpuUmZhbTlwYmloblpXNWxSM0p2ZFhBc0lHUmhkR0VzSUdKNUlEMGdZeWhjSW1kbGJtVmNJaWtwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0cxMWRHRjBaU2hoWTNKdmMzTW9aWFpsY25sMGFHbHVaeWdwTENCK2NtVndiR0ZqWlY5dVlTZ3VMQ0F3S1NrcEtWeHVYRzVjYmlNakkxeHVaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0hCeVpYTmxibU5sVDJaU1pYUmhhVzVsWkNBOUlHbG1YMlZzYzJVb2FXNXpaVzV6YVhScGRtVWdQaUF3TENCY0lsbEZVMXdpTENCY0lrNVBYQ0lwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J3WlhKalQyWlNaWFJoYVc1bFpDQTlJR2xtWDJWc2MyVW9hVzV6Wlc1emFYUnBkbVVnS3lCelpXNXphWFJwZG1VZ1BUMGdNQ3dnTUN3Z01UQXdLbWx1YzJWdWMybDBhWFpsTHlocGJuTmxibk5wZEdsMlpTQXJJSE5sYm5OcGRHbDJaU2twS1Z4dVhHNWNiaU1qSTF4dVoyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0J3WlhKalQyWlNaWFJoYVc1bFpDd2dabWxzYkNBOUlHZHliM1Z3S1NrZ0t5Qm5aVzl0WDNacGIyeHBiaWdwSUNzZ1hHNGdJR2RsYjIxZlltOTRjR3h2ZENodmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFc0lIZHBaSFJvSUQwZ01DNHdOU3dnWm1sc2JDQTlJRndpZDJocGRHVmNJaWtnS3lCMGFHVnRaVjlpZHlncFhHNWNibHh1SXlNaklGTjBZV05yWldRZ1ltRnljR3h2ZEZ4dVozSnZkWEFnUEMwZ1l5aGNJbWR5YjNWd01Wd2lMQ0JjSW1keWIzVndNVndpTENCY0ltZHliM1Z3TWx3aUxDQmNJbWR5YjNWd01sd2lLVnh1Y0hKbGMyVnVZMlZQWmxKbGRHRnBibVZrSUR3dElISmxjQ2hqS0Z3aVdVVlRYQ0lzSUZ3aVRrOWNJaWtzSURJcFhHNXdjbVZ6Wlc1alpVOW1VbVYwWVdsdVpXUWdQQzBnWm1GamRHOXlJQ2h3Y21WelpXNWpaVTltVW1WMFlXbHVaV1FzSUd4bGRtVnNjeUE5SUdNb1hDSlpSVk5jSWl3Z1hDSk9UMXdpS1NsY2JuWmhiSFZsSUR3dElHTW9ibkp2ZHloa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRndpWjNKdmRYQXhYQ0lzSUhCeVpYTmxibU5sVDJaU1pYUmhhVzVsWkNBOVBTQmNJbGxGVTF3aUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUc1eWIzY29aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY0ltZHliM1Z3TVZ3aUxDQndjbVZ6Wlc1alpVOW1VbVYwWVdsdVpXUWdQVDBnWENKT1Qxd2lLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lHNXliM2NvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNJbWR5YjNWd01sd2lMQ0J3Y21WelpXNWpaVTltVW1WMFlXbHVaV1FnUFQwZ1hDSlpSVk5jSWlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0J1Y205M0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWENKbmNtOTFjREpjSWl3Z2NISmxjMlZ1WTJWUFpsSmxkR0ZwYm1Wa0lEMDlJRndpVGs5Y0lpa3BLVnh1Y0d4dmRFUmhkR0VnUEMwZ1pHRjBZUzVtY21GdFpTaG5jbTkxY0N3Z2NISmxjMlZ1WTJWUFpsSmxkR0ZwYm1Wa0xDQjJZV3gxWlNsY2JseHVaMmR3Ykc5MEtIQnNiM1JFWVhSaExDQmhaWE1vWm1sc2JEMXdjbVZ6Wlc1alpVOW1VbVYwWVdsdVpXUXNJSGs5ZG1Gc2RXVXNJSGc5WjNKdmRYQXBLU0FySUZ4dUlDQWdJR2RsYjIxZlltRnlLSEJ2YzJsMGFXOXVQVndpWm1sc2JGd2lMQ0J6ZEdGMFBWd2lhV1JsYm5ScGRIbGNJaWtnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2xjYmx4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLXBlX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yKVxuXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBzaXplLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBzaXplLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoc2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgc2l6ZSwgVjIsIFY1LCBzZXAgPSBcXF9cXCkpXG5cbmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBjKGxvb3AudXAkaWQsIGxvb3Aubm8kaWQsIGxvb3AuZG93biRpZCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvb3BUeXBlID0gY2FzZV93aGVuKGlkICVpbiUgYyhsb29wLnVwJGlkLCBsb29wLm5vJGlkKSB+IFxcaW5zZW5zaXRpdmVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCAlaW4lIGMobG9vcC5kb3duJGlkKSB+IFxcc2Vuc2l0aXZlXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSlcblxuZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZ2VuZSwgaWQsIGxvb3BUeXBlKSAlPiUgdW5uZXN0KGdlbmUpICU+JVxuICBncm91cF9ieShnZW5lKSAlPiUgc3VtbWFyaXplKFxuICAgIGluc2Vuc2l0aXZlID0gc3VtKGxvb3BUeXBlID09IFxcaW5zZW5zaXRpdmVcXCwgbmEucm0gPSBUUlVFKSxcbiAgICBzZW5zaXRpdmUgPSBzdW0obG9vcFR5cGUgPT0gXFxzZW5zaXRpdmVcXCwgbmEucm0gPSBUUlVFKSlcblxuXG5cbiMjI1xuXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5nZW5lR3JvdXAgPC0gdGliYmxlKGdyb3VwID0gYyhyZXAoXFxncm91cDFcXCwgbGVuZ3RoKGdyb3VwMSkpLCByZXAoXFxncm91cDJcXCwgbGVuZ3RoKGdyb3VwMikpKSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZSA9IGMoZ3JvdXAxLCBncm91cDIpKVxuXG5kYXRhIDwtIGxlZnRfam9pbihnZW5lR3JvdXAsIGRhdGEsIGJ5ID0gYyhcXGdlbmVcXCkpICU+JSBkcGx5cjo6bXV0YXRlKG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCB+cmVwbGFjZV9uYSguLCAwKSkpKVxuXG5cbiMjI1xuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKHByZXNlbmNlT2ZSZXRhaW5lZCA9IGlmX2Vsc2UoaW5zZW5zaXRpdmUgPiAwLCBcXFlFU1xcLCBcXE5PXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICBwZXJjT2ZSZXRhaW5lZCA9IGlmX2Vsc2UoaW5zZW5zaXRpdmUgKyBzZW5zaXRpdmUgPT0gMCwgMCwgMTAwKmluc2Vuc2l0aXZlLyhpbnNlbnNpdGl2ZSArIHNlbnNpdGl2ZSkpKVxuXG5cbiMjI1xuZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBwZXJjT2ZSZXRhaW5lZCwgZmlsbCA9IGdyb3VwKSkgKyBnZW9tX3Zpb2xpbigpICsgXG4gIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4wNSwgZmlsbCA9IFxcd2hpdGVcXCkgKyB0aGVtZV9idygpXG5cblxuIyMjIFN0YWNrZWQgYmFycGxvdFxuZ3JvdXAgPC0gYyhcXGdyb3VwMVxcLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcLCBcXGdyb3VwMlxcKVxucHJlc2VuY2VPZlJldGFpbmVkIDwtIHJlcChjKFxcWUVTXFwsIFxcTk9cXCksIDIpXG5wcmVzZW5jZU9mUmV0YWluZWQgPC0gZmFjdG9yIChwcmVzZW5jZU9mUmV0YWluZWQsIGxldmVscyA9IGMoXFxZRVNcXCwgXFxOT1xcKSlcbnZhbHVlIDwtIGMobnJvdyhkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXAxXFwsIHByZXNlbmNlT2ZSZXRhaW5lZCA9PSBcXFlFU1xcKSksXG4gICAgICAgICAgIG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMVxcLCBwcmVzZW5jZU9mUmV0YWluZWQgPT0gXFxOT1xcKSksXG4gICAgICAgICAgIG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMlxcLCBwcmVzZW5jZU9mUmV0YWluZWQgPT0gXFxZRVNcXCkpLFxuICAgICAgICAgICBucm93KGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDJcXCwgcHJlc2VuY2VPZlJldGFpbmVkID09IFxcTk9cXCkpKVxucGxvdERhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgcHJlc2VuY2VPZlJldGFpbmVkLCB2YWx1ZSlcblxuZ2dwbG90KHBsb3REYXRhLCBhZXMoZmlsbD1wcmVzZW5jZU9mUmV0YWluZWQsIHk9dmFsdWUsIHg9Z3JvdXApKSArIFxuICAgIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcLCBzdGF0PVxcaWRlbnRpdHlcXCkgKyB0aGVtZV9jbGFzc2ljKClcblxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
name <- \chromo_cons_annoHierarchy\
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-pe_ensemblList.tsv\)),
                                 diffCutoff = 0.2)


loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>%
  dplyr::mutate(size = V3 - V2,
                id = paste(V1, size, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>%
  dplyr::mutate(size = V3 - V2,
                id = paste(V1, size, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>%
  dplyr::mutate(size = V3 - V2,
                id = paste(V1, size, V2, V5, sep = \_\))

geneAnnoData <- geneAnnoData %>% dplyr::filter(id %in% c(loop.up$id, loop.no$id, loop.down$id)) %>%
  dplyr::mutate(loopType = case_when(id %in% c(loop.up$id, loop.no$id) ~ \insensitive\,
                                     id %in% c(loop.down$id) ~ \sensitive\,
                                     TRUE ~ NA))

data <- geneAnnoData %>% dplyr::select(gene, id, loopType) %>% unnest(gene) %>%
  group_by(gene) %>% summarize(
    insensitive = sum(loopType == \insensitive\, na.rm = TRUE),
    sensitive = sum(loopType == \sensitive\, na.rm = TRUE))



###

group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

geneGroup <- tibble(group = c(rep(\group1\, length(group1)), rep(\group2\, length(group2))),
                    gene = c(group1, group2))

data <- left_join(geneGroup, data, by = c(\gene\)) %>% dplyr::mutate(mutate(across(everything(), ~replace_na(., 0))))


###
data <- data %>% dplyr::mutate(presenceOfRetained = if_else(insensitive > 0, \YES\, \NO\),
                       percOfRetained = if_else(insensitive + sensitive == 0, 0, 100*insensitive/(insensitive + sensitive)))


###
ggplot(data, aes(x = group, y = percOfRetained, fill = group)) + geom_violin() + 
  geom_boxplot(outlier.shape = NA, width = 0.05, fill = \white\) + theme_bw()


### Stacked barplot
group <- c(\group1\, \group1\, \group2\, \group2\)
presenceOfRetained <- rep(c(\YES\, \NO\), 2)
presenceOfRetained <- factor (presenceOfRetained, levels = c(\YES\, \NO\))
value <- c(nrow(data %>% dplyr::filter(group == \group1\, presenceOfRetained == \YES\)),
           nrow(data %>% dplyr::filter(group == \group1\, presenceOfRetained == \NO\)),
           nrow(data %>% dplyr::filter(group == \group2\, presenceOfRetained == \YES\)),
           nrow(data %>% dplyr::filter(group == \group2\, presenceOfRetained == \NO\)))
plotData <- data.frame(group, presenceOfRetained, value)

ggplot(plotData, aes(fill=presenceOfRetained, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVaMlZ1WlVGdWJtOUVZWFJoSUR3dElHeHZZV1JNYjI5d1FXNXViMFJoZEdFb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5d0xYQmxYMlZ1YzJWdFlteE1hWE4wTG5SemRseGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVdabVEzVjBiMlptSUQwZ01DNHlLVnh1WEc1Y2JteHZiM0F1ZFhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOWhiR3hmWkZSQlIzWnpSRTFUVDE5VlVGOWthV1ptTUM0eUxtSmxaSEJsWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2h6YVhwbElEMGdWak1nTFNCV01peGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaQ0E5SUhCaGMzUmxLRll4TENCemFYcGxMQ0JXTWl3Z1ZqVXNJSE5sY0NBOUlGeGNYMXhjS1NsY2JteHZiM0F1Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOWhiR3hmWkZSQlIzWnpSRTFUVDE5T1QxOWthV1ptTUM0eUxtSmxaSEJsWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2h6YVhwbElEMGdWak1nTFNCV01peGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaQ0E5SUhCaGMzUmxLRll4TENCemFYcGxMQ0JXTWl3Z1ZqVXNJSE5sY0NBOUlGeGNYMXhjS1NsY2JteHZiM0F1Wkc5M2JpQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYMkZzYkY5a1ZFRkhkbk5FVFZOUFgwUlBWMDVmWkdsbVpqQXVNaTVpWldSd1pWeGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2MybDZaU0E5SUZZeklDMGdWaklzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdRZ1BTQndZWE4wWlNoV01Td2djMmw2WlN3Z1ZqSXNJRlkxTENCelpYQWdQU0JjWEY5Y1hDa3BYRzVjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2FXUWdKV2x1SlNCaktHeHZiM0F1ZFhBa2FXUXNJR3h2YjNBdWJtOGthV1FzSUd4dmIzQXVaRzkzYmlScFpDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0d4dmIzQlVlWEJsSUQwZ1kyRnpaVjkzYUdWdUtHbGtJQ1ZwYmlVZ1l5aHNiMjl3TG5Wd0pHbGtMQ0JzYjI5d0xtNXZKR2xrS1NCK0lGeGNhVzV6Wlc1emFYUnBkbVZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaQ0FsYVc0bElHTW9iRzl2Y0M1a2IzZHVKR2xrS1NCK0lGeGNjMlZ1YzJsMGFYWmxYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ZGSlZSU0IrSUU1QktTbGNibHh1WkdGMFlTQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1oyVnVaU3dnYVdRc0lHeHZiM0JVZVhCbEtTQWxQaVVnZFc1dVpYTjBLR2RsYm1VcElDVStKVnh1SUNCbmNtOTFjRjlpZVNoblpXNWxLU0FsUGlVZ2MzVnRiV0Z5YVhwbEtGeHVJQ0FnSUdsdWMyVnVjMmwwYVhabElEMGdjM1Z0S0d4dmIzQlVlWEJsSUQwOUlGeGNhVzV6Wlc1emFYUnBkbVZjWEN3Z2JtRXVjbTBnUFNCVVVsVkZLU3hjYmlBZ0lDQnpaVzV6YVhScGRtVWdQU0J6ZFcwb2JHOXZjRlI1Y0dVZ1BUMGdYRnh6Wlc1emFYUnBkbVZjWEN3Z2JtRXVjbTBnUFNCVVVsVkZLU2xjYmx4dVhHNWNiaU1qSTF4dVhHNW5jbTkxY0RFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNUzUwYzNaY1hDa3BKR2RsYm1WY2JtZHliM1Z3TWlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhuWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlltbHVZWEo1UjNKdmRYQXlMblJ6ZGx4Y0tTa2taMlZ1WlZ4dVhHNW5aVzVsUjNKdmRYQWdQQzBnZEdsaVlteGxLR2R5YjNWd0lEMGdZeWh5WlhBb1hGeG5jbTkxY0RGY1hDd2diR1Z1WjNSb0tHZHliM1Z3TVNrcExDQnlaWEFvWEZ4bmNtOTFjREpjWEN3Z2JHVnVaM1JvS0dkeWIzVndNaWtwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaMlZ1WlNBOUlHTW9aM0p2ZFhBeExDQm5jbTkxY0RJcEtWeHVYRzVrWVhSaElEd3RJR3hsWm5SZmFtOXBiaWhuWlc1bFIzSnZkWEFzSUdSaGRHRXNJR0o1SUQwZ1l5aGNYR2RsYm1WY1hDa3BJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLRzExZEdGMFpTaGhZM0p2YzNNb1pYWmxjbmwwYUdsdVp5Z3BMQ0IrY21Wd2JHRmpaVjl1WVNndUxDQXdLU2twS1Z4dVhHNWNiaU1qSTF4dVpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLSEJ5WlhObGJtTmxUMlpTWlhSaGFXNWxaQ0E5SUdsbVgyVnNjMlVvYVc1elpXNXphWFJwZG1VZ1BpQXdMQ0JjWEZsRlUxeGNMQ0JjWEU1UFhGd3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndaWEpqVDJaU1pYUmhhVzVsWkNBOUlHbG1YMlZzYzJVb2FXNXpaVzV6YVhScGRtVWdLeUJ6Wlc1emFYUnBkbVVnUFQwZ01Dd2dNQ3dnTVRBd0ttbHVjMlZ1YzJsMGFYWmxMeWhwYm5ObGJuTnBkR2wyWlNBcklITmxibk5wZEdsMlpTa3BLVnh1WEc1Y2JpTWpJMXh1WjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQndaWEpqVDJaU1pYUmhhVzVsWkN3Z1ptbHNiQ0E5SUdkeWIzVndLU2tnS3lCblpXOXRYM1pwYjJ4cGJpZ3BJQ3NnWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2h2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VzSUhkcFpIUm9JRDBnTUM0d05Td2dabWxzYkNBOUlGeGNkMmhwZEdWY1hDa2dLeUIwYUdWdFpWOWlkeWdwWEc1Y2JseHVJeU1qSUZOMFlXTnJaV1FnWW1GeWNHeHZkRnh1WjNKdmRYQWdQQzBnWXloY1hHZHliM1Z3TVZ4Y0xDQmNYR2R5YjNWd01WeGNMQ0JjWEdkeWIzVndNbHhjTENCY1hHZHliM1Z3TWx4Y0tWeHVjSEpsYzJWdVkyVlBabEpsZEdGcGJtVmtJRHd0SUhKbGNDaGpLRnhjV1VWVFhGd3NJRnhjVGs5Y1hDa3NJRElwWEc1d2NtVnpaVzVqWlU5bVVtVjBZV2x1WldRZ1BDMGdabUZqZEc5eUlDaHdjbVZ6Wlc1alpVOW1VbVYwWVdsdVpXUXNJR3hsZG1Wc2N5QTlJR01vWEZ4WlJWTmNYQ3dnWEZ4T1QxeGNLU2xjYm5aaGJIVmxJRHd0SUdNb2JuSnZkeWhrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlGeGNaM0p2ZFhBeFhGd3NJSEJ5WlhObGJtTmxUMlpTWlhSaGFXNWxaQ0E5UFNCY1hGbEZVMXhjS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJRzV5YjNjb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JjWEdkeWIzVndNVnhjTENCd2NtVnpaVzVqWlU5bVVtVjBZV2x1WldRZ1BUMGdYRnhPVDF4Y0tTa3NYRzRnSUNBZ0lDQWdJQ0FnSUc1eWIzY29aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY1hHZHliM1Z3TWx4Y0xDQndjbVZ6Wlc1alpVOW1VbVYwWVdsdVpXUWdQVDBnWEZ4WlJWTmNYQ2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQnVjbTkzS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdYRnhuY205MWNESmNYQ3dnY0hKbGMyVnVZMlZQWmxKbGRHRnBibVZrSUQwOUlGeGNUazljWENrcEtWeHVjR3h2ZEVSaGRHRWdQQzBnWkdGMFlTNW1jbUZ0WlNobmNtOTFjQ3dnY0hKbGMyVnVZMlZQWmxKbGRHRnBibVZrTENCMllXeDFaU2xjYmx4dVoyZHdiRzkwS0hCc2IzUkVZWFJoTENCaFpYTW9abWxzYkQxd2NtVnpaVzVqWlU5bVVtVjBZV2x1WldRc0lIazlkbUZzZFdVc0lIZzlaM0p2ZFhBcEtTQXJJRnh1SUNBZ0lHZGxiMjFmWW1GeUtIQnZjMmwwYVc5dVBWeGNabWxzYkZ4Y0xDQnpkR0YwUFZ4Y2FXUmxiblJwZEhsY1hDa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDbGNibHh1WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLXBlX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yKVxuXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBzaXplLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBzaXplLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoc2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgc2l6ZSwgVjIsIFY1LCBzZXAgPSBcXF9cXCkpXG5cbmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBjKGxvb3AudXAkaWQsIGxvb3Aubm8kaWQsIGxvb3AuZG93biRpZCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvb3BUeXBlID0gY2FzZV93aGVuKGlkICVpbiUgYyhsb29wLnVwJGlkLCBsb29wLm5vJGlkKSB+IFxcaW5zZW5zaXRpdmVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCAlaW4lIGMobG9vcC5kb3duJGlkKSB+IFxcc2Vuc2l0aXZlXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSlcblxuZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZ2VuZSwgaWQsIGxvb3BUeXBlKSAlPiUgdW5uZXN0KGdlbmUpICU+JVxuICBncm91cF9ieShnZW5lKSAlPiUgc3VtbWFyaXplKFxuICAgIGluc2Vuc2l0aXZlID0gc3VtKGxvb3BUeXBlID09IFxcaW5zZW5zaXRpdmVcXCwgbmEucm0gPSBUUlVFKSxcbiAgICBzZW5zaXRpdmUgPSBzdW0obG9vcFR5cGUgPT0gXFxzZW5zaXRpdmVcXCwgbmEucm0gPSBUUlVFKSlcblxuXG5cbiMjI1xuXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5nZW5lR3JvdXAgPC0gdGliYmxlKGdyb3VwID0gYyhyZXAoXFxncm91cDFcXCwgbGVuZ3RoKGdyb3VwMSkpLCByZXAoXFxncm91cDJcXCwgbGVuZ3RoKGdyb3VwMikpKSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZSA9IGMoZ3JvdXAxLCBncm91cDIpKVxuXG5kYXRhIDwtIGxlZnRfam9pbihnZW5lR3JvdXAsIGRhdGEsIGJ5ID0gYyhcXGdlbmVcXCkpICU+JSBkcGx5cjo6bXV0YXRlKG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCB+cmVwbGFjZV9uYSguLCAwKSkpKVxuXG5cbiMjI1xuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKHByZXNlbmNlT2ZSZXRhaW5lZCA9IGlmX2Vsc2UoaW5zZW5zaXRpdmUgPiAwLCBcXFlFU1xcLCBcXE5PXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICBwZXJjT2ZSZXRhaW5lZCA9IGlmX2Vsc2UoaW5zZW5zaXRpdmUgKyBzZW5zaXRpdmUgPT0gMCwgMCwgMTAwKmluc2Vuc2l0aXZlLyhpbnNlbnNpdGl2ZSArIHNlbnNpdGl2ZSkpKVxuXG5cbiMjI1xuZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBwZXJjT2ZSZXRhaW5lZCwgZmlsbCA9IGdyb3VwKSkgKyBnZW9tX3Zpb2xpbigpICsgXG4gIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4wNSwgZmlsbCA9IFxcd2hpdGVcXCkgKyB0aGVtZV9idygpXG5cblxuIyMjIFN0YWNrZWQgYmFycGxvdFxuZ3JvdXAgPC0gYyhcXGdyb3VwMVxcLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcLCBcXGdyb3VwMlxcKVxucHJlc2VuY2VPZlJldGFpbmVkIDwtIHJlcChjKFxcWUVTXFwsIFxcTk9cXCksIDIpXG5wcmVzZW5jZU9mUmV0YWluZWQgPC0gZmFjdG9yIChwcmVzZW5jZU9mUmV0YWluZWQsIGxldmVscyA9IGMoXFxZRVNcXCwgXFxOT1xcKSlcbnZhbHVlIDwtIGMobnJvdyhkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXAxXFwsIHByZXNlbmNlT2ZSZXRhaW5lZCA9PSBcXFlFU1xcKSksXG4gICAgICAgICAgIG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMVxcLCBwcmVzZW5jZU9mUmV0YWluZWQgPT0gXFxOT1xcKSksXG4gICAgICAgICAgIG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMlxcLCBwcmVzZW5jZU9mUmV0YWluZWQgPT0gXFxZRVNcXCkpLFxuICAgICAgICAgICBucm93KGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDJcXCwgcHJlc2VuY2VPZlJldGFpbmVkID09IFxcTk9cXCkpKVxucGxvdERhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgcHJlc2VuY2VPZlJldGFpbmVkLCB2YWx1ZSlcblxuZ2dwbG90KHBsb3REYXRhLCBhZXMoZmlsbD1wcmVzZW5jZU9mUmV0YWluZWQsIHk9dmFsdWUsIHg9Z3JvdXApKSArIFxuICAgIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcLCBzdGF0PVxcaWRlbnRpdHlcXCkgKyB0aGVtZV9jbGFzc2ljKClcblxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLXBlX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yKVxuXG5cbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBzaXplLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBzaXplLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoc2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgc2l6ZSwgVjIsIFY1LCBzZXAgPSBcXF9cXCkpXG5cbmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBjKGxvb3AudXAkaWQsIGxvb3Aubm8kaWQsIGxvb3AuZG93biRpZCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvb3BUeXBlID0gY2FzZV93aGVuKGlkICVpbiUgYyhsb29wLnVwJGlkLCBsb29wLm5vJGlkKSB+IFxcaW5zZW5zaXRpdmVcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCAlaW4lIGMobG9vcC5kb3duJGlkKSB+IFxcc2Vuc2l0aXZlXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSlcblxuZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZ2VuZSwgaWQsIGxvb3BUeXBlKSAlPiUgdW5uZXN0KGdlbmUpICU+JVxuICBncm91cF9ieShnZW5lKSAlPiUgc3VtbWFyaXplKFxuICAgIGluc2Vuc2l0aXZlID0gc3VtKGxvb3BUeXBlID09IFxcaW5zZW5zaXRpdmVcXCwgbmEucm0gPSBUUlVFKSxcbiAgICBzZW5zaXRpdmUgPSBzdW0obG9vcFR5cGUgPT0gXFxzZW5zaXRpdmVcXCwgbmEucm0gPSBUUlVFKSlcblxuXG5cbiMjI1xuXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5nZW5lR3JvdXAgPC0gdGliYmxlKGdyb3VwID0gYyhyZXAoXFxncm91cDFcXCwgbGVuZ3RoKGdyb3VwMSkpLCByZXAoXFxncm91cDJcXCwgbGVuZ3RoKGdyb3VwMikpKSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZSA9IGMoZ3JvdXAxLCBncm91cDIpKVxuXG5kYXRhIDwtIGxlZnRfam9pbihnZW5lR3JvdXAsIGRhdGEsIGJ5ID0gYyhcXGdlbmVcXCkpICU+JSBkcGx5cjo6bXV0YXRlKG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCB+cmVwbGFjZV9uYSguLCAwKSkpKVxuXG5cbiMjI1xuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKHByZXNlbmNlT2ZSZXRhaW5lZCA9IGlmX2Vsc2UoaW5zZW5zaXRpdmUgPiAwLCBcXFlFU1xcLCBcXE5PXFwpLFxuICAgICAgICAgICAgICAgICAgICAgICBwZXJjT2ZSZXRhaW5lZCA9IGlmX2Vsc2UoaW5zZW5zaXRpdmUgKyBzZW5zaXRpdmUgPT0gMCwgMCwgMTAwKmluc2Vuc2l0aXZlLyhpbnNlbnNpdGl2ZSArIHNlbnNpdGl2ZSkpKVxuXG5cbiMjI1xuZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBwZXJjT2ZSZXRhaW5lZCwgZmlsbCA9IGdyb3VwKSkgKyBnZW9tX3Zpb2xpbigpICsgXG4gIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4wNSwgZmlsbCA9IFxcd2hpdGVcXCkgKyB0aGVtZV9idygpXG5cblxuIyMjIFN0YWNrZWQgYmFycGxvdFxuZ3JvdXAgPC0gYyhcXGdyb3VwMVxcLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcLCBcXGdyb3VwMlxcKVxucHJlc2VuY2VPZlJldGFpbmVkIDwtIHJlcChjKFxcWUVTXFwsIFxcTk9cXCksIDIpXG5wcmVzZW5jZU9mUmV0YWluZWQgPC0gZmFjdG9yIChwcmVzZW5jZU9mUmV0YWluZWQsIGxldmVscyA9IGMoXFxZRVNcXCwgXFxOT1xcKSlcbnZhbHVlIDwtIGMobnJvdyhkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXAxXFwsIHByZXNlbmNlT2ZSZXRhaW5lZCA9PSBcXFlFU1xcKSksXG4gICAgICAgICAgIG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMVxcLCBwcmVzZW5jZU9mUmV0YWluZWQgPT0gXFxOT1xcKSksXG4gICAgICAgICAgIG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXGdyb3VwMlxcLCBwcmVzZW5jZU9mUmV0YWluZWQgPT0gXFxZRVNcXCkpLFxuICAgICAgICAgICBucm93KGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDJcXCwgcHJlc2VuY2VPZlJldGFpbmVkID09IFxcTk9cXCkpKVxucGxvdERhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgcHJlc2VuY2VPZlJldGFpbmVkLCB2YWx1ZSlcblxuZ2dwbG90KHBsb3REYXRhLCBhZXMoZmlsbD1wcmVzZW5jZU9mUmV0YWluZWQsIHk9dmFsdWUsIHg9Z3JvdXApKSArIFxuICAgIGdlb21fYmFyKHBvc2l0aW9uPVxcZmlsbFxcLCBzdGF0PVxcaWRlbnRpdHlcXCkgKyB0aGVtZV9jbGFzc2ljKClcblxuXG5gYGBcbmBgYCJ9 -->

```r
```r
name <- \chromo_cons_annoHierarchy\
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-pe_ensemblList.tsv\)),
                                 diffCutoff = 0.2)


loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>%
  dplyr::mutate(size = V3 - V2,
                id = paste(V1, size, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>%
  dplyr::mutate(size = V3 - V2,
                id = paste(V1, size, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>%
  dplyr::mutate(size = V3 - V2,
                id = paste(V1, size, V2, V5, sep = \_\))

geneAnnoData <- geneAnnoData %>% dplyr::filter(id %in% c(loop.up$id, loop.no$id, loop.down$id)) %>%
  dplyr::mutate(loopType = case_when(id %in% c(loop.up$id, loop.no$id) ~ \insensitive\,
                                     id %in% c(loop.down$id) ~ \sensitive\,
                                     TRUE ~ NA))

data <- geneAnnoData %>% dplyr::select(gene, id, loopType) %>% unnest(gene) %>%
  group_by(gene) %>% summarize(
    insensitive = sum(loopType == \insensitive\, na.rm = TRUE),
    sensitive = sum(loopType == \sensitive\, na.rm = TRUE))



###

group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

geneGroup <- tibble(group = c(rep(\group1\, length(group1)), rep(\group2\, length(group2))),
                    gene = c(group1, group2))

data <- left_join(geneGroup, data, by = c(\gene\)) %>% dplyr::mutate(mutate(across(everything(), ~replace_na(., 0))))


###
data <- data %>% dplyr::mutate(presenceOfRetained = if_else(insensitive > 0, \YES\, \NO\),
                       percOfRetained = if_else(insensitive + sensitive == 0, 0, 100*insensitive/(insensitive + sensitive)))


###
ggplot(data, aes(x = group, y = percOfRetained, fill = group)) + geom_violin() + 
  geom_boxplot(outlier.shape = NA, width = 0.05, fill = \white\) + theme_bw()


### Stacked barplot
group <- c(\group1\, \group1\, \group2\, \group2\)
presenceOfRetained <- rep(c(\YES\, \NO\), 2)
presenceOfRetained <- factor (presenceOfRetained, levels = c(\YES\, \NO\))
value <- c(nrow(data %>% dplyr::filter(group == \group1\, presenceOfRetained == \YES\)),
           nrow(data %>% dplyr::filter(group == \group1\, presenceOfRetained == \NO\)),
           nrow(data %>% dplyr::filter(group == \group2\, presenceOfRetained == \YES\)),
           nrow(data %>% dplyr::filter(group == \group2\, presenceOfRetained == \NO\)))
plotData <- data.frame(group, presenceOfRetained, value)

ggplot(plotData, aes(fill=presenceOfRetained, y=value, x=group)) + 
    geom_bar(position=\fill\, stat=\identity\) + theme_classic()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




### [2.24] (WORKING ON)Checking the percentage of non-important loops
Idea: having one non-perturbed reg loops could be enough.

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHViRzl2Y0hNZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mYzJOdmNtVXVkSE4yWENJcEtWeHVYRzV6WVcxd2JHVWdQQzBnWENKSE1TNUVUVk5QTGsxbGNtZGxaRndpWEc1bWIzSW9jMkZ0Y0d4bElHbHVJR01vWENKSE1TNUVUVk5QTGsxbGNtZGxaRndpTENCY0lrY3hMbVJVUVVjdVRXVnlaMlZrWENJc0lGd2lSekV1UVRRNE5TNU5aWEpuWldSY0lpa3BlMXh1SUNCMFpXMXdMakkxYTJJZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNoY0lteHZiM0JUWTI5eVpWOWNJaXdnYzJGdGNHeGxMQ0JjSWw4eU5XdGlMblJ6ZGx3aUtTa3BJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb1ltbHVVMmw2WlNBOUlHVnVaREVnTFNCemRHRnlkREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFpDQTlJSEJoYzNSbEtHTm9jbTl0TVN3Z1ltbHVVMmw2WlN3Z2MzUmhjblF4TENCemRHRnlkRElzSUhObGNDQTlJRndpWDF3aUtTa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tWnBiSFJsY2locFpDQWxhVzRsSUd4dmIzQnpKR2xrS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82YzJWc1pXTjBLR05vY205dE1Td2djM1JoY25ReExDQmxibVF4TENCamFISnZiVElzSUhOMFlYSjBNaXdnWlc1a01pd2dhV1FzSUc5aWMyVnlkbVZrTENCY0lrOHZSVndpS1Z4dUlDQmpiMnh1WVcxbGN5aDBaVzF3TGpJMWEySXBJRHd0SUdNb1hDSmphSEp2YlRGY0lpd2dYQ0p6ZEdGeWRERmNJaXdnWENKbGJtUXhYQ0lzSUZ3aVkyaHliMjB5WENJc0lGd2ljM1JoY25ReVhDSXNJRndpWlc1a01sd2lMQ0JjSW1sa1hDSXNJRndpYjJKelhDSXNJRndpYjJKelpYaHdYQ0lwWEc0Z0lGeHVJQ0IwWlcxd0xqRXdhMklnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUhCaGMzUmxNQ2hjSW14dmIzQlRZMjl5WlY5Y0lpd2djMkZ0Y0d4bExDQmNJbDh4TUd0aUxuUnpkbHdpS1NrcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvWW1sdVUybDZaU0E5SUdWdVpERWdMU0J6ZEdGeWRERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlIQmhjM1JsS0dOb2NtOXRNU3dnWW1sdVUybDZaU3dnYzNSaGNuUXhMQ0J6ZEdGeWRESXNJSE5sY0NBOUlGd2lYMXdpS1NrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T21acGJIUmxjaWhwWkNBbGFXNGxJR3h2YjNCekpHbGtLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZjMlZzWldOMEtHTm9jbTl0TVN3Z2MzUmhjblF4TENCbGJtUXhMQ0JqYUhKdmJUSXNJSE4wWVhKME1pd2daVzVrTWl3Z2FXUXNJRzlpYzJWeWRtVmtMQ0JjSWs4dlJWd2lLVnh1SUNCamIyeHVZVzFsY3loMFpXMXdMakV3YTJJcElEd3RJR01vWENKamFISnZiVEZjSWl3Z1hDSnpkR0Z5ZERGY0lpd2dYQ0psYm1ReFhDSXNJRndpWTJoeWIyMHlYQ0lzSUZ3aWMzUmhjblF5WENJc0lGd2laVzVrTWx3aUxDQmNJbWxrWENJc0lGd2liMkp6WENJc0lGd2liMkp6Wlhod1hDSXBYRzRnSUZ4dUlDQjBaVzF3TGpWcllpQThMV1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb1hDSnNiMjl3VTJOdmNtVmZYQ0lzSUhOaGJYQnNaU3dnWENKZk5XdGlMblJ6ZGx3aUtTa3BJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb1ltbHVVMmw2WlNBOUlHVnVaREVnTFNCemRHRnlkREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFpDQTlJSEJoYzNSbEtHTm9jbTl0TVN3Z1ltbHVVMmw2WlN3Z2MzUmhjblF4TENCemRHRnlkRElzSUhObGNDQTlJRndpWDF3aUtTa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tWnBiSFJsY2locFpDQWxhVzRsSUd4dmIzQnpKR2xrS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82YzJWc1pXTjBLR05vY205dE1Td2djM1JoY25ReExDQmxibVF4TENCamFISnZiVElzSUhOMFlYSjBNaXdnWlc1a01pd2dhV1FzSUc5aWMyVnlkbVZrTENCY0lrOHZSVndpS1Z4dUlDQmpiMnh1WVcxbGN5aDBaVzF3TGpWcllpa2dQQzBnWXloY0ltTm9jbTl0TVZ3aUxDQmNJbk4wWVhKME1Wd2lMQ0JjSW1WdVpERmNJaXdnWENKamFISnZiVEpjSWl3Z1hDSnpkR0Z5ZERKY0lpd2dYQ0psYm1ReVhDSXNJRndpYVdSY0lpd2dYQ0p2WW5OY0lpd2dYQ0p2WW5ObGVIQmNJaWxjYmlBZ1hHNGdJSFJsYlhBZ1BDMGdZbWx1WkY5eWIzZHpLSFJsYlhBdU1qVnJZaXdnZEdWdGNDNHhNR3RpTENCMFpXMXdMalZyWWlsY2JpQWdabmR5YVhSbEtIUmxiWEFzSUdobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvWENKc2IyOXdVMk52Y21WZlhDSXNJSE5oYlhCc1pTd2dYQ0l1ZEhOMlhDSXBLU3dnYzJWd0lEMGdYQ0pjWEhSY0lpbGNibjFjYmx4dVhHNTBaVzF3TGtSTlUwOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpYkc5dmNGTmpiM0psWDBjeExrUk5VMDh1VFdWeVoyVmtMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvYVdRc0lHOWljeXdnYjJKelpYaHdLVnh1WTI5c2JtRnRaWE1vZEdWdGNDNUVUVk5QS1NBOExTQmpLRndpYVdSY0lpd2dYQ0p2WW5OZlJFMVRUMXdpTENCY0ltOWljMlY0Y0Y5RVRWTlBYQ0lwWEc1MFpXMXdMbVJVUVVjZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2liRzl2Y0ZOamIzSmxYMGN4TG1SVVFVY3VUV1Z5WjJWa0xuUnpkbHdpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9hV1FzSUc5aWN5d2diMkp6Wlhod0tWeHVZMjlzYm1GdFpYTW9kR1Z0Y0M1a1ZFRkhLU0E4TFNCaktGd2lhV1JjSWl3Z1hDSnZZbk5mWkZSQlIxd2lMQ0JjSW05aWMyVjRjRjlrVkVGSFhDSXBYRzUwWlcxd0xrRTBPRFVnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aWJHOXZjRk5qYjNKbFgwY3hMa0UwT0RVdVRXVnlaMlZrTG5SemRsd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb2FXUXNJRzlpY3l3Z2IySnpaWGh3S1Z4dVkyOXNibUZ0WlhNb2RHVnRjQzVCTkRnMUtTQThMU0JqS0Z3aWFXUmNJaXdnWENKdlluTmZRVFE0TlZ3aUxDQmNJbTlpYzJWNGNGOUJORGcxWENJcFhHNWNibXh2YjNCelgyOWxJRHd0SUdaMWJHeGZhbTlwYmlobWRXeHNYMnB2YVc0b2RHVnRjQzVFVFZOUExDQjBaVzF3TG1SVVFVY3NJR0o1SUQwZ1hDSnBaRndpS1N4Y2JpQWdJQ0FnSUNBZ0lDQjBaVzF3TGtFME9EVXNJR0o1SUQwZ1hDSnBaRndpS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaHZaVVpEWDJSVVFVZGZSRTFUVHlBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDBSTlUwOGdQVDBnTUN3Z1RrRXNJRzlpYzJWNGNGOWtWRUZITDI5aWMyVjRjRjlFVFZOUEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZaVVpEWDBFME9EVmZSRTFUVHlBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDBSTlUwOGdQVDBnTUN3Z1RrRXNJRzlpYzJWNGNGOUJORGcxTDI5aWMyVjRjRjlFVFZOUEtTbGNibHh1Wm5keWFYUmxLR3h2YjNCelgyOWxMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRndpYkc5dmNGTmpiM0psWDJOdmJuTmZiMkp6Wlhod0xuUnpkbHdpS1Nrc0lITmxjQ0E5SUZ3aVhGeDBYQ0lwWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5sb29wcyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZS50c3ZcXCkpXG5cbnNhbXBsZSA8LSBcXEcxLkRNU08uTWVyZ2VkXFxcbmZvcihzYW1wbGUgaW4gYyhcXEcxLkRNU08uTWVyZ2VkXFwsIFxcRzEuZFRBRy5NZXJnZWRcXCwgXFxHMS5BNDg1Lk1lcmdlZFxcKSl7XG4gIHRlbXAuMjVrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcXzI1a2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuMjVrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAuMTBrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcXzEwa2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuMTBrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAuNWtiIDwtZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXF81a2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuNWtiKSA8LSBjKFxcY2hyb20xXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocm9tMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCwgXFxpZFxcLCBcXG9ic1xcLCBcXG9ic2V4cFxcKVxuICBcbiAgdGVtcCA8LSBiaW5kX3Jvd3ModGVtcC4yNWtiLCB0ZW1wLjEwa2IsIHRlbXAuNWtiKVxuICBmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXC50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxufVxuXG5cbnRlbXAuRE1TTyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxsb29wU2NvcmVfRzEuRE1TTy5NZXJnZWQudHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgb2JzLCBvYnNleHApXG5jb2xuYW1lcyh0ZW1wLkRNU08pIDwtIGMoXFxpZFxcLCBcXG9ic19ETVNPXFwsIFxcb2JzZXhwX0RNU09cXClcbnRlbXAuZFRBRyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxsb29wU2NvcmVfRzEuZFRBRy5NZXJnZWQudHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgb2JzLCBvYnNleHApXG5jb2xuYW1lcyh0ZW1wLmRUQUcpIDwtIGMoXFxpZFxcLCBcXG9ic19kVEFHXFwsIFxcb2JzZXhwX2RUQUdcXClcbnRlbXAuQTQ4NSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxsb29wU2NvcmVfRzEuQTQ4NS5NZXJnZWQudHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgb2JzLCBvYnNleHApXG5jb2xuYW1lcyh0ZW1wLkE0ODUpIDwtIGMoXFxpZFxcLCBcXG9ic19BNDg1XFwsIFxcb2JzZXhwX0E0ODVcXClcblxubG9vcHNfb2UgPC0gZnVsbF9qb2luKGZ1bGxfam9pbih0ZW1wLkRNU08sIHRlbXAuZFRBRywgYnkgPSBcXGlkXFwpLFxuICAgICAgICAgIHRlbXAuQTQ4NSwgYnkgPSBcXGlkXFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKG9lRkNfZFRBR19ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBOQSwgb2JzZXhwX2RUQUcvb2JzZXhwX0RNU08pLFxuICAgICAgICAgICAgICAgIG9lRkNfQTQ4NV9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBOQSwgb2JzZXhwX0E0ODUvb2JzZXhwX0RNU08pKVxuXG5md3JpdGUobG9vcHNfb2UsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
loops <- fread(here(consensusDir, \chromo_cons_score.tsv\))

sample <- \G1.DMSO.Merged\
for(sample in c(\G1.DMSO.Merged\, \G1.dTAG.Merged\, \G1.A485.Merged\)){
  temp.25kb <- fread(here(consensusDir, paste0(\loopScore_\, sample, \_25kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.25kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp.10kb <- fread(here(consensusDir, paste0(\loopScore_\, sample, \_10kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.10kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp.5kb <-fread(here(consensusDir, paste0(\loopScore_\, sample, \_5kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.5kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp <- bind_rows(temp.25kb, temp.10kb, temp.5kb)
  fwrite(temp, here(consensusDir, paste0(\loopScore_\, sample, \.tsv\)), sep = \\t\)
}


temp.DMSO <- fread(here(consensusDir, \loopScore_G1.DMSO.Merged.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.DMSO) <- c(\id\, \obs_DMSO\, \obsexp_DMSO\)
temp.dTAG <- fread(here(consensusDir, \loopScore_G1.dTAG.Merged.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.dTAG) <- c(\id\, \obs_dTAG\, \obsexp_dTAG\)
temp.A485 <- fread(here(consensusDir, \loopScore_G1.A485.Merged.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.A485) <- c(\id\, \obs_A485\, \obsexp_A485\)

loops_oe <- full_join(full_join(temp.DMSO, temp.dTAG, by = \id\),
          temp.A485, by = \id\) %>%
  dplyr::mutate(oeFC_dTAG_DMSO = if_else(obsexp_DMSO == 0, NA, obsexp_dTAG/obsexp_DMSO),
                oeFC_A485_DMSO = if_else(obsexp_DMSO == 0, NA, obsexp_A485/obsexp_DMSO))

fwrite(loops_oe, here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\)), sep = \\t\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJHOXZjSE1nUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZjMk52Y21VdWRITjJYRndwS1Z4dVhHNXpZVzF3YkdVZ1BDMGdYRnhITVM1RVRWTlBMazFsY21kbFpGeGNYRzVtYjNJb2MyRnRjR3hsSUdsdUlHTW9YRnhITVM1RVRWTlBMazFsY21kbFpGeGNMQ0JjWEVjeExtUlVRVWN1VFdWeVoyVmtYRndzSUZ4Y1J6RXVRVFE0TlM1TlpYSm5aV1JjWENrcGUxeHVJQ0IwWlcxd0xqSTFhMklnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUhCaGMzUmxNQ2hjWEd4dmIzQlRZMjl5WlY5Y1hDd2djMkZ0Y0d4bExDQmNYRjh5Tld0aUxuUnpkbHhjS1NrcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvWW1sdVUybDZaU0E5SUdWdVpERWdMU0J6ZEdGeWRERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlIQmhjM1JsS0dOb2NtOXRNU3dnWW1sdVUybDZaU3dnYzNSaGNuUXhMQ0J6ZEdGeWRESXNJSE5sY0NBOUlGeGNYMXhjS1NrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T21acGJIUmxjaWhwWkNBbGFXNGxJR3h2YjNCekpHbGtLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZjMlZzWldOMEtHTm9jbTl0TVN3Z2MzUmhjblF4TENCbGJtUXhMQ0JqYUhKdmJUSXNJSE4wWVhKME1pd2daVzVrTWl3Z2FXUXNJRzlpYzJWeWRtVmtMQ0JjWEU4dlJWeGNLVnh1SUNCamIyeHVZVzFsY3loMFpXMXdMakkxYTJJcElEd3RJR01vWEZ4amFISnZiVEZjWEN3Z1hGeHpkR0Z5ZERGY1hDd2dYRnhsYm1ReFhGd3NJRnhjWTJoeWIyMHlYRndzSUZ4Y2MzUmhjblF5WEZ3c0lGeGNaVzVrTWx4Y0xDQmNYR2xrWEZ3c0lGeGNiMkp6WEZ3c0lGeGNiMkp6Wlhod1hGd3BYRzRnSUZ4dUlDQjBaVzF3TGpFd2EySWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaGNYR3h2YjNCVFkyOXlaVjljWEN3Z2MyRnRjR3hsTENCY1hGOHhNR3RpTG5SemRseGNLU2twSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB0ZFhSaGRHVW9ZbWx1VTJsNlpTQTlJR1Z1WkRFZ0xTQnpkR0Z5ZERFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaQ0E5SUhCaGMzUmxLR05vY205dE1Td2dZbWx1VTJsNlpTd2djM1JoY25ReExDQnpkR0Z5ZERJc0lITmxjQ0E5SUZ4Y1gxeGNLU2tnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbVpwYkhSbGNpaHBaQ0FsYVc0bElHeHZiM0J6Skdsa0tTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNmMyVnNaV04wS0dOb2NtOXRNU3dnYzNSaGNuUXhMQ0JsYm1ReExDQmphSEp2YlRJc0lITjBZWEowTWl3Z1pXNWtNaXdnYVdRc0lHOWljMlZ5ZG1Wa0xDQmNYRTh2UlZ4Y0tWeHVJQ0JqYjJ4dVlXMWxjeWgwWlcxd0xqRXdhMklwSUR3dElHTW9YRnhqYUhKdmJURmNYQ3dnWEZ4emRHRnlkREZjWEN3Z1hGeGxibVF4WEZ3c0lGeGNZMmh5YjIweVhGd3NJRnhjYzNSaGNuUXlYRndzSUZ4Y1pXNWtNbHhjTENCY1hHbGtYRndzSUZ4Y2IySnpYRndzSUZ4Y2IySnpaWGh3WEZ3cFhHNGdJRnh1SUNCMFpXMXdMalZyWWlBOExXWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvWEZ4c2IyOXdVMk52Y21WZlhGd3NJSE5oYlhCc1pTd2dYRnhmTld0aUxuUnpkbHhjS1NrcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvWW1sdVUybDZaU0E5SUdWdVpERWdMU0J6ZEdGeWRERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlIQmhjM1JsS0dOb2NtOXRNU3dnWW1sdVUybDZaU3dnYzNSaGNuUXhMQ0J6ZEdGeWRESXNJSE5sY0NBOUlGeGNYMXhjS1NrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T21acGJIUmxjaWhwWkNBbGFXNGxJR3h2YjNCekpHbGtLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZjMlZzWldOMEtHTm9jbTl0TVN3Z2MzUmhjblF4TENCbGJtUXhMQ0JqYUhKdmJUSXNJSE4wWVhKME1pd2daVzVrTWl3Z2FXUXNJRzlpYzJWeWRtVmtMQ0JjWEU4dlJWeGNLVnh1SUNCamIyeHVZVzFsY3loMFpXMXdMalZyWWlrZ1BDMGdZeWhjWEdOb2NtOXRNVnhjTENCY1hITjBZWEowTVZ4Y0xDQmNYR1Z1WkRGY1hDd2dYRnhqYUhKdmJUSmNYQ3dnWEZ4emRHRnlkREpjWEN3Z1hGeGxibVF5WEZ3c0lGeGNhV1JjWEN3Z1hGeHZZbk5jWEN3Z1hGeHZZbk5sZUhCY1hDbGNiaUFnWEc0Z0lIUmxiWEFnUEMwZ1ltbHVaRjl5YjNkektIUmxiWEF1TWpWcllpd2dkR1Z0Y0M0eE1HdGlMQ0IwWlcxd0xqVnJZaWxjYmlBZ1puZHlhWFJsS0hSbGJYQXNJR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9YRnhzYjI5d1UyTnZjbVZmWEZ3c0lITmhiWEJzWlN3Z1hGd3VkSE4yWEZ3cEtTd2djMlZ3SUQwZ1hGeGNYSFJjWENsY2JuMWNibHh1WEc1MFpXMXdMa1JOVTA4Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNiRzl2Y0ZOamIzSmxYMGN4TGtSTlUwOHVUV1Z5WjJWa0xuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9hV1FzSUc5aWN5d2diMkp6Wlhod0tWeHVZMjlzYm1GdFpYTW9kR1Z0Y0M1RVRWTlBLU0E4TFNCaktGeGNhV1JjWEN3Z1hGeHZZbk5mUkUxVFQxeGNMQ0JjWEc5aWMyVjRjRjlFVFZOUFhGd3BYRzUwWlcxd0xtUlVRVWNnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y2JHOXZjRk5qYjNKbFgwY3hMbVJVUVVjdVRXVnlaMlZrTG5SemRseGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb2FXUXNJRzlpY3l3Z2IySnpaWGh3S1Z4dVkyOXNibUZ0WlhNb2RHVnRjQzVrVkVGSEtTQThMU0JqS0Z4Y2FXUmNYQ3dnWEZ4dlluTmZaRlJCUjF4Y0xDQmNYRzlpYzJWNGNGOWtWRUZIWEZ3cFhHNTBaVzF3TGtFME9EVWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjYkc5dmNGTmpiM0psWDBjeExrRTBPRFV1VFdWeVoyVmtMblJ6ZGx4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvYVdRc0lHOWljeXdnYjJKelpYaHdLVnh1WTI5c2JtRnRaWE1vZEdWdGNDNUJORGcxS1NBOExTQmpLRnhjYVdSY1hDd2dYRnh2WW5OZlFUUTROVnhjTENCY1hHOWljMlY0Y0Y5Qk5EZzFYRndwWEc1Y2JteHZiM0J6WDI5bElEd3RJR1oxYkd4ZmFtOXBiaWhtZFd4c1gycHZhVzRvZEdWdGNDNUVUVk5QTENCMFpXMXdMbVJVUVVjc0lHSjVJRDBnWEZ4cFpGeGNLU3hjYmlBZ0lDQWdJQ0FnSUNCMFpXMXdMa0UwT0RVc0lHSjVJRDBnWEZ4cFpGeGNLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNodlpVWkRYMlJVUVVkZlJFMVRUeUE5SUdsbVgyVnNjMlVvYjJKelpYaHdYMFJOVTA4Z1BUMGdNQ3dnVGtFc0lHOWljMlY0Y0Y5a1ZFRkhMMjlpYzJWNGNGOUVUVk5QS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdlpVWkRYMEUwT0RWZlJFMVRUeUE5SUdsbVgyVnNjMlVvYjJKelpYaHdYMFJOVTA4Z1BUMGdNQ3dnVGtFc0lHOWljMlY0Y0Y5Qk5EZzFMMjlpYzJWNGNGOUVUVk5QS1NsY2JseHVabmR5YVhSbEtHeHZiM0J6WDI5bExDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tGeGNiRzl2Y0ZOamIzSmxYMk52Ym5OZmIySnpaWGh3TG5SemRseGNLU2tzSUhObGNDQTlJRnhjWEZ4MFhGd3BYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5sb29wcyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZS50c3ZcXCkpXG5cbnNhbXBsZSA8LSBcXEcxLkRNU08uTWVyZ2VkXFxcbmZvcihzYW1wbGUgaW4gYyhcXEcxLkRNU08uTWVyZ2VkXFwsIFxcRzEuZFRBRy5NZXJnZWRcXCwgXFxHMS5BNDg1Lk1lcmdlZFxcKSl7XG4gIHRlbXAuMjVrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcXzI1a2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuMjVrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAuMTBrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcXzEwa2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuMTBrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAuNWtiIDwtZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXF81a2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuNWtiKSA8LSBjKFxcY2hyb20xXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocm9tMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCwgXFxpZFxcLCBcXG9ic1xcLCBcXG9ic2V4cFxcKVxuICBcbiAgdGVtcCA8LSBiaW5kX3Jvd3ModGVtcC4yNWtiLCB0ZW1wLjEwa2IsIHRlbXAuNWtiKVxuICBmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXC50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxufVxuXG5cbnRlbXAuRE1TTyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxsb29wU2NvcmVfRzEuRE1TTy5NZXJnZWQudHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgb2JzLCBvYnNleHApXG5jb2xuYW1lcyh0ZW1wLkRNU08pIDwtIGMoXFxpZFxcLCBcXG9ic19ETVNPXFwsIFxcb2JzZXhwX0RNU09cXClcbnRlbXAuZFRBRyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxsb29wU2NvcmVfRzEuZFRBRy5NZXJnZWQudHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgb2JzLCBvYnNleHApXG5jb2xuYW1lcyh0ZW1wLmRUQUcpIDwtIGMoXFxpZFxcLCBcXG9ic19kVEFHXFwsIFxcb2JzZXhwX2RUQUdcXClcbnRlbXAuQTQ4NSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxsb29wU2NvcmVfRzEuQTQ4NS5NZXJnZWQudHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChpZCwgb2JzLCBvYnNleHApXG5jb2xuYW1lcyh0ZW1wLkE0ODUpIDwtIGMoXFxpZFxcLCBcXG9ic19BNDg1XFwsIFxcb2JzZXhwX0E0ODVcXClcblxubG9vcHNfb2UgPC0gZnVsbF9qb2luKGZ1bGxfam9pbih0ZW1wLkRNU08sIHRlbXAuZFRBRywgYnkgPSBcXGlkXFwpLFxuICAgICAgICAgIHRlbXAuQTQ4NSwgYnkgPSBcXGlkXFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKG9lRkNfZFRBR19ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBOQSwgb2JzZXhwX2RUQUcvb2JzZXhwX0RNU08pLFxuICAgICAgICAgICAgICAgIG9lRkNfQTQ4NV9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBOQSwgb2JzZXhwX0E0ODUvb2JzZXhwX0RNU08pKVxuXG5md3JpdGUobG9vcHNfb2UsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKVxuXG5zYW1wbGUgPC0gXFxHMS5ETVNPLk1lcmdlZFxcXG5mb3Ioc2FtcGxlIGluIGMoXFxHMS5ETVNPLk1lcmdlZFxcLCBcXEcxLmRUQUcuTWVyZ2VkXFwsIFxcRzEuQTQ4NS5NZXJnZWRcXCkpe1xuICB0ZW1wLjI1a2IgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXF8yNWtiLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKGNocm9tMSwgYmluU2l6ZSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3BzJGlkKSAlPiVcbiAgICBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMiwgaWQsIG9ic2VydmVkLCBcXE8vRVxcKVxuICBjb2xuYW1lcyh0ZW1wLjI1a2IpIDwtIGMoXFxjaHJvbTFcXCwgXFxzdGFydDFcXCwgXFxlbmQxXFwsIFxcY2hyb20yXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcLCBcXGlkXFwsIFxcb2JzXFwsIFxcb2JzZXhwXFwpXG4gIFxuICB0ZW1wLjEwa2IgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXF8xMGtiLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKGNocm9tMSwgYmluU2l6ZSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3BzJGlkKSAlPiVcbiAgICBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMiwgaWQsIG9ic2VydmVkLCBcXE8vRVxcKVxuICBjb2xuYW1lcyh0ZW1wLjEwa2IpIDwtIGMoXFxjaHJvbTFcXCwgXFxzdGFydDFcXCwgXFxlbmQxXFwsIFxcY2hyb20yXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcLCBcXGlkXFwsIFxcb2JzXFwsIFxcb2JzZXhwXFwpXG4gIFxuICB0ZW1wLjVrYiA8LWZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIHNhbXBsZSwgXFxfNWtiLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKGNocm9tMSwgYmluU2l6ZSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3BzJGlkKSAlPiVcbiAgICBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMiwgaWQsIG9ic2VydmVkLCBcXE8vRVxcKVxuICBjb2xuYW1lcyh0ZW1wLjVrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAgPC0gYmluZF9yb3dzKHRlbXAuMjVrYiwgdGVtcC4xMGtiLCB0ZW1wLjVrYilcbiAgZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfXFwsIHNhbXBsZSwgXFwudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcbn1cblxuXG50ZW1wLkRNU08gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcbG9vcFNjb3JlX0cxLkRNU08uTWVyZ2VkLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKVxuY29sbmFtZXModGVtcC5ETVNPKSA8LSBjKFxcaWRcXCwgXFxvYnNfRE1TT1xcLCBcXG9ic2V4cF9ETVNPXFwpXG50ZW1wLmRUQUcgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcbG9vcFNjb3JlX0cxLmRUQUcuTWVyZ2VkLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKVxuY29sbmFtZXModGVtcC5kVEFHKSA8LSBjKFxcaWRcXCwgXFxvYnNfZFRBR1xcLCBcXG9ic2V4cF9kVEFHXFwpXG50ZW1wLkE0ODUgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcbG9vcFNjb3JlX0cxLkE0ODUuTWVyZ2VkLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKVxuY29sbmFtZXModGVtcC5BNDg1KSA8LSBjKFxcaWRcXCwgXFxvYnNfQTQ4NVxcLCBcXG9ic2V4cF9BNDg1XFwpXG5cbmxvb3BzX29lIDwtIGZ1bGxfam9pbihmdWxsX2pvaW4odGVtcC5ETVNPLCB0ZW1wLmRUQUcsIGJ5ID0gXFxpZFxcKSxcbiAgICAgICAgICB0ZW1wLkE0ODUsIGJ5ID0gXFxpZFxcKSAlPiVcbiAgZHBseXI6Om11dGF0ZShvZUZDX2RUQUdfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgTkEsIG9ic2V4cF9kVEFHL29ic2V4cF9ETVNPKSxcbiAgICAgICAgICAgICAgICBvZUZDX0E0ODVfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgTkEsIG9ic2V4cF9BNDg1L29ic2V4cF9ETVNPKSlcblxuZndyaXRlKGxvb3BzX29lLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
loops <- fread(here(consensusDir, \chromo_cons_score.tsv\))

sample <- \G1.DMSO.Merged\
for(sample in c(\G1.DMSO.Merged\, \G1.dTAG.Merged\, \G1.A485.Merged\)){
  temp.25kb <- fread(here(consensusDir, paste0(\loopScore_\, sample, \_25kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.25kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp.10kb <- fread(here(consensusDir, paste0(\loopScore_\, sample, \_10kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.10kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp.5kb <-fread(here(consensusDir, paste0(\loopScore_\, sample, \_5kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.5kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp <- bind_rows(temp.25kb, temp.10kb, temp.5kb)
  fwrite(temp, here(consensusDir, paste0(\loopScore_\, sample, \.tsv\)), sep = \\t\)
}


temp.DMSO <- fread(here(consensusDir, \loopScore_G1.DMSO.Merged.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.DMSO) <- c(\id\, \obs_DMSO\, \obsexp_DMSO\)
temp.dTAG <- fread(here(consensusDir, \loopScore_G1.dTAG.Merged.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.dTAG) <- c(\id\, \obs_dTAG\, \obsexp_dTAG\)
temp.A485 <- fread(here(consensusDir, \loopScore_G1.A485.Merged.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.A485) <- c(\id\, \obs_A485\, \obsexp_A485\)

loops_oe <- full_join(full_join(temp.DMSO, temp.dTAG, by = \id\),
          temp.A485, by = \id\) %>%
  dplyr::mutate(oeFC_dTAG_DMSO = if_else(obsexp_DMSO == 0, NA, obsexp_dTAG/obsexp_DMSO),
                oeFC_A485_DMSO = if_else(obsexp_DMSO == 0, NA, obsexp_A485/obsexp_DMSO))

fwrite(loops_oe, here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\)), sep = \\t\)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHViRzl2Y0hNZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mYzJOdmNtVXVkSE4yWENJcEtWeHVYRzVtYjNJb2MyRnRjR3hsSUdsdUlHTW9YQ0pCYzNsdVl5NVZWRndpTENCY0lrRnplVzVqTGtGSlJGd2lLU2w3WEc0Z0lIUmxiWEF1TWpWcllpQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tGd2liRzl2Y0ZOamIzSmxYMXdpTENCellXMXdiR1VzSUZ3aVh6STFhMkl1ZEhOMlhDSXBLU2tnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbTExZEdGMFpTaGlhVzVUYVhwbElEMGdaVzVrTVNBdElITjBZWEowTVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbGtJRDBnY0dGemRHVW9ZMmh5YjIweExDQmlhVzVUYVhwbExDQnpkR0Z5ZERFc0lITjBZWEowTWl3Z2MyVndJRDBnWENKZlhDSXBLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZabWxzZEdWeUtHbGtJQ1ZwYmlVZ2JHOXZjSE1rYVdRcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwelpXeGxZM1FvWTJoeWIyMHhMQ0J6ZEdGeWRERXNJR1Z1WkRFc0lHTm9jbTl0TWl3Z2MzUmhjblF5TENCbGJtUXlMQ0JwWkN3Z2IySnpaWEoyWldRc0lGd2lUeTlGWENJcFhHNGdJR052Ykc1aGJXVnpLSFJsYlhBdU1qVnJZaWtnUEMwZ1l5aGNJbU5vY205dE1Wd2lMQ0JjSW5OMFlYSjBNVndpTENCY0ltVnVaREZjSWl3Z1hDSmphSEp2YlRKY0lpd2dYQ0p6ZEdGeWRESmNJaXdnWENKbGJtUXlYQ0lzSUZ3aWFXUmNJaXdnWENKdlluTmNJaXdnWENKdlluTmxlSEJjSWlsY2JpQWdYRzRnSUhSbGJYQXVNVEJyWWlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0Z3aWJHOXZjRk5qYjNKbFgxd2lMQ0J6WVcxd2JHVXNJRndpWHpFd2EySXVkSE4yWENJcEtTa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tMTFkR0YwWlNoaWFXNVRhWHBsSUQwZ1pXNWtNU0F0SUhOMFlYSjBNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsa0lEMGdjR0Z6ZEdVb1kyaHliMjB4TENCaWFXNVRhWHBsTENCemRHRnlkREVzSUhOMFlYSjBNaXdnYzJWd0lEMGdYQ0pmWENJcEtTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0dsa0lDVnBiaVVnYkc5dmNITWthV1FwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB6Wld4bFkzUW9ZMmh5YjIweExDQnpkR0Z5ZERFc0lHVnVaREVzSUdOb2NtOXRNaXdnYzNSaGNuUXlMQ0JsYm1ReUxDQnBaQ3dnYjJKelpYSjJaV1FzSUZ3aVR5OUZYQ0lwWEc0Z0lHTnZiRzVoYldWektIUmxiWEF1TVRCcllpa2dQQzBnWXloY0ltTm9jbTl0TVZ3aUxDQmNJbk4wWVhKME1Wd2lMQ0JjSW1WdVpERmNJaXdnWENKamFISnZiVEpjSWl3Z1hDSnpkR0Z5ZERKY0lpd2dYQ0psYm1ReVhDSXNJRndpYVdSY0lpd2dYQ0p2WW5OY0lpd2dYQ0p2WW5ObGVIQmNJaWxjYmlBZ1hHNGdJSFJsYlhBdU5XdGlJRHd0Wm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaGNJbXh2YjNCVFkyOXlaVjljSWl3Z2MyRnRjR3hsTENCY0lsODFhMkl1ZEhOMlhDSXBLU2tnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbTExZEdGMFpTaGlhVzVUYVhwbElEMGdaVzVrTVNBdElITjBZWEowTVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbGtJRDBnY0dGemRHVW9ZMmh5YjIweExDQmlhVzVUYVhwbExDQnpkR0Z5ZERFc0lITjBZWEowTWl3Z2MyVndJRDBnWENKZlhDSXBLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZabWxzZEdWeUtHbGtJQ1ZwYmlVZ2JHOXZjSE1rYVdRcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwelpXeGxZM1FvWTJoeWIyMHhMQ0J6ZEdGeWRERXNJR1Z1WkRFc0lHTm9jbTl0TWl3Z2MzUmhjblF5TENCbGJtUXlMQ0JwWkN3Z2IySnpaWEoyWldRc0lGd2lUeTlGWENJcFhHNGdJR052Ykc1aGJXVnpLSFJsYlhBdU5XdGlLU0E4TFNCaktGd2lZMmh5YjIweFhDSXNJRndpYzNSaGNuUXhYQ0lzSUZ3aVpXNWtNVndpTENCY0ltTm9jbTl0TWx3aUxDQmNJbk4wWVhKME1sd2lMQ0JjSW1WdVpESmNJaXdnWENKcFpGd2lMQ0JjSW05aWMxd2lMQ0JjSW05aWMyVjRjRndpS1Z4dUlDQmNiaUFnZEdWdGNDQThMU0JpYVc1a1gzSnZkM01vZEdWdGNDNHlOV3RpTENCMFpXMXdMakV3YTJJc0lIUmxiWEF1Tld0aUtWeHVJQ0JtZDNKcGRHVW9kR1Z0Y0N3Z2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNoY0lteHZiM0JUWTI5eVpWOWNJaXdnYzJGdGNHeGxMQ0JjSWk1MGMzWmNJaWtwTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1ZlZ4dVhHNWNiblJsYlhBdVZWUWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpYkc5dmNGTmpiM0psWDBGemVXNWpMbFZVTG5SemRsd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb2FXUXNJRzlpY3l3Z2IySnpaWGh3S1Z4dVkyOXNibUZ0WlhNb2RHVnRjQzVWVkNrZ1BDMGdZeWhjSW1sa1hDSXNJRndpYjJKelgxVlVYQ0lzSUZ3aWIySnpaWGh3WDFWVVhDSXBYRzUwWlcxd0xrRkpSQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKc2IyOXdVMk52Y21WZlFYTjVibU11UVVsRUxuUnpkbHdpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9hV1FzSUc5aWN5d2diMkp6Wlhod0tWeHVZMjlzYm1GdFpYTW9kR1Z0Y0M1QlNVUXBJRHd0SUdNb1hDSnBaRndpTENCY0ltOWljMTlCU1VSY0lpd2dYQ0p2WW5ObGVIQmZRVWxFWENJcFhHNWNibXh2YjNCelgyOWxJRHd0SUdaMWJHeGZhbTlwYmloMFpXMXdMbFZVTENCMFpXMXdMa0ZKUkN3Z1lua2dQU0JjSW1sa1hDSXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0c5bFJrTmZRVWxFWDFWVUlEMGdhV1pmWld4elpTaHZZbk5sZUhCZlZWUWdQVDBnTUN3Z1RrRXNJRzlpYzJWNGNGOUJTVVF2YjJKelpYaHdYMVZVS1NsY2JseHVabmR5YVhSbEtHeHZiM0J6WDI5bExDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tGd2liRzl2Y0ZOamIzSmxYMk52Ym5OZmIySnpaWGh3WDBGemVXNWpMblJ6ZGx3aUtTa3NJSE5sY0NBOUlGd2lYRngwWENJcFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxubG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKVxuXG5mb3Ioc2FtcGxlIGluIGMoXFxBc3luYy5VVFxcLCBcXEFzeW5jLkFJRFxcKSl7XG4gIHRlbXAuMjVrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcXzI1a2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuMjVrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAuMTBrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcXzEwa2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuMTBrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAuNWtiIDwtZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXF81a2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuNWtiKSA8LSBjKFxcY2hyb20xXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocm9tMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCwgXFxpZFxcLCBcXG9ic1xcLCBcXG9ic2V4cFxcKVxuICBcbiAgdGVtcCA8LSBiaW5kX3Jvd3ModGVtcC4yNWtiLCB0ZW1wLjEwa2IsIHRlbXAuNWtiKVxuICBmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXC50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxufVxuXG5cbnRlbXAuVVQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcbG9vcFNjb3JlX0FzeW5jLlVULnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKVxuY29sbmFtZXModGVtcC5VVCkgPC0gYyhcXGlkXFwsIFxcb2JzX1VUXFwsIFxcb2JzZXhwX1VUXFwpXG50ZW1wLkFJRCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxsb29wU2NvcmVfQXN5bmMuQUlELnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKVxuY29sbmFtZXModGVtcC5BSUQpIDwtIGMoXFxpZFxcLCBcXG9ic19BSURcXCwgXFxvYnNleHBfQUlEXFwpXG5cbmxvb3BzX29lIDwtIGZ1bGxfam9pbih0ZW1wLlVULCB0ZW1wLkFJRCwgYnkgPSBcXGlkXFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKG9lRkNfQUlEX1VUID0gaWZfZWxzZShvYnNleHBfVVQgPT0gMCwgTkEsIG9ic2V4cF9BSUQvb2JzZXhwX1VUKSlcblxuZndyaXRlKGxvb3BzX29lLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwX0FzeW5jLnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
loops <- fread(here(consensusDir, \chromo_cons_score.tsv\))

for(sample in c(\Async.UT\, \Async.AID\)){
  temp.25kb <- fread(here(consensusDir, paste0(\loopScore_\, sample, \_25kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.25kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp.10kb <- fread(here(consensusDir, paste0(\loopScore_\, sample, \_10kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.10kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp.5kb <-fread(here(consensusDir, paste0(\loopScore_\, sample, \_5kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.5kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp <- bind_rows(temp.25kb, temp.10kb, temp.5kb)
  fwrite(temp, here(consensusDir, paste0(\loopScore_\, sample, \.tsv\)), sep = \\t\)
}


temp.UT <- fread(here(consensusDir, \loopScore_Async.UT.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.UT) <- c(\id\, \obs_UT\, \obsexp_UT\)
temp.AID <- fread(here(consensusDir, \loopScore_Async.AID.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.AID) <- c(\id\, \obs_AID\, \obsexp_AID\)

loops_oe <- full_join(temp.UT, temp.AID, by = \id\) %>%
  dplyr::mutate(oeFC_AID_UT = if_else(obsexp_UT == 0, NA, obsexp_AID/obsexp_UT))

fwrite(loops_oe, here(consensusDir, paste0(\loopScore_cons_obsexp_Async.tsv\)), sep = \\t\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJHOXZjSE1nUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZjMk52Y21VdWRITjJYRndwS1Z4dVhHNW1iM0lvYzJGdGNHeGxJR2x1SUdNb1hGeEJjM2x1WXk1VlZGeGNMQ0JjWEVGemVXNWpMa0ZKUkZ4Y0tTbDdYRzRnSUhSbGJYQXVNalZyWWlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0Z4Y2JHOXZjRk5qYjNKbFgxeGNMQ0J6WVcxd2JHVXNJRnhjWHpJMWEySXVkSE4yWEZ3cEtTa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tMTFkR0YwWlNoaWFXNVRhWHBsSUQwZ1pXNWtNU0F0SUhOMFlYSjBNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsa0lEMGdjR0Z6ZEdVb1kyaHliMjB4TENCaWFXNVRhWHBsTENCemRHRnlkREVzSUhOMFlYSjBNaXdnYzJWd0lEMGdYRnhmWEZ3cEtTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0dsa0lDVnBiaVVnYkc5dmNITWthV1FwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB6Wld4bFkzUW9ZMmh5YjIweExDQnpkR0Z5ZERFc0lHVnVaREVzSUdOb2NtOXRNaXdnYzNSaGNuUXlMQ0JsYm1ReUxDQnBaQ3dnYjJKelpYSjJaV1FzSUZ4Y1R5OUZYRndwWEc0Z0lHTnZiRzVoYldWektIUmxiWEF1TWpWcllpa2dQQzBnWXloY1hHTm9jbTl0TVZ4Y0xDQmNYSE4wWVhKME1WeGNMQ0JjWEdWdVpERmNYQ3dnWEZ4amFISnZiVEpjWEN3Z1hGeHpkR0Z5ZERKY1hDd2dYRnhsYm1ReVhGd3NJRnhjYVdSY1hDd2dYRnh2WW5OY1hDd2dYRnh2WW5ObGVIQmNYQ2xjYmlBZ1hHNGdJSFJsYlhBdU1UQnJZaUE4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRnhjYkc5dmNGTmpiM0psWDF4Y0xDQnpZVzF3YkdVc0lGeGNYekV3YTJJdWRITjJYRndwS1NrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2hpYVc1VGFYcGxJRDBnWlc1a01TQXRJSE4wWVhKME1TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xrSUQwZ2NHRnpkR1VvWTJoeWIyMHhMQ0JpYVc1VGFYcGxMQ0J6ZEdGeWRERXNJSE4wWVhKME1pd2djMlZ3SUQwZ1hGeGZYRndwS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82Wm1sc2RHVnlLR2xrSUNWcGJpVWdiRzl2Y0hNa2FXUXBJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHpaV3hsWTNRb1kyaHliMjB4TENCemRHRnlkREVzSUdWdVpERXNJR05vY205dE1pd2djM1JoY25ReUxDQmxibVF5TENCcFpDd2diMkp6WlhKMlpXUXNJRnhjVHk5RlhGd3BYRzRnSUdOdmJHNWhiV1Z6S0hSbGJYQXVNVEJyWWlrZ1BDMGdZeWhjWEdOb2NtOXRNVnhjTENCY1hITjBZWEowTVZ4Y0xDQmNYR1Z1WkRGY1hDd2dYRnhqYUhKdmJUSmNYQ3dnWEZ4emRHRnlkREpjWEN3Z1hGeGxibVF5WEZ3c0lGeGNhV1JjWEN3Z1hGeHZZbk5jWEN3Z1hGeHZZbk5sZUhCY1hDbGNiaUFnWEc0Z0lIUmxiWEF1Tld0aUlEd3RabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lIQmhjM1JsTUNoY1hHeHZiM0JUWTI5eVpWOWNYQ3dnYzJGdGNHeGxMQ0JjWEY4MWEySXVkSE4yWEZ3cEtTa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tMTFkR0YwWlNoaWFXNVRhWHBsSUQwZ1pXNWtNU0F0SUhOMFlYSjBNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsa0lEMGdjR0Z6ZEdVb1kyaHliMjB4TENCaWFXNVRhWHBsTENCemRHRnlkREVzSUhOMFlYSjBNaXdnYzJWd0lEMGdYRnhmWEZ3cEtTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0dsa0lDVnBiaVVnYkc5dmNITWthV1FwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB6Wld4bFkzUW9ZMmh5YjIweExDQnpkR0Z5ZERFc0lHVnVaREVzSUdOb2NtOXRNaXdnYzNSaGNuUXlMQ0JsYm1ReUxDQnBaQ3dnYjJKelpYSjJaV1FzSUZ4Y1R5OUZYRndwWEc0Z0lHTnZiRzVoYldWektIUmxiWEF1Tld0aUtTQThMU0JqS0Z4Y1kyaHliMjB4WEZ3c0lGeGNjM1JoY25ReFhGd3NJRnhjWlc1a01WeGNMQ0JjWEdOb2NtOXRNbHhjTENCY1hITjBZWEowTWx4Y0xDQmNYR1Z1WkRKY1hDd2dYRnhwWkZ4Y0xDQmNYRzlpYzF4Y0xDQmNYRzlpYzJWNGNGeGNLVnh1SUNCY2JpQWdkR1Z0Y0NBOExTQmlhVzVrWDNKdmQzTW9kR1Z0Y0M0eU5XdGlMQ0IwWlcxd0xqRXdhMklzSUhSbGJYQXVOV3RpS1Z4dUlDQm1kM0pwZEdVb2RHVnRjQ3dnYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUhCaGMzUmxNQ2hjWEd4dmIzQlRZMjl5WlY5Y1hDd2djMkZ0Y0d4bExDQmNYQzUwYzNaY1hDa3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVmVnh1WEc1Y2JuUmxiWEF1VlZRZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNiRzl2Y0ZOamIzSmxYMEZ6ZVc1akxsVlVMblJ6ZGx4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvYVdRc0lHOWljeXdnYjJKelpYaHdLVnh1WTI5c2JtRnRaWE1vZEdWdGNDNVZWQ2tnUEMwZ1l5aGNYR2xrWEZ3c0lGeGNiMkp6WDFWVVhGd3NJRnhjYjJKelpYaHdYMVZVWEZ3cFhHNTBaVzF3TGtGSlJDQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhzYjI5d1UyTnZjbVZmUVhONWJtTXVRVWxFTG5SemRseGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb2FXUXNJRzlpY3l3Z2IySnpaWGh3S1Z4dVkyOXNibUZ0WlhNb2RHVnRjQzVCU1VRcElEd3RJR01vWEZ4cFpGeGNMQ0JjWEc5aWMxOUJTVVJjWEN3Z1hGeHZZbk5sZUhCZlFVbEVYRndwWEc1Y2JteHZiM0J6WDI5bElEd3RJR1oxYkd4ZmFtOXBiaWgwWlcxd0xsVlVMQ0IwWlcxd0xrRkpSQ3dnWW5rZ1BTQmNYR2xrWEZ3cElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRzlsUmtOZlFVbEVYMVZVSUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmVlZRZ1BUMGdNQ3dnVGtFc0lHOWljMlY0Y0Y5QlNVUXZiMkp6Wlhod1gxVlVLU2xjYmx4dVpuZHlhWFJsS0d4dmIzQnpYMjlsTENCb1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0Z4Y2JHOXZjRk5qYjNKbFgyTnZibk5mYjJKelpYaHdYMEZ6ZVc1akxuUnpkbHhjS1Nrc0lITmxjQ0E5SUZ4Y1hGeDBYRndwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxubG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKVxuXG5mb3Ioc2FtcGxlIGluIGMoXFxBc3luYy5VVFxcLCBcXEFzeW5jLkFJRFxcKSl7XG4gIHRlbXAuMjVrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcXzI1a2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuMjVrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAuMTBrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcXzEwa2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuMTBrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAuNWtiIDwtZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXF81a2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuNWtiKSA8LSBjKFxcY2hyb20xXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocm9tMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCwgXFxpZFxcLCBcXG9ic1xcLCBcXG9ic2V4cFxcKVxuICBcbiAgdGVtcCA8LSBiaW5kX3Jvd3ModGVtcC4yNWtiLCB0ZW1wLjEwa2IsIHRlbXAuNWtiKVxuICBmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXC50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxufVxuXG5cbnRlbXAuVVQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcbG9vcFNjb3JlX0FzeW5jLlVULnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKVxuY29sbmFtZXModGVtcC5VVCkgPC0gYyhcXGlkXFwsIFxcb2JzX1VUXFwsIFxcb2JzZXhwX1VUXFwpXG50ZW1wLkFJRCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxsb29wU2NvcmVfQXN5bmMuQUlELnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKVxuY29sbmFtZXModGVtcC5BSUQpIDwtIGMoXFxpZFxcLCBcXG9ic19BSURcXCwgXFxvYnNleHBfQUlEXFwpXG5cbmxvb3BzX29lIDwtIGZ1bGxfam9pbih0ZW1wLlVULCB0ZW1wLkFJRCwgYnkgPSBcXGlkXFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKG9lRkNfQUlEX1VUID0gaWZfZWxzZShvYnNleHBfVVQgPT0gMCwgTkEsIG9ic2V4cF9BSUQvb2JzZXhwX1VUKSlcblxuZndyaXRlKGxvb3BzX29lLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwX0FzeW5jLnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKVxuXG5mb3Ioc2FtcGxlIGluIGMoXFxBc3luYy5VVFxcLCBcXEFzeW5jLkFJRFxcKSl7XG4gIHRlbXAuMjVrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcXzI1a2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuMjVrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAuMTBrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX1xcLCBzYW1wbGUsIFxcXzEwa2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuMTBrYikgPC0gYyhcXGNocm9tMVxcLCBcXHN0YXJ0MVxcLCBcXGVuZDFcXCwgXFxjaHJvbTJcXCwgXFxzdGFydDJcXCwgXFxlbmQyXFwsIFxcaWRcXCwgXFxvYnNcXCwgXFxvYnNleHBcXClcbiAgXG4gIHRlbXAuNWtiIDwtZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXF81a2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuNWtiKSA8LSBjKFxcY2hyb20xXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXGNocm9tMlxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXCwgXFxpZFxcLCBcXG9ic1xcLCBcXG9ic2V4cFxcKVxuICBcbiAgdGVtcCA8LSBiaW5kX3Jvd3ModGVtcC4yNWtiLCB0ZW1wLjEwa2IsIHRlbXAuNWtiKVxuICBmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9cXCwgc2FtcGxlLCBcXC50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxufVxuXG5cbnRlbXAuVVQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcbG9vcFNjb3JlX0FzeW5jLlVULnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKVxuY29sbmFtZXModGVtcC5VVCkgPC0gYyhcXGlkXFwsIFxcb2JzX1VUXFwsIFxcb2JzZXhwX1VUXFwpXG50ZW1wLkFJRCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxsb29wU2NvcmVfQXN5bmMuQUlELnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKVxuY29sbmFtZXModGVtcC5BSUQpIDwtIGMoXFxpZFxcLCBcXG9ic19BSURcXCwgXFxvYnNleHBfQUlEXFwpXG5cbmxvb3BzX29lIDwtIGZ1bGxfam9pbih0ZW1wLlVULCB0ZW1wLkFJRCwgYnkgPSBcXGlkXFwpICU+JVxuICBkcGx5cjo6bXV0YXRlKG9lRkNfQUlEX1VUID0gaWZfZWxzZShvYnNleHBfVVQgPT0gMCwgTkEsIG9ic2V4cF9BSUQvb2JzZXhwX1VUKSlcblxuZndyaXRlKGxvb3BzX29lLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwX0FzeW5jLnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
loops <- fread(here(consensusDir, \chromo_cons_score.tsv\))

for(sample in c(\Async.UT\, \Async.AID\)){
  temp.25kb <- fread(here(consensusDir, paste0(\loopScore_\, sample, \_25kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.25kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp.10kb <- fread(here(consensusDir, paste0(\loopScore_\, sample, \_10kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.10kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp.5kb <-fread(here(consensusDir, paste0(\loopScore_\, sample, \_5kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(chrom1, start1, end1, chrom2, start2, end2, id, observed, \O/E\)
  colnames(temp.5kb) <- c(\chrom1\, \start1\, \end1\, \chrom2\, \start2\, \end2\, \id\, \obs\, \obsexp\)
  
  temp <- bind_rows(temp.25kb, temp.10kb, temp.5kb)
  fwrite(temp, here(consensusDir, paste0(\loopScore_\, sample, \.tsv\)), sep = \\t\)
}


temp.UT <- fread(here(consensusDir, \loopScore_Async.UT.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.UT) <- c(\id\, \obs_UT\, \obsexp_UT\)
temp.AID <- fread(here(consensusDir, \loopScore_Async.AID.tsv\)) %>%
  dplyr::select(id, obs, obsexp)
colnames(temp.AID) <- c(\id\, \obs_AID\, \obsexp_AID\)

loops_oe <- full_join(temp.UT, temp.AID, by = \id\) %>%
  dplyr::mutate(oeFC_AID_UT = if_else(obsexp_UT == 0, NA, obsexp_AID/obsexp_UT))

fwrite(loops_oe, here(consensusDir, paste0(\loopScore_cons_obsexp_Async.tsv\)), sep = \\t\)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [2.25] Obs/Exp loops


#### Merging obs/exp scores from different resolution & samples
##### G1

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHViRzl2Y0hNZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mYzJOdmNtVXVkSE4yWENJcEtWeHVYRzV5WlhNZ1BDMGdNalZjYmx4dVptOXlJQ2h5WlhNZ2FXNGdZeWd5TlN3Z01UQXNJRFVwS1h0Y2JpQWdYRzRnSUhSbGJYQXVSRTFUVHlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0Z3aWJHOXZjRk5qYjNKbFgwY3hMa1JOVTA4dVRXVnlaMlZrWDF3aUxDQnlaWE1zSUZ3aWEySXVkSE4yWENJcEtTa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tMTFkR0YwWlNoaWFXNVRhWHBsSUQwZ1pXNWtNU0F0SUhOMFlYSjBNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsa0lEMGdjR0Z6ZEdVb1kyaHliMjB4TENCaWFXNVRhWHBsTENCemRHRnlkREVzSUhOMFlYSjBNaXdnYzJWd0lEMGdYQ0pmWENJcEtTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0dsa0lDVnBiaVVnYkc5dmNITWthV1FwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB6Wld4bFkzUW9hV1FzSUc5aWMyVnlkbVZrTENCY0lrOHZSVndpS1Z4dUlDQmpiMnh1WVcxbGN5aDBaVzF3TGtSTlUwOHBJRHd0SUdNb1hDSnBaRndpTENCY0ltOWljMTlFVFZOUFhDSXNJRndpYjJKelpYaHdYMFJOVTA5Y0lpbGNiaUFnWEc0Z0lIUmxiWEF1WkZSQlJ5QThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tGd2liRzl2Y0ZOamIzSmxYMGN4TG1SVVFVY3VUV1Z5WjJWa1gxd2lMQ0J5WlhNc0lGd2lhMkl1ZEhOMlhDSXBLU2tnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbTExZEdGMFpTaGlhVzVUYVhwbElEMGdaVzVrTVNBdElITjBZWEowTVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbGtJRDBnY0dGemRHVW9ZMmh5YjIweExDQmlhVzVUYVhwbExDQnpkR0Z5ZERFc0lITjBZWEowTWl3Z2MyVndJRDBnWENKZlhDSXBLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZabWxzZEdWeUtHbGtJQ1ZwYmlVZ2JHOXZjSE1rYVdRcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwelpXeGxZM1FvYVdRc0lHOWljMlZ5ZG1Wa0xDQmNJazh2UlZ3aUtWeHVJQ0JqYjJ4dVlXMWxjeWgwWlcxd0xtUlVRVWNwSUR3dElHTW9YQ0pwWkZ3aUxDQmNJbTlpYzE5a1ZFRkhYQ0lzSUZ3aWIySnpaWGh3WDJSVVFVZGNJaWxjYmlBZ1hHNGdJSFJsYlhBdVFUUTROU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRndpYkc5dmNGTmpiM0psWDBjeExrRTBPRFV1VFdWeVoyVmtYMXdpTENCeVpYTXNJRndpYTJJdWRITjJYQ0lwS1NrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2hpYVc1VGFYcGxJRDBnWlc1a01TQXRJSE4wWVhKME1TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xrSUQwZ2NHRnpkR1VvWTJoeWIyMHhMQ0JpYVc1VGFYcGxMQ0J6ZEdGeWRERXNJSE4wWVhKME1pd2djMlZ3SUQwZ1hDSmZYQ0lwS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82Wm1sc2RHVnlLR2xrSUNWcGJpVWdiRzl2Y0hNa2FXUXBJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHpaV3hsWTNRb2FXUXNJRzlpYzJWeWRtVmtMQ0JjSWs4dlJWd2lLVnh1SUNCamIyeHVZVzFsY3loMFpXMXdMa0UwT0RVcElEd3RJR01vWENKcFpGd2lMQ0JjSW05aWMxOUJORGcxWENJc0lGd2liMkp6Wlhod1gwRTBPRFZjSWlsY2JpQWdYRzRnSUhSbGJYQWdQQzBnWm5Wc2JGOXFiMmx1S0daMWJHeGZhbTlwYmloMFpXMXdMa1JOVTA4c0lIUmxiWEF1WkZSQlJ5d2dZbmtnUFNCaktGd2lhV1JjSWlrcExDQjBaVzF3TGtFME9EVXNJR0o1SUQwZ1l5aGNJbWxrWENJcEtTQWxQaVVnWEc0Z0lDQWdaSEJzZVhJNk9tMTFkR0YwWlNodlpVWkRYMlJVUVVkZlJFMVRUeUE5SUdsbVgyVnNjMlVvYjJKelpYaHdYMFJOVTA4Z1BUMGdNQ3dnVGtFc0lHOWljMlY0Y0Y5a1ZFRkhMMjlpYzJWNGNGOUVUVk5QS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOWxSa05mUVRRNE5WOUVUVk5QSUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmUkUxVFR5QTlQU0F3TENCT1FTd2diMkp6Wlhod1gwRTBPRFV2YjJKelpYaHdYMFJOVTA4cEtWeHVJQ0JjYmlBZ1puZHlhWFJsS0hSbGJYQXNJR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9YQ0pzYjI5d1UyTnZjbVZmWTI5dWMxOXZZbk5sZUhCZlhDSXNJSEpsY3l3Z1hDSnJZaTUwYzNaY0lpa3BMQ0J6WlhBZ1BTQmNJbHhjZEZ3aUtWeHVmVnh1WEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5sb29wcyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19zY29yZS50c3ZcXCkpXG5cbnJlcyA8LSAyNVxuXG5mb3IgKHJlcyBpbiBjKDI1LCAxMCwgNSkpe1xuICBcbiAgdGVtcC5ETVNPIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfRzEuRE1TTy5NZXJnZWRfXFwsIHJlcywgXFxrYi50c3ZcXCkpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBlbmQxIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShjaHJvbTEsIGJpblNpemUsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSBcXF9cXCkpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wcyRpZCkgJT4lXG4gICAgZHBseXI6OnNlbGVjdChpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuRE1TTykgPC0gYyhcXGlkXFwsIFxcb2JzX0RNU09cXCwgXFxvYnNleHBfRE1TT1xcKVxuICBcbiAgdGVtcC5kVEFHIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfRzEuZFRBRy5NZXJnZWRfXFwsIHJlcywgXFxrYi50c3ZcXCkpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBlbmQxIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShjaHJvbTEsIGJpblNpemUsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSBcXF9cXCkpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wcyRpZCkgJT4lXG4gICAgZHBseXI6OnNlbGVjdChpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuZFRBRykgPC0gYyhcXGlkXFwsIFxcb2JzX2RUQUdcXCwgXFxvYnNleHBfZFRBR1xcKVxuICBcbiAgdGVtcC5BNDg1IDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfRzEuQTQ4NS5NZXJnZWRfXFwsIHJlcywgXFxrYi50c3ZcXCkpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBlbmQxIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShjaHJvbTEsIGJpblNpemUsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSBcXF9cXCkpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wcyRpZCkgJT4lXG4gICAgZHBseXI6OnNlbGVjdChpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuQTQ4NSkgPC0gYyhcXGlkXFwsIFxcb2JzX0E0ODVcXCwgXFxvYnNleHBfQTQ4NVxcKVxuICBcbiAgdGVtcCA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAuRE1TTywgdGVtcC5kVEFHLCBieSA9IGMoXFxpZFxcKSksIHRlbXAuQTQ4NSwgYnkgPSBjKFxcaWRcXCkpICU+JSBcbiAgICBkcGx5cjo6bXV0YXRlKG9lRkNfZFRBR19ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBOQSwgb2JzZXhwX2RUQUcvb2JzZXhwX0RNU08pLFxuICAgICAgICAgICAgICAgICAgb2VGQ19BNDg1X0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIE5BLCBvYnNleHBfQTQ4NS9vYnNleHBfRE1TTykpXG4gIFxuICBmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cF9cXCwgcmVzLCBcXGtiLnRzdlxcKSksIHNlcCA9IFxcXFx0XFwpXG59XG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
loops <- fread(here(consensusDir, \chromo_cons_score.tsv\))

res <- 25

for (res in c(25, 10, 5)){
  
  temp.DMSO <- fread(here(consensusDir, paste0(\loopScore_G1.DMSO.Merged_\, res, \kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(id, observed, \O/E\)
  colnames(temp.DMSO) <- c(\id\, \obs_DMSO\, \obsexp_DMSO\)
  
  temp.dTAG <- fread(here(consensusDir, paste0(\loopScore_G1.dTAG.Merged_\, res, \kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(id, observed, \O/E\)
  colnames(temp.dTAG) <- c(\id\, \obs_dTAG\, \obsexp_dTAG\)
  
  temp.A485 <- fread(here(consensusDir, paste0(\loopScore_G1.A485.Merged_\, res, \kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(id, observed, \O/E\)
  colnames(temp.A485) <- c(\id\, \obs_A485\, \obsexp_A485\)
  
  temp <- full_join(full_join(temp.DMSO, temp.dTAG, by = c(\id\)), temp.A485, by = c(\id\)) %>% 
    dplyr::mutate(oeFC_dTAG_DMSO = if_else(obsexp_DMSO == 0, NA, obsexp_dTAG/obsexp_DMSO),
                  oeFC_A485_DMSO = if_else(obsexp_DMSO == 0, NA, obsexp_A485/obsexp_DMSO))
  
  fwrite(temp, here(consensusDir, paste0(\loopScore_cons_obsexp_\, res, \kb.tsv\)), sep = \\t\)
}



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJHOXZjSE1nUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZjMk52Y21VdWRITjJYRndwS1Z4dVhHNXlaWE1nUEMwZ01qVmNibHh1Wm05eUlDaHlaWE1nYVc0Z1l5Z3lOU3dnTVRBc0lEVXBLWHRjYmlBZ1hHNGdJSFJsYlhBdVJFMVRUeUE4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRnhjYkc5dmNGTmpiM0psWDBjeExrUk5VMDh1VFdWeVoyVmtYMXhjTENCeVpYTXNJRnhjYTJJdWRITjJYRndwS1NrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2hpYVc1VGFYcGxJRDBnWlc1a01TQXRJSE4wWVhKME1TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xrSUQwZ2NHRnpkR1VvWTJoeWIyMHhMQ0JpYVc1VGFYcGxMQ0J6ZEdGeWRERXNJSE4wWVhKME1pd2djMlZ3SUQwZ1hGeGZYRndwS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82Wm1sc2RHVnlLR2xrSUNWcGJpVWdiRzl2Y0hNa2FXUXBJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHpaV3hsWTNRb2FXUXNJRzlpYzJWeWRtVmtMQ0JjWEU4dlJWeGNLVnh1SUNCamIyeHVZVzFsY3loMFpXMXdMa1JOVTA4cElEd3RJR01vWEZ4cFpGeGNMQ0JjWEc5aWMxOUVUVk5QWEZ3c0lGeGNiMkp6Wlhod1gwUk5VMDljWENsY2JpQWdYRzRnSUhSbGJYQXVaRlJCUnlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0Z4Y2JHOXZjRk5qYjNKbFgwY3hMbVJVUVVjdVRXVnlaMlZrWDF4Y0xDQnlaWE1zSUZ4Y2EySXVkSE4yWEZ3cEtTa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tMTFkR0YwWlNoaWFXNVRhWHBsSUQwZ1pXNWtNU0F0SUhOMFlYSjBNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsa0lEMGdjR0Z6ZEdVb1kyaHliMjB4TENCaWFXNVRhWHBsTENCemRHRnlkREVzSUhOMFlYSjBNaXdnYzJWd0lEMGdYRnhmWEZ3cEtTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNlptbHNkR1Z5S0dsa0lDVnBiaVVnYkc5dmNITWthV1FwSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB6Wld4bFkzUW9hV1FzSUc5aWMyVnlkbVZrTENCY1hFOHZSVnhjS1Z4dUlDQmpiMnh1WVcxbGN5aDBaVzF3TG1SVVFVY3BJRHd0SUdNb1hGeHBaRnhjTENCY1hHOWljMTlrVkVGSFhGd3NJRnhjYjJKelpYaHdYMlJVUVVkY1hDbGNiaUFnWEc0Z0lIUmxiWEF1UVRRNE5TQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tGeGNiRzl2Y0ZOamIzSmxYMGN4TGtFME9EVXVUV1Z5WjJWa1gxeGNMQ0J5WlhNc0lGeGNhMkl1ZEhOMlhGd3BLU2tnSlQ0bFhHNGdJQ0FnWkhCc2VYSTZPbTExZEdGMFpTaGlhVzVUYVhwbElEMGdaVzVrTVNBdElITjBZWEowTVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbGtJRDBnY0dGemRHVW9ZMmh5YjIweExDQmlhVzVUYVhwbExDQnpkR0Z5ZERFc0lITjBZWEowTWl3Z2MyVndJRDBnWEZ4ZlhGd3BLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZabWxzZEdWeUtHbGtJQ1ZwYmlVZ2JHOXZjSE1rYVdRcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwelpXeGxZM1FvYVdRc0lHOWljMlZ5ZG1Wa0xDQmNYRTh2UlZ4Y0tWeHVJQ0JqYjJ4dVlXMWxjeWgwWlcxd0xrRTBPRFVwSUR3dElHTW9YRnhwWkZ4Y0xDQmNYRzlpYzE5Qk5EZzFYRndzSUZ4Y2IySnpaWGh3WDBFME9EVmNYQ2xjYmlBZ1hHNGdJSFJsYlhBZ1BDMGdablZzYkY5cWIybHVLR1oxYkd4ZmFtOXBiaWgwWlcxd0xrUk5VMDhzSUhSbGJYQXVaRlJCUnl3Z1lua2dQU0JqS0Z4Y2FXUmNYQ2twTENCMFpXMXdMa0UwT0RVc0lHSjVJRDBnWXloY1hHbGtYRndwS1NBbFBpVWdYRzRnSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2h2WlVaRFgyUlVRVWRmUkUxVFR5QTlJR2xtWDJWc2MyVW9iMkp6Wlhod1gwUk5VMDhnUFQwZ01Dd2dUa0VzSUc5aWMyVjRjRjlrVkVGSEwyOWljMlY0Y0Y5RVRWTlBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5bFJrTmZRVFE0TlY5RVRWTlBJRDBnYVdaZlpXeHpaU2h2WW5ObGVIQmZSRTFUVHlBOVBTQXdMQ0JPUVN3Z2IySnpaWGh3WDBFME9EVXZiMkp6Wlhod1gwUk5VMDhwS1Z4dUlDQmNiaUFnWm5keWFYUmxLSFJsYlhBc0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb1hGeHNiMjl3VTJOdmNtVmZZMjl1YzE5dlluTmxlSEJmWEZ3c0lISmxjeXdnWEZ4cllpNTBjM1pjWENrcExDQnpaWEFnUFNCY1hGeGNkRnhjS1Z4dWZWeHVYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxubG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKVxuXG5yZXMgPC0gMjVcblxuZm9yIChyZXMgaW4gYygyNSwgMTAsIDUpKXtcbiAgXG4gIHRlbXAuRE1TTyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX0cxLkRNU08uTWVyZ2VkX1xcLCByZXMsIFxca2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoaWQsIG9ic2VydmVkLCBcXE8vRVxcKVxuICBjb2xuYW1lcyh0ZW1wLkRNU08pIDwtIGMoXFxpZFxcLCBcXG9ic19ETVNPXFwsIFxcb2JzZXhwX0RNU09cXClcbiAgXG4gIHRlbXAuZFRBRyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX0cxLmRUQUcuTWVyZ2VkX1xcLCByZXMsIFxca2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoaWQsIG9ic2VydmVkLCBcXE8vRVxcKVxuICBjb2xuYW1lcyh0ZW1wLmRUQUcpIDwtIGMoXFxpZFxcLCBcXG9ic19kVEFHXFwsIFxcb2JzZXhwX2RUQUdcXClcbiAgXG4gIHRlbXAuQTQ4NSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX0cxLkE0ODUuTWVyZ2VkX1xcLCByZXMsIFxca2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoaWQsIG9ic2VydmVkLCBcXE8vRVxcKVxuICBjb2xuYW1lcyh0ZW1wLkE0ODUpIDwtIGMoXFxpZFxcLCBcXG9ic19BNDg1XFwsIFxcb2JzZXhwX0E0ODVcXClcbiAgXG4gIHRlbXAgPC0gZnVsbF9qb2luKGZ1bGxfam9pbih0ZW1wLkRNU08sIHRlbXAuZFRBRywgYnkgPSBjKFxcaWRcXCkpLCB0ZW1wLkE0ODUsIGJ5ID0gYyhcXGlkXFwpKSAlPiUgXG4gICAgZHBseXI6Om11dGF0ZShvZUZDX2RUQUdfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgTkEsIG9ic2V4cF9kVEFHL29ic2V4cF9ETVNPKSxcbiAgICAgICAgICAgICAgICAgIG9lRkNfQTQ4NV9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBOQSwgb2JzZXhwX0E0ODUvb2JzZXhwX0RNU08pKVxuICBcbiAgZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHBfXFwsIHJlcywgXFxrYi50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxufVxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKVxuXG5yZXMgPC0gMjVcblxuZm9yIChyZXMgaW4gYygyNSwgMTAsIDUpKXtcbiAgXG4gIHRlbXAuRE1TTyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX0cxLkRNU08uTWVyZ2VkX1xcLCByZXMsIFxca2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoaWQsIG9ic2VydmVkLCBcXE8vRVxcKVxuICBjb2xuYW1lcyh0ZW1wLkRNU08pIDwtIGMoXFxpZFxcLCBcXG9ic19ETVNPXFwsIFxcb2JzZXhwX0RNU09cXClcbiAgXG4gIHRlbXAuZFRBRyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX0cxLmRUQUcuTWVyZ2VkX1xcLCByZXMsIFxca2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoaWQsIG9ic2VydmVkLCBcXE8vRVxcKVxuICBjb2xuYW1lcyh0ZW1wLmRUQUcpIDwtIGMoXFxpZFxcLCBcXG9ic19kVEFHXFwsIFxcb2JzZXhwX2RUQUdcXClcbiAgXG4gIHRlbXAuQTQ4NSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX0cxLkE0ODUuTWVyZ2VkX1xcLCByZXMsIFxca2IudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JVxuICAgIGRwbHlyOjpzZWxlY3QoaWQsIG9ic2VydmVkLCBcXE8vRVxcKVxuICBjb2xuYW1lcyh0ZW1wLkE0ODUpIDwtIGMoXFxpZFxcLCBcXG9ic19BNDg1XFwsIFxcb2JzZXhwX0E0ODVcXClcbiAgXG4gIHRlbXAgPC0gZnVsbF9qb2luKGZ1bGxfam9pbih0ZW1wLkRNU08sIHRlbXAuZFRBRywgYnkgPSBjKFxcaWRcXCkpLCB0ZW1wLkE0ODUsIGJ5ID0gYyhcXGlkXFwpKSAlPiUgXG4gICAgZHBseXI6Om11dGF0ZShvZUZDX2RUQUdfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgTkEsIG9ic2V4cF9kVEFHL29ic2V4cF9ETVNPKSxcbiAgICAgICAgICAgICAgICAgIG9lRkNfQTQ4NV9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBOQSwgb2JzZXhwX0E0ODUvb2JzZXhwX0RNU08pKVxuICBcbiAgZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHBfXFwsIHJlcywgXFxrYi50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxufVxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
loops <- fread(here(consensusDir, \chromo_cons_score.tsv\))

res <- 25

for (res in c(25, 10, 5)){
  
  temp.DMSO <- fread(here(consensusDir, paste0(\loopScore_G1.DMSO.Merged_\, res, \kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(id, observed, \O/E\)
  colnames(temp.DMSO) <- c(\id\, \obs_DMSO\, \obsexp_DMSO\)
  
  temp.dTAG <- fread(here(consensusDir, paste0(\loopScore_G1.dTAG.Merged_\, res, \kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(id, observed, \O/E\)
  colnames(temp.dTAG) <- c(\id\, \obs_dTAG\, \obsexp_dTAG\)
  
  temp.A485 <- fread(here(consensusDir, paste0(\loopScore_G1.A485.Merged_\, res, \kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(id, observed, \O/E\)
  colnames(temp.A485) <- c(\id\, \obs_A485\, \obsexp_A485\)
  
  temp <- full_join(full_join(temp.DMSO, temp.dTAG, by = c(\id\)), temp.A485, by = c(\id\)) %>% 
    dplyr::mutate(oeFC_dTAG_DMSO = if_else(obsexp_DMSO == 0, NA, obsexp_dTAG/obsexp_DMSO),
                  oeFC_A485_DMSO = if_else(obsexp_DMSO == 0, NA, obsexp_A485/obsexp_DMSO))
  
  fwrite(temp, here(consensusDir, paste0(\loopScore_cons_obsexp_\, res, \kb.tsv\)), sep = \\t\)
}

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### Async

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHViRzl2Y0hNZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mYzJOdmNtVXVkSE4yWENJcEtWeHVYRzV5WlhNZ1BDMGdNalZjYmx4dVptOXlJQ2h5WlhNZ2FXNGdZeWd5TlN3Z01UQXNJRFVwS1h0Y2JpQWdYRzRnSUhSbGJYQXVWVlFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUhCaGMzUmxNQ2hjSW14dmIzQlRZMjl5WlY5QmMzbHVZeTVWVkY5Y0lpd2djbVZ6TENCY0ltdGlMblJ6ZGx3aUtTa3BJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb1ltbHVVMmw2WlNBOUlHVnVaREVnTFNCemRHRnlkREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFpDQTlJSEJoYzNSbEtHTm9jbTl0TVN3Z1ltbHVVMmw2WlN3Z2MzUmhjblF4TENCemRHRnlkRElzSUhObGNDQTlJRndpWDF3aUtTa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tWnBiSFJsY2locFpDQWxhVzRsSUd4dmIzQnpKR2xrS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82YzJWc1pXTjBLR2xrTENCdlluTmxjblpsWkN3Z1hDSlBMMFZjSWlsY2JpQWdZMjlzYm1GdFpYTW9kR1Z0Y0M1VlZDa2dQQzBnWXloY0ltbGtYQ0lzSUZ3aWIySnpYMVZVWENJc0lGd2liMkp6Wlhod1gxVlVYQ0lwWEc0Z0lGeHVJQ0IwWlcxd0xrRkpSQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRndpYkc5dmNGTmpiM0psWDBGemVXNWpMa0ZKUkY5Y0lpd2djbVZ6TENCY0ltdGlMblJ6ZGx3aUtTa3BJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb1ltbHVVMmw2WlNBOUlHVnVaREVnTFNCemRHRnlkREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFpDQTlJSEJoYzNSbEtHTm9jbTl0TVN3Z1ltbHVVMmw2WlN3Z2MzUmhjblF4TENCemRHRnlkRElzSUhObGNDQTlJRndpWDF3aUtTa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tWnBiSFJsY2locFpDQWxhVzRsSUd4dmIzQnpKR2xrS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82YzJWc1pXTjBLR2xrTENCdlluTmxjblpsWkN3Z1hDSlBMMFZjSWlsY2JpQWdZMjlzYm1GdFpYTW9kR1Z0Y0M1QlNVUXBJRHd0SUdNb1hDSnBaRndpTENCY0ltOWljMTlCU1VSY0lpd2dYQ0p2WW5ObGVIQmZRVWxFWENJcFhHNWNiaUFnWEc0Z0lIUmxiWEFnUEMwZ1puVnNiRjlxYjJsdUtIUmxiWEF1VlZRc0lIUmxiWEF1UVVsRUxDQmllU0E5SUdNb1hDSnBaRndpS1NrZ0pUNGxJRnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvYjJWR1ExOUJTVVJmVlZRZ1BTQnBabDlsYkhObEtHOWljMlY0Y0Y5VlZDQTlQU0F3TENCT1FTd2diMkp6Wlhod1gwRkpSQzl2WW5ObGVIQmZWVlFwS1Z4dUlDQmNiaUFnWm5keWFYUmxLSFJsYlhBc0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb1hDSnNiMjl3VTJOdmNtVmZZMjl1YzE5dlluTmxlSEJmWENJc0lISmxjeXdnWENKcllsOWhjM2x1WXk1MGMzWmNJaWtwTENCelpYQWdQU0JjSWx4Y2RGd2lLVnh1ZlZ4dVhHNWNibUJnWUNKOSAtLT5cblxuYGBgclxubG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKVxuXG5yZXMgPC0gMjVcblxuZm9yIChyZXMgaW4gYygyNSwgMTAsIDUpKXtcbiAgXG4gIHRlbXAuVVQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9Bc3luYy5VVF9cXCwgcmVzLCBcXGtiLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKGNocm9tMSwgYmluU2l6ZSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3BzJGlkKSAlPiVcbiAgICBkcGx5cjo6c2VsZWN0KGlkLCBvYnNlcnZlZCwgXFxPL0VcXClcbiAgY29sbmFtZXModGVtcC5VVCkgPC0gYyhcXGlkXFwsIFxcb2JzX1VUXFwsIFxcb2JzZXhwX1VUXFwpXG4gIFxuICB0ZW1wLkFJRCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX0FzeW5jLkFJRF9cXCwgcmVzLCBcXGtiLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKGNocm9tMSwgYmluU2l6ZSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3BzJGlkKSAlPiVcbiAgICBkcGx5cjo6c2VsZWN0KGlkLCBvYnNlcnZlZCwgXFxPL0VcXClcbiAgY29sbmFtZXModGVtcC5BSUQpIDwtIGMoXFxpZFxcLCBcXG9ic19BSURcXCwgXFxvYnNleHBfQUlEXFwpXG5cbiAgXG4gIHRlbXAgPC0gZnVsbF9qb2luKHRlbXAuVVQsIHRlbXAuQUlELCBieSA9IGMoXFxpZFxcKSkgJT4lIFxuICAgIGRwbHlyOjptdXRhdGUob2VGQ19BSURfVVQgPSBpZl9lbHNlKG9ic2V4cF9VVCA9PSAwLCBOQSwgb2JzZXhwX0FJRC9vYnNleHBfVVQpKVxuICBcbiAgZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHBfXFwsIHJlcywgXFxrYl9hc3luYy50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxufVxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
loops <- fread(here(consensusDir, \chromo_cons_score.tsv\))

res <- 25

for (res in c(25, 10, 5)){
  
  temp.UT <- fread(here(consensusDir, paste0(\loopScore_Async.UT_\, res, \kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(id, observed, \O/E\)
  colnames(temp.UT) <- c(\id\, \obs_UT\, \obsexp_UT\)
  
  temp.AID <- fread(here(consensusDir, paste0(\loopScore_Async.AID_\, res, \kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(id, observed, \O/E\)
  colnames(temp.AID) <- c(\id\, \obs_AID\, \obsexp_AID\)

  
  temp <- full_join(temp.UT, temp.AID, by = c(\id\)) %>% 
    dplyr::mutate(oeFC_AID_UT = if_else(obsexp_UT == 0, NA, obsexp_AID/obsexp_UT))
  
  fwrite(temp, here(consensusDir, paste0(\loopScore_cons_obsexp_\, res, \kb_async.tsv\)), sep = \\t\)
}



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJHOXZjSE1nUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZjMk52Y21VdWRITjJYRndwS1Z4dVhHNXlaWE1nUEMwZ01qVmNibHh1Wm05eUlDaHlaWE1nYVc0Z1l5Z3lOU3dnTVRBc0lEVXBLWHRjYmlBZ1hHNGdJSFJsYlhBdVZWUWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaGNYR3h2YjNCVFkyOXlaVjlCYzNsdVl5NVZWRjljWEN3Z2NtVnpMQ0JjWEd0aUxuUnpkbHhjS1NrcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvWW1sdVUybDZaU0E5SUdWdVpERWdMU0J6ZEdGeWRERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlIQmhjM1JsS0dOb2NtOXRNU3dnWW1sdVUybDZaU3dnYzNSaGNuUXhMQ0J6ZEdGeWRESXNJSE5sY0NBOUlGeGNYMXhjS1NrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T21acGJIUmxjaWhwWkNBbGFXNGxJR3h2YjNCekpHbGtLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZjMlZzWldOMEtHbGtMQ0J2WW5ObGNuWmxaQ3dnWEZ4UEwwVmNYQ2xjYmlBZ1kyOXNibUZ0WlhNb2RHVnRjQzVWVkNrZ1BDMGdZeWhjWEdsa1hGd3NJRnhjYjJKelgxVlVYRndzSUZ4Y2IySnpaWGh3WDFWVVhGd3BYRzRnSUZ4dUlDQjBaVzF3TGtGSlJDQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tGeGNiRzl2Y0ZOamIzSmxYMEZ6ZVc1akxrRkpSRjljWEN3Z2NtVnpMQ0JjWEd0aUxuUnpkbHhjS1NrcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvWW1sdVUybDZaU0E5SUdWdVpERWdMU0J6ZEdGeWRERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlIQmhjM1JsS0dOb2NtOXRNU3dnWW1sdVUybDZaU3dnYzNSaGNuUXhMQ0J6ZEdGeWRESXNJSE5sY0NBOUlGeGNYMXhjS1NrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T21acGJIUmxjaWhwWkNBbGFXNGxJR3h2YjNCekpHbGtLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZjMlZzWldOMEtHbGtMQ0J2WW5ObGNuWmxaQ3dnWEZ4UEwwVmNYQ2xjYmlBZ1kyOXNibUZ0WlhNb2RHVnRjQzVCU1VRcElEd3RJR01vWEZ4cFpGeGNMQ0JjWEc5aWMxOUJTVVJjWEN3Z1hGeHZZbk5sZUhCZlFVbEVYRndwWEc1Y2JpQWdYRzRnSUhSbGJYQWdQQzBnWm5Wc2JGOXFiMmx1S0hSbGJYQXVWVlFzSUhSbGJYQXVRVWxFTENCaWVTQTlJR01vWEZ4cFpGeGNLU2tnSlQ0bElGeHVJQ0FnSUdSd2JIbHlPanB0ZFhSaGRHVW9iMlZHUTE5QlNVUmZWVlFnUFNCcFpsOWxiSE5sS0c5aWMyVjRjRjlWVkNBOVBTQXdMQ0JPUVN3Z2IySnpaWGh3WDBGSlJDOXZZbk5sZUhCZlZWUXBLVnh1SUNCY2JpQWdabmR5YVhSbEtIUmxiWEFzSUdobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvWEZ4c2IyOXdVMk52Y21WZlkyOXVjMTl2WW5ObGVIQmZYRndzSUhKbGN5d2dYRnhyWWw5aGMzbHVZeTUwYzNaY1hDa3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0tWeHVmVnh1WEc1Y2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbmxvb3BzIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX3Njb3JlLnRzdlxcKSlcblxucmVzIDwtIDI1XG5cbmZvciAocmVzIGluIGMoMjUsIDEwLCA1KSl7XG4gIFxuICB0ZW1wLlVUIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfQXN5bmMuVVRfXFwsIHJlcywgXFxrYi50c3ZcXCkpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBlbmQxIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShjaHJvbTEsIGJpblNpemUsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSBcXF9cXCkpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wcyRpZCkgJT4lXG4gICAgZHBseXI6OnNlbGVjdChpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuVVQpIDwtIGMoXFxpZFxcLCBcXG9ic19VVFxcLCBcXG9ic2V4cF9VVFxcKVxuICBcbiAgdGVtcC5BSUQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9Bc3luYy5BSURfXFwsIHJlcywgXFxrYi50c3ZcXCkpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBlbmQxIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShjaHJvbTEsIGJpblNpemUsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSBcXF9cXCkpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wcyRpZCkgJT4lXG4gICAgZHBseXI6OnNlbGVjdChpZCwgb2JzZXJ2ZWQsIFxcTy9FXFwpXG4gIGNvbG5hbWVzKHRlbXAuQUlEKSA8LSBjKFxcaWRcXCwgXFxvYnNfQUlEXFwsIFxcb2JzZXhwX0FJRFxcKVxuXG4gIFxuICB0ZW1wIDwtIGZ1bGxfam9pbih0ZW1wLlVULCB0ZW1wLkFJRCwgYnkgPSBjKFxcaWRcXCkpICU+JSBcbiAgICBkcGx5cjo6bXV0YXRlKG9lRkNfQUlEX1VUID0gaWZfZWxzZShvYnNleHBfVVQgPT0gMCwgTkEsIG9ic2V4cF9BSUQvb2JzZXhwX1VUKSlcbiAgXG4gIGZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwX1xcLCByZXMsIFxca2JfYXN5bmMudHN2XFwpKSwgc2VwID0gXFxcXHRcXClcbn1cblxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfc2NvcmUudHN2XFwpKVxuXG5yZXMgPC0gMjVcblxuZm9yIChyZXMgaW4gYygyNSwgMTAsIDUpKXtcbiAgXG4gIHRlbXAuVVQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9Bc3luYy5VVF9cXCwgcmVzLCBcXGtiLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKGNocm9tMSwgYmluU2l6ZSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3BzJGlkKSAlPiVcbiAgICBkcGx5cjo6c2VsZWN0KGlkLCBvYnNlcnZlZCwgXFxPL0VcXClcbiAgY29sbmFtZXModGVtcC5VVCkgPC0gYyhcXGlkXFwsIFxcb2JzX1VUXFwsIFxcb2JzZXhwX1VUXFwpXG4gIFxuICB0ZW1wLkFJRCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX0FzeW5jLkFJRF9cXCwgcmVzLCBcXGtiLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKGNocm9tMSwgYmluU2l6ZSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9IFxcX1xcKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3BzJGlkKSAlPiVcbiAgICBkcGx5cjo6c2VsZWN0KGlkLCBvYnNlcnZlZCwgXFxPL0VcXClcbiAgY29sbmFtZXModGVtcC5BSUQpIDwtIGMoXFxpZFxcLCBcXG9ic19BSURcXCwgXFxvYnNleHBfQUlEXFwpXG5cbiAgXG4gIHRlbXAgPC0gZnVsbF9qb2luKHRlbXAuVVQsIHRlbXAuQUlELCBieSA9IGMoXFxpZFxcKSkgJT4lIFxuICAgIGRwbHlyOjptdXRhdGUob2VGQ19BSURfVVQgPSBpZl9lbHNlKG9ic2V4cF9VVCA9PSAwLCBOQSwgb2JzZXhwX0FJRC9vYnNleHBfVVQpKVxuICBcbiAgZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHBfXFwsIHJlcywgXFxrYl9hc3luYy50c3ZcXCkpLCBzZXAgPSBcXFxcdFxcKVxufVxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
loops <- fread(here(consensusDir, \chromo_cons_score.tsv\))

res <- 25

for (res in c(25, 10, 5)){
  
  temp.UT <- fread(here(consensusDir, paste0(\loopScore_Async.UT_\, res, \kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(id, observed, \O/E\)
  colnames(temp.UT) <- c(\id\, \obs_UT\, \obsexp_UT\)
  
  temp.AID <- fread(here(consensusDir, paste0(\loopScore_Async.AID_\, res, \kb.tsv\))) %>%
    dplyr::mutate(binSize = end1 - start1,
                  id = paste(chrom1, binSize, start1, start2, sep = \_\)) %>%
    dplyr::filter(id %in% loops$id) %>%
    dplyr::select(id, observed, \O/E\)
  colnames(temp.AID) <- c(\id\, \obs_AID\, \obsexp_AID\)

  
  temp <- full_join(temp.UT, temp.AID, by = c(\id\)) %>% 
    dplyr::mutate(oeFC_AID_UT = if_else(obsexp_UT == 0, NA, obsexp_AID/obsexp_UT))
  
  fwrite(temp, here(consensusDir, paste0(\loopScore_cons_obsexp_\, res, \kb_async.tsv\)), sep = \\t\)
}

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Merging obs/exp per resolution
Only the loops that made to consensus loops are considered
##### G1

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJKYlhCdmNuUnBibWNnYkc5dmNITmNibXh2YjNBdWRYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjloYkd4ZlpGUkJSM1p6UkUxVFQxOVZVRjlrYVdabU1DNHlMbUpsWkhCbFhDSXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ltbHVVMmw2WlNBOUlGWXpJQzBnVmpJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXUWdQU0J3WVhOMFpTaFdNU3dnWW1sdVUybDZaU3dnVmpJc0lGWTFMQ0J6WlhBZ1BTQmNJbDljSWlrcFhHNXNiMjl3TG1SdmQyNGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjloYkd4ZlpGUkJSM1p6UkUxVFQxOUVUMWRPWDJScFptWXdMakl1WW1Wa2NHVmNJaWtwSUNVK0pTQmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGlhVzVUYVhwbElEMGdWak1nTFNCV01peGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaQ0E5SUhCaGMzUmxLRll4TENCaWFXNVRhWHBsTENCV01pd2dWalVzSUhObGNDQTlJRndpWDF3aUtTbGNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjloYkd4ZlpGUkJSM1p6UkUxVFQxOU9UMTlrYVdabU1DNHlMbUpsWkhCbFhDSXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ltbHVVMmw2WlNBOUlGWXpJQzBnVmpJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXUWdQU0J3WVhOMFpTaFdNU3dnWW1sdVUybDZaU3dnVmpJc0lGWTFMQ0J6WlhBZ1BTQmNJbDljSWlrcFhHNWNibVp2Y2loeVpYTWdhVzRnWXlneU5Td2dNVEFzSURVcEtYdGNiaUFnYldsdVZtRnNkV1VnUEMwZ0xUUmNiaUFnYldGNFZtRnNkV1VnUEMwZ05WeHVJQ0J2WW5ObGVIQWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaGNJbXh2YjNCVFkyOXlaVjlqYjI1elgyOWljMlY0Y0Y5Y0lpd2djbVZ6TENCY0ltdGlMblJ6ZGx3aUtTa3BJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb2JHOW5YMjlpYzJWNGNGOUVUVk5QSUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmUkUxVFR5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZSRTFUVHlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrVkVGSElEMGdhV1pmWld4elpTaHZZbk5sZUhCZlpGUkJSeUE5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmWkZSQlJ5a3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5Qk5EZzFJRDBnYVdaZlpXeHpaU2h2WW5ObGVIQmZRVFE0TlNBOVBTQXdMQ0J0YVc1V1lXeDFaU3dnYkc5bk1paHZZbk5sZUhCZlFUUTROU2twS1Z4dUlDQmNiaUFnWEc0Z0lDTWdaRlJCUjF4dUlDQnZZbk5sZUhBa1pHVnVjMmwwZVNBOExTQm5aWFJmWkdWdWMybDBlU2h2WW5ObGVIQWtiRzluWDI5aWMyVjRjRjlFVFZOUExDQnZZbk5sZUhBa2JHOW5YMjlpYzJWNGNGOWtWRUZITENCdUlEMGdNVEF3S1Z4dUlDQnZZbk5sZUhBZ1BDMGdiMkp6Wlhod0lDVStKU0JrY0d4NWNqbzZZWEp5WVc1blpTaGtaVzV6YVhSNUtWeHVJQ0JuTVNBOExTQm5aM0JzYjNRb2IySnpaWGh3TENCaFpYTW9lQ0E5SUd4dloxOXZZbk5sZUhCZlJFMVRUeXdnZVNBOUlHeHZaMTl2WW5ObGVIQmZaRlJCUnl3Z1kyOXNiM0lnUFNCa1pXNXphWFI1S1NrZ0t5QmNiaUFnSUNCblpXOXRYM0J2YVc1MEtDa2dLeUIwYUdWdFpWOWlkeWdwSUNzZ2MyTmhiR1ZmWTI5c2IzSmZkbWx5YVdScGN5aG5kV2xrWlNBOUlGd2libTl1WlZ3aUtTQXJYRzRnSUNBZ1oyVnZiVjloWW14cGJtVW9jMnh2Y0dVZ1BTQXhMQ0JwYm5SbGNtTmxjSFFnUFNBd0tTQXJYRzRnSUNBZ1oyZDBhWFJzWlNod1lYTjBaVEFvY21WekxDQmNJbXRpTENCc2IyY3lLRzlpY3k5bGVIQXBYQ0lwS1NBclhHNGdJQ0FnWTI5dmNtUmZabWw0WldRb2VHeHBiU0E5SUdNb2JXbHVWbUZzZFdVc0lHMWhlRlpoYkhWbEtTd2dlV3hwYlNBOUlHTW9iV2x1Vm1Gc2RXVXNJRzFoZUZaaGJIVmxLU2tnWEc0Z0lGeHVJQ0JjYmlBZ0l5QldhWE4xWVd4cGVtVWdWVkFnUkU5WFRpQnNiMjl3YzF4dUlDQjBaVzF3SUR3dElHOWljMlY0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2locFpDQWxhVzRsSUd4dmIzQXVaRzkzYmlScFpDbGNiaUFnZEdWdGNDUmtaVzV6YVhSNUlEd3RJR2RsZEY5a1pXNXphWFI1S0hSbGJYQWtiRzluWDI5aWMyVjRjRjlFVFZOUExDQjBaVzF3Skd4dloxOXZZbk5sZUhCZlpGUkJSeXdnYmlBOUlERXdNQ2xjYmlBZ2RHVnRjQ0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82WVhKeVlXNW5aU2hrWlc1emFYUjVLVnh1SUNCbk1pQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCc2IyZGZiMkp6Wlhod1gwUk5VMDhzSUhrZ1BTQnNiMmRmYjJKelpYaHdYMlJVUVVjc0lHTnZiRzl5SUQwZ1pHVnVjMmwwZVNrcElDc2dYRzRnSUNBZ1oyVnZiVjl3YjJsdWRDZ3BJQ3NnZEdobGJXVmZZbmNvS1NBcklITmpZV3hsWDJOdmJHOXlYM1pwY21sa2FYTW9aM1ZwWkdVZ1BTQmNJbTV2Ym1WY0lpa2dLMXh1SUNBZ0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ01Da2dLMXh1SUNBZ0lHZG5kR2wwYkdVb2NHRnpkR1V3S0hKbGN5d2dYQ0pyWWl3Z2JHOW5NaWh2WW5NdlpYaHdLU3dnWkc5M2Jsd2lLU2tnSzF4dUlDQWdJR052YjNKa1gyWnBlR1ZrS0hoc2FXMGdQU0JqS0cxcGJsWmhiSFZsTENCdFlYaFdZV3gxWlNrc0lIbHNhVzBnUFNCaktHMXBibFpoYkhWbExDQnRZWGhXWVd4MVpTa3BYRzRnSUZ4dUlDQmNiaUFnZEdWdGNDQThMU0J2WW5ObGVIQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9hV1FnSldsdUpTQnNiMjl3TG01dkpHbGtLVnh1SUNCMFpXMXdKR1JsYm5OcGRIa2dQQzBnWjJWMFgyUmxibk5wZEhrb2RHVnRjQ1JzYjJkZmIySnpaWGh3WDBSTlUwOHNJSFJsYlhBa2JHOW5YMjlpYzJWNGNGOWtWRUZITENCdUlEMGdNVEF3S1Z4dUlDQjBaVzF3SUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwaGNuSmhibWRsS0dSbGJuTnBkSGtwWEc0Z0lHY3pJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlHeHZaMTl2WW5ObGVIQmZSRTFUVHl3Z2VTQTlJR3h2WjE5dlluTmxlSEJmWkZSQlJ5d2dZMjlzYjNJZ1BTQmtaVzV6YVhSNUtTa2dLeUJjYmlBZ0lDQm5aVzl0WDNCdmFXNTBLQ2tnS3lCMGFHVnRaVjlpZHlncElDc2djMk5oYkdWZlkyOXNiM0pmZG1seWFXUnBjeWhuZFdsa1pTQTlJRndpYm05dVpWd2lLU0FyWEc0Z0lDQWdaMlZ2YlY5aFlteHBibVVvYzJ4dmNHVWdQU0F4TENCcGJuUmxjbU5sY0hRZ1BTQXdLU0FyWEc0Z0lDQWdaMmQwYVhSc1pTaHdZWE4wWlRBb2NtVnpMQ0JjSW10aUxDQnNiMmN5S0c5aWN5OWxlSEFwTENCdWIxd2lLU2tnSzF4dUlDQWdJR052YjNKa1gyWnBlR1ZrS0hoc2FXMGdQU0JqS0cxcGJsWmhiSFZsTENCdFlYaFdZV3gxWlNrc0lIbHNhVzBnUFNCaktHMXBibFpoYkhWbExDQnRZWGhXWVd4MVpTa3BYRzRnSUZ4dUlDQjBaVzF3SUR3dElHOWljMlY0Y0NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2locFpDQWxhVzRsSUd4dmIzQXVkWEFrYVdRcFhHNGdJSFJsYlhBa1pHVnVjMmwwZVNBOExTQm5aWFJmWkdWdWMybDBlU2gwWlcxd0pHeHZaMTl2WW5ObGVIQmZSRTFUVHl3Z2RHVnRjQ1JzYjJkZmIySnpaWGh3WDJSVVFVY3NJRzRnUFNBeE1EQXBYRzRnSUhSbGJYQWdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbUZ5Y21GdVoyVW9aR1Z1YzJsMGVTbGNiaUFnWnpRZ1BDMGdaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnYkc5blgyOWljMlY0Y0Y5RVRWTlBMQ0I1SUQwZ2JHOW5YMjlpYzJWNGNGOWtWRUZITENCamIyeHZjaUE5SUdSbGJuTnBkSGtwS1NBcklGeHVJQ0FnSUdkbGIyMWZjRzlwYm5Rb0tTQXJJSFJvWlcxbFgySjNLQ2tnS3lCelkyRnNaVjlqYjJ4dmNsOTJhWEpwWkdsektHZDFhV1JsSUQwZ1hDSnViMjVsWENJcElDdGNiaUFnSUNCblpXOXRYMkZpYkdsdVpTaHpiRzl3WlNBOUlERXNJR2x1ZEdWeVkyVndkQ0E5SURBcElDdGNiaUFnSUNCblozUnBkR3hsS0hCaGMzUmxNQ2h5WlhNc0lGd2lhMklzSUd4dlp6SW9iMkp6TDJWNGNDa3NJSFZ3WENJcEtTQXJYRzRnSUNBZ1kyOXZjbVJmWm1sNFpXUW9lR3hwYlNBOUlHTW9iV2x1Vm1Gc2RXVXNJRzFoZUZaaGJIVmxLU3dnZVd4cGJTQTlJR01vYldsdVZtRnNkV1VzSUcxaGVGWmhiSFZsS1NsY2JpQWdYRzRnSUZ4dUlDQm1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0p2WW5ObGVIQmZaRlJCUjE5MmMxOUVUVk5QWDF3aUxDQnlaWE1zSUZ3aWEySmNJaWxjYmlBZ2FHVnBaMmgwSUR3dElEUmNiaUFnZDJsa2RHZ2dQQzBnTVRKY2JpQWdjRzVuS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbkJ1WjF3aUtTa3NJSEpsY3lBOUlEWXdNQ3dnZFc1cGRDQTlJRndpYVc1Y0lpd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dUlDQndjbWx1ZENod2JHOTBYMmR5YVdRb1p6RXNJR2MwTENCbk15d2daeklzSUc1amIyd2dQU0EwS1NsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUhOMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpQWdjSEpwYm5Rb2NHeHZkRjluY21sa0tHY3hMQ0JuTkN3Z1p6TXNJR2N5TENCdVkyOXNJRDBnTkNrcFhHNGdJR1JsZGk1dlptWW9LVnh1ZlZ4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuIyBJbXBvcnRpbmcgbG9vcHNcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcXF9cXCkpXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFxcX1xcKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcXF9cXCkpXG5cbmZvcihyZXMgaW4gYygyNSwgMTAsIDUpKXtcbiAgbWluVmFsdWUgPC0gLTRcbiAgbWF4VmFsdWUgPC0gNVxuICBvYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cF9cXCwgcmVzLCBcXGtiLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuICBcbiAgXG4gICMgZFRBR1xuICBvYnNleHAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShvYnNleHAkbG9nX29ic2V4cF9ETVNPLCBvYnNleHAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKVxuICBvYnNleHAgPC0gb2JzZXhwICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuICBnMSA8LSBnZ3Bsb3Qob2JzZXhwLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFxcbm9uZVxcKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gICAgZ2d0aXRsZShwYXN0ZTAocmVzLCBcXGtiXG4ifQ== -->
# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

for(res in c(25, 10, 5)){
  minValue <- -4
  maxValue <- 5
  obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp_\, res, \kb.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))
  
  
  # dTAG
  obsexp$density <- get_density(obsexp$log_obsexp_DMSO, obsexp$log_obsexp_dTAG, n = 100)
  obsexp <- obsexp %>% dplyr::arrange(density)
  g1 <- ggplot(obsexp, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) + 
    geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
    geom_abline(slope = 1, intercept = 0) +
    ggtitle(paste0(res, \kb
```r
# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

for(res in c(25, 10, 5)){
  minValue <- -4
  maxValue <- 5
  obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp_\, res, \kb.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))
  
  
  # dTAG
  obsexp$density <- get_density(obsexp$log_obsexp_DMSO, obsexp$log_obsexp_dTAG, n = 100)
  obsexp <- obsexp %>% dplyr::arrange(density)
  g1 <- ggplot(obsexp, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) + 
    geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
    geom_abline(slope = 1, intercept = 0) +
    ggtitle(paste0(res, \kb
Async

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBJbXBvcnRpbmcgbG9vcHNcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5cbm1pblZhbHVlIDwtIC00XG5tYXhWYWx1ZSA8LSA1XG5cbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFwibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlwiKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuXG5cblxuIyBkVEFHXG5vYnNleHAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShvYnNleHAkbG9nX29ic2V4cF9ETVNPLCBvYnNleHAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKVxub2JzZXhwIDwtIG9ic2V4cCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmcxIDwtIGdncGxvdChvYnNleHAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzL2V4cClcIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxuIyBWaXN1YWxpemUgVVAgRE9XTiBsb29wc1xudGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLmRvd24kaWQpXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzIgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzL2V4cCksIGRvd25cIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxuXG50ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3Aubm8kaWQpXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzMgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzL2V4cCksIG5vXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC51cCRpZClcbnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfRE1TTywgdGVtcCRsb2dfb2JzZXhwX2RUQUcsIG4gPSAxMDApXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nNCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMvZXhwKSwgdXBcIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXCJvYnNleHBfZFRBR192c19ETVNPXCIpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gMTJcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5wbmdcIikpLCByZXMgPSA2MDAsIHVuaXQgPSBcImluXCIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnN2Z1wiKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQoZzEsIGc0LCBnMywgZzIsIG5jb2wgPSA0KSlcbmRldi5vZmYoKVxuXG5cbiMgU3RydWN0dXJhbFxubG9vcC5zdHIgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmUuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5zdHIkaWQpXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzUgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzL2V4cCksIHN0cnVjdHVyYWwgbG9vcHNcIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxuIyBSZWcgKFBFLVBFKVxubG9vcC5yZWcgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZS5iZWRwZVwiKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gXCJfXCIpKVxudGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnJlZyRpZClcbnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfRE1TTywgdGVtcCRsb2dfb2JzZXhwX2RUQUcsIG4gPSAxMDApXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nNiA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMvZXhwKSwgcmVndWxhdG9yeSBsb29wc1wiKSkgK1xuICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIFxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXCJvYnNleHBfZFRBR192c19ETVNPX3N0cl92c19yZWdcIilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSA2XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIucG5nXCIpKSwgcmVzID0gNjAwLCB1bml0ID0gXCJpblwiLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQoZzUsIGc2LCBuY29sID0gMikpXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIuc3ZnXCIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChnNSwgZzYsIG5jb2wgPSAyKSlcbmRldi5vZmYoKVxuYGBgIn0= -->

```r
# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

minValue <- -4
maxValue <- 5

obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))



# dTAG
obsexp$density <- get_density(obsexp$log_obsexp_DMSO, obsexp$log_obsexp_dTAG, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obsexp_DMSO, temp$log_obsexp_dTAG, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)
```r
# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

minValue <- -4
maxValue <- 5

obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))



# dTAG
obsexp$density <- get_density(obsexp$log_obsexp_DMSO, obsexp$log_obsexp_dTAG, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obsexp_DMSO, temp$log_obsexp_dTAG, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)

Comparing obs/exp from chrommosight loop scores

dTAG per res

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5zcGVjaWZpY0xvb3AuMjVrYiA8LSBmcmVhZChoZXJlKGxvb3BEaXIsIFwiRzEuRE1TTy5NZXJnZWRfY2hyb21vc2lnaHRfMjVrYi5iZWRwZVwiKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5zcGVjaWZpY0xvb3AuMTBrYiA8LSBmcmVhZChoZXJlKGxvb3BEaXIsIFwiRzEuRE1TTy5NZXJnZWRfY2hyb21vc2lnaHRfMTBrYi5iZWRwZVwiKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5zcGVjaWZpY0xvb3AuNWtiIDwtIGZyZWFkKGhlcmUobG9vcERpciwgXCJHMS5ETVNPLk1lcmdlZF9jaHJvbW9zaWdodF81a2IuYmVkcGVcIikpICU+JVxuICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gXCJfXCIpKVxuXG5zcGVjaWZpY0xvb3BzLkRNU08gPC0gYyhzcGVjaWZpY0xvb3AuMjVrYiRpZCwgc3BlY2lmaWNMb29wLjEwa2IkaWQsIHNwZWNpZmljTG9vcC41a2IkaWQpXG5cblxubWluVmFsdWUgPC0gLTRcbm1heFZhbHVlIDwtIDVcblxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXCJsb29wU2NvcmVfY29uc19vYnNleHAudHN2XCIpKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSkpXG5cblxuXG5cbiMgU3RydWN0dXJhbFxubG9vcC5zdHIgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmUuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5zdHIkaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCAlaW4lIHNwZWNpZmljTG9vcHMuRE1TTylcbnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfRE1TTywgdGVtcCRsb2dfb2JzZXhwX2RUQUcsIG4gPSAxMDApXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nNSA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMvZXhwKSwgc3RydWN0dXJhbCBsb29wc1wiKSkgK1xuICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIFxuXG4jIFJlZyAoUEUtUEUpXG5sb29wLnJlZyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXCJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG50ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3AucmVnJGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgJWluJSBzcGVjaWZpY0xvb3BzLkRNU08pXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzYgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzL2V4cCksIHJlZ3VsYXRvcnkgbG9vcHNcIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFwib2JzZXhwX2RUQUdfdnNfRE1TT19zdHJfdnNfcmVnX0RNU09zcGVjaWZpY0xvb3BzXCIpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gNlxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIHJlcyA9IDYwMCwgdW5pdCA9IFwiaW5cIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKGc1LCBnNiwgbmNvbCA9IDIpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnN2Z1wiKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQoZzUsIGc2LCBuY29sID0gMikpXG5kZXYub2ZmKClcblxuYGBgIn0= -->

```r

specificLoop.25kb <- fread(here(loopDir, \G1.DMSO.Merged_chromosight_25kb.bedpe\)) %>%
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
specificLoop.10kb <- fread(here(loopDir, \G1.DMSO.Merged_chromosight_10kb.bedpe\)) %>%
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
specificLoop.5kb <- fread(here(loopDir, \G1.DMSO.Merged_chromosight_5kb.bedpe\)) %>%
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

specificLoops.DMSO <- c(specificLoop.25kb$id, specificLoop.10kb$id, specificLoop.5kb$id)


minValue <- -4
maxValue <- 5

obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))




# Structural
loop.str <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
temp <- obsexp %>% dplyr::filter(id %in% loop.str$id,
                                 id %in% specificLoops.DMSO)
temp$density <- get_density(temp$log_obsexp_DMSO, temp$log_obsexp_dTAG, n = 100)
temp <- temp %>% dplyr::arrange(density)
g5 <- ggplot(temp, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)
```r

specificLoop.25kb <- fread(here(loopDir, \G1.DMSO.Merged_chromosight_25kb.bedpe\)) %>%
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
specificLoop.10kb <- fread(here(loopDir, \G1.DMSO.Merged_chromosight_10kb.bedpe\)) %>%
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
specificLoop.5kb <- fread(here(loopDir, \G1.DMSO.Merged_chromosight_5kb.bedpe\)) %>%
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

specificLoops.DMSO <- c(specificLoop.25kb$id, specificLoop.10kb$id, specificLoop.5kb$id)


minValue <- -4
maxValue <- 5

obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))




# Structural
loop.str <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
temp <- obsexp %>% dplyr::filter(id %in% loop.str$id,
                                 id %in% specificLoops.DMSO)
temp$density <- get_density(temp$log_obsexp_DMSO, temp$log_obsexp_dTAG, n = 100)
temp <- temp %>% dplyr::arrange(density)
g5 <- ggplot(temp, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)
dTAG all res

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubmFtZSA8LSBcImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcIlxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFwiLnRzdlwiKSkpXG5cbiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldFxubWluVmFsdWUgPC0gLTRcbm1heFZhbHVlIDwtIDVcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFwibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlwiKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuXG4jIE1lcmdlIGRhdGFzZXRcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcImlkXCIpKSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuXG4jIEltcG9ydGluZyBsb29wc1xubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXCJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXCJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVwiKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gXCJfXCIpKVxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXCJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcblxuIyBkaXN0YW5jZSBmaWx0ZXJcbm9ic2V4cCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGRpc3RhbmNlID4gMWU2KVxuXG5cbiMgZFRBR1xub2JzZXhwJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkob2JzZXhwJGxvZ19vYnNleHBfRE1TTywgb2JzZXhwJGxvZ19vYnNleHBfZFRBRywgbiA9IDEwMClcbm9ic2V4cCA8LSBvYnNleHAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nMSA8LSBnZ3Bsb3Qob2JzZXhwLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icy9leHApXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cbiMgVmlzdWFsaXplIFVQIERPV04gbG9vcHNcbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5kb3duJGlkKVxudGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfZFRBRywgbiA9IDEwMClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmcyIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icy9leHApLCBkb3duXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cblxudGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLm5vJGlkKVxudGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfZFRBRywgbiA9IDEwMClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmczIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icy9leHApLCBub1wiKSkgK1xuICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIFxuXG50ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3AudXAkaWQpXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzQgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzL2V4cCksIHVwXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFwib2JzZXhwX2RUQUdfdnNfRE1TT18xbWJvdmVyXCIpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gMTJcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5wbmdcIikpLCByZXMgPSA2MDAsIHVuaXQgPSBcImluXCIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnN2Z1wiKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQoZzEsIGc0LCBnMywgZzIsIG5jb2wgPSA0KSlcbmRldi5vZmYoKVxuXG5cbiMgU3RydWN0dXJhbFxubG9vcC5zdHIgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmUuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5zdHIkaWQpXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzUgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzL2V4cCksIHN0cnVjdHVyYWwgbG9vcHNcIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxuIyBSZWcgKFBFLVBFKVxubG9vcC5yZWcgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZS5iZWRwZVwiKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gXCJfXCIpKVxudGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnJlZyRpZClcbnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfRE1TTywgdGVtcCRsb2dfb2JzZXhwX2RUQUcsIG4gPSAxMDApXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nNiA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMvZXhwKSwgcmVndWxhdG9yeSBsb29wc1wiKSkgK1xuICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIFxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXCJvYnNleHBfZFRBR192c19ETVNPXzFtYm92ZXJfc3RyX3ZzX3JlZ1wiKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDZcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5wbmdcIikpLCByZXMgPSA2MDAsIHVuaXQgPSBcImluXCIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChnNSwgZzYsIG5jb2wgPSAyKSlcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5zdmdcIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKGc1LCBnNiwgbmNvbCA9IDIpKVxuZGV2Lm9mZigpXG5gYGAifQ== -->

```r
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue <- -4
maxValue <- 5
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\)) %>% dplyr::mutate(distance = start2 - start1)


# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

# distance filter
obsexp <- data %>% dplyr::filter(distance > 1e6)


# dTAG
obsexp$density <- get_density(obsexp$log_obsexp_DMSO, obsexp$log_obsexp_dTAG, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obsexp_DMSO, temp$log_obsexp_dTAG, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)
```r
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue <- -4
maxValue <- 5
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\)) %>% dplyr::mutate(distance = start2 - start1)


# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

# distance filter
obsexp <- data %>% dplyr::filter(distance > 1e6)


# dTAG
obsexp$density <- get_density(obsexp$log_obsexp_DMSO, obsexp$log_obsexp_dTAG, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obsexp_DMSO, temp$log_obsexp_dTAG, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)
Plotting only subset

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubWluVmFsdWUgPC0gLTRcbm1heFZhbHVlIDwtIDEwXG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcImxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcIikpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNfRE1TTyA9IGlmX2Vsc2Uob2JzX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzX0RNU08pKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNfZFRBRyA9IGlmX2Vsc2Uob2JzX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzX2RUQUcpKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNfQTQ4NSA9IGlmX2Vsc2Uob2JzX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzX0E0ODUpKSlcblxuIyBJbXBvcnRpbmcgbG9vcHNcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5cblxuXG4jIGRUQUdcbm9ic2V4cCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KG9ic2V4cCRsb2dfb2JzX0RNU08sIG9ic2V4cCRsb2dfb2JzX2RUQUcsIG4gPSAxMDApXG5vYnNleHAgPC0gb2JzZXhwICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzEgPC0gZ2dwbG90KG9ic2V4cCwgYWVzKHggPSBsb2dfb2JzX0RNU08sIHkgPSBsb2dfb2JzX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMpXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cbiMgVmlzdWFsaXplIFVQIERPV04gbG9vcHNcbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5kb3duJGlkKVxudGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic19ETVNPLCB0ZW1wJGxvZ19vYnNfZFRBRywgbiA9IDEwMClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmcyIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNfRE1TTywgeSA9IGxvZ19vYnNfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icyksIGRvd25cIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxuXG50ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3Aubm8kaWQpXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzX0RNU08sIHRlbXAkbG9nX29ic19kVEFHLCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzMgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzKSwgbm9cIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxudGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnVwJGlkKVxudGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic19ETVNPLCB0ZW1wJGxvZ19vYnNfZFRBRywgbiA9IDEwMClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmc0IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNfRE1TTywgeSA9IGxvZ19vYnNfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icyksIHVwXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFwib2JzZXhwX2RUQUdfdnNfRE1TT19vYnNcIilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSAxMlxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIHJlcyA9IDYwMCwgdW5pdCA9IFwiaW5cIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKGcxLCBnNCwgZzMsIGcyLCBuY29sID0gNCkpXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIuc3ZnXCIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKVxuZGV2Lm9mZigpXG5cblxuIyBTdHJ1Y3R1cmFsXG5sb29wLnN0ciA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXCJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZS5iZWRwZVwiKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gXCJfXCIpKVxudGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnN0ciRpZClcbnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNfRE1TTywgdGVtcCRsb2dfb2JzX2RUQUcsIG4gPSAxMDApXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nNSA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzX0RNU08sIHkgPSBsb2dfb2JzX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMpLCBzdHJ1Y3R1cmFsIGxvb3BzXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cbiMgUmVnIChQRS1QRSlcbmxvb3AucmVnIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5yZWckaWQpXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzX0RNU08sIHRlbXAkbG9nX29ic19kVEFHLCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzYgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzKSwgcmVndWxhdG9yeSBsb29wc1wiKSkgK1xuICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIFxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXCJvYnNleHBfZFRBR192c19ETVNPX29ic19zdHJfdnNfcmVnXCIpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gNlxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIHJlcyA9IDYwMCwgdW5pdCA9IFwiaW5cIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKGc1LCBnNiwgbmNvbCA9IDIpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnN2Z1wiKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQoZzUsIGc2LCBuY29sID0gMikpXG5kZXYub2ZmKClcbmBgYCJ9 -->

```r
minValue <- -4
maxValue <- 10
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                  log_obs_DMSO = if_else(obs_DMSO == 0, minValue, log2(obs_DMSO)),
                  log_obs_dTAG = if_else(obs_dTAG == 0, minValue, log2(obs_dTAG)),
                  log_obs_A485 = if_else(obs_A485 == 0, minValue, log2(obs_A485)))

# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))



# dTAG
obsexp$density <- get_density(obsexp$log_obs_DMSO, obsexp$log_obs_dTAG, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obs_DMSO, y = log_obs_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obs_DMSO, temp$log_obs_dTAG, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obs_DMSO, y = log_obs_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs)
```r
minValue <- -4
maxValue <- 10
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                  log_obs_DMSO = if_else(obs_DMSO == 0, minValue, log2(obs_DMSO)),
                  log_obs_dTAG = if_else(obs_dTAG == 0, minValue, log2(obs_dTAG)),
                  log_obs_A485 = if_else(obs_A485 == 0, minValue, log2(obs_A485)))

# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))



# dTAG
obsexp$density <- get_density(obsexp$log_obs_DMSO, obsexp$log_obs_dTAG, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obs_DMSO, y = log_obs_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obs_DMSO, temp$log_obs_dTAG, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obs_DMSO, y = log_obs_dTAG, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs)
Plotting 1mb

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBJbXBvcnRpbmcgbG9vcHNcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5cbm1pblZhbHVlIDwtIC04XG5tYXhWYWx1ZSA8LSA3XG5cbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFwibG9vcFNjb3JlX2NvbnNfb2JzZXhwX0FzeW5jLnRzdlwiKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfVVQgPSBpZl9lbHNlKG9ic2V4cF9VVCA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfVVQpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0FJRCA9IGlmX2Vsc2Uob2JzZXhwX0FJRCA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQUlEKSkpXG5cblxuXG4jIGRUQUdcbm9ic2V4cCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KG9ic2V4cCRsb2dfb2JzZXhwX1VULCBvYnNleHAkbG9nX29ic2V4cF9BSUQsIG4gPSAxMDApXG5vYnNleHAgPC0gb2JzZXhwICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzEgPC0gZ2dwbG90KG9ic2V4cCwgYWVzKHggPSBsb2dfb2JzZXhwX1VULCB5ID0gbG9nX29ic2V4cF9BSUQsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMvZXhwKVwiKSkgK1xuICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIFxuXG4jIFZpc3VhbGl6ZSBVUCBET1dOIGxvb3BzXG50ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3AuZG93biRpZClcbnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfVVQsIHRlbXAkbG9nX29ic2V4cF9BSUQsIG4gPSAxMDApXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nMiA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX1VULCB5ID0gbG9nX29ic2V4cF9BSUQsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMvZXhwKSwgZG93blwiKSkgK1xuICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIFxuXG5cbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5ubyRpZClcbnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfVVQsIHRlbXAkbG9nX29ic2V4cF9BSUQsIG4gPSAxMDApXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nMyA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX1VULCB5ID0gbG9nX29ic2V4cF9BSUQsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMvZXhwKSwgbm9cIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxudGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnVwJGlkKVxudGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9VVCwgdGVtcCRsb2dfb2JzZXhwX0FJRCwgbiA9IDEwMClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmc0IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfVVQsIHkgPSBsb2dfb2JzZXhwX0FJRCwgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icy9leHApLCB1cFwiKSkgK1xuICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIFxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcIm9ic2V4cF9BSURfdnNfVVRcIilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSAxMlxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIHJlcyA9IDYwMCwgdW5pdCA9IFwiaW5cIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKGcxLCBnNCwgZzMsIGcyLCBuY29sID0gNCkpXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIuc3ZnXCIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKVxuZGV2Lm9mZigpXG5cblxuIyBTdHJ1Y3R1cmFsXG5sb29wLnN0ciA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXCJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZS5iZWRwZVwiKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gXCJfXCIpKVxudGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnN0ciRpZClcbnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfVVQsIHRlbXAkbG9nX29ic2V4cF9BSUQsIG4gPSAxMDApXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nNSA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX1VULCB5ID0gbG9nX29ic2V4cF9BSUQsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMvZXhwKSwgc3RydWN0dXJhbCBsb29wc1wiKSkgK1xuICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIFxuXG4jIFJlZyAoUEUtUEUpXG5sb29wLnJlZyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXCJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG50ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3AucmVnJGlkKVxudGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9VVCwgdGVtcCRsb2dfb2JzZXhwX0FJRCwgbiA9IDEwMClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmc2IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfVVQsIHkgPSBsb2dfb2JzZXhwX0FJRCwgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icy9leHApLCByZWd1bGF0b3J5IGxvb3BzXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcIm9ic2V4cF9BSURfdnNfVVRfc3RyX3ZzX3JlZ1wiKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDZcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5wbmdcIikpLCByZXMgPSA2MDAsIHVuaXQgPSBcImluXCIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChnNSwgZzYsIG5jb2wgPSAyKSlcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5zdmdcIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKGc1LCBnNiwgbmNvbCA9IDIpKVxuZGV2Lm9mZigpXG5gYGAifQ== -->

```r
# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

minValue <- -8
maxValue <- 7

obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp_Async.tsv\))) %>%
  dplyr::mutate(log_obsexp_UT = if_else(obsexp_UT == 0, minValue, log2(obsexp_UT)),
                log_obsexp_AID = if_else(obsexp_AID == 0, minValue, log2(obsexp_AID)))



# dTAG
obsexp$density <- get_density(obsexp$log_obsexp_UT, obsexp$log_obsexp_AID, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obsexp_UT, y = log_obsexp_AID, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obsexp_UT, temp$log_obsexp_AID, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obsexp_UT, y = log_obsexp_AID, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)
```r
# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

minValue <- -8
maxValue <- 7

obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp_Async.tsv\))) %>%
  dplyr::mutate(log_obsexp_UT = if_else(obsexp_UT == 0, minValue, log2(obsexp_UT)),
                log_obsexp_AID = if_else(obsexp_AID == 0, minValue, log2(obsexp_AID)))



# dTAG
obsexp$density <- get_density(obsexp$log_obsexp_UT, obsexp$log_obsexp_AID, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obsexp_UT, y = log_obsexp_AID, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obsexp_UT, temp$log_obsexp_AID, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obsexp_UT, y = log_obsexp_AID, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)
Plotting Obs

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5taW5WYWx1ZSA8LSAtMjBcbm1heFZhbHVlIDwtIDEwXG5cbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFwibG9vcFNjb3JlX2NvbnNfb2JzZXhwX0FzeW5jLnRzdlwiKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfVVQgPSBpZl9lbHNlKG9ic2V4cF9VVCA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfVVQpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0FJRCA9IGlmX2Vsc2Uob2JzZXhwX0FJRCA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQUlEKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic19VVCA9IGlmX2Vsc2Uob2JzX1VUID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic19VVCkpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNfQUlEID0gaWZfZWxzZShvYnNfQUlEID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic19BSUQpKSlcblxuIyBJbXBvcnRpbmcgbG9vcHNcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5cblxuXG4jIGRUQUdcbm9ic2V4cCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KG9ic2V4cCRsb2dfb2JzX1VULCBvYnNleHAkbG9nX29ic19BSUQsIG4gPSAxMDApXG5vYnNleHAgPC0gb2JzZXhwICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzEgPC0gZ2dwbG90KG9ic2V4cCwgYWVzKHggPSBsb2dfb2JzX1VULCB5ID0gbG9nX29ic19BSUQsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMpXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cbiMgVmlzdWFsaXplIFVQIERPV04gbG9vcHNcbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5kb3duJGlkKVxudGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic19VVCwgdGVtcCRsb2dfb2JzX0FJRCwgbiA9IDEwMClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmcyIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNfVVQsIHkgPSBsb2dfb2JzX0FJRCwgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icyksIGRvd25cIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxuXG50ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3Aubm8kaWQpXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzX1VULCB0ZW1wJGxvZ19vYnNfQUlELCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzMgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19VVCwgeSA9IGxvZ19vYnNfQUlELCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzKSwgbm9cIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxudGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnVwJGlkKVxudGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic19VVCwgdGVtcCRsb2dfb2JzX0FJRCwgbiA9IDEwMClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmc0IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNfVVQsIHkgPSBsb2dfb2JzX0FJRCwgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icyksIHVwXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFwib2JzX0FJRF92c19VVF9vYnNcIilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSAxMlxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIHJlcyA9IDYwMCwgdW5pdCA9IFwiaW5cIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKGcxLCBnNCwgZzMsIGcyLCBuY29sID0gNCkpXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIuc3ZnXCIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKVxuZGV2Lm9mZigpXG5cblxuIyBTdHJ1Y3R1cmFsXG5sb29wLnN0ciA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXCJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZS5iZWRwZVwiKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gXCJfXCIpKVxudGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnN0ciRpZClcbnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNfVVQsIHRlbXAkbG9nX29ic19BSUQsIG4gPSAxMDApXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nNSA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzX1VULCB5ID0gbG9nX29ic19BSUQsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMpLCBzdHJ1Y3R1cmFsIGxvb3BzXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cbiMgUmVnIChQRS1QRSlcbmxvb3AucmVnIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5yZWckaWQpXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzX1VULCB0ZW1wJGxvZ19vYnNfQUlELCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzYgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19VVCwgeSA9IGxvZ19vYnNfQUlELCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzKSwgcmVndWxhdG9yeSBsb29wc1wiKSkgK1xuICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIFxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXCJvYnNfQUlEX3ZzX1VUX29ic19zdHJfdnNfcmVnXCIpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gNlxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIHJlcyA9IDYwMCwgdW5pdCA9IFwiaW5cIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKGc1LCBnNiwgbmNvbCA9IDIpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnN2Z1wiKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQoZzUsIGc2LCBuY29sID0gMikpXG5kZXYub2ZmKClcbmBgYCJ9 -->

```r

minValue <- -20
maxValue <- 10

obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp_Async.tsv\))) %>%
  dplyr::mutate(log_obsexp_UT = if_else(obsexp_UT == 0, minValue, log2(obsexp_UT)),
                log_obsexp_AID = if_else(obsexp_AID == 0, minValue, log2(obsexp_AID)),
                log_obs_UT = if_else(obs_UT == 0, minValue, log2(obs_UT)),
                log_obs_AID = if_else(obs_AID == 0, minValue, log2(obs_AID)))

# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))



# dTAG
obsexp$density <- get_density(obsexp$log_obs_UT, obsexp$log_obs_AID, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obs_UT, y = log_obs_AID, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obs_UT, temp$log_obs_AID, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obs_UT, y = log_obs_AID, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs)
```r

minValue <- -20
maxValue <- 10

obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp_Async.tsv\))) %>%
  dplyr::mutate(log_obsexp_UT = if_else(obsexp_UT == 0, minValue, log2(obsexp_UT)),
                log_obsexp_AID = if_else(obsexp_AID == 0, minValue, log2(obsexp_AID)),
                log_obs_UT = if_else(obs_UT == 0, minValue, log2(obs_UT)),
                log_obs_AID = if_else(obs_AID == 0, minValue, log2(obs_AID)))

# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))



# dTAG
obsexp$density <- get_density(obsexp$log_obs_UT, obsexp$log_obs_AID, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obs_UT, y = log_obs_AID, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obs_UT, temp$log_obs_AID, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obs_UT, y = log_obs_AID, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs)
Async.AID all res

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBJbXBvcnRpbmcgbG9vcHNcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5cbmZvcihyZXMgaW4gYygyNSwgMTAsIDUpKXtcbiAgbWluVmFsdWUgPC0gLTRcbiAgbWF4VmFsdWUgPC0gNVxuICBvYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcImxvb3BTY29yZV9jb25zX29ic2V4cF9cIiwgcmVzLCBcImtiLnRzdlwiKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuICBcbiAgXG4gICMgQTQ4NVxuICBvYnNleHAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShvYnNleHAkbG9nX29ic2V4cF9ETVNPLCBvYnNleHAkbG9nX29ic2V4cF9BNDg1LCBuID0gMTAwKVxuICBvYnNleHAgPC0gb2JzZXhwICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuICBnMSA8LSBnZ3Bsb3Qob2JzZXhwLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gICAgZ2d0aXRsZShwYXN0ZTAocmVzLCBcImtiLCBsb2cyKG9icy9leHApXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG4gIFxuICBcbiAgIyBWaXN1YWxpemUgVVAgRE9XTiBsb29wc1xuICB0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3AuZG93biRpZClcbiAgdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfQTQ4NSwgbiA9IDEwMClcbiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuICBnMiA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX0E0ODUsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICAgIGdndGl0bGUocGFzdGUwKHJlcywgXCJrYiwgbG9nMihvYnMvZXhwKSwgZG93blwiKSkgK1xuICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIFxuICBcbiAgXG4gIHRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5ubyRpZClcbiAgdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfQTQ4NSwgbiA9IDEwMClcbiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuICBnMyA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX0E0ODUsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICAgIGdndGl0bGUocGFzdGUwKHJlcywgXCJrYiwgbG9nMihvYnMvZXhwKSwgbm9cIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcbiAgXG4gIHRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC51cCRpZClcbiAgdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfQTQ4NSwgbiA9IDEwMClcbiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuICBnNCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX0E0ODUsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICAgIGdndGl0bGUocGFzdGUwKHJlcywgXCJrYiwgbG9nMihvYnMvZXhwKSwgdXBcIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcbiAgXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXCJvYnNleHBfQTQ4NV92c19ETVNPX1wiLCByZXMsIFwia2JcIilcbiAgaGVpZ2h0IDwtIDRcbiAgd2lkdGggPC0gMTJcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIHJlcyA9IDYwMCwgdW5pdCA9IFwiaW5cIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwbG90X2dyaWQoZzEsIGc0LCBnMywgZzIsIG5jb2wgPSA0KSlcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIuc3ZnXCIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocGxvdF9ncmlkKGcxLCBnNCwgZzMsIGcyLCBuY29sID0gNCkpXG4gIGRldi5vZmYoKVxufVxuXG5gYGAifQ== -->

```r
# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

for(res in c(25, 10, 5)){
  minValue <- -4
  maxValue <- 5
  obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp_\, res, \kb.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))
  
  
  # A485
  obsexp$density <- get_density(obsexp$log_obsexp_DMSO, obsexp$log_obsexp_A485, n = 100)
  obsexp <- obsexp %>% dplyr::arrange(density)
  g1 <- ggplot(obsexp, aes(x = log_obsexp_DMSO, y = log_obsexp_A485, color = density)) + 
    geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
    geom_abline(slope = 1, intercept = 0) +
    ggtitle(paste0(res, \kb
```r
# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

for(res in c(25, 10, 5)){
  minValue <- -4
  maxValue <- 5
  obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp_\, res, \kb.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))
  
  
  # A485
  obsexp$density <- get_density(obsexp$log_obsexp_DMSO, obsexp$log_obsexp_A485, n = 100)
  obsexp <- obsexp %>% dplyr::arrange(density)
  g1 <- ggplot(obsexp, aes(x = log_obsexp_DMSO, y = log_obsexp_A485, color = density)) + 
    geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
    geom_abline(slope = 1, intercept = 0) +
    ggtitle(paste0(res, \kb
Plotting Obs

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBJbXBvcnRpbmcgbG9vcHNcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5cbm1pblZhbHVlIDwtIC00XG5tYXhWYWx1ZSA8LSA1XG5cbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFwibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlwiKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuXG5cbiMgQTQ4NVxub2JzZXhwJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkob2JzZXhwJGxvZ19vYnNleHBfRE1TTywgb2JzZXhwJGxvZ19vYnNleHBfQTQ4NSwgbiA9IDEwMClcbm9ic2V4cCA8LSBvYnNleHAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nMSA8LSBnZ3Bsb3Qob2JzZXhwLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icy9leHApXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cbiMgVmlzdWFsaXplIFVQIERPV04gbG9vcHNcbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5kb3duJGlkKVxudGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfQTQ4NSwgbiA9IDEwMClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmcyIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icy9leHApLCBkb3duXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cblxudGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLm5vJGlkKVxudGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfQTQ4NSwgbiA9IDEwMClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmczIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icy9leHApLCBub1wiKSkgK1xuICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIFxuXG50ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3AudXAkaWQpXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9BNDg1LCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzQgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9BNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzL2V4cCksIHVwXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFwib2JzZXhwX0E0ODVfdnNfRE1TT1wiKVxuaGVpZ2h0IDwtIDRcbndpZHRoIDwtIDEyXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIucG5nXCIpKSwgcmVzID0gNjAwLCB1bml0ID0gXCJpblwiLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQoZzEsIGc0LCBnMywgZzIsIG5jb2wgPSA0KSlcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5zdmdcIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKGcxLCBnNCwgZzMsIGcyLCBuY29sID0gNCkpXG5kZXYub2ZmKClcblxuXG4jIFN0cnVjdHVyYWxcbmxvb3Auc3RyIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG50ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3Auc3RyJGlkKVxudGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfQTQ4NSwgbiA9IDEwMClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmc1IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icy9leHApLCBzdHJ1Y3R1cmFsIGxvb3BzXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cbiMgUmVnIChQRS1QRSlcbmxvb3AucmVnIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5yZWckaWQpXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9BNDg1LCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzYgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9BNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzL2V4cCksIHJlZ3VsYXRvcnkgbG9vcHNcIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFwib2JzZXhwX0E0ODVfdnNfRE1TT19zdHJfdnNfcmVnXCIpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gNlxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIHJlcyA9IDYwMCwgdW5pdCA9IFwiaW5cIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKGc1LCBnNiwgbmNvbCA9IDIpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnN2Z1wiKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQoZzUsIGc2LCBuY29sID0gMikpXG5kZXYub2ZmKClcbmBgYCJ9 -->

```r
# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

minValue <- -4
maxValue <- 5

obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))


# A485
obsexp$density <- get_density(obsexp$log_obsexp_DMSO, obsexp$log_obsexp_A485, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obsexp_DMSO, y = log_obsexp_A485, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obsexp_DMSO, temp$log_obsexp_A485, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obsexp_DMSO, y = log_obsexp_A485, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)
```r
# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))

minValue <- -4
maxValue <- 5

obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))


# A485
obsexp$density <- get_density(obsexp$log_obsexp_DMSO, obsexp$log_obsexp_A485, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obsexp_DMSO, y = log_obsexp_A485, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obsexp_DMSO, temp$log_obsexp_A485, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obsexp_DMSO, y = log_obsexp_A485, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs/exp)
A485 per res

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubWluVmFsdWUgPC0gLTRcbm1heFZhbHVlIDwtIDEwXG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcImxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcIikpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNfRE1TTyA9IGlmX2Vsc2Uob2JzX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzX0RNU08pKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNfZFRBRyA9IGlmX2Vsc2Uob2JzX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzX2RUQUcpKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNfQTQ4NSA9IGlmX2Vsc2Uob2JzX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzX0E0ODUpKSlcblxuIyBJbXBvcnRpbmcgbG9vcHNcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlXCIpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsXG4gICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSBcIl9cIikpXG5cblxuXG4jIGRUQUdcbm9ic2V4cCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KG9ic2V4cCRsb2dfb2JzX0RNU08sIG9ic2V4cCRsb2dfb2JzX0E0ODUsIG4gPSAxMDApXG5vYnNleHAgPC0gb2JzZXhwICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzEgPC0gZ2dwbG90KG9ic2V4cCwgYWVzKHggPSBsb2dfb2JzX0RNU08sIHkgPSBsb2dfb2JzX0E0ODUsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMpXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cbiMgVmlzdWFsaXplIFVQIERPV04gbG9vcHNcbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5kb3duJGlkKVxudGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic19ETVNPLCB0ZW1wJGxvZ19vYnNfQTQ4NSwgbiA9IDEwMClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmcyIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNfRE1TTywgeSA9IGxvZ19vYnNfQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icyksIGRvd25cIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxuXG50ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3Aubm8kaWQpXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzX0RNU08sIHRlbXAkbG9nX29ic19BNDg1LCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzMgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19BNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzKSwgbm9cIikpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSBcblxudGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnVwJGlkKVxudGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic19ETVNPLCB0ZW1wJGxvZ19vYnNfQTQ4NSwgbiA9IDEwMClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbmc0IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNfRE1TTywgeSA9IGxvZ19vYnNfQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSBcIm5vbmVcIikgK1xuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICtcbiAgZ2d0aXRsZShwYXN0ZTAoXCJsb2cyKG9icyksIHVwXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFwib2JzZXhwX0E0ODVfdnNfRE1TT19vYnNcIilcbmhlaWdodCA8LSA0XG53aWR0aCA8LSAxMlxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIHJlcyA9IDYwMCwgdW5pdCA9IFwiaW5cIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKGcxLCBnNCwgZzMsIGcyLCBuY29sID0gNCkpXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIuc3ZnXCIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKVxuZGV2Lm9mZigpXG5cblxuIyBTdHJ1Y3R1cmFsXG5sb29wLnN0ciA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXCJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZS5iZWRwZVwiKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLFxuICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gXCJfXCIpKVxudGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnN0ciRpZClcbnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNfRE1TTywgdGVtcCRsb2dfb2JzX0E0ODUsIG4gPSAxMDApXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpXG5nNSA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzX0RNU08sIHkgPSBsb2dfb2JzX0E0ODUsIGNvbG9yID0gZGVuc2l0eSkpICsgXG4gIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gXCJub25lXCIpICtcbiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArXG4gIGdndGl0bGUocGFzdGUwKFwibG9nMihvYnMpLCBzdHJ1Y3R1cmFsIGxvb3BzXCIpKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgXG5cbiMgUmVnIChQRS1QRSlcbmxvb3AucmVnIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGVcIikpICU+JSBcbiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMixcbiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9IFwiX1wiKSlcbnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5yZWckaWQpXG50ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzX0RNU08sIHRlbXAkbG9nX29ic19BNDg1LCBuID0gMTAwKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuZzYgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19BNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArIFxuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9IFwibm9uZVwiKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgK1xuICBnZ3RpdGxlKHBhc3RlMChcImxvZzIob2JzKSwgcmVndWxhdG9yeSBsb29wc1wiKSkgK1xuICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIFxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXCJvYnNleHBfQTQ4NV92c19ETVNPX29ic19zdHJfdnNfcmVnXCIpXG5oZWlnaHQgPC0gNFxud2lkdGggPC0gNlxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIHJlcyA9IDYwMCwgdW5pdCA9IFwiaW5cIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKGc1LCBnNiwgbmNvbCA9IDIpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnN2Z1wiKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQoZzUsIGc2LCBuY29sID0gMikpXG5kZXYub2ZmKClcbmBgYCJ9 -->

```r
minValue <- -4
maxValue <- 10
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                  log_obs_DMSO = if_else(obs_DMSO == 0, minValue, log2(obs_DMSO)),
                  log_obs_dTAG = if_else(obs_dTAG == 0, minValue, log2(obs_dTAG)),
                  log_obs_A485 = if_else(obs_A485 == 0, minValue, log2(obs_A485)))

# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))



# dTAG
obsexp$density <- get_density(obsexp$log_obs_DMSO, obsexp$log_obs_A485, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obs_DMSO, y = log_obs_A485, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obs_DMSO, temp$log_obs_A485, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obs_DMSO, y = log_obs_A485, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs)
```r
minValue <- -4
maxValue <- 10
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                  log_obs_DMSO = if_else(obs_DMSO == 0, minValue, log2(obs_DMSO)),
                  log_obs_dTAG = if_else(obs_dTAG == 0, minValue, log2(obs_dTAG)),
                  log_obs_A485 = if_else(obs_A485 == 0, minValue, log2(obs_A485)))

# Importing loops
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_UP_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_DOWN_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_A485vsDMSO_NO_diff0.2.bedpe\)) %>% 
  dplyr::mutate(binSize = V3 - V2,
                id = paste(V1, binSize, V2, V5, sep = \_\))



# dTAG
obsexp$density <- get_density(obsexp$log_obs_DMSO, obsexp$log_obs_A485, n = 100)
obsexp <- obsexp %>% dplyr::arrange(density)
g1 <- ggplot(obsexp, aes(x = log_obs_DMSO, y = log_obs_A485, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs)\)) +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) 

# Visualize UP DOWN loops
temp <- obsexp %>% dplyr::filter(id %in% loop.down$id)
temp$density <- get_density(temp$log_obs_DMSO, temp$log_obs_A485, n = 100)
temp <- temp %>% dplyr::arrange(density)
g2 <- ggplot(temp, aes(x = log_obs_DMSO, y = log_obs_A485, color = density)) + 
  geom_point() + theme_bw() + scale_color_viridis(guide = \none\) +
  geom_abline(slope = 1, intercept = 0) +
  ggtitle(paste0(\log2(obs)
A485 all res

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50X29lIDwtIGZ1bmN0aW9uKGRhdGEsIGZpZ0RpciwgbmFtZSwgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBGQUxTRSl7XG4gIGF2Z19zY29yZXNfbG9uZyA8LSBkYXRhICU+JVxuICAgIGdyb3VwX2J5KGRpc3RhbmNlLCBBbm5vMikgJT4lXG4gICAgc3VtbWFyaXNlKGF2Z19zY29yZSA9IG1lYW4oc2NvcmUsIG5hLnJtID0gVFJVRSkpICU+JVxuICAgIHVuZ3JvdXAoKSBcbiAgYXZnX3Njb3Jlc19sb25nJEFubm8yIDwtIGZhY3Rvcihhdmdfc2NvcmVzX2xvbmckQW5ubzIsIGxldmVsID0gbG9vcExpc3QpXG4gIHA0IDwtIGdncGxvdChhdmdfc2NvcmVzX2xvbmcsIGFlcyh4ID0gZGlzdGFuY2UsIHkgPSBhdmdfc2NvcmUsIGNvbG9yID0gQW5ubzIsIGZpbGwgPSBBbm5vMikpICsgXG4gICAgZ2VvbV9zbW9vdGgoc2hvdy5sZWdlbmQgPSBUUlVFLCBzZSA9IHNlKSAgK1xuICAgICN5bGltKDAsIDAuNSkgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KSArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KSArXG4gICAgbGFicyh0aXRsZSA9IHBhc3RlMChuYW1lKSxcbiAgICAgICAgIHggPSBcIkRpc3RhbmNlXCIsXG4gICAgICAgICB5ID0gXCJBdmVyYWdlIFNjb3JlXCIpICtcbiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSlcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcImRpc3RfdnNfc2NvcmVfbGluZVBsb3RfXCIsIG5hbWUpXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5wbmdcIikpLCBcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcImluXCIsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnN2Z1wiKSksIFxuICAgICAgICAgIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxufSBcblxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudF9vZSA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gRkFMU0Upe1xuICBhdmdfc2NvcmVzX2xvbmcgPC0gZGF0YSAlPiVcbiAgICBncm91cF9ieShkaXN0YW5jZSwgQW5ubzIpICU+JVxuICAgIHN1bW1hcmlzZShhdmdfc2NvcmUgPSBtZWFuKHNjb3JlLCBuYS5ybSA9IFRSVUUpKSAlPiVcbiAgICB1bmdyb3VwKCkgXG4gIGF2Z19zY29yZXNfbG9uZyRBbm5vMiA8LSBmYWN0b3IoYXZnX3Njb3Jlc19sb25nJEFubm8yLCBsZXZlbCA9IGxvb3BMaXN0KVxuICBwNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IEFubm8yLCBmaWxsID0gQW5ubzIpKSArIFxuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICtcbiAgICBnZW9tX3Ntb290aChzaG93LmxlZ2VuZCA9IFRSVUUsIHNlID0gc2UpICArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvckxpc3QpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvckxpc3QpICtcbiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG5hbWUpLFxuICAgICAgICAgeCA9IFwiRGlzdGFuY2VcIixcbiAgICAgICAgIHkgPSBcIkF2ZXJhZ2UgRGlmZiBTY29yZVwiKSArXG4gICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFwiZGlzdF92c19zY29yZV9kaWZmbGluZVBsb3RfXCIsIG5hbWUpXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5wbmdcIikpLCBcbiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSBcImluXCIsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnN2Z1wiKSksIFxuICAgICAgICAgIHdpZHRoID0gNCwgaGVpZ2h0ID0gMylcbiAgcHJpbnQocDQpXG4gIGRldi5vZmYoKVxufSBcblxuY3JlYXRlX2Rpc3RfYmFycGxvdF9vZSA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIG5vdGUsIGxvb3BMaXN0LCBkaWZmQ3V0b2ZmLCBkaXN0YW5jZUZpbHRlciA9IDIqZTYpe1xuICAgIGRhdGEgPC0gZGF0YSAlPiUgXG4gICAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgIHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFwiVVBcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID4gLWRpZmZDdXRvZmYsIFwiTk9cIiwgXCJET1dOXCIpKSxcbiAgICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UobG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsIFwiVVBcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFwiTk9cIiwgXCJET1dOXCIpKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGxvb3BMaXN0LFxuICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPCBkaXN0YW5jZUZpbHRlcilcbiAgZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoXCJVUFwiLCBcIk5PXCIsIFwiRE9XTlwiKSlcbiAgZGF0YSR1cGRvd25fQTQ4NV9ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9BNDg1X0RNU08sIGxldmVscyA9IGMoXCJVUFwiLCBcIk5PXCIsIFwiRE9XTlwiKSlcbiAgXG4gIFxuICB0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoQW5ubzIsIGRpc3RhbmNlLCB1cGRvd25fZFRBR19ETVNPLCB1cGRvd25fQTQ4NV9ETVNPKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgbG9vcExpc3QsXG4gICAgICAgICAgICAgICAgICB1cGRvd25fZFRBR19ETVNPICVpbiUgYyhcIlVQXCIsIFwiTk9cIiwgXCJET1dOXCIpKVxuICBwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHVwZG93bl9kVEFHX0RNU08sIHkgPSBkaXN0YW5jZSkpICtcbiAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHVwZG93bl9kVEFHX0RNU08pKSArIFxuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHVwZG93bl9kVEFHX0RNU08pLCBmdW4gPSBtZWFuLCBnZW9tID0gXCJwb2ludFwiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFwicmVkXCIsIGNvbG9yID0gXCJibGFja1wiKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShub3RlKSArXG4gICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKVxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXCJzaXplX2JhcnBsb3RfXCIsIG5hbWUsIFwiX2RUQUdfdnNfRE1TT19cIiwgbm90ZSwgXCJfXCIsIGRpZmZDdXRvZmYpXG4gIGhlaWdodCA8LSAzXG4gIHdpZHRoIDwtIDRcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnBuZ1wiKSksIHJlcyA9IDYwMCwgdW5pdCA9IFwiaW5cIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5zdmdcIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgXG4gIFxuICB0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoQW5ubzIsIGRpc3RhbmNlLCB1cGRvd25fZFRBR19ETVNPLCB1cGRvd25fQTQ4NV9ETVNPKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgbG9vcExpc3QsXG4gICAgICAgICAgICAgICAgICB1cGRvd25fQTQ4NV9ETVNPICVpbiUgYyhcIlVQXCIsIFwiTk9cIiwgIFwiRE9XTlwiKSlcbiAgcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSB1cGRvd25fQTQ4NV9ETVNPLCB5ID0gZGlzdGFuY2UpKSArXG4gICAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSB1cGRvd25fQTQ4NV9ETVNPKSkgKyBcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSB1cGRvd25fQTQ4NV9ETVNPKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFwicG9pbnRcIiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcInJlZFwiLCBjb2xvciA9IFwiYmxhY2tcIikgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUobm90ZSkgK1xuICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYilcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFwic2l6ZV9iYXJwbG90X1wiLCBuYW1lLCBcIl9BNDg1X3ZzX0RNU09fXCIsIG5vdGUsIFwiX1wiLCBkaWZmQ3V0b2ZmKVxuICBoZWlnaHQgPC0gM1xuICB3aWR0aCA8LSA0XG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5wbmdcIikpLCByZXMgPSA2MDAsIHVuaXQgPSBcImluXCIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIuc3ZnXCIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5cbmNyZWF0ZV9sb29wX3NjYXR0ZXJwbG90X29lIDwtIGZ1bmN0aW9uKGRhdGEsIGZpZ0RpciwgbmFtZSwgQW5ubzJMaXN0LCBkaWZmQ3V0b2ZmKXtcbiAgZGF0YSA8LSBkYXRhICU+JVxuICAgIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID4gZGlmZkN1dG9mZiwgXCJVUFwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgXCJOT1wiLCBcIkRPV05cIikpLFxuICAgICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID4gZGlmZkN1dG9mZiwgXCJVUFwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgXCJOT1wiLCBcIkRPV05cIikpKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgQW5ubzJMaXN0KVxuICBkYXRhJHVwZG93bl9kVEFHX0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX2RUQUdfRE1TTywgbGV2ZWxzID0gYyhcIlVQXCIsIFwiTk9cIiwgXCJET1dOXCIpKVxuICBkYXRhJHVwZG93bl9BNDg1X0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX0E0ODVfRE1TTywgbGV2ZWxzID0gYyhcIlVQXCIsIFwiTk9cIiwgXCJET1dOXCIpKVxuICBcbiAgbnVtLnVwIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpW1wiVVBcIl1cbiAgbnVtLm5vIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpW1wiTk9cIl1cbiAgbnVtLmRvd24gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbXCJET1dOXCJdXG4gIG51bS5hbGwgPC0gbnVtLnVwICsgbnVtLm5vICsgbnVtLmRvd25cbiAgcGVyYy51cCA8LSByb3VuZChudW0udXAgLyBudW0uYWxsICogMTAwLCAyKVxuICBwZXJjLm5vIDwtIHJvdW5kKG51bS5ubyAvIG51bS5hbGwgKiAxMDAsIDIpXG4gIHBlcmMuZG93biA8LSByb3VuZChudW0uZG93biAvIG51bS5hbGwgKiAxMDAsIDIpXG4gIFxuICAjIyMgU2NhdHRlcnBsb3RcbiAgICBtaW5WYWx1ZSA8LSAtNFxuICBtYXhWYWx1ZSA8LSA1XG4gIGRhdGEkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShkYXRhJGxvZ19vYnNleHBfRE1TTywgZGF0YSRsb2dfb2JzZXhwX2RUQUcsIG4gPSAxMDApXG4gIGRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSlcbiAgY29ycmVsYXRpb24gPC0gY29yKGRhdGEkbG9nX29ic2V4cF9ETVNPLCBkYXRhJGxvZ19vYnNleHBfZFRBRylcbiAgcDEgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArXG4gICAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArXG4gICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXCJncmV5NTBcIiwgbGluZXR5cGUgPSBcImRhc2hlZFwiKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gXCJncmV5XCIsIGxpbmV0eXBlID0gXCJkb3R0ZWRcIikgK1xuICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gXCJncmV5XCIsIGxpbmV0eXBlID0gXCJkb3R0ZWRcIikgK1xuICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFwiZ3JleVwiKSArXG4gICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXCJncmV5XCIpICtcbiAgICBhbm5vdGF0ZShcInRleHRcIiwgeCA9IG1pblZhbHVlLCB5ID0gbWF4VmFsdWUsIGxhYmVsID0gcGFzdGUwKFwiVVA6IFwiLCBudW0udXAsIFwiIChcIiwgcGVyYy51cCwgXCIlKVwiKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcImJsYWNrXCIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgICBhbm5vdGF0ZShcInRleHRcIiwgeCA9IG1pblZhbHVlLCB5ID0gbWF4VmFsdWUtMSwgbGFiZWwgPSBwYXN0ZTAoXCJOTzogXCIsIG51bS5ubywgXCIgKFwiLCBwZXJjLm5vLCBcIiUpXCIpLCBcbiAgICAgICAgICAgICBjb2xvciA9IFwiYmxhY2tcIiwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICAgIGFubm90YXRlKFwidGV4dFwiLCB4ID0gbWluVmFsdWUsIHkgPSBtYXhWYWx1ZS0yLCBsYWJlbCA9IHBhc3RlMChcIkRPV046IFwiLCBudW0uZG93biwgXCIgKFwiLCBwZXJjLmRvd24sIFwiJSlcIiksIFxuICAgICAgICAgICAgIGNvbG9yID0gXCJibGFja1wiLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShuYW1lKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKSArXG4gICAgYW5ub3RhdGUoXCJ0ZXh0XCIsIHggPSBtaW5WYWx1ZSwgeSA9IG1heFZhbHVlLCBsYWJlbCA9IHBhc3RlKFwiciA9XCIsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9IFwiYmxhY2tcIilcblxuICBcbiAgXG4gIG51bS51cCA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9BNDg1X0RNU08pKVtcIlVQXCJdXG4gIG51bS5ubyA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9BNDg1X0RNU08pKVtcIk5PXCJdXG4gIG51bS5kb3duIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX0E0ODVfRE1TTykpW1wiRE9XTlwiXVxuICBudW0uYWxsIDwtIG51bS51cCArIG51bS5ubyArIG51bS5kb3duXG4gIHBlcmMudXAgPC0gcm91bmQobnVtLnVwIC8gbnVtLmFsbCAqIDEwMCwgMilcbiAgcGVyYy5ubyA8LSByb3VuZChudW0ubm8gLyBudW0uYWxsICogMTAwLCAyKVxuICBwZXJjLmRvd24gPC0gcm91bmQobnVtLmRvd24gLyBudW0uYWxsICogMTAwLCAyKVxuICBcbiAgZGF0YSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KGRhdGEkbG9nX29ic2V4cF9ETVNPLCBkYXRhJGxvZ19vYnNleHBfQTQ4NSwgbiA9IDEwMClcbiAgZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KVxuICBjb3JyZWxhdGlvbiA8LSBjb3IoZGF0YSRsb2dfb2JzZXhwX0RNU08sIGRhdGEkbG9nX29ic2V4cF9BNDg1KVxuICBwMiA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX0E0ODUsIGNvbG9yID0gZGVuc2l0eSkpICtcbiAgICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gICAgc2NhbGVfY29sb3JfdmlyaWRpcygpICtcbiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSBcImdyZXk1MFwiLCBsaW5ldHlwZSA9IFwiZGFzaGVkXCIpICtcbiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSBcImdyZXlcIiwgbGluZXR5cGUgPSBcImRvdHRlZFwiKSArXG4gICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSBcImdyZXlcIiwgbGluZXR5cGUgPSBcImRvdHRlZFwiKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gXCJncmV5XCIpICtcbiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcImdyZXlcIikgK1xuICAgIGFubm90YXRlKFwidGV4dFwiLCB4ID0gbWluVmFsdWUsIHkgPSBtYXhWYWx1ZSwgbGFiZWwgPSBwYXN0ZTAoXCJVUDogXCIsIG51bS51cCwgXCIgKFwiLCBwZXJjLnVwLCBcIiUpXCIpLCBcbiAgICAgICAgICAgICBjb2xvciA9IFwiYmxhY2tcIiwgaGp1c3QgPSAwLCBzaXplID0gMykgK1xuICAgIGFubm90YXRlKFwidGV4dFwiLCB4ID0gbWluVmFsdWUsIHkgPSBtYXhWYWx1ZS0xLCBsYWJlbCA9IHBhc3RlMChcIk5POiBcIiwgbnVtLm5vLCBcIiAoXCIsIHBlcmMubm8sIFwiJSlcIiksIFxuICAgICAgICAgICAgIGNvbG9yID0gXCJibGFja1wiLCBoanVzdCA9IDAsIHNpemUgPSAzKSArXG4gICAgYW5ub3RhdGUoXCJ0ZXh0XCIsIHggPSBtaW5WYWx1ZSwgeSA9IG1heFZhbHVlLTIsIGxhYmVsID0gcGFzdGUwKFwiRE9XTjogXCIsIG51bS5kb3duLCBcIiAoXCIsIHBlcmMuZG93biwgXCIlKVwiKSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcImJsYWNrXCIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICtcbiAgICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKG5hbWUpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpICtcbiAgICBhbm5vdGF0ZShcInRleHRcIiwgeCA9IG1pblZhbHVlLCB5ID0gbWF4VmFsdWUsIGxhYmVsID0gcGFzdGUoXCJyID1cIiwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gXCJibGFja1wiKVxuXG4gIFxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFwic2NhdHRlcnBsb3RfXCIsIG5hbWUsIFwiX1wiLCBkaWZmQ3V0b2ZmKVxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXCIucG5nXCIpKSwgcmVzID0gNjAwLCB1bml0cyA9IFwiaW5cIiwgd2lkdGggPSA1KjEuNSwgaGVpZ2h0ID0gMi41KjEuNSlcbiAgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSBcImhcIikpXG4gIGRldi5vZmYoKVxuICBcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5zdmdcIikpLCBcbiAgICAgICAgICB3aWR0aCA9IDUqMS41LCBoZWlnaHQgPSAyLjUqMS41KVxuICBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9IFwiaFwiKSlcbiAgZGV2Lm9mZigpXG59XG5cbm1ha2VfZGlmZl9iZWRwZV9vZSA8LSBmdW5jdGlvbihkYXRhLCBuYW1lLCBBbm5vMkxpc3QsIG91dERpciwgZGlmZkN1dG9mZil7XG4gIGRhdGEgPC0gZGF0YSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsIFwiVVBcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID4gLWRpZmZDdXRvZmYsIFwiTk9cIiwgXCJET1dOXCIpKSxcbiAgICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UobG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsIFwiVVBcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsIFwiTk9cIiwgXCJET1dOXCIpKSkgJT4lXG4gICAgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIEFubm8yTGlzdClcbiAgZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoXCJVUFwiLCBcIk5PXCIsIFwiRE9XTlwiKSlcbiAgZGF0YSR1cGRvd25fQTQ4NV9ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9BNDg1X0RNU08sIGxldmVscyA9IGMoXCJVUFwiLCBcIk5PXCIsIFwiRE9XTlwiKSlcbiAgXG4gIG91dC50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSBcIlVQXCIpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpXG4gIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCBcIl9kVEFHdnNETVNPX1VQX2RpZmZcIiwgZGlmZkN1dG9mZiwgXCIuYmVkcGVcIikpLCBcbiAgICAgICAgIHNlcCA9IFwiXFx0XCIsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBvdXQudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9kVEFHX0RNU08gPT0gXCJOT1wiKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYpKVxuICBmd3JpdGUob3V0LnRlbXAsIGhlcmUob3V0RGlyLCBwYXN0ZTAobmFtZSwgXCJfZFRBR3ZzRE1TT19OT19kaWZmXCIsIGRpZmZDdXRvZmYsIFwiLmJlZHBlXCIpKSwgXG4gICAgICAgICBzZXAgPSBcIlxcdFwiLCBjb2wubmFtZXMgPSBGQUxTRSlcbiAgb3V0LnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fZFRBR19ETVNPID09IFwiRE9XTlwiKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYpKVxuICBmd3JpdGUob3V0LnRlbXAsIGhlcmUob3V0RGlyLCBwYXN0ZTAobmFtZSwgXCJfZFRBR3ZzRE1TT19ET1dOX2RpZmZcIiwgZGlmZkN1dG9mZiwgXCIuYmVkcGVcIikpLCBcbiAgICAgICAgIHNlcCA9IFwiXFx0XCIsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBcbiAgb3V0LnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fQTQ4NV9ETVNPID09IFwiVVBcIikgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2KSlcbiAgZndyaXRlKG91dC50ZW1wLCBoZXJlKG91dERpciwgcGFzdGUwKG5hbWUsIFwiX0E0ODV2c0RNU09fVVBfZGlmZlwiLCBkaWZmQ3V0b2ZmLCBcIi5iZWRwZVwiKSksIFxuICAgICAgICAgc2VwID0gXCJcXHRcIiwgY29sLm5hbWVzID0gRkFMU0UpXG4gIG91dC50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX0E0ODVfRE1TTyA9PSBcIk5PXCIpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpXG4gIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCBcIl9BNDg1dnNETVNPX05PX2RpZmZcIiwgZGlmZkN1dG9mZiwgXCIuYmVkcGVcIikpLCBcbiAgICAgICAgIHNlcCA9IFwiXFx0XCIsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICBvdXQudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gXCJET1dOXCIpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpXG4gIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCBcIl9BNDg1dnNETVNPX0RPV05fZGlmZlwiLCBkaWZmQ3V0b2ZmLCBcIi5iZWRwZVwiKSksIFxuICAgICAgICAgc2VwID0gXCJcXHRcIiwgY29sLm5hbWVzID0gRkFMU0UpXG59XG5gYGAifQ== -->

```r
create_dist_vs_avgScore_perTreatment_oe <- function(data, figDir, name, loopList, colorList, se = FALSE){
  avg_scores_long <- data %>%
    group_by(distance, Anno2) %>%
    summarise(avg_score = mean(score, na.rm = TRUE)) %>%
    ungroup() 
  avg_scores_long$Anno2 <- factor(avg_scores_long$Anno2, level = loopList)
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = Anno2, fill = Anno2)) + 
    geom_smooth(show.legend = TRUE, se = se)  +
    #ylim(0, 0.5) +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = colorList) +
    scale_fill_manual(values = colorList) +
    labs(title = paste0(name),
         x = \Distance\,
         y = \Average Score\) +
    theme(plot.title = element_text(size = 8))
  
  fileName <- paste0(\dist_vs_score_linePlot_\, name)
  png(here(figDir, paste0(fileName, \.png\)), 
      res = 600, units = \in\, width = 4, height = 3)
  print(p4)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 4, height = 3)
  print(p4)
  dev.off()
} 

create_dist_vs_avgDiffScore_perTreatment_oe <- function(data, figDir, name, loopList, colorList, se = FALSE){
  avg_scores_long <- data %>%
    group_by(distance, Anno2) %>%
    summarise(avg_score = mean(score, na.rm = TRUE)) %>%
    ungroup() 
  avg_scores_long$Anno2 <- factor(avg_scores_long$Anno2, level = loopList)
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = Anno2, fill = Anno2)) + 
    geom_hline(yintercept = 0) +
    geom_smooth(show.legend = TRUE, se = se)  +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = colorList) +
    scale_fill_manual(values = colorList) +
    labs(title = paste0(name),
         x = \Distance\,
         y = \Average Diff Score\) +
    theme(plot.title = element_text(size = 8)) 
  
  fileName <- paste0(\dist_vs_score_difflinePlot_\, name)
  png(here(figDir, paste0(fileName, \.png\)), 
      res = 600, units = \in\, width = 4, height = 3)
  print(p4)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 4, height = 3)
  print(p4)
  dev.off()
} 

create_dist_barplot_oe <- function(data, figDir, name, note, loopList, diffCutoff, distanceFilter = 2*e6){
    data <- data %>% 
    dplyr::mutate(distance = start2 - start1,
                  updown_dTAG_DMSO = ifelse(log_obsexp_diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(log_obsexp_diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(log_obsexp_diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(log_obsexp_diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\))) %>%
    dplyr::filter(Anno2 %in% loopList,
                  distance < distanceFilter)
  data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  
  
  temp <- data %>% dplyr::select(Anno2, distance, updown_dTAG_DMSO, updown_A485_DMSO) %>%
    dplyr::filter(Anno2 %in% loopList,
                  updown_dTAG_DMSO %in% c(\UP\, \NO\, \DOWN\))
  p <- ggplot(temp, aes(x = updown_dTAG_DMSO, y = distance)) +
    geom_violin(aes(fill = updown_dTAG_DMSO)) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = updown_dTAG_DMSO), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + ggtitle(note) +
    scale_y_continuous(labels = label_kb_mb)
  fileName <- paste0(\size_barplot_\, name, \_dTAG_vs_DMSO_\, note, \_\, diffCutoff)
  height <- 3
  width <- 4
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
  
  
  temp <- data %>% dplyr::select(Anno2, distance, updown_dTAG_DMSO, updown_A485_DMSO) %>%
    dplyr::filter(Anno2 %in% loopList,
                  updown_A485_DMSO %in% c(\UP\, \NO\,  \DOWN\))
  p <- ggplot(temp, aes(x = updown_A485_DMSO, y = distance)) +
    geom_violin(aes(fill = updown_A485_DMSO)) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = updown_A485_DMSO), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + ggtitle(note) +
    scale_y_continuous(labels = label_kb_mb)
  fileName <- paste0(\size_barplot_\, name, \_A485_vs_DMSO_\, note, \_\, diffCutoff)
  height <- 3
  width <- 4
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

create_loop_scatterplot_oe <- function(data, figDir, name, Anno2List, diffCutoff){
  data <- data %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(log_obsexp_diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(log_obsexp_diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(log_obsexp_diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(log_obsexp_diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\))) %>%
    dplyr::filter(Anno2 %in% Anno2List)
  data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  
  num.up <- (summary(data$updown_dTAG_DMSO))[\UP\]
  num.no <- (summary(data$updown_dTAG_DMSO))[\NO\]
  num.down <- (summary(data$updown_dTAG_DMSO))[\DOWN\]
  num.all <- num.up + num.no + num.down
  perc.up <- round(num.up / num.all * 100, 2)
  perc.no <- round(num.no / num.all * 100, 2)
  perc.down <- round(num.down / num.all * 100, 2)
  
  ### Scatterplot
    minValue <- -4
  maxValue <- 5
  data$density <- get_density(data$log_obsexp_DMSO, data$log_obsexp_dTAG, n = 100)
  data <- data %>% dplyr::arrange(density)
  correlation <- cor(data$log_obsexp_DMSO, data$log_obsexp_dTAG)
  p1 <- ggplot(data, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) +
    geom_point(show.legend = FALSE) + 
    scale_color_viridis() +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) +
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
    annotate(\text\, x = minValue, y = maxValue, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
             color = \black\, hjust = 0, size = 3) +
    annotate(\text\, x = minValue, y = maxValue-1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
             color = \black\, hjust = 0, size = 3) +
    annotate(\text\, x = minValue, y = maxValue-2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
             color = \black\, hjust = 0, size = 3) +
    theme_classic() + ggtitle(name) + theme(plot.title = element_text(size = 5)) +
    annotate(\text\, x = minValue, y = maxValue, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

  
  
  num.up <- (summary(data$updown_A485_DMSO))[\UP\]
  num.no <- (summary(data$updown_A485_DMSO))[\NO\]
  num.down <- (summary(data$updown_A485_DMSO))[\DOWN\]
  num.all <- num.up + num.no + num.down
  perc.up <- round(num.up / num.all * 100, 2)
  perc.no <- round(num.no / num.all * 100, 2)
  perc.down <- round(num.down / num.all * 100, 2)
  
  data$density <- get_density(data$log_obsexp_DMSO, data$log_obsexp_A485, n = 100)
  data <- data %>% dplyr::arrange(density)
  correlation <- cor(data$log_obsexp_DMSO, data$log_obsexp_A485)
  p2 <- ggplot(data, aes(x = log_obsexp_DMSO, y = log_obsexp_A485, color = density)) +
    geom_point(show.legend = FALSE) + 
    scale_color_viridis() +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) +
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
    annotate(\text\, x = minValue, y = maxValue, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
             color = \black\, hjust = 0, size = 3) +
    annotate(\text\, x = minValue, y = maxValue-1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
             color = \black\, hjust = 0, size = 3) +
    annotate(\text\, x = minValue, y = maxValue-2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
             color = \black\, hjust = 0, size = 3) +
    theme_classic() + ggtitle(name) + theme(plot.title = element_text(size = 5)) +
    annotate(\text\, x = minValue, y = maxValue, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

  
  
  fileName <- paste0(\scatterplot_\, name, \_\, diffCutoff)
  png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 5*1.5, height = 2.5*1.5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
  
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 5*1.5, height = 2.5*1.5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
}

make_diff_bedpe_oe <- function(data, name, Anno2List, outDir, diffCutoff){
  data <- data %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(log_obsexp_diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(log_obsexp_diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(log_obsexp_diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(log_obsexp_diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\))) %>%
    dplyr::filter(Anno2 %in% Anno2List)
  data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  
  out.temp <- data %>% dplyr::filter(updown_dTAG_DMSO == \UP\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_dTAGvsDMSO_UP_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_dTAG_DMSO == \NO\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_dTAGvsDMSO_NO_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_dTAG_DMSO == \DOWN\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_dTAGvsDMSO_DOWN_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  
  out.temp <- data %>% dplyr::filter(updown_A485_DMSO == \UP\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_A485vsDMSO_UP_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_A485_DMSO == \NO\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_A485vsDMSO_NO_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_A485_DMSO == \DOWN\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_A485vsDMSO_DOWN_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
}
```

<!-- rnb-source-end -->
```r
create_dist_vs_avgScore_perTreatment_oe <- function(data, figDir, name, loopList, colorList, se = FALSE){
  avg_scores_long <- data %>%
    group_by(distance, Anno2) %>%
    summarise(avg_score = mean(score, na.rm = TRUE)) %>%
    ungroup() 
  avg_scores_long$Anno2 <- factor(avg_scores_long$Anno2, level = loopList)
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = Anno2, fill = Anno2)) + 
    geom_smooth(show.legend = TRUE, se = se)  +
    #ylim(0, 0.5) +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = colorList) +
    scale_fill_manual(values = colorList) +
    labs(title = paste0(name),
         x = \Distance\,
         y = \Average Score\) +
    theme(plot.title = element_text(size = 8))
  
  fileName <- paste0(\dist_vs_score_linePlot_\, name)
  png(here(figDir, paste0(fileName, \.png\)), 
      res = 600, units = \in\, width = 4, height = 3)
  print(p4)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 4, height = 3)
  print(p4)
  dev.off()
} 

create_dist_vs_avgDiffScore_perTreatment_oe <- function(data, figDir, name, loopList, colorList, se = FALSE){
  avg_scores_long <- data %>%
    group_by(distance, Anno2) %>%
    summarise(avg_score = mean(score, na.rm = TRUE)) %>%
    ungroup() 
  avg_scores_long$Anno2 <- factor(avg_scores_long$Anno2, level = loopList)
  p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = Anno2, fill = Anno2)) + 
    geom_hline(yintercept = 0) +
    geom_smooth(show.legend = TRUE, se = se)  +
    theme_classic() +  scale_x_continuous(labels = label_kb_mb) +
    scale_color_manual(values = colorList) +
    scale_fill_manual(values = colorList) +
    labs(title = paste0(name),
         x = \Distance\,
         y = \Average Diff Score\) +
    theme(plot.title = element_text(size = 8)) 
  
  fileName <- paste0(\dist_vs_score_difflinePlot_\, name)
  png(here(figDir, paste0(fileName, \.png\)), 
      res = 600, units = \in\, width = 4, height = 3)
  print(p4)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 4, height = 3)
  print(p4)
  dev.off()
} 

create_dist_barplot_oe <- function(data, figDir, name, note, loopList, diffCutoff, distanceFilter = 2*e6){
    data <- data %>% 
    dplyr::mutate(distance = start2 - start1,
                  updown_dTAG_DMSO = ifelse(log_obsexp_diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(log_obsexp_diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(log_obsexp_diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(log_obsexp_diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\))) %>%
    dplyr::filter(Anno2 %in% loopList,
                  distance < distanceFilter)
  data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  
  
  temp <- data %>% dplyr::select(Anno2, distance, updown_dTAG_DMSO, updown_A485_DMSO) %>%
    dplyr::filter(Anno2 %in% loopList,
                  updown_dTAG_DMSO %in% c(\UP\, \NO\, \DOWN\))
  p <- ggplot(temp, aes(x = updown_dTAG_DMSO, y = distance)) +
    geom_violin(aes(fill = updown_dTAG_DMSO)) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = updown_dTAG_DMSO), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + ggtitle(note) +
    scale_y_continuous(labels = label_kb_mb)
  fileName <- paste0(\size_barplot_\, name, \_dTAG_vs_DMSO_\, note, \_\, diffCutoff)
  height <- 3
  width <- 4
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
  
  
  temp <- data %>% dplyr::select(Anno2, distance, updown_dTAG_DMSO, updown_A485_DMSO) %>%
    dplyr::filter(Anno2 %in% loopList,
                  updown_A485_DMSO %in% c(\UP\, \NO\,  \DOWN\))
  p <- ggplot(temp, aes(x = updown_A485_DMSO, y = distance)) +
    geom_violin(aes(fill = updown_A485_DMSO)) + 
    geom_boxplot(width = 0.1, outlier.shape = NA) +
    stat_summary(aes(group = updown_A485_DMSO), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
    theme_classic() + ggtitle(note) +
    scale_y_continuous(labels = label_kb_mb)
  fileName <- paste0(\size_barplot_\, name, \_A485_vs_DMSO_\, note, \_\, diffCutoff)
  height <- 3
  width <- 4
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

create_loop_scatterplot_oe <- function(data, figDir, name, Anno2List, diffCutoff){
  data <- data %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(log_obsexp_diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(log_obsexp_diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(log_obsexp_diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(log_obsexp_diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\))) %>%
    dplyr::filter(Anno2 %in% Anno2List)
  data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  
  num.up <- (summary(data$updown_dTAG_DMSO))[\UP\]
  num.no <- (summary(data$updown_dTAG_DMSO))[\NO\]
  num.down <- (summary(data$updown_dTAG_DMSO))[\DOWN\]
  num.all <- num.up + num.no + num.down
  perc.up <- round(num.up / num.all * 100, 2)
  perc.no <- round(num.no / num.all * 100, 2)
  perc.down <- round(num.down / num.all * 100, 2)
  
  ### Scatterplot
    minValue <- -4
  maxValue <- 5
  data$density <- get_density(data$log_obsexp_DMSO, data$log_obsexp_dTAG, n = 100)
  data <- data %>% dplyr::arrange(density)
  correlation <- cor(data$log_obsexp_DMSO, data$log_obsexp_dTAG)
  p1 <- ggplot(data, aes(x = log_obsexp_DMSO, y = log_obsexp_dTAG, color = density)) +
    geom_point(show.legend = FALSE) + 
    scale_color_viridis() +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) +
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
    annotate(\text\, x = minValue, y = maxValue, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
             color = \black\, hjust = 0, size = 3) +
    annotate(\text\, x = minValue, y = maxValue-1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
             color = \black\, hjust = 0, size = 3) +
    annotate(\text\, x = minValue, y = maxValue-2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
             color = \black\, hjust = 0, size = 3) +
    theme_classic() + ggtitle(name) + theme(plot.title = element_text(size = 5)) +
    annotate(\text\, x = minValue, y = maxValue, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

  
  
  num.up <- (summary(data$updown_A485_DMSO))[\UP\]
  num.no <- (summary(data$updown_A485_DMSO))[\NO\]
  num.down <- (summary(data$updown_A485_DMSO))[\DOWN\]
  num.all <- num.up + num.no + num.down
  perc.up <- round(num.up / num.all * 100, 2)
  perc.no <- round(num.no / num.all * 100, 2)
  perc.down <- round(num.down / num.all * 100, 2)
  
  data$density <- get_density(data$log_obsexp_DMSO, data$log_obsexp_A485, n = 100)
  data <- data %>% dplyr::arrange(density)
  correlation <- cor(data$log_obsexp_DMSO, data$log_obsexp_A485)
  p2 <- ggplot(data, aes(x = log_obsexp_DMSO, y = log_obsexp_A485, color = density)) +
    geom_point(show.legend = FALSE) + 
    scale_color_viridis() +
    coord_fixed(xlim = c(minValue, maxValue), ylim = c(minValue, maxValue)) +
    geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
    geom_abline(slope = 1, intercept = -diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_abline(slope = 1, intercept = diffCutoff, col = \grey\, linetype = \dotted\) +
    geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
    geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
    annotate(\text\, x = minValue, y = maxValue, label = paste0(\UP: \, num.up, \ (\, perc.up, \%)\), 
             color = \black\, hjust = 0, size = 3) +
    annotate(\text\, x = minValue, y = maxValue-1, label = paste0(\NO: \, num.no, \ (\, perc.no, \%)\), 
             color = \black\, hjust = 0, size = 3) +
    annotate(\text\, x = minValue, y = maxValue-2, label = paste0(\DOWN: \, num.down, \ (\, perc.down, \%)\), 
             color = \black\, hjust = 0, size = 3) +
    theme_classic() + ggtitle(name) + theme(plot.title = element_text(size = 5)) +
    annotate(\text\, x = minValue, y = maxValue, label = paste(\r =\, round(correlation, 2)), size = 5, color = \black\)

  
  
  fileName <- paste0(\scatterplot_\, name, \_\, diffCutoff)
  png(here(figDir, paste0(fileName, \.png\)), res = 600, units = \in\, width = 5*1.5, height = 2.5*1.5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
  
  svglite(here(figDir, paste0(fileName, \.svg\)), 
          width = 5*1.5, height = 2.5*1.5)
  print(cowplot::plot_grid(p1, p2, align = \h\))
  dev.off()
}

make_diff_bedpe_oe <- function(data, name, Anno2List, outDir, diffCutoff){
  data <- data %>%
    dplyr::mutate(updown_dTAG_DMSO = ifelse(log_obsexp_diff_dTAG_DMSO > diffCutoff, \UP\, 
                                            ifelse(log_obsexp_diff_dTAG_DMSO > -diffCutoff, \NO\, \DOWN\)),
                  updown_A485_DMSO = ifelse(log_obsexp_diff_A485_DMSO > diffCutoff, \UP\, 
                                            ifelse(log_obsexp_diff_A485_DMSO > -diffCutoff, \NO\, \DOWN\))) %>%
    dplyr::filter(Anno2 %in% Anno2List)
  data$updown_dTAG_DMSO <- factor(data$updown_dTAG_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  data$updown_A485_DMSO <- factor(data$updown_A485_DMSO, levels = c(\UP\, \NO\, \DOWN\))
  
  out.temp <- data %>% dplyr::filter(updown_dTAG_DMSO == \UP\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_dTAGvsDMSO_UP_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_dTAG_DMSO == \NO\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_dTAGvsDMSO_NO_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_dTAG_DMSO == \DOWN\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_dTAGvsDMSO_DOWN_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  
  out.temp <- data %>% dplyr::filter(updown_A485_DMSO == \UP\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_A485vsDMSO_UP_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_A485_DMSO == \NO\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_A485vsDMSO_NO_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  out.temp <- data %>% dplyr::filter(updown_A485_DMSO == \DOWN\) %>% dplyr::select(c(1, 2, 3, 4, 5, 6))
  fwrite(out.temp, here(outDir, paste0(name, \_A485vsDMSO_DOWN_diff\, diffCutoff, \.bedpe\)), 
         sep = \\t\, col.names = FALSE)
}

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

###### Plotting Obs

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJKYlhCdmNuUWdZVzV1YjNSaGRHbHZibHh1Ym1GdFpTQThMU0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjSWx4dVpHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lMblJ6ZGx3aUtTa3BYRzVjYmlNZ1NXMXdiM0owSUc5aWN5OWxlSEFnYzJOdmNtVnpJR0Z1WkNCdFpYSm5aU0IwYnlCMGFHVWdaR0YwWVhObGRGeHViV2x1Vm1Gc2RXVWdQQzBnTFRSY2JtOWljMlY0Y0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0Z3aWJHOXZjRk5qYjNKbFgyTnZibk5mYjJKelpYaHdMblJ6ZGx3aUtTa3BJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb2JHOW5YMjlpYzJWNGNGOUVUVk5QSUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmUkUxVFR5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZSRTFUVHlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrVkVGSElEMGdhV1pmWld4elpTaHZZbk5sZUhCZlpGUkJSeUE5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmWkZSQlJ5a3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5Qk5EZzFJRDBnYVdaZlpXeHpaU2h2WW5ObGVIQmZRVFE0TlNBOVBTQXdMQ0J0YVc1V1lXeDFaU3dnYkc5bk1paHZZbk5sZUhCZlFUUTROU2twS1Z4dVhHNGpJRTFsY21kbElHUmhkR0Z6WlhSY2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T214bFpuUmZhbTlwYmlodlluTmxlSEFzSUdKNUlEMGdZeWhjSW1sa1hDSXBLVnh1WEc0aklGQnNiM1JjYm5SbGJYQWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGthWE4wWVc1alpTQTlJSE4wWVhKME1pQXRJSE4wWVhKME1Ta2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2x6ZEdGdVkyVXNJR3h2WjE5dlluTmxlSEJmUkUxVFR5d2dRVzV1YnpJcFhHNWpiMnh1WVcxbGN5aDBaVzF3S1NBOExTQmpLRndpWkdsemRHRnVZMlZjSWl3Z1hDSnpZMjl5WlZ3aUxDQmNJa0Z1Ym04eVhDSXBYRzVqY21WaGRHVmZaR2x6ZEY5MmMxOWhkbWRUWTI5eVpWOXdaWEpVY21WaGRHMWxiblJmYjJVb2RHVnRjQ3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZSRTFUVDE5c2IyZFBSVndpS1N3Z2RXNXBjWFZsS0dSaGRHRWtRVzV1YnpJcExDQmpiMnh2Y2t4cGMzUk1iMjl3S1Z4dVhHNTBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWkdsemRHRnVZMlVnUFNCemRHRnlkRElnTFNCemRHRnlkREVwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dScGMzUmhibU5sTENCc2IyZGZiMkp6Wlhod1gyUlVRVWNzSUVGdWJtOHlLVnh1WTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY0ltUnBjM1JoYm1ObFhDSXNJRndpYzJOdmNtVmNJaXdnWENKQmJtNXZNbHdpS1Z4dVkzSmxZWFJsWDJScGMzUmZkbk5mWVhablUyTnZjbVZmY0dWeVZISmxZWFJ0Wlc1MFgyOWxLSFJsYlhBc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDJSVVFVZGZiRzluVDBWY0lpa3NJSFZ1YVhGMVpTaGtZWFJoSkVGdWJtOHlLU3dnWTI5c2IzSk1hWE4wVEc5dmNDbGNibHh1WEc0aklFTnlaV0YwYVc1bklHWnBaM1Z5WlhNZ2NHVnlJR1ZoWTJnZ1kyOXVaR2wwYVc5dUxDQmthV1ptWlhKbGJuUnBZV3hjYm5SbGJYQWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGthWE4wWVc1alpTQTlJSE4wWVhKME1pQXRJSE4wWVhKME1TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QSUQwZ2JHOW5YMjlpYzJWNGNGOWtWRUZISUMwZ2JHOW5YMjlpYzJWNGNGOUVUVk5QS1NBbFBpVWdYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9aR2x6ZEdGdVkyVXNJR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOHNJRUZ1Ym04eUtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjSW1ScGMzUmhibU5sWENJc0lGd2ljMk52Y21WY0lpd2dYQ0pCYm01dk1sd2lLVnh1WTNKbFlYUmxYMlJwYzNSZmRuTmZZWFpuUkdsbVpsTmpiM0psWDNCbGNsUnlaV0YwYldWdWRGOXZaU2gwWlcxd0xDQm1hV2RFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjSWw5a1ZFRkhYMnh2WjA5RlhDSXBMQ0IxYm1seGRXVW9aR0YwWVNSQmJtNXZNaWtzSUdOdmJHOXlUR2x6ZEV4dmIzQXBYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbiMgSW1wb3J0IGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuXG4jIEltcG9ydCBvYnMvZXhwIHNjb3JlcyBhbmQgbWVyZ2UgdG8gdGhlIGRhdGFzZXRcbm1pblZhbHVlIDwtIC00XG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSlcblxuIyBNZXJnZSBkYXRhc2V0XG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoXFxpZFxcKSlcblxuIyBQbG90XG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzZXhwX0RNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50X29lKHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0RNU09fbG9nT0VcXCksIHVuaXF1ZShkYXRhJEFubm8yKSwgY29sb3JMaXN0TG9vcClcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgbG9nX29ic2V4cF9kVEFHLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudF9vZSh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHX2xvZ09FXFwpLCB1bmlxdWUoZGF0YSRBbm5vMiksIGNvbG9yTGlzdExvb3ApXG5cblxuIyBDcmVhdGluZyBmaWd1cmVzIHBlciBlYWNoIGNvbmRpdGlvbiwgZGlmZmVyZW50aWFsXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTykgJT4lIFxuICBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnRfb2UodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR19sb2dPRVxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjb2xvckxpc3RMb29wKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# Import annotation
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\))

# Plot
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, log_obsexp_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment_oe(temp, figDir, paste0(name, \_DMSO_logOE\), unique(data$Anno2), colorListLoop)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, log_obsexp_dTAG, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment_oe(temp, figDir, paste0(name, \_dTAG_logOE\), unique(data$Anno2), colorListLoop)


# Creating figures per each condition, differential
temp <- data %>% dplyr::mutate(distance = start2 - start1,
                               log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO) %>% 
  dplyr::select(distance, log_obsexp_diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment_oe(temp, figDir, paste0(name, \_dTAG_logOE\), unique(data$Anno2), colorListLoop)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkpiWEJ2Y25RZ1lXNXViM1JoZEdsdmJseHVibUZ0WlNBOExTQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNYRnh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y0xuUnpkbHhjS1NrcFhHNWNiaU1nU1cxd2IzSjBJRzlpY3k5bGVIQWdjMk52Y21WeklHRnVaQ0J0WlhKblpTQjBieUIwYUdVZ1pHRjBZWE5sZEZ4dWJXbHVWbUZzZFdVZ1BDMGdMVFJjYm05aWMyVjRjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRnhjYkc5dmNGTmpiM0psWDJOdmJuTmZiMkp6Wlhod0xuUnpkbHhjS1NrcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvYkc5blgyOWljMlY0Y0Y5RVRWTlBJRDBnYVdaZlpXeHpaU2h2WW5ObGVIQmZSRTFUVHlBOVBTQXdMQ0J0YVc1V1lXeDFaU3dnYkc5bk1paHZZbk5sZUhCZlJFMVRUeWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOW5YMjlpYzJWNGNGOWtWRUZISUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmWkZSQlJ5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZaRlJCUnlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlCTkRnMUlEMGdhV1pmWld4elpTaHZZbk5sZUhCZlFUUTROU0E5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmUVRRNE5Ta3BLVnh1WEc0aklFMWxjbWRsSUdSaGRHRnpaWFJjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbXhsWm5SZmFtOXBiaWh2WW5ObGVIQXNJR0o1SUQwZ1l5aGNYR2xrWEZ3cEtWeHVYRzRqSUZCc2IzUmNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVNrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbHpkR0Z1WTJVc0lHeHZaMTl2WW5ObGVIQmZSRTFUVHl3Z1FXNXVieklwWEc1amIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGeGNaR2x6ZEdGdVkyVmNYQ3dnWEZ4elkyOXlaVnhjTENCY1hFRnVibTh5WEZ3cFhHNWpjbVZoZEdWZlpHbHpkRjkyYzE5aGRtZFRZMjl5WlY5d1pYSlVjbVZoZEcxbGJuUmZiMlVvZEdWdGNDd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZlJFMVRUMTlzYjJkUFJWeGNLU3dnZFc1cGNYVmxLR1JoZEdFa1FXNXVieklwTENCamIyeHZja3hwYzNSTWIyOXdLVnh1WEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0J6ZEdGeWRESWdMU0J6ZEdGeWRERXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR1JwYzNSaGJtTmxMQ0JzYjJkZmIySnpaWGh3WDJSVVFVY3NJRUZ1Ym04eUtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjWEdScGMzUmhibU5sWEZ3c0lGeGNjMk52Y21WY1hDd2dYRnhCYm01dk1seGNLVnh1WTNKbFlYUmxYMlJwYzNSZmRuTmZZWFpuVTJOdmNtVmZjR1Z5VkhKbFlYUnRaVzUwWDI5bEtIUmxiWEFzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGeGNYMlJVUVVkZmJHOW5UMFZjWENrc0lIVnVhWEYxWlNoa1lYUmhKRUZ1Ym04eUtTd2dZMjlzYjNKTWFYTjBURzl2Y0NsY2JseHVYRzRqSUVOeVpXRjBhVzVuSUdacFozVnlaWE1nY0dWeUlHVmhZMmdnWTI5dVpHbDBhVzl1TENCa2FXWm1aWEpsYm5ScFlXeGNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDJScFptWmZaRlJCUjE5RVRWTlBJRDBnYkc5blgyOWljMlY0Y0Y5a1ZFRkhJQzBnYkc5blgyOWljMlY0Y0Y5RVRWTlBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1pHbHpkR0Z1WTJVc0lHeHZaMTl2WW5ObGVIQmZaR2xtWmw5a1ZFRkhYMFJOVTA4c0lFRnVibTh5S1Z4dVkyOXNibUZ0WlhNb2RHVnRjQ2tnUEMwZ1l5aGNYR1JwYzNSaGJtTmxYRndzSUZ4Y2MyTnZjbVZjWEN3Z1hGeEJibTV2TWx4Y0tWeHVZM0psWVhSbFgyUnBjM1JmZG5OZllYWm5SR2xtWmxOamIzSmxYM0JsY2xSeVpXRjBiV1Z1ZEY5dlpTaDBaVzF3TENCbWFXZEVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNYRjlrVkVGSFgyeHZaMDlGWEZ3cExDQjFibWx4ZFdVb1pHRjBZU1JCYm01dk1pa3NJR052Ykc5eVRHbHpkRXh2YjNBcFhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbiMgSW1wb3J0IGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuXG4jIEltcG9ydCBvYnMvZXhwIHNjb3JlcyBhbmQgbWVyZ2UgdG8gdGhlIGRhdGFzZXRcbm1pblZhbHVlIDwtIC00XG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSlcblxuIyBNZXJnZSBkYXRhc2V0XG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoXFxpZFxcKSlcblxuIyBQbG90XG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzZXhwX0RNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50X29lKHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0RNU09fbG9nT0VcXCksIHVuaXF1ZShkYXRhJEFubm8yKSwgY29sb3JMaXN0TG9vcClcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgbG9nX29ic2V4cF9kVEFHLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudF9vZSh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHX2xvZ09FXFwpLCB1bmlxdWUoZGF0YSRBbm5vMiksIGNvbG9yTGlzdExvb3ApXG5cblxuIyBDcmVhdGluZyBmaWd1cmVzIHBlciBlYWNoIGNvbmRpdGlvbiwgZGlmZmVyZW50aWFsXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTykgJT4lIFxuICBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnRfb2UodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR19sb2dPRVxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjb2xvckxpc3RMb29wKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBJbXBvcnQgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5cbiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldFxubWluVmFsdWUgPC0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuXG4jIE1lcmdlIGRhdGFzZXRcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuXG4jIFBsb3RcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGxvZ19vYnNleHBfRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnRfb2UodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfRE1TT19sb2dPRVxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjb2xvckxpc3RMb29wKVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzZXhwX2RUQUcsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50X29lKHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdfbG9nT0VcXCksIHVuaXF1ZShkYXRhJEFubm8yKSwgY29sb3JMaXN0TG9vcClcblxuXG4jIENyZWF0aW5nIGZpZ3VyZXMgcGVyIGVhY2ggY29uZGl0aW9uLCBkaWZmZXJlbnRpYWxcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPKSAlPiUgXG4gIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudF9vZSh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHX2xvZ09FXFwpLCB1bmlxdWUoZGF0YSRBbm5vMiksIGNvbG9yTGlzdExvb3ApXG5gYGBcbmBgYCJ9 -->

```r
```r
# Import annotation
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\))

# Plot
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, log_obsexp_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment_oe(temp, figDir, paste0(name, \_DMSO_logOE\), unique(data$Anno2), colorListLoop)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, log_obsexp_dTAG, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment_oe(temp, figDir, paste0(name, \_dTAG_logOE\), unique(data$Anno2), colorListLoop)


# Creating figures per each condition, differential
temp <- data %>% dplyr::mutate(distance = start2 - start1,
                               log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO) %>% 
  dplyr::select(distance, log_obsexp_diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment_oe(temp, figDir, paste0(name, \_dTAG_logOE\), unique(data$Anno2), colorListLoop)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [2.26] Repeating few analysis with obs/exp
#### Function

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJKYlhCdmNuUWdZVzV1YjNSaGRHbHZibHh1Ym1GdFpTQThMU0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjSWx4dVpHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lMblJ6ZGx3aUtTa3BYRzVjYmlNZ1NXMXdiM0owSUc5aWN5OWxlSEFnYzJOdmNtVnpJR0Z1WkNCdFpYSm5aU0IwYnlCMGFHVWdaR0YwWVhObGRGeHViV2x1Vm1Gc2RXVWdQQzBnTFRSY2JtOWljMlY0Y0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0Z3aWJHOXZjRk5qYjNKbFgyTnZibk5mYjJKelpYaHdMblJ6ZGx3aUtTa3BJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb2JHOW5YMjlpYzJWNGNGOUVUVk5QSUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmUkUxVFR5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZSRTFUVHlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrVkVGSElEMGdhV1pmWld4elpTaHZZbk5sZUhCZlpGUkJSeUE5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmWkZSQlJ5a3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5Qk5EZzFJRDBnYVdaZlpXeHpaU2h2WW5ObGVIQmZRVFE0TlNBOVBTQXdMQ0J0YVc1V1lXeDFaU3dnYkc5bk1paHZZbk5sZUhCZlFUUTROU2twS1Z4dVhHNGpJRTFsY21kbElHUmhkR0Z6WlhSY2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T214bFpuUmZhbTlwYmlodlluTmxlSEFzSUdKNUlEMGdZeWhjSW1sa1hDSXBLVnh1WEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0J6ZEdGeWRESWdMU0J6ZEdGeWRERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOW5YMjlpYzJWNGNGOWthV1ptWDJSVVFVZGZSRTFUVHlBOUlHeHZaMTl2WW5ObGVIQmZaRlJCUnlBdElHeHZaMTl2WW5ObGVIQmZSRTFUVHlrZ0pUNGxJRnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR1JwYzNSaGJtTmxMQ0JzYjJkZmIySnpaWGh3WDJScFptWmZaRlJCUjE5RVRWTlBMQ0JCYm01dk1pbGNibU52Ykc1aGJXVnpLSFJsYlhBcElEd3RJR01vWENKa2FYTjBZVzVqWlZ3aUxDQmNJbk5qYjNKbFhDSXNJRndpUVc1dWJ6SmNJaWxjYmx4dVhHNWNiblJsYlhBZ1BDMGdkR1Z0Y0NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoQmJtNXZNeUE5SUdOaGMyVmZkMmhsYmloQmJtNXZNaUFsYVc0bElHTW9YQ0pUTFZoY0lpd2dYQ0pUTFZOY0lpa2dmaUJjSWxOMGNuVmpkSFZ5WVd4Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCQmJtNXZNaUFsYVc0bElHTW9YQ0pRTFZCY0lpd2dYQ0pRTFVWY0lpd2dYQ0pGTFVWY0lpa2dmaUJjSWxCMWNtVmZVbVZuZFd4aGRHOXllVndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRUZ1Ym04eUlDVnBiaVVnWXloY0lsQXRVMXdpTENCY0lsQXRXRndpTENCY0lrVXRVMXdpTENCY0lrVXRXRndpS1NCK0lGd2lVbVZzWVhobFpGOVNaV2QxYkdGMGIzSjVYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpZ2hhWE11Ym1Fb1FXNXViek1wS1Z4dVhHNXNiMjl3VEdsemRDQThMU0J5WlhZb1l5aGNJbE4wY25WamRIVnlZV3hjSWl3Z1hDSlNaV3hoZUdWa1gxSmxaM1ZzWVhSdmNubGNJaXdnWENKUWRYSmxYMUpsWjNWc1lYUnZjbmxjSWlrcFhHNWpiMnh2Y2t4cGMzUWdQQzBnY21WMktHTW9jR0ZzWlhSMFpWOHpXMXRjSW1keVpYa3lYQ0pkWFN3Z2MzUnliMjVuWDJkeVpXVnVMQ0JrWVhKclpXNG9jM1J5YjI1blgyZHlaV1Z1TENCaGJXOTFiblFnUFNBd0xqVXBLU2xjYm1GMloxOXpZMjl5WlhOZmJHOXVaeUE4TFNCMFpXMXdJQ1UrSlZ4dUlDQm5jbTkxY0Y5aWVTaGthWE4wWVc1alpTd2dRVzV1YnpNcElDVStKVnh1SUNCemRXMXRZWEpwYzJVb1lYWm5YM05qYjNKbElEMGdiV1ZoYmloelkyOXlaU3dnYm1FdWNtMGdQU0JVVWxWRktTa2dKVDRsWEc0Z0lIVnVaM0p2ZFhBb0tTQmNibUYyWjE5elkyOXlaWE5mYkc5dVp5UkJibTV2TXlBOExTQm1ZV04wYjNJb1lYWm5YM05qYjNKbGMxOXNiMjVuSkVGdWJtOHpMQ0JzWlhabGJDQTlJR3h2YjNCTWFYTjBLVnh1WEc1d05DQThMU0JuWjNCc2IzUW9ZWFpuWDNOamIzSmxjMTlzYjI1bkxDQmhaWE1vZUNBOUlHUnBjM1JoYm1ObExDQjVJRDBnWVhablgzTmpiM0psTENCamIyeHZjaUE5SUVGdWJtOHpLU2tnS3lCY2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01DeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWlrZ0sxeHVJQ0JuWlc5dFgzTnRiMjkwYUNoemFHOTNMbXhsWjJWdVpDQTlJRlJTVlVVc0lITmxJRDBnVkZKVlJTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQmhaWE1vWm1sc2JDQTlJRUZ1Ym04ektTa2dJQ3RjYmlBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1hHNGdJSE5qWVd4bFgzaGZZMjl1ZEdsdWRXOTFjeWhzWVdKbGJITWdQU0JzWVdKbGJGOXJZbDl0WWlrZ0sxeHVJQ0J6WTJGc1pWOWpiMnh2Y2w5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWTI5c2IzSk1hWE4wS1NBclhHNGdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR052Ykc5eVRHbHpkQ2tnSzF4dUlDQnNZV0p6S0hnZ1BTQmNJa3h2YjNBZ2MybDZaVndpTEZ4dUlDQWdJQ0FnSUhrZ1BTQmNJczZVSUd4dlp6SW9iMkp6TDJWNGNDbGNJaXhjYmlBZ0lDQWdJQ0JqYjJ4dmNpQTlJRndpVEc5dmNDQjBlWEJsYzF3aUxDQm1hV3hzSUQwZ1hDSk1iMjl3SUhSNWNHVnpYQ0lwSUN0Y2JpQWdkR2hsYldVb1hHNGdJQ0FnWVhocGN5NTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXViR2x1WlNBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUnBZMnR6SUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXhjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENKY2JpQWdJQ0FwTEZ4dUlDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ3aWRISmhibk53WVhKbGJuUmNJaWtzWEc0Z0lDQWdiR1ZuWlc1a0xuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5bGNiaUFnS1NBclhHNGdJR2QxYVdSbGN5aGNiaUFnSUNCamIyeHZjaUE5SUdkMWFXUmxYMnhsWjJWdVpDaGNiaUFnSUNBZ0lHdGxlWGRwWkhSb0lEMGdNQzQxTENBZ0l5QkJaR3AxYzNRZ2RHaGxJSGRwWkhSb0lHOW1JSFJvWlNCc1pXZGxibVFnWTI5c2IzSWdjM0YxWVhKbGMxeHVJQ0FnSUNBZ2EyVjVhR1ZwWjJoMElEMGdNQzQxSUNBaklFRmthblZ6ZENCMGFHVWdhR1ZwWjJoMElHOW1JSFJvWlNCc1pXZGxibVFnWTI5c2IzSWdjM0YxWVhKbGMxeHVJQ0FnSUNsY2JpQWdLVnh1WEc1Y2JseHVYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0ltUnBjM1JmZG5OZmMyTnZjbVZmWkdsbVpteHBibVZRYkc5MFgyZHliM1Z3WldSY0lpd2dibUZ0WlNsY2JseHVkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLREl1TlNrcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzR5TlNrcWJXMVViMGx1WTJoY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQmNiaUFnSUNCeVpYTWdQU0EyTURBc0lIVnVhWFJ6SUQwZ1hDSnBibHdpTENCM2FXUjBhQ0E5SUhkcFpIUm9MQ0JvWldsbmFIUWdQU0JvWldsbmFIUXBYRzV3Y21sdWRDaHdOQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0JjYmlBZ0lDQWdJQ0FnZDJsa2RHZ2dQU0IzYVdSMGFDd2dhR1ZwWjJoMElEMGdhR1ZwWjJoMEtWeHVjSEpwYm5Rb2NEUXBYRzVrWlhZdWIyWm1LQ2xjYmx4dVhHNWNibUJnWUNKOSAtLT5cblxuYGBgclxuIyBJbXBvcnQgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5cbiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldFxubWluVmFsdWUgPC0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuXG4jIE1lcmdlIGRhdGFzZXRcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTykgJT4lIFxuICBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcblxuXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShBbm5vMyA9IGNhc2Vfd2hlbihBbm5vMiAlaW4lIGMoXFxTLVhcXCwgXFxTLVNcXCkgfiBcXFN0cnVjdHVyYWxcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCkgfiBcXFB1cmVfUmVndWxhdG9yeVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm8yICVpbiUgYyhcXFAtU1xcLCBcXFAtWFxcLCBcXEUtU1xcLCBcXEUtWFxcKSB+IFxcUmVsYXhlZF9SZWd1bGF0b3J5XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoQW5ubzMpKVxuXG5sb29wTGlzdCA8LSByZXYoYyhcXFN0cnVjdHVyYWxcXCwgXFxSZWxheGVkX1JlZ3VsYXRvcnlcXCwgXFxQdXJlX1JlZ3VsYXRvcnlcXCkpXG5jb2xvckxpc3QgPC0gcmV2KGMocGFsZXR0ZV8zW1tcXGdyZXkyXFxdXSwgc3Ryb25nX2dyZWVuLCBkYXJrZW4oc3Ryb25nX2dyZWVuLCBhbW91bnQgPSAwLjUpKSlcbmF2Z19zY29yZXNfbG9uZyA8LSB0ZW1wICU+JVxuICBncm91cF9ieShkaXN0YW5jZSwgQW5ubzMpICU+JVxuICBzdW1tYXJpc2UoYXZnX3Njb3JlID0gbWVhbihzY29yZSwgbmEucm0gPSBUUlVFKSkgJT4lXG4gIHVuZ3JvdXAoKSBcbmF2Z19zY29yZXNfbG9uZyRBbm5vMyA8LSBmYWN0b3IoYXZnX3Njb3Jlc19sb25nJEFubm8zLCBsZXZlbCA9IGxvb3BMaXN0KVxuXG5wNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IEFubm8zKSkgKyBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICBnZW9tX3Ntb290aChzaG93LmxlZ2VuZCA9IFRSVUUsIHNlID0gVFJVRSxcbiAgICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBhZXMoZmlsbCA9IEFubm8zKSkgICtcbiAgdGhlbWVfY2xhc3NpYygpICsgXG4gIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yTGlzdCkgK1xuICBsYWJzKHggPSBcXExvb3Agc2l6ZVxcLFxuICAgICAgIHkgPSBcXM6UIGxvZzIob2JzL2V4cClcXCxcbiAgICAgICBjb2xvciA9IFxcTG9vcCB0eXBlc1xcLCBmaWxsID0gXFxMb29wIHR5cGVzXFwpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArXG4gIGd1aWRlcyhcbiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZChcbiAgICAgIGtleXdpZHRoID0gMC41LCAgIyBBZGp1c3QgdGhlIHdpZHRoIG9mIHRoZSBsZWdlbmQgY29sb3Igc3F1YXJlc1xuICAgICAga2V5aGVpZ2h0ID0gMC41ICAjIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWdlbmQgY29sb3Igc3F1YXJlc1xuICAgIClcbiAgKVxuXG5cblxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGRpc3RfdnNfc2NvcmVfZGlmZmxpbmVQbG90X2dyb3VwZWRcXCwgbmFtZSlcblxud2lkdGggPC0gcGFuZWxTaXplKDIuNSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4yNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBcbiAgICByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpXG5wcmludChwNClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBcbiAgICAgICAgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KVxucHJpbnQocDQpXG5kZXYub2ZmKClcblxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# Import annotation
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\))

temp <- data %>% dplyr::mutate(distance = start2 - start1,
                               log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO) %>% 
  dplyr::select(distance, log_obsexp_diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)



temp <- temp %>% dplyr::mutate(Anno3 = case_when(Anno2 %in% c(\S-X\, \S-S\) ~ \Structural\,
                                                 Anno2 %in% c(\P-P\, \P-E\, \E-E\) ~ \Pure_Regulatory\,
                                                 Anno2 %in% c(\P-S\, \P-X\, \E-S\, \E-X\) ~ \Relaxed_Regulatory\)) %>%
  dplyr::filter(!is.na(Anno3))

loopList <- rev(c(\Structural\, \Relaxed_Regulatory\, \Pure_Regulatory\))
colorList <- rev(c(palette_3[[\grey2\]], strong_green, darken(strong_green, amount = 0.5)))
avg_scores_long <- temp %>%
  group_by(distance, Anno3) %>%
  summarise(avg_score = mean(score, na.rm = TRUE)) %>%
  ungroup() 
avg_scores_long$Anno3 <- factor(avg_scores_long$Anno3, level = loopList)

p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = Anno3)) + 
  geom_hline(yintercept = 0,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) +
  geom_smooth(show.legend = TRUE, se = TRUE,
              size = lineThick*mmToLineUnit,
              lineend = \square\,
              aes(fill = Anno3))  +
  theme_classic() + 
  scale_x_continuous(labels = label_kb_mb) +
  scale_color_manual(values = colorList) +
  scale_fill_manual(values = colorList) +
  labs(x = \Loop size\,
       y = \Δ log2(obs/exp)\,
       color = \Loop types\, fill = \Loop types\) +
  theme(
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +
  guides(
    color = guide_legend(
      keywidth = 0.5,  # Adjust the width of the legend color squares
      keyheight = 0.5  # Adjust the height of the legend color squares
    )
  )





fileName <- paste0(\dist_vs_score_difflinePlot_grouped\, name)

width <- panelSize(2.5)*mmToInch
height <- panelSize(1.25)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), 
    res = 600, units = \in\, width = width, height = height)
print(p4)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)), 
        width = width, height = height)
print(p4)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkpiWEJ2Y25RZ1lXNXViM1JoZEdsdmJseHVibUZ0WlNBOExTQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNYRnh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y0xuUnpkbHhjS1NrcFhHNWNiaU1nU1cxd2IzSjBJRzlpY3k5bGVIQWdjMk52Y21WeklHRnVaQ0J0WlhKblpTQjBieUIwYUdVZ1pHRjBZWE5sZEZ4dWJXbHVWbUZzZFdVZ1BDMGdMVFJjYm05aWMyVjRjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRnhjYkc5dmNGTmpiM0psWDJOdmJuTmZiMkp6Wlhod0xuUnpkbHhjS1NrcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvYkc5blgyOWljMlY0Y0Y5RVRWTlBJRDBnYVdaZlpXeHpaU2h2WW5ObGVIQmZSRTFUVHlBOVBTQXdMQ0J0YVc1V1lXeDFaU3dnYkc5bk1paHZZbk5sZUhCZlJFMVRUeWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOW5YMjlpYzJWNGNGOWtWRUZISUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmWkZSQlJ5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZaRlJCUnlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlCTkRnMUlEMGdhV1pmWld4elpTaHZZbk5sZUhCZlFUUTROU0E5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmUVRRNE5Ta3BLVnh1WEc0aklFMWxjbWRsSUdSaGRHRnpaWFJjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbXhsWm5SZmFtOXBiaWh2WW5ObGVIQXNJR0o1SUQwZ1l5aGNYR2xrWEZ3cEtWeHVYRzUwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1pHbHpkR0Z1WTJVZ1BTQnpkR0Z5ZERJZ0xTQnpkR0Z5ZERFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5a2FXWm1YMlJVUVVkZlJFMVRUeUE5SUd4dloxOXZZbk5sZUhCZlpGUkJSeUF0SUd4dloxOXZZbk5sZUhCZlJFMVRUeWtnSlQ0bElGeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHUnBjM1JoYm1ObExDQnNiMmRmYjJKelpYaHdYMlJwWm1aZlpGUkJSMTlFVFZOUExDQkJibTV2TWlsY2JtTnZiRzVoYldWektIUmxiWEFwSUR3dElHTW9YRnhrYVhOMFlXNWpaVnhjTENCY1hITmpiM0psWEZ3c0lGeGNRVzV1YnpKY1hDbGNibHh1WEc1Y2JuUmxiWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hCYm01dk15QTlJR05oYzJWZmQyaGxiaWhCYm01dk1pQWxhVzRsSUdNb1hGeFRMVmhjWEN3Z1hGeFRMVk5jWENrZ2ZpQmNYRk4wY25WamRIVnlZV3hjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JCYm01dk1pQWxhVzRsSUdNb1hGeFFMVkJjWEN3Z1hGeFFMVVZjWEN3Z1hGeEZMVVZjWENrZ2ZpQmNYRkIxY21WZlVtVm5kV3hoZEc5eWVWeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lFRnVibTh5SUNWcGJpVWdZeWhjWEZBdFUxeGNMQ0JjWEZBdFdGeGNMQ0JjWEVVdFUxeGNMQ0JjWEVVdFdGeGNLU0IrSUZ4Y1VtVnNZWGhsWkY5U1pXZDFiR0YwYjNKNVhGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lnaGFYTXVibUVvUVc1dWJ6TXBLVnh1WEc1c2IyOXdUR2x6ZENBOExTQnlaWFlvWXloY1hGTjBjblZqZEhWeVlXeGNYQ3dnWEZ4U1pXeGhlR1ZrWDFKbFozVnNZWFJ2Y25sY1hDd2dYRnhRZFhKbFgxSmxaM1ZzWVhSdmNubGNYQ2twWEc1amIyeHZja3hwYzNRZ1BDMGdjbVYyS0dNb2NHRnNaWFIwWlY4elcxdGNYR2R5WlhreVhGeGRYU3dnYzNSeWIyNW5YMmR5WldWdUxDQmtZWEpyWlc0b2MzUnliMjVuWDJkeVpXVnVMQ0JoYlc5MWJuUWdQU0F3TGpVcEtTbGNibUYyWjE5elkyOXlaWE5mYkc5dVp5QThMU0IwWlcxd0lDVStKVnh1SUNCbmNtOTFjRjlpZVNoa2FYTjBZVzVqWlN3Z1FXNXViek1wSUNVK0pWeHVJQ0J6ZFcxdFlYSnBjMlVvWVhablgzTmpiM0psSUQwZ2JXVmhiaWh6WTI5eVpTd2dibUV1Y20wZ1BTQlVVbFZGS1NrZ0pUNGxYRzRnSUhWdVozSnZkWEFvS1NCY2JtRjJaMTl6WTI5eVpYTmZiRzl1WnlSQmJtNXZNeUE4TFNCbVlXTjBiM0lvWVhablgzTmpiM0psYzE5c2IyNW5KRUZ1Ym04ekxDQnNaWFpsYkNBOUlHeHZiM0JNYVhOMEtWeHVYRzV3TkNBOExTQm5aM0JzYjNRb1lYWm5YM05qYjNKbGMxOXNiMjVuTENCaFpYTW9lQ0E5SUdScGMzUmhibU5sTENCNUlEMGdZWFpuWDNOamIzSmxMQ0JqYjJ4dmNpQTlJRUZ1Ym04ektTa2dLeUJjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ2tnSzF4dUlDQm5aVzl0WDNOdGIyOTBhQ2h6YUc5M0xteGxaMlZ1WkNBOUlGUlNWVVVzSUhObElEMGdWRkpWUlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCaFpYTW9abWxzYkNBOUlFRnVibTh6S1NrZ0lDdGNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWEc0Z0lITmpZV3hsWDNoZlkyOXVkR2x1ZFc5MWN5aHNZV0psYkhNZ1BTQnNZV0psYkY5cllsOXRZaWtnSzF4dUlDQnpZMkZzWlY5amIyeHZjbDl0WVc1MVlXd29kbUZzZFdWeklEMGdZMjlzYjNKTWFYTjBLU0FyWEc0Z0lITmpZV3hsWDJacGJHeGZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTnZiRzl5VEdsemRDa2dLMXh1SUNCc1lXSnpLSGdnUFNCY1hFeHZiM0FnYzJsNlpWeGNMRnh1SUNBZ0lDQWdJSGtnUFNCY1hNNlVJR3h2WnpJb2IySnpMMlY0Y0NsY1hDeGNiaUFnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNURzl2Y0NCMGVYQmxjMXhjTENCbWFXeHNJRDBnWEZ4TWIyOXdJSFI1Y0dWelhGd3BJQ3RjYmlBZ2RHaGxiV1VvWEc0Z0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hDeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRnhjZEhKaGJuTndZWEpsYm5SY1hDa3NYRzRnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlsY2JpQWdLU0FyWEc0Z0lHZDFhV1JsY3loY2JpQWdJQ0JqYjJ4dmNpQTlJR2QxYVdSbFgyeGxaMlZ1WkNoY2JpQWdJQ0FnSUd0bGVYZHBaSFJvSUQwZ01DNDFMQ0FnSXlCQlpHcDFjM1FnZEdobElIZHBaSFJvSUc5bUlIUm9aU0JzWldkbGJtUWdZMjlzYjNJZ2MzRjFZWEpsYzF4dUlDQWdJQ0FnYTJWNWFHVnBaMmgwSUQwZ01DNDFJQ0FqSUVGa2FuVnpkQ0IwYUdVZ2FHVnBaMmgwSUc5bUlIUm9aU0JzWldkbGJtUWdZMjlzYjNJZ2MzRjFZWEpsYzF4dUlDQWdJQ2xjYmlBZ0tWeHVYRzVjYmx4dVhHNWNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEdScGMzUmZkbk5mYzJOdmNtVmZaR2xtWm14cGJtVlFiRzkwWDJkeWIzVndaV1JjWEN3Z2JtRnRaU2xjYmx4dWQybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtESXVOU2txYlcxVWIwbHVZMmhjYm1obGFXZG9kQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNHlOU2txYlcxVWIwbHVZMmhjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCY2JpQWdJQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUnpJRDBnWEZ4cGJseGNMQ0IzYVdSMGFDQTlJSGRwWkhSb0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRcFhHNXdjbWx1ZENod05DbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQmNiaUFnSUNBZ0lDQWdkMmxrZEdnZ1BTQjNhV1IwYUN3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwS1Z4dWNISnBiblFvY0RRcFhHNWtaWFl1YjJabUtDbGNibHh1WEc1Y2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbiMgSW1wb3J0IGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuXG4jIEltcG9ydCBvYnMvZXhwIHNjb3JlcyBhbmQgbWVyZ2UgdG8gdGhlIGRhdGFzZXRcbm1pblZhbHVlIDwtIC00XG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpKSAlPiVcbiAgICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSlcblxuIyBNZXJnZSBkYXRhc2V0XG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoXFxpZFxcKSlcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08pICU+JSBcbiAgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5cblxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoQW5ubzMgPSBjYXNlX3doZW4oQW5ubzIgJWluJSBjKFxcUy1YXFwsIFxcUy1TXFwpIH4gXFxTdHJ1Y3R1cmFsXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ubzIgJWluJSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpIH4gXFxQdXJlX1JlZ3VsYXRvcnlcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vMiAlaW4lIGMoXFxQLVNcXCwgXFxQLVhcXCwgXFxFLVNcXCwgXFxFLVhcXCkgfiBcXFJlbGF4ZWRfUmVndWxhdG9yeVxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKEFubm8zKSlcblxubG9vcExpc3QgPC0gcmV2KGMoXFxTdHJ1Y3R1cmFsXFwsIFxcUmVsYXhlZF9SZWd1bGF0b3J5XFwsIFxcUHVyZV9SZWd1bGF0b3J5XFwpKVxuY29sb3JMaXN0IDwtIHJldihjKHBhbGV0dGVfM1tbXFxncmV5MlxcXV0sIHN0cm9uZ19ncmVlbiwgZGFya2VuKHN0cm9uZ19ncmVlbiwgYW1vdW50ID0gMC41KSkpXG5hdmdfc2NvcmVzX2xvbmcgPC0gdGVtcCAlPiVcbiAgZ3JvdXBfYnkoZGlzdGFuY2UsIEFubm8zKSAlPiVcbiAgc3VtbWFyaXNlKGF2Z19zY29yZSA9IG1lYW4oc2NvcmUsIG5hLnJtID0gVFJVRSkpICU+JVxuICB1bmdyb3VwKCkgXG5hdmdfc2NvcmVzX2xvbmckQW5ubzMgPC0gZmFjdG9yKGF2Z19zY29yZXNfbG9uZyRBbm5vMywgbGV2ZWwgPSBsb29wTGlzdClcblxucDQgPC0gZ2dwbG90KGF2Z19zY29yZXNfbG9uZywgYWVzKHggPSBkaXN0YW5jZSwgeSA9IGF2Z19zY29yZSwgY29sb3IgPSBBbm5vMykpICsgXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgZ2VvbV9zbW9vdGgoc2hvdy5sZWdlbmQgPSBUUlVFLCBzZSA9IFRSVUUsXG4gICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgYWVzKGZpbGwgPSBBbm5vMykpICArXG4gIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yTGlzdCkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvckxpc3QpICtcbiAgbGFicyh4ID0gXFxMb29wIHNpemVcXCxcbiAgICAgICB5ID0gXFzOlCBsb2cyKG9icy9leHApXFwsXG4gICAgICAgY29sb3IgPSBcXExvb3AgdHlwZXNcXCwgZmlsbCA9IFxcTG9vcCB0eXBlc1xcKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK1xuICBndWlkZXMoXG4gICAgY29sb3IgPSBndWlkZV9sZWdlbmQoXG4gICAgICBrZXl3aWR0aCA9IDAuNSwgICMgQWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgbGVnZW5kIGNvbG9yIHNxdWFyZXNcbiAgICAgIGtleWhlaWdodCA9IDAuNSAgIyBBZGp1c3QgdGhlIGhlaWdodCBvZiB0aGUgbGVnZW5kIGNvbG9yIHNxdWFyZXNcbiAgICApXG4gIClcblxuXG5cblxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxkaXN0X3ZzX3Njb3JlX2RpZmZsaW5lUGxvdF9ncm91cGVkXFwsIG5hbWUpXG5cbndpZHRoIDwtIHBhbmVsU2l6ZSgyLjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMjUpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgXG4gICAgcmVzID0gNjAwLCB1bml0cyA9IFxcaW5cXCwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KVxucHJpbnQocDQpXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgXG4gICAgICAgIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodClcbnByaW50KHA0KVxuZGV2Lm9mZigpXG5cblxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBJbXBvcnQgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5cbiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldFxubWluVmFsdWUgPC0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuXG4jIE1lcmdlIGRhdGFzZXRcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTykgJT4lIFxuICBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcblxuXG5cbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShBbm5vMyA9IGNhc2Vfd2hlbihBbm5vMiAlaW4lIGMoXFxTLVhcXCwgXFxTLVNcXCkgfiBcXFN0cnVjdHVyYWxcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCkgfiBcXFB1cmVfUmVndWxhdG9yeVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm8yICVpbiUgYyhcXFAtU1xcLCBcXFAtWFxcLCBcXEUtU1xcLCBcXEUtWFxcKSB+IFxcUmVsYXhlZF9SZWd1bGF0b3J5XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoQW5ubzMpKVxuXG5sb29wTGlzdCA8LSByZXYoYyhcXFN0cnVjdHVyYWxcXCwgXFxSZWxheGVkX1JlZ3VsYXRvcnlcXCwgXFxQdXJlX1JlZ3VsYXRvcnlcXCkpXG5jb2xvckxpc3QgPC0gcmV2KGMocGFsZXR0ZV8zW1tcXGdyZXkyXFxdXSwgc3Ryb25nX2dyZWVuLCBkYXJrZW4oc3Ryb25nX2dyZWVuLCBhbW91bnQgPSAwLjUpKSlcbmF2Z19zY29yZXNfbG9uZyA8LSB0ZW1wICU+JVxuICBncm91cF9ieShkaXN0YW5jZSwgQW5ubzMpICU+JVxuICBzdW1tYXJpc2UoYXZnX3Njb3JlID0gbWVhbihzY29yZSwgbmEucm0gPSBUUlVFKSkgJT4lXG4gIHVuZ3JvdXAoKSBcbmF2Z19zY29yZXNfbG9uZyRBbm5vMyA8LSBmYWN0b3IoYXZnX3Njb3Jlc19sb25nJEFubm8zLCBsZXZlbCA9IGxvb3BMaXN0KVxuXG5wNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IEFubm8zKSkgKyBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICBnZW9tX3Ntb290aChzaG93LmxlZ2VuZCA9IFRSVUUsIHNlID0gVFJVRSxcbiAgICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBhZXMoZmlsbCA9IEFubm8zKSkgICtcbiAgdGhlbWVfY2xhc3NpYygpICsgXG4gIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yTGlzdCkgK1xuICBsYWJzKHggPSBcXExvb3Agc2l6ZVxcLFxuICAgICAgIHkgPSBcXM6UIGxvZzIob2JzL2V4cClcXCxcbiAgICAgICBjb2xvciA9IFxcTG9vcCB0eXBlc1xcLCBmaWxsID0gXFxMb29wIHR5cGVzXFwpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArXG4gIGd1aWRlcyhcbiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZChcbiAgICAgIGtleXdpZHRoID0gMC41LCAgIyBBZGp1c3QgdGhlIHdpZHRoIG9mIHRoZSBsZWdlbmQgY29sb3Igc3F1YXJlc1xuICAgICAga2V5aGVpZ2h0ID0gMC41ICAjIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWdlbmQgY29sb3Igc3F1YXJlc1xuICAgIClcbiAgKVxuXG5cblxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGRpc3RfdnNfc2NvcmVfZGlmZmxpbmVQbG90X2dyb3VwZWRcXCwgbmFtZSlcblxud2lkdGggPC0gcGFuZWxTaXplKDIuNSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4yNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCBcbiAgICByZXMgPSA2MDAsIHVuaXRzID0gXFxpblxcLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpXG5wcmludChwNClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCBcbiAgICAgICAgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KVxucHJpbnQocDQpXG5kZXYub2ZmKClcblxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
# Import annotation
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\))

temp <- data %>% dplyr::mutate(distance = start2 - start1,
                               log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO) %>% 
  dplyr::select(distance, log_obsexp_diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)



temp <- temp %>% dplyr::mutate(Anno3 = case_when(Anno2 %in% c(\S-X\, \S-S\) ~ \Structural\,
                                                 Anno2 %in% c(\P-P\, \P-E\, \E-E\) ~ \Pure_Regulatory\,
                                                 Anno2 %in% c(\P-S\, \P-X\, \E-S\, \E-X\) ~ \Relaxed_Regulatory\)) %>%
  dplyr::filter(!is.na(Anno3))

loopList <- rev(c(\Structural\, \Relaxed_Regulatory\, \Pure_Regulatory\))
colorList <- rev(c(palette_3[[\grey2\]], strong_green, darken(strong_green, amount = 0.5)))
avg_scores_long <- temp %>%
  group_by(distance, Anno3) %>%
  summarise(avg_score = mean(score, na.rm = TRUE)) %>%
  ungroup() 
avg_scores_long$Anno3 <- factor(avg_scores_long$Anno3, level = loopList)

p4 <- ggplot(avg_scores_long, aes(x = distance, y = avg_score, color = Anno3)) + 
  geom_hline(yintercept = 0,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) +
  geom_smooth(show.legend = TRUE, se = TRUE,
              size = lineThick*mmToLineUnit,
              lineend = \square\,
              aes(fill = Anno3))  +
  theme_classic() + 
  scale_x_continuous(labels = label_kb_mb) +
  scale_color_manual(values = colorList) +
  scale_fill_manual(values = colorList) +
  labs(x = \Loop size\,
       y = \Δ log2(obs/exp)\,
       color = \Loop types\, fill = \Loop types\) +
  theme(
    axis.title = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +
  guides(
    color = guide_legend(
      keywidth = 0.5,  # Adjust the width of the legend color squares
      keyheight = 0.5  # Adjust the height of the legend color squares
    )
  )





fileName <- paste0(\dist_vs_score_difflinePlot_grouped\, name)

width <- panelSize(2.5)*mmToInch
height <- panelSize(1.25)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), 
    res = 600, units = \in\, width = width, height = height)
print(p4)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)), 
        width = width, height = height)
print(p4)
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Distance vs score plot
##### dTAG
###### OE

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJKYlhCdmNuUWdZVzV1YjNSaGRHbHZibHh1Ym1GdFpTQThMU0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjSWx4dVpHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lMblJ6ZGx3aUtTa3BYRzVjYmlNZ1NXMXdiM0owSUc5aWN5OWxlSEFnYzJOdmNtVnpJR0Z1WkNCdFpYSm5aU0IwYnlCMGFHVWdaR0YwWVhObGRGeHViV2x1Vm1Gc2RXVWdQQzBnTFRSY2JtOWljMlY0Y0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0Z3aWJHOXZjRk5qYjNKbFgyTnZibk5mYjJKelpYaHdMblJ6ZGx3aUtTa3BJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb2JHOW5YMjlpYzE5RVRWTlBJRDBnYVdaZlpXeHpaU2h2WW5OZlJFMVRUeUE5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmZSRTFUVHlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMxOWtWRUZISUQwZ2FXWmZaV3h6WlNodlluTmZaRlJCUnlBOVBTQXdMQ0J0YVc1V1lXeDFaU3dnYkc5bk1paHZZbk5mWkZSQlJ5a3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMTlCTkRnMUlEMGdhV1pmWld4elpTaHZZbk5mUVRRNE5TQTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5OZlFUUTROU2twS1Z4dVhHNGpJRTFsY21kbElHUmhkR0Z6WlhSY2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T214bFpuUmZhbTlwYmlodlluTmxlSEFzSUdKNUlEMGdZeWhjSW1sa1hDSXBLVnh1WEc0aklGQnNiM1JjYm5SbGJYQWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGthWE4wWVc1alpTQTlJSE4wWVhKME1pQXRJSE4wWVhKME1Ta2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2x6ZEdGdVkyVXNJR3h2WjE5dlluTmZSRTFUVHl3Z1FXNXVieklwWEc1amIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGd2laR2x6ZEdGdVkyVmNJaXdnWENKelkyOXlaVndpTENCY0lrRnVibTh5WENJcFhHNWpjbVZoZEdWZlpHbHpkRjkyYzE5aGRtZFRZMjl5WlY5d1pYSlVjbVZoZEcxbGJuUmZiMlVvZEdWdGNDd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENKZlJFMVRUMTlzYjJkUFluTmNJaWtzSUhWdWFYRjFaU2hrWVhSaEpFRnVibTh5S1N3Z1kyOXNiM0pNYVhOMFRHOXZjQ2xjYmx4dWRHVnRjQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hrYVhOMFlXNWpaU3dnYkc5blgyOWljMTlrVkVGSExDQkJibTV2TWlsY2JtTnZiRzVoYldWektIUmxiWEFwSUR3dElHTW9YQ0prYVhOMFlXNWpaVndpTENCY0luTmpiM0psWENJc0lGd2lRVzV1YnpKY0lpbGNibU55WldGMFpWOWthWE4wWDNaelgyRjJaMU5qYjNKbFgzQmxjbFJ5WldGMGJXVnVkRjl2WlNoMFpXMXdMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOWtWRUZIWDJ4dlowOWljMXdpS1N3Z2RXNXBjWFZsS0dSaGRHRWtRVzV1YnpJcExDQmpiMnh2Y2t4cGMzUk1iMjl3S1Z4dVhHNWNiaU1nUTNKbFlYUnBibWNnWm1sbmRYSmxjeUJ3WlhJZ1pXRmphQ0JqYjI1a2FYUnBiMjRzSUdScFptWmxjbVZ1ZEdsaGJGeHVkR1Z0Y0NBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dScGMzUmhibU5sSUQwZ2MzUmhjblF5SUMwZ2MzUmhjblF4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WjE5dlluTmZaR2xtWmw5a1ZFRkhYMFJOVTA4Z1BTQnNiMmRmYjJKelgyUlVRVWNnTFNCc2IyZGZiMkp6WDBSTlUwOHBJQ1UrSlNCY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENoa2FYTjBZVzVqWlN3Z2JHOW5YMjlpYzE5a2FXWm1YMlJVUVVkZlJFMVRUeXdnUVc1dWJ6SXBYRzVqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z3aVpHbHpkR0Z1WTJWY0lpd2dYQ0p6WTI5eVpWd2lMQ0JjSWtGdWJtOHlYQ0lwWEc1amNtVmhkR1ZmWkdsemRGOTJjMTloZG1kRWFXWm1VMk52Y21WZmNHVnlWSEpsWVhSdFpXNTBYMjlsS0hSbGJYQXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgyUlVRVWRmYkc5blQySnpYQ0lwTENCMWJtbHhkV1VvWkdGMFlTUkJibTV2TWlrc0lHTnZiRzl5VEdsemRFeHZiM0FwWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG4jIEltcG9ydCBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSlcblxuIyBJbXBvcnQgb2JzL2V4cCBzY29yZXMgYW5kIG1lcmdlIHRvIHRoZSBkYXRhc2V0XG5taW5WYWx1ZSA8LSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShsb2dfb2JzX0RNU08gPSBpZl9lbHNlKG9ic19ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic19ETVNPKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzX2RUQUcgPSBpZl9lbHNlKG9ic19kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic19kVEFHKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzX0E0ODUgPSBpZl9lbHNlKG9ic19BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic19BNDg1KSkpXG5cbiMgTWVyZ2UgZGF0YXNldFxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpXG5cbiMgUGxvdFxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgbG9nX29ic19ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudF9vZSh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9ETVNPX2xvZ09ic1xcKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjb2xvckxpc3RMb29wKVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzX2RUQUcsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50X29lKHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdfbG9nT2JzXFwpLCB1bmlxdWUoZGF0YSRBbm5vMiksIGNvbG9yTGlzdExvb3ApXG5cblxuIyBDcmVhdGluZyBmaWd1cmVzIHBlciBlYWNoIGNvbmRpdGlvbiwgZGlmZmVyZW50aWFsXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic19kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNfZFRBRyAtIGxvZ19vYnNfRE1TTykgJT4lIFxuICBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzX2RpZmZfZFRBR19ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnRfb2UodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR19sb2dPYnNcXCksIHVuaXF1ZShkYXRhJEFubm8yKSwgY29sb3JMaXN0TG9vcClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# Import annotation
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obs_DMSO = if_else(obs_DMSO == 0, minValue, log2(obs_DMSO)),
                  log_obs_dTAG = if_else(obs_dTAG == 0, minValue, log2(obs_dTAG)),
                  log_obs_A485 = if_else(obs_A485 == 0, minValue, log2(obs_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\))

# Plot
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, log_obs_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment_oe(temp, figDir, paste0(name, \_DMSO_logObs\), unique(data$Anno2), colorListLoop)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, log_obs_dTAG, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment_oe(temp, figDir, paste0(name, \_dTAG_logObs\), unique(data$Anno2), colorListLoop)


# Creating figures per each condition, differential
temp <- data %>% dplyr::mutate(distance = start2 - start1,
                               log_obs_diff_dTAG_DMSO = log_obs_dTAG - log_obs_DMSO) %>% 
  dplyr::select(distance, log_obs_diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment_oe(temp, figDir, paste0(name, \_dTAG_logObs\), unique(data$Anno2), colorListLoop)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkpiWEJ2Y25RZ1lXNXViM1JoZEdsdmJseHVibUZ0WlNBOExTQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNYRnh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y0xuUnpkbHhjS1NrcFhHNWNiaU1nU1cxd2IzSjBJRzlpY3k5bGVIQWdjMk52Y21WeklHRnVaQ0J0WlhKblpTQjBieUIwYUdVZ1pHRjBZWE5sZEZ4dWJXbHVWbUZzZFdVZ1BDMGdMVFJjYm05aWMyVjRjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRnhjYkc5dmNGTmpiM0psWDJOdmJuTmZiMkp6Wlhod0xuUnpkbHhjS1NrcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvYkc5blgyOWljMTlFVFZOUElEMGdhV1pmWld4elpTaHZZbk5mUkUxVFR5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5OZlJFMVRUeWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOW5YMjlpYzE5a1ZFRkhJRDBnYVdaZlpXeHpaU2h2WW5OZlpGUkJSeUE5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmZaRlJCUnlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMxOUJORGcxSUQwZ2FXWmZaV3h6WlNodlluTmZRVFE0TlNBOVBTQXdMQ0J0YVc1V1lXeDFaU3dnYkc5bk1paHZZbk5mUVRRNE5Ta3BLVnh1WEc0aklFMWxjbWRsSUdSaGRHRnpaWFJjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbXhsWm5SZmFtOXBiaWh2WW5ObGVIQXNJR0o1SUQwZ1l5aGNYR2xrWEZ3cEtWeHVYRzRqSUZCc2IzUmNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVNrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbHpkR0Z1WTJVc0lHeHZaMTl2WW5OZlJFMVRUeXdnUVc1dWJ6SXBYRzVqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z4Y1pHbHpkR0Z1WTJWY1hDd2dYRnh6WTI5eVpWeGNMQ0JjWEVGdWJtOHlYRndwWEc1amNtVmhkR1ZmWkdsemRGOTJjMTloZG1kVFkyOXlaVjl3WlhKVWNtVmhkRzFsYm5SZmIyVW9kR1Z0Y0N3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnhmUkUxVFQxOXNiMmRQWW5OY1hDa3NJSFZ1YVhGMVpTaGtZWFJoSkVGdWJtOHlLU3dnWTI5c2IzSk1hWE4wVEc5dmNDbGNibHh1ZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHUnBjM1JoYm1ObElEMGdjM1JoY25ReUlDMGdjM1JoY25ReEtTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGthWE4wWVc1alpTd2diRzluWDI5aWMxOWtWRUZITENCQmJtNXZNaWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXBJRHd0SUdNb1hGeGthWE4wWVc1alpWeGNMQ0JjWEhOamIzSmxYRndzSUZ4Y1FXNXViekpjWENsY2JtTnlaV0YwWlY5a2FYTjBYM1p6WDJGMloxTmpiM0psWDNCbGNsUnlaV0YwYldWdWRGOXZaU2gwWlcxd0xDQm1hV2RFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5a1ZFRkhYMnh2WjA5aWMxeGNLU3dnZFc1cGNYVmxLR1JoZEdFa1FXNXVieklwTENCamIyeHZja3hwYzNSTWIyOXdLVnh1WEc1Y2JpTWdRM0psWVhScGJtY2dabWxuZFhKbGN5QndaWElnWldGamFDQmpiMjVrYVhScGIyNHNJR1JwWm1abGNtVnVkR2xoYkZ4dWRHVnRjQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5OZlpHbG1abDlrVkVGSFgwUk5VMDhnUFNCc2IyZGZiMkp6WDJSVVFVY2dMU0JzYjJkZmIySnpYMFJOVTA4cElDVStKU0JjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hrYVhOMFlXNWpaU3dnYkc5blgyOWljMTlrYVdabVgyUlVRVWRmUkUxVFR5d2dRVzV1YnpJcFhHNWpiMnh1WVcxbGN5aDBaVzF3S1NBOExTQmpLRnhjWkdsemRHRnVZMlZjWEN3Z1hGeHpZMjl5WlZ4Y0xDQmNYRUZ1Ym04eVhGd3BYRzVqY21WaGRHVmZaR2x6ZEY5MmMxOWhkbWRFYVdabVUyTnZjbVZmY0dWeVZISmxZWFJ0Wlc1MFgyOWxLSFJsYlhBc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDJSVVFVZGZiRzluVDJKelhGd3BMQ0IxYm1seGRXVW9aR0YwWVNSQmJtNXZNaWtzSUdOdmJHOXlUR2x6ZEV4dmIzQXBYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG4jIEltcG9ydCBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSlcblxuIyBJbXBvcnQgb2JzL2V4cCBzY29yZXMgYW5kIG1lcmdlIHRvIHRoZSBkYXRhc2V0XG5taW5WYWx1ZSA8LSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShsb2dfb2JzX0RNU08gPSBpZl9lbHNlKG9ic19ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic19ETVNPKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzX2RUQUcgPSBpZl9lbHNlKG9ic19kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic19kVEFHKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzX0E0ODUgPSBpZl9lbHNlKG9ic19BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic19BNDg1KSkpXG5cbiMgTWVyZ2UgZGF0YXNldFxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpXG5cbiMgUGxvdFxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgbG9nX29ic19ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudF9vZSh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9ETVNPX2xvZ09ic1xcKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjb2xvckxpc3RMb29wKVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzX2RUQUcsIEFubm8yKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGRpc3RhbmNlXFwsIFxcc2NvcmVcXCwgXFxBbm5vMlxcKVxuY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50X29lKHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdfbG9nT2JzXFwpLCB1bmlxdWUoZGF0YSRBbm5vMiksIGNvbG9yTGlzdExvb3ApXG5cblxuIyBDcmVhdGluZyBmaWd1cmVzIHBlciBlYWNoIGNvbmRpdGlvbiwgZGlmZmVyZW50aWFsXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic19kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNfZFRBRyAtIGxvZ19vYnNfRE1TTykgJT4lIFxuICBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzX2RpZmZfZFRBR19ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnRfb2UodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfZFRBR19sb2dPYnNcXCksIHVuaXF1ZShkYXRhJEFubm8yKSwgY29sb3JMaXN0TG9vcClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBJbXBvcnQgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5cbiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldFxubWluVmFsdWUgPC0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic19ETVNPID0gaWZfZWxzZShvYnNfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic19kVEFHID0gaWZfZWxzZShvYnNfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNfZFRBRykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic19BNDg1ID0gaWZfZWxzZShvYnNfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNfQTQ4NSkpKVxuXG4jIE1lcmdlIGRhdGFzZXRcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuXG4jIFBsb3RcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGxvZ19vYnNfRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnRfb2UodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfRE1TT19sb2dPYnNcXCksIHVuaXF1ZShkYXRhJEFubm8yKSwgY29sb3JMaXN0TG9vcClcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgbG9nX29ic19kVEFHLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudF9vZSh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9kVEFHX2xvZ09ic1xcKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjb2xvckxpc3RMb29wKVxuXG5cbiMgQ3JlYXRpbmcgZmlndXJlcyBwZXIgZWFjaCBjb25kaXRpb24sIGRpZmZlcmVudGlhbFxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19vYnNfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzX2RUQUcgLSBsb2dfb2JzX0RNU08pICU+JSBcbiAgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgbG9nX29ic19kaWZmX2RUQUdfRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50X29lKHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2RUQUdfbG9nT2JzXFwpLCB1bmlxdWUoZGF0YSRBbm5vMiksIGNvbG9yTGlzdExvb3ApXG5gYGBcbmBgYCJ9 -->

```r
```r
# Import annotation
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obs_DMSO = if_else(obs_DMSO == 0, minValue, log2(obs_DMSO)),
                  log_obs_dTAG = if_else(obs_dTAG == 0, minValue, log2(obs_dTAG)),
                  log_obs_A485 = if_else(obs_A485 == 0, minValue, log2(obs_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\))

# Plot
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, log_obs_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment_oe(temp, figDir, paste0(name, \_DMSO_logObs\), unique(data$Anno2), colorListLoop)

temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, log_obs_dTAG, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment_oe(temp, figDir, paste0(name, \_dTAG_logObs\), unique(data$Anno2), colorListLoop)


# Creating figures per each condition, differential
temp <- data %>% dplyr::mutate(distance = start2 - start1,
                               log_obs_diff_dTAG_DMSO = log_obs_dTAG - log_obs_DMSO) %>% 
  dplyr::select(distance, log_obs_diff_dTAG_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment_oe(temp, figDir, paste0(name, \_dTAG_logObs\), unique(data$Anno2), colorListLoop)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


###### OE, grouped

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJKYlhCdmNuUWdZVzV1YjNSaGRHbHZibHh1Ym1GdFpTQThMU0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjSWx4dVpHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lMblJ6ZGx3aUtTa3BYRzVjYmlNZ1NXMXdiM0owSUc5aWN5OWxlSEFnYzJOdmNtVnpJR0Z1WkNCdFpYSm5aU0IwYnlCMGFHVWdaR0YwWVhObGRGeHViV2x1Vm1Gc2RXVWdQQzBnTFRSY2JtOWljMlY0Y0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0Z3aWJHOXZjRk5qYjNKbFgyTnZibk5mYjJKelpYaHdMblJ6ZGx3aUtTa3BJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb2JHOW5YMjlpYzJWNGNGOUVUVk5QSUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmUkUxVFR5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZSRTFUVHlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrVkVGSElEMGdhV1pmWld4elpTaHZZbk5sZUhCZlpGUkJSeUE5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmWkZSQlJ5a3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5Qk5EZzFJRDBnYVdaZlpXeHpaU2h2WW5ObGVIQmZRVFE0TlNBOVBTQXdMQ0J0YVc1V1lXeDFaU3dnYkc5bk1paHZZbk5sZUhCZlFUUTROU2twS1Z4dVhHNGpJRTFsY21kbElHUmhkR0Z6WlhSY2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T214bFpuUmZhbTlwYmlodlluTmxlSEFzSUdKNUlEMGdZeWhjSW1sa1hDSXBLVnh1WEc0aklGQnNiM1JjYm5SbGJYQWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGthWE4wWVc1alpTQTlJSE4wWVhKME1pQXRJSE4wWVhKME1Ta2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aR2x6ZEdGdVkyVXNJR3h2WjE5dlluTmxlSEJmUVRRNE5Td2dRVzV1YnpJcFhHNWpiMnh1WVcxbGN5aDBaVzF3S1NBOExTQmpLRndpWkdsemRHRnVZMlZjSWl3Z1hDSnpZMjl5WlZ3aUxDQmNJa0Z1Ym04eVhDSXBYRzVqY21WaGRHVmZaR2x6ZEY5MmMxOWhkbWRUWTI5eVpWOXdaWEpVY21WaGRHMWxiblJmYjJVb2RHVnRjQ3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZRVFE0TlY5c2IyZFBSVndpS1N3Z2RXNXBjWFZsS0dSaGRHRWtRVzV1YnpJcExDQmpiMnh2Y2t4cGMzUk1iMjl3S1Z4dVhHNWNiaU1nUTNKbFlYUnBibWNnWm1sbmRYSmxjeUJ3WlhJZ1pXRmphQ0JqYjI1a2FYUnBiMjRzSUdScFptWmxjbVZ1ZEdsaGJGeHVkR1Z0Y0NBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dScGMzUmhibU5sSUQwZ2MzUmhjblF5SUMwZ2MzUmhjblF4TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WjE5dlluTmxlSEJmWkdsbVpsOUJORGcxWDBSTlUwOGdQU0JzYjJkZmIySnpaWGh3WDBFME9EVWdMU0JzYjJkZmIySnpaWGh3WDBSTlUwOHBJQ1UrSlNCY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENoa2FYTjBZVzVqWlN3Z2JHOW5YMjlpYzJWNGNGOWthV1ptWDBFME9EVmZSRTFUVHl3Z1FXNXVieklwWEc1amIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGd2laR2x6ZEdGdVkyVmNJaXdnWENKelkyOXlaVndpTENCY0lrRnVibTh5WENJcFhHNWpjbVZoZEdWZlpHbHpkRjkyYzE5aGRtZEVhV1ptVTJOdmNtVmZjR1Z5VkhKbFlYUnRaVzUwWDI5bEtIUmxiWEFzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYMEUwT0RWZmJHOW5UMFZjSWlrc0lIVnVhWEYxWlNoa1lYUmhKRUZ1Ym04eUtTd2dZMjlzYjNKTWFYTjBURzl2Y0NsY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG4jIEltcG9ydCBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFwudHN2XFwpKSlcblxuIyBJbXBvcnQgb2JzL2V4cCBzY29yZXMgYW5kIG1lcmdlIHRvIHRoZSBkYXRhc2V0XG5taW5WYWx1ZSA8LSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSkpXG5cbiMgTWVyZ2UgZGF0YXNldFxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpXG5cbiMgUGxvdFxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgbG9nX29ic2V4cF9BNDg1LCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudF9vZSh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9BNDg1X2xvZ09FXFwpLCB1bmlxdWUoZGF0YSRBbm5vMiksIGNvbG9yTGlzdExvb3ApXG5cblxuIyBDcmVhdGluZyBmaWd1cmVzIHBlciBlYWNoIGNvbmRpdGlvbiwgZGlmZmVyZW50aWFsXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTykgJT4lIFxuICBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPLCBBbm5vMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxkaXN0YW5jZVxcLCBcXHNjb3JlXFwsIFxcQW5ubzJcXClcbmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnRfb2UodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NV9sb2dPRVxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjb2xvckxpc3RMb29wKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# Import annotation
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\))

# Plot
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, log_obsexp_A485, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment_oe(temp, figDir, paste0(name, \_A485_logOE\), unique(data$Anno2), colorListLoop)


# Creating figures per each condition, differential
temp <- data %>% dplyr::mutate(distance = start2 - start1,
                               log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO) %>% 
  dplyr::select(distance, log_obsexp_diff_A485_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment_oe(temp, figDir, paste0(name, \_A485_logOE\), unique(data$Anno2), colorListLoop)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkpiWEJ2Y25RZ1lXNXViM1JoZEdsdmJseHVibUZ0WlNBOExTQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNYRnh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y0xuUnpkbHhjS1NrcFhHNWNiaU1nU1cxd2IzSjBJRzlpY3k5bGVIQWdjMk52Y21WeklHRnVaQ0J0WlhKblpTQjBieUIwYUdVZ1pHRjBZWE5sZEZ4dWJXbHVWbUZzZFdVZ1BDMGdMVFJjYm05aWMyVjRjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRnhjYkc5dmNGTmpiM0psWDJOdmJuTmZiMkp6Wlhod0xuUnpkbHhjS1NrcElDVStKVnh1SUNBZ0lHUndiSGx5T2pwdGRYUmhkR1VvYkc5blgyOWljMlY0Y0Y5RVRWTlBJRDBnYVdaZlpXeHpaU2h2WW5ObGVIQmZSRTFUVHlBOVBTQXdMQ0J0YVc1V1lXeDFaU3dnYkc5bk1paHZZbk5sZUhCZlJFMVRUeWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOW5YMjlpYzJWNGNGOWtWRUZISUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmWkZSQlJ5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZaRlJCUnlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlCTkRnMUlEMGdhV1pmWld4elpTaHZZbk5sZUhCZlFUUTROU0E5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmUVRRNE5Ta3BLVnh1WEc0aklFMWxjbWRsSUdSaGRHRnpaWFJjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbXhsWm5SZmFtOXBiaWh2WW5ObGVIQXNJR0o1SUQwZ1l5aGNYR2xrWEZ3cEtWeHVYRzRqSUZCc2IzUmNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlNBOUlITjBZWEowTWlBdElITjBZWEowTVNrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1pHbHpkR0Z1WTJVc0lHeHZaMTl2WW5ObGVIQmZRVFE0TlN3Z1FXNXVieklwWEc1amIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGeGNaR2x6ZEdGdVkyVmNYQ3dnWEZ4elkyOXlaVnhjTENCY1hFRnVibTh5WEZ3cFhHNWpjbVZoZEdWZlpHbHpkRjkyYzE5aGRtZFRZMjl5WlY5d1pYSlVjbVZoZEcxbGJuUmZiMlVvZEdWdGNDd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZlFUUTROVjlzYjJkUFJWeGNLU3dnZFc1cGNYVmxLR1JoZEdFa1FXNXVieklwTENCamIyeHZja3hwYzNSTWIyOXdLVnh1WEc1Y2JpTWdRM0psWVhScGJtY2dabWxuZFhKbGN5QndaWElnWldGamFDQmpiMjVrYVhScGIyNHNJR1JwWm1abGNtVnVkR2xoYkZ4dWRHVnRjQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5ObGVIQmZaR2xtWmw5Qk5EZzFYMFJOVTA4Z1BTQnNiMmRmYjJKelpYaHdYMEUwT0RVZ0xTQnNiMmRmYjJKelpYaHdYMFJOVTA4cElDVStKU0JjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hrYVhOMFlXNWpaU3dnYkc5blgyOWljMlY0Y0Y5a2FXWm1YMEUwT0RWZlJFMVRUeXdnUVc1dWJ6SXBYRzVqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z4Y1pHbHpkR0Z1WTJWY1hDd2dYRnh6WTI5eVpWeGNMQ0JjWEVGdWJtOHlYRndwWEc1amNtVmhkR1ZmWkdsemRGOTJjMTloZG1kRWFXWm1VMk52Y21WZmNHVnlWSEpsWVhSdFpXNTBYMjlsS0hSbGJYQXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gwRTBPRFZmYkc5blQwVmNYQ2tzSUhWdWFYRjFaU2hrWVhSaEpFRnVibTh5S1N3Z1kyOXNiM0pNYVhOMFRHOXZjQ2xjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuIyBJbXBvcnQgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5cbiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldFxubWluVmFsdWUgPC0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuXG4jIE1lcmdlIGRhdGFzZXRcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuXG4jIFBsb3RcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGxvZ19vYnNleHBfQTQ4NSwgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnRfb2UodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NV9sb2dPRVxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjb2xvckxpc3RMb29wKVxuXG5cbiMgQ3JlYXRpbmcgZmlndXJlcyBwZXIgZWFjaCBjb25kaXRpb24sIGRpZmZlcmVudGlhbFxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pICU+JSBcbiAgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50X29lKHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVfbG9nT0VcXCksIHVuaXF1ZShkYXRhJEFubm8yKSwgY29sb3JMaXN0TG9vcClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBJbXBvcnQgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5cbiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldFxubWluVmFsdWUgPC0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuXG4jIE1lcmdlIGRhdGFzZXRcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuXG4jIFBsb3RcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGxvZ19vYnNleHBfQTQ4NSwgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnRfb2UodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfQTQ4NV9sb2dPRVxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjb2xvckxpc3RMb29wKVxuXG5cbiMgQ3JlYXRpbmcgZmlndXJlcyBwZXIgZWFjaCBjb25kaXRpb24sIGRpZmZlcmVudGlhbFxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pICU+JSBcbiAgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTywgQW5ubzIpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcZGlzdGFuY2VcXCwgXFxzY29yZVxcLCBcXEFubm8yXFwpXG5jcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50X29lKHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX0E0ODVfbG9nT0VcXCksIHVuaXF1ZShkYXRhJEFubm8yKSwgY29sb3JMaXN0TG9vcClcbmBgYFxuYGBgIn0= -->

```r
```r
# Import annotation
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\))

# Plot
temp <- data %>% dplyr::mutate(distance = start2 - start1) %>% dplyr::select(distance, log_obsexp_A485, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgScore_perTreatment_oe(temp, figDir, paste0(name, \_A485_logOE\), unique(data$Anno2), colorListLoop)


# Creating figures per each condition, differential
temp <- data %>% dplyr::mutate(distance = start2 - start1,
                               log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO) %>% 
  dplyr::select(distance, log_obsexp_diff_A485_DMSO, Anno2)
colnames(temp) <- c(\distance\, \score\, \Anno2\)
create_dist_vs_avgDiffScore_perTreatment_oe(temp, figDir, paste0(name, \_A485_logOE\), unique(data$Anno2), colorListLoop)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


###### Observed

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJKYlhCdmNuUWdZVzV1YjNSaGRHbHZibHh1Ym1GdFpTQThMU0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjSWx4dVpHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lMblJ6ZGx3aUtTa3BYRzVjYmlNZ1NXMXdiM0owSUc5aWN5OWxlSEFnYzJOdmNtVnpJR0Z1WkNCdFpYSm5aU0IwYnlCMGFHVWdaR0YwWVhObGRGeHViV2x1Vm1Gc2RXVWdQU0F0TkZ4dWIySnpaWGh3SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvWENKc2IyOXdVMk52Y21WZlkyOXVjMTl2WW5ObGVIQXVkSE4yWENJcEtTa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tMTFkR0YwWlNoc2IyZGZiMkp6Wlhod1gwUk5VMDhnUFNCcFpsOWxiSE5sS0c5aWMyVjRjRjlFVFZOUElEMDlJREFzSUcxcGJsWmhiSFZsTENCc2IyY3lLRzlpYzJWNGNGOUVUVk5QS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMlJVUVVjZ1BTQnBabDlsYkhObEtHOWljMlY0Y0Y5a1ZFRkhJRDA5SURBc0lHMXBibFpoYkhWbExDQnNiMmN5S0c5aWMyVjRjRjlrVkVGSEtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDBFME9EVWdQU0JwWmw5bGJITmxLRzlpYzJWNGNGOUJORGcxSUQwOUlEQXNJRzFwYmxaaGJIVmxMQ0JzYjJjeUtHOWljMlY0Y0Y5Qk5EZzFLU2twWEc1Y2JpTWdUV1Z5WjJVZ1pHRjBZWE5sZEZ4dVpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YkdWbWRGOXFiMmx1S0c5aWMyVjRjQ3dnWW5rZ1BTQmpLRndpYVdSY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0d4dloxOXZZbk5sZUhCZlpHbG1abDlrVkVGSFgwUk5VMDhnUFNCc2IyZGZiMkp6Wlhod1gyUlVRVWNnTFNCc2IyZGZiMkp6Wlhod1gwUk5VMDhzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5a2FXWm1YMEUwT0RWZlJFMVRUeUE5SUd4dloxOXZZbk5sZUhCZlFUUTROU0F0SUd4dloxOXZZbk5sZUhCZlJFMVRUeWxjYmx4dVpHbG1aa04xZEc5bVppQThMU0F3TGpWY2JtTnlaV0YwWlY5c2IyOXdYM05qWVhSMFpYSndiRzkwWDI5bEtHUmhkR0VzSUdacFowUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lYMnh2WjA5Rlgxd2lMQ0JjSW1Gc2JGd2lLU3dnZFc1cGNYVmxLR1JoZEdFa1FXNXVieklwTENCa2FXWm1RM1YwYjJabUtWeHVZM0psWVhSbFgyeHZiM0JmYzJOaGRIUmxjbkJzYjNSZmIyVW9aR0YwWVN3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYQ0pmYkc5blQwVmZYQ0lzSUZ3aWNtVm5YQ0lwTENCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJc0lGd2lSUzFGWENJcExDQmthV1ptUTNWMGIyWm1LVnh1WTNKbFlYUmxYMnh2YjNCZmMyTmhkSFJsY25Cc2IzUmZiMlVvWkdGMFlTd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENKZmJHOW5UMFZmWENJc0lGd2ljM1J5WENJcExDQmpLRndpVXkxVFhDSXNJRndpVXkxWVhDSXBMQ0JrYVdabVEzVjBiMlptS1Z4dVhHNWNibHh1WTNKbFlYUmxYMlJwYzNSZlltRnljR3h2ZEY5dlpTaGtZWFJoTENCbWFXZEVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNJbDlzYjJkUFJWd2lLU3dnWENKaGJHeGNJaXdnSUhWdWFYRjFaU2hrWVhSaEpFRnVibTh5S1N3Z1pHbG1aa04xZEc5bVppbGNibU55WldGMFpWOWthWE4wWDJKaGNuQnNiM1JmYjJVb1pHRjBZU3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZiRzluVDBWY0lpa3NJRndpY21WblhDSXNJQ0JqS0Z3aVVDMVFYQ0lzSUZ3aVVDMUZYQ0lzSUZ3aVJTMUZYQ0lwTENCa2FXWm1RM1YwYjJabUtWeHVZM0psWVhSbFgyUnBjM1JmWW1GeWNHeHZkRjl2WlNoa1lYUmhMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY0lsOXNiMmRQUlZ3aUtTd2dYQ0p5WldkZk1XMWlYQ0lzSUNCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJc0lGd2lSUzFGWENJcExDQmthV1ptUTNWMGIyWm1MQ0F4WlRZcFhHNWpjbVZoZEdWZlpHbHpkRjlpWVhKd2JHOTBYMjlsS0dSaGRHRXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ3aVgyeHZaMDlGWENJcExDQmNJbk4wY2x3aUxDQWdZeWhjSWxNdFUxd2lMQ0JjSWxNdFdGd2lLU3dnWkdsbVprTjFkRzltWmlsY2JtTnlaV0YwWlY5a2FYTjBYMkpoY25Cc2IzUmZiMlVvWkdGMFlTd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWENKZmJHOW5UMFZjSWlrc0lGd2ljM1J5WHpGdFlsd2lMQ0FnWXloY0lsTXRVMXdpTENCY0lsTXRXRndpS1N3Z1pHbG1aa04xZEc5bVppd2dNV1UyS1Z4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuIyBJbXBvcnQgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5cbiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldFxubWluVmFsdWUgPSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSkpXG5cbiMgTWVyZ2UgZGF0YXNldFxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTylcblxuZGlmZkN1dG9mZiA8LSAwLjVcbmNyZWF0ZV9sb29wX3NjYXR0ZXJwbG90X29lKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2xvZ09FX1xcLCBcXGFsbFxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBkaWZmQ3V0b2ZmKVxuY3JlYXRlX2xvb3Bfc2NhdHRlcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfbG9nT0VfXFwsIFxccmVnXFwpLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBkaWZmQ3V0b2ZmKVxuY3JlYXRlX2xvb3Bfc2NhdHRlcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfbG9nT0VfXFwsIFxcc3RyXFwpLCBjKFxcUy1TXFwsIFxcUy1YXFwpLCBkaWZmQ3V0b2ZmKVxuXG5cblxuY3JlYXRlX2Rpc3RfYmFycGxvdF9vZShkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9sb2dPRVxcKSwgXFxhbGxcXCwgIHVuaXF1ZShkYXRhJEFubm8yKSwgZGlmZkN1dG9mZilcbmNyZWF0ZV9kaXN0X2JhcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfbG9nT0VcXCksIFxccmVnXFwsICBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBkaWZmQ3V0b2ZmKVxuY3JlYXRlX2Rpc3RfYmFycGxvdF9vZShkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9sb2dPRVxcKSwgXFxyZWdfMW1iXFwsICBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBkaWZmQ3V0b2ZmLCAxZTYpXG5jcmVhdGVfZGlzdF9iYXJwbG90X29lKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2xvZ09FXFwpLCBcXHN0clxcLCAgYyhcXFMtU1xcLCBcXFMtWFxcKSwgZGlmZkN1dG9mZilcbmNyZWF0ZV9kaXN0X2JhcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfbG9nT0VcXCksIFxcc3RyXzFtYlxcLCAgYyhcXFMtU1xcLCBcXFMtWFxcKSwgZGlmZkN1dG9mZiwgMWU2KVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
# Import annotation
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue = -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\)) %>%
  dplyr::mutate(log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

diffCutoff <- 0.5
create_loop_scatterplot_oe(data, figDir, paste0(name, \_logOE_\, \all\), unique(data$Anno2), diffCutoff)
create_loop_scatterplot_oe(data, figDir, paste0(name, \_logOE_\, \reg\), c(\P-P\, \P-E\, \E-E\), diffCutoff)
create_loop_scatterplot_oe(data, figDir, paste0(name, \_logOE_\, \str\), c(\S-S\, \S-X\), diffCutoff)



create_dist_barplot_oe(data, figDir, paste0(name, \_logOE\), \all\,  unique(data$Anno2), diffCutoff)
create_dist_barplot_oe(data, figDir, paste0(name, \_logOE\), \reg\,  c(\P-P\, \P-E\, \E-E\), diffCutoff)
create_dist_barplot_oe(data, figDir, paste0(name, \_logOE\), \reg_1mb\,  c(\P-P\, \P-E\, \E-E\), diffCutoff, 1e6)
create_dist_barplot_oe(data, figDir, paste0(name, \_logOE\), \str\,  c(\S-S\, \S-X\), diffCutoff)
create_dist_barplot_oe(data, figDir, paste0(name, \_logOE\), \str_1mb\,  c(\S-S\, \S-X\), diffCutoff, 1e6)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkpiWEJ2Y25RZ1lXNXViM1JoZEdsdmJseHVibUZ0WlNBOExTQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNYRnh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y0xuUnpkbHhjS1NrcFhHNWNiaU1nU1cxd2IzSjBJRzlpY3k5bGVIQWdjMk52Y21WeklHRnVaQ0J0WlhKblpTQjBieUIwYUdVZ1pHRjBZWE5sZEZ4dWJXbHVWbUZzZFdVZ1BTQXRORnh1YjJKelpYaHdJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9YRnhzYjI5d1UyTnZjbVZmWTI5dWMxOXZZbk5sZUhBdWRITjJYRndwS1NrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2hzYjJkZmIySnpaWGh3WDBSTlUwOGdQU0JwWmw5bGJITmxLRzlpYzJWNGNGOUVUVk5QSUQwOUlEQXNJRzFwYmxaaGJIVmxMQ0JzYjJjeUtHOWljMlY0Y0Y5RVRWTlBLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyZGZiMkp6Wlhod1gyUlVRVWNnUFNCcFpsOWxiSE5sS0c5aWMyVjRjRjlrVkVGSElEMDlJREFzSUcxcGJsWmhiSFZsTENCc2IyY3lLRzlpYzJWNGNGOWtWRUZIS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMEUwT0RVZ1BTQnBabDlsYkhObEtHOWljMlY0Y0Y5Qk5EZzFJRDA5SURBc0lHMXBibFpoYkhWbExDQnNiMmN5S0c5aWMyVjRjRjlCTkRnMUtTa3BYRzVjYmlNZ1RXVnlaMlVnWkdGMFlYTmxkRnh1WkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZiR1ZtZEY5cWIybHVLRzlpYzJWNGNDd2dZbmtnUFNCaktGeGNhV1JjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOGdQU0JzYjJkZmIySnpaWGh3WDJSVVFVY2dMU0JzYjJkZmIySnpaWGh3WDBSTlUwOHNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrYVdabVgwRTBPRFZmUkUxVFR5QTlJR3h2WjE5dlluTmxlSEJmUVRRNE5TQXRJR3h2WjE5dlluTmxlSEJmUkUxVFR5bGNibHh1WkdsbVprTjFkRzltWmlBOExTQXdMalZjYm1OeVpXRjBaVjlzYjI5d1gzTmpZWFIwWlhKd2JHOTBYMjlsS0dSaGRHRXNJR1pwWjBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gyeHZaMDlGWDF4Y0xDQmNYR0ZzYkZ4Y0tTd2dkVzVwY1hWbEtHUmhkR0VrUVc1dWJ6SXBMQ0JrYVdabVEzVjBiMlptS1Z4dVkzSmxZWFJsWDJ4dmIzQmZjMk5oZEhSbGNuQnNiM1JmYjJVb1pHRjBZU3dnWm1sblJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hGeGZiRzluVDBWZlhGd3NJRnhjY21WblhGd3BMQ0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndzSUZ4Y1JTMUZYRndwTENCa2FXWm1RM1YwYjJabUtWeHVZM0psWVhSbFgyeHZiM0JmYzJOaGRIUmxjbkJzYjNSZmIyVW9aR0YwWVN3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnhmYkc5blQwVmZYRndzSUZ4Y2MzUnlYRndwTENCaktGeGNVeTFUWEZ3c0lGeGNVeTFZWEZ3cExDQmthV1ptUTNWMGIyWm1LVnh1WEc1Y2JseHVZM0psWVhSbFgyUnBjM1JmWW1GeWNHeHZkRjl2WlNoa1lYUmhMQ0JtYVdkRWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY1hGOXNiMmRQUlZ4Y0tTd2dYRnhoYkd4Y1hDd2dJSFZ1YVhGMVpTaGtZWFJoSkVGdWJtOHlLU3dnWkdsbVprTjFkRzltWmlsY2JtTnlaV0YwWlY5a2FYTjBYMkpoY25Cc2IzUmZiMlVvWkdGMFlTd2dabWxuUkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZmJHOW5UMFZjWENrc0lGeGNjbVZuWEZ3c0lDQmpLRnhjVUMxUVhGd3NJRnhjVUMxRlhGd3NJRnhjUlMxRlhGd3BMQ0JrYVdabVEzVjBiMlptS1Z4dVkzSmxZWFJsWDJScGMzUmZZbUZ5Y0d4dmRGOXZaU2hrWVhSaExDQm1hV2RFYVhJc0lIQmhjM1JsTUNodVlXMWxMQ0JjWEY5c2IyZFBSVnhjS1N3Z1hGeHlaV2RmTVcxaVhGd3NJQ0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndzSUZ4Y1JTMUZYRndwTENCa2FXWm1RM1YwYjJabUxDQXhaVFlwWEc1amNtVmhkR1ZmWkdsemRGOWlZWEp3Ykc5MFgyOWxLR1JoZEdFc0lHWnBaMFJwY2l3Z2NHRnpkR1V3S0c1aGJXVXNJRnhjWDJ4dlowOUZYRndwTENCY1hITjBjbHhjTENBZ1l5aGNYRk10VTF4Y0xDQmNYRk10V0Z4Y0tTd2daR2xtWmtOMWRHOW1aaWxjYm1OeVpXRjBaVjlrYVhOMFgySmhjbkJzYjNSZmIyVW9aR0YwWVN3Z1ptbG5SR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYRnhmYkc5blQwVmNYQ2tzSUZ4Y2MzUnlYekZ0WWx4Y0xDQWdZeWhjWEZNdFUxeGNMQ0JjWEZNdFdGeGNLU3dnWkdsbVprTjFkRzltWml3Z01XVTJLVnh1WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuIyBJbXBvcnQgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5cbiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldFxubWluVmFsdWUgPSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSkpXG5cbiMgTWVyZ2UgZGF0YXNldFxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTylcblxuZGlmZkN1dG9mZiA8LSAwLjVcbmNyZWF0ZV9sb29wX3NjYXR0ZXJwbG90X29lKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2xvZ09FX1xcLCBcXGFsbFxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBkaWZmQ3V0b2ZmKVxuY3JlYXRlX2xvb3Bfc2NhdHRlcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfbG9nT0VfXFwsIFxccmVnXFwpLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBkaWZmQ3V0b2ZmKVxuY3JlYXRlX2xvb3Bfc2NhdHRlcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfbG9nT0VfXFwsIFxcc3RyXFwpLCBjKFxcUy1TXFwsIFxcUy1YXFwpLCBkaWZmQ3V0b2ZmKVxuXG5cblxuY3JlYXRlX2Rpc3RfYmFycGxvdF9vZShkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9sb2dPRVxcKSwgXFxhbGxcXCwgIHVuaXF1ZShkYXRhJEFubm8yKSwgZGlmZkN1dG9mZilcbmNyZWF0ZV9kaXN0X2JhcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfbG9nT0VcXCksIFxccmVnXFwsICBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBkaWZmQ3V0b2ZmKVxuY3JlYXRlX2Rpc3RfYmFycGxvdF9vZShkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9sb2dPRVxcKSwgXFxyZWdfMW1iXFwsICBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBkaWZmQ3V0b2ZmLCAxZTYpXG5jcmVhdGVfZGlzdF9iYXJwbG90X29lKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2xvZ09FXFwpLCBcXHN0clxcLCAgYyhcXFMtU1xcLCBcXFMtWFxcKSwgZGlmZkN1dG9mZilcbmNyZWF0ZV9kaXN0X2JhcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfbG9nT0VcXCksIFxcc3RyXzFtYlxcLCAgYyhcXFMtU1xcLCBcXFMtWFxcKSwgZGlmZkN1dG9mZiwgMWU2KVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBJbXBvcnQgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5cbiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldFxubWluVmFsdWUgPSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSkpXG5cbiMgTWVyZ2UgZGF0YXNldFxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTylcblxuZGlmZkN1dG9mZiA8LSAwLjVcbmNyZWF0ZV9sb29wX3NjYXR0ZXJwbG90X29lKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2xvZ09FX1xcLCBcXGFsbFxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBkaWZmQ3V0b2ZmKVxuY3JlYXRlX2xvb3Bfc2NhdHRlcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfbG9nT0VfXFwsIFxccmVnXFwpLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBkaWZmQ3V0b2ZmKVxuY3JlYXRlX2xvb3Bfc2NhdHRlcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfbG9nT0VfXFwsIFxcc3RyXFwpLCBjKFxcUy1TXFwsIFxcUy1YXFwpLCBkaWZmQ3V0b2ZmKVxuXG5cblxuY3JlYXRlX2Rpc3RfYmFycGxvdF9vZShkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9sb2dPRVxcKSwgXFxhbGxcXCwgIHVuaXF1ZShkYXRhJEFubm8yKSwgZGlmZkN1dG9mZilcbmNyZWF0ZV9kaXN0X2JhcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfbG9nT0VcXCksIFxccmVnXFwsICBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBkaWZmQ3V0b2ZmKVxuY3JlYXRlX2Rpc3RfYmFycGxvdF9vZShkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCBcXF9sb2dPRVxcKSwgXFxyZWdfMW1iXFwsICBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBkaWZmQ3V0b2ZmLCAxZTYpXG5jcmVhdGVfZGlzdF9iYXJwbG90X29lKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsIFxcX2xvZ09FXFwpLCBcXHN0clxcLCAgYyhcXFMtU1xcLCBcXFMtWFxcKSwgZGlmZkN1dG9mZilcbmNyZWF0ZV9kaXN0X2JhcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgXFxfbG9nT0VcXCksIFxcc3RyXzFtYlxcLCAgYyhcXFMtU1xcLCBcXFMtWFxcKSwgZGlmZkN1dG9mZiwgMWU2KVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
# Import annotation
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue = -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\)) %>%
  dplyr::mutate(log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

diffCutoff <- 0.5
create_loop_scatterplot_oe(data, figDir, paste0(name, \_logOE_\, \all\), unique(data$Anno2), diffCutoff)
create_loop_scatterplot_oe(data, figDir, paste0(name, \_logOE_\, \reg\), c(\P-P\, \P-E\, \E-E\), diffCutoff)
create_loop_scatterplot_oe(data, figDir, paste0(name, \_logOE_\, \str\), c(\S-S\, \S-X\), diffCutoff)



create_dist_barplot_oe(data, figDir, paste0(name, \_logOE\), \all\,  unique(data$Anno2), diffCutoff)
create_dist_barplot_oe(data, figDir, paste0(name, \_logOE\), \reg\,  c(\P-P\, \P-E\, \E-E\), diffCutoff)
create_dist_barplot_oe(data, figDir, paste0(name, \_logOE\), \reg_1mb\,  c(\P-P\, \P-E\, \E-E\), diffCutoff, 1e6)
create_dist_barplot_oe(data, figDir, paste0(name, \_logOE\), \str\,  c(\S-S\, \S-X\), diffCutoff)
create_dist_barplot_oe(data, figDir, paste0(name, \_logOE\), \str_1mb\,  c(\S-S\, \S-X\), diffCutoff, 1e6)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### A485

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJKYlhCdmNuUWdZVzV1YjNSaGRHbHZibHh1Ym1GdFpTQThMU0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxjSWx4dVpHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRzVoYldVc0lGd2lMblJ6ZGx3aUtTa3BYRzVjYmlNZ1NXMXdiM0owSUc5aWN5OWxlSEFnYzJOdmNtVnpJR0Z1WkNCdFpYSm5aU0IwYnlCMGFHVWdaR0YwWVhObGRGeHViV2x1Vm1Gc2RXVWdQU0F0TkZ4dWIySnpaWGh3SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvWENKc2IyOXdVMk52Y21WZlkyOXVjMTl2WW5ObGVIQXVkSE4yWENJcEtTa2dKVDRsWEc0Z0lDQWdaSEJzZVhJNk9tMTFkR0YwWlNoc2IyZGZiMkp6Wlhod1gwUk5VMDhnUFNCcFpsOWxiSE5sS0c5aWMyVjRjRjlFVFZOUElEMDlJREFzSUcxcGJsWmhiSFZsTENCc2IyY3lLRzlpYzJWNGNGOUVUVk5QS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMlJVUVVjZ1BTQnBabDlsYkhObEtHOWljMlY0Y0Y5a1ZFRkhJRDA5SURBc0lHMXBibFpoYkhWbExDQnNiMmN5S0c5aWMyVjRjRjlrVkVGSEtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDBFME9EVWdQU0JwWmw5bGJITmxLRzlpYzJWNGNGOUJORGcxSUQwOUlEQXNJRzFwYmxaaGJIVmxMQ0JzYjJjeUtHOWljMlY0Y0Y5Qk5EZzFLU2twWEc1Y2JpTWdUV1Z5WjJVZ1pHRjBZWE5sZEZ4dVpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YkdWbWRGOXFiMmx1S0c5aWMyVjRjQ3dnWW5rZ1BTQmpLRndpYVdSY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0d4dloxOXZZbk5sZUhCZlpHbG1abDlrVkVGSFgwUk5VMDhnUFNCc2IyZGZiMkp6Wlhod1gyUlVRVWNnTFNCc2IyZGZiMkp6Wlhod1gwUk5VMDhzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5a2FXWm1YMEUwT0RWZlJFMVRUeUE5SUd4dloxOXZZbk5sZUhCZlFUUTROU0F0SUd4dloxOXZZbk5sZUhCZlJFMVRUeWxjYm1ScFptWkRkWFJ2Wm1ZZ1BDMGdNQzQxWEc1dFlXdGxYMlJwWm1aZlltVmtjR1ZmYjJVb1pHRjBZU3dnY0dGemRHVXdLRzVoYldVc0lGd2lYMnh2WjA5Rlgxd2lMQ0JjSW1Gc2JGd2lLU3dnZFc1cGNYVmxLR1JoZEdFa1FXNXVieklwTENCamIyNXpaVzV6ZFhORWFYSXNJR1JwWm1aRGRYUnZabVlwWEc1dFlXdGxYMlJwWm1aZlltVmtjR1ZmYjJVb1pHRjBZU3dnY0dGemRHVXdLRzVoYldVc0lGd2lYMnh2WjA5Rlgxd2lMQ0JjSW5CbExYQmxYQ0lwTENCaktGd2lVQzFRWENJc0lGd2lVQzFGWENJc0lGd2lSUzFGWENJcExDQmpiMjV6Wlc1emRYTkVhWElzSUdScFptWkRkWFJ2Wm1ZcFhHNXRZV3RsWDJScFptWmZZbVZrY0dWZmIyVW9aR0YwWVN3Z2NHRnpkR1V3S0c1aGJXVXNJRndpWDJ4dlowOUZYMXdpTENCY0luTjBjbHdpS1N3Z1l5aGNJbE10VTF3aUxDQmNJbE10V0Z3aUtTd2dZMjl1YzJWdWMzVnpSR2x5TENCa2FXWm1RM1YwYjJabUtWeHVYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbiMgSW1wb3J0IGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuXG4jIEltcG9ydCBvYnMvZXhwIHNjb3JlcyBhbmQgbWVyZ2UgdG8gdGhlIGRhdGFzZXRcbm1pblZhbHVlID0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuXG4jIE1lcmdlIGRhdGFzZXRcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pXG5kaWZmQ3V0b2ZmIDwtIDAuNVxubWFrZV9kaWZmX2JlZHBlX29lKGRhdGEsIHBhc3RlMChuYW1lLCBcXF9sb2dPRV9cXCwgXFxhbGxcXCksIHVuaXF1ZShkYXRhJEFubm8yKSwgY29uc2Vuc3VzRGlyLCBkaWZmQ3V0b2ZmKVxubWFrZV9kaWZmX2JlZHBlX29lKGRhdGEsIHBhc3RlMChuYW1lLCBcXF9sb2dPRV9cXCwgXFxwZS1wZVxcKSwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSwgY29uc2Vuc3VzRGlyLCBkaWZmQ3V0b2ZmKVxubWFrZV9kaWZmX2JlZHBlX29lKGRhdGEsIHBhc3RlMChuYW1lLCBcXF9sb2dPRV9cXCwgXFxzdHJcXCksIGMoXFxTLVNcXCwgXFxTLVhcXCksIGNvbnNlbnN1c0RpciwgZGlmZkN1dG9mZilcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# Import annotation
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue = -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\)) %>%
  dplyr::mutate(log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)
diffCutoff <- 0.5
make_diff_bedpe_oe(data, paste0(name, \_logOE_\, \all\), unique(data$Anno2), consensusDir, diffCutoff)
make_diff_bedpe_oe(data, paste0(name, \_logOE_\, \pe-pe\), c(\P-P\, \P-E\, \E-E\), consensusDir, diffCutoff)
make_diff_bedpe_oe(data, paste0(name, \_logOE_\, \str\), c(\S-S\, \S-X\), consensusDir, diffCutoff)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkpiWEJ2Y25RZ1lXNXViM1JoZEdsdmJseHVibUZ0WlNBOExTQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNYRnh1WkdGMFlTQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y0xuUnpkbHhjS1NrcFhHNWNiaU1nU1cxd2IzSjBJRzlpY3k5bGVIQWdjMk52Y21WeklHRnVaQ0J0WlhKblpTQjBieUIwYUdVZ1pHRjBZWE5sZEZ4dWJXbHVWbUZzZFdVZ1BTQXRORnh1YjJKelpYaHdJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9YRnhzYjI5d1UyTnZjbVZmWTI5dWMxOXZZbk5sZUhBdWRITjJYRndwS1NrZ0pUNGxYRzRnSUNBZ1pIQnNlWEk2T20xMWRHRjBaU2hzYjJkZmIySnpaWGh3WDBSTlUwOGdQU0JwWmw5bGJITmxLRzlpYzJWNGNGOUVUVk5QSUQwOUlEQXNJRzFwYmxaaGJIVmxMQ0JzYjJjeUtHOWljMlY0Y0Y5RVRWTlBLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyZGZiMkp6Wlhod1gyUlVRVWNnUFNCcFpsOWxiSE5sS0c5aWMyVjRjRjlrVkVGSElEMDlJREFzSUcxcGJsWmhiSFZsTENCc2IyY3lLRzlpYzJWNGNGOWtWRUZIS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMEUwT0RVZ1BTQnBabDlsYkhObEtHOWljMlY0Y0Y5Qk5EZzFJRDA5SURBc0lHMXBibFpoYkhWbExDQnNiMmN5S0c5aWMyVjRjRjlCTkRnMUtTa3BYRzVjYmlNZ1RXVnlaMlVnWkdGMFlYTmxkRnh1WkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZiR1ZtZEY5cWIybHVLRzlpYzJWNGNDd2dZbmtnUFNCaktGeGNhV1JjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOGdQU0JzYjJkZmIySnpaWGh3WDJSVVFVY2dMU0JzYjJkZmIySnpaWGh3WDBSTlUwOHNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrYVdabVgwRTBPRFZmUkUxVFR5QTlJR3h2WjE5dlluTmxlSEJmUVRRNE5TQXRJR3h2WjE5dlluTmxlSEJmUkUxVFR5bGNibVJwWm1aRGRYUnZabVlnUEMwZ01DNDFYRzV0WVd0bFgyUnBabVpmWW1Wa2NHVmZiMlVvWkdGMFlTd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gyeHZaMDlGWDF4Y0xDQmNYR0ZzYkZ4Y0tTd2dkVzVwY1hWbEtHUmhkR0VrUVc1dWJ6SXBMQ0JqYjI1elpXNXpkWE5FYVhJc0lHUnBabVpEZFhSdlptWXBYRzV0WVd0bFgyUnBabVpmWW1Wa2NHVmZiMlVvWkdGMFlTd2djR0Z6ZEdVd0tHNWhiV1VzSUZ4Y1gyeHZaMDlGWDF4Y0xDQmNYSEJsTFhCbFhGd3BMQ0JqS0Z4Y1VDMVFYRndzSUZ4Y1VDMUZYRndzSUZ4Y1JTMUZYRndwTENCamIyNXpaVzV6ZFhORWFYSXNJR1JwWm1aRGRYUnZabVlwWEc1dFlXdGxYMlJwWm1aZlltVmtjR1ZmYjJVb1pHRjBZU3dnY0dGemRHVXdLRzVoYldVc0lGeGNYMnh2WjA5RlgxeGNMQ0JjWEhOMGNseGNLU3dnWXloY1hGTXRVMXhjTENCY1hGTXRXRnhjS1N3Z1kyOXVjMlZ1YzNWelJHbHlMQ0JrYVdabVEzVjBiMlptS1Z4dVhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbiMgSW1wb3J0IGFubm90YXRpb25cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXC50c3ZcXCkpKVxuXG4jIEltcG9ydCBvYnMvZXhwIHNjb3JlcyBhbmQgbWVyZ2UgdG8gdGhlIGRhdGFzZXRcbm1pblZhbHVlID0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKVxuXG4jIE1lcmdlIGRhdGFzZXRcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pXG5kaWZmQ3V0b2ZmIDwtIDAuNVxubWFrZV9kaWZmX2JlZHBlX29lKGRhdGEsIHBhc3RlMChuYW1lLCBcXF9sb2dPRV9cXCwgXFxhbGxcXCksIHVuaXF1ZShkYXRhJEFubm8yKSwgY29uc2Vuc3VzRGlyLCBkaWZmQ3V0b2ZmKVxubWFrZV9kaWZmX2JlZHBlX29lKGRhdGEsIHBhc3RlMChuYW1lLCBcXF9sb2dPRV9cXCwgXFxwZS1wZVxcKSwgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSwgY29uc2Vuc3VzRGlyLCBkaWZmQ3V0b2ZmKVxubWFrZV9kaWZmX2JlZHBlX29lKGRhdGEsIHBhc3RlMChuYW1lLCBcXF9sb2dPRV9cXCwgXFxzdHJcXCksIGMoXFxTLVNcXCwgXFxTLVhcXCksIGNvbnNlbnN1c0RpciwgZGlmZkN1dG9mZilcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBJbXBvcnQgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcLnRzdlxcKSkpXG5cbiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldFxubWluVmFsdWUgPSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gICAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSkpXG5cbiMgTWVyZ2UgZGF0YXNldFxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTylcbmRpZmZDdXRvZmYgPC0gMC41XG5tYWtlX2RpZmZfYmVkcGVfb2UoZGF0YSwgcGFzdGUwKG5hbWUsIFxcX2xvZ09FX1xcLCBcXGFsbFxcKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjb25zZW5zdXNEaXIsIGRpZmZDdXRvZmYpXG5tYWtlX2RpZmZfYmVkcGVfb2UoZGF0YSwgcGFzdGUwKG5hbWUsIFxcX2xvZ09FX1xcLCBcXHBlLXBlXFwpLCBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcRS1FXFwpLCBjb25zZW5zdXNEaXIsIGRpZmZDdXRvZmYpXG5tYWtlX2RpZmZfYmVkcGVfb2UoZGF0YSwgcGFzdGUwKG5hbWUsIFxcX2xvZ09FX1xcLCBcXHN0clxcKSwgYyhcXFMtU1xcLCBcXFMtWFxcKSwgY29uc2Vuc3VzRGlyLCBkaWZmQ3V0b2ZmKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
# Import annotation
name <- \chromo_cons_annoHierarchy\
data <- fread(here(consensusDir, paste0(name, \.tsv\)))

# Import obs/exp scores and merge to the dataset
minValue = -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
    dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                  log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                  log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)))

# Merge dataset
data <- data %>% dplyr::left_join(obsexp, by = c(\id\)) %>%
  dplyr::mutate(log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)
diffCutoff <- 0.5
make_diff_bedpe_oe(data, paste0(name, \_logOE_\, \all\), unique(data$Anno2), consensusDir, diffCutoff)
make_diff_bedpe_oe(data, paste0(name, \_logOE_\, \pe-pe\), c(\P-P\, \P-E\, \E-E\), consensusDir, diffCutoff)
make_diff_bedpe_oe(data, paste0(name, \_logOE_\, \str\), c(\S-S\, \S-X\), consensusDir, diffCutoff)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Get size distribution of differential loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhDSXBLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNaTUwYzNaY0lpa3BKR2RsYm1WY2JseHVabXhoYm10VGFYcGxJRHd0SURGY2JtZGxibVV1ZEdJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpYlcweE1GOUhVa050TXpndWNEWmZaMlZ1WlY5emIzSjBaV1F1WW1Wa1hDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoVVUxTWdQU0JwWm1Wc2MyVW9WalFnUFQwZ1hDSXJYQ0lzSUZZeUxDQldNeWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnVkZOVGMzUmhjblFnUFNCVVUxTWdMU0JtYkdGdWExTnBlbVVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnVkZOVFpXNWtJRDBnVkZOVElDc2dabXhoYm10VGFYcGxLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENoV01Td2dWRk5UYzNSaGNuUXNJRlJUVTJWdVpDd2dWallwWEc1amIyeHVZVzFsY3loblpXNWxMblJpS1NBOExTQmpLRndpWTJoeVhDSXNJRndpYzNSaGNuUmNJaXdnWENKbGJtUmNJaXdnWENKbGJuTmxiV0pzWENJcFhHNWNibUpsWkM0eElEd3RJR2RsYm1VdWRHSWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aVzV6WlcxaWJDQWxhVzRsSUdkeWIzVndNU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWXlneExDQXlMQ0F6S1NsY2JtSmxaQzR5SUR3dElHZGxibVV1ZEdJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd01pa2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWd4TENBeUxDQXpLU2xjYmx4dVpuZHlhWFJsS0dKbFpDNHhMQ0JvWlhKbEtISmxaa1JwY2l3Z1hDSlVVMU5mWW1sdVlYSjVSM0p2ZFhBeExtSmxaRndpS1N3Z2MyVndJRDBnWENKY1hIUmNJaXdnWTI5c0xtNWhiV1Z6SUQwZ1JrRk1VMFVwWEc1bWQzSnBkR1VvWW1Wa0xqSXNJR2hsY21Vb2NtVm1SR2x5TENCY0lsUlRVMTlpYVc1aGNubEhjbTkxY0RJdVltVmtYQ0lwTENCelpYQWdQU0JjSWx4Y2RGd2lMQ0JqYjJ3dWJtRnRaWE1nUFNCR1FVeFRSU2xjYmx4dVhHNWNibWRsYm1VdWRHSWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aWJXMHhNRjlIVWtOdE16Z3VjRFpmWjJWdVpWOXpiM0owWldRdVltVmtYQ0lwS1Z4dVhHNWlaV1F1TVNBOExTQm5aVzVsTG5SaUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtGWTJJQ1ZwYmlVZ1ozSnZkWEF4S1Z4dVltVmtMaklnUEMwZ1oyVnVaUzUwWWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loV05pQWxhVzRsSUdkeWIzVndNaWxjYmx4dVpuZHlhWFJsS0dKbFpDNHhMQ0JvWlhKbEtISmxaa1JwY2l3Z1hDSlVVMU5mWW1sdVlYSjVSM0p2ZFhBeFgyZDBaaTVpWldSY0lpa3NJSE5sY0NBOUlGd2lYRngwWENJc0lHTnZiQzV1WVcxbGN5QTlJRVpCVEZORktWeHVabmR5YVhSbEtHSmxaQzR5TENCb1pYSmxLSEpsWmtScGNpd2dYQ0pVVTFOZlltbHVZWEo1UjNKdmRYQXlYMmQwWmk1aVpXUmNJaWtzSUhObGNDQTlJRndpWEZ4MFhDSXNJR052YkM1dVlXMWxjeUE5SUVaQlRGTkZLVnh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5mbGFua1NpemUgPC0gMVxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSxcbiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kLCBWNilcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGVuc2VtYmxcXClcblxuYmVkLjEgPC0gZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgZ3JvdXAxKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuYmVkLjIgPC0gZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgZ3JvdXAyKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuXG5md3JpdGUoYmVkLjEsIGhlcmUocmVmRGlyLCBcXFRTU19iaW5hcnlHcm91cDEuYmVkXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbmZ3cml0ZShiZWQuMiwgaGVyZShyZWZEaXIsIFxcVFNTX2JpbmFyeUdyb3VwMi5iZWRcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuXG5cblxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpXG5cbmJlZC4xIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDEpXG5iZWQuMiA8LSBnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKFY2ICVpbiUgZ3JvdXAyKVxuXG5md3JpdGUoYmVkLjEsIGhlcmUocmVmRGlyLCBcXFRTU19iaW5hcnlHcm91cDFfZ3RmLmJlZFxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5md3JpdGUoYmVkLjIsIGhlcmUocmVmRGlyLCBcXFRTU19iaW5hcnlHcm91cDJfZ3RmLmJlZFxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

flankSize <- 1
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6)
colnames(gene.tb) <- c(\chr\, \start\, \end\, \ensembl\)

bed.1 <- gene.tb %>% dplyr::filter(ensembl %in% group1) %>% dplyr::select(c(1, 2, 3))
bed.2 <- gene.tb %>% dplyr::filter(ensembl %in% group2) %>% dplyr::select(c(1, 2, 3))

fwrite(bed.1, here(refDir, \TSS_binaryGroup1.bed\), sep = \\t\, col.names = FALSE)
fwrite(bed.2, here(refDir, \TSS_binaryGroup2.bed\), sep = \\t\, col.names = FALSE)



gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\))

bed.1 <- gene.tb %>% dplyr::filter(V6 %in% group1)
bed.2 <- gene.tb %>% dplyr::filter(V6 %in% group2)

fwrite(bed.1, here(refDir, \TSS_binaryGroup1_gtf.bed\), sep = \\t\, col.names = FALSE)
fwrite(bed.2, here(refDir, \TSS_binaryGroup2_gtf.bed\), sep = \\t\, col.names = FALSE)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNERXVkSE4yWEZ3cEtTUm5aVzVsWEc1bmNtOTFjRElnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJKcGJtRnllVWR5YjNWd01pNTBjM1pjWENrcEpHZGxibVZjYmx4dVpteGhibXRUYVhwbElEd3RJREZjYm1kbGJtVXVkR0lnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNiVzB4TUY5SFVrTnRNemd1Y0RaZloyVnVaVjl6YjNKMFpXUXVZbVZrWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hVVTFNZ1BTQnBabVZzYzJVb1ZqUWdQVDBnWEZ3clhGd3NJRll5TENCV015a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdWRk5UYzNSaGNuUWdQU0JVVTFNZ0xTQm1iR0Z1YTFOcGVtVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdWRk5UWlc1a0lEMGdWRk5USUNzZ1pteGhibXRUYVhwbEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hXTVN3Z1ZGTlRjM1JoY25Rc0lGUlRVMlZ1WkN3Z1ZqWXBYRzVqYjJ4dVlXMWxjeWhuWlc1bExuUmlLU0E4TFNCaktGeGNZMmh5WEZ3c0lGeGNjM1JoY25SY1hDd2dYRnhsYm1SY1hDd2dYRnhsYm5ObGJXSnNYRndwWEc1Y2JtSmxaQzR4SUR3dElHZGxibVV1ZEdJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd01Ta2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWd4TENBeUxDQXpLU2xjYm1KbFpDNHlJRHd0SUdkbGJtVXVkR0lnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWlc1elpXMWliQ0FsYVc0bElHZHliM1Z3TWlrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1l5Z3hMQ0F5TENBektTbGNibHh1Wm5keWFYUmxLR0psWkM0eExDQm9aWEpsS0hKbFprUnBjaXdnWEZ4VVUxTmZZbWx1WVhKNVIzSnZkWEF4TG1KbFpGeGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDd2dZMjlzTG01aGJXVnpJRDBnUmtGTVUwVXBYRzVtZDNKcGRHVW9ZbVZrTGpJc0lHaGxjbVVvY21WbVJHbHlMQ0JjWEZSVFUxOWlhVzVoY25sSGNtOTFjREl1WW1Wa1hGd3BMQ0J6WlhBZ1BTQmNYRnhjZEZ4Y0xDQmpiMnd1Ym1GdFpYTWdQU0JHUVV4VFJTbGNibHh1WEc1Y2JtZGxibVV1ZEdJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjYlcweE1GOUhVa050TXpndWNEWmZaMlZ1WlY5emIzSjBaV1F1WW1Wa1hGd3BLVnh1WEc1aVpXUXVNU0E4TFNCblpXNWxMblJpSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0ZZMklDVnBiaVVnWjNKdmRYQXhLVnh1WW1Wa0xqSWdQQzBnWjJWdVpTNTBZaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhXTmlBbGFXNGxJR2R5YjNWd01pbGNibHh1Wm5keWFYUmxLR0psWkM0eExDQm9aWEpsS0hKbFprUnBjaXdnWEZ4VVUxTmZZbWx1WVhKNVIzSnZkWEF4WDJkMFppNWlaV1JjWENrc0lITmxjQ0E5SUZ4Y1hGeDBYRndzSUdOdmJDNXVZVzFsY3lBOUlFWkJURk5GS1Z4dVpuZHlhWFJsS0dKbFpDNHlMQ0JvWlhKbEtISmxaa1JwY2l3Z1hGeFVVMU5mWW1sdVlYSjVSM0p2ZFhBeVgyZDBaaTVpWldSY1hDa3NJSE5sY0NBOUlGeGNYRngwWEZ3c0lHTnZiQzV1WVcxbGN5QTlJRVpCVEZORktWeHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5mbGFua1NpemUgPC0gMVxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSxcbiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kLCBWNilcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGVuc2VtYmxcXClcblxuYmVkLjEgPC0gZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgZ3JvdXAxKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuYmVkLjIgPC0gZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgZ3JvdXAyKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuXG5md3JpdGUoYmVkLjEsIGhlcmUocmVmRGlyLCBcXFRTU19iaW5hcnlHcm91cDEuYmVkXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbmZ3cml0ZShiZWQuMiwgaGVyZShyZWZEaXIsIFxcVFNTX2JpbmFyeUdyb3VwMi5iZWRcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuXG5cblxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpXG5cbmJlZC4xIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDEpXG5iZWQuMiA8LSBnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKFY2ICVpbiUgZ3JvdXAyKVxuXG5md3JpdGUoYmVkLjEsIGhlcmUocmVmRGlyLCBcXFRTU19iaW5hcnlHcm91cDFfZ3RmLmJlZFxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5md3JpdGUoYmVkLjIsIGhlcmUocmVmRGlyLCBcXFRTU19iaW5hcnlHcm91cDJfZ3RmLmJlZFxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuZmxhbmtTaXplIDwtIDFcbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMyksXG4gICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsXG4gICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCwgVjYpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxlbnNlbWJsXFwpXG5cbmJlZC4xIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdyb3VwMSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbmJlZC4yIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdyb3VwMikgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcblxuZndyaXRlKGJlZC4xLCBoZXJlKHJlZkRpciwgXFxUU1NfYmluYXJ5R3JvdXAxLmJlZFxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5md3JpdGUoYmVkLjIsIGhlcmUocmVmRGlyLCBcXFRTU19iaW5hcnlHcm91cDIuYmVkXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcblxuXG5cbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKVxuXG5iZWQuMSA8LSBnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKFY2ICVpbiUgZ3JvdXAxKVxuYmVkLjIgPC0gZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihWNiAlaW4lIGdyb3VwMilcblxuZndyaXRlKGJlZC4xLCBoZXJlKHJlZkRpciwgXFxUU1NfYmluYXJ5R3JvdXAxX2d0Zi5iZWRcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuZndyaXRlKGJlZC4yLCBoZXJlKHJlZkRpciwgXFxUU1NfYmluYXJ5R3JvdXAyX2d0Zi5iZWRcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

flankSize <- 1
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6)
colnames(gene.tb) <- c(\chr\, \start\, \end\, \ensembl\)

bed.1 <- gene.tb %>% dplyr::filter(ensembl %in% group1) %>% dplyr::select(c(1, 2, 3))
bed.2 <- gene.tb %>% dplyr::filter(ensembl %in% group2) %>% dplyr::select(c(1, 2, 3))

fwrite(bed.1, here(refDir, \TSS_binaryGroup1.bed\), sep = \\t\, col.names = FALSE)
fwrite(bed.2, here(refDir, \TSS_binaryGroup2.bed\), sep = \\t\, col.names = FALSE)



gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\))

bed.1 <- gene.tb %>% dplyr::filter(V6 %in% group1)
bed.2 <- gene.tb %>% dplyr::filter(V6 %in% group2)

fwrite(bed.1, here(refDir, \TSS_binaryGroup1_gtf.bed\), sep = \\t\, col.names = FALSE)
fwrite(bed.2, here(refDir, \TSS_binaryGroup2_gtf.bed\), sep = \\t\, col.names = FALSE)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Splitting loops into diff bedpe

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhDSXBLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNaTUwYzNaY0lpa3BKR2RsYm1WY2JseHVaR0YwWVNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0p5WldGa1EyOTFiblF1Wm1sc2RHVnlaV1F1VkZCTkxtRnNiQzUwYzNaY0lpa3BJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNCbmNtOTFjQ0E5SUdOaGMyVmZkMmhsYmlobGJuTmxiV0pzSUNWcGJpVWdaM0p2ZFhBeElINGdYQ0puY205MWNERmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd01pQitJRndpWjNKdmRYQXlYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlNWVVVnZmlCT1FTbGNiaWtnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb0lXbHpMbTVoS0dkeWIzVndLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1l5Z3pOQ3dnTVN3Z015d2dOQ3dnTlN3Z01UUXNJREUxTENBek5Da3BYRzVjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVVnYlhWMFlYUmxLR0YyWlhKaFoyVWdQU0J5YjNkTlpXRnVjeWhoWTNKdmMzTW9ZMjlzYm1GdFpYTW9aR0YwWVNsYk16bzNYU2twS1Z4dVhHNTBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJR0YyWlhKaFoyVXBYRzVjYmx4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNU2tnS1NSaGRtVnlZV2RsWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TWlrZ0tTUmhkbVZ5WVdkbFhHNGdJSGRwYkNBOExTQjNhV3hqYjNndWRHVnpkQ2hrYVhOMFlXNWpaVEVzSUdScGMzUmhibU5sTWlsY2JpQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1ZlZ4dVhHNXdkbUZzSUR3dElHTnZiblpRZG1Gc2RXVW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjSW1keWIzVndNVndpTENCY0ltZHliM1Z3TWx3aUtTbGNibHh1WjJkd2JHOTBLSFJsYlhBc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQmhkbVZ5WVdkbEtTa2dLeUJuWlc5dFgySnZlSEJzYjNRb0tTQXJJSE5qWVd4bFgzbGZiRzluTVRBb0tTQXJYRzRnSUhsc1lXSW9YQ0poZG1kVVVFMWNJaWtnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SURFc0lIa2dQU0F4TURBd01Dd2diR0ZpWld3Z1BTQndkbUZzS1Z4dVhHNWNibHh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5kYXRhIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXHJlYWRDb3VudC5maWx0ZXJlZC5UUE0uYWxsLnRzdlxcKSkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gY2FzZV93aGVuKGVuc2VtYmwgJWluJSBncm91cDEgfiBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICAgICBlbnNlbWJsICVpbiUgZ3JvdXAyIH4gXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKVxuKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKSAlPiVcbiAgZHBseXI6OnNlbGVjdChjKDM0LCAxLCAzLCA0LCA1LCAxNCwgMTUsIDM0KSlcblxuZGF0YSA8LSBkYXRhICU+JSBtdXRhdGUoYXZlcmFnZSA9IHJvd01lYW5zKGFjcm9zcyhjb2xuYW1lcyhkYXRhKVszOjddKSkpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYXZlcmFnZSlcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGF2ZXJhZ2VcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGF2ZXJhZ2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnB2YWwgPC0gY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpKVxuXG5nZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IGF2ZXJhZ2UpKSArIGdlb21fYm94cGxvdCgpICsgc2NhbGVfeV9sb2cxMCgpICtcbiAgeWxhYihcXGF2Z1RQTVxcKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDEwMDAwLCBsYWJlbCA9IHB2YWwpXG5cblxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

data <- fread(here(refDir, \readCount.filtered.TPM.all.tsv\)) %>% dplyr::mutate(
  group = case_when(ensembl %in% group1 ~ \group1\,
                    ensembl %in% group2 ~ \group2\,
                    TRUE ~ NA)
) %>%
  dplyr::filter(!is.na(group)) %>%
  dplyr::select(c(34, 1, 3, 4, 5, 14, 15, 34))

data <- data %>% mutate(average = rowMeans(across(colnames(data)[3:7])))

temp <- data %>% dplyr::select(group, average)


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$average
  distance2 <- (data %>% dplyr::filter(group ==group2) )$average
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

pval <- convPvalue(getPvalWilcox(temp, \group1\, \group2\))

ggplot(temp, aes(x = group, y = average)) + geom_boxplot() + scale_y_log10() +
  ylab(\avgTPM\) + theme_classic() +
  annotate(\text\, x = 1, y = 10000, label = pval)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNERXVkSE4yWEZ3cEtTUm5aVzVsWEc1bmNtOTFjRElnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJKcGJtRnllVWR5YjNWd01pNTBjM1pjWENrcEpHZGxibVZjYmx4dVpHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeHlaV0ZrUTI5MWJuUXVabWxzZEdWeVpXUXVWRkJOTG1Gc2JDNTBjM1pjWENrcElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0JuY205MWNDQTlJR05oYzJWZmQyaGxiaWhsYm5ObGJXSnNJQ1ZwYmlVZ1ozSnZkWEF4SUg0Z1hGeG5jbTkxY0RGY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWlc1elpXMWliQ0FsYVc0bElHZHliM1Z3TWlCK0lGeGNaM0p2ZFhBeVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSU1ZVVWdmaUJPUVNsY2Jpa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvSVdsekxtNWhLR2R5YjNWd0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWXlnek5Dd2dNU3dnTXl3Z05Dd2dOU3dnTVRRc0lERTFMQ0F6TkNrcFhHNWNibVJoZEdFZ1BDMGdaR0YwWVNBbFBpVWdiWFYwWVhSbEtHRjJaWEpoWjJVZ1BTQnliM2ROWldGdWN5aGhZM0p2YzNNb1kyOXNibUZ0WlhNb1pHRjBZU2xiTXpvM1hTa3BLVnh1WEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHRjJaWEpoWjJVcFhHNWNibHh1WjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGdJR1JwYzNSaGJtTmxNU0E4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQV2R5YjNWd01Ta2dLU1JoZG1WeVlXZGxYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNaWtnS1NSaGRtVnlZV2RsWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WEc1d2RtRnNJRHd0SUdOdmJuWlFkbUZzZFdVb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNYR2R5YjNWd01WeGNMQ0JjWEdkeWIzVndNbHhjS1NsY2JseHVaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCaGRtVnlZV2RsS1NrZ0t5Qm5aVzl0WDJKdmVIQnNiM1FvS1NBcklITmpZV3hsWDNsZmJHOW5NVEFvS1NBclhHNGdJSGxzWVdJb1hGeGhkbWRVVUUxY1hDa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJREVzSUhrZ1BTQXhNREF3TUN3Z2JHRmlaV3dnUFNCd2RtRnNLVnh1WEc1Y2JseHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5kYXRhIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXHJlYWRDb3VudC5maWx0ZXJlZC5UUE0uYWxsLnRzdlxcKSkgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGdyb3VwID0gY2FzZV93aGVuKGVuc2VtYmwgJWluJSBncm91cDEgfiBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICAgICBlbnNlbWJsICVpbiUgZ3JvdXAyIH4gXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKVxuKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKSAlPiVcbiAgZHBseXI6OnNlbGVjdChjKDM0LCAxLCAzLCA0LCA1LCAxNCwgMTUsIDM0KSlcblxuZGF0YSA8LSBkYXRhICU+JSBtdXRhdGUoYXZlcmFnZSA9IHJvd01lYW5zKGFjcm9zcyhjb2xuYW1lcyhkYXRhKVszOjddKSkpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYXZlcmFnZSlcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGF2ZXJhZ2VcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGF2ZXJhZ2VcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnB2YWwgPC0gY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpKVxuXG5nZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IGF2ZXJhZ2UpKSArIGdlb21fYm94cGxvdCgpICsgc2NhbGVfeV9sb2cxMCgpICtcbiAgeWxhYihcXGF2Z1RQTVxcKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDEwMDAwLCBsYWJlbCA9IHB2YWwpXG5cblxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuZGF0YSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxyZWFkQ291bnQuZmlsdGVyZWQuVFBNLmFsbC50c3ZcXCkpICU+JSBkcGx5cjo6bXV0YXRlKFxuICBncm91cCA9IGNhc2Vfd2hlbihlbnNlbWJsICVpbiUgZ3JvdXAxIH4gXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwMiB+IFxcZ3JvdXAyXFwsXG4gICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSlcbikgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoYygzNCwgMSwgMywgNCwgNSwgMTQsIDE1LCAzNCkpXG5cbmRhdGEgPC0gZGF0YSAlPiUgbXV0YXRlKGF2ZXJhZ2UgPSByb3dNZWFucyhhY3Jvc3MoY29sbmFtZXMoZGF0YSlbMzo3XSkpKVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGF2ZXJhZ2UpXG5cblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRhdmVyYWdlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRhdmVyYWdlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5wdmFsIDwtIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSlcblxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBhdmVyYWdlKSkgKyBnZW9tX2JveHBsb3QoKSArIHNjYWxlX3lfbG9nMTAoKSArXG4gIHlsYWIoXFxhdmdUUE1cXCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAxMDAwMCwgbGFiZWwgPSBwdmFsKVxuXG5cblxuXG5gYGBcbmBgYCJ9 -->

```r
```r
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

data <- fread(here(refDir, \readCount.filtered.TPM.all.tsv\)) %>% dplyr::mutate(
  group = case_when(ensembl %in% group1 ~ \group1\,
                    ensembl %in% group2 ~ \group2\,
                    TRUE ~ NA)
) %>%
  dplyr::filter(!is.na(group)) %>%
  dplyr::select(c(34, 1, 3, 4, 5, 14, 15, 34))

data <- data %>% mutate(average = rowMeans(across(colnames(data)[3:7])))

temp <- data %>% dplyr::select(group, average)


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$average
  distance2 <- (data %>% dplyr::filter(group ==group2) )$average
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

pval <- convPvalue(getPvalWilcox(temp, \group1\, \group2\))

ggplot(temp, aes(x = group, y = average)) + geom_boxplot() + scale_y_log10() +
  ylab(\avgTPM\) + theme_classic() +
  annotate(\text\, x = 1, y = 10000, label = pval)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [2.27] Extracting TSS for deeptools

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhDSXBLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNaTUwYzNaY0lpa3BKR2RsYm1WY2JseHVabXhoYm10VGFYcGxJRHd0SURGY2JtZGxibVV1ZEdJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpYlcweE1GOUhVa050TXpndWNEWmZaMlZ1WlY5emIzSjBaV1F1WW1Wa1hDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoVVUxTWdQU0JwWm1Wc2MyVW9WalFnUFQwZ1hDSXJYQ0lzSUZZeUxDQldNeWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnVkZOVGMzUmhjblFnUFNCVVUxTWdMU0JtYkdGdWExTnBlbVVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnVkZOVFpXNWtJRDBnVkZOVElDc2dabXhoYm10VGFYcGxLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENoV01Td2dWRk5UYzNSaGNuUXNJRlJUVTJWdVpDd2dWallwWEc1amIyeHVZVzFsY3loblpXNWxMblJpS1NBOExTQmpLRndpWTJoeVhDSXNJRndpYzNSaGNuUmNJaXdnWENKbGJtUmNJaXdnWENKbGJuTmxiV0pzWENJcFhHNWNibUpsWkM0eElEd3RJR2RsYm1VdWRHSWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aVzV6WlcxaWJDQWxhVzRsSUdkeWIzVndNU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWXlneExDQXlMQ0F6S1NsY2JtSmxaQzR5SUR3dElHZGxibVV1ZEdJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd01pa2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWd4TENBeUxDQXpLU2xjYmx4dVhHNWtZWFJoSUR3dElHWnlaV0ZrS0dobGNtVW9YQ0l1TGk4dUxsd2lMQ0JjSW5KbGMzVnNkRndpTENCY0luTjBjbWx3Wlc1dVhDSXNJRndpY21WemRXeDBYMlpwYkhSbGNtVmtMblJ6ZGx3aUtTbGNibHh1WjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ2QybGtkR2dwS1NBcklHZGxiMjFmYUdsemRHOW5jbUZ0S0NrZ0t5QjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJSE5qWVd4bFgzaGZZMjl1ZEdsdWRXOTFjeWhzWVdKbGJITWdQU0JzWVdKbGJGOXJZbDl0WWlsY2JseHVYRzRqSXlCRGFHVmphMmx1WnlCdmRtVnliR0Z3SUhkcGRHZ2daMlZ1WlNCVVUxTmNibHh1ZEhOeklEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW0xdE1UQmZSMUpEYlRNNExuQTJYMVJUVXpJdU5XdGlMbUpsWkZ3aUtTbGNibHh1ZEhOekxtZHliM1Z3TVNBOExTQjBjM01nSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvVmpZZ0pXbHVKU0JuY205MWNERXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLRll4TENCV01pd2dWak1wWEc1amIyeHVZVzFsY3loMGMzTXVaM0p2ZFhBeEtTQThMU0JqS0Z3aVkyaHlYQ0lzSUZ3aWMzUmhjblJjSWl3Z1hDSmxibVJjSWlsY2JuUnpjeTVuY205MWNERXVaM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0hSemN5NW5jbTkxY0RFcFhHNWNiblJ6Y3k1bmNtOTFjRElnUEMwZ2RITnpJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRlkySUNWcGJpVWdaM0p2ZFhBeUtTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaFdNU3dnVmpJc0lGWXpLVnh1WTI5c2JtRnRaWE1vZEhOekxtZHliM1Z3TWlrZ1BDMGdZeWhjSW1Ob2Nsd2lMQ0JjSW5OMFlYSjBYQ0lzSUZ3aVpXNWtYQ0lwWEc1MGMzTXVaM0p2ZFhBeUxtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2gwYzNNdVozSnZkWEF5S1Z4dVhHNGpJeUJCYm1Ob2IzSWdiMllnYzNSeWFYQmxjMXh1ZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHTm9jaXdnY0c5ek1Td2djRzl6TWlsY2JtTnZiRzVoYldWektIUmxiWEFwSUR3dElHTW9YQ0pqYUhKY0lpd2dYQ0p6ZEdGeWRGd2lMQ0JjSW1WdVpGd2lLVnh1WEc1emRISnBjR1ZCYm1Ob2IzSXVaM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0hSbGJYQXBYRzVjYm05MlpYSnNZWEF1WjNKdmRYQXhJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aDBjM011WjNKdmRYQXhMbWR5TENCemRISnBjR1ZCYm1Ob2IzSXVaM0lwWEc1dmRtVnliR0Z3TG1keWIzVndNaUE4TFNCbWFXNWtUM1psY214aGNITW9kSE56TG1keWIzVndNaTVuY2l3Z2MzUnlhWEJsUVc1amFHOXlMbWR5S1Z4dVhHNXNaVzVuZEdnb2RXNXBjWFZsS0hGMVpYSjVTR2wwY3lodmRtVnliR0Z3TG1keWIzVndNU2twS1Z4dWJHVnVaM1JvS0hWdWFYRjFaU2h4ZFdWeWVVaHBkSE1vYjNabGNteGhjQzVuY205MWNESXBLU2xjYmx4dVhHNGpJeUJpYjJSNUlHOW1JSE4wY21sd1pYTmNiblJsYlhBZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoamFISXNJSEJ2Y3pNc0lIQnZjelFwWEc1amIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNibHh1YzNSeWFYQmxRbTlrZVM1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9kR1Z0Y0NsY2JseHViM1psY214aGNDNW5jbTkxY0RFZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0hSemN5NW5jbTkxY0RFdVozSXNJSE4wY21sd1pVSnZaSGt1WjNJcFhHNXZkbVZ5YkdGd0xtZHliM1Z3TWlBOExTQm1hVzVrVDNabGNteGhjSE1vZEhOekxtZHliM1Z3TWk1bmNpd2djM1J5YVhCbFFtOWtlUzVuY2lsY2JseHViR1Z1WjNSb0tIVnVhWEYxWlNoeGRXVnllVWhwZEhNb2IzWmxjbXhoY0M1bmNtOTFjREVwS1NsY2JteGxibWQwYUNoMWJtbHhkV1VvY1hWbGNubElhWFJ6S0c5MlpYSnNZWEF1WjNKdmRYQXlLU2twWEc1Y2JpTWpJRU5vWldOcmFXNW5JRkpCUkRJeEwwTlVRMFlnY0hKbGMyVnVZMlVnWVhRZ1lXNWphRzl5WEc1dmRtVnliR0Z3TG1KdlpIa3VZM1JqWmlBOExTQm1hVzVrVDNabGNteGhjSE1vYzNSeWFYQmxRbTlrZVM1bmNpd2djR1ZoYXk1RFZFTkdLVnh1YjNabGNteGhjQzVpYjJSNUxuSmhaREl4SUR3dElHWnBibVJQZG1WeWJHRndjeWh6ZEhKcGNHVkNiMlI1TG1keUxDQndaV0ZyTGxKQlJESXhLVnh1YjNabGNteGhjQzVoYm1Ob2IzSXVZM1JqWmlBOExTQm1hVzVrVDNabGNteGhjSE1vYzNSeWFYQmxRVzVqYUc5eUxtZHlMQ0J3WldGckxrTlVRMFlwWEc1dmRtVnliR0Z3TG1GdVkyaHZjaTV5WVdReU1TQThMU0JtYVc1a1QzWmxjbXhoY0hNb2MzUnlhWEJsUVc1amFHOXlMbWR5TENCd1pXRnJMbEpCUkRJeEtWeHVYRzVzWlc1bmRHZ29kVzVwY1hWbEtIRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd0xtSnZaSGt1WTNSalppa3BLVnh1YkdWdVozUm9LSFZ1YVhGMVpTaHhkV1Z5ZVVocGRITW9iM1psY214aGNDNWliMlI1TG5KaFpESXhLU2twWEc1Y2JteGxibWQwYUNoMWJtbHhkV1VvY1hWbGNubElhWFJ6S0c5MlpYSnNZWEF1WVc1amFHOXlMbU4wWTJZcEtTbGNibXhsYm1kMGFDaDFibWx4ZFdVb2NYVmxjbmxJYVhSektHOTJaWEpzWVhBdVlXNWphRzl5TG5KaFpESXhLU2twWEc0Z0lGeHVJeU1nUTJobFkydHBibWNnYjNabGNteGhjQ0IzYVhSb0lHeHZiM0FnWVc1amFHOXlJQ2hRUlMxUVJTbGNibXh2YjNBdWRYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pWOWtWRUZIZG5ORVRWTlBYMVZRWDJScFptWXdMakl1WW1Wa2NHVmNJaWtwWEc1c2IyOXdMbTV2SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZmNHVXRjR1ZmWkZSQlIzWnpSRTFUVDE5T1QxOWthV1ptTUM0eUxtSmxaSEJsWENJcEtWeHVZVzVqYUc5eUxuVndibThnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWhpYVc1a1gzSnZkM01vYkc5dmNDNTFjQ3dnYkc5dmNDNXVieWtwWEc1Y2JteHZiM0F1Wkc5M2JpQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbFgyUlVRVWQyYzBSTlUwOWZSRTlYVGw5a2FXWm1NQzR5TG1KbFpIQmxYQ0lwS1Z4dVlXNWphRzl5TG1SdmQyNGdQQzBnWlhoMGNtRmpkRUZ1WTJodmNpaHNiMjl3TG1SdmQyNHBYRzVjYmx4dWIzWmxjbXhoY0M1aWIyUjVMblZ3Ym04Z1BDMGdabWx1WkU5MlpYSnNZWEJ6S0hOMGNtbHdaVUp2WkhrdVozSXNJR0Z1WTJodmNpNTFjRzV2S1Z4dWIzWmxjbXhoY0M1aWIyUjVMbVJ2ZDI0Z1BDMGdabWx1WkU5MlpYSnNZWEJ6S0hOMGNtbHdaVUp2WkhrdVozSXNJR0Z1WTJodmNpNWtiM2R1S1Z4dWIzWmxjbXhoY0M1aGJtTm9iM0l1ZFhCdWJ5QThMU0JtYVc1a1QzWmxjbXhoY0hNb2MzUnlhWEJsUVc1amFHOXlMbWR5TENCaGJtTm9iM0l1ZFhCdWJ5bGNibTkyWlhKc1lYQXVZVzVqYUc5eUxtUnZkMjRnUEMwZ1ptbHVaRTkyWlhKc1lYQnpLSE4wY21sd1pVRnVZMmh2Y2k1bmNpd2dZVzVqYUc5eUxtUnZkMjRwWEc1Y2JteGxibWQwYUNoMWJtbHhkV1VvYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0M1aWIyUjVMblZ3Ym04cEtTbGNibXhsYm1kMGFDaDFibWx4ZFdVb2MzVmlhbVZqZEVocGRITW9iM1psY214aGNDNWliMlI1TG1SdmQyNHBLU2xjYm14bGJtZDBhQ2gxYm1seGRXVW9jM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjQzVoYm1Ob2IzSXVkWEJ1YnlrcEtWeHViR1Z1WjNSb0tIVnVhWEYxWlNoemRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd0xtRnVZMmh2Y2k1a2IzZHVLU2twWEc1Y2JseHVJeU1nUTJobFkydHBibWNnYjNabGNteGhjQ0IzYVhSb0lHeHZiM0FnWVc1amFHOXlJQ2hCVEV3cFhHNXNiMjl3TG5Wd0lEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZZV3hzWDJSVVFVZDJjMFJOVTA5ZlZWQmZaR2xtWmpBdU1pNWlaV1J3WlZ3aUtTbGNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjloYkd4ZlpGUkJSM1p6UkUxVFQxOU9UMTlrYVdabU1DNHlMbUpsWkhCbFhDSXBLVnh1WVc1amFHOXlMblZ3Ym04Z1BDMGdaWGgwY21GamRFRnVZMmh2Y2loaWFXNWtYM0p2ZDNNb2JHOXZjQzUxY0N3Z2JHOXZjQzV1YnlrcFhHNWNibXh2YjNBdVpHOTNiaUE4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKamFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDJGc2JGOWtWRUZIZG5ORVRWTlBYMFJQVjA1ZlpHbG1aakF1TWk1aVpXUndaVndpS1NsY2JtRnVZMmh2Y2k1a2IzZHVJRHd0SUdWNGRISmhZM1JCYm1Ob2IzSW9iRzl2Y0M1a2IzZHVLVnh1WEc1Y2JtOTJaWEpzWVhBdVltOWtlUzUxY0c1dklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loemRISnBjR1ZDYjJSNUxtZHlMQ0JoYm1Ob2IzSXVkWEJ1YnlsY2JtOTJaWEpzWVhBdVltOWtlUzVrYjNkdUlEd3RJR1pwYm1SUGRtVnliR0Z3Y3loemRISnBjR1ZDYjJSNUxtZHlMQ0JoYm1Ob2IzSXVaRzkzYmlsY2JtOTJaWEpzWVhBdVlXNWphRzl5TG5Wd2JtOGdQQzBnWm1sdVpFOTJaWEpzWVhCektITjBjbWx3WlVGdVkyaHZjaTVuY2l3Z1lXNWphRzl5TG5Wd2JtOHBYRzV2ZG1WeWJHRndMbUZ1WTJodmNpNWtiM2R1SUR3dElHWnBibVJQZG1WeWJHRndjeWh6ZEhKcGNHVkJibU5vYjNJdVozSXNJR0Z1WTJodmNpNWtiM2R1S1Z4dVhHNXNaVzVuZEdnb2RXNXBjWFZsS0hOMVltcGxZM1JJYVhSektHOTJaWEpzWVhBdVltOWtlUzUxY0c1dktTa3BYRzVzWlc1bmRHZ29kVzVwY1hWbEtITjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQXVZbTlrZVM1a2IzZHVLU2twWEc1c1pXNW5kR2dvZFc1cGNYVmxLSE4xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEF1WVc1amFHOXlMblZ3Ym04cEtTbGNibXhsYm1kMGFDaDFibWx4ZFdVb2MzVmlhbVZqZEVocGRITW9iM1psY214aGNDNWhibU5vYjNJdVpHOTNiaWtwS1Z4dVhHNWNiaU1qSUVOb1pXTnJhVzVuSUc5MlpYSnNZWEFnZDJsMGFDQnNiMjl3SUdGdVkyaHZjaUFvVTNSeWRXTjBkWEpsS1Z4dWJHOXZjQzUxY0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzTjBjblZqZEhWeVpWOWtWRUZIZG5ORVRWTlBYMVZRWDJScFptWXdMakl1WW1Wa2NHVmNJaWtwWEc1c2IyOXdMbTV2SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZmMzUnlkV04wZFhKbFgyUlVRVWQyYzBSTlUwOWZUazlmWkdsbVpqQXVNaTVpWldSd1pWd2lLU2xjYm1GdVkyaHZjaTUxY0c1dklEd3RJR1Y0ZEhKaFkzUkJibU5vYjNJb1ltbHVaRjl5YjNkektHeHZiM0F1ZFhBc0lHeHZiM0F1Ym04cEtWeHVYRzVzYjI5d0xtUnZkMjRnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5emRISjFZM1IxY21WZlpGUkJSM1p6UkUxVFQxOUVUMWRPWDJScFptWXdMakl1WW1Wa2NHVmNJaWtwWEc1aGJtTm9iM0l1Wkc5M2JpQThMU0JsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1Wkc5M2JpbGNibHh1YjNabGNteGhjQzVpYjJSNUxuVndibThnUEMwZ1ptbHVaRTkyWlhKc1lYQnpLSE4wY21sd1pVSnZaSGt1WjNJc0lHRnVZMmh2Y2k1MWNHNXZLVnh1YjNabGNteGhjQzVpYjJSNUxtUnZkMjRnUEMwZ1ptbHVaRTkyWlhKc1lYQnpLSE4wY21sd1pVSnZaSGt1WjNJc0lHRnVZMmh2Y2k1a2IzZHVLVnh1YjNabGNteGhjQzVoYm1Ob2IzSXVkWEJ1YnlBOExTQm1hVzVrVDNabGNteGhjSE1vYzNSeWFYQmxRVzVqYUc5eUxtZHlMQ0JoYm1Ob2IzSXVkWEJ1YnlsY2JtOTJaWEpzWVhBdVlXNWphRzl5TG1SdmQyNGdQQzBnWm1sdVpFOTJaWEpzWVhCektITjBjbWx3WlVGdVkyaHZjaTVuY2l3Z1lXNWphRzl5TG1SdmQyNHBYRzVjYm14bGJtZDBhQ2gxYm1seGRXVW9jM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjQzVpYjJSNUxuVndibThwS1NsY2JteGxibWQwYUNoMWJtbHhkV1VvYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0M1aWIyUjVMbVJ2ZDI0cEtTbGNibXhsYm1kMGFDaDFibWx4ZFdVb2MzVmlhbVZqZEVocGRITW9iM1psY214aGNDNWhibU5vYjNJdWRYQnVieWtwS1Z4dWJHVnVaM1JvS0hWdWFYRjFaU2h6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3TG1GdVkyaHZjaTVrYjNkdUtTa3BYRzVjYmx4dWJHVnVaM1JvS0hWdWFYRjFaU2h6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3TG1KdlpIa3VkWEJ1YnlrcEtTOXNaVzVuZEdnb1lXNWphRzl5TG5Wd2JtOHBLakV3TUZ4dWJHVnVaM1JvS0hWdWFYRjFaU2h6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3TG1KdlpIa3VaRzkzYmlrcEtTOXNaVzVuZEdnb1lXNWphRzl5TG1SdmQyNHBLakV3TUZ4dWJHVnVaM1JvS0hWdWFYRjFaU2h6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3TG1GdVkyaHZjaTUxY0c1dktTa3BMMnhsYm1kMGFDaGhibU5vYjNJdWRYQnVieWtxTVRBd1hHNXNaVzVuZEdnb2RXNXBjWFZsS0hOMVltcGxZM1JJYVhSektHOTJaWEpzWVhBdVlXNWphRzl5TG1SdmQyNHBLU2t2YkdWdVozUm9LR0Z1WTJodmNpNWtiM2R1S1NveE1EQmNibHh1WEc0akl5QkRhR1ZqYTJsdVp5QnZkbVZ5YkdGd0lIZHBkR2dnYkc5dmNDQmhibU5vYjNJZ0tGSmxiR0Y0WldSU1pXY3BYRzVzYjI5d0xuVndJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY21WbmRXeGhkRzl5ZVY5a1ZFRkhkbk5FVFZOUFgxVlFYMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BYRzVzYjI5d0xtNXZJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY21WbmRXeGhkRzl5ZVY5a1ZFRkhkbk5FVFZOUFgwNVBYMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BYRzVoYm1Ob2IzSXVkWEJ1YnlBOExTQmxlSFJ5WVdOMFFXNWphRzl5S0dKcGJtUmZjbTkzY3loc2IyOXdMblZ3TENCc2IyOXdMbTV2S1NsY2JseHViRzl2Y0M1a2IzZHVJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY21WbmRXeGhkRzl5ZVY5a1ZFRkhkbk5FVFZOUFgwUlBWMDVmWkdsbVpqQXVNaTVpWldSd1pWd2lLU2xjYm1GdVkyaHZjaTVrYjNkdUlEd3RJR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzVrYjNkdUtWeHVYRzV2ZG1WeWJHRndMbUp2WkhrdWRYQnVieUE4TFNCbWFXNWtUM1psY214aGNITW9jM1J5YVhCbFFtOWtlUzVuY2l3Z1lXNWphRzl5TG5Wd2JtOHBYRzV2ZG1WeWJHRndMbUp2WkhrdVpHOTNiaUE4TFNCbWFXNWtUM1psY214aGNITW9jM1J5YVhCbFFtOWtlUzVuY2l3Z1lXNWphRzl5TG1SdmQyNHBYRzV2ZG1WeWJHRndMbUZ1WTJodmNpNTFjRzV2SUR3dElHWnBibVJQZG1WeWJHRndjeWh6ZEhKcGNHVkJibU5vYjNJdVozSXNJR0Z1WTJodmNpNTFjRzV2S1Z4dWIzWmxjbXhoY0M1aGJtTm9iM0l1Wkc5M2JpQThMU0JtYVc1a1QzWmxjbXhoY0hNb2MzUnlhWEJsUVc1amFHOXlMbWR5TENCaGJtTm9iM0l1Wkc5M2JpbGNibHh1YkdWdVozUm9LSFZ1YVhGMVpTaHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndMbUp2WkhrdWRYQnVieWtwS1Z4dWJHVnVaM1JvS0hWdWFYRjFaU2h6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3TG1KdlpIa3VaRzkzYmlrcEtWeHViR1Z1WjNSb0tIVnVhWEYxWlNoemRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd0xtRnVZMmh2Y2k1MWNHNXZLU2twWEc1c1pXNW5kR2dvZFc1cGNYVmxLSE4xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEF1WVc1amFHOXlMbVJ2ZDI0cEtTbGNibHh1WEc1c1pXNW5kR2dvZFc1cGNYVmxLSE4xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEF1WW05a2VTNTFjRzV2S1NrcEwyeGxibWQwYUNoaGJtTm9iM0l1ZFhCdWJ5a3FNVEF3WEc1c1pXNW5kR2dvZFc1cGNYVmxLSE4xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEF1WW05a2VTNWtiM2R1S1NrcEwyeGxibWQwYUNoaGJtTm9iM0l1Wkc5M2Jpa3FNVEF3WEc1c1pXNW5kR2dvZFc1cGNYVmxLSE4xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEF1WVc1amFHOXlMblZ3Ym04cEtTa3ZiR1Z1WjNSb0tHRnVZMmh2Y2k1MWNHNXZLU294TURCY2JteGxibWQwYUNoMWJtbHhkV1VvYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0M1aGJtTm9iM0l1Wkc5M2Jpa3BLUzlzWlc1bmRHZ29ZVzVqYUc5eUxtUnZkMjRwS2pFd01GeHVYRzVjYmx4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuZmxhbmtTaXplIDwtIDFcbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMyksXG4gICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsXG4gICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCwgVjYpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxlbnNlbWJsXFwpXG5cbmJlZC4xIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdyb3VwMSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbmJlZC4yIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdyb3VwMikgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcblxuXG5kYXRhIDwtIGZyZWFkKGhlcmUoXFwuLi8uLlxcLCBcXHJlc3VsdFxcLCBcXHN0cmlwZW5uXFwsIFxccmVzdWx0X2ZpbHRlcmVkLnRzdlxcKSlcblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gd2lkdGgpKSArIGdlb21faGlzdG9ncmFtKCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYilcblxuXG4jIyBDaGVja2luZyBvdmVybGFwIHdpdGggZ2VuZSBUU1NcblxudHNzIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X1RTUzIuNWtiLmJlZFxcKSlcblxudHNzLmdyb3VwMSA8LSB0c3MgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDEpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpXG5jb2xuYW1lcyh0c3MuZ3JvdXAxKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnRzcy5ncm91cDEuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRzcy5ncm91cDEpXG5cbnRzcy5ncm91cDIgPC0gdHNzICU+JSBkcGx5cjo6ZmlsdGVyKFY2ICVpbiUgZ3JvdXAyKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXModHNzLmdyb3VwMikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG50c3MuZ3JvdXAyLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0c3MuZ3JvdXAyKVxuXG4jIyBBbmNob3Igb2Ygc3RyaXBlc1xudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KGNociwgcG9zMSwgcG9zMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuXG5zdHJpcGVBbmNob3IuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5cbm92ZXJsYXAuZ3JvdXAxIDwtIGZpbmRPdmVybGFwcyh0c3MuZ3JvdXAxLmdyLCBzdHJpcGVBbmNob3IuZ3IpXG5vdmVybGFwLmdyb3VwMiA8LSBmaW5kT3ZlcmxhcHModHNzLmdyb3VwMi5nciwgc3RyaXBlQW5jaG9yLmdyKVxuXG5sZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmdyb3VwMSkpKVxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ncm91cDIpKSlcblxuXG4jIyBib2R5IG9mIHN0cmlwZXNcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChjaHIsIHBvczMsIHBvczQpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcblxuc3RyaXBlQm9keS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcblxub3ZlcmxhcC5ncm91cDEgPC0gZmluZE92ZXJsYXBzKHRzcy5ncm91cDEuZ3IsIHN0cmlwZUJvZHkuZ3IpXG5vdmVybGFwLmdyb3VwMiA8LSBmaW5kT3ZlcmxhcHModHNzLmdyb3VwMi5nciwgc3RyaXBlQm9keS5ncilcblxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ncm91cDEpKSlcbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuZ3JvdXAyKSkpXG5cbiMjIENoZWNraW5nIFJBRDIxL0NUQ0YgcHJlc2VuY2UgYXQgYW5jaG9yXG5vdmVybGFwLmJvZHkuY3RjZiA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQm9keS5nciwgcGVhay5DVENGKVxub3ZlcmxhcC5ib2R5LnJhZDIxIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVCb2R5LmdyLCBwZWFrLlJBRDIxKVxub3ZlcmxhcC5hbmNob3IuY3RjZiA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBwZWFrLkNUQ0YpXG5vdmVybGFwLmFuY2hvci5yYWQyMSA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBwZWFrLlJBRDIxKVxuXG5sZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmJvZHkuY3RjZikpKVxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ib2R5LnJhZDIxKSkpXG5cbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuYW5jaG9yLmN0Y2YpKSlcbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuYW5jaG9yLnJhZDIxKSkpXG4gIFxuIyMgQ2hlY2tpbmcgb3ZlcmxhcCB3aXRoIGxvb3AgYW5jaG9yIChQRS1QRSlcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwbm8gPC0gZXh0cmFjdEFuY2hvcihiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykpXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gZXh0cmFjdEFuY2hvcihsb29wLmRvd24pXG5cblxub3ZlcmxhcC5ib2R5LnVwbm8gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci51cG5vKVxub3ZlcmxhcC5ib2R5LmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci5kb3duKVxub3ZlcmxhcC5hbmNob3IudXBubyA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBhbmNob3IudXBubylcbm92ZXJsYXAuYW5jaG9yLmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUFuY2hvci5nciwgYW5jaG9yLmRvd24pXG5cbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LnVwbm8pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LmRvd24pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IudXBubykpKVxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci5kb3duKSkpXG5cblxuIyMgQ2hlY2tpbmcgb3ZlcmxhcCB3aXRoIGxvb3AgYW5jaG9yIChBTEwpXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwbm8gPC0gZXh0cmFjdEFuY2hvcihiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykpXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIGV4dHJhY3RBbmNob3IobG9vcC5kb3duKVxuXG5cbm92ZXJsYXAuYm9keS51cG5vIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVCb2R5LmdyLCBhbmNob3IudXBubylcbm92ZXJsYXAuYm9keS5kb3duIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVCb2R5LmdyLCBhbmNob3IuZG93bilcbm92ZXJsYXAuYW5jaG9yLnVwbm8gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUFuY2hvci5nciwgYW5jaG9yLnVwbm8pXG5vdmVybGFwLmFuY2hvci5kb3duIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVBbmNob3IuZ3IsIGFuY2hvci5kb3duKVxuXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS51cG5vKSkpXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS5kb3duKSkpXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLnVwbm8pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IuZG93bikpKVxuXG5cbiMjIENoZWNraW5nIG92ZXJsYXAgd2l0aCBsb29wIGFuY2hvciAoU3RydWN0dXJlKVxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci51cG5vIDwtIGV4dHJhY3RBbmNob3IoYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pKVxuXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSBleHRyYWN0QW5jaG9yKGxvb3AuZG93bilcblxub3ZlcmxhcC5ib2R5LnVwbm8gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci51cG5vKVxub3ZlcmxhcC5ib2R5LmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci5kb3duKVxub3ZlcmxhcC5hbmNob3IudXBubyA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBhbmNob3IudXBubylcbm92ZXJsYXAuYW5jaG9yLmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUFuY2hvci5nciwgYW5jaG9yLmRvd24pXG5cbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LnVwbm8pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LmRvd24pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IudXBubykpKVxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci5kb3duKSkpXG5cblxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkudXBubykpKS9sZW5ndGgoYW5jaG9yLnVwbm8pKjEwMFxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkuZG93bikpKS9sZW5ndGgoYW5jaG9yLmRvd24pKjEwMFxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci51cG5vKSkpL2xlbmd0aChhbmNob3IudXBubykqMTAwXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLmRvd24pKSkvbGVuZ3RoKGFuY2hvci5kb3duKSoxMDBcblxuXG4jIyBDaGVja2luZyBvdmVybGFwIHdpdGggbG9vcCBhbmNob3IgKFJlbGF4ZWRSZWcpXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcmVndWxhdG9yeV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcmVndWxhdG9yeV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXBubyA8LSBleHRyYWN0QW5jaG9yKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSlcblxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcmVndWxhdG9yeV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIGV4dHJhY3RBbmNob3IobG9vcC5kb3duKVxuXG5vdmVybGFwLmJvZHkudXBubyA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQm9keS5nciwgYW5jaG9yLnVwbm8pXG5vdmVybGFwLmJvZHkuZG93biA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQm9keS5nciwgYW5jaG9yLmRvd24pXG5vdmVybGFwLmFuY2hvci51cG5vIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVBbmNob3IuZ3IsIGFuY2hvci51cG5vKVxub3ZlcmxhcC5hbmNob3IuZG93biA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBhbmNob3IuZG93bilcblxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkudXBubykpKVxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkuZG93bikpKVxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci51cG5vKSkpXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLmRvd24pKSlcblxuXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS51cG5vKSkpL2xlbmd0aChhbmNob3IudXBubykqMTAwXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS5kb3duKSkpL2xlbmd0aChhbmNob3IuZG93bikqMTAwXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLnVwbm8pKSkvbGVuZ3RoKGFuY2hvci51cG5vKSoxMDBcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IuZG93bikpKS9sZW5ndGgoYW5jaG9yLmRvd24pKjEwMFxuXG5cblxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

flankSize <- 1
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6)
colnames(gene.tb) <- c(\chr\, \start\, \end\, \ensembl\)

bed.1 <- gene.tb %>% dplyr::filter(ensembl %in% group1) %>% dplyr::select(c(1, 2, 3))
bed.2 <- gene.tb %>% dplyr::filter(ensembl %in% group2) %>% dplyr::select(c(1, 2, 3))


data <- fread(here(\../..\, \result\, \stripenn\, \result_filtered.tsv\))

ggplot(data, aes(x = width)) + geom_histogram() + theme_classic() +
 scale_x_continuous(labels = label_kb_mb)


## Checking overlap with gene TSS

tss <- fread(here(refDir, \mm10_GRCm38.p6_TSS2.5kb.bed\))

tss.group1 <- tss %>% dplyr::filter(V6 %in% group1) %>% dplyr::select(V1, V2, V3)
colnames(tss.group1) <- c(\chr\, \start\, \end\)
tss.group1.gr <- makeGRangesFromDataFrame(tss.group1)

tss.group2 <- tss %>% dplyr::filter(V6 %in% group2) %>% dplyr::select(V1, V2, V3)
colnames(tss.group2) <- c(\chr\, \start\, \end\)
tss.group2.gr <- makeGRangesFromDataFrame(tss.group2)

## Anchor of stripes
temp <- data %>% dplyr::select(chr, pos1, pos2)
colnames(temp) <- c(\chr\, \start\, \end\)

stripeAnchor.gr <- makeGRangesFromDataFrame(temp)

overlap.group1 <- findOverlaps(tss.group1.gr, stripeAnchor.gr)
overlap.group2 <- findOverlaps(tss.group2.gr, stripeAnchor.gr)

length(unique(queryHits(overlap.group1)))
length(unique(queryHits(overlap.group2)))


## body of stripes
temp <- data %>% dplyr::select(chr, pos3, pos4)
colnames(temp) <- c(\chr\, \start\, \end\)

stripeBody.gr <- makeGRangesFromDataFrame(temp)

overlap.group1 <- findOverlaps(tss.group1.gr, stripeBody.gr)
overlap.group2 <- findOverlaps(tss.group2.gr, stripeBody.gr)

length(unique(queryHits(overlap.group1)))
length(unique(queryHits(overlap.group2)))

## Checking RAD21/CTCF presence at anchor
overlap.body.ctcf <- findOverlaps(stripeBody.gr, peak.CTCF)
overlap.body.rad21 <- findOverlaps(stripeBody.gr, peak.RAD21)
overlap.anchor.ctcf <- findOverlaps(stripeAnchor.gr, peak.CTCF)
overlap.anchor.rad21 <- findOverlaps(stripeAnchor.gr, peak.RAD21)

length(unique(queryHits(overlap.body.ctcf)))
length(unique(queryHits(overlap.body.rad21)))

length(unique(queryHits(overlap.anchor.ctcf)))
length(unique(queryHits(overlap.anchor.rad21)))
  
## Checking overlap with loop anchor (PE-PE)
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)


overlap.body.upno <- findOverlaps(stripeBody.gr, anchor.upno)
overlap.body.down <- findOverlaps(stripeBody.gr, anchor.down)
overlap.anchor.upno <- findOverlaps(stripeAnchor.gr, anchor.upno)
overlap.anchor.down <- findOverlaps(stripeAnchor.gr, anchor.down)

length(unique(subjectHits(overlap.body.upno)))
length(unique(subjectHits(overlap.body.down)))
length(unique(subjectHits(overlap.anchor.upno)))
length(unique(subjectHits(overlap.anchor.down)))


## Checking overlap with loop anchor (ALL)
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)


overlap.body.upno <- findOverlaps(stripeBody.gr, anchor.upno)
overlap.body.down <- findOverlaps(stripeBody.gr, anchor.down)
overlap.anchor.upno <- findOverlaps(stripeAnchor.gr, anchor.upno)
overlap.anchor.down <- findOverlaps(stripeAnchor.gr, anchor.down)

length(unique(subjectHits(overlap.body.upno)))
length(unique(subjectHits(overlap.body.down)))
length(unique(subjectHits(overlap.anchor.upno)))
length(unique(subjectHits(overlap.anchor.down)))


## Checking overlap with loop anchor (Structure)
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)

overlap.body.upno <- findOverlaps(stripeBody.gr, anchor.upno)
overlap.body.down <- findOverlaps(stripeBody.gr, anchor.down)
overlap.anchor.upno <- findOverlaps(stripeAnchor.gr, anchor.upno)
overlap.anchor.down <- findOverlaps(stripeAnchor.gr, anchor.down)

length(unique(subjectHits(overlap.body.upno)))
length(unique(subjectHits(overlap.body.down)))
length(unique(subjectHits(overlap.anchor.upno)))
length(unique(subjectHits(overlap.anchor.down)))


length(unique(subjectHits(overlap.body.upno)))/length(anchor.upno)*100
length(unique(subjectHits(overlap.body.down)))/length(anchor.down)*100
length(unique(subjectHits(overlap.anchor.upno)))/length(anchor.upno)*100
length(unique(subjectHits(overlap.anchor.down)))/length(anchor.down)*100


## Checking overlap with loop anchor (RelaxedReg)
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_regulatory_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_regulatory_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_regulatory_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)

overlap.body.upno <- findOverlaps(stripeBody.gr, anchor.upno)
overlap.body.down <- findOverlaps(stripeBody.gr, anchor.down)
overlap.anchor.upno <- findOverlaps(stripeAnchor.gr, anchor.upno)
overlap.anchor.down <- findOverlaps(stripeAnchor.gr, anchor.down)

length(unique(subjectHits(overlap.body.upno)))
length(unique(subjectHits(overlap.body.down)))
length(unique(subjectHits(overlap.anchor.upno)))
length(unique(subjectHits(overlap.anchor.down)))


length(unique(subjectHits(overlap.body.upno)))/length(anchor.upno)*100
length(unique(subjectHits(overlap.body.down)))/length(anchor.down)*100
length(unique(subjectHits(overlap.anchor.upno)))/length(anchor.upno)*100
length(unique(subjectHits(overlap.anchor.down)))/length(anchor.down)*100



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNERXVkSE4yWEZ3cEtTUm5aVzVsWEc1bmNtOTFjRElnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJKcGJtRnllVWR5YjNWd01pNTBjM1pjWENrcEpHZGxibVZjYmx4dVpteGhibXRUYVhwbElEd3RJREZjYm1kbGJtVXVkR0lnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNiVzB4TUY5SFVrTnRNemd1Y0RaZloyVnVaVjl6YjNKMFpXUXVZbVZrWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hVVTFNZ1BTQnBabVZzYzJVb1ZqUWdQVDBnWEZ3clhGd3NJRll5TENCV015a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdWRk5UYzNSaGNuUWdQU0JVVTFNZ0xTQm1iR0Z1YTFOcGVtVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdWRk5UWlc1a0lEMGdWRk5USUNzZ1pteGhibXRUYVhwbEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hXTVN3Z1ZGTlRjM1JoY25Rc0lGUlRVMlZ1WkN3Z1ZqWXBYRzVqYjJ4dVlXMWxjeWhuWlc1bExuUmlLU0E4TFNCaktGeGNZMmh5WEZ3c0lGeGNjM1JoY25SY1hDd2dYRnhsYm1SY1hDd2dYRnhsYm5ObGJXSnNYRndwWEc1Y2JtSmxaQzR4SUR3dElHZGxibVV1ZEdJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1pXNXpaVzFpYkNBbGFXNGxJR2R5YjNWd01Ta2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWd4TENBeUxDQXpLU2xjYm1KbFpDNHlJRHd0SUdkbGJtVXVkR0lnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWlc1elpXMWliQ0FsYVc0bElHZHliM1Z3TWlrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1l5Z3hMQ0F5TENBektTbGNibHh1WEc1a1lYUmhJRHd0SUdaeVpXRmtLR2hsY21Vb1hGd3VMaTh1TGx4Y0xDQmNYSEpsYzNWc2RGeGNMQ0JjWEhOMGNtbHdaVzV1WEZ3c0lGeGNjbVZ6ZFd4MFgyWnBiSFJsY21Wa0xuUnpkbHhjS1NsY2JseHVaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnZDJsa2RHZ3BLU0FySUdkbGIyMWZhR2x6ZEc5bmNtRnRLQ2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlITmpZV3hsWDNoZlkyOXVkR2x1ZFc5MWN5aHNZV0psYkhNZ1BTQnNZV0psYkY5cllsOXRZaWxjYmx4dVhHNGpJeUJEYUdWamEybHVaeUJ2ZG1WeWJHRndJSGRwZEdnZ1oyVnVaU0JVVTFOY2JseHVkSE56SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYRzF0TVRCZlIxSkRiVE00TG5BMlgxUlRVekl1Tld0aUxtSmxaRnhjS1NsY2JseHVkSE56TG1keWIzVndNU0E4TFNCMGMzTWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9WallnSldsdUpTQm5jbTkxY0RFcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtGWXhMQ0JXTWl3Z1ZqTXBYRzVqYjJ4dVlXMWxjeWgwYzNNdVozSnZkWEF4S1NBOExTQmpLRnhjWTJoeVhGd3NJRnhjYzNSaGNuUmNYQ3dnWEZ4bGJtUmNYQ2xjYm5SemN5NW5jbTkxY0RFdVozSWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLSFJ6Y3k1bmNtOTFjREVwWEc1Y2JuUnpjeTVuY205MWNESWdQQzBnZEhOeklDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtGWTJJQ1ZwYmlVZ1ozSnZkWEF5S1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoV01Td2dWaklzSUZZektWeHVZMjlzYm1GdFpYTW9kSE56TG1keWIzVndNaWtnUEMwZ1l5aGNYR05vY2x4Y0xDQmNYSE4wWVhKMFhGd3NJRnhjWlc1a1hGd3BYRzUwYzNNdVozSnZkWEF5TG1keUlEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaDBjM011WjNKdmRYQXlLVnh1WEc0akl5QkJibU5vYjNJZ2IyWWdjM1J5YVhCbGMxeHVkR1Z0Y0NBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dOb2Npd2djRzl6TVN3Z2NHOXpNaWxjYm1OdmJHNWhiV1Z6S0hSbGJYQXBJRHd0SUdNb1hGeGphSEpjWEN3Z1hGeHpkR0Z5ZEZ4Y0xDQmNYR1Z1WkZ4Y0tWeHVYRzV6ZEhKcGNHVkJibU5vYjNJdVozSWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLSFJsYlhBcFhHNWNibTkyWlhKc1lYQXVaM0p2ZFhBeElEd3RJR1pwYm1SUGRtVnliR0Z3Y3loMGMzTXVaM0p2ZFhBeExtZHlMQ0J6ZEhKcGNHVkJibU5vYjNJdVozSXBYRzV2ZG1WeWJHRndMbWR5YjNWd01pQThMU0JtYVc1a1QzWmxjbXhoY0hNb2RITnpMbWR5YjNWd01pNW5jaXdnYzNSeWFYQmxRVzVqYUc5eUxtZHlLVnh1WEc1c1pXNW5kR2dvZFc1cGNYVmxLSEYxWlhKNVNHbDBjeWh2ZG1WeWJHRndMbWR5YjNWd01Ta3BLVnh1YkdWdVozUm9LSFZ1YVhGMVpTaHhkV1Z5ZVVocGRITW9iM1psY214aGNDNW5jbTkxY0RJcEtTbGNibHh1WEc0akl5QmliMlI1SUc5bUlITjBjbWx3WlhOY2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hqYUhJc0lIQnZjek1zSUhCdmN6UXBYRzVqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z4Y1kyaHlYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWENsY2JseHVjM1J5YVhCbFFtOWtlUzVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb2RHVnRjQ2xjYmx4dWIzWmxjbXhoY0M1bmNtOTFjREVnUEMwZ1ptbHVaRTkyWlhKc1lYQnpLSFJ6Y3k1bmNtOTFjREV1WjNJc0lITjBjbWx3WlVKdlpIa3VaM0lwWEc1dmRtVnliR0Z3TG1keWIzVndNaUE4TFNCbWFXNWtUM1psY214aGNITW9kSE56TG1keWIzVndNaTVuY2l3Z2MzUnlhWEJsUW05a2VTNW5jaWxjYmx4dWJHVnVaM1JvS0hWdWFYRjFaU2h4ZFdWeWVVaHBkSE1vYjNabGNteGhjQzVuY205MWNERXBLU2xjYm14bGJtZDBhQ2gxYm1seGRXVW9jWFZsY25sSWFYUnpLRzkyWlhKc1lYQXVaM0p2ZFhBeUtTa3BYRzVjYmlNaklFTm9aV05yYVc1bklGSkJSREl4TDBOVVEwWWdjSEpsYzJWdVkyVWdZWFFnWVc1amFHOXlYRzV2ZG1WeWJHRndMbUp2WkhrdVkzUmpaaUE4TFNCbWFXNWtUM1psY214aGNITW9jM1J5YVhCbFFtOWtlUzVuY2l3Z2NHVmhheTVEVkVOR0tWeHViM1psY214aGNDNWliMlI1TG5KaFpESXhJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aHpkSEpwY0dWQ2IyUjVMbWR5TENCd1pXRnJMbEpCUkRJeEtWeHViM1psY214aGNDNWhibU5vYjNJdVkzUmpaaUE4TFNCbWFXNWtUM1psY214aGNITW9jM1J5YVhCbFFXNWphRzl5TG1keUxDQndaV0ZyTGtOVVEwWXBYRzV2ZG1WeWJHRndMbUZ1WTJodmNpNXlZV1F5TVNBOExTQm1hVzVrVDNabGNteGhjSE1vYzNSeWFYQmxRVzVqYUc5eUxtZHlMQ0J3WldGckxsSkJSREl4S1Z4dVhHNXNaVzVuZEdnb2RXNXBjWFZsS0hGMVpYSjVTR2wwY3lodmRtVnliR0Z3TG1KdlpIa3VZM1JqWmlrcEtWeHViR1Z1WjNSb0tIVnVhWEYxWlNoeGRXVnllVWhwZEhNb2IzWmxjbXhoY0M1aWIyUjVMbkpoWkRJeEtTa3BYRzVjYm14bGJtZDBhQ2gxYm1seGRXVW9jWFZsY25sSWFYUnpLRzkyWlhKc1lYQXVZVzVqYUc5eUxtTjBZMllwS1NsY2JteGxibWQwYUNoMWJtbHhkV1VvY1hWbGNubElhWFJ6S0c5MlpYSnNZWEF1WVc1amFHOXlMbkpoWkRJeEtTa3BYRzRnSUZ4dUl5TWdRMmhsWTJ0cGJtY2diM1psY214aGNDQjNhWFJvSUd4dmIzQWdZVzVqYUc5eUlDaFFSUzFRUlNsY2JteHZiM0F1ZFhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5a1ZFRkhkbk5FVFZOUFgxVlFYMlJwWm1Zd0xqSXVZbVZrY0dWY1hDa3BYRzVzYjI5d0xtNXZJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZaRlJCUjNaelJFMVRUMTlPVDE5a2FXWm1NQzR5TG1KbFpIQmxYRndwS1Z4dVlXNWphRzl5TG5Wd2JtOGdQQzBnWlhoMGNtRmpkRUZ1WTJodmNpaGlhVzVrWDNKdmQzTW9iRzl2Y0M1MWNDd2diRzl2Y0M1dWJ5a3BYRzVjYm14dmIzQXVaRzkzYmlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDJSVVFVZDJjMFJOVTA5ZlJFOVhUbDlrYVdabU1DNHlMbUpsWkhCbFhGd3BLVnh1WVc1amFHOXlMbVJ2ZDI0Z1BDMGdaWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbVJ2ZDI0cFhHNWNibHh1YjNabGNteGhjQzVpYjJSNUxuVndibThnUEMwZ1ptbHVaRTkyWlhKc1lYQnpLSE4wY21sd1pVSnZaSGt1WjNJc0lHRnVZMmh2Y2k1MWNHNXZLVnh1YjNabGNteGhjQzVpYjJSNUxtUnZkMjRnUEMwZ1ptbHVaRTkyWlhKc1lYQnpLSE4wY21sd1pVSnZaSGt1WjNJc0lHRnVZMmh2Y2k1a2IzZHVLVnh1YjNabGNteGhjQzVoYm1Ob2IzSXVkWEJ1YnlBOExTQm1hVzVrVDNabGNteGhjSE1vYzNSeWFYQmxRVzVqYUc5eUxtZHlMQ0JoYm1Ob2IzSXVkWEJ1YnlsY2JtOTJaWEpzWVhBdVlXNWphRzl5TG1SdmQyNGdQQzBnWm1sdVpFOTJaWEpzWVhCektITjBjbWx3WlVGdVkyaHZjaTVuY2l3Z1lXNWphRzl5TG1SdmQyNHBYRzVjYm14bGJtZDBhQ2gxYm1seGRXVW9jM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjQzVpYjJSNUxuVndibThwS1NsY2JteGxibWQwYUNoMWJtbHhkV1VvYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0M1aWIyUjVMbVJ2ZDI0cEtTbGNibXhsYm1kMGFDaDFibWx4ZFdVb2MzVmlhbVZqZEVocGRITW9iM1psY214aGNDNWhibU5vYjNJdWRYQnVieWtwS1Z4dWJHVnVaM1JvS0hWdWFYRjFaU2h6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3TG1GdVkyaHZjaTVrYjNkdUtTa3BYRzVjYmx4dUl5TWdRMmhsWTJ0cGJtY2diM1psY214aGNDQjNhWFJvSUd4dmIzQWdZVzVqYUc5eUlDaEJURXdwWEc1c2IyOXdMblZ3SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZllXeHNYMlJVUVVkMmMwUk5VMDlmVlZCZlpHbG1aakF1TWk1aVpXUndaVnhjS1NsY2JteHZiM0F1Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOWhiR3hmWkZSQlIzWnpSRTFUVDE5T1QxOWthV1ptTUM0eUxtSmxaSEJsWEZ3cEtWeHVZVzVqYUc5eUxuVndibThnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWhpYVc1a1gzSnZkM01vYkc5dmNDNTFjQ3dnYkc5dmNDNXVieWtwWEc1Y2JteHZiM0F1Wkc5M2JpQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYMkZzYkY5a1ZFRkhkbk5FVFZOUFgwUlBWMDVmWkdsbVpqQXVNaTVpWldSd1pWeGNLU2xjYm1GdVkyaHZjaTVrYjNkdUlEd3RJR1Y0ZEhKaFkzUkJibU5vYjNJb2JHOXZjQzVrYjNkdUtWeHVYRzVjYm05MlpYSnNZWEF1WW05a2VTNTFjRzV2SUR3dElHWnBibVJQZG1WeWJHRndjeWh6ZEhKcGNHVkNiMlI1TG1keUxDQmhibU5vYjNJdWRYQnVieWxjYm05MlpYSnNZWEF1WW05a2VTNWtiM2R1SUR3dElHWnBibVJQZG1WeWJHRndjeWh6ZEhKcGNHVkNiMlI1TG1keUxDQmhibU5vYjNJdVpHOTNiaWxjYm05MlpYSnNZWEF1WVc1amFHOXlMblZ3Ym04Z1BDMGdabWx1WkU5MlpYSnNZWEJ6S0hOMGNtbHdaVUZ1WTJodmNpNW5jaXdnWVc1amFHOXlMblZ3Ym04cFhHNXZkbVZ5YkdGd0xtRnVZMmh2Y2k1a2IzZHVJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aHpkSEpwY0dWQmJtTm9iM0l1WjNJc0lHRnVZMmh2Y2k1a2IzZHVLVnh1WEc1c1pXNW5kR2dvZFc1cGNYVmxLSE4xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEF1WW05a2VTNTFjRzV2S1NrcFhHNXNaVzVuZEdnb2RXNXBjWFZsS0hOMVltcGxZM1JJYVhSektHOTJaWEpzWVhBdVltOWtlUzVrYjNkdUtTa3BYRzVzWlc1bmRHZ29kVzVwY1hWbEtITjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQXVZVzVqYUc5eUxuVndibThwS1NsY2JteGxibWQwYUNoMWJtbHhkV1VvYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0M1aGJtTm9iM0l1Wkc5M2Jpa3BLVnh1WEc1Y2JpTWpJRU5vWldOcmFXNW5JRzkyWlhKc1lYQWdkMmwwYUNCc2IyOXdJR0Z1WTJodmNpQW9VM1J5ZFdOMGRYSmxLVnh1Ykc5dmNDNTFjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNOMGNuVmpkSFZ5WlY5a1ZFRkhkbk5FVFZOUFgxVlFYMlJwWm1Zd0xqSXVZbVZrY0dWY1hDa3BYRzVzYjI5d0xtNXZJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmYzNSeWRXTjBkWEpsWDJSVVFVZDJjMFJOVTA5ZlRrOWZaR2xtWmpBdU1pNWlaV1J3WlZ4Y0tTbGNibUZ1WTJodmNpNTFjRzV2SUR3dElHVjRkSEpoWTNSQmJtTm9iM0lvWW1sdVpGOXliM2R6S0d4dmIzQXVkWEFzSUd4dmIzQXVibThwS1Z4dVhHNXNiMjl3TG1SdmQyNGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl6ZEhKMVkzUjFjbVZmWkZSQlIzWnpSRTFUVDE5RVQxZE9YMlJwWm1Zd0xqSXVZbVZrY0dWY1hDa3BYRzVoYm1Ob2IzSXVaRzkzYmlBOExTQmxlSFJ5WVdOMFFXNWphRzl5S0d4dmIzQXVaRzkzYmlsY2JseHViM1psY214aGNDNWliMlI1TG5Wd2JtOGdQQzBnWm1sdVpFOTJaWEpzWVhCektITjBjbWx3WlVKdlpIa3VaM0lzSUdGdVkyaHZjaTUxY0c1dktWeHViM1psY214aGNDNWliMlI1TG1SdmQyNGdQQzBnWm1sdVpFOTJaWEpzWVhCektITjBjbWx3WlVKdlpIa3VaM0lzSUdGdVkyaHZjaTVrYjNkdUtWeHViM1psY214aGNDNWhibU5vYjNJdWRYQnVieUE4TFNCbWFXNWtUM1psY214aGNITW9jM1J5YVhCbFFXNWphRzl5TG1keUxDQmhibU5vYjNJdWRYQnVieWxjYm05MlpYSnNZWEF1WVc1amFHOXlMbVJ2ZDI0Z1BDMGdabWx1WkU5MlpYSnNZWEJ6S0hOMGNtbHdaVUZ1WTJodmNpNW5jaXdnWVc1amFHOXlMbVJ2ZDI0cFhHNWNibXhsYm1kMGFDaDFibWx4ZFdVb2MzVmlhbVZqZEVocGRITW9iM1psY214aGNDNWliMlI1TG5Wd2JtOHBLU2xjYm14bGJtZDBhQ2gxYm1seGRXVW9jM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjQzVpYjJSNUxtUnZkMjRwS1NsY2JteGxibWQwYUNoMWJtbHhkV1VvYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0M1aGJtTm9iM0l1ZFhCdWJ5a3BLVnh1YkdWdVozUm9LSFZ1YVhGMVpTaHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndMbUZ1WTJodmNpNWtiM2R1S1NrcFhHNWNibHh1YkdWdVozUm9LSFZ1YVhGMVpTaHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndMbUp2WkhrdWRYQnVieWtwS1M5c1pXNW5kR2dvWVc1amFHOXlMblZ3Ym04cEtqRXdNRnh1YkdWdVozUm9LSFZ1YVhGMVpTaHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndMbUp2WkhrdVpHOTNiaWtwS1M5c1pXNW5kR2dvWVc1amFHOXlMbVJ2ZDI0cEtqRXdNRnh1YkdWdVozUm9LSFZ1YVhGMVpTaHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndMbUZ1WTJodmNpNTFjRzV2S1NrcEwyeGxibWQwYUNoaGJtTm9iM0l1ZFhCdWJ5a3FNVEF3WEc1c1pXNW5kR2dvZFc1cGNYVmxLSE4xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEF1WVc1amFHOXlMbVJ2ZDI0cEtTa3ZiR1Z1WjNSb0tHRnVZMmh2Y2k1a2IzZHVLU294TURCY2JseHVYRzRqSXlCRGFHVmphMmx1WnlCdmRtVnliR0Z3SUhkcGRHZ2diRzl2Y0NCaGJtTm9iM0lnS0ZKbGJHRjRaV1JTWldjcFhHNXNiMjl3TG5Wd0lEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjbVZuZFd4aGRHOXllVjlrVkVGSGRuTkVUVk5QWDFWUVgyUnBabVl3TGpJdVltVmtjR1ZjWENrcFhHNXNiMjl3TG01dklEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjbVZuZFd4aGRHOXllVjlrVkVGSGRuTkVUVk5QWDA1UFgyUnBabVl3TGpJdVltVmtjR1ZjWENrcFhHNWhibU5vYjNJdWRYQnVieUE4TFNCbGVIUnlZV04wUVc1amFHOXlLR0pwYm1SZmNtOTNjeWhzYjI5d0xuVndMQ0JzYjI5d0xtNXZLU2xjYmx4dWJHOXZjQzVrYjNkdUlEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjbVZuZFd4aGRHOXllVjlrVkVGSGRuTkVUVk5QWDBSUFYwNWZaR2xtWmpBdU1pNWlaV1J3WlZ4Y0tTbGNibUZ1WTJodmNpNWtiM2R1SUR3dElHVjRkSEpoWTNSQmJtTm9iM0lvYkc5dmNDNWtiM2R1S1Z4dVhHNXZkbVZ5YkdGd0xtSnZaSGt1ZFhCdWJ5QThMU0JtYVc1a1QzWmxjbXhoY0hNb2MzUnlhWEJsUW05a2VTNW5jaXdnWVc1amFHOXlMblZ3Ym04cFhHNXZkbVZ5YkdGd0xtSnZaSGt1Wkc5M2JpQThMU0JtYVc1a1QzWmxjbXhoY0hNb2MzUnlhWEJsUW05a2VTNW5jaXdnWVc1amFHOXlMbVJ2ZDI0cFhHNXZkbVZ5YkdGd0xtRnVZMmh2Y2k1MWNHNXZJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aHpkSEpwY0dWQmJtTm9iM0l1WjNJc0lHRnVZMmh2Y2k1MWNHNXZLVnh1YjNabGNteGhjQzVoYm1Ob2IzSXVaRzkzYmlBOExTQm1hVzVrVDNabGNteGhjSE1vYzNSeWFYQmxRVzVqYUc5eUxtZHlMQ0JoYm1Ob2IzSXVaRzkzYmlsY2JseHViR1Z1WjNSb0tIVnVhWEYxWlNoemRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd0xtSnZaSGt1ZFhCdWJ5a3BLVnh1YkdWdVozUm9LSFZ1YVhGMVpTaHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndMbUp2WkhrdVpHOTNiaWtwS1Z4dWJHVnVaM1JvS0hWdWFYRjFaU2h6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3TG1GdVkyaHZjaTUxY0c1dktTa3BYRzVzWlc1bmRHZ29kVzVwY1hWbEtITjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQXVZVzVqYUc5eUxtUnZkMjRwS1NsY2JseHVYRzVzWlc1bmRHZ29kVzVwY1hWbEtITjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQXVZbTlrZVM1MWNHNXZLU2twTDJ4bGJtZDBhQ2hoYm1Ob2IzSXVkWEJ1YnlrcU1UQXdYRzVzWlc1bmRHZ29kVzVwY1hWbEtITjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQXVZbTlrZVM1a2IzZHVLU2twTDJ4bGJtZDBhQ2hoYm1Ob2IzSXVaRzkzYmlrcU1UQXdYRzVzWlc1bmRHZ29kVzVwY1hWbEtITjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQXVZVzVqYUc5eUxuVndibThwS1NrdmJHVnVaM1JvS0dGdVkyaHZjaTUxY0c1dktTb3hNREJjYm14bGJtZDBhQ2gxYm1seGRXVW9jM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjQzVoYm1Ob2IzSXVaRzkzYmlrcEtTOXNaVzVuZEdnb1lXNWphRzl5TG1SdmQyNHBLakV3TUZ4dVhHNWNibHh1WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuZmxhbmtTaXplIDwtIDFcbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMyksXG4gICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsXG4gICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCwgVjYpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxlbnNlbWJsXFwpXG5cbmJlZC4xIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdyb3VwMSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbmJlZC4yIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdyb3VwMikgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcblxuXG5kYXRhIDwtIGZyZWFkKGhlcmUoXFwuLi8uLlxcLCBcXHJlc3VsdFxcLCBcXHN0cmlwZW5uXFwsIFxccmVzdWx0X2ZpbHRlcmVkLnRzdlxcKSlcblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gd2lkdGgpKSArIGdlb21faGlzdG9ncmFtKCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYilcblxuXG4jIyBDaGVja2luZyBvdmVybGFwIHdpdGggZ2VuZSBUU1NcblxudHNzIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X1RTUzIuNWtiLmJlZFxcKSlcblxudHNzLmdyb3VwMSA8LSB0c3MgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDEpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpXG5jb2xuYW1lcyh0c3MuZ3JvdXAxKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnRzcy5ncm91cDEuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRzcy5ncm91cDEpXG5cbnRzcy5ncm91cDIgPC0gdHNzICU+JSBkcGx5cjo6ZmlsdGVyKFY2ICVpbiUgZ3JvdXAyKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXModHNzLmdyb3VwMikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG50c3MuZ3JvdXAyLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0c3MuZ3JvdXAyKVxuXG4jIyBBbmNob3Igb2Ygc3RyaXBlc1xudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KGNociwgcG9zMSwgcG9zMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuXG5zdHJpcGVBbmNob3IuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5cbm92ZXJsYXAuZ3JvdXAxIDwtIGZpbmRPdmVybGFwcyh0c3MuZ3JvdXAxLmdyLCBzdHJpcGVBbmNob3IuZ3IpXG5vdmVybGFwLmdyb3VwMiA8LSBmaW5kT3ZlcmxhcHModHNzLmdyb3VwMi5nciwgc3RyaXBlQW5jaG9yLmdyKVxuXG5sZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmdyb3VwMSkpKVxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ncm91cDIpKSlcblxuXG4jIyBib2R5IG9mIHN0cmlwZXNcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChjaHIsIHBvczMsIHBvczQpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcblxuc3RyaXBlQm9keS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcblxub3ZlcmxhcC5ncm91cDEgPC0gZmluZE92ZXJsYXBzKHRzcy5ncm91cDEuZ3IsIHN0cmlwZUJvZHkuZ3IpXG5vdmVybGFwLmdyb3VwMiA8LSBmaW5kT3ZlcmxhcHModHNzLmdyb3VwMi5nciwgc3RyaXBlQm9keS5ncilcblxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ncm91cDEpKSlcbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuZ3JvdXAyKSkpXG5cbiMjIENoZWNraW5nIFJBRDIxL0NUQ0YgcHJlc2VuY2UgYXQgYW5jaG9yXG5vdmVybGFwLmJvZHkuY3RjZiA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQm9keS5nciwgcGVhay5DVENGKVxub3ZlcmxhcC5ib2R5LnJhZDIxIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVCb2R5LmdyLCBwZWFrLlJBRDIxKVxub3ZlcmxhcC5hbmNob3IuY3RjZiA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBwZWFrLkNUQ0YpXG5vdmVybGFwLmFuY2hvci5yYWQyMSA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBwZWFrLlJBRDIxKVxuXG5sZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmJvZHkuY3RjZikpKVxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ib2R5LnJhZDIxKSkpXG5cbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuYW5jaG9yLmN0Y2YpKSlcbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuYW5jaG9yLnJhZDIxKSkpXG4gIFxuIyMgQ2hlY2tpbmcgb3ZlcmxhcCB3aXRoIGxvb3AgYW5jaG9yIChQRS1QRSlcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwbm8gPC0gZXh0cmFjdEFuY2hvcihiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykpXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gZXh0cmFjdEFuY2hvcihsb29wLmRvd24pXG5cblxub3ZlcmxhcC5ib2R5LnVwbm8gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci51cG5vKVxub3ZlcmxhcC5ib2R5LmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci5kb3duKVxub3ZlcmxhcC5hbmNob3IudXBubyA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBhbmNob3IudXBubylcbm92ZXJsYXAuYW5jaG9yLmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUFuY2hvci5nciwgYW5jaG9yLmRvd24pXG5cbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LnVwbm8pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LmRvd24pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IudXBubykpKVxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci5kb3duKSkpXG5cblxuIyMgQ2hlY2tpbmcgb3ZlcmxhcCB3aXRoIGxvb3AgYW5jaG9yIChBTEwpXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwbm8gPC0gZXh0cmFjdEFuY2hvcihiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykpXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIGV4dHJhY3RBbmNob3IobG9vcC5kb3duKVxuXG5cbm92ZXJsYXAuYm9keS51cG5vIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVCb2R5LmdyLCBhbmNob3IudXBubylcbm92ZXJsYXAuYm9keS5kb3duIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVCb2R5LmdyLCBhbmNob3IuZG93bilcbm92ZXJsYXAuYW5jaG9yLnVwbm8gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUFuY2hvci5nciwgYW5jaG9yLnVwbm8pXG5vdmVybGFwLmFuY2hvci5kb3duIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVBbmNob3IuZ3IsIGFuY2hvci5kb3duKVxuXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS51cG5vKSkpXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS5kb3duKSkpXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLnVwbm8pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IuZG93bikpKVxuXG5cbiMjIENoZWNraW5nIG92ZXJsYXAgd2l0aCBsb29wIGFuY2hvciAoU3RydWN0dXJlKVxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci51cG5vIDwtIGV4dHJhY3RBbmNob3IoYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pKVxuXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSBleHRyYWN0QW5jaG9yKGxvb3AuZG93bilcblxub3ZlcmxhcC5ib2R5LnVwbm8gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci51cG5vKVxub3ZlcmxhcC5ib2R5LmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci5kb3duKVxub3ZlcmxhcC5hbmNob3IudXBubyA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBhbmNob3IudXBubylcbm92ZXJsYXAuYW5jaG9yLmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUFuY2hvci5nciwgYW5jaG9yLmRvd24pXG5cbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LnVwbm8pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LmRvd24pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IudXBubykpKVxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci5kb3duKSkpXG5cblxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkudXBubykpKS9sZW5ndGgoYW5jaG9yLnVwbm8pKjEwMFxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkuZG93bikpKS9sZW5ndGgoYW5jaG9yLmRvd24pKjEwMFxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci51cG5vKSkpL2xlbmd0aChhbmNob3IudXBubykqMTAwXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLmRvd24pKSkvbGVuZ3RoKGFuY2hvci5kb3duKSoxMDBcblxuXG4jIyBDaGVja2luZyBvdmVybGFwIHdpdGggbG9vcCBhbmNob3IgKFJlbGF4ZWRSZWcpXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcmVndWxhdG9yeV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcmVndWxhdG9yeV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXBubyA8LSBleHRyYWN0QW5jaG9yKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSlcblxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcmVndWxhdG9yeV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIGV4dHJhY3RBbmNob3IobG9vcC5kb3duKVxuXG5vdmVybGFwLmJvZHkudXBubyA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQm9keS5nciwgYW5jaG9yLnVwbm8pXG5vdmVybGFwLmJvZHkuZG93biA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQm9keS5nciwgYW5jaG9yLmRvd24pXG5vdmVybGFwLmFuY2hvci51cG5vIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVBbmNob3IuZ3IsIGFuY2hvci51cG5vKVxub3ZlcmxhcC5hbmNob3IuZG93biA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBhbmNob3IuZG93bilcblxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkudXBubykpKVxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkuZG93bikpKVxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci51cG5vKSkpXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLmRvd24pKSlcblxuXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS51cG5vKSkpL2xlbmd0aChhbmNob3IudXBubykqMTAwXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS5kb3duKSkpL2xlbmd0aChhbmNob3IuZG93bikqMTAwXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLnVwbm8pKSkvbGVuZ3RoKGFuY2hvci51cG5vKSoxMDBcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IuZG93bikpKS9sZW5ndGgoYW5jaG9yLmRvd24pKjEwMFxuXG5cblxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuZmxhbmtTaXplIDwtIDFcbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMyksXG4gICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsXG4gICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCwgVjYpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxlbnNlbWJsXFwpXG5cbmJlZC4xIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdyb3VwMSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbmJlZC4yIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdyb3VwMikgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcblxuXG5kYXRhIDwtIGZyZWFkKGhlcmUoXFwuLi8uLlxcLCBcXHJlc3VsdFxcLCBcXHN0cmlwZW5uXFwsIFxccmVzdWx0X2ZpbHRlcmVkLnRzdlxcKSlcblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gd2lkdGgpKSArIGdlb21faGlzdG9ncmFtKCkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYilcblxuXG4jIyBDaGVja2luZyBvdmVybGFwIHdpdGggZ2VuZSBUU1NcblxudHNzIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X1RTUzIuNWtiLmJlZFxcKSlcblxudHNzLmdyb3VwMSA8LSB0c3MgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDEpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpXG5jb2xuYW1lcyh0c3MuZ3JvdXAxKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnRzcy5ncm91cDEuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRzcy5ncm91cDEpXG5cbnRzcy5ncm91cDIgPC0gdHNzICU+JSBkcGx5cjo6ZmlsdGVyKFY2ICVpbiUgZ3JvdXAyKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXModHNzLmdyb3VwMikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG50c3MuZ3JvdXAyLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0c3MuZ3JvdXAyKVxuXG4jIyBBbmNob3Igb2Ygc3RyaXBlc1xudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KGNociwgcG9zMSwgcG9zMilcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuXG5zdHJpcGVBbmNob3IuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5cbm92ZXJsYXAuZ3JvdXAxIDwtIGZpbmRPdmVybGFwcyh0c3MuZ3JvdXAxLmdyLCBzdHJpcGVBbmNob3IuZ3IpXG5vdmVybGFwLmdyb3VwMiA8LSBmaW5kT3ZlcmxhcHModHNzLmdyb3VwMi5nciwgc3RyaXBlQW5jaG9yLmdyKVxuXG5sZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmdyb3VwMSkpKVxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ncm91cDIpKSlcblxuXG4jIyBib2R5IG9mIHN0cmlwZXNcbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChjaHIsIHBvczMsIHBvczQpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcblxuc3RyaXBlQm9keS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcblxub3ZlcmxhcC5ncm91cDEgPC0gZmluZE92ZXJsYXBzKHRzcy5ncm91cDEuZ3IsIHN0cmlwZUJvZHkuZ3IpXG5vdmVybGFwLmdyb3VwMiA8LSBmaW5kT3ZlcmxhcHModHNzLmdyb3VwMi5nciwgc3RyaXBlQm9keS5ncilcblxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ncm91cDEpKSlcbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuZ3JvdXAyKSkpXG5cbiMjIENoZWNraW5nIFJBRDIxL0NUQ0YgcHJlc2VuY2UgYXQgYW5jaG9yXG5vdmVybGFwLmJvZHkuY3RjZiA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQm9keS5nciwgcGVhay5DVENGKVxub3ZlcmxhcC5ib2R5LnJhZDIxIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVCb2R5LmdyLCBwZWFrLlJBRDIxKVxub3ZlcmxhcC5hbmNob3IuY3RjZiA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBwZWFrLkNUQ0YpXG5vdmVybGFwLmFuY2hvci5yYWQyMSA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBwZWFrLlJBRDIxKVxuXG5sZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmJvZHkuY3RjZikpKVxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ib2R5LnJhZDIxKSkpXG5cbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuYW5jaG9yLmN0Y2YpKSlcbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuYW5jaG9yLnJhZDIxKSkpXG4gIFxuIyMgQ2hlY2tpbmcgb3ZlcmxhcCB3aXRoIGxvb3AgYW5jaG9yIChQRS1QRSlcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwbm8gPC0gZXh0cmFjdEFuY2hvcihiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykpXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gZXh0cmFjdEFuY2hvcihsb29wLmRvd24pXG5cblxub3ZlcmxhcC5ib2R5LnVwbm8gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci51cG5vKVxub3ZlcmxhcC5ib2R5LmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci5kb3duKVxub3ZlcmxhcC5hbmNob3IudXBubyA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBhbmNob3IudXBubylcbm92ZXJsYXAuYW5jaG9yLmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUFuY2hvci5nciwgYW5jaG9yLmRvd24pXG5cbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LnVwbm8pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LmRvd24pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IudXBubykpKVxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci5kb3duKSkpXG5cblxuIyMgQ2hlY2tpbmcgb3ZlcmxhcCB3aXRoIGxvb3AgYW5jaG9yIChBTEwpXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwbm8gPC0gZXh0cmFjdEFuY2hvcihiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykpXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIGV4dHJhY3RBbmNob3IobG9vcC5kb3duKVxuXG5cbm92ZXJsYXAuYm9keS51cG5vIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVCb2R5LmdyLCBhbmNob3IudXBubylcbm92ZXJsYXAuYm9keS5kb3duIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVCb2R5LmdyLCBhbmNob3IuZG93bilcbm92ZXJsYXAuYW5jaG9yLnVwbm8gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUFuY2hvci5nciwgYW5jaG9yLnVwbm8pXG5vdmVybGFwLmFuY2hvci5kb3duIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVBbmNob3IuZ3IsIGFuY2hvci5kb3duKVxuXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS51cG5vKSkpXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS5kb3duKSkpXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLnVwbm8pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IuZG93bikpKVxuXG5cbiMjIENoZWNraW5nIG92ZXJsYXAgd2l0aCBsb29wIGFuY2hvciAoU3RydWN0dXJlKVxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci51cG5vIDwtIGV4dHJhY3RBbmNob3IoYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pKVxuXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSBleHRyYWN0QW5jaG9yKGxvb3AuZG93bilcblxub3ZlcmxhcC5ib2R5LnVwbm8gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci51cG5vKVxub3ZlcmxhcC5ib2R5LmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci5kb3duKVxub3ZlcmxhcC5hbmNob3IudXBubyA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBhbmNob3IudXBubylcbm92ZXJsYXAuYW5jaG9yLmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUFuY2hvci5nciwgYW5jaG9yLmRvd24pXG5cbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LnVwbm8pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LmRvd24pKSlcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IudXBubykpKVxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci5kb3duKSkpXG5cblxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkudXBubykpKS9sZW5ndGgoYW5jaG9yLnVwbm8pKjEwMFxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkuZG93bikpKS9sZW5ndGgoYW5jaG9yLmRvd24pKjEwMFxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci51cG5vKSkpL2xlbmd0aChhbmNob3IudXBubykqMTAwXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLmRvd24pKSkvbGVuZ3RoKGFuY2hvci5kb3duKSoxMDBcblxuXG4jIyBDaGVja2luZyBvdmVybGFwIHdpdGggbG9vcCBhbmNob3IgKFJlbGF4ZWRSZWcpXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcmVndWxhdG9yeV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcmVndWxhdG9yeV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXBubyA8LSBleHRyYWN0QW5jaG9yKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSlcblxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcmVndWxhdG9yeV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIGV4dHJhY3RBbmNob3IobG9vcC5kb3duKVxuXG5vdmVybGFwLmJvZHkudXBubyA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQm9keS5nciwgYW5jaG9yLnVwbm8pXG5vdmVybGFwLmJvZHkuZG93biA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQm9keS5nciwgYW5jaG9yLmRvd24pXG5vdmVybGFwLmFuY2hvci51cG5vIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVBbmNob3IuZ3IsIGFuY2hvci51cG5vKVxub3ZlcmxhcC5hbmNob3IuZG93biA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBhbmNob3IuZG93bilcblxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkudXBubykpKVxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkuZG93bikpKVxubGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci51cG5vKSkpXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLmRvd24pKSlcblxuXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS51cG5vKSkpL2xlbmd0aChhbmNob3IudXBubykqMTAwXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS5kb3duKSkpL2xlbmd0aChhbmNob3IuZG93bikqMTAwXG5sZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLnVwbm8pKSkvbGVuZ3RoKGFuY2hvci51cG5vKSoxMDBcbmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IuZG93bikpKS9sZW5ndGgoYW5jaG9yLmRvd24pKjEwMFxuXG5cblxuXG5gYGBcbmBgYCJ9 -->

```r
```r
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

flankSize <- 1
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6)
colnames(gene.tb) <- c(\chr\, \start\, \end\, \ensembl\)

bed.1 <- gene.tb %>% dplyr::filter(ensembl %in% group1) %>% dplyr::select(c(1, 2, 3))
bed.2 <- gene.tb %>% dplyr::filter(ensembl %in% group2) %>% dplyr::select(c(1, 2, 3))


data <- fread(here(\../..\, \result\, \stripenn\, \result_filtered.tsv\))

ggplot(data, aes(x = width)) + geom_histogram() + theme_classic() +
 scale_x_continuous(labels = label_kb_mb)


## Checking overlap with gene TSS

tss <- fread(here(refDir, \mm10_GRCm38.p6_TSS2.5kb.bed\))

tss.group1 <- tss %>% dplyr::filter(V6 %in% group1) %>% dplyr::select(V1, V2, V3)
colnames(tss.group1) <- c(\chr\, \start\, \end\)
tss.group1.gr <- makeGRangesFromDataFrame(tss.group1)

tss.group2 <- tss %>% dplyr::filter(V6 %in% group2) %>% dplyr::select(V1, V2, V3)
colnames(tss.group2) <- c(\chr\, \start\, \end\)
tss.group2.gr <- makeGRangesFromDataFrame(tss.group2)

## Anchor of stripes
temp <- data %>% dplyr::select(chr, pos1, pos2)
colnames(temp) <- c(\chr\, \start\, \end\)

stripeAnchor.gr <- makeGRangesFromDataFrame(temp)

overlap.group1 <- findOverlaps(tss.group1.gr, stripeAnchor.gr)
overlap.group2 <- findOverlaps(tss.group2.gr, stripeAnchor.gr)

length(unique(queryHits(overlap.group1)))
length(unique(queryHits(overlap.group2)))


## body of stripes
temp <- data %>% dplyr::select(chr, pos3, pos4)
colnames(temp) <- c(\chr\, \start\, \end\)

stripeBody.gr <- makeGRangesFromDataFrame(temp)

overlap.group1 <- findOverlaps(tss.group1.gr, stripeBody.gr)
overlap.group2 <- findOverlaps(tss.group2.gr, stripeBody.gr)

length(unique(queryHits(overlap.group1)))
length(unique(queryHits(overlap.group2)))

## Checking RAD21/CTCF presence at anchor
overlap.body.ctcf <- findOverlaps(stripeBody.gr, peak.CTCF)
overlap.body.rad21 <- findOverlaps(stripeBody.gr, peak.RAD21)
overlap.anchor.ctcf <- findOverlaps(stripeAnchor.gr, peak.CTCF)
overlap.anchor.rad21 <- findOverlaps(stripeAnchor.gr, peak.RAD21)

length(unique(queryHits(overlap.body.ctcf)))
length(unique(queryHits(overlap.body.rad21)))

length(unique(queryHits(overlap.anchor.ctcf)))
length(unique(queryHits(overlap.anchor.rad21)))
  
## Checking overlap with loop anchor (PE-PE)
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)


overlap.body.upno <- findOverlaps(stripeBody.gr, anchor.upno)
overlap.body.down <- findOverlaps(stripeBody.gr, anchor.down)
overlap.anchor.upno <- findOverlaps(stripeAnchor.gr, anchor.upno)
overlap.anchor.down <- findOverlaps(stripeAnchor.gr, anchor.down)

length(unique(subjectHits(overlap.body.upno)))
length(unique(subjectHits(overlap.body.down)))
length(unique(subjectHits(overlap.anchor.upno)))
length(unique(subjectHits(overlap.anchor.down)))


## Checking overlap with loop anchor (ALL)
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)


overlap.body.upno <- findOverlaps(stripeBody.gr, anchor.upno)
overlap.body.down <- findOverlaps(stripeBody.gr, anchor.down)
overlap.anchor.upno <- findOverlaps(stripeAnchor.gr, anchor.upno)
overlap.anchor.down <- findOverlaps(stripeAnchor.gr, anchor.down)

length(unique(subjectHits(overlap.body.upno)))
length(unique(subjectHits(overlap.body.down)))
length(unique(subjectHits(overlap.anchor.upno)))
length(unique(subjectHits(overlap.anchor.down)))


## Checking overlap with loop anchor (Structure)
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)

overlap.body.upno <- findOverlaps(stripeBody.gr, anchor.upno)
overlap.body.down <- findOverlaps(stripeBody.gr, anchor.down)
overlap.anchor.upno <- findOverlaps(stripeAnchor.gr, anchor.upno)
overlap.anchor.down <- findOverlaps(stripeAnchor.gr, anchor.down)

length(unique(subjectHits(overlap.body.upno)))
length(unique(subjectHits(overlap.body.down)))
length(unique(subjectHits(overlap.anchor.upno)))
length(unique(subjectHits(overlap.anchor.down)))


length(unique(subjectHits(overlap.body.upno)))/length(anchor.upno)*100
length(unique(subjectHits(overlap.body.down)))/length(anchor.down)*100
length(unique(subjectHits(overlap.anchor.upno)))/length(anchor.upno)*100
length(unique(subjectHits(overlap.anchor.down)))/length(anchor.down)*100


## Checking overlap with loop anchor (RelaxedReg)
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_regulatory_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_regulatory_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_regulatory_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)

overlap.body.upno <- findOverlaps(stripeBody.gr, anchor.upno)
overlap.body.down <- findOverlaps(stripeBody.gr, anchor.down)
overlap.anchor.upno <- findOverlaps(stripeAnchor.gr, anchor.upno)
overlap.anchor.down <- findOverlaps(stripeAnchor.gr, anchor.down)

length(unique(subjectHits(overlap.body.upno)))
length(unique(subjectHits(overlap.body.down)))
length(unique(subjectHits(overlap.anchor.upno)))
length(unique(subjectHits(overlap.anchor.down)))


length(unique(subjectHits(overlap.body.upno)))/length(anchor.upno)*100
length(unique(subjectHits(overlap.body.down)))/length(anchor.down)*100
length(unique(subjectHits(overlap.anchor.upno)))/length(anchor.upno)*100
length(unique(subjectHits(overlap.anchor.down)))/length(anchor.down)*100

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [2.28] Checking gene expression levels of binaryGroup

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjbVZ6ZFd4MGN5QThMU0IwYVdKaWJHVW9hU0E5SUc1MWJXVnlhV01vS1N3Z2RYQnVieUE5SUc1MWJXVnlhV01vS1N3Z1pHOTNiaUE5SUc1MWJXVnlhV01vS1NsY2JseHVabTl5S0drZ2FXNGdjMlZ4S0RFc0lERXdLU2w3WEc0Z0lHUmhkR0VnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2lSSGxzWVc1ZmFIVmlYMlZ6WXk1amMzWmNJaWtwWEc0Z0lGeHVJQ0JrWVhSaExtaDFZaUE4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR0ZzYkY5c1kyOXVJRDRnYVNsY2JpQWdkR1Z0Y0NBOExTQmtZWFJoTG1oMVlpQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLREVzSURJc0lETXBLVnh1SUNCamIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNiaUFnYUhWaUxtRnVZMmh2Y2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb2RHVnRjQ2xjYmlBZ1hHNGdJRnh1SUNCY2JteHZiM0F1ZFhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOWhiR3hmWkZSQlIzWnpSRTFUVDE5VlVGOWthV1ptTUM0eUxtSmxaSEJsWENJcEtWeHViRzl2Y0M1dWJ5QThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYMkZzYkY5a1ZFRkhkbk5FVFZOUFgwNVBYMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BYRzVoYm1Ob2IzSXVkWEJ1YnlBOExTQmxlSFJ5WVdOMFFXNWphRzl5S0dKcGJtUmZjbTkzY3loc2IyOXdMblZ3TENCc2IyOXdMbTV2S1NsY2JseHViRzl2Y0M1a2IzZHVJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmWVd4c1gyUlVRVWQyYzBSTlUwOWZSRTlYVGw5a2FXWm1NQzR5TG1KbFpIQmxYQ0lwS1Z4dVlXNWphRzl5TG1SdmQyNGdQQzBnWlhoMGNtRmpkRUZ1WTJodmNpaHNiMjl3TG1SdmQyNHBYRzVjYmlBZ1hHNGdJRzkyWlhKc1lYQXVkWEJ1YnlBOExTQm1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlMblZ3Ym04c0lHaDFZaTVoYm1Ob2IzSXBYRzRnSUc5MlpYSnNZWEF1Wkc5M2JpQThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG1SdmQyNHNJR2gxWWk1aGJtTm9iM0lwWEc0Z0lGeHVJQ0J1TVNBOExTQnNaVzVuZEdnb2RXNXBjWFZsS0hGMVpYSjVTR2wwY3lodmRtVnliR0Z3TG5Wd2JtOHBLU2xjYmlBZ2JqSWdQQzBnYkdWdVozUm9LSFZ1YVhGMVpTaHhkV1Z5ZVVocGRITW9iM1psY214aGNDNWtiM2R1S1NrcFhHNGdJRnh1SUNCd1pYSmpNU0E4TFNCeWIzVnVaQ2h1TVM5c1pXNW5kR2dvYjNabGNteGhjQzUxY0c1dktTb3hNREFzSURJcFhHNGdJSEJsY21NeUlEd3RJSEp2ZFc1a0tHNHlMMnhsYm1kMGFDaHZkbVZ5YkdGd0xtUnZkMjRwS2pFd01Dd2dNaWxjYmlBZ1hHNGdJSEpsYzNWc2RITWdQQzBnY21WemRXeDBjeUFsUGlVZ1lXUmtYM0p2ZHlocElEMGdhU3dnZFhCdWJ5QTlJSEJsY21NeExDQmtiM2R1SUQwZ2NHVnlZeklwWEc1OVhHNWNibHh1WEc1eVpYTjFiSFJ6WDJ4dmJtY2dQQzBnY21WemRXeDBjeUFsUGlWY2JpQWdjR2wyYjNSZmJHOXVaMlZ5S0dOdmJITWdQU0JqS0hWd2JtOHNJR1J2ZDI0cExDQnVZVzFsYzE5MGJ5QTlJRndpUjNKdmRYQmNJaXdnZG1Gc2RXVnpYM1J2SUQwZ1hDSlFaWEpqWlc1MFlXZGxYQ0lwWEc1Y2JuSmxjM1ZzZEhOZmJHOXVaeVJIY205MWNDQThMU0JtWVdOMGIzSW9jbVZ6ZFd4MGMxOXNiMjVuSkVkeWIzVndMQ0JzWlhabGJITWdQU0JqS0Z3aWRYQnViMXdpTENCY0ltUnZkMjVjSWlrcFhHNGpJRU55WldGMFpTQjBhR1VnWW1GeUlIQnNiM1JjYm1kbmNHeHZkQ2h5WlhOMWJIUnpYMnh2Ym1jc0lHRmxjeWg0SUQwZ1ptRmpkRzl5S0drcExDQjVJRDBnVUdWeVkyVnVkR0ZuWlN3Z1ptbHNiQ0E5SUVkeWIzVndLU2tnSzF4dUlDQm5aVzl0WDJKaGNpaHpkR0YwSUQwZ1hDSnBaR1Z1ZEdsMGVWd2lMQ0J3YjNOcGRHbHZiaUE5SUZ3aVpHOWtaMlZjSWlrZ0sxeHVJQ0JzWVdKektGeHVJQ0FnSUhScGRHeGxJRDBnWENKQmJHd2diRzl2Y0hOY0lpeGNiaUFnSUNCNElEMGdYQ0pRY21WelpXNWpaU0J2WmlCb2RXSWdZVzVqYUc5eUlIZHBkR2dnUG1rZ1kyOXVibVZqZEdsdmJuTmNJaXhjYmlBZ0lDQjVJRDBnWENKUVpYSmpaVzUwWVdkbFhDSmNiaUFnS1NBclhHNGdJSFJvWlcxbFgyMXBibWx0WVd3b0tTQXJYRzRnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSjFjRzV2WENJZ1BTQmNJbUpzZFdWY0lpd2dYQ0prYjNkdVhDSWdQU0JjSW5KbFpGd2lLU2tnSzF4dUlDQjBhR1Z0WlNoaGVHbHpMblJsZUhRdWVDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoaGJtZHNaU0E5SURRMUxDQm9hblZ6ZENBOUlERXBLU0FySUhsc2FXMG9NQ3dnTVRBd0tWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxucmVzdWx0cyA8LSB0aWJibGUoaSA9IG51bWVyaWMoKSwgdXBubyA9IG51bWVyaWMoKSwgZG93biA9IG51bWVyaWMoKSlcblxuZm9yKGkgaW4gc2VxKDEsIDEwKSl7XG4gIGRhdGEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcRHlsYW5faHViX2VzYy5jc3ZcXCkpXG4gIFxuICBkYXRhLmh1YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGFsbF9sY29uID4gaSlcbiAgdGVtcCA8LSBkYXRhLmh1YiAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyh0ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgaHViLmFuY2hvciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcbiAgXG4gIFxuICBcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXBubyA8LSBleHRyYWN0QW5jaG9yKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSlcblxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gZXh0cmFjdEFuY2hvcihsb29wLmRvd24pXG5cbiAgXG4gIG92ZXJsYXAudXBubyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwbm8sIGh1Yi5hbmNob3IpXG4gIG92ZXJsYXAuZG93biA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGh1Yi5hbmNob3IpXG4gIFxuICBuMSA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLnVwbm8pKSlcbiAgbjIgPC0gbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5kb3duKSkpXG4gIFxuICBwZXJjMSA8LSByb3VuZChuMS9sZW5ndGgob3ZlcmxhcC51cG5vKSoxMDAsIDIpXG4gIHBlcmMyIDwtIHJvdW5kKG4yL2xlbmd0aChvdmVybGFwLmRvd24pKjEwMCwgMilcbiAgXG4gIHJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgYWRkX3JvdyhpID0gaSwgdXBubyA9IHBlcmMxLCBkb3duID0gcGVyYzIpXG59XG5cblxuXG5yZXN1bHRzX2xvbmcgPC0gcmVzdWx0cyAlPiVcbiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHVwbm8sIGRvd24pLCBuYW1lc190byA9IFxcR3JvdXBcXCwgdmFsdWVzX3RvID0gXFxQZXJjZW50YWdlXFwpXG5cbnJlc3VsdHNfbG9uZyRHcm91cCA8LSBmYWN0b3IocmVzdWx0c19sb25nJEdyb3VwLCBsZXZlbHMgPSBjKFxcdXBub1xcLCBcXGRvd25cXCkpXG4jIENyZWF0ZSB0aGUgYmFyIHBsb3RcbmdncGxvdChyZXN1bHRzX2xvbmcsIGFlcyh4ID0gZmFjdG9yKGkpLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IEdyb3VwKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBwb3NpdGlvbiA9IFxcZG9kZ2VcXCkgK1xuICBsYWJzKFxuICAgIHRpdGxlID0gXFxBbGwgbG9vcHNcXCxcbiAgICB4ID0gXFxQcmVzZW5jZSBvZiBodWIgYW5jaG9yIHdpdGggPmkgY29ubmVjdGlvbnNcXCxcbiAgICB5ID0gXFxQZXJjZW50YWdlXFxcbiAgKSArXG4gIHRoZW1lX21pbmltYWwoKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFx1cG5vXFwgPSBcXGJsdWVcXCwgXFxkb3duXFwgPSBcXHJlZFxcKSkgK1xuICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArIHlsaW0oMCwgMTAwKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
results <- tibble(i = numeric(), upno = numeric(), down = numeric())

for(i in seq(1, 10)){
  data <- fread(here(refDir, \Dylan_hub_esc.csv\))
  
  data.hub <- data %>% dplyr::filter(all_lcon > i)
  temp <- data.hub %>% dplyr::select(c(1, 2, 3))
  colnames(temp) <- c(\chr\, \start\, \end\)
  hub.anchor <- makeGRangesFromDataFrame(temp)
  
  
  
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)

  
  overlap.upno <- findOverlaps(anchor.upno, hub.anchor)
  overlap.down <- findOverlaps(anchor.down, hub.anchor)
  
  n1 <- length(unique(queryHits(overlap.upno)))
  n2 <- length(unique(queryHits(overlap.down)))
  
  perc1 <- round(n1/length(overlap.upno)*100, 2)
  perc2 <- round(n2/length(overlap.down)*100, 2)
  
  results <- results %>% add_row(i = i, upno = perc1, down = perc2)
}



results_long <- results %>%
  pivot_longer(cols = c(upno, down), names_to = \Group\, values_to = \Percentage\)

results_long$Group <- factor(results_long$Group, levels = c(\upno\, \down\))
# Create the bar plot
ggplot(results_long, aes(x = factor(i), y = Percentage, fill = Group)) +
  geom_bar(stat = \identity\, position = \dodge\) +
  labs(
    title = \All loops\,
    x = \Presence of hub anchor with >i connections\,
    y = \Percentage\
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(\upno\ = \blue\, \down\ = \red\)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + ylim(0, 100)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNtVnpkV3gwY3lBOExTQjBhV0ppYkdVb2FTQTlJRzUxYldWeWFXTW9LU3dnZFhCdWJ5QTlJRzUxYldWeWFXTW9LU3dnWkc5M2JpQTlJRzUxYldWeWFXTW9LU2xjYmx4dVptOXlLR2tnYVc0Z2MyVnhLREVzSURFd0tTbDdYRzRnSUdSaGRHRWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1JIbHNZVzVmYUhWaVgyVnpZeTVqYzNaY1hDa3BYRzRnSUZ4dUlDQmtZWFJoTG1oMVlpQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHRnNiRjlzWTI5dUlENGdhU2xjYmlBZ2RHVnRjQ0E4TFNCa1lYUmhMbWgxWWlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNcEtWeHVJQ0JqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z4Y1kyaHlYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWENsY2JpQWdhSFZpTG1GdVkyaHZjaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvZEdWdGNDbGNiaUFnWEc0Z0lGeHVJQ0JjYm14dmIzQXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5aGJHeGZaRlJCUjNaelJFMVRUMTlWVUY5a2FXWm1NQzR5TG1KbFpIQmxYRndwS1Z4dWJHOXZjQzV1YnlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgyRnNiRjlrVkVGSGRuTkVUVk5QWDA1UFgyUnBabVl3TGpJdVltVmtjR1ZjWENrcFhHNWhibU5vYjNJdWRYQnVieUE4TFNCbGVIUnlZV04wUVc1amFHOXlLR0pwYm1SZmNtOTNjeWhzYjI5d0xuVndMQ0JzYjI5d0xtNXZLU2xjYmx4dWJHOXZjQzVrYjNkdUlEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZZV3hzWDJSVVFVZDJjMFJOVTA5ZlJFOVhUbDlrYVdabU1DNHlMbUpsWkhCbFhGd3BLVnh1WVc1amFHOXlMbVJ2ZDI0Z1BDMGdaWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbVJ2ZDI0cFhHNWNiaUFnWEc0Z0lHOTJaWEpzWVhBdWRYQnVieUE4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxuVndibThzSUdoMVlpNWhibU5vYjNJcFhHNGdJRzkyWlhKc1lYQXVaRzkzYmlBOExTQm1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlMbVJ2ZDI0c0lHaDFZaTVoYm1Ob2IzSXBYRzRnSUZ4dUlDQnVNU0E4TFNCc1pXNW5kR2dvZFc1cGNYVmxLSEYxWlhKNVNHbDBjeWh2ZG1WeWJHRndMblZ3Ym04cEtTbGNiaUFnYmpJZ1BDMGdiR1Z1WjNSb0tIVnVhWEYxWlNoeGRXVnllVWhwZEhNb2IzWmxjbXhoY0M1a2IzZHVLU2twWEc0Z0lGeHVJQ0J3WlhKak1TQThMU0J5YjNWdVpDaHVNUzlzWlc1bmRHZ29iM1psY214aGNDNTFjRzV2S1NveE1EQXNJRElwWEc0Z0lIQmxjbU15SUR3dElISnZkVzVrS0c0eUwyeGxibWQwYUNodmRtVnliR0Z3TG1SdmQyNHBLakV3TUN3Z01pbGNiaUFnWEc0Z0lISmxjM1ZzZEhNZ1BDMGdjbVZ6ZFd4MGN5QWxQaVVnWVdSa1gzSnZkeWhwSUQwZ2FTd2dkWEJ1YnlBOUlIQmxjbU14TENCa2IzZHVJRDBnY0dWeVl6SXBYRzU5WEc1Y2JseHVYRzV5WlhOMWJIUnpYMnh2Ym1jZ1BDMGdjbVZ6ZFd4MGN5QWxQaVZjYmlBZ2NHbDJiM1JmYkc5dVoyVnlLR052YkhNZ1BTQmpLSFZ3Ym04c0lHUnZkMjRwTENCdVlXMWxjMTkwYnlBOUlGeGNSM0p2ZFhCY1hDd2dkbUZzZFdWelgzUnZJRDBnWEZ4UVpYSmpaVzUwWVdkbFhGd3BYRzVjYm5KbGMzVnNkSE5mYkc5dVp5UkhjbTkxY0NBOExTQm1ZV04wYjNJb2NtVnpkV3gwYzE5c2IyNW5KRWR5YjNWd0xDQnNaWFpsYkhNZ1BTQmpLRnhjZFhCdWIxeGNMQ0JjWEdSdmQyNWNYQ2twWEc0aklFTnlaV0YwWlNCMGFHVWdZbUZ5SUhCc2IzUmNibWRuY0d4dmRDaHlaWE4xYkhSelgyeHZibWNzSUdGbGN5aDRJRDBnWm1GamRHOXlLR2twTENCNUlEMGdVR1Z5WTJWdWRHRm5aU3dnWm1sc2JDQTlJRWR5YjNWd0tTa2dLMXh1SUNCblpXOXRYMkpoY2loemRHRjBJRDBnWEZ4cFpHVnVkR2wwZVZ4Y0xDQndiM05wZEdsdmJpQTlJRnhjWkc5a1oyVmNYQ2tnSzF4dUlDQnNZV0p6S0Z4dUlDQWdJSFJwZEd4bElEMGdYRnhCYkd3Z2JHOXZjSE5jWEN4Y2JpQWdJQ0I0SUQwZ1hGeFFjbVZ6Wlc1alpTQnZaaUJvZFdJZ1lXNWphRzl5SUhkcGRHZ2dQbWtnWTI5dWJtVmpkR2x2Ym5OY1hDeGNiaUFnSUNCNUlEMGdYRnhRWlhKalpXNTBZV2RsWEZ4Y2JpQWdLU0FyWEc0Z0lIUm9aVzFsWDIxcGJtbHRZV3dvS1NBclhHNGdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWEZ4MWNHNXZYRndnUFNCY1hHSnNkV1ZjWEN3Z1hGeGtiM2R1WEZ3Z1BTQmNYSEpsWkZ4Y0tTa2dLMXh1SUNCMGFHVnRaU2hoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hoYm1kc1pTQTlJRFExTENCb2FuVnpkQ0E5SURFcEtTQXJJSGxzYVcwb01Dd2dNVEF3S1Z4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbnJlc3VsdHMgPC0gdGliYmxlKGkgPSBudW1lcmljKCksIHVwbm8gPSBudW1lcmljKCksIGRvd24gPSBudW1lcmljKCkpXG5cbmZvcihpIGluIHNlcSgxLCAxMCkpe1xuICBkYXRhIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXER5bGFuX2h1Yl9lc2MuY3N2XFwpKVxuICBcbiAgZGF0YS5odWIgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihhbGxfbGNvbiA+IGkpXG4gIHRlbXAgPC0gZGF0YS5odWIgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbiAgY29sbmFtZXModGVtcCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIGh1Yi5hbmNob3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG4gIFxuICBcbiAgXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwbm8gPC0gZXh0cmFjdEFuY2hvcihiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykpXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIGV4dHJhY3RBbmNob3IobG9vcC5kb3duKVxuXG4gIFxuICBvdmVybGFwLnVwbm8gPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cG5vLCBodWIuYW5jaG9yKVxuICBvdmVybGFwLmRvd24gPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBodWIuYW5jaG9yKVxuICBcbiAgbjEgPC0gbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC51cG5vKSkpXG4gIG4yIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuZG93bikpKVxuICBcbiAgcGVyYzEgPC0gcm91bmQobjEvbGVuZ3RoKG92ZXJsYXAudXBubykqMTAwLCAyKVxuICBwZXJjMiA8LSByb3VuZChuMi9sZW5ndGgob3ZlcmxhcC5kb3duKSoxMDAsIDIpXG4gIFxuICByZXN1bHRzIDwtIHJlc3VsdHMgJT4lIGFkZF9yb3coaSA9IGksIHVwbm8gPSBwZXJjMSwgZG93biA9IHBlcmMyKVxufVxuXG5cblxucmVzdWx0c19sb25nIDwtIHJlc3VsdHMgJT4lXG4gIHBpdm90X2xvbmdlcihjb2xzID0gYyh1cG5vLCBkb3duKSwgbmFtZXNfdG8gPSBcXEdyb3VwXFwsIHZhbHVlc190byA9IFxcUGVyY2VudGFnZVxcKVxuXG5yZXN1bHRzX2xvbmckR3JvdXAgPC0gZmFjdG9yKHJlc3VsdHNfbG9uZyRHcm91cCwgbGV2ZWxzID0gYyhcXHVwbm9cXCwgXFxkb3duXFwpKVxuIyBDcmVhdGUgdGhlIGJhciBwbG90XG5nZ3Bsb3QocmVzdWx0c19sb25nLCBhZXMoeCA9IGZhY3RvcihpKSwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBHcm91cCkpICtcbiAgZ2VvbV9iYXIoc3RhdCA9IFxcaWRlbnRpdHlcXCwgcG9zaXRpb24gPSBcXGRvZGdlXFwpICtcbiAgbGFicyhcbiAgICB0aXRsZSA9IFxcQWxsIGxvb3BzXFwsXG4gICAgeCA9IFxcUHJlc2VuY2Ugb2YgaHViIGFuY2hvciB3aXRoID5pIGNvbm5lY3Rpb25zXFwsXG4gICAgeSA9IFxcUGVyY2VudGFnZVxcXG4gICkgK1xuICB0aGVtZV9taW5pbWFsKCkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcdXBub1xcID0gXFxibHVlXFwsIFxcZG93blxcID0gXFxyZWRcXCkpICtcbiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyB5bGltKDAsIDEwMClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucmVzdWx0cyA8LSB0aWJibGUoaSA9IG51bWVyaWMoKSwgdXBubyA9IG51bWVyaWMoKSwgZG93biA9IG51bWVyaWMoKSlcblxuZm9yKGkgaW4gc2VxKDEsIDEwKSl7XG4gIGRhdGEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcRHlsYW5faHViX2VzYy5jc3ZcXCkpXG4gIFxuICBkYXRhLmh1YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGFsbF9sY29uID4gaSlcbiAgdGVtcCA8LSBkYXRhLmh1YiAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyh0ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgaHViLmFuY2hvciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcbiAgXG4gIFxuICBcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXBubyA8LSBleHRyYWN0QW5jaG9yKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSlcblxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gZXh0cmFjdEFuY2hvcihsb29wLmRvd24pXG5cbiAgXG4gIG92ZXJsYXAudXBubyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwbm8sIGh1Yi5hbmNob3IpXG4gIG92ZXJsYXAuZG93biA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGh1Yi5hbmNob3IpXG4gIFxuICBuMSA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLnVwbm8pKSlcbiAgbjIgPC0gbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5kb3duKSkpXG4gIFxuICBwZXJjMSA8LSByb3VuZChuMS9sZW5ndGgob3ZlcmxhcC51cG5vKSoxMDAsIDIpXG4gIHBlcmMyIDwtIHJvdW5kKG4yL2xlbmd0aChvdmVybGFwLmRvd24pKjEwMCwgMilcbiAgXG4gIHJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgYWRkX3JvdyhpID0gaSwgdXBubyA9IHBlcmMxLCBkb3duID0gcGVyYzIpXG59XG5cblxuXG5yZXN1bHRzX2xvbmcgPC0gcmVzdWx0cyAlPiVcbiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHVwbm8sIGRvd24pLCBuYW1lc190byA9IFxcR3JvdXBcXCwgdmFsdWVzX3RvID0gXFxQZXJjZW50YWdlXFwpXG5cbnJlc3VsdHNfbG9uZyRHcm91cCA8LSBmYWN0b3IocmVzdWx0c19sb25nJEdyb3VwLCBsZXZlbHMgPSBjKFxcdXBub1xcLCBcXGRvd25cXCkpXG4jIENyZWF0ZSB0aGUgYmFyIHBsb3RcbmdncGxvdChyZXN1bHRzX2xvbmcsIGFlcyh4ID0gZmFjdG9yKGkpLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IEdyb3VwKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBwb3NpdGlvbiA9IFxcZG9kZ2VcXCkgK1xuICBsYWJzKFxuICAgIHRpdGxlID0gXFxBbGwgbG9vcHNcXCxcbiAgICB4ID0gXFxQcmVzZW5jZSBvZiBodWIgYW5jaG9yIHdpdGggPmkgY29ubmVjdGlvbnNcXCxcbiAgICB5ID0gXFxQZXJjZW50YWdlXFxcbiAgKSArXG4gIHRoZW1lX21pbmltYWwoKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFx1cG5vXFwgPSBcXGJsdWVcXCwgXFxkb3duXFwgPSBcXHJlZFxcKSkgK1xuICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArIHlsaW0oMCwgMTAwKVxuYGBgXG5gYGAifQ== -->

```r
```r
results <- tibble(i = numeric(), upno = numeric(), down = numeric())

for(i in seq(1, 10)){
  data <- fread(here(refDir, \Dylan_hub_esc.csv\))
  
  data.hub <- data %>% dplyr::filter(all_lcon > i)
  temp <- data.hub %>% dplyr::select(c(1, 2, 3))
  colnames(temp) <- c(\chr\, \start\, \end\)
  hub.anchor <- makeGRangesFromDataFrame(temp)
  
  
  
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_all_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)

  
  overlap.upno <- findOverlaps(anchor.upno, hub.anchor)
  overlap.down <- findOverlaps(anchor.down, hub.anchor)
  
  n1 <- length(unique(queryHits(overlap.upno)))
  n2 <- length(unique(queryHits(overlap.down)))
  
  perc1 <- round(n1/length(overlap.upno)*100, 2)
  perc2 <- round(n2/length(overlap.down)*100, 2)
  
  results <- results %>% add_row(i = i, upno = perc1, down = perc2)
}



results_long <- results %>%
  pivot_longer(cols = c(upno, down), names_to = \Group\, values_to = \Percentage\)

results_long$Group <- factor(results_long$Group, levels = c(\upno\, \down\))
# Create the bar plot
ggplot(results_long, aes(x = factor(i), y = Percentage, fill = Group)) +
  geom_bar(stat = \identity\, position = \dodge\) +
  labs(
    title = \All loops\,
    x = \Presence of hub anchor with >i connections\,
    y = \Percentage\
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(\upno\ = \blue\, \down\ = \red\)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + ylim(0, 100)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [2.29] Checking overlap with Stripes

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHViRzl2Y0M1MWNDQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYM0JsTFhCbFgyUlVRVWQyYzBSTlUwOWZWVkJmWkdsbVpqQXVNaTVpWldSd1pWd2lLU2xjYm14dmIzQXVibThnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlrVkVGSGRuTkVUVk5QWDA1UFgyUnBabVl3TGpJdVltVmtjR1ZjSWlrcFhHNXNiMjl3TG5Wd2JtOGdQQzBnS0dKcGJtUmZjbTkzY3loc2IyOXdMblZ3TENCc2IyOXdMbTV2S1NsY2JseHViRzl2Y0M1a2IzZHVJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZaRlJCUjNaelJFMVRUMTlFVDFkT1gyUnBabVl3TGpJdVltVmtjR1ZjSWlrcFhHNWNibWRsZEU5MlpYSnNZWEJNYjI5d1RuVnRJRHd0SUdaMWJtTjBhVzl1S0d4dmIzQXNJSEJsWVdzcGUxeHVJQ0JoYm1Ob2IzSXhJRHd0SUVkU1lXNW5aWE1vYzJWeGJtRnRaWE1nUFNCc2IyOXdKRll4TENCeVlXNW5aWE1nUFNCSlVtRnVaMlZ6S0hOMFlYSjBJRDBnYkc5dmNDUldNaXdnWlc1a0lEMGdiRzl2Y0NSV015a3BYRzRnSUdGdVkyaHZjaklnUEMwZ1IxSmhibWRsY3loelpYRnVZVzFsY3lBOUlHeHZiM0FrVmpRc0lISmhibWRsY3lBOUlFbFNZVzVuWlhNb2MzUmhjblFnUFNCc2IyOXdKRlkxTENCbGJtUWdQU0JzYjI5d0pGWTJLU2xjYmlBZ1lTQThMU0J4ZFdWeWVVaHBkSE1vWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2pFc0lIQmxZV3NwS1Z4dUlDQmlJRHd0SUhGMVpYSjVTR2wwY3lobWFXNWtUM1psY214aGNITW9ZVzVqYUc5eU1pd2djR1ZoYXlrcFhHNGdJSEpsZEhWeWJpaHNaVzVuZEdnb2RXNXBjWFZsS0dNb1lTd2dZaWtwS1NsY2JuMWNibHh1WjJWMFUwVlBkbVZ5YkdGd1JtbHphR1Z5SUR3dElHWjFibU4wYVc5dUtHRnNiRXh2YjNBc0lITjFZbk5sZEV4dmIzQXNJSEJsWVdzcGUxeHVJQ0JoYkd3dWIzWmxjbXhoY0NBOExTQm5aWFJQZG1WeWJHRndURzl2Y0U1MWJTaGhiR3hNYjI5d0xDQndaV0ZyS1Z4dUlDQmhiR3d1Ym05MFQzWmxjbXhoY0NBOExTQnVjbTkzS0dGc2JFeHZiM0FwSUMwZ1lXeHNMbTkyWlhKc1lYQmNiaUFnWEc0Z0lITjFZbk5sZEM1dmRtVnliR0Z3SUR3dElHZGxkRTkyWlhKc1lYQk1iMjl3VG5WdEtITjFZbk5sZEV4dmIzQXNJSEJsWVdzcFhHNGdJSE4xWW5ObGRDNXViM1JQZG1WeWJHRndJRHd0SUc1eWIzY29jM1ZpYzJWMFRHOXZjQ2tnTFNCemRXSnpaWFF1YjNabGNteGhjRnh1SUNCY2JpQWdZMjl1ZEdsdVoyVnVZM2xmZEdGaWJHVWdQQzBnYldGMGNtbDRLR01vYzNWaWMyVjBMbTkyWlhKc1lYQXNJSE4xWW5ObGRDNXViM1JQZG1WeWJHRndMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhiR3d1YjNabGNteGhjQ3dnWVd4c0xtNXZkRTkyWlhKc1lYQXBMQ0J1Y205M0lEMGdNaXdnWW5seWIzY2dQU0JVVWxWRktWeHVJQ0JqYjJ4dVlXMWxjeWhqYjI1MGFXNW5aVzVqZVY5MFlXSnNaU2tnUEMwZ1l5aGNJazkyWlhKc1lYQndhVzVuWENJc0lGd2lUbTkwWDA5MlpYSnNZWEJ3YVc1blhDSXBYRzRnSUhKdmQyNWhiV1Z6S0dOdmJuUnBibWRsYm1ONVgzUmhZbXhsS1NBOExTQmpLRndpUVd4c0lHeHZiM0J6WENJc0lGd2lVM1ZpYzJWMElHeHZiM0J6WENJcFhHNGdJRnh1SUNBaklGQmxjbVp2Y20wZ1JtbHphR1Z5SjNNZ1JYaGhZM1FnVkdWemRGeHVJQ0JtYVhOb1pYSmZkR1Z6ZEY5eVpYTjFiSFFnUEMwZ1ptbHphR1Z5TG5SbGMzUW9ZMjl1ZEdsdVoyVnVZM2xmZEdGaWJHVXBYRzRnSUhKbGRIVnliaWhtYVhOb1pYSmZkR1Z6ZEY5eVpYTjFiSFFwWEc1OVhHNWNibTVoYldVZ1BDMGdYQ0pqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYQ0pjYm14dmIzQWdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pTNWlaV1J3WlZ3aUtTbGNibHh1WEc1cElEd3RJREpjYm1SaGRHRWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVJIbHNZVzVmYUhWaVgyVnpZeTVqYzNaY0lpa3BYRzVjYm1SaGRHRXVhSFZpSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWVd4c1gyeGpiMjRnUGlCcEtWeHVkR1Z0Y0NBOExTQmtZWFJoTG1oMVlpQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLREVzSURJc0lETXBLVnh1WTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY0ltTm9jbHdpTENCY0luTjBZWEowWENJc0lGd2laVzVrWENJcFhHNW9kV0l1WVc1amFHOXlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2gwWlcxd0tWeHVYRzVjYm5SbGJYQWdQQzBnWjJWMFUwVlBkbVZ5YkdGd1JtbHphR1Z5S0d4dmIzQXNJR3h2YjNBdWRYQnVieXdnYUhWaUxtRnVZMmh2Y2lsY2JuSmxjM1ZzZEM1MFlpQThMU0IwYVdKaWJHVW9iRzl2Y0ZSNWNHVWdQU0JjSWxWUUwwNVBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUmhjbWRsZENBOUlIQmhjM1JsTUNoY0ltaDFZbDljSWl3Z2FTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCMllXeDFaU0E5SUhSbGJYQWtjQzUyWVd4MVpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjJSa2MxSmhkR2x2SUQwZ2RHVnRjQ1JsYzNScGJXRjBaU2xjYm5SbGJYQWdQQzBnWjJWMFUwVlBkbVZ5YkdGd1JtbHphR1Z5S0d4dmIzQXNJR3h2YjNBdVpHOTNiaXdnYUhWaUxtRnVZMmh2Y2lsY2JuSmxjM1ZzZEM1MFlpQThMU0J5WlhOMWJIUXVkR0lnSlQ0bElGeHVJQ0JoWkdSZmNtOTNLR3h2YjNCVWVYQmxJRDBnWENKRVQxZE9YQ0lzWEc0Z0lDQWdJQ0FnSUNBZ2RHRnlaMlYwSUQwZ0lIQmhjM1JsTUNoY0ltaDFZbDljSWl3Z2FTa3NYRzRnSUNBZ0lDQWdJQ0FnY0haaGJIVmxJRDBnZEdWdGNDUndMblpoYkhWbExGeHVJQ0FnSUNBZ0lDQWdJRzlrWkhOU1lYUnBieUE5SUhSbGJYQWtaWE4wYVcxaGRHVXBYRzVjYmx4dVptOXlLR2tnYVc0Z1l5ZzFLU2w3WEc0Z0lHUmhkR0VnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2lSSGxzWVc1ZmFIVmlYMlZ6WXk1amMzWmNJaWtwWEc0Z0lGeHVJQ0JrWVhSaExtaDFZaUE4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR0ZzYkY5c1kyOXVJRDRnYVNsY2JpQWdkR1Z0Y0NBOExTQmtZWFJoTG1oMVlpQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLREVzSURJc0lETXBLVnh1SUNCamIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNiaUFnYUhWaUxtRnVZMmh2Y2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb2RHVnRjQ2xjYmlBZ1hHNGdJRnh1SUNCMFpXMXdJRHd0SUdkbGRGTkZUM1psY214aGNFWnBjMmhsY2loc2IyOXdMQ0JzYjI5d0xuVndibThzSUdoMVlpNWhibU5vYjNJcFhHNGdJSEpsYzNWc2RDNTBZaUE4TFNCeVpYTjFiSFF1ZEdJZ0pUNGxJR0ZrWkY5eWIzY29iRzl2Y0ZSNWNHVWdQU0JjSWxWUUwwNVBYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR0Z5WjJWMElEMGdjR0Z6ZEdVd0tGd2lhSFZpWDF3aUxDQnBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndkbUZzZFdVZ1BTQjBaVzF3SkhBdWRtRnNkV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiMlJrYzFKaGRHbHZJRDBnZEdWdGNDUmxjM1JwYldGMFpTbGNiaUFnZEdWdGNDQThMU0JuWlhSVFJVOTJaWEpzWVhCR2FYTm9aWElvYkc5dmNDd2diRzl2Y0M1a2IzZHVMQ0JvZFdJdVlXNWphRzl5S1Z4dUlDQnlaWE4xYkhRdWRHSWdQQzBnY21WemRXeDBMblJpSUNVK0pTQmNiaUFnSUNCaFpHUmZjbTkzS0d4dmIzQlVlWEJsSUQwZ1hDSkVUMWRPWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwWVhKblpYUWdQU0FnY0dGemRHVXdLRndpYUhWaVgxd2lMQ0JwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJSEIyWVd4MVpTQTlJSFJsYlhBa2NDNTJZV3gxWlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzlrWkhOU1lYUnBieUE5SUhSbGJYQWtaWE4wYVcxaGRHVXBYRzRnSUZ4dUlDQmNibjFjYmx4dWJHbGljbUZ5ZVNoamFYSmpiR2w2WlNsY2JtUmhkR0VnUEMwZ2NtVnpkV3gwTG5SaVhHNW9aV0YwYldGd1gyUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2gwWVhKblpYUXNJR3h2YjNCVWVYQmxMQ0J2WkdSelVtRjBhVzhwSUNVK0pWeHVjR2wyYjNSZmQybGtaWElvYm1GdFpYTmZabkp2YlNBOUlHeHZiM0JVZVhCbExDQjJZV3gxWlhOZlpuSnZiU0E5SUc5a1pITlNZWFJwYnlrZ0pUNGxYRzRnSUdOdmJIVnRibDkwYjE5eWIzZHVZVzFsY3loMllYSWdQU0JjSW5SaGNtZGxkRndpS1Z4dVhHNXdkbUZzZFdWZlpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSFJoY21kbGRDd2diRzl2Y0ZSNWNHVXNJSEIyWVd4MVpTa2dKVDRsWEc0Z0lIQnBkbTkwWDNkcFpHVnlLRzVoYldWelgyWnliMjBnUFNCc2IyOXdWSGx3WlN3Z2RtRnNkV1Z6WDJaeWIyMGdQU0J3ZG1Gc2RXVXBJQ1UrSlZ4dUlDQmpiMngxYlc1ZmRHOWZjbTkzYm1GdFpYTW9kbUZ5SUQwZ1hDSjBZWEpuWlhSY0lpbGNibHh1SXlCamIyeGZablZ1SUR3dElHTnZiRzl5VW1GdGNESW9ZeWd3TENBeExDQXlLU3dnWEc0aklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqS0Z3aVlteDFaVndpTENCY0luZG9hWFJsWENJc0lGd2ljbVZrWENJcEtWeHVYRzVrWVhSaEpIUmhjbWRsZENBOExTQm1ZV04wYjNJb1pHRjBZU1IwWVhKblpYUXNJR3hsZG1Wc2N5QTlJR01vWENKb2RXSmZOVndpTENCY0ltaDFZbDh5WENJcEtWeHVaR0YwWVNSc2IyOXdWSGx3WlNBOExTQm1ZV04wYjNJb1pHRjBZU1JzYjI5d1ZIbHdaU3dnYkdWMlpXeHpJRDBnWXloY0lsVlFMMDVQWENJc0lGd2lSRTlYVGx3aUtTbGNibkFnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdiRzl2Y0ZSNWNHVXNJSGtnUFNCMFlYSm5aWFFzSUhOcGVtVWdQU0F0Ykc5bk1UQW9jSFpoYkhWbEtTd2dabWxzYkNBOUlHOWtaSE5TWVhScGJ5a3BJQ3RjYmlBZ1oyVnZiVjl3YjJsdWRDaHphR0Z3WlNBOUlESXhMQ0FnSUNBZ0lDQWdJeUJGYm5OMWNtVnpJR0VnY0c5cGJuUWdkMmwwYUNCaGJpQnZkWFJzYVc1bFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnYzNSeWIydGxJRDBnTVNwd2RGUnZUVTBnSUNBZ0lDQWpJRXhwYm1VZ2QybGtkR2dnWm05eUlIUm9aU0JpYjNKa1pYSmNiaUFnS1NBcklIUm9aVzFsWDJKM0tDa2dLeUJjYmlBZ2MyTmhiR1ZmYzJsNlpWOWpiMjUwYVc1MWIzVnpLSEpoYm1kbElEMGdZeWd4TENBektTa2dLeUFnSXlCVFpYUWdiV2x1SUdGdVpDQnRZWGdnY0c5cGJuUWdjMmw2WlhNZ2FHVnlaVnh1SUNCelkyRnNaVjltYVd4c1gyZHlZV1JwWlc1MGJpaGpiMnh2Y25NZ1BTQmpLRndpSXpRNE5USkJNRndpTENCY0luZG9hWFJsWENJc0lGd2lJME5DTXpNelFWd2lLU3dnSUNNZ1JHVm1hVzVsSUdkeVlXUnBaVzUwSUdOdmJHOXljMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhiSFZsY3lBOUlITmpZV3hsY3pvNmNtVnpZMkZzWlNoaktEQXVOU3dnTVN3Z01TNDFLU2tzSUd4cGJXbDBjeUE5SUdNb01DNDFMQ0F4TGpVcExDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBamJHOTNJRDBnWENKM2FHbDBaVndpTENCb2FXZG9JRDBnWENJalEwSXpNek5CWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSXlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJXbDBjeUE5SUdNb01Td2dNeWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiMjlpSUQwZ2MyTmhiR1Z6T2pwemNYVnBjMmdzSUNNZ1JHVm1hVzVsSUdkeVlXUnBaVzUwSUdOdmJHOXljMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZDFhV1JsSUQwZ1ozVnBaR1ZmWTI5c2IzSmlZWElvWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpWVhKM2FXUjBhQ0E5SURFdU5TODFMakE0TENBZ0l5QkJaR3AxYzNRZ2QybGtkR2dnYjJZZ2RHaGxJR052Ykc5eUlHSmhjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZ5YUdWcFoyaDBJRDBnTVRVdk5TNHdPQ0FnSUNNZ1FXUnFkWE4wSUdobGFXZG9kQ0J2WmlCMGFHVWdZMjlzYjNJZ1ltRnlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tWeHVJQ0FwSUNzZ2JHRmljeWg0SUQwZ1RsVk1UQ3dnZVNBOUlFNVZURXdwSUNBclhHNGdJSFJvWlcxbEtGeHVJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVk5MRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVk5MRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRdWVDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lDQWdJQ0FnSXlCU2IzUmhkR1VnZUMxaGVHbHpJR3hoWW1Wc2N5QTBOU0JrWldkeVpXVnpYRzRnSUNBZ0lDQm9hblZ6ZENBOUlERXNJQ0FnSUNBZ0lDTWdRV1JxZFhOMElHaHZjbWw2YjI1MFlXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUlDQWdJQ0FnZG1wMWMzUWdQU0F4SUNBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0IyWlhKMGFXTmhiQ0JxZFhOMGFXWnBZMkYwYVc5dVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjSW5SeVlXNXpjR0Z5Wlc1MFhDSXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2xjYmx4dVhHNW1hV3hsVG1GdFpTQThMU0JvWlhKbEtHWnBaMFJwY2l3Z1hDSm9aV0YwYldGd1gyaDFZbDlsYm5KcFkyaHRaVzUwWDJSdmRIQnNiM1JmWVd4c1hDSXBYRzUzYVdSMGFDQThMU0J3WVc1bGJGTnBlbVVvTVM0Mk5Ta3FiVzFVYjBsdVkyaGNibWhsYVdkb2RDQThMU0J3WVc1bGJGTnBlbVVvTVM0eEtTcHRiVlJ2U1c1amFGeHVJeUFqSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaU1nSXlCd2NtbHVkQ2h3S1Z4dUl5QWpJR1JsZGk1dlptWW9LVnh1YzNabmJHbDBaU2h3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC51cG5vIDwtIChiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykpXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuXG5nZXRPdmVybGFwTG9vcE51bSA8LSBmdW5jdGlvbihsb29wLCBwZWFrKXtcbiAgYW5jaG9yMSA8LSBHUmFuZ2VzKHNlcW5hbWVzID0gbG9vcCRWMSwgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGxvb3AkVjIsIGVuZCA9IGxvb3AkVjMpKVxuICBhbmNob3IyIDwtIEdSYW5nZXMoc2VxbmFtZXMgPSBsb29wJFY0LCByYW5nZXMgPSBJUmFuZ2VzKHN0YXJ0ID0gbG9vcCRWNSwgZW5kID0gbG9vcCRWNikpXG4gIGEgPC0gcXVlcnlIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IxLCBwZWFrKSlcbiAgYiA8LSBxdWVyeUhpdHMoZmluZE92ZXJsYXBzKGFuY2hvcjIsIHBlYWspKVxuICByZXR1cm4obGVuZ3RoKHVuaXF1ZShjKGEsIGIpKSkpXG59XG5cbmdldFNFT3ZlcmxhcEZpc2hlciA8LSBmdW5jdGlvbihhbGxMb29wLCBzdWJzZXRMb29wLCBwZWFrKXtcbiAgYWxsLm92ZXJsYXAgPC0gZ2V0T3ZlcmxhcExvb3BOdW0oYWxsTG9vcCwgcGVhaylcbiAgYWxsLm5vdE92ZXJsYXAgPC0gbnJvdyhhbGxMb29wKSAtIGFsbC5vdmVybGFwXG4gIFxuICBzdWJzZXQub3ZlcmxhcCA8LSBnZXRPdmVybGFwTG9vcE51bShzdWJzZXRMb29wLCBwZWFrKVxuICBzdWJzZXQubm90T3ZlcmxhcCA8LSBucm93KHN1YnNldExvb3ApIC0gc3Vic2V0Lm92ZXJsYXBcbiAgXG4gIGNvbnRpbmdlbmN5X3RhYmxlIDwtIG1hdHJpeChjKHN1YnNldC5vdmVybGFwLCBzdWJzZXQubm90T3ZlcmxhcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLm92ZXJsYXAsIGFsbC5ub3RPdmVybGFwKSwgbnJvdyA9IDIsIGJ5cm93ID0gVFJVRSlcbiAgY29sbmFtZXMoY29udGluZ2VuY3lfdGFibGUpIDwtIGMoXFxPdmVybGFwcGluZ1xcLCBcXE5vdF9PdmVybGFwcGluZ1xcKVxuICByb3duYW1lcyhjb250aW5nZW5jeV90YWJsZSkgPC0gYyhcXEFsbCBsb29wc1xcLCBcXFN1YnNldCBsb29wc1xcKVxuICBcbiAgIyBQZXJmb3JtIEZpc2hlcidzIEV4YWN0IFRlc3RcbiAgZmlzaGVyX3Rlc3RfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlKVxuICByZXR1cm4oZmlzaGVyX3Rlc3RfcmVzdWx0KVxufVxuXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5sb29wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGVcXCkpXG5cblxuaSA8LSAyXG5kYXRhIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXER5bGFuX2h1Yl9lc2MuY3N2XFwpKVxuXG5kYXRhLmh1YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGFsbF9sY29uID4gaSlcbnRlbXAgPC0gZGF0YS5odWIgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuaHViLmFuY2hvciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcblxuXG50ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwbm8sIGh1Yi5hbmNob3IpXG5yZXN1bHQudGIgPC0gdGliYmxlKGxvb3BUeXBlID0gXFxVUC9OT1xcLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAoXFxodWJfXFwsIGkpLFxuICAgICAgICAgICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG50ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLmRvd24sIGh1Yi5hbmNob3IpXG5yZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgYWRkX3Jvdyhsb29wVHlwZSA9IFxcRE9XTlxcLFxuICAgICAgICAgIHRhcmdldCA9ICBwYXN0ZTAoXFxodWJfXFwsIGkpLFxuICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuXG5cbmZvcihpIGluIGMoNSkpe1xuICBkYXRhIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXER5bGFuX2h1Yl9lc2MuY3N2XFwpKVxuICBcbiAgZGF0YS5odWIgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihhbGxfbGNvbiA+IGkpXG4gIHRlbXAgPC0gZGF0YS5odWIgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbiAgY29sbmFtZXModGVtcCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIGh1Yi5hbmNob3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG4gIFxuICBcbiAgdGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC51cG5vLCBodWIuYW5jaG9yKVxuICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBhZGRfcm93KGxvb3BUeXBlID0gXFxVUC9OT1xcLFxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMChcXGh1Yl9cXCwgaSksXG4gICAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIHRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AuZG93biwgaHViLmFuY2hvcilcbiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gICAgYWRkX3Jvdyhsb29wVHlwZSA9IFxcRE9XTlxcLFxuICAgICAgICAgICAgdGFyZ2V0ID0gIHBhc3RlMChcXGh1Yl9cXCwgaSksXG4gICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICBcbiAgXG59XG5cbmxpYnJhcnkoY2lyY2xpemUpXG5kYXRhIDwtIHJlc3VsdC50YlxuaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBsb29wVHlwZSwgb2Rkc1JhdGlvKSAlPiVcbnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBsb29wVHlwZSwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxucHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGxvb3BUeXBlLCBwdmFsdWUpICU+JVxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbG9vcFR5cGUsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbiMgY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMiksIFxuIyAgICAgICAgICAgICAgICAgICAgICAgYyhcXGJsdWVcXCwgXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuZGF0YSR0YXJnZXQgPC0gZmFjdG9yKGRhdGEkdGFyZ2V0LCBsZXZlbHMgPSBjKFxcaHViXzVcXCwgXFxodWJfMlxcKSlcbmRhdGEkbG9vcFR5cGUgPC0gZmFjdG9yKGRhdGEkbG9vcFR5cGUsIGxldmVscyA9IGMoXFxVUC9OT1xcLCBcXERPV05cXCkpXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGxvb3BUeXBlLCB5ID0gdGFyZ2V0LCBzaXplID0gLWxvZzEwKHB2YWx1ZSksIGZpbGwgPSBvZGRzUmF0aW8pKSArXG4gIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZVxuICAgICAgICAgICAgIHN0cm9rZSA9IDEqcHRUb01NICAgICAgIyBMaW5lIHdpZHRoIGZvciB0aGUgYm9yZGVyXG4gICkgKyB0aGVtZV9idygpICsgXG4gIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgMykpICsgICMgU2V0IG1pbiBhbmQgbWF4IHBvaW50IHNpemVzIGhlcmVcbiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3JzID0gYyhcXCM0ODUyQTBcXCwgXFx3aGl0ZVxcLCBcXCNDQjMzM0FcXCksICAjIERlZmluZSBncmFkaWVudCBjb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBzY2FsZXM6OnJlc2NhbGUoYygwLjUsIDEsIDEuNSkpLCBsaW1pdHMgPSBjKDAuNSwgMS41KSwgXG4gICAgICAgICAgICAgICAgICAgICAgI2xvdyA9IFxcd2hpdGVcXCwgaGlnaCA9IFxcI0NCMzMzQVxcLFxuICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEsIDMpLFxuICAgICAgICAgICAgICAgICAgICAgIG9vYiA9IHNjYWxlczo6c3F1aXNoLCAjIERlZmluZSBncmFkaWVudCBjb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgKSArIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5cblxuZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIFxcaGVhdG1hcF9odWJfZW5yaWNobWVudF9kb3RwbG90X2FsbFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuNjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMSkqbW1Ub0luY2hcbiMgIyBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4jICMgcHJpbnQocClcbiMgIyBkZXYub2ZmKClcbnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
loop.upno <- (bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))

getOverlapLoopNum <- function(loop, peak){
  anchor1 <- GRanges(seqnames = loop$V1, ranges = IRanges(start = loop$V2, end = loop$V3))
  anchor2 <- GRanges(seqnames = loop$V4, ranges = IRanges(start = loop$V5, end = loop$V6))
  a <- queryHits(findOverlaps(anchor1, peak))
  b <- queryHits(findOverlaps(anchor2, peak))
  return(length(unique(c(a, b))))
}

getSEOverlapFisher <- function(allLoop, subsetLoop, peak){
  all.overlap <- getOverlapLoopNum(allLoop, peak)
  all.notOverlap <- nrow(allLoop) - all.overlap
  
  subset.overlap <- getOverlapLoopNum(subsetLoop, peak)
  subset.notOverlap <- nrow(subsetLoop) - subset.overlap
  
  contingency_table <- matrix(c(subset.overlap, subset.notOverlap,
                                all.overlap, all.notOverlap), nrow = 2, byrow = TRUE)
  colnames(contingency_table) <- c(\Overlapping\, \Not_Overlapping\)
  rownames(contingency_table) <- c(\All loops\, \Subset loops\)
  
  # Perform Fisher's Exact Test
  fisher_test_result <- fisher.test(contingency_table)
  return(fisher_test_result)
}

name <- \chromo_cons_annoHierarchy\
loop <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\))


i <- 2
data <- fread(here(refDir, \Dylan_hub_esc.csv\))

data.hub <- data %>% dplyr::filter(all_lcon > i)
temp <- data.hub %>% dplyr::select(c(1, 2, 3))
colnames(temp) <- c(\chr\, \start\, \end\)
hub.anchor <- makeGRangesFromDataFrame(temp)


temp <- getSEOverlapFisher(loop, loop.upno, hub.anchor)
result.tb <- tibble(loopType = \UP/NO\,
                    target = paste0(\hub_\, i),
                    pvalue = temp$p.value,
                    oddsRatio = temp$estimate)
temp <- getSEOverlapFisher(loop, loop.down, hub.anchor)
result.tb <- result.tb %>% 
  add_row(loopType = \DOWN\,
          target =  paste0(\hub_\, i),
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)


for(i in c(5)){
  data <- fread(here(refDir, \Dylan_hub_esc.csv\))
  
  data.hub <- data %>% dplyr::filter(all_lcon > i)
  temp <- data.hub %>% dplyr::select(c(1, 2, 3))
  colnames(temp) <- c(\chr\, \start\, \end\)
  hub.anchor <- makeGRangesFromDataFrame(temp)
  
  
  temp <- getSEOverlapFisher(loop, loop.upno, hub.anchor)
  result.tb <- result.tb %>% add_row(loopType = \UP/NO\,
                      target = paste0(\hub_\, i),
                      pvalue = temp$p.value,
                      oddsRatio = temp$estimate)
  temp <- getSEOverlapFisher(loop, loop.down, hub.anchor)
  result.tb <- result.tb %>% 
    add_row(loopType = \DOWN\,
            target =  paste0(\hub_\, i),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  
}

library(circlize)
data <- result.tb
heatmap_data <- data %>% dplyr::select(target, loopType, oddsRatio) %>%
pivot_wider(names_from = loopType, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, loopType, pvalue) %>%
  pivot_wider(names_from = loopType, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

# col_fun <- colorRamp2(c(0, 1, 2), 
#                       c(\blue\, \white\, \red\))

data$target <- factor(data$target, levels = c(\hub_5\, \hub_2\))
data$loopType <- factor(data$loopType, levels = c(\UP/NO\, \DOWN\))
p <- ggplot(data, aes(x = loopType, y = target, size = -log10(pvalue), fill = oddsRatio)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(1, 3)) +  # Set min and max point sizes here
  scale_fill_gradientn(colors = c(\#4852A0\, \white\, \#CB333A\),  # Define gradient colors
                      values = scales::rescale(c(0.5, 1, 1.5)), limits = c(0.5, 1.5), 
                      #low = \white\, high = \#CB333A\,
                      #                  limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )


fileName <- here(figDir, \heatmap_hub_enrichment_dotplot_all\)
width <- panelSize(1.65)*mmToInch
height <- panelSize(1.1)*mmToInch
# # png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# # print(p)
# # dev.off()
svglite(paste0(fileName, \.svg\),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJHOXZjQzUxY0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDJSVVFVZDJjMFJOVTA5ZlZWQmZaR2xtWmpBdU1pNWlaV1J3WlZ4Y0tTbGNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pWOWtWRUZIZG5ORVRWTlBYMDVQWDJScFptWXdMakl1WW1Wa2NHVmNYQ2twWEc1c2IyOXdMblZ3Ym04Z1BDMGdLR0pwYm1SZmNtOTNjeWhzYjI5d0xuVndMQ0JzYjI5d0xtNXZLU2xjYmx4dWJHOXZjQzVrYjNkdUlEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjR1V0Y0dWZlpGUkJSM1p6UkUxVFQxOUVUMWRPWDJScFptWXdMakl1WW1Wa2NHVmNYQ2twWEc1Y2JtZGxkRTkyWlhKc1lYQk1iMjl3VG5WdElEd3RJR1oxYm1OMGFXOXVLR3h2YjNBc0lIQmxZV3NwZTF4dUlDQmhibU5vYjNJeElEd3RJRWRTWVc1blpYTW9jMlZ4Ym1GdFpYTWdQU0JzYjI5d0pGWXhMQ0J5WVc1blpYTWdQU0JKVW1GdVoyVnpLSE4wWVhKMElEMGdiRzl2Y0NSV01pd2daVzVrSUQwZ2JHOXZjQ1JXTXlrcFhHNGdJR0Z1WTJodmNqSWdQQzBnUjFKaGJtZGxjeWh6WlhGdVlXMWxjeUE5SUd4dmIzQWtWalFzSUhKaGJtZGxjeUE5SUVsU1lXNW5aWE1vYzNSaGNuUWdQU0JzYjI5d0pGWTFMQ0JsYm1RZ1BTQnNiMjl3SkZZMktTbGNiaUFnWVNBOExTQnhkV1Z5ZVVocGRITW9abWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjakVzSUhCbFlXc3BLVnh1SUNCaUlEd3RJSEYxWlhKNVNHbDBjeWhtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TWl3Z2NHVmhheWtwWEc0Z0lISmxkSFZ5Ymloc1pXNW5kR2dvZFc1cGNYVmxLR01vWVN3Z1lpa3BLU2xjYm4xY2JseHVaMlYwVTBWUGRtVnliR0Z3Um1semFHVnlJRHd0SUdaMWJtTjBhVzl1S0dGc2JFeHZiM0FzSUhOMVluTmxkRXh2YjNBc0lIQmxZV3NwZTF4dUlDQmhiR3d1YjNabGNteGhjQ0E4TFNCblpYUlBkbVZ5YkdGd1RHOXZjRTUxYlNoaGJHeE1iMjl3TENCd1pXRnJLVnh1SUNCaGJHd3VibTkwVDNabGNteGhjQ0E4TFNCdWNtOTNLR0ZzYkV4dmIzQXBJQzBnWVd4c0xtOTJaWEpzWVhCY2JpQWdYRzRnSUhOMVluTmxkQzV2ZG1WeWJHRndJRHd0SUdkbGRFOTJaWEpzWVhCTWIyOXdUblZ0S0hOMVluTmxkRXh2YjNBc0lIQmxZV3NwWEc0Z0lITjFZbk5sZEM1dWIzUlBkbVZ5YkdGd0lEd3RJRzV5YjNjb2MzVmljMlYwVEc5dmNDa2dMU0J6ZFdKelpYUXViM1psY214aGNGeHVJQ0JjYmlBZ1kyOXVkR2x1WjJWdVkzbGZkR0ZpYkdVZ1BDMGdiV0YwY21sNEtHTW9jM1ZpYzJWMExtOTJaWEpzWVhBc0lITjFZbk5sZEM1dWIzUlBkbVZ5YkdGd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaGJHd3ViM1psY214aGNDd2dZV3hzTG01dmRFOTJaWEpzWVhBcExDQnVjbTkzSUQwZ01pd2dZbmx5YjNjZ1BTQlVVbFZGS1Z4dUlDQmpiMnh1WVcxbGN5aGpiMjUwYVc1blpXNWplVjkwWVdKc1pTa2dQQzBnWXloY1hFOTJaWEpzWVhCd2FXNW5YRndzSUZ4Y1RtOTBYMDkyWlhKc1lYQndhVzVuWEZ3cFhHNGdJSEp2ZDI1aGJXVnpLR052Ym5ScGJtZGxibU41WDNSaFlteGxLU0E4TFNCaktGeGNRV3hzSUd4dmIzQnpYRndzSUZ4Y1UzVmljMlYwSUd4dmIzQnpYRndwWEc0Z0lGeHVJQ0FqSUZCbGNtWnZjbTBnUm1semFHVnlKM01nUlhoaFkzUWdWR1Z6ZEZ4dUlDQm1hWE5vWlhKZmRHVnpkRjl5WlhOMWJIUWdQQzBnWm1semFHVnlMblJsYzNRb1kyOXVkR2x1WjJWdVkzbGZkR0ZpYkdVcFhHNGdJSEpsZEhWeWJpaG1hWE5vWlhKZmRHVnpkRjl5WlhOMWJIUXBYRzU5WEc1Y2JtNWhiV1VnUEMwZ1hGeGphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVhGeGNibXh2YjNBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlM1aVpXUndaVnhjS1NsY2JseHVYRzVwSUR3dElESmNibVJoZEdFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjUkhsc1lXNWZhSFZpWDJWell5NWpjM1pjWENrcFhHNWNibVJoZEdFdWFIVmlJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9ZV3hzWDJ4amIyNGdQaUJwS1Z4dWRHVnRjQ0E4TFNCa1lYUmhMbWgxWWlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNcEtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjWEdOb2NseGNMQ0JjWEhOMFlYSjBYRndzSUZ4Y1pXNWtYRndwWEc1b2RXSXVZVzVqYUc5eUlEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaDBaVzF3S1Z4dVhHNWNiblJsYlhBZ1BDMGdaMlYwVTBWUGRtVnliR0Z3Um1semFHVnlLR3h2YjNBc0lHeHZiM0F1ZFhCdWJ5d2dhSFZpTG1GdVkyaHZjaWxjYm5KbGMzVnNkQzUwWWlBOExTQjBhV0ppYkdVb2JHOXZjRlI1Y0dVZ1BTQmNYRlZRTDA1UFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSaGNtZGxkQ0E5SUhCaGMzUmxNQ2hjWEdoMVlsOWNYQ3dnYVNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEIyWVd4MVpTQTlJSFJsYlhBa2NDNTJZV3gxWlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiMlJrYzFKaGRHbHZJRDBnZEdWdGNDUmxjM1JwYldGMFpTbGNiblJsYlhBZ1BDMGdaMlYwVTBWUGRtVnliR0Z3Um1semFHVnlLR3h2YjNBc0lHeHZiM0F1Wkc5M2Jpd2dhSFZpTG1GdVkyaHZjaWxjYm5KbGMzVnNkQzUwWWlBOExTQnlaWE4xYkhRdWRHSWdKVDRsSUZ4dUlDQmhaR1JmY205M0tHeHZiM0JVZVhCbElEMGdYRnhFVDFkT1hGd3NYRzRnSUNBZ0lDQWdJQ0FnZEdGeVoyVjBJRDBnSUhCaGMzUmxNQ2hjWEdoMVlsOWNYQ3dnYVNrc1hHNGdJQ0FnSUNBZ0lDQWdjSFpoYkhWbElEMGdkR1Z0Y0NSd0xuWmhiSFZsTEZ4dUlDQWdJQ0FnSUNBZ0lHOWtaSE5TWVhScGJ5QTlJSFJsYlhBa1pYTjBhVzFoZEdVcFhHNWNibHh1Wm05eUtHa2dhVzRnWXlnMUtTbDdYRzRnSUdSaGRHRWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1JIbHNZVzVmYUhWaVgyVnpZeTVqYzNaY1hDa3BYRzRnSUZ4dUlDQmtZWFJoTG1oMVlpQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHRnNiRjlzWTI5dUlENGdhU2xjYmlBZ2RHVnRjQ0E4TFNCa1lYUmhMbWgxWWlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNcEtWeHVJQ0JqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z4Y1kyaHlYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWENsY2JpQWdhSFZpTG1GdVkyaHZjaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvZEdWdGNDbGNiaUFnWEc0Z0lGeHVJQ0IwWlcxd0lEd3RJR2RsZEZORlQzWmxjbXhoY0VacGMyaGxjaWhzYjI5d0xDQnNiMjl3TG5Wd2JtOHNJR2gxWWk1aGJtTm9iM0lwWEc0Z0lISmxjM1ZzZEM1MFlpQThMU0J5WlhOMWJIUXVkR0lnSlQ0bElHRmtaRjl5YjNjb2JHOXZjRlI1Y0dVZ1BTQmNYRlZRTDA1UFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHRnlaMlYwSUQwZ2NHRnpkR1V3S0Z4Y2FIVmlYMXhjTENCcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd2RtRnNkV1VnUFNCMFpXMXdKSEF1ZG1Gc2RXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IyUmtjMUpoZEdsdklEMGdkR1Z0Y0NSbGMzUnBiV0YwWlNsY2JpQWdkR1Z0Y0NBOExTQm5aWFJUUlU5MlpYSnNZWEJHYVhOb1pYSW9iRzl2Y0N3Z2JHOXZjQzVrYjNkdUxDQm9kV0l1WVc1amFHOXlLVnh1SUNCeVpYTjFiSFF1ZEdJZ1BDMGdjbVZ6ZFd4MExuUmlJQ1UrSlNCY2JpQWdJQ0JoWkdSZmNtOTNLR3h2YjNCVWVYQmxJRDBnWEZ4RVQxZE9YRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQjBZWEpuWlhRZ1BTQWdjR0Z6ZEdVd0tGeGNhSFZpWDF4Y0xDQnBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lIQjJZV3gxWlNBOUlIUmxiWEFrY0M1MllXeDFaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHOWtaSE5TWVhScGJ5QTlJSFJsYlhBa1pYTjBhVzFoZEdVcFhHNGdJRnh1SUNCY2JuMWNibHh1YkdsaWNtRnllU2hqYVhKamJHbDZaU2xjYm1SaGRHRWdQQzBnY21WemRXeDBMblJpWEc1b1pXRjBiV0Z3WDJSaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaDBZWEpuWlhRc0lHeHZiM0JVZVhCbExDQnZaR1J6VW1GMGFXOHBJQ1UrSlZ4dWNHbDJiM1JmZDJsa1pYSW9ibUZ0WlhOZlpuSnZiU0E5SUd4dmIzQlVlWEJsTENCMllXeDFaWE5mWm5KdmJTQTlJRzlrWkhOU1lYUnBieWtnSlQ0bFhHNGdJR052YkhWdGJsOTBiMTl5YjNkdVlXMWxjeWgyWVhJZ1BTQmNYSFJoY21kbGRGeGNLVnh1WEc1d2RtRnNkV1ZmWkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtIUmhjbWRsZEN3Z2JHOXZjRlI1Y0dVc0lIQjJZV3gxWlNrZ0pUNGxYRzRnSUhCcGRtOTBYM2RwWkdWeUtHNWhiV1Z6WDJaeWIyMGdQU0JzYjI5d1ZIbHdaU3dnZG1Gc2RXVnpYMlp5YjIwZ1BTQndkbUZzZFdVcElDVStKVnh1SUNCamIyeDFiVzVmZEc5ZmNtOTNibUZ0WlhNb2RtRnlJRDBnWEZ4MFlYSm5aWFJjWENsY2JseHVJeUJqYjJ4ZlpuVnVJRHd0SUdOdmJHOXlVbUZ0Y0RJb1l5Z3dMQ0F4TENBeUtTd2dYRzRqSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpLRnhjWW14MVpWeGNMQ0JjWEhkb2FYUmxYRndzSUZ4Y2NtVmtYRndwS1Z4dVhHNWtZWFJoSkhSaGNtZGxkQ0E4TFNCbVlXTjBiM0lvWkdGMFlTUjBZWEpuWlhRc0lHeGxkbVZzY3lBOUlHTW9YRnhvZFdKZk5WeGNMQ0JjWEdoMVlsOHlYRndwS1Z4dVpHRjBZU1JzYjI5d1ZIbHdaU0E4TFNCbVlXTjBiM0lvWkdGMFlTUnNiMjl3Vkhsd1pTd2diR1YyWld4eklEMGdZeWhjWEZWUUwwNVBYRndzSUZ4Y1JFOVhUbHhjS1NsY2JuQWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ2JHOXZjRlI1Y0dVc0lIa2dQU0IwWVhKblpYUXNJSE5wZW1VZ1BTQXRiRzluTVRBb2NIWmhiSFZsS1N3Z1ptbHNiQ0E5SUc5a1pITlNZWFJwYnlrcElDdGNiaUFnWjJWdmJWOXdiMmx1ZENoemFHRndaU0E5SURJeExDQWdJQ0FnSUNBZ0l5QkZibk4xY21WeklHRWdjRzlwYm5RZ2QybDBhQ0JoYmlCdmRYUnNhVzVsWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdjM1J5YjJ0bElEMGdNU3B3ZEZSdlRVMGdJQ0FnSUNBaklFeHBibVVnZDJsa2RHZ2dabTl5SUhSb1pTQmliM0prWlhKY2JpQWdLU0FySUhSb1pXMWxYMkozS0NrZ0t5QmNiaUFnYzJOaGJHVmZjMmw2WlY5amIyNTBhVzUxYjNWektISmhibWRsSUQwZ1l5Z3hMQ0F6S1NrZ0t5QWdJeUJUWlhRZ2JXbHVJR0Z1WkNCdFlYZ2djRzlwYm5RZ2MybDZaWE1nYUdWeVpWeHVJQ0J6WTJGc1pWOW1hV3hzWDJkeVlXUnBaVzUwYmloamIyeHZjbk1nUFNCaktGeGNJelE0TlRKQk1GeGNMQ0JjWEhkb2FYUmxYRndzSUZ4Y0kwTkNNek16UVZ4Y0tTd2dJQ01nUkdWbWFXNWxJR2R5WVdScFpXNTBJR052Ykc5eWMxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGJIVmxjeUE5SUhOallXeGxjem82Y21WelkyRnNaU2hqS0RBdU5Td2dNU3dnTVM0MUtTa3NJR3hwYldsMGN5QTlJR01vTUM0MUxDQXhMalVwTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FqYkc5M0lEMGdYRngzYUdsMFpWeGNMQ0JvYVdkb0lEMGdYRndqUTBJek16TkJYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYldsMGN5QTlJR01vTVN3Z015a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IyOWlJRDBnYzJOaGJHVnpPanB6Y1hWcGMyZ3NJQ01nUkdWbWFXNWxJR2R5WVdScFpXNTBJR052Ykc5eWMxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkMWFXUmxJRDBnWjNWcFpHVmZZMjlzYjNKaVlYSW9YRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZWEozYVdSMGFDQTlJREV1TlM4MUxqQTRMQ0FnSXlCQlpHcDFjM1FnZDJsa2RHZ2diMllnZEdobElHTnZiRzl5SUdKaGNseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ltRnlhR1ZwWjJoMElEMGdNVFV2TlM0d09DQWdJQ01nUVdScWRYTjBJR2hsYVdkb2RDQnZaaUIwYUdVZ1kyOXNiM0lnWW1GeVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS1Z4dUlDQXBJQ3NnYkdGaWN5aDRJRDBnVGxWTVRDd2dlU0E5SUU1VlRFd3BJQ0FyWEc0Z0lIUm9aVzFsS0Z4dUlDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUNBZ0lDQWdJeUJTYjNSaGRHVWdlQzFoZUdseklHeGhZbVZzY3lBME5TQmtaV2R5WldWelhHNGdJQ0FnSUNCb2FuVnpkQ0E5SURFc0lDQWdJQ0FnSUNNZ1FXUnFkWE4wSUdodmNtbDZiMjUwWVd3Z2FuVnpkR2xtYVdOaGRHbHZibHh1SUNBZ0lDQWdkbXAxYzNRZ1BTQXhJQ0FnSUNBZ0lDQWpJRUZrYW5WemRDQjJaWEowYVdOaGJDQnFkWE4wYVdacFkyRjBhVzl1WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNYSFJ5WVc1emNHRnlaVzUwWEZ3cExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDbGNibHh1WEc1bWFXeGxUbUZ0WlNBOExTQm9aWEpsS0dacFowUnBjaXdnWEZ4b1pXRjBiV0Z3WDJoMVlsOWxibkpwWTJodFpXNTBYMlJ2ZEhCc2IzUmZZV3hzWEZ3cFhHNTNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NUzQyTlNrcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzR4S1NwdGJWUnZTVzVqYUZ4dUl5QWpJSEJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpTWdJeUJ3Y21sdWRDaHdLVnh1SXlBaklHUmxkaTV2Wm1Zb0tWeHVjM1puYkdsMFpTaHdZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3AudXBubyA8LSAoYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pKVxuXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcblxuZ2V0T3ZlcmxhcExvb3BOdW0gPC0gZnVuY3Rpb24obG9vcCwgcGVhayl7XG4gIGFuY2hvcjEgPC0gR1JhbmdlcyhzZXFuYW1lcyA9IGxvb3AkVjEsIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBsb29wJFYyLCBlbmQgPSBsb29wJFYzKSlcbiAgYW5jaG9yMiA8LSBHUmFuZ2VzKHNlcW5hbWVzID0gbG9vcCRWNCwgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGxvb3AkVjUsIGVuZCA9IGxvb3AkVjYpKVxuICBhIDwtIHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoYW5jaG9yMSwgcGVhaykpXG4gIGIgPC0gcXVlcnlIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IyLCBwZWFrKSlcbiAgcmV0dXJuKGxlbmd0aCh1bmlxdWUoYyhhLCBiKSkpKVxufVxuXG5nZXRTRU92ZXJsYXBGaXNoZXIgPC0gZnVuY3Rpb24oYWxsTG9vcCwgc3Vic2V0TG9vcCwgcGVhayl7XG4gIGFsbC5vdmVybGFwIDwtIGdldE92ZXJsYXBMb29wTnVtKGFsbExvb3AsIHBlYWspXG4gIGFsbC5ub3RPdmVybGFwIDwtIG5yb3coYWxsTG9vcCkgLSBhbGwub3ZlcmxhcFxuICBcbiAgc3Vic2V0Lm92ZXJsYXAgPC0gZ2V0T3ZlcmxhcExvb3BOdW0oc3Vic2V0TG9vcCwgcGVhaylcbiAgc3Vic2V0Lm5vdE92ZXJsYXAgPC0gbnJvdyhzdWJzZXRMb29wKSAtIHN1YnNldC5vdmVybGFwXG4gIFxuICBjb250aW5nZW5jeV90YWJsZSA8LSBtYXRyaXgoYyhzdWJzZXQub3ZlcmxhcCwgc3Vic2V0Lm5vdE92ZXJsYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbC5vdmVybGFwLCBhbGwubm90T3ZlcmxhcCksIG5yb3cgPSAyLCBieXJvdyA9IFRSVUUpXG4gIGNvbG5hbWVzKGNvbnRpbmdlbmN5X3RhYmxlKSA8LSBjKFxcT3ZlcmxhcHBpbmdcXCwgXFxOb3RfT3ZlcmxhcHBpbmdcXClcbiAgcm93bmFtZXMoY29udGluZ2VuY3lfdGFibGUpIDwtIGMoXFxBbGwgbG9vcHNcXCwgXFxTdWJzZXQgbG9vcHNcXClcbiAgXG4gICMgUGVyZm9ybSBGaXNoZXIncyBFeGFjdCBUZXN0XG4gIGZpc2hlcl90ZXN0X3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSlcbiAgcmV0dXJuKGZpc2hlcl90ZXN0X3Jlc3VsdClcbn1cblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxubG9vcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlXFwpKVxuXG5cbmkgPC0gMlxuZGF0YSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxEeWxhbl9odWJfZXNjLmNzdlxcKSlcblxuZGF0YS5odWIgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihhbGxfbGNvbiA+IGkpXG50ZW1wIDwtIGRhdGEuaHViICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbmh1Yi5hbmNob3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5cblxudGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC51cG5vLCBodWIuYW5jaG9yKVxucmVzdWx0LnRiIDwtIHRpYmJsZShsb29wVHlwZSA9IFxcVVAvTk9cXCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKFxcaHViX1xcLCBpKSxcbiAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxudGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5kb3duLCBodWIuYW5jaG9yKVxucmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgXG4gIGFkZF9yb3cobG9vcFR5cGUgPSBcXERPV05cXCxcbiAgICAgICAgICB0YXJnZXQgPSAgcGFzdGUwKFxcaHViX1xcLCBpKSxcbiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcblxuXG5mb3IoaSBpbiBjKDUpKXtcbiAgZGF0YSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxEeWxhbl9odWJfZXNjLmNzdlxcKSlcbiAgXG4gIGRhdGEuaHViIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoYWxsX2xjb24gPiBpKVxuICB0ZW1wIDwtIGRhdGEuaHViICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG4gIGNvbG5hbWVzKHRlbXApIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICBodWIuYW5jaG9yIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxuICBcbiAgXG4gIHRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AudXBubywgaHViLmFuY2hvcilcbiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgYWRkX3Jvdyhsb29wVHlwZSA9IFxcVVAvTk9cXCxcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAoXFxodWJfXFwsIGkpLFxuICAgICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKVxuICB0ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLmRvd24sIGh1Yi5hbmNob3IpXG4gIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICAgIGFkZF9yb3cobG9vcFR5cGUgPSBcXERPV05cXCxcbiAgICAgICAgICAgIHRhcmdldCA9ICBwYXN0ZTAoXFxodWJfXFwsIGkpLFxuICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgXG4gIFxufVxuXG5saWJyYXJ5KGNpcmNsaXplKVxuZGF0YSA8LSByZXN1bHQudGJcbmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgbG9vcFR5cGUsIG9kZHNSYXRpbykgJT4lXG5waXZvdF93aWRlcihuYW1lc19mcm9tID0gbG9vcFR5cGUsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiVcbiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9IFxcdGFyZ2V0XFwpXG5cbnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBsb29wVHlwZSwgcHZhbHVlKSAlPiVcbiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGxvb3BUeXBlLCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG4jIGNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDIpLCBcbiMgICAgICAgICAgICAgICAgICAgICAgIGMoXFxibHVlXFwsIFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cbmRhdGEkdGFyZ2V0IDwtIGZhY3RvcihkYXRhJHRhcmdldCwgbGV2ZWxzID0gYyhcXGh1Yl81XFwsIFxcaHViXzJcXCkpXG5kYXRhJGxvb3BUeXBlIDwtIGZhY3RvcihkYXRhJGxvb3BUeXBlLCBsZXZlbHMgPSBjKFxcVVAvTk9cXCwgXFxET1dOXFwpKVxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBsb29wVHlwZSwgeSA9IHRhcmdldCwgc2l6ZSA9IC1sb2cxMChwdmFsdWUpLCBmaWxsID0gb2Rkc1JhdGlvKSkgK1xuICBnZW9tX3BvaW50KHNoYXBlID0gMjEsICAgICAgICAjIEVuc3VyZXMgYSBwb2ludCB3aXRoIGFuIG91dGxpbmVcbiAgICAgICAgICAgICBzdHJva2UgPSAxKnB0VG9NTSAgICAgICMgTGluZSB3aWR0aCBmb3IgdGhlIGJvcmRlclxuICApICsgdGhlbWVfYncoKSArIFxuICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDMpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlXG4gIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycyA9IGMoXFwjNDg1MkEwXFwsIFxcd2hpdGVcXCwgXFwjQ0IzMzNBXFwpLCAgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gc2NhbGVzOjpyZXNjYWxlKGMoMC41LCAxLCAxLjUpKSwgbGltaXRzID0gYygwLjUsIDEuNSksIFxuICAgICAgICAgICAgICAgICAgICAgICNsb3cgPSBcXHdoaXRlXFwsIGhpZ2ggPSBcXCNDQjMzM0FcXCxcbiAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLCAzKSxcbiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICkgKyBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKVxuXG5cbmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBcXGhlYXRtYXBfaHViX2VucmljaG1lbnRfZG90cGxvdF9hbGxcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjY1KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjEpKm1tVG9JbmNoXG4jICMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuIyAjIHByaW50KHApXG4jICMgZGV2Lm9mZigpXG5zdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSlcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLnVwbm8gPC0gKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSlcblxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5cbmdldE92ZXJsYXBMb29wTnVtIDwtIGZ1bmN0aW9uKGxvb3AsIHBlYWspe1xuICBhbmNob3IxIDwtIEdSYW5nZXMoc2VxbmFtZXMgPSBsb29wJFYxLCByYW5nZXMgPSBJUmFuZ2VzKHN0YXJ0ID0gbG9vcCRWMiwgZW5kID0gbG9vcCRWMykpXG4gIGFuY2hvcjIgPC0gR1JhbmdlcyhzZXFuYW1lcyA9IGxvb3AkVjQsIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBsb29wJFY1LCBlbmQgPSBsb29wJFY2KSlcbiAgYSA8LSBxdWVyeUhpdHMoZmluZE92ZXJsYXBzKGFuY2hvcjEsIHBlYWspKVxuICBiIDwtIHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoYW5jaG9yMiwgcGVhaykpXG4gIHJldHVybihsZW5ndGgodW5pcXVlKGMoYSwgYikpKSlcbn1cblxuZ2V0U0VPdmVybGFwRmlzaGVyIDwtIGZ1bmN0aW9uKGFsbExvb3AsIHN1YnNldExvb3AsIHBlYWspe1xuICBhbGwub3ZlcmxhcCA8LSBnZXRPdmVybGFwTG9vcE51bShhbGxMb29wLCBwZWFrKVxuICBhbGwubm90T3ZlcmxhcCA8LSBucm93KGFsbExvb3ApIC0gYWxsLm92ZXJsYXBcbiAgXG4gIHN1YnNldC5vdmVybGFwIDwtIGdldE92ZXJsYXBMb29wTnVtKHN1YnNldExvb3AsIHBlYWspXG4gIHN1YnNldC5ub3RPdmVybGFwIDwtIG5yb3coc3Vic2V0TG9vcCkgLSBzdWJzZXQub3ZlcmxhcFxuICBcbiAgY29udGluZ2VuY3lfdGFibGUgPC0gbWF0cml4KGMoc3Vic2V0Lm92ZXJsYXAsIHN1YnNldC5ub3RPdmVybGFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwub3ZlcmxhcCwgYWxsLm5vdE92ZXJsYXApLCBucm93ID0gMiwgYnlyb3cgPSBUUlVFKVxuICBjb2xuYW1lcyhjb250aW5nZW5jeV90YWJsZSkgPC0gYyhcXE92ZXJsYXBwaW5nXFwsIFxcTm90X092ZXJsYXBwaW5nXFwpXG4gIHJvd25hbWVzKGNvbnRpbmdlbmN5X3RhYmxlKSA8LSBjKFxcQWxsIGxvb3BzXFwsIFxcU3Vic2V0IGxvb3BzXFwpXG4gIFxuICAjIFBlcmZvcm0gRmlzaGVyJ3MgRXhhY3QgVGVzdFxuICBmaXNoZXJfdGVzdF9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUpXG4gIHJldHVybihmaXNoZXJfdGVzdF9yZXN1bHQpXG59XG5cbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbmxvb3AgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZS5iZWRwZVxcKSlcblxuXG5pIDwtIDJcbmRhdGEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcRHlsYW5faHViX2VzYy5jc3ZcXCkpXG5cbmRhdGEuaHViIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoYWxsX2xjb24gPiBpKVxudGVtcCA8LSBkYXRhLmh1YiAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5odWIuYW5jaG9yIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxuXG5cbnRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AudXBubywgaHViLmFuY2hvcilcbnJlc3VsdC50YiA8LSB0aWJibGUobG9vcFR5cGUgPSBcXFVQL05PXFwsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMChcXGh1Yl9cXCwgaSksXG4gICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbnRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AuZG93biwgaHViLmFuY2hvcilcbnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIFxuICBhZGRfcm93KGxvb3BUeXBlID0gXFxET1dOXFwsXG4gICAgICAgICAgdGFyZ2V0ID0gIHBhc3RlMChcXGh1Yl9cXCwgaSksXG4gICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLFxuICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG5cblxuZm9yKGkgaW4gYyg1KSl7XG4gIGRhdGEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcRHlsYW5faHViX2VzYy5jc3ZcXCkpXG4gIFxuICBkYXRhLmh1YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGFsbF9sY29uID4gaSlcbiAgdGVtcCA8LSBkYXRhLmh1YiAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyh0ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgaHViLmFuY2hvciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcbiAgXG4gIFxuICB0ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwbm8sIGh1Yi5hbmNob3IpXG4gIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIGFkZF9yb3cobG9vcFR5cGUgPSBcXFVQL05PXFwsXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKFxcaHViX1xcLCBpKSxcbiAgICAgICAgICAgICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSlcbiAgdGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5kb3duLCBodWIuYW5jaG9yKVxuICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSBcbiAgICBhZGRfcm93KGxvb3BUeXBlID0gXFxET1dOXFwsXG4gICAgICAgICAgICB0YXJnZXQgPSAgcGFzdGUwKFxcaHViX1xcLCBpKSxcbiAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSxcbiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpXG4gIFxuICBcbn1cblxubGlicmFyeShjaXJjbGl6ZSlcbmRhdGEgPC0gcmVzdWx0LnRiXG5oZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGxvb3BUeXBlLCBvZGRzUmF0aW8pICU+JVxucGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGxvb3BUeXBlLCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lXG4gIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSBcXHRhcmdldFxcKVxuXG5wdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgbG9vcFR5cGUsIHB2YWx1ZSkgJT4lXG4gIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBsb29wVHlwZSwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JVxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFx0YXJnZXRcXClcblxuIyBjb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAyKSwgXG4jICAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5kYXRhJHRhcmdldCA8LSBmYWN0b3IoZGF0YSR0YXJnZXQsIGxldmVscyA9IGMoXFxodWJfNVxcLCBcXGh1Yl8yXFwpKVxuZGF0YSRsb29wVHlwZSA8LSBmYWN0b3IoZGF0YSRsb29wVHlwZSwgbGV2ZWxzID0gYyhcXFVQL05PXFwsIFxcRE9XTlxcKSlcbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gbG9vcFR5cGUsIHkgPSB0YXJnZXQsIHNpemUgPSAtbG9nMTAocHZhbHVlKSwgZmlsbCA9IG9kZHNSYXRpbykpICtcbiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lXG4gICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0gICAgICAjIExpbmUgd2lkdGggZm9yIHRoZSBib3JkZXJcbiAgKSArIHRoZW1lX2J3KCkgKyBcbiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCAzKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZVxuICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnMgPSBjKFxcIzQ4NTJBMFxcLCBcXHdoaXRlXFwsIFxcI0NCMzMzQVxcKSwgICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHNjYWxlczo6cmVzY2FsZShjKDAuNSwgMSwgMS41KSksIGxpbWl0cyA9IGMoMC41LCAxLjUpLCBcbiAgICAgICAgICAgICAgICAgICAgICAjbG93ID0gXFx3aGl0ZVxcLCBoaWdoID0gXFwjQ0IzMzNBXFwsXG4gICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICApICsgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuXG5maWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgXFxoZWF0bWFwX2h1Yl9lbnJpY2htZW50X2RvdHBsb3RfYWxsXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMS42NSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4xKSptbVRvSW5jaFxuIyAjIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiMgIyBwcmludChwKVxuIyAjIGRldi5vZmYoKVxuc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
loop.upno <- (bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))

getOverlapLoopNum <- function(loop, peak){
  anchor1 <- GRanges(seqnames = loop$V1, ranges = IRanges(start = loop$V2, end = loop$V3))
  anchor2 <- GRanges(seqnames = loop$V4, ranges = IRanges(start = loop$V5, end = loop$V6))
  a <- queryHits(findOverlaps(anchor1, peak))
  b <- queryHits(findOverlaps(anchor2, peak))
  return(length(unique(c(a, b))))
}

getSEOverlapFisher <- function(allLoop, subsetLoop, peak){
  all.overlap <- getOverlapLoopNum(allLoop, peak)
  all.notOverlap <- nrow(allLoop) - all.overlap
  
  subset.overlap <- getOverlapLoopNum(subsetLoop, peak)
  subset.notOverlap <- nrow(subsetLoop) - subset.overlap
  
  contingency_table <- matrix(c(subset.overlap, subset.notOverlap,
                                all.overlap, all.notOverlap), nrow = 2, byrow = TRUE)
  colnames(contingency_table) <- c(\Overlapping\, \Not_Overlapping\)
  rownames(contingency_table) <- c(\All loops\, \Subset loops\)
  
  # Perform Fisher's Exact Test
  fisher_test_result <- fisher.test(contingency_table)
  return(fisher_test_result)
}

name <- \chromo_cons_annoHierarchy\
loop <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe.bedpe\))


i <- 2
data <- fread(here(refDir, \Dylan_hub_esc.csv\))

data.hub <- data %>% dplyr::filter(all_lcon > i)
temp <- data.hub %>% dplyr::select(c(1, 2, 3))
colnames(temp) <- c(\chr\, \start\, \end\)
hub.anchor <- makeGRangesFromDataFrame(temp)


temp <- getSEOverlapFisher(loop, loop.upno, hub.anchor)
result.tb <- tibble(loopType = \UP/NO\,
                    target = paste0(\hub_\, i),
                    pvalue = temp$p.value,
                    oddsRatio = temp$estimate)
temp <- getSEOverlapFisher(loop, loop.down, hub.anchor)
result.tb <- result.tb %>% 
  add_row(loopType = \DOWN\,
          target =  paste0(\hub_\, i),
          pvalue = temp$p.value,
          oddsRatio = temp$estimate)


for(i in c(5)){
  data <- fread(here(refDir, \Dylan_hub_esc.csv\))
  
  data.hub <- data %>% dplyr::filter(all_lcon > i)
  temp <- data.hub %>% dplyr::select(c(1, 2, 3))
  colnames(temp) <- c(\chr\, \start\, \end\)
  hub.anchor <- makeGRangesFromDataFrame(temp)
  
  
  temp <- getSEOverlapFisher(loop, loop.upno, hub.anchor)
  result.tb <- result.tb %>% add_row(loopType = \UP/NO\,
                      target = paste0(\hub_\, i),
                      pvalue = temp$p.value,
                      oddsRatio = temp$estimate)
  temp <- getSEOverlapFisher(loop, loop.down, hub.anchor)
  result.tb <- result.tb %>% 
    add_row(loopType = \DOWN\,
            target =  paste0(\hub_\, i),
            pvalue = temp$p.value,
            oddsRatio = temp$estimate)
  
  
}

library(circlize)
data <- result.tb
heatmap_data <- data %>% dplyr::select(target, loopType, oddsRatio) %>%
pivot_wider(names_from = loopType, values_from = oddsRatio) %>%
  column_to_rownames(var = \target\)

pvalue_data <- data %>% dplyr::select(target, loopType, pvalue) %>%
  pivot_wider(names_from = loopType, values_from = pvalue) %>%
  column_to_rownames(var = \target\)

# col_fun <- colorRamp2(c(0, 1, 2), 
#                       c(\blue\, \white\, \red\))

data$target <- factor(data$target, levels = c(\hub_5\, \hub_2\))
data$loopType <- factor(data$loopType, levels = c(\UP/NO\, \DOWN\))
p <- ggplot(data, aes(x = loopType, y = target, size = -log10(pvalue), fill = oddsRatio)) +
  geom_point(shape = 21,        # Ensures a point with an outline
             stroke = 1*ptToMM      # Line width for the border
  ) + theme_bw() + 
  scale_size_continuous(range = c(1, 3)) +  # Set min and max point sizes here
  scale_fill_gradientn(colors = c(\#4852A0\, \white\, \#CB333A\),  # Define gradient colors
                      values = scales::rescale(c(0.5, 1, 1.5)), limits = c(0.5, 1.5), 
                      #low = \white\, high = \#CB333A\,
                      #                  limits = c(1, 3),
                      oob = scales::squish, # Define gradient colors
                      guide = guide_colorbar(
                        barwidth = 1.5/5.08,  # Adjust width of the color bar
                        barheight = 15/5.08   # Adjust height of the color bar
                      )
  ) + labs(x = NULL, y = NULL)  +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )


fileName <- here(figDir, \heatmap_hub_enrichment_dotplot_all\)
width <- panelSize(1.65)*mmToInch
height <- panelSize(1.1)*mmToInch
# # png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
# # print(p)
# # dev.off()
svglite(paste0(fileName, \.svg\),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [2.30] Hubs from Dylan Paper
#### All loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjbVZ6ZFd4MGN5QThMU0IwYVdKaWJHVW9hU0E5SUc1MWJXVnlhV01vS1N3Z2RYQnVieUE5SUc1MWJXVnlhV01vS1N3Z1pHOTNiaUE5SUc1MWJXVnlhV01vS1NsY2JseHVabTl5S0drZ2FXNGdjMlZ4S0RFc0lERXdLU2w3WEc0Z0lHUmhkR0VnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2lSSGxzWVc1ZmFIVmlYMlZ6WXk1amMzWmNJaWtwWEc0Z0lGeHVJQ0JrWVhSaExtaDFZaUE4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR0ZzYkY5c1kyOXVJRDRnYVNsY2JpQWdkR1Z0Y0NBOExTQmtZWFJoTG1oMVlpQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLREVzSURJc0lETXBLVnh1SUNCamIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNiaUFnYUhWaUxtRnVZMmh2Y2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb2RHVnRjQ2xjYmlBZ1hHNGdJRnh1SUNCY2JteHZiM0F1ZFhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5a1ZFRkhkbk5FVFZOUFgxVlFYMlJwWm1Zd0xqSXVZbVZrY0dWY0lpa3BYRzVzYjI5d0xtNXZJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZaRlJCUjNaelJFMVRUMTlPVDE5a2FXWm1NQzR5TG1KbFpIQmxYQ0lwS1Z4dVlXNWphRzl5TG5Wd2JtOGdQQzBnWlhoMGNtRmpkRUZ1WTJodmNpaGlhVzVrWDNKdmQzTW9iRzl2Y0M1MWNDd2diRzl2Y0M1dWJ5a3BYRzVjYm14dmIzQXVaRzkzYmlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzQmxMWEJsWDJSVVFVZDJjMFJOVTA5ZlJFOVhUbDlrYVdabU1DNHlMbUpsWkhCbFhDSXBLVnh1WVc1amFHOXlMbVJ2ZDI0Z1BDMGdaWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbVJ2ZDI0cFhHNWNibHh1SUNCY2JpQWdiM1psY214aGNDNTFjRzV2SUR3dElHWnBibVJQZG1WeWJHRndjeWhoYm1Ob2IzSXVkWEJ1Ynl3Z2FIVmlMbUZ1WTJodmNpbGNiaUFnYjNabGNteGhjQzVrYjNkdUlEd3RJR1pwYm1SUGRtVnliR0Z3Y3loaGJtTm9iM0l1Wkc5M2Jpd2dhSFZpTG1GdVkyaHZjaWxjYmlBZ1hHNGdJRzR4SUR3dElHeGxibWQwYUNoMWJtbHhkV1VvY1hWbGNubElhWFJ6S0c5MlpYSnNZWEF1ZFhCdWJ5a3BLVnh1SUNCdU1pQThMU0JzWlc1bmRHZ29kVzVwY1hWbEtIRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd0xtUnZkMjRwS1NsY2JpQWdYRzRnSUhCbGNtTXhJRHd0SUhKdmRXNWtLRzR4TDJ4bGJtZDBhQ2h2ZG1WeWJHRndMblZ3Ym04cEtqRXdNQ3dnTWlsY2JpQWdjR1Z5WXpJZ1BDMGdjbTkxYm1Rb2JqSXZiR1Z1WjNSb0tHOTJaWEpzWVhBdVpHOTNiaWtxTVRBd0xDQXlLVnh1SUNCY2JpQWdjbVZ6ZFd4MGN5QThMU0J5WlhOMWJIUnpJQ1UrSlNCaFpHUmZjbTkzS0drZ1BTQnBMQ0IxY0c1dklEMGdjR1Z5WXpFc0lHUnZkMjRnUFNCd1pYSmpNaWxjYm4xY2JseHVYRzVjYm5KbGMzVnNkSE5mYkc5dVp5QThMU0J5WlhOMWJIUnpJQ1UrSlZ4dUlDQndhWFp2ZEY5c2IyNW5aWElvWTI5c2N5QTlJR01vZFhCdWJ5d2daRzkzYmlrc0lHNWhiV1Z6WDNSdklEMGdYQ0pIY205MWNGd2lMQ0IyWVd4MVpYTmZkRzhnUFNCY0lsQmxjbU5sYm5SaFoyVmNJaWxjYm5KbGMzVnNkSE5mYkc5dVp5UkhjbTkxY0NBOExTQm1ZV04wYjNJb2NtVnpkV3gwYzE5c2IyNW5KRWR5YjNWd0xDQnNaWFpsYkhNZ1BTQmpLRndpZFhCdWIxd2lMQ0JjSW1SdmQyNWNJaWtwWEc1Y2JpTWdRM0psWVhSbElIUm9aU0JpWVhJZ2NHeHZkRnh1WjJkd2JHOTBLSEpsYzNWc2RITmZiRzl1Wnl3Z1lXVnpLSGdnUFNCbVlXTjBiM0lvYVNrc0lIa2dQU0JRWlhKalpXNTBZV2RsTENCbWFXeHNJRDBnUjNKdmRYQXBLU0FyWEc0Z0lHZGxiMjFmWW1GeUtITjBZWFFnUFNCY0ltbGtaVzUwYVhSNVhDSXNJSEJ2YzJsMGFXOXVJRDBnWENKa2IyUm5aVndpS1NBclhHNGdJR3hoWW5Nb1hHNGdJQ0FnZEdsMGJHVWdQU0JjSWxCRkxWQkZJR3h2YjNCelhDSXNYRzRnSUNBZ2VDQTlJRndpVUhKbGMyVnVZMlVnYjJZZ2FIVmlJR0Z1WTJodmNpQjNhWFJvSUQ1cElHTnZibTVsWTNScGIyNXpYQ0lzWEc0Z0lDQWdlU0E5SUZ3aVVHVnlZMlZ1ZEdGblpWd2lYRzRnSUNrZ0sxeHVJQ0IwYUdWdFpWOXRhVzVwYldGc0tDa2dLMXh1SUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2lkWEJ1YjF3aUlEMGdYQ0ppYkhWbFhDSXNJRndpWkc5M2Jsd2lJRDBnWENKeVpXUmNJaWtwSUN0Y2JpQWdkR2hsYldVb1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1lXNW5iR1VnUFNBME5Td2dhR3AxYzNRZ1BTQXhLU2tnS3lCNWJHbHRLREFzSURFd01DbGNibUJnWUNKOSAtLT5cblxuYGBgclxucmVzdWx0cyA8LSB0aWJibGUoaSA9IG51bWVyaWMoKSwgdXBubyA9IG51bWVyaWMoKSwgZG93biA9IG51bWVyaWMoKSlcblxuZm9yKGkgaW4gc2VxKDEsIDEwKSl7XG4gIGRhdGEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcRHlsYW5faHViX2VzYy5jc3ZcXCkpXG4gIFxuICBkYXRhLmh1YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGFsbF9sY29uID4gaSlcbiAgdGVtcCA8LSBkYXRhLmh1YiAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyh0ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgaHViLmFuY2hvciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcbiAgXG4gIFxuICBcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwbm8gPC0gZXh0cmFjdEFuY2hvcihiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykpXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gZXh0cmFjdEFuY2hvcihsb29wLmRvd24pXG5cblxuICBcbiAgb3ZlcmxhcC51cG5vIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXBubywgaHViLmFuY2hvcilcbiAgb3ZlcmxhcC5kb3duIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgaHViLmFuY2hvcilcbiAgXG4gIG4xIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAudXBubykpKVxuICBuMiA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmRvd24pKSlcbiAgXG4gIHBlcmMxIDwtIHJvdW5kKG4xL2xlbmd0aChvdmVybGFwLnVwbm8pKjEwMCwgMilcbiAgcGVyYzIgPC0gcm91bmQobjIvbGVuZ3RoKG92ZXJsYXAuZG93bikqMTAwLCAyKVxuICBcbiAgcmVzdWx0cyA8LSByZXN1bHRzICU+JSBhZGRfcm93KGkgPSBpLCB1cG5vID0gcGVyYzEsIGRvd24gPSBwZXJjMilcbn1cblxuXG5cbnJlc3VsdHNfbG9uZyA8LSByZXN1bHRzICU+JVxuICBwaXZvdF9sb25nZXIoY29scyA9IGModXBubywgZG93biksIG5hbWVzX3RvID0gXFxHcm91cFxcLCB2YWx1ZXNfdG8gPSBcXFBlcmNlbnRhZ2VcXClcbnJlc3VsdHNfbG9uZyRHcm91cCA8LSBmYWN0b3IocmVzdWx0c19sb25nJEdyb3VwLCBsZXZlbHMgPSBjKFxcdXBub1xcLCBcXGRvd25cXCkpXG5cbiMgQ3JlYXRlIHRoZSBiYXIgcGxvdFxuZ2dwbG90KHJlc3VsdHNfbG9uZywgYWVzKHggPSBmYWN0b3IoaSksIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gR3JvdXApKSArXG4gIGdlb21fYmFyKHN0YXQgPSBcXGlkZW50aXR5XFwsIHBvc2l0aW9uID0gXFxkb2RnZVxcKSArXG4gIGxhYnMoXG4gICAgdGl0bGUgPSBcXFBFLVBFIGxvb3BzXFwsXG4gICAgeCA9IFxcUHJlc2VuY2Ugb2YgaHViIGFuY2hvciB3aXRoID5pIGNvbm5lY3Rpb25zXFwsXG4gICAgeSA9IFxcUGVyY2VudGFnZVxcXG4gICkgK1xuICB0aGVtZV9taW5pbWFsKCkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcdXBub1xcID0gXFxibHVlXFwsIFxcZG93blxcID0gXFxyZWRcXCkpICtcbiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyB5bGltKDAsIDEwMClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
results <- tibble(i = numeric(), upno = numeric(), down = numeric())

for(i in seq(1, 10)){
  data <- fread(here(refDir, \Dylan_hub_esc.csv\))
  
  data.hub <- data %>% dplyr::filter(all_lcon > i)
  temp <- data.hub %>% dplyr::select(c(1, 2, 3))
  colnames(temp) <- c(\chr\, \start\, \end\)
  hub.anchor <- makeGRangesFromDataFrame(temp)
  
  
  
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)


  
  overlap.upno <- findOverlaps(anchor.upno, hub.anchor)
  overlap.down <- findOverlaps(anchor.down, hub.anchor)
  
  n1 <- length(unique(queryHits(overlap.upno)))
  n2 <- length(unique(queryHits(overlap.down)))
  
  perc1 <- round(n1/length(overlap.upno)*100, 2)
  perc2 <- round(n2/length(overlap.down)*100, 2)
  
  results <- results %>% add_row(i = i, upno = perc1, down = perc2)
}



results_long <- results %>%
  pivot_longer(cols = c(upno, down), names_to = \Group\, values_to = \Percentage\)
results_long$Group <- factor(results_long$Group, levels = c(\upno\, \down\))

# Create the bar plot
ggplot(results_long, aes(x = factor(i), y = Percentage, fill = Group)) +
  geom_bar(stat = \identity\, position = \dodge\) +
  labs(
    title = \PE-PE loops\,
    x = \Presence of hub anchor with >i connections\,
    y = \Percentage\
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(\upno\ = \blue\, \down\ = \red\)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + ylim(0, 100)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNtVnpkV3gwY3lBOExTQjBhV0ppYkdVb2FTQTlJRzUxYldWeWFXTW9LU3dnZFhCdWJ5QTlJRzUxYldWeWFXTW9LU3dnWkc5M2JpQTlJRzUxYldWeWFXTW9LU2xjYmx4dVptOXlLR2tnYVc0Z2MyVnhLREVzSURFd0tTbDdYRzRnSUdSaGRHRWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1JIbHNZVzVmYUhWaVgyVnpZeTVqYzNaY1hDa3BYRzRnSUZ4dUlDQmtZWFJoTG1oMVlpQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHRnNiRjlzWTI5dUlENGdhU2xjYmlBZ2RHVnRjQ0E4TFNCa1lYUmhMbWgxWWlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNcEtWeHVJQ0JqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z4Y1kyaHlYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWENsY2JpQWdhSFZpTG1GdVkyaHZjaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvZEdWdGNDbGNiaUFnWEc0Z0lGeHVJQ0JjYm14dmIzQXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlrVkVGSGRuTkVUVk5QWDFWUVgyUnBabVl3TGpJdVltVmtjR1ZjWENrcFhHNXNiMjl3TG01dklEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGZjR1V0Y0dWZlpGUkJSM1p6UkUxVFQxOU9UMTlrYVdabU1DNHlMbUpsWkhCbFhGd3BLVnh1WVc1amFHOXlMblZ3Ym04Z1BDMGdaWGgwY21GamRFRnVZMmh2Y2loaWFXNWtYM0p2ZDNNb2JHOXZjQzUxY0N3Z2JHOXZjQzV1YnlrcFhHNWNibXh2YjNBdVpHOTNiaUE4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNCbExYQmxYMlJVUVVkMmMwUk5VMDlmUkU5WFRsOWthV1ptTUM0eUxtSmxaSEJsWEZ3cEtWeHVZVzVqYUc5eUxtUnZkMjRnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWhzYjI5d0xtUnZkMjRwWEc1Y2JseHVJQ0JjYmlBZ2IzWmxjbXhoY0M1MWNHNXZJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdWRYQnVieXdnYUhWaUxtRnVZMmh2Y2lsY2JpQWdiM1psY214aGNDNWtiM2R1SUR3dElHWnBibVJQZG1WeWJHRndjeWhoYm1Ob2IzSXVaRzkzYml3Z2FIVmlMbUZ1WTJodmNpbGNiaUFnWEc0Z0lHNHhJRHd0SUd4bGJtZDBhQ2gxYm1seGRXVW9jWFZsY25sSWFYUnpLRzkyWlhKc1lYQXVkWEJ1YnlrcEtWeHVJQ0J1TWlBOExTQnNaVzVuZEdnb2RXNXBjWFZsS0hGMVpYSjVTR2wwY3lodmRtVnliR0Z3TG1SdmQyNHBLU2xjYmlBZ1hHNGdJSEJsY21NeElEd3RJSEp2ZFc1a0tHNHhMMnhsYm1kMGFDaHZkbVZ5YkdGd0xuVndibThwS2pFd01Dd2dNaWxjYmlBZ2NHVnlZeklnUEMwZ2NtOTFibVFvYmpJdmJHVnVaM1JvS0c5MlpYSnNZWEF1Wkc5M2Jpa3FNVEF3TENBeUtWeHVJQ0JjYmlBZ2NtVnpkV3gwY3lBOExTQnlaWE4xYkhSeklDVStKU0JoWkdSZmNtOTNLR2tnUFNCcExDQjFjRzV2SUQwZ2NHVnlZekVzSUdSdmQyNGdQU0J3WlhKak1pbGNibjFjYmx4dVhHNWNibkpsYzNWc2RITmZiRzl1WnlBOExTQnlaWE4xYkhSeklDVStKVnh1SUNCd2FYWnZkRjlzYjI1blpYSW9ZMjlzY3lBOUlHTW9kWEJ1Ynl3Z1pHOTNiaWtzSUc1aGJXVnpYM1J2SUQwZ1hGeEhjbTkxY0Z4Y0xDQjJZV3gxWlhOZmRHOGdQU0JjWEZCbGNtTmxiblJoWjJWY1hDbGNibkpsYzNWc2RITmZiRzl1WnlSSGNtOTFjQ0E4TFNCbVlXTjBiM0lvY21WemRXeDBjMTlzYjI1bkpFZHliM1Z3TENCc1pYWmxiSE1nUFNCaktGeGNkWEJ1YjF4Y0xDQmNYR1J2ZDI1Y1hDa3BYRzVjYmlNZ1EzSmxZWFJsSUhSb1pTQmlZWElnY0d4dmRGeHVaMmR3Ykc5MEtISmxjM1ZzZEhOZmJHOXVaeXdnWVdWektIZ2dQU0JtWVdOMGIzSW9hU2tzSUhrZ1BTQlFaWEpqWlc1MFlXZGxMQ0JtYVd4c0lEMGdSM0p2ZFhBcEtTQXJYRzRnSUdkbGIyMWZZbUZ5S0hOMFlYUWdQU0JjWEdsa1pXNTBhWFI1WEZ3c0lIQnZjMmwwYVc5dUlEMGdYRnhrYjJSblpWeGNLU0FyWEc0Z0lHeGhZbk1vWEc0Z0lDQWdkR2wwYkdVZ1BTQmNYRkJGTFZCRklHeHZiM0J6WEZ3c1hHNGdJQ0FnZUNBOUlGeGNVSEpsYzJWdVkyVWdiMllnYUhWaUlHRnVZMmh2Y2lCM2FYUm9JRDVwSUdOdmJtNWxZM1JwYjI1elhGd3NYRzRnSUNBZ2VTQTlJRnhjVUdWeVkyVnVkR0ZuWlZ4Y1hHNGdJQ2tnSzF4dUlDQjBhR1Z0WlY5dGFXNXBiV0ZzS0NrZ0sxeHVJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y2RYQnViMXhjSUQwZ1hGeGliSFZsWEZ3c0lGeGNaRzkzYmx4Y0lEMGdYRnh5WldSY1hDa3BJQ3RjYmlBZ2RHaGxiV1VvWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWVc1bmJHVWdQU0EwTlN3Z2FHcDFjM1FnUFNBeEtTa2dLeUI1YkdsdEtEQXNJREV3TUNsY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbnJlc3VsdHMgPC0gdGliYmxlKGkgPSBudW1lcmljKCksIHVwbm8gPSBudW1lcmljKCksIGRvd24gPSBudW1lcmljKCkpXG5cbmZvcihpIGluIHNlcSgxLCAxMCkpe1xuICBkYXRhIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXER5bGFuX2h1Yl9lc2MuY3N2XFwpKVxuICBcbiAgZGF0YS5odWIgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihhbGxfbGNvbiA+IGkpXG4gIHRlbXAgPC0gZGF0YS5odWIgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbiAgY29sbmFtZXModGVtcCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIGh1Yi5hbmNob3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG4gIFxuICBcbiAgXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci51cG5vIDwtIGV4dHJhY3RBbmNob3IoYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pKVxuXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci5kb3duIDwtIGV4dHJhY3RBbmNob3IobG9vcC5kb3duKVxuXG5cbiAgXG4gIG92ZXJsYXAudXBubyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwbm8sIGh1Yi5hbmNob3IpXG4gIG92ZXJsYXAuZG93biA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGh1Yi5hbmNob3IpXG4gIFxuICBuMSA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLnVwbm8pKSlcbiAgbjIgPC0gbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5kb3duKSkpXG4gIFxuICBwZXJjMSA8LSByb3VuZChuMS9sZW5ndGgob3ZlcmxhcC51cG5vKSoxMDAsIDIpXG4gIHBlcmMyIDwtIHJvdW5kKG4yL2xlbmd0aChvdmVybGFwLmRvd24pKjEwMCwgMilcbiAgXG4gIHJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgYWRkX3JvdyhpID0gaSwgdXBubyA9IHBlcmMxLCBkb3duID0gcGVyYzIpXG59XG5cblxuXG5yZXN1bHRzX2xvbmcgPC0gcmVzdWx0cyAlPiVcbiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHVwbm8sIGRvd24pLCBuYW1lc190byA9IFxcR3JvdXBcXCwgdmFsdWVzX3RvID0gXFxQZXJjZW50YWdlXFwpXG5yZXN1bHRzX2xvbmckR3JvdXAgPC0gZmFjdG9yKHJlc3VsdHNfbG9uZyRHcm91cCwgbGV2ZWxzID0gYyhcXHVwbm9cXCwgXFxkb3duXFwpKVxuXG4jIENyZWF0ZSB0aGUgYmFyIHBsb3RcbmdncGxvdChyZXN1bHRzX2xvbmcsIGFlcyh4ID0gZmFjdG9yKGkpLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IEdyb3VwKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBwb3NpdGlvbiA9IFxcZG9kZ2VcXCkgK1xuICBsYWJzKFxuICAgIHRpdGxlID0gXFxQRS1QRSBsb29wc1xcLFxuICAgIHggPSBcXFByZXNlbmNlIG9mIGh1YiBhbmNob3Igd2l0aCA+aSBjb25uZWN0aW9uc1xcLFxuICAgIHkgPSBcXFBlcmNlbnRhZ2VcXFxuICApICtcbiAgdGhlbWVfbWluaW1hbCgpICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXHVwbm9cXCA9IFxcYmx1ZVxcLCBcXGRvd25cXCA9IFxccmVkXFwpKSArXG4gIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsgeWxpbSgwLCAxMDApXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucmVzdWx0cyA8LSB0aWJibGUoaSA9IG51bWVyaWMoKSwgdXBubyA9IG51bWVyaWMoKSwgZG93biA9IG51bWVyaWMoKSlcblxuZm9yKGkgaW4gc2VxKDEsIDEwKSl7XG4gIGRhdGEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcRHlsYW5faHViX2VzYy5jc3ZcXCkpXG4gIFxuICBkYXRhLmh1YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGFsbF9sY29uID4gaSlcbiAgdGVtcCA8LSBkYXRhLmh1YiAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyh0ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgaHViLmFuY2hvciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcbiAgXG4gIFxuICBcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLnVwbm8gPC0gZXh0cmFjdEFuY2hvcihiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykpXG5cbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gZXh0cmFjdEFuY2hvcihsb29wLmRvd24pXG5cblxuICBcbiAgb3ZlcmxhcC51cG5vIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXBubywgaHViLmFuY2hvcilcbiAgb3ZlcmxhcC5kb3duIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgaHViLmFuY2hvcilcbiAgXG4gIG4xIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAudXBubykpKVxuICBuMiA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmRvd24pKSlcbiAgXG4gIHBlcmMxIDwtIHJvdW5kKG4xL2xlbmd0aChvdmVybGFwLnVwbm8pKjEwMCwgMilcbiAgcGVyYzIgPC0gcm91bmQobjIvbGVuZ3RoKG92ZXJsYXAuZG93bikqMTAwLCAyKVxuICBcbiAgcmVzdWx0cyA8LSByZXN1bHRzICU+JSBhZGRfcm93KGkgPSBpLCB1cG5vID0gcGVyYzEsIGRvd24gPSBwZXJjMilcbn1cblxuXG5cbnJlc3VsdHNfbG9uZyA8LSByZXN1bHRzICU+JVxuICBwaXZvdF9sb25nZXIoY29scyA9IGModXBubywgZG93biksIG5hbWVzX3RvID0gXFxHcm91cFxcLCB2YWx1ZXNfdG8gPSBcXFBlcmNlbnRhZ2VcXClcbnJlc3VsdHNfbG9uZyRHcm91cCA8LSBmYWN0b3IocmVzdWx0c19sb25nJEdyb3VwLCBsZXZlbHMgPSBjKFxcdXBub1xcLCBcXGRvd25cXCkpXG5cbiMgQ3JlYXRlIHRoZSBiYXIgcGxvdFxuZ2dwbG90KHJlc3VsdHNfbG9uZywgYWVzKHggPSBmYWN0b3IoaSksIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gR3JvdXApKSArXG4gIGdlb21fYmFyKHN0YXQgPSBcXGlkZW50aXR5XFwsIHBvc2l0aW9uID0gXFxkb2RnZVxcKSArXG4gIGxhYnMoXG4gICAgdGl0bGUgPSBcXFBFLVBFIGxvb3BzXFwsXG4gICAgeCA9IFxcUHJlc2VuY2Ugb2YgaHViIGFuY2hvciB3aXRoID5pIGNvbm5lY3Rpb25zXFwsXG4gICAgeSA9IFxcUGVyY2VudGFnZVxcXG4gICkgK1xuICB0aGVtZV9taW5pbWFsKCkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcdXBub1xcID0gXFxibHVlXFwsIFxcZG93blxcID0gXFxyZWRcXCkpICtcbiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyB5bGltKDAsIDEwMClcbmBgYFxuYGBgIn0= -->

```r
```r
results <- tibble(i = numeric(), upno = numeric(), down = numeric())

for(i in seq(1, 10)){
  data <- fread(here(refDir, \Dylan_hub_esc.csv\))
  
  data.hub <- data %>% dplyr::filter(all_lcon > i)
  temp <- data.hub %>% dplyr::select(c(1, 2, 3))
  colnames(temp) <- c(\chr\, \start\, \end\)
  hub.anchor <- makeGRangesFromDataFrame(temp)
  
  
  
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)


  
  overlap.upno <- findOverlaps(anchor.upno, hub.anchor)
  overlap.down <- findOverlaps(anchor.down, hub.anchor)
  
  n1 <- length(unique(queryHits(overlap.upno)))
  n2 <- length(unique(queryHits(overlap.down)))
  
  perc1 <- round(n1/length(overlap.upno)*100, 2)
  perc2 <- round(n2/length(overlap.down)*100, 2)
  
  results <- results %>% add_row(i = i, upno = perc1, down = perc2)
}



results_long <- results %>%
  pivot_longer(cols = c(upno, down), names_to = \Group\, values_to = \Percentage\)
results_long$Group <- factor(results_long$Group, levels = c(\upno\, \down\))

# Create the bar plot
ggplot(results_long, aes(x = factor(i), y = Percentage, fill = Group)) +
  geom_bar(stat = \identity\, position = \dodge\) +
  labs(
    title = \PE-PE loops\,
    x = \Presence of hub anchor with >i connections\,
    y = \Percentage\
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(\upno\ = \blue\, \down\ = \red\)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + ylim(0, 100)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### Fishers

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjbVZ6ZFd4MGN5QThMU0IwYVdKaWJHVW9hU0E5SUc1MWJXVnlhV01vS1N3Z2RYQnVieUE5SUc1MWJXVnlhV01vS1N3Z1pHOTNiaUE5SUc1MWJXVnlhV01vS1NsY2JseHVabTl5S0drZ2FXNGdjMlZ4S0RFc0lERXdLU2w3WEc0Z0lHUmhkR0VnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2lSSGxzWVc1ZmFIVmlYMlZ6WXk1amMzWmNJaWtwWEc0Z0lGeHVJQ0JrWVhSaExtaDFZaUE4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR0ZzYkY5c1kyOXVJRDRnYVNsY2JpQWdkR1Z0Y0NBOExTQmtZWFJoTG1oMVlpQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLREVzSURJc0lETXBLVnh1SUNCamIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNiaUFnYUhWaUxtRnVZMmh2Y2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb2RHVnRjQ2xjYmlBZ1hHNGdJRnh1SUNCY2JteHZiM0F1ZFhBZ1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXpkSEoxWTNSMWNtVmZaRlJCUjNaelJFMVRUMTlWVUY5a2FXWm1NQzR5TG1KbFpIQmxYQ0lwS1Z4dWJHOXZjQzV1YnlBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hDSmphSEp2Ylc5ZlkyOXVjMTloYm01dlNHbGxjbUZ5WTJoNVgzTjBjblZqZEhWeVpWOWtWRUZIZG5ORVRWTlBYMDVQWDJScFptWXdMakl1WW1Wa2NHVmNJaWtwWEc1aGJtTm9iM0l1ZFhCdWJ5QThMU0JsZUhSeVlXTjBRVzVqYUc5eUtHSnBibVJmY205M2N5aHNiMjl3TG5Wd0xDQnNiMjl3TG01dktTbGNibHh1Ykc5dmNDNWtiM2R1SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZmMzUnlkV04wZFhKbFgyUlVRVWQyYzBSTlUwOWZSRTlYVGw5a2FXWm1NQzR5TG1KbFpIQmxYQ0lwS1Z4dVlXNWphRzl5TG1SdmQyNGdQQzBnWlhoMGNtRmpkRUZ1WTJodmNpaHNiMjl3TG1SdmQyNHBYRzVjYmlBZ1hHNGdJRzkyWlhKc1lYQXVkWEJ1YnlBOExTQm1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlMblZ3Ym04c0lHaDFZaTVoYm1Ob2IzSXBYRzRnSUc5MlpYSnNZWEF1Wkc5M2JpQThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TG1SdmQyNHNJR2gxWWk1aGJtTm9iM0lwWEc0Z0lGeHVJQ0J1TVNBOExTQnNaVzVuZEdnb2RXNXBjWFZsS0hGMVpYSjVTR2wwY3lodmRtVnliR0Z3TG5Wd2JtOHBLU2xjYmlBZ2JqSWdQQzBnYkdWdVozUm9LSFZ1YVhGMVpTaHhkV1Z5ZVVocGRITW9iM1psY214aGNDNWtiM2R1S1NrcFhHNGdJRnh1SUNCd1pYSmpNU0E4TFNCeWIzVnVaQ2h1TVM5c1pXNW5kR2dvYjNabGNteGhjQzUxY0c1dktTb3hNREFzSURJcFhHNGdJSEJsY21NeUlEd3RJSEp2ZFc1a0tHNHlMMnhsYm1kMGFDaHZkbVZ5YkdGd0xtUnZkMjRwS2pFd01Dd2dNaWxjYmlBZ1hHNGdJSEpsYzNWc2RITWdQQzBnY21WemRXeDBjeUFsUGlVZ1lXUmtYM0p2ZHlocElEMGdhU3dnZFhCdWJ5QTlJSEJsY21NeExDQmtiM2R1SUQwZ2NHVnlZeklwWEc1OVhHNWNibHh1WEc1eVpYTjFiSFJ6WDJ4dmJtY2dQQzBnY21WemRXeDBjeUFsUGlWY2JpQWdjR2wyYjNSZmJHOXVaMlZ5S0dOdmJITWdQU0JqS0hWd2JtOHNJR1J2ZDI0cExDQnVZVzFsYzE5MGJ5QTlJRndpUjNKdmRYQmNJaXdnZG1Gc2RXVnpYM1J2SUQwZ1hDSlFaWEpqWlc1MFlXZGxYQ0lwWEc1eVpYTjFiSFJ6WDJ4dmJtY2tSM0p2ZFhBZ1BDMGdabUZqZEc5eUtISmxjM1ZzZEhOZmJHOXVaeVJIY205MWNDd2diR1YyWld4eklEMGdZeWhjSW5Wd2JtOWNJaXdnWENKa2IzZHVYQ0lwS1Z4dVhHNGpJRU55WldGMFpTQjBhR1VnWW1GeUlIQnNiM1JjYm1kbmNHeHZkQ2h5WlhOMWJIUnpYMnh2Ym1jc0lHRmxjeWg0SUQwZ1ptRmpkRzl5S0drcExDQjVJRDBnVUdWeVkyVnVkR0ZuWlN3Z1ptbHNiQ0E5SUVkeWIzVndLU2tnSzF4dUlDQm5aVzl0WDJKaGNpaHpkR0YwSUQwZ1hDSnBaR1Z1ZEdsMGVWd2lMQ0J3YjNOcGRHbHZiaUE5SUZ3aVpHOWtaMlZjSWlrZ0sxeHVJQ0JzWVdKektGeHVJQ0FnSUhScGRHeGxJRDBnWENKVGRISjFZM1IxY21VZ2JHOXZjSE5jSWl4Y2JpQWdJQ0I0SUQwZ1hDSlFjbVZ6Wlc1alpTQnZaaUJvZFdJZ1lXNWphRzl5SUhkcGRHZ2dQbWtnWTI5dWJtVmpkR2x2Ym5OY0lpeGNiaUFnSUNCNUlEMGdYQ0pRWlhKalpXNTBZV2RsWENKY2JpQWdLU0FyWEc0Z0lIUm9aVzFsWDIxcGJtbHRZV3dvS1NBclhHNGdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENKMWNHNXZYQ0lnUFNCY0ltSnNkV1ZjSWl3Z1hDSmtiM2R1WENJZ1BTQmNJbkpsWkZ3aUtTa2dLMXh1SUNCMGFHVnRaU2hoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hoYm1kc1pTQTlJRFExTENCb2FuVnpkQ0E5SURFcEtTQXJJSGxzYVcwb01Dd2dNVEF3S1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5yZXN1bHRzIDwtIHRpYmJsZShpID0gbnVtZXJpYygpLCB1cG5vID0gbnVtZXJpYygpLCBkb3duID0gbnVtZXJpYygpKVxuXG5mb3IoaSBpbiBzZXEoMSwgMTApKXtcbiAgZGF0YSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxEeWxhbl9odWJfZXNjLmNzdlxcKSlcbiAgXG4gIGRhdGEuaHViIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoYWxsX2xjb24gPiBpKVxuICB0ZW1wIDwtIGRhdGEuaHViICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG4gIGNvbG5hbWVzKHRlbXApIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICBodWIuYW5jaG9yIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxuICBcbiAgXG4gIFxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSlcbmFuY2hvci51cG5vIDwtIGV4dHJhY3RBbmNob3IoYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pKVxuXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IuZG93biA8LSBleHRyYWN0QW5jaG9yKGxvb3AuZG93bilcblxuICBcbiAgb3ZlcmxhcC51cG5vIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXBubywgaHViLmFuY2hvcilcbiAgb3ZlcmxhcC5kb3duIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgaHViLmFuY2hvcilcbiAgXG4gIG4xIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAudXBubykpKVxuICBuMiA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmRvd24pKSlcbiAgXG4gIHBlcmMxIDwtIHJvdW5kKG4xL2xlbmd0aChvdmVybGFwLnVwbm8pKjEwMCwgMilcbiAgcGVyYzIgPC0gcm91bmQobjIvbGVuZ3RoKG92ZXJsYXAuZG93bikqMTAwLCAyKVxuICBcbiAgcmVzdWx0cyA8LSByZXN1bHRzICU+JSBhZGRfcm93KGkgPSBpLCB1cG5vID0gcGVyYzEsIGRvd24gPSBwZXJjMilcbn1cblxuXG5cbnJlc3VsdHNfbG9uZyA8LSByZXN1bHRzICU+JVxuICBwaXZvdF9sb25nZXIoY29scyA9IGModXBubywgZG93biksIG5hbWVzX3RvID0gXFxHcm91cFxcLCB2YWx1ZXNfdG8gPSBcXFBlcmNlbnRhZ2VcXClcbnJlc3VsdHNfbG9uZyRHcm91cCA8LSBmYWN0b3IocmVzdWx0c19sb25nJEdyb3VwLCBsZXZlbHMgPSBjKFxcdXBub1xcLCBcXGRvd25cXCkpXG5cbiMgQ3JlYXRlIHRoZSBiYXIgcGxvdFxuZ2dwbG90KHJlc3VsdHNfbG9uZywgYWVzKHggPSBmYWN0b3IoaSksIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gR3JvdXApKSArXG4gIGdlb21fYmFyKHN0YXQgPSBcXGlkZW50aXR5XFwsIHBvc2l0aW9uID0gXFxkb2RnZVxcKSArXG4gIGxhYnMoXG4gICAgdGl0bGUgPSBcXFN0cnVjdHVyZSBsb29wc1xcLFxuICAgIHggPSBcXFByZXNlbmNlIG9mIGh1YiBhbmNob3Igd2l0aCA+aSBjb25uZWN0aW9uc1xcLFxuICAgIHkgPSBcXFBlcmNlbnRhZ2VcXFxuICApICtcbiAgdGhlbWVfbWluaW1hbCgpICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXHVwbm9cXCA9IFxcYmx1ZVxcLCBcXGRvd25cXCA9IFxccmVkXFwpKSArXG4gIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsgeWxpbSgwLCAxMDApXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
results <- tibble(i = numeric(), upno = numeric(), down = numeric())

for(i in seq(1, 10)){
  data <- fread(here(refDir, \Dylan_hub_esc.csv\))
  
  data.hub <- data %>% dplyr::filter(all_lcon > i)
  temp <- data.hub %>% dplyr::select(c(1, 2, 3))
  colnames(temp) <- c(\chr\, \start\, \end\)
  hub.anchor <- makeGRangesFromDataFrame(temp)
  
  
  
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)

  
  overlap.upno <- findOverlaps(anchor.upno, hub.anchor)
  overlap.down <- findOverlaps(anchor.down, hub.anchor)
  
  n1 <- length(unique(queryHits(overlap.upno)))
  n2 <- length(unique(queryHits(overlap.down)))
  
  perc1 <- round(n1/length(overlap.upno)*100, 2)
  perc2 <- round(n2/length(overlap.down)*100, 2)
  
  results <- results %>% add_row(i = i, upno = perc1, down = perc2)
}



results_long <- results %>%
  pivot_longer(cols = c(upno, down), names_to = \Group\, values_to = \Percentage\)
results_long$Group <- factor(results_long$Group, levels = c(\upno\, \down\))

# Create the bar plot
ggplot(results_long, aes(x = factor(i), y = Percentage, fill = Group)) +
  geom_bar(stat = \identity\, position = \dodge\) +
  labs(
    title = \Structure loops\,
    x = \Presence of hub anchor with >i connections\,
    y = \Percentage\
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(\upno\ = \blue\, \down\ = \red\)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + ylim(0, 100)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNtVnpkV3gwY3lBOExTQjBhV0ppYkdVb2FTQTlJRzUxYldWeWFXTW9LU3dnZFhCdWJ5QTlJRzUxYldWeWFXTW9LU3dnWkc5M2JpQTlJRzUxYldWeWFXTW9LU2xjYmx4dVptOXlLR2tnYVc0Z2MyVnhLREVzSURFd0tTbDdYRzRnSUdSaGRHRWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1JIbHNZVzVmYUhWaVgyVnpZeTVqYzNaY1hDa3BYRzRnSUZ4dUlDQmtZWFJoTG1oMVlpQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHRnNiRjlzWTI5dUlENGdhU2xjYmlBZ2RHVnRjQ0E4TFNCa1lYUmhMbWgxWWlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNcEtWeHVJQ0JqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z4Y1kyaHlYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWENsY2JpQWdhSFZpTG1GdVkyaHZjaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvZEdWdGNDbGNiaUFnWEc0Z0lGeHVJQ0JjYm14dmIzQXVkWEFnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5emRISjFZM1IxY21WZlpGUkJSM1p6UkUxVFQxOVZVRjlrYVdabU1DNHlMbUpsWkhCbFhGd3BLVnh1Ykc5dmNDNXVieUE4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWEZ4amFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WDNOMGNuVmpkSFZ5WlY5a1ZFRkhkbk5FVFZOUFgwNVBYMlJwWm1Zd0xqSXVZbVZrY0dWY1hDa3BYRzVoYm1Ob2IzSXVkWEJ1YnlBOExTQmxlSFJ5WVdOMFFXNWphRzl5S0dKcGJtUmZjbTkzY3loc2IyOXdMblZ3TENCc2IyOXdMbTV2S1NsY2JseHViRzl2Y0M1a2IzZHVJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmYzNSeWRXTjBkWEpsWDJSVVFVZDJjMFJOVTA5ZlJFOVhUbDlrYVdabU1DNHlMbUpsWkhCbFhGd3BLVnh1WVc1amFHOXlMbVJ2ZDI0Z1BDMGdaWGgwY21GamRFRnVZMmh2Y2loc2IyOXdMbVJ2ZDI0cFhHNWNiaUFnWEc0Z0lHOTJaWEpzWVhBdWRYQnVieUE4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxuVndibThzSUdoMVlpNWhibU5vYjNJcFhHNGdJRzkyWlhKc1lYQXVaRzkzYmlBOExTQm1hVzVrVDNabGNteGhjSE1vWVc1amFHOXlMbVJ2ZDI0c0lHaDFZaTVoYm1Ob2IzSXBYRzRnSUZ4dUlDQnVNU0E4TFNCc1pXNW5kR2dvZFc1cGNYVmxLSEYxWlhKNVNHbDBjeWh2ZG1WeWJHRndMblZ3Ym04cEtTbGNiaUFnYmpJZ1BDMGdiR1Z1WjNSb0tIVnVhWEYxWlNoeGRXVnllVWhwZEhNb2IzWmxjbXhoY0M1a2IzZHVLU2twWEc0Z0lGeHVJQ0J3WlhKak1TQThMU0J5YjNWdVpDaHVNUzlzWlc1bmRHZ29iM1psY214aGNDNTFjRzV2S1NveE1EQXNJRElwWEc0Z0lIQmxjbU15SUR3dElISnZkVzVrS0c0eUwyeGxibWQwYUNodmRtVnliR0Z3TG1SdmQyNHBLakV3TUN3Z01pbGNiaUFnWEc0Z0lISmxjM1ZzZEhNZ1BDMGdjbVZ6ZFd4MGN5QWxQaVVnWVdSa1gzSnZkeWhwSUQwZ2FTd2dkWEJ1YnlBOUlIQmxjbU14TENCa2IzZHVJRDBnY0dWeVl6SXBYRzU5WEc1Y2JseHVYRzV5WlhOMWJIUnpYMnh2Ym1jZ1BDMGdjbVZ6ZFd4MGN5QWxQaVZjYmlBZ2NHbDJiM1JmYkc5dVoyVnlLR052YkhNZ1BTQmpLSFZ3Ym04c0lHUnZkMjRwTENCdVlXMWxjMTkwYnlBOUlGeGNSM0p2ZFhCY1hDd2dkbUZzZFdWelgzUnZJRDBnWEZ4UVpYSmpaVzUwWVdkbFhGd3BYRzV5WlhOMWJIUnpYMnh2Ym1ja1IzSnZkWEFnUEMwZ1ptRmpkRzl5S0hKbGMzVnNkSE5mYkc5dVp5UkhjbTkxY0N3Z2JHVjJaV3h6SUQwZ1l5aGNYSFZ3Ym05Y1hDd2dYRnhrYjNkdVhGd3BLVnh1WEc0aklFTnlaV0YwWlNCMGFHVWdZbUZ5SUhCc2IzUmNibWRuY0d4dmRDaHlaWE4xYkhSelgyeHZibWNzSUdGbGN5aDRJRDBnWm1GamRHOXlLR2twTENCNUlEMGdVR1Z5WTJWdWRHRm5aU3dnWm1sc2JDQTlJRWR5YjNWd0tTa2dLMXh1SUNCblpXOXRYMkpoY2loemRHRjBJRDBnWEZ4cFpHVnVkR2wwZVZ4Y0xDQndiM05wZEdsdmJpQTlJRnhjWkc5a1oyVmNYQ2tnSzF4dUlDQnNZV0p6S0Z4dUlDQWdJSFJwZEd4bElEMGdYRnhUZEhKMVkzUjFjbVVnYkc5dmNITmNYQ3hjYmlBZ0lDQjRJRDBnWEZ4UWNtVnpaVzVqWlNCdlppQm9kV0lnWVc1amFHOXlJSGRwZEdnZ1Bta2dZMjl1Ym1WamRHbHZibk5jWEN4Y2JpQWdJQ0I1SUQwZ1hGeFFaWEpqWlc1MFlXZGxYRnhjYmlBZ0tTQXJYRzRnSUhSb1pXMWxYMjFwYm1sdFlXd29LU0FyWEc0Z0lITmpZV3hsWDJacGJHeGZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YRngxY0c1dlhGd2dQU0JjWEdKc2RXVmNYQ3dnWEZ4a2IzZHVYRndnUFNCY1hISmxaRnhjS1NrZ0sxeHVJQ0IwYUdWdFpTaGhlR2x6TG5SbGVIUXVlQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGhibWRzWlNBOUlEUTFMQ0JvYW5WemRDQTlJREVwS1NBcklIbHNhVzBvTUN3Z01UQXdLVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxucmVzdWx0cyA8LSB0aWJibGUoaSA9IG51bWVyaWMoKSwgdXBubyA9IG51bWVyaWMoKSwgZG93biA9IG51bWVyaWMoKSlcblxuZm9yKGkgaW4gc2VxKDEsIDEwKSl7XG4gIGRhdGEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcRHlsYW5faHViX2VzYy5jc3ZcXCkpXG4gIFxuICBkYXRhLmh1YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGFsbF9sY29uID4gaSlcbiAgdGVtcCA8LSBkYXRhLmh1YiAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyh0ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgaHViLmFuY2hvciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcbiAgXG4gIFxuICBcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXBubyA8LSBleHRyYWN0QW5jaG9yKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSlcblxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gZXh0cmFjdEFuY2hvcihsb29wLmRvd24pXG5cbiAgXG4gIG92ZXJsYXAudXBubyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwbm8sIGh1Yi5hbmNob3IpXG4gIG92ZXJsYXAuZG93biA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGh1Yi5hbmNob3IpXG4gIFxuICBuMSA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLnVwbm8pKSlcbiAgbjIgPC0gbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5kb3duKSkpXG4gIFxuICBwZXJjMSA8LSByb3VuZChuMS9sZW5ndGgob3ZlcmxhcC51cG5vKSoxMDAsIDIpXG4gIHBlcmMyIDwtIHJvdW5kKG4yL2xlbmd0aChvdmVybGFwLmRvd24pKjEwMCwgMilcbiAgXG4gIHJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgYWRkX3JvdyhpID0gaSwgdXBubyA9IHBlcmMxLCBkb3duID0gcGVyYzIpXG59XG5cblxuXG5yZXN1bHRzX2xvbmcgPC0gcmVzdWx0cyAlPiVcbiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHVwbm8sIGRvd24pLCBuYW1lc190byA9IFxcR3JvdXBcXCwgdmFsdWVzX3RvID0gXFxQZXJjZW50YWdlXFwpXG5yZXN1bHRzX2xvbmckR3JvdXAgPC0gZmFjdG9yKHJlc3VsdHNfbG9uZyRHcm91cCwgbGV2ZWxzID0gYyhcXHVwbm9cXCwgXFxkb3duXFwpKVxuXG4jIENyZWF0ZSB0aGUgYmFyIHBsb3RcbmdncGxvdChyZXN1bHRzX2xvbmcsIGFlcyh4ID0gZmFjdG9yKGkpLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IEdyb3VwKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBwb3NpdGlvbiA9IFxcZG9kZ2VcXCkgK1xuICBsYWJzKFxuICAgIHRpdGxlID0gXFxTdHJ1Y3R1cmUgbG9vcHNcXCxcbiAgICB4ID0gXFxQcmVzZW5jZSBvZiBodWIgYW5jaG9yIHdpdGggPmkgY29ubmVjdGlvbnNcXCxcbiAgICB5ID0gXFxQZXJjZW50YWdlXFxcbiAgKSArXG4gIHRoZW1lX21pbmltYWwoKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFx1cG5vXFwgPSBcXGJsdWVcXCwgXFxkb3duXFwgPSBcXHJlZFxcKSkgK1xuICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArIHlsaW0oMCwgMTAwKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucmVzdWx0cyA8LSB0aWJibGUoaSA9IG51bWVyaWMoKSwgdXBubyA9IG51bWVyaWMoKSwgZG93biA9IG51bWVyaWMoKSlcblxuZm9yKGkgaW4gc2VxKDEsIDEwKSl7XG4gIGRhdGEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcRHlsYW5faHViX2VzYy5jc3ZcXCkpXG4gIFxuICBkYXRhLmh1YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGFsbF9sY29uID4gaSlcbiAgdGVtcCA8LSBkYXRhLmh1YiAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKVxuICBjb2xuYW1lcyh0ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgaHViLmFuY2hvciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcbiAgXG4gIFxuICBcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKVxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpXG5hbmNob3IudXBubyA8LSBleHRyYWN0QW5jaG9yKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSlcblxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKVxuYW5jaG9yLmRvd24gPC0gZXh0cmFjdEFuY2hvcihsb29wLmRvd24pXG5cbiAgXG4gIG92ZXJsYXAudXBubyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwbm8sIGh1Yi5hbmNob3IpXG4gIG92ZXJsYXAuZG93biA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGh1Yi5hbmNob3IpXG4gIFxuICBuMSA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLnVwbm8pKSlcbiAgbjIgPC0gbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5kb3duKSkpXG4gIFxuICBwZXJjMSA8LSByb3VuZChuMS9sZW5ndGgob3ZlcmxhcC51cG5vKSoxMDAsIDIpXG4gIHBlcmMyIDwtIHJvdW5kKG4yL2xlbmd0aChvdmVybGFwLmRvd24pKjEwMCwgMilcbiAgXG4gIHJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgYWRkX3JvdyhpID0gaSwgdXBubyA9IHBlcmMxLCBkb3duID0gcGVyYzIpXG59XG5cblxuXG5yZXN1bHRzX2xvbmcgPC0gcmVzdWx0cyAlPiVcbiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHVwbm8sIGRvd24pLCBuYW1lc190byA9IFxcR3JvdXBcXCwgdmFsdWVzX3RvID0gXFxQZXJjZW50YWdlXFwpXG5yZXN1bHRzX2xvbmckR3JvdXAgPC0gZmFjdG9yKHJlc3VsdHNfbG9uZyRHcm91cCwgbGV2ZWxzID0gYyhcXHVwbm9cXCwgXFxkb3duXFwpKVxuXG4jIENyZWF0ZSB0aGUgYmFyIHBsb3RcbmdncGxvdChyZXN1bHRzX2xvbmcsIGFlcyh4ID0gZmFjdG9yKGkpLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IEdyb3VwKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBwb3NpdGlvbiA9IFxcZG9kZ2VcXCkgK1xuICBsYWJzKFxuICAgIHRpdGxlID0gXFxTdHJ1Y3R1cmUgbG9vcHNcXCxcbiAgICB4ID0gXFxQcmVzZW5jZSBvZiBodWIgYW5jaG9yIHdpdGggPmkgY29ubmVjdGlvbnNcXCxcbiAgICB5ID0gXFxQZXJjZW50YWdlXFxcbiAgKSArXG4gIHRoZW1lX21pbmltYWwoKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFx1cG5vXFwgPSBcXGJsdWVcXCwgXFxkb3duXFwgPSBcXHJlZFxcKSkgK1xuICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArIHlsaW0oMCwgMTAwKVxuYGBgXG5gYGAifQ== -->

```r
```r
results <- tibble(i = numeric(), upno = numeric(), down = numeric())

for(i in seq(1, 10)){
  data <- fread(here(refDir, \Dylan_hub_esc.csv\))
  
  data.hub <- data %>% dplyr::filter(all_lcon > i)
  temp <- data.hub %>% dplyr::select(c(1, 2, 3))
  colnames(temp) <- c(\chr\, \start\, \end\)
  hub.anchor <- makeGRangesFromDataFrame(temp)
  
  
  
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure_dTAGvsDMSO_UP_diff0.2.bedpe\))
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure_dTAGvsDMSO_NO_diff0.2.bedpe\))
anchor.upno <- extractAnchor(bind_rows(loop.up, loop.no))

loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_structure_dTAGvsDMSO_DOWN_diff0.2.bedpe\))
anchor.down <- extractAnchor(loop.down)

  
  overlap.upno <- findOverlaps(anchor.upno, hub.anchor)
  overlap.down <- findOverlaps(anchor.down, hub.anchor)
  
  n1 <- length(unique(queryHits(overlap.upno)))
  n2 <- length(unique(queryHits(overlap.down)))
  
  perc1 <- round(n1/length(overlap.upno)*100, 2)
  perc2 <- round(n2/length(overlap.down)*100, 2)
  
  results <- results %>% add_row(i = i, upno = perc1, down = perc2)
}



results_long <- results %>%
  pivot_longer(cols = c(upno, down), names_to = \Group\, values_to = \Percentage\)
results_long$Group <- factor(results_long$Group, levels = c(\upno\, \down\))

# Create the bar plot
ggplot(results_long, aes(x = factor(i), y = Percentage, fill = Group)) +
  geom_bar(stat = \identity\, position = \dodge\) +
  labs(
    title = \Structure loops\,
    x = \Presence of hub anchor with >i connections\,
    y = \Percentage\
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(\upno\ = \blue\, \down\ = \red\)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + ylim(0, 100)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




#### PE-PE loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjbVZ6ZFd4MGN5QThMU0IwYVdKaWJHVW9hU0E5SUc1MWJXVnlhV01vS1N3Z2NHVnlZekVnUFNCdWRXMWxjbWxqS0Nrc0lIQmxjbU15SUQwZ2JuVnRaWEpwWXlncEtWeHVYRzVtYjNJb2FTQnBiaUJ6WlhFb01Td2dNVEFwS1h0Y2JpQWdaR0YwWVNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0pFZVd4aGJsOW9kV0pmWlhCcGMyTXVZM04yWENJcEtWeHVJQ0JjYmlBZ1pHRjBZUzVvZFdJZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loaGJHeGZiR052YmlBK0lHa3BYRzRnSUhSbGJYQWdQQzBnWkdGMFlTNW9kV0lnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWXlneExDQXlMQ0F6S1NsY2JpQWdZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjSW1Ob2Nsd2lMQ0JjSW5OMFlYSjBYQ0lzSUZ3aVpXNWtYQ0lwWEc0Z0lHaDFZaTVoYm1Ob2IzSWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLSFJsYlhBcFhHNGdJRnh1SUNCY2JpQWdYRzRnSUNNaklFTm9aV05yYVc1bklHOTJaWEpzWVhBZ2QybDBhQ0JuWlc1bElGUlRVMXh1SUNCMGMzTWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aWJXMHhNRjlIVWtOdE16Z3VjRFpmVkZOVE1pNDFhMkl1WW1Wa1hDSXBLVnh1SUNCY2JpQWdkSE56TG1keWIzVndNU0E4TFNCMGMzTWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9WallnSldsdUpTQm5jbTkxY0RFcElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtGWXhMQ0JXTWl3Z1ZqTXBYRzRnSUdOdmJHNWhiV1Z6S0hSemN5NW5jbTkxY0RFcElEd3RJR01vWENKamFISmNJaXdnWENKemRHRnlkRndpTENCY0ltVnVaRndpS1Z4dUlDQjBjM011WjNKdmRYQXhMbWR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoMGMzTXVaM0p2ZFhBeEtWeHVJQ0JjYmlBZ2RITnpMbWR5YjNWd01pQThMU0IwYzNNZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ZqWWdKV2x1SlNCbmNtOTFjRElwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0ZZeExDQldNaXdnVmpNcFhHNGdJR052Ykc1aGJXVnpLSFJ6Y3k1bmNtOTFjRElwSUR3dElHTW9YQ0pqYUhKY0lpd2dYQ0p6ZEdGeWRGd2lMQ0JjSW1WdVpGd2lLVnh1SUNCMGMzTXVaM0p2ZFhBeUxtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2gwYzNNdVozSnZkWEF5S1Z4dUlDQmNiaUFnWEc0Z0lHOTJaWEpzWVhBdVozSnZkWEF4SUR3dElHWnBibVJQZG1WeWJHRndjeWgwYzNNdVozSnZkWEF4TG1keUxDQm9kV0l1WVc1amFHOXlLVnh1SUNCdmRtVnliR0Z3TG1keWIzVndNaUE4TFNCbWFXNWtUM1psY214aGNITW9kSE56TG1keWIzVndNaTVuY2l3Z2FIVmlMbUZ1WTJodmNpbGNiaUFnWEc0Z0lHNHhJRHd0SUd4bGJtZDBhQ2gxYm1seGRXVW9jWFZsY25sSWFYUnpLRzkyWlhKc1lYQXVaM0p2ZFhBeEtTa3BYRzRnSUc0eUlEd3RJR3hsYm1kMGFDaDFibWx4ZFdVb2NYVmxjbmxJYVhSektHOTJaWEpzWVhBdVozSnZkWEF5S1NrcFhHNGdJRnh1SUNCd1pYSmpNU0E4TFNCeWIzVnVaQ2h1TVM5dWNtOTNLSFJ6Y3k1bmNtOTFjREVwS2pFd01Dd2dNaWxjYmlBZ2NHVnlZeklnUEMwZ2NtOTFibVFvYmpJdmJuSnZkeWgwYzNNdVozSnZkWEF5S1NveE1EQXNJRElwWEc0Z0lGeHVJQ0J5WlhOMWJIUnpJRHd0SUhKbGMzVnNkSE1nSlQ0bElHRmtaRjl5YjNjb2FTQTlJR2tzSUhCbGNtTXhJRDBnY0dWeVl6RXNJSEJsY21NeUlEMGdjR1Z5WXpJcFhHNTlYRzVjYmx4dVhHNXlaWE4xYkhSelgyeHZibWNnUEMwZ2NtVnpkV3gwY3lBbFBpVmNiaUFnY0dsMmIzUmZiRzl1WjJWeUtHTnZiSE1nUFNCaktIQmxjbU14TENCd1pYSmpNaWtzSUc1aGJXVnpYM1J2SUQwZ1hDSkhjbTkxY0Z3aUxDQjJZV3gxWlhOZmRHOGdQU0JjSWxCbGNtTmxiblJoWjJWY0lpbGNibHh1SXlCRGNtVmhkR1VnZEdobElHSmhjaUJ3Ykc5MFhHNW5aM0JzYjNRb2NtVnpkV3gwYzE5c2IyNW5MQ0JoWlhNb2VDQTlJR1poWTNSdmNpaHBLU3dnZVNBOUlGQmxjbU5sYm5SaFoyVXNJR1pwYkd3Z1BTQkhjbTkxY0NrcElDdGNiaUFnWjJWdmJWOWlZWElvYzNSaGRDQTlJRndpYVdSbGJuUnBkSGxjSWl3Z2NHOXphWFJwYjI0Z1BTQmNJbVJ2WkdkbFhDSXBJQ3RjYmlBZ2JHRmljeWhjYmlBZ0lDQjBhWFJzWlNBOUlGd2lVR1Z5WTJWdWRHRm5aU0JpZVNBbmFTY2dabTl5SUhCbGNtTXhJR0Z1WkNCd1pYSmpNbHdpTEZ4dUlDQWdJSGdnUFNCY0lsQnlaWE5sYm1ObElHOW1JR2gxWWlCaGJtTm9iM0lnZDJsMGFDQSthU0JqYjI1dVpXTjBhVzl1YzF3aUxGeHVJQ0FnSUhrZ1BTQmNJbEJsY21ObGJuUmhaMlZjSWx4dUlDQXBJQ3RjYmlBZ2RHaGxiV1ZmYldsdWFXMWhiQ2dwSUN0Y2JpQWdjMk5oYkdWZlptbHNiRjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSW5CbGNtTXhYQ0lnUFNCY0ltSnNkV1ZjSWl3Z1hDSndaWEpqTWx3aUlEMGdYQ0p5WldSY0lpa3BJQ3RjYmlBZ2RHaGxiV1VvWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWVc1bmJHVWdQU0EwTlN3Z2FHcDFjM1FnUFNBeEtTbGNibUJnWUNKOSAtLT5cblxuYGBgclxucmVzdWx0cyA8LSB0aWJibGUoaSA9IG51bWVyaWMoKSwgcGVyYzEgPSBudW1lcmljKCksIHBlcmMyID0gbnVtZXJpYygpKVxuXG5mb3IoaSBpbiBzZXEoMSwgMTApKXtcbiAgZGF0YSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxEeWxhbl9odWJfZXBpc2MuY3N2XFwpKVxuICBcbiAgZGF0YS5odWIgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihhbGxfbGNvbiA+IGkpXG4gIHRlbXAgPC0gZGF0YS5odWIgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbiAgY29sbmFtZXModGVtcCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIGh1Yi5hbmNob3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG4gIFxuICBcbiAgXG4gICMjIENoZWNraW5nIG92ZXJsYXAgd2l0aCBnZW5lIFRTU1xuICB0c3MgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfVFNTMi41a2IuYmVkXFwpKVxuICBcbiAgdHNzLmdyb3VwMSA8LSB0c3MgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDEpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpXG4gIGNvbG5hbWVzKHRzcy5ncm91cDEpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICB0c3MuZ3JvdXAxLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0c3MuZ3JvdXAxKVxuICBcbiAgdHNzLmdyb3VwMiA8LSB0c3MgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDIpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpXG4gIGNvbG5hbWVzKHRzcy5ncm91cDIpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICB0c3MuZ3JvdXAyLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0c3MuZ3JvdXAyKVxuICBcbiAgXG4gIG92ZXJsYXAuZ3JvdXAxIDwtIGZpbmRPdmVybGFwcyh0c3MuZ3JvdXAxLmdyLCBodWIuYW5jaG9yKVxuICBvdmVybGFwLmdyb3VwMiA8LSBmaW5kT3ZlcmxhcHModHNzLmdyb3VwMi5nciwgaHViLmFuY2hvcilcbiAgXG4gIG4xIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuZ3JvdXAxKSkpXG4gIG4yIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuZ3JvdXAyKSkpXG4gIFxuICBwZXJjMSA8LSByb3VuZChuMS9ucm93KHRzcy5ncm91cDEpKjEwMCwgMilcbiAgcGVyYzIgPC0gcm91bmQobjIvbnJvdyh0c3MuZ3JvdXAyKSoxMDAsIDIpXG4gIFxuICByZXN1bHRzIDwtIHJlc3VsdHMgJT4lIGFkZF9yb3coaSA9IGksIHBlcmMxID0gcGVyYzEsIHBlcmMyID0gcGVyYzIpXG59XG5cblxuXG5yZXN1bHRzX2xvbmcgPC0gcmVzdWx0cyAlPiVcbiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHBlcmMxLCBwZXJjMiksIG5hbWVzX3RvID0gXFxHcm91cFxcLCB2YWx1ZXNfdG8gPSBcXFBlcmNlbnRhZ2VcXClcblxuIyBDcmVhdGUgdGhlIGJhciBwbG90XG5nZ3Bsb3QocmVzdWx0c19sb25nLCBhZXMoeCA9IGZhY3RvcihpKSwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBHcm91cCkpICtcbiAgZ2VvbV9iYXIoc3RhdCA9IFxcaWRlbnRpdHlcXCwgcG9zaXRpb24gPSBcXGRvZGdlXFwpICtcbiAgbGFicyhcbiAgICB0aXRsZSA9IFxcUGVyY2VudGFnZSBieSAnaScgZm9yIHBlcmMxIGFuZCBwZXJjMlxcLFxuICAgIHggPSBcXFByZXNlbmNlIG9mIGh1YiBhbmNob3Igd2l0aCA+aSBjb25uZWN0aW9uc1xcLFxuICAgIHkgPSBcXFBlcmNlbnRhZ2VcXFxuICApICtcbiAgdGhlbWVfbWluaW1hbCgpICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXHBlcmMxXFwgPSBcXGJsdWVcXCwgXFxwZXJjMlxcID0gXFxyZWRcXCkpICtcbiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSlcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
results <- tibble(i = numeric(), perc1 = numeric(), perc2 = numeric())

for(i in seq(1, 10)){
  data <- fread(here(refDir, \Dylan_hub_episc.csv\))
  
  data.hub <- data %>% dplyr::filter(all_lcon > i)
  temp <- data.hub %>% dplyr::select(c(1, 2, 3))
  colnames(temp) <- c(\chr\, \start\, \end\)
  hub.anchor <- makeGRangesFromDataFrame(temp)
  
  
  
  ## Checking overlap with gene TSS
  tss <- fread(here(refDir, \mm10_GRCm38.p6_TSS2.5kb.bed\))
  
  tss.group1 <- tss %>% dplyr::filter(V6 %in% group1) %>% dplyr::select(V1, V2, V3)
  colnames(tss.group1) <- c(\chr\, \start\, \end\)
  tss.group1.gr <- makeGRangesFromDataFrame(tss.group1)
  
  tss.group2 <- tss %>% dplyr::filter(V6 %in% group2) %>% dplyr::select(V1, V2, V3)
  colnames(tss.group2) <- c(\chr\, \start\, \end\)
  tss.group2.gr <- makeGRangesFromDataFrame(tss.group2)
  
  
  overlap.group1 <- findOverlaps(tss.group1.gr, hub.anchor)
  overlap.group2 <- findOverlaps(tss.group2.gr, hub.anchor)
  
  n1 <- length(unique(queryHits(overlap.group1)))
  n2 <- length(unique(queryHits(overlap.group2)))
  
  perc1 <- round(n1/nrow(tss.group1)*100, 2)
  perc2 <- round(n2/nrow(tss.group2)*100, 2)
  
  results <- results %>% add_row(i = i, perc1 = perc1, perc2 = perc2)
}



results_long <- results %>%
  pivot_longer(cols = c(perc1, perc2), names_to = \Group\, values_to = \Percentage\)

# Create the bar plot
ggplot(results_long, aes(x = factor(i), y = Percentage, fill = Group)) +
  geom_bar(stat = \identity\, position = \dodge\) +
  labs(
    title = \Percentage by 'i' for perc1 and perc2\,
    x = \Presence of hub anchor with >i connections\,
    y = \Percentage\
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(\perc1\ = \blue\, \perc2\ = \red\)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNtVnpkV3gwY3lBOExTQjBhV0ppYkdVb2FTQTlJRzUxYldWeWFXTW9LU3dnY0dWeVl6RWdQU0J1ZFcxbGNtbGpLQ2tzSUhCbGNtTXlJRDBnYm5WdFpYSnBZeWdwS1Z4dVhHNW1iM0lvYVNCcGJpQnpaWEVvTVN3Z01UQXBLWHRjYmlBZ1pHRjBZU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeEVlV3hoYmw5b2RXSmZaWEJwYzJNdVkzTjJYRndwS1Z4dUlDQmNiaUFnWkdGMFlTNW9kV0lnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhoYkd4ZmJHTnZiaUErSUdrcFhHNGdJSFJsYlhBZ1BDMGdaR0YwWVM1b2RXSWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWd4TENBeUxDQXpLU2xjYmlBZ1kyOXNibUZ0WlhNb2RHVnRjQ2tnUEMwZ1l5aGNYR05vY2x4Y0xDQmNYSE4wWVhKMFhGd3NJRnhjWlc1a1hGd3BYRzRnSUdoMVlpNWhibU5vYjNJZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtIUmxiWEFwWEc0Z0lGeHVJQ0JjYmlBZ1hHNGdJQ01qSUVOb1pXTnJhVzVuSUc5MlpYSnNZWEFnZDJsMGFDQm5aVzVsSUZSVFUxeHVJQ0IwYzNNZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjYlcweE1GOUhVa050TXpndWNEWmZWRk5UTWk0MWEySXVZbVZrWEZ3cEtWeHVJQ0JjYmlBZ2RITnpMbWR5YjNWd01TQThMU0IwYzNNZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ZqWWdKV2x1SlNCbmNtOTFjREVwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0ZZeExDQldNaXdnVmpNcFhHNGdJR052Ykc1aGJXVnpLSFJ6Y3k1bmNtOTFjREVwSUR3dElHTW9YRnhqYUhKY1hDd2dYRnh6ZEdGeWRGeGNMQ0JjWEdWdVpGeGNLVnh1SUNCMGMzTXVaM0p2ZFhBeExtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2gwYzNNdVozSnZkWEF4S1Z4dUlDQmNiaUFnZEhOekxtZHliM1Z3TWlBOExTQjBjM01nSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvVmpZZ0pXbHVKU0JuY205MWNESXBJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLRll4TENCV01pd2dWak1wWEc0Z0lHTnZiRzVoYldWektIUnpjeTVuY205MWNESXBJRHd0SUdNb1hGeGphSEpjWEN3Z1hGeHpkR0Z5ZEZ4Y0xDQmNYR1Z1WkZ4Y0tWeHVJQ0IwYzNNdVozSnZkWEF5TG1keUlEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaDBjM011WjNKdmRYQXlLVnh1SUNCY2JpQWdYRzRnSUc5MlpYSnNZWEF1WjNKdmRYQXhJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aDBjM011WjNKdmRYQXhMbWR5TENCb2RXSXVZVzVqYUc5eUtWeHVJQ0J2ZG1WeWJHRndMbWR5YjNWd01pQThMU0JtYVc1a1QzWmxjbXhoY0hNb2RITnpMbWR5YjNWd01pNW5jaXdnYUhWaUxtRnVZMmh2Y2lsY2JpQWdYRzRnSUc0eElEd3RJR3hsYm1kMGFDaDFibWx4ZFdVb2NYVmxjbmxJYVhSektHOTJaWEpzWVhBdVozSnZkWEF4S1NrcFhHNGdJRzR5SUR3dElHeGxibWQwYUNoMWJtbHhkV1VvY1hWbGNubElhWFJ6S0c5MlpYSnNZWEF1WjNKdmRYQXlLU2twWEc0Z0lGeHVJQ0J3WlhKak1TQThMU0J5YjNWdVpDaHVNUzl1Y205M0tIUnpjeTVuY205MWNERXBLakV3TUN3Z01pbGNiaUFnY0dWeVl6SWdQQzBnY205MWJtUW9iakl2Ym5KdmR5aDBjM011WjNKdmRYQXlLU294TURBc0lESXBYRzRnSUZ4dUlDQnlaWE4xYkhSeklEd3RJSEpsYzNWc2RITWdKVDRsSUdGa1pGOXliM2NvYVNBOUlHa3NJSEJsY21NeElEMGdjR1Z5WXpFc0lIQmxjbU15SUQwZ2NHVnlZeklwWEc1OVhHNWNibHh1WEc1eVpYTjFiSFJ6WDJ4dmJtY2dQQzBnY21WemRXeDBjeUFsUGlWY2JpQWdjR2wyYjNSZmJHOXVaMlZ5S0dOdmJITWdQU0JqS0hCbGNtTXhMQ0J3WlhKak1pa3NJRzVoYldWelgzUnZJRDBnWEZ4SGNtOTFjRnhjTENCMllXeDFaWE5mZEc4Z1BTQmNYRkJsY21ObGJuUmhaMlZjWENsY2JseHVJeUJEY21WaGRHVWdkR2hsSUdKaGNpQndiRzkwWEc1blozQnNiM1FvY21WemRXeDBjMTlzYjI1bkxDQmhaWE1vZUNBOUlHWmhZM1J2Y2locEtTd2dlU0E5SUZCbGNtTmxiblJoWjJVc0lHWnBiR3dnUFNCSGNtOTFjQ2twSUN0Y2JpQWdaMlZ2YlY5aVlYSW9jM1JoZENBOUlGeGNhV1JsYm5ScGRIbGNYQ3dnY0c5emFYUnBiMjRnUFNCY1hHUnZaR2RsWEZ3cElDdGNiaUFnYkdGaWN5aGNiaUFnSUNCMGFYUnNaU0E5SUZ4Y1VHVnlZMlZ1ZEdGblpTQmllU0FuYVNjZ1ptOXlJSEJsY21NeElHRnVaQ0J3WlhKak1seGNMRnh1SUNBZ0lIZ2dQU0JjWEZCeVpYTmxibU5sSUc5bUlHaDFZaUJoYm1Ob2IzSWdkMmwwYUNBK2FTQmpiMjV1WldOMGFXOXVjMXhjTEZ4dUlDQWdJSGtnUFNCY1hGQmxjbU5sYm5SaFoyVmNYRnh1SUNBcElDdGNiaUFnZEdobGJXVmZiV2x1YVcxaGJDZ3BJQ3RjYmlBZ2MyTmhiR1ZmWm1sc2JGOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYSEJsY21NeFhGd2dQU0JjWEdKc2RXVmNYQ3dnWEZ4d1pYSmpNbHhjSUQwZ1hGeHlaV1JjWENrcElDdGNiaUFnZEdobGJXVW9ZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9ZVzVuYkdVZ1BTQTBOU3dnYUdwMWMzUWdQU0F4S1NsY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbnJlc3VsdHMgPC0gdGliYmxlKGkgPSBudW1lcmljKCksIHBlcmMxID0gbnVtZXJpYygpLCBwZXJjMiA9IG51bWVyaWMoKSlcblxuZm9yKGkgaW4gc2VxKDEsIDEwKSl7XG4gIGRhdGEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcRHlsYW5faHViX2VwaXNjLmNzdlxcKSlcbiAgXG4gIGRhdGEuaHViIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoYWxsX2xjb24gPiBpKVxuICB0ZW1wIDwtIGRhdGEuaHViICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpXG4gIGNvbG5hbWVzKHRlbXApIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICBodWIuYW5jaG9yIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxuICBcbiAgXG4gIFxuICAjIyBDaGVja2luZyBvdmVybGFwIHdpdGggZ2VuZSBUU1NcbiAgdHNzIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X1RTUzIuNWtiLmJlZFxcKSlcbiAgXG4gIHRzcy5ncm91cDEgPC0gdHNzICU+JSBkcGx5cjo6ZmlsdGVyKFY2ICVpbiUgZ3JvdXAxKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuICBjb2xuYW1lcyh0c3MuZ3JvdXAxKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgdHNzLmdyb3VwMS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodHNzLmdyb3VwMSlcbiAgXG4gIHRzcy5ncm91cDIgPC0gdHNzICU+JSBkcGx5cjo6ZmlsdGVyKFY2ICVpbiUgZ3JvdXAyKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuICBjb2xuYW1lcyh0c3MuZ3JvdXAyKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbiAgdHNzLmdyb3VwMi5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodHNzLmdyb3VwMilcbiAgXG4gIFxuICBvdmVybGFwLmdyb3VwMSA8LSBmaW5kT3ZlcmxhcHModHNzLmdyb3VwMS5nciwgaHViLmFuY2hvcilcbiAgb3ZlcmxhcC5ncm91cDIgPC0gZmluZE92ZXJsYXBzKHRzcy5ncm91cDIuZ3IsIGh1Yi5hbmNob3IpXG4gIFxuICBuMSA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmdyb3VwMSkpKVxuICBuMiA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmdyb3VwMikpKVxuICBcbiAgcGVyYzEgPC0gcm91bmQobjEvbnJvdyh0c3MuZ3JvdXAxKSoxMDAsIDIpXG4gIHBlcmMyIDwtIHJvdW5kKG4yL25yb3codHNzLmdyb3VwMikqMTAwLCAyKVxuICBcbiAgcmVzdWx0cyA8LSByZXN1bHRzICU+JSBhZGRfcm93KGkgPSBpLCBwZXJjMSA9IHBlcmMxLCBwZXJjMiA9IHBlcmMyKVxufVxuXG5cblxucmVzdWx0c19sb25nIDwtIHJlc3VsdHMgJT4lXG4gIHBpdm90X2xvbmdlcihjb2xzID0gYyhwZXJjMSwgcGVyYzIpLCBuYW1lc190byA9IFxcR3JvdXBcXCwgdmFsdWVzX3RvID0gXFxQZXJjZW50YWdlXFwpXG5cbiMgQ3JlYXRlIHRoZSBiYXIgcGxvdFxuZ2dwbG90KHJlc3VsdHNfbG9uZywgYWVzKHggPSBmYWN0b3IoaSksIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gR3JvdXApKSArXG4gIGdlb21fYmFyKHN0YXQgPSBcXGlkZW50aXR5XFwsIHBvc2l0aW9uID0gXFxkb2RnZVxcKSArXG4gIGxhYnMoXG4gICAgdGl0bGUgPSBcXFBlcmNlbnRhZ2UgYnkgJ2knIGZvciBwZXJjMSBhbmQgcGVyYzJcXCxcbiAgICB4ID0gXFxQcmVzZW5jZSBvZiBodWIgYW5jaG9yIHdpdGggPmkgY29ubmVjdGlvbnNcXCxcbiAgICB5ID0gXFxQZXJjZW50YWdlXFxcbiAgKSArXG4gIHRoZW1lX21pbmltYWwoKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFxwZXJjMVxcID0gXFxibHVlXFwsIFxccGVyYzJcXCA9IFxccmVkXFwpKSArXG4gIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucmVzdWx0cyA8LSB0aWJibGUoaSA9IG51bWVyaWMoKSwgcGVyYzEgPSBudW1lcmljKCksIHBlcmMyID0gbnVtZXJpYygpKVxuXG5mb3IoaSBpbiBzZXEoMSwgMTApKXtcbiAgZGF0YSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxEeWxhbl9odWJfZXBpc2MuY3N2XFwpKVxuICBcbiAgZGF0YS5odWIgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihhbGxfbGNvbiA+IGkpXG4gIHRlbXAgPC0gZGF0YS5odWIgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSlcbiAgY29sbmFtZXModGVtcCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG4gIGh1Yi5hbmNob3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG4gIFxuICBcbiAgXG4gICMjIENoZWNraW5nIG92ZXJsYXAgd2l0aCBnZW5lIFRTU1xuICB0c3MgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfVFNTMi41a2IuYmVkXFwpKVxuICBcbiAgdHNzLmdyb3VwMSA8LSB0c3MgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDEpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpXG4gIGNvbG5hbWVzKHRzcy5ncm91cDEpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICB0c3MuZ3JvdXAxLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0c3MuZ3JvdXAxKVxuICBcbiAgdHNzLmdyb3VwMiA8LSB0c3MgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDIpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpXG4gIGNvbG5hbWVzKHRzcy5ncm91cDIpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuICB0c3MuZ3JvdXAyLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0c3MuZ3JvdXAyKVxuICBcbiAgXG4gIG92ZXJsYXAuZ3JvdXAxIDwtIGZpbmRPdmVybGFwcyh0c3MuZ3JvdXAxLmdyLCBodWIuYW5jaG9yKVxuICBvdmVybGFwLmdyb3VwMiA8LSBmaW5kT3ZlcmxhcHModHNzLmdyb3VwMi5nciwgaHViLmFuY2hvcilcbiAgXG4gIG4xIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuZ3JvdXAxKSkpXG4gIG4yIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuZ3JvdXAyKSkpXG4gIFxuICBwZXJjMSA8LSByb3VuZChuMS9ucm93KHRzcy5ncm91cDEpKjEwMCwgMilcbiAgcGVyYzIgPC0gcm91bmQobjIvbnJvdyh0c3MuZ3JvdXAyKSoxMDAsIDIpXG4gIFxuICByZXN1bHRzIDwtIHJlc3VsdHMgJT4lIGFkZF9yb3coaSA9IGksIHBlcmMxID0gcGVyYzEsIHBlcmMyID0gcGVyYzIpXG59XG5cblxuXG5yZXN1bHRzX2xvbmcgPC0gcmVzdWx0cyAlPiVcbiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHBlcmMxLCBwZXJjMiksIG5hbWVzX3RvID0gXFxHcm91cFxcLCB2YWx1ZXNfdG8gPSBcXFBlcmNlbnRhZ2VcXClcblxuIyBDcmVhdGUgdGhlIGJhciBwbG90XG5nZ3Bsb3QocmVzdWx0c19sb25nLCBhZXMoeCA9IGZhY3RvcihpKSwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBHcm91cCkpICtcbiAgZ2VvbV9iYXIoc3RhdCA9IFxcaWRlbnRpdHlcXCwgcG9zaXRpb24gPSBcXGRvZGdlXFwpICtcbiAgbGFicyhcbiAgICB0aXRsZSA9IFxcUGVyY2VudGFnZSBieSAnaScgZm9yIHBlcmMxIGFuZCBwZXJjMlxcLFxuICAgIHggPSBcXFByZXNlbmNlIG9mIGh1YiBhbmNob3Igd2l0aCA+aSBjb25uZWN0aW9uc1xcLFxuICAgIHkgPSBcXFBlcmNlbnRhZ2VcXFxuICApICtcbiAgdGhlbWVfbWluaW1hbCgpICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXHBlcmMxXFwgPSBcXGJsdWVcXCwgXFxwZXJjMlxcID0gXFxyZWRcXCkpICtcbiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSlcbmBgYFxuYGBgIn0= -->

```r
```r
results <- tibble(i = numeric(), perc1 = numeric(), perc2 = numeric())

for(i in seq(1, 10)){
  data <- fread(here(refDir, \Dylan_hub_episc.csv\))
  
  data.hub <- data %>% dplyr::filter(all_lcon > i)
  temp <- data.hub %>% dplyr::select(c(1, 2, 3))
  colnames(temp) <- c(\chr\, \start\, \end\)
  hub.anchor <- makeGRangesFromDataFrame(temp)
  
  
  
  ## Checking overlap with gene TSS
  tss <- fread(here(refDir, \mm10_GRCm38.p6_TSS2.5kb.bed\))
  
  tss.group1 <- tss %>% dplyr::filter(V6 %in% group1) %>% dplyr::select(V1, V2, V3)
  colnames(tss.group1) <- c(\chr\, \start\, \end\)
  tss.group1.gr <- makeGRangesFromDataFrame(tss.group1)
  
  tss.group2 <- tss %>% dplyr::filter(V6 %in% group2) %>% dplyr::select(V1, V2, V3)
  colnames(tss.group2) <- c(\chr\, \start\, \end\)
  tss.group2.gr <- makeGRangesFromDataFrame(tss.group2)
  
  
  overlap.group1 <- findOverlaps(tss.group1.gr, hub.anchor)
  overlap.group2 <- findOverlaps(tss.group2.gr, hub.anchor)
  
  n1 <- length(unique(queryHits(overlap.group1)))
  n2 <- length(unique(queryHits(overlap.group2)))
  
  perc1 <- round(n1/nrow(tss.group1)*100, 2)
  perc2 <- round(n2/nrow(tss.group2)*100, 2)
  
  results <- results %>% add_row(i = i, perc1 = perc1, perc2 = perc2)
}



results_long <- results %>%
  pivot_longer(cols = c(perc1, perc2), names_to = \Group\, values_to = \Percentage\)

# Create the bar plot
ggplot(results_long, aes(x = factor(i), y = Percentage, fill = Group)) +
  geom_bar(stat = \identity\, position = \dodge\) +
  labs(
    title = \Percentage by 'i' for perc1 and perc2\,
    x = \Presence of hub anchor with >i connections\,
    y = \Percentage\
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(\perc1\ = \blue\, \perc2\ = \red\)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



#### Str loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjSEp2WTJWemMxOW5jbTkxY0NBOExTQm1kVzVqZEdsdmJpaG5jbTkxY0Y5dVlXMWxMQ0JuWlc1bFgyUmhkR0VzSUdKcGJuTXBJSHRjYmlBZ0l5QkdhV3gwWlhJZ1ptOXlJSFJvWlNCemNHVmphV1pwWXlCbmNtOTFjRnh1SUNCVVUxTmZaM0p2ZFhBZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtGeHVJQ0FnSUdkbGJtVmZaR0YwWVNBbFBpVWdabWxzZEdWeUtHVnVjMlZ0WW13Z0pXbHVKU0JuWlhRb1ozSnZkWEJmYm1GdFpTa3BMQ0JjYmlBZ0lDQnJaV1Z3TG1WNGRISmhMbU52YkhWdGJuTWdQU0JVVWxWRlhHNGdJQ2xjYmlBZ1hHNGdJQ01nVUhKdlkyVnpjeUJsWVdOb0lGUlRVeUJwYmlCMGFHVWdaM0p2ZFhCY2JpQWdZV3hzWDNKbGMzVnNkSE1nUEMwZ2JXRndYMlJtY2loelpYRmZiR1Z1S0d4bGJtZDBhQ2hVVTFOZlozSnZkWEFwS1N3Z1puVnVZM1JwYjI0b2FTa2dlMXh1SUNBZ0lDTWdSbWx1WkNCdmRtVnliR0Z3Y0dsdVp5QmlhVzV6WEc0Z0lDQWdiM1psY214aGNIQnBibWRmWW1sdWN5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1ZGTlRYMmR5YjNWd1cybGRMQ0JpYVc1ektWeHVJQ0FnSUdKcGJuTmZibVZoY2w5MGMzTWdQQzBnWVhOZmRHbGlZbXhsS0dKcGJuTmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSEJwYm1kZlltbHVjeWxkS1Z4dUlDQWdJRnh1SUNBZ0lDTWdRMkZzWTNWc1lYUmxJR1JwYzNSaGJtTmxJR0pwYmx4dUlDQWdJRlJUVTJObGJuUmxjaUE4TFNBb1lYTmZkR2xpWW14bEtGUlRVMTluY205MWNGdHBYU2tnSlQ0bFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzExZEdGMFpTaGpaVzUwWlhJZ1BTQW9jM1JoY25RZ0t5QmxibVFwSUM4Z01pa3BKR05sYm5SbGNseHVJQ0FnSUdObGJuUmxja0pwYmxOMFlYSjBJRHd0SUdac2IyOXlLRlJUVTJObGJuUmxjaUF2SURFd1pUTXBJQ29nTVRCbE15QXJJREZjYmlBZ0lDQmlhVzV6WDI1bFlYSmZkSE56SUR3dElHSnBibk5mYm1WaGNsOTBjM01nSlQ0bFhHNGdJQ0FnSUNCdGRYUmhkR1VvWkdsemRHRnVZMlZDYVc0Z1BTQmhZbk1vS0hOMFlYSjBJQzBnWTJWdWRHVnlRbWx1VTNSaGNuUXBLU0F2SURFd1pUTXBYRzRnSUNBZ1hHNGdJQ0FnSXlCVGRXMXRZWEpwZW1VZ2NtVnpkV3gwYzF4dUlDQWdJSEpsYzNWc2RDQThMU0JpYVc1elgyNWxZWEpmZEhOeklDVStKVnh1SUNBZ0lDQWdaM0p2ZFhCZllua29aR2x6ZEdGdVkyVkNhVzRwSUNVK0pWeHVJQ0FnSUNBZ2MzVnRiV0Z5YVhObEtHMWxZVzVmY0dWaGExOWpiM1Z1ZEhNZ1BTQnRaV0Z1S0hCbFlXdGZZMjkxYm5SekxDQnVZUzV5YlNBOUlGUlNWVVVwTENBdVozSnZkWEJ6SUQwZ1hDSmtjbTl3WENJcElDVStKVnh1SUNBZ0lDQWdiWFYwWVhSbEtHZGxibVVnUFNCVVUxTmZaM0p2ZFhCYmFWMGtaVzV6WlcxaWJDbGNiaUFnSUNCeVpYUjFjbTRvY21WemRXeDBLVnh1SUNCOUtWeHVJQ0JjYmlBZ0l5QkRZV3hqZFd4aGRHVWdiV1ZoYmlCaGJtUWdVMFFnWm05eUlIUm9aU0JuY205MWNGeHVJQ0J0WldGdVgyUmhkR0VnUEMwZ1lXeHNYM0psYzNWc2RITWdKVDRsWEc0Z0lDQWdaM0p2ZFhCZllua29aR2x6ZEdGdVkyVkNhVzRwSUNVK0pWeHVJQ0FnSUhOMWJXMWhjbWx6WlNodFpXRnVYM0JsWVd0ZlkyOTFiblJ6SUQwZ2JXVmhiaWh0WldGdVgzQmxZV3RmWTI5MWJuUnpMQ0J1WVM1eWJTQTlJRlJTVlVVcEtWeHVJQ0JjYmlBZ2MyUmZaR0YwWVNBOExTQmhiR3hmY21WemRXeDBjeUFsUGlWY2JpQWdJQ0JuY205MWNGOWllU2hrYVhOMFlXNWpaVUpwYmlrZ0pUNGxYRzRnSUNBZ2MzVnRiV0Z5YVhObEtITmtYM0JsWVd0ZlkyOTFiblJ6SUQwZ2MyUW9iV1ZoYmw5d1pXRnJYMk52ZFc1MGN5d2dibUV1Y20wZ1BTQlVVbFZGS1NsY2JpQWdYRzRnSUNNZ1NtOXBiaUJoYm1RZ1lXUmtJR2R5YjNWd0lHNWhiV1ZjYmlBZ2MzVnRiV0Z5ZVY5a1lYUmhJRHd0SUd4bFpuUmZhbTlwYmlodFpXRnVYMlJoZEdFc0lITmtYMlJoZEdFc0lHSjVJRDBnWENKa2FYTjBZVzVqWlVKcGJsd2lLU0FsUGlWY2JpQWdJQ0J0ZFhSaGRHVW9aM0p2ZFhBZ1BTQm5jbTkxY0Y5dVlXMWxLVnh1SUNCY2JpQWdjbVYwZFhKdUtITjFiVzFoY25sZlpHRjBZU2xjYm4xY2JseHVJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSTF4dVhHNWNibHh1SXlNZ1NXMXdiM0owSUhCbFlXdGNibkpsWmtScGNpQThMU0JvWlhKbEtGd2lMaTR2TGk1Y0lpd2dYQ0p5WldabGNtVnVZMlZjSWlsY2JpTndaV0ZyTGtnelN6STNZV01nUEMwZ2FXMXdiM0owVUdWaGF5aG9aWEpsS0hKbFprUnBjaXdnWENKSFUwMHlORE00TkRjMlgwVkRMVVJITFRNME5UZ3RTRE5MTWpkQlExOUJVMWxPWHpFdWJtRnljbTkzVUdWaGF5NWlaV1JjSWlrcFhHNXdaV0ZyTGtnelN6STNZV01nUEMwZ2FXMXdiM0owVUdWaGF5aG9aWEpsS0hKbFprUnBjaXdnWENJek16STFOVjlJTTBzMGJXVXpYekEwTFRjME5WOUNjblZqWlMwMFgzQmxZV3R6TG0xbGNtZGxVR1ZoYXk1aVpXUmNJaWtwWEc0amNHVmhheTVJTTBzeU4yRmpJRHd0SUdsdGNHOXlkRkJsWVdzb2FHVnlaU2h5WldaRWFYSXNJRndpTXpNeU5UQmZVa0ZFTWpGZllXSTVPVEpmUW5KMVkyVXRORjl3WldGcmN5NXRaWEpuWlZCbFlXc3VZbVZrWENJcEtWeHVYRzRqSXlCSmJYQnZjblFnTVRCcllpQmlhVzVjYm5SbGJYQWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aWJXMHhNQzVpYVc0dU1UQnJZaTVpWldSY0lpa3BYRzVqYjJ4dVlXMWxjeWgwWlcxd0tTQThMU0JqS0Z3aVkyaHlYQ0lzSUZ3aWMzUmhjblJjSWl3Z1hDSmxibVJjSWlsY2JuUmxiWEFnUEMwZ2RHVnRjQ0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2h6ZEdGeWRDQTlJSE4wWVhKMEt6RXBYRzVpYVc1ekxqRXdhMklnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0hSbGJYQXBYRzVjYmlNaklFTnZkVzUwSUc5MlpYSnNZWEJjYm1OdmRXNTBjeUE4TFNCamIzVnVkRTkyWlhKc1lYQnpLR0pwYm5NdU1UQnJZaXdnY0dWaGF5NUlNMHN5TjJGaktWeHViV052YkhNb1ltbHVjeTR4TUd0aUtTUndaV0ZyWDJOdmRXNTBjeUE4TFNCamIzVnVkSE5jYmx4dUl5TWdSMlYwZEdsdVp5QlVVMU5jYm1ac1lXNXJVMmw2WlNBOExTQXhaVFpjYm1kbGJtVXVkR0lnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2liVzB4TUY5SFVrTnRNemd1Y0RaZloyVnVaVjl6YjNKMFpXUXVZbVZrWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hVVTFNZ1BTQnBabVZzYzJVb1ZqUWdQVDBnWENJclhDSXNJRll5TENCV015a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdWRk5UYzNSaGNuUWdQU0JVVTFNZ0xTQm1iR0Z1YTFOcGVtVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdWRk5UWlc1a0lEMGdWRk5USUNzZ1pteGhibXRUYVhwbEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hXTVN3Z1ZGTlRjM1JoY25Rc0lGUlRVMlZ1WkN3Z1ZqWXBYRzVqYjJ4dVlXMWxjeWhuWlc1bExuUmlLU0E4TFNCaktGd2lZMmh5WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpd2dYQ0psYm5ObGJXSnNYQ0lwWEc1Y2JtZGxibVV1WjNKdmRYQXhJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjlpYVc1aGNubEhjbTkxY0RFdWRITjJYQ0lwS1NSblpXNWxYRzVuWlc1bExtZHliM1Z3TWlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0puWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlltbHVZWEo1UjNKdmRYQXlMblJ6ZGx3aUtTa2taMlZ1WlZ4dVhHNGpWRk5UTVcxaUxtZHliM1Z3TVM1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9aMlZ1WlM1MFlpQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaGxibk5sYldKc0lDVnBiaVVnWjJWdVpTNW5jbTkxY0RFcExDQnJaV1Z3TG1WNGRISmhMbU52YkhWdGJuTWdQU0JVVWxWRktWeHVJMVJUVXpGdFlpNW5jbTkxY0RJdVozSWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLR2RsYm1VdWRHSWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aVzV6WlcxaWJDQWxhVzRsSUdkbGJtVXVaM0p2ZFhBeUtTd2dhMlZsY0M1bGVIUnlZUzVqYjJ4MWJXNXpJRDBnVkZKVlJTbGNibHh1SXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakkxeHVJeUJNYVhOMElHOW1JR2R5YjNWd2N5QjBieUJ3Y205alpYTnpYRzVuY205MWNITWdQQzBnWXloY0ltZGxibVV1WjNKdmRYQXhYQ0lzSUZ3aVoyVnVaUzVuY205MWNESmNJaWxjYmx4dUl5QlFjbTlqWlhOeklHVmhZMmdnWjNKdmRYQWdZVzVrSUdOdmJXSnBibVVnY21WemRXeDBjMXh1YzNWdGJXRnllVjlrWVhSaElEd3RJRzFoY0Y5a1puSW9aM0p2ZFhCekxDQitJSEJ5YjJObGMzTmZaM0p2ZFhBb0xuZ3NJR2RsYm1VdWRHSXNJR0pwYm5NdU1UQnJZaWtwWEc1Y2JpTWdRV1JrSUhSb1pTQmhaR1JwZEdsdmJtRnNJSEp2ZDNNZ1ptOXlJR1JwYzNSaGJtTmxRbWx1SUQwZ01GeHVjM1Z0YldGeWVWOWtZWFJoSUR3dElITjFiVzFoY25sZlpHRjBZU0FsUGlWY2JpQWdiWFYwWVhSbEtHUnBjM1JoYm1ObFFtbHVJRDBnWkdsemRHRnVZMlZDYVc0Z0t5QXhLU0FsUGlWY2JpQWdZV1JrWDNKdmR5aGthWE4wWVc1alpVSnBiaUE5SURBc0lHMWxZVzVmY0dWaGExOWpiM1Z1ZEhNZ1BTQXdMQ0J6WkY5d1pXRnJYMk52ZFc1MGN5QTlJREFzSUdkeWIzVndJRDBnWENKblpXNWxMbWR5YjNWd01Wd2lLU0FsUGlWY2JpQWdZV1JrWDNKdmR5aGthWE4wWVc1alpVSnBiaUE5SURBc0lHMWxZVzVmY0dWaGExOWpiM1Z1ZEhNZ1BTQXdMQ0J6WkY5d1pXRnJYMk52ZFc1MGN5QTlJREFzSUdkeWIzVndJRDBnWENKblpXNWxMbWR5YjNWd01sd2lLVnh1WEc0aklGQnNiM1FnZEdobElISmxjM1ZzZEhOY2JuQWdQQzBnWjJkd2JHOTBLSE4xYlcxaGNubGZaR0YwWVN3Z1lXVnpLSGdnUFNCa2FYTjBZVzVqWlVKcGJpd2dlU0E5SUcxbFlXNWZjR1ZoYTE5amIzVnVkSE1zSUdOdmJHOXlJRDBnWjNKdmRYQXBLU0FySUZ4dUlDQm5aVzl0WDJ4cGJtVW9jMmw2WlNBOUlEQXVOU2tnSzF4dUlDQnNZV0p6S0Z4dUlDQWdJSGdnUFNCY0lrUnBjM1JoYm1ObElHSnBiaUFvTVRCcllpbGNJaXhjYmlBZ0lDQjVJRDBnWENKSU0wczBiV1V6SUhCbFlXc2dZMjkxYm5SY0lseHVJQ0FwSUN0Y2JpQWdkR2hsYldWZlkyeGhjM05wWXlncElDdGNiaUFnZEdobGJXVW9YRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVTBzWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11YkdsdVpTQTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJwWTJ0eklEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBcExGeHVJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGd2lkSEpoYm5Od1lYSmxiblJjSWlrc1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdiR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdZeWd3TGpnc0lEQXVPQ2tnSUNNZ1RXOTJaWE1nYkdWblpXNWtJR2x1YzJsa1pTQjBhR1VnY0d4dmRDQW9lQ3dnZVNCeVpXeGhkR2wyWlNCamIyOXlaR2x1WVhSbGN5bGNiaUFnS1NBclhHNGdJR2QxYVdSbGN5aGNiaUFnSUNCbWFXeHNJRDBnWjNWcFpHVmZiR1ZuWlc1a0tGeHVJQ0FnSUNBZ2EyVjVkMmxrZEdnZ1BTQXdMaklzSUNBaklFRmthblZ6ZENCMGFHVWdkMmxrZEdnZ2IyWWdkR2hsSUd4bFoyVnVaQ0JyWlhselhHNGdJQ0FnSUNCclpYbG9aV2xuYUhRZ1BTQXdMaklnSUNNZ1FXUnFkWE4wSUhSb1pTQm9aV2xuYUhRZ2IyWWdkR2hsSUd4bFoyVnVaQ0JyWlhselhHNGdJQ0FnS1NrclhHNGdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0J5WlhZb1l5aGNJaU0zTnpjM056ZGNJaXdnWENJalJqSTRSVEpEWENJcEtTbGNibHh1SXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakkxeHVYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKaWFXNVFaV0ZyUkdWdWMybDBlVjlTUVVReU1WOWlhVzVoY25sSGNtOTFjRndpS1Z4dWQybGtkR2dnUEMwZ016SXFiVzFVYjBsdVkyaGNibWhsYVdkb2RDQThMU0F6TlNwdGJWUnZTVzVqYUZ4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbnByb2Nlc3NfZ3JvdXAgPC0gZnVuY3Rpb24oZ3JvdXBfbmFtZSwgZ2VuZV9kYXRhLCBiaW5zKSB7XG4gICMgRmlsdGVyIGZvciB0aGUgc3BlY2lmaWMgZ3JvdXBcbiAgVFNTX2dyb3VwIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShcbiAgICBnZW5lX2RhdGEgJT4lIGZpbHRlcihlbnNlbWJsICVpbiUgZ2V0KGdyb3VwX25hbWUpKSwgXG4gICAga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRVxuICApXG4gIFxuICAjIFByb2Nlc3MgZWFjaCBUU1MgaW4gdGhlIGdyb3VwXG4gIGFsbF9yZXN1bHRzIDwtIG1hcF9kZnIoc2VxX2xlbihsZW5ndGgoVFNTX2dyb3VwKSksIGZ1bmN0aW9uKGkpIHtcbiAgICAjIEZpbmQgb3ZlcmxhcHBpbmcgYmluc1xuICAgIG92ZXJsYXBwaW5nX2JpbnMgPC0gZmluZE92ZXJsYXBzKFRTU19ncm91cFtpXSwgYmlucylcbiAgICBiaW5zX25lYXJfdHNzIDwtIGFzX3RpYmJsZShiaW5zW3N1YmplY3RIaXRzKG92ZXJsYXBwaW5nX2JpbnMpXSlcbiAgICBcbiAgICAjIENhbGN1bGF0ZSBkaXN0YW5jZSBiaW5cbiAgICBUU1NjZW50ZXIgPC0gKGFzX3RpYmJsZShUU1NfZ3JvdXBbaV0pICU+JVxuICAgICAgICAgICAgICAgICAgICBtdXRhdGUoY2VudGVyID0gKHN0YXJ0ICsgZW5kKSAvIDIpKSRjZW50ZXJcbiAgICBjZW50ZXJCaW5TdGFydCA8LSBmbG9vcihUU1NjZW50ZXIgLyAxMGUzKSAqIDEwZTMgKyAxXG4gICAgYmluc19uZWFyX3RzcyA8LSBiaW5zX25lYXJfdHNzICU+JVxuICAgICAgbXV0YXRlKGRpc3RhbmNlQmluID0gYWJzKChzdGFydCAtIGNlbnRlckJpblN0YXJ0KSkgLyAxMGUzKVxuICAgIFxuICAgICMgU3VtbWFyaXplIHJlc3VsdHNcbiAgICByZXN1bHQgPC0gYmluc19uZWFyX3RzcyAlPiVcbiAgICAgIGdyb3VwX2J5KGRpc3RhbmNlQmluKSAlPiVcbiAgICAgIHN1bW1hcmlzZShtZWFuX3BlYWtfY291bnRzID0gbWVhbihwZWFrX2NvdW50cywgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9IFxcZHJvcFxcKSAlPiVcbiAgICAgIG11dGF0ZShnZW5lID0gVFNTX2dyb3VwW2ldJGVuc2VtYmwpXG4gICAgcmV0dXJuKHJlc3VsdClcbiAgfSlcbiAgXG4gICMgQ2FsY3VsYXRlIG1lYW4gYW5kIFNEIGZvciB0aGUgZ3JvdXBcbiAgbWVhbl9kYXRhIDwtIGFsbF9yZXN1bHRzICU+JVxuICAgIGdyb3VwX2J5KGRpc3RhbmNlQmluKSAlPiVcbiAgICBzdW1tYXJpc2UobWVhbl9wZWFrX2NvdW50cyA9IG1lYW4obWVhbl9wZWFrX2NvdW50cywgbmEucm0gPSBUUlVFKSlcbiAgXG4gIHNkX2RhdGEgPC0gYWxsX3Jlc3VsdHMgJT4lXG4gICAgZ3JvdXBfYnkoZGlzdGFuY2VCaW4pICU+JVxuICAgIHN1bW1hcmlzZShzZF9wZWFrX2NvdW50cyA9IHNkKG1lYW5fcGVha19jb3VudHMsIG5hLnJtID0gVFJVRSkpXG4gIFxuICAjIEpvaW4gYW5kIGFkZCBncm91cCBuYW1lXG4gIHN1bW1hcnlfZGF0YSA8LSBsZWZ0X2pvaW4obWVhbl9kYXRhLCBzZF9kYXRhLCBieSA9IFxcZGlzdGFuY2VCaW5cXCkgJT4lXG4gICAgbXV0YXRlKGdyb3VwID0gZ3JvdXBfbmFtZSlcbiAgXG4gIHJldHVybihzdW1tYXJ5X2RhdGEpXG59XG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG5cbiMjIEltcG9ydCBwZWFrXG5yZWZEaXIgPC0gaGVyZShcXC4uLy4uXFwsIFxccmVmZXJlbmNlXFwpXG4jcGVhay5IM0syN2FjIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkXFwpKVxucGVhay5IM0syN2FjIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxuI3BlYWsuSDNLMjdhYyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcblxuIyMgSW1wb3J0IDEwa2IgYmluXG50ZW1wIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTAuYmluLjEwa2IuYmVkXFwpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBzdGFydCsxKVxuYmlucy4xMGtiIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxuXG4jIyBDb3VudCBvdmVybGFwXG5jb3VudHMgPC0gY291bnRPdmVybGFwcyhiaW5zLjEwa2IsIHBlYWsuSDNLMjdhYylcbm1jb2xzKGJpbnMuMTBrYikkcGVha19jb3VudHMgPC0gY291bnRzXG5cbiMjIEdldHRpbmcgVFNTXG5mbGFua1NpemUgPC0gMWU2XG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLFxuICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLFxuICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY2KVxuY29sbmFtZXMoZ2VuZS50YikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcZW5zZW1ibFxcKVxuXG5nZW5lLmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ2VuZS5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuI1RTUzFtYi5ncm91cDEuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdlbmUuZ3JvdXAxKSwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSlcbiNUU1MxbWIuZ3JvdXAyLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmwgJWluJSBnZW5lLmdyb3VwMiksIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgTGlzdCBvZiBncm91cHMgdG8gcHJvY2Vzc1xuZ3JvdXBzIDwtIGMoXFxnZW5lLmdyb3VwMVxcLCBcXGdlbmUuZ3JvdXAyXFwpXG5cbiMgUHJvY2VzcyBlYWNoIGdyb3VwIGFuZCBjb21iaW5lIHJlc3VsdHNcbnN1bW1hcnlfZGF0YSA8LSBtYXBfZGZyKGdyb3VwcywgfiBwcm9jZXNzX2dyb3VwKC54LCBnZW5lLnRiLCBiaW5zLjEwa2IpKVxuXG4jIEFkZCB0aGUgYWRkaXRpb25hbCByb3dzIGZvciBkaXN0YW5jZUJpbiA9IDBcbnN1bW1hcnlfZGF0YSA8LSBzdW1tYXJ5X2RhdGEgJT4lXG4gIG11dGF0ZShkaXN0YW5jZUJpbiA9IGRpc3RhbmNlQmluICsgMSkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxcZ2VuZS5ncm91cDFcXCkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxcZ2VuZS5ncm91cDJcXClcblxuIyBQbG90IHRoZSByZXN1bHRzXG5wIDwtIGdncGxvdChzdW1tYXJ5X2RhdGEsIGFlcyh4ID0gZGlzdGFuY2VCaW4sIHkgPSBtZWFuX3BlYWtfY291bnRzLCBjb2xvciA9IGdyb3VwKSkgKyBcbiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICtcbiAgbGFicyhcbiAgICB4ID0gXFxEaXN0YW5jZSBiaW4gKDEwa2IpXFwsXG4gICAgeSA9IFxcSDNLNG1lMyBwZWFrIGNvdW50XFxcbiAgKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC44LCAwLjgpICAjIE1vdmVzIGxlZ2VuZCBpbnNpZGUgdGhlIHBsb3QgKHgsIHkgcmVsYXRpdmUgY29vcmRpbmF0ZXMpXG4gICkgK1xuICBndWlkZXMoXG4gICAgZmlsbCA9IGd1aWRlX2xlZ2VuZChcbiAgICAgIGtleXdpZHRoID0gMC4yLCAgIyBBZGp1c3QgdGhlIHdpZHRoIG9mIHRoZSBsZWdlbmQga2V5c1xuICAgICAga2V5aGVpZ2h0ID0gMC4yICAjIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWdlbmQga2V5c1xuICAgICkpK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcmV2KGMoXFwjNzc3Nzc3XFwsIFxcI0YyOEUyQ1xcKSkpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcYmluUGVha0RlbnNpdHlfUkFEMjFfYmluYXJ5R3JvdXBcXClcbndpZHRoIDwtIDMyKm1tVG9JbmNoXG5oZWlnaHQgPC0gMzUqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
process_group <- function(group_name, gene_data, bins) {
  # Filter for the specific group
  TSS_group <- makeGRangesFromDataFrame(
    gene_data %>% filter(ensembl %in% get(group_name)), 
    keep.extra.columns = TRUE
  )
  
  # Process each TSS in the group
  all_results <- map_dfr(seq_len(length(TSS_group)), function(i) {
    # Find overlapping bins
    overlapping_bins <- findOverlaps(TSS_group[i], bins)
    bins_near_tss <- as_tibble(bins[subjectHits(overlapping_bins)])
    
    # Calculate distance bin
    TSScenter <- (as_tibble(TSS_group[i]) %>%
                    mutate(center = (start + end) / 2))$center
    centerBinStart <- floor(TSScenter / 10e3) * 10e3 + 1
    bins_near_tss <- bins_near_tss %>%
      mutate(distanceBin = abs((start - centerBinStart)) / 10e3)
    
    # Summarize results
    result <- bins_near_tss %>%
      group_by(distanceBin) %>%
      summarise(mean_peak_counts = mean(peak_counts, na.rm = TRUE), .groups = \drop\) %>%
      mutate(gene = TSS_group[i]$ensembl)
    return(result)
  })
  
  # Calculate mean and SD for the group
  mean_data <- all_results %>%
    group_by(distanceBin) %>%
    summarise(mean_peak_counts = mean(mean_peak_counts, na.rm = TRUE))
  
  sd_data <- all_results %>%
    group_by(distanceBin) %>%
    summarise(sd_peak_counts = sd(mean_peak_counts, na.rm = TRUE))
  
  # Join and add group name
  summary_data <- left_join(mean_data, sd_data, by = \distanceBin\) %>%
    mutate(group = group_name)
  
  return(summary_data)
}

##########################################################



## Import peak
refDir <- here(\../..\, \reference\)
#peak.H3K27ac <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
peak.H3K27ac <- importPeak(here(refDir, \33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.bed\))
#peak.H3K27ac <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))

## Import 10kb bin
temp <- fread(here(refDir, \mm10.bin.10kb.bed\))
colnames(temp) <- c(\chr\, \start\, \end\)
temp <- temp %>% dplyr::mutate(start = start+1)
bins.10kb <- makeGRangesFromDataFrame(temp)

## Count overlap
counts <- countOverlaps(bins.10kb, peak.H3K27ac)
mcols(bins.10kb)$peak_counts <- counts

## Getting TSS
flankSize <- 1e6
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6)
colnames(gene.tb) <- c(\chr\, \start\, \end\, \ensembl\)

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

#TSS1mb.group1.gr <- makeGRangesFromDataFrame(gene.tb %>% dplyr::filter(ensembl %in% gene.group1), keep.extra.columns = TRUE)
#TSS1mb.group2.gr <- makeGRangesFromDataFrame(gene.tb %>% dplyr::filter(ensembl %in% gene.group2), keep.extra.columns = TRUE)

##########################################################
# List of groups to process
groups <- c(\gene.group1\, \gene.group2\)

# Process each group and combine results
summary_data <- map_dfr(groups, ~ process_group(.x, gene.tb, bins.10kb))

# Add the additional rows for distanceBin = 0
summary_data <- summary_data %>%
  mutate(distanceBin = distanceBin + 1) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \gene.group1\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \gene.group2\)

# Plot the results
p <- ggplot(summary_data, aes(x = distanceBin, y = mean_peak_counts, color = group)) + 
  geom_line(size = 0.5) +
  labs(
    x = \Distance bin (10kb)\,
    y = \H3K4me3 peak count\
  ) +
  theme_classic() +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS),
    legend.position = c(0.8, 0.8)  # Moves legend inside the plot (x, y relative coordinates)
  ) +
  guides(
    fill = guide_legend(
      keywidth = 0.2,  # Adjust the width of the legend keys
      keyheight = 0.2  # Adjust the height of the legend keys
    ))+
  scale_color_manual(values = rev(c(\#777777\, \#F28E2C\)))

##########################################################

fileName <- paste0(\binPeakDensity_RAD21_binaryGroup\)
width <- 32*mmToInch
height <- 35*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNISnZZMlZ6YzE5bmNtOTFjQ0E4TFNCbWRXNWpkR2x2YmlobmNtOTFjRjl1WVcxbExDQm5aVzVsWDJSaGRHRXNJR0pwYm5NcElIdGNiaUFnSXlCR2FXeDBaWElnWm05eUlIUm9aU0J6Y0dWamFXWnBZeUJuY205MWNGeHVJQ0JVVTFOZlozSnZkWEFnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0Z4dUlDQWdJR2RsYm1WZlpHRjBZU0FsUGlVZ1ptbHNkR1Z5S0dWdWMyVnRZbXdnSldsdUpTQm5aWFFvWjNKdmRYQmZibUZ0WlNrcExDQmNiaUFnSUNCclpXVndMbVY0ZEhKaExtTnZiSFZ0Ym5NZ1BTQlVVbFZGWEc0Z0lDbGNiaUFnWEc0Z0lDTWdVSEp2WTJWemN5QmxZV05vSUZSVFV5QnBiaUIwYUdVZ1ozSnZkWEJjYmlBZ1lXeHNYM0psYzNWc2RITWdQQzBnYldGd1gyUm1jaWh6WlhGZmJHVnVLR3hsYm1kMGFDaFVVMU5mWjNKdmRYQXBLU3dnWm5WdVkzUnBiMjRvYVNrZ2UxeHVJQ0FnSUNNZ1JtbHVaQ0J2ZG1WeWJHRndjR2x1WnlCaWFXNXpYRzRnSUNBZ2IzWmxjbXhoY0hCcGJtZGZZbWx1Y3lBOExTQm1hVzVrVDNabGNteGhjSE1vVkZOVFgyZHliM1Z3VzJsZExDQmlhVzV6S1Z4dUlDQWdJR0pwYm5OZmJtVmhjbDkwYzNNZ1BDMGdZWE5mZEdsaVlteGxLR0pwYm5OYmMzVmlhbVZqZEVocGRITW9iM1psY214aGNIQnBibWRmWW1sdWN5bGRLVnh1SUNBZ0lGeHVJQ0FnSUNNZ1EyRnNZM1ZzWVhSbElHUnBjM1JoYm1ObElHSnBibHh1SUNBZ0lGUlRVMk5sYm5SbGNpQThMU0FvWVhOZmRHbGlZbXhsS0ZSVFUxOW5jbTkxY0Z0cFhTa2dKVDRsWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMTFkR0YwWlNoalpXNTBaWElnUFNBb2MzUmhjblFnS3lCbGJtUXBJQzhnTWlrcEpHTmxiblJsY2x4dUlDQWdJR05sYm5SbGNrSnBibE4wWVhKMElEd3RJR1pzYjI5eUtGUlRVMk5sYm5SbGNpQXZJREV3WlRNcElDb2dNVEJsTXlBcklERmNiaUFnSUNCaWFXNXpYMjVsWVhKZmRITnpJRHd0SUdKcGJuTmZibVZoY2w5MGMzTWdKVDRsWEc0Z0lDQWdJQ0J0ZFhSaGRHVW9aR2x6ZEdGdVkyVkNhVzRnUFNCaFluTW9LSE4wWVhKMElDMGdZMlZ1ZEdWeVFtbHVVM1JoY25RcEtTQXZJREV3WlRNcFhHNGdJQ0FnWEc0Z0lDQWdJeUJUZFcxdFlYSnBlbVVnY21WemRXeDBjMXh1SUNBZ0lISmxjM1ZzZENBOExTQmlhVzV6WDI1bFlYSmZkSE56SUNVK0pWeHVJQ0FnSUNBZ1ozSnZkWEJmWW5rb1pHbHpkR0Z1WTJWQ2FXNHBJQ1UrSlZ4dUlDQWdJQ0FnYzNWdGJXRnlhWE5sS0cxbFlXNWZjR1ZoYTE5amIzVnVkSE1nUFNCdFpXRnVLSEJsWVd0ZlkyOTFiblJ6TENCdVlTNXliU0E5SUZSU1ZVVXBMQ0F1WjNKdmRYQnpJRDBnWEZ4a2NtOXdYRndwSUNVK0pWeHVJQ0FnSUNBZ2JYVjBZWFJsS0dkbGJtVWdQU0JVVTFOZlozSnZkWEJiYVYwa1pXNXpaVzFpYkNsY2JpQWdJQ0J5WlhSMWNtNG9jbVZ6ZFd4MEtWeHVJQ0I5S1Z4dUlDQmNiaUFnSXlCRFlXeGpkV3hoZEdVZ2JXVmhiaUJoYm1RZ1UwUWdabTl5SUhSb1pTQm5jbTkxY0Z4dUlDQnRaV0Z1WDJSaGRHRWdQQzBnWVd4c1gzSmxjM1ZzZEhNZ0pUNGxYRzRnSUNBZ1ozSnZkWEJmWW5rb1pHbHpkR0Z1WTJWQ2FXNHBJQ1UrSlZ4dUlDQWdJSE4xYlcxaGNtbHpaU2h0WldGdVgzQmxZV3RmWTI5MWJuUnpJRDBnYldWaGJpaHRaV0Z1WDNCbFlXdGZZMjkxYm5SekxDQnVZUzV5YlNBOUlGUlNWVVVwS1Z4dUlDQmNiaUFnYzJSZlpHRjBZU0E4TFNCaGJHeGZjbVZ6ZFd4MGN5QWxQaVZjYmlBZ0lDQm5jbTkxY0Y5aWVTaGthWE4wWVc1alpVSnBiaWtnSlQ0bFhHNGdJQ0FnYzNWdGJXRnlhWE5sS0hOa1gzQmxZV3RmWTI5MWJuUnpJRDBnYzJRb2JXVmhibDl3WldGclgyTnZkVzUwY3l3Z2JtRXVjbTBnUFNCVVVsVkZLU2xjYmlBZ1hHNGdJQ01nU205cGJpQmhibVFnWVdSa0lHZHliM1Z3SUc1aGJXVmNiaUFnYzNWdGJXRnllVjlrWVhSaElEd3RJR3hsWm5SZmFtOXBiaWh0WldGdVgyUmhkR0VzSUhOa1gyUmhkR0VzSUdKNUlEMGdYRnhrYVhOMFlXNWpaVUpwYmx4Y0tTQWxQaVZjYmlBZ0lDQnRkWFJoZEdVb1ozSnZkWEFnUFNCbmNtOTFjRjl1WVcxbEtWeHVJQ0JjYmlBZ2NtVjBkWEp1S0hOMWJXMWhjbmxmWkdGMFlTbGNibjFjYmx4dUl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJMXh1WEc1Y2JseHVJeU1nU1cxd2IzSjBJSEJsWVd0Y2JuSmxaa1JwY2lBOExTQm9aWEpsS0Z4Y0xpNHZMaTVjWEN3Z1hGeHlaV1psY21WdVkyVmNYQ2xjYmlOd1pXRnJMa2d6U3pJM1lXTWdQQzBnYVcxd2IzSjBVR1ZoYXlob1pYSmxLSEpsWmtScGNpd2dYRnhIVTAweU5ETTRORGMyWDBWRExVUkhMVE0wTlRndFNETkxNamRCUTE5QlUxbE9YekV1Ym1GeWNtOTNVR1ZoYXk1aVpXUmNYQ2twWEc1d1pXRnJMa2d6U3pJM1lXTWdQQzBnYVcxd2IzSjBVR1ZoYXlob1pYSmxLSEpsWmtScGNpd2dYRnd6TXpJMU5WOUlNMHMwYldVelh6QTBMVGMwTlY5Q2NuVmpaUzAwWDNCbFlXdHpMbTFsY21kbFVHVmhheTVpWldSY1hDa3BYRzRqY0dWaGF5NUlNMHN5TjJGaklEd3RJR2x0Y0c5eWRGQmxZV3NvYUdWeVpTaHlaV1pFYVhJc0lGeGNNek15TlRCZlVrRkVNakZmWVdJNU9USmZRbkoxWTJVdE5GOXdaV0ZyY3k1dFpYSm5aVkJsWVdzdVltVmtYRndwS1Z4dVhHNGpJeUJKYlhCdmNuUWdNVEJyWWlCaWFXNWNiblJsYlhBZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjYlcweE1DNWlhVzR1TVRCcllpNWlaV1JjWENrcFhHNWpiMnh1WVcxbGN5aDBaVzF3S1NBOExTQmpLRnhjWTJoeVhGd3NJRnhjYzNSaGNuUmNYQ3dnWEZ4bGJtUmNYQ2xjYm5SbGJYQWdQQzBnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaHpkR0Z5ZENBOUlITjBZWEowS3pFcFhHNWlhVzV6TGpFd2EySWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLSFJsYlhBcFhHNWNiaU1qSUVOdmRXNTBJRzkyWlhKc1lYQmNibU52ZFc1MGN5QThMU0JqYjNWdWRFOTJaWEpzWVhCektHSnBibk11TVRCcllpd2djR1ZoYXk1SU0wc3lOMkZqS1Z4dWJXTnZiSE1vWW1sdWN5NHhNR3RpS1NSd1pXRnJYMk52ZFc1MGN5QThMU0JqYjNWdWRITmNibHh1SXlNZ1IyVjBkR2x1WnlCVVUxTmNibVpzWVc1clUybDZaU0E4TFNBeFpUWmNibWRsYm1VdWRHSWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y2JXMHhNRjlIVWtOdE16Z3VjRFpmWjJWdVpWOXpiM0owWldRdVltVmtYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaFVVMU1nUFNCcFptVnNjMlVvVmpRZ1BUMGdYRndyWEZ3c0lGWXlMQ0JXTXlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ZGTlRjM1JoY25RZ1BTQlVVMU1nTFNCbWJHRnVhMU5wZW1Vc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ZGTlRaVzVrSUQwZ1ZGTlRJQ3NnWm14aGJtdFRhWHBsS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaFdNU3dnVkZOVGMzUmhjblFzSUZSVFUyVnVaQ3dnVmpZcFhHNWpiMnh1WVcxbGN5aG5aVzVsTG5SaUtTQThMU0JqS0Z4Y1kyaHlYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWEN3Z1hGeGxibk5sYldKc1hGd3BYRzVjYm1kbGJtVXVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdkbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhGd3BLU1JuWlc1bFhHNW5aVzVsTG1keWIzVndNaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeG5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWW1sdVlYSjVSM0p2ZFhBeUxuUnpkbHhjS1Nra1oyVnVaVnh1WEc0alZGTlRNVzFpTG1keWIzVndNUzVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1oyVnVaUzUwWWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobGJuTmxiV0pzSUNWcGJpVWdaMlZ1WlM1bmNtOTFjREVwTENCclpXVndMbVY0ZEhKaExtTnZiSFZ0Ym5NZ1BTQlVVbFZGS1Z4dUkxUlRVekZ0WWk1bmNtOTFjREl1WjNJZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtHZGxibVV1ZEdJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1pXNXpaVzFpYkNBbGFXNGxJR2RsYm1VdVozSnZkWEF5S1N3Z2EyVmxjQzVsZUhSeVlTNWpiMngxYlc1eklEMGdWRkpWUlNsY2JseHVJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSTF4dUl5Qk1hWE4wSUc5bUlHZHliM1Z3Y3lCMGJ5QndjbTlqWlhOelhHNW5jbTkxY0hNZ1BDMGdZeWhjWEdkbGJtVXVaM0p2ZFhBeFhGd3NJRnhjWjJWdVpTNW5jbTkxY0RKY1hDbGNibHh1SXlCUWNtOWpaWE56SUdWaFkyZ2daM0p2ZFhBZ1lXNWtJR052YldKcGJtVWdjbVZ6ZFd4MGMxeHVjM1Z0YldGeWVWOWtZWFJoSUR3dElHMWhjRjlrWm5Jb1ozSnZkWEJ6TENCK0lIQnliMk5sYzNOZlozSnZkWEFvTG5nc0lHZGxibVV1ZEdJc0lHSnBibk11TVRCcllpa3BYRzVjYmlNZ1FXUmtJSFJvWlNCaFpHUnBkR2x2Ym1Gc0lISnZkM01nWm05eUlHUnBjM1JoYm1ObFFtbHVJRDBnTUZ4dWMzVnRiV0Z5ZVY5a1lYUmhJRHd0SUhOMWJXMWhjbmxmWkdGMFlTQWxQaVZjYmlBZ2JYVjBZWFJsS0dScGMzUmhibU5sUW1sdUlEMGdaR2x6ZEdGdVkyVkNhVzRnS3lBeEtTQWxQaVZjYmlBZ1lXUmtYM0p2ZHloa2FYTjBZVzVqWlVKcGJpQTlJREFzSUcxbFlXNWZjR1ZoYTE5amIzVnVkSE1nUFNBd0xDQnpaRjl3WldGclgyTnZkVzUwY3lBOUlEQXNJR2R5YjNWd0lEMGdYRnhuWlc1bExtZHliM1Z3TVZ4Y0tTQWxQaVZjYmlBZ1lXUmtYM0p2ZHloa2FYTjBZVzVqWlVKcGJpQTlJREFzSUcxbFlXNWZjR1ZoYTE5amIzVnVkSE1nUFNBd0xDQnpaRjl3WldGclgyTnZkVzUwY3lBOUlEQXNJR2R5YjNWd0lEMGdYRnhuWlc1bExtZHliM1Z3TWx4Y0tWeHVYRzRqSUZCc2IzUWdkR2hsSUhKbGMzVnNkSE5jYm5BZ1BDMGdaMmR3Ykc5MEtITjFiVzFoY25sZlpHRjBZU3dnWVdWektIZ2dQU0JrYVhOMFlXNWpaVUpwYml3Z2VTQTlJRzFsWVc1ZmNHVmhhMTlqYjNWdWRITXNJR052Ykc5eUlEMGdaM0p2ZFhBcEtTQXJJRnh1SUNCblpXOXRYMnhwYm1Vb2MybDZaU0E5SURBdU5Ta2dLMXh1SUNCc1lXSnpLRnh1SUNBZ0lIZ2dQU0JjWEVScGMzUmhibU5sSUdKcGJpQW9NVEJyWWlsY1hDeGNiaUFnSUNCNUlEMGdYRnhJTTBzMGJXVXpJSEJsWVdzZ1kyOTFiblJjWEZ4dUlDQXBJQ3RjYmlBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdkR2hsYldVb1hHNGdJQ0FnWVhocGN5NTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpVMHNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXViR2x1WlNBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUnBZMnR6SUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3hjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ4Y2RISmhibk53WVhKbGJuUmNYQ2tzWEc0Z0lDQWdiR1ZuWlc1a0xuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5a3NYRzRnSUNBZ2JHVm5aVzVrTG5CdmMybDBhVzl1SUQwZ1l5Z3dMamdzSURBdU9Da2dJQ01nVFc5MlpYTWdiR1ZuWlc1a0lHbHVjMmxrWlNCMGFHVWdjR3h2ZENBb2VDd2dlU0J5Wld4aGRHbDJaU0JqYjI5eVpHbHVZWFJsY3lsY2JpQWdLU0FyWEc0Z0lHZDFhV1JsY3loY2JpQWdJQ0JtYVd4c0lEMGdaM1ZwWkdWZmJHVm5aVzVrS0Z4dUlDQWdJQ0FnYTJWNWQybGtkR2dnUFNBd0xqSXNJQ0FqSUVGa2FuVnpkQ0IwYUdVZ2QybGtkR2dnYjJZZ2RHaGxJR3hsWjJWdVpDQnJaWGx6WEc0Z0lDQWdJQ0JyWlhsb1pXbG5hSFFnUFNBd0xqSWdJQ01nUVdScWRYTjBJSFJvWlNCb1pXbG5hSFFnYjJZZ2RHaGxJR3hsWjJWdVpDQnJaWGx6WEc0Z0lDQWdLU2tyWEc0Z0lITmpZV3hsWDJOdmJHOXlYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQnlaWFlvWXloY1hDTTNOemMzTnpkY1hDd2dYRndqUmpJNFJUSkRYRndwS1NsY2JseHVJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSTF4dVhHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhpYVc1UVpXRnJSR1Z1YzJsMGVWOVNRVVF5TVY5aWFXNWhjbmxIY205MWNGeGNLVnh1ZDJsa2RHZ2dQQzBnTXpJcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQXpOU3B0YlZSdlNXNWphRnh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG5wcm9jZXNzX2dyb3VwIDwtIGZ1bmN0aW9uKGdyb3VwX25hbWUsIGdlbmVfZGF0YSwgYmlucykge1xuICAjIEZpbHRlciBmb3IgdGhlIHNwZWNpZmljIGdyb3VwXG4gIFRTU19ncm91cCA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoXG4gICAgZ2VuZV9kYXRhICU+JSBmaWx0ZXIoZW5zZW1ibCAlaW4lIGdldChncm91cF9uYW1lKSksIFxuICAgIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUVcbiAgKVxuICBcbiAgIyBQcm9jZXNzIGVhY2ggVFNTIGluIHRoZSBncm91cFxuICBhbGxfcmVzdWx0cyA8LSBtYXBfZGZyKHNlcV9sZW4obGVuZ3RoKFRTU19ncm91cCkpLCBmdW5jdGlvbihpKSB7XG4gICAgIyBGaW5kIG92ZXJsYXBwaW5nIGJpbnNcbiAgICBvdmVybGFwcGluZ19iaW5zIDwtIGZpbmRPdmVybGFwcyhUU1NfZ3JvdXBbaV0sIGJpbnMpXG4gICAgYmluc19uZWFyX3RzcyA8LSBhc190aWJibGUoYmluc1tzdWJqZWN0SGl0cyhvdmVybGFwcGluZ19iaW5zKV0pXG4gICAgXG4gICAgIyBDYWxjdWxhdGUgZGlzdGFuY2UgYmluXG4gICAgVFNTY2VudGVyIDwtIChhc190aWJibGUoVFNTX2dyb3VwW2ldKSAlPiVcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGNlbnRlciA9IChzdGFydCArIGVuZCkgLyAyKSkkY2VudGVyXG4gICAgY2VudGVyQmluU3RhcnQgPC0gZmxvb3IoVFNTY2VudGVyIC8gMTBlMykgKiAxMGUzICsgMVxuICAgIGJpbnNfbmVhcl90c3MgPC0gYmluc19uZWFyX3RzcyAlPiVcbiAgICAgIG11dGF0ZShkaXN0YW5jZUJpbiA9IGFicygoc3RhcnQgLSBjZW50ZXJCaW5TdGFydCkpIC8gMTBlMylcbiAgICBcbiAgICAjIFN1bW1hcml6ZSByZXN1bHRzXG4gICAgcmVzdWx0IDwtIGJpbnNfbmVhcl90c3MgJT4lXG4gICAgICBncm91cF9ieShkaXN0YW5jZUJpbikgJT4lXG4gICAgICBzdW1tYXJpc2UobWVhbl9wZWFrX2NvdW50cyA9IG1lYW4ocGVha19jb3VudHMsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSBcXGRyb3BcXCkgJT4lXG4gICAgICBtdXRhdGUoZ2VuZSA9IFRTU19ncm91cFtpXSRlbnNlbWJsKVxuICAgIHJldHVybihyZXN1bHQpXG4gIH0pXG4gIFxuICAjIENhbGN1bGF0ZSBtZWFuIGFuZCBTRCBmb3IgdGhlIGdyb3VwXG4gIG1lYW5fZGF0YSA8LSBhbGxfcmVzdWx0cyAlPiVcbiAgICBncm91cF9ieShkaXN0YW5jZUJpbikgJT4lXG4gICAgc3VtbWFyaXNlKG1lYW5fcGVha19jb3VudHMgPSBtZWFuKG1lYW5fcGVha19jb3VudHMsIG5hLnJtID0gVFJVRSkpXG4gIFxuICBzZF9kYXRhIDwtIGFsbF9yZXN1bHRzICU+JVxuICAgIGdyb3VwX2J5KGRpc3RhbmNlQmluKSAlPiVcbiAgICBzdW1tYXJpc2Uoc2RfcGVha19jb3VudHMgPSBzZChtZWFuX3BlYWtfY291bnRzLCBuYS5ybSA9IFRSVUUpKVxuICBcbiAgIyBKb2luIGFuZCBhZGQgZ3JvdXAgbmFtZVxuICBzdW1tYXJ5X2RhdGEgPC0gbGVmdF9qb2luKG1lYW5fZGF0YSwgc2RfZGF0YSwgYnkgPSBcXGRpc3RhbmNlQmluXFwpICU+JVxuICAgIG11dGF0ZShncm91cCA9IGdyb3VwX25hbWUpXG4gIFxuICByZXR1cm4oc3VtbWFyeV9kYXRhKVxufVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cblxuXG4jIyBJbXBvcnQgcGVha1xucmVmRGlyIDwtIGhlcmUoXFwuLi8uLlxcLCBcXHJlZmVyZW5jZVxcKVxuI3BlYWsuSDNLMjdhYyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5uYXJyb3dQZWFrLmJlZFxcKSlcbnBlYWsuSDNLMjdhYyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjU1X0gzSzRtZTNfMDQtNzQ1X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbiNwZWFrLkgzSzI3YWMgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG5cbiMjIEltcG9ydCAxMGtiIGJpblxudGVtcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwLmJpbi4xMGtiLmJlZFxcKSlcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gc3RhcnQrMSlcbmJpbnMuMTBrYiA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcClcblxuIyMgQ291bnQgb3ZlcmxhcFxuY291bnRzIDwtIGNvdW50T3ZlcmxhcHMoYmlucy4xMGtiLCBwZWFrLkgzSzI3YWMpXG5tY29scyhiaW5zLjEwa2IpJHBlYWtfY291bnRzIDwtIGNvdW50c1xuXG4jIyBHZXR0aW5nIFRTU1xuZmxhbmtTaXplIDwtIDFlNlxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSxcbiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kLCBWNilcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGVuc2VtYmxcXClcblxuZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cbiNUU1MxbWIuZ3JvdXAxLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmwgJWluJSBnZW5lLmdyb3VwMSksIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpXG4jVFNTMW1iLmdyb3VwMi5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgZ2VuZS5ncm91cDIpLCBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIExpc3Qgb2YgZ3JvdXBzIHRvIHByb2Nlc3Ncbmdyb3VwcyA8LSBjKFxcZ2VuZS5ncm91cDFcXCwgXFxnZW5lLmdyb3VwMlxcKVxuXG4jIFByb2Nlc3MgZWFjaCBncm91cCBhbmQgY29tYmluZSByZXN1bHRzXG5zdW1tYXJ5X2RhdGEgPC0gbWFwX2Rmcihncm91cHMsIH4gcHJvY2Vzc19ncm91cCgueCwgZ2VuZS50YiwgYmlucy4xMGtiKSlcblxuIyBBZGQgdGhlIGFkZGl0aW9uYWwgcm93cyBmb3IgZGlzdGFuY2VCaW4gPSAwXG5zdW1tYXJ5X2RhdGEgPC0gc3VtbWFyeV9kYXRhICU+JVxuICBtdXRhdGUoZGlzdGFuY2VCaW4gPSBkaXN0YW5jZUJpbiArIDEpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXGdlbmUuZ3JvdXAxXFwpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXGdlbmUuZ3JvdXAyXFwpXG5cbiMgUGxvdCB0aGUgcmVzdWx0c1xucCA8LSBnZ3Bsb3Qoc3VtbWFyeV9kYXRhLCBhZXMoeCA9IGRpc3RhbmNlQmluLCB5ID0gbWVhbl9wZWFrX2NvdW50cywgY29sb3IgPSBncm91cCkpICsgXG4gIGdlb21fbGluZShzaXplID0gMC41KSArXG4gIGxhYnMoXG4gICAgeCA9IFxcRGlzdGFuY2UgYmluICgxMGtiKVxcLFxuICAgIHkgPSBcXEgzSzRtZTMgcGVhayBjb3VudFxcXG4gICkgK1xuICB0aGVtZV9jbGFzc2ljKCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuOCwgMC44KSAgIyBNb3ZlcyBsZWdlbmQgaW5zaWRlIHRoZSBwbG90ICh4LCB5IHJlbGF0aXZlIGNvb3JkaW5hdGVzKVxuICApICtcbiAgZ3VpZGVzKFxuICAgIGZpbGwgPSBndWlkZV9sZWdlbmQoXG4gICAgICBrZXl3aWR0aCA9IDAuMiwgICMgQWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgbGVnZW5kIGtleXNcbiAgICAgIGtleWhlaWdodCA9IDAuMiAgIyBBZGp1c3QgdGhlIGhlaWdodCBvZiB0aGUgbGVnZW5kIGtleXNcbiAgICApKStcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJldihjKFxcIzc3Nzc3N1xcLCBcXCNGMjhFMkNcXCkpKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGJpblBlYWtEZW5zaXR5X1JBRDIxX2JpbmFyeUdyb3VwXFwpXG53aWR0aCA8LSAzMiptbVRvSW5jaFxuaGVpZ2h0IDwtIDM1Km1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucHJvY2Vzc19ncm91cCA8LSBmdW5jdGlvbihncm91cF9uYW1lLCBnZW5lX2RhdGEsIGJpbnMpIHtcbiAgIyBGaWx0ZXIgZm9yIHRoZSBzcGVjaWZpYyBncm91cFxuICBUU1NfZ3JvdXAgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKFxuICAgIGdlbmVfZGF0YSAlPiUgZmlsdGVyKGVuc2VtYmwgJWluJSBnZXQoZ3JvdXBfbmFtZSkpLCBcbiAgICBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFXG4gIClcbiAgXG4gICMgUHJvY2VzcyBlYWNoIFRTUyBpbiB0aGUgZ3JvdXBcbiAgYWxsX3Jlc3VsdHMgPC0gbWFwX2RmcihzZXFfbGVuKGxlbmd0aChUU1NfZ3JvdXApKSwgZnVuY3Rpb24oaSkge1xuICAgICMgRmluZCBvdmVybGFwcGluZyBiaW5zXG4gICAgb3ZlcmxhcHBpbmdfYmlucyA8LSBmaW5kT3ZlcmxhcHMoVFNTX2dyb3VwW2ldLCBiaW5zKVxuICAgIGJpbnNfbmVhcl90c3MgPC0gYXNfdGliYmxlKGJpbnNbc3ViamVjdEhpdHMob3ZlcmxhcHBpbmdfYmlucyldKVxuICAgIFxuICAgICMgQ2FsY3VsYXRlIGRpc3RhbmNlIGJpblxuICAgIFRTU2NlbnRlciA8LSAoYXNfdGliYmxlKFRTU19ncm91cFtpXSkgJT4lXG4gICAgICAgICAgICAgICAgICAgIG11dGF0ZShjZW50ZXIgPSAoc3RhcnQgKyBlbmQpIC8gMikpJGNlbnRlclxuICAgIGNlbnRlckJpblN0YXJ0IDwtIGZsb29yKFRTU2NlbnRlciAvIDEwZTMpICogMTBlMyArIDFcbiAgICBiaW5zX25lYXJfdHNzIDwtIGJpbnNfbmVhcl90c3MgJT4lXG4gICAgICBtdXRhdGUoZGlzdGFuY2VCaW4gPSBhYnMoKHN0YXJ0IC0gY2VudGVyQmluU3RhcnQpKSAvIDEwZTMpXG4gICAgXG4gICAgIyBTdW1tYXJpemUgcmVzdWx0c1xuICAgIHJlc3VsdCA8LSBiaW5zX25lYXJfdHNzICU+JVxuICAgICAgZ3JvdXBfYnkoZGlzdGFuY2VCaW4pICU+JVxuICAgICAgc3VtbWFyaXNlKG1lYW5fcGVha19jb3VudHMgPSBtZWFuKHBlYWtfY291bnRzLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gXFxkcm9wXFwpICU+JVxuICAgICAgbXV0YXRlKGdlbmUgPSBUU1NfZ3JvdXBbaV0kZW5zZW1ibClcbiAgICByZXR1cm4ocmVzdWx0KVxuICB9KVxuICBcbiAgIyBDYWxjdWxhdGUgbWVhbiBhbmQgU0QgZm9yIHRoZSBncm91cFxuICBtZWFuX2RhdGEgPC0gYWxsX3Jlc3VsdHMgJT4lXG4gICAgZ3JvdXBfYnkoZGlzdGFuY2VCaW4pICU+JVxuICAgIHN1bW1hcmlzZShtZWFuX3BlYWtfY291bnRzID0gbWVhbihtZWFuX3BlYWtfY291bnRzLCBuYS5ybSA9IFRSVUUpKVxuICBcbiAgc2RfZGF0YSA8LSBhbGxfcmVzdWx0cyAlPiVcbiAgICBncm91cF9ieShkaXN0YW5jZUJpbikgJT4lXG4gICAgc3VtbWFyaXNlKHNkX3BlYWtfY291bnRzID0gc2QobWVhbl9wZWFrX2NvdW50cywgbmEucm0gPSBUUlVFKSlcbiAgXG4gICMgSm9pbiBhbmQgYWRkIGdyb3VwIG5hbWVcbiAgc3VtbWFyeV9kYXRhIDwtIGxlZnRfam9pbihtZWFuX2RhdGEsIHNkX2RhdGEsIGJ5ID0gXFxkaXN0YW5jZUJpblxcKSAlPiVcbiAgICBtdXRhdGUoZ3JvdXAgPSBncm91cF9uYW1lKVxuICBcbiAgcmV0dXJuKHN1bW1hcnlfZGF0YSlcbn1cblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5cblxuIyMgSW1wb3J0IHBlYWtcbnJlZkRpciA8LSBoZXJlKFxcLi4vLi5cXCwgXFxyZWZlcmVuY2VcXClcbiNwZWFrLkgzSzI3YWMgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWRcXCkpXG5wZWFrLkgzSzI3YWMgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG4jcGVhay5IM0syN2FjIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxuXG4jIyBJbXBvcnQgMTBrYiBiaW5cbnRlbXAgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMC5iaW4uMTBrYi5iZWRcXCkpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IHN0YXJ0KzEpXG5iaW5zLjEwa2IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5cbiMjIENvdW50IG92ZXJsYXBcbmNvdW50cyA8LSBjb3VudE92ZXJsYXBzKGJpbnMuMTBrYiwgcGVhay5IM0syN2FjKVxubWNvbHMoYmlucy4xMGtiKSRwZWFrX2NvdW50cyA8LSBjb3VudHNcblxuIyMgR2V0dGluZyBUU1NcbmZsYW5rU2l6ZSA8LSAxZTZcbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMyksXG4gICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsXG4gICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCwgVjYpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxlbnNlbWJsXFwpXG5cbmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5nZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG4jVFNTMW1iLmdyb3VwMS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgZ2VuZS5ncm91cDEpLCBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKVxuI1RTUzFtYi5ncm91cDIuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdlbmUuZ3JvdXAyKSwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSlcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIyBMaXN0IG9mIGdyb3VwcyB0byBwcm9jZXNzXG5ncm91cHMgPC0gYyhcXGdlbmUuZ3JvdXAxXFwsIFxcZ2VuZS5ncm91cDJcXClcblxuIyBQcm9jZXNzIGVhY2ggZ3JvdXAgYW5kIGNvbWJpbmUgcmVzdWx0c1xuc3VtbWFyeV9kYXRhIDwtIG1hcF9kZnIoZ3JvdXBzLCB+IHByb2Nlc3NfZ3JvdXAoLngsIGdlbmUudGIsIGJpbnMuMTBrYikpXG5cbiMgQWRkIHRoZSBhZGRpdGlvbmFsIHJvd3MgZm9yIGRpc3RhbmNlQmluID0gMFxuc3VtbWFyeV9kYXRhIDwtIHN1bW1hcnlfZGF0YSAlPiVcbiAgbXV0YXRlKGRpc3RhbmNlQmluID0gZGlzdGFuY2VCaW4gKyAxKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxnZW5lLmdyb3VwMVxcKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxnZW5lLmdyb3VwMlxcKVxuXG4jIFBsb3QgdGhlIHJlc3VsdHNcbnAgPC0gZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSBkaXN0YW5jZUJpbiwgeSA9IG1lYW5fcGVha19jb3VudHMsIGNvbG9yID0gZ3JvdXApKSArIFxuICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgK1xuICBsYWJzKFxuICAgIHggPSBcXERpc3RhbmNlIGJpbiAoMTBrYilcXCxcbiAgICB5ID0gXFxIM0s0bWUzIHBlYWsgY291bnRcXFxuICApICtcbiAgdGhlbWVfY2xhc3NpYygpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjgsIDAuOCkgICMgTW92ZXMgbGVnZW5kIGluc2lkZSB0aGUgcGxvdCAoeCwgeSByZWxhdGl2ZSBjb29yZGluYXRlcylcbiAgKSArXG4gIGd1aWRlcyhcbiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKFxuICAgICAga2V5d2lkdGggPSAwLjIsICAjIEFkanVzdCB0aGUgd2lkdGggb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgICBrZXloZWlnaHQgPSAwLjIgICMgQWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgKSkrXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSByZXYoYyhcXCM3Nzc3NzdcXCwgXFwjRjI4RTJDXFwpKSlcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxiaW5QZWFrRGVuc2l0eV9SQUQyMV9iaW5hcnlHcm91cFxcKVxud2lkdGggPC0gMzIqbW1Ub0luY2hcbmhlaWdodCA8LSAzNSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
process_group <- function(group_name, gene_data, bins) {
  # Filter for the specific group
  TSS_group <- makeGRangesFromDataFrame(
    gene_data %>% filter(ensembl %in% get(group_name)), 
    keep.extra.columns = TRUE
  )
  
  # Process each TSS in the group
  all_results <- map_dfr(seq_len(length(TSS_group)), function(i) {
    # Find overlapping bins
    overlapping_bins <- findOverlaps(TSS_group[i], bins)
    bins_near_tss <- as_tibble(bins[subjectHits(overlapping_bins)])
    
    # Calculate distance bin
    TSScenter <- (as_tibble(TSS_group[i]) %>%
                    mutate(center = (start + end) / 2))$center
    centerBinStart <- floor(TSScenter / 10e3) * 10e3 + 1
    bins_near_tss <- bins_near_tss %>%
      mutate(distanceBin = abs((start - centerBinStart)) / 10e3)
    
    # Summarize results
    result <- bins_near_tss %>%
      group_by(distanceBin) %>%
      summarise(mean_peak_counts = mean(peak_counts, na.rm = TRUE), .groups = \drop\) %>%
      mutate(gene = TSS_group[i]$ensembl)
    return(result)
  })
  
  # Calculate mean and SD for the group
  mean_data <- all_results %>%
    group_by(distanceBin) %>%
    summarise(mean_peak_counts = mean(mean_peak_counts, na.rm = TRUE))
  
  sd_data <- all_results %>%
    group_by(distanceBin) %>%
    summarise(sd_peak_counts = sd(mean_peak_counts, na.rm = TRUE))
  
  # Join and add group name
  summary_data <- left_join(mean_data, sd_data, by = \distanceBin\) %>%
    mutate(group = group_name)
  
  return(summary_data)
}

##########################################################



## Import peak
refDir <- here(\../..\, \reference\)
#peak.H3K27ac <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
peak.H3K27ac <- importPeak(here(refDir, \33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.bed\))
#peak.H3K27ac <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))

## Import 10kb bin
temp <- fread(here(refDir, \mm10.bin.10kb.bed\))
colnames(temp) <- c(\chr\, \start\, \end\)
temp <- temp %>% dplyr::mutate(start = start+1)
bins.10kb <- makeGRangesFromDataFrame(temp)

## Count overlap
counts <- countOverlaps(bins.10kb, peak.H3K27ac)
mcols(bins.10kb)$peak_counts <- counts

## Getting TSS
flankSize <- 1e6
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6)
colnames(gene.tb) <- c(\chr\, \start\, \end\, \ensembl\)

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

#TSS1mb.group1.gr <- makeGRangesFromDataFrame(gene.tb %>% dplyr::filter(ensembl %in% gene.group1), keep.extra.columns = TRUE)
#TSS1mb.group2.gr <- makeGRangesFromDataFrame(gene.tb %>% dplyr::filter(ensembl %in% gene.group2), keep.extra.columns = TRUE)

##########################################################
# List of groups to process
groups <- c(\gene.group1\, \gene.group2\)

# Process each group and combine results
summary_data <- map_dfr(groups, ~ process_group(.x, gene.tb, bins.10kb))

# Add the additional rows for distanceBin = 0
summary_data <- summary_data %>%
  mutate(distanceBin = distanceBin + 1) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \gene.group1\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \gene.group2\)

# Plot the results
p <- ggplot(summary_data, aes(x = distanceBin, y = mean_peak_counts, color = group)) + 
  geom_line(size = 0.5) +
  labs(
    x = \Distance bin (10kb)\,
    y = \H3K4me3 peak count\
  ) +
  theme_classic() +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS),
    legend.position = c(0.8, 0.8)  # Moves legend inside the plot (x, y relative coordinates)
  ) +
  guides(
    fill = guide_legend(
      keywidth = 0.2,  # Adjust the width of the legend keys
      keyheight = 0.2  # Adjust the height of the legend keys
    ))+
  scale_color_manual(values = rev(c(\#777777\, \#F28E2C\)))

##########################################################

fileName <- paste0(\binPeakDensity_RAD21_binaryGroup\)
width <- 32*mmToInch
height <- 35*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### TSS

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzRqSXlNakl5TWpJRVJQYVc1bklIUm9hWE1nWm05eUlGQXRVeUJuY205MWNITmNibkpsYzNWc2RFUnBjaUE4TFNCb1pYSmxLRndpTGk0dkxpNHZjbVZ6ZFd4MFhDSXBYRzUwWlcxd01pQThMU0J5WldGa1VrUlRLR2hsY21Vb2NtVnpkV3gwUkdseUxDQmNJbWRsYm1WZmJHOXZjRjlzYVc1ckxuSmtjMXdpS1NsY2JseHVjSE5QZG1WeU5DQThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCeklENDlJRFFwS1NSblpXNWxYRzV3YzA5MlpYSXpJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNITWdQajBnTXl3Z2JuVnRYM0J6SUR3Z05Da3BKR2RsYm1WY2JuQnpUM1psY2pJZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y3lBK1BTQXlMQ0J1ZFcxZmNITWdQQ0F6S1Nra1oyVnVaVnh1Y0hOUGRtVnlNU0E4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQnpJRDQ5SURFc0lHNTFiVjl3Y3lBOElESXBLU1JuWlc1bFhHNXdjMDkyWlhJd0lEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hNZ1BDQXhLU2trWjJWdVpWeHVYRzRqSUV4cGMzUWdiMllnWjNKdmRYQnpJSFJ2SUhCeWIyTmxjM05jYm1keWIzVndjeUE4TFNCaktGd2ljSE5QZG1WeU1Gd2lMQ0JjSW5CelQzWmxjakZjSWl3Z1hDSndjMDkyWlhJeVhDSXNJRndpY0hOUGRtVnlNMXdpTENCY0luQnpUM1psY2pSY0lpbGNibHh1SXlCUWNtOWpaWE56SUdWaFkyZ2daM0p2ZFhBZ1lXNWtJR052YldKcGJtVWdjbVZ6ZFd4MGMxeHVjM1Z0YldGeWVWOWtZWFJoSUR3dElHMWhjRjlrWm5Jb1ozSnZkWEJ6TENCK0lIQnliMk5sYzNOZlozSnZkWEFvTG5nc0lHZGxibVV1ZEdJc0lHSnBibk11TVRCcllpa3BYRzVjYmlNZ1FXUmtJSFJvWlNCaFpHUnBkR2x2Ym1Gc0lISnZkM01nWm05eUlHUnBjM1JoYm1ObFFtbHVJRDBnTUZ4dWMzVnRiV0Z5ZVY5a1lYUmhJRHd0SUhOMWJXMWhjbmxmWkdGMFlTQWxQaVZjYmlBZ2JYVjBZWFJsS0dScGMzUmhibU5sUW1sdUlEMGdaR2x6ZEdGdVkyVkNhVzRnS3lBeEtTQWxQaVZjYmlBZ1lXUmtYM0p2ZHloa2FYTjBZVzVqWlVKcGJpQTlJREFzSUcxbFlXNWZjR1ZoYTE5amIzVnVkSE1nUFNBd0xDQnpaRjl3WldGclgyTnZkVzUwY3lBOUlEQXNJR2R5YjNWd0lEMGdYQ0p3YzA5MlpYSXdYQ0lwSUNVK0pWeHVJQ0JoWkdSZmNtOTNLR1JwYzNSaGJtTmxRbWx1SUQwZ01Dd2diV1ZoYmw5d1pXRnJYMk52ZFc1MGN5QTlJREFzSUhOa1gzQmxZV3RmWTI5MWJuUnpJRDBnTUN3Z1ozSnZkWEFnUFNCY0luQnpUM1psY2pGY0lpa2dKVDRsWEc0Z0lHRmtaRjl5YjNjb1pHbHpkR0Z1WTJWQ2FXNGdQU0F3TENCdFpXRnVYM0JsWVd0ZlkyOTFiblJ6SUQwZ01Dd2djMlJmY0dWaGExOWpiM1Z1ZEhNZ1BTQXdMQ0JuY205MWNDQTlJRndpY0hOUGRtVnlNbHdpS1NBbFBpVmNiaUFnWVdSa1gzSnZkeWhrYVhOMFlXNWpaVUpwYmlBOUlEQXNJRzFsWVc1ZmNHVmhhMTlqYjNWdWRITWdQU0F3TENCelpGOXdaV0ZyWDJOdmRXNTBjeUE5SURBc0lHZHliM1Z3SUQwZ1hDSndjMDkyWlhJelhDSXBKVDRsWEc0Z0lHRmtaRjl5YjNjb1pHbHpkR0Z1WTJWQ2FXNGdQU0F3TENCdFpXRnVYM0JsWVd0ZlkyOTFiblJ6SUQwZ01Dd2djMlJmY0dWaGExOWpiM1Z1ZEhNZ1BTQXdMQ0JuY205MWNDQTlJRndpY0hOUGRtVnlORndpS1Z4dVhHNGpJRkJzYjNRZ2RHaGxJSEpsYzNWc2RITmNibkFnUEMwZ1oyZHdiRzkwS0hOMWJXMWhjbmxmWkdGMFlTd2dZV1Z6S0hnZ1BTQmthWE4wWVc1alpVSnBiaXdnZVNBOUlHMWxZVzVmY0dWaGExOWpiM1Z1ZEhNc0lHTnZiRzl5SUQwZ1ozSnZkWEFwS1NBcklGeHVJQ0JuWlc5dFgyeHBibVVvYzJsNlpTQTlJREF1TlNrZ0sxeHVJQ0JzWVdKektGeHVJQ0FnSUhnZ1BTQmNJa1JwYzNSaGJtTmxJR0pwYmlBb01UQnJZaWxjSWl4Y2JpQWdJQ0I1SUQwZ1hDSklNMHMwYldVeklIQmxZV3NnWTI5MWJuUmNJbHh1SUNBcElDdGNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3RjYmlBZ2RHaGxiV1VvWEc0Z0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRndpZEhKaGJuTndZWEpsYm5SY0lpa3NYRzRnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnYkdWblpXNWtMbkJ2YzJsMGFXOXVJRDBnWXlnd0xqZ3NJREF1T0NrZ0lDTWdUVzkyWlhNZ2JHVm5aVzVrSUdsdWMybGtaU0IwYUdVZ2NHeHZkQ0FvZUN3Z2VTQnlaV3hoZEdsMlpTQmpiMjl5WkdsdVlYUmxjeWxjYmlBZ0tTQXJYRzRnSUdkMWFXUmxjeWhjYmlBZ0lDQm1hV3hzSUQwZ1ozVnBaR1ZmYkdWblpXNWtLRnh1SUNBZ0lDQWdhMlY1ZDJsa2RHZ2dQU0F3TGpJc0lDQWpJRUZrYW5WemRDQjBhR1VnZDJsa2RHZ2diMllnZEdobElHeGxaMlZ1WkNCclpYbHpYRzRnSUNBZ0lDQnJaWGxvWldsbmFIUWdQU0F3TGpJZ0lDTWdRV1JxZFhOMElIUm9aU0JvWldsbmFIUWdiMllnZEdobElHeGxaMlZ1WkNCclpYbHpYRzRnSUNBZ0tTa3JYRzRnSUhOallXeGxYMk52Ykc5eVgyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGd2lJemMzTnpjM04xd2lMQ0JjSWlNNFFqZEZOalZjSWl3Z1hDSWpRVEk0TkRVeVhDSXNJRndpSTBNeU9EZzBSRndpTENCY0lpTkdNamhGTWtOY0lpa3BYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0ltSnBibEJsWVd0RVpXNXphWFI1WDFKQlJESXhYM0J6UjNKdmRYQXhNVndpS1Z4dWQybGtkR2dnUEMwZ016SXFiVzFVYjBsdVkyaGNibWhsYVdkb2RDQThMU0F6TlNwdGJWUnZTVzVqYUZ4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc0akl5TWdVRVZjYm5CbFQzWmxjalFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdaU0ErUFNBMEtTa2taMlZ1WlZ4dWNHVlBkbVZ5TXlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0JsSUQ0OUlETXNJRzUxYlY5d1pTQThJRFFwS1NSblpXNWxYRzV3WlU5MlpYSXlJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNHVWdQajBnTWl3Z2JuVnRYM0JsSUR3Z015a3BKR2RsYm1WY2JuQmxUM1psY2pFZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3WlNBK1BTQXhMQ0J1ZFcxZmNHVWdQQ0F5S1Nra1oyVnVaVnh1Y0dWUGRtVnlNQ0E4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQmxJRHdnTVNrcEpHZGxibVZjYmx4dUl5Qk1hWE4wSUc5bUlHZHliM1Z3Y3lCMGJ5QndjbTlqWlhOelhHNW5jbTkxY0hNZ1BDMGdZeWhjSW5CbFQzWmxjakJjSWl3Z1hDSndaVTkyWlhJeFhDSXNJRndpY0dWUGRtVnlNbHdpTENCY0luQmxUM1psY2pOY0lpd2dYQ0p3WlU5MlpYSTBYQ0lwWEc1Y2JpTWdVSEp2WTJWemN5QmxZV05vSUdkeWIzVndJR0Z1WkNCamIyMWlhVzVsSUhKbGMzVnNkSE5jYm5OMWJXMWhjbmxmWkdGMFlTQThMU0J0WVhCZlpHWnlLR2R5YjNWd2N5d2dmaUJ3Y205alpYTnpYMmR5YjNWd0tDNTRMQ0JuWlc1bExuUmlMQ0JpYVc1ekxqRXdhMklwS1Z4dVhHNGpJRUZrWkNCMGFHVWdZV1JrYVhScGIyNWhiQ0J5YjNkeklHWnZjaUJrYVhOMFlXNWpaVUpwYmlBOUlEQmNibk4xYlcxaGNubGZaR0YwWVNBOExTQnpkVzF0WVhKNVgyUmhkR0VnSlQ0bFhHNGdJRzExZEdGMFpTaGthWE4wWVc1alpVSnBiaUE5SUdScGMzUmhibU5sUW1sdUlDc2dNU2tnSlQ0bFhHNGdJR0ZrWkY5eWIzY29aR2x6ZEdGdVkyVkNhVzRnUFNBd0xDQnRaV0Z1WDNCbFlXdGZZMjkxYm5SeklEMGdNQ3dnYzJSZmNHVmhhMTlqYjNWdWRITWdQU0F3TENCbmNtOTFjQ0E5SUZ3aWNHVlBkbVZ5TUZ3aUtTQWxQaVZjYmlBZ1lXUmtYM0p2ZHloa2FYTjBZVzVqWlVKcGJpQTlJREFzSUcxbFlXNWZjR1ZoYTE5amIzVnVkSE1nUFNBd0xDQnpaRjl3WldGclgyTnZkVzUwY3lBOUlEQXNJR2R5YjNWd0lEMGdYQ0p3WlU5MlpYSXhYQ0lwSUNVK0pWeHVJQ0JoWkdSZmNtOTNLR1JwYzNSaGJtTmxRbWx1SUQwZ01Dd2diV1ZoYmw5d1pXRnJYMk52ZFc1MGN5QTlJREFzSUhOa1gzQmxZV3RmWTI5MWJuUnpJRDBnTUN3Z1ozSnZkWEFnUFNCY0luQmxUM1psY2pKY0lpa2dKVDRsWEc0Z0lHRmtaRjl5YjNjb1pHbHpkR0Z1WTJWQ2FXNGdQU0F3TENCdFpXRnVYM0JsWVd0ZlkyOTFiblJ6SUQwZ01Dd2djMlJmY0dWaGExOWpiM1Z1ZEhNZ1BTQXdMQ0JuY205MWNDQTlJRndpY0dWUGRtVnlNMXdpS1NVK0pWeHVJQ0JoWkdSZmNtOTNLR1JwYzNSaGJtTmxRbWx1SUQwZ01Dd2diV1ZoYmw5d1pXRnJYMk52ZFc1MGN5QTlJREFzSUhOa1gzQmxZV3RmWTI5MWJuUnpJRDBnTUN3Z1ozSnZkWEFnUFNCY0luQmxUM1psY2pSY0lpbGNibHh1SXlCUWJHOTBJSFJvWlNCeVpYTjFiSFJ6WEc1blozQnNiM1FvYzNWdGJXRnllVjlrWVhSaExDQmhaWE1vZUNBOUlHUnBjM1JoYm1ObFFtbHVMQ0I1SUQwZ2JXVmhibDl3WldGclgyTnZkVzUwY3l3Z1kyOXNiM0lnUFNCbmNtOTFjQ2twSUNzZ1hHNGdJR2RsYjIxZmJHbHVaU2h6YVhwbElEMGdNU2tnS3lCNGJHbHRLREFzSURFd0tTdGNiaUFnYkdGaWN5aGNiaUFnSUNCMGFYUnNaU0E5SUZ3aVRXVmhiaUJRWldGcklFTnZkVzUwYzF3aUxGeHVJQ0FnSUhnZ1BTQmNJa1JwYzNSaGJtTmxJRUpwYmlBb01UQWdhMklwWENJc1hHNGdJQ0FnZVNBOUlGd2lUV1ZoYmlCUVpXRnJJRU52ZFc1MGMxd2lYRzRnSUNrZ0sxeHVJQ0IwYUdWdFpWOXRhVzVwYldGc0tDa2dLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQndiRzkwTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHaHFkWE4wSUQwZ01DNDFMQ0J6YVhwbElEMGdNVFFzSUdaaFkyVWdQU0JjSW1KdmJHUmNJaWtzWEc0Z0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBeE1pa3NYRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTVRNcFhHNGdJQ2xjYmx4dUl5TWpJeU1qSXlNakl5TWpJeU1qWEc1d2NFOTJaWEkwSUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSEFnUGowZ05Da3BKR2RsYm1WY2JuQndUM1psY2pNZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y0NBK1BTQXpMQ0J1ZFcxZmNIQWdQQ0EwS1Nra1oyVnVaVnh1Y0hCUGRtVnlNaUE4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQndJRDQ5SURJc0lHNTFiVjl3Y0NBOElETXBLU1JuWlc1bFhHNXdjRTkyWlhJeElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hBZ1BqMGdNU3dnYm5WdFgzQndJRHdnTWlrcEpHZGxibVZjYm5Cd1QzWmxjakFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjQ0E4SURFcEtTUm5aVzVsWEc1Y2JpTWdUR2x6ZENCdlppQm5jbTkxY0hNZ2RHOGdjSEp2WTJWemMxeHVaM0p2ZFhCeklEd3RJR01vWENKd2NFOTJaWEl3WENJc0lGd2ljSEJQZG1WeU1Wd2lMQ0JjSW5Cd1QzWmxjakpjSWl3Z1hDSndjRTkyWlhJelhDSXNJRndpY0hCUGRtVnlORndpS1Z4dVhHNGpJRkJ5YjJObGMzTWdaV0ZqYUNCbmNtOTFjQ0JoYm1RZ1kyOXRZbWx1WlNCeVpYTjFiSFJ6WEc1emRXMXRZWEo1WDJSaGRHRWdQQzBnYldGd1gyUm1jaWhuY205MWNITXNJSDRnY0hKdlkyVnpjMTluY205MWNDZ3VlQ3dnWjJWdVpTNTBZaXdnWW1sdWN5NHhNR3RpS1NsY2JseHVJeUJCWkdRZ2RHaGxJR0ZrWkdsMGFXOXVZV3dnY205M2N5Qm1iM0lnWkdsemRHRnVZMlZDYVc0Z1BTQXdYRzV6ZFcxdFlYSjVYMlJoZEdFZ1BDMGdjM1Z0YldGeWVWOWtZWFJoSUNVK0pWeHVJQ0J0ZFhSaGRHVW9aR2x6ZEdGdVkyVkNhVzRnUFNCa2FYTjBZVzVqWlVKcGJpQXJJREVwSUNVK0pWeHVJQ0JoWkdSZmNtOTNLR1JwYzNSaGJtTmxRbWx1SUQwZ01Dd2diV1ZoYmw5d1pXRnJYMk52ZFc1MGN5QTlJREFzSUhOa1gzQmxZV3RmWTI5MWJuUnpJRDBnTUN3Z1ozSnZkWEFnUFNCY0luQndUM1psY2pCY0lpa2dKVDRsWEc0Z0lHRmtaRjl5YjNjb1pHbHpkR0Z1WTJWQ2FXNGdQU0F3TENCdFpXRnVYM0JsWVd0ZlkyOTFiblJ6SUQwZ01Dd2djMlJmY0dWaGExOWpiM1Z1ZEhNZ1BTQXdMQ0JuY205MWNDQTlJRndpY0hCUGRtVnlNVndpS1NBbFBpVmNiaUFnWVdSa1gzSnZkeWhrYVhOMFlXNWpaVUpwYmlBOUlEQXNJRzFsWVc1ZmNHVmhhMTlqYjNWdWRITWdQU0F3TENCelpGOXdaV0ZyWDJOdmRXNTBjeUE5SURBc0lHZHliM1Z3SUQwZ1hDSndjRTkyWlhJeVhDSXBJQ1UrSlZ4dUlDQmhaR1JmY205M0tHUnBjM1JoYm1ObFFtbHVJRDBnTUN3Z2JXVmhibDl3WldGclgyTnZkVzUwY3lBOUlEQXNJSE5rWDNCbFlXdGZZMjkxYm5SeklEMGdNQ3dnWjNKdmRYQWdQU0JjSW5Cd1QzWmxjak5jSWlrbFBpVmNiaUFnWVdSa1gzSnZkeWhrYVhOMFlXNWpaVUpwYmlBOUlEQXNJRzFsWVc1ZmNHVmhhMTlqYjNWdWRITWdQU0F3TENCelpGOXdaV0ZyWDJOdmRXNTBjeUE5SURBc0lHZHliM1Z3SUQwZ1hDSndjRTkyWlhJMFhDSXBYRzVjYmlNZ1VHeHZkQ0IwYUdVZ2NtVnpkV3gwYzF4dVoyZHdiRzkwS0hOMWJXMWhjbmxmWkdGMFlTd2dZV1Z6S0hnZ1BTQmthWE4wWVc1alpVSnBiaXdnZVNBOUlHMWxZVzVmY0dWaGExOWpiM1Z1ZEhNc0lHTnZiRzl5SUQwZ1ozSnZkWEFwS1NBcklGeHVJQ0JuWlc5dFgyeHBibVVvYzJsNlpTQTlJREVwSUN0Y2JpQWdiR0ZpY3loY2JpQWdJQ0IwYVhSc1pTQTlJRndpVFdWaGJpQlFaV0ZySUVOdmRXNTBjMXdpTEZ4dUlDQWdJSGdnUFNCY0lrUnBjM1JoYm1ObElFSnBiaUFvTVRBZ2EySXBYQ0lzWEc0Z0lDQWdlU0E5SUZ3aVRXVmhiaUJRWldGcklFTnZkVzUwYzF3aVhHNGdJQ2tnSzF4dUlDQjBhR1Z0WlY5dGFXNXBiV0ZzS0NrZ0sxeHVJQ0IwYUdWdFpTaGNiaUFnSUNCd2JHOTBMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0docWRYTjBJRDBnTUM0MUxDQnphWHBsSUQwZ01UUXNJR1poWTJVZ1BTQmNJbUp2YkdSY0lpa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0hOcGVtVWdQU0F4TWlrc1hHNGdJQ0FnWVhocGN5NTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdNVE1wWEc0Z0lDbGNibUJnWUNKOSAtLT5cblxuYGBgclxuXG4jIyMjIyMjIERPaW5nIHRoaXMgZm9yIFAtUyBncm91cHNcbnJlc3VsdERpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0XFwpXG50ZW1wMiA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rLnJkc1xcKSlcblxucHNPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDQpKSRnZW5lXG5wc092ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMywgbnVtX3BzIDwgNCkpJGdlbmVcbnBzT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAyLCBudW1fcHMgPCAzKSkkZ2VuZVxucHNPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDEsIG51bV9wcyA8IDIpKSRnZW5lXG5wc092ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPCAxKSkkZ2VuZVxuXG4jIExpc3Qgb2YgZ3JvdXBzIHRvIHByb2Nlc3Ncbmdyb3VwcyA8LSBjKFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXClcblxuIyBQcm9jZXNzIGVhY2ggZ3JvdXAgYW5kIGNvbWJpbmUgcmVzdWx0c1xuc3VtbWFyeV9kYXRhIDwtIG1hcF9kZnIoZ3JvdXBzLCB+IHByb2Nlc3NfZ3JvdXAoLngsIGdlbmUudGIsIGJpbnMuMTBrYikpXG5cbiMgQWRkIHRoZSBhZGRpdGlvbmFsIHJvd3MgZm9yIGRpc3RhbmNlQmluID0gMFxuc3VtbWFyeV9kYXRhIDwtIHN1bW1hcnlfZGF0YSAlPiVcbiAgbXV0YXRlKGRpc3RhbmNlQmluID0gZGlzdGFuY2VCaW4gKyAxKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwc092ZXIwXFwpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBzT3ZlcjFcXCkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccHNPdmVyMlxcKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwc092ZXIzXFwpJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccHNPdmVyNFxcKVxuXG4jIFBsb3QgdGhlIHJlc3VsdHNcbnAgPC0gZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSBkaXN0YW5jZUJpbiwgeSA9IG1lYW5fcGVha19jb3VudHMsIGNvbG9yID0gZ3JvdXApKSArIFxuICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgK1xuICBsYWJzKFxuICAgIHggPSBcXERpc3RhbmNlIGJpbiAoMTBrYilcXCxcbiAgICB5ID0gXFxIM0s0bWUzIHBlYWsgY291bnRcXFxuICApICtcbiAgdGhlbWVfY2xhc3NpYygpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjgsIDAuOCkgICMgTW92ZXMgbGVnZW5kIGluc2lkZSB0aGUgcGxvdCAoeCwgeSByZWxhdGl2ZSBjb29yZGluYXRlcylcbiAgKSArXG4gIGd1aWRlcyhcbiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKFxuICAgICAga2V5d2lkdGggPSAwLjIsICAjIEFkanVzdCB0aGUgd2lkdGggb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgICBrZXloZWlnaHQgPSAwLjIgICMgQWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgKSkrXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcIzc3Nzc3N1xcLCBcXCM4QjdFNjVcXCwgXFwjQTI4NDUyXFwsIFxcI0MyODg0RFxcLCBcXCNGMjhFMkNcXCkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGJpblBlYWtEZW5zaXR5X1JBRDIxX3BzR3JvdXAxMVxcKVxud2lkdGggPC0gMzIqbW1Ub0luY2hcbmhlaWdodCA8LSAzNSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4jIyMgUEVcbnBlT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSA0KSkkZ2VuZVxucGVPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lXG5wZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmVcbnBlT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAxLCBudW1fcGUgPCAyKSkkZ2VuZVxucGVPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmVcblxuIyBMaXN0IG9mIGdyb3VwcyB0byBwcm9jZXNzXG5ncm91cHMgPC0gYyhcXHBlT3ZlcjBcXCwgXFxwZU92ZXIxXFwsIFxccGVPdmVyMlxcLCBcXHBlT3ZlcjNcXCwgXFxwZU92ZXI0XFwpXG5cbiMgUHJvY2VzcyBlYWNoIGdyb3VwIGFuZCBjb21iaW5lIHJlc3VsdHNcbnN1bW1hcnlfZGF0YSA8LSBtYXBfZGZyKGdyb3VwcywgfiBwcm9jZXNzX2dyb3VwKC54LCBnZW5lLnRiLCBiaW5zLjEwa2IpKVxuXG4jIEFkZCB0aGUgYWRkaXRpb25hbCByb3dzIGZvciBkaXN0YW5jZUJpbiA9IDBcbnN1bW1hcnlfZGF0YSA8LSBzdW1tYXJ5X2RhdGEgJT4lXG4gIG11dGF0ZShkaXN0YW5jZUJpbiA9IGRpc3RhbmNlQmluICsgMSkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccGVPdmVyMFxcKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwZU92ZXIxXFwpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBlT3ZlcjJcXCkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccGVPdmVyM1xcKSU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBlT3ZlcjRcXClcblxuIyBQbG90IHRoZSByZXN1bHRzXG5nZ3Bsb3Qoc3VtbWFyeV9kYXRhLCBhZXMoeCA9IGRpc3RhbmNlQmluLCB5ID0gbWVhbl9wZWFrX2NvdW50cywgY29sb3IgPSBncm91cCkpICsgXG4gIGdlb21fbGluZShzaXplID0gMSkgKyB4bGltKDAsIDEwKStcbiAgbGFicyhcbiAgICB0aXRsZSA9IFxcTWVhbiBQZWFrIENvdW50c1xcLFxuICAgIHggPSBcXERpc3RhbmNlIEJpbiAoMTAga2IpXFwsXG4gICAgeSA9IFxcTWVhbiBQZWFrIENvdW50c1xcXG4gICkgK1xuICB0aGVtZV9taW5pbWFsKCkgK1xuICB0aGVtZShcbiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTQsIGZhY2UgPSBcXGJvbGRcXCksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpXG4gIClcblxuIyMjIyMjIyMjIyMjIyMjXG5wcE92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gNCkpJGdlbmVcbnBwT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAzLCBudW1fcHAgPCA0KSkkZ2VuZVxucHBPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDIsIG51bV9wcCA8IDMpKSRnZW5lXG5wcE92ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMSwgbnVtX3BwIDwgMikpJGdlbmVcbnBwT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA8IDEpKSRnZW5lXG5cbiMgTGlzdCBvZiBncm91cHMgdG8gcHJvY2Vzc1xuZ3JvdXBzIDwtIGMoXFxwcE92ZXIwXFwsIFxccHBPdmVyMVxcLCBcXHBwT3ZlcjJcXCwgXFxwcE92ZXIzXFwsIFxccHBPdmVyNFxcKVxuXG4jIFByb2Nlc3MgZWFjaCBncm91cCBhbmQgY29tYmluZSByZXN1bHRzXG5zdW1tYXJ5X2RhdGEgPC0gbWFwX2Rmcihncm91cHMsIH4gcHJvY2Vzc19ncm91cCgueCwgZ2VuZS50YiwgYmlucy4xMGtiKSlcblxuIyBBZGQgdGhlIGFkZGl0aW9uYWwgcm93cyBmb3IgZGlzdGFuY2VCaW4gPSAwXG5zdW1tYXJ5X2RhdGEgPC0gc3VtbWFyeV9kYXRhICU+JVxuICBtdXRhdGUoZGlzdGFuY2VCaW4gPSBkaXN0YW5jZUJpbiArIDEpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBwT3ZlcjBcXCkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccHBPdmVyMVxcKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwcE92ZXIyXFwpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBwT3ZlcjNcXCklPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwcE92ZXI0XFwpXG5cbiMgUGxvdCB0aGUgcmVzdWx0c1xuZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSBkaXN0YW5jZUJpbiwgeSA9IG1lYW5fcGVha19jb3VudHMsIGNvbG9yID0gZ3JvdXApKSArIFxuICBnZW9tX2xpbmUoc2l6ZSA9IDEpICtcbiAgbGFicyhcbiAgICB0aXRsZSA9IFxcTWVhbiBQZWFrIENvdW50c1xcLFxuICAgIHggPSBcXERpc3RhbmNlIEJpbiAoMTAga2IpXFwsXG4gICAgeSA9IFxcTWVhbiBQZWFrIENvdW50c1xcXG4gICkgK1xuICB0aGVtZV9taW5pbWFsKCkgK1xuICB0aGVtZShcbiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTQsIGZhY2UgPSBcXGJvbGRcXCksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpXG4gIClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->

####### DOing this for P-S groups
resultDir <- here(\../../result\)
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene

# List of groups to process
groups <- c(\psOver0\, \psOver1\, \psOver2\, \psOver3\, \psOver4\)

# Process each group and combine results
summary_data <- map_dfr(groups, ~ process_group(.x, gene.tb, bins.10kb))

# Add the additional rows for distanceBin = 0
summary_data <- summary_data %>%
  mutate(distanceBin = distanceBin + 1) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \psOver0\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \psOver1\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \psOver2\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \psOver3\)%>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \psOver4\)

# Plot the results
p <- ggplot(summary_data, aes(x = distanceBin, y = mean_peak_counts, color = group)) + 
  geom_line(size = 0.5) +
  labs(
    x = \Distance bin (10kb)\,
    y = \H3K4me3 peak count\
  ) +
  theme_classic() +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS),
    legend.position = c(0.8, 0.8)  # Moves legend inside the plot (x, y relative coordinates)
  ) +
  guides(
    fill = guide_legend(
      keywidth = 0.2,  # Adjust the width of the legend keys
      keyheight = 0.2  # Adjust the height of the legend keys
    ))+
  scale_color_manual(values = c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\))

fileName <- paste0(\binPeakDensity_RAD21_psGroup11\)
width <- 32*mmToInch
height <- 35*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

### PE
peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene

# List of groups to process
groups <- c(\peOver0\, \peOver1\, \peOver2\, \peOver3\, \peOver4\)

# Process each group and combine results
summary_data <- map_dfr(groups, ~ process_group(.x, gene.tb, bins.10kb))

# Add the additional rows for distanceBin = 0
summary_data <- summary_data %>%
  mutate(distanceBin = distanceBin + 1) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \peOver0\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \peOver1\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \peOver2\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \peOver3\)%>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \peOver4\)

# Plot the results
ggplot(summary_data, aes(x = distanceBin, y = mean_peak_counts, color = group)) + 
  geom_line(size = 1) + xlim(0, 10)+
  labs(
    title = \Mean Peak Counts\,
    x = \Distance Bin (10 kb)\,
    y = \Mean Peak Counts\
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = \bold\),
    axis.text = element_text(size = 12),
    axis.title = element_text(size = 13)
  )

###############
ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene

# List of groups to process
groups <- c(\ppOver0\, \ppOver1\, \ppOver2\, \ppOver3\, \ppOver4\)

# Process each group and combine results
summary_data <- map_dfr(groups, ~ process_group(.x, gene.tb, bins.10kb))

# Add the additional rows for distanceBin = 0
summary_data <- summary_data %>%
  mutate(distanceBin = distanceBin + 1) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \ppOver0\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \ppOver1\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \ppOver2\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \ppOver3\)%>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \ppOver4\)

# Plot the results
ggplot(summary_data, aes(x = distanceBin, y = mean_peak_counts, color = group)) + 
  geom_line(size = 1) +
  labs(
    title = \Mean Peak Counts\,
    x = \Distance Bin (10 kb)\,
    y = \Mean Peak Counts\
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = \bold\),
    axis.text = element_text(size = 12),
    axis.title = element_text(size = 13)
  )



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNGpJeU1qSXlNaklFUlBhVzVuSUhSb2FYTWdabTl5SUZBdFV5Qm5jbTkxY0hOY2JuSmxjM1ZzZEVScGNpQThMU0JvWlhKbEtGeGNMaTR2TGk0dmNtVnpkV3gwWEZ3cFhHNTBaVzF3TWlBOExTQnlaV0ZrVWtSVEtHaGxjbVVvY21WemRXeDBSR2x5TENCY1hHZGxibVZmYkc5dmNGOXNhVzVyTG5Ka2MxeGNLU2xjYmx4dWNITlBkbVZ5TkNBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J6SUQ0OUlEUXBLU1JuWlc1bFhHNXdjMDkyWlhJeklEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hNZ1BqMGdNeXdnYm5WdFgzQnpJRHdnTkNrcEpHZGxibVZjYm5CelQzWmxjaklnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjeUErUFNBeUxDQnVkVzFmY0hNZ1BDQXpLU2trWjJWdVpWeHVjSE5QZG1WeU1TQThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCeklENDlJREVzSUc1MWJWOXdjeUE4SURJcEtTUm5aVzVsWEc1d2MwOTJaWEl3SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSE1nUENBeEtTa2taMlZ1WlZ4dVhHNGpJRXhwYzNRZ2IyWWdaM0p2ZFhCeklIUnZJSEJ5YjJObGMzTmNibWR5YjNWd2N5QThMU0JqS0Z4Y2NITlBkbVZ5TUZ4Y0xDQmNYSEJ6VDNabGNqRmNYQ3dnWEZ4d2MwOTJaWEl5WEZ3c0lGeGNjSE5QZG1WeU0xeGNMQ0JjWEhCelQzWmxjalJjWENsY2JseHVJeUJRY205alpYTnpJR1ZoWTJnZ1ozSnZkWEFnWVc1a0lHTnZiV0pwYm1VZ2NtVnpkV3gwYzF4dWMzVnRiV0Z5ZVY5a1lYUmhJRHd0SUcxaGNGOWtabklvWjNKdmRYQnpMQ0IrSUhCeWIyTmxjM05mWjNKdmRYQW9MbmdzSUdkbGJtVXVkR0lzSUdKcGJuTXVNVEJyWWlrcFhHNWNiaU1nUVdSa0lIUm9aU0JoWkdScGRHbHZibUZzSUhKdmQzTWdabTl5SUdScGMzUmhibU5sUW1sdUlEMGdNRnh1YzNWdGJXRnllVjlrWVhSaElEd3RJSE4xYlcxaGNubGZaR0YwWVNBbFBpVmNiaUFnYlhWMFlYUmxLR1JwYzNSaGJtTmxRbWx1SUQwZ1pHbHpkR0Z1WTJWQ2FXNGdLeUF4S1NBbFBpVmNiaUFnWVdSa1gzSnZkeWhrYVhOMFlXNWpaVUpwYmlBOUlEQXNJRzFsWVc1ZmNHVmhhMTlqYjNWdWRITWdQU0F3TENCelpGOXdaV0ZyWDJOdmRXNTBjeUE5SURBc0lHZHliM1Z3SUQwZ1hGeHdjMDkyWlhJd1hGd3BJQ1UrSlZ4dUlDQmhaR1JmY205M0tHUnBjM1JoYm1ObFFtbHVJRDBnTUN3Z2JXVmhibDl3WldGclgyTnZkVzUwY3lBOUlEQXNJSE5rWDNCbFlXdGZZMjkxYm5SeklEMGdNQ3dnWjNKdmRYQWdQU0JjWEhCelQzWmxjakZjWENrZ0pUNGxYRzRnSUdGa1pGOXliM2NvWkdsemRHRnVZMlZDYVc0Z1BTQXdMQ0J0WldGdVgzQmxZV3RmWTI5MWJuUnpJRDBnTUN3Z2MyUmZjR1ZoYTE5amIzVnVkSE1nUFNBd0xDQm5jbTkxY0NBOUlGeGNjSE5QZG1WeU1seGNLU0FsUGlWY2JpQWdZV1JrWDNKdmR5aGthWE4wWVc1alpVSnBiaUE5SURBc0lHMWxZVzVmY0dWaGExOWpiM1Z1ZEhNZ1BTQXdMQ0J6WkY5d1pXRnJYMk52ZFc1MGN5QTlJREFzSUdkeWIzVndJRDBnWEZ4d2MwOTJaWEl6WEZ3cEpUNGxYRzRnSUdGa1pGOXliM2NvWkdsemRHRnVZMlZDYVc0Z1BTQXdMQ0J0WldGdVgzQmxZV3RmWTI5MWJuUnpJRDBnTUN3Z2MyUmZjR1ZoYTE5amIzVnVkSE1nUFNBd0xDQm5jbTkxY0NBOUlGeGNjSE5QZG1WeU5GeGNLVnh1WEc0aklGQnNiM1FnZEdobElISmxjM1ZzZEhOY2JuQWdQQzBnWjJkd2JHOTBLSE4xYlcxaGNubGZaR0YwWVN3Z1lXVnpLSGdnUFNCa2FYTjBZVzVqWlVKcGJpd2dlU0E5SUcxbFlXNWZjR1ZoYTE5amIzVnVkSE1zSUdOdmJHOXlJRDBnWjNKdmRYQXBLU0FySUZ4dUlDQm5aVzl0WDJ4cGJtVW9jMmw2WlNBOUlEQXVOU2tnSzF4dUlDQnNZV0p6S0Z4dUlDQWdJSGdnUFNCY1hFUnBjM1JoYm1ObElHSnBiaUFvTVRCcllpbGNYQ3hjYmlBZ0lDQjVJRDBnWEZ4SU0wczBiV1V6SUhCbFlXc2dZMjkxYm5SY1hGeHVJQ0FwSUN0Y2JpQWdkR2hsYldWZlkyeGhjM05wWXlncElDdGNiaUFnZEdobGJXVW9YRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVTBzWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11YkdsdVpTQTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJwWTJ0eklEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcExGeHVJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGeGNkSEpoYm5Od1lYSmxiblJjWENrc1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdiR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdZeWd3TGpnc0lEQXVPQ2tnSUNNZ1RXOTJaWE1nYkdWblpXNWtJR2x1YzJsa1pTQjBhR1VnY0d4dmRDQW9lQ3dnZVNCeVpXeGhkR2wyWlNCamIyOXlaR2x1WVhSbGN5bGNiaUFnS1NBclhHNGdJR2QxYVdSbGN5aGNiaUFnSUNCbWFXeHNJRDBnWjNWcFpHVmZiR1ZuWlc1a0tGeHVJQ0FnSUNBZ2EyVjVkMmxrZEdnZ1BTQXdMaklzSUNBaklFRmthblZ6ZENCMGFHVWdkMmxrZEdnZ2IyWWdkR2hsSUd4bFoyVnVaQ0JyWlhselhHNGdJQ0FnSUNCclpYbG9aV2xuYUhRZ1BTQXdMaklnSUNNZ1FXUnFkWE4wSUhSb1pTQm9aV2xuYUhRZ2IyWWdkR2hsSUd4bFoyVnVaQ0JyWlhselhHNGdJQ0FnS1NrclhHNGdJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z4Y0l6YzNOemMzTjF4Y0xDQmNYQ000UWpkRk5qVmNYQ3dnWEZ3alFUSTRORFV5WEZ3c0lGeGNJME15T0RnMFJGeGNMQ0JjWENOR01qaEZNa05jWENrcFhHNWNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEdKcGJsQmxZV3RFWlc1emFYUjVYMUpCUkRJeFgzQnpSM0p2ZFhBeE1WeGNLVnh1ZDJsa2RHZ2dQQzBnTXpJcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQXpOU3B0YlZSdlNXNWphRnh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVYRzRqSXlNZ1VFVmNibkJsVDNabGNqUWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d1pTQStQU0EwS1Nra1oyVnVaVnh1Y0dWUGRtVnlNeUE4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQmxJRDQ5SURNc0lHNTFiVjl3WlNBOElEUXBLU1JuWlc1bFhHNXdaVTkyWlhJeUlEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0dVZ1BqMGdNaXdnYm5WdFgzQmxJRHdnTXlrcEpHZGxibVZjYm5CbFQzWmxjakVnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdaU0ErUFNBeExDQnVkVzFmY0dVZ1BDQXlLU2trWjJWdVpWeHVjR1ZQZG1WeU1DQThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCbElEd2dNU2twSkdkbGJtVmNibHh1SXlCTWFYTjBJRzltSUdkeWIzVndjeUIwYnlCd2NtOWpaWE56WEc1bmNtOTFjSE1nUEMwZ1l5aGNYSEJsVDNabGNqQmNYQ3dnWEZ4d1pVOTJaWEl4WEZ3c0lGeGNjR1ZQZG1WeU1seGNMQ0JjWEhCbFQzWmxjak5jWEN3Z1hGeHdaVTkyWlhJMFhGd3BYRzVjYmlNZ1VISnZZMlZ6Y3lCbFlXTm9JR2R5YjNWd0lHRnVaQ0JqYjIxaWFXNWxJSEpsYzNWc2RITmNibk4xYlcxaGNubGZaR0YwWVNBOExTQnRZWEJmWkdaeUtHZHliM1Z3Y3l3Z2ZpQndjbTlqWlhOelgyZHliM1Z3S0M1NExDQm5aVzVsTG5SaUxDQmlhVzV6TGpFd2EySXBLVnh1WEc0aklFRmtaQ0IwYUdVZ1lXUmthWFJwYjI1aGJDQnliM2R6SUdadmNpQmthWE4wWVc1alpVSnBiaUE5SURCY2JuTjFiVzFoY25sZlpHRjBZU0E4TFNCemRXMXRZWEo1WDJSaGRHRWdKVDRsWEc0Z0lHMTFkR0YwWlNoa2FYTjBZVzVqWlVKcGJpQTlJR1JwYzNSaGJtTmxRbWx1SUNzZ01Ta2dKVDRsWEc0Z0lHRmtaRjl5YjNjb1pHbHpkR0Z1WTJWQ2FXNGdQU0F3TENCdFpXRnVYM0JsWVd0ZlkyOTFiblJ6SUQwZ01Dd2djMlJmY0dWaGExOWpiM1Z1ZEhNZ1BTQXdMQ0JuY205MWNDQTlJRnhjY0dWUGRtVnlNRnhjS1NBbFBpVmNiaUFnWVdSa1gzSnZkeWhrYVhOMFlXNWpaVUpwYmlBOUlEQXNJRzFsWVc1ZmNHVmhhMTlqYjNWdWRITWdQU0F3TENCelpGOXdaV0ZyWDJOdmRXNTBjeUE5SURBc0lHZHliM1Z3SUQwZ1hGeHdaVTkyWlhJeFhGd3BJQ1UrSlZ4dUlDQmhaR1JmY205M0tHUnBjM1JoYm1ObFFtbHVJRDBnTUN3Z2JXVmhibDl3WldGclgyTnZkVzUwY3lBOUlEQXNJSE5rWDNCbFlXdGZZMjkxYm5SeklEMGdNQ3dnWjNKdmRYQWdQU0JjWEhCbFQzWmxjakpjWENrZ0pUNGxYRzRnSUdGa1pGOXliM2NvWkdsemRHRnVZMlZDYVc0Z1BTQXdMQ0J0WldGdVgzQmxZV3RmWTI5MWJuUnpJRDBnTUN3Z2MyUmZjR1ZoYTE5amIzVnVkSE1nUFNBd0xDQm5jbTkxY0NBOUlGeGNjR1ZQZG1WeU0xeGNLU1UrSlZ4dUlDQmhaR1JmY205M0tHUnBjM1JoYm1ObFFtbHVJRDBnTUN3Z2JXVmhibDl3WldGclgyTnZkVzUwY3lBOUlEQXNJSE5rWDNCbFlXdGZZMjkxYm5SeklEMGdNQ3dnWjNKdmRYQWdQU0JjWEhCbFQzWmxjalJjWENsY2JseHVJeUJRYkc5MElIUm9aU0J5WlhOMWJIUnpYRzVuWjNCc2IzUW9jM1Z0YldGeWVWOWtZWFJoTENCaFpYTW9lQ0E5SUdScGMzUmhibU5sUW1sdUxDQjVJRDBnYldWaGJsOXdaV0ZyWDJOdmRXNTBjeXdnWTI5c2IzSWdQU0JuY205MWNDa3BJQ3NnWEc0Z0lHZGxiMjFmYkdsdVpTaHphWHBsSUQwZ01Ta2dLeUI0YkdsdEtEQXNJREV3S1N0Y2JpQWdiR0ZpY3loY2JpQWdJQ0IwYVhSc1pTQTlJRnhjVFdWaGJpQlFaV0ZySUVOdmRXNTBjMXhjTEZ4dUlDQWdJSGdnUFNCY1hFUnBjM1JoYm1ObElFSnBiaUFvTVRBZ2EySXBYRndzWEc0Z0lDQWdlU0E5SUZ4Y1RXVmhiaUJRWldGcklFTnZkVzUwYzF4Y1hHNGdJQ2tnSzF4dUlDQjBhR1Z0WlY5dGFXNXBiV0ZzS0NrZ0sxeHVJQ0IwYUdWdFpTaGNiaUFnSUNCd2JHOTBMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0docWRYTjBJRDBnTUM0MUxDQnphWHBsSUQwZ01UUXNJR1poWTJVZ1BTQmNYR0p2YkdSY1hDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0hOcGVtVWdQU0F4TWlrc1hHNGdJQ0FnWVhocGN5NTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2h6YVhwbElEMGdNVE1wWEc0Z0lDbGNibHh1SXlNakl5TWpJeU1qSXlNakl5TWpYRzV3Y0U5MlpYSTBJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNIQWdQajBnTkNrcEpHZGxibVZjYm5Cd1QzWmxjak1nUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjQ0ErUFNBekxDQnVkVzFmY0hBZ1BDQTBLU2trWjJWdVpWeHVjSEJQZG1WeU1pQThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCd0lENDlJRElzSUc1MWJWOXdjQ0E4SURNcEtTUm5aVzVsWEc1d2NFOTJaWEl4SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSEFnUGowZ01Td2diblZ0WDNCd0lEd2dNaWtwSkdkbGJtVmNibkJ3VDNabGNqQWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2NDQThJREVwS1NSblpXNWxYRzVjYmlNZ1RHbHpkQ0J2WmlCbmNtOTFjSE1nZEc4Z2NISnZZMlZ6YzF4dVozSnZkWEJ6SUR3dElHTW9YRnh3Y0U5MlpYSXdYRndzSUZ4Y2NIQlBkbVZ5TVZ4Y0xDQmNYSEJ3VDNabGNqSmNYQ3dnWEZ4d2NFOTJaWEl6WEZ3c0lGeGNjSEJQZG1WeU5GeGNLVnh1WEc0aklGQnliMk5sYzNNZ1pXRmphQ0JuY205MWNDQmhibVFnWTI5dFltbHVaU0J5WlhOMWJIUnpYRzV6ZFcxdFlYSjVYMlJoZEdFZ1BDMGdiV0Z3WDJSbWNpaG5jbTkxY0hNc0lINGdjSEp2WTJWemMxOW5jbTkxY0NndWVDd2daMlZ1WlM1MFlpd2dZbWx1Y3k0eE1HdGlLU2xjYmx4dUl5QkJaR1FnZEdobElHRmtaR2wwYVc5dVlXd2djbTkzY3lCbWIzSWdaR2x6ZEdGdVkyVkNhVzRnUFNBd1hHNXpkVzF0WVhKNVgyUmhkR0VnUEMwZ2MzVnRiV0Z5ZVY5a1lYUmhJQ1UrSlZ4dUlDQnRkWFJoZEdVb1pHbHpkR0Z1WTJWQ2FXNGdQU0JrYVhOMFlXNWpaVUpwYmlBcklERXBJQ1UrSlZ4dUlDQmhaR1JmY205M0tHUnBjM1JoYm1ObFFtbHVJRDBnTUN3Z2JXVmhibDl3WldGclgyTnZkVzUwY3lBOUlEQXNJSE5rWDNCbFlXdGZZMjkxYm5SeklEMGdNQ3dnWjNKdmRYQWdQU0JjWEhCd1QzWmxjakJjWENrZ0pUNGxYRzRnSUdGa1pGOXliM2NvWkdsemRHRnVZMlZDYVc0Z1BTQXdMQ0J0WldGdVgzQmxZV3RmWTI5MWJuUnpJRDBnTUN3Z2MyUmZjR1ZoYTE5amIzVnVkSE1nUFNBd0xDQm5jbTkxY0NBOUlGeGNjSEJQZG1WeU1WeGNLU0FsUGlWY2JpQWdZV1JrWDNKdmR5aGthWE4wWVc1alpVSnBiaUE5SURBc0lHMWxZVzVmY0dWaGExOWpiM1Z1ZEhNZ1BTQXdMQ0J6WkY5d1pXRnJYMk52ZFc1MGN5QTlJREFzSUdkeWIzVndJRDBnWEZ4d2NFOTJaWEl5WEZ3cElDVStKVnh1SUNCaFpHUmZjbTkzS0dScGMzUmhibU5sUW1sdUlEMGdNQ3dnYldWaGJsOXdaV0ZyWDJOdmRXNTBjeUE5SURBc0lITmtYM0JsWVd0ZlkyOTFiblJ6SUQwZ01Dd2daM0p2ZFhBZ1BTQmNYSEJ3VDNabGNqTmNYQ2tsUGlWY2JpQWdZV1JrWDNKdmR5aGthWE4wWVc1alpVSnBiaUE5SURBc0lHMWxZVzVmY0dWaGExOWpiM1Z1ZEhNZ1BTQXdMQ0J6WkY5d1pXRnJYMk52ZFc1MGN5QTlJREFzSUdkeWIzVndJRDBnWEZ4d2NFOTJaWEkwWEZ3cFhHNWNiaU1nVUd4dmRDQjBhR1VnY21WemRXeDBjMXh1WjJkd2JHOTBLSE4xYlcxaGNubGZaR0YwWVN3Z1lXVnpLSGdnUFNCa2FYTjBZVzVqWlVKcGJpd2dlU0E5SUcxbFlXNWZjR1ZoYTE5amIzVnVkSE1zSUdOdmJHOXlJRDBnWjNKdmRYQXBLU0FySUZ4dUlDQm5aVzl0WDJ4cGJtVW9jMmw2WlNBOUlERXBJQ3RjYmlBZ2JHRmljeWhjYmlBZ0lDQjBhWFJzWlNBOUlGeGNUV1ZoYmlCUVpXRnJJRU52ZFc1MGMxeGNMRnh1SUNBZ0lIZ2dQU0JjWEVScGMzUmhibU5sSUVKcGJpQW9NVEFnYTJJcFhGd3NYRzRnSUNBZ2VTQTlJRnhjVFdWaGJpQlFaV0ZySUVOdmRXNTBjMXhjWEc0Z0lDa2dLMXh1SUNCMGFHVnRaVjl0YVc1cGJXRnNLQ2tnSzF4dUlDQjBhR1Z0WlNoY2JpQWdJQ0J3Ykc5MExuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR2hxZFhOMElEMGdNQzQxTENCemFYcGxJRDBnTVRRc0lHWmhZMlVnUFNCY1hHSnZiR1JjWENrc1hHNGdJQ0FnWVhocGN5NTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQXhNaWtzWEc0Z0lDQWdZWGhwY3k1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaHphWHBsSUQwZ01UTXBYRzRnSUNsY2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcblxuIyMjIyMjIyBET2luZyB0aGlzIGZvciBQLVMgZ3JvdXBzXG5yZXN1bHREaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdFxcKVxudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGluay5yZHNcXCkpXG5cbnBzT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSA0KSkkZ2VuZVxucHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDMsIG51bV9wcyA8IDQpKSRnZW5lXG5wc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMiwgbnVtX3BzIDwgMykpJGdlbmVcbnBzT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAxLCBudW1fcHMgPCAyKSkkZ2VuZVxucHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzIDwgMSkpJGdlbmVcblxuIyBMaXN0IG9mIGdyb3VwcyB0byBwcm9jZXNzXG5ncm91cHMgPC0gYyhcXHBzT3ZlcjBcXCwgXFxwc092ZXIxXFwsIFxccHNPdmVyMlxcLCBcXHBzT3ZlcjNcXCwgXFxwc092ZXI0XFwpXG5cbiMgUHJvY2VzcyBlYWNoIGdyb3VwIGFuZCBjb21iaW5lIHJlc3VsdHNcbnN1bW1hcnlfZGF0YSA8LSBtYXBfZGZyKGdyb3VwcywgfiBwcm9jZXNzX2dyb3VwKC54LCBnZW5lLnRiLCBiaW5zLjEwa2IpKVxuXG4jIEFkZCB0aGUgYWRkaXRpb25hbCByb3dzIGZvciBkaXN0YW5jZUJpbiA9IDBcbnN1bW1hcnlfZGF0YSA8LSBzdW1tYXJ5X2RhdGEgJT4lXG4gIG11dGF0ZShkaXN0YW5jZUJpbiA9IGRpc3RhbmNlQmluICsgMSkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccHNPdmVyMFxcKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwc092ZXIxXFwpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBzT3ZlcjJcXCkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccHNPdmVyM1xcKSU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBzT3ZlcjRcXClcblxuIyBQbG90IHRoZSByZXN1bHRzXG5wIDwtIGdncGxvdChzdW1tYXJ5X2RhdGEsIGFlcyh4ID0gZGlzdGFuY2VCaW4sIHkgPSBtZWFuX3BlYWtfY291bnRzLCBjb2xvciA9IGdyb3VwKSkgKyBcbiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICtcbiAgbGFicyhcbiAgICB4ID0gXFxEaXN0YW5jZSBiaW4gKDEwa2IpXFwsXG4gICAgeSA9IFxcSDNLNG1lMyBwZWFrIGNvdW50XFxcbiAgKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC44LCAwLjgpICAjIE1vdmVzIGxlZ2VuZCBpbnNpZGUgdGhlIHBsb3QgKHgsIHkgcmVsYXRpdmUgY29vcmRpbmF0ZXMpXG4gICkgK1xuICBndWlkZXMoXG4gICAgZmlsbCA9IGd1aWRlX2xlZ2VuZChcbiAgICAgIGtleXdpZHRoID0gMC4yLCAgIyBBZGp1c3QgdGhlIHdpZHRoIG9mIHRoZSBsZWdlbmQga2V5c1xuICAgICAga2V5aGVpZ2h0ID0gMC4yICAjIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWdlbmQga2V5c1xuICAgICkpK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXCM3Nzc3NzdcXCwgXFwjOEI3RTY1XFwsIFxcI0EyODQ1MlxcLCBcXCNDMjg4NERcXCwgXFwjRjI4RTJDXFwpKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxiaW5QZWFrRGVuc2l0eV9SQUQyMV9wc0dyb3VwMTFcXClcbndpZHRoIDwtIDMyKm1tVG9JbmNoXG5oZWlnaHQgPC0gMzUqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuIyMjIFBFXG5wZU92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gNCkpJGdlbmVcbnBlT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAzLCBudW1fcGUgPCA0KSkkZ2VuZVxucGVPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDIsIG51bV9wZSA8IDMpKSRnZW5lXG5wZU92ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMSwgbnVtX3BlIDwgMikpJGdlbmVcbnBlT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA8IDEpKSRnZW5lXG5cbiMgTGlzdCBvZiBncm91cHMgdG8gcHJvY2Vzc1xuZ3JvdXBzIDwtIGMoXFxwZU92ZXIwXFwsIFxccGVPdmVyMVxcLCBcXHBlT3ZlcjJcXCwgXFxwZU92ZXIzXFwsIFxccGVPdmVyNFxcKVxuXG4jIFByb2Nlc3MgZWFjaCBncm91cCBhbmQgY29tYmluZSByZXN1bHRzXG5zdW1tYXJ5X2RhdGEgPC0gbWFwX2Rmcihncm91cHMsIH4gcHJvY2Vzc19ncm91cCgueCwgZ2VuZS50YiwgYmlucy4xMGtiKSlcblxuIyBBZGQgdGhlIGFkZGl0aW9uYWwgcm93cyBmb3IgZGlzdGFuY2VCaW4gPSAwXG5zdW1tYXJ5X2RhdGEgPC0gc3VtbWFyeV9kYXRhICU+JVxuICBtdXRhdGUoZGlzdGFuY2VCaW4gPSBkaXN0YW5jZUJpbiArIDEpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBlT3ZlcjBcXCkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccGVPdmVyMVxcKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwZU92ZXIyXFwpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBlT3ZlcjNcXCklPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwZU92ZXI0XFwpXG5cbiMgUGxvdCB0aGUgcmVzdWx0c1xuZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSBkaXN0YW5jZUJpbiwgeSA9IG1lYW5fcGVha19jb3VudHMsIGNvbG9yID0gZ3JvdXApKSArIFxuICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsgeGxpbSgwLCAxMCkrXG4gIGxhYnMoXG4gICAgdGl0bGUgPSBcXE1lYW4gUGVhayBDb3VudHNcXCxcbiAgICB4ID0gXFxEaXN0YW5jZSBCaW4gKDEwIGtiKVxcLFxuICAgIHkgPSBcXE1lYW4gUGVhayBDb3VudHNcXFxuICApICtcbiAgdGhlbWVfbWluaW1hbCgpICtcbiAgdGhlbWUoXG4gICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE0LCBmYWNlID0gXFxib2xkXFwpLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKVxuICApXG5cbiMjIyMjIyMjIyMjIyMjI1xucHBPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDQpKSRnZW5lXG5wcE92ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMywgbnVtX3BwIDwgNCkpJGdlbmVcbnBwT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAyLCBudW1fcHAgPCAzKSkkZ2VuZVxucHBPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDEsIG51bV9wcCA8IDIpKSRnZW5lXG5wcE92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPCAxKSkkZ2VuZVxuXG4jIExpc3Qgb2YgZ3JvdXBzIHRvIHByb2Nlc3Ncbmdyb3VwcyA8LSBjKFxccHBPdmVyMFxcLCBcXHBwT3ZlcjFcXCwgXFxwcE92ZXIyXFwsIFxccHBPdmVyM1xcLCBcXHBwT3ZlcjRcXClcblxuIyBQcm9jZXNzIGVhY2ggZ3JvdXAgYW5kIGNvbWJpbmUgcmVzdWx0c1xuc3VtbWFyeV9kYXRhIDwtIG1hcF9kZnIoZ3JvdXBzLCB+IHByb2Nlc3NfZ3JvdXAoLngsIGdlbmUudGIsIGJpbnMuMTBrYikpXG5cbiMgQWRkIHRoZSBhZGRpdGlvbmFsIHJvd3MgZm9yIGRpc3RhbmNlQmluID0gMFxuc3VtbWFyeV9kYXRhIDwtIHN1bW1hcnlfZGF0YSAlPiVcbiAgbXV0YXRlKGRpc3RhbmNlQmluID0gZGlzdGFuY2VCaW4gKyAxKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwcE92ZXIwXFwpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBwT3ZlcjFcXCkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccHBPdmVyMlxcKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwcE92ZXIzXFwpJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccHBPdmVyNFxcKVxuXG4jIFBsb3QgdGhlIHJlc3VsdHNcbmdncGxvdChzdW1tYXJ5X2RhdGEsIGFlcyh4ID0gZGlzdGFuY2VCaW4sIHkgPSBtZWFuX3BlYWtfY291bnRzLCBjb2xvciA9IGdyb3VwKSkgKyBcbiAgZ2VvbV9saW5lKHNpemUgPSAxKSArXG4gIGxhYnMoXG4gICAgdGl0bGUgPSBcXE1lYW4gUGVhayBDb3VudHNcXCxcbiAgICB4ID0gXFxEaXN0YW5jZSBCaW4gKDEwIGtiKVxcLFxuICAgIHkgPSBcXE1lYW4gUGVhayBDb3VudHNcXFxuICApICtcbiAgdGhlbWVfbWluaW1hbCgpICtcbiAgdGhlbWUoXG4gICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE0LCBmYWNlID0gXFxib2xkXFwpLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKVxuICApXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG4jIyMjIyMjIERPaW5nIHRoaXMgZm9yIFAtUyBncm91cHNcbnJlc3VsdERpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0XFwpXG50ZW1wMiA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rLnJkc1xcKSlcblxucHNPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDQpKSRnZW5lXG5wc092ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMywgbnVtX3BzIDwgNCkpJGdlbmVcbnBzT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAyLCBudW1fcHMgPCAzKSkkZ2VuZVxucHNPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDEsIG51bV9wcyA8IDIpKSRnZW5lXG5wc092ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPCAxKSkkZ2VuZVxuXG4jIExpc3Qgb2YgZ3JvdXBzIHRvIHByb2Nlc3Ncbmdyb3VwcyA8LSBjKFxccHNPdmVyMFxcLCBcXHBzT3ZlcjFcXCwgXFxwc092ZXIyXFwsIFxccHNPdmVyM1xcLCBcXHBzT3ZlcjRcXClcblxuIyBQcm9jZXNzIGVhY2ggZ3JvdXAgYW5kIGNvbWJpbmUgcmVzdWx0c1xuc3VtbWFyeV9kYXRhIDwtIG1hcF9kZnIoZ3JvdXBzLCB+IHByb2Nlc3NfZ3JvdXAoLngsIGdlbmUudGIsIGJpbnMuMTBrYikpXG5cbiMgQWRkIHRoZSBhZGRpdGlvbmFsIHJvd3MgZm9yIGRpc3RhbmNlQmluID0gMFxuc3VtbWFyeV9kYXRhIDwtIHN1bW1hcnlfZGF0YSAlPiVcbiAgbXV0YXRlKGRpc3RhbmNlQmluID0gZGlzdGFuY2VCaW4gKyAxKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwc092ZXIwXFwpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBzT3ZlcjFcXCkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccHNPdmVyMlxcKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwc092ZXIzXFwpJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccHNPdmVyNFxcKVxuXG4jIFBsb3QgdGhlIHJlc3VsdHNcbnAgPC0gZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSBkaXN0YW5jZUJpbiwgeSA9IG1lYW5fcGVha19jb3VudHMsIGNvbG9yID0gZ3JvdXApKSArIFxuICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgK1xuICBsYWJzKFxuICAgIHggPSBcXERpc3RhbmNlIGJpbiAoMTBrYilcXCxcbiAgICB5ID0gXFxIM0s0bWUzIHBlYWsgY291bnRcXFxuICApICtcbiAgdGhlbWVfY2xhc3NpYygpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjgsIDAuOCkgICMgTW92ZXMgbGVnZW5kIGluc2lkZSB0aGUgcGxvdCAoeCwgeSByZWxhdGl2ZSBjb29yZGluYXRlcylcbiAgKSArXG4gIGd1aWRlcyhcbiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKFxuICAgICAga2V5d2lkdGggPSAwLjIsICAjIEFkanVzdCB0aGUgd2lkdGggb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgICBrZXloZWlnaHQgPSAwLjIgICMgQWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIGxlZ2VuZCBrZXlzXG4gICAgKSkrXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcIzc3Nzc3N1xcLCBcXCM4QjdFNjVcXCwgXFwjQTI4NDUyXFwsIFxcI0MyODg0RFxcLCBcXCNGMjhFMkNcXCkpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGJpblBlYWtEZW5zaXR5X1JBRDIxX3BzR3JvdXAxMVxcKVxud2lkdGggPC0gMzIqbW1Ub0luY2hcbmhlaWdodCA8LSAzNSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG4jIyMgUEVcbnBlT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSA0KSkkZ2VuZVxucGVPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lXG5wZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmVcbnBlT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAxLCBudW1fcGUgPCAyKSkkZ2VuZVxucGVPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmVcblxuIyBMaXN0IG9mIGdyb3VwcyB0byBwcm9jZXNzXG5ncm91cHMgPC0gYyhcXHBlT3ZlcjBcXCwgXFxwZU92ZXIxXFwsIFxccGVPdmVyMlxcLCBcXHBlT3ZlcjNcXCwgXFxwZU92ZXI0XFwpXG5cbiMgUHJvY2VzcyBlYWNoIGdyb3VwIGFuZCBjb21iaW5lIHJlc3VsdHNcbnN1bW1hcnlfZGF0YSA8LSBtYXBfZGZyKGdyb3VwcywgfiBwcm9jZXNzX2dyb3VwKC54LCBnZW5lLnRiLCBiaW5zLjEwa2IpKVxuXG4jIEFkZCB0aGUgYWRkaXRpb25hbCByb3dzIGZvciBkaXN0YW5jZUJpbiA9IDBcbnN1bW1hcnlfZGF0YSA8LSBzdW1tYXJ5X2RhdGEgJT4lXG4gIG11dGF0ZShkaXN0YW5jZUJpbiA9IGRpc3RhbmNlQmluICsgMSkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccGVPdmVyMFxcKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwZU92ZXIxXFwpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBlT3ZlcjJcXCkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccGVPdmVyM1xcKSU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBlT3ZlcjRcXClcblxuIyBQbG90IHRoZSByZXN1bHRzXG5nZ3Bsb3Qoc3VtbWFyeV9kYXRhLCBhZXMoeCA9IGRpc3RhbmNlQmluLCB5ID0gbWVhbl9wZWFrX2NvdW50cywgY29sb3IgPSBncm91cCkpICsgXG4gIGdlb21fbGluZShzaXplID0gMSkgKyB4bGltKDAsIDEwKStcbiAgbGFicyhcbiAgICB0aXRsZSA9IFxcTWVhbiBQZWFrIENvdW50c1xcLFxuICAgIHggPSBcXERpc3RhbmNlIEJpbiAoMTAga2IpXFwsXG4gICAgeSA9IFxcTWVhbiBQZWFrIENvdW50c1xcXG4gICkgK1xuICB0aGVtZV9taW5pbWFsKCkgK1xuICB0aGVtZShcbiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTQsIGZhY2UgPSBcXGJvbGRcXCksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpXG4gIClcblxuIyMjIyMjIyMjIyMjIyMjXG5wcE92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gNCkpJGdlbmVcbnBwT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAzLCBudW1fcHAgPCA0KSkkZ2VuZVxucHBPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDIsIG51bV9wcCA8IDMpKSRnZW5lXG5wcE92ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMSwgbnVtX3BwIDwgMikpJGdlbmVcbnBwT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA8IDEpKSRnZW5lXG5cbiMgTGlzdCBvZiBncm91cHMgdG8gcHJvY2Vzc1xuZ3JvdXBzIDwtIGMoXFxwcE92ZXIwXFwsIFxccHBPdmVyMVxcLCBcXHBwT3ZlcjJcXCwgXFxwcE92ZXIzXFwsIFxccHBPdmVyNFxcKVxuXG4jIFByb2Nlc3MgZWFjaCBncm91cCBhbmQgY29tYmluZSByZXN1bHRzXG5zdW1tYXJ5X2RhdGEgPC0gbWFwX2Rmcihncm91cHMsIH4gcHJvY2Vzc19ncm91cCgueCwgZ2VuZS50YiwgYmlucy4xMGtiKSlcblxuIyBBZGQgdGhlIGFkZGl0aW9uYWwgcm93cyBmb3IgZGlzdGFuY2VCaW4gPSAwXG5zdW1tYXJ5X2RhdGEgPC0gc3VtbWFyeV9kYXRhICU+JVxuICBtdXRhdGUoZGlzdGFuY2VCaW4gPSBkaXN0YW5jZUJpbiArIDEpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBwT3ZlcjBcXCkgJT4lXG4gIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9IFxccHBPdmVyMVxcKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwcE92ZXIyXFwpICU+JVxuICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSBcXHBwT3ZlcjNcXCklPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxwcE92ZXI0XFwpXG5cbiMgUGxvdCB0aGUgcmVzdWx0c1xuZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSBkaXN0YW5jZUJpbiwgeSA9IG1lYW5fcGVha19jb3VudHMsIGNvbG9yID0gZ3JvdXApKSArIFxuICBnZW9tX2xpbmUoc2l6ZSA9IDEpICtcbiAgbGFicyhcbiAgICB0aXRsZSA9IFxcTWVhbiBQZWFrIENvdW50c1xcLFxuICAgIHggPSBcXERpc3RhbmNlIEJpbiAoMTAga2IpXFwsXG4gICAgeSA9IFxcTWVhbiBQZWFrIENvdW50c1xcXG4gICkgK1xuICB0aGVtZV9taW5pbWFsKCkgK1xuICB0aGVtZShcbiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTQsIGZhY2UgPSBcXGJvbGRcXCksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpXG4gIClcbmBgYFxuYGBgIn0= -->

```r
```r

####### DOing this for P-S groups
resultDir <- here(\../../result\)
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene

# List of groups to process
groups <- c(\psOver0\, \psOver1\, \psOver2\, \psOver3\, \psOver4\)

# Process each group and combine results
summary_data <- map_dfr(groups, ~ process_group(.x, gene.tb, bins.10kb))

# Add the additional rows for distanceBin = 0
summary_data <- summary_data %>%
  mutate(distanceBin = distanceBin + 1) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \psOver0\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \psOver1\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \psOver2\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \psOver3\)%>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \psOver4\)

# Plot the results
p <- ggplot(summary_data, aes(x = distanceBin, y = mean_peak_counts, color = group)) + 
  geom_line(size = 0.5) +
  labs(
    x = \Distance bin (10kb)\,
    y = \H3K4me3 peak count\
  ) +
  theme_classic() +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS),
    legend.position = c(0.8, 0.8)  # Moves legend inside the plot (x, y relative coordinates)
  ) +
  guides(
    fill = guide_legend(
      keywidth = 0.2,  # Adjust the width of the legend keys
      keyheight = 0.2  # Adjust the height of the legend keys
    ))+
  scale_color_manual(values = c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\))

fileName <- paste0(\binPeakDensity_RAD21_psGroup11\)
width <- 32*mmToInch
height <- 35*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

### PE
peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene

# List of groups to process
groups <- c(\peOver0\, \peOver1\, \peOver2\, \peOver3\, \peOver4\)

# Process each group and combine results
summary_data <- map_dfr(groups, ~ process_group(.x, gene.tb, bins.10kb))

# Add the additional rows for distanceBin = 0
summary_data <- summary_data %>%
  mutate(distanceBin = distanceBin + 1) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \peOver0\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \peOver1\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \peOver2\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \peOver3\)%>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \peOver4\)

# Plot the results
ggplot(summary_data, aes(x = distanceBin, y = mean_peak_counts, color = group)) + 
  geom_line(size = 1) + xlim(0, 10)+
  labs(
    title = \Mean Peak Counts\,
    x = \Distance Bin (10 kb)\,
    y = \Mean Peak Counts\
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = \bold\),
    axis.text = element_text(size = 12),
    axis.title = element_text(size = 13)
  )

###############
ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene

# List of groups to process
groups <- c(\ppOver0\, \ppOver1\, \ppOver2\, \ppOver3\, \ppOver4\)

# Process each group and combine results
summary_data <- map_dfr(groups, ~ process_group(.x, gene.tb, bins.10kb))

# Add the additional rows for distanceBin = 0
summary_data <- summary_data %>%
  mutate(distanceBin = distanceBin + 1) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \ppOver0\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \ppOver1\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \ppOver2\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \ppOver3\)%>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \ppOver4\)

# Plot the results
ggplot(summary_data, aes(x = distanceBin, y = mean_peak_counts, color = group)) + 
  geom_line(size = 1) +
  labs(
    title = \Mean Peak Counts\,
    x = \Distance Bin (10 kb)\,
    y = \Mean Peak Counts\
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = \bold\),
    axis.text = element_text(size = 12),
    axis.title = element_text(size = 13)
  )
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


###[2.30] H3K27ac peak number per 10kb

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjR1ZoYXk1WGFIbDBaUzVUUlNBOExTQnBiWEJ2Y25SUVpXRnJLR2hsY21Vb2NtVm1SR2x5TENCY0luTjFjR1Z5Ulc1b1lXNWpaWEpmVjJoNWRHVmZSVk5EWDIxdE1UQXVZbVZrWENJcEtWeHVjR1ZoYXk1RWVXeGhiaTVUUlNBOExTQnBiWEJ2Y25SUVpXRnJLR2hsY21Vb2NtVm1SR2x5TENCY0luTjFjR1Z5Ulc1b1lXNWpaWEpmUkhsc1lXNWZSVk5ETG1KbFpGd2lLU2xjYmx4dVhHNWNibVpzWVc1clUybDZaU0E4TFNBd0xqVmxObHh1WjJWdVpTNTBZaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSnRiVEV3WDBkU1EyMHpPQzV3Tmw5blpXNWxYM052Y25SbFpDNWlaV1JjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRlJUVXlBOUlHbG1aV3h6WlNoV05DQTlQU0JjSWl0Y0lpd2dWaklzSUZZektTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVMU56ZEdGeWRDQTlJRlJUVXlBdElHWnNZVzVyVTJsNlpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVMU5sYm1RZ1BTQlVVMU1nS3lCbWJHRnVhMU5wZW1VcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLRll4TENCVVUxTnpkR0Z5ZEN3Z1ZGTlRaVzVrTENCV05pd2dWalVwWEc1amIyeHVZVzFsY3loblpXNWxMblJpS1NBOExTQmpLRndpWTJoeVhDSXNJRndpYzNSaGNuUmNJaXdnWENKbGJtUmNJaXdnWENKbGJuTmxiV0pzWENJc0lGd2laMlZ1WlZ3aUtWeHVYRzVuWlc1bExtZHliM1Z3TVNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0puWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlltbHVZWEo1UjNKdmRYQXhMblJ6ZGx3aUtTa2taMlZ1WlZ4dVoyVnVaUzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMkpwYm1GeWVVZHliM1Z3TWk1MGMzWmNJaWtwSkdkbGJtVmNibHh1VkZOVE1XMWlMbWR5YjNWd01TNW5jaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvWjJWdVpTNTBZaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhsYm5ObGJXSnNJQ1ZwYmlVZ1oyVnVaUzVuY205MWNERXBMQ0JyWldWd0xtVjRkSEpoTG1OdmJIVnRibk1nUFNCVVVsVkZLVnh1VkZOVE1XMWlMbWR5YjNWd01pNW5jaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvWjJWdVpTNTBZaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhsYm5ObGJXSnNJQ1ZwYmlVZ1oyVnVaUzVuY205MWNESXBMQ0JyWldWd0xtVjRkSEpoTG1OdmJIVnRibk1nUFNCVVVsVkZLVnh1WEc1Y2JteGxibWQwYUNoMWJtbHhkV1VvY1hWbGNubElhWFJ6S0dacGJtUlBkbVZ5YkdGd2N5aFVVMU14YldJdVozSnZkWEF4TG1keUxDQndaV0ZyTGxkb2VYUmxMbE5GS1NrcEtTOXNaVzVuZEdnb1oyVnVaUzVuY205MWNERXBLakV3TUZ4dWJHVnVaM1JvS0hWdWFYRjFaU2h4ZFdWeWVVaHBkSE1vWm1sdVpFOTJaWEpzWVhCektGUlRVekZ0WWk1bmNtOTFjREl1WjNJc0lIQmxZV3N1VjJoNWRHVXVVMFVwS1NrcEwyeGxibWQwYUNoblpXNWxMbWR5YjNWd01pa3FNVEF3WEc1Y2JteGxibWQwYUNoMWJtbHhkV1VvY1hWbGNubElhWFJ6S0dacGJtUlBkbVZ5YkdGd2N5aFVVMU14YldJdVozSnZkWEF4TG1keUxDQndaV0ZyTGtSNWJHRnVMbE5GS1NrcEtTOXNaVzVuZEdnb1oyVnVaUzVuY205MWNERXBLakV3TUZ4dWJHVnVaM1JvS0hWdWFYRjFaU2h4ZFdWeWVVaHBkSE1vWm1sdVpFOTJaWEpzWVhCektGUlRVekZ0WWk1bmNtOTFjREl1WjNJc0lIQmxZV3N1Ukhsc1lXNHVVMFVwS1NrcEwyeGxibWQwYUNoblpXNWxMbWR5YjNWd01pa3FNVEF3WEc1Y2JpTldhV1YzS0dGelgzUnBZbUpzWlNoVVUxTXhiV0l1WjNKdmRYQXhMbWR5VzNWdWFYRjFaU2h4ZFdWeWVVaHBkSE1vWm1sdVpFOTJaWEpzWVhCektGUlRVekZ0WWk1bmNtOTFjREV1WjNJc0lIQmxZV3N1VjJoNWRHVXVVMFVwS1NsZEtTbGNiaU5XYVdWM0tHRnpYM1JwWW1Kc1pTaFVVMU14YldJdVozSnZkWEF4TG1keVczVnVhWEYxWlNoeGRXVnllVWhwZEhNb1ptbHVaRTkyWlhKc1lYQnpLRlJUVXpGdFlpNW5jbTkxY0RFdVozSXNJSEJsWVdzdVJIbHNZVzR1VTBVcEtTbGRLU2xjYmx4dVoyVnVaUzVuY205MWNERXVVMFVnUEMwZ0tHRnpYM1JwWW1Kc1pTaFVVMU14YldJdVozSnZkWEF4TG1keVczVnVhWEYxWlNoeGRXVnllVWhwZEhNb1ptbHVaRTkyWlhKc1lYQnpLRlJUVXpGdFlpNW5jbTkxY0RFdVozSXNJSEJsWVdzdVJIbHNZVzR1VTBVcEtTbGRLU2trWlc1elpXMWliRnh1WjJWdVpTNW5jbTkxY0RFdWJtOVRSU0E4TFNCblpXNWxMbWR5YjNWd01Wc2hLR2RsYm1VdVozSnZkWEF4SUNWcGJpVWdaMlZ1WlM1bmNtOTFjREV1VTBVcFhWeHVYRzV2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9WRk5UTVcxaUxtZHliM1Z3TWk1bmNpd2djR1ZoYXk1RWVXeGhiaTVUUlNsY2JuVnVhWEYxWlY5b2FYUnpJRHd0SUhWdWFYRjFaU2h4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wS1Z4dVoyVnVaUzVuY205MWNESXVVMFVnUEMwZ1lYTmZkR2xpWW14bEtGUlRVekZ0WWk1bmNtOTFjREl1WjNKYmRXNXBjWFZsWDJocGRITmRLU1JsYm5ObGJXSnNYRzVuWlc1bExtZHliM1Z3TWk1dWIxTkZJRHd0SUdGelgzUnBZbUpzWlNoVVUxTXhiV0l1WjNKdmRYQXlMbWR5V3kxMWJtbHhkV1ZmYUdsMGMxMHBKR1Z1YzJWdFlteGNibHh1WEc0akl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpYRzVuWlc1bExuUmlJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltMXRNVEJmUjFKRGJUTTRMbkEyWDJkbGJtVmZjMjl5ZEdWa0xtSmxaRndpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9WRk5USUQwZ2FXWmxiSE5sS0ZZMElEMDlJRndpSzF3aUxDQldNaXdnVmpNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlRVM04wWVhKMElEMGdWRk5USUMwZ01XVTJMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRlJUVTJWdVpDQTlJRlJUVXlBcklERmxOaWtnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1ZqRXNJRlJUVTNOMFlYSjBMQ0JVVTFObGJtUXNJRlkyTENCV05TbGNibU52Ykc1aGJXVnpLR2RsYm1VdWRHSXBJRHd0SUdNb1hDSmphSEpjSWl3Z1hDSnpkR0Z5ZEZ3aUxDQmNJbVZ1WkZ3aUxDQmNJbVZ1YzJWdFlteGNJaXdnWENKblpXNWxYQ0lwWEc1Y2JpTWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU5jYmlNZ1RHbHpkQ0J2WmlCbmNtOTFjSE1nZEc4Z2NISnZZMlZ6YzF4dVozSnZkWEJ6SUR3dElHTW9YQ0puWlc1bExtZHliM1Z3TVM1VFJWd2lMQ0JjSW1kbGJtVXVaM0p2ZFhBeExtNXZVMFZjSWlsY2JseHVJeUJRY205alpYTnpJR1ZoWTJnZ1ozSnZkWEFnWVc1a0lHTnZiV0pwYm1VZ2NtVnpkV3gwYzF4dWMzVnRiV0Z5ZVY5a1lYUmhJRHd0SUcxaGNGOWtabklvWjNKdmRYQnpMQ0IrSUhCeWIyTmxjM05mWjNKdmRYQW9MbmdzSUdkbGJtVXVkR0lzSUdKcGJuTXVNVEJyWWlrcFhHNWNiaU1nUVdSa0lIUm9aU0JoWkdScGRHbHZibUZzSUhKdmQzTWdabTl5SUdScGMzUmhibU5sUW1sdUlEMGdNRnh1YzNWdGJXRnllVjlrWVhSaElEd3RJSE4xYlcxaGNubGZaR0YwWVNBbFBpVmNiaUFnYlhWMFlYUmxLR1JwYzNSaGJtTmxRbWx1SUQwZ1pHbHpkR0Z1WTJWQ2FXNGdLeUF4S1NBbFBpVmNiaUFnWVdSa1gzSnZkeWhrYVhOMFlXNWpaVUpwYmlBOUlEQXNJRzFsWVc1ZmNHVmhhMTlqYjNWdWRITWdQU0F3TENCelpGOXdaV0ZyWDJOdmRXNTBjeUE5SURBc0lHZHliM1Z3SUQwZ1hDSm5aVzVsTG1keWIzVndNUzVUUlZ3aUtTQWxQaVZjYmlBZ1lXUmtYM0p2ZHloa2FYTjBZVzVqWlVKcGJpQTlJREFzSUcxbFlXNWZjR1ZoYTE5amIzVnVkSE1nUFNBd0xDQnpaRjl3WldGclgyTnZkVzUwY3lBOUlEQXNJR2R5YjNWd0lEMGdYQ0puWlc1bExtZHliM1Z3TVM1dWIxTkZYQ0lwWEc1Y2JpTWdVR3h2ZENCMGFHVWdjbVZ6ZFd4MGMxeHVaMmR3Ykc5MEtITjFiVzFoY25sZlpHRjBZU3dnWVdWektIZ2dQU0JrYVhOMFlXNWpaVUpwYml3Z2VTQTlJRzFsWVc1ZmNHVmhhMTlqYjNWdWRITXNJR052Ykc5eUlEMGdaM0p2ZFhBcEtTQXJJRnh1SUNCblpXOXRYMnhwYm1Vb2MybDZaU0E5SURFcElDdGNiaUFnYkdGaWN5aGNiaUFnSUNCMGFYUnNaU0E5SUhCaGMzUmxNQ2hjSWsxbFlXNGdVR1ZoYXlCRGIzVnVkSE1zSUNzdFhDSXNJR1pzWVc1clUybDZaU3dnWENKaWNDd2dWMmg1ZEdVZ1UwVmNJaWtzWEc0Z0lDQWdlQ0E5SUZ3aVJHbHpkR0Z1WTJVZ1FtbHVJQ2d4TUNCcllpbGNJaXhjYmlBZ0lDQjVJRDBnWENKTlpXRnVJRkJsWVdzZ1EyOTFiblJ6WENKY2JpQWdLU0FyWEc0Z0lIUm9aVzFsWDIxcGJtbHRZV3dvS1NBclhHNGdJSFJvWlcxbEtGeHVJQ0FnSUhCc2IzUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYUdwMWMzUWdQU0F3TGpVc0lITnBlbVVnUFNBeE5Dd2dabUZqWlNBOUlGd2lZbTlzWkZ3aUtTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJREV5S1N4Y2JpQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLSE5wZW1VZ1BTQXhNeWxjYmlBZ0tWeHVYRzRqSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNalhHNGpJRXhwYzNRZ2IyWWdaM0p2ZFhCeklIUnZJSEJ5YjJObGMzTmNibWR5YjNWd2N5QThMU0JqS0Z3aVoyVnVaUzVuY205MWNERXVVMFZjSWl3Z1hDSm5aVzVsTG1keWIzVndNUzV1YjFORlhDSXNJRndpWjJWdVpTNW5jbTkxY0RJdVUwVmNJaXdnWENKblpXNWxMbWR5YjNWd01pNXViMU5GWENJcFhHNWNiaU1nVUhKdlkyVnpjeUJsWVdOb0lHZHliM1Z3SUdGdVpDQmpiMjFpYVc1bElISmxjM1ZzZEhOY2JuTjFiVzFoY25sZlpHRjBZU0E4TFNCdFlYQmZaR1p5S0dkeWIzVndjeXdnZmlCd2NtOWpaWE56WDJkeWIzVndLQzU0TENCblpXNWxMblJpTENCaWFXNXpMakV3YTJJcEtWeHVYRzRqSUVGa1pDQjBhR1VnWVdSa2FYUnBiMjVoYkNCeWIzZHpJR1p2Y2lCa2FYTjBZVzVqWlVKcGJpQTlJREJjYm5OMWJXMWhjbmxmWkdGMFlTQThMU0J6ZFcxdFlYSjVYMlJoZEdFZ0pUNGxYRzRnSUcxMWRHRjBaU2hrYVhOMFlXNWpaVUpwYmlBOUlHUnBjM1JoYm1ObFFtbHVJQ3NnTVNrZ0pUNGxYRzRnSUNBZ1lXUmtYM0p2ZHloa2FYTjBZVzVqWlVKcGJpQTlJREFzSUcxbFlXNWZjR1ZoYTE5amIzVnVkSE1nUFNBd0xDQnpaRjl3WldGclgyTnZkVzUwY3lBOUlEQXNJR2R5YjNWd0lEMGdYQ0puWlc1bExtZHliM1Z3TVM1VFJWd2lLU0FsUGlWY2JpQWdZV1JrWDNKdmR5aGthWE4wWVc1alpVSnBiaUE5SURBc0lHMWxZVzVmY0dWaGExOWpiM1Z1ZEhNZ1BTQXdMQ0J6WkY5d1pXRnJYMk52ZFc1MGN5QTlJREFzSUdkeWIzVndJRDBnWENKblpXNWxMbWR5YjNWd01TNXViMU5GWENJcElDVStKVnh1SUNCaFpHUmZjbTkzS0dScGMzUmhibU5sUW1sdUlEMGdNQ3dnYldWaGJsOXdaV0ZyWDJOdmRXNTBjeUE5SURBc0lITmtYM0JsWVd0ZlkyOTFiblJ6SUQwZ01Dd2daM0p2ZFhBZ1BTQmNJbWRsYm1VdVozSnZkWEF5TGxORlhDSXBJQ1UrSlZ4dUlDQmhaR1JmY205M0tHUnBjM1JoYm1ObFFtbHVJRDBnTUN3Z2JXVmhibDl3WldGclgyTnZkVzUwY3lBOUlEQXNJSE5rWDNCbFlXdGZZMjkxYm5SeklEMGdNQ3dnWjNKdmRYQWdQU0JjSW1kbGJtVXVaM0p2ZFhBeUxtNXZVMFZjSWlsY2JseHVJeUJRYkc5MElIUm9aU0J5WlhOMWJIUnpYRzVuWjNCc2IzUW9jM1Z0YldGeWVWOWtZWFJoTENCaFpYTW9lQ0E5SUdScGMzUmhibU5sUW1sdUxDQjVJRDBnYldWaGJsOXdaV0ZyWDJOdmRXNTBjeXdnWTI5c2IzSWdQU0JuY205MWNDa3BJQ3NnWEc0Z0lHZGxiMjFmYkdsdVpTaHphWHBsSUQwZ01Ta2dLMXh1SUNCc1lXSnpLRnh1SUNBZ0lIUnBkR3hsSUQwZ2NHRnpkR1V3S0Z3aVRXVmhiaUJRWldGcklFTnZkVzUwY3l3Z0t5MWNJaXdnWm14aGJtdFRhWHBsTENCY0ltSndMQ0JYYUhsMFpTQlRSVndpS1N4Y2JpQWdJQ0I0SUQwZ1hDSkVhWE4wWVc1alpTQkNhVzRnS0RFd0lHdGlLVndpTEZ4dUlDQWdJSGtnUFNCY0lrMWxZVzRnVUdWaGF5QkRiM1Z1ZEhOY0lseHVJQ0FwSUN0Y2JpQWdkR2hsYldWZmJXbHVhVzFoYkNncElDdGNiaUFnZEdobGJXVW9YRzRnSUNBZ2NHeHZkQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENob2FuVnpkQ0E5SURBdU5Td2djMmw2WlNBOUlERTBMQ0JtWVdObElEMGdYQ0ppYjJ4a1hDSXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTVRJcExGeHVJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJREV6S1Z4dUlDQXBYRzRqSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNalhHNGpJRXhwYzNRZ2IyWWdaM0p2ZFhCeklIUnZJSEJ5YjJObGMzTmNibWR5YjNWd2N5QThMU0JqS0Z3aVoyVnVaUzVuY205MWNESXVVMFZjSWl3Z1hDSm5aVzVsTG1keWIzVndNaTV1YjFORlhDSXBYRzVjYmlNZ1VISnZZMlZ6Y3lCbFlXTm9JR2R5YjNWd0lHRnVaQ0JqYjIxaWFXNWxJSEpsYzNWc2RITmNibk4xYlcxaGNubGZaR0YwWVNBOExTQnRZWEJmWkdaeUtHZHliM1Z3Y3l3Z2ZpQndjbTlqWlhOelgyZHliM1Z3S0M1NExDQm5aVzVsTG5SaUxDQmlhVzV6TGpFd2EySXBLVnh1WEc0aklFRmtaQ0IwYUdVZ1lXUmthWFJwYjI1aGJDQnliM2R6SUdadmNpQmthWE4wWVc1alpVSnBiaUE5SURCY2JuTjFiVzFoY25sZlpHRjBZU0E4TFNCemRXMXRZWEo1WDJSaGRHRWdKVDRsWEc0Z0lHMTFkR0YwWlNoa2FYTjBZVzVqWlVKcGJpQTlJR1JwYzNSaGJtTmxRbWx1SUNzZ01Ta2dKVDRsWEc0Z0lHRmtaRjl5YjNjb1pHbHpkR0Z1WTJWQ2FXNGdQU0F3TENCdFpXRnVYM0JsWVd0ZlkyOTFiblJ6SUQwZ01Dd2djMlJmY0dWaGExOWpiM1Z1ZEhNZ1BTQXdMQ0JuY205MWNDQTlJRndpWjJWdVpTNW5jbTkxY0RJdVUwVmNJaWtnSlQ0bFhHNGdJR0ZrWkY5eWIzY29aR2x6ZEdGdVkyVkNhVzRnUFNBd0xDQnRaV0Z1WDNCbFlXdGZZMjkxYm5SeklEMGdNQ3dnYzJSZmNHVmhhMTlqYjNWdWRITWdQU0F3TENCbmNtOTFjQ0E5SUZ3aVoyVnVaUzVuY205MWNESXVibTlUUlZ3aUtWeHVYRzRqSUZCc2IzUWdkR2hsSUhKbGMzVnNkSE5jYm1kbmNHeHZkQ2h6ZFcxdFlYSjVYMlJoZEdFc0lHRmxjeWg0SUQwZ1pHbHpkR0Z1WTJWQ2FXNHNJSGtnUFNCdFpXRnVYM0JsWVd0ZlkyOTFiblJ6TENCamIyeHZjaUE5SUdkeWIzVndLU2tnS3lCY2JpQWdaMlZ2YlY5c2FXNWxLSE5wZW1VZ1BTQXhLU0FyWEc0Z0lHeGhZbk1vWEc0Z0lDQWdkR2wwYkdVZ1BTQndZWE4wWlRBb1hDSk5aV0Z1SUZCbFlXc2dRMjkxYm5SekxDQXJMVndpTENCbWJHRnVhMU5wZW1Vc0lGd2lZbkFzSUZkb2VYUmxJRk5GWENJcExGeHVJQ0FnSUhnZ1BTQmNJa1JwYzNSaGJtTmxJRUpwYmlBb01UQWdhMklwWENJc1hHNGdJQ0FnZVNBOUlGd2lUV1ZoYmlCUVpXRnJJRU52ZFc1MGMxd2lYRzRnSUNrZ0sxeHVJQ0IwYUdWdFpWOXRhVzVwYldGc0tDa2dLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQndiRzkwTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHaHFkWE4wSUQwZ01DNDFMQ0J6YVhwbElEMGdNVFFzSUdaaFkyVWdQU0JjSW1KdmJHUmNJaWtzWEc0Z0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBeE1pa3NYRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTVRNcFhHNGdJQ2xjYmx4dUl5TWdRMmhsWTJ0cGJtY2dVQzFUSUdsdUlIUm9aU0J6ZFdKelpYUWdiMllnWjJWdVpYTmNibHh1Y21WemRXeDBSR2x5SUR3dElHaGxjbVVvWENJdUxpOHVMaTl5WlhOMWJIUmNJaWxjYm5SbGJYQXlJRHd0SUhKbFlXUlNSRk1vYUdWeVpTaHlaWE4xYkhSRWFYSXNJRndpWjJWdVpWOXNiMjl3WDJ4cGJtc3VjbVJ6WENJcEtWeHVYRzUwWlcxd015QThMU0IwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5aVzVsSUNWcGJpVWdZeWhuWlc1bExtZHliM1Z3TVNrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdZMkZ6WlY5M2FHVnVLR2RsYm1VZ0pXbHVKU0JuWlc1bExtZHliM1Z3TVM1VFJTQitJRndpVTBWY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVbFZGSUg0Z1hDSnViMU5GWENJcEtWeHVYRzVjYm1kbmNHeHZkQ2gwWlcxd015d2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJRzUxYlY5d2N5a3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQm5jbTkxY0NrcElDc2daMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0eEtTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tWeHVYRzVuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpQWdaR2x6ZEdGdVkyVXhJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlaM0p2ZFhBeEtTQXBKRzUxYlY5d2NGeHVJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDFuY205MWNESXBJQ2trYm5WdFgzQndYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzVjYm1kbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0RNc0lGd2libTlUUlZ3aUxDQmNJbE5GWENJcFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxucGVhay5XaHl0ZS5TRSA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXHN1cGVyRW5oYW5jZXJfV2h5dGVfRVNDX21tMTAuYmVkXFwpKVxucGVhay5EeWxhbi5TRSA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXHN1cGVyRW5oYW5jZXJfRHlsYW5fRVNDLmJlZFxcKSlcblxuXG5cbmZsYW5rU2l6ZSA8LSAwLjVlNlxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSxcbiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kLCBWNiwgVjUpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxlbnNlbWJsXFwsIFxcZ2VuZVxcKVxuXG5nZW5lLmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ2VuZS5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuVFNTMW1iLmdyb3VwMS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgZ2VuZS5ncm91cDEpLCBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKVxuVFNTMW1iLmdyb3VwMi5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgZ2VuZS5ncm91cDIpLCBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKVxuXG5cbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhUU1MxbWIuZ3JvdXAxLmdyLCBwZWFrLldoeXRlLlNFKSkpKS9sZW5ndGgoZ2VuZS5ncm91cDEpKjEwMFxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKFRTUzFtYi5ncm91cDIuZ3IsIHBlYWsuV2h5dGUuU0UpKSkpL2xlbmd0aChnZW5lLmdyb3VwMikqMTAwXG5cbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhUU1MxbWIuZ3JvdXAxLmdyLCBwZWFrLkR5bGFuLlNFKSkpKS9sZW5ndGgoZ2VuZS5ncm91cDEpKjEwMFxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKFRTUzFtYi5ncm91cDIuZ3IsIHBlYWsuRHlsYW4uU0UpKSkpL2xlbmd0aChnZW5lLmdyb3VwMikqMTAwXG5cbiNWaWV3KGFzX3RpYmJsZShUU1MxbWIuZ3JvdXAxLmdyW3VuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKFRTUzFtYi5ncm91cDEuZ3IsIHBlYWsuV2h5dGUuU0UpKSldKSlcbiNWaWV3KGFzX3RpYmJsZShUU1MxbWIuZ3JvdXAxLmdyW3VuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKFRTUzFtYi5ncm91cDEuZ3IsIHBlYWsuRHlsYW4uU0UpKSldKSlcblxuZ2VuZS5ncm91cDEuU0UgPC0gKGFzX3RpYmJsZShUU1MxbWIuZ3JvdXAxLmdyW3VuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKFRTUzFtYi5ncm91cDEuZ3IsIHBlYWsuRHlsYW4uU0UpKSldKSkkZW5zZW1ibFxuZ2VuZS5ncm91cDEubm9TRSA8LSBnZW5lLmdyb3VwMVshKGdlbmUuZ3JvdXAxICVpbiUgZ2VuZS5ncm91cDEuU0UpXVxuXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoVFNTMW1iLmdyb3VwMi5nciwgcGVhay5EeWxhbi5TRSlcbnVuaXF1ZV9oaXRzIDwtIHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcHMpKVxuZ2VuZS5ncm91cDIuU0UgPC0gYXNfdGliYmxlKFRTUzFtYi5ncm91cDIuZ3JbdW5pcXVlX2hpdHNdKSRlbnNlbWJsXG5nZW5lLmdyb3VwMi5ub1NFIDwtIGFzX3RpYmJsZShUU1MxbWIuZ3JvdXAyLmdyWy11bmlxdWVfaGl0c10pJGVuc2VtYmxcblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLFxuICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gMWU2LFxuICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIDFlNikgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY2LCBWNSlcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGVuc2VtYmxcXCwgXFxnZW5lXFwpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgTGlzdCBvZiBncm91cHMgdG8gcHJvY2Vzc1xuZ3JvdXBzIDwtIGMoXFxnZW5lLmdyb3VwMS5TRVxcLCBcXGdlbmUuZ3JvdXAxLm5vU0VcXClcblxuIyBQcm9jZXNzIGVhY2ggZ3JvdXAgYW5kIGNvbWJpbmUgcmVzdWx0c1xuc3VtbWFyeV9kYXRhIDwtIG1hcF9kZnIoZ3JvdXBzLCB+IHByb2Nlc3NfZ3JvdXAoLngsIGdlbmUudGIsIGJpbnMuMTBrYikpXG5cbiMgQWRkIHRoZSBhZGRpdGlvbmFsIHJvd3MgZm9yIGRpc3RhbmNlQmluID0gMFxuc3VtbWFyeV9kYXRhIDwtIHN1bW1hcnlfZGF0YSAlPiVcbiAgbXV0YXRlKGRpc3RhbmNlQmluID0gZGlzdGFuY2VCaW4gKyAxKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxnZW5lLmdyb3VwMS5TRVxcKSAlPiVcbiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gXFxnZW5lLmdyb3VwMS5ub1NFXFwpXG5cbiMgUGxvdCB0aGUgcmVzdWx0c1xuZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSBkaXN0YW5jZUJpbiwgeSA9IG1lYW5fcGVha19jb3VudHMsIGNvbG9yID0gZ3JvdXApKSArIFxuICBnZW9tX2xpbmUoc2l6ZSA9IDEpICtcbiAgbGFicyhcbiAgICB0aXRsZSA9IHBhc3RlMChcXE1lYW4gUGVhayBDb3VudHNcbiJ9 -->
peak.Whyte.SE <- importPeak(here(refDir, \superEnhancer_Whyte_ESC_mm10.bed\))
peak.Dylan.SE <- importPeak(here(refDir, \superEnhancer_Dylan_ESC.bed\))



flankSize <- 0.5e6
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6, V5)
colnames(gene.tb) <- c(\chr\, \start\, \end\, \ensembl\, \gene\)

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

TSS1mb.group1.gr <- makeGRangesFromDataFrame(gene.tb %>% dplyr::filter(ensembl %in% gene.group1), keep.extra.columns = TRUE)
TSS1mb.group2.gr <- makeGRangesFromDataFrame(gene.tb %>% dplyr::filter(ensembl %in% gene.group2), keep.extra.columns = TRUE)


length(unique(queryHits(findOverlaps(TSS1mb.group1.gr, peak.Whyte.SE))))/length(gene.group1)*100
length(unique(queryHits(findOverlaps(TSS1mb.group2.gr, peak.Whyte.SE))))/length(gene.group2)*100

length(unique(queryHits(findOverlaps(TSS1mb.group1.gr, peak.Dylan.SE))))/length(gene.group1)*100
length(unique(queryHits(findOverlaps(TSS1mb.group2.gr, peak.Dylan.SE))))/length(gene.group2)*100

#View(as_tibble(TSS1mb.group1.gr[unique(queryHits(findOverlaps(TSS1mb.group1.gr, peak.Whyte.SE)))]))
#View(as_tibble(TSS1mb.group1.gr[unique(queryHits(findOverlaps(TSS1mb.group1.gr, peak.Dylan.SE)))]))

gene.group1.SE <- (as_tibble(TSS1mb.group1.gr[unique(queryHits(findOverlaps(TSS1mb.group1.gr, peak.Dylan.SE)))]))$ensembl
gene.group1.noSE <- gene.group1[!(gene.group1 %in% gene.group1.SE)]

overlaps <- findOverlaps(TSS1mb.group2.gr, peak.Dylan.SE)
unique_hits <- unique(queryHits(overlaps))
gene.group2.SE <- as_tibble(TSS1mb.group2.gr[unique_hits])$ensembl
gene.group2.noSE <- as_tibble(TSS1mb.group2.gr[-unique_hits])$ensembl


##########################################################
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - 1e6,
                TSSend = TSS + 1e6) %>%
  dplyr::select(V1, TSSstart, TSSend, V6, V5)
colnames(gene.tb) <- c(\chr\, \start\, \end\, \ensembl\, \gene\)

##########################################################
# List of groups to process
groups <- c(\gene.group1.SE\, \gene.group1.noSE\)

# Process each group and combine results
summary_data <- map_dfr(groups, ~ process_group(.x, gene.tb, bins.10kb))

# Add the additional rows for distanceBin = 0
summary_data <- summary_data %>%
  mutate(distanceBin = distanceBin + 1) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \gene.group1.SE\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \gene.group1.noSE\)

# Plot the results
ggplot(summary_data, aes(x = distanceBin, y = mean_peak_counts, color = group)) + 
  geom_line(size = 1) +
  labs(
    title = paste0(\Mean Peak Counts
```r
peak.Whyte.SE <- importPeak(here(refDir, \superEnhancer_Whyte_ESC_mm10.bed\))
peak.Dylan.SE <- importPeak(here(refDir, \superEnhancer_Dylan_ESC.bed\))



flankSize <- 0.5e6
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6, V5)
colnames(gene.tb) <- c(\chr\, \start\, \end\, \ensembl\, \gene\)

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

TSS1mb.group1.gr <- makeGRangesFromDataFrame(gene.tb %>% dplyr::filter(ensembl %in% gene.group1), keep.extra.columns = TRUE)
TSS1mb.group2.gr <- makeGRangesFromDataFrame(gene.tb %>% dplyr::filter(ensembl %in% gene.group2), keep.extra.columns = TRUE)


length(unique(queryHits(findOverlaps(TSS1mb.group1.gr, peak.Whyte.SE))))/length(gene.group1)*100
length(unique(queryHits(findOverlaps(TSS1mb.group2.gr, peak.Whyte.SE))))/length(gene.group2)*100

length(unique(queryHits(findOverlaps(TSS1mb.group1.gr, peak.Dylan.SE))))/length(gene.group1)*100
length(unique(queryHits(findOverlaps(TSS1mb.group2.gr, peak.Dylan.SE))))/length(gene.group2)*100

#View(as_tibble(TSS1mb.group1.gr[unique(queryHits(findOverlaps(TSS1mb.group1.gr, peak.Whyte.SE)))]))
#View(as_tibble(TSS1mb.group1.gr[unique(queryHits(findOverlaps(TSS1mb.group1.gr, peak.Dylan.SE)))]))

gene.group1.SE <- (as_tibble(TSS1mb.group1.gr[unique(queryHits(findOverlaps(TSS1mb.group1.gr, peak.Dylan.SE)))]))$ensembl
gene.group1.noSE <- gene.group1[!(gene.group1 %in% gene.group1.SE)]

overlaps <- findOverlaps(TSS1mb.group2.gr, peak.Dylan.SE)
unique_hits <- unique(queryHits(overlaps))
gene.group2.SE <- as_tibble(TSS1mb.group2.gr[unique_hits])$ensembl
gene.group2.noSE <- as_tibble(TSS1mb.group2.gr[-unique_hits])$ensembl


##########################################################
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - 1e6,
                TSSend = TSS + 1e6) %>%
  dplyr::select(V1, TSSstart, TSSend, V6, V5)
colnames(gene.tb) <- c(\chr\, \start\, \end\, \ensembl\, \gene\)

##########################################################
# List of groups to process
groups <- c(\gene.group1.SE\, \gene.group1.noSE\)

# Process each group and combine results
summary_data <- map_dfr(groups, ~ process_group(.x, gene.tb, bins.10kb))

# Add the additional rows for distanceBin = 0
summary_data <- summary_data %>%
  mutate(distanceBin = distanceBin + 1) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \gene.group1.SE\) %>%
  add_row(distanceBin = 0, mean_peak_counts = 0, sd_peak_counts = 0, group = \gene.group1.noSE\)

# Plot the results
ggplot(summary_data, aes(x = distanceBin, y = mean_peak_counts, color = group)) + 
  geom_line(size = 1) +
  labs(
    title = paste0(\Mean Peak Counts

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubmFtZSA8LSBcImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcIlxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXCJfcC1uX2Vuc2VtYmxMaXN0LnRzdlwiKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSB1bm5lc3QoZ2VuZSlcblxuXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcIm1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFwiKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFwiK1wiLCBWMiwgVjMpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWNiwgVFNTKVxuY29sbmFtZXMoZ2VuZS50YikgPC0gYyhcImVuc2VtYmxcIiwgXCJUU1NcIilcblxuXG5nZW5lQW5ub0RhdGEgIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihnZW5lLnRiLCBieSA9IGMoXCJnZW5lXCIgPSBcImVuc2VtYmxcIikpXG5cbmRhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNiwgMjksIDMxLCAzNSkpICU+JVxuICByb3d3aXNlKCkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlzdFRvQW5jaG9yMSA9IChzdGFydDEgKyBlbmQxKS8yIC0gVFNTLFxuICAgICAgICAgICAgICAgIGRpc3RUb0FuY2hvcjIgPSAoc3RhcnQyICsgZW5kMikvMiAtIFRTUyxcbiAgICAgICAgICAgICAgICBkaXN0VG9BbmNob3IgPSBpZl9lbHNlKGFicyhkaXN0VG9BbmNob3IxKSA+IGFicyhkaXN0VG9BbmNob3IyKSwgZGlzdFRvQW5jaG9yMSwgZGlzdFRvQW5jaG9yMiksXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gaWZfZWxzZShkaXN0VG9BbmNob3IgPiAwLCBcInJpZ2h0XCIsIFwibGVmdFwiKSlcblxuZGF0YS5kaXJlY3Rpb25hbGl0eSA8LSBkYXRhICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLFxuICAgICAgICAgICAgbl9yaWdodCA9IHN1bShkaXJlY3Rpb24gPT0gXCJyaWdodFwiKSxcbiAgICAgICAgICAgIG5fbGVmdCA9IHN1bShkaXJlY3Rpb24gPT0gXCJsZWZ0XCIpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihjb3VudCA+IDEpICU+JVxuICBkcGx5cjo6bXV0YXRlKG4gPSBuX3JpZ2h0ICsgbl9sZWZ0LFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbmFsaXR5ID0gYWJzKChuX3JpZ2h0IC0gbl9sZWZ0KS9uKSlcblxuXG4jZ2dwbG90KGRhdGEuZGlyZWN0aW9uYWxpdHksIGFlcyh4ID0gZGlyZWN0aW9uYWxpdHkpKSArIGdlb21faGlzdG9ncmFtKCkgKyB0aGVtZV9jbGFzc2ljKClcblxuXG5nZW5lLmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXCJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlwiKSkkZ2VuZVxuZ2VuZS5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFwiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcIikpJGdlbmVcblxudGVtcCA8LSBkYXRhLmRpcmVjdGlvbmFsaXR5ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmUgJWluJSBjKGdlbmUuZ3JvdXAxLCBnZW5lLmdyb3VwMikpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gaWZfZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDEsIFwiZ3JvdXAxXCIsIFwiZ3JvdXAyXCIpKVxuXG5cbmdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlyZWN0aW9uYWxpdHkpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEpICsgXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShcIlAtU1wiKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcInBvaW50XCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXCJyZWRcIiwgY29sb3IgPSBcImJsYWNrXCIpXG5cblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1BTXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkZGlyZWN0aW9uYWxpdHlcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGRpcmVjdGlvbmFsaXR5XG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5cbnJlc3VsdERpciA8LSBoZXJlKFwiLi4vLi4vcmVzdWx0XCIpXG50ZW1wMiA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCBcImdlbmVfbG9vcF9saW5rLnJkc1wiKSlcbiMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5wc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gNCkpJGdlbmVcbnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZVxucHNPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDIsIG51bV9wcyA8IDMpKSRnZW5lXG5wc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMSwgbnVtX3BzIDwgMikpJGdlbmVcbnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lXG5cbnRlbXAgPC0gZGF0YS5kaXJlY3Rpb25hbGl0eSAlPiUgZHBseXI6OmZpbHRlcihnZW5lICVpbiUgYyhwc092ZXIwLCBwc092ZXIxLCBwc092ZXIyLCBwc092ZXIzLCBwc092ZXI0KSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oZ2VuZSAlaW4lIHBzT3ZlcjAgfiBcInBzT3ZlcjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHNPdmVyMSB+IFwicHNPdmVyMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIyIH4gXCJwc092ZXIyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBzT3ZlcjMgfiBcInBzT3ZlcjNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHNPdmVyNCB+IFwicHNPdmVyNFwiKSlcblxucDM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXCJwc092ZXIzXCIsIFwicHNPdmVyNFwiKSwgNSlcbnAyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFwicHNPdmVyMlwiLCBcInBzT3ZlcjNcIiksIDUpXG5wMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcInBzT3ZlcjFcIiwgXCJwc092ZXIyXCIpLCA1KVxucDAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXCJwc092ZXIwXCIsIFwicHNPdmVyMVwiKSwgNSlcbnAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFwicHNPdmVyMFwiLCBcInBzT3ZlcjRcIiksIDUpXG5cblxuXG5nZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IGRpcmVjdGlvbmFsaXR5KSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xKSArIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUoXCJQLU5cIikgK1xuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXCJwb2ludFwiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFwicmVkXCIsIGNvbG9yID0gXCJibGFja1wiKSArXG4gIGFubm90YXRlKFwidGV4dFwiLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoXCJwMzQ6IFwiLCBjb252UHZhbHVlKHAzNCksIFwiXFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInAyMzogXCIsIGNvbnZQdmFsdWUocDIzKSwgXCJcXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicDEyOiBcIiwgY29udlB2YWx1ZShwMTIpLCBcIlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwMDE6IFwiLCBjb252UHZhbHVlKHAwMSksIFwiXFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInAwNDogXCIsIGNvbnZQdmFsdWUocDA0KSwgXCJcXG5cIiksXG4gICAgICAgICAgIGNvbG9yID0gXCJibGFja1wiLCBoanVzdCA9IDAsIHNpemUgPSAzKVxuXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIHBlXG5cbnBlT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSA0KSkkZ2VuZVxucGVPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lXG5wZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmVcbnBlT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAxLCBudW1fcGUgPCAyKSkkZ2VuZVxucGVPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmVcblxudGVtcCA8LSBkYXRhLmRpcmVjdGlvbmFsaXR5ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmUgJWluJSBjKHBlT3ZlcjAsIHBlT3ZlcjEsIHBlT3ZlcjIsIHBlT3ZlcjMsIHBlT3ZlcjQpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihnZW5lICVpbiUgcGVPdmVyMCB+IFwicGVPdmVyMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIxIH4gXCJwZU92ZXIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBlT3ZlcjIgfiBcInBlT3ZlcjJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcGVPdmVyMyB+IFwicGVPdmVyM1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXI0IH4gXCJwZU92ZXI0XCIpKVxuXG5wMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcInBlT3ZlcjNcIiwgXCJwZU92ZXI0XCIpLCA1KVxucDIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXCJwZU92ZXIyXCIsIFwicGVPdmVyM1wiKSwgNSlcbnAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFwicGVPdmVyMVwiLCBcInBlT3ZlcjJcIiksIDUpXG5wMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcInBlT3ZlcjBcIiwgXCJwZU92ZXIxXCIpLCA1KVxucDA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXCJwZU92ZXIwXCIsIFwicGVPdmVyNFwiKSwgNSlcblxuXG5cbmdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlyZWN0aW9uYWxpdHkpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEpICsgXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShcIlAtTlwiKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcInBvaW50XCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXCJyZWRcIiwgY29sb3IgPSBcImJsYWNrXCIpICtcbiAgYW5ub3RhdGUoXCJ0ZXh0XCIsIHggPSAxLCB5ID0gMC41LCBsYWJlbCA9IHBhc3RlMChcInAzNDogXCIsIGNvbnZQdmFsdWUocDM0KSwgXCJcXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicDIzOiBcIiwgY29udlB2YWx1ZShwMjMpLCBcIlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwMTI6IFwiLCBjb252UHZhbHVlKHAxMiksIFwiXFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInAwMTogXCIsIGNvbnZQdmFsdWUocDAxKSwgXCJcXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicDA0OiBcIiwgY29udlB2YWx1ZShwMDQpLCBcIlxcblwiKSxcbiAgICAgICAgICAgY29sb3IgPSBcImJsYWNrXCIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpXG5cblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMgcHBcblxucHBPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDQpKSRnZW5lXG5wcE92ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMywgbnVtX3BwIDwgNCkpJGdlbmVcbnBwT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAyLCBudW1fcHAgPCAzKSkkZ2VuZVxucHBPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDEsIG51bV9wcCA8IDIpKSRnZW5lXG5wcE92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPCAxKSkkZ2VuZVxuXG50ZW1wIDwtIGRhdGEuZGlyZWN0aW9uYWxpdHkgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZSAlaW4lIGMocHBPdmVyMCwgcHBPdmVyMSwgcHBPdmVyMiwgcHBPdmVyMywgcHBPdmVyNCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGdlbmUgJWluJSBwcE92ZXIwIH4gXCJwcE92ZXIwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjEgfiBcInBwT3ZlcjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHBPdmVyMiB+IFwicHBPdmVyMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXIzIH4gXCJwcE92ZXIzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjQgfiBcInBwT3ZlcjRcIikpXG5cbnAzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFwicHBPdmVyM1wiLCBcInBwT3ZlcjRcIiksIDUpXG5wMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcInBwT3ZlcjJcIiwgXCJwcE92ZXIzXCIpLCA1KVxucDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXCJwcE92ZXIxXCIsIFwicHBPdmVyMlwiKSwgNSlcbnAwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFwicHBPdmVyMFwiLCBcInBwT3ZlcjFcIiksIDUpXG5wMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcInBwT3ZlcjBcIiwgXCJwcE92ZXI0XCIpLCA1KVxuXG5cblxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaXJlY3Rpb25hbGl0eSkpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSkgKyBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKFwiUC1OXCIpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFwicG9pbnRcIiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcInJlZFwiLCBjb2xvciA9IFwiYmxhY2tcIikgK1xuICBhbm5vdGF0ZShcInRleHRcIiwgeCA9IDEsIHkgPSAwLjUsIGxhYmVsID0gcGFzdGUwKFwicDM0OiBcIiwgY29udlB2YWx1ZShwMzQpLCBcIlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwMjM6IFwiLCBjb252UHZhbHVlKHAyMyksIFwiXFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInAxMjogXCIsIGNvbnZQdmFsdWUocDEyKSwgXCJcXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicDAxOiBcIiwgY29udlB2YWx1ZShwMDEpLCBcIlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwMDQ6IFwiLCBjb252UHZhbHVlKHAwNCksIFwiXFxuXCIpLFxuICAgICAgICAgICBjb2xvciA9IFwiYmxhY2tcIiwgaGp1c3QgPSAwLCBzaXplID0gMylcblxuXG5gYGAifQ== -->

```r
name <- \chromo_cons_annoHierarchy\
diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff)%>% 
  dplyr::mutate(distance = start2 - start1)


geneAnnoData <- geneAnnoData %>% unnest(gene)


gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, TSS)
colnames(gene.tb) <- c(\ensembl\, \TSS\)


geneAnnoData  <- geneAnnoData %>% dplyr::left_join(gene.tb, by = c(\gene\ = \ensembl\))

data <- geneAnnoData %>% dplyr::select(c(1, 2, 3, 4, 5, 6, 29, 31, 35)) %>%
  rowwise() %>%
  dplyr::mutate(distToAnchor1 = (start1 + end1)/2 - TSS,
                distToAnchor2 = (start2 + end2)/2 - TSS,
                distToAnchor = if_else(abs(distToAnchor1) > abs(distToAnchor2), distToAnchor1, distToAnchor2),
                direction = if_else(distToAnchor > 0, \right\, \left\))

data.directionality <- data %>% group_by(gene) %>%
  summarise(count = n(),
            n_right = sum(direction == \right\),
            n_left = sum(direction == \left\)) %>%
  dplyr::filter(count > 1) %>%
  dplyr::mutate(n = n_right + n_left,
                directionality = abs((n_right - n_left)/n))


#ggplot(data.directionality, aes(x = directionality)) + geom_histogram() + theme_classic()


gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

temp <- data.directionality %>% dplyr::filter(gene %in% c(gene.group1, gene.group2)) %>%
  dplyr::mutate(group = if_else(gene %in% gene.group1, \group1\, \group2\))


ggplot(temp, aes(x = group, y = directionality)) + geom_violin() + geom_boxplot(width = 0.1) + 
  geom_hline(yintercept = 0) + theme_classic() + ggtitle(\P-S\) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)


#########################PS

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$directionality
  distance2 <- (data %>% dplyr::filter(group ==group2) )$directionality
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


resultDir <- here(\../../result\)
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))
#####################

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene

temp <- data.directionality %>% dplyr::filter(gene %in% c(psOver0, psOver1, psOver2, psOver3, psOver4)) %>%
  dplyr::mutate(group = case_when(gene %in% psOver0 ~ \psOver0\,
                                  gene %in% psOver1 ~ \psOver1\,
                                  gene %in% psOver2 ~ \psOver2\,
                                  gene %in% psOver3 ~ \psOver3\,
                                  gene %in% psOver4 ~ \psOver4\))

p34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
p23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
p12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
p01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
p04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)



ggplot(temp, aes(x = group, y = directionality)) + geom_violin() + geom_boxplot(width = 0.1) + 
  geom_hline(yintercept = 0) + theme_classic() + ggtitle(\P-N\) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  annotate(\text\, x = 1, y = 0.5, label = paste0(\p34: \, convPvalue(p34), \\n\,
                                                \p23: \, convPvalue(p23), \\n\,
                                                \p12: \, convPvalue(p12), \\n\,
                                                \p01: \, convPvalue(p01), \\n\,
                                                \p04: \, convPvalue(p04), \\n\),
           color = \black\, hjust = 0, size = 3)


#################### pe

peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene

temp <- data.directionality %>% dplyr::filter(gene %in% c(peOver0, peOver1, peOver2, peOver3, peOver4)) %>%
  dplyr::mutate(group = case_when(gene %in% peOver0 ~ \peOver0\,
                                  gene %in% peOver1 ~ \peOver1\,
                                  gene %in% peOver2 ~ \peOver2\,
                                  gene %in% peOver3 ~ \peOver3\,
                                  gene %in% peOver4 ~ \peOver4\))

p34 <- round(getPvalWilcox(temp, \peOver3\, \peOver4\), 5)
p23 <- round(getPvalWilcox(temp, \peOver2\, \peOver3\), 5)
p12 <- round(getPvalWilcox(temp, \peOver1\, \peOver2\), 5)
p01 <- round(getPvalWilcox(temp, \peOver0\, \peOver1\), 5)
p04 <- round(getPvalWilcox(temp, \peOver0\, \peOver4\), 5)



ggplot(temp, aes(x = group, y = directionality)) + geom_violin() + geom_boxplot(width = 0.1) + 
  geom_hline(yintercept = 0) + theme_classic() + ggtitle(\P-N\) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  annotate(\text\, x = 1, y = 0.5, label = paste0(\p34: \, convPvalue(p34), \\n\,
                                                \p23: \, convPvalue(p23), \\n\,
                                                \p12: \, convPvalue(p12), \\n\,
                                                \p01: \, convPvalue(p01), \\n\,
                                                \p04: \, convPvalue(p04), \\n\),
           color = \black\, hjust = 0, size = 3)


#################### pp

ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene

temp <- data.directionality %>% dplyr::filter(gene %in% c(ppOver0, ppOver1, ppOver2, ppOver3, ppOver4)) %>%
  dplyr::mutate(group = case_when(gene %in% ppOver0 ~ \ppOver0\,
                                  gene %in% ppOver1 ~ \ppOver1\,
                                  gene %in% ppOver2 ~ \ppOver2\,
                                  gene %in% ppOver3 ~ \ppOver3\,
                                  gene %in% ppOver4 ~ \ppOver4\))

p34 <- round(getPvalWilcox(temp, \ppOver3\, \ppOver4\), 5)
p23 <- round(getPvalWilcox(temp, \ppOver2\, \ppOver3\), 5)
p12 <- round(getPvalWilcox(temp, \ppOver1\, \ppOver2\), 5)
p01 <- round(getPvalWilcox(temp, \ppOver0\, \ppOver1\), 5)
p04 <- round(getPvalWilcox(temp, \ppOver0\, \ppOver4\), 5)



ggplot(temp, aes(x = group, y = directionality)) + geom_violin() + geom_boxplot(width = 0.1) + 
  geom_hline(yintercept = 0) + theme_classic() + ggtitle(\P-N\) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  annotate(\text\, x = 1, y = 0.5, label = paste0(\p34: \, convPvalue(p34), \\n\,
                                                \p23: \, convPvalue(p23), \\n\,
                                                \p12: \, convPvalue(p12), \\n\,
                                                \p01: \, convPvalue(p01), \\n\,
                                                \p04: \, convPvalue(p04), \\n\),
           color = \black\, hjust = 0, size = 3)

```

<!-- rnb-source-end -->
```r
name <- \chromo_cons_annoHierarchy\
diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff)%>% 
  dplyr::mutate(distance = start2 - start1)


geneAnnoData <- geneAnnoData %>% unnest(gene)


gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, TSS)
colnames(gene.tb) <- c(\ensembl\, \TSS\)


geneAnnoData  <- geneAnnoData %>% dplyr::left_join(gene.tb, by = c(\gene\ = \ensembl\))

data <- geneAnnoData %>% dplyr::select(c(1, 2, 3, 4, 5, 6, 29, 31, 35)) %>%
  rowwise() %>%
  dplyr::mutate(distToAnchor1 = (start1 + end1)/2 - TSS,
                distToAnchor2 = (start2 + end2)/2 - TSS,
                distToAnchor = if_else(abs(distToAnchor1) > abs(distToAnchor2), distToAnchor1, distToAnchor2),
                direction = if_else(distToAnchor > 0, \right\, \left\))

data.directionality <- data %>% group_by(gene) %>%
  summarise(count = n(),
            n_right = sum(direction == \right\),
            n_left = sum(direction == \left\)) %>%
  dplyr::filter(count > 1) %>%
  dplyr::mutate(n = n_right + n_left,
                directionality = abs((n_right - n_left)/n))


#ggplot(data.directionality, aes(x = directionality)) + geom_histogram() + theme_classic()


gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

temp <- data.directionality %>% dplyr::filter(gene %in% c(gene.group1, gene.group2)) %>%
  dplyr::mutate(group = if_else(gene %in% gene.group1, \group1\, \group2\))


ggplot(temp, aes(x = group, y = directionality)) + geom_violin() + geom_boxplot(width = 0.1) + 
  geom_hline(yintercept = 0) + theme_classic() + ggtitle(\P-S\) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)


#########################PS

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$directionality
  distance2 <- (data %>% dplyr::filter(group ==group2) )$directionality
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}


resultDir <- here(\../../result\)
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))
#####################

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene

temp <- data.directionality %>% dplyr::filter(gene %in% c(psOver0, psOver1, psOver2, psOver3, psOver4)) %>%
  dplyr::mutate(group = case_when(gene %in% psOver0 ~ \psOver0\,
                                  gene %in% psOver1 ~ \psOver1\,
                                  gene %in% psOver2 ~ \psOver2\,
                                  gene %in% psOver3 ~ \psOver3\,
                                  gene %in% psOver4 ~ \psOver4\))

p34 <- round(getPvalWilcox(temp, \psOver3\, \psOver4\), 5)
p23 <- round(getPvalWilcox(temp, \psOver2\, \psOver3\), 5)
p12 <- round(getPvalWilcox(temp, \psOver1\, \psOver2\), 5)
p01 <- round(getPvalWilcox(temp, \psOver0\, \psOver1\), 5)
p04 <- round(getPvalWilcox(temp, \psOver0\, \psOver4\), 5)



ggplot(temp, aes(x = group, y = directionality)) + geom_violin() + geom_boxplot(width = 0.1) + 
  geom_hline(yintercept = 0) + theme_classic() + ggtitle(\P-N\) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  annotate(\text\, x = 1, y = 0.5, label = paste0(\p34: \, convPvalue(p34), \\n\,
                                                \p23: \, convPvalue(p23), \\n\,
                                                \p12: \, convPvalue(p12), \\n\,
                                                \p01: \, convPvalue(p01), \\n\,
                                                \p04: \, convPvalue(p04), \\n\),
           color = \black\, hjust = 0, size = 3)


#################### pe

peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene

temp <- data.directionality %>% dplyr::filter(gene %in% c(peOver0, peOver1, peOver2, peOver3, peOver4)) %>%
  dplyr::mutate(group = case_when(gene %in% peOver0 ~ \peOver0\,
                                  gene %in% peOver1 ~ \peOver1\,
                                  gene %in% peOver2 ~ \peOver2\,
                                  gene %in% peOver3 ~ \peOver3\,
                                  gene %in% peOver4 ~ \peOver4\))

p34 <- round(getPvalWilcox(temp, \peOver3\, \peOver4\), 5)
p23 <- round(getPvalWilcox(temp, \peOver2\, \peOver3\), 5)
p12 <- round(getPvalWilcox(temp, \peOver1\, \peOver2\), 5)
p01 <- round(getPvalWilcox(temp, \peOver0\, \peOver1\), 5)
p04 <- round(getPvalWilcox(temp, \peOver0\, \peOver4\), 5)



ggplot(temp, aes(x = group, y = directionality)) + geom_violin() + geom_boxplot(width = 0.1) + 
  geom_hline(yintercept = 0) + theme_classic() + ggtitle(\P-N\) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  annotate(\text\, x = 1, y = 0.5, label = paste0(\p34: \, convPvalue(p34), \\n\,
                                                \p23: \, convPvalue(p23), \\n\,
                                                \p12: \, convPvalue(p12), \\n\,
                                                \p01: \, convPvalue(p01), \\n\,
                                                \p04: \, convPvalue(p04), \\n\),
           color = \black\, hjust = 0, size = 3)


#################### pp

ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene

temp <- data.directionality %>% dplyr::filter(gene %in% c(ppOver0, ppOver1, ppOver2, ppOver3, ppOver4)) %>%
  dplyr::mutate(group = case_when(gene %in% ppOver0 ~ \ppOver0\,
                                  gene %in% ppOver1 ~ \ppOver1\,
                                  gene %in% ppOver2 ~ \ppOver2\,
                                  gene %in% ppOver3 ~ \ppOver3\,
                                  gene %in% ppOver4 ~ \ppOver4\))

p34 <- round(getPvalWilcox(temp, \ppOver3\, \ppOver4\), 5)
p23 <- round(getPvalWilcox(temp, \ppOver2\, \ppOver3\), 5)
p12 <- round(getPvalWilcox(temp, \ppOver1\, \ppOver2\), 5)
p01 <- round(getPvalWilcox(temp, \ppOver0\, \ppOver1\), 5)
p04 <- round(getPvalWilcox(temp, \ppOver0\, \ppOver4\), 5)



ggplot(temp, aes(x = group, y = directionality)) + geom_violin() + geom_boxplot(width = 0.1) + 
  geom_hline(yintercept = 0) + theme_classic() + ggtitle(\P-N\) +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  annotate(\text\, x = 1, y = 0.5, label = paste0(\p34: \, convPvalue(p34), \\n\,
                                                \p23: \, convPvalue(p23), \\n\,
                                                \p12: \, convPvalue(p12), \\n\,
                                                \p01: \, convPvalue(p01), \\n\,
                                                \p04: \, convPvalue(p04), \\n\),
           color = \black\, hjust = 0, size = 3)

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

### [2.31] Testing SEs?

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WkdsbVprTjFkRzltWmlBOExTQXdMakpjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZjQzF1WDJWdWMyVnRZbXhNYVhOMExuUnpkbHdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwWm1aRGRYUnZabVlnUFNCa2FXWm1RM1YwYjJabUtTVStKU0JjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaU0E5SUhOMFlYSjBNaUF0SUhOMFlYSjBNU2xjYmx4dVoyVnVaVUZ1Ym05RVlYUmhJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnZFc1dVpYTjBLR2RsYm1VcFhHNWNibWRsYm1VdWRHSWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aWJXMHhNRjlIVWtOdE16Z3VjRFpmWjJWdVpWOXpiM0owWldRdVltVmtYQ0lwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaFVVMU1nUFNCcFptVnNjMlVvVmpRZ1BUMGdYQ0lyWENJc0lGWXlMQ0JXTXlrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLRlkyTENCVVUxTXBYRzVqYjJ4dVlXMWxjeWhuWlc1bExuUmlLU0E4TFNCaktGd2laVzV6WlcxaWJGd2lMQ0JjSWxSVFUxd2lLVnh1WEc1Y2JtZGxibVZCYm01dlJHRjBZU0FnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82YkdWbWRGOXFiMmx1S0dkbGJtVXVkR0lzSUdKNUlEMGdZeWhjSW1kbGJtVmNJaUE5SUZ3aVpXNXpaVzFpYkZ3aUtTbGNibHh1WkdGMFlTQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1l5Z3hMQ0F5TENBekxDQTBMQ0ExTENBMkxDQXlPU3dnTXpFc0lETTFLU2tnSlQ0bFhHNGdJSEp2ZDNkcGMyVW9LU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBWRzlCYm1Ob2IzSXhJRDBnS0hOMFlYSjBNU0FySUdWdVpERXBMeklnTFNCVVUxTXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2x6ZEZSdlFXNWphRzl5TWlBOUlDaHpkR0Z5ZERJZ0t5QmxibVF5S1M4eUlDMGdWRk5UTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdScGMzUlViMEZ1WTJodmNpQTlJR2xtWDJWc2MyVW9ZV0p6S0dScGMzUlViMEZ1WTJodmNqRXBJRDRnWVdKektHUnBjM1JVYjBGdVkyaHZjaklwTENCa2FYTjBWRzlCYm1Ob2IzSXhMQ0JrYVhOMFZHOUJibU5vYjNJeUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmthWEpsWTNScGIyNGdQU0JwWmw5bGJITmxLR1JwYzNSVWIwRnVZMmh2Y2lBK0lEQXNJRndpY21sbmFIUmNJaXdnWENKc1pXWjBYQ0lwS1Z4dVhHNWNibkpsYzNWc2RDQThMU0JrWVhSaElDVStKVnh1SUNCbmNtOTFjRjlpZVNoblpXNWxMQ0JrYVhKbFkzUnBiMjRwSUNVK0pWeHVJQ0J0ZFhSaGRHVW9aR2x6ZEZSdlFXNWphRzl5SUQwZ1lXSnpLR1JwYzNSVWIwRnVZMmh2Y2lrcElDVStKVnh1SUNCdGRYUmhkR1VvYldGNFgyUnBjM1JmVUY5VElEMGdhV1psYkhObEtHRnVlU2hCYm01dk1pQTlQU0JjSWxBdFUxd2lLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0Y0S0dScGMzUlViMEZ1WTJodmNsdEJibTV2TWlBOVBTQmNJbEF0VTF3aVhTd2dibUV1Y20wZ1BTQlVVbFZGS1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnVGtFcEtTQWxQaVZjYmlBZ2JYVjBZWFJsS0dselgzTnRZV3hzWlhJZ1BTQnBabVZzYzJVb2FYTXVibUVvYldGNFgyUnBjM1JmVUY5VEtTd2dUa0VzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1pHbHpkRlJ2UVc1amFHOXlJRDA5SUcxaGVGOWthWE4wWDFCZlV5d2dUa0VzSUdScGMzUlViMEZ1WTJodmNpQThJRzFoZUY5a2FYTjBYMUJmVXlrcEtTQWxQaVZjYmlBZ2RXNW5jbTkxY0NncFhHNWNibHh1WEc1eVpYTjFiSFF5SUR3dElISmxjM1ZzZENBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lnaGFYTXVibUVvYVhOZmMyMWhiR3hsY2lrcFhHNWNibkpsYzNWc2RETWdQQzBnY21WemRXeDBNaUFsUGlVZ1ozSnZkWEJmWW5rb1oyVnVaU3dnWkdseVpXTjBhVzl1S1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0dOdmRXNTBYM1J5ZFdVZ1BTQnpkVzBvYVhOZmMyMWhiR3hsY2l3Z2JtRXVjbTBnUFNCVVVsVkZLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnZkVzUwWDJaaGJITmxJRDBnYzNWdEtHbHpYM050WVd4c1pYSWdQVDBnUmtGTVUwVXNJRzVoTG5KdElEMGdWRkpWUlNrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR052ZFc1MElEMGdZMjkxYm5SZmRISjFaU0FySUdOdmRXNTBYMlpoYkhObExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQmxjbU1nUFNCamIzVnVkRjkwY25WbEwyTnZkVzUwS2pFd01Da2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWjJWdVpTd2daR2x5WldOMGFXOXVMQ0J3WlhKaktWeHVYRzV5WlhOMWJIUXpJRHd0SUhKbGMzVnNkRE1nSlQ0bElHZHliM1Z3WDJKNUtHZGxibVVwSUNVK0pTQnpkVzF0WVhKcGVtVW9jR1Z5WXlBOUlHMWxZVzRvY0dWeVl5a3BYRzVjYmlNakl5TWpJeU1nUkU5cGJtY2dkR2hwY3lCbWIzSWdVQzFUSUdkeWIzVndjMXh1Y21WemRXeDBSR2x5SUR3dElHaGxjbVVvWENJdUxpOHVMaTl5WlhOMWJIUmNJaWxjYm5SbGJYQXlJRHd0SUhKbFlXUlNSRk1vYUdWeVpTaHlaWE4xYkhSRWFYSXNJRndpWjJWdVpWOXNiMjl3WDJ4cGJtc3VjbVJ6WENJcEtWeHVYRzV3YzA5MlpYSTBJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNITWdQajBnTkNrcEpHZGxibVZjYm5CelQzWmxjak1nUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjeUErUFNBekxDQnVkVzFmY0hNZ1BDQTBLU2trWjJWdVpWeHVjSE5QZG1WeU1pQThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCeklENDlJRElzSUc1MWJWOXdjeUE4SURNcEtTUm5aVzVsWEc1d2MwOTJaWEl4SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSE1nUGowZ01Td2diblZ0WDNCeklEd2dNaWtwSkdkbGJtVmNibkJ6VDNabGNqQWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2N5QThJREVwS1NSblpXNWxYRzVjYmx4dWNtVnpkV3gwTkNBOExTQnlaWE4xYkhReklDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHZHliM1Z3SUQwZ1kyRnpaVjkzYUdWdUtHZGxibVVnSldsdUpTQndjMDkyWlhJd0lINGdYQ0p3YzA5MlpYSXdYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkbGJtVWdKV2x1SlNCd2MwOTJaWEl4SUg0Z1hDSndjMDkyWlhJeFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSXlJSDRnWENKd2MwOTJaWEl5WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZGxibVVnSldsdUpTQndjMDkyWlhJeklINGdYQ0p3YzA5MlpYSXpYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkbGJtVWdKV2x1SlNCd2MwOTJaWEkwSUg0Z1hDSndjMDkyWlhJMFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRlJTVlVVZ2ZpQk9RU2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtDRnBjeTV1WVNobmNtOTFjQ2twWEc1Y2JseHVaMmR3Ykc5MEtISmxjM1ZzZERRc0lHRmxjeWg0SUQwZ0lHZHliM1Z3TENCNUlEMGdjR1Z5WXlrcElDc2daMlZ2YlY5MmFXOXNhVzRvS1NBcklHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TURVcElDc2dkR2hsYldWZlkyeGhjM05wWXlncElDdGNiaUFnYzNSaGRGOXpkVzF0WVhKNUtHRmxjeWhuY205MWNDQTlJR2R5YjNWd0tTd2dablZ1SUQwZ2JXVmhiaXdnWjJWdmJTQTlJRndpY0c5cGJuUmNJaXdnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURJc0lHWnBiR3dnUFNCY0luSmxaRndpTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWlsY2JseHVJeU1qSXlNakl5QkVUMmx1WnlCMGFHbHpJR1p2Y2lCUUxVVWdaM0p2ZFhCelhHNXdaVTkyWlhJMElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0dVZ1BqMGdOQ2twSkdkbGJtVmNibkJsVDNabGNqTWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d1pTQStQU0F6TENCdWRXMWZjR1VnUENBMEtTa2taMlZ1WlZ4dWNHVlBkbVZ5TWlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0JsSUQ0OUlESXNJRzUxYlY5d1pTQThJRE1wS1NSblpXNWxYRzV3WlU5MlpYSXhJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNHVWdQajBnTVN3Z2JuVnRYM0JsSUR3Z01pa3BKR2RsYm1WY2JuQmxUM1psY2pBZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3WlNBOElERXBLU1JuWlc1bFhHNWNibHh1Y21WemRXeDBOQ0E4TFNCeVpYTjFiSFF6SUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dkeWIzVndJRDBnWTJGelpWOTNhR1Z1S0dkbGJtVWdKV2x1SlNCd1pVOTJaWEl3SUg0Z1hDSndaVTkyWlhJd1hDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2RsYm1VZ0pXbHVKU0J3WlU5MlpYSXhJSDRnWENKd1pVOTJaWEl4WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZGxibVVnSldsdUpTQndaVTkyWlhJeUlINGdYQ0p3WlU5MlpYSXlYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkbGJtVWdKV2x1SlNCd1pVOTJaWEl6SUg0Z1hDSndaVTkyWlhJelhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2RsYm1VZ0pXbHVKU0J3WlU5MlpYSTBJSDRnWENKd1pVOTJaWEkwWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlNWVVVnZmlCT1FTa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0NGcGN5NXVZU2huY205MWNDa3BYRzVjYmx4dVoyZHdiRzkwS0hKbGMzVnNkRFFzSUdGbGN5aDRJRDBnSUdkeWIzVndMQ0I1SUQwZ2NHVnlZeWtwSUNzZ1oyVnZiVjkyYVc5c2FXNG9LU0FySUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNRFVwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdjM1JoZEY5emRXMXRZWEo1S0dGbGN5aG5jbTkxY0NBOUlHZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpd2daMlZ2YlNBOUlGd2ljRzlwYm5SY0lpd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJRElzSUdacGJHd2dQU0JjSW5KbFpGd2lMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaWxjYmx4dUl5TWpJeU1qSXlCRVQybHVaeUIwYUdseklHWnZjaUJRTFZBZ1ozSnZkWEJ6WEc1Y2JuQndUM1psY2pRZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y0NBK1BTQTBLU2trWjJWdVpWeHVjSEJQZG1WeU15QThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCd0lENDlJRE1zSUc1MWJWOXdjQ0E4SURRcEtTUm5aVzVsWEc1d2NFOTJaWEl5SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSEFnUGowZ01pd2diblZ0WDNCd0lEd2dNeWtwSkdkbGJtVmNibkJ3VDNabGNqRWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2NDQStQU0F4TENCdWRXMWZjSEFnUENBeUtTa2taMlZ1WlZ4dWNIQlBkbVZ5TUNBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J3SUR3Z01Ta3BKR2RsYm1WY2JseHVYRzV5WlhOMWJIUTBJRHd0SUhKbGMzVnNkRE1nSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JqWVhObFgzZG9aVzRvWjJWdVpTQWxhVzRsSUhCd1QzWmxjakFnZmlCY0luQndUM1psY2pCY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaMlZ1WlNBbGFXNGxJSEJ3VDNabGNqRWdmaUJjSW5Cd1QzWmxjakZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1oyVnVaU0FsYVc0bElIQndUM1psY2pJZ2ZpQmNJbkJ3VDNabGNqSmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjJWdVpTQWxhVzRsSUhCd1QzWmxjak1nZmlCY0luQndUM1psY2pOY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaMlZ1WlNBbGFXNGxJSEJ3VDNabGNqUWdmaUJjSW5Cd1QzWmxjalJjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ZGSlZSU0IrSUU1QktTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvSVdsekxtNWhLR2R5YjNWd0tTbGNibHh1WEc1blozQnNiM1FvY21WemRXeDBOQ3dnWVdWektIZ2dQU0FnWjNKdmRYQXNJSGtnUFNCd1pYSmpLU2tnS3lCblpXOXRYM1pwYjJ4cGJpZ3BJQ3NnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHdOU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRndpY21Wa1hDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lLVnh1WEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYpJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKVxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSB1bm5lc3QoZ2VuZSlcblxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjYsIFRTUylcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxlbnNlbWJsXFwsIFxcVFNTXFwpXG5cblxuZ2VuZUFubm9EYXRhICA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZS50YiwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsXFwpKVxuXG5kYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYsIDI5LCAzMSwgMzUpKSAlPiVcbiAgcm93d2lzZSgpICU+JVxuICBkcGx5cjo6bXV0YXRlKGRpc3RUb0FuY2hvcjEgPSAoc3RhcnQxICsgZW5kMSkvMiAtIFRTUyxcbiAgICAgICAgICAgICAgICBkaXN0VG9BbmNob3IyID0gKHN0YXJ0MiArIGVuZDIpLzIgLSBUU1MsXG4gICAgICAgICAgICAgICAgZGlzdFRvQW5jaG9yID0gaWZfZWxzZShhYnMoZGlzdFRvQW5jaG9yMSkgPiBhYnMoZGlzdFRvQW5jaG9yMiksIGRpc3RUb0FuY2hvcjEsIGRpc3RUb0FuY2hvcjIpLFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGlmX2Vsc2UoZGlzdFRvQW5jaG9yID4gMCwgXFxyaWdodFxcLCBcXGxlZnRcXCkpXG5cblxucmVzdWx0IDwtIGRhdGEgJT4lXG4gIGdyb3VwX2J5KGdlbmUsIGRpcmVjdGlvbikgJT4lXG4gIG11dGF0ZShkaXN0VG9BbmNob3IgPSBhYnMoZGlzdFRvQW5jaG9yKSkgJT4lXG4gIG11dGF0ZShtYXhfZGlzdF9QX1MgPSBpZmVsc2UoYW55KEFubm8yID09IFxcUC1TXFwpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoZGlzdFRvQW5jaG9yW0Fubm8yID09IFxcUC1TXFxdLCBuYS5ybSA9IFRSVUUpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpICU+JVxuICBtdXRhdGUoaXNfc21hbGxlciA9IGlmZWxzZShpcy5uYShtYXhfZGlzdF9QX1MpLCBOQSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaXN0VG9BbmNob3IgPT0gbWF4X2Rpc3RfUF9TLCBOQSwgZGlzdFRvQW5jaG9yIDwgbWF4X2Rpc3RfUF9TKSkpICU+JVxuICB1bmdyb3VwKClcblxuXG5cbnJlc3VsdDIgPC0gcmVzdWx0ICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShpc19zbWFsbGVyKSlcblxucmVzdWx0MyA8LSByZXN1bHQyICU+JSBncm91cF9ieShnZW5lLCBkaXJlY3Rpb24pICU+JVxuICBzdW1tYXJpemUoY291bnRfdHJ1ZSA9IHN1bShpc19zbWFsbGVyLCBuYS5ybSA9IFRSVUUpLFxuICAgICAgICAgICAgY291bnRfZmFsc2UgPSBzdW0oaXNfc21hbGxlciA9PSBGQUxTRSwgbmEucm0gPSBUUlVFKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoY291bnQgPSBjb3VudF90cnVlICsgY291bnRfZmFsc2UsXG4gICAgICAgICAgICAgICAgcGVyYyA9IGNvdW50X3RydWUvY291bnQqMTAwKSAlPiVcbiAgZHBseXI6OnNlbGVjdChnZW5lLCBkaXJlY3Rpb24sIHBlcmMpXG5cbnJlc3VsdDMgPC0gcmVzdWx0MyAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lIHN1bW1hcml6ZShwZXJjID0gbWVhbihwZXJjKSlcblxuIyMjIyMjIyBET2luZyB0aGlzIGZvciBQLVMgZ3JvdXBzXG5yZXN1bHREaXIgPC0gaGVyZShcXC4uLy4uL3Jlc3VsdFxcKVxudGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgXFxnZW5lX2xvb3BfbGluay5yZHNcXCkpXG5cbnBzT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSA0KSkkZ2VuZVxucHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDMsIG51bV9wcyA8IDQpKSRnZW5lXG5wc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMiwgbnVtX3BzIDwgMykpJGdlbmVcbnBzT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAxLCBudW1fcHMgPCAyKSkkZ2VuZVxucHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzIDwgMSkpJGdlbmVcblxuXG5yZXN1bHQ0IDwtIHJlc3VsdDMgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oZ2VuZSAlaW4lIHBzT3ZlcjAgfiBcXHBzT3ZlcjBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBzT3ZlcjEgfiBcXHBzT3ZlcjFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBzT3ZlcjIgfiBcXHBzT3ZlcjJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBzT3ZlcjMgfiBcXHBzT3ZlcjNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBzT3ZlcjQgfiBcXHBzT3ZlcjRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuXG5nZ3Bsb3QocmVzdWx0NCwgYWVzKHggPSAgZ3JvdXAsIHkgPSBwZXJjKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4wNSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKVxuXG4jIyMjIyMjIERPaW5nIHRoaXMgZm9yIFAtRSBncm91cHNcbnBlT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSA0KSkkZ2VuZVxucGVPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lXG5wZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmVcbnBlT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAxLCBudW1fcGUgPCAyKSkkZ2VuZVxucGVPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmVcblxuXG5yZXN1bHQ0IDwtIHJlc3VsdDMgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oZ2VuZSAlaW4lIHBlT3ZlcjAgfiBcXHBlT3ZlcjBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBlT3ZlcjEgfiBcXHBlT3ZlcjFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBlT3ZlcjIgfiBcXHBlT3ZlcjJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBlT3ZlcjMgfiBcXHBlT3ZlcjNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBlT3ZlcjQgfiBcXHBlT3ZlcjRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuXG5nZ3Bsb3QocmVzdWx0NCwgYWVzKHggPSAgZ3JvdXAsIHkgPSBwZXJjKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4wNSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKVxuXG4jIyMjIyMjIERPaW5nIHRoaXMgZm9yIFAtUCBncm91cHNcblxucHBPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDQpKSRnZW5lXG5wcE92ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMywgbnVtX3BwIDwgNCkpJGdlbmVcbnBwT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAyLCBudW1fcHAgPCAzKSkkZ2VuZVxucHBPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDEsIG51bV9wcCA8IDIpKSRnZW5lXG5wcE92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPCAxKSkkZ2VuZVxuXG5cbnJlc3VsdDQgPC0gcmVzdWx0MyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihnZW5lICVpbiUgcHBPdmVyMCB+IFxccHBPdmVyMFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHBPdmVyMSB+IFxccHBPdmVyMVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHBPdmVyMiB+IFxccHBPdmVyMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHBPdmVyMyB+IFxccHBPdmVyM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHBPdmVyNCB+IFxccHBPdmVyNFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbmdncGxvdChyZXN1bHQ0LCBhZXMoeCA9ICBncm91cCwgeSA9IHBlcmMpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjA1KSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
name <- \chromo_cons_annoHierarchy\
diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff)%>% 
  dplyr::mutate(distance = start2 - start1)

geneAnnoData <- geneAnnoData %>% unnest(gene)

gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, TSS)
colnames(gene.tb) <- c(\ensembl\, \TSS\)


geneAnnoData  <- geneAnnoData %>% dplyr::left_join(gene.tb, by = c(\gene\ = \ensembl\))

data <- geneAnnoData %>% dplyr::select(c(1, 2, 3, 4, 5, 6, 29, 31, 35)) %>%
  rowwise() %>%
  dplyr::mutate(distToAnchor1 = (start1 + end1)/2 - TSS,
                distToAnchor2 = (start2 + end2)/2 - TSS,
                distToAnchor = if_else(abs(distToAnchor1) > abs(distToAnchor2), distToAnchor1, distToAnchor2),
                direction = if_else(distToAnchor > 0, \right\, \left\))


result <- data %>%
  group_by(gene, direction) %>%
  mutate(distToAnchor = abs(distToAnchor)) %>%
  mutate(max_dist_P_S = ifelse(any(Anno2 == \P-S\), 
                               max(distToAnchor[Anno2 == \P-S\], na.rm = TRUE), 
                               NA)) %>%
  mutate(is_smaller = ifelse(is.na(max_dist_P_S), NA, 
                             ifelse(distToAnchor == max_dist_P_S, NA, distToAnchor < max_dist_P_S))) %>%
  ungroup()



result2 <- result %>% dplyr::filter(!is.na(is_smaller))

result3 <- result2 %>% group_by(gene, direction) %>%
  summarize(count_true = sum(is_smaller, na.rm = TRUE),
            count_false = sum(is_smaller == FALSE, na.rm = TRUE)) %>%
  dplyr::mutate(count = count_true + count_false,
                perc = count_true/count*100) %>%
  dplyr::select(gene, direction, perc)

result3 <- result3 %>% group_by(gene) %>% summarize(perc = mean(perc))

####### DOing this for P-S groups
resultDir <- here(\../../result\)
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene


result4 <- result3 %>% dplyr::mutate(group = case_when(gene %in% psOver0 ~ \psOver0\,
                                            gene %in% psOver1 ~ \psOver1\,
                                            gene %in% psOver2 ~ \psOver2\,
                                            gene %in% psOver3 ~ \psOver3\,
                                            gene %in% psOver4 ~ \psOver4\,
                                            TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(result4, aes(x =  group, y = perc)) + geom_violin() + geom_boxplot(width = 0.05) + theme_classic() +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)

####### DOing this for P-E groups
peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene


result4 <- result3 %>% dplyr::mutate(group = case_when(gene %in% peOver0 ~ \peOver0\,
                                            gene %in% peOver1 ~ \peOver1\,
                                            gene %in% peOver2 ~ \peOver2\,
                                            gene %in% peOver3 ~ \peOver3\,
                                            gene %in% peOver4 ~ \peOver4\,
                                            TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(result4, aes(x =  group, y = perc)) + geom_violin() + geom_boxplot(width = 0.05) + theme_classic() +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)

####### DOing this for P-P groups

ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene


result4 <- result3 %>% dplyr::mutate(group = case_when(gene %in% ppOver0 ~ \ppOver0\,
                                            gene %in% ppOver1 ~ \ppOver1\,
                                            gene %in% ppOver2 ~ \ppOver2\,
                                            gene %in% ppOver3 ~ \ppOver3\,
                                            gene %in% ppOver4 ~ \ppOver4\,
                                            TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(result4, aes(x =  group, y = perc)) + geom_violin() + geom_boxplot(width = 0.05) + theme_classic() +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVaR2xtWmtOMWRHOW1aaUE4TFNBd0xqSmNibWRsYm1WQmJtNXZSR0YwWVNBOExTQnNiMkZrVEc5dmNFRnVibTlFWVhSaEtHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZmNDMXVYMlZ1YzJWdFlteE1hWE4wTG5SemRseGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnBabVpEZFhSdlptWWdQU0JrYVdabVEzVjBiMlptS1NVK0pTQmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGthWE4wWVc1alpTQTlJSE4wWVhKME1pQXRJSE4wWVhKME1TbGNibHh1WjJWdVpVRnVibTlFWVhSaElEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdkVzV1WlhOMEtHZGxibVVwWEc1Y2JtZGxibVV1ZEdJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjYlcweE1GOUhVa050TXpndWNEWmZaMlZ1WlY5emIzSjBaV1F1WW1Wa1hGd3BLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoVVUxTWdQU0JwWm1Wc2MyVW9WalFnUFQwZ1hGd3JYRndzSUZZeUxDQldNeWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtGWTJMQ0JVVTFNcFhHNWpiMnh1WVcxbGN5aG5aVzVsTG5SaUtTQThMU0JqS0Z4Y1pXNXpaVzFpYkZ4Y0xDQmNYRlJUVTF4Y0tWeHVYRzVjYm1kbGJtVkJibTV2UkdGMFlTQWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZiR1ZtZEY5cWIybHVLR2RsYm1VdWRHSXNJR0o1SUQwZ1l5aGNYR2RsYm1WY1hDQTlJRnhjWlc1elpXMWliRnhjS1NsY2JseHVaR0YwWVNBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWXlneExDQXlMQ0F6TENBMExDQTFMQ0EyTENBeU9Td2dNekVzSURNMUtTa2dKVDRsWEc0Z0lISnZkM2RwYzJVb0tTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFZHOUJibU5vYjNJeElEMGdLSE4wWVhKME1TQXJJR1Z1WkRFcEx6SWdMU0JVVTFNc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHbHpkRlJ2UVc1amFHOXlNaUE5SUNoemRHRnlkRElnS3lCbGJtUXlLUzh5SUMwZ1ZGTlRMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwYzNSVWIwRnVZMmh2Y2lBOUlHbG1YMlZzYzJVb1lXSnpLR1JwYzNSVWIwRnVZMmh2Y2pFcElENGdZV0p6S0dScGMzUlViMEZ1WTJodmNqSXBMQ0JrYVhOMFZHOUJibU5vYjNJeExDQmthWE4wVkc5QmJtTm9iM0l5S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2FYSmxZM1JwYjI0Z1BTQnBabDlsYkhObEtHUnBjM1JVYjBGdVkyaHZjaUErSURBc0lGeGNjbWxuYUhSY1hDd2dYRnhzWldaMFhGd3BLVnh1WEc1Y2JuSmxjM1ZzZENBOExTQmtZWFJoSUNVK0pWeHVJQ0JuY205MWNGOWllU2huWlc1bExDQmthWEpsWTNScGIyNHBJQ1UrSlZ4dUlDQnRkWFJoZEdVb1pHbHpkRlJ2UVc1amFHOXlJRDBnWVdKektHUnBjM1JVYjBGdVkyaHZjaWtwSUNVK0pWeHVJQ0J0ZFhSaGRHVW9iV0Y0WDJScGMzUmZVRjlUSUQwZ2FXWmxiSE5sS0dGdWVTaEJibTV2TWlBOVBTQmNYRkF0VTF4Y0tTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXRjRLR1JwYzNSVWIwRnVZMmh2Y2x0QmJtNXZNaUE5UFNCY1hGQXRVMXhjWFN3Z2JtRXVjbTBnUFNCVVVsVkZLU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdUa0VwS1NBbFBpVmNiaUFnYlhWMFlYUmxLR2x6WDNOdFlXeHNaWElnUFNCcFptVnNjMlVvYVhNdWJtRW9iV0Y0WDJScGMzUmZVRjlUS1N3Z1RrRXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWkdsemRGUnZRVzVqYUc5eUlEMDlJRzFoZUY5a2FYTjBYMUJmVXl3Z1RrRXNJR1JwYzNSVWIwRnVZMmh2Y2lBOElHMWhlRjlrYVhOMFgxQmZVeWtwS1NBbFBpVmNiaUFnZFc1bmNtOTFjQ2dwWEc1Y2JseHVYRzV5WlhOMWJIUXlJRHd0SUhKbGMzVnNkQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWdoYVhNdWJtRW9hWE5mYzIxaGJHeGxjaWtwWEc1Y2JuSmxjM1ZzZERNZ1BDMGdjbVZ6ZFd4ME1pQWxQaVVnWjNKdmRYQmZZbmtvWjJWdVpTd2daR2x5WldOMGFXOXVLU0FsUGlWY2JpQWdjM1Z0YldGeWFYcGxLR052ZFc1MFgzUnlkV1VnUFNCemRXMG9hWE5mYzIxaGJHeGxjaXdnYm1FdWNtMGdQU0JVVWxWRktTeGNiaUFnSUNBZ0lDQWdJQ0FnSUdOdmRXNTBYMlpoYkhObElEMGdjM1Z0S0dselgzTnRZV3hzWlhJZ1BUMGdSa0ZNVTBVc0lHNWhMbkp0SUQwZ1ZGSlZSU2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHTnZkVzUwSUQwZ1kyOTFiblJmZEhKMVpTQXJJR052ZFc1MFgyWmhiSE5sTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCbGNtTWdQU0JqYjNWdWRGOTBjblZsTDJOdmRXNTBLakV3TUNrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9aMlZ1WlN3Z1pHbHlaV04wYVc5dUxDQndaWEpqS1Z4dVhHNXlaWE4xYkhReklEd3RJSEpsYzNWc2RETWdKVDRsSUdkeWIzVndYMko1S0dkbGJtVXBJQ1UrSlNCemRXMXRZWEpwZW1Vb2NHVnlZeUE5SUcxbFlXNG9jR1Z5WXlrcFhHNWNiaU1qSXlNakl5TWdSRTlwYm1jZ2RHaHBjeUJtYjNJZ1VDMVRJR2R5YjNWd2MxeHVjbVZ6ZFd4MFJHbHlJRHd0SUdobGNtVW9YRnd1TGk4dUxpOXlaWE4xYkhSY1hDbGNiblJsYlhBeUlEd3RJSEpsWVdSU1JGTW9hR1Z5WlNoeVpYTjFiSFJFYVhJc0lGeGNaMlZ1WlY5c2IyOXdYMnhwYm1zdWNtUnpYRndwS1Z4dVhHNXdjMDkyWlhJMElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hNZ1BqMGdOQ2twSkdkbGJtVmNibkJ6VDNabGNqTWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2N5QStQU0F6TENCdWRXMWZjSE1nUENBMEtTa2taMlZ1WlZ4dWNITlBkbVZ5TWlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J6SUQ0OUlESXNJRzUxYlY5d2N5QThJRE1wS1NSblpXNWxYRzV3YzA5MlpYSXhJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNITWdQajBnTVN3Z2JuVnRYM0J6SUR3Z01pa3BKR2RsYm1WY2JuQnpUM1psY2pBZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y3lBOElERXBLU1JuWlc1bFhHNWNibHh1Y21WemRXeDBOQ0E4TFNCeVpYTjFiSFF6SUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dkeWIzVndJRDBnWTJGelpWOTNhR1Z1S0dkbGJtVWdKV2x1SlNCd2MwOTJaWEl3SUg0Z1hGeHdjMDkyWlhJd1hGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSXhJSDRnWEZ4d2MwOTJaWEl4WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZGxibVVnSldsdUpTQndjMDkyWlhJeUlINGdYRnh3YzA5MlpYSXlYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkbGJtVWdKV2x1SlNCd2MwOTJaWEl6SUg0Z1hGeHdjMDkyWlhJelhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2RsYm1VZ0pXbHVKU0J3YzA5MlpYSTBJSDRnWEZ4d2MwOTJaWEkwWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlNWVVVnZmlCT1FTa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0NGcGN5NXVZU2huY205MWNDa3BYRzVjYmx4dVoyZHdiRzkwS0hKbGMzVnNkRFFzSUdGbGN5aDRJRDBnSUdkeWIzVndMQ0I1SUQwZ2NHVnlZeWtwSUNzZ1oyVnZiVjkyYVc5c2FXNG9LU0FySUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNRFVwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdjM1JoZEY5emRXMXRZWEo1S0dGbGN5aG5jbTkxY0NBOUlHZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpd2daMlZ2YlNBOUlGeGNjRzlwYm5SY1hDd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJRElzSUdacGJHd2dQU0JjWEhKbFpGeGNMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ2xjYmx4dUl5TWpJeU1qSXlCRVQybHVaeUIwYUdseklHWnZjaUJRTFVVZ1ozSnZkWEJ6WEc1d1pVOTJaWEkwSUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjR1VnUGowZ05Da3BKR2RsYm1WY2JuQmxUM1psY2pNZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3WlNBK1BTQXpMQ0J1ZFcxZmNHVWdQQ0EwS1Nra1oyVnVaVnh1Y0dWUGRtVnlNaUE4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQmxJRDQ5SURJc0lHNTFiVjl3WlNBOElETXBLU1JuWlc1bFhHNXdaVTkyWlhJeElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0dVZ1BqMGdNU3dnYm5WdFgzQmxJRHdnTWlrcEpHZGxibVZjYm5CbFQzWmxjakFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdaU0E4SURFcEtTUm5aVzVsWEc1Y2JseHVjbVZ6ZFd4ME5DQThMU0J5WlhOMWJIUXpJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdZMkZ6WlY5M2FHVnVLR2RsYm1VZ0pXbHVKU0J3WlU5MlpYSXdJSDRnWEZ4d1pVOTJaWEl3WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZGxibVVnSldsdUpTQndaVTkyWlhJeElINGdYRnh3WlU5MlpYSXhYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkbGJtVWdKV2x1SlNCd1pVOTJaWEl5SUg0Z1hGeHdaVTkyWlhJeVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2RsYm1VZ0pXbHVKU0J3WlU5MlpYSXpJSDRnWEZ4d1pVOTJaWEl6WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZGxibVVnSldsdUpTQndaVTkyWlhJMElINGdYRnh3WlU5MlpYSTBYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSU1ZVVWdmaUJPUVNrcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLQ0ZwY3k1dVlTaG5jbTkxY0NrcFhHNWNibHh1WjJkd2JHOTBLSEpsYzNWc2REUXNJR0ZsY3loNElEMGdJR2R5YjNWd0xDQjVJRDBnY0dWeVl5a3BJQ3NnWjJWdmJWOTJhVzlzYVc0b0tTQXJJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU1EVXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3RjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLR0ZsY3lobmNtOTFjQ0E5SUdkeWIzVndLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ4Y2NHOXBiblJjWEN3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNYSEpsWkZ4Y0xDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDbGNibHh1SXlNakl5TWpJeUJFVDJsdVp5QjBhR2x6SUdadmNpQlFMVkFnWjNKdmRYQnpYRzVjYm5Cd1QzWmxjalFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjQ0ErUFNBMEtTa2taMlZ1WlZ4dWNIQlBkbVZ5TXlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J3SUQ0OUlETXNJRzUxYlY5d2NDQThJRFFwS1NSblpXNWxYRzV3Y0U5MlpYSXlJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNIQWdQajBnTWl3Z2JuVnRYM0J3SUR3Z015a3BKR2RsYm1WY2JuQndUM1psY2pFZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y0NBK1BTQXhMQ0J1ZFcxZmNIQWdQQ0F5S1Nra1oyVnVaVnh1Y0hCUGRtVnlNQ0E4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQndJRHdnTVNrcEpHZGxibVZjYmx4dVhHNXlaWE4xYkhRMElEd3RJSEpsYzNWc2RETWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9aM0p2ZFhBZ1BTQmpZWE5sWDNkb1pXNG9aMlZ1WlNBbGFXNGxJSEJ3VDNabGNqQWdmaUJjWEhCd1QzWmxjakJjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1oyVnVaU0FsYVc0bElIQndUM1psY2pFZ2ZpQmNYSEJ3VDNabGNqRmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjJWdVpTQWxhVzRsSUhCd1QzWmxjaklnZmlCY1hIQndUM1psY2pKY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaMlZ1WlNBbGFXNGxJSEJ3VDNabGNqTWdmaUJjWEhCd1QzWmxjak5jWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1oyVnVaU0FsYVc0bElIQndUM1psY2pRZ2ZpQmNYSEJ3VDNabGNqUmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnVkZKVlJTQitJRTVCS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9JV2x6TG01aEtHZHliM1Z3S1NsY2JseHVYRzVuWjNCc2IzUW9jbVZ6ZFd4ME5Dd2dZV1Z6S0hnZ1BTQWdaM0p2ZFhBc0lIa2dQU0J3WlhKaktTa2dLeUJuWlc5dFgzWnBiMnhwYmlncElDc2daMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0d05Ta2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNCemRHRjBYM04xYlcxaGNua29ZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TENCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGeGNjbVZrWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0tWeHVYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgdW5uZXN0KGdlbmUpXG5cbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMykpICU+JVxuICBkcGx5cjo6c2VsZWN0KFY2LCBUU1MpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcZW5zZW1ibFxcLCBcXFRTU1xcKVxuXG5cbmdlbmVBbm5vRGF0YSAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKGdlbmUudGIsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibFxcKSlcblxuZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2LCAyOSwgMzEsIDM1KSkgJT4lXG4gIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShkaXN0VG9BbmNob3IxID0gKHN0YXJ0MSArIGVuZDEpLzIgLSBUU1MsXG4gICAgICAgICAgICAgICAgZGlzdFRvQW5jaG9yMiA9IChzdGFydDIgKyBlbmQyKS8yIC0gVFNTLFxuICAgICAgICAgICAgICAgIGRpc3RUb0FuY2hvciA9IGlmX2Vsc2UoYWJzKGRpc3RUb0FuY2hvcjEpID4gYWJzKGRpc3RUb0FuY2hvcjIpLCBkaXN0VG9BbmNob3IxLCBkaXN0VG9BbmNob3IyKSxcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBpZl9lbHNlKGRpc3RUb0FuY2hvciA+IDAsIFxccmlnaHRcXCwgXFxsZWZ0XFwpKVxuXG5cbnJlc3VsdCA8LSBkYXRhICU+JVxuICBncm91cF9ieShnZW5lLCBkaXJlY3Rpb24pICU+JVxuICBtdXRhdGUoZGlzdFRvQW5jaG9yID0gYWJzKGRpc3RUb0FuY2hvcikpICU+JVxuICBtdXRhdGUobWF4X2Rpc3RfUF9TID0gaWZlbHNlKGFueShBbm5vMiA9PSBcXFAtU1xcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KGRpc3RUb0FuY2hvcltBbm5vMiA9PSBcXFAtU1xcXSwgbmEucm0gPSBUUlVFKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSAlPiVcbiAgbXV0YXRlKGlzX3NtYWxsZXIgPSBpZmVsc2UoaXMubmEobWF4X2Rpc3RfUF9TKSwgTkEsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlzdFRvQW5jaG9yID09IG1heF9kaXN0X1BfUywgTkEsIGRpc3RUb0FuY2hvciA8IG1heF9kaXN0X1BfUykpKSAlPiVcbiAgdW5ncm91cCgpXG5cblxuXG5yZXN1bHQyIDwtIHJlc3VsdCAlPiUgZHBseXI6OmZpbHRlcighaXMubmEoaXNfc21hbGxlcikpXG5cbnJlc3VsdDMgPC0gcmVzdWx0MiAlPiUgZ3JvdXBfYnkoZ2VuZSwgZGlyZWN0aW9uKSAlPiVcbiAgc3VtbWFyaXplKGNvdW50X3RydWUgPSBzdW0oaXNfc21hbGxlciwgbmEucm0gPSBUUlVFKSxcbiAgICAgICAgICAgIGNvdW50X2ZhbHNlID0gc3VtKGlzX3NtYWxsZXIgPT0gRkFMU0UsIG5hLnJtID0gVFJVRSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGNvdW50ID0gY291bnRfdHJ1ZSArIGNvdW50X2ZhbHNlLFxuICAgICAgICAgICAgICAgIHBlcmMgPSBjb3VudF90cnVlL2NvdW50KjEwMCkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZ2VuZSwgZGlyZWN0aW9uLCBwZXJjKVxuXG5yZXN1bHQzIDwtIHJlc3VsdDMgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSBzdW1tYXJpemUocGVyYyA9IG1lYW4ocGVyYykpXG5cbiMjIyMjIyMgRE9pbmcgdGhpcyBmb3IgUC1TIGdyb3Vwc1xucmVzdWx0RGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHRcXClcbnRlbXAyIDwtIHJlYWRSRFMoaGVyZShyZXN1bHREaXIsIFxcZ2VuZV9sb29wX2xpbmsucmRzXFwpKVxuXG5wc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gNCkpJGdlbmVcbnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZVxucHNPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDIsIG51bV9wcyA8IDMpKSRnZW5lXG5wc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMSwgbnVtX3BzIDwgMikpJGdlbmVcbnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lXG5cblxucmVzdWx0NCA8LSByZXN1bHQzICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGdlbmUgJWluJSBwc092ZXIwIH4gXFxwc092ZXIwXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIxIH4gXFxwc092ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIyIH4gXFxwc092ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIzIH4gXFxwc092ZXIzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXI0IH4gXFxwc092ZXI0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cblxuZ2dwbG90KHJlc3VsdDQsIGFlcyh4ID0gIGdyb3VwLCB5ID0gcGVyYykpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMDUpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIyMjIyBET2luZyB0aGlzIGZvciBQLUUgZ3JvdXBzXG5wZU92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gNCkpJGdlbmVcbnBlT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAzLCBudW1fcGUgPCA0KSkkZ2VuZVxucGVPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDIsIG51bV9wZSA8IDMpKSRnZW5lXG5wZU92ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMSwgbnVtX3BlIDwgMikpJGdlbmVcbnBlT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA8IDEpKSRnZW5lXG5cblxucmVzdWx0NCA8LSByZXN1bHQzICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGdlbmUgJWluJSBwZU92ZXIwIH4gXFxwZU92ZXIwXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIxIH4gXFxwZU92ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIyIH4gXFxwZU92ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIzIH4gXFxwZU92ZXIzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXI0IH4gXFxwZU92ZXI0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cblxuZ2dwbG90KHJlc3VsdDQsIGFlcyh4ID0gIGdyb3VwLCB5ID0gcGVyYykpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMDUpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIyMjIyBET2luZyB0aGlzIGZvciBQLVAgZ3JvdXBzXG5cbnBwT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSA0KSkkZ2VuZVxucHBPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lXG5wcE92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmVcbnBwT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAxLCBudW1fcHAgPCAyKSkkZ2VuZVxucHBPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmVcblxuXG5yZXN1bHQ0IDwtIHJlc3VsdDMgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oZ2VuZSAlaW4lIHBwT3ZlcjAgfiBcXHBwT3ZlcjBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjEgfiBcXHBwT3ZlcjFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjIgfiBcXHBwT3ZlcjJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjMgfiBcXHBwT3ZlcjNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjQgfiBcXHBwT3ZlcjRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuXG5nZ3Bsb3QocmVzdWx0NCwgYWVzKHggPSAgZ3JvdXAsIHkgPSBwZXJjKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4wNSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKVxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgdW5uZXN0KGdlbmUpXG5cbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMykpICU+JVxuICBkcGx5cjo6c2VsZWN0KFY2LCBUU1MpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcZW5zZW1ibFxcLCBcXFRTU1xcKVxuXG5cbmdlbmVBbm5vRGF0YSAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKGdlbmUudGIsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibFxcKSlcblxuZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2LCAyOSwgMzEsIDM1KSkgJT4lXG4gIHJvd3dpc2UoKSAlPiVcbiAgZHBseXI6Om11dGF0ZShkaXN0VG9BbmNob3IxID0gKHN0YXJ0MSArIGVuZDEpLzIgLSBUU1MsXG4gICAgICAgICAgICAgICAgZGlzdFRvQW5jaG9yMiA9IChzdGFydDIgKyBlbmQyKS8yIC0gVFNTLFxuICAgICAgICAgICAgICAgIGRpc3RUb0FuY2hvciA9IGlmX2Vsc2UoYWJzKGRpc3RUb0FuY2hvcjEpID4gYWJzKGRpc3RUb0FuY2hvcjIpLCBkaXN0VG9BbmNob3IxLCBkaXN0VG9BbmNob3IyKSxcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBpZl9lbHNlKGRpc3RUb0FuY2hvciA+IDAsIFxccmlnaHRcXCwgXFxsZWZ0XFwpKVxuXG5cbnJlc3VsdCA8LSBkYXRhICU+JVxuICBncm91cF9ieShnZW5lLCBkaXJlY3Rpb24pICU+JVxuICBtdXRhdGUoZGlzdFRvQW5jaG9yID0gYWJzKGRpc3RUb0FuY2hvcikpICU+JVxuICBtdXRhdGUobWF4X2Rpc3RfUF9TID0gaWZlbHNlKGFueShBbm5vMiA9PSBcXFAtU1xcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KGRpc3RUb0FuY2hvcltBbm5vMiA9PSBcXFAtU1xcXSwgbmEucm0gPSBUUlVFKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSAlPiVcbiAgbXV0YXRlKGlzX3NtYWxsZXIgPSBpZmVsc2UoaXMubmEobWF4X2Rpc3RfUF9TKSwgTkEsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlzdFRvQW5jaG9yID09IG1heF9kaXN0X1BfUywgTkEsIGRpc3RUb0FuY2hvciA8IG1heF9kaXN0X1BfUykpKSAlPiVcbiAgdW5ncm91cCgpXG5cblxuXG5yZXN1bHQyIDwtIHJlc3VsdCAlPiUgZHBseXI6OmZpbHRlcighaXMubmEoaXNfc21hbGxlcikpXG5cbnJlc3VsdDMgPC0gcmVzdWx0MiAlPiUgZ3JvdXBfYnkoZ2VuZSwgZGlyZWN0aW9uKSAlPiVcbiAgc3VtbWFyaXplKGNvdW50X3RydWUgPSBzdW0oaXNfc21hbGxlciwgbmEucm0gPSBUUlVFKSxcbiAgICAgICAgICAgIGNvdW50X2ZhbHNlID0gc3VtKGlzX3NtYWxsZXIgPT0gRkFMU0UsIG5hLnJtID0gVFJVRSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGNvdW50ID0gY291bnRfdHJ1ZSArIGNvdW50X2ZhbHNlLFxuICAgICAgICAgICAgICAgIHBlcmMgPSBjb3VudF90cnVlL2NvdW50KjEwMCkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZ2VuZSwgZGlyZWN0aW9uLCBwZXJjKVxuXG5yZXN1bHQzIDwtIHJlc3VsdDMgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSBzdW1tYXJpemUocGVyYyA9IG1lYW4ocGVyYykpXG5cbiMjIyMjIyMgRE9pbmcgdGhpcyBmb3IgUC1TIGdyb3Vwc1xucmVzdWx0RGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHRcXClcbnRlbXAyIDwtIHJlYWRSRFMoaGVyZShyZXN1bHREaXIsIFxcZ2VuZV9sb29wX2xpbmsucmRzXFwpKVxuXG5wc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gNCkpJGdlbmVcbnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZVxucHNPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDIsIG51bV9wcyA8IDMpKSRnZW5lXG5wc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMSwgbnVtX3BzIDwgMikpJGdlbmVcbnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lXG5cblxucmVzdWx0NCA8LSByZXN1bHQzICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGdlbmUgJWluJSBwc092ZXIwIH4gXFxwc092ZXIwXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIxIH4gXFxwc092ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIyIH4gXFxwc092ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIzIH4gXFxwc092ZXIzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXI0IH4gXFxwc092ZXI0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cblxuZ2dwbG90KHJlc3VsdDQsIGFlcyh4ID0gIGdyb3VwLCB5ID0gcGVyYykpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMDUpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIyMjIyBET2luZyB0aGlzIGZvciBQLUUgZ3JvdXBzXG5wZU92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gNCkpJGdlbmVcbnBlT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAzLCBudW1fcGUgPCA0KSkkZ2VuZVxucGVPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDIsIG51bV9wZSA8IDMpKSRnZW5lXG5wZU92ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMSwgbnVtX3BlIDwgMikpJGdlbmVcbnBlT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA8IDEpKSRnZW5lXG5cblxucmVzdWx0NCA8LSByZXN1bHQzICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGdlbmUgJWluJSBwZU92ZXIwIH4gXFxwZU92ZXIwXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIxIH4gXFxwZU92ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIyIH4gXFxwZU92ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIzIH4gXFxwZU92ZXIzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXI0IH4gXFxwZU92ZXI0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cblxuZ2dwbG90KHJlc3VsdDQsIGFlcyh4ID0gIGdyb3VwLCB5ID0gcGVyYykpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMDUpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIyMjIyBET2luZyB0aGlzIGZvciBQLVAgZ3JvdXBzXG5cbnBwT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSA0KSkkZ2VuZVxucHBPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lXG5wcE92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmVcbnBwT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAxLCBudW1fcHAgPCAyKSkkZ2VuZVxucHBPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmVcblxuXG5yZXN1bHQ0IDwtIHJlc3VsdDMgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oZ2VuZSAlaW4lIHBwT3ZlcjAgfiBcXHBwT3ZlcjBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjEgfiBcXHBwT3ZlcjFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjIgfiBcXHBwT3ZlcjJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjMgfiBcXHBwT3ZlcjNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjQgfiBcXHBwT3ZlcjRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuXG5nZ3Bsb3QocmVzdWx0NCwgYWVzKHggPSAgZ3JvdXAsIHkgPSBwZXJjKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4wNSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKVxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
name <- \chromo_cons_annoHierarchy\
diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff)%>% 
  dplyr::mutate(distance = start2 - start1)

geneAnnoData <- geneAnnoData %>% unnest(gene)

gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, TSS)
colnames(gene.tb) <- c(\ensembl\, \TSS\)


geneAnnoData  <- geneAnnoData %>% dplyr::left_join(gene.tb, by = c(\gene\ = \ensembl\))

data <- geneAnnoData %>% dplyr::select(c(1, 2, 3, 4, 5, 6, 29, 31, 35)) %>%
  rowwise() %>%
  dplyr::mutate(distToAnchor1 = (start1 + end1)/2 - TSS,
                distToAnchor2 = (start2 + end2)/2 - TSS,
                distToAnchor = if_else(abs(distToAnchor1) > abs(distToAnchor2), distToAnchor1, distToAnchor2),
                direction = if_else(distToAnchor > 0, \right\, \left\))


result <- data %>%
  group_by(gene, direction) %>%
  mutate(distToAnchor = abs(distToAnchor)) %>%
  mutate(max_dist_P_S = ifelse(any(Anno2 == \P-S\), 
                               max(distToAnchor[Anno2 == \P-S\], na.rm = TRUE), 
                               NA)) %>%
  mutate(is_smaller = ifelse(is.na(max_dist_P_S), NA, 
                             ifelse(distToAnchor == max_dist_P_S, NA, distToAnchor < max_dist_P_S))) %>%
  ungroup()



result2 <- result %>% dplyr::filter(!is.na(is_smaller))

result3 <- result2 %>% group_by(gene, direction) %>%
  summarize(count_true = sum(is_smaller, na.rm = TRUE),
            count_false = sum(is_smaller == FALSE, na.rm = TRUE)) %>%
  dplyr::mutate(count = count_true + count_false,
                perc = count_true/count*100) %>%
  dplyr::select(gene, direction, perc)

result3 <- result3 %>% group_by(gene) %>% summarize(perc = mean(perc))

####### DOing this for P-S groups
resultDir <- here(\../../result\)
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene


result4 <- result3 %>% dplyr::mutate(group = case_when(gene %in% psOver0 ~ \psOver0\,
                                            gene %in% psOver1 ~ \psOver1\,
                                            gene %in% psOver2 ~ \psOver2\,
                                            gene %in% psOver3 ~ \psOver3\,
                                            gene %in% psOver4 ~ \psOver4\,
                                            TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(result4, aes(x =  group, y = perc)) + geom_violin() + geom_boxplot(width = 0.05) + theme_classic() +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)

####### DOing this for P-E groups
peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene


result4 <- result3 %>% dplyr::mutate(group = case_when(gene %in% peOver0 ~ \peOver0\,
                                            gene %in% peOver1 ~ \peOver1\,
                                            gene %in% peOver2 ~ \peOver2\,
                                            gene %in% peOver3 ~ \peOver3\,
                                            gene %in% peOver4 ~ \peOver4\,
                                            TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(result4, aes(x =  group, y = perc)) + geom_violin() + geom_boxplot(width = 0.05) + theme_classic() +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)

####### DOing this for P-P groups

ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene


result4 <- result3 %>% dplyr::mutate(group = case_when(gene %in% ppOver0 ~ \ppOver0\,
                                            gene %in% ppOver1 ~ \ppOver1\,
                                            gene %in% ppOver2 ~ \ppOver2\,
                                            gene %in% ppOver3 ~ \ppOver3\,
                                            gene %in% ppOver4 ~ \ppOver4\,
                                            TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(result4, aes(x =  group, y = perc)) + geom_violin() + geom_boxplot(width = 0.05) + theme_classic() +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [2.32] Checking directionality

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzV5WlhOMWJIUWdQQzBnWkdGMFlTQWxQaVZjYmlBZ1ozSnZkWEJmWW5rb1oyVnVaU3dnWkdseVpXTjBhVzl1S1NBbFBpVmNiaUFnYlhWMFlYUmxLR1JwYzNSVWIwRnVZMmh2Y2lBOUlHRmljeWhrYVhOMFZHOUJibU5vYjNJcEtTQWxQaVZjYmlBZ2JYVjBZWFJsS0cxaGVGOWthWE4wWDFCZlV5QTlJR2xtWld4elpTaGhibmtvUVc1dWJ6SWdQVDBnWENKUUxWTmNJaWtzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzFoZUNoa2FYTjBWRzlCYm1Ob2IzSmJRVzV1YnpJZ1BUMGdYQ0pRTFZOY0lsMHNJRzVoTG5KdElEMGdWRkpWUlNrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUU1QktTbGNibkpsYzNWc2RDQThMU0J5WlhOMWJIUWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9RVzV1YnpJZ0lUMGdYQ0pRTFZOY0lpa2dKVDRsWEc0Z0lHMTFkR0YwWlNocGMxOXpiV0ZzYkdWeUlEMGdhV1psYkhObEtHbHpMbTVoS0cxaGVGOWthWE4wWDFCZlV5a3NJRTVCTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHUnBjM1JVYjBGdVkyaHZjaUE5UFNCdFlYaGZaR2x6ZEY5UVgxTXNJRTVCTENCa2FYTjBWRzlCYm1Ob2IzSWdQQ0J0WVhoZlpHbHpkRjlRWDFNcEtTa2dKVDRsWEc0Z0lIVnVaM0p2ZFhBb0tWeHVYRzVjYmx4dWNtVnpkV3gwTWlBOExTQnlaWE4xYkhRZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb0lXbHpMbTVoS0dselgzTnRZV3hzWlhJcEtWeHVYRzV5WlhOMWJIUXpJRHd0SUhKbGMzVnNkRElnSlQ0bElHZHliM1Z3WDJKNUtHZGxibVVzSUdScGNtVmpkR2x2YmlrZ0pUNGxYRzRnSUhOMWJXMWhjbWw2WlNoamIzVnVkRjkwY25WbElEMGdjM1Z0S0dselgzTnRZV3hzWlhJc0lHNWhMbkp0SUQwZ1ZGSlZSU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQmpiM1Z1ZEY5bVlXeHpaU0E5SUhOMWJTaHBjMTl6YldGc2JHVnlJRDA5SUVaQlRGTkZMQ0J1WVM1eWJTQTlJRlJTVlVVcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hqYjNWdWRDQTlJR052ZFc1MFgzUnlkV1VnS3lCamIzVnVkRjltWVd4elpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndaWEpqSUQwZ1kyOTFiblJmZEhKMVpTOWpiM1Z1ZENveE1EQXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dkbGJtVXNJR1JwY21WamRHbHZiaXdnY0dWeVl5bGNibHh1Y21WemRXeDBNeUE4TFNCeVpYTjFiSFF6SUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVWdjM1Z0YldGeWFYcGxLSEJsY21NZ1BTQnRaV0Z1S0hCbGNtTXBLVnh1WEc0akl5TWpJeU1qSUVSUGFXNW5JSFJvYVhNZ1ptOXlJRkF0VXlCbmNtOTFjSE5jYm5KbGMzVnNkRVJwY2lBOExTQm9aWEpsS0Z3aUxpNHZMaTR2Y21WemRXeDBYQ0lwWEc1MFpXMXdNaUE4TFNCeVpXRmtVa1JUS0dobGNtVW9jbVZ6ZFd4MFJHbHlMQ0JjSW1kbGJtVmZiRzl2Y0Y5c2FXNXJMbkprYzF3aUtTbGNibHh1Y0hOUGRtVnlOQ0E4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQnpJRDQ5SURRcEtTUm5aVzVsWEc1d2MwOTJaWEl6SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSE1nUGowZ015d2diblZ0WDNCeklEd2dOQ2twSkdkbGJtVmNibkJ6VDNabGNqSWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2N5QStQU0F5TENCdWRXMWZjSE1nUENBektTa2taMlZ1WlZ4dWNITlBkbVZ5TVNBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J6SUQ0OUlERXNJRzUxYlY5d2N5QThJRElwS1NSblpXNWxYRzV3YzA5MlpYSXdJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNITWdQQ0F4S1Nra1oyVnVaVnh1WEc1Y2JuSmxjM1ZzZERRZ1BDMGdjbVZ6ZFd4ME15QWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlHTmhjMlZmZDJobGJpaG5aVzVsSUNWcGJpVWdjSE5QZG1WeU1DQitJRndpY0hOUGRtVnlNRndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCblpXNWxJQ1ZwYmlVZ2NITlBkbVZ5TVNCK0lGd2ljSE5QZG1WeU1Wd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuWlc1bElDVnBiaVVnY0hOUGRtVnlNaUIrSUZ3aWNITlBkbVZ5TWx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5aVzVsSUNWcGJpVWdjSE5QZG1WeU15QitJRndpY0hOUGRtVnlNMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCblpXNWxJQ1ZwYmlVZ2NITlBkbVZ5TkNCK0lGd2ljSE5QZG1WeU5Gd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JVVWxWRklINGdUa0VwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpZ2hhWE11Ym1Fb1ozSnZkWEFwS1Z4dVhHNWNibWRuY0d4dmRDaHlaWE4xYkhRMExDQmhaWE1vZUNBOUlDQm5jbTkxY0N3Z2VTQTlJSEJsY21NcEtTQXJJR2RsYjIxZmRtbHZiR2x1S0NrZ0t5Qm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpBMUtTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0JuY205MWNDa3NJR1oxYmlBOUlHMWxZVzRzSUdkbGIyMGdQU0JjSW5CdmFXNTBYQ0lzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBeUxDQm1hV3hzSUQwZ1hDSnlaV1JjSWl3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJcFhHNWNiaU1qSXlNakl5TWdSRTlwYm1jZ2RHaHBjeUJtYjNJZ1VDMUZJR2R5YjNWd2MxeHVjR1ZQZG1WeU5DQThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCbElENDlJRFFwS1NSblpXNWxYRzV3WlU5MlpYSXpJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNHVWdQajBnTXl3Z2JuVnRYM0JsSUR3Z05Da3BKR2RsYm1WY2JuQmxUM1psY2pJZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3WlNBK1BTQXlMQ0J1ZFcxZmNHVWdQQ0F6S1Nra1oyVnVaVnh1Y0dWUGRtVnlNU0E4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQmxJRDQ5SURFc0lHNTFiVjl3WlNBOElESXBLU1JuWlc1bFhHNXdaVTkyWlhJd0lEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0dVZ1BDQXhLU2trWjJWdVpWeHVYRzVjYm5KbGMzVnNkRFFnUEMwZ2NtVnpkV3gwTXlBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUdOaGMyVmZkMmhsYmloblpXNWxJQ1ZwYmlVZ2NHVlBkbVZ5TUNCK0lGd2ljR1ZQZG1WeU1Gd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuWlc1bElDVnBiaVVnY0dWUGRtVnlNU0IrSUZ3aWNHVlBkbVZ5TVZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5aVzVsSUNWcGJpVWdjR1ZQZG1WeU1pQitJRndpY0dWUGRtVnlNbHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCblpXNWxJQ1ZwYmlVZ2NHVlBkbVZ5TXlCK0lGd2ljR1ZQZG1WeU0xd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuWlc1bElDVnBiaVVnY0dWUGRtVnlOQ0IrSUZ3aWNHVlBkbVZ5TkZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVbFZGSUg0Z1RrRXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lnaGFYTXVibUVvWjNKdmRYQXBLVnh1WEc1Y2JtZG5jR3h2ZENoeVpYTjFiSFEwTENCaFpYTW9lQ0E5SUNCbmNtOTFjQ3dnZVNBOUlIQmxjbU1wS1NBcklHZGxiMjFmZG1sdmJHbHVLQ2tnS3lCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMakExS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNJbkJ2YVc1MFhDSXNJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWENKeVpXUmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwWEc1Y2JpTWpJeU1qSXlNZ1JFOXBibWNnZEdocGN5Qm1iM0lnVUMxUUlHZHliM1Z3YzF4dVhHNXdjRTkyWlhJMElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hBZ1BqMGdOQ2twSkdkbGJtVmNibkJ3VDNabGNqTWdQQzBnS0hSbGJYQXlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzUxYlY5d2NDQStQU0F6TENCdWRXMWZjSEFnUENBMEtTa2taMlZ1WlZ4dWNIQlBkbVZ5TWlBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0J3SUQ0OUlESXNJRzUxYlY5d2NDQThJRE1wS1NSblpXNWxYRzV3Y0U5MlpYSXhJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNIQWdQajBnTVN3Z2JuVnRYM0J3SUR3Z01pa3BKR2RsYm1WY2JuQndUM1psY2pBZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y0NBOElERXBLU1JuWlc1bFhHNWNibHh1Y21WemRXeDBOQ0E4TFNCeVpYTjFiSFF6SUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dkeWIzVndJRDBnWTJGelpWOTNhR1Z1S0dkbGJtVWdKV2x1SlNCd2NFOTJaWEl3SUg0Z1hDSndjRTkyWlhJd1hDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2RsYm1VZ0pXbHVKU0J3Y0U5MlpYSXhJSDRnWENKd2NFOTJaWEl4WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZGxibVVnSldsdUpTQndjRTkyWlhJeUlINGdYQ0p3Y0U5MlpYSXlYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkbGJtVWdKV2x1SlNCd2NFOTJaWEl6SUg0Z1hDSndjRTkyWlhJelhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2RsYm1VZ0pXbHVKU0J3Y0U5MlpYSTBJSDRnWENKd2NFOTJaWEkwWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlNWVVVnZmlCT1FTa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNlptbHNkR1Z5S0NGcGN5NXVZU2huY205MWNDa3BYRzVjYmx4dVoyZHdiRzkwS0hKbGMzVnNkRFFzSUdGbGN5aDRJRDBnSUdkeWIzVndMQ0I1SUQwZ2NHVnlZeWtwSUNzZ1oyVnZiVjkyYVc5c2FXNG9LU0FySUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNRFVwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUN0Y2JpQWdjM1JoZEY5emRXMXRZWEo1S0dGbGN5aG5jbTkxY0NBOUlHZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpd2daMlZ2YlNBOUlGd2ljRzlwYm5SY0lpd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJRElzSUdacGJHd2dQU0JjSW5KbFpGd2lMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaWxjYmx4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5cbnJlc3VsdCA8LSBkYXRhICU+JVxuICBncm91cF9ieShnZW5lLCBkaXJlY3Rpb24pICU+JVxuICBtdXRhdGUoZGlzdFRvQW5jaG9yID0gYWJzKGRpc3RUb0FuY2hvcikpICU+JVxuICBtdXRhdGUobWF4X2Rpc3RfUF9TID0gaWZlbHNlKGFueShBbm5vMiA9PSBcXFAtU1xcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KGRpc3RUb0FuY2hvcltBbm5vMiA9PSBcXFAtU1xcXSwgbmEucm0gPSBUUlVFKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKVxucmVzdWx0IDwtIHJlc3VsdCAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAhPSBcXFAtU1xcKSAlPiVcbiAgbXV0YXRlKGlzX3NtYWxsZXIgPSBpZmVsc2UoaXMubmEobWF4X2Rpc3RfUF9TKSwgTkEsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlzdFRvQW5jaG9yID09IG1heF9kaXN0X1BfUywgTkEsIGRpc3RUb0FuY2hvciA8IG1heF9kaXN0X1BfUykpKSAlPiVcbiAgdW5ncm91cCgpXG5cblxuXG5yZXN1bHQyIDwtIHJlc3VsdCAlPiUgZHBseXI6OmZpbHRlcighaXMubmEoaXNfc21hbGxlcikpXG5cbnJlc3VsdDMgPC0gcmVzdWx0MiAlPiUgZ3JvdXBfYnkoZ2VuZSwgZGlyZWN0aW9uKSAlPiVcbiAgc3VtbWFyaXplKGNvdW50X3RydWUgPSBzdW0oaXNfc21hbGxlciwgbmEucm0gPSBUUlVFKSxcbiAgICAgICAgICAgIGNvdW50X2ZhbHNlID0gc3VtKGlzX3NtYWxsZXIgPT0gRkFMU0UsIG5hLnJtID0gVFJVRSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGNvdW50ID0gY291bnRfdHJ1ZSArIGNvdW50X2ZhbHNlLFxuICAgICAgICAgICAgICAgIHBlcmMgPSBjb3VudF90cnVlL2NvdW50KjEwMCkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZ2VuZSwgZGlyZWN0aW9uLCBwZXJjKVxuXG5yZXN1bHQzIDwtIHJlc3VsdDMgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSBzdW1tYXJpemUocGVyYyA9IG1lYW4ocGVyYykpXG5cbiMjIyMjIyMgRE9pbmcgdGhpcyBmb3IgUC1TIGdyb3Vwc1xucmVzdWx0RGlyIDwtIGhlcmUoXFwuLi8uLi9yZXN1bHRcXClcbnRlbXAyIDwtIHJlYWRSRFMoaGVyZShyZXN1bHREaXIsIFxcZ2VuZV9sb29wX2xpbmsucmRzXFwpKVxuXG5wc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gNCkpJGdlbmVcbnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZVxucHNPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDIsIG51bV9wcyA8IDMpKSRnZW5lXG5wc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMSwgbnVtX3BzIDwgMikpJGdlbmVcbnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lXG5cblxucmVzdWx0NCA8LSByZXN1bHQzICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGdlbmUgJWluJSBwc092ZXIwIH4gXFxwc092ZXIwXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIxIH4gXFxwc092ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIyIH4gXFxwc092ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIzIH4gXFxwc092ZXIzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXI0IH4gXFxwc092ZXI0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cblxuZ2dwbG90KHJlc3VsdDQsIGFlcyh4ID0gIGdyb3VwLCB5ID0gcGVyYykpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMDUpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIyMjIyBET2luZyB0aGlzIGZvciBQLUUgZ3JvdXBzXG5wZU92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gNCkpJGdlbmVcbnBlT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAzLCBudW1fcGUgPCA0KSkkZ2VuZVxucGVPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDIsIG51bV9wZSA8IDMpKSRnZW5lXG5wZU92ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMSwgbnVtX3BlIDwgMikpJGdlbmVcbnBlT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA8IDEpKSRnZW5lXG5cblxucmVzdWx0NCA8LSByZXN1bHQzICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGdlbmUgJWluJSBwZU92ZXIwIH4gXFxwZU92ZXIwXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIxIH4gXFxwZU92ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIyIH4gXFxwZU92ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIzIH4gXFxwZU92ZXIzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXI0IH4gXFxwZU92ZXI0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cblxuZ2dwbG90KHJlc3VsdDQsIGFlcyh4ID0gIGdyb3VwLCB5ID0gcGVyYykpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMDUpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIyMjIyBET2luZyB0aGlzIGZvciBQLVAgZ3JvdXBzXG5cbnBwT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSA0KSkkZ2VuZVxucHBPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lXG5wcE92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmVcbnBwT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAxLCBudW1fcHAgPCAyKSkkZ2VuZVxucHBPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmVcblxuXG5yZXN1bHQ0IDwtIHJlc3VsdDMgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oZ2VuZSAlaW4lIHBwT3ZlcjAgfiBcXHBwT3ZlcjBcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjEgfiBcXHBwT3ZlcjFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjIgfiBcXHBwT3ZlcjJcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjMgfiBcXHBwT3ZlcjNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjQgfiBcXHBwT3ZlcjRcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuXG5nZ3Bsb3QocmVzdWx0NCwgYWVzKHggPSAgZ3JvdXAsIHkgPSBwZXJjKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4wNSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->

result <- data %>%
  group_by(gene, direction) %>%
  mutate(distToAnchor = abs(distToAnchor)) %>%
  mutate(max_dist_P_S = ifelse(any(Anno2 == \P-S\), 
                               max(distToAnchor[Anno2 == \P-S\], na.rm = TRUE), 
                               NA))
result <- result %>% dplyr::filter(Anno2 != \P-S\) %>%
  mutate(is_smaller = ifelse(is.na(max_dist_P_S), NA, 
                             ifelse(distToAnchor == max_dist_P_S, NA, distToAnchor < max_dist_P_S))) %>%
  ungroup()



result2 <- result %>% dplyr::filter(!is.na(is_smaller))

result3 <- result2 %>% group_by(gene, direction) %>%
  summarize(count_true = sum(is_smaller, na.rm = TRUE),
            count_false = sum(is_smaller == FALSE, na.rm = TRUE)) %>%
  dplyr::mutate(count = count_true + count_false,
                perc = count_true/count*100) %>%
  dplyr::select(gene, direction, perc)

result3 <- result3 %>% group_by(gene) %>% summarize(perc = mean(perc))

####### DOing this for P-S groups
resultDir <- here(\../../result\)
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene


result4 <- result3 %>% dplyr::mutate(group = case_when(gene %in% psOver0 ~ \psOver0\,
                                            gene %in% psOver1 ~ \psOver1\,
                                            gene %in% psOver2 ~ \psOver2\,
                                            gene %in% psOver3 ~ \psOver3\,
                                            gene %in% psOver4 ~ \psOver4\,
                                            TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(result4, aes(x =  group, y = perc)) + geom_violin() + geom_boxplot(width = 0.05) + theme_classic() +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)

####### DOing this for P-E groups
peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene


result4 <- result3 %>% dplyr::mutate(group = case_when(gene %in% peOver0 ~ \peOver0\,
                                            gene %in% peOver1 ~ \peOver1\,
                                            gene %in% peOver2 ~ \peOver2\,
                                            gene %in% peOver3 ~ \peOver3\,
                                            gene %in% peOver4 ~ \peOver4\,
                                            TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(result4, aes(x =  group, y = perc)) + geom_violin() + geom_boxplot(width = 0.05) + theme_classic() +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)

####### DOing this for P-P groups

ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene


result4 <- result3 %>% dplyr::mutate(group = case_when(gene %in% ppOver0 ~ \ppOver0\,
                                            gene %in% ppOver1 ~ \ppOver1\,
                                            gene %in% ppOver2 ~ \ppOver2\,
                                            gene %in% ppOver3 ~ \ppOver3\,
                                            gene %in% ppOver4 ~ \ppOver4\,
                                            TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(result4, aes(x =  group, y = perc)) + geom_violin() + geom_boxplot(width = 0.05) + theme_classic() +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNXlaWE4xYkhRZ1BDMGdaR0YwWVNBbFBpVmNiaUFnWjNKdmRYQmZZbmtvWjJWdVpTd2daR2x5WldOMGFXOXVLU0FsUGlWY2JpQWdiWFYwWVhSbEtHUnBjM1JVYjBGdVkyaHZjaUE5SUdGaWN5aGthWE4wVkc5QmJtTm9iM0lwS1NBbFBpVmNiaUFnYlhWMFlYUmxLRzFoZUY5a2FYTjBYMUJmVXlBOUlHbG1aV3h6WlNoaGJua29RVzV1YnpJZ1BUMGdYRnhRTFZOY1hDa3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhlQ2hrYVhOMFZHOUJibU5vYjNKYlFXNXVieklnUFQwZ1hGeFFMVk5jWEYwc0lHNWhMbkp0SUQwZ1ZGSlZSU2tzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRTVCS1NsY2JuSmxjM1ZzZENBOExTQnlaWE4xYkhRZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1FXNXVieklnSVQwZ1hGeFFMVk5jWENrZ0pUNGxYRzRnSUcxMWRHRjBaU2hwYzE5emJXRnNiR1Z5SUQwZ2FXWmxiSE5sS0dsekxtNWhLRzFoZUY5a2FYTjBYMUJmVXlrc0lFNUJMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWmxiSE5sS0dScGMzUlViMEZ1WTJodmNpQTlQU0J0WVhoZlpHbHpkRjlRWDFNc0lFNUJMQ0JrYVhOMFZHOUJibU5vYjNJZ1BDQnRZWGhmWkdsemRGOVFYMU1wS1NrZ0pUNGxYRzRnSUhWdVozSnZkWEFvS1Z4dVhHNWNibHh1Y21WemRXeDBNaUE4TFNCeVpYTjFiSFFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvSVdsekxtNWhLR2x6WDNOdFlXeHNaWElwS1Z4dVhHNXlaWE4xYkhReklEd3RJSEpsYzNWc2RESWdKVDRsSUdkeWIzVndYMko1S0dkbGJtVXNJR1JwY21WamRHbHZiaWtnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2hqYjNWdWRGOTBjblZsSUQwZ2MzVnRLR2x6WDNOdFlXeHNaWElzSUc1aExuSnRJRDBnVkZKVlJTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNCamIzVnVkRjltWVd4elpTQTlJSE4xYlNocGMxOXpiV0ZzYkdWeUlEMDlJRVpCVEZORkxDQnVZUzV5YlNBOUlGUlNWVVVwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaGpiM1Z1ZENBOUlHTnZkVzUwWDNSeWRXVWdLeUJqYjNWdWRGOW1ZV3h6WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd1pYSmpJRDBnWTI5MWJuUmZkSEoxWlM5amIzVnVkQ294TURBcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR2RsYm1Vc0lHUnBjbVZqZEdsdmJpd2djR1Z5WXlsY2JseHVjbVZ6ZFd4ME15QThMU0J5WlhOMWJIUXpJQ1UrSlNCbmNtOTFjRjlpZVNoblpXNWxLU0FsUGlVZ2MzVnRiV0Z5YVhwbEtIQmxjbU1nUFNCdFpXRnVLSEJsY21NcEtWeHVYRzRqSXlNakl5TWpJRVJQYVc1bklIUm9hWE1nWm05eUlGQXRVeUJuY205MWNITmNibkpsYzNWc2RFUnBjaUE4TFNCb1pYSmxLRnhjTGk0dkxpNHZjbVZ6ZFd4MFhGd3BYRzUwWlcxd01pQThMU0J5WldGa1VrUlRLR2hsY21Vb2NtVnpkV3gwUkdseUxDQmNYR2RsYm1WZmJHOXZjRjlzYVc1ckxuSmtjMXhjS1NsY2JseHVjSE5QZG1WeU5DQThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCeklENDlJRFFwS1NSblpXNWxYRzV3YzA5MlpYSXpJRHd0SUNoMFpXMXdNaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh1ZFcxZmNITWdQajBnTXl3Z2JuVnRYM0J6SUR3Z05Da3BKR2RsYm1WY2JuQnpUM1psY2pJZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y3lBK1BTQXlMQ0J1ZFcxZmNITWdQQ0F6S1Nra1oyVnVaVnh1Y0hOUGRtVnlNU0E4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQnpJRDQ5SURFc0lHNTFiVjl3Y3lBOElESXBLU1JuWlc1bFhHNXdjMDkyWlhJd0lEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hNZ1BDQXhLU2trWjJWdVpWeHVYRzVjYm5KbGMzVnNkRFFnUEMwZ2NtVnpkV3gwTXlBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUdOaGMyVmZkMmhsYmloblpXNWxJQ1ZwYmlVZ2NITlBkbVZ5TUNCK0lGeGNjSE5QZG1WeU1GeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuWlc1bElDVnBiaVVnY0hOUGRtVnlNU0IrSUZ4Y2NITlBkbVZ5TVZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5aVzVsSUNWcGJpVWdjSE5QZG1WeU1pQitJRnhjY0hOUGRtVnlNbHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCblpXNWxJQ1ZwYmlVZ2NITlBkbVZ5TXlCK0lGeGNjSE5QZG1WeU0xeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuWlc1bElDVnBiaVVnY0hOUGRtVnlOQ0IrSUZ4Y2NITlBkbVZ5TkZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVbFZGSUg0Z1RrRXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lnaGFYTXVibUVvWjNKdmRYQXBLVnh1WEc1Y2JtZG5jR3h2ZENoeVpYTjFiSFEwTENCaFpYTW9lQ0E5SUNCbmNtOTFjQ3dnZVNBOUlIQmxjbU1wS1NBcklHZGxiMjFmZG1sdmJHbHVLQ2tnS3lCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMakExS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNJR2RsYjIwZ1BTQmNYSEJ2YVc1MFhGd3NJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F5TENCbWFXeHNJRDBnWEZ4eVpXUmNYQ3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndwWEc1Y2JpTWpJeU1qSXlNZ1JFOXBibWNnZEdocGN5Qm1iM0lnVUMxRklHZHliM1Z3YzF4dWNHVlBkbVZ5TkNBOExTQW9kR1Z0Y0RJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JuVnRYM0JsSUQ0OUlEUXBLU1JuWlc1bFhHNXdaVTkyWlhJeklEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0dVZ1BqMGdNeXdnYm5WdFgzQmxJRHdnTkNrcEpHZGxibVZjYm5CbFQzWmxjaklnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdaU0ErUFNBeUxDQnVkVzFmY0dVZ1BDQXpLU2trWjJWdVpWeHVjR1ZQZG1WeU1TQThMU0FvZEdWdGNESWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iblZ0WDNCbElENDlJREVzSUc1MWJWOXdaU0E4SURJcEtTUm5aVzVsWEc1d1pVOTJaWEl3SUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjR1VnUENBeEtTa2taMlZ1WlZ4dVhHNWNibkpsYzNWc2REUWdQQzBnY21WemRXeDBNeUFsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJR05oYzJWZmQyaGxiaWhuWlc1bElDVnBiaVVnY0dWUGRtVnlNQ0IrSUZ4Y2NHVlBkbVZ5TUZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5aVzVsSUNWcGJpVWdjR1ZQZG1WeU1TQitJRnhjY0dWUGRtVnlNVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCblpXNWxJQ1ZwYmlVZ2NHVlBkbVZ5TWlCK0lGeGNjR1ZQZG1WeU1seGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuWlc1bElDVnBiaVVnY0dWUGRtVnlNeUIrSUZ4Y2NHVlBkbVZ5TTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5aVzVsSUNWcGJpVWdjR1ZQZG1WeU5DQitJRnhjY0dWUGRtVnlORnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCVVVsVkZJSDRnVGtFcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWdoYVhNdWJtRW9aM0p2ZFhBcEtWeHVYRzVjYm1kbmNHeHZkQ2h5WlhOMWJIUTBMQ0JoWlhNb2VDQTlJQ0JuY205MWNDd2dlU0E5SUhCbGNtTXBLU0FySUdkbGIyMWZkbWx2YkdsdUtDa2dLeUJuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqQTFLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FyWEc0Z0lITjBZWFJmYzNWdGJXRnllU2hoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c0lHZGxiMjBnUFNCY1hIQnZhVzUwWEZ3c0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXlMQ0JtYVd4c0lEMGdYRnh5WldSY1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BYRzVjYmlNakl5TWpJeU1nUkU5cGJtY2dkR2hwY3lCbWIzSWdVQzFRSUdkeWIzVndjMXh1WEc1d2NFOTJaWEkwSUR3dElDaDBaVzF3TWlBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lodWRXMWZjSEFnUGowZ05Da3BKR2RsYm1WY2JuQndUM1psY2pNZ1BDMGdLSFJsYlhBeUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHNTFiVjl3Y0NBK1BTQXpMQ0J1ZFcxZmNIQWdQQ0EwS1Nra1oyVnVaVnh1Y0hCUGRtVnlNaUE4TFNBb2RHVnRjRElnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYm5WdFgzQndJRDQ5SURJc0lHNTFiVjl3Y0NBOElETXBLU1JuWlc1bFhHNXdjRTkyWlhJeElEd3RJQ2gwWlcxd01pQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHVkVzFmY0hBZ1BqMGdNU3dnYm5WdFgzQndJRHdnTWlrcEpHZGxibVZjYm5Cd1QzWmxjakFnUEMwZ0tIUmxiWEF5SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0c1MWJWOXdjQ0E4SURFcEtTUm5aVzVsWEc1Y2JseHVjbVZ6ZFd4ME5DQThMU0J5WlhOMWJIUXpJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdZMkZ6WlY5M2FHVnVLR2RsYm1VZ0pXbHVKU0J3Y0U5MlpYSXdJSDRnWEZ4d2NFOTJaWEl3WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZGxibVVnSldsdUpTQndjRTkyWlhJeElINGdYRnh3Y0U5MlpYSXhYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkbGJtVWdKV2x1SlNCd2NFOTJaWEl5SUg0Z1hGeHdjRTkyWlhJeVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2RsYm1VZ0pXbHVKU0J3Y0U5MlpYSXpJSDRnWEZ4d2NFOTJaWEl6WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZGxibVVnSldsdUpTQndjRTkyWlhJMElINGdYRnh3Y0U5MlpYSTBYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSU1ZVVWdmaUJPUVNrcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLQ0ZwY3k1dVlTaG5jbTkxY0NrcFhHNWNibHh1WjJkd2JHOTBLSEpsYzNWc2REUXNJR0ZsY3loNElEMGdJR2R5YjNWd0xDQjVJRDBnY0dWeVl5a3BJQ3NnWjJWdmJWOTJhVzlzYVc0b0tTQXJJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU1EVXBJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3RjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLR0ZsY3lobmNtOTFjQ0E5SUdkeWIzVndLU3dnWm5WdUlEMGdiV1ZoYml3Z1oyVnZiU0E5SUZ4Y2NHOXBiblJjWEN3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNYSEpsWkZ4Y0xDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDbGNibHh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuXG5yZXN1bHQgPC0gZGF0YSAlPiVcbiAgZ3JvdXBfYnkoZ2VuZSwgZGlyZWN0aW9uKSAlPiVcbiAgbXV0YXRlKGRpc3RUb0FuY2hvciA9IGFicyhkaXN0VG9BbmNob3IpKSAlPiVcbiAgbXV0YXRlKG1heF9kaXN0X1BfUyA9IGlmZWxzZShhbnkoQW5ubzIgPT0gXFxQLVNcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChkaXN0VG9BbmNob3JbQW5ubzIgPT0gXFxQLVNcXF0sIG5hLnJtID0gVFJVRSksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSlcbnJlc3VsdCA8LSByZXN1bHQgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgIT0gXFxQLVNcXCkgJT4lXG4gIG11dGF0ZShpc19zbWFsbGVyID0gaWZlbHNlKGlzLm5hKG1heF9kaXN0X1BfUyksIE5BLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpc3RUb0FuY2hvciA9PSBtYXhfZGlzdF9QX1MsIE5BLCBkaXN0VG9BbmNob3IgPCBtYXhfZGlzdF9QX1MpKSkgJT4lXG4gIHVuZ3JvdXAoKVxuXG5cblxucmVzdWx0MiA8LSByZXN1bHQgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGlzX3NtYWxsZXIpKVxuXG5yZXN1bHQzIDwtIHJlc3VsdDIgJT4lIGdyb3VwX2J5KGdlbmUsIGRpcmVjdGlvbikgJT4lXG4gIHN1bW1hcml6ZShjb3VudF90cnVlID0gc3VtKGlzX3NtYWxsZXIsIG5hLnJtID0gVFJVRSksXG4gICAgICAgICAgICBjb3VudF9mYWxzZSA9IHN1bShpc19zbWFsbGVyID09IEZBTFNFLCBuYS5ybSA9IFRSVUUpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShjb3VudCA9IGNvdW50X3RydWUgKyBjb3VudF9mYWxzZSxcbiAgICAgICAgICAgICAgICBwZXJjID0gY291bnRfdHJ1ZS9jb3VudCoxMDApICU+JVxuICBkcGx5cjo6c2VsZWN0KGdlbmUsIGRpcmVjdGlvbiwgcGVyYylcblxucmVzdWx0MyA8LSByZXN1bHQzICU+JSBncm91cF9ieShnZW5lKSAlPiUgc3VtbWFyaXplKHBlcmMgPSBtZWFuKHBlcmMpKVxuXG4jIyMjIyMjIERPaW5nIHRoaXMgZm9yIFAtUyBncm91cHNcbnJlc3VsdERpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0XFwpXG50ZW1wMiA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rLnJkc1xcKSlcblxucHNPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDQpKSRnZW5lXG5wc092ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMywgbnVtX3BzIDwgNCkpJGdlbmVcbnBzT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAyLCBudW1fcHMgPCAzKSkkZ2VuZVxucHNPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDEsIG51bV9wcyA8IDIpKSRnZW5lXG5wc092ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPCAxKSkkZ2VuZVxuXG5cbnJlc3VsdDQgPC0gcmVzdWx0MyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihnZW5lICVpbiUgcHNPdmVyMCB+IFxccHNPdmVyMFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHNPdmVyMSB+IFxccHNPdmVyMVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHNPdmVyMiB+IFxccHNPdmVyMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHNPdmVyMyB+IFxccHNPdmVyM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHNPdmVyNCB+IFxccHNPdmVyNFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbmdncGxvdChyZXN1bHQ0LCBhZXMoeCA9ICBncm91cCwgeSA9IHBlcmMpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjA1KSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyMjIyMgRE9pbmcgdGhpcyBmb3IgUC1FIGdyb3Vwc1xucGVPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDQpKSRnZW5lXG5wZU92ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMywgbnVtX3BlIDwgNCkpJGdlbmVcbnBlT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAyLCBudW1fcGUgPCAzKSkkZ2VuZVxucGVPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDEsIG51bV9wZSA8IDIpKSRnZW5lXG5wZU92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPCAxKSkkZ2VuZVxuXG5cbnJlc3VsdDQgPC0gcmVzdWx0MyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihnZW5lICVpbiUgcGVPdmVyMCB+IFxccGVPdmVyMFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcGVPdmVyMSB+IFxccGVPdmVyMVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcGVPdmVyMiB+IFxccGVPdmVyMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcGVPdmVyMyB+IFxccGVPdmVyM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcGVPdmVyNCB+IFxccGVPdmVyNFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbmdncGxvdChyZXN1bHQ0LCBhZXMoeCA9ICBncm91cCwgeSA9IHBlcmMpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjA1KSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyMjIyMgRE9pbmcgdGhpcyBmb3IgUC1QIGdyb3Vwc1xuXG5wcE92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gNCkpJGdlbmVcbnBwT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAzLCBudW1fcHAgPCA0KSkkZ2VuZVxucHBPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDIsIG51bV9wcCA8IDMpKSRnZW5lXG5wcE92ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMSwgbnVtX3BwIDwgMikpJGdlbmVcbnBwT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA8IDEpKSRnZW5lXG5cblxucmVzdWx0NCA8LSByZXN1bHQzICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGdlbmUgJWluJSBwcE92ZXIwIH4gXFxwcE92ZXIwXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXIxIH4gXFxwcE92ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXIyIH4gXFxwcE92ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXIzIH4gXFxwcE92ZXIzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXI0IH4gXFxwcE92ZXI0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cblxuZ2dwbG90KHJlc3VsdDQsIGFlcyh4ID0gIGdyb3VwLCB5ID0gcGVyYykpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMDUpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXClcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5yZXN1bHQgPC0gZGF0YSAlPiVcbiAgZ3JvdXBfYnkoZ2VuZSwgZGlyZWN0aW9uKSAlPiVcbiAgbXV0YXRlKGRpc3RUb0FuY2hvciA9IGFicyhkaXN0VG9BbmNob3IpKSAlPiVcbiAgbXV0YXRlKG1heF9kaXN0X1BfUyA9IGlmZWxzZShhbnkoQW5ubzIgPT0gXFxQLVNcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChkaXN0VG9BbmNob3JbQW5ubzIgPT0gXFxQLVNcXF0sIG5hLnJtID0gVFJVRSksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSlcbnJlc3VsdCA8LSByZXN1bHQgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgIT0gXFxQLVNcXCkgJT4lXG4gIG11dGF0ZShpc19zbWFsbGVyID0gaWZlbHNlKGlzLm5hKG1heF9kaXN0X1BfUyksIE5BLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpc3RUb0FuY2hvciA9PSBtYXhfZGlzdF9QX1MsIE5BLCBkaXN0VG9BbmNob3IgPCBtYXhfZGlzdF9QX1MpKSkgJT4lXG4gIHVuZ3JvdXAoKVxuXG5cblxucmVzdWx0MiA8LSByZXN1bHQgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGlzX3NtYWxsZXIpKVxuXG5yZXN1bHQzIDwtIHJlc3VsdDIgJT4lIGdyb3VwX2J5KGdlbmUsIGRpcmVjdGlvbikgJT4lXG4gIHN1bW1hcml6ZShjb3VudF90cnVlID0gc3VtKGlzX3NtYWxsZXIsIG5hLnJtID0gVFJVRSksXG4gICAgICAgICAgICBjb3VudF9mYWxzZSA9IHN1bShpc19zbWFsbGVyID09IEZBTFNFLCBuYS5ybSA9IFRSVUUpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShjb3VudCA9IGNvdW50X3RydWUgKyBjb3VudF9mYWxzZSxcbiAgICAgICAgICAgICAgICBwZXJjID0gY291bnRfdHJ1ZS9jb3VudCoxMDApICU+JVxuICBkcGx5cjo6c2VsZWN0KGdlbmUsIGRpcmVjdGlvbiwgcGVyYylcblxucmVzdWx0MyA8LSByZXN1bHQzICU+JSBncm91cF9ieShnZW5lKSAlPiUgc3VtbWFyaXplKHBlcmMgPSBtZWFuKHBlcmMpKVxuXG4jIyMjIyMjIERPaW5nIHRoaXMgZm9yIFAtUyBncm91cHNcbnJlc3VsdERpciA8LSBoZXJlKFxcLi4vLi4vcmVzdWx0XFwpXG50ZW1wMiA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCBcXGdlbmVfbG9vcF9saW5rLnJkc1xcKSlcblxucHNPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDQpKSRnZW5lXG5wc092ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMywgbnVtX3BzIDwgNCkpJGdlbmVcbnBzT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAyLCBudW1fcHMgPCAzKSkkZ2VuZVxucHNPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDEsIG51bV9wcyA8IDIpKSRnZW5lXG5wc092ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPCAxKSkkZ2VuZVxuXG5cbnJlc3VsdDQgPC0gcmVzdWx0MyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihnZW5lICVpbiUgcHNPdmVyMCB+IFxccHNPdmVyMFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHNPdmVyMSB+IFxccHNPdmVyMVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHNPdmVyMiB+IFxccHNPdmVyMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHNPdmVyMyB+IFxccHNPdmVyM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHNPdmVyNCB+IFxccHNPdmVyNFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbmdncGxvdChyZXN1bHQ0LCBhZXMoeCA9ICBncm91cCwgeSA9IHBlcmMpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjA1KSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyMjIyMgRE9pbmcgdGhpcyBmb3IgUC1FIGdyb3Vwc1xucGVPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDQpKSRnZW5lXG5wZU92ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMywgbnVtX3BlIDwgNCkpJGdlbmVcbnBlT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAyLCBudW1fcGUgPCAzKSkkZ2VuZVxucGVPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDEsIG51bV9wZSA8IDIpKSRnZW5lXG5wZU92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPCAxKSkkZ2VuZVxuXG5cbnJlc3VsdDQgPC0gcmVzdWx0MyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihnZW5lICVpbiUgcGVPdmVyMCB+IFxccGVPdmVyMFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcGVPdmVyMSB+IFxccGVPdmVyMVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcGVPdmVyMiB+IFxccGVPdmVyMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcGVPdmVyMyB+IFxccGVPdmVyM1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcGVPdmVyNCB+IFxccGVPdmVyNFxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5cbmdncGxvdChyZXN1bHQ0LCBhZXMoeCA9ICBncm91cCwgeSA9IHBlcmMpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjA1KSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyMjIyMgRE9pbmcgdGhpcyBmb3IgUC1QIGdyb3Vwc1xuXG5wcE92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gNCkpJGdlbmVcbnBwT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAzLCBudW1fcHAgPCA0KSkkZ2VuZVxucHBPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDIsIG51bV9wcCA8IDMpKSRnZW5lXG5wcE92ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMSwgbnVtX3BwIDwgMikpJGdlbmVcbnBwT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA8IDEpKSRnZW5lXG5cblxucmVzdWx0NCA8LSByZXN1bHQzICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGdlbmUgJWluJSBwcE92ZXIwIH4gXFxwcE92ZXIwXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXIxIH4gXFxwcE92ZXIxXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXIyIH4gXFxwcE92ZXIyXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXIzIH4gXFxwcE92ZXIzXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXI0IH4gXFxwcE92ZXI0XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cblxuZ2dwbG90KHJlc3VsdDQsIGFlcyh4ID0gIGdyb3VwLCB5ID0gcGVyYykpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMDUpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXClcblxuYGBgXG5gYGAifQ== -->

```r
```r

result <- data %>%
  group_by(gene, direction) %>%
  mutate(distToAnchor = abs(distToAnchor)) %>%
  mutate(max_dist_P_S = ifelse(any(Anno2 == \P-S\), 
                               max(distToAnchor[Anno2 == \P-S\], na.rm = TRUE), 
                               NA))
result <- result %>% dplyr::filter(Anno2 != \P-S\) %>%
  mutate(is_smaller = ifelse(is.na(max_dist_P_S), NA, 
                             ifelse(distToAnchor == max_dist_P_S, NA, distToAnchor < max_dist_P_S))) %>%
  ungroup()



result2 <- result %>% dplyr::filter(!is.na(is_smaller))

result3 <- result2 %>% group_by(gene, direction) %>%
  summarize(count_true = sum(is_smaller, na.rm = TRUE),
            count_false = sum(is_smaller == FALSE, na.rm = TRUE)) %>%
  dplyr::mutate(count = count_true + count_false,
                perc = count_true/count*100) %>%
  dplyr::select(gene, direction, perc)

result3 <- result3 %>% group_by(gene) %>% summarize(perc = mean(perc))

####### DOing this for P-S groups
resultDir <- here(\../../result\)
temp2 <- readRDS(here(resultDir, \gene_loop_link.rds\))

psOver4 <- (temp2 %>% dplyr::filter(num_ps >= 4))$gene
psOver3 <- (temp2 %>% dplyr::filter(num_ps >= 3, num_ps < 4))$gene
psOver2 <- (temp2 %>% dplyr::filter(num_ps >= 2, num_ps < 3))$gene
psOver1 <- (temp2 %>% dplyr::filter(num_ps >= 1, num_ps < 2))$gene
psOver0 <- (temp2 %>% dplyr::filter(num_ps < 1))$gene


result4 <- result3 %>% dplyr::mutate(group = case_when(gene %in% psOver0 ~ \psOver0\,
                                            gene %in% psOver1 ~ \psOver1\,
                                            gene %in% psOver2 ~ \psOver2\,
                                            gene %in% psOver3 ~ \psOver3\,
                                            gene %in% psOver4 ~ \psOver4\,
                                            TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(result4, aes(x =  group, y = perc)) + geom_violin() + geom_boxplot(width = 0.05) + theme_classic() +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)

####### DOing this for P-E groups
peOver4 <- (temp2 %>% dplyr::filter(num_pe >= 4))$gene
peOver3 <- (temp2 %>% dplyr::filter(num_pe >= 3, num_pe < 4))$gene
peOver2 <- (temp2 %>% dplyr::filter(num_pe >= 2, num_pe < 3))$gene
peOver1 <- (temp2 %>% dplyr::filter(num_pe >= 1, num_pe < 2))$gene
peOver0 <- (temp2 %>% dplyr::filter(num_pe < 1))$gene


result4 <- result3 %>% dplyr::mutate(group = case_when(gene %in% peOver0 ~ \peOver0\,
                                            gene %in% peOver1 ~ \peOver1\,
                                            gene %in% peOver2 ~ \peOver2\,
                                            gene %in% peOver3 ~ \peOver3\,
                                            gene %in% peOver4 ~ \peOver4\,
                                            TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(result4, aes(x =  group, y = perc)) + geom_violin() + geom_boxplot(width = 0.05) + theme_classic() +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)

####### DOing this for P-P groups

ppOver4 <- (temp2 %>% dplyr::filter(num_pp >= 4))$gene
ppOver3 <- (temp2 %>% dplyr::filter(num_pp >= 3, num_pp < 4))$gene
ppOver2 <- (temp2 %>% dplyr::filter(num_pp >= 2, num_pp < 3))$gene
ppOver1 <- (temp2 %>% dplyr::filter(num_pp >= 1, num_pp < 2))$gene
ppOver0 <- (temp2 %>% dplyr::filter(num_pp < 1))$gene


result4 <- result3 %>% dplyr::mutate(group = case_when(gene %in% ppOver0 ~ \ppOver0\,
                                            gene %in% ppOver1 ~ \ppOver1\,
                                            gene %in% ppOver2 ~ \ppOver2\,
                                            gene %in% ppOver3 ~ \ppOver3\,
                                            gene %in% ppOver4 ~ \ppOver4\,
                                            TRUE ~ NA)) %>%
  dplyr::filter(!is.na(group))


ggplot(result4, aes(x =  group, y = perc)) + geom_violin() + geom_boxplot(width = 0.05) + theme_classic() +
  stat_summary(aes(group = group), fun = mean, geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [2.33] Checking guidance

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjR1ZoYXk1RFZFTkdJRHd0SUdsdGNHOXlkRkJsWVdzb2FHVnlaU2h5WldaRWFYSXNJRndpTXpNeU5EaGZRMVJEUmw4d055MDNNamxmUW5KMVkyVXRORjl3WldGcmN5NXRaWEpuWlZCbFlXc3VZbVZrWENJcEtWeHVYRzVzYVdKeVlYSjVLRUpUWjJWdWIyMWxMazF0ZFhOamRXeDFjeTVWUTFORExtMXRNVEFwWEc1Y2JpTWdSWGgwY21GamRDQnpaWEYxWlc1alpYTmNibk5sY1hWbGJtTmxjeUE4TFNCblpYUlRaWEVvUWxOblpXNXZiV1V1VFcxMWMyTjFiSFZ6TGxWRFUwTXViVzB4TUN3Z2NHVmhheTVEVkVOR0tWeHVYRzVjYmlNZ1IyVjBJSFJvWlNCRFZFTkdJRzF2ZEdsbUlDaHZjaUJ3Y205MmFXUmxJSGx2ZFhJZ2IzZHVJRkJYVFNsY2JtTjBZMlpmYlc5MGFXWWdQQzBnY1hWbGNua29UVzkwYVdaRVlpd2dZeWhjSWtOVVEwWmNJaXdnWENKTmJYVnpZM1ZzZFhOY0lpa3BXMXN4WFYxY2JseHVJeUJUWTJGdUlHWnZjaUIwYUdVZ2JXOTBhV1pjYm0xdmRHbG1YMmhwZEhNZ1BDMGdiR0Z3Y0d4NUtITmxjWFZsYm1ObGN5d2dablZ1WTNScGIyNG9jMlZ4S1NCN1hHNGdJQ0FnYldGMFkyaFFWMDBvWTNSalpsOXRiM1JwWml3Z2MyVnhMQ0J0YVc0dWMyTnZjbVVnUFNCY0lqZ3dKVndpS1NBaklFRmthblZ6ZENCdGFXNHVjMk52Y21VZ1lYTWdibVZsWkdWa1hHNTlLVnh1WEc1dGIzUnBabDlvYVhSelgzSmxkbVZ5YzJVZ1BDMGdiR0Z3Y0d4NUtITmxjWFZsYm1ObGN5d2dablZ1WTNScGIyNG9jMlZ4S1NCN1hHNGdJQ0FnYldGMFkyaFFWMDBvWTNSalpsOXRiM1JwWml3Z2NtVjJaWEp6WlVOdmJYQnNaVzFsYm5Rb2MyVnhLU3dnYldsdUxuTmpiM0psSUQwZ1hDSTRNQ1ZjSWlsY2JuMHBYRzVjYmlNZ1EyOXRZbWx1WlNCeVpYTjFiSFJ6WEc1eVpYTjFiSFFnUEMwZ2JXRndjR3g1S0daMWJtTjBhVzl1S0daM1pDd2djbVYyS1NCN1hHNGdJQ0FnYkdsemRDaG1iM0ozWVhKa0lEMGdabmRrTENCeVpYWmxjbk5sSUQwZ2NtVjJLVnh1ZlN3Z2JXOTBhV1pmYUdsMGN5d2diVzkwYVdaZmFHbDBjMTl5WlhabGNuTmxMQ0JUU1UxUVRFbEdXU0E5SUVaQlRGTkZLVnh1WEc1Y2JuSmxjM1ZzZEZ0Yk5WMWRYRzVjYmx4dWNtVnpkV3gwWDNScFltSnNaU0E4TFNCMGFXSmliR1VvWEc0Z0lDQWdjR1ZoYTE5cFpDQTlJSE5sY1Y5aGJHOXVaeWh5WlhOMWJIUXBMQ0FqSUVOeVpXRjBaU0JoYmlCcFpHVnVkR2xtYVdWeUlHWnZjaUJsWVdOb0lIQmxZV3RjYmlBZ0lDQmhiR2xuYm0xbGJuUWdQU0J0WVhCZlkyaHlLSEpsYzNWc2RDd2dablZ1WTNScGIyNG9jbVZ6S1NCN1hHNGdJQ0FnSUNBZ0lHaGhjMTltZDJRZ1BDMGdiR1Z1WjNSb0tISmxjeVJtYjNKM1lYSmtLU0ErSURCY2JpQWdJQ0FnSUNBZ2FHRnpYM0psZGlBOExTQnNaVzVuZEdnb2NtVnpKSEpsZG1WeWMyVXBJRDRnTUZ4dUlDQWdJQ0FnSUNCY2JpQWdJQ0FnSUNBZ2FXWWdLR2hoYzE5bWQyUWdKaVlnYUdGelgzSmxkaWtnWENKbWQyUnlaWFpjSWx4dUlDQWdJQ0FnSUNCbGJITmxJR2xtSUNob1lYTmZabmRrS1NCY0ltWjNaRndpWEc0Z0lDQWdJQ0FnSUdWc2MyVWdhV1lnS0doaGMxOXlaWFlwSUZ3aWNtVjJYQ0pjYmlBZ0lDQWdJQ0FnWld4elpTQmNJbTV2Ym1WY0lseHVJQ0FnSUgwcFhHNHBYRzVjYm5SbGJYQWdQQzBnWVhOZmRHbGlZbXhsS0hCbFlXc3VRMVJEUmlrZ0pUNGxJR0pwYm1SZlkyOXNjeWh5WlhOMWJIUmZkR2xpWW14bEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2h6WlhGdVlXMWxjeXdnYzNSaGNuUXNJR1Z1WkN3Z1lXeHBaMjV0Wlc1MEtWeHVYRzVtZDNKcGRHVW9kR1Z0Y0N3Z2FHVnlaU2h5WldaRWFYSXNJRndpTXpNeU5EaGZRMVJEUmw4d055MDNNamxmUW5KMVkyVXRORjl3WldGcmN5NXRaWEpuWlZCbFlXc3ViVzkwYVdaQmJtNXZkR0YwWldRdVltVmtYQ0lwTENCamIyd3VibUZ0WlhNZ1BTQkdRVXhUUlN3Z2MyVndJRDBnWENKY1hIUmNJaWxjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbnBlYWsuQ1RDRiA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcblxubGlicmFyeShCU2dlbm9tZS5NbXVzY3VsdXMuVUNTQy5tbTEwKVxuXG4jIEV4dHJhY3Qgc2VxdWVuY2VzXG5zZXF1ZW5jZXMgPC0gZ2V0U2VxKEJTZ2Vub21lLk1tdXNjdWx1cy5VQ1NDLm1tMTAsIHBlYWsuQ1RDRilcblxuXG4jIEdldCB0aGUgQ1RDRiBtb3RpZiAob3IgcHJvdmlkZSB5b3VyIG93biBQV00pXG5jdGNmX21vdGlmIDwtIHF1ZXJ5KE1vdGlmRGIsIGMoXFxDVENGXFwsIFxcTW11c2N1bHVzXFwpKVtbMV1dXG5cbiMgU2NhbiBmb3IgdGhlIG1vdGlmXG5tb3RpZl9oaXRzIDwtIGxhcHBseShzZXF1ZW5jZXMsIGZ1bmN0aW9uKHNlcSkge1xuICAgIG1hdGNoUFdNKGN0Y2ZfbW90aWYsIHNlcSwgbWluLnNjb3JlID0gXFw4MCVcXCkgIyBBZGp1c3QgbWluLnNjb3JlIGFzIG5lZWRlZFxufSlcblxubW90aWZfaGl0c19yZXZlcnNlIDwtIGxhcHBseShzZXF1ZW5jZXMsIGZ1bmN0aW9uKHNlcSkge1xuICAgIG1hdGNoUFdNKGN0Y2ZfbW90aWYsIHJldmVyc2VDb21wbGVtZW50KHNlcSksIG1pbi5zY29yZSA9IFxcODAlXFwpXG59KVxuXG4jIENvbWJpbmUgcmVzdWx0c1xucmVzdWx0IDwtIG1hcHBseShmdW5jdGlvbihmd2QsIHJldikge1xuICAgIGxpc3QoZm9yd2FyZCA9IGZ3ZCwgcmV2ZXJzZSA9IHJldilcbn0sIG1vdGlmX2hpdHMsIG1vdGlmX2hpdHNfcmV2ZXJzZSwgU0lNUExJRlkgPSBGQUxTRSlcblxuXG5yZXN1bHRbWzVdXVxuXG5cbnJlc3VsdF90aWJibGUgPC0gdGliYmxlKFxuICAgIHBlYWtfaWQgPSBzZXFfYWxvbmcocmVzdWx0KSwgIyBDcmVhdGUgYW4gaWRlbnRpZmllciBmb3IgZWFjaCBwZWFrXG4gICAgYWxpZ25tZW50ID0gbWFwX2NocihyZXN1bHQsIGZ1bmN0aW9uKHJlcykge1xuICAgICAgICBoYXNfZndkIDwtIGxlbmd0aChyZXMkZm9yd2FyZCkgPiAwXG4gICAgICAgIGhhc19yZXYgPC0gbGVuZ3RoKHJlcyRyZXZlcnNlKSA+IDBcbiAgICAgICAgXG4gICAgICAgIGlmIChoYXNfZndkICYmIGhhc19yZXYpIFxcZndkcmV2XFxcbiAgICAgICAgZWxzZSBpZiAoaGFzX2Z3ZCkgXFxmd2RcXFxuICAgICAgICBlbHNlIGlmIChoYXNfcmV2KSBcXHJldlxcXG4gICAgICAgIGVsc2UgXFxub25lXFxcbiAgICB9KVxuKVxuXG50ZW1wIDwtIGFzX3RpYmJsZShwZWFrLkNUQ0YpICU+JSBiaW5kX2NvbHMocmVzdWx0X3RpYmJsZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQsIGFsaWdubWVudClcblxuZndyaXRlKHRlbXAsIGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLm1vdGlmQW5ub3RhdGVkLmJlZFxcKSwgY29sLm5hbWVzID0gRkFMU0UsIHNlcCA9IFxcXFx0XFwpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
peak.CTCF <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))

library(BSgenome.Mmusculus.UCSC.mm10)

# Extract sequences
sequences <- getSeq(BSgenome.Mmusculus.UCSC.mm10, peak.CTCF)


# Get the CTCF motif (or provide your own PWM)
ctcf_motif <- query(MotifDb, c(\CTCF\, \Mmusculus\))[[1]]

# Scan for the motif
motif_hits <- lapply(sequences, function(seq) {
    matchPWM(ctcf_motif, seq, min.score = \80%\) # Adjust min.score as needed
})

motif_hits_reverse <- lapply(sequences, function(seq) {
    matchPWM(ctcf_motif, reverseComplement(seq), min.score = \80%\)
})

# Combine results
result <- mapply(function(fwd, rev) {
    list(forward = fwd, reverse = rev)
}, motif_hits, motif_hits_reverse, SIMPLIFY = FALSE)


result[[5]]


result_tibble <- tibble(
    peak_id = seq_along(result), # Create an identifier for each peak
    alignment = map_chr(result, function(res) {
        has_fwd <- length(res$forward) > 0
        has_rev <- length(res$reverse) > 0
        
        if (has_fwd && has_rev) \fwdrev\
        else if (has_fwd) \fwd\
        else if (has_rev) \rev\
        else \none\
    })
)

temp <- as_tibble(peak.CTCF) %>% bind_cols(result_tibble) %>%
  dplyr::select(seqnames, start, end, alignment)

fwrite(temp, here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.motifAnnotated.bed\), col.names = FALSE, sep = \\t\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNHVmhheTVEVkVOR0lEd3RJR2x0Y0c5eWRGQmxZV3NvYUdWeVpTaHlaV1pFYVhJc0lGeGNNek15TkRoZlExUkRSbDh3TnkwM01qbGZRbkoxWTJVdE5GOXdaV0ZyY3k1dFpYSm5aVkJsWVdzdVltVmtYRndwS1Z4dVhHNXNhV0p5WVhKNUtFSlRaMlZ1YjIxbExrMXRkWE5qZFd4MWN5NVZRMU5ETG0xdE1UQXBYRzVjYmlNZ1JYaDBjbUZqZENCelpYRjFaVzVqWlhOY2JuTmxjWFZsYm1ObGN5QThMU0JuWlhSVFpYRW9RbE5uWlc1dmJXVXVUVzExYzJOMWJIVnpMbFZEVTBNdWJXMHhNQ3dnY0dWaGF5NURWRU5HS1Z4dVhHNWNiaU1nUjJWMElIUm9aU0JEVkVOR0lHMXZkR2xtSUNodmNpQndjbTkyYVdSbElIbHZkWElnYjNkdUlGQlhUU2xjYm1OMFkyWmZiVzkwYVdZZ1BDMGdjWFZsY25rb1RXOTBhV1pFWWl3Z1l5aGNYRU5VUTBaY1hDd2dYRnhOYlhWelkzVnNkWE5jWENrcFcxc3hYVjFjYmx4dUl5QlRZMkZ1SUdadmNpQjBhR1VnYlc5MGFXWmNibTF2ZEdsbVgyaHBkSE1nUEMwZ2JHRndjR3g1S0hObGNYVmxibU5sY3l3Z1puVnVZM1JwYjI0b2MyVnhLU0I3WEc0Z0lDQWdiV0YwWTJoUVYwMG9ZM1JqWmw5dGIzUnBaaXdnYzJWeExDQnRhVzR1YzJOdmNtVWdQU0JjWERnd0pWeGNLU0FqSUVGa2FuVnpkQ0J0YVc0dWMyTnZjbVVnWVhNZ2JtVmxaR1ZrWEc1OUtWeHVYRzV0YjNScFpsOW9hWFJ6WDNKbGRtVnljMlVnUEMwZ2JHRndjR3g1S0hObGNYVmxibU5sY3l3Z1puVnVZM1JwYjI0b2MyVnhLU0I3WEc0Z0lDQWdiV0YwWTJoUVYwMG9ZM1JqWmw5dGIzUnBaaXdnY21WMlpYSnpaVU52YlhCc1pXMWxiblFvYzJWeEtTd2diV2x1TG5OamIzSmxJRDBnWEZ3NE1DVmNYQ2xjYm4wcFhHNWNiaU1nUTI5dFltbHVaU0J5WlhOMWJIUnpYRzV5WlhOMWJIUWdQQzBnYldGd2NHeDVLR1oxYm1OMGFXOXVLR1ozWkN3Z2NtVjJLU0I3WEc0Z0lDQWdiR2x6ZENobWIzSjNZWEprSUQwZ1puZGtMQ0J5WlhabGNuTmxJRDBnY21WMktWeHVmU3dnYlc5MGFXWmZhR2wwY3l3Z2JXOTBhV1pmYUdsMGMxOXlaWFpsY25ObExDQlRTVTFRVEVsR1dTQTlJRVpCVEZORktWeHVYRzVjYm5KbGMzVnNkRnRiTlYxZFhHNWNibHh1Y21WemRXeDBYM1JwWW1Kc1pTQThMU0IwYVdKaWJHVW9YRzRnSUNBZ2NHVmhhMTlwWkNBOUlITmxjVjloYkc5dVp5aHlaWE4xYkhRcExDQWpJRU55WldGMFpTQmhiaUJwWkdWdWRHbG1hV1Z5SUdadmNpQmxZV05vSUhCbFlXdGNiaUFnSUNCaGJHbG5ibTFsYm5RZ1BTQnRZWEJmWTJoeUtISmxjM1ZzZEN3Z1puVnVZM1JwYjI0b2NtVnpLU0I3WEc0Z0lDQWdJQ0FnSUdoaGMxOW1kMlFnUEMwZ2JHVnVaM1JvS0hKbGN5Um1iM0ozWVhKa0tTQStJREJjYmlBZ0lDQWdJQ0FnYUdGelgzSmxkaUE4TFNCc1pXNW5kR2dvY21WekpISmxkbVZ5YzJVcElENGdNRnh1SUNBZ0lDQWdJQ0JjYmlBZ0lDQWdJQ0FnYVdZZ0tHaGhjMTltZDJRZ0ppWWdhR0Z6WDNKbGRpa2dYRnhtZDJSeVpYWmNYRnh1SUNBZ0lDQWdJQ0JsYkhObElHbG1JQ2hvWVhOZlpuZGtLU0JjWEdaM1pGeGNYRzRnSUNBZ0lDQWdJR1ZzYzJVZ2FXWWdLR2hoYzE5eVpYWXBJRnhjY21WMlhGeGNiaUFnSUNBZ0lDQWdaV3h6WlNCY1hHNXZibVZjWEZ4dUlDQWdJSDBwWEc0cFhHNWNiblJsYlhBZ1BDMGdZWE5mZEdsaVlteGxLSEJsWVdzdVExUkRSaWtnSlQ0bElHSnBibVJmWTI5c2N5aHlaWE4xYkhSZmRHbGlZbXhsS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaHpaWEZ1WVcxbGN5d2djM1JoY25Rc0lHVnVaQ3dnWVd4cFoyNXRaVzUwS1Z4dVhHNW1kM0pwZEdVb2RHVnRjQ3dnYUdWeVpTaHlaV1pFYVhJc0lGeGNNek15TkRoZlExUkRSbDh3TnkwM01qbGZRbkoxWTJVdE5GOXdaV0ZyY3k1dFpYSm5aVkJsWVdzdWJXOTBhV1pCYm01dmRHRjBaV1F1WW1Wa1hGd3BMQ0JqYjJ3dWJtRnRaWE1nUFNCR1FVeFRSU3dnYzJWd0lEMGdYRnhjWEhSY1hDbGNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5wZWFrLkNUQ0YgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG5cbmxpYnJhcnkoQlNnZW5vbWUuTW11c2N1bHVzLlVDU0MubW0xMClcblxuIyBFeHRyYWN0IHNlcXVlbmNlc1xuc2VxdWVuY2VzIDwtIGdldFNlcShCU2dlbm9tZS5NbXVzY3VsdXMuVUNTQy5tbTEwLCBwZWFrLkNUQ0YpXG5cblxuIyBHZXQgdGhlIENUQ0YgbW90aWYgKG9yIHByb3ZpZGUgeW91ciBvd24gUFdNKVxuY3RjZl9tb3RpZiA8LSBxdWVyeShNb3RpZkRiLCBjKFxcQ1RDRlxcLCBcXE1tdXNjdWx1c1xcKSlbWzFdXVxuXG4jIFNjYW4gZm9yIHRoZSBtb3RpZlxubW90aWZfaGl0cyA8LSBsYXBwbHkoc2VxdWVuY2VzLCBmdW5jdGlvbihzZXEpIHtcbiAgICBtYXRjaFBXTShjdGNmX21vdGlmLCBzZXEsIG1pbi5zY29yZSA9IFxcODAlXFwpICMgQWRqdXN0IG1pbi5zY29yZSBhcyBuZWVkZWRcbn0pXG5cbm1vdGlmX2hpdHNfcmV2ZXJzZSA8LSBsYXBwbHkoc2VxdWVuY2VzLCBmdW5jdGlvbihzZXEpIHtcbiAgICBtYXRjaFBXTShjdGNmX21vdGlmLCByZXZlcnNlQ29tcGxlbWVudChzZXEpLCBtaW4uc2NvcmUgPSBcXDgwJVxcKVxufSlcblxuIyBDb21iaW5lIHJlc3VsdHNcbnJlc3VsdCA8LSBtYXBwbHkoZnVuY3Rpb24oZndkLCByZXYpIHtcbiAgICBsaXN0KGZvcndhcmQgPSBmd2QsIHJldmVyc2UgPSByZXYpXG59LCBtb3RpZl9oaXRzLCBtb3RpZl9oaXRzX3JldmVyc2UsIFNJTVBMSUZZID0gRkFMU0UpXG5cblxucmVzdWx0W1s1XV1cblxuXG5yZXN1bHRfdGliYmxlIDwtIHRpYmJsZShcbiAgICBwZWFrX2lkID0gc2VxX2Fsb25nKHJlc3VsdCksICMgQ3JlYXRlIGFuIGlkZW50aWZpZXIgZm9yIGVhY2ggcGVha1xuICAgIGFsaWdubWVudCA9IG1hcF9jaHIocmVzdWx0LCBmdW5jdGlvbihyZXMpIHtcbiAgICAgICAgaGFzX2Z3ZCA8LSBsZW5ndGgocmVzJGZvcndhcmQpID4gMFxuICAgICAgICBoYXNfcmV2IDwtIGxlbmd0aChyZXMkcmV2ZXJzZSkgPiAwXG4gICAgICAgIFxuICAgICAgICBpZiAoaGFzX2Z3ZCAmJiBoYXNfcmV2KSBcXGZ3ZHJldlxcXG4gICAgICAgIGVsc2UgaWYgKGhhc19md2QpIFxcZndkXFxcbiAgICAgICAgZWxzZSBpZiAoaGFzX3JldikgXFxyZXZcXFxuICAgICAgICBlbHNlIFxcbm9uZVxcXG4gICAgfSlcbilcblxudGVtcCA8LSBhc190aWJibGUocGVhay5DVENGKSAlPiUgYmluZF9jb2xzKHJlc3VsdF90aWJibGUpICU+JVxuICBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kLCBhbGlnbm1lbnQpXG5cbmZ3cml0ZSh0ZW1wLCBoZXJlKHJlZkRpciwgXFwzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5tb3RpZkFubm90YXRlZC5iZWRcXCksIGNvbC5uYW1lcyA9IEZBTFNFLCBzZXAgPSBcXFxcdFxcKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucGVhay5DVENGIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxuXG5saWJyYXJ5KEJTZ2Vub21lLk1tdXNjdWx1cy5VQ1NDLm1tMTApXG5cbiMgRXh0cmFjdCBzZXF1ZW5jZXNcbnNlcXVlbmNlcyA8LSBnZXRTZXEoQlNnZW5vbWUuTW11c2N1bHVzLlVDU0MubW0xMCwgcGVhay5DVENGKVxuXG5cbiMgR2V0IHRoZSBDVENGIG1vdGlmIChvciBwcm92aWRlIHlvdXIgb3duIFBXTSlcbmN0Y2ZfbW90aWYgPC0gcXVlcnkoTW90aWZEYiwgYyhcXENUQ0ZcXCwgXFxNbXVzY3VsdXNcXCkpW1sxXV1cblxuIyBTY2FuIGZvciB0aGUgbW90aWZcbm1vdGlmX2hpdHMgPC0gbGFwcGx5KHNlcXVlbmNlcywgZnVuY3Rpb24oc2VxKSB7XG4gICAgbWF0Y2hQV00oY3RjZl9tb3RpZiwgc2VxLCBtaW4uc2NvcmUgPSBcXDgwJVxcKSAjIEFkanVzdCBtaW4uc2NvcmUgYXMgbmVlZGVkXG59KVxuXG5tb3RpZl9oaXRzX3JldmVyc2UgPC0gbGFwcGx5KHNlcXVlbmNlcywgZnVuY3Rpb24oc2VxKSB7XG4gICAgbWF0Y2hQV00oY3RjZl9tb3RpZiwgcmV2ZXJzZUNvbXBsZW1lbnQoc2VxKSwgbWluLnNjb3JlID0gXFw4MCVcXClcbn0pXG5cbiMgQ29tYmluZSByZXN1bHRzXG5yZXN1bHQgPC0gbWFwcGx5KGZ1bmN0aW9uKGZ3ZCwgcmV2KSB7XG4gICAgbGlzdChmb3J3YXJkID0gZndkLCByZXZlcnNlID0gcmV2KVxufSwgbW90aWZfaGl0cywgbW90aWZfaGl0c19yZXZlcnNlLCBTSU1QTElGWSA9IEZBTFNFKVxuXG5cbnJlc3VsdFtbNV1dXG5cblxucmVzdWx0X3RpYmJsZSA8LSB0aWJibGUoXG4gICAgcGVha19pZCA9IHNlcV9hbG9uZyhyZXN1bHQpLCAjIENyZWF0ZSBhbiBpZGVudGlmaWVyIGZvciBlYWNoIHBlYWtcbiAgICBhbGlnbm1lbnQgPSBtYXBfY2hyKHJlc3VsdCwgZnVuY3Rpb24ocmVzKSB7XG4gICAgICAgIGhhc19md2QgPC0gbGVuZ3RoKHJlcyRmb3J3YXJkKSA+IDBcbiAgICAgICAgaGFzX3JldiA8LSBsZW5ndGgocmVzJHJldmVyc2UpID4gMFxuICAgICAgICBcbiAgICAgICAgaWYgKGhhc19md2QgJiYgaGFzX3JldikgXFxmd2RyZXZcXFxuICAgICAgICBlbHNlIGlmIChoYXNfZndkKSBcXGZ3ZFxcXG4gICAgICAgIGVsc2UgaWYgKGhhc19yZXYpIFxccmV2XFxcbiAgICAgICAgZWxzZSBcXG5vbmVcXFxuICAgIH0pXG4pXG5cbnRlbXAgPC0gYXNfdGliYmxlKHBlYWsuQ1RDRikgJT4lIGJpbmRfY29scyhyZXN1bHRfdGliYmxlKSAlPiVcbiAgZHBseXI6OnNlbGVjdChzZXFuYW1lcywgc3RhcnQsIGVuZCwgYWxpZ25tZW50KVxuXG5md3JpdGUodGVtcCwgaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsubW90aWZBbm5vdGF0ZWQuYmVkXFwpLCBjb2wubmFtZXMgPSBGQUxTRSwgc2VwID0gXFxcXHRcXClcbmBgYFxuYGBgIn0= -->

```r
```r
peak.CTCF <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))

library(BSgenome.Mmusculus.UCSC.mm10)

# Extract sequences
sequences <- getSeq(BSgenome.Mmusculus.UCSC.mm10, peak.CTCF)


# Get the CTCF motif (or provide your own PWM)
ctcf_motif <- query(MotifDb, c(\CTCF\, \Mmusculus\))[[1]]

# Scan for the motif
motif_hits <- lapply(sequences, function(seq) {
    matchPWM(ctcf_motif, seq, min.score = \80%\) # Adjust min.score as needed
})

motif_hits_reverse <- lapply(sequences, function(seq) {
    matchPWM(ctcf_motif, reverseComplement(seq), min.score = \80%\)
})

# Combine results
result <- mapply(function(fwd, rev) {
    list(forward = fwd, reverse = rev)
}, motif_hits, motif_hits_reverse, SIMPLIFY = FALSE)


result[[5]]


result_tibble <- tibble(
    peak_id = seq_along(result), # Create an identifier for each peak
    alignment = map_chr(result, function(res) {
        has_fwd <- length(res$forward) > 0
        has_rev <- length(res$reverse) > 0
        
        if (has_fwd && has_rev) \fwdrev\
        else if (has_fwd) \fwd\
        else if (has_rev) \rev\
        else \none\
    })
)

temp <- as_tibble(peak.CTCF) %>% bind_cols(result_tibble) %>%
  dplyr::select(seqnames, start, end, alignment)

fwrite(temp, here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.motifAnnotated.bed\), col.names = FALSE, sep = \\t\)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZM1JqWmk1d1pXRnJJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0lqTXpNalE0WDBOVVEwWmZNRGN0TnpJNVgwSnlkV05sTFRSZmNHVmhhM011YldWeVoyVlFaV0ZyTG0xdmRHbG1RVzV1YjNSaGRHVmtMbUpsWkZ3aUtTbGNibU52Ykc1aGJXVnpLR04wWTJZdWNHVmhheWtnUEMwZ1l5aGNJbU5vY2x3aUxDQmNJbk4wWVhKMFhDSXNJRndpWlc1a1hDSXNJRndpYlc5MGFXWmNJaWxjYm1OMFkyWXVjR1ZoYXk1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9ZM1JqWmk1d1pXRnJMQ0JyWldWd0xtVjRkSEpoTG1OdmJIVnRibk1nUFNCVVVsVkZLVnh1WEc1Y2JtWnNZVzVyVTJsNlpTQThMU0F4WEc1blpXNWxMbFJUVXk1MFlpQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKdGJURXdYMGRTUTIwek9DNXdObDluWlc1bFgzTnZjblJsWkM1aVpXUmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGUlRVeUE5SUdsbVpXeHpaU2hXTkNBOVBTQmNJaXRjSWl3Z1ZqSXNJRll6S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCVVUxTnpkR0Z5ZENBOUlGUlRVeUF0SUdac1lXNXJVMmw2WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCVVUxTmxibVFnUFNCVVUxTWdLeUJtYkdGdWExTnBlbVVwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtGWXhMQ0JVVTFOemRHRnlkQ3dnVkZOVFpXNWtMQ0JXTkN3Z1ZqVXNJRlkyS1Z4dVkyOXNibUZ0WlhNb1oyVnVaUzVVVTFNdWRHSXBJRHd0SUdNb1hDSmphSEpjSWl3Z1hDSnpkR0Z5ZEZ3aUxDQmNJbVZ1WkZ3aUxDQmNJbk4wY21GdVpGd2lMQ0JjSW1kbGJtVmNJaXdnWENKbGJuTmxiV0pzWENJcFhHNWNiblJ6Y3k1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9aMlZ1WlM1VVUxTXVkR0lzSUd0bFpYQXVaWGgwY21FdVkyOXNkVzF1Y3lBOUlGUlNWVVVwWEc1Y2JtWjNaRjl3WldGcmN5QThMU0JqZEdObUxuQmxZV3N1WjNKYlkzUmpaaTV3WldGckxtZHlKRzF2ZEdsbUlDVnBiaVVnWXloY0ltWjNaRndpTENCY0ltWjNaSEpsZGx3aUtWMWNibkpsZGw5d1pXRnJjeUE4TFNCamRHTm1MbkJsWVdzdVozSmJZM1JqWmk1d1pXRnJMbWR5SkcxdmRHbG1JQ1ZwYmlVZ1l5aGNJbkpsZGx3aUxDQmNJbVozWkhKbGRsd2lLVjFjYmx4dUl5QkdhVzVrSUdOdmJuWmxjbWRsYm5RZ1ExUkRSaUJ3WVdseWN5Qm1iM0lnWldGamFDQlVVMU5jYm1OdmJuWmxjbWRsYm5SZmNHRnBjbk1nUEMwZ2JHRndjR3g1S0hObGNWOWhiRzl1WnloMGMzTXVaM0lwTENCbWRXNWpkR2x2YmlocEtTQjdYRzRnSUNBZ1kzVnljbVZ1ZEY5MGMzTWdQQzBnZEhOekxtZHlXMmxkWEc0Z0lDQWdYRzRnSUNBZ0l5QkdhV3gwWlhJZ2NHVmhhM01nYjI0Z2RHaGxJSE5oYldVZ1kyaHliMjF2YzI5dFpTQmhjeUIwYUdVZ1ZGTlRYRzRnSUNBZ1puZGtYM0JsWVd0elgyTm9jaUE4TFNCbWQyUmZjR1ZoYTNOYllYTXVZMmhoY21GamRHVnlLSE5sY1c1aGJXVnpLR1ozWkY5d1pXRnJjeWtwSUQwOUlHRnpMbU5vWVhKaFkzUmxjaWh6WlhGdVlXMWxjeWhqZFhKeVpXNTBYM1J6Y3lrcFhWeHVJQ0FnSUhKbGRsOXdaV0ZyYzE5amFISWdQQzBnY21WMlgzQmxZV3R6VzJGekxtTm9ZWEpoWTNSbGNpaHpaWEZ1WVcxbGN5aHlaWFpmY0dWaGEzTXBLU0E5UFNCaGN5NWphR0Z5WVdOMFpYSW9jMlZ4Ym1GdFpYTW9ZM1Z5Y21WdWRGOTBjM01wS1YxY2JpQWdJQ0JjYmlBZ0lDQWpJRVpwYm1RZ2RHaGxJR05zYjNObGMzUWdabTl5ZDJGeVpDQndaV0ZySUhSdklIUm9aU0JzWldaMElHOW1JSFJvWlNCVVUxTmNiaUFnSUNCc1pXWjBYMlozWkNBOExTQm1kMlJmY0dWaGEzTmZZMmh5VzNOMFlYSjBLR1ozWkY5d1pXRnJjMTlqYUhJcElEd2djM1JoY25Rb1kzVnljbVZ1ZEY5MGMzTXBYVnh1SUNBZ0lHTnNiM05sYzNSZlpuZGtJRHd0SUdsbUlDaHNaVzVuZEdnb2JHVm1kRjltZDJRcElENGdNQ2tnZTF4dUlDQWdJQ0FnYkdWbWRGOW1kMlJiZDJocFkyZ3ViV0Y0S0hOMFlYSjBLR3hsWm5SZlpuZGtLU2xkWEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lFNUJYRzRnSUNBZ2ZWeHVJQ0FnSUZ4dUlDQWdJQ01nUm1sdVpDQjBhR1VnWTJ4dmMyVnpkQ0J5WlhabGNuTmxJSEJsWVdzZ2RHOGdkR2hsSUhKcFoyaDBJRzltSUhSb1pTQlVVMU5jYmlBZ0lDQnlhV2RvZEY5eVpYWWdQQzBnY21WMlgzQmxZV3R6WDJOb2NsdHpkR0Z5ZENoeVpYWmZjR1ZoYTNOZlkyaHlLU0ErSUhOMFlYSjBLR04xY25KbGJuUmZkSE56S1YxY2JpQWdJQ0JqYkc5elpYTjBYM0psZGlBOExTQnBaaUFvYkdWdVozUm9LSEpwWjJoMFgzSmxkaWtnUGlBd0tTQjdYRzRnSUNBZ0lDQnlhV2RvZEY5eVpYWmJkMmhwWTJndWJXbHVLSE4wWVhKMEtISnBaMmgwWDNKbGRpa3BYVnh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCT1FWeHVJQ0FnSUgxY2JpQWdJQ0JjYmlBZ0lDQWpJRU52YldKcGJtVWdjbVZ6ZFd4MGN5QnBaaUJpYjNSb0lHTnNiM05sYzNRZ2NHVmhhM01nWlhocGMzUmNiaUFnSUNCcFppQW9JV2x6TG01aEtHTnNiM05sYzNSZlpuZGtLU0FtSmlBaGFYTXVibUVvWTJ4dmMyVnpkRjl5WlhZcEtTQjdYRzRnSUNBZ0lDQWdJSFJwWW1Kc1pTaGNiaUFnSUNBZ0lDQWdJQ0JqYUhKdmJURWdQU0JoY3k1amFHRnlZV04wWlhJb2MyVnhibUZ0WlhNb1kyeHZjMlZ6ZEY5bWQyUXBLU3hjYmlBZ0lDQWdJQ0FnSUNCemRHRnlkREVnUFNCemRHRnlkQ2hqYkc5elpYTjBYMlozWkNrc1hHNGdJQ0FnSUNBZ0lDQWdaVzVrTVNBOUlHVnVaQ2hqYkc5elpYTjBYMlozWkNrc1hHNGdJQ0FnSUNBZ0lDQWdZMmh5YjIweUlEMGdZWE11WTJoaGNtRmpkR1Z5S0hObGNXNWhiV1Z6S0dOc2IzTmxjM1JmY21WMktTa3NYRzRnSUNBZ0lDQWdJQ0FnYzNSaGNuUXlJRDBnYzNSaGNuUW9ZMnh2YzJWemRGOXlaWFlwTEZ4dUlDQWdJQ0FnSUNBZ0lHVnVaRElnUFNCbGJtUW9ZMnh2YzJWemRGOXlaWFlwTEZ4dUlDQWdJQ0FnSUNBZ0lHVnVjMlZ0WW13Z1BTQmpkWEp5Wlc1MFgzUnpjeVJsYm5ObGJXSnNMRnh1SUNBZ0lDQWdJQ0FwWEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdUbFZNVEZ4dUlDQWdJSDFjYm4wcFhHNWNiaU1nUTI5dFltbHVaU0J5WlhOMWJIUnpJR2x1ZEc4Z1lTQjBhV0ppYkdWY2JuSmxjM1ZzZEY5MGFXSmliR1VnUEMwZ1ltbHVaRjl5YjNkektHTnZiblpsY21kbGJuUmZjR0ZwY25NcFhHNWNibVozY21sMFpTaHlaWE4xYkhSZmRHbGlZbXhsTENCb1pYSmxLSEpsWmtScGNpd2dYQ0owYzNOZlkyOXVkbVZ5WjJWdWRGOWpkR05tWDIxdmRHbG1YM0JoYVhKekxtSmxaSEJsWENJcExDQnpaWEFnUFNCY0lseGNkRndpTENCamIyd3VibUZ0WlhNZ1BTQkdRVXhUUlNsY2JtWjNjbWwwWlNoblpXNWxMbFJUVXk1MFlpQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLREVzSURJc0lETXNJRFVwS1N3Z2FHVnlaU2h5WldaRWFYSXNJRndpZEhOelh6SmljQzVpWldSY0lpa3NJSE5sY0NBOUlGd2lYRngwWENJc0lHTnZiQzV1WVcxbGN5QTlJRVpCVEZORktWeHVYRzUwWlcxd0lEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW5SemMxOWpiMjUyWlhKblpXNTBYMk4wWTJaZmJXOTBhV1pmY0dGcGNuTXVZbVZrY0dWY0lpa3BJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRlkzSUQwOUlGd2lTMnhtTkZ3aUtWeHVYRzVtZDNKcGRHVW9ZWE5mZEdsaVlteGxLSFJsYlhBcExDQm9aWEpsS0hKbFprUnBjaXdnWENKMGMzTmZZMjl1ZG1WeVoyVnVkRjlqZEdObVgyMXZkR2xtWDNCaGFYSnpYMnRzWmpRdVltVmtjR1ZjSWlrc0lITmxjQ0E5SUZ3aVhGeDBYQ0lzSUdOdmJDNXVZVzFsY3lBOUlFWkJURk5GS1Z4dVhHNGpJRU5vWldOcmFXNW5JSE5wZW1VZ1pHbHpkSEpwWW5WMGFXOXVJRzltSUdOMFkyWWdjR0ZwY2x4dWRHVnRjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSjBjM05mWTI5dWRtVnlaMlZ1ZEY5amRHTm1YMjF2ZEdsbVgzQmhhWEp6TG1KbFpIQmxYQ0lwS1Z4dWRHVnRjQ0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLSE5wZW1VZ1BTQW9WallnS3lCV05Ta3ZNaUF0SUNoV015QXJJRll5S1M4eUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFpDQTlJSEJoYzNSbEtGWXhMQ0JXTWl3Z1ZqTXNJRlkxTENCV05pd2djMlZ3SUQwZ1hDSmZYQ0lwS1Z4dWRHVnRjQ0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR2xrTENCemFYcGxLU0FsUGlVZ1pHbHpkR2x1WTNRb0tWeHVYRzVuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCemFYcGxLU2tnS3lCblpXOXRYMmhwYzNSdlozSmhiU2dwSUNzZ2MyTmhiR1ZmZUY5amIyNTBhVzUxYjNWektHeGhZbVZzY3lBOUlHeGhZbVZzWDJ0aVgyMWlMQ0JzYVcxcGRITWdQU0JqS0RBc0lERmxOaWtwSUNzZ2MyTmhiR1ZmZVY5c2IyY3hNQ2dwSUNzZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1oyZDBhWFJzWlNoY0luTnBlbVVnWkdsemRISnBZblYwYVc5dUlHOW1JSE50WVd4c1pYTjBJR052Ym5abGNtZGxiblFnWTNSalppQndZV2x5Y3lCaGNtOTFibVFnWjJWdVpWd2lLVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmN0Y2YucGVhayA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFwzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5tb3RpZkFubm90YXRlZC5iZWRcXCkpXG5jb2xuYW1lcyhjdGNmLnBlYWspIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXG1vdGlmXFwpXG5jdGNmLnBlYWsuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGN0Y2YucGVhaywga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSlcblxuXG5mbGFua1NpemUgPC0gMVxuZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMyksXG4gICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsXG4gICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCwgVjQsIFY1LCBWNilcbmNvbG5hbWVzKGdlbmUuVFNTLnRiKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxzdHJhbmRcXCwgXFxnZW5lXFwsIFxcZW5zZW1ibFxcKVxuXG50c3MuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmUuVFNTLnRiLCBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKVxuXG5md2RfcGVha3MgPC0gY3RjZi5wZWFrLmdyW2N0Y2YucGVhay5nciRtb3RpZiAlaW4lIGMoXFxmd2RcXCwgXFxmd2RyZXZcXCldXG5yZXZfcGVha3MgPC0gY3RjZi5wZWFrLmdyW2N0Y2YucGVhay5nciRtb3RpZiAlaW4lIGMoXFxyZXZcXCwgXFxmd2RyZXZcXCldXG5cbiMgRmluZCBjb252ZXJnZW50IENUQ0YgcGFpcnMgZm9yIGVhY2ggVFNTXG5jb252ZXJnZW50X3BhaXJzIDwtIGxhcHBseShzZXFfYWxvbmcodHNzLmdyKSwgZnVuY3Rpb24oaSkge1xuICAgIGN1cnJlbnRfdHNzIDwtIHRzcy5ncltpXVxuICAgIFxuICAgICMgRmlsdGVyIHBlYWtzIG9uIHRoZSBzYW1lIGNocm9tb3NvbWUgYXMgdGhlIFRTU1xuICAgIGZ3ZF9wZWFrc19jaHIgPC0gZndkX3BlYWtzW2FzLmNoYXJhY3RlcihzZXFuYW1lcyhmd2RfcGVha3MpKSA9PSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMoY3VycmVudF90c3MpKV1cbiAgICByZXZfcGVha3NfY2hyIDwtIHJldl9wZWFrc1thcy5jaGFyYWN0ZXIoc2VxbmFtZXMocmV2X3BlYWtzKSkgPT0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKGN1cnJlbnRfdHNzKSldXG4gICAgXG4gICAgIyBGaW5kIHRoZSBjbG9zZXN0IGZvcndhcmQgcGVhayB0byB0aGUgbGVmdCBvZiB0aGUgVFNTXG4gICAgbGVmdF9md2QgPC0gZndkX3BlYWtzX2NocltzdGFydChmd2RfcGVha3NfY2hyKSA8IHN0YXJ0KGN1cnJlbnRfdHNzKV1cbiAgICBjbG9zZXN0X2Z3ZCA8LSBpZiAobGVuZ3RoKGxlZnRfZndkKSA+IDApIHtcbiAgICAgIGxlZnRfZndkW3doaWNoLm1heChzdGFydChsZWZ0X2Z3ZCkpXVxuICAgIH0gZWxzZSB7XG4gICAgICBOQVxuICAgIH1cbiAgICBcbiAgICAjIEZpbmQgdGhlIGNsb3Nlc3QgcmV2ZXJzZSBwZWFrIHRvIHRoZSByaWdodCBvZiB0aGUgVFNTXG4gICAgcmlnaHRfcmV2IDwtIHJldl9wZWFrc19jaHJbc3RhcnQocmV2X3BlYWtzX2NocikgPiBzdGFydChjdXJyZW50X3RzcyldXG4gICAgY2xvc2VzdF9yZXYgPC0gaWYgKGxlbmd0aChyaWdodF9yZXYpID4gMCkge1xuICAgICAgcmlnaHRfcmV2W3doaWNoLm1pbihzdGFydChyaWdodF9yZXYpKV1cbiAgICB9IGVsc2Uge1xuICAgICAgTkFcbiAgICB9XG4gICAgXG4gICAgIyBDb21iaW5lIHJlc3VsdHMgaWYgYm90aCBjbG9zZXN0IHBlYWtzIGV4aXN0XG4gICAgaWYgKCFpcy5uYShjbG9zZXN0X2Z3ZCkgJiYgIWlzLm5hKGNsb3Nlc3RfcmV2KSkge1xuICAgICAgICB0aWJibGUoXG4gICAgICAgICAgY2hyb20xID0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKGNsb3Nlc3RfZndkKSksXG4gICAgICAgICAgc3RhcnQxID0gc3RhcnQoY2xvc2VzdF9md2QpLFxuICAgICAgICAgIGVuZDEgPSBlbmQoY2xvc2VzdF9md2QpLFxuICAgICAgICAgIGNocm9tMiA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhjbG9zZXN0X3JldikpLFxuICAgICAgICAgIHN0YXJ0MiA9IHN0YXJ0KGNsb3Nlc3RfcmV2KSxcbiAgICAgICAgICBlbmQyID0gZW5kKGNsb3Nlc3RfcmV2KSxcbiAgICAgICAgICBlbnNlbWJsID0gY3VycmVudF90c3MkZW5zZW1ibCxcbiAgICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICAgIE5VTExcbiAgICB9XG59KVxuXG4jIENvbWJpbmUgcmVzdWx0cyBpbnRvIGEgdGliYmxlXG5yZXN1bHRfdGliYmxlIDwtIGJpbmRfcm93cyhjb252ZXJnZW50X3BhaXJzKVxuXG5md3JpdGUocmVzdWx0X3RpYmJsZSwgaGVyZShyZWZEaXIsIFxcdHNzX2NvbnZlcmdlbnRfY3RjZl9tb3RpZl9wYWlycy5iZWRwZVxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5md3JpdGUoZ2VuZS5UU1MudGIgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA1KSksIGhlcmUocmVmRGlyLCBcXHRzc18yYnAuYmVkXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcblxudGVtcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFx0c3NfY29udmVyZ2VudF9jdGNmX21vdGlmX3BhaXJzLmJlZHBlXFwpKSAlPiUgZHBseXI6OmZpbHRlcihWNyA9PSBcXEtsZjRcXClcblxuZndyaXRlKGFzX3RpYmJsZSh0ZW1wKSwgaGVyZShyZWZEaXIsIFxcdHNzX2NvbnZlcmdlbnRfY3RjZl9tb3RpZl9wYWlyc19rbGY0LmJlZHBlXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcblxuIyBDaGVja2luZyBzaXplIGRpc3RyaWJ1dGlvbiBvZiBjdGNmIHBhaXJcbnRlbXAgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcdHNzX2NvbnZlcmdlbnRfY3RjZl9tb3RpZl9wYWlycy5iZWRwZVxcKSlcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShzaXplID0gKFY2ICsgVjUpLzIgLSAoVjMgKyBWMikvMixcbiAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgVjIsIFYzLCBWNSwgVjYsIHNlcCA9IFxcX1xcKSlcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OnNlbGVjdChpZCwgc2l6ZSkgJT4lIGRpc3RpbmN0KClcblxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2l6ZSkpICsgZ2VvbV9oaXN0b2dyYW0oKSArIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYiwgbGltaXRzID0gYygwLCAxZTYpKSArIHNjYWxlX3lfbG9nMTAoKSArIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUoXFxzaXplIGRpc3RyaWJ1dGlvbiBvZiBzbWFsbGVzdCBjb252ZXJnZW50IGN0Y2YgcGFpcnMgYXJvdW5kIGdlbmVcXClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
ctcf.peak <- fread(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.motifAnnotated.bed\))
colnames(ctcf.peak) <- c(\chr\, \start\, \end\, \motif\)
ctcf.peak.gr <- makeGRangesFromDataFrame(ctcf.peak, keep.extra.columns = TRUE)


flankSize <- 1
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V4, V5, V6)
colnames(gene.TSS.tb) <- c(\chr\, \start\, \end\, \strand\, \gene\, \ensembl\)

tss.gr <- makeGRangesFromDataFrame(gene.TSS.tb, keep.extra.columns = TRUE)

fwd_peaks <- ctcf.peak.gr[ctcf.peak.gr$motif %in% c(\fwd\, \fwdrev\)]
rev_peaks <- ctcf.peak.gr[ctcf.peak.gr$motif %in% c(\rev\, \fwdrev\)]

# Find convergent CTCF pairs for each TSS
convergent_pairs <- lapply(seq_along(tss.gr), function(i) {
    current_tss <- tss.gr[i]
    
    # Filter peaks on the same chromosome as the TSS
    fwd_peaks_chr <- fwd_peaks[as.character(seqnames(fwd_peaks)) == as.character(seqnames(current_tss))]
    rev_peaks_chr <- rev_peaks[as.character(seqnames(rev_peaks)) == as.character(seqnames(current_tss))]
    
    # Find the closest forward peak to the left of the TSS
    left_fwd <- fwd_peaks_chr[start(fwd_peaks_chr) < start(current_tss)]
    closest_fwd <- if (length(left_fwd) > 0) {
      left_fwd[which.max(start(left_fwd))]
    } else {
      NA
    }
    
    # Find the closest reverse peak to the right of the TSS
    right_rev <- rev_peaks_chr[start(rev_peaks_chr) > start(current_tss)]
    closest_rev <- if (length(right_rev) > 0) {
      right_rev[which.min(start(right_rev))]
    } else {
      NA
    }
    
    # Combine results if both closest peaks exist
    if (!is.na(closest_fwd) && !is.na(closest_rev)) {
        tibble(
          chrom1 = as.character(seqnames(closest_fwd)),
          start1 = start(closest_fwd),
          end1 = end(closest_fwd),
          chrom2 = as.character(seqnames(closest_rev)),
          start2 = start(closest_rev),
          end2 = end(closest_rev),
          ensembl = current_tss$ensembl,
        )
    } else {
        NULL
    }
})

# Combine results into a tibble
result_tibble <- bind_rows(convergent_pairs)

fwrite(result_tibble, here(refDir, \tss_convergent_ctcf_motif_pairs.bedpe\), sep = \\t\, col.names = FALSE)
fwrite(gene.TSS.tb %>% dplyr::select(c(1, 2, 3, 5)), here(refDir, \tss_2bp.bed\), sep = \\t\, col.names = FALSE)

temp <- fread(here(refDir, \tss_convergent_ctcf_motif_pairs.bedpe\)) %>% dplyr::filter(V7 == \Klf4\)

fwrite(as_tibble(temp), here(refDir, \tss_convergent_ctcf_motif_pairs_klf4.bedpe\), sep = \\t\, col.names = FALSE)

# Checking size distribution of ctcf pair
temp <- fread(here(refDir, \tss_convergent_ctcf_motif_pairs.bedpe\))
temp <- temp %>% dplyr::mutate(size = (V6 + V5)/2 - (V3 + V2)/2,
                       id = paste(V1, V2, V3, V5, V6, sep = \_\))
temp <- temp %>% dplyr::select(id, size) %>% distinct()

ggplot(temp, aes(x = size)) + geom_histogram() + scale_x_continuous(labels = label_kb_mb, limits = c(0, 1e6)) + scale_y_log10() + theme_classic() + ggtitle(\size distribution of smallest convergent ctcf pairs around gene\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVkzUmpaaTV3WldGcklEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWERNek1qUTRYME5VUTBaZk1EY3ROekk1WDBKeWRXTmxMVFJmY0dWaGEzTXViV1Z5WjJWUVpXRnJMbTF2ZEdsbVFXNXViM1JoZEdWa0xtSmxaRnhjS1NsY2JtTnZiRzVoYldWektHTjBZMll1Y0dWaGF5a2dQQzBnWXloY1hHTm9jbHhjTENCY1hITjBZWEowWEZ3c0lGeGNaVzVrWEZ3c0lGeGNiVzkwYVdaY1hDbGNibU4wWTJZdWNHVmhheTVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1kzUmpaaTV3WldGckxDQnJaV1Z3TG1WNGRISmhMbU52YkhWdGJuTWdQU0JVVWxWRktWeHVYRzVjYm1ac1lXNXJVMmw2WlNBOExTQXhYRzVuWlc1bExsUlRVeTUwWWlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnh0YlRFd1gwZFNRMjB6T0M1d05sOW5aVzVsWDNOdmNuUmxaQzVpWldSY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0ZSVFV5QTlJR2xtWld4elpTaFdOQ0E5UFNCY1hDdGNYQ3dnVmpJc0lGWXpLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JVVTFOemRHRnlkQ0E5SUZSVFV5QXRJR1pzWVc1clUybDZaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JVVTFObGJtUWdQU0JVVTFNZ0t5Qm1iR0Z1YTFOcGVtVXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0ZZeExDQlVVMU56ZEdGeWRDd2dWRk5UWlc1a0xDQldOQ3dnVmpVc0lGWTJLVnh1WTI5c2JtRnRaWE1vWjJWdVpTNVVVMU11ZEdJcElEd3RJR01vWEZ4amFISmNYQ3dnWEZ4emRHRnlkRnhjTENCY1hHVnVaRnhjTENCY1hITjBjbUZ1WkZ4Y0xDQmNYR2RsYm1WY1hDd2dYRnhsYm5ObGJXSnNYRndwWEc1Y2JuUnpjeTVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1oyVnVaUzVVVTFNdWRHSXNJR3RsWlhBdVpYaDBjbUV1WTI5c2RXMXVjeUE5SUZSU1ZVVXBYRzVjYm1aM1pGOXdaV0ZyY3lBOExTQmpkR05tTG5CbFlXc3VaM0piWTNSalppNXdaV0ZyTG1keUpHMXZkR2xtSUNWcGJpVWdZeWhjWEdaM1pGeGNMQ0JjWEdaM1pISmxkbHhjS1YxY2JuSmxkbDl3WldGcmN5QThMU0JqZEdObUxuQmxZV3N1WjNKYlkzUmpaaTV3WldGckxtZHlKRzF2ZEdsbUlDVnBiaVVnWXloY1hISmxkbHhjTENCY1hHWjNaSEpsZGx4Y0tWMWNibHh1SXlCR2FXNWtJR052Ym5abGNtZGxiblFnUTFSRFJpQndZV2x5Y3lCbWIzSWdaV0ZqYUNCVVUxTmNibU52Ym5abGNtZGxiblJmY0dGcGNuTWdQQzBnYkdGd2NHeDVLSE5sY1Y5aGJHOXVaeWgwYzNNdVozSXBMQ0JtZFc1amRHbHZiaWhwS1NCN1hHNGdJQ0FnWTNWeWNtVnVkRjkwYzNNZ1BDMGdkSE56TG1keVcybGRYRzRnSUNBZ1hHNGdJQ0FnSXlCR2FXeDBaWElnY0dWaGEzTWdiMjRnZEdobElITmhiV1VnWTJoeWIyMXZjMjl0WlNCaGN5QjBhR1VnVkZOVFhHNGdJQ0FnWm5ka1gzQmxZV3R6WDJOb2NpQThMU0JtZDJSZmNHVmhhM05iWVhNdVkyaGhjbUZqZEdWeUtITmxjVzVoYldWektHWjNaRjl3WldGcmN5a3BJRDA5SUdGekxtTm9ZWEpoWTNSbGNpaHpaWEZ1WVcxbGN5aGpkWEp5Wlc1MFgzUnpjeWtwWFZ4dUlDQWdJSEpsZGw5d1pXRnJjMTlqYUhJZ1BDMGdjbVYyWDNCbFlXdHpXMkZ6TG1Ob1lYSmhZM1JsY2loelpYRnVZVzFsY3loeVpYWmZjR1ZoYTNNcEtTQTlQU0JoY3k1amFHRnlZV04wWlhJb2MyVnhibUZ0WlhNb1kzVnljbVZ1ZEY5MGMzTXBLVjFjYmlBZ0lDQmNiaUFnSUNBaklFWnBibVFnZEdobElHTnNiM05sYzNRZ1ptOXlkMkZ5WkNCd1pXRnJJSFJ2SUhSb1pTQnNaV1owSUc5bUlIUm9aU0JVVTFOY2JpQWdJQ0JzWldaMFgyWjNaQ0E4TFNCbWQyUmZjR1ZoYTNOZlkyaHlXM04wWVhKMEtHWjNaRjl3WldGcmMxOWphSElwSUR3Z2MzUmhjblFvWTNWeWNtVnVkRjkwYzNNcFhWeHVJQ0FnSUdOc2IzTmxjM1JmWm5ka0lEd3RJR2xtSUNoc1pXNW5kR2dvYkdWbWRGOW1kMlFwSUQ0Z01Da2dlMXh1SUNBZ0lDQWdiR1ZtZEY5bWQyUmJkMmhwWTJndWJXRjRLSE4wWVhKMEtHeGxablJmWm5ka0tTbGRYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUU1QlhHNGdJQ0FnZlZ4dUlDQWdJRnh1SUNBZ0lDTWdSbWx1WkNCMGFHVWdZMnh2YzJWemRDQnlaWFpsY25ObElIQmxZV3NnZEc4Z2RHaGxJSEpwWjJoMElHOW1JSFJvWlNCVVUxTmNiaUFnSUNCeWFXZG9kRjl5WlhZZ1BDMGdjbVYyWDNCbFlXdHpYMk5vY2x0emRHRnlkQ2h5WlhaZmNHVmhhM05mWTJoeUtTQStJSE4wWVhKMEtHTjFjbkpsYm5SZmRITnpLVjFjYmlBZ0lDQmpiRzl6WlhOMFgzSmxkaUE4TFNCcFppQW9iR1Z1WjNSb0tISnBaMmgwWDNKbGRpa2dQaUF3S1NCN1hHNGdJQ0FnSUNCeWFXZG9kRjl5WlhaYmQyaHBZMmd1YldsdUtITjBZWEowS0hKcFoyaDBYM0psZGlrcFhWeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0JPUVZ4dUlDQWdJSDFjYmlBZ0lDQmNiaUFnSUNBaklFTnZiV0pwYm1VZ2NtVnpkV3gwY3lCcFppQmliM1JvSUdOc2IzTmxjM1FnY0dWaGEzTWdaWGhwYzNSY2JpQWdJQ0JwWmlBb0lXbHpMbTVoS0dOc2IzTmxjM1JmWm5ka0tTQW1KaUFoYVhNdWJtRW9ZMnh2YzJWemRGOXlaWFlwS1NCN1hHNGdJQ0FnSUNBZ0lIUnBZbUpzWlNoY2JpQWdJQ0FnSUNBZ0lDQmphSEp2YlRFZ1BTQmhjeTVqYUdGeVlXTjBaWElvYzJWeGJtRnRaWE1vWTJ4dmMyVnpkRjltZDJRcEtTeGNiaUFnSUNBZ0lDQWdJQ0J6ZEdGeWRERWdQU0J6ZEdGeWRDaGpiRzl6WlhOMFgyWjNaQ2tzWEc0Z0lDQWdJQ0FnSUNBZ1pXNWtNU0E5SUdWdVpDaGpiRzl6WlhOMFgyWjNaQ2tzWEc0Z0lDQWdJQ0FnSUNBZ1kyaHliMjB5SUQwZ1lYTXVZMmhoY21GamRHVnlLSE5sY1c1aGJXVnpLR05zYjNObGMzUmZjbVYyS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdjM1JoY25ReUlEMGdjM1JoY25Rb1kyeHZjMlZ6ZEY5eVpYWXBMRnh1SUNBZ0lDQWdJQ0FnSUdWdVpESWdQU0JsYm1Rb1kyeHZjMlZ6ZEY5eVpYWXBMRnh1SUNBZ0lDQWdJQ0FnSUdWdWMyVnRZbXdnUFNCamRYSnlaVzUwWDNSemN5Umxibk5sYldKc0xGeHVJQ0FnSUNBZ0lDQXBYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ1RsVk1URnh1SUNBZ0lIMWNibjBwWEc1Y2JpTWdRMjl0WW1sdVpTQnlaWE4xYkhSeklHbHVkRzhnWVNCMGFXSmliR1ZjYm5KbGMzVnNkRjkwYVdKaWJHVWdQQzBnWW1sdVpGOXliM2R6S0dOdmJuWmxjbWRsYm5SZmNHRnBjbk1wWEc1Y2JtWjNjbWwwWlNoeVpYTjFiSFJmZEdsaVlteGxMQ0JvWlhKbEtISmxaa1JwY2l3Z1hGeDBjM05mWTI5dWRtVnlaMlZ1ZEY5amRHTm1YMjF2ZEdsbVgzQmhhWEp6TG1KbFpIQmxYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNMQ0JqYjJ3dWJtRnRaWE1nUFNCR1FVeFRSU2xjYm1aM2NtbDBaU2huWlc1bExsUlRVeTUwWWlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNc0lEVXBLU3dnYUdWeVpTaHlaV1pFYVhJc0lGeGNkSE56WHpKaWNDNWlaV1JjWENrc0lITmxjQ0E5SUZ4Y1hGeDBYRndzSUdOdmJDNXVZVzFsY3lBOUlFWkJURk5GS1Z4dVhHNTBaVzF3SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYSFJ6YzE5amIyNTJaWEpuWlc1MFgyTjBZMlpmYlc5MGFXWmZjR0ZwY25NdVltVmtjR1ZjWENrcElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtGWTNJRDA5SUZ4Y1MyeG1ORnhjS1Z4dVhHNW1kM0pwZEdVb1lYTmZkR2xpWW14bEtIUmxiWEFwTENCb1pYSmxLSEpsWmtScGNpd2dYRngwYzNOZlkyOXVkbVZ5WjJWdWRGOWpkR05tWDIxdmRHbG1YM0JoYVhKelgydHNaalF1WW1Wa2NHVmNYQ2tzSUhObGNDQTlJRnhjWEZ4MFhGd3NJR052YkM1dVlXMWxjeUE5SUVaQlRGTkZLVnh1WEc0aklFTm9aV05yYVc1bklITnBlbVVnWkdsemRISnBZblYwYVc5dUlHOW1JR04wWTJZZ2NHRnBjbHh1ZEdWdGNDQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4MGMzTmZZMjl1ZG1WeVoyVnVkRjlqZEdObVgyMXZkR2xtWDNCaGFYSnpMbUpsWkhCbFhGd3BLVnh1ZEdWdGNDQThMU0IwWlcxd0lDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtITnBlbVVnUFNBb1ZqWWdLeUJXTlNrdk1pQXRJQ2hXTXlBcklGWXlLUzh5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlIQmhjM1JsS0ZZeExDQldNaXdnVmpNc0lGWTFMQ0JXTml3Z2MyVndJRDBnWEZ4ZlhGd3BLVnh1ZEdWdGNDQThMU0IwWlcxd0lDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHbGtMQ0J6YVhwbEtTQWxQaVVnWkdsemRHbHVZM1FvS1Z4dVhHNW5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0J6YVhwbEtTa2dLeUJuWlc5dFgyaHBjM1J2WjNKaGJTZ3BJQ3NnYzJOaGJHVmZlRjlqYjI1MGFXNTFiM1Z6S0d4aFltVnNjeUE5SUd4aFltVnNYMnRpWDIxaUxDQnNhVzFwZEhNZ1BTQmpLREFzSURGbE5pa3BJQ3NnYzJOaGJHVmZlVjlzYjJjeE1DZ3BJQ3NnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWjJkMGFYUnNaU2hjWEhOcGVtVWdaR2x6ZEhKcFluVjBhVzl1SUc5bUlITnRZV3hzWlhOMElHTnZiblpsY21kbGJuUWdZM1JqWmlCd1lXbHljeUJoY205MWJtUWdaMlZ1WlZ4Y0tWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG5jdGNmLnBlYWsgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsubW90aWZBbm5vdGF0ZWQuYmVkXFwpKVxuY29sbmFtZXMoY3RjZi5wZWFrKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxtb3RpZlxcKVxuY3RjZi5wZWFrLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShjdGNmLnBlYWssIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpXG5cblxuZmxhbmtTaXplIDwtIDFcbmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLFxuICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLFxuICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY0LCBWNSwgVjYpXG5jb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcc3RyYW5kXFwsIFxcZ2VuZVxcLCBcXGVuc2VtYmxcXClcblxudHNzLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShnZW5lLlRTUy50Yiwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSlcblxuZndkX3BlYWtzIDwtIGN0Y2YucGVhay5ncltjdGNmLnBlYWsuZ3IkbW90aWYgJWluJSBjKFxcZndkXFwsIFxcZndkcmV2XFwpXVxucmV2X3BlYWtzIDwtIGN0Y2YucGVhay5ncltjdGNmLnBlYWsuZ3IkbW90aWYgJWluJSBjKFxccmV2XFwsIFxcZndkcmV2XFwpXVxuXG4jIEZpbmQgY29udmVyZ2VudCBDVENGIHBhaXJzIGZvciBlYWNoIFRTU1xuY29udmVyZ2VudF9wYWlycyA8LSBsYXBwbHkoc2VxX2Fsb25nKHRzcy5nciksIGZ1bmN0aW9uKGkpIHtcbiAgICBjdXJyZW50X3RzcyA8LSB0c3MuZ3JbaV1cbiAgICBcbiAgICAjIEZpbHRlciBwZWFrcyBvbiB0aGUgc2FtZSBjaHJvbW9zb21lIGFzIHRoZSBUU1NcbiAgICBmd2RfcGVha3NfY2hyIDwtIGZ3ZF9wZWFrc1thcy5jaGFyYWN0ZXIoc2VxbmFtZXMoZndkX3BlYWtzKSkgPT0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKGN1cnJlbnRfdHNzKSldXG4gICAgcmV2X3BlYWtzX2NociA8LSByZXZfcGVha3NbYXMuY2hhcmFjdGVyKHNlcW5hbWVzKHJldl9wZWFrcykpID09IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhjdXJyZW50X3RzcykpXVxuICAgIFxuICAgICMgRmluZCB0aGUgY2xvc2VzdCBmb3J3YXJkIHBlYWsgdG8gdGhlIGxlZnQgb2YgdGhlIFRTU1xuICAgIGxlZnRfZndkIDwtIGZ3ZF9wZWFrc19jaHJbc3RhcnQoZndkX3BlYWtzX2NocikgPCBzdGFydChjdXJyZW50X3RzcyldXG4gICAgY2xvc2VzdF9md2QgPC0gaWYgKGxlbmd0aChsZWZ0X2Z3ZCkgPiAwKSB7XG4gICAgICBsZWZ0X2Z3ZFt3aGljaC5tYXgoc3RhcnQobGVmdF9md2QpKV1cbiAgICB9IGVsc2Uge1xuICAgICAgTkFcbiAgICB9XG4gICAgXG4gICAgIyBGaW5kIHRoZSBjbG9zZXN0IHJldmVyc2UgcGVhayB0byB0aGUgcmlnaHQgb2YgdGhlIFRTU1xuICAgIHJpZ2h0X3JldiA8LSByZXZfcGVha3NfY2hyW3N0YXJ0KHJldl9wZWFrc19jaHIpID4gc3RhcnQoY3VycmVudF90c3MpXVxuICAgIGNsb3Nlc3RfcmV2IDwtIGlmIChsZW5ndGgocmlnaHRfcmV2KSA+IDApIHtcbiAgICAgIHJpZ2h0X3Jldlt3aGljaC5taW4oc3RhcnQocmlnaHRfcmV2KSldXG4gICAgfSBlbHNlIHtcbiAgICAgIE5BXG4gICAgfVxuICAgIFxuICAgICMgQ29tYmluZSByZXN1bHRzIGlmIGJvdGggY2xvc2VzdCBwZWFrcyBleGlzdFxuICAgIGlmICghaXMubmEoY2xvc2VzdF9md2QpICYmICFpcy5uYShjbG9zZXN0X3JldikpIHtcbiAgICAgICAgdGliYmxlKFxuICAgICAgICAgIGNocm9tMSA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhjbG9zZXN0X2Z3ZCkpLFxuICAgICAgICAgIHN0YXJ0MSA9IHN0YXJ0KGNsb3Nlc3RfZndkKSxcbiAgICAgICAgICBlbmQxID0gZW5kKGNsb3Nlc3RfZndkKSxcbiAgICAgICAgICBjaHJvbTIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMoY2xvc2VzdF9yZXYpKSxcbiAgICAgICAgICBzdGFydDIgPSBzdGFydChjbG9zZXN0X3JldiksXG4gICAgICAgICAgZW5kMiA9IGVuZChjbG9zZXN0X3JldiksXG4gICAgICAgICAgZW5zZW1ibCA9IGN1cnJlbnRfdHNzJGVuc2VtYmwsXG4gICAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgICBOVUxMXG4gICAgfVxufSlcblxuIyBDb21iaW5lIHJlc3VsdHMgaW50byBhIHRpYmJsZVxucmVzdWx0X3RpYmJsZSA8LSBiaW5kX3Jvd3MoY29udmVyZ2VudF9wYWlycylcblxuZndyaXRlKHJlc3VsdF90aWJibGUsIGhlcmUocmVmRGlyLCBcXHRzc19jb252ZXJnZW50X2N0Y2ZfbW90aWZfcGFpcnMuYmVkcGVcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuZndyaXRlKGdlbmUuVFNTLnRiICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNSkpLCBoZXJlKHJlZkRpciwgXFx0c3NfMmJwLmJlZFxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5cbnRlbXAgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcdHNzX2NvbnZlcmdlbnRfY3RjZl9tb3RpZl9wYWlycy5iZWRwZVxcKSkgJT4lIGRwbHlyOjpmaWx0ZXIoVjcgPT0gXFxLbGY0XFwpXG5cbmZ3cml0ZShhc190aWJibGUodGVtcCksIGhlcmUocmVmRGlyLCBcXHRzc19jb252ZXJnZW50X2N0Y2ZfbW90aWZfcGFpcnNfa2xmNC5iZWRwZVxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5cbiMgQ2hlY2tpbmcgc2l6ZSBkaXN0cmlidXRpb24gb2YgY3RjZiBwYWlyXG50ZW1wIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXHRzc19jb252ZXJnZW50X2N0Y2ZfbW90aWZfcGFpcnMuYmVkcGVcXCkpXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoc2l6ZSA9IChWNiArIFY1KS8yIC0gKFYzICsgVjIpLzIsXG4gICAgICAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIFYyLCBWMywgVjUsIFY2LCBzZXAgPSBcXF9cXCkpXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjpzZWxlY3QoaWQsIHNpemUpICU+JSBkaXN0aW5jdCgpXG5cbmdncGxvdCh0ZW1wLCBhZXMoeCA9IHNpemUpKSArIGdlb21faGlzdG9ncmFtKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIsIGxpbWl0cyA9IGMoMCwgMWU2KSkgKyBzY2FsZV95X2xvZzEwKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKFxcc2l6ZSBkaXN0cmlidXRpb24gb2Ygc21hbGxlc3QgY29udmVyZ2VudCBjdGNmIHBhaXJzIGFyb3VuZCBnZW5lXFwpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuY3RjZi5wZWFrIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLm1vdGlmQW5ub3RhdGVkLmJlZFxcKSlcbmNvbG5hbWVzKGN0Y2YucGVhaykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcbW90aWZcXClcbmN0Y2YucGVhay5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoY3RjZi5wZWFrLCBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKVxuXG5cbmZsYW5rU2l6ZSA8LSAxXG5nZW5lLlRTUy50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSxcbiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kLCBWNCwgVjUsIFY2KVxuY29sbmFtZXMoZ2VuZS5UU1MudGIpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXHN0cmFuZFxcLCBcXGdlbmVcXCwgXFxlbnNlbWJsXFwpXG5cbnRzcy5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS5UU1MudGIsIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpXG5cbmZ3ZF9wZWFrcyA8LSBjdGNmLnBlYWsuZ3JbY3RjZi5wZWFrLmdyJG1vdGlmICVpbiUgYyhcXGZ3ZFxcLCBcXGZ3ZHJldlxcKV1cbnJldl9wZWFrcyA8LSBjdGNmLnBlYWsuZ3JbY3RjZi5wZWFrLmdyJG1vdGlmICVpbiUgYyhcXHJldlxcLCBcXGZ3ZHJldlxcKV1cblxuIyBGaW5kIGNvbnZlcmdlbnQgQ1RDRiBwYWlycyBmb3IgZWFjaCBUU1NcbmNvbnZlcmdlbnRfcGFpcnMgPC0gbGFwcGx5KHNlcV9hbG9uZyh0c3MuZ3IpLCBmdW5jdGlvbihpKSB7XG4gICAgY3VycmVudF90c3MgPC0gdHNzLmdyW2ldXG4gICAgXG4gICAgIyBGaWx0ZXIgcGVha3Mgb24gdGhlIHNhbWUgY2hyb21vc29tZSBhcyB0aGUgVFNTXG4gICAgZndkX3BlYWtzX2NociA8LSBmd2RfcGVha3NbYXMuY2hhcmFjdGVyKHNlcW5hbWVzKGZ3ZF9wZWFrcykpID09IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhjdXJyZW50X3RzcykpXVxuICAgIHJldl9wZWFrc19jaHIgPC0gcmV2X3BlYWtzW2FzLmNoYXJhY3RlcihzZXFuYW1lcyhyZXZfcGVha3MpKSA9PSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMoY3VycmVudF90c3MpKV1cbiAgICBcbiAgICAjIEZpbmQgdGhlIGNsb3Nlc3QgZm9yd2FyZCBwZWFrIHRvIHRoZSBsZWZ0IG9mIHRoZSBUU1NcbiAgICBsZWZ0X2Z3ZCA8LSBmd2RfcGVha3NfY2hyW3N0YXJ0KGZ3ZF9wZWFrc19jaHIpIDwgc3RhcnQoY3VycmVudF90c3MpXVxuICAgIGNsb3Nlc3RfZndkIDwtIGlmIChsZW5ndGgobGVmdF9md2QpID4gMCkge1xuICAgICAgbGVmdF9md2Rbd2hpY2gubWF4KHN0YXJ0KGxlZnRfZndkKSldXG4gICAgfSBlbHNlIHtcbiAgICAgIE5BXG4gICAgfVxuICAgIFxuICAgICMgRmluZCB0aGUgY2xvc2VzdCByZXZlcnNlIHBlYWsgdG8gdGhlIHJpZ2h0IG9mIHRoZSBUU1NcbiAgICByaWdodF9yZXYgPC0gcmV2X3BlYWtzX2NocltzdGFydChyZXZfcGVha3NfY2hyKSA+IHN0YXJ0KGN1cnJlbnRfdHNzKV1cbiAgICBjbG9zZXN0X3JldiA8LSBpZiAobGVuZ3RoKHJpZ2h0X3JldikgPiAwKSB7XG4gICAgICByaWdodF9yZXZbd2hpY2gubWluKHN0YXJ0KHJpZ2h0X3JldikpXVxuICAgIH0gZWxzZSB7XG4gICAgICBOQVxuICAgIH1cbiAgICBcbiAgICAjIENvbWJpbmUgcmVzdWx0cyBpZiBib3RoIGNsb3Nlc3QgcGVha3MgZXhpc3RcbiAgICBpZiAoIWlzLm5hKGNsb3Nlc3RfZndkKSAmJiAhaXMubmEoY2xvc2VzdF9yZXYpKSB7XG4gICAgICAgIHRpYmJsZShcbiAgICAgICAgICBjaHJvbTEgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMoY2xvc2VzdF9md2QpKSxcbiAgICAgICAgICBzdGFydDEgPSBzdGFydChjbG9zZXN0X2Z3ZCksXG4gICAgICAgICAgZW5kMSA9IGVuZChjbG9zZXN0X2Z3ZCksXG4gICAgICAgICAgY2hyb20yID0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKGNsb3Nlc3RfcmV2KSksXG4gICAgICAgICAgc3RhcnQyID0gc3RhcnQoY2xvc2VzdF9yZXYpLFxuICAgICAgICAgIGVuZDIgPSBlbmQoY2xvc2VzdF9yZXYpLFxuICAgICAgICAgIGVuc2VtYmwgPSBjdXJyZW50X3RzcyRlbnNlbWJsLFxuICAgICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgICAgTlVMTFxuICAgIH1cbn0pXG5cbiMgQ29tYmluZSByZXN1bHRzIGludG8gYSB0aWJibGVcbnJlc3VsdF90aWJibGUgPC0gYmluZF9yb3dzKGNvbnZlcmdlbnRfcGFpcnMpXG5cbmZ3cml0ZShyZXN1bHRfdGliYmxlLCBoZXJlKHJlZkRpciwgXFx0c3NfY29udmVyZ2VudF9jdGNmX21vdGlmX3BhaXJzLmJlZHBlXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbmZ3cml0ZShnZW5lLlRTUy50YiAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDUpKSwgaGVyZShyZWZEaXIsIFxcdHNzXzJicC5iZWRcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuXG50ZW1wIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXHRzc19jb252ZXJnZW50X2N0Y2ZfbW90aWZfcGFpcnMuYmVkcGVcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKFY3ID09IFxcS2xmNFxcKVxuXG5md3JpdGUoYXNfdGliYmxlKHRlbXApLCBoZXJlKHJlZkRpciwgXFx0c3NfY29udmVyZ2VudF9jdGNmX21vdGlmX3BhaXJzX2tsZjQuYmVkcGVcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuXG4jIENoZWNraW5nIHNpemUgZGlzdHJpYnV0aW9uIG9mIGN0Y2YgcGFpclxudGVtcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFx0c3NfY29udmVyZ2VudF9jdGNmX21vdGlmX3BhaXJzLmJlZHBlXFwpKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKHNpemUgPSAoVjYgKyBWNSkvMiAtIChWMyArIFYyKS8yLFxuICAgICAgICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBWMiwgVjMsIFY1LCBWNiwgc2VwID0gXFxfXFwpKVxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6c2VsZWN0KGlkLCBzaXplKSAlPiUgZGlzdGluY3QoKVxuXG5nZ3Bsb3QodGVtcCwgYWVzKHggPSBzaXplKSkgKyBnZW9tX2hpc3RvZ3JhbSgpICsgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iLCBsaW1pdHMgPSBjKDAsIDFlNikpICsgc2NhbGVfeV9sb2cxMCgpICsgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShcXHNpemUgZGlzdHJpYnV0aW9uIG9mIHNtYWxsZXN0IGNvbnZlcmdlbnQgY3RjZiBwYWlycyBhcm91bmQgZ2VuZVxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
ctcf.peak <- fread(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.motifAnnotated.bed\))
colnames(ctcf.peak) <- c(\chr\, \start\, \end\, \motif\)
ctcf.peak.gr <- makeGRangesFromDataFrame(ctcf.peak, keep.extra.columns = TRUE)


flankSize <- 1
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V4, V5, V6)
colnames(gene.TSS.tb) <- c(\chr\, \start\, \end\, \strand\, \gene\, \ensembl\)

tss.gr <- makeGRangesFromDataFrame(gene.TSS.tb, keep.extra.columns = TRUE)

fwd_peaks <- ctcf.peak.gr[ctcf.peak.gr$motif %in% c(\fwd\, \fwdrev\)]
rev_peaks <- ctcf.peak.gr[ctcf.peak.gr$motif %in% c(\rev\, \fwdrev\)]

# Find convergent CTCF pairs for each TSS
convergent_pairs <- lapply(seq_along(tss.gr), function(i) {
    current_tss <- tss.gr[i]
    
    # Filter peaks on the same chromosome as the TSS
    fwd_peaks_chr <- fwd_peaks[as.character(seqnames(fwd_peaks)) == as.character(seqnames(current_tss))]
    rev_peaks_chr <- rev_peaks[as.character(seqnames(rev_peaks)) == as.character(seqnames(current_tss))]
    
    # Find the closest forward peak to the left of the TSS
    left_fwd <- fwd_peaks_chr[start(fwd_peaks_chr) < start(current_tss)]
    closest_fwd <- if (length(left_fwd) > 0) {
      left_fwd[which.max(start(left_fwd))]
    } else {
      NA
    }
    
    # Find the closest reverse peak to the right of the TSS
    right_rev <- rev_peaks_chr[start(rev_peaks_chr) > start(current_tss)]
    closest_rev <- if (length(right_rev) > 0) {
      right_rev[which.min(start(right_rev))]
    } else {
      NA
    }
    
    # Combine results if both closest peaks exist
    if (!is.na(closest_fwd) && !is.na(closest_rev)) {
        tibble(
          chrom1 = as.character(seqnames(closest_fwd)),
          start1 = start(closest_fwd),
          end1 = end(closest_fwd),
          chrom2 = as.character(seqnames(closest_rev)),
          start2 = start(closest_rev),
          end2 = end(closest_rev),
          ensembl = current_tss$ensembl,
        )
    } else {
        NULL
    }
})

# Combine results into a tibble
result_tibble <- bind_rows(convergent_pairs)

fwrite(result_tibble, here(refDir, \tss_convergent_ctcf_motif_pairs.bedpe\), sep = \\t\, col.names = FALSE)
fwrite(gene.TSS.tb %>% dplyr::select(c(1, 2, 3, 5)), here(refDir, \tss_2bp.bed\), sep = \\t\, col.names = FALSE)

temp <- fread(here(refDir, \tss_convergent_ctcf_motif_pairs.bedpe\)) %>% dplyr::filter(V7 == \Klf4\)

fwrite(as_tibble(temp), here(refDir, \tss_convergent_ctcf_motif_pairs_klf4.bedpe\), sep = \\t\, col.names = FALSE)

# Checking size distribution of ctcf pair
temp <- fread(here(refDir, \tss_convergent_ctcf_motif_pairs.bedpe\))
temp <- temp %>% dplyr::mutate(size = (V6 + V5)/2 - (V3 + V2)/2,
                       id = paste(V1, V2, V3, V5, V6, sep = \_\))
temp <- temp %>% dplyr::select(id, size) %>% distinct()

ggplot(temp, aes(x = size)) + geom_histogram() + scale_x_continuous(labels = label_kb_mb, limits = c(0, 1e6)) + scale_y_log10() + theme_classic() + ggtitle(\size distribution of smallest convergent ctcf pairs around gene\)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [2.34] Checking CTCF motif orientation
#### Calculating CTCF motif

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVabXhoYm10VGFYcGxJRHd0SURGY2JtZGxibVV1VkZOVExuUmlJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltMXRNVEJmUjFKRGJUTTRMbkEyWDJkbGJtVmZjMjl5ZEdWa0xtSmxaRndpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9WRk5USUQwZ2FXWmxiSE5sS0ZZMElEMDlJRndpSzF3aUxDQldNaXdnVmpNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlRVM04wWVhKMElEMGdWRk5USUMwZ1pteGhibXRUYVhwbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlRVMlZ1WkNBOUlGUlRVeUFySUdac1lXNXJVMmw2WlNrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9WakVzSUZSVFUzTjBZWEowTENCVVUxTmxibVFzSUZZMExDQldOU3dnVmpZcFhHNWpiMnh1WVcxbGN5aG5aVzVsTGxSVFV5NTBZaWtnUEMwZ1l5aGNJbU5vY2x3aUxDQmNJbk4wWVhKMFhDSXNJRndpWlc1a1hDSXNJRndpYzNSeVlXNWtYQ0lzSUZ3aVoyVnVaVndpTENCY0ltVnVjMlZ0WW14Y0lpbGNibWRsYm1WRmJuTmxiV0pzVUdGcGNpQThMU0JuWlc1bExsUlRVeTUwWWlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoblpXNWxMQ0JsYm5ObGJXSnNLVnh1WEc1aWIzVnVaR0Z5ZVM1d1lXbHlJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0luUnpjMTlqYjI1MlpYSm5aVzUwWDJOMFkyWmZiVzkwYVdaZmNHRnBjbk11WW1Wa2NHVmNJaWtwWEc1amIyeHVZVzFsY3loaWIzVnVaR0Z5ZVM1d1lXbHlLU0E4TFNCaktGd2lZbTkxYm1SaGNubGZZMmh5YjIweFhDSXNJRndpWW05MWJtUmhjbmxmYzNSaGNuUXhYQ0lzSUZ3aVltOTFibVJoY25sZlpXNWtNVndpTENCY0ltSnZkVzVrWVhKNVgyTm9jbTl0TWx3aUxDQmNJbUp2ZFc1a1lYSjVYM04wWVhKME1sd2lMQ0JjSW1KdmRXNWtZWEo1WDJWdVpESmNJaXdnWENKbGJuTmxiV0pzWENJcFhHNWliM1Z1WkdGeWVTNXdZV2x5SUR3dElHSnZkVzVrWVhKNUxuQmhhWElnSlQ0bElHUndiSGx5T2pwc1pXWjBYMnB2YVc0b1oyVnVaVVZ1YzJWdFlteFFZV2x5TENCaWVTQTlJR01vWENKbGJuTmxiV0pzWENJcEtWeHVYRzVjYmlNZ1NXMXdiM0owYVc1bklHeHZiM0FnWjJWdVpTQmhibTV2ZEdGMGFXOXVYRzV1WVcxbElEd3RJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVndpWEc1a2FXWm1RM1YwYjJabUlEd3RJREF1TWx4dVoyVnVaVUZ1Ym05RVlYUmhJRHd0SUd4dllXUk1iMjl3UVc1dWIwUmhkR0VvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNJbDl3TFc1ZlpXNXpaVzFpYkV4cGMzUXVkSE4yWENJcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsbVprTjFkRzltWmlBOUlHUnBabVpEZFhSdlptWXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGdWJtOU1hWE4wSUQwZ1l5aGNJbEF0VUZ3aUxDQmNJbEF0UlZ3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWXlneExDQXlMQ0F6TENBMExDQTFMQ0EyTENBeE1Td2dNVElzSURJMExDQXlPU3dnTXpFcEtTQWxQaVVnZFc1dVpYTjBLR2RsYm1VcFhHNWNibHh1WkdGMFlTQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcHNaV1owWDJwdmFXNG9ZbTkxYm1SaGNua3VjR0ZwY2l3Z1lua2dQU0JqS0Z3aVoyVnVaVndpSUQwZ1hDSmxibk5sYldKc1hDSXBLVnh1WEc1a1lYUmhJRHd0SUdSaGRHRWdKVDRsSUhKdmQzZHBjMlVvS1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNocGMxZHBkR2hwYmt4bFpuUkNaQ0E5SUNoaWIzVnVaR0Z5ZVY5emRHRnlkREVnUEQwZ2JXbHVLR1Z1WkRFc0lHVnVaRElwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVhOWGFYUm9hVzVTYVdkb2RFSmtJRDBnS0dKdmRXNWtZWEo1WDJWdVpESWdQajBnYldGNEtITjBZWEowTVN3Z2MzUmhjblF5S1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdselYybDBhR2x1UW1RZ1BTQnBjMWRwZEdocGJreGxablJDWkNBbUlHbHpWMmwwYUdsdVVtbG5hSFJDWkNsY2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pISnZjRjl1WVNncFhHNWNibHh1WjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1JFMVRUeXdnZVNBOUlHUlVRVWNwS1NBcklHZGxiMjFmY0c5cGJuUW9LU0FySUdOdmIzSmtYMlpwZUdWa0tDa2dLeUFnWEc0Z0lHZGxiMjFmWVdKc2FXNWxLSE5zYjNCbElEMGdNU3dnYVc1MFpYSmpaWEIwSUQwZ01Dd2dZMjlzSUQwZ1hDSm5jbVY1TlRCY0lpd2diR2x1WlhSNWNHVWdQU0JjSW1SaGMyaGxaRndpS1NBclhHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ3aVozSmxlVndpS1NBclhHNGdJR2RsYjIxZmRteHBibVVvZUdsdWRHVnlZMlZ3ZENBOUlEQXNJR0ZzY0doaElEMGdNQzQxTENCamIyeHZjaUE5SUZ3aVozSmxlVndpS1NBclhHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJR1poWTJWMFgzZHlZWEFvZmlCcGMxZHBkR2hwYmtKa0tWeHVYRzVuWjNCc2IzUW9aR0YwWVN3Z1lXVnpLSGdnUFNCcGMxZHBkR2hwYmtKa0xDQjVJRDBnWkdsbVpsOWtWRUZIWDBSTlUwOHNJR1pwYkd3Z1BTQnBjMWRwZEdocGJrSmtLU2tnS3lCblpXOXRYM1pwYjJ4cGJpZ3BJQ3NnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBcFhHNWNibHh1WjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGdJR1JwYzNSaGJtTmxNU0E4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhwYzFkcGRHaHBia0prSUQwOVozSnZkWEF4S1NBcEpHUnBabVpmWkZSQlIxOUVUVk5QWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHBjMWRwZEdocGJrSmtJRDA5WjNKdmRYQXlLU0FwSkdScFptWmZaRlJCUjE5RVRWTlBYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzVuWlhSUWRtRnNWMmxzWTI5NEtHUmhkR0VzSUZSU1ZVVXNJRVpCVEZORktWeHVYRzVjYmlNZ1VISnZjRzl5ZEdsdmJpQnZaaUIwYUc5elpTQm5aVzVsSUdKbGRIZGxaVzRnWjNKdmRYQXhJR0Z1WkNCbmNtOTFjREpjYm1SaGRHRXVhWE5YYVhSb2FXNUNaQ0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2x6VjJsMGFHbHVRbVFwWEc1Y2JtZGxibVV1WjNKdmRYQXhJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjlpYVc1aGNubEhjbTkxY0RFdWRITjJYQ0lwS1NSblpXNWxYRzVuWlc1bExtZHliM1Z3TWlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0puWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlltbHVZWEo1UjNKdmRYQXlMblJ6ZGx3aUtTa2taMlZ1WlZ4dVhHNXpkVzBvWjJWdVpTNW5jbTkxY0RFZ0pXbHVKU0JrWVhSaExtbHpWMmwwYUdsdVFtUWtaMlZ1WlNrdmJHVnVaM1JvS0dkbGJtVXVaM0p2ZFhBeEtTb3hNREJjYmx4dWMzVnRLR2RsYm1VdVozSnZkWEF5SUNWcGJpVWdaR0YwWVM1cGMxZHBkR2hwYmtKa0pHZGxibVVwTDJ4bGJtZDBhQ2huWlc1bExtZHliM1Z3TWlrcU1UQXdYRzVjYmlNZ1EyaGxZMnRwYm1jZ2MybDZaU0J2WmlCMGFHOXpaU0JzYjI5d2MxeHVaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dScGMzUmhibU5sSUQwZ2MzUmhjblF5SUMwZ2MzUmhjblF4S1Z4dVhHNW5aM0JzYjNRb1pHRjBZU3dnWVdWektIZ2dQU0JwYzFkcGRHaHBia0prTENCNUlEMGdaR2x6ZEdGdVkyVXNJR1pwYkd3Z1BTQnBjMWRwZEdocGJrSmtLU2tnS3lCblpXOXRYM1pwYjJ4cGJpZ3BJQ3NnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LVnh1WEc1Y2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxuZmxhbmtTaXplIDwtIDFcbmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLFxuICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLFxuICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY0LCBWNSwgVjYpXG5jb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcc3RyYW5kXFwsIFxcZ2VuZVxcLCBcXGVuc2VtYmxcXClcbmdlbmVFbnNlbWJsUGFpciA8LSBnZW5lLlRTUy50YiAlPiUgZHBseXI6OnNlbGVjdChnZW5lLCBlbnNlbWJsKVxuXG5ib3VuZGFyeS5wYWlyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXHRzc19jb252ZXJnZW50X2N0Y2ZfbW90aWZfcGFpcnMuYmVkcGVcXCkpXG5jb2xuYW1lcyhib3VuZGFyeS5wYWlyKSA8LSBjKFxcYm91bmRhcnlfY2hyb20xXFwsIFxcYm91bmRhcnlfc3RhcnQxXFwsIFxcYm91bmRhcnlfZW5kMVxcLCBcXGJvdW5kYXJ5X2Nocm9tMlxcLCBcXGJvdW5kYXJ5X3N0YXJ0MlxcLCBcXGJvdW5kYXJ5X2VuZDJcXCwgXFxlbnNlbWJsXFwpXG5ib3VuZGFyeS5wYWlyIDwtIGJvdW5kYXJ5LnBhaXIgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZUVuc2VtYmxQYWlyLCBieSA9IGMoXFxlbnNlbWJsXFwpKVxuXG5cbiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2LCAxMSwgMTIsIDI0LCAyOSwgMzEpKSAlPiUgdW5uZXN0KGdlbmUpXG5cblxuZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oYm91bmRhcnkucGFpciwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsXFwpKVxuXG5kYXRhIDwtIGRhdGEgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShpc1dpdGhpbkxlZnRCZCA9IChib3VuZGFyeV9zdGFydDEgPD0gbWluKGVuZDEsIGVuZDIpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgaXNXaXRoaW5SaWdodEJkID0gKGJvdW5kYXJ5X2VuZDIgPj0gbWF4KHN0YXJ0MSwgc3RhcnQyKSksXG4gICAgICAgICAgICAgICAgICAgICAgIGlzV2l0aGluQmQgPSBpc1dpdGhpbkxlZnRCZCAmIGlzV2l0aGluUmlnaHRCZClcbmRhdGEgPC0gZGF0YSAlPiUgZHJvcF9uYSgpXG5cblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gRE1TTywgeSA9IGRUQUcpKSArIGdlb21fcG9pbnQoKSArIGNvb3JkX2ZpeGVkKCkgKyAgXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGZhY2V0X3dyYXAofiBpc1dpdGhpbkJkKVxuXG5nZ3Bsb3QoZGF0YSwgYWVzKHggPSBpc1dpdGhpbkJkLCB5ID0gZGlmZl9kVEFHX0RNU08sIGZpbGwgPSBpc1dpdGhpbkJkKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApXG5cblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihpc1dpdGhpbkJkID09Z3JvdXAxKSApJGRpZmZfZFRBR19ETVNPXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihpc1dpdGhpbkJkID09Z3JvdXAyKSApJGRpZmZfZFRBR19ETVNPXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5nZXRQdmFsV2lsY294KGRhdGEsIFRSVUUsIEZBTFNFKVxuXG5cbiMgUHJvcG9ydGlvbiBvZiB0aG9zZSBnZW5lIGJldHdlZW4gZ3JvdXAxIGFuZCBncm91cDJcbmRhdGEuaXNXaXRoaW5CZCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGlzV2l0aGluQmQpXG5cbmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5nZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5zdW0oZ2VuZS5ncm91cDEgJWluJSBkYXRhLmlzV2l0aGluQmQkZ2VuZSkvbGVuZ3RoKGdlbmUuZ3JvdXAxKSoxMDBcblxuc3VtKGdlbmUuZ3JvdXAyICVpbiUgZGF0YS5pc1dpdGhpbkJkJGdlbmUpL2xlbmd0aChnZW5lLmdyb3VwMikqMTAwXG5cbiMgQ2hlY2tpbmcgc2l6ZSBvZiB0aG9zZSBsb29wc1xuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKVxuXG5nZ3Bsb3QoZGF0YSwgYWVzKHggPSBpc1dpdGhpbkJkLCB5ID0gZGlzdGFuY2UsIGZpbGwgPSBpc1dpdGhpbkJkKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
flankSize <- 1
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V4, V5, V6)
colnames(gene.TSS.tb) <- c(\chr\, \start\, \end\, \strand\, \gene\, \ensembl\)
geneEnsemblPair <- gene.TSS.tb %>% dplyr::select(gene, ensembl)

boundary.pair <- fread(here(refDir, \tss_convergent_ctcf_motif_pairs.bedpe\))
colnames(boundary.pair) <- c(\boundary_chrom1\, \boundary_start1\, \boundary_end1\, \boundary_chrom2\, \boundary_start2\, \boundary_end2\, \ensembl\)
boundary.pair <- boundary.pair %>% dplyr::left_join(geneEnsemblPair, by = c(\ensembl\))


# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\
diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\)) %>%
  dplyr::select(c(1, 2, 3, 4, 5, 6, 11, 12, 24, 29, 31)) %>% unnest(gene)


data <- geneAnnoData %>% dplyr::left_join(boundary.pair, by = c(\gene\ = \ensembl\))

data <- data %>% rowwise() %>% dplyr::mutate(isWithinLeftBd = (boundary_start1 <= min(end1, end2)),
                       isWithinRightBd = (boundary_end2 >= max(start1, start2)),
                       isWithinBd = isWithinLeftBd & isWithinRightBd)
data <- data %>% drop_na()


ggplot(data, aes(x = DMSO, y = dTAG)) + geom_point() + coord_fixed() +  
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  theme_classic() + facet_wrap(~ isWithinBd)

ggplot(data, aes(x = isWithinBd, y = diff_dTAG_DMSO, fill = isWithinBd)) + geom_violin() + geom_boxplot(width = 0.1) + theme_classic() +
  geom_hline(yintercept = 0)


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(isWithinBd ==group1) )$diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(isWithinBd ==group2) )$diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

getPvalWilcox(data, TRUE, FALSE)


# Proportion of those gene between group1 and group2
data.isWithinBd <- data %>% dplyr::filter(isWithinBd)

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

sum(gene.group1 %in% data.isWithinBd$gene)/length(gene.group1)*100

sum(gene.group2 %in% data.isWithinBd$gene)/length(gene.group2)*100

# Checking size of those loops
data <- data %>% dplyr::mutate(distance = start2 - start1)

ggplot(data, aes(x = isWithinBd, y = distance, fill = isWithinBd)) + geom_violin() + geom_boxplot(width = 0.1) + theme_classic()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVpteGhibXRUYVhwbElEd3RJREZjYm1kbGJtVXVWRk5UTG5SaUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEcxdE1UQmZSMUpEYlRNNExuQTJYMmRsYm1WZmMyOXlkR1ZrTG1KbFpGeGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ZGTlRJRDBnYVdabGJITmxLRlkwSUQwOUlGeGNLMXhjTENCV01pd2dWak1wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSVFUzTjBZWEowSUQwZ1ZGTlRJQzBnWm14aGJtdFRhWHBsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSVFUyVnVaQ0E5SUZSVFV5QXJJR1pzWVc1clUybDZaU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1ZqRXNJRlJUVTNOMFlYSjBMQ0JVVTFObGJtUXNJRlkwTENCV05Td2dWallwWEc1amIyeHVZVzFsY3loblpXNWxMbFJUVXk1MFlpa2dQQzBnWXloY1hHTm9jbHhjTENCY1hITjBZWEowWEZ3c0lGeGNaVzVrWEZ3c0lGeGNjM1J5WVc1a1hGd3NJRnhjWjJWdVpWeGNMQ0JjWEdWdWMyVnRZbXhjWENsY2JtZGxibVZGYm5ObGJXSnNVR0ZwY2lBOExTQm5aVzVsTGxSVFV5NTBZaUFsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2huWlc1bExDQmxibk5sYldKc0tWeHVYRzVpYjNWdVpHRnllUzV3WVdseUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEhSemMxOWpiMjUyWlhKblpXNTBYMk4wWTJaZmJXOTBhV1pmY0dGcGNuTXVZbVZrY0dWY1hDa3BYRzVqYjJ4dVlXMWxjeWhpYjNWdVpHRnllUzV3WVdseUtTQThMU0JqS0Z4Y1ltOTFibVJoY25sZlkyaHliMjB4WEZ3c0lGeGNZbTkxYm1SaGNubGZjM1JoY25ReFhGd3NJRnhjWW05MWJtUmhjbmxmWlc1a01WeGNMQ0JjWEdKdmRXNWtZWEo1WDJOb2NtOXRNbHhjTENCY1hHSnZkVzVrWVhKNVgzTjBZWEowTWx4Y0xDQmNYR0p2ZFc1a1lYSjVYMlZ1WkRKY1hDd2dYRnhsYm5ObGJXSnNYRndwWEc1aWIzVnVaR0Z5ZVM1d1lXbHlJRHd0SUdKdmRXNWtZWEo1TG5CaGFYSWdKVDRsSUdSd2JIbHlPanBzWldaMFgycHZhVzRvWjJWdVpVVnVjMlZ0WW14UVlXbHlMQ0JpZVNBOUlHTW9YRnhsYm5ObGJXSnNYRndwS1Z4dVhHNWNiaU1nU1cxd2IzSjBhVzVuSUd4dmIzQWdaMlZ1WlNCaGJtNXZkR0YwYVc5dVhHNXVZVzFsSUR3dElGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWeGNYRzVrYVdabVEzVjBiMlptSUR3dElEQXVNbHh1WjJWdVpVRnVibTlFWVhSaElEd3RJR3h2WVdSTWIyOXdRVzV1YjBSaGRHRW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY1hGOXdMVzVmWlc1elpXMWliRXhwYzNRdWRITjJYRndwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2xtWmtOMWRHOW1aaUE5SUdScFptWkRkWFJ2Wm1Zc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0Z1Ym05TWFYTjBJRDBnWXloY1hGQXRVRnhjTENCY1hGQXRSVnhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWd4TENBeUxDQXpMQ0EwTENBMUxDQTJMQ0F4TVN3Z01USXNJREkwTENBeU9Td2dNekVwS1NBbFBpVWdkVzV1WlhOMEtHZGxibVVwWEc1Y2JseHVaR0YwWVNBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwc1pXWjBYMnB2YVc0b1ltOTFibVJoY25rdWNHRnBjaXdnWW5rZ1BTQmpLRnhjWjJWdVpWeGNJRDBnWEZ4bGJuTmxiV0pzWEZ3cEtWeHVYRzVrWVhSaElEd3RJR1JoZEdFZ0pUNGxJSEp2ZDNkcGMyVW9LU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hwYzFkcGRHaHBia3hsWm5SQ1pDQTlJQ2hpYjNWdVpHRnllVjl6ZEdGeWRERWdQRDBnYldsdUtHVnVaREVzSUdWdVpESXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhWE5YYVhSb2FXNVNhV2RvZEVKa0lEMGdLR0p2ZFc1a1lYSjVYMlZ1WkRJZ1BqMGdiV0Y0S0hOMFlYSjBNU3dnYzNSaGNuUXlLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2x6VjJsMGFHbHVRbVFnUFNCcGMxZHBkR2hwYmt4bFpuUkNaQ0FtSUdselYybDBhR2x1VW1sbmFIUkNaQ2xjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhKdmNGOXVZU2dwWEc1Y2JseHVaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnUkUxVFR5d2dlU0E5SUdSVVFVY3BLU0FySUdkbGIyMWZjRzlwYm5Rb0tTQXJJR052YjNKa1gyWnBlR1ZrS0NrZ0t5QWdYRzRnSUdkbGIyMWZZV0pzYVc1bEtITnNiM0JsSUQwZ01Td2dhVzUwWlhKalpYQjBJRDBnTUN3Z1kyOXNJRDBnWEZ4bmNtVjVOVEJjWEN3Z2JHbHVaWFI1Y0dVZ1BTQmNYR1JoYzJobFpGeGNLU0FyWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRnhjWjNKbGVWeGNLU0FyWEc0Z0lHZGxiMjFmZG14cGJtVW9lR2x1ZEdWeVkyVndkQ0E5SURBc0lHRnNjR2hoSUQwZ01DNDFMQ0JqYjJ4dmNpQTlJRnhjWjNKbGVWeGNLU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHWmhZMlYwWDNkeVlYQW9maUJwYzFkcGRHaHBia0prS1Z4dVhHNW5aM0JzYjNRb1pHRjBZU3dnWVdWektIZ2dQU0JwYzFkcGRHaHBia0prTENCNUlEMGdaR2xtWmw5a1ZFRkhYMFJOVTA4c0lHWnBiR3dnUFNCcGMxZHBkR2hwYmtKa0tTa2dLeUJuWlc5dFgzWnBiMnhwYmlncElDc2daMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0eEtTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJYRzRnSUdkbGIyMWZhR3hwYm1Vb2VXbHVkR1Z5WTJWd2RDQTlJREFwWEc1Y2JseHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHBjMWRwZEdocGJrSmtJRDA5WjNKdmRYQXhLU0FwSkdScFptWmZaRlJCUjE5RVRWTlBYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2locGMxZHBkR2hwYmtKa0lEMDlaM0p2ZFhBeUtTQXBKR1JwWm1aZlpGUkJSMTlFVFZOUFhHNGdJSGRwYkNBOExTQjNhV3hqYjNndWRHVnpkQ2hrYVhOMFlXNWpaVEVzSUdScGMzUmhibU5sTWlsY2JpQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1ZlZ4dVhHNW5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNJRlJTVlVVc0lFWkJURk5GS1Z4dVhHNWNiaU1nVUhKdmNHOXlkR2x2YmlCdlppQjBhRzl6WlNCblpXNWxJR0psZEhkbFpXNGdaM0p2ZFhBeElHRnVaQ0JuY205MWNESmNibVJoZEdFdWFYTlhhWFJvYVc1Q1pDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHbHpWMmwwYUdsdVFtUXBYRzVjYm1kbGJtVXVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdkbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhGd3BLU1JuWlc1bFhHNW5aVzVsTG1keWIzVndNaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeG5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWW1sdVlYSjVSM0p2ZFhBeUxuUnpkbHhjS1Nra1oyVnVaVnh1WEc1emRXMG9aMlZ1WlM1bmNtOTFjREVnSldsdUpTQmtZWFJoTG1selYybDBhR2x1UW1Ra1oyVnVaU2t2YkdWdVozUm9LR2RsYm1VdVozSnZkWEF4S1NveE1EQmNibHh1YzNWdEtHZGxibVV1WjNKdmRYQXlJQ1ZwYmlVZ1pHRjBZUzVwYzFkcGRHaHBia0prSkdkbGJtVXBMMnhsYm1kMGFDaG5aVzVsTG1keWIzVndNaWtxTVRBd1hHNWNiaU1nUTJobFkydHBibWNnYzJsNlpTQnZaaUIwYUc5elpTQnNiMjl3YzF4dVpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR1JwYzNSaGJtTmxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhLVnh1WEc1blozQnNiM1FvWkdGMFlTd2dZV1Z6S0hnZ1BTQnBjMWRwZEdocGJrSmtMQ0I1SUQwZ1pHbHpkR0Z1WTJVc0lHWnBiR3dnUFNCcGMxZHBkR2hwYmtKa0tTa2dLeUJuWlc5dFgzWnBiMnhwYmlncElDc2daMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0eEtTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tWeHVYRzVjYmx4dVlHQmdYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmBgYHJcbmZsYW5rU2l6ZSA8LSAxXG5nZW5lLlRTUy50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSxcbiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kLCBWNCwgVjUsIFY2KVxuY29sbmFtZXMoZ2VuZS5UU1MudGIpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXHN0cmFuZFxcLCBcXGdlbmVcXCwgXFxlbnNlbWJsXFwpXG5nZW5lRW5zZW1ibFBhaXIgPC0gZ2VuZS5UU1MudGIgJT4lIGRwbHlyOjpzZWxlY3QoZ2VuZSwgZW5zZW1ibClcblxuYm91bmRhcnkucGFpciA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFx0c3NfY29udmVyZ2VudF9jdGNmX21vdGlmX3BhaXJzLmJlZHBlXFwpKVxuY29sbmFtZXMoYm91bmRhcnkucGFpcikgPC0gYyhcXGJvdW5kYXJ5X2Nocm9tMVxcLCBcXGJvdW5kYXJ5X3N0YXJ0MVxcLCBcXGJvdW5kYXJ5X2VuZDFcXCwgXFxib3VuZGFyeV9jaHJvbTJcXCwgXFxib3VuZGFyeV9zdGFydDJcXCwgXFxib3VuZGFyeV9lbmQyXFwsIFxcZW5zZW1ibFxcKVxuYm91bmRhcnkucGFpciA8LSBib3VuZGFyeS5wYWlyICU+JSBkcGx5cjo6bGVmdF9qb2luKGdlbmVFbnNlbWJsUGFpciwgYnkgPSBjKFxcZW5zZW1ibFxcKSlcblxuXG4jIEltcG9ydGluZyBsb29wIGdlbmUgYW5ub3RhdGlvblxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNiwgMTEsIDEyLCAyNCwgMjksIDMxKSkgJT4lIHVubmVzdChnZW5lKVxuXG5cbmRhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKGJvdW5kYXJ5LnBhaXIsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibFxcKSlcblxuZGF0YSA8LSBkYXRhICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoaXNXaXRoaW5MZWZ0QmQgPSAoYm91bmRhcnlfc3RhcnQxIDw9IG1pbihlbmQxLCBlbmQyKSksXG4gICAgICAgICAgICAgICAgICAgICAgIGlzV2l0aGluUmlnaHRCZCA9IChib3VuZGFyeV9lbmQyID49IG1heChzdGFydDEsIHN0YXJ0MikpLFxuICAgICAgICAgICAgICAgICAgICAgICBpc1dpdGhpbkJkID0gaXNXaXRoaW5MZWZ0QmQgJiBpc1dpdGhpblJpZ2h0QmQpXG5kYXRhIDwtIGRhdGEgJT4lIGRyb3BfbmEoKVxuXG5cbmdncGxvdChkYXRhLCBhZXMoeCA9IERNU08sIHkgPSBkVEFHKSkgKyBnZW9tX3BvaW50KCkgKyBjb29yZF9maXhlZCgpICsgIFxuICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9IFxcZ3JleTUwXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSBcXGdyZXlcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBmYWNldF93cmFwKH4gaXNXaXRoaW5CZClcblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gaXNXaXRoaW5CZCwgeSA9IGRpZmZfZFRBR19ETVNPLCBmaWxsID0gaXNXaXRoaW5CZCkpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaXNXaXRoaW5CZCA9PWdyb3VwMSkgKSRkaWZmX2RUQUdfRE1TT1xuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaXNXaXRoaW5CZCA9PWdyb3VwMikgKSRkaWZmX2RUQUdfRE1TT1xuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuZ2V0UHZhbFdpbGNveChkYXRhLCBUUlVFLCBGQUxTRSlcblxuXG4jIFByb3BvcnRpb24gb2YgdGhvc2UgZ2VuZSBiZXR3ZWVuIGdyb3VwMSBhbmQgZ3JvdXAyXG5kYXRhLmlzV2l0aGluQmQgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihpc1dpdGhpbkJkKVxuXG5nZW5lLmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ2VuZS5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuc3VtKGdlbmUuZ3JvdXAxICVpbiUgZGF0YS5pc1dpdGhpbkJkJGdlbmUpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwXG5cbnN1bShnZW5lLmdyb3VwMiAlaW4lIGRhdGEuaXNXaXRoaW5CZCRnZW5lKS9sZW5ndGgoZ2VuZS5ncm91cDIpKjEwMFxuXG4jIENoZWNraW5nIHNpemUgb2YgdGhvc2UgbG9vcHNcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSlcblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gaXNXaXRoaW5CZCwgeSA9IGRpc3RhbmNlLCBmaWxsID0gaXNXaXRoaW5CZCkpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSkgKyB0aGVtZV9jbGFzc2ljKClcblxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZmxhbmtTaXplIDwtIDFcbmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLFxuICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLFxuICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY0LCBWNSwgVjYpXG5jb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcc3RyYW5kXFwsIFxcZ2VuZVxcLCBcXGVuc2VtYmxcXClcbmdlbmVFbnNlbWJsUGFpciA8LSBnZW5lLlRTUy50YiAlPiUgZHBseXI6OnNlbGVjdChnZW5lLCBlbnNlbWJsKVxuXG5ib3VuZGFyeS5wYWlyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXHRzc19jb252ZXJnZW50X2N0Y2ZfbW90aWZfcGFpcnMuYmVkcGVcXCkpXG5jb2xuYW1lcyhib3VuZGFyeS5wYWlyKSA8LSBjKFxcYm91bmRhcnlfY2hyb20xXFwsIFxcYm91bmRhcnlfc3RhcnQxXFwsIFxcYm91bmRhcnlfZW5kMVxcLCBcXGJvdW5kYXJ5X2Nocm9tMlxcLCBcXGJvdW5kYXJ5X3N0YXJ0MlxcLCBcXGJvdW5kYXJ5X2VuZDJcXCwgXFxlbnNlbWJsXFwpXG5ib3VuZGFyeS5wYWlyIDwtIGJvdW5kYXJ5LnBhaXIgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZUVuc2VtYmxQYWlyLCBieSA9IGMoXFxlbnNlbWJsXFwpKVxuXG5cbiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2LCAxMSwgMTIsIDI0LCAyOSwgMzEpKSAlPiUgdW5uZXN0KGdlbmUpXG5cblxuZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oYm91bmRhcnkucGFpciwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsXFwpKVxuXG5kYXRhIDwtIGRhdGEgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZShpc1dpdGhpbkxlZnRCZCA9IChib3VuZGFyeV9zdGFydDEgPD0gbWluKGVuZDEsIGVuZDIpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgaXNXaXRoaW5SaWdodEJkID0gKGJvdW5kYXJ5X2VuZDIgPj0gbWF4KHN0YXJ0MSwgc3RhcnQyKSksXG4gICAgICAgICAgICAgICAgICAgICAgIGlzV2l0aGluQmQgPSBpc1dpdGhpbkxlZnRCZCAmIGlzV2l0aGluUmlnaHRCZClcbmRhdGEgPC0gZGF0YSAlPiUgZHJvcF9uYSgpXG5cblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gRE1TTywgeSA9IGRUQUcpKSArIGdlb21fcG9pbnQoKSArIGNvb3JkX2ZpeGVkKCkgKyAgXG4gIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gXFxncmV5NTBcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9IFxcZ3JleVxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGZhY2V0X3dyYXAofiBpc1dpdGhpbkJkKVxuXG5nZ3Bsb3QoZGF0YSwgYWVzKHggPSBpc1dpdGhpbkJkLCB5ID0gZGlmZl9kVEFHX0RNU08sIGZpbGwgPSBpc1dpdGhpbkJkKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApXG5cblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihpc1dpdGhpbkJkID09Z3JvdXAxKSApJGRpZmZfZFRBR19ETVNPXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihpc1dpdGhpbkJkID09Z3JvdXAyKSApJGRpZmZfZFRBR19ETVNPXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5nZXRQdmFsV2lsY294KGRhdGEsIFRSVUUsIEZBTFNFKVxuXG5cbiMgUHJvcG9ydGlvbiBvZiB0aG9zZSBnZW5lIGJldHdlZW4gZ3JvdXAxIGFuZCBncm91cDJcbmRhdGEuaXNXaXRoaW5CZCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGlzV2l0aGluQmQpXG5cbmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5nZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5zdW0oZ2VuZS5ncm91cDEgJWluJSBkYXRhLmlzV2l0aGluQmQkZ2VuZSkvbGVuZ3RoKGdlbmUuZ3JvdXAxKSoxMDBcblxuc3VtKGdlbmUuZ3JvdXAyICVpbiUgZGF0YS5pc1dpdGhpbkJkJGdlbmUpL2xlbmd0aChnZW5lLmdyb3VwMikqMTAwXG5cbiMgQ2hlY2tpbmcgc2l6ZSBvZiB0aG9zZSBsb29wc1xuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKVxuXG5nZ3Bsb3QoZGF0YSwgYWVzKHggPSBpc1dpdGhpbkJkLCB5ID0gZGlzdGFuY2UsIGZpbGwgPSBpc1dpdGhpbkJkKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xKSArIHRoZW1lX2NsYXNzaWMoKVxuXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r
flankSize <- 1
gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V4, V5, V6)
colnames(gene.TSS.tb) <- c(\chr\, \start\, \end\, \strand\, \gene\, \ensembl\)
geneEnsemblPair <- gene.TSS.tb %>% dplyr::select(gene, ensembl)

boundary.pair <- fread(here(refDir, \tss_convergent_ctcf_motif_pairs.bedpe\))
colnames(boundary.pair) <- c(\boundary_chrom1\, \boundary_start1\, \boundary_end1\, \boundary_chrom2\, \boundary_start2\, \boundary_end2\, \ensembl\)
boundary.pair <- boundary.pair %>% dplyr::left_join(geneEnsemblPair, by = c(\ensembl\))


# Importing loop gene annotation
name <- \chromo_cons_annoHierarchy\
diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\)) %>%
  dplyr::select(c(1, 2, 3, 4, 5, 6, 11, 12, 24, 29, 31)) %>% unnest(gene)


data <- geneAnnoData %>% dplyr::left_join(boundary.pair, by = c(\gene\ = \ensembl\))

data <- data %>% rowwise() %>% dplyr::mutate(isWithinLeftBd = (boundary_start1 <= min(end1, end2)),
                       isWithinRightBd = (boundary_end2 >= max(start1, start2)),
                       isWithinBd = isWithinLeftBd & isWithinRightBd)
data <- data %>% drop_na()


ggplot(data, aes(x = DMSO, y = dTAG)) + geom_point() + coord_fixed() +  
  geom_abline(slope = 1, intercept = 0, col = \grey50\, linetype = \dashed\) +
  geom_hline(yintercept = 0, alpha = 0.5, color = \grey\) +
  geom_vline(xintercept = 0, alpha = 0.5, color = \grey\) +
  theme_classic() + facet_wrap(~ isWithinBd)

ggplot(data, aes(x = isWithinBd, y = diff_dTAG_DMSO, fill = isWithinBd)) + geom_violin() + geom_boxplot(width = 0.1) + theme_classic() +
  geom_hline(yintercept = 0)


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(isWithinBd ==group1) )$diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(isWithinBd ==group2) )$diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

getPvalWilcox(data, TRUE, FALSE)


# Proportion of those gene between group1 and group2
data.isWithinBd <- data %>% dplyr::filter(isWithinBd)

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

sum(gene.group1 %in% data.isWithinBd$gene)/length(gene.group1)*100

sum(gene.group2 %in% data.isWithinBd$gene)/length(gene.group2)*100

# Checking size of those loops
data <- data %>% dplyr::mutate(distance = start2 - start1)

ggplot(data, aes(x = isWithinBd, y = distance, fill = isWithinBd)) + geom_violin() + geom_boxplot(width = 0.1) + theme_classic()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Comparing it to TSS

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVabXhoYm10VGFYcGxJRHd0SURJdU5XVXpYRzVuWlc1bExuUmlJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltMXRNVEJmUjFKRGJUTTRMbkEyWDJkbGJtVmZjMjl5ZEdWa0xtSmxaRndpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9WRk5USUQwZ2FXWmxiSE5sS0ZZMElEMDlJRndpSzF3aUxDQldNaXdnVmpNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlRVM04wWVhKMElEMGdWRk5USUMwZ1pteGhibXRUYVhwbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGUlRVMlZ1WkNBOUlGUlRVeUFySUdac1lXNXJVMmw2WlNrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9WakVzSUZSVFUzTjBZWEowTENCVVUxTmxibVFzSUZZMkxDQldOU2xjYm1OdmJHNWhiV1Z6S0dkbGJtVXVkR0lwSUR3dElHTW9YQ0pqYUhKY0lpd2dYQ0p6ZEdGeWRGd2lMQ0JjSW1WdVpGd2lMQ0JjSW1WdWMyVnRZbXhjSWl3Z1hDSm5aVzVsWENJcFhHNWNibWRsYm1VdVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbWRsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNERXVkSE4yWENJcEtTUm5aVzVsWEc1blpXNWxMbWR5YjNWd01pQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKblpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZZbWx1WVhKNVIzSnZkWEF5TG5SemRsd2lLU2trWjJWdVpWeHVYRzVVVTFNeGJXSXVaM0p2ZFhBeExtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2huWlc1bExuUmlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR1Z1YzJWdFltd2dKV2x1SlNCblpXNWxMbWR5YjNWd01Ta3NJR3RsWlhBdVpYaDBjbUV1WTI5c2RXMXVjeUE5SUZSU1ZVVXBYRzVVVTFNeGJXSXVaM0p2ZFhBeUxtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2huWlc1bExuUmlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR1Z1YzJWdFltd2dKV2x1SlNCblpXNWxMbWR5YjNWd01pa3NJR3RsWlhBdVpYaDBjbUV1WTI5c2RXMXVjeUE5SUZSU1ZVVXBYRzVjYmx4dVkzUmpaaTV3WldGcklEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSWpNek1qUTRYME5VUTBaZk1EY3ROekk1WDBKeWRXTmxMVFJmY0dWaGEzTXViV1Z5WjJWUVpXRnJMbTF2ZEdsbVFXNXViM1JoZEdWa0xtSmxaRndpS1NsY2JtTnZiRzVoYldWektHTjBZMll1Y0dWaGF5a2dQQzBnWXloY0ltTm9jbHdpTENCY0luTjBZWEowWENJc0lGd2laVzVrWENJc0lGd2liVzkwYVdaY0lpbGNibU4wWTJZdWNHVmhheTVuY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1kzUmpaaTV3WldGcktWeHVYRzVjYm5CeWFXNTBLRndpS3kweUxqVnJZaUJVVTFNZ2IzWmxjbXhoSUhkcGRHZ2dRMVJEUmlCd1pXRnJYQ0lwWEc1c1pXNW5kR2dvZFc1cGNYVmxLSEYxWlhKNVNHbDBjeWhtYVc1a1QzWmxjbXhoY0hNb1ZGTlRNVzFpTG1keWIzVndNUzVuY2l3Z1kzUmpaaTV3WldGckxtZHlLU2twS1M5c1pXNW5kR2dvWjJWdVpTNW5jbTkxY0RFcEtqRXdNRnh1YkdWdVozUm9LSFZ1YVhGMVpTaHhkV1Z5ZVVocGRITW9abWx1WkU5MlpYSnNZWEJ6S0ZSVFV6RnRZaTVuY205MWNESXVaM0lzSUdOMFkyWXVjR1ZoYXk1bmNpa3BLU2t2YkdWdVozUm9LR2RsYm1VdVozSnZkWEF5S1NveE1EQmNibHh1WEc1Y2JtTjBZMll1Y0dWaGF5NW5jaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvWTNSalppNXdaV0ZySUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0cxdmRHbG1JQ0U5SUZ3aWJtOXVaVndpS1NsY2JuQnlhVzUwS0Z3aUt5MHlMalZyWWlCVVUxTWdiM1psY214aElIZHBkR2dnUTFSRFJpQndaV0ZySUhkcGRHZ2diVzkwYVdaY0lpbGNibXhsYm1kMGFDaDFibWx4ZFdVb2NYVmxjbmxJYVhSektHWnBibVJQZG1WeWJHRndjeWhVVTFNeGJXSXVaM0p2ZFhBeExtZHlMQ0JqZEdObUxuQmxZV3N1WjNJcEtTa3BMMnhsYm1kMGFDaG5aVzVsTG1keWIzVndNU2txTVRBd1hHNXNaVzVuZEdnb2RXNXBjWFZsS0hGMVpYSjVTR2wwY3lobWFXNWtUM1psY214aGNITW9WRk5UTVcxaUxtZHliM1Z3TWk1bmNpd2dZM1JqWmk1d1pXRnJMbWR5S1NrcEtTOXNaVzVuZEdnb1oyVnVaUzVuY205MWNESXBLakV3TUZ4dVhHNWNibHh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5mbGFua1NpemUgPC0gMi41ZTNcbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMyksXG4gICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsXG4gICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCwgVjYsIFY1KVxuY29sbmFtZXMoZ2VuZS50YikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcZW5zZW1ibFxcLCBcXGdlbmVcXClcblxuZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cblRTUzFtYi5ncm91cDEuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdlbmUuZ3JvdXAxKSwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSlcblRTUzFtYi5ncm91cDIuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdlbmUuZ3JvdXAyKSwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSlcblxuXG5jdGNmLnBlYWsgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsubW90aWZBbm5vdGF0ZWQuYmVkXFwpKVxuY29sbmFtZXMoY3RjZi5wZWFrKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxtb3RpZlxcKVxuY3RjZi5wZWFrLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShjdGNmLnBlYWspXG5cblxucHJpbnQoXFwrLTIuNWtiIFRTUyBvdmVybGEgd2l0aCBDVENGIHBlYWtcXClcbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhUU1MxbWIuZ3JvdXAxLmdyLCBjdGNmLnBlYWsuZ3IpKSkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwXG5sZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoVFNTMW1iLmdyb3VwMi5nciwgY3RjZi5wZWFrLmdyKSkpKS9sZW5ndGgoZ2VuZS5ncm91cDIpKjEwMFxuXG5cblxuY3RjZi5wZWFrLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShjdGNmLnBlYWsgJT4lIGRwbHlyOjpmaWx0ZXIobW90aWYgIT0gXFxub25lXFwpKVxucHJpbnQoXFwrLTIuNWtiIFRTUyBvdmVybGEgd2l0aCBDVENGIHBlYWsgd2l0aCBtb3RpZlxcKVxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKFRTUzFtYi5ncm91cDEuZ3IsIGN0Y2YucGVhay5ncikpKSkvbGVuZ3RoKGdlbmUuZ3JvdXAxKSoxMDBcbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhUU1MxbWIuZ3JvdXAyLmdyLCBjdGNmLnBlYWsuZ3IpKSkpL2xlbmd0aChnZW5lLmdyb3VwMikqMTAwXG5cblxuXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
flankSize <- 2.5e3
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6, V5)
colnames(gene.tb) <- c(\chr\, \start\, \end\, \ensembl\, \gene\)

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

TSS1mb.group1.gr <- makeGRangesFromDataFrame(gene.tb %>% dplyr::filter(ensembl %in% gene.group1), keep.extra.columns = TRUE)
TSS1mb.group2.gr <- makeGRangesFromDataFrame(gene.tb %>% dplyr::filter(ensembl %in% gene.group2), keep.extra.columns = TRUE)


ctcf.peak <- fread(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.motifAnnotated.bed\))
colnames(ctcf.peak) <- c(\chr\, \start\, \end\, \motif\)
ctcf.peak.gr <- makeGRangesFromDataFrame(ctcf.peak)


print(\+-2.5kb TSS overla with CTCF peak\)
length(unique(queryHits(findOverlaps(TSS1mb.group1.gr, ctcf.peak.gr))))/length(gene.group1)*100
length(unique(queryHits(findOverlaps(TSS1mb.group2.gr, ctcf.peak.gr))))/length(gene.group2)*100



ctcf.peak.gr <- makeGRangesFromDataFrame(ctcf.peak %>% dplyr::filter(motif != \none\))
print(\+-2.5kb TSS overla with CTCF peak with motif\)
length(unique(queryHits(findOverlaps(TSS1mb.group1.gr, ctcf.peak.gr))))/length(gene.group1)*100
length(unique(queryHits(findOverlaps(TSS1mb.group2.gr, ctcf.peak.gr))))/length(gene.group2)*100



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVpteGhibXRUYVhwbElEd3RJREl1TldVelhHNW5aVzVsTG5SaUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEcxdE1UQmZSMUpEYlRNNExuQTJYMmRsYm1WZmMyOXlkR1ZrTG1KbFpGeGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ZGTlRJRDBnYVdabGJITmxLRlkwSUQwOUlGeGNLMXhjTENCV01pd2dWak1wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSVFUzTjBZWEowSUQwZ1ZGTlRJQzBnWm14aGJtdFRhWHBsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSVFUyVnVaQ0E5SUZSVFV5QXJJR1pzWVc1clUybDZaU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1ZqRXNJRlJUVTNOMFlYSjBMQ0JVVTFObGJtUXNJRlkyTENCV05TbGNibU52Ykc1aGJXVnpLR2RsYm1VdWRHSXBJRHd0SUdNb1hGeGphSEpjWEN3Z1hGeHpkR0Z5ZEZ4Y0xDQmNYR1Z1WkZ4Y0xDQmNYR1Z1YzJWdFlteGNYQ3dnWEZ4blpXNWxYRndwWEc1Y2JtZGxibVV1WjNKdmRYQXhJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjlpYVc1aGNubEhjbTkxY0RFdWRITjJYRndwS1NSblpXNWxYRzVuWlc1bExtZHliM1Z3TWlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhuWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlltbHVZWEo1UjNKdmRYQXlMblJ6ZGx4Y0tTa2taMlZ1WlZ4dVhHNVVVMU14YldJdVozSnZkWEF4TG1keUlEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaG5aVzVsTG5SaUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHVnVjMlZ0WW13Z0pXbHVKU0JuWlc1bExtZHliM1Z3TVNrc0lHdGxaWEF1WlhoMGNtRXVZMjlzZFcxdWN5QTlJRlJTVlVVcFhHNVVVMU14YldJdVozSnZkWEF5TG1keUlEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaG5aVzVsTG5SaUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHVnVjMlZ0WW13Z0pXbHVKU0JuWlc1bExtZHliM1Z3TWlrc0lHdGxaWEF1WlhoMGNtRXVZMjlzZFcxdWN5QTlJRlJTVlVVcFhHNWNibHh1WTNSalppNXdaV0ZySUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYRE16TWpRNFgwTlVRMFpmTURjdE56STVYMEp5ZFdObExUUmZjR1ZoYTNNdWJXVnlaMlZRWldGckxtMXZkR2xtUVc1dWIzUmhkR1ZrTG1KbFpGeGNLU2xjYm1OdmJHNWhiV1Z6S0dOMFkyWXVjR1ZoYXlrZ1BDMGdZeWhjWEdOb2NseGNMQ0JjWEhOMFlYSjBYRndzSUZ4Y1pXNWtYRndzSUZ4Y2JXOTBhV1pjWENsY2JtTjBZMll1Y0dWaGF5NW5jaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvWTNSalppNXdaV0ZyS1Z4dVhHNWNibkJ5YVc1MEtGeGNLeTB5TGpWcllpQlVVMU1nYjNabGNteGhJSGRwZEdnZ1ExUkRSaUJ3WldGclhGd3BYRzVzWlc1bmRHZ29kVzVwY1hWbEtIRjFaWEo1U0dsMGN5aG1hVzVrVDNabGNteGhjSE1vVkZOVE1XMWlMbWR5YjNWd01TNW5jaXdnWTNSalppNXdaV0ZyTG1keUtTa3BLUzlzWlc1bmRHZ29aMlZ1WlM1bmNtOTFjREVwS2pFd01GeHViR1Z1WjNSb0tIVnVhWEYxWlNoeGRXVnllVWhwZEhNb1ptbHVaRTkyWlhKc1lYQnpLRlJUVXpGdFlpNW5jbTkxY0RJdVozSXNJR04wWTJZdWNHVmhheTVuY2lrcEtTa3ZiR1Z1WjNSb0tHZGxibVV1WjNKdmRYQXlLU294TURCY2JseHVYRzVjYm1OMFkyWXVjR1ZoYXk1bmNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9ZM1JqWmk1d1pXRnJJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRzF2ZEdsbUlDRTlJRnhjYm05dVpWeGNLU2xjYm5CeWFXNTBLRnhjS3kweUxqVnJZaUJVVTFNZ2IzWmxjbXhoSUhkcGRHZ2dRMVJEUmlCd1pXRnJJSGRwZEdnZ2JXOTBhV1pjWENsY2JteGxibWQwYUNoMWJtbHhkV1VvY1hWbGNubElhWFJ6S0dacGJtUlBkbVZ5YkdGd2N5aFVVMU14YldJdVozSnZkWEF4TG1keUxDQmpkR05tTG5CbFlXc3VaM0lwS1NrcEwyeGxibWQwYUNoblpXNWxMbWR5YjNWd01Ta3FNVEF3WEc1c1pXNW5kR2dvZFc1cGNYVmxLSEYxWlhKNVNHbDBjeWhtYVc1a1QzWmxjbXhoY0hNb1ZGTlRNVzFpTG1keWIzVndNaTVuY2l3Z1kzUmpaaTV3WldGckxtZHlLU2twS1M5c1pXNW5kR2dvWjJWdVpTNW5jbTkxY0RJcEtqRXdNRnh1WEc1Y2JseHVYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5mbGFua1NpemUgPC0gMi41ZTNcbmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMyksXG4gICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsXG4gICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCwgVjYsIFY1KVxuY29sbmFtZXMoZ2VuZS50YikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcZW5zZW1ibFxcLCBcXGdlbmVcXClcblxuZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cblRTUzFtYi5ncm91cDEuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdlbmUuZ3JvdXAxKSwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSlcblRTUzFtYi5ncm91cDIuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdlbmUuZ3JvdXAyKSwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSlcblxuXG5jdGNmLnBlYWsgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsubW90aWZBbm5vdGF0ZWQuYmVkXFwpKVxuY29sbmFtZXMoY3RjZi5wZWFrKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxtb3RpZlxcKVxuY3RjZi5wZWFrLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShjdGNmLnBlYWspXG5cblxucHJpbnQoXFwrLTIuNWtiIFRTUyBvdmVybGEgd2l0aCBDVENGIHBlYWtcXClcbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhUU1MxbWIuZ3JvdXAxLmdyLCBjdGNmLnBlYWsuZ3IpKSkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwXG5sZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoVFNTMW1iLmdyb3VwMi5nciwgY3RjZi5wZWFrLmdyKSkpKS9sZW5ndGgoZ2VuZS5ncm91cDIpKjEwMFxuXG5cblxuY3RjZi5wZWFrLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShjdGNmLnBlYWsgJT4lIGRwbHlyOjpmaWx0ZXIobW90aWYgIT0gXFxub25lXFwpKVxucHJpbnQoXFwrLTIuNWtiIFRTUyBvdmVybGEgd2l0aCBDVENGIHBlYWsgd2l0aCBtb3RpZlxcKVxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKFRTUzFtYi5ncm91cDEuZ3IsIGN0Y2YucGVhay5ncikpKSkvbGVuZ3RoKGdlbmUuZ3JvdXAxKSoxMDBcbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhUU1MxbWIuZ3JvdXAyLmdyLCBjdGNmLnBlYWsuZ3IpKSkpL2xlbmd0aChnZW5lLmdyb3VwMikqMTAwXG5cblxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZmxhbmtTaXplIDwtIDIuNWUzXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLFxuICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLFxuICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY2LCBWNSlcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGVuc2VtYmxcXCwgXFxnZW5lXFwpXG5cbmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5nZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5UU1MxbWIuZ3JvdXAxLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmwgJWluJSBnZW5lLmdyb3VwMSksIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpXG5UU1MxbWIuZ3JvdXAyLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmwgJWluJSBnZW5lLmdyb3VwMiksIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpXG5cblxuY3RjZi5wZWFrIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXDMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLm1vdGlmQW5ub3RhdGVkLmJlZFxcKSlcbmNvbG5hbWVzKGN0Y2YucGVhaykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcbW90aWZcXClcbmN0Y2YucGVhay5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoY3RjZi5wZWFrKVxuXG5cbnByaW50KFxcKy0yLjVrYiBUU1Mgb3ZlcmxhIHdpdGggQ1RDRiBwZWFrXFwpXG5sZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoVFNTMW1iLmdyb3VwMS5nciwgY3RjZi5wZWFrLmdyKSkpKS9sZW5ndGgoZ2VuZS5ncm91cDEpKjEwMFxubGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKFRTUzFtYi5ncm91cDIuZ3IsIGN0Y2YucGVhay5ncikpKSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDBcblxuXG5cbmN0Y2YucGVhay5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoY3RjZi5wZWFrICU+JSBkcGx5cjo6ZmlsdGVyKG1vdGlmICE9IFxcbm9uZVxcKSlcbnByaW50KFxcKy0yLjVrYiBUU1Mgb3ZlcmxhIHdpdGggQ1RDRiBwZWFrIHdpdGggbW90aWZcXClcbmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhUU1MxbWIuZ3JvdXAxLmdyLCBjdGNmLnBlYWsuZ3IpKSkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwXG5sZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoVFNTMW1iLmdyb3VwMi5nciwgY3RjZi5wZWFrLmdyKSkpKS9sZW5ndGgoZ2VuZS5ncm91cDIpKjEwMFxuXG5cblxuXG5gYGBcbmBgYCJ9 -->

```r
```r
flankSize <- 2.5e3
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6, V5)
colnames(gene.tb) <- c(\chr\, \start\, \end\, \ensembl\, \gene\)

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

TSS1mb.group1.gr <- makeGRangesFromDataFrame(gene.tb %>% dplyr::filter(ensembl %in% gene.group1), keep.extra.columns = TRUE)
TSS1mb.group2.gr <- makeGRangesFromDataFrame(gene.tb %>% dplyr::filter(ensembl %in% gene.group2), keep.extra.columns = TRUE)


ctcf.peak <- fread(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.motifAnnotated.bed\))
colnames(ctcf.peak) <- c(\chr\, \start\, \end\, \motif\)
ctcf.peak.gr <- makeGRangesFromDataFrame(ctcf.peak)


print(\+-2.5kb TSS overla with CTCF peak\)
length(unique(queryHits(findOverlaps(TSS1mb.group1.gr, ctcf.peak.gr))))/length(gene.group1)*100
length(unique(queryHits(findOverlaps(TSS1mb.group2.gr, ctcf.peak.gr))))/length(gene.group2)*100



ctcf.peak.gr <- makeGRangesFromDataFrame(ctcf.peak %>% dplyr::filter(motif != \none\))
print(\+-2.5kb TSS overla with CTCF peak with motif\)
length(unique(queryHits(findOverlaps(TSS1mb.group1.gr, ctcf.peak.gr))))/length(gene.group1)*100
length(unique(queryHits(findOverlaps(TSS1mb.group2.gr, ctcf.peak.gr))))/length(gene.group2)*100

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#### Filtering loops that fall within CTCF boundaries

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WkdsbVprTjFkRzltWmlBOExTQXdMakpjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZjQzF1WDJWdWMyVnRZbXhNYVhOMExuUnpkbHdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwWm1aRGRYUnZabVlnUFNCa2FXWm1RM1YwYjJabUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVmhjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR01vTVN3Z01pd2dNeXdnTkN3Z05Td2dOaXdnTnl3Z01URXNJREV5TENBeU5Dd2dNamtzSURNeEtTa2dKVDRsSUhWdWJtVnpkQ2huWlc1bEtWeHVYRzVjYm1kbGJtVXVWRk5UTG5SaUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW0xdE1UQmZSMUpEYlRNNExuQTJYMmRsYm1WZmMyOXlkR1ZrTG1KbFpGd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ZGTlRJRDBnYVdabGJITmxLRlkwSUQwOUlGd2lLMXdpTENCV01pd2dWak1wS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaFdOaXdnVkZOVEtWeHVZMjlzYm1GdFpYTW9aMlZ1WlM1VVUxTXVkR0lwSUR3dElHTW9YQ0psYm5ObGJXSnNYQ0lzSUZ3aVZGTlRYQ0lwWEc1Y2JseHVaMlZ1WlVGdWJtOUVZWFJoSUR3dElHZGxibVZCYm01dlJHRjBZU0FsUGlVZ1pIQnNlWEk2T214bFpuUmZhbTlwYmloblpXNWxMbFJUVXk1MFlpd2dZbmtnUFNCaktGd2laMlZ1WlZ3aUlEMGdYQ0psYm5ObGJXSnNYQ0lwS1Z4dVhHNW5aVzVsUVc1dWIwUmhkR0VnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoa2FYTjBZVzVqWlRFZ1BTQW9jM1JoY25ReElDc2daVzVrTVNrdk1pQXRJRlJUVXl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2FYTjBZVzVqWlRJZ1BTQW9jM1JoY25ReUlDc2daVzVrTWlrdk1pQXRJRlJUVXl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2FYTjBZVzVqWlNBOUlHbG1YMlZzYzJVb1lXSnpLR1JwYzNSaGJtTmxNU2tnUGlCaFluTW9aR2x6ZEdGdVkyVXlLU3dnWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcEtWeHVYRzV5WlhOMWJIUWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKVnh1SUNCbWFXeDBaWElvUVc1dWJ6SWdQVDBnWENKUUxWTmNJaWtnSlQ0bFhHNGdJR2R5YjNWd1gySjVLR2RsYm1VcElDVStKVnh1SUNCemRXMXRZWEpwYzJVb1hHNGdJQ0FnWm1GeVVtbG5hSFFnUFNCcFppQW9ZVzU1S0dScGMzUmhibU5sSUQ0Z01Da3BJRzFoZUNoa2FYTjBZVzVqWlZ0a2FYTjBZVzVqWlNBK0lEQmRLU0JsYkhObElEQXNJQ0FqSUZKbGRIVnliaUF3SUdsbUlHNXZJSEJ2YzJsMGFYWmxJR1JwYzNSaGJtTmxYRzRnSUNBZ1ptRnlUR1ZtZENBOUlHbG1JQ2hoYm5rb1pHbHpkR0Z1WTJVZ1BDQXdLU2tnYldsdUtHUnBjM1JoYm1ObFcyUnBjM1JoYm1ObElEd2dNRjBwSUdWc2MyVWdNQ0FnSXlCU1pYUjFjbTRnTUNCcFppQnVieUJ1WldkaGRHbDJaU0JrYVhOMFlXNWpaVnh1SUNBcElDVStKVnh1SUNCMWJtZHliM1Z3S0NsY2JseHVaMlZ1WlVGdWJtOUVZWFJoSUR3dElHZGxibVZCYm01dlJHRjBZU0FsUGlVZ2JHVm1kRjlxYjJsdUtISmxjM1ZzZEN3Z1lua2dQU0JqS0Z3aVoyVnVaVndpS1NsY2JseHVaMlZ1WlVGdWJtOUVZWFJoSUR3dElHZGxibVZCYm01dlJHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhCYm01dk1pQWxhVzRsSUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdZMkZ6WlY5M2FHVnVLR2x6TG01aEtHWmhjbEpwWjJoMEtTQitJRndpVG05Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQW9aR2x6ZEdGdVkyVWdQaUJtWVhKTVpXWjBLU0FtSUNoa2FYTjBZVzVqWlNBOElHWmhjbEpwWjJoMEtTQitJRndpVjJsMGFHbHVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnVkZKVlJTQitJRndpVDNWMGMybGtaVndpS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFYcGxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhLVnh1WEc1a1lYUmhJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaG5jbTkxY0N3Z2FXUXNJSE5wZW1VcElDVStKU0JrYVhOMGFXNWpkQ2dwWEc1aGJtTm9iM0l1WkdGMFlTQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1kyaHliMjB4TENCemRHRnlkREVzSUdWdVpERXNJR05vY205dE1pd2djM1JoY25ReUxDQmxibVF5TENCbmNtOTFjQ2tnSlQ0bElHUnBjM1JwYm1OMEtDbGNibHh1ZEdWdGNERWdQQzBnWVc1amFHOXlMbVJoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1hDSk9iMXdpS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENndFozSnZkWEFwWEc1bWQzSnBkR1VvZEdWdGNERXNJR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1sdWMzVnNZWFJsWkY5a2IyMWhhVzVmY0hOZmJtOHVZbVZrY0dWY0lpa3NJSE5sY0NBOUlGd2lYRngwWENJc0lHTnZiQzV1WVcxbGN5QTlJRVpCVEZORktWeHVkR1Z0Y0RJZ1BDMGdZVzVqYUc5eUxtUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWENKWGFYUm9hVzVjSWlrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb0xXZHliM1Z3S1Z4dVpuZHlhWFJsS0hSbGJYQXlMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKcGJuTjFiR0YwWldSZlpHOXRZV2x1WDNCelgzZHBkR2hwYmk1aVpXUndaVndpS1N3Z2MyVndJRDBnWENKY1hIUmNJaXdnWTI5c0xtNWhiV1Z6SUQwZ1JrRk1VMFVwWEc1MFpXMXdNeUE4TFNCaGJtTm9iM0l1WkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNJazkxZEhOcFpHVmNJaWtnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvTFdkeWIzVndLVnh1Wm5keWFYUmxLSFJsYlhBekxDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pwYm5OMWJHRjBaV1JmWkc5dFlXbHVYM0J6WDI5MWRITnBaR1V1WW1Wa2NHVmNJaWtzSUhObGNDQTlJRndpWEZ4MFhDSXNJR052YkM1dVlXMWxjeUE5SUVaQlRGTkZLVnh1WEc1Y2JtZGxkRkIyWVd4WGFXeGpiM2dnUEMwZ1puVnVZM1JwYjI0b1pHRjBZU3dnWjNKdmRYQXhMQ0JuY205MWNESXBlMXh1SUNCa2FYTjBZVzVqWlRFZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQxbmNtOTFjREVwSUNra2MybDZaVnh1SUNCa2FYTjBZVzVqWlRJZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQxbmNtOTFjRElwSUNra2MybDZaVnh1SUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JuMWNibHh1SXlCamIyNTJVSFpoYkhWbEtHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTd2dYQ0p1YjBKdmRXNWtZWEo1WENJc0lGd2lkMmwwYUdsdVFtOTFibVJoY25sY0lpa3BYRzRqSUdOdmJuWlFkbUZzZFdVb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExDQmNJbTV2UW05MWJtUmhjbmxjSWl3Z1hDSnZkWFJ6YVdSbFFtOTFibVJoY25sY0lpa3BYRzRqSUdOdmJuWlFkbUZzZFdVb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExDQmNJbTkxZEhOcFpHVkNiM1Z1WkdGeWVWd2lMQ0JjSW5kcGRHaHBia0p2ZFc1a1lYSjVYQ0lwS1Z4dVhHNWNibkFnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0J6YVhwbExDQm1hV3hzSUQwZ1ozSnZkWEFwS1NBcklGeHVJQ0JuWlc5dFgzWnBiMnhwYmloc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lMQ0JoYkhCb1lTQTlJQzQwTENBc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TXl3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVN3Z0lHRnNjR2hoSUQwZ01DNDJMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBcklGeHVJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJ6WTJGc1pWOTVYMk52Ym5ScGJuVnZkWE1vYkdGaVpXeHpJRDBnYkdGaVpXeGZhMkpmYldJcElDdGNiaUFnYzNSaGRGOXpkVzF0WVhKNUtGeHVJQ0FnSUNBZ1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMRnh1SUNBZ0lDQWdaMlZ2YlNBOUlGd2ljRzlwYm5SY0lpd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJREF1TlN4Y2JpQWdJQ0FnSUdacGJHd2dQU0JjSW1Kc1lXTnJYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCd2IzTnBkR2x2YmlBOUlIQnZjMmwwYVc5dVgyUnZaR2RsS0M0ektWeHVJQ0FnSUNrZ0sxeHVJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aVozSmxlVFV3WENJc0lGd2lJelZGUXprMk1sd2lMQ0JjSWlNMVJVTTVOakpjSWlrcElDdGNibHh1SUNCMGFHVnRaU2hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxMbmdnUFNCbGJHVnRaVzUwWDJKc1lXNXJLQ2tzWEc0Z0lDQWdZWGhwY3k1MGFYUnNaUzU1SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTeGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5eGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNrc0lDQWdJRnh1SUNBZ0lHRjRhWE11ZEdWNGRDNTRJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN4Y2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lDQWdJQ0FnSXlCU2IzUmhkR1VnZUMxaGVHbHpJR3hoWW1Wc2N5QTBOU0JrWldkeVpXVnpYRzRnSUNBZ0lDQm9hblZ6ZENBOUlERXNJQ0FnSUNBZ0lDTWdRV1JxZFhOMElHaHZjbWw2YjI1MFlXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUlDQWdJQ0FnZG1wMWMzUWdQU0F4SUNBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0IyWlhKMGFXTmhiQ0JxZFhOMGFXWnBZMkYwYVc5dVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjSW5SeVlXNXpjR0Z5Wlc1MFhDSXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2tnSzJ4aFluTW9lU0E5SUZ3aVRHOXZjQ0J6YVhwbFhDSXBYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0ltbHVjM1ZzWVhScGIyNUNiM1Z1WkdGeWVWOXphWHBsWENJcFhHNTNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NUzQxS1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3hMalVwS20xdFZHOUpibU5vWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWNHNW5YQ0lwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hDSnBibHdpTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzRnSUZ4dUl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qWEc1blpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaUFnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXhLU0FwSkdScFptWmZaRlJCUjE5RVRWTlBYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNaWtnS1NSa2FXWm1YMlJVUVVkZlJFMVRUMXh1SUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JuMWNibHh1WkdGMFlTQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1ozSnZkWEFzSUdsa0xDQmthV1ptWDJSVVFVZGZSRTFUVHlrZ0pUNGxJR1JwYzNScGJtTjBLQ2xjYmx4dUl5QmpiMjUyVUhaaGJIVmxLR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3dnWENKdWIwSnZkVzVrWVhKNVhDSXNJRndpZDJsMGFHbHVRbTkxYm1SaGNubGNJaWtwWEc0aklHTnZiblpRZG1Gc2RXVW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMQ0JjSW01dlFtOTFibVJoY25sY0lpd2dYQ0p2ZFhSemFXUmxRbTkxYm1SaGNubGNJaWtwWEc0aklHTnZiblpRZG1Gc2RXVW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMQ0JjSW05MWRITnBaR1ZDYjNWdVpHRnllVndpTENCY0luZHBkR2hwYmtKdmRXNWtZWEo1WENJcEtWeHVYRzV3SUR3dElHZG5jR3h2ZENoa1lYUmhMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnWkdsbVpsOWtWRUZIWDBSTlUwOHNJR1pwYkd3Z1BTQm5jbTkxY0NrcElDc2dYRzRnSUdkbGIyMWZkbWx2YkdsdUtHeHBibVYzYVdSMGFDQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lzSUdGc2NHaGhJRDBnTGpRc0lDd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnS3lCY2JpQWdaMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0ekxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VzSUNCaGJIQm9ZU0E5SURBdU5pd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnS3lCY2JpQWdkR2hsYldWZlkyeGhjM05wWXlncElDc2dYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGNiaUFnSUNCaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNYRzRnSUNBZ1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlEQXVOU3hjYmlBZ0lDQm1hV3hzSUQwZ1hDSmliR0ZqYTF3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpd2djRzl6YVhScGIyNGdQU0J3YjNOcGRHbHZibDlrYjJSblpTZ3VNeWxjYmlBZ0tTQXJYRzRnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSm5jbVY1TlRCY0lpd2dYQ0lqTlVWRE9UWXlYQ0lzSUZ3aUl6VkZRemsyTWx3aUtTa2dLMXh1WEc0Z0lIUm9aVzFsS0Z4dUlDQWdJR0Y0YVhNdWRHbDBiR1V1ZUNBOUlHVnNaVzFsYm5SZllteGhibXNvS1N4Y2JpQWdJQ0JoZUdsekxuUnBkR3hsTG5rZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVk5MRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMRnh1SUNBZ0lDQWdabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lYRzRnSUNBZ0tTd2dJQ0FnWEc0Z0lDQWdZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1lXNW5iR1VnUFNBME5Td2dJQ0FnSUNBaklGSnZkR0YwWlNCNExXRjRhWE1nYkdGaVpXeHpJRFExSUdSbFozSmxaWE5jYmlBZ0lDQWdJR2hxZFhOMElEMGdNU3dnSUNBZ0lDQWdJeUJCWkdwMWMzUWdhRzl5YVhwdmJuUmhiQ0JxZFhOMGFXWnBZMkYwYVc5dVhHNGdJQ0FnSUNCMmFuVnpkQ0E5SURFZ0lDQWdJQ0FnSUNNZ1FXUnFkWE4wSUhabGNuUnBZMkZzSUdwMWMzUnBabWxqWVhScGIyNWNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXViR2x1WlNBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUnBZMnR6SUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXhjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENKY2JpQWdJQ0FwTEZ4dUlDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ3aWRISmhibk53WVhKbGJuUmNJaWtzWEc0Z0lDQWdiR1ZuWlc1a0xuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5bGNiaUFnS1NBcmJHRmljeWg1SUQwZ1hDTE9sQ0JzYjI5d0lITmpiM0psWENJcElDQXJJQ0FnSUZ4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUdGc2NHaGhJRDBnTVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJaWtnS3lCY2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ0xUQXVNaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQmhiSEJvWVNBOUlEQXVOU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNJR3hwYm1WMGVYQmxJRDBnWENKa1lYTm9aV1JjSWlrZ0sxeHVJQ0JqYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9MVEF1T0N3Z01DNDFLU2xjYmlBZ0lDQmNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW1sdWMzVnNZWFJwYjI1Q2IzVnVaR0Z5ZVY5a1pXeDBZVndpS1Z4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LU0FnWEc0Z0lGeHVJQ0JjYmlBakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJRnh1SUNBZ0lGeHVJQ0FnSUcxcGJsWmhiSFZsSUR3dElDMDBYRzRnSUc5aWMyVjRjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRndpYkc5dmNGTmpiM0psWDJOdmJuTmZiMkp6Wlhod0xuUnpkbHdpS1NrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR3h2WjE5dlluTmxlSEJmUkUxVFR5QTlJR2xtWDJWc2MyVW9iMkp6Wlhod1gwUk5VMDhnUFQwZ01Dd2diV2x1Vm1Gc2RXVXNJR3h2WnpJb2IySnpaWGh3WDBSTlUwOHBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJkZmIySnpaWGh3WDJSVVFVY2dQU0JwWmw5bGJITmxLRzlpYzJWNGNGOWtWRUZISUQwOUlEQXNJRzFwYmxaaGJIVmxMQ0JzYjJjeUtHOWljMlY0Y0Y5a1ZFRkhLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5Qk5EZzFJRDBnYVdaZlpXeHpaU2h2WW5ObGVIQmZRVFE0TlNBOVBTQXdMQ0J0YVc1V1lXeDFaU3dnYkc5bk1paHZZbk5sZUhCZlFUUTROU2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dloxOXZZbk5sZUhCZlpHbG1abDlrVkVGSFgwUk5VMDhnUFNCc2IyZGZiMkp6Wlhod1gyUlVRVWNnTFNCc2IyZGZiMkp6Wlhod1gwUk5VMDhzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5blgyOWljMlY0Y0Y5a2FXWm1YMEUwT0RWZlJFMVRUeUE5SUd4dloxOXZZbk5sZUhCZlFUUTROU0F0SUd4dloxOXZZbk5sZUhCZlJFMVRUeWxjYmx4dVoyVnVaVUZ1Ym05RVlYUmhJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnYkdWbWRGOXFiMmx1S0c5aWMyVjRjQ3dnWW5rZ1BTQmpLRndpYVdSY0lpa3BYRzVjYm1SaGRHRWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHZHliM1Z3TENCcFpDd2diRzluWDI5aWMyVjRjRjlrYVdabVgyUlVRVWRmUkUxVFR5a2dKVDRsSUdScGMzUnBibU4wS0NsY2JseHVYRzVuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpQWdaR2x6ZEdGdVkyVXhJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlaM0p2ZFhBeEtTQXBKR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOWNiaUFnWkdsemRHRnVZMlV5SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXlLU0FwSkd4dloxOXZZbk5sZUhCZlpHbG1abDlrVkVGSFgwUk5VMDljYmlBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SUNCeVpYUjFjbTRvZDJsc0pIQXVkbUZzZFdVcFhHNTlYRzVjYmlNZ1kyOXVkbEIyWVd4MVpTaG5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNJRndpYm05Q2IzVnVaR0Z5ZVZ3aUxDQmNJbmRwZEdocGJrSnZkVzVrWVhKNVhDSXBLVnh1SXlCamIyNTJVSFpoYkhWbEtHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTd2dYQ0p1YjBKdmRXNWtZWEo1WENJc0lGd2liM1YwYzJsa1pVSnZkVzVrWVhKNVhDSXBLVnh1SXlCamIyNTJVSFpoYkhWbEtHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTd2dYQ0p2ZFhSemFXUmxRbTkxYm1SaGNubGNJaXdnWENKM2FYUm9hVzVDYjNWdVpHRnllVndpS1NsY2JpTWdYRzVjYm5BZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QTENCbWFXeHNJRDBnWjNKdmRYQXBLU0FySUZ4dUlDQm5aVzl0WDNacGIyeHBiaWhzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aUxDQmhiSEJvWVNBOUlDNDBMQ0FzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNeXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QkxDQWdZV3h3YUdFZ1BTQXdMallzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWEc0Z0lDQWdZV1Z6S0dkeWIzVndJRDBnWjNKdmRYQXBMQ0JtZFc0Z1BTQnRaV0Z1TEZ4dUlDQWdJR2RsYjIwZ1BTQmNJbkJ2YVc1MFhDSXNJSE5vWVhCbElEMGdNakVzSUhOcGVtVWdQU0F3TGpVc1hHNGdJQ0FnWm1sc2JDQTlJRndpWW14aFkydGNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzSUhCdmMybDBhVzl1SUQwZ2NHOXphWFJwYjI1ZlpHOWtaMlVvTGpNcFhHNGdJQ2tnSzF4dUlDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRndpWjNKbGVUVXdYQ0lzSUZ3aUl6VkZRemsyTWx3aUxDQmNJaU0xUlVNNU5qSmNJaWtwSUN0Y2JseHVJQ0IwYUdWdFpTaGNiaUFnSUNCaGVHbHpMblJwZEd4bExuZ2dQU0JsYkdWdFpXNTBYMkpzWVc1cktDa3NYRzRnSUNBZ1lYaHBjeTUwYVhSc1pTNTVJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ2tzSUNBZ0lGeHVJQ0FnSUdGNGFYTXVkR1Y0ZEM1NElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3hjYmlBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUNBZ0lDQWdJeUJTYjNSaGRHVWdlQzFoZUdseklHeGhZbVZzY3lBME5TQmtaV2R5WldWelhHNGdJQ0FnSUNCb2FuVnpkQ0E5SURFc0lDQWdJQ0FnSUNNZ1FXUnFkWE4wSUdodmNtbDZiMjUwWVd3Z2FuVnpkR2xtYVdOaGRHbHZibHh1SUNBZ0lDQWdkbXAxYzNRZ1BTQXhJQ0FnSUNBZ0lDQWpJRUZrYW5WemRDQjJaWEowYVdOaGJDQnFkWE4wYVdacFkyRjBhVzl1WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNJblJ5WVc1emNHRnlaVzUwWENJcExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDa2dLMnhoWW5Nb2VTQTlJRndpYkc5bk1paG1ZeUJ2WmlCdlluTXZaWGh3S1Z3aUtTQWdLeUFnSUNCY2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01DeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCaGJIQm9ZU0E5SURFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lwSUNzZ1hHNGdJR052YjNKa1gyTmhjblJsYzJsaGJpaDViR2x0SUQwZ1l5Z3RNaXdnTWlrcFhHNGdJQ0FnWEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSnBibk4xYkdGMGFXOXVRbTkxYm1SaGNubGZiMkp6Wlhod1hDSXBYRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncElDQmNibHh1WEc1Y2JseHVYRzRqSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlOY2JseHVYRzVuWlc1bExuZHBkR2hwYmtKdmRXNWtZWEo1SUR3dElIVnVhWEYxWlNnb1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRndpZDJsMGFHbHVRbTkxYm1SaGNubGNJaWtwSkdkbGJtVXBYRzVuWlc1bExtOTFkSE5wWkdWQ2IzVnVaR0Z5ZVNBOExTQjFibWx4ZFdVb0tHZGxibVZCYm01dlJHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JjSW05MWRITnBaR1ZDYjNWdVpHRnllVndpS1Nra1oyVnVaU2xjYm1kbGJtVXVibTlDYjNWdVpHRnllU0E4TFNCMWJtbHhkV1VvS0dkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNJbTV2UW05MWJtUmhjbmxjSWlrcEpHZGxibVVwWEc1Y2JtZGxibVV1ZDBKdmRXNWtZWEo1SUR3dElIVnVhWEYxWlNoaktHZGxibVV1ZDJsMGFHbHVRbTkxYm1SaGNua3NJR2RsYm1VdWIzVjBjMmxrWlVKdmRXNWtZWEo1S1NsY2JseHVaMlZ1WlM1bmNtOTFjREVnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJKcGJtRnllVWR5YjNWd01TNTBjM1pjSWlrcEpHZGxibVZjYm1kbGJtVXVaM0p2ZFhBeUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREl1ZEhOMlhDSXBLU1JuWlc1bFhHNWNibkJ5YVc1MEtGd2ljR1Z5WXlCdlppQm5aVzVsSUhkcGRHZ2diRzl2Y0NCM2FYUm9hVzRnUW05MWJtUmhjbmxjSWlsY2JuTjFiU2huWlc1bExtZHliM1Z3TVNBbGFXNGxJR2RsYm1VdWQybDBhR2x1UW05MWJtUmhjbmtwTDJ4bGJtZDBhQ2huWlc1bExtZHliM1Z3TVNrcU1UQXdYRzV6ZFcwb1oyVnVaUzVuY205MWNESWdKV2x1SlNCblpXNWxMbmRwZEdocGJrSnZkVzVrWVhKNUtTOXNaVzVuZEdnb1oyVnVaUzVuY205MWNESXBLakV3TUZ4dVhHNXdjbWx1ZENoY0luQmxjbU1nYjJZZ1oyVnVaU0IzYVhSb0lHeHZiM0FnYjNWMGMybGtaU0JDYjNWdVpHRnllVndpS1Z4dWMzVnRLR2RsYm1VdVozSnZkWEF4SUNWcGJpVWdaMlZ1WlM1dmRYUnphV1JsUW05MWJtUmhjbmtwTDJ4bGJtZDBhQ2huWlc1bExtZHliM1Z3TVNrcU1UQXdYRzV6ZFcwb1oyVnVaUzVuY205MWNESWdKV2x1SlNCblpXNWxMbTkxZEhOcFpHVkNiM1Z1WkdGeWVTa3ZiR1Z1WjNSb0tHZGxibVV1WjNKdmRYQXlLU294TURCY2JseHVjSEpwYm5Rb1hDSndaWEpqSUc5bUlHZGxibVVnZDJsMGFDQnNiMjl3SUhkcGRHZ2dibThnUW05MWJtUmhjbmxjSWlsY2JuTjFiU2huWlc1bExtZHliM1Z3TVNBbGFXNGxJR2RsYm1VdWJtOUNiM1Z1WkdGeWVTa3ZiR1Z1WjNSb0tHZGxibVV1WjNKdmRYQXhLU294TURCY2JuTjFiU2huWlc1bExtZHliM1Z3TWlBbGFXNGxJR2RsYm1VdWJtOUNiM1Z1WkdGeWVTa3ZiR1Z1WjNSb0tHZGxibVV1WjNKdmRYQXlLU294TURCY2JseHVYRzVrYVdabUxsSk9RU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSmthV1ptWDBjeExtUlVRVWRmUnpFdU1ta3VaRlJCUjE5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx3aUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWlc1elpXMWliRjluWlc1bFgybGtMQ0JzYjJjeVJtOXNaRU5vWVc1blpTd2djMmh5YVc1clpXUmZiRzluTWtaRExDQndZV1JxTENCbGVIUmxjbTVoYkY5blpXNWxYMjVoYldVcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR2R5YjNWd0lEMGdZMkZ6WlY5M2FHVnVLRnh1SUNBZ0lHVnVjMlZ0WW14ZloyVnVaVjlwWkNBbGFXNGxJR2RsYm1VdWQwSnZkVzVrWVhKNUlINGdYQ0ozYVhSb2FXNUNiM1Z1WkdGeWVWd2lMRnh1SUNBZ0lHVnVjMlZ0WW14ZloyVnVaVjlwWkNBbGFXNGxJR2RsYm1VdWJtOUNiM1Z1WkdGeWVTQitJRndpYm05Q2IzVnVaR0Z5ZVZ3aUxGeHVJQ0FnSUZSU1ZVVWdmaUJPUVZ4dUlDQXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lnaGFYTXVibUVvWjNKdmRYQXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNoaFluTk1iMmN5UmtNZ1BTQmhZbk1vYkc5bk1rWnZiR1JEYUdGdVoyVXBLVnh1WEc1Y2JtZG5jR3h2ZENoa2FXWm1MbEpPUVN3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlHeHZaekpHYjJ4a1EyaGhibWRsS1NrZ0t5Qm5aVzl0WDNacGIyeHBiaWdwSUNzZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4S1Z4dVhHNW5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOVozSnZkWEF4S1NBcEpHRmljMHh2WnpKR1ExeHVJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDFuY205MWNESXBJQ2trWVdKelRHOW5Na1pEWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WTI5dWRsQjJZV3gxWlNoblpYUlFkbUZzVjJsc1kyOTRLR1JwWm1ZdVVrNUJMQ0JjSW5kcGRHaHBia0p2ZFc1a1lYSjVYQ0lzSUZ3aWJtOUNiM1Z1WkdGeWVWd2lLU2xjYmx4dVhHNGpJRU55WldGMFpTQjBhR1VnUTBSR0lIQnNiM1JjYm5BZ1BDMGdaMmR3Ykc5MEtHUnBabVl1VWs1QkxDQmhaWE1vZUNBOUlHRmljMHh2WnpKR1F5d2dZMjlzYjNJZ1BTQm5jbTkxY0NrcElDdGNibk4wWVhSZlpXTmtaaWh6YVhwbElEMGdNQzQwSUNrZ0t5QWpJRlZ6WlNCemRHRjBYMlZqWkdZZ2RHOGdjR3h2ZENCMGFHVWdaVzF3YVhKcFkyRnNJRU5FUmx4dUlDQnNZV0p6S0Z4dUlDQWdJSGdnUFNCY0lrRmljMjlzZFhSbElHeHZaeklvWm05c1pDQmphR0Z1WjJVcFhDSXNYRzRnSUNBZ2VTQTlJRndpUTNWdGRXeGhkR2wyWlNCUWNtOWlZV0pwYkdsMGVWd2lYRzRnSUNrZ0t5QmpiMjl5WkY5allYSjBaWE5wWVc0b2VHeHBiU0E5SUdNb01Dd2dNQzQxS1NrZ0sxeHVJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUFqSUVOc1pXRnVJSFJvWlcxbFhHNGdJSFJvWlcxbEtGeHVJQ0FnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1c2FXNWxJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdsamEzTWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aUxGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYQ0owY21GdWMzQmhjbVZ1ZEZ3aUtTeGNiaUFnSUNCc1pXZGxibVF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnYkdWblpXNWtMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1Z4dUlDQWdJQ2xjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2liRzluTWtaRFgyTmtabDlwYm5OMWJHRjBhVzl1UW05MWJtUmhjbmxjSWlsY2JuZHBaSFJvSUR3dElIQmhibVZzVTJsNlpTZ3lMalVwS20xdFZHOUpibU5vWEc1b1pXbG5hSFFnUEMwZ2NHRnVaV3hUYVhwbEtERXVOU2txYlcxVWIwbHVZMmhjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibHh1WEc1Y2JpTWpJeUJEYUdWamEybHVaeUJqYUdGeVlXTjBaWEp6ZEdsamN5QnZaaUJoYm1Ob2IzSnpYRzUwWlcxd01TQThMU0JoYm1Ob2IzSXVaR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY0ltNXZRbTkxYm1SaGNubGNJaWtnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvTFdkeWIzVndLVnh1WVc1amFHOXlMbTV2UW05MWJtUmhjbmtnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWgwWlcxd01TbGNibHh1ZEdWdGNESWdQQzBnWVc1amFHOXlMbVJoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1hDSjNhWFJvYVc1Q2IzVnVaR0Z5ZVZ3aUtTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDZ3RaM0p2ZFhBcFhHNWhibU5vYjNJdWQybDBhR2x1UW05MWJtUmhjbmtnUEMwZ1pYaDBjbUZqZEVGdVkyaHZjaWgwWlcxd01pbGNibHh1ZEdWdGNETWdQQzBnWVc1amFHOXlMbVJoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1hDSnZkWFJ6YVdSbFFtOTFibVJoY25sY0lpa2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9MV2R5YjNWd0tWeHVZVzVqYUc5eUxtOTFkSE5wWkdWQ2IzVnVaR0Z5ZVNBOExTQmxlSFJ5WVdOMFFXNWphRzl5S0hSbGJYQXpLVnh1WEc1Y2JtZGxkRkIyWVd4WGFXeGpiM2dnUEMwZ1puVnVZM1JwYjI0b1pHRjBZU3dnWjNKdmRYQXhMQ0JuY205MWNESXBlMXh1SUNCa2FYTjBZVzVqWlRFZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JHOXZjQ0E5UFdkeWIzVndNU2tnS1NSemRXMVRZMjl5WlZ4dUlDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9iRzl2Y0NBOVBXZHliM1Z3TWlrZ0tTUnpkVzFUWTI5eVpWeHVJQ0IzYVd3Z1BDMGdkMmxzWTI5NExuUmxjM1FvWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcFhHNGdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYm4xY2JseHVaMlYwVTNWdFUyTnZjbVZ6SUR3dElHWjFibU4wYVc5dUtIUnlZV05yTENCaGJtTm9iM0lwSUh0Y2JpQWdJeUJHYVc1a0lHOTJaWEpzWVhCeklHSmxkSGRsWlc0Z1lXeHNJR0Z1WTJodmNuTWdZVzVrSUhSeVlXTnJJSEpsWjJsdmJuTWdZWFFnYjI1alpWeHVJQ0J2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9ZVzVqYUc5eUxDQjBjbUZqYXlsY2JpQWdYRzRnSUNNZ1JYaDBjbUZqZENCMGFHVWdjMk52Y21WeklHRnVaQ0JqYjNKeVpYTndiMjVrYVc1bklHRnVZMmh2Y2lCcGJtUnBZMlZ6WEc0Z0lHRnVZMmh2Y2w5cGJtUnBZMlZ6SUR3dElIRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGNiaUFnZEhKaFkydGZjMk52Y21WeklEd3RJSE5qYjNKbEtIUnlZV05yS1Z0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRYRzRnSUZ4dUlDQWpJRlZ6WlNCMFlYQndiSGtnZEc4Z1kyRnNZM1ZzWVhSbElIUm9aU0J0WldScFlXNGdjMk52Y21WeklHWnZjaUJsWVdOb0lHRnVZMmh2Y2x4dUlDQnRaV1JwWVc1ZmMyTnZjbVZ6SUR3dElIUmhjSEJzZVNoMGNtRmphMTl6WTI5eVpYTXNJR0Z1WTJodmNsOXBibVJwWTJWekxDQnRaV0Z1TENCdVlTNXliU0E5SUZSU1ZVVXBYRzRnSUZ4dUlDQWpJRWx1YVhScFlXeHBlbVVnWVNCdWRXMWxjbWxqSUhabFkzUnZjaUIwYnlCemRHOXlaU0IwYUdVZ2JXVmthV0Z1SUhOamIzSmxjeUJtYjNJZ1pXRmphQ0JoYm1Ob2IzSmNiaUFnWVd4c1gyMWxaR2xoYmw5elkyOXlaWE1nUEMwZ2NtVndLRTVCTENCc1pXNW5kR2dvWVc1amFHOXlLU2xjYmlBZ1hHNGdJQ01nVUc5d2RXeGhkR1VnZEdobElHMWxaR2xoYmlCelkyOXlaWE1nWm05eUlIUm9aU0JoYm1Ob2IzSnpJSFJvWVhRZ2FHRjJaU0J2ZG1WeWJHRndjMXh1SUNCaGJHeGZiV1ZrYVdGdVgzTmpiM0psYzF0aGN5NXVkVzFsY21saktHNWhiV1Z6S0cxbFpHbGhibDl6WTI5eVpYTXBLVjBnUEMwZ2JXVmthV0Z1WDNOamIzSmxjMXh1SUNCY2JpQWdjbVYwZFhKdUtHRnNiRjl0WldScFlXNWZjMk52Y21WektWeHVmVnh1WEc1d2JHOTBVM1Z0VTJOdmNtVnpRbWx1WVhKNUlEd3RJR1oxYm1OMGFXOXVLSFJ5WVdOckxDQndaV0ZyTENCdVlXMWxMQ0JoYm1Ob2IzSXhMQ0JoYm1Ob2IzSXlMQ0JoYm1Ob2IzSXpLWHRjYmlBZ2NHVmhhMVJ5WVdOcklEd3RJSFJ5WVdOclczVnVhWEYxWlNoeGRXVnllVWhwZEhNb1ptbHVaRTkyWlhKc1lYQnpLSFJ5WVdOckxDQndaV0ZyS1NrcFhWeHVJQ0JoSUR3dElHZGxkRk4xYlZOamIzSmxjeWh3WldGclZISmhZMnNzSUdGdVkyaHZjakVwWEc0Z0lHSWdQQzBnWjJWMFUzVnRVMk52Y21WektIQmxZV3RVY21GamF5d2dZVzVqYUc5eU1pbGNiaUFnWXlBOExTQm5aWFJUZFcxVFkyOXlaWE1vY0dWaGExUnlZV05yTENCaGJtTm9iM0l6S1Z4dUlDQmhMblJpSUR3dElIUnBZbUpzWlNoc2IyOXdJRDBnWENKdWIwSnZkVzVrWVhKNVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE4xYlZOamIzSmxJRDBnWVNsY2JpQWdZaTUwWWlBOExTQjBhV0ppYkdVb2JHOXZjQ0E5SUZ3aWQybDBhRUp2ZFc1a1lYSjVYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOMWJWTmpiM0psSUQwZ1lpbGNiaUFnWXk1MFlpQThMU0IwYVdKaWJHVW9iRzl2Y0NBOUlGd2liM1YwYzJsa1pVSnZkVzVrWVhKNVhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE4xYlZOamIzSmxJRDBnWXlsY2JpQWdYRzRnSUdSaGRHRWdQQzBnWW1sdVpGOXliM2R6S0dFdWRHSXNJR0l1ZEdJc0lHTXVkR0lwSUNVK0pTQmtjbTl3WDI1aEtDbGNiaUFnWkdGMFlTUnNiMjl3SUR3dElHWmhZM1J2Y2loa1lYUmhKR3h2YjNBc0lHeGxkbVZzY3lBOUlHTW9YQ0p1YjBKdmRXNWtZWEo1WENJc0lGd2lkMmwwYUVKdmRXNWtZWEo1WENJc0lGd2liM1YwYzJsa1pVSnZkVzVrWVhKNVhDSXBLVnh1SUNCY2JpQWdjREV5SUR3dElHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTd2dYQ0p1YjBKdmRXNWtZWEo1WENJc0lGd2lkMmwwYUVKdmRXNWtZWEo1WENJcFhHNGdJSEF4TXlBOExTQm5aWFJRZG1Gc1YybHNZMjk0S0dSaGRHRXNJRndpYm05Q2IzVnVaR0Z5ZVZ3aUxDQmNJbTkxZEhOcFpHVkNiM1Z1WkdGeWVWd2lLVnh1SUNCd01qTWdQQzBnWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTENCY0luZHBkR2hDYjNWdVpHRnllVndpTENCY0ltOTFkSE5wWkdWQ2IzVnVaR0Z5ZVZ3aUtWeHVJQ0J3SUR3dElDQm5aM0JzYjNRb1pHRjBZU3dnWVdWektIZ2dQU0JzYjI5d0xDQjVJRDBnYzNWdFUyTnZjbVVwS1NBcklGeHVJQ0FnSUd4aFluTW9lQ0E5SUU1VlRFd3NJSGtnUFNCd1lYTjBaVEFvYm1GdFpTd2dYQ0pjWEc1c2IyY29ZWFpuSUhCbFlXc2djMk52Y21VZ2NHVnlJR0Z1WTJodmNpbGNJaWtwSUN0Y2JpQWdJQ0JuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlHeHZiM0FwTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUN0Y2JpQWdJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqRXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZkWFJzYVdWeUxuTnBlbVVnUFNBeExDQnZkWFJzYVdWeUxuTjBjbTlyWlNBOUlFNUJLU0FySUhSb1pXMWxYMk5zWVhOemFXTW9LU0FyWEc0Z0lDQWdjM1JoZEY5emRXMXRZWEo1S0Z4dUlDQWdJQ0FnWVdWektHZHliM1Z3SUQwZ2JHOXZjQ2tzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnSUNCblpXOXRJRDBnWENKd2IybHVkRndpTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01TeGNiaUFnSUNBZ0lHWnBiR3dnUFNCY0luSmxaRndpTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWx4dUlDQWdJQ2tnS3lCMGFHVnRaU2hjYmlBZ0lDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpWEc0Z0lDQWdJQ0FwTEZ4dUlDQWdJQ0FnWVhocGN5NTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUdGNGFYTXVkR1Y0ZEM1NElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnSUNCaGJtZHNaU0E5SURRMUxDQm9hblZ6ZENBOUlERXNJSFpxZFhOMElEMGdNVnh1SUNBZ0lDQWdLU3hjYmlBZ0lDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXdnYzJsNlpTQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQWdJQ2tzWEc0Z0lDQWdJQ0JoZUdsekxuUnBZMnR6SUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTENCemFYcGxJRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGd2lkSEpoYm5Od1lYSmxiblJjSWlrc1hHNGdJQ0FnSUNCc1pXZGxibVF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ0FnS1NBcklGeHVJQ0FnSUNOamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vY1hWaGJuUnBiR1VvWkdGMFlTUnpkVzFUWTI5eVpTd2dNQzR3S1N3Z2NYVmhiblJwYkdVb1pHRjBZU1J6ZFcxVFkyOXlaU3dnTUM0NU9Ta3BLU0FySUZ4dUlDQWdJR0Z1Ym05MFlYUmxLRnh1SUNBZ0lDQWdYQ0owWlhoMFhDSXNJSGdnUFNBeExDQjVJRDBnY1hWaGJuUnBiR1VvWkdGMFlTUnpkVzFUWTI5eVpTd2dNQzQxS1N4Y2JpQWdJQ0FnSUd4aFltVnNJRDBnY0dGemRHVXdLRndpY0RFeU9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod01USXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndNVE02SUZ3aUxDQmpiMjUyVUhaaGJIVmxLSEF4TXlrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5BeU16b2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NESXpLU2tzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXdnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTTF4dUlDQWdJQ2tnWEc0Z0lDTXJJSE5qWVd4bFgzbGZZMjl1ZEdsdWRXOTFjeWgwY21GdWN5QTlJRndpYkc5bk1UQmNJaWxjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSWtOb1NWQmZjR1ZoYTE5aGRtZFFaV0ZyVTJOdmNtVmZZbTkxYm1SaGNubEJibU5vYjNKZlhDSXNJRzVoYldVcFhHNGdJSGRwWkhSb0lEd3RJSEJoYm1Wc1UybDZaU2d5S1NwdGJWUnZTVzVqYUZ4dUlDQm9aV2xuYUhRZ1BDMGdjR0Z1Wld4VGFYcGxLRElwS20xdFZHOUpibU5vWEc0Z0lIQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzRnSUhOMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpQWdjSEpwYm5Rb2NDbGNiaUFnWkdWMkxtOW1aaWdwWEc1OVhHNWNiaU1nVTNWdElIQmxZV3NnYzJOdmNtVmNiaU1qSXlOY2JuUnlZV05ySUR3dElHbHRjRzl5ZENob1pYSmxLSEpsWmtScGNpd2dYQ0l6TXpJMU5WOUlNMHMwYldVelh6QTBMVGMwTlY5Q2NuVmpaUzAwWDNSeWFXMWZjVEl3WDJSbFpIVndYMkpzWVdOclgyUmxjSFJvVG05eWJTNWlkMXdpS1N3Z1ptOXliV0YwSUQwZ1hDSkNhV2RYYVdkY0lpbGNibkJsWVdzZ1BDMGdhVzF3YjNKMFVHVmhheWhvWlhKbEtISmxaa1JwY2l3Z1hDSXpNekkxTlY5SU0wczBiV1V6WHpBMExUYzBOVjlDY25WalpTMDBYM0JsWVd0ekxtMWxjbWRsVUdWaGF5NWlaV1JjSWlrcFhHNXdiRzkwVTNWdFUyTnZjbVZ6UW1sdVlYSjVLSFJ5WVdOckxDQndaV0ZyTENCY0lrZ3pTelJ0WlROY0lpd2dZVzVqYUc5eUxtNXZRbTkxYm1SaGNua3NJR0Z1WTJodmNpNTNhWFJvYVc1Q2IzVnVaR0Z5ZVN3Z1lXNWphRzl5TG05MWRITnBaR1ZDYjNWdVpHRnllU2xjYmx4dWRISmhZMnNnUEMwZ2FXMXdiM0owS0dobGNtVW9jbVZtUkdseUxDQmNJa2RUVFRJME16ZzBOelpmUlVNdFJFY3RNelExT0MxSU0wc3lOMEZEWDBGVFdVNWZNUzVpZDF3aUtTd2dabTl5YldGMElEMGdYQ0pDYVdkWGFXZGNJaWxjYm5CbFlXc2dQQzBnYVcxd2IzSjBVR1ZoYXlob1pYSmxLSEpsWmtScGNpd2dYQ0pIVTAweU5ETTRORGMyWDBWRExVUkhMVE0wTlRndFNETkxNamRCUTE5QlUxbE9YekV1Ym1GeWNtOTNVR1ZoYXk1aVpXUmNJaWtwWEc0amNHeHZkRk4xYlZOamIzSmxjeWgwY21GamF5d2djR1ZoYXl3Z1hDSklNMHN5TjJGalhDSXBYRzV3Ykc5MFUzVnRVMk52Y21WelFtbHVZWEo1S0hSeVlXTnJMQ0J3WldGckxDQmNJa2d6U3pJM1lXTmNJaXdnWVc1amFHOXlMbTV2UW05MWJtUmhjbmtzSUdGdVkyaHZjaTUzYVhSb2FXNUNiM1Z1WkdGeWVTd2dZVzVqYUc5eUxtOTFkSE5wWkdWQ2IzVnVaR0Z5ZVNsY2JseHVkSEpoWTJzZ1BDMGdhVzF3YjNKMEtHaGxjbVVvY21WbVJHbHlMQ0JjSWtkVFRUSTJPRE0wTkRCZlNqRmZTRE5MTVRSaFkxOXRiVEV3VEdsbWRHVmtMbUpzWVdOckxtSjNYQ0lwTENCbWIzSnRZWFFnUFNCY0lrSnBaMWRwWjF3aUtWeHVjR1ZoYXlBOExTQnBiWEJ2Y25SUVpXRnJLR2hsY21Vb2NtVm1SR2x5TENCY0lrZFRUVEkyT0RNME5EQmZTakZmU0ROTE1UUmhZMTl0YlRFd1RHbG1kR1ZrTG1KbFpGd2lLU2xjYmlOd2JHOTBVM1Z0VTJOdmNtVnpLSFJ5WVdOckxDQndaV0ZyTENCY0lrZ3pTekUwWVdOY0lpbGNibkJzYjNSVGRXMVRZMjl5WlhOQ2FXNWhjbmtvZEhKaFkyc3NJSEJsWVdzc0lGd2lTRE5MTVRSaFkxd2lMQ0JoYm1Ob2IzSXVibTlDYjNWdVpHRnllU3dnWVc1amFHOXlMbmRwZEdocGJrSnZkVzVrWVhKNUxDQmhibU5vYjNJdWIzVjBjMmxrWlVKdmRXNWtZWEo1S1Z4dVhHNTBjbUZqYXlBOExTQnBiWEJ2Y25Rb2FHVnlaU2h5WldaRWFYSXNJRndpTXpNeU5EaGZRMVJEUmw4d055MDNNamxmUW5KMVkyVXRORjkwY21sdFgzRXlNRjlrWldSMWNGOWliR0ZqYTE5a1pYQjBhRTV2Y20wdVluZGNJaWtzSUdadmNtMWhkQ0E5SUZ3aVFtbG5WMmxuWENJcFhHNXdaV0ZySUR3dElHbHRjRzl5ZEZCbFlXc29hR1Z5WlNoeVpXWkVhWElzSUZ3aU16TXlORGhmUTFSRFJsOHdOeTAzTWpsZlFuSjFZMlV0TkY5d1pXRnJjeTV0WlhKblpWQmxZV3N1WW1Wa1hDSXBLVnh1STNCc2IzUlRkVzFUWTI5eVpYTW9kSEpoWTJzc0lIQmxZV3NzSUZ3aVExUkRSbHdpS1Z4dWNHeHZkRk4xYlZOamIzSmxjMEpwYm1GeWVTaDBjbUZqYXl3Z2NHVmhheXdnWENKRFZFTkdYQ0lzSUdGdVkyaHZjaTV1YjBKdmRXNWtZWEo1TENCaGJtTm9iM0l1ZDJsMGFHbHVRbTkxYm1SaGNua3NJR0Z1WTJodmNpNXZkWFJ6YVdSbFFtOTFibVJoY25rcFhHNWNiblJ5WVdOcklEd3RJR2x0Y0c5eWRDaG9aWEpsS0hKbFprUnBjaXdnWENJek16STFNRjlTUVVReU1WOWhZams1TWw5Q2NuVmpaUzAwWDNSeWFXMWZjVEl3WDJSbFpIVndYMkpzWVdOclgyUmxjSFJvVG05eWJTNWlkMXdpS1N3Z1ptOXliV0YwSUQwZ1hDSkNhV2RYYVdkY0lpbGNibkJsWVdzZ1BDMGdhVzF3YjNKMFVHVmhheWhvWlhKbEtISmxaa1JwY2l3Z1hDSXpNekkxTUY5U1FVUXlNVjloWWprNU1sOUNjblZqWlMwMFgzQmxZV3R6TG0xbGNtZGxVR1ZoYXk1aVpXUmNJaWtwWEc0amNHeHZkRk4xYlZOamIzSmxjeWgwY21GamF5d2djR1ZoYXl3Z1hDSlNRVVF5TVZ3aUtWeHVjR3h2ZEZOMWJWTmpiM0psYzBKcGJtRnllU2gwY21GamF5d2djR1ZoYXl3Z1hDSlNRVVF5TVZ3aUxDQmhibU5vYjNJdWJtOUNiM1Z1WkdGeWVTd2dZVzVqYUc5eUxuZHBkR2hwYmtKdmRXNWtZWEo1TENCaGJtTm9iM0l1YjNWMGMybGtaVUp2ZFc1a1lYSjVLVnh1WEc1Y2JseHVJeU1qSXlNakl5TWdURTlNUVZ4dVlYUmhZeUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSkhVMDB6TVRBMk1qVTNYMEZVUVVOZlJWTkRYekV1WW1Wa1hDSXBLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hXTVN3Z1ZqSXNJRll6S1Z4dVkyOXNibUZ0WlhNb1lYUmhZeWtnUEMwZ1l5aGNJbU5vY2x3aUxDQmNJbk4wWVhKMFhDSXNJRndpWlc1a1hDSXBYRzVoZEdGakxtZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2hoZEdGaktWeHVYRzRqSUV4UFFVUkpUa2NnVEU5UFVGTmNibXh2YjNBdVlXeHNJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1Ob2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGt1ZEhOMlhDSXBLU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhCYm01dk1pQWxhVzRsSUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSkZMVVZjSWlrcFhHNWhibU5vYjNJdVlXeHNJRHd0SUNobGVIUnlZV04wUVc1amFHOXlLR3h2YjNBdVlXeHNLU2xjYm05MlpYSnNZWEJ6SUR3dElHWnBibVJQZG1WeWJHRndjeWhoYm1Ob2IzSXVZV3hzTENCaGRHRmpMbWR5S1Z4dVlXNWphRzl5TG1Gc2JDQThMU0J3YVc1MFpYSnpaV04wS0dGdVkyaHZjaTVoYkd4YmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMHNJR0YwWVdNdVozSmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFNsY2JseHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHRnVZMmh2Y2k1dWIwSnZkVzVrWVhKNUxDQmhkR0ZqTG1keUtWeHVZVzVqYUc5eUxtNXZRbTkxYm1SaGNua2dQQzBnY0dsdWRHVnljMlZqZENoaGJtTm9iM0l1Ym05Q2IzVnVaR0Z5ZVZ0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0hNcFhTd2dZWFJoWXk1bmNsdHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWxkS1Z4dWIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjaTUzYVhSb2FXNUNiM1Z1WkdGeWVTd2dZWFJoWXk1bmNpbGNibUZ1WTJodmNpNTNhWFJvYVc1Q2IzVnVaR0Z5ZVNBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNTNhWFJvYVc1Q2IzVnVaR0Z5ZVZ0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0hNcFhTd2dZWFJoWXk1bmNsdHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWxkS1Z4dWIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjaTV2ZFhSemFXUmxRbTkxYm1SaGNua3NJR0YwWVdNdVozSXBYRzVoYm1Ob2IzSXViM1YwYzJsa1pVSnZkVzVrWVhKNUlEd3RJSEJwYm5SbGNuTmxZM1FvWVc1amFHOXlMbTkxZEhOcFpHVkNiM1Z1WkdGeWVWdHhkV1Z5ZVVocGRITW9iM1psY214aGNITXBYU3dnWVhSaFl5NW5jbHR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZEtWeHVYRzVjYmx4dVlXNWphRzl5Y3lBOExTQnNhWE4wS0dGdVkyaHZjaTV1YjBKdmRXNWtZWEo1TENCaGJtTm9iM0l1ZDJsMGFFSnZkVzVrWVhKNUxDQmhibU5vYjNJdWIzVjBjMmxrWlVKdmRXNWtZWEo1S1Z4dWRHSnpJRHd0SUd4cGMzUW9LVnh1ZEdWdGNITWdQQzBnYkdsemRDZ3BYRzVjYm1Gc2NHaGhJRHd0SURBdU1EVmNibHh1SXlCUWNtOWpaWE56SUdOc2RYTjBaWEp6SUdNeElIUnZJR000WEc1bWIzSWdLR2tnYVc0Z01Ub3pLU0I3WEc0Z0lGeHVJQ0JoYm1Ob2IzSWdQQzBnWVc1amFHOXljMXRiYVYxZFhHNGdJQ01nVW5WdUlFeFBURUZjYmlBZ2NtVnpkV3gwSUR3dElISjFia3hQVEVFb1lXNWphRzl5TENCaGJtTm9iM0l1WVd4c0xDQnNiMnhoUkVJcFhHNGdJSFJpSUR3dElHRnpYM1JwWW1Kc1pTaHlaWE4xYkhRcFhHNGdJRnh1SUNBaklFWnBiSFJsY2lCaGJtUWdjM1Z0YldGeWFYcGxYRzRnSUhSaUlEd3RJSFJpSUNVK0pWeHVJQ0FnSUdSd2JIbHlPanB0ZFhSaGRHVW9kR0Z5WjJWMElEMGdkRzkxY0hCbGNpaGhiblJwWW05a2VTa3BJQ1UrSlZ4dUlDQWdJR1pwYkhSbGNpaHpkSEpmZEc5ZmJHOTNaWElvWTJWc2JGUjVjR1VwSUQwOUlGd2laVzFpY25sdmJtbGpJSE4wWlcwZ1kyVnNiRndpS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82Wm1sc2RHVnlLSEZXWVd4MVpTQThJR0ZzY0doaEtTQWxQaVZjYmlBZ0lDQmtjR3g1Y2pvNlozSnZkWEJmWW5rb2RHRnlaMlYwS1NBbFBpVmNiaUFnSUNCemJHbGpaVjl0YVc0b2JXVmhibEp1YXl3Z2QybDBhRjkwYVdWeklEMGdSa0ZNVTBVcFhHNGdJRnh1SUNBaklGTjBiM0psSUhSaVhHNGdJSFJpYzF0YmFWMWRJRHd0SUhSaVhHNGdJRnh1SUNBaklGTmxiR1ZqZENCaGJtUWdjbVZ1WVcxbElHOWtaSE5TWVhScGIxeHVJQ0IwWlcxd0lEd3RJSFJpSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0hSaGNtZGxkQ3dnYjJSa2MxSmhkR2x2S1Z4dUlDQmpiMnh1WVcxbGN5aDBaVzF3S1NBOExTQmpLRndpZEdGeVoyVjBYQ0lzSUhCaGMzUmxNQ2hjSWs5U1gyTmNJaXdnYVNrcFhHNGdJRnh1SUNBaklGTjBiM0psSUhSbGJYQmNiaUFnZEdWdGNITmJXMmxkWFNBOExTQjBaVzF3WEc1OVhHNWNiaU1nVFdWeVoyVWdZV3hzSUhSbGJYQWdkR0ZpYkdWeklHbHVkRzhnYjI1bFhHNTBaVzF3SUR3dElGSmxaSFZqWlNobWRXNWpkR2x2YmloNExDQjVLU0JtZFd4c1gycHZhVzRvZUN3Z2VTd2dZbmtnUFNCY0luUmhjbWRsZEZ3aUtTd2dkR1Z0Y0hNcElDVStKVnh1SUNCdGRYUmhkR1ZmWVd4c0tINXlaWEJzWVdObFgyNWhLQzRzSURFcEtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjSW5SaGNtZGxkRndpTENCY0ltNXZRbTkxYm1SaGNubGNJaXdnWENKM2FYUm9hVzVDYjNWdVpHRnllVndpTENCY0ltOTFkSE5wWkdWQ2IzVnVaR0Z5ZVZ3aUtWeHVaR0YwWVNBOExTQjBaVzF3SUNVK0pTQmpiMngxYlc1ZmRHOWZjbTkzYm1GdFpYTW9YQ0owWVhKblpYUmNJaWtnSlQ0bElHRnpMbTFoZEhKcGVDZ3BYRzVjYm14cFluSmhjbmtvWTJseVkyeHBlbVVwWEc1amIyeGZablZ1SUR3dElHTnZiRzl5VW1GdGNESW9ZeWd4TENCdFlYZ29aR0YwWVNrcExDQmpLRndpZDJocGRHVmNJaXdnWENKeVpXUmNJaWtwWEc1Y2JseHVJMloyYVhwZmJtSmpiSFZ6ZENoa1lYUmhMQ0JyYldWaGJuTXNJRzFsZEdodlpDQTlJRndpZDNOelhDSXBYRzVjYm5BZ1BDMGdTR1ZoZEcxaGNDaGNiaUFnWkdGMFlTeGNiaUFnYm1GdFpTQTlJRndpVDJSa2N5QlNZWFJwYjF3aUxDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWpJRTVoYldVZ2IyWWdkR2hsSUdobFlYUnRZWEFnYkdWblpXNWtYRzRnSUdOc2RYTjBaWEpmWTI5c2RXMXVjeUE5SUVaQlRGTkZMQ0FnSUNBZ0lDQWdJQ0FnSUNNZ1VtVnRiM1psSUdOdmJIVnRiaUJrWlc1a2NtOW5jbUZ0WEc0Z0lITm9iM2RmY205M1gyUmxibVFnUFNCR1FVeFRSU3hjYmlBZ1kyOXNJRDBnWTI5c1gyWjFiaXhjYmlBZ1ltOXlaR1Z5SUQwZ1ZGSlZSVnh1S1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2LCA3LCAxMSwgMTIsIDI0LCAyOSwgMzEpKSAlPiUgdW5uZXN0KGdlbmUpXG5cblxuZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcbW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gXFwrXFwsIFYyLCBWMykpICU+JVxuICBkcGx5cjo6c2VsZWN0KFY2LCBUU1MpXG5jb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYyhcXGVuc2VtYmxcXCwgXFxUU1NcXClcblxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKGdlbmUuVFNTLnRiLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxcXCkpXG5cbmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlMSA9IChzdGFydDEgKyBlbmQxKS8yIC0gVFNTLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlMiA9IChzdGFydDIgKyBlbmQyKS8yIC0gVFNTLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gaWZfZWxzZShhYnMoZGlzdGFuY2UxKSA+IGFicyhkaXN0YW5jZTIpLCBkaXN0YW5jZTEsIGRpc3RhbmNlMikpXG5cbnJlc3VsdCA8LSBnZW5lQW5ub0RhdGEgJT4lXG4gIGZpbHRlcihBbm5vMiA9PSBcXFAtU1xcKSAlPiVcbiAgZ3JvdXBfYnkoZ2VuZSkgJT4lXG4gIHN1bW1hcmlzZShcbiAgICBmYXJSaWdodCA9IGlmIChhbnkoZGlzdGFuY2UgPiAwKSkgbWF4KGRpc3RhbmNlW2Rpc3RhbmNlID4gMF0pIGVsc2UgMCwgICMgUmV0dXJuIDAgaWYgbm8gcG9zaXRpdmUgZGlzdGFuY2VcbiAgICBmYXJMZWZ0ID0gaWYgKGFueShkaXN0YW5jZSA8IDApKSBtaW4oZGlzdGFuY2VbZGlzdGFuY2UgPCAwXSkgZWxzZSAwICAjIFJldHVybiAwIGlmIG5vIG5lZ2F0aXZlIGRpc3RhbmNlXG4gICkgJT4lXG4gIHVuZ3JvdXAoKVxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBsZWZ0X2pvaW4ocmVzdWx0LCBieSA9IGMoXFxnZW5lXFwpKVxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oaXMubmEoZmFyUmlnaHQpIH4gXFxOb1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXN0YW5jZSA+IGZhckxlZnQpICYgKGRpc3RhbmNlIDwgZmFyUmlnaHQpIH4gXFxXaXRoaW5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gXFxPdXRzaWRlXFwpLFxuICAgICAgICAgICAgICAgIHNpemUgPSBzdGFydDIgLSBzdGFydDEpXG5cbmRhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBpZCwgc2l6ZSkgJT4lIGRpc3RpbmN0KClcbmFuY2hvci5kYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGdyb3VwKSAlPiUgZGlzdGluY3QoKVxuXG50ZW1wMSA8LSBhbmNob3IuZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXE5vXFwpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cClcbmZ3cml0ZSh0ZW1wMSwgaGVyZShjb25zZW5zdXNEaXIsIFxcaW5zdWxhdGVkX2RvbWFpbl9wc19uby5iZWRwZVxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG50ZW1wMiA8LSBhbmNob3IuZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXFdpdGhpblxcKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApXG5md3JpdGUodGVtcDIsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGluc3VsYXRlZF9kb21haW5fcHNfd2l0aGluLmJlZHBlXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbnRlbXAzIDwtIGFuY2hvci5kYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcT3V0c2lkZVxcKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApXG5md3JpdGUodGVtcDMsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGluc3VsYXRlZF9kb21haW5fcHNfb3V0c2lkZS5iZWRwZVxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5cblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRzaXplXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzaXplXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXG5vQm91bmRhcnlcXCwgXFx3aXRoaW5Cb3VuZGFyeVxcKSlcbiMgY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsIFxcbm9Cb3VuZGFyeVxcLCBcXG91dHNpZGVCb3VuZGFyeVxcKSlcbiMgY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsIFxcb3V0c2lkZUJvdW5kYXJ5XFwsIFxcd2l0aGluQm91bmRhcnlcXCkpXG5cblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IHNpemUsIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICAgKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFxncmV5NTBcXCwgXFwjNUVDOTYyXFwsIFxcIzVFQzk2MlxcKSkgK1xuXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSxcbiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSwgICAgXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArbGFicyh5ID0gXFxMb29wIHNpemVcXClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbkJvdW5kYXJ5X3NpemVcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbiAgXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkZGlmZl9kVEFHX0RNU09cbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGRpZmZfZFRBR19ETVNPXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5kYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgaWQsIGRpZmZfZFRBR19ETVNPKSAlPiUgZGlzdGluY3QoKVxuXG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXG5vQm91bmRhcnlcXCwgXFx3aXRoaW5Cb3VuZGFyeVxcKSlcbiMgY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsIFxcbm9Cb3VuZGFyeVxcLCBcXG91dHNpZGVCb3VuZGFyeVxcKSlcbiMgY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsIFxcb3V0c2lkZUJvdW5kYXJ5XFwsIFxcd2l0aGluQm91bmRhcnlcXCkpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaWZmX2RUQUdfRE1TTywgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgYWxwaGEgPSAuNCwgLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKVxuICApICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXGdyZXk1MFxcLCBcXCM1RUM5NjJcXCwgXFwjNUVDOTYyXFwpKSArXG5cbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLFxuICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLCAgICBcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApICtsYWJzKHkgPSBcXM6UIGxvb3Agc2NvcmVcXCkgICsgICAgXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsXG4gICAgICAgICAgICAgYWxwaGEgPSAxLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLFxuICAgICAgICAgICAgIGFscGhhID0gMC41LCBcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC44LCAwLjUpKVxuICAgIFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbkJvdW5kYXJ5X2RlbHRhXFwpXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpICBcbiAgXG4gIFxuICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgXG4gICAgXG4gICAgbWluVmFsdWUgPC0gLTRcbiAgb2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTyxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPKVxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoXFxpZFxcKSlcblxuZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGlkLCBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSAlPiUgZGlzdGluY3QoKVxuXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TT1xuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TT1xuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuIyBjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGF0YSwgXFxub0JvdW5kYXJ5XFwsIFxcd2l0aGluQm91bmRhcnlcXCkpXG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXG5vQm91bmRhcnlcXCwgXFxvdXRzaWRlQm91bmRhcnlcXCkpXG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXG91dHNpZGVCb3VuZGFyeVxcLCBcXHdpdGhpbkJvdW5kYXJ5XFwpKVxuIyBcblxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFxncmV5NTBcXCwgXFwjNUVDOTYyXFwsIFxcIzVFQzk2MlxcKSkgK1xuXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSxcbiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSwgICAgXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArbGFicyh5ID0gXFxsb2cyKGZjIG9mIG9icy9leHApXFwpICArICAgIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgKyBcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0yLCAyKSlcbiAgICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25Cb3VuZGFyeV9vYnNleHBcXClcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKCkgIFxuXG5cblxuXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5cbmdlbmUud2l0aGluQm91bmRhcnkgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFx3aXRoaW5Cb3VuZGFyeVxcKSkkZ2VuZSlcbmdlbmUub3V0c2lkZUJvdW5kYXJ5IDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcb3V0c2lkZUJvdW5kYXJ5XFwpKSRnZW5lKVxuZ2VuZS5ub0JvdW5kYXJ5IDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcbm9Cb3VuZGFyeVxcKSkkZ2VuZSlcblxuZ2VuZS53Qm91bmRhcnkgPC0gdW5pcXVlKGMoZ2VuZS53aXRoaW5Cb3VuZGFyeSwgZ2VuZS5vdXRzaWRlQm91bmRhcnkpKVxuXG5nZW5lLmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ2VuZS5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxucHJpbnQoXFxwZXJjIG9mIGdlbmUgd2l0aCBsb29wIHdpdGhpbiBCb3VuZGFyeVxcKVxuc3VtKGdlbmUuZ3JvdXAxICVpbiUgZ2VuZS53aXRoaW5Cb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAxKSoxMDBcbnN1bShnZW5lLmdyb3VwMiAlaW4lIGdlbmUud2l0aGluQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMikqMTAwXG5cbnByaW50KFxccGVyYyBvZiBnZW5lIHdpdGggbG9vcCBvdXRzaWRlIEJvdW5kYXJ5XFwpXG5zdW0oZ2VuZS5ncm91cDEgJWluJSBnZW5lLm91dHNpZGVCb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAxKSoxMDBcbnN1bShnZW5lLmdyb3VwMiAlaW4lIGdlbmUub3V0c2lkZUJvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDIpKjEwMFxuXG5wcmludChcXHBlcmMgb2YgZ2VuZSB3aXRoIGxvb3Agd2l0aCBubyBCb3VuZGFyeVxcKVxuc3VtKGdlbmUuZ3JvdXAxICVpbiUgZ2VuZS5ub0JvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDEpKjEwMFxuc3VtKGdlbmUuZ3JvdXAyICVpbiUgZ2VuZS5ub0JvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDIpKjEwMFxuXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oXG4gICAgZW5zZW1ibF9nZW5lX2lkICVpbiUgZ2VuZS53Qm91bmRhcnkgfiBcXHdpdGhpbkJvdW5kYXJ5XFwsXG4gICAgZW5zZW1ibF9nZW5lX2lkICVpbiUgZ2VuZS5ub0JvdW5kYXJ5IH4gXFxub0JvdW5kYXJ5XFwsXG4gICAgVFJVRSB+IE5BXG4gICkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGFic0xvZzJGQyA9IGFicyhsb2cyRm9sZENoYW5nZSkpXG5cblxuZ2dwbG90KGRpZmYuUk5BLCBhZXMoeCA9IGdyb3VwLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEpXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkYWJzTG9nMkZDXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRhYnNMb2cyRkNcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5jb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGlmZi5STkEsIFxcd2l0aGluQm91bmRhcnlcXCwgXFxub0JvdW5kYXJ5XFwpKVxuXG5cbiMgQ3JlYXRlIHRoZSBDREYgcGxvdFxucCA8LSBnZ3Bsb3QoZGlmZi5STkEsIGFlcyh4ID0gYWJzTG9nMkZDLCBjb2xvciA9IGdyb3VwKSkgK1xuc3RhdF9lY2RmKHNpemUgPSAwLjQgKSArICMgVXNlIHN0YXRfZWNkZiB0byBwbG90IHRoZSBlbXBpcmljYWwgQ0RGXG4gIGxhYnMoXG4gICAgeCA9IFxcQWJzb2x1dGUgbG9nMihmb2xkIGNoYW5nZSlcXCxcbiAgICB5ID0gXFxDdW11bGF0aXZlIFByb2JhYmlsaXR5XFxcbiAgKSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAwLjUpKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArICMgQ2xlYW4gdGhlbWVcbiAgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxsb2cyRkNfY2RmX2luc3VsYXRpb25Cb3VuZGFyeVxcKVxud2lkdGggPC0gcGFuZWxTaXplKDIuNSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5cblxuIyMjIENoZWNraW5nIGNoYXJhY3RlcnN0aWNzIG9mIGFuY2hvcnNcbnRlbXAxIDwtIGFuY2hvci5kYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcbm9Cb3VuZGFyeVxcKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApXG5hbmNob3Iubm9Cb3VuZGFyeSA8LSBleHRyYWN0QW5jaG9yKHRlbXAxKVxuXG50ZW1wMiA8LSBhbmNob3IuZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXHdpdGhpbkJvdW5kYXJ5XFwpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cClcbmFuY2hvci53aXRoaW5Cb3VuZGFyeSA8LSBleHRyYWN0QW5jaG9yKHRlbXAyKVxuXG50ZW1wMyA8LSBhbmNob3IuZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXG91dHNpZGVCb3VuZGFyeVxcKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApXG5hbmNob3Iub3V0c2lkZUJvdW5kYXJ5IDwtIGV4dHJhY3RBbmNob3IodGVtcDMpXG5cblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihsb29wID09Z3JvdXAxKSApJHN1bVNjb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihsb29wID09Z3JvdXAyKSApJHN1bVNjb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5nZXRTdW1TY29yZXMgPC0gZnVuY3Rpb24odHJhY2ssIGFuY2hvcikge1xuICAjIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBhbGwgYW5jaG9ycyBhbmQgdHJhY2sgcmVnaW9ucyBhdCBvbmNlXG4gIG92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IsIHRyYWNrKVxuICBcbiAgIyBFeHRyYWN0IHRoZSBzY29yZXMgYW5kIGNvcnJlc3BvbmRpbmcgYW5jaG9yIGluZGljZXNcbiAgYW5jaG9yX2luZGljZXMgPC0gcXVlcnlIaXRzKG92ZXJsYXBzKVxuICB0cmFja19zY29yZXMgPC0gc2NvcmUodHJhY2spW3N1YmplY3RIaXRzKG92ZXJsYXBzKV1cbiAgXG4gICMgVXNlIHRhcHBseSB0byBjYWxjdWxhdGUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIGVhY2ggYW5jaG9yXG4gIG1lZGlhbl9zY29yZXMgPC0gdGFwcGx5KHRyYWNrX3Njb3JlcywgYW5jaG9yX2luZGljZXMsIG1lYW4sIG5hLnJtID0gVFJVRSlcbiAgXG4gICMgSW5pdGlhbGl6ZSBhIG51bWVyaWMgdmVjdG9yIHRvIHN0b3JlIHRoZSBtZWRpYW4gc2NvcmVzIGZvciBlYWNoIGFuY2hvclxuICBhbGxfbWVkaWFuX3Njb3JlcyA8LSByZXAoTkEsIGxlbmd0aChhbmNob3IpKVxuICBcbiAgIyBQb3B1bGF0ZSB0aGUgbWVkaWFuIHNjb3JlcyBmb3IgdGhlIGFuY2hvcnMgdGhhdCBoYXZlIG92ZXJsYXBzXG4gIGFsbF9tZWRpYW5fc2NvcmVzW2FzLm51bWVyaWMobmFtZXMobWVkaWFuX3Njb3JlcykpXSA8LSBtZWRpYW5fc2NvcmVzXG4gIFxuICByZXR1cm4oYWxsX21lZGlhbl9zY29yZXMpXG59XG5cbnBsb3RTdW1TY29yZXNCaW5hcnkgPC0gZnVuY3Rpb24odHJhY2ssIHBlYWssIG5hbWUsIGFuY2hvcjEsIGFuY2hvcjIsIGFuY2hvcjMpe1xuICBwZWFrVHJhY2sgPC0gdHJhY2tbdW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHModHJhY2ssIHBlYWspKSldXG4gIGEgPC0gZ2V0U3VtU2NvcmVzKHBlYWtUcmFjaywgYW5jaG9yMSlcbiAgYiA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IyKVxuICBjIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvcjMpXG4gIGEudGIgPC0gdGliYmxlKGxvb3AgPSBcXG5vQm91bmRhcnlcXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBhKVxuICBiLnRiIDwtIHRpYmJsZShsb29wID0gXFx3aXRoQm91bmRhcnlcXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBiKVxuICBjLnRiIDwtIHRpYmJsZShsb29wID0gXFxvdXRzaWRlQm91bmRhcnlcXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBjKVxuICBcbiAgZGF0YSA8LSBiaW5kX3Jvd3MoYS50YiwgYi50YiwgYy50YikgJT4lIGRyb3BfbmEoKVxuICBkYXRhJGxvb3AgPC0gZmFjdG9yKGRhdGEkbG9vcCwgbGV2ZWxzID0gYyhcXG5vQm91bmRhcnlcXCwgXFx3aXRoQm91bmRhcnlcXCwgXFxvdXRzaWRlQm91bmRhcnlcXCkpXG4gIFxuICBwMTIgPC0gZ2V0UHZhbFdpbGNveChkYXRhLCBcXG5vQm91bmRhcnlcXCwgXFx3aXRoQm91bmRhcnlcXClcbiAgcDEzIDwtIGdldFB2YWxXaWxjb3goZGF0YSwgXFxub0JvdW5kYXJ5XFwsIFxcb3V0c2lkZUJvdW5kYXJ5XFwpXG4gIHAyMyA8LSBnZXRQdmFsV2lsY294KGRhdGEsIFxcd2l0aEJvdW5kYXJ5XFwsIFxcb3V0c2lkZUJvdW5kYXJ5XFwpXG4gIHAgPC0gIGdncGxvdChkYXRhLCBhZXMoeCA9IGxvb3AsIHkgPSBzdW1TY29yZSkpICsgXG4gICAgbGFicyh4ID0gTlVMTCwgeSA9IHBhc3RlMChuYW1lLCBcXFxcbmxvZyhhdmcgcGVhayBzY29yZSBwZXIgYW5jaG9yKVxcKSkgK1xuICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gbG9vcCksIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgIG91dGxpZXIuc2l6ZSA9IDEsIG91dGxpZXIuc3Ryb2tlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSBsb29wKSwgZnVuID0gbWVhbixcbiAgICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLFxuICAgICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICAgKSArIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgICApLFxuICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgICApLFxuICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApICsgXG4gICAgI2Nvb3JkX2NhcnRlc2lhbih5bGltID0gYyhxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjApLCBxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjk5KSkpICsgXG4gICAgYW5ub3RhdGUoXG4gICAgICBcXHRleHRcXCwgeCA9IDEsIHkgPSBxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjUpLFxuICAgICAgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMiksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICBcXHAxMzogXFwsIGNvbnZQdmFsdWUocDEzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgIFxccDIzOiBcXCwgY29udlB2YWx1ZShwMjMpKSxcbiAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAzXG4gICAgKSBcbiAgIysgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gXFxsb2cxMFxcKVxuICBcbiAgZmlsZU5hbWUgPC0gcGFzdGUwKFxcQ2hJUF9wZWFrX2F2Z1BlYWtTY29yZV9ib3VuZGFyeUFuY2hvcl9cXCwgbmFtZSlcbiAgd2lkdGggPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoXG4gIGhlaWdodCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxuICBwcmludChwKVxuICBkZXYub2ZmKClcbn1cblxuIyBTdW0gcGVhayBzY29yZVxuIyMjI1xudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXDMzMjU1X0gzSzRtZTNfMDQtNzQ1X0JydWNlLTRfdHJpbV9xMjBfZGVkdXBfYmxhY2tfZGVwdGhOb3JtLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjU1X0gzSzRtZTNfMDQtNzQ1X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssIFxcSDNLNG1lM1xcLCBhbmNob3Iubm9Cb3VuZGFyeSwgYW5jaG9yLndpdGhpbkJvdW5kYXJ5LCBhbmNob3Iub3V0c2lkZUJvdW5kYXJ5KVxuXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5uYXJyb3dQZWFrLmJlZFxcKSlcbiNwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXEgzSzI3YWNcXClcbnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssIFxcSDNLMjdhY1xcLCBhbmNob3Iubm9Cb3VuZGFyeSwgYW5jaG9yLndpdGhpbkJvdW5kYXJ5LCBhbmNob3Iub3V0c2lkZUJvdW5kYXJ5KVxuXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcR1NNMjY4MzQ0MF9KMV9IM0sxNGFjX21tMTBMaWZ0ZWQuYmxhY2suYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcR1NNMjY4MzQ0MF9KMV9IM0sxNGFjX21tMTBMaWZ0ZWQuYmVkXFwpKVxuI3Bsb3RTdW1TY29yZXModHJhY2ssIHBlYWssIFxcSDNLMTRhY1xcKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxIM0sxNGFjXFwsIGFuY2hvci5ub0JvdW5kYXJ5LCBhbmNob3Iud2l0aGluQm91bmRhcnksIGFuY2hvci5vdXRzaWRlQm91bmRhcnkpXG5cbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFwzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG4jcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxDVENGXFwpXG5wbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCBcXENUQ0ZcXCwgYW5jaG9yLm5vQm91bmRhcnksIGFuY2hvci53aXRoaW5Cb3VuZGFyeSwgYW5jaG9yLm91dHNpZGVCb3VuZGFyeSlcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXDMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfdHJpbV9xMjBfZGVkdXBfYmxhY2tfZGVwdGhOb3JtLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbiNwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXFJBRDIxXFwpXG5wbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCBcXFJBRDIxXFwsIGFuY2hvci5ub0JvdW5kYXJ5LCBhbmNob3Iud2l0aGluQm91bmRhcnksIGFuY2hvci5vdXRzaWRlQm91bmRhcnkpXG5cblxuXG4jIyMjIyMjIyBMT0xBXG5hdGFjIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXEdTTTMxMDYyNTdfQVRBQ19FU0NfMS5iZWRcXCkpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpXG5jb2xuYW1lcyhhdGFjKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbmF0YWMuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGF0YWMpXG5cbiMgTE9BRElORyBMT09QU1xubG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcLCBcXEUtRVxcKSlcbmFuY2hvci5hbGwgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5hbGwpKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5hbGwsIGF0YWMuZ3IpXG5hbmNob3IuYWxsIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vQm91bmRhcnksIGF0YWMuZ3IpXG5hbmNob3Iubm9Cb3VuZGFyeSA8LSBwaW50ZXJzZWN0KGFuY2hvci5ub0JvdW5kYXJ5W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLndpdGhpbkJvdW5kYXJ5LCBhdGFjLmdyKVxuYW5jaG9yLndpdGhpbkJvdW5kYXJ5IDwtIHBpbnRlcnNlY3QoYW5jaG9yLndpdGhpbkJvdW5kYXJ5W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm91dHNpZGVCb3VuZGFyeSwgYXRhYy5ncilcbmFuY2hvci5vdXRzaWRlQm91bmRhcnkgPC0gcGludGVyc2VjdChhbmNob3Iub3V0c2lkZUJvdW5kYXJ5W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cblxuXG5hbmNob3JzIDwtIGxpc3QoYW5jaG9yLm5vQm91bmRhcnksIGFuY2hvci53aXRoQm91bmRhcnksIGFuY2hvci5vdXRzaWRlQm91bmRhcnkpXG50YnMgPC0gbGlzdCgpXG50ZW1wcyA8LSBsaXN0KClcblxuYWxwaGEgPC0gMC4wNVxuXG4jIFByb2Nlc3MgY2x1c3RlcnMgYzEgdG8gYzhcbmZvciAoaSBpbiAxOjMpIHtcbiAgXG4gIGFuY2hvciA8LSBhbmNob3JzW1tpXV1cbiAgIyBSdW4gTE9MQVxuICByZXN1bHQgPC0gcnVuTE9MQShhbmNob3IsIGFuY2hvci5hbGwsIGxvbGFEQilcbiAgdGIgPC0gYXNfdGliYmxlKHJlc3VsdClcbiAgXG4gICMgRmlsdGVyIGFuZCBzdW1tYXJpemVcbiAgdGIgPC0gdGIgJT4lXG4gICAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lXG4gICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gXFxlbWJyeW9uaWMgc3RlbSBjZWxsXFwpICU+JVxuICAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JVxuICAgIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JVxuICAgIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSlcbiAgXG4gICMgU3RvcmUgdGJcbiAgdGJzW1tpXV0gPC0gdGJcbiAgXG4gICMgU2VsZWN0IGFuZCByZW5hbWUgb2Rkc1JhdGlvXG4gIHRlbXAgPC0gdGIgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pXG4gIGNvbG5hbWVzKHRlbXApIDwtIGMoXFx0YXJnZXRcXCwgcGFzdGUwKFxcT1JfY1xcLCBpKSlcbiAgXG4gICMgU3RvcmUgdGVtcFxuICB0ZW1wc1tbaV1dIDwtIHRlbXBcbn1cblxuIyBNZXJnZSBhbGwgdGVtcCB0YWJsZXMgaW50byBvbmVcbnRlbXAgPC0gUmVkdWNlKGZ1bmN0aW9uKHgsIHkpIGZ1bGxfam9pbih4LCB5LCBieSA9IFxcdGFyZ2V0XFwpLCB0ZW1wcykgJT4lXG4gIG11dGF0ZV9hbGwofnJlcGxhY2VfbmEoLiwgMSkpXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcdGFyZ2V0XFwsIFxcbm9Cb3VuZGFyeVxcLCBcXHdpdGhpbkJvdW5kYXJ5XFwsIFxcb3V0c2lkZUJvdW5kYXJ5XFwpXG5kYXRhIDwtIHRlbXAgJT4lIGNvbHVtbl90b19yb3duYW1lcyhcXHRhcmdldFxcKSAlPiUgYXMubWF0cml4KClcblxubGlicmFyeShjaXJjbGl6ZSlcbmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDEsIG1heChkYXRhKSksIGMoXFx3aGl0ZVxcLCBcXHJlZFxcKSlcblxuXG4jZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gXFx3c3NcXClcblxucCA8LSBIZWF0bWFwKFxuICBkYXRhLFxuICBuYW1lID0gXFxPZGRzIFJhdGlvXFwsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmRcbiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsICAgICAgICAgICAgIyBSZW1vdmUgY29sdW1uIGRlbmRyb2dyYW1cbiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLFxuICBjb2wgPSBjb2xfZnVuLFxuICBib3JkZXIgPSBUUlVFXG4pXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
name <- \chromo_cons_annoHierarchy\
diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\)) %>%
  dplyr::select(c(1, 2, 3, 4, 5, 6, 7, 11, 12, 24, 29, 31)) %>% unnest(gene)


gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, TSS)
colnames(gene.TSS.tb) <- c(\ensembl\, \TSS\)


geneAnnoData <- geneAnnoData %>% dplyr::left_join(gene.TSS.tb, by = c(\gene\ = \ensembl\))

geneAnnoData <- geneAnnoData %>% 
  dplyr::mutate(distance1 = (start1 + end1)/2 - TSS,
                distance2 = (start2 + end2)/2 - TSS,
                distance = if_else(abs(distance1) > abs(distance2), distance1, distance2))

result <- geneAnnoData %>%
  filter(Anno2 == \P-S\) %>%
  group_by(gene) %>%
  summarise(
    farRight = if (any(distance > 0)) max(distance[distance > 0]) else 0,  # Return 0 if no positive distance
    farLeft = if (any(distance < 0)) min(distance[distance < 0]) else 0  # Return 0 if no negative distance
  ) %>%
  ungroup()

geneAnnoData <- geneAnnoData %>% left_join(result, by = c(\gene\))

geneAnnoData <- geneAnnoData %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\)) %>%
  dplyr::mutate(group = case_when(is.na(farRight) ~ \No\,
                                  (distance > farLeft) & (distance < farRight) ~ \Within\,
                                  TRUE ~ \Outside\),
                size = start2 - start1)

data <- geneAnnoData %>% dplyr::select(group, id, size) %>% distinct()
anchor.data <- geneAnnoData %>% dplyr::select(chrom1, start1, end1, chrom2, start2, end2, group) %>% distinct()

temp1 <- anchor.data %>% dplyr::filter(group == \No\) %>% dplyr::select(-group)
fwrite(temp1, here(consensusDir, \insulated_domain_ps_no.bedpe\), sep = \\t\, col.names = FALSE)
temp2 <- anchor.data %>% dplyr::filter(group == \Within\) %>% dplyr::select(-group)
fwrite(temp2, here(consensusDir, \insulated_domain_ps_within.bedpe\), sep = \\t\, col.names = FALSE)
temp3 <- anchor.data %>% dplyr::filter(group == \Outside\) %>% dplyr::select(-group)
fwrite(temp3, here(consensusDir, \insulated_domain_ps_outside.bedpe\), sep = \\t\, col.names = FALSE)


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$size
  distance2 <- (data %>% dplyr::filter(group ==group2) )$size
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

# convPvalue(getPvalWilcox(data, \noBoundary\, \withinBoundary\))
# convPvalue(getPvalWilcox(data, \noBoundary\, \outsideBoundary\))
# convPvalue(getPvalWilcox(data, \outsideBoundary\, \withinBoundary\))


p <- ggplot(data, aes(x = group, y = size, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\,
                 outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + scale_y_continuous(labels = label_kb_mb) +
  stat_summary(
      aes(group = group), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) +
  scale_fill_manual(values = c(\grey50\, \#5EC962\, \#5EC962\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \Loop size\)

fileName <- paste0(\insulationBoundary_size\)
width <- panelSize(1.5)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
  
########################
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(group ==group2) )$diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

data <- geneAnnoData %>% dplyr::select(group, id, diff_dTAG_DMSO) %>% distinct()

# convPvalue(getPvalWilcox(data, \noBoundary\, \withinBoundary\))
# convPvalue(getPvalWilcox(data, \noBoundary\, \outsideBoundary\))
# convPvalue(getPvalWilcox(data, \outsideBoundary\, \withinBoundary\))

p <- ggplot(data, aes(x = group, y = diff_dTAG_DMSO, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  scale_fill_manual(values = c(\grey50\, \#5EC962\, \#5EC962\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \Δ loop score\)  +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  geom_hline(yintercept = -0.2,
             alpha = 0.5, 
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\, linetype = \dashed\) +
  coord_cartesian(ylim = c(-0.8, 0.5))
    
fileName <- paste0(\insulationBoundary_delta\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()  
  
  
 ###################### 
    
    minValue <- -4
  obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

geneAnnoData <- geneAnnoData %>% left_join(obsexp, by = c(\id\))

data <- geneAnnoData %>% dplyr::select(group, id, log_obsexp_diff_dTAG_DMSO) %>% distinct()


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$log_obsexp_diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(group ==group2) )$log_obsexp_diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

# convPvalue(getPvalWilcox(data, \noBoundary\, \withinBoundary\))
# convPvalue(getPvalWilcox(data, \noBoundary\, \outsideBoundary\))
# convPvalue(getPvalWilcox(data, \outsideBoundary\, \withinBoundary\))
# 

p <- ggplot(data, aes(x = group, y = log_obsexp_diff_dTAG_DMSO, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  scale_fill_manual(values = c(\grey50\, \#5EC962\, \#5EC962\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \log2(fc of obs/exp)\)  +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  coord_cartesian(ylim = c(-2, 2))
    
fileName <- paste0(\insulationBoundary_obsexp\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()  





#####################


gene.withinBoundary <- unique((geneAnnoData %>% dplyr::filter(group == \withinBoundary\))$gene)
gene.outsideBoundary <- unique((geneAnnoData %>% dplyr::filter(group == \outsideBoundary\))$gene)
gene.noBoundary <- unique((geneAnnoData %>% dplyr::filter(group == \noBoundary\))$gene)

gene.wBoundary <- unique(c(gene.withinBoundary, gene.outsideBoundary))

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

print(\perc of gene with loop within Boundary\)
sum(gene.group1 %in% gene.withinBoundary)/length(gene.group1)*100
sum(gene.group2 %in% gene.withinBoundary)/length(gene.group2)*100

print(\perc of gene with loop outside Boundary\)
sum(gene.group1 %in% gene.outsideBoundary)/length(gene.group1)*100
sum(gene.group2 %in% gene.outsideBoundary)/length(gene.group2)*100

print(\perc of gene with loop with no Boundary\)
sum(gene.group1 %in% gene.noBoundary)/length(gene.group1)*100
sum(gene.group2 %in% gene.noBoundary)/length(gene.group2)*100


diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name) %>%
  dplyr::mutate(group = case_when(
    ensembl_gene_id %in% gene.wBoundary ~ \withinBoundary\,
    ensembl_gene_id %in% gene.noBoundary ~ \noBoundary\,
    TRUE ~ NA
  )) %>%
  dplyr::filter(!is.na(group)) %>%
  dplyr::mutate(absLog2FC = abs(log2FoldChange))


ggplot(diff.RNA, aes(x = group, y = log2FoldChange)) + geom_violin() + geom_boxplot(width = 0.1)

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$absLog2FC
  distance2 <- (data %>% dplyr::filter(group ==group2) )$absLog2FC
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}
convPvalue(getPvalWilcox(diff.RNA, \withinBoundary\, \noBoundary\))


# Create the CDF plot
p <- ggplot(diff.RNA, aes(x = absLog2FC, color = group)) +
stat_ecdf(size = 0.4 ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Absolute log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 0.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )

fileName <- paste0(\log2FC_cdf_insulationBoundary\)
width <- panelSize(2.5)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



### Checking characterstics of anchors
temp1 <- anchor.data %>% dplyr::filter(group == \noBoundary\) %>% dplyr::select(-group)
anchor.noBoundary <- extractAnchor(temp1)

temp2 <- anchor.data %>% dplyr::filter(group == \withinBoundary\) %>% dplyr::select(-group)
anchor.withinBoundary <- extractAnchor(temp2)

temp3 <- anchor.data %>% dplyr::filter(group == \outsideBoundary\) %>% dplyr::select(-group)
anchor.outsideBoundary <- extractAnchor(temp3)


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(loop ==group1) )$sumScore
  distance2 <- (data %>% dplyr::filter(loop ==group2) )$sumScore
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

getSumScores <- function(track, anchor) {
  # Find overlaps between all anchors and track regions at once
  overlaps <- findOverlaps(anchor, track)
  
  # Extract the scores and corresponding anchor indices
  anchor_indices <- queryHits(overlaps)
  track_scores <- score(track)[subjectHits(overlaps)]
  
  # Use tapply to calculate the median scores for each anchor
  median_scores <- tapply(track_scores, anchor_indices, mean, na.rm = TRUE)
  
  # Initialize a numeric vector to store the median scores for each anchor
  all_median_scores <- rep(NA, length(anchor))
  
  # Populate the median scores for the anchors that have overlaps
  all_median_scores[as.numeric(names(median_scores))] <- median_scores
  
  return(all_median_scores)
}

plotSumScoresBinary <- function(track, peak, name, anchor1, anchor2, anchor3){
  peakTrack <- track[unique(queryHits(findOverlaps(track, peak)))]
  a <- getSumScores(peakTrack, anchor1)
  b <- getSumScores(peakTrack, anchor2)
  c <- getSumScores(peakTrack, anchor3)
  a.tb <- tibble(loop = \noBoundary\,
                 sumScore = a)
  b.tb <- tibble(loop = \withBoundary\,
                 sumScore = b)
  c.tb <- tibble(loop = \outsideBoundary\,
                 sumScore = c)
  
  data <- bind_rows(a.tb, b.tb, c.tb) %>% drop_na()
  data$loop <- factor(data$loop, levels = c(\noBoundary\, \withBoundary\, \outsideBoundary\))
  
  p12 <- getPvalWilcox(data, \noBoundary\, \withBoundary\)
  p13 <- getPvalWilcox(data, \noBoundary\, \outsideBoundary\)
  p23 <- getPvalWilcox(data, \withBoundary\, \outsideBoundary\)
  p <-  ggplot(data, aes(x = loop, y = sumScore)) + 
    labs(x = NULL, y = paste0(name, \\nlog(avg peak score per anchor)\)) +
    geom_violin(aes(fill = loop), color = \black\,
                linewidth = lineThick * mmToLineUnit, lineend = \square\,
                show.legend = FALSE) +
    geom_boxplot(width = 0.1, color = \black\,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\,
                 outlier.size = 1, outlier.stroke = NA) + theme_classic() +
    stat_summary(
      aes(group = loop), fun = mean,
      geom = \point\, shape = 21, size = 1,
      fill = \red\, color = \black\
    ) + theme(
      axis.title = element_text(
        size = fontSizeS, family = fontType, color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS, family = fontType, color = \#000000\
      ),
      axis.text.x = element_text(
        angle = 45, hjust = 1, vjust = 1
      ),
      axis.line = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
      legend.text = element_text(family = fontType, size = fontSizeS),
      legend.title = element_text(family = fontType, size = fontSizeS)
    ) + 
    #coord_cartesian(ylim = c(quantile(data$sumScore, 0.0), quantile(data$sumScore, 0.99))) + 
    annotate(
      \text\, x = 1, y = quantile(data$sumScore, 0.5),
      label = paste0(\p12: \, convPvalue(p12), \\n\,
                     \p13: \, convPvalue(p13), \\n\,
                     \p23: \, convPvalue(p23)),
      color = \black\, hjust = 0, size = 3
    ) 
  #+ scale_y_continuous(trans = \log10\)
  
  fileName <- paste0(\ChIP_peak_avgPeakScore_boundaryAnchor_\, name)
  width <- panelSize(2)*mmToInch
  height <- panelSize(2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# Sum peak score
####
track <- import(here(refDir, \33255_H3K4me3_04-745_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.bed\))
plotSumScoresBinary(track, peak, \H3K4me3\, anchor.noBoundary, anchor.withinBoundary, anchor.outsideBoundary)

track <- import(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
#plotSumScores(track, peak, \H3K27ac\)
plotSumScoresBinary(track, peak, \H3K27ac\, anchor.noBoundary, anchor.withinBoundary, anchor.outsideBoundary)

track <- import(here(refDir, \GSM2683440_J1_H3K14ac_mm10Lifted.black.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM2683440_J1_H3K14ac_mm10Lifted.bed\))
#plotSumScores(track, peak, \H3K14ac\)
plotSumScoresBinary(track, peak, \H3K14ac\, anchor.noBoundary, anchor.withinBoundary, anchor.outsideBoundary)

track <- import(here(refDir, \33248_CTCF_07-729_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))
#plotSumScores(track, peak, \CTCF\)
plotSumScoresBinary(track, peak, \CTCF\, anchor.noBoundary, anchor.withinBoundary, anchor.outsideBoundary)

track <- import(here(refDir, \33250_RAD21_ab992_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))
#plotSumScores(track, peak, \RAD21\)
plotSumScoresBinary(track, peak, \RAD21\, anchor.noBoundary, anchor.withinBoundary, anchor.outsideBoundary)



######## LOLA
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\)) %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

overlaps <- findOverlaps(anchor.noBoundary, atac.gr)
anchor.noBoundary <- pintersect(anchor.noBoundary[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])
overlaps <- findOverlaps(anchor.withinBoundary, atac.gr)
anchor.withinBoundary <- pintersect(anchor.withinBoundary[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])
overlaps <- findOverlaps(anchor.outsideBoundary, atac.gr)
anchor.outsideBoundary <- pintersect(anchor.outsideBoundary[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])



anchors <- list(anchor.noBoundary, anchor.withBoundary, anchor.outsideBoundary)
tbs <- list()
temps <- list()

alpha <- 0.05

# Process clusters c1 to c8
for (i in 1:3) {
  
  anchor <- anchors[[i]]
  # Run LOLA
  result <- runLOLA(anchor, anchor.all, lolaDB)
  tb <- as_tibble(result)
  
  # Filter and summarize
  tb <- tb %>%
    dplyr::mutate(target = toupper(antibody)) %>%
    filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
    dplyr::filter(qValue < alpha) %>%
    dplyr::group_by(target) %>%
    slice_min(meanRnk, with_ties = FALSE)
  
  # Store tb
  tbs[[i]] <- tb
  
  # Select and rename oddsRatio
  temp <- tb %>% dplyr::select(target, oddsRatio)
  colnames(temp) <- c(\target\, paste0(\OR_c\, i))
  
  # Store temp
  temps[[i]] <- temp
}

# Merge all temp tables into one
temp <- Reduce(function(x, y) full_join(x, y, by = \target\), temps) %>%
  mutate_all(~replace_na(., 1))
colnames(temp) <- c(\target\, \noBoundary\, \withinBoundary\, \outsideBoundary\)
data <- temp %>% column_to_rownames(\target\) %>% as.matrix()

library(circlize)
col_fun <- colorRamp2(c(1, max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVaR2xtWmtOMWRHOW1aaUE4TFNBd0xqSmNibWRsYm1WQmJtNXZSR0YwWVNBOExTQnNiMkZrVEc5dmNFRnVibTlFWVhSaEtHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZmNDMXVYMlZ1YzJWdFlteE1hWE4wTG5SemRseGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnBabVpEZFhSdlptWWdQU0JrYVdabVEzVjBiMlptTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhibTV2VEdsemRDQTlJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWaGNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHTW9NU3dnTWl3Z015d2dOQ3dnTlN3Z05pd2dOeXdnTVRFc0lERXlMQ0F5TkN3Z01qa3NJRE14S1NrZ0pUNGxJSFZ1Ym1WemRDaG5aVzVsS1Z4dVhHNWNibWRsYm1VdVZGTlRMblJpSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYRzF0TVRCZlIxSkRiVE00TG5BMlgyZGxibVZmYzI5eWRHVmtMbUpsWkZ4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvVkZOVElEMGdhV1psYkhObEtGWTBJRDA5SUZ4Y0sxeGNMQ0JXTWl3Z1ZqTXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENoV05pd2dWRk5US1Z4dVkyOXNibUZ0WlhNb1oyVnVaUzVVVTFNdWRHSXBJRHd0SUdNb1hGeGxibk5sYldKc1hGd3NJRnhjVkZOVFhGd3BYRzVjYmx4dVoyVnVaVUZ1Ym05RVlYUmhJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbXhsWm5SZmFtOXBiaWhuWlc1bExsUlRVeTUwWWl3Z1lua2dQU0JqS0Z4Y1oyVnVaVnhjSUQwZ1hGeGxibk5sYldKc1hGd3BLVnh1WEc1blpXNWxRVzV1YjBSaGRHRWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hrYVhOMFlXNWpaVEVnUFNBb2MzUmhjblF4SUNzZ1pXNWtNU2t2TWlBdElGUlRVeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVhOMFlXNWpaVElnUFNBb2MzUmhjblF5SUNzZ1pXNWtNaWt2TWlBdElGUlRVeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYVhOMFlXNWpaU0E5SUdsbVgyVnNjMlVvWVdKektHUnBjM1JoYm1ObE1Ta2dQaUJoWW5Nb1pHbHpkR0Z1WTJVeUtTd2daR2x6ZEdGdVkyVXhMQ0JrYVhOMFlXNWpaVElwS1Z4dVhHNXlaWE4xYkhRZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pWeHVJQ0JtYVd4MFpYSW9RVzV1YnpJZ1BUMGdYRnhRTFZOY1hDa2dKVDRsWEc0Z0lHZHliM1Z3WDJKNUtHZGxibVVwSUNVK0pWeHVJQ0J6ZFcxdFlYSnBjMlVvWEc0Z0lDQWdabUZ5VW1sbmFIUWdQU0JwWmlBb1lXNTVLR1JwYzNSaGJtTmxJRDRnTUNrcElHMWhlQ2hrYVhOMFlXNWpaVnRrYVhOMFlXNWpaU0ErSURCZEtTQmxiSE5sSURBc0lDQWpJRkpsZEhWeWJpQXdJR2xtSUc1dklIQnZjMmwwYVhabElHUnBjM1JoYm1ObFhHNGdJQ0FnWm1GeVRHVm1kQ0E5SUdsbUlDaGhibmtvWkdsemRHRnVZMlVnUENBd0tTa2diV2x1S0dScGMzUmhibU5sVzJScGMzUmhibU5sSUR3Z01GMHBJR1ZzYzJVZ01DQWdJeUJTWlhSMWNtNGdNQ0JwWmlCdWJ5QnVaV2RoZEdsMlpTQmthWE4wWVc1alpWeHVJQ0FwSUNVK0pWeHVJQ0IxYm1keWIzVndLQ2xjYmx4dVoyVnVaVUZ1Ym05RVlYUmhJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnYkdWbWRGOXFiMmx1S0hKbGMzVnNkQ3dnWW5rZ1BTQmpLRnhjWjJWdVpWeGNLU2xjYmx4dVoyVnVaVUZ1Ym05RVlYUmhJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHZHliM1Z3SUQwZ1kyRnpaVjkzYUdWdUtHbHpMbTVoS0daaGNsSnBaMmgwS1NCK0lGeGNUbTljWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBb1pHbHpkR0Z1WTJVZ1BpQm1ZWEpNWldaMEtTQW1JQ2hrYVhOMFlXNWpaU0E4SUdaaGNsSnBaMmgwS1NCK0lGeGNWMmwwYUdsdVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdWRkpWUlNCK0lGeGNUM1YwYzJsa1pWeGNLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YVhwbElEMGdjM1JoY25ReUlDMGdjM1JoY25ReEtWeHVYRzVrWVhSaElEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENobmNtOTFjQ3dnYVdRc0lITnBlbVVwSUNVK0pTQmthWE4wYVc1amRDZ3BYRzVoYm1Ob2IzSXVaR0YwWVNBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWTJoeWIyMHhMQ0J6ZEdGeWRERXNJR1Z1WkRFc0lHTm9jbTl0TWl3Z2MzUmhjblF5TENCbGJtUXlMQ0JuY205MWNDa2dKVDRsSUdScGMzUnBibU4wS0NsY2JseHVkR1Z0Y0RFZ1BDMGdZVzVqYUc5eUxtUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWEZ4T2IxeGNLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2d0WjNKdmRYQXBYRzVtZDNKcGRHVW9kR1Z0Y0RFc0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR2x1YzNWc1lYUmxaRjlrYjIxaGFXNWZjSE5mYm04dVltVmtjR1ZjWENrc0lITmxjQ0E5SUZ4Y1hGeDBYRndzSUdOdmJDNXVZVzFsY3lBOUlFWkJURk5GS1Z4dWRHVnRjRElnUEMwZ1lXNWphRzl5TG1SaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdYRnhYYVhSb2FXNWNYQ2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvTFdkeWIzVndLVnh1Wm5keWFYUmxLSFJsYlhBeUxDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhwYm5OMWJHRjBaV1JmWkc5dFlXbHVYM0J6WDNkcGRHaHBiaTVpWldSd1pWeGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDd2dZMjlzTG01aGJXVnpJRDBnUmtGTVUwVXBYRzUwWlcxd015QThMU0JoYm1Ob2IzSXVaR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY1hFOTFkSE5wWkdWY1hDa2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9MV2R5YjNWd0tWeHVabmR5YVhSbEtIUmxiWEF6TENCb1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeHBibk4xYkdGMFpXUmZaRzl0WVdsdVgzQnpYMjkxZEhOcFpHVXVZbVZrY0dWY1hDa3NJSE5sY0NBOUlGeGNYRngwWEZ3c0lHTnZiQzV1WVcxbGN5QTlJRVpCVEZORktWeHVYRzVjYm1kbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDFuY205MWNERXBJQ2trYzJsNlpWeHVJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDFuY205MWNESXBJQ2trYzJsNlpWeHVJQ0IzYVd3Z1BDMGdkMmxzWTI5NExuUmxjM1FvWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcFhHNGdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYm4xY2JseHVJeUJqYjI1MlVIWmhiSFZsS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN3Z1hGeHViMEp2ZFc1a1lYSjVYRndzSUZ4Y2QybDBhR2x1UW05MWJtUmhjbmxjWENrcFhHNGpJR052Ym5aUWRtRnNkV1VvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTENCY1hHNXZRbTkxYm1SaGNubGNYQ3dnWEZ4dmRYUnphV1JsUW05MWJtUmhjbmxjWENrcFhHNGpJR052Ym5aUWRtRnNkV1VvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTENCY1hHOTFkSE5wWkdWQ2IzVnVaR0Z5ZVZ4Y0xDQmNYSGRwZEdocGJrSnZkVzVrWVhKNVhGd3BLVnh1WEc1Y2JuQWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQnphWHBsTENCbWFXeHNJRDBnWjNKdmRYQXBLU0FySUZ4dUlDQm5aVzl0WDNacGIyeHBiaWhzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0xDQmhiSEJvWVNBOUlDNDBMQ0FzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNeXdnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU3dnSUdGc2NHaGhJRDBnTUM0MkxDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FySUZ4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QnpZMkZzWlY5NVgyTnZiblJwYm5WdmRYTW9iR0ZpWld4eklEMGdiR0ZpWld4ZmEySmZiV0lwSUN0Y2JpQWdjM1JoZEY5emRXMXRZWEo1S0Z4dUlDQWdJQ0FnWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxGeHVJQ0FnSUNBZ1oyVnZiU0E5SUZ4Y2NHOXBiblJjWEN3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlEQXVOU3hjYmlBZ0lDQWdJR1pwYkd3Z1BTQmNYR0pzWVdOclhGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0J3YjNOcGRHbHZiaUE5SUhCdmMybDBhVzl1WDJSdlpHZGxLQzR6S1Z4dUlDQWdJQ2tnSzF4dUlDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRnhjWjNKbGVUVXdYRndzSUZ4Y0l6VkZRemsyTWx4Y0xDQmNYQ00xUlVNNU5qSmNYQ2twSUN0Y2JseHVJQ0IwYUdWdFpTaGNiaUFnSUNCaGVHbHpMblJwZEd4bExuZ2dQU0JsYkdWdFpXNTBYMkpzWVc1cktDa3NYRzRnSUNBZ1lYaHBjeTUwYVhSc1pTNTVJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ2tzSUNBZ0lGeHVJQ0FnSUdGNGFYTXVkR1Y0ZEM1NElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3hjYmlBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUNBZ0lDQWdJeUJTYjNSaGRHVWdlQzFoZUdseklHeGhZbVZzY3lBME5TQmtaV2R5WldWelhHNGdJQ0FnSUNCb2FuVnpkQ0E5SURFc0lDQWdJQ0FnSUNNZ1FXUnFkWE4wSUdodmNtbDZiMjUwWVd3Z2FuVnpkR2xtYVdOaGRHbHZibHh1SUNBZ0lDQWdkbXAxYzNRZ1BTQXhJQ0FnSUNBZ0lDQWpJRUZrYW5WemRDQjJaWEowYVdOaGJDQnFkWE4wYVdacFkyRjBhVzl1WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNYSFJ5WVc1emNHRnlaVzUwWEZ3cExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDa2dLMnhoWW5Nb2VTQTlJRnhjVEc5dmNDQnphWHBsWEZ3cFhHNWNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEdsdWMzVnNZWFJwYjI1Q2IzVnVaR0Z5ZVY5emFYcGxYRndwWEc1M2FXUjBhQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNDFLU3B0YlZSdlNXNWphRnh1YUdWcFoyaDBJRHd0SUhCaGJtVnNVMmw2WlNneExqVXBLbTF0Vkc5SmJtTm9YRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1Y0c1blhGd3BLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWEZ4cGJseGNMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNGdJRnh1SXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpYRzVuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpQWdaR2x6ZEdGdVkyVXhJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlaM0p2ZFhBeEtTQXBKR1JwWm1aZlpGUkJSMTlFVFZOUFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQV2R5YjNWd01pa2dLU1JrYVdabVgyUlVRVWRmUkUxVFQxeHVJQ0IzYVd3Z1BDMGdkMmxzWTI5NExuUmxjM1FvWkdsemRHRnVZMlV4TENCa2FYTjBZVzVqWlRJcFhHNGdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYm4xY2JseHVaR0YwWVNBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJR2xrTENCa2FXWm1YMlJVUVVkZlJFMVRUeWtnSlQ0bElHUnBjM1JwYm1OMEtDbGNibHh1SXlCamIyNTJVSFpoYkhWbEtHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTd2dYRnh1YjBKdmRXNWtZWEo1WEZ3c0lGeGNkMmwwYUdsdVFtOTFibVJoY25sY1hDa3BYRzRqSUdOdmJuWlFkbUZzZFdVb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExDQmNYRzV2UW05MWJtUmhjbmxjWEN3Z1hGeHZkWFJ6YVdSbFFtOTFibVJoY25sY1hDa3BYRzRqSUdOdmJuWlFkbUZzZFdVb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExDQmNYRzkxZEhOcFpHVkNiM1Z1WkdGeWVWeGNMQ0JjWEhkcGRHaHBia0p2ZFc1a1lYSjVYRndwS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdaR2xtWmw5a1ZFRkhYMFJOVTA4c0lHWnBiR3dnUFNCbmNtOTFjQ2twSUNzZ1hHNGdJR2RsYjIxZmRtbHZiR2x1S0d4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3NJR0ZzY0doaElEMGdMalFzSUN3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR6TENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRXNJQ0JoYkhCb1lTQTlJREF1Tml3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1hHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoY2JpQWdJQ0JoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURBdU5TeGNiaUFnSUNCbWFXeHNJRDBnWEZ4aWJHRmphMXhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN3Z2NHOXphWFJwYjI0Z1BTQndiM05wZEdsdmJsOWtiMlJuWlNndU15bGNiaUFnS1NBclhHNGdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWEZ4bmNtVjVOVEJjWEN3Z1hGd2pOVVZET1RZeVhGd3NJRnhjSXpWRlF6azJNbHhjS1NrZ0sxeHVYRzRnSUhSb1pXMWxLRnh1SUNBZ0lHRjRhWE11ZEdsMGJHVXVlQ0E5SUdWc1pXMWxiblJmWW14aGJtc29LU3hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxMbmtnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y1hHNGdJQ0FnS1N3Z0lDQWdYRzRnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWVc1bmJHVWdQU0EwTlN3Z0lDQWdJQ0FqSUZKdmRHRjBaU0I0TFdGNGFYTWdiR0ZpWld4eklEUTFJR1JsWjNKbFpYTmNiaUFnSUNBZ0lHaHFkWE4wSUQwZ01Td2dJQ0FnSUNBZ0l5QkJaR3AxYzNRZ2FHOXlhWHB2Ym5SaGJDQnFkWE4wYVdacFkyRjBhVzl1WEc0Z0lDQWdJQ0IyYW5WemRDQTlJREVnSUNBZ0lDQWdJQ01nUVdScWRYTjBJSFpsY25ScFkyRnNJR3AxYzNScFptbGpZWFJwYjI1Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hDeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRnhjZEhKaGJuTndZWEpsYm5SY1hDa3NYRzRnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlsY2JpQWdLU0FyYkdGaWN5aDVJRDBnWEZ6T2xDQnNiMjl3SUhOamIzSmxYRndwSUNBcklDQWdJRnh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR0ZzY0doaElEMGdNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hDa2dLeUJjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTFRBdU1peGNiaUFnSUNBZ0lDQWdJQ0FnSUNCaGJIQm9ZU0E5SURBdU5Td2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c0lHeHBibVYwZVhCbElEMGdYRnhrWVhOb1pXUmNYQ2tnSzF4dUlDQmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb0xUQXVPQ3dnTUM0MUtTbGNiaUFnSUNCY2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYR2x1YzNWc1lYUnBiMjVDYjNWdVpHRnllVjlrWld4MFlWeGNLVnh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tTQWdYRzRnSUZ4dUlDQmNiaUFqSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNaklGeHVJQ0FnSUZ4dUlDQWdJRzFwYmxaaGJIVmxJRHd0SUMwMFhHNGdJRzlpYzJWNGNDQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tGeGNiRzl2Y0ZOamIzSmxYMk52Ym5OZmIySnpaWGh3TG5SemRseGNLU2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHeHZaMTl2WW5ObGVIQmZSRTFUVHlBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDBSTlUwOGdQVDBnTUN3Z2JXbHVWbUZzZFdVc0lHeHZaeklvYjJKelpYaHdYMFJOVTA4cEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMlJVUVVjZ1BTQnBabDlsYkhObEtHOWljMlY0Y0Y5a1ZFRkhJRDA5SURBc0lHMXBibFpoYkhWbExDQnNiMmN5S0c5aWMyVjRjRjlrVkVGSEtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlCTkRnMUlEMGdhV1pmWld4elpTaHZZbk5sZUhCZlFUUTROU0E5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmUVRRNE5Ta3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOGdQU0JzYjJkZmIySnpaWGh3WDJSVVFVY2dMU0JzYjJkZmIySnpaWGh3WDBSTlUwOHNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrYVdabVgwRTBPRFZmUkUxVFR5QTlJR3h2WjE5dlluTmxlSEJmUVRRNE5TQXRJR3h2WjE5dlluTmxlSEJmUkUxVFR5bGNibHh1WjJWdVpVRnVibTlFWVhSaElEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdiR1ZtZEY5cWIybHVLRzlpYzJWNGNDd2dZbmtnUFNCaktGeGNhV1JjWENrcFhHNWNibVJoZEdFZ1BDMGdaMlZ1WlVGdWJtOUVZWFJoSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dkeWIzVndMQ0JwWkN3Z2JHOW5YMjlpYzJWNGNGOWthV1ptWDJSVVFVZGZSRTFUVHlrZ0pUNGxJR1JwYzNScGJtTjBLQ2xjYmx4dVhHNW5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOVozSnZkWEF4S1NBcEpHeHZaMTl2WW5ObGVIQmZaR2xtWmw5a1ZFRkhYMFJOVTA5Y2JpQWdaR2x6ZEdGdVkyVXlJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlaM0p2ZFhBeUtTQXBKR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOWNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNWNiaU1nWTI5dWRsQjJZV3gxWlNoblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFc0lGeGNibTlDYjNWdVpHRnllVnhjTENCY1hIZHBkR2hwYmtKdmRXNWtZWEo1WEZ3cEtWeHVJeUJqYjI1MlVIWmhiSFZsS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN3Z1hGeHViMEp2ZFc1a1lYSjVYRndzSUZ4Y2IzVjBjMmxrWlVKdmRXNWtZWEo1WEZ3cEtWeHVJeUJqYjI1MlVIWmhiSFZsS0dkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN3Z1hGeHZkWFJ6YVdSbFFtOTFibVJoY25sY1hDd2dYRngzYVhSb2FXNUNiM1Z1WkdGeWVWeGNLU2xjYmlNZ1hHNWNibkFnUEMwZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JzYjJkZmIySnpaWGh3WDJScFptWmZaRlJCUjE5RVRWTlBMQ0JtYVd4c0lEMGdaM0p2ZFhBcEtTQXJJRnh1SUNCblpXOXRYM1pwYjJ4cGJpaHNhVzVsZDJsa2RHZ2dQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjTENCaGJIQm9ZU0E5SUM0MExDQXNJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ1hHNGdJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU15d2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCTENBZ1lXeHdhR0VnUFNBd0xqWXNJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ1hHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNCemRHRjBYM04xYlcxaGNua29YRzRnSUNBZ1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMRnh1SUNBZ0lHZGxiMjBnUFNCY1hIQnZhVzUwWEZ3c0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXdMalVzWEc0Z0lDQWdabWxzYkNBOUlGeGNZbXhoWTJ0Y1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NJSEJ2YzJsMGFXOXVJRDBnY0c5emFYUnBiMjVmWkc5a1oyVW9Mak1wWEc0Z0lDa2dLMXh1SUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGeGNaM0psZVRVd1hGd3NJRnhjSXpWRlF6azJNbHhjTENCY1hDTTFSVU01TmpKY1hDa3BJQ3RjYmx4dUlDQjBhR1Z0WlNoY2JpQWdJQ0JoZUdsekxuUnBkR3hsTG5nZ1BTQmxiR1Z0Wlc1MFgySnNZVzVyS0Nrc1hHNGdJQ0FnWVhocGN5NTBhWFJzWlM1NUlEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3hjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDa3NJQ0FnSUZ4dUlDQWdJR0Y0YVhNdWRHVjRkQzU0SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTeGNiaUFnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJQ0FnSUNBZ0l5QlNiM1JoZEdVZ2VDMWhlR2x6SUd4aFltVnNjeUEwTlNCa1pXZHlaV1Z6WEc0Z0lDQWdJQ0JvYW5WemRDQTlJREVzSUNBZ0lDQWdJQ01nUVdScWRYTjBJR2h2Y21sNmIyNTBZV3dnYW5WemRHbG1hV05oZEdsdmJseHVJQ0FnSUNBZ2RtcDFjM1FnUFNBeElDQWdJQ0FnSUNBaklFRmthblZ6ZENCMlpYSjBhV05oYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y1hHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY1hIUnlZVzV6Y0dGeVpXNTBYRndwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNrZ0syeGhZbk1vZVNBOUlGeGNiRzluTWlobVl5QnZaaUJ2WW5NdlpYaHdLVnhjS1NBZ0t5QWdJQ0JjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JoYkhCb1lTQTlJREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3BJQ3NnWEc0Z0lHTnZiM0prWDJOaGNuUmxjMmxoYmloNWJHbHRJRDBnWXlndE1pd2dNaWtwWEc0Z0lDQWdYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4cGJuTjFiR0YwYVc5dVFtOTFibVJoY25sZmIySnpaWGh3WEZ3cFhHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwSUNCY2JseHVYRzVjYmx4dVhHNGpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU5jYmx4dVhHNW5aVzVsTG5kcGRHaHBia0p2ZFc1a1lYSjVJRHd0SUhWdWFYRjFaU2dvWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlGeGNkMmwwYUdsdVFtOTFibVJoY25sY1hDa3BKR2RsYm1VcFhHNW5aVzVsTG05MWRITnBaR1ZDYjNWdVpHRnllU0E4TFNCMWJtbHhkV1VvS0dkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNYRzkxZEhOcFpHVkNiM1Z1WkdGeWVWeGNLU2trWjJWdVpTbGNibWRsYm1VdWJtOUNiM1Z1WkdGeWVTQThMU0IxYm1seGRXVW9LR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY1hHNXZRbTkxYm1SaGNubGNYQ2twSkdkbGJtVXBYRzVjYm1kbGJtVXVkMEp2ZFc1a1lYSjVJRHd0SUhWdWFYRjFaU2hqS0dkbGJtVXVkMmwwYUdsdVFtOTFibVJoY25rc0lHZGxibVV1YjNWMGMybGtaVUp2ZFc1a1lYSjVLU2xjYmx4dVoyVnVaUzVuY205MWNERWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1oyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMkpwYm1GeWVVZHliM1Z3TVM1MGMzWmNYQ2twSkdkbGJtVmNibWRsYm1VdVozSnZkWEF5SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNESXVkSE4yWEZ3cEtTUm5aVzVsWEc1Y2JuQnlhVzUwS0Z4Y2NHVnlZeUJ2WmlCblpXNWxJSGRwZEdnZ2JHOXZjQ0IzYVhSb2FXNGdRbTkxYm1SaGNubGNYQ2xjYm5OMWJTaG5aVzVsTG1keWIzVndNU0FsYVc0bElHZGxibVV1ZDJsMGFHbHVRbTkxYm1SaGNua3BMMnhsYm1kMGFDaG5aVzVsTG1keWIzVndNU2txTVRBd1hHNXpkVzBvWjJWdVpTNW5jbTkxY0RJZ0pXbHVKU0JuWlc1bExuZHBkR2hwYmtKdmRXNWtZWEo1S1M5c1pXNW5kR2dvWjJWdVpTNW5jbTkxY0RJcEtqRXdNRnh1WEc1d2NtbHVkQ2hjWEhCbGNtTWdiMllnWjJWdVpTQjNhWFJvSUd4dmIzQWdiM1YwYzJsa1pTQkNiM1Z1WkdGeWVWeGNLVnh1YzNWdEtHZGxibVV1WjNKdmRYQXhJQ1ZwYmlVZ1oyVnVaUzV2ZFhSemFXUmxRbTkxYm1SaGNua3BMMnhsYm1kMGFDaG5aVzVsTG1keWIzVndNU2txTVRBd1hHNXpkVzBvWjJWdVpTNW5jbTkxY0RJZ0pXbHVKU0JuWlc1bExtOTFkSE5wWkdWQ2IzVnVaR0Z5ZVNrdmJHVnVaM1JvS0dkbGJtVXVaM0p2ZFhBeUtTb3hNREJjYmx4dWNISnBiblFvWEZ4d1pYSmpJRzltSUdkbGJtVWdkMmwwYUNCc2IyOXdJSGRwZEdnZ2JtOGdRbTkxYm1SaGNubGNYQ2xjYm5OMWJTaG5aVzVsTG1keWIzVndNU0FsYVc0bElHZGxibVV1Ym05Q2IzVnVaR0Z5ZVNrdmJHVnVaM1JvS0dkbGJtVXVaM0p2ZFhBeEtTb3hNREJjYm5OMWJTaG5aVzVsTG1keWIzVndNaUFsYVc0bElHZGxibVV1Ym05Q2IzVnVaR0Z5ZVNrdmJHVnVaM1JvS0dkbGJtVXVaM0p2ZFhBeUtTb3hNREJjYmx4dVhHNWthV1ptTGxKT1FTQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4a2FXWm1YMGN4TG1SVVFVZGZSekV1TW1rdVpGUkJSMTkyYzE5SE1TNHlhUzVFVFZOUExuUnpkbHhjS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB6Wld4bFkzUW9aVzV6WlcxaWJGOW5aVzVsWDJsa0xDQnNiMmN5Um05c1pFTm9ZVzVuWlN3Z2MyaHlhVzVyWldSZmJHOW5Na1pETENCd1lXUnFMQ0JsZUhSbGNtNWhiRjluWlc1bFgyNWhiV1VwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHZHliM1Z3SUQwZ1kyRnpaVjkzYUdWdUtGeHVJQ0FnSUdWdWMyVnRZbXhmWjJWdVpWOXBaQ0FsYVc0bElHZGxibVV1ZDBKdmRXNWtZWEo1SUg0Z1hGeDNhWFJvYVc1Q2IzVnVaR0Z5ZVZ4Y0xGeHVJQ0FnSUdWdWMyVnRZbXhmWjJWdVpWOXBaQ0FsYVc0bElHZGxibVV1Ym05Q2IzVnVaR0Z5ZVNCK0lGeGNibTlDYjNWdVpHRnllVnhjTEZ4dUlDQWdJRlJTVlVVZ2ZpQk9RVnh1SUNBcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWdoYVhNdWJtRW9aM0p2ZFhBcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hoWW5OTWIyY3lSa01nUFNCaFluTW9iRzluTWtadmJHUkRhR0Z1WjJVcEtWeHVYRzVjYm1kbmNHeHZkQ2hrYVdabUxsSk9RU3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUd4dlp6SkdiMnhrUTJoaGJtZGxLU2tnS3lCblpXOXRYM1pwYjJ4cGJpZ3BJQ3NnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhLVnh1WEc1blpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaUFnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXhLU0FwSkdGaWMweHZaekpHUTF4dUlDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMW5jbTkxY0RJcElDa2tZV0p6VEc5bk1rWkRYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVZMjl1ZGxCMllXeDFaU2huWlhSUWRtRnNWMmxzWTI5NEtHUnBabVl1VWs1QkxDQmNYSGRwZEdocGJrSnZkVzVrWVhKNVhGd3NJRnhjYm05Q2IzVnVaR0Z5ZVZ4Y0tTbGNibHh1WEc0aklFTnlaV0YwWlNCMGFHVWdRMFJHSUhCc2IzUmNibkFnUEMwZ1oyZHdiRzkwS0dScFptWXVVazVCTENCaFpYTW9lQ0E5SUdGaWMweHZaekpHUXl3Z1kyOXNiM0lnUFNCbmNtOTFjQ2twSUN0Y2JuTjBZWFJmWldOa1ppaHphWHBsSUQwZ01DNDBJQ2tnS3lBaklGVnpaU0J6ZEdGMFgyVmpaR1lnZEc4Z2NHeHZkQ0IwYUdVZ1pXMXdhWEpwWTJGc0lFTkVSbHh1SUNCc1lXSnpLRnh1SUNBZ0lIZ2dQU0JjWEVGaWMyOXNkWFJsSUd4dlp6SW9abTlzWkNCamFHRnVaMlVwWEZ3c1hHNGdJQ0FnZVNBOUlGeGNRM1Z0ZFd4aGRHbDJaU0JRY205aVlXSnBiR2wwZVZ4Y1hHNGdJQ2tnS3lCamIyOXlaRjlqWVhKMFpYTnBZVzRvZUd4cGJTQTlJR01vTUN3Z01DNDFLU2tnSzF4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QWpJRU5zWldGdUlIUm9aVzFsWEc0Z0lIUm9aVzFsS0Z4dUlDQWdJQ0FnWVhocGN5NTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3hjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hGeDBjbUZ1YzNCaGNtVnVkRnhjS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdiR1ZuWlc1a0xuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLVnh1SUNBZ0lDbGNibHh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y2JHOW5Na1pEWDJOa1psOXBibk4xYkdGMGFXOXVRbTkxYm1SaGNubGNYQ2xjYm5kcFpIUm9JRHd0SUhCaGJtVnNVMmw2WlNneUxqVXBLbTF0Vkc5SmJtTm9YRzVvWldsbmFIUWdQQzBnY0dGdVpXeFRhWHBsS0RFdU5Ta3FiVzFVYjBsdVkyaGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JseHVYRzVjYmlNakl5QkRhR1ZqYTJsdVp5QmphR0Z5WVdOMFpYSnpkR2xqY3lCdlppQmhibU5vYjNKelhHNTBaVzF3TVNBOExTQmhibU5vYjNJdVpHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JjWEc1dlFtOTFibVJoY25sY1hDa2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9MV2R5YjNWd0tWeHVZVzVqYUc5eUxtNXZRbTkxYm1SaGNua2dQQzBnWlhoMGNtRmpkRUZ1WTJodmNpaDBaVzF3TVNsY2JseHVkR1Z0Y0RJZ1BDMGdZVzVqYUc5eUxtUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWEZ4M2FYUm9hVzVDYjNWdVpHRnllVnhjS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENndFozSnZkWEFwWEc1aGJtTm9iM0l1ZDJsMGFHbHVRbTkxYm1SaGNua2dQQzBnWlhoMGNtRmpkRUZ1WTJodmNpaDBaVzF3TWlsY2JseHVkR1Z0Y0RNZ1BDMGdZVzVqYUc5eUxtUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWEZ4dmRYUnphV1JsUW05MWJtUmhjbmxjWENrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb0xXZHliM1Z3S1Z4dVlXNWphRzl5TG05MWRITnBaR1ZDYjNWdVpHRnllU0E4TFNCbGVIUnlZV04wUVc1amFHOXlLSFJsYlhBektWeHVYRzVjYm1kbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYkc5dmNDQTlQV2R5YjNWd01Ta2dLU1J6ZFcxVFkyOXlaVnh1SUNCa2FYTjBZVzVqWlRJZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2JHOXZjQ0E5UFdkeWIzVndNaWtnS1NSemRXMVRZMjl5WlZ4dUlDQjNhV3dnUEMwZ2QybHNZMjk0TG5SbGMzUW9aR2x6ZEdGdVkyVXhMQ0JrYVhOMFlXNWpaVElwWEc0Z0lISmxkSFZ5YmloM2FXd2tjQzUyWVd4MVpTbGNibjFjYmx4dVoyVjBVM1Z0VTJOdmNtVnpJRHd0SUdaMWJtTjBhVzl1S0hSeVlXTnJMQ0JoYm1Ob2IzSXBJSHRjYmlBZ0l5QkdhVzVrSUc5MlpYSnNZWEJ6SUdKbGRIZGxaVzRnWVd4c0lHRnVZMmh2Y25NZ1lXNWtJSFJ5WVdOcklISmxaMmx2Ym5NZ1lYUWdiMjVqWlZ4dUlDQnZkbVZ5YkdGd2N5QThMU0JtYVc1a1QzWmxjbXhoY0hNb1lXNWphRzl5TENCMGNtRmpheWxjYmlBZ1hHNGdJQ01nUlhoMGNtRmpkQ0IwYUdVZ2MyTnZjbVZ6SUdGdVpDQmpiM0p5WlhOd2IyNWthVzVuSUdGdVkyaHZjaUJwYm1ScFkyVnpYRzRnSUdGdVkyaHZjbDlwYm1ScFkyVnpJRHd0SUhGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsY2JpQWdkSEpoWTJ0ZmMyTnZjbVZ6SUR3dElITmpiM0psS0hSeVlXTnJLVnR6ZFdKcVpXTjBTR2wwY3lodmRtVnliR0Z3Y3lsZFhHNGdJRnh1SUNBaklGVnpaU0IwWVhCd2JIa2dkRzhnWTJGc1kzVnNZWFJsSUhSb1pTQnRaV1JwWVc0Z2MyTnZjbVZ6SUdadmNpQmxZV05vSUdGdVkyaHZjbHh1SUNCdFpXUnBZVzVmYzJOdmNtVnpJRHd0SUhSaGNIQnNlU2gwY21GamExOXpZMjl5WlhNc0lHRnVZMmh2Y2w5cGJtUnBZMlZ6TENCdFpXRnVMQ0J1WVM1eWJTQTlJRlJTVlVVcFhHNGdJRnh1SUNBaklFbHVhWFJwWVd4cGVtVWdZU0J1ZFcxbGNtbGpJSFpsWTNSdmNpQjBieUJ6ZEc5eVpTQjBhR1VnYldWa2FXRnVJSE5qYjNKbGN5Qm1iM0lnWldGamFDQmhibU5vYjNKY2JpQWdZV3hzWDIxbFpHbGhibDl6WTI5eVpYTWdQQzBnY21Wd0tFNUJMQ0JzWlc1bmRHZ29ZVzVqYUc5eUtTbGNiaUFnWEc0Z0lDTWdVRzl3ZFd4aGRHVWdkR2hsSUcxbFpHbGhiaUJ6WTI5eVpYTWdabTl5SUhSb1pTQmhibU5vYjNKeklIUm9ZWFFnYUdGMlpTQnZkbVZ5YkdGd2MxeHVJQ0JoYkd4ZmJXVmthV0Z1WDNOamIzSmxjMXRoY3k1dWRXMWxjbWxqS0c1aGJXVnpLRzFsWkdsaGJsOXpZMjl5WlhNcEtWMGdQQzBnYldWa2FXRnVYM05qYjNKbGMxeHVJQ0JjYmlBZ2NtVjBkWEp1S0dGc2JGOXRaV1JwWVc1ZmMyTnZjbVZ6S1Z4dWZWeHVYRzV3Ykc5MFUzVnRVMk52Y21WelFtbHVZWEo1SUR3dElHWjFibU4wYVc5dUtIUnlZV05yTENCd1pXRnJMQ0J1WVcxbExDQmhibU5vYjNJeExDQmhibU5vYjNJeUxDQmhibU5vYjNJektYdGNiaUFnY0dWaGExUnlZV05ySUR3dElIUnlZV05yVzNWdWFYRjFaU2h4ZFdWeWVVaHBkSE1vWm1sdVpFOTJaWEpzWVhCektIUnlZV05yTENCd1pXRnJLU2twWFZ4dUlDQmhJRHd0SUdkbGRGTjFiVk5qYjNKbGN5aHdaV0ZyVkhKaFkyc3NJR0Z1WTJodmNqRXBYRzRnSUdJZ1BDMGdaMlYwVTNWdFUyTnZjbVZ6S0hCbFlXdFVjbUZqYXl3Z1lXNWphRzl5TWlsY2JpQWdZeUE4TFNCblpYUlRkVzFUWTI5eVpYTW9jR1ZoYTFSeVlXTnJMQ0JoYm1Ob2IzSXpLVnh1SUNCaExuUmlJRHd0SUhScFltSnNaU2hzYjI5d0lEMGdYRnh1YjBKdmRXNWtZWEo1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITjFiVk5qYjNKbElEMGdZU2xjYmlBZ1lpNTBZaUE4TFNCMGFXSmliR1VvYkc5dmNDQTlJRnhjZDJsMGFFSnZkVzVrWVhKNVhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE4xYlZOamIzSmxJRDBnWWlsY2JpQWdZeTUwWWlBOExTQjBhV0ppYkdVb2JHOXZjQ0E5SUZ4Y2IzVjBjMmxrWlVKdmRXNWtZWEo1WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITjFiVk5qYjNKbElEMGdZeWxjYmlBZ1hHNGdJR1JoZEdFZ1BDMGdZbWx1WkY5eWIzZHpLR0V1ZEdJc0lHSXVkR0lzSUdNdWRHSXBJQ1UrSlNCa2NtOXdYMjVoS0NsY2JpQWdaR0YwWVNSc2IyOXdJRHd0SUdaaFkzUnZjaWhrWVhSaEpHeHZiM0FzSUd4bGRtVnNjeUE5SUdNb1hGeHViMEp2ZFc1a1lYSjVYRndzSUZ4Y2QybDBhRUp2ZFc1a1lYSjVYRndzSUZ4Y2IzVjBjMmxrWlVKdmRXNWtZWEo1WEZ3cEtWeHVJQ0JjYmlBZ2NERXlJRHd0SUdkbGRGQjJZV3hYYVd4amIzZ29aR0YwWVN3Z1hGeHViMEp2ZFc1a1lYSjVYRndzSUZ4Y2QybDBhRUp2ZFc1a1lYSjVYRndwWEc0Z0lIQXhNeUE4TFNCblpYUlFkbUZzVjJsc1kyOTRLR1JoZEdFc0lGeGNibTlDYjNWdVpHRnllVnhjTENCY1hHOTFkSE5wWkdWQ2IzVnVaR0Z5ZVZ4Y0tWeHVJQ0J3TWpNZ1BDMGdaMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMQ0JjWEhkcGRHaENiM1Z1WkdGeWVWeGNMQ0JjWEc5MWRITnBaR1ZDYjNWdVpHRnllVnhjS1Z4dUlDQndJRHd0SUNCblozQnNiM1FvWkdGMFlTd2dZV1Z6S0hnZ1BTQnNiMjl3TENCNUlEMGdjM1Z0VTJOdmNtVXBLU0FySUZ4dUlDQWdJR3hoWW5Nb2VDQTlJRTVWVEV3c0lIa2dQU0J3WVhOMFpUQW9ibUZ0WlN3Z1hGeGNYRzVzYjJjb1lYWm5JSEJsWVdzZ2MyTnZjbVVnY0dWeUlHRnVZMmh2Y2lsY1hDa3BJQ3RjYmlBZ0lDQm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUd4dmIzQXBMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3RjYmlBZ0lDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpFc0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsZDJsa2RHZ2dQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmRYUnNhV1Z5TG5OcGVtVWdQU0F4TENCdmRYUnNhV1Z5TG5OMGNtOXJaU0E5SUU1QktTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJYRzRnSUNBZ2MzUmhkRjl6ZFcxdFlYSjVLRnh1SUNBZ0lDQWdZV1Z6S0dkeWIzVndJRDBnYkc5dmNDa3NJR1oxYmlBOUlHMWxZVzRzWEc0Z0lDQWdJQ0JuWlc5dElEMGdYRnh3YjJsdWRGeGNMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTVN4Y2JpQWdJQ0FnSUdacGJHd2dQU0JjWEhKbFpGeGNMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYRnh1SUNBZ0lDa2dLeUIwYUdWdFpTaGNiaUFnSUNBZ0lHRjRhWE11ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNYRzRnSUNBZ0lDQXBMRnh1SUNBZ0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2dZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDQWdLU3hjYmlBZ0lDQWdJR0Y0YVhNdWRHVjRkQzU0SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdJQ0JoYm1kc1pTQTlJRFExTENCb2FuVnpkQ0E5SURFc0lIWnFkWE4wSUQwZ01WeHVJQ0FnSUNBZ0tTeGNiaUFnSUNBZ0lHRjRhWE11YkdsdVpTQTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hDd2djMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBZ0lDa3NYRzRnSUNBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDQWdLU3hjYmlBZ0lDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ4Y2RISmhibk53WVhKbGJuUmNYQ2tzWEc0Z0lDQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDQWdLU0FySUZ4dUlDQWdJQ05qYjI5eVpGOWpZWEowWlhOcFlXNG9lV3hwYlNBOUlHTW9jWFZoYm5ScGJHVW9aR0YwWVNSemRXMVRZMjl5WlN3Z01DNHdLU3dnY1hWaGJuUnBiR1VvWkdGMFlTUnpkVzFUWTI5eVpTd2dNQzQ1T1NrcEtTQXJJRnh1SUNBZ0lHRnVibTkwWVhSbEtGeHVJQ0FnSUNBZ1hGeDBaWGgwWEZ3c0lIZ2dQU0F4TENCNUlEMGdjWFZoYm5ScGJHVW9aR0YwWVNSemRXMVRZMjl5WlN3Z01DNDFLU3hjYmlBZ0lDQWdJR3hoWW1Wc0lEMGdjR0Z6ZEdVd0tGeGNjREV5T2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3TVRJcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d01UTTZJRnhjTENCamIyNTJVSFpoYkhWbEtIQXhNeWtzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEF5TXpvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0RJektTa3NYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNMXh1SUNBZ0lDa2dYRzRnSUNNcklITmpZV3hsWDNsZlkyOXVkR2x1ZFc5MWN5aDBjbUZ1Y3lBOUlGeGNiRzluTVRCY1hDbGNiaUFnWEc0Z0lHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYRU5vU1ZCZmNHVmhhMTloZG1kUVpXRnJVMk52Y21WZlltOTFibVJoY25sQmJtTm9iM0pmWEZ3c0lHNWhiV1VwWEc0Z0lIZHBaSFJvSUR3dElIQmhibVZzVTJsNlpTZ3lLU3B0YlZSdlNXNWphRnh1SUNCb1pXbG5hSFFnUEMwZ2NHRnVaV3hUYVhwbEtESXBLbTF0Vkc5SmJtTm9YRzRnSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzU5WEc1Y2JpTWdVM1Z0SUhCbFlXc2djMk52Y21WY2JpTWpJeU5jYm5SeVlXTnJJRHd0SUdsdGNHOXlkQ2hvWlhKbEtISmxaa1JwY2l3Z1hGd3pNekkxTlY5SU0wczBiV1V6WHpBMExUYzBOVjlDY25WalpTMDBYM1J5YVcxZmNUSXdYMlJsWkhWd1gySnNZV05yWDJSbGNIUm9UbTl5YlM1aWQxeGNLU3dnWm05eWJXRjBJRDBnWEZ4Q2FXZFhhV2RjWENsY2JuQmxZV3NnUEMwZ2FXMXdiM0owVUdWaGF5aG9aWEpsS0hKbFprUnBjaXdnWEZ3ek16STFOVjlJTTBzMGJXVXpYekEwTFRjME5WOUNjblZqWlMwMFgzQmxZV3R6TG0xbGNtZGxVR1ZoYXk1aVpXUmNYQ2twWEc1d2JHOTBVM1Z0VTJOdmNtVnpRbWx1WVhKNUtIUnlZV05yTENCd1pXRnJMQ0JjWEVnelN6UnRaVE5jWEN3Z1lXNWphRzl5TG01dlFtOTFibVJoY25rc0lHRnVZMmh2Y2k1M2FYUm9hVzVDYjNWdVpHRnllU3dnWVc1amFHOXlMbTkxZEhOcFpHVkNiM1Z1WkdGeWVTbGNibHh1ZEhKaFkyc2dQQzBnYVcxd2IzSjBLR2hsY21Vb2NtVm1SR2x5TENCY1hFZFRUVEkwTXpnME56WmZSVU10UkVjdE16UTFPQzFJTTBzeU4wRkRYMEZUV1U1Zk1TNWlkMXhjS1N3Z1ptOXliV0YwSUQwZ1hGeENhV2RYYVdkY1hDbGNibkJsWVdzZ1BDMGdhVzF3YjNKMFVHVmhheWhvWlhKbEtISmxaa1JwY2l3Z1hGeEhVMDB5TkRNNE5EYzJYMFZETFVSSExUTTBOVGd0U0ROTE1qZEJRMTlCVTFsT1h6RXVibUZ5Y205M1VHVmhheTVpWldSY1hDa3BYRzRqY0d4dmRGTjFiVk5qYjNKbGN5aDBjbUZqYXl3Z2NHVmhheXdnWEZ4SU0wc3lOMkZqWEZ3cFhHNXdiRzkwVTNWdFUyTnZjbVZ6UW1sdVlYSjVLSFJ5WVdOckxDQndaV0ZyTENCY1hFZ3pTekkzWVdOY1hDd2dZVzVqYUc5eUxtNXZRbTkxYm1SaGNua3NJR0Z1WTJodmNpNTNhWFJvYVc1Q2IzVnVaR0Z5ZVN3Z1lXNWphRzl5TG05MWRITnBaR1ZDYjNWdVpHRnllU2xjYmx4dWRISmhZMnNnUEMwZ2FXMXdiM0owS0dobGNtVW9jbVZtUkdseUxDQmNYRWRUVFRJMk9ETTBOREJmU2pGZlNETkxNVFJoWTE5dGJURXdUR2xtZEdWa0xtSnNZV05yTG1KM1hGd3BMQ0JtYjNKdFlYUWdQU0JjWEVKcFoxZHBaMXhjS1Z4dWNHVmhheUE4TFNCcGJYQnZjblJRWldGcktHaGxjbVVvY21WbVJHbHlMQ0JjWEVkVFRUSTJPRE0wTkRCZlNqRmZTRE5MTVRSaFkxOXRiVEV3VEdsbWRHVmtMbUpsWkZ4Y0tTbGNiaU53Ykc5MFUzVnRVMk52Y21WektIUnlZV05yTENCd1pXRnJMQ0JjWEVnelN6RTBZV05jWENsY2JuQnNiM1JUZFcxVFkyOXlaWE5DYVc1aGNua29kSEpoWTJzc0lIQmxZV3NzSUZ4Y1NETkxNVFJoWTF4Y0xDQmhibU5vYjNJdWJtOUNiM1Z1WkdGeWVTd2dZVzVqYUc5eUxuZHBkR2hwYmtKdmRXNWtZWEo1TENCaGJtTm9iM0l1YjNWMGMybGtaVUp2ZFc1a1lYSjVLVnh1WEc1MGNtRmpheUE4TFNCcGJYQnZjblFvYUdWeVpTaHlaV1pFYVhJc0lGeGNNek15TkRoZlExUkRSbDh3TnkwM01qbGZRbkoxWTJVdE5GOTBjbWx0WDNFeU1GOWtaV1IxY0Y5aWJHRmphMTlrWlhCMGFFNXZjbTB1WW5kY1hDa3NJR1p2Y20xaGRDQTlJRnhjUW1sblYybG5YRndwWEc1d1pXRnJJRHd0SUdsdGNHOXlkRkJsWVdzb2FHVnlaU2h5WldaRWFYSXNJRnhjTXpNeU5EaGZRMVJEUmw4d055MDNNamxmUW5KMVkyVXRORjl3WldGcmN5NXRaWEpuWlZCbFlXc3VZbVZrWEZ3cEtWeHVJM0JzYjNSVGRXMVRZMjl5WlhNb2RISmhZMnNzSUhCbFlXc3NJRnhjUTFSRFJseGNLVnh1Y0d4dmRGTjFiVk5qYjNKbGMwSnBibUZ5ZVNoMGNtRmpheXdnY0dWaGF5d2dYRnhEVkVOR1hGd3NJR0Z1WTJodmNpNXViMEp2ZFc1a1lYSjVMQ0JoYm1Ob2IzSXVkMmwwYUdsdVFtOTFibVJoY25rc0lHRnVZMmh2Y2k1dmRYUnphV1JsUW05MWJtUmhjbmtwWEc1Y2JuUnlZV05ySUR3dElHbHRjRzl5ZENob1pYSmxLSEpsWmtScGNpd2dYRnd6TXpJMU1GOVNRVVF5TVY5aFlqazVNbDlDY25WalpTMDBYM1J5YVcxZmNUSXdYMlJsWkhWd1gySnNZV05yWDJSbGNIUm9UbTl5YlM1aWQxeGNLU3dnWm05eWJXRjBJRDBnWEZ4Q2FXZFhhV2RjWENsY2JuQmxZV3NnUEMwZ2FXMXdiM0owVUdWaGF5aG9aWEpsS0hKbFprUnBjaXdnWEZ3ek16STFNRjlTUVVReU1WOWhZams1TWw5Q2NuVmpaUzAwWDNCbFlXdHpMbTFsY21kbFVHVmhheTVpWldSY1hDa3BYRzRqY0d4dmRGTjFiVk5qYjNKbGN5aDBjbUZqYXl3Z2NHVmhheXdnWEZ4U1FVUXlNVnhjS1Z4dWNHeHZkRk4xYlZOamIzSmxjMEpwYm1GeWVTaDBjbUZqYXl3Z2NHVmhheXdnWEZ4U1FVUXlNVnhjTENCaGJtTm9iM0l1Ym05Q2IzVnVaR0Z5ZVN3Z1lXNWphRzl5TG5kcGRHaHBia0p2ZFc1a1lYSjVMQ0JoYm1Ob2IzSXViM1YwYzJsa1pVSnZkVzVrWVhKNUtWeHVYRzVjYmx4dUl5TWpJeU1qSXlNZ1RFOU1RVnh1WVhSaFl5QThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4SFUwMHpNVEEyTWpVM1gwRlVRVU5mUlZORFh6RXVZbVZrWEZ3cEtTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaFdNU3dnVmpJc0lGWXpLVnh1WTI5c2JtRnRaWE1vWVhSaFl5a2dQQzBnWXloY1hHTm9jbHhjTENCY1hITjBZWEowWEZ3c0lGeGNaVzVrWEZ3cFhHNWhkR0ZqTG1keUlEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaGhkR0ZqS1Z4dVhHNGpJRXhQUVVSSlRrY2dURTlQVUZOY2JteHZiM0F1WVd4c0lEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR05vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIa3VkSE4yWEZ3cEtTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4RkxVVmNYQ2twWEc1aGJtTm9iM0l1WVd4c0lEd3RJQ2hsZUhSeVlXTjBRVzVqYUc5eUtHeHZiM0F1WVd4c0tTbGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGhibU5vYjNJdVlXeHNMQ0JoZEdGakxtZHlLVnh1WVc1amFHOXlMbUZzYkNBOExTQndhVzUwWlhKelpXTjBLR0Z1WTJodmNpNWhiR3hiY1hWbGNubElhWFJ6S0c5MlpYSnNZWEJ6S1Ywc0lHRjBZV011WjNKYmMzVmlhbVZqZEVocGRITW9iM1psY214aGNITXBYU2xjYmx4dWIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0dGdVkyaHZjaTV1YjBKdmRXNWtZWEo1TENCaGRHRmpMbWR5S1Z4dVlXNWphRzl5TG01dlFtOTFibVJoY25rZ1BDMGdjR2x1ZEdWeWMyVmpkQ2hoYm1Ob2IzSXVibTlDYjNWdVpHRnllVnR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNTNhWFJvYVc1Q2IzVnVaR0Z5ZVN3Z1lYUmhZeTVuY2lsY2JtRnVZMmh2Y2k1M2FYUm9hVzVDYjNWdVpHRnllU0E4TFNCd2FXNTBaWEp6WldOMEtHRnVZMmh2Y2k1M2FYUm9hVzVDYjNWdVpHRnllVnR4ZFdWeWVVaHBkSE1vYjNabGNteGhjSE1wWFN3Z1lYUmhZeTVuY2x0emRXSnFaV04wU0dsMGN5aHZkbVZ5YkdGd2N5bGRLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR0Z1WTJodmNpNXZkWFJ6YVdSbFFtOTFibVJoY25rc0lHRjBZV011WjNJcFhHNWhibU5vYjNJdWIzVjBjMmxrWlVKdmRXNWtZWEo1SUR3dElIQnBiblJsY25ObFkzUW9ZVzVqYUc5eUxtOTFkSE5wWkdWQ2IzVnVaR0Z5ZVZ0eGRXVnllVWhwZEhNb2IzWmxjbXhoY0hNcFhTd2dZWFJoWXk1bmNsdHpkV0pxWldOMFNHbDBjeWh2ZG1WeWJHRndjeWxkS1Z4dVhHNWNibHh1WVc1amFHOXljeUE4TFNCc2FYTjBLR0Z1WTJodmNpNXViMEp2ZFc1a1lYSjVMQ0JoYm1Ob2IzSXVkMmwwYUVKdmRXNWtZWEo1TENCaGJtTm9iM0l1YjNWMGMybGtaVUp2ZFc1a1lYSjVLVnh1ZEdKeklEd3RJR3hwYzNRb0tWeHVkR1Z0Y0hNZ1BDMGdiR2x6ZENncFhHNWNibUZzY0doaElEd3RJREF1TURWY2JseHVJeUJRY205alpYTnpJR05zZFhOMFpYSnpJR014SUhSdklHTTRYRzVtYjNJZ0tHa2dhVzRnTVRvektTQjdYRzRnSUZ4dUlDQmhibU5vYjNJZ1BDMGdZVzVqYUc5eWMxdGJhVjFkWEc0Z0lDTWdVblZ1SUV4UFRFRmNiaUFnY21WemRXeDBJRHd0SUhKMWJreFBURUVvWVc1amFHOXlMQ0JoYm1Ob2IzSXVZV3hzTENCc2IyeGhSRUlwWEc0Z0lIUmlJRHd0SUdGelgzUnBZbUpzWlNoeVpYTjFiSFFwWEc0Z0lGeHVJQ0FqSUVacGJIUmxjaUJoYm1RZ2MzVnRiV0Z5YVhwbFhHNGdJSFJpSUR3dElIUmlJQ1UrSlZ4dUlDQWdJR1J3YkhseU9qcHRkWFJoZEdVb2RHRnlaMlYwSUQwZ2RHOTFjSEJsY2loaGJuUnBZbTlrZVNrcElDVStKVnh1SUNBZ0lHWnBiSFJsY2loemRISmZkRzlmYkc5M1pYSW9ZMlZzYkZSNWNHVXBJRDA5SUZ4Y1pXMWljbmx2Ym1saklITjBaVzBnWTJWc2JGeGNLU0FsUGlWY2JpQWdJQ0JrY0d4NWNqbzZabWxzZEdWeUtIRldZV3gxWlNBOElHRnNjR2hoS1NBbFBpVmNiaUFnSUNCa2NHeDVjam82WjNKdmRYQmZZbmtvZEdGeVoyVjBLU0FsUGlWY2JpQWdJQ0J6YkdsalpWOXRhVzRvYldWaGJsSnVheXdnZDJsMGFGOTBhV1Z6SUQwZ1JrRk1VMFVwWEc0Z0lGeHVJQ0FqSUZOMGIzSmxJSFJpWEc0Z0lIUmljMXRiYVYxZElEd3RJSFJpWEc0Z0lGeHVJQ0FqSUZObGJHVmpkQ0JoYm1RZ2NtVnVZVzFsSUc5a1pITlNZWFJwYjF4dUlDQjBaVzF3SUR3dElIUmlJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLSFJoY21kbGRDd2diMlJrYzFKaGRHbHZLVnh1SUNCamIyeHVZVzFsY3loMFpXMXdLU0E4TFNCaktGeGNkR0Z5WjJWMFhGd3NJSEJoYzNSbE1DaGNYRTlTWDJOY1hDd2dhU2twWEc0Z0lGeHVJQ0FqSUZOMGIzSmxJSFJsYlhCY2JpQWdkR1Z0Y0hOYlcybGRYU0E4TFNCMFpXMXdYRzU5WEc1Y2JpTWdUV1Z5WjJVZ1lXeHNJSFJsYlhBZ2RHRmliR1Z6SUdsdWRHOGdiMjVsWEc1MFpXMXdJRHd0SUZKbFpIVmpaU2htZFc1amRHbHZiaWg0TENCNUtTQm1kV3hzWDJwdmFXNG9lQ3dnZVN3Z1lua2dQU0JjWEhSaGNtZGxkRnhjS1N3Z2RHVnRjSE1wSUNVK0pWeHVJQ0J0ZFhSaGRHVmZZV3hzS0g1eVpYQnNZV05sWDI1aEtDNHNJREVwS1Z4dVkyOXNibUZ0WlhNb2RHVnRjQ2tnUEMwZ1l5aGNYSFJoY21kbGRGeGNMQ0JjWEc1dlFtOTFibVJoY25sY1hDd2dYRngzYVhSb2FXNUNiM1Z1WkdGeWVWeGNMQ0JjWEc5MWRITnBaR1ZDYjNWdVpHRnllVnhjS1Z4dVpHRjBZU0E4TFNCMFpXMXdJQ1UrSlNCamIyeDFiVzVmZEc5ZmNtOTNibUZ0WlhNb1hGeDBZWEpuWlhSY1hDa2dKVDRsSUdGekxtMWhkSEpwZUNncFhHNWNibXhwWW5KaGNua29ZMmx5WTJ4cGVtVXBYRzVqYjJ4ZlpuVnVJRHd0SUdOdmJHOXlVbUZ0Y0RJb1l5Z3hMQ0J0WVhnb1pHRjBZU2twTENCaktGeGNkMmhwZEdWY1hDd2dYRnh5WldSY1hDa3BYRzVjYmx4dUkyWjJhWHBmYm1KamJIVnpkQ2hrWVhSaExDQnJiV1ZoYm5Nc0lHMWxkR2h2WkNBOUlGeGNkM056WEZ3cFhHNWNibkFnUEMwZ1NHVmhkRzFoY0NoY2JpQWdaR0YwWVN4Y2JpQWdibUZ0WlNBOUlGeGNUMlJrY3lCU1lYUnBiMXhjTENBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBaklFNWhiV1VnYjJZZ2RHaGxJR2hsWVhSdFlYQWdiR1ZuWlc1a1hHNGdJR05zZFhOMFpYSmZZMjlzZFcxdWN5QTlJRVpCVEZORkxDQWdJQ0FnSUNBZ0lDQWdJQ01nVW1WdGIzWmxJR052YkhWdGJpQmtaVzVrY205bmNtRnRYRzRnSUhOb2IzZGZjbTkzWDJSbGJtUWdQU0JHUVV4VFJTeGNiaUFnWTI5c0lEMGdZMjlzWDJaMWJpeGNiaUFnWW05eVpHVnlJRDBnVkZKVlJWeHVLVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNiwgNywgMTEsIDEyLCAyNCwgMjksIDMxKSkgJT4lIHVubmVzdChnZW5lKVxuXG5cbmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWNiwgVFNTKVxuY29sbmFtZXMoZ2VuZS5UU1MudGIpIDwtIGMoXFxlbnNlbWJsXFwsIFxcVFNTXFwpXG5cblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihnZW5lLlRTUy50YiwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsXFwpKVxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZTEgPSAoc3RhcnQxICsgZW5kMSkvMiAtIFRTUyxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTIgPSAoc3RhcnQyICsgZW5kMikvMiAtIFRTUyxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IGlmX2Vsc2UoYWJzKGRpc3RhbmNlMSkgPiBhYnMoZGlzdGFuY2UyKSwgZGlzdGFuY2UxLCBkaXN0YW5jZTIpKVxuXG5yZXN1bHQgPC0gZ2VuZUFubm9EYXRhICU+JVxuICBmaWx0ZXIoQW5ubzIgPT0gXFxQLVNcXCkgJT4lXG4gIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpc2UoXG4gICAgZmFyUmlnaHQgPSBpZiAoYW55KGRpc3RhbmNlID4gMCkpIG1heChkaXN0YW5jZVtkaXN0YW5jZSA+IDBdKSBlbHNlIDAsICAjIFJldHVybiAwIGlmIG5vIHBvc2l0aXZlIGRpc3RhbmNlXG4gICAgZmFyTGVmdCA9IGlmIChhbnkoZGlzdGFuY2UgPCAwKSkgbWluKGRpc3RhbmNlW2Rpc3RhbmNlIDwgMF0pIGVsc2UgMCAgIyBSZXR1cm4gMCBpZiBubyBuZWdhdGl2ZSBkaXN0YW5jZVxuICApICU+JVxuICB1bmdyb3VwKClcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgbGVmdF9qb2luKHJlc3VsdCwgYnkgPSBjKFxcZ2VuZVxcKSlcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGlzLm5hKGZhclJpZ2h0KSB+IFxcTm9cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlzdGFuY2UgPiBmYXJMZWZ0KSAmIChkaXN0YW5jZSA8IGZhclJpZ2h0KSB+IFxcV2l0aGluXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFxcT3V0c2lkZVxcKSxcbiAgICAgICAgICAgICAgICBzaXplID0gc3RhcnQyIC0gc3RhcnQxKVxuXG5kYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgaWQsIHNpemUpICU+JSBkaXN0aW5jdCgpXG5hbmNob3IuZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBncm91cCkgJT4lIGRpc3RpbmN0KClcblxudGVtcDEgPC0gYW5jaG9yLmRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxOb1xcKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApXG5md3JpdGUodGVtcDEsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGluc3VsYXRlZF9kb21haW5fcHNfbm8uYmVkcGVcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxudGVtcDIgPC0gYW5jaG9yLmRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxXaXRoaW5cXCkgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKVxuZndyaXRlKHRlbXAyLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxpbnN1bGF0ZWRfZG9tYWluX3BzX3dpdGhpbi5iZWRwZVxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG50ZW1wMyA8LSBhbmNob3IuZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXE91dHNpZGVcXCkgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKVxuZndyaXRlKHRlbXAzLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxpbnN1bGF0ZWRfZG9tYWluX3BzX291dHNpZGUuYmVkcGVcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkc2l6ZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkc2l6ZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuIyBjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGF0YSwgXFxub0JvdW5kYXJ5XFwsIFxcd2l0aGluQm91bmRhcnlcXCkpXG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXG5vQm91bmRhcnlcXCwgXFxvdXRzaWRlQm91bmRhcnlcXCkpXG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXG91dHNpZGVCb3VuZGFyeVxcLCBcXHdpdGhpbkJvdW5kYXJ5XFwpKVxuXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzaXplLCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBhbHBoYSA9IC40LCAsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKVxuICAgICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcZ3JleTUwXFwsIFxcIzVFQzk2MlxcLCBcXCM1RUM5NjJcXCkpICtcblxuICB0aGVtZShcbiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK2xhYnMoeSA9IFxcTG9vcCBzaXplXFwpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25Cb3VuZGFyeV9zaXplXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG4gIFxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGRpZmZfZFRBR19ETVNPXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRkaWZmX2RUQUdfRE1TT1xuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGlkLCBkaWZmX2RUQUdfRE1TTykgJT4lIGRpc3RpbmN0KClcblxuIyBjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGF0YSwgXFxub0JvdW5kYXJ5XFwsIFxcd2l0aGluQm91bmRhcnlcXCkpXG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXG5vQm91bmRhcnlcXCwgXFxvdXRzaWRlQm91bmRhcnlcXCkpXG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXG91dHNpZGVCb3VuZGFyeVxcLCBcXHdpdGhpbkJvdW5kYXJ5XFwpKVxuXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlmZl9kVEFHX0RNU08sIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFxncmV5NTBcXCwgXFwjNUVDOTYyXFwsIFxcIzVFQzk2MlxcKSkgK1xuXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSxcbiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSwgICAgXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArbGFicyh5ID0gXFzOlCBsb29wIHNjb3JlXFwpICArICAgIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgKyBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTAuMixcbiAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuOCwgMC41KSlcbiAgICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25Cb3VuZGFyeV9kZWx0YVxcKVxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKSAgXG4gIFxuICBcbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFxuICAgIFxuICAgIG1pblZhbHVlIDwtIC00XG4gIG9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTylcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgbGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpXG5cbmRhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBpZCwgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTykgJT4lIGRpc3RpbmN0KClcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU09cbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU09cbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbiMgY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsIFxcbm9Cb3VuZGFyeVxcLCBcXHdpdGhpbkJvdW5kYXJ5XFwpKVxuIyBjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGF0YSwgXFxub0JvdW5kYXJ5XFwsIFxcb3V0c2lkZUJvdW5kYXJ5XFwpKVxuIyBjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGF0YSwgXFxvdXRzaWRlQm91bmRhcnlcXCwgXFx3aXRoaW5Cb3VuZGFyeVxcKSlcbiMgXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBhbHBoYSA9IC40LCAsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcZ3JleTUwXFwsIFxcIzVFQzk2MlxcLCBcXCM1RUM5NjJcXCkpICtcblxuICB0aGVtZShcbiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK2xhYnMoeSA9IFxcbG9nMihmYyBvZiBvYnMvZXhwKVxcKSAgKyAgICBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCxcbiAgICAgICAgICAgICBhbHBoYSA9IDEsXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICsgXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMiwgMikpXG4gICAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxpbnN1bGF0aW9uQm91bmRhcnlfb2JzZXhwXFwpXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpICBcblxuXG5cblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG5nZW5lLndpdGhpbkJvdW5kYXJ5IDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcd2l0aGluQm91bmRhcnlcXCkpJGdlbmUpXG5nZW5lLm91dHNpZGVCb3VuZGFyeSA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXG91dHNpZGVCb3VuZGFyeVxcKSkkZ2VuZSlcbmdlbmUubm9Cb3VuZGFyeSA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXG5vQm91bmRhcnlcXCkpJGdlbmUpXG5cbmdlbmUud0JvdW5kYXJ5IDwtIHVuaXF1ZShjKGdlbmUud2l0aGluQm91bmRhcnksIGdlbmUub3V0c2lkZUJvdW5kYXJ5KSlcblxuZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cbnByaW50KFxccGVyYyBvZiBnZW5lIHdpdGggbG9vcCB3aXRoaW4gQm91bmRhcnlcXClcbnN1bShnZW5lLmdyb3VwMSAlaW4lIGdlbmUud2l0aGluQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwXG5zdW0oZ2VuZS5ncm91cDIgJWluJSBnZW5lLndpdGhpbkJvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDIpKjEwMFxuXG5wcmludChcXHBlcmMgb2YgZ2VuZSB3aXRoIGxvb3Agb3V0c2lkZSBCb3VuZGFyeVxcKVxuc3VtKGdlbmUuZ3JvdXAxICVpbiUgZ2VuZS5vdXRzaWRlQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwXG5zdW0oZ2VuZS5ncm91cDIgJWluJSBnZW5lLm91dHNpZGVCb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDBcblxucHJpbnQoXFxwZXJjIG9mIGdlbmUgd2l0aCBsb29wIHdpdGggbm8gQm91bmRhcnlcXClcbnN1bShnZW5lLmdyb3VwMSAlaW4lIGdlbmUubm9Cb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAxKSoxMDBcbnN1bShnZW5lLmdyb3VwMiAlaW4lIGdlbmUubm9Cb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDBcblxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKFxuICAgIGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmUud0JvdW5kYXJ5IH4gXFx3aXRoaW5Cb3VuZGFyeVxcLFxuICAgIGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmUubm9Cb3VuZGFyeSB+IFxcbm9Cb3VuZGFyeVxcLFxuICAgIFRSVUUgfiBOQVxuICApKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKSAlPiVcbiAgZHBseXI6Om11dGF0ZShhYnNMb2cyRkMgPSBhYnMobG9nMkZvbGRDaGFuZ2UpKVxuXG5cbmdncGxvdChkaWZmLlJOQSwgYWVzKHggPSBncm91cCwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGFic0xvZzJGQ1xuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkYWJzTG9nMkZDXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRpZmYuUk5BLCBcXHdpdGhpbkJvdW5kYXJ5XFwsIFxcbm9Cb3VuZGFyeVxcKSlcblxuXG4jIENyZWF0ZSB0aGUgQ0RGIHBsb3RcbnAgPC0gZ2dwbG90KGRpZmYuUk5BLCBhZXMoeCA9IGFic0xvZzJGQywgY29sb3IgPSBncm91cCkpICtcbnN0YXRfZWNkZihzaXplID0gMC40ICkgKyAjIFVzZSBzdGF0X2VjZGYgdG8gcGxvdCB0aGUgZW1waXJpY2FsIENERlxuICBsYWJzKFxuICAgIHggPSBcXEFic29sdXRlIGxvZzIoZm9sZCBjaGFuZ2UpXFwsXG4gICAgeSA9IFxcQ3VtdWxhdGl2ZSBQcm9iYWJpbGl0eVxcXG4gICkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMC41KSkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyAjIENsZWFuIHRoZW1lXG4gIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgIClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2NkZl9pbnN1bGF0aW9uQm91bmRhcnlcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgyLjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbiMjIyBDaGVja2luZyBjaGFyYWN0ZXJzdGljcyBvZiBhbmNob3JzXG50ZW1wMSA8LSBhbmNob3IuZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXG5vQm91bmRhcnlcXCkgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKVxuYW5jaG9yLm5vQm91bmRhcnkgPC0gZXh0cmFjdEFuY2hvcih0ZW1wMSlcblxudGVtcDIgPC0gYW5jaG9yLmRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFx3aXRoaW5Cb3VuZGFyeVxcKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApXG5hbmNob3Iud2l0aGluQm91bmRhcnkgPC0gZXh0cmFjdEFuY2hvcih0ZW1wMilcblxudGVtcDMgPC0gYW5jaG9yLmRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxvdXRzaWRlQm91bmRhcnlcXCkgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKVxuYW5jaG9yLm91dHNpZGVCb3VuZGFyeSA8LSBleHRyYWN0QW5jaG9yKHRlbXAzKVxuXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIobG9vcCA9PWdyb3VwMSkgKSRzdW1TY29yZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIobG9vcCA9PWdyb3VwMikgKSRzdW1TY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuZ2V0U3VtU2NvcmVzIDwtIGZ1bmN0aW9uKHRyYWNrLCBhbmNob3IpIHtcbiAgIyBGaW5kIG92ZXJsYXBzIGJldHdlZW4gYWxsIGFuY2hvcnMgYW5kIHRyYWNrIHJlZ2lvbnMgYXQgb25jZVxuICBvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLCB0cmFjaylcbiAgXG4gICMgRXh0cmFjdCB0aGUgc2NvcmVzIGFuZCBjb3JyZXNwb25kaW5nIGFuY2hvciBpbmRpY2VzXG4gIGFuY2hvcl9pbmRpY2VzIDwtIHF1ZXJ5SGl0cyhvdmVybGFwcylcbiAgdHJhY2tfc2NvcmVzIDwtIHNjb3JlKHRyYWNrKVtzdWJqZWN0SGl0cyhvdmVybGFwcyldXG4gIFxuICAjIFVzZSB0YXBwbHkgdG8gY2FsY3VsYXRlIHRoZSBtZWRpYW4gc2NvcmVzIGZvciBlYWNoIGFuY2hvclxuICBtZWRpYW5fc2NvcmVzIDwtIHRhcHBseSh0cmFja19zY29yZXMsIGFuY2hvcl9pbmRpY2VzLCBtZWFuLCBuYS5ybSA9IFRSVUUpXG4gIFxuICAjIEluaXRpYWxpemUgYSBudW1lcmljIHZlY3RvciB0byBzdG9yZSB0aGUgbWVkaWFuIHNjb3JlcyBmb3IgZWFjaCBhbmNob3JcbiAgYWxsX21lZGlhbl9zY29yZXMgPC0gcmVwKE5BLCBsZW5ndGgoYW5jaG9yKSlcbiAgXG4gICMgUG9wdWxhdGUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIHRoZSBhbmNob3JzIHRoYXQgaGF2ZSBvdmVybGFwc1xuICBhbGxfbWVkaWFuX3Njb3Jlc1thcy5udW1lcmljKG5hbWVzKG1lZGlhbl9zY29yZXMpKV0gPC0gbWVkaWFuX3Njb3Jlc1xuICBcbiAgcmV0dXJuKGFsbF9tZWRpYW5fc2NvcmVzKVxufVxuXG5wbG90U3VtU2NvcmVzQmluYXJ5IDwtIGZ1bmN0aW9uKHRyYWNrLCBwZWFrLCBuYW1lLCBhbmNob3IxLCBhbmNob3IyLCBhbmNob3IzKXtcbiAgcGVha1RyYWNrIDwtIHRyYWNrW3VuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKHRyYWNrLCBwZWFrKSkpXVxuICBhIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvcjEpXG4gIGIgPC0gZ2V0U3VtU2NvcmVzKHBlYWtUcmFjaywgYW5jaG9yMilcbiAgYyA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IzKVxuICBhLnRiIDwtIHRpYmJsZShsb29wID0gXFxub0JvdW5kYXJ5XFwsXG4gICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYSlcbiAgYi50YiA8LSB0aWJibGUobG9vcCA9IFxcd2l0aEJvdW5kYXJ5XFwsXG4gICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYilcbiAgYy50YiA8LSB0aWJibGUobG9vcCA9IFxcb3V0c2lkZUJvdW5kYXJ5XFwsXG4gICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYylcbiAgXG4gIGRhdGEgPC0gYmluZF9yb3dzKGEudGIsIGIudGIsIGMudGIpICU+JSBkcm9wX25hKClcbiAgZGF0YSRsb29wIDwtIGZhY3RvcihkYXRhJGxvb3AsIGxldmVscyA9IGMoXFxub0JvdW5kYXJ5XFwsIFxcd2l0aEJvdW5kYXJ5XFwsIFxcb3V0c2lkZUJvdW5kYXJ5XFwpKVxuICBcbiAgcDEyIDwtIGdldFB2YWxXaWxjb3goZGF0YSwgXFxub0JvdW5kYXJ5XFwsIFxcd2l0aEJvdW5kYXJ5XFwpXG4gIHAxMyA8LSBnZXRQdmFsV2lsY294KGRhdGEsIFxcbm9Cb3VuZGFyeVxcLCBcXG91dHNpZGVCb3VuZGFyeVxcKVxuICBwMjMgPC0gZ2V0UHZhbFdpbGNveChkYXRhLCBcXHdpdGhCb3VuZGFyeVxcLCBcXG91dHNpZGVCb3VuZGFyeVxcKVxuICBwIDwtICBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBsb29wLCB5ID0gc3VtU2NvcmUpKSArIFxuICAgIGxhYnMoeCA9IE5VTEwsIHkgPSBwYXN0ZTAobmFtZSwgXFxcXG5sb2coYXZnIHBlYWsgc2NvcmUgcGVyIGFuY2hvcilcXCkpICtcbiAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGxvb3ApLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgICBvdXRsaWVyLnNpemUgPSAxLCBvdXRsaWVyLnN0cm9rZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgc3RhdF9zdW1tYXJ5KFxuICAgICAgYWVzKGdyb3VwID0gbG9vcCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICAgIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXFxuICAgICkgKyB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICAgKSxcbiAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKSArIFxuICAgICNjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMocXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC4wKSwgcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC45OSkpKSArIFxuICAgIGFubm90YXRlKFxuICAgICAgXFx0ZXh0XFwsIHggPSAxLCB5ID0gcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC41KSxcbiAgICAgIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgXFxwMTM6IFxcLCBjb252UHZhbHVlKHAxMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICBcXHAyMzogXFwsIGNvbnZQdmFsdWUocDIzKSksXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gM1xuICAgICkgXG4gICMrIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9IFxcbG9nMTBcXClcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXENoSVBfcGVha19hdmdQZWFrU2NvcmVfYm91bmRhcnlBbmNob3JfXFwsIG5hbWUpXG4gIHdpZHRoIDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuICBoZWlnaHQgPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5cbiMgU3VtIHBlYWsgc2NvcmVcbiMjIyNcbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFwzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG5wbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCBcXEgzSzRtZTNcXCwgYW5jaG9yLm5vQm91bmRhcnksIGFuY2hvci53aXRoaW5Cb3VuZGFyeSwgYW5jaG9yLm91dHNpZGVCb3VuZGFyeSlcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWRcXCkpXG4jcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxIM0syN2FjXFwpXG5wbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCBcXEgzSzI3YWNcXCwgYW5jaG9yLm5vQm91bmRhcnksIGFuY2hvci53aXRoaW5Cb3VuZGFyeSwgYW5jaG9yLm91dHNpZGVCb3VuZGFyeSlcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXEdTTTI2ODM0NDBfSjFfSDNLMTRhY19tbTEwTGlmdGVkLmJsYWNrLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTI2ODM0NDBfSjFfSDNLMTRhY19tbTEwTGlmdGVkLmJlZFxcKSlcbiNwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXEgzSzE0YWNcXClcbnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssIFxcSDNLMTRhY1xcLCBhbmNob3Iubm9Cb3VuZGFyeSwgYW5jaG9yLndpdGhpbkJvdW5kYXJ5LCBhbmNob3Iub3V0c2lkZUJvdW5kYXJ5KVxuXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxuI3Bsb3RTdW1TY29yZXModHJhY2ssIHBlYWssIFxcQ1RDRlxcKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxDVENGXFwsIGFuY2hvci5ub0JvdW5kYXJ5LCBhbmNob3Iud2l0aGluQm91bmRhcnksIGFuY2hvci5vdXRzaWRlQm91bmRhcnkpXG5cbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG4jcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxSQUQyMVxcKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxSQUQyMVxcLCBhbmNob3Iubm9Cb3VuZGFyeSwgYW5jaG9yLndpdGhpbkJvdW5kYXJ5LCBhbmNob3Iub3V0c2lkZUJvdW5kYXJ5KVxuXG5cblxuIyMjIyMjIyMgTE9MQVxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCkpXG5hbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKVxuYW5jaG9yLmFsbCA8LSBwaW50ZXJzZWN0KGFuY2hvci5hbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ub0JvdW5kYXJ5LCBhdGFjLmdyKVxuYW5jaG9yLm5vQm91bmRhcnkgPC0gcGludGVyc2VjdChhbmNob3Iubm9Cb3VuZGFyeVtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci53aXRoaW5Cb3VuZGFyeSwgYXRhYy5ncilcbmFuY2hvci53aXRoaW5Cb3VuZGFyeSA8LSBwaW50ZXJzZWN0KGFuY2hvci53aXRoaW5Cb3VuZGFyeVtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5vdXRzaWRlQm91bmRhcnksIGF0YWMuZ3IpXG5hbmNob3Iub3V0c2lkZUJvdW5kYXJ5IDwtIHBpbnRlcnNlY3QoYW5jaG9yLm91dHNpZGVCb3VuZGFyeVtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cblxuYW5jaG9ycyA8LSBsaXN0KGFuY2hvci5ub0JvdW5kYXJ5LCBhbmNob3Iud2l0aEJvdW5kYXJ5LCBhbmNob3Iub3V0c2lkZUJvdW5kYXJ5KVxudGJzIDwtIGxpc3QoKVxudGVtcHMgPC0gbGlzdCgpXG5cbmFscGhhIDwtIDAuMDVcblxuIyBQcm9jZXNzIGNsdXN0ZXJzIGMxIHRvIGM4XG5mb3IgKGkgaW4gMTozKSB7XG4gIFxuICBhbmNob3IgPC0gYW5jaG9yc1tbaV1dXG4gICMgUnVuIExPTEFcbiAgcmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLCBhbmNob3IuYWxsLCBsb2xhREIpXG4gIHRiIDwtIGFzX3RpYmJsZShyZXN1bHQpXG4gIFxuICAjIEZpbHRlciBhbmQgc3VtbWFyaXplXG4gIHRiIDwtIHRiICU+JVxuICAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiVcbiAgICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG4gIFxuICAjIFN0b3JlIHRiXG4gIHRic1tbaV1dIDwtIHRiXG4gIFxuICAjIFNlbGVjdCBhbmQgcmVuYW1lIG9kZHNSYXRpb1xuICB0ZW1wIDwtIHRiICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuICBjb2xuYW1lcyh0ZW1wKSA8LSBjKFxcdGFyZ2V0XFwsIHBhc3RlMChcXE9SX2NcXCwgaSkpXG4gIFxuICAjIFN0b3JlIHRlbXBcbiAgdGVtcHNbW2ldXSA8LSB0ZW1wXG59XG5cbiMgTWVyZ2UgYWxsIHRlbXAgdGFibGVzIGludG8gb25lXG50ZW1wIDwtIFJlZHVjZShmdW5jdGlvbih4LCB5KSBmdWxsX2pvaW4oeCwgeSwgYnkgPSBcXHRhcmdldFxcKSwgdGVtcHMpICU+JVxuICBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXHRhcmdldFxcLCBcXG5vQm91bmRhcnlcXCwgXFx3aXRoaW5Cb3VuZGFyeVxcLCBcXG91dHNpZGVCb3VuZGFyeVxcKVxuZGF0YSA8LSB0ZW1wICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoXFx0YXJnZXRcXCkgJT4lIGFzLm1hdHJpeCgpXG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygxLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1bixcbiAgYm9yZGVyID0gVFJVRVxuKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNiwgNywgMTEsIDEyLCAyNCwgMjksIDMxKSkgJT4lIHVubmVzdChnZW5lKVxuXG5cbmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChWNiwgVFNTKVxuY29sbmFtZXMoZ2VuZS5UU1MudGIpIDwtIGMoXFxlbnNlbWJsXFwsIFxcVFNTXFwpXG5cblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihnZW5lLlRTUy50YiwgYnkgPSBjKFxcZ2VuZVxcID0gXFxlbnNlbWJsXFwpKVxuXG5nZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZTEgPSAoc3RhcnQxICsgZW5kMSkvMiAtIFRTUyxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTIgPSAoc3RhcnQyICsgZW5kMikvMiAtIFRTUyxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IGlmX2Vsc2UoYWJzKGRpc3RhbmNlMSkgPiBhYnMoZGlzdGFuY2UyKSwgZGlzdGFuY2UxLCBkaXN0YW5jZTIpKVxuXG5yZXN1bHQgPC0gZ2VuZUFubm9EYXRhICU+JVxuICBmaWx0ZXIoQW5ubzIgPT0gXFxQLVNcXCkgJT4lXG4gIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpc2UoXG4gICAgZmFyUmlnaHQgPSBpZiAoYW55KGRpc3RhbmNlID4gMCkpIG1heChkaXN0YW5jZVtkaXN0YW5jZSA+IDBdKSBlbHNlIDAsICAjIFJldHVybiAwIGlmIG5vIHBvc2l0aXZlIGRpc3RhbmNlXG4gICAgZmFyTGVmdCA9IGlmIChhbnkoZGlzdGFuY2UgPCAwKSkgbWluKGRpc3RhbmNlW2Rpc3RhbmNlIDwgMF0pIGVsc2UgMCAgIyBSZXR1cm4gMCBpZiBubyBuZWdhdGl2ZSBkaXN0YW5jZVxuICApICU+JVxuICB1bmdyb3VwKClcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgbGVmdF9qb2luKHJlc3VsdCwgYnkgPSBjKFxcZ2VuZVxcKSlcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGlzLm5hKGZhclJpZ2h0KSB+IFxcTm9cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlzdGFuY2UgPiBmYXJMZWZ0KSAmIChkaXN0YW5jZSA8IGZhclJpZ2h0KSB+IFxcV2l0aGluXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFxcT3V0c2lkZVxcKSxcbiAgICAgICAgICAgICAgICBzaXplID0gc3RhcnQyIC0gc3RhcnQxKVxuXG5kYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgaWQsIHNpemUpICU+JSBkaXN0aW5jdCgpXG5hbmNob3IuZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBncm91cCkgJT4lIGRpc3RpbmN0KClcblxudGVtcDEgPC0gYW5jaG9yLmRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxOb1xcKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApXG5md3JpdGUodGVtcDEsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGluc3VsYXRlZF9kb21haW5fcHNfbm8uYmVkcGVcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxudGVtcDIgPC0gYW5jaG9yLmRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxXaXRoaW5cXCkgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKVxuZndyaXRlKHRlbXAyLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxpbnN1bGF0ZWRfZG9tYWluX3BzX3dpdGhpbi5iZWRwZVxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG50ZW1wMyA8LSBhbmNob3IuZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXE91dHNpZGVcXCkgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKVxuZndyaXRlKHRlbXAzLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxpbnN1bGF0ZWRfZG9tYWluX3BzX291dHNpZGUuYmVkcGVcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkc2l6ZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkc2l6ZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuIyBjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGF0YSwgXFxub0JvdW5kYXJ5XFwsIFxcd2l0aGluQm91bmRhcnlcXCkpXG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXG5vQm91bmRhcnlcXCwgXFxvdXRzaWRlQm91bmRhcnlcXCkpXG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXG91dHNpZGVCb3VuZGFyeVxcLCBcXHdpdGhpbkJvdW5kYXJ5XFwpKVxuXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzaXplLCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBhbHBoYSA9IC40LCAsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKVxuICAgICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcZ3JleTUwXFwsIFxcIzVFQzk2MlxcLCBcXCM1RUM5NjJcXCkpICtcblxuICB0aGVtZShcbiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK2xhYnMoeSA9IFxcTG9vcCBzaXplXFwpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25Cb3VuZGFyeV9zaXplXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG4gIFxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGRpZmZfZFRBR19ETVNPXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRkaWZmX2RUQUdfRE1TT1xuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGlkLCBkaWZmX2RUQUdfRE1TTykgJT4lIGRpc3RpbmN0KClcblxuIyBjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGF0YSwgXFxub0JvdW5kYXJ5XFwsIFxcd2l0aGluQm91bmRhcnlcXCkpXG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXG5vQm91bmRhcnlcXCwgXFxvdXRzaWRlQm91bmRhcnlcXCkpXG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXG91dHNpZGVCb3VuZGFyeVxcLCBcXHdpdGhpbkJvdW5kYXJ5XFwpKVxuXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlmZl9kVEFHX0RNU08sIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFxncmV5NTBcXCwgXFwjNUVDOTYyXFwsIFxcIzVFQzk2MlxcKSkgK1xuXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSxcbiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSwgICAgXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArbGFicyh5ID0gXFzOlCBsb29wIHNjb3JlXFwpICArICAgIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgKyBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTAuMixcbiAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuOCwgMC41KSlcbiAgICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25Cb3VuZGFyeV9kZWx0YVxcKVxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKSAgXG4gIFxuICBcbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFxuICAgIFxuICAgIG1pblZhbHVlIDwtIC00XG4gIG9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTylcblxuZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgbGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpXG5cbmRhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBpZCwgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTykgJT4lIGRpc3RpbmN0KClcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU09cbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU09cbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbiMgY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsIFxcbm9Cb3VuZGFyeVxcLCBcXHdpdGhpbkJvdW5kYXJ5XFwpKVxuIyBjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGF0YSwgXFxub0JvdW5kYXJ5XFwsIFxcb3V0c2lkZUJvdW5kYXJ5XFwpKVxuIyBjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGF0YSwgXFxvdXRzaWRlQm91bmRhcnlcXCwgXFx3aXRoaW5Cb3VuZGFyeVxcKSlcbiMgXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBhbHBoYSA9IC40LCAsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcZ3JleTUwXFwsIFxcIzVFQzk2MlxcLCBcXCM1RUM5NjJcXCkpICtcblxuICB0aGVtZShcbiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK2xhYnMoeSA9IFxcbG9nMihmYyBvZiBvYnMvZXhwKVxcKSAgKyAgICBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCxcbiAgICAgICAgICAgICBhbHBoYSA9IDEsXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICsgXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMiwgMikpXG4gICAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxpbnN1bGF0aW9uQm91bmRhcnlfb2JzZXhwXFwpXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpICBcblxuXG5cblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG5nZW5lLndpdGhpbkJvdW5kYXJ5IDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcd2l0aGluQm91bmRhcnlcXCkpJGdlbmUpXG5nZW5lLm91dHNpZGVCb3VuZGFyeSA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXG91dHNpZGVCb3VuZGFyeVxcKSkkZ2VuZSlcbmdlbmUubm9Cb3VuZGFyeSA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXG5vQm91bmRhcnlcXCkpJGdlbmUpXG5cbmdlbmUud0JvdW5kYXJ5IDwtIHVuaXF1ZShjKGdlbmUud2l0aGluQm91bmRhcnksIGdlbmUub3V0c2lkZUJvdW5kYXJ5KSlcblxuZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cbnByaW50KFxccGVyYyBvZiBnZW5lIHdpdGggbG9vcCB3aXRoaW4gQm91bmRhcnlcXClcbnN1bShnZW5lLmdyb3VwMSAlaW4lIGdlbmUud2l0aGluQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwXG5zdW0oZ2VuZS5ncm91cDIgJWluJSBnZW5lLndpdGhpbkJvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDIpKjEwMFxuXG5wcmludChcXHBlcmMgb2YgZ2VuZSB3aXRoIGxvb3Agb3V0c2lkZSBCb3VuZGFyeVxcKVxuc3VtKGdlbmUuZ3JvdXAxICVpbiUgZ2VuZS5vdXRzaWRlQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwXG5zdW0oZ2VuZS5ncm91cDIgJWluJSBnZW5lLm91dHNpZGVCb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDBcblxucHJpbnQoXFxwZXJjIG9mIGdlbmUgd2l0aCBsb29wIHdpdGggbm8gQm91bmRhcnlcXClcbnN1bShnZW5lLmdyb3VwMSAlaW4lIGdlbmUubm9Cb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAxKSoxMDBcbnN1bShnZW5lLmdyb3VwMiAlaW4lIGdlbmUubm9Cb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDBcblxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKFxuICAgIGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmUud0JvdW5kYXJ5IH4gXFx3aXRoaW5Cb3VuZGFyeVxcLFxuICAgIGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmUubm9Cb3VuZGFyeSB+IFxcbm9Cb3VuZGFyeVxcLFxuICAgIFRSVUUgfiBOQVxuICApKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKSAlPiVcbiAgZHBseXI6Om11dGF0ZShhYnNMb2cyRkMgPSBhYnMobG9nMkZvbGRDaGFuZ2UpKVxuXG5cbmdncGxvdChkaWZmLlJOQSwgYWVzKHggPSBncm91cCwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGFic0xvZzJGQ1xuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkYWJzTG9nMkZDXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRpZmYuUk5BLCBcXHdpdGhpbkJvdW5kYXJ5XFwsIFxcbm9Cb3VuZGFyeVxcKSlcblxuXG4jIENyZWF0ZSB0aGUgQ0RGIHBsb3RcbnAgPC0gZ2dwbG90KGRpZmYuUk5BLCBhZXMoeCA9IGFic0xvZzJGQywgY29sb3IgPSBncm91cCkpICtcbnN0YXRfZWNkZihzaXplID0gMC40ICkgKyAjIFVzZSBzdGF0X2VjZGYgdG8gcGxvdCB0aGUgZW1waXJpY2FsIENERlxuICBsYWJzKFxuICAgIHggPSBcXEFic29sdXRlIGxvZzIoZm9sZCBjaGFuZ2UpXFwsXG4gICAgeSA9IFxcQ3VtdWxhdGl2ZSBQcm9iYWJpbGl0eVxcXG4gICkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMC41KSkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyAjIENsZWFuIHRoZW1lXG4gIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgIClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2NkZl9pbnN1bGF0aW9uQm91bmRhcnlcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgyLjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuXG5cbiMjIyBDaGVja2luZyBjaGFyYWN0ZXJzdGljcyBvZiBhbmNob3JzXG50ZW1wMSA8LSBhbmNob3IuZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXG5vQm91bmRhcnlcXCkgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKVxuYW5jaG9yLm5vQm91bmRhcnkgPC0gZXh0cmFjdEFuY2hvcih0ZW1wMSlcblxudGVtcDIgPC0gYW5jaG9yLmRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFx3aXRoaW5Cb3VuZGFyeVxcKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApXG5hbmNob3Iud2l0aGluQm91bmRhcnkgPC0gZXh0cmFjdEFuY2hvcih0ZW1wMilcblxudGVtcDMgPC0gYW5jaG9yLmRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxvdXRzaWRlQm91bmRhcnlcXCkgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKVxuYW5jaG9yLm91dHNpZGVCb3VuZGFyeSA8LSBleHRyYWN0QW5jaG9yKHRlbXAzKVxuXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIobG9vcCA9PWdyb3VwMSkgKSRzdW1TY29yZVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIobG9vcCA9PWdyb3VwMikgKSRzdW1TY29yZVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxuZ2V0U3VtU2NvcmVzIDwtIGZ1bmN0aW9uKHRyYWNrLCBhbmNob3IpIHtcbiAgIyBGaW5kIG92ZXJsYXBzIGJldHdlZW4gYWxsIGFuY2hvcnMgYW5kIHRyYWNrIHJlZ2lvbnMgYXQgb25jZVxuICBvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLCB0cmFjaylcbiAgXG4gICMgRXh0cmFjdCB0aGUgc2NvcmVzIGFuZCBjb3JyZXNwb25kaW5nIGFuY2hvciBpbmRpY2VzXG4gIGFuY2hvcl9pbmRpY2VzIDwtIHF1ZXJ5SGl0cyhvdmVybGFwcylcbiAgdHJhY2tfc2NvcmVzIDwtIHNjb3JlKHRyYWNrKVtzdWJqZWN0SGl0cyhvdmVybGFwcyldXG4gIFxuICAjIFVzZSB0YXBwbHkgdG8gY2FsY3VsYXRlIHRoZSBtZWRpYW4gc2NvcmVzIGZvciBlYWNoIGFuY2hvclxuICBtZWRpYW5fc2NvcmVzIDwtIHRhcHBseSh0cmFja19zY29yZXMsIGFuY2hvcl9pbmRpY2VzLCBtZWFuLCBuYS5ybSA9IFRSVUUpXG4gIFxuICAjIEluaXRpYWxpemUgYSBudW1lcmljIHZlY3RvciB0byBzdG9yZSB0aGUgbWVkaWFuIHNjb3JlcyBmb3IgZWFjaCBhbmNob3JcbiAgYWxsX21lZGlhbl9zY29yZXMgPC0gcmVwKE5BLCBsZW5ndGgoYW5jaG9yKSlcbiAgXG4gICMgUG9wdWxhdGUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIHRoZSBhbmNob3JzIHRoYXQgaGF2ZSBvdmVybGFwc1xuICBhbGxfbWVkaWFuX3Njb3Jlc1thcy5udW1lcmljKG5hbWVzKG1lZGlhbl9zY29yZXMpKV0gPC0gbWVkaWFuX3Njb3Jlc1xuICBcbiAgcmV0dXJuKGFsbF9tZWRpYW5fc2NvcmVzKVxufVxuXG5wbG90U3VtU2NvcmVzQmluYXJ5IDwtIGZ1bmN0aW9uKHRyYWNrLCBwZWFrLCBuYW1lLCBhbmNob3IxLCBhbmNob3IyLCBhbmNob3IzKXtcbiAgcGVha1RyYWNrIDwtIHRyYWNrW3VuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKHRyYWNrLCBwZWFrKSkpXVxuICBhIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvcjEpXG4gIGIgPC0gZ2V0U3VtU2NvcmVzKHBlYWtUcmFjaywgYW5jaG9yMilcbiAgYyA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IzKVxuICBhLnRiIDwtIHRpYmJsZShsb29wID0gXFxub0JvdW5kYXJ5XFwsXG4gICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYSlcbiAgYi50YiA8LSB0aWJibGUobG9vcCA9IFxcd2l0aEJvdW5kYXJ5XFwsXG4gICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYilcbiAgYy50YiA8LSB0aWJibGUobG9vcCA9IFxcb3V0c2lkZUJvdW5kYXJ5XFwsXG4gICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYylcbiAgXG4gIGRhdGEgPC0gYmluZF9yb3dzKGEudGIsIGIudGIsIGMudGIpICU+JSBkcm9wX25hKClcbiAgZGF0YSRsb29wIDwtIGZhY3RvcihkYXRhJGxvb3AsIGxldmVscyA9IGMoXFxub0JvdW5kYXJ5XFwsIFxcd2l0aEJvdW5kYXJ5XFwsIFxcb3V0c2lkZUJvdW5kYXJ5XFwpKVxuICBcbiAgcDEyIDwtIGdldFB2YWxXaWxjb3goZGF0YSwgXFxub0JvdW5kYXJ5XFwsIFxcd2l0aEJvdW5kYXJ5XFwpXG4gIHAxMyA8LSBnZXRQdmFsV2lsY294KGRhdGEsIFxcbm9Cb3VuZGFyeVxcLCBcXG91dHNpZGVCb3VuZGFyeVxcKVxuICBwMjMgPC0gZ2V0UHZhbFdpbGNveChkYXRhLCBcXHdpdGhCb3VuZGFyeVxcLCBcXG91dHNpZGVCb3VuZGFyeVxcKVxuICBwIDwtICBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBsb29wLCB5ID0gc3VtU2NvcmUpKSArIFxuICAgIGxhYnMoeCA9IE5VTEwsIHkgPSBwYXN0ZTAobmFtZSwgXFxcXG5sb2coYXZnIHBlYWsgc2NvcmUgcGVyIGFuY2hvcilcXCkpICtcbiAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGxvb3ApLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICtcbiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgICBvdXRsaWVyLnNpemUgPSAxLCBvdXRsaWVyLnN0cm9rZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArXG4gICAgc3RhdF9zdW1tYXJ5KFxuICAgICAgYWVzKGdyb3VwID0gbG9vcCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMSxcbiAgICAgIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXFxuICAgICkgKyB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICAgKSxcbiAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKSArIFxuICAgICNjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMocXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC4wKSwgcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC45OSkpKSArIFxuICAgIGFubm90YXRlKFxuICAgICAgXFx0ZXh0XFwsIHggPSAxLCB5ID0gcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC41KSxcbiAgICAgIGxhYmVsID0gcGFzdGUwKFxccDEyOiBcXCwgY29udlB2YWx1ZShwMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgXFxwMTM6IFxcLCBjb252UHZhbHVlKHAxMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICBcXHAyMzogXFwsIGNvbnZQdmFsdWUocDIzKSksXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gM1xuICAgICkgXG4gICMrIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9IFxcbG9nMTBcXClcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXENoSVBfcGVha19hdmdQZWFrU2NvcmVfYm91bmRhcnlBbmNob3JfXFwsIG5hbWUpXG4gIHdpZHRoIDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuICBoZWlnaHQgPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5cbiMgU3VtIHBlYWsgc2NvcmVcbiMjIyNcbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFwzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG5wbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCBcXEgzSzRtZTNcXCwgYW5jaG9yLm5vQm91bmRhcnksIGFuY2hvci53aXRoaW5Cb3VuZGFyeSwgYW5jaG9yLm91dHNpZGVCb3VuZGFyeSlcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXEdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFxHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWRcXCkpXG4jcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxIM0syN2FjXFwpXG5wbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCBcXEgzSzI3YWNcXCwgYW5jaG9yLm5vQm91bmRhcnksIGFuY2hvci53aXRoaW5Cb3VuZGFyeSwgYW5jaG9yLm91dHNpZGVCb3VuZGFyeSlcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXEdTTTI2ODM0NDBfSjFfSDNLMTRhY19tbTEwTGlmdGVkLmJsYWNrLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXEdTTTI2ODM0NDBfSjFfSDNLMTRhY19tbTEwTGlmdGVkLmJlZFxcKSlcbiNwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCBcXEgzSzE0YWNcXClcbnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssIFxcSDNLMTRhY1xcLCBhbmNob3Iubm9Cb3VuZGFyeSwgYW5jaG9yLndpdGhpbkJvdW5kYXJ5LCBhbmNob3Iub3V0c2lkZUJvdW5kYXJ5KVxuXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxuI3Bsb3RTdW1TY29yZXModHJhY2ssIHBlYWssIFxcQ1RDRlxcKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxDVENGXFwsIGFuY2hvci5ub0JvdW5kYXJ5LCBhbmNob3Iud2l0aGluQm91bmRhcnksIGFuY2hvci5vdXRzaWRlQm91bmRhcnkpXG5cbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG4jcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgXFxSQUQyMVxcKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxSQUQyMVxcLCBhbmNob3Iubm9Cb3VuZGFyeSwgYW5jaG9yLndpdGhpbkJvdW5kYXJ5LCBhbmNob3Iub3V0c2lkZUJvdW5kYXJ5KVxuXG5cblxuIyMjIyMjIyMgTE9MQVxuYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkXFwpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKVxuY29sbmFtZXMoYXRhYykgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5hdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKVxuXG4jIExPQURJTkcgTE9PUFNcbmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxFLUVcXCkpXG5hbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSlcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKVxuYW5jaG9yLmFsbCA8LSBwaW50ZXJzZWN0KGFuY2hvci5hbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ub0JvdW5kYXJ5LCBhdGFjLmdyKVxuYW5jaG9yLm5vQm91bmRhcnkgPC0gcGludGVyc2VjdChhbmNob3Iubm9Cb3VuZGFyeVtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci53aXRoaW5Cb3VuZGFyeSwgYXRhYy5ncilcbmFuY2hvci53aXRoaW5Cb3VuZGFyeSA8LSBwaW50ZXJzZWN0KGFuY2hvci53aXRoaW5Cb3VuZGFyeVtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5vdXRzaWRlQm91bmRhcnksIGF0YWMuZ3IpXG5hbmNob3Iub3V0c2lkZUJvdW5kYXJ5IDwtIHBpbnRlcnNlY3QoYW5jaG9yLm91dHNpZGVCb3VuZGFyeVtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKVxuXG5cblxuYW5jaG9ycyA8LSBsaXN0KGFuY2hvci5ub0JvdW5kYXJ5LCBhbmNob3Iud2l0aEJvdW5kYXJ5LCBhbmNob3Iub3V0c2lkZUJvdW5kYXJ5KVxudGJzIDwtIGxpc3QoKVxudGVtcHMgPC0gbGlzdCgpXG5cbmFscGhhIDwtIDAuMDVcblxuIyBQcm9jZXNzIGNsdXN0ZXJzIGMxIHRvIGM4XG5mb3IgKGkgaW4gMTozKSB7XG4gIFxuICBhbmNob3IgPC0gYW5jaG9yc1tbaV1dXG4gICMgUnVuIExPTEFcbiAgcmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLCBhbmNob3IuYWxsLCBsb2xhREIpXG4gIHRiIDwtIGFzX3RpYmJsZShyZXN1bHQpXG4gIFxuICAjIEZpbHRlciBhbmQgc3VtbWFyaXplXG4gIHRiIDwtIHRiICU+JVxuICAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JVxuICAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09IFxcZW1icnlvbmljIHN0ZW0gY2VsbFxcKSAlPiVcbiAgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiVcbiAgICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiVcbiAgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpXG4gIFxuICAjIFN0b3JlIHRiXG4gIHRic1tbaV1dIDwtIHRiXG4gIFxuICAjIFNlbGVjdCBhbmQgcmVuYW1lIG9kZHNSYXRpb1xuICB0ZW1wIDwtIHRiICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKVxuICBjb2xuYW1lcyh0ZW1wKSA8LSBjKFxcdGFyZ2V0XFwsIHBhc3RlMChcXE9SX2NcXCwgaSkpXG4gIFxuICAjIFN0b3JlIHRlbXBcbiAgdGVtcHNbW2ldXSA8LSB0ZW1wXG59XG5cbiMgTWVyZ2UgYWxsIHRlbXAgdGFibGVzIGludG8gb25lXG50ZW1wIDwtIFJlZHVjZShmdW5jdGlvbih4LCB5KSBmdWxsX2pvaW4oeCwgeSwgYnkgPSBcXHRhcmdldFxcKSwgdGVtcHMpICU+JVxuICBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXHRhcmdldFxcLCBcXG5vQm91bmRhcnlcXCwgXFx3aXRoaW5Cb3VuZGFyeVxcLCBcXG91dHNpZGVCb3VuZGFyeVxcKVxuZGF0YSA8LSB0ZW1wICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoXFx0YXJnZXRcXCkgJT4lIGFzLm1hdHJpeCgpXG5cbmxpYnJhcnkoY2lyY2xpemUpXG5jb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygxLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1bixcbiAgYm9yZGVyID0gVFJVRVxuKVxuYGBgXG5gYGAifQ== -->

```r
```r
name <- \chromo_cons_annoHierarchy\
diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\)) %>%
  dplyr::select(c(1, 2, 3, 4, 5, 6, 7, 11, 12, 24, 29, 31)) %>% unnest(gene)


gene.TSS.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3)) %>%
  dplyr::select(V6, TSS)
colnames(gene.TSS.tb) <- c(\ensembl\, \TSS\)


geneAnnoData <- geneAnnoData %>% dplyr::left_join(gene.TSS.tb, by = c(\gene\ = \ensembl\))

geneAnnoData <- geneAnnoData %>% 
  dplyr::mutate(distance1 = (start1 + end1)/2 - TSS,
                distance2 = (start2 + end2)/2 - TSS,
                distance = if_else(abs(distance1) > abs(distance2), distance1, distance2))

result <- geneAnnoData %>%
  filter(Anno2 == \P-S\) %>%
  group_by(gene) %>%
  summarise(
    farRight = if (any(distance > 0)) max(distance[distance > 0]) else 0,  # Return 0 if no positive distance
    farLeft = if (any(distance < 0)) min(distance[distance < 0]) else 0  # Return 0 if no negative distance
  ) %>%
  ungroup()

geneAnnoData <- geneAnnoData %>% left_join(result, by = c(\gene\))

geneAnnoData <- geneAnnoData %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\)) %>%
  dplyr::mutate(group = case_when(is.na(farRight) ~ \No\,
                                  (distance > farLeft) & (distance < farRight) ~ \Within\,
                                  TRUE ~ \Outside\),
                size = start2 - start1)

data <- geneAnnoData %>% dplyr::select(group, id, size) %>% distinct()
anchor.data <- geneAnnoData %>% dplyr::select(chrom1, start1, end1, chrom2, start2, end2, group) %>% distinct()

temp1 <- anchor.data %>% dplyr::filter(group == \No\) %>% dplyr::select(-group)
fwrite(temp1, here(consensusDir, \insulated_domain_ps_no.bedpe\), sep = \\t\, col.names = FALSE)
temp2 <- anchor.data %>% dplyr::filter(group == \Within\) %>% dplyr::select(-group)
fwrite(temp2, here(consensusDir, \insulated_domain_ps_within.bedpe\), sep = \\t\, col.names = FALSE)
temp3 <- anchor.data %>% dplyr::filter(group == \Outside\) %>% dplyr::select(-group)
fwrite(temp3, here(consensusDir, \insulated_domain_ps_outside.bedpe\), sep = \\t\, col.names = FALSE)


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$size
  distance2 <- (data %>% dplyr::filter(group ==group2) )$size
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

# convPvalue(getPvalWilcox(data, \noBoundary\, \withinBoundary\))
# convPvalue(getPvalWilcox(data, \noBoundary\, \outsideBoundary\))
# convPvalue(getPvalWilcox(data, \outsideBoundary\, \withinBoundary\))


p <- ggplot(data, aes(x = group, y = size, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\,
                 outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + scale_y_continuous(labels = label_kb_mb) +
  stat_summary(
      aes(group = group), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
    ) +
  scale_fill_manual(values = c(\grey50\, \#5EC962\, \#5EC962\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \Loop size\)

fileName <- paste0(\insulationBoundary_size\)
width <- panelSize(1.5)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
  
########################
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(group ==group2) )$diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

data <- geneAnnoData %>% dplyr::select(group, id, diff_dTAG_DMSO) %>% distinct()

# convPvalue(getPvalWilcox(data, \noBoundary\, \withinBoundary\))
# convPvalue(getPvalWilcox(data, \noBoundary\, \outsideBoundary\))
# convPvalue(getPvalWilcox(data, \outsideBoundary\, \withinBoundary\))

p <- ggplot(data, aes(x = group, y = diff_dTAG_DMSO, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  scale_fill_manual(values = c(\grey50\, \#5EC962\, \#5EC962\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \Δ loop score\)  +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  geom_hline(yintercept = -0.2,
             alpha = 0.5, 
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\, linetype = \dashed\) +
  coord_cartesian(ylim = c(-0.8, 0.5))
    
fileName <- paste0(\insulationBoundary_delta\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()  
  
  
 ###################### 
    
    minValue <- -4
  obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

geneAnnoData <- geneAnnoData %>% left_join(obsexp, by = c(\id\))

data <- geneAnnoData %>% dplyr::select(group, id, log_obsexp_diff_dTAG_DMSO) %>% distinct()


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$log_obsexp_diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(group ==group2) )$log_obsexp_diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

# convPvalue(getPvalWilcox(data, \noBoundary\, \withinBoundary\))
# convPvalue(getPvalWilcox(data, \noBoundary\, \outsideBoundary\))
# convPvalue(getPvalWilcox(data, \outsideBoundary\, \withinBoundary\))
# 

p <- ggplot(data, aes(x = group, y = log_obsexp_diff_dTAG_DMSO, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  scale_fill_manual(values = c(\grey50\, \#5EC962\, \#5EC962\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \log2(fc of obs/exp)\)  +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  coord_cartesian(ylim = c(-2, 2))
    
fileName <- paste0(\insulationBoundary_obsexp\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()  





#####################


gene.withinBoundary <- unique((geneAnnoData %>% dplyr::filter(group == \withinBoundary\))$gene)
gene.outsideBoundary <- unique((geneAnnoData %>% dplyr::filter(group == \outsideBoundary\))$gene)
gene.noBoundary <- unique((geneAnnoData %>% dplyr::filter(group == \noBoundary\))$gene)

gene.wBoundary <- unique(c(gene.withinBoundary, gene.outsideBoundary))

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

print(\perc of gene with loop within Boundary\)
sum(gene.group1 %in% gene.withinBoundary)/length(gene.group1)*100
sum(gene.group2 %in% gene.withinBoundary)/length(gene.group2)*100

print(\perc of gene with loop outside Boundary\)
sum(gene.group1 %in% gene.outsideBoundary)/length(gene.group1)*100
sum(gene.group2 %in% gene.outsideBoundary)/length(gene.group2)*100

print(\perc of gene with loop with no Boundary\)
sum(gene.group1 %in% gene.noBoundary)/length(gene.group1)*100
sum(gene.group2 %in% gene.noBoundary)/length(gene.group2)*100


diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name) %>%
  dplyr::mutate(group = case_when(
    ensembl_gene_id %in% gene.wBoundary ~ \withinBoundary\,
    ensembl_gene_id %in% gene.noBoundary ~ \noBoundary\,
    TRUE ~ NA
  )) %>%
  dplyr::filter(!is.na(group)) %>%
  dplyr::mutate(absLog2FC = abs(log2FoldChange))


ggplot(diff.RNA, aes(x = group, y = log2FoldChange)) + geom_violin() + geom_boxplot(width = 0.1)

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$absLog2FC
  distance2 <- (data %>% dplyr::filter(group ==group2) )$absLog2FC
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}
convPvalue(getPvalWilcox(diff.RNA, \withinBoundary\, \noBoundary\))


# Create the CDF plot
p <- ggplot(diff.RNA, aes(x = absLog2FC, color = group)) +
stat_ecdf(size = 0.4 ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Absolute log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 0.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )

fileName <- paste0(\log2FC_cdf_insulationBoundary\)
width <- panelSize(2.5)*mmToInch
height <- panelSize(1.5)*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



### Checking characterstics of anchors
temp1 <- anchor.data %>% dplyr::filter(group == \noBoundary\) %>% dplyr::select(-group)
anchor.noBoundary <- extractAnchor(temp1)

temp2 <- anchor.data %>% dplyr::filter(group == \withinBoundary\) %>% dplyr::select(-group)
anchor.withinBoundary <- extractAnchor(temp2)

temp3 <- anchor.data %>% dplyr::filter(group == \outsideBoundary\) %>% dplyr::select(-group)
anchor.outsideBoundary <- extractAnchor(temp3)


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(loop ==group1) )$sumScore
  distance2 <- (data %>% dplyr::filter(loop ==group2) )$sumScore
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

getSumScores <- function(track, anchor) {
  # Find overlaps between all anchors and track regions at once
  overlaps <- findOverlaps(anchor, track)
  
  # Extract the scores and corresponding anchor indices
  anchor_indices <- queryHits(overlaps)
  track_scores <- score(track)[subjectHits(overlaps)]
  
  # Use tapply to calculate the median scores for each anchor
  median_scores <- tapply(track_scores, anchor_indices, mean, na.rm = TRUE)
  
  # Initialize a numeric vector to store the median scores for each anchor
  all_median_scores <- rep(NA, length(anchor))
  
  # Populate the median scores for the anchors that have overlaps
  all_median_scores[as.numeric(names(median_scores))] <- median_scores
  
  return(all_median_scores)
}

plotSumScoresBinary <- function(track, peak, name, anchor1, anchor2, anchor3){
  peakTrack <- track[unique(queryHits(findOverlaps(track, peak)))]
  a <- getSumScores(peakTrack, anchor1)
  b <- getSumScores(peakTrack, anchor2)
  c <- getSumScores(peakTrack, anchor3)
  a.tb <- tibble(loop = \noBoundary\,
                 sumScore = a)
  b.tb <- tibble(loop = \withBoundary\,
                 sumScore = b)
  c.tb <- tibble(loop = \outsideBoundary\,
                 sumScore = c)
  
  data <- bind_rows(a.tb, b.tb, c.tb) %>% drop_na()
  data$loop <- factor(data$loop, levels = c(\noBoundary\, \withBoundary\, \outsideBoundary\))
  
  p12 <- getPvalWilcox(data, \noBoundary\, \withBoundary\)
  p13 <- getPvalWilcox(data, \noBoundary\, \outsideBoundary\)
  p23 <- getPvalWilcox(data, \withBoundary\, \outsideBoundary\)
  p <-  ggplot(data, aes(x = loop, y = sumScore)) + 
    labs(x = NULL, y = paste0(name, \\nlog(avg peak score per anchor)\)) +
    geom_violin(aes(fill = loop), color = \black\,
                linewidth = lineThick * mmToLineUnit, lineend = \square\,
                show.legend = FALSE) +
    geom_boxplot(width = 0.1, color = \black\,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\,
                 outlier.size = 1, outlier.stroke = NA) + theme_classic() +
    stat_summary(
      aes(group = loop), fun = mean,
      geom = \point\, shape = 21, size = 1,
      fill = \red\, color = \black\
    ) + theme(
      axis.title = element_text(
        size = fontSizeS, family = fontType, color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS, family = fontType, color = \#000000\
      ),
      axis.text.x = element_text(
        angle = 45, hjust = 1, vjust = 1
      ),
      axis.line = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
      legend.text = element_text(family = fontType, size = fontSizeS),
      legend.title = element_text(family = fontType, size = fontSizeS)
    ) + 
    #coord_cartesian(ylim = c(quantile(data$sumScore, 0.0), quantile(data$sumScore, 0.99))) + 
    annotate(
      \text\, x = 1, y = quantile(data$sumScore, 0.5),
      label = paste0(\p12: \, convPvalue(p12), \\n\,
                     \p13: \, convPvalue(p13), \\n\,
                     \p23: \, convPvalue(p23)),
      color = \black\, hjust = 0, size = 3
    ) 
  #+ scale_y_continuous(trans = \log10\)
  
  fileName <- paste0(\ChIP_peak_avgPeakScore_boundaryAnchor_\, name)
  width <- panelSize(2)*mmToInch
  height <- panelSize(2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# Sum peak score
####
track <- import(here(refDir, \33255_H3K4me3_04-745_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33255_H3K4me3_04-745_Bruce-4_peaks.mergePeak.bed\))
plotSumScoresBinary(track, peak, \H3K4me3\, anchor.noBoundary, anchor.withinBoundary, anchor.outsideBoundary)

track <- import(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM2438476_EC-DG-3458-H3K27AC_ASYN_1.narrowPeak.bed\))
#plotSumScores(track, peak, \H3K27ac\)
plotSumScoresBinary(track, peak, \H3K27ac\, anchor.noBoundary, anchor.withinBoundary, anchor.outsideBoundary)

track <- import(here(refDir, \GSM2683440_J1_H3K14ac_mm10Lifted.black.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \GSM2683440_J1_H3K14ac_mm10Lifted.bed\))
#plotSumScores(track, peak, \H3K14ac\)
plotSumScoresBinary(track, peak, \H3K14ac\, anchor.noBoundary, anchor.withinBoundary, anchor.outsideBoundary)

track <- import(here(refDir, \33248_CTCF_07-729_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))
#plotSumScores(track, peak, \CTCF\)
plotSumScoresBinary(track, peak, \CTCF\, anchor.noBoundary, anchor.withinBoundary, anchor.outsideBoundary)

track <- import(here(refDir, \33250_RAD21_ab992_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))
#plotSumScores(track, peak, \RAD21\)
plotSumScoresBinary(track, peak, \RAD21\, anchor.noBoundary, anchor.withinBoundary, anchor.outsideBoundary)



######## LOLA
atac <- fread(here(refDir, \GSM3106257_ATAC_ESC_1.bed\)) %>% dplyr::select(V1, V2, V3)
colnames(atac) <- c(\chr\, \start\, \end\)
atac.gr <- makeGRangesFromDataFrame(atac)

# LOADING LOOPS
loop.all <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\)) %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\, \E-E\))
anchor.all <- (extractAnchor(loop.all))
overlaps <- findOverlaps(anchor.all, atac.gr)
anchor.all <- pintersect(anchor.all[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])

overlaps <- findOverlaps(anchor.noBoundary, atac.gr)
anchor.noBoundary <- pintersect(anchor.noBoundary[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])
overlaps <- findOverlaps(anchor.withinBoundary, atac.gr)
anchor.withinBoundary <- pintersect(anchor.withinBoundary[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])
overlaps <- findOverlaps(anchor.outsideBoundary, atac.gr)
anchor.outsideBoundary <- pintersect(anchor.outsideBoundary[queryHits(overlaps)], atac.gr[subjectHits(overlaps)])



anchors <- list(anchor.noBoundary, anchor.withBoundary, anchor.outsideBoundary)
tbs <- list()
temps <- list()

alpha <- 0.05

# Process clusters c1 to c8
for (i in 1:3) {
  
  anchor <- anchors[[i]]
  # Run LOLA
  result <- runLOLA(anchor, anchor.all, lolaDB)
  tb <- as_tibble(result)
  
  # Filter and summarize
  tb <- tb %>%
    dplyr::mutate(target = toupper(antibody)) %>%
    filter(str_to_lower(cellType) == \embryonic stem cell\) %>%
    dplyr::filter(qValue < alpha) %>%
    dplyr::group_by(target) %>%
    slice_min(meanRnk, with_ties = FALSE)
  
  # Store tb
  tbs[[i]] <- tb
  
  # Select and rename oddsRatio
  temp <- tb %>% dplyr::select(target, oddsRatio)
  colnames(temp) <- c(\target\, paste0(\OR_c\, i))
  
  # Store temp
  temps[[i]] <- temp
}

# Merge all temp tables into one
temp <- Reduce(function(x, y) full_join(x, y, by = \target\), temps) %>%
  mutate_all(~replace_na(., 1))
colnames(temp) <- c(\target\, \noBoundary\, \withinBoundary\, \outsideBoundary\)
data <- temp %>% column_to_rownames(\target\) %>% as.matrix()

library(circlize)
col_fun <- colorRamp2(c(1, max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



### [2.35] Checking CTCF motif presence at gene TSS

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkSE56TGpWcllpNW5jbTkxY0RFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpVkZOVFgySnBibUZ5ZVVkeWIzVndNUzVpWldSY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0hOMFlYSjBJRDBnS0ZZeUlDc2dWak1wTHpJZ0xTQXlOVEF3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWdVpDQTlJQ2hXTWlBcklGWXpLUzh5SUNzZ01qVXdNQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYUhJZ1BTQldNU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1kyaHlMQ0J6ZEdGeWRDd2daVzVrS1Z4dWRITnpMalZyWWk1bmNtOTFjREVnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0hSemN5NDFhMkl1WjNKdmRYQXhLVnh1WEc1MGMzTXVOV3RpTG1keWIzVndNaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSlVVMU5mWW1sdVlYSjVSM0p2ZFhBeUxtSmxaRndpS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9jM1JoY25RZ1BTQW9WaklnS3lCV015a3ZNaUF0SURJMU1EQXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaVzVrSUQwZ0tGWXlJQ3NnVmpNcEx6SWdLeUF5TlRBd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTm9jaUE5SUZZeEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2hqYUhJc0lITjBZWEowTENCbGJtUXBYRzUwYzNNdU5XdGlMbWR5YjNWd01pQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9kSE56TGpWcllpNW5jbTkxY0RJcFhHNWNibHh1Y0d4dmRGTjFiVk5qYjNKbGMwSnBibUZ5ZVNBOExTQm1kVzVqZEdsdmJpaDBjbUZqYXl3Z2NHVmhheXdnYm1GdFpTd2dZVzVqYUc5eU1Td2dZVzVqYUc5eU1pbDdYRzRnSUhCbFlXdFVjbUZqYXlBOExTQjBjbUZqYTF0MWJtbHhkV1VvY1hWbGNubElhWFJ6S0dacGJtUlBkbVZ5YkdGd2N5aDBjbUZqYXl3Z2NHVmhheWtwS1YxY2JpQWdZU0E4TFNCblpYUlRkVzFUWTI5eVpYTW9jR1ZoYTFSeVlXTnJMQ0JoYm1Ob2IzSXhLVnh1SUNCaUlEd3RJR2RsZEZOMWJWTmpiM0psY3lod1pXRnJWSEpoWTJzc0lHRnVZMmh2Y2pJcFhHNGdJR0V1ZEdJZ1BDMGdkR2xpWW14bEtHeHZiM0FnUFNCY0ltZHliM1Z3TVZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpkVzFUWTI5eVpTQTlJR0VwWEc0Z0lHSXVkR0lnUEMwZ2RHbGlZbXhsS0d4dmIzQWdQU0JjSW1keWIzVndNbHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRXMVRZMjl5WlNBOUlHSXBYRzRnSUZ4dUlDQmtZWFJoSUR3dElHSnBibVJmY205M2N5aGhMblJpTENCaUxuUmlLU0FsUGlVZ1pISnZjRjl1WVNncFhHNGdJR1JoZEdFa2JHOXZjQ0E4TFNCbVlXTjBiM0lvWkdGMFlTUnNiMjl3TENCc1pYWmxiSE1nUFNCaktGd2laM0p2ZFhBeFhDSXNJRndpWjNKdmRYQXlYQ0lwS1Z4dUlDQmNiaUFnY0RFeUlEd3RJR2RsZEZCMllXeFhhV3hqYjNnb1pHRjBZU3dnWENKbmNtOTFjREZjSWl3Z1hDSm5jbTkxY0RKY0lpbGNiaUFnY0NBOExTQWdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnYkc5dmNDd2dlU0E5SUhOMWJWTmpiM0psS1NrZ0t5QmNiaUFnSUNCc1lXSnpLSGdnUFNCT1ZVeE1MQ0I1SUQwZ2NHRnpkR1V3S0c1aGJXVXNJRndpWEZ4dWJHOW5LR0YyWnlCd1pXRnJJSE5qYjNKbElIQmxjaUJoYm1Ob2IzSXBYQ0lwS1NBclhHNGdJQ0FnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQnNiMjl3S1N3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBclhHNGdJQ0FnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiM1YwYkdsbGNpNXphWHBsSUQwZ01Td2diM1YwYkdsbGNpNXpkSEp2YTJVZ1BTQk9RU2tnS3lCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQWdJSE4wWVhSZmMzVnRiV0Z5ZVNoY2JpQWdJQ0FnSUdGbGN5aG5jbTkxY0NBOUlHeHZiM0FwTENCbWRXNGdQU0J0WldGdUxGeHVJQ0FnSUNBZ1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlERXNYRzRnSUNBZ0lDQm1hV3hzSUQwZ1hDSnlaV1JjSWl3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENKY2JpQWdJQ0FwSUNzZ2RHaGxiV1VvWEc0Z0lDQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRMQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ0FnS1N4Y2JpQWdJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXdnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCaGVHbHpMblJsZUhRdWVDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUNBZ1lXNW5iR1VnUFNBME5Td2dhR3AxYzNRZ1BTQXhMQ0IyYW5WemRDQTlJREZjYmlBZ0lDQWdJQ2tzWEc0Z0lDQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdJQ0FwTEZ4dUlDQWdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl3Z2MybDZaU0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENKY2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNJblJ5WVc1emNHRnlaVzUwWENJcExGeHVJQ0FnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtWeHVJQ0FnSUNrZ0t5QmNiaUFnSUNBalkyOXZjbVJmWTJGeWRHVnphV0Z1S0hsc2FXMGdQU0JqS0hGMVlXNTBhV3hsS0dSaGRHRWtjM1Z0VTJOdmNtVXNJREF1TUNrc0lIRjFZVzUwYVd4bEtHUmhkR0VrYzNWdFUyTnZjbVVzSURBdU9Ua3BLU2tnS3lCY2JpQWdJQ0JoYm01dmRHRjBaU2hjYmlBZ0lDQWdJRndpZEdWNGRGd2lMQ0I0SUQwZ01Td2dlU0E5SUhGMVlXNTBhV3hsS0dSaGRHRWtjM1Z0VTJOdmNtVXNJREF1TlNrc1hHNGdJQ0FnSUNCc1lXSmxiQ0E5SUhCaGMzUmxNQ2hjSW5BeE1qb2dYQ0lzSUdOdmJuWlFkbUZzZFdVb2NERXlLU2tzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXdnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTTF4dUlDQWdJQ2tnWEc0Z0lDTXJJSE5qWVd4bFgzbGZZMjl1ZEdsdWRXOTFjeWgwY21GdWN5QTlJRndpYkc5bk1UQmNJaWxjYmlBZ1hHNGdJR1pwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSWtOb1NWQmZjR1ZoYTE5aGRtZFFaV0ZyVTJOdmNtVmZZbWx1WVhKNVIzSnZkWEJmWENJc0lHNWhiV1VwWEc0Z0lIZHBaSFJvSUR3dElIQmhibVZzVTJsNlpTZ3lLU3B0YlZSdlNXNWphRnh1SUNCb1pXbG5hSFFnUEMwZ2NHRnVaV3hUYVhwbEtESXBLbTF0Vkc5SmJtTm9YRzRnSUhCdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNGdJSE4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYmlBZ2NISnBiblFvY0NsY2JpQWdaR1YyTG05bVppZ3BYRzU5WEc1Y2JpTWdVM1Z0SUhCbFlXc2djMk52Y21WY2JpTWpJeU5jYm5SeVlXTnJJRHd0SUdsdGNHOXlkQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSXpNekkwT0Y5RFZFTkdYekEzTFRjeU9WOUNjblZqWlMwMFgzUnlhVzFmY1RJd1gyUmxaSFZ3WDJKc1lXTnJYMlJsY0hSb1RtOXliUzVpZDF3aUtTd2dabTl5YldGMElEMGdYQ0pDYVdkWGFXZGNJaWxjYm5CbFlXc2dQQzBnYVcxd2IzSjBVR1ZoYXlob1pYSmxLSEpsWmtScGNpd2dYQ0l6TXpJME9GOURWRU5HWHpBM0xUY3lPVjlDY25WalpTMDBYM0JsWVd0ekxtMWxjbWRsVUdWaGF5NWlaV1JjSWlrcFhHNXdiRzkwVTNWdFUyTnZjbVZ6UW1sdVlYSjVLSFJ5WVdOckxDQndaV0ZyTENCY0lrTlVRMFpjSWl3Z2RITnpMalZyWWk1bmNtOTFjREVzSUhSemN5NDFhMkl1WjNKdmRYQXlLVnh1WEc1MGNtRmpheUE4TFNCcGJYQnZjblFvYUdWeVpTaHlaV1pFYVhJc0lGd2lNek15TlRCZlVrRkVNakZmWVdJNU9USmZRbkoxWTJVdE5GOTBjbWx0WDNFeU1GOWtaV1IxY0Y5aWJHRmphMTlrWlhCMGFFNXZjbTB1WW5kY0lpa3NJR1p2Y20xaGRDQTlJRndpUW1sblYybG5YQ0lwWEc1d1pXRnJJRHd0SUdsdGNHOXlkRkJsWVdzb2FHVnlaU2h5WldaRWFYSXNJRndpTXpNeU5UQmZVa0ZFTWpGZllXSTVPVEpmUW5KMVkyVXRORjl3WldGcmN5NXRaWEpuWlZCbFlXc3VZbVZrWENJcEtWeHVjR3h2ZEZOMWJWTmpiM0psYzBKcGJtRnllU2gwY21GamF5d2djR1ZoYXl3Z1hDSlNRVVF5TVZ3aUxDQjBjM011Tld0aUxtZHliM1Z3TVN3Z2RITnpMalZyWWk1bmNtOTFjRElwWEc1Y2JseHVYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbnRzcy41a2IuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXFRTU19iaW5hcnlHcm91cDEuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzdGFydCA9IChWMiArIFYzKS8yIC0gMjUwMCxcbiAgICAgICAgICAgICAgICBlbmQgPSAoVjIgKyBWMykvMiArIDI1MDAsXG4gICAgICAgICAgICAgICAgY2hyID0gVjEpICU+JVxuICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZClcbnRzcy41a2IuZ3JvdXAxIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0c3MuNWtiLmdyb3VwMSlcblxudHNzLjVrYi5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcVFNTX2JpbmFyeUdyb3VwMi5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gKFYyICsgVjMpLzIgLSAyNTAwLFxuICAgICAgICAgICAgICAgIGVuZCA9IChWMiArIFYzKS8yICsgMjUwMCxcbiAgICAgICAgICAgICAgICBjaHIgPSBWMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kKVxudHNzLjVrYi5ncm91cDIgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRzcy41a2IuZ3JvdXAyKVxuXG5cbnBsb3RTdW1TY29yZXNCaW5hcnkgPC0gZnVuY3Rpb24odHJhY2ssIHBlYWssIG5hbWUsIGFuY2hvcjEsIGFuY2hvcjIpe1xuICBwZWFrVHJhY2sgPC0gdHJhY2tbdW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHModHJhY2ssIHBlYWspKSldXG4gIGEgPC0gZ2V0U3VtU2NvcmVzKHBlYWtUcmFjaywgYW5jaG9yMSlcbiAgYiA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IyKVxuICBhLnRiIDwtIHRpYmJsZShsb29wID0gXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBhKVxuICBiLnRiIDwtIHRpYmJsZShsb29wID0gXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBiKVxuICBcbiAgZGF0YSA8LSBiaW5kX3Jvd3MoYS50YiwgYi50YikgJT4lIGRyb3BfbmEoKVxuICBkYXRhJGxvb3AgPC0gZmFjdG9yKGRhdGEkbG9vcCwgbGV2ZWxzID0gYyhcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSlcbiAgXG4gIHAxMiA8LSBnZXRQdmFsV2lsY294KGRhdGEsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpXG4gIHAgPC0gIGdncGxvdChkYXRhLCBhZXMoeCA9IGxvb3AsIHkgPSBzdW1TY29yZSkpICsgXG4gICAgbGFicyh4ID0gTlVMTCwgeSA9IHBhc3RlMChuYW1lLCBcXFxcbmxvZyhhdmcgcGVhayBzY29yZSBwZXIgYW5jaG9yKVxcKSkgK1xuICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gbG9vcCksIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgIG91dGxpZXIuc2l6ZSA9IDEsIG91dGxpZXIuc3Ryb2tlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSBsb29wKSwgZnVuID0gbWVhbixcbiAgICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLFxuICAgICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICAgKSArIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgICApLFxuICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgICApLFxuICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApICsgXG4gICAgI2Nvb3JkX2NhcnRlc2lhbih5bGltID0gYyhxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjApLCBxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjk5KSkpICsgXG4gICAgYW5ub3RhdGUoXG4gICAgICBcXHRleHRcXCwgeCA9IDEsIHkgPSBxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjUpLFxuICAgICAgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMikpLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDNcbiAgICApIFxuICAjKyBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSBcXGxvZzEwXFwpXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxDaElQX3BlYWtfYXZnUGVha1Njb3JlX2JpbmFyeUdyb3VwX1xcLCBuYW1lKVxuICB3aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIFN1bSBwZWFrIHNjb3JlXG4jIyMjXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxDVENGXFwsIHRzcy41a2IuZ3JvdXAxLCB0c3MuNWtiLmdyb3VwMilcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXDMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfdHJpbV9xMjBfZGVkdXBfYmxhY2tfZGVwdGhOb3JtLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssIFxcUkFEMjFcXCwgdHNzLjVrYi5ncm91cDEsIHRzcy41a2IuZ3JvdXAyKVxuXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
tss.5kb.group1 <- fread(here(refDir, \TSS_binaryGroup1.bed\)) %>%
  dplyr::mutate(start = (V2 + V3)/2 - 2500,
                end = (V2 + V3)/2 + 2500,
                chr = V1) %>%
  dplyr::select(chr, start, end)
tss.5kb.group1 <- makeGRangesFromDataFrame(tss.5kb.group1)

tss.5kb.group2 <- fread(here(refDir, \TSS_binaryGroup2.bed\)) %>%
  dplyr::mutate(start = (V2 + V3)/2 - 2500,
                end = (V2 + V3)/2 + 2500,
                chr = V1) %>%
  dplyr::select(chr, start, end)
tss.5kb.group2 <- makeGRangesFromDataFrame(tss.5kb.group2)


plotSumScoresBinary <- function(track, peak, name, anchor1, anchor2){
  peakTrack <- track[unique(queryHits(findOverlaps(track, peak)))]
  a <- getSumScores(peakTrack, anchor1)
  b <- getSumScores(peakTrack, anchor2)
  a.tb <- tibble(loop = \group1\,
                 sumScore = a)
  b.tb <- tibble(loop = \group2\,
                 sumScore = b)
  
  data <- bind_rows(a.tb, b.tb) %>% drop_na()
  data$loop <- factor(data$loop, levels = c(\group1\, \group2\))
  
  p12 <- getPvalWilcox(data, \group1\, \group2\)
  p <-  ggplot(data, aes(x = loop, y = sumScore)) + 
    labs(x = NULL, y = paste0(name, \\nlog(avg peak score per anchor)\)) +
    geom_violin(aes(fill = loop), color = \black\,
                linewidth = lineThick * mmToLineUnit, lineend = \square\,
                show.legend = FALSE) +
    geom_boxplot(width = 0.1, color = \black\,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\,
                 outlier.size = 1, outlier.stroke = NA) + theme_classic() +
    stat_summary(
      aes(group = loop), fun = mean,
      geom = \point\, shape = 21, size = 1,
      fill = \red\, color = \black\
    ) + theme(
      axis.title = element_text(
        size = fontSizeS, family = fontType, color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS, family = fontType, color = \#000000\
      ),
      axis.text.x = element_text(
        angle = 45, hjust = 1, vjust = 1
      ),
      axis.line = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
      legend.text = element_text(family = fontType, size = fontSizeS),
      legend.title = element_text(family = fontType, size = fontSizeS)
    ) + 
    #coord_cartesian(ylim = c(quantile(data$sumScore, 0.0), quantile(data$sumScore, 0.99))) + 
    annotate(
      \text\, x = 1, y = quantile(data$sumScore, 0.5),
      label = paste0(\p12: \, convPvalue(p12)),
      color = \black\, hjust = 0, size = 3
    ) 
  #+ scale_y_continuous(trans = \log10\)
  
  fileName <- paste0(\ChIP_peak_avgPeakScore_binaryGroup_\, name)
  width <- panelSize(2)*mmToInch
  height <- panelSize(2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# Sum peak score
####
track <- import(here(refDir, \33248_CTCF_07-729_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))
plotSumScoresBinary(track, peak, \CTCF\, tss.5kb.group1, tss.5kb.group2)

track <- import(here(refDir, \33250_RAD21_ab992_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))
plotSumScoresBinary(track, peak, \RAD21\, tss.5kb.group1, tss.5kb.group2)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRITnpMalZyWWk1bmNtOTFjREVnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNWRk5UWDJKcGJtRnllVWR5YjNWd01TNWlaV1JjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLSE4wWVhKMElEMGdLRll5SUNzZ1ZqTXBMeklnTFNBeU5UQXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1Z1WkNBOUlDaFdNaUFySUZZektTOHlJQ3NnTWpVd01DeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmphSElnUFNCV01Ta2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWTJoeUxDQnpkR0Z5ZEN3Z1pXNWtLVnh1ZEhOekxqVnJZaTVuY205MWNERWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLSFJ6Y3k0MWEySXVaM0p2ZFhBeEtWeHVYRzUwYzNNdU5XdGlMbWR5YjNWd01pQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4VVUxTmZZbWx1WVhKNVIzSnZkWEF5TG1KbFpGeGNLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2MzUmhjblFnUFNBb1ZqSWdLeUJXTXlrdk1pQXRJREkxTURBc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pXNWtJRDBnS0ZZeUlDc2dWak1wTHpJZ0t5QXlOVEF3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOb2NpQTlJRll4S1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaGphSElzSUhOMFlYSjBMQ0JsYm1RcFhHNTBjM011Tld0aUxtZHliM1Z3TWlBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb2RITnpMalZyWWk1bmNtOTFjRElwWEc1Y2JseHVjR3h2ZEZOMWJWTmpiM0psYzBKcGJtRnllU0E4TFNCbWRXNWpkR2x2YmloMGNtRmpheXdnY0dWaGF5d2dibUZ0WlN3Z1lXNWphRzl5TVN3Z1lXNWphRzl5TWlsN1hHNGdJSEJsWVd0VWNtRmpheUE4TFNCMGNtRmphMXQxYm1seGRXVW9jWFZsY25sSWFYUnpLR1pwYm1SUGRtVnliR0Z3Y3loMGNtRmpheXdnY0dWaGF5a3BLVjFjYmlBZ1lTQThMU0JuWlhSVGRXMVRZMjl5WlhNb2NHVmhhMVJ5WVdOckxDQmhibU5vYjNJeEtWeHVJQ0JpSUR3dElHZGxkRk4xYlZOamIzSmxjeWh3WldGclZISmhZMnNzSUdGdVkyaHZjaklwWEc0Z0lHRXVkR0lnUEMwZ2RHbGlZbXhsS0d4dmIzQWdQU0JjWEdkeWIzVndNVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRXMVRZMjl5WlNBOUlHRXBYRzRnSUdJdWRHSWdQQzBnZEdsaVlteGxLR3h2YjNBZ1BTQmNYR2R5YjNWd01seGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZFcxVFkyOXlaU0E5SUdJcFhHNGdJRnh1SUNCa1lYUmhJRHd0SUdKcGJtUmZjbTkzY3loaExuUmlMQ0JpTG5SaUtTQWxQaVVnWkhKdmNGOXVZU2dwWEc0Z0lHUmhkR0VrYkc5dmNDQThMU0JtWVdOMGIzSW9aR0YwWVNSc2IyOXdMQ0JzWlhabGJITWdQU0JqS0Z4Y1ozSnZkWEF4WEZ3c0lGeGNaM0p2ZFhBeVhGd3BLVnh1SUNCY2JpQWdjREV5SUR3dElHZGxkRkIyWVd4WGFXeGpiM2dvWkdGMFlTd2dYRnhuY205MWNERmNYQ3dnWEZ4bmNtOTFjREpjWENsY2JpQWdjQ0E4TFNBZ1oyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdiRzl2Y0N3Z2VTQTlJSE4xYlZOamIzSmxLU2tnS3lCY2JpQWdJQ0JzWVdKektIZ2dQU0JPVlV4TUxDQjVJRDBnY0dGemRHVXdLRzVoYldVc0lGeGNYRnh1Ykc5bktHRjJaeUJ3WldGcklITmpiM0psSUhCbGNpQmhibU5vYjNJcFhGd3BLU0FyWEc0Z0lDQWdaMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCc2IyOXdLU3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FyWEc0Z0lDQWdaMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0eExDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzVjBiR2xsY2k1emFYcGxJRDBnTVN3Z2IzVjBiR2xsY2k1emRISnZhMlVnUFNCT1FTa2dLeUIwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNBZ0lITjBZWFJmYzNWdGJXRnllU2hjYmlBZ0lDQWdJR0ZsY3lobmNtOTFjQ0E5SUd4dmIzQXBMQ0JtZFc0Z1BTQnRaV0Z1TEZ4dUlDQWdJQ0FnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURFc1hHNGdJQ0FnSUNCbWFXeHNJRDBnWEZ4eVpXUmNYQ3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRnhjYmlBZ0lDQXBJQ3NnZEdobGJXVW9YRzRnSUNBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2dZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDQWdLU3hjYmlBZ0lDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5d2dabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQWdJQ2tzWEc0Z0lDQWdJQ0JoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJQ0FnWVc1bmJHVWdQU0EwTlN3Z2FHcDFjM1FnUFNBeExDQjJhblZ6ZENBOUlERmNiaUFnSUNBZ0lDa3NYRzRnSUNBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0lDQXBMRnh1SUNBZ0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3dnYzJsNlpTQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRnhjYmlBZ0lDQWdJQ2tzWEc0Z0lDQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY1hIUnlZVzV6Y0dGeVpXNTBYRndwTEZ4dUlDQWdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJQ0FnYkdWblpXNWtMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1Z4dUlDQWdJQ2tnS3lCY2JpQWdJQ0FqWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLSEYxWVc1MGFXeGxLR1JoZEdFa2MzVnRVMk52Y21Vc0lEQXVNQ2tzSUhGMVlXNTBhV3hsS0dSaGRHRWtjM1Z0VTJOdmNtVXNJREF1T1RrcEtTa2dLeUJjYmlBZ0lDQmhibTV2ZEdGMFpTaGNiaUFnSUNBZ0lGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTVN3Z2VTQTlJSEYxWVc1MGFXeGxLR1JoZEdFa2MzVnRVMk52Y21Vc0lEQXVOU2tzWEc0Z0lDQWdJQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNYSEF4TWpvZ1hGd3NJR052Ym5aUWRtRnNkV1VvY0RFeUtTa3NYRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDd2dhR3AxYzNRZ1BTQXdMQ0J6YVhwbElEMGdNMXh1SUNBZ0lDa2dYRzRnSUNNcklITmpZV3hsWDNsZlkyOXVkR2x1ZFc5MWN5aDBjbUZ1Y3lBOUlGeGNiRzluTVRCY1hDbGNiaUFnWEc0Z0lHWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYRU5vU1ZCZmNHVmhhMTloZG1kUVpXRnJVMk52Y21WZlltbHVZWEo1UjNKdmRYQmZYRndzSUc1aGJXVXBYRzRnSUhkcFpIUm9JRHd0SUhCaGJtVnNVMmw2WlNneUtTcHRiVlJ2U1c1amFGeHVJQ0JvWldsbmFIUWdQQzBnY0dGdVpXeFRhWHBsS0RJcEttMXRWRzlKYm1Ob1hHNGdJSEJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JpQWdjSEpwYm5Rb2NDbGNiaUFnWkdWMkxtOW1aaWdwWEc0Z0lITjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNiaUFnY0hKcGJuUW9jQ2xjYmlBZ1pHVjJMbTltWmlncFhHNTlYRzVjYmlNZ1UzVnRJSEJsWVdzZ2MyTnZjbVZjYmlNakl5TmNiblJ5WVdOcklEd3RJR2x0Y0c5eWRDaG9aWEpsS0hKbFprUnBjaXdnWEZ3ek16STBPRjlEVkVOR1h6QTNMVGN5T1Y5Q2NuVmpaUzAwWDNSeWFXMWZjVEl3WDJSbFpIVndYMkpzWVdOclgyUmxjSFJvVG05eWJTNWlkMXhjS1N3Z1ptOXliV0YwSUQwZ1hGeENhV2RYYVdkY1hDbGNibkJsWVdzZ1BDMGdhVzF3YjNKMFVHVmhheWhvWlhKbEtISmxaa1JwY2l3Z1hGd3pNekkwT0Y5RFZFTkdYekEzTFRjeU9WOUNjblZqWlMwMFgzQmxZV3R6TG0xbGNtZGxVR1ZoYXk1aVpXUmNYQ2twWEc1d2JHOTBVM1Z0VTJOdmNtVnpRbWx1WVhKNUtIUnlZV05yTENCd1pXRnJMQ0JjWEVOVVEwWmNYQ3dnZEhOekxqVnJZaTVuY205MWNERXNJSFJ6Y3k0MWEySXVaM0p2ZFhBeUtWeHVYRzUwY21GamF5QThMU0JwYlhCdmNuUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y016TXlOVEJmVWtGRU1qRmZZV0k1T1RKZlFuSjFZMlV0TkY5MGNtbHRYM0V5TUY5a1pXUjFjRjlpYkdGamExOWtaWEIwYUU1dmNtMHVZbmRjWENrc0lHWnZjbTFoZENBOUlGeGNRbWxuVjJsblhGd3BYRzV3WldGcklEd3RJR2x0Y0c5eWRGQmxZV3NvYUdWeVpTaHlaV1pFYVhJc0lGeGNNek15TlRCZlVrRkVNakZmWVdJNU9USmZRbkoxWTJVdE5GOXdaV0ZyY3k1dFpYSm5aVkJsWVdzdVltVmtYRndwS1Z4dWNHeHZkRk4xYlZOamIzSmxjMEpwYm1GeWVTaDBjbUZqYXl3Z2NHVmhheXdnWEZ4U1FVUXlNVnhjTENCMGMzTXVOV3RpTG1keWIzVndNU3dnZEhOekxqVnJZaTVuY205MWNESXBYRzVjYmx4dVhHNWdZR0JjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbmBgYHJcbnRzcy41a2IuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXFRTU19iaW5hcnlHcm91cDEuYmVkXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShzdGFydCA9IChWMiArIFYzKS8yIC0gMjUwMCxcbiAgICAgICAgICAgICAgICBlbmQgPSAoVjIgKyBWMykvMiArIDI1MDAsXG4gICAgICAgICAgICAgICAgY2hyID0gVjEpICU+JVxuICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZClcbnRzcy41a2IuZ3JvdXAxIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0c3MuNWtiLmdyb3VwMSlcblxudHNzLjVrYi5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcVFNTX2JpbmFyeUdyb3VwMi5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gKFYyICsgVjMpLzIgLSAyNTAwLFxuICAgICAgICAgICAgICAgIGVuZCA9IChWMiArIFYzKS8yICsgMjUwMCxcbiAgICAgICAgICAgICAgICBjaHIgPSBWMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kKVxudHNzLjVrYi5ncm91cDIgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRzcy41a2IuZ3JvdXAyKVxuXG5cbnBsb3RTdW1TY29yZXNCaW5hcnkgPC0gZnVuY3Rpb24odHJhY2ssIHBlYWssIG5hbWUsIGFuY2hvcjEsIGFuY2hvcjIpe1xuICBwZWFrVHJhY2sgPC0gdHJhY2tbdW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHModHJhY2ssIHBlYWspKSldXG4gIGEgPC0gZ2V0U3VtU2NvcmVzKHBlYWtUcmFjaywgYW5jaG9yMSlcbiAgYiA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IyKVxuICBhLnRiIDwtIHRpYmJsZShsb29wID0gXFxncm91cDFcXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBhKVxuICBiLnRiIDwtIHRpYmJsZShsb29wID0gXFxncm91cDJcXCxcbiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBiKVxuICBcbiAgZGF0YSA8LSBiaW5kX3Jvd3MoYS50YiwgYi50YikgJT4lIGRyb3BfbmEoKVxuICBkYXRhJGxvb3AgPC0gZmFjdG9yKGRhdGEkbG9vcCwgbGV2ZWxzID0gYyhcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSlcbiAgXG4gIHAxMiA8LSBnZXRQdmFsV2lsY294KGRhdGEsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpXG4gIHAgPC0gIGdncGxvdChkYXRhLCBhZXMoeCA9IGxvb3AsIHkgPSBzdW1TY29yZSkpICsgXG4gICAgbGFicyh4ID0gTlVMTCwgeSA9IHBhc3RlMChuYW1lLCBcXFxcbmxvZyhhdmcgcGVhayBzY29yZSBwZXIgYW5jaG9yKVxcKSkgK1xuICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gbG9vcCksIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgIG91dGxpZXIuc2l6ZSA9IDEsIG91dGxpZXIuc3Ryb2tlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICtcbiAgICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSBsb29wKSwgZnVuID0gbWVhbixcbiAgICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAxLFxuICAgICAgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICAgKSArIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgICApLFxuICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgICApLFxuICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgICApLFxuICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApICsgXG4gICAgI2Nvb3JkX2NhcnRlc2lhbih5bGltID0gYyhxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjApLCBxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjk5KSkpICsgXG4gICAgYW5ub3RhdGUoXG4gICAgICBcXHRleHRcXCwgeCA9IDEsIHkgPSBxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjUpLFxuICAgICAgbGFiZWwgPSBwYXN0ZTAoXFxwMTI6IFxcLCBjb252UHZhbHVlKHAxMikpLFxuICAgICAgY29sb3IgPSBcXGJsYWNrXFwsIGhqdXN0ID0gMCwgc2l6ZSA9IDNcbiAgICApIFxuICAjKyBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSBcXGxvZzEwXFwpXG4gIFxuICBmaWxlTmFtZSA8LSBwYXN0ZTAoXFxDaElQX3BlYWtfYXZnUGVha1Njb3JlX2JpbmFyeUdyb3VwX1xcLCBuYW1lKVxuICB3aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxuICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG4gIHByaW50KHApXG4gIGRldi5vZmYoKVxufVxuXG4jIFN1bSBwZWFrIHNjb3JlXG4jIyMjXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxDVENGXFwsIHRzcy41a2IuZ3JvdXAxLCB0c3MuNWtiLmdyb3VwMilcblxudHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCBcXDMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfdHJpbV9xMjBfZGVkdXBfYmxhY2tfZGVwdGhOb3JtLmJ3XFwpLCBmb3JtYXQgPSBcXEJpZ1dpZ1xcKVxucGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssIFxcUkFEMjFcXCwgdHNzLjVrYi5ncm91cDEsIHRzcy41a2IuZ3JvdXAyKVxuXG5cblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudHNzLjVrYi5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcVFNTX2JpbmFyeUdyb3VwMS5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gKFYyICsgVjMpLzIgLSAyNTAwLFxuICAgICAgICAgICAgICAgIGVuZCA9IChWMiArIFYzKS8yICsgMjUwMCxcbiAgICAgICAgICAgICAgICBjaHIgPSBWMSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kKVxudHNzLjVrYi5ncm91cDEgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRzcy41a2IuZ3JvdXAxKVxuXG50c3MuNWtiLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxUU1NfYmluYXJ5R3JvdXAyLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoc3RhcnQgPSAoVjIgKyBWMykvMiAtIDI1MDAsXG4gICAgICAgICAgICAgICAgZW5kID0gKFYyICsgVjMpLzIgKyAyNTAwLFxuICAgICAgICAgICAgICAgIGNociA9IFYxKSAlPiVcbiAgZHBseXI6OnNlbGVjdChjaHIsIHN0YXJ0LCBlbmQpXG50c3MuNWtiLmdyb3VwMiA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodHNzLjVrYi5ncm91cDIpXG5cblxucGxvdFN1bVNjb3Jlc0JpbmFyeSA8LSBmdW5jdGlvbih0cmFjaywgcGVhaywgbmFtZSwgYW5jaG9yMSwgYW5jaG9yMil7XG4gIHBlYWtUcmFjayA8LSB0cmFja1t1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyh0cmFjaywgcGVhaykpKV1cbiAgYSA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IxKVxuICBiIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvcjIpXG4gIGEudGIgPC0gdGliYmxlKGxvb3AgPSBcXGdyb3VwMVxcLFxuICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGEpXG4gIGIudGIgPC0gdGliYmxlKGxvb3AgPSBcXGdyb3VwMlxcLFxuICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGIpXG4gIFxuICBkYXRhIDwtIGJpbmRfcm93cyhhLnRiLCBiLnRiKSAlPiUgZHJvcF9uYSgpXG4gIGRhdGEkbG9vcCA8LSBmYWN0b3IoZGF0YSRsb29wLCBsZXZlbHMgPSBjKFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpKVxuICBcbiAgcDEyIDwtIGdldFB2YWxXaWxjb3goZGF0YSwgXFxncm91cDFcXCwgXFxncm91cDJcXClcbiAgcCA8LSAgZ2dwbG90KGRhdGEsIGFlcyh4ID0gbG9vcCwgeSA9IHN1bVNjb3JlKSkgKyBcbiAgICBsYWJzKHggPSBOVUxMLCB5ID0gcGFzdGUwKG5hbWUsIFxcXFxubG9nKGF2ZyBwZWFrIHNjb3JlIHBlciBhbmNob3IpXFwpKSArXG4gICAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBsb29wKSwgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgICAgb3V0bGllci5zaXplID0gMSwgb3V0bGllci5zdHJva2UgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgK1xuICAgIHN0YXRfc3VtbWFyeShcbiAgICAgIGFlcyhncm91cCA9IGxvb3ApLCBmdW4gPSBtZWFuLFxuICAgICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsXG4gICAgICBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgICApICsgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICAgKSxcbiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICAgICksXG4gICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDFcbiAgICAgICksXG4gICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgICApLFxuICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICAgICksXG4gICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgICkgKyBcbiAgICAjY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHF1YW50aWxlKGRhdGEkc3VtU2NvcmUsIDAuMCksIHF1YW50aWxlKGRhdGEkc3VtU2NvcmUsIDAuOTkpKSkgKyBcbiAgICBhbm5vdGF0ZShcbiAgICAgIFxcdGV4dFxcLCB4ID0gMSwgeSA9IHF1YW50aWxlKGRhdGEkc3VtU2NvcmUsIDAuNSksXG4gICAgICBsYWJlbCA9IHBhc3RlMChcXHAxMjogXFwsIGNvbnZQdmFsdWUocDEyKSksXG4gICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gM1xuICAgICkgXG4gICMrIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9IFxcbG9nMTBcXClcbiAgXG4gIGZpbGVOYW1lIDwtIHBhc3RlMChcXENoSVBfcGVha19hdmdQZWFrU2NvcmVfYmluYXJ5R3JvdXBfXFwsIG5hbWUpXG4gIHdpZHRoIDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuICBoZWlnaHQgPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoXG4gIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG4gIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbiAgcHJpbnQocClcbiAgZGV2Lm9mZigpXG59XG5cbiMgU3VtIHBlYWsgc2NvcmVcbiMjIyNcbnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgXFwzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5id1xcKSwgZm9ybWF0ID0gXFxCaWdXaWdcXClcbnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG5wbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCBcXENUQ0ZcXCwgdHNzLjVrYi5ncm91cDEsIHRzcy41a2IuZ3JvdXAyKVxuXG50cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsIFxcMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYndcXCksIGZvcm1hdCA9IFxcQmlnV2lnXFwpXG5wZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxucGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgXFxSQUQyMVxcLCB0c3MuNWtiLmdyb3VwMSwgdHNzLjVrYi5ncm91cDIpXG5cblxuXG5gYGBcbmBgYCJ9 -->

```r
```r
tss.5kb.group1 <- fread(here(refDir, \TSS_binaryGroup1.bed\)) %>%
  dplyr::mutate(start = (V2 + V3)/2 - 2500,
                end = (V2 + V3)/2 + 2500,
                chr = V1) %>%
  dplyr::select(chr, start, end)
tss.5kb.group1 <- makeGRangesFromDataFrame(tss.5kb.group1)

tss.5kb.group2 <- fread(here(refDir, \TSS_binaryGroup2.bed\)) %>%
  dplyr::mutate(start = (V2 + V3)/2 - 2500,
                end = (V2 + V3)/2 + 2500,
                chr = V1) %>%
  dplyr::select(chr, start, end)
tss.5kb.group2 <- makeGRangesFromDataFrame(tss.5kb.group2)


plotSumScoresBinary <- function(track, peak, name, anchor1, anchor2){
  peakTrack <- track[unique(queryHits(findOverlaps(track, peak)))]
  a <- getSumScores(peakTrack, anchor1)
  b <- getSumScores(peakTrack, anchor2)
  a.tb <- tibble(loop = \group1\,
                 sumScore = a)
  b.tb <- tibble(loop = \group2\,
                 sumScore = b)
  
  data <- bind_rows(a.tb, b.tb) %>% drop_na()
  data$loop <- factor(data$loop, levels = c(\group1\, \group2\))
  
  p12 <- getPvalWilcox(data, \group1\, \group2\)
  p <-  ggplot(data, aes(x = loop, y = sumScore)) + 
    labs(x = NULL, y = paste0(name, \\nlog(avg peak score per anchor)\)) +
    geom_violin(aes(fill = loop), color = \black\,
                linewidth = lineThick * mmToLineUnit, lineend = \square\,
                show.legend = FALSE) +
    geom_boxplot(width = 0.1, color = \black\,
                 linewidth = lineThick * mmToLineUnit, lineend = \square\,
                 outlier.size = 1, outlier.stroke = NA) + theme_classic() +
    stat_summary(
      aes(group = loop), fun = mean,
      geom = \point\, shape = 21, size = 1,
      fill = \red\, color = \black\
    ) + theme(
      axis.title = element_text(
        size = fontSizeS, family = fontType, color = \#000000\
      ),
      axis.text = element_text(
        size = fontSizeS, family = fontType, color = \#000000\
      ),
      axis.text.x = element_text(
        angle = 45, hjust = 1, vjust = 1
      ),
      axis.line = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      axis.ticks = element_line(
        color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
      ),
      panel.background = element_rect(fill = \transparent\),
      legend.text = element_text(family = fontType, size = fontSizeS),
      legend.title = element_text(family = fontType, size = fontSizeS)
    ) + 
    #coord_cartesian(ylim = c(quantile(data$sumScore, 0.0), quantile(data$sumScore, 0.99))) + 
    annotate(
      \text\, x = 1, y = quantile(data$sumScore, 0.5),
      label = paste0(\p12: \, convPvalue(p12)),
      color = \black\, hjust = 0, size = 3
    ) 
  #+ scale_y_continuous(trans = \log10\)
  
  fileName <- paste0(\ChIP_peak_avgPeakScore_binaryGroup_\, name)
  width <- panelSize(2)*mmToInch
  height <- panelSize(2)*mmToInch
  png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
  print(p)
  dev.off()
  svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
  print(p)
  dev.off()
}

# Sum peak score
####
track <- import(here(refDir, \33248_CTCF_07-729_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.bed\))
plotSumScoresBinary(track, peak, \CTCF\, tss.5kb.group1, tss.5kb.group2)

track <- import(here(refDir, \33250_RAD21_ab992_Bruce-4_trim_q20_dedup_black_depthNorm.bw\), format = \BigWig\)
peak <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))
plotSumScoresBinary(track, peak, \RAD21\, tss.5kb.group1, tss.5kb.group2)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [2.36] Finding farthest P-S

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJEY21WaGRHVWdkR2hsSUdSaGRHRmNibVJoZEdFZ1BDMGdaR0YwWVM1bWNtRnRaU2hjYmlBZ1IzSnZkWEFnUFNCaktGd2lSM0p2ZFhBeFhDSXNJRndpUjNKdmRYQXlYQ0lwTEZ4dUlDQldZV3gxWlNBOUlHTW9NekV1TURNc0lERXdMalkwS1Z4dUtWeHVYRzRqSUVOeVpXRjBaU0IwYUdVZ1ltRnlJSEJzYjNSY2JuQWdQQzBnWjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1IzSnZkWEFzSUhrZ1BTQldZV3gxWlN3Z1ptbHNiQ0E5SUVkeWIzVndLU2tnS3lCY2JpQWdaMlZ2YlY5aVlYSW9jM1JoZENBOUlGd2lhV1JsYm5ScGRIbGNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzSUhkcFpIUm9JRDBnTUM0M0xDQmhiSEJvWVNBOUlEQXVOaXdnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlN4Y2JpQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWlrZ0t5QWpJRlZ6WlNCcFpHVnVkR2wwZVNCbWIzSWdjbUYzSUhaaGJIVmxjMXh1SUNCc1lXSnpLSGtnUFNCY0lpVWdiMllnVkZOVElHOXVJSE4wY21sd1pWd2lLU0FySUZ4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJQ0IwYUdWdFpTaGNiaUFnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3hjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNrc1hHNGdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hDSjBjbUZ1YzNCaGNtVnVkRndpS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdiR1ZuWlc1a0xuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLVnh1SUNBcFhHNWNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjSW5CbGNtTmZiMjVmYzNSeWFYQmxYMkpwYm1GeWVVZHliM1Z3WENJcFhHNTNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NUzR5TlNrcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzR5S1NwdGJWUnZTVzVqYUZ4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbiMgQ3JlYXRlIHRoZSBkYXRhXG5kYXRhIDwtIGRhdGEuZnJhbWUoXG4gIEdyb3VwID0gYyhcXEdyb3VwMVxcLCBcXEdyb3VwMlxcKSxcbiAgVmFsdWUgPSBjKDMxLjAzLCAxMC42NClcbilcblxuIyBDcmVhdGUgdGhlIGJhciBwbG90XG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IEdyb3VwLCB5ID0gVmFsdWUsIGZpbGwgPSBHcm91cCkpICsgXG4gIGdlb21fYmFyKHN0YXQgPSBcXGlkZW50aXR5XFwsIGNvbG9yID0gXFxibGFja1xcLCB3aWR0aCA9IDAuNywgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UsXG4gICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwpICsgIyBVc2UgaWRlbnRpdHkgZm9yIHJhdyB2YWx1ZXNcbiAgbGFicyh5ID0gXFwlIG9mIFRTUyBvbiBzdHJpcGVcXCkgKyBcbiAgdGhlbWVfY2xhc3NpYygpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxwZXJjX29uX3N0cmlwZV9iaW5hcnlHcm91cFxcKVxud2lkdGggPC0gcGFuZWxTaXplKDEuMjUpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2hcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
# Create the data
data <- data.frame(
  Group = c(\Group1\, \Group2\),
  Value = c(31.03, 10.64)
)

# Create the bar plot
p <- ggplot(data, aes(x = Group, y = Value, fill = Group)) + 
  geom_bar(stat = \identity\, color = \black\, width = 0.7, alpha = 0.6, show.legend = FALSE,
           linewidth = lineThick * mmToLineUnit, lineend = \square\) + # Use identity for raw values
  labs(y = \% of TSS on stripe\) + 
  theme_classic() +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- paste0(\perc_on_stripe_binaryGroup\)
width <- panelSize(1.25)*mmToInch
height <- panelSize(1.2)*mmToInch
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkRjbVZoZEdVZ2RHaGxJR1JoZEdGY2JtUmhkR0VnUEMwZ1pHRjBZUzVtY21GdFpTaGNiaUFnUjNKdmRYQWdQU0JqS0Z4Y1IzSnZkWEF4WEZ3c0lGeGNSM0p2ZFhBeVhGd3BMRnh1SUNCV1lXeDFaU0E5SUdNb016RXVNRE1zSURFd0xqWTBLVnh1S1Z4dVhHNGpJRU55WldGMFpTQjBhR1VnWW1GeUlIQnNiM1JjYm5BZ1BDMGdaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnUjNKdmRYQXNJSGtnUFNCV1lXeDFaU3dnWm1sc2JDQTlJRWR5YjNWd0tTa2dLeUJjYmlBZ1oyVnZiVjlpWVhJb2MzUmhkQ0E5SUZ4Y2FXUmxiblJwZEhsY1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NJSGRwWkhSb0lEMGdNQzQzTENCaGJIQm9ZU0E5SURBdU5pd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU3hjYmlBZ0lDQWdJQ0FnSUNBZ2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ2tnS3lBaklGVnpaU0JwWkdWdWRHbDBlU0JtYjNJZ2NtRjNJSFpoYkhWbGMxeHVJQ0JzWVdKektIa2dQU0JjWENVZ2IyWWdWRk5USUc5dUlITjBjbWx3WlZ4Y0tTQXJJRnh1SUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQjBhR1Z0WlNoY2JpQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTeGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5eGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NXNhVzVsSUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3hjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHbGphM01nUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWEZ4MGNtRnVjM0JoY21WdWRGeGNLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5a3NYRzRnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtWeHVJQ0FwWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNYSEJsY21OZmIyNWZjM1J5YVhCbFgySnBibUZ5ZVVkeWIzVndYRndwWEc1M2FXUjBhQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNHlOU2txYlcxVWIwbHVZMmhjYm1obGFXZG9kQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNHlLU3B0YlZSdlNXNWphRnh1YzNabmJHbDBaU2hvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXpkbWRjWENrcExDQWdhR1ZwWjJoMElEMGdhR1ZwWjJoMExDQjNhV1IwYUNBOUlIZHBaSFJvS1Z4dWNISnBiblFvY0NsY2JtUmxkaTV2Wm1Zb0tWeHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG4jIENyZWF0ZSB0aGUgZGF0YVxuZGF0YSA8LSBkYXRhLmZyYW1lKFxuICBHcm91cCA9IGMoXFxHcm91cDFcXCwgXFxHcm91cDJcXCksXG4gIFZhbHVlID0gYygzMS4wMywgMTAuNjQpXG4pXG5cbiMgQ3JlYXRlIHRoZSBiYXIgcGxvdFxucCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBHcm91cCwgeSA9IFZhbHVlLCBmaWxsID0gR3JvdXApKSArIFxuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBjb2xvciA9IFxcYmxhY2tcXCwgd2lkdGggPSAwLjcsIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFLFxuICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArICMgVXNlIGlkZW50aXR5IGZvciByYXcgdmFsdWVzXG4gIGxhYnMoeSA9IFxcJSBvZiBUU1Mgb24gc3RyaXBlXFwpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gIClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxccGVyY19vbl9zdHJpcGVfYmluYXJ5R3JvdXBcXClcbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjI1KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBDcmVhdGUgdGhlIGRhdGFcbmRhdGEgPC0gZGF0YS5mcmFtZShcbiAgR3JvdXAgPSBjKFxcR3JvdXAxXFwsIFxcR3JvdXAyXFwpLFxuICBWYWx1ZSA9IGMoMzEuMDMsIDEwLjY0KVxuKVxuXG4jIENyZWF0ZSB0aGUgYmFyIHBsb3RcbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gR3JvdXAsIHkgPSBWYWx1ZSwgZmlsbCA9IEdyb3VwKSkgKyBcbiAgZ2VvbV9iYXIoc3RhdCA9IFxcaWRlbnRpdHlcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHdpZHRoID0gMC43LCBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSxcbiAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCkgKyAjIFVzZSBpZGVudGl0eSBmb3IgcmF3IHZhbHVlc1xuICBsYWJzKHkgPSBcXCUgb2YgVFNTIG9uIHN0cmlwZVxcKSArIFxuICB0aGVtZV9jbGFzc2ljKCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXHBlcmNfb25fc3RyaXBlX2JpbmFyeUdyb3VwXFwpXG53aWR0aCA8LSBwYW5lbFNpemUoMS4yNSkqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaFxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
# Create the data
data <- data.frame(
  Group = c(\Group1\, \Group2\),
  Value = c(31.03, 10.64)
)

# Create the bar plot
p <- ggplot(data, aes(x = Group, y = Value, fill = Group)) + 
  geom_bar(stat = \identity\, color = \black\, width = 0.7, alpha = 0.6, show.legend = FALSE,
           linewidth = lineThick * mmToLineUnit, lineend = \square\) + # Use identity for raw values
  labs(y = \% of TSS on stripe\) + 
  theme_classic() +
  theme(
    axis.title = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )

fileName <- paste0(\perc_on_stripe_binaryGroup\)
width <- panelSize(1.25)*mmToInch
height <- panelSize(1.2)*mmToInch
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [3.37] Checking RAD21 level at tss

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR1Z0Y0NBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0prYVdabVgwY3hMbVJVUVVkZlJ6RXVNbWt1WkZSQlIxOTJjMTlITVM0eWFTNUVUVk5QTG5SemRsd2lLU2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWXlneExDQXlLU2xjYm1kbGJtVk1hWE4wSUR3dElDaDBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dWNGRHVnlibUZzWDJkbGJtVmZibUZ0WlNBbGFXNGxJR01vWENKTGJHWTBYQ0lzSUZ3aVZHSjRNMXdpTENCY0lrcDFibHdpTENCY0lrWnZjMnd5WENJc0lGd2lUWGxqWENJc0lGd2lVR2hzWkdFeFhDSXBLU2trWlc1elpXMWliRjluWlc1bFgybGtYRzVjYmlNZ1RFOUJSQ0JCVGs1UFZFRlVSVVFnVEU5UFVGeHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WkdsbVprTjFkRzltWmlBOExTQXdMakpjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hDSmZjQzF1WDJWdWMyVnRZbXhNYVhOMExuUnpkbHdpS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwWm1aRGRYUnZabVlnUFNCa2FXWm1RM1YwYjJabUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm01dlRHbHpkQ0E5SUdNb1hDSlFMVkJjSWl3Z1hDSlFMVVZjSWl3Z1hDSlFMVk5jSWl3Z1hDSlFMVmhjSWlrcEpUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9aR2x6ZEdGdVkyVWdQU0J6ZEdGeWRESWdMU0J6ZEdGeWRERXBYRzVjYm1acGJIUmxjbVZrVEc5dmNDQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loblpXNWxJQ1ZwYmlVZ1oyVnVaVXhwYzNRcFhHNW1kM0pwZEdVb1ptbHNkR1Z5WldSTWIyOXdMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRndpVUMxT1gzTmxiR1ZqZEdWa1IyVnVaUzVpWldSd1pWd2lLU2tzSUZ4dUlDQWdJQ0FnSUNBZ2MyVndJRDBnWENKY1hIUmNJaXdnWTI5c0xtNWhiV1Z6SUQwZ1JrRk1VMFVwWEc0Z0lGeHVkR1Z0Y0d4dmIzQWdQQzBnWm1sc2RHVnlaV1JNYjI5d0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtFRnVibTh5SUNWcGJpVWdZeWhjSWxBdFVGd2lMQ0JjSWxBdFJWd2lLU2xjYm1aM2NtbDBaU2gwWlcxd2JHOXZjQ3dnYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUhCaGMzUmxNQ2hjSWxBdFVFVmZjMlZzWldOMFpXUkhaVzVsTG1KbFpIQmxYQ0lwS1N3Z1hHNGdJQ0FnSUNBZ0lDQnpaWEFnUFNCY0lseGNkRndpTENCamIyd3VibUZ0WlhNZ1BTQkdRVXhUUlNsY2JpQWdYRzUwWlcxd2JHOXZjQ0E4TFNCbWFXeDBaWEpsWkV4dmIzQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9RVzV1YnpJZ0pXbHVKU0JqS0Z3aVVDMVRYQ0lwS1Z4dVpuZHlhWFJsS0hSbGJYQnNiMjl3TENCb1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0Z3aVVDMVRYM05sYkdWamRHVmtSMlZ1WlM1aVpXUndaVndpS1Nrc0lGeHVJQ0FnSUNBZ0lDQWdjMlZ3SUQwZ1hDSmNYSFJjSWl3Z1kyOXNMbTVoYldWeklEMGdSa0ZNVTBVcFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxudGVtcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyKSlcbmdlbmVMaXN0IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGV4dGVybmFsX2dlbmVfbmFtZSAlaW4lIGMoXFxLbGY0XFwsIFxcVGJ4M1xcLCBcXEp1blxcLCBcXEZvc2wyXFwsIFxcTXljXFwsIFxcUGhsZGExXFwpKSkkZW5zZW1ibF9nZW5lX2lkXG5cbiMgTE9BRCBBTk5PVEFURUQgTE9PUFxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpXG5cbmZpbHRlcmVkTG9vcCA8LSBnZW5lQW5ub0RhdGEgJT4lIHVubmVzdChnZW5lKSAlPiUgZHBseXI6OmZpbHRlcihnZW5lICVpbiUgZ2VuZUxpc3QpXG5md3JpdGUoZmlsdGVyZWRMb29wLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcUC1OX3NlbGVjdGVkR2VuZS5iZWRwZVxcKSksIFxuICAgICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG4gIFxudGVtcGxvb3AgPC0gZmlsdGVyZWRMb29wICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcKSlcbmZ3cml0ZSh0ZW1wbG9vcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXFAtUEVfc2VsZWN0ZWRHZW5lLmJlZHBlXFwpKSwgXG4gICAgICAgICBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbiAgXG50ZW1wbG9vcCA8LSBmaWx0ZXJlZExvb3AgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1TXFwpKVxuZndyaXRlKHRlbXBsb29wLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcUC1TX3NlbGVjdGVkR2VuZS5iZWRwZVxcKSksIFxuICAgICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
temp <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>% dplyr::select(c(1, 2))
geneList <- (temp %>% dplyr::filter(external_gene_name %in% c(\Klf4\, \Tbx3\, \Jun\, \Fosl2\, \Myc\, \Phlda1\)))$ensembl_gene_id

# LOAD ANNOTATED LOOP
name <- \chromo_cons_annoHierarchy\
diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>%
  dplyr::mutate(distance = start2 - start1)

filteredLoop <- geneAnnoData %>% unnest(gene) %>% dplyr::filter(gene %in% geneList)
fwrite(filteredLoop, here(consensusDir, paste0(\P-N_selectedGene.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  
temploop <- filteredLoop %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\))
fwrite(temploop, here(consensusDir, paste0(\P-PE_selectedGene.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  
temploop <- filteredLoop %>% dplyr::filter(Anno2 %in% c(\P-S\))
fwrite(temploop, here(consensusDir, paste0(\P-S_selectedGene.bedpe\)), 
         sep = \\t\, col.names = FALSE)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRHVnRjQ0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeGthV1ptWDBjeExtUlVRVWRmUnpFdU1ta3VaRlJCUjE5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx4Y0tTa2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9ZeWd4TENBeUtTbGNibWRsYm1WTWFYTjBJRHd0SUNoMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR1Y0ZEdWeWJtRnNYMmRsYm1WZmJtRnRaU0FsYVc0bElHTW9YRnhMYkdZMFhGd3NJRnhjVkdKNE0xeGNMQ0JjWEVwMWJseGNMQ0JjWEVadmMyd3lYRndzSUZ4Y1RYbGpYRndzSUZ4Y1VHaHNaR0V4WEZ3cEtTa2taVzV6WlcxaWJGOW5aVzVsWDJsa1hHNWNiaU1nVEU5QlJDQkJUazVQVkVGVVJVUWdURTlQVUZ4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVaR2xtWmtOMWRHOW1aaUE4TFNBd0xqSmNibWRsYm1WQmJtNXZSR0YwWVNBOExTQnNiMkZrVEc5dmNFRnVibTlFWVhSaEtHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb2JtRnRaU3dnWEZ4ZmNDMXVYMlZ1YzJWdFlteE1hWE4wTG5SemRseGNLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnBabVpEZFhSdlptWWdQU0JrYVdabVEzVjBiMlptTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhibTV2VEdsemRDQTlJR01vWEZ4UUxWQmNYQ3dnWEZ4UUxVVmNYQ3dnWEZ4UUxWTmNYQ3dnWEZ4UUxWaGNYQ2twSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pHbHpkR0Z1WTJVZ1BTQnpkR0Z5ZERJZ0xTQnpkR0Z5ZERFcFhHNWNibVpwYkhSbGNtVmtURzl2Y0NBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElIVnVibVZ6ZENoblpXNWxLU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuWlc1bElDVnBiaVVnWjJWdVpVeHBjM1FwWEc1bWQzSnBkR1VvWm1sc2RHVnlaV1JNYjI5d0xDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tGeGNVQzFPWDNObGJHVmpkR1ZrUjJWdVpTNWlaV1J3WlZ4Y0tTa3NJRnh1SUNBZ0lDQWdJQ0FnYzJWd0lEMGdYRnhjWEhSY1hDd2dZMjlzTG01aGJXVnpJRDBnUmtGTVUwVXBYRzRnSUZ4dWRHVnRjR3h2YjNBZ1BDMGdabWxzZEdWeVpXUk1iMjl3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0VGdWJtOHlJQ1ZwYmlVZ1l5aGNYRkF0VUZ4Y0xDQmNYRkF0UlZ4Y0tTbGNibVozY21sMFpTaDBaVzF3Ykc5dmNDd2dhR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaGNYRkF0VUVWZmMyVnNaV04wWldSSFpXNWxMbUpsWkhCbFhGd3BLU3dnWEc0Z0lDQWdJQ0FnSUNCelpYQWdQU0JjWEZ4Y2RGeGNMQ0JqYjJ3dWJtRnRaWE1nUFNCR1FVeFRSU2xjYmlBZ1hHNTBaVzF3Ykc5dmNDQThMU0JtYVd4MFpYSmxaRXh2YjNBZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1FXNXVieklnSldsdUpTQmpLRnhjVUMxVFhGd3BLVnh1Wm5keWFYUmxLSFJsYlhCc2IyOXdMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnY0dGemRHVXdLRnhjVUMxVFgzTmxiR1ZqZEdWa1IyVnVaUzVpWldSd1pWeGNLU2tzSUZ4dUlDQWdJQ0FnSUNBZ2MyVndJRDBnWEZ4Y1hIUmNYQ3dnWTI5c0xtNWhiV1Z6SUQwZ1JrRk1VMFVwWEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxudGVtcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyKSlcbmdlbmVMaXN0IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGV4dGVybmFsX2dlbmVfbmFtZSAlaW4lIGMoXFxLbGY0XFwsIFxcVGJ4M1xcLCBcXEp1blxcLCBcXEZvc2wyXFwsIFxcTXljXFwsIFxcUGhsZGExXFwpKSkkZW5zZW1ibF9nZW5lX2lkXG5cbiMgTE9BRCBBTk5PVEFURUQgTE9PUFxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpXG5cbmZpbHRlcmVkTG9vcCA8LSBnZW5lQW5ub0RhdGEgJT4lIHVubmVzdChnZW5lKSAlPiUgZHBseXI6OmZpbHRlcihnZW5lICVpbiUgZ2VuZUxpc3QpXG5md3JpdGUoZmlsdGVyZWRMb29wLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcUC1OX3NlbGVjdGVkR2VuZS5iZWRwZVxcKSksIFxuICAgICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG4gIFxudGVtcGxvb3AgPC0gZmlsdGVyZWRMb29wICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcKSlcbmZ3cml0ZSh0ZW1wbG9vcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXFAtUEVfc2VsZWN0ZWRHZW5lLmJlZHBlXFwpKSwgXG4gICAgICAgICBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbiAgXG50ZW1wbG9vcCA8LSBmaWx0ZXJlZExvb3AgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1TXFwpKVxuZndyaXRlKHRlbXBsb29wLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcUC1TX3NlbGVjdGVkR2VuZS5iZWRwZVxcKSksIFxuICAgICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVtcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyKSlcbmdlbmVMaXN0IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGV4dGVybmFsX2dlbmVfbmFtZSAlaW4lIGMoXFxLbGY0XFwsIFxcVGJ4M1xcLCBcXEp1blxcLCBcXEZvc2wyXFwsIFxcTXljXFwsIFxcUGhsZGExXFwpKSkkZW5zZW1ibF9nZW5lX2lkXG5cbiMgTE9BRCBBTk5PVEFURUQgTE9PUFxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuZGlmZkN1dG9mZiA8LSAwLjJcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLVBcXCwgXFxQLUVcXCwgXFxQLVNcXCwgXFxQLVhcXCkpJT4lXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpXG5cbmZpbHRlcmVkTG9vcCA8LSBnZW5lQW5ub0RhdGEgJT4lIHVubmVzdChnZW5lKSAlPiUgZHBseXI6OmZpbHRlcihnZW5lICVpbiUgZ2VuZUxpc3QpXG5md3JpdGUoZmlsdGVyZWRMb29wLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcUC1OX3NlbGVjdGVkR2VuZS5iZWRwZVxcKSksIFxuICAgICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG4gIFxudGVtcGxvb3AgPC0gZmlsdGVyZWRMb29wICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtUFxcLCBcXFAtRVxcKSlcbmZ3cml0ZSh0ZW1wbG9vcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXFAtUEVfc2VsZWN0ZWRHZW5lLmJlZHBlXFwpKSwgXG4gICAgICAgICBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbiAgXG50ZW1wbG9vcCA8LSBmaWx0ZXJlZExvb3AgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUC1TXFwpKVxuZndyaXRlKHRlbXBsb29wLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcUC1TX3NlbGVjdGVkR2VuZS5iZWRwZVxcKSksIFxuICAgICAgICAgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5gYGBcbmBgYCJ9 -->

```r
```r
temp <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>% dplyr::select(c(1, 2))
geneList <- (temp %>% dplyr::filter(external_gene_name %in% c(\Klf4\, \Tbx3\, \Jun\, \Fosl2\, \Myc\, \Phlda1\)))$ensembl_gene_id

# LOAD ANNOTATED LOOP
name <- \chromo_cons_annoHierarchy\
diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>%
  dplyr::mutate(distance = start2 - start1)

filteredLoop <- geneAnnoData %>% unnest(gene) %>% dplyr::filter(gene %in% geneList)
fwrite(filteredLoop, here(consensusDir, paste0(\P-N_selectedGene.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  
temploop <- filteredLoop %>% dplyr::filter(Anno2 %in% c(\P-P\, \P-E\))
fwrite(temploop, here(consensusDir, paste0(\P-PE_selectedGene.bedpe\)), 
         sep = \\t\, col.names = FALSE)
  
temploop <- filteredLoop %>% dplyr::filter(Anno2 %in% c(\P-S\))
fwrite(temploop, here(consensusDir, paste0(\P-S_selectedGene.bedpe\)), 
         sep = \\t\, col.names = FALSE)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [3.38] Stripe percentage

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc0aklFbE5VRTlTVkNCVExWTWdiRzl2Y0hOY2JtRnNiRXh2YjNCeklEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIa3VkSE4yWENJcEtWeHVjM1J5VEc5dmNITWdQQzBnWVd4c1RHOXZjSE1nSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvUVc1dWJ6SWdKV2x1SlNCaktGd2lVeTFUWENJcEtWeHVkR1Z0Y0NBOExTQnpkSEpNYjI5d2N5QWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLREVzSURJc0lEWXBLVnh1WTI5c2JtRnRaWE1vZEdWdGNDa2dQQzBnWXloY0ltTm9jbTl0WENJc0lGd2ljM1JoY25SY0lpd2dYQ0psYm1SY0lpbGNibk4wY2t4dmIzQnpSM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0hSbGJYQXBYRzVjYmlNZ1NVMVFUMUpVSUZSVFUxeHVabXhoYm10VGFYcGxJRHd0SURFd1hHNW5aVzVsTG5SaUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW0xdE1UQmZSMUpEYlRNNExuQTJYMmRsYm1WZmMyOXlkR1ZrTG1KbFpGd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1ZGTlRJRDBnYVdabGJITmxLRlkwSUQwOUlGd2lLMXdpTENCV01pd2dWak1wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSVFUzTjBZWEowSUQwZ1ZGTlRJQzBnWm14aGJtdFRhWHBsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSVFUyVnVaQ0E5SUZSVFV5QXJJR1pzWVc1clUybDZaU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1ZqRXNJRlJUVTNOMFlYSjBMQ0JVVTFObGJtUXNJRlkyTENCV05TbGNibU52Ykc1aGJXVnpLR2RsYm1VdWRHSXBJRHd0SUdNb1hDSmphSEp2YlZ3aUxDQmNJbk4wWVhKMFhDSXNJRndpWlc1a1hDSXNJRndpWlc1elpXMWliRndpTENCY0ltZGxibVZjSWlsY2JtZGxibVZIY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1oyVnVaUzUwWWl3Z2EyVmxjQzVsZUhSeVlTNWpiMngxYlc1eklEMGdWRkpWUlNsY2JseHVYRzRqSUVacGJtUWdiM1psY214aGNITWdZbVYwZDJWbGJpQnNiMjl3Y3lCaGJtUWdWRk5UWEc1dmRtVnliR0Z3Y3lBOExTQm1hVzVrVDNabGNteGhjSE1vWjJWdVpVZHlMQ0J6ZEhKTWIyOXdjMGR5S1Z4dVhHNGpJRUZ1Ym05MFlYUmxJRzkyWlhKc1lYQnpYRzUwYzNOZmQybDBhRjlzYjI5d2N5QThMU0JuWlc1bFIzSmJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjFjYm14dmIzQnpYM2RwZEdoZmRITnpJRHd0SUhOMGNreHZiM0J6UjNKYmMzVmlhbVZqZEVocGRITW9iM1psY214aGNITXBYVnh1WEc0aklFTnZiV0pwYm1VZ2FXNTBieUJoSUdSaGRHRWdabkpoYldVZ1ptOXlJSEJ5YjJObGMzTnBibWRjYm14dmIzQmZaR0YwWVNBOExTQmtZWFJoTG1aeVlXMWxLR2RsYm1VZ1BTQjBjM05mZDJsMGFGOXNiMjl3Y3lSbGJuTmxiV0pzTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNGOWphSElnUFNCelpYRnVZVzFsY3loc2IyOXdjMTkzYVhSb1gzUnpjeWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d1gzTjBZWEowSUQwZ2MzUmhjblFvYkc5dmNITmZkMmwwYUY5MGMzTXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0Y5bGJtUWdQU0JsYm1Rb2JHOXZjSE5mZDJsMGFGOTBjM01wTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkc5dmNGOTNhV1IwYUNBOUlIZHBaSFJvS0d4dmIzQnpYM2RwZEdoZmRITnpLU2xjYmx4dUl5QkpaR1Z1ZEdsbWVTQjBhR1VnYkdGeVoyVnpkQ0JzYjI5d0lHWnZjaUJsWVdOb0lHZGxibVZjYm14aGNtZGxjM1JmYkc5dmNITWdQQzBnYkc5dmNGOWtZWFJoVzI5eVpHVnlLR3h2YjNCZlpHRjBZU1JuWlc1bExDQXRiRzl2Y0Y5a1lYUmhKR3h2YjNCZmQybGtkR2dwTENCZFhHNXNZWEpuWlhOMFgyeHZiM0J6SUR3dElHeGhjbWRsYzNSZmJHOXZjSE5iSVdSMWNHeHBZMkYwWldRb2JHRnlaMlZ6ZEY5c2IyOXdjeVJuWlc1bEtTd2dYVnh1YkdGeVoyVnpkRjlzYjI5d2N5QThMU0JzWVhKblpYTjBYMnh2YjNCeklDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHeHZiM0JKUkNBOUlIQmhjM1JsS0d4dmIzQmZZMmh5TENCc2IyOXdYM04wWVhKMExDQnNiMjl3WDJWdVpDd2djMlZ3SUQwZ1hDSmZYQ0lwS1Z4dWJHRnlaMlZ6ZEY5c2IyOXdjeUE4TFNCc1lYSm5aWE4wWDJ4dmIzQnpXMjl5WkdWeUtHeGhjbWRsYzNSZmJHOXZjSE1rYkc5dmNGOWphSElzSUd4aGNtZGxjM1JmYkc5dmNITWtiRzl2Y0Y5emRHRnlkQ2tzWFZ4dWNtOTNibUZ0WlhNb2JHRnlaMlZ6ZEY5c2IyOXdjeWtnUEMwZ1RsVk1URnh1WEc0aklFTm9aV05yYVc1bklITnRZV3hzWlhJZ2JHOXZjSE5jYm1Gc2JFeHZiM0J6UjNJZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtHRnNiRXh2YjNCekxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGNXNWhiV1Z6TG1acFpXeGtJRDBnWENKamFISnZiVEZjSWl3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZEdGeWRDNW1hV1ZzWkNBOUlGd2ljM1JoY25ReFhDSXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pXNWtMbVpwWld4a0lEMGdYQ0psYm1ReVhDSXBYRzVzWVhKblpYTjBURzl2Y0hOSGNpQThMU0J0WVd0bFIxSmhibWRsYzBaeWIyMUVZWFJoUm5KaGJXVW9iR0Z5WjJWemRGOXNiMjl3Y3l3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnhibUZ0WlhNdVptbGxiR1FnUFNCY0lteHZiM0JmWTJoeVhDSXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE4wWVhKMExtWnBaV3hrSUQwZ1hDSnNiMjl3WDNOMFlYSjBYQ0lzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWdVpDNW1hV1ZzWkNBOUlGd2liRzl2Y0Y5bGJtUmNJaWxjYm14aGNtZGxjM1JNYjI5d2MwZHlJRHd0SUhOdmNuUW9kVzVwY1hWbEtHeGhjbWRsYzNSTWIyOXdjMGR5S1NsY2JtTnZiWEJzWlhSbFgyOTJaWEpzWVhCeklEd3RJSE4xWW5ObGRFSjVUM1psY214aGNITW9ZV3hzVEc5dmNITkhjaXdnYkdGeVoyVnpkRXh2YjNCelIzSXNJSFI1Y0dVZ1BTQmNJbmRwZEdocGJsd2lLVnh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR052YlhCc1pYUmxYMjkyWlhKc1lYQnpMQ0JzWVhKblpYTjBURzl2Y0hOSGNpbGNibHh1WEc1amIyMXdiR1YwWlU5MlpYSnNZWEJFWmlBOExTQmhjeTVrWVhSaExtWnlZVzFsS0dOdmJYQnNaWFJsWDI5MlpYSnNZWEJ6S1NBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoc2IyOXdTVVJCYkd3Z1BTQndZWE4wWlNoelpYRnVZVzFsY3l3Z2MzUmhjblFzSUdWdVpDd2djMlZ3SUQwZ1hDSmZYQ0lwS1Z4dWJHRnlaMlZ6ZEV4dmIzQnpSR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hzWVhKblpYTjBURzl2Y0hOSGNpa2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9iRzl2Y0VsRUlEMGdjR0Z6ZEdVb2MyVnhibUZ0WlhNc0lITjBZWEowTENCbGJtUXNJSE5sY0NBOUlGd2lYMXdpS1NsY2JseHViRzl2Y0VsRWNHRnBjbk1nUEMwZ1pHRjBZUzVtY21GdFpTaHNiMjl3U1VRZ1BTQmpiMjF3YkdWMFpVOTJaWEpzWVhCRVppUnNiMjl3U1VSQmJHeGJjWFZsY25sSWFYUnpLRzkyWlhKc1lYQnpLVjBzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQkpSRElnUFNCc1lYSm5aWE4wVEc5dmNITkVaaVJzYjI5d1NVUmJjM1ZpYW1WamRFaHBkSE1vYjNabGNteGhjSE1wWFNsY2JseHVZV3hzVEc5dmNITkJibTV2ZEdGMFpXUWdQQzBnWVd4c1RHOXZjSE1nSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvYkc5dmNFbEVJRDBnY0dGemRHVW9ZMmh5YjIweExDQnpkR0Z5ZERFc0lHVnVaRElzSUhObGNDQTlJRndpWDF3aUtTa2dKVDRsSUdSd2JIbHlPanBzWldaMFgycHZhVzRvYkc5dmNFbEVjR0ZwY25Nc0lHSjVJRDBnWXloY0lteHZiM0JKUkZ3aUtTbGNibHh1ZEdWdGNDQThMU0JoYkd4TWIyOXdjMEZ1Ym05MFlYUmxaQ0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhCYm01dk1pQWxhVzRsSUdNb1hDSlFMVVZjSWl3Z1hDSlFMVkJjSWl3Z1hDSkZMVVZjSWlrcElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHaGhjMU5USUQwZ0lXbHpMbTVoS0d4dmIzQkpSRElwS1Z4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lob1lYTlRVeUE5UFdkeWIzVndNU2tnS1NSa2FXWm1YMlJVUVVkZlJFMVRUMXh1SUNCa2FYTjBZVzVqWlRJZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2FHRnpVMU1nUFQxbmNtOTFjRElwSUNra1pHbG1abDlrVkVGSFgwUk5VMDljYmlBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SUNCeVpYUjFjbTRvZDJsc0pIQXVkbUZzZFdVcFhHNTlYRzV3ZGlBOExTQmpiMjUyVUhaaGJIVmxLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnVkZKVlJTd2dSa0ZNVTBVcEtWeHVaMmR3Ykc5MEtIUmxiWEFzSUdGbGN5aDRJRDBnYUdGelUxTXNJSGtnUFNCa2FXWm1YMlJVUVVkZlJFMVRUeWtwSUNzZ1oyVnZiVjkyYVc5c2FXNG9ZV1Z6S0dacGJHd2dQU0JvWVhOVFV5a3NJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ1hHNGdJR2RsYjIxZlltOTRjR3h2ZENoM2FXUjBhQ0E5SURBdU1Td2diM1YwYkdsbGNpNXphR0Z3WlNBOUlFNUJLU0FyWEc0Z0lITjBZWFJmYzNWdGJXRnllU2hoWlhNb1ozSnZkWEFnUFNCb1lYTlRVeWtzSUdaMWJpQTlJRzFsWVc0c0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1oyVnZiU0E5SUZ3aWNHOXBiblJjSWl3Z2MyaGhjR1VnUFNBeU1Td2djMmw2WlNBOUlESXNJR1pwYkd3Z1BTQmNJbkpsWkZ3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpa2dLMXh1SUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnSzF4dUlDQmhibTV2ZEdGMFpTaGNJblJsZUhSY0lpd2dlQ0E5SURFc0lIa2dQU0F3TENCc1lXSmxiQ0E5SUhCMkxDQnphWHBsSUQwZ05Td2dZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXBJQ3RjYmlBZ1oyZDBhWFJzWlNoY0lsQkZMVkJGWENJcElDc2daMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01DbGNibHh1WEc0aklFTnZkVzUwYVc1bklHeHZiM0FnZEhsd1pYTmNibUZzYkV4dmIzQnpRVzV1YjNSaGRHVmtSbWxzZEdWeVpXUWdQQzBnWVd4c1RHOXZjSE5CYm01dmRHRjBaV1FnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvSVdsekxtNWhLR3h2YjNCSlJESXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lnaEtHeHZiM0JKUkNBOVBTQnNiMjl3U1VReUtTbGNiblJsYlhBZ1BDMGdZV3hzVEc5dmNITkJibTV2ZEdGMFpXUkdhV3gwWlhKbFpDQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaHNiMjl3U1VReUxDQkJibTV2TWlsY2JuSmxjM1ZzZENBOExTQjBaVzF3SUNVK0pWeHVJQ0JuY205MWNGOWllU2hzYjI5d1NVUXlMQ0JCYm01dk1pa2dKVDRsWEc0Z0lITjFiVzFoY21selpTaGpiM1Z1ZENBOUlHNG9LU3dnTG1keWIzVndjeUE5SUNka2NtOXdKeWtnSlQ0bFhHNGdJR2R5YjNWd1gySjVLR3h2YjNCSlJESXBJQ1UrSlZ4dUlDQnRkWFJoZEdVb1puSmxjWFZsYm1ONUlEMGdZMjkxYm5RZ0x5QnpkVzBvWTI5MWJuUXBLU0FsUGlWY2JpQWdZWEp5WVc1blpTaHNiMjl3U1VReUxDQkJibTV2TWlsY2JseHVjbVZ6ZFd4MElEd3RJR3hoY21kbGMzUmZiRzl2Y0hNZ0pUNGxJR1J3YkhseU9qcHNaV1owWDJwdmFXNG9jbVZ6ZFd4MExDQmllU0E5SUdNb1hDSnNiMjl3U1VSY0lpQTlJRndpYkc5dmNFbEVNbHdpS1NsY2JseHVaMlZ1WlM1bmNtOTFjREVnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJKcGJtRnllVWR5YjNWd01TNTBjM1pjSWlrcEpHZGxibVZjYm1kbGJtVXVaM0p2ZFhBeUlEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREl1ZEhOMlhDSXBLU1JuWlc1bFhHNWNibVJoZEdFZ1BDMGdkR2xpWW14bEtGeHVJQ0JuWlc1bElEMGdZeWhuWlc1bExtZHliM1Z3TVN3Z1oyVnVaUzVuY205MWNESXBMRnh1SUNCbmNtOTFjQ0E5SUdNb2NtVndLRndpWjNKdmRYQXhYQ0lzSUd4bGJtZDBhQ2huWlc1bExtZHliM1Z3TVNrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnY21Wd0tGd2laM0p2ZFhBeVhDSXNJR3hsYm1kMGFDaG5aVzVsTG1keWIzVndNaWtwS1Z4dUtWeHVYRzVrWVhSaElEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHNaV1owWDJwdmFXNG9jbVZ6ZFd4MExDQmllU0E5SUdNb1hDSm5aVzVsWENJcEtWeHVaR0YwWVNBOExTQmtZWFJoSUNVK0pTQm1hV3gwWlhJb1kyOXRjR3hsZEdVdVkyRnpaWE1vTGlrcFhHNWNibUZzYkY5aGJtNXZNaUE4TFNCMWJtbHhkV1VvWkdGMFlTUkJibTV2TWlsY2JseHVJeUJEWVd4amRXeGhkR1VnWVhabGNtRm5aU0JtY21WeGRXVnVZM2tnYjJZZ1FXNXVieklnWm05eUlHVmhZMmdnWjJWdVpTQnBiaUJsWVdOb0lHZHliM1Z3WEc1eVpYTjFiSFFnUEMwZ1pHRjBZU0FsUGlWY2JpQWdJeUJGYm5OMWNtVWdZV3hzSUhCdmMzTnBZbXhsSUVGdWJtOHlJSFpoYkhWbGN5QmhjbVVnY0hKbGMyVnVkQ0JtYjNJZ1pXRmphQ0JuWlc1bElHRnVaQ0JuY205MWNGeHVJQ0JqYjIxd2JHVjBaU2huWlc1bExDQkJibTV2TWlBOUlHRnNiRjloYm01dk1pd2dabWxzYkNBOUlHeHBjM1FvWm5KbGNYVmxibU41SUQwZ01Da3BJQ1UrSlNCY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUdOaGMyVmZkMmhsYmloY2JpQWdJQ0JuWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0RFZ2ZpQmNJbWR5YjNWd01Wd2lMRnh1SUNBZ0lHZGxibVVnSldsdUpTQm5aVzVsTG1keWIzVndNaUIrSUZ3aVozSnZkWEF5WENJc1hHNGdJQ0FnVkZKVlJTQitJRTVCWEc0Z0lDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dkeWIzVndMQ0JCYm01dk1pd2dabkpsY1hWbGJtTjVLVnh1SUNCY2JseHVaMmR3Ykc5MEtISmxjM1ZzZEN3Z1lXVnpLSGdnUFNCQmJtNXZNaXdnWm1sc2JDQTlJR2R5YjNWd0xDQjVJRDBnWm5KbGNYVmxibU41S1NrZ0t5Qm5aVzl0WDJKdmVIQnNiM1FvS1Z4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG4jIElNUE9SVCBTLVMgbG9vcHNcbmFsbExvb3BzIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKVxuc3RyTG9vcHMgPC0gYWxsTG9vcHMgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUy1TXFwpKVxudGVtcCA8LSBzdHJMb29wcyAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDYpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnN0ckxvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5cbiMgSU1QT1JUIFRTU1xuZmxhbmtTaXplIDwtIDEwXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLFxuICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLFxuICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY2LCBWNSlcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcZW5zZW1ibFxcLCBcXGdlbmVcXClcbmdlbmVHciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS50Yiwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSlcblxuXG4jIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBsb29wcyBhbmQgVFNTXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoZ2VuZUdyLCBzdHJMb29wc0dyKVxuXG4jIEFubm90YXRlIG92ZXJsYXBzXG50c3Nfd2l0aF9sb29wcyA8LSBnZW5lR3JbcXVlcnlIaXRzKG92ZXJsYXBzKV1cbmxvb3BzX3dpdGhfdHNzIDwtIHN0ckxvb3BzR3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXVxuXG4jIENvbWJpbmUgaW50byBhIGRhdGEgZnJhbWUgZm9yIHByb2Nlc3Npbmdcbmxvb3BfZGF0YSA8LSBkYXRhLmZyYW1lKGdlbmUgPSB0c3Nfd2l0aF9sb29wcyRlbnNlbWJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9jaHIgPSBzZXFuYW1lcyhsb29wc193aXRoX3RzcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wX3N0YXJ0ID0gc3RhcnQobG9vcHNfd2l0aF90c3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9lbmQgPSBlbmQobG9vcHNfd2l0aF90c3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF93aWR0aCA9IHdpZHRoKGxvb3BzX3dpdGhfdHNzKSlcblxuIyBJZGVudGlmeSB0aGUgbGFyZ2VzdCBsb29wIGZvciBlYWNoIGdlbmVcbmxhcmdlc3RfbG9vcHMgPC0gbG9vcF9kYXRhW29yZGVyKGxvb3BfZGF0YSRnZW5lLCAtbG9vcF9kYXRhJGxvb3Bfd2lkdGgpLCBdXG5sYXJnZXN0X2xvb3BzIDwtIGxhcmdlc3RfbG9vcHNbIWR1cGxpY2F0ZWQobGFyZ2VzdF9sb29wcyRnZW5lKSwgXVxubGFyZ2VzdF9sb29wcyA8LSBsYXJnZXN0X2xvb3BzICU+JSBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKGxvb3BfY2hyLCBsb29wX3N0YXJ0LCBsb29wX2VuZCwgc2VwID0gXFxfXFwpKVxubGFyZ2VzdF9sb29wcyA8LSBsYXJnZXN0X2xvb3BzW29yZGVyKGxhcmdlc3RfbG9vcHMkbG9vcF9jaHIsIGxhcmdlc3RfbG9vcHMkbG9vcF9zdGFydCksXVxucm93bmFtZXMobGFyZ2VzdF9sb29wcykgPC0gTlVMTFxuXG4jIENoZWNraW5nIHNtYWxsZXIgbG9vcHNcbmFsbExvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGFsbExvb3BzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcW5hbWVzLmZpZWxkID0gXFxjaHJvbTFcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydC5maWVsZCA9IFxcc3RhcnQxXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLmZpZWxkID0gXFxlbmQyXFwpXG5sYXJnZXN0TG9vcHNHciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUobGFyZ2VzdF9sb29wcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxbmFtZXMuZmllbGQgPSBcXGxvb3BfY2hyXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LmZpZWxkID0gXFxsb29wX3N0YXJ0XFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5maWVsZCA9IFxcbG9vcF9lbmRcXClcbmxhcmdlc3RMb29wc0dyIDwtIHNvcnQodW5pcXVlKGxhcmdlc3RMb29wc0dyKSlcbmNvbXBsZXRlX292ZXJsYXBzIDwtIHN1YnNldEJ5T3ZlcmxhcHMoYWxsTG9vcHNHciwgbGFyZ2VzdExvb3BzR3IsIHR5cGUgPSBcXHdpdGhpblxcKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGNvbXBsZXRlX292ZXJsYXBzLCBsYXJnZXN0TG9vcHNHcilcblxuXG5jb21wbGV0ZU92ZXJsYXBEZiA8LSBhcy5kYXRhLmZyYW1lKGNvbXBsZXRlX292ZXJsYXBzKSAlPiUgZHBseXI6Om11dGF0ZShsb29wSURBbGwgPSBwYXN0ZShzZXFuYW1lcywgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpKVxubGFyZ2VzdExvb3BzRGYgPC0gYXMuZGF0YS5mcmFtZShsYXJnZXN0TG9vcHNHcikgJT4lIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoc2VxbmFtZXMsIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSlcblxubG9vcElEcGFpcnMgPC0gZGF0YS5mcmFtZShsb29wSUQgPSBjb21wbGV0ZU92ZXJsYXBEZiRsb29wSURBbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJRDIgPSBsYXJnZXN0TG9vcHNEZiRsb29wSURbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYWxsTG9vcHNBbm5vdGF0ZWQgPC0gYWxsTG9vcHMgJT4lIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIGVuZDIsIHNlcCA9IFxcX1xcKSkgJT4lIGRwbHlyOjpsZWZ0X2pvaW4obG9vcElEcGFpcnMsIGJ5ID0gYyhcXGxvb3BJRFxcKSlcblxudGVtcCA8LSBhbGxMb29wc0Fubm90YXRlZCAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLUVcXCwgXFxQLVBcXCwgXFxFLUVcXCkpICU+JSBkcGx5cjo6bXV0YXRlKGhhc1NTID0gIWlzLm5hKGxvb3BJRDIpKVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PWdyb3VwMSkgKSRkaWZmX2RUQUdfRE1TT1xuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaGFzU1MgPT1ncm91cDIpICkkZGlmZl9kVEFHX0RNU09cbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5wdiA8LSBjb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgVFJVRSwgRkFMU0UpKVxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gaGFzU1MsIHkgPSBkaWZmX2RUQUdfRE1TTykpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBoYXNTUyksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBoYXNTUyksIGZ1biA9IG1lYW4sIFxuICAgICAgICAgICAgICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHB2LCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2d0aXRsZShcXFBFLVBFXFwpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcblxuXG4jIENvdW50aW5nIGxvb3AgdHlwZXNcbmFsbExvb3BzQW5ub3RhdGVkRmlsdGVyZWQgPC0gYWxsTG9vcHNBbm5vdGF0ZWQgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGxvb3BJRDIpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighKGxvb3BJRCA9PSBsb29wSUQyKSlcbnRlbXAgPC0gYWxsTG9vcHNBbm5vdGF0ZWRGaWx0ZXJlZCAlPiUgZHBseXI6OnNlbGVjdChsb29wSUQyLCBBbm5vMilcbnJlc3VsdCA8LSB0ZW1wICU+JVxuICBncm91cF9ieShsb29wSUQyLCBBbm5vMikgJT4lXG4gIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lXG4gIGdyb3VwX2J5KGxvb3BJRDIpICU+JVxuICBtdXRhdGUoZnJlcXVlbmN5ID0gY291bnQgLyBzdW0oY291bnQpKSAlPiVcbiAgYXJyYW5nZShsb29wSUQyLCBBbm5vMilcblxucmVzdWx0IDwtIGxhcmdlc3RfbG9vcHMgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ocmVzdWx0LCBieSA9IGMoXFxsb29wSURcXCA9IFxcbG9vcElEMlxcKSlcblxuZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cbmRhdGEgPC0gdGliYmxlKFxuICBnZW5lID0gYyhnZW5lLmdyb3VwMSwgZ2VuZS5ncm91cDIpLFxuICBncm91cCA9IGMocmVwKFxcZ3JvdXAxXFwsIGxlbmd0aChnZW5lLmdyb3VwMSkpLFxuICAgICAgICAgICAgcmVwKFxcZ3JvdXAyXFwsIGxlbmd0aChnZW5lLmdyb3VwMikpKVxuKVxuXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ocmVzdWx0LCBieSA9IGMoXFxnZW5lXFwpKVxuZGF0YSA8LSBkYXRhICU+JSBmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpXG5cbmFsbF9hbm5vMiA8LSB1bmlxdWUoZGF0YSRBbm5vMilcblxuIyBDYWxjdWxhdGUgYXZlcmFnZSBmcmVxdWVuY3kgb2YgQW5ubzIgZm9yIGVhY2ggZ2VuZSBpbiBlYWNoIGdyb3VwXG5yZXN1bHQgPC0gZGF0YSAlPiVcbiAgIyBFbnN1cmUgYWxsIHBvc3NpYmxlIEFubm8yIHZhbHVlcyBhcmUgcHJlc2VudCBmb3IgZWFjaCBnZW5lIGFuZCBncm91cFxuICBjb21wbGV0ZShnZW5lLCBBbm5vMiA9IGFsbF9hbm5vMiwgZmlsbCA9IGxpc3QoZnJlcXVlbmN5ID0gMCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihcbiAgICBnZW5lICVpbiUgZ2VuZS5ncm91cDEgfiBcXGdyb3VwMVxcLFxuICAgIGdlbmUgJWluJSBnZW5lLmdyb3VwMiB+IFxcZ3JvdXAyXFwsXG4gICAgVFJVRSB+IE5BXG4gICkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGdyb3VwLCBBbm5vMiwgZnJlcXVlbmN5KVxuICBcblxuZ2dwbG90KHJlc3VsdCwgYWVzKHggPSBBbm5vMiwgZmlsbCA9IGdyb3VwLCB5ID0gZnJlcXVlbmN5KSkgKyBnZW9tX2JveHBsb3QoKVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
name <- \chromo_cons_annoHierarchy\

# IMPORT S-S loops
allLoops <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\))
strLoops <- allLoops %>% dplyr::filter(Anno2 %in% c(\S-S\))
temp <- strLoops %>% dplyr::select(c(1, 2, 6))
colnames(temp) <- c(\chrom\, \start\, \end\)
strLoopsGr <- makeGRangesFromDataFrame(temp)

# IMPORT TSS
flankSize <- 10
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6, V5)
colnames(gene.tb) <- c(\chrom\, \start\, \end\, \ensembl\, \gene\)
geneGr <- makeGRangesFromDataFrame(gene.tb, keep.extra.columns = TRUE)


# Find overlaps between loops and TSS
overlaps <- findOverlaps(geneGr, strLoopsGr)

# Annotate overlaps
tss_with_loops <- geneGr[queryHits(overlaps)]
loops_with_tss <- strLoopsGr[subjectHits(overlaps)]

# Combine into a data frame for processing
loop_data <- data.frame(gene = tss_with_loops$ensembl,
                        loop_chr = seqnames(loops_with_tss),
                        loop_start = start(loops_with_tss),
                        loop_end = end(loops_with_tss),
                        loop_width = width(loops_with_tss))

# Identify the largest loop for each gene
largest_loops <- loop_data[order(loop_data$gene, -loop_data$loop_width), ]
largest_loops <- largest_loops[!duplicated(largest_loops$gene), ]
largest_loops <- largest_loops %>% dplyr::mutate(loopID = paste(loop_chr, loop_start, loop_end, sep = \_\))
largest_loops <- largest_loops[order(largest_loops$loop_chr, largest_loops$loop_start),]
rownames(largest_loops) <- NULL

# Checking smaller loops
allLoopsGr <- makeGRangesFromDataFrame(allLoops, 
                                       seqnames.field = \chrom1\, 
                                       start.field = \start1\, 
                                       end.field = \end2\)
largestLoopsGr <- makeGRangesFromDataFrame(largest_loops, 
                                           seqnames.field = \loop_chr\, 
                                           start.field = \loop_start\, 
                                           end.field = \loop_end\)
largestLoopsGr <- sort(unique(largestLoopsGr))
complete_overlaps <- subsetByOverlaps(allLoopsGr, largestLoopsGr, type = \within\)
overlaps <- findOverlaps(complete_overlaps, largestLoopsGr)


completeOverlapDf <- as.data.frame(complete_overlaps) %>% dplyr::mutate(loopIDAll = paste(seqnames, start, end, sep = \_\))
largestLoopsDf <- as.data.frame(largestLoopsGr) %>% dplyr::mutate(loopID = paste(seqnames, start, end, sep = \_\))

loopIDpairs <- data.frame(loopID = completeOverlapDf$loopIDAll[queryHits(overlaps)],
                          loopID2 = largestLoopsDf$loopID[subjectHits(overlaps)])

allLoopsAnnotated <- allLoops %>% dplyr::mutate(loopID = paste(chrom1, start1, end2, sep = \_\)) %>% dplyr::left_join(loopIDpairs, by = c(\loopID\))

temp <- allLoopsAnnotated %>% dplyr::filter(Anno2 %in% c(\P-E\, \P-P\, \E-E\)) %>% dplyr::mutate(hasSS = !is.na(loopID2))
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(hasSS ==group1) )$diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(hasSS ==group2) )$diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}
pv <- convPvalue(getPvalWilcox(temp, TRUE, FALSE))
ggplot(temp, aes(x = hasSS, y = diff_dTAG_DMSO)) + geom_violin(aes(fill = hasSS), show.legend = FALSE) + 
  geom_boxplot(width = 0.1, outlier.shape = NA) +
  stat_summary(aes(group = hasSS), fun = mean, 
               geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  theme_classic() +
  annotate(\text\, x = 1, y = 0, label = pv, size = 5, color = \black\) +
  ggtitle(\PE-PE\) + geom_hline(yintercept = 0)


# Counting loop types
allLoopsAnnotatedFiltered <- allLoopsAnnotated %>% dplyr::filter(!is.na(loopID2)) %>%
  dplyr::filter(!(loopID == loopID2))
temp <- allLoopsAnnotatedFiltered %>% dplyr::select(loopID2, Anno2)
result <- temp %>%
  group_by(loopID2, Anno2) %>%
  summarise(count = n(), .groups = 'drop') %>%
  group_by(loopID2) %>%
  mutate(frequency = count / sum(count)) %>%
  arrange(loopID2, Anno2)

result <- largest_loops %>% dplyr::left_join(result, by = c(\loopID\ = \loopID2\))

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

data <- tibble(
  gene = c(gene.group1, gene.group2),
  group = c(rep(\group1\, length(gene.group1)),
            rep(\group2\, length(gene.group2)))
)

data <- data %>% dplyr::left_join(result, by = c(\gene\))
data <- data %>% filter(complete.cases(.))

all_anno2 <- unique(data$Anno2)

# Calculate average frequency of Anno2 for each gene in each group
result <- data %>%
  # Ensure all possible Anno2 values are present for each gene and group
  complete(gene, Anno2 = all_anno2, fill = list(frequency = 0)) %>% 
  dplyr::mutate(group = case_when(
    gene %in% gene.group1 ~ \group1\,
    gene %in% gene.group2 ~ \group2\,
    TRUE ~ NA
  )) %>%
  dplyr::select(group, Anno2, frequency)
  

ggplot(result, aes(x = Anno2, fill = group, y = frequency)) + geom_boxplot()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzRqSUVsTlVFOVNWQ0JUTFZNZ2JHOXZjSE5jYm1Gc2JFeHZiM0J6SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhrdWRITjJYRndwS1Z4dWMzUnlURzl2Y0hNZ1BDMGdZV3hzVEc5dmNITWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9RVzV1YnpJZ0pXbHVKU0JqS0Z4Y1V5MVRYRndwS1Z4dWRHVnRjQ0E4TFNCemRISk1iMjl3Y3lBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURZcEtWeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjWEdOb2NtOXRYRndzSUZ4Y2MzUmhjblJjWEN3Z1hGeGxibVJjWENsY2JuTjBja3h2YjNCelIzSWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLSFJsYlhBcFhHNWNiaU1nU1UxUVQxSlVJRlJUVTF4dVpteGhibXRUYVhwbElEd3RJREV3WEc1blpXNWxMblJpSUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYRzF0TVRCZlIxSkRiVE00TG5BMlgyZGxibVZmYzI5eWRHVmtMbUpsWkZ4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvVkZOVElEMGdhV1psYkhObEtGWTBJRDA5SUZ4Y0sxeGNMQ0JXTWl3Z1ZqTXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRlJUVTNOMFlYSjBJRDBnVkZOVElDMGdabXhoYm10VGFYcGxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRlJUVTJWdVpDQTlJRlJUVXlBcklHWnNZVzVyVTJsNlpTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvVmpFc0lGUlRVM04wWVhKMExDQlVVMU5sYm1Rc0lGWTJMQ0JXTlNsY2JtTnZiRzVoYldWektHZGxibVV1ZEdJcElEd3RJR01vWEZ4amFISnZiVnhjTENCY1hITjBZWEowWEZ3c0lGeGNaVzVrWEZ3c0lGeGNaVzV6WlcxaWJGeGNMQ0JjWEdkbGJtVmNYQ2xjYm1kbGJtVkhjaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvWjJWdVpTNTBZaXdnYTJWbGNDNWxlSFJ5WVM1amIyeDFiVzV6SUQwZ1ZGSlZSU2xjYmx4dVhHNGpJRVpwYm1RZ2IzWmxjbXhoY0hNZ1ltVjBkMlZsYmlCc2IyOXdjeUJoYm1RZ1ZGTlRYRzV2ZG1WeWJHRndjeUE4TFNCbWFXNWtUM1psY214aGNITW9aMlZ1WlVkeUxDQnpkSEpNYjI5d2MwZHlLVnh1WEc0aklFRnVibTkwWVhSbElHOTJaWEpzWVhCelhHNTBjM05mZDJsMGFGOXNiMjl3Y3lBOExTQm5aVzVsUjNKYmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMWNibXh2YjNCelgzZHBkR2hmZEhOeklEd3RJSE4wY2t4dmIzQnpSM0piYzNWaWFtVmpkRWhwZEhNb2IzWmxjbXhoY0hNcFhWeHVYRzRqSUVOdmJXSnBibVVnYVc1MGJ5QmhJR1JoZEdFZ1puSmhiV1VnWm05eUlIQnliMk5sYzNOcGJtZGNibXh2YjNCZlpHRjBZU0E4TFNCa1lYUmhMbVp5WVcxbEtHZGxibVVnUFNCMGMzTmZkMmwwYUY5c2IyOXdjeVJsYm5ObGJXSnNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0Y5amFISWdQU0J6WlhGdVlXMWxjeWhzYjI5d2MxOTNhWFJvWDNSemN5a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3WDNOMFlYSjBJRDBnYzNSaGNuUW9iRzl2Y0hOZmQybDBhRjkwYzNNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjRjlsYm1RZ1BTQmxibVFvYkc5dmNITmZkMmwwYUY5MGMzTXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0Y5M2FXUjBhQ0E5SUhkcFpIUm9LR3h2YjNCelgzZHBkR2hmZEhOektTbGNibHh1SXlCSlpHVnVkR2xtZVNCMGFHVWdiR0Z5WjJWemRDQnNiMjl3SUdadmNpQmxZV05vSUdkbGJtVmNibXhoY21kbGMzUmZiRzl2Y0hNZ1BDMGdiRzl2Y0Y5a1lYUmhXMjl5WkdWeUtHeHZiM0JmWkdGMFlTUm5aVzVsTENBdGJHOXZjRjlrWVhSaEpHeHZiM0JmZDJsa2RHZ3BMQ0JkWEc1c1lYSm5aWE4wWDJ4dmIzQnpJRHd0SUd4aGNtZGxjM1JmYkc5dmNITmJJV1IxY0d4cFkyRjBaV1FvYkdGeVoyVnpkRjlzYjI5d2N5Um5aVzVsS1N3Z1hWeHViR0Z5WjJWemRGOXNiMjl3Y3lBOExTQnNZWEpuWlhOMFgyeHZiM0J6SUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0d4dmIzQkpSQ0E5SUhCaGMzUmxLR3h2YjNCZlkyaHlMQ0JzYjI5d1gzTjBZWEowTENCc2IyOXdYMlZ1WkN3Z2MyVndJRDBnWEZ4ZlhGd3BLVnh1YkdGeVoyVnpkRjlzYjI5d2N5QThMU0JzWVhKblpYTjBYMnh2YjNCelcyOXlaR1Z5S0d4aGNtZGxjM1JmYkc5dmNITWtiRzl2Y0Y5amFISXNJR3hoY21kbGMzUmZiRzl2Y0hNa2JHOXZjRjl6ZEdGeWRDa3NYVnh1Y205M2JtRnRaWE1vYkdGeVoyVnpkRjlzYjI5d2N5a2dQQzBnVGxWTVRGeHVYRzRqSUVOb1pXTnJhVzVuSUhOdFlXeHNaWElnYkc5dmNITmNibUZzYkV4dmIzQnpSM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0dGc2JFeHZiM0J6TENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sY1c1aGJXVnpMbVpwWld4a0lEMGdYRnhqYUhKdmJURmNYQ3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpkR0Z5ZEM1bWFXVnNaQ0E5SUZ4Y2MzUmhjblF4WEZ3c0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWlc1a0xtWnBaV3hrSUQwZ1hGeGxibVF5WEZ3cFhHNXNZWEpuWlhOMFRHOXZjSE5IY2lBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb2JHRnlaMlZ6ZEY5c2IyOXdjeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWeGJtRnRaWE11Wm1sbGJHUWdQU0JjWEd4dmIzQmZZMmh5WEZ3c0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITjBZWEowTG1acFpXeGtJRDBnWEZ4c2IyOXdYM04wWVhKMFhGd3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1Z1WkM1bWFXVnNaQ0E5SUZ4Y2JHOXZjRjlsYm1SY1hDbGNibXhoY21kbGMzUk1iMjl3YzBkeUlEd3RJSE52Y25Rb2RXNXBjWFZsS0d4aGNtZGxjM1JNYjI5d2MwZHlLU2xjYm1OdmJYQnNaWFJsWDI5MlpYSnNZWEJ6SUR3dElITjFZbk5sZEVKNVQzWmxjbXhoY0hNb1lXeHNURzl2Y0hOSGNpd2diR0Z5WjJWemRFeHZiM0J6UjNJc0lIUjVjR1VnUFNCY1hIZHBkR2hwYmx4Y0tWeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHTnZiWEJzWlhSbFgyOTJaWEpzWVhCekxDQnNZWEpuWlhOMFRHOXZjSE5IY2lsY2JseHVYRzVqYjIxd2JHVjBaVTkyWlhKc1lYQkVaaUE4TFNCaGN5NWtZWFJoTG1aeVlXMWxLR052YlhCc1pYUmxYMjkyWlhKc1lYQnpLU0FsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hzYjI5d1NVUkJiR3dnUFNCd1lYTjBaU2h6WlhGdVlXMWxjeXdnYzNSaGNuUXNJR1Z1WkN3Z2MyVndJRDBnWEZ4ZlhGd3BLVnh1YkdGeVoyVnpkRXh2YjNCelJHWWdQQzBnWVhNdVpHRjBZUzVtY21GdFpTaHNZWEpuWlhOMFRHOXZjSE5IY2lrZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb2JHOXZjRWxFSUQwZ2NHRnpkR1VvYzJWeGJtRnRaWE1zSUhOMFlYSjBMQ0JsYm1Rc0lITmxjQ0E5SUZ4Y1gxeGNLU2xjYmx4dWJHOXZjRWxFY0dGcGNuTWdQQzBnWkdGMFlTNW1jbUZ0WlNoc2IyOXdTVVFnUFNCamIyMXdiR1YwWlU5MlpYSnNZWEJFWmlSc2IyOXdTVVJCYkd4YmNYVmxjbmxJYVhSektHOTJaWEpzWVhCektWMHNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNCSlJESWdQU0JzWVhKblpYTjBURzl2Y0hORVppUnNiMjl3U1VSYmMzVmlhbVZqZEVocGRITW9iM1psY214aGNITXBYU2xjYmx4dVlXeHNURzl2Y0hOQmJtNXZkR0YwWldRZ1BDMGdZV3hzVEc5dmNITWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9iRzl2Y0VsRUlEMGdjR0Z6ZEdVb1kyaHliMjB4TENCemRHRnlkREVzSUdWdVpESXNJSE5sY0NBOUlGeGNYMXhjS1NrZ0pUNGxJR1J3YkhseU9qcHNaV1owWDJwdmFXNG9iRzl2Y0VsRWNHRnBjbk1zSUdKNUlEMGdZeWhjWEd4dmIzQkpSRnhjS1NsY2JseHVkR1Z0Y0NBOExTQmhiR3hNYjI5d2MwRnVibTkwWVhSbFpDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJR01vWEZ4UUxVVmNYQ3dnWEZ4UUxWQmNYQ3dnWEZ4RkxVVmNYQ2twSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0doaGMxTlRJRDBnSVdsekxtNWhLR3h2YjNCSlJESXBLVnh1WjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGdJR1JwYzNSaGJtTmxNU0E4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhvWVhOVFV5QTlQV2R5YjNWd01Ta2dLU1JrYVdabVgyUlVRVWRmUkUxVFQxeHVJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYUdGelUxTWdQVDFuY205MWNESXBJQ2trWkdsbVpsOWtWRUZIWDBSTlUwOWNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNXdkaUE4TFNCamIyNTJVSFpoYkhWbEtHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dWRkpWUlN3Z1JrRk1VMFVwS1Z4dVoyZHdiRzkwS0hSbGJYQXNJR0ZsY3loNElEMGdhR0Z6VTFNc0lIa2dQU0JrYVdabVgyUlVRVWRmUkUxVFR5a3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQm9ZWE5UVXlrc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0JvWVhOVFV5a3NJR1oxYmlBOUlHMWxZVzRzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjJWdmJTQTlJRnhjY0c5cGJuUmNYQ3dnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURJc0lHWnBiR3dnUFNCY1hISmxaRnhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWENrZ0sxeHVJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNCaGJtNXZkR0YwWlNoY1hIUmxlSFJjWEN3Z2VDQTlJREVzSUhrZ1BTQXdMQ0JzWVdKbGJDQTlJSEIyTENCemFYcGxJRDBnTlN3Z1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3cElDdGNiaUFnWjJkMGFYUnNaU2hjWEZCRkxWQkZYRndwSUNzZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUNsY2JseHVYRzRqSUVOdmRXNTBhVzVuSUd4dmIzQWdkSGx3WlhOY2JtRnNiRXh2YjNCelFXNXViM1JoZEdWa1JtbHNkR1Z5WldRZ1BDMGdZV3hzVEc5dmNITkJibTV2ZEdGMFpXUWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9JV2x6TG01aEtHeHZiM0JKUkRJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWdoS0d4dmIzQkpSQ0E5UFNCc2IyOXdTVVF5S1NsY2JuUmxiWEFnUEMwZ1lXeHNURzl2Y0hOQmJtNXZkR0YwWldSR2FXeDBaWEpsWkNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoc2IyOXdTVVF5TENCQmJtNXZNaWxjYm5KbGMzVnNkQ0E4TFNCMFpXMXdJQ1UrSlZ4dUlDQm5jbTkxY0Y5aWVTaHNiMjl3U1VReUxDQkJibTV2TWlrZ0pUNGxYRzRnSUhOMWJXMWhjbWx6WlNoamIzVnVkQ0E5SUc0b0tTd2dMbWR5YjNWd2N5QTlJQ2RrY205d0p5a2dKVDRsWEc0Z0lHZHliM1Z3WDJKNUtHeHZiM0JKUkRJcElDVStKVnh1SUNCdGRYUmhkR1VvWm5KbGNYVmxibU41SUQwZ1kyOTFiblFnTHlCemRXMG9ZMjkxYm5RcEtTQWxQaVZjYmlBZ1lYSnlZVzVuWlNoc2IyOXdTVVF5TENCQmJtNXZNaWxjYmx4dWNtVnpkV3gwSUR3dElHeGhjbWRsYzNSZmJHOXZjSE1nSlQ0bElHUndiSGx5T2pwc1pXWjBYMnB2YVc0b2NtVnpkV3gwTENCaWVTQTlJR01vWEZ4c2IyOXdTVVJjWENBOUlGeGNiRzl2Y0VsRU1seGNLU2xjYmx4dVoyVnVaUzVuY205MWNERWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1oyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMkpwYm1GeWVVZHliM1Z3TVM1MGMzWmNYQ2twSkdkbGJtVmNibWRsYm1VdVozSnZkWEF5SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNESXVkSE4yWEZ3cEtTUm5aVzVsWEc1Y2JtUmhkR0VnUEMwZ2RHbGlZbXhsS0Z4dUlDQm5aVzVsSUQwZ1l5aG5aVzVsTG1keWIzVndNU3dnWjJWdVpTNW5jbTkxY0RJcExGeHVJQ0JuY205MWNDQTlJR01vY21Wd0tGeGNaM0p2ZFhBeFhGd3NJR3hsYm1kMGFDaG5aVzVsTG1keWIzVndNU2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdjbVZ3S0Z4Y1ozSnZkWEF5WEZ3c0lHeGxibWQwYUNoblpXNWxMbWR5YjNWd01pa3BLVnh1S1Z4dVhHNWtZWFJoSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwc1pXWjBYMnB2YVc0b2NtVnpkV3gwTENCaWVTQTlJR01vWEZ4blpXNWxYRndwS1Z4dVpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCbWFXeDBaWElvWTI5dGNHeGxkR1V1WTJGelpYTW9MaWtwWEc1Y2JtRnNiRjloYm01dk1pQThMU0IxYm1seGRXVW9aR0YwWVNSQmJtNXZNaWxjYmx4dUl5QkRZV3hqZFd4aGRHVWdZWFpsY21GblpTQm1jbVZ4ZFdWdVkza2diMllnUVc1dWJ6SWdabTl5SUdWaFkyZ2daMlZ1WlNCcGJpQmxZV05vSUdkeWIzVndYRzV5WlhOMWJIUWdQQzBnWkdGMFlTQWxQaVZjYmlBZ0l5QkZibk4xY21VZ1lXeHNJSEJ2YzNOcFlteGxJRUZ1Ym04eUlIWmhiSFZsY3lCaGNtVWdjSEpsYzJWdWRDQm1iM0lnWldGamFDQm5aVzVsSUdGdVpDQm5jbTkxY0Z4dUlDQmpiMjF3YkdWMFpTaG5aVzVsTENCQmJtNXZNaUE5SUdGc2JGOWhibTV2TWl3Z1ptbHNiQ0E5SUd4cGMzUW9abkpsY1hWbGJtTjVJRDBnTUNrcElDVStKU0JjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJR05oYzJWZmQyaGxiaWhjYmlBZ0lDQm5aVzVsSUNWcGJpVWdaMlZ1WlM1bmNtOTFjREVnZmlCY1hHZHliM1Z3TVZ4Y0xGeHVJQ0FnSUdkbGJtVWdKV2x1SlNCblpXNWxMbWR5YjNWd01pQitJRnhjWjNKdmRYQXlYRndzWEc0Z0lDQWdWRkpWUlNCK0lFNUJYRzRnSUNrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR2R5YjNWd0xDQkJibTV2TWl3Z1puSmxjWFZsYm1ONUtWeHVJQ0JjYmx4dVoyZHdiRzkwS0hKbGMzVnNkQ3dnWVdWektIZ2dQU0JCYm01dk1pd2dabWxzYkNBOUlHZHliM1Z3TENCNUlEMGdabkpsY1hWbGJtTjVLU2tnS3lCblpXOXRYMkp2ZUhCc2IzUW9LVnh1WEc1Z1lHQmNibUJnWUNKOSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG4jIElNUE9SVCBTLVMgbG9vcHNcbmFsbExvb3BzIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKVxuc3RyTG9vcHMgPC0gYWxsTG9vcHMgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUy1TXFwpKVxudGVtcCA8LSBzdHJMb29wcyAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDYpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnN0ckxvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5cbiMgSU1QT1JUIFRTU1xuZmxhbmtTaXplIDwtIDEwXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLFxuICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLFxuICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY2LCBWNSlcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcZW5zZW1ibFxcLCBcXGdlbmVcXClcbmdlbmVHciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS50Yiwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSlcblxuXG4jIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBsb29wcyBhbmQgVFNTXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoZ2VuZUdyLCBzdHJMb29wc0dyKVxuXG4jIEFubm90YXRlIG92ZXJsYXBzXG50c3Nfd2l0aF9sb29wcyA8LSBnZW5lR3JbcXVlcnlIaXRzKG92ZXJsYXBzKV1cbmxvb3BzX3dpdGhfdHNzIDwtIHN0ckxvb3BzR3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXVxuXG4jIENvbWJpbmUgaW50byBhIGRhdGEgZnJhbWUgZm9yIHByb2Nlc3Npbmdcbmxvb3BfZGF0YSA8LSBkYXRhLmZyYW1lKGdlbmUgPSB0c3Nfd2l0aF9sb29wcyRlbnNlbWJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9jaHIgPSBzZXFuYW1lcyhsb29wc193aXRoX3RzcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wX3N0YXJ0ID0gc3RhcnQobG9vcHNfd2l0aF90c3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9lbmQgPSBlbmQobG9vcHNfd2l0aF90c3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF93aWR0aCA9IHdpZHRoKGxvb3BzX3dpdGhfdHNzKSlcblxuIyBJZGVudGlmeSB0aGUgbGFyZ2VzdCBsb29wIGZvciBlYWNoIGdlbmVcbmxhcmdlc3RfbG9vcHMgPC0gbG9vcF9kYXRhW29yZGVyKGxvb3BfZGF0YSRnZW5lLCAtbG9vcF9kYXRhJGxvb3Bfd2lkdGgpLCBdXG5sYXJnZXN0X2xvb3BzIDwtIGxhcmdlc3RfbG9vcHNbIWR1cGxpY2F0ZWQobGFyZ2VzdF9sb29wcyRnZW5lKSwgXVxubGFyZ2VzdF9sb29wcyA8LSBsYXJnZXN0X2xvb3BzICU+JSBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKGxvb3BfY2hyLCBsb29wX3N0YXJ0LCBsb29wX2VuZCwgc2VwID0gXFxfXFwpKVxubGFyZ2VzdF9sb29wcyA8LSBsYXJnZXN0X2xvb3BzW29yZGVyKGxhcmdlc3RfbG9vcHMkbG9vcF9jaHIsIGxhcmdlc3RfbG9vcHMkbG9vcF9zdGFydCksXVxucm93bmFtZXMobGFyZ2VzdF9sb29wcykgPC0gTlVMTFxuXG4jIENoZWNraW5nIHNtYWxsZXIgbG9vcHNcbmFsbExvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGFsbExvb3BzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcW5hbWVzLmZpZWxkID0gXFxjaHJvbTFcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydC5maWVsZCA9IFxcc3RhcnQxXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLmZpZWxkID0gXFxlbmQyXFwpXG5sYXJnZXN0TG9vcHNHciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUobGFyZ2VzdF9sb29wcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxbmFtZXMuZmllbGQgPSBcXGxvb3BfY2hyXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LmZpZWxkID0gXFxsb29wX3N0YXJ0XFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5maWVsZCA9IFxcbG9vcF9lbmRcXClcbmxhcmdlc3RMb29wc0dyIDwtIHNvcnQodW5pcXVlKGxhcmdlc3RMb29wc0dyKSlcbmNvbXBsZXRlX292ZXJsYXBzIDwtIHN1YnNldEJ5T3ZlcmxhcHMoYWxsTG9vcHNHciwgbGFyZ2VzdExvb3BzR3IsIHR5cGUgPSBcXHdpdGhpblxcKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGNvbXBsZXRlX292ZXJsYXBzLCBsYXJnZXN0TG9vcHNHcilcblxuXG5jb21wbGV0ZU92ZXJsYXBEZiA8LSBhcy5kYXRhLmZyYW1lKGNvbXBsZXRlX292ZXJsYXBzKSAlPiUgZHBseXI6Om11dGF0ZShsb29wSURBbGwgPSBwYXN0ZShzZXFuYW1lcywgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpKVxubGFyZ2VzdExvb3BzRGYgPC0gYXMuZGF0YS5mcmFtZShsYXJnZXN0TG9vcHNHcikgJT4lIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoc2VxbmFtZXMsIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSlcblxubG9vcElEcGFpcnMgPC0gZGF0YS5mcmFtZShsb29wSUQgPSBjb21wbGV0ZU92ZXJsYXBEZiRsb29wSURBbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJRDIgPSBsYXJnZXN0TG9vcHNEZiRsb29wSURbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYWxsTG9vcHNBbm5vdGF0ZWQgPC0gYWxsTG9vcHMgJT4lIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIGVuZDIsIHNlcCA9IFxcX1xcKSkgJT4lIGRwbHlyOjpsZWZ0X2pvaW4obG9vcElEcGFpcnMsIGJ5ID0gYyhcXGxvb3BJRFxcKSlcblxudGVtcCA8LSBhbGxMb29wc0Fubm90YXRlZCAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLUVcXCwgXFxQLVBcXCwgXFxFLUVcXCkpICU+JSBkcGx5cjo6bXV0YXRlKGhhc1NTID0gIWlzLm5hKGxvb3BJRDIpKVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PWdyb3VwMSkgKSRkaWZmX2RUQUdfRE1TT1xuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaGFzU1MgPT1ncm91cDIpICkkZGlmZl9kVEFHX0RNU09cbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5wdiA8LSBjb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgVFJVRSwgRkFMU0UpKVxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gaGFzU1MsIHkgPSBkaWZmX2RUQUdfRE1TTykpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBoYXNTUyksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBoYXNTUyksIGZ1biA9IG1lYW4sIFxuICAgICAgICAgICAgICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHB2LCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2d0aXRsZShcXFBFLVBFXFwpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcblxuXG4jIENvdW50aW5nIGxvb3AgdHlwZXNcbmFsbExvb3BzQW5ub3RhdGVkRmlsdGVyZWQgPC0gYWxsTG9vcHNBbm5vdGF0ZWQgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGxvb3BJRDIpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighKGxvb3BJRCA9PSBsb29wSUQyKSlcbnRlbXAgPC0gYWxsTG9vcHNBbm5vdGF0ZWRGaWx0ZXJlZCAlPiUgZHBseXI6OnNlbGVjdChsb29wSUQyLCBBbm5vMilcbnJlc3VsdCA8LSB0ZW1wICU+JVxuICBncm91cF9ieShsb29wSUQyLCBBbm5vMikgJT4lXG4gIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lXG4gIGdyb3VwX2J5KGxvb3BJRDIpICU+JVxuICBtdXRhdGUoZnJlcXVlbmN5ID0gY291bnQgLyBzdW0oY291bnQpKSAlPiVcbiAgYXJyYW5nZShsb29wSUQyLCBBbm5vMilcblxucmVzdWx0IDwtIGxhcmdlc3RfbG9vcHMgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ocmVzdWx0LCBieSA9IGMoXFxsb29wSURcXCA9IFxcbG9vcElEMlxcKSlcblxuZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cbmRhdGEgPC0gdGliYmxlKFxuICBnZW5lID0gYyhnZW5lLmdyb3VwMSwgZ2VuZS5ncm91cDIpLFxuICBncm91cCA9IGMocmVwKFxcZ3JvdXAxXFwsIGxlbmd0aChnZW5lLmdyb3VwMSkpLFxuICAgICAgICAgICAgcmVwKFxcZ3JvdXAyXFwsIGxlbmd0aChnZW5lLmdyb3VwMikpKVxuKVxuXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ocmVzdWx0LCBieSA9IGMoXFxnZW5lXFwpKVxuZGF0YSA8LSBkYXRhICU+JSBmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpXG5cbmFsbF9hbm5vMiA8LSB1bmlxdWUoZGF0YSRBbm5vMilcblxuIyBDYWxjdWxhdGUgYXZlcmFnZSBmcmVxdWVuY3kgb2YgQW5ubzIgZm9yIGVhY2ggZ2VuZSBpbiBlYWNoIGdyb3VwXG5yZXN1bHQgPC0gZGF0YSAlPiVcbiAgIyBFbnN1cmUgYWxsIHBvc3NpYmxlIEFubm8yIHZhbHVlcyBhcmUgcHJlc2VudCBmb3IgZWFjaCBnZW5lIGFuZCBncm91cFxuICBjb21wbGV0ZShnZW5lLCBBbm5vMiA9IGFsbF9hbm5vMiwgZmlsbCA9IGxpc3QoZnJlcXVlbmN5ID0gMCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihcbiAgICBnZW5lICVpbiUgZ2VuZS5ncm91cDEgfiBcXGdyb3VwMVxcLFxuICAgIGdlbmUgJWluJSBnZW5lLmdyb3VwMiB+IFxcZ3JvdXAyXFwsXG4gICAgVFJVRSB+IE5BXG4gICkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGdyb3VwLCBBbm5vMiwgZnJlcXVlbmN5KVxuICBcblxuZ2dwbG90KHJlc3VsdCwgYWVzKHggPSBBbm5vMiwgZmlsbCA9IGdyb3VwLCB5ID0gZnJlcXVlbmN5KSkgKyBnZW9tX2JveHBsb3QoKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG4jIElNUE9SVCBTLVMgbG9vcHNcbmFsbExvb3BzIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKVxuc3RyTG9vcHMgPC0gYWxsTG9vcHMgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUy1TXFwpKVxudGVtcCA8LSBzdHJMb29wcyAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDYpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnN0ckxvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5cbiMgSU1QT1JUIFRTU1xuZmxhbmtTaXplIDwtIDEwXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLFxuICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLFxuICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY2LCBWNSlcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcZW5zZW1ibFxcLCBcXGdlbmVcXClcbmdlbmVHciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS50Yiwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSlcblxuXG4jIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBsb29wcyBhbmQgVFNTXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoZ2VuZUdyLCBzdHJMb29wc0dyKVxuXG4jIEFubm90YXRlIG92ZXJsYXBzXG50c3Nfd2l0aF9sb29wcyA8LSBnZW5lR3JbcXVlcnlIaXRzKG92ZXJsYXBzKV1cbmxvb3BzX3dpdGhfdHNzIDwtIHN0ckxvb3BzR3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXVxuXG4jIENvbWJpbmUgaW50byBhIGRhdGEgZnJhbWUgZm9yIHByb2Nlc3Npbmdcbmxvb3BfZGF0YSA8LSBkYXRhLmZyYW1lKGdlbmUgPSB0c3Nfd2l0aF9sb29wcyRlbnNlbWJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9jaHIgPSBzZXFuYW1lcyhsb29wc193aXRoX3RzcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wX3N0YXJ0ID0gc3RhcnQobG9vcHNfd2l0aF90c3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9lbmQgPSBlbmQobG9vcHNfd2l0aF90c3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF93aWR0aCA9IHdpZHRoKGxvb3BzX3dpdGhfdHNzKSlcblxuIyBJZGVudGlmeSB0aGUgbGFyZ2VzdCBsb29wIGZvciBlYWNoIGdlbmVcbmxhcmdlc3RfbG9vcHMgPC0gbG9vcF9kYXRhW29yZGVyKGxvb3BfZGF0YSRnZW5lLCAtbG9vcF9kYXRhJGxvb3Bfd2lkdGgpLCBdXG5sYXJnZXN0X2xvb3BzIDwtIGxhcmdlc3RfbG9vcHNbIWR1cGxpY2F0ZWQobGFyZ2VzdF9sb29wcyRnZW5lKSwgXVxubGFyZ2VzdF9sb29wcyA8LSBsYXJnZXN0X2xvb3BzICU+JSBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKGxvb3BfY2hyLCBsb29wX3N0YXJ0LCBsb29wX2VuZCwgc2VwID0gXFxfXFwpKVxubGFyZ2VzdF9sb29wcyA8LSBsYXJnZXN0X2xvb3BzW29yZGVyKGxhcmdlc3RfbG9vcHMkbG9vcF9jaHIsIGxhcmdlc3RfbG9vcHMkbG9vcF9zdGFydCksXVxucm93bmFtZXMobGFyZ2VzdF9sb29wcykgPC0gTlVMTFxuXG4jIENoZWNraW5nIHNtYWxsZXIgbG9vcHNcbmFsbExvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGFsbExvb3BzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcW5hbWVzLmZpZWxkID0gXFxjaHJvbTFcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydC5maWVsZCA9IFxcc3RhcnQxXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLmZpZWxkID0gXFxlbmQyXFwpXG5sYXJnZXN0TG9vcHNHciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUobGFyZ2VzdF9sb29wcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxbmFtZXMuZmllbGQgPSBcXGxvb3BfY2hyXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LmZpZWxkID0gXFxsb29wX3N0YXJ0XFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5maWVsZCA9IFxcbG9vcF9lbmRcXClcbmxhcmdlc3RMb29wc0dyIDwtIHNvcnQodW5pcXVlKGxhcmdlc3RMb29wc0dyKSlcbmNvbXBsZXRlX292ZXJsYXBzIDwtIHN1YnNldEJ5T3ZlcmxhcHMoYWxsTG9vcHNHciwgbGFyZ2VzdExvb3BzR3IsIHR5cGUgPSBcXHdpdGhpblxcKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGNvbXBsZXRlX292ZXJsYXBzLCBsYXJnZXN0TG9vcHNHcilcblxuXG5jb21wbGV0ZU92ZXJsYXBEZiA8LSBhcy5kYXRhLmZyYW1lKGNvbXBsZXRlX292ZXJsYXBzKSAlPiUgZHBseXI6Om11dGF0ZShsb29wSURBbGwgPSBwYXN0ZShzZXFuYW1lcywgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpKVxubGFyZ2VzdExvb3BzRGYgPC0gYXMuZGF0YS5mcmFtZShsYXJnZXN0TG9vcHNHcikgJT4lIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoc2VxbmFtZXMsIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSlcblxubG9vcElEcGFpcnMgPC0gZGF0YS5mcmFtZShsb29wSUQgPSBjb21wbGV0ZU92ZXJsYXBEZiRsb29wSURBbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJRDIgPSBsYXJnZXN0TG9vcHNEZiRsb29wSURbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuYWxsTG9vcHNBbm5vdGF0ZWQgPC0gYWxsTG9vcHMgJT4lIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIGVuZDIsIHNlcCA9IFxcX1xcKSkgJT4lIGRwbHlyOjpsZWZ0X2pvaW4obG9vcElEcGFpcnMsIGJ5ID0gYyhcXGxvb3BJRFxcKSlcblxudGVtcCA8LSBhbGxMb29wc0Fubm90YXRlZCAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLUVcXCwgXFxQLVBcXCwgXFxFLUVcXCkpICU+JSBkcGx5cjo6bXV0YXRlKGhhc1NTID0gIWlzLm5hKGxvb3BJRDIpKVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PWdyb3VwMSkgKSRkaWZmX2RUQUdfRE1TT1xuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaGFzU1MgPT1ncm91cDIpICkkZGlmZl9kVEFHX0RNU09cbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5wdiA8LSBjb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgVFJVRSwgRkFMU0UpKVxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gaGFzU1MsIHkgPSBkaWZmX2RUQUdfRE1TTykpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBoYXNTUyksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBoYXNTUyksIGZ1biA9IG1lYW4sIFxuICAgICAgICAgICAgICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHB2LCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2d0aXRsZShcXFBFLVBFXFwpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcblxuXG4jIENvdW50aW5nIGxvb3AgdHlwZXNcbmFsbExvb3BzQW5ub3RhdGVkRmlsdGVyZWQgPC0gYWxsTG9vcHNBbm5vdGF0ZWQgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGxvb3BJRDIpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighKGxvb3BJRCA9PSBsb29wSUQyKSlcbnRlbXAgPC0gYWxsTG9vcHNBbm5vdGF0ZWRGaWx0ZXJlZCAlPiUgZHBseXI6OnNlbGVjdChsb29wSUQyLCBBbm5vMilcbnJlc3VsdCA8LSB0ZW1wICU+JVxuICBncm91cF9ieShsb29wSUQyLCBBbm5vMikgJT4lXG4gIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lXG4gIGdyb3VwX2J5KGxvb3BJRDIpICU+JVxuICBtdXRhdGUoZnJlcXVlbmN5ID0gY291bnQgLyBzdW0oY291bnQpKSAlPiVcbiAgYXJyYW5nZShsb29wSUQyLCBBbm5vMilcblxucmVzdWx0IDwtIGxhcmdlc3RfbG9vcHMgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ocmVzdWx0LCBieSA9IGMoXFxsb29wSURcXCA9IFxcbG9vcElEMlxcKSlcblxuZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cbmRhdGEgPC0gdGliYmxlKFxuICBnZW5lID0gYyhnZW5lLmdyb3VwMSwgZ2VuZS5ncm91cDIpLFxuICBncm91cCA9IGMocmVwKFxcZ3JvdXAxXFwsIGxlbmd0aChnZW5lLmdyb3VwMSkpLFxuICAgICAgICAgICAgcmVwKFxcZ3JvdXAyXFwsIGxlbmd0aChnZW5lLmdyb3VwMikpKVxuKVxuXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ocmVzdWx0LCBieSA9IGMoXFxnZW5lXFwpKVxuZGF0YSA8LSBkYXRhICU+JSBmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpXG5cbmFsbF9hbm5vMiA8LSB1bmlxdWUoZGF0YSRBbm5vMilcblxuIyBDYWxjdWxhdGUgYXZlcmFnZSBmcmVxdWVuY3kgb2YgQW5ubzIgZm9yIGVhY2ggZ2VuZSBpbiBlYWNoIGdyb3VwXG5yZXN1bHQgPC0gZGF0YSAlPiVcbiAgIyBFbnN1cmUgYWxsIHBvc3NpYmxlIEFubm8yIHZhbHVlcyBhcmUgcHJlc2VudCBmb3IgZWFjaCBnZW5lIGFuZCBncm91cFxuICBjb21wbGV0ZShnZW5lLCBBbm5vMiA9IGFsbF9hbm5vMiwgZmlsbCA9IGxpc3QoZnJlcXVlbmN5ID0gMCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihcbiAgICBnZW5lICVpbiUgZ2VuZS5ncm91cDEgfiBcXGdyb3VwMVxcLFxuICAgIGdlbmUgJWluJSBnZW5lLmdyb3VwMiB+IFxcZ3JvdXAyXFwsXG4gICAgVFJVRSB+IE5BXG4gICkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGdyb3VwLCBBbm5vMiwgZnJlcXVlbmN5KVxuICBcblxuZ2dwbG90KHJlc3VsdCwgYWVzKHggPSBBbm5vMiwgZmlsbCA9IGdyb3VwLCB5ID0gZnJlcXVlbmN5KSkgKyBnZW9tX2JveHBsb3QoKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
name <- \chromo_cons_annoHierarchy\

# IMPORT S-S loops
allLoops <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\))
strLoops <- allLoops %>% dplyr::filter(Anno2 %in% c(\S-S\))
temp <- strLoops %>% dplyr::select(c(1, 2, 6))
colnames(temp) <- c(\chrom\, \start\, \end\)
strLoopsGr <- makeGRangesFromDataFrame(temp)

# IMPORT TSS
flankSize <- 10
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6, V5)
colnames(gene.tb) <- c(\chrom\, \start\, \end\, \ensembl\, \gene\)
geneGr <- makeGRangesFromDataFrame(gene.tb, keep.extra.columns = TRUE)


# Find overlaps between loops and TSS
overlaps <- findOverlaps(geneGr, strLoopsGr)

# Annotate overlaps
tss_with_loops <- geneGr[queryHits(overlaps)]
loops_with_tss <- strLoopsGr[subjectHits(overlaps)]

# Combine into a data frame for processing
loop_data <- data.frame(gene = tss_with_loops$ensembl,
                        loop_chr = seqnames(loops_with_tss),
                        loop_start = start(loops_with_tss),
                        loop_end = end(loops_with_tss),
                        loop_width = width(loops_with_tss))

# Identify the largest loop for each gene
largest_loops <- loop_data[order(loop_data$gene, -loop_data$loop_width), ]
largest_loops <- largest_loops[!duplicated(largest_loops$gene), ]
largest_loops <- largest_loops %>% dplyr::mutate(loopID = paste(loop_chr, loop_start, loop_end, sep = \_\))
largest_loops <- largest_loops[order(largest_loops$loop_chr, largest_loops$loop_start),]
rownames(largest_loops) <- NULL

# Checking smaller loops
allLoopsGr <- makeGRangesFromDataFrame(allLoops, 
                                       seqnames.field = \chrom1\, 
                                       start.field = \start1\, 
                                       end.field = \end2\)
largestLoopsGr <- makeGRangesFromDataFrame(largest_loops, 
                                           seqnames.field = \loop_chr\, 
                                           start.field = \loop_start\, 
                                           end.field = \loop_end\)
largestLoopsGr <- sort(unique(largestLoopsGr))
complete_overlaps <- subsetByOverlaps(allLoopsGr, largestLoopsGr, type = \within\)
overlaps <- findOverlaps(complete_overlaps, largestLoopsGr)


completeOverlapDf <- as.data.frame(complete_overlaps) %>% dplyr::mutate(loopIDAll = paste(seqnames, start, end, sep = \_\))
largestLoopsDf <- as.data.frame(largestLoopsGr) %>% dplyr::mutate(loopID = paste(seqnames, start, end, sep = \_\))

loopIDpairs <- data.frame(loopID = completeOverlapDf$loopIDAll[queryHits(overlaps)],
                          loopID2 = largestLoopsDf$loopID[subjectHits(overlaps)])

allLoopsAnnotated <- allLoops %>% dplyr::mutate(loopID = paste(chrom1, start1, end2, sep = \_\)) %>% dplyr::left_join(loopIDpairs, by = c(\loopID\))

temp <- allLoopsAnnotated %>% dplyr::filter(Anno2 %in% c(\P-E\, \P-P\, \E-E\)) %>% dplyr::mutate(hasSS = !is.na(loopID2))
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(hasSS ==group1) )$diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(hasSS ==group2) )$diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}
pv <- convPvalue(getPvalWilcox(temp, TRUE, FALSE))
ggplot(temp, aes(x = hasSS, y = diff_dTAG_DMSO)) + geom_violin(aes(fill = hasSS), show.legend = FALSE) + 
  geom_boxplot(width = 0.1, outlier.shape = NA) +
  stat_summary(aes(group = hasSS), fun = mean, 
               geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  theme_classic() +
  annotate(\text\, x = 1, y = 0, label = pv, size = 5, color = \black\) +
  ggtitle(\PE-PE\) + geom_hline(yintercept = 0)


# Counting loop types
allLoopsAnnotatedFiltered <- allLoopsAnnotated %>% dplyr::filter(!is.na(loopID2)) %>%
  dplyr::filter(!(loopID == loopID2))
temp <- allLoopsAnnotatedFiltered %>% dplyr::select(loopID2, Anno2)
result <- temp %>%
  group_by(loopID2, Anno2) %>%
  summarise(count = n(), .groups = 'drop') %>%
  group_by(loopID2) %>%
  mutate(frequency = count / sum(count)) %>%
  arrange(loopID2, Anno2)

result <- largest_loops %>% dplyr::left_join(result, by = c(\loopID\ = \loopID2\))

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

data <- tibble(
  gene = c(gene.group1, gene.group2),
  group = c(rep(\group1\, length(gene.group1)),
            rep(\group2\, length(gene.group2)))
)

data <- data %>% dplyr::left_join(result, by = c(\gene\))
data <- data %>% filter(complete.cases(.))

all_anno2 <- unique(data$Anno2)

# Calculate average frequency of Anno2 for each gene in each group
result <- data %>%
  # Ensure all possible Anno2 values are present for each gene and group
  complete(gene, Anno2 = all_anno2, fill = list(frequency = 0)) %>% 
  dplyr::mutate(group = case_when(
    gene %in% gene.group1 ~ \group1\,
    gene %in% gene.group2 ~ \group2\,
    TRUE ~ NA
  )) %>%
  dplyr::select(group, Anno2, frequency)
  

ggplot(result, aes(x = Anno2, fill = group, y = frequency)) + geom_boxplot()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


###[3.39] Splitting bedpe

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJXYVdWM0lISmxjM1ZzZEhOY2JtZG5jR3h2ZENoc1lYSm5aWE4wWDJ4dmIzQnpMQ0JoWlhNb2VDQTlJR3h2YjNCZmQybGtkR2dwS1NBcklHZGxiMjFmYUdsemRHOW5jbUZ0S0NsY2JseHVYRzRqSXlNZ1EyaGxZMnRwYm1jZ2FHOTNJRzFoYm5rZ1oyVnVaWE1nWm5KdmJTQmxZV05vSUdkeWIzVndJR2hoY3lCbGJtTnZiWEJoYzNOcGJtY2dVeTFUWEc1blpXNWxMbWR5YjNWd01TQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWENKblpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZZbWx1WVhKNVIzSnZkWEF4TG5SemRsd2lLU2trWjJWdVpWeHVaMlZ1WlM1bmNtOTFjRElnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGd2laMlZ1WlV4cGMzUmZaRlJCUjE5MmMxOUVUVk5QWDFKT1FWOXNiMjl3WDJKcGJtRnllVWR5YjNWd01pNTBjM1pjSWlrcEpHZGxibVZjYmx4dVpHRjBZU0E4TFNCMGFXSmliR1VvWEc0Z0lHZGxibVVnUFNCaktHZGxibVV1WjNKdmRYQXhMQ0JuWlc1bExtZHliM1Z3TWlrc1hHNGdJR2R5YjNWd0lEMGdZeWh5WlhBb1hDSm5jbTkxY0RGY0lpd2diR1Z1WjNSb0tHZGxibVV1WjNKdmRYQXhLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWEFvWENKbmNtOTFjREpjSWl3Z2JHVnVaM1JvS0dkbGJtVXVaM0p2ZFhBeUtTa3BYRzRwWEc1Y2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T214bFpuUmZhbTlwYmloc1lYSm5aWE4wWDJ4dmIzQnpMQ0JpZVNBOUlHTW9YQ0puWlc1bFhDSXBLVnh1WkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0JvWVhOVFV5QTlJR2xtWld4elpTaHBjeTV1WVNoc2IyOXdYM2RwWkhSb0tTd2dYQ0pPVDF3aUxDQmNJbGxGVTF3aUtWeHVLVnh1WEc1a1lYUmhYM04xYlcxaGNua2dQQzBnWkdGMFlTQWxQaVZjYmlBZ1ozSnZkWEJmWW5rb1ozSnZkWEFwSUNVK0pWeHVJQ0J6ZFcxdFlYSnBlbVVvWEc0Z0lDQWdkRzkwWVd3Z1BTQnVLQ2tzWEc0Z0lDQWdhR0Z6VTFOZmVXVnpJRDBnYzNWdEtHaGhjMU5USUQwOUlGd2lXVVZUWENJcExGeHVJQ0FnSUhCbGNtTmxiblJoWjJWZmVXVnpJRDBnS0doaGMxTlRYM2xsY3lBdklIUnZkR0ZzS1NBcUlERXdNRnh1SUNBcFhHNWNibWRuY0d4dmRDaGtZWFJoWDNOMWJXMWhjbmtzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCd1pYSmpaVzUwWVdkbFgzbGxjeXdnWm1sc2JDQTlJR2R5YjNWd0tTa2dLMXh1SUNCblpXOXRYMkpoY2loemRHRjBJRDBnWENKcFpHVnVkR2wwZVZ3aUxDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpa2dLMXh1SUNCc1lXSnpLRnh1SUNBZ0lIUnBkR3hsSUQwZ1hDSlFaWEpqWlc1MFlXZGxJRzltSUVWaFkyZ2dSM0p2ZFhBZ2QybDBhQ0JvWVhOVFV5QTlJRmxGVTF3aUxGeHVJQ0FnSUhnZ1BTQmNJa2R5YjNWd1hDSXNYRzRnSUNBZ2VTQTlJRndpVUdWeVkyVnVkR0ZuWlNBb0pTbGNJbHh1SUNBcElDc2dlV3hwYlNnd0xDQXhNREFwSUN0Y2JpQWdkR2hsYldWZmJXbHVhVzFoYkNncFhHNWNibHh1ZEdWdGNDQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHaGhjMU5USUQwOUlGd2lXVVZUWENJcFhHNW5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOVozSnZkWEF4S1NBcEpHeHZiM0JmZDJsa2RHaGNiaUFnWkdsemRHRnVZMlV5SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXlLU0FwSkd4dmIzQmZkMmxrZEdoY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1d2RpQThMU0JqYjI1MlVIWmhiSFZsS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hDSm5jbTkxY0RGY0lpd2dYQ0puY205MWNESmNJaWtwWEc1Y2JtZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnYkc5dmNGOTNhV1IwYUNrcElDc2daMlZ2YlY5MmFXOXNhVzRvS1NBcklHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TlNrZ0sxeHVJQ0JoYm01dmRHRjBaU2hjSW5SbGVIUmNJaXdnZUNBOUlERXNJSGtnUFNBd0xDQnNZV0psYkNBOUlIQjJMQ0J6YVhwbElEMGdOU3dnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwWEc1Y2JpTWpJeUJEYjIxd1lYSnBibWNnVWs1QklIQmxjblIxY21KaGRHbHZibHh1WEc1a2FXWm1MbEpPUVNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0prYVdabVgwY3hMbVJVUVVkZlJ6RXVNbWt1WkZSQlIxOTJjMTlITVM0eWFTNUVUVk5QTG5SemRsd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHpaV3hsWTNRb1l5Z3hMQ0EwTENBMUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvYUdGelUxTWdQU0JwWm1Wc2MyVW9aVzV6WlcxaWJGOW5aVzVsWDJsa0lDVnBiaVVnYkdGeVoyVnpkRjlzYjI5d2N5Um5aVzVsTENCY0ltaGhjMU5UWENJc0lGd2libTlUVTF3aUtTbGNibHh1WEc1blozQnNiM1FvWkdsbVppNVNUa0VzSUdGbGN5aDRJRDBnWVdKektHeHZaekpHYjJ4a1EyaGhibWRsS1N3Z1kyOXNiM0lnUFNCb1lYTlRVeWtwSUN0Y2JpQWdjM1JoZEY5bFkyUm1LSE5wZW1VZ1BTQXdMalFwSUN0Y2JpQWdiR0ZpY3loY2JpQWdJQ0I0SUQwZ1hDSkJZbk52YkhWMFpTQnNiMmN5S0dadmJHUWdZMmhoYm1kbEtWd2lMRnh1SUNBZ0lIa2dQU0JjSWtOMWJYVnNZWFJwZG1VZ1VISnZZbUZpYVd4cGRIbGNJbHh1SUNBcElDc2dZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIaHNhVzBnUFNCaktEQXNJREV1TlNrcElDdGNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnSXlCRGJHVmhiaUIwYUdWdFpWeHVJQ0IwYUdWdFpTaGNiaUFnSUNBZ0lHRjRhWE11ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRndpZEhKaGJuTndZWEpsYm5SY0lpa3NYRzRnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlsY2JpQWdJQ0FwWEc1Y2JseHVJeU1qSUVOb1pXTnJhVzVuSUVOb1NWQWdjR1ZoYXlCa1pXNXphWFI1WEc1c1lYSm5aWE4wWDJ4dmIzQnpSM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0d4aGNtZGxjM1JmYkc5dmNITXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6WlhGdVlXMWxjeTVtYVdWc1pDQTlJRndpYkc5dmNGOWphSEpjSWl3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITjBZWEowTG1acFpXeGtJRDBnWENKc2IyOXdYM04wWVhKMFhDSXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYm1RdVptbGxiR1FnUFNCY0lteHZiM0JmWlc1a1hDSXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JyWldWd0xtVjRkSEpoTG1OdmJIVnRibk1nUFNCVVVsVkZLVnh1WEc0aklFWnBibVFnYjNabGNteGhjSE1nWW1WMGQyVmxiaUJEYUVsUUxYTmxjU0J3WldGcmN5QmhibVFnZEdobElHeGhjbWRsYzNRZ2JHOXZjSE5jYm1Ob2FYQmZiM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHeGhjbWRsYzNSZmJHOXZjSE5IY2l3Z2NHVmhheTVEVkVOR0tWeHVYRzRqSUVOdmRXNTBJSFJvWlNCdWRXMWlaWElnYjJZZ1EyaEpVQzF6WlhFZ2NHVmhhM01nY0dWeUlHeHZiM0JjYm14dmIzQmZjR1ZoYTE5amIzVnVkSE1nUEMwZ2RHRmliR1VvY1hWbGNubElhWFJ6S0dOb2FYQmZiM1psY214aGNITXBLVnh1WEc0aklFTnlaV0YwWlNCaElHUmhkR0VnWm5KaGJXVWdkMmwwYUNCMGFHVWdZMjkxYm5SeklHRnVaQ0JzYjI5d0lHUmxkR0ZwYkhOY2JteGhjbWRsYzNSZmJHOXZjSE1rWkdWdWMybDBlU0E4TFNBd0lDQWpJRWx1YVhScFlXeHBlbVVnWkdWdWMybDBlU0JqYjJ4MWJXNWNibXhoY21kbGMzUmZiRzl2Y0hNa1kyOTFiblFnUEMwZ01DQWdJQ0FqSUVsdWFYUnBZV3hwZW1VZ2NHVmhheUJqYjNWdWRDQmpiMngxYlc1Y2JseHVJeUJCWkdRZ2NHVmhheUJqYjNWdWRITWdkRzhnZEdobElHTnZjbkpsYzNCdmJtUnBibWNnYkc5dmNITmNibXhoY21kbGMzUmZiRzl2Y0hOYllYTXViblZ0WlhKcFl5aHVZVzFsY3loc2IyOXdYM0JsWVd0ZlkyOTFiblJ6S1Nrc0lGd2lZMjkxYm5SY0lsMGdQQzBnWVhNdWFXNTBaV2RsY2loc2IyOXdYM0JsWVd0ZlkyOTFiblJ6S1Z4dVhHNGpJRU5oYkdOMWJHRjBaU0IwYUdVZ1pHVnVjMmwwZVNBb2NHVmhhM01nY0dWeUlHdHBiRzlpWVhObEtWeHViR0Z5WjJWemRGOXNiMjl3Y3lSa1pXNXphWFI1SUR3dElHeGhjbWRsYzNSZmJHOXZjSE1rWTI5MWJuUWdMeUFvS0d4aGNtZGxjM1JmYkc5dmNITWtiRzl2Y0Y5M2FXUjBhQzB4S1NBdklERXdNREFwWEc1Y2JseHVaR0YwWVNBOExTQjBhV0ppYkdVb1hHNGdJR2RsYm1VZ1BTQmpLR2RsYm1VdVozSnZkWEF4TENCblpXNWxMbWR5YjNWd01pa3NYRzRnSUdkeWIzVndJRDBnWXloeVpYQW9YQ0puY205MWNERmNJaXdnYkdWdVozUm9LR2RsYm1VdVozSnZkWEF4S1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhBb1hDSm5jbTkxY0RKY0lpd2diR1Z1WjNSb0tHZGxibVV1WjNKdmRYQXlLU2twWEc0cFhHNWNibVJoZEdFZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9teGxablJmYW05cGJpaHNZWEpuWlhOMFgyeHZiM0J6TENCaWVTQTlJR01vWENKblpXNWxYQ0lwS1Z4dVpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNCb1lYTlRVeUE5SUdsbVpXeHpaU2hwY3k1dVlTaHNiMjl3WDNkcFpIUm9LU3dnWENKT1Qxd2lMQ0JjSWxsRlUxd2lLVnh1S1NBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lob1lYTlRVeUE5UFNCY0lsbEZVMXdpS1Z4dVhHNW5aWFJRZG1Gc1YybHNZMjk0SUR3dElHWjFibU4wYVc5dUtHUmhkR0VzSUdkeWIzVndNU3dnWjNKdmRYQXlLWHRjYmlBZ1pHbHpkR0Z1WTJVeElEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOVozSnZkWEF4S1NBcEpHUmxibk5wZEhsY2JpQWdaR2x6ZEdGdVkyVXlJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlaM0p2ZFhBeUtTQXBKR1JsYm5OcGRIbGNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNWNibkIySUR3dElHTnZiblpRZG1Gc2RXVW9aMlYwVUhaaGJGZHBiR052ZUNoa1lYUmhMQ0JjSW1keWIzVndNVndpTENCY0ltZHliM1Z3TWx3aUtTbGNibHh1WjJkd2JHOTBLR1JoZEdFc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQmtaVzV6YVhSNUtTa2dLeUJuWlc5dFgzWnBiMnhwYmloaFpYTW9abWxzYkNBOUlHZHliM1Z3S1N3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4TENCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFcElDdGNiaUFnYzNSaGRGOXpkVzF0WVhKNUtHRmxjeWhuY205MWNDQTlJR2R5YjNWd0tTd2dablZ1SUQwZ2JXVmhiaXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuWlc5dElEMGdYQ0p3YjJsdWRGd2lMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTWl3Z1ptbHNiQ0E5SUZ3aWNtVmtYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpS1NBclhHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJYRzRnSUdGdWJtOTBZWFJsS0Z3aWRHVjRkRndpTENCNElEMGdNU3dnZVNBOUlEQXNJR3hoWW1Wc0lEMGdjSFlzSUhOcGVtVWdQU0ExTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWlrZ0sxeHVJQ0JuWjNScGRHeGxLRndpUTFSRFJsd2lLVnh1WEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG4jIFZpZXcgcmVzdWx0c1xuZ2dwbG90KGxhcmdlc3RfbG9vcHMsIGFlcyh4ID0gbG9vcF93aWR0aCkpICsgZ2VvbV9oaXN0b2dyYW0oKVxuXG5cbiMjIyBDaGVja2luZyBob3cgbWFueSBnZW5lcyBmcm9tIGVhY2ggZ3JvdXAgaGFzIGVuY29tcGFzc2luZyBTLVNcbmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5nZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5kYXRhIDwtIHRpYmJsZShcbiAgZ2VuZSA9IGMoZ2VuZS5ncm91cDEsIGdlbmUuZ3JvdXAyKSxcbiAgZ3JvdXAgPSBjKHJlcChcXGdyb3VwMVxcLCBsZW5ndGgoZ2VuZS5ncm91cDEpKSxcbiAgICAgICAgICAgIHJlcChcXGdyb3VwMlxcLCBsZW5ndGgoZ2VuZS5ncm91cDIpKSlcbilcblxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKGxhcmdlc3RfbG9vcHMsIGJ5ID0gYyhcXGdlbmVcXCkpXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGhhc1NTID0gaWZlbHNlKGlzLm5hKGxvb3Bfd2lkdGgpLCBcXE5PXFwsIFxcWUVTXFwpXG4pXG5cbmRhdGFfc3VtbWFyeSA8LSBkYXRhICU+JVxuICBncm91cF9ieShncm91cCkgJT4lXG4gIHN1bW1hcml6ZShcbiAgICB0b3RhbCA9IG4oKSxcbiAgICBoYXNTU195ZXMgPSBzdW0oaGFzU1MgPT0gXFxZRVNcXCksXG4gICAgcGVyY2VudGFnZV95ZXMgPSAoaGFzU1NfeWVzIC8gdG90YWwpICogMTAwXG4gIClcblxuZ2dwbG90KGRhdGFfc3VtbWFyeSwgYWVzKHggPSBncm91cCwgeSA9IHBlcmNlbnRhZ2VfeWVzLCBmaWxsID0gZ3JvdXApKSArXG4gIGdlb21fYmFyKHN0YXQgPSBcXGlkZW50aXR5XFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIGxhYnMoXG4gICAgdGl0bGUgPSBcXFBlcmNlbnRhZ2Ugb2YgRWFjaCBHcm91cCB3aXRoIGhhc1NTID0gWUVTXFwsXG4gICAgeCA9IFxcR3JvdXBcXCxcbiAgICB5ID0gXFxQZXJjZW50YWdlICglKVxcXG4gICkgKyB5bGltKDAsIDEwMCkgK1xuICB0aGVtZV9taW5pbWFsKClcblxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaGFzU1MgPT0gXFxZRVNcXClcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkbG9vcF93aWR0aFxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkbG9vcF93aWR0aFxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cbnB2IDwtIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSlcblxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBsb29wX3dpZHRoKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41KSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcHYsIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuIyMjIENvbXBhcmluZyBSTkEgcGVydHVyYmF0aW9uXG5cbmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OnNlbGVjdChjKDEsIDQsIDUpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShoYXNTUyA9IGlmZWxzZShlbnNlbWJsX2dlbmVfaWQgJWluJSBsYXJnZXN0X2xvb3BzJGdlbmUsIFxcaGFzU1NcXCwgXFxub1NTXFwpKVxuXG5cbmdncGxvdChkaWZmLlJOQSwgYWVzKHggPSBhYnMobG9nMkZvbGRDaGFuZ2UpLCBjb2xvciA9IGhhc1NTKSkgK1xuICBzdGF0X2VjZGYoc2l6ZSA9IDAuNCkgK1xuICBsYWJzKFxuICAgIHggPSBcXEFic29sdXRlIGxvZzIoZm9sZCBjaGFuZ2UpXFwsXG4gICAgeSA9IFxcQ3VtdWxhdGl2ZSBQcm9iYWJpbGl0eVxcXG4gICkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMS41KSkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyAjIENsZWFuIHRoZW1lXG4gIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgIClcblxuXG4jIyMgQ2hlY2tpbmcgQ2hJUCBwZWFrIGRlbnNpdHlcbmxhcmdlc3RfbG9vcHNHciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUobGFyZ2VzdF9sb29wcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcW5hbWVzLmZpZWxkID0gXFxsb29wX2NoclxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQuZmllbGQgPSBcXGxvb3Bfc3RhcnRcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5maWVsZCA9IFxcbG9vcF9lbmRcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpXG5cbiMgRmluZCBvdmVybGFwcyBiZXR3ZWVuIENoSVAtc2VxIHBlYWtzIGFuZCB0aGUgbGFyZ2VzdCBsb29wc1xuY2hpcF9vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMobGFyZ2VzdF9sb29wc0dyLCBwZWFrLkNUQ0YpXG5cbiMgQ291bnQgdGhlIG51bWJlciBvZiBDaElQLXNlcSBwZWFrcyBwZXIgbG9vcFxubG9vcF9wZWFrX2NvdW50cyA8LSB0YWJsZShxdWVyeUhpdHMoY2hpcF9vdmVybGFwcykpXG5cbiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIHRoZSBjb3VudHMgYW5kIGxvb3AgZGV0YWlsc1xubGFyZ2VzdF9sb29wcyRkZW5zaXR5IDwtIDAgICMgSW5pdGlhbGl6ZSBkZW5zaXR5IGNvbHVtblxubGFyZ2VzdF9sb29wcyRjb3VudCA8LSAwICAgICMgSW5pdGlhbGl6ZSBwZWFrIGNvdW50IGNvbHVtblxuXG4jIEFkZCBwZWFrIGNvdW50cyB0byB0aGUgY29ycmVzcG9uZGluZyBsb29wc1xubGFyZ2VzdF9sb29wc1thcy5udW1lcmljKG5hbWVzKGxvb3BfcGVha19jb3VudHMpKSwgXFxjb3VudFxcXSA8LSBhcy5pbnRlZ2VyKGxvb3BfcGVha19jb3VudHMpXG5cbiMgQ2FsY3VsYXRlIHRoZSBkZW5zaXR5IChwZWFrcyBwZXIga2lsb2Jhc2UpXG5sYXJnZXN0X2xvb3BzJGRlbnNpdHkgPC0gbGFyZ2VzdF9sb29wcyRjb3VudCAvICgobGFyZ2VzdF9sb29wcyRsb29wX3dpZHRoLTEpIC8gMTAwMClcblxuXG5kYXRhIDwtIHRpYmJsZShcbiAgZ2VuZSA9IGMoZ2VuZS5ncm91cDEsIGdlbmUuZ3JvdXAyKSxcbiAgZ3JvdXAgPSBjKHJlcChcXGdyb3VwMVxcLCBsZW5ndGgoZ2VuZS5ncm91cDEpKSxcbiAgICAgICAgICAgIHJlcChcXGdyb3VwMlxcLCBsZW5ndGgoZ2VuZS5ncm91cDIpKSlcbilcblxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKGxhcmdlc3RfbG9vcHMsIGJ5ID0gYyhcXGdlbmVcXCkpXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGhhc1NTID0gaWZlbHNlKGlzLm5hKGxvb3Bfd2lkdGgpLCBcXE5PXFwsIFxcWUVTXFwpXG4pICU+JSBkcGx5cjo6ZmlsdGVyKGhhc1NTID09IFxcWUVTXFwpXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkZGVuc2l0eVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkZGVuc2l0eVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucHYgPC0gY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpKVxuXG5nZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGRlbnNpdHkpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBcbiAgICAgICAgICAgICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwdiwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIGdndGl0bGUoXFxDVENGXFwpXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# View results
ggplot(largest_loops, aes(x = loop_width)) + geom_histogram()


### Checking how many genes from each group has encompassing S-S
gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

data <- tibble(
  gene = c(gene.group1, gene.group2),
  group = c(rep(\group1\, length(gene.group1)),
            rep(\group2\, length(gene.group2)))
)

data <- data %>% dplyr::left_join(largest_loops, by = c(\gene\))
data <- data %>% dplyr::mutate(
  hasSS = ifelse(is.na(loop_width), \NO\, \YES\)
)

data_summary <- data %>%
  group_by(group) %>%
  summarize(
    total = n(),
    hasSS_yes = sum(hasSS == \YES\),
    percentage_yes = (hasSS_yes / total) * 100
  )

ggplot(data_summary, aes(x = group, y = percentage_yes, fill = group)) +
  geom_bar(stat = \identity\, color = \black\) +
  labs(
    title = \Percentage of Each Group with hasSS = YES\,
    x = \Group\,
    y = \Percentage (%)\
  ) + ylim(0, 100) +
  theme_minimal()


temp <- data %>% dplyr::filter(hasSS == \YES\)
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$loop_width
  distance2 <- (data %>% dplyr::filter(group ==group2) )$loop_width
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}
pv <- convPvalue(getPvalWilcox(temp, \group1\, \group2\))

ggplot(temp, aes(x = group, y = loop_width)) + geom_violin() + geom_boxplot(width = 0.5) +
  annotate(\text\, x = 1, y = 0, label = pv, size = 5, color = \black\)

### Comparing RNA perturbation

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(c(1, 4, 5)) %>%
  dplyr::mutate(hasSS = ifelse(ensembl_gene_id %in% largest_loops$gene, \hasSS\, \noSS\))


ggplot(diff.RNA, aes(x = abs(log2FoldChange), color = hasSS)) +
  stat_ecdf(size = 0.4) +
  labs(
    x = \Absolute log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )


### Checking ChIP peak density
largest_loopsGr <- makeGRangesFromDataFrame(largest_loops, 
                                            seqnames.field = \loop_chr\, 
                                            start.field = \loop_start\, 
                                            end.field = \loop_end\, 
                                            keep.extra.columns = TRUE)

# Find overlaps between ChIP-seq peaks and the largest loops
chip_overlaps <- findOverlaps(largest_loopsGr, peak.CTCF)

# Count the number of ChIP-seq peaks per loop
loop_peak_counts <- table(queryHits(chip_overlaps))

# Create a data frame with the counts and loop details
largest_loops$density <- 0  # Initialize density column
largest_loops$count <- 0    # Initialize peak count column

# Add peak counts to the corresponding loops
largest_loops[as.numeric(names(loop_peak_counts)), \count\] <- as.integer(loop_peak_counts)

# Calculate the density (peaks per kilobase)
largest_loops$density <- largest_loops$count / ((largest_loops$loop_width-1) / 1000)


data <- tibble(
  gene = c(gene.group1, gene.group2),
  group = c(rep(\group1\, length(gene.group1)),
            rep(\group2\, length(gene.group2)))
)

data <- data %>% dplyr::left_join(largest_loops, by = c(\gene\))
data <- data %>% dplyr::mutate(
  hasSS = ifelse(is.na(loop_width), \NO\, \YES\)
) %>% dplyr::filter(hasSS == \YES\)

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$density
  distance2 <- (data %>% dplyr::filter(group ==group2) )$density
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

pv <- convPvalue(getPvalWilcox(data, \group1\, \group2\))

ggplot(data, aes(x = group, y = density)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
  geom_boxplot(width = 0.1, outlier.shape = NA) +
  stat_summary(aes(group = group), fun = mean, 
               geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  theme_classic() +
  annotate(\text\, x = 1, y = 0, label = pv, size = 5, color = \black\) +
  ggtitle(\CTCF\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QldhV1YzSUhKbGMzVnNkSE5jYm1kbmNHeHZkQ2hzWVhKblpYTjBYMnh2YjNCekxDQmhaWE1vZUNBOUlHeHZiM0JmZDJsa2RHZ3BLU0FySUdkbGIyMWZhR2x6ZEc5bmNtRnRLQ2xjYmx4dVhHNGpJeU1nUTJobFkydHBibWNnYUc5M0lHMWhibmtnWjJWdVpYTWdabkp2YlNCbFlXTm9JR2R5YjNWd0lHaGhjeUJsYm1OdmJYQmhjM05wYm1jZ1V5MVRYRzVuWlc1bExtZHliM1Z3TVNBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYRnhuWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlltbHVZWEo1UjNKdmRYQXhMblJ6ZGx4Y0tTa2taMlZ1WlZ4dVoyVnVaUzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ4Y1oyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMkpwYm1GeWVVZHliM1Z3TWk1MGMzWmNYQ2twSkdkbGJtVmNibHh1WkdGMFlTQThMU0IwYVdKaWJHVW9YRzRnSUdkbGJtVWdQU0JqS0dkbGJtVXVaM0p2ZFhBeExDQm5aVzVsTG1keWIzVndNaWtzWEc0Z0lHZHliM1Z3SUQwZ1l5aHlaWEFvWEZ4bmNtOTFjREZjWEN3Z2JHVnVaM1JvS0dkbGJtVXVaM0p2ZFhBeEtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYQW9YRnhuY205MWNESmNYQ3dnYkdWdVozUm9LR2RsYm1VdVozSnZkWEF5S1NrcFhHNHBYRzVjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbXhsWm5SZmFtOXBiaWhzWVhKblpYTjBYMnh2YjNCekxDQmllU0E5SUdNb1hGeG5aVzVsWEZ3cEtWeHVaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQm9ZWE5UVXlBOUlHbG1aV3h6WlNocGN5NXVZU2hzYjI5d1gzZHBaSFJvS1N3Z1hGeE9UMXhjTENCY1hGbEZVMXhjS1Z4dUtWeHVYRzVrWVhSaFgzTjFiVzFoY25rZ1BDMGdaR0YwWVNBbFBpVmNiaUFnWjNKdmRYQmZZbmtvWjNKdmRYQXBJQ1UrSlZ4dUlDQnpkVzF0WVhKcGVtVW9YRzRnSUNBZ2RHOTBZV3dnUFNCdUtDa3NYRzRnSUNBZ2FHRnpVMU5mZVdWeklEMGdjM1Z0S0doaGMxTlRJRDA5SUZ4Y1dVVlRYRndwTEZ4dUlDQWdJSEJsY21ObGJuUmhaMlZmZVdWeklEMGdLR2hoYzFOVFgzbGxjeUF2SUhSdmRHRnNLU0FxSURFd01GeHVJQ0FwWEc1Y2JtZG5jR3h2ZENoa1lYUmhYM04xYlcxaGNua3NJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0J3WlhKalpXNTBZV2RsWDNsbGN5d2dabWxzYkNBOUlHZHliM1Z3S1NrZ0sxeHVJQ0JuWlc5dFgySmhjaWh6ZEdGMElEMGdYRnhwWkdWdWRHbDBlVnhjTENCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWENrZ0sxeHVJQ0JzWVdKektGeHVJQ0FnSUhScGRHeGxJRDBnWEZ4UVpYSmpaVzUwWVdkbElHOW1JRVZoWTJnZ1IzSnZkWEFnZDJsMGFDQm9ZWE5UVXlBOUlGbEZVMXhjTEZ4dUlDQWdJSGdnUFNCY1hFZHliM1Z3WEZ3c1hHNGdJQ0FnZVNBOUlGeGNVR1Z5WTJWdWRHRm5aU0FvSlNsY1hGeHVJQ0FwSUNzZ2VXeHBiU2d3TENBeE1EQXBJQ3RjYmlBZ2RHaGxiV1ZmYldsdWFXMWhiQ2dwWEc1Y2JseHVkR1Z0Y0NBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0doaGMxTlRJRDA5SUZ4Y1dVVlRYRndwWEc1blpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaUFnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXhLU0FwSkd4dmIzQmZkMmxrZEdoY2JpQWdaR2x6ZEdGdVkyVXlJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlaM0p2ZFhBeUtTQXBKR3h2YjNCZmQybGtkR2hjYmlBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SUNCeVpYUjFjbTRvZDJsc0pIQXVkbUZzZFdVcFhHNTlYRzV3ZGlBOExTQmpiMjUyVUhaaGJIVmxLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWEZ4bmNtOTFjREZjWEN3Z1hGeG5jbTkxY0RKY1hDa3BYRzVjYm1kbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdiRzl2Y0Y5M2FXUjBhQ2twSUNzZ1oyVnZiVjkyYVc5c2FXNG9LU0FySUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVOU2tnSzF4dUlDQmhibTV2ZEdGMFpTaGNYSFJsZUhSY1hDd2dlQ0E5SURFc0lIa2dQU0F3TENCc1lXSmxiQ0E5SUhCMkxDQnphWHBsSUQwZ05Td2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3BYRzVjYmlNakl5QkRiMjF3WVhKcGJtY2dVazVCSUhCbGNuUjFjbUpoZEdsdmJseHVYRzVrYVdabUxsSk9RU0E4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeGthV1ptWDBjeExtUlVRVWRmUnpFdU1ta3VaRlJCUjE5MmMxOUhNUzR5YVM1RVRWTlBMblJ6ZGx4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwelpXeGxZM1FvWXlneExDQTBMQ0ExS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9hR0Z6VTFNZ1BTQnBabVZzYzJVb1pXNXpaVzFpYkY5blpXNWxYMmxrSUNWcGJpVWdiR0Z5WjJWemRGOXNiMjl3Y3lSblpXNWxMQ0JjWEdoaGMxTlRYRndzSUZ4Y2JtOVRVMXhjS1NsY2JseHVYRzVuWjNCc2IzUW9aR2xtWmk1U1RrRXNJR0ZsY3loNElEMGdZV0p6S0d4dlp6SkdiMnhrUTJoaGJtZGxLU3dnWTI5c2IzSWdQU0JvWVhOVFV5a3BJQ3RjYmlBZ2MzUmhkRjlsWTJSbUtITnBlbVVnUFNBd0xqUXBJQ3RjYmlBZ2JHRmljeWhjYmlBZ0lDQjRJRDBnWEZ4QlluTnZiSFYwWlNCc2IyY3lLR1p2YkdRZ1kyaGhibWRsS1Z4Y0xGeHVJQ0FnSUhrZ1BTQmNYRU4xYlhWc1lYUnBkbVVnVUhKdlltRmlhV3hwZEhsY1hGeHVJQ0FwSUNzZ1kyOXZjbVJmWTJGeWRHVnphV0Z1S0hoc2FXMGdQU0JqS0RBc0lERXVOU2twSUN0Y2JpQWdkR2hsYldWZlkyeGhjM05wWXlncElDc2dJeUJEYkdWaGJpQjBhR1Z0WlZ4dUlDQjBhR1Z0WlNoY2JpQWdJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVTBzWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVTBzWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11YkdsdVpTQTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJwWTJ0eklEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcExGeHVJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGeGNkSEpoYm5Od1lYSmxiblJjWENrc1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWxjYmlBZ0lDQXBYRzVjYmx4dUl5TWpJRU5vWldOcmFXNW5JRU5vU1ZBZ2NHVmhheUJrWlc1emFYUjVYRzVzWVhKblpYTjBYMnh2YjNCelIzSWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLR3hoY21kbGMzUmZiRzl2Y0hNc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpaWEZ1WVcxbGN5NW1hV1ZzWkNBOUlGeGNiRzl2Y0Y5amFISmNYQ3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOMFlYSjBMbVpwWld4a0lEMGdYRnhzYjI5d1gzTjBZWEowWEZ3c0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxibVF1Wm1sbGJHUWdQU0JjWEd4dmIzQmZaVzVrWEZ3c0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnJaV1Z3TG1WNGRISmhMbU52YkhWdGJuTWdQU0JVVWxWRktWeHVYRzRqSUVacGJtUWdiM1psY214aGNITWdZbVYwZDJWbGJpQkRhRWxRTFhObGNTQndaV0ZyY3lCaGJtUWdkR2hsSUd4aGNtZGxjM1FnYkc5dmNITmNibU5vYVhCZmIzWmxjbXhoY0hNZ1BDMGdabWx1WkU5MlpYSnNZWEJ6S0d4aGNtZGxjM1JmYkc5dmNITkhjaXdnY0dWaGF5NURWRU5HS1Z4dVhHNGpJRU52ZFc1MElIUm9aU0J1ZFcxaVpYSWdiMllnUTJoSlVDMXpaWEVnY0dWaGEzTWdjR1Z5SUd4dmIzQmNibXh2YjNCZmNHVmhhMTlqYjNWdWRITWdQQzBnZEdGaWJHVW9jWFZsY25sSWFYUnpLR05vYVhCZmIzWmxjbXhoY0hNcEtWeHVYRzRqSUVOeVpXRjBaU0JoSUdSaGRHRWdabkpoYldVZ2QybDBhQ0IwYUdVZ1kyOTFiblJ6SUdGdVpDQnNiMjl3SUdSbGRHRnBiSE5jYm14aGNtZGxjM1JmYkc5dmNITWtaR1Z1YzJsMGVTQThMU0F3SUNBaklFbHVhWFJwWVd4cGVtVWdaR1Z1YzJsMGVTQmpiMngxYlc1Y2JteGhjbWRsYzNSZmJHOXZjSE1rWTI5MWJuUWdQQzBnTUNBZ0lDQWpJRWx1YVhScFlXeHBlbVVnY0dWaGF5QmpiM1Z1ZENCamIyeDFiVzVjYmx4dUl5QkJaR1FnY0dWaGF5QmpiM1Z1ZEhNZ2RHOGdkR2hsSUdOdmNuSmxjM0J2Ym1ScGJtY2diRzl2Y0hOY2JteGhjbWRsYzNSZmJHOXZjSE5iWVhNdWJuVnRaWEpwWXlodVlXMWxjeWhzYjI5d1gzQmxZV3RmWTI5MWJuUnpLU2tzSUZ4Y1kyOTFiblJjWEYwZ1BDMGdZWE11YVc1MFpXZGxjaWhzYjI5d1gzQmxZV3RmWTI5MWJuUnpLVnh1WEc0aklFTmhiR04xYkdGMFpTQjBhR1VnWkdWdWMybDBlU0FvY0dWaGEzTWdjR1Z5SUd0cGJHOWlZWE5sS1Z4dWJHRnlaMlZ6ZEY5c2IyOXdjeVJrWlc1emFYUjVJRHd0SUd4aGNtZGxjM1JmYkc5dmNITWtZMjkxYm5RZ0x5QW9LR3hoY21kbGMzUmZiRzl2Y0hNa2JHOXZjRjkzYVdSMGFDMHhLU0F2SURFd01EQXBYRzVjYmx4dVpHRjBZU0E4TFNCMGFXSmliR1VvWEc0Z0lHZGxibVVnUFNCaktHZGxibVV1WjNKdmRYQXhMQ0JuWlc1bExtZHliM1Z3TWlrc1hHNGdJR2R5YjNWd0lEMGdZeWh5WlhBb1hGeG5jbTkxY0RGY1hDd2diR1Z1WjNSb0tHZGxibVV1WjNKdmRYQXhLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWEFvWEZ4bmNtOTFjREpjWEN3Z2JHVnVaM1JvS0dkbGJtVXVaM0p2ZFhBeUtTa3BYRzRwWEc1Y2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T214bFpuUmZhbTlwYmloc1lYSm5aWE4wWDJ4dmIzQnpMQ0JpZVNBOUlHTW9YRnhuWlc1bFhGd3BLVnh1WkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0JvWVhOVFV5QTlJR2xtWld4elpTaHBjeTV1WVNoc2IyOXdYM2RwWkhSb0tTd2dYRnhPVDF4Y0xDQmNYRmxGVTF4Y0tWeHVLU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhvWVhOVFV5QTlQU0JjWEZsRlUxeGNLVnh1WEc1blpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaUFnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXhLU0FwSkdSbGJuTnBkSGxjYmlBZ1pHbHpkR0Z1WTJVeUlEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOVozSnZkWEF5S1NBcEpHUmxibk5wZEhsY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1Y2JuQjJJRHd0SUdOdmJuWlFkbUZzZFdVb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExDQmNYR2R5YjNWd01WeGNMQ0JjWEdkeWIzVndNbHhjS1NsY2JseHVaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCa1pXNXphWFI1S1NrZ0t5Qm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUdkeWIzVndLU3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUN0Y2JpQWdjM1JoZEY5emRXMXRZWEo1S0dGbGN5aG5jbTkxY0NBOUlHZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5aVzl0SUQwZ1hGeHdiMmx1ZEZ4Y0xDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRnhjY21Wa1hGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNLU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJR0Z1Ym05MFlYUmxLRnhjZEdWNGRGeGNMQ0I0SUQwZ01Td2dlU0E5SURBc0lHeGhZbVZzSUQwZ2NIWXNJSE5wZW1VZ1BTQTFMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ2tnSzF4dUlDQm5aM1JwZEd4bEtGeGNRMVJEUmx4Y0tWeHVYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuIyBWaWV3IHJlc3VsdHNcbmdncGxvdChsYXJnZXN0X2xvb3BzLCBhZXMoeCA9IGxvb3Bfd2lkdGgpKSArIGdlb21faGlzdG9ncmFtKClcblxuXG4jIyMgQ2hlY2tpbmcgaG93IG1hbnkgZ2VuZXMgZnJvbSBlYWNoIGdyb3VwIGhhcyBlbmNvbXBhc3NpbmcgUy1TXG5nZW5lLmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ2VuZS5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuZGF0YSA8LSB0aWJibGUoXG4gIGdlbmUgPSBjKGdlbmUuZ3JvdXAxLCBnZW5lLmdyb3VwMiksXG4gIGdyb3VwID0gYyhyZXAoXFxncm91cDFcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAxKSksXG4gICAgICAgICAgICByZXAoXFxncm91cDJcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAyKSkpXG4pXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihsYXJnZXN0X2xvb3BzLCBieSA9IGMoXFxnZW5lXFwpKVxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKFxuICBoYXNTUyA9IGlmZWxzZShpcy5uYShsb29wX3dpZHRoKSwgXFxOT1xcLCBcXFlFU1xcKVxuKVxuXG5kYXRhX3N1bW1hcnkgPC0gZGF0YSAlPiVcbiAgZ3JvdXBfYnkoZ3JvdXApICU+JVxuICBzdW1tYXJpemUoXG4gICAgdG90YWwgPSBuKCksXG4gICAgaGFzU1NfeWVzID0gc3VtKGhhc1NTID09IFxcWUVTXFwpLFxuICAgIHBlcmNlbnRhZ2VfeWVzID0gKGhhc1NTX3llcyAvIHRvdGFsKSAqIDEwMFxuICApXG5cbmdncGxvdChkYXRhX3N1bW1hcnksIGFlcyh4ID0gZ3JvdXAsIHkgPSBwZXJjZW50YWdlX3llcywgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBsYWJzKFxuICAgIHRpdGxlID0gXFxQZXJjZW50YWdlIG9mIEVhY2ggR3JvdXAgd2l0aCBoYXNTUyA9IFlFU1xcLFxuICAgIHggPSBcXEdyb3VwXFwsXG4gICAgeSA9IFxcUGVyY2VudGFnZSAoJSlcXFxuICApICsgeWxpbSgwLCAxMDApICtcbiAgdGhlbWVfbWluaW1hbCgpXG5cblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGhhc1NTID09IFxcWUVTXFwpXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGxvb3Bfd2lkdGhcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGxvb3Bfd2lkdGhcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5wdiA8LSBjb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgXFxncm91cDFcXCwgXFxncm91cDJcXCkpXG5cbmdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gbG9vcF93aWR0aCkpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHB2LCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyBDb21wYXJpbmcgUk5BIHBlcnR1cmJhdGlvblxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoYygxLCA0LCA1KSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoaGFzU1MgPSBpZmVsc2UoZW5zZW1ibF9nZW5lX2lkICVpbiUgbGFyZ2VzdF9sb29wcyRnZW5lLCBcXGhhc1NTXFwsIFxcbm9TU1xcKSlcblxuXG5nZ3Bsb3QoZGlmZi5STkEsIGFlcyh4ID0gYWJzKGxvZzJGb2xkQ2hhbmdlKSwgY29sb3IgPSBoYXNTUykpICtcbiAgc3RhdF9lY2RmKHNpemUgPSAwLjQpICtcbiAgbGFicyhcbiAgICB4ID0gXFxBYnNvbHV0ZSBsb2cyKGZvbGQgY2hhbmdlKVxcLFxuICAgIHkgPSBcXEN1bXVsYXRpdmUgUHJvYmFiaWxpdHlcXFxuICApICsgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDEuNSkpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgIyBDbGVhbiB0aGVtZVxuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApXG5cblxuIyMjIENoZWNraW5nIENoSVAgcGVhayBkZW5zaXR5XG5sYXJnZXN0X2xvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGxhcmdlc3RfbG9vcHMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFuYW1lcy5maWVsZCA9IFxcbG9vcF9jaHJcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LmZpZWxkID0gXFxsb29wX3N0YXJ0XFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQuZmllbGQgPSBcXGxvb3BfZW5kXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKVxuXG4jIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBDaElQLXNlcSBwZWFrcyBhbmQgdGhlIGxhcmdlc3QgbG9vcHNcbmNoaXBfb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGxhcmdlc3RfbG9vcHNHciwgcGVhay5DVENGKVxuXG4jIENvdW50IHRoZSBudW1iZXIgb2YgQ2hJUC1zZXEgcGVha3MgcGVyIGxvb3Bcbmxvb3BfcGVha19jb3VudHMgPC0gdGFibGUocXVlcnlIaXRzKGNoaXBfb3ZlcmxhcHMpKVxuXG4jIENyZWF0ZSBhIGRhdGEgZnJhbWUgd2l0aCB0aGUgY291bnRzIGFuZCBsb29wIGRldGFpbHNcbmxhcmdlc3RfbG9vcHMkZGVuc2l0eSA8LSAwICAjIEluaXRpYWxpemUgZGVuc2l0eSBjb2x1bW5cbmxhcmdlc3RfbG9vcHMkY291bnQgPC0gMCAgICAjIEluaXRpYWxpemUgcGVhayBjb3VudCBjb2x1bW5cblxuIyBBZGQgcGVhayBjb3VudHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbG9vcHNcbmxhcmdlc3RfbG9vcHNbYXMubnVtZXJpYyhuYW1lcyhsb29wX3BlYWtfY291bnRzKSksIFxcY291bnRcXF0gPC0gYXMuaW50ZWdlcihsb29wX3BlYWtfY291bnRzKVxuXG4jIENhbGN1bGF0ZSB0aGUgZGVuc2l0eSAocGVha3MgcGVyIGtpbG9iYXNlKVxubGFyZ2VzdF9sb29wcyRkZW5zaXR5IDwtIGxhcmdlc3RfbG9vcHMkY291bnQgLyAoKGxhcmdlc3RfbG9vcHMkbG9vcF93aWR0aC0xKSAvIDEwMDApXG5cblxuZGF0YSA8LSB0aWJibGUoXG4gIGdlbmUgPSBjKGdlbmUuZ3JvdXAxLCBnZW5lLmdyb3VwMiksXG4gIGdyb3VwID0gYyhyZXAoXFxncm91cDFcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAxKSksXG4gICAgICAgICAgICByZXAoXFxncm91cDJcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAyKSkpXG4pXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihsYXJnZXN0X2xvb3BzLCBieSA9IGMoXFxnZW5lXFwpKVxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKFxuICBoYXNTUyA9IGlmZWxzZShpcy5uYShsb29wX3dpZHRoKSwgXFxOT1xcLCBcXFlFU1xcKVxuKSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PSBcXFlFU1xcKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGRlbnNpdHlcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGRlbnNpdHlcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnB2IDwtIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSlcblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkZW5zaXR5KSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgXG4gICAgICAgICAgICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcHYsIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZ3RpdGxlKFxcQ1RDRlxcKVxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBWaWV3IHJlc3VsdHNcbmdncGxvdChsYXJnZXN0X2xvb3BzLCBhZXMoeCA9IGxvb3Bfd2lkdGgpKSArIGdlb21faGlzdG9ncmFtKClcblxuXG4jIyMgQ2hlY2tpbmcgaG93IG1hbnkgZ2VuZXMgZnJvbSBlYWNoIGdyb3VwIGhhcyBlbmNvbXBhc3NpbmcgUy1TXG5nZW5lLmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ2VuZS5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuZGF0YSA8LSB0aWJibGUoXG4gIGdlbmUgPSBjKGdlbmUuZ3JvdXAxLCBnZW5lLmdyb3VwMiksXG4gIGdyb3VwID0gYyhyZXAoXFxncm91cDFcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAxKSksXG4gICAgICAgICAgICByZXAoXFxncm91cDJcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAyKSkpXG4pXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihsYXJnZXN0X2xvb3BzLCBieSA9IGMoXFxnZW5lXFwpKVxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKFxuICBoYXNTUyA9IGlmZWxzZShpcy5uYShsb29wX3dpZHRoKSwgXFxOT1xcLCBcXFlFU1xcKVxuKVxuXG5kYXRhX3N1bW1hcnkgPC0gZGF0YSAlPiVcbiAgZ3JvdXBfYnkoZ3JvdXApICU+JVxuICBzdW1tYXJpemUoXG4gICAgdG90YWwgPSBuKCksXG4gICAgaGFzU1NfeWVzID0gc3VtKGhhc1NTID09IFxcWUVTXFwpLFxuICAgIHBlcmNlbnRhZ2VfeWVzID0gKGhhc1NTX3llcyAvIHRvdGFsKSAqIDEwMFxuICApXG5cbmdncGxvdChkYXRhX3N1bW1hcnksIGFlcyh4ID0gZ3JvdXAsIHkgPSBwZXJjZW50YWdlX3llcywgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBsYWJzKFxuICAgIHRpdGxlID0gXFxQZXJjZW50YWdlIG9mIEVhY2ggR3JvdXAgd2l0aCBoYXNTUyA9IFlFU1xcLFxuICAgIHggPSBcXEdyb3VwXFwsXG4gICAgeSA9IFxcUGVyY2VudGFnZSAoJSlcXFxuICApICsgeWxpbSgwLCAxMDApICtcbiAgdGhlbWVfbWluaW1hbCgpXG5cblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGhhc1NTID09IFxcWUVTXFwpXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGxvb3Bfd2lkdGhcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGxvb3Bfd2lkdGhcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5wdiA8LSBjb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgXFxncm91cDFcXCwgXFxncm91cDJcXCkpXG5cbmdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gbG9vcF93aWR0aCkpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHB2LCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpXG5cbiMjIyBDb21wYXJpbmcgUk5BIHBlcnR1cmJhdGlvblxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoYygxLCA0LCA1KSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoaGFzU1MgPSBpZmVsc2UoZW5zZW1ibF9nZW5lX2lkICVpbiUgbGFyZ2VzdF9sb29wcyRnZW5lLCBcXGhhc1NTXFwsIFxcbm9TU1xcKSlcblxuXG5nZ3Bsb3QoZGlmZi5STkEsIGFlcyh4ID0gYWJzKGxvZzJGb2xkQ2hhbmdlKSwgY29sb3IgPSBoYXNTUykpICtcbiAgc3RhdF9lY2RmKHNpemUgPSAwLjQpICtcbiAgbGFicyhcbiAgICB4ID0gXFxBYnNvbHV0ZSBsb2cyKGZvbGQgY2hhbmdlKVxcLFxuICAgIHkgPSBcXEN1bXVsYXRpdmUgUHJvYmFiaWxpdHlcXFxuICApICsgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDEuNSkpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgIyBDbGVhbiB0aGVtZVxuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApXG5cblxuIyMjIENoZWNraW5nIENoSVAgcGVhayBkZW5zaXR5XG5sYXJnZXN0X2xvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGxhcmdlc3RfbG9vcHMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFuYW1lcy5maWVsZCA9IFxcbG9vcF9jaHJcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LmZpZWxkID0gXFxsb29wX3N0YXJ0XFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQuZmllbGQgPSBcXGxvb3BfZW5kXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKVxuXG4jIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBDaElQLXNlcSBwZWFrcyBhbmQgdGhlIGxhcmdlc3QgbG9vcHNcbmNoaXBfb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGxhcmdlc3RfbG9vcHNHciwgcGVhay5DVENGKVxuXG4jIENvdW50IHRoZSBudW1iZXIgb2YgQ2hJUC1zZXEgcGVha3MgcGVyIGxvb3Bcbmxvb3BfcGVha19jb3VudHMgPC0gdGFibGUocXVlcnlIaXRzKGNoaXBfb3ZlcmxhcHMpKVxuXG4jIENyZWF0ZSBhIGRhdGEgZnJhbWUgd2l0aCB0aGUgY291bnRzIGFuZCBsb29wIGRldGFpbHNcbmxhcmdlc3RfbG9vcHMkZGVuc2l0eSA8LSAwICAjIEluaXRpYWxpemUgZGVuc2l0eSBjb2x1bW5cbmxhcmdlc3RfbG9vcHMkY291bnQgPC0gMCAgICAjIEluaXRpYWxpemUgcGVhayBjb3VudCBjb2x1bW5cblxuIyBBZGQgcGVhayBjb3VudHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbG9vcHNcbmxhcmdlc3RfbG9vcHNbYXMubnVtZXJpYyhuYW1lcyhsb29wX3BlYWtfY291bnRzKSksIFxcY291bnRcXF0gPC0gYXMuaW50ZWdlcihsb29wX3BlYWtfY291bnRzKVxuXG4jIENhbGN1bGF0ZSB0aGUgZGVuc2l0eSAocGVha3MgcGVyIGtpbG9iYXNlKVxubGFyZ2VzdF9sb29wcyRkZW5zaXR5IDwtIGxhcmdlc3RfbG9vcHMkY291bnQgLyAoKGxhcmdlc3RfbG9vcHMkbG9vcF93aWR0aC0xKSAvIDEwMDApXG5cblxuZGF0YSA8LSB0aWJibGUoXG4gIGdlbmUgPSBjKGdlbmUuZ3JvdXAxLCBnZW5lLmdyb3VwMiksXG4gIGdyb3VwID0gYyhyZXAoXFxncm91cDFcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAxKSksXG4gICAgICAgICAgICByZXAoXFxncm91cDJcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAyKSkpXG4pXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihsYXJnZXN0X2xvb3BzLCBieSA9IGMoXFxnZW5lXFwpKVxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKFxuICBoYXNTUyA9IGlmZWxzZShpcy5uYShsb29wX3dpZHRoKSwgXFxOT1xcLCBcXFlFU1xcKVxuKSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PSBcXFlFU1xcKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGRlbnNpdHlcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGRlbnNpdHlcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnB2IDwtIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSlcblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkZW5zaXR5KSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgXG4gICAgICAgICAgICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcHYsIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZ3RpdGxlKFxcQ1RDRlxcKVxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
# View results
ggplot(largest_loops, aes(x = loop_width)) + geom_histogram()


### Checking how many genes from each group has encompassing S-S
gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

data <- tibble(
  gene = c(gene.group1, gene.group2),
  group = c(rep(\group1\, length(gene.group1)),
            rep(\group2\, length(gene.group2)))
)

data <- data %>% dplyr::left_join(largest_loops, by = c(\gene\))
data <- data %>% dplyr::mutate(
  hasSS = ifelse(is.na(loop_width), \NO\, \YES\)
)

data_summary <- data %>%
  group_by(group) %>%
  summarize(
    total = n(),
    hasSS_yes = sum(hasSS == \YES\),
    percentage_yes = (hasSS_yes / total) * 100
  )

ggplot(data_summary, aes(x = group, y = percentage_yes, fill = group)) +
  geom_bar(stat = \identity\, color = \black\) +
  labs(
    title = \Percentage of Each Group with hasSS = YES\,
    x = \Group\,
    y = \Percentage (%)\
  ) + ylim(0, 100) +
  theme_minimal()


temp <- data %>% dplyr::filter(hasSS == \YES\)
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$loop_width
  distance2 <- (data %>% dplyr::filter(group ==group2) )$loop_width
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}
pv <- convPvalue(getPvalWilcox(temp, \group1\, \group2\))

ggplot(temp, aes(x = group, y = loop_width)) + geom_violin() + geom_boxplot(width = 0.5) +
  annotate(\text\, x = 1, y = 0, label = pv, size = 5, color = \black\)

### Comparing RNA perturbation

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(c(1, 4, 5)) %>%
  dplyr::mutate(hasSS = ifelse(ensembl_gene_id %in% largest_loops$gene, \hasSS\, \noSS\))


ggplot(diff.RNA, aes(x = abs(log2FoldChange), color = hasSS)) +
  stat_ecdf(size = 0.4) +
  labs(
    x = \Absolute log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )


### Checking ChIP peak density
largest_loopsGr <- makeGRangesFromDataFrame(largest_loops, 
                                            seqnames.field = \loop_chr\, 
                                            start.field = \loop_start\, 
                                            end.field = \loop_end\, 
                                            keep.extra.columns = TRUE)

# Find overlaps between ChIP-seq peaks and the largest loops
chip_overlaps <- findOverlaps(largest_loopsGr, peak.CTCF)

# Count the number of ChIP-seq peaks per loop
loop_peak_counts <- table(queryHits(chip_overlaps))

# Create a data frame with the counts and loop details
largest_loops$density <- 0  # Initialize density column
largest_loops$count <- 0    # Initialize peak count column

# Add peak counts to the corresponding loops
largest_loops[as.numeric(names(loop_peak_counts)), \count\] <- as.integer(loop_peak_counts)

# Calculate the density (peaks per kilobase)
largest_loops$density <- largest_loops$count / ((largest_loops$loop_width-1) / 1000)


data <- tibble(
  gene = c(gene.group1, gene.group2),
  group = c(rep(\group1\, length(gene.group1)),
            rep(\group2\, length(gene.group2)))
)

data <- data %>% dplyr::left_join(largest_loops, by = c(\gene\))
data <- data %>% dplyr::mutate(
  hasSS = ifelse(is.na(loop_width), \NO\, \YES\)
) %>% dplyr::filter(hasSS == \YES\)

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$density
  distance2 <- (data %>% dplyr::filter(group ==group2) )$density
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

pv <- convPvalue(getPvalWilcox(data, \group1\, \group2\))

ggplot(data, aes(x = group, y = density)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
  geom_boxplot(width = 0.1, outlier.shape = NA) +
  stat_summary(aes(group = group), fun = mean, 
               geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  theme_classic() +
  annotate(\text\, x = 1, y = 0, label = pv, size = 5, color = \black\) +
  ggtitle(\CTCF\)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [3.40] Finding largest encompassing S-S

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1WEc0aklFbE5VRTlTVkNCVExWTWdURTlQVUZOY2JtRnNiRXh2YjNCeklEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIa3VkSE4yWENJcEtWeHVjM1J5VEc5dmNITWdQQzBnWVd4c1RHOXZjSE1nSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvUVc1dWJ6SWdKV2x1SlNCaktGd2lVeTFUWENJcEtWeHVkR1Z0Y0NBOExTQnpkSEpNYjI5d2N5QWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLREVzSURJc0lETXNJRFVzSURZcEtTQWdJeUJCYzNOMWJXbHVaeUJqYjJ4MWJXNXpJR2x1WTJ4MVpHVWdZVzVqYUc5eUlIQnZjMmwwYVc5dWMxeHVZMjlzYm1GdFpYTW9kR1Z0Y0NrZ1BDMGdZeWhjSW1Ob2NtOXRYQ0lzSUZ3aWMzUmhjblF4WENJc0lGd2laVzVrTVZ3aUxDQmNJbk4wWVhKME1sd2lMQ0JjSW1WdVpESmNJaWxjYm5OMGNreHZiM0J6UjNJeElEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaGNiaUFnZEdWdGNDQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGphSEp2YlN3Z2MzUmhjblFnUFNCemRHRnlkREVzSUdWdVpDQTlJR1Z1WkRFcFhHNHBYRzV6ZEhKTWIyOXdjMGR5TWlBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1hHNGdJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1kyaHliMjBzSUhOMFlYSjBJRDBnYzNSaGNuUXlMQ0JsYm1RZ1BTQmxibVF5S1Z4dUtWeHVYRzRqSUVsTlVFOVNWQ0JEVkVOR0lFMVBWRWxHSUVGT1RrOVVRVlJKVDA1Y2JtTjBZMlpOYjNScFpuTWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aU16TXlORGhmUTFSRFJsOHdOeTAzTWpsZlFuSjFZMlV0TkY5d1pXRnJjeTV0WlhKblpWQmxZV3N1Ylc5MGFXWkJibTV2ZEdGMFpXUXVZbVZrWENJcEtWeHVZMjlzYm1GdFpYTW9ZM1JqWmsxdmRHbG1jeWtnUEMwZ1l5aGNJbU5vY205dFhDSXNJRndpYzNSaGNuUmNJaXdnWENKbGJtUmNJaXdnWENKdGIzUnBabHdpS1Z4dVkzUmpaa2R5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoamRHTm1UVzkwYVdaekxDQnJaV1Z3TG1WNGRISmhMbU52YkhWdGJuTWdQU0JVVWxWRktWeHVYRzRqSUVGdWJtOTBZWFJsSUdWaFkyZ2diRzl2Y0NCaGJtTm9iM0lnZDJsMGFDQkRWRU5HSUcxdmRHbG1jMXh1WVc1amFHOXlNVjkzYVhSb1gyTjBZMllnUEMwZ1ptbHVaRTkyWlhKc1lYQnpLSE4wY2t4dmIzQnpSM0l4TENCamRHTm1SM0lwWEc1aGJtTm9iM0l5WDNkcGRHaGZZM1JqWmlBOExTQm1hVzVrVDNabGNteGhjSE1vYzNSeVRHOXZjSE5IY2pJc0lHTjBZMlpIY2lsY2JseHVJeUJIWlhRZ2JXOTBhV1lnYVc1bWIzSnRZWFJwYjI0Z1ptOXlJR0Z1WTJodmNqRWdiM1psY214aGNITmNibUZ1WTJodmNqRmZZM1JqWmw5dGIzUnBaaUE4TFNCeVpYQW9Ua0VzSUd4bGJtZDBhQ2h6ZEhKTWIyOXdjMGR5TVNrcElDQWpJRWx1YVhScFlXeHBlbVVnYlc5MGFXWWdkbVZqZEc5eVhHNWhibU5vYjNJeFgyTjBZMlpmYlc5MGFXWmJjWFZsY25sSWFYUnpLR0Z1WTJodmNqRmZkMmwwYUY5amRHTm1LVjBnUEMwZ1kzUmpaa2R5VzNOMVltcGxZM1JJYVhSektHRnVZMmh2Y2pGZmQybDBhRjlqZEdObUtWMGtiVzkwYVdaY2JseHVJeUJIWlhRZ2JXOTBhV1lnYVc1bWIzSnRZWFJwYjI0Z1ptOXlJR0Z1WTJodmNqSWdiM1psY214aGNITmNibUZ1WTJodmNqSmZZM1JqWmw5dGIzUnBaaUE4TFNCeVpYQW9Ua0VzSUd4bGJtZDBhQ2h6ZEhKTWIyOXdjMGR5TWlrcElDQWpJRWx1YVhScFlXeHBlbVVnYlc5MGFXWWdkbVZqZEc5eVhHNWhibU5vYjNJeVgyTjBZMlpmYlc5MGFXWmJjWFZsY25sSWFYUnpLR0Z1WTJodmNqSmZkMmwwYUY5amRHTm1LVjBnUEMwZ1kzUmpaa2R5VzNOMVltcGxZM1JJYVhSektHRnVZMmh2Y2pKZmQybDBhRjlqZEdObUtWMGtiVzkwYVdaY2JseHVJeUJCWkdRZ2JXOTBhV1lnYVc1bWIzSnRZWFJwYjI0Z2RHOGdjM1J5VEc5dmNITmNibk4wY2t4dmIzQnpJRHd0SUhOMGNreHZiM0J6SUNVK0pWeHVJQ0J0ZFhSaGRHVW9YRzRnSUNBZ1lXNWphRzl5TVY5dGIzUnBaaUE5SUdGdVkyaHZjakZmWTNSalpsOXRiM1JwWml4Y2JpQWdJQ0JoYm1Ob2IzSXlYMjF2ZEdsbUlEMGdZVzVqYUc5eU1sOWpkR05tWDIxdmRHbG1YRzRnSUNsY2JseHVJeUJHYVd4MFpYSWdabTl5SUdOdmJuWmxjbWRsYm5RZ1ExUkRSaUJwYm5SbGNtRmpkR2x2Ym5NZ0tHWnZjbmRoY21RZ2FXNGdZVzVqYUc5eU1Td2djbVYyWlhKelpTQnBiaUJoYm1Ob2IzSXlLVnh1WTI5dWRtVnlaMlZ1ZEY5c2IyOXdjeUE4TFNCemRISk1iMjl3Y3lBbFBpVmNiaUFnWm1sc2RHVnlLR0Z1WTJodmNqRmZiVzkwYVdZZ1BUMGdYQ0ptZDJSY0lpQW1JR0Z1WTJodmNqSmZiVzkwYVdZZ1BUMGdYQ0p5WlhaY0lpa2dKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9RVzV1YnpJZ0pXbHVKU0JqS0Z3aVV5MVRYQ0lwS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbiMgSU1QT1JUIFMtUyBMT09QU1xuYWxsTG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpXG5zdHJMb29wcyA8LSBhbGxMb29wcyAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxTLVNcXCkpXG50ZW1wIDwtIHN0ckxvb3BzICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNSwgNikpICAjIEFzc3VtaW5nIGNvbHVtbnMgaW5jbHVkZSBhbmNob3IgcG9zaXRpb25zXG5jb2xuYW1lcyh0ZW1wKSA8LSBjKFxcY2hyb21cXCwgXFxzdGFydDFcXCwgXFxlbmQxXFwsIFxcc3RhcnQyXFwsIFxcZW5kMlxcKVxuc3RyTG9vcHNHcjEgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKFxuICB0ZW1wICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tLCBzdGFydCA9IHN0YXJ0MSwgZW5kID0gZW5kMSlcbilcbnN0ckxvb3BzR3IyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShcbiAgdGVtcCAlPiUgZHBseXI6OnNlbGVjdChjaHJvbSwgc3RhcnQgPSBzdGFydDIsIGVuZCA9IGVuZDIpXG4pXG5cbiMgSU1QT1JUIENUQ0YgTU9USUYgQU5OT1RBVElPTlxuY3RjZk1vdGlmcyA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFwzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5tb3RpZkFubm90YXRlZC5iZWRcXCkpXG5jb2xuYW1lcyhjdGNmTW90aWZzKSA8LSBjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXG1vdGlmXFwpXG5jdGNmR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGN0Y2ZNb3RpZnMsIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpXG5cbiMgQW5ub3RhdGUgZWFjaCBsb29wIGFuY2hvciB3aXRoIENUQ0YgbW90aWZzXG5hbmNob3IxX3dpdGhfY3RjZiA8LSBmaW5kT3ZlcmxhcHMoc3RyTG9vcHNHcjEsIGN0Y2ZHcilcbmFuY2hvcjJfd2l0aF9jdGNmIDwtIGZpbmRPdmVybGFwcyhzdHJMb29wc0dyMiwgY3RjZkdyKVxuXG4jIEdldCBtb3RpZiBpbmZvcm1hdGlvbiBmb3IgYW5jaG9yMSBvdmVybGFwc1xuYW5jaG9yMV9jdGNmX21vdGlmIDwtIHJlcChOQSwgbGVuZ3RoKHN0ckxvb3BzR3IxKSkgICMgSW5pdGlhbGl6ZSBtb3RpZiB2ZWN0b3JcbmFuY2hvcjFfY3RjZl9tb3RpZltxdWVyeUhpdHMoYW5jaG9yMV93aXRoX2N0Y2YpXSA8LSBjdGNmR3Jbc3ViamVjdEhpdHMoYW5jaG9yMV93aXRoX2N0Y2YpXSRtb3RpZlxuXG4jIEdldCBtb3RpZiBpbmZvcm1hdGlvbiBmb3IgYW5jaG9yMiBvdmVybGFwc1xuYW5jaG9yMl9jdGNmX21vdGlmIDwtIHJlcChOQSwgbGVuZ3RoKHN0ckxvb3BzR3IyKSkgICMgSW5pdGlhbGl6ZSBtb3RpZiB2ZWN0b3JcbmFuY2hvcjJfY3RjZl9tb3RpZltxdWVyeUhpdHMoYW5jaG9yMl93aXRoX2N0Y2YpXSA8LSBjdGNmR3Jbc3ViamVjdEhpdHMoYW5jaG9yMl93aXRoX2N0Y2YpXSRtb3RpZlxuXG4jIEFkZCBtb3RpZiBpbmZvcm1hdGlvbiB0byBzdHJMb29wc1xuc3RyTG9vcHMgPC0gc3RyTG9vcHMgJT4lXG4gIG11dGF0ZShcbiAgICBhbmNob3IxX21vdGlmID0gYW5jaG9yMV9jdGNmX21vdGlmLFxuICAgIGFuY2hvcjJfbW90aWYgPSBhbmNob3IyX2N0Y2ZfbW90aWZcbiAgKVxuXG4jIEZpbHRlciBmb3IgY29udmVyZ2VudCBDVENGIGludGVyYWN0aW9ucyAoZm9yd2FyZCBpbiBhbmNob3IxLCByZXZlcnNlIGluIGFuY2hvcjIpXG5jb252ZXJnZW50X2xvb3BzIDwtIHN0ckxvb3BzICU+JVxuICBmaWx0ZXIoYW5jaG9yMV9tb3RpZiA9PSBcXGZ3ZFxcICYgYW5jaG9yMl9tb3RpZiA9PSBcXHJldlxcKSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxTLVNcXCkpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
name <- \chromo_cons_annoHierarchy\

# IMPORT S-S LOOPS
allLoops <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\))
strLoops <- allLoops %>% dplyr::filter(Anno2 %in% c(\S-S\))
temp <- strLoops %>% dplyr::select(c(1, 2, 3, 5, 6))  # Assuming columns include anchor positions
colnames(temp) <- c(\chrom\, \start1\, \end1\, \start2\, \end2\)
strLoopsGr1 <- makeGRangesFromDataFrame(
  temp %>% dplyr::select(chrom, start = start1, end = end1)
)
strLoopsGr2 <- makeGRangesFromDataFrame(
  temp %>% dplyr::select(chrom, start = start2, end = end2)
)

# IMPORT CTCF MOTIF ANNOTATION
ctcfMotifs <- fread(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.motifAnnotated.bed\))
colnames(ctcfMotifs) <- c(\chrom\, \start\, \end\, \motif\)
ctcfGr <- makeGRangesFromDataFrame(ctcfMotifs, keep.extra.columns = TRUE)

# Annotate each loop anchor with CTCF motifs
anchor1_with_ctcf <- findOverlaps(strLoopsGr1, ctcfGr)
anchor2_with_ctcf <- findOverlaps(strLoopsGr2, ctcfGr)

# Get motif information for anchor1 overlaps
anchor1_ctcf_motif <- rep(NA, length(strLoopsGr1))  # Initialize motif vector
anchor1_ctcf_motif[queryHits(anchor1_with_ctcf)] <- ctcfGr[subjectHits(anchor1_with_ctcf)]$motif

# Get motif information for anchor2 overlaps
anchor2_ctcf_motif <- rep(NA, length(strLoopsGr2))  # Initialize motif vector
anchor2_ctcf_motif[queryHits(anchor2_with_ctcf)] <- ctcfGr[subjectHits(anchor2_with_ctcf)]$motif

# Add motif information to strLoops
strLoops <- strLoops %>%
  mutate(
    anchor1_motif = anchor1_ctcf_motif,
    anchor2_motif = anchor2_ctcf_motif
  )

# Filter for convergent CTCF interactions (forward in anchor1, reverse in anchor2)
convergent_loops <- strLoops %>%
  filter(anchor1_motif == \fwd\ & anchor2_motif == \rev\) %>% dplyr::filter(Anno2 %in% c(\S-S\))



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVYRzRqSUVsTlVFOVNWQ0JUTFZNZ1RFOVBVRk5jYm1Gc2JFeHZiM0J6SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhrdWRITjJYRndwS1Z4dWMzUnlURzl2Y0hNZ1BDMGdZV3hzVEc5dmNITWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9RVzV1YnpJZ0pXbHVKU0JqS0Z4Y1V5MVRYRndwS1Z4dWRHVnRjQ0E4TFNCemRISk1iMjl3Y3lBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNc0lEVXNJRFlwS1NBZ0l5QkJjM04xYldsdVp5QmpiMngxYlc1eklHbHVZMngxWkdVZ1lXNWphRzl5SUhCdmMybDBhVzl1YzF4dVkyOXNibUZ0WlhNb2RHVnRjQ2tnUEMwZ1l5aGNYR05vY205dFhGd3NJRnhjYzNSaGNuUXhYRndzSUZ4Y1pXNWtNVnhjTENCY1hITjBZWEowTWx4Y0xDQmNYR1Z1WkRKY1hDbGNibk4wY2t4dmIzQnpSM0l4SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoY2JpQWdkR1Z0Y0NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoamFISnZiU3dnYzNSaGNuUWdQU0J6ZEdGeWRERXNJR1Z1WkNBOUlHVnVaREVwWEc0cFhHNXpkSEpNYjI5d2MwZHlNaUE4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvWEc0Z0lIUmxiWEFnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWTJoeWIyMHNJSE4wWVhKMElEMGdjM1JoY25ReUxDQmxibVFnUFNCbGJtUXlLVnh1S1Z4dVhHNGpJRWxOVUU5U1ZDQkRWRU5HSUUxUFZFbEdJRUZPVGs5VVFWUkpUMDVjYm1OMFkyWk5iM1JwWm5NZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjTXpNeU5EaGZRMVJEUmw4d055MDNNamxmUW5KMVkyVXRORjl3WldGcmN5NXRaWEpuWlZCbFlXc3ViVzkwYVdaQmJtNXZkR0YwWldRdVltVmtYRndwS1Z4dVkyOXNibUZ0WlhNb1kzUmpaazF2ZEdsbWN5a2dQQzBnWXloY1hHTm9jbTl0WEZ3c0lGeGNjM1JoY25SY1hDd2dYRnhsYm1SY1hDd2dYRnh0YjNScFpseGNLVnh1WTNSalprZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2hqZEdObVRXOTBhV1p6TENCclpXVndMbVY0ZEhKaExtTnZiSFZ0Ym5NZ1BTQlVVbFZGS1Z4dVhHNGpJRUZ1Ym05MFlYUmxJR1ZoWTJnZ2JHOXZjQ0JoYm1Ob2IzSWdkMmwwYUNCRFZFTkdJRzF2ZEdsbWMxeHVZVzVqYUc5eU1WOTNhWFJvWDJOMFkyWWdQQzBnWm1sdVpFOTJaWEpzWVhCektITjBja3h2YjNCelIzSXhMQ0JqZEdObVIzSXBYRzVoYm1Ob2IzSXlYM2RwZEdoZlkzUmpaaUE4TFNCbWFXNWtUM1psY214aGNITW9jM1J5VEc5dmNITkhjaklzSUdOMFkyWkhjaWxjYmx4dUl5QkhaWFFnYlc5MGFXWWdhVzVtYjNKdFlYUnBiMjRnWm05eUlHRnVZMmh2Y2pFZ2IzWmxjbXhoY0hOY2JtRnVZMmh2Y2pGZlkzUmpabDl0YjNScFppQThMU0J5WlhBb1RrRXNJR3hsYm1kMGFDaHpkSEpNYjI5d2MwZHlNU2twSUNBaklFbHVhWFJwWVd4cGVtVWdiVzkwYVdZZ2RtVmpkRzl5WEc1aGJtTm9iM0l4WDJOMFkyWmZiVzkwYVdaYmNYVmxjbmxJYVhSektHRnVZMmh2Y2pGZmQybDBhRjlqZEdObUtWMGdQQzBnWTNSalprZHlXM04xWW1wbFkzUklhWFJ6S0dGdVkyaHZjakZmZDJsMGFGOWpkR05tS1Ywa2JXOTBhV1pjYmx4dUl5QkhaWFFnYlc5MGFXWWdhVzVtYjNKdFlYUnBiMjRnWm05eUlHRnVZMmh2Y2pJZ2IzWmxjbXhoY0hOY2JtRnVZMmh2Y2pKZlkzUmpabDl0YjNScFppQThMU0J5WlhBb1RrRXNJR3hsYm1kMGFDaHpkSEpNYjI5d2MwZHlNaWtwSUNBaklFbHVhWFJwWVd4cGVtVWdiVzkwYVdZZ2RtVmpkRzl5WEc1aGJtTm9iM0l5WDJOMFkyWmZiVzkwYVdaYmNYVmxjbmxJYVhSektHRnVZMmh2Y2pKZmQybDBhRjlqZEdObUtWMGdQQzBnWTNSalprZHlXM04xWW1wbFkzUklhWFJ6S0dGdVkyaHZjakpmZDJsMGFGOWpkR05tS1Ywa2JXOTBhV1pjYmx4dUl5QkJaR1FnYlc5MGFXWWdhVzVtYjNKdFlYUnBiMjRnZEc4Z2MzUnlURzl2Y0hOY2JuTjBja3h2YjNCeklEd3RJSE4wY2t4dmIzQnpJQ1UrSlZ4dUlDQnRkWFJoZEdVb1hHNGdJQ0FnWVc1amFHOXlNVjl0YjNScFppQTlJR0Z1WTJodmNqRmZZM1JqWmw5dGIzUnBaaXhjYmlBZ0lDQmhibU5vYjNJeVgyMXZkR2xtSUQwZ1lXNWphRzl5TWw5amRHTm1YMjF2ZEdsbVhHNGdJQ2xjYmx4dUl5QkdhV3gwWlhJZ1ptOXlJR052Ym5abGNtZGxiblFnUTFSRFJpQnBiblJsY21GamRHbHZibk1nS0dadmNuZGhjbVFnYVc0Z1lXNWphRzl5TVN3Z2NtVjJaWEp6WlNCcGJpQmhibU5vYjNJeUtWeHVZMjl1ZG1WeVoyVnVkRjlzYjI5d2N5QThMU0J6ZEhKTWIyOXdjeUFsUGlWY2JpQWdabWxzZEdWeUtHRnVZMmh2Y2pGZmJXOTBhV1lnUFQwZ1hGeG1kMlJjWENBbUlHRnVZMmh2Y2pKZmJXOTBhV1lnUFQwZ1hGeHlaWFpjWENrZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1FXNXVieklnSldsdUpTQmpLRnhjVXkxVFhGd3BLVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG4jIElNUE9SVCBTLVMgTE9PUFNcbmFsbExvb3BzIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKVxuc3RyTG9vcHMgPC0gYWxsTG9vcHMgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUy1TXFwpKVxudGVtcCA8LSBzdHJMb29wcyAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDUsIDYpKSAgIyBBc3N1bWluZyBjb2x1bW5zIGluY2x1ZGUgYW5jaG9yIHBvc2l0aW9uc1xuY29sbmFtZXModGVtcCkgPC0gYyhcXGNocm9tXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXClcbnN0ckxvb3BzR3IxIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShcbiAgdGVtcCAlPiUgZHBseXI6OnNlbGVjdChjaHJvbSwgc3RhcnQgPSBzdGFydDEsIGVuZCA9IGVuZDEpXG4pXG5zdHJMb29wc0dyMiA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoXG4gIHRlbXAgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20sIHN0YXJ0ID0gc3RhcnQyLCBlbmQgPSBlbmQyKVxuKVxuXG4jIElNUE9SVCBDVENGIE1PVElGIEFOTk9UQVRJT05cbmN0Y2ZNb3RpZnMgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsubW90aWZBbm5vdGF0ZWQuYmVkXFwpKVxuY29sbmFtZXMoY3RjZk1vdGlmcykgPC0gYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxtb3RpZlxcKVxuY3RjZkdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShjdGNmTW90aWZzLCBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKVxuXG4jIEFubm90YXRlIGVhY2ggbG9vcCBhbmNob3Igd2l0aCBDVENGIG1vdGlmc1xuYW5jaG9yMV93aXRoX2N0Y2YgPC0gZmluZE92ZXJsYXBzKHN0ckxvb3BzR3IxLCBjdGNmR3IpXG5hbmNob3IyX3dpdGhfY3RjZiA8LSBmaW5kT3ZlcmxhcHMoc3RyTG9vcHNHcjIsIGN0Y2ZHcilcblxuIyBHZXQgbW90aWYgaW5mb3JtYXRpb24gZm9yIGFuY2hvcjEgb3ZlcmxhcHNcbmFuY2hvcjFfY3RjZl9tb3RpZiA8LSByZXAoTkEsIGxlbmd0aChzdHJMb29wc0dyMSkpICAjIEluaXRpYWxpemUgbW90aWYgdmVjdG9yXG5hbmNob3IxX2N0Y2ZfbW90aWZbcXVlcnlIaXRzKGFuY2hvcjFfd2l0aF9jdGNmKV0gPC0gY3RjZkdyW3N1YmplY3RIaXRzKGFuY2hvcjFfd2l0aF9jdGNmKV0kbW90aWZcblxuIyBHZXQgbW90aWYgaW5mb3JtYXRpb24gZm9yIGFuY2hvcjIgb3ZlcmxhcHNcbmFuY2hvcjJfY3RjZl9tb3RpZiA8LSByZXAoTkEsIGxlbmd0aChzdHJMb29wc0dyMikpICAjIEluaXRpYWxpemUgbW90aWYgdmVjdG9yXG5hbmNob3IyX2N0Y2ZfbW90aWZbcXVlcnlIaXRzKGFuY2hvcjJfd2l0aF9jdGNmKV0gPC0gY3RjZkdyW3N1YmplY3RIaXRzKGFuY2hvcjJfd2l0aF9jdGNmKV0kbW90aWZcblxuIyBBZGQgbW90aWYgaW5mb3JtYXRpb24gdG8gc3RyTG9vcHNcbnN0ckxvb3BzIDwtIHN0ckxvb3BzICU+JVxuICBtdXRhdGUoXG4gICAgYW5jaG9yMV9tb3RpZiA9IGFuY2hvcjFfY3RjZl9tb3RpZixcbiAgICBhbmNob3IyX21vdGlmID0gYW5jaG9yMl9jdGNmX21vdGlmXG4gIClcblxuIyBGaWx0ZXIgZm9yIGNvbnZlcmdlbnQgQ1RDRiBpbnRlcmFjdGlvbnMgKGZvcndhcmQgaW4gYW5jaG9yMSwgcmV2ZXJzZSBpbiBhbmNob3IyKVxuY29udmVyZ2VudF9sb29wcyA8LSBzdHJMb29wcyAlPiVcbiAgZmlsdGVyKGFuY2hvcjFfbW90aWYgPT0gXFxmd2RcXCAmIGFuY2hvcjJfbW90aWYgPT0gXFxyZXZcXCkgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUy1TXFwpKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG4jIElNUE9SVCBTLVMgTE9PUFNcbmFsbExvb3BzIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKVxuc3RyTG9vcHMgPC0gYWxsTG9vcHMgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUy1TXFwpKVxudGVtcCA8LSBzdHJMb29wcyAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDUsIDYpKSAgIyBBc3N1bWluZyBjb2x1bW5zIGluY2x1ZGUgYW5jaG9yIHBvc2l0aW9uc1xuY29sbmFtZXModGVtcCkgPC0gYyhcXGNocm9tXFwsIFxcc3RhcnQxXFwsIFxcZW5kMVxcLCBcXHN0YXJ0MlxcLCBcXGVuZDJcXClcbnN0ckxvb3BzR3IxIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShcbiAgdGVtcCAlPiUgZHBseXI6OnNlbGVjdChjaHJvbSwgc3RhcnQgPSBzdGFydDEsIGVuZCA9IGVuZDEpXG4pXG5zdHJMb29wc0dyMiA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoXG4gIHRlbXAgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20sIHN0YXJ0ID0gc3RhcnQyLCBlbmQgPSBlbmQyKVxuKVxuXG4jIElNUE9SVCBDVENGIE1PVElGIEFOTk9UQVRJT05cbmN0Y2ZNb3RpZnMgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsubW90aWZBbm5vdGF0ZWQuYmVkXFwpKVxuY29sbmFtZXMoY3RjZk1vdGlmcykgPC0gYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxtb3RpZlxcKVxuY3RjZkdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShjdGNmTW90aWZzLCBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKVxuXG4jIEFubm90YXRlIGVhY2ggbG9vcCBhbmNob3Igd2l0aCBDVENGIG1vdGlmc1xuYW5jaG9yMV93aXRoX2N0Y2YgPC0gZmluZE92ZXJsYXBzKHN0ckxvb3BzR3IxLCBjdGNmR3IpXG5hbmNob3IyX3dpdGhfY3RjZiA8LSBmaW5kT3ZlcmxhcHMoc3RyTG9vcHNHcjIsIGN0Y2ZHcilcblxuIyBHZXQgbW90aWYgaW5mb3JtYXRpb24gZm9yIGFuY2hvcjEgb3ZlcmxhcHNcbmFuY2hvcjFfY3RjZl9tb3RpZiA8LSByZXAoTkEsIGxlbmd0aChzdHJMb29wc0dyMSkpICAjIEluaXRpYWxpemUgbW90aWYgdmVjdG9yXG5hbmNob3IxX2N0Y2ZfbW90aWZbcXVlcnlIaXRzKGFuY2hvcjFfd2l0aF9jdGNmKV0gPC0gY3RjZkdyW3N1YmplY3RIaXRzKGFuY2hvcjFfd2l0aF9jdGNmKV0kbW90aWZcblxuIyBHZXQgbW90aWYgaW5mb3JtYXRpb24gZm9yIGFuY2hvcjIgb3ZlcmxhcHNcbmFuY2hvcjJfY3RjZl9tb3RpZiA8LSByZXAoTkEsIGxlbmd0aChzdHJMb29wc0dyMikpICAjIEluaXRpYWxpemUgbW90aWYgdmVjdG9yXG5hbmNob3IyX2N0Y2ZfbW90aWZbcXVlcnlIaXRzKGFuY2hvcjJfd2l0aF9jdGNmKV0gPC0gY3RjZkdyW3N1YmplY3RIaXRzKGFuY2hvcjJfd2l0aF9jdGNmKV0kbW90aWZcblxuIyBBZGQgbW90aWYgaW5mb3JtYXRpb24gdG8gc3RyTG9vcHNcbnN0ckxvb3BzIDwtIHN0ckxvb3BzICU+JVxuICBtdXRhdGUoXG4gICAgYW5jaG9yMV9tb3RpZiA9IGFuY2hvcjFfY3RjZl9tb3RpZixcbiAgICBhbmNob3IyX21vdGlmID0gYW5jaG9yMl9jdGNmX21vdGlmXG4gIClcblxuIyBGaWx0ZXIgZm9yIGNvbnZlcmdlbnQgQ1RDRiBpbnRlcmFjdGlvbnMgKGZvcndhcmQgaW4gYW5jaG9yMSwgcmV2ZXJzZSBpbiBhbmNob3IyKVxuY29udmVyZ2VudF9sb29wcyA8LSBzdHJMb29wcyAlPiVcbiAgZmlsdGVyKGFuY2hvcjFfbW90aWYgPT0gXFxmd2RcXCAmIGFuY2hvcjJfbW90aWYgPT0gXFxyZXZcXCkgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKFxcUy1TXFwpKVxuYGBgXG5gYGAifQ== -->

```r
```r
name <- \chromo_cons_annoHierarchy\

# IMPORT S-S LOOPS
allLoops <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\))
strLoops <- allLoops %>% dplyr::filter(Anno2 %in% c(\S-S\))
temp <- strLoops %>% dplyr::select(c(1, 2, 3, 5, 6))  # Assuming columns include anchor positions
colnames(temp) <- c(\chrom\, \start1\, \end1\, \start2\, \end2\)
strLoopsGr1 <- makeGRangesFromDataFrame(
  temp %>% dplyr::select(chrom, start = start1, end = end1)
)
strLoopsGr2 <- makeGRangesFromDataFrame(
  temp %>% dplyr::select(chrom, start = start2, end = end2)
)

# IMPORT CTCF MOTIF ANNOTATION
ctcfMotifs <- fread(here(refDir, \33248_CTCF_07-729_Bruce-4_peaks.mergePeak.motifAnnotated.bed\))
colnames(ctcfMotifs) <- c(\chrom\, \start\, \end\, \motif\)
ctcfGr <- makeGRangesFromDataFrame(ctcfMotifs, keep.extra.columns = TRUE)

# Annotate each loop anchor with CTCF motifs
anchor1_with_ctcf <- findOverlaps(strLoopsGr1, ctcfGr)
anchor2_with_ctcf <- findOverlaps(strLoopsGr2, ctcfGr)

# Get motif information for anchor1 overlaps
anchor1_ctcf_motif <- rep(NA, length(strLoopsGr1))  # Initialize motif vector
anchor1_ctcf_motif[queryHits(anchor1_with_ctcf)] <- ctcfGr[subjectHits(anchor1_with_ctcf)]$motif

# Get motif information for anchor2 overlaps
anchor2_ctcf_motif <- rep(NA, length(strLoopsGr2))  # Initialize motif vector
anchor2_ctcf_motif[queryHits(anchor2_with_ctcf)] <- ctcfGr[subjectHits(anchor2_with_ctcf)]$motif

# Add motif information to strLoops
strLoops <- strLoops %>%
  mutate(
    anchor1_motif = anchor1_ctcf_motif,
    anchor2_motif = anchor2_ctcf_motif
  )

# Filter for convergent CTCF interactions (forward in anchor1, reverse in anchor2)
convergent_loops <- strLoops %>%
  filter(anchor1_motif == \fwd\ & anchor2_motif == \rev\) %>% dplyr::filter(Anno2 %in% c(\S-S\))
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJGZUhSeVlXTjBJR3h2YjNBZ1ltOTFibVJoY25rZ1puSnZiU0JzWldaMElIUnZJSEpwWjJoMFhHNTBaVzF3SUR3dElHTnZiblpsY21kbGJuUmZiRzl2Y0hNZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1l5Z3hMQ0F5TENBMktTbGNibU52Ykc1aGJXVnpLSFJsYlhBcElEd3RJR01vWENKamFISnZiVndpTENCY0luTjBZWEowWENJc0lGd2laVzVrWENJcFhHNXpkSEpNYjI5d2MwZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2gwWlcxd0tWeHVYRzRqSUVsTlVFOVNWQ0JVVTFOY2JtWnNZVzVyVTJsNlpTQThMU0F4TUZ4dVoyVnVaUzUwWWlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0p0YlRFd1gwZFNRMjB6T0M1d05sOW5aVzVsWDNOdmNuUmxaQzVpWldSY0lpa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0ZSVFV5QTlJR2xtWld4elpTaFdOQ0E5UFNCY0lpdGNJaXdnVmpJc0lGWXpLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JVVTFOemRHRnlkQ0E5SUZSVFV5QXRJR1pzWVc1clUybDZaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JVVTFObGJtUWdQU0JVVTFNZ0t5Qm1iR0Z1YTFOcGVtVXBJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0ZZeExDQlVVMU56ZEdGeWRDd2dWRk5UWlc1a0xDQldOaXdnVmpVcFhHNWpiMnh1WVcxbGN5aG5aVzVsTG5SaUtTQThMU0JqS0Z3aVkyaHliMjFjSWl3Z1hDSnpkR0Z5ZEZ3aUxDQmNJbVZ1WkZ3aUxDQmNJbVZ1YzJWdFlteGNJaXdnWENKblpXNWxYQ0lwWEc1blpXNWxSM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0dkbGJtVXVkR0lzSUd0bFpYQXVaWGgwY21FdVkyOXNkVzF1Y3lBOUlGUlNWVVVwWEc1Y2JseHVJeUJHYVc1a0lHOTJaWEpzWVhCeklHSmxkSGRsWlc0Z2JHOXZjSE1nWVc1a0lGUlRVMXh1YjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR2RsYm1WSGNpd2djM1J5VEc5dmNITkhjaWxjYmx4dUl5QkJibTV2ZEdGMFpTQnZkbVZ5YkdGd2MxeHVkSE56WDNkcGRHaGZiRzl2Y0hNZ1BDMGdaMlZ1WlVkeVczRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGRYRzVzYjI5d2MxOTNhWFJvWDNSemN5QThMU0J6ZEhKTWIyOXdjMGR5VzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMWNibHh1SXlCRGIyMWlhVzVsSUdsdWRHOGdZU0JrWVhSaElHWnlZVzFsSUdadmNpQndjbTlqWlhOemFXNW5YRzVzYjI5d1gyUmhkR0VnUEMwZ1pHRjBZUzVtY21GdFpTaG5aVzVsSUQwZ2RITnpYM2RwZEdoZmJHOXZjSE1rWlc1elpXMWliQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNCZlkyaHlJRDBnYzJWeGJtRnRaWE1vYkc5dmNITmZkMmwwYUY5MGMzTXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzl2Y0Y5emRHRnlkQ0E5SUhOMFlYSjBLR3h2YjNCelgzZHBkR2hmZEhOektTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0JmWlc1a0lEMGdaVzVrS0d4dmIzQnpYM2RwZEdoZmRITnpLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2YjNCZmQybGtkR2dnUFNCM2FXUjBhQ2hzYjI5d2MxOTNhWFJvWDNSemN5a3BYRzVjYmlNZ1NXUmxiblJwWm5rZ2RHaGxJR3hoY21kbGMzUWdiRzl2Y0NCbWIzSWdaV0ZqYUNCblpXNWxYRzVzWVhKblpYTjBYMnh2YjNCeklEd3RJR3h2YjNCZlpHRjBZVnR2Y21SbGNpaHNiMjl3WDJSaGRHRWtaMlZ1WlN3Z0xXeHZiM0JmWkdGMFlTUnNiMjl3WDNkcFpIUm9LU3dnWFZ4dWJHRnlaMlZ6ZEY5c2IyOXdjeUE4TFNCc1lYSm5aWE4wWDJ4dmIzQnpXeUZrZFhCc2FXTmhkR1ZrS0d4aGNtZGxjM1JmYkc5dmNITWtaMlZ1WlNrc0lGMWNibXhoY21kbGMzUmZiRzl2Y0hNZ1BDMGdiR0Z5WjJWemRGOXNiMjl3Y3lBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoc2IyOXdTVVFnUFNCd1lYTjBaU2hzYjI5d1gyTm9jaXdnYkc5dmNGOXpkR0Z5ZEN3Z2JHOXZjRjlsYm1Rc0lITmxjQ0E5SUZ3aVgxd2lLU2xjYm14aGNtZGxjM1JmYkc5dmNITWdQQzBnYkdGeVoyVnpkRjlzYjI5d2MxdHZjbVJsY2loc1lYSm5aWE4wWDJ4dmIzQnpKR3h2YjNCZlkyaHlMQ0JzWVhKblpYTjBYMnh2YjNCekpHeHZiM0JmYzNSaGNuUXBMRjFjYm5KdmQyNWhiV1Z6S0d4aGNtZGxjM1JmYkc5dmNITXBJRHd0SUU1VlRFeGNibHh1SXlCRGFHVmphMmx1WnlCemJXRnNiR1Z5SUd4dmIzQnpYRzVoYkd4TWIyOXdjMGR5SUR3dElHMWhhMlZIVW1GdVoyVnpSbkp2YlVSaGRHRkdjbUZ0WlNoaGJHeE1iMjl3Y3l3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6WlhGdVlXMWxjeTVtYVdWc1pDQTlJRndpWTJoeWIyMHhYQ0lzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM1JoY25RdVptbGxiR1FnUFNCY0luTjBZWEowTVZ3aUxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWdVpDNW1hV1ZzWkNBOUlGd2laVzVrTWx3aUtWeHViR0Z5WjJWemRFeHZiM0J6UjNJZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtHeGhjbWRsYzNSZmJHOXZjSE1zSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGNXNWhiV1Z6TG1acFpXeGtJRDBnWENKc2IyOXdYMk5vY2x3aUxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpkR0Z5ZEM1bWFXVnNaQ0E5SUZ3aWJHOXZjRjl6ZEdGeWRGd2lMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYm1RdVptbGxiR1FnUFNCY0lteHZiM0JmWlc1a1hDSXBYRzVzWVhKblpYTjBURzl2Y0hOSGNpQThMU0J6YjNKMEtIVnVhWEYxWlNoc1lYSm5aWE4wVEc5dmNITkhjaWtwWEc1amIyMXdiR1YwWlY5dmRtVnliR0Z3Y3lBOExTQnpkV0p6WlhSQ2VVOTJaWEpzWVhCektHRnNiRXh2YjNCelIzSXNJR3hoY21kbGMzUk1iMjl3YzBkeUxDQjBlWEJsSUQwZ1hDSjNhWFJvYVc1Y0lpbGNibTkyWlhKc1lYQnpJRHd0SUdacGJtUlBkbVZ5YkdGd2N5aGpiMjF3YkdWMFpWOXZkbVZ5YkdGd2N5d2diR0Z5WjJWemRFeHZiM0J6UjNJcFhHNWNibHh1WTI5dGNHeGxkR1ZQZG1WeWJHRndSR1lnUEMwZ1lYTXVaR0YwWVM1bWNtRnRaU2hqYjIxd2JHVjBaVjl2ZG1WeWJHRndjeWtnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvYkc5dmNFbEVRV3hzSUQwZ2NHRnpkR1VvYzJWeGJtRnRaWE1zSUhOMFlYSjBMQ0JsYm1Rc0lITmxjQ0E5SUZ3aVgxd2lLU2xjYm14aGNtZGxjM1JNYjI5d2MwUm1JRHd0SUdGekxtUmhkR0V1Wm5KaGJXVW9iR0Z5WjJWemRFeHZiM0J6UjNJcElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtHeHZiM0JKUkNBOUlIQmhjM1JsS0hObGNXNWhiV1Z6TENCemRHRnlkQ3dnWlc1a0xDQnpaWEFnUFNCY0lsOWNJaWtwWEc1Y2JteHZiM0JKUkhCaGFYSnpJRHd0SUdSaGRHRXVabkpoYldVb2JHOXZjRWxFSUQwZ1kyOXRjR3hsZEdWUGRtVnliR0Z3UkdZa2JHOXZjRWxFUVd4c1czRjFaWEo1U0dsMGN5aHZkbVZ5YkdGd2N5bGRMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjI5d1NVUXlJRDBnYkdGeVoyVnpkRXh2YjNCelJHWWtiRzl2Y0VsRVczTjFZbXBsWTNSSWFYUnpLRzkyWlhKc1lYQnpLVjBwWEc1Y2JpTWdZV3hzVEc5dmNITkJibTV2ZEdGMFpXUWdQQzBnWVd4c1RHOXZjSE1nSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvYkc5dmNFbEVJRDBnY0dGemRHVW9ZMmh5YjIweExDQnpkR0Z5ZERFc0lHVnVaRElzSUhObGNDQTlJRndpWDF3aUtTa2dKVDRsSUdSd2JIbHlPanBzWldaMFgycHZhVzRvYkc5dmNFbEVjR0ZwY25Nc0lHSjVJRDBnWXloY0lteHZiM0JKUkZ3aUtTbGNibHh1WEc0akl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qWEc1a2FXWm1RM1YwYjJabUlEd3RJREF1TWx4dVoyVnVaVUZ1Ym05RVlYUmhJRHd0SUd4dllXUk1iMjl3UVc1dWIwUmhkR0VvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUhCaGMzUmxNQ2h1WVcxbExDQmNJbDl3TFc1ZlpXNXpaVzFpYkV4cGMzUXVkSE4yWENJcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsbVprTjFkRzltWmlBOUlHUnBabVpEZFhSdlptWXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGdWJtOU1hWE4wSUQwZ1l5aGNJbEF0VUZ3aUxDQmNJbEF0UlZ3aUxDQmNJbEF0VTF3aUxDQmNJbEF0V0Z3aUtTa2dKVDRsSUhWdWJtVnpkQ2huWlc1bEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hzYjI5d1NVUWdQU0J3WVhOMFpTaGphSEp2YlRFc0lITjBZWEowTVN3Z1pXNWtNaXdnYzJWd0lEMGdYQ0pmWENJcEtWeHVkR1Z0Y0NBOExTQm5aVzVsUVc1dWIwUmhkR0VnSlQ0bElHUndiSGx5T2pwc1pXWjBYMnB2YVc0b2JHOXZjRWxFY0dGcGNuTXNJR0o1SUQwZ1l5aGNJbXh2YjNCSlJGd2lLU2xjYm5SbGJYQXlJRHd0SUhSbGJYQWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aMlZ1WlN3Z2JHOXZjRWxFTWlrZ0pUNGxYRzRnSUdkeWIzVndYMko1S0dkbGJtVXBJQ1UrSlNBZ0lDQWdJQ0FnSUNBZ0lDQWdJeUJIY205MWNDQmtZWFJoSUdKNUlIUm9aU0FuWjJWdVpTY2dZMjlzZFcxdVhHNGdJSE4xYlcxaGNtbDZaU2huWlc1bFNHRnpVMU1nUFNBaFlXeHNLR2x6TG01aEtHeHZiM0JKUkRJcEtTa2dJQ01nUTJobFkyc2dhV1lnWVd4c0lHeHZiM0JKUkRJZ2RtRnNkV1Z6SUdadmNpQmxZV05vSUdkbGJtVWdZWEpsSUU1QlhHNTBaVzF3SUR3dElIUmxiWEFnSlQ0bElHeGxablJmYW05cGJpaDBaVzF3TWl3Z1lua2dQU0JqS0Z3aVoyVnVaVndpS1NsY2JtUmhkR0V1WVd4c0lEd3RJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCcFptVnNjMlVvSVdkbGJtVklZWE5UVXl3Z1hDSk9iMXdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1aV3h6WlNocGN5NXVZU2hzYjI5d1NVUXlLU3dnWENKUGRYUnphV1JsWENJc0lGd2lWMmwwYUdsdVhDSXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnphWHBsSUQwZ2MzUmhjblF5SUMwZ2MzUmhjblF4S1Z4dVhHNGpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNalhHNXZkWFJtYVd4bElEd3RJR1JoZEdFdVlXeHNJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR3h2YjNCSlJESXNJR2RsYm1VcElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtDRnBjeTV1WVNoc2IyOXdTVVF5S1NrZ0pUNGxYRzRnSUhObGNHRnlZWFJsS0d4dmIzQkpSRElzSUdsdWRHOGdQU0JqS0Z3aVkyaHliMjFjSWl3Z1hDSnpkR0Z5ZEZ3aUxDQmNJbVZ1WkZ3aUtTd2djMlZ3SUQwZ1hDSmZYQ0lzSUdOdmJuWmxjblFnUFNCVVVsVkZLVnh1SXlCbWQzSnBkR1VvYjNWMFptbHNaU3dnYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ3aVkyOXVkbVZ5WjJWdWRGOXpjMTlrYjIxaGFXNHVZbVZrWENJcExDQnpaWEFnUFNCY0lseGNkRndpTENCamIyd3VibUZ0WlhNZ1BTQkdRVXhUUlNsY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG4jIEV4dHJhY3QgbG9vcCBib3VuZGFyeSBmcm9tIGxlZnQgdG8gcmlnaHRcbnRlbXAgPC0gY29udmVyZ2VudF9sb29wcyAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDYpKVxuY29sbmFtZXModGVtcCkgPC0gYyhcXGNocm9tXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcbnN0ckxvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApXG5cbiMgSU1QT1JUIFRTU1xuZmxhbmtTaXplIDwtIDEwXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLFxuICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLFxuICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY2LCBWNSlcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcZW5zZW1ibFxcLCBcXGdlbmVcXClcbmdlbmVHciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS50Yiwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSlcblxuXG4jIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBsb29wcyBhbmQgVFNTXG5vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoZ2VuZUdyLCBzdHJMb29wc0dyKVxuXG4jIEFubm90YXRlIG92ZXJsYXBzXG50c3Nfd2l0aF9sb29wcyA8LSBnZW5lR3JbcXVlcnlIaXRzKG92ZXJsYXBzKV1cbmxvb3BzX3dpdGhfdHNzIDwtIHN0ckxvb3BzR3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXVxuXG4jIENvbWJpbmUgaW50byBhIGRhdGEgZnJhbWUgZm9yIHByb2Nlc3Npbmdcbmxvb3BfZGF0YSA8LSBkYXRhLmZyYW1lKGdlbmUgPSB0c3Nfd2l0aF9sb29wcyRlbnNlbWJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9jaHIgPSBzZXFuYW1lcyhsb29wc193aXRoX3RzcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wX3N0YXJ0ID0gc3RhcnQobG9vcHNfd2l0aF90c3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9lbmQgPSBlbmQobG9vcHNfd2l0aF90c3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF93aWR0aCA9IHdpZHRoKGxvb3BzX3dpdGhfdHNzKSlcblxuIyBJZGVudGlmeSB0aGUgbGFyZ2VzdCBsb29wIGZvciBlYWNoIGdlbmVcbmxhcmdlc3RfbG9vcHMgPC0gbG9vcF9kYXRhW29yZGVyKGxvb3BfZGF0YSRnZW5lLCAtbG9vcF9kYXRhJGxvb3Bfd2lkdGgpLCBdXG5sYXJnZXN0X2xvb3BzIDwtIGxhcmdlc3RfbG9vcHNbIWR1cGxpY2F0ZWQobGFyZ2VzdF9sb29wcyRnZW5lKSwgXVxubGFyZ2VzdF9sb29wcyA8LSBsYXJnZXN0X2xvb3BzICU+JSBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKGxvb3BfY2hyLCBsb29wX3N0YXJ0LCBsb29wX2VuZCwgc2VwID0gXFxfXFwpKVxubGFyZ2VzdF9sb29wcyA8LSBsYXJnZXN0X2xvb3BzW29yZGVyKGxhcmdlc3RfbG9vcHMkbG9vcF9jaHIsIGxhcmdlc3RfbG9vcHMkbG9vcF9zdGFydCksXVxucm93bmFtZXMobGFyZ2VzdF9sb29wcykgPC0gTlVMTFxuXG4jIENoZWNraW5nIHNtYWxsZXIgbG9vcHNcbmFsbExvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGFsbExvb3BzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcW5hbWVzLmZpZWxkID0gXFxjaHJvbTFcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydC5maWVsZCA9IFxcc3RhcnQxXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLmZpZWxkID0gXFxlbmQyXFwpXG5sYXJnZXN0TG9vcHNHciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUobGFyZ2VzdF9sb29wcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxbmFtZXMuZmllbGQgPSBcXGxvb3BfY2hyXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LmZpZWxkID0gXFxsb29wX3N0YXJ0XFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5maWVsZCA9IFxcbG9vcF9lbmRcXClcbmxhcmdlc3RMb29wc0dyIDwtIHNvcnQodW5pcXVlKGxhcmdlc3RMb29wc0dyKSlcbmNvbXBsZXRlX292ZXJsYXBzIDwtIHN1YnNldEJ5T3ZlcmxhcHMoYWxsTG9vcHNHciwgbGFyZ2VzdExvb3BzR3IsIHR5cGUgPSBcXHdpdGhpblxcKVxub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGNvbXBsZXRlX292ZXJsYXBzLCBsYXJnZXN0TG9vcHNHcilcblxuXG5jb21wbGV0ZU92ZXJsYXBEZiA8LSBhcy5kYXRhLmZyYW1lKGNvbXBsZXRlX292ZXJsYXBzKSAlPiUgZHBseXI6Om11dGF0ZShsb29wSURBbGwgPSBwYXN0ZShzZXFuYW1lcywgc3RhcnQsIGVuZCwgc2VwID0gXFxfXFwpKVxubGFyZ2VzdExvb3BzRGYgPC0gYXMuZGF0YS5mcmFtZShsYXJnZXN0TG9vcHNHcikgJT4lIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoc2VxbmFtZXMsIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSlcblxubG9vcElEcGFpcnMgPC0gZGF0YS5mcmFtZShsb29wSUQgPSBjb21wbGV0ZU92ZXJsYXBEZiRsb29wSURBbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJRDIgPSBsYXJnZXN0TG9vcHNEZiRsb29wSURbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSlcblxuIyBhbGxMb29wc0Fubm90YXRlZCA8LSBhbGxMb29wcyAlPiUgZHBseXI6Om11dGF0ZShsb29wSUQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgZW5kMiwgc2VwID0gXFxfXFwpKSAlPiUgZHBseXI6OmxlZnRfam9pbihsb29wSURwYWlycywgYnkgPSBjKFxcbG9vcElEXFwpKVxuXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbmRpZmZDdXRvZmYgPC0gMC4yXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSAlPiUgdW5uZXN0KGdlbmUpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBlbmQyLCBzZXAgPSBcXF9cXCkpXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihsb29wSURwYWlycywgYnkgPSBjKFxcbG9vcElEXFwpKVxudGVtcDIgPC0gdGVtcCAlPiUgZHBseXI6OnNlbGVjdChnZW5lLCBsb29wSUQyKSAlPiVcbiAgZ3JvdXBfYnkoZ2VuZSkgJT4lICAgICAgICAgICAgICAjIEdyb3VwIGRhdGEgYnkgdGhlICdnZW5lJyBjb2x1bW5cbiAgc3VtbWFyaXplKGdlbmVIYXNTUyA9ICFhbGwoaXMubmEobG9vcElEMikpKSAgIyBDaGVjayBpZiBhbGwgbG9vcElEMiB2YWx1ZXMgZm9yIGVhY2ggZ2VuZSBhcmUgTkFcbnRlbXAgPC0gdGVtcCAlPiUgbGVmdF9qb2luKHRlbXAyLCBieSA9IGMoXFxnZW5lXFwpKVxuZGF0YS5hbGwgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGlmZWxzZSghZ2VuZUhhc1NTLCBcXE5vXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGlzLm5hKGxvb3BJRDIpLCBcXE91dHNpZGVcXCwgXFxXaXRoaW5cXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzdGFydDIgLSBzdGFydDEpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbm91dGZpbGUgPC0gZGF0YS5hbGwgJT4lIGRwbHlyOjpzZWxlY3QobG9vcElEMiwgZ2VuZSkgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGxvb3BJRDIpKSAlPiVcbiAgc2VwYXJhdGUobG9vcElEMiwgaW50byA9IGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpLCBzZXAgPSBcXF9cXCwgY29udmVydCA9IFRSVUUpXG4jIGZ3cml0ZShvdXRmaWxlLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxjb252ZXJnZW50X3NzX2RvbWFpbi5iZWRcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
# Extract loop boundary from left to right
temp <- convergent_loops %>% dplyr::select(c(1, 2, 6))
colnames(temp) <- c(\chrom\, \start\, \end\)
strLoopsGr <- makeGRangesFromDataFrame(temp)

# IMPORT TSS
flankSize <- 10
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6, V5)
colnames(gene.tb) <- c(\chrom\, \start\, \end\, \ensembl\, \gene\)
geneGr <- makeGRangesFromDataFrame(gene.tb, keep.extra.columns = TRUE)


# Find overlaps between loops and TSS
overlaps <- findOverlaps(geneGr, strLoopsGr)

# Annotate overlaps
tss_with_loops <- geneGr[queryHits(overlaps)]
loops_with_tss <- strLoopsGr[subjectHits(overlaps)]

# Combine into a data frame for processing
loop_data <- data.frame(gene = tss_with_loops$ensembl,
                        loop_chr = seqnames(loops_with_tss),
                        loop_start = start(loops_with_tss),
                        loop_end = end(loops_with_tss),
                        loop_width = width(loops_with_tss))

# Identify the largest loop for each gene
largest_loops <- loop_data[order(loop_data$gene, -loop_data$loop_width), ]
largest_loops <- largest_loops[!duplicated(largest_loops$gene), ]
largest_loops <- largest_loops %>% dplyr::mutate(loopID = paste(loop_chr, loop_start, loop_end, sep = \_\))
largest_loops <- largest_loops[order(largest_loops$loop_chr, largest_loops$loop_start),]
rownames(largest_loops) <- NULL

# Checking smaller loops
allLoopsGr <- makeGRangesFromDataFrame(allLoops, 
                                       seqnames.field = \chrom1\, 
                                       start.field = \start1\, 
                                       end.field = \end2\)
largestLoopsGr <- makeGRangesFromDataFrame(largest_loops, 
                                           seqnames.field = \loop_chr\, 
                                           start.field = \loop_start\, 
                                           end.field = \loop_end\)
largestLoopsGr <- sort(unique(largestLoopsGr))
complete_overlaps <- subsetByOverlaps(allLoopsGr, largestLoopsGr, type = \within\)
overlaps <- findOverlaps(complete_overlaps, largestLoopsGr)


completeOverlapDf <- as.data.frame(complete_overlaps) %>% dplyr::mutate(loopIDAll = paste(seqnames, start, end, sep = \_\))
largestLoopsDf <- as.data.frame(largestLoopsGr) %>% dplyr::mutate(loopID = paste(seqnames, start, end, sep = \_\))

loopIDpairs <- data.frame(loopID = completeOverlapDf$loopIDAll[queryHits(overlaps)],
                          loopID2 = largestLoopsDf$loopID[subjectHits(overlaps)])

# allLoopsAnnotated <- allLoops %>% dplyr::mutate(loopID = paste(chrom1, start1, end2, sep = \_\)) %>% dplyr::left_join(loopIDpairs, by = c(\loopID\))


##################################
diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\)) %>% unnest(gene) %>%
  dplyr::mutate(loopID = paste(chrom1, start1, end2, sep = \_\))
temp <- geneAnnoData %>% dplyr::left_join(loopIDpairs, by = c(\loopID\))
temp2 <- temp %>% dplyr::select(gene, loopID2) %>%
  group_by(gene) %>%              # Group data by the 'gene' column
  summarize(geneHasSS = !all(is.na(loopID2)))  # Check if all loopID2 values for each gene are NA
temp <- temp %>% left_join(temp2, by = c(\gene\))
data.all <- temp %>% dplyr::mutate(group = ifelse(!geneHasSS, \No\,
                                              ifelse(is.na(loopID2), \Outside\, \Within\)),
                               size = start2 - start1)

##################################
outfile <- data.all %>% dplyr::select(loopID2, gene) %>% dplyr::filter(!is.na(loopID2)) %>%
  separate(loopID2, into = c(\chrom\, \start\, \end\), sep = \_\, convert = TRUE)
# fwrite(outfile, here(consensusDir, \convergent_ss_domain.bed\), sep = \\t\, col.names = FALSE)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dUl5QkZlSFJ5WVdOMElHeHZiM0FnWW05MWJtUmhjbmtnWm5KdmJTQnNaV1owSUhSdklISnBaMmgwWEc1MFpXMXdJRHd0SUdOdmJuWmxjbWRsYm5SZmJHOXZjSE1nSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWXlneExDQXlMQ0EyS1NsY2JtTnZiRzVoYldWektIUmxiWEFwSUR3dElHTW9YRnhqYUhKdmJWeGNMQ0JjWEhOMFlYSjBYRndzSUZ4Y1pXNWtYRndwWEc1emRISk1iMjl3YzBkeUlEd3RJRzFoYTJWSFVtRnVaMlZ6Um5KdmJVUmhkR0ZHY21GdFpTaDBaVzF3S1Z4dVhHNGpJRWxOVUU5U1ZDQlVVMU5jYm1ac1lXNXJVMmw2WlNBOExTQXhNRnh1WjJWdVpTNTBZaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeHRiVEV3WDBkU1EyMHpPQzV3Tmw5blpXNWxYM052Y25SbFpDNWlaV1JjWENrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRlJUVXlBOUlHbG1aV3h6WlNoV05DQTlQU0JjWEN0Y1hDd2dWaklzSUZZektTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVMU56ZEdGeWRDQTlJRlJUVXlBdElHWnNZVzVyVTJsNlpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVMU5sYm1RZ1BTQlVVMU1nS3lCbWJHRnVhMU5wZW1VcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLRll4TENCVVUxTnpkR0Z5ZEN3Z1ZGTlRaVzVrTENCV05pd2dWalVwWEc1amIyeHVZVzFsY3loblpXNWxMblJpS1NBOExTQmpLRnhjWTJoeWIyMWNYQ3dnWEZ4emRHRnlkRnhjTENCY1hHVnVaRnhjTENCY1hHVnVjMlZ0WW14Y1hDd2dYRnhuWlc1bFhGd3BYRzVuWlc1bFIzSWdQQzBnYldGclpVZFNZVzVuWlhOR2NtOXRSR0YwWVVaeVlXMWxLR2RsYm1VdWRHSXNJR3RsWlhBdVpYaDBjbUV1WTI5c2RXMXVjeUE5SUZSU1ZVVXBYRzVjYmx4dUl5QkdhVzVrSUc5MlpYSnNZWEJ6SUdKbGRIZGxaVzRnYkc5dmNITWdZVzVrSUZSVFUxeHViM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHZGxibVZIY2l3Z2MzUnlURzl2Y0hOSGNpbGNibHh1SXlCQmJtNXZkR0YwWlNCdmRtVnliR0Z3YzF4dWRITnpYM2RwZEdoZmJHOXZjSE1nUEMwZ1oyVnVaVWR5VzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZFhHNXNiMjl3YzE5M2FYUm9YM1J6Y3lBOExTQnpkSEpNYjI5d2MwZHlXM04xWW1wbFkzUklhWFJ6S0c5MlpYSnNZWEJ6S1YxY2JseHVJeUJEYjIxaWFXNWxJR2x1ZEc4Z1lTQmtZWFJoSUdaeVlXMWxJR1p2Y2lCd2NtOWpaWE56YVc1blhHNXNiMjl3WDJSaGRHRWdQQzBnWkdGMFlTNW1jbUZ0WlNoblpXNWxJRDBnZEhOelgzZHBkR2hmYkc5dmNITWtaVzV6WlcxaWJDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0JmWTJoeUlEMGdjMlZ4Ym1GdFpYTW9iRzl2Y0hOZmQybDBhRjkwYzNNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOXZjRjl6ZEdGeWRDQTlJSE4wWVhKMEtHeHZiM0J6WDNkcGRHaGZkSE56S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dmIzQmZaVzVrSUQwZ1pXNWtLR3h2YjNCelgzZHBkR2hmZEhOektTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZiM0JmZDJsa2RHZ2dQU0IzYVdSMGFDaHNiMjl3YzE5M2FYUm9YM1J6Y3lrcFhHNWNiaU1nU1dSbGJuUnBabmtnZEdobElHeGhjbWRsYzNRZ2JHOXZjQ0JtYjNJZ1pXRmphQ0JuWlc1bFhHNXNZWEpuWlhOMFgyeHZiM0J6SUR3dElHeHZiM0JmWkdGMFlWdHZjbVJsY2loc2IyOXdYMlJoZEdFa1oyVnVaU3dnTFd4dmIzQmZaR0YwWVNSc2IyOXdYM2RwWkhSb0tTd2dYVnh1YkdGeVoyVnpkRjlzYjI5d2N5QThMU0JzWVhKblpYTjBYMnh2YjNCeld5RmtkWEJzYVdOaGRHVmtLR3hoY21kbGMzUmZiRzl2Y0hNa1oyVnVaU2tzSUYxY2JteGhjbWRsYzNSZmJHOXZjSE1nUEMwZ2JHRnlaMlZ6ZEY5c2IyOXdjeUFsUGlVZ1pIQnNlWEk2T20xMWRHRjBaU2hzYjI5d1NVUWdQU0J3WVhOMFpTaHNiMjl3WDJOb2Npd2diRzl2Y0Y5emRHRnlkQ3dnYkc5dmNGOWxibVFzSUhObGNDQTlJRnhjWDF4Y0tTbGNibXhoY21kbGMzUmZiRzl2Y0hNZ1BDMGdiR0Z5WjJWemRGOXNiMjl3YzF0dmNtUmxjaWhzWVhKblpYTjBYMnh2YjNCekpHeHZiM0JmWTJoeUxDQnNZWEpuWlhOMFgyeHZiM0J6Skd4dmIzQmZjM1JoY25RcExGMWNibkp2ZDI1aGJXVnpLR3hoY21kbGMzUmZiRzl2Y0hNcElEd3RJRTVWVEV4Y2JseHVJeUJEYUdWamEybHVaeUJ6YldGc2JHVnlJR3h2YjNCelhHNWhiR3hNYjI5d2MwZHlJRHd0SUcxaGEyVkhVbUZ1WjJWelJuSnZiVVJoZEdGR2NtRnRaU2hoYkd4TWIyOXdjeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpaWEZ1WVcxbGN5NW1hV1ZzWkNBOUlGeGNZMmh5YjIweFhGd3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzUmhjblF1Wm1sbGJHUWdQU0JjWEhOMFlYSjBNVnhjTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1Z1WkM1bWFXVnNaQ0E5SUZ4Y1pXNWtNbHhjS1Z4dWJHRnlaMlZ6ZEV4dmIzQnpSM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0d4aGNtZGxjM1JmYkc5dmNITXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sY1c1aGJXVnpMbVpwWld4a0lEMGdYRnhzYjI5d1gyTm9jbHhjTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRHRnlkQzVtYVdWc1pDQTlJRnhjYkc5dmNGOXpkR0Z5ZEZ4Y0xDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxibVF1Wm1sbGJHUWdQU0JjWEd4dmIzQmZaVzVrWEZ3cFhHNXNZWEpuWlhOMFRHOXZjSE5IY2lBOExTQnpiM0owS0hWdWFYRjFaU2hzWVhKblpYTjBURzl2Y0hOSGNpa3BYRzVqYjIxd2JHVjBaVjl2ZG1WeWJHRndjeUE4TFNCemRXSnpaWFJDZVU5MlpYSnNZWEJ6S0dGc2JFeHZiM0J6UjNJc0lHeGhjbWRsYzNSTWIyOXdjMGR5TENCMGVYQmxJRDBnWEZ4M2FYUm9hVzVjWENsY2JtOTJaWEpzWVhCeklEd3RJR1pwYm1SUGRtVnliR0Z3Y3loamIyMXdiR1YwWlY5dmRtVnliR0Z3Y3l3Z2JHRnlaMlZ6ZEV4dmIzQnpSM0lwWEc1Y2JseHVZMjl0Y0d4bGRHVlBkbVZ5YkdGd1JHWWdQQzBnWVhNdVpHRjBZUzVtY21GdFpTaGpiMjF3YkdWMFpWOXZkbVZ5YkdGd2N5a2dKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9iRzl2Y0VsRVFXeHNJRDBnY0dGemRHVW9jMlZ4Ym1GdFpYTXNJSE4wWVhKMExDQmxibVFzSUhObGNDQTlJRnhjWDF4Y0tTbGNibXhoY21kbGMzUk1iMjl3YzBSbUlEd3RJR0Z6TG1SaGRHRXVabkpoYldVb2JHRnlaMlZ6ZEV4dmIzQnpSM0lwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0d4dmIzQkpSQ0E5SUhCaGMzUmxLSE5sY1c1aGJXVnpMQ0J6ZEdGeWRDd2daVzVrTENCelpYQWdQU0JjWEY5Y1hDa3BYRzVjYm14dmIzQkpSSEJoYVhKeklEd3RJR1JoZEdFdVpuSmhiV1VvYkc5dmNFbEVJRDBnWTI5dGNHeGxkR1ZQZG1WeWJHRndSR1lrYkc5dmNFbEVRV3hzVzNGMVpYSjVTR2wwY3lodmRtVnliR0Z3Y3lsZExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMjl3U1VReUlEMGdiR0Z5WjJWemRFeHZiM0J6UkdZa2JHOXZjRWxFVzNOMVltcGxZM1JJYVhSektHOTJaWEpzWVhCektWMHBYRzVjYmlNZ1lXeHNURzl2Y0hOQmJtNXZkR0YwWldRZ1BDMGdZV3hzVEc5dmNITWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9iRzl2Y0VsRUlEMGdjR0Z6ZEdVb1kyaHliMjB4TENCemRHRnlkREVzSUdWdVpESXNJSE5sY0NBOUlGeGNYMXhjS1NrZ0pUNGxJR1J3YkhseU9qcHNaV1owWDJwdmFXNG9iRzl2Y0VsRWNHRnBjbk1zSUdKNUlEMGdZeWhjWEd4dmIzQkpSRnhjS1NsY2JseHVYRzRqSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpYRzVrYVdabVEzVjBiMlptSUR3dElEQXVNbHh1WjJWdVpVRnVibTlFWVhSaElEd3RJR3h2WVdSTWIyOXdRVzV1YjBSaGRHRW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJSEJoYzNSbE1DaHVZVzFsTENCY1hGOXdMVzVmWlc1elpXMWliRXhwYzNRdWRITjJYRndwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2xtWmtOMWRHOW1aaUE5SUdScFptWkRkWFJ2Wm1Zc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0Z1Ym05TWFYTjBJRDBnWXloY1hGQXRVRnhjTENCY1hGQXRSVnhjTENCY1hGQXRVMXhjTENCY1hGQXRXRnhjS1NrZ0pUNGxJSFZ1Ym1WemRDaG5aVzVsS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaHNiMjl3U1VRZ1BTQndZWE4wWlNoamFISnZiVEVzSUhOMFlYSjBNU3dnWlc1a01pd2djMlZ3SUQwZ1hGeGZYRndwS1Z4dWRHVnRjQ0E4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanBzWldaMFgycHZhVzRvYkc5dmNFbEVjR0ZwY25Nc0lHSjVJRDBnWXloY1hHeHZiM0JKUkZ4Y0tTbGNiblJsYlhBeUlEd3RJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb1oyVnVaU3dnYkc5dmNFbEVNaWtnSlQ0bFhHNGdJR2R5YjNWd1gySjVLR2RsYm1VcElDVStKU0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5QkhjbTkxY0NCa1lYUmhJR0o1SUhSb1pTQW5aMlZ1WlNjZ1kyOXNkVzF1WEc0Z0lITjFiVzFoY21sNlpTaG5aVzVsU0dGelUxTWdQU0FoWVd4c0tHbHpMbTVoS0d4dmIzQkpSRElwS1NrZ0lDTWdRMmhsWTJzZ2FXWWdZV3hzSUd4dmIzQkpSRElnZG1Gc2RXVnpJR1p2Y2lCbFlXTm9JR2RsYm1VZ1lYSmxJRTVCWEc1MFpXMXdJRHd0SUhSbGJYQWdKVDRsSUd4bFpuUmZhbTlwYmloMFpXMXdNaXdnWW5rZ1BTQmpLRnhjWjJWdVpWeGNLU2xjYm1SaGRHRXVZV3hzSUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JwWm1Wc2MyVW9JV2RsYm1WSVlYTlRVeXdnWEZ4T2IxeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbVpXeHpaU2hwY3k1dVlTaHNiMjl3U1VReUtTd2dYRnhQZFhSemFXUmxYRndzSUZ4Y1YybDBhR2x1WEZ3cEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFYcGxJRDBnYzNSaGNuUXlJQzBnYzNSaGNuUXhLVnh1WEc0akl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qWEc1dmRYUm1hV3hsSUR3dElHUmhkR0V1WVd4c0lDVStKU0JrY0d4NWNqbzZjMlZzWldOMEtHeHZiM0JKUkRJc0lHZGxibVVwSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0NGcGN5NXVZU2hzYjI5d1NVUXlLU2tnSlQ0bFhHNGdJSE5sY0dGeVlYUmxLR3h2YjNCSlJESXNJR2x1ZEc4Z1BTQmpLRnhjWTJoeWIyMWNYQ3dnWEZ4emRHRnlkRnhjTENCY1hHVnVaRnhjS1N3Z2MyVndJRDBnWEZ4ZlhGd3NJR052Ym5abGNuUWdQU0JVVWxWRktWeHVJeUJtZDNKcGRHVW9iM1YwWm1sc1pTd2dhR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRnhjWTI5dWRtVnlaMlZ1ZEY5emMxOWtiMjFoYVc0dVltVmtYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNMQ0JqYjJ3dWJtRnRaWE1nUFNCR1FVeFRSU2xjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuIyBFeHRyYWN0IGxvb3AgYm91bmRhcnkgZnJvbSBsZWZ0IHRvIHJpZ2h0XG50ZW1wIDwtIGNvbnZlcmdlbnRfbG9vcHMgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCA2KSlcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5zdHJMb29wc0dyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxuXG4jIElNUE9SVCBUU1NcbmZsYW5rU2l6ZSA8LSAxMFxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSxcbiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kLCBWNiwgVjUpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGVuc2VtYmxcXCwgXFxnZW5lXFwpXG5nZW5lR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmUudGIsIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpXG5cblxuIyBGaW5kIG92ZXJsYXBzIGJldHdlZW4gbG9vcHMgYW5kIFRTU1xub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGdlbmVHciwgc3RyTG9vcHNHcilcblxuIyBBbm5vdGF0ZSBvdmVybGFwc1xudHNzX3dpdGhfbG9vcHMgPC0gZ2VuZUdyW3F1ZXJ5SGl0cyhvdmVybGFwcyldXG5sb29wc193aXRoX3RzcyA8LSBzdHJMb29wc0dyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV1cblxuIyBDb21iaW5lIGludG8gYSBkYXRhIGZyYW1lIGZvciBwcm9jZXNzaW5nXG5sb29wX2RhdGEgPC0gZGF0YS5mcmFtZShnZW5lID0gdHNzX3dpdGhfbG9vcHMkZW5zZW1ibCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BfY2hyID0gc2VxbmFtZXMobG9vcHNfd2l0aF90c3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9zdGFydCA9IHN0YXJ0KGxvb3BzX3dpdGhfdHNzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BfZW5kID0gZW5kKGxvb3BzX3dpdGhfdHNzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3Bfd2lkdGggPSB3aWR0aChsb29wc193aXRoX3RzcykpXG5cbiMgSWRlbnRpZnkgdGhlIGxhcmdlc3QgbG9vcCBmb3IgZWFjaCBnZW5lXG5sYXJnZXN0X2xvb3BzIDwtIGxvb3BfZGF0YVtvcmRlcihsb29wX2RhdGEkZ2VuZSwgLWxvb3BfZGF0YSRsb29wX3dpZHRoKSwgXVxubGFyZ2VzdF9sb29wcyA8LSBsYXJnZXN0X2xvb3BzWyFkdXBsaWNhdGVkKGxhcmdlc3RfbG9vcHMkZ2VuZSksIF1cbmxhcmdlc3RfbG9vcHMgPC0gbGFyZ2VzdF9sb29wcyAlPiUgZHBseXI6Om11dGF0ZShsb29wSUQgPSBwYXN0ZShsb29wX2NociwgbG9vcF9zdGFydCwgbG9vcF9lbmQsIHNlcCA9IFxcX1xcKSlcbmxhcmdlc3RfbG9vcHMgPC0gbGFyZ2VzdF9sb29wc1tvcmRlcihsYXJnZXN0X2xvb3BzJGxvb3BfY2hyLCBsYXJnZXN0X2xvb3BzJGxvb3Bfc3RhcnQpLF1cbnJvd25hbWVzKGxhcmdlc3RfbG9vcHMpIDwtIE5VTExcblxuIyBDaGVja2luZyBzbWFsbGVyIGxvb3BzXG5hbGxMb29wc0dyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhbGxMb29wcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFuYW1lcy5maWVsZCA9IFxcY2hyb20xXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQuZmllbGQgPSBcXHN0YXJ0MVxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5maWVsZCA9IFxcZW5kMlxcKVxubGFyZ2VzdExvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGxhcmdlc3RfbG9vcHMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcW5hbWVzLmZpZWxkID0gXFxsb29wX2NoclxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydC5maWVsZCA9IFxcbG9vcF9zdGFydFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQuZmllbGQgPSBcXGxvb3BfZW5kXFwpXG5sYXJnZXN0TG9vcHNHciA8LSBzb3J0KHVuaXF1ZShsYXJnZXN0TG9vcHNHcikpXG5jb21wbGV0ZV9vdmVybGFwcyA8LSBzdWJzZXRCeU92ZXJsYXBzKGFsbExvb3BzR3IsIGxhcmdlc3RMb29wc0dyLCB0eXBlID0gXFx3aXRoaW5cXClcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhjb21wbGV0ZV9vdmVybGFwcywgbGFyZ2VzdExvb3BzR3IpXG5cblxuY29tcGxldGVPdmVybGFwRGYgPC0gYXMuZGF0YS5mcmFtZShjb21wbGV0ZV9vdmVybGFwcykgJT4lIGRwbHlyOjptdXRhdGUobG9vcElEQWxsID0gcGFzdGUoc2VxbmFtZXMsIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSlcbmxhcmdlc3RMb29wc0RmIDwtIGFzLmRhdGEuZnJhbWUobGFyZ2VzdExvb3BzR3IpICU+JSBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKHNlcW5hbWVzLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCkpXG5cbmxvb3BJRHBhaXJzIDwtIGRhdGEuZnJhbWUobG9vcElEID0gY29tcGxldGVPdmVybGFwRGYkbG9vcElEQWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSUQyID0gbGFyZ2VzdExvb3BzRGYkbG9vcElEW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbiMgYWxsTG9vcHNBbm5vdGF0ZWQgPC0gYWxsTG9vcHMgJT4lIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIGVuZDIsIHNlcCA9IFxcX1xcKSkgJT4lIGRwbHlyOjpsZWZ0X2pvaW4obG9vcElEcGFpcnMsIGJ5ID0gYyhcXGxvb3BJRFxcKSlcblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSkgJT4lIHVubmVzdChnZW5lKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb29wSUQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgZW5kMiwgc2VwID0gXFxfXFwpKVxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4obG9vcElEcGFpcnMsIGJ5ID0gYyhcXGxvb3BJRFxcKSlcbnRlbXAyIDwtIHRlbXAgJT4lIGRwbHlyOjpzZWxlY3QoZ2VuZSwgbG9vcElEMikgJT4lXG4gIGdyb3VwX2J5KGdlbmUpICU+JSAgICAgICAgICAgICAgIyBHcm91cCBkYXRhIGJ5IHRoZSAnZ2VuZScgY29sdW1uXG4gIHN1bW1hcml6ZShnZW5lSGFzU1MgPSAhYWxsKGlzLm5hKGxvb3BJRDIpKSkgICMgQ2hlY2sgaWYgYWxsIGxvb3BJRDIgdmFsdWVzIGZvciBlYWNoIGdlbmUgYXJlIE5BXG50ZW1wIDwtIHRlbXAgJT4lIGxlZnRfam9pbih0ZW1wMiwgYnkgPSBjKFxcZ2VuZVxcKSlcbmRhdGEuYWxsIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBpZmVsc2UoIWdlbmVIYXNTUywgXFxOb1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShpcy5uYShsb29wSUQyKSwgXFxPdXRzaWRlXFwsIFxcV2l0aGluXFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gc3RhcnQyIC0gc3RhcnQxKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5vdXRmaWxlIDwtIGRhdGEuYWxsICU+JSBkcGx5cjo6c2VsZWN0KGxvb3BJRDIsIGdlbmUpICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShsb29wSUQyKSkgJT4lXG4gIHNlcGFyYXRlKGxvb3BJRDIsIGludG8gPSBjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcKSwgc2VwID0gXFxfXFwsIGNvbnZlcnQgPSBUUlVFKVxuIyBmd3JpdGUob3V0ZmlsZSwgaGVyZShjb25zZW5zdXNEaXIsIFxcY29udmVyZ2VudF9zc19kb21haW4uYmVkXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBFeHRyYWN0IGxvb3AgYm91bmRhcnkgZnJvbSBsZWZ0IHRvIHJpZ2h0XG50ZW1wIDwtIGNvbnZlcmdlbnRfbG9vcHMgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCA2KSlcbmNvbG5hbWVzKHRlbXApIDwtIGMoXFxjaHJvbVxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwpXG5zdHJMb29wc0dyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKVxuXG4jIElNUE9SVCBUU1NcbmZsYW5rU2l6ZSA8LSAxMFxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSxcbiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kLCBWNiwgVjUpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGVuc2VtYmxcXCwgXFxnZW5lXFwpXG5nZW5lR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmUudGIsIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpXG5cblxuIyBGaW5kIG92ZXJsYXBzIGJldHdlZW4gbG9vcHMgYW5kIFRTU1xub3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGdlbmVHciwgc3RyTG9vcHNHcilcblxuIyBBbm5vdGF0ZSBvdmVybGFwc1xudHNzX3dpdGhfbG9vcHMgPC0gZ2VuZUdyW3F1ZXJ5SGl0cyhvdmVybGFwcyldXG5sb29wc193aXRoX3RzcyA8LSBzdHJMb29wc0dyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV1cblxuIyBDb21iaW5lIGludG8gYSBkYXRhIGZyYW1lIGZvciBwcm9jZXNzaW5nXG5sb29wX2RhdGEgPC0gZGF0YS5mcmFtZShnZW5lID0gdHNzX3dpdGhfbG9vcHMkZW5zZW1ibCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BfY2hyID0gc2VxbmFtZXMobG9vcHNfd2l0aF90c3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9zdGFydCA9IHN0YXJ0KGxvb3BzX3dpdGhfdHNzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BfZW5kID0gZW5kKGxvb3BzX3dpdGhfdHNzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3Bfd2lkdGggPSB3aWR0aChsb29wc193aXRoX3RzcykpXG5cbiMgSWRlbnRpZnkgdGhlIGxhcmdlc3QgbG9vcCBmb3IgZWFjaCBnZW5lXG5sYXJnZXN0X2xvb3BzIDwtIGxvb3BfZGF0YVtvcmRlcihsb29wX2RhdGEkZ2VuZSwgLWxvb3BfZGF0YSRsb29wX3dpZHRoKSwgXVxubGFyZ2VzdF9sb29wcyA8LSBsYXJnZXN0X2xvb3BzWyFkdXBsaWNhdGVkKGxhcmdlc3RfbG9vcHMkZ2VuZSksIF1cbmxhcmdlc3RfbG9vcHMgPC0gbGFyZ2VzdF9sb29wcyAlPiUgZHBseXI6Om11dGF0ZShsb29wSUQgPSBwYXN0ZShsb29wX2NociwgbG9vcF9zdGFydCwgbG9vcF9lbmQsIHNlcCA9IFxcX1xcKSlcbmxhcmdlc3RfbG9vcHMgPC0gbGFyZ2VzdF9sb29wc1tvcmRlcihsYXJnZXN0X2xvb3BzJGxvb3BfY2hyLCBsYXJnZXN0X2xvb3BzJGxvb3Bfc3RhcnQpLF1cbnJvd25hbWVzKGxhcmdlc3RfbG9vcHMpIDwtIE5VTExcblxuIyBDaGVja2luZyBzbWFsbGVyIGxvb3BzXG5hbGxMb29wc0dyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhbGxMb29wcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFuYW1lcy5maWVsZCA9IFxcY2hyb20xXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQuZmllbGQgPSBcXHN0YXJ0MVxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5maWVsZCA9IFxcZW5kMlxcKVxubGFyZ2VzdExvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGxhcmdlc3RfbG9vcHMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcW5hbWVzLmZpZWxkID0gXFxsb29wX2NoclxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydC5maWVsZCA9IFxcbG9vcF9zdGFydFxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQuZmllbGQgPSBcXGxvb3BfZW5kXFwpXG5sYXJnZXN0TG9vcHNHciA8LSBzb3J0KHVuaXF1ZShsYXJnZXN0TG9vcHNHcikpXG5jb21wbGV0ZV9vdmVybGFwcyA8LSBzdWJzZXRCeU92ZXJsYXBzKGFsbExvb3BzR3IsIGxhcmdlc3RMb29wc0dyLCB0eXBlID0gXFx3aXRoaW5cXClcbm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhjb21wbGV0ZV9vdmVybGFwcywgbGFyZ2VzdExvb3BzR3IpXG5cblxuY29tcGxldGVPdmVybGFwRGYgPC0gYXMuZGF0YS5mcmFtZShjb21wbGV0ZV9vdmVybGFwcykgJT4lIGRwbHlyOjptdXRhdGUobG9vcElEQWxsID0gcGFzdGUoc2VxbmFtZXMsIHN0YXJ0LCBlbmQsIHNlcCA9IFxcX1xcKSlcbmxhcmdlc3RMb29wc0RmIDwtIGFzLmRhdGEuZnJhbWUobGFyZ2VzdExvb3BzR3IpICU+JSBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKHNlcW5hbWVzLCBzdGFydCwgZW5kLCBzZXAgPSBcXF9cXCkpXG5cbmxvb3BJRHBhaXJzIDwtIGRhdGEuZnJhbWUobG9vcElEID0gY29tcGxldGVPdmVybGFwRGYkbG9vcElEQWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSUQyID0gbGFyZ2VzdExvb3BzRGYkbG9vcElEW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pXG5cbiMgYWxsTG9vcHNBbm5vdGF0ZWQgPC0gYWxsTG9vcHMgJT4lIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIGVuZDIsIHNlcCA9IFxcX1xcKSkgJT4lIGRwbHlyOjpsZWZ0X2pvaW4obG9vcElEcGFpcnMsIGJ5ID0gYyhcXGxvb3BJRFxcKSlcblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5kaWZmQ3V0b2ZmIDwtIDAuMlxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSkgJT4lIHVubmVzdChnZW5lKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb29wSUQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgZW5kMiwgc2VwID0gXFxfXFwpKVxudGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4obG9vcElEcGFpcnMsIGJ5ID0gYyhcXGxvb3BJRFxcKSlcbnRlbXAyIDwtIHRlbXAgJT4lIGRwbHlyOjpzZWxlY3QoZ2VuZSwgbG9vcElEMikgJT4lXG4gIGdyb3VwX2J5KGdlbmUpICU+JSAgICAgICAgICAgICAgIyBHcm91cCBkYXRhIGJ5IHRoZSAnZ2VuZScgY29sdW1uXG4gIHN1bW1hcml6ZShnZW5lSGFzU1MgPSAhYWxsKGlzLm5hKGxvb3BJRDIpKSkgICMgQ2hlY2sgaWYgYWxsIGxvb3BJRDIgdmFsdWVzIGZvciBlYWNoIGdlbmUgYXJlIE5BXG50ZW1wIDwtIHRlbXAgJT4lIGxlZnRfam9pbih0ZW1wMiwgYnkgPSBjKFxcZ2VuZVxcKSlcbmRhdGEuYWxsIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBpZmVsc2UoIWdlbmVIYXNTUywgXFxOb1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShpcy5uYShsb29wSUQyKSwgXFxPdXRzaWRlXFwsIFxcV2l0aGluXFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gc3RhcnQyIC0gc3RhcnQxKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5vdXRmaWxlIDwtIGRhdGEuYWxsICU+JSBkcGx5cjo6c2VsZWN0KGxvb3BJRDIsIGdlbmUpICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShsb29wSUQyKSkgJT4lXG4gIHNlcGFyYXRlKGxvb3BJRDIsIGludG8gPSBjKFxcY2hyb21cXCwgXFxzdGFydFxcLCBcXGVuZFxcKSwgc2VwID0gXFxfXFwsIGNvbnZlcnQgPSBUUlVFKVxuIyBmd3JpdGUob3V0ZmlsZSwgaGVyZShjb25zZW5zdXNEaXIsIFxcY29udmVyZ2VudF9zc19kb21haW4uYmVkXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbmBgYFxuYGBgIn0= -->

```r
```r
# Extract loop boundary from left to right
temp <- convergent_loops %>% dplyr::select(c(1, 2, 6))
colnames(temp) <- c(\chrom\, \start\, \end\)
strLoopsGr <- makeGRangesFromDataFrame(temp)

# IMPORT TSS
flankSize <- 10
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V1, TSSstart, TSSend, V6, V5)
colnames(gene.tb) <- c(\chrom\, \start\, \end\, \ensembl\, \gene\)
geneGr <- makeGRangesFromDataFrame(gene.tb, keep.extra.columns = TRUE)


# Find overlaps between loops and TSS
overlaps <- findOverlaps(geneGr, strLoopsGr)

# Annotate overlaps
tss_with_loops <- geneGr[queryHits(overlaps)]
loops_with_tss <- strLoopsGr[subjectHits(overlaps)]

# Combine into a data frame for processing
loop_data <- data.frame(gene = tss_with_loops$ensembl,
                        loop_chr = seqnames(loops_with_tss),
                        loop_start = start(loops_with_tss),
                        loop_end = end(loops_with_tss),
                        loop_width = width(loops_with_tss))

# Identify the largest loop for each gene
largest_loops <- loop_data[order(loop_data$gene, -loop_data$loop_width), ]
largest_loops <- largest_loops[!duplicated(largest_loops$gene), ]
largest_loops <- largest_loops %>% dplyr::mutate(loopID = paste(loop_chr, loop_start, loop_end, sep = \_\))
largest_loops <- largest_loops[order(largest_loops$loop_chr, largest_loops$loop_start),]
rownames(largest_loops) <- NULL

# Checking smaller loops
allLoopsGr <- makeGRangesFromDataFrame(allLoops, 
                                       seqnames.field = \chrom1\, 
                                       start.field = \start1\, 
                                       end.field = \end2\)
largestLoopsGr <- makeGRangesFromDataFrame(largest_loops, 
                                           seqnames.field = \loop_chr\, 
                                           start.field = \loop_start\, 
                                           end.field = \loop_end\)
largestLoopsGr <- sort(unique(largestLoopsGr))
complete_overlaps <- subsetByOverlaps(allLoopsGr, largestLoopsGr, type = \within\)
overlaps <- findOverlaps(complete_overlaps, largestLoopsGr)


completeOverlapDf <- as.data.frame(complete_overlaps) %>% dplyr::mutate(loopIDAll = paste(seqnames, start, end, sep = \_\))
largestLoopsDf <- as.data.frame(largestLoopsGr) %>% dplyr::mutate(loopID = paste(seqnames, start, end, sep = \_\))

loopIDpairs <- data.frame(loopID = completeOverlapDf$loopIDAll[queryHits(overlaps)],
                          loopID2 = largestLoopsDf$loopID[subjectHits(overlaps)])

# allLoopsAnnotated <- allLoops %>% dplyr::mutate(loopID = paste(chrom1, start1, end2, sep = \_\)) %>% dplyr::left_join(loopIDpairs, by = c(\loopID\))


##################################
diffCutoff <- 0.2
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = diffCutoff,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\)) %>% unnest(gene) %>%
  dplyr::mutate(loopID = paste(chrom1, start1, end2, sep = \_\))
temp <- geneAnnoData %>% dplyr::left_join(loopIDpairs, by = c(\loopID\))
temp2 <- temp %>% dplyr::select(gene, loopID2) %>%
  group_by(gene) %>%              # Group data by the 'gene' column
  summarize(geneHasSS = !all(is.na(loopID2)))  # Check if all loopID2 values for each gene are NA
temp <- temp %>% left_join(temp2, by = c(\gene\))
data.all <- temp %>% dplyr::mutate(group = ifelse(!geneHasSS, \No\,
                                              ifelse(is.na(loopID2), \Outside\, \Within\)),
                               size = start2 - start1)

##################################
outfile <- data.all %>% dplyr::select(loopID2, gene) %>% dplyr::filter(!is.na(loopID2)) %>%
  separate(loopID2, into = c(\chrom\, \start\, \end\), sep = \_\, convert = TRUE)
# fwrite(outfile, here(consensusDir, \convergent_ss_domain.bed\), sep = \\t\, col.names = FALSE)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [3.41] Finding largest convergent encompassing S-S
#### Filtering convergent S-S loops

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaR0YwWVNBOExTQmtZWFJoTG1Gc2JDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJR01vWENKUUxVVmNJaWtwWEc1Y2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hqYUhKdmJURXNJSE4wWVhKME1Td2daVzVrTVN3Z1kyaHliMjB5TENCemRHRnlkRElzSUdWdVpESXNJR2R5YjNWd0tTQWxQaVVnWkdsemRHbHVZM1FvS1Z4dVhHNTBaVzF3TVNBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SUZ3aVRtOWNJaWtnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvTFdkeWIzVndLVnh1Wm5keWFYUmxLSFJsYlhBeExDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYQ0pwYm5OMWJHRjBaV1JmWkc5dFlXbHVYM056WDI1dkxtSmxaSEJsWENJcExDQnpaWEFnUFNCY0lseGNkRndpTENCamIyd3VibUZ0WlhNZ1BTQkdRVXhUUlNsY2JuUmxiWEF5SUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWENKWGFYUm9hVzVjSWlrZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb0xXZHliM1Z3S1Z4dVpuZHlhWFJsS0hSbGJYQXlMQ0JvWlhKbEtHTnZibk5sYm5OMWMwUnBjaXdnWENKcGJuTjFiR0YwWldSZlpHOXRZV2x1WDNOelgzZHBkR2hwYmk1aVpXUndaVndpS1N3Z2MyVndJRDBnWENKY1hIUmNJaXdnWTI5c0xtNWhiV1Z6SUQwZ1JrRk1VMFVwWEc1MFpXMXdNeUE4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRndpVDNWMGMybGtaVndpS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENndFozSnZkWEFwWEc1bWQzSnBkR1VvZEdWdGNETXNJR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjSW1sdWMzVnNZWFJsWkY5a2IyMWhhVzVmYzNOZmIzVjBjMmxrWlM1aVpXUndaVndpS1N3Z2MyVndJRDBnWENKY1hIUmNJaXdnWTI5c0xtNWhiV1Z6SUQwZ1JrRk1VMFVwWEc1Y2JuUmxiWEFnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hwWkN3Z1ozSnZkWEFzSUhOcGVtVXBJQ1UrSlNCa2FYTjBhVzVqZENncFhHNWNibHh1WjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGdJR1JwYzNSaGJtTmxNU0E4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQV2R5YjNWd01Ta2dLU1J6YVhwbFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQV2R5YjNWd01pa2dLU1J6YVhwbFhHNGdJSGRwYkNBOExTQjNhV3hqYjNndWRHVnpkQ2hrYVhOMFlXNWpaVEVzSUdScGMzUmhibU5sTWlsY2JpQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1ZlZ4dVhHNWpiMjUyVUhaaGJIVmxLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWENKT2Ixd2lMQ0JjSWxkcGRHaHBibHdpS1NsY2JtTnZiblpRZG1Gc2RXVW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjSWs1dlhDSXNJRndpVDNWMGMybGtaVndpS1NsY2JtTnZiblpRZG1Gc2RXVW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjSWs5MWRITnBaR1ZjSWl3Z1hDSlhhWFJvYVc1Y0lpa3BYRzVjYmx4dWNDQThMU0JuWjNCc2IzUW9kR1Z0Y0N3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlITnBlbVVzSUdacGJHd2dQU0JuY205MWNDa3BJQ3NnWEc0Z0lHZGxiMjFmZG1sdmJHbHVLR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVk5aV1JwZFcwcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENJc0lHRnNjR2hoSUQwZ0xqUXNJQ3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHpMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVTFsWkdsMWJTQXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU3dnSUdGc2NHaGhJRDBnTUM0MkxDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FySUZ4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QnpZMkZzWlY5NVgyTnZiblJwYm5WdmRYTW9iR0ZpWld4eklEMGdiR0ZpWld4ZmEySmZiV0lwSUN0Y2JpQWdjMk5oYkdWZlptbHNiRjl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSWlNM056YzNOemRjSWl3Z1hDSWpSakk0UlRKRFhDSXNJRndpSTBZeU9FVXlRMXdpS1NrZ0sxeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1hHNGdJQ0FnSUNCaFpYTW9aM0p2ZFhBZ1BTQm5jbTkxY0Nrc0lHWjFiaUE5SUcxbFlXNHNYRzRnSUNBZ0lDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNQzQxTEZ4dUlDQWdJQ0FnWm1sc2JDQTlJRndpWW14aFkydGNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzSUhCdmMybDBhVzl1SUQwZ2NHOXphWFJwYjI1ZlpHOWtaMlVvTGpNcFhHNGdJQ2tnSzF4dUlDQjBhR1Z0WlNoY2JpQWdJQ0JoZUdsekxuUnBkR3hsTG5nZ1BTQmxiR1Z0Wlc1MFgySnNZVzVyS0Nrc1hHNGdJQ0FnWVhocGN5NTBhWFJzWlM1NUlEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3hjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NJQ0FnSUZ4dUlDQWdJR0Y0YVhNdWRHVjRkQzU0SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTeGNiaUFnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJQ0FnSUNBZ0l5QlNiM1JoZEdVZ2VDMWhlR2x6SUd4aFltVnNjeUEwTlNCa1pXZHlaV1Z6WEc0Z0lDQWdJQ0JvYW5WemRDQTlJREVzSUNBZ0lDQWdJQ01nUVdScWRYTjBJR2h2Y21sNmIyNTBZV3dnYW5WemRHbG1hV05oZEdsdmJseHVJQ0FnSUNBZ2RtcDFjM1FnUFNBeElDQWdJQ0FnSUNBaklFRmthblZ6ZENCMlpYSjBhV05oYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY0luUnlZVzV6Y0dGeVpXNTBYQ0lwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNrZ0syeGhZbk1vZVNBOUlGd2lURzl2Y0NCemFYcGxYQ0lwWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbWx1YzNWc1lYUnBiMjVDYjNWdVpHRnllVjl6YVhwbFgyTnZiblpUVTE5UVJWd2lLVnh1ZDJsa2RHZ2dQQzB6TXlwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElETTFLbTF0Vkc5SmJtTm9YRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWNibWRsZEZCMllXeFhhV3hqYjNnZ1BDMGdablZ1WTNScGIyNG9aR0YwWVN3Z1ozSnZkWEF4TENCbmNtOTFjRElwZTF4dUlDQmthWE4wWVc1alpURWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMW5jbTkxY0RFcElDa2taR2xtWmw5a1ZFRkhYMFJOVTA5Y2JpQWdaR2x6ZEdGdVkyVXlJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlaM0p2ZFhBeUtTQXBKR1JwWm1aZlpGUkJSMTlFVFZOUFhHNGdJSGRwYkNBOExTQjNhV3hqYjNndWRHVnpkQ2hrYVhOMFlXNWpaVEVzSUdScGMzUmhibU5sTWlsY2JpQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1ZlZ4dVhHNTBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvWjNKdmRYQXNJR2xrTENCa2FXWm1YMlJVUVVkZlJFMVRUeWtnSlQ0bElHUnBjM1JwYm1OMEtDbGNibHh1WTI5dWRsQjJZV3gxWlNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGd2lUbTljSWl3Z1hDSlhhWFJvYVc1Y0lpa3BYRzVqYjI1MlVIWmhiSFZsS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hDSk9iMXdpTENCY0lrOTFkSE5wWkdWY0lpa3BYRzVqYjI1MlVIWmhiSFZsS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hDSlBkWFJ6YVdSbFhDSXNJRndpVjJsMGFHbHVYQ0lwS1Z4dVhHNXdJRHd0SUdkbmNHeHZkQ2hrWVhSaExDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdaR2xtWmw5a1ZFRkhYMFJOVTA4c0lHWnBiR3dnUFNCbmNtOTFjQ2twSUNzZ1hHNGdJR2RsYjIxZmRtbHZiR2x1S0d4cGJtVjNhV1IwYUNBOUlHeHBibVZOWldScGRXMGdLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lMQ0JoYkhCb1lTQTlJQzQwTENBc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TXl3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVFdWa2FYVnRJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU3dnSUdGc2NHaGhJRDBnTUM0MkxDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FySUZ4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QWdJRnh1SUNBZ0lITmpZV3hsWDJacGJHeGZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YQ0lqTnpjM056YzNYQ0lzSUZ3aUkwWXlPRVV5UTF3aUxDQmNJaU5HTWpoRk1rTmNJaWtwSUN0Y2JpQWdjM1JoZEY5emRXMXRZWEo1S0Z4dUlDQWdJR0ZsY3lobmNtOTFjQ0E5SUdkeWIzVndLU3dnWm5WdUlEMGdiV1ZoYml4Y2JpQWdJQ0JuWlc5dElEMGdYQ0p3YjJsdWRGd2lMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTUM0MUxGeHVJQ0FnSUdacGJHd2dQU0JjSW1Kc1lXTnJYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpTENCd2IzTnBkR2x2YmlBOUlIQnZjMmwwYVc5dVgyUnZaR2RsS0M0ektWeHVJQ0FwSUN0Y2JpQWdkR2hsYldVb1hHNGdJQ0FnWVhocGN5NTBhWFJzWlM1NElEMGdaV3hsYldWdWRGOWliR0Z1YXlncExGeHVJQ0FnSUdGNGFYTXVkR2wwYkdVdWVTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVTBzWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zWEc0Z0lDQWdJQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0pjYmlBZ0lDQXBMQ0FnSUNCY2JpQWdJQ0JoZUdsekxuUmxlSFF1ZUNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpVMHNYRzRnSUNBZ0lDQmhibWRzWlNBOUlEUTFMQ0FnSUNBZ0lDTWdVbTkwWVhSbElIZ3RZWGhwY3lCc1lXSmxiSE1nTkRVZ1pHVm5jbVZsYzF4dUlDQWdJQ0FnYUdwMWMzUWdQU0F4TENBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0JvYjNKcGVtOXVkR0ZzSUdwMWMzUnBabWxqWVhScGIyNWNiaUFnSUNBZ0lIWnFkWE4wSUQwZ01TQWdJQ0FnSUNBZ0l5QkJaR3AxYzNRZ2RtVnlkR2xqWVd3Z2FuVnpkR2xtYVdOaGRHbHZibHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR2xqYTNNZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNrc1hHNGdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hDSjBjbUZ1YzNCaGNtVnVkRndpS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdiR1ZuWlc1a0xuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLVnh1SUNBcElDdHNZV0p6S0hrZ1BTQmNJczZVSUd4dmIzQWdjMk52Y21WY0lpa2dLeUFnSUNCY2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01DeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCaGJIQm9ZU0E5SURFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lwSUNzZ1hHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMHdMaklzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZV3h3YUdFZ1BTQXdMalVzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lMQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLQzB3TGpnc0lEQXVOU2twWEc0Z0lDQWdYRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWENKcGJuTjFiR0YwYVc5dVFtOTFibVJoY25sZlpHVnNkR0ZmWTI5dWRsTlRYM0JsWENJcFhHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwSUNCY2JseHVYRzRqSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNaklGeHVYRzV0YVc1V1lXeDFaU0E4TFNBdE5GeHViMkp6Wlhod0lEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQndZWE4wWlRBb1hDSnNiMjl3VTJOdmNtVmZZMjl1YzE5dlluTmxlSEF1ZEhOMlhDSXBLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2JHOW5YMjlpYzJWNGNGOUVUVk5QSUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmUkUxVFR5QTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZSRTFUVHlrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5ObGVIQmZaRlJCUnlBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDJSVVFVY2dQVDBnTUN3Z2JXbHVWbUZzZFdVc0lHeHZaeklvYjJKelpYaHdYMlJVUVVjcEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMEUwT0RVZ1BTQnBabDlsYkhObEtHOWljMlY0Y0Y5Qk5EZzFJRDA5SURBc0lHMXBibFpoYkhWbExDQnNiMmN5S0c5aWMyVjRjRjlCTkRnMUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrYVdabVgyUlVRVWRmUkUxVFR5QTlJR3h2WjE5dlluTmxlSEJmWkZSQlJ5QXRJR3h2WjE5dlluTmxlSEJmUkUxVFR5eGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMlJwWm1aZlFUUTROVjlFVFZOUElEMGdiRzluWDI5aWMyVjRjRjlCTkRnMUlDMGdiRzluWDI5aWMyVjRjRjlFVFZOUEtWeHVYRzVrWVhSaE1pQThMU0JrWVhSaElDVStKU0JzWldaMFgycHZhVzRvYjJKelpYaHdMQ0JpZVNBOUlHTW9YQ0pwWkZ3aUtTbGNibHh1ZEdWdGNDQThMU0JrWVhSaE1pQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaG5jbTkxY0N3Z2FXUXNJR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOHBJQ1UrSlNCa2FYTjBhVzVqZENncFhHNWNibHh1WjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGdJR1JwYzNSaGJtTmxNU0E4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQV2R5YjNWd01Ta2dLU1JzYjJkZmIySnpaWGh3WDJScFptWmZaRlJCUjE5RVRWTlBYRzRnSUdScGMzUmhibU5sTWlBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNaWtnS1NSc2IyZGZiMkp6Wlhod1gyUnBabVpmWkZSQlIxOUVUVk5QWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WEc1amIyNTJVSFpoYkhWbEtHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYQ0pPYjF3aUxDQmNJbGRwZEdocGJsd2lLU2xjYm1OdmJuWlFkbUZzZFdVb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNJazV2WENJc0lGd2lUM1YwYzJsa1pWd2lLU2xjYm1OdmJuWlFkbUZzZFdVb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNJazkxZEhOcFpHVmNJaXdnWENKWGFYUm9hVzVjSWlrcFhHNWNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUd4dloxOXZZbk5sZUhCZlpHbG1abDlrVkVGSFgwUk5VMDhzSUdacGJHd2dQU0JuY205MWNDa3BJQ3NnWEc0Z0lHZGxiMjFmZG1sdmJHbHVLR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVk5aV1JwZFcwcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENJc0lHRnNjR2hoSUQwZ0xqUXNJQ3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHpMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVk5aV1JwZFcwZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QkxDQWdZV3h3YUdFZ1BTQXdMallzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUZ4dUlDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRndpSXpjM056YzNOMXdpTENCY0lpTkdNamhGTWtOY0lpd2dYQ0lqUmpJNFJUSkRYQ0lwS1NBclhHNGdJRnh1SUNCemRHRjBYM04xYlcxaGNua29YRzRnSUNBZ1lXVnpLR2R5YjNWd0lEMGdaM0p2ZFhBcExDQm1kVzRnUFNCdFpXRnVMRnh1SUNBZ0lHZGxiMjBnUFNCY0luQnZhVzUwWENJc0lITm9ZWEJsSUQwZ01qRXNJSE5wZW1VZ1BTQXdMalVzWEc0Z0lDQWdabWxzYkNBOUlGd2lZbXhoWTJ0Y0lpd2dZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNJSEJ2YzJsMGFXOXVJRDBnY0c5emFYUnBiMjVmWkc5a1oyVW9Mak1wWEc0Z0lDa2dLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxMbmdnUFNCbGJHVnRaVzUwWDJKc1lXNXJLQ2tzWEc0Z0lDQWdZWGhwY3k1MGFYUnNaUzU1SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTeGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5eGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lseHVJQ0FnSUNrc0lDQWdJRnh1SUNBZ0lHRjRhWE11ZEdWNGRDNTRJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN4Y2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lDQWdJQ0FnSXlCU2IzUmhkR1VnZUMxaGVHbHpJR3hoWW1Wc2N5QTBOU0JrWldkeVpXVnpYRzRnSUNBZ0lDQm9hblZ6ZENBOUlERXNJQ0FnSUNBZ0lDTWdRV1JxZFhOMElHaHZjbWw2YjI1MFlXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUlDQWdJQ0FnZG1wMWMzUWdQU0F4SUNBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0IyWlhKMGFXTmhiQ0JxZFhOMGFXWnBZMkYwYVc5dVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjSW5SeVlXNXpjR0Z5Wlc1MFhDSXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2tnSzJ4aFluTW9lU0E5SUZ3aWJHOW5NaWhtWXlCdlppQnZZbk12Wlhod0tWd2lLU0FySUNBZ0lGeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHRnNjR2hoSUQwZ01TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWlrZ0t5QmNiaUFnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLQzB5TENBeUtTbGNiaUFnSUNCM2FXUjBhQ0E4TFRNd0ttMXRWRzlKYm1Ob1hHNW9aV2xuYUhRZ1BDMGdNelVxYlcxVWIwbHVZMmhjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY0ltbHVjM1ZzWVhScGIyNUNiM1Z1WkdGeWVWOXZZbk5sZUhCZlkyOXVkbE5UWDNCbFhDSXBYRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncElDQmNibHh1WEc1Y2JseHVYRzRqSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlOY2JseHVaR0YwWVNBOExTQmtZWFJoTG1Gc2JGeHVaMlZ1WlM1M2FYUm9hVzVDYjNWdVpHRnllU0E4TFNCMWJtbHhkV1VvS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdYQ0pYYVhSb2FXNWNJaWtwSkdkbGJtVXBYRzVuWlc1bExtOTFkSE5wWkdWQ2IzVnVaR0Z5ZVNBOExTQjFibWx4ZFdVb0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDBnWENKUGRYUnphV1JsWENJcEtTUm5aVzVsS1Z4dVoyVnVaUzV1YjBKdmRXNWtZWEo1SUR3dElIVnVhWEYxWlNnb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JjSWs1dlhDSXBLU1JuWlc1bEtWeHVYRzVuWlc1bExuZENiM1Z1WkdGeWVTQThMU0IxYm1seGRXVW9ZeWhuWlc1bExuZHBkR2hwYmtKdmRXNWtZWEo1TENCblpXNWxMbTkxZEhOcFpHVkNiM1Z1WkdGeWVTa3BYRzVjYm1kbGJtVXVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjSW1kbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhDSXBLU1JuWlc1bFhHNW5aVzVsTG1keWIzVndNaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSm5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWW1sdVlYSjVSM0p2ZFhBeUxuUnpkbHdpS1Nra1oyVnVaVnh1WEc1d2NtbHVkQ2hjSW5CbGNtTWdiMllnWjJWdVpTQjNhWFJvSUd4dmIzQWdkMmwwYUdsdUlFSnZkVzVrWVhKNVhDSXBYRzV6ZFcwb1oyVnVaUzVuY205MWNERWdKV2x1SlNCblpXNWxMbmRwZEdocGJrSnZkVzVrWVhKNUtTOXNaVzVuZEdnb1oyVnVaUzVuY205MWNERXBLakV3TUZ4dWMzVnRLR2RsYm1VdVozSnZkWEF5SUNWcGJpVWdaMlZ1WlM1M2FYUm9hVzVDYjNWdVpHRnllU2t2YkdWdVozUm9LR2RsYm1VdVozSnZkWEF5S1NveE1EQmNibHh1Y0hKcGJuUW9YQ0p3WlhKaklHOW1JR2RsYm1VZ2QybDBhQ0JzYjI5d0lHOTFkSE5wWkdVZ1FtOTFibVJoY25sY0lpbGNibk4xYlNoblpXNWxMbWR5YjNWd01TQWxhVzRsSUdkbGJtVXViM1YwYzJsa1pVSnZkVzVrWVhKNUtTOXNaVzVuZEdnb1oyVnVaUzVuY205MWNERXBLakV3TUZ4dWMzVnRLR2RsYm1VdVozSnZkWEF5SUNWcGJpVWdaMlZ1WlM1dmRYUnphV1JsUW05MWJtUmhjbmtwTDJ4bGJtZDBhQ2huWlc1bExtZHliM1Z3TWlrcU1UQXdYRzVjYm5CeWFXNTBLRndpY0dWeVl5QnZaaUJuWlc1bElIZHBkR2dnYkc5dmNDQjNhWFJvSUc1dklFSnZkVzVrWVhKNVhDSXBYRzV6ZFcwb1oyVnVaUzVuY205MWNERWdKV2x1SlNCblpXNWxMbTV2UW05MWJtUmhjbmtwTDJ4bGJtZDBhQ2huWlc1bExtZHliM1Z3TVNrcU1UQXdYRzV6ZFcwb1oyVnVaUzVuY205MWNESWdKV2x1SlNCblpXNWxMbTV2UW05MWJtUmhjbmtwTDJ4bGJtZDBhQ2huWlc1bExtZHliM1Z3TWlrcU1UQXdYRzVjYmx4dVpHbG1aaTVTVGtFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHVnVjMlZ0WW14ZloyVnVaVjlwWkN3Z2JHOW5Na1p2YkdSRGFHRnVaMlVzSUhOb2NtbHVhMlZrWDJ4dlp6SkdReXdnY0dGa2Fpd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNobmNtOTFjQ0E5SUdOaGMyVmZkMmhsYmloY2JpQWdJQ0JsYm5ObGJXSnNYMmRsYm1WZmFXUWdKV2x1SlNCblpXNWxMbmRDYjNWdVpHRnllU0IrSUZ3aWQybDBhR2x1UW05MWJtUmhjbmxjSWl4Y2JpQWdJQ0JsYm5ObGJXSnNYMmRsYm1WZmFXUWdKV2x1SlNCblpXNWxMbTV2UW05MWJtUmhjbmtnZmlCY0ltNXZRbTkxYm1SaGNubGNJaXhjYmlBZ0lDQlVVbFZGSUg0Z1RrRmNiaUFnS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9JV2x6TG01aEtHZHliM1Z3S1NrZ0pUNGxYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9ZV0p6VEc5bk1rWkRJRDBnWVdKektHeHZaekpHYjJ4a1EyaGhibWRsS1NsY2JtdHpYM0psYzNWc2RDQThMU0JyY3k1MFpYTjBLRnh1SUNCa2FXWm1MbEpPUVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY0luZHBkR2hwYmtKdmRXNWtZWEo1WENJcElDVStKU0J3ZFd4c0tHRmljMHh2WnpKR1F5a3NYRzRnSUdScFptWXVVazVCSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SUZ3aWJtOUNiM1Z1WkdGeWVWd2lLU0FsUGlVZ2NIVnNiQ2hoWW5OTWIyY3lSa01wWEc0cFhHNWNibWRuY0d4dmRDaGthV1ptTGxKT1FTd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJR3h2WnpKR2IyeGtRMmhoYm1kbEtTa2dLeUJuWlc5dFgzWnBiMnhwYmlncElDc2daMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0eEtWeHVYRzRqSUdkbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJeUFnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFdkeWIzVndNU2tnS1NSaFluTk1iMmN5UmtOY2JpTWdJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDFuY205MWNESXBJQ2trWVdKelRHOW5Na1pEWEc0aklDQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUl5QWdJSEpsZEhWeWJpaDNhV3drY0M1MllXeDFaU2xjYmlNZ2ZWeHVJeUJqYjI1MlVIWmhiSFZsS0dkbGRGQjJZV3hYYVd4amIzZ29aR2xtWmk1U1RrRXNJRndpZDJsMGFFSnZkVzVrWVhKNVhDSXNJRndpYm05Q2IzVnVaR0Z5ZVZ3aUtTbGNiaU1nWEc1Y2JpTWdRM0psWVhSbElIUm9aU0JEUkVZZ2NHeHZkRnh1Y0NBOExTQm5aM0JzYjNRb1pHbG1aaTVTVGtFc0lHRmxjeWg0SUQwZ1lXSnpURzluTWtaRExDQmpiMnh2Y2lBOUlHZHliM1Z3S1NrZ0sxeHVJQ0J6WTJGc1pWOWpiMnh2Y2w5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnS0dNb1hDSWpOemMzTnpjM1hDSXNJRndpSTBZeU9FVXlRMXdpS1NrcElDdGNibHh1YzNSaGRGOWxZMlJtS0hOcGVtVWdQU0F3TGpRc0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WTlpXUnBkVzBnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpSUNBcElDc2dJeUJWYzJVZ2MzUmhkRjlsWTJSbUlIUnZJSEJzYjNRZ2RHaGxJR1Z0Y0dseWFXTmhiQ0JEUkVaY2JpQWdiR0ZpY3loY2JpQWdJQ0I0SUQwZ1hDSkJZbk11SUd4dlp6SW9abTlzWkNCamFHRnVaMlVwWENJc1hHNGdJQ0FnZVNBOUlGd2lRM1Z0ZFd4aGRHbDJaU0JRY205aVlXSnBiR2wwZVZ3aVhHNGdJQ2tnS3lCamIyOXlaRjlqWVhKMFpYTnBZVzRvZUd4cGJTQTlJR01vTUN3Z01Ta3BJQ3RjYmlBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ0l5QkRiR1ZoYmlCMGFHVnRaVnh1SUNCMGFHVnRaU2hjYmlBZ0lDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpVMHNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXViR2x1WlNBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUnBZMnR6SUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJaXhjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENKY2JpQWdJQ0FwTEZ4dUlDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ3aWRISmhibk53WVhKbGJuUmNJaWtzWEc0Z0lDQWdiR1ZuWlc1a0xuQnZjMmwwYVc5dUlEMGdYQ0p1YjI1bFhDSXNYRzRnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlsY2JpQWdJQ0FwWEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbXh2WnpKR1ExOWpaR1pmYVc1emRXeGhkR2x2YmtKdmRXNWtZWEo1WDJOdmJuWlRVMTl3WlZ3aUtWeHVkMmxrZEdnZ1BDMGdNek1xYlcxVWIwbHVZMmhjYm1obGFXZG9kQ0E4TFRNekttMXRWRzlKYm1Ob1hHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjRzVuWENJcEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYQ0pwYmx3aUxDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRndpTG5OMloxd2lLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5kYXRhIDwtIGRhdGEuYWxsICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtRVxcKSlcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMiwgZ3JvdXApICU+JSBkaXN0aW5jdCgpXG5cbnRlbXAxIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxOb1xcKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApXG5md3JpdGUodGVtcDEsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGluc3VsYXRlZF9kb21haW5fc3Nfbm8uYmVkcGVcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxudGVtcDIgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXFdpdGhpblxcKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApXG5md3JpdGUodGVtcDIsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGluc3VsYXRlZF9kb21haW5fc3Nfd2l0aGluLmJlZHBlXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbnRlbXAzIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxPdXRzaWRlXFwpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cClcbmZ3cml0ZSh0ZW1wMywgaGVyZShjb25zZW5zdXNEaXIsIFxcaW5zdWxhdGVkX2RvbWFpbl9zc19vdXRzaWRlLmJlZHBlXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KGlkLCBncm91cCwgc2l6ZSkgJT4lIGRpc3RpbmN0KClcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNpemVcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJHNpemVcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbmNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXE5vXFwsIFxcV2l0aGluXFwpKVxuY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsIFxcTm9cXCwgXFxPdXRzaWRlXFwpKVxuY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsIFxcT3V0c2lkZVxcLCBcXFdpdGhpblxcKSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gc2l6ZSwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZU1lZGl1bSogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgYWxwaGEgPSAuNCwgLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcIzc3Nzc3N1xcLCBcXCNGMjhFMkNcXCwgXFwjRjI4RTJDXFwpKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSxcbiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSwgICAgXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArbGFicyh5ID0gXFxMb29wIHNpemVcXClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbkJvdW5kYXJ5X3NpemVfY29udlNTX1BFXFwpXG53aWR0aCA8LTMzKm1tVG9JbmNoXG5oZWlnaHQgPC0gMzUqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRkaWZmX2RUQUdfRE1TT1xuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkZGlmZl9kVEFHX0RNU09cbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgaWQsIGRpZmZfZFRBR19ETVNPKSAlPiUgZGlzdGluY3QoKVxuXG5jb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgXFxOb1xcLCBcXFdpdGhpblxcKSlcbmNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXE5vXFwsIFxcT3V0c2lkZVxcKSlcbmNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXE91dHNpZGVcXCwgXFxXaXRoaW5cXCkpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaWZmX2RUQUdfRE1TTywgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArICAgXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCM3Nzc3NzdcXCwgXFwjRjI4RTJDXFwsIFxcI0YyOEUyQ1xcKSkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK2xhYnMoeSA9IFxczpQgbG9vcCBzY29yZVxcKSArICAgIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgKyBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTAuMixcbiAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuOCwgMC41KSlcbiAgICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25Cb3VuZGFyeV9kZWx0YV9jb252U1NfcGVcXClcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKCkgIFxuXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgXG5cbm1pblZhbHVlIDwtIC00XG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pXG5cbmRhdGEyIDwtIGRhdGEgJT4lIGxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuXG50ZW1wIDwtIGRhdGEyICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBpZCwgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTykgJT4lIGRpc3RpbmN0KClcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU09cbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU09cbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbmNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXE5vXFwsIFxcV2l0aGluXFwpKVxuY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsIFxcTm9cXCwgXFxPdXRzaWRlXFwpKVxuY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsIFxcT3V0c2lkZVxcLCBcXFdpdGhpblxcKSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZU1lZGl1bSogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgYWxwaGEgPSAuNCwgLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgdGhlbWVfY2xhc3NpYygpICsgXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjNzc3Nzc3XFwsIFxcI0YyOEUyQ1xcLCBcXCNGMjhFMkNcXCkpICtcbiAgXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSxcbiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSwgICAgXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArbGFicyh5ID0gXFxsb2cyKGZjIG9mIG9icy9leHApXFwpICsgICAgXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsXG4gICAgICAgICAgICAgYWxwaGEgPSAxLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArIFxuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTIsIDIpKVxuICAgIHdpZHRoIDwtMzAqbW1Ub0luY2hcbmhlaWdodCA8LSAzNSptbVRvSW5jaFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbkJvdW5kYXJ5X29ic2V4cF9jb252U1NfcGVcXClcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKCkgIFxuXG5cblxuXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5kYXRhIDwtIGRhdGEuYWxsXG5nZW5lLndpdGhpbkJvdW5kYXJ5IDwtIHVuaXF1ZSgoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXFdpdGhpblxcKSkkZ2VuZSlcbmdlbmUub3V0c2lkZUJvdW5kYXJ5IDwtIHVuaXF1ZSgoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXE91dHNpZGVcXCkpJGdlbmUpXG5nZW5lLm5vQm91bmRhcnkgPC0gdW5pcXVlKChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcTm9cXCkpJGdlbmUpXG5cbmdlbmUud0JvdW5kYXJ5IDwtIHVuaXF1ZShjKGdlbmUud2l0aGluQm91bmRhcnksIGdlbmUub3V0c2lkZUJvdW5kYXJ5KSlcblxuZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cbnByaW50KFxccGVyYyBvZiBnZW5lIHdpdGggbG9vcCB3aXRoaW4gQm91bmRhcnlcXClcbnN1bShnZW5lLmdyb3VwMSAlaW4lIGdlbmUud2l0aGluQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwXG5zdW0oZ2VuZS5ncm91cDIgJWluJSBnZW5lLndpdGhpbkJvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDIpKjEwMFxuXG5wcmludChcXHBlcmMgb2YgZ2VuZSB3aXRoIGxvb3Agb3V0c2lkZSBCb3VuZGFyeVxcKVxuc3VtKGdlbmUuZ3JvdXAxICVpbiUgZ2VuZS5vdXRzaWRlQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwXG5zdW0oZ2VuZS5ncm91cDIgJWluJSBnZW5lLm91dHNpZGVCb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDBcblxucHJpbnQoXFxwZXJjIG9mIGdlbmUgd2l0aCBsb29wIHdpdGggbm8gQm91bmRhcnlcXClcbnN1bShnZW5lLmdyb3VwMSAlaW4lIGdlbmUubm9Cb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAxKSoxMDBcbnN1bShnZW5lLmdyb3VwMiAlaW4lIGdlbmUubm9Cb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDBcblxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKFxuICAgIGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmUud0JvdW5kYXJ5IH4gXFx3aXRoaW5Cb3VuZGFyeVxcLFxuICAgIGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmUubm9Cb3VuZGFyeSB+IFxcbm9Cb3VuZGFyeVxcLFxuICAgIFRSVUUgfiBOQVxuICApKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKSAlPiVcbiAgZHBseXI6Om11dGF0ZShhYnNMb2cyRkMgPSBhYnMobG9nMkZvbGRDaGFuZ2UpKVxua3NfcmVzdWx0IDwtIGtzLnRlc3QoXG4gIGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcd2l0aGluQm91bmRhcnlcXCkgJT4lIHB1bGwoYWJzTG9nMkZDKSxcbiAgZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxub0JvdW5kYXJ5XFwpICU+JSBwdWxsKGFic0xvZzJGQylcbilcblxuZ2dwbG90KGRpZmYuUk5BLCBhZXMoeCA9IGdyb3VwLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEpXG5cbiMgZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4jICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGFic0xvZzJGQ1xuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRhYnNMb2cyRkNcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkaWZmLlJOQSwgXFx3aXRoQm91bmRhcnlcXCwgXFxub0JvdW5kYXJ5XFwpKVxuIyBcblxuIyBDcmVhdGUgdGhlIENERiBwbG90XG5wIDwtIGdncGxvdChkaWZmLlJOQSwgYWVzKHggPSBhYnNMb2cyRkMsIGNvbG9yID0gZ3JvdXApKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSAoYyhcXCM3Nzc3NzdcXCwgXFwjRjI4RTJDXFwpKSkgK1xuXG5zdGF0X2VjZGYoc2l6ZSA9IDAuNCwgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwgICkgKyAjIFVzZSBzdGF0X2VjZGYgdG8gcGxvdCB0aGUgZW1waXJpY2FsIENERlxuICBsYWJzKFxuICAgIHggPSBcXEFicy4gbG9nMihmb2xkIGNoYW5nZSlcXCxcbiAgICB5ID0gXFxDdW11bGF0aXZlIFByb2JhYmlsaXR5XFxcbiAgKSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxKSkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyAjIENsZWFuIHRoZW1lXG4gIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgIClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2NkZl9pbnN1bGF0aW9uQm91bmRhcnlfY29udlNTX3BlXFwpXG53aWR0aCA8LSAzMyptbVRvSW5jaFxuaGVpZ2h0IDwtMzMqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
data <- data.all %>% dplyr::filter(Anno2 %in% c(\P-E\))

temp <- data %>% dplyr::select(chrom1, start1, end1, chrom2, start2, end2, group) %>% distinct()

temp1 <- temp %>% dplyr::filter(group == \No\) %>% dplyr::select(-group)
fwrite(temp1, here(consensusDir, \insulated_domain_ss_no.bedpe\), sep = \\t\, col.names = FALSE)
temp2 <- temp %>% dplyr::filter(group == \Within\) %>% dplyr::select(-group)
fwrite(temp2, here(consensusDir, \insulated_domain_ss_within.bedpe\), sep = \\t\, col.names = FALSE)
temp3 <- temp %>% dplyr::filter(group == \Outside\) %>% dplyr::select(-group)
fwrite(temp3, here(consensusDir, \insulated_domain_ss_outside.bedpe\), sep = \\t\, col.names = FALSE)

temp <- data %>% dplyr::select(id, group, size) %>% distinct()


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$size
  distance2 <- (data %>% dplyr::filter(group ==group2) )$size
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

convPvalue(getPvalWilcox(temp, \No\, \Within\))
convPvalue(getPvalWilcox(temp, \No\, \Outside\))
convPvalue(getPvalWilcox(temp, \Outside\, \Within\))


p <- ggplot(temp, aes(x = group, y = size, fill = group)) + 
  geom_violin(linewidth = lineMedium* mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
                 linewidth = lineMedium * mmToLineUnit, lineend = \square\,
                 outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + scale_y_continuous(labels = label_kb_mb) +
  scale_fill_manual(values = c(\#777777\, \#F28E2C\, \#F28E2C\)) +
  stat_summary(
      aes(group = group), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \Loop size\)

fileName <- paste0(\insulationBoundary_size_convSS_PE\)
width <-33*mmToInch
height <- 35*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(group ==group2) )$diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

temp <- data %>% dplyr::select(group, id, diff_dTAG_DMSO) %>% distinct()

convPvalue(getPvalWilcox(temp, \No\, \Within\))
convPvalue(getPvalWilcox(temp, \No\, \Outside\))
convPvalue(getPvalWilcox(temp, \Outside\, \Within\))

p <- ggplot(data, aes(x = group, y = diff_dTAG_DMSO, fill = group)) + 
  geom_violin(linewidth = lineMedium * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() +   
    scale_fill_manual(values = c(\#777777\, \#F28E2C\, \#F28E2C\)) +
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \Δ loop score\) +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  geom_hline(yintercept = -0.2,
             alpha = 0.5, 
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\, linetype = \dashed\) +
  coord_cartesian(ylim = c(-0.8, 0.5))
    
fileName <- paste0(\insulationBoundary_delta_convSS_pe\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()  


###################### 

minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

data2 <- data %>% left_join(obsexp, by = c(\id\))

temp <- data2 %>% dplyr::select(group, id, log_obsexp_diff_dTAG_DMSO) %>% distinct()


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$log_obsexp_diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(group ==group2) )$log_obsexp_diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

convPvalue(getPvalWilcox(temp, \No\, \Within\))
convPvalue(getPvalWilcox(temp, \No\, \Outside\))
convPvalue(getPvalWilcox(temp, \Outside\, \Within\))


p <- ggplot(temp, aes(x = group, y = log_obsexp_diff_dTAG_DMSO, fill = group)) + 
  geom_violin(linewidth = lineMedium* mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  scale_fill_manual(values = c(\#777777\, \#F28E2C\, \#F28E2C\)) +
  
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \log2(fc of obs/exp)\) +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  coord_cartesian(ylim = c(-2, 2))
    width <-30*mmToInch
height <- 35*mmToInch
fileName <- paste0(\insulationBoundary_obsexp_convSS_pe\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()  





#####################

data <- data.all
gene.withinBoundary <- unique((data %>% dplyr::filter(group == \Within\))$gene)
gene.outsideBoundary <- unique((data %>% dplyr::filter(group == \Outside\))$gene)
gene.noBoundary <- unique((data %>% dplyr::filter(group == \No\))$gene)

gene.wBoundary <- unique(c(gene.withinBoundary, gene.outsideBoundary))

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

print(\perc of gene with loop within Boundary\)
sum(gene.group1 %in% gene.withinBoundary)/length(gene.group1)*100
sum(gene.group2 %in% gene.withinBoundary)/length(gene.group2)*100

print(\perc of gene with loop outside Boundary\)
sum(gene.group1 %in% gene.outsideBoundary)/length(gene.group1)*100
sum(gene.group2 %in% gene.outsideBoundary)/length(gene.group2)*100

print(\perc of gene with loop with no Boundary\)
sum(gene.group1 %in% gene.noBoundary)/length(gene.group1)*100
sum(gene.group2 %in% gene.noBoundary)/length(gene.group2)*100


diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name) %>%
  dplyr::mutate(group = case_when(
    ensembl_gene_id %in% gene.wBoundary ~ \withinBoundary\,
    ensembl_gene_id %in% gene.noBoundary ~ \noBoundary\,
    TRUE ~ NA
  )) %>%
  dplyr::filter(!is.na(group)) %>%
  dplyr::mutate(absLog2FC = abs(log2FoldChange))
ks_result <- ks.test(
  diff.RNA %>% dplyr::filter(group == \withinBoundary\) %>% pull(absLog2FC),
  diff.RNA %>% dplyr::filter(group == \noBoundary\) %>% pull(absLog2FC)
)

ggplot(diff.RNA, aes(x = group, y = log2FoldChange)) + geom_violin() + geom_boxplot(width = 0.1)

# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(group ==group1) )$absLog2FC
#   distance2 <- (data %>% dplyr::filter(group ==group2) )$absLog2FC
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# convPvalue(getPvalWilcox(diff.RNA, \withBoundary\, \noBoundary\))
# 

# Create the CDF plot
p <- ggplot(diff.RNA, aes(x = absLog2FC, color = group)) +
  scale_color_manual(values = (c(\#777777\, \#F28E2C\))) +

stat_ecdf(size = 0.4, linewidth = lineMedium * mmToLineUnit, lineend = \square\  ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Abs. log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.position = \none\,
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )

fileName <- paste0(\log2FC_cdf_insulationBoundary_convSS_pe\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVpHRjBZU0E4TFNCa1lYUmhMbUZzYkNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loQmJtNXZNaUFsYVc0bElHTW9YRnhRTFVWY1hDa3BYRzVjYm5SbGJYQWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGphSEp2YlRFc0lITjBZWEowTVN3Z1pXNWtNU3dnWTJoeWIyMHlMQ0J6ZEdGeWRESXNJR1Z1WkRJc0lHZHliM1Z3S1NBbFBpVWdaR2x6ZEdsdVkzUW9LVnh1WEc1MFpXMXdNU0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRnhjVG05Y1hDa2dKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9MV2R5YjNWd0tWeHVabmR5YVhSbEtIUmxiWEF4TENCb1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z1hGeHBibk4xYkdGMFpXUmZaRzl0WVdsdVgzTnpYMjV2TG1KbFpIQmxYRndwTENCelpYQWdQU0JjWEZ4Y2RGeGNMQ0JqYjJ3dWJtRnRaWE1nUFNCR1FVeFRSU2xjYm5SbGJYQXlJRHd0SUhSbGJYQWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdYRnhYYVhSb2FXNWNYQ2tnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvTFdkeWIzVndLVnh1Wm5keWFYUmxLSFJsYlhBeUxDQm9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2dYRnhwYm5OMWJHRjBaV1JmWkc5dFlXbHVYM056WDNkcGRHaHBiaTVpWldSd1pWeGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDd2dZMjlzTG01aGJXVnpJRDBnUmtGTVUwVXBYRzUwWlcxd015QThMU0IwWlcxd0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOUlGeGNUM1YwYzJsa1pWeGNLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2d0WjNKdmRYQXBYRzVtZDNKcGRHVW9kR1Z0Y0RNc0lHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNYR2x1YzNWc1lYUmxaRjlrYjIxaGFXNWZjM05mYjNWMGMybGtaUzVpWldSd1pWeGNLU3dnYzJWd0lEMGdYRnhjWEhSY1hDd2dZMjlzTG01aGJXVnpJRDBnUmtGTVUwVXBYRzVjYm5SbGJYQWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaHBaQ3dnWjNKdmRYQXNJSE5wZW1VcElDVStKU0JrYVhOMGFXNWpkQ2dwWEc1Y2JseHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TVNrZ0tTUnphWHBsWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TWlrZ0tTUnphWHBsWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WEc1amIyNTJVSFpoYkhWbEtHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYRnhPYjF4Y0xDQmNYRmRwZEdocGJseGNLU2xjYm1OdmJuWlFkbUZzZFdVb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNYRTV2WEZ3c0lGeGNUM1YwYzJsa1pWeGNLU2xjYm1OdmJuWlFkbUZzZFdVb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNYRTkxZEhOcFpHVmNYQ3dnWEZ4WGFYUm9hVzVjWENrcFhHNWNibHh1Y0NBOExTQm5aM0JzYjNRb2RHVnRjQ3dnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUhOcGVtVXNJR1pwYkd3Z1BTQm5jbTkxY0NrcElDc2dYRzRnSUdkbGIyMWZkbWx2YkdsdUtHeHBibVYzYVdSMGFDQTlJR3hwYm1WTlpXUnBkVzBxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRndzSUdGc2NHaGhJRDBnTGpRc0lDd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnS3lCY2JpQWdaMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0ekxDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpVMWxaR2wxYlNBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTd2dJR0ZzY0doaElEMGdNQzQyTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJJRnh1SUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCelkyRnNaVjk1WDJOdmJuUnBiblZ2ZFhNb2JHRmlaV3h6SUQwZ2JHRmlaV3hmYTJKZmJXSXBJQ3RjYmlBZ2MyTmhiR1ZmWm1sc2JGOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNYQ00zTnpjM056ZGNYQ3dnWEZ3alJqSTRSVEpEWEZ3c0lGeGNJMFl5T0VVeVExeGNLU2tnSzF4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWEc0Z0lDQWdJQ0JoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnSUNCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01DNDFMRnh1SUNBZ0lDQWdabWxzYkNBOUlGeGNZbXhoWTJ0Y1hDd2dZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NJSEJ2YzJsMGFXOXVJRDBnY0c5emFYUnBiMjVmWkc5a1oyVW9Mak1wWEc0Z0lDa2dLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxMbmdnUFNCbGJHVnRaVzUwWDJKc1lXNXJLQ2tzWEc0Z0lDQWdZWGhwY3k1MGFYUnNaUzU1SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTeGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5eGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hGeHVJQ0FnSUNrc0lDQWdJRnh1SUNBZ0lHRjRhWE11ZEdWNGRDNTRJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN4Y2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lDQWdJQ0FnSXlCU2IzUmhkR1VnZUMxaGVHbHpJR3hoWW1Wc2N5QTBOU0JrWldkeVpXVnpYRzRnSUNBZ0lDQm9hblZ6ZENBOUlERXNJQ0FnSUNBZ0lDTWdRV1JxZFhOMElHaHZjbWw2YjI1MFlXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUlDQWdJQ0FnZG1wMWMzUWdQU0F4SUNBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0IyWlhKMGFXTmhiQ0JxZFhOMGFXWnBZMkYwYVc5dVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjWEhSeVlXNXpjR0Z5Wlc1MFhGd3BMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2tnSzJ4aFluTW9lU0E5SUZ4Y1RHOXZjQ0J6YVhwbFhGd3BYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hHbHVjM1ZzWVhScGIyNUNiM1Z1WkdGeWVWOXphWHBsWDJOdmJuWlRVMTlRUlZ4Y0tWeHVkMmxrZEdnZ1BDMHpNeXB0YlZSdlNXNWphRnh1YUdWcFoyaDBJRHd0SURNMUttMXRWRzlKYm1Ob1hHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Y2JtZGxkRkIyWVd4WGFXeGpiM2dnUEMwZ1puVnVZM1JwYjI0b1pHRjBZU3dnWjNKdmRYQXhMQ0JuY205MWNESXBlMXh1SUNCa2FYTjBZVzVqWlRFZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQxbmNtOTFjREVwSUNra1pHbG1abDlrVkVGSFgwUk5VMDljYmlBZ1pHbHpkR0Z1WTJVeUlEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOVozSnZkWEF5S1NBcEpHUnBabVpmWkZSQlIxOUVUVk5QWEc0Z0lIZHBiQ0E4TFNCM2FXeGpiM2d1ZEdWemRDaGthWE4wWVc1alpURXNJR1JwYzNSaGJtTmxNaWxjYmlBZ2NtVjBkWEp1S0hkcGJDUndMblpoYkhWbEtWeHVmVnh1WEc1MFpXMXdJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanB6Wld4bFkzUW9aM0p2ZFhBc0lHbGtMQ0JrYVdabVgyUlVRVWRmUkUxVFR5a2dKVDRsSUdScGMzUnBibU4wS0NsY2JseHVZMjl1ZGxCMllXeDFaU2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ4Y1RtOWNYQ3dnWEZ4WGFYUm9hVzVjWENrcFhHNWpiMjUyVUhaaGJIVmxLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWEZ4T2IxeGNMQ0JjWEU5MWRITnBaR1ZjWENrcFhHNWpiMjUyVUhaaGJIVmxLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWEZ4UGRYUnphV1JsWEZ3c0lGeGNWMmwwYUdsdVhGd3BLVnh1WEc1d0lEd3RJR2RuY0d4dmRDaGtZWFJoTENCaFpYTW9lQ0E5SUdkeWIzVndMQ0I1SUQwZ1pHbG1abDlrVkVGSFgwUk5VMDhzSUdacGJHd2dQU0JuY205MWNDa3BJQ3NnWEc0Z0lHZGxiMjFmZG1sdmJHbHVLR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVk5aV1JwZFcwZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0xDQmhiSEJvWVNBOUlDNDBMQ0FzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNeXdnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxUV1ZrYVhWdElDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lHOTFkR3hwWlhJdWMyaGhjR1VnUFNCT1FTd2dJR0ZzY0doaElEMGdNQzQyTENCemFHOTNMbXhsWjJWdVpDQTlJRVpCVEZORktTQXJJRnh1SUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lBZ0lGeHVJQ0FnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hGd2pOemMzTnpjM1hGd3NJRnhjSTBZeU9FVXlRMXhjTENCY1hDTkdNamhGTWtOY1hDa3BJQ3RjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLRnh1SUNBZ0lHRmxjeWhuY205MWNDQTlJR2R5YjNWd0tTd2dablZ1SUQwZ2JXVmhiaXhjYmlBZ0lDQm5aVzl0SUQwZ1hGeHdiMmx1ZEZ4Y0xDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNQzQxTEZ4dUlDQWdJR1pwYkd3Z1BTQmNYR0pzWVdOclhGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNMQ0J3YjNOcGRHbHZiaUE5SUhCdmMybDBhVzl1WDJSdlpHZGxLQzR6S1Z4dUlDQXBJQ3RjYmlBZ2RHaGxiV1VvWEc0Z0lDQWdZWGhwY3k1MGFYUnNaUzU0SUQwZ1pXeGxiV1Z1ZEY5aWJHRnVheWdwTEZ4dUlDQWdJR0Y0YVhNdWRHbDBiR1V1ZVNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpVMHNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNYRzRnSUNBZ0lDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTeGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGeGNiaUFnSUNBcExDQWdJQ0JjYmlBZ0lDQmhlR2x6TG5SbGVIUXVlQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc1hHNGdJQ0FnSUNCaGJtZHNaU0E5SURRMUxDQWdJQ0FnSUNNZ1VtOTBZWFJsSUhndFlYaHBjeUJzWVdKbGJITWdORFVnWkdWbmNtVmxjMXh1SUNBZ0lDQWdhR3AxYzNRZ1BTQXhMQ0FnSUNBZ0lDQWpJRUZrYW5WemRDQm9iM0pwZW05dWRHRnNJR3AxYzNScFptbGpZWFJwYjI1Y2JpQWdJQ0FnSUhacWRYTjBJRDBnTVNBZ0lDQWdJQ0FnSXlCQlpHcDFjM1FnZG1WeWRHbGpZV3dnYW5WemRHbG1hV05oZEdsdmJseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NXNhVzVsSUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3hjYmlBZ0lDQWdJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc3FiVzFVYjB4cGJtVlZibWwwTEZ4dUlDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHbGphM01nUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdjR0Z1Wld3dVltRmphMmR5YjNWdVpDQTlJR1ZzWlcxbGJuUmZjbVZqZENobWFXeHNJRDBnWEZ4MGNtRnVjM0JoY21WdWRGeGNLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5a3NYRzRnSUNBZ2JHVm5aVzVrTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtWeHVJQ0FwSUN0c1lXSnpLSGtnUFNCY1hNNlVJR3h2YjNBZ2MyTnZjbVZjWENrZ0t5QWdJQ0JjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JoYkhCb1lTQTlJREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3BJQ3NnWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUMwd0xqSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1lXeHdhR0VnUFNBd0xqVXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0xDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktDMHdMamdzSURBdU5Ta3BYRzRnSUNBZ1hHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YRnhwYm5OMWJHRjBhVzl1UW05MWJtUmhjbmxmWkdWc2RHRmZZMjl1ZGxOVFgzQmxYRndwWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BJQ0JjYmx4dVhHNGpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSUZ4dVhHNXRhVzVXWVd4MVpTQThMU0F0TkZ4dWIySnpaWGh3SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvWEZ4c2IyOXdVMk52Y21WZlkyOXVjMTl2WW5ObGVIQXVkSE4yWEZ3cEtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvYkc5blgyOWljMlY0Y0Y5RVRWTlBJRDBnYVdaZlpXeHpaU2h2WW5ObGVIQmZSRTFUVHlBOVBTQXdMQ0J0YVc1V1lXeDFaU3dnYkc5bk1paHZZbk5sZUhCZlJFMVRUeWtwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4dloxOXZZbk5sZUhCZlpGUkJSeUE5SUdsbVgyVnNjMlVvYjJKelpYaHdYMlJVUVVjZ1BUMGdNQ3dnYldsdVZtRnNkV1VzSUd4dlp6SW9iMkp6Wlhod1gyUlVRVWNwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyZGZiMkp6Wlhod1gwRTBPRFVnUFNCcFpsOWxiSE5sS0c5aWMyVjRjRjlCTkRnMUlEMDlJREFzSUcxcGJsWmhiSFZsTENCc2IyY3lLRzlpYzJWNGNGOUJORGcxS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOW5YMjlpYzJWNGNGOWthV1ptWDJSVVFVZGZSRTFUVHlBOUlHeHZaMTl2WW5ObGVIQmZaRlJCUnlBdElHeHZaMTl2WW5ObGVIQmZSRTFUVHl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyZGZiMkp6Wlhod1gyUnBabVpmUVRRNE5WOUVUVk5QSUQwZ2JHOW5YMjlpYzJWNGNGOUJORGcxSUMwZ2JHOW5YMjlpYzJWNGNGOUVUVk5QS1Z4dVhHNWtZWFJoTWlBOExTQmtZWFJoSUNVK0pTQnNaV1owWDJwdmFXNG9iMkp6Wlhod0xDQmllU0E5SUdNb1hGeHBaRnhjS1NsY2JseHVkR1Z0Y0NBOExTQmtZWFJoTWlBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENobmNtOTFjQ3dnYVdRc0lHeHZaMTl2WW5ObGVIQmZaR2xtWmw5a1ZFRkhYMFJOVTA4cElDVStKU0JrYVhOMGFXNWpkQ2dwWEc1Y2JseHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBXZHliM1Z3TVNrZ0tTUnNiMmRmYjJKelpYaHdYMlJwWm1aZlpGUkJSMTlFVFZOUFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQV2R5YjNWd01pa2dLU1JzYjJkZmIySnpaWGh3WDJScFptWmZaRlJCUjE5RVRWTlBYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzVqYjI1MlVIWmhiSFZsS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hGeE9iMXhjTENCY1hGZHBkR2hwYmx4Y0tTbGNibU52Ym5aUWRtRnNkV1VvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TENCY1hFNXZYRndzSUZ4Y1QzVjBjMmxrWlZ4Y0tTbGNibU52Ym5aUWRtRnNkV1VvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TENCY1hFOTFkSE5wWkdWY1hDd2dYRnhYYVhSb2FXNWNYQ2twWEc1Y2JseHVjQ0E4TFNCblozQnNiM1FvZEdWdGNDd2dZV1Z6S0hnZ1BTQm5jbTkxY0N3Z2VTQTlJR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOHNJR1pwYkd3Z1BTQm5jbTkxY0NrcElDc2dYRzRnSUdkbGIyMWZkbWx2YkdsdUtHeHBibVYzYVdSMGFDQTlJR3hwYm1WTlpXUnBkVzBxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRndzSUdGc2NHaGhJRDBnTGpRc0lDd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnS3lCY2JpQWdaMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0ekxDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WTlpXUnBkVzBnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCTENBZ1lXeHdhR0VnUFNBd0xqWXNJSE5vYjNjdWJHVm5aVzVrSUQwZ1JrRk1VMFVwSUNzZ1hHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJRnh1SUNCelkyRnNaVjltYVd4c1gyMWhiblZoYkNoMllXeDFaWE1nUFNCaktGeGNJemMzTnpjM04xeGNMQ0JjWENOR01qaEZNa05jWEN3Z1hGd2pSakk0UlRKRFhGd3BLU0FyWEc0Z0lGeHVJQ0J6ZEdGMFgzTjFiVzFoY25rb1hHNGdJQ0FnWVdWektHZHliM1Z3SUQwZ1ozSnZkWEFwTENCbWRXNGdQU0J0WldGdUxGeHVJQ0FnSUdkbGIyMGdQU0JjWEhCdmFXNTBYRndzSUhOb1lYQmxJRDBnTWpFc0lITnBlbVVnUFNBd0xqVXNYRzRnSUNBZ1ptbHNiQ0E5SUZ4Y1lteGhZMnRjWEN3Z1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c0lIQnZjMmwwYVc5dUlEMGdjRzl6YVhScGIyNWZaRzlrWjJVb0xqTXBYRzRnSUNrZ0sxeHVJQ0IwYUdWdFpTaGNiaUFnSUNCaGVHbHpMblJwZEd4bExuZ2dQU0JsYkdWdFpXNTBYMkpzWVc1cktDa3NYRzRnSUNBZ1lYaHBjeTUwYVhSc1pTNTVJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl4Y2JpQWdJQ0FnSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTEZ4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEZ4dUlDQWdJQ2tzSUNBZ0lGeHVJQ0FnSUdGNGFYTXVkR1Y0ZEM1NElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3hjYmlBZ0lDQWdJR0Z1WjJ4bElEMGdORFVzSUNBZ0lDQWdJeUJTYjNSaGRHVWdlQzFoZUdseklHeGhZbVZzY3lBME5TQmtaV2R5WldWelhHNGdJQ0FnSUNCb2FuVnpkQ0E5SURFc0lDQWdJQ0FnSUNNZ1FXUnFkWE4wSUdodmNtbDZiMjUwWVd3Z2FuVnpkR2xtYVdOaGRHbHZibHh1SUNBZ0lDQWdkbXAxYzNRZ1BTQXhJQ0FnSUNBZ0lDQWpJRUZrYW5WemRDQjJaWEowYVdOaGJDQnFkWE4wYVdacFkyRjBhVzl1WEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNYSFJ5WVc1emNHRnlaVzUwWEZ3cExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDa2dLMnhoWW5Nb2VTQTlJRnhjYkc5bk1paG1ZeUJ2WmlCdlluTXZaWGh3S1Z4Y0tTQXJJQ0FnSUZ4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUdGc2NHaGhJRDBnTVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ2tnS3lCY2JpQWdZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktDMHlMQ0F5S1NsY2JpQWdJQ0IzYVdSMGFDQThMVE13S20xdFZHOUpibU5vWEc1b1pXbG5hSFFnUEMwZ016VXFiVzFVYjBsdVkyaGNibVpwYkdWT1lXMWxJRHd0SUhCaGMzUmxNQ2hjWEdsdWMzVnNZWFJwYjI1Q2IzVnVaR0Z5ZVY5dlluTmxlSEJmWTI5dWRsTlRYM0JsWEZ3cFhHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwSUNCY2JseHVYRzVjYmx4dVhHNGpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU5jYmx4dVpHRjBZU0E4TFNCa1lYUmhMbUZzYkZ4dVoyVnVaUzUzYVhSb2FXNUNiM1Z1WkdGeWVTQThMU0IxYm1seGRXVW9LR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQwZ1hGeFhhWFJvYVc1Y1hDa3BKR2RsYm1VcFhHNW5aVzVsTG05MWRITnBaR1ZDYjNWdVpHRnllU0E4TFNCMWJtbHhkV1VvS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMGdYRnhQZFhSemFXUmxYRndwS1NSblpXNWxLVnh1WjJWdVpTNXViMEp2ZFc1a1lYSjVJRHd0SUhWdWFYRjFaU2dvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNYRTV2WEZ3cEtTUm5aVzVsS1Z4dVhHNW5aVzVsTG5kQ2IzVnVaR0Z5ZVNBOExTQjFibWx4ZFdVb1l5aG5aVzVsTG5kcGRHaHBia0p2ZFc1a1lYSjVMQ0JuWlc1bExtOTFkSE5wWkdWQ2IzVnVaR0Z5ZVNrcFhHNWNibWRsYm1VdVozSnZkWEF4SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNYR2RsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNERXVkSE4yWEZ3cEtTUm5aVzVsWEc1blpXNWxMbWR5YjNWd01pQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4blpXNWxUR2x6ZEY5a1ZFRkhYM1p6WDBSTlUwOWZVazVCWDJ4dmIzQmZZbWx1WVhKNVIzSnZkWEF5TG5SemRseGNLU2trWjJWdVpWeHVYRzV3Y21sdWRDaGNYSEJsY21NZ2IyWWdaMlZ1WlNCM2FYUm9JR3h2YjNBZ2QybDBhR2x1SUVKdmRXNWtZWEo1WEZ3cFhHNXpkVzBvWjJWdVpTNW5jbTkxY0RFZ0pXbHVKU0JuWlc1bExuZHBkR2hwYmtKdmRXNWtZWEo1S1M5c1pXNW5kR2dvWjJWdVpTNW5jbTkxY0RFcEtqRXdNRnh1YzNWdEtHZGxibVV1WjNKdmRYQXlJQ1ZwYmlVZ1oyVnVaUzUzYVhSb2FXNUNiM1Z1WkdGeWVTa3ZiR1Z1WjNSb0tHZGxibVV1WjNKdmRYQXlLU294TURCY2JseHVjSEpwYm5Rb1hGeHdaWEpqSUc5bUlHZGxibVVnZDJsMGFDQnNiMjl3SUc5MWRITnBaR1VnUW05MWJtUmhjbmxjWENsY2JuTjFiU2huWlc1bExtZHliM1Z3TVNBbGFXNGxJR2RsYm1VdWIzVjBjMmxrWlVKdmRXNWtZWEo1S1M5c1pXNW5kR2dvWjJWdVpTNW5jbTkxY0RFcEtqRXdNRnh1YzNWdEtHZGxibVV1WjNKdmRYQXlJQ1ZwYmlVZ1oyVnVaUzV2ZFhSemFXUmxRbTkxYm1SaGNua3BMMnhsYm1kMGFDaG5aVzVsTG1keWIzVndNaWtxTVRBd1hHNWNibkJ5YVc1MEtGeGNjR1Z5WXlCdlppQm5aVzVsSUhkcGRHZ2diRzl2Y0NCM2FYUm9JRzV2SUVKdmRXNWtZWEo1WEZ3cFhHNXpkVzBvWjJWdVpTNW5jbTkxY0RFZ0pXbHVKU0JuWlc1bExtNXZRbTkxYm1SaGNua3BMMnhsYm1kMGFDaG5aVzVsTG1keWIzVndNU2txTVRBd1hHNXpkVzBvWjJWdVpTNW5jbTkxY0RJZ0pXbHVKU0JuWlc1bExtNXZRbTkxYm1SaGNua3BMMnhsYm1kMGFDaG5aVzVsTG1keWIzVndNaWtxTVRBd1hHNWNibHh1WkdsbVppNVNUa0VnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaR2xtWmw5SE1TNWtWRUZIWDBjeExqSnBMbVJVUVVkZmRuTmZSekV1TW1rdVJFMVRUeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dWdWMyVnRZbXhmWjJWdVpWOXBaQ3dnYkc5bk1rWnZiR1JEYUdGdVoyVXNJSE5vY21sdWEyVmtYMnh2WnpKR1F5d2djR0ZrYWl3Z1pYaDBaWEp1WVd4ZloyVnVaVjl1WVcxbEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJR05oYzJWZmQyaGxiaWhjYmlBZ0lDQmxibk5sYldKc1gyZGxibVZmYVdRZ0pXbHVKU0JuWlc1bExuZENiM1Z1WkdGeWVTQitJRnhjZDJsMGFHbHVRbTkxYm1SaGNubGNYQ3hjYmlBZ0lDQmxibk5sYldKc1gyZGxibVZmYVdRZ0pXbHVKU0JuWlc1bExtNXZRbTkxYm1SaGNua2dmaUJjWEc1dlFtOTFibVJoY25sY1hDeGNiaUFnSUNCVVVsVkZJSDRnVGtGY2JpQWdLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcG1hV3gwWlhJb0lXbHpMbTVoS0dkeWIzVndLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1lXSnpURzluTWtaRElEMGdZV0p6S0d4dlp6SkdiMnhrUTJoaGJtZGxLU2xjYm10elgzSmxjM1ZzZENBOExTQnJjeTUwWlhOMEtGeHVJQ0JrYVdabUxsSk9RU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JjWEhkcGRHaHBia0p2ZFc1a1lYSjVYRndwSUNVK0pTQndkV3hzS0dGaWMweHZaekpHUXlrc1hHNGdJR1JwWm1ZdVVrNUJJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRnhjYm05Q2IzVnVaR0Z5ZVZ4Y0tTQWxQaVVnY0hWc2JDaGhZbk5NYjJjeVJrTXBYRzRwWEc1Y2JtZG5jR3h2ZENoa2FXWm1MbEpPUVN3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlHeHZaekpHYjJ4a1EyaGhibWRsS1NrZ0t5Qm5aVzl0WDNacGIyeHBiaWdwSUNzZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR4S1Z4dVhHNGpJR2RsZEZCMllXeFhhV3hqYjNnZ1BDMGdablZ1WTNScGIyNG9aR0YwWVN3Z1ozSnZkWEF4TENCbmNtOTFjRElwZTF4dUl5QWdJR1JwYzNSaGJtTmxNU0E4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQV2R5YjNWd01Ta2dLU1JoWW5OTWIyY3lSa05jYmlNZ0lDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMW5jbTkxY0RJcElDa2tZV0p6VEc5bk1rWkRYRzRqSUNBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SXlBZ0lISmxkSFZ5YmloM2FXd2tjQzUyWVd4MVpTbGNiaU1nZlZ4dUl5QmpiMjUyVUhaaGJIVmxLR2RsZEZCMllXeFhhV3hqYjNnb1pHbG1aaTVTVGtFc0lGeGNkMmwwYUVKdmRXNWtZWEo1WEZ3c0lGeGNibTlDYjNWdVpHRnllVnhjS1NsY2JpTWdYRzVjYmlNZ1EzSmxZWFJsSUhSb1pTQkRSRVlnY0d4dmRGeHVjQ0E4TFNCblozQnNiM1FvWkdsbVppNVNUa0VzSUdGbGN5aDRJRDBnWVdKelRHOW5Na1pETENCamIyeHZjaUE5SUdkeWIzVndLU2tnSzF4dUlDQnpZMkZzWlY5amIyeHZjbDl0WVc1MVlXd29kbUZzZFdWeklEMGdLR01vWEZ3ak56YzNOemMzWEZ3c0lGeGNJMFl5T0VVeVExeGNLU2twSUN0Y2JseHVjM1JoZEY5bFkyUm1LSE5wZW1VZ1BTQXdMalFzSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZOWldScGRXMGdLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNJQ0FwSUNzZ0l5QlZjMlVnYzNSaGRGOWxZMlJtSUhSdklIQnNiM1FnZEdobElHVnRjR2x5YVdOaGJDQkRSRVpjYmlBZ2JHRmljeWhjYmlBZ0lDQjRJRDBnWEZ4QlluTXVJR3h2WnpJb1ptOXNaQ0JqYUdGdVoyVXBYRndzWEc0Z0lDQWdlU0E5SUZ4Y1EzVnRkV3hoZEdsMlpTQlFjbTlpWVdKcGJHbDBlVnhjWEc0Z0lDa2dLeUJqYjI5eVpGOWpZWEowWlhOcFlXNG9lR3hwYlNBOUlHTW9NQ3dnTVNrcElDdGNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnSXlCRGJHVmhiaUIwYUdWdFpWeHVJQ0IwYUdWdFpTaGNiaUFnSUNBZ0lHRjRhWE11ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlUwc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHVjRkQ0E5SUdWc1pXMWxiblJmZEdWNGRDaGNiaUFnSUNBZ0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNc1hHNGdJQ0FnSUNCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN4Y2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hDeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRnhjZEhKaGJuTndZWEpsYm5SY1hDa3NYRzRnSUNBZ2JHVm5aVzVrTG5CdmMybDBhVzl1SUQwZ1hGeHViMjVsWEZ3c1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWxjYmlBZ0lDQXBYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hHeHZaekpHUTE5alpHWmZhVzV6ZFd4aGRHbHZia0p2ZFc1a1lYSjVYMk52Ym5aVFUxOXdaVnhjS1Z4dWQybGtkR2dnUEMwZ016TXFiVzFVYjBsdVkyaGNibWhsYVdkb2RDQThMVE16S20xdFZHOUpibU5vWEc1d2JtY29hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWNHNW5YRndwS1N3Z2NtVnpJRDBnTmpBd0xDQjFibWwwSUQwZ1hGeHBibHhjTENCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGeGNMbk4yWjF4Y0tTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzVnWUdCY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5gYGByXG5kYXRhIDwtIGRhdGEuYWxsICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtRVxcKSlcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMiwgZ3JvdXApICU+JSBkaXN0aW5jdCgpXG5cbnRlbXAxIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxOb1xcKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApXG5md3JpdGUodGVtcDEsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGluc3VsYXRlZF9kb21haW5fc3Nfbm8uYmVkcGVcXCksIHNlcCA9IFxcXFx0XFwsIGNvbC5uYW1lcyA9IEZBTFNFKVxudGVtcDIgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXFdpdGhpblxcKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApXG5md3JpdGUodGVtcDIsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGluc3VsYXRlZF9kb21haW5fc3Nfd2l0aGluLmJlZHBlXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbnRlbXAzIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxPdXRzaWRlXFwpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cClcbmZ3cml0ZSh0ZW1wMywgaGVyZShjb25zZW5zdXNEaXIsIFxcaW5zdWxhdGVkX2RvbWFpbl9zc19vdXRzaWRlLmJlZHBlXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcblxudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KGlkLCBncm91cCwgc2l6ZSkgJT4lIGRpc3RpbmN0KClcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNpemVcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJHNpemVcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbmNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXE5vXFwsIFxcV2l0aGluXFwpKVxuY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsIFxcTm9cXCwgXFxPdXRzaWRlXFwpKVxuY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsIFxcT3V0c2lkZVxcLCBcXFdpdGhpblxcKSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gc2l6ZSwgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZU1lZGl1bSogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgYWxwaGEgPSAuNCwgLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcIzc3Nzc3N1xcLCBcXCNGMjhFMkNcXCwgXFwjRjI4RTJDXFwpKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSxcbiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSwgICAgXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArbGFicyh5ID0gXFxMb29wIHNpemVcXClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbkJvdW5kYXJ5X3NpemVfY29udlNTX1BFXFwpXG53aWR0aCA8LTMzKm1tVG9JbmNoXG5oZWlnaHQgPC0gMzUqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRkaWZmX2RUQUdfRE1TT1xuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkZGlmZl9kVEFHX0RNU09cbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgaWQsIGRpZmZfZFRBR19ETVNPKSAlPiUgZGlzdGluY3QoKVxuXG5jb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgXFxOb1xcLCBcXFdpdGhpblxcKSlcbmNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXE5vXFwsIFxcT3V0c2lkZVxcKSlcbmNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXE91dHNpZGVcXCwgXFxXaXRoaW5cXCkpXG5cbnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaWZmX2RUQUdfRE1TTywgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArICAgXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCM3Nzc3NzdcXCwgXFwjRjI4RTJDXFwsIFxcI0YyOEUyQ1xcKSkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK2xhYnMoeSA9IFxczpQgbG9vcCBzY29yZVxcKSArICAgIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgKyBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTAuMixcbiAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuOCwgMC41KSlcbiAgICBcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25Cb3VuZGFyeV9kZWx0YV9jb252U1NfcGVcXClcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKCkgIFxuXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgXG5cbm1pblZhbHVlIDwtIC00XG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pXG5cbmRhdGEyIDwtIGRhdGEgJT4lIGxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuXG50ZW1wIDwtIGRhdGEyICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBpZCwgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTykgJT4lIGRpc3RpbmN0KClcblxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU09cbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU09cbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbmNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXE5vXFwsIFxcV2l0aGluXFwpKVxuY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsIFxcTm9cXCwgXFxPdXRzaWRlXFwpKVxuY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsIFxcT3V0c2lkZVxcLCBcXFdpdGhpblxcKSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZU1lZGl1bSogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgYWxwaGEgPSAuNCwgLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgdGhlbWVfY2xhc3NpYygpICsgXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjNzc3Nzc3XFwsIFxcI0YyOEUyQ1xcLCBcXCNGMjhFMkNcXCkpICtcbiAgXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSxcbiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSwgICAgXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArbGFicyh5ID0gXFxsb2cyKGZjIG9mIG9icy9leHApXFwpICsgICAgXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsXG4gICAgICAgICAgICAgYWxwaGEgPSAxLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArIFxuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTIsIDIpKVxuICAgIHdpZHRoIDwtMzAqbW1Ub0luY2hcbmhlaWdodCA8LSAzNSptbVRvSW5jaFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcaW5zdWxhdGlvbkJvdW5kYXJ5X29ic2V4cF9jb252U1NfcGVcXClcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKCkgIFxuXG5cblxuXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5kYXRhIDwtIGRhdGEuYWxsXG5nZW5lLndpdGhpbkJvdW5kYXJ5IDwtIHVuaXF1ZSgoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXFdpdGhpblxcKSkkZ2VuZSlcbmdlbmUub3V0c2lkZUJvdW5kYXJ5IDwtIHVuaXF1ZSgoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXE91dHNpZGVcXCkpJGdlbmUpXG5nZW5lLm5vQm91bmRhcnkgPC0gdW5pcXVlKChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcTm9cXCkpJGdlbmUpXG5cbmdlbmUud0JvdW5kYXJ5IDwtIHVuaXF1ZShjKGdlbmUud2l0aGluQm91bmRhcnksIGdlbmUub3V0c2lkZUJvdW5kYXJ5KSlcblxuZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cbnByaW50KFxccGVyYyBvZiBnZW5lIHdpdGggbG9vcCB3aXRoaW4gQm91bmRhcnlcXClcbnN1bShnZW5lLmdyb3VwMSAlaW4lIGdlbmUud2l0aGluQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwXG5zdW0oZ2VuZS5ncm91cDIgJWluJSBnZW5lLndpdGhpbkJvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDIpKjEwMFxuXG5wcmludChcXHBlcmMgb2YgZ2VuZSB3aXRoIGxvb3Agb3V0c2lkZSBCb3VuZGFyeVxcKVxuc3VtKGdlbmUuZ3JvdXAxICVpbiUgZ2VuZS5vdXRzaWRlQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwXG5zdW0oZ2VuZS5ncm91cDIgJWluJSBnZW5lLm91dHNpZGVCb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDBcblxucHJpbnQoXFxwZXJjIG9mIGdlbmUgd2l0aCBsb29wIHdpdGggbm8gQm91bmRhcnlcXClcbnN1bShnZW5lLmdyb3VwMSAlaW4lIGdlbmUubm9Cb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAxKSoxMDBcbnN1bShnZW5lLmdyb3VwMiAlaW4lIGdlbmUubm9Cb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDBcblxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKFxuICAgIGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmUud0JvdW5kYXJ5IH4gXFx3aXRoaW5Cb3VuZGFyeVxcLFxuICAgIGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmUubm9Cb3VuZGFyeSB+IFxcbm9Cb3VuZGFyeVxcLFxuICAgIFRSVUUgfiBOQVxuICApKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKSAlPiVcbiAgZHBseXI6Om11dGF0ZShhYnNMb2cyRkMgPSBhYnMobG9nMkZvbGRDaGFuZ2UpKVxua3NfcmVzdWx0IDwtIGtzLnRlc3QoXG4gIGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcd2l0aGluQm91bmRhcnlcXCkgJT4lIHB1bGwoYWJzTG9nMkZDKSxcbiAgZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxub0JvdW5kYXJ5XFwpICU+JSBwdWxsKGFic0xvZzJGQylcbilcblxuZ2dwbG90KGRpZmYuUk5BLCBhZXMoeCA9IGdyb3VwLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEpXG5cbiMgZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4jICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGFic0xvZzJGQ1xuIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRhYnNMb2cyRkNcbiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4jICAgcmV0dXJuKHdpbCRwLnZhbHVlKVxuIyB9XG4jIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkaWZmLlJOQSwgXFx3aXRoQm91bmRhcnlcXCwgXFxub0JvdW5kYXJ5XFwpKVxuIyBcblxuIyBDcmVhdGUgdGhlIENERiBwbG90XG5wIDwtIGdncGxvdChkaWZmLlJOQSwgYWVzKHggPSBhYnNMb2cyRkMsIGNvbG9yID0gZ3JvdXApKSArXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSAoYyhcXCM3Nzc3NzdcXCwgXFwjRjI4RTJDXFwpKSkgK1xuXG5zdGF0X2VjZGYoc2l6ZSA9IDAuNCwgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwgICkgKyAjIFVzZSBzdGF0X2VjZGYgdG8gcGxvdCB0aGUgZW1waXJpY2FsIENERlxuICBsYWJzKFxuICAgIHggPSBcXEFicy4gbG9nMihmb2xkIGNoYW5nZSlcXCxcbiAgICB5ID0gXFxDdW11bGF0aXZlIFByb2JhYmlsaXR5XFxcbiAgKSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxKSkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyAjIENsZWFuIHRoZW1lXG4gIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgIClcblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2NkZl9pbnN1bGF0aW9uQm91bmRhcnlfY29udlNTX3BlXFwpXG53aWR0aCA8LSAzMyptbVRvSW5jaFxuaGVpZ2h0IDwtMzMqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGF0YSA8LSBkYXRhLmFsbCAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLUVcXCkpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGdyb3VwKSAlPiUgZGlzdGluY3QoKVxuXG50ZW1wMSA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcTm9cXCkgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKVxuZndyaXRlKHRlbXAxLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxpbnN1bGF0ZWRfZG9tYWluX3NzX25vLmJlZHBlXFwpLCBzZXAgPSBcXFxcdFxcLCBjb2wubmFtZXMgPSBGQUxTRSlcbnRlbXAyIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxXaXRoaW5cXCkgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKVxuZndyaXRlKHRlbXAyLCBoZXJlKGNvbnNlbnN1c0RpciwgXFxpbnN1bGF0ZWRfZG9tYWluX3NzX3dpdGhpbi5iZWRwZVxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG50ZW1wMyA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcT3V0c2lkZVxcKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApXG5md3JpdGUodGVtcDMsIGhlcmUoY29uc2Vuc3VzRGlyLCBcXGluc3VsYXRlZF9kb21haW5fc3Nfb3V0c2lkZS5iZWRwZVxcKSwgc2VwID0gXFxcXHRcXCwgY29sLm5hbWVzID0gRkFMU0UpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChpZCwgZ3JvdXAsIHNpemUpICU+JSBkaXN0aW5jdCgpXG5cblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRzaXplXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzaXplXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5jb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgXFxOb1xcLCBcXFdpdGhpblxcKSlcbmNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXE5vXFwsIFxcT3V0c2lkZVxcKSlcbmNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXE91dHNpZGVcXCwgXFxXaXRoaW5cXCkpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IHNpemUsIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0qIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCM3Nzc3NzdcXCwgXFwjRjI4RTJDXFwsIFxcI0YyOEUyQ1xcKSkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK2xhYnMoeSA9IFxcTG9vcCBzaXplXFwpXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25Cb3VuZGFyeV9zaXplX2NvbnZTU19QRVxcKVxud2lkdGggPC0zMyptbVRvSW5jaFxuaGVpZ2h0IDwtIDM1Km1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkZGlmZl9kVEFHX0RNU09cbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGRpZmZfZFRBR19ETVNPXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGlkLCBkaWZmX2RUQUdfRE1TTykgJT4lIGRpc3RpbmN0KClcblxuY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsIFxcTm9cXCwgXFxXaXRoaW5cXCkpXG5jb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgXFxOb1xcLCBcXE91dHNpZGVcXCkpXG5jb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgXFxPdXRzaWRlXFwsIFxcV2l0aGluXFwpKVxuXG5wIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlmZl9kVEFHX0RNU08sIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBhbHBoYSA9IC40LCAsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICB0aGVtZV9jbGFzc2ljKCkgKyAgIFxuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjNzc3Nzc3XFwsIFxcI0YyOEUyQ1xcLCBcXCNGMjhFMkNcXCkpICtcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKVxuICApICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLFxuICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLCAgICBcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApICtsYWJzKHkgPSBcXM6UIGxvb3Agc2NvcmVcXCkgKyAgICBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCxcbiAgICAgICAgICAgICBhbHBoYSA9IDEsXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICsgXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0wLjIsXG4gICAgICAgICAgICAgYWxwaGEgPSAwLjUsIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjgsIDAuNSkpXG4gICAgXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxpbnN1bGF0aW9uQm91bmRhcnlfZGVsdGFfY29udlNTX3BlXFwpXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpICBcblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFxuXG5taW5WYWx1ZSA8LSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTyxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPKVxuXG5kYXRhMiA8LSBkYXRhICU+JSBsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoXFxpZFxcKSlcblxudGVtcCA8LSBkYXRhMiAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgaWQsIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08pICU+JSBkaXN0aW5jdCgpXG5cblxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5jb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgXFxOb1xcLCBcXFdpdGhpblxcKSlcbmNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXE5vXFwsIFxcT3V0c2lkZVxcKSlcbmNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXE91dHNpZGVcXCwgXFxXaXRoaW5cXCkpXG5cblxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0qIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcIzc3Nzc3N1xcLCBcXCNGMjhFMkNcXCwgXFwjRjI4RTJDXFwpKSArXG4gIFxuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK2xhYnMoeSA9IFxcbG9nMihmYyBvZiBvYnMvZXhwKVxcKSArICAgIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgKyBcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0yLCAyKSlcbiAgICB3aWR0aCA8LTMwKm1tVG9JbmNoXG5oZWlnaHQgPC0gMzUqbW1Ub0luY2hcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGluc3VsYXRpb25Cb3VuZGFyeV9vYnNleHBfY29udlNTX3BlXFwpXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpICBcblxuXG5cblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuZGF0YSA8LSBkYXRhLmFsbFxuZ2VuZS53aXRoaW5Cb3VuZGFyeSA8LSB1bmlxdWUoKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxXaXRoaW5cXCkpJGdlbmUpXG5nZW5lLm91dHNpZGVCb3VuZGFyeSA8LSB1bmlxdWUoKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxPdXRzaWRlXFwpKSRnZW5lKVxuZ2VuZS5ub0JvdW5kYXJ5IDwtIHVuaXF1ZSgoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXE5vXFwpKSRnZW5lKVxuXG5nZW5lLndCb3VuZGFyeSA8LSB1bmlxdWUoYyhnZW5lLndpdGhpbkJvdW5kYXJ5LCBnZW5lLm91dHNpZGVCb3VuZGFyeSkpXG5cbmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5nZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5wcmludChcXHBlcmMgb2YgZ2VuZSB3aXRoIGxvb3Agd2l0aGluIEJvdW5kYXJ5XFwpXG5zdW0oZ2VuZS5ncm91cDEgJWluJSBnZW5lLndpdGhpbkJvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDEpKjEwMFxuc3VtKGdlbmUuZ3JvdXAyICVpbiUgZ2VuZS53aXRoaW5Cb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDBcblxucHJpbnQoXFxwZXJjIG9mIGdlbmUgd2l0aCBsb29wIG91dHNpZGUgQm91bmRhcnlcXClcbnN1bShnZW5lLmdyb3VwMSAlaW4lIGdlbmUub3V0c2lkZUJvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDEpKjEwMFxuc3VtKGdlbmUuZ3JvdXAyICVpbiUgZ2VuZS5vdXRzaWRlQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMikqMTAwXG5cbnByaW50KFxccGVyYyBvZiBnZW5lIHdpdGggbG9vcCB3aXRoIG5vIEJvdW5kYXJ5XFwpXG5zdW0oZ2VuZS5ncm91cDEgJWluJSBnZW5lLm5vQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwXG5zdW0oZ2VuZS5ncm91cDIgJWluJSBnZW5lLm5vQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMikqMTAwXG5cblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihcbiAgICBlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lLndCb3VuZGFyeSB+IFxcd2l0aGluQm91bmRhcnlcXCxcbiAgICBlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lLm5vQm91bmRhcnkgfiBcXG5vQm91bmRhcnlcXCxcbiAgICBUUlVFIH4gTkFcbiAgKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoYWJzTG9nMkZDID0gYWJzKGxvZzJGb2xkQ2hhbmdlKSlcbmtzX3Jlc3VsdCA8LSBrcy50ZXN0KFxuICBkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXHdpdGhpbkJvdW5kYXJ5XFwpICU+JSBwdWxsKGFic0xvZzJGQyksXG4gIGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcbm9Cb3VuZGFyeVxcKSAlPiUgcHVsbChhYnNMb2cyRkMpXG4pXG5cbmdncGxvdChkaWZmLlJOQSwgYWVzKHggPSBncm91cCwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xKVxuXG4jIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuIyAgIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRhYnNMb2cyRkNcbiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkYWJzTG9nMkZDXG4jICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuIyAgIHJldHVybih3aWwkcC52YWx1ZSlcbiMgfVxuIyBjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGlmZi5STkEsIFxcd2l0aEJvdW5kYXJ5XFwsIFxcbm9Cb3VuZGFyeVxcKSlcbiMgXG5cbiMgQ3JlYXRlIHRoZSBDREYgcGxvdFxucCA8LSBnZ3Bsb3QoZGlmZi5STkEsIGFlcyh4ID0gYWJzTG9nMkZDLCBjb2xvciA9IGdyb3VwKSkgK1xuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gKGMoXFwjNzc3Nzc3XFwsIFxcI0YyOEUyQ1xcKSkpICtcblxuc3RhdF9lY2RmKHNpemUgPSAwLjQsIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcICApICsgIyBVc2Ugc3RhdF9lY2RmIHRvIHBsb3QgdGhlIGVtcGlyaWNhbCBDREZcbiAgbGFicyhcbiAgICB4ID0gXFxBYnMuIGxvZzIoZm9sZCBjaGFuZ2UpXFwsXG4gICAgeSA9IFxcQ3VtdWxhdGl2ZSBQcm9iYWJpbGl0eVxcXG4gICkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMSkpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgIyBDbGVhbiB0aGVtZVxuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwsXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19jZGZfaW5zdWxhdGlvbkJvdW5kYXJ5X2NvbnZTU19wZVxcKVxud2lkdGggPC0gMzMqbW1Ub0luY2hcbmhlaWdodCA8LTMzKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
data <- data.all %>% dplyr::filter(Anno2 %in% c(\P-E\))

temp <- data %>% dplyr::select(chrom1, start1, end1, chrom2, start2, end2, group) %>% distinct()

temp1 <- temp %>% dplyr::filter(group == \No\) %>% dplyr::select(-group)
fwrite(temp1, here(consensusDir, \insulated_domain_ss_no.bedpe\), sep = \\t\, col.names = FALSE)
temp2 <- temp %>% dplyr::filter(group == \Within\) %>% dplyr::select(-group)
fwrite(temp2, here(consensusDir, \insulated_domain_ss_within.bedpe\), sep = \\t\, col.names = FALSE)
temp3 <- temp %>% dplyr::filter(group == \Outside\) %>% dplyr::select(-group)
fwrite(temp3, here(consensusDir, \insulated_domain_ss_outside.bedpe\), sep = \\t\, col.names = FALSE)

temp <- data %>% dplyr::select(id, group, size) %>% distinct()


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$size
  distance2 <- (data %>% dplyr::filter(group ==group2) )$size
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

convPvalue(getPvalWilcox(temp, \No\, \Within\))
convPvalue(getPvalWilcox(temp, \No\, \Outside\))
convPvalue(getPvalWilcox(temp, \Outside\, \Within\))


p <- ggplot(temp, aes(x = group, y = size, fill = group)) + 
  geom_violin(linewidth = lineMedium* mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
                 linewidth = lineMedium * mmToLineUnit, lineend = \square\,
                 outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + scale_y_continuous(labels = label_kb_mb) +
  scale_fill_manual(values = c(\#777777\, \#F28E2C\, \#F28E2C\)) +
  stat_summary(
      aes(group = group), fun = mean,
      geom = \point\, shape = 21, size = 0.5,
      fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \Loop size\)

fileName <- paste0(\insulationBoundary_size_convSS_PE\)
width <-33*mmToInch
height <- 35*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(group ==group2) )$diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

temp <- data %>% dplyr::select(group, id, diff_dTAG_DMSO) %>% distinct()

convPvalue(getPvalWilcox(temp, \No\, \Within\))
convPvalue(getPvalWilcox(temp, \No\, \Outside\))
convPvalue(getPvalWilcox(temp, \Outside\, \Within\))

p <- ggplot(data, aes(x = group, y = diff_dTAG_DMSO, fill = group)) + 
  geom_violin(linewidth = lineMedium * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() +   
    scale_fill_manual(values = c(\#777777\, \#F28E2C\, \#F28E2C\)) +
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \Δ loop score\) +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  geom_hline(yintercept = -0.2,
             alpha = 0.5, 
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\, linetype = \dashed\) +
  coord_cartesian(ylim = c(-0.8, 0.5))
    
fileName <- paste0(\insulationBoundary_delta_convSS_pe\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()  


###################### 

minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

data2 <- data %>% left_join(obsexp, by = c(\id\))

temp <- data2 %>% dplyr::select(group, id, log_obsexp_diff_dTAG_DMSO) %>% distinct()


getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$log_obsexp_diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(group ==group2) )$log_obsexp_diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

convPvalue(getPvalWilcox(temp, \No\, \Within\))
convPvalue(getPvalWilcox(temp, \No\, \Outside\))
convPvalue(getPvalWilcox(temp, \Outside\, \Within\))


p <- ggplot(temp, aes(x = group, y = log_obsexp_diff_dTAG_DMSO, fill = group)) + 
  geom_violin(linewidth = lineMedium* mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  scale_fill_manual(values = c(\#777777\, \#F28E2C\, \#F28E2C\)) +
  
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \log2(fc of obs/exp)\) +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  coord_cartesian(ylim = c(-2, 2))
    width <-30*mmToInch
height <- 35*mmToInch
fileName <- paste0(\insulationBoundary_obsexp_convSS_pe\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()  





#####################

data <- data.all
gene.withinBoundary <- unique((data %>% dplyr::filter(group == \Within\))$gene)
gene.outsideBoundary <- unique((data %>% dplyr::filter(group == \Outside\))$gene)
gene.noBoundary <- unique((data %>% dplyr::filter(group == \No\))$gene)

gene.wBoundary <- unique(c(gene.withinBoundary, gene.outsideBoundary))

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

print(\perc of gene with loop within Boundary\)
sum(gene.group1 %in% gene.withinBoundary)/length(gene.group1)*100
sum(gene.group2 %in% gene.withinBoundary)/length(gene.group2)*100

print(\perc of gene with loop outside Boundary\)
sum(gene.group1 %in% gene.outsideBoundary)/length(gene.group1)*100
sum(gene.group2 %in% gene.outsideBoundary)/length(gene.group2)*100

print(\perc of gene with loop with no Boundary\)
sum(gene.group1 %in% gene.noBoundary)/length(gene.group1)*100
sum(gene.group2 %in% gene.noBoundary)/length(gene.group2)*100


diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name) %>%
  dplyr::mutate(group = case_when(
    ensembl_gene_id %in% gene.wBoundary ~ \withinBoundary\,
    ensembl_gene_id %in% gene.noBoundary ~ \noBoundary\,
    TRUE ~ NA
  )) %>%
  dplyr::filter(!is.na(group)) %>%
  dplyr::mutate(absLog2FC = abs(log2FoldChange))
ks_result <- ks.test(
  diff.RNA %>% dplyr::filter(group == \withinBoundary\) %>% pull(absLog2FC),
  diff.RNA %>% dplyr::filter(group == \noBoundary\) %>% pull(absLog2FC)
)

ggplot(diff.RNA, aes(x = group, y = log2FoldChange)) + geom_violin() + geom_boxplot(width = 0.1)

# getPvalWilcox <- function(data, group1, group2){
#   distance1 <- (data %>% dplyr::filter(group ==group1) )$absLog2FC
#   distance2 <- (data %>% dplyr::filter(group ==group2) )$absLog2FC
#   wil <- wilcox.test(distance1, distance2)
#   return(wil$p.value)
# }
# convPvalue(getPvalWilcox(diff.RNA, \withBoundary\, \noBoundary\))
# 

# Create the CDF plot
p <- ggplot(diff.RNA, aes(x = absLog2FC, color = group)) +
  scale_color_manual(values = (c(\#777777\, \#F28E2C\))) +

stat_ecdf(size = 0.4, linewidth = lineMedium * mmToLineUnit, lineend = \square\  ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Abs. log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.position = \none\,
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )

fileName <- paste0(\log2FC_cdf_insulationBoundary_convSS_pe\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Processing

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR1Z0Y0NBOExTQmhiR3hNYjI5d2MwRnVibTkwWVhSbFpDQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaEJibTV2TWlBbGFXNGxJR01vWENKUUxVVmNJaWtwSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0doaGMxTlRJRDBnSVdsekxtNWhLR3h2YjNCSlJESXBLVnh1WjJWMFVIWmhiRmRwYkdOdmVDQThMU0JtZFc1amRHbHZiaWhrWVhSaExDQm5jbTkxY0RFc0lHZHliM1Z3TWlsN1hHNGdJR1JwYzNSaGJtTmxNU0E4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhvWVhOVFV5QTlQV2R5YjNWd01Ta2dLU1JrYVdabVgyUlVRVWRmUkUxVFQxeHVJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYUdGelUxTWdQVDFuY205MWNESXBJQ2trWkdsbVpsOWtWRUZIWDBSTlUwOWNiaUFnZDJsc0lEd3RJSGRwYkdOdmVDNTBaWE4wS0dScGMzUmhibU5sTVN3Z1pHbHpkR0Z1WTJVeUtWeHVJQ0J5WlhSMWNtNG9kMmxzSkhBdWRtRnNkV1VwWEc1OVhHNXdkaUE4TFNCamIyNTJVSFpoYkhWbEtHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dWRkpWUlN3Z1JrRk1VMFVwS1Z4dVoyZHdiRzkwS0hSbGJYQXNJR0ZsY3loNElEMGdhR0Z6VTFNc0lIa2dQU0JrYVdabVgyUlVRVWRmUkUxVFR5a3BJQ3NnWjJWdmJWOTJhVzlzYVc0b1lXVnpLR1pwYkd3Z1BTQm9ZWE5UVXlrc0lITm9iM2N1YkdWblpXNWtJRDBnUmtGTVUwVXBJQ3NnWEc0Z0lHZGxiMjFmWW05NGNHeHZkQ2gzYVdSMGFDQTlJREF1TVN3Z2IzVjBiR2xsY2k1emFHRndaU0E5SUU1QktTQXJYRzRnSUhOMFlYUmZjM1Z0YldGeWVTaGhaWE1vWjNKdmRYQWdQU0JvWVhOVFV5a3NJR1oxYmlBOUlHMWxZVzRzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjJWdmJTQTlJRndpY0c5cGJuUmNJaXdnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURJc0lHWnBiR3dnUFNCY0luSmxaRndpTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWlrZ0sxeHVJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLMXh1SUNCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQXdMQ0JzWVdKbGJDQTlJSEIyTENCemFYcGxJRDBnTlN3Z1kyOXNiM0lnUFNCY0ltSnNZV05yWENJcElDdGNiaUFnWjJkMGFYUnNaU2hjSWxCRlhDSXBJQ3NnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ2xjYmx4dVhHNWNibHh1SXlCRGIzVnVkR2x1WnlCc2IyOXdJSFI1Y0dWelhHNWhiR3hNYjI5d2MwRnVibTkwWVhSbFpFWnBiSFJsY21Wa0lEd3RJR0ZzYkV4dmIzQnpRVzV1YjNSaGRHVmtJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLQ0ZwY3k1dVlTaHNiMjl3U1VReUtTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvSVNoc2IyOXdTVVFnUFQwZ2JHOXZjRWxFTWlrcFhHNTBaVzF3SUR3dElHRnNiRXh2YjNCelFXNXViM1JoZEdWa1JtbHNkR1Z5WldRZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb2JHOXZjRWxFTWl3Z1FXNXVieklwWEc1eVpYTjFiSFFnUEMwZ2RHVnRjQ0FsUGlWY2JpQWdaM0p2ZFhCZllua29iRzl2Y0VsRU1pd2dRVzV1YnpJcElDVStKVnh1SUNCemRXMXRZWEpwYzJVb1kyOTFiblFnUFNCdUtDa3NJQzVuY205MWNITWdQU0FuWkhKdmNDY3BJQ1UrSlZ4dUlDQm5jbTkxY0Y5aWVTaHNiMjl3U1VReUtTQWxQaVZjYmlBZ2JYVjBZWFJsS0daeVpYRjFaVzVqZVNBOUlHTnZkVzUwSUM4Z2MzVnRLR052ZFc1MEtTa2dKVDRsWEc0Z0lHRnljbUZ1WjJVb2JHOXZjRWxFTWl3Z1FXNXVieklwWEc1Y2JuSmxjM1ZzZENBOExTQnNZWEpuWlhOMFgyeHZiM0J6SUNVK0pTQmtjR3g1Y2pvNmJHVm1kRjlxYjJsdUtISmxjM1ZzZEN3Z1lua2dQU0JqS0Z3aWJHOXZjRWxFWENJZ1BTQmNJbXh2YjNCSlJESmNJaWtwWEc1Y2JtZGxibVV1WjNKdmRYQXhJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjlpYVc1aGNubEhjbTkxY0RFdWRITjJYQ0lwS1NSblpXNWxYRzVuWlc1bExtZHliM1Z3TWlBOExTQm1jbVZoWkNob1pYSmxLSEpsWmtScGNpd2dYQ0puWlc1bFRHbHpkRjlrVkVGSFgzWnpYMFJOVTA5ZlVrNUJYMnh2YjNCZlltbHVZWEo1UjNKdmRYQXlMblJ6ZGx3aUtTa2taMlZ1WlZ4dVhHNWtZWFJoSUR3dElIUnBZbUpzWlNoY2JpQWdaMlZ1WlNBOUlHTW9aMlZ1WlM1bmNtOTFjREVzSUdkbGJtVXVaM0p2ZFhBeUtTeGNiaUFnWjNKdmRYQWdQU0JqS0hKbGNDaGNJbWR5YjNWd01Wd2lMQ0JzWlc1bmRHZ29aMlZ1WlM1bmNtOTFjREVwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsY0NoY0ltZHliM1Z3TWx3aUxDQnNaVzVuZEdnb1oyVnVaUzVuY205MWNESXBLU2xjYmlsY2JseHVaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmJHVm1kRjlxYjJsdUtISmxjM1ZzZEN3Z1lua2dQU0JqS0Z3aVoyVnVaVndpS1NsY2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1ptbHNkR1Z5S0dOdmJYQnNaWFJsTG1OaGMyVnpLQzRwS1Z4dVhHNWhiR3hmWVc1dWJ6SWdQQzBnZFc1cGNYVmxLR1JoZEdFa1FXNXVieklwWEc1Y2JpTWdRMkZzWTNWc1lYUmxJR0YyWlhKaFoyVWdabkpsY1hWbGJtTjVJRzltSUVGdWJtOHlJR1p2Y2lCbFlXTm9JR2RsYm1VZ2FXNGdaV0ZqYUNCbmNtOTFjRnh1Y21WemRXeDBJRHd0SUdSaGRHRWdKVDRsWEc0Z0lDTWdSVzV6ZFhKbElHRnNiQ0J3YjNOemFXSnNaU0JCYm01dk1pQjJZV3gxWlhNZ1lYSmxJSEJ5WlhObGJuUWdabTl5SUdWaFkyZ2daMlZ1WlNCaGJtUWdaM0p2ZFhCY2JpQWdZMjl0Y0d4bGRHVW9aMlZ1WlN3Z1FXNXVieklnUFNCaGJHeGZZVzV1YnpJc0lHWnBiR3dnUFNCc2FYTjBLR1p5WlhGMVpXNWplU0E5SURBcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JqWVhObFgzZG9aVzRvWEc0Z0lDQWdaMlZ1WlNBbGFXNGxJR2RsYm1VdVozSnZkWEF4SUg0Z1hDSm5jbTkxY0RGY0lpeGNiaUFnSUNCblpXNWxJQ1ZwYmlVZ1oyVnVaUzVuY205MWNESWdmaUJjSW1keWIzVndNbHdpTEZ4dUlDQWdJRlJTVlVVZ2ZpQk9RVnh1SUNBcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2huY205MWNDd2dRVzV1YnpJc0lHWnlaWEYxWlc1amVTbGNiaUFnWEc1Y2JtZG5jR3h2ZENoeVpYTjFiSFFzSUdGbGN5aDRJRDBnUVc1dWJ6SXNJR1pwYkd3Z1BTQm5jbTkxY0N3Z2VTQTlJR1p5WlhGMVpXNWplU2twSUNzZ1oyVnZiVjlpYjNod2JHOTBLQ2xjYmx4dVhHNWNiaU1nVm1sbGR5QnlaWE4xYkhSelhHNW5aM0JzYjNRb2JHRnlaMlZ6ZEY5c2IyOXdjeXdnWVdWektIZ2dQU0JzYjI5d1gzZHBaSFJvS1NrZ0t5Qm5aVzl0WDJocGMzUnZaM0poYlNncFhHNWNibHh1SXlNaklFTm9aV05yYVc1bklHaHZkeUJ0WVc1NUlHZGxibVZ6SUdaeWIyMGdaV0ZqYUNCbmNtOTFjQ0JvWVhNZ1pXNWpiMjF3WVhOemFXNW5JRk10VTF4dVoyVnVaUzVuY205MWNERWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMkpwYm1GeWVVZHliM1Z3TVM1MGMzWmNJaWtwSkdkbGJtVmNibWRsYm1VdVozSnZkWEF5SUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbWRsYm1WTWFYTjBYMlJVUVVkZmRuTmZSRTFUVDE5U1RrRmZiRzl2Y0Y5aWFXNWhjbmxIY205MWNESXVkSE4yWENJcEtTUm5aVzVsWEc1Y2JtUmhkR0VnUEMwZ2RHbGlZbXhsS0Z4dUlDQm5aVzVsSUQwZ1l5aG5aVzVsTG1keWIzVndNU3dnWjJWdVpTNW5jbTkxY0RJcExGeHVJQ0JuY205MWNDQTlJR01vY21Wd0tGd2laM0p2ZFhBeFhDSXNJR3hsYm1kMGFDaG5aVzVsTG1keWIzVndNU2twTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdjbVZ3S0Z3aVozSnZkWEF5WENJc0lHeGxibWQwYUNoblpXNWxMbWR5YjNWd01pa3BLVnh1S1Z4dVhHNWtZWFJoSUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwc1pXWjBYMnB2YVc0b2JHRnlaMlZ6ZEY5c2IyOXdjeXdnWW5rZ1BTQmpLRndpWjJWdVpWd2lLU2xjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbTExZEdGMFpTaGNiaUFnYUdGelUxTWdQU0JwWm1Wc2MyVW9hWE11Ym1Fb2JHOXZjRjkzYVdSMGFDa3NJRndpVGs5Y0lpd2dYQ0paUlZOY0lpbGNiaWxjYmx4dVpHRjBZVjl6ZFcxdFlYSjVJRHd0SUdSaGRHRWdKVDRsWEc0Z0lHZHliM1Z3WDJKNUtHZHliM1Z3S1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0Z4dUlDQWdJSFJ2ZEdGc0lEMGdiaWdwTEZ4dUlDQWdJR2hoYzFOVFgzbGxjeUE5SUhOMWJTaG9ZWE5UVXlBOVBTQmNJbGxGVTF3aUtTeGNiaUFnSUNCd1pYSmpaVzUwWVdkbFgzbGxjeUE5SUNob1lYTlRVMTk1WlhNZ0x5QjBiM1JoYkNrZ0tpQXhNREJjYmlBZ0tWeHVYRzVuWjNCc2IzUW9aR0YwWVY5emRXMXRZWEo1TENCaFpYTW9lQ0E5SUdkeWIzVndMQ0I1SUQwZ2NHVnlZMlZ1ZEdGblpWOTVaWE1zSUdacGJHd2dQU0JuY205MWNDa3BJQ3RjYmlBZ1oyVnZiVjlpWVhJb2MzUmhkQ0E5SUZ3aWFXUmxiblJwZEhsY0lpd2dZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXBJQ3RjYmlBZ2JHRmljeWhjYmlBZ0lDQjBhWFJzWlNBOUlGd2lVR1Z5WTJWdWRHRm5aU0J2WmlCRllXTm9JRWR5YjNWd0lIZHBkR2dnYUdGelUxTWdQU0JaUlZOY0lpeGNiaUFnSUNCNElEMGdYQ0pIY205MWNGd2lMRnh1SUNBZ0lIa2dQU0JjSWxCbGNtTmxiblJoWjJVZ0tDVXBYQ0pjYmlBZ0tTQXJJSGxzYVcwb01Dd2dNVEF3S1NBclhHNGdJSFJvWlcxbFgyMXBibWx0WVd3b0tWeHVYRzUwWlcxd0lEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2FHRnpVMU1nUFQwZ1hDSlpSVk5jSWlsY2JtZGxkRkIyWVd4WGFXeGpiM2dnUEMwZ1puVnVZM1JwYjI0b1pHRjBZU3dnWjNKdmRYQXhMQ0JuY205MWNESXBlMXh1SUNCa2FYTjBZVzVqWlRFZ1BDMGdLR1JoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1ozSnZkWEFnUFQxbmNtOTFjREVwSUNra2JHOXZjRjkzYVdSMGFGeHVJQ0JrYVhOMFlXNWpaVElnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDFuY205MWNESXBJQ2trYkc5dmNGOTNhV1IwYUZ4dUlDQjNhV3dnUEMwZ2QybHNZMjk0TG5SbGMzUW9aR2x6ZEdGdVkyVXhMQ0JrYVhOMFlXNWpaVElwWEc0Z0lISmxkSFZ5YmloM2FXd2tjQzUyWVd4MVpTbGNibjFjYm5CMklEd3RJR052Ym5aUWRtRnNkV1VvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TENCY0ltZHliM1Z3TVZ3aUxDQmNJbWR5YjNWd01sd2lLU2xjYmx4dVoyZHdiRzkwS0hSbGJYQXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JzYjI5d1gzZHBaSFJvS1NrZ0t5Qm5aVzl0WDNacGIyeHBiaWdwSUNzZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzQxS1NBclhHNGdJR0Z1Ym05MFlYUmxLRndpZEdWNGRGd2lMQ0I0SUQwZ01Td2dlU0E5SURBc0lHeGhZbVZzSUQwZ2NIWXNJSE5wZW1VZ1BTQTFMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaWxjYmx4dVhHNGpJeU1nUTI5dGNHRnlhVzVuSUZKT1FTQndaWEowZFhKaVlYUnBiMjVjYmx4dVpHbG1aaTVTVGtFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRndpWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHTW9NU3dnTkN3Z05Ta3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0doaGMxTlRJRDBnYVdabGJITmxLR1Z1YzJWdFlteGZaMlZ1WlY5cFpDQWxhVzRsSUd4aGNtZGxjM1JmYkc5dmNITWtaMlZ1WlN3Z1hDSm9ZWE5UVTF3aUxDQmNJbTV2VTFOY0lpa3BYRzVjYmx4dVoyZHdiRzkwS0dScFptWXVVazVCTENCaFpYTW9lQ0E5SUdGaWN5aHNiMmN5Um05c1pFTm9ZVzVuWlNrc0lHTnZiRzl5SUQwZ2FHRnpVMU1wS1NBclhHNGdJSE4wWVhSZlpXTmtaaWh6YVhwbElEMGdNQzQwS1NBclhHNGdJR3hoWW5Nb1hHNGdJQ0FnZUNBOUlGd2lRV0p6YjJ4MWRHVWdiRzluTWlobWIyeGtJR05vWVc1blpTbGNJaXhjYmlBZ0lDQjVJRDBnWENKRGRXMTFiR0YwYVhabElGQnliMkpoWW1sc2FYUjVYQ0pjYmlBZ0tTQXJJR052YjNKa1gyTmhjblJsYzJsaGJpaDRiR2x0SUQwZ1l5Z3dMQ0F4TGpVcEtTQXJYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUNNZ1EyeGxZVzRnZEdobGJXVmNiaUFnZEdobGJXVW9YRzRnSUNBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjSW5SeVlXNXpjR0Z5Wlc1MFhDSXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ0FnS1Z4dVhHNWNibHh1SXlNaklFTm9aV05yYVc1bklFTm9TVkFnY0dWaGF5QmtaVzV6YVhSNVhHNXNZWEpuWlhOMFgyeHZiM0J6UjNJZ1BDMGdiV0ZyWlVkU1lXNW5aWE5HY205dFJHRjBZVVp5WVcxbEtHeGhjbWRsYzNSZmJHOXZjSE1zSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpYRnVZVzFsY3k1bWFXVnNaQ0E5SUZ3aWJHOXZjRjlqYUhKY0lpd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE4wWVhKMExtWnBaV3hrSUQwZ1hDSnNiMjl3WDNOMFlYSjBYQ0lzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJtUXVabWxsYkdRZ1BTQmNJbXh2YjNCZlpXNWtYQ0lzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCclpXVndMbVY0ZEhKaExtTnZiSFZ0Ym5NZ1BTQlVVbFZGS1Z4dVhHNGpJRVpwYm1RZ2IzWmxjbXhoY0hNZ1ltVjBkMlZsYmlCRGFFbFFMWE5sY1NCd1pXRnJjeUJoYm1RZ2RHaGxJR3hoY21kbGMzUWdiRzl2Y0hOY2JtTm9hWEJmYjNabGNteGhjSE1nUEMwZ1ptbHVaRTkyWlhKc1lYQnpLR3hoY21kbGMzUmZiRzl2Y0hOSGNpd2djR1ZoYXk1SU0wczBiV1V6S1Z4dVhHNGpJRU52ZFc1MElIUm9aU0J1ZFcxaVpYSWdiMllnUTJoSlVDMXpaWEVnY0dWaGEzTWdjR1Z5SUd4dmIzQmNibXh2YjNCZmNHVmhhMTlqYjNWdWRITWdQQzBnZEdGaWJHVW9jWFZsY25sSWFYUnpLR05vYVhCZmIzWmxjbXhoY0hNcEtWeHVYRzRqSUVOeVpXRjBaU0JoSUdSaGRHRWdabkpoYldVZ2QybDBhQ0IwYUdVZ1kyOTFiblJ6SUdGdVpDQnNiMjl3SUdSbGRHRnBiSE5jYm14aGNtZGxjM1JmYkc5dmNITWtaR1Z1YzJsMGVTQThMU0F3SUNBaklFbHVhWFJwWVd4cGVtVWdaR1Z1YzJsMGVTQmpiMngxYlc1Y2JteGhjbWRsYzNSZmJHOXZjSE1rWTI5MWJuUWdQQzBnTUNBZ0lDQWpJRWx1YVhScFlXeHBlbVVnY0dWaGF5QmpiM1Z1ZENCamIyeDFiVzVjYmx4dUl5QkJaR1FnY0dWaGF5QmpiM1Z1ZEhNZ2RHOGdkR2hsSUdOdmNuSmxjM0J2Ym1ScGJtY2diRzl2Y0hOY2JteGhjbWRsYzNSZmJHOXZjSE5iWVhNdWJuVnRaWEpwWXlodVlXMWxjeWhzYjI5d1gzQmxZV3RmWTI5MWJuUnpLU2tzSUZ3aVkyOTFiblJjSWwwZ1BDMGdZWE11YVc1MFpXZGxjaWhzYjI5d1gzQmxZV3RmWTI5MWJuUnpLVnh1WEc0aklFTmhiR04xYkdGMFpTQjBhR1VnWkdWdWMybDBlU0FvY0dWaGEzTWdjR1Z5SUd0cGJHOWlZWE5sS1Z4dWJHRnlaMlZ6ZEY5c2IyOXdjeVJrWlc1emFYUjVJRHd0SUd4aGNtZGxjM1JmYkc5dmNITWtZMjkxYm5RZ0x5QW9LR3hoY21kbGMzUmZiRzl2Y0hNa2JHOXZjRjkzYVdSMGFDMHhLU0F2SURFd01EQXBYRzVjYmx4dVpHRjBZU0E4TFNCMGFXSmliR1VvWEc0Z0lHZGxibVVnUFNCaktHZGxibVV1WjNKdmRYQXhMQ0JuWlc1bExtZHliM1Z3TWlrc1hHNGdJR2R5YjNWd0lEMGdZeWh5WlhBb1hDSm5jbTkxY0RGY0lpd2diR1Z1WjNSb0tHZGxibVV1WjNKdmRYQXhLU2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWEFvWENKbmNtOTFjREpjSWl3Z2JHVnVaM1JvS0dkbGJtVXVaM0p2ZFhBeUtTa3BYRzRwWEc1Y2JtUmhkR0VnUEMwZ1pHRjBZU0FsUGlVZ1pIQnNlWEk2T214bFpuUmZhbTlwYmloc1lYSm5aWE4wWDJ4dmIzQnpMQ0JpZVNBOUlHTW9YQ0puWlc1bFhDSXBLVnh1WkdGMFlTQThMU0JrWVhSaElDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0JvWVhOVFV5QTlJR2xtWld4elpTaHBjeTV1WVNoc2IyOXdYM2RwWkhSb0tTd2dYQ0pPVDF3aUxDQmNJbGxGVTF3aUtWeHVLU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhvWVhOVFV5QTlQU0JjSWxsRlUxd2lLVnh1WEc1blpYUlFkbUZzVjJsc1kyOTRJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXNJR2R5YjNWd01Td2daM0p2ZFhBeUtYdGNiaUFnWkdsemRHRnVZMlV4SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXhLU0FwSkdSbGJuTnBkSGxjYmlBZ1pHbHpkR0Z1WTJVeUlEd3RJQ2hrWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtHZHliM1Z3SUQwOVozSnZkWEF5S1NBcEpHUmxibk5wZEhsY2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1Y2JuQjJJRHd0SUdOdmJuWlFkbUZzZFdVb1oyVjBVSFpoYkZkcGJHTnZlQ2hrWVhSaExDQmNJbWR5YjNWd01Wd2lMQ0JjSW1keWIzVndNbHdpS1NsY2JseHVaMmR3Ykc5MEtHUmhkR0VzSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCa1pXNXphWFI1S1NrZ0t5Qm5aVzl0WDNacGIyeHBiaWhoWlhNb1ptbHNiQ0E5SUdkeWIzVndLU3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHhMQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0VwSUN0Y2JpQWdjM1JoZEY5emRXMXRZWEo1S0dGbGN5aG5jbTkxY0NBOUlHZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNaXdnWm1sc2JDQTlJRndpY21Wa1hDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lLU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBclhHNGdJR0Z1Ym05MFlYUmxLRndpZEdWNGRGd2lMQ0I0SUQwZ01Td2dlU0E5SURBc0lHeGhZbVZzSUQwZ2NIWXNJSE5wZW1VZ1BTQTFMQ0JqYjJ4dmNpQTlJRndpWW14aFkydGNJaWtnSzF4dUlDQm5aM1JwZEd4bEtGd2lTRE5MTkcxbE0xd2lLVnh1WEc1Y2JtQmdZQ0o5IC0tPlxuXG5gYGByXG50ZW1wIDwtIGFsbExvb3BzQW5ub3RhdGVkICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYyhcXFAtRVxcKSkgJT4lIGRwbHlyOjptdXRhdGUoaGFzU1MgPSAhaXMubmEobG9vcElEMikpXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGhhc1NTID09Z3JvdXAxKSApJGRpZmZfZFRBR19ETVNPXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PWdyb3VwMikgKSRkaWZmX2RUQUdfRE1TT1xuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cbnB2IDwtIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBUUlVFLCBGQUxTRSkpXG5nZ3Bsb3QodGVtcCwgYWVzKHggPSBoYXNTUywgeSA9IGRpZmZfZFRBR19ETVNPKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGhhc1NTKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGhhc1NTKSwgZnVuID0gbWVhbiwgXG4gICAgICAgICAgICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcHYsIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZ3RpdGxlKFxcUEVcXCkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKVxuXG5cblxuXG4jIENvdW50aW5nIGxvb3AgdHlwZXNcbmFsbExvb3BzQW5ub3RhdGVkRmlsdGVyZWQgPC0gYWxsTG9vcHNBbm5vdGF0ZWQgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGxvb3BJRDIpKSAlPiVcbiAgZHBseXI6OmZpbHRlcighKGxvb3BJRCA9PSBsb29wSUQyKSlcbnRlbXAgPC0gYWxsTG9vcHNBbm5vdGF0ZWRGaWx0ZXJlZCAlPiUgZHBseXI6OnNlbGVjdChsb29wSUQyLCBBbm5vMilcbnJlc3VsdCA8LSB0ZW1wICU+JVxuICBncm91cF9ieShsb29wSUQyLCBBbm5vMikgJT4lXG4gIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lXG4gIGdyb3VwX2J5KGxvb3BJRDIpICU+JVxuICBtdXRhdGUoZnJlcXVlbmN5ID0gY291bnQgLyBzdW0oY291bnQpKSAlPiVcbiAgYXJyYW5nZShsb29wSUQyLCBBbm5vMilcblxucmVzdWx0IDwtIGxhcmdlc3RfbG9vcHMgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ocmVzdWx0LCBieSA9IGMoXFxsb29wSURcXCA9IFxcbG9vcElEMlxcKSlcblxuZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cbmRhdGEgPC0gdGliYmxlKFxuICBnZW5lID0gYyhnZW5lLmdyb3VwMSwgZ2VuZS5ncm91cDIpLFxuICBncm91cCA9IGMocmVwKFxcZ3JvdXAxXFwsIGxlbmd0aChnZW5lLmdyb3VwMSkpLFxuICAgICAgICAgICAgcmVwKFxcZ3JvdXAyXFwsIGxlbmd0aChnZW5lLmdyb3VwMikpKVxuKVxuXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ocmVzdWx0LCBieSA9IGMoXFxnZW5lXFwpKVxuZGF0YSA8LSBkYXRhICU+JSBmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpXG5cbmFsbF9hbm5vMiA8LSB1bmlxdWUoZGF0YSRBbm5vMilcblxuIyBDYWxjdWxhdGUgYXZlcmFnZSBmcmVxdWVuY3kgb2YgQW5ubzIgZm9yIGVhY2ggZ2VuZSBpbiBlYWNoIGdyb3VwXG5yZXN1bHQgPC0gZGF0YSAlPiVcbiAgIyBFbnN1cmUgYWxsIHBvc3NpYmxlIEFubm8yIHZhbHVlcyBhcmUgcHJlc2VudCBmb3IgZWFjaCBnZW5lIGFuZCBncm91cFxuICBjb21wbGV0ZShnZW5lLCBBbm5vMiA9IGFsbF9hbm5vMiwgZmlsbCA9IGxpc3QoZnJlcXVlbmN5ID0gMCkpICU+JSBcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihcbiAgICBnZW5lICVpbiUgZ2VuZS5ncm91cDEgfiBcXGdyb3VwMVxcLFxuICAgIGdlbmUgJWluJSBnZW5lLmdyb3VwMiB+IFxcZ3JvdXAyXFwsXG4gICAgVFJVRSB+IE5BXG4gICkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGdyb3VwLCBBbm5vMiwgZnJlcXVlbmN5KVxuICBcblxuZ2dwbG90KHJlc3VsdCwgYWVzKHggPSBBbm5vMiwgZmlsbCA9IGdyb3VwLCB5ID0gZnJlcXVlbmN5KSkgKyBnZW9tX2JveHBsb3QoKVxuXG5cblxuIyBWaWV3IHJlc3VsdHNcbmdncGxvdChsYXJnZXN0X2xvb3BzLCBhZXMoeCA9IGxvb3Bfd2lkdGgpKSArIGdlb21faGlzdG9ncmFtKClcblxuXG4jIyMgQ2hlY2tpbmcgaG93IG1hbnkgZ2VuZXMgZnJvbSBlYWNoIGdyb3VwIGhhcyBlbmNvbXBhc3NpbmcgUy1TXG5nZW5lLmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ2VuZS5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuZGF0YSA8LSB0aWJibGUoXG4gIGdlbmUgPSBjKGdlbmUuZ3JvdXAxLCBnZW5lLmdyb3VwMiksXG4gIGdyb3VwID0gYyhyZXAoXFxncm91cDFcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAxKSksXG4gICAgICAgICAgICByZXAoXFxncm91cDJcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAyKSkpXG4pXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihsYXJnZXN0X2xvb3BzLCBieSA9IGMoXFxnZW5lXFwpKVxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKFxuICBoYXNTUyA9IGlmZWxzZShpcy5uYShsb29wX3dpZHRoKSwgXFxOT1xcLCBcXFlFU1xcKVxuKVxuXG5kYXRhX3N1bW1hcnkgPC0gZGF0YSAlPiVcbiAgZ3JvdXBfYnkoZ3JvdXApICU+JVxuICBzdW1tYXJpemUoXG4gICAgdG90YWwgPSBuKCksXG4gICAgaGFzU1NfeWVzID0gc3VtKGhhc1NTID09IFxcWUVTXFwpLFxuICAgIHBlcmNlbnRhZ2VfeWVzID0gKGhhc1NTX3llcyAvIHRvdGFsKSAqIDEwMFxuICApXG5cbmdncGxvdChkYXRhX3N1bW1hcnksIGFlcyh4ID0gZ3JvdXAsIHkgPSBwZXJjZW50YWdlX3llcywgZmlsbCA9IGdyb3VwKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBsYWJzKFxuICAgIHRpdGxlID0gXFxQZXJjZW50YWdlIG9mIEVhY2ggR3JvdXAgd2l0aCBoYXNTUyA9IFlFU1xcLFxuICAgIHggPSBcXEdyb3VwXFwsXG4gICAgeSA9IFxcUGVyY2VudGFnZSAoJSlcXFxuICApICsgeWxpbSgwLCAxMDApICtcbiAgdGhlbWVfbWluaW1hbCgpXG5cbnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PSBcXFlFU1xcKVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRsb29wX3dpZHRoXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRsb29wX3dpZHRoXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxucHYgPC0gY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpKVxuXG5nZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IGxvb3Bfd2lkdGgpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwdiwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKVxuXG5cbiMjIyBDb21wYXJpbmcgUk5BIHBlcnR1cmJhdGlvblxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoYygxLCA0LCA1KSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoaGFzU1MgPSBpZmVsc2UoZW5zZW1ibF9nZW5lX2lkICVpbiUgbGFyZ2VzdF9sb29wcyRnZW5lLCBcXGhhc1NTXFwsIFxcbm9TU1xcKSlcblxuXG5nZ3Bsb3QoZGlmZi5STkEsIGFlcyh4ID0gYWJzKGxvZzJGb2xkQ2hhbmdlKSwgY29sb3IgPSBoYXNTUykpICtcbiAgc3RhdF9lY2RmKHNpemUgPSAwLjQpICtcbiAgbGFicyhcbiAgICB4ID0gXFxBYnNvbHV0ZSBsb2cyKGZvbGQgY2hhbmdlKVxcLFxuICAgIHkgPSBcXEN1bXVsYXRpdmUgUHJvYmFiaWxpdHlcXFxuICApICsgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDEuNSkpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgIyBDbGVhbiB0aGVtZVxuICB0aGVtZShcbiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgICApXG5cblxuXG4jIyMgQ2hlY2tpbmcgQ2hJUCBwZWFrIGRlbnNpdHlcbmxhcmdlc3RfbG9vcHNHciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUobGFyZ2VzdF9sb29wcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcW5hbWVzLmZpZWxkID0gXFxsb29wX2NoclxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQuZmllbGQgPSBcXGxvb3Bfc3RhcnRcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5maWVsZCA9IFxcbG9vcF9lbmRcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpXG5cbiMgRmluZCBvdmVybGFwcyBiZXR3ZWVuIENoSVAtc2VxIHBlYWtzIGFuZCB0aGUgbGFyZ2VzdCBsb29wc1xuY2hpcF9vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMobGFyZ2VzdF9sb29wc0dyLCBwZWFrLkgzSzRtZTMpXG5cbiMgQ291bnQgdGhlIG51bWJlciBvZiBDaElQLXNlcSBwZWFrcyBwZXIgbG9vcFxubG9vcF9wZWFrX2NvdW50cyA8LSB0YWJsZShxdWVyeUhpdHMoY2hpcF9vdmVybGFwcykpXG5cbiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIHRoZSBjb3VudHMgYW5kIGxvb3AgZGV0YWlsc1xubGFyZ2VzdF9sb29wcyRkZW5zaXR5IDwtIDAgICMgSW5pdGlhbGl6ZSBkZW5zaXR5IGNvbHVtblxubGFyZ2VzdF9sb29wcyRjb3VudCA8LSAwICAgICMgSW5pdGlhbGl6ZSBwZWFrIGNvdW50IGNvbHVtblxuXG4jIEFkZCBwZWFrIGNvdW50cyB0byB0aGUgY29ycmVzcG9uZGluZyBsb29wc1xubGFyZ2VzdF9sb29wc1thcy5udW1lcmljKG5hbWVzKGxvb3BfcGVha19jb3VudHMpKSwgXFxjb3VudFxcXSA8LSBhcy5pbnRlZ2VyKGxvb3BfcGVha19jb3VudHMpXG5cbiMgQ2FsY3VsYXRlIHRoZSBkZW5zaXR5IChwZWFrcyBwZXIga2lsb2Jhc2UpXG5sYXJnZXN0X2xvb3BzJGRlbnNpdHkgPC0gbGFyZ2VzdF9sb29wcyRjb3VudCAvICgobGFyZ2VzdF9sb29wcyRsb29wX3dpZHRoLTEpIC8gMTAwMClcblxuXG5kYXRhIDwtIHRpYmJsZShcbiAgZ2VuZSA9IGMoZ2VuZS5ncm91cDEsIGdlbmUuZ3JvdXAyKSxcbiAgZ3JvdXAgPSBjKHJlcChcXGdyb3VwMVxcLCBsZW5ndGgoZ2VuZS5ncm91cDEpKSxcbiAgICAgICAgICAgIHJlcChcXGdyb3VwMlxcLCBsZW5ndGgoZ2VuZS5ncm91cDIpKSlcbilcblxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKGxhcmdlc3RfbG9vcHMsIGJ5ID0gYyhcXGdlbmVcXCkpXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoXG4gIGhhc1NTID0gaWZlbHNlKGlzLm5hKGxvb3Bfd2lkdGgpLCBcXE5PXFwsIFxcWUVTXFwpXG4pICU+JSBkcGx5cjo6ZmlsdGVyKGhhc1NTID09IFxcWUVTXFwpXG5cbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkZGVuc2l0eVxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkZGVuc2l0eVxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cblxucHYgPC0gY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsIFxcZ3JvdXAxXFwsIFxcZ3JvdXAyXFwpKVxuXG5nZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGRlbnNpdHkpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgK1xuICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBcbiAgICAgICAgICAgICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gXFxyZWRcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICtcbiAgYW5ub3RhdGUoXFx0ZXh0XFwsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwdiwgc2l6ZSA9IDUsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIGdndGl0bGUoXFxIM0s0bWUzXFwpXG5cblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
temp <- allLoopsAnnotated %>% dplyr::filter(Anno2 %in% c(\P-E\)) %>% dplyr::mutate(hasSS = !is.na(loopID2))
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(hasSS ==group1) )$diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(hasSS ==group2) )$diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}
pv <- convPvalue(getPvalWilcox(temp, TRUE, FALSE))
ggplot(temp, aes(x = hasSS, y = diff_dTAG_DMSO)) + geom_violin(aes(fill = hasSS), show.legend = FALSE) + 
  geom_boxplot(width = 0.1, outlier.shape = NA) +
  stat_summary(aes(group = hasSS), fun = mean, 
               geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  theme_classic() +
  annotate(\text\, x = 1, y = 0, label = pv, size = 5, color = \black\) +
  ggtitle(\PE\) + geom_hline(yintercept = 0)




# Counting loop types
allLoopsAnnotatedFiltered <- allLoopsAnnotated %>% dplyr::filter(!is.na(loopID2)) %>%
  dplyr::filter(!(loopID == loopID2))
temp <- allLoopsAnnotatedFiltered %>% dplyr::select(loopID2, Anno2)
result <- temp %>%
  group_by(loopID2, Anno2) %>%
  summarise(count = n(), .groups = 'drop') %>%
  group_by(loopID2) %>%
  mutate(frequency = count / sum(count)) %>%
  arrange(loopID2, Anno2)

result <- largest_loops %>% dplyr::left_join(result, by = c(\loopID\ = \loopID2\))

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

data <- tibble(
  gene = c(gene.group1, gene.group2),
  group = c(rep(\group1\, length(gene.group1)),
            rep(\group2\, length(gene.group2)))
)

data <- data %>% dplyr::left_join(result, by = c(\gene\))
data <- data %>% filter(complete.cases(.))

all_anno2 <- unique(data$Anno2)

# Calculate average frequency of Anno2 for each gene in each group
result <- data %>%
  # Ensure all possible Anno2 values are present for each gene and group
  complete(gene, Anno2 = all_anno2, fill = list(frequency = 0)) %>% 
  dplyr::mutate(group = case_when(
    gene %in% gene.group1 ~ \group1\,
    gene %in% gene.group2 ~ \group2\,
    TRUE ~ NA
  )) %>%
  dplyr::select(group, Anno2, frequency)
  

ggplot(result, aes(x = Anno2, fill = group, y = frequency)) + geom_boxplot()



# View results
ggplot(largest_loops, aes(x = loop_width)) + geom_histogram()


### Checking how many genes from each group has encompassing S-S
gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

data <- tibble(
  gene = c(gene.group1, gene.group2),
  group = c(rep(\group1\, length(gene.group1)),
            rep(\group2\, length(gene.group2)))
)

data <- data %>% dplyr::left_join(largest_loops, by = c(\gene\))
data <- data %>% dplyr::mutate(
  hasSS = ifelse(is.na(loop_width), \NO\, \YES\)
)

data_summary <- data %>%
  group_by(group) %>%
  summarize(
    total = n(),
    hasSS_yes = sum(hasSS == \YES\),
    percentage_yes = (hasSS_yes / total) * 100
  )

ggplot(data_summary, aes(x = group, y = percentage_yes, fill = group)) +
  geom_bar(stat = \identity\, color = \black\) +
  labs(
    title = \Percentage of Each Group with hasSS = YES\,
    x = \Group\,
    y = \Percentage (%)\
  ) + ylim(0, 100) +
  theme_minimal()

temp <- data %>% dplyr::filter(hasSS == \YES\)
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$loop_width
  distance2 <- (data %>% dplyr::filter(group ==group2) )$loop_width
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}
pv <- convPvalue(getPvalWilcox(temp, \group1\, \group2\))

ggplot(temp, aes(x = group, y = loop_width)) + geom_violin() + geom_boxplot(width = 0.5) +
  annotate(\text\, x = 1, y = 0, label = pv, size = 5, color = \black\)


### Comparing RNA perturbation

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(c(1, 4, 5)) %>%
  dplyr::mutate(hasSS = ifelse(ensembl_gene_id %in% largest_loops$gene, \hasSS\, \noSS\))


ggplot(diff.RNA, aes(x = abs(log2FoldChange), color = hasSS)) +
  stat_ecdf(size = 0.4) +
  labs(
    x = \Absolute log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )



### Checking ChIP peak density
largest_loopsGr <- makeGRangesFromDataFrame(largest_loops, 
                                            seqnames.field = \loop_chr\, 
                                            start.field = \loop_start\, 
                                            end.field = \loop_end\, 
                                            keep.extra.columns = TRUE)

# Find overlaps between ChIP-seq peaks and the largest loops
chip_overlaps <- findOverlaps(largest_loopsGr, peak.H3K4me3)

# Count the number of ChIP-seq peaks per loop
loop_peak_counts <- table(queryHits(chip_overlaps))

# Create a data frame with the counts and loop details
largest_loops$density <- 0  # Initialize density column
largest_loops$count <- 0    # Initialize peak count column

# Add peak counts to the corresponding loops
largest_loops[as.numeric(names(loop_peak_counts)), \count\] <- as.integer(loop_peak_counts)

# Calculate the density (peaks per kilobase)
largest_loops$density <- largest_loops$count / ((largest_loops$loop_width-1) / 1000)


data <- tibble(
  gene = c(gene.group1, gene.group2),
  group = c(rep(\group1\, length(gene.group1)),
            rep(\group2\, length(gene.group2)))
)

data <- data %>% dplyr::left_join(largest_loops, by = c(\gene\))
data <- data %>% dplyr::mutate(
  hasSS = ifelse(is.na(loop_width), \NO\, \YES\)
) %>% dplyr::filter(hasSS == \YES\)

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$density
  distance2 <- (data %>% dplyr::filter(group ==group2) )$density
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

pv <- convPvalue(getPvalWilcox(data, \group1\, \group2\))

ggplot(data, aes(x = group, y = density)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
  geom_boxplot(width = 0.1, outlier.shape = NA) +
  stat_summary(aes(group = group), fun = mean, 
               geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  theme_classic() +
  annotate(\text\, x = 1, y = 0, label = pv, size = 5, color = \black\) +
  ggtitle(\H3K4me3\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRHVnRjQ0E4TFNCaGJHeE1iMjl3YzBGdWJtOTBZWFJsWkNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2loQmJtNXZNaUFsYVc0bElHTW9YRnhRTFVWY1hDa3BJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR2hoYzFOVElEMGdJV2x6TG01aEtHeHZiM0JKUkRJcEtWeHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG9ZWE5UVXlBOVBXZHliM1Z3TVNrZ0tTUmthV1ptWDJSVVFVZGZSRTFUVDF4dUlDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9hR0Z6VTFNZ1BUMW5jbTkxY0RJcElDa2taR2xtWmw5a1ZFRkhYMFJOVTA5Y2JpQWdkMmxzSUR3dElIZHBiR052ZUM1MFpYTjBLR1JwYzNSaGJtTmxNU3dnWkdsemRHRnVZMlV5S1Z4dUlDQnlaWFIxY200b2QybHNKSEF1ZG1Gc2RXVXBYRzU5WEc1d2RpQThMU0JqYjI1MlVIWmhiSFZsS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1ZGSlZSU3dnUmtGTVUwVXBLVnh1WjJkd2JHOTBLSFJsYlhBc0lHRmxjeWg0SUQwZ2FHRnpVMU1zSUhrZ1BTQmthV1ptWDJSVVFVZGZSRTFUVHlrcElDc2daMlZ2YlY5MmFXOXNhVzRvWVdWektHWnBiR3dnUFNCb1lYTlRVeWtzSUhOb2IzY3ViR1ZuWlc1a0lEMGdSa0ZNVTBVcElDc2dYRzRnSUdkbGIyMWZZbTk0Y0d4dmRDaDNhV1IwYUNBOUlEQXVNU3dnYjNWMGJHbGxjaTV6YUdGd1pTQTlJRTVCS1NBclhHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoaFpYTW9aM0p2ZFhBZ1BTQm9ZWE5UVXlrc0lHWjFiaUE5SUcxbFlXNHNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaMlZ2YlNBOUlGeGNjRzlwYm5SY1hDd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJRElzSUdacGJHd2dQU0JjWEhKbFpGeGNMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ2tnSzF4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0sxeHVJQ0JoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBd0xDQnNZV0psYkNBOUlIQjJMQ0J6YVhwbElEMGdOU3dnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndwSUN0Y2JpQWdaMmQwYVhSc1pTaGNYRkJGWEZ3cElDc2daMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01DbGNibHh1WEc1Y2JseHVJeUJEYjNWdWRHbHVaeUJzYjI5d0lIUjVjR1Z6WEc1aGJHeE1iMjl3YzBGdWJtOTBZWFJsWkVacGJIUmxjbVZrSUR3dElHRnNiRXh2YjNCelFXNXViM1JoZEdWa0lDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtDRnBjeTV1WVNoc2IyOXdTVVF5S1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9JU2hzYjI5d1NVUWdQVDBnYkc5dmNFbEVNaWtwWEc1MFpXMXdJRHd0SUdGc2JFeHZiM0J6UVc1dWIzUmhkR1ZrUm1sc2RHVnlaV1FnSlQ0bElHUndiSGx5T2pwelpXeGxZM1FvYkc5dmNFbEVNaXdnUVc1dWJ6SXBYRzV5WlhOMWJIUWdQQzBnZEdWdGNDQWxQaVZjYmlBZ1ozSnZkWEJmWW5rb2JHOXZjRWxFTWl3Z1FXNXVieklwSUNVK0pWeHVJQ0J6ZFcxdFlYSnBjMlVvWTI5MWJuUWdQU0J1S0Nrc0lDNW5jbTkxY0hNZ1BTQW5aSEp2Y0NjcElDVStKVnh1SUNCbmNtOTFjRjlpZVNoc2IyOXdTVVF5S1NBbFBpVmNiaUFnYlhWMFlYUmxLR1p5WlhGMVpXNWplU0E5SUdOdmRXNTBJQzhnYzNWdEtHTnZkVzUwS1NrZ0pUNGxYRzRnSUdGeWNtRnVaMlVvYkc5dmNFbEVNaXdnUVc1dWJ6SXBYRzVjYm5KbGMzVnNkQ0E4TFNCc1lYSm5aWE4wWDJ4dmIzQnpJQ1UrSlNCa2NHeDVjam82YkdWbWRGOXFiMmx1S0hKbGMzVnNkQ3dnWW5rZ1BTQmpLRnhjYkc5dmNFbEVYRndnUFNCY1hHeHZiM0JKUkRKY1hDa3BYRzVjYm1kbGJtVXVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdkbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhGd3BLU1JuWlc1bFhHNW5aVzVsTG1keWIzVndNaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hGeG5aVzVsVEdsemRGOWtWRUZIWDNaelgwUk5VMDlmVWs1QlgyeHZiM0JmWW1sdVlYSjVSM0p2ZFhBeUxuUnpkbHhjS1Nra1oyVnVaVnh1WEc1a1lYUmhJRHd0SUhScFltSnNaU2hjYmlBZ1oyVnVaU0E5SUdNb1oyVnVaUzVuY205MWNERXNJR2RsYm1VdVozSnZkWEF5S1N4Y2JpQWdaM0p2ZFhBZ1BTQmpLSEpsY0NoY1hHZHliM1Z3TVZ4Y0xDQnNaVzVuZEdnb1oyVnVaUzVuY205MWNERXBLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjQ2hjWEdkeWIzVndNbHhjTENCc1pXNW5kR2dvWjJWdVpTNW5jbTkxY0RJcEtTbGNiaWxjYmx4dVpHRjBZU0E4TFNCa1lYUmhJQ1UrSlNCa2NHeDVjam82YkdWbWRGOXFiMmx1S0hKbGMzVnNkQ3dnWW5rZ1BTQmpLRnhjWjJWdVpWeGNLU2xjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVVnWm1sc2RHVnlLR052YlhCc1pYUmxMbU5oYzJWektDNHBLVnh1WEc1aGJHeGZZVzV1YnpJZ1BDMGdkVzVwY1hWbEtHUmhkR0VrUVc1dWJ6SXBYRzVjYmlNZ1EyRnNZM1ZzWVhSbElHRjJaWEpoWjJVZ1puSmxjWFZsYm1ONUlHOW1JRUZ1Ym04eUlHWnZjaUJsWVdOb0lHZGxibVVnYVc0Z1pXRmphQ0JuY205MWNGeHVjbVZ6ZFd4MElEd3RJR1JoZEdFZ0pUNGxYRzRnSUNNZ1JXNXpkWEpsSUdGc2JDQndiM056YVdKc1pTQkJibTV2TWlCMllXeDFaWE1nWVhKbElIQnlaWE5sYm5RZ1ptOXlJR1ZoWTJnZ1oyVnVaU0JoYm1RZ1ozSnZkWEJjYmlBZ1kyOXRjR3hsZEdVb1oyVnVaU3dnUVc1dWJ6SWdQU0JoYkd4ZllXNXVieklzSUdacGJHd2dQU0JzYVhOMEtHWnlaWEYxWlc1amVTQTlJREFwS1NBbFBpVWdYRzRnSUdSd2JIbHlPanB0ZFhSaGRHVW9aM0p2ZFhBZ1BTQmpZWE5sWDNkb1pXNG9YRzRnSUNBZ1oyVnVaU0FsYVc0bElHZGxibVV1WjNKdmRYQXhJSDRnWEZ4bmNtOTFjREZjWEN4Y2JpQWdJQ0JuWlc1bElDVnBiaVVnWjJWdVpTNW5jbTkxY0RJZ2ZpQmNYR2R5YjNWd01seGNMRnh1SUNBZ0lGUlNWVVVnZmlCT1FWeHVJQ0FwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaG5jbTkxY0N3Z1FXNXVieklzSUdaeVpYRjFaVzVqZVNsY2JpQWdYRzVjYm1kbmNHeHZkQ2h5WlhOMWJIUXNJR0ZsY3loNElEMGdRVzV1YnpJc0lHWnBiR3dnUFNCbmNtOTFjQ3dnZVNBOUlHWnlaWEYxWlc1amVTa3BJQ3NnWjJWdmJWOWliM2h3Ykc5MEtDbGNibHh1WEc1Y2JpTWdWbWxsZHlCeVpYTjFiSFJ6WEc1blozQnNiM1FvYkdGeVoyVnpkRjlzYjI5d2N5d2dZV1Z6S0hnZ1BTQnNiMjl3WDNkcFpIUm9LU2tnS3lCblpXOXRYMmhwYzNSdlozSmhiU2dwWEc1Y2JseHVJeU1qSUVOb1pXTnJhVzVuSUdodmR5QnRZVzU1SUdkbGJtVnpJR1p5YjIwZ1pXRmphQ0JuY205MWNDQm9ZWE1nWlc1amIyMXdZWE56YVc1bklGTXRVMXh1WjJWdVpTNW5jbTkxY0RFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNUzUwYzNaY1hDa3BKR2RsYm1WY2JtZGxibVV1WjNKdmRYQXlJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjlpYVc1aGNubEhjbTkxY0RJdWRITjJYRndwS1NSblpXNWxYRzVjYm1SaGRHRWdQQzBnZEdsaVlteGxLRnh1SUNCblpXNWxJRDBnWXloblpXNWxMbWR5YjNWd01Td2daMlZ1WlM1bmNtOTFjRElwTEZ4dUlDQm5jbTkxY0NBOUlHTW9jbVZ3S0Z4Y1ozSnZkWEF4WEZ3c0lHeGxibWQwYUNoblpXNWxMbWR5YjNWd01Ta3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVndLRnhjWjNKdmRYQXlYRndzSUd4bGJtZDBhQ2huWlc1bExtZHliM1Z3TWlrcEtWeHVLVnh1WEc1a1lYUmhJRHd0SUdSaGRHRWdKVDRsSUdSd2JIbHlPanBzWldaMFgycHZhVzRvYkdGeVoyVnpkRjlzYjI5d2N5d2dZbmtnUFNCaktGeGNaMlZ1WlZ4Y0tTbGNibVJoZEdFZ1BDMGdaR0YwWVNBbFBpVWdaSEJzZVhJNk9tMTFkR0YwWlNoY2JpQWdhR0Z6VTFNZ1BTQnBabVZzYzJVb2FYTXVibUVvYkc5dmNGOTNhV1IwYUNrc0lGeGNUazljWEN3Z1hGeFpSVk5jWENsY2JpbGNibHh1WkdGMFlWOXpkVzF0WVhKNUlEd3RJR1JoZEdFZ0pUNGxYRzRnSUdkeWIzVndYMko1S0dkeWIzVndLU0FsUGlWY2JpQWdjM1Z0YldGeWFYcGxLRnh1SUNBZ0lIUnZkR0ZzSUQwZ2JpZ3BMRnh1SUNBZ0lHaGhjMU5UWDNsbGN5QTlJSE4xYlNob1lYTlRVeUE5UFNCY1hGbEZVMXhjS1N4Y2JpQWdJQ0J3WlhKalpXNTBZV2RsWDNsbGN5QTlJQ2hvWVhOVFUxOTVaWE1nTHlCMGIzUmhiQ2tnS2lBeE1EQmNiaUFnS1Z4dVhHNW5aM0JzYjNRb1pHRjBZVjl6ZFcxdFlYSjVMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnY0dWeVkyVnVkR0ZuWlY5NVpYTXNJR1pwYkd3Z1BTQm5jbTkxY0NrcElDdGNiaUFnWjJWdmJWOWlZWElvYzNSaGRDQTlJRnhjYVdSbGJuUnBkSGxjWEN3Z1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3cElDdGNiaUFnYkdGaWN5aGNiaUFnSUNCMGFYUnNaU0E5SUZ4Y1VHVnlZMlZ1ZEdGblpTQnZaaUJGWVdOb0lFZHliM1Z3SUhkcGRHZ2dhR0Z6VTFNZ1BTQlpSVk5jWEN4Y2JpQWdJQ0I0SUQwZ1hGeEhjbTkxY0Z4Y0xGeHVJQ0FnSUhrZ1BTQmNYRkJsY21ObGJuUmhaMlVnS0NVcFhGeGNiaUFnS1NBcklIbHNhVzBvTUN3Z01UQXdLU0FyWEc0Z0lIUm9aVzFsWDIxcGJtbHRZV3dvS1Z4dVhHNTBaVzF3SUR3dElHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvYUdGelUxTWdQVDBnWEZ4WlJWTmNYQ2xjYm1kbGRGQjJZV3hYYVd4amIzZ2dQQzBnWm5WdVkzUnBiMjRvWkdGMFlTd2daM0p2ZFhBeExDQm5jbTkxY0RJcGUxeHVJQ0JrYVhOMFlXNWpaVEVnUEMwZ0tHUmhkR0VnSlQ0bElHUndiSGx5T2pwbWFXeDBaWElvWjNKdmRYQWdQVDFuY205MWNERXBJQ2trYkc5dmNGOTNhV1IwYUZ4dUlDQmthWE4wWVc1alpUSWdQQzBnS0dSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9aM0p2ZFhBZ1BUMW5jbTkxY0RJcElDa2tiRzl2Y0Y5M2FXUjBhRnh1SUNCM2FXd2dQQzBnZDJsc1kyOTRMblJsYzNRb1pHbHpkR0Z1WTJVeExDQmthWE4wWVc1alpUSXBYRzRnSUhKbGRIVnliaWgzYVd3a2NDNTJZV3gxWlNsY2JuMWNibkIySUR3dElHTnZiblpRZG1Gc2RXVW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjWEdkeWIzVndNVnhjTENCY1hHZHliM1Z3TWx4Y0tTbGNibHh1WjJkd2JHOTBLSFJsYlhBc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQnNiMjl3WDNkcFpIUm9LU2tnS3lCblpXOXRYM1pwYjJ4cGJpZ3BJQ3NnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNDFLU0FyWEc0Z0lHRnVibTkwWVhSbEtGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTVN3Z2VTQTlJREFzSUd4aFltVnNJRDBnY0hZc0lITnBlbVVnUFNBMUxDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDbGNibHh1WEc0akl5TWdRMjl0Y0dGeWFXNW5JRkpPUVNCd1pYSjBkWEppWVhScGIyNWNibHh1WkdsbVppNVNUa0VnUEMwZ1puSmxZV1FvYUdWeVpTaHlaV1pFYVhJc0lGeGNaR2xtWmw5SE1TNWtWRUZIWDBjeExqSnBMbVJVUVVkZmRuTmZSekV1TW1rdVJFMVRUeTUwYzNaY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmMyVnNaV04wS0dNb01Td2dOQ3dnTlNrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR2hoYzFOVElEMGdhV1psYkhObEtHVnVjMlZ0WW14ZloyVnVaVjlwWkNBbGFXNGxJR3hoY21kbGMzUmZiRzl2Y0hNa1oyVnVaU3dnWEZ4b1lYTlRVMXhjTENCY1hHNXZVMU5jWENrcFhHNWNibHh1WjJkd2JHOTBLR1JwWm1ZdVVrNUJMQ0JoWlhNb2VDQTlJR0ZpY3loc2IyY3lSbTlzWkVOb1lXNW5aU2tzSUdOdmJHOXlJRDBnYUdGelUxTXBLU0FyWEc0Z0lITjBZWFJmWldOa1ppaHphWHBsSUQwZ01DNDBLU0FyWEc0Z0lHeGhZbk1vWEc0Z0lDQWdlQ0E5SUZ4Y1FXSnpiMngxZEdVZ2JHOW5NaWhtYjJ4a0lHTm9ZVzVuWlNsY1hDeGNiaUFnSUNCNUlEMGdYRnhEZFcxMWJHRjBhWFpsSUZCeWIySmhZbWxzYVhSNVhGeGNiaUFnS1NBcklHTnZiM0prWDJOaGNuUmxjMmxoYmloNGJHbHRJRDBnWXlnd0xDQXhMalVwS1NBclhHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJQ01nUTJ4bFlXNGdkR2hsYldWY2JpQWdkR2hsYldVb1hHNGdJQ0FnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNYSFJ5WVc1emNHRnlaVzUwWEZ3cExGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDQWdLVnh1WEc1Y2JseHVJeU1qSUVOb1pXTnJhVzVuSUVOb1NWQWdjR1ZoYXlCa1pXNXphWFI1WEc1c1lYSm5aWE4wWDJ4dmIzQnpSM0lnUEMwZ2JXRnJaVWRTWVc1blpYTkdjbTl0UkdGMFlVWnlZVzFsS0d4aGNtZGxjM1JmYkc5dmNITXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6WlhGdVlXMWxjeTVtYVdWc1pDQTlJRnhjYkc5dmNGOWphSEpjWEN3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITjBZWEowTG1acFpXeGtJRDBnWEZ4c2IyOXdYM04wWVhKMFhGd3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYm1RdVptbGxiR1FnUFNCY1hHeHZiM0JmWlc1a1hGd3NJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JyWldWd0xtVjRkSEpoTG1OdmJIVnRibk1nUFNCVVVsVkZLVnh1WEc0aklFWnBibVFnYjNabGNteGhjSE1nWW1WMGQyVmxiaUJEYUVsUUxYTmxjU0J3WldGcmN5QmhibVFnZEdobElHeGhjbWRsYzNRZ2JHOXZjSE5jYm1Ob2FYQmZiM1psY214aGNITWdQQzBnWm1sdVpFOTJaWEpzWVhCektHeGhjbWRsYzNSZmJHOXZjSE5IY2l3Z2NHVmhheTVJTTBzMGJXVXpLVnh1WEc0aklFTnZkVzUwSUhSb1pTQnVkVzFpWlhJZ2IyWWdRMmhKVUMxelpYRWdjR1ZoYTNNZ2NHVnlJR3h2YjNCY2JteHZiM0JmY0dWaGExOWpiM1Z1ZEhNZ1BDMGdkR0ZpYkdVb2NYVmxjbmxJYVhSektHTm9hWEJmYjNabGNteGhjSE1wS1Z4dVhHNGpJRU55WldGMFpTQmhJR1JoZEdFZ1puSmhiV1VnZDJsMGFDQjBhR1VnWTI5MWJuUnpJR0Z1WkNCc2IyOXdJR1JsZEdGcGJITmNibXhoY21kbGMzUmZiRzl2Y0hNa1pHVnVjMmwwZVNBOExTQXdJQ0FqSUVsdWFYUnBZV3hwZW1VZ1pHVnVjMmwwZVNCamIyeDFiVzVjYm14aGNtZGxjM1JmYkc5dmNITWtZMjkxYm5RZ1BDMGdNQ0FnSUNBaklFbHVhWFJwWVd4cGVtVWdjR1ZoYXlCamIzVnVkQ0JqYjJ4MWJXNWNibHh1SXlCQlpHUWdjR1ZoYXlCamIzVnVkSE1nZEc4Z2RHaGxJR052Y25KbGMzQnZibVJwYm1jZ2JHOXZjSE5jYm14aGNtZGxjM1JmYkc5dmNITmJZWE11Ym5WdFpYSnBZeWh1WVcxbGN5aHNiMjl3WDNCbFlXdGZZMjkxYm5SektTa3NJRnhjWTI5MWJuUmNYRjBnUEMwZ1lYTXVhVzUwWldkbGNpaHNiMjl3WDNCbFlXdGZZMjkxYm5SektWeHVYRzRqSUVOaGJHTjFiR0YwWlNCMGFHVWdaR1Z1YzJsMGVTQW9jR1ZoYTNNZ2NHVnlJR3RwYkc5aVlYTmxLVnh1YkdGeVoyVnpkRjlzYjI5d2N5UmtaVzV6YVhSNUlEd3RJR3hoY21kbGMzUmZiRzl2Y0hNa1kyOTFiblFnTHlBb0tHeGhjbWRsYzNSZmJHOXZjSE1rYkc5dmNGOTNhV1IwYUMweEtTQXZJREV3TURBcFhHNWNibHh1WkdGMFlTQThMU0IwYVdKaWJHVW9YRzRnSUdkbGJtVWdQU0JqS0dkbGJtVXVaM0p2ZFhBeExDQm5aVzVsTG1keWIzVndNaWtzWEc0Z0lHZHliM1Z3SUQwZ1l5aHlaWEFvWEZ4bmNtOTFjREZjWEN3Z2JHVnVaM1JvS0dkbGJtVXVaM0p2ZFhBeEtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYQW9YRnhuY205MWNESmNYQ3dnYkdWdVozUm9LR2RsYm1VdVozSnZkWEF5S1NrcFhHNHBYRzVjYm1SaGRHRWdQQzBnWkdGMFlTQWxQaVVnWkhCc2VYSTZPbXhsWm5SZmFtOXBiaWhzWVhKblpYTjBYMnh2YjNCekxDQmllU0E5SUdNb1hGeG5aVzVsWEZ3cEtWeHVaR0YwWVNBOExTQmtZWFJoSUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQm9ZWE5UVXlBOUlHbG1aV3h6WlNocGN5NXVZU2hzYjI5d1gzZHBaSFJvS1N3Z1hGeE9UMXhjTENCY1hGbEZVMXhjS1Z4dUtTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG9ZWE5UVXlBOVBTQmNYRmxGVTF4Y0tWeHVYRzVuWlhSUWRtRnNWMmxzWTI5NElEd3RJR1oxYm1OMGFXOXVLR1JoZEdFc0lHZHliM1Z3TVN3Z1ozSnZkWEF5S1h0Y2JpQWdaR2x6ZEdGdVkyVXhJRHd0SUNoa1lYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlaM0p2ZFhBeEtTQXBKR1JsYm5OcGRIbGNiaUFnWkdsemRHRnVZMlV5SUR3dElDaGtZWFJoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5WjNKdmRYQXlLU0FwSkdSbGJuTnBkSGxjYmlBZ2QybHNJRHd0SUhkcGJHTnZlQzUwWlhOMEtHUnBjM1JoYm1ObE1Td2daR2x6ZEdGdVkyVXlLVnh1SUNCeVpYUjFjbTRvZDJsc0pIQXVkbUZzZFdVcFhHNTlYRzVjYm5CMklEd3RJR052Ym5aUWRtRnNkV1VvWjJWMFVIWmhiRmRwYkdOdmVDaGtZWFJoTENCY1hHZHliM1Z3TVZ4Y0xDQmNYR2R5YjNWd01seGNLU2xjYmx4dVoyZHdiRzkwS0dSaGRHRXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JrWlc1emFYUjVLU2tnS3lCblpXOXRYM1pwYjJ4cGJpaGhaWE1vWm1sc2JDQTlJR2R5YjNWd0tTd2djMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnS3lCY2JpQWdaMlZ2YlY5aWIzaHdiRzkwS0hkcFpIUm9JRDBnTUM0eExDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRXBJQ3RjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLR0ZsY3lobmNtOTFjQ0E5SUdkeWIzVndLU3dnWm5WdUlEMGdiV1ZoYml3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01pd2dabWxzYkNBOUlGeGNjbVZrWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0tTQXJYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FyWEc0Z0lHRnVibTkwWVhSbEtGeGNkR1Y0ZEZ4Y0xDQjRJRDBnTVN3Z2VTQTlJREFzSUd4aFltVnNJRDBnY0hZc0lITnBlbVVnUFNBMUxDQmpiMnh2Y2lBOUlGeGNZbXhoWTJ0Y1hDa2dLMXh1SUNCblozUnBkR3hsS0Z4Y1NETkxORzFsTTF4Y0tWeHVYRzVjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxudGVtcCA8LSBhbGxMb29wc0Fubm90YXRlZCAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLUVcXCkpICU+JSBkcGx5cjo6bXV0YXRlKGhhc1NTID0gIWlzLm5hKGxvb3BJRDIpKVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PWdyb3VwMSkgKSRkaWZmX2RUQUdfRE1TT1xuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaGFzU1MgPT1ncm91cDIpICkkZGlmZl9kVEFHX0RNU09cbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5wdiA8LSBjb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgVFJVRSwgRkFMU0UpKVxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gaGFzU1MsIHkgPSBkaWZmX2RUQUdfRE1TTykpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBoYXNTUyksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBoYXNTUyksIGZ1biA9IG1lYW4sIFxuICAgICAgICAgICAgICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHB2LCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2d0aXRsZShcXFBFXFwpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcblxuXG5cblxuIyBDb3VudGluZyBsb29wIHR5cGVzXG5hbGxMb29wc0Fubm90YXRlZEZpbHRlcmVkIDwtIGFsbExvb3BzQW5ub3RhdGVkICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShsb29wSUQyKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIShsb29wSUQgPT0gbG9vcElEMikpXG50ZW1wIDwtIGFsbExvb3BzQW5ub3RhdGVkRmlsdGVyZWQgJT4lIGRwbHlyOjpzZWxlY3QobG9vcElEMiwgQW5ubzIpXG5yZXN1bHQgPC0gdGVtcCAlPiVcbiAgZ3JvdXBfYnkobG9vcElEMiwgQW5ubzIpICU+JVxuICBzdW1tYXJpc2UoY291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JVxuICBncm91cF9ieShsb29wSUQyKSAlPiVcbiAgbXV0YXRlKGZyZXF1ZW5jeSA9IGNvdW50IC8gc3VtKGNvdW50KSkgJT4lXG4gIGFycmFuZ2UobG9vcElEMiwgQW5ubzIpXG5cbnJlc3VsdCA8LSBsYXJnZXN0X2xvb3BzICU+JSBkcGx5cjo6bGVmdF9qb2luKHJlc3VsdCwgYnkgPSBjKFxcbG9vcElEXFwgPSBcXGxvb3BJRDJcXCkpXG5cbmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5nZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5kYXRhIDwtIHRpYmJsZShcbiAgZ2VuZSA9IGMoZ2VuZS5ncm91cDEsIGdlbmUuZ3JvdXAyKSxcbiAgZ3JvdXAgPSBjKHJlcChcXGdyb3VwMVxcLCBsZW5ndGgoZ2VuZS5ncm91cDEpKSxcbiAgICAgICAgICAgIHJlcChcXGdyb3VwMlxcLCBsZW5ndGgoZ2VuZS5ncm91cDIpKSlcbilcblxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKHJlc3VsdCwgYnkgPSBjKFxcZ2VuZVxcKSlcbmRhdGEgPC0gZGF0YSAlPiUgZmlsdGVyKGNvbXBsZXRlLmNhc2VzKC4pKVxuXG5hbGxfYW5ubzIgPC0gdW5pcXVlKGRhdGEkQW5ubzIpXG5cbiMgQ2FsY3VsYXRlIGF2ZXJhZ2UgZnJlcXVlbmN5IG9mIEFubm8yIGZvciBlYWNoIGdlbmUgaW4gZWFjaCBncm91cFxucmVzdWx0IDwtIGRhdGEgJT4lXG4gICMgRW5zdXJlIGFsbCBwb3NzaWJsZSBBbm5vMiB2YWx1ZXMgYXJlIHByZXNlbnQgZm9yIGVhY2ggZ2VuZSBhbmQgZ3JvdXBcbiAgY29tcGxldGUoZ2VuZSwgQW5ubzIgPSBhbGxfYW5ubzIsIGZpbGwgPSBsaXN0KGZyZXF1ZW5jeSA9IDApKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oXG4gICAgZ2VuZSAlaW4lIGdlbmUuZ3JvdXAxIH4gXFxncm91cDFcXCxcbiAgICBnZW5lICVpbiUgZ2VuZS5ncm91cDIgfiBcXGdyb3VwMlxcLFxuICAgIFRSVUUgfiBOQVxuICApKSAlPiVcbiAgZHBseXI6OnNlbGVjdChncm91cCwgQW5ubzIsIGZyZXF1ZW5jeSlcbiAgXG5cbmdncGxvdChyZXN1bHQsIGFlcyh4ID0gQW5ubzIsIGZpbGwgPSBncm91cCwgeSA9IGZyZXF1ZW5jeSkpICsgZ2VvbV9ib3hwbG90KClcblxuXG5cbiMgVmlldyByZXN1bHRzXG5nZ3Bsb3QobGFyZ2VzdF9sb29wcywgYWVzKHggPSBsb29wX3dpZHRoKSkgKyBnZW9tX2hpc3RvZ3JhbSgpXG5cblxuIyMjIENoZWNraW5nIGhvdyBtYW55IGdlbmVzIGZyb20gZWFjaCBncm91cCBoYXMgZW5jb21wYXNzaW5nIFMtU1xuZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cbmRhdGEgPC0gdGliYmxlKFxuICBnZW5lID0gYyhnZW5lLmdyb3VwMSwgZ2VuZS5ncm91cDIpLFxuICBncm91cCA9IGMocmVwKFxcZ3JvdXAxXFwsIGxlbmd0aChnZW5lLmdyb3VwMSkpLFxuICAgICAgICAgICAgcmVwKFxcZ3JvdXAyXFwsIGxlbmd0aChnZW5lLmdyb3VwMikpKVxuKVxuXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4obGFyZ2VzdF9sb29wcywgYnkgPSBjKFxcZ2VuZVxcKSlcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShcbiAgaGFzU1MgPSBpZmVsc2UoaXMubmEobG9vcF93aWR0aCksIFxcTk9cXCwgXFxZRVNcXClcbilcblxuZGF0YV9zdW1tYXJ5IDwtIGRhdGEgJT4lXG4gIGdyb3VwX2J5KGdyb3VwKSAlPiVcbiAgc3VtbWFyaXplKFxuICAgIHRvdGFsID0gbigpLFxuICAgIGhhc1NTX3llcyA9IHN1bShoYXNTUyA9PSBcXFlFU1xcKSxcbiAgICBwZXJjZW50YWdlX3llcyA9IChoYXNTU195ZXMgLyB0b3RhbCkgKiAxMDBcbiAgKVxuXG5nZ3Bsb3QoZGF0YV9zdW1tYXJ5LCBhZXMoeCA9IGdyb3VwLCB5ID0gcGVyY2VudGFnZV95ZXMsIGZpbGwgPSBncm91cCkpICtcbiAgZ2VvbV9iYXIoc3RhdCA9IFxcaWRlbnRpdHlcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgbGFicyhcbiAgICB0aXRsZSA9IFxcUGVyY2VudGFnZSBvZiBFYWNoIEdyb3VwIHdpdGggaGFzU1MgPSBZRVNcXCxcbiAgICB4ID0gXFxHcm91cFxcLFxuICAgIHkgPSBcXFBlcmNlbnRhZ2UgKCUpXFxcbiAgKSArIHlsaW0oMCwgMTAwKSArXG4gIHRoZW1lX21pbmltYWwoKVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaGFzU1MgPT0gXFxZRVNcXClcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkbG9vcF93aWR0aFxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkbG9vcF93aWR0aFxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cbnB2IDwtIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSlcblxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBsb29wX3dpZHRoKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41KSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcHYsIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuXG4jIyMgQ29tcGFyaW5nIFJOQSBwZXJ0dXJiYXRpb25cblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGMoMSwgNCwgNSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGhhc1NTID0gaWZlbHNlKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGxhcmdlc3RfbG9vcHMkZ2VuZSwgXFxoYXNTU1xcLCBcXG5vU1NcXCkpXG5cblxuZ2dwbG90KGRpZmYuUk5BLCBhZXMoeCA9IGFicyhsb2cyRm9sZENoYW5nZSksIGNvbG9yID0gaGFzU1MpKSArXG4gIHN0YXRfZWNkZihzaXplID0gMC40KSArXG4gIGxhYnMoXG4gICAgeCA9IFxcQWJzb2x1dGUgbG9nMihmb2xkIGNoYW5nZSlcXCxcbiAgICB5ID0gXFxDdW11bGF0aXZlIFByb2JhYmlsaXR5XFxcbiAgKSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxLjUpKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArICMgQ2xlYW4gdGhlbWVcbiAgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKVxuXG5cblxuIyMjIENoZWNraW5nIENoSVAgcGVhayBkZW5zaXR5XG5sYXJnZXN0X2xvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGxhcmdlc3RfbG9vcHMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFuYW1lcy5maWVsZCA9IFxcbG9vcF9jaHJcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LmZpZWxkID0gXFxsb29wX3N0YXJ0XFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQuZmllbGQgPSBcXGxvb3BfZW5kXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKVxuXG4jIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBDaElQLXNlcSBwZWFrcyBhbmQgdGhlIGxhcmdlc3QgbG9vcHNcbmNoaXBfb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGxhcmdlc3RfbG9vcHNHciwgcGVhay5IM0s0bWUzKVxuXG4jIENvdW50IHRoZSBudW1iZXIgb2YgQ2hJUC1zZXEgcGVha3MgcGVyIGxvb3Bcbmxvb3BfcGVha19jb3VudHMgPC0gdGFibGUocXVlcnlIaXRzKGNoaXBfb3ZlcmxhcHMpKVxuXG4jIENyZWF0ZSBhIGRhdGEgZnJhbWUgd2l0aCB0aGUgY291bnRzIGFuZCBsb29wIGRldGFpbHNcbmxhcmdlc3RfbG9vcHMkZGVuc2l0eSA8LSAwICAjIEluaXRpYWxpemUgZGVuc2l0eSBjb2x1bW5cbmxhcmdlc3RfbG9vcHMkY291bnQgPC0gMCAgICAjIEluaXRpYWxpemUgcGVhayBjb3VudCBjb2x1bW5cblxuIyBBZGQgcGVhayBjb3VudHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbG9vcHNcbmxhcmdlc3RfbG9vcHNbYXMubnVtZXJpYyhuYW1lcyhsb29wX3BlYWtfY291bnRzKSksIFxcY291bnRcXF0gPC0gYXMuaW50ZWdlcihsb29wX3BlYWtfY291bnRzKVxuXG4jIENhbGN1bGF0ZSB0aGUgZGVuc2l0eSAocGVha3MgcGVyIGtpbG9iYXNlKVxubGFyZ2VzdF9sb29wcyRkZW5zaXR5IDwtIGxhcmdlc3RfbG9vcHMkY291bnQgLyAoKGxhcmdlc3RfbG9vcHMkbG9vcF93aWR0aC0xKSAvIDEwMDApXG5cblxuZGF0YSA8LSB0aWJibGUoXG4gIGdlbmUgPSBjKGdlbmUuZ3JvdXAxLCBnZW5lLmdyb3VwMiksXG4gIGdyb3VwID0gYyhyZXAoXFxncm91cDFcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAxKSksXG4gICAgICAgICAgICByZXAoXFxncm91cDJcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAyKSkpXG4pXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihsYXJnZXN0X2xvb3BzLCBieSA9IGMoXFxnZW5lXFwpKVxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKFxuICBoYXNTUyA9IGlmZWxzZShpcy5uYShsb29wX3dpZHRoKSwgXFxOT1xcLCBcXFlFU1xcKVxuKSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PSBcXFlFU1xcKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGRlbnNpdHlcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGRlbnNpdHlcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnB2IDwtIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSlcblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkZW5zaXR5KSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgXG4gICAgICAgICAgICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcHYsIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZ3RpdGxlKFxcSDNLNG1lM1xcKVxuXG5cbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVtcCA8LSBhbGxMb29wc0Fubm90YXRlZCAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoXFxQLUVcXCkpICU+JSBkcGx5cjo6bXV0YXRlKGhhc1NTID0gIWlzLm5hKGxvb3BJRDIpKVxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PWdyb3VwMSkgKSRkaWZmX2RUQUdfRE1TT1xuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaGFzU1MgPT1ncm91cDIpICkkZGlmZl9kVEFHX0RNU09cbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5wdiA8LSBjb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgVFJVRSwgRkFMU0UpKVxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gaGFzU1MsIHkgPSBkaWZmX2RUQUdfRE1TTykpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBoYXNTUyksIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArXG4gIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBoYXNTUyksIGZ1biA9IG1lYW4sIFxuICAgICAgICAgICAgICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSBcXHJlZFxcLCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHB2LCBzaXplID0gNSwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgZ2d0aXRsZShcXFBFXFwpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMClcblxuXG5cblxuIyBDb3VudGluZyBsb29wIHR5cGVzXG5hbGxMb29wc0Fubm90YXRlZEZpbHRlcmVkIDwtIGFsbExvb3BzQW5ub3RhdGVkICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShsb29wSUQyKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIShsb29wSUQgPT0gbG9vcElEMikpXG50ZW1wIDwtIGFsbExvb3BzQW5ub3RhdGVkRmlsdGVyZWQgJT4lIGRwbHlyOjpzZWxlY3QobG9vcElEMiwgQW5ubzIpXG5yZXN1bHQgPC0gdGVtcCAlPiVcbiAgZ3JvdXBfYnkobG9vcElEMiwgQW5ubzIpICU+JVxuICBzdW1tYXJpc2UoY291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JVxuICBncm91cF9ieShsb29wSUQyKSAlPiVcbiAgbXV0YXRlKGZyZXF1ZW5jeSA9IGNvdW50IC8gc3VtKGNvdW50KSkgJT4lXG4gIGFycmFuZ2UobG9vcElEMiwgQW5ubzIpXG5cbnJlc3VsdCA8LSBsYXJnZXN0X2xvb3BzICU+JSBkcGx5cjo6bGVmdF9qb2luKHJlc3VsdCwgYnkgPSBjKFxcbG9vcElEXFwgPSBcXGxvb3BJRDJcXCkpXG5cbmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5nZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5kYXRhIDwtIHRpYmJsZShcbiAgZ2VuZSA9IGMoZ2VuZS5ncm91cDEsIGdlbmUuZ3JvdXAyKSxcbiAgZ3JvdXAgPSBjKHJlcChcXGdyb3VwMVxcLCBsZW5ndGgoZ2VuZS5ncm91cDEpKSxcbiAgICAgICAgICAgIHJlcChcXGdyb3VwMlxcLCBsZW5ndGgoZ2VuZS5ncm91cDIpKSlcbilcblxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKHJlc3VsdCwgYnkgPSBjKFxcZ2VuZVxcKSlcbmRhdGEgPC0gZGF0YSAlPiUgZmlsdGVyKGNvbXBsZXRlLmNhc2VzKC4pKVxuXG5hbGxfYW5ubzIgPC0gdW5pcXVlKGRhdGEkQW5ubzIpXG5cbiMgQ2FsY3VsYXRlIGF2ZXJhZ2UgZnJlcXVlbmN5IG9mIEFubm8yIGZvciBlYWNoIGdlbmUgaW4gZWFjaCBncm91cFxucmVzdWx0IDwtIGRhdGEgJT4lXG4gICMgRW5zdXJlIGFsbCBwb3NzaWJsZSBBbm5vMiB2YWx1ZXMgYXJlIHByZXNlbnQgZm9yIGVhY2ggZ2VuZSBhbmQgZ3JvdXBcbiAgY29tcGxldGUoZ2VuZSwgQW5ubzIgPSBhbGxfYW5ubzIsIGZpbGwgPSBsaXN0KGZyZXF1ZW5jeSA9IDApKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oXG4gICAgZ2VuZSAlaW4lIGdlbmUuZ3JvdXAxIH4gXFxncm91cDFcXCxcbiAgICBnZW5lICVpbiUgZ2VuZS5ncm91cDIgfiBcXGdyb3VwMlxcLFxuICAgIFRSVUUgfiBOQVxuICApKSAlPiVcbiAgZHBseXI6OnNlbGVjdChncm91cCwgQW5ubzIsIGZyZXF1ZW5jeSlcbiAgXG5cbmdncGxvdChyZXN1bHQsIGFlcyh4ID0gQW5ubzIsIGZpbGwgPSBncm91cCwgeSA9IGZyZXF1ZW5jeSkpICsgZ2VvbV9ib3hwbG90KClcblxuXG5cbiMgVmlldyByZXN1bHRzXG5nZ3Bsb3QobGFyZ2VzdF9sb29wcywgYWVzKHggPSBsb29wX3dpZHRoKSkgKyBnZW9tX2hpc3RvZ3JhbSgpXG5cblxuIyMjIENoZWNraW5nIGhvdyBtYW55IGdlbmVzIGZyb20gZWFjaCBncm91cCBoYXMgZW5jb21wYXNzaW5nIFMtU1xuZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cbmRhdGEgPC0gdGliYmxlKFxuICBnZW5lID0gYyhnZW5lLmdyb3VwMSwgZ2VuZS5ncm91cDIpLFxuICBncm91cCA9IGMocmVwKFxcZ3JvdXAxXFwsIGxlbmd0aChnZW5lLmdyb3VwMSkpLFxuICAgICAgICAgICAgcmVwKFxcZ3JvdXAyXFwsIGxlbmd0aChnZW5lLmdyb3VwMikpKVxuKVxuXG5kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4obGFyZ2VzdF9sb29wcywgYnkgPSBjKFxcZ2VuZVxcKSlcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShcbiAgaGFzU1MgPSBpZmVsc2UoaXMubmEobG9vcF93aWR0aCksIFxcTk9cXCwgXFxZRVNcXClcbilcblxuZGF0YV9zdW1tYXJ5IDwtIGRhdGEgJT4lXG4gIGdyb3VwX2J5KGdyb3VwKSAlPiVcbiAgc3VtbWFyaXplKFxuICAgIHRvdGFsID0gbigpLFxuICAgIGhhc1NTX3llcyA9IHN1bShoYXNTUyA9PSBcXFlFU1xcKSxcbiAgICBwZXJjZW50YWdlX3llcyA9IChoYXNTU195ZXMgLyB0b3RhbCkgKiAxMDBcbiAgKVxuXG5nZ3Bsb3QoZGF0YV9zdW1tYXJ5LCBhZXMoeCA9IGdyb3VwLCB5ID0gcGVyY2VudGFnZV95ZXMsIGZpbGwgPSBncm91cCkpICtcbiAgZ2VvbV9iYXIoc3RhdCA9IFxcaWRlbnRpdHlcXCwgY29sb3IgPSBcXGJsYWNrXFwpICtcbiAgbGFicyhcbiAgICB0aXRsZSA9IFxcUGVyY2VudGFnZSBvZiBFYWNoIEdyb3VwIHdpdGggaGFzU1MgPSBZRVNcXCxcbiAgICB4ID0gXFxHcm91cFxcLFxuICAgIHkgPSBcXFBlcmNlbnRhZ2UgKCUpXFxcbiAgKSArIHlsaW0oMCwgMTAwKSArXG4gIHRoZW1lX21pbmltYWwoKVxuXG50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaGFzU1MgPT0gXFxZRVNcXClcbmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpe1xuICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkbG9vcF93aWR0aFxuICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkbG9vcF93aWR0aFxuICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpXG4gIHJldHVybih3aWwkcC52YWx1ZSlcbn1cbnB2IDwtIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSlcblxuZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBsb29wX3dpZHRoKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41KSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcHYsIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXClcblxuXG4jIyMgQ29tcGFyaW5nIFJOQSBwZXJ0dXJiYXRpb25cblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGMoMSwgNCwgNSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGhhc1NTID0gaWZlbHNlKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGxhcmdlc3RfbG9vcHMkZ2VuZSwgXFxoYXNTU1xcLCBcXG5vU1NcXCkpXG5cblxuZ2dwbG90KGRpZmYuUk5BLCBhZXMoeCA9IGFicyhsb2cyRm9sZENoYW5nZSksIGNvbG9yID0gaGFzU1MpKSArXG4gIHN0YXRfZWNkZihzaXplID0gMC40KSArXG4gIGxhYnMoXG4gICAgeCA9IFxcQWJzb2x1dGUgbG9nMihmb2xkIGNoYW5nZSlcXCxcbiAgICB5ID0gXFxDdW11bGF0aXZlIFByb2JhYmlsaXR5XFxcbiAgKSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxLjUpKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArICMgQ2xlYW4gdGhlbWVcbiAgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKVxuXG5cblxuIyMjIENoZWNraW5nIENoSVAgcGVhayBkZW5zaXR5XG5sYXJnZXN0X2xvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGxhcmdlc3RfbG9vcHMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFuYW1lcy5maWVsZCA9IFxcbG9vcF9jaHJcXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LmZpZWxkID0gXFxsb29wX3N0YXJ0XFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQuZmllbGQgPSBcXGxvb3BfZW5kXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKVxuXG4jIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBDaElQLXNlcSBwZWFrcyBhbmQgdGhlIGxhcmdlc3QgbG9vcHNcbmNoaXBfb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGxhcmdlc3RfbG9vcHNHciwgcGVhay5IM0s0bWUzKVxuXG4jIENvdW50IHRoZSBudW1iZXIgb2YgQ2hJUC1zZXEgcGVha3MgcGVyIGxvb3Bcbmxvb3BfcGVha19jb3VudHMgPC0gdGFibGUocXVlcnlIaXRzKGNoaXBfb3ZlcmxhcHMpKVxuXG4jIENyZWF0ZSBhIGRhdGEgZnJhbWUgd2l0aCB0aGUgY291bnRzIGFuZCBsb29wIGRldGFpbHNcbmxhcmdlc3RfbG9vcHMkZGVuc2l0eSA8LSAwICAjIEluaXRpYWxpemUgZGVuc2l0eSBjb2x1bW5cbmxhcmdlc3RfbG9vcHMkY291bnQgPC0gMCAgICAjIEluaXRpYWxpemUgcGVhayBjb3VudCBjb2x1bW5cblxuIyBBZGQgcGVhayBjb3VudHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbG9vcHNcbmxhcmdlc3RfbG9vcHNbYXMubnVtZXJpYyhuYW1lcyhsb29wX3BlYWtfY291bnRzKSksIFxcY291bnRcXF0gPC0gYXMuaW50ZWdlcihsb29wX3BlYWtfY291bnRzKVxuXG4jIENhbGN1bGF0ZSB0aGUgZGVuc2l0eSAocGVha3MgcGVyIGtpbG9iYXNlKVxubGFyZ2VzdF9sb29wcyRkZW5zaXR5IDwtIGxhcmdlc3RfbG9vcHMkY291bnQgLyAoKGxhcmdlc3RfbG9vcHMkbG9vcF93aWR0aC0xKSAvIDEwMDApXG5cblxuZGF0YSA8LSB0aWJibGUoXG4gIGdlbmUgPSBjKGdlbmUuZ3JvdXAxLCBnZW5lLmdyb3VwMiksXG4gIGdyb3VwID0gYyhyZXAoXFxncm91cDFcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAxKSksXG4gICAgICAgICAgICByZXAoXFxncm91cDJcXCwgbGVuZ3RoKGdlbmUuZ3JvdXAyKSkpXG4pXG5cbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihsYXJnZXN0X2xvb3BzLCBieSA9IGMoXFxnZW5lXFwpKVxuZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKFxuICBoYXNTUyA9IGlmZWxzZShpcy5uYShsb29wX3dpZHRoKSwgXFxOT1xcLCBcXFlFU1xcKVxuKSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PSBcXFlFU1xcKVxuXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGRlbnNpdHlcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGRlbnNpdHlcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnB2IDwtIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCBcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSlcblxuZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkZW5zaXR5KSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICtcbiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgXG4gICAgICAgICAgICAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9IFxccmVkXFwsIGNvbG9yID0gXFxibGFja1xcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcHYsIHNpemUgPSA1LCBjb2xvciA9IFxcYmxhY2tcXCkgK1xuICBnZ3RpdGxlKFxcSDNLNG1lM1xcKVxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
temp <- allLoopsAnnotated %>% dplyr::filter(Anno2 %in% c(\P-E\)) %>% dplyr::mutate(hasSS = !is.na(loopID2))
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(hasSS ==group1) )$diff_dTAG_DMSO
  distance2 <- (data %>% dplyr::filter(hasSS ==group2) )$diff_dTAG_DMSO
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}
pv <- convPvalue(getPvalWilcox(temp, TRUE, FALSE))
ggplot(temp, aes(x = hasSS, y = diff_dTAG_DMSO)) + geom_violin(aes(fill = hasSS), show.legend = FALSE) + 
  geom_boxplot(width = 0.1, outlier.shape = NA) +
  stat_summary(aes(group = hasSS), fun = mean, 
               geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  theme_classic() +
  annotate(\text\, x = 1, y = 0, label = pv, size = 5, color = \black\) +
  ggtitle(\PE\) + geom_hline(yintercept = 0)




# Counting loop types
allLoopsAnnotatedFiltered <- allLoopsAnnotated %>% dplyr::filter(!is.na(loopID2)) %>%
  dplyr::filter(!(loopID == loopID2))
temp <- allLoopsAnnotatedFiltered %>% dplyr::select(loopID2, Anno2)
result <- temp %>%
  group_by(loopID2, Anno2) %>%
  summarise(count = n(), .groups = 'drop') %>%
  group_by(loopID2) %>%
  mutate(frequency = count / sum(count)) %>%
  arrange(loopID2, Anno2)

result <- largest_loops %>% dplyr::left_join(result, by = c(\loopID\ = \loopID2\))

gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

data <- tibble(
  gene = c(gene.group1, gene.group2),
  group = c(rep(\group1\, length(gene.group1)),
            rep(\group2\, length(gene.group2)))
)

data <- data %>% dplyr::left_join(result, by = c(\gene\))
data <- data %>% filter(complete.cases(.))

all_anno2 <- unique(data$Anno2)

# Calculate average frequency of Anno2 for each gene in each group
result <- data %>%
  # Ensure all possible Anno2 values are present for each gene and group
  complete(gene, Anno2 = all_anno2, fill = list(frequency = 0)) %>% 
  dplyr::mutate(group = case_when(
    gene %in% gene.group1 ~ \group1\,
    gene %in% gene.group2 ~ \group2\,
    TRUE ~ NA
  )) %>%
  dplyr::select(group, Anno2, frequency)
  

ggplot(result, aes(x = Anno2, fill = group, y = frequency)) + geom_boxplot()



# View results
ggplot(largest_loops, aes(x = loop_width)) + geom_histogram()


### Checking how many genes from each group has encompassing S-S
gene.group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
gene.group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

data <- tibble(
  gene = c(gene.group1, gene.group2),
  group = c(rep(\group1\, length(gene.group1)),
            rep(\group2\, length(gene.group2)))
)

data <- data %>% dplyr::left_join(largest_loops, by = c(\gene\))
data <- data %>% dplyr::mutate(
  hasSS = ifelse(is.na(loop_width), \NO\, \YES\)
)

data_summary <- data %>%
  group_by(group) %>%
  summarize(
    total = n(),
    hasSS_yes = sum(hasSS == \YES\),
    percentage_yes = (hasSS_yes / total) * 100
  )

ggplot(data_summary, aes(x = group, y = percentage_yes, fill = group)) +
  geom_bar(stat = \identity\, color = \black\) +
  labs(
    title = \Percentage of Each Group with hasSS = YES\,
    x = \Group\,
    y = \Percentage (%)\
  ) + ylim(0, 100) +
  theme_minimal()

temp <- data %>% dplyr::filter(hasSS == \YES\)
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$loop_width
  distance2 <- (data %>% dplyr::filter(group ==group2) )$loop_width
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}
pv <- convPvalue(getPvalWilcox(temp, \group1\, \group2\))

ggplot(temp, aes(x = group, y = loop_width)) + geom_violin() + geom_boxplot(width = 0.5) +
  annotate(\text\, x = 1, y = 0, label = pv, size = 5, color = \black\)


### Comparing RNA perturbation

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(c(1, 4, 5)) %>%
  dplyr::mutate(hasSS = ifelse(ensembl_gene_id %in% largest_loops$gene, \hasSS\, \noSS\))


ggplot(diff.RNA, aes(x = abs(log2FoldChange), color = hasSS)) +
  stat_ecdf(size = 0.4) +
  labs(
    x = \Absolute log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    )



### Checking ChIP peak density
largest_loopsGr <- makeGRangesFromDataFrame(largest_loops, 
                                            seqnames.field = \loop_chr\, 
                                            start.field = \loop_start\, 
                                            end.field = \loop_end\, 
                                            keep.extra.columns = TRUE)

# Find overlaps between ChIP-seq peaks and the largest loops
chip_overlaps <- findOverlaps(largest_loopsGr, peak.H3K4me3)

# Count the number of ChIP-seq peaks per loop
loop_peak_counts <- table(queryHits(chip_overlaps))

# Create a data frame with the counts and loop details
largest_loops$density <- 0  # Initialize density column
largest_loops$count <- 0    # Initialize peak count column

# Add peak counts to the corresponding loops
largest_loops[as.numeric(names(loop_peak_counts)), \count\] <- as.integer(loop_peak_counts)

# Calculate the density (peaks per kilobase)
largest_loops$density <- largest_loops$count / ((largest_loops$loop_width-1) / 1000)


data <- tibble(
  gene = c(gene.group1, gene.group2),
  group = c(rep(\group1\, length(gene.group1)),
            rep(\group2\, length(gene.group2)))
)

data <- data %>% dplyr::left_join(largest_loops, by = c(\gene\))
data <- data %>% dplyr::mutate(
  hasSS = ifelse(is.na(loop_width), \NO\, \YES\)
) %>% dplyr::filter(hasSS == \YES\)

getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(group ==group1) )$density
  distance2 <- (data %>% dplyr::filter(group ==group2) )$density
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

pv <- convPvalue(getPvalWilcox(data, \group1\, \group2\))

ggplot(data, aes(x = group, y = density)) + geom_violin(aes(fill = group), show.legend = FALSE) + 
  geom_boxplot(width = 0.1, outlier.shape = NA) +
  stat_summary(aes(group = group), fun = mean, 
               geom = \point\, shape = 21, size = 2, fill = \red\, color = \black\) +
  theme_classic() +
  annotate(\text\, x = 1, y = 0, label = pv, size = 5, color = \black\) +
  ggtitle(\H3K4me3\)

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Plotting

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVibUZ0WlNBOExTQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIbGNJbHh1SXlCVlVDQnNiMjl3WEc1c2IyOXdMblZ3SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY0ltTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsZmNHVXRjR1ZmWkZSQlIzWnpSRTFUVDE5VlVGOWthV1ptTUM0eUxtSmxaSEJsWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hzYjI5d1NVUWdQU0J3WVhOMFpTaFdNU3dnVmpJc0lGWTJMQ0J6WlhBZ1BTQmNJbDljSWlrcFhHNGpJRTVQSUd4dmIzQmNibXh2YjNBdWJtOGdQQzBnWm5KbFlXUW9hR1Z5WlNoamIyNXpaVzV6ZFhORWFYSXNJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVjl3WlMxd1pWOWtWRUZIZG5ORVRWTlBYMDVQWDJScFptWXdMakl1WW1Wa2NHVmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHeHZiM0JKUkNBOUlIQmhjM1JsS0ZZeExDQldNaXdnVmpZc0lITmxjQ0E5SUZ3aVgxd2lLU2xjYmlNZ1ZWQWdUazljYm14dmIzQXVkWEJ1YnlBOExTQmlhVzVrWDNKdmQzTW9iRzl2Y0M1MWNDd2diRzl2Y0M1dWJ5bGNiaU1nUkU5WFRpQnNiMjl3WEc1c2IyOXdMbVJ2ZDI0Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGd2lZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5a1ZFRkhkbk5FVFZOUFgwUlBWMDVmWkdsbVpqQXVNaTVpWldSd1pWd2lLU2tnSlQ0bFhHNGdJR1J3YkhseU9qcHRkWFJoZEdVb2JHOXZjRWxFSUQwZ2NHRnpkR1VvVmpFc0lGWXlMQ0JXTml3Z2MyVndJRDBnWENKZlhDSXBLVnh1WEc1Y2JtRnNiRXh2YjNCeklEd3RJR1p5WldGa0tHaGxjbVVvWTI5dWMyVnVjM1Z6UkdseUxDQmNJbU5vY205dGIxOWpiMjV6WDJGdWJtOUlhV1Z5WVhKamFIa3VkSE4yWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2hzYjI5d1NVUWdQU0J3WVhOMFpTaGphSEp2YlRFc0lITjBZWEowTVN3Z1pXNWtNaXdnYzJWd0lEMGdYQ0pmWENJcEtTQWxQaVZjYmlBZ1pIQnNlWEk2T20xMWRHRjBaU2huY205MWNDQTlJR05oYzJWZmQyaGxiaWhjYmlBZ0lDQnNiMjl3U1VRZ0pXbHVKU0JzYjI5d0xuVndibThrYkc5dmNFbEVJSDRnWENKVlVDWk9UMXdpTEZ4dUlDQWdJR3h2YjNCSlJDQWxhVzRsSUd4dmIzQXVaRzkzYmlSc2IyOXdTVVFnZmlCY0lrUlBWMDVjSWl4Y2JpQWdJQ0JVVWxWRklINGdUa0ZjYmlBZ0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwbWFXeDBaWElvSVdsekxtNWhLR2R5YjNWd0tTbGNibHh1YldsdVZtRnNkV1VnUEMwZ0xUUmNibTlpYzJWNGNDQThMU0JtY21WaFpDaG9aWEpsS0dOdmJuTmxibk4xYzBScGNpd2djR0Z6ZEdVd0tGd2liRzl2Y0ZOamIzSmxYMk52Ym5OZmIySnpaWGh3TG5SemRsd2lLU2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHeHZaMTl2WW5ObGVIQmZSRTFUVHlBOUlHbG1YMlZzYzJVb2IySnpaWGh3WDBSTlUwOGdQVDBnTUN3Z2JXbHVWbUZzZFdVc0lHeHZaeklvYjJKelpYaHdYMFJOVTA4cEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMmRmYjJKelpYaHdYMlJVUVVjZ1BTQnBabDlsYkhObEtHOWljMlY0Y0Y5a1ZFRkhJRDA5SURBc0lHMXBibFpoYkhWbExDQnNiMmN5S0c5aWMyVjRjRjlrVkVGSEtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlCTkRnMUlEMGdhV1pmWld4elpTaHZZbk5sZUhCZlFUUTROU0E5UFNBd0xDQnRhVzVXWVd4MVpTd2diRzluTWlodlluTmxlSEJmUVRRNE5Ta3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WjE5dlluTmxlSEJmWkdsbVpsOWtWRUZIWDBSTlUwOGdQU0JzYjJkZmIySnpaWGh3WDJSVVFVY2dMU0JzYjJkZmIySnpaWGh3WDBSTlUwOHNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzluWDI5aWMyVjRjRjlrYVdabVgwRTBPRFZmUkUxVFR5QTlJR3h2WjE5dlluTmxlSEJmUVRRNE5TQXRJR3h2WjE5dlluTmxlSEJmUkUxVFR5bGNibHh1WVd4c1RHOXZjSE1nUEMwZ1lXeHNURzl2Y0hNZ0pUNGxJR3hsWm5SZmFtOXBiaWh2WW5ObGVIQXNJR0o1SUQwZ1l5aGNJbWxrWENJcEtWeHVZV3hzVEc5dmNITWtaM0p2ZFhBZ1BDMGdabUZqZEc5eUtHRnNiRXh2YjNCekpHZHliM1Z3TENCc1pYWmxiSE1nUFNCaktGd2lWVkFtVGs5Y0lpd2dYQ0pFVDFkT1hDSXBLVnh1WEc1Y2JpTWpJeUJRYkc5MGRHbHVaMXh1Y0RFZ1BDMGdaMmR3Ykc5MEtHRnNiRXh2YjNCekxDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdaR2xtWmw5Qk5EZzFYMFJOVTA4c0lHWnBiR3dnUFNCbmNtOTFjQ2twSUNzZ1hHNGdJR2RsYjIxZmRtbHZiR2x1S0d4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNJR0ZzY0doaElEMGdMalFzSUN3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR6TENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRXNJQ0JoYkhCb1lTQTlJREF1Tml3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1hHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoY2JpQWdJQ0JoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnWjJWdmJTQTlJRndpY0c5cGJuUmNJaXdnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURBdU5TeGNiaUFnSUNCbWFXeHNJRDBnWENKaWJHRmphMXdpTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2NHOXphWFJwYjI0Z1BTQndiM05wZEdsdmJsOWtiMlJuWlNndU15bGNiaUFnS1NBclhHNGdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENKbmNtVjVOVEJjSWl3Z1hDSm5jbVY1TlRCY0lpa3BJQ3RjYmx4dUlDQjBhR1Z0WlNoY2JpQWdJQ0JoZUdsekxuUnBkR3hsTG5nZ1BTQmxiR1Z0Wlc1MFgySnNZVzVyS0Nrc1hHNGdJQ0FnWVhocGN5NTBhWFJzWlM1NUlEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3hjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NJQ0FnSUZ4dUlDQWdJR0Y0YVhNdWRHVjRkQzU0SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTeGNiaUFnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJQ0FnSUNBZ0l5QlNiM1JoZEdVZ2VDMWhlR2x6SUd4aFltVnNjeUEwTlNCa1pXZHlaV1Z6WEc0Z0lDQWdJQ0JvYW5WemRDQTlJREVzSUNBZ0lDQWdJQ01nUVdScWRYTjBJR2h2Y21sNmIyNTBZV3dnYW5WemRHbG1hV05oZEdsdmJseHVJQ0FnSUNBZ2RtcDFjM1FnUFNBeElDQWdJQ0FnSUNBaklFRmthblZ6ZENCMlpYSjBhV05oYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY0luUnlZVzV6Y0dGeVpXNTBYQ0lwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNrZ0syeGhZbk1vZVNBOUlGd2l6cFFnYkc5dmNDQnpZMjl5WlZ3aUtTQWdLeUFnSUNCY2JpQWdaMlZ2YlY5b2JHbHVaU2g1YVc1MFpYSmpaWEIwSUQwZ01DeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCaGJIQm9ZU0E5SURFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lwSUNzZ1hHNGdJR2RsYjIxZmFHeHBibVVvZVdsdWRHVnlZMlZ3ZENBOUlDMHdMaklzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZV3h3YUdFZ1BTQXdMalVzSUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lMQ0JzYVc1bGRIbHdaU0E5SUZ3aVpHRnphR1ZrWENJcElDdGNiaUFnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLQzB3TGpVc0lEQXVOU2twWEc0Z0lDQWdYRzVjYmlNakl5TmNibkF5SUR3dElHZG5jR3h2ZENoaGJHeE1iMjl3Y3l3Z1lXVnpLSGdnUFNCbmNtOTFjQ3dnZVNBOUlHeHZaMTl2WW5ObGVIQmZaR2xtWmw5Qk5EZzFYMFJOVTA4c0lHWnBiR3dnUFNCbmNtOTFjQ2twSUNzZ1hHNGdJR2RsYjIxZmRtbHZiR2x1S0d4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNJR0ZzY0doaElEMGdMalFzSUN3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ1oyVnZiVjlpYjNod2JHOTBLSGRwWkhSb0lEMGdNQzR6TENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRXNJQ0JoYkhCb1lTQTlJREF1Tml3Z2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLeUJjYmlBZ2RHaGxiV1ZmWTJ4aGMzTnBZeWdwSUNzZ1hHNGdJSE4wWVhSZmMzVnRiV0Z5ZVNoY2JpQWdJQ0JoWlhNb1ozSnZkWEFnUFNCbmNtOTFjQ2tzSUdaMWJpQTlJRzFsWVc0c1hHNGdJQ0FnWjJWdmJTQTlJRndpY0c5cGJuUmNJaXdnYzJoaGNHVWdQU0F5TVN3Z2MybDZaU0E5SURBdU5TeGNiaUFnSUNCbWFXeHNJRDBnWENKaWJHRmphMXdpTENCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2NHOXphWFJwYjI0Z1BTQndiM05wZEdsdmJsOWtiMlJuWlNndU15bGNiaUFnS1NBclhHNGdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENKbmNtVjVOVEJjSWl3Z1hDSm5jbVY1TlRCY0lpa3BJQ3RjYmx4dUlDQjBhR1Z0WlNoY2JpQWdJQ0JoZUdsekxuUnBkR3hsTG5nZ1BTQmxiR1Z0Wlc1MFgySnNZVzVyS0Nrc1hHNGdJQ0FnWVhocGN5NTBhWFJzWlM1NUlEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxUU3hjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXhjYmlBZ0lDQWdJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NJQ0FnSUZ4dUlDQWdJR0Y0YVhNdWRHVjRkQzU0SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTeGNiaUFnSUNBZ0lHRnVaMnhsSUQwZ05EVXNJQ0FnSUNBZ0l5QlNiM1JoZEdVZ2VDMWhlR2x6SUd4aFltVnNjeUEwTlNCa1pXZHlaV1Z6WEc0Z0lDQWdJQ0JvYW5WemRDQTlJREVzSUNBZ0lDQWdJQ01nUVdScWRYTjBJR2h2Y21sNmIyNTBZV3dnYW5WemRHbG1hV05oZEdsdmJseHVJQ0FnSUNBZ2RtcDFjM1FnUFNBeElDQWdJQ0FnSUNBaklFRmthblZ6ZENCMlpYSjBhV05oYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMbXhwYm1VZ1BTQmxiR1Z0Wlc1MFgyeHBibVVvWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRndpSXpBd01EQXdNRndpTEZ4dUlDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lseHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzWEc0Z0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY0luUnlZVzV6Y0dGeVpXNTBYQ0lwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNrZ0syeGhZbk1vZVNBOUlGd2liRzluTWlobVl5QnZaaUJ2WW5NdlpYaHdLVndpS1NBZ0t5QWdJQ0JjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JoYkhCb1lTQTlJREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNJbUpzWVdOclhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSXBJQ3NnWEc0Z0lHTnZiM0prWDJOaGNuUmxjMmxoYmloNWJHbHRJRDBnWXlndE1pd2dNaWtwWEc0Z0lGeHVYRzVjYmlNakl5TWpJeU1qSXlNakl5TmNibHh1SXlNaklGQnNiM1IwYVc1blhHNXdNeUE4TFNCblozQnNiM1FvWVd4c1RHOXZjSE1zSUdGbGN5aDRJRDBnWjNKdmRYQXNJSGtnUFNCa2FXWm1YMlJVUVVkZlJFMVRUeXdnWm1sc2JDQTlJR2R5YjNWd0tTa2dLeUJjYmlBZ1oyVnZiVjkyYVc5c2FXNG9iR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWl3Z1lXeHdhR0VnUFNBdU5Dd2dMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBcklGeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqTXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVN3Z0lHRnNjR2hoSUQwZ01DNDJMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBcklGeHVJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLRnh1SUNBZ0lHRmxjeWhuY205MWNDQTlJR2R5YjNWd0tTd2dablZ1SUQwZ2JXVmhiaXhjYmlBZ0lDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNQzQxTEZ4dUlDQWdJR1pwYkd3Z1BTQmNJbUpzWVdOclhDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMQ0J3YjNOcGRHbHZiaUE5SUhCdmMybDBhVzl1WDJSdlpHZGxLQzR6S1Z4dUlDQXBJQ3RjYmlBZ2MyTmhiR1ZmWm1sc2JGOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNJbWR5WlhrMU1Gd2lMQ0JjSW1keVpYazFNRndpS1NrZ0sxeHVYRzRnSUhSb1pXMWxLRnh1SUNBZ0lHRjRhWE11ZEdsMGJHVXVlQ0E5SUdWc1pXMWxiblJmWW14aGJtc29LU3hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxMbmtnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N3Z0lDQWdYRzRnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWVc1bmJHVWdQU0EwTlN3Z0lDQWdJQ0FqSUZKdmRHRjBaU0I0TFdGNGFYTWdiR0ZpWld4eklEUTFJR1JsWjNKbFpYTmNiaUFnSUNBZ0lHaHFkWE4wSUQwZ01Td2dJQ0FnSUNBZ0l5QkJaR3AxYzNRZ2FHOXlhWHB2Ym5SaGJDQnFkWE4wYVdacFkyRjBhVzl1WEc0Z0lDQWdJQ0IyYW5WemRDQTlJREVnSUNBZ0lDQWdJQ01nUVdScWRYTjBJSFpsY25ScFkyRnNJR3AxYzNScFptbGpZWFJwYjI1Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRndpZEhKaGJuTndZWEpsYm5SY0lpa3NYRzRnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlsY2JpQWdLU0FyYkdGaWN5aDVJRDBnWENMT2xDQnNiMjl3SUhOamIzSmxYQ0lwSUNBcklDQWdJRnh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJR0ZzY0doaElEMGdNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lZbXhoWTJ0Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxaVzVrSUQwZ1hDSnpjWFZoY21WY0lpa2dLeUJjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTFRBdU1peGNiaUFnSUNBZ0lDQWdJQ0FnSUNCaGJIQm9ZU0E5SURBdU5Td2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY0ltSnNZV05yWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENJc0lHeHBibVYwZVhCbElEMGdYQ0prWVhOb1pXUmNJaWtnSzF4dUlDQmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb0xUQXVOU3dnTUM0MUtTbGNiaUFnSUNCY2JseHVJeU1qSTF4dWNEUWdQQzBnWjJkd2JHOTBLR0ZzYkV4dmIzQnpMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnYkc5blgyOWljMlY0Y0Y5a2FXWm1YMlJVUVVkZlJFMVRUeXdnWm1sc2JDQTlJR2R5YjNWd0tTa2dLeUJjYmlBZ1oyVnZiVjkyYVc5c2FXNG9iR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWl3Z1lXeHdhR0VnUFNBdU5Dd2dMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBcklGeHVJQ0JuWlc5dFgySnZlSEJzYjNRb2QybGtkR2dnUFNBd0xqTXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WlhkcFpIUm9JRDBnYkdsdVpWUm9hV05ySUNvZ2JXMVViMHhwYm1WVmJtbDBMQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5MWRHeHBaWEl1YzJoaGNHVWdQU0JPUVN3Z0lHRnNjR2hoSUQwZ01DNDJMQ0J6YUc5M0xteGxaMlZ1WkNBOUlFWkJURk5GS1NBcklGeHVJQ0IwYUdWdFpWOWpiR0Z6YzJsaktDa2dLeUJjYmlBZ2MzUmhkRjl6ZFcxdFlYSjVLRnh1SUNBZ0lHRmxjeWhuY205MWNDQTlJR2R5YjNWd0tTd2dablZ1SUQwZ2JXVmhiaXhjYmlBZ0lDQm5aVzl0SUQwZ1hDSndiMmx1ZEZ3aUxDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNQzQxTEZ4dUlDQWdJR1pwYkd3Z1BTQmNJbUpzWVdOclhDSXNJR052Ykc5eUlEMGdYQ0ppYkdGamExd2lMQ0J3YjNOcGRHbHZiaUE5SUhCdmMybDBhVzl1WDJSdlpHZGxLQzR6S1Z4dUlDQXBJQ3RjYmlBZ2MyTmhiR1ZmWm1sc2JGOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ1l5aGNJbWR5WlhrMU1Gd2lMQ0JjSW1keVpYazFNRndpS1NrZ0sxeHVYRzRnSUhSb1pXMWxLRnh1SUNBZ0lHRjRhWE11ZEdsMGJHVXVlQ0E5SUdWc1pXMWxiblJmWW14aGJtc29LU3hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxMbmtnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N3Z0lDQWdYRzRnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWVc1bmJHVWdQU0EwTlN3Z0lDQWdJQ0FqSUZKdmRHRjBaU0I0TFdGNGFYTWdiR0ZpWld4eklEUTFJR1JsWjNKbFpYTmNiaUFnSUNBZ0lHaHFkWE4wSUQwZ01Td2dJQ0FnSUNBZ0l5QkJaR3AxYzNRZ2FHOXlhWHB2Ym5SaGJDQnFkWE4wYVdacFkyRjBhVzl1WEc0Z0lDQWdJQ0IyYW5WemRDQTlJREVnSUNBZ0lDQWdJQ01nUVdScWRYTjBJSFpsY25ScFkyRnNJR3AxYzNScFptbGpZWFJwYjI1Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpeGNiaUFnSUNBZ0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzcWJXMVViMHhwYm1WVmJtbDBMRnh1SUNBZ0lDQWdiR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lIQmhibVZzTG1KaFkydG5jbTkxYm1RZ1BTQmxiR1Z0Wlc1MFgzSmxZM1FvWm1sc2JDQTlJRndpZEhKaGJuTndZWEpsYm5SY0lpa3NYRzRnSUNBZ2JHVm5aVzVrTG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcExGeHVJQ0FnSUd4bFoyVnVaQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlsY2JpQWdLU0FyYkdGaWN5aDVJRDBnWENKc2IyY3lLR1pqSUc5bUlHOWljeTlsZUhBcFhDSXBJQ0FySUNBZ0lGeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHRnNjR2hoSUQwZ01TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWlrZ0t5QmNiaUFnWTI5dmNtUmZZMkZ5ZEdWemFXRnVLSGxzYVcwZ1BTQmpLQzB5TENBeUtTbGNiaUFnWEc1M2FXUjBhQ0E4TFNCd1lXNWxiRk5wZW1Vb01pa3FiVzFVYjBsdVkyaGNibWhsYVdkb2RDQThMU0J3WVc1bGJGTnBlbVVvTVM0MUtTcHRiVlJ2U1c1amFGeHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpY21WblRHOXZjRk5qYjNKbFpuSnZiV1JVUVVkZlpGUkJSMXdpS1Z4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jR3h2ZEY5bmNtbGtLSEF4TENCd01pa3BYRzVrWlhZdWIyWm1LQ2xjYm5OMloyeHBkR1VvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hDSXVjM1puWENJcEtTd2dJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hCc2IzUmZaM0pwWkNod01Td2djRElwS1Z4dVpHVjJMbTltWmlncElDQmNibHh1ZDJsa2RHZ2dQQzBnY0dGdVpXeFRhWHBsS0RJcEttMXRWRzlKYm1Ob1hHNW9aV2xuYUhRZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TlNrcWJXMVViMGx1WTJoY2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbkpsWjB4dmIzQlRZMjl5WldaeWIyMWtWRUZIWDBFME9EVmNJaWxjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjSWk1d2JtZGNJaWtwTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY0ltbHVYQ0lzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQnNiM1JmWjNKcFpDaHdNeXdnY0RRcEtWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3Ykc5MFgyZHlhV1FvY0RNc0lIQTBLU2xjYm1SbGRpNXZabVlvS1NBZ1hHNWNibmRwWkhSb0lEd3RJSEJoYm1Wc1UybDZaU2d5S1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3hMalVwS20xdFZHOUpibU5vWEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hDSnlaV2RNYjI5d1UyTnZjbVZtY205dFpGUkJSMTlzYjI5d1UyTnZjbVZjSWlsY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEJzYjNSZlozSnBaQ2h3TVN3Z2NETXBLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod2JHOTBYMmR5YVdRb2NERXNJSEF6S1NsY2JtUmxkaTV2Wm1Zb0tTQWdYRzVjYm5kcFpIUm9JRHd0SUhCaGJtVnNVMmw2WlNneUtTcHRiVlJ2U1c1amFGeHVhR1ZwWjJoMElEd3RJSEJoYm1Wc1UybDZaU2d4TGpVcEttMXRWRzlKYm1Ob1hHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0p5WldkTWIyOXdVMk52Y21WbWNtOXRaRlJCUjE5c2IyY3labU5jSWlsY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY0lpNXdibWRjSWlrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNJbWx1WENJc0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEJzYjNSZlozSnBaQ2h3TWl3Z2NEUXBLVnh1WkdWMkxtOW1aaWdwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod2JHOTBYMmR5YVdRb2NESXNJSEEwS1NsY2JtUmxkaTV2Wm1Zb0tTQWdYRzVjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcbiMgVVAgbG9vcFxubG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoVjEsIFYyLCBWNiwgc2VwID0gXFxfXFwpKVxuIyBOTyBsb29wXG5sb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb29wSUQgPSBwYXN0ZShWMSwgVjIsIFY2LCBzZXAgPSBcXF9cXCkpXG4jIFVQIE5PXG5sb29wLnVwbm8gPC0gYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pXG4jIERPV04gbG9vcFxubG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKFYxLCBWMiwgVjYsIHNlcCA9IFxcX1xcKSlcblxuXG5hbGxMb29wcyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5LnRzdlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIGVuZDIsIHNlcCA9IFxcX1xcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oXG4gICAgbG9vcElEICVpbiUgbG9vcC51cG5vJGxvb3BJRCB+IFxcVVAmTk9cXCxcbiAgICBsb29wSUQgJWluJSBsb29wLmRvd24kbG9vcElEIH4gXFxET1dOXFwsXG4gICAgVFJVRSB+IE5BXG4gICkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cbm1pblZhbHVlIDwtIC00XG5vYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChcXGxvb3BTY29yZV9jb25zX29ic2V4cC50c3ZcXCkpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pXG5cbmFsbExvb3BzIDwtIGFsbExvb3BzICU+JSBsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoXFxpZFxcKSlcbmFsbExvb3BzJGdyb3VwIDwtIGZhY3RvcihhbGxMb29wcyRncm91cCwgbGV2ZWxzID0gYyhcXFVQJk5PXFwsIFxcRE9XTlxcKSlcblxuXG4jIyMgUGxvdHRpbmdcbnAxIDwtIGdncGxvdChhbGxMb29wcywgYWVzKHggPSBncm91cCwgeSA9IGRpZmZfQTQ4NV9ETVNPLCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBhbHBoYSA9IC40LCAsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcZ3JleTUwXFwsIFxcZ3JleTUwXFwpKSArXG5cbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLFxuICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLCAgICBcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApICtsYWJzKHkgPSBcXM6UIGxvb3Agc2NvcmVcXCkgICsgICAgXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsXG4gICAgICAgICAgICAgYWxwaGEgPSAxLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLFxuICAgICAgICAgICAgIGFscGhhID0gMC41LCBcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC41LCAwLjUpKVxuICAgIFxuXG4jIyMjXG5wMiA8LSBnZ3Bsb3QoYWxsTG9vcHMsIGFlcyh4ID0gZ3JvdXAsIHkgPSBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPLCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBhbHBoYSA9IC40LCAsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcZ3JleTUwXFwsIFxcZ3JleTUwXFwpKSArXG5cbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLFxuICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLCAgICBcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApICtsYWJzKHkgPSBcXGxvZzIoZmMgb2Ygb2JzL2V4cClcXCkgICsgICAgXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsXG4gICAgICAgICAgICAgYWxwaGEgPSAxLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArIFxuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTIsIDIpKVxuICBcblxuXG4jIyMjIyMjIyMjIyMjXG5cbiMjIyBQbG90dGluZ1xucDMgPC0gZ2dwbG90KGFsbExvb3BzLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlmZl9kVEFHX0RNU08sIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFxncmV5NTBcXCwgXFxncmV5NTBcXCkpICtcblxuICB0aGVtZShcbiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK2xhYnMoeSA9IFxczpQgbG9vcCBzY29yZVxcKSAgKyAgICBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCxcbiAgICAgICAgICAgICBhbHBoYSA9IDEsXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICsgXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0wLjIsXG4gICAgICAgICAgICAgYWxwaGEgPSAwLjUsIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuNSkpXG4gICAgXG5cbiMjIyNcbnA0IDwtIGdncGxvdChhbGxMb29wcywgYWVzKHggPSBncm91cCwgeSA9IGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFxncmV5NTBcXCwgXFxncmV5NTBcXCkpICtcblxuICB0aGVtZShcbiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK2xhYnMoeSA9IFxcbG9nMihmYyBvZiBvYnMvZXhwKVxcKSAgKyAgICBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCxcbiAgICAgICAgICAgICBhbHBoYSA9IDEsXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICsgXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMiwgMikpXG4gIFxud2lkdGggPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbmZpbGVOYW1lIDwtIHBhc3RlMChcXHJlZ0xvb3BTY29yZWZyb21kVEFHX2RUQUdcXClcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChwMSwgcDIpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQocDEsIHAyKSlcbmRldi5vZmYoKSAgXG5cbndpZHRoIDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxyZWdMb29wU2NvcmVmcm9tZFRBR19BNDg1XFwpXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQocDMsIHA0KSlcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKHAzLCBwNCkpXG5kZXYub2ZmKCkgIFxuXG53aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxccmVnTG9vcFNjb3JlZnJvbWRUQUdfbG9vcFNjb3JlXFwpXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQocDEsIHAzKSlcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKHAxLCBwMykpXG5kZXYub2ZmKCkgIFxuXG53aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxccmVnTG9vcFNjb3JlZnJvbWRUQUdfbG9nMmZjXFwpXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQocDIsIHA0KSlcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKHAyLCBwNCkpXG5kZXYub2ZmKCkgIFxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
name <- \chromo_cons_annoHierarchy\
# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>%
  dplyr::mutate(loopID = paste(V1, V2, V6, sep = \_\))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>%
  dplyr::mutate(loopID = paste(V1, V2, V6, sep = \_\))
# UP NO
loop.upno <- bind_rows(loop.up, loop.no)
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>%
  dplyr::mutate(loopID = paste(V1, V2, V6, sep = \_\))


allLoops <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\)) %>%
  dplyr::mutate(loopID = paste(chrom1, start1, end2, sep = \_\)) %>%
  dplyr::mutate(group = case_when(
    loopID %in% loop.upno$loopID ~ \UP&NO\,
    loopID %in% loop.down$loopID ~ \DOWN\,
    TRUE ~ NA
  )) %>%
  dplyr::filter(!is.na(group))

minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

allLoops <- allLoops %>% left_join(obsexp, by = c(\id\))
allLoops$group <- factor(allLoops$group, levels = c(\UP&NO\, \DOWN\))


### Plotting
p1 <- ggplot(allLoops, aes(x = group, y = diff_A485_DMSO, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  scale_fill_manual(values = c(\grey50\, \grey50\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \Δ loop score\)  +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  geom_hline(yintercept = -0.2,
             alpha = 0.5, 
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\, linetype = \dashed\) +
  coord_cartesian(ylim = c(-0.5, 0.5))
    

####
p2 <- ggplot(allLoops, aes(x = group, y = log_obsexp_diff_A485_DMSO, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  scale_fill_manual(values = c(\grey50\, \grey50\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \log2(fc of obs/exp)\)  +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  coord_cartesian(ylim = c(-2, 2))
  


#############

### Plotting
p3 <- ggplot(allLoops, aes(x = group, y = diff_dTAG_DMSO, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  scale_fill_manual(values = c(\grey50\, \grey50\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \Δ loop score\)  +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  geom_hline(yintercept = -0.2,
             alpha = 0.5, 
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\, linetype = \dashed\) +
  coord_cartesian(ylim = c(-0.5, 0.5))
    

####
p4 <- ggplot(allLoops, aes(x = group, y = log_obsexp_diff_dTAG_DMSO, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  scale_fill_manual(values = c(\grey50\, \grey50\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \log2(fc of obs/exp)\)  +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  coord_cartesian(ylim = c(-2, 2))
  
width <- panelSize(2)*mmToInch
height <- panelSize(1.5)*mmToInch
fileName <- paste0(\regLoopScorefromdTAG_dTAG\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(plot_grid(p1, p2))
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(plot_grid(p1, p2))
dev.off()  

width <- panelSize(2)*mmToInch
height <- panelSize(1.5)*mmToInch
fileName <- paste0(\regLoopScorefromdTAG_A485\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(plot_grid(p3, p4))
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(plot_grid(p3, p4))
dev.off()  

width <- panelSize(2)*mmToInch
height <- panelSize(1.5)*mmToInch
fileName <- paste0(\regLoopScorefromdTAG_loopScore\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(plot_grid(p1, p3))
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(plot_grid(p1, p3))
dev.off()  

width <- panelSize(2)*mmToInch
height <- panelSize(1.5)*mmToInch
fileName <- paste0(\regLoopScorefromdTAG_log2fc\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(plot_grid(p2, p4))
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(plot_grid(p2, p4))
dev.off()  



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWJtRnRaU0E4TFNCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhsY1hGeHVJeUJWVUNCc2IyOXdYRzVzYjI5d0xuVndJRHd0SUdaeVpXRmtLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0JjWEdOb2NtOXRiMTlqYjI1elgyRnVibTlJYVdWeVlYSmphSGxmY0dVdGNHVmZaRlJCUjNaelJFMVRUMTlWVUY5a2FXWm1NQzR5TG1KbFpIQmxYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaHNiMjl3U1VRZ1BTQndZWE4wWlNoV01Td2dWaklzSUZZMkxDQnpaWEFnUFNCY1hGOWNYQ2twWEc0aklFNVBJR3h2YjNCY2JteHZiM0F1Ym04Z1BDMGdabkpsWVdRb2FHVnlaU2hqYjI1elpXNXpkWE5FYVhJc0lGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWOXdaUzF3WlY5a1ZFRkhkbk5FVFZOUFgwNVBYMlJwWm1Zd0xqSXVZbVZrY0dWY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0d4dmIzQkpSQ0E5SUhCaGMzUmxLRll4TENCV01pd2dWallzSUhObGNDQTlJRnhjWDF4Y0tTbGNiaU1nVlZBZ1RrOWNibXh2YjNBdWRYQnVieUE4TFNCaWFXNWtYM0p2ZDNNb2JHOXZjQzUxY0N3Z2JHOXZjQzV1YnlsY2JpTWdSRTlYVGlCc2IyOXdYRzVzYjI5d0xtUnZkMjRnUEMwZ1puSmxZV1FvYUdWeVpTaGpiMjV6Wlc1emRYTkVhWElzSUZ4Y1kyaHliMjF2WDJOdmJuTmZZVzV1YjBocFpYSmhjbU5vZVY5d1pTMXdaVjlrVkVGSGRuTkVUVk5QWDBSUFYwNWZaR2xtWmpBdU1pNWlaV1J3WlZ4Y0tTa2dKVDRsWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvYkc5dmNFbEVJRDBnY0dGemRHVW9WakVzSUZZeUxDQldOaXdnYzJWd0lEMGdYRnhmWEZ3cEtWeHVYRzVjYm1Gc2JFeHZiM0J6SUR3dElHWnlaV0ZrS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCY1hHTm9jbTl0YjE5amIyNXpYMkZ1Ym05SWFXVnlZWEpqYUhrdWRITjJYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaHNiMjl3U1VRZ1BTQndZWE4wWlNoamFISnZiVEVzSUhOMFlYSjBNU3dnWlc1a01pd2djMlZ3SUQwZ1hGeGZYRndwS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG5jbTkxY0NBOUlHTmhjMlZmZDJobGJpaGNiaUFnSUNCc2IyOXdTVVFnSldsdUpTQnNiMjl3TG5Wd2JtOGtiRzl2Y0VsRUlINGdYRnhWVUNaT1QxeGNMRnh1SUNBZ0lHeHZiM0JKUkNBbGFXNGxJR3h2YjNBdVpHOTNiaVJzYjI5d1NVUWdmaUJjWEVSUFYwNWNYQ3hjYmlBZ0lDQlVVbFZGSUg0Z1RrRmNiaUFnS1NrZ0pUNGxYRzRnSUdSd2JIbHlPanBtYVd4MFpYSW9JV2x6TG01aEtHZHliM1Z3S1NsY2JseHViV2x1Vm1Gc2RXVWdQQzBnTFRSY2JtOWljMlY0Y0NBOExTQm1jbVZoWkNob1pYSmxLR052Ym5ObGJuTjFjMFJwY2l3Z2NHRnpkR1V3S0Z4Y2JHOXZjRk5qYjNKbFgyTnZibk5mYjJKelpYaHdMblJ6ZGx4Y0tTa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0d4dloxOXZZbk5sZUhCZlJFMVRUeUE5SUdsbVgyVnNjMlVvYjJKelpYaHdYMFJOVTA4Z1BUMGdNQ3dnYldsdVZtRnNkV1VzSUd4dlp6SW9iMkp6Wlhod1gwUk5VMDhwS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyZGZiMkp6Wlhod1gyUlVRVWNnUFNCcFpsOWxiSE5sS0c5aWMyVjRjRjlrVkVGSElEMDlJREFzSUcxcGJsWmhiSFZsTENCc2IyY3lLRzlpYzJWNGNGOWtWRUZIS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOW5YMjlpYzJWNGNGOUJORGcxSUQwZ2FXWmZaV3h6WlNodlluTmxlSEJmUVRRNE5TQTlQU0F3TENCdGFXNVdZV3gxWlN3Z2JHOW5NaWh2WW5ObGVIQmZRVFE0TlNrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaMTl2WW5ObGVIQmZaR2xtWmw5a1ZFRkhYMFJOVTA4Z1BTQnNiMmRmYjJKelpYaHdYMlJVUVVjZ0xTQnNiMmRmYjJKelpYaHdYMFJOVTA4c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHOW5YMjlpYzJWNGNGOWthV1ptWDBFME9EVmZSRTFUVHlBOUlHeHZaMTl2WW5ObGVIQmZRVFE0TlNBdElHeHZaMTl2WW5ObGVIQmZSRTFUVHlsY2JseHVZV3hzVEc5dmNITWdQQzBnWVd4c1RHOXZjSE1nSlQ0bElHeGxablJmYW05cGJpaHZZbk5sZUhBc0lHSjVJRDBnWXloY1hHbGtYRndwS1Z4dVlXeHNURzl2Y0hNa1ozSnZkWEFnUEMwZ1ptRmpkRzl5S0dGc2JFeHZiM0J6SkdkeWIzVndMQ0JzWlhabGJITWdQU0JqS0Z4Y1ZWQW1UazljWEN3Z1hGeEVUMWRPWEZ3cEtWeHVYRzVjYmlNakl5QlFiRzkwZEdsdVoxeHVjREVnUEMwZ1oyZHdiRzkwS0dGc2JFeHZiM0J6TENCaFpYTW9lQ0E5SUdkeWIzVndMQ0I1SUQwZ1pHbG1abDlCTkRnMVgwUk5VMDhzSUdacGJHd2dQU0JuY205MWNDa3BJQ3NnWEc0Z0lHZGxiMjFmZG1sdmJHbHVLR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c0lHRnNjR2hoSUQwZ0xqUXNJQ3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHpMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFc0lDQmhiSEJvWVNBOUlEQXVOaXdnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWEc0Z0lITjBZWFJmYzNWdGJXRnllU2hjYmlBZ0lDQmhaWE1vWjNKdmRYQWdQU0JuY205MWNDa3NJR1oxYmlBOUlHMWxZVzRzWEc0Z0lDQWdaMlZ2YlNBOUlGeGNjRzlwYm5SY1hDd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJREF1TlN4Y2JpQWdJQ0JtYVd4c0lEMGdYRnhpYkdGamExeGNMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnY0c5emFYUnBiMjRnUFNCd2IzTnBkR2x2Ymw5a2IyUm5aU2d1TXlsY2JpQWdLU0FyWEc0Z0lITmpZV3hsWDJacGJHeGZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YRnhuY21WNU5UQmNYQ3dnWEZ4bmNtVjVOVEJjWENrcElDdGNibHh1SUNCMGFHVnRaU2hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxMbmdnUFNCbGJHVnRaVzUwWDJKc1lXNXJLQ2tzWEc0Z0lDQWdZWGhwY3k1MGFYUnNaUzU1SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTeGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5eGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hGeHVJQ0FnSUNrc0lDQWdJRnh1SUNBZ0lHRjRhWE11ZEdWNGRDNTRJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN4Y2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lDQWdJQ0FnSXlCU2IzUmhkR1VnZUMxaGVHbHpJR3hoWW1Wc2N5QTBOU0JrWldkeVpXVnpYRzRnSUNBZ0lDQm9hblZ6ZENBOUlERXNJQ0FnSUNBZ0lDTWdRV1JxZFhOMElHaHZjbWw2YjI1MFlXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUlDQWdJQ0FnZG1wMWMzUWdQU0F4SUNBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0IyWlhKMGFXTmhiQ0JxZFhOMGFXWnBZMkYwYVc5dVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjWEhSeVlXNXpjR0Z5Wlc1MFhGd3BMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2tnSzJ4aFluTW9lU0E5SUZ4Y3pwUWdiRzl2Y0NCelkyOXlaVnhjS1NBZ0t5QWdJQ0JjYmlBZ1oyVnZiVjlvYkdsdVpTaDVhVzUwWlhKalpYQjBJRDBnTUN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JoYkhCb1lTQTlJREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYjNJZ1BTQmNYR0pzWVdOclhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3BJQ3NnWEc0Z0lHZGxiMjFmYUd4cGJtVW9lV2x1ZEdWeVkyVndkQ0E5SUMwd0xqSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1lXeHdhR0VnUFNBd0xqVXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0xDQnNhVzVsZEhsd1pTQTlJRnhjWkdGemFHVmtYRndwSUN0Y2JpQWdZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktDMHdMalVzSURBdU5Ta3BYRzRnSUNBZ1hHNWNiaU1qSXlOY2JuQXlJRHd0SUdkbmNHeHZkQ2hoYkd4TWIyOXdjeXdnWVdWektIZ2dQU0JuY205MWNDd2dlU0E5SUd4dloxOXZZbk5sZUhCZlpHbG1abDlCTkRnMVgwUk5VMDhzSUdacGJHd2dQU0JuY205MWNDa3BJQ3NnWEc0Z0lHZGxiMjFmZG1sdmJHbHVLR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c0lHRnNjR2hoSUQwZ0xqUXNJQ3dnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnWjJWdmJWOWliM2h3Ykc5MEtIZHBaSFJvSUQwZ01DNHpMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmRYUnNhV1Z5TG5Ob1lYQmxJRDBnVGtFc0lDQmhiSEJvWVNBOUlEQXVOaXdnYzJodmR5NXNaV2RsYm1RZ1BTQkdRVXhUUlNrZ0t5QmNiaUFnZEdobGJXVmZZMnhoYzNOcFl5Z3BJQ3NnWEc0Z0lITjBZWFJmYzNWdGJXRnllU2hjYmlBZ0lDQmhaWE1vWjNKdmRYQWdQU0JuY205MWNDa3NJR1oxYmlBOUlHMWxZVzRzWEc0Z0lDQWdaMlZ2YlNBOUlGeGNjRzlwYm5SY1hDd2djMmhoY0dVZ1BTQXlNU3dnYzJsNlpTQTlJREF1TlN4Y2JpQWdJQ0JtYVd4c0lEMGdYRnhpYkdGamExeGNMQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnY0c5emFYUnBiMjRnUFNCd2IzTnBkR2x2Ymw5a2IyUm5aU2d1TXlsY2JpQWdLU0FyWEc0Z0lITmpZV3hsWDJacGJHeGZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YRnhuY21WNU5UQmNYQ3dnWEZ4bmNtVjVOVEJjWENrcElDdGNibHh1SUNCMGFHVnRaU2hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxMbmdnUFNCbGJHVnRaVzUwWDJKc1lXNXJLQ2tzWEc0Z0lDQWdZWGhwY3k1MGFYUnNaUzU1SUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTeGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFV5eGNiaUFnSUNBZ0lHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hGeHVJQ0FnSUNrc0lDQWdJRnh1SUNBZ0lHRjRhWE11ZEdWNGRDNTRJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN4Y2JpQWdJQ0FnSUdGdVoyeGxJRDBnTkRVc0lDQWdJQ0FnSXlCU2IzUmhkR1VnZUMxaGVHbHpJR3hoWW1Wc2N5QTBOU0JrWldkeVpXVnpYRzRnSUNBZ0lDQm9hblZ6ZENBOUlERXNJQ0FnSUNBZ0lDTWdRV1JxZFhOMElHaHZjbWw2YjI1MFlXd2dhblZ6ZEdsbWFXTmhkR2x2Ymx4dUlDQWdJQ0FnZG1wMWMzUWdQU0F4SUNBZ0lDQWdJQ0FqSUVGa2FuVnpkQ0IyWlhKMGFXTmhiQ0JxZFhOMGFXWnBZMkYwYVc5dVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGeGNJekF3TURBd01GeGNMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWEZ4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjWEhSeVlXNXpjR0Z5Wlc1MFhGd3BMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2tnSzJ4aFluTW9lU0E5SUZ4Y2JHOW5NaWhtWXlCdlppQnZZbk12Wlhod0tWeGNLU0FnS3lBZ0lDQmNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdNQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQmhiSEJvWVNBOUlERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCY1hHSnNZV05yWEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnYzJsNlpTQTlJR3hwYm1WVWFHbGpheXB0YlZSdlRHbHVaVlZ1YVhRc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ3cElDc2dYRzRnSUdOdmIzSmtYMk5oY25SbGMybGhiaWg1YkdsdElEMGdZeWd0TWl3Z01pa3BYRzRnSUZ4dVhHNWNiaU1qSXlNakl5TWpJeU1qSXlOY2JseHVJeU1qSUZCc2IzUjBhVzVuWEc1d015QThMU0JuWjNCc2IzUW9ZV3hzVEc5dmNITXNJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0JrYVdabVgyUlVRVWRmUkUxVFR5d2dabWxzYkNBOUlHZHliM1Z3S1NrZ0t5QmNiaUFnWjJWdmJWOTJhVzlzYVc0b2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ3dnWVd4d2FHRWdQU0F1TkN3Z0xDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FySUZ4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpNc0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU3dnSUdGc2NHaGhJRDBnTUM0MkxDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FySUZ4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QmNiaUFnYzNSaGRGOXpkVzF0WVhKNUtGeHVJQ0FnSUdGbGN5aG5jbTkxY0NBOUlHZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpeGNiaUFnSUNCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01DNDFMRnh1SUNBZ0lHWnBiR3dnUFNCY1hHSnNZV05yWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xDQndiM05wZEdsdmJpQTlJSEJ2YzJsMGFXOXVYMlJ2WkdkbEtDNHpLVnh1SUNBcElDdGNiaUFnYzJOaGJHVmZabWxzYkY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY1hHZHlaWGsxTUZ4Y0xDQmNYR2R5WlhrMU1GeGNLU2tnSzF4dVhHNGdJSFJvWlcxbEtGeHVJQ0FnSUdGNGFYTXVkR2wwYkdVdWVDQTlJR1ZzWlcxbGJuUmZZbXhoYm1zb0tTeGNiaUFnSUNCaGVHbHpMblJwZEd4bExua2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3dnSUNBZ1hHNGdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVk5MRnh1SUNBZ0lDQWdZVzVuYkdVZ1BTQTBOU3dnSUNBZ0lDQWpJRkp2ZEdGMFpTQjRMV0Y0YVhNZ2JHRmlaV3h6SURRMUlHUmxaM0psWlhOY2JpQWdJQ0FnSUdocWRYTjBJRDBnTVN3Z0lDQWdJQ0FnSXlCQlpHcDFjM1FnYUc5eWFYcHZiblJoYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0lDQjJhblZ6ZENBOUlERWdJQ0FnSUNBZ0lDTWdRV1JxZFhOMElIWmxjblJwWTJGc0lHcDFjM1JwWm1sallYUnBiMjVjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11YkdsdVpTQTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJwWTJ0eklEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcExGeHVJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGeGNkSEpoYm5Od1lYSmxiblJjWENrc1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWxjYmlBZ0tTQXJiR0ZpY3loNUlEMGdYRnpPbENCc2IyOXdJSE5qYjNKbFhGd3BJQ0FySUNBZ0lGeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lHRnNjR2hoSUQwZ01TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ4Y1lteGhZMnRjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJLbTF0Vkc5TWFXNWxWVzVwZEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bFpXNWtJRDBnWEZ4emNYVmhjbVZjWENrZ0t5QmNiaUFnWjJWdmJWOW9iR2x1WlNoNWFXNTBaWEpqWlhCMElEMGdMVEF1TWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JoYkhCb1lTQTlJREF1TlN3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjWEdKc1lXTnJYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdiR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRndzSUd4cGJtVjBlWEJsSUQwZ1hGeGtZWE5vWldSY1hDa2dLMXh1SUNCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTFRBdU5Td2dNQzQxS1NsY2JpQWdJQ0JjYmx4dUl5TWpJMXh1Y0RRZ1BDMGdaMmR3Ykc5MEtHRnNiRXh2YjNCekxDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdiRzluWDI5aWMyVjRjRjlrYVdabVgyUlVRVWRmUkUxVFR5d2dabWxzYkNBOUlHZHliM1Z3S1NrZ0t5QmNiaUFnWjJWdmJWOTJhVzlzYVc0b2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ3dnWVd4d2FHRWdQU0F1TkN3Z0xDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FySUZ4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpNc0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaWGRwWkhSb0lEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzkxZEd4cFpYSXVjMmhoY0dVZ1BTQk9RU3dnSUdGc2NHaGhJRDBnTUM0MkxDQnphRzkzTG14bFoyVnVaQ0E5SUVaQlRGTkZLU0FySUZ4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QmNiaUFnYzNSaGRGOXpkVzF0WVhKNUtGeHVJQ0FnSUdGbGN5aG5jbTkxY0NBOUlHZHliM1Z3S1N3Z1puVnVJRDBnYldWaGJpeGNiaUFnSUNCblpXOXRJRDBnWEZ4d2IybHVkRnhjTENCemFHRndaU0E5SURJeExDQnphWHBsSUQwZ01DNDFMRnh1SUNBZ0lHWnBiR3dnUFNCY1hHSnNZV05yWEZ3c0lHTnZiRzl5SUQwZ1hGeGliR0ZqYTF4Y0xDQndiM05wZEdsdmJpQTlJSEJ2YzJsMGFXOXVYMlJ2WkdkbEtDNHpLVnh1SUNBcElDdGNiaUFnYzJOaGJHVmZabWxzYkY5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnWXloY1hHZHlaWGsxTUZ4Y0xDQmNYR2R5WlhrMU1GeGNLU2tnSzF4dVhHNGdJSFJvWlcxbEtGeHVJQ0FnSUdGNGFYTXVkR2wwYkdVdWVDQTlJR1ZzWlcxbGJuUmZZbXhoYm1zb0tTeGNiaUFnSUNCaGVHbHpMblJwZEd4bExua2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3dnSUNBZ1hHNGdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVk5MRnh1SUNBZ0lDQWdZVzVuYkdVZ1BTQTBOU3dnSUNBZ0lDQWpJRkp2ZEdGMFpTQjRMV0Y0YVhNZ2JHRmlaV3h6SURRMUlHUmxaM0psWlhOY2JpQWdJQ0FnSUdocWRYTjBJRDBnTVN3Z0lDQWdJQ0FnSXlCQlpHcDFjM1FnYUc5eWFYcHZiblJoYkNCcWRYTjBhV1pwWTJGMGFXOXVYRzRnSUNBZ0lDQjJhblZ6ZENBOUlERWdJQ0FnSUNBZ0lDTWdRV1JxZFhOMElIWmxjblJwWTJGc0lHcDFjM1JwWm1sallYUnBiMjVjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11YkdsdVpTQTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJwWTJ0eklEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN4Y2JpQWdJQ0FnSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNxYlcxVWIweHBibVZWYm1sMExGeHVJQ0FnSUNBZ2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGeGNiaUFnSUNBcExGeHVJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGeGNkSEpoYm5Od1lYSmxiblJjWENrc1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWxjYmlBZ0tTQXJiR0ZpY3loNUlEMGdYRnhzYjJjeUtHWmpJRzltSUc5aWN5OWxlSEFwWEZ3cElDQXJJQ0FnSUZ4dUlDQm5aVzl0WDJoc2FXNWxLSGxwYm5SbGNtTmxjSFFnUFNBd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUdGc2NHaGhJRDBnTVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYQ2tnS3lCY2JpQWdZMjl2Y21SZlkyRnlkR1Z6YVdGdUtIbHNhVzBnUFNCaktDMHlMQ0F5S1NsY2JpQWdYRzUzYVdSMGFDQThMU0J3WVc1bGJGTnBlbVVvTWlrcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzQxS1NwdGJWUnZTVzVqYUZ4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNjbVZuVEc5dmNGTmpiM0psWm5KdmJXUlVRVWRmWkZSQlIxeGNLVnh1Y0c1bktHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5CdVoxeGNLU2tzSUhKbGN5QTlJRFl3TUN3Z2RXNXBkQ0E5SUZ4Y2FXNWNYQ3dnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NHeHZkRjluY21sa0tIQXhMQ0J3TWlrcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWEZ3dWMzWm5YRndwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEJzYjNSZlozSnBaQ2h3TVN3Z2NESXBLVnh1WkdWMkxtOW1aaWdwSUNCY2JseHVkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLRElwS20xdFZHOUpibU5vWEc1b1pXbG5hSFFnUEMwZ2NHRnVaV3hUYVhwbEtERXVOU2txYlcxVWIwbHVZMmhjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hISmxaMHh2YjNCVFkyOXlaV1p5YjIxa1ZFRkhYMEUwT0RWY1hDbGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNYQzV3Ym1kY1hDa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjWEdsdVhGd3NJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hCc2IzUmZaM0pwWkNod015d2djRFFwS1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdiRzkwWDJkeWFXUW9jRE1zSUhBMEtTbGNibVJsZGk1dlptWW9LU0FnWEc1Y2JuZHBaSFJvSUR3dElIQmhibVZzVTJsNlpTZ3lLU3B0YlZSdlNXNWphRnh1YUdWcFoyaDBJRHd0SUhCaGJtVnNVMmw2WlNneExqVXBLbTF0Vkc5SmJtTm9YRzVtYVd4bFRtRnRaU0E4TFNCd1lYTjBaVEFvWEZ4eVpXZE1iMjl3VTJOdmNtVm1jbTl0WkZSQlIxOXNiMjl3VTJOdmNtVmNYQ2xjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQnNiM1JmWjNKcFpDaHdNU3dnY0RNcEtWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3Ykc5MFgyZHlhV1FvY0RFc0lIQXpLU2xjYm1SbGRpNXZabVlvS1NBZ1hHNWNibmRwWkhSb0lEd3RJSEJoYm1Wc1UybDZaU2d5S1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3hMalVwS20xdFZHOUpibU5vWEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hGeHlaV2RNYjI5d1UyTnZjbVZtY205dFpGUkJSMTlzYjJjeVptTmNYQ2xjYm5CdVp5aG9aWEpsS0dacFowUnBjaXdnY0dGemRHVXdLR1pwYkdWT1lXMWxMQ0JjWEM1d2JtZGNYQ2twTENCeVpYTWdQU0EyTURBc0lIVnVhWFFnUFNCY1hHbHVYRndzSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQnNiM1JmWjNKcFpDaHdNaXdnY0RRcEtWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3Ykc5MFgyZHlhV1FvY0RJc0lIQTBLU2xjYm1SbGRpNXZabVlvS1NBZ1hHNWNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG4jIFVQIGxvb3Bcbmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKFYxLCBWMiwgVjYsIHNlcCA9IFxcX1xcKSlcbiMgTk8gbG9vcFxubG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoVjEsIFYyLCBWNiwgc2VwID0gXFxfXFwpKVxuIyBVUCBOT1xubG9vcC51cG5vIDwtIGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKVxuIyBET1dOIGxvb3Bcbmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb29wSUQgPSBwYXN0ZShWMSwgVjIsIFY2LCBzZXAgPSBcXF9cXCkpXG5cblxuYWxsTG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3ZcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBlbmQyLCBzZXAgPSBcXF9cXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKFxuICAgIGxvb3BJRCAlaW4lIGxvb3AudXBubyRsb29wSUQgfiBcXFVQJk5PXFwsXG4gICAgbG9vcElEICVpbiUgbG9vcC5kb3duJGxvb3BJRCB+IFxcRE9XTlxcLFxuICAgIFRSVUUgfiBOQVxuICApKSAlPiVcbiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5taW5WYWx1ZSA8LSAtNFxub2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoXFxsb29wU2NvcmVfY29uc19vYnNleHAudHN2XFwpKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTyxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPKVxuXG5hbGxMb29wcyA8LSBhbGxMb29wcyAlPiUgbGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKFxcaWRcXCkpXG5hbGxMb29wcyRncm91cCA8LSBmYWN0b3IoYWxsTG9vcHMkZ3JvdXAsIGxldmVscyA9IGMoXFxVUCZOT1xcLCBcXERPV05cXCkpXG5cblxuIyMjIFBsb3R0aW5nXG5wMSA8LSBnZ3Bsb3QoYWxsTG9vcHMsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaWZmX0E0ODVfRE1TTywgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgYWxwaGEgPSAuNCwgLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKVxuICApICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXGdyZXk1MFxcLCBcXGdyZXk1MFxcKSkgK1xuXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSxcbiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSwgICAgXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArbGFicyh5ID0gXFzOlCBsb29wIHNjb3JlXFwpICArICAgIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgKyBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTAuMixcbiAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC41KSlcbiAgICBcblxuIyMjI1xucDIgPC0gZ2dwbG90KGFsbExvb3BzLCBhZXMoeCA9IGdyb3VwLCB5ID0gbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTywgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgYWxwaGEgPSAuNCwgLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKVxuICApICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXGdyZXk1MFxcLCBcXGdyZXk1MFxcKSkgK1xuXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSxcbiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSwgICAgXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArbGFicyh5ID0gXFxsb2cyKGZjIG9mIG9icy9leHApXFwpICArICAgIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgKyBcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0yLCAyKSlcbiAgXG5cblxuIyMjIyMjIyMjIyMjI1xuXG4jIyMgUGxvdHRpbmdcbnAzIDwtIGdncGxvdChhbGxMb29wcywgYWVzKHggPSBncm91cCwgeSA9IGRpZmZfZFRBR19ETVNPLCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBhbHBoYSA9IC40LCAsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcZ3JleTUwXFwsIFxcZ3JleTUwXFwpKSArXG5cbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLFxuICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLCAgICBcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApICtsYWJzKHkgPSBcXM6UIGxvb3Agc2NvcmVcXCkgICsgICAgXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsXG4gICAgICAgICAgICAgYWxwaGEgPSAxLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLFxuICAgICAgICAgICAgIGFscGhhID0gMC41LCBcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCwgbGluZXR5cGUgPSBcXGRhc2hlZFxcKSArXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC41LCAwLjUpKVxuICAgIFxuXG4jIyMjXG5wNCA8LSBnZ3Bsb3QoYWxsTG9vcHMsIGFlcyh4ID0gZ3JvdXAsIHkgPSBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBmaWxsID0gZ3JvdXApKSArIFxuICBnZW9tX3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBhbHBoYSA9IC40LCAsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgXG4gIHRoZW1lX2NsYXNzaWMoKSArIFxuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFwsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFxcZ3JleTUwXFwsIFxcZ3JleTUwXFwpKSArXG5cbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLFxuICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsXG4gICAgICBmYW1pbHkgPSBmb250VHlwZSxcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLCAgICBcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sXG4gICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlc1xuICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb25cbiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvblxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApICtsYWJzKHkgPSBcXGxvZzIoZmMgb2Ygb2JzL2V4cClcXCkgICsgICAgXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsXG4gICAgICAgICAgICAgYWxwaGEgPSAxLFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArIFxuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTIsIDIpKVxuICBcbndpZHRoIDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxyZWdMb29wU2NvcmVmcm9tZFRBR19kVEFHXFwpXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQocDEsIHAyKSlcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKHAxLCBwMikpXG5kZXYub2ZmKCkgIFxuXG53aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxccmVnTG9vcFNjb3JlZnJvbWRUQUdfQTQ4NVxcKVxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKHAzLCBwNCkpXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChwMywgcDQpKVxuZGV2Lm9mZigpICBcblxud2lkdGggPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbmZpbGVOYW1lIDwtIHBhc3RlMChcXHJlZ0xvb3BTY29yZWZyb21kVEFHX2xvb3BTY29yZVxcKVxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKHAxLCBwMykpXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChwMSwgcDMpKVxuZGV2Lm9mZigpICBcblxud2lkdGggPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbmZpbGVOYW1lIDwtIHBhc3RlMChcXHJlZ0xvb3BTY29yZWZyb21kVEFHX2xvZzJmY1xcKVxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKHAyLCBwNCkpXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChwMiwgcDQpKVxuZGV2Lm9mZigpICBcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuIyBVUCBsb29wXG5sb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb29wSUQgPSBwYXN0ZShWMSwgVjIsIFY2LCBzZXAgPSBcXF9cXCkpXG4jIE5PIGxvb3Bcbmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGVcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKFYxLCBWMiwgVjYsIHNlcCA9IFxcX1xcKSlcbiMgVVAgTk9cbmxvb3AudXBubyA8LSBiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubylcbiMgRE9XTiBsb29wXG5sb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZVxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoVjEsIFYyLCBWNiwgc2VwID0gXFxfXFwpKVxuXG5cbmFsbExvb3BzIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2XFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShsb29wSUQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgZW5kMiwgc2VwID0gXFxfXFwpKSAlPiVcbiAgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihcbiAgICBsb29wSUQgJWluJSBsb29wLnVwbm8kbG9vcElEIH4gXFxVUCZOT1xcLFxuICAgIGxvb3BJRCAlaW4lIGxvb3AuZG93biRsb29wSUQgfiBcXERPV05cXCxcbiAgICBUUlVFIH4gTkFcbiAgKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxubWluVmFsdWUgPC0gLTRcbm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKFxcbG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdlxcKSkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSxcbiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpLFxuICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sXG4gICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTylcblxuYWxsTG9vcHMgPC0gYWxsTG9vcHMgJT4lIGxlZnRfam9pbihvYnNleHAsIGJ5ID0gYyhcXGlkXFwpKVxuYWxsTG9vcHMkZ3JvdXAgPC0gZmFjdG9yKGFsbExvb3BzJGdyb3VwLCBsZXZlbHMgPSBjKFxcVVAmTk9cXCwgXFxET1dOXFwpKVxuXG5cbiMjIyBQbG90dGluZ1xucDEgPC0gZ2dwbG90KGFsbExvb3BzLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlmZl9BNDg1X0RNU08sIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFxncmV5NTBcXCwgXFxncmV5NTBcXCkpICtcblxuICB0aGVtZShcbiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK2xhYnMoeSA9IFxczpQgbG9vcCBzY29yZVxcKSAgKyAgICBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCxcbiAgICAgICAgICAgICBhbHBoYSA9IDEsXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICsgXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0wLjIsXG4gICAgICAgICAgICAgYWxwaGEgPSAwLjUsIFxuICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgICAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcLCBsaW5ldHlwZSA9IFxcZGFzaGVkXFwpICtcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuNSkpXG4gICAgXG5cbiMjIyNcbnAyIDwtIGdncGxvdChhbGxMb29wcywgYWVzKHggPSBncm91cCwgeSA9IGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08sIGZpbGwgPSBncm91cCkpICsgXG4gIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBcbiAgdGhlbWVfY2xhc3NpYygpICsgXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sXG4gICAgZ2VvbSA9IFxccG9pbnRcXCwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSxcbiAgICBmaWxsID0gXFxibGFja1xcLCBjb2xvciA9IFxcYmxhY2tcXCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMylcbiAgKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFxncmV5NTBcXCwgXFxncmV5NTBcXCkpICtcblxuICB0aGVtZShcbiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksICAgIFxuICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzXG4gICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvblxuICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK2xhYnMoeSA9IFxcbG9nMihmYyBvZiBvYnMvZXhwKVxcKSAgKyAgICBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCxcbiAgICAgICAgICAgICBhbHBoYSA9IDEsXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwpICsgXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMiwgMikpXG4gIFxuXG5cbiMjIyMjIyMjIyMjIyNcblxuIyMjIFBsb3R0aW5nXG5wMyA8LSBnZ3Bsb3QoYWxsTG9vcHMsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaWZmX2RUQUdfRE1TTywgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgYWxwaGEgPSAuNCwgLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKVxuICApICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXGdyZXk1MFxcLCBcXGdyZXk1MFxcKSkgK1xuXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSxcbiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSwgICAgXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArbGFicyh5ID0gXFzOlCBsb29wIHNjb3JlXFwpICArICAgIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgKyBcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTAuMixcbiAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgXG4gICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICAgICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFwsIGxpbmV0eXBlID0gXFxkYXNoZWRcXCkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC41KSlcbiAgICBcblxuIyMjI1xucDQgPC0gZ2dwbG90KGFsbExvb3BzLCBhZXMoeCA9IGdyb3VwLCB5ID0gbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZmlsbCA9IGdyb3VwKSkgKyBcbiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCwgYWxwaGEgPSAuNCwgLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIFxuICB0aGVtZV9jbGFzc2ljKCkgKyBcbiAgc3RhdF9zdW1tYXJ5KFxuICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKVxuICApICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXGdyZXk1MFxcLCBcXGdyZXk1MFxcKSkgK1xuXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSxcbiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSwgICAgXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXNcbiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uXG4gICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb25cbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArbGFicyh5ID0gXFxsb2cyKGZjIG9mIG9icy9leHApXFwpICArICAgIFxuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLFxuICAgICAgICAgICAgIGFscGhhID0gMSxcbiAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCxcbiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgICAgICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXCkgKyBcbiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0yLCAyKSlcbiAgXG53aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxccmVnTG9vcFNjb3JlZnJvbWRUQUdfZFRBR1xcKVxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocGxvdF9ncmlkKHAxLCBwMikpXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChwMSwgcDIpKVxuZGV2Lm9mZigpICBcblxud2lkdGggPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2hcbmZpbGVOYW1lIDwtIHBhc3RlMChcXHJlZ0xvb3BTY29yZWZyb21kVEFHX0E0ODVcXClcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChwMywgcDQpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQocDMsIHA0KSlcbmRldi5vZmYoKSAgXG5cbndpZHRoIDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxyZWdMb29wU2NvcmVmcm9tZFRBR19sb29wU2NvcmVcXClcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChwMSwgcDMpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQocDEsIHAzKSlcbmRldi5vZmYoKSAgXG5cbndpZHRoIDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxyZWdMb29wU2NvcmVmcm9tZFRBR19sb2cyZmNcXClcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHBsb3RfZ3JpZChwMiwgcDQpKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwbG90X2dyaWQocDIsIHA0KSlcbmRldi5vZmYoKSAgXG5cbmBgYFxuYGBgIn0= -->

```r
```r
name <- \chromo_cons_annoHierarchy\
# UP loop
loop.up <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_UP_diff0.2.bedpe\)) %>%
  dplyr::mutate(loopID = paste(V1, V2, V6, sep = \_\))
# NO loop
loop.no <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_NO_diff0.2.bedpe\)) %>%
  dplyr::mutate(loopID = paste(V1, V2, V6, sep = \_\))
# UP NO
loop.upno <- bind_rows(loop.up, loop.no)
# DOWN loop
loop.down <- fread(here(consensusDir, \chromo_cons_annoHierarchy_pe-pe_dTAGvsDMSO_DOWN_diff0.2.bedpe\)) %>%
  dplyr::mutate(loopID = paste(V1, V2, V6, sep = \_\))


allLoops <- fread(here(consensusDir, \chromo_cons_annoHierarchy.tsv\)) %>%
  dplyr::mutate(loopID = paste(chrom1, start1, end2, sep = \_\)) %>%
  dplyr::mutate(group = case_when(
    loopID %in% loop.upno$loopID ~ \UP&NO\,
    loopID %in% loop.down$loopID ~ \DOWN\,
    TRUE ~ NA
  )) %>%
  dplyr::filter(!is.na(group))

minValue <- -4
obsexp <- fread(here(consensusDir, paste0(\loopScore_cons_obsexp.tsv\))) %>%
  dplyr::mutate(log_obsexp_DMSO = if_else(obsexp_DMSO == 0, minValue, log2(obsexp_DMSO)),
                log_obsexp_dTAG = if_else(obsexp_dTAG == 0, minValue, log2(obsexp_dTAG)),
                log_obsexp_A485 = if_else(obsexp_A485 == 0, minValue, log2(obsexp_A485)),
                log_obsexp_diff_dTAG_DMSO = log_obsexp_dTAG - log_obsexp_DMSO,
                log_obsexp_diff_A485_DMSO = log_obsexp_A485 - log_obsexp_DMSO)

allLoops <- allLoops %>% left_join(obsexp, by = c(\id\))
allLoops$group <- factor(allLoops$group, levels = c(\UP&NO\, \DOWN\))


### Plotting
p1 <- ggplot(allLoops, aes(x = group, y = diff_A485_DMSO, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  scale_fill_manual(values = c(\grey50\, \grey50\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \Δ loop score\)  +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  geom_hline(yintercept = -0.2,
             alpha = 0.5, 
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\, linetype = \dashed\) +
  coord_cartesian(ylim = c(-0.5, 0.5))
    

####
p2 <- ggplot(allLoops, aes(x = group, y = log_obsexp_diff_A485_DMSO, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  scale_fill_manual(values = c(\grey50\, \grey50\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \log2(fc of obs/exp)\)  +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  coord_cartesian(ylim = c(-2, 2))
  


#############

### Plotting
p3 <- ggplot(allLoops, aes(x = group, y = diff_dTAG_DMSO, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  scale_fill_manual(values = c(\grey50\, \grey50\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \Δ loop score\)  +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  geom_hline(yintercept = -0.2,
             alpha = 0.5, 
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\, linetype = \dashed\) +
  coord_cartesian(ylim = c(-0.5, 0.5))
    

####
p4 <- ggplot(allLoops, aes(x = group, y = log_obsexp_diff_dTAG_DMSO, fill = group)) + 
  geom_violin(linewidth = lineThick * mmToLineUnit, lineend = \square\, alpha = .4, , show.legend = FALSE) + 
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineThick * mmToLineUnit, lineend = \square\,
               outlier.shape = NA,  alpha = 0.6, show.legend = FALSE) + 
  theme_classic() + 
  stat_summary(
    aes(group = group), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\, position = position_dodge(.3)
  ) +
  scale_fill_manual(values = c(\grey50\, \grey50\)) +

  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_text(
      size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),    
    axis.text.x = element_text(
      size = fontSizeM,
      angle = 45,      # Rotate x-axis labels 45 degrees
      hjust = 1,       # Adjust horizontal justification
      vjust = 1        # Adjust vertical justification
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +labs(y = \log2(fc of obs/exp)\)  +    
  geom_hline(yintercept = 0,
             alpha = 1,
             color = \black\,
             size = lineThick*mmToLineUnit,
             lineend = \square\) + 
  coord_cartesian(ylim = c(-2, 2))
  
width <- panelSize(2)*mmToInch
height <- panelSize(1.5)*mmToInch
fileName <- paste0(\regLoopScorefromdTAG_dTAG\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(plot_grid(p1, p2))
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(plot_grid(p1, p2))
dev.off()  

width <- panelSize(2)*mmToInch
height <- panelSize(1.5)*mmToInch
fileName <- paste0(\regLoopScorefromdTAG_A485\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(plot_grid(p3, p4))
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(plot_grid(p3, p4))
dev.off()  

width <- panelSize(2)*mmToInch
height <- panelSize(1.5)*mmToInch
fileName <- paste0(\regLoopScorefromdTAG_loopScore\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(plot_grid(p1, p3))
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(plot_grid(p1, p3))
dev.off()  

width <- panelSize(2)*mmToInch
height <- panelSize(1.5)*mmToInch
fileName <- paste0(\regLoopScorefromdTAG_log2fc\)
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(plot_grid(p2, p4))
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(plot_grid(p2, p4))
dev.off()  

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzV3WldGckxsSkJSREl4SUR3dElHbHRjRzl5ZEZCbFlXc29hR1Z5WlNoeVpXWkVhWElzSUZ3aU16TXlOVEJmVWtGRU1qRmZZV0k1T1RKZlFuSjFZMlV0TkY5d1pXRnJjeTV0WlhKblpWQmxZV3N1WW1Wa1hDSXBLVnh1WEc0akl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpYRzVtYkdGdWExTnBlbVVnUEMwZ05UQXdNRnh1WjJWdVpTNTBZaUE4TFNCbWNtVmhaQ2hvWlhKbEtISmxaa1JwY2l3Z1hDSnRiVEV3WDBkU1EyMHpPQzV3Tmw5blpXNWxYM052Y25SbFpDNWlaV1JjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRlJUVXlBOUlHbG1aV3h6WlNoV05DQTlQU0JjSWl0Y0lpd2dWaklzSUZZektTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVMU56ZEdGeWRDQTlJRlJUVXlBdElHWnNZVzVyVTJsNlpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlVVMU5sYm1RZ1BTQlVVMU1nS3lCbWJHRnVhMU5wZW1VcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLRlkyTENCV05Td2dWakVzSUZSVFUzTjBZWEowTENCVVUxTmxibVFwWEc1amIyeHVZVzFsY3loblpXNWxMblJpS1NBOExTQmpLRndpWlc1elpXMWliRjluWlc1bFgybGtYQ0lzSUZ3aVpYaDBaWEp1WVd4ZloyVnVaVjl1WVcxbFhDSXNJRndpWTJoeVhDSXNJRndpYzNSaGNuUmNJaXdnWENKbGJtUmNJaWxjYmx4dVhHNGpJRU52Ym5abGNuUWdaMlZ1WlM1MFlpQjBieUJoSUVkU1lXNW5aWE1nYjJKcVpXTjBYRzVuWlc1bFgyZHlJRHd0SUVkU1lXNW5aWE1vWEc0Z0lITmxjVzVoYldWeklEMGdaMlZ1WlM1MFlpUmphSElzWEc0Z0lISmhibWRsY3lBOUlFbFNZVzVuWlhNb2MzUmhjblFnUFNCblpXNWxMblJpSkhOMFlYSjBMQ0JsYm1RZ1BTQm5aVzVsTG5SaUpHVnVaQ2tzWEc0Z0lHZGxibVZmYVdRZ1BTQm5aVzVsTG5SaUpHVnVjMlZ0WW14ZloyVnVaVjlwWkZ4dUtWeHVYRzRqSUVOdmRXNTBJRzkyWlhKc1lYQnpJR0psZEhkbFpXNGdjR1ZoYTNNZ1lXNWtJR2RsYm1WelhHNXZkbVZ5YkdGd1gyTnZkVzUwY3lBOExTQmpiM1Z1ZEU5MlpYSnNZWEJ6S0dkbGJtVmZaM0lzSUhCbFlXc3VVa0ZFTWpFcFhHNWNiaU1nUVdSa0lHOTJaWEpzWVhBZ1kyOTFiblJ6SUhSdklIUm9aU0J2Y21sbmFXNWhiQ0JuWlc1bExuUmlJR1JoZEdGY2JtZGxibVV1ZEdJa2NHVmhhMTlqYjNWdWRDQThMU0J2ZG1WeWJHRndYMk52ZFc1MGMxeHVYRzRqSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpYRzVjYm5CbFlXdE9kVzB3SUR3dElDaG5aVzVsTG5SaUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIQmxZV3RmWTI5MWJuUWdQVDBnTUNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkZ4dWNHVmhhMDUxYlRFZ1BDMGdLR2RsYm1VdWRHSWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9jR1ZoYTE5amIzVnVkQ0E5UFNBeEtTa2taVzV6WlcxaWJGOW5aVzVsWDJsa1hHNXdaV0ZyVG5WdE1pQThMU0FvWjJWdVpTNTBZaUFsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3WldGclgyTnZkVzUwSUQwOUlESXBLU1JsYm5ObGJXSnNYMmRsYm1WZmFXUmNibkJsWVd0T2RXMHpJRHd0SUNoblpXNWxMblJpSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hCbFlXdGZZMjkxYm5RZ1BUMGdNeWtwSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1Y0dWaGEwNTFiVTkyWlhJMElEd3RJQ2huWlc1bExuUmlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSEJsWVd0ZlkyOTFiblFnUGowZ05Da3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVYRzVjYmlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU5jYm01aGJXVWdQQzBnWENKamFISnZiVzlmWTI5dWMxOWhibTV2U0dsbGNtRnlZMmg1WENKY2JseHVZV3h3YUdFZ1BDMGdNQzR3TlZ4dVptTkRkWFJ2Wm1ZZ1BDMGdNQzQxWEc1a2FXWm1MbEpPUVM1SE1TNWtWRUZISUR3dElHWnlaV0ZrS0dobGNtVW9jbVZtUkdseUxDQmNJbVJwWm1aZlJ6RXVaRlJCUjE5SE1TNHlhUzVrVkVGSFgzWnpYMGN4TGpKcExrUk5VMDh1ZEhOMlhDSXBLU0FsUGlWY2JpQWdaSEJzZVhJNk9tWnBiSFJsY2lod1lXUnFJRHdnWVd4d2FHRXNJR0ZpY3loemFISnBibXRsWkY5c2IyY3lSa01wSUQ0Z1ptTkRkWFJ2Wm1ZcFhHNWthV1ptTGxKT1FTNUhNUzVrVkVGSExtNXZSa05qZFhSdlptWWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVpHbG1abDlITVM1a1ZFRkhYMGN4TGpKcExtUlVRVWRmZG5OZlJ6RXVNbWt1UkUxVFR5NTBjM1pjSWlrcElDVStKVnh1SUNCa2NHeDVjam82Wm1sc2RHVnlLSEJoWkdvZ1BDQmhiSEJvWVNsY2JtZGxibVZCYm01dlJHRjBZU0E4TFNCc2IyRmtURzl2Y0VGdWJtOUVZWFJoS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYQ0pmY0MxdVgyVnVjMlZ0WW14TWFYTjBMblJ6ZGx3aUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdScFptWkRkWFJ2Wm1ZZ1BTQXdMaklzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnVibTlNYVhOMElEMGdZeWhjSWxBdFVGd2lMQ0JjSWxBdFJWd2lMQ0JjSWxBdFUxd2lMQ0JjSWxBdFdGd2lLU2tsUGlVZ1hHNGdJR1J3YkhseU9qcHRkWFJoZEdVb1pHbHpkR0Z1WTJVZ1BTQnpkR0Z5ZERJZ0xTQnpkR0Z5ZERFc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NHVmhhMGxFSUQwZ2NHRnpkR1VvWTJoeWIyMHhMQ0J6ZEdGeWRERXNJSE4wWVhKME1pd2djMlZ3SUQwZ1hDSmZYQ0lwS1Z4dVhHNWNiaU1qSUVScGRtbGthVzVuSUdkbGJtVnpJR2x1ZEc4Z1ozSnZkWEJ6WEc1MFpXMXdJRHd0SUdkbGJtVkJibTV2UkdGMFlTQWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGthV1ptWDJSVVFVZGZSRTFUVHl3Z1pHbHpkR0Z1WTJVc0lHZGxibVVwSUNVK0pTQmNiaUFnZFc1dVpYTjBLR2RsYm1VcElDVStKU0JuY205MWNGOWllU2huWlc1bEtTQWxQaVZjYmlBZ2MzVnRiV0Z5YVhwbEtHMWxZVzVmWkdsbVpsOXpZMjl5WlNBOUlHMWxZVzRvWkdsbVpsOWtWRUZIWDBSTlUwOHBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2JXVmhibDlrYVhOMFlXNWpaU0E5SUcxbFlXNG9aR2x6ZEdGdVkyVXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0xtZHliM1Z3Y3lBOUlDZGtjbTl3SnlsY2JseHVaR2xtWmk1U1RrRWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVpHbG1abDlITVM1a1ZFRkhYMGN4TGpKcExtUlVRVWRmZG5OZlJ6RXVNbWt1UkUxVFR5NTBjM1pjSWlrcElDVStKVnh1SUNCa2NHeDVjam82YzJWc1pXTjBLR1Z1YzJWdFlteGZaMlZ1WlY5cFpDd2diRzluTWtadmJHUkRhR0Z1WjJVc0lITm9jbWx1YTJWa1gyeHZaekpHUXl3Z2NHRmthaXdnWlhoMFpYSnVZV3hmWjJWdVpWOXVZVzFsS1Z4dVhHNXRZWGhNYjJjeVJrTWdQU0F5WEc1Y2JuUmxiWEFnUEMwZ2JHVm1kRjlxYjJsdUtIUmxiWEFzSUdScFptWXVVazVCTENCaWVTQTlJR01vWENKblpXNWxYQ0lnUFNCY0ltVnVjMlZ0WW14ZloyVnVaVjlwWkZ3aUtTa2dKVDRsSUZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0dac1lXY2dQU0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJR1JwWm1ZdVVrNUJMa2N4TG1SVVFVY2taVzV6WlcxaWJGOW5aVzVsWDJsa0xDQmNJakpFVDFkT1hDSXNJRndpTUU1UFhDSXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzFoZUVac1lXY2dQU0FvWVdKektITm9jbWx1YTJWa1gyeHZaekpHUXlrZ1BpQnRZWGhNYjJjeVJrTXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3h2WnpKbVkwMWhlQ0E5SUhCdFlYZ29jRzFwYmloemFISnBibXRsWkY5c2IyY3lSa01zSUcxaGVFeHZaekpHUXlrc0lDMXRZWGhNYjJjeVJrTXBLU0FsUGlVZ1hHNGdJR1J3YkhseU9qcGhjbkpoYm1kbEtHWnNZV2NwSUNVK0pWeHVJQ0JrY205d1gyNWhLSE5vY21sdWEyVmtYMnh2WnpKR1F5bGNibHh1ZEdWdGNDQThMU0IwWlcxd0lDVStKU0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0J3Yms5MlpYSWdQU0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJSEJsWVd0T2RXMHdMQ0JjSW5CbFlXdE9kVzB3WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVZzYzJVb1oyVnVaU0FsYVc0bElIQmxZV3RPZFcweExDQmNJbkJsWVd0T2RXMHhYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdabGJITmxLR2RsYm1VZ0pXbHVKU0J3WldGclRuVnRNaXdnWENKd1pXRnJUblZ0TWx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUhCbFlXdE9kVzB6TENCY0luQmxZV3RPZFcwelhDSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUhCbFlXdE9kVzFQZG1WeU5Dd2dYQ0p3WldGclRuVnRUM1psY2pSY0lpd2dUa0VwS1NrcEtTa2dKVDRsWEc0Z0lHUnliM0JmYm1Fb2NHNVBkbVZ5S1Z4dVhHNGpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNalhHNGpJRU5vWldOcmFXNW5JSEJsY21ObGJuUmhaMlVnYjJZZ1oyVnVaWE1nZDJsMGFDQlNRVVF5TVNCd1pXRnJjMXh1WjNKdmRYQXhJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjlpYVc1aGNubEhjbTkxY0RFdWRITjJYQ0lwS1NSblpXNWxYRzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMkpwYm1GeWVVZHliM1Z3TWk1MGMzWmNJaWtwSkdkbGJtVmNibHh1WVdGaElEd3RJSFJsYlhBZ0pUNGxJR1J3YkhseU9qcHRkWFJoZEdVb1ozSnZkWEFnUFNCallYTmxYM2RvWlc0b1hHNGdJR2RsYm1VZ0pXbHVKU0JuY205MWNERWdmaUJjSW1keWIzVndNVndpTEZ4dUlDQm5aVzVsSUNWcGJpVWdaM0p2ZFhBeUlINGdYQ0puY205MWNESmNJaXhjYmlBZ1ZGSlZSU0IrSUU1QlhHNHBLU0FsUGlWY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobmNtOTFjQ3dnY0c1UGRtVnlMQ0JuWlc1bEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQWxhVzRsSUdNb1hDSm5jbTkxY0RGY0lpd2dYQ0puY205MWNESmNJaWtwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtHaGhjMUJsWVdzZ1BTQnBabVZzYzJVb2NHNVBkbVZ5SUQwOUlGd2ljR1ZoYTA1MWJUQmNJaXdnUmtGTVUwVXNJRlJTVlVVcEtWeHVYRzVpWW1JZ1BDMGdZV0ZoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SUZ3aVozSnZkWEF4WENJcElGeHVYRzV6ZFcwb1ltSmlKR2hoYzFCbFlXc3BYRzVpWW1JZ1BDMGdZV0ZoSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0dkeWIzVndJRDA5SUZ3aVozSnZkWEF5WENJcElGeHVjM1Z0S0dKaVlpUm9ZWE5RWldGcktWeHVYRzVoWVdGZmMzVnRiV0Z5ZVNBOExTQmhZV0VnSlQ0bFhHNGdJR2R5YjNWd1gySjVLR2R5YjNWd0xDQndiazkyWlhJcElDVStKVnh1SUNCemRXMXRZWEpwZW1Vb1kyOTFiblFnUFNCdUtDa3NJQzVuY205MWNITWdQU0JjSW1SeWIzQmNJaWxjYmx4dUl5QkRjbVZoZEdVZ2RHaGxJSE4wWVdOclpXUWdZbUZ5Y0d4dmRGeHVZV0ZoWDNOMWJXMWhjbmtnUEMwZ1lXRmhJQ1UrSlZ4dUlDQm5jbTkxY0Y5aWVTaG5jbTkxY0N3Z2NHNVBkbVZ5S1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0dOdmRXNTBJRDBnYmlncExDQXVaM0p2ZFhCeklEMGdYQ0prY205d1hDSXBJQ1UrSlZ4dUlDQm5jbTkxY0Y5aWVTaG5jbTkxY0NrZ0pUNGxYRzRnSUcxMWRHRjBaU2h5WVhScGJ5QTlJR052ZFc1MElDOGdjM1Z0S0dOdmRXNTBLU2xjYmx4dUl5QkVaV1pwYm1VZ2RHaGxJR2R5WVdScFpXNTBJR052Ykc5eWMxeHVaM0poWkdsbGJuUmZZMjlzYjNKeklEd3RJR01vWENJalJEUkVORVEwWENJc0lGd2lJMFJEUWpCQlJsd2lMQ0JjSWlORk5EaEVPRUZjSWl3Z1hDSWpSVU0yT1RZMVhDSXNJRndpSTBZME5EWTBNVndpS1Z4dUl5Qm5jbUZrYVdWdWRGOWpiMnh2Y25NZ1BDMGdZeWhjSWlORU5FUTBSRFJjSWl3Z1hDSWpRVEpDUWtOQlhDSXNJRndpSXpjeFFUSkRNRndpTENCY0lpTXpSamc1UWpkY0lpd2dYQ0lqTUVVM01VRkVYQ0lwWEc1Y2JpTWdRM0psWVhSbElIUm9aU0J6ZEdGamEyVmtJR0poY25Cc2IzUWdkMmwwYUNCbmNtRmthV1Z1ZENCamIyeHZjbk5jYm5BZ1BDMGdaMmR3Ykc5MEtHRmhZVjl6ZFcxdFlYSjVMQ0JoWlhNb2VDQTlJR2R5YjNWd0xDQjVJRDBnY21GMGFXOHNJR1pwYkd3Z1BTQndiazkyWlhJcEtTQXJYRzRnSUdkbGIyMWZZbUZ5S0hOMFlYUWdQU0JjSW1sa1pXNTBhWFI1WENJc0lIQnZjMmwwYVc5dUlEMGdYQ0p6ZEdGamExd2lMRnh1SUNBZ0lDQWdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVFdWa2FYVnRJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJaWtnSzF4dUlDQjBhR1Z0WlY5amJHRnpjMmxqS0NrZ0t5QnNZV0p6S0hnZ1BTQk9WVXhNSUN3Z2VTQTlJRndpVW1GMGFXOWNJaWtnSzF4dUlDQjBhR1Z0WlNoY2JpQWdJQ0JoZUdsekxuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLRnh1SUNBZ0lDQWdjMmw2WlNBOUlHWnZiblJUYVhwbFRTd2dabUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0pjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1zSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWENJak1EQXdNREF3WENJc0lITnBlbVVnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY0luTnhkV0Z5WlZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0J3WVc1bGJDNWlZV05yWjNKdmRXNWtJRDBnWld4bGJXVnVkRjl5WldOMEtHWnBiR3dnUFNCY0luUnlZVzV6Y0dGeVpXNTBYQ0lwTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNrZ0sxeHVJQ0J6WTJGc1pWOW1hV3hzWDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JuY21Ga2FXVnVkRjlqYjJ4dmNuTXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbmRXbGtaU0E5SUdkMWFXUmxYMnhsWjJWdVpDaGNiaUFnSUNBZ0lHOTJaWEp5YVdSbExtRmxjeUE5SUd4cGMzUW9jMmw2WlNBOUlEQXVOU2tzSUNNZ1FXUnFkWE4wSUd4bFoyVnVaQ0JyWlhrZ2MzbHRZbTlzSUhOcGVtVmNiaUFnSUNBZ0lHdGxlWGRwWkhSb0lEMGdNaUF2SURJdU5UUXNJQ01nUTI5dWRtVnlkQ0F5YlcwZ2RHOGdZMjFjYmlBZ0lDQWdJR3RsZVdobGFXZG9kQ0E5SURJZ0x5QXlMalUwSUNNZ1EyOXVkbVZ5ZENBeWJXMGdkRzhnWTIxY2JpQWdJQ0FwS1NCY2JseHVkMmxrZEdnZ1BDMGdjR0Z1Wld4VGFYcGxLREV1TnlrcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExTQndZVzVsYkZOcGVtVW9NUzR6S1NwdGJWUnZTVzVqYUZ4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2ljbUZrTWpGd1pYSmpYM0J5YjIxdmRHVnlYQ0lwWEc1emRtZHNhWFJsS0dobGNtVW9abWxuUkdseUxDQndZWE4wWlRBb1ptbHNaVTVoYldVc0lGd2lMbk4yWjF3aUtTa3NJQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BJQ0JjYmx4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5cbnBlYWsuUkFEMjEgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbmZsYW5rU2l6ZSA8LSA1MDAwXG5nZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXG1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZFxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09IFxcK1xcLCBWMiwgVjMpLFxuICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLFxuICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoVjYsIFY1LCBWMSwgVFNTc3RhcnQsIFRTU2VuZClcbmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoXFxlbnNlbWJsX2dlbmVfaWRcXCwgXFxleHRlcm5hbF9nZW5lX25hbWVcXCwgXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcKVxuXG5cbiMgQ29udmVydCBnZW5lLnRiIHRvIGEgR1JhbmdlcyBvYmplY3RcbmdlbmVfZ3IgPC0gR1JhbmdlcyhcbiAgc2VxbmFtZXMgPSBnZW5lLnRiJGNocixcbiAgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGdlbmUudGIkc3RhcnQsIGVuZCA9IGdlbmUudGIkZW5kKSxcbiAgZ2VuZV9pZCA9IGdlbmUudGIkZW5zZW1ibF9nZW5lX2lkXG4pXG5cbiMgQ291bnQgb3ZlcmxhcHMgYmV0d2VlbiBwZWFrcyBhbmQgZ2VuZXNcbm92ZXJsYXBfY291bnRzIDwtIGNvdW50T3ZlcmxhcHMoZ2VuZV9nciwgcGVhay5SQUQyMSlcblxuIyBBZGQgb3ZlcmxhcCBjb3VudHMgdG8gdGhlIG9yaWdpbmFsIGdlbmUudGIgZGF0YVxuZ2VuZS50YiRwZWFrX2NvdW50IDwtIG92ZXJsYXBfY291bnRzXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxucGVha051bTAgPC0gKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIocGVha19jb3VudCA9PSAwKSkkZW5zZW1ibF9nZW5lX2lkXG5wZWFrTnVtMSA8LSAoZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihwZWFrX2NvdW50ID09IDEpKSRlbnNlbWJsX2dlbmVfaWRcbnBlYWtOdW0yIDwtIChnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKHBlYWtfY291bnQgPT0gMikpJGVuc2VtYmxfZ2VuZV9pZFxucGVha051bTMgPC0gKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIocGVha19jb3VudCA9PSAzKSkkZW5zZW1ibF9nZW5lX2lkXG5wZWFrTnVtT3ZlcjQgPC0gKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIocGVha19jb3VudCA+PSA0KSkkZW5zZW1ibF9nZW5lX2lkXG5cblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5hbHBoYSA8LSAwLjA1XG5mY0N1dG9mZiA8LSAwLjVcbmRpZmYuUk5BLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZilcbmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKVxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1QXFwsIFxcUC1FXFwsIFxcUC1TXFwsIFxcUC1YXFwpKSU+JSBcbiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSxcbiAgICAgICAgICAgICAgICBwZWFrSUQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSBcXF9cXCkpXG5cblxuIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHNcbnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIFxuICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JVxuICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksXG4gICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksXG4gICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKVxuXG5kaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdlxcKSkgJT4lXG4gIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpXG5cbm1heExvZzJGQyA9IDJcblxudGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYyhcXGdlbmVcXCA9IFxcZW5zZW1ibF9nZW5lX2lkXFwpKSAlPiUgXG4gIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZGlmZi5STkEuRzEuZFRBRyRlbnNlbWJsX2dlbmVfaWQsIFxcMkRPV05cXCwgXFwwTk9cXCksXG4gICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksXG4gICAgICAgICAgICAgICAgbG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSBcbiAgZHBseXI6OmFycmFuZ2UoZmxhZykgJT4lXG4gIGRyb3BfbmEoc2hyaW5rZWRfbG9nMkZDKVxuXG50ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHBuT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcGVha051bTAsIFxccGVha051bTBcXCxcbiAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcGVha051bTEsIFxccGVha051bTFcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBlYWtOdW0yLCBcXHBlYWtOdW0yXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcGVha051bTMsIFxccGVha051bTNcXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcGVha051bU92ZXI0LCBcXHBlYWtOdW1PdmVyNFxcLCBOQSkpKSkpKSAlPiVcbiAgZHJvcF9uYShwbk92ZXIpXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgQ2hlY2tpbmcgcGVyY2VudGFnZSBvZiBnZW5lcyB3aXRoIFJBRDIxIHBlYWtzXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5hYWEgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihcbiAgZ2VuZSAlaW4lIGdyb3VwMSB+IFxcZ3JvdXAxXFwsXG4gIGdlbmUgJWluJSBncm91cDIgfiBcXGdyb3VwMlxcLFxuICBUUlVFIH4gTkFcbikpICU+JVxuICBkcGx5cjo6c2VsZWN0KGdyb3VwLCBwbk92ZXIsIGdlbmUpICU+JVxuICBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYyhcXGdyb3VwMVxcLCBcXGdyb3VwMlxcKSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoaGFzUGVhayA9IGlmZWxzZShwbk92ZXIgPT0gXFxwZWFrTnVtMFxcLCBGQUxTRSwgVFJVRSkpXG5cbmJiYiA8LSBhYWEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDFcXCkgXG5cbnN1bShiYmIkaGFzUGVhaylcbmJiYiA8LSBhYWEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxncm91cDJcXCkgXG5zdW0oYmJiJGhhc1BlYWspXG5cbmFhYV9zdW1tYXJ5IDwtIGFhYSAlPiVcbiAgZ3JvdXBfYnkoZ3JvdXAsIHBuT3ZlcikgJT4lXG4gIHN1bW1hcml6ZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9IFxcZHJvcFxcKVxuXG4jIENyZWF0ZSB0aGUgc3RhY2tlZCBiYXJwbG90XG5hYWFfc3VtbWFyeSA8LSBhYWEgJT4lXG4gIGdyb3VwX2J5KGdyb3VwLCBwbk92ZXIpICU+JVxuICBzdW1tYXJpemUoY291bnQgPSBuKCksIC5ncm91cHMgPSBcXGRyb3BcXCkgJT4lXG4gIGdyb3VwX2J5KGdyb3VwKSAlPiVcbiAgbXV0YXRlKHJhdGlvID0gY291bnQgLyBzdW0oY291bnQpKVxuXG4jIERlZmluZSB0aGUgZ3JhZGllbnQgY29sb3JzXG5ncmFkaWVudF9jb2xvcnMgPC0gYyhcXCNENEQ0RDRcXCwgXFwjRENCMEFGXFwsIFxcI0U0OEQ4QVxcLCBcXCNFQzY5NjVcXCwgXFwjRjQ0NjQxXFwpXG4jIGdyYWRpZW50X2NvbG9ycyA8LSBjKFxcI0Q0RDRENFxcLCBcXCNBMkJCQ0FcXCwgXFwjNzFBMkMwXFwsIFxcIzNGODlCN1xcLCBcXCMwRTcxQURcXClcblxuIyBDcmVhdGUgdGhlIHN0YWNrZWQgYmFycGxvdCB3aXRoIGdyYWRpZW50IGNvbG9yc1xucCA8LSBnZ3Bsb3QoYWFhX3N1bW1hcnksIGFlcyh4ID0gZ3JvdXAsIHkgPSByYXRpbywgZmlsbCA9IHBuT3ZlcikpICtcbiAgZ2VvbV9iYXIoc3RhdCA9IFxcaWRlbnRpdHlcXCwgcG9zaXRpb24gPSBcXHN0YWNrXFwsXG4gICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxSYXRpb1xcKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGdyYWRpZW50X2NvbG9ycywgXG4gICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKFxuICAgICAgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMC41KSwgIyBBZGp1c3QgbGVnZW5kIGtleSBzeW1ib2wgc2l6ZVxuICAgICAga2V5d2lkdGggPSAyIC8gMi41NCwgIyBDb252ZXJ0IDJtbSB0byBjbVxuICAgICAga2V5aGVpZ2h0ID0gMiAvIDIuNTQgIyBDb252ZXJ0IDJtbSB0byBjbVxuICAgICkpIFxuXG53aWR0aCA8LSBwYW5lbFNpemUoMS43KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjMpKm1tVG9JbmNoXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxyYWQyMXBlcmNfcHJvbW90ZXJcXClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKCkgIFxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->

peak.RAD21 <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))

##########################################################
flankSize <- 5000
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V6, V5, V1, TSSstart, TSSend)
colnames(gene.tb) <- c(\ensembl_gene_id\, \external_gene_name\, \chr\, \start\, \end\)


# Convert gene.tb to a GRanges object
gene_gr <- GRanges(
  seqnames = gene.tb$chr,
  ranges = IRanges(start = gene.tb$start, end = gene.tb$end),
  gene_id = gene.tb$ensembl_gene_id
)

# Count overlaps between peaks and genes
overlap_counts <- countOverlaps(gene_gr, peak.RAD21)

# Add overlap counts to the original gene.tb data
gene.tb$peak_count <- overlap_counts

###############################################################################

peakNum0 <- (gene.tb %>% dplyr::filter(peak_count == 0))$ensembl_gene_id
peakNum1 <- (gene.tb %>% dplyr::filter(peak_count == 1))$ensembl_gene_id
peakNum2 <- (gene.tb %>% dplyr::filter(peak_count == 2))$ensembl_gene_id
peakNum3 <- (gene.tb %>% dplyr::filter(peak_count == 3))$ensembl_gene_id
peakNumOver4 <- (gene.tb %>% dplyr::filter(peak_count >= 4))$ensembl_gene_id


###############################################################################
name <- \chromo_cons_annoHierarchy\

alpha <- 0.05
fcCutoff <- 0.5
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))


## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% diff.RNA.G1.dTAG$ensembl_gene_id, \2DOWN\, \0NO\),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                log2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag) %>%
  drop_na(shrinked_log2FC)

temp <- temp %>% dplyr::mutate(
  pnOver = ifelse(gene %in% peakNum0, \peakNum0\,
                  ifelse(gene %in% peakNum1, \peakNum1\,
                         ifelse(gene %in% peakNum2, \peakNum2\,
                                ifelse(gene %in% peakNum3, \peakNum3\,
                                       ifelse(gene %in% peakNumOver4, \peakNumOver4\, NA)))))) %>%
  drop_na(pnOver)

###############################################################################
# Checking percentage of genes with RAD21 peaks
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

aaa <- temp %>% dplyr::mutate(group = case_when(
  gene %in% group1 ~ \group1\,
  gene %in% group2 ~ \group2\,
  TRUE ~ NA
)) %>%
  dplyr::select(group, pnOver, gene) %>%
  dplyr::filter(group %in% c(\group1\, \group2\)) %>%
  dplyr::mutate(hasPeak = ifelse(pnOver == \peakNum0\, FALSE, TRUE))

bbb <- aaa %>% dplyr::filter(group == \group1\) 

sum(bbb$hasPeak)
bbb <- aaa %>% dplyr::filter(group == \group2\) 
sum(bbb$hasPeak)

aaa_summary <- aaa %>%
  group_by(group, pnOver) %>%
  summarize(count = n(), .groups = \drop\)

# Create the stacked barplot
aaa_summary <- aaa %>%
  group_by(group, pnOver) %>%
  summarize(count = n(), .groups = \drop\) %>%
  group_by(group) %>%
  mutate(ratio = count / sum(count))

# Define the gradient colors
gradient_colors <- c(\#D4D4D4\, \#DCB0AF\, \#E48D8A\, \#EC6965\, \#F44641\)
# gradient_colors <- c(\#D4D4D4\, \#A2BBCA\, \#71A2C0\, \#3F89B7\, \#0E71AD\)

# Create the stacked barplot with gradient colors
p <- ggplot(aaa_summary, aes(x = group, y = ratio, fill = pnOver)) +
  geom_bar(stat = \identity\, position = \stack\,
           linewidth = lineMedium * mmToLineUnit, lineend = \square\) +
  theme_classic() + labs(x = NULL , y = \Ratio\) +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +
  scale_fill_manual(values = gradient_colors, 
                    guide = guide_legend(
      override.aes = list(size = 0.5), # Adjust legend key symbol size
      keywidth = 2 / 2.54, # Convert 2mm to cm
      keyheight = 2 / 2.54 # Convert 2mm to cm
    )) 

width <- panelSize(1.7)*mmToInch
height <- panelSize(1.3)*mmToInch
fileName <- paste0(\rad21perc_promoter\)
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()  



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNXdaV0ZyTGxKQlJESXhJRHd0SUdsdGNHOXlkRkJsWVdzb2FHVnlaU2h5WldaRWFYSXNJRnhjTXpNeU5UQmZVa0ZFTWpGZllXSTVPVEpmUW5KMVkyVXRORjl3WldGcmN5NXRaWEpuWlZCbFlXc3VZbVZrWEZ3cEtWeHVYRzRqSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNalhHNW1iR0Z1YTFOcGVtVWdQQzBnTlRBd01GeHVaMlZ1WlM1MFlpQThMU0JtY21WaFpDaG9aWEpsS0hKbFprUnBjaXdnWEZ4dGJURXdYMGRTUTIwek9DNXdObDluWlc1bFgzTnZjblJsWkM1aVpXUmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGUlRVeUE5SUdsbVpXeHpaU2hXTkNBOVBTQmNYQ3RjWEN3Z1ZqSXNJRll6S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCVVUxTnpkR0Z5ZENBOUlGUlRVeUF0SUdac1lXNXJVMmw2WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCVVUxTmxibVFnUFNCVVUxTWdLeUJtYkdGdWExTnBlbVVwSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtGWTJMQ0JXTlN3Z1ZqRXNJRlJUVTNOMFlYSjBMQ0JVVTFObGJtUXBYRzVqYjJ4dVlXMWxjeWhuWlc1bExuUmlLU0E4TFNCaktGeGNaVzV6WlcxaWJGOW5aVzVsWDJsa1hGd3NJRnhjWlhoMFpYSnVZV3hmWjJWdVpWOXVZVzFsWEZ3c0lGeGNZMmh5WEZ3c0lGeGNjM1JoY25SY1hDd2dYRnhsYm1SY1hDbGNibHh1WEc0aklFTnZiblpsY25RZ1oyVnVaUzUwWWlCMGJ5QmhJRWRTWVc1blpYTWdiMkpxWldOMFhHNW5aVzVsWDJkeUlEd3RJRWRTWVc1blpYTW9YRzRnSUhObGNXNWhiV1Z6SUQwZ1oyVnVaUzUwWWlSamFISXNYRzRnSUhKaGJtZGxjeUE5SUVsU1lXNW5aWE1vYzNSaGNuUWdQU0JuWlc1bExuUmlKSE4wWVhKMExDQmxibVFnUFNCblpXNWxMblJpSkdWdVpDa3NYRzRnSUdkbGJtVmZhV1FnUFNCblpXNWxMblJpSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1S1Z4dVhHNGpJRU52ZFc1MElHOTJaWEpzWVhCeklHSmxkSGRsWlc0Z2NHVmhhM01nWVc1a0lHZGxibVZ6WEc1dmRtVnliR0Z3WDJOdmRXNTBjeUE4TFNCamIzVnVkRTkyWlhKc1lYQnpLR2RsYm1WZlozSXNJSEJsWVdzdVVrRkVNakVwWEc1Y2JpTWdRV1JrSUc5MlpYSnNZWEFnWTI5MWJuUnpJSFJ2SUhSb1pTQnZjbWxuYVc1aGJDQm5aVzVsTG5SaUlHUmhkR0ZjYm1kbGJtVXVkR0lrY0dWaGExOWpiM1Z1ZENBOExTQnZkbVZ5YkdGd1gyTnZkVzUwYzF4dVhHNGpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNalhHNWNibkJsWVd0T2RXMHdJRHd0SUNoblpXNWxMblJpSUNVK0pTQmtjR3g1Y2pvNlptbHNkR1Z5S0hCbFlXdGZZMjkxYm5RZ1BUMGdNQ2twSkdWdWMyVnRZbXhmWjJWdVpWOXBaRnh1Y0dWaGEwNTFiVEVnUEMwZ0tHZGxibVV1ZEdJZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb2NHVmhhMTlqYjNWdWRDQTlQU0F4S1Nra1pXNXpaVzFpYkY5blpXNWxYMmxrWEc1d1pXRnJUblZ0TWlBOExTQW9aMlZ1WlM1MFlpQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdaV0ZyWDJOdmRXNTBJRDA5SURJcEtTUmxibk5sYldKc1gyZGxibVZmYVdSY2JuQmxZV3RPZFcweklEd3RJQ2huWlc1bExuUmlJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLSEJsWVd0ZlkyOTFiblFnUFQwZ015a3BKR1Z1YzJWdFlteGZaMlZ1WlY5cFpGeHVjR1ZoYTA1MWJVOTJaWEkwSUR3dElDaG5aVzVsTG5SaUlDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtIQmxZV3RmWTI5MWJuUWdQajBnTkNrcEpHVnVjMlZ0WW14ZloyVnVaVjlwWkZ4dVhHNWNiaU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TmNibTVoYldVZ1BDMGdYRnhqYUhKdmJXOWZZMjl1YzE5aGJtNXZTR2xsY21GeVkyaDVYRnhjYmx4dVlXeHdhR0VnUEMwZ01DNHdOVnh1Wm1ORGRYUnZabVlnUEMwZ01DNDFYRzVrYVdabUxsSk9RUzVITVM1a1ZFRkhJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY1hHUnBabVpmUnpFdVpGUkJSMTlITVM0eWFTNWtWRUZIWDNaelgwY3hMakpwTGtSTlUwOHVkSE4yWEZ3cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T21acGJIUmxjaWh3WVdScUlEd2dZV3h3YUdFc0lHRmljeWh6YUhKcGJtdGxaRjlzYjJjeVJrTXBJRDRnWm1ORGRYUnZabVlwWEc1a2FXWm1MbEpPUVM1SE1TNWtWRUZITG01dlJrTmpkWFJ2Wm1ZZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZabWxzZEdWeUtIQmhaR29nUENCaGJIQm9ZU2xjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hGeGZjQzF1WDJWdWMyVnRZbXhNYVhOMExuUnpkbHhjS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwWm1aRGRYUnZabVlnUFNBd0xqSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGdWJtOU1hWE4wSUQwZ1l5aGNYRkF0VUZ4Y0xDQmNYRkF0UlZ4Y0xDQmNYRkF0VTF4Y0xDQmNYRkF0V0Z4Y0tTa2xQaVVnWEc0Z0lHUndiSGx5T2pwdGRYUmhkR1VvWkdsemRHRnVZMlVnUFNCemRHRnlkRElnTFNCemRHRnlkREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0dWaGEwbEVJRDBnY0dGemRHVW9ZMmh5YjIweExDQnpkR0Z5ZERFc0lITjBZWEowTWl3Z2MyVndJRDBnWEZ4ZlhGd3BLVnh1WEc1Y2JpTWpJRVJwZG1sa2FXNW5JR2RsYm1WeklHbHVkRzhnWjNKdmRYQnpYRzUwWlcxd0lEd3RJR2RsYm1WQmJtNXZSR0YwWVNBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoa2FXWm1YMlJVUVVkZlJFMVRUeXdnWkdsemRHRnVZMlVzSUdkbGJtVXBJQ1UrSlNCY2JpQWdkVzV1WlhOMEtHZGxibVVwSUNVK0pTQm5jbTkxY0Y5aWVTaG5aVzVsS1NBbFBpVmNiaUFnYzNWdGJXRnlhWHBsS0cxbFlXNWZaR2xtWmw5elkyOXlaU0E5SUcxbFlXNG9aR2xtWmw5a1ZFRkhYMFJOVTA4cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnYldWaGJsOWthWE4wWVc1alpTQTlJRzFsWVc0b1pHbHpkR0Z1WTJVcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnTG1keWIzVndjeUE5SUNka2NtOXdKeWxjYmx4dVpHbG1aaTVTVGtFZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWkdsbVpsOUhNUzVrVkVGSFgwY3hMakpwTG1SVVFVZGZkbk5mUnpFdU1ta3VSRTFUVHk1MGMzWmNYQ2twSUNVK0pWeHVJQ0JrY0d4NWNqbzZjMlZzWldOMEtHVnVjMlZ0WW14ZloyVnVaVjlwWkN3Z2JHOW5Na1p2YkdSRGFHRnVaMlVzSUhOb2NtbHVhMlZrWDJ4dlp6SkdReXdnY0dGa2Fpd2daWGgwWlhKdVlXeGZaMlZ1WlY5dVlXMWxLVnh1WEc1dFlYaE1iMmN5UmtNZ1BTQXlYRzVjYm5SbGJYQWdQQzBnYkdWbWRGOXFiMmx1S0hSbGJYQXNJR1JwWm1ZdVVrNUJMQ0JpZVNBOUlHTW9YRnhuWlc1bFhGd2dQU0JjWEdWdWMyVnRZbXhmWjJWdVpWOXBaRnhjS1NrZ0pUNGxJRnh1SUNCa2NHeDVjam82YlhWMFlYUmxLR1pzWVdjZ1BTQnBabVZzYzJVb1oyVnVaU0FsYVc0bElHUnBabVl1VWs1QkxrY3hMbVJVUVVja1pXNXpaVzFpYkY5blpXNWxYMmxrTENCY1hESkVUMWRPWEZ3c0lGeGNNRTVQWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhlRVpzWVdjZ1BTQW9ZV0p6S0hOb2NtbHVhMlZrWDJ4dlp6SkdReWtnUGlCdFlYaE1iMmN5UmtNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeHZaekptWTAxaGVDQTlJSEJ0WVhnb2NHMXBiaWh6YUhKcGJtdGxaRjlzYjJjeVJrTXNJRzFoZUV4dlp6SkdReWtzSUMxdFlYaE1iMmN5UmtNcEtTQWxQaVVnWEc0Z0lHUndiSGx5T2pwaGNuSmhibWRsS0dac1lXY3BJQ1UrSlZ4dUlDQmtjbTl3WDI1aEtITm9jbWx1YTJWa1gyeHZaekpHUXlsY2JseHVkR1Z0Y0NBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0Z4dUlDQndiazkyWlhJZ1BTQnBabVZzYzJVb1oyVnVaU0FsYVc0bElIQmxZV3RPZFcwd0xDQmNYSEJsWVd0T2RXMHdYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptVnNjMlVvWjJWdVpTQWxhVzRsSUhCbFlXdE9kVzB4TENCY1hIQmxZV3RPZFcweFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1psYkhObEtHZGxibVVnSldsdUpTQndaV0ZyVG5WdE1pd2dYRnh3WldGclRuVnRNbHhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJSEJsWVd0T2RXMHpMQ0JjWEhCbFlXdE9kVzB6WEZ3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWm1Wc2MyVW9aMlZ1WlNBbGFXNGxJSEJsWVd0T2RXMVBkbVZ5TkN3Z1hGeHdaV0ZyVG5WdFQzWmxjalJjWEN3Z1RrRXBLU2twS1NrZ0pUNGxYRzRnSUdSeWIzQmZibUVvY0c1UGRtVnlLVnh1WEc0akl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qWEc0aklFTm9aV05yYVc1bklIQmxjbU5sYm5SaFoyVWdiMllnWjJWdVpYTWdkMmwwYUNCU1FVUXlNU0J3WldGcmMxeHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdkbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhGd3BLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNaTUwYzNaY1hDa3BKR2RsYm1WY2JseHVZV0ZoSUR3dElIUmxiWEFnSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWjNKdmRYQWdQU0JqWVhObFgzZG9aVzRvWEc0Z0lHZGxibVVnSldsdUpTQm5jbTkxY0RFZ2ZpQmNYR2R5YjNWd01WeGNMRnh1SUNCblpXNWxJQ1ZwYmlVZ1ozSnZkWEF5SUg0Z1hGeG5jbTkxY0RKY1hDeGNiaUFnVkZKVlJTQitJRTVCWEc0cEtTQWxQaVZjYmlBZ1pIQnNlWEk2T25ObGJHVmpkQ2huY205MWNDd2djRzVQZG1WeUxDQm5aVzVsS1NBbFBpVmNiaUFnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBbGFXNGxJR01vWEZ4bmNtOTFjREZjWEN3Z1hGeG5jbTkxY0RKY1hDa3BJQ1UrSlZ4dUlDQmtjR3g1Y2pvNmJYVjBZWFJsS0doaGMxQmxZV3NnUFNCcFptVnNjMlVvY0c1UGRtVnlJRDA5SUZ4Y2NHVmhhMDUxYlRCY1hDd2dSa0ZNVTBVc0lGUlNWVVVwS1Z4dVhHNWlZbUlnUEMwZ1lXRmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRnhjWjNKdmRYQXhYRndwSUZ4dVhHNXpkVzBvWW1KaUpHaGhjMUJsWVdzcFhHNWlZbUlnUEMwZ1lXRmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLR2R5YjNWd0lEMDlJRnhjWjNKdmRYQXlYRndwSUZ4dWMzVnRLR0ppWWlSb1lYTlFaV0ZyS1Z4dVhHNWhZV0ZmYzNWdGJXRnllU0E4TFNCaFlXRWdKVDRsWEc0Z0lHZHliM1Z3WDJKNUtHZHliM1Z3TENCd2JrOTJaWElwSUNVK0pWeHVJQ0J6ZFcxdFlYSnBlbVVvWTI5MWJuUWdQU0J1S0Nrc0lDNW5jbTkxY0hNZ1BTQmNYR1J5YjNCY1hDbGNibHh1SXlCRGNtVmhkR1VnZEdobElITjBZV05yWldRZ1ltRnljR3h2ZEZ4dVlXRmhYM04xYlcxaGNua2dQQzBnWVdGaElDVStKVnh1SUNCbmNtOTFjRjlpZVNobmNtOTFjQ3dnY0c1UGRtVnlLU0FsUGlWY2JpQWdjM1Z0YldGeWFYcGxLR052ZFc1MElEMGdiaWdwTENBdVozSnZkWEJ6SUQwZ1hGeGtjbTl3WEZ3cElDVStKVnh1SUNCbmNtOTFjRjlpZVNobmNtOTFjQ2tnSlQ0bFhHNGdJRzExZEdGMFpTaHlZWFJwYnlBOUlHTnZkVzUwSUM4Z2MzVnRLR052ZFc1MEtTbGNibHh1SXlCRVpXWnBibVVnZEdobElHZHlZV1JwWlc1MElHTnZiRzl5YzF4dVozSmhaR2xsYm5SZlkyOXNiM0p6SUR3dElHTW9YRndqUkRSRU5FUTBYRndzSUZ4Y0kwUkRRakJCUmx4Y0xDQmNYQ05GTkRoRU9FRmNYQ3dnWEZ3alJVTTJPVFkxWEZ3c0lGeGNJMFkwTkRZME1WeGNLVnh1SXlCbmNtRmthV1Z1ZEY5amIyeHZjbk1nUEMwZ1l5aGNYQ05FTkVRMFJEUmNYQ3dnWEZ3alFUSkNRa05CWEZ3c0lGeGNJemN4UVRKRE1GeGNMQ0JjWENNelJqZzVRamRjWEN3Z1hGd2pNRVUzTVVGRVhGd3BYRzVjYmlNZ1EzSmxZWFJsSUhSb1pTQnpkR0ZqYTJWa0lHSmhjbkJzYjNRZ2QybDBhQ0JuY21Ga2FXVnVkQ0JqYjJ4dmNuTmNibkFnUEMwZ1oyZHdiRzkwS0dGaFlWOXpkVzF0WVhKNUxDQmhaWE1vZUNBOUlHZHliM1Z3TENCNUlEMGdjbUYwYVc4c0lHWnBiR3dnUFNCd2JrOTJaWElwS1NBclhHNGdJR2RsYjIxZlltRnlLSE4wWVhRZ1BTQmNYR2xrWlc1MGFYUjVYRndzSUhCdmMybDBhVzl1SUQwZ1hGeHpkR0ZqYTF4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxUV1ZrYVhWdElDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hDa2dLMXh1SUNCMGFHVnRaVjlqYkdGemMybGpLQ2tnS3lCc1lXSnpLSGdnUFNCT1ZVeE1JQ3dnZVNBOUlGeGNVbUYwYVc5Y1hDa2dLMXh1SUNCMGFHVnRaU2hjYmlBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVFN3Z1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGeGNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXNJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xDQnphWHBsSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBhV05yY3lBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYRndqTURBd01EQXdYRndzSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjWEhOeGRXRnlaVnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjWEhSeVlXNXpjR0Z5Wlc1MFhGd3BMRnh1SUNBZ0lHeGxaMlZ1WkM1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtHWmhiV2xzZVNBOUlHWnZiblJVZVhCbExDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVEtTeGNiaUFnSUNCc1pXZGxibVF1ZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lITnBlbVVnUFNCbWIyNTBVMmw2WlZNcFhHNGdJQ2tnSzF4dUlDQnpZMkZzWlY5bWFXeHNYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQm5jbUZrYVdWdWRGOWpiMnh2Y25Nc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuZFdsa1pTQTlJR2QxYVdSbFgyeGxaMlZ1WkNoY2JpQWdJQ0FnSUc5MlpYSnlhV1JsTG1GbGN5QTlJR3hwYzNRb2MybDZaU0E5SURBdU5Ta3NJQ01nUVdScWRYTjBJR3hsWjJWdVpDQnJaWGtnYzNsdFltOXNJSE5wZW1WY2JpQWdJQ0FnSUd0bGVYZHBaSFJvSUQwZ01pQXZJREl1TlRRc0lDTWdRMjl1ZG1WeWRDQXliVzBnZEc4Z1kyMWNiaUFnSUNBZ0lHdGxlV2hsYVdkb2RDQTlJRElnTHlBeUxqVTBJQ01nUTI5dWRtVnlkQ0F5YlcwZ2RHOGdZMjFjYmlBZ0lDQXBLU0JjYmx4dWQybGtkR2dnUEMwZ2NHRnVaV3hUYVhwbEtERXVOeWtxYlcxVWIwbHVZMmhjYm1obGFXZG9kQ0E4TFNCd1lXNWxiRk5wZW1Vb01TNHpLU3B0YlZSdlNXNWphRnh1Wm1sc1pVNWhiV1VnUEMwZ2NHRnpkR1V3S0Z4Y2NtRmtNakZ3WlhKalgzQnliMjF2ZEdWeVhGd3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ4Y0xuTjJaMXhjS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncElDQmNibHh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuXG5wZWFrLlJBRDIxIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5mbGFua1NpemUgPC0gNTAwMFxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSxcbiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFY2LCBWNSwgVjEsIFRTU3N0YXJ0LCBUU1NlbmQpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcZW5zZW1ibF9nZW5lX2lkXFwsIFxcZXh0ZXJuYWxfZ2VuZV9uYW1lXFwsIFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcblxuXG4jIENvbnZlcnQgZ2VuZS50YiB0byBhIEdSYW5nZXMgb2JqZWN0XG5nZW5lX2dyIDwtIEdSYW5nZXMoXG4gIHNlcW5hbWVzID0gZ2VuZS50YiRjaHIsXG4gIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBnZW5lLnRiJHN0YXJ0LCBlbmQgPSBnZW5lLnRiJGVuZCksXG4gIGdlbmVfaWQgPSBnZW5lLnRiJGVuc2VtYmxfZ2VuZV9pZFxuKVxuXG4jIENvdW50IG92ZXJsYXBzIGJldHdlZW4gcGVha3MgYW5kIGdlbmVzXG5vdmVybGFwX2NvdW50cyA8LSBjb3VudE92ZXJsYXBzKGdlbmVfZ3IsIHBlYWsuUkFEMjEpXG5cbiMgQWRkIG92ZXJsYXAgY291bnRzIHRvIHRoZSBvcmlnaW5hbCBnZW5lLnRiIGRhdGFcbmdlbmUudGIkcGVha19jb3VudCA8LSBvdmVybGFwX2NvdW50c1xuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbnBlYWtOdW0wIDwtIChnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKHBlYWtfY291bnQgPT0gMCkpJGVuc2VtYmxfZ2VuZV9pZFxucGVha051bTEgPC0gKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIocGVha19jb3VudCA9PSAxKSkkZW5zZW1ibF9nZW5lX2lkXG5wZWFrTnVtMiA8LSAoZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihwZWFrX2NvdW50ID09IDIpKSRlbnNlbWJsX2dlbmVfaWRcbnBlYWtOdW0zIDwtIChnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKHBlYWtfY291bnQgPT0gMykpJGVuc2VtYmxfZ2VuZV9pZFxucGVha051bU92ZXI0IDwtIChnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKHBlYWtfY291bnQgPj0gNCkpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmLlJOQS5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSlcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSklPiUgXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgcGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKVxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9kVEFHX0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGRpZmYuUk5BLkcxLmRUQUckZW5zZW1ibF9nZW5lX2lkLCBcXDJET1dOXFwsIFxcME5PXFwpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIGxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpICU+JVxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKFxuICBwbk92ZXIgPSBpZmVsc2UoZ2VuZSAlaW4lIHBlYWtOdW0wLCBcXHBlYWtOdW0wXFwsXG4gICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBlYWtOdW0xLCBcXHBlYWtOdW0xXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwZWFrTnVtMiwgXFxwZWFrTnVtMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBlYWtOdW0zLCBcXHBlYWtOdW0zXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBlYWtOdW1PdmVyNCwgXFxwZWFrTnVtT3ZlcjRcXCwgTkEpKSkpKSkgJT4lXG4gIGRyb3BfbmEocG5PdmVyKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIENoZWNraW5nIHBlcmNlbnRhZ2Ugb2YgZ2VuZXMgd2l0aCBSQUQyMSBwZWFrc1xuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuYWFhIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oXG4gIGdlbmUgJWluJSBncm91cDEgfiBcXGdyb3VwMVxcLFxuICBnZW5lICVpbiUgZ3JvdXAyIH4gXFxncm91cDJcXCxcbiAgVFJVRSB+IE5BXG4pKSAlPiVcbiAgZHBseXI6OnNlbGVjdChncm91cCwgcG5PdmVyLCBnZW5lKSAlPiVcbiAgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxncm91cDFcXCwgXFxncm91cDJcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGhhc1BlYWsgPSBpZmVsc2UocG5PdmVyID09IFxccGVha051bTBcXCwgRkFMU0UsIFRSVUUpKVxuXG5iYmIgPC0gYWFhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXAxXFwpIFxuXG5zdW0oYmJiJGhhc1BlYWspXG5iYmIgPC0gYWFhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXAyXFwpIFxuc3VtKGJiYiRoYXNQZWFrKVxuXG5hYWFfc3VtbWFyeSA8LSBhYWEgJT4lXG4gIGdyb3VwX2J5KGdyb3VwLCBwbk92ZXIpICU+JVxuICBzdW1tYXJpemUoY291bnQgPSBuKCksIC5ncm91cHMgPSBcXGRyb3BcXClcblxuIyBDcmVhdGUgdGhlIHN0YWNrZWQgYmFycGxvdFxuYWFhX3N1bW1hcnkgPC0gYWFhICU+JVxuICBncm91cF9ieShncm91cCwgcG5PdmVyKSAlPiVcbiAgc3VtbWFyaXplKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gXFxkcm9wXFwpICU+JVxuICBncm91cF9ieShncm91cCkgJT4lXG4gIG11dGF0ZShyYXRpbyA9IGNvdW50IC8gc3VtKGNvdW50KSlcblxuIyBEZWZpbmUgdGhlIGdyYWRpZW50IGNvbG9yc1xuZ3JhZGllbnRfY29sb3JzIDwtIGMoXFwjRDRENEQ0XFwsIFxcI0RDQjBBRlxcLCBcXCNFNDhEOEFcXCwgXFwjRUM2OTY1XFwsIFxcI0Y0NDY0MVxcKVxuIyBncmFkaWVudF9jb2xvcnMgPC0gYyhcXCNENEQ0RDRcXCwgXFwjQTJCQkNBXFwsIFxcIzcxQTJDMFxcLCBcXCMzRjg5QjdcXCwgXFwjMEU3MUFEXFwpXG5cbiMgQ3JlYXRlIHRoZSBzdGFja2VkIGJhcnBsb3Qgd2l0aCBncmFkaWVudCBjb2xvcnNcbnAgPC0gZ2dwbG90KGFhYV9zdW1tYXJ5LCBhZXMoeCA9IGdyb3VwLCB5ID0gcmF0aW8sIGZpbGwgPSBwbk92ZXIpKSArXG4gIGdlb21fYmFyKHN0YXQgPSBcXGlkZW50aXR5XFwsIHBvc2l0aW9uID0gXFxzdGFja1xcLFxuICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFxcUmF0aW9cXCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBncmFkaWVudF9jb2xvcnMsIFxuICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChcbiAgICAgIG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDAuNSksICMgQWRqdXN0IGxlZ2VuZCBrZXkgc3ltYm9sIHNpemVcbiAgICAgIGtleXdpZHRoID0gMiAvIDIuNTQsICMgQ29udmVydCAybW0gdG8gY21cbiAgICAgIGtleWhlaWdodCA9IDIgLyAyLjU0ICMgQ29udmVydCAybW0gdG8gY21cbiAgICApKSBcblxud2lkdGggPC0gcGFuZWxTaXplKDEuNykqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4zKSptbVRvSW5jaFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxccmFkMjFwZXJjX3Byb21vdGVyXFwpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpICBcblxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5wZWFrLlJBRDIxIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5mbGFua1NpemUgPC0gNTAwMFxuZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWRcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSBcXCtcXCwgVjIsIFYzKSxcbiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JVxuICBkcGx5cjo6c2VsZWN0KFY2LCBWNSwgVjEsIFRTU3N0YXJ0LCBUU1NlbmQpXG5jb2xuYW1lcyhnZW5lLnRiKSA8LSBjKFxcZW5zZW1ibF9nZW5lX2lkXFwsIFxcZXh0ZXJuYWxfZ2VuZV9uYW1lXFwsIFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXClcblxuXG4jIENvbnZlcnQgZ2VuZS50YiB0byBhIEdSYW5nZXMgb2JqZWN0XG5nZW5lX2dyIDwtIEdSYW5nZXMoXG4gIHNlcW5hbWVzID0gZ2VuZS50YiRjaHIsXG4gIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBnZW5lLnRiJHN0YXJ0LCBlbmQgPSBnZW5lLnRiJGVuZCksXG4gIGdlbmVfaWQgPSBnZW5lLnRiJGVuc2VtYmxfZ2VuZV9pZFxuKVxuXG4jIENvdW50IG92ZXJsYXBzIGJldHdlZW4gcGVha3MgYW5kIGdlbmVzXG5vdmVybGFwX2NvdW50cyA8LSBjb3VudE92ZXJsYXBzKGdlbmVfZ3IsIHBlYWsuUkFEMjEpXG5cbiMgQWRkIG92ZXJsYXAgY291bnRzIHRvIHRoZSBvcmlnaW5hbCBnZW5lLnRiIGRhdGFcbmdlbmUudGIkcGVha19jb3VudCA8LSBvdmVybGFwX2NvdW50c1xuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbnBlYWtOdW0wIDwtIChnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKHBlYWtfY291bnQgPT0gMCkpJGVuc2VtYmxfZ2VuZV9pZFxucGVha051bTEgPC0gKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIocGVha19jb3VudCA9PSAxKSkkZW5zZW1ibF9nZW5lX2lkXG5wZWFrTnVtMiA8LSAoZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihwZWFrX2NvdW50ID09IDIpKSRlbnNlbWJsX2dlbmVfaWRcbnBlYWtOdW0zIDwtIChnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKHBlYWtfY291bnQgPT0gMykpJGVuc2VtYmxfZ2VuZV9pZFxucGVha051bU92ZXI0IDwtIChnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKHBlYWtfY291bnQgPj0gNCkpJGVuc2VtYmxfZ2VuZV9pZFxuXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuYWxwaGEgPC0gMC4wNVxuZmNDdXRvZmYgPC0gMC41XG5kaWZmLlJOQS5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2XFwpKSAlPiVcbiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpXG5kaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSlcbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtUFxcLCBcXFAtRVxcLCBcXFAtU1xcLCBcXFAtWFxcKSklPiUgXG4gIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsXG4gICAgICAgICAgICAgICAgcGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gXFxfXFwpKVxuXG5cbiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzXG50ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSBcbiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiVcbiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9kVEFHX0RNU08pLFxuICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLFxuICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJylcblxuZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3ZcXCkpICU+JVxuICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKVxuXG5tYXhMb2cyRkMgPSAyXG5cbnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoXFxnZW5lXFwgPSBcXGVuc2VtYmxfZ2VuZV9pZFxcKSkgJT4lIFxuICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGRpZmYuUk5BLkcxLmRUQUckZW5zZW1ibF9nZW5lX2lkLCBcXDJET1dOXFwsIFxcME5PXFwpLFxuICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLFxuICAgICAgICAgICAgICAgIGxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgXG4gIGRwbHlyOjphcnJhbmdlKGZsYWcpICU+JVxuICBkcm9wX25hKHNocmlua2VkX2xvZzJGQylcblxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKFxuICBwbk92ZXIgPSBpZmVsc2UoZ2VuZSAlaW4lIHBlYWtOdW0wLCBcXHBlYWtOdW0wXFwsXG4gICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBlYWtOdW0xLCBcXHBlYWtOdW0xXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwZWFrTnVtMiwgXFxwZWFrTnVtMlxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBlYWtOdW0zLCBcXHBlYWtOdW0zXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBlYWtOdW1PdmVyNCwgXFxwZWFrTnVtT3ZlcjRcXCwgTkEpKSkpKSkgJT4lXG4gIGRyb3BfbmEocG5PdmVyKVxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4jIENoZWNraW5nIHBlcmNlbnRhZ2Ugb2YgZ2VuZXMgd2l0aCBSQUQyMSBwZWFrc1xuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuYWFhIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oXG4gIGdlbmUgJWluJSBncm91cDEgfiBcXGdyb3VwMVxcLFxuICBnZW5lICVpbiUgZ3JvdXAyIH4gXFxncm91cDJcXCxcbiAgVFJVRSB+IE5BXG4pKSAlPiVcbiAgZHBseXI6OnNlbGVjdChncm91cCwgcG5PdmVyLCBnZW5lKSAlPiVcbiAgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoXFxncm91cDFcXCwgXFxncm91cDJcXCkpICU+JVxuICBkcGx5cjo6bXV0YXRlKGhhc1BlYWsgPSBpZmVsc2UocG5PdmVyID09IFxccGVha051bTBcXCwgRkFMU0UsIFRSVUUpKVxuXG5iYmIgPC0gYWFhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXAxXFwpIFxuXG5zdW0oYmJiJGhhc1BlYWspXG5iYmIgPC0gYWFhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcZ3JvdXAyXFwpIFxuc3VtKGJiYiRoYXNQZWFrKVxuXG5hYWFfc3VtbWFyeSA8LSBhYWEgJT4lXG4gIGdyb3VwX2J5KGdyb3VwLCBwbk92ZXIpICU+JVxuICBzdW1tYXJpemUoY291bnQgPSBuKCksIC5ncm91cHMgPSBcXGRyb3BcXClcblxuIyBDcmVhdGUgdGhlIHN0YWNrZWQgYmFycGxvdFxuYWFhX3N1bW1hcnkgPC0gYWFhICU+JVxuICBncm91cF9ieShncm91cCwgcG5PdmVyKSAlPiVcbiAgc3VtbWFyaXplKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gXFxkcm9wXFwpICU+JVxuICBncm91cF9ieShncm91cCkgJT4lXG4gIG11dGF0ZShyYXRpbyA9IGNvdW50IC8gc3VtKGNvdW50KSlcblxuIyBEZWZpbmUgdGhlIGdyYWRpZW50IGNvbG9yc1xuZ3JhZGllbnRfY29sb3JzIDwtIGMoXFwjRDRENEQ0XFwsIFxcI0RDQjBBRlxcLCBcXCNFNDhEOEFcXCwgXFwjRUM2OTY1XFwsIFxcI0Y0NDY0MVxcKVxuIyBncmFkaWVudF9jb2xvcnMgPC0gYyhcXCNENEQ0RDRcXCwgXFwjQTJCQkNBXFwsIFxcIzcxQTJDMFxcLCBcXCMzRjg5QjdcXCwgXFwjMEU3MUFEXFwpXG5cbiMgQ3JlYXRlIHRoZSBzdGFja2VkIGJhcnBsb3Qgd2l0aCBncmFkaWVudCBjb2xvcnNcbnAgPC0gZ2dwbG90KGFhYV9zdW1tYXJ5LCBhZXMoeCA9IGdyb3VwLCB5ID0gcmF0aW8sIGZpbGwgPSBwbk92ZXIpKSArXG4gIGdlb21fYmFyKHN0YXQgPSBcXGlkZW50aXR5XFwsIHBvc2l0aW9uID0gXFxzdGFja1xcLFxuICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFxcUmF0aW9cXCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBncmFkaWVudF9jb2xvcnMsIFxuICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChcbiAgICAgIG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDAuNSksICMgQWRqdXN0IGxlZ2VuZCBrZXkgc3ltYm9sIHNpemVcbiAgICAgIGtleXdpZHRoID0gMiAvIDIuNTQsICMgQ29udmVydCAybW0gdG8gY21cbiAgICAgIGtleWhlaWdodCA9IDIgLyAyLjU0ICMgQ29udmVydCAybW0gdG8gY21cbiAgICApKSBcblxud2lkdGggPC0gcGFuZWxTaXplKDEuNykqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4zKSptbVRvSW5jaFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxccmFkMjFwZXJjX3Byb21vdGVyXFwpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpICBcblxuYGBgXG5gYGAifQ== -->

```r
```r

peak.RAD21 <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))

##########################################################
flankSize <- 5000
gene.tb <- fread(here(refDir, \mm10_GRCm38.p6_gene_sorted.bed\)) %>%
  dplyr::mutate(TSS = ifelse(V4 == \+\, V2, V3),
                TSSstart = TSS - flankSize,
                TSSend = TSS + flankSize) %>%
  dplyr::select(V6, V5, V1, TSSstart, TSSend)
colnames(gene.tb) <- c(\ensembl_gene_id\, \external_gene_name\, \chr\, \start\, \end\)


# Convert gene.tb to a GRanges object
gene_gr <- GRanges(
  seqnames = gene.tb$chr,
  ranges = IRanges(start = gene.tb$start, end = gene.tb$end),
  gene_id = gene.tb$ensembl_gene_id
)

# Count overlaps between peaks and genes
overlap_counts <- countOverlaps(gene_gr, peak.RAD21)

# Add overlap counts to the original gene.tb data
gene.tb$peak_count <- overlap_counts

###############################################################################

peakNum0 <- (gene.tb %>% dplyr::filter(peak_count == 0))$ensembl_gene_id
peakNum1 <- (gene.tb %>% dplyr::filter(peak_count == 1))$ensembl_gene_id
peakNum2 <- (gene.tb %>% dplyr::filter(peak_count == 2))$ensembl_gene_id
peakNum3 <- (gene.tb %>% dplyr::filter(peak_count == 3))$ensembl_gene_id
peakNumOver4 <- (gene.tb %>% dplyr::filter(peak_count >= 4))$ensembl_gene_id


###############################################################################
name <- \chromo_cons_annoHierarchy\

alpha <- 0.05
fcCutoff <- 0.5
diff.RNA.G1.dTAG <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha, abs(shrinked_log2FC) > fcCutoff)
diff.RNA.G1.dTAG.noFCcutoff <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::filter(padj < alpha)
geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-P\, \P-E\, \P-S\, \P-X\))%>% 
  dplyr::mutate(distance = start2 - start1,
                peakID = paste(chrom1, start1, start2, sep = \_\))


## Dividing genes into groups
temp <- geneAnnoData %>% dplyr::select(diff_dTAG_DMSO, distance, gene) %>% 
  unnest(gene) %>% group_by(gene) %>%
  summarize(mean_diff_score = mean(diff_dTAG_DMSO),
            mean_distance = mean(distance),
            .groups = 'drop')

diff.RNA <- fread(here(refDir, \diff_G1.dTAG_G1.2i.dTAG_vs_G1.2i.DMSO.tsv\)) %>%
  dplyr::select(ensembl_gene_id, log2FoldChange, shrinked_log2FC, padj, external_gene_name)

maxLog2FC = 2

temp <- left_join(temp, diff.RNA, by = c(\gene\ = \ensembl_gene_id\)) %>% 
  dplyr::mutate(flag = ifelse(gene %in% diff.RNA.G1.dTAG$ensembl_gene_id, \2DOWN\, \0NO\),
                maxFlag = (abs(shrinked_log2FC) > maxLog2FC),
                log2fcMax = pmax(pmin(shrinked_log2FC, maxLog2FC), -maxLog2FC)) %>% 
  dplyr::arrange(flag) %>%
  drop_na(shrinked_log2FC)

temp <- temp %>% dplyr::mutate(
  pnOver = ifelse(gene %in% peakNum0, \peakNum0\,
                  ifelse(gene %in% peakNum1, \peakNum1\,
                         ifelse(gene %in% peakNum2, \peakNum2\,
                                ifelse(gene %in% peakNum3, \peakNum3\,
                                       ifelse(gene %in% peakNumOver4, \peakNumOver4\, NA)))))) %>%
  drop_na(pnOver)

###############################################################################
# Checking percentage of genes with RAD21 peaks
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene

aaa <- temp %>% dplyr::mutate(group = case_when(
  gene %in% group1 ~ \group1\,
  gene %in% group2 ~ \group2\,
  TRUE ~ NA
)) %>%
  dplyr::select(group, pnOver, gene) %>%
  dplyr::filter(group %in% c(\group1\, \group2\)) %>%
  dplyr::mutate(hasPeak = ifelse(pnOver == \peakNum0\, FALSE, TRUE))

bbb <- aaa %>% dplyr::filter(group == \group1\) 

sum(bbb$hasPeak)
bbb <- aaa %>% dplyr::filter(group == \group2\) 
sum(bbb$hasPeak)

aaa_summary <- aaa %>%
  group_by(group, pnOver) %>%
  summarize(count = n(), .groups = \drop\)

# Create the stacked barplot
aaa_summary <- aaa %>%
  group_by(group, pnOver) %>%
  summarize(count = n(), .groups = \drop\) %>%
  group_by(group) %>%
  mutate(ratio = count / sum(count))

# Define the gradient colors
gradient_colors <- c(\#D4D4D4\, \#DCB0AF\, \#E48D8A\, \#EC6965\, \#F44641\)
# gradient_colors <- c(\#D4D4D4\, \#A2BBCA\, \#71A2C0\, \#3F89B7\, \#0E71AD\)

# Create the stacked barplot with gradient colors
p <- ggplot(aaa_summary, aes(x = group, y = ratio, fill = pnOver)) +
  geom_bar(stat = \identity\, position = \stack\,
           linewidth = lineMedium * mmToLineUnit, lineend = \square\) +
  theme_classic() + labs(x = NULL , y = \Ratio\) +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +
  scale_fill_manual(values = gradient_colors, 
                    guide = guide_legend(
      override.aes = list(size = 0.5), # Adjust legend key symbol size
      keywidth = 2 / 2.54, # Convert 2mm to cm
      keyheight = 2 / 2.54 # Convert 2mm to cm
    )) 

width <- panelSize(1.7)*mmToInch
height <- panelSize(1.3)*mmToInch
fileName <- paste0(\rad21perc_promoter\)
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()  

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [3.42] Comparing to Reg loops to A485

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMlYwVUhaaGJGZHBiR052ZUNBOExTQm1kVzVqZEdsdmJpaGtZWFJoTENCbmNtOTFjREVzSUdkeWIzVndNaWw3WEc0Z0lHUnBjM1JoYm1ObE1TQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdiazkyWlhJZ1BUMW5jbTkxY0RFcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGdJR1JwYzNSaGJtTmxNaUE4TFNBb1pHRjBZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWh3Yms5MlpYSWdQVDFuY205MWNESXBJQ2trYldWaGJsOWthV1ptWDNOamIzSmxYRzRnSUhkcGJDQThMU0IzYVd4amIzZ3VkR1Z6ZENoa2FYTjBZVzVqWlRFc0lHUnBjM1JoYm1ObE1pbGNiaUFnY21WMGRYSnVLSGRwYkNSd0xuWmhiSFZsS1Z4dWZWeHVYRzV3Y3pBeElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYQ0p3WldGclRuVnRNRndpTENCY0luQmxZV3RPZFcweFhDSXBMQ0ExS1Z4dWNITXhNaUE4TFNCeWIzVnVaQ2huWlhSUWRtRnNWMmxzWTI5NEtIUmxiWEFzSUZ3aWNHVmhhMDUxYlRGY0lpd2dYQ0p3WldGclRuVnRNbHdpS1N3Z05TbGNibkJ6TWpNZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNJbkJsWVd0T2RXMHlYQ0lzSUZ3aWNHVmhhMDUxYlROY0lpa3NJRFVwWEc1d2N6TTBJRHd0SUhKdmRXNWtLR2RsZEZCMllXeFhhV3hqYjNnb2RHVnRjQ3dnWENKd1pXRnJUblZ0TTF3aUxDQmNJbkJsWVd0T2RXMVBkbVZ5TkZ3aUtTd2dOU2xjYm5Cek1qUWdQQzBnY205MWJtUW9aMlYwVUhaaGJGZHBiR052ZUNoMFpXMXdMQ0JjSW5CbFlXdE9kVzB5WENJc0lGd2ljR1ZoYTA1MWJVOTJaWEkwWENJcExDQTFLVnh1Y0hNeE5DQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRndpY0dWaGEwNTFiVEZjSWl3Z1hDSndaV0ZyVG5WdFQzWmxjalJjSWlrc0lEVXBYRzV3Y3pBMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYQ0p3WldGclRuVnRNRndpTENCY0luQmxZV3RPZFcxUGRtVnlORndpS1N3Z05TbGNibHh1WEc1d0lEd3RJR2RuY0d4dmRDaDBaVzF3TENCaFpYTW9lQ0E5SUhCdVQzWmxjaXdnZVNBOUlHMWxZVzVmWkdsbVpsOXpZMjl5WlNrcElDc2dYRzRnSUdkbGIyMWZkbWx2YkdsdUtHRmxjeWhtYVd4c0lEMGdjRzVQZG1WeUtTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVFdWa2FYVnRJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdjMmh2ZHk1c1pXZGxibVFnUFNCR1FVeFRSU2tnSzF4dUlDQm5aVzl0WDJKdmVIQnNiM1FvZDJsa2RHZ2dQU0F3TGpNc0lHTnZiRzl5SUQwZ1hDSmliR0ZqYTF3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHVaWGRwWkhSb0lEMGdiR2x1WlUxbFpHbDFiU0FxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRndpYzNGMVlYSmxYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2ZFhSc2FXVnlMbk5vWVhCbElEMGdUa0ZjYmlBZ0tTQXJJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJR3hoWW5Nb2VDQTlJRTVWVEV3Z0xDQjVJRDBnWENKQmRtVnlZV2RsSU02VUlHeHZiM0FnYzJOdmNtVmNJaWtnSzF4dUlDQnpkR0YwWDNOMWJXMWhjbmtvWEc0Z0lDQWdZV1Z6S0dkeWIzVndJRDBnY0c1UGRtVnlLU3dnWm5WdUlEMGdiV1ZoYml4Y2JpQWdJQ0JuWlc5dElEMGdYQ0p3YjJsdWRGd2lMQ0J6YUdGd1pTQTlJREl4TENCemFYcGxJRDBnTUM0MUxGeHVJQ0FnSUdacGJHd2dQU0JjSW1Kc1lXTnJYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpWEc0Z0lDa2dLMXh1SUNCblpXOXRYMmhzYVc1bEtIbHBiblJsY21ObGNIUWdQU0F3TENCc2FXNWxkMmxrZEdnZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRcElDdGNiaUFnZEdobGJXVW9YRzRnSUNBZ1lYaHBjeTUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoY2JpQWdJQ0FnSUhOcGVtVWdQU0JtYjI1MFUybDZaVTBzSUdaaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2dZMjlzYjNJZ1BTQmNJaU13TURBd01EQmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCaGJtZHNaU0E5SURRMUxDQm9hblZ6ZENBOUlERXNJSFpxZFhOMElEMGdNVnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTVzYVc1bElEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWl3Z2MybDZaU0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ3aWMzRjFZWEpsWENKY2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWRHbGphM01nUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMQ0J6YVhwbElEMGdiR2x1WlZSb2FXTnJJQ29nYlcxVWIweHBibVZWYm1sMExDQnNhVzVsWlc1a0lEMGdYQ0p6Y1hWaGNtVmNJbHh1SUNBZ0lDa3NYRzRnSUNBZ2NHRnVaV3d1WW1GamEyZHliM1Z1WkNBOUlHVnNaVzFsYm5SZmNtVmpkQ2htYVd4c0lEMGdYQ0owY21GdWMzQmhjbVZ1ZEZ3aUtTeGNiaUFnSUNCc1pXZGxibVF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENobVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z2MybDZaU0E5SUdadmJuUlRhWHBsVXlrc1hHNGdJQ0FnYkdWblpXNWtMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1Z4dUlDQXBLMXh1SUNCaGJtNXZkR0YwWlNoY0luUmxlSFJjSWl3Z2VDQTlJREVzSUhrZ1BTQXdMQ0JzWVdKbGJDQTlJSEJoYzNSbE1DaGNJbkJ6TURFNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1ERXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekV5T2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pFeUtTd2dYQ0pjWEc1Y0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aWNITXlNem9nWENJc0lHTnZiblpRZG1Gc2RXVW9jSE15TXlrc0lGd2lYRnh1WENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSW5Cek16UTZJRndpTENCamIyNTJVSFpoYkhWbEtIQnpNelFwTENCY0lseGNibHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0p3Y3pJME9pQmNJaXdnWTI5dWRsQjJZV3gxWlNod2N6STBLU3dnWENKY1hHNWNJaXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbkJ6TVRRNklGd2lMQ0JqYjI1MlVIWmhiSFZsS0hCek1UUXBMQ0JjSWx4Y2Jsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSndjekEwT2lCY0lpd2dZMjl1ZGxCMllXeDFaU2h3Y3pBMEtTd2dYQ0pjWEc1Y0lpa3NJRnh1SUNBZ0lDQWdJQ0FnSUNCamIyeHZjaUE5SUZ3aVlteGhZMnRjSWl3Z2FHcDFjM1FnUFNBd0xDQnphWHBsSUQwZ01pa2dLMXh1SUNBZ0lITmpZV3hsWDJacGJHeGZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YQ0lqTnpjM056YzNYQ0lzSUZ3aUl6aENOMFUyTlZ3aUxDQmNJaU5CTWpnME5USmNJaXdnWENJalF6STRPRFJFWENJc0lGd2lJMFl5T0VVeVExd2lLU2tnSzF4dUlDQmpiMjl5WkY5allYSjBaWE5wWVc0b2VXeHBiU0E5SUdNb0xUQXVOU3dnTUM0eEtTbGNibHh1WEc1Y2JtWnBiR1ZPWVcxbElEd3RJSEJoYzNSbE1DaGNJbVJwWm1aVFkyOXlaVjlpWVhKd2JHOTBYMUpCUkRJeGNHVmhhMWRwZEdocGJqRXdhMkpmWkZSQlIxOTJjMTlFVFZOUFhDSXBYRzUzYVdSMGFDQThMU0F6TXlwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dE16Z3FiVzFVYjBsdVkyaGNibkJ1Wnlob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV3Ym1kY0lpa3BMQ0J5WlhNZ1BTQTJNREFzSUhWdWFYUWdQU0JjSW1sdVhDSXNJR2hsYVdkb2RDQTlJR2hsYVdkb2RDd2dkMmxrZEdnZ1BTQjNhV1IwYUNsY2JuQnlhVzUwS0hBcFhHNWtaWFl1YjJabUtDbGNibk4yWjJ4cGRHVW9hR1Z5WlNobWFXZEVhWElzSUhCaGMzUmxNQ2htYVd4bFRtRnRaU3dnWENJdWMzWm5YQ0lwS1N3Z0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JtQmdZQ0o5IC0tPlxuXG5gYGByXG5nZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXtcbiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBuT3ZlciA9PWdyb3VwMSkgKSRtZWFuX2RpZmZfc2NvcmVcbiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBuT3ZlciA9PWdyb3VwMikgKSRtZWFuX2RpZmZfc2NvcmVcbiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKVxuICByZXR1cm4od2lsJHAudmFsdWUpXG59XG5cbnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBlYWtOdW0wXFwsIFxccGVha051bTFcXCksIDUpXG5wczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwZWFrTnVtMVxcLCBcXHBlYWtOdW0yXFwpLCA1KVxucHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccGVha051bTJcXCwgXFxwZWFrTnVtM1xcKSwgNSlcbnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBlYWtOdW0zXFwsIFxccGVha051bU92ZXI0XFwpLCA1KVxucHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccGVha051bTJcXCwgXFxwZWFrTnVtT3ZlcjRcXCksIDUpXG5wczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwZWFrTnVtMVxcLCBcXHBlYWtOdW1PdmVyNFxcKSwgNSlcbnBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBlYWtOdW0wXFwsIFxccGVha051bU92ZXI0XFwpLCA1KVxuXG5cbnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gcG5PdmVyLCB5ID0gbWVhbl9kaWZmX3Njb3JlKSkgKyBcbiAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwbk92ZXIpLCBcbiAgICAgICAgICAgICAgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcLFxuICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArXG4gIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSBcXGJsYWNrXFwsXG4gICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQVxuICApICsgdGhlbWVfY2xhc3NpYygpICsgbGFicyh4ID0gTlVMTCAsIHkgPSBcXEF2ZXJhZ2UgzpQgbG9vcCBzY29yZVxcKSArXG4gIHN0YXRfc3VtbWFyeShcbiAgICBhZXMoZ3JvdXAgPSBwbk92ZXIpLCBmdW4gPSBtZWFuLFxuICAgIGdlb20gPSBcXHBvaW50XFwsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsXG4gICAgZmlsbCA9IFxcYmxhY2tcXCwgY29sb3IgPSBcXGJsYWNrXFxcbiAgKSArXG4gIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkrXG4gIGFubm90YXRlKFxcdGV4dFxcLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcGFzdGUwKFxccHMwMTogXFwsIGNvbnZQdmFsdWUocHMwMSksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTI6IFxcLCBjb252UHZhbHVlKHBzMTIpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczIzOiBcXCwgY29udlB2YWx1ZShwczIzKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMzNDogXFwsIGNvbnZQdmFsdWUocHMzNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMjQ6IFxcLCBjb252UHZhbHVlKHBzMjQpLCBcXFxcblxcLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMxNDogXFwsIGNvbnZQdmFsdWUocHMxNCksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMDQ6IFxcLCBjb252UHZhbHVlKHBzMDQpLCBcXFxcblxcKSwgXG4gICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLCBoanVzdCA9IDAsIHNpemUgPSAyKSArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhcXCM3Nzc3NzdcXCwgXFwjOEI3RTY1XFwsIFxcI0EyODQ1MlxcLCBcXCNDMjg4NERcXCwgXFwjRjI4RTJDXFwpKSArXG4gIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC41LCAwLjEpKVxuXG5cblxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcZGlmZlNjb3JlX2JhcnBsb3RfUkFEMjFwZWFrV2l0aGluMTBrYl9kVEFHX3ZzX0RNU09cXClcbndpZHRoIDwtIDMzKm1tVG9JbmNoXG5oZWlnaHQgPC0zOCptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(pnOver ==group1) )$mean_diff_score
  distance2 <- (data %>% dplyr::filter(pnOver ==group2) )$mean_diff_score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

ps01 <- round(getPvalWilcox(temp, \peakNum0\, \peakNum1\), 5)
ps12 <- round(getPvalWilcox(temp, \peakNum1\, \peakNum2\), 5)
ps23 <- round(getPvalWilcox(temp, \peakNum2\, \peakNum3\), 5)
ps34 <- round(getPvalWilcox(temp, \peakNum3\, \peakNumOver4\), 5)
ps24 <- round(getPvalWilcox(temp, \peakNum2\, \peakNumOver4\), 5)
ps14 <- round(getPvalWilcox(temp, \peakNum1\, \peakNumOver4\), 5)
ps04 <- round(getPvalWilcox(temp, \peakNum0\, \peakNumOver4\), 5)


p <- ggplot(temp, aes(x = pnOver, y = mean_diff_score)) + 
  geom_violin(aes(fill = pnOver), 
              color = \black\,
              linewidth = lineMedium * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \Average Δ loop score\) +
  stat_summary(
    aes(group = pnOver), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) +
    scale_fill_manual(values = c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\)) +
  coord_cartesian(ylim = c(-0.5, 0.1))



fileName <- paste0(\diffScore_barplot_RAD21peakWithin10kb_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-38*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVoyVjBVSFpoYkZkcGJHTnZlQ0E4TFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0JuY205MWNERXNJR2R5YjNWd01pbDdYRzRnSUdScGMzUmhibU5sTVNBOExTQW9aR0YwWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lod2JrOTJaWElnUFQxbmNtOTFjREVwSUNra2JXVmhibDlrYVdabVgzTmpiM0psWEc0Z0lHUnBjM1JoYm1ObE1pQThMU0FvWkdGMFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaHdiazkyWlhJZ1BUMW5jbTkxY0RJcElDa2tiV1ZoYmw5a2FXWm1YM05qYjNKbFhHNGdJSGRwYkNBOExTQjNhV3hqYjNndWRHVnpkQ2hrYVhOMFlXNWpaVEVzSUdScGMzUmhibU5sTWlsY2JpQWdjbVYwZFhKdUtIZHBiQ1J3TG5aaGJIVmxLVnh1ZlZ4dVhHNXdjekF4SUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hGeHdaV0ZyVG5WdE1GeGNMQ0JjWEhCbFlXdE9kVzB4WEZ3cExDQTFLVnh1Y0hNeE1pQThMU0J5YjNWdVpDaG5aWFJRZG1Gc1YybHNZMjk0S0hSbGJYQXNJRnhjY0dWaGEwNTFiVEZjWEN3Z1hGeHdaV0ZyVG5WdE1seGNLU3dnTlNsY2JuQnpNak1nUEMwZ2NtOTFibVFvWjJWMFVIWmhiRmRwYkdOdmVDaDBaVzF3TENCY1hIQmxZV3RPZFcweVhGd3NJRnhjY0dWaGEwNTFiVE5jWENrc0lEVXBYRzV3Y3pNMElEd3RJSEp2ZFc1a0tHZGxkRkIyWVd4WGFXeGpiM2dvZEdWdGNDd2dYRnh3WldGclRuVnRNMXhjTENCY1hIQmxZV3RPZFcxUGRtVnlORnhjS1N3Z05TbGNibkJ6TWpRZ1BDMGdjbTkxYm1Rb1oyVjBVSFpoYkZkcGJHTnZlQ2gwWlcxd0xDQmNYSEJsWVd0T2RXMHlYRndzSUZ4Y2NHVmhhMDUxYlU5MlpYSTBYRndwTENBMUtWeHVjSE14TkNBOExTQnliM1Z1WkNoblpYUlFkbUZzVjJsc1kyOTRLSFJsYlhBc0lGeGNjR1ZoYTA1MWJURmNYQ3dnWEZ4d1pXRnJUblZ0VDNabGNqUmNYQ2tzSURVcFhHNXdjekEwSUR3dElISnZkVzVrS0dkbGRGQjJZV3hYYVd4amIzZ29kR1Z0Y0N3Z1hGeHdaV0ZyVG5WdE1GeGNMQ0JjWEhCbFlXdE9kVzFQZG1WeU5GeGNLU3dnTlNsY2JseHVYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJSEJ1VDNabGNpd2dlU0E5SUcxbFlXNWZaR2xtWmw5elkyOXlaU2twSUNzZ1hHNGdJR2RsYjIxZmRtbHZiR2x1S0dGbGN5aG1hV3hzSUQwZ2NHNVBkbVZ5S1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxUV1ZrYVhWdElDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2MyaHZkeTVzWldkbGJtUWdQU0JHUVV4VFJTa2dLMXh1SUNCblpXOXRYMkp2ZUhCc2IzUW9kMmxrZEdnZ1BTQXdMak1zSUdOdmJHOXlJRDBnWEZ4aWJHRmphMXhjTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsdVpYZHBaSFJvSUQwZ2JHbHVaVTFsWkdsMWJTQXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGeGNjM0YxWVhKbFhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZkWFJzYVdWeUxuTm9ZWEJsSUQwZ1RrRmNiaUFnS1NBcklIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHeGhZbk1vZUNBOUlFNVZURXdnTENCNUlEMGdYRnhCZG1WeVlXZGxJTTZVSUd4dmIzQWdjMk52Y21WY1hDa2dLMXh1SUNCemRHRjBYM04xYlcxaGNua29YRzRnSUNBZ1lXVnpLR2R5YjNWd0lEMGdjRzVQZG1WeUtTd2dablZ1SUQwZ2JXVmhiaXhjYmlBZ0lDQm5aVzl0SUQwZ1hGeHdiMmx1ZEZ4Y0xDQnphR0Z3WlNBOUlESXhMQ0J6YVhwbElEMGdNQzQxTEZ4dUlDQWdJR1pwYkd3Z1BTQmNYR0pzWVdOclhGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNYRzRnSUNrZ0sxeHVJQ0JuWlc5dFgyaHNhVzVsS0hscGJuUmxjbU5sY0hRZ1BTQXdMQ0JzYVc1bGQybGtkR2dnUFNCc2FXNWxWR2hwWTJzZ0tpQnRiVlJ2VEdsdVpWVnVhWFFwSUN0Y2JpQWdkR2hsYldVb1hHNGdJQ0FnWVhocGN5NTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hjYmlBZ0lDQWdJSE5wZW1VZ1BTQm1iMjUwVTJsNlpVMHNJR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTENCbVlXMXBiSGtnUFNCbWIyNTBWSGx3WlN3Z1kyOXNiM0lnUFNCY1hDTXdNREF3TURCY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NTBaWGgwTG5nZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0JoYm1kc1pTQTlJRFExTENCb2FuVnpkQ0E5SURFc0lIWnFkWE4wSUQwZ01WeHVJQ0FnSUNrc1hHNGdJQ0FnWVhocGN5NXNhVzVsSUQwZ1pXeGxiV1Z1ZEY5c2FXNWxLRnh1SUNBZ0lDQWdZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYQ3dnYzJsNlpTQTlJR3hwYm1WVWFHbGpheUFxSUcxdFZHOU1hVzVsVlc1cGRDd2diR2x1WldWdVpDQTlJRnhjYzNGMVlYSmxYRnhjYmlBZ0lDQXBMRnh1SUNBZ0lHRjRhWE11ZEdsamEzTWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xDQnphWHBsSUQwZ2JHbHVaVlJvYVdOcklDb2diVzFVYjB4cGJtVlZibWwwTENCc2FXNWxaVzVrSUQwZ1hGeHpjWFZoY21WY1hGeHVJQ0FnSUNrc1hHNGdJQ0FnY0dGdVpXd3VZbUZqYTJkeWIzVnVaQ0E5SUdWc1pXMWxiblJmY21WamRDaG1hV3hzSUQwZ1hGeDBjbUZ1YzNCaGNtVnVkRnhjS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR1Y0ZENBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWtzWEc0Z0lDQWdiR1ZuWlc1a0xuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLVnh1SUNBcEsxeHVJQ0JoYm01dmRHRjBaU2hjWEhSbGVIUmNYQ3dnZUNBOUlERXNJSGtnUFNBd0xDQnNZV0psYkNBOUlIQmhjM1JsTUNoY1hIQnpNREU2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TURFcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6RXlPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekV5S1N3Z1hGeGNYRzVjWEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRnhjY0hNeU16b2dYRndzSUdOdmJuWlFkbUZzZFdVb2NITXlNeWtzSUZ4Y1hGeHVYRndzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNYSEJ6TXpRNklGeGNMQ0JqYjI1MlVIWmhiSFZsS0hCek16UXBMQ0JjWEZ4Y2JseGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hGeHdjekkwT2lCY1hDd2dZMjl1ZGxCMllXeDFaU2h3Y3pJMEtTd2dYRnhjWEc1Y1hDd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY1hIQnpNVFE2SUZ4Y0xDQmpiMjUyVUhaaGJIVmxLSEJ6TVRRcExDQmNYRnhjYmx4Y0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEZ4d2N6QTBPaUJjWEN3Z1kyOXVkbEIyWVd4MVpTaHdjekEwS1N3Z1hGeGNYRzVjWENrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0JqYjJ4dmNpQTlJRnhjWW14aFkydGNYQ3dnYUdwMWMzUWdQU0F3TENCemFYcGxJRDBnTWlrZ0sxeHVJQ0FnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hGd2pOemMzTnpjM1hGd3NJRnhjSXpoQ04wVTJOVnhjTENCY1hDTkJNamcwTlRKY1hDd2dYRndqUXpJNE9EUkVYRndzSUZ4Y0kwWXlPRVV5UTF4Y0tTa2dLMXh1SUNCamIyOXlaRjlqWVhKMFpYTnBZVzRvZVd4cGJTQTlJR01vTFRBdU5Td2dNQzR4S1NsY2JseHVYRzVjYm1acGJHVk9ZVzFsSUR3dElIQmhjM1JsTUNoY1hHUnBabVpUWTI5eVpWOWlZWEp3Ykc5MFgxSkJSREl4Y0dWaGExZHBkR2hwYmpFd2EySmZaRlJCUjE5MmMxOUVUVk5QWEZ3cFhHNTNhV1IwYUNBOExTQXpNeXB0YlZSdlNXNWphRnh1YUdWcFoyaDBJRHd0TXpncWJXMVViMGx1WTJoY2JuQnVaeWhvWlhKbEtHWnBaMFJwY2l3Z2NHRnpkR1V3S0dacGJHVk9ZVzFsTENCY1hDNXdibWRjWENrcExDQnlaWE1nUFNBMk1EQXNJSFZ1YVhRZ1BTQmNYR2x1WEZ3c0lHaGxhV2RvZENBOUlHaGxhV2RvZEN3Z2QybGtkR2dnUFNCM2FXUjBhQ2xjYm5CeWFXNTBLSEFwWEc1a1pYWXViMlptS0NsY2JuTjJaMnhwZEdVb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYRnd1YzNablhGd3BLU3dnSUdobGFXZG9kQ0E5SUdobGFXZG9kQ3dnZDJsa2RHZ2dQU0IzYVdSMGFDbGNibkJ5YVc1MEtIQXBYRzVrWlhZdWIyWm1LQ2xjYm1CZ1lGeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuYGBgclxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDEpICkkbWVhbl9kaWZmX3Njb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwZWFrTnVtMFxcLCBcXHBlYWtOdW0xXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccGVha051bTFcXCwgXFxwZWFrTnVtMlxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBlYWtOdW0yXFwsIFxccGVha051bTNcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwZWFrTnVtM1xcLCBcXHBlYWtOdW1PdmVyNFxcKSwgNSlcbnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBlYWtOdW0yXFwsIFxccGVha051bU92ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccGVha051bTFcXCwgXFxwZWFrTnVtT3ZlcjRcXCksIDUpXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwZWFrTnVtMFxcLCBcXHBlYWtOdW1PdmVyNFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHBuT3ZlciwgeSA9IG1lYW5fZGlmZl9zY29yZSkpICsgXG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkFcbiAgKSArIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxBdmVyYWdlIM6UIGxvb3Agc2NvcmVcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcG5PdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjNzc3Nzc3XFwsIFxcIzhCN0U2NVxcLCBcXCNBMjg0NTJcXCwgXFwjQzI4ODREXFwsIFxcI0YyOEUyQ1xcKSkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC4xKSlcblxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGRpZmZTY29yZV9iYXJwbG90X1JBRDIxcGVha1dpdGhpbjEwa2JfZFRBR192c19ETVNPXFwpXG53aWR0aCA8LSAzMyptbVRvSW5jaFxuaGVpZ2h0IDwtMzgqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7XG4gIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDEpICkkbWVhbl9kaWZmX3Njb3JlXG4gIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlXG4gIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMilcbiAgcmV0dXJuKHdpbCRwLnZhbHVlKVxufVxuXG5wczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwZWFrTnVtMFxcLCBcXHBlYWtOdW0xXFwpLCA1KVxucHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccGVha051bTFcXCwgXFxwZWFrTnVtMlxcKSwgNSlcbnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBlYWtOdW0yXFwsIFxccGVha051bTNcXCksIDUpXG5wczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwZWFrTnVtM1xcLCBcXHBlYWtOdW1PdmVyNFxcKSwgNSlcbnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCBcXHBlYWtOdW0yXFwsIFxccGVha051bU92ZXI0XFwpLCA1KVxucHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIFxccGVha051bTFcXCwgXFxwZWFrTnVtT3ZlcjRcXCksIDUpXG5wczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgXFxwZWFrTnVtMFxcLCBcXHBlYWtOdW1PdmVyNFxcKSwgNSlcblxuXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHBuT3ZlciwgeSA9IG1lYW5fZGlmZl9zY29yZSkpICsgXG4gIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgXG4gICAgICAgICAgICAgIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCxcbiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgK1xuICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gXFxibGFja1xcLFxuICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwsXG4gICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkFcbiAgKSArIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxBdmVyYWdlIM6UIGxvb3Agc2NvcmVcXCkgK1xuICBzdGF0X3N1bW1hcnkoXG4gICAgYWVzKGdyb3VwID0gcG5PdmVyKSwgZnVuID0gbWVhbixcbiAgICBnZW9tID0gXFxwb2ludFxcLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LFxuICAgIGZpbGwgPSBcXGJsYWNrXFwsIGNvbG9yID0gXFxibGFja1xcXG4gICkgK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoXG4gICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMVxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApK1xuICBhbm5vdGF0ZShcXHRleHRcXCwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMChcXHBzMDE6IFxcLCBjb252UHZhbHVlKHBzMDEpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczEyOiBcXCwgY29udlB2YWx1ZShwczEyKSwgXFxcXG5cXCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHMyMzogXFwsIGNvbnZQdmFsdWUocHMyMyksIFxcXFxuXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMzQ6IFxcLCBjb252UHZhbHVlKHBzMzQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczI0OiBcXCwgY29udlB2YWx1ZShwczI0KSwgXFxcXG5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHBzMTQ6IFxcLCBjb252UHZhbHVlKHBzMTQpLCBcXFxcblxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxwczA0OiBcXCwgY29udlB2YWx1ZShwczA0KSwgXFxcXG5cXCksIFxuICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgaGp1c3QgPSAwLCBzaXplID0gMikgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoXFwjNzc3Nzc3XFwsIFxcIzhCN0U2NVxcLCBcXCNBMjg0NTJcXCwgXFwjQzI4ODREXFwsIFxcI0YyOEUyQ1xcKSkgK1xuICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC4xKSlcblxuXG5cbmZpbGVOYW1lIDwtIHBhc3RlMChcXGRpZmZTY29yZV9iYXJwbG90X1JBRDIxcGVha1dpdGhpbjEwa2JfZFRBR192c19ETVNPXFwpXG53aWR0aCA8LSAzMyptbVRvSW5jaFxuaGVpZ2h0IDwtMzgqbW1Ub0luY2hcbnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5wbmdcXCkpLCByZXMgPSA2MDAsIHVuaXQgPSBcXGluXFwsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
getPvalWilcox <- function(data, group1, group2){
  distance1 <- (data %>% dplyr::filter(pnOver ==group1) )$mean_diff_score
  distance2 <- (data %>% dplyr::filter(pnOver ==group2) )$mean_diff_score
  wil <- wilcox.test(distance1, distance2)
  return(wil$p.value)
}

ps01 <- round(getPvalWilcox(temp, \peakNum0\, \peakNum1\), 5)
ps12 <- round(getPvalWilcox(temp, \peakNum1\, \peakNum2\), 5)
ps23 <- round(getPvalWilcox(temp, \peakNum2\, \peakNum3\), 5)
ps34 <- round(getPvalWilcox(temp, \peakNum3\, \peakNumOver4\), 5)
ps24 <- round(getPvalWilcox(temp, \peakNum2\, \peakNumOver4\), 5)
ps14 <- round(getPvalWilcox(temp, \peakNum1\, \peakNumOver4\), 5)
ps04 <- round(getPvalWilcox(temp, \peakNum0\, \peakNumOver4\), 5)


p <- ggplot(temp, aes(x = pnOver, y = mean_diff_score)) + 
  geom_violin(aes(fill = pnOver), 
              color = \black\,
              linewidth = lineMedium * mmToLineUnit, lineend = \square\,
              show.legend = FALSE) +
  geom_boxplot(width = 0.3, color = \black\,
               linewidth = lineMedium * mmToLineUnit, lineend = \square\,
               outlier.shape = NA
  ) + theme_classic() + labs(x = NULL , y = \Average Δ loop score\) +
  stat_summary(
    aes(group = pnOver), fun = mean,
    geom = \point\, shape = 21, size = 0.5,
    fill = \black\, color = \black\
  ) +
  geom_hline(yintercept = 0, linewidth = lineThick * mmToLineUnit) +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.text.x = element_text(
      angle = 45, hjust = 1, vjust = 1
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  )+
  annotate(\text\, x = 1, y = 0, label = paste0(\ps01: \, convPvalue(ps01), \\n\,
                                                \ps12: \, convPvalue(ps12), \\n\,
                                                \ps23: \, convPvalue(ps23), \\n\,
                                                \ps34: \, convPvalue(ps34), \\n\,
                                                \ps24: \, convPvalue(ps24), \\n\, 
                                                \ps14: \, convPvalue(ps14), \\n\,
                                                \ps04: \, convPvalue(ps04), \\n\), 
           color = \black\, hjust = 0, size = 2) +
    scale_fill_manual(values = c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\)) +
  coord_cartesian(ylim = c(-0.5, 0.1))



fileName <- paste0(\diffScore_barplot_RAD21peakWithin10kb_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-38*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [3.43] Checking RAD21 peak density at group1 and group2 promoter

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVkR1Z0Y0NBOExTQjBaVzF3SUNVK0pTQmtjR3g1Y2pvNmJYVjBZWFJsS0dGaWMweHZaekpHUXlBOUlHRmljeWhzYjJjeVJtOXNaRU5vWVc1blpTa3BYRzV3SUR3dElHZG5jR3h2ZENoMFpXMXdMQ0JoWlhNb2VDQTlJR0ZpYzB4dlp6SkdReXdnWTI5c2IzSWdQU0J3Yms5MlpYSXBLU0FyWEc1elkyRnNaVjlqYjJ4dmNsOXRZVzUxWVd3b2RtRnNkV1Z6SUQwZ0tHTW9YQ0lqTnpjM056YzNYQ0lzSUZ3aUl6aENOMFUyTlZ3aUxDQmNJaU5CTWpnME5USmNJaXdnWENJalF6STRPRFJFWENJc0lGd2lJMFl5T0VVeVExd2lLU2twSUN0Y2JpQWdjM1JoZEY5bFkyUm1LSE5wZW1VZ1BTQXdMalFzSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZOWldScGRXMGdLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNJbk54ZFdGeVpWd2lJQ2tnS3lBaklGVnpaU0J6ZEdGMFgyVmpaR1lnZEc4Z2NHeHZkQ0IwYUdVZ1pXMXdhWEpwWTJGc0lFTkVSbHh1SUNCc1lXSnpLRnh1SUNBZ0lIZ2dQU0JjSWtGaWN5NGdiRzluTWlobWIyeGtJR05vWVc1blpTbGNJaXhjYmlBZ0lDQjVJRDBnWENKRGRXMTFiR0YwYVhabElGQnliMkpoWW1sc2FYUjVYQ0pjYmlBZ0tTQXJJR052YjNKa1gyTmhjblJsYzJsaGJpaDRiR2x0SUQwZ1l5Z3dMQ0F4TGpVcEtTQXJYRzRnSUhSb1pXMWxYMk5zWVhOemFXTW9LU0FySUNNZ1EyeGxZVzRnZEdobGJXVmNiaUFnZEdobGJXVW9YRzRnSUNBZ0lDQmhlR2x6TG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WVExGeHVJQ0FnSUNBZ1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ3aUl6QXdNREF3TUZ3aVhHNGdJQ0FnS1N4Y2JpQWdJQ0JoZUdsekxteHBibVVnUFNCbGJHVnRaVzUwWDJ4cGJtVW9YRzRnSUNBZ0lDQmpiMnh2Y2lBOUlGd2lJekF3TURBd01Gd2lMRnh1SUNBZ0lDQWdjMmw2WlNBOUlHeHBibVZVYUdsamF5cHRiVlJ2VEdsdVpWVnVhWFFzWEc0Z0lDQWdJQ0JzYVc1bFpXNWtJRDBnWENKemNYVmhjbVZjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MGFXTnJjeUE5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSXNYRzRnSUNBZ0lDQnphWHBsSUQwZ2JHbHVaVlJvYVdOckttMXRWRzlNYVc1bFZXNXBkQ3hjYmlBZ0lDQWdJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQndZVzVsYkM1aVlXTnJaM0p2ZFc1a0lEMGdaV3hsYldWdWRGOXlaV04wS0dacGJHd2dQU0JjSW5SeVlXNXpjR0Z5Wlc1MFhDSXBMRnh1SUNBZ0lHeGxaMlZ1WkM1d2IzTnBkR2x2YmlBOUlGd2libTl1WlZ3aUxGeHVJQ0FnSUd4bFoyVnVaQzUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0daaGJXbHNlU0E5SUdadmJuUlVlWEJsTENCemFYcGxJRDBnWm05dWRGTnBlbVZUS1N4Y2JpQWdJQ0JzWldkbGJtUXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wWEc0Z0lDQWdLU0FySUhOallXeGxYM2xmWTI5dWRHbHVkVzkxY3loc1lXSmxiSE1nUFNCelkyRnNaWE02T201MWJXSmxjbDltYjNKdFlYUW9ZV05qZFhKaFkza2dQU0F3TGpFcEtWeHVabWxzWlU1aGJXVWdQQzBnY0dGemRHVXdLRndpYkc5bk1rWkRYMk5rWmw5d2MwZHliM1Z3WDJSVVFVZGZkbk5mUkUxVFQxd2lLVnh1ZDJsa2RHZ2dQQzBnTXpNcWJXMVViMGx1WTJoY2JtaGxhV2RvZENBOExUTXpLbTF0Vkc5SmJtTm9YRzV3Ym1jb2FHVnlaU2htYVdkRWFYSXNJSEJoYzNSbE1DaG1hV3hsVG1GdFpTd2dYQ0l1Y0c1blhDSXBLU3dnY21WeklEMGdOakF3TENCMWJtbDBJRDBnWENKcGJsd2lMQ0JvWldsbmFIUWdQU0JvWldsbmFIUXNJSGRwWkhSb0lEMGdkMmxrZEdncFhHNXdjbWx1ZENod0tWeHVaR1YyTG05bVppZ3BYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNWNibUJnWUNKOSAtLT5cblxuYGBgclxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKGFic0xvZzJGQyA9IGFicyhsb2cyRm9sZENoYW5nZSkpXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGFic0xvZzJGQywgY29sb3IgPSBwbk92ZXIpKSArXG5zY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gKGMoXFwjNzc3Nzc3XFwsIFxcIzhCN0U2NVxcLCBcXCNBMjg0NTJcXCwgXFwjQzI4ODREXFwsIFxcI0YyOEUyQ1xcKSkpICtcbiAgc3RhdF9lY2RmKHNpemUgPSAwLjQsIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcICkgKyAjIFVzZSBzdGF0X2VjZGYgdG8gcGxvdCB0aGUgZW1waXJpY2FsIENERlxuICBsYWJzKFxuICAgIHggPSBcXEFicy4gbG9nMihmb2xkIGNoYW5nZSlcXCxcbiAgICB5ID0gXFxDdW11bGF0aXZlIFByb2JhYmlsaXR5XFxcbiAgKSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxLjUpKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArICMgQ2xlYW4gdGhlbWVcbiAgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAwLjEpKVxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2NkZl9wc0dyb3VwX2RUQUdfdnNfRE1TT1xcKVxud2lkdGggPC0gMzMqbW1Ub0luY2hcbmhlaWdodCA8LTMzKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
temp <- temp %>% dplyr::mutate(absLog2FC = abs(log2FoldChange))
p <- ggplot(temp, aes(x = absLog2FC, color = pnOver)) +
scale_color_manual(values = (c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\))) +
  stat_ecdf(size = 0.4, linewidth = lineMedium * mmToLineUnit, lineend = \square\ ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Abs. log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.position = \none\,
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    ) + scale_y_continuous(labels = scales::number_format(accuracy = 0.1))
fileName <- paste0(\log2FC_cdf_psGroup_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWRHVnRjQ0E4TFNCMFpXMXdJQ1UrSlNCa2NHeDVjam82YlhWMFlYUmxLR0ZpYzB4dlp6SkdReUE5SUdGaWN5aHNiMmN5Um05c1pFTm9ZVzVuWlNrcFhHNXdJRHd0SUdkbmNHeHZkQ2gwWlcxd0xDQmhaWE1vZUNBOUlHRmljMHh2WnpKR1F5d2dZMjlzYjNJZ1BTQndiazkyWlhJcEtTQXJYRzV6WTJGc1pWOWpiMnh2Y2w5dFlXNTFZV3dvZG1Gc2RXVnpJRDBnS0dNb1hGd2pOemMzTnpjM1hGd3NJRnhjSXpoQ04wVTJOVnhjTENCY1hDTkJNamcwTlRKY1hDd2dYRndqUXpJNE9EUkVYRndzSUZ4Y0kwWXlPRVV5UTF4Y0tTa3BJQ3RjYmlBZ2MzUmhkRjlsWTJSbUtITnBlbVVnUFNBd0xqUXNJR3hwYm1WM2FXUjBhQ0E5SUd4cGJtVk5aV1JwZFcwZ0tpQnRiVlJ2VEdsdVpWVnVhWFFzSUd4cGJtVmxibVFnUFNCY1hITnhkV0Z5WlZ4Y0lDa2dLeUFqSUZWelpTQnpkR0YwWDJWalpHWWdkRzhnY0d4dmRDQjBhR1VnWlcxd2FYSnBZMkZzSUVORVJseHVJQ0JzWVdKektGeHVJQ0FnSUhnZ1BTQmNYRUZpY3k0Z2JHOW5NaWhtYjJ4a0lHTm9ZVzVuWlNsY1hDeGNiaUFnSUNCNUlEMGdYRnhEZFcxMWJHRjBhWFpsSUZCeWIySmhZbWxzYVhSNVhGeGNiaUFnS1NBcklHTnZiM0prWDJOaGNuUmxjMmxoYmloNGJHbHRJRDBnWXlnd0xDQXhMalVwS1NBclhHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJQ01nUTJ4bFlXNGdkR2hsYldWY2JpQWdkR2hsYldVb1hHNGdJQ0FnSUNCaGVHbHpMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZOTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5SbGVIUWdQU0JsYkdWdFpXNTBYM1JsZUhRb1hHNGdJQ0FnSUNCemFYcGxJRDBnWm05dWRGTnBlbVZUTEZ4dUlDQWdJQ0FnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzWEc0Z0lDQWdJQ0JqYjJ4dmNpQTlJRnhjSXpBd01EQXdNRnhjWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG14cGJtVWdQU0JsYkdWdFpXNTBYMnhwYm1Vb1hHNGdJQ0FnSUNCamIyeHZjaUE5SUZ4Y0l6QXdNREF3TUZ4Y0xGeHVJQ0FnSUNBZ2MybDZaU0E5SUd4cGJtVlVhR2xqYXlwdGJWUnZUR2x1WlZWdWFYUXNYRzRnSUNBZ0lDQnNhVzVsWlc1a0lEMGdYRnh6Y1hWaGNtVmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwYVdOcmN5QTlJR1ZzWlcxbGJuUmZiR2x1WlNoY2JpQWdJQ0FnSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ3c1hHNGdJQ0FnSUNCemFYcGxJRDBnYkdsdVpWUm9hV05yS20xdFZHOU1hVzVsVlc1cGRDeGNiaUFnSUNBZ0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCd1lXNWxiQzVpWVdOclozSnZkVzVrSUQwZ1pXeGxiV1Z1ZEY5eVpXTjBLR1pwYkd3Z1BTQmNYSFJ5WVc1emNHRnlaVzUwWEZ3cExGeHVJQ0FnSUd4bFoyVnVaQzV3YjNOcGRHbHZiaUE5SUZ4Y2JtOXVaVnhjTEZ4dUlDQWdJR3hsWjJWdVpDNTBaWGgwSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR1poYldsc2VTQTlJR1p2Ym5SVWVYQmxMQ0J6YVhwbElEMGdabTl1ZEZOcGVtVlRLU3hjYmlBZ0lDQnNaV2RsYm1RdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBYRzRnSUNBZ0tTQXJJSE5qWVd4bFgzbGZZMjl1ZEdsdWRXOTFjeWhzWVdKbGJITWdQU0J6WTJGc1pYTTZPbTUxYldKbGNsOW1iM0p0WVhRb1lXTmpkWEpoWTNrZ1BTQXdMakVwS1Z4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGeGNiRzluTWtaRFgyTmtabDl3YzBkeWIzVndYMlJVUVVkZmRuTmZSRTFUVDF4Y0tWeHVkMmxrZEdnZ1BDMGdNek1xYlcxVWIwbHVZMmhjYm1obGFXZG9kQ0E4TFRNekttMXRWRzlKYm1Ob1hHNXdibWNvYUdWeVpTaG1hV2RFYVhJc0lIQmhjM1JsTUNobWFXeGxUbUZ0WlN3Z1hGd3VjRzVuWEZ3cEtTd2djbVZ6SUQwZ05qQXdMQ0IxYm1sMElEMGdYRnhwYmx4Y0xDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwWEc1Y2JtQmdZRnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbmBgYHJcbnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShhYnNMb2cyRkMgPSBhYnMobG9nMkZvbGRDaGFuZ2UpKVxucCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBhYnNMb2cyRkMsIGNvbG9yID0gcG5PdmVyKSkgK1xuc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IChjKFxcIzc3Nzc3N1xcLCBcXCM4QjdFNjVcXCwgXFwjQTI4NDUyXFwsIFxcI0MyODg0RFxcLCBcXCNGMjhFMkNcXCkpKSArXG4gIHN0YXRfZWNkZihzaXplID0gMC40LCBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCApICsgIyBVc2Ugc3RhdF9lY2RmIHRvIHBsb3QgdGhlIGVtcGlyaWNhbCBDREZcbiAgbGFicyhcbiAgICB4ID0gXFxBYnMuIGxvZzIoZm9sZCBjaGFuZ2UpXFwsXG4gICAgeSA9IFxcQ3VtdWxhdGl2ZSBQcm9iYWJpbGl0eVxcXG4gICkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMS41KSkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyAjIENsZWFuIHRoZW1lXG4gIHRoZW1lKFxuICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUyxcbiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCxcbiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LFxuICAgICAgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICAgICkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMC4xKSlcbmZpbGVOYW1lIDwtIHBhc3RlMChcXGxvZzJGQ19jZGZfcHNHcm91cF9kVEFHX3ZzX0RNU09cXClcbndpZHRoIDwtIDMzKm1tVG9JbmNoXG5oZWlnaHQgPC0zMyptbVRvSW5jaFxucG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnBuZ1xcKSksIHJlcyA9IDYwMCwgdW5pdCA9IFxcaW5cXCwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKVxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKGFic0xvZzJGQyA9IGFicyhsb2cyRm9sZENoYW5nZSkpXG5wIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGFic0xvZzJGQywgY29sb3IgPSBwbk92ZXIpKSArXG5zY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gKGMoXFwjNzc3Nzc3XFwsIFxcIzhCN0U2NVxcLCBcXCNBMjg0NTJcXCwgXFwjQzI4ODREXFwsIFxcI0YyOEUyQ1xcKSkpICtcbiAgc3RhdF9lY2RmKHNpemUgPSAwLjQsIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcICkgKyAjIFVzZSBzdGF0X2VjZGYgdG8gcGxvdCB0aGUgZW1waXJpY2FsIENERlxuICBsYWJzKFxuICAgIHggPSBcXEFicy4gbG9nMihmb2xkIGNoYW5nZSlcXCxcbiAgICB5ID0gXFxDdW11bGF0aXZlIFByb2JhYmlsaXR5XFxcbiAgKSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxLjUpKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArICMgQ2xlYW4gdGhlbWVcbiAgdGhlbWUoXG4gICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgICBzaXplID0gZm9udFNpemVNLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLFxuICAgICAgZmFtaWx5ID0gZm9udFR5cGUsXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLFxuICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsXG4gICAgICBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsXG4gICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCxcbiAgICAgIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICAgKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAwLjEpKVxuZmlsZU5hbWUgPC0gcGFzdGUwKFxcbG9nMkZDX2NkZl9wc0dyb3VwX2RUQUdfdnNfRE1TT1xcKVxud2lkdGggPC0gMzMqbW1Ub0luY2hcbmhlaWdodCA8LTMzKm1tVG9JbmNoXG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbmBgYFxuYGBgIn0= -->

```r
```r
temp <- temp %>% dplyr::mutate(absLog2FC = abs(log2FoldChange))
p <- ggplot(temp, aes(x = absLog2FC, color = pnOver)) +
scale_color_manual(values = (c(\#777777\, \#8B7E65\, \#A28452\, \#C2884D\, \#F28E2C\))) +
  stat_ecdf(size = 0.4, linewidth = lineMedium * mmToLineUnit, lineend = \square\ ) + # Use stat_ecdf to plot the empirical CDF
  labs(
    x = \Abs. log2(fold change)\,
    y = \Cumulative Probability\
  ) + coord_cartesian(xlim = c(0, 1.5)) +
  theme_classic() + # Clean theme
  theme(
      axis.title = element_text(
        size = fontSizeM,
      family = fontType,
      color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS,
      family = fontType,
      color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\,
      size = lineThick*mmToLineUnit,
      lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.position = \none\,
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
    ) + scale_y_continuous(labels = scales::number_format(accuracy = 0.1))
fileName <- paste0(\log2FC_cdf_psGroup_dTAG_vs_DMSO\)
width <- 33*mmToInch
height <-33*mmToInch
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### loop score

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzV3WldGckxsSkJSREl4SUR3dElHbHRjRzl5ZEZCbFlXc29hR1Z5WlNoeVpXWkVhWElzSUZ3aU16TXlOVEJmVWtGRU1qRmZZV0k1T1RKZlFuSjFZMlV0TkY5d1pXRnJjeTV0WlhKblpWQmxZV3N1WW1Wa1hDSXBLVnh1WjNKdmRYQXhJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjlpYVc1aGNubEhjbTkxY0RFdWRITjJYQ0lwS1NSblpXNWxYRzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMkpwYm1GeWVVZHliM1Z3TWk1MGMzWmNJaWtwSkdkbGJtVmNibHh1WEc0akl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpYRzV1WVcxbElEd3RJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVndpWEc1Y2JtZGxibVZCYm01dlJHRjBZU0E4TFNCc2IyRmtURzl2Y0VGdWJtOUVZWFJoS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYQ0pmY0MxdVgyVnVjMlZ0WW14TWFYTjBMblJ6ZGx3aUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdScFptWkRkWFJ2Wm1ZZ1BTQXdMaklzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnVibTlNYVhOMElEMGdZeWhjSWxBdFJWd2lLU2xjYmx4dWRHVnRjREVnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRUV4SUQwOUlGd2lSVndpS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoamFISnZiVEVzSUhOMFlYSjBNU3dnWlc1a01Td2daMlZ1WlNsY2JtTnZiRzVoYldWektIUmxiWEF4S1NBOExTQmpLRndpWTJoeVhDSXNJRndpYzNSaGNuUmNJaXdnWENKbGJtUmNJaXdnWENKblpXNWxYQ0lwWEc1MFpXMXdNaUE4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9RVElnUFQwZ1hDSkZYQ0lwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dOb2NtOXRNaXdnYzNSaGNuUXlMQ0JsYm1ReUxDQm5aVzVsS1Z4dVkyOXNibUZ0WlhNb2RHVnRjRElwSUR3dElHTW9YQ0pqYUhKY0lpd2dYQ0p6ZEdGeWRGd2lMQ0JjSW1WdVpGd2lMQ0JjSW1kbGJtVmNJaWxjYmx4dVpXNW9RVzVqYUc5eWN5QThMU0JpYVc1a1gzSnZkM01vZEdWdGNERXNJSFJsYlhBeUtTQWxQaVVnZFc1dVpYTjBLR2RsYm1VcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNBZ0lHZHliM1Z3SUQwZ1kyRnpaVjkzYUdWdUtGeHVJQ0FnSUNBZ1oyVnVaU0FsYVc0bElHZHliM1Z3TVNCK0lGd2lSM0p3TVZ3aUxGeHVJQ0FnSUNBZ1oyVnVaU0FsYVc0bElHZHliM1Z3TWlCK0lGd2lSM0p3TWx3aUxGeHVJQ0FnSUNBZ1ZGSlZSU0IrSUU1QlhHNGdJQ0FnS1Z4dUlDQXBJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLQ0ZwY3k1dVlTaG5jbTkxY0NrcFhHNWNibVZ1YUNBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1pXNW9RVzVqYUc5eWN5QWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLREVzSURJc0lETXBLU2xjYmx4dUl5QkRiM1Z1ZENCdmRtVnliR0Z3Y3lCaVpYUjNaV1Z1SUhCbFlXdHpJR0Z1WkNCblpXNWxjMXh1YjNabGNteGhjRjlqYjNWdWRITWdQQzBnWTI5MWJuUlBkbVZ5YkdGd2N5aGxibWdzSUhCbFlXc3VVa0ZFTWpFcFhHNWNiaU1nUVdSa0lHOTJaWEpzWVhBZ1kyOTFiblJ6SUhSdklIUm9aU0J2Y21sbmFXNWhiQ0JuWlc1bExuUmlJR1JoZEdGY2JtVnVhRUZ1WTJodmNuTWtjR1ZoYTE5amIzVnVkQ0E4TFNCdmRtVnliR0Z3WDJOdmRXNTBjMXh1WEc1bGJtaEJibU5vYjNKeklEd3RJR1Z1YUVGdVkyaHZjbk1nSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lIQmxZV3RIY205MWNDQTlJR05oYzJWZmQyaGxiaWhjYmlBZ0lDQndaV0ZyWDJOdmRXNTBJRDA5SURBZ2ZpQmNJbkJsWVd0T2RXMHdYQ0lzWEc0Z0lDQWdjR1ZoYTE5amIzVnVkQ0E5UFNBeElINGdYQ0p3WldGclRuVnRNVndpTEZ4dUlDQWdJSEJsWVd0ZlkyOTFiblFnUFQwZ01pQitJRndpY0dWaGEwNTFiVEpjSWl4Y2JpQWdJQ0J3WldGclgyTnZkVzUwSUQwOUlETWdmaUJjSW5CbFlXdE9kVzB6WENJc1hHNGdJQ0FnY0dWaGExOWpiM1Z1ZENBK1BTQTBJSDRnWENKd1pXRnJUblZ0VDNabGNqUmNJbHh1SUNBcFhHNHBYRzVjYm1GaFlTQThMU0JsYm1oQmJtTm9iM0p6SUNVK0pTQmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaG5jbTkxY0N3Z2NHVmhhMGR5YjNWd0xDQm5aVzVsS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG9ZWE5RWldGcklEMGdhV1psYkhObEtIQmxZV3RIY205MWNDQTlQU0JjSW5CbFlXdE9kVzB3WENJc0lFWkJURk5GTENCVVVsVkZLU2xjYmx4dVltSmlJRHd0SUdGaFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNJa2R5Y0RGY0lpa2dYRzV6ZFcwb1ltSmlKR2hoYzFCbFlXc3BMMjV5YjNjb1ltSmlLVnh1WW1KaUlEd3RJR0ZoWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY0lrZHljREpjSWlrZ1hHNXpkVzBvWW1KaUpHaGhjMUJsWVdzcEwyNXliM2NvWW1KaUtWeHVYRzVjYm1GaFlWOXpkVzF0WVhKNUlEd3RJR0ZoWVNBbFBpVmNiaUFnWjNKdmRYQmZZbmtvWjNKdmRYQXNJSEJsWVd0SGNtOTFjQ2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2hqYjNWdWRDQTlJRzRvS1N3Z0xtZHliM1Z3Y3lBOUlGd2laSEp2Y0Z3aUtWeHVYRzRqSUVOeVpXRjBaU0IwYUdVZ2MzUmhZMnRsWkNCaVlYSndiRzkwWEc1aFlXRmZjM1Z0YldGeWVTQThMU0JoWVdFZ0pUNGxYRzRnSUdkeWIzVndYMko1S0dkeWIzVndMQ0J3WldGclIzSnZkWEFwSUNVK0pWeHVJQ0J6ZFcxdFlYSnBlbVVvWTI5MWJuUWdQU0J1S0Nrc0lDNW5jbTkxY0hNZ1BTQmNJbVJ5YjNCY0lpa2dKVDRsWEc0Z0lHZHliM1Z3WDJKNUtHZHliM1Z3S1NBbFBpVmNiaUFnYlhWMFlYUmxLSEpoZEdsdklEMGdZMjkxYm5RZ0x5QnpkVzBvWTI5MWJuUXBLVnh1WEc0aklFUmxabWx1WlNCMGFHVWdaM0poWkdsbGJuUWdZMjlzYjNKelhHNGpJR2R5WVdScFpXNTBYMk52Ykc5eWN5QThMU0JqS0Z3aUkwUTBSRFJFTkZ3aUxDQmNJaU5FUTBJd1FVWmNJaXdnWENJalJUUTRSRGhCWENJc0lGd2lJMFZETmprMk5Wd2lMQ0JjSWlOR05EUTJOREZjSWlsY2JtZHlZV1JwWlc1MFgyTnZiRzl5Y3lBOExTQmpLRndpSTBRMFJEUkVORndpTENCY0lpTkJNa0pDUTBGY0lpd2dYQ0lqTnpGQk1rTXdYQ0lzSUZ3aUl6TkdPRGxDTjF3aUxDQmNJaU13UlRjeFFVUmNJaWxjYmx4dUl5QkRjbVZoZEdVZ2RHaGxJSE4wWVdOclpXUWdZbUZ5Y0d4dmRDQjNhWFJvSUdkeVlXUnBaVzUwSUdOdmJHOXljMXh1Y0NBOExTQm5aM0JzYjNRb1lXRmhYM04xYlcxaGNua3NJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0J5WVhScGJ5d2dabWxzYkNBOUlIQmxZV3RIY205MWNDa3BJQ3RjYmlBZ1oyVnZiVjlpWVhJb2MzUmhkQ0E5SUZ3aWFXUmxiblJwZEhsY0lpd2djRzl6YVhScGIyNGdQU0JjSW5OMFlXTnJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WTlpXUnBkVzBnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpS1NBclhHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJR3hoWW5Nb2VDQTlJRTVWVEV3Z0xDQjVJRDBnWENKU1lYUnBiMXdpS1NBclhHNGdJSFJvWlcxbEtGeHVJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVk5MQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl3Z1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXViR2x1WlNBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpd2djMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBcExGeHVJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGd2lkSEpoYm5Od1lYSmxiblJjSWlrc1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWxjYmlBZ0tTQXJYRzRnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdkeVlXUnBaVzUwWDJOdmJHOXljeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZDFhV1JsSUQwZ1ozVnBaR1ZmYkdWblpXNWtLRnh1SUNBZ0lDQWdiM1psY25KcFpHVXVZV1Z6SUQwZ2JHbHpkQ2h6YVhwbElEMGdNQzQxS1N3Z0l5QkJaR3AxYzNRZ2JHVm5aVzVrSUd0bGVTQnplVzFpYjJ3Z2MybDZaVnh1SUNBZ0lDQWdhMlY1ZDJsa2RHZ2dQU0F5SUM4Z01pNDFOQ3dnSXlCRGIyNTJaWEowSURKdGJTQjBieUJqYlZ4dUlDQWdJQ0FnYTJWNWFHVnBaMmgwSUQwZ01pQXZJREl1TlRRZ0l5QkRiMjUyWlhKMElESnRiU0IwYnlCamJWeHVJQ0FnSUNrcElGeHVYRzUzYVdSMGFDQThMU0J3WVc1bGJGTnBlbVVvTVM0M0tTcHRiVlJ2U1c1amFGeHVhR1ZwWjJoMElEd3RJSEJoYm1Wc1UybDZaU2d4TGpNcEttMXRWRzlKYm1Ob1hHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0p5WVdReU1YQmxjbU5mWlc1b1hDSXBYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncElDQmNibHh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcblxucGVhay5SQUQyMSA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcXDMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFxcKSlcbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlxcKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XFwpKSRnZW5lXG5cblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xubmFtZSA8LSBcXGNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcXFxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFxcX3Atbl9lbnNlbWJsTGlzdC50c3ZcXCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXFxQLUVcXCkpXG5cbnRlbXAxIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihBMSA9PSBcXEVcXCkgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGdlbmUpXG5jb2xuYW1lcyh0ZW1wMSkgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcZ2VuZVxcKVxudGVtcDIgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEEyID09IFxcRVxcKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTIsIHN0YXJ0MiwgZW5kMiwgZ2VuZSlcbmNvbG5hbWVzKHRlbXAyKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxnZW5lXFwpXG5cbmVuaEFuY2hvcnMgPC0gYmluZF9yb3dzKHRlbXAxLCB0ZW1wMikgJT4lIHVubmVzdChnZW5lKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBncm91cCA9IGNhc2Vfd2hlbihcbiAgICAgIGdlbmUgJWluJSBncm91cDEgfiBcXEdycDFcXCxcbiAgICAgIGdlbmUgJWluJSBncm91cDIgfiBcXEdycDJcXCxcbiAgICAgIFRSVUUgfiBOQVxuICAgIClcbiAgKSAlPiUgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5lbmggPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGVuaEFuY2hvcnMgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSkpXG5cbiMgQ291bnQgb3ZlcmxhcHMgYmV0d2VlbiBwZWFrcyBhbmQgZ2VuZXNcbm92ZXJsYXBfY291bnRzIDwtIGNvdW50T3ZlcmxhcHMoZW5oLCBwZWFrLlJBRDIxKVxuXG4jIEFkZCBvdmVybGFwIGNvdW50cyB0byB0aGUgb3JpZ2luYWwgZ2VuZS50YiBkYXRhXG5lbmhBbmNob3JzJHBlYWtfY291bnQgPC0gb3ZlcmxhcF9jb3VudHNcblxuZW5oQW5jaG9ycyA8LSBlbmhBbmNob3JzICU+JSBkcGx5cjo6bXV0YXRlKFxuICBwZWFrR3JvdXAgPSBjYXNlX3doZW4oXG4gICAgcGVha19jb3VudCA9PSAwIH4gXFxwZWFrTnVtMFxcLFxuICAgIHBlYWtfY291bnQgPT0gMSB+IFxccGVha051bTFcXCxcbiAgICBwZWFrX2NvdW50ID09IDIgfiBcXHBlYWtOdW0yXFwsXG4gICAgcGVha19jb3VudCA9PSAzIH4gXFxwZWFrTnVtM1xcLFxuICAgIHBlYWtfY291bnQgPj0gNCB+IFxccGVha051bU92ZXI0XFxcbiAgKVxuKVxuXG5hYWEgPC0gZW5oQW5jaG9ycyAlPiUgXG4gIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIHBlYWtHcm91cCwgZ2VuZSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoaGFzUGVhayA9IGlmZWxzZShwZWFrR3JvdXAgPT0gXFxwZWFrTnVtMFxcLCBGQUxTRSwgVFJVRSkpXG5cbmJiYiA8LSBhYWEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxHcnAxXFwpIFxuc3VtKGJiYiRoYXNQZWFrKS9ucm93KGJiYilcbmJiYiA8LSBhYWEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXFxHcnAyXFwpIFxuc3VtKGJiYiRoYXNQZWFrKS9ucm93KGJiYilcblxuXG5hYWFfc3VtbWFyeSA8LSBhYWEgJT4lXG4gIGdyb3VwX2J5KGdyb3VwLCBwZWFrR3JvdXApICU+JVxuICBzdW1tYXJpemUoY291bnQgPSBuKCksIC5ncm91cHMgPSBcXGRyb3BcXClcblxuIyBDcmVhdGUgdGhlIHN0YWNrZWQgYmFycGxvdFxuYWFhX3N1bW1hcnkgPC0gYWFhICU+JVxuICBncm91cF9ieShncm91cCwgcGVha0dyb3VwKSAlPiVcbiAgc3VtbWFyaXplKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gXFxkcm9wXFwpICU+JVxuICBncm91cF9ieShncm91cCkgJT4lXG4gIG11dGF0ZShyYXRpbyA9IGNvdW50IC8gc3VtKGNvdW50KSlcblxuIyBEZWZpbmUgdGhlIGdyYWRpZW50IGNvbG9yc1xuIyBncmFkaWVudF9jb2xvcnMgPC0gYyhcXCNENEQ0RDRcXCwgXFwjRENCMEFGXFwsIFxcI0U0OEQ4QVxcLCBcXCNFQzY5NjVcXCwgXFwjRjQ0NjQxXFwpXG5ncmFkaWVudF9jb2xvcnMgPC0gYyhcXCNENEQ0RDRcXCwgXFwjQTJCQkNBXFwsIFxcIzcxQTJDMFxcLCBcXCMzRjg5QjdcXCwgXFwjMEU3MUFEXFwpXG5cbiMgQ3JlYXRlIHRoZSBzdGFja2VkIGJhcnBsb3Qgd2l0aCBncmFkaWVudCBjb2xvcnNcbnAgPC0gZ2dwbG90KGFhYV9zdW1tYXJ5LCBhZXMoeCA9IGdyb3VwLCB5ID0gcmF0aW8sIGZpbGwgPSBwZWFrR3JvdXApKSArXG4gIGdlb21fYmFyKHN0YXQgPSBcXGlkZW50aXR5XFwsIHBvc2l0aW9uID0gXFxzdGFja1xcLFxuICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXCkgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFxcUmF0aW9cXCkgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcXHRyYW5zcGFyZW50XFwpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBncmFkaWVudF9jb2xvcnMsIFxuICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChcbiAgICAgIG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDAuNSksICMgQWRqdXN0IGxlZ2VuZCBrZXkgc3ltYm9sIHNpemVcbiAgICAgIGtleXdpZHRoID0gMiAvIDIuNTQsICMgQ29udmVydCAybW0gdG8gY21cbiAgICAgIGtleWhlaWdodCA9IDIgLyAyLjU0ICMgQ29udmVydCAybW0gdG8gY21cbiAgICApKSBcblxud2lkdGggPC0gcGFuZWxTaXplKDEuNykqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4zKSptbVRvSW5jaFxuZmlsZU5hbWUgPC0gcGFzdGUwKFxccmFkMjFwZXJjX2VuaFxcKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcXC5zdmdcXCkpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKSAgXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->

peak.RAD21 <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


##########################################################
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-E\))

temp1 <- geneAnnoData %>% dplyr::filter(A1 == \E\) %>% dplyr::select(chrom1, start1, end1, gene)
colnames(temp1) <- c(\chr\, \start\, \end\, \gene\)
temp2 <- geneAnnoData %>% dplyr::filter(A2 == \E\) %>% dplyr::select(chrom2, start2, end2, gene)
colnames(temp2) <- c(\chr\, \start\, \end\, \gene\)

enhAnchors <- bind_rows(temp1, temp2) %>% unnest(gene) %>%
  dplyr::mutate(
    group = case_when(
      gene %in% group1 ~ \Grp1\,
      gene %in% group2 ~ \Grp2\,
      TRUE ~ NA
    )
  ) %>% dplyr::filter(!is.na(group))

enh <- makeGRangesFromDataFrame(enhAnchors %>% dplyr::select(c(1, 2, 3)))

# Count overlaps between peaks and genes
overlap_counts <- countOverlaps(enh, peak.RAD21)

# Add overlap counts to the original gene.tb data
enhAnchors$peak_count <- overlap_counts

enhAnchors <- enhAnchors %>% dplyr::mutate(
  peakGroup = case_when(
    peak_count == 0 ~ \peakNum0\,
    peak_count == 1 ~ \peakNum1\,
    peak_count == 2 ~ \peakNum2\,
    peak_count == 3 ~ \peakNum3\,
    peak_count >= 4 ~ \peakNumOver4\
  )
)

aaa <- enhAnchors %>% 
  dplyr::select(group, peakGroup, gene) %>%
  dplyr::mutate(hasPeak = ifelse(peakGroup == \peakNum0\, FALSE, TRUE))

bbb <- aaa %>% dplyr::filter(group == \Grp1\) 
sum(bbb$hasPeak)/nrow(bbb)
bbb <- aaa %>% dplyr::filter(group == \Grp2\) 
sum(bbb$hasPeak)/nrow(bbb)


aaa_summary <- aaa %>%
  group_by(group, peakGroup) %>%
  summarize(count = n(), .groups = \drop\)

# Create the stacked barplot
aaa_summary <- aaa %>%
  group_by(group, peakGroup) %>%
  summarize(count = n(), .groups = \drop\) %>%
  group_by(group) %>%
  mutate(ratio = count / sum(count))

# Define the gradient colors
# gradient_colors <- c(\#D4D4D4\, \#DCB0AF\, \#E48D8A\, \#EC6965\, \#F44641\)
gradient_colors <- c(\#D4D4D4\, \#A2BBCA\, \#71A2C0\, \#3F89B7\, \#0E71AD\)

# Create the stacked barplot with gradient colors
p <- ggplot(aaa_summary, aes(x = group, y = ratio, fill = peakGroup)) +
  geom_bar(stat = \identity\, position = \stack\,
           linewidth = lineMedium * mmToLineUnit, lineend = \square\) +
  theme_classic() + labs(x = NULL , y = \Ratio\) +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +
  scale_fill_manual(values = gradient_colors, 
                    guide = guide_legend(
      override.aes = list(size = 0.5), # Adjust legend key symbol size
      keywidth = 2 / 2.54, # Convert 2mm to cm
      keyheight = 2 / 2.54 # Convert 2mm to cm
    )) 

width <- panelSize(1.7)*mmToInch
height <- panelSize(1.3)*mmToInch
fileName <- paste0(\rad21perc_enh\)
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()  



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVhHNXdaV0ZyTGxKQlJESXhJRHd0SUdsdGNHOXlkRkJsWVdzb2FHVnlaU2h5WldaRWFYSXNJRnhjTXpNeU5UQmZVa0ZFTWpGZllXSTVPVEpmUW5KMVkyVXRORjl3WldGcmN5NXRaWEpuWlZCbFlXc3VZbVZrWEZ3cEtWeHVaM0p2ZFhBeElEd3RJR1p5WldGa0tHaGxjbVVvY21WbVJHbHlMQ0JjWEdkbGJtVk1hWE4wWDJSVVFVZGZkbk5mUkUxVFQxOVNUa0ZmYkc5dmNGOWlhVzVoY25sSGNtOTFjREV1ZEhOMlhGd3BLU1JuWlc1bFhHNW5jbTkxY0RJZ1BDMGdabkpsWVdRb2FHVnlaU2h5WldaRWFYSXNJRnhjWjJWdVpVeHBjM1JmWkZSQlIxOTJjMTlFVFZOUFgxSk9RVjlzYjI5d1gySnBibUZ5ZVVkeWIzVndNaTUwYzNaY1hDa3BKR2RsYm1WY2JseHVYRzRqSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNalhHNXVZVzFsSUR3dElGeGNZMmh5YjIxdlgyTnZibk5mWVc1dWIwaHBaWEpoY21Ob2VWeGNYRzVjYm1kbGJtVkJibTV2UkdGMFlTQThMU0JzYjJGa1RHOXZjRUZ1Ym05RVlYUmhLR2hsY21Vb1kyOXVjMlZ1YzNWelJHbHlMQ0J3WVhOMFpUQW9ibUZ0WlN3Z1hGeGZjQzF1WDJWdWMyVnRZbXhNYVhOMExuUnpkbHhjS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwWm1aRGRYUnZabVlnUFNBd0xqSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGdWJtOU1hWE4wSUQwZ1l5aGNYRkF0UlZ4Y0tTbGNibHh1ZEdWdGNERWdQQzBnWjJWdVpVRnVibTlFWVhSaElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtFRXhJRDA5SUZ4Y1JWeGNLU0FsUGlVZ1pIQnNlWEk2T25ObGJHVmpkQ2hqYUhKdmJURXNJSE4wWVhKME1Td2daVzVrTVN3Z1oyVnVaU2xjYm1OdmJHNWhiV1Z6S0hSbGJYQXhLU0E4TFNCaktGeGNZMmh5WEZ3c0lGeGNjM1JoY25SY1hDd2dYRnhsYm1SY1hDd2dYRnhuWlc1bFhGd3BYRzUwWlcxd01pQThMU0JuWlc1bFFXNXViMFJoZEdFZ0pUNGxJR1J3YkhseU9qcG1hV3gwWlhJb1FUSWdQVDBnWEZ4RlhGd3BJQ1UrSlNCa2NHeDVjam82YzJWc1pXTjBLR05vY205dE1pd2djM1JoY25ReUxDQmxibVF5TENCblpXNWxLVnh1WTI5c2JtRnRaWE1vZEdWdGNESXBJRHd0SUdNb1hGeGphSEpjWEN3Z1hGeHpkR0Z5ZEZ4Y0xDQmNYR1Z1WkZ4Y0xDQmNYR2RsYm1WY1hDbGNibHh1Wlc1b1FXNWphRzl5Y3lBOExTQmlhVzVrWDNKdmQzTW9kR1Z0Y0RFc0lIUmxiWEF5S1NBbFBpVWdkVzV1WlhOMEtHZGxibVVwSUNVK0pWeHVJQ0JrY0d4NWNqbzZiWFYwWVhSbEtGeHVJQ0FnSUdkeWIzVndJRDBnWTJGelpWOTNhR1Z1S0Z4dUlDQWdJQ0FnWjJWdVpTQWxhVzRsSUdkeWIzVndNU0IrSUZ4Y1IzSndNVnhjTEZ4dUlDQWdJQ0FnWjJWdVpTQWxhVzRsSUdkeWIzVndNaUIrSUZ4Y1IzSndNbHhjTEZ4dUlDQWdJQ0FnVkZKVlJTQitJRTVCWEc0Z0lDQWdLVnh1SUNBcElDVStKU0JrY0d4NWNqbzZabWxzZEdWeUtDRnBjeTV1WVNobmNtOTFjQ2twWEc1Y2JtVnVhQ0E4TFNCdFlXdGxSMUpoYm1kbGMwWnliMjFFWVhSaFJuSmhiV1VvWlc1b1FXNWphRzl5Y3lBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoaktERXNJRElzSURNcEtTbGNibHh1SXlCRGIzVnVkQ0J2ZG1WeWJHRndjeUJpWlhSM1pXVnVJSEJsWVd0eklHRnVaQ0JuWlc1bGMxeHViM1psY214aGNGOWpiM1Z1ZEhNZ1BDMGdZMjkxYm5SUGRtVnliR0Z3Y3lobGJtZ3NJSEJsWVdzdVVrRkVNakVwWEc1Y2JpTWdRV1JrSUc5MlpYSnNZWEFnWTI5MWJuUnpJSFJ2SUhSb1pTQnZjbWxuYVc1aGJDQm5aVzVsTG5SaUlHUmhkR0ZjYm1WdWFFRnVZMmh2Y25Na2NHVmhhMTlqYjNWdWRDQThMU0J2ZG1WeWJHRndYMk52ZFc1MGMxeHVYRzVsYm1oQmJtTm9iM0p6SUR3dElHVnVhRUZ1WTJodmNuTWdKVDRsSUdSd2JIbHlPanB0ZFhSaGRHVW9YRzRnSUhCbFlXdEhjbTkxY0NBOUlHTmhjMlZmZDJobGJpaGNiaUFnSUNCd1pXRnJYMk52ZFc1MElEMDlJREFnZmlCY1hIQmxZV3RPZFcwd1hGd3NYRzRnSUNBZ2NHVmhhMTlqYjNWdWRDQTlQU0F4SUg0Z1hGeHdaV0ZyVG5WdE1WeGNMRnh1SUNBZ0lIQmxZV3RmWTI5MWJuUWdQVDBnTWlCK0lGeGNjR1ZoYTA1MWJUSmNYQ3hjYmlBZ0lDQndaV0ZyWDJOdmRXNTBJRDA5SURNZ2ZpQmNYSEJsWVd0T2RXMHpYRndzWEc0Z0lDQWdjR1ZoYTE5amIzVnVkQ0ErUFNBMElINGdYRnh3WldGclRuVnRUM1psY2pSY1hGeHVJQ0FwWEc0cFhHNWNibUZoWVNBOExTQmxibWhCYm1Ob2IzSnpJQ1UrSlNCY2JpQWdaSEJzZVhJNk9uTmxiR1ZqZENobmNtOTFjQ3dnY0dWaGEwZHliM1Z3TENCblpXNWxLU0FsUGlWY2JpQWdaSEJzZVhJNk9tMTFkR0YwWlNob1lYTlFaV0ZySUQwZ2FXWmxiSE5sS0hCbFlXdEhjbTkxY0NBOVBTQmNYSEJsWVd0T2RXMHdYRndzSUVaQlRGTkZMQ0JVVWxWRktTbGNibHh1WW1KaUlEd3RJR0ZoWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY1hFZHljREZjWENrZ1hHNXpkVzBvWW1KaUpHaGhjMUJsWVdzcEwyNXliM2NvWW1KaUtWeHVZbUppSUR3dElHRmhZU0FsUGlVZ1pIQnNlWEk2T21acGJIUmxjaWhuY205MWNDQTlQU0JjWEVkeWNESmNYQ2tnWEc1emRXMG9ZbUppSkdoaGMxQmxZV3NwTDI1eWIzY29ZbUppS1Z4dVhHNWNibUZoWVY5emRXMXRZWEo1SUR3dElHRmhZU0FsUGlWY2JpQWdaM0p2ZFhCZllua29aM0p2ZFhBc0lIQmxZV3RIY205MWNDa2dKVDRsWEc0Z0lITjFiVzFoY21sNlpTaGpiM1Z1ZENBOUlHNG9LU3dnTG1keWIzVndjeUE5SUZ4Y1pISnZjRnhjS1Z4dVhHNGpJRU55WldGMFpTQjBhR1VnYzNSaFkydGxaQ0JpWVhKd2JHOTBYRzVoWVdGZmMzVnRiV0Z5ZVNBOExTQmhZV0VnSlQ0bFhHNGdJR2R5YjNWd1gySjVLR2R5YjNWd0xDQndaV0ZyUjNKdmRYQXBJQ1UrSlZ4dUlDQnpkVzF0WVhKcGVtVW9ZMjkxYm5RZ1BTQnVLQ2tzSUM1bmNtOTFjSE1nUFNCY1hHUnliM0JjWENrZ0pUNGxYRzRnSUdkeWIzVndYMko1S0dkeWIzVndLU0FsUGlWY2JpQWdiWFYwWVhSbEtISmhkR2x2SUQwZ1kyOTFiblFnTHlCemRXMG9ZMjkxYm5RcEtWeHVYRzRqSUVSbFptbHVaU0IwYUdVZ1ozSmhaR2xsYm5RZ1kyOXNiM0p6WEc0aklHZHlZV1JwWlc1MFgyTnZiRzl5Y3lBOExTQmpLRnhjSTBRMFJEUkVORnhjTENCY1hDTkVRMEl3UVVaY1hDd2dYRndqUlRRNFJEaEJYRndzSUZ4Y0kwVkROamsyTlZ4Y0xDQmNYQ05HTkRRMk5ERmNYQ2xjYm1keVlXUnBaVzUwWDJOdmJHOXljeUE4TFNCaktGeGNJMFEwUkRSRU5GeGNMQ0JjWENOQk1rSkNRMEZjWEN3Z1hGd2pOekZCTWtNd1hGd3NJRnhjSXpOR09EbENOMXhjTENCY1hDTXdSVGN4UVVSY1hDbGNibHh1SXlCRGNtVmhkR1VnZEdobElITjBZV05yWldRZ1ltRnljR3h2ZENCM2FYUm9JR2R5WVdScFpXNTBJR052Ykc5eWMxeHVjQ0E4TFNCblozQnNiM1FvWVdGaFgzTjFiVzFoY25rc0lHRmxjeWg0SUQwZ1ozSnZkWEFzSUhrZ1BTQnlZWFJwYnl3Z1ptbHNiQ0E5SUhCbFlXdEhjbTkxY0NrcElDdGNiaUFnWjJWdmJWOWlZWElvYzNSaGRDQTlJRnhjYVdSbGJuUnBkSGxjWEN3Z2NHOXphWFJwYjI0Z1BTQmNYSE4wWVdOclhGd3NYRzRnSUNBZ0lDQWdJQ0FnSUd4cGJtVjNhV1IwYUNBOUlHeHBibVZOWldScGRXMGdLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNLU0FyWEc0Z0lIUm9aVzFsWDJOc1lYTnphV01vS1NBcklHeGhZbk1vZUNBOUlFNVZURXdnTENCNUlEMGdYRnhTWVhScGIxeGNLU0FyWEc0Z0lIUm9aVzFsS0Z4dUlDQWdJR0Y0YVhNdWRHbDBiR1VnUFNCbGJHVnRaVzUwWDNSbGVIUW9YRzRnSUNBZ0lDQnphWHBsSUQwZ1ptOXVkRk5wZW1WTkxDQm1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2dZMjlzYjNJZ1BTQmNYQ013TURBd01EQmNYRnh1SUNBZ0lDa3NYRzRnSUNBZ1lYaHBjeTUwWlhoMElEMGdaV3hsYldWdWRGOTBaWGgwS0Z4dUlDQWdJQ0FnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeXdnWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUdOdmJHOXlJRDBnWEZ3ak1EQXdNREF3WEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJR0Y0YVhNdWJHbHVaU0E5SUdWc1pXMWxiblJmYkdsdVpTaGNiaUFnSUNBZ0lHTnZiRzl5SUQwZ1hGd2pNREF3TURBd1hGd3NJSE5wZW1VZ1BTQnNhVzVsVkdocFkyc2dLaUJ0YlZSdlRHbHVaVlZ1YVhRc0lHeHBibVZsYm1RZ1BTQmNYSE54ZFdGeVpWeGNYRzRnSUNBZ0tTeGNiaUFnSUNCaGVHbHpMblJwWTJ0eklEMGdaV3hsYldWdWRGOXNhVzVsS0Z4dUlDQWdJQ0FnWTI5c2IzSWdQU0JjWENNd01EQXdNREJjWEN3Z2MybDZaU0E5SUd4cGJtVlVhR2xqYXlBcUlHMXRWRzlNYVc1bFZXNXBkQ3dnYkdsdVpXVnVaQ0E5SUZ4Y2MzRjFZWEpsWEZ4Y2JpQWdJQ0FwTEZ4dUlDQWdJSEJoYm1Wc0xtSmhZMnRuY205MWJtUWdQU0JsYkdWdFpXNTBYM0psWTNRb1ptbHNiQ0E5SUZ4Y2RISmhibk53WVhKbGJuUmNYQ2tzWEc0Z0lDQWdiR1ZuWlc1a0xuUmxlSFFnUFNCbGJHVnRaVzUwWDNSbGVIUW9abUZ0YVd4NUlEMGdabTl1ZEZSNWNHVXNJSE5wZW1VZ1BTQm1iMjUwVTJsNlpWTXBMRnh1SUNBZ0lHeGxaMlZ1WkM1MGFYUnNaU0E5SUdWc1pXMWxiblJmZEdWNGRDaG1ZVzFwYkhrZ1BTQm1iMjUwVkhsd1pTd2djMmw2WlNBOUlHWnZiblJUYVhwbFV5bGNiaUFnS1NBclhHNGdJSE5qWVd4bFgyWnBiR3hmYldGdWRXRnNLSFpoYkhWbGN5QTlJR2R5WVdScFpXNTBYMk52Ykc5eWN5d2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdkMWFXUmxJRDBnWjNWcFpHVmZiR1ZuWlc1a0tGeHVJQ0FnSUNBZ2IzWmxjbkpwWkdVdVlXVnpJRDBnYkdsemRDaHphWHBsSUQwZ01DNDFLU3dnSXlCQlpHcDFjM1FnYkdWblpXNWtJR3RsZVNCemVXMWliMndnYzJsNlpWeHVJQ0FnSUNBZ2EyVjVkMmxrZEdnZ1BTQXlJQzhnTWk0MU5Dd2dJeUJEYjI1MlpYSjBJREp0YlNCMGJ5QmpiVnh1SUNBZ0lDQWdhMlY1YUdWcFoyaDBJRDBnTWlBdklESXVOVFFnSXlCRGIyNTJaWEowSURKdGJTQjBieUJqYlZ4dUlDQWdJQ2twSUZ4dVhHNTNhV1IwYUNBOExTQndZVzVsYkZOcGVtVW9NUzQzS1NwdGJWUnZTVzVqYUZ4dWFHVnBaMmgwSUR3dElIQmhibVZzVTJsNlpTZ3hMak1wS20xdFZHOUpibU5vWEc1bWFXeGxUbUZ0WlNBOExTQndZWE4wWlRBb1hGeHlZV1F5TVhCbGNtTmZaVzVvWEZ3cFhHNXpkbWRzYVhSbEtHaGxjbVVvWm1sblJHbHlMQ0J3WVhOMFpUQW9abWxzWlU1aGJXVXNJRnhjTG5OMloxeGNLU2tzSUNCb1pXbG5hSFFnUFNCb1pXbG5hSFFzSUhkcFpIUm9JRDBnZDJsa2RHZ3BYRzV3Y21sdWRDaHdLVnh1WkdWMkxtOW1aaWdwSUNCY2JseHVZR0JnWEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5gYGByXG5cbnBlYWsuUkFEMjEgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgXFwzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWRcXCkpXG5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3ZcXCkpJGdlbmVcbmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgXFxnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdlxcKSkkZ2VuZVxuXG5cbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbm5hbWUgPC0gXFxjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5XFxcblxuZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCBcXF9wLW5fZW5zZW1ibExpc3QudHN2XFwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKFxcUC1FXFwpKVxuXG50ZW1wMSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQTEgPT0gXFxFXFwpICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBnZW5lKVxuY29sbmFtZXModGVtcDEpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGdlbmVcXClcbnRlbXAyIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihBMiA9PSBcXEVcXCkgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20yLCBzdGFydDIsIGVuZDIsIGdlbmUpXG5jb2xuYW1lcyh0ZW1wMikgPC0gYyhcXGNoclxcLCBcXHN0YXJ0XFwsIFxcZW5kXFwsIFxcZ2VuZVxcKVxuXG5lbmhBbmNob3JzIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIpICU+JSB1bm5lc3QoZ2VuZSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoXG4gICAgZ3JvdXAgPSBjYXNlX3doZW4oXG4gICAgICBnZW5lICVpbiUgZ3JvdXAxIH4gXFxHcnAxXFwsXG4gICAgICBnZW5lICVpbiUgZ3JvdXAyIH4gXFxHcnAyXFwsXG4gICAgICBUUlVFIH4gTkFcbiAgICApXG4gICkgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSlcblxuZW5oIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShlbmhBbmNob3JzICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpKVxuXG4jIENvdW50IG92ZXJsYXBzIGJldHdlZW4gcGVha3MgYW5kIGdlbmVzXG5vdmVybGFwX2NvdW50cyA8LSBjb3VudE92ZXJsYXBzKGVuaCwgcGVhay5SQUQyMSlcblxuIyBBZGQgb3ZlcmxhcCBjb3VudHMgdG8gdGhlIG9yaWdpbmFsIGdlbmUudGIgZGF0YVxuZW5oQW5jaG9ycyRwZWFrX2NvdW50IDwtIG92ZXJsYXBfY291bnRzXG5cbmVuaEFuY2hvcnMgPC0gZW5oQW5jaG9ycyAlPiUgZHBseXI6Om11dGF0ZShcbiAgcGVha0dyb3VwID0gY2FzZV93aGVuKFxuICAgIHBlYWtfY291bnQgPT0gMCB+IFxccGVha051bTBcXCxcbiAgICBwZWFrX2NvdW50ID09IDEgfiBcXHBlYWtOdW0xXFwsXG4gICAgcGVha19jb3VudCA9PSAyIH4gXFxwZWFrTnVtMlxcLFxuICAgIHBlYWtfY291bnQgPT0gMyB+IFxccGVha051bTNcXCxcbiAgICBwZWFrX2NvdW50ID49IDQgfiBcXHBlYWtOdW1PdmVyNFxcXG4gIClcbilcblxuYWFhIDwtIGVuaEFuY2hvcnMgJT4lIFxuICBkcGx5cjo6c2VsZWN0KGdyb3VwLCBwZWFrR3JvdXAsIGdlbmUpICU+JVxuICBkcGx5cjo6bXV0YXRlKGhhc1BlYWsgPSBpZmVsc2UocGVha0dyb3VwID09IFxccGVha051bTBcXCwgRkFMU0UsIFRSVUUpKVxuXG5iYmIgPC0gYWFhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcR3JwMVxcKSBcbnN1bShiYmIkaGFzUGVhaykvbnJvdyhiYmIpXG5iYmIgPC0gYWFhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IFxcR3JwMlxcKSBcbnN1bShiYmIkaGFzUGVhaykvbnJvdyhiYmIpXG5cblxuYWFhX3N1bW1hcnkgPC0gYWFhICU+JVxuICBncm91cF9ieShncm91cCwgcGVha0dyb3VwKSAlPiVcbiAgc3VtbWFyaXplKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gXFxkcm9wXFwpXG5cbiMgQ3JlYXRlIHRoZSBzdGFja2VkIGJhcnBsb3RcbmFhYV9zdW1tYXJ5IDwtIGFhYSAlPiVcbiAgZ3JvdXBfYnkoZ3JvdXAsIHBlYWtHcm91cCkgJT4lXG4gIHN1bW1hcml6ZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9IFxcZHJvcFxcKSAlPiVcbiAgZ3JvdXBfYnkoZ3JvdXApICU+JVxuICBtdXRhdGUocmF0aW8gPSBjb3VudCAvIHN1bShjb3VudCkpXG5cbiMgRGVmaW5lIHRoZSBncmFkaWVudCBjb2xvcnNcbiMgZ3JhZGllbnRfY29sb3JzIDwtIGMoXFwjRDRENEQ0XFwsIFxcI0RDQjBBRlxcLCBcXCNFNDhEOEFcXCwgXFwjRUM2OTY1XFwsIFxcI0Y0NDY0MVxcKVxuZ3JhZGllbnRfY29sb3JzIDwtIGMoXFwjRDRENEQ0XFwsIFxcI0EyQkJDQVxcLCBcXCM3MUEyQzBcXCwgXFwjM0Y4OUI3XFwsIFxcIzBFNzFBRFxcKVxuXG4jIENyZWF0ZSB0aGUgc3RhY2tlZCBiYXJwbG90IHdpdGggZ3JhZGllbnQgY29sb3JzXG5wIDwtIGdncGxvdChhYWFfc3VtbWFyeSwgYWVzKHggPSBncm91cCwgeSA9IHJhdGlvLCBmaWxsID0gcGVha0dyb3VwKSkgK1xuICBnZW9tX2JhcihzdGF0ID0gXFxpZGVudGl0eVxcLCBwb3NpdGlvbiA9IFxcc3RhY2tcXCxcbiAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFwpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgbGFicyh4ID0gTlVMTCAsIHkgPSBcXFJhdGlvXFwpICtcbiAgdGhlbWUoXG4gICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFxcIzAwMDAwMFxcXG4gICAgKSxcbiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFxcIzAwMDAwMFxcLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXFxzcXVhcmVcXFxuICAgICksXG4gICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gXFx0cmFuc3BhcmVudFxcKSxcbiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksXG4gICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKVxuICApICtcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gZ3JhZGllbnRfY29sb3JzLCBcbiAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQoXG4gICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAwLjUpLCAjIEFkanVzdCBsZWdlbmQga2V5IHN5bWJvbCBzaXplXG4gICAgICBrZXl3aWR0aCA9IDIgLyAyLjU0LCAjIENvbnZlcnQgMm1tIHRvIGNtXG4gICAgICBrZXloZWlnaHQgPSAyIC8gMi41NCAjIENvbnZlcnQgMm1tIHRvIGNtXG4gICAgKSkgXG5cbndpZHRoIDwtIHBhbmVsU2l6ZSgxLjcpKm1tVG9JbmNoXG5oZWlnaHQgPC0gcGFuZWxTaXplKDEuMykqbW1Ub0luY2hcbmZpbGVOYW1lIDwtIHBhc3RlMChcXHJhZDIxcGVyY19lbmhcXClcbnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwuc3ZnXFwpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aClcbnByaW50KHApXG5kZXYub2ZmKCkgIFxuXG5gYGBcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5wZWFrLlJBRDIxIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFxcMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXFwpKVxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcXGdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XFwpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFxcZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcXCkpJGdlbmVcblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5uYW1lIDwtIFxcY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVxcXG5cbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXFxfcC1uX2Vuc2VtYmxMaXN0LnRzdlxcKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcXFAtRVxcKSlcblxudGVtcDEgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEExID09IFxcRVxcKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgZ2VuZSlcbmNvbG5hbWVzKHRlbXAxKSA8LSBjKFxcY2hyXFwsIFxcc3RhcnRcXCwgXFxlbmRcXCwgXFxnZW5lXFwpXG50ZW1wMiA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQTIgPT0gXFxFXFwpICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMiwgc3RhcnQyLCBlbmQyLCBnZW5lKVxuY29sbmFtZXModGVtcDIpIDwtIGMoXFxjaHJcXCwgXFxzdGFydFxcLCBcXGVuZFxcLCBcXGdlbmVcXClcblxuZW5oQW5jaG9ycyA8LSBiaW5kX3Jvd3ModGVtcDEsIHRlbXAyKSAlPiUgdW5uZXN0KGdlbmUpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyb3VwID0gY2FzZV93aGVuKFxuICAgICAgZ2VuZSAlaW4lIGdyb3VwMSB+IFxcR3JwMVxcLFxuICAgICAgZ2VuZSAlaW4lIGdyb3VwMiB+IFxcR3JwMlxcLFxuICAgICAgVFJVRSB+IE5BXG4gICAgKVxuICApICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cbmVuaCA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZW5oQW5jaG9ycyAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKSlcblxuIyBDb3VudCBvdmVybGFwcyBiZXR3ZWVuIHBlYWtzIGFuZCBnZW5lc1xub3ZlcmxhcF9jb3VudHMgPC0gY291bnRPdmVybGFwcyhlbmgsIHBlYWsuUkFEMjEpXG5cbiMgQWRkIG92ZXJsYXAgY291bnRzIHRvIHRoZSBvcmlnaW5hbCBnZW5lLnRiIGRhdGFcbmVuaEFuY2hvcnMkcGVha19jb3VudCA8LSBvdmVybGFwX2NvdW50c1xuXG5lbmhBbmNob3JzIDwtIGVuaEFuY2hvcnMgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHBlYWtHcm91cCA9IGNhc2Vfd2hlbihcbiAgICBwZWFrX2NvdW50ID09IDAgfiBcXHBlYWtOdW0wXFwsXG4gICAgcGVha19jb3VudCA9PSAxIH4gXFxwZWFrTnVtMVxcLFxuICAgIHBlYWtfY291bnQgPT0gMiB+IFxccGVha051bTJcXCxcbiAgICBwZWFrX2NvdW50ID09IDMgfiBcXHBlYWtOdW0zXFwsXG4gICAgcGVha19jb3VudCA+PSA0IH4gXFxwZWFrTnVtT3ZlcjRcXFxuICApXG4pXG5cbmFhYSA8LSBlbmhBbmNob3JzICU+JSBcbiAgZHBseXI6OnNlbGVjdChncm91cCwgcGVha0dyb3VwLCBnZW5lKSAlPiVcbiAgZHBseXI6Om11dGF0ZShoYXNQZWFrID0gaWZlbHNlKHBlYWtHcm91cCA9PSBcXHBlYWtOdW0wXFwsIEZBTFNFLCBUUlVFKSlcblxuYmJiIDwtIGFhYSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXEdycDFcXCkgXG5zdW0oYmJiJGhhc1BlYWspL25yb3coYmJiKVxuYmJiIDwtIGFhYSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcXEdycDJcXCkgXG5zdW0oYmJiJGhhc1BlYWspL25yb3coYmJiKVxuXG5cbmFhYV9zdW1tYXJ5IDwtIGFhYSAlPiVcbiAgZ3JvdXBfYnkoZ3JvdXAsIHBlYWtHcm91cCkgJT4lXG4gIHN1bW1hcml6ZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9IFxcZHJvcFxcKVxuXG4jIENyZWF0ZSB0aGUgc3RhY2tlZCBiYXJwbG90XG5hYWFfc3VtbWFyeSA8LSBhYWEgJT4lXG4gIGdyb3VwX2J5KGdyb3VwLCBwZWFrR3JvdXApICU+JVxuICBzdW1tYXJpemUoY291bnQgPSBuKCksIC5ncm91cHMgPSBcXGRyb3BcXCkgJT4lXG4gIGdyb3VwX2J5KGdyb3VwKSAlPiVcbiAgbXV0YXRlKHJhdGlvID0gY291bnQgLyBzdW0oY291bnQpKVxuXG4jIERlZmluZSB0aGUgZ3JhZGllbnQgY29sb3JzXG4jIGdyYWRpZW50X2NvbG9ycyA8LSBjKFxcI0Q0RDRENFxcLCBcXCNEQ0IwQUZcXCwgXFwjRTQ4RDhBXFwsIFxcI0VDNjk2NVxcLCBcXCNGNDQ2NDFcXClcbmdyYWRpZW50X2NvbG9ycyA8LSBjKFxcI0Q0RDRENFxcLCBcXCNBMkJCQ0FcXCwgXFwjNzFBMkMwXFwsIFxcIzNGODlCN1xcLCBcXCMwRTcxQURcXClcblxuIyBDcmVhdGUgdGhlIHN0YWNrZWQgYmFycGxvdCB3aXRoIGdyYWRpZW50IGNvbG9yc1xucCA8LSBnZ3Bsb3QoYWFhX3N1bW1hcnksIGFlcyh4ID0gZ3JvdXAsIHkgPSByYXRpbywgZmlsbCA9IHBlYWtHcm91cCkpICtcbiAgZ2VvbV9iYXIoc3RhdCA9IFxcaWRlbnRpdHlcXCwgcG9zaXRpb24gPSBcXHN0YWNrXFwsXG4gICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXFxSYXRpb1xcKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcXCMwMDAwMDBcXFxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXFwjMDAwMDAwXFxcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXFwjMDAwMDAwXFwsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcXHNxdWFyZVxcXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcXCMwMDAwMDBcXCwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFxcc3F1YXJlXFxcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFxcdHJhbnNwYXJlbnRcXCksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGdyYWRpZW50X2NvbG9ycywgXG4gICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKFxuICAgICAgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMC41KSwgIyBBZGp1c3QgbGVnZW5kIGtleSBzeW1ib2wgc2l6ZVxuICAgICAga2V5d2lkdGggPSAyIC8gMi41NCwgIyBDb252ZXJ0IDJtbSB0byBjbVxuICAgICAga2V5aGVpZ2h0ID0gMiAvIDIuNTQgIyBDb252ZXJ0IDJtbSB0byBjbVxuICAgICkpIFxuXG53aWR0aCA8LSBwYW5lbFNpemUoMS43KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjMpKm1tVG9JbmNoXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxyYWQyMXBlcmNfZW5oXFwpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpICBcblxuYGBgXG5gYGAifQ== -->

```r
```r

peak.RAD21 <- importPeak(here(refDir, \33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed\))
group1 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv\))$gene
group2 <- fread(here(refDir, \geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv\))$gene


##########################################################
name <- \chromo_cons_annoHierarchy\

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, \_p-n_ensemblList.tsv\)),
                                      diffCutoff = 0.2,
                                      annoList = c(\P-E\))

temp1 <- geneAnnoData %>% dplyr::filter(A1 == \E\) %>% dplyr::select(chrom1, start1, end1, gene)
colnames(temp1) <- c(\chr\, \start\, \end\, \gene\)
temp2 <- geneAnnoData %>% dplyr::filter(A2 == \E\) %>% dplyr::select(chrom2, start2, end2, gene)
colnames(temp2) <- c(\chr\, \start\, \end\, \gene\)

enhAnchors <- bind_rows(temp1, temp2) %>% unnest(gene) %>%
  dplyr::mutate(
    group = case_when(
      gene %in% group1 ~ \Grp1\,
      gene %in% group2 ~ \Grp2\,
      TRUE ~ NA
    )
  ) %>% dplyr::filter(!is.na(group))

enh <- makeGRangesFromDataFrame(enhAnchors %>% dplyr::select(c(1, 2, 3)))

# Count overlaps between peaks and genes
overlap_counts <- countOverlaps(enh, peak.RAD21)

# Add overlap counts to the original gene.tb data
enhAnchors$peak_count <- overlap_counts

enhAnchors <- enhAnchors %>% dplyr::mutate(
  peakGroup = case_when(
    peak_count == 0 ~ \peakNum0\,
    peak_count == 1 ~ \peakNum1\,
    peak_count == 2 ~ \peakNum2\,
    peak_count == 3 ~ \peakNum3\,
    peak_count >= 4 ~ \peakNumOver4\
  )
)

aaa <- enhAnchors %>% 
  dplyr::select(group, peakGroup, gene) %>%
  dplyr::mutate(hasPeak = ifelse(peakGroup == \peakNum0\, FALSE, TRUE))

bbb <- aaa %>% dplyr::filter(group == \Grp1\) 
sum(bbb$hasPeak)/nrow(bbb)
bbb <- aaa %>% dplyr::filter(group == \Grp2\) 
sum(bbb$hasPeak)/nrow(bbb)


aaa_summary <- aaa %>%
  group_by(group, peakGroup) %>%
  summarize(count = n(), .groups = \drop\)

# Create the stacked barplot
aaa_summary <- aaa %>%
  group_by(group, peakGroup) %>%
  summarize(count = n(), .groups = \drop\) %>%
  group_by(group) %>%
  mutate(ratio = count / sum(count))

# Define the gradient colors
# gradient_colors <- c(\#D4D4D4\, \#DCB0AF\, \#E48D8A\, \#EC6965\, \#F44641\)
gradient_colors <- c(\#D4D4D4\, \#A2BBCA\, \#71A2C0\, \#3F89B7\, \#0E71AD\)

# Create the stacked barplot with gradient colors
p <- ggplot(aaa_summary, aes(x = group, y = ratio, fill = peakGroup)) +
  geom_bar(stat = \identity\, position = \stack\,
           linewidth = lineMedium * mmToLineUnit, lineend = \square\) +
  theme_classic() + labs(x = NULL , y = \Ratio\) +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = \#000000\
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = \#000000\
    ),
    axis.line = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    axis.ticks = element_line(
      color = \#000000\, size = lineThick * mmToLineUnit, lineend = \square\
    ),
    panel.background = element_rect(fill = \transparent\),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +
  scale_fill_manual(values = gradient_colors, 
                    guide = guide_legend(
      override.aes = list(size = 0.5), # Adjust legend key symbol size
      keywidth = 2 / 2.54, # Convert 2mm to cm
      keyheight = 2 / 2.54 # Convert 2mm to cm
    )) 

width <- panelSize(1.7)*mmToInch
height <- panelSize(1.3)*mmToInch
fileName <- paste0(\rad21perc_enh\)
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()  

```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


##### log2FC

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzVrWVhSaElEd3RJR1p5WldGa0tHaGxjbVVvY21WemRXeDBSR2x5TENCY0ltTm9jbTl0U0UxTlhDSXNJRndpUVRRNE5WOXdaUzF3WlY5aGJtTm9iM0p6WENJc0lGd2liM1psY214aGNGOWxibkpwWTJoZk1UQXdYM04wWVhSbExuUjRkRndpS1NsY2JtTnZiRzVoYldWektHUmhkR0VwSUR3dElHTW9YQ0p6ZEdGMFpWd2lMQ0JjSW1kbGJtOXRaVndpTENCY0luQmxMWEJsWDBFME9EVmZaRzkzYmx3aUxDQmNJbkJsTFhCbFgwRTBPRFZmYm05Y0lpd2dYQ0p3WlMxd1pWOUJORGcxWDNWd1hDSXBYRzVrWVhSaElEd3RJR1JoZEdFZ0pUNGxJR1J3YkhseU9qcHpaV3hsWTNRb0xXZGxibTl0WlNrZ0pUNGxJR0Z6TG0xaGRISnBlQ2dwWEc1Y2JpQWdZMjlzZFcxdVgzUnZYM0p2ZDI1aGJXVnpLSFpoY2lBOUlGd2ljM1JoZEdWY0lpa2dKVDRsWEc0Z0lHRnpMbTFoZEhKcGVDZ3BYRzVjYm14cFluSmhjbmtvWTJseVkyeHBlbVVwWEc1Y2JtTnZiRjltZFc0Z1BDMGdZMjlzYjNKU1lXMXdNaWhqS0RBc0lERXNJREV3S1N3Z1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWXloY0ltSnNkV1ZjSWl3Z1hDSjNhR2wwWlZ3aUxDQmNJbkpsWkZ3aUtTbGNibHh1YkdsaWNtRnllU2hqYVhKamJHbDZaU2xjYm1OdmJGOW1kVzRnUEMwZ1kyOXNiM0pTWVcxd01paGpLRzFwYmloa1lYUmhLU3dnYldGNEtHUmhkR0VwS1N3Z1l5aGNJbmRvYVhSbFhDSXNJRndpY21Wa1hDSXBLVnh1WEc1Y2JpTm1kbWw2WDI1aVkyeDFjM1FvWkdGMFlTd2dhMjFsWVc1ekxDQnRaWFJvYjJRZ1BTQmNJbmR6YzF3aUtWeHVYRzV3SUR3dElFaGxZWFJ0WVhBb1hHNGdJR1JoZEdFc1hHNGdJRzVoYldVZ1BTQmNJazlrWkhNZ1VtRjBhVzljSWl3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5Qk9ZVzFsSUc5bUlIUm9aU0JvWldGMGJXRndJR3hsWjJWdVpGeHVJQ0JqYkhWemRHVnlYMk52YkhWdGJuTWdQU0JHUVV4VFJTd2dJQ0FnSUNBZ0lDQWdJQ0FqSUZKbGJXOTJaU0JqYjJ4MWJXNGdaR1Z1WkhKdlozSmhiVnh1SUNCeWIzZGZhMjBnUFNBeE1Dd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0l5QkVaV1pwYm1VZ2RHaGxJRzUxYldKbGNpQnZaaUJyTFcxbFlXNXpJR05zZFhOMFpYSnpJR1p2Y2lCeWIzZHpJQ2hoWkdwMWMzUWdZWE1nYm1WbFpHVmtLVnh1SUNCemFHOTNYM0p2ZDE5a1pXNWtJRDBnUmtGTVUwVXNYRzRnSUdOdmJDQTlJR052YkY5bWRXNHNYRzRnSUdKdmNtUmxjaUE5SUZSU1ZVVmNiaWxjYmx4dVptbHNaVTVoYldVZ1BDMGdjR0Z6ZEdVd0tGd2lZVzVqYUc5eVRFOU1RVjlrVkVGSFgzWnpYMFJOVTA5ZlpHbG1aakF1TWw5aGJHeE1iMjl3YzE5bGVIUnlaVzFsWDNKbFowRnVZMmh2Y2tKaFkydG5jbTkxYm1SZllYUmhZMXdpS1Z4dWFHVnBaMmgwSUR3dElEZGNibmRwWkhSb0lEd3RJRE11TlZ4dWNHNW5LR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuQnVaMXdpS1Nrc0lISmxjeUE5SURZd01Dd2dkVzVwZENBOUlGd2lhVzVjSWl3Z2FHVnBaMmgwSUQwZ2FHVnBaMmgwTENCM2FXUjBhQ0E5SUhkcFpIUm9LVnh1Y0hKcGJuUW9jQ2xjYm1SbGRpNXZabVlvS1Z4dWMzWm5iR2wwWlNob1pYSmxLR1pwWjBScGNpd2djR0Z6ZEdVd0tHWnBiR1ZPWVcxbExDQmNJaTV6ZG1kY0lpa3BMQ0FnYUdWcFoyaDBJRDBnYUdWcFoyaDBMQ0IzYVdSMGFDQTlJSGRwWkhSb0tWeHVjSEpwYm5Rb2NDbGNibVJsZGk1dlptWW9LVnh1WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5cbmRhdGEgPC0gZnJlYWQoaGVyZShyZXN1bHREaXIsIFxcY2hyb21ITU1cXCwgXFxBNDg1X3BlLXBlX2FuY2hvcnNcXCwgXFxvdmVybGFwX2VucmljaF8xMDBfc3RhdGUudHh0XFwpKVxuY29sbmFtZXMoZGF0YSkgPC0gYyhcXHN0YXRlXFwsIFxcZ2Vub21lXFwsIFxccGUtcGVfQTQ4NV9kb3duXFwsIFxccGUtcGVfQTQ4NV9ub1xcLCBcXHBlLXBlX0E0ODVfdXBcXClcbmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCgtZ2Vub21lKSAlPiUgYXMubWF0cml4KClcblxuICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gXFxzdGF0ZVxcKSAlPiVcbiAgYXMubWF0cml4KClcblxubGlicmFyeShjaXJjbGl6ZSlcblxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMTApLCBcbiAgICAgICAgICAgICAgICAgICAgICBjKFxcYmx1ZVxcLCBcXHdoaXRlXFwsIFxccmVkXFwpKVxuXG5saWJyYXJ5KGNpcmNsaXplKVxuY29sX2Z1biA8LSBjb2xvclJhbXAyKGMobWluKGRhdGEpLCBtYXgoZGF0YSkpLCBjKFxcd2hpdGVcXCwgXFxyZWRcXCkpXG5cblxuI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9IFxcd3NzXFwpXG5cbnAgPC0gSGVhdG1hcChcbiAgZGF0YSxcbiAgbmFtZSA9IFxcT2RkcyBSYXRpb1xcLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kXG4gIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtXG4gIHJvd19rbSA9IDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmluZSB0aGUgbnVtYmVyIG9mIGstbWVhbnMgY2x1c3RlcnMgZm9yIHJvd3MgKGFkanVzdCBhcyBuZWVkZWQpXG4gIHNob3dfcm93X2RlbmQgPSBGQUxTRSxcbiAgY29sID0gY29sX2Z1bixcbiAgYm9yZGVyID0gVFJVRVxuKVxuXG5maWxlTmFtZSA8LSBwYXN0ZTAoXFxhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2FsbExvb3BzX2V4dHJlbWVfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjXFwpXG5oZWlnaHQgPC0gN1xud2lkdGggPC0gMy41XG5wbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgXFwucG5nXFwpKSwgcmVzID0gNjAwLCB1bml0ID0gXFxpblxcLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFxcLnN2Z1xcKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->

data <- fread(here(resultDir, \chromHMM\, \A485_pe-pe_anchors\, \overlap_enrich_100_state.txt\))
colnames(data) <- c(\state\, \genome\, \pe-pe_A485_down\, \pe-pe_A485_no\, \pe-pe_A485_up\)
data <- data %>% dplyr::select(-genome) %>% as.matrix()

  column_to_rownames(var = \state\) %>%
  as.matrix()

library(circlize)

col_fun <- colorRamp2(c(0, 1, 10), 
                      c(\blue\, \white\, \red\))

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  row_km = 10,                         # Define the number of k-means clusters for rows (adjust as needed)
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)

fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_diff0.2_allLoops_extreme_regAnchorBackground_atac\)
height <- 7
width <- 3.5
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

````

```r

data <- fread(here(resultDir, \chromHMM\, \A485_pe-pe_anchors\, \overlap_enrich_100_state.txt\))
colnames(data) <- c(\state\, \genome\, \pe-pe_A485_down\, \pe-pe_A485_no\, \pe-pe_A485_up\)
data <- data %>% dplyr::select(-genome) %>% as.matrix()

  column_to_rownames(var = \state\) %>%
  as.matrix()

library(circlize)

col_fun <- colorRamp2(c(0, 1, 10), 
                      c(\blue\, \white\, \red\))

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c(\white\, \red\))


#fviz_nbclust(data, kmeans, method = \wss\)

p <- Heatmap(
  data,
  name = \Odds Ratio\,                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  row_km = 10,                         # Define the number of k-means clusters for rows (adjust as needed)
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)

fileName <- paste0(\anchorLOLA_dTAG_vs_DMSO_diff0.2_allLoops_extreme_regAnchorBackground_atac\)
height <- 7
width <- 3.5
png(here(figDir, paste0(fileName, \.png\)), res = 600, unit = \in\, height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, \.svg\)),  height = height, width = width)
print(p)
dev.off()

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### [3.44] Checking RAD21 peak density at group1 and group2 promoter

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVYRzV3WldGckxsSkJSREl4SUR3dElHbHRjRzl5ZEZCbFlXc29hR1Z5WlNoeVpXWkVhWElzSUZ3aU16TXlOVEJmVWtGRU1qRmZZV0k1T1RKZlFuSjFZMlV0TkY5d1pXRnJjeTV0WlhKblpWQmxZV3N1WW1Wa1hDSXBLVnh1WjNKdmRYQXhJRHd0SUdaeVpXRmtLR2hsY21Vb2NtVm1SR2x5TENCY0ltZGxibVZNYVhOMFgyUlVRVWRmZG5OZlJFMVRUMTlTVGtGZmJHOXZjRjlpYVc1aGNubEhjbTkxY0RFdWRITjJYQ0lwS1NSblpXNWxYRzVuY205MWNESWdQQzBnWm5KbFlXUW9hR1Z5WlNoeVpXWkVhWElzSUZ3aVoyVnVaVXhwYzNSZlpGUkJSMTkyYzE5RVRWTlBYMUpPUVY5c2IyOXdYMkpwYm1GeWVVZHliM1Z3TWk1MGMzWmNJaWtwSkdkbGJtVmNibHh1WEc0akl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpYRzV1WVcxbElEd3RJRndpWTJoeWIyMXZYMk52Ym5OZllXNXViMGhwWlhKaGNtTm9lVndpWEc1Y2JtZGxibVZCYm01dlJHRjBZU0E4TFNCc2IyRmtURzl2Y0VGdWJtOUVZWFJoS0dobGNtVW9ZMjl1YzJWdWMzVnpSR2x5TENCd1lYTjBaVEFvYm1GdFpTd2dYQ0pmY0MxdVgyVnVjMlZ0WW14TWFYTjBMblJ6ZGx3aUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdScFptWkRkWFJ2Wm1ZZ1BTQXdMaklzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnVibTlNYVhOMElEMGdZeWhjSWxBdFJWd2lLU2xjYmx4dWRHVnRjREVnUEMwZ1oyVnVaVUZ1Ym05RVlYUmhJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLRUV4SUQwOUlGd2lSVndpS1NBbFBpVWdaSEJzZVhJNk9uTmxiR1ZqZENoamFISnZiVEVzSUhOMFlYSjBNU3dnWlc1a01Td2daMlZ1WlNsY2JtTnZiRzVoYldWektIUmxiWEF4S1NBOExTQmpLRndpWTJoeVhDSXNJRndpYzNSaGNuUmNJaXdnWENKbGJtUmNJaXdnWENKblpXNWxYQ0lwWEc1MFpXMXdNaUE4TFNCblpXNWxRVzV1YjBSaGRHRWdKVDRsSUdSd2JIbHlPanBtYVd4MFpYSW9RVElnUFQwZ1hDSkZYQ0lwSUNVK0pTQmtjR3g1Y2pvNmMyVnNaV04wS0dOb2NtOXRNaXdnYzNSaGNuUXlMQ0JsYm1ReUxDQm5aVzVsS1Z4dVkyOXNibUZ0WlhNb2RHVnRjRElwSUR3dElHTW9YQ0pqYUhKY0lpd2dYQ0p6ZEdGeWRGd2lMQ0JjSW1WdVpGd2lMQ0JjSW1kbGJtVmNJaWxjYmx4dVpXNW9RVzVqYUc5eWN5QThMU0JpYVc1a1gzSnZkM01vZEdWdGNERXNJSFJsYlhBeUtTQWxQaVVnZFc1dVpYTjBLR2RsYm1VcElDVStKVnh1SUNCa2NHeDVjam82YlhWMFlYUmxLRnh1SUNBZ0lHZHliM1Z3SUQwZ1kyRnpaVjkzYUdWdUtGeHVJQ0FnSUNBZ1oyVnVaU0FsYVc0bElHZHliM1Z3TVNCK0lGd2lSM0p3TVZ3aUxGeHVJQ0FnSUNBZ1oyVnVaU0FsYVc0bElHZHliM1Z3TWlCK0lGd2lSM0p3TWx3aUxGeHVJQ0FnSUNBZ1ZGSlZSU0IrSUU1QlhHNGdJQ0FnS1Z4dUlDQXBJQ1UrSlNCa2NHeDVjam82Wm1sc2RHVnlLQ0ZwY3k1dVlTaG5jbTkxY0NrcFhHNWNibVZ1YUNBOExTQnRZV3RsUjFKaGJtZGxjMFp5YjIxRVlYUmhSbkpoYldVb1pXNW9RVzVqYUc5eWN5QWxQaVVnWkhCc2VYSTZPbk5sYkdWamRDaGpLREVzSURJc0lETXBLU2xjYmx4dUl5QkRiM1Z1ZENCdmRtVnliR0Z3Y3lCaVpYUjNaV1Z1SUhCbFlXdHpJR0Z1WkNCblpXNWxjMXh1YjNabGNteGhjRjlqYjNWdWRITWdQQzBnWTI5MWJuUlBkbVZ5YkdGd2N5aGxibWdzSUhCbFlXc3VVa0ZFTWpFcFhHNWNiaU1nUVdSa0lHOTJaWEpzWVhBZ1kyOTFiblJ6SUhSdklIUm9aU0J2Y21sbmFXNWhiQ0JuWlc1bExuUmlJR1JoZEdGY2JtVnVhRUZ1WTJodmNuTWtjR1ZoYTE5amIzVnVkQ0E4TFNCdmRtVnliR0Z3WDJOdmRXNTBjMXh1WEc1bGJtaEJibU5vYjNKeklEd3RJR1Z1YUVGdVkyaHZjbk1nSlQ0bElHUndiSGx5T2pwdGRYUmhkR1VvWEc0Z0lIQmxZV3RIY205MWNDQTlJR05oYzJWZmQyaGxiaWhjYmlBZ0lDQndaV0ZyWDJOdmRXNTBJRDA5SURBZ2ZpQmNJbkJsWVd0T2RXMHdYQ0lzWEc0Z0lDQWdjR1ZoYTE5amIzVnVkQ0E5UFNBeElINGdYQ0p3WldGclRuVnRNVndpTEZ4dUlDQWdJSEJsWVd0ZlkyOTFiblFnUFQwZ01pQitJRndpY0dWaGEwNTFiVEpjSWl4Y2JpQWdJQ0J3WldGclgyTnZkVzUwSUQwOUlETWdmaUJjSW5CbFlXdE9kVzB6WENJc1hHNGdJQ0FnY0dWaGExOWpiM1Z1ZENBK1BTQTBJSDRnWENKd1pXRnJUblZ0VDNabGNqUmNJbHh1SUNBcFhHNHBYRzVjYm1GaFlTQThMU0JsYm1oQmJtTm9iM0p6SUNVK0pTQmNiaUFnWkhCc2VYSTZPbk5sYkdWamRDaG5jbTkxY0N3Z2NHVmhhMGR5YjNWd0xDQm5aVzVsS1NBbFBpVmNiaUFnWkhCc2VYSTZPbTExZEdGMFpTaG9ZWE5RWldGcklEMGdhV1psYkhObEtIQmxZV3RIY205MWNDQTlQU0JjSW5CbFlXdE9kVzB3WENJc0lFWkJURk5GTENCVVVsVkZLU2xjYmx4dVltSmlJRHd0SUdGaFlTQWxQaVVnWkhCc2VYSTZPbVpwYkhSbGNpaG5jbTkxY0NBOVBTQmNJa2R5Y0RGY0lpa2dYRzV6ZFcwb1ltSmlKR2hoYzFCbFlXc3BMMjV5YjNjb1ltSmlLVnh1WW1KaUlEd3RJR0ZoWVNBbFBpVWdaSEJzZVhJNk9tWnBiSFJsY2lobmNtOTFjQ0E5UFNCY0lrZHljREpjSWlrZ1hHNXpkVzBvWW1KaUpHaGhjMUJsWVdzcEwyNXliM2NvWW1KaUtWeHVYRzVjYm1GaFlWOXpkVzF0WVhKNUlEd3RJR0ZoWVNBbFBpVmNiaUFnWjNKdmRYQmZZbmtvWjNKdmRYQXNJSEJsWVd0SGNtOTFjQ2tnSlQ0bFhHNGdJSE4xYlcxaGNtbDZaU2hqYjNWdWRDQTlJRzRvS1N3Z0xtZHliM1Z3Y3lBOUlGd2laSEp2Y0Z3aUtWeHVYRzRqSUVOeVpXRjBaU0IwYUdVZ2MzUmhZMnRsWkNCaVlYSndiRzkwWEc1aFlXRmZjM1Z0YldGeWVTQThMU0JoWVdFZ0pUNGxYRzRnSUdkeWIzVndYMko1S0dkeWIzVndMQ0J3WldGclIzSnZkWEFwSUNVK0pWeHVJQ0J6ZFcxdFlYSnBlbVVvWTI5MWJuUWdQU0J1S0Nrc0lDNW5jbTkxY0hNZ1BTQmNJbVJ5YjNCY0lpa2dKVDRsWEc0Z0lHZHliM1Z3WDJKNUtHZHliM1Z3S1NBbFBpVmNiaUFnYlhWMFlYUmxLSEpoZEdsdklEMGdZMjkxYm5RZ0x5QnpkVzBvWTI5MWJuUXBLVnh1WEc0aklFUmxabWx1WlNCMGFHVWdaM0poWkdsbGJuUWdZMjlzYjNKelhHNGpJR2R5WVdScFpXNTBYMk52Ykc5eWN5QThMU0JqS0Z3aUkwUTBSRFJFTkZ3aUxDQmNJaU5FUTBJd1FVWmNJaXdnWENJalJUUTRSRGhCWENJc0lGd2lJMFZETmprMk5Wd2lMQ0JjSWlOR05EUTJOREZjSWlsY2JtZHlZV1JwWlc1MFgyTnZiRzl5Y3lBOExTQmpLRndpSTBRMFJEUkVORndpTENCY0lpTkJNa0pDUTBGY0lpd2dYQ0lqTnpGQk1rTXdYQ0lzSUZ3aUl6TkdPRGxDTjF3aUxDQmNJaU13UlRjeFFVUmNJaWxjYmx4dUl5QkRjbVZoZEdVZ2RHaGxJSE4wWVdOclpXUWdZbUZ5Y0d4dmRDQjNhWFJvSUdkeVlXUnBaVzUwSUdOdmJHOXljMXh1Y0NBOExTQm5aM0JzYjNRb1lXRmhYM04xYlcxaGNua3NJR0ZsY3loNElEMGdaM0p2ZFhBc0lIa2dQU0J5WVhScGJ5d2dabWxzYkNBOUlIQmxZV3RIY205MWNDa3BJQ3RjYmlBZ1oyVnZiVjlpWVhJb2MzUmhkQ0E5SUZ3aWFXUmxiblJwZEhsY0lpd2djRzl6YVhScGIyNGdQU0JjSW5OMFlXTnJYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lHeHBibVYzYVdSMGFDQTlJR3hwYm1WTlpXUnBkVzBnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpS1NBclhHNGdJSFJvWlcxbFgyTnNZWE56YVdNb0tTQXJJR3hoWW5Nb2VDQTlJRTVWVEV3Z0xDQjVJRDBnWENKU1lYUnBiMXdpS1NBclhHNGdJSFJvWlcxbEtGeHVJQ0FnSUdGNGFYTXVkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWEc0Z0lDQWdJQ0J6YVhwbElEMGdabTl1ZEZOcGVtVk5MQ0JtWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnWTI5c2IzSWdQU0JjSWlNd01EQXdNREJjSWx4dUlDQWdJQ2tzWEc0Z0lDQWdZWGhwY3k1MFpYaDBJRDBnWld4bGJXVnVkRjkwWlhoMEtGeHVJQ0FnSUNBZ2MybDZaU0E5SUdadmJuUlRhWHBsVXl3Z1ptRnRhV3g1SUQwZ1ptOXVkRlI1Y0dVc0lHTnZiRzl5SUQwZ1hDSWpNREF3TURBd1hDSmNiaUFnSUNBcExGeHVJQ0FnSUdGNGFYTXViR2x1WlNBOUlHVnNaVzFsYm5SZmJHbHVaU2hjYmlBZ0lDQWdJR052Ykc5eUlEMGdYQ0lqTURBd01EQXdYQ0lzSUhOcGVtVWdQU0JzYVc1bFZHaHBZMnNnS2lCdGJWUnZUR2x1WlZWdWFYUXNJR3hwYm1WbGJtUWdQU0JjSW5OeGRXRnlaVndpWEc0Z0lDQWdLU3hjYmlBZ0lDQmhlR2x6TG5ScFkydHpJRDBnWld4bGJXVnVkRjlzYVc1bEtGeHVJQ0FnSUNBZ1kyOXNiM0lnUFNCY0lpTXdNREF3TURCY0lpd2djMmw2WlNBOUlHeHBibVZVYUdsamF5QXFJRzF0Vkc5TWFXNWxWVzVwZEN3Z2JHbHVaV1Z1WkNBOUlGd2ljM0YxWVhKbFhDSmNiaUFnSUNBcExGeHVJQ0FnSUhCaGJtVnNMbUpoWTJ0bmNtOTFibVFnUFNCbGJHVnRaVzUwWDNKbFkzUW9abWxzYkNBOUlGd2lkSEpoYm5Od1lYSmxiblJjSWlrc1hHNGdJQ0FnYkdWblpXNWtMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GdGFXeDVJRDBnWm05dWRGUjVjR1VzSUhOcGVtVWdQU0JtYjI1MFUybDZaVk1wTEZ4dUlDQWdJR3hsWjJWdVpDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2htWVcxcGJIa2dQU0JtYjI1MFZIbHdaU3dnYzJsNlpTQTlJR1p2Ym5SVGFYcGxVeWxjYmlBZ0tTQXJYRzRnSUhOallXeGxYMlpwYkd4ZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdkeVlXUnBaVzUwWDJOdmJHOXljeXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZDFhV1JsSUQwZ1ozVnBaR1ZmYkdWblpXNWtLRnh1SUNBZ0lDQWdiM1psY25KcFpHVXVZV1Z6SUQwZ2JHbHpkQ2h6YVhwbElEMGdNQzQxS1N3Z0l5QkJaR3AxYzNRZ2JHVm5aVzVrSUd0bGVTQnplVzFpYjJ3Z2MybDZaVnh1SUNBZ0lDQWdhMlY1ZDJsa2RHZ2dQU0F5SUM4Z01pNDFOQ3dnSXlCRGIyNTJaWEowSURKdGJTQjBieUJqYlZ4dUlDQWdJQ0FnYTJWNWFHVnBaMmgwSUQwZ01pQXZJREl1TlRRZ0l5QkRiMjUyWlhKMElESnRiU0IwYnlCamJWeHVJQ0FnSUNrcElGeHVYRzUzYVdSMGFDQThMU0J3WVc1bGJGTnBlbVVvTVM0M0tTcHRiVlJ2U1c1amFGeHVhR1ZwWjJoMElEd3RJSEJoYm1Wc1UybDZaU2d4TGpNcEttMXRWRzlKYm1Ob1hHNW1hV3hsVG1GdFpTQThMU0J3WVhOMFpUQW9YQ0p5WVdReU1YQmxjbU5mWlc1b1hDSXBYRzV6ZG1kc2FYUmxLR2hsY21Vb1ptbG5SR2x5TENCd1lYTjBaVEFvWm1sc1pVNWhiV1VzSUZ3aUxuTjJaMXdpS1Nrc0lDQm9aV2xuYUhRZ1BTQm9aV2xuYUhRc0lIZHBaSFJvSUQwZ2QybGtkR2dwWEc1d2NtbHVkQ2h3S1Z4dVpHVjJMbTltWmlncElDQmNibHh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcblxucGVhay5SQUQyMSA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBcIjMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZFwiKSlcbmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgXCJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdlwiKSkkZ2VuZVxuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2XCIpKSRnZW5lXG5cblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xubmFtZSA8LSBcImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlcIlxuXG5nZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsIFwiX3Atbl9lbnNlbWJsTGlzdC50c3ZcIikpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoXCJQLUVcIikpXG5cbnRlbXAxIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihBMSA9PSBcIkVcIikgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGdlbmUpXG5jb2xuYW1lcyh0ZW1wMSkgPC0gYyhcImNoclwiLCBcInN0YXJ0XCIsIFwiZW5kXCIsIFwiZ2VuZVwiKVxudGVtcDIgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEEyID09IFwiRVwiKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTIsIHN0YXJ0MiwgZW5kMiwgZ2VuZSlcbmNvbG5hbWVzKHRlbXAyKSA8LSBjKFwiY2hyXCIsIFwic3RhcnRcIiwgXCJlbmRcIiwgXCJnZW5lXCIpXG5cbmVuaEFuY2hvcnMgPC0gYmluZF9yb3dzKHRlbXAxLCB0ZW1wMikgJT4lIHVubmVzdChnZW5lKSAlPiVcbiAgZHBseXI6Om11dGF0ZShcbiAgICBncm91cCA9IGNhc2Vfd2hlbihcbiAgICAgIGdlbmUgJWluJSBncm91cDEgfiBcIkdycDFcIixcbiAgICAgIGdlbmUgJWluJSBncm91cDIgfiBcIkdycDJcIixcbiAgICAgIFRSVUUgfiBOQVxuICAgIClcbiAgKSAlPiUgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKVxuXG5lbmggPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGVuaEFuY2hvcnMgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSkpXG5cbiMgQ291bnQgb3ZlcmxhcHMgYmV0d2VlbiBwZWFrcyBhbmQgZ2VuZXNcbm92ZXJsYXBfY291bnRzIDwtIGNvdW50T3ZlcmxhcHMoZW5oLCBwZWFrLlJBRDIxKVxuXG4jIEFkZCBvdmVybGFwIGNvdW50cyB0byB0aGUgb3JpZ2luYWwgZ2VuZS50YiBkYXRhXG5lbmhBbmNob3JzJHBlYWtfY291bnQgPC0gb3ZlcmxhcF9jb3VudHNcblxuZW5oQW5jaG9ycyA8LSBlbmhBbmNob3JzICU+JSBkcGx5cjo6bXV0YXRlKFxuICBwZWFrR3JvdXAgPSBjYXNlX3doZW4oXG4gICAgcGVha19jb3VudCA9PSAwIH4gXCJwZWFrTnVtMFwiLFxuICAgIHBlYWtfY291bnQgPT0gMSB+IFwicGVha051bTFcIixcbiAgICBwZWFrX2NvdW50ID09IDIgfiBcInBlYWtOdW0yXCIsXG4gICAgcGVha19jb3VudCA9PSAzIH4gXCJwZWFrTnVtM1wiLFxuICAgIHBlYWtfY291bnQgPj0gNCB+IFwicGVha051bU92ZXI0XCJcbiAgKVxuKVxuXG5hYWEgPC0gZW5oQW5jaG9ycyAlPiUgXG4gIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIHBlYWtHcm91cCwgZ2VuZSkgJT4lXG4gIGRwbHlyOjptdXRhdGUoaGFzUGVhayA9IGlmZWxzZShwZWFrR3JvdXAgPT0gXCJwZWFrTnVtMFwiLCBGQUxTRSwgVFJVRSkpXG5cbmJiYiA8LSBhYWEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXCJHcnAxXCIpIFxuc3VtKGJiYiRoYXNQZWFrKS9ucm93KGJiYilcbmJiYiA8LSBhYWEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gXCJHcnAyXCIpIFxuc3VtKGJiYiRoYXNQZWFrKS9ucm93KGJiYilcblxuXG5hYWFfc3VtbWFyeSA8LSBhYWEgJT4lXG4gIGdyb3VwX2J5KGdyb3VwLCBwZWFrR3JvdXApICU+JVxuICBzdW1tYXJpemUoY291bnQgPSBuKCksIC5ncm91cHMgPSBcImRyb3BcIilcblxuIyBDcmVhdGUgdGhlIHN0YWNrZWQgYmFycGxvdFxuYWFhX3N1bW1hcnkgPC0gYWFhICU+JVxuICBncm91cF9ieShncm91cCwgcGVha0dyb3VwKSAlPiVcbiAgc3VtbWFyaXplKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gXCJkcm9wXCIpICU+JVxuICBncm91cF9ieShncm91cCkgJT4lXG4gIG11dGF0ZShyYXRpbyA9IGNvdW50IC8gc3VtKGNvdW50KSlcblxuIyBEZWZpbmUgdGhlIGdyYWRpZW50IGNvbG9yc1xuIyBncmFkaWVudF9jb2xvcnMgPC0gYyhcIiNENEQ0RDRcIiwgXCIjRENCMEFGXCIsIFwiI0U0OEQ4QVwiLCBcIiNFQzY5NjVcIiwgXCIjRjQ0NjQxXCIpXG5ncmFkaWVudF9jb2xvcnMgPC0gYyhcIiNENEQ0RDRcIiwgXCIjQTJCQkNBXCIsIFwiIzcxQTJDMFwiLCBcIiMzRjg5QjdcIiwgXCIjMEU3MUFEXCIpXG5cbiMgQ3JlYXRlIHRoZSBzdGFja2VkIGJhcnBsb3Qgd2l0aCBncmFkaWVudCBjb2xvcnNcbnAgPC0gZ2dwbG90KGFhYV9zdW1tYXJ5LCBhZXMoeCA9IGdyb3VwLCB5ID0gcmF0aW8sIGZpbGwgPSBwZWFrR3JvdXApKSArXG4gIGdlb21fYmFyKHN0YXQgPSBcImlkZW50aXR5XCIsIHBvc2l0aW9uID0gXCJzdGFja1wiLFxuICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXCJzcXVhcmVcIikgK1xuICB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9IFwiUmF0aW9cIikgK1xuICB0aGVtZShcbiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXCIjMDAwMDAwXCJcbiAgICApLFxuICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChcbiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9IFwiIzAwMDAwMFwiXG4gICAgKSxcbiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoXG4gICAgICBjb2xvciA9IFwiIzAwMDAwMFwiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gXCJzcXVhcmVcIlxuICAgICksXG4gICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXCIjMDAwMDAwXCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcInNxdWFyZVwiXG4gICAgKSxcbiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBcInRyYW5zcGFyZW50XCIpLFxuICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSxcbiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpXG4gICkgK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBncmFkaWVudF9jb2xvcnMsIFxuICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChcbiAgICAgIG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDAuNSksICMgQWRqdXN0IGxlZ2VuZCBrZXkgc3ltYm9sIHNpemVcbiAgICAgIGtleXdpZHRoID0gMiAvIDIuNTQsICMgQ29udmVydCAybW0gdG8gY21cbiAgICAgIGtleWhlaWdodCA9IDIgLyAyLjU0ICMgQ29udmVydCAybW0gdG8gY21cbiAgICApKSBcblxud2lkdGggPC0gcGFuZWxTaXplKDEuNykqbW1Ub0luY2hcbmhlaWdodCA8LSBwYW5lbFNpemUoMS4zKSptbVRvSW5jaFxuZmlsZU5hbWUgPC0gcGFzdGUwKFwicmFkMjFwZXJjX2VuaFwiKVxuc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCBcIi5zdmdcIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKVxucHJpbnQocClcbmRldi5vZmYoKSAgXG5cbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5wZWFrLlJBRDIxIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsIFwiMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkXCIpKVxuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCBcImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2XCIpKSRnZW5lXG5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsIFwiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3ZcIikpJGdlbmVcblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5uYW1lIDwtIFwiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeVwiXG5cbmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgXCJfcC1uX2Vuc2VtYmxMaXN0LnRzdlwiKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYyhcIlAtRVwiKSlcblxudGVtcDEgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEExID09IFwiRVwiKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgZ2VuZSlcbmNvbG5hbWVzKHRlbXAxKSA8LSBjKFwiY2hyXCIsIFwic3RhcnRcIiwgXCJlbmRcIiwgXCJnZW5lXCIpXG50ZW1wMiA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQTIgPT0gXCJFXCIpICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMiwgc3RhcnQyLCBlbmQyLCBnZW5lKVxuY29sbmFtZXModGVtcDIpIDwtIGMoXCJjaHJcIiwgXCJzdGFydFwiLCBcImVuZFwiLCBcImdlbmVcIilcblxuZW5oQW5jaG9ycyA8LSBiaW5kX3Jvd3ModGVtcDEsIHRlbXAyKSAlPiUgdW5uZXN0KGdlbmUpICU+JVxuICBkcGx5cjo6bXV0YXRlKFxuICAgIGdyb3VwID0gY2FzZV93aGVuKFxuICAgICAgZ2VuZSAlaW4lIGdyb3VwMSB+IFwiR3JwMVwiLFxuICAgICAgZ2VuZSAlaW4lIGdyb3VwMiB+IFwiR3JwMlwiLFxuICAgICAgVFJVRSB+IE5BXG4gICAgKVxuICApICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpXG5cbmVuaCA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZW5oQW5jaG9ycyAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKSlcblxuIyBDb3VudCBvdmVybGFwcyBiZXR3ZWVuIHBlYWtzIGFuZCBnZW5lc1xub3ZlcmxhcF9jb3VudHMgPC0gY291bnRPdmVybGFwcyhlbmgsIHBlYWsuUkFEMjEpXG5cbiMgQWRkIG92ZXJsYXAgY291bnRzIHRvIHRoZSBvcmlnaW5hbCBnZW5lLnRiIGRhdGFcbmVuaEFuY2hvcnMkcGVha19jb3VudCA8LSBvdmVybGFwX2NvdW50c1xuXG5lbmhBbmNob3JzIDwtIGVuaEFuY2hvcnMgJT4lIGRwbHlyOjptdXRhdGUoXG4gIHBlYWtHcm91cCA9IGNhc2Vfd2hlbihcbiAgICBwZWFrX2NvdW50ID09IDAgfiBcInBlYWtOdW0wXCIsXG4gICAgcGVha19jb3VudCA9PSAxIH4gXCJwZWFrTnVtMVwiLFxuICAgIHBlYWtfY291bnQgPT0gMiB+IFwicGVha051bTJcIixcbiAgICBwZWFrX2NvdW50ID09IDMgfiBcInBlYWtOdW0zXCIsXG4gICAgcGVha19jb3VudCA+PSA0IH4gXCJwZWFrTnVtT3ZlcjRcIlxuICApXG4pXG5cbmFhYSA8LSBlbmhBbmNob3JzICU+JSBcbiAgZHBseXI6OnNlbGVjdChncm91cCwgcGVha0dyb3VwLCBnZW5lKSAlPiVcbiAgZHBseXI6Om11dGF0ZShoYXNQZWFrID0gaWZlbHNlKHBlYWtHcm91cCA9PSBcInBlYWtOdW0wXCIsIEZBTFNFLCBUUlVFKSlcblxuYmJiIDwtIGFhYSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcIkdycDFcIikgXG5zdW0oYmJiJGhhc1BlYWspL25yb3coYmJiKVxuYmJiIDwtIGFhYSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBcIkdycDJcIikgXG5zdW0oYmJiJGhhc1BlYWspL25yb3coYmJiKVxuXG5cbmFhYV9zdW1tYXJ5IDwtIGFhYSAlPiVcbiAgZ3JvdXBfYnkoZ3JvdXAsIHBlYWtHcm91cCkgJT4lXG4gIHN1bW1hcml6ZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9IFwiZHJvcFwiKVxuXG4jIENyZWF0ZSB0aGUgc3RhY2tlZCBiYXJwbG90XG5hYWFfc3VtbWFyeSA8LSBhYWEgJT4lXG4gIGdyb3VwX2J5KGdyb3VwLCBwZWFrR3JvdXApICU+JVxuICBzdW1tYXJpemUoY291bnQgPSBuKCksIC5ncm91cHMgPSBcImRyb3BcIikgJT4lXG4gIGdyb3VwX2J5KGdyb3VwKSAlPiVcbiAgbXV0YXRlKHJhdGlvID0gY291bnQgLyBzdW0oY291bnQpKVxuXG4jIERlZmluZSB0aGUgZ3JhZGllbnQgY29sb3JzXG4jIGdyYWRpZW50X2NvbG9ycyA8LSBjKFwiI0Q0RDRENFwiLCBcIiNEQ0IwQUZcIiwgXCIjRTQ4RDhBXCIsIFwiI0VDNjk2NVwiLCBcIiNGNDQ2NDFcIilcbmdyYWRpZW50X2NvbG9ycyA8LSBjKFwiI0Q0RDRENFwiLCBcIiNBMkJCQ0FcIiwgXCIjNzFBMkMwXCIsIFwiIzNGODlCN1wiLCBcIiMwRTcxQURcIilcblxuIyBDcmVhdGUgdGhlIHN0YWNrZWQgYmFycGxvdCB3aXRoIGdyYWRpZW50IGNvbG9yc1xucCA8LSBnZ3Bsb3QoYWFhX3N1bW1hcnksIGFlcyh4ID0gZ3JvdXAsIHkgPSByYXRpbywgZmlsbCA9IHBlYWtHcm91cCkpICtcbiAgZ2VvbV9iYXIoc3RhdCA9IFwiaWRlbnRpdHlcIiwgcG9zaXRpb24gPSBcInN0YWNrXCIsXG4gICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcInNxdWFyZVwiKSArXG4gIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gXCJSYXRpb1wiKSArXG4gIHRoZW1lKFxuICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoXG4gICAgICBzaXplID0gZm9udFNpemVNLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSBcIiMwMDAwMDBcIlxuICAgICksXG4gICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KFxuICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gXCIjMDAwMDAwXCJcbiAgICApLFxuICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShcbiAgICAgIGNvbG9yID0gXCIjMDAwMDAwXCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSBcInNxdWFyZVwiXG4gICAgKSxcbiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKFxuICAgICAgY29sb3IgPSBcIiMwMDAwMDBcIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9IFwic3F1YXJlXCJcbiAgICApLFxuICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFwidHJhbnNwYXJlbnRcIiksXG4gICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLFxuICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUylcbiAgKSArXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGdyYWRpZW50X2NvbG9ycywgXG4gICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKFxuICAgICAgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMC41KSwgIyBBZGp1c3QgbGVnZW5kIGtleSBzeW1ib2wgc2l6ZVxuICAgICAga2V5d2lkdGggPSAyIC8gMi41NCwgIyBDb252ZXJ0IDJtbSB0byBjbVxuICAgICAga2V5aGVpZ2h0ID0gMiAvIDIuNTQgIyBDb252ZXJ0IDJtbSB0byBjbVxuICAgICkpIFxuXG53aWR0aCA8LSBwYW5lbFNpemUoMS43KSptbVRvSW5jaFxuaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjMpKm1tVG9JbmNoXG5maWxlTmFtZSA8LSBwYXN0ZTAoXCJyYWQyMXBlcmNfZW5oXCIpXG5zdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsIFwiLnN2Z1wiKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpXG5wcmludChwKVxuZGV2Lm9mZigpICBcblxuYGBgIn0= -->

```r

peak.RAD21 <- importPeak(here(refDir, "33250_RAD21_ab992_Bruce-4_peaks.mergePeak.bed"))
group1 <- fread(here(refDir, "geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup1.tsv"))$gene
group2 <- fread(here(refDir, "geneList_dTAG_vs_DMSO_RNA_loop_binaryGroup2.tsv"))$gene


##########################################################
name <- "chromo_cons_annoHierarchy"

geneAnnoData <- loadLoopAnnoData(here(consensusDir, paste0(name, "_p-n_ensemblList.tsv")),
                                      diffCutoff = 0.2,
                                      annoList = c("P-E"))

temp1 <- geneAnnoData %>% dplyr::filter(A1 == "E") %>% dplyr::select(chrom1, start1, end1, gene)
colnames(temp1) <- c("chr", "start", "end", "gene")
temp2 <- geneAnnoData %>% dplyr::filter(A2 == "E") %>% dplyr::select(chrom2, start2, end2, gene)
colnames(temp2) <- c("chr", "start", "end", "gene")

enhAnchors <- bind_rows(temp1, temp2) %>% unnest(gene) %>%
  dplyr::mutate(
    group = case_when(
      gene %in% group1 ~ "Grp1",
      gene %in% group2 ~ "Grp2",
      TRUE ~ NA
    )
  ) %>% dplyr::filter(!is.na(group))

enh <- makeGRangesFromDataFrame(enhAnchors %>% dplyr::select(c(1, 2, 3)))

# Count overlaps between peaks and genes
overlap_counts <- countOverlaps(enh, peak.RAD21)

# Add overlap counts to the original gene.tb data
enhAnchors$peak_count <- overlap_counts

enhAnchors <- enhAnchors %>% dplyr::mutate(
  peakGroup = case_when(
    peak_count == 0 ~ "peakNum0",
    peak_count == 1 ~ "peakNum1",
    peak_count == 2 ~ "peakNum2",
    peak_count == 3 ~ "peakNum3",
    peak_count >= 4 ~ "peakNumOver4"
  )
)

aaa <- enhAnchors %>% 
  dplyr::select(group, peakGroup, gene) %>%
  dplyr::mutate(hasPeak = ifelse(peakGroup == "peakNum0", FALSE, TRUE))

bbb <- aaa %>% dplyr::filter(group == "Grp1") 
sum(bbb$hasPeak)/nrow(bbb)
bbb <- aaa %>% dplyr::filter(group == "Grp2") 
sum(bbb$hasPeak)/nrow(bbb)


aaa_summary <- aaa %>%
  group_by(group, peakGroup) %>%
  summarize(count = n(), .groups = "drop")

# Create the stacked barplot
aaa_summary <- aaa %>%
  group_by(group, peakGroup) %>%
  summarize(count = n(), .groups = "drop") %>%
  group_by(group) %>%
  mutate(ratio = count / sum(count))

# Define the gradient colors
# gradient_colors <- c("#D4D4D4", "#DCB0AF", "#E48D8A", "#EC6965", "#F44641")
gradient_colors <- c("#D4D4D4", "#A2BBCA", "#71A2C0", "#3F89B7", "#0E71AD")

# Create the stacked barplot with gradient colors
p <- ggplot(aaa_summary, aes(x = group, y = ratio, fill = peakGroup)) +
  geom_bar(stat = "identity", position = "stack",
           linewidth = lineMedium * mmToLineUnit, lineend = "square") +
  theme_classic() + labs(x = NULL , y = "Ratio") +
  theme(
    axis.title = element_text(
      size = fontSizeM, family = fontType, color = "#000000"
    ),
    axis.text = element_text(
      size = fontSizeS, family = fontType, color = "#000000"
    ),
    axis.line = element_line(
      color = "#000000", size = lineThick * mmToLineUnit, lineend = "square"
    ),
    axis.ticks = element_line(
      color = "#000000", size = lineThick * mmToLineUnit, lineend = "square"
    ),
    panel.background = element_rect(fill = "transparent"),
    legend.text = element_text(family = fontType, size = fontSizeS),
    legend.title = element_text(family = fontType, size = fontSizeS)
  ) +
  scale_fill_manual(values = gradient_colors, 
                    guide = guide_legend(
      override.aes = list(size = 0.5), # Adjust legend key symbol size
      keywidth = 2 / 2.54, # Convert 2mm to cm
      keyheight = 2 / 2.54 # Convert 2mm to cm
    )) 

width <- panelSize(1.7)*mmToInch
height <- panelSize(1.3)*mmToInch
fileName <- paste0("rad21perc_enh")
svglite(here(figDir, paste0(fileName, ".svg")),  height = height, width = width)
print(p)
dev.off()  

NOT CONCLUSIVE BELOW HERE


data <- fread(here(resultDir, "chromHMM", "A485_pe-pe_anchors", "overlap_enrich_100_state.txt"))
colnames(data) <- c("state", "genome", "pe-pe_A485_down", "pe-pe_A485_no", "pe-pe_A485_up")
data <- data %>% dplyr::select(-genome) %>% as.matrix()

  column_to_rownames(var = "state") %>%
  as.matrix()

library(circlize)

col_fun <- colorRamp2(c(0, 1, 10), 
                      c("blue", "white", "red"))

library(circlize)
col_fun <- colorRamp2(c(min(data), max(data)), c("white", "red"))


#fviz_nbclust(data, kmeans, method = "wss")

p <- Heatmap(
  data,
  name = "Odds Ratio",                   # Name of the heatmap legend
  cluster_columns = FALSE,            # Remove column dendrogram
  row_km = 10,                         # Define the number of k-means clusters for rows (adjust as needed)
  show_row_dend = FALSE,
  col = col_fun,
  border = TRUE
)

fileName <- paste0("anchorLOLA_dTAG_vs_DMSO_diff0.2_allLoops_extreme_regAnchorBackground_atac")
height <- 7
width <- 3.5
png(here(figDir, paste0(fileName, ".png")), res = 600, unit = "in", height = height, width = width)
print(p)
dev.off()
svglite(here(figDir, paste0(fileName, ".svg")),  height = height, width = width)
print(p)
dev.off()

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIExPQURJTkcgUkVRVUlSRU1FTlRTCiMjIFBBQ0tBR0VTCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiMgTElTVCBPRiBQQUNLQUdFUwpwa2dzID0gYygidGlkeXZlcnNlIiwgImhlcmUiLCAic3ZnbGl0ZSIsICJnZ3Bsb3QyIiwgImdncmVwZWwiLAogICAgICAgICAic3RyaW5nciIsICJCaW9jTWFuYWdlciIsICJSQ29sb3JCcmV3ZXIiLCAidmlyaWRpcyIsICJtYWdpY2siLAogICAgICAgICAibmxtZSIsICJmYWN0b2V4dHJhIiwgImRldnRvb2xzIiwgImJlZXByIiwgInJlbW90ZXMiLAogICAgICAgICAiY293cGxvdCIsICJkYXRhLnRhYmxlIiwgInN0cmF3ciIsICJydHJhY2tsYXllciIsICJ1dGlscyIsCiAgICAgICAgICJyZXNoYXBlMiIsICJWZW5uRGlhZ3JhbSIsImdyaWRFeHRyYSIsICJldWxlcnIiLCAic2NhbGVzIiwKICAgICAgICAgIkludGVyYWN0aW9uU2V0IiwgImdwbG90cyIsICJsb2NmZHIiLCAiZnV0dXJlIiwgImdnYmVlc3dhcm0iLCAiZ2xvc3NhcnkiLCAiQ29tcGxleFVwc2V0IiwgImdnbmV3c2NhbGUiKQpiaW9fcGtncyA9IGMoImJpb21hUnQiLCAiREVTZXEyIiwgIkNvbXBsZXhIZWF0bWFwIiwgImFwZWdsbSIsICJ2c24iLAogICAgICAgICAgICAgInJoZGY1IiwgIkludGVyYWN0aW9uU2V0IiwgInBsb3RnYXJkZW5lciIsICJIaUNEQ1BsdXMiLAogICAgICAgICAgICAgIkdlbm9taWNJbnRlcmFjdGlvbnMiLCAiTE9MQSIsICJBbm5vdGF0aW9uSHViIiwKICAgICAgICAgICAgICJvcmcuTW0uZWcuZGIiLCAiZW5yaWNocGxvdCIsICJET1NFIiwgImNsdXN0ZXJQcm9maWxlciIsCiAgICAgICAgICAgICAiSGlDRXhwZXJpbWVudCIsICJIaUNvb2wiLCAiSGlDb250YWN0cyIsICJIaUNvbnRhY3RzRGF0YSIsICJmb3VyRE5EYXRhIiwgIkROQVpvb0RhdGEiLAogICAgICAgICAgICAgIk1vdGlmRGIiLCAiQmlvc3RyaW5ncyIpCgojIElOU1RBTEwgUEFDS0FHRVMKIyBpbnN0YWxsLnBhY2thZ2VzKHBrZ3MpCiMgQmlvY01hbmFnZXI6Omluc3RhbGwoYmlvX3BrZ3MpCgojIElOU1RBTEwgSGlDIHJlbGF0ZWQgcGFja2FnZXMKIyByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicm9iaW53ZWlkZS9HRU5PVkEiKQojIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigidGhvbWFzcDg1L3NjaWNvIikKIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoInBzeXRlYWNoci9pbnRyb2RhdGF2aXoiKQoKIyBMT0FEIFBBQ0tBR0VTCmxhcHBseShwa2dzLCByZXF1aXJlLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpCmxhcHBseShiaW9fcGtncywgcmVxdWlyZSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQpyZXF1aXJlKEdFTk9WQSkKcmVxdWlyZShzY2ljbykKcmVxdWlyZShpbnRyb2RhdGF2aXopCgojIENMRUFOSU5HCnJtKHBrZ3MsIGJpb19wa2dzKQoKb3B0aW9ucyhzY2lwZW49OTk5KQoKCgpgYGAKIyMgRU5TRU1CTApgYGB7cn0KIyBFTlNFTUJMIERBVEFCQVNFCiMgdjEwMiBpcyBmb3IgdGhlIGxhdGVzdCBtbTEwIHZlcnNpb24KIyBlbnNlbWJsLnYxMDIgPC0gdXNlTWFydChob3N0ID0gImh0dHBzOi8vbm92MjAyMC5hcmNoaXZlLmVuc2VtYmwub3JnIiwKIyAgICAgICAgICAgICAgICAgICAgICAgIGJpb21hcnQgPSAiRU5TRU1CTF9NQVJUX0VOU0VNQkwiLAojICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCA9ICJtbXVzY3VsdXNfZ2VuZV9lbnNlbWJsIikKYGBgCiMjIENPTE9SIFBBTEVUVEUKYGBge3J9CnBhbGV0dGVfMSA9IGxpc3QocmVkID0gIiNFOTAwMkQiLAogICAgICAgICAgICAgICAgIGFtYmVyID0gIiNGRkFBMDAiLAogICAgICAgICAgICAgICAgIGdyZWVuID0gIiMwMEIwMDAiKQpwYWxldHRlXzIgPSBsaXN0KHJlZCA9ICIjRkYxRjVCIiwKICAgICAgICAgICAgICAgICBncmVlbiA9ICIjMDBDRDZDIiwKICAgICAgICAgICAgICAgICBibHVlID0gIiMwMDlBREUiLAogICAgICAgICAgICAgICAgIHB1cnBsZSA9ICIjQUY1OEJBIiwKICAgICAgICAgICAgICAgICB5ZWxsb3cgPSAiI0ZGQzYxRSIsCiAgICAgICAgICAgICAgICAgb3JhbmdlID0gIiNGMjg1MjIiLAogICAgICAgICAgICAgICAgIGdyZXkgPSAiI0EwQjFCQSIsCiAgICAgICAgICAgICAgICAgYnJvd24gPSAiI0E2NzYxRCIpCnBhbGV0dGVfMyA9IGxpc3QoZ3JleTEgPSAiI2EwYjFiYSIsCiAgICAgICAgICAgICAgICAgZ3JleTIgPSAiI2M1ZDBkNSIsCiAgICAgICAgICAgICAgICAgZ3JleTMgPSAiI2VjZWZmMSIpCgpjb2xvckxpc3RMb29wIDwtICBjKHBhbGV0dGVfM1tbImdyZXkzIl1dLCBwYWxldHRlXzNbWyJncmV5MiJdXSwgcGFsZXR0ZV8zW1siZ3JleTEiXV0sCiAgICAgICAgICAgICAgICAgICAgICIjQzVFMUVGIiwgIiM2Q0IwRDYiLCAiIzIyNkU5QyIsCiAgICAgICAgICAgICAgICAgICAgICIjMDY1OTJBIiwgCiAgICAgICAgICAgICAgICAgICAgICIjRkVEOTc2IiwgIiNGRDhEM0MiLCAiI0UzMUExQyIpCmNvbG9yTGlzdFByb21vdGVyIDwtIGMocGFsZXR0ZV8zW1siZ3JleTMiXV0sIiNFODg1ODciLCAiI0UzMUExQyIpCmNvbG9yTGlzdEVuaGFuY2VyIDwtIGMocGFsZXR0ZV8zW1siZ3JleTMiXV0sIiM4N0FGQzciLCAiIzIyNkU5QyIpCmNvbG9yTGlzdFN0cnVjdHVyZSA8LSBjKHBhbGV0dGVfM1tbImdyZXkzIl1dLCBwYWxldHRlXzNbWyJncmV5MiJdXSwgcGFsZXR0ZV8zW1siZ3JleTEiXV0pCmBgYAoKIyMgRElSIExJU1QKYGBge3J9CnJlZkRpciA8LSBoZXJlKCJyZWZlcmVuY2UiKQpgYGAKIyMgRklHVVJFIFBBUkFNRVRFUlMKYGBge3J9CmxpYnJhcnkoY29sb3JzcGFjZSkKCmZvbnRUeXBlIDwtICJIZWx2ZXRpY2EiCgpmb250U2l6ZUwgPC0gMTAgIyBwdApmb250U2l6ZU0gPC0gOApmb250U2l6ZVMgPC0gNgoKbGluZVRoaWNrIDwtIDAuNzUgIyBwdApsaW5lTWVkaXVtIDwtIDAuNQpsaW5lVGhpbiA8LSAwLjI1CgpwYW5lbFVuaXQgPC0gMzAgIyBtbQpwYW5lbE1hcmdpbiA8LSAxLjUKCm1tVG9JbmNoIDwtIDAuMDM5MzcwMDc4NzQKbW1Ub0xpbmVVbml0IDwtIDEvMi4xMwptbVRvTGluZVBsb3RnYXJkZW4gPC0gMS8wLjc1CnB0VG9NTSA8LSAxLzIuODQ1CgoKc3Ryb25nX3JlZCA8LSAiI0NCMzMzQSIKc3Ryb25nX2JsdWUgPC0gIiM0ODUxQTAiCndlYWtfcmVkIDwtIGxpZ2h0ZW4oc3Ryb25nX3JlZCwgYW1vdW50ID0gMC40KSAgICMgRkY3RDgxCndlYWtfYmx1ZSA8LSBsaWdodGVuKHN0cm9uZ19ibHVlLCBhbW91bnQgPSAwLjQpICMgOEE5MURECm5vX2dyZXkgPC0gIiNBOEE4QTgiCgpzdHJvbmdfdGVlbCA8LSAiIzA4OTJBNSIKc3Ryb25nX2dyZWVuIDwtICIjMjNDRTZCIiAjIEE0ODUKc3Ryb25nX2RhcmtncmVlbiA8LSAiIzA1NEEyOSIKc3Ryb25nX3llbGxvdyA8LSAiI0ZGQkE0OSIKc3Ryb25nX29yYW5nZSA8LSAiI0YxOEYwMSIgIyBkVEFHCnN0cm9uZ19saWdodHB1cnBsZSA8LSAiI0JEOTNEOCIKc3Ryb25nX3B1cnBsZSA8LSAiIzlFMzNDQiIgIyBFcGkKCnBhbmVsU2l6ZSA8LSBmdW5jdGlvbihudW0sIHVuaXQgPSBwYW5lbFVuaXQsIG1hcmdpbiA9IHBhbmVsTWFyZ2luKXsKICByZXR1cm4obnVtKnVuaXQgLSAyKm1hcmdpbikKfQoKYGBgCiMjIEZVTkNUSU9OUwpgYGB7cn0KaW1wb3J0QmVkcGUgPSBmdW5jdGlvbihiZWRwZSl7CiAgYTEgPSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZGF0YS5mcmFtZSgKICAgIGNociA9IGJlZHBlJFYxLAogICAgc3RhcnQgPSBiZWRwZSRWMiArMSwKICAgIGVuZCA9IGJlZHBlJFYzKSkKICBhMiA9IG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShkYXRhLmZyYW1lKAogICAgY2hyID0gYmVkcGUkVjQsCiAgICBzdGFydCA9IGJlZHBlJFY1ICsxLAogICAgZW5kID0gYmVkcGUkVjYpKQogIEdJbnRlcmFjdGlvbnMoYTEsIGEyKQp9CgpnZXRfZGVuc2l0eSA8LSBmdW5jdGlvbih4LCB5LCAuLi4pIHsKICBkZW5zIDwtIE1BU1M6OmtkZTJkKHgsIHksIC4uLikKICBpeCA8LSBmaW5kSW50ZXJ2YWwoeCwgZGVucyR4KQogIGl5IDwtIGZpbmRJbnRlcnZhbCh5LCBkZW5zJHkpCiAgaWkgPC0gY2JpbmQoaXgsIGl5KQogIHJldHVybihkZW5zJHpbaWldKQp9CmxhYmVsX2tiX21iIDwtIGZ1bmN0aW9uKHgpIHsKICBpZmVsc2UoeCA+PSAxMDAwMDAwLCBwYXN0ZTAoeCAvIDEwMDAwMDAsICJNYiIpLCBwYXN0ZTAoeCAvIDEwMDAsICJrYiIpKQp9CgppbXBvcnRQZWFrID0gZnVuY3Rpb24oZmlsZU5hbWUpewogIGRmID0gZnJlYWQoZmlsZU5hbWUpCiAgZ3IgPSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZGF0YS5mcmFtZSgKICAgIGNociA9IGRmJFYxLCBzdGFydCA9IGRmJFYyLCBlbmQgPSBkZiRWMwogICkpCn0KYGBgCgojIFBSRVBST0NFU1NJTkcKIyMgQWRkaW5nICtvb2UgK2dlbmVBbm5vCkxvb3Agc2hvdWxkIGJlIGRyb3BwZWQgZnJvbSBzcGVjaWZpYyBjb21wYXJpc29uIGlmIG9vZSBpbiBhbnkgb2YgdGhlIGNvbmRpdGlvbiBhcmUgTkEKSWYgb29lIGlzIDAsIGZpeGVkIHBzZXVkbyB2YWx1ZSBvZiAwLjAxIHdpbGwgYmUgdXNlZC4KbG9nMihvb2UpIHNob3VsZCBiZSBwbG90dGVkIGluIHJhbmdlICgtNSwgOCkgaWYgcGxvdHRlZCBpbiBzY2F0dGVycGxvdAojIyMgQ29tbW9uIHN0dWZmcwpgYGB7cn0KIyBQYXJhbWV0ZXJzCmNvbW1vbkxvb3BEaXIgPC0gaGVyZSgiLi4vZGF0YS9sb29wX2FuYWx5c2lzIikKCiMgRGVmaW5pbmcgZ2VuZSBuZWlnaGJvcmhvb2QKZmxhbmtTaXplIDwtIDI1MDAKZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwIiwgIm1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSAiKyIsIFYyLCBWMyksCiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSwKICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lCiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCwgVjQsIFY1LCBWNikKY29sbmFtZXMoZ2VuZS5UU1MudGIpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgImdlbmUiLCAiZW5zZW1ibCIpCmZ3cml0ZShnZW5lLlRTUy50YiwgaGVyZShyZWZEaXIsICJtbTEwIiwgIm1tMTBfR1JDbTM4LnA2X1RTUzIuNWtiLmJlZCIpLCBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSwgcm93Lm5hbWVzID0gRkFMU0UpCgojIEZ1bmN0aW9ucyBmb3IgY2FsY3VsYXRpbmcgZ2VuZSBvdmVybGFwCmZpbmRPdmVybGFwR2VuZSA8LSBmdW5jdGlvbihnZW5lLlRTUy50YiwgY2hyb20xLCBzdGFydDEsIGVuZDEpewogIHRlbXAgPC0gZ2VuZS5UU1MudGIgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyID09IGNocm9tMSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKChzdGFydCA8PSBlbmQxKSAmIChlbmQgPj0gc3RhcnQxKSkKICByZXR1cm4odGVtcCRnZW5lKQp9CmZpbmRPdmVybGFwRW5zZW1ibCA8LSBmdW5jdGlvbihnZW5lLlRTUy50YiwgY2hyb20xLCBzdGFydDEsIGVuZDEpewogIHRlbXAgPC0gZ2VuZS5UU1MudGIgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyID09IGNocm9tMSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKChzdGFydCA8PSBlbmQxKSAmIChlbmQgPj0gc3RhcnQxKSkKICByZXR1cm4odGVtcCRlbnNlbWJsKQp9CmBgYAojIyMgUHJlcGFyaW5nIAojIyMjIFsxXSBDaHJvbW9zaWdodApgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBJbXBvcnQgYW5ub3RhdGVkIHBvc3Rwcm9jZXNzZWQgbG9vcHMgd2l0aCBjaHJvbW9zaWdodCBzY29yZQpsb29wRGlyIDwtIGhlcmUoIi4uL2RhdGEvbG9vcF9jaHJvbW9zaWdodCIpCmRhdGEgPC0gYXNfdGliYmxlKGZyZWFkKGhlcmUobG9vcERpciwgImNocm9tb191bmlvbl9hbGxSZXNfcG9zdHByb2Nlc3NlZF9hbm5vdGF0ZWQudHN2IikpKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBJbnRlZ3JhdGUgY2hyb21vc2lnaHQgc2NvcmUgZnJvbSBhc3luY2hyb25vdXMgZXhwZXJpbWVudApyZXNvbHV0aW9ucyAgPC0gYygyNTAwMCwgMTAwMDAsIDUwMDApCgojIGhlbHBlcjogcmVhZCwgZmlsdGVyLCBzZWxlY3QgYW5kIHJlbmFtZSBmb3Igb25lIGV4cGVyaW1lbnQKYW5ub3RhdGVfc2NvcmVzIDwtIGZ1bmN0aW9uKGV4cGVyaW1lbnQsIHN1ZmZpeCkgewogIG1hcF9kZnIocmVzb2x1dGlvbnMsIGZ1bmN0aW9uKHJlcykgewogICAgZnJlYWQoaGVyZShsb29wRGlyLAogICAgICAgICAgICAgICBzcHJpbnRmKCJHU0UxNzg5ODJfJXNfcG9vbGVkX3VuaW9uXyVkYnBfcHUxMDBwejEwMC50c3YiLAogICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnQsIHJlcykpCiAgICApICU+JQogICAgICBtdXRhdGUoaWQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIHNlcCA9ICJfIikpICU+JQogICAgICBmaWx0ZXIoc3RhcnQyIC0gc3RhcnQxIDw9IDJlNikgJT4lCiAgICAgIHNlbGVjdChpZCwgc2NvcmUsIHB2YWx1ZSwgcXZhbHVlKSAlPiUKICAgICAgcmVuYW1lX3dpdGgofiBwYXN0ZTAoLiwgIl8iLCBzdWZmaXgpLAogICAgICAgICAgICAgICAgICBjKHNjb3JlLCBwdmFsdWUsIHF2YWx1ZSkpCiAgfSkKfQoKZGF0YSA8LSBkYXRhICU+JQogIGxlZnRfam9pbihhbm5vdGF0ZV9zY29yZXMoIkFzeW5jVVQiLCAiVVQiKSwgYnkgPSAiaWQiKQpkYXRhIDwtIGRhdGEgJT4lCiAgbGVmdF9qb2luKGFubm90YXRlX3Njb3JlcygiQXN5bmNBSUQiLCAiQUlEIiksIGJ5ID0gImlkIikKZGF0YSA8LSBkYXRhICU+JQogIHJlbG9jYXRlKHNjb3JlX1VUOnF2YWx1ZV9BSUQsIC5hZnRlciA9IHF2YWx1ZV9FcGlkVEFHKQpkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoLXNlcSgyOSwgNDEpKQpkYXRhIDwtIGRhdGEgJT4lIHJlbG9jYXRlKEExOkFubm9fc2ltcGxlLCAuYWZ0ZXIgPSBpZCkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQWRkaW5nIG9icy9leHAKaW1wb3J0X29ic2V4cCA8LSBmdW5jdGlvbihleHBlcmltZW50LCBzdWZmaXgpIHsKICBtYXBfZGZyKHJlc29sdXRpb25zLCBmdW5jdGlvbihyZXMpIHsKICAgIGZyZWFkKGhlcmUobG9vcERpciwKICAgICAgICAgICAgICAgc3ByaW50ZigiY2hyb21vX3VuaW9uX2FsbFJlc19wb3N0cHJvY2Vzc2VkXyVkYnBfb2J4ZXhwXyVzX3Bvb2xlZC50c3YiLAogICAgICAgICAgICAgICAgICAgICAgIHJlcywgZXhwZXJpbWVudCkpCiAgICApICU+JQogICAgICBtdXRhdGUoaWQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIHNlcCA9ICJfIikpICU+JQogICAgICBzZWxlY3QoaWQsIG9vZSkgJT4lCiAgICAgIHJlbmFtZV93aXRoKH4gcGFzdGUwKC4sICJfIiwgc3VmZml4KSwKICAgICAgICAgICAgICAgICAgYyhvb2UpKQogIH0pCn0KCmRhdGEgPC0gZGF0YSAlPiUKICBsZWZ0X2pvaW4oaW1wb3J0X29ic2V4cCgiRzFETVNPIiwgIkRNU08iKSwgYnkgPSAiaWQiKQpkYXRhIDwtIGRhdGEgJT4lCiAgbGVmdF9qb2luKGltcG9ydF9vYnNleHAoIkcxZFRBRyIsICJkVEFHIiksIGJ5ID0gImlkIikKZGF0YSA8LSBkYXRhICU+JQogIGxlZnRfam9pbihpbXBvcnRfb2JzZXhwKCJHMUE0ODUiLCAiQTQ4NSIpLCBieSA9ICJpZCIpCmRhdGEgPC0gZGF0YSAlPiUKICBsZWZ0X2pvaW4oaW1wb3J0X29ic2V4cCgiRXBpRzFETVNPIiwgIkVwaURNU08iKSwgYnkgPSAiaWQiKQpkYXRhIDwtIGRhdGEgJT4lCiAgbGVmdF9qb2luKGltcG9ydF9vYnNleHAoIkVwaUcxZFRBRyIsICJFcGlkVEFHIiksIGJ5ID0gImlkIikKZGF0YSA8LSBkYXRhICU+JQogIGxlZnRfam9pbihpbXBvcnRfb2JzZXhwKCJHU0UxNzg5ODJfQXN5bmNVVCIsICJVVCIpLCBieSA9ICJpZCIpCmRhdGEgPC0gZGF0YSAlPiUKICBsZWZ0X2pvaW4oaW1wb3J0X29ic2V4cCgiR1NFMTc4OTgyX0FzeW5jQUlEIiwgIkFJRCIpLCBieSA9ICJpZCIpCgpmd3JpdGUoZGF0YSwgaGVyZShjb21tb25Mb29wRGlyLCAibG9vcFNjb3JlX2Nocm9tb3NpZ2h0LnRzdiIpLAogICAgICAgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gVFJVRSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQW5ub3RhdGUgZ2VuZXMgZm9yIHAtbiBsb29wcwpuYW1lIDwtICJjaHJvbW9zaWdodCIKZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwIiwgIm1tMTBfR1JDbTM4LnA2X1RTUzIuNWtiLmJlZCIpKQpjb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiZ2VuZSIsICJlbnNlbWJsIikKCiMgU2ltcGxlIGFubm90YXRpb24KdGVtcCA8LSBkYXRhICU+JSByb3d3aXNlKCkgJT4lCiAgZHBseXI6Om11dGF0ZShBMV9nZW5lID0gaWZlbHNlKEExX3NpbXBsZSA9PSAiUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZmluZE92ZXJsYXBHZW5lKGdlbmUuVFNTLnRiLCBjaHJvbTEsIHN0YXJ0MSwgZW5kMSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSksCiAgICAgICAgICAgICAgICBBMl9nZW5lID0gaWZlbHNlKEEyX3NpbXBsZSA9PSAiUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZmluZE92ZXJsYXBHZW5lKGdlbmUuVFNTLnRiLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSksCiAgICAgICAgICAgICAgICBnZW5lID0gbGlzdCh1bmlxdWUoYyhBMV9nZW5lLCBBMl9nZW5lKSkpKQoKdGVtcF9wX24gPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihBbm5vX3NpbXBsZSAlaW4lIGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIpKSAlPiUgZHBseXI6OnNlbGVjdCgtYygiQTFfZ2VuZSIsICJBMl9nZW5lIikpCmZ3cml0ZSh0ZW1wX3BfbiwgaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoImxvb3BTY29yZV8iLCBuYW1lLCAiX3Atbl9zaW1wbGVfZ2VuZUxpc3QudHN2IikpLCBzZXAgPSAiXHQiKQoKdGVtcCA8LSBkYXRhICU+JSByb3d3aXNlKCkgJT4lCiAgZHBseXI6Om11dGF0ZShBMV9nZW5lID0gaWZlbHNlKEExX3NpbXBsZSA9PSAiUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZmluZE92ZXJsYXBFbnNlbWJsKGdlbmUuVFNTLnRiLCBjaHJvbTEsIHN0YXJ0MSwgZW5kMSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSksCiAgICAgICAgICAgICAgICBBMl9nZW5lID0gaWZlbHNlKEEyX3NpbXBsZSA9PSAiUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZmluZE92ZXJsYXBFbnNlbWJsKGdlbmUuVFNTLnRiLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSksCiAgICAgICAgICAgICAgICBnZW5lID0gbGlzdCh1bmlxdWUoYyhBMV9nZW5lLCBBMl9nZW5lKSkpKQoKdGVtcF9wX24gPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihBbm5vX3NpbXBsZSAlaW4lIGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIpKSAlPiUgZHBseXI6OnNlbGVjdCgtYygiQTFfZ2VuZSIsICJBMl9nZW5lIikpCmZ3cml0ZSh0ZW1wX3BfbiwgaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoImxvb3BTY29yZV8iLCBuYW1lLCAiX3Atbl9zaW1wbGVfZW5zZW1ibExpc3QudHN2IikpLCBzZXAgPSAiXHQiKQoKIyBjb21wbGV4IGFubm90YXRpb24KdGVtcCA8LSBkYXRhICU+JSByb3d3aXNlKCkgJT4lCiAgZHBseXI6Om11dGF0ZShBMV9nZW5lID0gaWZlbHNlKEExICVpbiUgYygiUCIsICJTUCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwR2VuZShnZW5lLlRTUy50YiwgY2hyb20xLCBzdGFydDEsIGVuZDEpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLAogICAgICAgICAgICAgICAgQTJfZ2VuZSA9IGlmZWxzZShBMiAlaW4lIGMoIlAiLCAiU1AiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChmaW5kT3ZlcmxhcEdlbmUoZ2VuZS5UU1MudGIsIGNocm9tMiwgc3RhcnQyLCBlbmQyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSwKICAgICAgICAgICAgICAgIGdlbmUgPSBsaXN0KHVuaXF1ZShjKEExX2dlbmUsIEEyX2dlbmUpKSkpCgp0ZW1wX3BfbiA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHN0cl9kZXRlY3QoQW5ubywgIlAiKSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtYygiQTFfZ2VuZSIsICJBMl9nZW5lIikpCmZ3cml0ZSh0ZW1wX3BfbiwgaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoImxvb3BTY29yZV8iLCBuYW1lLCAiX3Atbl9jb21wbGV4X2dlbmVMaXN0LnRzdiIpKSwgc2VwID0gIlx0IikKCnRlbXAgPC0gZGF0YSAlPiUgcm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUoQTFfZ2VuZSA9IGlmZWxzZShBMSAlaW4lIGMoIlAiLCAiU1AiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChmaW5kT3ZlcmxhcEVuc2VtYmwoZ2VuZS5UU1MudGIsIGNocm9tMSwgc3RhcnQxLCBlbmQxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSwKICAgICAgICAgICAgICAgIEEyX2dlbmUgPSBpZmVsc2UoQTIgJWluJSBjKCJQIiwgIlNQIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZmluZE92ZXJsYXBFbnNlbWJsKGdlbmUuVFNTLnRiLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSksCiAgICAgICAgICAgICAgICBnZW5lID0gbGlzdCh1bmlxdWUoYyhBMV9nZW5lLCBBMl9nZW5lKSkpKQoKdGVtcF9wX24gPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihzdHJfZGV0ZWN0KEFubm8sICJQIikpICU+JQogIGRwbHlyOjpzZWxlY3QoLWMoIkExX2dlbmUiLCAiQTJfZ2VuZSIpKQpmd3JpdGUodGVtcF9wX24sIGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgbmFtZSwgIl9wLW5fY29tcGxleF9lbnNlbWJsTGlzdC50c3YiKSksIHNlcCA9ICJcdCIpCgpgYGAKCiMjIyMgWzJdIGhpY2RjcApgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKbG9vcERpciA8LSBoZXJlKCIuLi9kYXRhL2xvb3BfaGljZGNwIikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgSW1wb3J0IGFubm90YXRlZCBwb3N0cHJvY2Vzc2VkIGxvb3BzIHdpdGggY2hyb21vc2lnaHQgc2NvcmUKZGF0YSA8LSBhc190aWJibGUoZnJlYWQoaGVyZShsb29wRGlyLCAiaGljZGNwX3VuaW9uXzEwMDAwYnBfYW5ub3RhdGVkLnRzdiIpKSkgJT4lCiAgbXV0YXRlKGlkID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBzZXAgPSAiXyIpKSAlPiUKICByZWxvY2F0ZShpZCwgLmFmdGVyID0gZW5kMikgJT4lCiAgZHBseXI6OnNlbGVjdCgtYygiYW5jaG9yX2lkXzEiLCAiYW5jaG9yX2lkXzIiKSkKCnJlc29sdXRpb25zICA8LSBjKDEwMDAwKQoKIyBBZGRpbmcgb2JzL2V4cAppbXBvcnRfb2JzZXhwIDwtIGZ1bmN0aW9uKGV4cGVyaW1lbnQsIHN1ZmZpeCkgewogIG1hcF9kZnIocmVzb2x1dGlvbnMsIGZ1bmN0aW9uKHJlcykgewogICAgZnJlYWQoaGVyZShsb29wRGlyLAogICAgICAgICAgICAgICBzcHJpbnRmKCJoaWNkY3BfdW5pb25fJWRicF9vYnhleHBfJXNfcG9vbGVkLnRzdiIsCiAgICAgICAgICAgICAgICAgICAgICAgcmVzLCBleHBlcmltZW50KSkKICAgICkgJT4lCiAgICAgIG11dGF0ZShpZCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMiwgc2VwID0gIl8iKSkgJT4lCiAgICAgIHNlbGVjdChpZCwgb29lKSAlPiUKICAgICAgcmVuYW1lX3dpdGgofiBwYXN0ZTAoLiwgIl8iLCBzdWZmaXgpLAogICAgICAgICAgICAgICAgICBjKG9vZSkpCiAgfSkKfQoKZGF0YSA8LSBkYXRhICU+JQogIGxlZnRfam9pbihpbXBvcnRfb2JzZXhwKCJHMURNU08iLCAiRE1TTyIpLCBieSA9ICJpZCIpCmRhdGEgPC0gZGF0YSAlPiUKICBsZWZ0X2pvaW4oaW1wb3J0X29ic2V4cCgiRzFkVEFHIiwgImRUQUciKSwgYnkgPSAiaWQiKQpkYXRhIDwtIGRhdGEgJT4lCiAgbGVmdF9qb2luKGltcG9ydF9vYnNleHAoIkcxQTQ4NSIsICJBNDg1IiksIGJ5ID0gImlkIikKZGF0YSA8LSBkYXRhICU+JQogIGxlZnRfam9pbihpbXBvcnRfb2JzZXhwKCJFcGlHMURNU08iLCAiRXBpRE1TTyIpLCBieSA9ICJpZCIpCmRhdGEgPC0gZGF0YSAlPiUKICBsZWZ0X2pvaW4oaW1wb3J0X29ic2V4cCgiRXBpRzFkVEFHIiwgIkVwaWRUQUciKSwgYnkgPSAiaWQiKQpkYXRhIDwtIGRhdGEgJT4lCiAgbGVmdF9qb2luKGltcG9ydF9vYnNleHAoIkdTRTE3ODk4Ml9Bc3luY1VUIiwgIlVUIiksIGJ5ID0gImlkIikKZGF0YSA8LSBkYXRhICU+JQogIGxlZnRfam9pbihpbXBvcnRfb2JzZXhwKCJHU0UxNzg5ODJfQXN5bmNBSUQiLCAiQUlEIiksIGJ5ID0gImlkIikKCmZ3cml0ZShkYXRhLCBoZXJlKGNvbW1vbkxvb3BEaXIsICJsb29wU2NvcmVfaGljZGNwLnRzdiIpLAogICAgICAgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gVFJVRSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQW5ub3RhdGUgZ2VuZXMgZm9yIHAtbiBsb29wcwpuYW1lIDwtICJoaWNkY3AiCmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMCIsICJtbTEwX0dSQ20zOC5wNl9UU1MyLjVrYi5iZWQiKSkKY29sbmFtZXMoZ2VuZS5UU1MudGIpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgImdlbmUiLCAiZW5zZW1ibCIpCgoKIyBTaW1wbGUgYW5ub3RhdGlvbgp0ZW1wIDwtIGRhdGEgJT4lIHJvd3dpc2UoKSAlPiUKICBkcGx5cjo6bXV0YXRlKEExX2dlbmUgPSBpZmVsc2UoQTFfc2ltcGxlID09ICJQIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChmaW5kT3ZlcmxhcEdlbmUoZ2VuZS5UU1MudGIsIGNocm9tMSwgc3RhcnQxLCBlbmQxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSwKICAgICAgICAgICAgICAgIEEyX2dlbmUgPSBpZmVsc2UoQTJfc2ltcGxlID09ICJQIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChmaW5kT3ZlcmxhcEdlbmUoZ2VuZS5UU1MudGIsIGNocm9tMiwgc3RhcnQyLCBlbmQyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSwKICAgICAgICAgICAgICAgIGdlbmUgPSBsaXN0KHVuaXF1ZShjKEExX2dlbmUsIEEyX2dlbmUpKSkpCgp0ZW1wX3BfbiA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIikpICU+JSBkcGx5cjo6c2VsZWN0KC1jKCJBMV9nZW5lIiwgIkEyX2dlbmUiKSkKZndyaXRlKHRlbXBfcF9uLCBoZXJlKGNvbW1vbkxvb3BEaXIsIHBhc3RlMCgibG9vcFNjb3JlXyIsIG5hbWUsICJfcC1uX3NpbXBsZV9nZW5lTGlzdC50c3YiKSksIHNlcCA9ICJcdCIpCgp0ZW1wIDwtIGRhdGEgJT4lIHJvd3dpc2UoKSAlPiUKICBkcGx5cjo6bXV0YXRlKEExX2dlbmUgPSBpZmVsc2UoQTFfc2ltcGxlID09ICJQIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChmaW5kT3ZlcmxhcEVuc2VtYmwoZ2VuZS5UU1MudGIsIGNocm9tMSwgc3RhcnQxLCBlbmQxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSwKICAgICAgICAgICAgICAgIEEyX2dlbmUgPSBpZmVsc2UoQTJfc2ltcGxlID09ICJQIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChmaW5kT3ZlcmxhcEVuc2VtYmwoZ2VuZS5UU1MudGIsIGNocm9tMiwgc3RhcnQyLCBlbmQyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSwKICAgICAgICAgICAgICAgIGdlbmUgPSBsaXN0KHVuaXF1ZShjKEExX2dlbmUsIEEyX2dlbmUpKSkpCgp0ZW1wX3BfbiA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIikpICU+JSBkcGx5cjo6c2VsZWN0KC1jKCJBMV9nZW5lIiwgIkEyX2dlbmUiKSkKZndyaXRlKHRlbXBfcF9uLCBoZXJlKGNvbW1vbkxvb3BEaXIsIHBhc3RlMCgibG9vcFNjb3JlXyIsIG5hbWUsICJfcC1uX3NpbXBsZV9lbnNlbWJsTGlzdC50c3YiKSksIHNlcCA9ICJcdCIpCgojIGNvbXBsZXggYW5ub3RhdGlvbgp0ZW1wIDwtIGRhdGEgJT4lIHJvd3dpc2UoKSAlPiUKICBkcGx5cjo6bXV0YXRlKEExX2dlbmUgPSBpZmVsc2UoQTEgJWluJSBjKCJQIiwgIlNQIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZmluZE92ZXJsYXBHZW5lKGdlbmUuVFNTLnRiLCBjaHJvbTEsIHN0YXJ0MSwgZW5kMSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSksCiAgICAgICAgICAgICAgICBBMl9nZW5lID0gaWZlbHNlKEEyICVpbiUgYygiUCIsICJTUCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwR2VuZShnZW5lLlRTUy50YiwgY2hyb20yLCBzdGFydDIsIGVuZDIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLAogICAgICAgICAgICAgICAgZ2VuZSA9IGxpc3QodW5pcXVlKGMoQTFfZ2VuZSwgQTJfZ2VuZSkpKSkKCnRlbXBfcF9uIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoc3RyX2RldGVjdChBbm5vLCAiUCIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1jKCJBMV9nZW5lIiwgIkEyX2dlbmUiKSkKZndyaXRlKHRlbXBfcF9uLCBoZXJlKGNvbW1vbkxvb3BEaXIsIHBhc3RlMCgibG9vcFNjb3JlXyIsIG5hbWUsICJfcC1uX2NvbXBsZXhfZ2VuZUxpc3QudHN2IikpLCBzZXAgPSAiXHQiKQoKdGVtcCA8LSBkYXRhICU+JSByb3d3aXNlKCkgJT4lCiAgZHBseXI6Om11dGF0ZShBMV9nZW5lID0gaWZlbHNlKEExICVpbiUgYygiUCIsICJTUCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwRW5zZW1ibChnZW5lLlRTUy50YiwgY2hyb20xLCBzdGFydDEsIGVuZDEpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLAogICAgICAgICAgICAgICAgQTJfZ2VuZSA9IGlmZWxzZShBMiAlaW4lIGMoIlAiLCAiU1AiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChmaW5kT3ZlcmxhcEVuc2VtYmwoZ2VuZS5UU1MudGIsIGNocm9tMiwgc3RhcnQyLCBlbmQyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSwKICAgICAgICAgICAgICAgIGdlbmUgPSBsaXN0KHVuaXF1ZShjKEExX2dlbmUsIEEyX2dlbmUpKSkpCgp0ZW1wX3BfbiA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHN0cl9kZXRlY3QoQW5ubywgIlAiKSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtYygiQTFfZ2VuZSIsICJBMl9nZW5lIikpCmZ3cml0ZSh0ZW1wX3BfbiwgaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoImxvb3BTY29yZV8iLCBuYW1lLCAiX3Atbl9jb21wbGV4X2Vuc2VtYmxMaXN0LnRzdiIpKSwgc2VwID0gIlx0IikKCgpgYGAKIyMjIyBbM10gSGFuc2VuCkxvb3BzIHdpdGggCmBgYHtyfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpsb29wRGlyIDwtIGhlcmUoIi4uL2RhdGEvbG9vcF9IYW5zZW4iKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBJbXBvcnQgYW5ub3RhdGVkIHBvc3Rwcm9jZXNzZWQgbG9vcHMgd2l0aCBjaHJvbW9zaWdodCBzY29yZQpkYXRhIDwtIGFzX3RpYmJsZShmcmVhZChoZXJlKGxvb3BEaXIsICJIYW5zZW5fdW5pb25fYWxsUmVzX3Bvc3Rwcm9jZXNzZWRfYW5ub3RhdGVkLnRzdiIpKSkgJT4lCiAgbXV0YXRlKGlkID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBzZXAgPSAiXyIpKSAlPiUKICByZWxvY2F0ZShpZCwgLmFmdGVyID0gZW5kMikgJT4lCiAgZHBseXI6OnNlbGVjdCgtYygiYW5jaG9yX2lkXzEiLCAiYW5jaG9yX2lkXzIiKSkKCnJlc29sdXRpb25zICA8LSBjKDUwMDAsIDIwMDAsIDEwMDApCgojIEFkZGluZyBvYnMvZXhwCmltcG9ydF9vYnNleHAgPC0gZnVuY3Rpb24oZXhwZXJpbWVudCwgc3VmZml4KSB7CiAgbWFwX2RmcihyZXNvbHV0aW9ucywgZnVuY3Rpb24ocmVzKSB7CiAgICBmcmVhZChoZXJlKGxvb3BEaXIsCiAgICAgICAgICAgICAgIHNwcmludGYoIkhhbnNlbl91bmlvbl9hbGxSZXNfcG9zdHByb2Nlc3NlZF8lZGJwX29ieGV4cF8lc19wb29sZWQudHN2IiwKICAgICAgICAgICAgICAgICAgICAgICByZXMsIGV4cGVyaW1lbnQpKQogICAgKSAlPiUKICAgICAgbXV0YXRlKGlkID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBzZXAgPSAiXyIpKSAlPiUKICAgICAgc2VsZWN0KGlkLCBvb2UpICU+JQogICAgICByZW5hbWVfd2l0aCh+IHBhc3RlMCguLCAiXyIsIHN1ZmZpeCksCiAgICAgICAgICAgICAgICAgIGMob29lKSkKICB9KQp9CgpkYXRhIDwtIGRhdGEgJT4lCiAgbGVmdF9qb2luKGltcG9ydF9vYnNleHAoIkcxRE1TTyIsICJETVNPIikgJT4lIGRpc3RpbmN0KCksIGJ5ID0gImlkIikKZGF0YSA8LSBkYXRhICU+JQogIGxlZnRfam9pbihpbXBvcnRfb2JzZXhwKCJHMWRUQUciLCAiZFRBRyIpICU+JSBkaXN0aW5jdCgpLCBieSA9ICJpZCIpCmRhdGEgPC0gZGF0YSAlPiUKICBsZWZ0X2pvaW4oaW1wb3J0X29ic2V4cCgiRzFBNDg1IiwgIkE0ODUiKSAlPiUgZGlzdGluY3QoKSwgYnkgPSAiaWQiKQpkYXRhIDwtIGRhdGEgJT4lCiAgbGVmdF9qb2luKGltcG9ydF9vYnNleHAoIkVwaUcxRE1TTyIsICJFcGlETVNPIikgJT4lIGRpc3RpbmN0KCksIGJ5ID0gImlkIikKZGF0YSA8LSBkYXRhICU+JQogIGxlZnRfam9pbihpbXBvcnRfb2JzZXhwKCJFcGlHMWRUQUciLCAiRXBpZFRBRyIpICU+JSBkaXN0aW5jdCgpLCBieSA9ICJpZCIpCmRhdGEgPC0gZGF0YSAlPiUKICBsZWZ0X2pvaW4oaW1wb3J0X29ic2V4cCgiR1NFMTc4OTgyX0FzeW5jVVQiLCAiVVQiKSAlPiUgZGlzdGluY3QoKSwgYnkgPSAiaWQiKQpkYXRhIDwtIGRhdGEgJT4lCiAgbGVmdF9qb2luKGltcG9ydF9vYnNleHAoIkdTRTE3ODk4Ml9Bc3luY0FJRCIsICJBSUQiKSAlPiUgZGlzdGluY3QoKSwgYnkgPSAiaWQiKQoKZGF0YSA8LSBkYXRhICU+JSAKICBmaWx0ZXIoCiAgICAhaWZfYWxsKHN0YXJ0c193aXRoKCJvb2UiKSwgfiAueCA9PSAwKSAgICMgZHJvcCByb3dzIHdoZXJlIGV2ZXJ5IG9vZSB2YWx1ZSBpcyAwIG9yIE5BCiAgKQoKZndyaXRlKGRhdGEsIGhlcmUoY29tbW9uTG9vcERpciwgImxvb3BTY29yZV9IYW5zZW4udHN2IiksCiAgICAgICBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBUUlVFKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBBbm5vdGF0ZSBnZW5lcyBmb3IgcC1uIGxvb3BzCm5hbWUgPC0gIkhhbnNlbiIKZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwIiwgIm1tMTBfR1JDbTM4LnA2X1RTUzIuNWtiLmJlZCIpKQpjb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiZ2VuZSIsICJlbnNlbWJsIikKCgojIFNpbXBsZSBhbm5vdGF0aW9uCnRlbXAgPC0gZGF0YSAlPiUgcm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUoQTFfZ2VuZSA9IGlmZWxzZShBMV9zaW1wbGUgPT0gIlAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwR2VuZShnZW5lLlRTUy50YiwgY2hyb20xLCBzdGFydDEsIGVuZDEpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLAogICAgICAgICAgICAgICAgQTJfZ2VuZSA9IGlmZWxzZShBMl9zaW1wbGUgPT0gIlAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwR2VuZShnZW5lLlRTUy50YiwgY2hyb20yLCBzdGFydDIsIGVuZDIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLAogICAgICAgICAgICAgICAgZ2VuZSA9IGxpc3QodW5pcXVlKGMoQTFfZ2VuZSwgQTJfZ2VuZSkpKSkKCnRlbXBfcF9uIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ub19zaW1wbGUgJWluJSBjKCJQLVAiLCAiUC1FIiwgIlAtUyIsICJQLVgiKSkgJT4lIGRwbHlyOjpzZWxlY3QoLWMoIkExX2dlbmUiLCAiQTJfZ2VuZSIpKQpmd3JpdGUodGVtcF9wX24sIGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgbmFtZSwgIl9wLW5fc2ltcGxlX2dlbmVMaXN0LnRzdiIpKSwgc2VwID0gIlx0IikKCnRlbXAgPC0gZGF0YSAlPiUgcm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUoQTFfZ2VuZSA9IGlmZWxzZShBMV9zaW1wbGUgPT0gIlAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwRW5zZW1ibChnZW5lLlRTUy50YiwgY2hyb20xLCBzdGFydDEsIGVuZDEpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLAogICAgICAgICAgICAgICAgQTJfZ2VuZSA9IGlmZWxzZShBMl9zaW1wbGUgPT0gIlAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwRW5zZW1ibChnZW5lLlRTUy50YiwgY2hyb20yLCBzdGFydDIsIGVuZDIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLAogICAgICAgICAgICAgICAgZ2VuZSA9IGxpc3QodW5pcXVlKGMoQTFfZ2VuZSwgQTJfZ2VuZSkpKSkKCnRlbXBfcF9uIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ub19zaW1wbGUgJWluJSBjKCJQLVAiLCAiUC1FIiwgIlAtUyIsICJQLVgiKSkgJT4lIGRwbHlyOjpzZWxlY3QoLWMoIkExX2dlbmUiLCAiQTJfZ2VuZSIpKQpmd3JpdGUodGVtcF9wX24sIGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgbmFtZSwgIl9wLW5fc2ltcGxlX2Vuc2VtYmxMaXN0LnRzdiIpKSwgc2VwID0gIlx0IikKCiMgY29tcGxleCBhbm5vdGF0aW9uCnRlbXAgPC0gZGF0YSAlPiUgcm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUoQTFfZ2VuZSA9IGlmZWxzZShBMSAlaW4lIGMoIlAiLCAiU1AiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChmaW5kT3ZlcmxhcEdlbmUoZ2VuZS5UU1MudGIsIGNocm9tMSwgc3RhcnQxLCBlbmQxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSwKICAgICAgICAgICAgICAgIEEyX2dlbmUgPSBpZmVsc2UoQTIgJWluJSBjKCJQIiwgIlNQIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZmluZE92ZXJsYXBHZW5lKGdlbmUuVFNTLnRiLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSksCiAgICAgICAgICAgICAgICBnZW5lID0gbGlzdCh1bmlxdWUoYyhBMV9nZW5lLCBBMl9nZW5lKSkpKQoKdGVtcF9wX24gPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihzdHJfZGV0ZWN0KEFubm8sICJQIikpICU+JQogIGRwbHlyOjpzZWxlY3QoLWMoIkExX2dlbmUiLCAiQTJfZ2VuZSIpKQpmd3JpdGUodGVtcF9wX24sIGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgbmFtZSwgIl9wLW5fY29tcGxleF9nZW5lTGlzdC50c3YiKSksIHNlcCA9ICJcdCIpCgp0ZW1wIDwtIGRhdGEgJT4lIHJvd3dpc2UoKSAlPiUKICBkcGx5cjo6bXV0YXRlKEExX2dlbmUgPSBpZmVsc2UoQTEgJWluJSBjKCJQIiwgIlNQIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZmluZE92ZXJsYXBFbnNlbWJsKGdlbmUuVFNTLnRiLCBjaHJvbTEsIHN0YXJ0MSwgZW5kMSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSksCiAgICAgICAgICAgICAgICBBMl9nZW5lID0gaWZlbHNlKEEyICVpbiUgYygiUCIsICJTUCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwRW5zZW1ibChnZW5lLlRTUy50YiwgY2hyb20yLCBzdGFydDIsIGVuZDIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLAogICAgICAgICAgICAgICAgZ2VuZSA9IGxpc3QodW5pcXVlKGMoQTFfZ2VuZSwgQTJfZ2VuZSkpKSkKCnRlbXBfcF9uIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoc3RyX2RldGVjdChBbm5vLCAiUCIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1jKCJBMV9nZW5lIiwgIkEyX2dlbmUiKSkKZndyaXRlKHRlbXBfcF9uLCBoZXJlKGNvbW1vbkxvb3BEaXIsIHBhc3RlMCgibG9vcFNjb3JlXyIsIG5hbWUsICJfcC1uX2NvbXBsZXhfZW5zZW1ibExpc3QudHN2IikpLCBzZXAgPSAiXHQiKQoKYGBgCgojIEFOQUxZU0lTCiMjIFsxXSBDb21wYXJpbmcgbG9vcHMKIyMjIENvbW1vbiBzdHVmZnMKYGBge3J9CiMgUGFyYW1ldGVycwpjb21tb25Mb29wRGlyIDwtIGhlcmUoIi4uL2RhdGEvbG9vcF9hbmFseXNpcyIpCnBzZXVkb09vZSA8LSAwLjAxCgpmaWdEaXIgPC0gaGVyZSgiLi4vZmlndXJlL2xvb3BfYW5hbHlzaXMiKQoKYGBgCiMjIyBJbXBvcnQgbG9vcHMKYGBge3J9Cmxvb3BfY2hyb21vIDwtIGFzX3RpYmJsZShmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsICJsb29wU2NvcmVfY2hyb21vc2lnaHQudHN2IikpKQpsb29wX2hpY2RjcCA8LSBhc190aWJibGUoZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCAibG9vcFNjb3JlX2hpY2RjcC50c3YiKSkpCmxvb3BfSGFuc2VuIDwtIGFzX3RpYmJsZShmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsICJsb29wU2NvcmVfSGFuc2VuLnRzdiIpKSkKbG9vcF9Uamlhbl9jaHJvbW8gPC0gYXNfdGliYmxlKGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgIi4uL2xvb3BfVGppYW4vVGppYW5DaHJvbW9fdW5pb25fYWxsUmVzLmJlZHBlIikpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKGFicyhWNS1WMikgPD0gMjAwMDAwMCkKY29sbmFtZXMobG9vcF9Uamlhbl9jaHJvbW8pIDwtIGMoImNocm9tMSIsICJzdGFydDEiLCAiZW5kMSIsICJjaHJvbTIiLCAic3RhcnQyIiwgImVuZDIiKQpsb29wX1RqaWFuX211c3RhY2hlIDwtIGFzX3RpYmJsZShmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsICIuLi9sb29wX1RqaWFuL1RqaWFuTXVzdGFjaGVfdW5pb25fYWxsUmVzLmJlZHBlIikpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKGFicyhWNS1WMikgPD0gMjAwMDAwMCkKY29sbmFtZXMobG9vcF9Uamlhbl9tdXN0YWNoZSkgPC0gYygiY2hyb20xIiwgInN0YXJ0MSIsICJlbmQxIiwgImNocm9tMiIsICJzdGFydDIiLCAiZW5kMiIpCgpgYGAKIyMjIFtGSUddIE9mZnNldCBwbG90CiMjIyMgRnVuY3Rpb24KYGBge3J9CiMgaGVscGVyIHRoYXQgb25seSB1c2VzIHRoZSB0d28gYW5jaG9ycwptYWtlX2dpIDwtIGZ1bmN0aW9uKGRmKSB7CiAgYTEgPC0gR1JhbmdlcyhkZiRjaHJvbTEsIElSYW5nZXMoZGYkc3RhcnQxLCBkZiRlbmQxKSkKICBhMiA8LSBHUmFuZ2VzKGRmJGNocm9tMiwgSVJhbmdlcyhkZiRzdGFydDIsIGRmJGVuZDIpKQogIEdJbnRlcmFjdGlvbnMoYTEsIGEyKQp9CgojIEV4cGFuZCBlYWNoIGFuY2hvciB0byAxMCBrYiBmb3IgY29tcGFyaXNvbgpleHBhbmRfYW5jaG9yIDwtIGZ1bmN0aW9uKGdpKSB7CiAgYTEgPC0gYW5jaG9ycyhnaSwgImZpcnN0IikKICBhMiA8LSBhbmNob3JzKGdpLCAic2Vjb25kIikKICBhMXIgPC0gcmVzaXplKGExLCB3aWR0aCA9IHBtYXgod2lkdGgoYTEpLCBleHBhbmRTaXplKSwgZml4ID0gImNlbnRlciIpCiAgYTJyIDwtIHJlc2l6ZShhMiwgd2lkdGggPSBwbWF4KHdpZHRoKGEyKSwgZXhwYW5kU2l6ZSksIGZpeCA9ICJjZW50ZXIiKQogIEdJbnRlcmFjdGlvbnMoYTFyLCBhMnIpCn0KYGBgCiMjIyMgSGlDREMrLCBIYW5zZW4KYGBge3J9CmZvcihleHBhbmRTaXplIGluIGMoNTAwMCwgMTAwMDAsIDI1MDAwKSl7CiAgZ2kxIDwtIGV4cGFuZF9hbmNob3IobWFrZV9naShsb29wX2Nocm9tbykpCiAgZ2kyIDwtIGV4cGFuZF9hbmNob3IobWFrZV9naShsb29wX2hpY2RjcCkpCiAgZ2kzIDwtIGV4cGFuZF9hbmNob3IobWFrZV9naShsb29wX0hhbnNlbikpCiAgCiAgZ2lfYWxsIDwtIGMoZ2kxLCBnaTIsIGdpMykKICAKICAjIDQpIGRldGVybWluZSBtZW1iZXJzaGlwIHZpYSBDaGVieXNoZXYgZGlzdGFuY2UgPSAxIGJpbigxMCBrYikKICBpbjEgPC0gb3ZlcmxhcHNBbnkoZ2lfYWxsLCBnaTEsICAgIG1heGdhcD1leHBhbmRTaXplLCB0eXBlPSJlcXVhbCIpCiAgaW4yIDwtIG92ZXJsYXBzQW55KGdpX2FsbCwgZ2kyLCAgICBtYXhnYXA9ZXhwYW5kU2l6ZSwgdHlwZT0iZXF1YWwiKQogIGluMyA8LSBvdmVybGFwc0FueShnaV9hbGwsIGdpMywgICAgbWF4Z2FwPWV4cGFuZFNpemUsIHR5cGU9ImVxdWFsIikKICAKICBtZW1iZXJzaGlwX2RmIDwtIHRpYmJsZSgKICAgIGxvb3AgPSBzZXFfYWxvbmcoZ2lfYWxsKSwKICAgIHNldDEgPSBpbjEsCiAgICBzZXQyID0gaW4yLAogICAgc2V0MyA9IGluMwogICkKICAKICBtZW1iZXJzaGlwX2RmIDwtIG1lbWJlcnNoaXBfZGYgJT4lCiAgICByZW5hbWUoCiAgICAgIENocm9tb3NpZ2h0ICAgICA9IHNldDEsCiAgICAgIEhpQ0RDUCAgICAgPSBzZXQyLAogICAgICBIYW5zZW4gPSBzZXQzCiAgICApCiAgCiAgIyA1KSBVcFNldCBwbG90IG9mIGFsbCBjb21iaW5hdGlvbnMKICBwIDwtIHVwc2V0KAogICAgbWVtYmVyc2hpcF9kZiwKICAgIGludGVyc2VjdCA9IGMoIkNocm9tb3NpZ2h0IiwiSGlDRENQIiwiSGFuc2VuIiksCiAgICBuYW1lID0gIiIsCiAgICBiYXNlX2Fubm90YXRpb25zID0gbGlzdCgKICAgICAgJ0xvb3AgIycgPSBpbnRlcnNlY3Rpb25fc2l6ZSgpCiAgICApCiAgKSArIGdndGl0bGUocGFzdGUwKGV4cGFuZFNpemUsICJicCBleHBhbmRlZCwgMSBDaGVieWNoZXYgZGlzdCIpKQogIAogIAogIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoIm9mZlNldF8iLCBleHBhbmRTaXplLCAiYnBfZXhwYW5kZWQiKSkKICB3aWR0aCA8LSBwYW5lbFNpemUoNS41KSptbVRvSW5jaAogIGhlaWdodCA8LSBwYW5lbFNpemUoMykqbW1Ub0luY2gKICBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KYGBgCiMjIyMgVGppYW4KYGBge3J9CmZvcihleHBhbmRTaXplIGluIGMoNTAwMCwgMTAwMDAsIDI1MDAwKSl7CiAgZ2kxIDwtIGV4cGFuZF9hbmNob3IobWFrZV9naShsb29wX2Nocm9tbykpCiAgZ2kyIDwtIGV4cGFuZF9hbmNob3IobWFrZV9naShsb29wX1RqaWFuX2Nocm9tbykpCiAgZ2kzIDwtIGV4cGFuZF9hbmNob3IobWFrZV9naShsb29wX1RqaWFuX211c3RhY2hlKSkKICAKICBnaV9hbGwgPC0gYyhnaTEsIGdpMiwgZ2kzKQogIAogICMgNCkgZGV0ZXJtaW5lIG1lbWJlcnNoaXAgdmlhIENoZWJ5c2hldiBkaXN0YW5jZSA9IDEgYmluKDEwIGtiKQogIGluMSA8LSBvdmVybGFwc0FueShnaV9hbGwsIGdpMSwgICAgbWF4Z2FwPWV4cGFuZFNpemUsIHR5cGU9ImVxdWFsIikKICBpbjIgPC0gb3ZlcmxhcHNBbnkoZ2lfYWxsLCBnaTIsICAgIG1heGdhcD1leHBhbmRTaXplLCB0eXBlPSJlcXVhbCIpCiAgaW4zIDwtIG92ZXJsYXBzQW55KGdpX2FsbCwgZ2kzLCAgICBtYXhnYXA9ZXhwYW5kU2l6ZSwgdHlwZT0iZXF1YWwiKQogIAogIG1lbWJlcnNoaXBfZGYgPC0gdGliYmxlKAogICAgbG9vcCA9IHNlcV9hbG9uZyhnaV9hbGwpLAogICAgc2V0MSA9IGluMSwKICAgIHNldDIgPSBpbjIsCiAgICBzZXQzID0gaW4zCiAgKQogIAogIG1lbWJlcnNoaXBfZGYgPC0gbWVtYmVyc2hpcF9kZiAlPiUKICAgIHJlbmFtZSgKICAgICAgTGVlX2Nocm9tbyAgICAgPSBzZXQxLAogICAgICBUamlhbl9jaHJvbW8gICAgID0gc2V0MiwKICAgICAgVGppYW5fbXVzdGFjaGUgPSBzZXQzCiAgICApCiAgCiAgIyA1KSBVcFNldCBwbG90IG9mIGFsbCBjb21iaW5hdGlvbnMKICBwIDwtIHVwc2V0KAogICAgbWVtYmVyc2hpcF9kZiwKICAgIGludGVyc2VjdCA9IGMoIkxlZV9jaHJvbW8iLCJUamlhbl9jaHJvbW8iLCJUamlhbl9tdXN0YWNoZSIpLAogICAgbmFtZSA9ICIiLAogICAgYmFzZV9hbm5vdGF0aW9ucyA9IGxpc3QoCiAgICAgICdMb29wICMnID0gaW50ZXJzZWN0aW9uX3NpemUoKQogICAgKQogICkgKyBnZ3RpdGxlKHBhc3RlMChleHBhbmRTaXplLCAiYnAgZXhwYW5kZWQsIDEgQ2hlYnljaGV2IGRpc3QiKSkKICAKICAKICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKCJvZmZTZXQyXyIsIGV4cGFuZFNpemUsICJicF9leHBhbmRlZCIpKQogIHdpZHRoIDwtIHBhbmVsU2l6ZSg1LjUpKm1tVG9JbmNoCiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgzKSptbVRvSW5jaAogIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKfQpgYGAKIyMgWzJdIFZpc3VhbGl6aW5nIGxvb3AgYW5ub3RhdGlvbgojIyMgW0ZJR10gTG9vcCBBbm5vIHBpZSBjaGFydApgYGB7cn0KCmRyYXdfZG9udXQgPC0gZnVuY3Rpb24obG9vcCwgbmFtZSl7CiAgbiA8LSBucm93KGxvb3ApCiAgdGVtcCA8LSBsb29wICU+JSBkcGx5cjo6c2VsZWN0KGlkLCBBbm5vKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoQW5ub0dyb3VwID0gY2FzZV93aGVuKAogICAgICBBbm5vICVpbiUgYygiUC1QIiwgIlAtRSIsICJFLUUiKSB+ICJyZWdfcmVnIiwKICAgICAgQW5ubyAlaW4lIGMoIlAtU1AiLCAiUC1TRSIsICJFLVNQIiwgIkUtU0UiKSB+ICJyZWdfc3RyUmVnIiwKICAgICAgQW5ubyAlaW4lIGMoIlAtUyIsICJFLVMiKSB+ICJyZWdfc3RyIiwKICAgICAgQW5ubyAlaW4lIGMoIlNQLVNQIiwgIlNQLVNFIiwgIlNFLVNFIikgfiAic3RyUmVnX3N0clJlZyIsCiAgICAgIEFubm8gJWluJSBjKCJTUC1TIiwgIlNFLVMiKSB+ICJzdHJSZWdfc3RyIiwKICAgICAgQW5ubyAlaW4lIGMoIlAtWCIsICJFLVgiKSB+ICJyZWdfb3RoZXIiLAogICAgICBBbm5vICVpbiUgYygiU1AtWCIsICJTRS1YIikgfiAic3RyUmVnX290aGVyIiwKICAgICAgQW5ubyAlaW4lIGMoIlMtUyIsICJTLVgiKSB+ICJzdHIiLAogICAgICBBbm5vICVpbiUgYygiWC1YIikgfiAib3RoZXIiLAogICAgICBUUlVFIH4gTkEKICAgICkpCiAgCiAgCiAgdGVtcCRBbm5vR3JvdXAgPC0gZmFjdG9yKHRlbXAkQW5ub0dyb3VwLCBsZXZlbHMgPSBjKCJyZWdfcmVnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ19zdHJSZWciLCAicmVnX3N0ciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJSZWdfc3RyUmVnIiwgInN0clJlZ19zdHIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnX290aGVyIiwgInN0clJlZ19vdGhlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyIiwgIm90aGVyIikpCiAgCiAgCiAgcGllX2RmIDwtIHRlbXAgJT4lCiAgICBhc190aWJibGUoKSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgdGVtcCB3YXMgYSBsaXN0LCB0aGlzIHdpbGwgZXJyb3IgZWFybHkKICAgIGdyb3VwX2J5KEFubm9Hcm91cCkgJT4lCiAgICBzdW1tYXJpc2UobiA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgICBtdXRhdGUobGFiZWwgPSBwYXN0ZTAoQW5ub0dyb3VwLCAiXG4oIiwgbiwgIikiKSkKICAKICBwIDwtIGdncGxvdChwaWVfZGYsIGFlcyh4ID0gMiwgeSA9IG4sIGZpbGwgPSBBbm5vR3JvdXApKSArCiAgICBnZW9tX2NvbChjb2xvciA9ICJibGFjayIsIHdpZHRoID0gMSkgKwogICAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsKICAgIHhsaW0oMC41LCAyLjUpICsgICAgICAgICAgICAgICAgIyA8LSBjcmVhdGVzIHRoZSDigJxob2xl4oCdIGJ5IGNsaXBwaW5nIHRoZSBjZW50ZXIKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBsYWJlbCksCiAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksCiAgICAgICAgICAgICAgc2l6ZSA9IDMpICsKICAgIHRoZW1lX3ZvaWQoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KQogICAgKSArCiAgICBnZ3RpdGxlKHBhc3RlMChuYW1lLCAiXG4iLCBuLCAiIGxvb3BzIikpCiAgCiAgCiAgd2lkdGggPSAzCiAgaGVpZ2h0ID0gMwogIHN2Z2xpdGUoaGVyZShmaWdEaXIsCiAgICAgICAgICAgICAgIHBhc3RlMCgiZG9udXRfbG9vcEFubm9fIiwgbmFtZSwgIi5zdmciKSksCiAgICAgICAgICB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpCiAgcGxvdChwKQogIGRldi5vZmYoKQp9CgpkcmF3X2RvbnV0KGxvb3BfY2hyb21vLCAiY2hyb21vc2lnaHQiKQpkcmF3X2RvbnV0KGxvb3BfaGljZGNwLCAiaGljZGNwIikKZHJhd19kb251dChsb29wX0hhbnNlbiwgIkhhbnNlbiIpCgpgYGAKIyMgWzNdIExvb3AgYW5hbHlzaXMKIyMjIENocm9tb3NpZ2h0CiMjIyMgW0ZJR10gU2NhdHRlcnBsb3QKYGBge3J9CnBsb3RfbG9vcF9zY29yZXNfYW5kX3NhdmVfYmVkcGUgPC0gZnVuY3Rpb24oZGYsIGNvbF94LCBjb2xfeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3hfb29lLCBjb2xfeV9vb2UsIHBzZXVkb19vb2UgPSAwLjAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHRpdGxlLCBmaWdEaXIsIGxvb3BEaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMiwgZGVuc2l0eV9uID0gMjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtaW4gPSAtMC41LCB4bWF4ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWluID0gLTAuNSwgeW1heCA9IDEsIGFubm9fY29sID0gIkFubm9fc2ltcGxlIikgewogIGNvbF94X3EgPC0gZW5xdW8oY29sX3gpCiAgY29sX3lfcSA8LSBlbnF1byhjb2xfeSkKICAKICBjb2xfeF9vb2VfcSA8LSBlbnF1byhjb2xfeF9vb2UpCiAgY29sX3lfb29lX3EgPC0gZW5xdW8oY29sX3lfb29lKQogIAogIGFubm9fY29sX3N5bSA8LSBzeW0oYW5ub19jb2wpCiAgCiAgCiAgIyBDcmVhdGUgYSBzaW5nbGUsIHVuaWZpZWQgZGF0YWZyYW1lIGZvciBwbG90dGluZyBhbmQgc2F2aW5nIGFzIGJlZHBlCiAgZGZfdGVtcCA8LSBkZiAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoISFhbm5vX2NvbF9zeW0gJWluJSBhbm5vTGlzdCkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxLCBjaHJvbTIsIHN0YXJ0MiwgZW5kMiwgaWQsIHggPSAhIWNvbF94X3EsIHkgPSAhIWNvbF95X3EsCiAgICAgICAgICAgICAgICAgIHhfb29lID0gISFjb2xfeF9vb2VfcSwgeV9vb2UgPSAhIWNvbF95X29vZV9xKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoZGlmZiA9IHkteCwKICAgICAgICAgICAgICAgICAgZGVuc2l0eSA9IGdldF9kZW5zaXR5KHgsIHksIG4gPSBkZW5zaXR5X24pKSAlPiUKICAgIGRwbHlyOjptdXRhdGUodXBkb3duID0gY2FzZV93aGVuKAogICAgICBkaWZmID4gZGlmZkN1dG9mZiAgfiAiVVAiLAogICAgICBkaWZmIDwgLWRpZmZDdXRvZmYgfiAiRE9XTiIsCiAgICAgIFRSVUUgICAgICAgICAgICAgICB+ICJOTyIpKQogIAogICMgRXhwb3J0IGFzIGJlZHBlCiAgYmVkcGVVUCA8LSBkZl90ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93biA9PSAiVVAiKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIpCiAgZndyaXRlKGJlZHBlVVAsIGhlcmUobG9vcERpciwgcGFzdGUwKG5hbWUsICJfZGlmZkN1dG9mZiIsIGRpZmZDdXRvZmYsICJfVVAuYmVkcGUiKSksIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFKQogIGJlZHBlTk8gPC0gZGZfdGVtcCAlPiUgZHBseXI6OmZpbHRlcih1cGRvd24gPT0gIk5PIikgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyKQogIGZ3cml0ZShiZWRwZU5PLCBoZXJlKGxvb3BEaXIsIHBhc3RlMChuYW1lLCAiX2RpZmZDdXRvZmYiLCBkaWZmQ3V0b2ZmLCAiX05PLmJlZHBlIikpLCBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSkKICBiZWRwZURPV04gPC0gZGZfdGVtcCAlPiUgZHBseXI6OmZpbHRlcih1cGRvd24gPT0gIkRPV04iKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIpCiAgZndyaXRlKGJlZHBlRE9XTiwgaGVyZShsb29wRGlyLCBwYXN0ZTAobmFtZSwgIl9kaWZmQ3V0b2ZmIiwgZGlmZkN1dG9mZiwgIl9ET1dOLmJlZHBlIikpLCBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSkKICAKICAKICBwbG90X2RmIDwtIGRmX3RlbXAgJT4lCiAgICBkcGx5cjo6c2VsZWN0KGlkLCB4LCB5LCB1cGRvd24sIGRlbnNpdHkpICU+JQogICAgYXJyYW5nZShkZW5zaXR5KQogIAogIHBsb3RfZGYkdXBkb3duIDwtIGZhY3RvcihwbG90X2RmJHVwZG93biwgYygiVVAiLCAiTk8iLCAiRE9XTiIpKQogIAogICMgQ2FsY3VsYXRlIGEgZ2xvYmFsIGRlbnNpdHkgcmFuZ2UgdG8gbWFrZSBzY2FsZXMgY29tcGFyYWJsZQogIGRlbnNpdHlfbGltaXRzIDwtIHJhbmdlKHBsb3RfZGYkZGVuc2l0eSwgbmEucm0gPSBUUlVFKQogIAogICMgLS0tLS0tIFNjYXR0ZXJwbG90IC0tLS0tLSAKICBwMSA8LSBnZ3Bsb3QocGxvdF9kZiwgYWVzKHggPSB4LCB5ID0geSkpICsKICAgICMgTGF5ZXIgMTogUGxvdCAiTk8iIHBvaW50cyB3aXRoIGEgZ3JleSBzY2FsZQogICAgZ2VvbV9wb2ludChkYXRhID0gLiAlPiUgZmlsdGVyKHVwZG93biA9PSAiTk8iKSAlPiUgYXJyYW5nZShkZW5zaXR5KSwKICAgICAgICAgICAgICAgYWVzKGNvbG9yID0gZGVuc2l0eSksIHNpemUgPSAwLjEpICsKICAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KAogICAgICBsb3cgPSAiZ3JleTg1IiwgaGlnaCA9ICJncmV5MzAiLAogICAgICBsaW1pdHMgPSBkZW5zaXR5X2xpbWl0cywgbmFtZSA9ICJEZW5zaXR5IChOTykiCiAgICApICsKICAgIAogICAgIyBJbnRyb2R1Y2UgYSBuZXcgc2NhbGUgZm9yIHRoZSAiVVAiIHBvaW50cwogICAgbmV3X3NjYWxlX2NvbG9yKCkgKwogICAgIyBMYXllciAyOiBQbG90ICJVUCIgcG9pbnRzIHdpdGggYSByZWQgc2NhbGUKICAgIGdlb21fcG9pbnQoZGF0YSA9IC4gJT4lIGZpbHRlcih1cGRvd24gPT0gIlVQIikgJT4lIGFycmFuZ2UoZGVuc2l0eSksCiAgICAgICAgICAgICAgIGFlcyhjb2xvciA9IGRlbnNpdHkpLCBzaXplID0gMC4xKSArCiAgICBzY2FsZV9jb2xvcl9ncmFkaWVudCgKICAgICAgbG93ID0gd2Vha19yZWQsIGhpZ2ggPSBzdHJvbmdfcmVkLCAjIExpZ2h0IHRvIGRhcmsgcmVkCiAgICAgIGxpbWl0cyA9IGRlbnNpdHlfbGltaXRzLCBuYW1lID0gIkRlbnNpdHkgKFVQKSIKICAgICkgKwogICAgCiAgICAjIEludHJvZHVjZSBhIG5ldyBzY2FsZSBmb3IgdGhlICJET1dOIiBwb2ludHMKICAgIG5ld19zY2FsZV9jb2xvcigpICsKICAgICMgTGF5ZXIgMzogUGxvdCAiRE9XTiIgcG9pbnRzIHdpdGggYSBibHVlIHNjYWxlCiAgICBnZW9tX3BvaW50KGRhdGEgPSAuICU+JSBmaWx0ZXIodXBkb3duID09ICJET1dOIikgJT4lIGFycmFuZ2UoZGVuc2l0eSksCiAgICAgICAgICAgICAgIGFlcyhjb2xvciA9IGRlbnNpdHkpLCBzaXplID0gMC4xKSArCiAgICBzY2FsZV9jb2xvcl9ncmFkaWVudCgKICAgICAgbG93ID0gd2Vha19ibHVlLCBoaWdoID0gc3Ryb25nX2JsdWUsICMgTGlnaHQgdG8gZGFyayBibHVlCiAgICAgIGxpbWl0cyA9IGRlbnNpdHlfbGltaXRzLCBuYW1lID0gIkRlbnNpdHkgKERPV04pIgogICAgKSArCiAgICAKICAgICMgQWRkIGFubm90YXRpb25zIGFuZCB0aGVtZSBlbGVtZW50cwogICAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgKyBjb29yZF9maXhlZCgpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIsCiAgICAgIGNvbG9yID0gImJsYWNrIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIikgKwogICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLAogICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLAogICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IiwKICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIsCiAgICAgIGNvbG9yID0gImJsYWNrIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIikgKwogICAgdGhlbWVfY2xhc3NpYygpICsKICAgIHRoZW1lKAogICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgICAgaGp1c3QgPSAwLjUsCiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgICBmYW1pbHkgPSBmb250VHlwZQogICAgICApLAogICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICAgKSwKICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICAgKSwKICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgICApLAogICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgICApLAogICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgICkgKwogICAgbGFicyh4ID0gcXVvX25hbWUoY29sX3hfcSksIHkgPSBxdW9fbmFtZShjb2xfeV9xKSkgKwogICAgZ2d0aXRsZSh0aXRsZSkKICAKICB3aWR0aCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaAogIGhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaCAgCiAgCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJzY2F0dGVycGxvdF8iLCBuYW1lKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksIAogICAgICAgICAgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KQogIHByaW50KHAxKQogIGRldi5vZmYoKQogIAogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgCiAgICAgIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodCwgdW5pdHMgPSAiaW4iLCByZXMgPSA2MDApCiAgcHJpbnQocDEpCiAgZGV2Lm9mZigpCiAgCiAgIyAtLS0tLS0gUGllIGNoYXJ0IC0tLS0tLSAKICBwaWVfZGYgPC0gcGxvdF9kZiAlPiUKICAgIGRwbHlyOjpjb3VudCh1cGRvd24pICU+JQogICAgbXV0YXRlKAogICAgICBwY3QgICA9IG4gLyBzdW0obikgKiAxMDAsCiAgICAgIGxhYmVsID0gcGFzdGUwKHVwZG93biwgIlxuIiwgbiwgIlxuKCIsIHJvdW5kKHBjdCwgMSksICIlKSIpCiAgICApCiAgCiAgcDIgPC0gZ2dwbG90KHBpZV9kZiwgYWVzKHggPSAiIiwgeSA9IG4sIGZpbGwgPSB1cGRvd24pKSArCiAgICBnZW9tX2NvbChjb2xvciA9ICJ3aGl0ZSIpICsKICAgIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArCiAgICBnZW9tX3RleHQoCiAgICAgIGFlcyhsYWJlbCA9IGxhYmVsKSwKICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksCiAgICAgIHNpemUgICAgID0gZm9udFNpemVNIC8gMgogICAgKSArCiAgICB0aGVtZV92b2lkKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlVQIiA9IHN0cm9uZ19yZWQsICJOTyIgPSBub19ncmV5LCAiRE9XTiIgPSBzdHJvbmdfYmx1ZSkpCiAgCiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMCgicGllY2hhcnRfIiwgbmFtZSkpCiAgd2lkdGggPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoCiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaAogIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpCiAgcHJpbnQocDIpCiAgZGV2Lm9mZigpCiAgCiAgCiAgIyAtLS0tLS0gVmlvbGluIHBsb3Qgb2Ygb29lIC0tLS0tLSAKICBwbG90X2RmX29vZSA8LSBkZl90ZW1wICU+JQogICAgZHBseXI6OnNlbGVjdChpZCwgeF9vb2UsIHlfb29lLCB1cGRvd24pICU+JQogICAgZHBseXI6OmZpbHRlcighaXMubmEoeF9vb2UpLCAhaXMubmEoeV9vb2UpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoCiAgICAgIHhfb29lID0gaWZfZWxzZSh4X29vZSA9PSAwLCBwc2V1ZG9fb29lLCB4X29vZSksCiAgICAgIHlfb29lID0gaWZfZWxzZSh5X29vZSA9PSAwLCBwc2V1ZG9fb29lLCB5X29vZSksCiAgICAgIGZjICAgID0gbG9nMih5X29vZSAvIHhfb29lKQogICAgKQogIAogIHBsb3RfZGZfb29lJHVwZG93biA8LSBmYWN0b3IocGxvdF9kZl9vb2UkdXBkb3duLCBsZXZlbHMgPSBjKCJVUCIsICJOTyIsICJET1dOIikpCiAgCiAgcDMgPC0gZ2dwbG90KHBsb3RfZGZfb29lLCBhZXMoeCA9IHVwZG93biwgeSA9IGZjLCBmaWxsID0gdXBkb3duKSkgKwogICAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsIGFscGhhID0gLjQsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgc3RhdF9zdW1tYXJ5KAogICAgICBhZXMoZ3JvdXAgPSB1cGRvd24pLCBmdW4gPSBtZWFuLAogICAgICBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSwKICAgICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMykKICAgICkgKwogICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0zLCAzKSkgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhzdHJvbmdfcmVkLCAiZ3JleTMwIiwgc3Ryb25nX2JsdWUpKSArCiAgICB0aGVtZSgKICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoCiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgICApLAogICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgICApLAogICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVNLAogICAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzCiAgICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb24KICAgICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KICAgICAgKSwKICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgICApLAogICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgICApLAogICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgICApICtsYWJzKHkgPSAibG9nMiBmYyBvZiBvYnMvZXhwIikgICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsCiAgICAgICAgICAgICAgIGFscGhhID0gMSwKICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgICAgICAgICAgbGluZWVuZCA9ICJzcXVhcmUiKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjKC0wLjUsIDAuNSksCiAgICAgICAgICAgICAgIGFscGhhID0gMC41LAogICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICAgICAgICAgICBsaW5lZW5kID0gInNxdWFyZSIsIGxpbmV0eXBlID0gImRhc2hlZCIpCiAgIAogIAogIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoCiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJ2aW9saW5fIiwgbmFtZSkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHAzKQogIGRldi5vZmYoKSAgCn0KCgpjb21tb25Mb29wRGlyIDwtIGhlcmUoIi4uL2RhdGEvbG9vcF9hbmFseXNpcyIpCmZpZ0RpciA8LSBoZXJlKCIuLi9maWd1cmUvbG9vcF9hbmFseXNpcyIpCmRpci5jcmVhdGUoZmlnRGlyLCBzaG93V2FybmluZ3MgPSBGQUxTRSwgcmVjdXJzaXZlID0gVFJVRSkKCmRhdGEgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCAibG9vcFNjb3JlX2Nocm9tb3NpZ2h0LnRzdiIpKQpwbG90X2xvb3Bfc2NvcmVzX2FuZF9zYXZlX2JlZHBlKGRhdGEsIHNjb3JlX0RNU08sIHNjb3JlX2RUQUcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9vZV9ETVNPLCBvb2VfZFRBRywgcHNldWRvX29vZSA9IDAuMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLUUiLCAiRS1TIiwgIkUtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUy1TIiwgIlMtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC1YIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9zY29yZV9hbGxfZFRBR3ZzRE1TTyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiY2hyb21vX3Njb3JlX2FsbF9kVEFHdnNETVNPIiwgZmlnRGlyLCBjb21tb25Mb29wRGlyKQoKCnBsb3RfbG9vcF9zY29yZXNfYW5kX3NhdmVfYmVkcGUoZGF0YSwgc2NvcmVfRE1TTywgc2NvcmVfZFRBRywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb29lX0RNU08sIG9vZV9kVEFHLCBwc2V1ZG9fb29lID0gMC4wMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiY2hyb21vc2lnaHRfc2NvcmVfY29tcGxleF9yZWdfZFRBR3ZzRE1TTyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiY2hyb21vX3Njb3JlX2NvbXBsZXhfcmVnX2RUQUd2c0RNU08iLCBmaWdEaXIsIGNvbW1vbkxvb3BEaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub19jb2wgPSAiQW5ubyIpCgoKCnBsb3RfbG9vcF9zY29yZXNfYW5kX3NhdmVfYmVkcGUoZGF0YSwgc2NvcmVfRE1TTywgc2NvcmVfZFRBRywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb29lX0RNU08sIG9vZV9kVEFHLCBwc2V1ZG9fb29lID0gMC4wMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJTLVMiLCAiUy1YIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9zY29yZV9jb21wbGV4X3N0cl9kVEFHdnNETVNPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fc2NvcmVfY29tcGxleF9zdHJfZFRBR3ZzRE1TTyIsIGZpZ0RpciwgY29tbW9uTG9vcERpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vX2NvbCA9ICJBbm5vIikKCnBsb3RfbG9vcF9zY29yZXNfYW5kX3NhdmVfYmVkcGUoZGF0YSwgc2NvcmVfRE1TTywgc2NvcmVfZFRBRywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb29lX0RNU08sIG9vZV9kVEFHLCBwc2V1ZG9fb29lID0gMC4wMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJTLVMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X3Njb3JlX2NvbXBsZXhfc3RyMl9kVEFHdnNETVNPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fc2NvcmVfY29tcGxleF9zdHIyX19kVEFHdnNETVNPIiwgZmlnRGlyLCBjb21tb25Mb29wRGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9fY29sID0gIkFubm8iKQoKCmBgYAojIyMjIFtGSUddIExPTEEgb24gYW5jaG9yCmBgYHtyfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIExPQURJTkcgTE9MQSBEQgpsaWJyYXJ5KCJzaW1wbGVDYWNoZSIpCmxpYnJhcnkoIkxPTEEiKQpsb2xhREIgPSBsb2FkUmVnaW9uREIoIi9Wb2x1bWVzL1VLSklOX1NTRC9NdG9HMV9hbmFseXNpc19jb2RlL3JlZmVyZW5jZS9MT0xBQ29yZV9jYWNoZWQvbW0xMCIpCgojIEZVTkNUSU9OUwpleHRyYWN0QW5jaG9yIDwtIGZ1bmN0aW9uKGxvb3ApewogIGFuY2hvcjEgPC0gbG9vcCAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKQogIGNvbG5hbWVzKGFuY2hvcjEpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQogIGFuY2hvcjIgPC0gbG9vcCAlPiUgZHBseXI6OnNlbGVjdChjKDQsIDUsIDYpKQogIGNvbG5hbWVzKGFuY2hvcjIpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQogIGFuY2hvcnMgPC0gcmVkdWNlKG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShiaW5kX3Jvd3MoYW5jaG9yMSwgYW5jaG9yMikpKQogICAgcmV0dXJuKGFuY2hvcnMpCn0KCmF0YWMgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwIiwgIkdTTTMxMDYyNTdfQVRBQ19FU0NfMS5iZWQiKSkgJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMykKY29sbmFtZXMoYXRhYykgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCmF0YWMuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGF0YWMpCmBgYAojIyMjIyBBbGwgbG9vcHMKYGBge3J9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTE9BRElORyBMT09QUwojIyMgSW1wb3J0aW5nIGRpZmZlcmVudGlhbCByZWd1bGF0b3J5IGxvb3BzICYgZXh0cmFjdCBhbmNob3IKY29tbW9uTG9vcERpciA8LSBoZXJlKCIuLi9kYXRhL2xvb3BfYW5hbHlzaXMiKQpsb29wLmFsbCA8LSBmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsICJsb29wU2NvcmVfY2hyb21vc2lnaHQudHN2IikpCmFuY2hvci5hbGwgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5hbGwpKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmFsbCwgYXRhYy5ncikKYW5jaG9yLmFsbCA8LSBwaW50ZXJzZWN0KGFuY2hvci5hbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCAiY2hyb21vc2lnaHRfc2NvcmVfYWxsX2RUQUd2c0RNU09fZGlmZkN1dG9mZjAuMl9VUC5iZWRwZSIpKQphbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXAsIGF0YWMuZ3IpCmFuY2hvci51cCA8LSBwaW50ZXJzZWN0KGFuY2hvci51cFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsICJjaHJvbW9zaWdodF9zY29yZV9hbGxfZFRBR3ZzRE1TT19kaWZmQ3V0b2ZmMC4yX05PLmJlZHBlIikpCmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ubywgYXRhYy5ncikKYW5jaG9yLm5vIDwtIHBpbnRlcnNlY3QoYW5jaG9yLm5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgpsb29wLnVwbm8gPC0gYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pCmFuY2hvci51cG5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXBubykpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXBubywgYXRhYy5ncikKYW5jaG9yLnVwbm8gPC0gcGludGVyc2VjdChhbmNob3IudXBub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKbG9vcE51bSA8LSBucm93KGxvb3AudXBubykKCiMgU2VsZWN0aW5nIHNhbWUgbnVtYmVyIG9mIGV4dHJlbWUgZG93biBsb29wcwpkaWZmQ3V0b2ZmIDwtIDAuMgpsb29wLmRvd24gPC0gbG9vcC5hbGwgJT4lIGRwbHlyOjptdXRhdGUoZGlmZiA9IHNjb3JlX2RUQUcgLSBzY29yZV9ETVNPKSAlPiUKICBkcGx5cjo6ZmlsdGVyKGRpZmYgPCAtZGlmZkN1dG9mZikgJT4lIGRwbHlyOjphcnJhbmdlKGRpZmYpICU+JSBzbGljZV9oZWFkKG4gPSBsb29wTnVtKQphbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGF0YWMuZ3IpCmFuY2hvci5kb3duIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmRvd25bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFJVTk5JTkcgTE9MQQojIFVQCmxvbGFEaXIgPC0gaGVyZShjb21tb25Mb29wRGlyLCAiTE9MQSIpCmRpci5jcmVhdGUobG9sYURpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpCgoKbmFtZSA8LSAiY2hyb21vc2lnaHRfc2NvcmVfYWxsX2RUQUd2c0RNU09fZGlmZkN1dG9mZjAuMiIKcmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLnVwLCBhbmNob3IuYWxsLCBsb2xhREIpCnRiIDwtIGFzX3RpYmJsZShyZXN1bHQpCmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBwYXN0ZTAoIkxPTEFfIiwgbmFtZSwgIlVQX0FUQUMudHN2IikpLCBzZXAgPSAiXHQiKQoKIyBOTwpyZXN1bHQgPC0gcnVuTE9MQShhbmNob3Iubm8sIGFuY2hvci5hbGwsIGxvbGFEQikKdGIgPC0gYXNfdGliYmxlKHJlc3VsdCkKZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIHBhc3RlMCgiTE9MQV8iLCBuYW1lLCAiTk9fQVRBQy50c3YiKSksIHNlcCA9ICJcdCIpCgojIFVQTk8KcmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLnVwbm8sIGFuY2hvci5hbGwsIGxvbGFEQikKdGIgPC0gYXNfdGliYmxlKHJlc3VsdCkKZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIHBhc3RlMCgiTE9MQV8iLCBuYW1lLCAiVVBOT19BVEFDLnRzdiIpKSwgc2VwID0gIlx0IikKCiMgRE9XTgpyZXN1bHQgPC0gcnVuTE9MQShhbmNob3IuZG93biwgYW5jaG9yLmFsbCwgbG9sYURCKQp0YiA8LSBhc190aWJibGUocmVzdWx0KQpmd3JpdGUodGIsIGhlcmUobG9sYURpciwgcGFzdGUwKCJMT0xBXyIsIG5hbWUsICJET1dOX0FUQUMudHN2IikpLCBzZXAgPSAiXHQiKQoKCiMjIyBWaXN1YWxpemluZyBwLXZhbHVlIGFuZCBPUgphbHBoYSA8LSAwLjA1CnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgcGFzdGUwKCJMT0xBXyIsIG5hbWUsICJVUF9BVEFDLnRzdiIpKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSwKICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksCiAgICAgICAgICAgICAgICBncm91cCA9ICJVUCIpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBwYXN0ZTAoIkxPTEFfIiwgbmFtZSwgIk5PX0FUQUMudHN2IikpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAogICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSwKICAgICAgICAgICAgICAgIGdyb3VwID0gIk5PIikgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQoKdGIudXBubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIHBhc3RlMCgiTE9MQV8iLCBuYW1lLCAiVVBOT19BVEFDLnRzdiIpKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSwKICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLAogICAgICAgICAgICAgICAgZ3JvdXAgPSAiVVAvTk8iKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCgpmd3JpdGUodGIudXBubyAlPiUgZHBseXI6OnNlbGVjdChjKDI0LCAxNiwgMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMjUsIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgOCwgOSwgMTAsIDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCAxMywgMTQpKSwgaGVyZShsb2xhRGlyLCBwYXN0ZTAoIkxPTEFfIiwgbmFtZSwgIlVQTk9fQVRBQ19wdWIudHN2IikpLCBzZXAgPSAiXHQiKQoKdGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIHBhc3RlMCgiTE9MQV8iLCBuYW1lLCAiRE9XTl9BVEFDLnRzdiIpKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSwKICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLAogICAgICAgICAgICAgICAgZ3JvdXAgPSAiRE9XTiIpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKZndyaXRlKHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QoYygyNCwgMTYsIDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDI1LCA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIDgsIDksIDEwLCAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgMTMsIDE0KSksIGhlcmUobG9sYURpciwgcGFzdGUwKCJMT0xBXyIsIG5hbWUsICJET1dOX0FUQUNfX3B1Yi50c3YiKSksIHNlcCA9ICJcdCIpCgoKdGVtcC51cG5vIDwtIHRiLnVwbm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApCnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKQoKdGVtcCA8LSBiaW5kX3Jvd3ModGVtcC51cG5vLCB0ZW1wLmRvd24pCgpvcmRlciA8LSBjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJVUC9OTyIpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCwKICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiRE9XTiIpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCkKCnRlbXAkdGFyZ2V0IDwtIGZhY3Rvcih0ZW1wJHRhcmdldCwgbGV2ZWxzID0gcmV2KG9yZGVyKSkKdGVtcCRncm91cCA8LSBmYWN0b3IodGVtcCRncm91cCwgbGV2ZWxzID0gYygiVVAvTk8iLCAiRE9XTiIpKQoKdGFyZ2V0TGlzdCA8LSBjKCJQT0xSMkEiLCAiQ1RSOSIsCiAgICAgICAgICAgICAgICAiQUZGNCIsICJFTEwyIiwKICAgICAgICAgICAgICAgICJNRUQxIiwgIk1FRDEyIiwKICAgICAgICAgICAgICAgICJUQlAiLCAiVEFGMSIsICJUQUYzIiwKICAgICAgICAgICAgICAgICJFU1JSQiIsICJLTEY0IiwgIk5BTk9HIiwgIlBPVTVGMSIsICJTT1gyIiwgIlNUQVQzIiwgIkUyRjEiLCAiWVkxIiwKICAgICAgICAgICAgICAgICJFUDMwMCIsICJEUFkzMCIsICJSQkJQNSIsICJLRE0yQiIsICJLREI0QiIsICJLRE00QyIsICJLRE02QiIsIAogICAgICAgICAgICAgICAgIkVaSDIiLCAiSkFSSUQyIiwgIlNVWjEyIiwgCiAgICAgICAgICAgICAgICAiUkFEMjEiLCAiU01DMUEiLCAiU01DMyIsICJDVENGIgopCgp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIodGFyZ2V0ICVpbiUgdGFyZ2V0TGlzdCkKdGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYodGFyZ2V0TGlzdCkpCgoKcVZhbHVlTG9nTWF4IDwtIDUwCnRlbXAyIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUocVZhbHVlTG9nID0gbWluKHFWYWx1ZUxvZywgcVZhbHVlTG9nTWF4KSkKCnAgPC0gZ2dwbG90KHRlbXAyLCBhZXMoeCA9IGdyb3VwLCB5ID0gdGFyZ2V0LCBmaWxsID0gb2Rkc1JhdGlvLCBzaXplID0gcVZhbHVlTG9nKSkgKwogIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZQogICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0gICAgICAjIExpbmUgd2lkdGggZm9yIHRoZSBib3JkZXIKICApICsgdGhlbWVfYncoKSArIAogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIndoaXRlIiwgaGlnaCA9ICIjQ0IzMzNBIiwKICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksCiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKAogICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhcgogICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXIKICAgICAgICAgICAgICAgICAgICAgICkKICApICsgCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlcwogICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApCgpmaWdEaXIgPC0gaGVyZSgiLi4vZmlndXJlL2xvb3BfYW5hbHlzaXMiKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJMT0xBXyIsIG5hbWUpCndpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoCmhlaWdodCA8LSBwYW5lbFNpemUoMS45KSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIFJlZyBsb29wcwpgYGB7cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBMT0FESU5HIExPT1BTCiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvcgpjb21tb25Mb29wRGlyIDwtIGhlcmUoIi4uL2RhdGEvbG9vcF9hbmFseXNpcyIpCmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgImxvb3BTY29yZV9jaHJvbW9zaWdodC50c3YiKSkKYW5jaG9yLmFsbCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmFsbCkpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKQphbmNob3IuYWxsIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKbG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsICJjaHJvbW9zaWdodF9zY29yZV9jb21wbGV4X3JlZ19kVEFHdnNETVNPX2RpZmZDdXRvZmYwLjJfVVAuYmVkcGUiKSkKYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwLCBhdGFjLmdyKQphbmNob3IudXAgPC0gcGludGVyc2VjdChhbmNob3IudXBbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb21tb25Mb29wRGlyLCAiY2hyb21vc2lnaHRfc2NvcmVfY29tcGxleF9yZWdfZFRBR3ZzRE1TT19kaWZmQ3V0b2ZmMC4yX05PLmJlZHBlIikpCmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ubywgYXRhYy5ncikKYW5jaG9yLm5vIDwtIHBpbnRlcnNlY3QoYW5jaG9yLm5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgpsb29wLnVwbm8gPC0gYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pCmFuY2hvci51cG5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXBubykpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXBubywgYXRhYy5ncikKYW5jaG9yLnVwbm8gPC0gcGludGVyc2VjdChhbmNob3IudXBub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgImNocm9tb3NpZ2h0X3Njb3JlX2NvbXBsZXhfcmVnX2RUQUd2c0RNU09fZGlmZkN1dG9mZjAuMl9ET1dOLmJlZHBlIikpCmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgYXRhYy5ncikKYW5jaG9yLmRvd24gPC0gcGludGVyc2VjdChhbmNob3IuZG93bltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBSVU5OSU5HIExPTEEKIyBVUApsb2xhRGlyIDwtIGhlcmUoY29tbW9uTG9vcERpciwgIkxPTEEiKQpkaXIuY3JlYXRlKGxvbGFEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKQoKCm5hbWUgPC0gImNocm9tb3NpZ2h0X3Njb3JlX2NvbXBsZXhfcmVnX2RUQUd2c0RNU09fZGlmZkN1dG9mZjAuMiIKcmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLnVwLCBhbmNob3IuYWxsLCBsb2xhREIpCnRiIDwtIGFzX3RpYmJsZShyZXN1bHQpCmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCBwYXN0ZTAoIkxPTEFfIiwgbmFtZSwgIlVQX0FUQUMudHN2IikpLCBzZXAgPSAiXHQiKQoKIyBOTwpyZXN1bHQgPC0gcnVuTE9MQShhbmNob3Iubm8sIGFuY2hvci5hbGwsIGxvbGFEQikKdGIgPC0gYXNfdGliYmxlKHJlc3VsdCkKZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIHBhc3RlMCgiTE9MQV8iLCBuYW1lLCAiTk9fQVRBQy50c3YiKSksIHNlcCA9ICJcdCIpCgojIFVQTk8KcmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLnVwbm8sIGFuY2hvci5hbGwsIGxvbGFEQikKdGIgPC0gYXNfdGliYmxlKHJlc3VsdCkKZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsIHBhc3RlMCgiTE9MQV8iLCBuYW1lLCAiVVBOT19BVEFDLnRzdiIpKSwgc2VwID0gIlx0IikKCiMgRE9XTgpyZXN1bHQgPC0gcnVuTE9MQShhbmNob3IuZG93biwgYW5jaG9yLmFsbCwgbG9sYURCKQp0YiA8LSBhc190aWJibGUocmVzdWx0KQpmd3JpdGUodGIsIGhlcmUobG9sYURpciwgcGFzdGUwKCJMT0xBXyIsIG5hbWUsICJET1dOX0FUQUMudHN2IikpLCBzZXAgPSAiXHQiKQoKCiMjIyBWaXN1YWxpemluZyBwLXZhbHVlIGFuZCBPUgphbHBoYSA8LSAwLjA1CnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgcGFzdGUwKCJMT0xBXyIsIG5hbWUsICJVUF9BVEFDLnRzdiIpKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSwKICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksCiAgICAgICAgICAgICAgICBncm91cCA9ICJVUCIpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCBwYXN0ZTAoIkxPTEFfIiwgbmFtZSwgIk5PX0FUQUMudHN2IikpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAogICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSwKICAgICAgICAgICAgICAgIGdyb3VwID0gIk5PIikgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQoKdGIudXBubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIHBhc3RlMCgiTE9MQV8iLCBuYW1lLCAiVVBOT19BVEFDLnRzdiIpKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSwKICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLAogICAgICAgICAgICAgICAgZ3JvdXAgPSAiVVAvTk8iKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCgpmd3JpdGUodGIudXBubyAlPiUgZHBseXI6OnNlbGVjdChjKDI0LCAxNiwgMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMjUsIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgOCwgOSwgMTAsIDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCAxMywgMTQpKSwgaGVyZShsb2xhRGlyLCBwYXN0ZTAoIkxPTEFfIiwgbmFtZSwgIlVQTk9fQVRBQ19wdWIudHN2IikpLCBzZXAgPSAiXHQiKQoKdGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsIHBhc3RlMCgiTE9MQV8iLCBuYW1lLCAiRE9XTl9BVEFDLnRzdiIpKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSwKICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLAogICAgICAgICAgICAgICAgZ3JvdXAgPSAiRE9XTiIpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKZndyaXRlKHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QoYygyNCwgMTYsIDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDI1LCA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIDgsIDksIDEwLCAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgMTMsIDE0KSksIGhlcmUobG9sYURpciwgcGFzdGUwKCJMT0xBXyIsIG5hbWUsICJET1dOX0FUQUNfX3B1Yi50c3YiKSksIHNlcCA9ICJcdCIpCgoKdGVtcC51cG5vIDwtIHRiLnVwbm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApCnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKQoKdGVtcCA8LSBiaW5kX3Jvd3ModGVtcC51cG5vLCB0ZW1wLmRvd24pCgpvcmRlciA8LSBjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJVUC9OTyIpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCwKICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiRE9XTiIpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCkKb3JkZXIgPC0gdW5pcXVlKG9yZGVyKQoKdGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYob3JkZXIpKQp0ZW1wJGdyb3VwIDwtIGZhY3Rvcih0ZW1wJGdyb3VwLCBsZXZlbHMgPSBjKCJVUC9OTyIsICJET1dOIikpCgp0YXJnZXRMaXN0IDwtIGMoIlBPTFIyQSIsICJDVFI5IiwgIkFSUjQiLCAiRUxMMiIsCiAgICAgICAgICAgICAgICAiTUVEMSIsICJNRUQxMiIsICJUQlAiLCAiVEFGMSIsICJUQUYyIiwKICAgICAgICAgICAgICAgICJFU1JSQiIsICJLTEY0IiwgIk5BTk9HIiwgIlBPVTVGMSIsICJTT1gyIiwgIk1ZQ04iLCAiR0FTVEE0IiwgIlNUQVQzIiwgIkUyRjEiLCAiWVkxIiwKICAgICAgICAgICAgICAgICJQMzAwIiwgIkRQWTMwIiwgIlJCQlA1IiwgIktETTJCIiwgIktETTRCIiwgIktETTZCIiwgIlRFVDEiLAogICAgICAgICAgICAgICAgIkNCWDciLCAiUklORzFCIiwgIlJORjIiLCAiRVpIMiIsICJTVVoxMiIsICJKQVJJRDIiLCAiTVRGMiIsICJQSEYxOSIpCgp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIodGFyZ2V0ICVpbiUgdGFyZ2V0TGlzdCkKdGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYodGFyZ2V0TGlzdCkpCgoKcVZhbHVlTG9nTWF4IDwtIDUwCnRlbXAyIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUocVZhbHVlTG9nID0gbWluKHFWYWx1ZUxvZywgcVZhbHVlTG9nTWF4KSkKCnAgPC0gZ2dwbG90KHRlbXAyLCBhZXMoeCA9IGdyb3VwLCB5ID0gdGFyZ2V0LCBmaWxsID0gb2Rkc1JhdGlvLCBzaXplID0gcVZhbHVlTG9nKSkgKwogIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZQogICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0gICAgICAjIExpbmUgd2lkdGggZm9yIHRoZSBib3JkZXIKICApICsgdGhlbWVfYncoKSArIAogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIndoaXRlIiwgaGlnaCA9ICIjQ0IzMzNBIiwKICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksCiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKAogICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhcgogICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXIKICAgICAgICAgICAgICAgICAgICAgICkKICApICsgCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlcwogICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApCgpmaWdEaXIgPC0gaGVyZSgiLi4vZmlndXJlL2xvb3BfYW5hbHlzaXMiKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJMT0xBXyIsIG5hbWUpCndpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoCmhlaWdodCA8LSBwYW5lbFNpemUoMS45KSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKIyMjIyBbRklHXSBEaXN0YW5jZSB2cyBPT0UgcGxvdCBwZXIgZ3JvdXAKYGBge3J9CiMgSW1wb3J0IGFubm90YXRpb24KY29tbW9uTG9vcERpciA8LSBoZXJlKCIuLi9kYXRhL2xvb3BfYW5hbHlzaXMiKQpmaWdEaXIgPC0gaGVyZSgiLi4vZmlndXJlL2xvb3BfYW5hbHlzaXMiKQoKcHNldWRvX29vZSA8LSAwLjAxCgpkYXRhIDwtIGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgImxvb3BTY29yZV9jaHJvbW9zaWdodC50c3YiKSkgJT4lCiAgZHBseXI6OmZpbHRlcighaXMubmEob29lX0RNU08pLCAhaXMubmEob29lX2RUQUcpKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgeF9vb2UgPSBpZl9lbHNlKG9vZV9ETVNPID09IDAsIHBzZXVkb19vb2UsIG9vZV9ETVNPKSwKICAgIHlfb29lID0gaWZfZWxzZShvb2VfZFRBRyA9PSAwLCBwc2V1ZG9fb29lLCBvb2VfZFRBRyksCiAgICBmYyAgICA9IGxvZzIoeV9vb2UgLyB4X29vZSksCiAgICBkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSwKICAgIGRpc3RfYmluID0gY3V0KAogICAgICBkaXN0YW5jZSwKICAgICAgYnJlYWtzID0gYyhzZXEoMCwgMWU2LCBieSA9IDFlNSksIEluZiksCiAgICAgIGxhYmVscyA9IGMoCiAgICAgICAgcGFzdGUwKHNlcSgwLCA5ZTUsIDFlNSkgLyAxZTMsICItIiwgc2VxKDFlNSwgMWU2LCAxZTUpIC8gMWUzLCAia2IiKSwKICAgICAgICAiPjFNYiIKICAgICAgKSwKICAgICAgcmlnaHQgPSBGQUxTRQogICAgKSkgJT4lCiAgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZGlzdF9iaW4sIGZjLCBBbm5vKQoKZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKAogIGdyb3VwID0gY2FzZV93aGVuKAogICAgQW5ubyAlaW4lIGMoIlAtUCIsICJQLUUiLCAiRS1FIikgfiAicmVnX3JlZyIsCiAgICBBbm5vICVpbiUgYygiUC1TUCIsICJQLVNFIiwgIkUtU1AiLCAiRS1TRSIpIH4gInJlZ19zdHJSZWciLAogICAgQW5ubyAlaW4lIGMoIlAtUyIsICJFLVMiKSB+ICJyZWdfc3RyIiwKICAgIEFubm8gJWluJSBjKCJTUC1TUCIsICJTUC1TRSIsICJTRS1TRSIpIH4gInN0clJlZ19zdHJSZWciLAogICAgQW5ubyAlaW4lIGMoIlNQLVMiLCAiU0UtUyIpIH4gInN0clJlZ19zdHIiLAogICAgQW5ubyAlaW4lIGMoIlAtWCIsICJFLVgiKSB+ICJyZWdfb3RoZXIiLAogICAgQW5ubyAlaW4lIGMoIlNQLVgiLCAiU0UtWCIpIH4gInN0clJlZ19vdGhlciIsCiAgICBBbm5vICVpbiUgYygiUy1TIiwgIlMtWCIpIH4gInN0ciIsCiAgICBBbm5vICVpbiUgYygiWC1YIikgfiAib3RoZXIiLAogICAgCiAgICBUUlVFIH4gIlhYWCIpCiAgKSAlPiUKICBkcGx5cjo6bXV0YXRlKGdyb3VwMiA9IGNhc2Vfd2hlbigKICAgIGdyb3VwICVpbiUgYygicmVnX3JlZyIpIH4gInJlZ19yZWciLAogICAgZ3JvdXAgJWluJSBjKCJyZWdfc3RyUmVnIiwgInJlZ19zdHIiLCAicmVnX290aGVyIikgfiAicmVnX25vblJlZyIsCiAgICBncm91cCAlaW4lIGMoInN0clJlZ19zdHJSZWciLCAic3RyUmVnX3N0ciIsICJzdHJSZWdfb3RoZXIiKSB+ICJzdHJSZWdfbm9uUmVnIiwKICAgIGdyb3VwICVpbiUgYygic3RyIikgfiAic3RyIiwKICAgIFRSVUUgfiAiWFhYWFgiCiAgKSkKCgoKCgpkYXRhJGdyb3VwMiA8LSBmYWN0b3IoZGF0YSRncm91cDIsIGxldmVscyA9IGMoInJlZ19yZWciLCAicmVnX25vblJlZyIsICJzdHJSZWdfbm9uUmVnIiwgInN0ciIpKQojIGdncGxvdChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwMiAhPSAiWFhYWFgiKSwgYWVzKHggPSBkaXN0X2JpbiwgeSA9IGZjLCBmaWxsID0gZ3JvdXAyKSkgKwojICAgZ2VvbV9ib3hwbG90KG91dGxpZXJzID0gRkFMU0UpICsKIyAgICMgb3B0aW9uYWw6IG92ZXJsYXkgdGhlIGluZGl2aWR1YWwgcG9pbnRzCiMgICBmYWNldF93cmFwKH4gZ3JvdXAyLCBzY2FsZXMgPSAiZnJlZV94IiwgbmNvbCA9IDQpICsKIyAgIHNjYWxlX3hfZGlzY3JldGUoZHJvcCA9IEZBTFNFKSArICAgICAgICAgICAgICAgICMga2VlcCBlbXB0eSBiaW5zIHZpc2libGUKIyAgIGxhYnMoCiMgICAgIHggPSAiRGlzdGFuY2UgYmluIiwKIyAgICAgeSA9ICLOlCBsb2cyKG9icy9leHApIiwKIyAgICAgdGl0bGUgPSAiU3RydWN0dXJhbC9SZWd1bGF0b3J5IGxvb3AgcGVydHVyYmF0aW9uIGJ5IGxvb3DigJBzaXplIGJpbiIKIyAgICkgKwojICAgdGhlbWVfY2xhc3NpYygpICsKIyAgIHRoZW1lKAojICAgICBheGlzLnRleHQueCAgPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKIyAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gImJsYWNrIiksCiMgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikKIyAgICkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiMgICAgICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0zLCAyKSkKcCA8LSBnZ3Bsb3QoCiAgZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cDIgJWluJSBjKCJyZWdfcmVnIiwgInN0ciIpKSwKICBhZXMoeCA9IGRpc3RfYmluLCB5ID0gZmMsIGZpbGwgPSBncm91cDIpCikgKwogICMgcmVtb3ZlIG91dGxpZXJzIHdpdGggb3V0bGllci5zaGFwZSA9IE5BICh0aGVyZSBpcyBubyAib3V0bGllcnMiIGFyZ3VtZW50KQogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsKICAjIGtlZXAgZW1wdHkgYmlucwogIHNjYWxlX3hfZGlzY3JldGUoZHJvcCA9IEZBTFNFKSArCiAgIyBhZGQgcmVk4oCQZmlsbGVkIG1lYW4gcG9pbnRzLCBkb2RnZWQgYnkgZ3JvdXAKICBzdGF0X3N1bW1hcnkoCiAgICBhZXMoZ3JvdXAgPSBncm91cDIpLAogICAgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLAogICAgc2hhcGUgPSAyMSwKICAgIHNpemUgPSAwLjUsCiAgICBmaWxsID0gInJlZCIsCiAgICBjb2xvciA9ICJyZWQiLAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjgpCiAgKSArCiAgbGFicygKICAgIHggPSAiRGlzdGFuY2UgYmluIiwKICAgIHkgPSAizpQgbG9nMihvYnMvZXhwKSIsCiAgKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ICAgICAgICA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgc3RyaXAuYmFja2dyb3VuZCAgID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIpLAogICAgc3RyaXAudGV4dCAgICAgICAgID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpCiAgKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMywgMikpICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUgICAgICAgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUpLAogICAgYXhpcy50ZXh0ICAgICAgICA9IGVsZW1lbnRfdGV4dChzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSksCiAgICBheGlzLmxpbmUgICAgICAgID0gZWxlbWVudF9saW5lKHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiksCiAgICBheGlzLnRpY2tzICAgICAgID0gZWxlbWVudF9saW5lKHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50aXRsZSAgICAgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRleHQgICAgICA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApICsKICAjIGNsb3NlIHRoZSBndWlkZXMoLi4uKSBjYWxsIHByb3Blcmx5IGFuZCBtYXAgdGhlIGNvcnJlY3QgYWVzdGhldGljCiAgZ3VpZGVzKAogICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgKICAgICAga2V5d2lkdGggID0gMC41LAogICAgICBrZXloZWlnaHQgPSAwLjUKICAgICkKICApCgpuYW1lIDwtICJjaHJvbW9zaWdodF9zY29yZV9hbGxfZFRBR3ZzRE1TT19kaWZmQ3V0b2ZmMC4yIgoKCmZpbGVOYW1lIDwtIHBhc3RlMCgiZGlzdF92c19zY29yZV9iaW5uZWRfcmVnX3N0cl8iLCBuYW1lKQoKd2lkdGggPC0gcGFuZWxTaXplKDIuNSkqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjc1KSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIAogICAgcmVzID0gNjAwLCB1bml0cyA9ICJpbiIsIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksIAogICAgICAgIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKYGBgCgoKIyMgRVhQTE9SQVRPUlkKIyMjIENocm9tb3NpZ2h0IHNjb3JlcwojIyMjIFNjYXR0ZXJwbG90cwpgYGB7cn0KCgoKCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgc2NvcmVfRE1TTywgc2NvcmVfZFRBRywgYygiUy1TIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9zY29yZV9zdHJfZFRBR3ZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fc2NvcmVfc3RyX2RUQUd2RE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBzY29yZV9ETVNPLCBzY29yZV9kVEFHLCBjKCJTLVMiLCAiUy1YIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9zY29yZV9zdHIyX2RUQUd2RE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiY2hyb21vX3Njb3JlX3N0cjJfZFRBR3ZETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIHNjb3JlX0RNU08sIHNjb3JlX2RUQUcsIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9zY29yZV9yZWdfZFRBR3ZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fc2NvcmVfcmVnX2RUQUd2RE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBzY29yZV9ETVNPLCBzY29yZV9kVEFHLCBjKCJQLVMiLCAiRS1TIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9zY29yZV9yZWdTdHJfZFRBR3ZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fc2NvcmVfcmVnU3RyX2RUQUd2RE1TTyIsIGZpZ0RpcikKCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgc2NvcmVfRE1TTywgc2NvcmVfQTQ4NSwgYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLUUiLCAiRS1TIiwgIkUtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUy1TIiwgIlMtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC1YIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9zY29yZV9hbGxfQTQ4NXZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fc2NvcmVfYWxsX0E0ODV2RE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBzY29yZV9ETVNPLCBzY29yZV9BNDg1LCBjKCJTLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X3Njb3JlX3N0cl9BNDg1dkRNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19zY29yZV9zdHJfQTQ4NXZETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIHNjb3JlX0RNU08sIHNjb3JlX0E0ODUsIGMoIlMtUyIsICJTLVgiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X3Njb3JlX3N0cjJfQTQ4NXZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fc2NvcmVfc3RyMl9BNDg1dkRNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgc2NvcmVfRE1TTywgc2NvcmVfQTQ4NSwgYygiUC1QIiwgIlAtRSIsICJFLUUiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X3Njb3JlX3JlZ19BNDg1dkRNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19zY29yZV9yZWdfQTQ4NXZETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIHNjb3JlX0RNU08sIHNjb3JlX0E0ODUsIGMoIlAtUyIsICJFLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X3Njb3JlX3JlZ1N0cl9BNDg1dkRNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19zY29yZV9yZWdTdHJfQTQ4NXZETVNPIiwgZmlnRGlyKQoKCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgc2NvcmVfRXBpRE1TTywgc2NvcmVfRXBpZFRBRywgYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLUUiLCAiRS1TIiwgIkUtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUy1TIiwgIlMtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC1YIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9zY29yZV9hbGxfRXBpZFRBR3ZFcGlETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fc2NvcmVfYWxsX0VwaWRUQUd2RXBpRE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBzY29yZV9FcGlETVNPLCBzY29yZV9FcGlkVEFHLCBjKCJTLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X3Njb3JlX3N0cl9FcGlkVEFHdkVwaURNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19zY29yZV9zdHJfRXBpZFRBR3ZFcGlETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIHNjb3JlX0VwaURNU08sIHNjb3JlX0VwaWRUQUcsIGMoIlMtUyIsICJTLVgiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X3Njb3JlX3N0cjJfRXBpZFRBR3ZFcGlETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fc2NvcmVfc3RyMl9FcGlkVEFHdkVwaURNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgc2NvcmVfRXBpRE1TTywgc2NvcmVfRXBpZFRBRywgYygiUC1QIiwgIlAtRSIsICJFLUUiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X3Njb3JlX3JlZ19FcGlkVEFHdkVwaURNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19zY29yZV9yZWdfRXBpZFRBR3ZFcGlETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIHNjb3JlX0VwaURNU08sIHNjb3JlX0VwaWRUQUcsIGMoIlAtUyIsICJFLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X3Njb3JlX3JlZ1N0cl9FcGlkVEFHdkVwaURNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19zY29yZV9yZWdTdHJfRXBpZFRBR3ZFcGlETVNPIiwgZmlnRGlyKQoKCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgc2NvcmVfVVQsIHNjb3JlX0FJRCwgYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLUUiLCAiRS1TIiwgIkUtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUy1TIiwgIlMtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC1YIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9zY29yZV9hbGxfQUlEdlVUIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fc2NvcmVfYWxsX0FJRHZVVCIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBzY29yZV9VVCwgc2NvcmVfQUlELCBjKCJTLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X3Njb3JlX3N0cl9BSUR2VVQiLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19zY29yZV9zdHJfQUlEdlVUIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIHNjb3JlX1VULCBzY29yZV9BSUQsIGMoIlMtUyIsICJTLVgiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X3Njb3JlX3N0cjJfQUlEdlVUIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fc2NvcmVfc3RyMl9BSUR2VVQiLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgc2NvcmVfVVQsIHNjb3JlX0FJRCwgYygiUC1QIiwgIlAtRSIsICJFLUUiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X3Njb3JlX3JlZ19BSUR2VVQiLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19zY29yZV9yZWdfQUlEdlVUIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIHNjb3JlX1VULCBzY29yZV9BSUQsIGMoIlAtUyIsICJFLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X3Njb3JlX3JlZ1N0cl9BSUR2VVQiLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19zY29yZV9yZWdTdHJfQUlEdlVUIiwgZmlnRGlyKQoKCmBgYAojIyMjIFJOQS1zZXEgbG9vcHNjb3JlIHNjYXR0ZXJwbG90CmBgYHtyfQpsb2FkTG9vcEFubm9EYXRhIDwtIGZ1bmN0aW9uKGZpbGVOYW1lKXsKICBkYXRhIDwtIGFzX3RpYmJsZShmcmVhZChmaWxlTmFtZSkpICU+JQogICAgZHBseXI6Om11dGF0ZShnZW5lID0gc3Ryc3BsaXQoZ2VuZSwgJ1xcfCcpKQogIHJldHVybihkYXRhKQp9CmBgYAoKYGBge3J9CmFscGhhIDwtIDAuMDUKZmNDdXRvZmYgPC0gMC41Cgpjb21tb25Mb29wRGlyIDwtIGhlcmUoIi4uL2RhdGEvbG9vcF9hbmFseXNpcyIpCmRpZmZEaXIgPC0gaGVyZSgiLi4vZGF0YS9STkFfZGlmZiIpCm5hbWUgPC0gImNocm9tb3NpZ2h0IgpnZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbW1vbkxvb3BEaXIsIHBhc3RlMCgibG9vcFNjb3JlXyIsIG5hbWUsICJfcC1uX3NpbXBsZV9lbnNlbWJsTGlzdC50c3YiKSkpICU+JQogIGRwbHlyOjptdXRhdGUoZGlmZiA9IHNjb3JlX2RUQUcgLSBzY29yZV9ETVNPKQoKZGlmZi5STkEgPC0gZnJlYWQoaGVyZShkaWZmRGlyLCAiZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSkKZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8PSAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWQKZ2VuZUxpc3QudXAuUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWQKCgptYXhMb2cyRkMgPC0gMgoKdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZiwgZ2VuZSkgJT4lIAogIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZiksIC5ncm91cHMgPSAnZHJvcCcpCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsICIyRE9XTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCAiMVVQIiwgIjBOTyIpKSwKICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLAogICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSAKICBkcGx5cjo6YXJyYW5nZShmbGFnKQoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gIjBOTyIsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUocGFzdGUwKG5hbWUsICJfc2NvcmVfc2ltcGxlQW5ubyIpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiME5PIiA9ICJncmV5IiwgIjFVUCIgPSAicmVkIiwgIjJET1dOIiA9ICJibHVlIikpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmcKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAyLCAiRkFMU0UiID0gMTkpKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJSTkF2c0xvb3BfIiwgbmFtZSwgIl9zY29yZV9zaW1wbGVBbm5vIikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gNwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCmBgYHtyfQphbHBoYSA8LSAwLjA1CmZjQ3V0b2ZmIDwtIDAuNQoKY29tbW9uTG9vcERpciA8LSBoZXJlKCIuLi9kYXRhL2xvb3BfYW5hbHlzaXMiKQpkaWZmRGlyIDwtIGhlcmUoIi4uL2RhdGEvUk5BX2RpZmYiKQpuYW1lIDwtICJjaHJvbW9zaWdodCIKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoImxvb3BTY29yZV8iLCBuYW1lLCAiX3Atbl9jb21wbGV4X2Vuc2VtYmxMaXN0LnRzdiIpKSkgJT4lCiAgZHBseXI6Om11dGF0ZShkaWZmID0gc2NvcmVfZFRBRyAtIHNjb3JlX0RNU08pCgpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKGRpZmZEaXIsICJkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKQpnZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDw9IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZApnZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZAoKCm1heExvZzJGQyA8LSAyCgp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmLCBnZW5lKSAlPiUgCiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmKSwgLmdyb3VwcyA9ICdkcm9wJykKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgIjJET1dOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsICIxVVAiLCAiME5PIikpLAogICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksCiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIAogIGRwbHlyOjphcnJhbmdlKGZsYWcpCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSAiME5PIiwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICsKICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZShwYXN0ZTAobmFtZSwgIl9zY29yZV9jb21wbGV4QW5ubyIpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiME5PIiA9ICJncmV5IiwgIjFVUCIgPSAicmVkIiwgIjJET1dOIiA9ICJibHVlIikpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmcKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAyLCAiRkFMU0UiID0gMTkpKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJSTkF2c0xvb3BfIiwgbmFtZSwgIl9zY29yZV9jb21wbGV4QW5ubyIpCmhlaWdodCA8LSA0CndpZHRoIDwtIDcKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgojIyMgT2JzL2V4cCBzY29yZQojIyMjIFNjYXR0ZXJwbG90IC0gQ2hyb21vc2lnaHQKYGBge3J9CnBsb3RfbG9vcF9zY29yZXMgPC0gZnVuY3Rpb24oZGYsIGNvbF94LCBjb2xfeSwgYW5ub0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdGl0bGUsIGZpZ0RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC41LCBkZW5zaXR5X24gPSAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1pbiA9IC0wLjUsIHhtYXggPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltaW4gPSAtMC41LCB5bWF4ID0gMSkgewogIGNvbF94X3EgPC0gZW5xdW8oY29sX3gpCiAgY29sX3lfcSA8LSBlbnF1byhjb2xfeSkKICAKICAjIFNjYXR0ZXJwbG90CiAgZGYyIDwtIGRmICU+JQogICAgZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYW5ub0xpc3QpICU+JQogICAgc2VsZWN0KGlkLCB4ID0gISFjb2xfeF9xLCB5ID0gISFjb2xfeV9xKSAlPiUKICAgIG11dGF0ZSgKICAgICAgbWlucG9zID0gbWluKGMoeCwgeSlbYyh4LCB5KSA+IDBdLCBuYS5ybSA9IFRSVUUpLAogICAgICBlcHMgICAgPSBtaW5wb3MgKiAwLjEsCiAgICAgIGx4ICAgICA9IGxvZzIoeCArIGVwcyksCiAgICAgIGx5ICAgICA9IGxvZzIoeSArIGVwcyksCiAgICAgIGRlbnNpdHkgPSBnZXRfZGVuc2l0eShseCwgbHksIG4gPSBkZW5zaXR5X24pCiAgICApICU+JQogICAgYXJyYW5nZShkZW5zaXR5KQogIAogIHAxIDwtIGdncGxvdChkZjIsIGFlcyh4ID0gbHgsIHkgPSBseSwgY29sb3IgPSBkZW5zaXR5KSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICAgIG5hbWUgICA9IHBhc3RlMCgibG9nMigiLCBxdW9fbmFtZShjb2xfeF9xKSwgIikiKQogICAgKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICAgIG5hbWUgICA9IHBhc3RlMCgibG9nMigiLCBxdW9fbmFtZShjb2xfeV9xKSwgIikiKQogICAgKSArCiAgICBjb29yZF9maXhlZCgpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NTAiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3VyID0gImdyZXkiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3VyID0gImdyZXkiKSArCiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC0oMioqZGlmZkN1dG9mZiksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gKDIqKmRpZmZDdXRvZmYpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKwogICAgbGFicyh4ID0gcXVvX25hbWUoY29sX3hfcSksCiAgICAgICAgIHkgPSBxdW9fbmFtZShjb2xfeV9xKSkgKwogICAgZ2d0aXRsZSh0aXRsZSkKICAKICBmaWxlTmFtZSA8LSBwYXN0ZTAoInNjYXR0ZXJwbG90XyIsIG5hbWUpCiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgCiAgICAgICAgICB3aWR0aCA9IDMuNSwgaGVpZ2h0ID0gMykKICBwcmludChwMSkKICBkZXYub2ZmKCkKICAKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIAogICAgICB3aWR0aCA9IDMuNSwgaGVpZ2h0ID0gMywgdW5pdHMgPSAiaW4iLCByZXMgPSA2MDApCiAgcHJpbnQocDEpCiAgZGV2Lm9mZigpCiAgCiAgIyBQaWUgY2hhcnQKICBkZjMgPC0gZGYgJT4lCiAgICBmaWx0ZXIoQW5ub19zaW1wbGUgJWluJSBhbm5vTGlzdCkgJT4lCiAgICBzZWxlY3QoaWQsIHggPSAhIWNvbF94X3EsIHkgPSAhIWNvbF95X3EpICU+JQogICAgbXV0YXRlKAogICAgICBtaW5wb3MgPSBtaW4oYyh4LCB5KVtjKHgsIHkpID4gMF0sIG5hLnJtID0gVFJVRSksCiAgICAgIGVwcyAgICA9IG1pbnBvcyAqIDAuMSwKICAgICAgbHggICAgID0gbG9nMih4ICsgZXBzKSwKICAgICAgbHkgICAgID0gbG9nMih5ICsgZXBzKQogICAgKSAlPiUKICAgIG11dGF0ZShkaWZmID0gbHkgLSBseCkgJT4lCiAgICBtdXRhdGUodXBkb3duID0gaWZlbHNlKGRpZmYgPiBkaWZmQ3V0b2ZmLCAiVVAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZiA8IC1kaWZmQ3V0b2ZmLCAiRE9XTiIsICJOTyIpKSkKICBkZjMkdXBkb3duIDwtIGZhY3RvcihkZjMkdXBkb3duLCBjKCJVUCIsICJOTyIsICJET1dOIikpCiAgCiAgcGllX2RmIDwtIGRmMyAlPiUKICAgIGRwbHlyOjpjb3VudCh1cGRvd24pICU+JQogICAgbXV0YXRlKHBjdCAgID0gbiAvIHN1bShuKSAqIDEwMCwKICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCh1cGRvd24sICJcbiIsIG4sICJcbigiLCByb3VuZChwY3QsMSksICIlKSIpKQoKICBwMiA8LSBnZ3Bsb3QocGllX2RmLCBhZXMoeCA9ICIiLCB5ID0gbiwgZmlsbCA9IHVwZG93bikpICsKICAgIGdlb21fY29sKGNvbG9yID0gIndoaXRlIikgKwogICAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBsYWJlbCksCiAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksCiAgICAgICAgICAgICAgc2l6ZSAgICAgPSBmb250U2l6ZU0vMikgKwogICAgdGhlbWVfdm9pZCgpICsgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoc3Ryb25nX3JlZCwgbm9fZ3JleSwgc3Ryb25nX2JsdWUpKQogIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoInBpZWNoYXJ0XyIsIG5hbWUpKQogIHdpZHRoIDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaAogIGhlaWdodCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2gKICBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KQogIHByaW50KHAyKQogIGRldi5vZmYoKQp9CgoKY29tbW9uTG9vcERpciA8LSBoZXJlKCIuLi9kYXRhL2xvb3BfYW5hbHlzaXMiKQpmaWdEaXIgPC0gaGVyZSgiLi4vZmlndXJlL2xvb3BfYW5hbHlzaXMiKQpkaXIuY3JlYXRlKGZpZ0Rpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpCgpkYXRhIDwtIGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgImxvb3BTY29yZV9jaHJvbW9zaWdodC50c3YiKSkKCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKCJQLVAiLCAiUC1FIiwgIlAtUyIsICJQLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUtRSIsICJFLVMiLCAiRS1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTLVMiLCAiUy1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYLVgiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X29vZV9hbGxfZFRBR3ZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fb29lX2FsbF9kVEFHdkRNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKCJTLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X29vZV9zdHJfZFRBR3ZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fb29lX3N0cl9kVEFHdkRNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKCJTLVMiLCAiUy1YIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9vb2Vfc3RyMl9kVEFHdkRNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19vb2Vfc3RyMl9kVEFHdkRNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiY2hyb21vc2lnaHRfb29lX3JlZ19kVEFHdkRNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19vb2VfcmVnX2RUQUd2RE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoIlAtUyIsICJFLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X29vZV9yZWdTdHJfZFRBR3ZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fb29lX3JlZ1N0cl9kVEFHdkRNU08iLCBmaWdEaXIpCgpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLUUiLCAiRS1TIiwgIkUtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUy1TIiwgIlMtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC1YIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9vb2VfYWxsX0E0ODV2RE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiY2hyb21vX29vZV9hbGxfQTQ4NXZETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYygiUy1TIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9vb2Vfc3RyX0E0ODV2RE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiY2hyb21vX29vZV9zdHJfQTQ4NXZETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYygiUy1TIiwgIlMtWCIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiY2hyb21vc2lnaHRfb29lX3N0cjJfQTQ4NXZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fb29lX3N0cjJfQTQ4NXZETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYygiUC1QIiwgIlAtRSIsICJFLUUiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X29vZV9yZWdfQTQ4NXZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fb29lX3JlZ19BNDg1dkRNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKCJQLVMiLCAiRS1TIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9vb2VfcmVnU3RyX0E0ODV2RE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiY2hyb21vX29vZV9yZWdTdHJfQTQ4NXZETVNPIiwgZmlnRGlyKQoKCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKCJQLVAiLCAiUC1FIiwgIlAtUyIsICJQLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUtRSIsICJFLVMiLCAiRS1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTLVMiLCAiUy1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYLVgiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X29vZV9hbGxfRXBpZFRBR3ZFcGlETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fb29lX2FsbF9FcGlkVEFHdkVwaURNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKCJTLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X29vZV9zdHJfRXBpZFRBR3ZFcGlETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fb29lX3N0cl9FcGlkVEFHdkVwaURNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKCJTLVMiLCAiUy1YIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiY2hyb21vc2lnaHRfb29lX3JlZ19FcGlkVEFHdkVwaURNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19vb2VfcmVnX0VwaWRUQUd2RXBpRE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoIlAtUyIsICJFLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X29vZV9yZWdTdHJfRXBpZFRBR3ZFcGlETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJjaHJvbW9fb29lX3JlZ1N0cl9FcGlkVEFHdkVwaURNU08iLCBmaWdEaXIpCgoKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS1FIiwgIkUtUyIsICJFLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlMtUyIsICJTLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlgtWCIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiY2hyb21vc2lnaHRfb29lX2FsbF9BSUR2VVQiLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19vb2VfYWxsX0FJRHZVVCIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoIlMtUyIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiY2hyb21vc2lnaHRfb29lX3N0cl9BSUR2VVQiLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19vb2Vfc3RyX0FJRHZVVCIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoIlMtUyIsICJTLVgiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImNocm9tb3NpZ2h0X29vZV9zdHIyX0FJRHZVVCIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiY2hyb21vX29vZV9zdHIyX0FJRHZVVCIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJjaHJvbW9zaWdodF9vb2VfcmVnX0FJRHZVVCIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiY2hyb21vX29vZV9yZWdfQUlEdlVUIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYygiUC1TIiwgIkUtUyIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiY2hyb21vc2lnaHRfb29lX3JlZ1N0cl9BSUR2VVQiLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImNocm9tb19vb2VfcmVnU3RyX0FJRHZVVCIsIGZpZ0RpcikKCgpgYGAKCiMjIyMgUk5BLXNlcSBsb29wc2NvcmUgc2NhdHRlcnBsb3QKYGBge3J9CmxvYWRMb29wQW5ub0RhdGEgPC0gZnVuY3Rpb24oZmlsZU5hbWUpewogIGRhdGEgPC0gYXNfdGliYmxlKGZyZWFkKGZpbGVOYW1lKSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGdlbmUgPSBzdHJzcGxpdChnZW5lLCAnXFx8JykpCiAgcmV0dXJuKGRhdGEpCn0KYGBgCgpgYGB7cn0KYWxwaGEgPC0gMC4wNQpmY0N1dG9mZiA8LSAwLjUKZGlmZkN1dG9mZiA8LSAwLjUKY29tbW9uTG9vcERpciA8LSBoZXJlKCIuLi9kYXRhL2xvb3BfYW5hbHlzaXMiKQpkaWZmRGlyIDwtIGhlcmUoIi4uL2RhdGEvUk5BX2RpZmYiKQpuYW1lIDwtICJjaHJvbW9zaWdodCIKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoImxvb3BTY29yZV8iLCBuYW1lLCAiX3Atbl9zaW1wbGVfZW5zZW1ibExpc3QudHN2IikpKSAlPiUKICByb3d3aXNlKCkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvcmsgb25lIHJvdyBhdCBhIHRpbWUKICBtdXRhdGUoCiAgICBtaW5wb3MgPSBtaW4oYyhvb2VfZFRBRywgb29lX0RNU08pW2Mob29lX2RUQUcsIG9vZV9ETVNPKSA+IDBdLCBuYS5ybSA9IFRSVUUpLAogICAgZXBzICAgID0gaWZlbHNlKGlzLmZpbml0ZShtaW5wb3MpLCBtaW5wb3MgKiAwLjEsIDAuMDEpLCAgICAgICMgZmFsbGJhY2sgaWYgYm90aCBhcmUgMAogICAgZGlmZiAgID0gbG9nMigob29lX2RUQUcgKyBlcHMpIC8gKG9vZV9ETVNPICsgZXBzKSkKICApICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHNlbGVjdCgtbWlucG9zLCAtZXBzKSAKICAjZHBseXI6Om11dGF0ZShkaWZmID0gbG9nMihvb2VfZFRBRykgLSBsb2cyKG9vZV9ETVNPKSkKCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUoZGlmZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPD0gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkCmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkCgoKbWF4TG9nMkZDIDwtIDIKCnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmYsIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmYpLCAuZ3JvdXBzID0gJ2Ryb3AnKQoKdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibF9nZW5lX2lkIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCAiMkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgIjFVUCIsICIwTk8iKSksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9ICIwTk8iLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSwKICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgKwogIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKHBhc3RlMChuYW1lLCAiX29vZV9zaW1wbGVBbm5vIikpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIwTk8iID0gImdyZXkiLCAiMVVQIiA9ICJyZWQiLCAiMkRPV04iID0gImJsdWUiKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9IDIsICJGQUxTRSIgPSAxOSkpCgpmaWxlTmFtZSA8LSBwYXN0ZTAoIlJOQXZzTG9vcF8iLCBuYW1lLCAiX29vZV9zaW1wbGVBbm5vIikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gNwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCmBgYHtyfQphbHBoYSA8LSAwLjA1CmZjQ3V0b2ZmIDwtIDAuNQpkaWZmQ3V0b2ZmIDwtIDAuNQpjb21tb25Mb29wRGlyIDwtIGhlcmUoIi4uL2RhdGEvbG9vcF9hbmFseXNpcyIpCmRpZmZEaXIgPC0gaGVyZSgiLi4vZGF0YS9STkFfZGlmZiIpCm5hbWUgPC0gImNocm9tb3NpZ2h0IgpnZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbW1vbkxvb3BEaXIsIHBhc3RlMCgibG9vcFNjb3JlXyIsIG5hbWUsICJfcC1uX2NvbXBsZXhfZW5zZW1ibExpc3QudHN2IikpKSAlPiUKICByb3d3aXNlKCkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvcmsgb25lIHJvdyBhdCBhIHRpbWUKICBtdXRhdGUoCiAgICBtaW5wb3MgPSBtaW4oYyhvb2VfZFRBRywgb29lX0RNU08pW2Mob29lX2RUQUcsIG9vZV9ETVNPKSA+IDBdLCBuYS5ybSA9IFRSVUUpLAogICAgZXBzICAgID0gaWZlbHNlKGlzLmZpbml0ZShtaW5wb3MpLCBtaW5wb3MgKiAwLjEsIDAuMDEpLCAgICAgICMgZmFsbGJhY2sgaWYgYm90aCBhcmUgMAogICAgZGlmZiAgID0gbG9nMigob29lX2RUQUcgKyBlcHMpIC8gKG9vZV9ETVNPICsgZXBzKSkKICApICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHNlbGVjdCgtbWlucG9zLCAtZXBzKSAKICAjZHBseXI6Om11dGF0ZShkaWZmID0gbG9nMihvb2VfZFRBRykgLSBsb2cyKG9vZV9ETVNPKSkKCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUoZGlmZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPD0gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkCmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkCgoKbWF4TG9nMkZDIDwtIDIKCnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmYsIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmYpLCAuZ3JvdXBzID0gJ2Ryb3AnKQoKdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibF9nZW5lX2lkIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCAiMkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgIjFVUCIsICIwTk8iKSksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9ICIwTk8iLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSwKICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgKwogIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKHBhc3RlMChuYW1lLCAiX29vZV9jb21wbGV4QW5ubyIpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiME5PIiA9ICJncmV5IiwgIjFVUCIgPSAicmVkIiwgIjJET1dOIiA9ICJibHVlIikpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmcKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAyLCAiRkFMU0UiID0gMTkpKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJSTkF2c0xvb3BfIiwgbmFtZSwgIl9vb2VfY29tcGxleEFubm8iKQpoZWlnaHQgPC0gNAp3aWR0aCA8LSA3CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKIyMjIyBTY2F0dGVycGxvdCAtIEhpQ0RDKwpgYGB7cn0KY29tbW9uTG9vcERpciA8LSBoZXJlKCIuLi9kYXRhL2xvb3BfYW5hbHlzaXMiKQpmaWdEaXIgPC0gaGVyZSgiLi4vZmlndXJlL2xvb3BfYW5hbHlzaXMiKQpkaXIuY3JlYXRlKGZpZ0Rpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpCgpkYXRhIDwtIGZyZWFkKGhlcmUoY29tbW9uTG9vcERpciwgImxvb3BTY29yZV9oaWNkY3AudHN2IikpCgpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLUUiLCAiRS1TIiwgIkUtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUy1TIiwgIlMtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC1YIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJoaWNkY3Bfb29lX2FsbF9kVEFHdkRNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImhpY2RjcF9vb2VfYWxsX2RUQUd2RE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoIlMtUyIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiaGljZGNwX29vZV9zdHJfZFRBR3ZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJoaWNkY3Bfb29lX3N0cl9kVEFHdkRNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKCJTLVMiLCAiUy1YIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJoaWNkY3Bfb29lX3N0cjJfZFRBR3ZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJoaWNkY3Bfb29lX3N0cjJfZFRBR3ZETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYygiUC1QIiwgIlAtRSIsICJFLUUiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImhpY2RjcF9vb2VfcmVnX2RUQUd2RE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiaGljZGNwX29vZV9yZWdfZFRBR3ZETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYygiUC1TIiwgIkUtUyIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiaGljZGNwX29vZV9yZWdTdHJfZFRBR3ZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJoaWNkY3Bfb29lX3JlZ1N0cl9kVEFHdkRNU08iLCBmaWdEaXIpCgpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLUUiLCAiRS1TIiwgIkUtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUy1TIiwgIlMtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC1YIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJoaWNkY3Bfb29lX2FsbF9BNDg1dkRNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImhpY2RjcF9vb2VfYWxsX0E0ODV2RE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoIlMtUyIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiaGljZGNwX29vZV9zdHJfQTQ4NXZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJoaWNkY3Bfb29lX3N0cl9BNDg1dkRNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKCJTLVMiLCAiUy1YIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJoaWNkY3Bfb29lX3N0cjJfQTQ4NXZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJoaWNkY3Bfb29lX3N0cjJfQTQ4NXZETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYygiUC1QIiwgIlAtRSIsICJFLUUiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImhpY2RjcF9vb2VfcmVnX0E0ODV2RE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiaGljZGNwX29vZV9yZWdfQTQ4NXZETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYygiUC1TIiwgIkUtUyIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiaGljZGNwX29vZV9yZWdTdHJfQTQ4NXZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJoaWNkY3Bfb29lX3JlZ1N0cl9BNDg1dkRNU08iLCBmaWdEaXIpCgoKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS1FIiwgIkUtUyIsICJFLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlMtUyIsICJTLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlgtWCIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiaGljZGNwX29vZV9hbGxfRXBpZFRBR3ZFcGlETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJoaWNkY3Bfb29lX2FsbF9FcGlkVEFHdkVwaURNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKCJTLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImhpY2RjcF9vb2Vfc3RyX0VwaWRUQUd2RXBpRE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiaGljZGNwX29vZV9zdHJfRXBpZFRBR3ZFcGlETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9FcGlETVNPLCBvb2VfRXBpZFRBRywgYygiUy1TIiwgIlMtWCIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiaGljZGNwX29vZV9zdHIyX0VwaWRUQUd2RXBpRE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiaGljZGNwX29vZV9zdHIyX0VwaWRUQUd2RXBpRE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJoaWNkY3Bfb29lX3JlZ19FcGlkVEFHdkVwaURNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImhpY2RjcF9vb2VfcmVnX0VwaWRUQUd2RXBpRE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoIlAtUyIsICJFLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImhpY2RjcF9vb2VfcmVnU3RyX0VwaWRUQUd2RXBpRE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiaGljZGNwX29vZV9yZWdTdHJfRXBpZFRBR3ZFcGlETVNPIiwgZmlnRGlyKQoKCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKCJQLVAiLCAiUC1FIiwgIlAtUyIsICJQLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUtRSIsICJFLVMiLCAiRS1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTLVMiLCAiUy1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYLVgiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImhpY2RjcF9vb2VfYWxsX0FJRHZVVCIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiaGljZGNwX29vZV9hbGxfQUlEdlVUIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYygiUy1TIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJoaWNkY3Bfb29lX3N0cl9BSUR2VVQiLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImhpY2RjcF9vb2Vfc3RyX0FJRHZVVCIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoIlMtUyIsICJTLVgiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gImhpY2RjcF9vb2Vfc3RyMl9BSUR2VVQiLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImhpY2RjcF9vb2Vfc3RyMl9BSUR2VVQiLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiaGljZGNwX29vZV9yZWdfQUlEdlVUIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJoaWNkY3Bfb29lX3JlZ19BSUR2VVQiLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKCJQLVMiLCAiRS1TIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJoaWNkY3Bfb29lX3JlZ1N0cl9BSUR2VVQiLAogICAgICAgICAgICAgICAgIHRpdGxlID0gImhpY2RjcF9vb2VfcmVnU3RyX0FJRHZVVCIsIGZpZ0RpcikKCmBgYAojIyMjIFJOQS1zZXEgbG9vcHNjb3JlIHNjYXR0ZXJwbG90CmBgYHtyfQphbHBoYSA8LSAwLjA1CmZjQ3V0b2ZmIDwtIDAuNQpkaWZmQ3V0b2ZmIDwtIDAuNQpjb21tb25Mb29wRGlyIDwtIGhlcmUoIi4uL2RhdGEvbG9vcF9hbmFseXNpcyIpCmRpZmZEaXIgPC0gaGVyZSgiLi4vZGF0YS9STkFfZGlmZiIpCm5hbWUgPC0gImhpY2RjcCIKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoImxvb3BTY29yZV8iLCBuYW1lLCAiX3Atbl9zaW1wbGVfZW5zZW1ibExpc3QudHN2IikpKSAlPiUKICByb3d3aXNlKCkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvcmsgb25lIHJvdyBhdCBhIHRpbWUKICBtdXRhdGUoCiAgICBtaW5wb3MgPSBtaW4oYyhvb2VfZFRBRywgb29lX0RNU08pW2Mob29lX2RUQUcsIG9vZV9ETVNPKSA+IDBdLCBuYS5ybSA9IFRSVUUpLAogICAgZXBzICAgID0gaWZlbHNlKGlzLmZpbml0ZShtaW5wb3MpLCBtaW5wb3MgKiAwLjEsIDAuMDEpLCAgICAgICMgZmFsbGJhY2sgaWYgYm90aCBhcmUgMAogICAgZGlmZiAgID0gbG9nMigob29lX2RUQUcgKyBlcHMpIC8gKG9vZV9ETVNPICsgZXBzKSkKICApICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHNlbGVjdCgtbWlucG9zLCAtZXBzKSAKICAjZHBseXI6Om11dGF0ZShkaWZmID0gbG9nMihvb2VfZFRBRykgLSBsb2cyKG9vZV9ETVNPKSkKCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUoZGlmZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPD0gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkCmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkCgoKbWF4TG9nMkZDIDwtIDIKCnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmYsIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmYpLCAuZ3JvdXBzID0gJ2Ryb3AnKQoKdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibF9nZW5lX2lkIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCAiMkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgIjFVUCIsICIwTk8iKSksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9ICIwTk8iLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSwKICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgKwogIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKHBhc3RlMChuYW1lLCAiX29vZV9zaW1wbGVBbm5vIikpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIwTk8iID0gImdyZXkiLCAiMVVQIiA9ICJyZWQiLCAiMkRPV04iID0gImJsdWUiKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9IDIsICJGQUxTRSIgPSAxOSkpCgpmaWxlTmFtZSA8LSBwYXN0ZTAoIlJOQXZzTG9vcF8iLCBuYW1lLCAiX29vZV9zaW1wbGVBbm5vIikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gNwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCmBgYHtyfQphbHBoYSA8LSAwLjA1CmZjQ3V0b2ZmIDwtIDAuNQpkaWZmQ3V0b2ZmIDwtIDAuNQpjb21tb25Mb29wRGlyIDwtIGhlcmUoIi4uL2RhdGEvbG9vcF9hbmFseXNpcyIpCmRpZmZEaXIgPC0gaGVyZSgiLi4vZGF0YS9STkFfZGlmZiIpCm5hbWUgPC0gImhpY2RjcCIKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb21tb25Mb29wRGlyLCBwYXN0ZTAoImxvb3BTY29yZV8iLCBuYW1lLCAiX3Atbl9jb21wbGV4X2Vuc2VtYmxMaXN0LnRzdiIpKSkgJT4lCiAgcm93d2lzZSgpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3b3JrIG9uZSByb3cgYXQgYSB0aW1lCiAgbXV0YXRlKAogICAgbWlucG9zID0gbWluKGMob29lX2RUQUcsIG9vZV9ETVNPKVtjKG9vZV9kVEFHLCBvb2VfRE1TTykgPiAwXSwgbmEucm0gPSBUUlVFKSwKICAgIGVwcyAgICA9IGlmZWxzZShpcy5maW5pdGUobWlucG9zKSwgbWlucG9zICogMC4xLCAwLjAxKSwgICAgICAjIGZhbGxiYWNrIGlmIGJvdGggYXJlIDAKICAgIGRpZmYgICA9IGxvZzIoKG9vZV9kVEFHICsgZXBzKSAvIChvb2VfRE1TTyArIGVwcykpCiAgKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBzZWxlY3QoLW1pbnBvcywgLWVwcykgCiAgI2RwbHlyOjptdXRhdGUoZGlmZiA9IGxvZzIob29lX2RUQUcpIC0gbG9nMihvb2VfRE1TTykpCgpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKGRpZmZEaXIsICJkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKQpnZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDw9IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZApnZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDAsIHBhZGogPCBhbHBoYSkpJGVuc2VtYmxfZ2VuZV9pZAoKCm1heExvZzJGQyA8LSAyCgp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmLCBnZW5lKSAlPiUgCiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmKSwgLmdyb3VwcyA9ICdkcm9wJykKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgIjJET1dOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsICIxVVAiLCAiME5PIikpLAogICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksCiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIAogIGRwbHlyOjphcnJhbmdlKGZsYWcpCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSAiME5PIiwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICsKICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZShwYXN0ZTAobmFtZSwgIl9vb2VfY29tcGxleEFubm8iKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIjBOTyIgPSAiZ3JleSIsICIxVVAiID0gInJlZCIsICIyRE9XTiIgPSAiYmx1ZSIpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIlRSVUUiID0gMiwgIkZBTFNFIiA9IDE5KSkKCmZpbGVOYW1lIDwtIHBhc3RlMCgiUk5BdnNMb29wXyIsIG5hbWUsICJfb29lX2NvbXBsZXhBbm5vIikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gNwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMgU2NhdHRlcnBsb3QgLSBIYW5zZW4KYGBge3J9CnBsb3RfbG9vcF9zY29yZXMgPC0gZnVuY3Rpb24oZGYsIGNvbF94LCBjb2xfeSwgYW5ub0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdGl0bGUsIGZpZ0RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC41LCBkZW5zaXR5X24gPSAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1pbiA9IC0wLjUsIHhtYXggPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltaW4gPSAtMC41LCB5bWF4ID0gMSkgewogIGNvbF94X3EgPC0gZW5xdW8oY29sX3gpCiAgY29sX3lfcSA8LSBlbnF1byhjb2xfeSkKICAKICAjIFNjYXR0ZXJwbG90CiAgZGYyIDwtIGRmICU+JQogICAgZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYW5ub0xpc3QpICU+JQogICAgc2VsZWN0KGlkLCB4ID0gISFjb2xfeF9xLCB5ID0gISFjb2xfeV9xKSAlPiUKICAgIG11dGF0ZSgKICAgICAgbWlucG9zID0gbWluKGMoeCwgeSlbYyh4LCB5KSA+IDBdLCBuYS5ybSA9IFRSVUUpLAogICAgICBlcHMgICAgPSBtaW5wb3MgKiAwLjEsCiAgICAgIGx4ICAgICA9IGxvZzIoeCArIGVwcyksCiAgICAgIGx5ICAgICA9IGxvZzIoeSArIGVwcykKICAgICkKICAKICBwMSA8LSBnZ3Bsb3QoZGYyLCBhZXMoeCA9IGx4LCB5ID0gbHkpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICAgIHNjYWxlX3hfY29udGludW91cygKICAgICAgbmFtZSAgID0gcGFzdGUwKCJsb2cyKCIsIHF1b19uYW1lKGNvbF94X3EpLCAiKSIpCiAgICApICsKICAgIHNjYWxlX3lfY29udGludW91cygKICAgICAgbmFtZSAgID0gcGFzdGUwKCJsb2cyKCIsIHF1b19uYW1lKGNvbF95X3EpLCAiKSIpCiAgICApICsKICAgIGNvb3JkX2ZpeGVkKCkgKwogICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLAogICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvdXIgPSAiZ3JleSIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvdXIgPSAiZ3JleSIpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLSgyKipkaWZmQ3V0b2ZmKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAoMioqZGlmZkN1dG9mZiksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArCiAgICBsYWJzKHggPSBxdW9fbmFtZShjb2xfeF9xKSwKICAgICAgICAgeSA9IHF1b19uYW1lKGNvbF95X3EpKSArCiAgICBnZ3RpdGxlKHRpdGxlKQogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgic2NhdHRlcnBsb3RfIiwgbmFtZSkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAKICAgICAgICAgIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzKQogIHByaW50KHAxKQogIGRldi5vZmYoKQogIAogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgCiAgICAgIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzLCB1bml0cyA9ICJpbiIsIHJlcyA9IDYwMCkKICBwcmludChwMSkKICBkZXYub2ZmKCkKICAKICAjIFBpZSBjaGFydAogIGRmMyA8LSBkZiAlPiUKICAgIGZpbHRlcihBbm5vX3NpbXBsZSAlaW4lIGFubm9MaXN0KSAlPiUKICAgIHNlbGVjdChpZCwgeCA9ICEhY29sX3hfcSwgeSA9ICEhY29sX3lfcSkgJT4lCiAgICBtdXRhdGUoCiAgICAgIG1pbnBvcyA9IG1pbihjKHgsIHkpW2MoeCwgeSkgPiAwXSwgbmEucm0gPSBUUlVFKSwKICAgICAgZXBzICAgID0gbWlucG9zICogMC4xLAogICAgICBseCAgICAgPSBsb2cyKHggKyBlcHMpLAogICAgICBseSAgICAgPSBsb2cyKHkgKyBlcHMpCiAgICApICU+JQogICAgbXV0YXRlKGRpZmYgPSBseSAtIGx4KSAlPiUKICAgIG11dGF0ZSh1cGRvd24gPSBpZmVsc2UoZGlmZiA+IGRpZmZDdXRvZmYsICJVUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmIDwgLWRpZmZDdXRvZmYsICJET1dOIiwgIk5PIikpKQogIGRmMyR1cGRvd24gPC0gZmFjdG9yKGRmMyR1cGRvd24sIGMoIlVQIiwgIk5PIiwgIkRPV04iKSkKICAKICBwaWVfZGYgPC0gZGYzICU+JQogICAgZHBseXI6OmNvdW50KHVwZG93bikgJT4lCiAgICBtdXRhdGUocGN0ICAgPSBuIC8gc3VtKG4pICogMTAwLAogICAgICAgICAgIGxhYmVsID0gcGFzdGUwKHVwZG93biwgIlxuIiwgbiwgIlxuKCIsIHJvdW5kKHBjdCwxKSwgIiUpIikpCgogIHAyIDwtIGdncGxvdChwaWVfZGYsIGFlcyh4ID0gIiIsIHkgPSBuLCBmaWxsID0gdXBkb3duKSkgKwogICAgZ2VvbV9jb2woY29sb3IgPSAid2hpdGUiKSArCiAgICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGxhYmVsKSwKICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwKICAgICAgICAgICAgICBzaXplICAgICA9IGZvbnRTaXplTS8yKSArCiAgICB0aGVtZV92b2lkKCkgKyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhzdHJvbmdfcmVkLCBub19ncmV5LCBzdHJvbmdfYmx1ZSkpCiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMCgicGllY2hhcnRfIiwgbmFtZSkpCiAgd2lkdGggPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoCiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaAogIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpCiAgcHJpbnQocDIpCiAgZGV2Lm9mZigpCn0KCmNvbW1vbkxvb3BEaXIgPC0gaGVyZSgiLi4vZGF0YS9sb29wX2FuYWx5c2lzIikKZmlnRGlyIDwtIGhlcmUoIi4uL2ZpZ3VyZS9sb29wX2FuYWx5c2lzIikKZGlyLmNyZWF0ZShmaWdEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKQoKZGF0YSA8LSBmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsICJsb29wU2NvcmVfSGFuc2VuLnRzdiIpKQpkYXRhIDwtIGRhdGEgJT4lIAogIGZpbHRlcigKICAgICFpZl9hbGwoc3RhcnRzX3dpdGgoIm9vZSIpLCB+IC54ID09IDApICAgIyBkcm9wIHJvd3Mgd2hlcmUgKmV2ZXJ5KiBvb2UqIHZhbHVlIGlzIDAKKQoKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS1FIiwgIkUtUyIsICJFLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlMtUyIsICJTLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlgtWCIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiSGFuc2VuX29vZV9hbGxfZFRBR3ZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJIYW5zZW5fb29lX2FsbF9kVEFHdkRNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9kVEFHLCBjKCJTLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gIkhhbnNlbl9vb2Vfc3RyX2RUQUd2RE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiSGFuc2VuX29vZV9zdHJfZFRBR3ZETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfZFRBRywgYygiUy1TIiwgIlMtWCIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiSGFuc2VuX29vZV9zdHIyX2RUQUd2RE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiSGFuc2VuX29vZV9zdHIyX2RUQUd2RE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJIYW5zZW5fb29lX3JlZ19kVEFHdkRNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gIkhhbnNlbl9vb2VfcmVnX2RUQUd2RE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX2RUQUcsIGMoIlAtUyIsICJFLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gIkhhbnNlbl9vb2VfcmVnU3RyX2RUQUd2RE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiSGFuc2VuX29vZV9yZWdTdHJfZFRBR3ZETVNPIiwgZmlnRGlyKQoKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS1FIiwgIkUtUyIsICJFLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlMtUyIsICJTLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlgtWCIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiSGFuc2VuX29vZV9hbGxfQTQ4NXZETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJIYW5zZW5fb29lX2FsbF9BNDg1dkRNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0RNU08sIG9vZV9BNDg1LCBjKCJTLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gIkhhbnNlbl9vb2Vfc3RyX0E0ODV2RE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiSGFuc2VuX29vZV9zdHJfQTQ4NXZETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9ETVNPLCBvb2VfQTQ4NSwgYygiUy1TIiwgIlMtWCIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiSGFuc2VuX29vZV9zdHIyX0E0ODV2RE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiSGFuc2VuX29vZV9zdHIyX0E0ODV2RE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJIYW5zZW5fb29lX3JlZ19BNDg1dkRNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gIkhhbnNlbl9vb2VfcmVnX0E0ODV2RE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRE1TTywgb29lX0E0ODUsIGMoIlAtUyIsICJFLVMiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gIkhhbnNlbl9vb2VfcmVnU3RyX0E0ODV2RE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiSGFuc2VuX29vZV9yZWdTdHJfQTQ4NXZETVNPIiwgZmlnRGlyKQoKCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKCJQLVAiLCAiUC1FIiwgIlAtUyIsICJQLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUtRSIsICJFLVMiLCAiRS1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTLVMiLCAiUy1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYLVgiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gIkhhbnNlbl9vb2VfYWxsX0VwaWRUQUd2RXBpRE1TTyIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiSGFuc2VuX29vZV9hbGxfRXBpZFRBR3ZFcGlETVNPIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9FcGlETVNPLCBvb2VfRXBpZFRBRywgYygiUy1TIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJIYW5zZW5fb29lX3N0cl9FcGlkVEFHdkVwaURNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gIkhhbnNlbl9vb2Vfc3RyX0VwaWRUQUd2RXBpRE1TTyIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfRXBpRE1TTywgb29lX0VwaWRUQUcsIGMoIlMtUyIsICJTLVgiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gIkhhbnNlbl9vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gIkhhbnNlbl9vb2Vfc3RyMl9FcGlkVEFHdkVwaURNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiSGFuc2VuX29vZV9yZWdfRXBpZFRBR3ZFcGlETVNPIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJIYW5zZW5fb29lX3JlZ19FcGlkVEFHdkVwaURNU08iLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX0VwaURNU08sIG9vZV9FcGlkVEFHLCBjKCJQLVMiLCAiRS1TIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJIYW5zZW5fb29lX3JlZ1N0cl9FcGlkVEFHdkVwaURNU08iLAogICAgICAgICAgICAgICAgIHRpdGxlID0gIkhhbnNlbl9vb2VfcmVnU3RyX0VwaWRUQUd2RXBpRE1TTyIsIGZpZ0RpcikKCgpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLUUiLCAiRS1TIiwgIkUtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUy1TIiwgIlMtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC1YIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJIYW5zZW5fb29lX2FsbF9BSUR2VVQiLAogICAgICAgICAgICAgICAgIHRpdGxlID0gIkhhbnNlbl9vb2VfYWxsX0FJRHZVVCIsIGZpZ0RpcikKcGxvdF9sb29wX3Njb3JlcyhkYXRhLCBvb2VfVVQsIG9vZV9BSUQsIGMoIlMtUyIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiSGFuc2VuX29vZV9zdHJfQUlEdlVUIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJIYW5zZW5fb29lX3N0cl9BSUR2VVQiLCBmaWdEaXIpCnBsb3RfbG9vcF9zY29yZXMoZGF0YSwgb29lX1VULCBvb2VfQUlELCBjKCJTLVMiLCAiUy1YIiksCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJIYW5zZW5fb29lX3N0cjJfQUlEdlVUIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJIYW5zZW5fb29lX3N0cjJfQUlEdlVUIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYygiUC1QIiwgIlAtRSIsICJFLUUiKSwKICAgICAgICAgICAgICAgICBuYW1lID0gIkhhbnNlbl9vb2VfcmVnX0FJRHZVVCIsCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiSGFuc2VuX29vZV9yZWdfQUlEdlVUIiwgZmlnRGlyKQpwbG90X2xvb3Bfc2NvcmVzKGRhdGEsIG9vZV9VVCwgb29lX0FJRCwgYygiUC1TIiwgIkUtUyIpLAogICAgICAgICAgICAgICAgIG5hbWUgPSAiSGFuc2VuX29vZV9yZWdTdHJfQUlEdlVUIiwKICAgICAgICAgICAgICAgICB0aXRsZSA9ICJIYW5zZW5fb29lX3JlZ1N0cl9BSUR2VVQiLCBmaWdEaXIpCgpgYGAKIyMjIyBSTkEtc2VxIGxvb3BzY29yZSBzY2F0dGVycGxvdApgYGB7cn0KYWxwaGEgPC0gMC4wNQpmY0N1dG9mZiA8LSAwLjUKZGlmZkN1dG9mZiA8LSAwLjUKY29tbW9uTG9vcERpciA8LSBoZXJlKCIuLi9kYXRhL2xvb3BfYW5hbHlzaXMiKQpkaWZmRGlyIDwtIGhlcmUoIi4uL2RhdGEvUk5BX2RpZmYiKQpuYW1lIDwtICJIYW5zZW4iCmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29tbW9uTG9vcERpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgbmFtZSwgIl9wLW5fc2ltcGxlX2Vuc2VtYmxMaXN0LnRzdiIpKSkgJT4lCiAgZmlsdGVyKAogICAgIWlmX2FsbChzdGFydHNfd2l0aCgib29lIiksIH4gLnggPT0gMCkgICAjIGRyb3Agcm93cyB3aGVyZSAqZXZlcnkqIG9vZSogdmFsdWUgaXMgMAogICkgJT4lCiAgcm93d2lzZSgpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3b3JrIG9uZSByb3cgYXQgYSB0aW1lCiAgbXV0YXRlKAogICAgbWlucG9zID0gbWluKGMob29lX2RUQUcsIG9vZV9ETVNPKVtjKG9vZV9kVEFHLCBvb2VfRE1TTykgPiAwXSwgbmEucm0gPSBUUlVFKSwKICAgIGVwcyAgICA9IGlmZWxzZShpcy5maW5pdGUobWlucG9zKSwgbWlucG9zICogMC4xLCAwLjAxKSwgICAgICAjIGZhbGxiYWNrIGlmIGJvdGggYXJlIDAKICAgIGRpZmYgICA9IGxvZzIoKG9vZV9kVEFHICsgZXBzKSAvIChvb2VfRE1TTyArIGVwcykpCiAgKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBzZWxlY3QoLW1pbnBvcywgLWVwcykgCiAgI2RwbHlyOjptdXRhdGUoZGlmZiA9IGxvZzIob29lX2RUQUcpIC0gbG9nMihvb2VfRE1TTykpCgoKZGlmZi5STkEgPC0gZnJlYWQoaGVyZShkaWZmRGlyLCAiZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSkKZ2VuZUxpc3QuZG93bi5STkEgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8PSAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWQKZ2VuZUxpc3QudXAuUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPiAwLCBwYWRqIDwgYWxwaGEpKSRlbnNlbWJsX2dlbmVfaWQKCgptYXhMb2cyRkMgPC0gMgoKdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZiwgZ2VuZSkgJT4lIAogIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZiksIC5ncm91cHMgPSAnZHJvcCcpCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsICIyRE9XTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCAiMVVQIiwgIjBOTyIpKSwKICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLAogICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSAKICBkcGx5cjo6YXJyYW5nZShmbGFnKQoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gIjBOTyIsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUocGFzdGUwKG5hbWUsICJfb29lX3NpbXBsZUFubm8iKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIjBOTyIgPSAiZ3JleSIsICIxVVAiID0gInJlZCIsICIyRE9XTiIgPSAiYmx1ZSIpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIlRSVUUiID0gMiwgIkZBTFNFIiA9IDE5KSkKCmZpbGVOYW1lIDwtIHBhc3RlMCgiUk5BdnNMb29wXyIsIG5hbWUsICJfb29lX3NpbXBsZUFubm8iKQpoZWlnaHQgPC0gNAp3aWR0aCA8LSA3CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKYGBge3J9CmFscGhhIDwtIDAuMDUKZmNDdXRvZmYgPC0gMC41CmRpZmZDdXRvZmYgPC0gMC41CmNvbW1vbkxvb3BEaXIgPC0gaGVyZSgiLi4vZGF0YS9sb29wX2FuYWx5c2lzIikKZGlmZkRpciA8LSBoZXJlKCIuLi9kYXRhL1JOQV9kaWZmIikKbmFtZSA8LSAiSGFuc2VuIgpnZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbW1vbkxvb3BEaXIsIHBhc3RlMCgibG9vcFNjb3JlXyIsIG5hbWUsICJfcC1uX2NvbXBsZXhfZW5zZW1ibExpc3QudHN2IikpKSAlPiUKICBmaWx0ZXIoCiAgICAhaWZfYWxsKHN0YXJ0c193aXRoKCJvb2UiKSwgfiAueCA9PSAwKSAgICMgZHJvcCByb3dzIHdoZXJlICpldmVyeSogb29lKiB2YWx1ZSBpcyAwCiAgKSAlPiUKICByb3d3aXNlKCkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvcmsgb25lIHJvdyBhdCBhIHRpbWUKICBtdXRhdGUoCiAgICBtaW5wb3MgPSBtaW4oYyhvb2VfZFRBRywgb29lX0RNU08pW2Mob29lX2RUQUcsIG9vZV9ETVNPKSA+IDBdLCBuYS5ybSA9IFRSVUUpLAogICAgZXBzICAgID0gaWZlbHNlKGlzLmZpbml0ZShtaW5wb3MpLCBtaW5wb3MgKiAwLjEsIDAuMDEpLCAgICAgICMgZmFsbGJhY2sgaWYgYm90aCBhcmUgMAogICAgZGlmZiAgID0gbG9nMigob29lX2RUQUcgKyBlcHMpIC8gKG9vZV9ETVNPICsgZXBzKSkKICApICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHNlbGVjdCgtbWlucG9zLCAtZXBzKSAKICAjZHBseXI6Om11dGF0ZShkaWZmID0gbG9nMihvb2VfZFRBRykgLSBsb2cyKG9vZV9ETVNPKSkKCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUoZGlmZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPD0gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkCmdlbmVMaXN0LnVwLlJOQSA8LSAoZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCwgcGFkaiA8IGFscGhhKSkkZW5zZW1ibF9nZW5lX2lkCgoKbWF4TG9nMkZDIDwtIDIKCnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmYsIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmYpLCAuZ3JvdXBzID0gJ2Ryb3AnKQoKdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibF9nZW5lX2lkIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCAiMkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgIjFVUCIsICIwTk8iKSksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9ICIwTk8iLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSwKICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgKwogIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKHBhc3RlMChuYW1lLCAiX29vZV9jb21wbGV4QW5ubyIpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiME5PIiA9ICJncmV5IiwgIjFVUCIgPSAicmVkIiwgIjJET1dOIiA9ICJibHVlIikpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmcKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAyLCAiRkFMU0UiID0gMTkpKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJSTkF2c0xvb3BfIiwgbmFtZSwgIl9vb2VfY29tcGxleEFubm8iKQpoZWlnaHQgPC0gNAp3aWR0aCA8LSA3CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEFSQ0hJVkUKCmBgYHtyfQpjb21tb25Mb29wRGlyIDwtIGhlcmUoIi4uL2RhdGEvbG9vcF9hbmFseXNpcyIpCgpkaWZmQ3V0b2ZmIDwtIDAuMgoKZGF0YSA8LSBmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsICJsb29wU2NvcmVfY2hyb21vc2lnaHQudHN2IikpCgpzY29yZS50YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYygiUy1TIikpICU+JQogIGRwbHlyOjpzZWxlY3QoaWQsIHNjb3JlX0RNU08sIHNjb3JlX2RUQUcpCgoKIyMjIFAxLiBVVCB2cyBBSUQKc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRzY29yZV9ETVNPLCBzY29yZS50YiRzY29yZV9kVEFHLCBuID0gMjAwKQpzY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKcDEgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IHNjb3JlX0RNU08sIHkgPSBzY29yZV9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArCiAgY29vcmRfZml4ZWQoKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoIkNvbnNlbnN1cyBsb29wIHNjb3JlIikpCgoKIyBEZWZpbmUgdGhlIGRhdGEKY2F0ZWdvcmllcyA8LSBjKCJVcCIsICJObyIsICJEb3duIikKdmFsdWVzIDwtIGMoMjI4LCA5MDg0LCA1NzE2OSkKCiMgQ2FsY3VsYXRlIHBlcmNlbnRhZ2VzCnBlcmNlbnRhZ2VzIDwtIHJvdW5kKCh2YWx1ZXMgLyBzdW0odmFsdWVzKSkgKiAxMDAsIDIpCgojIENvbWJpbmUgdmFsdWVzIGFuZCBwZXJjZW50YWdlcyBmb3IgbGFiZWxzCmxhYmVscyA8LSBwYXN0ZShjYXRlZ29yaWVzLCAiXG4iLCB2YWx1ZXMsICJcbigiLCBwZXJjZW50YWdlcywgIiUpIiwgc2VwID0gIiIpCgpmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgInBpZWNoYXJ0X3VuaW9uTG9vcHMiKQp3aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaApzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID1oZWlnaHQpCnBpZSh2YWx1ZXMsIAogICAgbGFiZWxzID0gbGFiZWxzLCAKICAgIGNvbCA9IGMoc3Ryb25nX3JlZCwgbm9fZ3JleSwgc3Ryb25nX2JsdWUpLCAKICAgIGNleCA9IGZvbnRTaXplTS8xMikKZGV2Lm9mZigpCgpgYGAKCmBgYHtyfQpjb21tb25Mb29wRGlyIDwtIGhlcmUoIi4uL2RhdGEvbG9vcF9hbmFseXNpcyIpCgpkaWZmQ3V0b2ZmIDwtIDAuMgoKZGF0YSA8LSBmcmVhZChoZXJlKGNvbW1vbkxvb3BEaXIsICJsb29wU2NvcmVfY2hyb21vc2lnaHQudHN2IikpCgpzY29yZS50YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm9fc2ltcGxlICVpbiUgYygiUC1QIiwgIlAtRSIsICJFLUUiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChpZCwgb29lX0RNU08sIG9vZV9kVEFHKSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShvb2VfRE1TTyksICFpcy5uYShvb2VfZFRBRykpCgoKIyMjIFAxLiBVVCB2cyBBSUQKc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRvb2VfRE1TTywgc2NvcmUudGIkb29lX2RUQUcsIG4gPSAyMDApCnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpwMSA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gb29lX0RNU08sIHkgPSBvb2VfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKwogIGdlb21fcG9pbnQoKSArIAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgY29vcmRfZml4ZWQoKSArCiAgICB4bGltKC0wLjUsIDUpICsgeWxpbSgtMC41LCA1KSArCgogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKCJDb25zZW5zdXMgbG9vcCBzY29yZSIpKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShwdXJycikKCiMgeW91ciBkZW5zaXR5IGZuCmdldF9kZW5zaXR5IDwtIGZ1bmN0aW9uKHgsIHksIG4gPSAxMDApIHsKICAjIOKApiB3aGF0ZXZlciB5b3UgYWxyZWFkeSBoYXZlIOKApgp9CgojIDEpIG1ha2UgYSBnZW5lcmFsIHBsb3R0aW5nIGZ1bmN0aW9uCnBsb3RfY29tcGFyZSA8LSBmdW5jdGlvbihkZiwgeF9jb2wsIHlfY29sLCBkaWZmQ3V0b2ZmID0gMC4xLCBsaW0gPSBjKC0wLjUsIDEpKSB7CiAgZGYyIDwtIGRmICU+JQogICAgc2VsZWN0KGFsbF9vZihjKHhfY29sLCB5X2NvbCkpKSAlPiUKICAgIHJlbmFtZSh4ID0gISFzeW0oeF9jb2wpLCB5ID0gISFzeW0oeV9jb2wpKSAlPiUKICAgIG11dGF0ZShkZW5zaXR5ID0gZ2V0X2RlbnNpdHkoeCwgeSwgbiA9IDEwMCkpICU+JQogICAgYXJyYW5nZShkZW5zaXR5KQoKICBnZ3Bsb3QoZGYyLCBhZXMoeCA9IHgsIHkgPSB5LCBjb2xvciA9IGRlbnNpdHkpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICAgIHhsaW0obGltKSArIHlsaW0obGltKSArCiAgICBjb29yZF9maXhlZCgpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZ3JleTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbG9yID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9ICBkaWZmQ3V0b2ZmLCBjb2xvciA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgdGhlbWVfY2xhc3NpYygpICsKICAgIGdndGl0bGUocGFzdGUoeF9jb2wsICJ2cyIsIHlfY29sKSkKfQoKIyAyKSBkZWZpbmUgdGhlIHBhaXJzIHlvdSBjYXJlIGFib3V0CnBhaXJzIDwtIGxpc3QoCiAgRE1TT192c19kVEFHID0gYygic2NvcmVfRE1TTyIsICJzY29yZV9kVEFHIiksCiAgVVRfdnNfQUlEICAgICA9IGMoInNjb3JlX1VUIiwgICAic2NvcmVfQUlEIikKICAjIOKApiBhZGQgbW9yZSDigKYKKQoKIyAzKSBidWlsZCBhIG5hbWVkIGxpc3Qgb2YgZ2dwbG90cwpwbG90cyA8LSBtYXAocGFpcnMsIH4gcGxvdF9jb21wYXJlKGRhdGEsIC54WzFdLCAueFsyXSwgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYpKQoKIyBub3cgeW91IGNhbiBwcmludCB0aGVtIGFsbDoKd2FsayhwbG90cywgcHJpbnQpCiMgb3IgYXJyYW5nZSB0aGVtIHdpdGggcGF0Y2h3b3JrIC8gZ3JpZEV4dHJhLCBldGMuCmBgYAoKCmBgYHtyfQpzYW1wbGUgPC0gIkcxLkRNU08uTWVyZ2VkIgpmb3Ioc2FtcGxlIGluIGMoIkcxLkRNU08uTWVyZ2VkIiwgIkcxLmRUQUcuTWVyZ2VkIiwgIkcxLkE0ODUuTWVyZ2VkIikpewogIHRlbXAuMjVrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgc2FtcGxlLCAiXzI1a2IudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsCiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JQogICAgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGlkLCBvYnNlcnZlZCwgIk8vRSIpCiAgY29sbmFtZXModGVtcC4yNWtiKSA8LSBjKCJjaHJvbTEiLCAic3RhcnQxIiwgImVuZDEiLCAiY2hyb20yIiwgInN0YXJ0MiIsICJlbmQyIiwgImlkIiwgIm9icyIsICJvYnNleHAiKQogIAogIHRlbXAuMTBrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgc2FtcGxlLCAiXzEwa2IudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsCiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JQogICAgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGlkLCBvYnNlcnZlZCwgIk8vRSIpCiAgY29sbmFtZXModGVtcC4xMGtiKSA8LSBjKCJjaHJvbTEiLCAic3RhcnQxIiwgImVuZDEiLCAiY2hyb20yIiwgInN0YXJ0MiIsICJlbmQyIiwgImlkIiwgIm9icyIsICJvYnNleHAiKQogIAogIHRlbXAuNWtiIDwtZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlXyIsIHNhbXBsZSwgIl81a2IudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsCiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JQogICAgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGlkLCBvYnNlcnZlZCwgIk8vRSIpCiAgY29sbmFtZXModGVtcC41a2IpIDwtIGMoImNocm9tMSIsICJzdGFydDEiLCAiZW5kMSIsICJjaHJvbTIiLCAic3RhcnQyIiwgImVuZDIiLCAiaWQiLCAib2JzIiwgIm9ic2V4cCIpCiAgCiAgdGVtcCA8LSBiaW5kX3Jvd3ModGVtcC4yNWtiLCB0ZW1wLjEwa2IsIHRlbXAuNWtiKQogIGZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgc2FtcGxlLCAiLnRzdiIpKSwgc2VwID0gIlx0IikKfQoKCnRlbXAuRE1TTyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImxvb3BTY29yZV9HMS5ETVNPLk1lcmdlZC50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChpZCwgb2JzLCBvYnNleHApCmNvbG5hbWVzKHRlbXAuRE1TTykgPC0gYygiaWQiLCAib2JzX0RNU08iLCAib2JzZXhwX0RNU08iKQp0ZW1wLmRUQUcgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJsb29wU2NvcmVfRzEuZFRBRy5NZXJnZWQudHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKQpjb2xuYW1lcyh0ZW1wLmRUQUcpIDwtIGMoImlkIiwgIm9ic19kVEFHIiwgIm9ic2V4cF9kVEFHIikKdGVtcC5BNDg1IDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAibG9vcFNjb3JlX0cxLkE0ODUuTWVyZ2VkLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGlkLCBvYnMsIG9ic2V4cCkKY29sbmFtZXModGVtcC5BNDg1KSA8LSBjKCJpZCIsICJvYnNfQTQ4NSIsICJvYnNleHBfQTQ4NSIpCgpsb29wc19vZSA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAuRE1TTywgdGVtcC5kVEFHLCBieSA9ICJpZCIpLAogICAgICAgICAgdGVtcC5BNDg1LCBieSA9ICJpZCIpICU+JQogIGRwbHlyOjptdXRhdGUob2VGQ19kVEFHX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIE5BLCBvYnNleHBfZFRBRy9vYnNleHBfRE1TTyksCiAgICAgICAgICAgICAgICBvZUZDX0E0ODVfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgTkEsIG9ic2V4cF9BNDg1L29ic2V4cF9ETVNPKSkKCmZ3cml0ZShsb29wc19vZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdiIpKSwgc2VwID0gIlx0IikKYGBgCgoKIyMjIyBDb21wYXJpbmcgRzEgdnMgQXN5bmMgZm9yIGNvbnNlbnN1cyBsb29wcwojIyMjIyBBbGwgbG9vcHMKYGBge3J9CmRpZmZDdXRvZmYgPSAwLjIKZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX3Njb3JlLnRzdiIpKQoKdGVtcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX3Njb3JlX2FzeW5jLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGlkLCBVVCwgQUlEKQoKc2NvcmUudGIgPC0gZGF0YSAlPiUgZHBseXI6OmZ1bGxfam9pbih0ZW1wLCBieSA9IGMoImlkIikpICU+JQogIGRwbHlyOjptdXRhdGUoZGlmZl9HMSA9IGRUQUcgLSBETVNPLAogICAgICAgICAgICAgICAgICBkaWZmX2FzeW5jID0gQUlEIC0gVVQpCgoKIyMjIFAxLiBVVCB2cyBBSUQKc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRVVCwgc2NvcmUudGIkQUlELCBuID0gMTAwKQpzY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJFVULCBzY29yZS50YiRBSUQpCnAxIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBVVCwgeSA9IEFJRCwgY29sb3IgPSBkZW5zaXR5KSkgKwogIGdlb21fcG9pbnQoKSArIAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKCJDb25zZW5zdXMgbG9vcCBzY29yZSIpKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoInIgPSIsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9ICJibGFjayIpCgojIyMgUDEuIERNU08gdnMgZFRBRwpzY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJGRUQUcsIG4gPSAxMDApCnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpjb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkZFRBRykKcDIgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IERNU08sIHkgPSBkVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArCiAgY29vcmRfZml4ZWQoKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoIkNvbnNlbnN1cyBsb29wIHNjb3JlIikpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZSgiciA9Iiwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gImJsYWNrIikKCgojIyMgUDMuIERNU08gdnMgQTQ4NQpzY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJEE0ODUsIG4gPSAxMDApCnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpjb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkQTQ4NSkKcDMgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IERNU08sIHkgPSBBNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArCiAgY29vcmRfZml4ZWQoKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoIkNvbnNlbnN1cyBsb29wIHNjb3JlIikpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZSgiciA9Iiwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gImJsYWNrIikKCiMjIyBQMy4gRE1TTyB2cyBVVApzY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJFVULCBuID0gMTAwKQpzY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJFVUKQpwNCA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gRE1TTywgeSA9IFVULCBjb2xvciA9IGRlbnNpdHkpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArCiAgY29vcmRfZml4ZWQoKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoIkNvbnNlbnN1cyBsb29wIHNjb3JlIikpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZSgiciA9Iiwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gImJsYWNrIikKCgojIyMgUDMuIGRUQUcgdnMgQUlECnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkZFRBRywgc2NvcmUudGIkQUlELCBuID0gMTAwKQpzY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJGRUQUcsIHNjb3JlLnRiJEFJRCkKcDUgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IGRUQUcsIHkgPSBBSUQsIGNvbG9yID0gZGVuc2l0eSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsKICBjb29yZF9maXhlZCgpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9ICJncmV5NTAiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMCgiQ29uc2Vuc3VzIGxvb3Agc2NvcmUiKSkgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKCJyID0iLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKQoKIyMjIFAzLiBkaWZmCnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkZGlmZl9HMSwgc2NvcmUudGIkZGlmZl9hc3luYywgbiA9IDEwMCkKc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRkaWZmX0cxLCBzY29yZS50YiRkaWZmX2FzeW5jKQpwNiA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gZGlmZl9HMSwgeSA9IGRpZmZfYXN5bmMsIGNvbG9yID0gZGVuc2l0eSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHhsaW0oLTEsIDAuNSkgKyB5bGltKC0xLCAwLjUpICsKICBjb29yZF9maXhlZCgpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9ICJncmV5NTAiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMCgiQ29uc2Vuc3VzIGxvb3Agc2NvcmUiKSkgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0xLCB5ID0gMC41LCBsYWJlbCA9IHBhc3RlKCJyID0iLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKQoKCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKCJjb25zZW5zdXNfc2NvcmVfc2NhdHRlcnBsb3RfcHUxMDBwejEwMF9HMXZzQXN5bmMucG5nIikpLCByZXMgPSA2MDAsIHVuaXRzID0gImluIiwgd2lkdGggPSA1KjIuNSwgaGVpZ2h0ID0gMi41KjIuNSkKcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgcDMsIAogICAgICAgICAgICAgICAgICAgICAgICAgcDQsIHA1LCBwNiwgYWxpZ24gPSAiaCIsIG5jb2wgPSAzKSkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMCgiY29uc2Vuc3VzX3Njb3JlX3NjYXR0ZXJwbG90X3B1MTAwcHoxMDBfRzF2c0FzeW5jLnN2ZyIpKSwgd2lkdGggPSA1KjIuNSwgaGVpZ2h0ID0gMi41KjIuNSkKcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgcDMsIAogICAgICAgICAgICAgICAgICAgICAgICAgcDQsIHA1LCBwNiwgYWxpZ24gPSAiaCIsIG5jb2wgPSAzKSkKZGV2Lm9mZigpCgoKYGBgCiMjIyMjIHJlZyBsb29wcwpgYGB7cn0KdGVtcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGUiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShyZXMgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgcmVzLCBWMiwgVjUsIHNlcCA9ICJfIikpCnJlZ0lEIDwtIHRlbXAkaWQKCmRpZmZDdXRvZmYgPSAwLjIKZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX3Njb3JlLnRzdiIpKQoKdGVtcCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX3Njb3JlX2FzeW5jLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGlkLCBVVCwgQUlEKQoKc2NvcmUudGIgPC0gZGF0YSAlPiUgZHBseXI6OmZ1bGxfam9pbih0ZW1wLCBieSA9IGMoImlkIikpICU+JQogIGRwbHlyOjptdXRhdGUoZGlmZl9HMSA9IGRUQUcgLSBETVNPLAogICAgICAgICAgICAgICAgICBkaWZmX2FzeW5jID0gQUlEIC0gVVQpICU+JQogIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSByZWdJRCkKCgojIyMgUDEuIFVUIHZzIEFJRApzY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJFVULCBzY29yZS50YiRBSUQsIG4gPSAxMDApCnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpjb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkVVQsIHNjb3JlLnRiJEFJRCkKcDEgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IFVULCB5ID0gQUlELCBjb2xvciA9IGRlbnNpdHkpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArCiAgY29vcmRfZml4ZWQoKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoIkNvbnNlbnN1cyBsb29wIHNjb3JlIikpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZSgiciA9Iiwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gImJsYWNrIikKCiMjIyBQMS4gRE1TTyB2cyBkVEFHCnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkRE1TTywgc2NvcmUudGIkZFRBRywgbiA9IDEwMCkKc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRETVNPLCBzY29yZS50YiRkVEFHKQpwMiA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gRE1TTywgeSA9IGRUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsKICBjb29yZF9maXhlZCgpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9ICJncmV5NTAiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMCgiQ29uc2Vuc3VzIGxvb3Agc2NvcmUiKSkgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKCJyID0iLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKQoKCiMjIyBQMy4gRE1TTyB2cyBBNDg1CnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkRE1TTywgc2NvcmUudGIkQTQ4NSwgbiA9IDEwMCkKc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRETVNPLCBzY29yZS50YiRBNDg1KQpwMyA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gRE1TTywgeSA9IEE0ODUsIGNvbG9yID0gZGVuc2l0eSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsKICBjb29yZF9maXhlZCgpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9ICJncmV5NTAiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMCgiQ29uc2Vuc3VzIGxvb3Agc2NvcmUiKSkgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKCJyID0iLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKQoKIyMjIFAzLiBETVNPIHZzIFVUCnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkRE1TTywgc2NvcmUudGIkVVQsIG4gPSAxMDApCnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpjb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkRE1TTywgc2NvcmUudGIkVVQpCnA0IDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gVVQsIGNvbG9yID0gZGVuc2l0eSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsKICBjb29yZF9maXhlZCgpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9ICJncmV5NTAiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMCgiQ29uc2Vuc3VzIGxvb3Agc2NvcmUiKSkgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKCJyID0iLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKQoKCiMjIyBQMy4gZFRBRyB2cyBBSUQKc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRkVEFHLCBzY29yZS50YiRBSUQsIG4gPSAxMDApCnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpjb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkZFRBRywgc2NvcmUudGIkQUlEKQpwNSA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gZFRBRywgeSA9IEFJRCwgY29sb3IgPSBkZW5zaXR5KSkgKwogIGdlb21fcG9pbnQoKSArIAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKCJDb25zZW5zdXMgbG9vcCBzY29yZSIpKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoInIgPSIsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9ICJibGFjayIpCgojIyMgUDMuIGRpZmYKc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRkaWZmX0cxLCBzY29yZS50YiRkaWZmX2FzeW5jLCBuID0gMTAwKQpzY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJGRpZmZfRzEsIHNjb3JlLnRiJGRpZmZfYXN5bmMpCnA2IDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBkaWZmX0cxLCB5ID0gZGlmZl9hc3luYywgY29sb3IgPSBkZW5zaXR5KSkgKwogIGdlb21fcG9pbnQoKSArIAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgeGxpbSgtMSwgMC41KSArIHlsaW0oLTEsIDAuNSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogICAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoIkNvbnNlbnN1cyBsb29wIHNjb3JlIikpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZSgiciA9Iiwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gImJsYWNrIikKCgpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMCgiY29uc2Vuc3VzX3Njb3JlX3NjYXR0ZXJwbG90X3B1MTAwcHoxMDBfRzF2c0FzeW5jX3JlZy5wbmciKSksIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDUqMi41LCBoZWlnaHQgPSAyLjUqMi41KQpwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBwMywgCiAgICAgICAgICAgICAgICAgICAgICAgICBwNCwgcDUsIHA2LCBhbGlnbiA9ICJoIiwgbmNvbCA9IDMpKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKCJjb25zZW5zdXNfc2NvcmVfc2NhdHRlcnBsb3RfcHUxMDBwejEwMF9HMXZzQXN5bmNfcmVnLnN2ZyIpKSwgd2lkdGggPSA1KjIuNSwgaGVpZ2h0ID0gMi41KjIuNSkKcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgcDMsIAogICAgICAgICAgICAgICAgICAgICAgICAgcDQsIHA1LCBwNiwgYWxpZ24gPSAiaCIsIG5jb2wgPSAzKSkKZGV2Lm9mZigpCgoKIyMjIyMjIyMjIyBTYXZpbmcgQXN5bmMgYW5kIEcxIHNwZWNpZmljIHJlZ3VsYXRvcnkgbG9vcApkaWZmQ3V0b2ZmIDwtIDAuMgp0ZW1wIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmZfRzEgPj0gLWRpZmZDdXRvZmYsIGRpZmZfYXN5bmMgPj0gLWRpZmZDdXRvZmYpICU+JQogIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDcpKQpmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19ib3RoUmV0YWluZWQuYmVkcGUiKSwgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gRkFMU0UpCgp0ZW1wIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmZfRzEgPj0gLWRpZmZDdXRvZmYsIGRpZmZfYXN5bmMgPCAtZGlmZkN1dG9mZikgJT4lCiAgZHBseXI6OnNlbGVjdChzZXEoMSwgNykpCmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX0FzeW5jU3BlY2lmaWNQZXJ0LmJlZHBlIiksIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFKQoKdGVtcCA8LSBzY29yZS50YiAlPiUgZHBseXI6OmZpbHRlcihkaWZmX0cxIDwgLWRpZmZDdXRvZmYsIGRpZmZfYXN5bmMgPj0gLWRpZmZDdXRvZmYpICU+JQogIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDcpKQpmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19HMVNwZWNpZmljUGVydC5iZWRwZSIpLCBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSkKCnRlbXAgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZl9HMSA8IC1kaWZmQ3V0b2ZmLCBkaWZmX2FzeW5jIDwgLWRpZmZDdXRvZmYpICU+JQogIGRwbHlyOjpzZWxlY3Qoc2VxKDEsIDcpKQpmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19ib3RoUGVydC5iZWRwZSIpLCBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSkKYGBgCgojIyMjIyBzdHIgbG9vcHMKYGBge3J9CnRlbXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZS5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHJlcyA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCByZXMsIFYyLCBWNSwgc2VwID0gIl8iKSkKcmVnSUQgPC0gdGVtcCRpZAoKZGlmZkN1dG9mZiA9IDAuMgpkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfc2NvcmUudHN2IikpCgp0ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfc2NvcmVfYXN5bmMudHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoaWQsIFVULCBBSUQpCgpzY29yZS50YiA8LSBkYXRhICU+JSBkcGx5cjo6ZnVsbF9qb2luKHRlbXAsIGJ5ID0gYygiaWQiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShkaWZmX0cxID0gZFRBRyAtIERNU08sCiAgICAgICAgICAgICAgICAgIGRpZmZfYXN5bmMgPSBBSUQgLSBVVCkgJT4lCiAgZHBseXI6OmZpbHRlcihpZCAlaW4lIHJlZ0lEKQoKCiMjIyBQMS4gVVQgdnMgQUlECnNjb3JlLnRiJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoc2NvcmUudGIkVVQsIHNjb3JlLnRiJEFJRCwgbiA9IDEwMCkKc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRVVCwgc2NvcmUudGIkQUlEKQpwMSA8LSBnZ3Bsb3Qoc2NvcmUudGIsIGFlcyh4ID0gVVQsIHkgPSBBSUQsIGNvbG9yID0gZGVuc2l0eSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsKICBjb29yZF9maXhlZCgpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9ICJncmV5NTAiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKHBhc3RlMCgiQ29uc2Vuc3VzIGxvb3Agc2NvcmUiKSkgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKCJyID0iLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKQoKIyMjIFAxLiBETVNPIHZzIGRUQUcKc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRETVNPLCBzY29yZS50YiRkVEFHLCBuID0gMTAwKQpzY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJGRUQUcpCnAyIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKwogIGdlb21fcG9pbnQoKSArIAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKCJDb25zZW5zdXMgbG9vcCBzY29yZSIpKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoInIgPSIsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9ICJibGFjayIpCgoKIyMjIFAzLiBETVNPIHZzIEE0ODUKc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRETVNPLCBzY29yZS50YiRBNDg1LCBuID0gMTAwKQpzY29yZS50YiA8LSBzY29yZS50YiAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKY29ycmVsYXRpb24gPC0gY29yKHNjb3JlLnRiJERNU08sIHNjb3JlLnRiJEE0ODUpCnAzIDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBETVNPLCB5ID0gQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKwogIGdlb21fcG9pbnQoKSArIAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKCJDb25zZW5zdXMgbG9vcCBzY29yZSIpKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoInIgPSIsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9ICJibGFjayIpCgojIyMgUDMuIERNU08gdnMgVVQKc2NvcmUudGIkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShzY29yZS50YiRETVNPLCBzY29yZS50YiRVVCwgbiA9IDEwMCkKc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRETVNPLCBzY29yZS50YiRVVCkKcDQgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IERNU08sIHkgPSBVVCwgY29sb3IgPSBkZW5zaXR5KSkgKwogIGdlb21fcG9pbnQoKSArIAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKCJDb25zZW5zdXMgbG9vcCBzY29yZSIpKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUoInIgPSIsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSksIHNpemUgPSA1LCBjb2xvciA9ICJibGFjayIpCgoKIyMjIFAzLiBkVEFHIHZzIEFJRApzY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJGRUQUcsIHNjb3JlLnRiJEFJRCwgbiA9IDEwMCkKc2NvcmUudGIgPC0gc2NvcmUudGIgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmNvcnJlbGF0aW9uIDwtIGNvcihzY29yZS50YiRkVEFHLCBzY29yZS50YiRBSUQpCnA1IDwtIGdncGxvdChzY29yZS50YiwgYWVzKHggPSBkVEFHLCB5ID0gQUlELCBjb2xvciA9IGRlbnNpdHkpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB4bGltKC0wLjUsIDEpICsgeWxpbSgtMC41LCAxKSArCiAgY29vcmRfZml4ZWQoKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoIkNvbnNlbnN1cyBsb29wIHNjb3JlIikpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZSgiciA9Iiwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gImJsYWNrIikKCiMjIyBQMy4gZGlmZgpzY29yZS50YiRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHNjb3JlLnRiJGRpZmZfRzEsIHNjb3JlLnRiJGRpZmZfYXN5bmMsIG4gPSAxMDApCnNjb3JlLnRiIDwtIHNjb3JlLnRiICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpjb3JyZWxhdGlvbiA8LSBjb3Ioc2NvcmUudGIkZGlmZl9HMSwgc2NvcmUudGIkZGlmZl9hc3luYykKcDYgPC0gZ2dwbG90KHNjb3JlLnRiLCBhZXMoeCA9IGRpZmZfRzEsIHkgPSBkaWZmX2FzeW5jLCBjb2xvciA9IGRlbnNpdHkpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB4bGltKC0xLCAwLjUpICsgeWxpbSgtMSwgMC41KSArCiAgY29vcmRfZml4ZWQoKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoIkNvbnNlbnN1cyBsb29wIHNjb3JlIikpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZSgiciA9Iiwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gImJsYWNrIikKCgpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMCgiY29uc2Vuc3VzX3Njb3JlX3NjYXR0ZXJwbG90X3B1MTAwcHoxMDBfRzF2c0FzeW5jX3N0ci5wbmciKSksIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDUqMi41LCBoZWlnaHQgPSAyLjUqMi41KQpwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBwMywgCiAgICAgICAgICAgICAgICAgICAgICAgICBwNCwgcDUsIHA2LCBhbGlnbiA9ICJoIiwgbmNvbCA9IDMpKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKCJjb25zZW5zdXNfc2NvcmVfc2NhdHRlcnBsb3RfcHUxMDBwejEwMF9HMXZzQXN5bmNfc3RyLnN2ZyIpKSwgd2lkdGggPSA1KjIuNSwgaGVpZ2h0ID0gMi41KjIuNSkKcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgcDMsIAogICAgICAgICAgICAgICAgICAgICAgICAgcDQsIHA1LCBwNiwgYWxpZ24gPSAiaCIsIG5jb2wgPSAzKSkKZGV2Lm9mZigpCgoKYGBgCiMjIyMgQ29tcGFyaW5nIGxvb3BzIGNhbGxlZCBmcm9tIEFzeW5jCmBgYHtyfQojIEltcG9ydGluZyBsb29wcy4gRm9yIG1ha2UgY29tcGFyaXNvbiBlYXNpZXIsIDI1IGtiCmJpblNpemUgPSAyNSoxMDAwCnRlbXAgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJUamlhbl9jaHJvbW9zaWdodF9sb29wLmJlZHBlIikpICU+JQogIGRwbHlyOjptdXRhdGUoY2VudGVyMSA9IDAuNSooVjIgKyBWMyksCiAgICAgICAgICAgICAgICBjZW50ZXIyID0gMC41KihWNSArIFY2KSwKICAgICAgICAgICAgICAgIHN0YXJ0MSA9IGNlbnRlcjEgLSAwLjUqYmluU2l6ZSwKICAgICAgICAgICAgICAgIGVuZDEgPSBjZW50ZXIxICsgMC41KmJpblNpemUsCiAgICAgICAgICAgICAgICBzdGFydDIgPSBjZW50ZXIyIC0gMC41KmJpblNpemUsCiAgICAgICAgICAgICAgICBlbmQyID0gY2VudGVyMiArIDAuNSpiaW5TaXplKSAlPiUKICBkcGx5cjo6c2VsZWN0KFYxLCBzdGFydDEsIGVuZDEsIFY0LCBzdGFydDIsIGVuZDIpCmNvbG5hbWVzKHRlbXApIDwtIGMoIlYxIiwgIlYyIiwgIlYzIiwgIlY0IiwgIlY1IiwgIlY2IikKbG9vcC5hc3luYyA8LSBpbXBvcnRCZWRwZSh0ZW1wKQoKCmJpblNpemUgPSAyNSoxMDAwCnRlbXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29ucy5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGNlbnRlcjEgPSAwLjUqKFYyICsgVjMpLAogICAgICAgICAgICAgICAgY2VudGVyMiA9IDAuNSooVjUgKyBWNiksCiAgICAgICAgICAgICAgICBzdGFydDEgPSBjZW50ZXIxIC0gMC41KmJpblNpemUsCiAgICAgICAgICAgICAgICBlbmQxID0gY2VudGVyMSArIDAuNSpiaW5TaXplLAogICAgICAgICAgICAgICAgc3RhcnQyID0gY2VudGVyMiAtIDAuNSpiaW5TaXplLAogICAgICAgICAgICAgICAgZW5kMiA9IGNlbnRlcjIgKyAwLjUqYmluU2l6ZSkgJT4lCiAgZHBseXI6OnNlbGVjdChWMSwgc3RhcnQxLCBlbmQxLCBWNCwgc3RhcnQyLCBlbmQyKQpjb2xuYW1lcyh0ZW1wKSA8LSBjKCJWMSIsICJWMiIsICJWMyIsICJWNCIsICJWNSIsICJWNiIpCmxvb3AuRzEgPC0gaW1wb3J0QmVkcGUodGVtcCkKCgojIENoZWNrIG92ZXJsYXAKb3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMobG9vcC5hc3luYywgbG9vcC5HMSkKCgpuLmFzeW5jIDwtIG5yb3coYXNfdGliYmxlKGxvb3AuYXN5bmMpKQpuLkcxIDwtIG5yb3coYXNfdGliYmxlKGxvb3AuRzEpKQpuLmFzeW5jLm92ZXJsYXAgPC0gbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcCkpKQpuLkcxLm92ZXJsYXAgPC0gbGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwKSkpCgpwbG90KGV1bGVyKGMoIkFzeW5jIiA9IG4uYXN5bmMgLSBuLmFzeW5jLm92ZXJsYXAsCiAgICAgICAgICAgICAiQXN5bmMmRzEiID0gbi5hc3luYy5vdmVybGFwLAogICAgICAgICAgICAgIkcxIiA9IDEpKSwgcXVhbnRpdGllcyA9IFRSVUUpCgoKcGxvdChldWxlcihjKCJBc3luYyIgPTEsCiAgICAgICAgICAgICAiQXN5bmMmRzEiID0gbi5HMS5vdmVybGFwLAogICAgICAgICAgICAgIkcxIiA9IG4uRzEgLSBuLkcxLm92ZXJsYXApKSwgcXVhbnRpdGllcyA9IFRSVUUpCgoKCgojIEltcG9ydGluZyBsb29wcy4gRm9yIG1ha2UgY29tcGFyaXNvbiBlYXNpZXIsIDI1IGtiCmJpblNpemUgPSAyNSoxMDAwCnRlbXAucHAgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJUamlhbl9jaHJvbW9zaWdodF9sb29wX1AtUC5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGNlbnRlcjEgPSAwLjUqKFYyICsgVjMpLAogICAgICAgICAgICAgICAgY2VudGVyMiA9IDAuNSooVjUgKyBWNiksCiAgICAgICAgICAgICAgICBzdGFydDEgPSBjZW50ZXIxIC0gMC41KmJpblNpemUsCiAgICAgICAgICAgICAgICBlbmQxID0gY2VudGVyMSArIDAuNSpiaW5TaXplLAogICAgICAgICAgICAgICAgc3RhcnQyID0gY2VudGVyMiAtIDAuNSpiaW5TaXplLAogICAgICAgICAgICAgICAgZW5kMiA9IGNlbnRlcjIgKyAwLjUqYmluU2l6ZSkgJT4lCiAgZHBseXI6OnNlbGVjdChWMSwgc3RhcnQxLCBlbmQxLCBWNCwgc3RhcnQyLCBlbmQyKQpjb2xuYW1lcyh0ZW1wLnBwKSA8LSBjKCJWMSIsICJWMiIsICJWMyIsICJWNCIsICJWNSIsICJWNiIpCmJpblNpemUgPSAyNSoxMDAwCnRlbXAuZXAgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJUamlhbl9jaHJvbW9zaWdodF9sb29wX0UtUC5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGNlbnRlcjEgPSAwLjUqKFYyICsgVjMpLAogICAgICAgICAgICAgICAgY2VudGVyMiA9IDAuNSooVjUgKyBWNiksCiAgICAgICAgICAgICAgICBzdGFydDEgPSBjZW50ZXIxIC0gMC41KmJpblNpemUsCiAgICAgICAgICAgICAgICBlbmQxID0gY2VudGVyMSArIDAuNSpiaW5TaXplLAogICAgICAgICAgICAgICAgc3RhcnQyID0gY2VudGVyMiAtIDAuNSpiaW5TaXplLAogICAgICAgICAgICAgICAgZW5kMiA9IGNlbnRlcjIgKyAwLjUqYmluU2l6ZSkgJT4lCiAgZHBseXI6OnNlbGVjdChWMSwgc3RhcnQxLCBlbmQxLCBWNCwgc3RhcnQyLCBlbmQyKQpjb2xuYW1lcyh0ZW1wLmVwKSA8LSBjKCJWMSIsICJWMiIsICJWMyIsICJWNCIsICJWNSIsICJWNiIpCnRlbXAgPC0gYmluZF9yb3dzKHRlbXAucHAsIHRlbXAuZXApCmxvb3AuYXN5bmMgPC0gaW1wb3J0QmVkcGUodGVtcCkKCgpiaW5TaXplID0gMjUqMTAwMAp0ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZS5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGNlbnRlcjEgPSAwLjUqKFYyICsgVjMpLAogICAgICAgICAgICAgICAgY2VudGVyMiA9IDAuNSooVjUgKyBWNiksCiAgICAgICAgICAgICAgICBzdGFydDEgPSBjZW50ZXIxIC0gMC41KmJpblNpemUsCiAgICAgICAgICAgICAgICBlbmQxID0gY2VudGVyMSArIDAuNSpiaW5TaXplLAogICAgICAgICAgICAgICAgc3RhcnQyID0gY2VudGVyMiAtIDAuNSpiaW5TaXplLAogICAgICAgICAgICAgICAgZW5kMiA9IGNlbnRlcjIgKyAwLjUqYmluU2l6ZSkgJT4lCiAgZHBseXI6OnNlbGVjdChWMSwgc3RhcnQxLCBlbmQxLCBWNCwgc3RhcnQyLCBlbmQyKQpjb2xuYW1lcyh0ZW1wKSA8LSBjKCJWMSIsICJWMiIsICJWMyIsICJWNCIsICJWNSIsICJWNiIpCmxvb3AuRzEgPC0gaW1wb3J0QmVkcGUodGVtcCkKCgojIENoZWNrIG92ZXJsYXAKb3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMobG9vcC5hc3luYywgbG9vcC5HMSkKCgpuLmFzeW5jIDwtIG5yb3coYXNfdGliYmxlKGxvb3AuYXN5bmMpKQpuLkcxIDwtIG5yb3coYXNfdGliYmxlKGxvb3AuRzEpKQpuLmFzeW5jLm92ZXJsYXAgPC0gbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcCkpKQpuLkcxLm92ZXJsYXAgPC0gbGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwKSkpCgpwbG90KGV1bGVyKGMoIkFzeW5jIiA9IG4uYXN5bmMgLSBuLmFzeW5jLm92ZXJsYXAsCiAgICAgICAgICAgICAiQXN5bmMmRzEiID0gbi5hc3luYy5vdmVybGFwLAogICAgICAgICAgICAgIkcxIiA9IDEpKSwgcXVhbnRpdGllcyA9IFRSVUUpCgoKcGxvdChldWxlcihjKCJBc3luYyIgPTAuMSwKICAgICAgICAgICAgICJBc3luYyZHMSIgPSBuLkcxLm92ZXJsYXAsCiAgICAgICAgICAgICAiRzEiID0gbi5HMSAtIG4uRzEub3ZlcmxhcCkpLCBxdWFudGl0aWVzID0gVFJVRSkKCmBgYAoKCiMjIyBbMi41XSBDb25zZW5zdXMgbG9vcCBhbm5vdGF0aW9uCmBgYHtyfQojIyMjIEltcG9ydGluZyBDaElQLWV4byBwZWFrcwpyZWZEaXIgPC0gaGVyZSgiLi4vLi4iLCAicmVmZXJlbmNlIikKcGVhay5IM0syN2FjIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsICJHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWQiKSkKcGVhay5IM0s0bWUzIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsICIzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWQiKSkKcGVhay5DVENGIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsICIzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWQiKSkKcGVhay5SQUQyMSA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkIikpCnBlYWsuV2h5dGUuU0UgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgInN1cGVyRW5oYW5jZXJfV2h5dGVfRVNDX21tMTAuYmVkIikpCnBlYWsuRHlsYW4uU0UgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgInN1cGVyRW5oYW5jZXJfRHlsYW5fRVNDLmJlZCIpKQpgYGAKIyMjIyBGdW5jdGlvbnMKYGBge3J9CmNyZWF0ZUxvb3BBbm5vdGF0aW9uIDwtIGZ1bmN0aW9uKGJlZHBlLmxvb3AuYW5ubywgbmFtZSwgZmlnRGlyLCBvdXREaXIsIGNvbG9yTGlzdCl7CiAgdGVtcCA9IGJlZHBlLmxvb3AuYW5ubyAlPiUKICAgIGRwbHlyOjptdXRhdGUoc2FtcGxlID0gbmFtZSkKICAKICBudW0gPSBucm93KHRlbXApCiAgcDcgPSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzYW1wbGUsIGZpbGwgPSBBbm5vMikpICsKICAgIGdlb21fYmFyKGNvbG9yID0gImJsYWNrIikgKwogICAgdGhlbWVfYncoKSArCiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG51bSwgIiBsb29wcyIpLAogICAgICAgICB4ID0gIiIsIHkgPSAiQ291bnRzIikgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hX2Zvcm1hdCgpKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgIGFzcGVjdC5yYXRpbyA9IDUsCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLAogICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiAgPSAidmVydGljYWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvckxpc3QpCiAgCiAgd2lkdGggPSAzCiAgaGVpZ2h0ID0gNQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsCiAgICAgICAgICAgICAgIHBhc3RlMCgibG9vcENsYXNzaWZ5XyIsIG5hbWUsICIuc3ZnIikpLAogICAgICAgICAgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID0gaGVpZ2h0KQogIHBsb3QocDcpCiAgaW52aXNpYmxlKGRldi5vZmYoKSkKICBwbmcoaGVyZShmaWdEaXIsCiAgICAgICAgICAgcGFzdGUwKCJsb29wQ2xhc3NpZnlfIiwgbmFtZSwgIi5wbmciKSksCiAgICAgIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodCwgcmVzID0gNjAwLCB1bml0cyA9ICJpbiIpCiAgcGxvdChwNykKICBpbnZpc2libGUoZGV2Lm9mZigpKQp9CgoKYW5ub3RhdGVMb29wUmVsYXhlZFRTUyA8LSBmdW5jdGlvbihiZWRwZS5hbm5vKXsKICB0ZW1wID0gYmVkcGUuYW5ubyAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoCiAgICAgIEExID0gaWZfZWxzZSgoQTFfSDNLNG1lM1RTUyksICJQIiwgCiAgICAgICAgICAgICAgICAgICBpZl9lbHNlKChBMV9IM0syN2FjKSwgIkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKChBMV9DVENGfEExX1JBRDIxKSwgIlMiLCAiWCIpKSksCiAgICAgIEEyID0gaWZfZWxzZSgoQTJfSDNLNG1lM1RTUyksICJQIiwgCiAgICAgICAgICAgICAgICAgICBpZl9lbHNlKChBMl9IM0syN2FjKSwgIkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKChBMl9DVENGfEEyX1JBRDIxKSwgIlMiLCAiWCIpKSkKICAgICkKICB0ZW1wID0gdGVtcCAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoQW5ubyA9IHBhc3RlMChBMSwgIi0iLCBBMiksCiAgICAgICAgICAgICAgICAgIEFubm8yID0gaWZfZWxzZShBbm5vID09ICJFLVAiLCAiUC1FIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKEFubm8gPT0gIlMtUCIsICJQLVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKEFubm8gPT0gIlgtUCIsICJQLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmX2Vsc2UoQW5ubyA9PSAiUy1FIiwgIkUtUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKEFubm8gPT0gIlgtRSIsICJFLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKEFubm8gPT0gIlgtUyIsICJTLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm8pKSkpKSksCiAgICApCiAgCiAgdGVtcCRBbm5vMiA9IGZhY3Rvcih0ZW1wJEFubm8yLCBsZXZlbCA9IGMoIlgtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlMtWCIsICJTLVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLVgiLCJFLVMiLCJFLUUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQLUUiLCJQLVgiLCAiUC1TIiwgIlAtUCIpKQogIAogICMgQ2hlY2tpbmcgdGhlIHByZWNlbnNlIG9mIHN1cGVyIGVuaGFuY2VyCiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JQogICAgZHBseXI6Om11dGF0ZShBbm5vU0UgPSBpZmVsc2UoQTFfV2h5dGUuU0UgfCBBMl9XaHl0ZS5TRSwgIlNFIiwgIk5PIikpCiAgdGVtcCRBbm5vU0UgPC0gZmFjdG9yKHRlbXAkQW5ub1NFLCBsZXZlbCA9IGMoIlNFIiwgIk5PIikpCiAgCiAgcmV0dXJuKHRlbXApCn0KCmFubm90YXRlTG9vcFByb21vdGVyVFNTIDwtIGZ1bmN0aW9uKGJlZHBlLmFubm8pewogIHRlbXAgPSBiZWRwZS5hbm5vICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JQogICAgZHBseXI6Om11dGF0ZSgKICAgICAgQTEgPSBpZl9lbHNlKChBMV9IM0s0bWUzVFNTKSwgIlAiLCAiTiIpLAogICAgICBBMiA9IGlmX2Vsc2UoKEEyX0gzSzRtZTNUU1MpLCAiUCIsICJOIikKICAgICkKICB0ZW1wID0gdGVtcCAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoQW5ubyA9IHBhc3RlMChBMSwgIi0iLCBBMiksCiAgICAgICAgICAgICAgICAgIEFubm8yID0gaWZfZWxzZShBbm5vID09ICJOLVAiLCAiUC1OIiwgQW5ubykpCiAgCiAgdGVtcCRBbm5vMiA9IGZhY3Rvcih0ZW1wJEFubm8yLCBsZXZlbCA9IGMoIk4tTiIsICJQLU4iLCAiUC1QIikpCiAgCiAgcmV0dXJuKHRlbXApCn0KCmFubm90YXRlTG9vcEVuaGFuY2VyIDwtIGZ1bmN0aW9uKGJlZHBlLmFubm8pewogIHRlbXAgPSBiZWRwZS5hbm5vICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JQogICAgZHBseXI6Om11dGF0ZSgKICAgICAgQTEgPSBpZl9lbHNlKChBMV9IM0syN2FjKSwgIkUiLCAiTiIpLAogICAgICBBMiA9IGlmX2Vsc2UoKEEyX0gzSzI3YWMpLCAiRSIsICJOIikKICAgICkKICB0ZW1wID0gdGVtcCAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoQW5ubyA9IHBhc3RlMChBMSwgIi0iLCBBMiksCiAgICAgICAgICAgICAgICAgIEFubm8yID0gaWZfZWxzZShBbm5vID09ICJOLUUiLCAiRS1OIiwgQW5ubykpCiAgdGVtcCRBbm5vMiA9IGZhY3Rvcih0ZW1wJEFubm8yLCBsZXZlbCA9IGMoIk4tTiIsICJFLU4iLCAiRS1FIikpCiAgCiAgcmV0dXJuKHRlbXApCn0KCmFubm90YXRlTG9vcFN0cnVjdHVyZSA8LSBmdW5jdGlvbihiZWRwZS5hbm5vKXsKICB0ZW1wID0gYmVkcGUuYW5ubyAlPiUgZHBseXI6OnJvd3dpc2UoKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoCiAgICAgIEExID0gaWZfZWxzZSgoQTFfQ1RDRnxBMV9SQUQyMSksICJTIiwgIk4iKSwKICAgICAgQTIgPSBpZl9lbHNlKChBMl9DVENGfEEyX1JBRDIxKSwgIlMiLCAiTiIpCiAgICApCiAgdGVtcCA9IHRlbXAgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKEFubm8gPSBwYXN0ZTAoQTEsICItIiwgQTIpLAogICAgICAgICAgICAgICAgICBBbm5vMiA9IGlmX2Vsc2UoQW5ubyA9PSAiTi1TIiwgIlMtTiIsIEFubm8pKQogIHRlbXAkQW5ubzIgPSBmYWN0b3IodGVtcCRBbm5vMiwgbGV2ZWwgPSBjKCJOLU4iLCAiUy1OIiwgIlMtUyIpKQogIHJldHVybih0ZW1wKQp9CgoKYW5ub3RhdGVBbmNob3JUU1MgPC0gZnVuY3Rpb24oYmVkcGUpewogIHRiLmxvb3AgPSAKICAgIHNldE92ZXJsYXBDb2x1bW4oIldoeXRlLlNFIiwKICAgICAgICAgICAgICAgICAgICAgc2V0T3ZlcmxhcENvbHVtbigiQ1RDRiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3ZlcmxhcENvbHVtbigiUkFEMjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3ZlcmxhcENvbHVtbigiSDNLMjdhYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE92ZXJsYXBDb2x1bW4oIkgzSzRtZTNUU1MiLCBiZWRwZSkpKSkpCiAgcmV0dXJuKHRiLmxvb3ApCn0KCnNldE92ZXJsYXBDb2x1bW4gPC0gZnVuY3Rpb24ocGVha05hbWUsIGxvb3ApewogIHRiLmxvb3AgPSBhc190aWJibGUobG9vcCkKICBvdmVybGFwID0gcmV0dXJuT3ZlcmxhcEluZGV4TGl4dChnZXQocGFzdGUwKCJwZWFrLiIsIHBlYWtOYW1lKSksIHRiLmxvb3ApCiAgdGIubG9vcFtbcGFzdGUwKCJBMV8iLCBwZWFrTmFtZSldXSA9IEZBTFNFCiAgdGIubG9vcFtbcGFzdGUwKCJBMV8iLCBwZWFrTmFtZSldXVtvdmVybGFwW1sxXV1dID0gVFJVRQogIHRiLmxvb3BbW3Bhc3RlMCgiQTJfIiwgcGVha05hbWUpXV0gPSBGQUxTRQogIHRiLmxvb3BbW3Bhc3RlMCgiQTJfIiwgcGVha05hbWUpXV1bb3ZlcmxhcFtbMl1dXSA9IFRSVUUKICByZXR1cm4odGIubG9vcCkKfQoKcmV0dXJuT3ZlcmxhcEluZGV4TGl4dCA8LSBmdW5jdGlvbihwZWFrLCBsb29wKXsKICBhbmNob3IxLnRiID0gYXNfdGliYmxlKGxvb3ApICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgc3RhcnQxLCBlbmQxKQogIGFuY2hvcjEgPSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZGF0YS5mcmFtZSgKICAgIGNociA9IGFuY2hvcjEudGIkY2hyb20xLAogICAgc3RhcnQgPSBhbmNob3IxLnRiJHN0YXJ0MSwKICAgIGVuZCA9IGFuY2hvcjEudGIkZW5kMQogICkpCiAgCiAgYW5jaG9yMi50YiA9IGFzX3RpYmJsZShsb29wKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTIsIHN0YXJ0MiwgZW5kMikKICBhbmNob3IyID0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGRhdGEuZnJhbWUoCiAgICBjaHIgPSBhbmNob3IyLnRiJGNocm9tMiwKICAgIHN0YXJ0ID0gYW5jaG9yMi50YiRzdGFydDIsCiAgICBlbmQgPSBhbmNob3IyLnRiJGVuZDIKICApKQogIAogIG92ZXJsYXAgPSBsaXN0KG92ZXJsYXAxID0gdW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoYW5jaG9yMSwgcGVhaykpKSwKICAgICAgICAgICAgICAgICBvdmVybGFwMiA9IHVuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKGFuY2hvcjIsIHBlYWspKSkpCiAgcmV0dXJuKG92ZXJsYXApCn0KCnNhdmVBbm5vR3JvdXBCZWRwZSA8LSBmdW5jdGlvbih0ZW1wLCBhbm5vLmxpc3QsIG5hbWUsIGFubm9OYW1lLCBvdURpcil7CiAgbG9vcCA9IHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBhbm5vLmxpc3QpICU+JQogICAgZHBseXI6OnNlbGVjdChjKCJjaHJvbTEiLCAic3RhcnQxIiwgImVuZDEiLCAiY2hyb20yIiwgInN0YXJ0MiIsICJlbmQyIikpCiAgZndyaXRlKGxvb3AsIGhlcmUob3V0RGlyLCBwYXN0ZTAobmFtZSwgIl8iLCBhbm5vTmFtZSwgIi5iZWRwZSIpKSwgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gRkFMU0UpCn0KYGBgCiMjIyMgQW5ub3RhdGlvbgpgYGB7cn0KY29uc2Vuc3VzLmxvb3AudGIgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19zY29yZS50c3YiKSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgRmlsdGVyaW5nIEgzSzRtZTMgcGVha3MgdGhhdCBoYXMgVFNTIG5lYXJieQojIFNpbmNlIHRoZSBmaW5lc3QgcmVzb2x1dGlvbiBpcyA1a2IsICstMi41a2Igd2lsbCBiZSB1c2VkIGFzIGEgY3V0b2ZmIGZvciBjaGVja2luZyBUU1MgcHJlc2VuY2UKZmxhbmtTaXplIDwtIDI1MDAKZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgIm1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSAiKyIsIFYyLCBWMyksCiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSwKICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lCiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCkKY29sbmFtZXMoZ2VuZS50YikgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpClRTUzFrYi5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS50YikKdGVtcCA8LSBwZWFrLkgzSzRtZTNbdW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMocGVhay5IM0s0bWUzLCBUU1Mxa2IuZ3IpKSldCmZ3cml0ZShhc190aWJibGUodGVtcCksIGhlcmUocmVmRGlyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIjMzMjU1X0gzSzRtZTNfMDQtNzQ1X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFua1NpemUvMTAwMCwgImtiVFNTLmJlZCIpKSwgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gRkFMU0UpCnBlYWsuSDNLNG1lM1RTUyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCBwYXN0ZTAoIjMzMjU1X0gzSzRtZTNfMDQtNzQ1X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFua1NpemUvMTAwMCwgImtiVFNTLmJlZCIpKSkKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBBbm5vdGF0aW5nIHdpdGggc3RyaWN0IHByaW9yaXR5IChQLVRTUyA+IEUgPiBTKQp0ZW1wLmFubm8uVFNTIDwtIGFubm90YXRlQW5jaG9yVFNTKGNvbnNlbnN1cy5sb29wLnRiKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgZGlmZl9kVEFHX0RNU08gPSAoZFRBRy1ETVNPKSwKICAgIGRpZmZfQTQ4NV9ETVNPID0gKEE0ODUtRE1TTykpCgpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5Igpjb25zZW5zdXMubG9vcC5hbm5vLnRiIDwtIGFubm90YXRlTG9vcFJlbGF4ZWRUU1ModGVtcC5hbm5vLlRTUykKZndyaXRlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIi50c3YiKSksIAogICAgICAgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gVFJVRSkKY3JlYXRlTG9vcEFubm90YXRpb24oY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgbmFtZSwgZmlnRGlyLCBvdXREaXIsICBjb2xvckxpc3RMb29wKQpzYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgdW5pcXVlKGNvbnNlbnN1cy5sb29wLmFubm8udGIkQW5ubzIpICwgbmFtZSwgImFsbCIsIG91dERpcikKc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIsICJFLUUiLCAiRS1TIiwgIkUtWCIpLCBuYW1lLCAicmVndWxhdG9yeSIsIG91dERpcikKc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoIlMtUyIsICJTLVgiKSwgbmFtZSwgInN0cnVjdHVyZSIsIG91dERpcikKc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoIlgtWCIpLCBuYW1lLCAieC14Iiwgb3V0RGlyKQpzYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIiksIG5hbWUsICJwLW4iLCBvdXREaXIpCnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpLCBuYW1lLCAicGUtcGUiLCBvdXREaXIpCnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBjKCJQLVAiLCAiUC1FIiksIG5hbWUsICJwLXBlIiwgb3V0RGlyKQoKc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoIlAtUCIpLCBuYW1lLCAicC1wIiwgb3V0RGlyKQpzYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby50YiwgYygiUC1FIiksIG5hbWUsICJwLWUiLCBvdXREaXIpCnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnRiLCBjKCJQLVMiKSwgbmFtZSwgInAtcyIsIG91dERpcikKc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8udGIsIGMoIlAtWCIpLCBuYW1lLCAicC14Iiwgb3V0RGlyKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBBbm5vdGF0aW5nIHdpdGggb25lIG1hcmtlciAoUHJvbW90ZXIpCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9Qcm9tb3RlciIKY29uc2Vuc3VzLmxvb3AuYW5uby5wcm9tb3Rlci50YiA8LSBhbm5vdGF0ZUxvb3BQcm9tb3RlclRTUyh0ZW1wLmFubm8uVFNTKQpmd3JpdGUoY29uc2Vuc3VzLmxvb3AuYW5uby5wcm9tb3Rlci50YiwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiLnRzdiIpKSwgCiAgICAgICBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBUUlVFKQpjcmVhdGVMb29wQW5ub3RhdGlvbihjb25zZW5zdXMubG9vcC5hbm5vLnByb21vdGVyLnRiLCBuYW1lLCAKICAgICAgICAgICAgICAgICAgICAgZmlnRGlyLCBvdXREaXIsICBjb2xvckxpc3RQcm9tb3RlcikKc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8ucHJvbW90ZXIudGIsIHVuaXF1ZShjb25zZW5zdXMubG9vcC5hbm5vLnByb21vdGVyLnRiJEFubm8yKSAsIG5hbWUsICJhbGwiLCBvdXREaXIpICAKc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8ucHJvbW90ZXIudGIsIGMoIlAtUCIpLCBuYW1lLCAicC1wIiwgb3V0RGlyKQpzYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5wcm9tb3Rlci50YiwgYygiUC1OIiksIG5hbWUsICJwLW4iLCBvdXREaXIpCnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnByb21vdGVyLnRiLCBjKCJOLU4iKSwgbmFtZSwgIm4tbiIsIG91dERpcikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQW5ub3RhdGluZyB3aXRoIG9uZSBtYXJrZXIgKEVuaGFuY2VyKQpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vRW5oYW5jZXIiCmNvbnNlbnN1cy5sb29wLmFubm8uZW5oYW5jZXIudGIgPC0gYW5ub3RhdGVMb29wRW5oYW5jZXIodGVtcC5hbm5vLlRTUykKZndyaXRlKGNvbnNlbnN1cy5sb29wLmFubm8uZW5oYW5jZXIudGIsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIi50c3YiKSksIAogICAgICAgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gVFJVRSkKY3JlYXRlTG9vcEFubm90YXRpb24oY29uc2Vuc3VzLmxvb3AuYW5uby5lbmhhbmNlci50YiwgbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgIGZpZ0Rpciwgb3V0RGlyLCAgY29sb3JMaXN0RW5oYW5jZXIpCnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLmVuaGFuY2VyLnRiLCB1bmlxdWUoY29uc2Vuc3VzLmxvb3AuYW5uby5lbmhhbmNlci50YiRBbm5vMikgLCBuYW1lLCAiYWxsIiwgb3V0RGlyKSAgCnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLmVuaGFuY2VyLnRiLCBjKCJFLUUiKSwgbmFtZSwgImUtZSIsIG91dERpcikKc2F2ZUFubm9Hcm91cEJlZHBlKGNvbnNlbnN1cy5sb29wLmFubm8uZW5oYW5jZXIudGIsIGMoIkUtTiIpLCBuYW1lLCAiZS1uIiwgb3V0RGlyKQpzYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5lbmhhbmNlci50YiwgYygiTi1OIiksIG5hbWUsICJuLW4iLCBvdXREaXIpCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQW5ub3RhdGluZyB3aXRoIG9uZSBtYXJrZXIgKFN0cnVjdHVyZSkKbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub1N0cnVjdHVyZSIKY29uc2Vuc3VzLmxvb3AuYW5uby5zdHJ1Y3R1cmUudGIgPC0gYW5ub3RhdGVMb29wU3RydWN0dXJlKHRlbXAuYW5uby5UU1MpCmZ3cml0ZShjb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiLnRzdiIpKSwgCiAgICAgICBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBUUlVFKQpjcmVhdGVMb29wQW5ub3RhdGlvbihjb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiwgbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgIGZpZ0Rpciwgb3V0RGlyLCAgY29sb3JMaXN0U3RydWN0dXJlKQpzYXZlQW5ub0dyb3VwQmVkcGUoY29uc2Vuc3VzLmxvb3AuYW5uby5zdHJ1Y3R1cmUudGIsIHVuaXF1ZShjb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiRBbm5vMikgLCBuYW1lLCAiYWxsIiwgb3V0RGlyKSAgCnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiwgYygiUy1TIiksIG5hbWUsICJzLXMiLCBvdXREaXIpCnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiwgYygiUy1OIiksIG5hbWUsICJzLW4iLCBvdXREaXIpCnNhdmVBbm5vR3JvdXBCZWRwZShjb25zZW5zdXMubG9vcC5hbm5vLnN0cnVjdHVyZS50YiwgYygiTi1OIiksIG5hbWUsICJuLW4iLCBvdXREaXIpCmBgYAoKIyMjIyMgUHVyZS1yZWcgdnMgU3RyLXJlZwpgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAyMDI0LjA5LjEwIFNwbGl0dGluZyByZWd1bGF0b3J5IGxvb3AgaW50byBwdXJlIHJlZ3VsYXRvcnkgYW5kIHN0cnVjdHVyZS1yZWxhdGVkIGxvb3BzCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmNvbnNlbnN1cy5sb29wLmFubm8udGIgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiLnRzdiIpKSkKcmVndWxhdG9yeS5sb29wLmFubm8udGIgPC0gY29uc2Vuc3VzLmxvb3AuYW5uby50YiAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoIlAtUCIsICJQLUUiLCAiRS1FIikpCgpyZWd1bGF0b3J5Lmxvb3AuYW5uby50YiA8LSByZWd1bGF0b3J5Lmxvb3AuYW5uby50YiAlPiUgcm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICBBbm5vMyA9IGlmZWxzZShBMV9SQUQyMSB8IEExX0NUQ0YgfCBBMl9SQUQyMSB8IEEyX1JBRDIxLCBwYXN0ZTAoInN0ciIpLAogICAgICAgICAgICAgICAgICAgcGFzdGUwKCJyZWciKSkKICApCgoKZndyaXRlKHJlZ3VsYXRvcnkubG9vcC5hbm5vLnRiLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICJfQW5ubzMudHN2IikpLCAKICAgICAgIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IFRSVUUpCgpyZWd1bGF0b3J5Lmxvb3AuYW5uby50Yl9yZWcgPC0gcmVndWxhdG9yeS5sb29wLmFubm8udGIgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzMgPT0gInJlZyIpCnJlZ3VsYXRvcnkubG9vcC5hbm5vLnRiX3N0ciA8LSByZWd1bGF0b3J5Lmxvb3AuYW5uby50YiAlPiUgZHBseXI6OmZpbHRlcihBbm5vMyA9PSAic3RyIikKCnNhdmVBbm5vR3JvdXBCZWRwZShyZWd1bGF0b3J5Lmxvb3AuYW5uby50Yl9yZWcsIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksIG5hbWUsICJwZS1wZV9yZWciLCBvdXREaXIpCnNhdmVBbm5vR3JvdXBCZWRwZShyZWd1bGF0b3J5Lmxvb3AuYW5uby50Yl9zdHIsIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksIG5hbWUsICJwZS1wZV9zdHIiLCBvdXREaXIpCgpgYGAKCgojIyMgWzIuNl0gQ29tcGFyaW5nIGFjcm9zcyBzYW1wbGVzIGZvciBjb25lc25zdXMgbG9vcAojIyMjIEZ1bmN0aW9ucwpgYGB7cn0KY3JlYXRlX2xvb3BfZGlzX3ZzX3Njb3JlIDwtIGZ1bmN0aW9uKGRhdGEsIGZpZ0RpciwgbmFtZSwgQW5ubzJMaXN0KXsKICBkYXRhID0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIEFubm8yTGlzdCkKICAKICAjIyMgYmFycGxvdAogIHRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChpZCwgRE1TTywgZFRBRywgQTQ4NSkgJT4lCiAgICBwaXZvdF9sb25nZXIoIWlkLCBuYW1lc190byA9ICJ0cmVhdG1lbnQiLCB2YWx1ZXNfdG8gPSAic2NvcmUiKQogIHRlbXAkdHJlYXRtZW50IDwtIGZhY3Rvcih0ZW1wJHRyZWF0bWVudCwgbGV2ZWxzID0gYygiRE1TTyIsICJkVEFHIiwgIkE0ODUiKSkKICAKICBwMyA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSB0cmVhdG1lbnQsIHkgPSBzY29yZSkpICsKICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gdHJlYXRtZW50KSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiRE1TTyIgPSAiZ3JleSIsICJkVEFHIiA9ICJwaW5rIiwgIkE0ODUiID0gInNreWJsdWUiKSkgKwogICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsKICAgIHlsaW0oLTAuNSwgMSkgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiZ3JleSIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArCiAgICBnZ3RpdGxlKG5hbWUpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQpKQogIGZpbGVOYW1lIDwtIHBhc3RlMCgic2NvcmVfYmFycGxvdF8iLCBuYW1lKQogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgCiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDIsIGhlaWdodCA9IDQpCiAgcHJpbnQocDMpCiAgZGV2Lm9mZigpCiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgCiAgICAgICAgICB3aWR0aCA9IDIsIGhlaWdodCA9IDQpCiAgcHJpbnQocDMpCiAgZGV2Lm9mZigpCiAgCiAgIyMjIERpc3RhbmNlIHZzIHNjb3JlCiAgCiAgdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgRE1TTywgZFRBRywgQTQ4NSkKCiAgYXZnX3Njb3JlcyA8LSB0ZW1wICU+JQogICAgZ3JvdXBfYnkoZGlzdGFuY2UpICU+JQogICAgc3VtbWFyaXNlKGFjcm9zcyhzdGFydHNfd2l0aCgiRE1TTyIpOnN0YXJ0c193aXRoKCJBNDg1IiksIG1lYW4sIG5hLnJtID0gVFJVRSkpCgogIGF2Z19zY29yZXNfbG9uZyA8LSBhdmdfc2NvcmVzICU+JQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBETVNPOkE0ODUsIG5hbWVzX3RvID0gImNvbmRpdGlvbiIsIHZhbHVlc190byA9ICJhdmdfc2NvcmUiKQogIGF2Z19zY29yZXNfbG9uZyRjb25kaXRpb24gPC0gZmFjdG9yKGF2Z19zY29yZXNfbG9uZyRjb25kaXRpb24sIGxldmVscyA9IGMoIkRNU08iLCAiZFRBRyIsICJBNDg1IikpCiAgIyBDcmVhdGUgdGhlIHBsb3QKICBwNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IGNvbmRpdGlvbiwgZmlsbCA9IGNvbmRpdGlvbikpICsKICAgIGdlb21fc21vb3RoKHNob3cubGVnZW5kID0gVFJVRSkgKyB5bGltKDAsIDAuNSkgKwogICAgdGhlbWVfY2xhc3NpYygpICsgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkRNU08iID0gImdyZXkiLCAiZFRBRyIgPSAicGluayIsICJBNDg1IiA9ICJza3libHVlIikpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkRNU08iID0gImdyZXk4MCIsICJkVEFHIiA9ICJwaW5rIiwgIkE0ODUiID0gInNreWJsdWUiKSkgKwogICAgbGFicyh0aXRsZSA9IHBhc3RlMChuYW1lKSwKICAgICAgICAgeCA9ICJEaXN0YW5jZSIsCiAgICAgICAgIHkgPSAiQXZlcmFnZSBTY29yZSIpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKQogIGZpbGVOYW1lIDwtIHBhc3RlMCgiZGlzdF92c19zY29yZV9saW5lUGxvdF8iLCBuYW1lKQogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwKICAgICAgcmVzID0gNjAwLCB1bml0cyA9ICJpbiIsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMykKICBwcmludChwNCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLAogICAgICB3aWR0aCA9IDQsIGhlaWdodCA9IDMpCiAgcHJpbnQocDQpCiAgZGV2Lm9mZigpCn0KCmNyZWF0ZV9sb29wX2Rpc192c19kaWZmc2NvcmUgPC0gZnVuY3Rpb24oZGF0YSwgZmlnRGlyLCBuYW1lLCBBbm5vMkxpc3QpewogIGRhdGEgPSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgQW5ubzJMaXN0KQogIAogIAogIHRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfZFRBR19ETVNPLCBkaWZmX0E0ODVfRE1TTykKICAKICBhdmdfc2NvcmVzIDwtIHRlbXAgJT4lCiAgICBncm91cF9ieShkaXN0YW5jZSkgJT4lCiAgICBzdW1tYXJpc2UoYWNyb3NzKDE6MiwgbWVhbiwgbmEucm0gPSBUUlVFKSkKICAKICBhdmdfc2NvcmVzX2xvbmcgPC0gYXZnX3Njb3JlcyAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gMjozLCBuYW1lc190byA9ICJjb25kaXRpb24iLCB2YWx1ZXNfdG8gPSAiYXZnX3Njb3JlIikKICBhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uIDwtIGZhY3Rvcihhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJkaWZmX2RUQUdfRE1TTyIsICJkaWZmX0E0ODVfRE1TTyIpKQogICMgQ3JlYXRlIHRoZSBwbG90CiAgcDQgPC0gZ2dwbG90KGF2Z19zY29yZXNfbG9uZywgYWVzKHggPSBkaXN0YW5jZSwgeSA9IGF2Z19zY29yZSwgY29sb3IgPSBjb25kaXRpb24sIGZpbGwgPSBjb25kaXRpb24pKSArCiAgICBnZW9tX3Ntb290aChzaG93LmxlZ2VuZCA9IFRSVUUpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyB5bGltKC0wLjUsIDAuMSkgKwogICAgdGhlbWVfY2xhc3NpYygpICsgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRpZmZfZFRBR19ETVNPIiA9ICJwaW5rIiwgImRpZmZfQTQ4NV9ETVNPIiA9ICJza3libHVlIikpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImRpZmZfZFRBR19ETVNPIiA9ICJwaW5rIiwgImRpZmZfQTQ4NV9ETVNPIiA9ICJza3libHVlIikpICsKICAgIGxhYnModGl0bGUgPSBwYXN0ZTAobmFtZSksCiAgICAgICAgIHggPSAiRGlzdGFuY2UiLAogICAgICAgICB5ID0gIkF2ZXJhZ2UgRGlmZiBTY29yZSIpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKQogIGZpbGVOYW1lIDwtIHBhc3RlMCgiZGlzdF92c19zY29yZV9kaWZmbGluZVBsb3RfIiwgbmFtZSkKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksCiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDQuNSwgaGVpZ2h0ID0gMykKICBwcmludChwNCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLAogICAgICAgICAgd2lkdGggPSA0LjUsIGhlaWdodCA9IDMpCiAgcHJpbnQocDQpCiAgZGV2Lm9mZigpCn0KCmNyZWF0ZV9sb29wX3NjYXR0ZXJwbG90IDwtIGZ1bmN0aW9uKGRhdGEsIGZpZ0RpciwgbmFtZSwgQW5ubzJMaXN0LCBkaWZmQ3V0b2ZmKXsKICBkYXRhIDwtIGRhdGEgJT4lCiAgICBkcGx5cjo6bXV0YXRlKHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiBkaWZmQ3V0b2ZmLCAiVVAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgIk5PIiwgIkRPV04iKSksCiAgICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiBkaWZmQ3V0b2ZmLCAiVVAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgIk5PIiwgIkRPV04iKSkpICU+JQogICAgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIEFubm8yTGlzdCkKICBkYXRhJHVwZG93bl9kVEFHX0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX2RUQUdfRE1TTywgbGV2ZWxzID0gYygiVVAiLCAiTk8iLCAiRE9XTiIpKQogIGRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKCJVUCIsICJOTyIsICJET1dOIikpCiAgCiAgbnVtLnVwIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpWyJVUCJdCiAgbnVtLm5vIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpWyJOTyJdCiAgbnVtLmRvd24gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbIkRPV04iXQogIG51bS5hbGwgPC0gbnVtLnVwICsgbnVtLm5vICsgbnVtLmRvd24KICBwZXJjLnVwIDwtIHJvdW5kKG51bS51cCAvIG51bS5hbGwgKiAxMDAsIDIpCiAgcGVyYy5ubyA8LSByb3VuZChudW0ubm8gLyBudW0uYWxsICogMTAwLCAyKQogIHBlcmMuZG93biA8LSByb3VuZChudW0uZG93biAvIG51bS5hbGwgKiAxMDAsIDIpCiAgCiAgIyMjIFNjYXR0ZXJwbG90CiAgZGF0YSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KGRhdGEkRE1TTywgZGF0YSRkVEFHLCBuID0gMTAwKQogIGRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKICBjb3JyZWxhdGlvbiA8LSBjb3IoZGF0YSRETVNPLCBkYXRhJGRUQUcpCiAgcDEgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gRE1TTywgeSA9IGRUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDEsCiAgICAgIGFscGhhID0gMSwKICAgICAgc3Ryb2tlID0gMCkgKyAKICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gIkQiLCBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKAogICAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICkpICsKICAgIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsgY29vcmRfZml4ZWQoKSArCiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9ICJncmV5NTAiLCBsaW5ldHlwZSA9ICJkYXNoZWQiLAogICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIiwKICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiKSArCiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIiwKICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIsCiAgICAgIGNvbG9yID0gImJsYWNrIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiLAogICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIpICsKICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlMCgiVVA6ICIsIG51bS51cCwgIiAoIiwgcGVyYy51cCwgIiUpIiksIAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsICwgc2l6ZSA9IDEsCiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUpICsKICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0wLjUsIHkgPSAxLTAuMSwgbGFiZWwgPSBwYXN0ZTAoIk5POiAiLCBudW0ubm8sICIgKCIsIHBlcmMubm8sICIlKSIpLCAKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCAsIHNpemUgPSAxLAogICAgICAgIGZhbWlseSA9IGZvbnRUeXBlKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMC41LCB5ID0gMS0wLjIsIGxhYmVsID0gcGFzdGUwKCJET1dOOiAiLCBudW0uZG93biwgIiAoIiwgcGVyYy5kb3duLCAiJSkiKSwgCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgLCBzaXplID0gMSwKICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgKwogICAgdGhlbWVfY2xhc3NpYygpICsKICAgICNhbm5vdGF0ZSgidGV4dCIsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZSgiciA9Iiwgcm91bmQoY29ycmVsYXRpb24sIDIpKSwgc2l6ZSA9IDUsIGNvbG9yID0gImJsYWNrIikgKwogICAgdGhlbWUoCiAgICAgICMgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICAgIGhqdXN0ID0gMC41LAogICAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUKICAgICAgKSwKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVTLAogICAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICAgICksCiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVTLAogICAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICAgICksCiAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICAgKSwKICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICAgKSwKICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICApICsKICB4bGFiKCJMb29wIHNjb3JlXG5HMS5ETVNPIikgKwogICAgeWxhYigiTG9vcCBzY29yZVxuRzEuZFRBRyIpCiAgCiAgCiAgCiAgbnVtLnVwIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX0E0ODVfRE1TTykpWyJVUCJdCiAgbnVtLm5vIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX0E0ODVfRE1TTykpWyJOTyJdCiAgbnVtLmRvd24gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fQTQ4NV9ETVNPKSlbIkRPV04iXQogIG51bS5hbGwgPC0gbnVtLnVwICsgbnVtLm5vICsgbnVtLmRvd24KICBwZXJjLnVwIDwtIHJvdW5kKG51bS51cCAvIG51bS5hbGwgKiAxMDAsIDIpCiAgcGVyYy5ubyA8LSByb3VuZChudW0ubm8gLyBudW0uYWxsICogMTAwLCAyKQogIHBlcmMuZG93biA8LSByb3VuZChudW0uZG93biAvIG51bS5hbGwgKiAxMDAsIDIpCiAgCiAgZGF0YSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KGRhdGEkRE1TTywgZGF0YSRBNDg1LCBuID0gMTAwKQogIGRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKICBjb3JyZWxhdGlvbiA8LSBjb3IoZGF0YSRETVNPLCBkYXRhJEE0ODUpCiAgcDIgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gRE1TTywgeSA9IEE0ODUsIGNvbG9yID0gZGVuc2l0eSkpICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDEsCiAgICAgIGFscGhhID0gMSwKICAgICAgc3Ryb2tlID0gMCkgKyAKICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gIkQiLCBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKAogICAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICkpICsKICAgIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsgY29vcmRfZml4ZWQoKSArCiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9ICJncmV5NTAiLCBsaW5ldHlwZSA9ICJkYXNoZWQiLAogICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIiwKICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiKSArCiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIiwKICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIsCiAgICAgIGNvbG9yID0gImJsYWNrIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiLAogICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIpICsKICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlMCgiVVA6ICIsIG51bS51cCwgIiAoIiwgcGVyYy51cCwgIiUpIiksIAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAxLAogICAgICAgIGZhbWlseSA9IGZvbnRUeXBlKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMC41LCB5ID0gMS0wLjEsIGxhYmVsID0gcGFzdGUwKCJOTzogIiwgbnVtLm5vLCAiICgiLCBwZXJjLm5vLCAiJSkiKSwgCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDEsCiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUpICsKICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0wLjUsIHkgPSAxLTAuMiwgbGFiZWwgPSBwYXN0ZTAoIkRPV046ICIsIG51bS5kb3duLCAiICgiLCBwZXJjLmRvd24sICIlKSIpLCAKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMSwKICAgICAgICBmYW1pbHkgPSBmb250VHlwZSkgKwogICAgdGhlbWVfY2xhc3NpYygpICsgCiAgICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0wLjUsIHkgPSAxLCBsYWJlbCA9IHBhc3RlKCJyID0iLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKSArCiAgICB0aGVtZSgKICAgICAgIyBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgICAgaGp1c3QgPSAwLjUsCiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgICBmYW1pbHkgPSBmb250VHlwZQogICAgICApLAogICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICAgKSwKICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICAgKSwKICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgICApLAogICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgICApLAogICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgICkgKwogICAgeGxhYigiTG9vcCBzY29yZVxuRzEuRE1TTyIpICsKICAgIHlsYWIoIkxvb3Agc2NvcmVcbkcxLkE0ODUiKQoKICAgIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoCiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoICAKICAKICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpcixwYXN0ZTAoInNjYXR0ZXJwbG90XyIsIG5hbWUsICJfZFRBR192c19ETVNPXyIsIGRpZmZDdXRvZmYpKQoKICBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID1oZWlnaHQpCiAgcHJpbnQocDEpCiAgZGV2Lm9mZigpCiAgcG5nKHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID1oZWlnaHQsIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIpCiAgcHJpbnQocDEpCiAgZGV2Lm9mZigpCiAgCiAgICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKCJzY2F0dGVycGxvdF8iLCBuYW1lLCAiX0E0ODVfdnNfRE1TT18iLCBkaWZmQ3V0b2ZmKSkKCiAgc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIiksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9aGVpZ2h0KQogIHByaW50KHAyKQogIGRldi5vZmYoKQogIHBuZyhwYXN0ZTAoZmlsZU5hbWUsICIucG5nIiksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9aGVpZ2h0LCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iKQogIHByaW50KHAyKQogIGRldi5vZmYoKQogIAogICMgCiAgIyAKICAjIAogICMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXRzID0gImluIiwgd2lkdGggPSA1KjEuNSwgaGVpZ2h0ID0gMi41KjEuNSkKICAjIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gImgiKSkKICAjIGRldi5vZmYoKQogICMgCiAgIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAKICAjICAgICAgICAgd2lkdGggPSA1KjEuNSwgaGVpZ2h0ID0gMi41KjEuNSkKICAjIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gImgiKSkKICAjIGRldi5vZmYoKQp9CgptYWtlX2RpZmZfYmVkcGUgPC0gZnVuY3Rpb24oZGF0YSwgbmFtZSwgQW5ubzJMaXN0LCBvdXREaXIsIGRpZmZDdXRvZmYpewogIGRhdGEgPC0gZGF0YSAlPiUKICAgIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsICJVUCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCAiTk8iLCAiRE9XTiIpKSwKICAgICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsICJVUCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IC1kaWZmQ3V0b2ZmLCAiTk8iLCAiRE9XTiIpKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgQW5ubzJMaXN0KQogIGRhdGEkdXBkb3duX2RUQUdfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fZFRBR19ETVNPLCBsZXZlbHMgPSBjKCJVUCIsICJOTyIsICJET1dOIikpCiAgZGF0YSR1cGRvd25fQTQ4NV9ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9BNDg1X0RNU08sIGxldmVscyA9IGMoIlVQIiwgIk5PIiwgIkRPV04iKSkKICAKICBvdXQudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9kVEFHX0RNU08gPT0gIlVQIikgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2KSkKICBmd3JpdGUob3V0LnRlbXAsIGhlcmUob3V0RGlyLCBwYXN0ZTAobmFtZSwgIl9kVEFHdnNETVNPX1VQX2RpZmYiLCBkaWZmQ3V0b2ZmLCAiLmJlZHBlIikpLCAKICAgICAgICAgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gRkFMU0UpCiAgb3V0LnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fZFRBR19ETVNPID09ICJOTyIpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpCiAgZndyaXRlKG91dC50ZW1wLCBoZXJlKG91dERpciwgcGFzdGUwKG5hbWUsICJfZFRBR3ZzRE1TT19OT19kaWZmIiwgZGlmZkN1dG9mZiwgIi5iZWRwZSIpKSwgCiAgICAgICAgIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFKQogIG91dC50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSAiRE9XTiIpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpCiAgZndyaXRlKG91dC50ZW1wLCBoZXJlKG91dERpciwgcGFzdGUwKG5hbWUsICJfZFRBR3ZzRE1TT19ET1dOX2RpZmYiLCBkaWZmQ3V0b2ZmLCAiLmJlZHBlIikpLCAKICAgICAgICAgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gRkFMU0UpCiAgCiAgb3V0LnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fQTQ4NV9ETVNPID09ICJVUCIpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpCiAgZndyaXRlKG91dC50ZW1wLCBoZXJlKG91dERpciwgcGFzdGUwKG5hbWUsICJfQTQ4NXZzRE1TT19VUF9kaWZmIiwgZGlmZkN1dG9mZiwgIi5iZWRwZSIpKSwgCiAgICAgICAgIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFKQogIG91dC50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX0E0ODVfRE1TTyA9PSAiTk8iKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYpKQogIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCAiX0E0ODV2c0RNU09fTk9fZGlmZiIsIGRpZmZDdXRvZmYsICIuYmVkcGUiKSksIAogICAgICAgICBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSkKICBvdXQudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gIkRPV04iKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYpKQogIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCAiX0E0ODV2c0RNU09fRE9XTl9kaWZmIiwgZGlmZkN1dG9mZiwgIi5iZWRwZSIpKSwgCiAgICAgICAgIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFKQp9CgpjcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQgPC0gZnVuY3Rpb24oZGF0YSwgZmlnRGlyLCBuYW1lLCBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IEZBTFNFKXsKICBhdmdfc2NvcmVzX2xvbmcgPC0gZGF0YSAlPiUKICAgIGdyb3VwX2J5KGRpc3RhbmNlLCBBbm5vMikgJT4lCiAgICBzdW1tYXJpc2UoYXZnX3Njb3JlID0gbWVhbihzY29yZSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgICB1bmdyb3VwKCkgCiAgYXZnX3Njb3Jlc19sb25nJEFubm8yIDwtIGZhY3Rvcihhdmdfc2NvcmVzX2xvbmckQW5ubzIsIGxldmVsID0gbG9vcExpc3QpCiAgcDQgPC0gZ2dwbG90KGF2Z19zY29yZXNfbG9uZywgYWVzKHggPSBkaXN0YW5jZSwgeSA9IGF2Z19zY29yZSwgY29sb3IgPSBBbm5vMiwgZmlsbCA9IEFubm8yKSkgKyAKICAgIGdlb21fc21vb3RoKHNob3cubGVnZW5kID0gVFJVRSwgc2UgPSBzZSkgICsKICAgIHlsaW0oMCwgMC41KSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvckxpc3QpICsKICAgIGxhYnModGl0bGUgPSBwYXN0ZTAobmFtZSksCiAgICAgICAgIHggPSAiRGlzdGFuY2UiLAogICAgICAgICB5ID0gIkF2ZXJhZ2UgU2NvcmUiKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkKICAKICBmaWxlTmFtZSA8LSBwYXN0ZTAoImRpc3RfdnNfc2NvcmVfbGluZVBsb3RfIiwgbmFtZSkKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIAogICAgICByZXMgPSA2MDAsIHVuaXRzID0gImluIiwgd2lkdGggPSA0LCBoZWlnaHQgPSAzKQogIHByaW50KHA0KQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksIAogICAgICAgICAgd2lkdGggPSA0LCBoZWlnaHQgPSAzKQogIHByaW50KHA0KQogIGRldi5vZmYoKQp9IAoKY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gRkFMU0UpewogIGF2Z19zY29yZXNfbG9uZyA8LSBkYXRhICU+JQogICAgZ3JvdXBfYnkoZGlzdGFuY2UsIEFubm8yKSAlPiUKICAgIHN1bW1hcmlzZShhdmdfc2NvcmUgPSBtZWFuKHNjb3JlLCBuYS5ybSA9IFRSVUUpKSAlPiUKICAgIHVuZ3JvdXAoKSAKICBhdmdfc2NvcmVzX2xvbmckQW5ubzIgPC0gZmFjdG9yKGF2Z19zY29yZXNfbG9uZyRBbm5vMiwgbGV2ZWwgPSBsb29wTGlzdCkKICBwNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IEFubm8yLCBmaWxsID0gQW5ubzIpKSArIAogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogICAgZ2VvbV9zbW9vdGgoc2hvdy5sZWdlbmQgPSBUUlVFLCBzZSA9IHNlKSAgKwogICAgdGhlbWVfY2xhc3NpYygpICsgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yTGlzdCkgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KSArCiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG5hbWUpLAogICAgICAgICB4ID0gIkRpc3RhbmNlIiwKICAgICAgICAgeSA9ICJBdmVyYWdlIERpZmYgU2NvcmUiKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkgCiAgCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJkaXN0X3ZzX3Njb3JlX2RpZmZsaW5lUGxvdF8iLCBuYW1lKQogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgCiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDQsIGhlaWdodCA9IDMpCiAgcHJpbnQocDQpCiAgZGV2Lm9mZigpCiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgCiAgICAgICAgICB3aWR0aCA9IDQsIGhlaWdodCA9IDMpCiAgcHJpbnQocDQpCiAgZGV2Lm9mZigpCn0gCgpjcmVhdGVfc2NvcmVfYmFycGxvdF9wZXJUcmVhdG1lbnQgPC0gZnVuY3Rpb24oZGF0YSwgZmlnRGlyLCBuYW1lLCBsb29wTGlzdCwgY29sb3JMaXN0KXsKICBkYXRhJEFubm8yIDwtIGZhY3RvcihkYXRhJEFubm8yLCBsZXZlbHMgPSBsb29wTGlzdCkKICAKICBwMyA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBBbm5vMiwgeSA9IHNjb3JlKSkgKwogICAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBBbm5vMiksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yTGlzdCkgKwogICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsKICAgIHlsaW0oLTAuNSwgMSkgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiZ3JleSIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArCiAgICBnZ3RpdGxlKG5hbWUpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQpKQogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgic2NvcmVfYmFyUGxvdF8iLCBuYW1lKQogIAogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgCiAgICAgIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDIsIGhlaWdodCA9IDQpCiAgcHJpbnQocDMpCiAgZGV2Lm9mZigpCiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgCiAgICAgICAgICB3aWR0aCA9IDIsIGhlaWdodCA9IDQpCiAgcHJpbnQocDMpCn0KCgppdGVyYXRlX2xvb3BfZnVuY3Rpb25zIDwtIGZ1bmN0aW9uKGRhdGEsIGZpZ0RpciwgZ3JvdXBOYW1lLCBhbm5vTGlzdCl7CiAgIyBjcmVhdGVfbG9vcF9kaXNfdnNfc2NvcmUoZGF0YSwgZmlnRGlyLCBncm91cE5hbWUsIGFubm9MaXN0KQogICMgY3JlYXRlX2xvb3BfZGlzX3ZzX2RpZmZzY29yZShkYXRhLCBmaWdEaXIsIGdyb3VwTmFtZSwgYW5ub0xpc3QpCgogIGNyZWF0ZV9sb29wX3NjYXR0ZXJwbG90KGRhdGEsIGZpZ0RpciwgZ3JvdXBOYW1lLCBhbm5vTGlzdCwgMC4yKQogICMgY3JlYXRlX2xvb3Bfc2NhdHRlcnBsb3QoZGF0YSwgZmlnRGlyLCBncm91cE5hbWUsIGFubm9MaXN0LCAwLjEpCiAgIyBtYWtlX2RpZmZfYmVkcGUoZGF0YSwgZ3JvdXBOYW1lLCBhbm5vTGlzdCwgY29uc2Vuc3VzRGlyLCAwLjIpCiAgIyBtYWtlX2RpZmZfYmVkcGUoZGF0YSwgZ3JvdXBOYW1lLCBhbm5vTGlzdCwgY29uc2Vuc3VzRGlyLCAwLjEpCn0KYGBgCgojIyMjIFJlbGF4ZWQgYW5ub3RhdGlvbgpgYGB7cn0KCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiLnRzdiIpKSkKCml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl8iLCAiY2xfYWxsIiksIHVuaXF1ZShkYXRhJEFubm8yKSkKaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiXyIsICJjbF9zdHJ1Y3R1cmUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgYygiUy1TIiwgIlMtWCIpKQppdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfIiwgInMtcyIpLCAKICAgICAgICAgICAgICAgICAgICAgICBjKCJTLVMiKSkKaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiXyIsICJjbF9yZWd1bGF0b3J5IiksIAogICAgICAgICAgICAgICAgICAgICAgIGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIsICJFLUUiLCAiRS1TIiwgIkUtWCIpKQppdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfIiwgImNsX3BlLXBlIiksIAogICAgICAgICAgICAgICAgICAgICAgIGMoIlAtUCIsICJQLUUiLCAiRS1FIikpCml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl8iLCAicC1wZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICBjKCJQLVAiLCAiUC1FIikpCml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl8iLCAicC1wIiksIAogICAgICAgICAgICAgICAgICAgICAgIGMoIlAtUCIpKQppdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfIiwgInAtZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICBjKCJQLUUiKSkKaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiXyIsICJlLWUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgYygiRS1FIikpCml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl8iLCAieC14IiksIAogICAgICAgICAgICAgICAgICAgICAgIGMoIlgtWCIpKQojIyMjIyMjIyMjIwojIENyZWF0aW5nIGRpZmZlcmVudGlhbCBzY2F0dGVycGxvdApWaWV3KGRhdGEpCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQ3JlYXRpbmcgZmlndXJlcyBwZXIgZWFjaCBjb25kaXRpb24KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICIudHN2IikpKQp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBETVNPLCBBbm5vMikKY29sbmFtZXModGVtcCkgPC0gYygiZGlzdGFuY2UiLCAic2NvcmUiLCAiQW5ubzIiKQpjcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9ETVNPIiksIGMoIlgtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlMtWCIsICJTLVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLVgiLCJFLVMiLCJFLUUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQLUUiLCJQLVgiLCAiUC1TIiwgIlAtUCIpLCBjb2xvckxpc3RMb29wKQp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBkVEFHLCBBbm5vMikKY29sbmFtZXModGVtcCkgPC0gYygiZGlzdGFuY2UiLCAic2NvcmUiLCAiQW5ubzIiKQpjcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9kVEFHIiksIGMoIlgtWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlMtWCIsICJTLVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLVgiLCJFLVMiLCJFLUUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQLUUiLCJQLVgiLCAiUC1TIiwgIlAtUCIpLCBjb2xvckxpc3RMb29wKQoKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgQTQ4NSwgQW5ubzIpCmNvbG5hbWVzKHRlbXApIDwtIGMoImRpc3RhbmNlIiwgInNjb3JlIiwgIkFubm8yIikKY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfQTQ4NSIpLCBjKCJYLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTLVgiLCAiUy1TIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS1YIiwiRS1TIiwiRS1FIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUC1FIiwiUC1YIiwgIlAtUyIsICJQLVAiKSwgY29sb3JMaXN0TG9vcCkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQ3JlYXRpbmcgZmlndXJlcyBwZXIgZWFjaCBjb25kaXRpb24sIGRpZmZlcmVudGlhbApuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgpkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIi50c3YiKSkpCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfZFRBR19ETVNPLCBBbm5vMikKY29sbmFtZXModGVtcCkgPC0gYygiZGlzdGFuY2UiLCAic2NvcmUiLCAiQW5ubzIiKQpjcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfZFRBRyIpLCBjKCJYLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTLVgiLCAiUy1TIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS1YIiwiRS1TIiwiRS1FIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUC1FIiwiUC1YIiwgIlAtUyIsICJQLVAiKSwgY29sb3JMaXN0TG9vcCkKY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX2RUQUdfU0UiKSwgYygiWC1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUy1YIiwgIlMtUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUtWCIsIkUtUyIsIkUtRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlAtRSIsIlAtWCIsICJQLVMiLCAiUC1QIiksIGNvbG9yTGlzdExvb3AsIHNlID0gVFJVRSkKbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICIudHN2IikpKQp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBkaWZmX0E0ODVfRE1TTywgQW5ubzIpCmNvbG5hbWVzKHRlbXApIDwtIGMoImRpc3RhbmNlIiwgInNjb3JlIiwgIkFubm8yIikKY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX0E0ODUiKSwgYygiWC1YIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUy1YIiwgIlMtUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUtWCIsIkUtUyIsIkUtRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlAtRSIsIlAtWCIsICJQLVMiLCAiUC1QIiksIGNvbG9yTGlzdExvb3ApCgpjcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfQTQ4NV9TRSIpLCBjKCJYLVgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTLVgiLCAiUy1TIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS1YIiwiRS1TIiwiRS1FIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUC1FIiwiUC1YIiwgIlAtUyIsICJQLVAiKSwgY29sb3JMaXN0TG9vcCwgc2UgPSBUUlVFKQpgYGAKIyMjIyMgUHVyZS1yZWcgdnMgc3RyLXJlZwpgYGB7cn0KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICJfQW5ubzMudHN2IikpKQpkaWZmQ3V0b2ZmIDwtIDAuMgoKIyBTcGxpdHRpbmcgZGF0YQpkYXRhLnJlZyA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8zID09ICJyZWciKQpkYXRhLnN0ciA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8zID09ICJzdHIiKQoKIyBUYWtpbmcgY29kZXMgZnJvbSBwcmV2aW91cyBmdW5jdGlvbiAoc3RyKQpkYXRhIDwtIGRhdGEuc3RyCmRhdGEgPC0gZGF0YSAlPiUKICBkcGx5cjo6bXV0YXRlKHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiBkaWZmQ3V0b2ZmLCAiVVAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gLWRpZmZDdXRvZmYsICJOTyIsICJET1dOIikpLAogICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsICJVUCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgIk5PIiwgIkRPV04iKSkpCmRhdGEkdXBkb3duX2RUQUdfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fZFRBR19ETVNPLCBsZXZlbHMgPSBjKCJVUCIsICJOTyIsICJET1dOIikpCmRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKCJVUCIsICJOTyIsICJET1dOIikpCgpudW0udXAgPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbIlVQIl0KbnVtLm5vIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpWyJOTyJdCm51bS5kb3duIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpWyJET1dOIl0KbnVtLmFsbCA8LSBudW0udXAgKyBudW0ubm8gKyBudW0uZG93bgpwZXJjLnVwIDwtIHJvdW5kKG51bS51cCAvIG51bS5hbGwgKiAxMDAsIDIpCnBlcmMubm8gPC0gcm91bmQobnVtLm5vIC8gbnVtLmFsbCAqIDEwMCwgMikKcGVyYy5kb3duIDwtIHJvdW5kKG51bS5kb3duIC8gbnVtLmFsbCAqIDEwMCwgMikKCmRhdGEkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShkYXRhJERNU08sIGRhdGEkZFRBRywgbiA9IDEwMCkKZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpwMSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBETVNPLCB5ID0gZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKwogIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsgY29vcmRfZml4ZWQoKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUwKCJVUDogIiwgbnVtLnVwLCAiICgiLCBwZXJjLnVwLCAiJSkiKSwgCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTAuNSwgeSA9IDEtMC4xLCBsYWJlbCA9IHBhc3RlMCgiTk86ICIsIG51bS5ubywgIiAoIiwgcGVyYy5ubywgIiUpIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0wLjUsIHkgPSAxLTAuMiwgbGFiZWwgPSBwYXN0ZTAoIkRPV046ICIsIG51bS5kb3duLCAiICgiLCBwZXJjLmRvd24sICIlKSIpLCAKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsKICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKG5hbWUpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpCgojIFRha2luZyBjb2RlcyBmcm9tIHByZXZpb3VzIGZ1bmN0aW9uIChyZWcpCmRhdGEgPC0gZGF0YS5yZWcKZGF0YSA8LSBkYXRhICU+JQogIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsICJVUCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgIk5PIiwgIkRPV04iKSksCiAgICAgICAgICAgICAgICB1cGRvd25fQTQ4NV9ETVNPID0gaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gZGlmZkN1dG9mZiwgIlVQIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IC1kaWZmQ3V0b2ZmLCAiTk8iLCAiRE9XTiIpKSkKZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoIlVQIiwgIk5PIiwgIkRPV04iKSkKZGF0YSR1cGRvd25fQTQ4NV9ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9BNDg1X0RNU08sIGxldmVscyA9IGMoIlVQIiwgIk5PIiwgIkRPV04iKSkKCm51bS51cCA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVsiVVAiXQpudW0ubm8gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbIk5PIl0KbnVtLmRvd24gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbIkRPV04iXQpudW0uYWxsIDwtIG51bS51cCArIG51bS5ubyArIG51bS5kb3duCnBlcmMudXAgPC0gcm91bmQobnVtLnVwIC8gbnVtLmFsbCAqIDEwMCwgMikKcGVyYy5ubyA8LSByb3VuZChudW0ubm8gLyBudW0uYWxsICogMTAwLCAyKQpwZXJjLmRvd24gPC0gcm91bmQobnVtLmRvd24gLyBudW0uYWxsICogMTAwLCAyKQoKZGF0YSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KGRhdGEkRE1TTywgZGF0YSRkVEFHLCBuID0gMTAwKQpkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCnAyIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IERNU08sIHkgPSBkVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgKyBjb29yZF9maXhlZCgpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9ICJncmV5NTAiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoIlVQOiAiLCBudW0udXAsICIgKCIsIHBlcmMudXAsICIlKSIpLCAKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMC41LCB5ID0gMS0wLjEsIGxhYmVsID0gcGFzdGUwKCJOTzogIiwgbnVtLm5vLCAiICgiLCBwZXJjLm5vLCAiJSkiKSwgCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTAuNSwgeSA9IDEtMC4yLCBsYWJlbCA9IHBhc3RlMCgiRE9XTjogIiwgbnVtLmRvd24sICIgKCIsIHBlcmMuZG93biwgIiUpIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykgKwogIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUobmFtZSkgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkgIAogIAoKZmlsZU5hbWUgPC0gcGFzdGUwKCJzY2F0dGVycGxvdF8iLCBuYW1lLCAiXyIsIGRpZmZDdXRvZmYsICJfcHVyZV9zdHJfcmVnIikKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXRzID0gImluIiwgd2lkdGggPSA1KjEuNSwgaGVpZ2h0ID0gMi41KjEuNSkKcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSAiaCIpKQpkZXYub2ZmKCkKCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksIAogICAgICAgIHdpZHRoID0gNSoxLjUsIGhlaWdodCA9IDIuNSoxLjUpCnByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gImgiKSkKZGV2Lm9mZigpCmBgYAojIyMjIyA1MGtiIHZzIDIwMCBrYgpgYGB7cn0KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICJfQW5ubzMudHN2IikpKQoKZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKHNpemUgPSBzdGFydDIgLSBzdGFydDEpCgpkYXRhX3VuZGVyNTBrYiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYygiUC1QIiwgIlAtRSIsICJFLUUiKSwgc2l6ZSA8IDUwKjEwMDAsIEFubm8zID09ICJyZWciKQpkYXRhX3VuZGVyMjAwa2IgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksIHNpemUgPj0gNTAqMTAwMCwgc2l6ZSA8IDIwMCoxMDAwLCBBbm5vMyA9PSAicmVnIikKZGF0YV9vdmVyMjAwa2IgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksIHNpemUgPj0gMjAwKjEwMDAsIEFubm8zID09ICJyZWciKQoKIyMjIyMjIyMKCmRhdGEgPC0gZGF0YV91bmRlcjUwa2IKCmRpZmZDdXRvZmYgPC0gMC4yCmRhdGEgPC0gZGF0YSAlPiUKICBkcGx5cjo6bXV0YXRlKHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiBkaWZmQ3V0b2ZmLCAiVVAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gLWRpZmZDdXRvZmYsICJOTyIsICJET1dOIikpLAogICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsICJVUCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgIk5PIiwgIkRPV04iKSkpCmRhdGEkdXBkb3duX2RUQUdfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fZFRBR19ETVNPLCBsZXZlbHMgPSBjKCJVUCIsICJOTyIsICJET1dOIikpCmRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKCJVUCIsICJOTyIsICJET1dOIikpCgojIyMjCm51bS51cCA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9kVEFHX0RNU08pKVsiVVAiXQpudW0ubm8gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbIk5PIl0KbnVtLmRvd24gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbIkRPV04iXQpudW0uYWxsIDwtIG51bS51cCArIG51bS5ubyArIG51bS5kb3duCnBlcmMudXAgPC0gcm91bmQobnVtLnVwIC8gbnVtLmFsbCAqIDEwMCwgMikKcGVyYy5ubyA8LSByb3VuZChudW0ubm8gLyBudW0uYWxsICogMTAwLCAyKQpwZXJjLmRvd24gPC0gcm91bmQobnVtLmRvd24gLyBudW0uYWxsICogMTAwLCAyKQoKZGF0YSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KGRhdGEkRE1TTywgZGF0YSRkVEFHLCBuID0gMTAwKQpkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCnAxIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IERNU08sIHkgPSBkVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgeGxpbSgtMC41LCAxKSArIHlsaW0oLTAuNSwgMSkgKyBjb29yZF9maXhlZCgpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbCA9ICJncmV5NTAiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMC41LCB5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoIlVQOiAiLCBudW0udXAsICIgKCIsIHBlcmMudXAsICIlKSIpLCAKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMC41LCB5ID0gMS0wLjEsIGxhYmVsID0gcGFzdGUwKCJOTzogIiwgbnVtLm5vLCAiICgiLCBwZXJjLm5vLCAiJSkiKSwgCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTAuNSwgeSA9IDEtMC4yLCBsYWJlbCA9IHBhc3RlMCgiRE9XTjogIiwgbnVtLmRvd24sICIgKCIsIHBlcmMuZG93biwgIiUpIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykgKwogIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUobmFtZSkgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkgIAogIAoKIyMjIwpudW0udXAgPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fQTQ4NV9ETVNPKSlbIlVQIl0KbnVtLm5vIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX0E0ODVfRE1TTykpWyJOTyJdCm51bS5kb3duIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX0E0ODVfRE1TTykpWyJET1dOIl0KbnVtLmFsbCA8LSBudW0udXAgKyBudW0ubm8gKyBudW0uZG93bgpwZXJjLnVwIDwtIHJvdW5kKG51bS51cCAvIG51bS5hbGwgKiAxMDAsIDIpCnBlcmMubm8gPC0gcm91bmQobnVtLm5vIC8gbnVtLmFsbCAqIDEwMCwgMikKcGVyYy5kb3duIDwtIHJvdW5kKG51bS5kb3duIC8gbnVtLmFsbCAqIDEwMCwgMikKCmRhdGEkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShkYXRhJERNU08sIGRhdGEkQTQ4NSwgbiA9IDEwMCkKZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpwMiA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBETVNPLCB5ID0gQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKwogIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHhsaW0oLTAuNSwgMSkgKyB5bGltKC0wLjUsIDEpICsgY29vcmRfZml4ZWQoKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTAuNSwgeSA9IDEsIGxhYmVsID0gcGFzdGUwKCJVUDogIiwgbnVtLnVwLCAiICgiLCBwZXJjLnVwLCAiJSkiKSwgCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTAuNSwgeSA9IDEtMC4xLCBsYWJlbCA9IHBhc3RlMCgiTk86ICIsIG51bS5ubywgIiAoIiwgcGVyYy5ubywgIiUpIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0wLjUsIHkgPSAxLTAuMiwgbGFiZWwgPSBwYXN0ZTAoIkRPV046ICIsIG51bS5kb3duLCAiICgiLCBwZXJjLmRvd24sICIlKSIpLCAKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsKICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKG5hbWUpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpICAKICAKCmZpbGVOYW1lIDwtIHBhc3RlMCgic2NhdHRlcnBsb3RfIiwgbmFtZSwgIl8iLCBkaWZmQ3V0b2ZmLCAiX3JlZ3VuZGVyNTBrYl9wdXJlIikKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXRzID0gImluIiwgd2lkdGggPSA1KjEuNSwgaGVpZ2h0ID0gMi41KjEuNSkKcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSAiaCIpKQpkZXYub2ZmKCkKCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksIAogICAgICAgIHdpZHRoID0gNSoxLjUsIGhlaWdodCA9IDIuNSoxLjUpCnByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gImgiKSkKZGV2Lm9mZigpCgpgYGAKCiMjIyMgT25lIGZlYXR1cmUgYW5ub3RhdGlvbiAtIHByb21vdGVyCmBgYHtyfQoKbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub1Byb21vdGVyIgpkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIi50c3YiKSkpCml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl8iLCAiYWxsIiksIHVuaXF1ZShkYXRhJEFubm8yKSkKaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiXyIsICJwLXAiKSwgYygiUC1QIikpCml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl8iLCAicC1uIiksIGMoIlAtTiIpKQppdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfIiwgIm4tbiIpLCBjKCJOLU4iKSkKCmNvbG9yTGlzdCA8LSBjb2xvckxpc3RQcm9tb3Rlcgpsb29wTGlzdCA8LSBjKCJOLU4iLCAiUC1OIiwgIlAtUCIpCgp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBETVNPLCBBbm5vMikKY29sbmFtZXModGVtcCkgPC0gYygiZGlzdGFuY2UiLCAic2NvcmUiLCAiQW5ubzIiKQpjcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9ETVNPIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKQpjcmVhdGVfc2NvcmVfYmFycGxvdF9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9ETVNPIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QpCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRUQUcsIEFubm8yKQpjb2xuYW1lcyh0ZW1wKSA8LSBjKCJkaXN0YW5jZSIsICJzY29yZSIsICJBbm5vMiIpCmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX2RUQUciKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpCgpjcmVhdGVfc2NvcmVfYmFycGxvdF9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9kVEFHIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QpCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIEE0ODUsIEFubm8yKQpjb2xuYW1lcyh0ZW1wKSA8LSBjKCJkaXN0YW5jZSIsICJzY29yZSIsICJBbm5vMiIpCmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX0E0ODUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpCmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX0E0ODUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCkKCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfZFRBR19ETVNPLCBBbm5vMikKY29sbmFtZXModGVtcCkgPC0gYygiZGlzdGFuY2UiLCAic2NvcmUiLCAiQW5ubzIiKQpjcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfZFRBRyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSkKCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRpZmZfQTQ4NV9ETVNPLCBBbm5vMikKY29sbmFtZXModGVtcCkgPC0gYygiZGlzdGFuY2UiLCAic2NvcmUiLCAiQW5ubzIiKQpjcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfQTQ4NSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSkKYGBgCgojIyMjIE9uZSBmZWF0dXJlIGFubm90YXRpb24gLSBlbmhhbmNlcgpgYGB7cn0KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0VuaGFuY2VyIgpkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIi50c3YiKSkpCml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl8iLCAiYWxsIiksIHVuaXF1ZShkYXRhJEFubm8yKSkKaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiXyIsICJlLWUiKSwgYygiRS1FIikpCml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl8iLCAiZS1uIiksIGMoIkUtTiIpKQppdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfIiwgIm4tbiIpLCBjKCJOLU4iKSkKCmNvbG9yTGlzdCA8LSBjb2xvckxpc3RFbmhhbmNlcgpsb29wTGlzdCA8LSBjKCJOLU4iLCAiRS1OIiwgIkUtRSIpCgp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBETVNPLCBBbm5vMikKY29sbmFtZXModGVtcCkgPC0gYygiZGlzdGFuY2UiLCAic2NvcmUiLCAiQW5ubzIiKQpjcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9ETVNPIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKQpjcmVhdGVfc2NvcmVfYmFycGxvdF9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9ETVNPIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QpCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGRUQUcsIEFubm8yKQpjb2xuYW1lcyh0ZW1wKSA8LSBjKCJkaXN0YW5jZSIsICJzY29yZSIsICJBbm5vMiIpCmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX2RUQUciKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpCmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX2RUQUciKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCkKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgQTQ4NSwgQW5ubzIpCmNvbG5hbWVzKHRlbXApIDwtIGMoImRpc3RhbmNlIiwgInNjb3JlIiwgIkFubm8yIikKY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfQTQ4NSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSkKY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfQTQ4NSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0KQoKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZGlmZl9kVEFHX0RNU08sIEFubm8yKQpjb2xuYW1lcyh0ZW1wKSA8LSBjKCJkaXN0YW5jZSIsICJzY29yZSIsICJBbm5vMiIpCmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9kVEFHIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKQoKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZGlmZl9BNDg1X0RNU08sIEFubm8yKQpjb2xuYW1lcyh0ZW1wKSA8LSBjKCJkaXN0YW5jZSIsICJzY29yZSIsICJBbm5vMiIpCmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9BNDg1IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKQpgYGAKIyMjIyBPbmUgZmVhdHVyZSBhbm5vdGF0aW9uIC0gc3RydWN0dXJlCgpgYGB7cn0KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub1N0cnVjdHVyZSIKZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICIudHN2IikpKQppdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfIiwgImFsbCIpLCB1bmlxdWUoZGF0YSRBbm5vMikpCml0ZXJhdGVfbG9vcF9mdW5jdGlvbnMoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl8iLCAicy1zIiksIGMoIlMtUyIpKQppdGVyYXRlX2xvb3BfZnVuY3Rpb25zKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfIiwgInMtbiIpLCBjKCJTLU4iKSkKaXRlcmF0ZV9sb29wX2Z1bmN0aW9ucyhkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiXyIsICJuLW4iKSwgYygiTi1OIikpCgpjb2xvckxpc3QgPC0gY29sb3JMaXN0U3RydWN0dXJlCmxvb3BMaXN0IDwtIGMoIk4tTiIsICJTLU4iLCAiUy1TIikKCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIERNU08sIEFubm8yKQpjb2xuYW1lcyh0ZW1wKSA8LSBjKCJkaXN0YW5jZSIsICJzY29yZSIsICJBbm5vMiIpCmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX0RNU08iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpCmNyZWF0ZV9zY29yZV9iYXJwbG90X3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX0RNU08iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCkKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgZFRBRywgQW5ubzIpCmNvbG5hbWVzKHRlbXApIDwtIGMoImRpc3RhbmNlIiwgInNjb3JlIiwgIkFubm8yIikKY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfZFRBRyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QsIHNlID0gVFJVRSkKY3JlYXRlX3Njb3JlX2JhcnBsb3RfcGVyVHJlYXRtZW50KHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfZFRBRyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0KQp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBBNDg1LCBBbm5vMikKY29sbmFtZXModGVtcCkgPC0gYygiZGlzdGFuY2UiLCAic2NvcmUiLCAiQW5ubzIiKQpjcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9BNDg1IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcExpc3QsIGNvbG9yTGlzdCwgc2UgPSBUUlVFKQpjcmVhdGVfc2NvcmVfYmFycGxvdF9wZXJUcmVhdG1lbnQodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9BNDg1IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BMaXN0LCBjb2xvckxpc3QpCgp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBkaWZmX2RUQUdfRE1TTywgQW5ubzIpCmNvbG5hbWVzKHRlbXApIDwtIGMoImRpc3RhbmNlIiwgInNjb3JlIiwgIkFubm8yIikKY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX2RUQUciKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpCgp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBkaWZmX0E0ODVfRE1TTywgQW5ubzIpCmNvbG5hbWVzKHRlbXApIDwtIGMoImRpc3RhbmNlIiwgInNjb3JlIiwgIkFubm8yIikKY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudCh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX0E0ODUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IFRSVUUpCgpgYGAKCiMjIyBbMi43XSBEaXN0YW5jZSB2cyBsb29wICMgYW5kIHNjb3JlCmBgYHtyfQpkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfc2NvcmUudHN2IikpICU+JQogIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsCiAgICAgICAgICAgICAgICByZXMgPSBlbmQxIC0gc3RhcnQxKQoKcDEgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZGlzdGFuY2UsIGZpbGwgPSBmYWN0b3IocmVzKSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUwMDAwLCBhbHBoYSA9IDEpICsKICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBEaXN0YW5jZSBieSBSZXNvbHV0aW9uIiwKICAgICAgIHggPSAiRGlzdGFuY2UiLAogICAgICAgeSA9ICJDb3VudHMiKSArIAogIGZhY2V0X3dyYXAofiByZXMsIG5jb2wgPSAxLCBzY2FsZXMgPSAiZnJlZSIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iLCBsaW1pdHMgPSBjKDAsIDVlNikpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpICAjIFJlbW92ZXMgdGhlIGxlZ2VuZAoKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoImNvbnNlbnN1c19kaXN0X3Blcl9yZXMucG5nIikpLCAKICAgIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDMsIGhlaWdodCA9IDYpCnByaW50KHAxKQpkZXYub2ZmKCkKCnAyIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGRpc3RhbmNlLCBmaWxsID0gZmFjdG9yKHJlcykpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDAwMCwgYWxwaGEgPSAxKSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgRGlzdGFuY2UgYnkgUmVzb2x1dGlvbiIsCiAgICAgICB4ID0gIkRpc3RhbmNlIiwKICAgICAgIHkgPSAiQ291bnRzIikgKyAKICBmYWNldF93cmFwKH4gcmVzLCBuY29sID0gMSwgc2NhbGVzID0gImZyZWUiKSArIAogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYiwgbGltaXRzID0gYygwLCAyZTYpKSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKSAgIyBSZW1vdmVzIHRoZSBsZWdlbmQKCgpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMCgiY29uc2Vuc3VzX2Rpc3RfcGVyX3Jlc18ybWIucG5nIikpLCAKICAgIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDMsIGhlaWdodCA9IDYpCnByaW50KHAyKQpkZXYub2ZmKCkKCgpgYGAKCgpgYGB7cn0KIyMjIERpc3RhbmNlIHZzIHNjb3JlCiAgCiAgdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgRE1TTywgZFRBRywgQTQ4NSkKICAKICBhdmdfc2NvcmVzIDwtIHRlbXAgJT4lCiAgICBncm91cF9ieShkaXN0YW5jZSkgJT4lCiAgICBzdW1tYXJpc2UoYWNyb3NzKHN0YXJ0c193aXRoKCJETVNPIik6c3RhcnRzX3dpdGgoIkE0ODUiKSwgbWVhbiwgbmEucm0gPSBUUlVFKSkKICAKICBhdmdfc2NvcmVzX2xvbmcgPC0gYXZnX3Njb3JlcyAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gRE1TTzpBNDg1LCBuYW1lc190byA9ICJjb25kaXRpb24iLCB2YWx1ZXNfdG8gPSAiYXZnX3Njb3JlIikKICBhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uIDwtIGZhY3Rvcihhdmdfc2NvcmVzX2xvbmckY29uZGl0aW9uLCBsZXZlbHMgPSBjKCJETVNPIiwgImRUQUciLCAiQTQ4NSIpKQogICMgQ3JlYXRlIHRoZSBwbG90CiAgcDQgPC0gZ2dwbG90KGF2Z19zY29yZXNfbG9uZywgYWVzKHggPSBkaXN0YW5jZSwgeSA9IGF2Z19zY29yZSwgY29sb3IgPSBjb25kaXRpb24sIGZpbGwgPSBjb25kaXRpb24pKSArCiAgICBnZW9tX3Ntb290aChzaG93LmxlZ2VuZCA9IFRSVUUpICsgeWxpbSgwLCAwLjUpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJETVNPIiA9ICJncmV5IiwgImRUQUciID0gInBpbmsiLCAiQTQ4NSIgPSAic2t5Ymx1ZSIpKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJETVNPIiA9ICJncmV5ODAiLCAiZFRBRyIgPSAicGluayIsICJBNDg1IiA9ICJza3libHVlIikpICsKICAgIGxhYnModGl0bGUgPSBwYXN0ZTAoIkRpc3RhbmNlIHZzLiBBdmVyYWdlIFNjb3JlLCAiLCBub3RlKSwKICAgICAgICAgeCA9ICJEaXN0YW5jZSIsCiAgICAgICAgIHkgPSAiQXZlcmFnZSBTY29yZSIpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMCgiY29uc2Vuc3VzX2Rpc3RfdnNfYXZnU2NvcmVfYWxsUmVzX3B1MTAwcHoxMDBfIiwgbm90ZSwgIi5wbmciKSksIAogICAgICByZXMgPSA2MDAsIHVuaXRzID0gImluIiwgd2lkdGggPSA0LCBoZWlnaHQgPSAzKQogIHByaW50KHA0KQogIGRldi5vZmYoKQoKYGBgCgojIyMgWzIuOF0gQW5ub3RhdGluZyBnZW5lcyB0byBQLVAgYW5kIFAtRSBsb29wcwojIyMjIExpbmsgZ2VuZSB0byBwcm9tb3RlciBhbmNob3IKSGVyZSwgYW5jaG9yIHdhcyBsaW5rZWQgdG8gYSBnZW5lIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGFuY2hvciBvdmVybGFwcyB3aXRoIFRTUyArLSAyLjVrYiByZWdpb24KYGBge3J9CiMgQW5ub3RhdGluZyBnZW5lcyBiYXNlZCBvbiBwcm9tb3RlciBhbmNob3IKbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICIudHN2IikpKQpgYGAKCgpgYGB7cn0KZmxhbmtTaXplIDwtIDI1MDAKZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWQiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gIisiLCBWMiwgVjMpLAogICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsCiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JQogIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY0LCBWNSwgVjYpCmNvbG5hbWVzKGdlbmUuVFNTLnRiKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJnZW5lIiwgImVuc2VtYmwiKQoKZndyaXRlKGdlbmUuVFNTLnRiLCBoZXJlKHJlZkRpciwgIm1tMTBfR1JDbTM4LnA2X1RTUzIuNWtiLmJlZCIpLCBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSwgcm93Lm5hbWVzID0gRkFMU0UpCgpmaW5kT3ZlcmxhcEdlbmUgPC0gZnVuY3Rpb24oZ2VuZS5UU1MudGIsIGNocm9tMSwgc3RhcnQxLCBlbmQxKXsKICB0ZW1wIDwtIGdlbmUuVFNTLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbTEpICU+JQogICAgZHBseXI6OmZpbHRlcigoc3RhcnQgPD0gZW5kMSkgJiAoZW5kID49IHN0YXJ0MSkpCiAgcmV0dXJuKHRlbXAkZ2VuZSkKfQpmaW5kT3ZlcmxhcEVuc2VtYmwgPC0gZnVuY3Rpb24oZ2VuZS5UU1MudGIsIGNocm9tMSwgc3RhcnQxLCBlbmQxKXsKICB0ZW1wIDwtIGdlbmUuVFNTLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbTEpICU+JQogICAgZHBseXI6OmZpbHRlcigoc3RhcnQgPD0gZW5kMSkgJiAoZW5kID49IHN0YXJ0MSkpCiAgcmV0dXJuKHRlbXAkZW5zZW1ibCkKfQoKdGVtcCA8LSBkYXRhICU+JSByb3d3aXNlKCkgJT4lCiAgZHBseXI6Om11dGF0ZShBMV9nZW5lID0gaWZlbHNlKEExID09ICJQIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChmaW5kT3ZlcmxhcEdlbmUoZ2VuZS5UU1MudGIsIGNocm9tMSwgc3RhcnQxLCBlbmQxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSwKICAgICAgICAgICAgICAgIEEyX2dlbmUgPSBpZmVsc2UoQTIgPT0gIlAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwR2VuZShnZW5lLlRTUy50YiwgY2hyb20yLCBzdGFydDIsIGVuZDIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLAogICAgICAgICAgICAgICAgZ2VuZSA9IGxpc3QodW5pcXVlKGMoQTFfZ2VuZSwgQTJfZ2VuZSkpKSkKCnRlbXBfcF9uIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJQLVAiLCAiUC1FIiwgIlAtUyIsICJQLVgiKSkgJT4lIGRwbHlyOjpzZWxlY3QoLWMoIkExX2dlbmUiLCAiQTJfZ2VuZSIpKQpmd3JpdGUodGVtcF9wX24sIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIl9wLW5fZ2VuZUxpc3QudHN2IikpLCBzZXAgPSAiXHQiKQoKdGVtcF9wX3BlIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJQLVAiLCAiUC1FIikpICU+JSBkcGx5cjo6c2VsZWN0KC1jKCJBMV9nZW5lIiwgIkEyX2dlbmUiKSkKZndyaXRlKHRlbXBfcF9wZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3AtcGVfZ2VuZUxpc3QudHN2IikpLCBzZXAgPSAiXHQiKQoKdGVtcCA8LSBkYXRhICU+JSByb3d3aXNlKCkgJT4lCiAgZHBseXI6Om11dGF0ZShBMV9nZW5lID0gaWZlbHNlKEExID09ICJQIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChmaW5kT3ZlcmxhcEVuc2VtYmwoZ2VuZS5UU1MudGIsIGNocm9tMSwgc3RhcnQxLCBlbmQxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSwKICAgICAgICAgICAgICAgIEEyX2dlbmUgPSBpZmVsc2UoQTIgPT0gIlAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGZpbmRPdmVybGFwRW5zZW1ibChnZW5lLlRTUy50YiwgY2hyb20yLCBzdGFydDIsIGVuZDIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpLAogICAgICAgICAgICAgICAgZ2VuZSA9IGxpc3QodW5pcXVlKGMoQTFfZ2VuZSwgQTJfZ2VuZSkpKSkKCnRlbXBfcF9uIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJQLVAiLCAiUC1FIiwgIlAtUyIsICJQLVgiKSkgJT4lIGRwbHlyOjpzZWxlY3QoLWMoIkExX2dlbmUiLCAiQTJfZ2VuZSIpKQpmd3JpdGUodGVtcF9wX24sIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIl9wLW5fZW5zZW1ibExpc3QudHN2IikpLCBzZXAgPSAiXHQiKQoKdGVtcF9wX3BlIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJQLVAiLCAiUC1FIikpICU+JSBkcGx5cjo6c2VsZWN0KC1jKCJBMV9nZW5lIiwgIkEyX2dlbmUiKSkKZndyaXRlKHRlbXBfcF9wZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3AtcGVfZW5zZW1ibExpc3QudHN2IikpLCBzZXAgPSAiXHQiKQoKYGBgCiMjIyBbMi45XSBTaXplIGRpc3RyaWJ1dGlvbiBvZiBkaWZmIGxvb3BzCgpgYGB7cn0KY3JlYXRlX2Rpc3RfYmFycGxvdCA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIG5vdGUsIGxvb3BMaXN0LCBkaWZmQ3V0b2ZmKXsKICB0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoQW5ubzIsIGRpc3RhbmNlLCB1cGRvd25fZFRBR19ETVNPLCB1cGRvd25fQTQ4NV9ETVNPKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBsb29wTGlzdCwKICAgICAgICAgICAgICAgICAgdXBkb3duX2RUQUdfRE1TTyAlaW4lIGMoIlVQIiwgIk5PIiwgIkRPV04iKSkKICBwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHVwZG93bl9kVEFHX0RNU08sIHkgPSBkaXN0YW5jZSkpICsKICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gdXBkb3duX2RUQUdfRE1TTykpICsgCiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKwogICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHVwZG93bl9kVEFHX0RNU08pLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKG5vdGUpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikKICBmaWxlTmFtZSA8LSBwYXN0ZTAoInNpemVfYmFycGxvdF8iLCBuYW1lLCAiX2RUQUdfdnNfRE1TT18iLCBub3RlLCAiXyIsIGRpZmZDdXRvZmYpCiAgaGVpZ2h0IDwtIDMKICB3aWR0aCA8LSA0CiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCiAgCiAgCiAgdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KEFubm8yLCBkaXN0YW5jZSwgdXBkb3duX2RUQUdfRE1TTywgdXBkb3duX0E0ODVfRE1TTykgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgbG9vcExpc3QsCiAgICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gJWluJSBjKCJVUCIsICJOTyIsICAiRE9XTiIpKQogIHAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gdXBkb3duX0E0ODVfRE1TTywgeSA9IGRpc3RhbmNlKSkgKwogICAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSB1cGRvd25fQTQ4NV9ETVNPKSkgKyAKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gdXBkb3duX0E0ODVfRE1TTyksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUobm90ZSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKQogIGZpbGVOYW1lIDwtIHBhc3RlMCgic2l6ZV9iYXJwbG90XyIsIG5hbWUsICJfQTQ4NV92c19ETVNPXyIsIG5vdGUsICJfIiwgZGlmZkN1dG9mZikKICBoZWlnaHQgPC0gMwogIHdpZHRoIDwtIDQKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKfQoKCm5hbWUKZGlmZkN1dG9mZiA8LSAwLjIKbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICIudHN2IikpKQpkYXRhIDwtIGRhdGEgJT4lCiAgZHBseXI6Om11dGF0ZSh1cGRvd25fZFRBR19ETVNPID0gaWZlbHNlKGRpZmZfZFRBR19ETVNPID4gZGlmZkN1dG9mZiwgIlVQIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCAiTk8iLCAiRE9XTiIpKSwKICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiBkaWZmQ3V0b2ZmLCAiVVAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsICJOTyIsICJET1dOIikpLAogICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpCmRhdGEkdXBkb3duX2RUQUdfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fZFRBR19ETVNPLCBsZXZlbHMgPSBjKCJVUCIsICJOTyIsICJET1dOIikpCmRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKCJVUCIsICJOTyIsICJET1dOIikpCmNyZWF0ZV9kaXN0X2JhcnBsb3QoZGF0YSwgZmlnRGlyLCBuYW1lLCAicC1uIiwgYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIiksIDAuMikKY3JlYXRlX2Rpc3RfYmFycGxvdChkYXRhLCBmaWdEaXIsIG5hbWUsICJwLXBlIiwgYygiUC1QIiwgIlAtRSIpLCAwLjIpCmNyZWF0ZV9kaXN0X2JhcnBsb3QoZGF0YSwgZmlnRGlyLCBuYW1lLCAicGUtcGUiLCBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpLCAwLjIpCmNyZWF0ZV9kaXN0X2JhcnBsb3QoZGF0YSwgZmlnRGlyLCBuYW1lLCAic3RyIiwgYygiUy1TIiwgIlMtWCIpLCAwLjIpCgpgYGAKIyMjIFsyLjEwXSBMaW5raW5nIHdpdGggUk5BLXNlcS9QUk8tc2VxCiMjIyMgRnVuY3Rpb24gJiBwYXJhbWV0ZXIKYGBge3J9CkdPZGlyIDwtIGhlcmUoIi4uLy4uIiwgInJlc3VsdCIsICJsb29wIiwgIkdPIikKZGlyLmNyZWF0ZShHT2Rpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpCgpnZXRHTyA8LSBmdW5jdGlvbihuYW1lLCBmaWdEaXIsIGdlbmVMaXN0LCBjYXRlZ29yeU51bSA9IDE1LCBoZWlnaHQgPSAxMCwgd2lkdGggPSA3KXsKICBHTyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQogIEdPLnJlYWRhYmxlIDwtIHNldFJlYWRhYmxlKEdPLCBPcmdEYiA9IG9yZy5NbS5lZy5kYikKICBmd3JpdGUoYXMuZGF0YS5mcmFtZShHTyksIGhlcmUoR09kaXIsIHBhc3RlMCgiR09fIiwgbmFtZSwgIl9lbnNlbWJsLnRzdiIpKSwgc2VwID0gIlx0IikKICBmd3JpdGUoYXMuZGF0YS5mcmFtZShHTy5yZWFkYWJsZSksIGhlcmUoR09kaXIsIHBhc3RlMCgiR09fIiwgbmFtZSwgIl9yZWFkYWJsZS50c3YiKSksIHNlcCA9ICJcdCIpCiAgCiAgaWYobnJvdyhhcy5kYXRhLmZyYW1lKEdPKSkgIT0gMCl7CiAgICAjIyMjIwogICAgZmlsZU5hbWUgPC0gcGFzdGUwKCJHT18iLCBuYW1lKQogICAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogICAgcHJpbnQoZG90cGxvdChHTywgc2hvd0NhdGVnb3J5ID0gY2F0ZWdvcnlOdW0sIHRpdGxlID0gbmFtZSkgKyAKICAgICAgICAgICAgc2NhbGVfY29sb3JfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDAuMDUpLCBsb3cgPSAicmVkIiwgaGlnaCA9ICJibGFjayIpKQogICAgZGV2Lm9mZigpCiAgICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCwgcmVzID0gNjAwLCB1bml0ID0gImluIikKICAgIHByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IGNhdGVnb3J5TnVtLCB0aXRsZSA9IG5hbWUpICsgCiAgICAgICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gInJlZCIsIGhpZ2ggPSAiYmxhY2siKSkKICAgIGRldi5vZmYoKQogIH0gCn0KCmNvbnZQdmFsdWUgPC0gZnVuY3Rpb24ocHZhbHVlKXsKICBvdXQgPC0gaWZlbHNlKHB2YWx1ZSA8IDAuMDAwMSwgIioqKioiLAogICAgICAgICAgICAgICAgaWZlbHNlKHB2YWx1ZSA8IDAuMDAxLCAiKioqIiwKICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocHZhbHVlIDwgMC4wMSwgIioqIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHB2YWx1ZSA8IDAuMDUsICIqIiwgIm5zIikpKSkKICByZXR1cm4ob3V0KQp9Cgpsb2FkTG9vcEFubm9EYXRhIDwtIGZ1bmN0aW9uKGZpbGVOYW1lLCBkaWZmQ3V0b2ZmID0gMC4yLCBhbm5vTGlzdCA9IGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIpKXsKICBkYXRhIDwtIGZyZWFkKGZpbGVOYW1lKSAlPiUKICAgIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsICJVUCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCAiTk8iLCAiRE9XTiIpKSwKICAgICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsICJVUCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkaWZmX0E0ODVfRE1TTyA+IC1kaWZmQ3V0b2ZmLCAiTk8iLCAiRE9XTiIpKSwKICAgICAgICAgICAgICAgICAgZ2VuZSA9IHN0cnNwbGl0KGdlbmUsICdcXHwnKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgIGFubm9MaXN0KQogIGRhdGEkdXBkb3duX2RUQUdfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fZFRBR19ETVNPLCBsZXZlbHMgPSBjKCJVUCIsICJOTyIsICJET1dOIikpCiAgZGF0YSR1cGRvd25fQTQ4NV9ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9BNDg1X0RNU08sIGxldmVscyA9IGMoIlVQIiwgIk5PIiwgIkRPV04iKSkKICAKICByZXR1cm4oZGF0YSkKfQpgYGAKCiMjIyMgZFRBRyBTY2F0dGVycGxvdApgYGB7cn0KbG9vcFR5cGUgPC0gInAtbiIKCiMgZ2V0dGluZyBsaXN0IG9mIGdlbmVzIG9mIGludGVyZXN0IGZyb20gUk5BLXNlcSBhbmQgUFJPLXNlcQphbHBoYSA8LSAwLjA1CmZjQ3V0b2ZmIDwtIDAuNQpkaWZmLlBSTy5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMUcyLmRUQUdfRzEuZFRBR192c19HMS5ETVNPX1BST3NlcS50c3YiKSkgJT4lCiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpCmRpZmYuUFJPLkcyLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxRzIuZFRBR19HMi5kVEFHX3ZzX0cyLkRNU09fUFJPc2VxLnRzdiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZikKZGlmZi5STkEuRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKQpkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSkKIyBJbXBvcnRpbmcgbG9vcCBnZW5lIGFubm90YXRpb24KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKCmRpZmZDdXRvZmYgPC0gMC4yCmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIl9wLW5fZW5zZW1ibExpc3QudHN2IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIikpJT4lCiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkKIyBnZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICJfcC1uX2Vuc2VtYmxMaXN0LnRzdiIpKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKCJQLVAiKSklPiUgCiMgICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKQojIFRlc3RpbmcgZGlmZmVyZW50IHdheXMgdG8gY2FsY3VsYXRlIHJlcHJlc2VudGF0aXZlIGZlYXR1cmUgb2YgbG9vcHMgZm9yIGVhY2ggZ2VuZQpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCmdlbmVMaXN0LmRvd24gPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQpKQpnZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkCmdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkCmdlbmVMaXN0LnVwZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmKSRlbnNlbWJsX2dlbmVfaWQKCmdlbmVMaXN0LnVwIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQpKQoKCiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmUKIyMgUk5BIG9ubHkKZmNDdXRvZmYgPC0gMC41CmFscGhhIDwtIDAuMDUKbWF4TG9nMkZDIDwtIDIKCnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgCiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsICIyRE9XTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCAiMVVQIiwgIjBOTyIpKSwKICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLAogICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSAKICBkcGx5cjo6YXJyYW5nZShmbGFnKQoKI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgImdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLW4udHN2IiksIHNlcCA9ICJcdCIpCgojCiMgcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywKIyAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSAiME5PIiwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksCiMgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgKwojICAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKwojICAgZ2d0aXRsZSgiZFRBRyIpICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIjBOTyIgPSAiZ3JleSIsICIxVVAiID0gInJlZCIsICIyRE9XTiIgPSAiYmx1ZSIpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nCiMgICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAyLCAiRkFMU0UiID0gMTkpKQojCiMgZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR18iLCBsb29wVHlwZSwgIl9kaWZmQ3V0b2ZmXyIsIGRpZmZDdXRvZmYpCiMgaGVpZ2h0IDwtIDQKIyB3aWR0aCA8LSA3CiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiMgcHJpbnQocCkKIyBkZXYub2ZmKCkKIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQojIHByaW50KHApCiMgZGV2Lm9mZigpCgojIE5vIEZDIGN1dG9mZiBvcHRpb24gLSBkb3duIG9ubHkKdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9kVEFHX0RNU08sIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJykKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmLCAiMkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgIjFVUCIsICIwTk8iKSksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykKCiMgZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoImdlbmVfYXZnU2NvcmVfZmNfZFRBR18iLCBsb29wVHlwZSwgIl9ub0ZDY3V0b2ZmLnRzdiIpKSwgc2VwID0gIlx0IikKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hyaW5rZWRfbG9nMkZDLCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIAogICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSAiME5PIiwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAxLCBhbHBoYSA9IDEsCiAgICAgIHN0cm9rZSA9IDApICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBndWlkZXMoY29sb3IgPSAibm9uZSIsIHNoYXBlID0gIm5vbmUiKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMSwKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICAgICAgICAgbGluZWVuZCA9ICJzcXVhcmUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYyhkaWZmQ3V0b2ZmLCAtZGlmZkN1dG9mZiksIGxpbmV0eXBlID0gImRhc2hlZCIsIGFscGhhID0gMSwKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICAgICAgICAgbGluZWVuZCA9ICJzcXVhcmUiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAxLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgICAgICAgICBsaW5lZW5kID0gInNxdWFyZSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKGZjQ3V0b2ZmLCAtZmNDdXRvZmYpLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBhbHBoYSA9IDEsCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgICAgICAgIGxpbmVlbmQgPSAic3F1YXJlIikgKwogIHRoZW1lKAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLCAgICAKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkgKyBsYWJzKHkgPSAiQXZnLiDOlCBsb29wIHNjb3JlIiwgeCA9ICJsb2cyKHNocnVua2VuIEZDKSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiME5PIiA9ICIjQTlBOEE5IiwgIjFVUCIgPSAiI0NCMzMzQSIsICIyRE9XTiIgPSAiIzQ4NTJBMCIpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIlRSVUUiID0gMiwgIkZBTFNFIiA9IDE5KSkKCmZpbGVOYW1lIDwtIHBhc3RlMCgibG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfIiwgbG9vcFR5cGUsICJfZGlmZkN1dG9mZl8iLCBkaWZmQ3V0b2ZmLCAiX25vRkNjdXRvZmYiKQpoZWlnaHQgPC0gNDIqbW1Ub0luY2gKd2lkdGggPC0gNTAqbW1Ub0luY2gKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCiMgTm8gRkMgY3V0b2ZmIG9wdGlvbiAtIHVwIGFuZCBkb3duCnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgCiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXBkb3duLlJOQS5ub0ZDY3V0b2ZmLCAiMkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgIjFVUCIsICIwTk8iKSksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykKCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmlua2VkX2xvZzJGQywgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gIjBOTyIsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBnZ3RpdGxlKCJkVEFHIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIwTk8iID0gImdyZXkiLCAiMVVQIiA9ICJyZWQiLCAiMkRPV04iID0gImJsdWUiKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9IDIsICJGQUxTRSIgPSAxOSkpCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ192c19hdmdTY29yZV9kVEFHXyIsIGxvb3BUeXBlLCAiX2RpZmZDdXRvZmZfIiwgZGlmZkN1dG9mZiwgIl9ub0ZDY3V0b2ZmdXBkb3duIikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gNwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKIyAKIyAjIyBSTkEgKyBQUk8tc2VxCiMgdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9kVEFHX0RNU08sIGdlbmUpICU+JSAKIyAgIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lCiMgICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpCiMgCiMgdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibF9nZW5lX2lkIikpICU+JSAKIyAgIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93biwgIjJET1dOIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLCAiMVVQIiwgIjBOTyIpKSwKIyAgICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksCiMgICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiMgICBkcGx5cjo6YXJyYW5nZShmbGFnKQojIAojIGZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgImdlbmVfYXZnU2NvcmVfZmNfZFRBR18iLCBsb29wVHlwZSwgIi50c3YiKSwgc2VwID0gIlx0IikKIyAKIyBwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCAKIyAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSAiME5PIiwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksCiMgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgKwojICAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKIyAgIGdndGl0bGUoImRUQUciKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsgCiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiME5PIiA9ICJncmV5IiwgIjFVUCIgPSAicmVkIiwgIjJET1dOIiA9ICJibHVlIikpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmcKIyAgIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9IDIsICJGQUxTRSIgPSAxOSkpCiMgCiMgZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR18iLCBsb29wVHlwZSwgIl9kaWZmQ3V0b2ZmXyIsIGRpZmZDdXRvZmYsICJfUk5BLVBSTyIpCiMgaGVpZ2h0IDwtIDQKIyB3aWR0aCA8LSA3CiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiMgcHJpbnQocCkKIyBkZXYub2ZmKCkKIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQojIHByaW50KHApCiMgZGV2Lm9mZigpCmBgYAoKCiMjIyMgZFRBRyBTY2F0dGVycGxvdCBPRQojIyMjIyBBdmcKYGBge3J9Cgpsb29wVHlwZSA8LSAicC1wZSIKCiMgZ2V0dGluZyBsaXN0IG9mIGdlbmVzIG9mIGludGVyZXN0IGZyb20gUk5BLXNlcSBhbmQgUFJPLXNlcQphbHBoYSA8LSAwLjA1CmZjQ3V0b2ZmIDwtIDAuNQpkaWZmLlBSTy5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMUcyLmRUQUdfRzEuZFRBR192c19HMS5ETVNPX1BST3NlcS50c3YiKSkgJT4lCiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpCmRpZmYuUFJPLkcyLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxRzIuZFRBR19HMi5kVEFHX3ZzX0cyLkRNU09fUFJPc2VxLnRzdiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZikKZGlmZi5STkEuRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKQpkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSkKIyBJbXBvcnRpbmcgbG9vcCBnZW5lIGFubm90YXRpb24KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKCmRpZmZDdXRvZmYgPC0gMC4yCmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIl9wLW5fZW5zZW1ibExpc3QudHN2IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIikpJT4lIAogIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpCgoKIyBMb2FkaW5nIE9FIGxvb3Agc2NvcmUKbWluVmFsdWUgPC0gLTQKb2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoImxvb3BTY29yZV9jb25zX29ic2V4cC50c3YiKSkpICU+JQogIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTywKICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pCgpnZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoImlkIikpCgojIFRlc3RpbmcgZGlmZmVyZW50IHdheXMgdG8gY2FsY3VsYXRlIHJlcHJlc2VudGF0aXZlIGZlYXR1cmUgb2YgbG9vcHMgZm9yIGVhY2ggZ2VuZQpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCmdlbmVMaXN0LmRvd24gPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQpKQpnZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkCmdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkCmdlbmVMaXN0LnVwZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmKSRlbnNlbWJsX2dlbmVfaWQKCmdlbmVMaXN0LnVwIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQpKQoKCiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmUKIyMgUk5BIG9ubHkKZmNDdXRvZmYgPC0gMC41CmFscGhhIDwtIDAuMDUKbWF4TG9nMkZDIDwtIDIKCnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKQoKdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibF9nZW5lX2lkIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCAiMkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgIjFVUCIsICIwTk8iKSksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykKCiNmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsICJnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1uLnRzdiIpLCBzZXAgPSAiXHQiKQoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9ICIwTk8iLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSwKICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgKwogIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgZ2d0aXRsZSgiZFRBRyIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiME5PIiA9ICJncmV5IiwgIjFVUCIgPSAicmVkIiwgIjJET1dOIiA9ICJibHVlIikpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmcKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAyLCAiRkFMU0UiID0gMTkpKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19PRV8iLCBsb29wVHlwZSwgIl9hdmdMb2dPRSIpCmhlaWdodCA8LSA0CndpZHRoIDwtIDcKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCiMgTm8gRkMgY3V0b2ZmIG9wdGlvbiAtIGRvd24gb25seQp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgCiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJykKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmLCAiMkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgIjFVUCIsICIwTk8iKSksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykKCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmlua2VkX2xvZzJGQywgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gIjBOTyIsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBnZ3RpdGxlKCJkVEFHIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIwTk8iID0gImdyZXkiLCAiMVVQIiA9ICJyZWQiLCAiMkRPV04iID0gImJsdWUiKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9IDIsICJGQUxTRSIgPSAxOSkpCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ192c19hdmdTY29yZV9kVEFHX09FXyIsIGxvb3BUeXBlLCAiX2F2Z0xvZ09FX25vRkNjdXRvZmYiKQpoZWlnaHQgPC0gNAp3aWR0aCA8LSA3CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAojIyMjIyBTdW0KYGBge3J9CiMgZ2V0dGluZyBsaXN0IG9mIGdlbmVzIG9mIGludGVyZXN0IGZyb20gUk5BLXNlcSBhbmQgUFJPLXNlcQphbHBoYSA8LSAwLjA1CmZjQ3V0b2ZmIDwtIDAuNQpkaWZmLlBSTy5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMUcyLmRUQUdfRzEuZFRBR192c19HMS5ETVNPX1BST3NlcS50c3YiKSkgJT4lCiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpCmRpZmYuUFJPLkcyLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxRzIuZFRBR19HMi5kVEFHX3ZzX0cyLkRNU09fUFJPc2VxLnRzdiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZikKZGlmZi5STkEuRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKQpkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSkKIyBJbXBvcnRpbmcgbG9vcCBnZW5lIGFubm90YXRpb24KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKCmRpZmZDdXRvZmYgPC0gMC4yCmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIl9wLW5fZW5zZW1ibExpc3QudHN2IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIikpJT4lIAogIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpCgoKIyBMb2FkaW5nIE9FIGxvb3Agc2NvcmUKbWluVmFsdWUgPC0gLTQKb2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoImxvb3BTY29yZV9jb25zX29ic2V4cC50c3YiKSkpICU+JQogIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTywKICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pCgpnZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoImlkIikpCgojIFRlc3RpbmcgZGlmZmVyZW50IHdheXMgdG8gY2FsY3VsYXRlIHJlcHJlc2VudGF0aXZlIGZlYXR1cmUgb2YgbG9vcHMgZm9yIGVhY2ggZ2VuZQpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCmdlbmVMaXN0LmRvd24gPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZi5QUk8uRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQpKQpnZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkCmdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYgPC0gKGRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkCmdlbmVMaXN0LnVwZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmKSRlbnNlbWJsX2dlbmVfaWQKCmdlbmVMaXN0LnVwIDwtIHVuaXF1ZShjKChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMi5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IDApKSRlbnNlbWJsX2dlbmVfaWQpKQoKCiMgWzFdIEF2ZXJhZ2Ugb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmUKIyMgUk5BIG9ubHkKZmNDdXRvZmYgPC0gMC41CmFscGhhIDwtIDAuMDUKbWF4TG9nMkZDIDwtIDIKCnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBzdW0obG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsICIyRE9XTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCAiMVVQIiwgIjBOTyIpKSwKICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLAogICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSAKICBkcGx5cjo6YXJyYW5nZShmbGFnKQoKI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgImdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLW4udHN2IiksIHNlcCA9ICJcdCIpCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gIjBOTyIsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBnZ3RpdGxlKCJkVEFHIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIwTk8iID0gImdyZXkiLCAiMVVQIiA9ICJyZWQiLCAiMkRPV04iID0gImJsdWUiKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9IDIsICJGQUxTRSIgPSAxOSkpCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ192c19hdmdTY29yZV9kVEFHX09FX3Atbl9zdW1Mb2dPRSIpCmhlaWdodCA8LSA0CndpZHRoIDwtIDcKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCiMgTm8gRkMgY3V0b2ZmIG9wdGlvbiAtIGRvd24gb25seQp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBnZW5lKSAlPiUgCiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gc3VtKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKQoKdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibF9nZW5lX2lkIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLm5vRkNjdXRvZmYsICIyRE9XTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCAiMVVQIiwgIjBOTyIpKSwKICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLAogICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSAKICBkcGx5cjo6YXJyYW5nZShmbGFnKQoKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hyaW5rZWRfbG9nMkZDLCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIAogICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSAiME5PIiwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICsKICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIAogIGdndGl0bGUoImRUQUciKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIjBOTyIgPSAiZ3JleSIsICIxVVAiID0gInJlZCIsICIyRE9XTiIgPSAiYmx1ZSIpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIlRSVUUiID0gMiwgIkZBTFNFIiA9IDE5KSkKCmZpbGVOYW1lIDwtIHBhc3RlMCgibG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfcC1uX3N1bUxvZ09FX25vRkNjdXRvZmYiKQpoZWlnaHQgPC0gNAp3aWR0aCA8LSA3CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKIyMjIyMgYWJzIG1heApgYGB7cn0KIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxCmFscGhhIDwtIDAuMDUKZmNDdXRvZmYgPC0gMC41CmRpZmYuUFJPLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxRzIuZFRBR19HMS5kVEFHX3ZzX0cxLkRNU09fUFJPc2VxLnRzdiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZikKZGlmZi5QUk8uRzIuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzFHMi5kVEFHX0cyLmRUQUdfdnNfRzIuRE1TT19QUk9zZXEudHN2IikpICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKQpkaWZmLlJOQS5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpCmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKQojIEltcG9ydGluZyBsb29wIGdlbmUgYW5ub3RhdGlvbgpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgoKZGlmZkN1dG9mZiA8LSAwLjIKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKCJQLVAiLCAiUC1FIiwgIlAtUyIsICJQLVgiKSklPiUgCiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkKCgojIExvYWRpbmcgT0UgbG9vcCBzY29yZQptaW5WYWx1ZSA8LSAtNApvYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdiIpKSkgJT4lCiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTykKCmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGxlZnRfam9pbihvYnNleHAsIGJ5ID0gYygiaWQiKSkKCiMgVGVzdGluZyBkaWZmZXJlbnQgd2F5cyB0byBjYWxjdWxhdGUgcmVwcmVzZW50YXRpdmUgZmVhdHVyZSBvZiBsb29wcyBmb3IgZWFjaCBnZW5lCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSkKZ2VuZUxpc3QuZG93biA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCkpCmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQKZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQKZ2VuZUxpc3QudXBkb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYpJGVuc2VtYmxfZ2VuZV9pZAoKZ2VuZUxpc3QudXAgPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCkpCgoKIyBbMV0gQXZlcmFnZSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZQojIyBSTkEgb25seQpmY0N1dG9mZiA8LSAwLjUKYWxwaGEgPC0gMC4wNQptYXhMb2cyRkMgPC0gMgoKdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZ2VuZSkgJT4lIAogIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU09bd2hpY2gubWF4KGFicyhsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSldLCAuZ3JvdXBzID0gJ2Ryb3AnKQoKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgIjJET1dOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksICIxVVAiLCAiME5PIikpLAogICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksCiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIAogIGRwbHlyOjphcnJhbmdlKGZsYWcpCgojZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCAiZ2VuZV9hdmdTY29yZV9mY19kVEFHX3Atbi50c3YiKSwgc2VwID0gIlx0IikKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWVhbl9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIAogICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSAiME5PIiwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICsKICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIAogIGdndGl0bGUoImRUQUciKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIjBOTyIgPSAiZ3JleSIsICIxVVAiID0gInJlZCIsICIyRE9XTiIgPSAiYmx1ZSIpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIlRSVUUiID0gMiwgIkZBTFNFIiA9IDE5KSkKCmZpbGVOYW1lIDwtIHBhc3RlMCgibG9nMkZDX3ZzX2F2Z1Njb3JlX2RUQUdfT0VfcC1uX2Fic0xvZ09FIikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gNwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKIyBObyBGQyBjdXRvZmYgb3B0aW9uIC0gZG93biBvbmx5CnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPW3doaWNoLm1heChhYnMobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTykpXSwgLmdyb3VwcyA9ICdkcm9wJykKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmLCAiMkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgIjFVUCIsICIwTk8iKSksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykKCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmlua2VkX2xvZzJGQywgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gIjBOTyIsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBnZ3RpdGxlKCJkVEFHIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIwTk8iID0gImdyZXkiLCAiMVVQIiA9ICJyZWQiLCAiMkRPV04iID0gImJsdWUiKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9IDIsICJGQUxTRSIgPSAxOSkpCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ192c19hdmdTY29yZV9kVEFHX09FX3Atbl9hYnNMb2dPRV9ub0ZDY3V0b2ZmIikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gNwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKIyMjIyMgQ2xvc2VzdCBQLU4gbG9vcApgYGB7cn0KIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxCmFscGhhIDwtIDAuMDUKZmNDdXRvZmYgPC0gMC41CmRpZmYuUFJPLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxRzIuZFRBR19HMS5kVEFHX3ZzX0cxLkRNU09fUFJPc2VxLnRzdiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZikKZGlmZi5QUk8uRzIuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzFHMi5kVEFHX0cyLmRUQUdfdnNfRzIuRE1TT19QUk9zZXEudHN2IikpICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKQpkaWZmLlJOQS5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpCmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKQojIEltcG9ydGluZyBsb29wIGdlbmUgYW5ub3RhdGlvbgpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgoKZGlmZkN1dG9mZiA8LSAwLjIKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKCJQLVAiLCAiUC1FIiwgIlAtUyIsICJQLVgiKSklPiUgCiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkKCgojIExvYWRpbmcgT0UgbG9vcCBzY29yZQptaW5WYWx1ZSA8LSAtNApvYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdiIpKSkgJT4lCiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTykKCmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGxlZnRfam9pbihvYnNleHAsIGJ5ID0gYygiaWQiKSkKCiMgVGVzdGluZyBkaWZmZXJlbnQgd2F5cyB0byBjYWxjdWxhdGUgcmVwcmVzZW50YXRpdmUgZmVhdHVyZSBvZiBsb29wcyBmb3IgZWFjaCBnZW5lCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSkKZ2VuZUxpc3QuZG93biA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCkpCmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQKZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQKZ2VuZUxpc3QudXBkb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYpJGVuc2VtYmxfZ2VuZV9pZAoKZ2VuZUxpc3QudXAgPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCkpCgoKIyBbMV0gQXZlcmFnZSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZQojIyBSTkEgb25seQpmY0N1dG9mZiA8LSAwLjUKYWxwaGEgPC0gMC4wNQptYXhMb2cyRkMgPC0gMgoKdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZ2VuZSwgZGlzdGFuY2UpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSAKICBzbGljZV9taW4oZGlzdGFuY2UsIHdpdGhfdGllcyA9IEZBTFNFKSAlPiUgCiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIC5ncm91cHMgPSAnZHJvcCcpCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsICIyRE9XTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCAiMVVQIiwgIjBOTyIpKSwKICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLAogICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSAKICBkcGx5cjo6YXJyYW5nZShmbGFnKQoKI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgImdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLW4udHN2IiksIHNlcCA9ICJcdCIpCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gIjBOTyIsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBnZ3RpdGxlKCJkVEFHIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIwTk8iID0gImdyZXkiLCAiMVVQIiA9ICJyZWQiLCAiMkRPV04iID0gImJsdWUiKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9IDIsICJGQUxTRSIgPSAxOSkpCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ192c19hdmdTY29yZV9kVEFHX09FX3Atbl9jbG9zZXN0TG9nT0UiKQpoZWlnaHQgPC0gNAp3aWR0aCA8LSA3CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgojIE5vIEZDIGN1dG9mZiBvcHRpb24gLSBkb3duIG9ubHkKdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZ2VuZSwgZGlzdGFuY2UpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHNsaWNlX21pbihkaXN0YW5jZSwgd2l0aF90aWVzID0gRkFMU0UpICU+JSAKICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgLmdyb3VwcyA9ICdkcm9wJykKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQS5ub0ZDY3V0b2ZmLCAiMkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGMoKSwgIjFVUCIsICIwTk8iKSksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykKCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmlua2VkX2xvZzJGQywgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gIjBOTyIsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBnZ3RpdGxlKCJkVEFHIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIwTk8iID0gImdyZXkiLCAiMVVQIiA9ICJyZWQiLCAiMkRPV04iID0gImJsdWUiKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9IDIsICJGQUxTRSIgPSAxOSkpCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ192c19hdmdTY29yZV9kVEFHX09FX3Atbl9jbG9zZXN0TG9nT0Vfbm9GQ2N1dG9mZiIpCmhlaWdodCA8LSA0CndpZHRoIDwtIDcKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgojIyMjIyBGYXJ0aGVzdCBQLU4gbG9vcApgYGB7cn0KIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxCmFscGhhIDwtIDAuMDUKZmNDdXRvZmYgPC0gMC41CmRpZmYuUFJPLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxRzIuZFRBR19HMS5kVEFHX3ZzX0cxLkRNU09fUFJPc2VxLnRzdiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZikKZGlmZi5QUk8uRzIuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzFHMi5kVEFHX0cyLmRUQUdfdnNfRzIuRE1TT19QUk9zZXEudHN2IikpICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKQpkaWZmLlJOQS5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpCmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKQojIEltcG9ydGluZyBsb29wIGdlbmUgYW5ub3RhdGlvbgpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgoKZGlmZkN1dG9mZiA8LSAwLjIKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKCJQLVAiLCAiUC1FIiwgIlAtUyIsICJQLVgiKSklPiUgCiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkKCgojIExvYWRpbmcgT0UgbG9vcCBzY29yZQptaW5WYWx1ZSA8LSAtNApvYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdiIpKSkgJT4lCiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTykKCmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGxlZnRfam9pbihvYnNleHAsIGJ5ID0gYygiaWQiKSkKCiMgVGVzdGluZyBkaWZmZXJlbnQgd2F5cyB0byBjYWxjdWxhdGUgcmVwcmVzZW50YXRpdmUgZmVhdHVyZSBvZiBsb29wcyBmb3IgZWFjaCBnZW5lCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSkKZ2VuZUxpc3QuZG93biA8LSB1bmlxdWUoYygoZGlmZi5STkEuRzEuZFRBRyAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAwKSkkZW5zZW1ibF9nZW5lX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmLlBSTy5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZCkpCmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQS5HMS5kVEFHICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQKZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiA8LSAoZGlmZi5STkEuRzEuZFRBRy5ub0ZDY3V0b2ZmICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IDApKSRlbnNlbWJsX2dlbmVfaWQKZ2VuZUxpc3QudXBkb3duLlJOQS5ub0ZDY3V0b2ZmIDwtIChkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYpJGVuc2VtYmxfZ2VuZV9pZAoKZ2VuZUxpc3QudXAgPC0gdW5pcXVlKGMoKGRpZmYuUk5BLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcxLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYuUFJPLkcyLmRUQUcgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gMCkpJGVuc2VtYmxfZ2VuZV9pZCkpCgoKIyBbMV0gQXZlcmFnZSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZQojIyBSTkEgb25seQpmY0N1dG9mZiA8LSAwLjUKYWxwaGEgPC0gMC4wNQptYXhMb2cyRkMgPC0gMgoKdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZ2VuZSwgZGlzdGFuY2UpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSAKICBzbGljZV9tYXgoZGlzdGFuY2UsIHdpdGhfdGllcyA9IEZBTFNFKSAlPiUgCiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIC5ncm91cHMgPSAnZHJvcCcpCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsICIyRE9XTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgYygpLCAiMVVQIiwgIjBOTyIpKSwKICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLAogICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSAKICBkcGx5cjo6YXJyYW5nZShmbGFnKQoKI2Z3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgImdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLW4udHN2IiksIHNlcCA9ICJcdCIpCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gIjBOTyIsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBnZ3RpdGxlKCJkVEFHIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIwTk8iID0gImdyZXkiLCAiMVVQIiA9ICJyZWQiLCAiMkRPV04iID0gImJsdWUiKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9IDIsICJGQUxTRSIgPSAxOSkpCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ192c19hdmdTY29yZV9kVEFHX09FX3Atbl9mYXJ0aGVzdExvZ09FIikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gNwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKIyBObyBGQyBjdXRvZmYgb3B0aW9uIC0gZG93biBvbmx5CnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIGdlbmUsIGRpc3RhbmNlKSAlPiUgCiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzbGljZV9tYXgoZGlzdGFuY2UsIHdpdGhfdGllcyA9IEZBTFNFKSAlPiUgCiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIC5ncm91cHMgPSAnZHJvcCcpCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEubm9GQ2N1dG9mZiwgIjJET1dOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBjKCksICIxVVAiLCAiME5PIikpLAogICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksCiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIAogIGRwbHlyOjphcnJhbmdlKGZsYWcpCgoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJpbmtlZF9sb2cyRkMsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9ICIwTk8iLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSwKICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgKwogIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgZ2d0aXRsZSgiZFRBRyIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiME5PIiA9ICJncmV5IiwgIjFVUCIgPSAicmVkIiwgIjJET1dOIiA9ICJibHVlIikpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmcKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAyLCAiRkFMU0UiID0gMTkpKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfdnNfYXZnU2NvcmVfZFRBR19PRV9wLW5fZmFydGhlc3RMb2dPRV9ub0ZDY3V0b2ZmIikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gNwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMgQTQ4NSBTY2F0dGVycGxvdAojIyMjIyBQLU4KYGBge3J9CiMgZ2V0dGluZyBsaXN0IG9mIGdlbmVzIG9mIGludGVyZXN0IGZyb20gUk5BLXNlcSBhbmQgUFJPLXNlcQphbHBoYSA8LSAwLjA1CmZjQ3V0b2ZmIDwtIDAuNQpkaWZmLlJOQS5HMS5BNDg1IDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKQoKIyBJbXBvcnRpbmcgbG9vcCBnZW5lIGFubm90YXRpb24KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKCmRpZmZDdXRvZmYgPC0gMC4yCmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIl9wLW5fZW5zZW1ibExpc3QudHN2IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIikpJT4lIAogIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpCgojIFRlc3RpbmcgZGlmZmVyZW50IHdheXMgdG8gY2FsY3VsYXRlIHJlcHJlc2VudGF0aXZlIGZlYXR1cmUgb2YgbG9vcHMgZm9yIGVhY2ggZ2VuZQpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKQpnZW5lTGlzdC5kb3duLlJOQSA8LSAoZGlmZi5STkEuRzEuQTQ4NSAlPiUgZHBseXI6OmZpbHRlcihzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYpKSRlbnNlbWJsX2dlbmVfaWQKZ2VuZUxpc3QudXAuUk5BIDwtIChkaWZmLlJOQS5HMS5BNDg1ICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmKSkkZW5zZW1ibF9nZW5lX2lkCgoKIyBbMV0gQXZlcmFnZSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZQojIyBSTkEgb25seQpmY0N1dG9mZiA8LSAwLjUKYWxwaGEgPC0gMC4wNQptYXhMb2cyRkMgPC0gNAoKdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfQTQ4NV9ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJykKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgIjJET1dOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsICIxVVAiLCAiME5PIikpLAogICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksCiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIAogIGRwbHlyOjphcnJhbmdlKGZsYWcpCgpmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsICJnZW5lX2F2Z1Njb3JlX2ZjX2RUQUdfcC1uLnRzdiIpLCBzZXAgPSAiXHQiKQoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9ICIwTk8iLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSwKICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgKwogIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgZ2d0aXRsZSgiQTQ4NSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiME5PIiA9ICJibGFjayIsICIxVVAiID0gInJlZCIsICIyRE9XTiIgPSAiYmx1ZSIpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIlRSVUUiID0gMiwgIkZBTFNFIiA9IDE5KSkKCmZpbGVOYW1lIDwtIHBhc3RlMCgibG9nMkZDX3ZzX2F2Z1Njb3JlX0E0ODVfcC1uX2RpZmZDdXRvZmZfIiwgZGlmZkN1dG9mZikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gNwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKIyBbMl0gU3VtIG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lCiMjIFJOQSBvbmx5CmZjQ3V0b2ZmIDwtIDAuNQphbHBoYSA8LSAwLjA1Cm1heExvZzJGQyA8LSA0Cgp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZ2VuZSkgJT4lIAogIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lCiAgc3VtbWFyaXplKHN1bV9kaWZmX3Njb3JlID0gc3VtKGRpZmZfQTQ4NV9ETVNPKSwgLmdyb3VwcyA9ICdkcm9wJykKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgIjJET1dOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsICIxVVAiLCAiME5PIikpLAogICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksCiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIAogIGRwbHlyOjphcnJhbmdlKGZsYWcpCgpmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsICJnZW5lX3N1bVNjb3JlX2ZjX2RUQUdfcC1uLnRzdiIpLCBzZXAgPSAiXHQiKQoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBzdW1fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gIjBOTyIsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBnZ3RpdGxlKCJBNDg1IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIwTk8iID0gImJsYWNrIiwgIjFVUCIgPSAicmVkIiwgIjJET1dOIiA9ICJibHVlIikpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmcKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAyLCAiRkFMU0UiID0gMTkpKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfdnNfc3VtU2NvcmVfQTQ4NV9wLW5fZGlmZkN1dG9mZl8iLCBkaWZmQ3V0b2ZmKQpoZWlnaHQgPC0gNAp3aWR0aCA8LSA3CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKIyBbM10gTWF4IG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lCiMjIFJOQSBvbmx5CmZjQ3V0b2ZmIDwtIDAuNQphbHBoYSA8LSAwLjA1Cm1heExvZzJGQyA8LSA0Cgp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZ2VuZSkgJT4lIAogIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lCiAgc3VtbWFyaXplKG1heF9hYnNfZGlmZl9zY29yZSA9IGRpZmZfQTQ4NV9ETVNPW3doaWNoLm1heChhYnMoZGlmZl9BNDg1X0RNU08pKV0sIC5ncm91cHMgPSAnZHJvcCcpCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsICIyRE9XTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCAiMVVQIiwgIjBOTyIpKSwKICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLAogICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSAKICBkcGx5cjo6YXJyYW5nZShmbGFnKQoKZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCAiZ2VuZV9tYXhBYnNTY29yZV9mY19kVEFHX3Atbi50c3YiKSwgc2VwID0gIlx0IikKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2hybG9nMmZjTWF4LCB5ID0gbWF4X2Fic19kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIAogICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSAiME5PIiwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICsKICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIAogIGdndGl0bGUoIkE0ODUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIjBOTyIgPSAiYmxhY2siLCAiMVVQIiA9ICJyZWQiLCAiMkRPV04iID0gImJsdWUiKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9IDIsICJGQUxTRSIgPSAxOSkpCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ192c19tYXhBYnNTY29yZV9BNDg1X3Atbl9kaWZmQ3V0b2ZmXyIsIGRpZmZDdXRvZmYpCmhlaWdodCA8LSA0CndpZHRoIDwtIDcKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCmBgYAojIyMjIyBQLVBFCmBgYHtyfQojIGdldHRpbmcgbGlzdCBvZiBnZW5lcyBvZiBpbnRlcmVzdCBmcm9tIFJOQS1zZXEgYW5kIFBSTy1zZXEKYWxwaGEgPC0gMC4wNQpmY0N1dG9mZiA8LSAwLjUKZGlmZi5STkEuRzEuQTQ4NSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZikKCiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCgpkaWZmQ3V0b2ZmIDwtIDAuMgpnZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICJfcC1uX2Vuc2VtYmxMaXN0LnRzdiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gZGlmZkN1dG9mZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoIlAtUCIsICJQLUUiKSklPiUgCiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkKCiMgVGVzdGluZyBkaWZmZXJlbnQgd2F5cyB0byBjYWxjdWxhdGUgcmVwcmVzZW50YXRpdmUgZmVhdHVyZSBvZiBsb29wcyBmb3IgZWFjaCBnZW5lCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQS5HMS5BNDg1ICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZikpJGVuc2VtYmxfZ2VuZV9pZApnZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BLkcxLkE0ODUgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gZmNDdXRvZmYpKSRlbnNlbWJsX2dlbmVfaWQKCgojIFsxXSBBdmVyYWdlIG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lCiMjIFJOQSBvbmx5CmZjQ3V0b2ZmIDwtIDAuNQphbHBoYSA8LSAwLjA1Cm1heExvZzJGQyA8LSA0Cgp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZ2VuZSkgJT4lIAogIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9BNDg1X0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKQoKdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibF9nZW5lX2lkIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCAiMkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgIjFVUCIsICIwTk8iKSksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykKCmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgImdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLXBlLnRzdiIpLCBzZXAgPSAiXHQiKQoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtZWFuX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9ICIwTk8iLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSwKICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgKwogIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgZ2d0aXRsZSgiQTQ4NSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiME5PIiA9ICJibGFjayIsICIxVVAiID0gInJlZCIsICIyRE9XTiIgPSAiYmx1ZSIpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIlRSVUUiID0gMiwgIkZBTFNFIiA9IDE5KSkKCmZpbGVOYW1lIDwtIHBhc3RlMCgibG9nMkZDX3ZzX2F2Z1Njb3JlX0E0ODVfcC1wZV9kaWZmQ3V0b2ZmXyIsIGRpZmZDdXRvZmYpCmhlaWdodCA8LSA0CndpZHRoIDwtIDcKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCiMgWzJdIFN1bSBvZiBkaWZmZXJlbnRpYWwgbG9vcCBzY29yZXMgZm9yIGVhY2ggZ2VuZQojIyBSTkEgb25seQpmY0N1dG9mZiA8LSAwLjUKYWxwaGEgPC0gMC4wNQptYXhMb2cyRkMgPC0gNAoKdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShzdW1fZGlmZl9zY29yZSA9IHN1bShkaWZmX0E0ODVfRE1TTyksIC5ncm91cHMgPSAnZHJvcCcpCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsICIyRE9XTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCAiMVVQIiwgIjBOTyIpKSwKICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLAogICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSAKICBkcGx5cjo6YXJyYW5nZShmbGFnKQoKZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCAiZ2VuZV9zdW1TY29yZV9mY19kVEFHX3AtcGUudHN2IiksIHNlcCA9ICJcdCIpCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IHN1bV9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIAogICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSAiME5PIiwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICsKICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIAogIGdndGl0bGUoIkE0ODUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIjBOTyIgPSAiYmxhY2siLCAiMVVQIiA9ICJyZWQiLCAiMkRPV04iID0gImJsdWUiKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9IDIsICJGQUxTRSIgPSAxOSkpCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ192c19zdW1TY29yZV9BNDg1X3AtcGVfZGlmZkN1dG9mZl8iLCBkaWZmQ3V0b2ZmKQpoZWlnaHQgPC0gNAp3aWR0aCA8LSA3CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKIyBbM10gTWF4IG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lCiMjIFJOQSBvbmx5CmZjQ3V0b2ZmIDwtIDAuNQphbHBoYSA8LSAwLjA1Cm1heExvZzJGQyA8LSA0Cgp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZ2VuZSkgJT4lIAogIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lCiAgc3VtbWFyaXplKG1heF9hYnNfZGlmZl9zY29yZSA9IGRpZmZfQTQ4NV9ETVNPW3doaWNoLm1heChhYnMoZGlmZl9BNDg1X0RNU08pKV0sIC5ncm91cHMgPSAnZHJvcCcpCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QuZG93bi5STkEsICIyRE9XTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZUxpc3QudXAuUk5BLCAiMVVQIiwgIjBOTyIpKSwKICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLAogICAgICAgICAgICAgICAgc2hybG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSAKICBkcGx5cjo6YXJyYW5nZShmbGFnKQoKZndyaXRlKHRlbXAsIGhlcmUoY29uc2Vuc3VzRGlyLCAiZ2VuZV9tYXhBYnNTY29yZV9mY19kVEFHX3AtcGUudHN2IiksIHNlcCA9ICJcdCIpCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1heF9hYnNfZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gIjBOTyIsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBnZ3RpdGxlKCJBNDg1IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIwTk8iID0gImJsYWNrIiwgIjFVUCIgPSAicmVkIiwgIjJET1dOIiA9ICJibHVlIikpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmcKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAyLCAiRkFMU0UiID0gMTkpKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfdnNfbWF4QWJzU2NvcmVfQTQ4NV9wLXBlX2RpZmZDdXRvZmZfIiwgZGlmZkN1dG9mZikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gNwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIFAtUwpgYGB7cn0KIyBnZXR0aW5nIGxpc3Qgb2YgZ2VuZXMgb2YgaW50ZXJlc3QgZnJvbSBSTkEtc2VxIGFuZCBQUk8tc2VxCmFscGhhIDwtIDAuMDUKZmNDdXRvZmYgPC0gMC41CmRpZmYuUk5BLkcxLkE0ODUgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpCgojIEltcG9ydGluZyBsb29wIGdlbmUgYW5ub3RhdGlvbgpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgoKZGlmZkN1dG9mZiA8LSAwLjIKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKCJQLVMiKSklPiUgCiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkKCiMgVGVzdGluZyBkaWZmZXJlbnQgd2F5cyB0byBjYWxjdWxhdGUgcmVwcmVzZW50YXRpdmUgZmVhdHVyZSBvZiBsb29wcyBmb3IgZWFjaCBnZW5lCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCmdlbmVMaXN0LmRvd24uUk5BIDwtIChkaWZmLlJOQS5HMS5BNDg1ICU+JSBkcGx5cjo6ZmlsdGVyKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZikpJGVuc2VtYmxfZ2VuZV9pZApnZW5lTGlzdC51cC5STkEgPC0gKGRpZmYuUk5BLkcxLkE0ODUgJT4lIGRwbHlyOjpmaWx0ZXIoc2hyaW5rZWRfbG9nMkZDID4gZmNDdXRvZmYpKSRlbnNlbWJsX2dlbmVfaWQKCgojIFsxXSBBdmVyYWdlIG9mIGRpZmZlcmVudGlhbCBsb29wIHNjb3JlcyBmb3IgZWFjaCBnZW5lCiMjIFJOQSBvbmx5CmZjQ3V0b2ZmIDwtIDAuNQphbHBoYSA8LSAwLjA1Cm1heExvZzJGQyA8LSA0Cgp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZ2VuZSkgJT4lIAogIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9BNDg1X0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKQoKdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibF9nZW5lX2lkIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCAiMkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgIjFVUCIsICIwTk8iKSksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykKCmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgImdlbmVfYXZnU2NvcmVfZmNfZFRBR19wLXMudHN2IiksIHNlcCA9ICJcdCIpCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IG1lYW5fZGlmZl9zY29yZSwgY29sb3IgPSBmbGFnLCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKGZsYWcgIT0gIjBOTyIsIGV4dGVybmFsX2dlbmVfbmFtZSwgTkEpLAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5mYWN0b3IobWF4RmxhZykpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBnZ3RpdGxlKCJBNDg1IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLSBkaWZmQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBmY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1mY0N1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIwTk8iID0gImJsYWNrIiwgIjFVUCIgPSAicmVkIiwgIjJET1dOIiA9ICJibHVlIikpICsgICMgQ29ycmVjdGVkIGNvbG9yIG1hcHBpbmcKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAyLCAiRkFMU0UiID0gMTkpKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfdnNfYXZnU2NvcmVfQTQ4NV9wLXNfZGlmZkN1dG9mZl8iLCBkaWZmQ3V0b2ZmKQpoZWlnaHQgPC0gNAp3aWR0aCA8LSA3CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgojIFsyXSBTdW0gb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmUKIyMgUk5BIG9ubHkKZmNDdXRvZmYgPC0gMC41CmFscGhhIDwtIDAuMDUKbWF4TG9nMkZDIDwtIDQKCnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgCiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzdW1tYXJpemUoc3VtX2RpZmZfc2NvcmUgPSBzdW0oZGlmZl9BNDg1X0RNU08pLCAuZ3JvdXBzID0gJ2Ryb3AnKQoKdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibF9nZW5lX2lkIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LmRvd24uUk5BLCAiMkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmVMaXN0LnVwLlJOQSwgIjFVUCIsICIwTk8iKSksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIHNocmxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykKCmZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgImdlbmVfc3VtU2NvcmVfZmNfZFRBR19wLXMudHN2IiksIHNlcCA9ICJcdCIpCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IHNocmxvZzJmY01heCwgeSA9IHN1bV9kaWZmX3Njb3JlLCBjb2xvciA9IGZsYWcsIAogICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpZmVsc2UoZmxhZyAhPSAiME5PIiwgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBOQSksCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmZhY3RvcihtYXhGbGFnKSkpICsKICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoKSArIHRoZW1lX2NsYXNzaWMoKSArIAogIGdndGl0bGUoIkE0ODUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtIGRpZmZDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLWZjQ3V0b2ZmLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIjBOTyIgPSAiYmxhY2siLCAiMVVQIiA9ICJyZWQiLCAiMkRPV04iID0gImJsdWUiKSkgKyAgIyBDb3JyZWN0ZWQgY29sb3IgbWFwcGluZwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9IDIsICJGQUxTRSIgPSAxOSkpCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ192c19zdW1TY29yZV9BNDg1X3Atc19kaWZmQ3V0b2ZmXyIsIGRpZmZDdXRvZmYpCmhlaWdodCA8LSA0CndpZHRoIDwtIDcKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCgojIFszXSBNYXggb2YgZGlmZmVyZW50aWFsIGxvb3Agc2NvcmVzIGZvciBlYWNoIGdlbmUKIyMgUk5BIG9ubHkKZmNDdXRvZmYgPC0gMC41CmFscGhhIDwtIDAuMDUKbWF4TG9nMkZDIDwtIDQKCnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBnZW5lKSAlPiUgCiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzdW1tYXJpemUobWF4X2Fic19kaWZmX3Njb3JlID0gZGlmZl9BNDg1X0RNU09bd2hpY2gubWF4KGFicyhkaWZmX0E0ODVfRE1TTykpXSwgLmdyb3VwcyA9ICdkcm9wJykKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC5kb3duLlJOQSwgIjJET1dOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lTGlzdC51cC5STkEsICIxVVAiLCAiME5PIikpLAogICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksCiAgICAgICAgICAgICAgICBzaHJsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIAogIGRwbHlyOjphcnJhbmdlKGZsYWcpCgpmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsICJnZW5lX21heEFic1Njb3JlX2ZjX2RUQUdfcC1zLnRzdiIpLCBzZXAgPSAiXHQiKQoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBzaHJsb2cyZmNNYXgsIHkgPSBtYXhfYWJzX2RpZmZfc2NvcmUsIGNvbG9yID0gZmxhZywgCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGlmZWxzZShmbGFnICE9ICIwTk8iLCBleHRlcm5hbF9nZW5lX25hbWUsIE5BKSwKICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuZmFjdG9yKG1heEZsYWcpKSkgKwogIGdlb21fcG9pbnQoKSArIGdlb21fdGV4dF9yZXBlbCgpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgZ2d0aXRsZSgiQTQ4NSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0gZGlmZkN1dG9mZiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtZmNDdXRvZmYsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiME5PIiA9ICJibGFjayIsICIxVVAiID0gInJlZCIsICIyRE9XTiIgPSAiYmx1ZSIpKSArICAjIENvcnJlY3RlZCBjb2xvciBtYXBwaW5nCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIlRSVUUiID0gMiwgIkZBTFNFIiA9IDE5KSkKCmZpbGVOYW1lIDwtIHBhc3RlMCgibG9nMkZDX3ZzX21heEFic1Njb3JlX0E0ODVfcC1zX2RpZmZDdXRvZmZfIiwgZGlmZkN1dG9mZikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gNwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCgojIyBbMi4xMV0gSG93IG1hbnkgbG9vcHMgcGVyIGdlbmU/CmBgYHtyfQojIElNUE9SVElORyBHRU5FIEFOTk8gREFUQSBGT1IgUC1OIExPT1BTCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCgpnZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICJfcC1uX2Vuc2VtYmxMaXN0LnRzdiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIikpJT4lIAogIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsCiAgICAgICAgICAgICAgICBwZWFrSUQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSAiXyIpKQoKCiMgQ291bnRpbmcgbnVtYmVyIG9mIGxvb3AgcGVyIGdlbmVzCnRlbXBTdW0gPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KHBlYWtJRCwgZ2VuZSwgQW5ubzIpICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSAgc3VtbWFyaXplKAogICAgcGVhayA9IGxpc3QocGVha0lEKSwKICAgIGFubm8yID0gbGlzdChBbm5vMiksCiAgICBjb3VudCA9IG4oKSkKCmdncGxvdCh0ZW1wU3VtLCBhZXMoeCA9IGNvdW50KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgZ2d0aXRsZSgiIyBvZiBQLU4gbG9vcHMgZm9yIGVhY2ggZ2VuZSIpICsgc2NhbGVfeV9sb2cxMCgpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpgYGAKCiMjIFsyLjExLjJdIFN1cGVyRW5oYW5jZXI/CmBgYHtyfQojIElNUE9SVElORyBHRU5FIEFOTk8gREFUQSBGT1IgUC1OIExPT1BTCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCgpnZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICJfcC1uX2Vuc2VtYmxMaXN0LnRzdiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIikpCgp0ZW1wU0UgPC0gZ2VuZUFubm9EYXRhICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSBzdW1tYXJpemUoU0UgPSBpZmVsc2UoYW55KEFubm9TRSA9PSAiU0UiKSwgMSwgMCkpCgoKZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMS50c3YiKSkkZ2VuZQpncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAyLnRzdiIpKSRnZW5lCmdyb3VwNSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDUudHN2IikpJGdlbmUKZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwOC50c3YiKSkkZ2VuZQoKCnRlbXBTRSA8LSB0ZW1wU0UgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZSgKICBncm91cCA9IGlmZWxzZShnZW5lICVpbiUgZ3JvdXAxLCAiZ3JvdXAxIiwKICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdyb3VwMiwgImdyb3VwMiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ3JvdXA1LCAiZ3JvdXA1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ3JvdXA4LCAiZ3JvdXA4IiwgTkEpKSkpKSAlPiUgCiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKQoKcGVyYy5ncm91cDEgPC0gbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gImdyb3VwMSIsIFNFID09IDEpKS8KICBucm93KHRlbXBTRSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiZ3JvdXAxIikpCgpwZXJjLmdyb3VwMiA8LSBucm93KHRlbXBTRSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiZ3JvdXAyIiwgU0UgPT0gMSkpLwogIG5yb3codGVtcFNFICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJncm91cDIiKSkKCnBlcmMuZ3JvdXA1IDwtIG5yb3codGVtcFNFICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJncm91cDUiLCBTRSA9PSAxKSkvCiAgbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gImdyb3VwNSIpKQoKcGVyYy5ncm91cDggPC0gbnJvdyh0ZW1wU0UgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gImdyb3VwOCIsIFNFID09IDEpKS8KICBucm93KHRlbXBTRSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiZ3JvdXA4IikpCgp0ZW1wUGxvdCA8LSB0aWJibGUoZ3JvdXAgPSBjKCJncm91cDEiLCAiZ3JvdXAyIiwgImdyb3VwNSIsICJncm91cDgiKSwKICAgICAgICAgICAgICAgICAgIHBlcmMgPSBjKHBlcmMuZ3JvdXAxLCBwZXJjLmdyb3VwMiwgcGVyYy5ncm91cDUsIHBlcmMuZ3JvdXA4KSkKCmdncGxvdCh0ZW1wUGxvdCwgYWVzKHggPSBncm91cCwgeSA9IHBlcmMpKSArIGdlb21fcG9pbnQoKSArIHRoZW1lX2NsYXNzaWMoKSArIHlsaW0oMCwgMC4yKQpgYGAKCgpgYGB7cn0KcGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7CiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDIiKSwgNSkKICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwNSIpLCA1KQogIHAxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDEiLCAiZ3JvdXA4IiksIDUpCiAgcDI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMiIsICJncm91cDUiKSwgNSkKICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAyIiwgImdyb3VwOCIpLCA1KQogIHA1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDUiLCAiZ3JvdXA4IiksIDUpCiAgCiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IHNjb3JlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeW1pbiwgeW1heCkpICsKICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSB5bWluICsgMSwgbGFiZWwgPSBwYXN0ZTAoInAxMjogIiwgY29udlB2YWx1ZShwMTIpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDE1OiAiLCBjb252UHZhbHVlKHAxNSksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMTg6ICIsIGNvbnZQdmFsdWUocDE4KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyNTogIiwgY29udlB2YWx1ZShwMjUpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDI4OiAiLCBjb252UHZhbHVlKHAyOCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwNTg6ICIsY29udlB2YWx1ZSggcDU4KSwgIlxuIiksCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpCiAgCiAgCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJpbnN1bGF0aW9uX3Njb3JlXyIsIG5vdGUpCiAgaGVpZ2h0IDwtIDMKICB3aWR0aCA8LSAzCiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KCiMgRE1TTwp0ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfRE1TTykKY29sbmFtZXModGVtcC50YikgPC0gYygiZ3JvdXAiLCAic2NvcmUiKQpwbG90X2luc1Njb3JlKHRlbXAudGIsICJuZWFyZXN0Qm91bmRhcnlfRE1TTyIpCgoKCmBgYAoKCiMjIFsyLjEyXSBIb3cgbWFueSBsb29wcy9kaXN0YW5jZSBwZXIgZ2VuZSBpbiBlYWNoIHF1YWRyYW50PwojIyMjIGRUQUcgd2l0aCBiaW5hcnkgZ3JvdXBpbmcKIyMjIyMgU3BsaXR0aW5nIGdlbmVzIHRvIGdyb3VwCmBgYHtyfQpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgoKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIpKSU+JSAKICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLAogICAgICAgICAgICAgICAgcGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkKCgojIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwcwp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSwKICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLAogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQoKZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKQoKbWF4TG9nMkZDID0gMgoKdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibF9nZW5lX2lkIikpICU+JSAKICBkcm9wX25hKHNocmlua2VkX2xvZzJGQykKCgp0ZW1wIDwtIHRlbXAgJT4lCiAgZHBseXI6Om11dGF0ZShncm91cCA9IGlmZWxzZShwYWRqIDwgMC4wNSAmIHNocmlua2VkX2xvZzJGQyA8IDAsIDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG1lYW5fZGlmZl9zY29yZSA8IDAsIDIsIDMpKSkKCgoKZmNDdXRvZmYgPC0gMC41CmRpZmZDdXRvZmYgPC0gMC4yCgpnZW5lLmdyb3VwMSA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAxKSkkZ2VuZQpnZW5lLmdyb3VwMiA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAyKSkkZ2VuZQpmd3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMSkpLCBoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2IiksIHNlcCA9ICJcdCIpCmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAyKSksIGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3YiKSwgc2VwID0gIlx0IikKCgojIEFkZGluZyBncm91cCBpbmZvcm1hdGlvbiB0byBnZW5lQW5ubwpnZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGRwbHlyOjptdXRhdGUoCiAgZ3JvdXAgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAxLCAiZ3JvdXAxIiwKICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAyLCAiZ3JvdXAyIiwgTkEpKQopCgoKYGBgCiMjIyMjIC0gR08gZm9yIGVhY2ggZ3JvdXAKCmBgYHtyfQoKZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdiIpKSRnZW5lCmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3YiKSkkZ2VuZQoKR08xIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwMSwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIsIHJlYWRhYmxlID0gVFJVRSkKR08yIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIsIHJlYWRhYmxlID0gVFJVRSkKR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoR08xKQpHTzIuZGYgPC0gYXMuZGF0YS5mcmFtZShHTzIpCiMgZndyaXRlKEdPMS5kZiwgaGVyZSgiR09fYmluYXJ5X2dyb3VwMS50c3YiKSwgc2VwID0gIlx0IikKIyBmd3JpdGUoR08yLmRmLCBoZXJlKCJHT19iaW5hcnlfZ3JvdXAyLnRzdiIpLCBzZXAgPSAiXHQiKQpHTzEuZGYgPC0gZnJlYWQoaGVyZSgiR09fYmluYXJ5X2dyb3VwMS50c3YiKSkKR08yLmRmIDwtIGZyZWFkKGhlcmUoIkdPX2JpbmFyeV9ncm91cDIudHN2IikpCgpzdWJzZXQxIDwtIEdPMS5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gIkdyb3VwIDEiKSAlPiUKICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdCkKc3Vic2V0MSRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDEkR2VuZVJhdGlvLCAiLyIpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSkKCnN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSAiR3JvdXAgMiIpICU+JQogIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KQpzdWJzZXQyJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MiRHZW5lUmF0aW8sICIvIiksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKQoKCkdPbGlzdCA8LSBmYWN0b3IoYygiR086MDAwMTgyNCIsICJHTzowMDMwODc5IiwgIkdPOjAwMjE5NTMiLCAiR086MDAxOTgyNyIsIAogICAgICAgICAgICAgICAgICJHTzowMDIyNjEzIiwgIkdPOjAwNTA3NjciLCAiR086MDAzNDQ3MCIsICJHTzowMDE2MDU1IiwgCiAgICAgICAgICAgICAgICAgIkdPOjAwMDYzOTciLCAiR086MDAzMDkwMCIsICJHTzowMDA4MzgwIikpCgpkYXRhIDwtIGJpbmRfcm93cyhzdWJzZXQxLCBzdWJzZXQyKSAlPiUKICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KQoKZGVzY09yZGVyIDwtIHNvcnQodW5pcXVlKGRhdGEkRGVzY3JpcHRpb24pKVtjKDQsIDEwLCAyLCAxLCAzLCAxMSwgNywgOCwgNiwgNSwgOSldCnBWYWx1ZUxvZ01heCA8LSAxMApkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUocFZhbHVlTG9nID0gbWluKC1sb2cxMChwLmFkanVzdCksIHBWYWx1ZUxvZ01heCkpCnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBmYWN0b3IoRGVzY3JpcHRpb24sIGxldmVscyA9IGRlc2NPcmRlciksIHNpemUgPSBwVmFsdWVMb2csIGZpbGwgPSBHZW5lUmF0aW8pKSArIAogIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZQogICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0pICsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjUsIDIpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gIiNDQjMzM0EiLAogICAgICAgICAgICAgICAgICAgICAgIyBsaW1pdHMgPSBjKDAsIDEpLAogICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9ycwogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcigKICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXIKICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyCiAgICAgICAgICAgICAgICAgICAgICApCiAgKSArIAogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArCiAgdGhlbWVfYncoKSArICAjIEFwcGx5IHRoZW1lX2J3IGZpcnN0LCBzbyBjdXN0b20gdGhlbWUgc2V0dGluZ3MgY29tZSBhZnRlcgogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksICAjIE92ZXJyaWRlIHRoZW1lX2J3IHBhbmVsCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeC1heGlzIHRleHQKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLCAgICAgICAgICMgRW5zdXJlIHNpemUgaXMgc2V0IGZvciB5LWF4aXMgdGV4dAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIGxpbmVoZWlnaHQgPSAwLjkgICAgICAgICAgIyBBbGxvd3Mgd3JhcHBpbmcgZm9yIHktYXhpcyBsYWJlbHMgdG8gZml0IGludG8gMiBsaW5lcwogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgKQogIAoKCmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCAiLi4iLCAiR08iLCAiR09fZ3JvdXBzX2JpbmFyeUdyb3VwaW5nIikKd2lkdGggPC0gcGFuZWxTaXplKDIuNSkqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoCnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCgojIyMjIyAtIEF2ZXJhZ2UgbG9vcCBzaXplCmBgYHtyfQojIENoZWNraW5nIGF2ZXJhZ2UgZGlzdGFuY2Ugb2YgbG9vcHMgcGVyIGdlbmUKIyB0ZW1wIGlzIGEgdGliYmxlIHdoZXJlIGRlbHRhIGxvb3AgYW5kIGxvZzJmYyBhcmUgbWVyZ2VkCnRlbXAkZ3JvdXAgPC0gZmFjdG9yKHRlbXAkZ3JvdXApCgp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKDEsIDIpKQoKCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRtZWFuX2Rpc3RhbmNlCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJG1lYW5fZGlzdGFuY2UKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9CgpwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMSwgMiksIDUpCgoKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBtZWFuX2Rpc3RhbmNlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAxMDAwMDAwLCBsYWJlbCA9IHBhc3RlMCgicHYxMjogIiwgcHYxMiksCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKQogIAogIApmaWxlTmFtZSA8LSBwYXN0ZTAoInNpemVfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX2JpbmFyeUdyb3VwIikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMgpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIC0gTG9vcCBudW1iZXIgcGVyIGdlbmU6IFAtTgpgYGB7cn0KIyBDb3VudGluZyBudW1iZXIgb2YgbG9vcCBwZXIgZ2VuZXMKdGVtcFN1bSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QocGVha0lELCBnZW5lLCBBbm5vMikgJT4lIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lICBzdW1tYXJpemUoCiAgICBwZWFrID0gbGlzdChwZWFrSUQpLAogICAgYW5ubzIgPSBsaXN0KEFubm8yKSwKICAgIGNvdW50ID0gbigpKQoKdGVtcFN1bSA8LSB0ZW1wU3VtICU+JSBkcGx5cjo6bXV0YXRlKAogIGdyb3VwID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMSwgImdyb3VwMSIsCiAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMiwgImdyb3VwMiIsIE5BKSkKKSAlPiUgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKSAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoImdyb3VwMSIsICJncm91cDIiKSkKCiMgCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRjb3VudAogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRjb3VudAogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCgpwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSwiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQojIHB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLCJncm91cDEiLCAiZ3JvdXA1IiksIDUpCiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwMSIsICJncm91cDgiKSwgNSkKIyBwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSwiZ3JvdXAyIiwgImdyb3VwNSIpLCA1KQojIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLCJncm91cDIiLCAiZ3JvdXA4IiksIDUpCiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwNSIsICJncm91cDgiKSwgNSkKCgpwIDwtIGdncGxvdCh0ZW1wU3VtLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsCiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsgdGhlbWVfY2xhc3NpYygpICsgICAgICAgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSkgKyAKICBsYWJzKHggPSBOVUxMLCB5ID0gIiMgb2YgUC1OIGxvb3BzIHBlciBnZW5lIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA4KSkgKwogIHN0YXRfc3VtbWFyeSgKICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LAogICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIgogICkrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKCJwdjEyOiAiLCBjb252UHZhbHVlKHB2MTIpKSwKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpICsKICB0aGVtZSgKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlcwogICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICAgICkKCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImNvdW50X2JhcnBsb3RfZGlmZkdyb3VwX2RUQUdfdnNfRE1TT19iaW5hcnlHcm91cCIpCndpZHRoIDwtIHBhbmVsU2l6ZSgwLjgpKm1tVG9JbmNoCmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIC0gQ291bnRpbmcgbG9vcCB0eXBlcwpgYGB7cn0KIyMjIyMjIwp0ZW1wMiA8LSB0ZW1wU3VtICU+JSByb3d3aXNlKCkgJT4lIG11dGF0ZSh0b3RhbCA9IGxlbmd0aChhbm5vMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wcCA9IHN1bShhbm5vMiA9PSAiUC1QIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wZSA9IHN1bShhbm5vMiA9PSAiUC1FIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wcyA9IHN1bShhbm5vMiA9PSAiUC1TIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9weCA9IHN1bShhbm5vMiA9PSAiUC1YIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvX3JlZyA9IChudW1fcHAgKyBudW1fcGUpL3RvdGFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb19zdHIgPSBudW1fcHMvdG90YWwpCgojc2F2ZVJEUyh0ZW1wMiwgaGVyZShyZXN1bHREaXIsICJnZW5lX2xvb3BfbGlua19BNDg1LnJkcyIpKQoKCmxvb3BUeXBlIDwtIHRlbXAyICU+JSBncm91cF9ieShncm91cCkgJT4lIHN1bW1hcmlzZShudW1fcHAgPSBzdW0obnVtX3BwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wZSA9IHN1bShudW1fcGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BzID0gc3VtKG51bV9wcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHggPSBzdW0obnVtX3B4KSkKCgpsb29wVHlwZUxvbmcgPC0gbG9vcFR5cGUgJT4lIHBpdm90X2xvbmdlcigtZ3JvdXAsIG5hbWVzX3RvID0gInR5cGUiLCB2YWx1ZXNfdG8gPSAiY291bnQiKQoKbG9vcFR5cGVMb25nJHR5cGUgPC0gZmFjdG9yKGxvb3BUeXBlTG9uZyR0eXBlLCBsZXZlbHMgPSBjKCJudW1fcHAiLCAibnVtX3BlIiwgIm51bV9wcyIsICJudW1fcHgiKSkKCiMgUGxvdHRpbmcKZ2dwbG90KGxvb3BUeXBlTG9uZywgYWVzKGZpbGw9dHlwZSwgeT1jb3VudCwgeD1ncm91cCkpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIHN0YXQ9ImlkZW50aXR5IikgKyB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKIyMjIyMgLSBMb29wIG51bWJlciBwZXIgZ2VuZTogUC1QCmBgYHtyfQojIyMjIyMjIwojUC1QCmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wcCkKY29sbmFtZXMoZGF0YSkgPC0gYygiZ3JvdXAiLCAiY291bnQiKQpwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQojIHB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDEiLCAiZ3JvdXA1IiksIDUpCiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwMSIsICJncm91cDgiKSwgNSkKIyBwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAyIiwgImdyb3VwNSIpLCA1KQojIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDIiLCAiZ3JvdXA4IiksIDUpCiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwNSIsICJncm91cDgiKSwgNSkKCgpwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsCiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsgdGhlbWVfY2xhc3NpYygpICsgICAgICAgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSkgKyAKICBsYWJzKHggPSBOVUxMLCB5ID0gIiMgb2YgUC1QIGxvb3BzIHBlciBnZW5lIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA0KSkgKwogIHN0YXRfc3VtbWFyeSgKICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LAogICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIgogICkrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKCJwdjEyOiAiLCBjb252UHZhbHVlKHB2MTIpKSwKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpICsKICB0aGVtZSgKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlcwogICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICAgICkKCmZpbGVOYW1lIDwtIHBhc3RlMCgiY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3BwX2JpbmFyeUdyb3VwIikKd2lkdGggPC0gcGFuZWxTaXplKDAuOCkqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKIyMjIyMgLSBMb29wIG51bWJlciBwZXIgZ2VuZTogUC1FCmBgYHtyfQojIyMjIyMjIwojUC1FCmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wZSkKY29sbmFtZXMoZGF0YSkgPC0gYygiZ3JvdXAiLCAiY291bnQiKQpwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQoKCnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKyAKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNiwKICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwLCBieSA9IDIpKSArIAogIGxhYnMoeCA9IE5VTEwsIHkgPSAiIyBvZiBQLUUgbG9vcHMgcGVyIGdlbmUiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDQpKSArCiAgc3RhdF9zdW1tYXJ5KAogICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLAogICAgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsCiAgICBmaWxsID0gImJsYWNrIiwgY29sb3IgPSAiYmxhY2siCiAgKSsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMywgbGFiZWwgPSBwYXN0ZTAoInB2MTI6ICIsIGNvbnZQdmFsdWUocHYxMikpLAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMSkgKwogIHRoZW1lKAogICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzCiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uCiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvbgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICAgKQoKCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImNvdW50X2JhcnBsb3RfZGlmZkdyb3VwX2RUQUdfdnNfRE1TT19wZV9iaW5hcnlHcm91cCIpCndpZHRoIDwtIHBhbmVsU2l6ZSgwLjgpKm1tVG9JbmNoCmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIC0gTG9vcCBudW1iZXIgcGVyIGdlbmU6IFAtUwpgYGB7cn0KIyMjIyMjIyMKI1AtUwpkYXRhIDwtIHRlbXAyICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBudW1fcHMpCmNvbG5hbWVzKGRhdGEpIDwtIGMoImdyb3VwIiwgImNvdW50IikKcHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwMSIsICJncm91cDIiKSwgNSkKCgpwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsCiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsgdGhlbWVfY2xhc3NpYygpICsgICAgICAgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSkgKyAKICBsYWJzKHggPSBOVUxMLCB5ID0gIiMgb2YgUC1TIGxvb3BzIHBlciBnZW5lIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA0KSkgKwogIHN0YXRfc3VtbWFyeSgKICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LAogICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIgogICkrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKCJwdjEyOiAiLCBjb252UHZhbHVlKHB2MTIpKSwKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpICsKICB0aGVtZSgKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlcwogICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICAgICkKCgoKZmlsZU5hbWUgPC0gcGFzdGUwKCJjb3VudF9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09fcHNfYmluYXJ5R3JvdXAiKQp3aWR0aCA8LSBwYW5lbFNpemUoMC44KSptbVRvSW5jaApoZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2gKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgojIyMjIGRUQUcKIyMjIyMgLSBTcGxpdHRpbmcgZ2VuZXMgdG8gZ3JvdXBzCmBgYHtyfQpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgoKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIpKSU+JSAKICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLAogICAgICAgICAgICAgICAgcGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkKCgoKIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHMKdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9kVEFHX0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgCiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksCiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSwKICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykKCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSkKCm1heExvZzJGQyA9IDIKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpCgoKZmNDdXRvZmYgPC0gMC41CmRpZmZDdXRvZmYgPC0gMC4yCiMgCnRlbXAgPC0gdGVtcCAlPiUKICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gaWZlbHNlKG1lYW5fZGlmZl9zY29yZSA8IC1kaWZmQ3V0b2ZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc2hyaW5rZWRfbG9nMkZDIDxmY0N1dG9mZiwgMiwgMykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG1lYW5fZGlmZl9zY29yZSA8IGRpZmZDdXRvZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiwgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IGZjQ3V0b2ZmLCA1LCA2KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiwgNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8IGZjQ3V0b2ZmLCA4LCA5KSkpKSkKCgpnZW5lLmdyb3VwMSA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAxKSkkZ2VuZQpnZW5lLmdyb3VwMiA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAyKSkkZ2VuZQpnZW5lLmdyb3VwMyA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAzKSkkZ2VuZQpnZW5lLmdyb3VwNCA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA0KSkkZ2VuZQpnZW5lLmdyb3VwNSA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA1KSkkZ2VuZQpnZW5lLmdyb3VwNiA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA2KSkkZ2VuZQpnZW5lLmdyb3VwNyA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA3KSkkZ2VuZQpnZW5lLmdyb3VwOCA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA4KSkkZ2VuZQpnZW5lLmdyb3VwOSA8LSAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA5KSkkZ2VuZQoKZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDEpKSwgaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdiIpLCBzZXAgPSAiXHQiKQpmd3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMikpLCBoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDIudHN2IiksIHNlcCA9ICJcdCIpCmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAzKSksIGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMy50c3YiKSwgc2VwID0gIlx0IikKZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDQpKSwgaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA0LnRzdiIpLCBzZXAgPSAiXHQiKQpmd3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNSkpLCBoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDUudHN2IiksIHNlcCA9ICJcdCIpCmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA2KSksIGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwNi50c3YiKSwgc2VwID0gIlx0IikKZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDcpKSwgaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA3LnRzdiIpLCBzZXAgPSAiXHQiKQpmd3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOCkpLCBoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2IiksIHNlcCA9ICJcdCIpCmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA5KSksIGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwOS50c3YiKSwgc2VwID0gIlx0IikKCgojIEFkZGluZyBncm91cCBpbmZvcm1hdGlvbiB0byBnZW5lQW5ubwpnZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGRwbHlyOjptdXRhdGUoCiAgZ3JvdXAgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAxLCAiZ3JvdXAxIiwKICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAyLCAiZ3JvdXAyIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMywgImdyb3VwMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA0LCAiZ3JvdXA0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA1LCAiZ3JvdXA1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNiwgImdyb3VwNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA3LCAiZ3JvdXA3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA4LCAiZ3JvdXA4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwOSwgImdyb3VwOSIsIE5BKSkpKSkpKSkpCikKCgpgYGAKIyMjIyMgLSBHTyBmb3IgZWFjaCBncm91cAoKYGBge3J9CkdPMSA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpHTzIgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmUuZ3JvdXAyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKR081IDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwNSwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpCkdPOCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDgsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQoKR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoR08xKQpHTzIuZGYgPC0gYXMuZGF0YS5mcmFtZShHTzIpCkdPMy5kZiA8LSBhcy5kYXRhLmZyYW1lKEdPNSkKR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoR084KQoKc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJncm91cDEiKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7CiAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsICIvIikpCiAgICAgICMgQ29udmVydCB0byBudW1lcmljIGFuZCBwZXJmb3JtIHRoZSBkaXZpc2lvbgogICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiAgICB9KQogICkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZ3IpKQpzdWJzZXQyIDwtIEdPMi5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSAiZ3JvdXAyIikgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewogICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCAiLyIpKQogICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQogICAgfSkKICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKc3Vic2V0MyA8LSBHTzMuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gImdyb3VwMyIpICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHsKICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5ICIvIgogICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uCiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSkKICAgIH0pCiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpCgpHT2xpc3QgPC0gZmFjdG9yKGMoIkdPOjAwMzMwMDIiLCAiR086MDA3MDM3MyIsICJHTzowMDQ4NzMwIiwgIkdPOjAwMzExMDMiLAogICAgICAgICAgICAgICAgICJHTzowMDIyNjEzIiwgIkdPOjAwNTA3NjciLCAiR086MDAzNDQ3MCIsICJHTzowMDE2MDU1IiwgCiAgICAgICAgICAgICAgICAgIkdPOjAwMDYzOTciLCAiR086MDAzMDkwMCIsICJHTzowMDA4MzgwIikpCgpkYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3Moc3Vic2V0MSwgc3Vic2V0MiksIHN1YnNldDMpICU+JQogIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpCgpkZXNjT3JkZXIgPC0gc29ydCh1bmlxdWUoZGF0YSREZXNjcmlwdGlvbikpW2MoMSwgMiwgNSwgNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgNCwgNiwgOCwgOSwgMTAsIDExKV0KCnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBmYWN0b3IoRGVzY3JpcHRpb24sIGxldmVsID0gZGVzY09yZGVyKSwgY29sb3IgPSBwLmFkanVzdCwgc2l6ZSA9IGdyKSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAicmVkIiwgaGlnaCA9ICJibHVlIiwgbGltaXRzID0gYygwLCAwLjA1KSkgKwogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIAoKZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsICIuLiIsICJHTyIsICJHT19ncm91cHMiKQpoZWlnaHQgPSAyCndpZHRoID0gMy41CnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCgoKIyMjIyMgLSBBdmVyYWdlIGxvb3Agc2l6ZQpgYGB7cn0KIyBDaGVja2luZyBhdmVyYWdlIGRpc3RhbmNlIG9mIGxvb3BzIHBlciBnZW5lCiMgdGVtcCBpcyBhIHRpYmJsZSB3aGVyZSBkZWx0YSBsb29wIGFuZCBsb2cyZmMgYXJlIG1lcmdlZAp0ZW1wJGdyb3VwIDwtIGZhY3Rvcih0ZW1wJGdyb3VwKQoKIwp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKDEsIDIsIDUsIDgpKQoKCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRtZWFuX2Rpc3RhbmNlCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJG1lYW5fZGlzdGFuY2UKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9CgpwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMSwgMiksIDUpCnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAxLCA1KSwgNSkKcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIDEsIDgpLCA1KQpwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMiwgNSksIDUpCnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAyLCA4KSwgNSkKcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIDUsIDgpLCA1KQoKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBtZWFuX2Rpc3RhbmNlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMTAwMDAwMCwgbGFiZWwgPSBwYXN0ZTAoInB2MTI6ICIsIHB2MTIsICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjE1OiAiLCBwdjE1LCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxODogIiwgcHYxOCwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MjU6ICIsIHB2MjUsICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjI4OiAiLCBwdjI4LCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY1ODogIiwgcHY1OCwgIlxuIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykKICAKICAKZmlsZU5hbWUgPC0gcGFzdGUwKCJzaXplX2JhcnBsb3RfZGlmZkdyb3VwX2RUQUdfdnNfRE1TTyIpCmhlaWdodCA8LSAzCndpZHRoIDwtIDMKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgojIyMjIyAtIExvb3AgbnVtYmVyIHBlciBnZW5lOiBQLU4KYGBge3J9CiMgQ291bnRpbmcgbnVtYmVyIG9mIGxvb3AgcGVyIGdlbmVzCnRlbXBTdW0gPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KHBlYWtJRCwgZ2VuZSwgQW5ubzIpICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSAgc3VtbWFyaXplKAogICAgcGVhayA9IGxpc3QocGVha0lEKSwKICAgIGFubm8yID0gbGlzdChBbm5vMiksCiAgICBjb3VudCA9IG4oKSkKCnRlbXBTdW0gPC0gdGVtcFN1bSAlPiUgZHBseXI6Om11dGF0ZSgKICBncm91cCA9IGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDEsICJncm91cDEiLAogICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDIsICJncm91cDIiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAzLCAiZ3JvdXAzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDQsICJncm91cDQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDUsICJncm91cDUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA2LCAiZ3JvdXA2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDcsICJncm91cDciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDgsICJncm91cDgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA5LCAiZ3JvdXA5IiwgTkEpKSkpKSkpKSkKKSAlPiUKICBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYygiZ3JvdXAxIiwgImdyb3VwMiIsICJncm91cDUiLCAiZ3JvdXA4IikpCgoKIyBURU1QIFNUQVJUCiNnZW5lTGlzdC5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdiIpKQojZ2VuZUxpc3QuZ3JvdXAxLnRlbXAgPC0gZ2VuZUxpc3QuZ3JvdXAxICU+JSBkcGx5cjo6bGVmdF9qb2luKHRlbXBTdW0sIGJ5ID0gYygiZ2VuZSIpKQojIFRFTVAgRU5ECgpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkY291bnQKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkY291bnQKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9CgoKcHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwMSIsICJncm91cDIiKSwgNSkKcHYxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwMSIsICJncm91cDUiKSwgNSkKcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwMSIsICJncm91cDgiKSwgNSkKcHYyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwMiIsICJncm91cDUiKSwgNSkKcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwMiIsICJncm91cDgiKSwgNSkKcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwNSIsICJncm91cDgiKSwgNSkKCgpwIDwtIGdncGxvdCh0ZW1wU3VtLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgICAgICAgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSwgbGltaXRzID0gYygwLCAxMCkpICsgCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMywgbGFiZWwgPSBwYXN0ZTAoInB2MTI6ICIsIHB2MTIsICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjE1OiAiLCBwdjE1LCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxODogIiwgcHYxOCwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MjU6ICIsIHB2MjUsICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjI4OiAiLCBwdjI4LCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY1ODogIiwgcHY1OCwgIlxuIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMSkgKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKCmZpbGVOYW1lIDwtIHBhc3RlMCgiY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPIikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIC0gQ291bnRpbmcgbG9vcCB0eXBlcwpgYGB7cn0KIyMjIyMjIwp0ZW1wMiA8LSB0ZW1wU3VtICU+JSByb3d3aXNlKCkgJT4lIG11dGF0ZSh0b3RhbCA9IGxlbmd0aChhbm5vMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wcCA9IHN1bShhbm5vMiA9PSAiUC1QIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wZSA9IHN1bShhbm5vMiA9PSAiUC1FIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wcyA9IHN1bShhbm5vMiA9PSAiUC1TIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9weCA9IHN1bShhbm5vMiA9PSAiUC1YIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvX3JlZyA9IChudW1fcHAgKyBudW1fcGUpL3RvdGFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb19zdHIgPSBudW1fcHMvdG90YWwpCgpzYXZlUkRTKHRlbXAyLCBoZXJlKHJlc3VsdERpciwgImdlbmVfbG9vcF9saW5rLnJkcyIpKQoKCmxvb3BUeXBlIDwtIHRlbXAyICU+JSBncm91cF9ieShncm91cCkgJT4lIHN1bW1hcmlzZShudW1fcHAgPSBzdW0obnVtX3BwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wZSA9IHN1bShudW1fcGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BzID0gc3VtKG51bV9wcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHggPSBzdW0obnVtX3B4KSkKCgpsb29wVHlwZUxvbmcgPC0gbG9vcFR5cGUgJT4lIHBpdm90X2xvbmdlcigtZ3JvdXAsIG5hbWVzX3RvID0gInR5cGUiLCB2YWx1ZXNfdG8gPSAiY291bnQiKQoKbG9vcFR5cGVMb25nJHR5cGUgPC0gZmFjdG9yKGxvb3BUeXBlTG9uZyR0eXBlLCBsZXZlbHMgPSBjKCJudW1fcHAiLCAibnVtX3BlIiwgIm51bV9wcyIsICJudW1fcHgiKSkKCiMgUGxvdHRpbmcKZ2dwbG90KGxvb3BUeXBlTG9uZywgYWVzKGZpbGw9dHlwZSwgeT1jb3VudCwgeD1ncm91cCkpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIHN0YXQ9ImlkZW50aXR5IikgKyB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKIyMjIyMgLSBMb29wIG51bWJlciBwZXIgZ2VuZTogUC1QCmBgYHtyfQojIyMjIyMjIwojUC1QCmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9wcCkKY29sbmFtZXMoZGF0YSkgPC0gYygiZ3JvdXAiLCAiY291bnQiKQpwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQpwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAxIiwgImdyb3VwNSIpLCA1KQpwdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAxIiwgImdyb3VwOCIpLCA1KQpwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAyIiwgImdyb3VwNSIpLCA1KQpwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAyIiwgImdyb3VwOCIpLCA1KQpwdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXA1IiwgImdyb3VwOCIpLCA1KQoKcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgICAgICAgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIAogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKCJwdjEyOiAiLCBwdjEyLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxNTogIiwgcHYxNSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MTg6ICIsIHB2MTgsICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjI1OiAiLCBwdjI1LCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyODogIiwgcHYyOCwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2NTg6ICIsIHB2NTgsICJcbiIpLCAKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKCmZpbGVOYW1lIDwtIHBhc3RlMCgiY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3BwIikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIC0gTG9vcCBudW1iZXIgcGVyIGdlbmU6IFAtRQpgYGB7cn0KIyMjIyMjIyMKI1AtRQpkYXRhIDwtIHRlbXAyICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBudW1fcGUpCmNvbG5hbWVzKGRhdGEpIDwtIGMoImdyb3VwIiwgImNvdW50IikKcHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwMSIsICJncm91cDIiKSwgNSkKcHYxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwMSIsICJncm91cDUiKSwgNSkKcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwMSIsICJncm91cDgiKSwgNSkKcHYyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwMiIsICJncm91cDUiKSwgNSkKcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwMiIsICJncm91cDgiKSwgNSkKcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwNSIsICJncm91cDgiKSwgNSkKCnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIAogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNSwgYnkgPSAyKSwgbGltaXRzID0gYygwLCA1KSkgKyAKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSAgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMCgicHYxMjogIiwgcHYxMiwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MTU6ICIsIHB2MTUsICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjE4OiAiLCBwdjE4LCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyNTogIiwgcHYyNSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2Mjg6ICIsIHB2MjgsICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjU4OiAiLCBwdjU4LCAiXG4iKSwgCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAxKSsgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImNvdW50X2JhcnBsb3RfZGlmZkdyb3VwX2RUQUdfdnNfRE1TT19wZSIpCmhlaWdodCA8LSAzCndpZHRoIDwtIDMKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgojIyMjIyAtIExvb3AgbnVtYmVyIHBlciBnZW5lOiBQLVMKYGBge3J9CiMjIyMjIyMjCiNQLVMKZGF0YSA8LSB0ZW1wMiAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgbnVtX3BzKQpjb2xuYW1lcyhkYXRhKSA8LSBjKCJncm91cCIsICJjb3VudCIpCnB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDEiLCAiZ3JvdXAyIiksIDUpCnB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDEiLCAiZ3JvdXA1IiksIDUpCnB2MTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDEiLCAiZ3JvdXA4IiksIDUpCnB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDIiLCAiZ3JvdXA1IiksIDUpCnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDIiLCAiZ3JvdXA4IiksIDUpCnB2NTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDUiLCAiZ3JvdXA4IiksIDUpCgpwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAgICAgICAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDUsIGJ5ID0gMiksIGxpbWl0cyA9IGMoMCwgNSkpICsgCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMywgbGFiZWwgPSBwYXN0ZTAoInB2MTI6ICIsIHB2MTIsICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjE1OiAiLCBwdjE1LCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxODogIiwgcHYxOCwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MjU6ICIsIHB2MjUsICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjI4OiAiLCBwdjI4LCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY1ODogIiwgcHY1OCwgIlxuIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMSkrICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgoKZmlsZU5hbWUgPC0gcGFzdGUwKCJjb3VudF9iYXJwbG90X2RpZmZHcm91cF9kVEFHX3ZzX0RNU09fcHMiKQpoZWlnaHQgPC0gMwp3aWR0aCA8LSAzCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKIyMjIyMgLSBMb29wIG51bWJlciBwZXIgZ2VuZTogUC1YCmBgYHtyfQojIyMjIyMjIwojUC1YCmRhdGEgPC0gdGVtcDIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIG51bV9weCkKY29sbmFtZXMoZGF0YSkgPC0gYygiZ3JvdXAiLCAiY291bnQiKQpwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQpwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAxIiwgImdyb3VwNSIpLCA1KQpwdjE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAxIiwgImdyb3VwOCIpLCA1KQpwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAyIiwgImdyb3VwNSIpLCA1KQpwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAyIiwgImdyb3VwOCIpLCA1KQpwdjU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXA1IiwgImdyb3VwOCIpLCA1KQoKcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgICAgICAgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1LCBieSA9IDIpLCBsaW1pdHMgPSBjKDAsIDUpKSArIAogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDMsIGxhYmVsID0gcGFzdGUwKCJwdjEyOiAiLCBwdjEyLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxNTogIiwgcHYxNSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MTg6ICIsIHB2MTgsICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjI1OiAiLCBwdjI1LCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyODogIiwgcHYyOCwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2NTg6ICIsIHB2NTgsICJcbiIpLCAKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDEpKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKCmZpbGVOYW1lIDwtIHBhc3RlMCgiY291bnRfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPX3B4IikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMgQTQ4NQojIyMjIyAtIFNwbGl0dGluZyBnZW5lcyB0byBncm91cHMKYGBge3J9Cm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCgpnZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICJfcC1uX2Vuc2VtYmxMaXN0LnRzdiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIikpJT4lIAogIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsCiAgICAgICAgICAgICAgICBwZWFrSUQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgc3RhcnQyLCBzZXAgPSAiXyIpKQoKCgojIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwcwp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfQTQ4NV9ETVNPKSwKICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLAogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQoKZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSkKCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRyb3BfbmEoc2hyaW5rZWRfbG9nMkZDKQoKCmZjQ3V0b2ZmIDwtIDAuNQpkaWZmQ3V0b2ZmIDwtIDAuMgojIAp0ZW1wIDwtIHRlbXAgJT4lCiAgZHBseXI6Om11dGF0ZShncm91cCA9IGlmZWxzZShtZWFuX2RpZmZfc2NvcmUgPCAtZGlmZkN1dG9mZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNocmlua2VkX2xvZzJGQyA8ZmNDdXRvZmYsIDIsIDMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtZWFuX2RpZmZfc2NvcmUgPCBkaWZmQ3V0b2ZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYsIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPCBmY0N1dG9mZiwgNSwgNikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYsIDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaHJpbmtlZF9sb2cyRkMgPCBmY0N1dG9mZiwgOCwgOSkpKSkpCgoKZ2VuZS5ncm91cDEgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMSkpJGdlbmUKZ2VuZS5ncm91cDIgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMikpJGdlbmUKZ2VuZS5ncm91cDMgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMykpJGdlbmUKZ2VuZS5ncm91cDQgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNCkpJGdlbmUKZ2VuZS5ncm91cDUgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNSkpJGdlbmUKZ2VuZS5ncm91cDYgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNikpJGdlbmUKZ2VuZS5ncm91cDcgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNykpJGdlbmUKZ2VuZS5ncm91cDggPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOCkpJGdlbmUKZ2VuZS5ncm91cDkgPC0gKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOSkpJGdlbmUKCmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAxKSksIGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwMS50c3YiKSwgc2VwID0gIlx0IikKZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDIpKSwgaGVyZShyZWZEaXIsICJnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAyLnRzdiIpLCBzZXAgPSAiXHQiKQpmd3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMykpLCBoZXJlKHJlZkRpciwgImdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDMudHN2IiksIHNlcCA9ICJcdCIpCmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA0KSksIGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNC50c3YiKSwgc2VwID0gIlx0IikKZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDUpKSwgaGVyZShyZWZEaXIsICJnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdiIpLCBzZXAgPSAiXHQiKQpmd3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gNikpLCBoZXJlKHJlZkRpciwgImdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDYudHN2IiksIHNlcCA9ICJcdCIpCmZ3cml0ZSgodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSA3KSksIGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNy50c3YiKSwgc2VwID0gIlx0IikKZndyaXRlKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDgpKSwgaGVyZShyZWZEaXIsICJnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA4LnRzdiIpLCBzZXAgPSAiXHQiKQpmd3JpdGUoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gOSkpLCBoZXJlKHJlZkRpciwgImdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDkudHN2IiksIHNlcCA9ICJcdCIpCgoKIyBBZGRpbmcgZ3JvdXAgaW5mb3JtYXRpb24gdG8gZ2VuZUFubm8KZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgdW5uZXN0KGdlbmUpICU+JSBkcGx5cjo6bXV0YXRlKAogIGdyb3VwID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMSwgImdyb3VwMSIsCiAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMiwgImdyb3VwMiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDMsICJncm91cDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNCwgImdyb3VwNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNSwgImdyb3VwNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDYsICJncm91cDYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNywgImdyb3VwNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwOCwgImdyb3VwOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDksICJncm91cDkiLCBOQSkpKSkpKSkpKQopCgoKYGBgCiMjIyMjIC0gR08gZm9yIGVhY2ggZ3JvdXAKCmBgYHtyfQpHTzEgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmUuZ3JvdXAxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKR08yIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpCkdPMyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpHTzQgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmUuZ3JvdXA0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKR081IDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwNSwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpCkdPNiA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDYsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpHTzcgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmUuZ3JvdXA3LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKR084IDwtIGVucmljaEdPKGdlbmUgPSBnZW5lLmdyb3VwOCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpCkdPOSA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZS5ncm91cDksIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQoKZG90cGxvdChHTzEsIHNob3dDYXRlZ29yeSA9IDEwKQoKIyAKIyBHTzEuZGYgPC0gYXMuZGF0YS5mcmFtZShHTzEpCiMgR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoR08yKQojIEdPMy5kZiA8LSBhcy5kYXRhLmZyYW1lKEdPNSkKIyBHTzQuZGYgPC0gYXMuZGF0YS5mcmFtZShHTzgpCiMgCiMgc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJncm91cDEiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyBzdWJzZXQyIDwtIEdPMi5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSAiZ3JvdXAyIikgJT4lCiMgICBkcGx5cjo6bXV0YXRlKAojICAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHsKIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsICIvIikpCiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uCiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQojICAgICB9KQojICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpCiMgc3Vic2V0MyA8LSBHTzMuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gImdyb3VwMyIpICU+JQojICAgZHBseXI6Om11dGF0ZSgKIyAgICAgZ3IgPSBzYXBwbHkoR2VuZVJhdGlvLCBmdW5jdGlvbih4KSB7CiMgICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5ICIvIgojICAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCAiLyIpKQojICAgICAgICMgQ29udmVydCB0byBudW1lcmljIGFuZCBwZXJmb3JtIHRoZSBkaXZpc2lvbgojICAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSkKIyAgICAgfSkKIyAgICkgJT4lIGRwbHlyOjphcnJhbmdlKGRlc2MoZ3IpKQojIAojIEdPbGlzdCA8LSBmYWN0b3IoYygiR086MDAzMzAwMiIsICJHTzowMDcwMzczIiwgIkdPOjAwNDg3MzAiLCAiR086MDAzMTEwMyIsCiMgICAgICAgICAgICAgICAgICAiR086MDAyMjYxMyIsICJHTzowMDUwNzY3IiwgIkdPOjAwMzQ0NzAiLCAiR086MDAxNjA1NSIsIAojICAgICAgICAgICAgICAgICAgIkdPOjAwMDYzOTciLCAiR086MDAzMDkwMCIsICJHTzowMDA4MzgwIikpCiMgCiMgZGF0YSA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKHN1YnNldDEsIHN1YnNldDIpLCBzdWJzZXQzKSAlPiUKIyAgIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpCiMgCiMgZGVzY09yZGVyIDwtIHNvcnQodW5pcXVlKGRhdGEkRGVzY3JpcHRpb24pKVtjKDEsIDIsIDUsIDcsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgNCwgNiwgOCwgOSwgMTAsIDExKV0KIyAKIyBwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gZmFjdG9yKERlc2NyaXB0aW9uLCBsZXZlbCA9IGRlc2NPcmRlciksIGNvbG9yID0gcC5hZGp1c3QsIHNpemUgPSBncikpICsgCiMgICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsKIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICJyZWQiLCBoaWdoID0gImJsdWUiLCBsaW1pdHMgPSBjKDAsIDAuMDUpKSArCiMgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAsIDMpKSArCiMgICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKwojICAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgICMgU2V0IGF4aXMgdGV4dCBzaXplCiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZCkKIyAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZQojICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkgCiMgCiMgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsICIuLiIsICJHTyIsICJHT19ncm91cHMiKQojIGhlaWdodCA9IDIKIyB3aWR0aCA9IDMuNQojIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiMgcHJpbnQocCkKIyBkZXYub2ZmKCkKYGBgCgoKCiMjIyMjIC0gQXZlcmFnZSBsb29wIHNpemUKYGBge3J9CiMgQ2hlY2tpbmcgYXZlcmFnZSBkaXN0YW5jZSBvZiBsb29wcyBwZXIgZ2VuZQojIHRlbXAgaXMgYSB0aWJibGUgd2hlcmUgZGVsdGEgbG9vcCBhbmQgbG9nMmZjIGFyZSBtZXJnZWQKdGVtcCRncm91cCA8LSBmYWN0b3IodGVtcCRncm91cCkKCgojIAojIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewojICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJG1lYW5fZGlzdGFuY2UKIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRtZWFuX2Rpc3RhbmNlCiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiMgICByZXR1cm4od2lsJHAudmFsdWUpCiMgfQojIAojIHB2MTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAxLCAyKSwgNSkKIyBwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMSwgNSksIDUpCiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIDEsIDgpLCA1KQojIHB2MjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAyLCA1KSwgNSkKIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgMiwgOCksIDUpCiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsIDUsIDgpLCA1KQoKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBtZWFuX2Rpc3RhbmNlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMTAwMDAwMCwgbGFiZWwgPSBwYXN0ZTAoInB2MTI6ICIsIHB2MTIsICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MTU6ICIsIHB2MTUsICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MTg6ICIsIHB2MTgsICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MjU6ICIsIHB2MjUsICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2Mjg6ICIsIHB2MjgsICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2NTg6ICIsIHB2NTgsICJcbiIpLCAKICAjICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykKICAjIAogIApmaWxlTmFtZSA8LSBwYXN0ZTAoInNpemVfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPIikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gNApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIC0gTG9vcCBudW1iZXIgcGVyIGdlbmU6IFAtTgpgYGB7cn0KIyBDb3VudGluZyBudW1iZXIgb2YgbG9vcCBwZXIgZ2VuZXMKdGVtcFN1bSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QocGVha0lELCBnZW5lLCBBbm5vMikgJT4lIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lICBzdW1tYXJpemUoCiAgICBwZWFrID0gbGlzdChwZWFrSUQpLAogICAgYW5ubzIgPSBsaXN0KEFubm8yKSwKICAgIGNvdW50ID0gbigpKQoKdGVtcFN1bSA8LSB0ZW1wU3VtICU+JSBkcGx5cjo6bXV0YXRlKAogIGdyb3VwID0gaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMSwgImdyb3VwMSIsCiAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMiwgImdyb3VwMiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDMsICJncm91cDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNCwgImdyb3VwNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNSwgImdyb3VwNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDYsICJncm91cDYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNywgImdyb3VwNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwOCwgImdyb3VwOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDksICJncm91cDkiLCBOQSkpKSkpKSkpKQopICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpCgojIAojIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewojICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGNvdW50CiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkY291bnQKIyAgIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKIyAgIHJldHVybih3aWwkcC52YWx1ZSkKIyB9CiMgCiMgCiMgcHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwMSIsICJncm91cDIiKSwgNSkKIyBwdjE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSwiZ3JvdXAxIiwgImdyb3VwNSIpLCA1KQojIHB2MTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLCJncm91cDEiLCAiZ3JvdXA4IiksIDUpCiMgcHYyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwMiIsICJncm91cDUiKSwgNSkKIyBwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFN1bSwiZ3JvdXAyIiwgImdyb3VwOCIpLCA1KQojIHB2NTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wU3VtLCJncm91cDUiLCAiZ3JvdXA4IiksIDUpCgoKcCA8LSBnZ3Bsb3QodGVtcFN1bSwgYWVzKHggPSBncm91cCwgeSA9IGNvdW50LCBmaWxsID0gZ3JvdXApKSArIAogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIAogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAsIGJ5ID0gMikpICsgCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEwKSkgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMywgbGFiZWwgPSBwYXN0ZTAoInB2MTI6ICIsIHB2MTIsICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MTU6ICIsIHB2MTUsICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MTg6ICIsIHB2MTgsICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MjU6ICIsIHB2MjUsICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2Mjg6ICIsIHB2MjgsICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2NTg6ICIsIHB2NTgsICJcbiIpLCAKICAjICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMSkgKyAgCgoKZmlsZU5hbWUgPC0gcGFzdGUwKCJjb3VudF9iYXJwbG90X2RpZmZHcm91cF9BNDg1X3ZzX0RNU08iKQpoZWlnaHQgPC0gMwp3aWR0aCA8LSA0CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKIyMjIyMgLSBDb3VudGluZyBsb29wIHR5cGVzCmBgYHtyfQojIyMjIyMjCnRlbXAyIDwtIHRlbXBTdW0gJT4lIHJvd3dpc2UoKSAlPiUgbXV0YXRlKHRvdGFsID0gbGVuZ3RoKGFubm8yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BwID0gc3VtKGFubm8yID09ICJQLVAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BlID0gc3VtKGFubm8yID09ICJQLUUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BzID0gc3VtKGFubm8yID09ICJQLVMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3B4ID0gc3VtKGFubm8yID09ICJQLVgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW9fcmVnID0gKG51bV9wcCArIG51bV9wZSkvdG90YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvX3N0ciA9IG51bV9wcy90b3RhbCkKCnNhdmVSRFModGVtcDIsIGhlcmUocmVzdWx0RGlyLCAiZ2VuZV9sb29wX2xpbmtfQTQ4NS5yZHMiKSkKCgpsb29wVHlwZSA8LSB0ZW1wMiAlPiUgZ3JvdXBfYnkoZ3JvdXApICU+JSBzdW1tYXJpc2UobnVtX3BwID0gc3VtKG51bV9wcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGUgPSBzdW0obnVtX3BlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wcyA9IHN1bShudW1fcHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3B4ID0gc3VtKG51bV9weCkpCgoKbG9vcFR5cGVMb25nIDwtIGxvb3BUeXBlICU+JSBwaXZvdF9sb25nZXIoLWdyb3VwLCBuYW1lc190byA9ICJ0eXBlIiwgdmFsdWVzX3RvID0gImNvdW50IikKCmxvb3BUeXBlTG9uZyR0eXBlIDwtIGZhY3Rvcihsb29wVHlwZUxvbmckdHlwZSwgbGV2ZWxzID0gYygibnVtX3BwIiwgIm51bV9wZSIsICJudW1fcHMiLCAibnVtX3B4IikpCgojIFBsb3R0aW5nCmdncGxvdChsb29wVHlwZUxvbmcsIGFlcyhmaWxsPXR5cGUsIHk9Y291bnQsIHg9Z3JvdXApKSArIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiLCBzdGF0PSJpZGVudGl0eSIpICsgdGhlbWVfY2xhc3NpYygpCgpgYGAKCiMjIyMjIC0gTG9vcCBudW1iZXIgcGVyIGdlbmU6IFAtUApgYGB7cn0KIyMjIyMjIyMKI1AtUApkYXRhIDwtIHRlbXAyICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBudW1fcHApCmNvbG5hbWVzKGRhdGEpIDwtIGMoImdyb3VwIiwgImNvdW50IikKIyBwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQojIHB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDEiLCAiZ3JvdXA1IiksIDUpCiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwMSIsICJncm91cDgiKSwgNSkKIyBwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAyIiwgImdyb3VwNSIpLCA1KQojIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDIiLCAiZ3JvdXA4IiksIDUpCiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwNSIsICJncm91cDgiKSwgNSkKCnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIAogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNSwgYnkgPSAyKSwgbGltaXRzID0gYygwLCA1KSkgKyAKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSAgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMCgicHYxMjogIiwgcHYxMiwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxNTogIiwgcHYxNSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxODogIiwgcHYxOCwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyNTogIiwgcHYyNSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyODogIiwgcHYyOCwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY1ODogIiwgcHY1OCwgIlxuIiksIAogICMgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAxKQoKCmZpbGVOYW1lIDwtIHBhc3RlMCgiY291bnRfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPX3BwIikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIC0gTG9vcCBudW1iZXIgcGVyIGdlbmU6IFAtRQpgYGB7cn0KIyMjIyMjIyMKI1AtRQpkYXRhIDwtIHRlbXAyICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBudW1fcGUpCmNvbG5hbWVzKGRhdGEpIDwtIGMoImdyb3VwIiwgImNvdW50IikKIyBwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQojIHB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDEiLCAiZ3JvdXA1IiksIDUpCiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwMSIsICJncm91cDgiKSwgNSkKIyBwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAyIiwgImdyb3VwNSIpLCA1KQojIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDIiLCAiZ3JvdXA4IiksIDUpCiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwNSIsICJncm91cDgiKSwgNSkKCnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIAogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNSwgYnkgPSAyKSwgbGltaXRzID0gYygwLCA1KSkgKyAKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSAgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMCgicHYxMjogIiwgcHYxMiwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxNTogIiwgcHYxNSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxODogIiwgcHYxOCwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyNTogIiwgcHYyNSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyODogIiwgcHYyOCwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY1ODogIiwgcHY1OCwgIlxuIiksIAogICMgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAxKQoKCmZpbGVOYW1lIDwtIHBhc3RlMCgiY291bnRfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPX3BlIikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIC0gTG9vcCBudW1iZXIgcGVyIGdlbmU6IFAtUwpgYGB7cn0KIyMjIyMjIyMKI1AtUwpkYXRhIDwtIHRlbXAyICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBudW1fcHMpCmNvbG5hbWVzKGRhdGEpIDwtIGMoImdyb3VwIiwgImNvdW50IikKIyBwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQojIHB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDEiLCAiZ3JvdXA1IiksIDUpCiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwMSIsICJncm91cDgiKSwgNSkKIyBwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAyIiwgImdyb3VwNSIpLCA1KQojIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDIiLCAiZ3JvdXA4IiksIDUpCiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwNSIsICJncm91cDgiKSwgNSkKCnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIAogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNSwgYnkgPSAyKSwgbGltaXRzID0gYygwLCA1KSkgKyAKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSAgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMCgicHYxMjogIiwgcHYxMiwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxNTogIiwgcHYxNSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxODogIiwgcHYxOCwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyNTogIiwgcHYyNSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyODogIiwgcHYyOCwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY1ODogIiwgcHY1OCwgIlxuIiksIAogICMgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAxKSsgIAoKCmZpbGVOYW1lIDwtIHBhc3RlMCgiY291bnRfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPX3BzIikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIC0gTG9vcCBudW1iZXIgcGVyIGdlbmU6IFAtWApgYGB7cn0KIyMjIyMjIyMKI1AtWApkYXRhIDwtIHRlbXAyICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBudW1fcHgpCmNvbG5hbWVzKGRhdGEpIDwtIGMoImdyb3VwIiwgImNvdW50IikKIyBwdjEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQojIHB2MTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDEiLCAiZ3JvdXA1IiksIDUpCiMgcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwMSIsICJncm91cDgiKSwgNSkKIyBwdjI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YSwiZ3JvdXAyIiwgImdyb3VwNSIpLCA1KQojIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLCJncm91cDIiLCAiZ3JvdXA4IiksIDUpCiMgcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEsImdyb3VwNSIsICJncm91cDgiKSwgNSkKCnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBjb3VudCwgZmlsbCA9IGdyb3VwKSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArICAgICAgIAogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNSwgYnkgPSAyKSwgbGltaXRzID0gYygwLCA1KSkgKyAKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSAgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAzLCBsYWJlbCA9IHBhc3RlMCgicHYxMjogIiwgcHYxMiwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxNTogIiwgcHYxNSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxODogIiwgcHYxOCwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyNTogIiwgcHYyNSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyODogIiwgcHYyOCwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY1ODogIiwgcHY1OCwgIlxuIiksIAogICMgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAxKSsgIAoKCmZpbGVOYW1lIDwtIHBhc3RlMCgiY291bnRfYmFycGxvdF9kaWZmR3JvdXBfQTQ4NV92c19ETVNPX3B4IikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCgojIyMgZFRBRwojIyMjIEdyb3VwaW5nIHdpdGggUC1OIG51bWJlcgojIyMjIyBHcm91cGluZwpgYGB7cn0KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKCmFscGhhIDwtIDAuMDUKZmNDdXRvZmYgPC0gMC41CmRpZmYuUFJPLkcxLmRUQUcgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxRzIuZFRBR19HMS5kVEFHX3ZzX0cxLkRNU09fUFJPc2VxLnRzdiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSwgYWJzKHNocmlua2VkX2xvZzJGQykgPiBmY0N1dG9mZikKZGlmZi5QUk8uRzIuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzFHMi5kVEFHX0cyLmRUQUdfdnNfRzIuRE1TT19QUk9zZXEudHN2IikpICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKQpkaWZmLlJOQS5HMS5kVEFHIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OmZpbHRlcihwYWRqIDwgYWxwaGEsIGFicyhzaHJpbmtlZF9sb2cyRkMpID4gZmNDdXRvZmYpCmRpZmYuUk5BLkcxLmRUQUcubm9GQ2N1dG9mZiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhKQojIyMjIyMjIyMjIyMKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIpKSU+JSAKICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLAogICAgICAgICAgICAgICAgcGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkKCgoKIyB0ZW1wMiBjb250YWlucyBnZW5lcyBmcm9tIGdyb3VwIDEsIDIsIDUsIDggYW5kIGxvb3AgY291bnRzCiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzCnJlc3VsdERpciA8LSBoZXJlKCIuLi8uLi9yZXN1bHQiKQoKdGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgImdlbmVfbG9vcF9saW5rLnJkcyIpKQoKCnBuT3ZlcjggPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDgpKSRnZW5lCnBuT3ZlcjYgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDYsIHRvdGFsIDwgOCkpJGdlbmUKcG5PdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gNCwgdG90YWwgPCA2KSkkZ2VuZQpwbk92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSAyLCB0b3RhbCA8IDQpKSRnZW5lCnBuT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsIDwgMikpJGdlbmUKCgoKIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHMKdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9kVEFHX0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgCiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksCiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSwKICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykKCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSkKCm1heExvZzJGQyA9IDIKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBkaWZmLlJOQS5HMS5kVEFHJGVuc2VtYmxfZ2VuZV9pZCwgIjJET1dOIiwgIjBOTyIpLAogICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksCiAgICAgICAgICAgICAgICBsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIAogIGRwbHlyOjphcnJhbmdlKGZsYWcpICU+JQogIGRyb3BfbmEoc2hyaW5rZWRfbG9nMkZDKQoKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKAogIHBuT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcG5PdmVyOCwgInBuT3ZlcjgiLAogICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBuT3ZlcjYsICJwbk92ZXI2IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyNCwgInBuT3ZlcjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyMiwgInBuT3ZlcjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBuT3ZlcjAsICJwbk92ZXIwIiwgTkEpKSkpKSkgJT4lCiAgZHJvcF9uYShwbk92ZXIpCmBgYAoKIyMjIyMgR08gZm9yIGVhY2ggZ3JvdXAKYGBge3J9CkdPZmlnRGlyIDwtIGhlcmUoZmlnRGlyLCAiLi4vR08iKQpnZXRHTygicG5PdmVyOCIsIEdPZmlnRGlyLCBwbk92ZXI4KQpnZXRHTygicG5PdmVyNiIsIEdPZmlnRGlyLCBwbk92ZXI2KQpnZXRHTygicG5PdmVyNCIsIEdPZmlnRGlyLCBwbk92ZXI0KQpnZXRHTygicG5PdmVyMiIsIEdPZmlnRGlyLCBwbk92ZXIyKQpnZXRHTygicG5PdmVyMCIsIEdPZmlnRGlyLCBwbk92ZXIwKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkdPMC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXIwLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCkdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXIyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCkdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCkdPNi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXI2LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCkdPOC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXI4LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCgoKc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJwbk92ZXIwIikgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewogICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCAiLyIpKQogICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQogICAgfSkKICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJwbk92ZXIyIikgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewogICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCAiLyIpKQogICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQogICAgfSkKICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJwbk92ZXI0IikgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewogICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCAiLyIpKQogICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQogICAgfSkKICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKc3Vic2V0NiA8LSBHTzYuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJwbk92ZXI2IikgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewogICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCAiLyIpKQogICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQogICAgfSkKICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKc3Vic2V0OCA8LSBHTzguZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJwbk92ZXI4IikgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewogICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCAiLyIpKQogICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQogICAgfSkKICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKCgpHT2xpc3QgPC0gZmFjdG9yKGMoIkdPOjAwMDYzOTciLCAiR086MDAwODM4MCIsICJHTzowMDIyNjEzIiwgIkdPOjAwMzQ0NzAiLAogICAgICAgICAgICAgICAgICAgIkdPOjAwMTYwNTUiLCAiR086MDAwNzM4OSIsICJHTzowMDQ4NTYyIiwgIkdPOjAwNDUxNjUiLCAKICAgICAgICAgICAgICAgICAgICJHTzowMDcyMDAxIiwgIkdPOjAwMDc1MTciLCAiR086MDA0ODcwNSIpKQoKZGF0YSA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQwLCBzdWJzZXQyKSwgc3Vic2V0NCksIHN1YnNldDgpICU+JQogIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpCgpwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gRGVzY3JpcHRpb24sIGNvbG9yID0gcC5hZGp1c3QsIHNpemUgPSBncikpICsgCiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gInJlZCIsIGhpZ2ggPSAiYmx1ZSIsIGxpbWl0cyA9IGMoMCwgMC4wNSkpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAsIDMpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICsKICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemUKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZCkKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemUKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSAKCmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCAiLi4iLCAiR08iLCAiR09fZ3JvdXBzX3BuIikKaGVpZ2h0ID0gMgp3aWR0aCA9IDMuMwpzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgoKIyMjIyMgbG9vcCBzY29yZQpgYGB7cn0KZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBuT3ZlciA9PWdyb3VwMSkgKSRtZWFuX2RpZmZfc2NvcmUKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAyKSApJG1lYW5fZGlmZl9zY29yZQogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCnB2MDIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicG5PdmVyMCIsICJwbk92ZXIyIiksIDUpCnB2MjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicG5PdmVyMiIsICJwbk92ZXI0IiksIDUpCnB2NDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicG5PdmVyNCIsICJwbk92ZXI2IiksIDUpCnB2MDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicG5PdmVyMCIsICJwbk92ZXI4IiksIDUpCnB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicG5PdmVyMiIsICJwbk92ZXI4IiksIDUpCnB2NDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicG5PdmVyNCIsICJwbk92ZXI4IiksIDUpCnB2NjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicG5PdmVyNiIsICJwbk92ZXI4IiksIDUpCgoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwbk92ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIAogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwbk92ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4yKSsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwYXN0ZTAoInB2MDI6ICIsIGNvbnZQdmFsdWUocHYwMiksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjI0OiAiLCBjb252UHZhbHVlKHB2MjQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY0NjogIiwgY29udlB2YWx1ZShwdjQ2KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2Njg6ICIsIGNvbnZQdmFsdWUocHY2OCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjQ4OiAiLCBjb252UHZhbHVlKHB2NDgpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyODogIiwgY29udlB2YWx1ZShwdjI4KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MDg6ICIsIGNvbnZQdmFsdWUocHYwOCksICJcbiIpLCAKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpCgogIApmaWxlTmFtZSA8LSBwYXN0ZTAoImRpZmZTY29yZV9iYXJwbG90X3BuR3JvdXBfZFRBR192c19ETVNPIikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIGxvZzJGQwpgYGB7cn0KIwogZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBuT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZQogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2UKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9Cgp0ZW1wRG93biA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlIDwgMCkKIApwdjAyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwbk92ZXIwIiwgInBuT3ZlcjIiKSwgNSkKcHYwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicG5PdmVyMCIsICJwbk92ZXI0IiksIDUpCnB2MDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBuT3ZlcjAiLCAicG5PdmVyNiIpLCA1KQpwdjA4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwbk92ZXIwIiwgInBuT3ZlcjgiKSwgNSkKcHYyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicG5PdmVyMiIsICJwbk92ZXI0IiksIDUpCnB2MjYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBuT3ZlcjIiLCAicG5PdmVyNiIpLCA1KQpwdjI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwbk92ZXIyIiwgInBuT3ZlcjgiKSwgNSkKcHY0NiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicG5PdmVyNCIsICJwbk92ZXI2IiksIDUpCnB2NDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBuT3ZlcjQiLCAicG5PdmVyOCIpLCA1KQpwdjY4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwbk92ZXI2IiwgInBuT3ZlcjgiKSwgNSkKCgoKCnAgPC0gZ2dwbG90KHRlbXBEb3duLCBhZXMoeCA9IHBuT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBuT3ZlciksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcG5PdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAtMC41LCBsYWJlbCA9IHBhc3RlMCgicHYwMjogIiwgY29udlB2YWx1ZShwdjAyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MDQ6ICIsIGNvbnZQdmFsdWUocHYwNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjA2OiAiLCBjb252UHZhbHVlKHB2MDYpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYwODogIiwgY29udlB2YWx1ZShwdjA4KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MjQ6ICIsIGNvbnZQdmFsdWUocHYyNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjI2OiAiLCBjb252UHZhbHVlKHB2MjYpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyODogIiwgY29udlB2YWx1ZShwdjI4KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2NDY6ICIsIGNvbnZQdmFsdWUocHY0NiksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjQ4OiAiLCBjb252UHZhbHVlKHB2NDgpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY2ODogIiwgY29udlB2YWx1ZShwdjY4KSwgIlxuIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEsIDApKQoKICAKZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfYmFycGxvdF9wbkdyb3VwX2RUQUdfdnNfRE1TT19kb3duIikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKCgp0ZW1wVXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA+IDApCiAKcHYwMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBuT3ZlcjAiLCAicG5PdmVyMiIpLCA1KQpwdjA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicG5PdmVyMCIsICJwbk92ZXI0IiksIDUpCnB2MDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwbk92ZXIwIiwgInBuT3ZlcjYiKSwgNSkKcHYwOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBuT3ZlcjAiLCAicG5PdmVyOCIpLCA1KQpwdjI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicG5PdmVyMiIsICJwbk92ZXI0IiksIDUpCnB2MjYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwbk92ZXIyIiwgInBuT3ZlcjYiKSwgNSkKcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBuT3ZlcjIiLCAicG5PdmVyOCIpLCA1KQpwdjQ2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicG5PdmVyNCIsICJwbk92ZXI2IiksIDUpCnB2NDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwbk92ZXI0IiwgInBuT3ZlcjgiKSwgNSkKcHY2OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBuT3ZlcjYiLCAicG5PdmVyOCIpLCA1KQoKCgoKcCA8LSBnZ3Bsb3QodGVtcFVwLCBhZXMoeCA9IHBuT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBuT3ZlciksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcG5PdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAwLjUsIGxhYmVsID0gcGFzdGUwKCJwdjAyOiAiLCBjb252UHZhbHVlKHB2MDIpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYwNDogIiwgY29udlB2YWx1ZShwdjA0KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MDY6ICIsIGNvbnZQdmFsdWUocHYwNiksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjA4OiAiLCBjb252UHZhbHVlKHB2MDgpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyNDogIiwgY29udlB2YWx1ZShwdjI0KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MjY6ICIsIGNvbnZQdmFsdWUocHYyNiksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjI4OiAiLCBjb252UHZhbHVlKHB2MjgpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY0NjogIiwgY29udlB2YWx1ZShwdjQ2KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2NDg6ICIsIGNvbnZQdmFsdWUocHY0OCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjY4OiAiLCBjb252UHZhbHVlKHB2NjgpLCAiXG4iKSwgCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSkKCiAgCmZpbGVOYW1lIDwtIHBhc3RlMCgibG9nMkZDX2JhcnBsb3RfcG5Hcm91cF9kVEFHX3ZzX0RNU09fdXAiKQpoZWlnaHQgPC0gMwp3aWR0aCA8LSAzCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKIyMjIyBHcm91cGluZyB3aXRoIFAtUyBudW1iZXIKIyMjIyMgR3JvdXBpbmcKYGBge3J9CiMgdGVtcDIgY29udGFpbnMgZ2VuZXMgZnJvbSBncm91cCAxLCAyLCA1LCA4IGFuZCBsb29wIGNvdW50cwojY2FsY3VsYXRpbmcgZGlmZiBzY29yZSBhbmQgbG9nMmZjIGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiBwLW4gbnVtYmVycwoKcHNPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDQpKSRnZW5lCnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZQpwc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMiwgbnVtX3BzIDwgMykpJGdlbmUKcHNPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDEsIG51bV9wcyA8IDIpKSRnZW5lCnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lCgoKCiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzCnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIAogIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9kVEFHX0RNU08pLAogICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpCgpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCgptYXhMb2cyRkMgPSAyCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZGlmZi5STkEuRzEuZFRBRyRlbnNlbWJsX2dlbmVfaWQsICIyRE9XTiIsICIwTk8iKSwKICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLAogICAgICAgICAgICAgICAgbG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSAKICBkcGx5cjo6YXJyYW5nZShmbGFnKSAlPiUKICBkcm9wX25hKHNocmlua2VkX2xvZzJGQykKCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZSgKICBwc092ZXIgPSBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjQsICJwc092ZXI0IiwKICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIzLCAicHNPdmVyMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjIsICJwc092ZXIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjEsICJwc092ZXIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIwLCAicHNPdmVyMCIsIE5BKSkpKSkpICU+JQogIGRyb3BfbmEocHNPdmVyKQoKYGBgCgojIyMjIyBHTyBmb3IgZWFjaCBncm91cApgYGB7cn0KR09maWdEaXIgPC0gaGVyZShmaWdEaXIsICIuLi9HTyIpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMKR08wLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjAsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiLCByZWFkYWJsZSA9IFRSVUUpKQpHTzEuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMSwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIsIHJlYWRhYmxlID0gVFJVRSkpCkdPMi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIyLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIiwgcmVhZGFibGUgPSBUUlVFKSkKR08zLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiLCByZWFkYWJsZSA9IFRSVUUpKQpHTzQuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyNCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIsIHJlYWRhYmxlID0gVFJVRSkpCgpmd3JpdGUoR08wLmRmLCBoZXJlKCJHT19QU19ncm91cDAudHN2IiksIHNlcCA9ICJcdCIpCmZ3cml0ZShHTzEuZGYsIGhlcmUoIkdPX1BTX2dyb3VwMS50c3YiKSwgc2VwID0gIlx0IikKZndyaXRlKEdPMi5kZiwgaGVyZSgiR09fUFNfZ3JvdXAyLnRzdiIpLCBzZXAgPSAiXHQiKQpmd3JpdGUoR08zLmRmLCBoZXJlKCJHT19QU19ncm91cDMudHN2IiksIHNlcCA9ICJcdCIpCmZ3cml0ZShHTzQuZGYsIGhlcmUoIkdPX1BTX2dyb3VwNC50c3YiKSwgc2VwID0gIlx0IikKCkdPMC5kZiA8LSBmcmVhZChoZXJlKCJHT19QU19ncm91cDAudHN2IikpCkdPMS5kZiA8LSBmcmVhZChoZXJlKCJHT19QU19ncm91cDEudHN2IikpCkdPMi5kZiA8LSBmcmVhZChoZXJlKCJHT19QU19ncm91cDIudHN2IikpCkdPMy5kZiA8LSBmcmVhZChoZXJlKCJHT19QU19ncm91cDMudHN2IikpCkdPNC5kZiA8LSBmcmVhZChoZXJlKCJHT19QU19ncm91cDQudHN2IikpCgpzdWJzZXQwIDwtIEdPMC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gIkdyb3VwIDAiKSAlPiUKICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdCkKc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJHcm91cCAxIikgJT4lCiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpCnN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSAiR3JvdXAgMiIpICU+JQogIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KQpzdWJzZXQzIDwtIEdPMy5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gIkdyb3VwIDMiKSAlPiUKICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdCkKc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJHcm91cCA0IikgJT4lCiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpCgpzdWJzZXQwJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MCRHZW5lUmF0aW8sICIvIiksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKQpzdWJzZXQxJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MSRHZW5lUmF0aW8sICIvIiksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKQpzdWJzZXQyJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MiRHZW5lUmF0aW8sICIvIiksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKQpzdWJzZXQzJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MyRHZW5lUmF0aW8sICIvIiksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKQpzdWJzZXQ0JEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0NCRHZW5lUmF0aW8sICIvIiksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKQoKCkdPbGlzdCA8LSBmYWN0b3IoYygiR086MDAwODM4MCIsICJHTzowMDA2Mzk3IiwgIkdPOjAwMzQ0NzAiLCAiR086MDAyMjYxMyIsICJHTzowMDE2MDU1IiwKICAgICAgICAgICAgICAgICAgICJHTzowMDYxMTM4IiwgIkdPOjAwNjA1NjIiLCAiR086MDAwNzM4OSIsICJHTzowMDYwNDg1IiwgIkdPOjAwNDg2MzgiLCAiR086MDA0NTY2NCIpKQoKZGF0YSA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKGJpbmRfcm93cyhiaW5kX3Jvd3Moc3Vic2V0MCwgc3Vic2V0MSksIHN1YnNldDIpLCBzdWJzZXQzKSwgc3Vic2V0NCkgJT4lCiAgZHBseXI6OmZpbHRlcihJRCAlaW4lIEdPbGlzdCkKCmRlc2NPcmRlciA8LSBzb3J0KHVuaXF1ZShkYXRhJERlc2NyaXB0aW9uKSlbcmV2KGMoMTAsIDQsIDUsIDksIDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMSwgOCwgNykpXQoKZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKHBWYWx1ZUxvZyA9IG1pbigtbG9nMTAocC5hZGp1c3QpLCBwVmFsdWVMb2dNYXgpKQpwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gZmFjdG9yKERlc2NyaXB0aW9uLCBsZXZlbHMgPSBkZXNjT3JkZXIpLCBzaXplID0gcFZhbHVlTG9nLCBmaWxsID0gR2VuZVJhdGlvKSkgKyAKICBnZW9tX3BvaW50KHNoYXBlID0gMjEsICAgICAgICAjIEVuc3VyZXMgYSBwb2ludCB3aXRoIGFuIG91dGxpbmUKICAgICAgICAgICAgIHN0cm9rZSA9IDEqcHRUb01NKSArIAogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIndoaXRlIiwgaGlnaCA9ICIjQ0IzMzNBIiwKICAgICAgICAgICAgICAgICAgICAgICMgbGltaXRzID0gYygwLCAxKSwKICAgICAgICAgICAgICAgICAgICAgIG9vYiA9IHNjYWxlczo6c3F1aXNoLCAjIERlZmluZSBncmFkaWVudCBjb2xvcnMKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoCiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyCiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhcgogICAgICAgICAgICAgICAgICAgICAgKQogICkgKyAKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKwogIHRoZW1lX2J3KCkgKyAgIyBBcHBseSB0aGVtZV9idyBmaXJzdCwgc28gY3VzdG9tIHRoZW1lIHNldHRpbmdzIGNvbWUgYWZ0ZXIKICB0aGVtZSgKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLCAgIyBPdmVycmlkZSB0aGVtZV9idyBwYW5lbAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsICAgICAgICAgIyBFbnN1cmUgc2l6ZSBpcyBzZXQgZm9yIHgtYXhpcyB0ZXh0CiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeS1heGlzIHRleHQKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBsaW5laGVpZ2h0ID0gMC45ICAgICAgICAgICMgQWxsb3dzIHdyYXBwaW5nIGZvciB5LWF4aXMgbGFiZWxzIHRvIGZpdCBpbnRvIDIgbGluZXMKICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkKCmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCAiLi4iLCAiR08iLCAiR09fZ3JvdXBzX3BzIikKd2lkdGggPC0gcGFuZWxTaXplKDIuNykqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoCnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIGxvb3Agc2NvcmUKYGBge3J9CmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbWVhbl9kaWZmX3Njb3JlCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMikgKSRtZWFuX2RpZmZfc2NvcmUKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9CgpwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjAiLCAicHNPdmVyMSIpLCA1KQpwczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjEiLCAicHNPdmVyMiIpLCA1KQpwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjIiLCAicHNPdmVyMyIpLCA1KQpwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjMiLCAicHNPdmVyNCIpLCA1KQpwczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjIiLCAicHNPdmVyNCIpLCA1KQpwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjEiLCAicHNPdmVyNCIpLCA1KQpwczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjAiLCAicHNPdmVyNCIpLCA1KQoKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gcHNPdmVyLCB5ID0gbWVhbl9kaWZmX3Njb3JlKSkgKyAKICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIAogICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQQogICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9ICJBdmVyYWdlIM6UIGxvb3Agc2NvcmUiKSArCiAgc3RhdF9zdW1tYXJ5KAogICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LAogICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIgogICkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgKwogIHRoZW1lKAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEKICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgKSsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwYXN0ZTAoInBzMDE6ICIsIGNvbnZQdmFsdWUocHMwMSksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczEyOiAiLCBjb252UHZhbHVlKHBzMTIpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyMzogIiwgY29udlB2YWx1ZShwczIzKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMzQ6ICIsIGNvbnZQdmFsdWUocHMzNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczI0OiAiLCBjb252UHZhbHVlKHBzMjQpLCAiXG4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTQ6ICIsIGNvbnZQdmFsdWUocHMxNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczA0OiAiLCBjb252UHZhbHVlKHBzMDQpLCAiXG4iKSwgCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAyKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNzc3Nzc3IiwgIiM4QjdFNjUiLCAiI0EyODQ1MiIsICIjQzI4ODREIiwgIiNGMjhFMkMiKSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC41LCAwLjEpKQoKCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImRpZmZTY29yZV9iYXJwbG90X3BzR3JvdXBfZFRBR192c19ETVNPXzIiKQp3aWR0aCA8LSAzMyptbVRvSW5jaApoZWlnaHQgPC0zMyptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIGxvZzJGQwpgYGB7cn0KdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKGFic0xvZzJGQyA9IGFicyhsb2cyRm9sZENoYW5nZSkpCgprc19yZXN1bHQxIDwtIGtzLnRlc3QoCiAgdGVtcCAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT0gInBzT3ZlcjQiKSAlPiUgcHVsbChhYnNMb2cyRkMpLAogIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09ICJwc092ZXIzIikgJT4lIHB1bGwoYWJzTG9nMkZDKQopCmtzX3Jlc3VsdDIgPC0ga3MudGVzdCgKICB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PSAicHNPdmVyNCIpICU+JSBwdWxsKGFic0xvZzJGQyksCiAgdGVtcCAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT0gInBzT3ZlcjIiKSAlPiUgcHVsbChhYnNMb2cyRkMpCikKa3NfcmVzdWx0MyA8LSBrcy50ZXN0KAogIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09ICJwc092ZXI0IikgJT4lIHB1bGwoYWJzTG9nMkZDKSwKICB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PSAicHNPdmVyMSIpICU+JSBwdWxsKGFic0xvZzJGQykKKQprc19yZXN1bHQ0IDwtIGtzLnRlc3QoCiAgdGVtcCAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT0gInBzT3ZlcjQiKSAlPiUgcHVsbChhYnNMb2cyRkMpLAogIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09ICJwc092ZXIwIikgJT4lIHB1bGwoYWJzTG9nMkZDKQopCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGFic0xvZzJGQywgY29sb3IgPSBwc092ZXIpKSArCnNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSAoYygiIzc3Nzc3NyIsICIjOEI3RTY1IiwgIiNBMjg0NTIiLCAiI0MyODg0RCIsICIjRjI4RTJDIikpKSArCiAgc3RhdF9lY2RmKHNpemUgPSAwLjQsIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiApICsgIyBVc2Ugc3RhdF9lY2RmIHRvIHBsb3QgdGhlIGVtcGlyaWNhbCBDREYKICBsYWJzKAogICAgeCA9ICJBYnMuIGxvZzIoZm9sZCBjaGFuZ2UpIiwKICAgIHkgPSAiQ3VtdWxhdGl2ZSBQcm9iYWJpbGl0eSIKICApICsgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDEuNSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKyAjIENsZWFuIHRoZW1lCiAgdGhlbWUoCiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICAgICkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMC4xKSkKZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfY2RmX3BzR3JvdXBfZFRBR192c19ETVNPIikKd2lkdGggPC0gMzMqbW1Ub0luY2gKaGVpZ2h0IDwtMzMqbW1Ub0luY2gKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCgoKCiMKIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbG9nMkZvbGRDaGFuZ2UKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJGxvZzJGb2xkQ2hhbmdlCiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKdGVtcERvd24gPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA8IDApCiAKcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMCIsICJwc092ZXIxIiksIDUpCnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjEiLCAicHNPdmVyMiIpLCA1KQpwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwc092ZXIyIiwgInBzT3ZlcjMiKSwgNSkKcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMyIsICJwc092ZXI0IiksIDUpCnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjIiLCAicHNPdmVyNCIpLCA1KQpwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwc092ZXIxIiwgInBzT3ZlcjQiKSwgNSkKCnBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjAiLCAicHNPdmVyNCIpLCA1KQoKCnAgPC0gZ2dwbG90KHRlbXBEb3duLCBhZXMoeCA9IHBzT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjRDlEOUQ5IiwgIiNCRkJGQkYiLCAiI0E2QTZBNiIsICIjOEM4QzhDIiwgIiM3MzczNzMiKSkgKyAjIEZpdmUgc2hhZGVzIG9mIGdyZXkKICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIAogICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEKICApICsgdGhlbWVfY2xhc3NpYygpICsgbGFicyh4ID0gTlVMTCAsIHkgPSAibG9nMihmb2xkIGNoYW5nZSkiKSArCiAgc3RhdF9zdW1tYXJ5KAogICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMSwKICAgIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siCiAgKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMQogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAtMC41LCBsYWJlbCA9IHBhc3RlMCgicHMwMTogIiwgY29udlB2YWx1ZShwczAxKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTI6ICIsIGNvbnZQdmFsdWUocHMxMiksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczIzOiAiLCBjb252UHZhbHVlKHBzMjMpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMzNDogIiwgY29udlB2YWx1ZShwczM0KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjQ6ICIsIGNvbnZQdmFsdWUocHMyNCksICJcbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMxNDogIiwgY29udlB2YWx1ZShwczE0KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMDQ6ICIsIGNvbnZQdmFsdWUocHMwNCksICJcbiIpLCAKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDIpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0xLCAwKSkKICAKZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfYmFycGxvdF9wc0dyb3VwX2RUQUdfdnNfRE1TT19kb3duIikKd2lkdGggPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxKSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKCgp0ZW1wVXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA+IDApCiAKcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBzT3ZlcjAiLCAicHNPdmVyMSIpLCA1KQpwczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMSIsICJwc092ZXIyIiksIDUpCnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwc092ZXIyIiwgInBzT3ZlcjMiKSwgNSkKcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBzT3ZlcjMiLCAicHNPdmVyNCIpLCA1KQpwczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMiIsICJwc092ZXI0IiksIDUpCnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwc092ZXIxIiwgInBzT3ZlcjQiKSwgNSkKcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBzT3ZlcjAiLCAicHNPdmVyNCIpLCA1KQoKCgoKcCA8LSBnZ3Bsb3QodGVtcFVwLCBhZXMoeCA9IHBzT3ZlciwgeSA9IGxvZzJGb2xkQ2hhbmdlKSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjRDlEOUQ5IiwgIiNCRkJGQkYiLCAiI0E2QTZBNiIsICIjOEM4QzhDIiwgIiM3MzczNzMiKSkgKyAjIEZpdmUgc2hhZGVzIG9mIGdyZXkKICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIAogICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEKICApICsgdGhlbWVfY2xhc3NpYygpICsgbGFicyh4ID0gTlVMTCAsIHkgPSAibG9nMihmb2xkIGNoYW5nZSkiKSArCiAgc3RhdF9zdW1tYXJ5KAogICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMSwKICAgIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siCiAgKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMQogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAwLjUsIGxhYmVsID0gcGFzdGUwKCJwczAxOiAiLCBjb252UHZhbHVlKHBzMDEpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMxMjogIiwgY29udlB2YWx1ZShwczEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjM6ICIsIGNvbnZQdmFsdWUocHMyMyksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczM0OiAiLCBjb252UHZhbHVlKHBzMzQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyNDogIiwgY29udlB2YWx1ZShwczI0KSwgIlxuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczE0OiAiLCBjb252UHZhbHVlKHBzMTQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMwNDogIiwgY29udlB2YWx1ZShwczA0KSwgIlxuIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpCgogIApmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ19iYXJwbG90X3BzR3JvdXBfZFRBR192c19ETVNPX3VwIikKd2lkdGggPC0gcGFuZWxTaXplKDEuMTgpKm1tVG9JbmNoCmhlaWdodCA8LSBwYW5lbFNpemUoMSkqbW1Ub0luY2gKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgoKIyMjIyBHcm91cGluZyB3aXRoIFAtRSBudW1iZXIKIyMjIyMgR3JvdXBpbmcKYGBge3J9CiMgdGVtcDIgY29udGFpbnMgZ2VuZXMgZnJvbSBncm91cCAxLCAyLCA1LCA4IGFuZCBsb29wIGNvdW50cwojY2FsY3VsYXRpbmcgZGlmZiBzY29yZSBhbmQgbG9nMmZjIGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiBwLW4gbnVtYmVycwoKcHNPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDQpKSRnZW5lCnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAzLCBudW1fcGUgPCA0KSkkZ2VuZQpwc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmUKcHNPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDEsIG51bV9wZSA8IDIpKSRnZW5lCnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA8IDEpKSRnZW5lCgoKCiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzCnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfZFRBR19ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIAogIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9kVEFHX0RNU08pLAogICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpCgpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCgptYXhMb2cyRkMgPSAyCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZmxhZyA9IGlmZWxzZShnZW5lICVpbiUgZGlmZi5STkEuRzEuZFRBRyRlbnNlbWJsX2dlbmVfaWQsICIyRE9XTiIsICIwTk8iKSwKICAgICAgICAgICAgICAgIG1heEZsYWcgPSAoYWJzKHNocmlua2VkX2xvZzJGQykgPiBtYXhMb2cyRkMpLAogICAgICAgICAgICAgICAgbG9nMmZjTWF4ID0gcG1heChwbWluKHNocmlua2VkX2xvZzJGQywgbWF4TG9nMkZDKSwgLW1heExvZzJGQykpICU+JSAKICBkcGx5cjo6YXJyYW5nZShmbGFnKSAlPiUKICBkcm9wX25hKHNocmlua2VkX2xvZzJGQykKCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZSgKICBwc092ZXIgPSBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjQsICJwc092ZXI0IiwKICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIzLCAicHNPdmVyMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjIsICJwc092ZXIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjEsICJwc092ZXIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIwLCAicHNPdmVyMCIsIE5BKSkpKSkpICU+JQogIGRyb3BfbmEocHNPdmVyKQoKYGBgCgojIyMjIyBHTyBmb3IgZWFjaCBncm91cApgYGB7cn0KR09maWdEaXIgPC0gaGVyZShmaWdEaXIsICIuLi9HTyIpCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwpHTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIsIHJlYWRhYmxlID0gVFJVRSkpCkdPMS5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIiwgcmVhZGFibGUgPSBUUlVFKSkKR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiLCByZWFkYWJsZSA9IFRSVUUpKQpHTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIsIHJlYWRhYmxlID0gVFJVRSkpCkdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIiwgcmVhZGFibGUgPSBUUlVFKSkKCiMgZndyaXRlKEdPMC5kZiwgaGVyZSgiR09fUEVfZ3JvdXAwLnRzdiIpLCBzZXAgPSAiXHQiKQojIGZ3cml0ZShHTzEuZGYsIGhlcmUoIkdPX1BFX2dyb3VwMS50c3YiKSwgc2VwID0gIlx0IikKIyBmd3JpdGUoR08yLmRmLCBoZXJlKCJHT19QRV9ncm91cDIudHN2IiksIHNlcCA9ICJcdCIpCiMgZndyaXRlKEdPMy5kZiwgaGVyZSgiR09fUEVfZ3JvdXAzLnRzdiIpLCBzZXAgPSAiXHQiKQojIGZ3cml0ZShHTzQuZGYsIGhlcmUoIkdPX1BFX2dyb3VwNC50c3YiKSwgc2VwID0gIlx0IikKCgpzdWJzZXQwIDwtIEdPMC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gIkdyb3VwIDAiKSAlPiUKICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdCkKc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJHcm91cCAxIikgJT4lCiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpCnN1YnNldDIgPC0gR08yLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSAiR3JvdXAgMiIpICU+JQogIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KQpzdWJzZXQzIDwtIEdPMy5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gIkdyb3VwIDMiKSAlPiUKICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdCkKc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJHcm91cCA0IikgJT4lCiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpCgpzdWJzZXQwJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MCRHZW5lUmF0aW8sICIvIiksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKQpzdWJzZXQxJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MSRHZW5lUmF0aW8sICIvIiksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKQpzdWJzZXQyJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MiRHZW5lUmF0aW8sICIvIiksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKQpzdWJzZXQzJEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0MyRHZW5lUmF0aW8sICIvIiksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKQpzdWJzZXQ0JEdlbmVSYXRpbyA8LSBzYXBwbHkoc3Ryc3BsaXQoc3Vic2V0NCRHZW5lUmF0aW8sICIvIiksIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkgLyBhcy5udW1lcmljKHhbMl0pKQoKR09saXN0IDwtIGZhY3RvcihjKCJHTzowMDA4MzgwIiwgIkdPOjAwMDYzOTciLCAiR086MDAzNDQ3MCIsICJHTzowMDIyNjEzIiwgIkdPOjAwMTYwNTUiLAogICAgICAgICAgICAgICAgICAgIkdPOjAwNjExMzgiLCAiR086MDA2MDU2MiIsICJHTzowMDA3Mzg5IiwgIkdPOjAwNjA0ODUiLCAiR086MDA0ODYzOCIsICJHTzowMDQ1NjY0IiwKICAgICAgICAgICAgICAgICAgICJHTzowMDQwMDI5IikpCgpkYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3MoYmluZF9yb3dzKHN1YnNldDAsIHN1YnNldDEpLCBzdWJzZXQyKSwgc3Vic2V0NCkgJT4lCiAgZHBseXI6OmZpbHRlcihJRCAlaW4lIEdPbGlzdCkKCmRlc2NPcmRlciA8LSBzb3J0KHVuaXF1ZShkYXRhJERlc2NyaXB0aW9uKSlbcmV2KGMoMTEsIDUsIDYsIDEwLCAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDcsIDQsIDIsIDksIDgpKV0KCmVtcHR5X3JvdzMgPC0gZGF0YS5mcmFtZSgKICBJRCA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBzcGVjaWZpYyBJRAogIERlc2NyaXB0aW9uID0gTkEsICAgICAgICAgICAgICAgICAgICAjIE5vIGRlc2NyaXB0aW9uCiAgR2VuZVJhdGlvID0gTkEsICAgICAgICAgICAgICAgICAgICAgICMgTm8gZ2VuZSByYXRpbwogIHAuYWRqdXN0ID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHAuYWRqdXN0IHZhbHVlCiAgZ3JvdXAgPSAiR3JvdXAgMyIgICAgICAgICAgICAgICAgICAgIyBHcm91cCB0byBhZGQgYXMgZW1wdHkgY29sdW1uCikKCmVtcHR5X3JvdzQgPC0gZGF0YS5mcmFtZSgKICBJRCA9IE5BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBzcGVjaWZpYyBJRAogIERlc2NyaXB0aW9uID0gTkEsICAgICAgICAgICAgICAgICAgICAjIE5vIGRlc2NyaXB0aW9uCiAgR2VuZVJhdGlvID0gTkEsICAgICAgICAgICAgICAgICAgICAgICMgTm8gZ2VuZSByYXRpbwogIHAuYWRqdXN0ID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHAuYWRqdXN0IHZhbHVlCiAgZ3JvdXAgPSAiR3JvdXAgNCIgICAgICAgICAgICAgICAgICAgIyBHcm91cCB0byBhZGQgYXMgZW1wdHkgY29sdW1uCikKCiMgQXBwZW5kIHRoZSBlbXB0eSByb3cgdG8geW91ciBkYXRhc2V0CmRhdGEgPC0gcmJpbmQoZGF0YSwgZW1wdHlfcm93MywgZW1wdHlfcm93NCkKCgpkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUocFZhbHVlTG9nID0gbWluKC1sb2cxMChwLmFkanVzdCksIHBWYWx1ZUxvZ01heCkpCnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBmYWN0b3IoRGVzY3JpcHRpb24sIGxldmVscyA9IGRlc2NPcmRlciksIHNpemUgPSBwVmFsdWVMb2csIGZpbGwgPSBHZW5lUmF0aW8pKSArIAogIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgICAgICAgICMgRW5zdXJlcyBhIHBvaW50IHdpdGggYW4gb3V0bGluZQogICAgICAgICAgICAgc3Ryb2tlID0gMSpwdFRvTU0pICsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjUsIDIpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gIiNDQjMzM0EiLAogICAgICAgICAgICAgICAgICAgICAgIyBsaW1pdHMgPSBjKDAsIDEpLAogICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9ycwogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcigKICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXIKICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyCiAgICAgICAgICAgICAgICAgICAgICApCiAgKSArIAogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArCiAgdGhlbWVfYncoKSArICAjIEFwcGx5IHRoZW1lX2J3IGZpcnN0LCBzbyBjdXN0b20gdGhlbWUgc2V0dGluZ3MgY29tZSBhZnRlcgogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksICAjIE92ZXJyaWRlIHRoZW1lX2J3IHBhbmVsCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeC1heGlzIHRleHQKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLCAgICAgICAgICMgRW5zdXJlIHNpemUgaXMgc2V0IGZvciB5LWF4aXMgdGV4dAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIGxpbmVoZWlnaHQgPSAwLjkgICAgICAgICAgIyBBbGxvd3Mgd3JhcHBpbmcgZm9yIHktYXhpcyBsYWJlbHMgdG8gZml0IGludG8gMiBsaW5lcwogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgKQoKZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsICIuLiIsICJHTyIsICJHT19ncm91cHNfcGUiKQp3aWR0aCA8LSBwYW5lbFNpemUoMi42NSkqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjMpKm1tVG9JbmNoCnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKIyMjIyMgbG9vcCBzY29yZQpgYGB7cn0KZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRtZWFuX2RpZmZfc2NvcmUKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJG1lYW5fZGlmZl9zY29yZQogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMCIsICJwc092ZXIxIiksIDUpCnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMSIsICJwc092ZXIyIiksIDUpCnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMiIsICJwc092ZXIzIiksIDUpCnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMyIsICJwc092ZXI0IiksIDUpCnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMiIsICJwc092ZXI0IiksIDUpCnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMSIsICJwc092ZXI0IiksIDUpCnBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMCIsICJwc092ZXI0IiksIDUpCgoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwc092ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIAogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzc3Nzc3NyIsICIjOEI3RTY1IiwgIiNBMjg0NTIiLCAiI0MyODg0RCIsICIjRjI4RTJDIikpICsKICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIAogICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQQogICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9ICJBdmVyYWdlIM6UIGxvb3Agc2NvcmUiKSArCiAgc3RhdF9zdW1tYXJ5KAogICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LAogICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIgogICkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgKwogIHRoZW1lKAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEKICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgKSsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwYXN0ZTAoInBzMDE6ICIsIGNvbnZQdmFsdWUocHMwMSksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczEyOiAiLCBjb252UHZhbHVlKHBzMTIpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyMzogIiwgY29udlB2YWx1ZShwczIzKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMzQ6ICIsIGNvbnZQdmFsdWUocHMzNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczI0OiAiLCBjb252UHZhbHVlKHBzMjQpLCAiXG4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTQ6ICIsIGNvbnZQdmFsdWUocHMxNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczA0OiAiLCBjb252UHZhbHVlKHBzMDQpLCAiXG4iKSwgCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAyKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuMSkpCgoKZmlsZU5hbWUgPC0gcGFzdGUwKCJkaWZmU2NvcmVfYmFycGxvdF9wZUdyb3VwX2RUQUdfdnNfRE1TTyIpCndpZHRoIDwtIDMzKm1tVG9JbmNoCmhlaWdodCA8LTMzKm1tVG9JbmNoCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKIyMjIyMgbG9nMkZDCmBgYHtyfQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoYWJzTG9nMkZDID0gYWJzKGxvZzJGb2xkQ2hhbmdlKSkKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBhYnNMb2cyRkMsIGNvbG9yID0gcHNPdmVyKSkgKwpzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gKGMoIiM3Nzc3NzciLCAiIzhCN0U2NSIsICIjQTI4NDUyIiwgIiNDMjg4NEQiLCAiI0YyOEUyQyIpKSkgKwogIHN0YXRfZWNkZihzaXplID0gMC40LCBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIgKSArICMgVXNlIHN0YXRfZWNkZiB0byBwbG90IHRoZSBlbXBpcmljYWwgQ0RGCiAgbGFicygKICAgIHggPSAiQWJzLiBsb2cyKGZvbGQgY2hhbmdlKSIsCiAgICB5ID0gIkN1bXVsYXRpdmUgUHJvYmFiaWxpdHkiCiAgKSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxLjUpKSArCiAgdGhlbWVfY2xhc3NpYygpICsgIyBDbGVhbiB0aGVtZQogIHRoZW1lKAogICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgICApICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDAuMSkpCmZpbGVOYW1lIDwtIHBhc3RlMCgibG9nMkZDX2NkZl9wZUdyb3VwX2RUQUdfdnNfRE1TTyIpCndpZHRoIDwtIDMzKm1tVG9JbmNoCmhlaWdodCA8LTMzKm1tVG9JbmNoCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKIwogZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZQogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2UKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9Cgp0ZW1wRG93biA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlIDwgMCkKIApwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwc092ZXIwIiwgInBzT3ZlcjEiKSwgNSkKcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMSIsICJwc092ZXIyIiksIDUpCnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjIiLCAicHNPdmVyMyIpLCA1KQpwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwc092ZXIzIiwgInBzT3ZlcjQiKSwgNSkKcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMiIsICJwc092ZXI0IiksIDUpCnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjEiLCAicHNPdmVyNCIpLCA1KQoKcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMCIsICJwc092ZXI0IiksIDUpCgoKcCA8LSBnZ3Bsb3QodGVtcERvd24sIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNEOUQ5RDkiLCAiI0JGQkZCRiIsICIjQTZBNkE2IiwgIiM4QzhDOEMiLCAiIzczNzM3MyIpKSArICMgRml2ZSBzaGFkZXMgb2YgZ3JleQogIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQQogICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9ICJsb2cyKGZvbGQgY2hhbmdlKSIpICsKICBzdGF0X3N1bW1hcnkoCiAgICBhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLAogICAgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAxLAogICAgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIKICApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IC0wLjUsIGxhYmVsID0gcGFzdGUwKCJwczAxOiAiLCBjb252UHZhbHVlKHBzMDEpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMxMjogIiwgY29udlB2YWx1ZShwczEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjM6ICIsIGNvbnZQdmFsdWUocHMyMyksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczM0OiAiLCBjb252UHZhbHVlKHBzMzQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyNDogIiwgY29udlB2YWx1ZShwczI0KSwgIlxuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczE0OiAiLCBjb252UHZhbHVlKHBzMTQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMwNDogIiwgY29udlB2YWx1ZShwczA0KSwgIlxuIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEsIDApKQogIApmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ19iYXJwbG90X3BlR3JvdXBfZFRBR192c19ETVNPX2Rvd24iKQp3aWR0aCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaApoZWlnaHQgPC0gcGFuZWxTaXplKDEpKm1tVG9JbmNoCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKCnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMCkKIApwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMCIsICJwc092ZXIxIiksIDUpCnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwc092ZXIxIiwgInBzT3ZlcjIiKSwgNSkKcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBzT3ZlcjIiLCAicHNPdmVyMyIpLCA1KQpwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMyIsICJwc092ZXI0IiksIDUpCnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwc092ZXIyIiwgInBzT3ZlcjQiKSwgNSkKcHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBzT3ZlcjEiLCAicHNPdmVyNCIpLCA1KQpwczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMCIsICJwc092ZXI0IiksIDUpCgoKCgpwIDwtIGdncGxvdCh0ZW1wVXAsIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNEOUQ5RDkiLCAiI0JGQkZCRiIsICIjQTZBNkE2IiwgIiM4QzhDOEMiLCAiIzczNzM3MyIpKSArICMgRml2ZSBzaGFkZXMgb2YgZ3JleQogIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQQogICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9ICJsb2cyKGZvbGQgY2hhbmdlKSIpICsKICBzdGF0X3N1bW1hcnkoCiAgICBhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLAogICAgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAxLAogICAgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIKICApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoInBzMDE6ICIsIGNvbnZQdmFsdWUocHMwMSksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczEyOiAiLCBjb252UHZhbHVlKHBzMTIpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyMzogIiwgY29udlB2YWx1ZShwczIzKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMzQ6ICIsIGNvbnZQdmFsdWUocHMzNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczI0OiAiLCBjb252UHZhbHVlKHBzMjQpLCAiXG4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTQ6ICIsIGNvbnZQdmFsdWUocHMxNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczA0OiAiLCBjb252UHZhbHVlKHBzMDQpLCAiXG4iKSwgCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAyKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSkKCiAgCmZpbGVOYW1lIDwtIHBhc3RlMCgibG9nMkZDX2JhcnBsb3RfcGVHcm91cF9kVEFHX3ZzX0RNU09fdXAiKQp3aWR0aCA8LSBwYW5lbFNpemUoMS4xOCkqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxKSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCgojIyMjIEdyb3VwaW5nIHdpdGggUC1QIG51bWJlcgojIyMjIyBHcm91cGluZwpgYGB7cn0KIyB0ZW1wMiBjb250YWlucyBnZW5lcyBmcm9tIGdyb3VwIDEsIDIsIDUsIDggYW5kIGxvb3AgY291bnRzCiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzCgpwc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gNCkpJGdlbmUKcHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lCnBzT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAyLCBudW1fcHAgPCAzKSkkZ2VuZQpwc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMSwgbnVtX3BwIDwgMikpJGdlbmUKcHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmUKCgoKIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHMKdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9kVEFHX0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgCiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX2RUQUdfRE1TTyksCiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSwKICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykKCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5kVEFHX0cxLjJpLmRUQUdfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSkKCm1heExvZzJGQyA9IDIKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShmbGFnID0gaWZlbHNlKGdlbmUgJWluJSBkaWZmLlJOQS5HMS5kVEFHJGVuc2VtYmxfZ2VuZV9pZCwgIjJET1dOIiwgIjBOTyIpLAogICAgICAgICAgICAgICAgbWF4RmxhZyA9IChhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IG1heExvZzJGQyksCiAgICAgICAgICAgICAgICBsb2cyZmNNYXggPSBwbWF4KHBtaW4oc2hyaW5rZWRfbG9nMkZDLCBtYXhMb2cyRkMpLCAtbWF4TG9nMkZDKSkgJT4lIAogIGRwbHlyOjphcnJhbmdlKGZsYWcpICU+JQogIGRyb3BfbmEoc2hyaW5rZWRfbG9nMkZDKQoKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKAogIHBzT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcHNPdmVyNCwgInBzT3ZlcjQiLAogICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjMsICJwc092ZXIzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMiwgInBzT3ZlcjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMSwgInBzT3ZlcjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBzT3ZlcjAsICJwc092ZXIwIiwgTkEpKSkpKSkgJT4lCiAgZHJvcF9uYShwc092ZXIpCgoKYGBgCiMjIyMjIEdPIGZvciBlYWNoIGdyb3VwCmBgYHtyfQpHT2ZpZ0RpciA8LSBoZXJlKGZpZ0RpciwgIi4uL0dPIikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwpHTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIsIHJlYWRhYmxlID0gVFJVRSkpCkdPMS5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIiwgcmVhZGFibGUgPSBUUlVFKSkKR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiLCByZWFkYWJsZSA9IFRSVUUpKQpHTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIsIHJlYWRhYmxlID0gVFJVRSkpCkdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIiwgcmVhZGFibGUgPSBUUlVFKSkKIyAKIyBmd3JpdGUoR08wLmRmLCBoZXJlKCJHT19QUF9ncm91cDAudHN2IiksIHNlcCA9ICJcdCIpCiMgZndyaXRlKEdPMS5kZiwgaGVyZSgiR09fUFBfZ3JvdXAxLnRzdiIpLCBzZXAgPSAiXHQiKQojIGZ3cml0ZShHTzIuZGYsIGhlcmUoIkdPX1BQX2dyb3VwMi50c3YiKSwgc2VwID0gIlx0IikKIyBmd3JpdGUoR08zLmRmLCBoZXJlKCJHT19QUF9ncm91cDMudHN2IiksIHNlcCA9ICJcdCIpCiMgZndyaXRlKEdPNC5kZiwgaGVyZSgiR09fUFBfZ3JvdXA0LnRzdiIpLCBzZXAgPSAiXHQiKQoKc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJHcm91cCAwIikgJT4lCiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpCnN1YnNldDEgPC0gR08xLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSAiR3JvdXAgMSIpICU+JQogIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KQpzdWJzZXQyIDwtIEdPMi5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gIkdyb3VwIDIiKSAlPiUKICBkcGx5cjo6YXJyYW5nZShwLmFkanVzdCkKc3Vic2V0MyA8LSBHTzMuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJHcm91cCAzIikgJT4lCiAgZHBseXI6OmFycmFuZ2UocC5hZGp1c3QpCnN1YnNldDQgPC0gR080LmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSAiR3JvdXAgNCIpICU+JQogIGRwbHlyOjphcnJhbmdlKHAuYWRqdXN0KQoKc3Vic2V0MCRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDAkR2VuZVJhdGlvLCAiLyIpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSkKc3Vic2V0MSRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDEkR2VuZVJhdGlvLCAiLyIpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSkKc3Vic2V0MiRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDIkR2VuZVJhdGlvLCAiLyIpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSkKc3Vic2V0MyRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDMkR2VuZVJhdGlvLCAiLyIpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSkKc3Vic2V0NCRHZW5lUmF0aW8gPC0gc2FwcGx5KHN0cnNwbGl0KHN1YnNldDQkR2VuZVJhdGlvLCAiLyIpLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pIC8gYXMubnVtZXJpYyh4WzJdKSkKCkdPbGlzdCA8LSBmYWN0b3IoYygiR086MDAwODM4MCIsICJHTzowMDA2Mzk3IiwgIkdPOjAwMzQ0NzAiLCAiR086MDAyMjYxMyIsICJHTzowMDE2MDU1IiwKICAgICAgICAgICAgICAgICAgICJHTzowMDYxMTM4IiwgIkdPOjAwNjA1NjIiLCAiR086MDAwNzM4OSIsICJHTzowMDYwNDg1IiwgIkdPOjAwNDg2MzgiLCAiR086MDA0NTY2NCIpKQoKZGF0YSA8LSBiaW5kX3Jvd3Moc3Vic2V0MCwgc3Vic2V0MSkgJT4lCiAgZHBseXI6OmZpbHRlcihJRCAlaW4lIEdPbGlzdCkKCgoKZW1wdHlfcm93MiA8LSBkYXRhLmZyYW1lKAogIElEID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHNwZWNpZmljIElECiAgRGVzY3JpcHRpb24gPSBOQSwgICAgICAgICAgICAgICAgICAgICMgTm8gZGVzY3JpcHRpb24KICBHZW5lUmF0aW8gPSBOQSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBnZW5lIHJhdGlvCiAgcC5hZGp1c3QgPSBOQSwgICAgICAgICAgICAgICAgICAgICAgICMgTm8gcC5hZGp1c3QgdmFsdWUKICBncm91cCA9ICJHcm91cCAyIiAgICAgICAgICAgICAgICAgICAjIEdyb3VwIHRvIGFkZCBhcyBlbXB0eSBjb2x1bW4KKQoKZW1wdHlfcm93MyA8LSBkYXRhLmZyYW1lKAogIElEID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHNwZWNpZmljIElECiAgRGVzY3JpcHRpb24gPSBOQSwgICAgICAgICAgICAgICAgICAgICMgTm8gZGVzY3JpcHRpb24KICBHZW5lUmF0aW8gPSBOQSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBnZW5lIHJhdGlvCiAgcC5hZGp1c3QgPSBOQSwgICAgICAgICAgICAgICAgICAgICAgICMgTm8gcC5hZGp1c3QgdmFsdWUKICBncm91cCA9ICJHcm91cCAzIiAgICAgICAgICAgICAgICAgICAjIEdyb3VwIHRvIGFkZCBhcyBlbXB0eSBjb2x1bW4KKQoKZW1wdHlfcm93NCA8LSBkYXRhLmZyYW1lKAogIElEID0gTkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vIHNwZWNpZmljIElECiAgRGVzY3JpcHRpb24gPSBOQSwgICAgICAgICAgICAgICAgICAgICMgTm8gZGVzY3JpcHRpb24KICBHZW5lUmF0aW8gPSBOQSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBnZW5lIHJhdGlvCiAgcC5hZGp1c3QgPSBOQSwgICAgICAgICAgICAgICAgICAgICAgICMgTm8gcC5hZGp1c3QgdmFsdWUKICBncm91cCA9ICJHcm91cCA0IiAgICAgICAgICAgICAgICAgICAjIEdyb3VwIHRvIGFkZCBhcyBlbXB0eSBjb2x1bW4KKQoKIyBBcHBlbmQgdGhlIGVtcHR5IHJvdyB0byB5b3VyIGRhdGFzZXQKZGF0YSA8LSByYmluZChkYXRhLCBlbXB0eV9yb3cyLCBlbXB0eV9yb3czLCBlbXB0eV9yb3c0KQpkZXNjT3JkZXIgPC0gc29ydCh1bmlxdWUoZGF0YSREZXNjcmlwdGlvbikpW3JldihjKDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDUsIDksIDExLCAxMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgNiwgMywgMSwgOCwgNykpXQpkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoRGVzY3JpcHRpb24gJWluJSBkZXNjT3JkZXIpCgoKZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6cm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKHBWYWx1ZUxvZyA9IG1pbigtbG9nMTAocC5hZGp1c3QpLCBwVmFsdWVMb2dNYXgpKQpwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gZmFjdG9yKERlc2NyaXB0aW9uLCBsZXZlbHMgPSBkZXNjT3JkZXIpLCBzaXplID0gcFZhbHVlTG9nLCBmaWxsID0gR2VuZVJhdGlvKSkgKyAKICBnZW9tX3BvaW50KHNoYXBlID0gMjEsICAgICAgICAjIEVuc3VyZXMgYSBwb2ludCB3aXRoIGFuIG91dGxpbmUKICAgICAgICAgICAgIHN0cm9rZSA9IDEqcHRUb01NKSArIAogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIndoaXRlIiwgaGlnaCA9ICIjQ0IzMzNBIiwKICAgICAgICAgICAgICAgICAgICAgICMgbGltaXRzID0gYygwLCAxKSwKICAgICAgICAgICAgICAgICAgICAgIG9vYiA9IHNjYWxlczo6c3F1aXNoLCAjIERlZmluZSBncmFkaWVudCBjb2xvcnMKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoCiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyCiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhcgogICAgICAgICAgICAgICAgICAgICAgKQogICkgKyAKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKwogIHRoZW1lX2J3KCkgKyAgIyBBcHBseSB0aGVtZV9idyBmaXJzdCwgc28gY3VzdG9tIHRoZW1lIHNldHRpbmdzIGNvbWUgYWZ0ZXIKICB0aGVtZSgKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLCAgIyBPdmVycmlkZSB0aGVtZV9idyBwYW5lbAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsICAgICAgICAgIyBFbnN1cmUgc2l6ZSBpcyBzZXQgZm9yIHgtYXhpcyB0ZXh0CiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywgICAgICAgICAjIEVuc3VyZSBzaXplIGlzIHNldCBmb3IgeS1heGlzIHRleHQKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBsaW5laGVpZ2h0ID0gMC45ICAgICAgICAgICMgQWxsb3dzIHdyYXBwaW5nIGZvciB5LWF4aXMgbGFiZWxzIHRvIGZpdCBpbnRvIDIgbGluZXMKICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkKCmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCAiLi4iLCAiR08iLCAiR09fZ3JvdXBzX3BwIikKd2lkdGggPC0gcGFuZWxTaXplKDIuNjUpKm1tVG9JbmNoCmhlaWdodCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaApzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgojIyMjIyBsb29wIHNjb3JlCmBgYHtyfQpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJG1lYW5fZGlmZl9zY29yZQogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlCiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIwIiwgInBzT3ZlcjEiKSwgNSkKcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIxIiwgInBzT3ZlcjIiKSwgNSkKcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIyIiwgInBzT3ZlcjMiKSwgNSkKcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIzIiwgInBzT3ZlcjQiKSwgNSkKcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIyIiwgInBzT3ZlcjQiKSwgNSkKcHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIxIiwgInBzT3ZlcjQiKSwgNSkKcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIwIiwgInBzT3ZlcjQiKSwgNSkKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gcHNPdmVyLCB5ID0gbWVhbl9kaWZmX3Njb3JlKSkgKyAKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHJldihjKCIjNzc3Nzc3IiwgIiM4QjdFNjUiLCAiI0EyODQ1MiIsICIjQzI4ODREIiwgIiNGMjhFMkMiKSkpICsKICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBzT3ZlciksIAogICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQQogICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9ICJBdmVyYWdlIM6UIGxvb3Agc2NvcmUiKSArCiAgc3RhdF9zdW1tYXJ5KAogICAgYWVzKGdyb3VwID0gcHNPdmVyKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LAogICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIgogICkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgKwogIHRoZW1lKAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEKICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgKSsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwYXN0ZTAoInBzMDE6ICIsIGNvbnZQdmFsdWUocHMwMSksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczEyOiAiLCBjb252UHZhbHVlKHBzMTIpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyMzogIiwgY29udlB2YWx1ZShwczIzKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMzQ6ICIsIGNvbnZQdmFsdWUocHMzNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczI0OiAiLCBjb252UHZhbHVlKHBzMjQpLCAiXG4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTQ6ICIsIGNvbnZQdmFsdWUocHMxNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczA0OiAiLCBjb252UHZhbHVlKHBzMDQpLCAiXG4iKSwgCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAyKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuMSkpCgoKZmlsZU5hbWUgPC0gcGFzdGUwKCJkaWZmU2NvcmVfYmFycGxvdF9wcEdyb3VwX2RUQUdfdnNfRE1TTyIpCndpZHRoIDwtIDMzKm1tVG9JbmNoCmhlaWdodCA8LTMzKm1tVG9JbmNoCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgpgYGAKIyMjIyMgbG9nMkZDCmBgYHtyfQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoYWJzTG9nMkZDID0gYWJzKGxvZzJGb2xkQ2hhbmdlKSkKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBhYnNMb2cyRkMsIGNvbG9yID0gcHNPdmVyKSkgKwpzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gKHJldihjKCIjNzc3Nzc3IiwgIiM4QjdFNjUiLCAiI0EyODQ1MiIsICIjQzI4ODREIiwgIiNGMjhFMkMiKSkpKSArCiAgc3RhdF9lY2RmKHNpemUgPSAwLjQsIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiApICsgIyBVc2Ugc3RhdF9lY2RmIHRvIHBsb3QgdGhlIGVtcGlyaWNhbCBDREYKICBsYWJzKAogICAgeCA9ICJBYnMuIGxvZzIoZm9sZCBjaGFuZ2UpIiwKICAgIHkgPSAiQ3VtdWxhdGl2ZSBQcm9iYWJpbGl0eSIKICApICsgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDEuNSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKyAjIENsZWFuIHRoZW1lCiAgdGhlbWUoCiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICAgICkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMC4xKSkKZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfY2RmX3BwR3JvdXBfZFRBR192c19ETVNPIikKd2lkdGggPC0gMzMqbW1Ub0luY2gKaGVpZ2h0IDwtMzMqbW1Ub0luY2gKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCgoKIwogZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZQogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbG9nMkZvbGRDaGFuZ2UKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9Cgp0ZW1wRG93biA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlIDwgMCkKIApwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwc092ZXIwIiwgInBzT3ZlcjEiKSwgNSkKcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMSIsICJwc092ZXIyIiksIDUpCnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjIiLCAicHNPdmVyMyIpLCA1KQpwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwc092ZXIzIiwgInBzT3ZlcjQiKSwgNSkKcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMiIsICJwc092ZXI0IiksIDUpCnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjEiLCAicHNPdmVyNCIpLCA1KQoKcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMCIsICJwc092ZXI0IiksIDUpCgoKcCA8LSBnZ3Bsb3QodGVtcERvd24sIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNEOUQ5RDkiLCAiI0JGQkZCRiIsICIjQTZBNkE2IiwgIiM4QzhDOEMiLCAiIzczNzM3MyIpKSArICMgRml2ZSBzaGFkZXMgb2YgZ3JleQogIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQQogICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9ICJsb2cyKGZvbGQgY2hhbmdlKSIpICsKICBzdGF0X3N1bW1hcnkoCiAgICBhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLAogICAgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAxLAogICAgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIKICApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IC0wLjUsIGxhYmVsID0gcGFzdGUwKCJwczAxOiAiLCBjb252UHZhbHVlKHBzMDEpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMxMjogIiwgY29udlB2YWx1ZShwczEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjM6ICIsIGNvbnZQdmFsdWUocHMyMyksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczM0OiAiLCBjb252UHZhbHVlKHBzMzQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyNDogIiwgY29udlB2YWx1ZShwczI0KSwgIlxuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczE0OiAiLCBjb252UHZhbHVlKHBzMTQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMwNDogIiwgY29udlB2YWx1ZShwczA0KSwgIlxuIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEsIDApKQogIApmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ19iYXJwbG90X3BwR3JvdXBfZFRBR192c19ETVNPX2Rvd24iKQp3aWR0aCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaApoZWlnaHQgPC0gcGFuZWxTaXplKDEpKm1tVG9JbmNoCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKCnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMCkKIApwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMCIsICJwc092ZXIxIiksIDUpCnBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwc092ZXIxIiwgInBzT3ZlcjIiKSwgNSkKcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBzT3ZlcjIiLCAicHNPdmVyMyIpLCA1KQpwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMyIsICJwc092ZXI0IiksIDUpCnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwc092ZXIyIiwgInBzT3ZlcjQiKSwgNSkKcHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBzT3ZlcjEiLCAicHNPdmVyNCIpLCA1KQpwczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMCIsICJwc092ZXI0IiksIDUpCgoKCgpwIDwtIGdncGxvdCh0ZW1wVXAsIGFlcyh4ID0gcHNPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNEOUQ5RDkiLCAiI0JGQkZCRiIsICIjQTZBNkE2IiwgIiM4QzhDOEMiLCAiIzczNzM3MyIpKSArICMgRml2ZSBzaGFkZXMgb2YgZ3JleQogIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQQogICkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHggPSBOVUxMICwgeSA9ICJsb2cyKGZvbGQgY2hhbmdlKSIpICsKICBzdGF0X3N1bW1hcnkoCiAgICBhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLAogICAgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAxLAogICAgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIKICApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoInBzMDE6ICIsIGNvbnZQdmFsdWUocHMwMSksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczEyOiAiLCBjb252UHZhbHVlKHBzMTIpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyMzogIiwgY29udlB2YWx1ZShwczIzKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMzQ6ICIsIGNvbnZQdmFsdWUocHMzNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczI0OiAiLCBjb252UHZhbHVlKHBzMjQpLCAiXG4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTQ6ICIsIGNvbnZQdmFsdWUocHMxNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczA0OiAiLCBjb252UHZhbHVlKHBzMDQpLCAiXG4iKSwgCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAyKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSkKCiAgCmZpbGVOYW1lIDwtIHBhc3RlMCgibG9nMkZDX2JhcnBsb3RfcHBHcm91cF9kVEFHX3ZzX0RNU09fdXAiKQp3aWR0aCA8LSBwYW5lbFNpemUoMS4xOCkqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxKSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyBBNDg1CiMjIyMgR3JvdXBpbmcgd2l0aCBQLU4gbnVtYmVyCiMjIyMjIEdyb3VwaW5nCmBgYHtyfQojIyMjIyMjIyMjIyMKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIpKSU+JSAKICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLAogICAgICAgICAgICAgICAgcGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkKCgojIHRlbXAyCiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzCnRlbXAyIDwtIHJlYWRSRFMoaGVyZShyZXN1bHREaXIsICJnZW5lX2xvb3BfbGlua19BNDg1LnJkcyIpKQoKcG5PdmVyOCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gOCkpJGdlbmUKcG5PdmVyNiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gNiwgdG90YWwgPCA4KSkkZ2VuZQpwbk92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSA0LCB0b3RhbCA8IDYpKSRnZW5lCnBuT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDIsIHRvdGFsIDwgNCkpJGdlbmUKcG5PdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPCAyKSkkZ2VuZQoKCgojIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwcwp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfQTQ4NV9ETVNPKSwKICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLAogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQoKZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSkKCm1heExvZzJGQyA9IDIKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpCgp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoCiAgcG5PdmVyID0gaWZlbHNlKGdlbmUgJWluJSBwbk92ZXI4LCAicG5PdmVyOCIsCiAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyNiwgInBuT3ZlcjYiLAogICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwbk92ZXI0LCAicG5PdmVyNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwbk92ZXIyLCAicG5PdmVyMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcG5PdmVyMCwgInBuT3ZlcjAiLCBOQSkpKSkpKSAlPiUKICBkcm9wX25hKHBuT3ZlcikKYGBgCgojIyMjIyAoU0tJUCkgR08gZm9yIGVhY2ggZ3JvdXAKYGBge3J9CiMgR09maWdEaXIgPC0gaGVyZShmaWdEaXIsICIuLi9HTyIpCiMgZ2V0R08oInBuT3ZlcjgiLCBHT2ZpZ0RpciwgcG5PdmVyOCkKIyBnZXRHTygicG5PdmVyNiIsIEdPZmlnRGlyLCBwbk92ZXI2KQojIGdldEdPKCJwbk92ZXI0IiwgR09maWdEaXIsIHBuT3ZlcjQpCiMgZ2V0R08oInBuT3ZlcjIiLCBHT2ZpZ0RpciwgcG5PdmVyMikKIyBnZXRHTygicG5PdmVyMCIsIEdPZmlnRGlyLCBwbk92ZXIwKQojIAojICMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIEdPMC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXIwLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCiMgR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBuT3ZlcjIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKSkKIyBHTzQuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcG5PdmVyNCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpKQojIEdPNi5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwbk92ZXI2LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCiMgR084LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBuT3ZlcjgsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKSkKIyAKIyAKIyBzdWJzZXQwIDwtIEdPMC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBuT3ZlcjAiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyBzdWJzZXQyIDwtIEdPMi5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBuT3ZlcjIiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyBzdWJzZXQ0IDwtIEdPNC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBuT3ZlcjQiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyBzdWJzZXQ2IDwtIEdPNi5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBuT3ZlcjYiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyBzdWJzZXQ4IDwtIEdPOC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBuT3ZlcjgiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyAKIyAKIyBHT2xpc3QgPC0gZmFjdG9yKGMoIkdPOjAwMDYzOTciLCAiR086MDAwODM4MCIsICJHTzowMDIyNjEzIiwgIkdPOjAwMzQ0NzAiLAojICAgICAgICAgICAgICAgICAgICAiR086MDAxNjA1NSIsICJHTzowMDA3Mzg5IiwgIkdPOjAwNDg1NjIiLCAiR086MDA0NTE2NSIsIAojICAgICAgICAgICAgICAgICAgICAiR086MDA3MjAwMSIsICJHTzowMDA3NTE3IiwgIkdPOjAwNDg3MDUiKSkKIyAKIyBkYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3MoYmluZF9yb3dzKHN1YnNldDAsIHN1YnNldDIpLCBzdWJzZXQ0KSwgc3Vic2V0OCkgJT4lCiMgICBkcGx5cjo6ZmlsdGVyKElEICVpbiUgR09saXN0KQojIAojIHAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBEZXNjcmlwdGlvbiwgY29sb3IgPSBwLmFkanVzdCwgc2l6ZSA9IGdyKSkgKyAKIyAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKwojICAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gInJlZCIsIGhpZ2ggPSAiYmx1ZSIsIGxpbWl0cyA9IGMoMCwgMC4wNSkpICsKIyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICsKIyAgIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArCiMgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemUKIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKQojICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBsZWdlbmQgdGV4dCBzaXplCiMgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSAKIyAKIyBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgIi4uIiwgIkdPIiwgIkdPX2dyb3Vwc19wbiIpCiMgaGVpZ2h0ID0gMgojIHdpZHRoID0gMy4zCiMgc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIiksIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKIyBwcmludChwKQojIGRldi5vZmYoKQpgYGAKCgojIyMjIyBsb29wIHNjb3JlCmBgYHtyfQojIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewojICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBuT3ZlciA9PWdyb3VwMSkgKSRtZWFuX2RpZmZfc2NvcmUKIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwbk92ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlCiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiMgICByZXR1cm4od2lsJHAudmFsdWUpCiMgfQojIAojIHB2MDIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicG5PdmVyMCIsICJwbk92ZXIyIiksIDUpCiMgcHYyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwbk92ZXIyIiwgInBuT3ZlcjQiKSwgNSkKIyBwdjQ2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBuT3ZlcjQiLCAicG5PdmVyNiIpLCA1KQojIHB2MDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicG5PdmVyMCIsICJwbk92ZXI4IiksIDUpCiMgcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwbk92ZXIyIiwgInBuT3ZlcjgiKSwgNSkKIyBwdjQ4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBuT3ZlcjQiLCAicG5PdmVyOCIpLCA1KQojIHB2NjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicG5PdmVyNiIsICJwbk92ZXI4IiksIDUpCgoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwbk92ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIAogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwbk92ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkKICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMCgicHYwMjogIiwgY29udlB2YWx1ZShwdjAyKSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyNDogIiwgY29udlB2YWx1ZShwdjI0KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY0NjogIiwgY29udlB2YWx1ZShwdjQ2KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY2ODogIiwgY29udlB2YWx1ZShwdjY4KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY0ODogIiwgY29udlB2YWx1ZShwdjQ4KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyODogIiwgY29udlB2YWx1ZShwdjI4KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYwODogIiwgY29udlB2YWx1ZShwdjA4KSwgIlxuIiksIAogICMgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKQoKICAgCmZpbGVOYW1lIDwtIHBhc3RlMCgiZGlmZlNjb3JlX2JhcnBsb3RfcG5Hcm91cF9BNDg1X3ZzX0RNU08iKQpoZWlnaHQgPC0gMwp3aWR0aCA8LSAzCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKIyMjIyMgbG9nMkZDCmBgYHtyfQojCiMgIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewojICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBuT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZQojICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBuT3ZlciA9PWdyb3VwMikgKSRsb2cyRm9sZENoYW5nZQojICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQojICAgcmV0dXJuKHdpbCRwLnZhbHVlKQojIH0KIyAKdGVtcERvd24gPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA8IDApCiMgIAojIHB2MDIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBuT3ZlcjAiLCAicG5PdmVyMiIpLCA1KQojIHB2MDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBuT3ZlcjAiLCAicG5PdmVyNCIpLCA1KQojIHB2MDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBuT3ZlcjAiLCAicG5PdmVyNiIpLCA1KQojIHB2MDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBuT3ZlcjAiLCAicG5PdmVyOCIpLCA1KQojIHB2MjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBuT3ZlcjIiLCAicG5PdmVyNCIpLCA1KQojIHB2MjYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBuT3ZlcjIiLCAicG5PdmVyNiIpLCA1KQojIHB2MjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBuT3ZlcjIiLCAicG5PdmVyOCIpLCA1KQojIHB2NDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBuT3ZlcjQiLCAicG5PdmVyNiIpLCA1KQojIHB2NDggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBuT3ZlcjQiLCAicG5PdmVyOCIpLCA1KQojIHB2NjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBuT3ZlcjYiLCAicG5PdmVyOCIpLCA1KQoKCgoKcCA8LSBnZ3Bsb3QodGVtcERvd24sIGFlcyh4ID0gcG5PdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIAogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwbk92ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkKICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAtMC41LCBsYWJlbCA9IHBhc3RlMCgicHYwMjogIiwgY29udlB2YWx1ZShwdjAyKSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYwNDogIiwgY29udlB2YWx1ZShwdjA0KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYwNjogIiwgY29udlB2YWx1ZShwdjA2KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYwODogIiwgY29udlB2YWx1ZShwdjA4KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyNDogIiwgY29udlB2YWx1ZShwdjI0KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyNjogIiwgY29udlB2YWx1ZShwdjI2KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYyODogIiwgY29udlB2YWx1ZShwdjI4KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY0NjogIiwgY29udlB2YWx1ZShwdjQ2KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY0ODogIiwgY29udlB2YWx1ZShwdjQ4KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY2ODogIiwgY29udlB2YWx1ZShwdjY4KSwgIlxuIiksIAogICMgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMSwgMCkpCgogIApmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ19iYXJwbG90X3BuR3JvdXBfQTQ4NV92c19ETVNPX2Rvd24iKQpoZWlnaHQgPC0gMwp3aWR0aCA8LSAzCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKCnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMCkKIyAgCiMgcHYwMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBuT3ZlcjAiLCAicG5PdmVyMiIpLCA1KQojIHB2MDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwbk92ZXIwIiwgInBuT3ZlcjQiKSwgNSkKIyBwdjA2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicG5PdmVyMCIsICJwbk92ZXI2IiksIDUpCiMgcHYwOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBuT3ZlcjAiLCAicG5PdmVyOCIpLCA1KQojIHB2MjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwbk92ZXIyIiwgInBuT3ZlcjQiKSwgNSkKIyBwdjI2IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicG5PdmVyMiIsICJwbk92ZXI2IiksIDUpCiMgcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBuT3ZlcjIiLCAicG5PdmVyOCIpLCA1KQojIHB2NDYgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwbk92ZXI0IiwgInBuT3ZlcjYiKSwgNSkKIyBwdjQ4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicG5PdmVyNCIsICJwbk92ZXI4IiksIDUpCiMgcHY2OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBuT3ZlcjYiLCAicG5PdmVyOCIpLCA1KQojIAoKCgpwIDwtIGdncGxvdCh0ZW1wVXAsIGFlcyh4ID0gcG5PdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIAogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwbk92ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkKICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAwLjUsIGxhYmVsID0gcGFzdGUwKCJwdjAyOiAiLCBjb252UHZhbHVlKHB2MDIpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjA0OiAiLCBjb252UHZhbHVlKHB2MDQpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjA2OiAiLCBjb252UHZhbHVlKHB2MDYpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjA4OiAiLCBjb252UHZhbHVlKHB2MDgpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjI0OiAiLCBjb252UHZhbHVlKHB2MjQpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjI2OiAiLCBjb252UHZhbHVlKHB2MjYpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjI4OiAiLCBjb252UHZhbHVlKHB2MjgpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjQ2OiAiLCBjb252UHZhbHVlKHB2NDYpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjQ4OiAiLCBjb252UHZhbHVlKHB2NDgpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjY4OiAiLCBjb252UHZhbHVlKHB2NjgpLCAiXG4iKSwgCiAgIyAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEpKQoKICAKZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfYmFycGxvdF9wbkdyb3VwX0E0ODVfdnNfRE1TT191cCIpCmhlaWdodCA8LSAzCndpZHRoIDwtIDMKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgojIyMjIEdyb3VwaW5nIHdpdGggUC1TIG51bWJlcgojIyMjIyBHcm91cGluZwpgYGB7cn0KIyB0ZW1wMiBjb250YWlucyBnZW5lcyBmcm9tIGdyb3VwIDEsIDIsIDUsIDggYW5kIGxvb3AgY291bnRzCiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzCgpwc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gNCkpJGdlbmUKcHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDMsIG51bV9wcyA8IDQpKSRnZW5lCnBzT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAyLCBudW1fcHMgPCAzKSkkZ2VuZQpwc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMSwgbnVtX3BzIDwgMikpJGdlbmUKcHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzIDwgMSkpJGdlbmUKCgoKCiMjIERpdmlkaW5nIGdlbmVzIGludG8gZ3JvdXBzCnRlbXAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6c2VsZWN0KGRpZmZfQTQ4NV9ETVNPLCBkaXN0YW5jZSwgZ2VuZSkgJT4lIAogIHVubmVzdChnZW5lKSAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fZGlmZl9zY29yZSA9IG1lYW4oZGlmZl9BNDg1X0RNU08pLAogICAgICAgICAgICBtZWFuX2Rpc3RhbmNlID0gbWVhbihkaXN0YW5jZSksCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpCgpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKQoKbWF4TG9nMkZDID0gMgoKdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibF9nZW5lX2lkIikpICU+JSAKICBkcm9wX25hKHNocmlua2VkX2xvZzJGQykKCgp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoCiAgcHNPdmVyID0gaWZlbHNlKGdlbmUgJWluJSBwc092ZXI0LCAicHNPdmVyNCIsCiAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMywgInBzT3ZlcjMiLAogICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIyLCAicHNPdmVyMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwc092ZXIxLCAicHNPdmVyMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHNPdmVyMCwgInBzT3ZlcjAiLCBOQSkpKSkpKSAlPiUKICBkcm9wX25hKHBzT3ZlcikKCmBgYAoKIyMjIyMgKFNLSVApIEdPIGZvciBlYWNoIGdyb3VwCmBgYHtyfQojIEdPZmlnRGlyIDwtIGhlcmUoZmlnRGlyLCAiLi4vR08iKQojIGdldEdPKCJwc092ZXI0IiwgR09maWdEaXIsIHBzT3ZlcjQpCiMgZ2V0R08oInBzT3ZlcjMiLCBHT2ZpZ0RpciwgcHNPdmVyMykKIyBnZXRHTygicHNPdmVyMiIsIEdPZmlnRGlyLCBwc092ZXIyKQojIGdldEdPKCJwc092ZXIxIiwgR09maWdEaXIsIHBzT3ZlcjEpCiMgZ2V0R08oInBzT3ZlcjAiLCBHT2ZpZ0RpciwgcHNPdmVyMCkKIyAKIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBHTzAuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpKQojIEdPMS5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIxLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCiMgR08yLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjIsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKSkKIyBHTzMuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpKQojIEdPNC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXI0LCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCiMgCiMgCiMgc3Vic2V0MCA8LSBHTzAuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJwc092ZXIwIikgJT4lCiMgICBkcGx5cjo6bXV0YXRlKAojICAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHsKIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsICIvIikpCiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uCiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQojICAgICB9KQojICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpCiMgc3Vic2V0MSA8LSBHTzEuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJwc092ZXIxIikgJT4lCiMgICBkcGx5cjo6bXV0YXRlKAojICAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHsKIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsICIvIikpCiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uCiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQojICAgICB9KQojICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpCiMgc3Vic2V0MiA8LSBHTzIuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJwc092ZXIyIikgJT4lCiMgICBkcGx5cjo6bXV0YXRlKAojICAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHsKIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsICIvIikpCiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uCiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQojICAgICB9KQojICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpCiMgc3Vic2V0MyA8LSBHTzMuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJwc092ZXIzIikgJT4lCiMgICBkcGx5cjo6bXV0YXRlKAojICAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHsKIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsICIvIikpCiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uCiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQojICAgICB9KQojICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpCiMgc3Vic2V0NCA8LSBHTzQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJwc092ZXI0IikgJT4lCiMgICBkcGx5cjo6bXV0YXRlKAojICAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHsKIyAgICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiMgICAgICAgcGFydHMgPC0gdW5saXN0KHN0cnNwbGl0KHgsICIvIikpCiMgICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uCiMgICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQojICAgICB9KQojICAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpCiMgCiMgCiMgR09saXN0IDwtIGZhY3RvcihjKCJHTzowMDA2Mzk3IiwgIkdPOjAwMDgzODAiLCAiR086MDAyMjYxMyIsICJHTzowMDM0NDcwIiwKIyAgICAgICAgICAgICAgICAgICAgIkdPOjAwMTYwNTUiLCAiR086MDAwNzM4OSIsICJHTzowMDQ4NTYyIiwgIkdPOjAwNDUxNjUiLCAKIyAgICAgICAgICAgICAgICAgICAgIkdPOjAwNzIwMDEiLCAiR086MDAwNzUxNyIsICJHTzowMDQ4NzA1IiwgIkdPOjAwMDMwMDIiKSkKIyAKIyBkYXRhIDwtIGJpbmRfcm93cyhiaW5kX3Jvd3MoYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQwLCBzdWJzZXQxKSwgc3Vic2V0MiksIHN1YnNldDMpLCBzdWJzZXQ0KSAlPiUKIyAgIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpCiMgCiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IERlc2NyaXB0aW9uLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIAojICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArCiMgICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAicmVkIiwgaGlnaCA9ICJibHVlIiwgbGltaXRzID0gYygwLCAwLjA1KSkgKwojICAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLCAzKSkgKwojICAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICsKIyAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZQojICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGF4aXMgdGl0bGUgc2l6ZSAoaWYgbm90IHJlbW92ZWQpCiMgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemUKIyAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIAojIAojIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCAiLi4iLCAiR08iLCAiR09fZ3JvdXBzX3BzIikKIyBoZWlnaHQgPSAyCiMgd2lkdGggPSAzLjQKIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQojIHByaW50KHApCiMgZGV2Lm9mZigpCmBgYAoKIyMjIyMgbG9vcCBzY29yZQpgYGB7cn0KIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKIyAgIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbWVhbl9kaWZmX3Njb3JlCiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJG1lYW5fZGlmZl9zY29yZQojICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQojICAgcmV0dXJuKHdpbCRwLnZhbHVlKQojIH0KIyAKIyBwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjAiLCAicHNPdmVyMSIpLCA1KQojIHBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMSIsICJwc092ZXIyIiksIDUpCiMgcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIyIiwgInBzT3ZlcjMiKSwgNSkKIyBwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjMiLCAicHNPdmVyNCIpLCA1KQojIHBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMiIsICJwc092ZXI0IiksIDUpCiMgcHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIxIiwgInBzT3ZlcjQiKSwgNSkKIyBwczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjAiLCAicHNPdmVyNCIpLCA1KQojIAoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwc092ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcHNPdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIAogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwc092ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkKICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMCgicHMwMTogIiwgY29udlB2YWx1ZShwczAxKSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMxMjogIiwgY29udlB2YWx1ZShwczEyKSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyMzogIiwgY29udlB2YWx1ZShwczIzKSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMzNDogIiwgY29udlB2YWx1ZShwczM0KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyNDogIiwgY29udlB2YWx1ZShwczI0KSwgIlxuIiwgCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTQ6ICIsIGNvbnZQdmFsdWUocHMxNCksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMDQ6ICIsIGNvbnZQdmFsdWUocHMwNCksICJcbiIpLCAKICAjICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykKCiAgCmZpbGVOYW1lIDwtIHBhc3RlMCgiZGlmZlNjb3JlX2JhcnBsb3RfcHNHcm91cF9BNDg1X3ZzX0RNU08iKQpoZWlnaHQgPC0gMwp3aWR0aCA8LSAzCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKIyMjIyMgbG9nMkZDCmBgYHtyfQojCiMgIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewojICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRsb2cyRm9sZENoYW5nZQojICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMikgKSRsb2cyRm9sZENoYW5nZQojICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQojICAgcmV0dXJuKHdpbCRwLnZhbHVlKQojIH0KCnRlbXBEb3duIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKQojICAKIyBwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwc092ZXIwIiwgInBzT3ZlcjEiKSwgNSkKIyBwczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwc092ZXIxIiwgInBzT3ZlcjIiKSwgNSkKIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwc092ZXIyIiwgInBzT3ZlcjMiKSwgNSkKIyBwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwc092ZXIzIiwgInBzT3ZlcjQiKSwgNSkKIyBwczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwc092ZXIyIiwgInBzT3ZlcjQiKSwgNSkKIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwc092ZXIxIiwgInBzT3ZlcjQiKSwgNSkKIyAKIyBwczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcERvd24sICJwc092ZXIwIiwgInBzT3ZlcjQiKSwgNSkKCgpwIDwtIGdncGxvdCh0ZW1wRG93biwgYWVzKHggPSBwc092ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwc092ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBzT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IC0wLjUsIGxhYmVsID0gcGFzdGUwKCJwczAxOiAiLCBjb252UHZhbHVlKHBzMDEpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczEyOiAiLCBjb252UHZhbHVlKHBzMTIpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczIzOiAiLCBjb252UHZhbHVlKHBzMjMpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczM0OiAiLCBjb252UHZhbHVlKHBzMzQpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczI0OiAiLCBjb252UHZhbHVlKHBzMjQpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczE0OiAiLCBjb252UHZhbHVlKHBzMTQpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczA0OiAiLCBjb252UHZhbHVlKHBzMDQpLCAiXG4iKSwgCiAgIyAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0xLCAwKSkKCiAgCmZpbGVOYW1lIDwtIHBhc3RlMCgibG9nMkZDX2JhcnBsb3RfcHNHcm91cF9BNDg1X3ZzX0RNU09fZG93biIpCmhlaWdodCA8LSAzCndpZHRoIDwtIDMKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCgoKdGVtcFVwIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPiAwKQojICAKIyBwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMCIsICJwc092ZXIxIiksIDUpCiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBzT3ZlcjEiLCAicHNPdmVyMiIpLCA1KQojIHBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwc092ZXIyIiwgInBzT3ZlcjMiKSwgNSkKIyBwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMyIsICJwc092ZXI0IiksIDUpCiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBzT3ZlcjIiLCAicHNPdmVyNCIpLCA1KQojIHBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwc092ZXIxIiwgInBzT3ZlcjQiKSwgNSkKIyBwczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMCIsICJwc092ZXI0IiksIDUpCiMgCgoKCnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwc092ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwc092ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBzT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoInBzMDE6ICIsIGNvbnZQdmFsdWUocHMwMSksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTI6ICIsIGNvbnZQdmFsdWUocHMxMiksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjM6ICIsIGNvbnZQdmFsdWUocHMyMyksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMzQ6ICIsIGNvbnZQdmFsdWUocHMzNCksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjQ6ICIsIGNvbnZQdmFsdWUocHMyNCksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTQ6ICIsIGNvbnZQdmFsdWUocHMxNCksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMDQ6ICIsIGNvbnZQdmFsdWUocHMwNCksICJcbiIpLCAKICAjICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpCgogIApmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ19iYXJwbG90X3BzR3JvdXBfQTQ4NV92c19ETVNPX3VwIikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCgojIyMjIEdyb3VwaW5nIHdpdGggUC1FIG51bWJlcgojIyMjIyBHcm91cGluZwpgYGB7cn0KIyB0ZW1wMiBjb250YWlucyBnZW5lcyBmcm9tIGdyb3VwIDEsIDIsIDUsIDggYW5kIGxvb3AgY291bnRzCiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzCgpwZU92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gNCkpJGdlbmUKcGVPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lCnBlT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAyLCBudW1fcGUgPCAzKSkkZ2VuZQpwZU92ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMSwgbnVtX3BlIDwgMikpJGdlbmUKcGVPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmUKCgoKIyMgRGl2aWRpbmcgZ2VuZXMgaW50byBncm91cHMKdGVtcCA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZGlmZl9BNDg1X0RNU08sIGRpc3RhbmNlLCBnZW5lKSAlPiUgCiAgdW5uZXN0KGdlbmUpICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzdW1tYXJpemUobWVhbl9kaWZmX3Njb3JlID0gbWVhbihkaWZmX0E0ODVfRE1TTyksCiAgICAgICAgICAgIG1lYW5fZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlKSwKICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykKCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCgptYXhMb2cyRkMgPSAyCgp0ZW1wIDwtIGxlZnRfam9pbih0ZW1wLCBkaWZmLlJOQSwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIAogIGRyb3BfbmEoc2hyaW5rZWRfbG9nMkZDKQoKCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZSgKICBwZU92ZXIgPSBpZmVsc2UoZ2VuZSAlaW4lIHBlT3ZlcjQsICJwZU92ZXI0IiwKICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwZU92ZXIzLCAicGVPdmVyMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBlT3ZlcjIsICJwZU92ZXIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBlT3ZlcjEsICJwZU92ZXIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwZU92ZXIwLCAicGVPdmVyMCIsIE5BKSkpKSkpICU+JQogIGRyb3BfbmEocGVPdmVyKQoKYGBgCgojIyMjIyAoU0tJUCkgR08gZm9yIGVhY2ggZ3JvdXAKYGBge3J9CiMgR09maWdEaXIgPC0gaGVyZShmaWdEaXIsICIuLi9HTyIpCiMgZ2V0R08oInBlT3ZlcjQiLCBHT2ZpZ0RpciwgcHNPdmVyNCkKIyBnZXRHTygicGVPdmVyMyIsIEdPZmlnRGlyLCBwc092ZXIzKQojIGdldEdPKCJwZU92ZXIyIiwgR09maWdEaXIsIHBzT3ZlcjIpCiMgZ2V0R08oInBlT3ZlcjEiLCBHT2ZpZ0RpciwgcHNPdmVyMSkKIyBnZXRHTygicGVPdmVyMCIsIEdPZmlnRGlyLCBwc092ZXIwKQojIAojICMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIEdPMC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIwLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCiMgR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKSkKIyBHTzIuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpKQojIEdPMy5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIzLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCiMgR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKSkKIyAKIyAKIyBzdWJzZXQwIDwtIEdPMC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBzT3ZlcjAiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyBzdWJzZXQxIDwtIEdPMS5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBzT3ZlcjEiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyBzdWJzZXQyIDwtIEdPMi5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBzT3ZlcjIiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyBzdWJzZXQzIDwtIEdPMy5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBzT3ZlcjMiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyBzdWJzZXQ0IDwtIEdPNC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBzT3ZlcjQiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyAKIyAKIyBHT2xpc3QgPC0gZmFjdG9yKGMoIkdPOjAwMDYzOTciLCAiR086MDAwODM4MCIsICJHTzowMDIyNjEzIiwgIkdPOjAwMzQ0NzAiLAojICAgICAgICAgICAgICAgICAgICAiR086MDAxNjA1NSIsICJHTzowMDA3Mzg5IiwgIkdPOjAwNDg1NjIiLCAiR086MDA0NTE2NSIsIAojICAgICAgICAgICAgICAgICAgICAiR086MDA3MjAwMSIsICJHTzowMDA3NTE3IiwgIkdPOjAwNDg3MDUiLCAKIyAgICAgICAgICAgICAgICAgICAgIkdPOjAwNDAwMjkiLCAiR086MDAxMDE2NSIpKQojIAojIGRhdGEgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhiaW5kX3Jvd3Moc3Vic2V0MCwgc3Vic2V0MSksIHN1YnNldDIpLCBzdWJzZXQ0KSAlPiUKIyAgIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpCiMgCiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IERlc2NyaXB0aW9uLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIAojICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArCiMgICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAicmVkIiwgaGlnaCA9ICJibHVlIiwgbGltaXRzID0gYygwLCAwLjA1KSkgKwojICAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLCAzKSkgKwojICAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICsKIyAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZQojICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGF4aXMgdGl0bGUgc2l6ZSAoaWYgbm90IHJlbW92ZWQpCiMgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemUKIyAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIAojIAojIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCAiLi4iLCAiR08iLCAiR09fZ3JvdXBzX3BlIikKIyBoZWlnaHQgPSAyCiMgd2lkdGggPSAzLjQKIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQojIHByaW50KHApCiMgZGV2Lm9mZigpCmBgYAojIyMjIyBsb29wIHNjb3JlCmBgYHtyfQojIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewojICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBzT3ZlciA9PWdyb3VwMSkgKSRtZWFuX2RpZmZfc2NvcmUKIyAgIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDIpICkkbWVhbl9kaWZmX3Njb3JlCiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiMgICByZXR1cm4od2lsJHAudmFsdWUpCiMgfQojIAojIHBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMCIsICJwc092ZXIxIiksIDUpCiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIxIiwgInBzT3ZlcjIiKSwgNSkKIyBwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjIiLCAicHNPdmVyMyIpLCA1KQojIHBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMyIsICJwc092ZXI0IiksIDUpCiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIyIiwgInBzT3ZlcjQiKSwgNSkKIyBwczE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjEiLCAicHNPdmVyNCIpLCA1KQojIHBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMCIsICJwc092ZXI0IiksIDUpCgoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwZU92ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcGVPdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIAogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwZU92ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkKICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMCgicHMwMTogIiwgY29udlB2YWx1ZShwczAxKSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMxMjogIiwgY29udlB2YWx1ZShwczEyKSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyMzogIiwgY29udlB2YWx1ZShwczIzKSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMzNDogIiwgY29udlB2YWx1ZShwczM0KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyNDogIiwgY29udlB2YWx1ZShwczI0KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMxNDogIixjb252UHZhbHVlKCBwczE0KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMwNDogIixjb252UHZhbHVlKCBwczA0KSwgIlxuIiksIAogICMgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKQoKICAKZmlsZU5hbWUgPC0gcGFzdGUwKCJkaWZmU2NvcmVfYmFycGxvdF9wZUdyb3VwX0E0ODVfdnNfRE1TTyIpCmhlaWdodCA8LSAzCndpZHRoIDwtIDMKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgojIyMjIyBsb2cyRkMKYGBge3J9CiMKIyAgZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJGxvZzJGb2xkQ2hhbmdlCiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJGxvZzJGb2xkQ2hhbmdlCiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiMgICByZXR1cm4od2lsJHAudmFsdWUpCiMgfQojIAp0ZW1wRG93biA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlIDwgMCkKIyAgCiMgcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMCIsICJwc092ZXIxIiksIDUpCiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMSIsICJwc092ZXIyIiksIDUpCiMgcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMiIsICJwc092ZXIzIiksIDUpCiMgcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMyIsICJwc092ZXI0IiksIDUpCiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMiIsICJwc092ZXI0IiksIDUpCiMgcHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMSIsICJwc092ZXI0IiksIDUpCiMgcHMwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBEb3duLCAicHNPdmVyMCIsICJwc092ZXI0IiksIDUpCgoKcCA8LSBnZ3Bsb3QodGVtcERvd24sIGFlcyh4ID0gcGVPdmVyLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcGVPdmVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArIAogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBwZU92ZXIpLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkKICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAtMC41LCBsYWJlbCA9IHBhc3RlMCgicHMwMTogIiwgY29udlB2YWx1ZShwczAxKSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMxMjogIiwgY29udlB2YWx1ZShwczEyKSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyMzogIiwgY29udlB2YWx1ZShwczIzKSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMzNDogIiwgY29udlB2YWx1ZShwczM0KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyNDogIiwgY29udlB2YWx1ZShwczI0KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMxNDogIiwgY29udlB2YWx1ZShwczE0KSwgIlxuIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMwNDogIiwgY29udlB2YWx1ZShwczA0KSwgIlxuIiksIAogICMgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMSwgMCkpCgogIApmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ19iYXJwbG90X3BlR3JvdXBfQTQ4NV92c19ETVNPX2Rvd24iKQpoZWlnaHQgPC0gMwp3aWR0aCA8LSAzCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKCnRlbXBVcCA8LSB0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlID4gMCkKIAojIHBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwc092ZXIwIiwgInBzT3ZlcjEiKSwgNSkKIyBwczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMSIsICJwc092ZXIyIiksIDUpCiMgcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBzT3ZlcjIiLCAicHNPdmVyMyIpLCA1KQojIHBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwc092ZXIzIiwgInBzT3ZlcjQiKSwgNSkKIyBwczI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMiIsICJwc092ZXI0IiksIDUpCiMgcHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBzT3ZlcjEiLCAicHNPdmVyNCIpLCA1KQojIHBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwc092ZXIwIiwgInBzT3ZlcjQiKSwgNSkKIyAKCgoKCnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwZU92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwZU92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBlT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoInBzMDE6ICIsIGNvbnZQdmFsdWUocHMwMSksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTI6ICIsIGNvbnZQdmFsdWUocHMxMiksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjM6ICIsIGNvbnZQdmFsdWUocHMyMyksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMzQ6ICIsIGNvbnZQdmFsdWUocHMzNCksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjQ6ICIsIGNvbnZQdmFsdWUocHMyNCksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTQ6ICIsIGNvbnZQdmFsdWUocHMxNCksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMDQ6ICIsIGNvbnZQdmFsdWUocHMwNCksICJcbiIpLCAKICAjICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpCgogIApmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ19iYXJwbG90X3BlR3JvdXBfQTQ4NV92c19ETVNPX3VwIikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCgojIyMjIEdyb3VwaW5nIHdpdGggUC1QIG51bWJlcgojIyMjIyBHcm91cGluZwpgYGB7cn0KIyB0ZW1wMiBjb250YWlucyBnZW5lcyBmcm9tIGdyb3VwIDEsIDIsIDUsIDggYW5kIGxvb3AgY291bnRzCiNjYWxjdWxhdGluZyBkaWZmIHNjb3JlIGFuZCBsb2cyZmMgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHAtbiBudW1iZXJzCnBwT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSA0KSkkZ2VuZQpwcE92ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMywgbnVtX3BwIDwgNCkpJGdlbmUKcHBPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDIsIG51bV9wcCA8IDMpKSRnZW5lCnBwT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAxLCBudW1fcHAgPCAyKSkkZ2VuZQpwcE92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPCAxKSkkZ2VuZQoKCgojIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwcwp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX0E0ODVfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfQTQ4NV9ETVNPKSwKICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLAogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQoKZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSkKCm1heExvZzJGQyA9IDIKCnRlbXAgPC0gbGVmdF9qb2luKHRlbXAsIGRpZmYuUk5BLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmxfZ2VuZV9pZCIpKSAlPiUgCiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpCgoKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKAogIHBwT3ZlciA9IGlmZWxzZShnZW5lICVpbiUgcHBPdmVyNCwgInBwT3ZlcjQiLAogICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBwT3ZlcjMsICJwcE92ZXIzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHBPdmVyMiwgInBwT3ZlcjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcHBPdmVyMSwgInBwT3ZlcjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIHBwT3ZlcjAsICJwcE92ZXIwIiwgTkEpKSkpKSkgJT4lCiAgZHJvcF9uYShwcE92ZXIpCmBgYAojIyMjIyAoU0tJUCkgR08gZm9yIGVhY2ggZ3JvdXAKYGBge3J9CiMgR09maWdEaXIgPC0gaGVyZShmaWdEaXIsICIuLi9HTyIpCiMgZ2V0R08oInBwT3ZlcjQiLCBHT2ZpZ0RpciwgcHNPdmVyNCkKIyBnZXRHTygicHBPdmVyMyIsIEdPZmlnRGlyLCBwc092ZXIzKQojIGdldEdPKCJwcE92ZXIyIiwgR09maWdEaXIsIHBzT3ZlcjIpCiMgZ2V0R08oInBwT3ZlcjEiLCBHT2ZpZ0RpciwgcHNPdmVyMSkKIyBnZXRHTygicHBPdmVyMCIsIEdPZmlnRGlyLCBwc092ZXIwKQojIAojICMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIEdPMC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIwLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCiMgR08xLmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjEsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKSkKIyBHTzIuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gcHNPdmVyMiwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpKQojIEdPMy5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBwc092ZXIzLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCiMgR080LmRmIDwtIGFzLmRhdGEuZnJhbWUoZW5yaWNoR08oZ2VuZSA9IHBzT3ZlcjQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKSkKIyAKIyAKIyBzdWJzZXQwIDwtIEdPMC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBzT3ZlcjAiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyBzdWJzZXQxIDwtIEdPMS5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBzT3ZlcjEiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyBzdWJzZXQyIDwtIEdPMi5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBzT3ZlcjIiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyBzdWJzZXQzIDwtIEdPMy5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBzT3ZlcjMiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyBzdWJzZXQ0IDwtIEdPNC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gInBzT3ZlcjQiKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUoCiMgICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewojICAgICAgICMgU3BsaXQgdGhlIHN0cmluZyBieSAiLyIKIyAgICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKIyAgICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KIyAgICAgICBhcy5udW1lcmljKHBhcnRzWzFdKSAvIGFzLm51bWVyaWMocGFydHNbMl0pCiMgICAgIH0pCiMgICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKIyAKIyAKIyBHT2xpc3QgPC0gZmFjdG9yKGMoIkdPOjAwMDYzOTciLCAiR086MDAwODM4MCIsICJHTzowMDIyNjEzIiwgIkdPOjAwMzQ0NzAiLAojICAgICAgICAgICAgICAgICAgICAiR086MDAxNjA1NSIsICJHTzowMDA3Mzg5IiwgIkdPOjAwNDg1NjIiLCAiR086MDA0NTE2NSIsIAojICAgICAgICAgICAgICAgICAgICAiR086MDA3MjAwMSIsICJHTzowMDA3NTE3IiwgIkdPOjAwNDg3MDUiLCAiR086MDAwMzAwMiIsICJHTzowMDA5NDExIikpCiMgCiMgZGF0YSA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKHN1YnNldDAsIHN1YnNldDEpLCBzdWJzZXQzKSAlPiUKIyAgIGRwbHlyOjpmaWx0ZXIoSUQgJWluJSBHT2xpc3QpCiMgCiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IERlc2NyaXB0aW9uLCBjb2xvciA9IHAuYWRqdXN0LCBzaXplID0gZ3IpKSArIAojICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArCiMgICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAicmVkIiwgaGlnaCA9ICJibHVlIiwgbGltaXRzID0gYygwLCAwLjA1KSkgKwojICAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLCAzKSkgKwojICAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICsKIyAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZQojICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGF4aXMgdGl0bGUgc2l6ZSAoaWYgbm90IHJlbW92ZWQpCiMgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemUKIyAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIAojIAojIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCAiLi4iLCAiR08iLCAiR09fZ3JvdXBzX3BwIikKIyBoZWlnaHQgPSAyCiMgd2lkdGggPSAzLjQKIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQojIHByaW50KHApCiMgZGV2Lm9mZigpCmBgYAoKIyMjIyMgbG9vcCBzY29yZQpgYGB7cn0KIyBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKIyAgIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihwc092ZXIgPT1ncm91cDEpICkkbWVhbl9kaWZmX3Njb3JlCiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJG1lYW5fZGlmZl9zY29yZQojICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQojICAgcmV0dXJuKHdpbCRwLnZhbHVlKQojIH0KIyAKIyBwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjAiLCAicHNPdmVyMSIpLCA1KQojIHBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMSIsICJwc092ZXIyIiksIDUpCiMgcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIyIiwgInBzT3ZlcjMiKSwgNSkKIyBwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjMiLCAicHNPdmVyNCIpLCA1KQojIHBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMiIsICJwc092ZXI0IiksIDUpCiMgcHMxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIxIiwgInBzT3ZlcjQiKSwgNSkKIyBwczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjAiLCAicHNPdmVyNCIpLCA1KQoKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gcHBPdmVyLCB5ID0gbWVhbl9kaWZmX3Njb3JlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHBwT3ZlciksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKyAKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gcHBPdmVyKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwYXN0ZTAoInBzMDE6ICIsIGNvbnZQdmFsdWUocHMwMSksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTI6ICIsIGNvbnZQdmFsdWUocHMxMiksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjM6ICIsIGNvbnZQdmFsdWUocHMyMyksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMzQ6ICIsIGNvbnZQdmFsdWUocHMzNCksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjQ6ICIsIGNvbnZQdmFsdWUocHMyNCksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTQ6ICIsIGNvbnZQdmFsdWUocHMxNCksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMDQ6ICIsIGNvbnZQdmFsdWUocHMwNCksICJcbiIpLCAKICAjICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykKCiAgCmZpbGVOYW1lIDwtIHBhc3RlMCgiZGlmZlNjb3JlX2JhcnBsb3RfcHBHcm91cF9BNDg1X3ZzX0RNU08iKQpoZWlnaHQgPC0gMwp3aWR0aCA8LSAzCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAojIyMjIyBsb2cyRkMKYGBge3J9CiMKIyAgZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiMgICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAxKSApJGxvZzJGb2xkQ2hhbmdlCiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocHNPdmVyID09Z3JvdXAyKSApJGxvZzJGb2xkQ2hhbmdlCiMgICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiMgICByZXR1cm4od2lsJHAudmFsdWUpCiMgfQoKdGVtcERvd24gPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZSA8IDApCiMgIAojIHBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjAiLCAicHNPdmVyMSIpLCA1KQojIHBzMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjEiLCAicHNPdmVyMiIpLCA1KQojIHBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjIiLCAicHNPdmVyMyIpLCA1KQojIHBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjMiLCAicHNPdmVyNCIpLCA1KQojIHBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjIiLCAicHNPdmVyNCIpLCA1KQojIHBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjEiLCAicHNPdmVyNCIpLCA1KQojIHBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wRG93biwgInBzT3ZlcjAiLCAicHNPdmVyNCIpLCA1KQoKCgpwIDwtIGdncGxvdCh0ZW1wRG93biwgYWVzKHggPSBwcE92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwcE92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBwT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IC0wLjUsIGxhYmVsID0gcGFzdGUwKCJwczAxOiAiLCBjb252UHZhbHVlKHBzMDEpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczEyOiAiLCBjb252UHZhbHVlKHBzMTIpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczIzOiAiLCBjb252UHZhbHVlKHBzMjMpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczM0OiAiLCBjb252UHZhbHVlKHBzMzQpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczI0OiAiLCBjb252UHZhbHVlKHBzMjQpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczE0OiAiLCBjb252UHZhbHVlKHBzMTQpLCAiXG4iLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczA0OiAiLCBjb252UHZhbHVlKHBzMDQpLCAiXG4iKSwgCiAgIyAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0xLCAwKSkKCiAgCmZpbGVOYW1lIDwtIHBhc3RlMCgibG9nMkZDX2JhcnBsb3RfcHBHcm91cF9BNDg1X3ZzX0RNU09fZG93biIpCmhlaWdodCA8LSAzCndpZHRoIDwtIDMKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCgoKdGVtcFVwIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPiAwKQojICAKIyBwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMCIsICJwc092ZXIxIiksIDUpCiMgcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBzT3ZlcjEiLCAicHNPdmVyMiIpLCA1KQojIHBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwc092ZXIyIiwgInBzT3ZlcjMiKSwgNSkKIyBwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMyIsICJwc092ZXI0IiksIDUpCiMgcHMyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBVcCwgInBzT3ZlcjIiLCAicHNPdmVyNCIpLCA1KQojIHBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wVXAsICJwc092ZXIxIiwgInBzT3ZlcjQiKSwgNSkKIyBwczA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcFVwLCAicHNPdmVyMCIsICJwc092ZXI0IiksIDUpCiMgCiMgCgoKCnAgPC0gZ2dwbG90KHRlbXBVcCwgYWVzKHggPSBwcE92ZXIsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBwcE92ZXIpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHBwT3ZlciksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoInBzMDE6ICIsIGNvbnZQdmFsdWUocHMwMSksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTI6ICIsIGNvbnZQdmFsdWUocHMxMiksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjM6ICIsIGNvbnZQdmFsdWUocHMyMyksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMzQ6ICIsIGNvbnZQdmFsdWUocHMzNCksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjQ6ICIsIGNvbnZQdmFsdWUocHMyNCksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTQ6ICIsIGNvbnZQdmFsdWUocHMxNCksICJcbiIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMDQ6ICIsIGNvbnZQdmFsdWUocHMwNCksICJcbiIpLCAKICAjICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpCgogIApmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ19iYXJwbG90X3BwR3JvdXBfQTQ4NV92c19ETVNPX3VwIikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIFsyLjEzXSBIb3cgdG8gZGVmaW5lIG11bHRpY29ubmVjdGVkIGh1YiB1c2luZyByZWd1bGF0b3J5IGxvb3BzPwpgYGB7cn0KIyBJTVBPUlRJTkcgR0VORSBBTk5PIERBVEEgRk9SIFAtTiBMT09QUwpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgoKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIikpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNiwgMTEsIDEyLCAxMywgMjIsIDIzLCAyNCwgMjUsIDI3LCAyOCkpCgpkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIi50c3YiKSkpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNiwgMTEsIDEyLCAxMywgMjIsIDIzLCAyNCwgMjUsIDI3KSkgJT4lCiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gZW5kMSAtIHN0YXJ0MSwKICAgICAgICAgICAgICAgIGFkal9zdGFydDEgPSBpZmVsc2UoYmluU2l6ZSA9PSA1MDAwLCBzdGFydDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShiaW5TaXplID09IDEwMDAwLCBzdGFydDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDEgKyAxMDAwMCkpLAogICAgICAgICAgICAgICAgYWRqX2VuZDEgPSBhZGpfc3RhcnQxICsgNTAwMCwKICAgICAgICAgICAgICAgIGFkal9zdGFydDIgPSBpZmVsc2UoYmluU2l6ZSA9PSA1MDAwLCBzdGFydDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShiaW5TaXplID09IDEwMDAwLCBzdGFydDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDIgKyAxMDAwMCkpLAogICAgICAgICAgICAgICAgYWRqX2VuZDIgPSBhZGpfc3RhcnQyICsgNTAwMCwKICAgICAgICAgICAgICAgIGFuY2hvcjEgPSBwYXN0ZShjaHJvbTEsIGFkal9zdGFydDEsIGFkal9lbmQxLCBzZXAgPSAiXyIpLAogICAgICAgICAgICAgICAgYW5jaG9yMiA9IHBhc3RlKGNocm9tMiwgYWRqX3N0YXJ0MiwgYWRqX2VuZDIsIHNlcCA9ICJfIikpCgojIGRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiLnRzdiIpKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2LCAxMSwgMTIsIDEzLCAyMiwgMjMsIDI0LCAyNSwgMjcpKSAlPiUgCiMgICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBlbmQxIC0gc3RhcnQxLAojICAgICAgICAgICAgICAgICBhZGpfc3RhcnQxID0gaWZlbHNlKGJpblNpemUgPT0gNTAwMCwgc3RhcnQxLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShiaW5TaXplID09IDEwMDAwLCBzdGFydDErNTAwMCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQxICsgMTAwMDApKSwKIyAgICAgICAgICAgICAgICAgYWRqX2VuZDEgPSBhZGpfc3RhcnQxICsgNTAwMCwKIyAgICAgICAgICAgICAgICAgYWRqX3N0YXJ0MiA9IGlmZWxzZShiaW5TaXplID09IDUwMDAsIHN0YXJ0MiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYmluU2l6ZSA9PSAxMDAwMCwgc3RhcnQyICsgNTAwMCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQyICsgMTAwMDApKSwKIyAgICAgICAgICAgICAgICAgYWRqX2VuZDIgPSBhZGpfc3RhcnQyICsgNTAwMCwKIyAgICAgICAgICAgICAgICAgYW5jaG9yMSA9IHBhc3RlKGNocm9tMSwgYWRqX3N0YXJ0MSwgYWRqX2VuZDEsIHNlcCA9ICJfIiksCiMgICAgICAgICAgICAgICAgIGFuY2hvcjIgPSBwYXN0ZShjaHJvbTIsIGFkal9zdGFydDIsIGFkal9lbmQyLCBzZXAgPSAiXyIpKQoKZGF0YS5yZWcgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIsICJFLUUiLCAiRS1TIiwgIkUtWCIpKQoKIyMgR3JhcGgKI2luc3RhbGwucGFja2FnZXMoImlncmFwaCIpCmxpYnJhcnkoaWdyYXBoKQoKIyBUbyBiZSBhYmxlIHRvIGNvbnN0cnVjdCBhIGdyYXBoLCBlYWNoIGFuY2hvciBuZWVkIHRvIGhhdmUgc2FtZSByZXNvbHV0aW9uLgojIFNoaW5rIHRoZSBzaXplIHRvIDEwIGtiCiMgSWYgdGhlIGFuY2hvciBpcyAyNWtiLCBjaG9vc2UgdGhlIG1pZGRsZSA1a2IgYmluCiMgSWYgdGhlIGFuY2hvciBpcyAxMGtiLCBjaG9vc2UgdGhlIGxlZnQgNWtiIGJpbgoKZ3JhcGggPC0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGRhdGEucmVnICU+JSBkcGx5cjo6c2VsZWN0KGFuY2hvcjEsIGFuY2hvcjIpKQpjb21wb25lbnRzIDwtIGNvbXBvbmVudHMoZ3JhcGgpCmRhdGEucmVnJGh1YiA8LSBjb21wb25lbnRzJG1lbWJlcnNoaXBbZGF0YS5yZWckYW5jaG9yMV0KCnRlbXAuYmVkcGUgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBhZGpfc3RhcnQxLCBhZGpfZW5kMSwgY2hyb20yLCBhZGpfc3RhcnQyLCBhZGpfZW5kMikKZndyaXRlKHRlbXAuYmVkcGUsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIl9yZWd1bGF0b3J5XzVrYkFkai5iZWRwZSIpKSwgCiAgICAgICBjb2wubmFtZXMgPSBGQUxTRSxyb3cubmFtZXMgPSBGQUxTRSwgc2VwID0gIlx0IikgIAoKaHViTnVtIDwtIGRhdGEucmVnICU+JSBncm91cF9ieShodWIpICU+JSBzdW1tYXJpc2UoY291bnQgPSBuKCkpCgojIEh1YiBzaXplIGRpc3RyaWJ1dGlvbgpwIDwtIGdncGxvdChodWJOdW0sIGFlcyh4ID0gY291bnQpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoICA9IDEpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgc2NhbGVfeV9sb2cxMCgpCgpzdmdsaXRlKGhlcmUoZmlnRGlyLCAiaHViX3NpemVfZGlzdHJpYnV0aW9uLnN2ZyIpLCBoZWlnaHQgPSAyLCB3aWR0aCA9IDIpCnByaW50KHApCmRldi5vZmYoKQoKZGF0YS5yZWcgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oaHViTnVtLCBieSA9ICJodWIiKSAKZGF0YS5yZWcgPC0gZGF0YS5yZWcgJT4lIGRwbHlyOjptdXRhdGUocGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkKCiMgRXhwb3J0aW5nIHJlZ3VsYXRvcnkgbG9vcHMgd2l0aCBzcGVjaWZpYyBodWIgc2l6ZQp0ZW1wLmJlZHBlIDwtIGRhdGEucmVnICU+JSBkcGx5cjo6ZmlsdGVyKGNvdW50ID49IDMpICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMSwgYWRqX3N0YXJ0MSwgYWRqX2VuZDEsIGNocm9tMiwgYWRqX3N0YXJ0MiwgYWRqX2VuZDIpCmZ3cml0ZSh0ZW1wLmJlZHBlLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICJfcmVndWxhdG9yeV81a2JBZGpfaHViMy5iZWRwZSIpKSwgCiAgICAgICBjb2wubmFtZXMgPSBGQUxTRSxyb3cubmFtZXMgPSBGQUxTRSwgc2VwID0gIlx0IikgIAoKdGVtcC5iZWRwZSA8LSBkYXRhLnJlZyAlPiUgZHBseXI6OmZpbHRlcihjb3VudCA+PSA1KSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIGFkal9zdGFydDEsIGFkal9lbmQxLCBjaHJvbTIsIGFkal9zdGFydDIsIGFkal9lbmQyKQpmd3JpdGUodGVtcC5iZWRwZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3JlZ3VsYXRvcnlfNWtiQWRqX2h1YjUuYmVkcGUiKSksIAogICAgICAgY29sLm5hbWVzID0gRkFMU0Uscm93Lm5hbWVzID0gRkFMU0UsIHNlcCA9ICJcdCIpCgp0ZW1wLmJlZHBlIDwtIGRhdGEucmVnICU+JSBkcGx5cjo6ZmlsdGVyKGNvdW50ID49IDEwKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIGFkal9zdGFydDEsIGFkal9lbmQxLCBjaHJvbTIsIGFkal9zdGFydDIsIGFkal9lbmQyKQpmd3JpdGUodGVtcC5iZWRwZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3JlZ3VsYXRvcnlfNWtiQWRqX2h1YjEwLmJlZHBlIikpLCAKICAgICAgIGNvbC5uYW1lcyA9IEZBTFNFLHJvdy5uYW1lcyA9IEZBTFNFLCBzZXAgPSAiXHQiKQoKCiMgQWRkaW5nIGdlbmUgYW5ub3RhdGlvbiB0byBodWJzCmdlbmVQZWFrUGFpciA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjptdXRhdGUocGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkgJT4lIGRwbHlyOjpzZWxlY3QocGVha0lELCBnZW5lKQpkYXRhLnJlZyA8LSBkYXRhLnJlZyAlPiUgZHBseXI6OmxlZnRfam9pbihnZW5lUGVha1BhaXIsIGJ5ID0gInBlYWtJRCIpCgojIER1cmluZyB1bm5lc3RpbmcsIEUtTiBsb29wcyB3aXRob3V0IGdlbmUgYW5ub3RhdGVkIGFyZSByZW1vdmVkCmRhdGEucmVnIDwtIGRhdGEucmVnICU+JSB1bm5lc3QoZ2VuZSkgJT4lIGRwbHlyOjptdXRhdGUoCiAgZ3JvdXAgPSBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAxLCAiZ3JvdXAxIiwKICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXAyLCAiZ3JvdXAyIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwMywgImdyb3VwMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA0LCAiZ3JvdXA0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA1LCAiZ3JvdXA1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwNiwgImdyb3VwNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA3LCAiZ3JvdXA3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2VuZSAlaW4lIGdlbmUuZ3JvdXA4LCAiZ3JvdXA4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBnZW5lLmdyb3VwOSwgImdyb3VwOSIsIE5BKSkpKSkpKSkpCikKCgp0ZW1wIDwtIGRhdGEucmVnICU+JSBkcGx5cjo6c2VsZWN0KGdlbmUsIGh1YiwgY291bnQsIGdyb3VwKSAlPiUKICBncm91cF9ieShnZW5lKSAlPiUgc2xpY2VfbWF4KGNvdW50LCB3aXRoX3RpZXMgPSBGQUxTRSkgJT4lCiAgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoImdyb3VwMSIsICJncm91cDIiLCAiZ3JvdXA1IiwgImdyb3VwOCIpKQoKCiMgVEVNUCBTVEFSVAojIFRFTVAgU1RBUlQKZ2VuZUxpc3QuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMS50c3YiKSkKZ2VuZUxpc3QuZ3JvdXAxLnRlbXAgPC0gZ2VuZUxpc3QuZ3JvdXAxICU+JSBkcGx5cjo6bGVmdF9qb2luKHRlbXAsIGJ5ID0gYygiZ2VuZSIpKQojIFRFTVAgRU5ECgpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkY291bnQKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkY291bnQKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9CgoKcHYxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwMSIsICJncm91cDIiKSwgNSkKcHYxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwMSIsICJncm91cDUiKSwgNSkKcHYxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwMSIsICJncm91cDgiKSwgNSkKcHYyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwMiIsICJncm91cDUiKSwgNSkKcHYyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwMiIsICJncm91cDgiKSwgNSkKcHY1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXBTdW0sImdyb3VwNSIsICJncm91cDgiKSwgNSkKCgpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gY291bnQsIGZpbGwgPSBncm91cCkpICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDMwLCBieSA9IDUpLCBsaW1pdHMgPSBjKDAsIDMwKSkgKyAKCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMywgbGFiZWwgPSBwYXN0ZTAoInB2MTI6ICIsIHB2MTIsICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjE1OiAiLCBwdjE1LCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHYxODogIiwgcHYxOCwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2MjU6ICIsIHB2MjUsICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdjI4OiAiLCBwdjI4LCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHY1ODogIiwgcHY1OCwgIlxuIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMSkgKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKCmZpbGVOYW1lIDwtIHBhc3RlMCgiY291bnRIdWJfYmFycGxvdF9kaWZmR3JvdXBfZFRBR192c19ETVNPIikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKCgpgYGAKCgojIyBbMi4xNF0gTG9va2luZyBkZWVwZXIgaW50byBUQUQgYW5kIGluc3VsYXRpb24KIyMjIEluc3VsYXRpb24gc2NvcmUgb2YgVFNTPwojIyMjIEltcG9ydGluZyBpbnN1bGF0aW9uIHNjb3JlCmBgYHtyfQojIEltcG9ydCBpbnN1bGF0aW9uIHNjb3JlIGNhbGN1bGF0ZWQgd2l0aCBweXRob24KcmVzdWx0RGlyIDwtIGhlcmUoIi4uLy4uL3Jlc3VsdCIpCmluc1Njb3JlLkRNU08gPC0gZnJlYWQoaGVyZShyZXN1bHREaXIsICJUQUQiLCAiaW5zdWxhdGlvblNjb3JlXzI1a2JfRzFETVNPLnRzdiIpKSAlPiUgCiAgZHBseXI6OnNlbGVjdChjKCJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAibG9nMl9pbnN1bGF0aW9uX3Njb3JlXzEyNTAwMCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGJpbklEID0gcGFzdGUoY2hyb20sIHN0YXJ0LCBlbmQsIHNlcCA9ICJfIikpCmNvbG5hbWVzKGluc1Njb3JlLkRNU08pIDwtIGMoImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJpbnN1bGF0aW9uU2NvcmUiLCAiYmluSUQiKQppbnNTY29yZS5kVEFHIDwtIGZyZWFkKGhlcmUocmVzdWx0RGlyLCAiVEFEIiwgImluc3VsYXRpb25TY29yZV8yNWtiX0cxZFRBRy50c3YiKSkgJT4lIAogIGRwbHlyOjpzZWxlY3QoYygiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgImxvZzJfaW5zdWxhdGlvbl9zY29yZV8xMjUwMDAiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShiaW5JRCA9IHBhc3RlKGNocm9tLCBzdGFydCwgZW5kLCBzZXAgPSAiXyIpKQpjb2xuYW1lcyhpbnNTY29yZS5kVEFHKSA8LSBjKCJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAiaW5zdWxhdGlvblNjb3JlIiwgImJpbklEIikKCiNpbnNTY29yZSA8LSBmdWxsX2pvaW4oaW5zU2NvcmUuRE1TTywgaW5zU2NvcmUuZFRBRywgYnkgPSBjKCJiaW5JRCIpKSAlPiUKIyAgZHBseXI6OnNlbGVjdChiaW5JRCwgY2hyb20ueCwgc3RhcnQueCwgZW5kLngsIGluc3VsYXRpb25TY29yZS54LCBpbnN1bGF0aW9uU2NvcmUueSkgCgojY29sbmFtZXMoaW5zU2NvcmUpIDwtIGMoImJpbklEIiwgImNociIsICJzdGFydCIsICJlbmQiLCAiaW5zdWxhdGlvbl9zY29yZV9ETVNPIiwgImluc3VsYXRpb25fc2NvYXJlX2RUQUciKQoKI1ZpZXcoaW5zU2NvcmUpCgpgYGAKCiMjIyMgTGlua2luZyB0byBnZW5lCmBgYHtyfQpnZW5lLlRTUy50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgIm1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSAiKyIsIFYyLCBWMykpICU+JQogIGRwbHlyOjpzZWxlY3QoVjYsIFY1LCBWMSwgVFNTKQpjb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYygiZW5zZW1ibCIsICJnZW5lIiwgImNociIsICJUU1MiKQoKZ2V0SW5zdWxhdGlvblNjb3JlIDwtIGZ1bmN0aW9uKGNociwgVFNTLCBpbnNTY29yZS50Yil7CiAgdGVtcC50YiA8LSBpbnNTY29yZS50YiAlPiUgZHBseXI6OmZpbHRlcihjaHJvbSA9PSBjaHIsIHN0YXJ0IDwgVFNTLCBlbmQgPiBUU1MpCiAgb3V0IDwtIHRlbXAudGIkaW5zdWxhdGlvblNjb3JlCiAgaWYobGVuZ3RoKG91dCkgPCAxKXsKICAgIHJldHVybihOQSkKICB9ZWxzZXsKICAgIHJldHVybih0ZW1wLnRiJGluc3VsYXRpb25TY29yZSkKICB9Cn0KCmdlbmUuaW5zU2NvcmUuYWxsIDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoCiAgbG9nMl9pbnNTY29yZV9ETVNPID0gZ2V0SW5zdWxhdGlvblNjb3JlKGNociwgVFNTLCBpbnNTY29yZS5ETVNPKSwKICBpbnNTY29yZV9ETVNPID0gMl5sb2cyX2luc1Njb3JlX0RNU08sCiAgbG9nMl9pbnNTY29yZV9kVEFHID0gZ2V0SW5zdWxhdGlvblNjb3JlKGNociwgVFNTLCBpbnNTY29yZS5kVEFHKSwKICBpbnNTY29yZV9kVEFHID0gMl5sb2cyX2luc1Njb3JlX2RUQUcsCiAgZGlmZl9pbnNTY29yZSA9IGluc1Njb3JlX2RUQUcgLSBpbnNTY29yZV9ETVNPKQoKCmBgYAoKIyMjIyBDaGVja2luZyBpbnN1bGF0aW9uIHNjb3JlIG9mIHRoZSBuZWFyZXN0IFRBRApgYGB7cn0KIyBJbXBvcnRpbmcgVEFEIGJvdW5kYXJpZXMKdGFkX2JvdW5kYXJ5IDwtIGZyZWFkKGhlcmUoIi4uLy4uL3Jlc3VsdC9UQUQiLCAiVEFEXzI1a2JfMTI1a2Jfb3RzdV9ib3VuZGFyaWVzX0cxRE1TTy5iZWQiKSkKY29sbmFtZXModGFkX2JvdW5kYXJ5KSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKdGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6Om11dGF0ZSh0YWRfaWQgPSBwYXN0ZShjaHIsIHN0YXJ0LCBlbmQsIHNlcCA9ICJfIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKQoKZmluZENsb3Nlc3RUQURCb3VuZGFyeSA8LSBmdW5jdGlvbihjaHJvbSwgVFNTLCB0YWRfYm91bmRhcnkpewogIHRlbXAgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gYWJzKGNlbnRlciAtIFRTUykpICU+JQogICAgc2xpY2VfbWluKGRpc3RhbmNlKQogIGlmKG5yb3codGVtcCkgPT0gMSl7CiAgICAgIHJldHVybih0ZW1wJGNlbnRlcikKICB9ZWxzZXsKICAgIHJldHVybihOQSkKICB9Cn0KCgpnZW5lLmluc1Njb3JlLmFsbCA8LSBnZW5lLmluc1Njb3JlLmFsbCAlPiUgcm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUoY2xvc2VzdEJvdW5kYXJ5ID0gZmluZENsb3Nlc3RUQURCb3VuZGFyeShjaHIsIFRTUywgdGFkX2JvdW5kYXJ5KSwKICAgICAgICAgICAgICAgIGxvZzJfYm91bmRhcnlJbnNTY29yZV9ETVNPID0gZ2V0SW5zdWxhdGlvblNjb3JlKGNociwgY2xvc2VzdEJvdW5kYXJ5LCBpbnNTY29yZS5ETVNPKSwKICAgICAgICAgICAgICAgIGJvdW5kYXJ5SW5zU2NvcmVfRE1TTyA9IDJebG9nMl9ib3VuZGFyeUluc1Njb3JlX0RNU08sCiAgICAgICAgICAgICAgICBsb2cyX2JvdW5kYXJ5SW5zU2NvcmVfZFRBRyA9IGdldEluc3VsYXRpb25TY29yZShjaHIsIGNsb3Nlc3RCb3VuZGFyeSwgaW5zU2NvcmUuZFRBRyksCiAgICAgICAgICAgICAgICBib3VuZGFyeUluc1Njb3JlX2RUQUcgPSAyXmxvZzJfYm91bmRhcnlJbnNTY29yZV9kVEFHLAogICAgICAgICAgICAgICAgZGlmZl9ib3VuZGFyeUluc1Njb3JlID0gYm91bmRhcnlJbnNTY29yZV9kVEFHIC0gYm91bmRhcnlJbnNTY29yZV9ETVNPKQoKc2F2ZVJEUyhnZW5lLmluc1Njb3JlLmFsbCwgaGVyZShyZXN1bHREaXIsICJnZW5lLmluc1Njb3JlLmFsbC5yZHMiKSkKZ2VuZS5pbnNTY29yZS5hbGwgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgImdlbmUuaW5zU2NvcmUuYWxsLnJkcyIpKQpgYGAKIyMjIyMgUGxvdHRpbmcgZm9yIGJpbmFyeSBncm91cHMKYGBge3J9Cmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2IikpJGdlbmUKZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3YiKSkkZ2VuZQoKCmdlbmUuaW5zU2NvcmUgPC0gZ2VuZS5pbnNTY29yZS5hbGwgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZSgKICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAxLCAiZ3JvdXAxIiwKICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMiwgImdyb3VwMiIsIE5BKSkpICU+JSAKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpCgoKZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJHNjb3JlCiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKCnBsb3RfaW5zU2NvcmUgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IC0xLjUsIHltYXggPSAwKXsKICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQogIAogIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gIi4iLCBmaWxsID0gZ3JvdXAsIHkgPSAtc2NvcmUpKSArIAogICAgbGFicyh4ID0gTlVMTCwgeSA9ICItIEluc3VsYXRpb24gc2NvcmUiKSArICAjIFJlbW92ZSB4LWF4aXMgdGl0bGUKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHJldigoYygiIzc3Nzc3NyIsICIjRjI4RTJDIikpKSkgKwoKICAgIGludHJvZGF0YXZpejo6Z2VvbV9zcGxpdF92aW9saW4obGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IC40KSArCiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgdGhlbWVfY2xhc3NpYygpICsKICAgIHN0YXRfc3VtbWFyeSgKICAgICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLAogICAgICBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSwKICAgICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMykKICAgICkgKwogICAgCiAgICAjIAogICAgIyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgY29sb3IgPSAiYmxhY2siLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgICAjIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgIGNvbG9yID0gImJsYWNrIiwgbGluZXdpZHRoID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgIyAgICAgICAgICAgICAgb3V0bGllci5zaXplID0gMSwgb3V0bGllci5zdHJva2UgPSBOQSkgKwogICAgIyBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArIAogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCkgKwogICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKCJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSksCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsKICAgIHRoZW1lKAogICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzCiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uCiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvbgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICAgKSsgICBndWlkZXMoCiAgICAgIGZpbGwgPSBndWlkZV9sZWdlbmQoCiAgICAgICAga2V5d2lkdGggPSAwLjIsICAjIEFkanVzdCB0aGUgd2lkdGggb2YgdGhlIGxlZ2VuZCBrZXlzCiAgICAgICAga2V5aGVpZ2h0ID0gMC4yICAjIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWdlbmQga2V5cwogICAgICApKQogICAgICAKICAgICAgCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJpbnN1bGF0aW9uX3Njb3JlX2JpbmFyeUdyb3VwXyIsIG5vdGUpCiAgd2lkdGggPC0gcGFuZWxTaXplKDEuNTUpKm1tVG9JbmNoCmhlaWdodCA8LSBwYW5lbFNpemUoMS4yKSptbVRvSW5jaAogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQp9CgojIERNU08KdGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBib3VuZGFyeUluc1Njb3JlX0RNU08pCmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoImdyb3VwIiwgInNjb3JlIikKcGxvdF9pbnNTY29yZSh0ZW1wLnRiLCAibmVhcmVzdEJvdW5kYXJ5X0RNU09fYmluYXJ5R3JvdXAiLCB5bWluID0gLTEuMSwgeW1heCA9IC0wLjUpCgojIGRUQUcKdGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBib3VuZGFyeUluc1Njb3JlX2RUQUcpCmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoImdyb3VwIiwgInNjb3JlIikKcGxvdF9pbnNTY29yZSh0ZW1wLnRiLCAibmVhcmVzdEJvdW5kYXJ5X2RUQUdfYmluYXJ5R3JvdXAiLCB5bWluID0gIC0xLjEsIHltYXggPSAtMC41KQoKIyBkaWZmCnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgZGlmZl9ib3VuZGFyeUluc1Njb3JlKQpjb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKCJncm91cCIsICJzY29yZSIpCnBsb3RfaW5zU2NvcmUodGVtcC50YiwgIm5lYXJlc3RCb3VuZGFyeV9kaWZmX2JpbmFyeUdyb3VwIiwgeW1pbiA9IC0wLjMsIHltYXggPSAwLjEpCmBgYAoKIyMjIyMgUGxvdHRpbmcgZm9yIGdyb3VwcwpgYGB7cn0KZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMS50c3YiKSkkZ2VuZQpncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAyLnRzdiIpKSRnZW5lCmdyb3VwNSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDUudHN2IikpJGdlbmUKZ3JvdXA4IDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwOC50c3YiKSkkZ2VuZQoKCmdlbmUuaW5zU2NvcmUgPC0gZ2VuZS5pbnNTY29yZS5hbGwgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZSgKICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAxLCAiZ3JvdXAxIiwKICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMiwgImdyb3VwMiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA1LCAiZ3JvdXA1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA4LCAiZ3JvdXA4IiwgTkEpKSkpKSAlPiUgCiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKQoKCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRzY29yZQogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZQogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCgpwbG90X2luc1Njb3JlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMS41KXsKICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQogIHAxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDEiLCAiZ3JvdXA1IiksIDUpCiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDgiKSwgNSkKICBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAyIiwgImdyb3VwNSIpLCA1KQogIHAyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDIiLCAiZ3JvdXA4IiksIDUpCiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwNSIsICJncm91cDgiKSwgNSkKICAKICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsKICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5bWluLCB5bWF4KSkgKwogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IHltaW4gKyAxLCBsYWJlbCA9IHBhc3RlMCgicDEyOiAiLCBjb252UHZhbHVlKHAxMiksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMTU6ICIsIGNvbnZQdmFsdWUocDE1KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAxODogIiwgY29udlB2YWx1ZShwMTgpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDI1OiAiLCBjb252UHZhbHVlKHAyNSksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMjg6ICIsIGNvbnZQdmFsdWUocDI4KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInA1ODogIixjb252UHZhbHVlKCBwNTgpLCAiXG4iKSwKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykKICAKICAKICBmaWxlTmFtZSA8LSBwYXN0ZTAoImluc3VsYXRpb25fc2NvcmVfIiwgbm90ZSkKICBoZWlnaHQgPC0gMwogIHdpZHRoIDwtIDMKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKfQoKIyBETVNPCnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKQpjb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKCJncm91cCIsICJzY29yZSIpCnBsb3RfaW5zU2NvcmUodGVtcC50YiwgIm5lYXJlc3RCb3VuZGFyeV9ETVNPIikKCiMgZFRBRwp0ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRykKY29sbmFtZXModGVtcC50YikgPC0gYygiZ3JvdXAiLCAic2NvcmUiKQpwbG90X2luc1Njb3JlKHRlbXAudGIsICJuZWFyZXN0Qm91bmRhcnlfZFRBRyIpCgojIGRpZmYKdGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpCmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoImdyb3VwIiwgInNjb3JlIikKcGxvdF9pbnNTY29yZSh0ZW1wLnRiLCAibmVhcmVzdEJvdW5kYXJ5X2RpZmYiLCB5bWluID0gLTAuNSwgeW1heCA9IDEpCmBgYAoKIyMjIyMgUGxvdHRpbmcgZm9yIFAtTgpgYGB7cn0KdGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgImdlbmVfbG9vcF9saW5rLnJkcyIpKQoKcG5PdmVyOCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gOCkpJGdlbmUKcG5PdmVyNiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gNiwgdG90YWwgPCA4KSkkZ2VuZQpwbk92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSA0LCB0b3RhbCA8IDYpKSRnZW5lCnBuT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDIsIHRvdGFsIDwgNCkpJGdlbmUKcG5PdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPCAyKSkkZ2VuZQoKCmdlbmUuaW5zU2NvcmUgPC0gZ2VuZS5pbnNTY29yZS5hbGwgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZSgKICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgcG5PdmVyOCwgInA4IiwKICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBuT3ZlcjYsICJwNiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcG5PdmVyNCwgInA0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcG5PdmVyMiwgInAyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwbk92ZXIwLCAicDAiLCBOQSkpKSkpKSAgJT4lIAogIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSkKCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRzY29yZQogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZQogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCnBsb3RfaW5zU2NvcmUgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAxLjUpewogIHAwMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwMCIsICJwMiIpLCA1KQogIHAyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwMiIsICJwNCIpLCA1KQogIHA0NiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwNCIsICJwNiIpLCA1KQogIHA2OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwNiIsICJwOCIpLCA1KQogIHA0OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwNCIsICJwOCIpLCA1KQogIHAyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwMiIsICJwOCIpLCA1KQogIHAwOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwMCIsICJwOCIpLCA1KQogIAogIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKwogICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgKwogICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKCJwMDI6ICIsIGNvbnZQdmFsdWUocDAyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyNDogIiwgY29udlB2YWx1ZShwMjQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDQ2OiAiLCBjb252UHZhbHVlKHA0NiksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwNjg6ICIsIGNvbnZQdmFsdWUocDY4KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInA0ODogIiwgY29udlB2YWx1ZShwNDgpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDI4OiAiLGNvbnZQdmFsdWUoIHAyOCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMDg6ICIsY29udlB2YWx1ZSggcDA4KSwgIlxuIiksCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZDlkOWQ5IiwgIiNiZGJkYmQiLCAiIzk2OTY5NiIsICIjNzM3MzczIiwgIiM1MjUyNTIiKSkKICAKICAKICBmaWxlTmFtZSA8LSBwYXN0ZTAoImluc3VsYXRpb25fc2NvcmVfIiwgbm90ZSkKICBoZWlnaHQgPC0gMwogIHdpZHRoIDwtIDMKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKfQoKIyBETVNPCnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKQpjb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKCJncm91cCIsICJzY29yZSIpCnBsb3RfaW5zU2NvcmUodGVtcC50YiwgIm5lYXJlc3RCb3VuZGFyeV9ETVNPX1AtTiIpCgojIGRUQUcKdGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBib3VuZGFyeUluc1Njb3JlX2RUQUcpCmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoImdyb3VwIiwgInNjb3JlIikKcGxvdF9pbnNTY29yZSh0ZW1wLnRiLCAibmVhcmVzdEJvdW5kYXJ5X2RUQUdfUC1OIikKCiMgZGlmZgp0ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGRpZmZfYm91bmRhcnlJbnNTY29yZSkKY29sbmFtZXModGVtcC50YikgPC0gYygiZ3JvdXAiLCAic2NvcmUiKQpwbG90X2luc1Njb3JlKHRlbXAudGIsICJuZWFyZXN0Qm91bmRhcnlfZGlmZl9QLU4iLCB5bWluID0gLTAuNSwgeW1heCA9IDEpCgpgYGAKIyMjIyMgUGxvdHRpbmcgZm9yIFAtUwpgYGB7cn0KdGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgImdlbmVfbG9vcF9saW5rLnJkcyIpKQoKcHNPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDQpKSRnZW5lCnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZQpwc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMiwgbnVtX3BzIDwgMykpJGdlbmUKcHNPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDEsIG51bV9wcyA8IDIpKSRnZW5lCnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lCgoKZ2VuZS5pbnNTY29yZSA8LSBnZW5lLmluc1Njb3JlLmFsbCAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKAogIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBwc092ZXI0LCAicDQiLAogICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcHNPdmVyMywgInAzIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwc092ZXIyLCAicDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwc092ZXIxLCAicDEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBzT3ZlcjAsICJwMCIsIE5BKSkpKSkpICAlPiUgCiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKQoKZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJHNjb3JlCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJHNjb3JlCiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKcGxvdF9pbnNTY29yZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDEuNSl7CiAgcDAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgInAwIiwgInAxIiksIDUpCiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgInAxIiwgInAyIiksIDUpCiAgcDIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgInAyIiwgInAzIiksIDUpCiAgcDM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgInAzIiwgInA0IiksIDUpCiAgcDI0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgInAyIiwgInA0IiksIDUpCiAgcDE0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgInAxIiwgInA0IiksIDUpCiAgcDA0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgInAwIiwgInA0IiksIDUpCiAgCiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IHNjb3JlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeW1pbiwgeW1heCkpICsKICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSB5bWluICsgMSwgbGFiZWwgPSBwYXN0ZTAoInAwMTogIiwgY29udlB2YWx1ZShwMDEpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDEyOiAiLCBjb252UHZhbHVlKHAxMiksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMjM6ICIsIGNvbnZQdmFsdWUocDIzKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAzNDogIiwgY29udlB2YWx1ZShwMzQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDI0OiAiLCBjb252UHZhbHVlKHAyNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMTQ6ICIsY29udlB2YWx1ZSggcDE0KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAwNDogIixjb252UHZhbHVlKCBwMDQpLCAiXG4iKSwgCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNkOWQ5ZDkiLCAiI2JkYmRiZCIsICIjOTY5Njk2IiwgIiM3MzczNzMiLCAiIzUyNTI1MiIpKQogIAogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgiaW5zdWxhdGlvbl9zY29yZV8iLCBub3RlKQogIGhlaWdodCA8LSAzCiAgd2lkdGggPC0gMwogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQp9CgojIERNU08KdGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBib3VuZGFyeUluc1Njb3JlX0RNU08pCmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoImdyb3VwIiwgInNjb3JlIikKcGxvdF9pbnNTY29yZSh0ZW1wLnRiLCAibmVhcmVzdEJvdW5kYXJ5X0RNU09fUC1TIikKCiMgZFRBRwp0ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfZFRBRykKY29sbmFtZXModGVtcC50YikgPC0gYygiZ3JvdXAiLCAic2NvcmUiKQpwbG90X2luc1Njb3JlKHRlbXAudGIsICJuZWFyZXN0Qm91bmRhcnlfZFRBR19QLVMiKQoKIyBkaWZmCnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgZGlmZl9ib3VuZGFyeUluc1Njb3JlKQpjb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKCJncm91cCIsICJzY29yZSIpCnBsb3RfaW5zU2NvcmUodGVtcC50YiwgIm5lYXJlc3RCb3VuZGFyeV9kaWZmX1AtUyIsIHltaW4gPSAtMC41LCB5bWF4ID0gMSkKYGBgCiMjIyMjIFBsb3R0aW5nIGZvciBQLUUKYGBge3J9CnRlbXAyIDwtIHJlYWRSRFMoaGVyZShyZXN1bHREaXIsICJnZW5lX2xvb3BfbGluay5yZHMiKSkKCnBlT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSA0KSkkZ2VuZQpwZU92ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMywgbnVtX3BlIDwgNCkpJGdlbmUKcGVPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDIsIG51bV9wZSA8IDMpKSRnZW5lCnBlT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAxLCBudW1fcGUgPCAyKSkkZ2VuZQpwZU92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPCAxKSkkZ2VuZQoKCmdlbmUuaW5zU2NvcmUgPC0gZ2VuZS5pbnNTY29yZS5hbGwgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZSgKICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgcGVPdmVyNCwgInA0IiwKICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBlT3ZlcjMsICJwMyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcGVPdmVyMiwgInAyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcGVPdmVyMSwgInAxIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwZU92ZXIwLCAicDAiLCBOQSkpKSkpKSAgJT4lIAogIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSkKCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRzY29yZQogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzY29yZQogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCnBsb3RfaW5zU2NvcmUgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAxLjUpewogIHAwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwMCIsICJwMSIpLCA1KQogIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwMSIsICJwMiIpLCA1KQogIHAyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwMiIsICJwMyIpLCA1KQogIHAzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwMyIsICJwNCIpLCA1KQogIHAyNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwMiIsICJwNCIpLCA1KQogIHAxNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwMSIsICJwNCIpLCA1KQogIHAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJwMCIsICJwNCIpLCA1KQogIAogIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzY29yZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKwogICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgKwogICAgdGhlbWVfY2xhc3NpYygpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0geW1pbiArIDEsIGxhYmVsID0gcGFzdGUwKCJwMDE6ICIsIGNvbnZQdmFsdWUocDAxKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAxMjogIiwgY29udlB2YWx1ZShwMTIpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDIzOiAiLCBjb252UHZhbHVlKHAyMyksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMzQ6ICIsIGNvbnZQdmFsdWUocDM0KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyNDogIiwgY29udlB2YWx1ZShwMjQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDE0OiAiLGNvbnZQdmFsdWUoIHAxNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMDQ6ICIsY29udlB2YWx1ZSggcDA0KSwgIlxuIiksIAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZDlkOWQ5IiwgIiNiZGJkYmQiLCAiIzk2OTY5NiIsICIjNzM3MzczIiwgIiM1MjUyNTIiKSkKICAKICAKICBmaWxlTmFtZSA8LSBwYXN0ZTAoImluc3VsYXRpb25fc2NvcmVfIiwgbm90ZSkKICBoZWlnaHQgPC0gMwogIHdpZHRoIDwtIDMKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKfQoKIyBETVNPCnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9ETVNPKQpjb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKCJncm91cCIsICJzY29yZSIpCnBsb3RfaW5zU2NvcmUodGVtcC50YiwgIm5lYXJlc3RCb3VuZGFyeV9ETVNPX1AtRSIpCgojIGRUQUcKdGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBib3VuZGFyeUluc1Njb3JlX2RUQUcpCmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoImdyb3VwIiwgInNjb3JlIikKcGxvdF9pbnNTY29yZSh0ZW1wLnRiLCAibmVhcmVzdEJvdW5kYXJ5X2RUQUdfUC1FIikKCiMgZGlmZgp0ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGRpZmZfYm91bmRhcnlJbnNTY29yZSkKY29sbmFtZXModGVtcC50YikgPC0gYygiZ3JvdXAiLCAic2NvcmUiKQpwbG90X2luc1Njb3JlKHRlbXAudGIsICJuZWFyZXN0Qm91bmRhcnlfZGlmZl9QLUUiLCB5bWluID0gLTAuNSwgeW1heCA9IDEpCmBgYAojIyMjIyBQbG90dGluZyBmb3IgUC1QCmBgYHtyfQp0ZW1wMiA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCAiZ2VuZV9sb29wX2xpbmsucmRzIikpCgpwcE92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gNCkpJGdlbmUKcHBPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lCnBwT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAyLCBudW1fcHAgPCAzKSkkZ2VuZQpwcE92ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMSwgbnVtX3BwIDwgMikpJGdlbmUKcHBPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmUKCgpnZW5lLmluc1Njb3JlIDwtIGdlbmUuaW5zU2NvcmUuYWxsICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoCiAgZ3JvdXAgPSBpZmVsc2UoZW5zZW1ibCAlaW4lIHBwT3ZlcjQsICJwNCIsCiAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBwcE92ZXIzLCAicDMiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBwT3ZlcjIsICJwMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIHBwT3ZlcjEsICJwMSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgcHBPdmVyMCwgInAwIiwgTkEpKSkpKSkgICU+JSAKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpCgpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkc2NvcmUKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkc2NvcmUKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9CgpwbG90X2luc1Njb3JlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMS41KXsKICBwMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAicDAiLCAicDEiKSwgNSkKICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAicDEiLCAicDIiKSwgNSkKICBwMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAicDIiLCAicDMiKSwgNSkKICBwMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAicDMiLCAicDQiKSwgNSkKICBwMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAicDIiLCAicDQiKSwgNSkKICBwMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAicDEiLCAicDQiKSwgNSkKICBwMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAicDAiLCAicDQiKSwgNSkKICAKICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gc2NvcmUpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsKICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5bWluLCB5bWF4KSkgKwogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IHltaW4gKyAxLCBsYWJlbCA9IHBhc3RlMCgicDAxOiAiLCBjb252UHZhbHVlKHAwMSksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyMzogIiwgY29udlB2YWx1ZShwMjMpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDM0OiAiLCBjb252UHZhbHVlKHAzNCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMjQ6ICIsIGNvbnZQdmFsdWUocDI0KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAxNDogIixjb252UHZhbHVlKCBwMTQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDA0OiAiLGNvbnZQdmFsdWUoIHAwNCksICJcbiIpLCAKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2Q5ZDlkOSIsICIjYmRiZGJkIiwgIiM5Njk2OTYiLCAiIzczNzM3MyIsICIjNTI1MjUyIikpCiAgCiAgCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJpbnN1bGF0aW9uX3Njb3JlXyIsIG5vdGUpCiAgaGVpZ2h0IDwtIDMKICB3aWR0aCA8LSAzCiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KCiMgRE1TTwp0ZW1wLnRiIDwtIGdlbmUuaW5zU2NvcmUgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGJvdW5kYXJ5SW5zU2NvcmVfRE1TTykKY29sbmFtZXModGVtcC50YikgPC0gYygiZ3JvdXAiLCAic2NvcmUiKQpwbG90X2luc1Njb3JlKHRlbXAudGIsICJuZWFyZXN0Qm91bmRhcnlfRE1TT19QLVAiKQoKIyBkVEFHCnRlbXAudGIgPC0gZ2VuZS5pbnNTY29yZSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYm91bmRhcnlJbnNTY29yZV9kVEFHKQpjb2xuYW1lcyh0ZW1wLnRiKSA8LSBjKCJncm91cCIsICJzY29yZSIpCnBsb3RfaW5zU2NvcmUodGVtcC50YiwgIm5lYXJlc3RCb3VuZGFyeV9kVEFHX1AtUCIpCgojIGRpZmYKdGVtcC50YiA8LSBnZW5lLmluc1Njb3JlICU+JSBkcGx5cjo6c2VsZWN0KGdyb3VwLCBkaWZmX2JvdW5kYXJ5SW5zU2NvcmUpCmNvbG5hbWVzKHRlbXAudGIpIDwtIGMoImdyb3VwIiwgInNjb3JlIikKcGxvdF9pbnNTY29yZSh0ZW1wLnRiLCAibmVhcmVzdEJvdW5kYXJ5X2RpZmZfUC1QIiwgeW1pbiA9IC0wLjUsIHltYXggPSAxKQpgYGAKCgojIyBbMi4xNV0gVEFEIGRpc3RhbmNlL3NpemUKIyMjIyBMaW5rIFRBRApgYGB7cn0KcmVmRGlyIDwtIGhlcmUoIi4uLy4uIiwgInJlZmVyZW5jZSIpCgojIEltcG9ydGluZyBUQUQgYm91bmRhcnkKdGFkX2JvdW5kYXJ5IDwtIGZyZWFkKGhlcmUoIi4uLy4uL3Jlc3VsdC9UQUQiLCAiVEFEXzI1a2JfMTI1a2Jfb3RzdV9ib3VuZGFyaWVzX0cxRE1TTy5iZWQiKSkKY29sbmFtZXModGFkX2JvdW5kYXJ5KSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKdGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6Om11dGF0ZSh0YWRfaWQgPSBwYXN0ZShjaHIsIHN0YXJ0LCBlbmQsIHNlcCA9ICJfIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKQoKIyBJbXBvcnRpbmcgVEFECnRhZCA8LSBmcmVhZChoZXJlKCIuLi8uLi9yZXN1bHQvVEFEIiwgIlRBRF8yNWtiXzEyNWtiX290c3VfRzFETVNPLmJlZHBlIikpCmNvbG5hbWVzKHRhZCkgPC0gYygiY2hyMSIsICJzdGFydDEiLCAiZW5kMSIsICJjaHIyIiwgInN0YXJ0MiIsICJlbmQyIikKdGFkIDwtIHRhZCAlPiUgZHBseXI6Om11dGF0ZSh0YWRJRCA9IHBhc3RlKGNocjEsIHN0YXJ0MSwgZW5kMSwgc2VwID0gIl8iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWRTaXplID0gZW5kMSAtIHN0YXJ0MSkKCiMgSW1wb3J0aW5nIGdlbmUKZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWQiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gIisiLCBWMiwgVjMpKSAlPiUKICBkcGx5cjo6c2VsZWN0KFY2LCBWNSwgVjEsIFRTUykKY29sbmFtZXMoZ2VuZS5UU1MudGIpIDwtIGMoImVuc2VtYmwiLCAiZ2VuZSIsICJjaHIiLCAiVFNTIikKCiMgRnVuY3Rpb25zCmZpbmREaXN0YW5jZVRvVEFEIDwtIGZ1bmN0aW9uKGNocm9tLCBUU1MsIHRhZF9ib3VuZGFyeSl7CiAgdGVtcCA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyID09IGNocm9tKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBhYnMoY2VudGVyIC0gVFNTKSkgJT4lIHNsaWNlX21pbihkaXN0YW5jZSkKICBpZihucm93KHRlbXApID09IDEpewogICAgcmV0dXJuKHRlbXAkZGlzdGFuY2UpCiAgfWVsc2V7CiAgICByZXR1cm4oTkEpCiAgfQp9CgpmaW5kSXRzVEFEIDwtIGZ1bmN0aW9uKGNocm9tLCBUU1MsIHRhZCl7CiAgdGVtcCA8LSB0YWQgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyMSA9PSBjaHJvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDEgPCBUU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kMSA+IFRTUykKICBpZihucm93KHRlbXApID09IDEpewogICAgcmV0dXJuKHRlbXAkdGFkSUQpCiAgfWVsc2V7CiAgICByZXR1cm4oTkEpCiAgfQp9CgpmaW5kVEFEU2l6ZSA8LWZ1bmN0aW9uKGNocm9tLCBUU1MsIHRhZCl7CiAgdGVtcCA8LSB0YWQgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyMSA9PSBjaHJvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDEgPCBUU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kMSA+IFRTUykKICBpZihucm93KHRlbXApID09IDEpewogICAgcmV0dXJuKHRlbXAkdGFkU2l6ZSkKICB9ZWxzZXsKICAgIHJldHVybihOQSkKICB9Cn0KCmdlbmUuVFNTLnRiIDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lCiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IGZpbmREaXN0YW5jZVRvVEFEKGNociwgVFNTLCB0YWRfYm91bmRhcnkpLAogICAgICAgICAgICAgICAgVEFEID0gZmluZEl0c1RBRChjaHIsIFRTUywgdGFkKSwKICAgICAgICAgICAgICAgIFRBRHNpemUgPSBmaW5kVEFEU2l6ZShjaHIsIFRTUywgdGFkKSkKYGBgCgojIyMjIyBkVEFHIC0gYmluYXJ5R3JvdXAKYGBge3J9Cmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2IikpJGdlbmUKZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3YiKSkkZ2VuZQoKCmdlbmUuVFNTLnRiLnBsb3QgPC0gZ2VuZS5UU1MudGIgJT4lIHJvd3dpc2UoKSAlPiUgZHBseXI6Om11dGF0ZSgKICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAxLCAiZ3JvdXAxIiwKICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMiwgImdyb3VwMiIsIE5BKSkpICU+JSAKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpCgoKIyMgUGxvdCBkaXN0YW5jZQpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGRpc3RhbmNlCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRkaXN0YW5jZQogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCgpwbG90X1RBRGRpc3RhbmNlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7CiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDIiKSwgNSkKICAKICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9ICIuIiwgZmlsbCA9IGdyb3VwLCB5ID0gZGlzdGFuY2UpKSArCiAgICAjIFNldCBheGlzIGxhYmVscyAobm8geC1heGlzIHRpdGxlKQogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gKChjKCIjNzc3Nzc3IiwgIiNGMjhFMkMiKSkpKSArCiAgICBsYWJzKHggPSBOVUxMLCB5ID0gIkRpc3RhbmNlIGZyb20gVEFEIGJvdW5kYXJ5IikgKwogICAgIyBWaW9saW4gcGxvdCB3aXRoIGJsYWNrIG91dGxpbmUsIGN1c3RvbWl6ZWQgbGluZSB3aWR0aCBhbmQgZW5kCiAgICBpbnRyb2RhdGF2aXo6Omdlb21fc3BsaXRfdmlvbGluKAogICAgIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjQsCiAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSArCiAgICAjIEJveCBwbG90IHdpdGggY3VzdG9taXplZCBsaW5lIHdpZHRoLCBzcXVhcmUgZW5kLCBhbmQgb3V0bGllciBzaXplCiAgICBnZW9tX2JveHBsb3QoCiAgICAgIHdpZHRoID0gMC4zLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LAogICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFCiAgICApICsKICAgIAogICAgIyBNZWFuIHBvaW50IGluIGVhY2ggZ3JvdXAKICAgIHN0YXRfc3VtbWFyeSgKICAgICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLAogICAgICBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSwKICAgICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMykKICAgICkgKwogICAgCiAgICAjIEhvcml6b250YWwgbGluZSBhdCB5ID0gMAogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArCiAgICAKICAgICMgQ29vcmRpbmF0ZSBsaW1pdHMgYW5kIGN1c3RvbSB5LWF4aXMgbGFiZWxzCiAgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeW1pbiwgeW1heCkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKwogICAgCiAgICAjIEFubm90YXRlIHAtdmFsdWUgdGV4dAogICAgYW5ub3RhdGUoCiAgICAgICJ0ZXh0IiwgeCA9IDEsIHkgPSB5bWluICsgMSwKICAgICAgbGFiZWwgPSBwYXN0ZTAoInAxMjogIiwgY29udlB2YWx1ZShwMTIpKSwKICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzCiAgICApICsKICAgIAogICAgIyBUaGVtZSBjdXN0b21pemF0aW9uCiAgICB0aGVtZV9jbGFzc2ljKCkgKwogICAgdGhlbWUoCiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICAgICksCiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICAgKSwKICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEKICAgICAgKSwKICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICAgKSwKICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICAgICksCiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykpICsKICAgIGd1aWRlcygKICAgICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICBrZXl3aWR0aCA9IDAuMiwgICMgQWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgbGVnZW5kIGtleXMKICAgICAgICBrZXloZWlnaHQgPSAwLjIgICMgQWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIGxlZ2VuZCBrZXlzCiAgICAgICkKICAgICkKICAKICAKICBmaWxlTmFtZSA8LSBwYXN0ZTAoImRpc3RhbmNlX3RvX2JvdW5kYXJ5XyIsIG5vdGUpCiAgd2lkdGggPC0gcGFuZWxTaXplKDEuNTUpKm1tVG9JbmNoCiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoCiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KCnBsb3RfVEFEZGlzdGFuY2UoZ2VuZS5UU1MudGIucGxvdCwgImdyb3VwX2JpbmF5R3JvdXAiLCB5bWF4ID0gMTAwMDAwMCkKCgojIyBQbG90IFRBRCBzaXplCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkVEFEc2l6ZQogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkVEFEc2l6ZQogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCgpwbG90X1RBRHNpemUgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXsKICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQogIAogIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gIi4iLCBmaWxsID0gZ3JvdXAsIHkgPSBUQURzaXplKSkgKwogICAgIyBTZXQgYXhpcyBsYWJlbHMgKG5vIHgtYXhpcyB0aXRsZSkKICAgIGxhYnMoeCA9IE5VTEwsIHkgPSAiU2l6ZSBvZiBUQUQiKSArCiAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gKChjKCIjNzc3Nzc3IiwgIiNGMjhFMkMiKSkpKSArCgogICAgIyBWaW9saW4gcGxvdCB3aXRoIGJsYWNrIG91dGxpbmUsIGN1c3RvbWl6ZWQgbGluZSB3aWR0aCBhbmQgZW5kCiAgICBpbnRyb2RhdGF2aXo6Omdlb21fc3BsaXRfdmlvbGluKAogICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0qIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLCBhbHBoYSA9IC40CiAgICApICsKICAgIAogICAgIyBCb3ggcGxvdCB3aXRoIGN1c3RvbWl6ZWQgbGluZSB3aWR0aCwgc3F1YXJlIGVuZCwgYW5kIG91dGxpZXIgc2l6ZQogICAgZ2VvbV9ib3hwbG90KAogICAgICB3aWR0aCA9IDAuMywgY29sb3IgPSAiYmxhY2siLAogICAgICBsaW5ld2lkdGggPSBsaW5lTWVkaXVtKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UKICAgICkgKwogICAgCiAgICAjIE1lYW4gcG9pbnQgaW4gZWFjaCBncm91cAogICAgc3RhdF9zdW1tYXJ5KAogICAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sCiAgICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LAogICAgICBmaWxsID0gImJsYWNrIiwgY29sb3IgPSAiYmxhY2siLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKQogICAgKSArCiAgICAKICAgICMgSG9yaXpvbnRhbCBsaW5lIGF0IHkgPSAwCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQpICsKICAgIAogICAgIyBDb29yZGluYXRlIGxpbWl0cyBhbmQgY3VzdG9tIHktYXhpcyBsYWJlbHMKICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5bWluLCB5bWF4KSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArCiAgICAKICAgICMgQW5ub3RhdGUgcC12YWx1ZSB0ZXh0CiAgICBhbm5vdGF0ZSgKICAgICAgInRleHQiLCB4ID0gMSwgeSA9IHltaW4gKyAxLAogICAgICBsYWJlbCA9IHBhc3RlMCgicDEyOiAiLCBjb252UHZhbHVlKHAxMikpLAogICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMKICAgICkgKwogICAgCiAgICAjIFRoZW1lIGN1c3RvbWl6YXRpb24KICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEKICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgKSArIGd1aWRlcygKICAgICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICBrZXl3aWR0aCA9IDAuMiwgICMgQWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgbGVnZW5kIGtleXMKICAgICAgICBrZXloZWlnaHQgPSAwLjIgICMgQWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIGxlZ2VuZCBrZXlzCiAgICAgICkpCiAgCiAgCiAgCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJzaXplX29mX2JvdW5kYXJ5XyIsIG5vdGUpCiAgd2lkdGggPC0gcGFuZWxTaXplKDEuNTUpKm1tVG9JbmNoCiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoCiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KcGxvdF9UQURzaXplKGdlbmUuVFNTLnRiLnBsb3QsICJncm91cF9iaW5hcnlHcm91cCIsIHltYXggPSAzZTYpCmBgYAoKIyMjIyMgZFRBRyAtIFBsb3R0aW5nIGZvciBncm91cHMKYGBge3J9Cmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2IikpJGdlbmUKZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3YiKSkkZ2VuZQpncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdiIpKSRnZW5lCmdyb3VwOCA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2IikpJGdlbmUKCgpnZW5lLlRTUy50Yi5wbG90IDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoCiAgZ3JvdXAgPSBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMSwgImdyb3VwMSIsCiAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDIsICJncm91cDIiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwNSwgImdyb3VwNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwOCwgImdyb3VwOCIsIE5BKSkpKSkgJT4lIAogIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSkKCgojIyBQbG90IGRpc3RhbmNlCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZGlzdGFuY2UKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJGRpc3RhbmNlCiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKCnBsb3RfVEFEZGlzdGFuY2UgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXsKICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQogIHAxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDEiLCAiZ3JvdXA1IiksIDUpCiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDgiKSwgNSkKICBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAyIiwgImdyb3VwNSIpLCA1KQogIHAyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDIiLCAiZ3JvdXA4IiksIDUpCiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwNSIsICJncm91cDgiKSwgNSkKICAKICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlzdGFuY2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsKICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKwogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKCJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAxNTogIiwgY29udlB2YWx1ZShwMTUpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDE4OiAiLCBjb252UHZhbHVlKHAxOCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMjU6ICIsIGNvbnZQdmFsdWUocDI1KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyODogIiwgY29udlB2YWx1ZShwMjgpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDU4OiAiLGNvbnZQdmFsdWUoIHA1OCksICJcbiIpLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKQogIAogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgiZGlzdGFuY2VfdG9fYm91bmRhcnlfIiwgbm90ZSkKICBoZWlnaHQgPC0gMwogIHdpZHRoIDwtIDMKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKfQoKcGxvdF9UQURkaXN0YW5jZShnZW5lLlRTUy50Yi5wbG90LCAiZ3JvdXAiKQoKCiMjIFBsb3QgVEFEIHNpemUKZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRUQURzaXplCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRUQURzaXplCiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKCnBsb3RfVEFEc2l6ZSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApewogIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDEiLCAiZ3JvdXAyIiksIDUpCiAgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDUiKSwgNSkKICBwMTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwOCIpLCA1KQogIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDIiLCAiZ3JvdXA1IiksIDUpCiAgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMiIsICJncm91cDgiKSwgNSkKICBwNTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXA1IiwgImdyb3VwOCIpLCA1KQogIAogIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBUQURzaXplKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICsKICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMCgicDEyOiAiLCBjb252UHZhbHVlKHAxMiksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMTU6ICIsIGNvbnZQdmFsdWUocDE1KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAxODogIiwgY29udlB2YWx1ZShwMTgpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDI1OiAiLCBjb252UHZhbHVlKHAyNSksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMjg6ICIsIGNvbnZQdmFsdWUocDI4KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInA1ODogIixjb252UHZhbHVlKCBwNTgpLCAiXG4iKSwKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykKICAKICAKICBmaWxlTmFtZSA8LSBwYXN0ZTAoInNpemVfb2ZfYm91bmRhcnlfIiwgbm90ZSkKICBoZWlnaHQgPC0gMwogIHdpZHRoIDwtIDMKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKfQpwbG90X1RBRHNpemUoZ2VuZS5UU1MudGIucGxvdCwgImdyb3VwIiwgeW1heCA9IDZlNikKYGBgCgojIyMjIyBBNDg1IC0gUGxvdHRpbmcgZm9yIGdyb3VwcwpgYGB7cn0KZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwMS50c3YiKSkkZ2VuZQpncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAyLnRzdiIpKSRnZW5lCmdyb3VwMyA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDMudHN2IikpJGdlbmUKZ3JvdXA0IDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNC50c3YiKSkkZ2VuZQpncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdiIpKSRnZW5lCmdyb3VwNiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDYudHN2IikpJGdlbmUKZ3JvdXA3IDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNy50c3YiKSkkZ2VuZQpncm91cDggPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA4LnRzdiIpKSRnZW5lCmdyb3VwOSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDkudHN2IikpJGdlbmUKCgpnZW5lLlRTUy50Yi5wbG90IDwtIGdlbmUuVFNTLnRiICU+JQogIHJvd3dpc2UoKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgZ3JvdXAgPSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICBlbnNlbWJsICVpbiUgZ3JvdXAxIH4gImdyb3VwMSIsCiAgICAgIGVuc2VtYmwgJWluJSBncm91cDIgfiAiZ3JvdXAyIiwKICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwMyB+ICJncm91cDMiLAogICAgICBlbnNlbWJsICVpbiUgZ3JvdXA0IH4gImdyb3VwNCIsCiAgICAgIGVuc2VtYmwgJWluJSBncm91cDUgfiAiZ3JvdXA1IiwKICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwNiB+ICJncm91cDYiLAogICAgICBlbnNlbWJsICVpbiUgZ3JvdXA3IH4gImdyb3VwNyIsCiAgICAgIGVuc2VtYmwgJWluJSBncm91cDggfiAiZ3JvdXA4IiwKICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwOSB+ICJncm91cDkiLAogICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXwogICAgKQogICkgJT4lCiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKQoKIyMgUGxvdCBkaXN0YW5jZQojIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewojICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRkaXN0YW5jZQojICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRkaXN0YW5jZQojICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQojICAgcmV0dXJuKHdpbCRwLnZhbHVlKQojIH0KCgpwbG90X1RBRGRpc3RhbmNlIDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7CiAgIyBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQogICMgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDUiKSwgNSkKICAjIHAxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDEiLCAiZ3JvdXA4IiksIDUpCiAgIyBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAyIiwgImdyb3VwNSIpLCA1KQogICMgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMiIsICJncm91cDgiKSwgNSkKICAjIHA1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDUiLCAiZ3JvdXA4IiksIDUpCiAgIyAKICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlzdGFuY2UpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsKICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikKICAgICMgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKCJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSwgIlxuIiwKICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDE1OiAiLCBjb252UHZhbHVlKHAxNSksICJcbiIsCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAxODogIiwgY29udlB2YWx1ZShwMTgpLCAiXG4iLAogICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMjU6ICIsIGNvbnZQdmFsdWUocDI1KSwgIlxuIiwKICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDI4OiAiLCBjb252UHZhbHVlKHAyOCksICJcbiIsCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInA1ODogIixjb252UHZhbHVlKCBwNTgpLCAiXG4iKSwKICAgICMgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKQogIAogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgiZGlzdGFuY2VfdG9fYm91bmRhcnlfIiwgbm90ZSkKICBoZWlnaHQgPC0gMwogIHdpZHRoIDwtIDMKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKfQoKcGxvdF9UQURkaXN0YW5jZShnZW5lLlRTUy50Yi5wbG90LCAiZ3JvdXBfQTQ4NSIpCgoKIyMgUGxvdCBUQUQgc2l6ZQojIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewojICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRUQURzaXplCiMgICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJFRBRHNpemUKIyAgIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKIyAgIHJldHVybih3aWwkcC52YWx1ZSkKIyB9CiMgCgpwbG90X1RBRHNpemUgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXsKICAjIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDEiLCAiZ3JvdXAyIiksIDUpCiAgIyBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwNSIpLCA1KQogICMgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDgiKSwgNSkKICAjIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDIiLCAiZ3JvdXA1IiksIDUpCiAgIyBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAyIiwgImdyb3VwOCIpLCA1KQogICMgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwNSIsICJncm91cDgiKSwgNSkKICAKICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gVEFEc2l6ZSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKwogICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgKwogICAgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSAKICAgICMgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKCJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSwgIlxuIiwKICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDE1OiAiLCBjb252UHZhbHVlKHAxNSksICJcbiIsCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAxODogIiwgY29udlB2YWx1ZShwMTgpLCAiXG4iLAogICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMjU6ICIsIGNvbnZQdmFsdWUocDI1KSwgIlxuIiwKICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDI4OiAiLCBjb252UHZhbHVlKHAyOCksICJcbiIsCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInA1ODogIixjb252UHZhbHVlKCBwNTgpLCAiXG4iKSwKICAgICMgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKQogIAogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgic2l6ZV9vZl9ib3VuZGFyeV8iLCBub3RlKQogIGhlaWdodCA8LSAzCiAgd2lkdGggPC0gMwogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQp9CnBsb3RfVEFEc2l6ZShnZW5lLlRTUy50Yi5wbG90LCAiZ3JvdXBfQTQ4NSIsIHltYXggPSA2ZTYpCmBgYAoKIyMgWzIuMTZdIENoZWNraW5nIHRoZSBpbnRlbnNpdHkgb2YgUkFEMjEgYXQgVEFEIGJvdW5kYXJ5CiMjIyMgQ2FsY3VsYXRpbmcgUkFEMjEgaW50ZW5zaXR5IG9mIHRoZSBuZWFyZXN0IFRBRCBib3VuZGFyeQpgYGB7cn0KcmVmRGlyIDwtIGhlcmUoIi4uLy4uIiwgInJlZmVyZW5jZSIpCgojIEltcG9ydGluZyBUQUQgYm91bmRhcnkKdGFkX2JvdW5kYXJ5IDwtIGZyZWFkKGhlcmUoIi4uLy4uL3Jlc3VsdC9UQUQiLCAiVEFEXzI1a2JfMTI1a2Jfb3RzdV9ib3VuZGFyaWVzX0cxRE1TTy5iZWQiKSkKY29sbmFtZXModGFkX2JvdW5kYXJ5KSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKdGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6Om11dGF0ZSh0YWRfaWQgPSBwYXN0ZShjaHIsIHN0YXJ0LCBlbmQsIHNlcCA9ICJfIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBzdGFydCAtMTc1MDAwLzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gZW5kICsgMTc1MDAwLzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKQoKIyBJbXBvcnRpbmcgUkFEMjEgYmlnd2lnIHRyYWNrCmJ3LlJBRDIxIDwtIGltcG9ydChoZXJlKHJlZkRpciwgIjMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfdHJpbV9xMjBfZGVkdXBfYmxhY2tfZGVwdGhOb3JtX2JpbjUwYnAuYnciKSkKCiMgQ3JlYXRlIEdSYW5nZXMgb2JqZWN0IGZvciBUQUQgYm91bmRhcmllcwp0YWRfcmFuZ2VzIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0YWRfYm91bmRhcnksIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpCgojIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBhbGwgVEFEIGJvdW5kYXJpZXMgYW5kIFJBRDIxIGJpZ3dpZyBkYXRhCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyh0YWRfcmFuZ2VzLCBidy5SQUQyMSkKCiMgRXh0cmFjdCBvdmVybGFwcGluZyByZWdpb25zIGFuZCBzY29yZXMgZnJvbSB0aGUgQmlnV2lnCm92ZXJsYXBwaW5nX2J3IDwtIGJ3LlJBRDIxW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0Kb3ZlcmxhcHBpbmdfdGFkcyA8LSB0YWRfcmFuZ2VzW3F1ZXJ5SGl0cyhvdmVybGFwcyldCgojIEFnZ3JlZ2F0ZSBzY29yZXMgYnkgVEFEIGJvdW5kYXJ5IHJlZ2lvbnMKCgpzY29yZXMgPC0gYXNfdGliYmxlKG92ZXJsYXBwaW5nX2J3KSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhZF9pZCA9IHRhZF9yYW5nZXNbcXVlcnlIaXRzKG92ZXJsYXBzKV0kdGFkX2lkKSAlPiUKICBncm91cF9ieSh0YWRfaWQpICU+JQogIHN1bW1hcmlzZShyYWQyMVNjb3JlID0gc3VtKHNjb3JlKSkKCnRhZF9ib3VuZGFyeSA8LSB0YWRfYm91bmRhcnkgJT4lCiAgbGVmdF9qb2luKHNjb3JlcywgYnkgPSAidGFkX2lkIikKCgoKCgojIEltcG9ydGluZyBnZW5lCmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkIikpICU+JQogIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09ICIrIiwgVjIsIFYzKSkgJT4lCiAgZHBseXI6OnNlbGVjdChWNiwgVjUsIFYxLCBUU1MpCmNvbG5hbWVzKGdlbmUuVFNTLnRiKSA8LSBjKCJlbnNlbWJsIiwgImdlbmUiLCAiY2hyIiwgIlRTUyIpCgoKIyBGaW5kIG5lYXJlc3QgVEFEIGJvdW5kYXJ5CmZpbmRDbG9zZXN0VEFEQm91bmRhcnlJRCA8LSBmdW5jdGlvbihjaHJvbSwgVFNTLCB0YWRfYm91bmRhcnkpewogIHRlbXAgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gYWJzKGNlbnRlciAtIFRTUykpICU+JQogICAgc2xpY2VfbWluKGRpc3RhbmNlKQogIGlmKG5yb3codGVtcCkgPT0gMSl7CiAgICAgIHJldHVybih0ZW1wJHRhZF9pZCkKICB9ZWxzZXsKICAgIHJldHVybihOQSkKICB9Cn0KZ2VuZS5UU1MudGIgPC0gZ2VuZS5UU1MudGIgJT4lIHJvd3dpc2UoKSAlPiUKICBkcGx5cjo6bXV0YXRlKGNsb3Nlc3RCb3VuZGFyeSA9IGZpbmRDbG9zZXN0VEFEQm91bmRhcnlJRChjaHIsIFRTUywgdGFkX2JvdW5kYXJ5KSkKCnRlbXAgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6c2VsZWN0KHRhZF9pZCwgcmFkMjFTY29yZSkKCmdlbmUuVFNTLnRiIDwtIGdlbmUuVFNTLnRiICU+JSBsZWZ0X2pvaW4odGVtcCwgYnkgPSBjKCJjbG9zZXN0Qm91bmRhcnkiID0gInRhZF9pZCIpICkKCmBgYAoKCiMjIyMjIFBsb3R0aW5nIGZvciBncm91cHMKYGBge3J9Cmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2IikpJGdlbmUKZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3YiKSkkZ2VuZQpncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdiIpKSRnZW5lCmdyb3VwOCA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2IikpJGdlbmUKCgpnZW5lLlRTUy50Yi5wbG90IDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoCiAgZ3JvdXAgPSBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMSwgImdyb3VwMSIsCiAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDIsICJncm91cDIiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwNSwgImdyb3VwNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwOCwgImdyb3VwOCIsIE5BKSkpKSkgJT4lIAogIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSkKCgojIyBQbG90IGRpc3RhbmNlCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkcmFkMjFTY29yZQogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkcmFkMjFTY29yZQogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCgpwbG90X3JhZDIxU2NvcmVBdEJvdW5kYXJ5IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUpewogIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDEiLCAiZ3JvdXAyIiksIDUpCiAgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDUiKSwgNSkKICBwMTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwOCIpLCA1KQogIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDIiLCAiZ3JvdXA1IiksIDUpCiAgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMiIsICJncm91cDgiKSwgNSkKICBwNTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXA1IiwgImdyb3VwOCIpLCA1KQogIAogIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSByYWQyMVNjb3JlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyAKICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAyMCArIDEsIGxhYmVsID0gcGFzdGUwKCJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAxNTogIiwgY29udlB2YWx1ZShwMTUpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDE4OiAiLCBjb252UHZhbHVlKHAxOCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMjU6ICIsIGNvbnZQdmFsdWUocDI1KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyODogIiwgY29udlB2YWx1ZShwMjgpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDU4OiAiLGNvbnZQdmFsdWUoIHA1OCksICJcbiIpLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKQogIAogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgicmFkMjFTY29yZV8iLCBub3RlKQogIGhlaWdodCA8LSAzCiAgd2lkdGggPC0gMwogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQp9CgpwbG90X3JhZDIxU2NvcmVBdEJvdW5kYXJ5KGdlbmUuVFNTLnRiLnBsb3QsICJncm91cCIpCgoKYGBgCgoKIyMgWzIuMTddIENoZWNraW5nIHRoZSBkZW5zaXR5IG9mIGdlbmUgLyBlbmhhbmNlciB3aXRoaW4gZGVzaWduYXRlZCBUQUQKIyMjIyBNYWtpbmcgVEFEIGdlbmUgY291bnQKYGBge3J9CiMjIyBJTVBPUlRJTkcgUkVRVUlSRUQgREFUQQojIEltcG9ydGluZyBUQUQKdGFkIDwtIGZyZWFkKGhlcmUoIi4uLy4uL3Jlc3VsdC9UQUQiLCAiVEFEXzI1a2JfMTI1a2Jfb3RzdV9HMURNU08uYmVkcGUiKSkKY29sbmFtZXModGFkKSA8LSBjKCJjaHIxIiwgInN0YXJ0MSIsICJlbmQxIiwgImNocjIiLCAic3RhcnQyIiwgImVuZDIiKQp0YWQgPC0gdGFkICU+JSBkcGx5cjo6bXV0YXRlKHRhZElEID0gcGFzdGUoY2hyMSwgc3RhcnQxLCBlbmQxLCBzZXAgPSAiXyIpKQoKCiMgSW1wb3J0aW5nIGdlbmUKZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWQiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gIisiLCBWMiwgVjMpKSAlPiUKICBkcGx5cjo6c2VsZWN0KFY2LCBWNSwgVjEsIFRTUykKY29sbmFtZXMoZ2VuZS5UU1MudGIpIDwtIGMoImVuc2VtYmwiLCAiZ2VuZSIsICJjaHIiLCAiVFNTIikKCiMgSW1wb3J0aW5nIGVuaGFuY2VyCnBlYWsuSDNLMjdhYyA8LSBhc190aWJibGUoaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgIkdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5uYXJyb3dQZWFrLmJlZCIpKSkgJT4lCiAgZHBseXI6Om11dGF0ZShjZW50ZXIgPSAoc3RhcnQgKyBlbmQpLzIpCgoKIyMjIEZVTkNUSU9OIEZPUiBDT1VOVElORwpmaW5kSXRzVEFEIDwtIGZ1bmN0aW9uKGNocm9tLCBjb29yZGluYXRlLCB0YWQpewogIHRlbXAgPC0gdGFkICU+JSBkcGx5cjo6ZmlsdGVyKGNocjEgPT0gY2hyb20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQxIDwgY29vcmRpbmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQxID4gY29vcmRpbmF0ZSkKICBpZihucm93KHRlbXApID09IDEpewogICAgcmV0dXJuKHRlbXAkdGFkSUQpCiAgfWVsc2V7CiAgICByZXR1cm4oTkEpCiAgfQp9CgojIyMgQ291bnRpbmcgZWFjaCBmZWF0dXJlcyBmb3IgVEFECiMjIyBDb3VudGluZyBnZW5lCmdlbmVDb3VudFBlclRBRCA8LSBnZW5lLlRTUy50YiAlPiUgcm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUoVEFEID0gZmluZEl0c1RBRChjaHIsIFRTUywgdGFkKSkgJT4lCiAgZHJvcF9uYSgpICU+JQogIGdyb3VwX2J5KFRBRCkgJT4lCiAgc3VtbWFyaXplKGNvdW50ID0gbigpKQoKIyMjIENvdW50aW5nIGVuaGFuY2VyCgplbmhDb3VudFBlclRBRCA8LSBwZWFrLkgzSzI3YWMgJT4lIHJvd3dpc2UoKSAlPiUKICBkcGx5cjo6bXV0YXRlKFRBRCA9IGZpbmRJdHNUQUQoc2VxbmFtZXMsIGNlbnRlciwgdGFkKSkgJT4lCiAgZHJvcF9uYSgpICU+JQogIGdyb3VwX2J5KFRBRCkgJT4lCiAgc3VtbWFyaXplKGNvdW50ID0gbigpKQoKIyMjIEdldCBUQUQgc2l6ZXoKdGFkLmRiIDwtIHRhZCAlPiUgbGVmdF9qb2luKGdlbmVDb3VudFBlclRBRCwgYnkgPSBjKCJ0YWRJRCIgPSAiVEFEIiksICkgJT4lCiAgbGVmdF9qb2luKGVuaENvdW50UGVyVEFELCBieSA9IGMoInRhZElEIiA9ICJUQUQiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDcsIDgsIDkpKSAlPiUKICBtdXRhdGVfYWxsKH5yZXBsYWNlKC4sIGlzLm5hKC4pLCAwKSkKCmNvbG5hbWVzKHRhZC5kYikgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIsICJ0YWRJRCIsICJnZW5lQ291bnQiLCAiZW5oQ291bnQiKQoKdGFkLmRiIDwtIHRhZC5kYiAlPiUgZHBseXI6Om11dGF0ZSgKICB0YWRTaXplID0gZW5kIC0gc3RhcnQsCiAgZ2VuZURlbnNpdHkgPSBnZW5lQ291bnQvdGFkU2l6ZSAqIDEwMGUzLAogIGVuaERlbnNpdHkgPSBlbmhDb3VudC90YWRTaXplKiAxMDBlMywKICByZWdEZW5zaXR5ID0gKGdlbmVDb3VudCArIGVuaENvdW50KS90YWRTaXplKiAxMDBlMwopCgoKCiMjIyBBc3NpZ24gVEFEIGFuZCBpbmZvcm1hdGlvbiB0byBnZW5lCmdlbmUuVFNTLnRiIDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lCiAgZHBseXI6Om11dGF0ZShUQUQgPSBmaW5kSXRzVEFEKGNociwgVFNTLCB0YWQpKQojZ2VuZS5UU1MudGIgPC0gZ2VuZS5UU1MudGIgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKFRBRCkpCnRlbXAgPC0gdGFkLmRiICU+JSBkcGx5cjo6c2VsZWN0KC1jKDEsIDIsIDMpKQoKZ2VuZS5UU1MudGIgPC0gZ2VuZS5UU1MudGIgJT4lIGRwbHlyOjpsZWZ0X2pvaW4odGVtcCwgYnkgPSBjKCJUQUQiID0gInRhZElEIikpCmBgYAoKIyMjIyBQbG90dGluZyBmb3IgZ3JvdXBzCiMjIyMjIGdlbmVDb3VudAojIyMjIyMgQmluYXJ5IGdyb3VwCmBgYHtyfQpncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdiIpKSRnZW5lCmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2IikpJGdlbmUKCgpnZW5lLlRTUy50Yi5wbG90IDwtIGdlbmUuVFNTLnRiICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoCiAgZ3JvdXAgPSBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMSwgImdyb3VwMSIsCiAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDIsICJncm91cDIiLCBOQSkpKSAlPiUgCiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKQoKCiMjIGdlbmVDb3VudApnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGdlbmVDb3VudAogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDIpICkkZ2VuZUNvdW50CiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKCnBsb3RfZ2VuZUNvdW50IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7CiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDIiKSwgNSkKICAKICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZ2VuZUNvdW50KSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKwogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKCJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSksCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpCiAgCiAgCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJnZW5lQ291bnRfIiwgbm90ZSkKICBoZWlnaHQgPC0gMwogIHdpZHRoIDwtIDEuNQogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQp9CnBsb3RfZ2VuZUNvdW50KGdlbmUuVFNTLnRiLnBsb3QsICJncm91cF9iaW5hcnlHcm91cCIsIHltYXggPSAyMDApCgpgYGAKIyMjIyMjIEdyb3VwCmBgYHtyfQpncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdiIpKSRnZW5lCmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDIudHN2IikpJGdlbmUKZ3JvdXA1IDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwNS50c3YiKSkkZ2VuZQpncm91cDggPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA4LnRzdiIpKSRnZW5lCgoKZ2VuZS5UU1MudGIucGxvdCA8LSBnZW5lLlRTUy50YiAlPiUgcm93d2lzZSgpICU+JSBkcGx5cjo6bXV0YXRlKAogIGdyb3VwID0gaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDEsICJncm91cDEiLAogICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAyLCAiZ3JvdXAyIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDUsICJncm91cDUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVuc2VtYmwgJWluJSBncm91cDgsICJncm91cDgiLCBOQSkpKSkpICU+JSAKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpCgoKIyMgZ2VuZUNvdW50CmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZ2VuZUNvdW50CiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRnZW5lQ291bnQKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9CgoKcGxvdF9nZW5lQ291bnQgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXsKICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQogIHAxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDEiLCAiZ3JvdXA1IiksIDUpCiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDgiKSwgNSkKICBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAyIiwgImdyb3VwNSIpLCA1KQogIHAyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDIiLCAiZ3JvdXA4IiksIDUpCiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwNSIsICJncm91cDgiKSwgNSkKICAKICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZ2VuZUNvdW50KSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKwogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKCJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAxNTogIiwgY29udlB2YWx1ZShwMTUpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDE4OiAiLCBjb252UHZhbHVlKHAxOCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMjU6ICIsIGNvbnZQdmFsdWUocDI1KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyODogIiwgY29udlB2YWx1ZShwMjgpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDU4OiAiLGNvbnZQdmFsdWUoIHA1OCksICJcbiIpLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKQogIAogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgiZ2VuZUNvdW50XyIsIG5vdGUpCiAgaGVpZ2h0IDwtIDMKICB3aWR0aCA8LSAzCiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KcGxvdF9nZW5lQ291bnQoZ2VuZS5UU1MudGIucGxvdCwgImdyb3VwIiwgeW1heCA9IDIwMCkKCmBgYAojIyMjIyBlbmhDb3VudAojIyMjIyMgQmluYXJ5IEdyb3VwCmBgYHtyfQojIyBlbmhDb3VudApnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGVuaENvdW50CiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRlbmhDb3VudAogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCgpwbG90X2VuaENvdW50IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7CiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDIiKSwgNSkKICAKICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZW5oQ291bnQpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsKICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoInAxMjogIiwgY29udlB2YWx1ZShwMTIpKSwKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykKICAKICAKICBmaWxlTmFtZSA8LSBwYXN0ZTAoImVuaENvdW50XyIsIG5vdGUpCiAgaGVpZ2h0IDwtIDMKICB3aWR0aCA8LSAxLjUKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKfQpwbG90X2VuaENvdW50KGdlbmUuVFNTLnRiLnBsb3QsICJncm91cF9iaW5hcnlHcm91cCIsIHltYXggPSAyMDApCgpgYGAKIyMjIyMjIEdyb3VwCmBgYHtyfQojIyBlbmhDb3VudApnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGVuaENvdW50CiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRlbmhDb3VudAogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCgpwbG90X2VuaENvdW50IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7CiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDIiKSwgNSkKICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwNSIpLCA1KQogIHAxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDEiLCAiZ3JvdXA4IiksIDUpCiAgcDI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMiIsICJncm91cDUiKSwgNSkKICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAyIiwgImdyb3VwOCIpLCA1KQogIHA1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDUiLCAiZ3JvdXA4IiksIDUpCiAgCiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IGVuaENvdW50KSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKwogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKCJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAxNTogIiwgY29udlB2YWx1ZShwMTUpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDE4OiAiLCBjb252UHZhbHVlKHAxOCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMjU6ICIsIGNvbnZQdmFsdWUocDI1KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyODogIiwgY29udlB2YWx1ZShwMjgpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDU4OiAiLGNvbnZQdmFsdWUoIHA1OCksICJcbiIpLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKQogIAogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgiZW5oQ291bnRfIiwgbm90ZSkKICBoZWlnaHQgPC0gMwogIHdpZHRoIDwtIDMKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKfQpwbG90X2VuaENvdW50KGdlbmUuVFNTLnRiLnBsb3QsICJncm91cCIsIHltYXggPSAyMDApCgpgYGAKIyMjIyMgZ2VuZURlbnNpdHkKIyMjIyMjIGJpbmFyeUdyb3VwCmBgYHtyfQojIyBnZW5lRGVuc2l0eQpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGdlbmVEZW5zaXR5CiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRnZW5lRGVuc2l0eQogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCgpwbG90X2dlbmVEZW5zaXR5IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMTApewogIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDEiLCAiZ3JvdXAyIiksIDUpCiAgCiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSAiLiIsIGZpbGwgPSBncm91cCwgeSA9IGdlbmVEZW5zaXR5KSkgKwogICAgIyBTZXQgYXhpcyBsYWJlbHMgKG5vIHgtYXhpcyB0aXRsZSkKICAgIGxhYnMoeCA9IE5VTEwsIHkgPSAiR2VuZSBkZW5zaXR5IHdpdGhpbiBUQUQiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSAocmV2KGMoIiM3Nzc3NzciLCIjRjI4RTJDIikpKSkgKwogICAgIyBWaW9saW4gcGxvdCB3aXRoIGJsYWNrIG91dGxpbmUsIGN1c3RvbWl6ZWQgbGluZSB3aWR0aCBhbmQgZW5kCiAgICBpbnRyb2RhdGF2aXo6Omdlb21fc3BsaXRfdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAuNAogICAgKSArCiAgICAKICAgICMgQm94IHBsb3Qgd2l0aCBjdXN0b21pemVkIGxpbmUgd2lkdGgsIHNxdWFyZSBlbmQsIGFuZCBvdXRsaWVyIHNpemUKICAgIGdlb21fYm94cGxvdCgKICAgICAgd2lkdGggPSAwLjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRQogICAgKSArCiAgICAKICAgICMgTWVhbiBwb2ludCBpbiBlYWNoIGdyb3VwCiAgICBzdGF0X3N1bW1hcnkoCiAgICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwKICAgICAgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsCiAgICAgIGZpbGwgPSAiYmxhY2siLCBjb2xvciA9ICJibGFjayIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpCiAgICApICsKICAgIAogICAgIyBIb3Jpem9udGFsIGxpbmUgYXQgeSA9IDAKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgKwogICAgCiAgICAjIENvb3JkaW5hdGUgbGltaXRzIGFuZCBjdXN0b20geS1heGlzIGxhYmVscwogICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHltaW4sIHltYXgpKSArCiAgICAKICAgICMgQW5ub3RhdGUgcC12YWx1ZSB0ZXh0CiAgICBhbm5vdGF0ZSgKICAgICAgInRleHQiLCB4ID0gMSwgeSA9IHltaW4gKyAxLAogICAgICBsYWJlbCA9IHBhc3RlMCgicDEyOiAiLCBjb252UHZhbHVlKHAxMikpLAogICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMKICAgICkgKwogICAgCiAgICAjIFRoZW1lIGN1c3RvbWl6YXRpb24KICAgIHRoZW1lX2NsYXNzaWMoKSArCiAgICB0aGVtZSgKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVNLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICAgKSwKICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgICApLAogICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMQogICAgICApLAogICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgICApLAogICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICAgKSwKICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICAgKSsgICAKICAgIGd1aWRlcygKICAgICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICBrZXl3aWR0aCA9IDAuMiwgICMgQWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgbGVnZW5kIGtleXMKICAgICAgICBrZXloZWlnaHQgPSAwLjIgICMgQWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIGxlZ2VuZCBrZXlzCiAgICAgICkpCiAgCiAgCiAgCiAgCiAgCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJnZW5lRGVuc2l0eV8iLCBub3RlKQogIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoCiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoCiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KcGxvdF9nZW5lRGVuc2l0eShnZW5lLlRTUy50Yi5wbG90LCAiZ3JvdXBfYmluYXJ5R3JvdXAiLCB5bWF4ID0gOCkKCmBgYAojIyMjIyMgR3JvdXAKYGBge3J9CiMjIGdlbmVEZW5zaXR5CmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSBncm91cDEpICkkZ2VuZURlbnNpdHkKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJGdlbmVEZW5zaXR5CiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKCnBsb3RfZ2VuZURlbnNpdHkgPC0gZnVuY3Rpb24odGVtcC50Yiwgbm90ZSwgeW1pbiA9IDAsIHltYXggPSAyMDAwMDAwKXsKICBwMTIgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwMiIpLCA1KQogIHAxNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDEiLCAiZ3JvdXA1IiksIDUpCiAgcDE4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDgiKSwgNSkKICBwMjUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAyIiwgImdyb3VwNSIpLCA1KQogIHAyOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDIiLCAiZ3JvdXA4IiksIDUpCiAgcDU4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwNSIsICJncm91cDgiKSwgNSkKICAKICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZ2VuZURlbnNpdHkpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsKICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoInAxMjogIiwgY29udlB2YWx1ZShwMTIpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDE1OiAiLCBjb252UHZhbHVlKHAxNSksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMTg6ICIsIGNvbnZQdmFsdWUocDE4KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyNTogIiwgY29udlB2YWx1ZShwMjUpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDI4OiAiLCBjb252UHZhbHVlKHAyOCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwNTg6ICIsY29udlB2YWx1ZSggcDU4KSwgIlxuIiksCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpCiAgCiAgCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJnZW5lRGVuc2l0eV8iLCBub3RlKQogIGhlaWdodCA8LSAzCiAgd2lkdGggPC0gMwogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQp9CnBsb3RfZ2VuZURlbnNpdHkoZ2VuZS5UU1MudGIucGxvdCwgImdyb3VwIiwgeW1heCA9IDEwKQoKYGBgCiMjIyMjIGVuaERlbnNpdHkKIyMjIyMjIEJpbmFyeSBncm91cApgYGB7cn0KIyMgZW5oRGVuc2l0eQpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGVuaERlbnNpdHkKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJGVuaERlbnNpdHkKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9CgoKcGxvdF9lbmhEZW5zaXR5IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7CiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDIiKSwgNSkKICAKICBwIDwtIGdncGxvdCh0ZW1wLnRiLCBhZXMoeCA9IGdyb3VwLCB5ID0gZW5oRGVuc2l0eSkpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBncm91cCksIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKwogICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgKwogICAgdGhlbWVfY2xhc3NpYygpICsKICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAoeW1pbiArIHltYXgpLzIgKyAxLCBsYWJlbCA9IHBhc3RlMCgicDEyOiAiLCBjb252UHZhbHVlKHAxMikpLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKQogIAogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgiZW5oRGVuc2l0eV8iLCBub3RlKQogIGhlaWdodCA8LSAzCiAgd2lkdGggPC0gMS41CiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KcGxvdF9lbmhEZW5zaXR5KGdlbmUuVFNTLnRiLnBsb3QsICJncm91cF9iaW5hcnlHcm91cCIsIHltYXggPSAxMCkKCmBgYAojIyMjIyMgR3JvdXAKYGBge3J9CiMjIGVuaERlbnNpdHkKZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMSkgKSRlbmhEZW5zaXR5CiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRlbmhEZW5zaXR5CiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKCnBsb3RfZW5oRGVuc2l0eSA8LSBmdW5jdGlvbih0ZW1wLnRiLCBub3RlLCB5bWluID0gMCwgeW1heCA9IDIwMDAwMDApewogIHAxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDEiLCAiZ3JvdXAyIiksIDUpCiAgcDE1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDUiKSwgNSkKICBwMTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwOCIpLCA1KQogIHAyNSA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDIiLCAiZ3JvdXA1IiksIDUpCiAgcDI4IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMiIsICJncm91cDgiKSwgNSkKICBwNTggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXA1IiwgImdyb3VwOCIpLCA1KQogIAogIHAgPC0gZ2dwbG90KHRlbXAudGIsIGFlcyh4ID0gZ3JvdXAsIHkgPSBlbmhEZW5zaXR5KSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKwogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9ICh5bWluICsgeW1heCkvMiArIDEsIGxhYmVsID0gcGFzdGUwKCJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAxNTogIiwgY29udlB2YWx1ZShwMTUpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDE4OiAiLCBjb252UHZhbHVlKHAxOCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMjU6ICIsIGNvbnZQdmFsdWUocDI1KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyODogIiwgY29udlB2YWx1ZShwMjgpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDU4OiAiLGNvbnZQdmFsdWUoIHA1OCksICJcbiIpLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKQogIAogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgiZW5oRGVuc2l0eV8iLCBub3RlKQogIGhlaWdodCA8LSAzCiAgd2lkdGggPC0gMwogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQp9CnBsb3RfZW5oRGVuc2l0eShnZW5lLlRTUy50Yi5wbG90LCAiZ3JvdXAiLCB5bWF4ID0gMTApCgpgYGAKIyMjIyMgcmVnZGVuc2l0eQpgYGB7cn0KIyMgcmVnRGVuc2l0eQpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJHJlZ0RlbnNpdHkKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAyKSApJHJlZ0RlbnNpdHkKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9CgoKcGxvdF9yZWdEZW5zaXR5IDwtIGZ1bmN0aW9uKHRlbXAudGIsIG5vdGUsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAwMCl7CiAgcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMSIsICJncm91cDIiKSwgNSkKICBwMTUgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAxIiwgImdyb3VwNSIpLCA1KQogIHAxOCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDEiLCAiZ3JvdXA4IiksIDUpCiAgcDI1IDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcC50YiwgImdyb3VwMiIsICJncm91cDUiKSwgNSkKICBwMjggPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLnRiLCAiZ3JvdXAyIiwgImdyb3VwOCIpLCA1KQogIHA1OCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAudGIsICJncm91cDUiLCAiZ3JvdXA4IiksIDUpCiAgCiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IHJlZ0RlbnNpdHkpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsKICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gKHltaW4gKyB5bWF4KS8yICsgMSwgbGFiZWwgPSBwYXN0ZTAoInAxMjogIiwgY29udlB2YWx1ZShwMTIpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDE1OiAiLCBjb252UHZhbHVlKHAxNSksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMTg6ICIsIGNvbnZQdmFsdWUocDE4KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyNTogIiwgY29udlB2YWx1ZShwMjUpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDI4OiAiLCBjb252UHZhbHVlKHAyOCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwNTg6ICIsY29udlB2YWx1ZSggcDU4KSwgIlxuIiksCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpCiAgCiAgCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJyZWdEZW5zaXR5XyIsIG5vdGUpCiAgaGVpZ2h0IDwtIDMKICB3aWR0aCA8LSAzCiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KcGxvdF9yZWdEZW5zaXR5KGdlbmUuVFNTLnRiLnBsb3QsICJncm91cCIsIHltYXggPSAxMCkKCmBgYAojIyMjIENoZWNraW5nIFRBRCBhdmVyYWdlIGxvZzJGQwpgYGB7cn0KZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaikKCnRlbXAgPC0gbGVmdF9qb2luKGdlbmUuVFNTLnRiLCBkaWZmLlJOQSwgYnkgPSBjKCJlbnNlbWJsIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGxvZzJGb2xkQ2hhbmdlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEoVEFEKSkKCgpkYXRhIDwtIHRlbXAgJT4lIGdyb3VwX2J5KFRBRCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShhYnNBdmdMb2cyRkMgPSBhYnMobWVhbihsb2cyRm9sZENoYW5nZSkpLAogICAgICAgICAgICAgICAgICAgYXZnTG9nMkZDID0gbWVhbihsb2cyRm9sZENoYW5nZSksCiAgICAgICAgICAgICAgICAgICBnZW5lRGVuc2l0eSA9IG1lYW4oZ2VuZURlbnNpdHkpLAogICAgICAgICAgICAgICAgICAgZW5oRGVuc2l0eSA9IG1lYW4oZW5oRGVuc2l0eSksCiAgICAgICAgICAgICAgICAgICByZWdEZW5zaXR5ID0gbWVhbihyZWdEZW5zaXR5KSkKCmRhdGEkZ2VuZURlbnNpdHlHcm91cCA8LSBjdXQoCiAgZGF0YSRnZW5lRGVuc2l0eSwKICBicmVha3MgPSBxdWFudGlsZShkYXRhJGdlbmVEZW5zaXR5LCBwcm9icyA9IHNlcSgwLCAxLCAwLjIpLCBuYS5ybSA9IFRSVUUpLAogIGluY2x1ZGUubG93ZXN0ID0gVFJVRSwKICBsYWJlbHMgPSBwYXN0ZTAoc2VxKDAsIDgwLCAyMCksICItIiwgc2VxKDIwLCAxMDAsIDIwKSwgIiUiKQopCgpkYXRhJGVuaERlbnNpdHlHcm91cCA8LSBjdXQoCiAgZGF0YSRlbmhEZW5zaXR5LAogIGJyZWFrcyA9IHF1YW50aWxlKGRhdGEkZW5oRGVuc2l0eSwgcHJvYnMgPSBzZXEoMCwgMSwgMC4yKSwgbmEucm0gPSBUUlVFKSwKICBpbmNsdWRlLmxvd2VzdCA9IFRSVUUsCiAgbGFiZWxzID0gcGFzdGUwKHNlcSgwLCA4MCwgMjApLCAiLSIsIHNlcSgyMCwgMTAwLCAyMCksICIlIikKKQoKCiMjIyBQbG90aW5nICBncm91cGluZwoKcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBlbmhEZW5zaXR5R3JvdXAsIHkgPSBlbmhEZW5zaXR5LCBmaWxsID0gZW5oRGVuc2l0eUdyb3VwKSkgKyAKICBnZW9tX2JveHBsb3QoY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIHF1YW50aWxlKGRhdGEkZW5oRGVuc2l0eSwgMC45OSkpKSArCiAgbGFicyh4ID0gIkVuaGFuY2VyIERlbnNpdHkgR3JvdXAiICwgeSA9ICJUQUQgZW5oYW5jZXIgZGVuc2l0eSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjRDlEOUQ5IiwgIiNCRkJGQkYiLCAiI0E2QTZBNiIsICIjOEM4QzhDIiwgIiM3MzczNzMiKSkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEKICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJ0YWRHcm91cF9lbmhEZW5zaXR5IikKd2lkdGggPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKCgpwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdlbmVEZW5zaXR5R3JvdXAsIHkgPSBnZW5lRGVuc2l0eSwgZmlsbCA9IGdlbmVEZW5zaXR5R3JvdXApKSArIAogIGdlb21fYm94cGxvdChjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIHF1YW50aWxlKGRhdGEkZ2VuZURlbnNpdHksIDAuOTkpKSkgKwogIGxhYnMoeCA9ICJHZW5lIERlbnNpdHkgR3JvdXAiICwgeSA9ICJHZW5lIGRlbnNpdHkiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzc3Nzc3NyIsICIjOEI3RTY1IiwgIiNBMjg0NTIiLCAiI0MyODg0RCIsICIjRjI4RTJDIikpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkKZmlsZU5hbWUgPC0gcGFzdGUwKCJ0YWRHcm91cF9nZW5lRGVuc2l0eSIpCndpZHRoIDwtIDMxKm1tVG9JbmNoCmhlaWdodCA8LSAzOCptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKCiMjIyBQbG90dGluZyBkaXN0cmlidXRpb24gLSBlbmgKIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihlbmhEZW5zaXR5R3JvdXAgPT1ncm91cDEpICkkYXZnTG9nMkZDCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGVuaERlbnNpdHlHcm91cCA9PWdyb3VwMikgKSRhdmdMb2cyRkMKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9CgoKIyMjIyBBTEwKIyB5bGltIDwtIG1heChhYnMocXVhbnRpbGUoZGF0YSRhdmdMb2cyRkMsIDAuMDEpKSwgYWJzKHF1YW50aWxlKGRhdGEkYXZnTG9nMkZDLCAwLjk5KSkpCiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBlbmhEZW5zaXR5R3JvdXAsIHkgPSBhdmdMb2cyRkMpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZW5oRGVuc2l0eUdyb3VwKSkrIAojICAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjEpICsgdGhlbWVfY2xhc3NpYygpICsKIyAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygteWxpbSwgeWxpbSkpICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKIyAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNkOWQ5ZDkiLCAiI2JkYmRiZCIsICIjOTY5Njk2IiwgIiM3MzczNzMiLCAiIzUyNTI1MiIpKQojIAojIGZpbGVOYW1lIDwtIHBhc3RlMCgidGFkR3JvdXBfZW5oRGVuc2l0eV9hdmdMb2cyRkMiKQojIGhlaWdodCA8LSAzCiMgd2lkdGggPC0gMwojIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQojIHByaW50KHApCiMgZGV2Lm9mZigpCiMgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKIyBwcmludChwKQojIGRldi5vZmYoKQojIyMjIFVQCmRhdGEucGx1cyA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGF2Z0xvZzJGQyA+IDApCnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLnBsdXMsICIwLTIwJSIsICIyMC00MCUiKSwgNSkKcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEucGx1cywgIjIwLTQwJSIsICI0MC02MCUiKSwgNSkKcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEucGx1cywgIjQwLTYwJSIsICI2MC04MCUiKSwgNSkKcHMzNCA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEucGx1cywgIjYwLTgwJSIsICI4MC0xMDAlIiksIDUpCgoKCnAgPC0gZ2dwbG90KGRhdGEucGx1cywgYWVzKHggPSBlbmhEZW5zaXR5R3JvdXAsIHkgPSBhdmdMb2cyRkMpKSArIAogIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZW5oRGVuc2l0eUdyb3VwKSwKICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkrIAogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArCiAgbGFicyh4ID0gIkVuaGFuY2VyIGRlbnNpdHkgZ3JvdXAiICwgeSA9ICJhdmcgbG9nMihmb2xkIGNoYW5nZSkiKSArCiAgc3RhdF9zdW1tYXJ5KAogICAgYWVzKGdyb3VwID0gZW5oRGVuc2l0eUdyb3VwKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMSwKICAgIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siCiAgKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0Q5RDlEOSIsICIjQkZCRkJGIiwgIiNBNkE2QTYiLCAiIzhDOEM4QyIsICIjNzM3MzczIikpICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkrIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxLjUpKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDEsIGxhYmVsID0gcGFzdGUwKCJwczAxOiAiLCBjb252UHZhbHVlKHBzMDEpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMxMjogIiwgY29udlB2YWx1ZShwczEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjM6ICIsIGNvbnZQdmFsdWUocHMyMyksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczM0OiAiLCBjb252UHZhbHVlKHBzMzQpLCAiXG4iKSwgCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAyKQoKCmZpbGVOYW1lIDwtIHBhc3RlMCgidGFkR3JvdXBfZW5oRGVuc2l0eV9hdmdMb2cyRkNfdXAiKQp3aWR0aCA8LSBwYW5lbFNpemUoMS4xNSkqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjA3KSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKCiMjIyMgRE9XTgpkYXRhLm1pbnVzIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoYXZnTG9nMkZDIDwgMCkKcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEubWludXMsICIwLTIwJSIsICIyMC00MCUiKSwgNSkKcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEubWludXMsICIyMC00MCUiLCAiNDAtNjAlIiksIDUpCnBzMjMgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLm1pbnVzLCAiNDAtNjAlIiwgIjYwLTgwJSIpLCA1KQpwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5taW51cywgIjYwLTgwJSIsICI4MC0xMDAlIiksIDUpCgoKcCA8LSBnZ3Bsb3QoZGF0YS5taW51cywgYWVzKHggPSBlbmhEZW5zaXR5R3JvdXAsIHkgPSBhdmdMb2cyRkMpKSArIAogIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZW5oRGVuc2l0eUdyb3VwKSwKICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkrIAogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArCiAgbGFicyh4ID0gIkVuaGFuY2VyIGRlbnNpdHkgZ3JvdXAiICwgeSA9ICJhdmcgbG9nMihmb2xkIGNoYW5nZSkiKSArCiAgc3RhdF9zdW1tYXJ5KAogICAgYWVzKGdyb3VwID0gZW5oRGVuc2l0eUdyb3VwKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMSwKICAgIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siCiAgKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0Q5RDlEOSIsICIjQkZCRkJGIiwgIiNBNkE2QTYiLCAiIzhDOEM4QyIsICIjNzM3MzczIikpICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkrIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMS41LCAwKSkrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IC0xLCBsYWJlbCA9IHBhc3RlMCgicHMwMTogIiwgY29udlB2YWx1ZShwczAxKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTI6ICIsIGNvbnZQdmFsdWUocHMxMiksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczIzOiAiLCBjb252UHZhbHVlKHBzMjMpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMzNDogIiwgY29udlB2YWx1ZShwczM0KSwgIlxuIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMikKCmZpbGVOYW1lIDwtIHBhc3RlMCgidGFkR3JvdXBfZW5oRGVuc2l0eV9hdmdMb2cyRkNfZG93biIpCndpZHRoIDwtIHBhbmVsU2l6ZSgxLjE3NSkqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjA3KSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKCgojIyMgUGxvdHRpbmcgZGlzdHJpYnV0aW9uIC0gZ2VuZQojIyMjIEFMTAojIHlsaW0gPC0gbWF4KGFicyhxdWFudGlsZShkYXRhJGF2Z0xvZzJGQywgMC4wMSkpLCBhYnMocXVhbnRpbGUoZGF0YSRhdmdMb2cyRkMsIDAuOTkpKSkKIyBwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdlbmVEZW5zaXR5R3JvdXAsIHkgPSBhdmdMb2cyRkMpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ2VuZURlbnNpdHlHcm91cCkpKyAKIyAgIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4xKSArIHRoZW1lX2NsYXNzaWMoKSArCiMgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLXlsaW0sIHlsaW0pKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiMgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZDlkOWQ5IiwgIiNiZGJkYmQiLCAiIzk2OTY5NiIsICIjNzM3MzczIiwgIiM1MjUyNTIiKSkKIyAKIyBmaWxlTmFtZSA8LSBwYXN0ZTAoInRhZEdyb3VwX2dlbmVEZW5zaXR5X2F2Z0xvZzJGQyIpCiMgaGVpZ2h0IDwtIDMKIyB3aWR0aCA8LSAzCiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiMgcHJpbnQocCkKIyBkZXYub2ZmKCkKIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQojIHByaW50KHApCiMgZGV2Lm9mZigpCiBnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZURlbnNpdHlHcm91cCA9PWdyb3VwMSkgKSRhdmdMb2cyRkMKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZURlbnNpdHlHcm91cCA9PWdyb3VwMikgKSRhdmdMb2cyRkMKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9CgoKZGF0YS5wbHVzIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoYXZnTG9nMkZDID4gMCkKcHMwMSA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEucGx1cywgIjAtMjAlIiwgIjIwLTQwJSIpLCA1KQpwczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5wbHVzLCAiMjAtNDAlIiwgIjQwLTYwJSIpLCA1KQpwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5wbHVzLCAiNDAtNjAlIiwgIjYwLTgwJSIpLCA1KQpwczM0IDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5wbHVzLCAiNjAtODAlIiwgIjgwLTEwMCUiKSwgNSkKCgoKcCA8LSBnZ3Bsb3QoZGF0YS5wbHVzLCBhZXMoeCA9IGdlbmVEZW5zaXR5R3JvdXAsIHkgPSBhdmdMb2cyRkMpKSArIAogIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ2VuZURlbnNpdHlHcm91cCksCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpKyAKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgKwogIGxhYnMoeCA9ICJHZW5lIGRlbnNpdHkgZ3JvdXAiICwgeSA9ICJhdmcgbG9nMihmb2xkIGNoYW5nZSkiKSArCiAgc3RhdF9zdW1tYXJ5KAogICAgYWVzKGdyb3VwID0gZ2VuZURlbnNpdHlHcm91cCksIGZ1biA9IG1lYW4sCiAgICBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsCiAgICBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIgogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNEOUQ5RDkiLCAiI0JGQkZCRiIsICIjQTZBNkE2IiwgIiM4QzhDOEMiLCAiIzczNzM3MyIpKSArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMQogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMS41KSkgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAxLCBsYWJlbCA9IHBhc3RlMCgicHMwMTogIiwgY29udlB2YWx1ZShwczAxKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTI6ICIsIGNvbnZQdmFsdWUocHMxMiksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczIzOiAiLCBjb252UHZhbHVlKHBzMjMpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMzNDogIiwgY29udlB2YWx1ZShwczM0KSwgIlxuIiksIAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMikKCgpmaWxlTmFtZSA8LSBwYXN0ZTAoInRhZEdyb3VwX2dlbmVEZW5zaXR5X2F2Z0xvZzJGQ191cCIpCndpZHRoIDwtIHBhbmVsU2l6ZSgxLjE1KSptbVRvSW5jaApoZWlnaHQgPC0gcGFuZWxTaXplKDEuMDcpKm1tVG9JbmNoCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKIyMjIyBET1dOCmRhdGEubWludXMgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihhdmdMb2cyRkMgPCAwKQpwczAxIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5taW51cywgIjAtMjAlIiwgIjIwLTQwJSIpLCA1KQpwczEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3goZGF0YS5taW51cywgIjIwLTQwJSIsICI0MC02MCUiKSwgNSkKcHMyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KGRhdGEubWludXMsICI0MC02MCUiLCAiNjAtODAlIiksIDUpCnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveChkYXRhLm1pbnVzLCAiNjAtODAlIiwgIjgwLTEwMCUiKSwgNSkKCgpwIDwtIGdncGxvdChkYXRhLm1pbnVzLCBhZXMoeCA9IGdlbmVEZW5zaXR5R3JvdXAsIHkgPSBhdmdMb2cyRkMpKSArIAogIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ2VuZURlbnNpdHlHcm91cCksCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpKyAKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCkgKwogIGxhYnMoeCA9ICJHZW5lIGRlbnNpdHkgZ3JvdXAiICwgeSA9ICJhdmcgbG9nMihmb2xkIGNoYW5nZSkiKSArCiAgc3RhdF9zdW1tYXJ5KAogICAgYWVzKGdyb3VwID0gZ2VuZURlbnNpdHlHcm91cCksIGZ1biA9IG1lYW4sCiAgICBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsCiAgICBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIgogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNEOUQ5RDkiLCAiI0JGQkZCRiIsICIjQTZBNkE2IiwgIiM4QzhDOEMiLCAiIzczNzM3MyIpKSArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMQogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEuNSwgMCkpKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAtMSwgbGFiZWwgPSBwYXN0ZTAoInBzMDE6ICIsIGNvbnZQdmFsdWUocHMwMSksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczEyOiAiLCBjb252UHZhbHVlKHBzMTIpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMyMzogIiwgY29udlB2YWx1ZShwczIzKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMzQ6ICIsIGNvbnZQdmFsdWUocHMzNCksICJcbiIpLCAKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDIpCgpmaWxlTmFtZSA8LSBwYXN0ZTAoInRhZEdyb3VwX2dlbmVEZW5zaXR5X2F2Z0xvZzJGQ19kb3duIikKd2lkdGggPC0gcGFuZWxTaXplKDEuMTc1KSptbVRvSW5jaApoZWlnaHQgPC0gcGFuZWxTaXplKDEuMDcpKm1tVG9JbmNoCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKIyMjIENERiBwbG90Cgprc19yZXN1bHQgPC0ga3MudGVzdCgKICBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVEZW5zaXR5R3JvdXAgPT0gIjAtMjAlIikgJT4lIHB1bGwoYWJzQXZnTG9nMkZDKSwKICBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVEZW5zaXR5R3JvdXAgPT0gIjIwLTQwJSIpICU+JSBwdWxsKGFic0F2Z0xvZzJGQykKKQoKCnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gYWJzQXZnTG9nMkZDLCBjb2xvciA9IGdlbmVEZW5zaXR5R3JvdXApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJldihjKCIjNzc3Nzc3IiwgIiM4QjdFNjUiLCAiI0EyODQ1MiIsICIjQzI4ODREIiwgIiNGMjhFMkMiKSkpICsKICBzdGF0X2VjZGYoc2l6ZSA9IDAuNCwgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiICkgKyAjIFVzZSBzdGF0X2VjZGYgdG8gcGxvdCB0aGUgZW1waXJpY2FsIENERgogIGxhYnMoCiAgICB4ID0gIkFicy4gbG9nMihmb2xkIGNoYW5nZSkiLAogICAgeSA9ICJDdW11bGF0aXZlIFByb2JhYmlsaXR5IgogICkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMS41KSkgKwogIHRoZW1lX2NsYXNzaWMoKSArICMgQ2xlYW4gdGhlbWUKICB0aGVtZSgKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgICkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMC4xKSkKCgpmaWxlTmFtZSA8LSBwYXN0ZTAoInRhZEdyb3VwX2dlbmVEZW5zaXR5X2F2Z0xvZzJGQ19jZGYiKQp3aWR0aCA8LSAzMyptbVRvSW5jaApoZWlnaHQgPC0zMyptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKZGF0YSA8LSBkYXRhLm1pbnVzCgpncm91cDFfZGF0YSA8LSBkYXRhJGFic0F2Z0xvZzJGQ1tkYXRhJGdlbmVEZW5zaXR5R3JvdXAgPT0gIjAtMjAlIl0KZ3JvdXAyX2RhdGEgPC0gZGF0YSRhYnNBdmdMb2cyRkNbZGF0YSRnZW5lRGVuc2l0eUdyb3VwID09ICIyMC00MCUiXQprcy50ZXN0KGdyb3VwMV9kYXRhLCBncm91cDJfZGF0YSkKCmdyb3VwMV9kYXRhIDwtIGRhdGEkYWJzQXZnTG9nMkZDW2RhdGEkZ2VuZURlbnNpdHlHcm91cCA9PSAiMjAtNDAlIl0KZ3JvdXAyX2RhdGEgPC0gZGF0YSRhYnNBdmdMb2cyRkNbZGF0YSRnZW5lRGVuc2l0eUdyb3VwID09ICI0MC02MCUiXQprcy50ZXN0KGdyb3VwMV9kYXRhLCBncm91cDJfZGF0YSkKCmdyb3VwMV9kYXRhIDwtIGRhdGEkYWJzQXZnTG9nMkZDW2RhdGEkZ2VuZURlbnNpdHlHcm91cCA9PSAiNDAtNjAlIl0KZ3JvdXAyX2RhdGEgPC0gZGF0YSRhYnNBdmdMb2cyRkNbZGF0YSRnZW5lRGVuc2l0eUdyb3VwID09ICI2MC04MCUiXQprcy50ZXN0KGdyb3VwMV9kYXRhLCBncm91cDJfZGF0YSkKCmdyb3VwMV9kYXRhIDwtIGRhdGEkYWJzQXZnTG9nMkZDW2RhdGEkZ2VuZURlbnNpdHlHcm91cCA9PSAiNjAtODAlIl0KZ3JvdXAyX2RhdGEgPC0gZGF0YSRhYnNBdmdMb2cyRkNbZGF0YSRnZW5lRGVuc2l0eUdyb3VwID09ICI4MC0xMDAlIl0Ka3MudGVzdChncm91cDFfZGF0YSwgZ3JvdXAyX2RhdGEpCgoKYGBgCgoKIyMgWzIuMThdIENvbXBhcmluZyBUQUQgaW5zdWxhdGlvbiBzY29yZSBhY3Jvc3Mgc2FtcGxlcwpDaGVja2luZyBob3cgaW5zdWxhdGlvbiBzY29yZSBjaGFuZ2VzIGJ5IHRyZWF0bWVudCBhdCBETVNPIFRBRCBib3VuZGFyaWVzCmBgYHtyfQpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5Igpjb25zZW5zdXMubG9vcC5hbm5vLnRiIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIi50c3YiKSkpCgojIEltcG9ydCBpbnN1bGF0aW9uIHNjb3JlIGNhbGN1bGF0ZWQgd2l0aCBweXRob24KcmVzdWx0RGlyIDwtIGhlcmUoIi4uLy4uL3Jlc3VsdCIpCmluc1Njb3JlLkRNU08gPC0gZnJlYWQoaGVyZShyZXN1bHREaXIsICJUQUQiLCAiaW5zdWxhdGlvblNjb3JlXzI1a2JfRzFETVNPLnRzdiIpKSAlPiUgCiAgZHBseXI6OnNlbGVjdChjKCJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAibG9nMl9pbnN1bGF0aW9uX3Njb3JlXzEyNTAwMCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGJpbklEID0gcGFzdGUoY2hyb20sIHN0YXJ0LCBlbmQsIHNlcCA9ICJfIikpCmNvbG5hbWVzKGluc1Njb3JlLkRNU08pIDwtIGMoImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJpbnN1bGF0aW9uU2NvcmUiLCAiYmluSUQiKQppbnNTY29yZS5kVEFHIDwtIGZyZWFkKGhlcmUocmVzdWx0RGlyLCAiVEFEIiwgImluc3VsYXRpb25TY29yZV8yNWtiX0cxZFRBRy50c3YiKSkgJT4lIAogIGRwbHlyOjpzZWxlY3QoYygiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgImxvZzJfaW5zdWxhdGlvbl9zY29yZV8xMjUwMDAiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShiaW5JRCA9IHBhc3RlKGNocm9tLCBzdGFydCwgZW5kLCBzZXAgPSAiXyIpKQpjb2xuYW1lcyhpbnNTY29yZS5kVEFHKSA8LSBjKCJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAiaW5zdWxhdGlvblNjb3JlIiwgImJpbklEIikKaW5zU2NvcmUuQTQ4NSA8LSBmcmVhZChoZXJlKHJlc3VsdERpciwgIlRBRCIsICJpbnN1bGF0aW9uU2NvcmVfMjVrYl9HMUE0ODUudHN2IikpICU+JSAKICBkcGx5cjo6c2VsZWN0KGMoImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJsb2cyX2luc3VsYXRpb25fc2NvcmVfMTI1MDAwIikpICU+JQogIGRwbHlyOjptdXRhdGUoYmluSUQgPSBwYXN0ZShjaHJvbSwgc3RhcnQsIGVuZCwgc2VwID0gIl8iKSkKY29sbmFtZXMoaW5zU2NvcmUuQTQ4NSkgPC0gYygiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgImluc3VsYXRpb25TY29yZSIsICJiaW5JRCIpCgpnZXRJbnN1bGF0aW9uU2NvcmUgPC0gZnVuY3Rpb24oY2hyLCBjb29yZGluYXRlLCBpbnNTY29yZS50Yil7CiAgdGVtcC50YiA8LSBpbnNTY29yZS50YiAlPiUgZHBseXI6OmZpbHRlcihjaHJvbSA9PSBjaHIsIHN0YXJ0IDwgY29vcmRpbmF0ZSwgZW5kID4gY29vcmRpbmF0ZSkKICBvdXQgPC0gdGVtcC50YiRpbnN1bGF0aW9uU2NvcmUKICBpZihsZW5ndGgob3V0KSA8IDEpewogICAgcmV0dXJuKE5BKQogIH1lbHNlewogICAgcmV0dXJuKHRlbXAudGIkaW5zdWxhdGlvblNjb3JlKQogIH0KfQoKIyBJbXBvcnRpbmcgVEFEIGJvdW5kYXJpZXMKdGFkX2JvdW5kYXJ5IDwtIGZyZWFkKGhlcmUoIi4uLy4uL3Jlc3VsdC9UQUQiLCAiVEFEXzI1a2JfMTI1a2Jfb3RzdV9ib3VuZGFyaWVzX0cxRE1TTy5iZWQiKSkKY29sbmFtZXModGFkX2JvdW5kYXJ5KSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKdGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgcm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUodGFkX2lkID0gcGFzdGUoY2hyLCBzdGFydCwgZW5kLCBzZXAgPSAiXyIpLAogICAgICAgICAgICAgICAgY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yLAogICAgICAgICAgICAgICAgaW5zU2NvcmVfRE1TTyA9IGdldEluc3VsYXRpb25TY29yZShjaHIsIGNlbnRlciwgaW5zU2NvcmUuRE1TTyksCiAgICAgICAgICAgICAgICBpbnNTY29yZV9kVEFHID0gZ2V0SW5zdWxhdGlvblNjb3JlKGNociwgY2VudGVyLCBpbnNTY29yZS5kVEFHKSwKICAgICAgICAgICAgICAgIGluc1Njb3JlX0E0ODUgPSBnZXRJbnN1bGF0aW9uU2NvcmUoY2hyLCBjZW50ZXIsIGluc1Njb3JlLkE0ODUpKQoKdGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZmlsdGVyKCFpZl9hbnkoZXZlcnl0aGluZygpLCBpcy5uYSkpCgp0YWRfYm91bmRhcnkkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0YWRfYm91bmRhcnkkaW5zU2NvcmVfRE1TTywgdGFkX2JvdW5kYXJ5JGluc1Njb3JlX2RUQUcsIG4gPSAxMDApCnRhZF9ib3VuZGFyeSA8LSB0YWRfYm91bmRhcnkgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmdncGxvdCh0YWRfYm91bmRhcnksIGFlcyh4ID0gaW5zU2NvcmVfRE1TTywgeSA9IGluc1Njb3JlX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsgCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArIGNvb3JkX2ZpeGVkKCkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKyB0aGVtZV9idygpCgoKCnRhZF9ib3VuZGFyeSRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRhZF9ib3VuZGFyeSRpbnNTY29yZV9ETVNPLCB0YWRfYm91bmRhcnkkaW5zU2NvcmVfQTQ4NSwgbiA9IDEwMCkKdGFkX2JvdW5kYXJ5IDwtIHRhZF9ib3VuZGFyeSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZ2dwbG90KHRhZF9ib3VuZGFyeSwgYWVzKHggPSBpbnNTY29yZV9ETVNPLCB5ID0gaW5zU2NvcmVfQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsgY29vcmRfZml4ZWQoKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArIHRoZW1lX2J3KCkKCgoKCmBgYAoKCiMjIFsyLjIwXSBDaGVja2luZyBob3cgbWFueSBsb29wcyBjcm9zcyB0aGUgYm91bmRhcnk/ClByZXZpb3VzbHksIEkgdHJpZWQgdG8gY2hlY2sgdGhlIHBlcmNlbnRhZ2Ugb2YgbG9vcHMgY3Jvc3NpbmcgdGhlIGJvdW5kYXJ5IHBlciBncm91cCB3aGljaCB3YXNuJ3QgZnJ1aXRmdWwuClRoaXMgdGltZSwgdHJ5IHRvIGRvIHRoaXMgb24gdGhlIGRpZmZlcmVudGlhbCBsb29wcy4KIyMjIyBkVEFHCmBgYHtyfQojIyMgSW1wb3J0aW5nIGRpZmZlcmVudGlhbCByZWd1bGF0b3J5IGxvb3BzCgpsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShncm91cCA9ICJVUC9OTyIpCmNvbG5hbWVzKGxvb3AudXApIDwtIGMoImNocjEiLCAic3RhcnQxIiwgImVuZDEiLCAiY2hyMiIsICJzdGFydDIiLCAiZW5kMiIsICJncm91cCIpCmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gIlVQL05PIikKY29sbmFtZXMobG9vcC5ubykgPC0gYygiY2hyMSIsICJzdGFydDEiLCAiZW5kMSIsICJjaHIyIiwgInN0YXJ0MiIsICJlbmQyIiwgImdyb3VwIikKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gIkRPV04iKQpjb2xuYW1lcyhsb29wLmRvd24pIDwtIGMoImNocjEiLCAic3RhcnQxIiwgImVuZDEiLCAiY2hyMiIsICJzdGFydDIiLCAiZW5kMiIsICJncm91cCIpCgpsb29wcyA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pLCBsb29wLmRvd24pCgojIyMgSW1wb3J0aW5nIFRBRCBib3VuZGFyeQp0YWRfYm91bmRhcnkgPC0gZnJlYWQoaGVyZSgiLi4vLi4vcmVzdWx0L1RBRCIsICJUQURfMjVrYl8xMjVrYl9vdHN1X2JvdW5kYXJpZXNfRzFETVNPLmJlZCIpKQpjb2xuYW1lcyh0YWRfYm91bmRhcnkpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQp0YWRfYm91bmRhcnkgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6bXV0YXRlKHRhZF9pZCA9IHBhc3RlKGNociwgc3RhcnQsIGVuZCwgc2VwID0gIl8iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0IC0xNzUwMDAvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBlbmQgKyAxNzUwMDAvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSAoc3RhcnQgKyBlbmQpLzIpCiMjIyBGdW5jdGlvbnMKY2hlY2tCb3VuZGFyeUNyb3NzIDwtIGZ1bmN0aW9uKGNocm9tMSwgc3RhcnQxLCBlbmQyLCB0YWRfYm91bmRhcnkpewogIHRlbXAgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA+IHN0YXJ0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyIDwgZW5kMikKICByZXR1cm4obGVuZ3RoKHRlbXAkY2VudGVyKSkKfQoKIyMjIENoZWNrIG92ZXJsYXAKbG9vcHMgPC0gbG9vcHMgJT4lIHJvd3dpc2UoKSAlPiUKICBkcGx5cjo6bXV0YXRlKGJvdW5kYXJ5Q3Jvc3MgPSBjaGVja0JvdW5kYXJ5Q3Jvc3MoY2hyMSwgc3RhcnQxLCBlbmQyLCB0YWRfYm91bmRhcnkpKQoKIyMjIFBsb3R0aW5nCnN1bW1hcnlfZGF0YSA8LSBsb29wcyAlPiUKICBncm91cF9ieShncm91cCkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnRhZ2UgPSBtZWFuKGJvdW5kYXJ5Q3Jvc3MgPiAwKSAqIDEwMCkKCnN1bW1hcnlfZGF0YSRncm91cCA8LSBmYWN0b3Ioc3VtbWFyeV9kYXRhJGdyb3VwLCBsZXZlbHMgPSBjKCJVUC9OTyIsICJET1dOIikpCgpwIDwtIGdncGxvdChzdW1tYXJ5X2RhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBwZXJjZW50YWdlKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gZGFya2VuKHN0cm9uZ19ncmVlbiwgYW1vdW50ID0gMC4yKSkgKwogIGxhYnMoeSA9ICIlIG9mIGxvb3BzIGNyb3NzaW5nIFRBRCBib3VuZGFyeSIsIHggPSBOVUxMKSArCiAgdGhlbWVfY2xhc3NpYygpICsgeWxpbSgwLCAxMDApICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzCiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uCiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvbgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICkKCmZpbGVOYW1lIDwtIHBhc3RlMCgiYm91bmRhcnlDcm9zc1JhdGlvIikKd2lkdGggPC0gcGFuZWxTaXplKDEpKm1tVG9JbmNoCmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMgQTQ4NQpgYGB7cn0KIyMjIEltcG9ydGluZyBkaWZmZXJlbnRpYWwgcmVndWxhdG9yeSBsb29wcwpsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShncm91cCA9ICJ1cCIpCmNvbG5hbWVzKGxvb3AudXApIDwtIGMoImNocjEiLCAic3RhcnQxIiwgImVuZDEiLCAiY2hyMiIsICJzdGFydDIiLCAiZW5kMiIsICJncm91cCIpCmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gIm5vIikKY29sbmFtZXMobG9vcC5ubykgPC0gYygiY2hyMSIsICJzdGFydDEiLCAiZW5kMSIsICJjaHIyIiwgInN0YXJ0MiIsICJlbmQyIiwgImdyb3VwIikKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gImRvd24iKQpjb2xuYW1lcyhsb29wLmRvd24pIDwtIGMoImNocjEiLCAic3RhcnQxIiwgImVuZDEiLCAiY2hyMiIsICJzdGFydDIiLCAiZW5kMiIsICJncm91cCIpCgpsb29wcyA8LSBiaW5kX3Jvd3MoYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pLCBsb29wLmRvd24pCgojIyMgSW1wb3J0aW5nIFRBRCBib3VuZGFyeQp0YWRfYm91bmRhcnkgPC0gZnJlYWQoaGVyZSgiLi4vLi4vcmVzdWx0L1RBRCIsICJUQURfMjVrYl8xMjVrYl9vdHN1X2JvdW5kYXJpZXNfRzFETVNPLmJlZCIpKQpjb2xuYW1lcyh0YWRfYm91bmRhcnkpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQp0YWRfYm91bmRhcnkgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6bXV0YXRlKHRhZF9pZCA9IHBhc3RlKGNociwgc3RhcnQsIGVuZCwgc2VwID0gIl8iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0IC0xNzUwMDAvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBlbmQgKyAxNzUwMDAvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSAoc3RhcnQgKyBlbmQpLzIpCiMjIyBGdW5jdGlvbnMKY2hlY2tCb3VuZGFyeUNyb3NzIDwtIGZ1bmN0aW9uKGNocm9tMSwgc3RhcnQxLCBlbmQyLCB0YWRfYm91bmRhcnkpewogIHRlbXAgPC0gdGFkX2JvdW5kYXJ5ICU+JSBkcGx5cjo6ZmlsdGVyKGNociA9PSBjaHJvbTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA+IHN0YXJ0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyIDwgZW5kMikKICByZXR1cm4obGVuZ3RoKHRlbXAkY2VudGVyKSkKfQoKIyMjIENoZWNrIG92ZXJsYXAKbG9vcHMgPC0gbG9vcHMgJT4lIHJvd3dpc2UoKSAlPiUKICBkcGx5cjo6bXV0YXRlKGJvdW5kYXJ5Q3Jvc3MgPSBjaGVja0JvdW5kYXJ5Q3Jvc3MoY2hyMSwgc3RhcnQxLCBlbmQyLCB0YWRfYm91bmRhcnkpKQoKIyMjIFBsb3R0aW5nCnN1bW1hcnlfZGF0YSA8LSBsb29wcyAlPiUKICBncm91cF9ieShncm91cCkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnRhZ2UgPSBtZWFuKGJvdW5kYXJ5Q3Jvc3MgPiAwKSAqIDEwMCkKCgpwIDwtIGdncGxvdChzdW1tYXJ5X2RhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBwZXJjZW50YWdlKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInNreWJsdWUiKSArCiAgbGFicyh0aXRsZSA9ICJQZXJjZW50YWdlIG9mIFJvd3Mgd2l0aCBib3VuZGFyeUNyb3NzID4gMCBwZXIgR3JvdXAiLAogICAgICAgeCA9ICJHcm91cCIsCiAgICAgICB5ID0gIlBlcmNlbnRhZ2UiKSArCiAgdGhlbWVfY2xhc3NpYygpICsgeWxpbSgwLCAxMDApCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImJvdW5kYXJ5Q3Jvc3NSYXRpb19BNDg1IikKaGVpZ2h0IDwtIDMKd2lkdGggPC0gMwpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCgojIyBbMi4yMV0gTE9MQSBvbiBkaWZmZXJlbnRpYWwgbG9vcCBhbmNob3JzCiMjIyMjIExPQURJTkcgTE9MQQpgYGB7cn0KIyBMT0FESU5HIExPTEEgREIKbGlicmFyeSgic2ltcGxlQ2FjaGUiKQpsaWJyYXJ5KCJMT0xBIikKbG9sYURCID0gbG9hZFJlZ2lvbkRCKCIvVm9sdW1lcy9VS0pJTl9TU0QvR2Vub21pY3NfMDNfQW5hbHlzaXNfV29ya2luZy9yZWZlcmVuY2UvTE9MQUNvcmVfY2FjaGVkL21tMTAiKQoKIyBGVU5DVElPTlMKZXh0cmFjdEFuY2hvciA8LSBmdW5jdGlvbihsb29wKXsKICBhbmNob3IxIDwtIGxvb3AgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSkKICBjb2xuYW1lcyhhbmNob3IxKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKICBhbmNob3IyIDwtIGxvb3AgJT4lIGRwbHlyOjpzZWxlY3QoYyg0LCA1LCA2KSkKICBjb2xuYW1lcyhhbmNob3IyKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKICBhbmNob3JzIDwtIHJlZHVjZShtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYmluZF9yb3dzKGFuY2hvcjEsIGFuY2hvcjIpKSkKICAgIHJldHVybihhbmNob3JzKQp9CgpgYGAKIyMjIyBkVEFHLCBDb21wYXJpbmcgdG8gQXN5bmMKIyMjIyMgLSBMaW1pdGVkIHRvIEFUQUMtc2VxIHNpZ25hbCwgcmVnIGxvb3AgYmFja2dyb3VwZApgYGB7cn0KYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgIkdTTTMxMDYyNTdfQVRBQ19FU0NfMS5iZWQiKSkgJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMykKY29sbmFtZXMoYXRhYykgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCmF0YWMuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGF0YWMpCgojIExPQURJTkcgTE9PUFMKIyMjIEltcG9ydGluZyBkaWZmZXJlbnRpYWwgcmVndWxhdG9yeSBsb29wcyAmIGV4dHJhY3QgYW5jaG9yCmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3YiKSkgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpKQphbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5hbGwsIGF0YWMuZ3IpCmFuY2hvci5hbGwgPC0gcGludGVyc2VjdChhbmNob3IuYWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgoKCmxvb3AuMSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX2JvdGhSZXRhaW5lZC5iZWRwZSIpKQphbmNob3IuMSA8LSAoZXh0cmFjdEFuY2hvcihsb29wLjEpKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLjEsIGF0YWMuZ3IpCmFuY2hvci4xIDwtIHBpbnRlcnNlY3QoYW5jaG9yLjFbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCmxvb3AuMiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX0FzeW5jU3BlY2lmaWNQZXJ0LmJlZHBlIikpCmFuY2hvci4yIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuMikpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuMiwgYXRhYy5ncikKYW5jaG9yLjIgPC0gcGludGVyc2VjdChhbmNob3IuMltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKbG9vcC4zIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9HMXZzQXN5bmNfRzFTcGVjaWZpY1BlcnQuYmVkcGUiKSkKYW5jaG9yLjMgPC0gKGV4dHJhY3RBbmNob3IobG9vcC4zKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci4zLCBhdGFjLmdyKQphbmNob3IuMyA8LSBwaW50ZXJzZWN0KGFuY2hvci4zW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgpsb29wLjQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19ib3RoUGVydC5iZWRwZSIpKQphbmNob3IuNCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLjQpKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLjQsIGF0YWMuZ3IpCmFuY2hvci40IDwtIHBpbnRlcnNlY3QoYW5jaG9yLjRbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCgphbmNob3JzIDwtIGxpc3QoYW5jaG9yLjEsIGFuY2hvci4yLCBhbmNob3IuMywgYW5jaG9yLjQpCnRicyA8LSBsaXN0KCkKdGVtcHMgPC0gbGlzdCgpCgojIFByb2Nlc3MgY2x1c3RlcnMgYzEgdG8gYzgKZm9yIChpIGluIDE6NCkgewogIAogIGFuY2hvciA8LSBhbmNob3JzW1tpXV0KICAjIFJ1biBMT0xBCiAgcmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLCBhbmNob3IuYWxsLCBsb2xhREIpCiAgdGIgPC0gYXNfdGliYmxlKHJlc3VsdCkKICAKICAjIEZpbHRlciBhbmQgc3VtbWFyaXplCiAgdGIgPC0gdGIgJT4lCiAgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiUKICAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUKICAgIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQogIAogICMgU3RvcmUgdGIKICB0YnNbW2ldXSA8LSB0YgogIAogICMgU2VsZWN0IGFuZCByZW5hbWUgb2Rkc1JhdGlvCiAgdGVtcCA8LSB0YiAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbykKICBjb2xuYW1lcyh0ZW1wKSA8LSBjKCJ0YXJnZXQiLCBwYXN0ZTAoIk9SX2MiLCBpKSkKICAKICAjIFN0b3JlIHRlbXAKICB0ZW1wc1tbaV1dIDwtIHRlbXAKfQoKIyBNZXJnZSBhbGwgdGVtcCB0YWJsZXMgaW50byBvbmUKdGVtcCA8LSBSZWR1Y2UoZnVuY3Rpb24oeCwgeSkgZnVsbF9qb2luKHgsIHksIGJ5ID0gInRhcmdldCIpLCB0ZW1wcykgJT4lCiAgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSkKY29sbmFtZXModGVtcCkgPC0gYygidGFyZ2V0IiwgImJvdGhSZXRhaW5lZCIsICJBc3luY1NwZWNpZmljUGVydHVyYiIsICJHMVNwZWNpZmljUGVydHVyYiIsICJib3RoUGVydHVyYiIpCmRhdGEgPC0gdGVtcCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKCJ0YXJnZXQiKSAlPiUgYXMubWF0cml4KCkKCmxpYnJhcnkoY2lyY2xpemUpCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDEsIG1heChkYXRhKSksIGMoIndoaXRlIiwgInJlZCIpKQoKCiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSAid3NzIikKCnAgPC0gSGVhdG1hcCgKICBkYXRhLAogIG5hbWUgPSAiT2RkcyBSYXRpbyIsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmQKICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbQogIHNob3dfcm93X2RlbmQgPSBGQUxTRSwKICBjb2wgPSBjb2xfZnVuLAogIGJvcmRlciA9IFRSVUUKKQoKCgpgYGAKCiMjIyMgZFRBRwojIyMjIyAtIExpbWl0aW5nIHRvIEFUQUMtc2VxIHNpZ25hbCwgcmVnIGxvb3AgYmFja2dyb3VuZApgYGB7cn0KYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgIkdTTTMxMDYyNTdfQVRBQ19FU0NfMS5iZWQiKSkgJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMykKY29sbmFtZXMoYXRhYykgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCmF0YWMuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGF0YWMpCgojIExPQURJTkcgTE9PUFMKIyMjIEltcG9ydGluZyBkaWZmZXJlbnRpYWwgcmVndWxhdG9yeSBsb29wcyAmIGV4dHJhY3QgYW5jaG9yCmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3YiKSkgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpKQphbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5hbGwsIGF0YWMuZ3IpCmFuY2hvci5hbGwgPC0gcGludGVyc2VjdChhbmNob3IuYWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgoKbG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlIikpCmFuY2hvci51cCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cCwgYXRhYy5ncikKYW5jaG9yLnVwIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgpsb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGUiKSkKYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vLCBhdGFjLmdyKQphbmNob3Iubm8gPC0gcGludGVyc2VjdChhbmNob3Iubm9bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCmxvb3AudXBubyA8LSBiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykKYW5jaG9yLnVwbm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cG5vKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cG5vLCBhdGFjLmdyKQphbmNob3IudXBubyA8LSBwaW50ZXJzZWN0KGFuY2hvci51cG5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgpsb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlIikpCmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgYXRhYy5ncikKYW5jaG9yLmRvd24gPC0gcGludGVyc2VjdChhbmNob3IuZG93bltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKCgpgYGAKCgpgYGB7cn0KIyBSVU5OSU5HIExPTEEKbG9sYURpciA8LSBoZXJlKCIuLi8uLi9yZXN1bHQvbG9sYSIpCmRpci5jcmVhdGUobG9sYURpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpCgojIFVQCnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLnVwLCBhbmNob3IuYWxsLCBsb2xhREIpCnRiID0gYXNfdGliYmxlKHJlc3VsdCkKZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3VwX2F0YWMudHN2IiksIHNlcCA9ICJcdCIpCgojIE5PCnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLm5vLCBhbmNob3IuYWxsLCBsb2xhREIpCnRiID0gYXNfdGliYmxlKHJlc3VsdCkKZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2F0YWMudHN2IiksIHNlcCA9ICJcdCIpCgojIFVQTk8KcmVzdWx0ID0gcnVuTE9MQShhbmNob3IudXBubywgYW5jaG9yLmFsbCwgbG9sYURCKQp0YiA9IGFzX3RpYmJsZShyZXN1bHQpCmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCAiTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl91cG5vX2F0YWMudHN2IiksIHNlcCA9ICJcdCIpCgojIERPV04KcmVzdWx0ID0gcnVuTE9MQShhbmNob3IuZG93biwgYW5jaG9yLmFsbCwgbG9sYURCKQp0YiA9IGFzX3RpYmJsZShyZXN1bHQpCmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCAiTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWMudHN2IiksIHNlcCA9ICJcdCIpCgoKIyMjIEhFQVRNQVAKYWxwaGEgPC0gMC4wNQp0Yi51cCA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3VwX2F0YWMudHN2IikpICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCAiTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9ub19hdGFjLnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCnRiLmRvd24gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCAiTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWMudHN2IikpICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKCnRlbXAudXAgPC0gdGIudXAgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pCmNvbG5hbWVzKHRlbXAudXApIDwtIGMoInRhcmdldCIsICJPUl91cCIpCnRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pCmNvbG5hbWVzKHRlbXAubm8pIDwtIGMoInRhcmdldCIsICJPUl9ubyIpCnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLmRvd24pIDwtIGMoInRhcmdldCIsICJPUl9kb3duIikKCgp0ZW1wIDwtIGZ1bGxfam9pbihmdWxsX2pvaW4odGVtcC51cCwgdGVtcC5ubywgYnkgPSBjKCJ0YXJnZXQiKSksIHRlbXAuZG93biwgYnkgPSBjKCJ0YXJnZXQiKSkgJT4lIG11dGF0ZV9hbGwofnJlcGxhY2VfbmEoLiwgMSkpCgpkYXRhIDwtIGFzLm1hdHJpeCh0ZW1wWzI6NF0pCnJvd25hbWVzKGRhdGEpIDwtIHRlbXAkdGFyZ2V0CgpsaWJyYXJ5KGNpcmNsaXplKQpjb2xfZnVuIDwtIGNvbG9yUmFtcDIoYyhtaW4oZGF0YSksIG1heChkYXRhKSksIGMoIndoaXRlIiwgInJlZCIpKQoKCiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSAid3NzIikKCiMgcCA8LSBIZWF0bWFwKAojICAgZGF0YSwKIyAgIG5hbWUgPSAiT2RkcyBSYXRpbyIsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmQKIyAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtCiMgICByb3dfa20gPSA0LCAgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmluZSB0aGUgbnVtYmVyIG9mIGstbWVhbnMgY2x1c3RlcnMgZm9yIHJvd3MgKGFkanVzdCBhcyBuZWVkZWQpCiMgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsCiMgICBjb2wgPSBjb2xfZnVuICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSB0aGUgcmVkIGdyYWRpZW50IGNvbG9yIHNjYWxlCiMgKQojIAojIGZpbGVOYW1lIDwtIHBhc3RlMCgiYW5jaG9yTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9yZWdBbmNob3JCYWNrZ3JvdW5kX2F0YWMiKQojIGhlaWdodCA8LSA3CiMgd2lkdGggPC0gMy41CiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiMgcHJpbnQocCkKIyBkZXYub2ZmKCkKIyBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQojIHByaW50KHApCiMgZGV2Lm9mZigpCiMgCgoKIyMjIFZpc3VhbGl6aW5nIHAtdmFsdWUgYW5kIE9SCmFscGhhIDwtIDAuMDUKIyB0Yi51cCA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3VwX2F0YWMudHN2IikpICU+JQojICAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSwKIyAgICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSwKIyAgICAgICAgICAgICAgICAgZ3JvdXAgPSAiVVAiKSAlPiUKIyAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiMgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiMgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCiMgdGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCAiTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9ub19hdGFjLnRzdiIpKSAlPiUKIyAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksCiMgICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksCiMgICAgICAgICAgICAgICAgIGdyb3VwID0gIk5PIikgJT4lCiMgICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQojICAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQojICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQoKdGIudXBubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3Vwbm9fYXRhYy50c3YiKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSwKICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cxMChxVmFsdWUpLAogICAgICAgICAgICAgICAgZ3JvdXAgPSAiVVAvTk8iKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCmZ3cml0ZSh0Yi51cG5vICU+JSBkcGx5cjo6c2VsZWN0KGMoMjQsIDE2LCAyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAyNSwgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCA4LCA5LCAxMCwgMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDEzLCAxNCkpLCBoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3Vwbm9fYXRhY19wdWIudHN2IiksIHNlcCA9ICJcdCIpCgp0Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgIkxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfZG93bl9hdGFjLnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAogICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzEwKHFWYWx1ZSksCiAgICAgICAgICAgICAgICBncm91cCA9ICJET1dOIikgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQpmd3JpdGUodGIuZG93biAlPiUgZHBseXI6OnNlbGVjdChjKDI0LCAxNiwgMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMjUsIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgOCwgOSwgMTAsIDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCAxMywgMTQpKSwgaGVyZShsb2xhRGlyLCAiTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWNfcHViLnRzdiIpLCBzZXAgPSAiXHQiKQoKCnRlbXAudXBubyA8LSB0Yi51cG5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKQp0ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cCkKCnRlbXAgPC0gYmluZF9yb3dzKHRlbXAudXBubywgdGVtcC5kb3duKQoKIyBvcmRlciA8LSBjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJVUC9OTyIpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCwgCiMgICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiRE9XTiIpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCkKCiMgdGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYob3JkZXIpKQp0ZW1wJGdyb3VwIDwtIGZhY3Rvcih0ZW1wJGdyb3VwLCBsZXZlbHMgPSBjKCJVUC9OTyIsICJET1dOIikpCgp0YXJnZXRMaXN0IDwtIGMoIlBPTFIyQSIsICJDVFI5IiwKICAgICAgICAgICAgICAgICJBRkY0IiwgIkVMTDIiLAogICAgICAgICAgICAgICAgIk1FRDEiLCAiTUVEMTIiLAogICAgICAgICAgICAgICAgIlRCUCIsICJUQUYxIiwgIlRBRjMiLAogICAgICAgICAgICAgICAgIkUyRjEiLCAiWVkxIiwgIk5JUEJMIiwgCiAgICAgICAgICAgICAgICAiRVAzMDAiLCAiRFBZMzAiLCAiU0VUREIxIiwKICAgICAgICAgICAgICAgICJSQUQyMSIsICJTTUMxQSIsICJTTUMzIiwgIkNUQ0YiLAogICAgICAgICAgICAgICAgIlNVWjEyIiwgIlBIRjE5IgopCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcih0YXJnZXQgJWluJSB0YXJnZXRMaXN0KQp0ZW1wJHRhcmdldCA8LSBmYWN0b3IodGVtcCR0YXJnZXQsIGxldmVscyA9IHJldih0YXJnZXRMaXN0KSkKCgpxVmFsdWVMb2dNYXggPC0gNTAKdGVtcDIgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShxVmFsdWVMb2cgPSBtaW4ocVZhbHVlTG9nLCBxVmFsdWVMb2dNYXgpKQoKcCA8LSBnZ3Bsb3QodGVtcDIsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGZpbGwgPSBvZGRzUmF0aW8sIHNpemUgPSBxVmFsdWVMb2cpKSArCiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lCiAgICAgICAgICAgICBzdHJva2UgPSAxKnB0VG9NTSAgICAgICMgTGluZSB3aWR0aCBmb3IgdGhlIGJvcmRlcgogICkgKyB0aGVtZV9idygpICsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjUsIDIpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gIiNDQjMzM0EiLAogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLCAzKSwKICAgICAgICAgICAgICAgICAgICAgIG9vYiA9IHNjYWxlczo6c3F1aXNoLCAjIERlZmluZSBncmFkaWVudCBjb2xvcnMKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoCiAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gMS41LzUuMDgsICAjIEFkanVzdCB3aWR0aCBvZiB0aGUgY29sb3IgYmFyCiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDE1LzUuMDggICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhcgogICAgICAgICAgICAgICAgICAgICAgKQogICkgKyAKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzCiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uCiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvbgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkKIyBwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gdGFyZ2V0LCBjb2xvciA9IHFWYWx1ZUxvZywgc2l6ZSA9IG9kZHNSYXRpbykpICsKIyAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyAKIyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgMykpICsgICMgU2V0IG1pbiBhbmQgbWF4IHBvaW50IHNpemVzIGhlcmUKIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICJibHVlIiwgaGlnaCA9ICJyZWQiLAojICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcigKIyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXIKIyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICAjIEFkanVzdCBoZWlnaHQgb2YgdGhlIGNvbG9yIGJhcgojICAgICAgICAgICAgICAgICAgICAgICAgKSkgKwojICAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArCiMgICB0aGVtZSgKIyAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKIyAgICAgICBzaXplID0gZm9udFNpemVTLAojICAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAojICAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiMgICAgICksCiMgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKIyAgICAgICBzaXplID0gZm9udFNpemVTLAojICAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAojICAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiMgICAgICksCiMgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAojICAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzCiMgICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb24KIyAgICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KIyAgICAgKSwKIyAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAojICAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAojICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAojICAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgojICAgICApLAojICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAojICAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAojICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAojICAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgojICAgICApLAojICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKIyAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAojICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiMgICApCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImFuY2hvckxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfT1JfcVZhbHVlX3JlZ0FuY2hvckJhY2tncm91bmRfYXRhY191cG5vIikKd2lkdGggPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjkpKm1tVG9JbmNoCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKCmBgYHtyfQojIyMgMjQxMDE1IFRlc3Rpbmcgb24gc3Vic2V0IG9mIGxvb3BzCmFuY2hvci5jMSA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjEpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzEsIGF0YWMuZ3IpCmFuY2hvci5jMSA8LSBwaW50ZXJzZWN0KGFuY2hvci5jMVtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKYW5jaG9yLmMyIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMikKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5jMiwgYXRhYy5ncikKYW5jaG9yLmMyIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmMyW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgphbmNob3IuYzMgPC0gZXh0cmFjdEFuY2hvcihsb29wLmNsdXN0ZXIzKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmMzLCBhdGFjLmdyKQphbmNob3IuYzMgPC0gcGludGVyc2VjdChhbmNob3IuYzNbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCmFuY2hvci5jNCA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjQpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzQsIGF0YWMuZ3IpCmFuY2hvci5jNCA8LSBwaW50ZXJzZWN0KGFuY2hvci5jNFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKYW5jaG9yLmM1IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5jNSwgYXRhYy5ncikKYW5jaG9yLmM1IDwtIHBpbnRlcnNlY3QoYW5jaG9yLmM1W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgphbmNob3IuYzYgPC0gZXh0cmFjdEFuY2hvcihsb29wLmNsdXN0ZXI2KQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmM2LCBhdGFjLmdyKQphbmNob3IuYzYgPC0gcGludGVyc2VjdChhbmNob3IuYzZbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCmFuY2hvci5jNyA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjcpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzcsIGF0YWMuZ3IpCmFuY2hvci5jNyA8LSBwaW50ZXJzZWN0KGFuY2hvci5jN1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKYW5jaG9yLmM4IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyOCkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5jOCwgYXRhYy5ncikKYW5jaG9yLmM4IDwtIHBpbnRlcnNlY3QoYW5jaG9yLmM4W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgpyZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jMSwgYW5jaG9yLmFsbCwgbG9sYURCKQp0Yi5jMSA9IGFzX3RpYmJsZShyZXN1bHQpCgpyZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jMiwgYW5jaG9yLmFsbCwgbG9sYURCKQp0Yi5jMiA9IGFzX3RpYmJsZShyZXN1bHQpCgpyZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jMywgYW5jaG9yLmFsbCwgbG9sYURCKQp0Yi5jMyA9IGFzX3RpYmJsZShyZXN1bHQpCgpyZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jNCwgYW5jaG9yLmFsbCwgbG9sYURCKQp0Yi5jNCA9IGFzX3RpYmJsZShyZXN1bHQpCnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM1LCBhbmNob3IuYWxsLCBsb2xhREIpCnRiLmM1ID0gYXNfdGliYmxlKHJlc3VsdCkKCnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM2LCBhbmNob3IuYWxsLCBsb2xhREIpCnRiLmM2ID0gYXNfdGliYmxlKHJlc3VsdCkKCnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM3LCBhbmNob3IuYWxsLCBsb2xhREIpCnRiLmM3ID0gYXNfdGliYmxlKHJlc3VsdCkKCnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmM4LCBhbmNob3IuYWxsLCBsb2xhREIpCnRiLmM4ID0gYXNfdGliYmxlKHJlc3VsdCkKCiMjIyBIRUFUTUFQCmFscGhhIDwtIDAuMDUKdGIuYzEgPC0gdGIuYzEgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQp0Yi5jMiA8LSB0Yi5jMiAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCnRiLmMzIDwtIHRiLmMzICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIuYzQgPC0gdGIuYzQgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQp0Yi5jNSA8LSB0Yi5jNSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JQogIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKCnRiLmM2IDwtIHRiLmM2ICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQoKdGIuYzcgPC0gdGIuYzcgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCgp0Yi5jOCA8LSB0Yi5jOCAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JQogIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKCnRlbXAuYzEgPC0gdGIuYzEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pCmNvbG5hbWVzKHRlbXAuYzEpIDwtIGMoInRhcmdldCIsICJPUl9jMSIpCnRlbXAuYzIgPC0gdGIuYzIgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pCmNvbG5hbWVzKHRlbXAuYzIpIDwtIGMoInRhcmdldCIsICJPUl9jMiIpCnRlbXAuYzMgPC0gdGIuYzMgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pCmNvbG5hbWVzKHRlbXAuYzMpIDwtIGMoInRhcmdldCIsICJPUl9jMyIpCnRlbXAuYzQgPC0gdGIuYzQgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pCmNvbG5hbWVzKHRlbXAuYzQpIDwtIGMoInRhcmdldCIsICJPUl9jNCIpCnRlbXAuYzUgPC0gdGIuYzUgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pCmNvbG5hbWVzKHRlbXAuYzUpIDwtIGMoInRhcmdldCIsICJPUl9jNSIpCnRlbXAuYzYgPC0gdGIuYzYgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pCmNvbG5hbWVzKHRlbXAuYzYpIDwtIGMoInRhcmdldCIsICJPUl9jNiIpCnRlbXAuYzcgPC0gdGIuYzcgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pCmNvbG5hbWVzKHRlbXAuYzcpIDwtIGMoInRhcmdldCIsICJPUl9jNyIpCnRlbXAuYzggPC0gdGIuYzggJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pCmNvbG5hbWVzKHRlbXAuYzgpIDwtIGMoInRhcmdldCIsICJPUl9jOCIpCgp0ZW1wIDwtIGZ1bGxfam9pbih0ZW1wLmMxLCB0ZW1wLmMyLCBieSA9ICJ0YXJnZXQiKSAlPiUKICBmdWxsX2pvaW4odGVtcC5jMywgYnkgPSAidGFyZ2V0IikgJT4lCiAgZnVsbF9qb2luKHRlbXAuYzQsIGJ5ID0gInRhcmdldCIpICU+JQogIGZ1bGxfam9pbih0ZW1wLmM1LCBieSA9ICJ0YXJnZXQiKSAlPiUKICBmdWxsX2pvaW4odGVtcC5jNiwgYnkgPSAidGFyZ2V0IikgJT4lCiAgZnVsbF9qb2luKHRlbXAuYzcsIGJ5ID0gInRhcmdldCIpICU+JQogIGZ1bGxfam9pbih0ZW1wLmM4LCBieSA9ICJ0YXJnZXQiKSAlPiUKICBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKQoKZGF0YSA8LSB0ZW1wICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoInRhcmdldCIpICU+JSBhcy5tYXRyaXgoKQoKbGlicmFyeShjaXJjbGl6ZSkKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMSwgbWF4KGRhdGEpKSwgYygid2hpdGUiLCAicmVkIikpCgoKI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9ICJ3c3MiKQoKcCA8LSBIZWF0bWFwKAogIGRhdGEsCiAgbmFtZSA9ICJPZGRzIFJhdGlvIiwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZAogIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtCiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLAogIGNvbCA9IGNvbF9mdW4sCiAgYm9yZGVyID0gVFJVRQopCgoKIyBJbml0aWFsaXplIGxpc3RzIHRvIHN0b3JlIHJlc3VsdHMKYW5jaG9ycyA8LSBsaXN0KCkKdGJzIDwtIGxpc3QoKQp0ZW1wcyA8LSBsaXN0KCkKCiMgUHJvY2VzcyBjbHVzdGVycyBjMSB0byBjOApmb3IgKGkgaW4gMTo0KSB7CiAgIyBFeHRyYWN0IGFuY2hvcgogIGxvb3BfY2x1c3RlciA8LSBnZXQocGFzdGUwKCJsb29wLmNsdXN0ZXIiLCBpKSkKICBhbmNob3IgPC0gZXh0cmFjdEFuY2hvcihsb29wX2NsdXN0ZXIpCiAgCiAgIyBGaW5kIG92ZXJsYXBzIGFuZCBpbnRlcnNlY3QKICBvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLCBhdGFjLmdyKQogIGFuY2hvciA8LSBwaW50ZXJzZWN0KGFuY2hvcltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQogIAogICMgU3RvcmUgYW5jaG9yCiAgYW5jaG9yc1tbaV1dIDwtIGFuY2hvcgogIAogICMgUnVuIExPTEEKICByZXN1bHQgPC0gcnVuTE9MQShhbmNob3IsIGFuY2hvci5hbGwsIGxvbGFEQikKICB0YiA8LSBhc190aWJibGUocmVzdWx0KQogIAogICMgRmlsdGVyIGFuZCBzdW1tYXJpemUKICB0YiA8LSB0YiAlPiUKICAgIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JQogICAgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCiAgCiAgIyBTdG9yZSB0YgogIHRic1tbaV1dIDwtIHRiCiAgCiAgIyBTZWxlY3QgYW5kIHJlbmFtZSBvZGRzUmF0aW8KICB0ZW1wIDwtIHRiICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQogIGNvbG5hbWVzKHRlbXApIDwtIGMoInRhcmdldCIsIHBhc3RlMCgiT1JfYyIsIGkpKQogIAogICMgU3RvcmUgdGVtcAogIHRlbXBzW1tpXV0gPC0gdGVtcAp9CgojIE1lcmdlIGFsbCB0ZW1wIHRhYmxlcyBpbnRvIG9uZQp0ZW1wIDwtIFJlZHVjZShmdW5jdGlvbih4LCB5KSBmdWxsX2pvaW4oeCwgeSwgYnkgPSAidGFyZ2V0IiksIHRlbXBzKSAlPiUKICBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKQpkYXRhIDwtIHRlbXAgJT4lIGNvbHVtbl90b19yb3duYW1lcygidGFyZ2V0IikgJT4lIGFzLm1hdHJpeCgpCgpsaWJyYXJ5KGNpcmNsaXplKQpjb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygxLCBtYXgoZGF0YSkpLCBjKCJ3aGl0ZSIsICJyZWQiKSkKCgojZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gIndzcyIpCgpwIDwtIEhlYXRtYXAoCiAgZGF0YSwKICBuYW1lID0gIk9kZHMgUmF0aW8iLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kCiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsICAgICAgICAgICAgIyBSZW1vdmUgY29sdW1uIGRlbmRyb2dyYW0KICBzaG93X3Jvd19kZW5kID0gRkFMU0UsCiAgY29sID0gY29sX2Z1biwKICBib3JkZXIgPSBUUlVFCikKYGBgCgoKCiMjIyMjIC0gTGltaXRlZCB0byBBVEFDLXNlcSBzaWduYWwsIGFsbCBsb29wIGJhY2tncm91cApgYGB7cn0KYXRhYyA8LSBmcmVhZChoZXJlKHJlZkRpciwgIkdTTTMxMDYyNTdfQVRBQ19FU0NfMS5iZWQiKSkgJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMykKY29sbmFtZXMoYXRhYykgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCmF0YWMuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGF0YWMpCgojIExPQURJTkcgTE9PUFMKIyMjIEltcG9ydGluZyBkaWZmZXJlbnRpYWwgcmVndWxhdG9yeSBsb29wcyAmIGV4dHJhY3QgYW5jaG9yCmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3YiKSkKYW5jaG9yLmFsbCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmFsbCkpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKQphbmNob3IuYWxsIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKbG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZSIpKQphbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXAsIGF0YWMuZ3IpCmFuY2hvci51cCA8LSBwaW50ZXJzZWN0KGFuY2hvci51cFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKQphbmNob3Iubm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3Iubm8sIGF0YWMuZ3IpCmFuY2hvci5ubyA8LSBwaW50ZXJzZWN0KGFuY2hvci5ub1txdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKbG9vcC51cG5vIDwtIGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKQphbmNob3IudXBubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwbm8pKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwbm8sIGF0YWMuZ3IpCmFuY2hvci51cG5vIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwbm9bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCgpsb29wTnVtIDwtIG5yb3cobG9vcC51cG5vKQoKIyBTZWxlY3Rpbmcgc2FtZSBudW1iZXIgb2YgZXh0cmVtZSBkb3duIGxvb3BzCmxvb3AuZG93biA8LSBsb29wLmFsbCAlPiUgZHBseXI6OmZpbHRlcihkaWZmX2RUQUdfRE1TTyA8IC0wLjIpICU+JSBkcGx5cjo6YXJyYW5nZShkaWZmX2RUQUdfRE1TTykgJT4lIHNsaWNlX2hlYWQobiA9IGxvb3BOdW0pCmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgYXRhYy5ncikKYW5jaG9yLmRvd24gPC0gcGludGVyc2VjdChhbmNob3IuZG93bltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKYGBgCgoKYGBge3J9CiMgUlVOTklORyBMT0xBCmxvbGFEaXIgPC0gaGVyZSgiLi4vLi4vcmVzdWx0L2xvbGEiKQpkaXIuY3JlYXRlKGxvbGFEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKQoKIyBVUApyZXN1bHQgPSBydW5MT0xBKGFuY2hvci51cCwgYW5jaG9yLmFsbCwgbG9sYURCKQp0YiA9IGFzX3RpYmJsZShyZXN1bHQpCiNmd3JpdGUodGIsIGhlcmUobG9sYURpciwgIkxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBfYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdiIpLCBzZXAgPSAiXHQiKQoKIyBOTwpyZXN1bHQgPSBydW5MT0xBKGFuY2hvci5ubywgYW5jaG9yLmFsbCwgbG9sYURCKQp0YiA9IGFzX3RpYmJsZShyZXN1bHQpCiNmd3JpdGUodGIsIGhlcmUobG9sYURpciwgIkxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfbm9fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdiIpLCBzZXAgPSAiXHQiKQoKIyBVUE5PCnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLnVwbm8sIGFuY2hvci5hbGwsIGxvbGFEQikKdGIgPSBhc190aWJibGUocmVzdWx0KQojZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3Vwbm9fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdiIpLCBzZXAgPSAiXHQiKQoKCiMgRE9XTgpyZXN1bHQgPSBydW5MT0xBKGFuY2hvci5kb3duLCBhbmNob3IuYWxsLCBsb2xhREIpCnRiID0gYXNfdGliYmxlKHJlc3VsdCkKI2Z3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCAiTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9kb3duX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3YiKSwgc2VwID0gIlx0IikKCgoKIyMjIEhFQVRNQVAKYWxwaGEgPC0gMC4wNQp0Yi51cCA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3VwX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3YiKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQp0Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3YiKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQp0Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgIkxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfZG93bl9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2IikpICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKCnRlbXAudXAgPC0gdGIudXAgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pCmNvbG5hbWVzKHRlbXAudXApIDwtIGMoInRhcmdldCIsICJPUl91cCIpCnRlbXAubm8gPC0gdGIubm8gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pCmNvbG5hbWVzKHRlbXAubm8pIDwtIGMoInRhcmdldCIsICJPUl9ubyIpCnRlbXAuZG93biA8LSB0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLmRvd24pIDwtIGMoInRhcmdldCIsICJPUl9kb3duIikKCgp0ZW1wIDwtIGZ1bGxfam9pbihmdWxsX2pvaW4odGVtcC51cCwgdGVtcC5ubywgYnkgPSBjKCJ0YXJnZXQiKSksIHRlbXAuZG93biwgYnkgPSBjKCJ0YXJnZXQiKSkgJT4lIG11dGF0ZV9hbGwofnJlcGxhY2VfbmEoLiwgMSkpCgpkYXRhIDwtIGFzLm1hdHJpeCh0ZW1wWzI6NF0pCnJvd25hbWVzKGRhdGEpIDwtIHRlbXAkdGFyZ2V0CgpsaWJyYXJ5KGNpcmNsaXplKQpjb2xfZnVuIDwtIGNvbG9yUmFtcDIoYyhtaW4oZGF0YSksIG1heChkYXRhKSksIGMoIndoaXRlIiwgInJlZCIpKQoKCiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSAid3NzIikKCiMgcCA8LSBIZWF0bWFwKAojICAgZGF0YSwKIyAgIG5hbWUgPSAiT2RkcyBSYXRpbyIsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmQKIyAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtCiMgICByb3dfa20gPSAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgIyBEZWZpbmUgdGhlIG51bWJlciBvZiBrLW1lYW5zIGNsdXN0ZXJzIGZvciByb3dzIChhZGp1c3QgYXMgbmVlZGVkKQojICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLAojICAgY29sID0gY29sX2Z1biwKIyAgIGJvcmRlciA9IFRSVUUKIyApCiMgCiMgZmlsZU5hbWUgPC0gcGFzdGUwKCJhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2FsbExvb3BzX2V4dHJlbWVfYWxsQW5jaG9yQmFja2dyb3VuZF9hdGFjIikKIyBoZWlnaHQgPC0gNwojIHdpZHRoIDwtIDMuNQojIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQojIHByaW50KHApCiMgZGV2Lm9mZigpCiMgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKIyBwcmludChwKQojIGRldi5vZmYoKQoKCgoKIyMjIFZpc3VhbGl6aW5nIHAtdmFsdWUgYW5kIE9SCmFscGhhIDwtIDAuMDUKIyB0Yi51cCA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3VwX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3YiKSkgJT4lCiMgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAojICAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLAojICAgICAgICAgICAgICAgICBncm91cCA9ICJVUCIpICU+JQojICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKIyAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKIyAgIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKIyB0Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX25vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3YiKSkgJT4lCiMgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAojICAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLAojICAgICAgICAgICAgICAgICBncm91cCA9ICJOTyIpICU+JQojICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKIyAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKIyAgIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIudXBubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX3Vwbm9fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAogICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzEwKHFWYWx1ZSksCiAgICAgICAgICAgICAgICBncm91cCA9ICJVUC9OTyIpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKZndyaXRlKHRiLnVwbm8gJT4lIGRwbHlyOjpzZWxlY3QoYygyNCwgMTYsIDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDI1LCA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIDgsIDksIDEwLCAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgMTMsIDE0KSksIGhlcmUobG9sYURpciwgIkxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBub19hbGxMb29wc19leHRyZW1lX2F0YWNfcHViLnRzdiIpLCBzZXAgPSAiXHQiKQp0Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgIkxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfZG93bl9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2IikpICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSksCiAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMTAocVZhbHVlKSwKICAgICAgICAgICAgICAgIGdyb3VwID0gIkRPV04iKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCmZ3cml0ZSh0Yi5kb3duICU+JSBkcGx5cjo6c2VsZWN0KGMoMjQsIDE2LCAyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAyNSwgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCA4LCA5LCAxMCwgMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDEzLCAxNCkpLCBoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2Rvd25fYWxsTG9vcHNfZXh0cmVtZV9hdGFjX3B1Yi50c3YiKSwgc2VwID0gIlx0IikKCiMgdGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cCkKIyB0ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKQp0ZW1wLnVwbm8gPC0gdGIudXBubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cCkKdGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApCgp0ZW1wIDwtIGJpbmRfcm93cyh0ZW1wLnVwbm8sIHRlbXAuZG93bikKIyAKIyBvcmRlciA8LSBjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJVUC9OTyIpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCwgCiMgICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiRE9XTiIpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCkKIyB0ZW1wJHRhcmdldCA8LSBmYWN0b3IodGVtcCR0YXJnZXQsIGxldmVscyA9IHJldihvcmRlcikpCnRlbXAkZ3JvdXAgPC0gZmFjdG9yKHRlbXAkZ3JvdXAsIGxldmVscyA9IGMoIlVQL05PIiwgIkRPV04iKSkKCgp0YXJnZXRMaXN0IDwtIGMoIlBPTFIyQSIsICJDVFI5IiwKICAgICAgICAgICAgICAgICJBRkY0IiwgIkVMTDIiLAogICAgICAgICAgICAgICAgIk1FRDEiLCAiTUVEMTIiLAogICAgICAgICAgICAgICAgIlRCUCIsICJUQUYxIiwgIlRBRjMiLAogICAgICAgICAgICAgICAgIkVTUlJCIiwgIktMRjQiLCAiTkFOT0ciLCAiUE9VNUYxIiwgIlNPWDIiLCAiU1RBVDMiLCAiRTJGMSIsICJZWTEiLAogICAgICAgICAgICAgICAgIkVQMzAwIiwgIkRQWTMwIiwgIkVaSDIiLCAiS0RNMkIiLCAiS0RCNEIiLCAiS0RNNEMiLCAiS0RNNkIiLCAiUkJCUDUiLAogICAgICAgICAgICAgICAgIlJBRDIxIiwgIlNNQzFBIiwgIlNNQzMiLCAiQ1RDRiIsCiAgICAgICAgICAgICAgICAiSkFSSUQyIiwgIlNVWjEyIgopCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcih0YXJnZXQgJWluJSB0YXJnZXRMaXN0KQoKdGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYodGFyZ2V0TGlzdCkpCiMgTUFYIHFWYWx1ZUxvZyB0byA1MApxVmFsdWVMb2dNYXggPC0gNTAKdGVtcDIgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShxVmFsdWVMb2cgPSBtaW4ocVZhbHVlTG9nLCBxVmFsdWVMb2dNYXgpKQpwIDwtIGdncGxvdCh0ZW1wMiwgYWVzKHggPSBncm91cCwgeSA9IHRhcmdldCwgZmlsbCA9IG9kZHNSYXRpbywgc2l6ZSA9IHFWYWx1ZUxvZykpICsKICBnZW9tX3BvaW50KHNoYXBlID0gMjEsICAgICAgICAjIEVuc3VyZXMgYSBwb2ludCB3aXRoIGFuIG91dGxpbmUKICAgICAgICAgICAgIHN0cm9rZSA9IDAuNSpwdFRvTU0gICAgICAjIExpbmUgd2lkdGggZm9yIHRoZSBib3JkZXIKICApICsgdGhlbWVfYncoKSArIAogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCAyKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIndoaXRlIiwgaGlnaCA9ICIjQ0IzMzNBIiwKICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksCiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKAogICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhcgogICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXIKICAgICAgICAgICAgICAgICAgICAgICkKICApICsgCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlcwogICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImFuY2hvckxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfYWxsTG9vcHNfZXh0cmVtZV9PUl9xVmFsdWVfYWxsQW5jaG9yQmFja2dyb3VuZF9hdGFjX29yZGVyZWQiKQp3aWR0aCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaApoZWlnaHQgPC0gcGFuZWxTaXplKDIuNSkqbW1Ub0luY2gKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCgoKCmBgYAoKIyMjIGRUQUcsIG9ic2V4cAoKIyMjIyMgLSBMaW1pdGVkIHRvIEFUQUMtc2VxIHNpZ25hbCwgYWxsIGxvb3AgYmFja2dyb3VwCmBgYHtyfQphdGFjIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiR1NNMzEwNjI1N19BVEFDX0VTQ18xLmJlZCIpKSAlPiUgZHBseXI6OnNlbGVjdChWMSwgVjIsIFYzKQpjb2xuYW1lcyhhdGFjKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKYXRhYy5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYXRhYykKCiMgTE9BRElORyBMT09QUwojIyMgSW1wb3J0aW5nIGRpZmZlcmVudGlhbCByZWd1bGF0b3J5IGxvb3BzICYgZXh0cmFjdCBhbmNob3IKbG9vcC5hbGwgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5LnRzdiIpKQphbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5hbGwsIGF0YWMuZ3IpCmFuY2hvci5hbGwgPC0gcGludGVyc2VjdChhbmNob3IuYWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgpsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9sb2dPRV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC41LmJlZHBlIikpCmFuY2hvci51cCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cCwgYXRhYy5ncikKYW5jaG9yLnVwIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgpsb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9sb2dPRV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC41LmJlZHBlIikpCmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ubywgYXRhYy5ncikKYW5jaG9yLm5vIDwtIHBpbnRlcnNlY3QoYW5jaG9yLm5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgoKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9sb2dPRV9hbGxfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjUuYmVkcGUiKSkKYW5jaG9yLmRvd24gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBhdGFjLmdyKQphbmNob3IuZG93biA8LSBwaW50ZXJzZWN0KGFuY2hvci5kb3duW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgoKYGBgCgoKYGBge3J9CiMgUlVOTklORyBMT0xBCmxvbGFEaXIgPC0gaGVyZSgiLi4vLi4vcmVzdWx0L2xvbGEiKQpkaXIuY3JlYXRlKGxvbGFEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKQoKIyBVUApyZXN1bHQgPSBydW5MT0xBKGFuY2hvci51cCwgYW5jaG9yLmFsbCwgbG9sYURCKQp0YiA9IGFzX3RpYmJsZShyZXN1bHQpCmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCAiTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV91cF9hbGxMb29wc19hdGFjLnRzdiIpLCBzZXAgPSAiXHQiKQoKIyBOTwpyZXN1bHQgPSBydW5MT0xBKGFuY2hvci5ubywgYW5jaG9yLmFsbCwgbG9sYURCKQp0YiA9IGFzX3RpYmJsZShyZXN1bHQpCmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCAiTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9ub19hbGxMb29wc19hdGFjLnRzdiIpLCBzZXAgPSAiXHQiKQoKIyBET1dOCnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmRvd24sIGFuY2hvci5hbGwsIGxvbGFEQikKdGIgPSBhc190aWJibGUocmVzdWx0KQpmd3JpdGUodGIsIGhlcmUobG9sYURpciwgIkxPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfZG93bl9hbGxMb29wc19hdGFjLnRzdiIpLCBzZXAgPSAiXHQiKQoKCgojIyMgSEVBVE1BUAphbHBoYSA8LSAwLjA1CnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgIkxPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfdXBfYWxsTG9vcHNfYXRhYy50c3YiKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQp0Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X25vX2FsbExvb3BzX2F0YWMudHN2IikpICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X2Rvd25fYWxsTG9vcHNfYXRhYy50c3YiKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQoKdGVtcC51cCA8LSB0Yi51cCAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbykKY29sbmFtZXModGVtcC51cCkgPC0gYygidGFyZ2V0IiwgIk9SX3VwIikKdGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbykKY29sbmFtZXModGVtcC5ubykgPC0gYygidGFyZ2V0IiwgIk9SX25vIikKdGVtcC5kb3duIDwtIHRiLmRvd24gJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8pCmNvbG5hbWVzKHRlbXAuZG93bikgPC0gYygidGFyZ2V0IiwgIk9SX2Rvd24iKQoKCnRlbXAgPC0gZnVsbF9qb2luKGZ1bGxfam9pbih0ZW1wLnVwLCB0ZW1wLm5vLCBieSA9IGMoInRhcmdldCIpKSwgdGVtcC5kb3duLCBieSA9IGMoInRhcmdldCIpKSAlPiUgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSkKCmRhdGEgPC0gYXMubWF0cml4KHRlbXBbMjo0XSkKcm93bmFtZXMoZGF0YSkgPC0gdGVtcCR0YXJnZXQKCmxpYnJhcnkoY2lyY2xpemUpCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKG1pbihkYXRhKSwgbWF4KGRhdGEpKSwgYygid2hpdGUiLCAicmVkIikpCgoKI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9ICJ3c3MiKQoKcCA8LSBIZWF0bWFwKAogIGRhdGEsCiAgbmFtZSA9ICJPZGRzIFJhdGlvIiwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZAogIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtCiAgcm93X2ttID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmluZSB0aGUgbnVtYmVyIG9mIGstbWVhbnMgY2x1c3RlcnMgZm9yIHJvd3MgKGFkanVzdCBhcyBuZWVkZWQpCiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLAogIGNvbCA9IGNvbF9mdW4sCiAgYm9yZGVyID0gVFJVRQopCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImFuY2hvckxPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfYWxsTG9vcHNfYWxsQW5jaG9yQmFja2dyb3VuZF9hdGFjIikKaGVpZ2h0IDwtIDcKd2lkdGggPC0gMy41CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKIyMjIyMjIyMjIyMjCiMgCiMgIyMjIFZpc3VhbGl6aW5nIHAtdmFsdWUgYW5kIE9SCiMgYWxwaGEgPC0gMC4wNQojIHRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgIkxPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfdXBfYWxsTG9vcHNfYXRhYy50c3YiKSkgJT4lCiMgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAojICAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLAojICAgICAgICAgICAgICAgICBncm91cCA9ICJVUCIpICU+JQojICAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKIyAgIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKIyAgIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKIyB0Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X25vX2FsbExvb3BzX2F0YWMudHN2IikpICU+JQojICAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSwKIyAgICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSwKIyAgICAgICAgICAgICAgICAgZ3JvdXAgPSAiTk8iKSAlPiUKIyAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiMgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiMgICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCiMgdGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X2Rvd25fYWxsTG9vcHNfYXRhYy50c3YiKSkgJT4lCiMgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAojICAgICAgICAgICAgICAgICBxVmFsdWVMb2cgPSAtbG9nMihxVmFsdWUpLAojICAgICAgICAgICAgICAgICBncm91cCA9ICJET1dOIikgJT4lCiMgICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQojICAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQojICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQojIAojIHRlbXAudXAgPC0gdGIudXAgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBvZGRzUmF0aW8sIHFWYWx1ZUxvZywgZ3JvdXApCiMgdGVtcC5ubyA8LSB0Yi5ubyAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cCkKIyB0ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cCkKIyAKIyB0ZW1wIDwtIGJpbmRfcm93cyh0ZW1wLnVwLCB0ZW1wLmRvd24pCiMgCiMgb3JkZXIgPC0gYygodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiVVAiKSAlPiUgYXJyYW5nZShkZXNjKG9kZHNSYXRpbykpKSR0YXJnZXQsIAojICAgICAgICAgICAgKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gIkRPV04iKSAlPiUgYXJyYW5nZShkZXNjKG9kZHNSYXRpbykpKSR0YXJnZXQpCiMgdGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYob3JkZXIpKQojIHAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGNvbG9yID0gcVZhbHVlTG9nLCBzaXplID0gb2Rkc1JhdGlvKSkgKwojICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICJibHVlIiwgaGlnaCA9ICJyZWQiKSArCiMgICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICsgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDMpKSArCiMgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemUKIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKQojICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBsZWdlbmQgdGV4dCBzaXplCiMgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSAKIyAKIyBmaWxlTmFtZSA8LSBwYXN0ZTAoImFuY2hvckxPTEFfZFRBR192c19ETVNPX2xvZ09FX2RpZmYwLjVfYWxsTG9vcHNfT1JfYWxsQW5jaG9yQmFja2dyb3VuZF9hdGFjIikKIyBoZWlnaHQgPC0zCiMgd2lkdGggPC0gMgojIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQojIHByaW50KHApCiMgZGV2Lm9mZigpCiMgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKIyBwcmludChwKQojIGRldi5vZmYoKQoKCmBgYAoKIyMjIyMgLSBMaW1pdGluZyB0byBBVEFDLXNlcSBzaWduYWwsIHJlZyBsb29wIGJhY2tncm91bmQKYGBge3J9CmF0YWMgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkIikpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpCmNvbG5hbWVzKGF0YWMpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQphdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKQoKIyBMT0FESU5HIExPT1BTCiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvcgpsb29wLmFsbCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2IikpICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYygiUC1QIiwgIlAtRSIsICJFLUUiKSkKYW5jaG9yLmFsbCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmFsbCkpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKQphbmNob3IuYWxsIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKCmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2xvZ09FX3BlLXBlX2RUQUd2c0RNU09fVVBfZGlmZjAuNS5iZWRwZSIpKQphbmNob3IudXAgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXAsIGF0YWMuZ3IpCmFuY2hvci51cCA8LSBwaW50ZXJzZWN0KGFuY2hvci51cFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfbG9nT0VfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC41LmJlZHBlIikpCmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5ubywgYXRhYy5ncikKYW5jaG9yLm5vIDwtIHBpbnRlcnNlY3QoYW5jaG9yLm5vW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgoKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9sb2dPRV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuNS5iZWRwZSIpKQphbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmRvd24sIGF0YWMuZ3IpCmFuY2hvci5kb3duIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmRvd25bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCgoKYGBgCgoKYGBge3J9CiMgUlVOTklORyBMT0xBCmxvbGFEaXIgPC0gaGVyZSgiLi4vLi4vcmVzdWx0L2xvbGEiKQpkaXIuY3JlYXRlKGxvbGFEaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKQoKIyBVUApyZXN1bHQgPSBydW5MT0xBKGFuY2hvci51cCwgYW5jaG9yLmFsbCwgbG9sYURCKQp0YiA9IGFzX3RpYmJsZShyZXN1bHQpCmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCAiTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV91cF9wZS1wZUxvb3BzX2F0YWMudHN2IiksIHNlcCA9ICJcdCIpCgojIE5PCnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLm5vLCBhbmNob3IuYWxsLCBsb2xhREIpCnRiID0gYXNfdGliYmxlKHJlc3VsdCkKZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X25vX3BlLXBlTG9vcHNfYXRhYy50c3YiKSwgc2VwID0gIlx0IikKCiMgRE9XTgpyZXN1bHQgPSBydW5MT0xBKGFuY2hvci5kb3duLCBhbmNob3IuYWxsLCBsb2xhREIpCnRiID0gYXNfdGliYmxlKHJlc3VsdCkKZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X2Rvd25fcGUtcGVMb29wc19hdGFjLnRzdiIpLCBzZXAgPSAiXHQiKQoKCiMjIyBIRUFUTUFQCmFscGhhIDwtIDAuMDUKdGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCAiTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV91cF9wZS1wZUxvb3BzX2F0YWMudHN2IikpICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCAiTE9MQV9kVEFHX3ZzX0RNU09fbG9nT0VfZGlmZjAuNV9ub19wZS1wZUxvb3BzX2F0YWMudHN2IikpICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X2Rvd25fcGUtcGVMb29wc19hdGFjLnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCgp0ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLnVwKSA8LSBjKCJ0YXJnZXQiLCAiT1JfdXAiKQp0ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLm5vKSA8LSBjKCJ0YXJnZXQiLCAiT1Jfbm8iKQp0ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbykKY29sbmFtZXModGVtcC5kb3duKSA8LSBjKCJ0YXJnZXQiLCAiT1JfZG93biIpCgoKdGVtcCA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAudXAsIHRlbXAubm8sIGJ5ID0gYygidGFyZ2V0IikpLCB0ZW1wLmRvd24sIGJ5ID0gYygidGFyZ2V0IikpICU+JSBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKQoKZGF0YSA8LSBhcy5tYXRyaXgodGVtcFsyOjRdKQpyb3duYW1lcyhkYXRhKSA8LSB0ZW1wJHRhcmdldAoKbGlicmFyeShjaXJjbGl6ZSkKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMobWluKGRhdGEpLCBtYXgoZGF0YSkpLCBjKCJ3aGl0ZSIsICJyZWQiKSkKCgojZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gIndzcyIpCgpwIDwtIEhlYXRtYXAoCiAgZGF0YSwKICBuYW1lID0gIk9kZHMgUmF0aW8iLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kCiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsICAgICAgICAgICAgIyBSZW1vdmUgY29sdW1uIGRlbmRyb2dyYW0KICByb3dfa20gPSA0LCAgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmluZSB0aGUgbnVtYmVyIG9mIGstbWVhbnMgY2x1c3RlcnMgZm9yIHJvd3MgKGFkanVzdCBhcyBuZWVkZWQpCiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLAogIGNvbCA9IGNvbF9mdW4gICAgICAgICAgICAgICAgICAgICAgICMgVXNlIHRoZSByZWQgZ3JhZGllbnQgY29sb3Igc2NhbGUKKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19sb2dPRV9kaWZmMC41X3BlLXBlTG9vcHNfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjIikKaGVpZ2h0IDwtIDcKd2lkdGggPC0gMy41CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKCiMjIyBWaXN1YWxpemluZyBwLXZhbHVlIGFuZCBPUgphbHBoYSA8LSAwLjA1CnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgIkxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfdXBfYXRhYy50c3YiKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSwKICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksCiAgICAgICAgICAgICAgICBncm91cCA9ICJVUCIpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCAiTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9ub19hdGFjLnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAogICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSwKICAgICAgICAgICAgICAgIGdyb3VwID0gIk5PIikgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQp0Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgIkxPTEFfZFRBR192c19ETVNPX2RpZmYwLjJfZG93bl9hdGFjLnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAogICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSwKICAgICAgICAgICAgICAgIGdyb3VwID0gIkRPV04iKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCgp0ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKQp0ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKQp0ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cCkKCnRlbXAgPC0gYmluZF9yb3dzKHRlbXAudXAsIHRlbXAuZG93bikKCm9yZGVyIDwtIGMoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gIlVQIikgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0LCAKICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiRE9XTiIpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCkKdGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYob3JkZXIpKQpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gdGFyZ2V0LCBjb2xvciA9IHFWYWx1ZUxvZywgc2l6ZSA9IG9kZHNSYXRpbykpICsKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICsKICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemUKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZCkKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemUKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSAKCmZpbGVOYW1lIDwtIHBhc3RlMCgiYW5jaG9yTE9MQV9kVEFHX3ZzX0RNU09fZGlmZjAuMl9PUl9xVmFsdWVfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjIikKaGVpZ2h0IDwtMwp3aWR0aCA8LSAyCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgoKCgoKIyMjIDI0MTAxNSBUZXN0aW5nIG9uIHN1YnNldCBvZiBsb29wcwphbmNob3IuYzEgPC0gZXh0cmFjdEFuY2hvcihsb29wLmNsdXN0ZXIxKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmMxLCBhdGFjLmdyKQphbmNob3IuYzEgPC0gcGludGVyc2VjdChhbmNob3IuYzFbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCmFuY2hvci5jMiA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjIpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzIsIGF0YWMuZ3IpCmFuY2hvci5jMiA8LSBwaW50ZXJzZWN0KGFuY2hvci5jMltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKYW5jaG9yLmMzIDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyMykKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5jMywgYXRhYy5ncikKYW5jaG9yLmMzIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmMzW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgphbmNob3IuYzQgPC0gZXh0cmFjdEFuY2hvcihsb29wLmNsdXN0ZXI0KQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmM0LCBhdGFjLmdyKQphbmNob3IuYzQgPC0gcGludGVyc2VjdChhbmNob3IuYzRbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCmFuY2hvci5jNSA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjUpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzUsIGF0YWMuZ3IpCmFuY2hvci5jNSA8LSBwaW50ZXJzZWN0KGFuY2hvci5jNVtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKYW5jaG9yLmM2IDwtIGV4dHJhY3RBbmNob3IobG9vcC5jbHVzdGVyNikKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5jNiwgYXRhYy5ncikKYW5jaG9yLmM2IDwtIHBpbnRlcnNlY3QoYW5jaG9yLmM2W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgphbmNob3IuYzcgPC0gZXh0cmFjdEFuY2hvcihsb29wLmNsdXN0ZXI3KQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmM3LCBhdGFjLmdyKQphbmNob3IuYzcgPC0gcGludGVyc2VjdChhbmNob3IuYzdbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCmFuY2hvci5jOCA8LSBleHRyYWN0QW5jaG9yKGxvb3AuY2x1c3RlcjgpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYzgsIGF0YWMuZ3IpCmFuY2hvci5jOCA8LSBwaW50ZXJzZWN0KGFuY2hvci5jOFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKcmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzEsIGFuY2hvci5hbGwsIGxvbGFEQikKdGIuYzEgPSBhc190aWJibGUocmVzdWx0KQoKcmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzIsIGFuY2hvci5hbGwsIGxvbGFEQikKdGIuYzIgPSBhc190aWJibGUocmVzdWx0KQoKcmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzMsIGFuY2hvci5hbGwsIGxvbGFEQikKdGIuYzMgPSBhc190aWJibGUocmVzdWx0KQoKcmVzdWx0ID0gcnVuTE9MQShhbmNob3IuYzQsIGFuY2hvci5hbGwsIGxvbGFEQikKdGIuYzQgPSBhc190aWJibGUocmVzdWx0KQpyZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jNSwgYW5jaG9yLmFsbCwgbG9sYURCKQp0Yi5jNSA9IGFzX3RpYmJsZShyZXN1bHQpCgpyZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jNiwgYW5jaG9yLmFsbCwgbG9sYURCKQp0Yi5jNiA9IGFzX3RpYmJsZShyZXN1bHQpCgpyZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jNywgYW5jaG9yLmFsbCwgbG9sYURCKQp0Yi5jNyA9IGFzX3RpYmJsZShyZXN1bHQpCgpyZXN1bHQgPSBydW5MT0xBKGFuY2hvci5jOCwgYW5jaG9yLmFsbCwgbG9sYURCKQp0Yi5jOCA9IGFzX3RpYmJsZShyZXN1bHQpCgojIyMgSEVBVE1BUAphbHBoYSA8LSAwLjA1CnRiLmMxIDwtIHRiLmMxICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIuYzIgPC0gdGIuYzIgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQp0Yi5jMyA8LSB0Yi5jMyAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCnRiLmM0IDwtIHRiLmM0ICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIuYzUgPC0gdGIuYzUgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCgp0Yi5jNiA8LSB0Yi5jNiAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JQogIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKCnRiLmM3IDwtIHRiLmM3ICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQoKdGIuYzggPC0gdGIuYzggJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCgp0ZW1wLmMxIDwtIHRiLmMxICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLmMxKSA8LSBjKCJ0YXJnZXQiLCAiT1JfYzEiKQp0ZW1wLmMyIDwtIHRiLmMyICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLmMyKSA8LSBjKCJ0YXJnZXQiLCAiT1JfYzIiKQp0ZW1wLmMzIDwtIHRiLmMzICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLmMzKSA8LSBjKCJ0YXJnZXQiLCAiT1JfYzMiKQp0ZW1wLmM0IDwtIHRiLmM0ICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLmM0KSA8LSBjKCJ0YXJnZXQiLCAiT1JfYzQiKQp0ZW1wLmM1IDwtIHRiLmM1ICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLmM1KSA8LSBjKCJ0YXJnZXQiLCAiT1JfYzUiKQp0ZW1wLmM2IDwtIHRiLmM2ICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLmM2KSA8LSBjKCJ0YXJnZXQiLCAiT1JfYzYiKQp0ZW1wLmM3IDwtIHRiLmM3ICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLmM3KSA8LSBjKCJ0YXJnZXQiLCAiT1JfYzciKQp0ZW1wLmM4IDwtIHRiLmM4ICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLmM4KSA8LSBjKCJ0YXJnZXQiLCAiT1JfYzgiKQoKdGVtcCA8LSBmdWxsX2pvaW4odGVtcC5jMSwgdGVtcC5jMiwgYnkgPSAidGFyZ2V0IikgJT4lCiAgZnVsbF9qb2luKHRlbXAuYzMsIGJ5ID0gInRhcmdldCIpICU+JQogIGZ1bGxfam9pbih0ZW1wLmM0LCBieSA9ICJ0YXJnZXQiKSAlPiUKICBmdWxsX2pvaW4odGVtcC5jNSwgYnkgPSAidGFyZ2V0IikgJT4lCiAgZnVsbF9qb2luKHRlbXAuYzYsIGJ5ID0gInRhcmdldCIpICU+JQogIGZ1bGxfam9pbih0ZW1wLmM3LCBieSA9ICJ0YXJnZXQiKSAlPiUKICBmdWxsX2pvaW4odGVtcC5jOCwgYnkgPSAidGFyZ2V0IikgJT4lCiAgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSkKCmRhdGEgPC0gdGVtcCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKCJ0YXJnZXQiKSAlPiUgYXMubWF0cml4KCkKCmxpYnJhcnkoY2lyY2xpemUpCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDEsIG1heChkYXRhKSksIGMoIndoaXRlIiwgInJlZCIpKQoKCiNmdml6X25iY2x1c3QoZGF0YSwga21lYW5zLCBtZXRob2QgPSAid3NzIikKCnAgPC0gSGVhdG1hcCgKICBkYXRhLAogIG5hbWUgPSAiT2RkcyBSYXRpbyIsICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgaGVhdG1hcCBsZWdlbmQKICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgICAgICAgICAgICAjIFJlbW92ZSBjb2x1bW4gZGVuZHJvZ3JhbQogIHNob3dfcm93X2RlbmQgPSBGQUxTRSwKICBjb2wgPSBjb2xfZnVuLAogIGJvcmRlciA9IFRSVUUKKQoKCiMgSW5pdGlhbGl6ZSBsaXN0cyB0byBzdG9yZSByZXN1bHRzCmFuY2hvcnMgPC0gbGlzdCgpCnRicyA8LSBsaXN0KCkKdGVtcHMgPC0gbGlzdCgpCgojIFByb2Nlc3MgY2x1c3RlcnMgYzEgdG8gYzgKZm9yIChpIGluIDE6NCkgewogICMgRXh0cmFjdCBhbmNob3IKICBsb29wX2NsdXN0ZXIgPC0gZ2V0KHBhc3RlMCgibG9vcC5jbHVzdGVyIiwgaSkpCiAgYW5jaG9yIDwtIGV4dHJhY3RBbmNob3IobG9vcF9jbHVzdGVyKQogIAogICMgRmluZCBvdmVybGFwcyBhbmQgaW50ZXJzZWN0CiAgb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvciwgYXRhYy5ncikKICBhbmNob3IgPC0gcGludGVyc2VjdChhbmNob3JbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKICAKICAjIFN0b3JlIGFuY2hvcgogIGFuY2hvcnNbW2ldXSA8LSBhbmNob3IKICAKICAjIFJ1biBMT0xBCiAgcmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLCBhbmNob3IuYWxsLCBsb2xhREIpCiAgdGIgPC0gYXNfdGliYmxlKHJlc3VsdCkKICAKICAjIEZpbHRlciBhbmQgc3VtbWFyaXplCiAgdGIgPC0gdGIgJT4lCiAgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiUKICAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUKICAgIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQogIAogICMgU3RvcmUgdGIKICB0YnNbW2ldXSA8LSB0YgogIAogICMgU2VsZWN0IGFuZCByZW5hbWUgb2Rkc1JhdGlvCiAgdGVtcCA8LSB0YiAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbykKICBjb2xuYW1lcyh0ZW1wKSA8LSBjKCJ0YXJnZXQiLCBwYXN0ZTAoIk9SX2MiLCBpKSkKICAKICAjIFN0b3JlIHRlbXAKICB0ZW1wc1tbaV1dIDwtIHRlbXAKfQoKIyBNZXJnZSBhbGwgdGVtcCB0YWJsZXMgaW50byBvbmUKdGVtcCA8LSBSZWR1Y2UoZnVuY3Rpb24oeCwgeSkgZnVsbF9qb2luKHgsIHksIGJ5ID0gInRhcmdldCIpLCB0ZW1wcykgJT4lCiAgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSkKZGF0YSA8LSB0ZW1wICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoInRhcmdldCIpICU+JSBhcy5tYXRyaXgoKQoKbGlicmFyeShjaXJjbGl6ZSkKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMSwgbWF4KGRhdGEpKSwgYygid2hpdGUiLCAicmVkIikpCgoKI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9ICJ3c3MiKQoKcCA8LSBIZWF0bWFwKAogIGRhdGEsCiAgbmFtZSA9ICJPZGRzIFJhdGlvIiwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZAogIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtCiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLAogIGNvbCA9IGNvbF9mdW4sCiAgYm9yZGVyID0gVFJVRQopCmBgYAoKCiMjIyBBNDg1CiMjIyMjIC0gTGltaXRlZCB0byBBVEFDLXNlcSBzaWduYWwsIGFsbCBsb29wIGJhY2tncm91cGQKYGBge3J9CmF0YWMgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkIikpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpCmNvbG5hbWVzKGF0YWMpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQphdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKQoKIyBMT0FESU5HIExPT1BTCiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvcgpsb29wLmFsbCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2IikpCmFuY2hvci5hbGwgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5hbGwpKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLmFsbCwgYXRhYy5ncikKYW5jaG9yLmFsbCA8LSBwaW50ZXJzZWN0KGFuY2hvci5hbGxbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkKYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwLCBhdGFjLmdyKQphbmNob3IudXAgPC0gcGludGVyc2VjdChhbmNob3IudXBbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX0E0ODV2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlIikpCmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgYXRhYy5ncikKYW5jaG9yLmRvd24gPC0gcGludGVyc2VjdChhbmNob3IuZG93bltxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKbG9vcE51bSA8LSBucm93KGxvb3AuZG93bikKCiMgU2VsZWN0aW5nIHNhbWUgbnVtYmVyIG9mIGV4dHJlbWUgbm8gbG9vcHMKbG9vcC5ubyA8LSBsb29wLmFsbCAlPiUgCiAgZHBseXI6Om11dGF0ZShhYnNEaWZmID0gYWJzKGRpZmZfQTQ4NV9ETVNPKSkgJT4lCiAgZHBseXI6OmZpbHRlcihhYnNEaWZmIDwgMC4yKSAlPiUKICBkcGx5cjo6YXJyYW5nZShhYnNEaWZmKSAlPiUgc2xpY2VfaGVhZChuID0gbG9vcE51bSkKYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vLCBhdGFjLmdyKQphbmNob3Iubm8gPC0gcGludGVyc2VjdChhbmNob3Iubm9bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKYGBgCgpgYGB7cn0KIyBSVU5OSU5HIExPTEEKbG9sYURpciA8LSBoZXJlKCIuLi8uLi9yZXN1bHQvbG9sYSIpCmRpci5jcmVhdGUobG9sYURpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpCgojIFVQCnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLnVwLCBhbmNob3IuYWxsLCBsb2xhREIpCnRiID0gYXNfdGliYmxlKHJlc3VsdCkKZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsICJMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX3VwX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3YiKSwgc2VwID0gIlx0IikKCiMgTk8KcmVzdWx0ID0gcnVuTE9MQShhbmNob3Iubm8sIGFuY2hvci5hbGwsIGxvbGFEQikKdGIgPSBhc190aWJibGUocmVzdWx0KQpmd3JpdGUodGIsIGhlcmUobG9sYURpciwgIkxPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfbm9fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdiIpLCBzZXAgPSAiXHQiKQoKIyBET1dOCnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLmRvd24sIGFuY2hvci5hbGwsIGxvbGFEQikKdGIgPSBhc190aWJibGUocmVzdWx0KQpmd3JpdGUodGIsIGhlcmUobG9sYURpciwgIkxPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfZG93bl9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2IiksIHNlcCA9ICJcdCIpCgoKCiMjIyBIRUFUTUFQCmFscGhhIDwtIDAuMDUKdGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCAiTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl91cF9hbGxMb29wc19leHRyZW1lX2F0YWMudHN2IikpICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCAiTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9ub19hbGxMb29wc19leHRyZW1lX2F0YWMudHN2IikpICU+JQogIGRwbHlyOjptdXRhdGUodGFyZ2V0ID0gdG91cHBlcihhbnRpYm9keSkpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX2Rvd25fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCgp0ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLnVwKSA8LSBjKCJ0YXJnZXQiLCAiT1JfdXAiKQp0ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLm5vKSA8LSBjKCJ0YXJnZXQiLCAiT1Jfbm8iKQp0ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbykKY29sbmFtZXModGVtcC5kb3duKSA8LSBjKCJ0YXJnZXQiLCAiT1JfZG93biIpCgoKdGVtcCA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAudXAsIHRlbXAubm8sIGJ5ID0gYygidGFyZ2V0IikpLCB0ZW1wLmRvd24sIGJ5ID0gYygidGFyZ2V0IikpICU+JSBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKQoKZGF0YSA8LSBhcy5tYXRyaXgodGVtcFsyOjRdKQpyb3duYW1lcyhkYXRhKSA8LSB0ZW1wJHRhcmdldAoKbGlicmFyeShjaXJjbGl6ZSkKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMobWluKGRhdGEpLCBtYXgoZGF0YSkpLCBjKCJ3aGl0ZSIsICJyZWQiKSkKCgojZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gIndzcyIpCgpwIDwtIEhlYXRtYXAoCiAgZGF0YSwKICBuYW1lID0gIk9kZHMgUmF0aW8iLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kCiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsICAgICAgICAgICAgIyBSZW1vdmUgY29sdW1uIGRlbmRyb2dyYW0KICByb3dfa20gPSA1LCAgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmluZSB0aGUgbnVtYmVyIG9mIGstbWVhbnMgY2x1c3RlcnMgZm9yIHJvd3MgKGFkanVzdCBhcyBuZWVkZWQpCiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLAogIGNvbCA9IGNvbF9mdW4sCiAgYm9yZGVyID0gVFJVRQopCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImFuY2hvckxPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfYWxsTG9vcHNfZXh0cmVtZV9yZWdBbmNob3JCYWNrZ3JvdW5kX2F0YWMiKQpoZWlnaHQgPC0gNwp3aWR0aCA8LSAzLjUKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCgoKCiMjIyBWaXN1YWxpemluZyBwLXZhbHVlIGFuZCBPUgphbHBoYSA8LSAwLjA1CnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgIkxPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfdXBfYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAogICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSwKICAgICAgICAgICAgICAgIGdyb3VwID0gIlVQIikgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQp0Yi5ubyA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX25vX2FsbExvb3BzX2V4dHJlbWVfYXRhYy50c3YiKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSwKICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksCiAgICAgICAgICAgICAgICBncm91cCA9ICJOTyIpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIuZG93biA8LSBmcmVhZChoZXJlKGxvbGFEaXIsICJMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX2Rvd25fYWxsTG9vcHNfZXh0cmVtZV9hdGFjLnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAogICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSwKICAgICAgICAgICAgICAgIGdyb3VwID0gIkRPV04iKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCgp0ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKQp0ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKQp0ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cCkKCnRlbXAgPC0gYmluZF9yb3dzKHRlbXAudXAsIHRlbXAuZG93bikKCm9yZGVyIDwtIHVuaXF1ZShjKCh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJVUCIpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCwgCiAgICAgICAgICAgKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gIkRPV04iKSAlPiUgYXJyYW5nZShkZXNjKG9kZHNSYXRpbykpKSR0YXJnZXQpKQp0ZW1wJHRhcmdldCA8LSBmYWN0b3IodGVtcCR0YXJnZXQsIGxldmVscyA9IHJldihvcmRlcikpCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSB0YXJnZXQsIGNvbG9yID0gcVZhbHVlTG9nLCBzaXplID0gb2Rkc1JhdGlvKSkgKwogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAiYmx1ZSIsIGhpZ2ggPSAicmVkIikgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgKyAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgMykpICsKICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemUKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZCkKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemUKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSAKCmZpbGVOYW1lIDwtIHBhc3RlMCgiYW5jaG9yTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9hbGxMb29wc19leHRyZW1lX09SX3FWYWx1ZV9yZWdBbmNob3JCYWNrZ3JvdW5kX2F0YWMiKQpoZWlnaHQgPC0zCndpZHRoIDwtIDIKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgojIyMjIyAtIExpbWl0ZWQgdG8gQVRBQy1zZXEgc2lnbmFsLCByZWcgbG9vcCBiYWNrZ3JvdXVuZCAKYGBge3J9CmF0YWMgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkIikpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpCmNvbG5hbWVzKGF0YWMpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQphdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKQoKIyBMT0FESU5HIExPT1BTCiMjIyBJbXBvcnRpbmcgZGlmZmVyZW50aWFsIHJlZ3VsYXRvcnkgbG9vcHMgJiBleHRyYWN0IGFuY2hvcgpsb29wLmFsbCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2IikpICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYygiUC1QIiwgIlAtRSIsICJFLUUiKSkKYW5jaG9yLmFsbCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmFsbCkpCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuYWxsLCBhdGFjLmdyKQphbmNob3IuYWxsIDwtIHBpbnRlcnNlY3QoYW5jaG9yLmFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKbG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19VUF9kaWZmMC4yLmJlZHBlIikpCmFuY2hvci51cCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cCwgYXRhYy5ncikKYW5jaG9yLnVwIDwtIHBpbnRlcnNlY3QoYW5jaG9yLnVwW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgpsb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX05PX2RpZmYwLjIuYmVkcGUiKSkKYW5jaG9yLm5vIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vLCBhdGFjLmdyKQphbmNob3Iubm8gPC0gcGludGVyc2VjdChhbmNob3Iubm9bcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGUiKSkKYW5jaG9yLmRvd24gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBhdGFjLmdyKQphbmNob3IuZG93biA8LSBwaW50ZXJzZWN0KGFuY2hvci5kb3duW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgoKYGBgCgpgYGB7cn0KIyBSVU5OSU5HIExPTEEKbG9sYURpciA8LSBoZXJlKCIuLi8uLi9yZXN1bHQvbG9sYSIpCmRpci5jcmVhdGUobG9sYURpciwgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUpCgojIFVQCnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLnVwLCBhbmNob3IuYWxsLCBsb2xhREIpCnRiID0gYXNfdGliYmxlKHJlc3VsdCkKZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsICJMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX3VwX2F0YWMudHN2IiksIHNlcCA9ICJcdCIpCgojIE5PCnJlc3VsdCA9IHJ1bkxPTEEoYW5jaG9yLm5vLCBhbmNob3IuYWxsLCBsb2xhREIpCnRiID0gYXNfdGliYmxlKHJlc3VsdCkKZndyaXRlKHRiLCBoZXJlKGxvbGFEaXIsICJMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX25vX2F0YWMudHN2IiksIHNlcCA9ICJcdCIpCgojIERPV04KcmVzdWx0ID0gcnVuTE9MQShhbmNob3IuZG93biwgYW5jaG9yLmFsbCwgbG9sYURCKQp0YiA9IGFzX3RpYmJsZShyZXN1bHQpCmZ3cml0ZSh0YiwgaGVyZShsb2xhRGlyLCAiTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9kb3duX2F0YWMudHN2IiksIHNlcCA9ICJcdCIpCgoKCiMjIyBIRUFUTUFQCmFscGhhIDwtIDAuMDUKdGIudXAgPC0gZnJlYWQoaGVyZShsb2xhRGlyLCAiTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl91cF9hdGFjLnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCnRiLm5vIDwtIGZyZWFkKGhlcmUobG9sYURpciwgIkxPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfbm9fYXRhYy50c3YiKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSkgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQp0Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgIkxPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfZG93bl9hdGFjLnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCgp0ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLnVwKSA8LSBjKCJ0YXJnZXQiLCAiT1JfdXAiKQp0ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvKQpjb2xuYW1lcyh0ZW1wLm5vKSA8LSBjKCJ0YXJnZXQiLCAiT1Jfbm8iKQp0ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbykKY29sbmFtZXModGVtcC5kb3duKSA8LSBjKCJ0YXJnZXQiLCAiT1JfZG93biIpCgoKdGVtcCA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAudXAsIHRlbXAubm8sIGJ5ID0gYygidGFyZ2V0IikpLCB0ZW1wLmRvd24sIGJ5ID0gYygidGFyZ2V0IikpICU+JSBtdXRhdGVfYWxsKH5yZXBsYWNlX25hKC4sIDEpKQoKZGF0YSA8LSBhcy5tYXRyaXgodGVtcFsyOjRdKQpyb3duYW1lcyhkYXRhKSA8LSB0ZW1wJHRhcmdldAoKbGlicmFyeShjaXJjbGl6ZSkKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMobWluKGRhdGEpLCBtYXgoZGF0YSkpLCBjKCJ3aGl0ZSIsICJyZWQiKSkKCgpwIDwtIEhlYXRtYXAoCiAgZGF0YSwKICBuYW1lID0gIk9kZHMgUmF0aW8iLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kCiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsICAgICAgICAgICAgIyBSZW1vdmUgY29sdW1uIGRlbmRyb2dyYW0KICByb3dfa20gPSA0LCAgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmluZSB0aGUgbnVtYmVyIG9mIGstbWVhbnMgY2x1c3RlcnMgZm9yIHJvd3MgKGFkanVzdCBhcyBuZWVkZWQpCiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLAogIGNvbCA9IGNvbF9mdW4gICAgICAgICAgICAgICAgICAgICAgICMgVXNlIHRoZSByZWQgZ3JhZGllbnQgY29sb3Igc2NhbGUKKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJhbmNob3JMT0xBX0E0ODVfdnNfRE1TT19kaWZmMC4yX3JlZ0FuY2hvckJhY2tncm91bmRfYXRhYyIpCmhlaWdodCA8LSA3CndpZHRoIDwtIDMuNQpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKCiMjIyBWaXN1YWxpemluZyBwLXZhbHVlIGFuZCBPUgphbHBoYSA8LSAwLjA1CnRiLnVwIDwtIGZyZWFkKGhlcmUobG9sYURpciwgIkxPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfdXBfYXRhYy50c3YiKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0YXJnZXQgPSB0b3VwcGVyKGFudGlib2R5KSwKICAgICAgICAgICAgICAgIHFWYWx1ZUxvZyA9IC1sb2cyKHFWYWx1ZSksCiAgICAgICAgICAgICAgICBncm91cCA9ICJVUCIpICU+JQogIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCBhbHBoYSkgJT4lIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogIHNsaWNlX21pbihtZWFuUm5rLCB3aXRoX3RpZXMgPSBGQUxTRSkKdGIubm8gPC0gZnJlYWQoaGVyZShsb2xhRGlyLCAiTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9ub19hdGFjLnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAogICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSwKICAgICAgICAgICAgICAgIGdyb3VwID0gIk5PIikgJT4lCiAgZmlsdGVyKHN0cl90b19sb3dlcihjZWxsVHlwZSkgPT0gImVtYnJ5b25pYyBzdGVtIGNlbGwiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUgZHBseXI6Omdyb3VwX2J5KHRhcmdldCkgJT4lCiAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQp0Yi5kb3duIDwtIGZyZWFkKGhlcmUobG9sYURpciwgIkxPTEFfQTQ4NV92c19ETVNPX2RpZmYwLjJfZG93bl9hdGFjLnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpLAogICAgICAgICAgICAgICAgcVZhbHVlTG9nID0gLWxvZzIocVZhbHVlKSwKICAgICAgICAgICAgICAgIGdyb3VwID0gIkRPV04iKSAlPiUKICBmaWx0ZXIoc3RyX3RvX2xvd2VyKGNlbGxUeXBlKSA9PSAiZW1icnlvbmljIHN0ZW0gY2VsbCIpICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgYWxwaGEpICU+JSBkcGx5cjo6Z3JvdXBfYnkodGFyZ2V0KSAlPiUKICBzbGljZV9taW4obWVhblJuaywgd2l0aF90aWVzID0gRkFMU0UpCgp0ZW1wLnVwIDwtIHRiLnVwICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKQp0ZW1wLm5vIDwtIHRiLm5vICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgb2Rkc1JhdGlvLCBxVmFsdWVMb2csIGdyb3VwKQp0ZW1wLmRvd24gPC0gdGIuZG93biAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbywgcVZhbHVlTG9nLCBncm91cCkKCnRlbXAgPC0gYmluZF9yb3dzKHRlbXAudXAsIHRlbXAuZG93bikKCm9yZGVyIDwtIGMoKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gIlVQIikgJT4lIGFycmFuZ2UoZGVzYyhvZGRzUmF0aW8pKSkkdGFyZ2V0LCAKICAgICAgICAgICAodGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiRE9XTiIpICU+JSBhcnJhbmdlKGRlc2Mob2Rkc1JhdGlvKSkpJHRhcmdldCkKdGVtcCR0YXJnZXQgPC0gZmFjdG9yKHRlbXAkdGFyZ2V0LCBsZXZlbHMgPSByZXYob3JkZXIpKQpwIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gdGFyZ2V0LCBjb2xvciA9IHFWYWx1ZUxvZywgc2l6ZSA9IG9kZHNSYXRpbykpICsKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICsKICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgIyBTZXQgYXhpcyB0ZXh0IHNpemUKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgYXhpcyB0aXRsZSBzaXplIChpZiBub3QgcmVtb3ZlZCkKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICMgU2V0IGxlZ2VuZCB0ZXh0IHNpemUKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKSAKCmZpbGVOYW1lIDwtIHBhc3RlMCgiYW5jaG9yTE9MQV9BNDg1X3ZzX0RNU09fZGlmZjAuMl9PUl9xVmFsdWVfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjIikKaGVpZ2h0IDwtMwp3aWR0aCA8LSAyCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKCiMjIFsyLjIyXSBDb21wYXJpbmcgYWJzb2x1dGUgUk5BIGV4cHJlc3Npb24gbGV2ZWwgYWNyb3NzIGdyb3VwClRoZSBhaW0gaXMgdG8gc2VlIGlmIHRoZXJlIGlzIGEgdHJlbmQgaW4gUk5BIGV4cHJlc3Npb24gbGV2ZWwgYW1vbmcgZ3JvdXAgMSwgMiwgMywgNC4KSXQgd291bGQgYmUgbWFraW5nIGNvbXBhcmlzb24gYW1vbmcgZ2VuZXMuIEZvciB0aGlzLCBUUE0gc2hvdWxkIGJlIHVzZWQuCmBgYHtyfQojIyBJbXBvcnRpbmcgZ3JvdXBzCmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2IikpJGdlbmUKZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3YiKSkkZ2VuZQpncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdiIpKSRnZW5lCmdyb3VwOCA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2IikpJGdlbmUKCiMjIEltcG9ydGluZyBSTkEtc2VxIFRQTSBmb3IgRE1TTwp0cG0uc2VsZWN0ZWQgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJyZWFkQ291bnQuZmlsdGVyZWQuVFBNLmFsbC50c3YiKSkgJT4lIGRwbHlyOjpzZWxlY3QoMSwgMywgNCwgNSkKY29sbmFtZXModHBtLnNlbGVjdGVkKSA8LSBjKCJlbnNlbWJsIiwgInJlcDEiLCAicmVwMiIsICJyZXAzIikKCnRwbS5zZWxlY3RlZCA8LSB0cG0uc2VsZWN0ZWQgJT4lIGRwbHlyOjpyb3d3aXNlKCkgJT4lCiAgZHBseXI6Om11dGF0ZSgKICBncm91cCA9IGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXAxLCAiZ3JvdXAxIiwKICAgICAgICAgICAgICAgICBpZmVsc2UoZW5zZW1ibCAlaW4lIGdyb3VwMiwgImdyb3VwMiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA1LCAiZ3JvdXA1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlbnNlbWJsICVpbiUgZ3JvdXA4LCAiZ3JvdXA4IiwgTkEpKSkpKSAlPiUgCiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKSAlPiUKICBkcGx5cjo6bXV0YXRlKGF2Z1RQTSA9IG1lYW4ocmVwMSwgcmVwMiwgcmVwMykpCgoKZ2dwbG90KHRwbS5zZWxlY3RlZCwgYWVzKHggPSBncm91cCwgeSA9IGF2Z1RQTSkpICsKICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArIAogIHNjYWxlX3lfbG9nMTAoKSArCiAgdGhlbWVfY2xhc3NpYygpCgoKCiAgcCA8LSBnZ3Bsb3QodGVtcC50YiwgYWVzKHggPSBncm91cCwgeSA9IHNjb3JlKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeW1pbiwgeW1heCkpICsKICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSB5bWluICsgMSwgbGFiZWwgPSBwYXN0ZTAoInAxMjogIiwgY29udlB2YWx1ZShwMTIpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDE1OiAiLCBjb252UHZhbHVlKHAxNSksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMTg6ICIsIGNvbnZQdmFsdWUocDE4KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyNTogIiwgY29udlB2YWx1ZShwMjUpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDI4OiAiLCBjb252UHZhbHVlKHAyOCksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwNTg6ICIsY29udlB2YWx1ZSggcDU4KSwgIlxuIiksCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpCiAgCiAgCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJpbnN1bGF0aW9uX3Njb3JlXyIsIG5vdGUpCiAgaGVpZ2h0IDwtIDMKICB3aWR0aCA8LSAzCiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCmBgYAoKIyMgWzIuMjNdIENoZWNraW5nIEVhcmx5IGdlbmUgZnJvbSBCb2JiaWUKIyMjIyBkVEFHCmBgYHtyfQojIyBJbXBvcnRpbmcgZ3JvdXBzCmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDEudHN2IikpJGdlbmUKZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2dyb3VwMi50c3YiKSkkZ2VuZQpncm91cDUgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA1LnRzdiIpKSRnZW5lCmdyb3VwOCA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2IikpJGdlbmUKCgojIyBJbXBvcnRpbmcgQm9iYmllIGdlbmUgY2xhc3NpZmljYXRpb24KZ2VuZUNsdXN0ZXIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJib2JiaWVfZ2VuZV9jbGFzc2lmaWNhdGlvbi5jc3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChnZW5lLCBlbnN0LCBDbHVzdGVyKQpjb2xuYW1lcyhnZW5lQ2x1c3RlcikgPC0gYygiZ2VuZSIsICJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiLCAiY2x1c3RlciIpCgoKIyMgQ29udmVydGluZyB0cmFuc2NyaXB0IElEIHRvIGdlbmUgSUQKaWRQYWlyX3RnIDwtIGdldEJNKGF0dHJpYnV0ZXMgPSBjKCJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiLCAiZW5zZW1ibF9nZW5lX2lkIiksCiAgICAgICAgICAgICAgICAgZmlsdGVycyA9ICJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiLAogICAgICAgICAgICAgICAgIHZhbHVlcyA9IGdlbmVDbHVzdGVyJGVuc2VtYmxfdHJhbnNjcmlwdCwKICAgICAgICAgICAgICAgICBtYXJ0ID0gZW5zZW1ibC52MTAyKQpnZW5lQ2x1c3RlciA8LSBnZW5lQ2x1c3RlciAlPiUgZHBseXI6OmxlZnRfam9pbihpZFBhaXJfdGcsIGJ5ID0gYygiZW5zZW1ibF90cmFuc2NyaXB0X2lkIikpCgojIE1ha2luZyBkYXRhIGZvciBzdGFja2VkIGJhcnBsb3QKY291bnRHZW5lIDwtIGZ1bmN0aW9uKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsIGNsdXN0ZXJOYW1lKXsKICBudW0gPC0gbnJvdyhnZW5lQ2x1c3RlciAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsX2dlbmVfaWQgJWluJSBncm91cE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciAlaW4lIGNsdXN0ZXJOYW1lKSkKICByZXR1cm4obnVtKQp9CmNvdW50R2VuZUxpc3QgPC0gZnVuY3Rpb24oZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSl7CiAgbjEgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsICJFYXJseSIpCiAgbjIgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsICJNaWRkbGUiKQogIG4zIDwtY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsICJMYXRlIikKICBuNCA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgIlRyYW5zaWVudCIpCiAgcmV0dXJuKGMobjEsIG4yLCBuMywgbjQpKQp9Cgpncm91cCA8LSBjKHJlcCgiZ3JvdXAxIiwgNCksIHJlcCgiZ3JvdXAyIiwgNCksIHJlcCgiZ3JvdXAzIiwgNCksIHJlcCgiZ3JvdXA0IiwgNCkpCmNsdXN0ZXIgPC0gcmVwKGMoIkVhcmx5IiwgIk1pZGRsZSIsICJMYXRlIiwgIlRyYW5zaWVudCIpLCA0KQpjbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKCJFYXJseSIsICJNaWRkbGUiLCAiTGF0ZSIsICJUcmFuc2llbnQiKSkKdmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDEpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdyb3VwMiksCiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA1KSwKICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDgpKQoKZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSkKCgojIFBsb3R0aW5nCmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIiwgc3RhdD0iaWRlbnRpdHkiKSArIHRoZW1lX2NsYXNzaWMoKQoKCiMgU3RhdGlzdGljYWwgYW5hbHlzaXMgCiMgU2ltaWxhciB0byB0aGUgQ2hpLVNxdWFyZSB0ZXN0LCBGaXNoZXLigJlzIEV4YWN0IFRlc3QgaXMgdXNlZCB3aGVuIHlvdSBoYXZlIHNtYWxsZXIgc2FtcGxlIHNpemVzIG9yIHdoZW4gdGhlIGV4cGVjdGVkIGZyZXF1ZW5jeSBpbiBhbnkgY2VsbCBvZiB0aGUgY29udGluZ2VuY3kgdGFibGUgaXMgYmVsb3cgNS4KdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYygiZ3JvdXAxIiwgImdyb3VwMiIpKQpjb250aW5nZW5jeV90YWJsZSA8LSB4dGFicyh2YWx1ZSB+IGdyb3VwICsgY2x1c3RlciwgZGF0YSA9IHRlbXApCmZpc2hlcl9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCBCID0gMTAwMDAwKQpmaXNoZXJfcmVzdWx0Cgp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKCJncm91cDEiLCAiZ3JvdXAzIikpCmNvbnRpbmdlbmN5X3RhYmxlIDwtIHh0YWJzKHZhbHVlIH4gZ3JvdXAgKyBjbHVzdGVyLCBkYXRhID0gdGVtcCkKZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEIgPSAxMDAwMDApCmZpc2hlcl9yZXN1bHQKCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoImdyb3VwMSIsICJncm91cDQiKSkKY29udGluZ2VuY3lfdGFibGUgPC0geHRhYnModmFsdWUgfiBncm91cCArIGNsdXN0ZXIsIGRhdGEgPSB0ZW1wKQpmaXNoZXJfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSwgQiA9IDEwMDAwMCkKZmlzaGVyX3Jlc3VsdAoKCiMjIyBQLU4KcmVzdWx0RGlyIDwtIGhlcmUoIi4uLy4uL3Jlc3VsdCIpCnRlbXAyIDwtIHJlYWRSRFMoaGVyZShyZXN1bHREaXIsICJnZW5lX2xvb3BfbGluay5yZHMiKSkKCnBuT3ZlcjggPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDgpKSRnZW5lCnBuT3ZlcjYgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsID49IDYsIHRvdGFsIDwgOCkpJGdlbmUKcG5PdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIodG90YWwgPj0gNCwgdG90YWwgPCA2KSkkZ2VuZQpwbk92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcih0b3RhbCA+PSAyLCB0b3RhbCA8IDQpKSRnZW5lCnBuT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKHRvdGFsIDwgMikpJGdlbmUKCmdyb3VwIDwtIGMocmVwKCJwbk92ZXI4IiwgNCksIHJlcCgicG5PdmVyNiIsIDQpLCByZXAoInBuT3ZlcjQiLCA0KSwgcmVwKCJwbk92ZXIyIiwgNCksIHJlcCgicG5PdmVyMCIsIDQpKQpjbHVzdGVyIDwtIHJlcChjKCJFYXJseSIsICJNaWRkbGUiLCAiTGF0ZSIsICJUcmFuc2llbnQiKSwgNSkKY2x1c3RlciA8LSBmYWN0b3IoY2x1c3RlciwgbGV2ZWxzID0gYygiRWFybHkiLCAiTWlkZGxlIiwgIkxhdGUiLCAiVHJhbnNpZW50IikpCnZhbHVlIDwtIGMoY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcG5PdmVyOCksCiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcG5PdmVyNiksCiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcG5PdmVyNCksCiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcG5PdmVyMiksCiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgcG5PdmVyMCkpCgpkYXRhIDwtIGRhdGEuZnJhbWUoZ3JvdXAsIGNsdXN0ZXIsIHZhbHVlKQojIFBsb3R0aW5nCmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIiwgc3RhdD0iaWRlbnRpdHkiKSArIHRoZW1lX2NsYXNzaWMoKQoKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYygicG5PdmVyMiIsICJwbk92ZXI4IikpCmNvbnRpbmdlbmN5X3RhYmxlIDwtIHh0YWJzKHZhbHVlIH4gZ3JvdXAgKyBjbHVzdGVyLCBkYXRhID0gdGVtcCkKZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEIgPSAxMDAwMDApCmZpc2hlcl9yZXN1bHQKCiMjIyBQLVMKcHNPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDQpKSRnZW5lCnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZQpwc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMiwgbnVtX3BzIDwgMykpJGdlbmUKcHNPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDEsIG51bV9wcyA8IDIpKSRnZW5lCnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lCgpncm91cCA8LSBjKHJlcCgicHNPdmVyNCIsIDQpLCByZXAoInBzT3ZlcjMiLCA0KSwgcmVwKCJwc092ZXIyIiwgNCksIHJlcCgicHNPdmVyMSIsIDQpLCByZXAoInBzT3ZlcjAiLCA0KSkKY2x1c3RlciA8LSByZXAoYygiRWFybHkiLCAiTWlkZGxlIiwgIkxhdGUiLCAiVHJhbnNpZW50IiksIDUpCmNsdXN0ZXIgPC0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoIkVhcmx5IiwgIk1pZGRsZSIsICJMYXRlIiwgIlRyYW5zaWVudCIpKQp2YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBzT3ZlcjQpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBzT3ZlcjMpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBzT3ZlcjIpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBzT3ZlcjEpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBzT3ZlcjApKQoKZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSkKIyBQbG90dGluZwpnZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIHN0YXQ9ImlkZW50aXR5IikgKyB0aGVtZV9jbGFzc2ljKCkKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYygicHNPdmVyMiIsICJwc092ZXI0IikpCmNvbnRpbmdlbmN5X3RhYmxlIDwtIHh0YWJzKHZhbHVlIH4gZ3JvdXAgKyBjbHVzdGVyLCBkYXRhID0gdGVtcCkKZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEIgPSAxMDAwMDApCmZpc2hlcl9yZXN1bHQKCiMjIyBQLUUKcGVPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDQpKSRnZW5lCnBlT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAzLCBudW1fcGUgPCA0KSkkZ2VuZQpwZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmUKcGVPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDEsIG51bV9wZSA8IDIpKSRnZW5lCnBlT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA8IDEpKSRnZW5lCgpncm91cCA8LSBjKHJlcCgicGVPdmVyNCIsIDQpLCByZXAoInBlT3ZlcjMiLCA0KSwgcmVwKCJwZU92ZXIyIiwgNCksIHJlcCgicGVPdmVyMSIsIDQpLCByZXAoInBlT3ZlcjAiLCA0KSkKY2x1c3RlciA8LSByZXAoYygiRWFybHkiLCAiTWlkZGxlIiwgIkxhdGUiLCAiVHJhbnNpZW50IiksIDUpCmNsdXN0ZXIgPC0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoIkVhcmx5IiwgIk1pZGRsZSIsICJMYXRlIiwgIlRyYW5zaWVudCIpKQp2YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBlT3ZlcjQpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBlT3ZlcjMpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBlT3ZlcjIpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBlT3ZlcjEpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBlT3ZlcjApKQoKZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSkKIyBQbG90dGluZwpnZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIHN0YXQ9ImlkZW50aXR5IikgKyB0aGVtZV9jbGFzc2ljKCkKCiMjIyBQLVAKcHBPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDQpKSRnZW5lCnBwT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAzLCBudW1fcHAgPCA0KSkkZ2VuZQpwcE92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmUKcHBPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDEsIG51bV9wcCA8IDIpKSRnZW5lCnBwT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA8IDEpKSRnZW5lCgpncm91cCA8LSBjKHJlcCgicHBPdmVyNCIsIDQpLCByZXAoInBwT3ZlcjMiLCA0KSwgcmVwKCJwcE92ZXIyIiwgNCksIHJlcCgicHBPdmVyMSIsIDQpLCByZXAoInBwT3ZlcjAiLCA0KSkKY2x1c3RlciA8LSByZXAoYygiRWFybHkiLCAiTWlkZGxlIiwgIkxhdGUiLCAiVHJhbnNpZW50IiksIDUpCmNsdXN0ZXIgPC0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoIkVhcmx5IiwgIk1pZGRsZSIsICJMYXRlIiwgIlRyYW5zaWVudCIpKQp2YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBwT3ZlcjQpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBwT3ZlcjMpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBwT3ZlcjIpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBwT3ZlcjEpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIHBwT3ZlcjApKQpkYXRhIDwtIGRhdGEuZnJhbWUoZ3JvdXAsIGNsdXN0ZXIsIHZhbHVlKQojIFBsb3R0aW5nCmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIiwgc3RhdD0iaWRlbnRpdHkiKSArIHRoZW1lX2NsYXNzaWMoKQoKYGBgCiMjIyMgQTQ4NQpgYGB7cn0KIyMgSW1wb3J0aW5nIGdyb3Vwcwpncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXAxLnRzdiIpKSRnZW5lCmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDIudHN2IikpJGdlbmUKZ3JvdXAzIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwMy50c3YiKSkkZ2VuZQpncm91cDQgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA0LnRzdiIpKSRnZW5lCmdyb3VwNSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDUudHN2IikpJGdlbmUKZ3JvdXA2IDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwNi50c3YiKSkkZ2VuZQpncm91cDcgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9BNDg1X3ZzX0RNU09fUk5BX2xvb3BfZ3JvdXA3LnRzdiIpKSRnZW5lCmdyb3VwOCA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X0E0ODVfdnNfRE1TT19STkFfbG9vcF9ncm91cDgudHN2IikpJGdlbmUKZ3JvdXA5IDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfQTQ4NV92c19ETVNPX1JOQV9sb29wX2dyb3VwOS50c3YiKSkkZ2VuZQoKCiMjIEltcG9ydGluZyBCb2JiaWUgZ2VuZSBjbGFzc2lmaWNhdGlvbgpnZW5lQ2x1c3RlciA8LSBmcmVhZChoZXJlKHJlZkRpciwgImJvYmJpZV9nZW5lX2NsYXNzaWZpY2F0aW9uLmNzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGdlbmUsIGVuc3QsIENsdXN0ZXIpCmNvbG5hbWVzKGdlbmVDbHVzdGVyKSA8LSBjKCJnZW5lIiwgImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIsICJjbHVzdGVyIikKCgojIyBDb252ZXJ0aW5nIHRyYW5zY3JpcHQgSUQgdG8gZ2VuZSBJRAppZFBhaXJfdGcgPC0gZ2V0Qk0oYXR0cmlidXRlcyA9IGMoImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIsICJlbnNlbWJsX2dlbmVfaWQiKSwKICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIsCiAgICAgICAgICAgICAgICAgdmFsdWVzID0gZ2VuZUNsdXN0ZXIkZW5zZW1ibF90cmFuc2NyaXB0LAogICAgICAgICAgICAgICAgIG1hcnQgPSBlbnNlbWJsLnYxMDIpCmdlbmVDbHVzdGVyIDwtIGdlbmVDbHVzdGVyICU+JSBkcGx5cjo6bGVmdF9qb2luKGlkUGFpcl90ZywgYnkgPSBjKCJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiKSkKCiMgTWFraW5nIGRhdGEgZm9yIHN0YWNrZWQgYmFycGxvdApjb3VudEdlbmUgPC0gZnVuY3Rpb24oZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgY2x1c3Rlck5hbWUpewogIG51bSA8LSBucm93KGdlbmVDbHVzdGVyICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdyb3VwTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyICVpbiUgY2x1c3Rlck5hbWUpKQogIHJldHVybihudW0pCn0KY291bnRHZW5lTGlzdCA8LSBmdW5jdGlvbihnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lKXsKICBuMSA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgIkVhcmx5IikKICBuMiA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgIk1pZGRsZSIpCiAgbjMgPC1jb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgIkxhdGUiKQogIG40IDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCAiVHJhbnNpZW50IikKICByZXR1cm4oYyhuMSwgbjIsIG4zLCBuNCkpCn0KCmdyb3VwIDwtIGMocmVwKCJncm91cDEiLCA0KSwgcmVwKCJncm91cDIiLCA0KSwgcmVwKCJncm91cDMiLCA0KSwKICAgICAgICAgICByZXAoImdyb3VwNCIsIDQpLCByZXAoImdyb3VwNSIsIDQpLCByZXAoImdyb3VwNiIsIDQpLAogICAgICAgICAgIHJlcCgiZ3JvdXA3IiwgNCksIHJlcCgiZ3JvdXA4IiwgNCksIHJlcCgiZ3JvdXA5IiwgNCkpCmNsdXN0ZXIgPC0gcmVwKGMoIkVhcmx5IiwgIk1pZGRsZSIsICJMYXRlIiwgIlRyYW5zaWVudCIpLCA5KQpjbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKCJFYXJseSIsICJNaWRkbGUiLCAiTGF0ZSIsICJUcmFuc2llbnQiKSkKdmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDEpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdyb3VwMiksCiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXAzKSwKICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDQpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdyb3VwNSksCiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA2KSwKICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBncm91cDcpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdyb3VwOCksCiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ3JvdXA5KSkKCmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpCgoKIyBQbG90dGluZwpnZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIHN0YXQ9ImlkZW50aXR5IikgKyB0aGVtZV9jbGFzc2ljKCkKCgojIFN0YXRpc3RpY2FsIGFuYWx5c2lzIAojIFNpbWlsYXIgdG8gdGhlIENoaS1TcXVhcmUgdGVzdCwgRmlzaGVy4oCZcyBFeGFjdCBUZXN0IGlzIHVzZWQgd2hlbiB5b3UgaGF2ZSBzbWFsbGVyIHNhbXBsZSBzaXplcyBvciB3aGVuIHRoZSBleHBlY3RlZCBmcmVxdWVuY3kgaW4gYW55IGNlbGwgb2YgdGhlIGNvbnRpbmdlbmN5IHRhYmxlIGlzIGJlbG93IDUuCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCAlaW4lIGMoImdyb3VwMSIsICJncm91cDIiKSkKY29udGluZ2VuY3lfdGFibGUgPC0geHRhYnModmFsdWUgfiBncm91cCArIGNsdXN0ZXIsIGRhdGEgPSB0ZW1wKQpmaXNoZXJfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSwgQiA9IDEwMDAwMCkKZmlzaGVyX3Jlc3VsdAoKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwICVpbiUgYygiZ3JvdXAxIiwgImdyb3VwMyIpKQpjb250aW5nZW5jeV90YWJsZSA8LSB4dGFicyh2YWx1ZSB+IGdyb3VwICsgY2x1c3RlciwgZGF0YSA9IHRlbXApCmZpc2hlcl9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCBCID0gMTAwMDAwKQpmaXNoZXJfcmVzdWx0Cgp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKCJncm91cDEiLCAiZ3JvdXA0IikpCmNvbnRpbmdlbmN5X3RhYmxlIDwtIHh0YWJzKHZhbHVlIH4gZ3JvdXAgKyBjbHVzdGVyLCBkYXRhID0gdGVtcCkKZmlzaGVyX3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEIgPSAxMDAwMDApCmZpc2hlcl9yZXN1bHQKCgpgYGAKCiMjIFsyLjI0XSBDaGVja2luZyBib29rbWFya2luZwooMSkgQ2hlY2tpbmcgd2hldGhlciBzdWJzZXQgb2YgcmVndWxhdG9yeSBsb29wIGhhdmUgYm9va21hcmtpbmcKKDIpIENoZWNraW5nIHdoZXRoZXIgbG9vcHMgcmVsYXRlZCB0byBnZW5lcyBoYXZlIGJvb2ttYXJraW5nCkgzSzI3YWNfZWZmaWUKQVRBQ19lZmZpZQpUQlAKT2N0NF9lZmZpZSwgT2N0NF9kc2cKU294Ml9lZmZpZSwgU294Ml9kc2cKRXNycmJfZHNnCktsZjRfZWZmaWUKQ1RDRgojIyMjIyBGdW5jdGlvbnMKYGBge3J9CmV4dHJhY3RBbmNob3IgPC0gZnVuY3Rpb24obG9vcCl7CiAgYW5jaG9yMSA8LSBsb29wICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpCiAgY29sbmFtZXMoYW5jaG9yMSkgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCiAgYW5jaG9yMiA8LSBsb29wICU+JSBkcGx5cjo6c2VsZWN0KGMoNCwgNSwgNikpCiAgY29sbmFtZXMoYW5jaG9yMikgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCiAgYW5jaG9ycyA8LSByZWR1Y2UobWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGJpbmRfcm93cyhhbmNob3IxLCBhbmNob3IyKSkpCiAgICByZXR1cm4oYW5jaG9ycykKfQoKcnVuRmlzaGVyRXhhY3QgPC0gZnVuY3Rpb24oaW50ZXJlc3QuZ3IsIGJhY2tncm91bmQuZ3IsIHF1ZXJ5LmdyKXsKICBvdmVybGFwc19pbnRlcmVzdCA8LSBjb3VudE92ZXJsYXBzKGludGVyZXN0LmdyLCBxdWVyeS5ncikKICBhIDwtIHN1bShvdmVybGFwc19pbnRlcmVzdCA+IDApCiAgdG90YWxfaW50ZXJlc3QgPC0gbGVuZ3RoKGludGVyZXN0LmdyKQogIGMgPC0gdG90YWxfaW50ZXJlc3QgLSBhCiAgCiAgb3ZlcmxhcHNfYmFja2dyb3VuZCA8LSBjb3VudE92ZXJsYXBzKGJhY2tncm91bmQuZ3IsIHF1ZXJ5LmdyKQogIGIgPC0gc3VtKG92ZXJsYXBzX2JhY2tncm91bmQgPiAwKQogIHRvdGFsX2JhY2tncm91bmQgPC0gbGVuZ3RoKGJhY2tncm91bmQuZ3IpCiAgZCA8LSB0b3RhbF9iYWNrZ3JvdW5kIC0gYgogIAogICMgQ29uc3RydWN0IGNvbnRpbmdlbmN5IHRhYmxlCiAgY29udGluZ2VuY3lfdGFibGUgPC0gbWF0cml4KGMoYSwgYywgYiwgZCksIG5yb3c9MiwgYnlyb3c9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltbmFtZXM9bGlzdCgiUmVnaW9uIiA9IGMoImludGVyZXN0LmdyIiwgImJhY2tncm91bmQuZ3IiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3ZlcmxhcCIgPSBjKCJZZXMiLCAiTm8iKSkpCiAgCiAgIyBQZXJmb3JtIEZpc2hlcidzIGV4YWN0IHRlc3QKICBmaXNoZXJfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlKQogIAogIHJldHVybihmaXNoZXJfcmVzdWx0KQp9CgpydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uIDwtIGZ1bmN0aW9uKGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkLmdyLCBsb3N0LmdyKXsKICAjIFNFRURJTkcKICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AudXAuZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKQogIHJlc3VsdC50YiA8LSB0aWJibGUoaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCAiX1VQIiksCiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgIl9yZXRhaW5lZCIpLAogICAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKICAKICAjIEFERElORyBST1dTCiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLm5vLmdyLCBiYWNrZ3JvdW5kLmdyLCByZXRhaW5lZC5ncikKICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSAKICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCAiX05PIiksCiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCAiX3JldGFpbmVkIiksCiAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSwKICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKICAKICAjIEFERElORyBST1dTCiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLmRvd24uZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKQogIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIAogICAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsICJfRE9XTiIpLAogICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgIl9yZXRhaW5lZCIpLAogICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsCiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpCiAgCiAgIyBBRERJTkcgUk9XUwogIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC51cC5nciwgYmFja2dyb3VuZC5nciwgbG9zdC5ncikKICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSAKICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCAiX1VQIiksCiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCAiX2xvc3QiKSwKICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKQogIAogICMgQURESU5HIFJPV1MKICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3Aubm8uZ3IsIGJhY2tncm91bmQuZ3IsIGxvc3QuZ3IpCiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgCiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgIl9OTyIpLAogICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgIl9sb3N0IiksCiAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSwKICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKICAKICAjIEFERElORyBST1dTCiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLmRvd24uZ3IsIGJhY2tncm91bmQuZ3IsIGxvc3QuZ3IpCiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgCiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgIl9ET1dOIiksCiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCAiX2xvc3QiKSwKICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKQogIAogIHJldHVybihyZXN1bHQudGIpCn0KCnJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25CaW5hcnkgPC0gZnVuY3Rpb24oaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXBuby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZC5nciwgbG9zdC5ncil7CiAgIyBTRUVESU5HCiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLnVwbm8uZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKQogIHJlc3VsdC50YiA8LSB0aWJibGUoaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCAiX1VQL05PIiksCiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgIl9yZXRhaW5lZCIpLAogICAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKICAKCiAgIyBBRERJTkcgUk9XUwogIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC5kb3duLmdyLCBiYWNrZ3JvdW5kLmdyLCByZXRhaW5lZC5ncikKICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSAKICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCAiX0RPV04iKSwKICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsICJfcmV0YWluZWQiKSwKICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKQogIAogICMgQURESU5HIFJPV1MKICB0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AudXBuby5nciwgYmFja2dyb3VuZC5nciwgbG9zdC5ncikKICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSAKICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCAiX1VQL05PIiksCiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCAiX2xvc3QiKSwKICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKQoKICAKICAjIEFERElORyBST1dTCiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLmRvd24uZ3IsIGJhY2tncm91bmQuZ3IsIGxvc3QuZ3IpCiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgCiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgIl9ET1dOIiksCiAgICAgICAgICAgIHRhcmdldCA9IHBhc3RlMCh0YXJnZXROYW1lLCAiX2xvc3QiKSwKICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKQogIAogIHJldHVybihyZXN1bHQudGIpCn0KCnJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25SZXRhaW5lZCA8LSBmdW5jdGlvbihpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZC5ncil7CiAgIyBTRUVESU5HCiAgdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLnVwLmdyLCBiYWNrZ3JvdW5kLmdyLCByZXRhaW5lZC5ncikKICByZXN1bHQudGIgPC0gdGliYmxlKGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgIl9VUCIpLAogICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsICJfcmV0YWluZWQiKSwKICAgICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpCiAgCiAgIyBBRERJTkcgUk9XUwogIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC5uby5nciwgYmFja2dyb3VuZC5nciwgcmV0YWluZWQuZ3IpCiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgCiAgICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgIl9OTyIpLAogICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgIl9yZXRhaW5lZCIpLAogICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsCiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpCiAgCiAgIyBBRERJTkcgUk9XUwogIHRlbXAgPC0gcnVuRmlzaGVyRXhhY3QobG9vcC5kb3duLmdyLCBiYWNrZ3JvdW5kLmdyLCByZXRhaW5lZC5ncikKICByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSAKICAgIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCAiX0RPV04iKSwKICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsICJfcmV0YWluZWQiKSwKICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKQogIAoKICByZXR1cm4ocmVzdWx0LnRiKQp9CgpydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0IDwtIGZ1bmN0aW9uKHRhcmdldE5hbWUsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncil7CiAgIyBSRVRBSU5FRCBsb29wCiAgcmV0YWluZWQgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJURl9ib29rbWFya2luZyIsIHRhcmdldE5hbWUsICJhbV9hLmJlZCIpKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKQogIGNvbG5hbWVzKHJldGFpbmVkKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKICByZXRhaW5lZC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmV0YWluZWQpCiAgIyBMT1NUIGxvb3AKICBsb3N0IDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiVEZfYm9va21hcmtpbmciLCB0YXJnZXROYW1lLCAib2EuYmVkIikpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpCiAgY29sbmFtZXMobG9zdCkgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCiAgbG9zdC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUobG9zdCkKICAKICByZXN1bHQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvbihpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZC5nciwgbG9zdC5ncikKICAKICByZXR1cm4ocmVzdWx0KQp9CgpydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0QmluYXJ5IDwtIGZ1bmN0aW9uKHRhcmdldE5hbWUsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwbm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKXsKICAjIFJFVEFJTkVEIGxvb3AKICByZXRhaW5lZCA8LSBmcmVhZChoZXJlKHJlZkRpciwgIlRGX2Jvb2ttYXJraW5nIiwgdGFyZ2V0TmFtZSwgImFtX2EuYmVkIikpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpCiAgY29sbmFtZXMocmV0YWluZWQpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQogIHJldGFpbmVkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShyZXRhaW5lZCkKICAjIExPU1QgbG9vcAogIGxvc3QgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJURl9ib29rbWFya2luZyIsIHRhcmdldE5hbWUsICJvYS5iZWQiKSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSkKICBjb2xuYW1lcyhsb3N0KSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKICBsb3N0LmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShsb3N0KQogIAogIHJlc3VsdCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uQmluYXJ5KGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwbm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWQuZ3IsIGxvc3QuZ3IpCiAgCiAgcmV0dXJuKHJlc3VsdCkKfQoKcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkIDwtIGZ1bmN0aW9uKHRhcmdldE5hbWUsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncil7CiAgIyBSRVRBSU5FRCBsb29wCiAgcmV0YWluZWQgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJURl9ib29rbWFya2luZyIsIHRhcmdldE5hbWUsICJhbV9hLmJlZCIpKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKQogIGNvbG5hbWVzKHJldGFpbmVkKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKICByZXRhaW5lZC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmV0YWluZWQpCiAgIyBMT1NUIGxvb3AKICByZXN1bHQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblJldGFpbmVkKGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkLmdyKQogIAogIHJldHVybihyZXN1bHQpCn0KYGBgCgojIyMjIyBBbGwgbG9vcHMKYGBge3J9CiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIGludGVyZXN0CmludGVyZXN0TmFtZSA8LSAiYWxsTG9vcCIKIyBCQUNLR1JPVU5EIGxvb3AKYmFja2dyb3VuZCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsLmJlZHBlIikpCmJhY2tncm91bmQuZ3IgPC0gKGV4dHJhY3RBbmNob3IoYmFja2dyb3VuZCkpCiMgVVAgbG9vcApsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlIikpCmxvb3AudXAuZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC51cCkpCiMgTk8gbG9vcApsb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlIikpCmxvb3Aubm8uZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpCiMgRE9XTiBsb29wCmxvb3BOdW0gPC0gbnJvdyhsb29wLm5vKQpsb29wLmFsbCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkudHN2IikpCmxvb3AuZG93biA8LSBsb29wLmFsbCAlPiUgZHBseXI6OmZpbHRlcihkaWZmX2RUQUdfRE1TTyA8IC0wLjIpICU+JSBkcGx5cjo6YXJyYW5nZShkaWZmX2RUQUdfRE1TTykgJT4lIHNsaWNlX2hlYWQobiA9IGxvb3BOdW0pCmxvb3AuZG93bi5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKQoKIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgdGFyZ2V0CnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkFUQUNfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkNUQ0YiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAzIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkVTUlJCX2RzZyIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiRVNSUkJfTkNCIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJFU1JSQl9wZmEiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA2IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkgzSzI3YWNfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIktMRjRfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIk5BTk9HX2RzZyIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDkgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiTkFOT0dfcGZhIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiT0NUNF9lZmZpZSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDExIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIk9DVDRfZHNnIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMTIgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiT0NUNF9wZmEiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAxMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJTTUMxIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMTQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiU09YMl9lZmZpZSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDE1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIlNPWDJfZHNnIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMTYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiU09YMl9wZmEiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAxNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJUQlAiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCgoKCgpkYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsCiAgICAgICAgIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsCiAgICAgICAgIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYgLHRlbXAxNykKCiMgVmlzdWFsaXphdGlvbgpsaWJyYXJ5KGNpcmNsaXplKQoKaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiUKcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJ0YXJnZXQiKQoKcHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JQogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAidGFyZ2V0IikKCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDUpLCAKICAgICAgICAgICAgICAgICAgICAgIGMoImJsdWUiLCAid2hpdGUiLCAicmVkIikpCgpIZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLAogICAgICAgIG5hbWUgPSAiT2RkcyBSYXRpbyIsCiAgICAgICAgY29sID0gY29sX2Z1biwKICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlcwogICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkgewogICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXQogICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCAibi5zLiIsIHNwcmludGYoIiUuMmUiLCBwdmFsKSkKICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKQogICAgICAgIH0sCiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0CiAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgY29sdW1uX3RpdGxlID0gIkludGVyZXN0IiwKICAgICAgICByb3dfdGl0bGUgPSAiVGFyZ2V0IiwKICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIsIDMsIDQsIDUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiKSkpCmBgYAojIyMjIyBBbGwgbG9vcHMgcmVmaW5lZApgYGB7cn0KCgojIyMjIEltcG9ydGluZyBsb29wcyBvZiB0YXJnZXQKdGVtcDEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiQVRBQ19lZmZpZSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDIgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiQ1RDRiIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiRVNSUkJfZHNnIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wNCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJIM0syN2FjX2VmZmllIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJLTEY0X2VmZmllIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wNiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJOQU5PR19kc2ciLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIk9DVDRfZHNnIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wOCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJTTUMxIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA5IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIlNPWDJfZHNnIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiVEJQIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQoKCgoKZGF0YSA8LSBiaW5kX3Jvd3ModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LAogICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwKQoKIyBWaXN1YWxpemF0aW9uCmxpYnJhcnkoY2lyY2xpemUpCgpoZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JQpwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gInRhcmdldCIpCgpwdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJ0YXJnZXQiKQoKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMyksIAogICAgICAgICAgICAgICAgICAgICAgYygiYmx1ZSIsICJ3aGl0ZSIsICJyZWQiKSkKCkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksCiAgICAgICAgbmFtZSA9ICJPZGRzIFJhdGlvIiwKICAgICAgICBjb2wgPSBjb2xfZnVuLAogICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzCiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7CiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdCiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsICJuLnMuIiwgc3ByaW50ZigiJS4yZSIsIHB2YWwpKQogICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpCiAgICAgICAgfSwKICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXQKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLAogICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSwKICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwKICAgICAgICBjb2x1bW5fdGl0bGUgPSAiSW50ZXJlc3QiLAogICAgICAgIHJvd190aXRsZSA9ICJUYXJnZXQiLAogICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIwIiwgIjEiLCAiMiIsICIzIikpKQoKYGBgCgoKIyMjIyMgUmVnIGxvb3BzCmBgYHtyfQojIyMjIEltcG9ydGluZyBsb29wcyBvZiBpbnRlcmVzdAppbnRlcmVzdE5hbWUgPC0gInJlZ0xvb3AiCiMgQkFDS0dST1VORCBsb29wCmJhY2tncm91bmQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlIikpCmJhY2tncm91bmQuZ3IgPC0gKGV4dHJhY3RBbmNob3IoYmFja2dyb3VuZCkpCiMgVVAgbG9vcApsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkKbG9vcC51cC5nciA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwKSkKIyBOTyBsb29wCmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKQpsb29wLm5vLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKQojIFVQTk8gbG9vcApsb29wLnVwbm8gPC0gYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pCmxvb3AudXBuby5nciA8LSBleHRyYWN0QW5jaG9yKGxvb3AudXBubykKIyBET1dOIGxvb3AKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKQpsb29wLmRvd24uZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSkKYGBgCiMjIyMjIyBGaWd1cmUgLSBIM0syN2FjIG9ubHkKYGBge3J9CnRhcmdldE5hbWUgPC0gIkgzSzI3YWNfZWZmaWUiCiMgUkVUQUlORUQgbG9vcApyZXRhaW5lZCA8LSBmcmVhZChoZXJlKHJlZkRpciwgIlRGX2Jvb2ttYXJraW5nIiwgdGFyZ2V0TmFtZSwgImFtX2EuYmVkIikpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpCmNvbG5hbWVzKHJldGFpbmVkKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKcmV0YWluZWQuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHJldGFpbmVkKQojIExPU1QgbG9vcApsb3N0IDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiVEZfYm9va21hcmtpbmciLCB0YXJnZXROYW1lLCAib2EuYmVkIikpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpCmNvbG5hbWVzKGxvc3QpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQpsb3N0LmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShsb3N0KQoKCiMgU0VFRElORwp0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AudXBuby5nciwgYmFja2dyb3VuZC5nciwgcmV0YWluZWQuZ3IpCnJlc3VsdC50YiA8LSB0aWJibGUoaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCAiX1VQL05PIiksCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsICJfcmV0YWluZWQiKSwKICAgICAgICAgICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKCiMgQURESU5HIFJPV1MKdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLmRvd24uZ3IsIGJhY2tncm91bmQuZ3IsIHJldGFpbmVkLmdyKQpyZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSAKICBhZGRfcm93KGludGVyZXN0ID0gcGFzdGUwKGludGVyZXN0TmFtZSwgIl9ET1dOIiksCiAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgIl9yZXRhaW5lZCIpLAogICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKCiMgQURESU5HIFJPV1MKdGVtcCA8LSBydW5GaXNoZXJFeGFjdChsb29wLnVwbm8uZ3IsIGJhY2tncm91bmQuZ3IsIGxvc3QuZ3IpCnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIAogIGFkZF9yb3coaW50ZXJlc3QgPSBwYXN0ZTAoaW50ZXJlc3ROYW1lLCAiX1VQL05PIiksCiAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAodGFyZ2V0TmFtZSwgIl9sb3N0IiksCiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsCiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKQoKIyBBRERJTkcgUk9XUwp0ZW1wIDwtIHJ1bkZpc2hlckV4YWN0KGxvb3AuZG93bi5nciwgYmFja2dyb3VuZC5nciwgbG9zdC5ncikKcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgCiAgYWRkX3JvdyhpbnRlcmVzdCA9IHBhc3RlMChpbnRlcmVzdE5hbWUsICJfRE9XTiIpLAogICAgICAgICAgdGFyZ2V0ID0gcGFzdGUwKHRhcmdldE5hbWUsICJfbG9zdCIpLAogICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKCgpyZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JQogIG11dGF0ZShpbnRlcmVzdCA9IHJlY29kZShpbnRlcmVzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdMb29wX1VQL05PIiA9ICJVUC9OTyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdMb29wX0RPV04iID0gIkRPV04iKSwKICAgICAgICAgdGFyZ2V0ID0gcmVjb2RlKHRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICJIM0syN2FjX2VmZmllX3JldGFpbmVkIiA9ICJSZXRhaW5lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiSDNLMjdhY19lZmZpZV9sb3N0IiA9ICJMb3N0IikpCgpyZXN1bHQudGIkaW50ZXJlc3QgPC0gZmFjdG9yKHJlc3VsdC50YiRpbnRlcmVzdCwgbGV2ZWxzID0gYygiVVAvTk8iLCAiRE9XTiIpKQoKcCA8LSBnZ3Bsb3QocmVzdWx0LnRiLCBhZXMoeCA9IGludGVyZXN0LCB5ID0gdGFyZ2V0LCBzaXplID0gLWxvZzEwKHB2YWx1ZSksIGZpbGwgPSBvZGRzUmF0aW8pKSArCiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lCiAgICAgICAgICAgICBzdHJva2UgPSAwLjUqcHRUb01NICAgICAgIyBMaW5lIHdpZHRoIGZvciB0aGUgYm9yZGVyCiAgKSArIHRoZW1lX2J3KCkgKyAKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDMpKSArICAjIFNldCBtaW4gYW5kIG1heCBwb2ludCBzaXplcyBoZXJlCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3JzID0gYygiIzQ4NTJBMCIsICJ3aGl0ZSIsICIjQ0IzMzNBIiksICAjIERlZmluZSBncmFkaWVudCBjb2xvcnMKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHNjYWxlczo6cmVzY2FsZShjKDAuNSwgMSwgMS41KSksIGxpbWl0cyA9IGMoMC41LCAxLjUpLCAKICAgICAgICAgICAgICAgICAgICAgICNsb3cgPSAid2hpdGUiLCBoaWdoID0gIiNDQjMzM0EiLAogICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMyksCiAgICAgICAgICAgICAgICAgICAgICBvb2IgPSBzY2FsZXM6OnNxdWlzaCwgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKAogICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IDEuNS81LjA4LCAgIyBBZGp1c3Qgd2lkdGggb2YgdGhlIGNvbG9yIGJhcgogICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxNS81LjA4ICAgIyBBZGp1c3QgaGVpZ2h0IG9mIHRoZSBjb2xvciBiYXIKICAgICAgICAgICAgICAgICAgICAgICkKICApICsKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzCiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uCiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvbgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkKCmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCAiaGVhdG1hcF9IM0syN2FjX2Jvb2ttYXJraW5nX3JlZ19kb3RwbG90IikKd2lkdGggPC0gcGFuZWxTaXplKDEuNykqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjEpKm1tVG9JbmNoCiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiMgcHJpbnQocCkKIyBkZXYub2ZmKCkKc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIiksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKICAKYGBgCiMjIyMjIyBGaWd1cmUgLSBhbGwgdGFyZ2V0cwpgYGB7cn0KIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgdGFyZ2V0Cgp0ZW1wMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0QmluYXJ5KCJFU1JSQl9kc2ciLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cG5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDIgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldEJpbmFyeSgiSDNLMjdhY19lZmZpZSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwbm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0QmluYXJ5KCJLTEY0X2VmZmllIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXBuby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRCaW5hcnkoIk9DVDRfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cG5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldEJpbmFyeSgiU09YMl9lZmZpZSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwbm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQoKCmRhdGEgPC0gYmluZF9yb3dzKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSkKCgoKcmVzdWx0LnRiIDwtIGRhdGEgJT4lCiAgbXV0YXRlKGludGVyZXN0ID0gcmVjb2RlKGludGVyZXN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ0xvb3BfVVAvTk8iID0gIlVQL05PIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ0xvb3BfRE9XTiIgPSAiRE9XTiIpLAogICAgICAgICB0YXJnZXQgPSByZWNvZGUodGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIkgzSzI3YWNfZWZmaWVfcmV0YWluZWQiID0gIkgzSzI3YWNfcmV0YWluZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIkgzSzI3YWNfZWZmaWVfbG9zdCIgPSAiSDNLMjdhY19sb3N0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICJFU1JSQl9kc2dfcmV0YWluZWQiID0gIkVTUlJCX3JldGFpbmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJFU1JSQl9kc2dfbG9zdCIgPSAiRVNSUkJfbG9zdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiS0xGNF9lZmZpZV9yZXRhaW5lZCIgPSAiS0xGNF9yZXRhaW5lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiS0xGNF9lZmZpZV9sb3N0IiA9ICJLTEY0X2xvc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgIk9DVDRfZWZmaWVfcmV0YWluZWQiID0gIk9DVDRfcmV0YWluZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIk9DVDRfZWZmaWVfbG9zdCIgPSAiT0NUNF9sb3N0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICJTT1gyX2VmZmllX3JldGFpbmVkIiA9ICJTT1gyX3JldGFpbmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJTT1gyX2VmZmllX2xvc3QiID0gIlNPWDJfbG9zdCIpKQoKcmVzdWx0LnRiJGludGVyZXN0IDwtIGZhY3RvcihyZXN1bHQudGIkaW50ZXJlc3QsIGxldmVscyA9IGMoIlVQL05PIiwgIkRPV04iKSkKcmVzdWx0LnRiJHRhcmdldCA8LSBmYWN0b3IocmVzdWx0LnRiJHRhcmdldCwgbGV2ZWxzID0gcmV2KGMoIkgzSzI3YWNfcmV0YWluZWQiLCAiSDNLMjdhY19sb3N0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVNSUkJfcmV0YWluZWQiLCAiRVNSUkJfbG9zdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktMRjRfcmV0YWluZWQiLCAiS0xGNF9sb3N0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT0NUNF9yZXRhaW5lZCIsICJPQ1Q0X2xvc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTT1gyX3JldGFpbmVkIiwiU09YMl9sb3N0IikpKQoKcCA8LSBnZ3Bsb3QocmVzdWx0LnRiLCBhZXMoeCA9IGludGVyZXN0LCB5ID0gdGFyZ2V0LCBzaXplID0gLWxvZzEwKHB2YWx1ZSksIGZpbGwgPSBvZGRzUmF0aW8pKSArCiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lCiAgICAgICAgICAgICBzdHJva2UgPSAxKnB0VG9NTSAgICAgICMgTGluZSB3aWR0aCBmb3IgdGhlIGJvcmRlcgogICkgKyB0aGVtZV9idygpICsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCAzKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycyA9IGMoIiM0ODUyQTAiLCAid2hpdGUiLCAiI0NCMzMzQSIpLCAgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBzY2FsZXM6OnJlc2NhbGUoYygwLjUsIDEsIDEuNSkpLCBsaW1pdHMgPSBjKDAuNSwgMS41KSwgCiAgICAgICAgICAgICAgICAgICAgICAjbG93ID0gIndoaXRlIiwgaGlnaCA9ICIjQ0IzMzNBIiwKICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEsIDMpLAogICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9ycwogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcigKICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXIKICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyCiAgICAgICAgICAgICAgICAgICAgICApCiAgKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlcwogICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApCgpmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgImhlYXRtYXBfYWxsdGFyZ2V0X2Jvb2ttYXJraW5nX3JlZ19kb3RwbG90IikKd2lkdGggPC0gcGFuZWxTaXplKDIuMikqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaAojIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQojIHByaW50KHApCiMgZGV2Lm9mZigpCnN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCgoKCgoKCgpgYGAKIyMjIyMjIFJldGFpbmVkICYgTG9zdApgYGB7cn0KIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgdGFyZ2V0CnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkFUQUNfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkNUQ0YiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAzIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkVTUlJCX2RzZyIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiRVNSUkJfTkNCIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJFU1JSQl9wZmEiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA2IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkgzSzI3YWNfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIktMRjRfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIk5BTk9HX2RzZyIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDkgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiTkFOT0dfcGZhIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiT0NUNF9lZmZpZSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDExIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIk9DVDRfZHNnIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMTIgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiT0NUNF9wZmEiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAxMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJTTUMxIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMTQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiU09YMl9lZmZpZSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDE1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIlNPWDJfZHNnIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMTYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiU09YMl9wZmEiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAxNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJUQlAiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCgoKCgpkYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsCiAgICAgICAgIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsCiAgICAgICAgIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYgLHRlbXAxNykKCiMgVmlzdWFsaXphdGlvbgpsaWJyYXJ5KGNpcmNsaXplKQoKaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiUKcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJ0YXJnZXQiKQoKcHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JQogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAidGFyZ2V0IikKCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDUpLCAKICAgICAgICAgICAgICAgICAgICAgIGMoImJsdWUiLCAid2hpdGUiLCAicmVkIikpCgpIZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLAogICAgICAgIG5hbWUgPSAiT2RkcyBSYXRpbyIsCiAgICAgICAgY29sID0gY29sX2Z1biwKICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlcwogICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkgewogICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXQogICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCAibi5zLiIsIHNwcmludGYoIiUuMmUiLCBwdmFsKSkKICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKQogICAgICAgIH0sCiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0CiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSwKICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgY29sdW1uX3RpdGxlID0gIkludGVyZXN0IiwKICAgICAgICByb3dfdGl0bGUgPSAiVGFyZ2V0IiwKICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIsIDMsIDQsIDUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiKSkpCgpgYGAKIyMjIyMjICBSZXRhaW5lZApgYGB7cn0KCiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIHRhcmdldAp0ZW1wMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoIkFUQUNfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZCgiQ1RDRiIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKCJFU1JSQl9kc2ciLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZCgiRVNSUkJfTkNCIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoIkVTUlJCX3BmYSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKCJIM0syN2FjX2VmZmllIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoIktMRjRfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZCgiTkFOT0dfZHNnIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wOSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoIk5BTk9HX3BmYSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDEwIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZCgiT0NUNF9lZmZpZSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDExIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZCgiT0NUNF9kc2ciLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAxMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoIk9DVDRfcGZhIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMTMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKCJTTUMxIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMTQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKCJTT1gyX2VmZmllIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMTUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKCJTT1gyX2RzZyIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDE2IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZCgiU09YMl9wZmEiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAxNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoIlRCUCIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKCgoKCmRhdGEgPC0gYmluZF9yb3dzKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwKICAgICAgICAgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwKICAgICAgICAgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiAsdGVtcDE3KQoKIyBWaXN1YWxpemF0aW9uCmxpYnJhcnkoY2lyY2xpemUpCgpoZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JQpwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gInRhcmdldCIpCgpwdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJ0YXJnZXQiKQoKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMyksIAogICAgICAgICAgICAgICAgICAgICAgYygiYmx1ZSIsICJ3aGl0ZSIsICJyZWQiKSkKCkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksCiAgICAgICAgbmFtZSA9ICJPZGRzIFJhdGlvIiwKICAgICAgICBjb2wgPSBjb2xfZnVuLAogICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzCiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7CiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdCiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsICJuLnMuIiwgc3ByaW50ZigiJS4yZSIsIHB2YWwpKQogICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpCiAgICAgICAgfSwKICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXQKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLAogICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSwKICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwKICAgICAgICBjb2x1bW5fdGl0bGUgPSAiSW50ZXJlc3QiLAogICAgICAgIHJvd190aXRsZSA9ICJUYXJnZXQiLAogICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIwIiwgIjEiLCAiMiIsICIzIikpKQoKYGBgCgojIyMjIFJlZyByZWZpbmVkCiMjIyMjIyBSZXRhaW5lZCAmIExvc3QKYGBge3J9CgoKIyMjIyBJbXBvcnRpbmcgbG9vcHMgb2YgdGFyZ2V0CnRlbXAxIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkFUQUNfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkNUQ0YiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAzIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkVTUlJCX2RzZyIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDQgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiSDNLMjdhY19lZmZpZSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiS0xGNF9lZmZpZSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDYgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiTkFOT0dfZHNnIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wNyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJPQ1Q0X2VmZmllIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wOCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJTTUMxIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA5IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIlNPWDJfZHNnIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMTAgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiVEJQIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQoKCgoKZGF0YSA8LSBiaW5kX3Jvd3ModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LAogICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwKQoKIyBWaXN1YWxpemF0aW9uCmxpYnJhcnkoY2lyY2xpemUpCgpoZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JQpwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gInRhcmdldCIpCgpwdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJ0YXJnZXQiKQoKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMyksIAogICAgICAgICAgICAgICAgICAgICAgYygiYmx1ZSIsICJ3aGl0ZSIsICJyZWQiKSkKCkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksCiAgICAgICAgbmFtZSA9ICJPZGRzIFJhdGlvIiwKICAgICAgICBjb2wgPSBjb2xfZnVuLAogICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzCiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7CiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdCiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsICJuLnMuIiwgc3ByaW50ZigiJS4yZSIsIHB2YWwpKQogICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpCiAgICAgICAgfSwKICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXQKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLAogICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSwKICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwKICAgICAgICBjb2x1bW5fdGl0bGUgPSAiSW50ZXJlc3QiLAogICAgICAgIHJvd190aXRsZSA9ICJUYXJnZXQiLAogICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIwIiwgIjEiLCAiMiIsICIzIikpKQoKCgpgYGAKIyMjIyMjIFJldGFpbmVkCmBgYHtyfQoKCiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIHRhcmdldAp0ZW1wMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoIkFUQUNfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAyIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZCgiQ1RDRiIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKCJFU1JSQl9kc2ciLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZCgiSDNLMjdhY19lZmZpZSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDUgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKCJLTEY0X2VmZmllIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wNiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoIk5BTk9HX2RzZyIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDcgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKCJPQ1Q0X2VmZmllIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wOCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0UmV0YWluZWQoIlNNQzEiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDkgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldFJldGFpbmVkKCJTT1gyX2RzZyIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDEwIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXRSZXRhaW5lZCgiVEJQIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQoKCgoKZGF0YSA8LSBiaW5kX3Jvd3ModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LAogICAgICAgICB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwKQoKIyBWaXN1YWxpemF0aW9uCmxpYnJhcnkoY2lyY2xpemUpCgpoZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBvZGRzUmF0aW8pICU+JQpwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gInRhcmdldCIpCgpwdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIHB2YWx1ZSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJ0YXJnZXQiKQoKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMyksIAogICAgICAgICAgICAgICAgICAgICAgYygiYmx1ZSIsICJ3aGl0ZSIsICJyZWQiKSkKCkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksCiAgICAgICAgbmFtZSA9ICJPZGRzIFJhdGlvIiwKICAgICAgICBjb2wgPSBjb2xfZnVuLAogICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzCiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7CiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdCiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsICJuLnMuIiwgc3ByaW50ZigiJS4yZSIsIHB2YWwpKQogICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpCiAgICAgICAgfSwKICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXQKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLAogICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSwKICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwKICAgICAgICBjb2x1bW5fdGl0bGUgPSAiSW50ZXJlc3QiLAogICAgICAgIHJvd190aXRsZSA9ICJUYXJnZXQiLAogICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIwIiwgIjEiLCAiMiIsICIzIikpKQoKCgpgYGAKIyMgWzIuMjQuMl0gQ2hlY2tpbmcgYm9va21hcmtpbmcgLSBBNDg1CiMjIyMgQWxsIGxvb3BzCmBgYHtyfQojIyMjIEltcG9ydGluZyBsb29wcyBvZiBpbnRlcmVzdAppbnRlcmVzdE5hbWUgPC0gImFsbExvb3AiCiMgQkFDS0dST1VORCBsb29wCmJhY2tncm91bmQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbC5iZWRwZSIpKQpiYWNrZ3JvdW5kLmdyIDwtIChleHRyYWN0QW5jaG9yKGJhY2tncm91bmQpKQojIFVQIGxvb3AKbG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZSIpKQpsb29wLnVwLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKQojIE5PIGxvb3AKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX0E0ODV2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKQpsb29wLm5vLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3Aubm8pKQojIERPV04gbG9vcApsb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKQpsb29wLmRvd24uZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5kb3duKSkKYGBgCiMjIyMjIEFsbCBsb29wcyByZWZpbmVkCmBgYHtyfQoKCiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIHRhcmdldAp0ZW1wMSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJBVEFDX2VmZmllIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJDVENGIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wMyA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJFU1JSQl9kc2ciLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA0IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkgzSzI3YWNfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA1IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIktMRjRfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA2IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIk5BTk9HX2RzZyIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDcgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiT0NUNF9kc2ciLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIlNNQzEiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDkgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiU09YMl9kc2ciLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAxMCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJUQlAiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCgoKCgpkYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsCiAgICAgICAgIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTApCgojIFZpc3VhbGl6YXRpb24KbGlicmFyeShjaXJjbGl6ZSkKCmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lCnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JQogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAidGFyZ2V0IikKCnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gInRhcmdldCIpCgpjb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAzKSwgCiAgICAgICAgICAgICAgICAgICAgICBjKCJibHVlIiwgIndoaXRlIiwgInJlZCIpKQoKSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSwKICAgICAgICBuYW1lID0gIk9kZHMgUmF0aW8iLAogICAgICAgIGNvbCA9IGNvbF9mdW4sCiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXMKICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHsKICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal0KICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgIm4ucy4iLCBzcHJpbnRmKCIlLjJlIiwgcHZhbCkpCiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSkKICAgICAgICB9LAogICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dAogICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLAogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLAogICAgICAgIGNvbHVtbl90aXRsZSA9ICJJbnRlcmVzdCIsCiAgICAgICAgcm93X3RpdGxlID0gIlRhcmdldCIsCiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGF0ID0gYygwLCAxLCAyLCAzKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjAiLCAiMSIsICIyIiwgIjMiKSkpCgpgYGAKIyMjIyBSZWcgbG9vcHMKYGBge3J9CiMjIyMgSW1wb3J0aW5nIGxvb3BzIG9mIGludGVyZXN0CmludGVyZXN0TmFtZSA8LSAicmVnTG9vcCIKIyBCQUNLR1JPVU5EIGxvb3AKYmFja2dyb3VuZCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGUiKSkKYmFja2dyb3VuZC5nciA8LSAoZXh0cmFjdEFuY2hvcihiYWNrZ3JvdW5kKSkKIyBVUCBsb29wCmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZSIpKQpsb29wLnVwLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKQojIE5PIGxvb3AKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlIikpCmxvb3Aubm8uZ3IgPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpCiMgRE9XTiBsb29wCmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGUiKSkKbG9vcC5kb3duLmdyIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpCgpmd3JpdGUoYXNfdGliYmxlKGxvb3AudXAuZ3IpICU+JSBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kKSwgaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5hbmNob3IuYmVkIiksIGNvbC5uYW1lcyA9IEZBTFNFLCBzZXAgPSAiXHQiKQpmd3JpdGUoYXNfdGliYmxlKGxvb3Aubm8uZ3IpICU+JSBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kKSwgaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fTk9fZGlmZjAuMi5hbmNob3IuYmVkIiksIGNvbC5uYW1lcyA9IEZBTFNFLCBzZXAgPSAiXHQiKQpmd3JpdGUoYXNfdGliYmxlKGxvb3AuZG93bi5ncikgJT4lIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpLCBoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYW5jaG9yLmJlZCIpLCBjb2wubmFtZXMgPSBGQUxTRSwgc2VwID0gIlx0IikKYGBgCiMjIyMjIFJldGFpbmVkICYgTG9zdApgYGB7cn0KCgojIyMjIEltcG9ydGluZyBsb29wcyBvZiB0YXJnZXQKdGVtcDEgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiQVRBQ19lZmZpZSIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDIgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiQ1RDRiIsIGludGVyZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDMgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiRVNSUkJfZHNnIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wNCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJIM0syN2FjX2VmZmllIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wNSA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJLTEY0X2VmZmllIiwgaW50ZXJlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AudXAuZ3IsIGxvb3Aubm8uZ3IsIGxvb3AuZG93bi5nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyKQp0ZW1wNiA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJOQU5PR19kc2ciLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA3IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIk9DVDRfZWZmaWUiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXA4IDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIlNNQzEiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLnVwLmdyLCBsb29wLm5vLmdyLCBsb29wLmRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC5ncikKdGVtcDkgPC0gcnVuRmlzaGVyRXhhY3RDb21iaW5hdGlvblRhcmdldCgiU09YMl9kc2ciLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCnRlbXAxMCA8LSBydW5GaXNoZXJFeGFjdENvbWJpbmF0aW9uVGFyZ2V0KCJUQlAiLCBpbnRlcmVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC51cC5nciwgbG9vcC5uby5nciwgbG9vcC5kb3duLmdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQuZ3IpCgoKCgpkYXRhIDwtIGJpbmRfcm93cyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsCiAgICAgICAgIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTApCgojIFZpc3VhbGl6YXRpb24KbGlicmFyeShjaXJjbGl6ZSkKCmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgaW50ZXJlc3QsIG9kZHNSYXRpbykgJT4lCnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JQogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAidGFyZ2V0IikKCnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgcHZhbHVlKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJlc3QsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gInRhcmdldCIpCgpjb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygwLCAxLCAzKSwgCiAgICAgICAgICAgICAgICAgICAgICBjKCJibHVlIiwgIndoaXRlIiwgInJlZCIpKQoKSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9kYXRhKSwKICAgICAgICBuYW1lID0gIk9kZHMgUmF0aW8iLAogICAgICAgIGNvbCA9IGNvbF9mdW4sCiAgICAgICAgIyBBZGQgYW5ub3RhdGlvbiBmb3IgcC12YWx1ZXMKICAgICAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGosIGksIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpIHsKICAgICAgICAgIHB2YWwgPC0gcHZhbHVlX2RhdGFbaSwgal0KICAgICAgICAgIGxhYmVsIDwtIGlmZWxzZShwdmFsID4gMC4wNSwgIm4ucy4iLCBzcHJpbnRmKCIlLjJlIiwgcHZhbCkpCiAgICAgICAgICBncmlkLnRleHQobGFiZWwsIHgsIHksIGdwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSkKICAgICAgICB9LAogICAgICAgICMgQ3VzdG9taXplIHRoZSBoZWF0bWFwIGxheW91dAogICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLAogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLAogICAgICAgIGNvbHVtbl90aXRsZSA9ICJJbnRlcmVzdCIsCiAgICAgICAgcm93X3RpdGxlID0gIlRhcmdldCIsCiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGF0ID0gYygwLCAxLCAyLCAzKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjAiLCAiMSIsICIyIiwgIjMiKSkpCgoKCmBgYAojIyMgREVHcyBmcm9tIFJOQS1zZXEKMi41a2IgZnJvbSBUU1MsIGF0IGxlYXN0IDEgYnAgb3ZlcmxhcAojIyMjIDJpCmBgYHtyfQpnZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkIikpICU+JQogIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09ICIrIiwgVjIsIFYzKSkgJT4lCiAgZHBseXI6OnNlbGVjdChWMSwgVFNTLCBWNikKY29sbmFtZXMoZ2VuZS50YikgPC0gYygiY2hyIiwgIlRTUyIsICJlbnNlbWJsIikKCmRpZmYuUk5BIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5BNDg1LnNlbGVjdGVkMl9HMS4yaS5BNDg1X3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCmRpZmYuUk5BIDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bGVmdF9qb2luKGdlbmUudGIsIGJ5ID0gYygiZW5zZW1ibF9nZW5lX2lkIiA9ICJlbnNlbWJsIikpICU+JQogIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKFRTUykpCmFscGhhIDwtIDAuMDUKZmNDdXRvZmYgPC0gMC41CgpkaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShkaWZmID0gY2FzZV93aGVuKHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmIH4gIlVQIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYgfiAiRE9XTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJOTyIpKQoKCnRlbXAgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBUU1MgLSAyNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBUU1MgKyAyNTAwKSAlPiUKICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZCwgZW5zZW1ibF9nZW5lX2lkLCBkaWZmKQoKCmRvd24uZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSAiRE9XTiIpKQp1cC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09ICJVUCIpKQpuby5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09ICJOTyIpKQphbGwuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApCgpkYXRhIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkgzSzI3YWNfZWZmaWUiLCAiVFNTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cC5nciwgbm8uZ3IsIGRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLmdyKQoKCiMgVmlzdWFsaXphdGlvbgpsaWJyYXJ5KGNpcmNsaXplKQoKaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiUKcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJ0YXJnZXQiKQoKcHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JQogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAidGFyZ2V0IikKCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDIpLCAKICAgICAgICAgICAgICAgICAgICAgIGMoImJsdWUiLCAid2hpdGUiLCAicmVkIikpCgpIZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLAogICAgICAgIG5hbWUgPSAiT2RkcyBSYXRpbyIsCiAgICAgICAgY29sID0gY29sX2Z1biwKICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlcwogICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkgewogICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXQogICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCAibi5zLiIsIHNwcmludGYoIiUuMmUiLCBwdmFsKSkKICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKQogICAgICAgIH0sCiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0CiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSwKICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgY29sdW1uX3RpdGxlID0gIkludGVyZXN0IiwKICAgICAgICByb3dfdGl0bGUgPSAiVGFyZ2V0IiwKICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMCIsICIxIiwgIjIiKSkpCgoKIyMgR08gVEVTVApkaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKQpkaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6OmxlZnRfam9pbihnZW5lLnRiLCBieSA9IGMoImVuc2VtYmxfZ2VuZV9pZCIgPSAiZW5zZW1ibCIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShUU1MpKQphbHBoYSA8LSAwLjA1CmZjQ3V0b2ZmIDwtIDAuNQoKZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjptdXRhdGUoZGlmZiA9IGNhc2Vfd2hlbihwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPiBmY0N1dG9mZiB+ICJVUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmIH4gIkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTk8iKSkKZ2VuZUxpc3QgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmYgPT0gIkRPV04iKSkkZW5zZW1ibF9nZW5lX2lkCkdPIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpCkdPLnJlYWRhYmxlIDwtIHNldFJlYWRhYmxlKEdPLCBPcmdEYiA9IG9yZy5NbS5lZy5kYikKCmRvd25TdGVtR2VuZSA8LSB1bmlxdWUodW5saXN0KChhcy5kYXRhLmZyYW1lKEdPKSAlPiUgZHBseXI6OnNsaWNlKGMoNCwgNSwgMTQsIDY2KSkgJT4lIGRwbHlyOjptdXRhdGUoZ2VuZUlEID0gc3Ryc3BsaXQoZ2VuZUlELCAiLyIpKSkkZ2VuZUlEKSkKZG93blN0ZW0uZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibF9nZW5lX2lkICVpbiUgZG93blN0ZW1HZW5lKSkKCnByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IDE1LCB0aXRsZSA9ICIiKSArIAogICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gInJlZCIsIGhpZ2ggPSAiYmxhY2siKSkKZ2VuZUxpc3QgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmYgPT0gIlVQIikpJGVuc2VtYmxfZ2VuZV9pZApHTyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpHTy5yZWFkYWJsZSA8LSBzZXRSZWFkYWJsZShHTywgT3JnRGIgPSBvcmcuTW0uZWcuZGIpCnByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IDE1LCB0aXRsZSA9ICIiKSArIAogICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gInJlZCIsIGhpZ2ggPSAiYmxhY2siKSkKCgpkb3duTk9OU3RlbS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09ICJET1dOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShlbnNlbWJsX2dlbmVfaWQgJWluJSBkb3duU3RlbUdlbmUpKSkKCnByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IDE1LCB0aXRsZSA9ICIiKSArIAogICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gInJlZCIsIGhpZ2ggPSAiYmxhY2siKSkKZ2VuZUxpc3QgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmYgPT0gIlVQIikpJGVuc2VtYmxfZ2VuZV9pZApHTyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpHTy5yZWFkYWJsZSA8LSBzZXRSZWFkYWJsZShHTywgT3JnRGIgPSBvcmcuTW0uZWcuZGIpCnByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IDE1LCB0aXRsZSA9ICIiKSArIAogICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gInJlZCIsIGhpZ2ggPSAiYmxhY2siKSkKCgoKIyMjIENoZWNraW5nIGJvb2ttYXJraW5nIG9ubHkgaW4gc3RlbSBnZW5lCgpkYXRhIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkgzSzI3YWNfZWZmaWUiLCAiVFNTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duLmdyLCBkb3duTk9OU3RlbS5nciwgZG93blN0ZW0uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLmdyKQoKCiMgVmlzdWFsaXphdGlvbgpsaWJyYXJ5KGNpcmNsaXplKQoKaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiUKcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJ0YXJnZXQiKQoKcHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JQogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAidGFyZ2V0IikKCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDIpLCAKICAgICAgICAgICAgICAgICAgICAgIGMoImJsdWUiLCAid2hpdGUiLCAicmVkIikpCgpIZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLAogICAgICAgIG5hbWUgPSAiT2RkcyBSYXRpbyIsCiAgICAgICAgY29sID0gY29sX2Z1biwKICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlcwogICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkgewogICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXQogICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCAibi5zLiIsIHNwcmludGYoIiUuMmUiLCBwdmFsKSkKICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKQogICAgICAgIH0sCiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0CiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSwKICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgY29sdW1uX3RpdGxlID0gIkludGVyZXN0IiwKICAgICAgICByb3dfdGl0bGUgPSAiVGFyZ2V0IiwKICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMCIsICIxIiwgIjIiKSkpCmBgYAojIyMjIEVwaQpgYGB7cn0KZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgIm1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSAiKyIsIFYyLCBWMykpICU+JQogIGRwbHlyOjpzZWxlY3QoVjEsIFRTUywgVjYpCmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoImNociIsICJUU1MiLCAiZW5zZW1ibCIpCgpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuRXBpLkE0ODVfdnNfRzEuRXBpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpCmRpZmYuUk5BIDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bGVmdF9qb2luKGdlbmUudGIsIGJ5ID0gYygiZW5zZW1ibF9nZW5lX2lkIiA9ICJlbnNlbWJsIikpICU+JQogIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKFRTUykpCmFscGhhIDwtIDAuMDUKZmNDdXRvZmYgPC0gMC41CgpkaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShkaWZmID0gY2FzZV93aGVuKHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmIH4gIlVQIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYgfiAiRE9XTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJOTyIpKQoKCnRlbXAgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBUU1MgLSAyNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBUU1MgKyAyNTAwKSAlPiUKICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZCwgZW5zZW1ibF9nZW5lX2lkLCBkaWZmKQoKCmRvd24uZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZGlmZiA9PSAiRE9XTiIpKQp1cC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09ICJVUCIpKQpuby5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09ICJOTyIpKQphbGwuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApCgpkYXRhIDwtIHJ1bkZpc2hlckV4YWN0Q29tYmluYXRpb25UYXJnZXQoIkgzSzI3YWNfZWZmaWUiLCAiVFNTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cC5nciwgbm8uZ3IsIGRvd24uZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLmdyKQoKCiMgVmlzdWFsaXphdGlvbgpsaWJyYXJ5KGNpcmNsaXplKQoKaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBpbnRlcmVzdCwgb2Rkc1JhdGlvKSAlPiUKcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyZXN0LCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJ0YXJnZXQiKQoKcHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGludGVyZXN0LCBwdmFsdWUpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcmVzdCwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JQogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAidGFyZ2V0IikKCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDIpLCAKICAgICAgICAgICAgICAgICAgICAgIGMoImJsdWUiLCAid2hpdGUiLCAicmVkIikpCgpIZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLAogICAgICAgIG5hbWUgPSAiT2RkcyBSYXRpbyIsCiAgICAgICAgY29sID0gY29sX2Z1biwKICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlcwogICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkgewogICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXQogICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCAibi5zLiIsIHNwcmludGYoIiUuMmUiLCBwdmFsKSkKICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTApKQogICAgICAgIH0sCiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0CiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSwKICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgY29sdW1uX3RpdGxlID0gIkludGVyZXN0IiwKICAgICAgICByb3dfdGl0bGUgPSAiVGFyZ2V0IiwKICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoYXQgPSBjKDAsIDEsIDIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMCIsICIxIiwgIjIiKSkpCgoKIyMgR08KZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLkVwaS5BNDg1X3ZzX0cxLkVwaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKQpkaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6OmxlZnRfam9pbihnZW5lLnRiLCBieSA9IGMoImVuc2VtYmxfZ2VuZV9pZCIgPSAiZW5zZW1ibCIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShUU1MpKQphbHBoYSA8LSAwLjA1CmZjQ3V0b2ZmIDwtIDAuNQoKZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjptdXRhdGUoZGlmZiA9IGNhc2Vfd2hlbihwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPiBmY0N1dG9mZiB+ICJVUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDIDwgLWZjQ3V0b2ZmIH4gIkRPV04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTk8iKSkKCmdlbmVMaXN0IDwtIChkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihkaWZmID09ICJET1dOIikpJGVuc2VtYmxfZ2VuZV9pZApHTyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpHTy5yZWFkYWJsZSA8LSBzZXRSZWFkYWJsZShHTywgT3JnRGIgPSBvcmcuTW0uZWcuZGIpCnByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IDE1LCB0aXRsZSA9ICIiKSArIAogICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gInJlZCIsIGhpZ2ggPSAiYmxhY2siKSkKZ2VuZUxpc3QgPC0gKGRpZmYuUk5BICU+JSBkcGx5cjo6ZmlsdGVyKGRpZmYgPT0gIlVQIikpJGVuc2VtYmxfZ2VuZV9pZApHTyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpHTy5yZWFkYWJsZSA8LSBzZXRSZWFkYWJsZShHTywgT3JnRGIgPSBvcmcuTW0uZWcuZGIpCnByaW50KGRvdHBsb3QoR08sIHNob3dDYXRlZ29yeSA9IDE1LCB0aXRsZSA9ICIiKSArIAogICAgICAgIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAwLjA1KSwgbG93ID0gInJlZCIsIGhpZ2ggPSAiYmxhY2siKSkKCmBgYAoKCiMjIFsyLjI1XSBDaGVja2luZyBnZW5lcyByZWxhdGVkIHRvIHJlZ3VsYXRvcnkgbG9vcHMKIyMjIGRUQUcsIENvbXBhcmluZyB0byBBc3luYwojIyMjIFAtUCwgUC1FCmBgYHtyfQpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgoKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3AtcGVfZW5zZW1ibExpc3QudHN2IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIpCgppZC5HMVNwZWNpZmljUGVydCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfRzF2c0FzeW5jX0cxU3BlY2lmaWNQZXJ0LmJlZHBlIikpJFY3CmlkLkFzeW5jU3BlY2lmaWNQZXJ0IDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9HMXZzQXN5bmNfQXN5bmNTcGVjaWZpY1BlcnQuYmVkcGUiKSkkVjcKaWQuYm90aFBlcnQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19ib3RoUGVydC5iZWRwZSIpKSRWNwppZC5ib3RoUmV0YWluZWQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0cxdnNBc3luY19ib3RoUmV0YWluZWQuYmVkcGUiKSkkVjcKCgpnZW5lTGlzdC5HMVNwZWNpZmljUGVydCA8LSAoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgaWQuRzFTcGVjaWZpY1BlcnQpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUKZ2VuZUxpc3QuQXN5bmNTcGVjaWZpY1BlcnQgPC0gKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGlkLkFzeW5jU3BlY2lmaWNQZXJ0KSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lCmdlbmVMaXN0LmJvdGhQZXJ0IDwtIChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBpZC5ib3RoUGVydCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZQpnZW5lTGlzdC5ib3RoUmV0YWluZWQgPC0gKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGlkLmJvdGhSZXRhaW5lZCkgJT4lIHVubmVzdChnZW5lKSkkZ2VuZQoKR08uRzFTcGVjaWZpY1BlcnQuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuRzFTcGVjaWZpY1BlcnQsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKSkKR08uQXN5bmNTcGVjaWZpY1Blci5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5Bc3luY1NwZWNpZmljUGVydCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpKQpHTy5ib3RoUGVydC5kZiA8LSBhcy5kYXRhLmZyYW1lKGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ib3RoUGVydCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpKQpHTy5ib3RoUmV0YWluZWQuZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuYm90aFJldGFpbmVkLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikpCgpzdWJzZXQuRzFTcGVjaWZpY1BlcnQgPC0gR08uRzFTcGVjaWZpY1BlcnQuZGYgJT4lIGRwbHlyOjpzZWxlY3QoSUQsIERlc2NyaXB0aW9uLCBHZW5lUmF0aW8sIHAuYWRqdXN0KSAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9ICJHMVNwZWNpZmljUGVydCIpICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICBnciA9IHNhcHBseShHZW5lUmF0aW8sIGZ1bmN0aW9uKHgpIHsKICAgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJ5ICIvIgogICAgICBwYXJ0cyA8LSB1bmxpc3Qoc3Ryc3BsaXQoeCwgIi8iKSkKICAgICAgIyBDb252ZXJ0IHRvIG51bWVyaWMgYW5kIHBlcmZvcm0gdGhlIGRpdmlzaW9uCiAgICAgIGFzLm51bWVyaWMocGFydHNbMV0pIC8gYXMubnVtZXJpYyhwYXJ0c1syXSkKICAgIH0pCiAgKSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhncikpCgpzdWJzZXQuQXN5bmNTcGVjaWZpY1BlcnQgPC0gR08uQXN5bmNTcGVjaWZpY1Blci5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gIkFzeW5jU3BlY2lmaWNQZXJ0IikgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewogICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCAiLyIpKQogICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQogICAgfSkKICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKCnN1YnNldC5ib3RoUGVydCA8LSBHTy5ib3RoUGVydC5kZiAlPiUgZHBseXI6OnNlbGVjdChJRCwgRGVzY3JpcHRpb24sIEdlbmVSYXRpbywgcC5hZGp1c3QpICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gImJvdGhQZXJ0IikgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewogICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCAiLyIpKQogICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQogICAgfSkKICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKCnN1YnNldC5ib3RoUmV0YWluZWQgPC0gR08uYm90aFJldGFpbmVkLmRmICU+JSBkcGx5cjo6c2VsZWN0KElELCBEZXNjcmlwdGlvbiwgR2VuZVJhdGlvLCBwLmFkanVzdCkgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSAiYm90aFJldGFpbmVkIikgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIGdyID0gc2FwcGx5KEdlbmVSYXRpbywgZnVuY3Rpb24oeCkgewogICAgICAjIFNwbGl0IHRoZSBzdHJpbmcgYnkgIi8iCiAgICAgIHBhcnRzIDwtIHVubGlzdChzdHJzcGxpdCh4LCAiLyIpKQogICAgICAjIENvbnZlcnQgdG8gbnVtZXJpYyBhbmQgcGVyZm9ybSB0aGUgZGl2aXNpb24KICAgICAgYXMubnVtZXJpYyhwYXJ0c1sxXSkgLyBhcy5udW1lcmljKHBhcnRzWzJdKQogICAgfSkKICApICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKGdyKSkKCmRhdGEgPC0gYmluZF9yb3dzKGJpbmRfcm93cyhzdWJzZXQuRzFTcGVjaWZpY1BlcnQsIHN1YnNldC5ib3RoUGVydCksIHN1YnNldC5ib3RoUmV0YWluZWQpCgpwIDwtIGdncGxvdChzdWJzZXQuRzFTcGVjaWZpY1BlcnQsIGFlcyh4ID0gZ3JvdXAsIHkgPSBEZXNjcmlwdGlvbiwgY29sb3IgPSBwLmFkanVzdCwgc2l6ZSA9IGdyKSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAicmVkIiwgaGlnaCA9ICJibHVlIiwgbGltaXRzID0gYygwLCAwLjA1KSkgKwogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMCwgMykpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICAjIFNldCBheGlzIHRleHQgc2l6ZQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAjIFNldCBheGlzIHRpdGxlIHNpemUgKGlmIG5vdCByZW1vdmVkKQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgIyBTZXQgbGVnZW5kIHRleHQgc2l6ZQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpIAoKYGBgCgojIyMgZFRBRwojIyMjIFAtUCwgUC1FCmBgYHtyfQpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgoKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3AtcGVfZW5zZW1ibExpc3QudHN2IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIpCgpnZW5lTGlzdC51cExvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSAiVVAiKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKQpnZW5lTGlzdC5ub0xvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSAiTk8iKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKQpnZW5lTGlzdC5kb3duTG9vcCA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fZFRBR19ETVNPID09ICJET1dOIikgJT4lIHVubmVzdChnZW5lKSkkZ2VuZSkKCgoKIyBDSEVDS0lORyBIT1cgTUFOWSBHRU5FUyBPVkVSTEFQIEFNT05HIFVQL05PL0RPV04Kc2V0c19saXN0IDwtIGxpc3QodXAgPSBnZW5lTGlzdC51cExvb3AsCiAgICAgICAgICAgICAgICAgIG5vID0gZ2VuZUxpc3Qubm9Mb29wLAogICAgICAgICAgICAgICAgICBkb3duID0gZ2VuZUxpc3QuZG93bkxvb3ApCgojIENyZWF0ZSB0aGUgRXVsZXIgcGxvdApldWxlcl9maXQgPC0gZXVsZXIoc2V0c19saXN0KQpwbG90KGV1bGVyX2ZpdCwKICAgICBsYWJlbHMgPSBUUlVFLCAgIyBEaXNwbGF5IHNldCBsYWJlbHMKICAgICBmaWxscyA9IFRSVUUsICAgIyBDb2xvciBmaWxsIHRoZSByZWdpb25zCiAgICAgcXVhbnRpdGllcyA9IFRSVUUpCgoKIyBHTwpHTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKZG90cGxvdChHTy51cCkKR08ubm8gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0Lm5vTG9vcCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpCmRvdHBsb3QoR08ubm8pCkdPLmRvd24gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmRvd25Mb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKZG90cGxvdChHTy5kb3duKQoKIyBHTyB0byBvbmx5IHNwZWNpZmljIHN1YnNldApnZW5lTGlzdC51cExvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC51cExvb3AsIHVuaW9uKGdlbmVMaXN0Lm5vTG9vcCwgZ2VuZUxpc3QuZG93bkxvb3ApKQpnZW5lTGlzdC5ub0xvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5ub0xvb3AsIHVuaW9uKGdlbmVMaXN0LnVwTG9vcCwgZ2VuZUxpc3QuZG93bkxvb3ApKQpnZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0LmRvd25Mb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LnVwTG9vcCkpCkdPLnVwIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC51cExvb3Auc3BlY2lmaWMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpkb3RwbG90KEdPLnVwKQpHTy5ubyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3Qubm9Mb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKZG90cGxvdChHTy5ubykKR08uZG93biA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuZG93bkxvb3Auc3BlY2lmaWMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpkb3RwbG90KEdPLmRvd24pCgoKIyMgQ2hlY2tpbmcgcGVyY2VudGFnZSBvZiBib2JiaWUgZWFybHkgZ2VuZQoKIyMgSW1wb3J0aW5nIEJvYmJpZSBnZW5lIGNsYXNzaWZpY2F0aW9uCmdlbmVDbHVzdGVyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiYm9iYmllX2dlbmVfY2xhc3NpZmljYXRpb24uY3N2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZ2VuZSwgZW5zdCwgQ2x1c3RlcikKY29sbmFtZXMoZ2VuZUNsdXN0ZXIpIDwtIGMoImdlbmUiLCAiZW5zZW1ibF90cmFuc2NyaXB0X2lkIiwgImNsdXN0ZXIiKQoKCiMjIENvbnZlcnRpbmcgdHJhbnNjcmlwdCBJRCB0byBnZW5lIElECmlkUGFpcl90ZyA8LSBnZXRCTShhdHRyaWJ1dGVzID0gYygiZW5zZW1ibF90cmFuc2NyaXB0X2lkIiwgImVuc2VtYmxfZ2VuZV9pZCIpLAogICAgICAgICAgICAgICAgIGZpbHRlcnMgPSAiZW5zZW1ibF90cmFuc2NyaXB0X2lkIiwKICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBnZW5lQ2x1c3RlciRlbnNlbWJsX3RyYW5zY3JpcHQsCiAgICAgICAgICAgICAgICAgbWFydCA9IGVuc2VtYmwudjEwMikKZ2VuZUNsdXN0ZXIgPC0gZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oaWRQYWlyX3RnLCBieSA9IGMoImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIpKQoKIyBNYWtpbmcgZGF0YSBmb3Igc3RhY2tlZCBiYXJwbG90CmNvdW50R2VuZSA8LSBmdW5jdGlvbihnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCBjbHVzdGVyTmFtZSl7CiAgbnVtIDwtIG5yb3coZ2VuZUNsdXN0ZXIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibF9nZW5lX2lkICVpbiUgZ3JvdXBOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIgJWluJSBjbHVzdGVyTmFtZSkpCiAgcmV0dXJuKG51bSkKfQpjb3VudEdlbmVMaXN0IDwtIGZ1bmN0aW9uKGdlbmVDbHVzdGVyLCBncm91cE5hbWUpewogIG4xIDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCAiRWFybHkiKQogIG4yIDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCAiTWlkZGxlIikKICBuMyA8LWNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCAiTGF0ZSIpCiAgbjQgPC0gY291bnRHZW5lKGdlbmVDbHVzdGVyLCBncm91cE5hbWUsICJUcmFuc2llbnQiKQogIHJldHVybihjKG4xLCBuMiwgbjMsIG40KSkKfQoKZ3JvdXAgPC0gYyhyZXAoInVwIiwgNCksIHJlcCgibm8iLCA0KSwgcmVwKCJkb3duIiwgNCkpCmNsdXN0ZXIgPC0gcmVwKGMoIkVhcmx5IiwgIk1pZGRsZSIsICJMYXRlIiwgIlRyYW5zaWVudCIpLCAzKQpjbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKCJFYXJseSIsICJNaWRkbGUiLCAiTGF0ZSIsICJUcmFuc2llbnQiKSkKdmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC51cExvb3ApLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0Lm5vTG9vcCksCiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ2VuZUxpc3QuZG93bkxvb3ApKQoKZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSkKZ2dwbG90KGRhdGEsIGFlcyhmaWxsPWNsdXN0ZXIsIHk9dmFsdWUsIHg9Z3JvdXApKSArIAogICAgZ2VvbV9iYXIocG9zaXRpb249InN0YWNrIiwgc3RhdCA9ICJpZGVudGl0eSIpICsgdGhlbWVfY2xhc3NpYygpCmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIiwgc3RhdCA9ICJpZGVudGl0eSIpICsgdGhlbWVfY2xhc3NpYygpCgp2YWx1ZSA8LSBjKGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0LnVwTG9vcC5zcGVjaWZpYyksCiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ2VuZUxpc3Qubm9Mb29wLnNwZWNpZmljKSwKICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYykpCgpkYXRhIDwtIGRhdGEuZnJhbWUoZ3JvdXAsIGNsdXN0ZXIsIHZhbHVlKQojIFBsb3R0aW5nCmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJzdGFjayIsIHN0YXQgPSAiaWRlbnRpdHkiKSArIHRoZW1lX2NsYXNzaWMoKQpnZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIHN0YXQgPSAiaWRlbnRpdHkiKSArIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgoKIyMjIyBQLU4KYGBge3J9Cm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCgpnZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICJfcC1uX2Vuc2VtYmxMaXN0LnRzdiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yKQoKZ2VuZUxpc3QudXBMb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9kVEFHX0RNU08gPT0gIlVQIikgJT4lIHVubmVzdChnZW5lKSkkZ2VuZSkKZ2VuZUxpc3Qubm9Mb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9kVEFHX0RNU08gPT0gIk5PIikgJT4lIHVubmVzdChnZW5lKSkkZ2VuZSkKZ2VuZUxpc3QuZG93bkxvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSAiRE9XTiIpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpCgoKCiMgQ0hFQ0tJTkcgSE9XIE1BTlkgR0VORVMgT1ZFUkxBUCBBTU9ORyBVUC9OTy9ET1dOCnNldHNfbGlzdCA8LSBsaXN0KHVwID0gZ2VuZUxpc3QudXBMb29wLAogICAgICAgICAgICAgICAgICBubyA9IGdlbmVMaXN0Lm5vTG9vcCwKICAgICAgICAgICAgICAgICAgZG93biA9IGdlbmVMaXN0LmRvd25Mb29wKQoKIyBDcmVhdGUgdGhlIEV1bGVyIHBsb3QKZXVsZXJfZml0IDwtIGV1bGVyKHNldHNfbGlzdCkKcGxvdChldWxlcl9maXQsCiAgICAgbGFiZWxzID0gVFJVRSwgICMgRGlzcGxheSBzZXQgbGFiZWxzCiAgICAgZmlsbHMgPSBUUlVFLCAgICMgQ29sb3IgZmlsbCB0aGUgcmVnaW9ucwogICAgIHF1YW50aXRpZXMgPSBUUlVFKQoKCiMgR08KR08udXAgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LnVwTG9vcCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpCmRvdHBsb3QoR08udXApCkdPLm5vIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5ub0xvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpkb3RwbG90KEdPLm5vKQpHTy5kb3duIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC5kb3duTG9vcCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpCmRvdHBsb3QoR08uZG93bikKCiMgR08gdG8gb25seSBzcGVjaWZpYyBzdWJzZXQKZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljIDwtIHNldGRpZmYoZ2VuZUxpc3QudXBMb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSkKZ2VuZUxpc3Qubm9Mb29wLnNwZWNpZmljIDwtIHNldGRpZmYoZ2VuZUxpc3Qubm9Mb29wLCB1bmlvbihnZW5lTGlzdC51cExvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSkKZ2VuZUxpc3QuZG93bkxvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5kb3duTG9vcCwgdW5pb24oZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC51cExvb3ApKQpHTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKZG90cGxvdChHTy51cCkKR08ubm8gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpCmRvdHBsb3QoR08ubm8pCkdPLmRvd24gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKZG90cGxvdChHTy5kb3duKQoKCiMjIENoZWNraW5nIHBlcmNlbnRhZ2Ugb2YgYm9iYmllIGVhcmx5IGdlbmUKCiMjIEltcG9ydGluZyBCb2JiaWUgZ2VuZSBjbGFzc2lmaWNhdGlvbgpnZW5lQ2x1c3RlciA8LSBmcmVhZChoZXJlKHJlZkRpciwgImJvYmJpZV9nZW5lX2NsYXNzaWZpY2F0aW9uLmNzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGdlbmUsIGVuc3QsIENsdXN0ZXIpCmNvbG5hbWVzKGdlbmVDbHVzdGVyKSA8LSBjKCJnZW5lIiwgImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIsICJjbHVzdGVyIikKCgojIyBDb252ZXJ0aW5nIHRyYW5zY3JpcHQgSUQgdG8gZ2VuZSBJRAppZFBhaXJfdGcgPC0gZ2V0Qk0oYXR0cmlidXRlcyA9IGMoImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIsICJlbnNlbWJsX2dlbmVfaWQiKSwKICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIsCiAgICAgICAgICAgICAgICAgdmFsdWVzID0gZ2VuZUNsdXN0ZXIkZW5zZW1ibF90cmFuc2NyaXB0LAogICAgICAgICAgICAgICAgIG1hcnQgPSBlbnNlbWJsLnYxMDIpCmdlbmVDbHVzdGVyIDwtIGdlbmVDbHVzdGVyICU+JSBkcGx5cjo6bGVmdF9qb2luKGlkUGFpcl90ZywgYnkgPSBjKCJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiKSkKCiMgTWFraW5nIGRhdGEgZm9yIHN0YWNrZWQgYmFycGxvdApjb3VudEdlbmUgPC0gZnVuY3Rpb24oZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgY2x1c3Rlck5hbWUpewogIG51bSA8LSBucm93KGdlbmVDbHVzdGVyICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdyb3VwTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyICVpbiUgY2x1c3Rlck5hbWUpKQogIHJldHVybihudW0pCn0KY291bnRHZW5lTGlzdCA8LSBmdW5jdGlvbihnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lKXsKICBuMSA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgIkVhcmx5IikKICBuMiA8LSBjb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgIk1pZGRsZSIpCiAgbjMgPC1jb3VudEdlbmUoZ2VuZUNsdXN0ZXIsIGdyb3VwTmFtZSwgIkxhdGUiKQogIG40IDwtIGNvdW50R2VuZShnZW5lQ2x1c3RlciwgZ3JvdXBOYW1lLCAiVHJhbnNpZW50IikKICByZXR1cm4oYyhuMSwgbjIsIG4zLCBuNCkpCn0KCmdyb3VwIDwtIGMocmVwKCJ1cCIsIDQpLCByZXAoIm5vIiwgNCksIHJlcCgiZG93biIsIDQpKQpjbHVzdGVyIDwtIHJlcChjKCJFYXJseSIsICJNaWRkbGUiLCAiTGF0ZSIsICJUcmFuc2llbnQiKSwgMykKY2x1c3RlciA8LSBmYWN0b3IoY2x1c3RlciwgbGV2ZWxzID0gYygiRWFybHkiLCAiTWlkZGxlIiwgIkxhdGUiLCAiVHJhbnNpZW50IikpCnZhbHVlIDwtIGMoY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ2VuZUxpc3QudXBMb29wKSwKICAgICAgICAgICBjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC5ub0xvb3ApLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0LmRvd25Mb29wKSkKCmRhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgY2x1c3RlciwgdmFsdWUpCmdncGxvdChkYXRhLCBhZXMoZmlsbD1jbHVzdGVyLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJzdGFjayIsIHN0YXQgPSAiaWRlbnRpdHkiKSArIHRoZW1lX2NsYXNzaWMoKQpnZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIHN0YXQgPSAiaWRlbnRpdHkiKSArIHRoZW1lX2NsYXNzaWMoKQoKdmFsdWUgPC0gYyhjb3VudEdlbmVMaXN0KGdlbmVDbHVzdGVyLCBnZW5lTGlzdC51cExvb3Auc3BlY2lmaWMpLAogICAgICAgICAgIGNvdW50R2VuZUxpc3QoZ2VuZUNsdXN0ZXIsIGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYyksCiAgICAgICAgICAgY291bnRHZW5lTGlzdChnZW5lQ2x1c3RlciwgZ2VuZUxpc3QuZG93bkxvb3Auc3BlY2lmaWMpKQoKZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSkKIyBQbG90dGluZwpnZ3Bsb3QoZGF0YSwgYWVzKGZpbGw9Y2x1c3RlciwgeT12YWx1ZSwgeD1ncm91cCkpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0ic3RhY2siLCBzdGF0ID0gImlkZW50aXR5IikgKyB0aGVtZV9jbGFzc2ljKCkKZ2dwbG90KGRhdGEsIGFlcyhmaWxsPWNsdXN0ZXIsIHk9dmFsdWUsIHg9Z3JvdXApKSArIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiLCBzdGF0ID0gImlkZW50aXR5IikgKyB0aGVtZV9jbGFzc2ljKCkKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIENoZWNraW5nIGhvdyB0aG9zZSBnZW5lcyBiZWhhdmUgaW4gQTQ4NQpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuQTQ4NS5zZWxlY3RlZDJfRzEuMmkuQTQ4NV92c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKQoKYWxwaGEgPC0gMC4wNQpmY0N1dG9mZiA8LSAwLjUKZGlmZi5STkEub3V0IDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bXV0YXRlKGRpZmYgPSBjYXNlX3doZW4ocGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDID4gZmNDdXRvZmYgfiAiVVAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiB+ICJET1dOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk5PIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVHcm91cCA9IGNhc2Vfd2hlbihlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lTGlzdC51cExvb3AgfiAiY29oZXNpbi11cExvb3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zZW1ibF9nZW5lX2lkICVpbiUgZ2VuZUxpc3Qubm9Mb29wIH4gImNvaGVzaW4tbm9Mb29wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmVMaXN0LmRvd25Mb29wIH4gImNvaGVzaW4tZG93bkxvb3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJOQSIpKQoKCmdncGxvdChkaWZmLlJOQS5vdXQsIGFlcyh4ID0gZ2VuZUdyb3VwLCBmaWxsID0gZGlmZikpICsKICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIpICsgdGhlbWVfYncoKQoKCnVwTG9vcC5kb3duUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gImNvaGVzaW4tdXBMb29wIiwgZGlmZiA9PSAiRE9XTiIpKS9ucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gImNvaGVzaW4tdXBMb29wIikpCnVwTG9vcC51cFBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09ICJjb2hlc2luLXVwTG9vcCIsIGRpZmYgPT0gIlVQIikpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSAiY29oZXNpbi11cExvb3AiKSkKCm5vTG9vcC5kb3duUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gImNvaGVzaW4tbm9Mb29wIiwgZGlmZiA9PSAiRE9XTiIpKS9ucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gImNvaGVzaW4tbm9Mb29wIikpCm5vTG9vcC51cFBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09ICJjb2hlc2luLW5vTG9vcCIsIGRpZmYgPT0gIlVQIikpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSAiY29oZXNpbi1ub0xvb3AiKSkKCmRvd25Mb29wLmRvd25QZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSAiY29oZXNpbi1kb3duTG9vcCIsIGRpZmYgPT0gIkRPV04iKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09ICJjb2hlc2luLWRvd25Mb29wIikpCmRvd25Mb29wLnVwUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gImNvaGVzaW4tZG93bkxvb3AiLCBkaWZmID09ICJVUCIpKS9ucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gImNvaGVzaW4tZG93bkxvb3AiKSkKCgpkYXRhIDwtIHRpYmJsZShnZW5lR3JvdXAgPSBjKCJjb2hlc2luLXVwTG9vcCIsICJjb2hlc2luLXVwTG9vcCIsIAogICAgICAgICAgICAgICAgICAgICAiY29oZXNpbi1ub0xvb3AiLCAiY29oZXNpbi1ub0xvb3AiLCAKICAgICAgICAgICAgICAgICAgICAgImNvaGVzaW4tZG93bkxvb3AiLCAiY29oZXNpbi1kb3duTG9vcCIpLAogICAgICAgZGlmZiA9IHJlcChjKCJET1dOIiwgIlVQIiksIDMpLAogICAgICAgcGVyYyA9IGModXBMb29wLmRvd25QZXJjLCB1cExvb3AudXBQZXJjLCBub0xvb3AuZG93blBlcmMsIG5vTG9vcC51cFBlcmMsIGRvd25Mb29wLmRvd25QZXJjLCBkb3duTG9vcC51cFBlcmMpKjEwMCkKCmdncGxvdChkYXRhLCBhZXMoeCA9IGdlbmVHcm91cCwgeSA9IHBlcmMsIGZpbGwgPSBkaWZmICkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIHRoZW1lX2J3KCkKCgoKCmdlbmVMaXN0Lm5vTG9vcFVuaXF1ZSA8LSBnZW5lTGlzdC5ub0xvb3BbIWdlbmVMaXN0Lm5vTG9vcCAlaW4lIHVuaXF1ZShjKGdlbmVMaXN0LmRvd25Mb29wLCBnZW5lTGlzdC51cExvb3ApKV0KZ2VuZUxpc3QuZG93bkxvb3BVbmlxdWUgPC0gZ2VuZUxpc3QuZG93bkxvb3BbIWdlbmVMaXN0LmRvd25Mb29wICVpbiUgdW5pcXVlKGMoZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC51cExvb3ApKV0KZ2VuZUxpc3QudXBMb29wVW5pcXVlIDwtIGdlbmVMaXN0LnVwTG9vcFshZ2VuZUxpc3QudXBMb29wICVpbiUgdW5pcXVlKGMoZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC5kb3duTG9vcCkpXQoKZGlmZi5STkEub3V0IDwtIGRpZmYuUk5BICU+JSBkcGx5cjo6bXV0YXRlKGRpZmYgPSBjYXNlX3doZW4ocGFkaiA8IGFscGhhICYgc2hyaW5rZWRfbG9nMkZDID4gZmNDdXRvZmYgfiAiVVAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA8IC1mY0N1dG9mZiB+ICJET1dOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk5PIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVHcm91cCA9IGNhc2Vfd2hlbihlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lTGlzdC51cExvb3BVbmlxdWUgIH4gImNvaGVzaW4tdXBMb29wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmVMaXN0Lm5vTG9vcFVuaXF1ZSB+ICJjb2hlc2luLW5vTG9vcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lTGlzdC5kb3duTG9vcFVuaXF1ZSB+ICJjb2hlc2luLWRvd25Mb29wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTkEiKSkKCgpnZ3Bsb3QoZGlmZi5STkEub3V0LCBhZXMoeCA9IGdlbmVHcm91cCwgZmlsbCA9IGRpZmYpKSArCiAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiKSArIHRoZW1lX2J3KCkKCgp1cExvb3AuZG93blBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09ICJjb2hlc2luLXVwTG9vcCIsIGRpZmYgPT0gIkRPV04iKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09ICJjb2hlc2luLXVwTG9vcCIpKQp1cExvb3AudXBQZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSAiY29oZXNpbi11cExvb3AiLCBkaWZmID09ICJVUCIpKS9ucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gImNvaGVzaW4tdXBMb29wIikpCgpub0xvb3AuZG93blBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09ICJjb2hlc2luLW5vTG9vcCIsIGRpZmYgPT0gIkRPV04iKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09ICJjb2hlc2luLW5vTG9vcCIpKQpub0xvb3AudXBQZXJjIDwtIG5yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSAiY29oZXNpbi1ub0xvb3AiLCBkaWZmID09ICJVUCIpKS9ucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gImNvaGVzaW4tbm9Mb29wIikpCgpkb3duTG9vcC5kb3duUGVyYyA8LSBucm93KGRpZmYuUk5BLm91dCAlPiUgZHBseXI6OmZpbHRlcihnZW5lR3JvdXAgPT0gImNvaGVzaW4tZG93bkxvb3AiLCBkaWZmID09ICJET1dOIikpL25yb3coZGlmZi5STkEub3V0ICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVHcm91cCA9PSAiY29oZXNpbi1kb3duTG9vcCIpKQpkb3duTG9vcC51cFBlcmMgPC0gbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09ICJjb2hlc2luLWRvd25Mb29wIiwgZGlmZiA9PSAiVVAiKSkvbnJvdyhkaWZmLlJOQS5vdXQgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZUdyb3VwID09ICJjb2hlc2luLWRvd25Mb29wIikpCgoKZGF0YSA8LSB0aWJibGUoZ2VuZUdyb3VwID0gYygiY29oZXNpbi11cExvb3AiLCAiY29oZXNpbi11cExvb3AiLCAKICAgICAgICAgICAgICAgICAgICAgImNvaGVzaW4tbm9Mb29wIiwgImNvaGVzaW4tbm9Mb29wIiwgCiAgICAgICAgICAgICAgICAgICAgICJjb2hlc2luLWRvd25Mb29wIiwgImNvaGVzaW4tZG93bkxvb3AiKSwKICAgICAgIGRpZmYgPSByZXAoYygiRE9XTiIsICJVUCIpLCAzKSwKICAgICAgIHBlcmMgPSBjKHVwTG9vcC5kb3duUGVyYywgdXBMb29wLnVwUGVyYywgbm9Mb29wLmRvd25QZXJjLCBub0xvb3AudXBQZXJjLCBkb3duTG9vcC5kb3duUGVyYywgZG93bkxvb3AudXBQZXJjKSoxMDApCgpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBnZW5lR3JvdXAsIHkgPSBwZXJjLCBmaWxsID0gZGlmZiApKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKyB0aGVtZV9idygpCgpgYGAKIyMjIEE0ODUKIyMjIyBQLVAsIFAtRQpgYGB7cn0KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKCmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIl9wLXBlX2Vuc2VtYmxMaXN0LnRzdiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yKQoKZ2VuZUxpc3QudXBMb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gIlVQIikgJT4lIHVubmVzdChnZW5lKSkkZ2VuZSkKZ2VuZUxpc3Qubm9Mb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gIk5PIikgJT4lIHVubmVzdChnZW5lKSkkZ2VuZSkKZ2VuZUxpc3QuZG93bkxvb3AgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX0E0ODVfRE1TTyA9PSAiRE9XTiIpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpCgoKCiMgQ0hFQ0tJTkcgSE9XIE1BTlkgR0VORVMgT1ZFUkxBUCBBTU9ORyBVUC9OTy9ET1dOCnNldHNfbGlzdCA8LSBsaXN0KHVwID0gZ2VuZUxpc3QudXBMb29wLAogICAgICAgICAgICAgICAgICBubyA9IGdlbmVMaXN0Lm5vTG9vcCwKICAgICAgICAgICAgICAgICAgZG93biA9IGdlbmVMaXN0LmRvd25Mb29wKQoKIyBDcmVhdGUgdGhlIEV1bGVyIHBsb3QKZXVsZXJfZml0IDwtIGV1bGVyKHNldHNfbGlzdCkKcGxvdChldWxlcl9maXQsCiAgICAgbGFiZWxzID0gVFJVRSwgICMgRGlzcGxheSBzZXQgbGFiZWxzCiAgICAgZmlsbHMgPSBUUlVFLCAgICMgQ29sb3IgZmlsbCB0aGUgcmVnaW9ucwogICAgIHF1YW50aXRpZXMgPSBUUlVFKQoKCiMgR08KR08udXAgPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LnVwTG9vcCwgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpCmRvdHBsb3QoR08udXAsIHNob3dDYXRlZ29yeSA9IDE1KQpHTy5ubyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3Qubm9Mb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKZG90cGxvdChHTy5ubywgc2hvd0NhdGVnb3J5ID0gMTUpCkdPLmRvd24gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmRvd25Mb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKZG90cGxvdChHTy5kb3duLCBzaG93Q2F0ZWdvcnkgPSAyMCkKCiMgR08gdG8gb25seSBzcGVjaWZpYyBzdWJzZXQKZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljIDwtIHNldGRpZmYoZ2VuZUxpc3QudXBMb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSkKZ2VuZUxpc3Qubm9Mb29wLnNwZWNpZmljIDwtIHNldGRpZmYoZ2VuZUxpc3Qubm9Mb29wLCB1bmlvbihnZW5lTGlzdC51cExvb3AsIGdlbmVMaXN0LmRvd25Mb29wKSkKZ2VuZUxpc3QuZG93bkxvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5kb3duTG9vcCwgdW5pb24oZ2VuZUxpc3Qubm9Mb29wLCBnZW5lTGlzdC51cExvb3ApKQpHTy51cCA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QudXBMb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKZG90cGxvdChHTy51cCkKR08ubm8gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0Lm5vTG9vcC5zcGVjaWZpYywgT3JnRGIgPSBvcmcuTW0uZWcuZGIsIGtleVR5cGUgPSAiRU5TRU1CTCIsIG9udCA9ICJCUCIpCmRvdHBsb3QoR08ubm8pCkdPLmRvd24gPC0gZW5yaWNoR08oZ2VuZSA9IGdlbmVMaXN0LmRvd25Mb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKZG90cGxvdChHTy5kb3duLCBzaG93Q2F0ZWdvcnkgPSAyMCkKCgpgYGAKCiMjIyMgUC1OCmBgYHtyfQpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgoKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMikKCmdlbmVMaXN0LnVwTG9vcCA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fQTQ4NV9ETVNPID09ICJVUCIpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpCmdlbmVMaXN0Lm5vTG9vcCA8LSB1bmlxdWUoKGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fQTQ4NV9ETVNPID09ICJOTyIpICU+JSB1bm5lc3QoZ2VuZSkpJGdlbmUpCmdlbmVMaXN0LmRvd25Mb29wIDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gIkRPV04iKSAlPiUgdW5uZXN0KGdlbmUpKSRnZW5lKQoKCgojIENIRUNLSU5HIEhPVyBNQU5ZIEdFTkVTIE9WRVJMQVAgQU1PTkcgVVAvTk8vRE9XTgpzZXRzX2xpc3QgPC0gbGlzdCh1cCA9IGdlbmVMaXN0LnVwTG9vcCwKICAgICAgICAgICAgICAgICAgbm8gPSBnZW5lTGlzdC5ub0xvb3AsCiAgICAgICAgICAgICAgICAgIGRvd24gPSBnZW5lTGlzdC5kb3duTG9vcCkKCiMgQ3JlYXRlIHRoZSBFdWxlciBwbG90CmV1bGVyX2ZpdCA8LSBldWxlcihzZXRzX2xpc3QpCnBsb3QoZXVsZXJfZml0LAogICAgIGxhYmVscyA9IFRSVUUsICAjIERpc3BsYXkgc2V0IGxhYmVscwogICAgIGZpbGxzID0gVFJVRSwgICAjIENvbG9yIGZpbGwgdGhlIHJlZ2lvbnMKICAgICBxdWFudGl0aWVzID0gVFJVRSkKCgojIEdPCkdPLnVwIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC51cExvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpkb3RwbG90KEdPLnVwKQpHTy5ubyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3Qubm9Mb29wLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKZG90cGxvdChHTy5ubykKR08uZG93biA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuZG93bkxvb3AsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpkb3RwbG90KEdPLmRvd24sIHNob3dDYXRlZ29yeSA9IDIwKQoKIyBHTyB0byBvbmx5IHNwZWNpZmljIHN1YnNldApnZW5lTGlzdC51cExvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC51cExvb3AsIHVuaW9uKGdlbmVMaXN0Lm5vTG9vcCwgZ2VuZUxpc3QuZG93bkxvb3ApKQpnZW5lTGlzdC5ub0xvb3Auc3BlY2lmaWMgPC0gc2V0ZGlmZihnZW5lTGlzdC5ub0xvb3AsIHVuaW9uKGdlbmVMaXN0LnVwTG9vcCwgZ2VuZUxpc3QuZG93bkxvb3ApKQpnZW5lTGlzdC5kb3duTG9vcC5zcGVjaWZpYyA8LSBzZXRkaWZmKGdlbmVMaXN0LmRvd25Mb29wLCB1bmlvbihnZW5lTGlzdC5ub0xvb3AsIGdlbmVMaXN0LnVwTG9vcCkpCkdPLnVwIDwtIGVucmljaEdPKGdlbmUgPSBnZW5lTGlzdC51cExvb3Auc3BlY2lmaWMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpkb3RwbG90KEdPLnVwKQpHTy5ubyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3Qubm9Mb29wLnNwZWNpZmljLCBPcmdEYiA9IG9yZy5NbS5lZy5kYiwga2V5VHlwZSA9ICJFTlNFTUJMIiwgb250ID0gIkJQIikKZG90cGxvdChHTy5ubykKR08uZG93biA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZUxpc3QuZG93bkxvb3Auc3BlY2lmaWMsIE9yZ0RiID0gb3JnLk1tLmVnLmRiLCBrZXlUeXBlID0gIkVOU0VNQkwiLCBvbnQgPSAiQlAiKQpkb3RwbG90KEdPLmRvd24pCgoKYGBgCiMjIFsyLjI2XSBDaGVja2luZyB0aGUgQ2hJUCBpbnRlbnNpdHkgYXQgYW5jaG9ycwpUaGlzIGRvZXNuJ3QgaGF2ZSB0byBiZSByZXN0cmljdGVkIHRvIFAtTiBsb29wcy4gTGV0J3MgY2hlY2sgYWxsIGxvb3BzIGZpcnN0LgpBbHNvIGluc3RlYWQgb2YgZGVuc2l0eSAobWVhbiksIG1lZGlhbiBjb3VsZCBiZSBiZXR0ZXIgY2hvaWNlLiBTdW0gaXMgbm90IGFwcHJvcHJpYXRlIGhlcmUgc2luY2UKdGhlIHNpemUgb2YgYW5jaG9ycyBhcmUgbm90IHNhbWUuCiMjIyMgTGltaXRlZCB0byBwZWFrcyB0byByZWR1Y2Ugbm9pc2UKIyMjIyMgZFRBRwpgYGB7cn0KZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGxvb3AgPT1ncm91cDEpICkkc3VtU2NvcmUKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIobG9vcCA9PWdyb3VwMikgKSRzdW1TY29yZQogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCgojIFVQIGxvb3AKbG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlIikpCmFuY2hvci51cCA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwKSkKIyBOTyBsb29wCmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKQphbmNob3Iubm8gPC0gKGV4dHJhY3RBbmNob3IobG9vcC5ubykpCiMgVVAgTk8KbG9vcC51cG5vIDwtIGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKQphbmNob3IudXBubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLnVwbm8pKQojIERPV04gbG9vcApsb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlIikpCmFuY2hvci5kb3duIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuZG93bikpCgpnZXRTdW1TY29yZXMgPC0gZnVuY3Rpb24odHJhY2ssIGFuY2hvcikgewogICMgRmluZCBvdmVybGFwcyBiZXR3ZWVuIGFsbCBhbmNob3JzIGFuZCB0cmFjayByZWdpb25zIGF0IG9uY2UKICBvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLCB0cmFjaykKICAKICAjIEV4dHJhY3QgdGhlIHNjb3JlcyBhbmQgY29ycmVzcG9uZGluZyBhbmNob3IgaW5kaWNlcwogIGFuY2hvcl9pbmRpY2VzIDwtIHF1ZXJ5SGl0cyhvdmVybGFwcykKICB0cmFja19zY29yZXMgPC0gc2NvcmUodHJhY2spW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0KICAKICAjIFVzZSB0YXBwbHkgdG8gY2FsY3VsYXRlIHRoZSBtZWRpYW4gc2NvcmVzIGZvciBlYWNoIGFuY2hvcgogIG1lZGlhbl9zY29yZXMgPC0gdGFwcGx5KHRyYWNrX3Njb3JlcywgYW5jaG9yX2luZGljZXMsIG1lYW4sIG5hLnJtID0gVFJVRSkKICAKICAjIEluaXRpYWxpemUgYSBudW1lcmljIHZlY3RvciB0byBzdG9yZSB0aGUgbWVkaWFuIHNjb3JlcyBmb3IgZWFjaCBhbmNob3IKICBhbGxfbWVkaWFuX3Njb3JlcyA8LSByZXAoTkEsIGxlbmd0aChhbmNob3IpKQogIAogICMgUG9wdWxhdGUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIHRoZSBhbmNob3JzIHRoYXQgaGF2ZSBvdmVybGFwcwogIGFsbF9tZWRpYW5fc2NvcmVzW2FzLm51bWVyaWMobmFtZXMobWVkaWFuX3Njb3JlcykpXSA8LSBtZWRpYW5fc2NvcmVzCiAgCiAgcmV0dXJuKGFsbF9tZWRpYW5fc2NvcmVzKQp9CgpwbG90U3VtU2NvcmVzIDwtIGZ1bmN0aW9uKHRyYWNrLCBwZWFrLCBuYW1lKXsKICBwZWFrVHJhY2sgPC0gdHJhY2tbdW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHModHJhY2ssIHBlYWspKSldCiAgYSA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IudXApCiAgYiA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3Iubm8pCiAgYyA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IuZG93bikKICBhLnRiIDwtIHRpYmJsZShsb29wID0gIlVQIiwKICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGEpCiAgYi50YiA8LSB0aWJibGUobG9vcCA9ICJOTyIsCiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBiKQogIGMudGIgPC0gdGliYmxlKGxvb3AgPSAiRE9XTiIsCiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBjKQogIGRhdGEgPC0gYmluZF9yb3dzKGEudGIsIGIudGIsIGMudGIpICU+JSBkcm9wX25hKCkKICBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBsb29wLCB5ID0gc3VtU2NvcmUpKSArIAogICAgbGFicyh4ID0gTlVMTCwgeSA9IHBhc3RlMChuYW1lLCAiIGF2ZXJhZ2UgcGVhayBzY29yZSBwZXIgYW5jaG9yIikpICsKICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgICAgIG91dGxpZXIuc2l6ZSA9IDEsIG91dGxpZXIuc3Ryb2tlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsKICAgIHN0YXRfc3VtbWFyeSgKICAgICAgYWVzKGdyb3VwID0gbG9vcCksIGZ1biA9IG1lYW4sCiAgICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMSwKICAgICAgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIKICAgICkgKwogICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIHF1YW50aWxlKGRhdGEkc3VtU2NvcmUsIDAuOTUpKSkgKyB0aGVtZSgKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkKfQoKcGxvdFN1bVNjb3Jlc0JpbmFyeSA8LSBmdW5jdGlvbih0cmFjaywgcGVhaywgbmFtZSwgYW5jaG9yLnVwbm8sIGFuY2hvci5kb3duKXsKICBwZWFrVHJhY2sgPC0gdHJhY2tbdW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHModHJhY2ssIHBlYWspKSldCiAgYiA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IudXBubykKICBjIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvci5kb3duKQogIGIudGIgPC0gdGliYmxlKGxvb3AgPSAiVVAvTk8iLAogICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYikKICBjLnRiIDwtIHRpYmJsZShsb29wID0gIkRPV04iLAogICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYykKICBkYXRhIDwtIGJpbmRfcm93cyhiLnRiLCBjLnRiKSAlPiUgZHJvcF9uYSgpCiAgZGF0YSRsb29wIDwtIGZhY3RvcihkYXRhJGxvb3AsIGxldmVscyA9IGMoIlVQL05PIiwgIkRPV04iKSkKICAKICBwMTIgPC0gZ2V0UHZhbFdpbGNveChkYXRhLCAiVVAvTk8iLCAiRE9XTiIpCiAgcCA8LSAgZ2dwbG90KGRhdGEsIGFlcyh4ID0gbmFtZSwgZmlsbCA9IGxvb3AsIHkgPSBzdW1TY29yZSkpICsgCiAgICBsYWJzKHggPSBOVUxMLCB5ID0gcGFzdGUwKCJBdmVyYWdlIENoSVAgcGVhayBzY29yZSBhdCBhbmNob3IpIikpICsKICAgIGludHJvZGF0YXZpejo6Z2VvbV9zcGxpdF92aW9saW4obGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gLjQpICsKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgICBzdGF0X3N1bW1hcnkoCiAgICAgIGFlcyhncm91cCA9IGxvb3ApLCBmdW4gPSBtZWFuLAogICAgICBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSwKICAgICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMykKICAgICkgKyB0aGVtZSgKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVNLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICAgKSwKICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICAgIHNpemUgPSBmb250U2l6ZU0sIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgICApLAogICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBhbmdsZSA9IDAsCiAgICAgICksCiAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KAogICAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgICksCiAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICAgICksCiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgICApLAogICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgICApICsgCiAgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMocXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC4wKSwgcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC45KSkpICsgCiAgICBhbm5vdGF0ZSgKICAgICAidGV4dCIsIHggPSAxLCB5ID0gcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC41KSwKICAgICBsYWJlbCA9IHBhc3RlMCgicDEyOiAiLCBjb252UHZhbHVlKHAxMikpLAogICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMwogICApICsgICBndWlkZXMoCiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKAogICAgICAgIGtleXdpZHRoID0gMC4yLCAgIyBBZGp1c3QgdGhlIHdpZHRoIG9mIHRoZSBsZWdlbmQga2V5cwogICAgICAgIGtleWhlaWdodCA9IDAuMiAgIyBBZGp1c3QgdGhlIGhlaWdodCBvZiB0aGUgbGVnZW5kIGtleXMKICAgICkKICApCiAgCiAgIGZpbGVOYW1lIDwtIHBhc3RlMCgiQ2hJUF9wZWFrX2F2Z1BlYWtTY29yZV8iLCBuYW1lKQogIHdpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoCiAgaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjIpKm1tVG9JbmNoCiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KCiMgU3VtIHBlYWsgc2NvcmUKIyMjIwp0cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsICIzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5idyIpLCBmb3JtYXQgPSAiQmlnV2lnIikKcGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkIikpCiNwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCAiSDNLNG1lMyIpCnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssICJIM0s0bWUzIiwgYW5jaG9yLnVwbm8sIGFuY2hvci5kb3duKQoKdHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCAiR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLmJ3IiksIGZvcm1hdCA9ICJCaWdXaWciKQpwZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsICJHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWQiKSkKI3Bsb3RTdW1TY29yZXModHJhY2ssIHBlYWssICJIM0syN2FjIikKcGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgIkgzSzI3YWMiLCBhbmNob3IudXBubywgYW5jaG9yLmRvd24pCgp0cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsICJHU00yNjgzNDQwX0oxX0gzSzE0YWNfbW0xMExpZnRlZC5ibGFjay5idyIpLCBmb3JtYXQgPSAiQmlnV2lnIikKcGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiR1NNMjY4MzQ0MF9KMV9IM0sxNGFjX21tMTBMaWZ0ZWQuYmVkIikpCiNwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCAiSDNLMTRhYyIpCnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssICJIM0sxNGFjIiwgYW5jaG9yLnVwbm8sIGFuY2hvci5kb3duKQoKdHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCAiMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYnciKSwgZm9ybWF0ID0gIkJpZ1dpZyIpCnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgIjMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZCIpKQojcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgIkNUQ0YiKQpwbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCAiQ1RDRiIsIGFuY2hvci51cG5vLCBhbmNob3IuZG93bikKCnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgIjMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfdHJpbV9xMjBfZGVkdXBfYmxhY2tfZGVwdGhOb3JtLmJ3IiksIGZvcm1hdCA9ICJCaWdXaWciKQpwZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsICIzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWQiKSkKI3Bsb3RTdW1TY29yZXModHJhY2ssIHBlYWssICJSQUQyMSIpCnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssICJSQUQyMSIsIGFuY2hvci51cG5vLCBhbmNob3IuZG93bikKCgpgYGAKIyMjIyMgQTQ4NQpgYGB7cn0KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKCiMgVVAgbG9vcApsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkKYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKQojIE5PIGxvb3AKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlIikpCmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSkKIyBET1dOIGxvb3AKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKQphbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKQoKZ2V0U3VtU2NvcmVzIDwtIGZ1bmN0aW9uKHRyYWNrLCBhbmNob3IpIHsKICAjIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBhbGwgYW5jaG9ycyBhbmQgdHJhY2sgcmVnaW9ucyBhdCBvbmNlCiAgb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvciwgdHJhY2spCiAgCiAgIyBFeHRyYWN0IHRoZSBzY29yZXMgYW5kIGNvcnJlc3BvbmRpbmcgYW5jaG9yIGluZGljZXMKICBhbmNob3JfaW5kaWNlcyA8LSBxdWVyeUhpdHMob3ZlcmxhcHMpCiAgdHJhY2tfc2NvcmVzIDwtIHNjb3JlKHRyYWNrKVtzdWJqZWN0SGl0cyhvdmVybGFwcyldCiAgCiAgIyBVc2UgdGFwcGx5IHRvIGNhbGN1bGF0ZSB0aGUgbWVkaWFuIHNjb3JlcyBmb3IgZWFjaCBhbmNob3IKICBtZWRpYW5fc2NvcmVzIDwtIHRhcHBseSh0cmFja19zY29yZXMsIGFuY2hvcl9pbmRpY2VzLCBzdW0sIG5hLnJtID0gVFJVRSkKICAKICAjIEluaXRpYWxpemUgYSBudW1lcmljIHZlY3RvciB0byBzdG9yZSB0aGUgbWVkaWFuIHNjb3JlcyBmb3IgZWFjaCBhbmNob3IKICBhbGxfbWVkaWFuX3Njb3JlcyA8LSByZXAoTkEsIGxlbmd0aChhbmNob3IpKQogIAogICMgUG9wdWxhdGUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIHRoZSBhbmNob3JzIHRoYXQgaGF2ZSBvdmVybGFwcwogIGFsbF9tZWRpYW5fc2NvcmVzW2FzLm51bWVyaWMobmFtZXMobWVkaWFuX3Njb3JlcykpXSA8LSBtZWRpYW5fc2NvcmVzCiAgCiAgcmV0dXJuKGFsbF9tZWRpYW5fc2NvcmVzKQp9CgpwbG90U3VtU2NvcmVzIDwtIGZ1bmN0aW9uKHRyYWNrLCBwZWFrLCBuYW1lKXsKICBwZWFrVHJhY2sgPC0gdHJhY2tbdW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHModHJhY2ssIHBlYWspKSldCiAgYSA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IudXApCiAgYiA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3Iubm8pCiAgYyA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IuZG93bikKICBhLnRiIDwtIHRpYmJsZShsb29wID0gIlVQIiwKICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGEpCiAgYi50YiA8LSB0aWJibGUobG9vcCA9ICJOTyIsCiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBiKQogIGMudGIgPC0gdGliYmxlKGxvb3AgPSAiRE9XTiIsCiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBjKQogIGRhdGEgPC0gYmluZF9yb3dzKGEudGIsIGIudGIsIGMudGIpICU+JSBkcm9wX25hKCkKICBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBsb29wLCB5ID0gc3VtU2NvcmUpKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAobmFtZSwgIiBzdW0gcGVhayIpKSArCiAgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC45KSkpCn0KCiMgU3VtIHBlYWsgc2NvcmUKIyMjIwp0cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsICIzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5idyIpLCBmb3JtYXQgPSAiQmlnV2lnIikKcGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkIikpCnBsb3RTdW1TY29yZXModHJhY2ssIHBlYWssICJIM0s0bWUzIikKCnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgIkdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5idyIpLCBmb3JtYXQgPSAiQmlnV2lnIikKcGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkIikpCnBsb3RTdW1TY29yZXModHJhY2ssIHBlYWssICJIM0syN2FjIikKCnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgIkdTTTI2ODM0NDBfSjFfSDNLMTRhY19tbTEwTGlmdGVkLmJsYWNrLmJ3IiksIGZvcm1hdCA9ICJCaWdXaWciKQpwZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsICJHU00yNjgzNDQwX0oxX0gzSzE0YWNfbW0xMExpZnRlZC5iZWQiKSkKcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgIkgzSzE0YWMiKQoKdHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCAiMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYnciKSwgZm9ybWF0ID0gIkJpZ1dpZyIpCnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgIjMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZCIpKQpwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCAiQ1RDRiIpCgp0cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsICIzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5idyIpLCBmb3JtYXQgPSAiQmlnV2lnIikKcGVhay50ZW1wIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkIikpICU+JQogIGRwbHlyOjptdXRhdGUoVjIgPSBWMiAtIDEwMDAsCiAgICAgICAgICAgICAgICBWMyA9IFYzICsgMTAwMCkKY29sbmFtZXMocGVhay50ZW1wKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKcGVhayA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocGVhay50ZW1wKQpwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCAiWVkxIikKCgojIyMgRm9yIHRob3NlIHdpdGggb25seSBzdW1taXQKdHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCAiR1NNNTU3MTg5NV9FU0NfWVkxXzEuYnciKSwgZm9ybWF0ID0gIkJpZ1dpZyIpCnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgIkdTTTU1NzE4OTVfRVNDX1lZMV9zdW1taXQuYmVkIikpCnBsb3RTdW1TY29yZXModHJhY2ssIHBlYWssICJSQUQyMSIpCgojIyMgRk9SIFRIT1NFIFdJVEhPVVQgUEVBS1MKdHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCAiR1NNMjA4MjcwOF9FU0MuSDNLMjdtZTMuMV9tbTEwTGlmdGVkLmJsYWNrLmJ3IiksIGZvcm1hdCA9ICJCaWdXaWciKQphIDwtIGdldFN1bVNjb3Jlcyh0cmFjaywgYW5jaG9yLnVwKQpiIDwtIGdldFN1bVNjb3Jlcyh0cmFjaywgYW5jaG9yLm5vKQpjIDwtIGdldFN1bVNjb3Jlcyh0cmFjaywgYW5jaG9yLmRvd24pCmEudGIgPC0gdGliYmxlKGxvb3AgPSAiVVAiLAogICAgICAgICAgICAgICBzdW1TY29yZSA9IGEpCmIudGIgPC0gdGliYmxlKGxvb3AgPSAiTk8iLAogICAgICAgICAgICAgICBzdW1TY29yZSA9IGIpCmMudGIgPC0gdGliYmxlKGxvb3AgPSAiRE9XTiIsCiAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYykKZGF0YSA8LSBiaW5kX3Jvd3MoYS50YiwgYi50YiwgYy50YikgJT4lIGRyb3BfbmEoKQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBsb29wLCB5ID0gc3VtU2NvcmUpKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAoIkgzSzI3bWUzIHN1bSBubyBwZWFrIikpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC45KSkpCmBgYAojIyMjIFBlYWsgZGVuc2l0eSBpbnN0ZWFkIG9mIGludGVuc2l0eQpgYGB7cn0KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKCiMgVVAgbG9vcApsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkKYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKQojIE5PIGxvb3AKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlIikpCmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSkKIyBET1dOIGxvb3AKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKQphbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKQoKCnBlYWsuSDNLNG1lMyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkIikpCnBlYWsuSDNLMjdhYyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkIikpCnBlYWsuQ1RDRiA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkIikpCnBlYWsudGVtcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgIjMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKFYyID0gVjIgLSAxMDAwLAogICAgICAgICAgICAgICAgVjMgPSBWMyArIDEwMDApCmNvbG5hbWVzKHBlYWsudGVtcCkgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCnBlYWsuUkFEMjEgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHBlYWsudGVtcCkKCgpjYWxjdWxhdGVQZWFrRGVuc2l0eSA8LSBmdW5jdGlvbihwZWFrLCBub3RlKXsKICAKICBvdmVybGFwX2NvdW50cyA8LSBjb3VudE92ZXJsYXBzKGFuY2hvci51cCwgcGVhaykKICBhbmNob3Jfd2lkdGhzIDwtICh3aWR0aChhbmNob3IudXApLTEpLzEwMDAKICBkZW5zaXR5IDwtIG92ZXJsYXBfY291bnRzIC8gYW5jaG9yX3dpZHRocwogIGRhdGExIDwtIHRpYmJsZSh0eXBlID0gIlVQIiwKICAgICAgICAgICAgICAgICAgZGVuc2l0eVBlcktiID0gZGVuc2l0eSkKICAKICBvdmVybGFwX2NvdW50cyA8LSBjb3VudE92ZXJsYXBzKGFuY2hvci5ubywgcGVhaykKICBhbmNob3Jfd2lkdGhzIDwtICh3aWR0aChhbmNob3Iubm8pLTEpLzEwMDAKICBkZW5zaXR5IDwtIG92ZXJsYXBfY291bnRzIC8gYW5jaG9yX3dpZHRocwogIG1jb2xzKGFuY2hvci5ubykkZGVuc2l0eSA8LSBkZW5zaXR5CiAgZGF0YTIgPC0gdGliYmxlKHR5cGUgPSAiTk8iLAogICAgICAgICAgICAgICAgICBkZW5zaXR5UGVyS2IgPSBkZW5zaXR5KQogIAogIG92ZXJsYXBfY291bnRzIDwtIGNvdW50T3ZlcmxhcHMoYW5jaG9yLmRvd24sIHBlYWspCiAgYW5jaG9yX3dpZHRocyA8LSAod2lkdGgoYW5jaG9yLmRvd24pLTEpLzEwMDAKICBkZW5zaXR5IDwtIG92ZXJsYXBfY291bnRzIC8gYW5jaG9yX3dpZHRocwogIG1jb2xzKGFuY2hvci5kb3duKSRkZW5zaXR5IDwtIGRlbnNpdHkKICBkYXRhMyA8LSB0aWJibGUodHlwZSA9ICJET1dOIiwKICAgICAgICAgICAgICAgICAgZGVuc2l0eVBlcktiID0gZGVuc2l0eSkKICAKICBkYXRhIDwtIGJpbmRfcm93cyhkYXRhMSwgZGF0YTIsIGRhdGEzKQogIAogIGdncGxvdChkYXRhLCBhZXMoeCA9IHR5cGUsIHkgPSBkZW5zaXR5UGVyS2IpKSAgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjEgKSArIHRoZW1lX2J3KCkgKyBnZ3RpdGxlKG5vdGUpICsKICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCBxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjkpKSkKfQoKY2FsY3VsYXRlUGVha0RlbnNpdHkocGVhay5IM0s0bWUzLCAiSDNLNG1lMyIpCmNhbGN1bGF0ZVBlYWtEZW5zaXR5KHBlYWsuSDNLMjdhYywgIkgzSzI3YWMiKQpjYWxjdWxhdGVQZWFrRGVuc2l0eShwZWFrLkNUQ0YsICJDVENGIikKY2FsY3VsYXRlUGVha0RlbnNpdHkocGVhay5SQUQyMSwgIlJBRDIxIikKCmBgYAoKIyMgWzIuMjddIE92ZXJsYXAgd2l0aCBTRT8KIyMjIyBRMS4gSG93IG1hbnkgU0VzIGFyZSBjb3ZlcmVkIHdpdGggTWljcm8tQyBsb29wcz8KYGBge3J9Cm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmxvb3AgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlIikpCmFuY2hvciA8LSBleHRyYWN0QW5jaG9yKGxvb3ApCgojIyMgV2h5dGUKbiA8LSBsZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IsIHBlYWsuV2h5dGUuU0UpKSkpCnRvdGFsIDwtIGxlbmd0aChwZWFrLldoeXRlLlNFKQpjb3VudHMgPC0gYyhuLCB0b3RhbCAtIG4pCmxhYmVscyA8LSBwYXN0ZShjKCJjb3ZlcmVkIiwgIk5PVCBjb3ZlcmVkIiksIGNvdW50cykKcGllKGNvdW50cywgbGFiZWxzID0gbGFiZWxzLCAgbWFpbiA9IHBhc3RlMCgiV2h5dGUgU0UgY292ZXJhZ2UgXG4iLCB0b3RhbCksIGNvbCA9IGMoImdyZXkiLCAid2hpdGUiKSkKCmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCAicGllX1NFX1doeXRlIikKd2lkdGggPC0gcGFuZWxTaXplKDQpKm1tVG9JbmNoCmhlaWdodCA8LSBwYW5lbFNpemUoNCkqbW1Ub0luY2gKIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID1oZWlnaHQpCiMgcGllKGNvdW50cywgbGFiZWxzID0gbGFiZWxzLCAgbWFpbiA9IHBhc3RlMCgiV2h5dGUgU0UgY292ZXJhZ2UgXG4iLCB0b3RhbCksIGNvbCA9IGMoImdyZXkiLCAid2hpdGUiKSwKIyAgICAgY2V4ID0gMSwgY2V4Lm1haW4gPSAxKQojIGRldi5vZmYoKQoKCgojIyMgRHlsYW4KbiA8LSBsZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IsIHBlYWsuRHlsYW4uU0UpKSkpCnRvdGFsIDwtIGxlbmd0aChwZWFrLkR5bGFuLlNFKQpjb3VudHMgPC0gYyhuLCB0b3RhbCAtIG4pCmxhYmVscyA8LSBwYXN0ZShjKCJjb3ZlcmVkIiwgIk5PVCBjb3ZlcmVkIiksIGNvdW50cykKcGllKGNvdW50cywgbGFiZWxzID0gbGFiZWxzLCBtYWluID0gcGFzdGUwKCJEeWxhbiBTRSBjb3ZlcmFnZSBcbiIsIHRvdGFsKSwgY29sID0gYygiZ3JleSIsICJ3aGl0ZSIpKQoKZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsICJwaWVfU0VfTXVycGh5IikKd2lkdGggPC0gcGFuZWxTaXplKDQpKm1tVG9JbmNoCmhlaWdodCA8LSBwYW5lbFNpemUoNCkqbW1Ub0luY2gKIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSwgd2lkdGggPSB3aWR0aCwgaGVpZ2h0ID1oZWlnaHQpCiMgcGllKGNvdW50cywgbGFiZWxzID0gbGFiZWxzLCBtYWluID0gcGFzdGUwKCJNdXJwaHkgU0UgY292ZXJhZ2UgXG4iLCB0b3RhbCksIGNvbCA9IGMoImdyZXkiLCAid2hpdGUiKSkKIyAKIyBkZXYub2ZmKCkKCmBgYAojIyMjIFEyLiBGaXNoZXIncyBleGFjdCB0ZXN0PwojIyMjIyBkVEFHCmBgYHtyfQpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5Igpsb29wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZS5iZWRwZSIpKQoKZ2V0T3ZlcmxhcExvb3BOdW0gPC0gZnVuY3Rpb24obG9vcCwgcGVhayl7CiAgYW5jaG9yMSA8LSBHUmFuZ2VzKHNlcW5hbWVzID0gbG9vcCRWMSwgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGxvb3AkVjIsIGVuZCA9IGxvb3AkVjMpKQogIGFuY2hvcjIgPC0gR1JhbmdlcyhzZXFuYW1lcyA9IGxvb3AkVjQsIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBsb29wJFY1LCBlbmQgPSBsb29wJFY2KSkKICBhIDwtIHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoYW5jaG9yMSwgcGVhaykpCiAgYiA8LSBxdWVyeUhpdHMoZmluZE92ZXJsYXBzKGFuY2hvcjIsIHBlYWspKQogIHJldHVybihsZW5ndGgodW5pcXVlKGMoYSwgYikpKSkKfQoKZ2V0U0VPdmVybGFwRmlzaGVyIDwtIGZ1bmN0aW9uKGFsbExvb3AsIHN1YnNldExvb3AsIHBlYWspewogIGFsbC5vdmVybGFwIDwtIGdldE92ZXJsYXBMb29wTnVtKGFsbExvb3AsIHBlYWspCiAgYWxsLm5vdE92ZXJsYXAgPC0gbnJvdyhhbGxMb29wKSAtIGFsbC5vdmVybGFwCiAgCiAgc3Vic2V0Lm92ZXJsYXAgPC0gZ2V0T3ZlcmxhcExvb3BOdW0oc3Vic2V0TG9vcCwgcGVhaykKICBzdWJzZXQubm90T3ZlcmxhcCA8LSBucm93KHN1YnNldExvb3ApIC0gc3Vic2V0Lm92ZXJsYXAKICAKICBjb250aW5nZW5jeV90YWJsZSA8LSBtYXRyaXgoYyhzdWJzZXQub3ZlcmxhcCwgc3Vic2V0Lm5vdE92ZXJsYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLm92ZXJsYXAsIGFsbC5ub3RPdmVybGFwKSwgbnJvdyA9IDIsIGJ5cm93ID0gVFJVRSkKICBjb2xuYW1lcyhjb250aW5nZW5jeV90YWJsZSkgPC0gYygiT3ZlcmxhcHBpbmciLCAiTm90X092ZXJsYXBwaW5nIikKICByb3duYW1lcyhjb250aW5nZW5jeV90YWJsZSkgPC0gYygiQWxsIGxvb3BzIiwgIlN1YnNldCBsb29wcyIpCiAgCiAgIyBQZXJmb3JtIEZpc2hlcidzIEV4YWN0IFRlc3QKICBmaXNoZXJfdGVzdF9yZXN1bHQgPC0gZmlzaGVyLnRlc3QoY29udGluZ2VuY3lfdGFibGUpCiAgcmV0dXJuKGZpc2hlcl90ZXN0X3Jlc3VsdCkKfQoKCgpsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlIikpCmxvb3AudXBubyA8LSBiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKQoKIyMjIER5bGFuCiMgU2VlZGluZwp0ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwbm8sIHBlYWsuRHlsYW4uU0UpCnJlc3VsdC50YiA8LSB0aWJibGUobG9vcFR5cGUgPSAiVVAvTk8iLAogICAgICAgICAgICAgICAgICAgIHRhcmdldCA9ICJEeWxhbiBTRSIsCiAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpCgojIHRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AudXAsIHBlYWsuRHlsYW4uU0UpCiMgcmVzdWx0LnRiIDwtIHRpYmJsZShsb29wVHlwZSA9ICJVUCIsCiMgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAiRHlsYW4gU0UiLAojICAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAojICAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKIyBBZGQgcm93CiMgdGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5ubywgcGVhay5EeWxhbi5TRSkKIyByZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSAKIyAgIGFkZF9yb3cobG9vcFR5cGUgPSAiTk8iLAojICAgICAgICAgICB0YXJnZXQgPSAiRHlsYW4gU0UiLAojICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsCiMgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpCgp0ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLmRvd24sIHBlYWsuRHlsYW4uU0UpCnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIAogIGFkZF9yb3cobG9vcFR5cGUgPSAiRE9XTiIsCiAgICAgICAgICB0YXJnZXQgPSAiRHlsYW4gU0UiLAogICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKCiMjIyBXaHl0ZQojIFNlZWRpbmcKIyB0ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwLCBwZWFrLldoeXRlLlNFKQojIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIAojICAgYWRkX3Jvdyhsb29wVHlwZSA9ICJVUCIsCiMgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAiV2h5dGUgU0UiLAojICAgICAgICAgICAgICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAojICAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKCiMgQWRkIHJvdwp0ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwbm8sIHBlYWsuV2h5dGUuU0UpCnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIAogIGFkZF9yb3cobG9vcFR5cGUgPSAiVVAvTk8iLAogICAgICAgICAgdGFyZ2V0ID0gIldoeXRlIFNFIiwKICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSwKICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpCgp0ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLmRvd24sIHBlYWsuV2h5dGUuU0UpCnJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIAogIGFkZF9yb3cobG9vcFR5cGUgPSAiRE9XTiIsCiAgICAgICAgICB0YXJnZXQgPSAiV2h5dGUgU0UiLAogICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKCgojIFZpc3VhbGl6YXRpb24KbGlicmFyeShjaXJjbGl6ZSkKZGF0YSA8LSByZXN1bHQudGIKaGVhdG1hcF9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBsb29wVHlwZSwgb2Rkc1JhdGlvKSAlPiUKcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGxvb3BUeXBlLCB2YWx1ZXNfZnJvbSA9IG9kZHNSYXRpbykgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJ0YXJnZXQiKQoKcHZhbHVlX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGxvb3BUeXBlLCBwdmFsdWUpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBsb29wVHlwZSwgdmFsdWVzX2Zyb20gPSBwdmFsdWUpICU+JQogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAidGFyZ2V0IikKCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDIpLCAKICAgICAgICAgICAgICAgICAgICAgIGMoIiM0ODUyQTAiLCAid2hpdGUiLCAiI0NCMzMzQSIpKQoKcCA8LSBIZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX2RhdGEpLAogICAgICAgIG5hbWUgPSAiT2RkcyBSYXRpbyIsCiAgICAgICAgY29sID0gY29sX2Z1biwKICAgICAgICAjIEFkZCBhbm5vdGF0aW9uIGZvciBwLXZhbHVlcwogICAgICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaiwgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkgewogICAgICAgICAgcHZhbCA8LSBwdmFsdWVfZGF0YVtpLCBqXQogICAgICAgICAgbGFiZWwgPC0gaWZlbHNlKHB2YWwgPiAwLjA1LCAibi5zLiIsIHNwcmludGYoIiUuMmUiLCBwdmFsKSkKICAgICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCwgeSwgZ3AgPSBncGFyKGZvbnRzaXplID0gZm9udFNpemVTLCBmb250ZmFtaWx5ID0gZm9udFR5cGUpKQogICAgICAgIH0sCiAgICAgICAgIyBDdXN0b21pemUgdGhlIGhlYXRtYXAgbGF5b3V0CiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSwKICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3Bhcihmb250c2l6ZSA9IGZvbnRTaXplUywgZm9udGZhbWlseSA9IGZvbnRUeXBlKSwKICBjb2x1bW5fbmFtZXNfZ3AgPSBncGFyKGZvbnRzaXplID0gZm9udFNpemVTLCBmb250ZmFtaWx5ID0gZm9udFR5cGUpLAogICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdCgKICAgICAgICAgIGF0ID0gYygwLCAxLCAyKSwKICAgICAgICAgIGxhYmVscyA9IGMoIjAiLCAiMSIsICIyIiksCiAgICAgICAgICB0aXRsZV9ncCA9IGdwYXIoZm9udGZhbWlseSA9IGZvbnRUeXBlLCBmb250c2l6ZSA9IGZvbnRTaXplUyksCiAgICAgICAgICBsYWJlbHNfZ3AgPSBncGFyKGZvbnRmYW1pbHkgPSBmb250VHlwZSwgZm9udHNpemUgPSBmb250U2l6ZVMpCiAgICAgICAgKQopCgojIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCAiaGVhdG1hcF9TRV9lbnJpY2htZW50IikKIyB3aWR0aCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaAojIGhlaWdodCA8LSBwYW5lbFNpemUoMC43KSptbVRvSW5jaAojIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPWhlaWdodCkKIyBwcmludChwKQojIGRldi5vZmYoKQojIHBuZyhwYXN0ZTAoZmlsZU5hbWUsICIucG5nIiksIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9aGVpZ2h0LCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iKQojIHByaW50KHApCiMgZGV2Lm9mZigpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZGF0YSRsb29wVHlwZSA8LSBmYWN0b3IoZGF0YSRsb29wVHlwZSwgbGV2ZWxzID0gYygiVVAvTk8iLCAiRE9XTiIpKQpkYXRhJHRhcmdldCA8LSBmYWN0b3IoZGF0YSR0YXJnZXQsIGxldmVscyA9IGMoIldoeXRlIFNFIiwgIkR5bGFuIFNFIikpCgpwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGxvb3BUeXBlLCB5ID0gdGFyZ2V0LCBzaXplID0gLWxvZzEwKHB2YWx1ZSksIGZpbGwgPSBvZGRzUmF0aW8pKSArCiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lCiAgICAgICAgICAgICBzdHJva2UgPSAxKnB0VG9NTSAgICAgICMgTGluZSB3aWR0aCBmb3IgdGhlIGJvcmRlcgogICkgKyB0aGVtZV9idygpICsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCAzKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycyA9IGMoIiM0ODUyQTAiLCAid2hpdGUiLCAiI0NCMzMzQSIpLCAgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBzY2FsZXM6OnJlc2NhbGUoYygwLjUsIDEsIDEuNSkpLCBsaW1pdHMgPSBjKDAuNSwgMS41KSwgCiAgICAgICAgICAgICAgICAgICAgICAjbG93ID0gIndoaXRlIiwgaGlnaCA9ICIjQ0IzMzNBIiwKICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEsIDMpLAogICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9ycwogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcigKICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXIKICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyCiAgICAgICAgICAgICAgICAgICAgICApCiAgKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlcwogICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApCgpmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgImhlYXRtYXBfU0VfZW5yaWNobWVudF9kb3RwbG90IikKd2lkdGggPC0gcGFuZWxTaXplKDEuOCkqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjEpKm1tVG9JbmNoCiMgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiMgcHJpbnQocCkKIyBkZXYub2ZmKCkKc3ZnbGl0ZShwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIiksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKYGBgCiMjIyMjIEE0ODUKYGBge3J9Cm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmxvb3AgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlIikpCgpnZXRPdmVybGFwTG9vcE51bSA8LSBmdW5jdGlvbihsb29wLCBwZWFrKXsKICBhbmNob3IxIDwtIEdSYW5nZXMoc2VxbmFtZXMgPSBsb29wJFYxLCByYW5nZXMgPSBJUmFuZ2VzKHN0YXJ0ID0gbG9vcCRWMiwgZW5kID0gbG9vcCRWMykpCiAgYW5jaG9yMiA8LSBHUmFuZ2VzKHNlcW5hbWVzID0gbG9vcCRWNCwgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGxvb3AkVjUsIGVuZCA9IGxvb3AkVjYpKQogIGEgPC0gcXVlcnlIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IxLCBwZWFrKSkKICBiIDwtIHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoYW5jaG9yMiwgcGVhaykpCiAgcmV0dXJuKGxlbmd0aCh1bmlxdWUoYyhhLCBiKSkpKQp9CgpnZXRTRU92ZXJsYXBGaXNoZXIgPC0gZnVuY3Rpb24oYWxsTG9vcCwgc3Vic2V0TG9vcCwgcGVhayl7CiAgYWxsLm92ZXJsYXAgPC0gZ2V0T3ZlcmxhcExvb3BOdW0oYWxsTG9vcCwgcGVhaykKICBhbGwubm90T3ZlcmxhcCA8LSBucm93KGFsbExvb3ApIC0gYWxsLm92ZXJsYXAKICAKICBzdWJzZXQub3ZlcmxhcCA8LSBnZXRPdmVybGFwTG9vcE51bShzdWJzZXRMb29wLCBwZWFrKQogIHN1YnNldC5ub3RPdmVybGFwIDwtIG5yb3coc3Vic2V0TG9vcCkgLSBzdWJzZXQub3ZlcmxhcAogIAogIGNvbnRpbmdlbmN5X3RhYmxlIDwtIG1hdHJpeChjKHN1YnNldC5vdmVybGFwLCBzdWJzZXQubm90T3ZlcmxhcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwub3ZlcmxhcCwgYWxsLm5vdE92ZXJsYXApLCBucm93ID0gMiwgYnlyb3cgPSBUUlVFKQogIGNvbG5hbWVzKGNvbnRpbmdlbmN5X3RhYmxlKSA8LSBjKCJPdmVybGFwcGluZyIsICJOb3RfT3ZlcmxhcHBpbmciKQogIHJvd25hbWVzKGNvbnRpbmdlbmN5X3RhYmxlKSA8LSBjKCJBbGwgbG9vcHMiLCAiU3Vic2V0IGxvb3BzIikKICAKICAjIFBlcmZvcm0gRmlzaGVyJ3MgRXhhY3QgVGVzdAogIGZpc2hlcl90ZXN0X3Jlc3VsdCA8LSBmaXNoZXIudGVzdChjb250aW5nZW5jeV90YWJsZSkKICByZXR1cm4oZmlzaGVyX3Rlc3RfcmVzdWx0KQp9CgoKCmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZSIpKQpsb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX05PX2RpZmYwLjIuYmVkcGUiKSkKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKQoKIyMjIER5bGFuCiMgU2VlZGluZwp0ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwLCBwZWFrLkR5bGFuLlNFKQpyZXN1bHQudGIgPC0gdGliYmxlKGxvb3BUeXBlID0gIlVQIiwKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAiRHlsYW4gU0UiLAogICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKQojIEFkZCByb3cKdGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5ubywgcGVhay5EeWxhbi5TRSkKcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgCiAgYWRkX3Jvdyhsb29wVHlwZSA9ICJOTyIsCiAgICAgICAgICB0YXJnZXQgPSAiRHlsYW4gU0UiLAogICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKCnRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AuZG93biwgcGVhay5EeWxhbi5TRSkKcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgCiAgYWRkX3Jvdyhsb29wVHlwZSA9ICJET1dOIiwKICAgICAgICAgIHRhcmdldCA9ICJEeWxhbiBTRSIsCiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsCiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKQoKIyMjIFdoeXRlCiMgU2VlZGluZwp0ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwLCBwZWFrLldoeXRlLlNFKQpyZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSAKICBhZGRfcm93KGxvb3BUeXBlID0gIlVQIiwKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAiV2h5dGUgU0UiLAogICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKQojIEFkZCByb3cKdGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5ubywgcGVhay5XaHl0ZS5TRSkKcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgCiAgYWRkX3Jvdyhsb29wVHlwZSA9ICJOTyIsCiAgICAgICAgICB0YXJnZXQgPSAiV2h5dGUgU0UiLAogICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKCnRlbXAgPC0gZ2V0U0VPdmVybGFwRmlzaGVyKGxvb3AsIGxvb3AuZG93biwgcGVhay5XaHl0ZS5TRSkKcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgCiAgYWRkX3Jvdyhsb29wVHlwZSA9ICJET1dOIiwKICAgICAgICAgIHRhcmdldCA9ICJXaHl0ZSBTRSIsCiAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsCiAgICAgICAgICBvZGRzUmF0aW8gPSB0ZW1wJGVzdGltYXRlKQoKCiMgVmlzdWFsaXphdGlvbgpsaWJyYXJ5KGNpcmNsaXplKQpkYXRhIDwtIHJlc3VsdC50YgpoZWF0bWFwX2RhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIGxvb3BUeXBlLCBvZGRzUmF0aW8pICU+JQpwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbG9vcFR5cGUsIHZhbHVlc19mcm9tID0gb2Rkc1JhdGlvKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gInRhcmdldCIpCgpwdmFsdWVfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgbG9vcFR5cGUsIHB2YWx1ZSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGxvb3BUeXBlLCB2YWx1ZXNfZnJvbSA9IHB2YWx1ZSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJ0YXJnZXQiKQoKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgNSksIAogICAgICAgICAgICAgICAgICAgICAgYygiYmx1ZSIsICJ3aGl0ZSIsICJyZWQiKSkKCkhlYXRtYXAoYXMubWF0cml4KGhlYXRtYXBfZGF0YSksCiAgICAgICAgbmFtZSA9ICJPZGRzIFJhdGlvIiwKICAgICAgICBjb2wgPSBjb2xfZnVuLAogICAgICAgICMgQWRkIGFubm90YXRpb24gZm9yIHAtdmFsdWVzCiAgICAgICAgY2VsbF9mdW4gPSBmdW5jdGlvbihqLCBpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsKSB7CiAgICAgICAgICBwdmFsIDwtIHB2YWx1ZV9kYXRhW2ksIGpdCiAgICAgICAgICBsYWJlbCA8LSBpZmVsc2UocHZhbCA+IDAuMDUsICJuLnMuIiwgc3ByaW50ZigiJS4yZSIsIHB2YWwpKQogICAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4LCB5LCBncCA9IGdwYXIoZm9udHNpemUgPSAxMCkpCiAgICAgICAgfSwKICAgICAgICAjIEN1c3RvbWl6ZSB0aGUgaGVhdG1hcCBsYXlvdXQKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLAogICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSwKICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwKICAgICAgICBjb2x1bW5fdGl0bGUgPSAiSW50ZXJlc3QiLAogICAgICAgIHJvd190aXRsZSA9ICJUYXJnZXQiLAogICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChhdCA9IGMoMCwgMSwgMiwgMywgNCwgNSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIpKSkKCgoKYGBgCgoKIyMgWzIuMjhdIENvbXBhcmluZyBkaWZmZXJlbnRpYWwgbG9vcHMgaW4gZFRBRyB0byBBNDg1ClRoZSBxdWVzdGlvbiBJIHdhbnQgdG8gYXNrIGhlcmUgaXMgd2hldGhlciBwZXJ0dXJiZWQgbG9vcHMgaW4gZFRBRyBleHBlcmltZW50cyBhcmUgZWl0aGVyIHBlcnR1cmJlZCBvciBub3QgcGVydHVyYmVkIGluIEE0ODUgZXhwZXJpbWVudC4gSWYgdGhlcmUgaXMgY29tcGVuc2F0aW9uIGdvaW5nIG9uIGJldHdlZW4gUkFEMjEgYW5kIEE0ODUsIFVQIGxvb3AgaW4gUkFEMjEgc2hvdWxkIGJlIG1vcmUgRE9XTiBpbiBBNDg1IGFuZCB2aWNlIHZlcnNhCiMjIyMgRXhwbG9yYXRvcnkgcGFydApgYGB7cn0KZGlmZkN1dG9mZiA8LSAwLjIKbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICIudHN2IikpKQpkYXRhIDwtIGRhdGEgJT4lCiAgICBkcGx5cjo6bXV0YXRlKHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiBkaWZmQ3V0b2ZmLCAiVVAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgIk5PIiwgIkRPV04iKSksCiAgICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiBkaWZmQ3V0b2ZmLCAiVVAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgIk5PIiwgIkRPV04iKSkpCgogdGVtcCA8LSBkYXRhCiAgdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkZGlmZl9kVEFHX0RNU08sIHRlbXAkZGlmZl9BNDg1X0RNU08sIG4gPSAxMDApCiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQogIAogIHAxIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGRpZmZfZFRBR19ETVNPLCB5ID0gZGlmZl9BNDg1X0RNU08sIGNvbG9yID0gZGVuc2l0eSkpICsKICAgIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArIAogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgYWxwaGEgPSAxLCBjb2xvciA9ICJibGFjayIpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBhbHBoYSA9IDEsIGNvbG9yID0gImJsYWNrIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZGlmZkN1dG9mZiwgYWxwaGEgPSAxLCBjb2xvciA9ICJibGFjayIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC1kaWZmQ3V0b2ZmLCBhbHBoYSA9IDEsIGNvbG9yID0gImJsYWNrIikgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICtjb29yZF9maXhlZChyYXRpbyA9IDEsIHlsaW0gPSBjKC0xLCAxKSwgeGxpbSA9IGMoLTEsIDEpKSArIAogICAgdGhlbWVfY2xhc3NpYygpCiAgCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJzY2F0dGVycGxvdF8iLCBuYW1lLCAiXyIsIGRpZmZDdXRvZmYsICJfZGlmZl8iLCBsb29wTmFtZSwgIl9kVEFHLSIsIGRpZmZOYW1lKQogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzKQogIHByaW50KHAxKQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksIAogICAgICAgICAgd2lkdGggPSAzLjUsIGhlaWdodCA9IDMpCiAgcHJpbnQocDEpCiAgZGV2Lm9mZigpCgoKCmBgYAoKCiMjIyMgU2NhdHRlcnBsb3QgJiBib3ggcGxvdApgYGB7cn0KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICIudHN2IikpKQpkYXRhIDwtIGRhdGEgJT4lCiAgICBkcGx5cjo6bXV0YXRlKHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiBkaWZmQ3V0b2ZmLCAiVVAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgIk5PIiwgIkRPV04iKSksCiAgICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiBkaWZmQ3V0b2ZmLCAiVVAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgIk5PIiwgIkRPV04iKSkpCgptYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHIDwtIGZ1bmN0aW9uKGRhdGEsIEFubm9MaXN0LCBkaWZmLCBuYW1lLCBsb29wTmFtZSwgZGlmZk5hbWUpewogIHRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIEFubm9MaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRvd25fZFRBR19ETVNPICVpbiUgZGlmZikKICB0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRkaWZmX2RUQUdfRE1TTywgdGVtcCRkaWZmX0E0ODVfRE1TTywgbiA9IDEwMCkKICB0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCgogIHAxIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGRpZmZfZFRBR19ETVNPLCB5ID0gZGlmZl9BNDg1X0RNU08sIGNvbG9yID0gZGVuc2l0eSkpICsKICAgIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArIAogICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtZGlmZkN1dG9mZiwgY29sID0gImdyZXkiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IGRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICtjb29yZF9maXhlZChyYXRpbyA9IDEsIHlsaW0gPSBjKC0xLCAxKSwgeGxpbSA9IGMoLTEsIDEpKSArIAogICAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShwYXN0ZTAobmFtZSwgIl8iLCBsb29wTmFtZSwgIl9kVEFHLSIsIGRpZmZOYW1lKSkgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkKICAKICBmaWxlTmFtZSA8LSBwYXN0ZTAoInNjYXR0ZXJwbG90XyIsIG5hbWUsICJfIiwgZGlmZkN1dG9mZiwgIl9kaWZmXyIsIGxvb3BOYW1lLCAiX2RUQUctIiwgZGlmZk5hbWUpCiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXRzID0gImluIiwgd2lkdGggPSAzLjUsIGhlaWdodCA9IDMpCiAgcHJpbnQocDEpCiAgZGV2Lm9mZigpCiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgCiAgICAgICAgICB3aWR0aCA9IDMuNSwgaGVpZ2h0ID0gMykKICBwcmludChwMSkKICBkZXYub2ZmKCkKfQoKbWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyhkYXRhLCB1bmlxdWUoZGF0YSRBbm5vMiksIGMoIlVQIiwgIk5PIiwgIkRPV04iKSwgbmFtZSwgImFsbCIsICJhbGwiKQptYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIHVuaXF1ZShkYXRhJEFubm8yKSwgYygiVVAiKSwgbmFtZSwgImFsbCIsICJVUCIpCm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKCJOTyIpLCBuYW1lLCAiYWxsIiwgIk5PIikKbWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyhkYXRhLCB1bmlxdWUoZGF0YSRBbm5vMiksIGMoIkRPV04iKSwgbmFtZSwgImFsbCIsICJET1dOIikKCm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgYygiUC1QIiwgIlAtRSIsICJFLUUiKSwgYygiVVAiLCAiTk8iLCAiRE9XTiIpLCBuYW1lLCAicGUtcGUiLCAiYWxsIikKbWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyhkYXRhLCBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpLCBjKCJVUCIpLCBuYW1lLCAicGUtcGUiLCAiVVAiKQptYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksIGMoIk5PIiksIG5hbWUsICJwZS1wZSIsICJOTyIpCm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgYygiUC1QIiwgIlAtRSIsICJFLUUiKSwgYygiRE9XTiIpLCBuYW1lLCAicGUtcGUiLCAiRE9XTiIpCgptYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoIlMtUyIsICJTLVgiKSwgYygiVVAiLCAiTk8iLCAiRE9XTiIpLCBuYW1lLCAic3RyIiwgImFsbCIpCm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdGRUQUcoZGF0YSwgYygiUy1TIiwgIlMtWCIpLCBjKCJVUCIpLCBuYW1lLCAic3RyIiwgIlVQIikKbWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90ZFRBRyhkYXRhLCBjKCJTLVMiLCAiUy1YIiksIGMoIk5PIiksIG5hbWUsICJzdHIiLCAiTk8iKQptYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RkVEFHKGRhdGEsIGMoIlMtUyIsICJTLVgiKSwgYygiRE9XTiIpLCBuYW1lLCAic3RyIiwgIkRPV04iKQoKbWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NSA8LSBmdW5jdGlvbihkYXRhLCBBbm5vTGlzdCwgZGlmZiwgbmFtZSwgbG9vcE5hbWUsIGRpZmZOYW1lKXsKICB0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBBbm5vTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyAlaW4lIGRpZmYpCiAgdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkZGlmZl9kVEFHX0RNU08sIHRlbXAkZGlmZl9BNDg1X0RNU08sIG4gPSAxMDApCiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQoKICBwMSA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBkaWZmX2RUQUdfRE1TTywgeSA9IGRpZmZfQTQ4NV9ETVNPLCBjb2xvciA9IGRlbnNpdHkpKSArCiAgICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKyAKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArY29vcmRfZml4ZWQocmF0aW8gPSAxLCB5bGltID0gYygtMSwgMSksIHhsaW0gPSBjKC0xLCAxKSkgKyAKICAgIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUocGFzdGUwKG5hbWUsICJfIiwgbG9vcE5hbWUsICJfQTQ4NUctIiwgZGlmZk5hbWUpKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKQogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgic2NhdHRlcnBsb3RfIiwgbmFtZSwgIl8iLCBkaWZmQ3V0b2ZmLCAiX2RpZmZfIiwgbG9vcE5hbWUsICJfQTQ4NS0iLCBkaWZmTmFtZSkKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDMuNSwgaGVpZ2h0ID0gMykKICBwcmludChwMSkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAKICAgICAgICAgIHdpZHRoID0gMy41LCBoZWlnaHQgPSAzKQogIHByaW50KHAxKQogIGRldi5vZmYoKQp9CgptYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIHVuaXF1ZShkYXRhJEFubm8yKSwgYygiVVAiLCAiTk8iLCAiRE9XTiIpLCBuYW1lLCAiYWxsIiwgImFsbCIpCm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjKCJVUCIpLCBuYW1lLCAiYWxsIiwgIlVQIikKbWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NShkYXRhLCB1bmlxdWUoZGF0YSRBbm5vMiksIGMoIk5PIiksIG5hbWUsICJhbGwiLCAiTk8iKQptYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIHVuaXF1ZShkYXRhJEFubm8yKSwgYygiRE9XTiIpLCBuYW1lLCAiYWxsIiwgIkRPV04iKQoKbWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NShkYXRhLCBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpLCBjKCJVUCIsICJOTyIsICJET1dOIiksIG5hbWUsICJwZS1wZSIsICJhbGwiKQptYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksIGMoIlVQIiksIG5hbWUsICJwZS1wZSIsICJVUCIpCm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgYygiUC1QIiwgIlAtRSIsICJFLUUiKSwgYygiTk8iKSwgbmFtZSwgInBlLXBlIiwgIk5PIikKbWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NShkYXRhLCBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpLCBjKCJET1dOIiksIG5hbWUsICJwZS1wZSIsICJET1dOIikKCm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgYygiUy1TIiwgIlMtWCIpLCBjKCJVUCIsICJOTyIsICJET1dOIiksIG5hbWUsICJzdHIiLCAiYWxsIikKbWFrZUFjcm9zc1NhbXBsZVNjYXR0ZXJwbG90QTQ4NShkYXRhLCBjKCJTLVMiLCAiUy1YIiksIGMoIlVQIiksIG5hbWUsICJzdHIiLCAiVVAiKQptYWtlQWNyb3NzU2FtcGxlU2NhdHRlcnBsb3RBNDg1KGRhdGEsIGMoIlMtUyIsICJTLVgiKSwgYygiTk8iKSwgbmFtZSwgInN0ciIsICJOTyIpCm1ha2VBY3Jvc3NTYW1wbGVTY2F0dGVycGxvdEE0ODUoZGF0YSwgYygiUy1TIiwgIlMtWCIpLCBjKCJET1dOIiksIG5hbWUsICJzdHIiLCAiRE9XTiIpCgojIyMjIyMjIyBCYXJwbG90CnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdCh1cGRvd25fZFRBR19ETVNPLCBkaWZmX0E0ODVfRE1TTykKZ2dwbG90KHRlbXAsIGFlcyh4ID0gdXBkb3duX2RUQUdfRE1TTywgeSA9IGRpZmZfQTQ4NV9ETVNPKSkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0wLjIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuNSkpCgp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpKSAlPiUgZHBseXI6OnNlbGVjdCh1cGRvd25fZFRBR19ETVNPLCBkaWZmX0E0ODVfRE1TTykgCmdncGxvdCh0ZW1wLCBhZXMoeCA9IHVwZG93bl9kVEFHX0RNU08sIHkgPSBkaWZmX0E0ODVfRE1TTykpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC41LCAwLjUpKQoKCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoIlMtUyIsICJTLVgiKSkgJT4lIGRwbHlyOjpzZWxlY3QodXBkb3duX2RUQUdfRE1TTywgZGlmZl9BNDg1X0RNU08pIApnZ3Bsb3QodGVtcCwgYWVzKHggPSB1cGRvd25fZFRBR19ETVNPLCB5ID0gZGlmZl9BNDg1X0RNU08pKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4yLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTAuMiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC41KSkKCiMjIwp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodXBkb3duX0E0ODVfRE1TTywgZGlmZl9kVEFHX0RNU08pCmdncGxvdCh0ZW1wLCBhZXMoeCA9IHVwZG93bl9BNDg1X0RNU08sIHkgPSBkaWZmX2RUQUdfRE1TTykpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyB0aGVtZV9jbGFzc2ljKCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC41LCAwLjUpKQoKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYygiUC1QIiwgIlAtRSIsICJFLUUiKSkgJT4lIGRwbHlyOjo6c2VsZWN0KHVwZG93bl9BNDg1X0RNU08sIGRpZmZfZFRBR19ETVNPKQpnZ3Bsb3QodGVtcCwgYWVzKHggPSB1cGRvd25fQTQ4NV9ETVNPLCB5ID0gZGlmZl9kVEFHX0RNU08pKSArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4yLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTAuMiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC41KSkKCgp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJTLVMiLCAiUy1YIikpICU+JSBkcGx5cjo6OnNlbGVjdCh1cGRvd25fQTQ4NV9ETVNPLCBkaWZmX2RUQUdfRE1TTykKZ2dwbG90KHRlbXAsIGFlcyh4ID0gdXBkb3duX0E0ODVfRE1TTywgeSA9IGRpZmZfZFRBR19ETVNPKSkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0wLjIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuNSkpCgpgYGAKCiMjIFsyLjI5XSBDb21wYXJ0bWVudCBhbmFseXNpcwpRLiBXaGF0IGFyZSB0aGUgY2hhbmdlcyBpbiBjb21wYXJ0bWVudCBsZXZlbCB1cG9uIEE0ODUgdHJlYXRtZW50PwojIyMjIENvbXBhcnRtZW50IGNoYW5nZSBkaXN0cmlidXRpb24KYGBge3J9CiMjIyBJTVBPUlRJTkcgQ09NUEFSTVRORVQgU0NPUkVTCmNvbXBEaXIgPC0gaGVyZSgiLi4vLi4iLCAicmVzdWx0IiwgImNvbXBhcnRtZW50IiwgIkNzY29yZVRvb2xzIikKCmNzY29yZS5ETVNPIDwtIGFzX3RpYmJsZShmcmVhZChoZXJlKGNvbXBEaXIsICJHMURNU09fTWVyZ2VkXzEwa2JfY3Njb3JlX2ZpbmFsLmJlZGdyYXBoIiksIHNraXAgPSAxKSkgJT4lCiAgZHBseXI6Om11dGF0ZShWMiA9IFYyICsgMSkKY29sbmFtZXMoY3Njb3JlLkRNU08pIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiLCAiY3Njb3JlX0RNU08iKQoKY3Njb3JlLkE0ODUgPC0gYXNfdGliYmxlKGZyZWFkKGhlcmUoY29tcERpciwgIkcxQTQ4NV9NZXJnZWRfMTBrYl9jc2NvcmVfZmluYWwuYmVkZ3JhcGgiKSwgc2tpcCA9IDEpKSAlPiUKICBkcGx5cjo6bXV0YXRlKFYyID0gVjIgKyAxKQpjb2xuYW1lcyhjc2NvcmUuQTQ4NSkgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIsICJjc2NvcmVfQTQ4NSIpCgoKY3Njb3JlIDwtIGRwbHlyOjpmdWxsX2pvaW4oY3Njb3JlLkRNU08sIGNzY29yZS5BNDg1LCBieSA9IGMoImNociIsICJzdGFydCIsICJlbmQiKSkKCiMgRklMVEVSIFJPV1MgV0lUSCBOQQpjc2NvcmUgPC0gY3Njb3JlICU+JSBmaWx0ZXIoIWlmX2FueShldmVyeXRoaW5nKCksIGlzLm5hKSkKCiMgQW5ub3RhdGluZyBob3cgdGhlIGNvbXBhcnRtZW50IGNoYW5nZWQKdGhyZXNob2xkIDwtIDAuMQpjc2NvcmUgPC0gY3Njb3JlICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoaXNBQl9ETVNPID0gaWZlbHNlKGNzY29yZV9ETVNPID4gMCwgIkEiLCAiQiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBQl9BNDg1ID0gaWZlbHNlKGNzY29yZV9BNDg1ID4gMCwgIkEiLCAiQiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlVHlwZSA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGNzY29yZV9ETVNPIC0gY3Njb3JlX0E0ODUpIDwgdGhyZXNob2xkIH4gIlVuY2hhbmdlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUJfRE1TTyA9PSAiQSIgJiBpc0FCX0E0ODUgPT0gIkIiIH4gIkF0b0IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FCX0RNU08gPT0gIkIiICYgaXNBQl9BNDg1ID09ICJBIiB+ICJCdG9BIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBQl9ETVNPID09ICJBIiAmIGlzQUJfQTQ4NSA9PSAiQSIgJiBhYnMoY3Njb3JlX0RNU08pID4gYWJzKGNzY29yZV9BNDg1KSB+ICJBX3dlYWtlbmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUJfRE1TTyA9PSAiQSIgJiBpc0FCX0E0ODUgPT0gIkEiICYgYWJzKGNzY29yZV9ETVNPKSA8PSBhYnMoY3Njb3JlX0E0ODUpIH4gIkFfc3RyZW5ndGhlbmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUJfRE1TTyA9PSAiQiIgJiBpc0FCX0E0ODUgPT0gIkIiICYgYWJzKGNzY29yZV9ETVNPKSA+IGFicyhjc2NvcmVfQTQ4NSkgfiAiQl93ZWFrZW5pbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FCX0RNU08gPT0gIkIiICYgaXNBQl9BNDg1ID09ICJCIiAmIGFicyhjc2NvcmVfRE1TTykgPD0gYWJzKGNzY29yZV9BNDg1KSB+ICJCX3N0cmVuZ3RoZW5pbmciICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCmNzY29yZV9zdW1tYXJ5IDwtIHRpYmJsZShjb21wYXJpc29uID0gcmVwKCJBNDg1X3ZzX0RNU08iLCA3KSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVR5cGUgPSBjKCJBdG9CIiwgIkJ0b0EiLCAiQV93ZWFrZW5pbmciLCAiQV9zdHJlbmd0aGVuaW5nIiwgIkJfd2Vha2VuaW5nIiwgIkJfc3RyZW5ndGhlbmluZyIsICJVbmNoYW5nZWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYyhzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gIkF0b0IiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gIkJ0b0EiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gIkFfd2Vha2VuaW5nIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKGNzY29yZSRjaGFuZ2VUeXBlID09ICJBX3N0cmVuZ3RoZW5pbmciKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gIkJfd2Vha2VuaW5nIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKGNzY29yZSRjaGFuZ2VUeXBlID09ICJCX3N0cmVuZ3RoZW5pbmciKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oY3Njb3JlJGNoYW5nZVR5cGUgPT0gIlVuY2hhbmdlZCIpKSkKY3Njb3JlX3N1bW1hcnkkY2hhbmdlVHlwZSA8LSBmYWN0b3IoY3Njb3JlX3N1bW1hcnkkY2hhbmdlVHlwZSwgbGV2ZWxzID0gYygiQV93ZWFrZW5pbmciLCAiQXRvQiIsICJCX3N0cmVuZ3RoZW5pbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCX3dlYWtlbmluZyIsICJCdG9BIiwgIkFfc3RyZW5ndGhlbmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuY2hhbmdlZCIpKQpnZ3Bsb3QoY3Njb3JlX3N1bW1hcnksIGFlcyh4ID0gY29tcGFyaXNvbiwgeSA9IHZhbHVlLCBmaWxsID0gY2hhbmdlVHlwZSkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAic3RhY2siLCBzdGF0ID0gImlkZW50aXR5IikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInNreWJsdWUiLCAiYmx1ZSIsICJkYXJrYmx1ZSIsICJwaW5rIiwgInJlZDIiLCAiZGFya3JlZCIgLCJncmV5IikpCiAgCmBgYAojIyMjIENvbWJpbmluZyB3aXRoIFJOQS1zZXEKYGBge3J9CmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWQiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gIisiLCBWMiwgVjMpKSAlPiUKICBkcGx5cjo6c2VsZWN0KFYxLCBUU1MsIFY2KQpjb2xuYW1lcyhnZW5lLnRiKSA8LSBjKCJjaHIiLCAiVFNTIiwgImVuc2VtYmwiKQoKZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLkE0ODUuc2VsZWN0ZWQyX0cxLjJpLkE0ODVfdnNfRzEuMmkuRE1TTy50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGxvZzJGb2xkQ2hhbmdlLCBzaHJpbmtlZF9sb2cyRkMsIHBhZGosIGV4dGVybmFsX2dlbmVfbmFtZSkKZGlmZi5STkEgPC0gZGlmZi5STkEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZS50YiwgYnkgPSBjKCJlbnNlbWJsX2dlbmVfaWQiID0gImVuc2VtYmwiKSkgJT4lCiAgZHBseXI6OmZpbHRlcighaXMubmEoVFNTKSkKCmFscGhhIDwtIDAuMDUKZmNDdXRvZmYgPC0gMC41CgpkaWZmLlJOQSA8LSBkaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShkaWZmID0gY2FzZV93aGVuKHBhZGogPCBhbHBoYSAmIHNocmlua2VkX2xvZzJGQyA+IGZjQ3V0b2ZmIH4gIlVQIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgYWxwaGEgJiBzaHJpbmtlZF9sb2cyRkMgPCAtZmNDdXRvZmYgfiAiRE9XTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJOTyIpKQoKCmdldENvbXBDaGFuZ2VUeXBlIDwtIGZ1bmN0aW9uKGNocm9tLCBUU1MsIGNzY29yZS50Yil7CiAgdGVtcC50YiA8LSBjc2NvcmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoY2hyID09IGNocm9tLCBzdGFydCA8IFRTUywgZW5kID4gVFNTKQogIG91dCA8LSB0ZW1wLnRiJGNoYW5nZVR5cGUKICBpZihsZW5ndGgob3V0KSA8IDEpewogICAgcmV0dXJuKE5BKQogIH1lbHNlewogICAgcmV0dXJuKG91dCkKICB9Cn0KCmNzY29yZS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoY3Njb3JlWzE6M10pCnRlbXAgPC1kaWZmLlJOQSAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IFRTUywgZW5kID0gVFNTICsxKSAlPiUKICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZCkKZGlmZi5STkEuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApCm92ZXJsYXAgPC0gZmluZE92ZXJsYXBzKGRpZmYuUk5BLmdyLCBjc2NvcmUuZ3IpCgojY3Njb3JlLnNlbGVjdGVkIDwtIGNzY29yZSAlPiUgZHBseXI6OnNsaWNlKHN1YmplY3RIaXRzKG92ZXJsYXApKQojIyBQcm9ibGVtIG9mIGNlcnRhaW4gZ2VuZXMgbm90IGdldHRpbmcgb3ZlcmxhcCB3aXRoIGNzY29yZSBkdWUgdG8gc3BhcnNlIGNhbGxpbmc/CmJhdGNoMSA8LSBiaW5kX2NvbHMoZGlmZi5STkFbcXVlcnlIaXRzKG92ZXJsYXApXSwKICAgICAgICAgIGRhdGEudGFibGUoY3Njb3JlKVtzdWJqZWN0SGl0cyhvdmVybGFwKV0pCgoKbWlzc2VkIDwtIGRpZmYuUk5BWy1xdWVyeUhpdHMob3ZlcmxhcCldCnRlbXAgPC0gbWlzc2VkICU+JSBkcGx5cjo6bXV0YXRlKFRTUyA9IFRTUyArIDEwMDAwKSAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IFRTUywgZW5kID0gVFNTICsxKSAlPiUKICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZCkKbWlzc2VkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKQpvdmVybGFwIDwtIGZpbmRPdmVybGFwcyhtaXNzZWQuZ3IsIGNzY29yZS5ncikKYmF0Y2gyIDwtIGJpbmRfY29scyhtaXNzZWRbcXVlcnlIaXRzKG92ZXJsYXApXSwKICAgICAgICAgICAgICAgICAgICBkYXRhLnRhYmxlKGNzY29yZSlbc3ViamVjdEhpdHMob3ZlcmxhcCldKQoKbWlzc2VkMiA8LSBtaXNzZWRbLXF1ZXJ5SGl0cyhvdmVybGFwKV0KdGVtcCA8LSBtaXNzZWQyICU+JSBkcGx5cjo6bXV0YXRlKFRTUyA9IFRTUyAtIDEwMDAwKSAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IFRTUywgZW5kID0gVFNTICsxKSAlPiUKICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZCkKbWlzc2VkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKQpvdmVybGFwIDwtIGZpbmRPdmVybGFwcyhtaXNzZWQuZ3IsIGNzY29yZS5ncikKYmF0Y2gzIDwtIGJpbmRfY29scyhtaXNzZWQyW3F1ZXJ5SGl0cyhvdmVybGFwKV0sCiAgICAgICAgICAgICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSkKCiNtaXNzZWQzIDwtIG1pc3NlZDJbLXF1ZXJ5SGl0cyhvdmVybGFwKV0KCgpkaWZmLlJOQSA8LSBiaW5kX3Jvd3MoYmF0Y2gxLCBiYXRjaDIsIGJhdGNoMykKCgojIFZJU1VBTElaRQpkaWZmLlJOQSRjaGFuZ2VUeXBlIDwtIGZhY3RvcihkaWZmLlJOQSRjaGFuZ2VUeXBlLCBsZXZlbHMgPSBjKCJBX3dlYWtlbmluZyIsICJBdG9CIiwgIkJfc3RyZW5ndGhlbmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJfd2Vha2VuaW5nIiwgIkJ0b0EiLCAiQV9zdHJlbmd0aGVuaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5jaGFuZ2VkIikpCmdncGxvdChkaWZmLlJOQSwgYWVzKHggPSBkaWZmLCBmaWxsID0gY2hhbmdlVHlwZSkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIGxhYnModGl0bGUgPSAiU3RhY2tlZCBCYXIgUGxvdCBvZiBDaGFuZ2UgVHlwZSBieSBEaWZmIiwKICAgICAgIHggPSAiRGlmZiIsCiAgICAgICB5ID0gIkNvdW50IikgKwogIHRoZW1lX2J3KCkgKyAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygic2t5Ymx1ZSIsICJibHVlIiwgImRhcmtibHVlIiwgInBpbmsiLCAicmVkMiIsICJkYXJrcmVkIiAsImdyZXkiKSkKCgoKYGBgCiMjIyMgQ29tYmluaW5nIHdpdGggbG9vcApgYGB7cn0KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKCiMgVVAgbG9vcApsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkKYW5jaG9yLnVwIDwtIChleHRyYWN0QW5jaG9yKGxvb3AudXApKQphbmNob3IudXAudGIgPC0gYXNfdGliYmxlKGFuY2hvci51cCkgJT4lCiAgZHBseXI6Om11dGF0ZShjZW50ZXIgPSAoc3RhcnQgKyBlbmQpLzIpICU+JQogIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBjZW50ZXItMSwgZW5kID0gY2VudGVyKzEpICU+JQogIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpCmFuY2hvci51cCA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYW5jaG9yLnVwLnRiKQojIE5PIGxvb3AKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlIikpCmFuY2hvci5ubyA8LSAoZXh0cmFjdEFuY2hvcihsb29wLm5vKSkKYW5jaG9yLm5vLnRiIDwtIGFzX3RpYmJsZShhbmNob3Iubm8pICU+JQogIGRwbHlyOjptdXRhdGUoY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKSAlPiUKICBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gY2VudGVyLTEsIGVuZCA9IGNlbnRlcisxKSAlPiUKICBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kKQphbmNob3Iubm8gPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGFuY2hvci5uby50YikKIyBET1dOIGxvb3AKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKQphbmNob3IuZG93biA8LSAoZXh0cmFjdEFuY2hvcihsb29wLmRvd24pKQphbmNob3IuZG93bi50YiA8LSBhc190aWJibGUoYW5jaG9yLmRvd24pICU+JQogIGRwbHlyOjptdXRhdGUoY2VudGVyID0gKHN0YXJ0ICsgZW5kKS8yKSAlPiUKICBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gY2VudGVyLTEsIGVuZCA9IGNlbnRlcisxKSAlPiUKICBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kKQphbmNob3IuZG93biA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYW5jaG9yLmRvd24udGIpCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyBPdmVybGFwCmNzY29yZS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoY3Njb3JlWzE6M10pCm92ZXJsYXAgPC0gZmluZE92ZXJsYXBzKGFuY2hvci51cCwgY3Njb3JlLmdyKQoKIyMgUHJvYmxlbSBvZiBjZXJ0YWluIGdlbmVzIG5vdCBnZXR0aW5nIG92ZXJsYXAgd2l0aCBjc2NvcmUgZHVlIHRvIHNwYXJzZSBjYWxsaW5nPwpiYXRjaDEgPC0gYmluZF9jb2xzKGRhdGEudGFibGUoYW5jaG9yLnVwLnRiKVtxdWVyeUhpdHMob3ZlcmxhcCldLAogICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSkKCgptaXNzZWQgPC0gZGF0YS50YWJsZShhbmNob3IudXAudGIpWy1xdWVyeUhpdHMob3ZlcmxhcCldCnRlbXAgPC0gbWlzc2VkICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gc3RhcnQgLSAxMDAwMCwgZW5kID0gZW5kIC0gMTAwMDApICU+JQogIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpCm1pc3NlZC5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCkKb3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMobWlzc2VkLmdyLCBjc2NvcmUuZ3IpCmJhdGNoMiA8LSBiaW5kX2NvbHMoKG1pc3NlZClbcXVlcnlIaXRzKG92ZXJsYXApXSwKICAgICAgICAgIGRhdGEudGFibGUoY3Njb3JlKVtzdWJqZWN0SGl0cyhvdmVybGFwKV0pCgoKZGF0YS51cCA8LSBiaW5kX3Jvd3MoYmF0Y2gxLCBiYXRjaDIpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIE92ZXJsYXAKY3Njb3JlLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShjc2NvcmVbMTozXSkKb3ZlcmxhcCA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vLCBjc2NvcmUuZ3IpCgojIyBQcm9ibGVtIG9mIGNlcnRhaW4gZ2VuZXMgbm90IGdldHRpbmcgb3ZlcmxhcCB3aXRoIGNzY29yZSBkdWUgdG8gc3BhcnNlIGNhbGxpbmc/CmJhdGNoMSA8LSBiaW5kX2NvbHMoZGF0YS50YWJsZShhbmNob3Iubm8udGIpW3F1ZXJ5SGl0cyhvdmVybGFwKV0sCiAgICAgICAgICBkYXRhLnRhYmxlKGNzY29yZSlbc3ViamVjdEhpdHMob3ZlcmxhcCldKQoKCm1pc3NlZCA8LSBkYXRhLnRhYmxlKGFuY2hvci5uby50YilbLXF1ZXJ5SGl0cyhvdmVybGFwKV0KdGVtcCA8LSBtaXNzZWQgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBzdGFydCAtIDEwMDAwLCBlbmQgPSBlbmQgLSAxMDAwMCkgJT4lCiAgZHBseXI6OnNlbGVjdChzZXFuYW1lcywgc3RhcnQsIGVuZCkKbWlzc2VkLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKQpvdmVybGFwIDwtIGZpbmRPdmVybGFwcyhtaXNzZWQuZ3IsIGNzY29yZS5ncikKYmF0Y2gyIDwtIGJpbmRfY29scygobWlzc2VkKVtxdWVyeUhpdHMob3ZlcmxhcCldLAogICAgICAgICAgZGF0YS50YWJsZShjc2NvcmUpW3N1YmplY3RIaXRzKG92ZXJsYXApXSkKCgpkYXRhLm5vIDwtIGJpbmRfcm93cyhiYXRjaDEsIGJhdGNoMikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMgT3ZlcmxhcApjc2NvcmUuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGNzY29yZVsxOjNdKQpvdmVybGFwIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgY3Njb3JlLmdyKQoKIyMgUHJvYmxlbSBvZiBjZXJ0YWluIGdlbmVzIG5vdCBnZXR0aW5nIG92ZXJsYXAgd2l0aCBjc2NvcmUgZHVlIHRvIHNwYXJzZSBjYWxsaW5nPwpiYXRjaDEgPC0gYmluZF9jb2xzKGRhdGEudGFibGUoYW5jaG9yLmRvd24udGIpW3F1ZXJ5SGl0cyhvdmVybGFwKV0sCiAgICAgICAgICBkYXRhLnRhYmxlKGNzY29yZSlbc3ViamVjdEhpdHMob3ZlcmxhcCldKQoKCm1pc3NlZCA8LSBkYXRhLnRhYmxlKGFuY2hvci5kb3duLnRiKVstcXVlcnlIaXRzKG92ZXJsYXApXQp0ZW1wIDwtIG1pc3NlZCAlPiUgZHBseXI6Om11dGF0ZShzdGFydCA9IHN0YXJ0IC0gMTAwMDAsIGVuZCA9IGVuZCAtIDEwMDAwKSAlPiUKICBkcGx5cjo6c2VsZWN0KHNlcW5hbWVzLCBzdGFydCwgZW5kKQptaXNzZWQuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApCm92ZXJsYXAgPC0gZmluZE92ZXJsYXBzKG1pc3NlZC5nciwgY3Njb3JlLmdyKQpiYXRjaDIgPC0gYmluZF9jb2xzKChtaXNzZWQpW3F1ZXJ5SGl0cyhvdmVybGFwKV0sCiAgICAgICAgICBkYXRhLnRhYmxlKGNzY29yZSlbc3ViamVjdEhpdHMob3ZlcmxhcCldKQoKCmRhdGEuZG93biA8LSBiaW5kX3Jvd3MoYmF0Y2gxLCBiYXRjaDIpCgpuLnVwIDwtIG5yb3coZGF0YS51cCkKbi5ubyA8LSBucm93KGRhdGEubm8pCm4uZG93biA8LSBucm93KGRhdGEuZG93bikKCmRhdGEgPC0gdGliYmxlKGxvb3BEaWZmID0gYyhyZXAoIlVQIiwgbi51cCksIHJlcCgiTk8iLCBuLm5vKSwgcmVwKCJET1dOIiwgbi5kb3duKSksCiAgICAgICAgICAgICAgY2hhbmdlVHlwZSA9IGMoZGF0YS51cCRjaGFuZ2VUeXBlLCBkYXRhLm5vJGNoYW5nZVR5cGUsIGRhdGEuZG93biRjaGFuZ2VUeXBlKSkKCiMgVklTVUFMSVpFCmRhdGEkY2hhbmdlVHlwZSA8LSBmYWN0b3IoZGF0YSRjaGFuZ2VUeXBlLCBsZXZlbHMgPSBjKCJBX3dlYWtlbmluZyIsICJBdG9CIiwgIkJfc3RyZW5ndGhlbmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJfd2Vha2VuaW5nIiwgIkJ0b0EiLCAiQV9zdHJlbmd0aGVuaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5jaGFuZ2VkIikpCmdncGxvdChkYXRhLCBhZXMoeCA9IGxvb3BEaWZmLCBmaWxsID0gY2hhbmdlVHlwZSkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIGxhYnModGl0bGUgPSAiU3RhY2tlZCBCYXIgUGxvdCBvZiBDaGFuZ2UgVHlwZSBieSBEaWZmIiwKICAgICAgIHggPSAiRGlmZiIsCiAgICAgICB5ID0gIkNvdW50IikgKwogIHRoZW1lX2J3KCkgKyAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygic2t5Ymx1ZSIsICJibHVlIiwgImRhcmtibHVlIiwgInBpbmsiLCAicmVkMiIsICJkYXJrcmVkIiAsImdyZXkiKSkKCgoKCmBgYAojIyBbMi4zMF0gQ2hyb21ITU0KYGBge3J9CnJlc3VsdERpciA8LSBoZXJlKCIuLi8uLi9yZXN1bHQiKQoKZGF0YSA8LSBmcmVhZChoZXJlKHJlc3VsdERpciwgImNocm9tSE1NIiwgIkE0ODVfcGUtcGVfYW5jaG9ycyIsICJvdmVybGFwX2VucmljaF8xMDBfc3RhdGUudHh0IikpCmNvbG5hbWVzKGRhdGEpIDwtIGMoInN0YXRlIiwgImdlbm9tZSIsICJwZS1wZV9BNDg1X2Rvd24iLCAicGUtcGVfQTQ4NV9ubyIsICJwZS1wZV9BNDg1X3VwIikKZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KC1nZW5vbWUpCgpkYXRhX21hdHJpeCA8LSBkYXRhICU+JQogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAic3RhdGUiKSAlPiUKICBhcy5tYXRyaXgoKQoKbGlicmFyeShjaXJjbGl6ZSkKCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDEwKSwgCiAgICAgICAgICAgICAgICAgICAgICBjKCJibHVlIiwgIndoaXRlIiwgInJlZCIpKQoKSGVhdG1hcCgKICBkYXRhX21hdHJpeCwKICBuYW1lID0gIlZhbHVlIiwKICBzaG93X3Jvd19uYW1lcyA9IFRSVUUsCiAgc2hvd19jb2x1bW5fbmFtZXMgPSBUUlVFLAogIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLAogIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICBjb2wgPSBjb2xfZnVuCikKCiMjIyMjIyMKZGF0YTIgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDQpKQpkYXRhMiA8LSBkYXRhMiAlPiUgZHBseXI6OmZpbHRlcihgcGUtcGVfQTQ4NV9kb3duYCA+IGBwZS1wZV9BNDg1X3VwYCkKZGF0YV9tYXRyaXggPC0gZGF0YTIgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJzdGF0ZSIpICU+JQogIGFzLm1hdHJpeCgpCgpsaWJyYXJ5KGNpcmNsaXplKQoKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMCwgMSwgMTApLCAKICAgICAgICAgICAgICAgICAgICAgIGMoImJsdWUiLCAid2hpdGUiLCAicmVkIikpCgpIZWF0bWFwKAogIGRhdGFfbWF0cml4LAogIG5hbWUgPSAiVmFsdWUiLAogIHNob3dfcm93X25hbWVzID0gVFJVRSwKICBzaG93X2NvbHVtbl9uYW1lcyA9IFRSVUUsCiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsCiAgIGNvbCA9IGNvbF9mdW4KKQoKCmBgYAoKIyMgWzIuMzFdIE1ha2luZyBWaXN1YWxpemF0aW9uIEVhc3kKaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL2Jvb2tzL2RldmVsL09IQ0EvcGFnZXMvdmlzdWFsaXphdGlvbi5odG1sCmBgYHtyfQojIyMgR2V0dGluZyBsb29wIElECnRlbXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlIikpICU+JQogIGRwbHlyOjptdXRhdGUocmVzID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIHJlcywgVjIsIFY1LCBzZXAgPSAiXyIpKQpyZWdJRCA8LSB0ZW1wJGlkCgp0ZW1wIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmUuYmVkcGUiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShyZXMgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgcmVzLCBWMiwgVjUsIHNlcCA9ICJfIikpCnN0cklEIDwtIHRlbXAkaWQKCiMjIyMjIyMjIyMjIyMjIFJFRwojIyBGaWx0ZXJpbmcgbG9vcHMgdG8gcGxvdApkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfc2NvcmUudHN2IikpCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIHJlZ0lELCBkVEFHID4gMC41KSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhkVEFHKSkKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6c2VsZWN0KHNlcSgxLCA2KSkKY29sbmFtZXModGVtcCkgPC0gYygiVjEiLCAiVjIiLCAiVjMiLCAiVjQiLCAiVjUiLCAiVjYiKQpsb29wcyA8LSBpbXBvcnRCZWRwZSh0ZW1wKQoKIyBWaXN1YWxpemF0aW9uCmhpY0RpciA8LSAiL1ZvbHVtZXMvVUtKSU5fU1NEL2RhdGFfdmF1bHRfMjAyNHN1bW1lcl9taWNyb0MvaGljIgp3aW5kb3dTaXplIDwtIDEqMWU2CgppID0gMQojIGZvcihpIGluIHNlcSgxLCAyNSkpewogICMjIExvYWRpbmcgaGljIGFuZCBwbG90dGluZwogIGNociA8LSBhc190aWJibGUobG9vcHNbaV0pJHNlcW5hbWVzMQogIGNlbnRlciA8LSAoYXNfdGliYmxlKGxvb3BzW2ldKSRzdGFydDEgKyBhc190aWJibGUobG9vcHNbaV0pJGVuZDIpLzIKICBzdGFydCA8LSBmbG9vcihjZW50ZXIgLSAwLjUqd2luZG93U2l6ZSkKICBlbmQgPC0gZmxvb3IoY2VudGVyICsgMC41KndpbmRvd1NpemUpCiAgCiAgY2YuRzFETVNPIDwtIEhpY0ZpbGUocGF0aCA9IGhlcmUoaGljRGlyLCAiRzEuRE1TTy5NZXJnZWQuaGljIikpCiAgY2YuRzFkVEFHIDwtIEhpY0ZpbGUocGF0aCA9IGhlcmUoaGljRGlyLCAiRzEuZFRBRy5NZXJnZWQuaGljIikpCiAgI2NmLkcxZFRBRyA8LSBIaWNGaWxlKHBhdGggPSBoZXJlKGhpY0RpciwgIkcxLkE0ODUuTWVyZ2VkLmhpYyIpKQoKICByZXMgPC0gMTAqMTAwMAogIHptYXggPC0gMi41CiAgaGljMSA8LSBpbXBvcnQoY2YuRzFETVNPLCBmb2N1cyA9IHBhc3RlMChjaHIsICI6Iiwgc3RhcnQsICItIiwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcykKICBoaWMyIDwtIGltcG9ydChjZi5HMWRUQUcsIGZvY3VzID0gcGFzdGUwKGNociwgIjoiLCBzdGFydCwgIi0iLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKQogIHAxIDwtIHBsb3RNYXRyaXgoaGljMSwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKQogIHAyIDwtIHBsb3RNYXRyaXgoaGljMiwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKQogIAogIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoInZpc3V6bGlhdGlvbl9yZWdMb29wX2RUQUdfIiwgaSwgIl8xMGtiX2ZpZ3VyZVZlciIpKQogIAogIHdpZHRoIDwtIHBhbmVsU2l6ZSgyMCkqbW1Ub0luY2gKICBoZWlnaHQgPC0gcGFuZWxTaXplKDEwKSptbVRvSW5jaAogIAogIHBuZyhwYXN0ZTAoZmlsZU5hbWUsICIucG5nIiksIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpCiAgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSAiaCIpKQogIGRldi5vZmYoKQogIHN2Z2xpdGUocGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpLCB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpCiAgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSAiaCIpKQogIGRldi5vZmYoKQogIAogIHJlcyA8LSAyNSoxMDAwCiAgem1heCA8LSAzCiAgc3RhcnQgPC0gZmxvb3IoY2VudGVyIC0gd2luZG93U2l6ZSkKICBlbmQgPC0gZmxvb3IoY2VudGVyICsgd2luZG93U2l6ZSkKICBoaWMxIDwtIGltcG9ydChjZi5HMURNU08sIGZvY3VzID0gcGFzdGUwKGNociwgIjoiLCBzdGFydCwgIi0iLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKQogIGhpYzIgPC0gaW1wb3J0KGNmLkcxZFRBRywgZm9jdXMgPSBwYXN0ZTAoY2hyLCAiOiIsIHN0YXJ0LCAiLSIsIGVuZCksIHJlc29sdXRpb24gPSByZXMpCiAgcDEgPC0gcGxvdE1hdHJpeChoaWMxLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpCiAgcDIgPC0gcGxvdE1hdHJpeChoaWMyLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpCiAgCiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMCgidmlzdXpsaWF0aW9uX3JlZ0xvb3BfZFRBR18iLCBpLCAiXzI1a2IiKSkKICBwbmcocGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpLCByZXMgPSA2MDAsIHVuaXRzID0gImluIiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSkKICBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9ICJoIikpCiAgZGV2Lm9mZigpCiAgIyBzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSkKICAjIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gImgiKSkKICAjIGRldi5vZmYoKQojIH0KCiMjIyMjIyMjIyMjIyMjIFN0cgojIyBGaWx0ZXJpbmcgbG9vcHMgdG8gcGxvdApkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfc2NvcmUudHN2IikpCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIHN0cklELCBkVEFHID4gMC41KSAlPiUgZHBseXI6OmFycmFuZ2UoZGVzYyhkVEFHKSkKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6c2VsZWN0KHNlcSgxLCA2KSkKY29sbmFtZXModGVtcCkgPC0gYygiVjEiLCAiVjIiLCAiVjMiLCAiVjQiLCAiVjUiLCAiVjYiKQpsb29wcyA8LSBpbXBvcnRCZWRwZSh0ZW1wKQoKIyBWaXN1YWxpemF0aW9uCmhpY0RpciA8LSAiL1ZvbHVtZXMvVUtKSU5fU1NEL0dlbm9taWNzXzAzX0FuYWx5c2lzX1dvcmtpbmcvZGF0YV92YXVsdF8yMDI0c3VtbWVyX21pY3JvQy9oaWMiCndpbmRvd1NpemUgPC0gMioxZTYKCmZvcihpIGluIHNlcSgxLCAyNSkpewogICMjIExvYWRpbmcgaGljIGFuZCBwbG90dGluZwogIGNociA8LSBhc190aWJibGUobG9vcHNbaV0pJHNlcW5hbWVzMQogIGNlbnRlciA8LSAoYXNfdGliYmxlKGxvb3BzW2ldKSRzdGFydDEgKyBhc190aWJibGUobG9vcHNbaV0pJGVuZDIpLzIKICBzdGFydCA8LSBmbG9vcihjZW50ZXIgLSAwLjUqd2luZG93U2l6ZSkKICBlbmQgPC0gZmxvb3IoY2VudGVyICsgMC41KndpbmRvd1NpemUpCiAgCiAgY2YuRzFETVNPIDwtIEhpY0ZpbGUocGF0aCA9IGhlcmUoaGljRGlyLCAiRzEuRE1TTy5NZXJnZWQuaGljIikpCiAgY2YuRzFkVEFHIDwtIEhpY0ZpbGUocGF0aCA9IGhlcmUoaGljRGlyLCAiRzEuZFRBRy5NZXJnZWQuaGljIikpCgogIHJlcyA8LSAxMCoxMDAwCiAgem1heCA8LSAyLjUKICBoaWMxIDwtIGltcG9ydChjZi5HMURNU08sIGZvY3VzID0gcGFzdGUwKGNociwgIjoiLCBzdGFydCwgIi0iLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKQogIGhpYzIgPC0gaW1wb3J0KGNmLkcxZFRBRywgZm9jdXMgPSBwYXN0ZTAoY2hyLCAiOiIsIHN0YXJ0LCAiLSIsIGVuZCksIHJlc29sdXRpb24gPSByZXMpCiAgcDEgPC0gcGxvdE1hdHJpeChoaWMxLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpCiAgcDIgPC0gcGxvdE1hdHJpeChoaWMyLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpLCBsb29wID0gbG9vcHMpCiAgCiAgZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMCgidmlzdXpsaWF0aW9uX3N0ckxvb3BfZFRBR18iLCBpLCAiXzEwa2IiKSkKICBwbmcocGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpLCByZXMgPSA2MDAsIHVuaXRzID0gImluIiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSkKICBwcmludChjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBhbGlnbiA9ICJoIikpCiAgZGV2Lm9mZigpCiAgCiAgCiAgcmVzIDwtIDI1KjEwMDAKICB6bWF4IDwtIDMKICBzdGFydCA8LSBmbG9vcihjZW50ZXIgLSB3aW5kb3dTaXplKQogIGVuZCA8LSBmbG9vcihjZW50ZXIgKyB3aW5kb3dTaXplKQogIGhpYzEgPC0gaW1wb3J0KGNmLkcxRE1TTywgZm9jdXMgPSBwYXN0ZTAoY2hyLCAiOiIsIHN0YXJ0LCAiLSIsIGVuZCksIHJlc29sdXRpb24gPSByZXMpCiAgaGljMiA8LSBpbXBvcnQoY2YuRzFkVEFHLCBmb2N1cyA9IHBhc3RlMChjaHIsICI6Iiwgc3RhcnQsICItIiwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcykKICBwMSA8LSBwbG90TWF0cml4KGhpYzEsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcykKICBwMiA8LSBwbG90TWF0cml4KGhpYzIsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCksIGxvb3AgPSBsb29wcykKICAKICBmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKCJ2aXN1emxpYXRpb25fc3RyTG9vcF9kVEFHXyIsIGksICJfMjVrYiIpKQogIHBuZyhwYXN0ZTAoZmlsZU5hbWUsICIucG5nIiksIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KQogIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gImgiKSkKICBkZXYub2ZmKCkKfQoKIyMjIyMjIyMjIyMjIyMgZFRBRyBjYWxsZWQgbG9vcHMKIyMgRmlsdGVyaW5nIGxvb3BzIHRvIHBsb3QKZGF0YTEgPC0gZnJlYWQoaGVyZShsb29wRGlyLCAiRzEuZFRBRy5NZXJnZWRfY2hyb21vc2lnaHRfMjVrYi50c3YiKSkKZGF0YTIgPC0gZnJlYWQoaGVyZShsb29wRGlyLCAiRzEuZFRBRy5NZXJnZWRfY2hyb21vc2lnaHRfMTBrYi50c3YiKSkKZGF0YTMgPC0gZnJlYWQoaGVyZShsb29wRGlyLCAiRzEuZFRBRy5NZXJnZWRfY2hyb21vc2lnaHRfNWtiLnRzdiIpKQpkYXRhIDwtIGJpbmRfcm93cyhkYXRhMSwgZGF0YTIsIGRhdGEzKQoKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6YXJyYW5nZShkZXNjKHNjb3JlKSkKCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OnNlbGVjdChzZXEoMSwgNikpCmNvbG5hbWVzKHRlbXApIDwtIGMoIlYxIiwgIlYyIiwgIlYzIiwgIlY0IiwgIlY1IiwgIlY2IikKbG9vcHMgPC0gaW1wb3J0QmVkcGUodGVtcCkKCiMgVmlzdWFsaXphdGlvbgpoaWNEaXIgPC0gIi9Wb2x1bWVzL1VLSklOX1NTRC9HZW5vbWljc18wM19BbmFseXNpc19Xb3JraW5nL2RhdGFfdmF1bHRfMjAyNHN1bW1lcl9taWNyb0MvaGljIgp3aW5kb3dTaXplIDwtIDIqMWU2Cgpmb3IoaSBpbiBzZXEoMSwgMjUpKXsKICAjIyBMb2FkaW5nIGhpYyBhbmQgcGxvdHRpbmcKICBjaHIgPC0gYXNfdGliYmxlKGxvb3BzW2ldKSRzZXFuYW1lczEKICBjZW50ZXIgPC0gKGFzX3RpYmJsZShsb29wc1tpXSkkc3RhcnQxICsgYXNfdGliYmxlKGxvb3BzW2ldKSRlbmQyKS8yCiAgc3RhcnQgPC0gZmxvb3IoY2VudGVyIC0gMC41KndpbmRvd1NpemUpCiAgZW5kIDwtIGZsb29yKGNlbnRlciArIDAuNSp3aW5kb3dTaXplKQogIAogIGNmLkcxRE1TTyA8LSBIaWNGaWxlKHBhdGggPSBoZXJlKGhpY0RpciwgIkcxLkRNU08uTWVyZ2VkLmhpYyIpKQogIGNmLkcxZFRBRyA8LSBIaWNGaWxlKHBhdGggPSBoZXJlKGhpY0RpciwgIkcxLmRUQUcuTWVyZ2VkLmhpYyIpKQoKICByZXMgPC0gMTAqMTAwMAogIHptYXggPC0gMi41CiAgaGljMSA8LSBpbXBvcnQoY2YuRzFETVNPLCBmb2N1cyA9IHBhc3RlMChjaHIsICI6Iiwgc3RhcnQsICItIiwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcykKICBoaWMyIDwtIGltcG9ydChjZi5HMWRUQUcsIGZvY3VzID0gcGFzdGUwKGNociwgIjoiLCBzdGFydCwgIi0iLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKQogIHAxIDwtIHBsb3RNYXRyaXgoaGljMSwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKQogIHAyIDwtIHBsb3RNYXRyaXgoaGljMiwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKQogIAogIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoInZpc3V6bGlhdGlvbl9kVEFHY2FsbGVkTG9vcF9kVEFHXyIsIGksICJfMTBrYiIpKQogIHBuZyhwYXN0ZTAoZmlsZU5hbWUsICIucG5nIiksIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KQogIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gImgiKSkKICBkZXYub2ZmKCkKICAKICAKICByZXMgPC0gMjUqMTAwMAogIHptYXggPC0gMwogIHN0YXJ0IDwtIGZsb29yKGNlbnRlciAtIHdpbmRvd1NpemUpCiAgZW5kIDwtIGZsb29yKGNlbnRlciArIHdpbmRvd1NpemUpCiAgaGljMSA8LSBpbXBvcnQoY2YuRzFETVNPLCBmb2N1cyA9IHBhc3RlMChjaHIsICI6Iiwgc3RhcnQsICItIiwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcykKICBoaWMyIDwtIGltcG9ydChjZi5HMWRUQUcsIGZvY3VzID0gcGFzdGUwKGNociwgIjoiLCBzdGFydCwgIi0iLCBlbmQpLCByZXNvbHV0aW9uID0gcmVzKQogIHAxIDwtIHBsb3RNYXRyaXgoaGljMSwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKQogIHAyIDwtIHBsb3RNYXRyaXgoaGljMiwgZHBpID0gMTAwMCwgbGltaXRzID0gYygwLCB6bWF4KSwgbG9vcCA9IGxvb3BzKQogIAogIGZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoInZpc3V6bGlhdGlvbl9kVEFHY2FsbGVkTG9vcF9kVEFHXyIsIGksICJfMjVrYiIpKQogIHBuZyhwYXN0ZTAoZmlsZU5hbWUsICIucG5nIiksIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KQogIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gImgiKSkKICBkZXYub2ZmKCkKfQoKY2hyID0gImNocjEzIgpzdGFydCA9IDk2OTAwMDAwCmVuZCA9IDk4MTAwMDAwCiAgcmVzIDwtIDEwKjEwMDAKICB6bWF4IDwtIDIuNQogIGhpYzEgPC0gaW1wb3J0KGNmLkcxRE1TTywgZm9jdXMgPSBwYXN0ZTAoY2hyLCAiOiIsIHN0YXJ0LCAiLSIsIGVuZCksIHJlc29sdXRpb24gPSByZXMpCiAgaGljMiA8LSBpbXBvcnQoY2YuRzFkVEFHLCBmb2N1cyA9IHBhc3RlMChjaHIsICI6Iiwgc3RhcnQsICItIiwgZW5kKSwgcmVzb2x1dGlvbiA9IHJlcykKICBwMSA8LSBwbG90TWF0cml4KGhpYzEsIGRwaSA9IDEwMDAsIGxpbWl0cyA9IGMoMCwgem1heCkpCiAgcDIgPC0gcGxvdE1hdHJpeChoaWMyLCBkcGkgPSAxMDAwLCBsaW1pdHMgPSBjKDAsIHptYXgpKQogICAgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSAiaCIpKQoKYGBgCgojIyBbMi4zMl0gSGVhdG1hcCBvZiBsb29wcwpTdHJhdGVneTogY2hlY2sgb3ZlcmxhcCBvZiB0aGUgdW5pb24gbG9vcHMgdG8gdGhlIGxvb3BzIGNhbGxlZCBhdCBlYWNoIGNvbmRpdGlvbgojIyMjIENoZWNrIHNhbXBsZSBzcGVjaWZpYyBjYWxsZWQgbG9vcHMKYGBge3J9CmxpYnJhcnkoY2lyY2xpemUpCgpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgpkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIi50c3YiKSkpCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChzZXEoMSwgNikpCmNvbG5hbWVzKHRlbXApIDwtIGMoIlYxIiwgIlYyIiwgIlYzIiwgIlY0IiwgIlY1IiwgIlY2IikKY29ucy5sb29wIDwtIGltcG9ydEJlZHBlKHRlbXApCgojIENoZWNraW5nIERNU08KbG9vcC4yNWtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKCJHMS5ETVNPLk1lcmdlZF9jaHJvbW9zaWdodF8iLCAyNSwgImtiLmJlZHBlIikpKSkKbG9vcC4xMGtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKCJHMS5ETVNPLk1lcmdlZF9jaHJvbW9zaWdodF8iLCAxMCwgImtiLmJlZHBlIikpKSkKbG9vcC41a2IgPC0gaW1wb3J0QmVkcGUoZnJlYWQoaGVyZShsb29wRGlyLCBwYXN0ZTAoIkcxLkRNU08uTWVyZ2VkX2Nocm9tb3NpZ2h0XyIsIDUsICJrYi5iZWRwZSIpKSkpCgoKb3ZlcmxhcC4yNWtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuMjVrYikKb3ZlcmxhcC4xMGtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuMTBrYikKb3ZlcmxhcC41a2IgPC0gZmluZE92ZXJsYXBzKGNvbnMubG9vcCwgbG9vcC41a2IpCgppbmRleCA8LSBzb3J0KHVuaXF1ZShjKHF1ZXJ5SGl0cyhvdmVybGFwLjI1a2IpLAogICAgICAgICBxdWVyeUhpdHMob3ZlcmxhcC4xMGtiKSwKICAgICAgICAgcXVlcnlIaXRzKG92ZXJsYXAuNWtiKSkpKQpkYXRhJGNhbGxlZEJ5RE1TTyA8LSAwCmRhdGEkY2FsbGVkQnlETVNPW2luZGV4XSA8LSAxCgojIENoZWNraW5nIGRUQUcKbG9vcC4yNWtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKCJHMS5kVEFHLk1lcmdlZF9jaHJvbW9zaWdodF8iLCAyNSwgImtiLmJlZHBlIikpKSkKbG9vcC4xMGtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKCJHMS5kVEFHLk1lcmdlZF9jaHJvbW9zaWdodF8iLCAxMCwgImtiLmJlZHBlIikpKSkKbG9vcC41a2IgPC0gaW1wb3J0QmVkcGUoZnJlYWQoaGVyZShsb29wRGlyLCBwYXN0ZTAoIkcxLmRUQUcuTWVyZ2VkX2Nocm9tb3NpZ2h0XyIsIDUsICJrYi5iZWRwZSIpKSkpCgoKb3ZlcmxhcC4yNWtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuMjVrYikKb3ZlcmxhcC4xMGtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuMTBrYikKb3ZlcmxhcC41a2IgPC0gZmluZE92ZXJsYXBzKGNvbnMubG9vcCwgbG9vcC41a2IpCgppbmRleCA8LSBzb3J0KHVuaXF1ZShjKHF1ZXJ5SGl0cyhvdmVybGFwLjI1a2IpLAogICAgICAgICBxdWVyeUhpdHMob3ZlcmxhcC4xMGtiKSwKICAgICAgICAgcXVlcnlIaXRzKG92ZXJsYXAuNWtiKSkpKQpkYXRhJGNhbGxlZEJ5ZFRBRyA8LSAwCmRhdGEkY2FsbGVkQnlkVEFHW2luZGV4XSA8LSAxCgojIENoZWNraW5nIEE0ODUKbG9vcC4yNWtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKCJHMS5BNDg1Lk1lcmdlZF9jaHJvbW9zaWdodF8iLCAyNSwgImtiLmJlZHBlIikpKSkKbG9vcC4xMGtiIDwtIGltcG9ydEJlZHBlKGZyZWFkKGhlcmUobG9vcERpciwgcGFzdGUwKCJHMS5BNDg1Lk1lcmdlZF9jaHJvbW9zaWdodF8iLCAxMCwgImtiLmJlZHBlIikpKSkKbG9vcC41a2IgPC0gaW1wb3J0QmVkcGUoZnJlYWQoaGVyZShsb29wRGlyLCBwYXN0ZTAoIkcxLkE0ODUuTWVyZ2VkX2Nocm9tb3NpZ2h0XyIsIDUsICJrYi5iZWRwZSIpKSkpCgoKb3ZlcmxhcC4yNWtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuMjVrYikKb3ZlcmxhcC4xMGtiIDwtIGZpbmRPdmVybGFwcyhjb25zLmxvb3AsIGxvb3AuMTBrYikKb3ZlcmxhcC41a2IgPC0gZmluZE92ZXJsYXBzKGNvbnMubG9vcCwgbG9vcC41a2IpCgppbmRleCA8LSBzb3J0KHVuaXF1ZShjKHF1ZXJ5SGl0cyhvdmVybGFwLjI1a2IpLAogICAgICAgICBxdWVyeUhpdHMob3ZlcmxhcC4xMGtiKSwKICAgICAgICAgcXVlcnlIaXRzKG92ZXJsYXAuNWtiKSkpKQpkYXRhJGNhbGxlZEJ5QTQ4NSA8LSAwCmRhdGEkY2FsbGVkQnlBNDg1W2luZGV4XSA8LSAxCgoKIyBIZWF0bWFwIChjaGVja2luZyB3aGV0aGVyIGNlcnRhaW4gcGVhayBpcyBjYWxsZWQgYnkgc3BlY2lmaWMgc2FtcGxlKQpkYXRhVG9QbG90IDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoaWQsIGNhbGxlZEJ5RE1TTywgY2FsbGVkQnlkVEFHLCBjYWxsZWRCeUE0ODUpCmRhdGFUb1Bsb3QgPC0gZGF0YVRvUGxvdCAlPiUgZHBseXI6Om11dGF0ZShmbGFnID0gNCpjYWxsZWRCeURNU08gKyAyKmNhbGxlZEJ5ZFRBRyArIGNhbGxlZEJ5QTQ4NSkgJT4lCiAgZHBseXI6OmFycmFuZ2UoZGVzYyhmbGFnKSkKCnJvd19ncm91cHMgPC0gZGF0YVRvUGxvdCRmbGFnCmRhdGFfbWF0cml4IDwtIGRhdGFUb1Bsb3QgJT4lIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAiaWQiKSAlPiUgZHBseXI6OnNlbGVjdCgtZmxhZykgJT4lIGFzLm1hdHJpeCgpCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEpLCAKICAgICAgICAgICAgICAgICAgICAgIGMoIndoaXRlIiwgImdyZWVuIikpCmgxIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgsIG5hbWUgPSAiY2FsbGVkQnkiLAogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSwKICAgICAgICBib3JkZXIgPSBUUlVFLAogICAgICAgIHNob3dfcm93X25hbWVzID0gRkFMU0UsCiAgICAgICAgY29sID0gY29sX2Z1biwKICAgICAgICByb3dfc3BsaXQgPSByb3dfZ3JvdXBzKQoKCiMgUHJlcGFyZSBkYXRhIGZvciB0aGUgc2Vjb25kIGhlYXRtYXAKZGF0YVRvUGxvdDIgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChpZCwgRE1TTywgZFRBRywgQTQ4NSkgJT4lCiAgYXJyYW5nZShtYXRjaChpZCwgZGF0YVRvUGxvdCRpZCkpCgpkYXRhX21hdHJpeDIgPC0gZGF0YVRvUGxvdDIgJT4lIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAiaWQiKSAlPiUgYXMubWF0cml4KCkKCgpjb2xfZnVuMiA8LSBjb2xvclJhbXAyKGMoLTAuNSwgMCwgMSksIGMoImJsdWUiLCAid2hpdGUiLCAicmVkIikpCgpoMiA8LSBIZWF0bWFwKGRhdGFfbWF0cml4MiwgbmFtZSA9ICJzY29yZSIsCiAgICAgICAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSwKICAgICAgICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsCiAgICAgICAgICAgICAgYm9yZGVyID0gVFJVRSwKICAgICAgICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLAogICAgICAgICAgICAgIGNvbCA9IGNvbF9mdW4yLAogICAgICAgICAgICAgIHJvd19zcGxpdCA9IHJvd19ncm91cHMpCgoKZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMCgiaGVhdG1hcF9jaGVja2luZ1NhbXBsZUNhbGxlZExvb3BzIikpCnBuZyhwYXN0ZTAoZmlsZU5hbWUsICIucG5nIiksIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDMsIGhlaWdodCA9IDEwKQpwcmludChoMSArIGgyKQpkZXYub2ZmKCkKCmBgYAojIyMjIENoZWNraW5nIHVwZG93bgojIyMjIyBBbGwgbG9vcHMKYGBge3J9CiMgSGVhdG1hcApsaWJyYXJ5KGNpcmNsaXplKQoKIyBIZWF0bWFwIDIKc2V0LnNlZWQoMTIzKQoKZGlmZkN1dG9mZiA8LSAwLjIKZGF0YVRvUGxvdCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGlzZGlmZl9kVEFHX0RNU08gPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZV93aGVuKGRpZmZfZFRBR19ETVNPID49IGRpZmZDdXRvZmYgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGRpZmZfZFRBR19ETVNPKSA8IGRpZmZDdXRvZmYgfiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZl9kVEFHX0RNU08gPD0gLWRpZmZDdXRvZmYgfiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2RpZmZfQTQ4NV9ETVNPID0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Vfd2hlbihkaWZmX0E0ODVfRE1TTyA+PSBkaWZmQ3V0b2ZmIH4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhkaWZmX0E0ODVfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZfQTQ4NV9ETVNPIDw9IC1kaWZmQ3V0b2ZmIH4gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGlkLCBpc2RpZmZfZFRBR19ETVNPLCBpc2RpZmZfQTQ4NV9ETVNPKQpkYXRhX21hdHJpeCA8LSBkYXRhVG9QbG90ICU+JSBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gImlkIiklPiUgYXMubWF0cml4KCkKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoLTEsIDAsIDEpLCBjKCJibHVlIiwgImdyZXkiLCAicmVkIikpCmgxIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgsIG5hbWUgPSAibG9vcCBzY29yZSIsCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsCiAgICAgICAgcm93X2ttID0gOSwKICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsCiAgICAgICAgYm9yZGVyID0gRkFMU0UsCiAgICAgICAgc2hvd19yb3dfbmFtZXMgPSBGQUxTRSwKICAgICAgICBjb2wgPSBjb2xfZnVuKQoKZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMCgiaGVhdG1hcF9jaGVja2luZ0RlbHRhQWNyb3NzQ29uZGl0aW9uIikpCnBuZyhwYXN0ZTAoZmlsZU5hbWUsICIucG5nIiksIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDIsIGhlaWdodCA9IDEwKQpwcmludChoMSkKZGV2Lm9mZigpCgpzZXQuc2VlZCgxMjMpCgpobV9kcmF3biA8LSBkcmF3KGgxKQpyb3dfY2x1c3RlcnMgPC0gcm93X29yZGVyKGhtX2RyYXduKQoKbG9vcC5jbHVzdGVyMSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbMV1dXQpsb29wLmNsdXN0ZXIyIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1syXV1dCmxvb3AuY2x1c3RlcjMgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzNdXV0KbG9vcC5jbHVzdGVyNCA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNF1dXQpsb29wLmNsdXN0ZXI1IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s1XV1dCmxvb3AuY2x1c3RlcjYgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzZdXV0KbG9vcC5jbHVzdGVyNyA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbN11dXQpsb29wLmNsdXN0ZXI4IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s4XV1dCmxvb3AuY2x1c3RlcjkgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzldXV0KCmBgYAoKIyMjIyMgUmVnIGxvb3BzCmBgYHtyfQojIEhlYXRtYXAKbGlicmFyeShjaXJjbGl6ZSkKCiMgSGVhdG1hcCAyCnNldC5zZWVkKDEyMykKCmRpZmZDdXRvZmYgPC0gMC4yCmRhdGFUb1Bsb3QgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoIlAtUCIsICJQLUUiLCAiRS1FIikpICU+JQogIGRwbHlyOjptdXRhdGUoaXNkaWZmX2RUQUdfRE1TTyA9IAogICAgICAgICAgICAgICAgICBjYXNlX3doZW4oZGlmZl9kVEFHX0RNU08gPj0gZGlmZkN1dG9mZiB+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMoZGlmZl9kVEFHX0RNU08pIDwgZGlmZkN1dG9mZiB+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmX2RUQUdfRE1TTyA8PSAtZGlmZkN1dG9mZiB+IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSwKICAgICAgICAgICAgICAgIGlzZGlmZl9BNDg1X0RNU08gPSAKICAgICAgICAgICAgICAgICAgY2FzZV93aGVuKGRpZmZfQTQ4NV9ETVNPID49IGRpZmZDdXRvZmYgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGRpZmZfQTQ4NV9ETVNPKSA8IGRpZmZDdXRvZmYgfiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZl9BNDg1X0RNU08gPD0gLWRpZmZDdXRvZmYgfiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JQogIGRwbHlyOjpzZWxlY3QoaWQsIGlzZGlmZl9kVEFHX0RNU08sIGlzZGlmZl9BNDg1X0RNU08pCmRhdGFfbWF0cml4IDwtIGRhdGFUb1Bsb3QgJT4lIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAiaWQiKSU+JSBhcy5tYXRyaXgoKQpjb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygtMSwgMCwgMSksIGMoImJsdWUiLCAiZ3JleSIsICJyZWQiKSkKaDEgPC0gSGVhdG1hcChkYXRhX21hdHJpeCwgbmFtZSA9ICJsb29wIHNjb3JlIiwKICAgICAgICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwKICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwKICAgICAgICByb3dfa20gPSA4LAogICAgICAgIHNob3dfcm93X2RlbmQgPSBGQUxTRSwKICAgICAgICBib3JkZXIgPSBGQUxTRSwKICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLAogICAgICAgIGNvbCA9IGNvbF9mdW4pCgpmaWxlTmFtZSA8LSBoZXJlKGZpZ0RpciwgcGFzdGUwKCJoZWF0bWFwX2NoZWNraW5nRGVsdGFBY3Jvc3NDb25kaXRpb25fcmVnIikpCnBuZyhwYXN0ZTAoZmlsZU5hbWUsICIucG5nIiksIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDIsIGhlaWdodCA9IDEwKQpwcmludChoMSkKZGV2Lm9mZigpCgpzZXQuc2VlZCgxMjMpCgpobV9kcmF3biA8LSBkcmF3KGgxKQpyb3dfY2x1c3RlcnMgPC0gcm93X29yZGVyKGhtX2RyYXduKQoKbG9vcC5jbHVzdGVyMSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbMV1dXQpsb29wLmNsdXN0ZXIyIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1syXV1dCmxvb3AuY2x1c3RlcjMgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzNdXV0KbG9vcC5jbHVzdGVyNCA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNF1dXQpsb29wLmNsdXN0ZXI1IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s1XV1dCmxvb3AuY2x1c3RlcjYgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzZdXV0KbG9vcC5jbHVzdGVyNyA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbN11dXQpsb29wLmNsdXN0ZXI4IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s4XV1dCgpgYGAKCmBgYHtyfQpsaWJyYXJ5KGNpcmNsaXplKQoKc2V0LnNlZWQoMTIzKQpkYXRhVG9QbG90IDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGlkLCBkaWZmX2RUQUdfRE1TTywgZGlmZl9BNDg1X0RNU08pCmRhdGFfbWF0cml4IDwtIGRhdGFUb1Bsb3QgJT4lIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAiaWQiKSU+JSBhcy5tYXRyaXgoKQpjb2xfZnVuIDwtIGNvbG9yUmFtcDIoYygtMSwgMCwgMSksIGMoImJsdWUiLCAid2hpdGUiLCAicmVkIikpCmgxIDwtIEhlYXRtYXAoZGF0YV9tYXRyaXgsIG5hbWUgPSAibG9vcCBzY29yZSIsCiAgICAgICAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsCiAgICAgICAgcm93X2ttID0gNCwKICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsCiAgICAgICAgYm9yZGVyID0gVFJVRSwKICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLAogICAgICAgIGNvbCA9IGNvbF9mdW4pCgoKZmlsZU5hbWUgPC0gaGVyZShmaWdEaXIsIHBhc3RlMCgiaGVhdG1hcF9kaWZmU2NvcmVfcmVnX2s0IikpCnBuZyhwYXN0ZTAoZmlsZU5hbWUsICIucG5nIiksIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDIsIGhlaWdodCA9IDYpCnByaW50KGgxKQpkZXYub2ZmKCkKCmhtX2RyYXduIDwtIGRyYXcoaDEpCnJvd19jbHVzdGVycyA8LSByb3dfb3JkZXIoaG1fZHJhd24pCgpsb29wLmNsdXN0ZXIxIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1sxXV1dCmxvb3AuY2x1c3RlcjIgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzJdXV0KbG9vcC5jbHVzdGVyMyA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbM11dXQpsb29wLmNsdXN0ZXI0IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s0XV1dCmBgYAojIyMjIyBBbGwgbG9vcHMgX09FCmBgYHtyfQojIEhlYXRtYXAKbGlicmFyeShjaXJjbGl6ZSkKCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiLnRzdiIpKSkKIyBIZWF0bWFwIDIKc2V0LnNlZWQoMTIzKQoKIyBJbXBvcnQgb2JzL2V4cCBzY29yZXMgYW5kIG1lcmdlIHRvIHRoZSBkYXRhc2V0Cm1pblZhbHVlIDwtIC00CmRpZmZDdXRvZmYgPC0gMC41Cm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfY29uc19vYnNleHAudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLAogICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksCiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSkKCgojIE1lcmdlIGRhdGFzZXQKZGF0YVRvUGxvdCA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKCJpZCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPLAogICAgICAgICAgICAgICAgaXNkaWZmX2RUQUdfRE1TTyA9IGNhc2Vfd2hlbihsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID49IGRpZmZDdXRvZmYgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA8PSBkaWZmQ3V0b2ZmIH4gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSApLAogICAgICAgICAgICAgICAgaXNkaWZmX0E0ODVfRE1TTyA9IGNhc2Vfd2hlbihsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID49IGRpZmZDdXRvZmYgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMobG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA8PSBkaWZmQ3V0b2ZmIH4gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpJT4lCiAgZHBseXI6OnNlbGVjdChpZCwgaXNkaWZmX2RUQUdfRE1TTywgaXNkaWZmX0E0ODVfRE1TTykKCgoKZGF0YV9tYXRyaXggPC0gZGF0YVRvUGxvdCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJpZCIpJT4lIGFzLm1hdHJpeCgpCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKC0xLCAwLCAxKSwgYygiYmx1ZSIsICJncmV5IiwgInJlZCIpKQpoMSA8LSBIZWF0bWFwKGRhdGFfbWF0cml4LCBuYW1lID0gImxvb3Agc2NvcmUiLAogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgICAgIHJvd19rbSA9IDksCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLAogICAgICAgIGJvcmRlciA9IEZBTFNFLAogICAgICAgIHNob3dfcm93X25hbWVzID0gRkFMU0UsCiAgICAgICAgY29sID0gY29sX2Z1bikKCmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoImhlYXRtYXBfY2hlY2tpbmdEZWx0YUFjcm9zc0NvbmRpdGlvbl9PRSIpKQpwbmcocGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpLCByZXMgPSA2MDAsIHVuaXRzID0gImluIiwgd2lkdGggPSAyLCBoZWlnaHQgPSAxMCkKcHJpbnQoaDEpCmRldi5vZmYoKQojIAojIHNldC5zZWVkKDEyMykKIyAKIyBobV9kcmF3biA8LSBkcmF3KGgxKQojIHJvd19jbHVzdGVycyA8LSByb3dfb3JkZXIoaG1fZHJhd24pCiMgCiMgbG9vcC5jbHVzdGVyMSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbMV1dXQojIGxvb3AuY2x1c3RlcjIgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzJdXV0KIyBsb29wLmNsdXN0ZXIzIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1szXV1dCiMgbG9vcC5jbHVzdGVyNCA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNF1dXQojIGxvb3AuY2x1c3RlcjUgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzVdXV0KIyBsb29wLmNsdXN0ZXI2IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s2XV1dCiMgbG9vcC5jbHVzdGVyNyA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbN11dXQojIGxvb3AuY2x1c3RlcjggPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzhdXV0KIyBsb29wLmNsdXN0ZXI5IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s5XV1dCgpgYGAKIyMjIyMgUmVnIGxvb3BzIF9PRQpgYGB7cn0KIyBIZWF0bWFwCmxpYnJhcnkoY2lyY2xpemUpCgpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgpkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIi50c3YiKSkpCiMgSGVhdG1hcCAyCnNldC5zZWVkKDEyMykKCiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldAptaW5WYWx1ZSA8LSAtNApkaWZmQ3V0b2ZmIDwtIDAuNQpvYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdiIpKSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSwKICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLAogICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSkpCgoKIyBNZXJnZSBkYXRhc2V0CmRhdGFUb1Bsb3QgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihvYnNleHAsIGJ5ID0gYygiaWQiKSkgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPLAogICAgICAgICAgICAgICAgaXNkaWZmX2RUQUdfRE1TTyA9IGNhc2Vfd2hlbihsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID49IGRpZmZDdXRvZmYgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA8PSBkaWZmQ3V0b2ZmIH4gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSApLAogICAgICAgICAgICAgICAgaXNkaWZmX0E0ODVfRE1TTyA9IGNhc2Vfd2hlbihsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID49IGRpZmZDdXRvZmYgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMobG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTykgPCBkaWZmQ3V0b2ZmIH4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA8PSBkaWZmQ3V0b2ZmIH4gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpJT4lCiAgZHBseXI6OnNlbGVjdChpZCwgaXNkaWZmX2RUQUdfRE1TTywgaXNkaWZmX0E0ODVfRE1TTykKCgoKZGF0YV9tYXRyaXggPC0gZGF0YVRvUGxvdCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJpZCIpJT4lIGFzLm1hdHJpeCgpCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKC0xLCAwLCAxKSwgYygiYmx1ZSIsICJncmV5IiwgInJlZCIpKQpoMSA8LSBIZWF0bWFwKGRhdGFfbWF0cml4LCBuYW1lID0gImxvb3Agc2NvcmUiLAogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgICAgIHJvd19rbSA9IDksCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLAogICAgICAgIGJvcmRlciA9IEZBTFNFLAogICAgICAgIHNob3dfcm93X25hbWVzID0gRkFMU0UsCiAgICAgICAgY29sID0gY29sX2Z1bikKCmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCBwYXN0ZTAoImhlYXRtYXBfY2hlY2tpbmdEZWx0YUFjcm9zc0NvbmRpdGlvbl9yZWdfT0UiKSkKcG5nKHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSwgcmVzID0gNjAwLCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMiwgaGVpZ2h0ID0gMTApCnByaW50KGgxKQpkZXYub2ZmKCkKIyAKIyBzZXQuc2VlZCgxMjMpCiMgCiMgaG1fZHJhd24gPC0gZHJhdyhoMSkKIyByb3dfY2x1c3RlcnMgPC0gcm93X29yZGVyKGhtX2RyYXduKQojIAojIGxvb3AuY2x1c3RlcjEgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzFdXV0KIyBsb29wLmNsdXN0ZXIyIDwtIHRlbXBbcm93X2NsdXN0ZXJzW1syXV1dCiMgbG9vcC5jbHVzdGVyMyA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbM11dXQojIGxvb3AuY2x1c3RlcjQgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzRdXV0KIyBsb29wLmNsdXN0ZXI1IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s1XV1dCiMgbG9vcC5jbHVzdGVyNiA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbNl1dXQojIGxvb3AuY2x1c3RlcjcgPC0gdGVtcFtyb3dfY2x1c3RlcnNbWzddXV0KIyBsb29wLmNsdXN0ZXI4IDwtIHRlbXBbcm93X2NsdXN0ZXJzW1s4XV1dCiMgbG9vcC5jbHVzdGVyOSA8LSB0ZW1wW3Jvd19jbHVzdGVyc1tbOV1dXQoKYGBgCiMjIyBbMi4zMl0gQ29tcGFyaW5nIHdpdGggQm9iYmllJ3MgZGF0YQpXaGVyZSBkb2VzIGRpZmZlcmVudGlhdGVkIHJlbGF0ZWQgZ2VuZXMgZmFsbCBpbnRvPwpgYGB7cn0KbWFyZ2luRXJyb3IgPC0gZnVuY3Rpb24obXlMaXN0KSB7CiAgc2FtcGxlLm4gPSBsZW5ndGgobXlMaXN0KQogIHNhbXBsZS5zZCA9IHNkKG15TGlzdCkKICBzYW1wbGUuc2UgPSBzYW1wbGUuc2Qvc3FydChzYW1wbGUubikKICBhbHBoYSA9IDAuMDUKICBkZWdyZWVzLmZyZWVkb20gPSBzYW1wbGUubiAtIDEKICB0LnNjb3JlID0gcXQocCA9IGFscGhhLzIsIGRmID0gZGVncmVlcy5mcmVlZG9tLCBsb3dlci50YWlsID0gRikKICBtYXJnaW4uZXJyb3IgPSB0LnNjb3JlKnNhbXBsZS5zZQogIHJldHVybihtYXJnaW4uZXJyb3IpCn0KClBST3NlcS5ib2JiaWUgPC0gYXNfdGliYmxlKGZyZWFkKGhlcmUocmVmRGlyLCAiYm9iYmllX2dlbmVfY2xhc3NpZmljYXRpb24uY3N2IikpKQoKZ2VuZUxpc3QuRXBpLmRUQUcudXAgPC0gKGZyZWFkKGhlcmUocmVmRGlyLCAiZGlmZl9HMS5kVEFHX0cxLkVwaS5kVEFHX3ZzX0cxLkVwaS5ETVNPLnRzdiIpKSAlPiUgZHBseXI6OmZpbHRlcihwYWRqIDwgMC4wNSwgbG9nMkZvbGRDaGFuZ2UgPiAwKSkkZW5zZW1ibF9nZW5lX2lkCgpnZW5lTGlzdC5FcGkuZFRBRy5kb3duIDwtIChmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS5FcGkuZFRBR192c19HMS5FcGkuRE1TTy50c3YiKSkgJT4lIGRwbHlyOjpmaWx0ZXIocGFkaiA8IDAuMDUsIGxvZzJGb2xkQ2hhbmdlIDwgMCkpJGVuc2VtYmxfZ2VuZV9pZAoKIyMgQ29udmVydGluZyB0cmFuc2NyaXB0IElEIHRvIGdlbmUgSUQKaWRQYWlyX3RnIDwtIGdldEJNKGF0dHJpYnV0ZXMgPSBjKCJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiLCAiZW5zZW1ibF9nZW5lX2lkIiksCiAgICAgICAgICAgICAgICAgZmlsdGVycyA9ICJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiLAogICAgICAgICAgICAgICAgIHZhbHVlcyA9IFBST3NlcS5ib2JiaWUkZW5zdCwKICAgICAgICAgICAgICAgICBtYXJ0ID0gZW5zZW1ibC52MTAyKQpQUk9zZXEuYm9iYmllIDwtIFBST3NlcS5ib2JiaWUgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oaWRQYWlyX3RnLCBieSA9IGMoImVuc3QiID0gImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIpKQoKIyMgQmFyIFBsb3QKdGVtcCA8LSBQUk9zZXEuYm9iYmllICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIGdlbmVMaXN0LkVwaS5kVEFHLmRvd24pCgpncm91cCA8LSBjKHJlcCgiRXBpTENfZFRBR3ZzRE1TT19ET1dOIiwgNCkpCmNsdXN0ZXIgPC0gcmVwKGMoIkVhcmx5IiwgIk1pZGRsZSIsICJMYXRlIiwgIlRyYW5zaWVudCIpLCAxKQpjbHVzdGVyIDwtIGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKCJFYXJseSIsICJNaWRkbGUiLCAiTGF0ZSIsICJUcmFuc2llbnQiKSkKdmFsdWUgPC0gYyhzdW0odGVtcCRDbHVzdGVyID09ICJFYXJseSIpLAogICAgICAgICAgIHN1bSh0ZW1wJENsdXN0ZXIgPT0gIk1pZGRsZSIpLAogICAgICAgICAgIHN1bSh0ZW1wJENsdXN0ZXIgPT0gIkxhdGUiKSwKICAgICAgICAgICBzdW0odGVtcCRDbHVzdGVyID09ICJUcmFuc2llbnQiKSkKZGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBjbHVzdGVyLCB2YWx1ZSkKZ2dwbG90KGRhdGEsIGFlcyhmaWxsPWNsdXN0ZXIsIHk9dmFsdWUsIHg9Z3JvdXApKSArIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiLCBzdGF0PSJpZGVudGl0eSIpICsgdGhlbWVfY2xhc3NpYygpCgojIyBMaW5lIHBsb3QKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6c2VsZWN0KGMoNCwgNSwgNiwgNywgOCwgOSkpCnRlbXAudGFsbCA9IHRlbXAgJT4lIHBpdm90X2xvbmdlcigtYygxLCAyKSwgbmFtZXNfdG8gPSAidGltZXBvaW50cyIsIHZhbHVlc190byA9ICJ2YWx1ZSIpCgpnZzEgPSBnZ3Bsb3QodGVtcC50YWxsLAogICAgICAgYWVzKCB4ID0gZmFjdG9yKHRpbWVwb2ludHMsIGxldmVsID0gYygiTUlUIiwgIkVHMSIsICJMRzEiLCAiQVNZTiIpKSwKICAgICAgICAgICAgeSA9IHZhbHVlLAogICAgICAgICAgICBncm91cCA9IGVuc3QsIGNvbCA9IGVuc3QpKSArCiAgZ2VvbV9saW5lKCkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiQm9iYmllLCBQUk8tc2VxIiwgc3VidGl0bGUgPSAic2VsZWN0ZWQgZ2VuZXMiKSArCiAgeGxhYiAoInRpbWVwb2ludHMiKSArIHlsYWIoInZhbHVlIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAxKSkKCmdnc2F2ZShmaWxlbmFtZSA9IGhlcmUoZmlnRGlyLCAiYm9iYmllX2dlbmVfRXBpTENfZFRBR3ZzRE1TT19ET1dOLnBuZyIpLCBnZzEsIHdpZHRoID0gNCwgaGVpZ2h0ID0gNCwgZHBpID0gMzAwLCB1bml0cyA9ICJpbiIsIGRldmljZSA9ICJwbmciKQoKCiMgRFJBVyBSSUJCT04KCgp0ZW1wLnJpYmJvbiA9IHRpYmJsZSgidGltZXBvaW50cyIgPSBjKCJNSVQiLCAiRUcxIiwgIkxHMSIsICJBU1lOIiksCiAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiID0gYyhtZWFuKHRlbXAkTUlUKSwgbWVhbih0ZW1wJEVHMSksIG1lYW4odGVtcCRMRzEpLCBtZWFuKHRlbXAkQVNZTikpLAogICAgICAgICAgICAgICAgICAgICAgImxvd2VyIiA9IGMobWVhbih0ZW1wJE1JVCkgLSBtYXJnaW5FcnJvcih0ZW1wJE1JVCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbih0ZW1wJEVHMSkgLSBtYXJnaW5FcnJvcih0ZW1wJEVHMSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbih0ZW1wJExHMSkgLSBtYXJnaW5FcnJvcih0ZW1wJExHMSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbih0ZW1wJEFTWU4pIC0gbWFyZ2luRXJyb3IodGVtcCRBU1lOKSksCiAgICAgICAgICAgICAgICAgICAgICAidXBwZXIiID0gYyhtZWFuKHRlbXAkTUlUKSArIG1hcmdpbkVycm9yKHRlbXAkTUlUKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuKHRlbXAkRUcxKSArIG1hcmdpbkVycm9yKHRlbXAkRUcxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuKHRlbXAkTEcxKSArIG1hcmdpbkVycm9yKHRlbXAkTEcxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuKHRlbXAkQVNZTikgKyBtYXJnaW5FcnJvcih0ZW1wJEFTWU4pKSkKZ2cxID0gZ2dwbG90KHRlbXAucmliYm9uLCBhZXMoeCA9IGZhY3Rvcih0aW1lcG9pbnRzLCBsZXZlbCA9IGMoIk1JVCIsICJFRzEiLCAiTEcxIiwgIkFTWU4iKSksIAogICAgICAgICAgICAgICAgICAgICAgICB5ID0gdmFsdWUsIGdyb3VwID0gMSkpICsKICBnZW9tX2xpbmUoY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgZmlsbCA9ICJncmV5NzAiLCBhbHBoYSA9IDAuMykgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiQm9iYmllLCBQUk8tc2VxIiwgc3VidGl0bGUgPSAic2VsZWN0ZWQgZ2VuZXMiKSArCiAgeGxhYiAoInRpbWVwb2ludHMiKSArIHlsYWIoInZhbHVlIikgKyB5bGltKDAsIDY1KSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDEpKQoKZ2dzYXZlKGZpbGVuYW1lID0gaGVyZShmaWdEaXIsICJib2JiaWVfZ2VuZV9FcGlMQ19kVEFHdnNETVNPX0RPV05fOTVDSS5wbmciKSwgZ2cxLCB3aWR0aCA9IDQsIGhlaWdodCA9IDQsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iLCBkZXZpY2UgPSAicG5nIikKCgpgYGAKCiMjI1syLjMzXSBGaW5kaW5nIGNsb3Nlc3QgZW5oYW5jZXIKSGVyZSwgZW5oYW5jZXIgd2lsbCBiZSBkZWZpbmVkIGJ5IEgzSzI3YWMgcGVhawpJdCBtYWtlcyBtb3JlIHNlbmNlIHRvIGluY2x1ZGUgdGhlIGVuaGFuY2VyIHBlYWsgb24gZ2VuZSBib2R5CihzdHJhdGVneSAxKSBleGNsdWRlICstMTBrYiByZWdpb24gZnJvbSBUU1Mgb25seQooc3RyYXRlZ3kgMikgb25seSBjaGVjayB0aGUgRS1QIGxvb3BzIGNhbGxlZCBpbiBNaWNyby1DCiMjIyMjIGJpbmFyeSBncm91cCAtIGV4Y2x1ZGluZyBhbGwgZ2VuZSBib2R5CmBgYHtyfQpnZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkIikpICU+JQogIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09ICIrIiwgVjIsIFYzKSwgZW5zZW1ibCA9IFY2LCBjaHIgPSBWMSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsLCBjaHIsIFRTUykKCmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2IikpJGdlbmUKZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3YiKSkkZ2VuZQoKCmdlbmUudGIgPC0gZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgYyhncm91cDEsIGdyb3VwMikpCmdlbmVzLmdyIDwtIEdSYW5nZXMoCiAgc2VxbmFtZXMgPSBnZW5lLnRiJGNociwKICByYW5nZXMgPSBJUmFuZ2VzKHN0YXJ0ID0gZ2VuZS50YiRUU1MsIGVuZCA9IGdlbmUudGIkVFNTKSwKICBlbnNlbWJsID0gZ2VuZS50YiRlbnNlbWJsCikKCmdlbmVib2R5LnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkIikpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpCmNvbG5hbWVzKGdlbmVib2R5LnRiKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKZ2VuZWJvZHkuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmVib2R5LnRiKQoKCnBlYWsuSDNLMjdhYyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkIikpCnBlYWsuSDNLMjdhYzwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShmcmVhZChoZXJlKHJlZkRpciwgIkdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5uYXJyb3dQZWFrLmJlZCIpKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjptdXRhdGUoY2hyID0gVjEsIHN0YXJ0ID0gKFYyICsgVjMpLzIsIGVuZCA9IChWMiArIFYzKS8yKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChjaHIsIHN0YXJ0LCBlbmQpKQoKIyMjIyMjIyBGaWx0ZXJpbmcgb3V0IHBlYWtzIG92ZXJsYXBwaW5nIHdpdGggdGhlIGdlbmUgYm9keQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoZ2VuZWJvZHkuZ3IsIHBlYWsuSDNLMjdhYykKCiMgSW5kaWNlcyBvZiBwZWFrcyB0aGF0IG92ZXJsYXAgdGhlIFRTUwpvdmVybGFwcGluZ19wZWFrX2luZGljZXMgPC0gdW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXBzKSkKCiMgRXhjbHVkZSBvdmVybGFwcGluZyBwZWFrcwpub25fb3ZlcmxhcHBpbmdfcGVha3MgPC0gcGVhay5IM0syN2FjWy1vdmVybGFwcGluZ19wZWFrX2luZGljZXNdCgoKIyMjIyMjIyBDYWxjdWxhdGluZyBkaXN0YW5jZSB0byBuZWFyZXN0IHBlYWsKbmVhcmVzdF9wZWFrX2luZGljZXMgPC0gbmVhcmVzdChnZW5lcy5nciwgbm9uX292ZXJsYXBwaW5nX3BlYWtzKQpuZWFyZXN0X3BlYWtzIDwtIG5vbl9vdmVybGFwcGluZ19wZWFrc1tuZWFyZXN0X3BlYWtfaW5kaWNlc10KZGlzdGFuY2VzIDwtIGRpc3RhbmNlKGdlbmVzLmdyLCBuZWFyZXN0X3BlYWtzKQoKCnJlc3VsdHMgPC0gZGF0YS5mcmFtZSgKICBlbnNlbWJsID0gbWNvbHMoZ2VuZXMuZ3IpJGVuc2VtYmwsCiAgZ2VuZV9jaHIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMoZ2VuZXMuZ3IpKSwKICBnZW5lX1RTUyA9IHN0YXJ0KGdlbmVzLmdyKSwKICBwZWFrX2NociA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhuZWFyZXN0X3BlYWtzKSksCiAgcGVha19zdGFydCA9IHN0YXJ0KG5lYXJlc3RfcGVha3MpLAogIHBlYWtfZW5kID0gZW5kKG5lYXJlc3RfcGVha3MpLAogIGRpc3RhbmNlID0gZGlzdGFuY2VzCikKCnJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihlbnNlbWJsICVpbiUgZ3JvdXAxIH4gImdyb3VwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwMiB+ICJncm91cDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpCgpnZ3Bsb3QocmVzdWx0cywgYWVzKHggPSBncm91cCwgeSA9IGRpc3RhbmNlLCBmaWxsID0gZ3JvdXApKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BLCB3aWR0aCA9IDAuMSwgZmlsbCA9ICJ3aGl0ZSIpICsgdGhlbWVfYncoKSArIGdndGl0bGUoImRpc3RhbmNlIHRvIG5lYXJlc3QgSDNLMjdhYyBwZWFrIGV4Y2x1ZGluZyBnZW5lIGJvZHkiKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMjUwKjEwMDApKQoKICAKYGBgCiMjIyMjIGJpbmFyeSBncm91cCAtIGV4Y2x1ZGluZyBzcGVjaWZpYyBnZW5lIGJvZHkKYGBge3J9Cmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2IikpJGdlbmUKZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3YiKSkkZ2VuZQoKCmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWQiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gIisiLCBWMiwgVjMpLCBlbnNlbWJsID0gVjYsIGNociA9IFYxKSAlPiUKICBkcGx5cjo6c2VsZWN0KGVuc2VtYmwsIGNociwgVFNTKSAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgYyhncm91cDEsIGdyb3VwMikpCmdlbmVzLmdyIDwtIEdSYW5nZXMoCiAgc2VxbmFtZXMgPSBnZW5lLnRiJGNociwKICByYW5nZXMgPSBJUmFuZ2VzKHN0YXJ0ID0gZ2VuZS50YiRUU1MsIGVuZCA9IGdlbmUudGIkVFNTKSwKICBlbnNlbWJsID0gZ2VuZS50YiRlbnNlbWJsCikKCmdlbmVib2R5LnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkIikpICU+JSBkcGx5cjo6ZmlsdGVyKFY2ICVpbiUgYyhncm91cDEsIGdyb3VwMikpJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMykKY29sbmFtZXMoZ2VuZWJvZHkudGIpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQpnZW5lYm9keS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZWJvZHkudGIpCgoKIyBTdGVwIDE6IEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBnZW5lIGJvZGllcyBhbmQgcGVha3MKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGdlbmVib2R5LmdyLCBwZWFrLkgzSzI3YWMpCgojIENyZWF0ZSBhIGxpc3QgbWFwcGluZyBlYWNoIGdlbmUgdG8gdGhlIGluZGljZXMgb2YgcGVha3Mgb3ZlcmxhcHBpbmcgd2l0aCBpdHMgZ2VuZSBib2R5Cm92ZXJsYXBwaW5nX3BlYWtzX3Blcl9nZW5lIDwtIHNwbGl0KHN1YmplY3RIaXRzKG92ZXJsYXBzKSwgcXVlcnlIaXRzKG92ZXJsYXBzKSkKCiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSBsaXN0IHRvIHN0b3JlIHJlc3VsdHMKcmVzdWx0c19saXN0IDwtIHZlY3RvcigibGlzdCIsIGxlbmd0aChnZW5lcy5ncikpCgojIFN0ZXAgMjogRm9yIGVhY2ggZ2VuZSwgZXhjbHVkZSBvdmVybGFwcGluZyBwZWFrcyBhbmQgZmluZCB0aGUgbmVhcmVzdCBwZWFrIHRvIGl0cyBUU1MKZm9yIChpIGluIHNlcV9hbG9uZyhnZW5lcy5ncikpIHsKICBnZW5lIDwtIGdlbmVzLmdyW2ldCiAgCiAgIyBHZXQgaW5kaWNlcyBvZiBwZWFrcyBvdmVybGFwcGluZyB3aXRoIHRoaXMgZ2VuZSdzIGJvZHkKICBvdmVybGFwcGluZ19wZWFrX2luZGljZXMgPC0gb3ZlcmxhcHBpbmdfcGVha3NfcGVyX2dlbmVbW2FzLmNoYXJhY3RlcihpKV1dCiAgCiAgIyBFeGNsdWRlIG92ZXJsYXBwaW5nIHBlYWtzIGZvciB0aGlzIGdlbmUKICBpZiAoIWlzLm51bGwob3ZlcmxhcHBpbmdfcGVha19pbmRpY2VzKSkgewogICAgcGVha3NfdG9fY29uc2lkZXIgPC0gcGVhay5IM0syN2FjWy1vdmVybGFwcGluZ19wZWFrX2luZGljZXNdCiAgfSBlbHNlIHsKICAgIHBlYWtzX3RvX2NvbnNpZGVyIDwtIHBlYWsuSDNLMjdhYwogIH0KICAKICAjIEZpbmQgdGhlIG5lYXJlc3QgcGVhayB0byB0aGUgVFNTIG9mIHRoaXMgZ2VuZQogIG5lYXJlc3RfcGVha19pbmRleCA8LSBuZWFyZXN0KGdlbmUsIHBlYWtzX3RvX2NvbnNpZGVyKQogIAogIGlmIChpcy5uYShuZWFyZXN0X3BlYWtfaW5kZXgpKSB7CiAgICAjIE5vIHBlYWtzIGZvdW5kOyBzZXQgTkEgdmFsdWVzCiAgICByZXN1bHRzX2xpc3RbW2ldXSA8LSBkYXRhLmZyYW1lKAogICAgICBlbnNlbWJsID0gbWNvbHMoZ2VuZSkkZW5zZW1ibCwKICAgICAgZ2VuZV9jaHIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMoZ2VuZSkpLAogICAgICBnZW5lX1RTUyA9IHN0YXJ0KGdlbmUpLAogICAgICBwZWFrX2NociA9IE5BLAogICAgICBwZWFrX3N0YXJ0ID0gTkEsCiAgICAgIHBlYWtfZW5kID0gTkEsCiAgICAgIGRpc3RhbmNlID0gTkEKICAgICkKICB9IGVsc2UgewogICAgbmVhcmVzdF9wZWFrIDwtIHBlYWtzX3RvX2NvbnNpZGVyW25lYXJlc3RfcGVha19pbmRleF0KICAgIGRpc3QgPC0gZGlzdGFuY2UoZ2VuZSwgbmVhcmVzdF9wZWFrKQogICAgCiAgICByZXN1bHRzX2xpc3RbW2ldXSA8LSBkYXRhLmZyYW1lKAogICAgICBlbnNlbWJsID0gbWNvbHMoZ2VuZSkkZW5zZW1ibCwKICAgICAgZ2VuZV9jaHIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMoZ2VuZSkpLAogICAgICBnZW5lX1RTUyA9IHN0YXJ0KGdlbmUpLAogICAgICBwZWFrX2NociA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhuZWFyZXN0X3BlYWspKSwKICAgICAgcGVha19zdGFydCA9IHN0YXJ0KG5lYXJlc3RfcGVhayksCiAgICAgIHBlYWtfZW5kID0gZW5kKG5lYXJlc3RfcGVhayksCiAgICAgIGRpc3RhbmNlID0gZGlzdAogICAgKQogIH0KfQoKIyBDb21iaW5lIHJlc3VsdHMgaW50byBhIHNpbmdsZSBkYXRhIGZyYW1lCnJlc3VsdHMgPC0gZG8uY2FsbChyYmluZCwgcmVzdWx0c19saXN0KQoKIyBBZGQgZ3JvdXAgaW5mb3JtYXRpb24KcmVzdWx0cyA8LSByZXN1bHRzICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKAogIGVuc2VtYmwgJWluJSBncm91cDEgfiAiZ3JvdXAxIiwKICBlbnNlbWJsICVpbiUgZ3JvdXAyIH4gImdyb3VwMiIsCiAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8KKSkKCiMgUGxvdHRpbmcKZ2dwbG90KHJlc3VsdHMsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaXN0YW5jZSwgZmlsbCA9IGdyb3VwKSkgKwogIGdlb21fdmlvbGluKCkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gMC4xLCBmaWxsID0gIndoaXRlIikgKwogIHRoZW1lX2J3KCkgKwogIGdndGl0bGUoIkRpc3RhbmNlIHRvIE5lYXJlc3QgSDNLMjdhYyBQZWFrIEV4Y2x1ZGluZyBHZW5lIEJvZHkgT3ZlcmxhcHMiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDUwICogMTAwMCkpCmBgYAoKIyMjIyMgYmluYXJ5IGdyb3VwIC0gZXhjbHVkaW5nIGFsbCBUU1MgKy0gMTBrYgpgYGB7cn0KZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgIm1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSAiKyIsIFYyLCBWMyksIGVuc2VtYmwgPSBWNiwgY2hyID0gVjEpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibCwgY2hyLCBUU1MpCgpncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdiIpKSRnZW5lCmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2IikpJGdlbmUKCgpnZW5lLnRiIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGMoZ3JvdXAxLCBncm91cDIpKQpnZW5lcy5nciA8LSBHUmFuZ2VzKAogIHNlcW5hbWVzID0gZ2VuZS50YiRjaHIsCiAgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGdlbmUudGIkVFNTLCBlbmQgPSBnZW5lLnRiJFRTUyksCiAgZW5zZW1ibCA9IGdlbmUudGIkZW5zZW1ibAopCgpnZW5lYm9keS50YiA8LSBnZW5lLnRiICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gVFNTLTEwKjEwMDAsIGVuZCA9IFRTUyArIDEwKjEwMDApICU+JQogIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kKQoKZ2VuZWJvZHkuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmVib2R5LnRiKQoKCnBlYWsuSDNLMjdhYyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkIikpCiMgcGVhay5IM0syN2FjPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGZyZWFkKGhlcmUocmVmRGlyLCAiR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkIikpICU+JSAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6bXV0YXRlKGNociA9IFYxLCBzdGFydCA9IChWMiArIFYzKS8yLCBlbmQgPSAoVjIgKyBWMykvMikgJT4lCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChjaHIsIHN0YXJ0LCBlbmQpKQoKIyMjIyMjIyBGaWx0ZXJpbmcgb3V0IHBlYWtzIG92ZXJsYXBwaW5nIHdpdGggdGhlIGdlbmUgYm9keQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoZ2VuZWJvZHkuZ3IsIHBlYWsuSDNLMjdhYykKCiMgSW5kaWNlcyBvZiBwZWFrcyB0aGF0IG92ZXJsYXAgdGhlIFRTUwpvdmVybGFwcGluZ19wZWFrX2luZGljZXMgPC0gdW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXBzKSkKCiMgRXhjbHVkZSBvdmVybGFwcGluZyBwZWFrcwpub25fb3ZlcmxhcHBpbmdfcGVha3MgPC0gcGVhay5IM0syN2FjWy1vdmVybGFwcGluZ19wZWFrX2luZGljZXNdCgoKIyMjIyMjIyBDYWxjdWxhdGluZyBkaXN0YW5jZSB0byBuZWFyZXN0IHBlYWsKbmVhcmVzdF9wZWFrX2luZGljZXMgPC0gbmVhcmVzdChnZW5lcy5nciwgbm9uX292ZXJsYXBwaW5nX3BlYWtzKQpuZWFyZXN0X3BlYWtzIDwtIG5vbl9vdmVybGFwcGluZ19wZWFrc1tuZWFyZXN0X3BlYWtfaW5kaWNlc10KZGlzdGFuY2VzIDwtIGRpc3RhbmNlKGdlbmVzLmdyLCBuZWFyZXN0X3BlYWtzKQoKCnJlc3VsdHMgPC0gZGF0YS5mcmFtZSgKICBlbnNlbWJsID0gbWNvbHMoZ2VuZXMuZ3IpJGVuc2VtYmwsCiAgZ2VuZV9jaHIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMoZ2VuZXMuZ3IpKSwKICBnZW5lX1RTUyA9IHN0YXJ0KGdlbmVzLmdyKSwKICBwZWFrX2NociA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhuZWFyZXN0X3BlYWtzKSksCiAgcGVha19zdGFydCA9IHN0YXJ0KG5lYXJlc3RfcGVha3MpLAogIHBlYWtfZW5kID0gZW5kKG5lYXJlc3RfcGVha3MpLAogIGRpc3RhbmNlID0gZGlzdGFuY2VzCikKCnJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihlbnNlbWJsICVpbiUgZ3JvdXAxIH4gImdyb3VwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwMiB+ICJncm91cDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpCgpnZ3Bsb3QocmVzdWx0cywgYWVzKHggPSBncm91cCwgeSA9IGRpc3RhbmNlLCBmaWxsID0gZ3JvdXApKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BLCB3aWR0aCA9IDAuMSwgZmlsbCA9ICJ3aGl0ZSIpICsgdGhlbWVfYncoKSArIGdndGl0bGUoImRpc3RhbmNlIHRvIG5lYXJlc3QgSDNLMjdhYyBwZWFrIGV4Y2x1ZGluZyBnZW5lIGJvZHkiKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMjUwKjEwMDApKQoKICAKYGBgCgojIyMjIyBiaW5hcnkgZ3JvdXAgLSBleGNsdWRpbmcgc3BlY2lmaWMgVFNTICstIDEwIGtiCmBgYHtyfQpncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdiIpKSRnZW5lCmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2IikpJGdlbmUKCgpnZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkIikpICU+JQogIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09ICIrIiwgVjIsIFYzKSwgZW5zZW1ibCA9IFY2LCBjaHIgPSBWMSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsLCBjaHIsIFRTUykgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGMoZ3JvdXAxLCBncm91cDIpKQpnZW5lcy5nciA8LSBHUmFuZ2VzKAogIHNlcW5hbWVzID0gZ2VuZS50YiRjaHIsCiAgcmFuZ2VzID0gSVJhbmdlcyhzdGFydCA9IGdlbmUudGIkVFNTLCBlbmQgPSBnZW5lLnRiJFRTUyksCiAgZW5zZW1ibCA9IGdlbmUudGIkZW5zZW1ibAopCgpnZW5lYm9keS50YiA8LSBnZW5lLnRiICU+JSBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gVFNTLTEwKjEwMDAsIGVuZCA9IFRTUyArIDEwKjEwMDApICU+JQogIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kKQpnZW5lYm9keS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZWJvZHkudGIpCgpwZWFrLkgzSzI3YWMgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgIkdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5uYXJyb3dQZWFrLmJlZCIpKQoKCiMgU3RlcCAxOiBGaW5kIG92ZXJsYXBzIGJldHdlZW4gZ2VuZSBib2RpZXMgYW5kIHBlYWtzCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhnZW5lYm9keS5nciwgcGVhay5IM0syN2FjKQoKIyBDcmVhdGUgYSBsaXN0IG1hcHBpbmcgZWFjaCBnZW5lIHRvIHRoZSBpbmRpY2VzIG9mIHBlYWtzIG92ZXJsYXBwaW5nIHdpdGggaXRzIGdlbmUgYm9keQpvdmVybGFwcGluZ19wZWFrc19wZXJfZ2VuZSA8LSBzcGxpdChzdWJqZWN0SGl0cyhvdmVybGFwcyksIHF1ZXJ5SGl0cyhvdmVybGFwcykpCgojIEluaXRpYWxpemUgYW4gZW1wdHkgbGlzdCB0byBzdG9yZSByZXN1bHRzCnJlc3VsdHNfbGlzdCA8LSB2ZWN0b3IoImxpc3QiLCBsZW5ndGgoZ2VuZXMuZ3IpKQoKIyBTdGVwIDI6IEZvciBlYWNoIGdlbmUsIGV4Y2x1ZGUgb3ZlcmxhcHBpbmcgcGVha3MgYW5kIGZpbmQgdGhlIG5lYXJlc3QgcGVhayB0byBpdHMgVFNTCmZvciAoaSBpbiBzZXFfYWxvbmcoZ2VuZXMuZ3IpKSB7CiAgZ2VuZSA8LSBnZW5lcy5ncltpXQogIAogICMgR2V0IGluZGljZXMgb2YgcGVha3Mgb3ZlcmxhcHBpbmcgd2l0aCB0aGlzIGdlbmUncyBib2R5CiAgb3ZlcmxhcHBpbmdfcGVha19pbmRpY2VzIDwtIG92ZXJsYXBwaW5nX3BlYWtzX3Blcl9nZW5lW1thcy5jaGFyYWN0ZXIoaSldXQogIAogICMgRXhjbHVkZSBvdmVybGFwcGluZyBwZWFrcyBmb3IgdGhpcyBnZW5lCiAgaWYgKCFpcy5udWxsKG92ZXJsYXBwaW5nX3BlYWtfaW5kaWNlcykpIHsKICAgIHBlYWtzX3RvX2NvbnNpZGVyIDwtIHBlYWsuSDNLMjdhY1stb3ZlcmxhcHBpbmdfcGVha19pbmRpY2VzXQogIH0gZWxzZSB7CiAgICBwZWFrc190b19jb25zaWRlciA8LSBwZWFrLkgzSzI3YWMKICB9CiAgCiAgIyBGaW5kIHRoZSBuZWFyZXN0IHBlYWsgdG8gdGhlIFRTUyBvZiB0aGlzIGdlbmUKICBuZWFyZXN0X3BlYWtfaW5kZXggPC0gbmVhcmVzdChnZW5lLCBwZWFrc190b19jb25zaWRlcikKICAKICBpZiAoaXMubmEobmVhcmVzdF9wZWFrX2luZGV4KSkgewogICAgIyBObyBwZWFrcyBmb3VuZDsgc2V0IE5BIHZhbHVlcwogICAgcmVzdWx0c19saXN0W1tpXV0gPC0gZGF0YS5mcmFtZSgKICAgICAgZW5zZW1ibCA9IG1jb2xzKGdlbmUpJGVuc2VtYmwsCiAgICAgIGdlbmVfY2hyID0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKGdlbmUpKSwKICAgICAgZ2VuZV9UU1MgPSBzdGFydChnZW5lKSwKICAgICAgcGVha19jaHIgPSBOQSwKICAgICAgcGVha19zdGFydCA9IE5BLAogICAgICBwZWFrX2VuZCA9IE5BLAogICAgICBkaXN0YW5jZSA9IE5BCiAgICApCiAgfSBlbHNlIHsKICAgIG5lYXJlc3RfcGVhayA8LSBwZWFrc190b19jb25zaWRlcltuZWFyZXN0X3BlYWtfaW5kZXhdCiAgICBkaXN0IDwtIGRpc3RhbmNlKGdlbmUsIG5lYXJlc3RfcGVhaykKICAgIAogICAgcmVzdWx0c19saXN0W1tpXV0gPC0gZGF0YS5mcmFtZSgKICAgICAgZW5zZW1ibCA9IG1jb2xzKGdlbmUpJGVuc2VtYmwsCiAgICAgIGdlbmVfY2hyID0gYXMuY2hhcmFjdGVyKHNlcW5hbWVzKGdlbmUpKSwKICAgICAgZ2VuZV9UU1MgPSBzdGFydChnZW5lKSwKICAgICAgcGVha19jaHIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMobmVhcmVzdF9wZWFrKSksCiAgICAgIHBlYWtfc3RhcnQgPSBzdGFydChuZWFyZXN0X3BlYWspLAogICAgICBwZWFrX2VuZCA9IGVuZChuZWFyZXN0X3BlYWspLAogICAgICBkaXN0YW5jZSA9IGRpc3QKICAgICkKICB9Cn0KCiMgQ29tYmluZSByZXN1bHRzIGludG8gYSBzaW5nbGUgZGF0YSBmcmFtZQpyZXN1bHRzIDwtIGRvLmNhbGwocmJpbmQsIHJlc3VsdHNfbGlzdCkKCiMgQWRkIGdyb3VwIGluZm9ybWF0aW9uCnJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbigKICBlbnNlbWJsICVpbiUgZ3JvdXAxIH4gImdyb3VwMSIsCiAgZW5zZW1ibCAlaW4lIGdyb3VwMiB+ICJncm91cDIiLAogIFRSVUUgfiBOQV9jaGFyYWN0ZXJfCikpCgpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gZ3JvdXAxKSApJGRpc3RhbmNlCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IGdyb3VwMikgKSRkaXN0YW5jZQogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCmdldFB2YWxXaWxjb3gocmVzdWx0cywgImdyb3VwMSIsICJncm91cDIiKQojIFBsb3R0aW5nCmdncGxvdChyZXN1bHRzLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlzdGFuY2UsIGZpbGwgPSBncm91cCkpICsKICBnZW9tX3Zpb2xpbigpICsKICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BLCB3aWR0aCA9IDAuMSwgZmlsbCA9ICJ3aGl0ZSIpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJEaXN0YW5jZSB0byBOZWFyZXN0IEgzSzI3YWMgUGVhayBFeGNsdWRpbmcgR2VuZSBCb2R5IE92ZXJsYXBzIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA1MCAqIDEwMDApKSArCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgCmBgYAoKIyMjIyMgT25seSBsaW1pdGluZyB0byBFLVAgbG9vcHMgZnJvbSBNaWNyby1DCmBgYHtyfQoKZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3YiKSkkZ2VuZQpncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdiIpKSRnZW5lCgoKCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCgpnZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICJfcC1wZV9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSAwLjIpICU+JQogIGRwbHlyOjpmaWx0ZXIoQW5ubzIgPT0gIlAtRSIpCgp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgdW5uZXN0KGdlbmUpCgpnZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkIikpICU+JQogIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09ICIrIiwgVjIsIFYzKSwgZW5zZW1ibCA9IFY2LCBjaHIgPSBWMSkgJT4lCiAgZHBseXI6OnNlbGVjdChlbnNlbWJsLCBjaHIsIFRTUykKCnRlbXAgPC0gZHBseXI6OmxlZnRfam9pbih0ZW1wLCBnZW5lLnRiLCBieSA9IGMoImdlbmUiID0gImVuc2VtYmwiKSkKCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShjZW50ZXIxID0gKHN0YXJ0MSArIGVuZDEpLzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIyID0gKHN0YXJ0MiArIGVuZDIpLzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZTEgPSBhYnMoVFNTLWNlbnRlcjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UyID0gYWJzKFRTUy1jZW50ZXIyKSkgJT4lCiAgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHBtYXgoZGlzdGFuY2UxLCBkaXN0YW5jZTIpKQoKdGVtcCA8LSB0ZW1wICU+JSBncm91cF9ieShnZW5lKSAlPiUgc3VtbWFyaXplKG1pbl9lbmhfZGlzdGFuY2UgPSBtaW4oZGlzdGFuY2UpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGdlbmUgJWluJSBncm91cDEgfiAiZ3JvdXAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBncm91cDIgfiAiZ3JvdXAyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JQogIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSkKCgpnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IG1pbl9lbmhfZGlzdGFuY2UsIGZpbGwgPSBncm91cCkpICsgCiAgZ2VvbV92aW9saW4oKSArCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjEsIGZpbGwgPSAid2hpdGUiKSArCiAgdGhlbWVfYncoKSArCiAgZ2d0aXRsZSgiRGlzdGFuY2UgdG8gTmVhcmVzdCBFbmhhbmNlciBmcm8gRS1QIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTAwMCAqIDEwMDApKQoKYGBgCgoKCiMjIyBbMi4yNF0gKFdPUktJTkcgT04pQ2hlY2tpbmcgdGhlIHBlcmNlbnRhZ2Ugb2Ygbm9uLWltcG9ydGFudCBsb29wcwpJZGVhOiBoYXZpbmcgb25lIG5vbi1wZXJ0dXJiZWQgcmVnIGxvb3BzIGNvdWxkIGJlIGVub3VnaC4KYGBge3J9Cm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIl9wLW5fZW5zZW1ibExpc3QudHN2IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yKQoKCmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShzaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIHNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgc2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQpsb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgc2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQoKZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGMobG9vcC51cCRpZCwgbG9vcC5ubyRpZCwgbG9vcC5kb3duJGlkKSkgJT4lCiAgZHBseXI6Om11dGF0ZShsb29wVHlwZSA9IGNhc2Vfd2hlbihpZCAlaW4lIGMobG9vcC51cCRpZCwgbG9vcC5ubyRpZCkgfiAiaW5zZW5zaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgJWluJSBjKGxvb3AuZG93biRpZCkgfiAic2Vuc2l0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpCgpkYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChnZW5lLCBpZCwgbG9vcFR5cGUpICU+JSB1bm5lc3QoZ2VuZSkgJT4lCiAgZ3JvdXBfYnkoZ2VuZSkgJT4lIHN1bW1hcml6ZSgKICAgIGluc2Vuc2l0aXZlID0gc3VtKGxvb3BUeXBlID09ICJpbnNlbnNpdGl2ZSIsIG5hLnJtID0gVFJVRSksCiAgICBzZW5zaXRpdmUgPSBzdW0obG9vcFR5cGUgPT0gInNlbnNpdGl2ZSIsIG5hLnJtID0gVFJVRSkpCgoKCiMjIwoKZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3YiKSkkZ2VuZQpncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdiIpKSRnZW5lCgpnZW5lR3JvdXAgPC0gdGliYmxlKGdyb3VwID0gYyhyZXAoImdyb3VwMSIsIGxlbmd0aChncm91cDEpKSwgcmVwKCJncm91cDIiLCBsZW5ndGgoZ3JvdXAyKSkpLAogICAgICAgICAgICAgICAgICAgIGdlbmUgPSBjKGdyb3VwMSwgZ3JvdXAyKSkKCmRhdGEgPC0gbGVmdF9qb2luKGdlbmVHcm91cCwgZGF0YSwgYnkgPSBjKCJnZW5lIikpICU+JSBkcGx5cjo6bXV0YXRlKG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCB+cmVwbGFjZV9uYSguLCAwKSkpKQoKCiMjIwpkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUocHJlc2VuY2VPZlJldGFpbmVkID0gaWZfZWxzZShpbnNlbnNpdGl2ZSA+IDAsICJZRVMiLCAiTk8iKSwKICAgICAgICAgICAgICAgICAgICAgICBwZXJjT2ZSZXRhaW5lZCA9IGlmX2Vsc2UoaW5zZW5zaXRpdmUgKyBzZW5zaXRpdmUgPT0gMCwgMCwgMTAwKmluc2Vuc2l0aXZlLyhpbnNlbnNpdGl2ZSArIHNlbnNpdGl2ZSkpKQoKCiMjIwpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IHBlcmNPZlJldGFpbmVkLCBmaWxsID0gZ3JvdXApKSArIGdlb21fdmlvbGluKCkgKyAKICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BLCB3aWR0aCA9IDAuMSwgZmlsbCA9ICJ3aGl0ZSIpICsgdGhlbWVfYncoKQoKCiMjIyBTdGFja2VkIGJhcnBsb3QKZ3JvdXAgPC0gYygiZ3JvdXAxIiwgImdyb3VwMSIsICJncm91cDIiLCAiZ3JvdXAyIikKcHJlc2VuY2VPZlJldGFpbmVkIDwtIHJlcChjKCJZRVMiLCAiTk8iKSwgMikKcHJlc2VuY2VPZlJldGFpbmVkIDwtIGZhY3RvciAocHJlc2VuY2VPZlJldGFpbmVkLCBsZXZlbHMgPSBjKCJZRVMiLCAiTk8iKSkKdmFsdWUgPC0gYyhucm93KGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gImdyb3VwMSIsIHByZXNlbmNlT2ZSZXRhaW5lZCA9PSAiWUVTIikpLAogICAgICAgICAgIG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiZ3JvdXAxIiwgcHJlc2VuY2VPZlJldGFpbmVkID09ICJOTyIpKSwKICAgICAgICAgICBucm93KGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gImdyb3VwMiIsIHByZXNlbmNlT2ZSZXRhaW5lZCA9PSAiWUVTIikpLAogICAgICAgICAgIG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiZ3JvdXAyIiwgcHJlc2VuY2VPZlJldGFpbmVkID09ICJOTyIpKSkKcGxvdERhdGEgPC0gZGF0YS5mcmFtZShncm91cCwgcHJlc2VuY2VPZlJldGFpbmVkLCB2YWx1ZSkKCmdncGxvdChwbG90RGF0YSwgYWVzKGZpbGw9cHJlc2VuY2VPZlJldGFpbmVkLCB5PXZhbHVlLCB4PWdyb3VwKSkgKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIiwgc3RhdD0iaWRlbnRpdHkiKSArIHRoZW1lX2NsYXNzaWMoKQoKCmBgYAoKYGBge3J9Cm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIl9wLXBlX2Vuc2VtYmxMaXN0LnRzdiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMikKCgpsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlIikpICU+JQogIGRwbHlyOjptdXRhdGUoc2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBzaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGUiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShzaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIHNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGUiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShzaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIHNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKCmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBjKGxvb3AudXAkaWQsIGxvb3Aubm8kaWQsIGxvb3AuZG93biRpZCkpICU+JQogIGRwbHlyOjptdXRhdGUobG9vcFR5cGUgPSBjYXNlX3doZW4oaWQgJWluJSBjKGxvb3AudXAkaWQsIGxvb3Aubm8kaWQpIH4gImluc2Vuc2l0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkICVpbiUgYyhsb29wLmRvd24kaWQpIH4gInNlbnNpdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKQoKZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZ2VuZSwgaWQsIGxvb3BUeXBlKSAlPiUgdW5uZXN0KGdlbmUpICU+JQogIGdyb3VwX2J5KGdlbmUpICU+JSBzdW1tYXJpemUoCiAgICBpbnNlbnNpdGl2ZSA9IHN1bShsb29wVHlwZSA9PSAiaW5zZW5zaXRpdmUiLCBuYS5ybSA9IFRSVUUpLAogICAgc2Vuc2l0aXZlID0gc3VtKGxvb3BUeXBlID09ICJzZW5zaXRpdmUiLCBuYS5ybSA9IFRSVUUpKQoKCgojIyMKCmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2IikpJGdlbmUKZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3YiKSkkZ2VuZQoKZ2VuZUdyb3VwIDwtIHRpYmJsZShncm91cCA9IGMocmVwKCJncm91cDEiLCBsZW5ndGgoZ3JvdXAxKSksIHJlcCgiZ3JvdXAyIiwgbGVuZ3RoKGdyb3VwMikpKSwKICAgICAgICAgICAgICAgICAgICBnZW5lID0gYyhncm91cDEsIGdyb3VwMikpCgpkYXRhIDwtIGxlZnRfam9pbihnZW5lR3JvdXAsIGRhdGEsIGJ5ID0gYygiZ2VuZSIpKSAlPiUgZHBseXI6Om11dGF0ZShtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgfnJlcGxhY2VfbmEoLiwgMCkpKSkKCgojIyMKZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKHByZXNlbmNlT2ZSZXRhaW5lZCA9IGlmX2Vsc2UoaW5zZW5zaXRpdmUgPiAwLCAiWUVTIiwgIk5PIiksCiAgICAgICAgICAgICAgICAgICAgICAgcGVyY09mUmV0YWluZWQgPSBpZl9lbHNlKGluc2Vuc2l0aXZlICsgc2Vuc2l0aXZlID09IDAsIDAsIDEwMCppbnNlbnNpdGl2ZS8oaW5zZW5zaXRpdmUgKyBzZW5zaXRpdmUpKSkKCgojIyMKZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBwZXJjT2ZSZXRhaW5lZCwgZmlsbCA9IGdyb3VwKSkgKyBnZW9tX3Zpb2xpbigpICsgCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAwLjA1LCBmaWxsID0gIndoaXRlIikgKyB0aGVtZV9idygpCgoKIyMjIFN0YWNrZWQgYmFycGxvdApncm91cCA8LSBjKCJncm91cDEiLCAiZ3JvdXAxIiwgImdyb3VwMiIsICJncm91cDIiKQpwcmVzZW5jZU9mUmV0YWluZWQgPC0gcmVwKGMoIllFUyIsICJOTyIpLCAyKQpwcmVzZW5jZU9mUmV0YWluZWQgPC0gZmFjdG9yIChwcmVzZW5jZU9mUmV0YWluZWQsIGxldmVscyA9IGMoIllFUyIsICJOTyIpKQp2YWx1ZSA8LSBjKG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiZ3JvdXAxIiwgcHJlc2VuY2VPZlJldGFpbmVkID09ICJZRVMiKSksCiAgICAgICAgICAgbnJvdyhkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJncm91cDEiLCBwcmVzZW5jZU9mUmV0YWluZWQgPT0gIk5PIikpLAogICAgICAgICAgIG5yb3coZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiZ3JvdXAyIiwgcHJlc2VuY2VPZlJldGFpbmVkID09ICJZRVMiKSksCiAgICAgICAgICAgbnJvdyhkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJncm91cDIiLCBwcmVzZW5jZU9mUmV0YWluZWQgPT0gIk5PIikpKQpwbG90RGF0YSA8LSBkYXRhLmZyYW1lKGdyb3VwLCBwcmVzZW5jZU9mUmV0YWluZWQsIHZhbHVlKQoKZ2dwbG90KHBsb3REYXRhLCBhZXMoZmlsbD1wcmVzZW5jZU9mUmV0YWluZWQsIHk9dmFsdWUsIHg9Z3JvdXApKSArIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiLCBzdGF0PSJpZGVudGl0eSIpICsgdGhlbWVfY2xhc3NpYygpCgoKYGBgCgojIyMgWzIuMjVdIE9icy9FeHAgbG9vcHMKCgojIyMjIE1lcmdpbmcgb2JzL2V4cCBzY29yZXMgZnJvbSBkaWZmZXJlbnQgcmVzb2x1dGlvbiAmIHNhbXBsZXMKIyMjIyMgRzEKYGBge3J9Cmxvb3BzIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfc2NvcmUudHN2IikpCgpzYW1wbGUgPC0gIkcxLkRNU08uTWVyZ2VkIgpmb3Ioc2FtcGxlIGluIGMoIkcxLkRNU08uTWVyZ2VkIiwgIkcxLmRUQUcuTWVyZ2VkIiwgIkcxLkE0ODUuTWVyZ2VkIikpewogIHRlbXAuMjVrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgc2FtcGxlLCAiXzI1a2IudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsCiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JQogICAgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGlkLCBvYnNlcnZlZCwgIk8vRSIpCiAgY29sbmFtZXModGVtcC4yNWtiKSA8LSBjKCJjaHJvbTEiLCAic3RhcnQxIiwgImVuZDEiLCAiY2hyb20yIiwgInN0YXJ0MiIsICJlbmQyIiwgImlkIiwgIm9icyIsICJvYnNleHAiKQogIAogIHRlbXAuMTBrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgc2FtcGxlLCAiXzEwa2IudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsCiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JQogICAgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGlkLCBvYnNlcnZlZCwgIk8vRSIpCiAgY29sbmFtZXModGVtcC4xMGtiKSA8LSBjKCJjaHJvbTEiLCAic3RhcnQxIiwgImVuZDEiLCAiY2hyb20yIiwgInN0YXJ0MiIsICJlbmQyIiwgImlkIiwgIm9icyIsICJvYnNleHAiKQogIAogIHRlbXAuNWtiIDwtZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlXyIsIHNhbXBsZSwgIl81a2IudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsCiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JQogICAgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGlkLCBvYnNlcnZlZCwgIk8vRSIpCiAgY29sbmFtZXModGVtcC41a2IpIDwtIGMoImNocm9tMSIsICJzdGFydDEiLCAiZW5kMSIsICJjaHJvbTIiLCAic3RhcnQyIiwgImVuZDIiLCAiaWQiLCAib2JzIiwgIm9ic2V4cCIpCiAgCiAgdGVtcCA8LSBiaW5kX3Jvd3ModGVtcC4yNWtiLCB0ZW1wLjEwa2IsIHRlbXAuNWtiKQogIGZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgc2FtcGxlLCAiLnRzdiIpKSwgc2VwID0gIlx0IikKfQoKCnRlbXAuRE1TTyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImxvb3BTY29yZV9HMS5ETVNPLk1lcmdlZC50c3YiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChpZCwgb2JzLCBvYnNleHApCmNvbG5hbWVzKHRlbXAuRE1TTykgPC0gYygiaWQiLCAib2JzX0RNU08iLCAib2JzZXhwX0RNU08iKQp0ZW1wLmRUQUcgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJsb29wU2NvcmVfRzEuZFRBRy5NZXJnZWQudHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKQpjb2xuYW1lcyh0ZW1wLmRUQUcpIDwtIGMoImlkIiwgIm9ic19kVEFHIiwgIm9ic2V4cF9kVEFHIikKdGVtcC5BNDg1IDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAibG9vcFNjb3JlX0cxLkE0ODUuTWVyZ2VkLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGlkLCBvYnMsIG9ic2V4cCkKY29sbmFtZXModGVtcC5BNDg1KSA8LSBjKCJpZCIsICJvYnNfQTQ4NSIsICJvYnNleHBfQTQ4NSIpCgpsb29wc19vZSA8LSBmdWxsX2pvaW4oZnVsbF9qb2luKHRlbXAuRE1TTywgdGVtcC5kVEFHLCBieSA9ICJpZCIpLAogICAgICAgICAgdGVtcC5BNDg1LCBieSA9ICJpZCIpICU+JQogIGRwbHlyOjptdXRhdGUob2VGQ19kVEFHX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIE5BLCBvYnNleHBfZFRBRy9vYnNleHBfRE1TTyksCiAgICAgICAgICAgICAgICBvZUZDX0E0ODVfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgTkEsIG9ic2V4cF9BNDg1L29ic2V4cF9ETVNPKSkKCmZ3cml0ZShsb29wc19vZSwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdiIpKSwgc2VwID0gIlx0IikKYGBgCgojIyMjIyBBc3luYwpgYGB7cn0KbG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19zY29yZS50c3YiKSkKCmZvcihzYW1wbGUgaW4gYygiQXN5bmMuVVQiLCAiQXN5bmMuQUlEIikpewogIHRlbXAuMjVrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgc2FtcGxlLCAiXzI1a2IudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsCiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JQogICAgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGlkLCBvYnNlcnZlZCwgIk8vRSIpCiAgY29sbmFtZXModGVtcC4yNWtiKSA8LSBjKCJjaHJvbTEiLCAic3RhcnQxIiwgImVuZDEiLCAiY2hyb20yIiwgInN0YXJ0MiIsICJlbmQyIiwgImlkIiwgIm9icyIsICJvYnNleHAiKQogIAogIHRlbXAuMTBrYiA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgc2FtcGxlLCAiXzEwa2IudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsCiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JQogICAgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGlkLCBvYnNlcnZlZCwgIk8vRSIpCiAgY29sbmFtZXModGVtcC4xMGtiKSA8LSBjKCJjaHJvbTEiLCAic3RhcnQxIiwgImVuZDEiLCAiY2hyb20yIiwgInN0YXJ0MiIsICJlbmQyIiwgImlkIiwgIm9icyIsICJvYnNleHAiKQogIAogIHRlbXAuNWtiIDwtZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlXyIsIHNhbXBsZSwgIl81a2IudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsCiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JQogICAgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGlkLCBvYnNlcnZlZCwgIk8vRSIpCiAgY29sbmFtZXModGVtcC41a2IpIDwtIGMoImNocm9tMSIsICJzdGFydDEiLCAiZW5kMSIsICJjaHJvbTIiLCAic3RhcnQyIiwgImVuZDIiLCAiaWQiLCAib2JzIiwgIm9ic2V4cCIpCiAgCiAgdGVtcCA8LSBiaW5kX3Jvd3ModGVtcC4yNWtiLCB0ZW1wLjEwa2IsIHRlbXAuNWtiKQogIGZ3cml0ZSh0ZW1wLCBoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfIiwgc2FtcGxlLCAiLnRzdiIpKSwgc2VwID0gIlx0IikKfQoKCnRlbXAuVVQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJsb29wU2NvcmVfQXN5bmMuVVQudHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoaWQsIG9icywgb2JzZXhwKQpjb2xuYW1lcyh0ZW1wLlVUKSA8LSBjKCJpZCIsICJvYnNfVVQiLCAib2JzZXhwX1VUIikKdGVtcC5BSUQgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJsb29wU2NvcmVfQXN5bmMuQUlELnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGlkLCBvYnMsIG9ic2V4cCkKY29sbmFtZXModGVtcC5BSUQpIDwtIGMoImlkIiwgIm9ic19BSUQiLCAib2JzZXhwX0FJRCIpCgpsb29wc19vZSA8LSBmdWxsX2pvaW4odGVtcC5VVCwgdGVtcC5BSUQsIGJ5ID0gImlkIikgJT4lCiAgZHBseXI6Om11dGF0ZShvZUZDX0FJRF9VVCA9IGlmX2Vsc2Uob2JzZXhwX1VUID09IDAsIE5BLCBvYnNleHBfQUlEL29ic2V4cF9VVCkpCgpmd3JpdGUobG9vcHNfb2UsIGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoImxvb3BTY29yZV9jb25zX29ic2V4cF9Bc3luYy50c3YiKSksIHNlcCA9ICJcdCIpCmBgYAoKIyMjIyBNZXJnaW5nIG9icy9leHAgcGVyIHJlc29sdXRpb24KT25seSB0aGUgbG9vcHMgdGhhdCBtYWRlIHRvIGNvbnNlbnN1cyBsb29wcyBhcmUgY29uc2lkZXJlZAojIyMjIyBHMQpgYGB7cn0KbG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19zY29yZS50c3YiKSkKCnJlcyA8LSAyNQoKZm9yIChyZXMgaW4gYygyNSwgMTAsIDUpKXsKICAKICB0ZW1wLkRNU08gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX0cxLkRNU08uTWVyZ2VkXyIsIHJlcywgImtiLnRzdiIpKSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBlbmQxIC0gc3RhcnQxLAogICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKGNocm9tMSwgYmluU2l6ZSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9ICJfIikpICU+JQogICAgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3BzJGlkKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoaWQsIG9ic2VydmVkLCAiTy9FIikKICBjb2xuYW1lcyh0ZW1wLkRNU08pIDwtIGMoImlkIiwgIm9ic19ETVNPIiwgIm9ic2V4cF9ETVNPIikKICAKICB0ZW1wLmRUQUcgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX0cxLmRUQUcuTWVyZ2VkXyIsIHJlcywgImtiLnRzdiIpKSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBlbmQxIC0gc3RhcnQxLAogICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKGNocm9tMSwgYmluU2l6ZSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9ICJfIikpICU+JQogICAgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3BzJGlkKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoaWQsIG9ic2VydmVkLCAiTy9FIikKICBjb2xuYW1lcyh0ZW1wLmRUQUcpIDwtIGMoImlkIiwgIm9ic19kVEFHIiwgIm9ic2V4cF9kVEFHIikKICAKICB0ZW1wLkE0ODUgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX0cxLkE0ODUuTWVyZ2VkXyIsIHJlcywgImtiLnRzdiIpKSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBlbmQxIC0gc3RhcnQxLAogICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKGNocm9tMSwgYmluU2l6ZSwgc3RhcnQxLCBzdGFydDIsIHNlcCA9ICJfIikpICU+JQogICAgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3BzJGlkKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoaWQsIG9ic2VydmVkLCAiTy9FIikKICBjb2xuYW1lcyh0ZW1wLkE0ODUpIDwtIGMoImlkIiwgIm9ic19BNDg1IiwgIm9ic2V4cF9BNDg1IikKICAKICB0ZW1wIDwtIGZ1bGxfam9pbihmdWxsX2pvaW4odGVtcC5ETVNPLCB0ZW1wLmRUQUcsIGJ5ID0gYygiaWQiKSksIHRlbXAuQTQ4NSwgYnkgPSBjKCJpZCIpKSAlPiUgCiAgICBkcGx5cjo6bXV0YXRlKG9lRkNfZFRBR19ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBOQSwgb2JzZXhwX2RUQUcvb2JzZXhwX0RNU08pLAogICAgICAgICAgICAgICAgICBvZUZDX0E0ODVfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgTkEsIG9ic2V4cF9BNDg1L29ic2V4cF9ETVNPKSkKICAKICBmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX2NvbnNfb2JzZXhwXyIsIHJlcywgImtiLnRzdiIpKSwgc2VwID0gIlx0IikKfQoKCmBgYAoKIyMjIyMgQXN5bmMKYGBge3J9Cmxvb3BzIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfc2NvcmUudHN2IikpCgpyZXMgPC0gMjUKCmZvciAocmVzIGluIGMoMjUsIDEwLCA1KSl7CiAgCiAgdGVtcC5VVCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfQXN5bmMuVVRfIiwgcmVzLCAia2IudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsCiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JQogICAgZHBseXI6OnNlbGVjdChpZCwgb2JzZXJ2ZWQsICJPL0UiKQogIGNvbG5hbWVzKHRlbXAuVVQpIDwtIGMoImlkIiwgIm9ic19VVCIsICJvYnNleHBfVVQiKQogIAogIHRlbXAuQUlEIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoImxvb3BTY29yZV9Bc3luYy5BSURfIiwgcmVzLCAia2IudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IGVuZDEgLSBzdGFydDEsCiAgICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoY2hyb20xLCBiaW5TaXplLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcHMkaWQpICU+JQogICAgZHBseXI6OnNlbGVjdChpZCwgb2JzZXJ2ZWQsICJPL0UiKQogIGNvbG5hbWVzKHRlbXAuQUlEKSA8LSBjKCJpZCIsICJvYnNfQUlEIiwgIm9ic2V4cF9BSUQiKQoKICAKICB0ZW1wIDwtIGZ1bGxfam9pbih0ZW1wLlVULCB0ZW1wLkFJRCwgYnkgPSBjKCJpZCIpKSAlPiUgCiAgICBkcGx5cjo6bXV0YXRlKG9lRkNfQUlEX1VUID0gaWZfZWxzZShvYnNleHBfVVQgPT0gMCwgTkEsIG9ic2V4cF9BSUQvb2JzZXhwX1VUKSkKICAKICBmd3JpdGUodGVtcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX2NvbnNfb2JzZXhwXyIsIHJlcywgImtiX2FzeW5jLnRzdiIpKSwgc2VwID0gIlx0IikKfQoKCmBgYAoKIyMjIyBDb21wYXJpbmcgb2JzL2V4cCBmcm9tIGNocm9tbW9zaWdodCBsb29wIHNjb3JlcwojIyMjIyBkVEFHIHBlciByZXMKYGBge3J9CiMgSW1wb3J0aW5nIGxvb3BzCmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQpsb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQoKZm9yKHJlcyBpbiBjKDI1LCAxMCwgNSkpewogIG1pblZhbHVlIDwtIC00CiAgbWF4VmFsdWUgPC0gNQogIG9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfY29uc19vYnNleHBfIiwgcmVzLCAia2IudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLAogICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksCiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSkKICAKICAKICAjIGRUQUcKICBvYnNleHAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShvYnNleHAkbG9nX29ic2V4cF9ETVNPLCBvYnNleHAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKQogIG9ic2V4cCA8LSBvYnNleHAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCiAgZzEgPC0gZ2dwbG90KG9ic2V4cCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsgCiAgICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgICBnZ3RpdGxlKHBhc3RlMChyZXMsICJrYiwgbG9nMihvYnMvZXhwKSIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKICAKICAKICAjIFZpc3VhbGl6ZSBVUCBET1dOIGxvb3BzCiAgdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLmRvd24kaWQpCiAgdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfZFRBRywgbiA9IDEwMCkKICB0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCiAgZzIgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIAogICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSAibm9uZSIpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogICAgZ2d0aXRsZShwYXN0ZTAocmVzLCAia2IsIGxvZzIob2JzL2V4cCksIGRvd24iKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkKICAKICAKICB0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3Aubm8kaWQpCiAgdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfZFRBRywgbiA9IDEwMCkKICB0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCiAgZzMgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIAogICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSAibm9uZSIpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogICAgZ2d0aXRsZShwYXN0ZTAocmVzLCAia2IsIGxvZzIob2JzL2V4cCksIG5vIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpCiAgCiAgdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnVwJGlkKQogIHRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfRE1TTywgdGVtcCRsb2dfb2JzZXhwX2RUQUcsIG4gPSAxMDApCiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQogIGc0IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKyAKICAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICAgIGdndGl0bGUocGFzdGUwKHJlcywgImtiLCBsb2cyKG9icy9leHApLCB1cCIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKQogIAogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgib2JzZXhwX2RUQUdfdnNfRE1TT18iLCByZXMsICJrYiIpCiAgaGVpZ2h0IDwtIDQKICB3aWR0aCA8LSAxMgogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocGxvdF9ncmlkKGcxLCBnNCwgZzMsIGcyLCBuY29sID0gNCkpCiAgZGV2Lm9mZigpCn0KCmBgYAoKIyMjIyMgZFRBRyBhbGwgcmVzCmBgYHtyfQojIEltcG9ydGluZyBsb29wcwpsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQpsb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKCm1pblZhbHVlIDwtIC00Cm1heFZhbHVlIDwtIDUKCm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfY29uc19vYnNleHAudHN2IikpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSwKICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSwKICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSkKCgoKIyBkVEFHCm9ic2V4cCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KG9ic2V4cCRsb2dfb2JzZXhwX0RNU08sIG9ic2V4cCRsb2dfb2JzZXhwX2RUQUcsIG4gPSAxMDApCm9ic2V4cCA8LSBvYnNleHAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmcxIDwtIGdncGxvdChvYnNleHAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzL2V4cCkiKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgojIFZpc3VhbGl6ZSBVUCBET1dOIGxvb3BzCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5kb3duJGlkKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmcyIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icy9leHApLCBkb3duIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5ubyRpZCkKdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfZFRBRywgbiA9IDEwMCkKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpnMyA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsgCiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZ3RpdGxlKHBhc3RlMCgibG9nMihvYnMvZXhwKSwgbm8iKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgp0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3AudXAkaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfRE1TTywgdGVtcCRsb2dfb2JzZXhwX2RUQUcsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzQgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzL2V4cCksIHVwIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKCmZpbGVOYW1lIDwtIHBhc3RlMCgib2JzZXhwX2RUQUdfdnNfRE1TTyIpCmhlaWdodCA8LSA0CndpZHRoIDwtIDEyCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwbG90X2dyaWQoZzEsIGc0LCBnMywgZzIsIG5jb2wgPSA0KSkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKQpkZXYub2ZmKCkKCgojIFN0cnVjdHVyYWwKbG9vcC5zdHIgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZS5iZWRwZSIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnN0ciRpZCkKdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfZFRBRywgbiA9IDEwMCkKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpnNSA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsgCiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZ3RpdGxlKHBhc3RlMCgibG9nMihvYnMvZXhwKSwgc3RydWN0dXJhbCBsb29wcyIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKCiMgUmVnIChQRS1QRSkKbG9vcC5yZWcgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQp0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3AucmVnJGlkKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmc2IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icy9leHApLCByZWd1bGF0b3J5IGxvb3BzIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKZmlsZU5hbWUgPC0gcGFzdGUwKCJvYnNleHBfZFRBR192c19ETVNPX3N0cl92c19yZWciKQpoZWlnaHQgPC0gNAp3aWR0aCA8LSA2CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwbG90X2dyaWQoZzUsIGc2LCBuY29sID0gMikpCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwbG90X2dyaWQoZzUsIGc2LCBuY29sID0gMikpCmRldi5vZmYoKQpgYGAKIyMjIyMjIFBsb3R0aW5nIG9ubHkgc3Vic2V0CmBgYHtyfQoKc3BlY2lmaWNMb29wLjI1a2IgPC0gZnJlYWQoaGVyZShsb29wRGlyLCAiRzEuRE1TTy5NZXJnZWRfY2hyb21vc2lnaHRfMjVrYi5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQpzcGVjaWZpY0xvb3AuMTBrYiA8LSBmcmVhZChoZXJlKGxvb3BEaXIsICJHMS5ETVNPLk1lcmdlZF9jaHJvbW9zaWdodF8xMGtiLmJlZHBlIikpICU+JQogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCnNwZWNpZmljTG9vcC41a2IgPC0gZnJlYWQoaGVyZShsb29wRGlyLCAiRzEuRE1TTy5NZXJnZWRfY2hyb21vc2lnaHRfNWtiLmJlZHBlIikpICU+JQogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCgpzcGVjaWZpY0xvb3BzLkRNU08gPC0gYyhzcGVjaWZpY0xvb3AuMjVrYiRpZCwgc3BlY2lmaWNMb29wLjEwa2IkaWQsIHNwZWNpZmljTG9vcC41a2IkaWQpCgoKbWluVmFsdWUgPC0gLTQKbWF4VmFsdWUgPC0gNQoKb2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoImxvb3BTY29yZV9jb25zX29ic2V4cC50c3YiKSkpICU+JQogIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKQoKCgoKIyBTdHJ1Y3R1cmFsCmxvb3Auc3RyIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmUuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5zdHIkaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkICVpbiUgc3BlY2lmaWNMb29wcy5ETVNPKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmc1IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icy9leHApLCBzdHJ1Y3R1cmFsIGxvb3BzIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKIyBSZWcgKFBFLVBFKQpsb29wLnJlZyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5yZWckaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkICVpbiUgc3BlY2lmaWNMb29wcy5ETVNPKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmc2IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icy9leHApLCByZWd1bGF0b3J5IGxvb3BzIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKZmlsZU5hbWUgPC0gcGFzdGUwKCJvYnNleHBfZFRBR192c19ETVNPX3N0cl92c19yZWdfRE1TT3NwZWNpZmljTG9vcHMiKQpoZWlnaHQgPC0gNAp3aWR0aCA8LSA2CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwbG90X2dyaWQoZzUsIGc2LCBuY29sID0gMikpCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwbG90X2dyaWQoZzUsIGc2LCBuY29sID0gMikpCmRldi5vZmYoKQoKYGBgCiMjIyMjIyBQbG90dGluZyAxbWIKYGBge3J9Cm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiLnRzdiIpKSkKCiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldAptaW5WYWx1ZSA8LSAtNAptYXhWYWx1ZSA8LSA1Cm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfY29uc19vYnNleHAudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLAogICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksCiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSkKCiMgTWVyZ2UgZGF0YXNldApkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoImlkIikpICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKQoKCiMgSW1wb3J0aW5nIGxvb3BzCmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQpsb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQoKIyBkaXN0YW5jZSBmaWx0ZXIKb2JzZXhwIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZGlzdGFuY2UgPiAxZTYpCgoKIyBkVEFHCm9ic2V4cCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KG9ic2V4cCRsb2dfb2JzZXhwX0RNU08sIG9ic2V4cCRsb2dfb2JzZXhwX2RUQUcsIG4gPSAxMDApCm9ic2V4cCA8LSBvYnNleHAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmcxIDwtIGdncGxvdChvYnNleHAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzL2V4cCkiKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgojIFZpc3VhbGl6ZSBVUCBET1dOIGxvb3BzCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5kb3duJGlkKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmcyIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icy9leHApLCBkb3duIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5ubyRpZCkKdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfZFRBRywgbiA9IDEwMCkKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpnMyA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsgCiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZ3RpdGxlKHBhc3RlMCgibG9nMihvYnMvZXhwKSwgbm8iKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgp0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3AudXAkaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfRE1TTywgdGVtcCRsb2dfb2JzZXhwX2RUQUcsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzQgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzL2V4cCksIHVwIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKCmZpbGVOYW1lIDwtIHBhc3RlMCgib2JzZXhwX2RUQUdfdnNfRE1TT18xbWJvdmVyIikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gMTIKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocGxvdF9ncmlkKGcxLCBnNCwgZzMsIGcyLCBuY29sID0gNCkpCmRldi5vZmYoKQoKCiMgU3RydWN0dXJhbApsb29wLnN0ciA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQp0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3Auc3RyJGlkKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmc1IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icy9leHApLCBzdHJ1Y3R1cmFsIGxvb3BzIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKIyBSZWcgKFBFLVBFKQpsb29wLnJlZyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5yZWckaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfRE1TTywgdGVtcCRsb2dfb2JzZXhwX2RUQUcsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzYgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzL2V4cCksIHJlZ3VsYXRvcnkgbG9vcHMiKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgpmaWxlTmFtZSA8LSBwYXN0ZTAoIm9ic2V4cF9kVEFHX3ZzX0RNU09fMW1ib3Zlcl9zdHJfdnNfcmVnIikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gNgpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocGxvdF9ncmlkKGc1LCBnNiwgbmNvbCA9IDIpKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocGxvdF9ncmlkKGc1LCBnNiwgbmNvbCA9IDIpKQpkZXYub2ZmKCkKYGBgCgojIyMjIyMgUGxvdHRpbmcgT2JzCmBgYHtyfQptaW5WYWx1ZSA8LSAtNAptYXhWYWx1ZSA8LSAxMApvYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdiIpKSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSwKICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLAogICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksCiAgICAgICAgICAgICAgICAgIGxvZ19vYnNfRE1TTyA9IGlmX2Vsc2Uob2JzX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzX0RNU08pKSwKICAgICAgICAgICAgICAgICAgbG9nX29ic19kVEFHID0gaWZfZWxzZShvYnNfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNfZFRBRykpLAogICAgICAgICAgICAgICAgICBsb2dfb2JzX0E0ODUgPSBpZl9lbHNlKG9ic19BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic19BNDg1KSkpCgojIEltcG9ydGluZyBsb29wcwpsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQpsb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKCgoKIyBkVEFHCm9ic2V4cCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KG9ic2V4cCRsb2dfb2JzX0RNU08sIG9ic2V4cCRsb2dfb2JzX2RUQUcsIG4gPSAxMDApCm9ic2V4cCA8LSBvYnNleHAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmcxIDwtIGdncGxvdChvYnNleHAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzKSIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKCiMgVmlzdWFsaXplIFVQIERPV04gbG9vcHMKdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLmRvd24kaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNfRE1TTywgdGVtcCRsb2dfb2JzX2RUQUcsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzIgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzKSwgZG93biIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKCgp0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3Aubm8kaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNfRE1TTywgdGVtcCRsb2dfb2JzX2RUQUcsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzMgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzKSwgbm8iKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgp0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3AudXAkaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNfRE1TTywgdGVtcCRsb2dfb2JzX2RUQUcsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzQgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzKSwgdXAiKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgoKZmlsZU5hbWUgPC0gcGFzdGUwKCJvYnNleHBfZFRBR192c19ETVNPX29icyIpCmhlaWdodCA8LSA0CndpZHRoIDwtIDEyCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwbG90X2dyaWQoZzEsIGc0LCBnMywgZzIsIG5jb2wgPSA0KSkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKQpkZXYub2ZmKCkKCgojIFN0cnVjdHVyYWwKbG9vcC5zdHIgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZS5iZWRwZSIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnN0ciRpZCkKdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic19ETVNPLCB0ZW1wJGxvZ19vYnNfZFRBRywgbiA9IDEwMCkKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpnNSA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzX0RNU08sIHkgPSBsb2dfb2JzX2RUQUcsIGNvbG9yID0gZGVuc2l0eSkpICsgCiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZ3RpdGxlKHBhc3RlMCgibG9nMihvYnMpLCBzdHJ1Y3R1cmFsIGxvb3BzIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKIyBSZWcgKFBFLVBFKQpsb29wLnJlZyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5yZWckaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNfRE1TTywgdGVtcCRsb2dfb2JzX2RUQUcsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzYgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19kVEFHLCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzKSwgcmVndWxhdG9yeSBsb29wcyIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKCmZpbGVOYW1lIDwtIHBhc3RlMCgib2JzZXhwX2RUQUdfdnNfRE1TT19vYnNfc3RyX3ZzX3JlZyIpCmhlaWdodCA8LSA0CndpZHRoIDwtIDYKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnNSwgZzYsIG5jb2wgPSAyKSkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnNSwgZzYsIG5jb2wgPSAyKSkKZGV2Lm9mZigpCmBgYAoKIyMjIyMgQXN5bmMuQUlEIGFsbCByZXMKYGBge3J9CiMgSW1wb3J0aW5nIGxvb3BzCmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQpsb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQoKbWluVmFsdWUgPC0gLTgKbWF4VmFsdWUgPC0gNwoKb2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoImxvb3BTY29yZV9jb25zX29ic2V4cF9Bc3luYy50c3YiKSkpICU+JQogIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9VVCA9IGlmX2Vsc2Uob2JzZXhwX1VUID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9VVCkpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BSUQgPSBpZl9lbHNlKG9ic2V4cF9BSUQgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0FJRCkpKQoKCgojIGRUQUcKb2JzZXhwJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkob2JzZXhwJGxvZ19vYnNleHBfVVQsIG9ic2V4cCRsb2dfb2JzZXhwX0FJRCwgbiA9IDEwMCkKb2JzZXhwIDwtIG9ic2V4cCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzEgPC0gZ2dwbG90KG9ic2V4cCwgYWVzKHggPSBsb2dfb2JzZXhwX1VULCB5ID0gbG9nX29ic2V4cF9BSUQsIGNvbG9yID0gZGVuc2l0eSkpICsgCiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZ3RpdGxlKHBhc3RlMCgibG9nMihvYnMvZXhwKSIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKCiMgVmlzdWFsaXplIFVQIERPV04gbG9vcHMKdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLmRvd24kaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfVVQsIHRlbXAkbG9nX29ic2V4cF9BSUQsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzIgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9VVCwgeSA9IGxvZ19vYnNleHBfQUlELCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzL2V4cCksIGRvd24iKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgoKdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLm5vJGlkKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX1VULCB0ZW1wJGxvZ19vYnNleHBfQUlELCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmczIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfVVQsIHkgPSBsb2dfb2JzZXhwX0FJRCwgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icy9leHApLCBubyIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC51cCRpZCkKdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9VVCwgdGVtcCRsb2dfb2JzZXhwX0FJRCwgbiA9IDEwMCkKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpnNCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX1VULCB5ID0gbG9nX29ic2V4cF9BSUQsIGNvbG9yID0gZGVuc2l0eSkpICsgCiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZ3RpdGxlKHBhc3RlMCgibG9nMihvYnMvZXhwKSwgdXAiKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgoKZmlsZU5hbWUgPC0gcGFzdGUwKCJvYnNleHBfQUlEX3ZzX1VUIikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gMTIKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocGxvdF9ncmlkKGcxLCBnNCwgZzMsIGcyLCBuY29sID0gNCkpCmRldi5vZmYoKQoKCiMgU3RydWN0dXJhbApsb29wLnN0ciA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQp0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3Auc3RyJGlkKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX1VULCB0ZW1wJGxvZ19vYnNleHBfQUlELCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmc1IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfVVQsIHkgPSBsb2dfb2JzZXhwX0FJRCwgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icy9leHApLCBzdHJ1Y3R1cmFsIGxvb3BzIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKIyBSZWcgKFBFLVBFKQpsb29wLnJlZyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5yZWckaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfVVQsIHRlbXAkbG9nX29ic2V4cF9BSUQsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzYgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9VVCwgeSA9IGxvZ19vYnNleHBfQUlELCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzL2V4cCksIHJlZ3VsYXRvcnkgbG9vcHMiKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgpmaWxlTmFtZSA8LSBwYXN0ZTAoIm9ic2V4cF9BSURfdnNfVVRfc3RyX3ZzX3JlZyIpCmhlaWdodCA8LSA0CndpZHRoIDwtIDYKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnNSwgZzYsIG5jb2wgPSAyKSkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnNSwgZzYsIG5jb2wgPSAyKSkKZGV2Lm9mZigpCmBgYAoKIyMjIyMjIFBsb3R0aW5nIE9icwpgYGB7cn0KCm1pblZhbHVlIDwtIC0yMAptYXhWYWx1ZSA8LSAxMAoKb2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoImxvb3BTY29yZV9jb25zX29ic2V4cF9Bc3luYy50c3YiKSkpICU+JQogIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9VVCA9IGlmX2Vsc2Uob2JzZXhwX1VUID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9VVCkpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BSUQgPSBpZl9lbHNlKG9ic2V4cF9BSUQgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0FJRCkpLAogICAgICAgICAgICAgICAgbG9nX29ic19VVCA9IGlmX2Vsc2Uob2JzX1VUID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic19VVCkpLAogICAgICAgICAgICAgICAgbG9nX29ic19BSUQgPSBpZl9lbHNlKG9ic19BSUQgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzX0FJRCkpKQoKIyBJbXBvcnRpbmcgbG9vcHMKbG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZSIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCgoKCiMgZFRBRwpvYnNleHAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShvYnNleHAkbG9nX29ic19VVCwgb2JzZXhwJGxvZ19vYnNfQUlELCBuID0gMTAwKQpvYnNleHAgPC0gb2JzZXhwICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpnMSA8LSBnZ3Bsb3Qob2JzZXhwLCBhZXMoeCA9IGxvZ19vYnNfVVQsIHkgPSBsb2dfb2JzX0FJRCwgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icykiKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgojIFZpc3VhbGl6ZSBVUCBET1dOIGxvb3BzCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5kb3duJGlkKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzX1VULCB0ZW1wJGxvZ19vYnNfQUlELCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmcyIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNfVVQsIHkgPSBsb2dfb2JzX0FJRCwgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icyksIGRvd24iKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgoKdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLm5vJGlkKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzX1VULCB0ZW1wJGxvZ19vYnNfQUlELCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmczIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNfVVQsIHkgPSBsb2dfb2JzX0FJRCwgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icyksIG5vIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnVwJGlkKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzX1VULCB0ZW1wJGxvZ19vYnNfQUlELCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmc0IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNfVVQsIHkgPSBsb2dfb2JzX0FJRCwgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icyksIHVwIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKCmZpbGVOYW1lIDwtIHBhc3RlMCgib2JzX0FJRF92c19VVF9vYnMiKQpoZWlnaHQgPC0gNAp3aWR0aCA8LSAxMgpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocGxvdF9ncmlkKGcxLCBnNCwgZzMsIGcyLCBuY29sID0gNCkpCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwbG90X2dyaWQoZzEsIGc0LCBnMywgZzIsIG5jb2wgPSA0KSkKZGV2Lm9mZigpCgoKIyBTdHJ1Y3R1cmFsCmxvb3Auc3RyIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmUuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5zdHIkaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNfVVQsIHRlbXAkbG9nX29ic19BSUQsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzUgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19VVCwgeSA9IGxvZ19vYnNfQUlELCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzKSwgc3RydWN0dXJhbCBsb29wcyIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKCiMgUmVnIChQRS1QRSkKbG9vcC5yZWcgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQp0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3AucmVnJGlkKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzX1VULCB0ZW1wJGxvZ19vYnNfQUlELCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmc2IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNfVVQsIHkgPSBsb2dfb2JzX0FJRCwgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icyksIHJlZ3VsYXRvcnkgbG9vcHMiKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgpmaWxlTmFtZSA8LSBwYXN0ZTAoIm9ic19BSURfdnNfVVRfb2JzX3N0cl92c19yZWciKQpoZWlnaHQgPC0gNAp3aWR0aCA8LSA2CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwbG90X2dyaWQoZzUsIGc2LCBuY29sID0gMikpCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwbG90X2dyaWQoZzUsIGc2LCBuY29sID0gMikpCmRldi5vZmYoKQpgYGAKCiMjIyMjIEE0ODUgcGVyIHJlcwpgYGB7cn0KIyBJbXBvcnRpbmcgbG9vcHMKbG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX0E0ODV2c0RNU09fVVBfZGlmZjAuMi5iZWRwZSIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9BNDg1dnNETVNPX05PX2RpZmYwLjIuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCgpmb3IocmVzIGluIGMoMjUsIDEwLCA1KSl7CiAgbWluVmFsdWUgPC0gLTQKICBtYXhWYWx1ZSA8LSA1CiAgb2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoImxvb3BTY29yZV9jb25zX29ic2V4cF8iLCByZXMsICJrYi50c3YiKSkpICU+JQogICAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksCiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSkKICAKICAKICAjIEE0ODUKICBvYnNleHAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eShvYnNleHAkbG9nX29ic2V4cF9ETVNPLCBvYnNleHAkbG9nX29ic2V4cF9BNDg1LCBuID0gMTAwKQogIG9ic2V4cCA8LSBvYnNleHAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCiAgZzEgPC0gZ2dwbG90KG9ic2V4cCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX0E0ODUsIGNvbG9yID0gZGVuc2l0eSkpICsgCiAgICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgICBnZ3RpdGxlKHBhc3RlMChyZXMsICJrYiwgbG9nMihvYnMvZXhwKSIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKICAKICAKICAjIFZpc3VhbGl6ZSBVUCBET1dOIGxvb3BzCiAgdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLmRvd24kaWQpCiAgdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfQTQ4NSwgbiA9IDEwMCkKICB0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCiAgZzIgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9BNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArIAogICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSAibm9uZSIpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogICAgZ2d0aXRsZShwYXN0ZTAocmVzLCAia2IsIGxvZzIob2JzL2V4cCksIGRvd24iKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCiAgCiAgCiAgdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLm5vJGlkKQogIHRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfRE1TTywgdGVtcCRsb2dfb2JzZXhwX0E0ODUsIG4gPSAxMDApCiAgdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQogIGczIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKyAKICAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICAgIGdndGl0bGUocGFzdGUwKHJlcywgImtiLCBsb2cyKG9icy9leHApLCBubyIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKICAKICB0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3AudXAkaWQpCiAgdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfQTQ4NSwgbiA9IDEwMCkKICB0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCiAgZzQgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9BNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArIAogICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSAibm9uZSIpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogICAgZ2d0aXRsZShwYXN0ZTAocmVzLCAia2IsIGxvZzIob2JzL2V4cCksIHVwIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAogIAogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgib2JzZXhwX0E0ODVfdnNfRE1TT18iLCByZXMsICJrYiIpCiAgaGVpZ2h0IDwtIDQKICB3aWR0aCA8LSAxMgogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocGxvdF9ncmlkKGcxLCBnNCwgZzMsIGcyLCBuY29sID0gNCkpCiAgZGV2Lm9mZigpCn0KCmBgYAojIyMjIyBBNDg1IGFsbCByZXMKYGBge3J9CiMgSW1wb3J0aW5nIGxvb3BzCmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9BNDg1dnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX0E0ODV2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQpsb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19OT19kaWZmMC4yLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQoKbWluVmFsdWUgPC0gLTQKbWF4VmFsdWUgPC0gNQoKb2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoImxvb3BTY29yZV9jb25zX29ic2V4cC50c3YiKSkpICU+JQogICAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksCiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSkKCgojIEE0ODUKb2JzZXhwJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkob2JzZXhwJGxvZ19vYnNleHBfRE1TTywgb2JzZXhwJGxvZ19vYnNleHBfQTQ4NSwgbiA9IDEwMCkKb2JzZXhwIDwtIG9ic2V4cCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzEgPC0gZ2dwbG90KG9ic2V4cCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX0E0ODUsIGNvbG9yID0gZGVuc2l0eSkpICsgCiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZ3RpdGxlKHBhc3RlMCgibG9nMihvYnMvZXhwKSIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKCiMgVmlzdWFsaXplIFVQIERPV04gbG9vcHMKdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLmRvd24kaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfRE1TTywgdGVtcCRsb2dfb2JzZXhwX0E0ODUsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzIgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9BNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzL2V4cCksIGRvd24iKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgoKdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLm5vJGlkKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9BNDg1LCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmczIDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icy9leHApLCBubyIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC51cCRpZCkKdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic2V4cF9ETVNPLCB0ZW1wJGxvZ19vYnNleHBfQTQ4NSwgbiA9IDEwMCkKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpnNCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzZXhwX0RNU08sIHkgPSBsb2dfb2JzZXhwX0E0ODUsIGNvbG9yID0gZGVuc2l0eSkpICsgCiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZ3RpdGxlKHBhc3RlMCgibG9nMihvYnMvZXhwKSwgdXAiKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgoKZmlsZU5hbWUgPC0gcGFzdGUwKCJvYnNleHBfQTQ4NV92c19ETVNPIikKaGVpZ2h0IDwtIDQKd2lkdGggPC0gMTIKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocGxvdF9ncmlkKGcxLCBnNCwgZzMsIGcyLCBuY29sID0gNCkpCmRldi5vZmYoKQoKCiMgU3RydWN0dXJhbApsb29wLnN0ciA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQp0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3Auc3RyJGlkKQp0ZW1wJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkodGVtcCRsb2dfb2JzZXhwX0RNU08sIHRlbXAkbG9nX29ic2V4cF9BNDg1LCBuID0gMTAwKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmc1IDwtIGdncGxvdCh0ZW1wLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgKyB0aGVtZV9idygpICsgc2NhbGVfY29sb3JfdmlyaWRpcyhndWlkZSA9ICJub25lIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdndGl0bGUocGFzdGUwKCJsb2cyKG9icy9leHApLCBzdHJ1Y3R1cmFsIGxvb3BzIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKIyBSZWcgKFBFLVBFKQpsb29wLnJlZyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5yZWckaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNleHBfRE1TTywgdGVtcCRsb2dfb2JzZXhwX0E0ODUsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzYgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic2V4cF9ETVNPLCB5ID0gbG9nX29ic2V4cF9BNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzL2V4cCksIHJlZ3VsYXRvcnkgbG9vcHMiKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgpmaWxlTmFtZSA8LSBwYXN0ZTAoIm9ic2V4cF9BNDg1X3ZzX0RNU09fc3RyX3ZzX3JlZyIpCmhlaWdodCA8LSA0CndpZHRoIDwtIDYKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnNSwgZzYsIG5jb2wgPSAyKSkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnNSwgZzYsIG5jb2wgPSAyKSkKZGV2Lm9mZigpCmBgYAojIyMjIyMgUGxvdHRpbmcgT2JzCmBgYHtyfQptaW5WYWx1ZSA8LSAtNAptYXhWYWx1ZSA8LSAxMApvYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdiIpKSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSwKICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLAogICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksCiAgICAgICAgICAgICAgICAgIGxvZ19vYnNfRE1TTyA9IGlmX2Vsc2Uob2JzX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzX0RNU08pKSwKICAgICAgICAgICAgICAgICAgbG9nX29ic19kVEFHID0gaWZfZWxzZShvYnNfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNfZFRBRykpLAogICAgICAgICAgICAgICAgICBsb2dfb2JzX0E0ODUgPSBpZl9lbHNlKG9ic19BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic19BNDg1KSkpCgojIEltcG9ydGluZyBsb29wcwpsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfQTQ4NXZzRE1TT19VUF9kaWZmMC4yLmJlZHBlIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGJpblNpemUgPSBWMyAtIFYyLAogICAgICAgICAgICAgICAgaWQgPSBwYXN0ZShWMSwgYmluU2l6ZSwgVjIsIFY1LCBzZXAgPSAiXyIpKQpsb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9BNDg1dnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfYWxsX0E0ODV2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKCgoKIyBkVEFHCm9ic2V4cCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KG9ic2V4cCRsb2dfb2JzX0RNU08sIG9ic2V4cCRsb2dfb2JzX0E0ODUsIG4gPSAxMDApCm9ic2V4cCA8LSBvYnNleHAgJT4lIGRwbHlyOjphcnJhbmdlKGRlbnNpdHkpCmcxIDwtIGdncGxvdChvYnNleHAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19BNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzKSIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKCiMgVmlzdWFsaXplIFVQIERPV04gbG9vcHMKdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLmRvd24kaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNfRE1TTywgdGVtcCRsb2dfb2JzX0E0ODUsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzIgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19BNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzKSwgZG93biIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKCgp0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3Aubm8kaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNfRE1TTywgdGVtcCRsb2dfb2JzX0E0ODUsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzMgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19BNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzKSwgbm8iKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgp0ZW1wIDwtIG9ic2V4cCAlPiUgZHBseXI6OmZpbHRlcihpZCAlaW4lIGxvb3AudXAkaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNfRE1TTywgdGVtcCRsb2dfb2JzX0E0ODUsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzQgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19BNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzKSwgdXAiKSkgKwogICAgY29vcmRfZml4ZWQoeGxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSwgeWxpbSA9IGMobWluVmFsdWUsIG1heFZhbHVlKSkgCgoKZmlsZU5hbWUgPC0gcGFzdGUwKCJvYnNleHBfQTQ4NV92c19ETVNPX29icyIpCmhlaWdodCA8LSA0CndpZHRoIDwtIDEyCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwbG90X2dyaWQoZzEsIGc0LCBnMywgZzIsIG5jb2wgPSA0KSkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnMSwgZzQsIGczLCBnMiwgbmNvbCA9IDQpKQpkZXYub2ZmKCkKCgojIFN0cnVjdHVyYWwKbG9vcC5zdHIgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZS5iZWRwZSIpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShiaW5TaXplID0gVjMgLSBWMiwKICAgICAgICAgICAgICAgIGlkID0gcGFzdGUoVjEsIGJpblNpemUsIFYyLCBWNSwgc2VwID0gIl8iKSkKdGVtcCA8LSBvYnNleHAgJT4lIGRwbHlyOjpmaWx0ZXIoaWQgJWluJSBsb29wLnN0ciRpZCkKdGVtcCRkZW5zaXR5IDwtIGdldF9kZW5zaXR5KHRlbXAkbG9nX29ic19ETVNPLCB0ZW1wJGxvZ19vYnNfQTQ4NSwgbiA9IDEwMCkKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6YXJyYW5nZShkZW5zaXR5KQpnNSA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBsb2dfb2JzX0RNU08sIHkgPSBsb2dfb2JzX0E0ODUsIGNvbG9yID0gZGVuc2l0eSkpICsgCiAgZ2VvbV9wb2ludCgpICsgdGhlbWVfYncoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZ3RpdGxlKHBhc3RlMCgibG9nMihvYnMpLCBzdHJ1Y3R1cmFsIGxvb3BzIikpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpIAoKIyBSZWcgKFBFLVBFKQpsb29wLnJlZyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGUuYmVkcGUiKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoYmluU2l6ZSA9IFYzIC0gVjIsCiAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBiaW5TaXplLCBWMiwgVjUsIHNlcCA9ICJfIikpCnRlbXAgPC0gb2JzZXhwICU+JSBkcGx5cjo6ZmlsdGVyKGlkICVpbiUgbG9vcC5yZWckaWQpCnRlbXAkZGVuc2l0eSA8LSBnZXRfZGVuc2l0eSh0ZW1wJGxvZ19vYnNfRE1TTywgdGVtcCRsb2dfb2JzX0E0ODUsIG4gPSAxMDApCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKZzYgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gbG9nX29ic19ETVNPLCB5ID0gbG9nX29ic19BNDg1LCBjb2xvciA9IGRlbnNpdHkpKSArIAogIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2d0aXRsZShwYXN0ZTAoImxvZzIob2JzKSwgcmVndWxhdG9yeSBsb29wcyIpKSArCiAgICBjb29yZF9maXhlZCh4bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpLCB5bGltID0gYyhtaW5WYWx1ZSwgbWF4VmFsdWUpKSAKCmZpbGVOYW1lIDwtIHBhc3RlMCgib2JzZXhwX0E0ODVfdnNfRE1TT19vYnNfc3RyX3ZzX3JlZyIpCmhlaWdodCA8LSA0CndpZHRoIDwtIDYKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnNSwgZzYsIG5jb2wgPSAyKSkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChnNSwgZzYsIG5jb2wgPSAyKSkKZGV2Lm9mZigpCmBgYAoKIyMjIFsyLjI2XSBSZXBlYXRpbmcgZmV3IGFuYWx5c2lzIHdpdGggb2JzL2V4cAojIyMjIEZ1bmN0aW9uCmBgYHtyfQpjcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnRfb2UgPC0gZnVuY3Rpb24oZGF0YSwgZmlnRGlyLCBuYW1lLCBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IEZBTFNFKXsKICBhdmdfc2NvcmVzX2xvbmcgPC0gZGF0YSAlPiUKICAgIGdyb3VwX2J5KGRpc3RhbmNlLCBBbm5vMikgJT4lCiAgICBzdW1tYXJpc2UoYXZnX3Njb3JlID0gbWVhbihzY29yZSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgICB1bmdyb3VwKCkgCiAgYXZnX3Njb3Jlc19sb25nJEFubm8yIDwtIGZhY3Rvcihhdmdfc2NvcmVzX2xvbmckQW5ubzIsIGxldmVsID0gbG9vcExpc3QpCiAgcDQgPC0gZ2dwbG90KGF2Z19zY29yZXNfbG9uZywgYWVzKHggPSBkaXN0YW5jZSwgeSA9IGF2Z19zY29yZSwgY29sb3IgPSBBbm5vMiwgZmlsbCA9IEFubm8yKSkgKyAKICAgIGdlb21fc21vb3RoKHNob3cubGVnZW5kID0gVFJVRSwgc2UgPSBzZSkgICsKICAgICN5bGltKDAsIDAuNSkgKwogICAgdGhlbWVfY2xhc3NpYygpICsgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yTGlzdCkgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JMaXN0KSArCiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG5hbWUpLAogICAgICAgICB4ID0gIkRpc3RhbmNlIiwKICAgICAgICAgeSA9ICJBdmVyYWdlIFNjb3JlIikgKwogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpCiAgCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJkaXN0X3ZzX3Njb3JlX2xpbmVQbG90XyIsIG5hbWUpCiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCAKICAgICAgcmVzID0gNjAwLCB1bml0cyA9ICJpbiIsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMykKICBwcmludChwNCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAKICAgICAgICAgIHdpZHRoID0gNCwgaGVpZ2h0ID0gMykKICBwcmludChwNCkKICBkZXYub2ZmKCkKfSAKCmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnRfb2UgPC0gZnVuY3Rpb24oZGF0YSwgZmlnRGlyLCBuYW1lLCBsb29wTGlzdCwgY29sb3JMaXN0LCBzZSA9IEZBTFNFKXsKICBhdmdfc2NvcmVzX2xvbmcgPC0gZGF0YSAlPiUKICAgIGdyb3VwX2J5KGRpc3RhbmNlLCBBbm5vMikgJT4lCiAgICBzdW1tYXJpc2UoYXZnX3Njb3JlID0gbWVhbihzY29yZSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgICB1bmdyb3VwKCkgCiAgYXZnX3Njb3Jlc19sb25nJEFubm8yIDwtIGZhY3Rvcihhdmdfc2NvcmVzX2xvbmckQW5ubzIsIGxldmVsID0gbG9vcExpc3QpCiAgcDQgPC0gZ2dwbG90KGF2Z19zY29yZXNfbG9uZywgYWVzKHggPSBkaXN0YW5jZSwgeSA9IGF2Z19zY29yZSwgY29sb3IgPSBBbm5vMiwgZmlsbCA9IEFubm8yKSkgKyAKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICAgIGdlb21fc21vb3RoKHNob3cubGVnZW5kID0gVFJVRSwgc2UgPSBzZSkgICsKICAgIHRoZW1lX2NsYXNzaWMoKSArICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvckxpc3QpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yTGlzdCkgKwogICAgbGFicyh0aXRsZSA9IHBhc3RlMChuYW1lKSwKICAgICAgICAgeCA9ICJEaXN0YW5jZSIsCiAgICAgICAgIHkgPSAiQXZlcmFnZSBEaWZmIFNjb3JlIikgKwogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpIAogIAogIGZpbGVOYW1lIDwtIHBhc3RlMCgiZGlzdF92c19zY29yZV9kaWZmbGluZVBsb3RfIiwgbmFtZSkKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIAogICAgICByZXMgPSA2MDAsIHVuaXRzID0gImluIiwgd2lkdGggPSA0LCBoZWlnaHQgPSAzKQogIHByaW50KHA0KQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksIAogICAgICAgICAgd2lkdGggPSA0LCBoZWlnaHQgPSAzKQogIHByaW50KHA0KQogIGRldi5vZmYoKQp9IAoKY3JlYXRlX2Rpc3RfYmFycGxvdF9vZSA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIG5vdGUsIGxvb3BMaXN0LCBkaWZmQ3V0b2ZmLCBkaXN0YW5jZUZpbHRlciA9IDIqZTYpewogICAgZGF0YSA8LSBkYXRhICU+JSAKICAgIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsCiAgICAgICAgICAgICAgICAgIHVwZG93bl9kVEFHX0RNU08gPSBpZmVsc2UobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA+IGRpZmZDdXRvZmYsICJVUCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID4gLWRpZmZDdXRvZmYsICJOTyIsICJET1dOIikpLAogICAgICAgICAgICAgICAgICB1cGRvd25fQTQ4NV9ETVNPID0gaWZlbHNlKGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPiBkaWZmQ3V0b2ZmLCAiVVAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA+IC1kaWZmQ3V0b2ZmLCAiTk8iLCAiRE9XTiIpKSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgbG9vcExpc3QsCiAgICAgICAgICAgICAgICAgIGRpc3RhbmNlIDwgZGlzdGFuY2VGaWx0ZXIpCiAgZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoIlVQIiwgIk5PIiwgIkRPV04iKSkKICBkYXRhJHVwZG93bl9BNDg1X0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX0E0ODVfRE1TTywgbGV2ZWxzID0gYygiVVAiLCAiTk8iLCAiRE9XTiIpKQogIAogIAogIHRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChBbm5vMiwgZGlzdGFuY2UsIHVwZG93bl9kVEFHX0RNU08sIHVwZG93bl9BNDg1X0RNU08pICU+JQogICAgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGxvb3BMaXN0LAogICAgICAgICAgICAgICAgICB1cGRvd25fZFRBR19ETVNPICVpbiUgYygiVVAiLCAiTk8iLCAiRE9XTiIpKQogIHAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gdXBkb3duX2RUQUdfRE1TTywgeSA9IGRpc3RhbmNlKSkgKwogICAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSB1cGRvd25fZFRBR19ETVNPKSkgKyAKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gdXBkb3duX2RUQUdfRE1TTyksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUobm90ZSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKQogIGZpbGVOYW1lIDwtIHBhc3RlMCgic2l6ZV9iYXJwbG90XyIsIG5hbWUsICJfZFRBR192c19ETVNPXyIsIG5vdGUsICJfIiwgZGlmZkN1dG9mZikKICBoZWlnaHQgPC0gMwogIHdpZHRoIDwtIDQKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQogIHN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICAKICAKICB0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoQW5ubzIsIGRpc3RhbmNlLCB1cGRvd25fZFRBR19ETVNPLCB1cGRvd25fQTQ4NV9ETVNPKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBsb29wTGlzdCwKICAgICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyAlaW4lIGMoIlVQIiwgIk5PIiwgICJET1dOIikpCiAgcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSB1cGRvd25fQTQ4NV9ETVNPLCB5ID0gZGlzdGFuY2UpKSArCiAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IHVwZG93bl9BNDg1X0RNU08pKSArIAogICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsKICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSB1cGRvd25fQTQ4NV9ETVNPKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgKwogICAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShub3RlKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfa2JfbWIpCiAgZmlsZU5hbWUgPC0gcGFzdGUwKCJzaXplX2JhcnBsb3RfIiwgbmFtZSwgIl9BNDg1X3ZzX0RNU09fIiwgbm90ZSwgIl8iLCBkaWZmQ3V0b2ZmKQogIGhlaWdodCA8LSAzCiAgd2lkdGggPC0gNAogIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCiAgc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKICBwcmludChwKQogIGRldi5vZmYoKQp9CgpjcmVhdGVfbG9vcF9zY2F0dGVycGxvdF9vZSA8LSBmdW5jdGlvbihkYXRhLCBmaWdEaXIsIG5hbWUsIEFubm8yTGlzdCwgZGlmZkN1dG9mZil7CiAgZGF0YSA8LSBkYXRhICU+JQogICAgZHBseXI6Om11dGF0ZSh1cGRvd25fZFRBR19ETVNPID0gaWZlbHNlKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPiBkaWZmQ3V0b2ZmLCAiVVAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA+IC1kaWZmQ3V0b2ZmLCAiTk8iLCAiRE9XTiIpKSwKICAgICAgICAgICAgICAgICAgdXBkb3duX0E0ODVfRE1TTyA9IGlmZWxzZShsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID4gZGlmZkN1dG9mZiwgIlVQIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPiAtZGlmZkN1dG9mZiwgIk5PIiwgIkRPV04iKSkpICU+JQogICAgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIEFubm8yTGlzdCkKICBkYXRhJHVwZG93bl9kVEFHX0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX2RUQUdfRE1TTywgbGV2ZWxzID0gYygiVVAiLCAiTk8iLCAiRE9XTiIpKQogIGRhdGEkdXBkb3duX0E0ODVfRE1TTyA8LSBmYWN0b3IoZGF0YSR1cGRvd25fQTQ4NV9ETVNPLCBsZXZlbHMgPSBjKCJVUCIsICJOTyIsICJET1dOIikpCiAgCiAgbnVtLnVwIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpWyJVUCJdCiAgbnVtLm5vIDwtIChzdW1tYXJ5KGRhdGEkdXBkb3duX2RUQUdfRE1TTykpWyJOTyJdCiAgbnVtLmRvd24gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fZFRBR19ETVNPKSlbIkRPV04iXQogIG51bS5hbGwgPC0gbnVtLnVwICsgbnVtLm5vICsgbnVtLmRvd24KICBwZXJjLnVwIDwtIHJvdW5kKG51bS51cCAvIG51bS5hbGwgKiAxMDAsIDIpCiAgcGVyYy5ubyA8LSByb3VuZChudW0ubm8gLyBudW0uYWxsICogMTAwLCAyKQogIHBlcmMuZG93biA8LSByb3VuZChudW0uZG93biAvIG51bS5hbGwgKiAxMDAsIDIpCiAgCiAgIyMjIFNjYXR0ZXJwbG90CiAgICBtaW5WYWx1ZSA8LSAtNAogIG1heFZhbHVlIDwtIDUKICBkYXRhJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoZGF0YSRsb2dfb2JzZXhwX0RNU08sIGRhdGEkbG9nX29ic2V4cF9kVEFHLCBuID0gMTAwKQogIGRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKICBjb3JyZWxhdGlvbiA8LSBjb3IoZGF0YSRsb2dfb2JzZXhwX0RNU08sIGRhdGEkbG9nX29ic2V4cF9kVEFHKQogIHAxIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfZFRBRywgY29sb3IgPSBkZW5zaXR5KSkgKwogICAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBtaW5WYWx1ZSwgeSA9IG1heFZhbHVlLCBsYWJlbCA9IHBhc3RlMCgiVVA6ICIsIG51bS51cCwgIiAoIiwgcGVyYy51cCwgIiUpIiksIAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBtaW5WYWx1ZSwgeSA9IG1heFZhbHVlLTEsIGxhYmVsID0gcGFzdGUwKCJOTzogIiwgbnVtLm5vLCAiICgiLCBwZXJjLm5vLCAiJSkiKSwgCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsKICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IG1pblZhbHVlLCB5ID0gbWF4VmFsdWUtMiwgbGFiZWwgPSBwYXN0ZTAoIkRPV046ICIsIG51bS5kb3duLCAiICgiLCBwZXJjLmRvd24sICIlKSIpLCAKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykgKwogICAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShuYW1lKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBtaW5WYWx1ZSwgeSA9IG1heFZhbHVlLCBsYWJlbCA9IHBhc3RlKCJyID0iLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKQoKICAKICAKICBudW0udXAgPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fQTQ4NV9ETVNPKSlbIlVQIl0KICBudW0ubm8gPC0gKHN1bW1hcnkoZGF0YSR1cGRvd25fQTQ4NV9ETVNPKSlbIk5PIl0KICBudW0uZG93biA8LSAoc3VtbWFyeShkYXRhJHVwZG93bl9BNDg1X0RNU08pKVsiRE9XTiJdCiAgbnVtLmFsbCA8LSBudW0udXAgKyBudW0ubm8gKyBudW0uZG93bgogIHBlcmMudXAgPC0gcm91bmQobnVtLnVwIC8gbnVtLmFsbCAqIDEwMCwgMikKICBwZXJjLm5vIDwtIHJvdW5kKG51bS5ubyAvIG51bS5hbGwgKiAxMDAsIDIpCiAgcGVyYy5kb3duIDwtIHJvdW5kKG51bS5kb3duIC8gbnVtLmFsbCAqIDEwMCwgMikKICAKICBkYXRhJGRlbnNpdHkgPC0gZ2V0X2RlbnNpdHkoZGF0YSRsb2dfb2JzZXhwX0RNU08sIGRhdGEkbG9nX29ic2V4cF9BNDg1LCBuID0gMTAwKQogIGRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmFycmFuZ2UoZGVuc2l0eSkKICBjb3JyZWxhdGlvbiA8LSBjb3IoZGF0YSRsb2dfb2JzZXhwX0RNU08sIGRhdGEkbG9nX29ic2V4cF9BNDg1KQogIHAyIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGxvZ19vYnNleHBfRE1TTywgeSA9IGxvZ19vYnNleHBfQTQ4NSwgY29sb3IgPSBkZW5zaXR5KSkgKwogICAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSksIHlsaW0gPSBjKG1pblZhbHVlLCBtYXhWYWx1ZSkpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLWRpZmZDdXRvZmYsIGNvbCA9ICJncmV5IiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSBkaWZmQ3V0b2ZmLCBjb2wgPSAiZ3JleSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC41LCBjb2xvciA9ICJncmV5IikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgYWxwaGEgPSAwLjUsIGNvbG9yID0gImdyZXkiKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBtaW5WYWx1ZSwgeSA9IG1heFZhbHVlLCBsYWJlbCA9IHBhc3RlMCgiVVA6ICIsIG51bS51cCwgIiAoIiwgcGVyYy51cCwgIiUpIiksIAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIHNpemUgPSAzKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBtaW5WYWx1ZSwgeSA9IG1heFZhbHVlLTEsIGxhYmVsID0gcGFzdGUwKCJOTzogIiwgbnVtLm5vLCAiICgiLCBwZXJjLm5vLCAiJSkiKSwgCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMpICsKICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IG1pblZhbHVlLCB5ID0gbWF4VmFsdWUtMiwgbGFiZWwgPSBwYXN0ZTAoIkRPV046ICIsIG51bS5kb3duLCAiICgiLCBwZXJjLmRvd24sICIlKSIpLCAKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykgKwogICAgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZShuYW1lKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBtaW5WYWx1ZSwgeSA9IG1heFZhbHVlLCBsYWJlbCA9IHBhc3RlKCJyID0iLCByb3VuZChjb3JyZWxhdGlvbiwgMikpLCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKQoKICAKICAKICBmaWxlTmFtZSA8LSBwYXN0ZTAoInNjYXR0ZXJwbG90XyIsIG5hbWUsICJfIiwgZGlmZkN1dG9mZikKICBwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDUqMS41LCBoZWlnaHQgPSAyLjUqMS41KQogIHByaW50KGNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIGFsaWduID0gImgiKSkKICBkZXYub2ZmKCkKICAKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAKICAgICAgICAgIHdpZHRoID0gNSoxLjUsIGhlaWdodCA9IDIuNSoxLjUpCiAgcHJpbnQoY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgYWxpZ24gPSAiaCIpKQogIGRldi5vZmYoKQp9CgptYWtlX2RpZmZfYmVkcGVfb2UgPC0gZnVuY3Rpb24oZGF0YSwgbmFtZSwgQW5ubzJMaXN0LCBvdXREaXIsIGRpZmZDdXRvZmYpewogIGRhdGEgPC0gZGF0YSAlPiUKICAgIGRwbHlyOjptdXRhdGUodXBkb3duX2RUQUdfRE1TTyA9IGlmZWxzZShsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID4gZGlmZkN1dG9mZiwgIlVQIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPiAtZGlmZkN1dG9mZiwgIk5PIiwgIkRPV04iKSksCiAgICAgICAgICAgICAgICAgIHVwZG93bl9BNDg1X0RNU08gPSBpZmVsc2UobG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA+IGRpZmZDdXRvZmYsICJVUCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID4gLWRpZmZDdXRvZmYsICJOTyIsICJET1dOIikpKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBBbm5vMkxpc3QpCiAgZGF0YSR1cGRvd25fZFRBR19ETVNPIDwtIGZhY3RvcihkYXRhJHVwZG93bl9kVEFHX0RNU08sIGxldmVscyA9IGMoIlVQIiwgIk5PIiwgIkRPV04iKSkKICBkYXRhJHVwZG93bl9BNDg1X0RNU08gPC0gZmFjdG9yKGRhdGEkdXBkb3duX0E0ODVfRE1TTywgbGV2ZWxzID0gYygiVVAiLCAiTk8iLCAiRE9XTiIpKQogIAogIG91dC50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX2RUQUdfRE1TTyA9PSAiVVAiKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYpKQogIGZ3cml0ZShvdXQudGVtcCwgaGVyZShvdXREaXIsIHBhc3RlMChuYW1lLCAiX2RUQUd2c0RNU09fVVBfZGlmZiIsIGRpZmZDdXRvZmYsICIuYmVkcGUiKSksIAogICAgICAgICBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSkKICBvdXQudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9kVEFHX0RNU08gPT0gIk5PIikgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2KSkKICBmd3JpdGUob3V0LnRlbXAsIGhlcmUob3V0RGlyLCBwYXN0ZTAobmFtZSwgIl9kVEFHdnNETVNPX05PX2RpZmYiLCBkaWZmQ3V0b2ZmLCAiLmJlZHBlIikpLCAKICAgICAgICAgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gRkFMU0UpCiAgb3V0LnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fZFRBR19ETVNPID09ICJET1dOIikgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2KSkKICBmd3JpdGUob3V0LnRlbXAsIGhlcmUob3V0RGlyLCBwYXN0ZTAobmFtZSwgIl9kVEFHdnNETVNPX0RPV05fZGlmZiIsIGRpZmZDdXRvZmYsICIuYmVkcGUiKSksIAogICAgICAgICBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSkKICAKICBvdXQudGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHVwZG93bl9BNDg1X0RNU08gPT0gIlVQIikgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2KSkKICBmd3JpdGUob3V0LnRlbXAsIGhlcmUob3V0RGlyLCBwYXN0ZTAobmFtZSwgIl9BNDg1dnNETVNPX1VQX2RpZmYiLCBkaWZmQ3V0b2ZmLCAiLmJlZHBlIikpLCAKICAgICAgICAgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gRkFMU0UpCiAgb3V0LnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih1cGRvd25fQTQ4NV9ETVNPID09ICJOTyIpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpCiAgZndyaXRlKG91dC50ZW1wLCBoZXJlKG91dERpciwgcGFzdGUwKG5hbWUsICJfQTQ4NXZzRE1TT19OT19kaWZmIiwgZGlmZkN1dG9mZiwgIi5iZWRwZSIpKSwgCiAgICAgICAgIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFKQogIG91dC50ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIodXBkb3duX0E0ODVfRE1TTyA9PSAiRE9XTiIpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNikpCiAgZndyaXRlKG91dC50ZW1wLCBoZXJlKG91dERpciwgcGFzdGUwKG5hbWUsICJfQTQ4NXZzRE1TT19ET1dOX2RpZmYiLCBkaWZmQ3V0b2ZmLCAiLmJlZHBlIikpLCAKICAgICAgICAgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gRkFMU0UpCn0KYGBgCgojIyMjIERpc3RhbmNlIHZzIHNjb3JlIHBsb3QKIyMjIyMgZFRBRwojIyMjIyMgT0UKYGBge3J9CiMgSW1wb3J0IGFubm90YXRpb24KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICIudHN2IikpKQoKIyBJbXBvcnQgb2JzL2V4cCBzY29yZXMgYW5kIG1lcmdlIHRvIHRoZSBkYXRhc2V0Cm1pblZhbHVlIDwtIC00Cm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfY29uc19vYnNleHAudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLAogICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksCiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSkKCiMgTWVyZ2UgZGF0YXNldApkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoImlkIikpCgojIFBsb3QKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgbG9nX29ic2V4cF9ETVNPLCBBbm5vMikKY29sbmFtZXModGVtcCkgPC0gYygiZGlzdGFuY2UiLCAic2NvcmUiLCAiQW5ubzIiKQpjcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnRfb2UodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9ETVNPX2xvZ09FIiksIHVuaXF1ZShkYXRhJEFubm8yKSwgY29sb3JMaXN0TG9vcCkKCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSkgJT4lIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGxvZ19vYnNleHBfZFRBRywgQW5ubzIpCmNvbG5hbWVzKHRlbXApIDwtIGMoImRpc3RhbmNlIiwgInNjb3JlIiwgIkFubm8yIikKY3JlYXRlX2Rpc3RfdnNfYXZnU2NvcmVfcGVyVHJlYXRtZW50X29lKHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfZFRBR19sb2dPRSIpLCB1bmlxdWUoZGF0YSRBbm5vMiksIGNvbG9yTGlzdExvb3ApCgoKIyBDcmVhdGluZyBmaWd1cmVzIHBlciBlYWNoIGNvbmRpdGlvbiwgZGlmZmVyZW50aWFsCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZShkaXN0YW5jZSA9IHN0YXJ0MiAtIHN0YXJ0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08pICU+JSAKICBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBBbm5vMikKY29sbmFtZXModGVtcCkgPC0gYygiZGlzdGFuY2UiLCAic2NvcmUiLCAiQW5ubzIiKQpjcmVhdGVfZGlzdF92c19hdmdEaWZmU2NvcmVfcGVyVHJlYXRtZW50X29lKHRlbXAsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfZFRBR19sb2dPRSIpLCB1bmlxdWUoZGF0YSRBbm5vMiksIGNvbG9yTGlzdExvb3ApCmBgYAoKIyMjIyMjIE9FLCBncm91cGVkCmBgYHtyfQojIEltcG9ydCBhbm5vdGF0aW9uCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiLnRzdiIpKSkKCiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldAptaW5WYWx1ZSA8LSAtNApvYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdiIpKSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSwKICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLAogICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSkpCgojIE1lcmdlIGRhdGFzZXQKZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKCJpZCIpKQoKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTykgJT4lIAogIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08sIEFubm8yKQpjb2xuYW1lcyh0ZW1wKSA8LSBjKCJkaXN0YW5jZSIsICJzY29yZSIsICJBbm5vMiIpCgoKCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShBbm5vMyA9IGNhc2Vfd2hlbihBbm5vMiAlaW4lIGMoIlMtWCIsICJTLVMiKSB+ICJTdHJ1Y3R1cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm8yICVpbiUgYygiUC1QIiwgIlAtRSIsICJFLUUiKSB+ICJQdXJlX1JlZ3VsYXRvcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ubzIgJWluJSBjKCJQLVMiLCAiUC1YIiwgIkUtUyIsICJFLVgiKSB+ICJSZWxheGVkX1JlZ3VsYXRvcnkiKSkgJT4lCiAgZHBseXI6OmZpbHRlcighaXMubmEoQW5ubzMpKQoKbG9vcExpc3QgPC0gcmV2KGMoIlN0cnVjdHVyYWwiLCAiUmVsYXhlZF9SZWd1bGF0b3J5IiwgIlB1cmVfUmVndWxhdG9yeSIpKQpjb2xvckxpc3QgPC0gcmV2KGMocGFsZXR0ZV8zW1siZ3JleTIiXV0sIHN0cm9uZ19ncmVlbiwgZGFya2VuKHN0cm9uZ19ncmVlbiwgYW1vdW50ID0gMC41KSkpCmF2Z19zY29yZXNfbG9uZyA8LSB0ZW1wICU+JQogIGdyb3VwX2J5KGRpc3RhbmNlLCBBbm5vMykgJT4lCiAgc3VtbWFyaXNlKGF2Z19zY29yZSA9IG1lYW4oc2NvcmUsIG5hLnJtID0gVFJVRSkpICU+JQogIHVuZ3JvdXAoKSAKYXZnX3Njb3Jlc19sb25nJEFubm8zIDwtIGZhY3Rvcihhdmdfc2NvcmVzX2xvbmckQW5ubzMsIGxldmVsID0gbG9vcExpc3QpCgpwNCA8LSBnZ3Bsb3QoYXZnX3Njb3Jlc19sb25nLCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3Njb3JlLCBjb2xvciA9IEFubm8zKSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgICAgICAgICBsaW5lZW5kID0gInNxdWFyZSIpICsKICBnZW9tX3Ntb290aChzaG93LmxlZ2VuZCA9IFRSVUUsIHNlID0gVFJVRSwKICAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgICAgICAgICBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgYWVzKGZpbGwgPSBBbm5vMykpICArCiAgdGhlbWVfY2xhc3NpYygpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2tiX21iKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yTGlzdCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yTGlzdCkgKwogIGxhYnMoeCA9ICJMb29wIHNpemUiLAogICAgICAgeSA9ICLOlCBsb2cyKG9icy9leHApIiwKICAgICAgIGNvbG9yID0gIkxvb3AgdHlwZXMiLCBmaWxsID0gIkxvb3AgdHlwZXMiKSArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKAogICAgICBrZXl3aWR0aCA9IDAuNSwgICMgQWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgbGVnZW5kIGNvbG9yIHNxdWFyZXMKICAgICAga2V5aGVpZ2h0ID0gMC41ICAjIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWdlbmQgY29sb3Igc3F1YXJlcwogICAgKQogICkKCgoKCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImRpc3RfdnNfc2NvcmVfZGlmZmxpbmVQbG90X2dyb3VwZWQiLCBuYW1lKQoKd2lkdGggPC0gcGFuZWxTaXplKDIuNSkqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjI1KSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIAogICAgcmVzID0gNjAwLCB1bml0cyA9ICJpbiIsIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodCkKcHJpbnQocDQpCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAKICAgICAgICB3aWR0aCA9IHdpZHRoLCBoZWlnaHQgPSBoZWlnaHQpCnByaW50KHA0KQpkZXYub2ZmKCkKCgoKYGBgCgojIyMjIyMgT2JzZXJ2ZWQKYGBge3J9CiMgSW1wb3J0IGFubm90YXRpb24KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKZGF0YSA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICIudHN2IikpKQoKIyBJbXBvcnQgb2JzL2V4cCBzY29yZXMgYW5kIG1lcmdlIHRvIHRoZSBkYXRhc2V0Cm1pblZhbHVlIDwtIC00Cm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfY29uc19vYnNleHAudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUobG9nX29ic19ETVNPID0gaWZfZWxzZShvYnNfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNfRE1TTykpLAogICAgICAgICAgICAgICAgICBsb2dfb2JzX2RUQUcgPSBpZl9lbHNlKG9ic19kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic19kVEFHKSksCiAgICAgICAgICAgICAgICAgIGxvZ19vYnNfQTQ4NSA9IGlmX2Vsc2Uob2JzX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzX0E0ODUpKSkKCiMgTWVyZ2UgZGF0YXNldApkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoImlkIikpCgojIFBsb3QKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKSAlPiUgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgbG9nX29ic19ETVNPLCBBbm5vMikKY29sbmFtZXModGVtcCkgPC0gYygiZGlzdGFuY2UiLCAic2NvcmUiLCAiQW5ubzIiKQpjcmVhdGVfZGlzdF92c19hdmdTY29yZV9wZXJUcmVhdG1lbnRfb2UodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9ETVNPX2xvZ09icyIpLCB1bmlxdWUoZGF0YSRBbm5vMiksIGNvbG9yTGlzdExvb3ApCgp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzX2RUQUcsIEFubm8yKQpjb2xuYW1lcyh0ZW1wKSA8LSBjKCJkaXN0YW5jZSIsICJzY29yZSIsICJBbm5vMiIpCmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudF9vZSh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX2RUQUdfbG9nT2JzIiksIHVuaXF1ZShkYXRhJEFubm8yKSwgY29sb3JMaXN0TG9vcCkKCgojIENyZWF0aW5nIGZpZ3VyZXMgcGVyIGVhY2ggY29uZGl0aW9uLCBkaWZmZXJlbnRpYWwKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX29ic19kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNfZFRBRyAtIGxvZ19vYnNfRE1TTykgJT4lIAogIGRwbHlyOjpzZWxlY3QoZGlzdGFuY2UsIGxvZ19vYnNfZGlmZl9kVEFHX0RNU08sIEFubm8yKQpjb2xuYW1lcyh0ZW1wKSA8LSBjKCJkaXN0YW5jZSIsICJzY29yZSIsICJBbm5vMiIpCmNyZWF0ZV9kaXN0X3ZzX2F2Z0RpZmZTY29yZV9wZXJUcmVhdG1lbnRfb2UodGVtcCwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9kVEFHX2xvZ09icyIpLCB1bmlxdWUoZGF0YSRBbm5vMiksIGNvbG9yTGlzdExvb3ApCmBgYAoKIyMjIyMgQTQ4NQpgYGB7cn0KIyBJbXBvcnQgYW5ub3RhdGlvbgpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgpkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIi50c3YiKSkpCgojIEltcG9ydCBvYnMvZXhwIHNjb3JlcyBhbmQgbWVyZ2UgdG8gdGhlIGRhdGFzZXQKbWluVmFsdWUgPC0gLTQKb2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoImxvb3BTY29yZV9jb25zX29ic2V4cC50c3YiKSkpICU+JQogICAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksCiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZFRBRyA9IGlmX2Vsc2Uob2JzZXhwX2RUQUcgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX2RUQUcpKSwKICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpKQoKIyBNZXJnZSBkYXRhc2V0CmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihvYnNleHAsIGJ5ID0gYygiaWQiKSkKCiMgUGxvdAp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpICU+JSBkcGx5cjo6c2VsZWN0KGRpc3RhbmNlLCBsb2dfb2JzZXhwX0E0ODUsIEFubm8yKQpjb2xuYW1lcyh0ZW1wKSA8LSBjKCJkaXN0YW5jZSIsICJzY29yZSIsICJBbm5vMiIpCmNyZWF0ZV9kaXN0X3ZzX2F2Z1Njb3JlX3BlclRyZWF0bWVudF9vZSh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX0E0ODVfbG9nT0UiKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjb2xvckxpc3RMb29wKQoKCiMgQ3JlYXRpbmcgZmlndXJlcyBwZXIgZWFjaCBjb25kaXRpb24sIGRpZmZlcmVudGlhbAp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPKSAlPiUgCiAgZHBseXI6OnNlbGVjdChkaXN0YW5jZSwgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTywgQW5ubzIpCmNvbG5hbWVzKHRlbXApIDwtIGMoImRpc3RhbmNlIiwgInNjb3JlIiwgIkFubm8yIikKY3JlYXRlX2Rpc3RfdnNfYXZnRGlmZlNjb3JlX3BlclRyZWF0bWVudF9vZSh0ZW1wLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX0E0ODVfbG9nT0UiKSwgdW5pcXVlKGRhdGEkQW5ubzIpLCBjb2xvckxpc3RMb29wKQpgYGAKCiMjIyMgR2V0IHNpemUgZGlzdHJpYnV0aW9uIG9mIGRpZmZlcmVudGlhbCBsb29wcwpgYGB7cn0KIyBJbXBvcnQgYW5ub3RhdGlvbgpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgpkYXRhIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIi50c3YiKSkpCgojIEltcG9ydCBvYnMvZXhwIHNjb3JlcyBhbmQgbWVyZ2UgdG8gdGhlIGRhdGFzZXQKbWluVmFsdWUgPSAtNApvYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdiIpKSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfRE1TTyA9IGlmX2Vsc2Uob2JzZXhwX0RNU08gPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0RNU08pKSwKICAgICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLAogICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSkpCgojIE1lcmdlIGRhdGFzZXQKZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKCJpZCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08gPSBsb2dfb2JzZXhwX2RUQUcgLSBsb2dfb2JzZXhwX0RNU08sCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPID0gbG9nX29ic2V4cF9BNDg1IC0gbG9nX29ic2V4cF9ETVNPKQoKZGlmZkN1dG9mZiA8LSAwLjUKY3JlYXRlX2xvb3Bfc2NhdHRlcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9sb2dPRV8iLCAiYWxsIiksIHVuaXF1ZShkYXRhJEFubm8yKSwgZGlmZkN1dG9mZikKY3JlYXRlX2xvb3Bfc2NhdHRlcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9sb2dPRV8iLCAicmVnIiksIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksIGRpZmZDdXRvZmYpCmNyZWF0ZV9sb29wX3NjYXR0ZXJwbG90X29lKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfbG9nT0VfIiwgInN0ciIpLCBjKCJTLVMiLCAiUy1YIiksIGRpZmZDdXRvZmYpCgoKCmNyZWF0ZV9kaXN0X2JhcnBsb3Rfb2UoZGF0YSwgZmlnRGlyLCBwYXN0ZTAobmFtZSwgIl9sb2dPRSIpLCAiYWxsIiwgIHVuaXF1ZShkYXRhJEFubm8yKSwgZGlmZkN1dG9mZikKY3JlYXRlX2Rpc3RfYmFycGxvdF9vZShkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX2xvZ09FIiksICJyZWciLCAgYygiUC1QIiwgIlAtRSIsICJFLUUiKSwgZGlmZkN1dG9mZikKY3JlYXRlX2Rpc3RfYmFycGxvdF9vZShkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX2xvZ09FIiksICJyZWdfMW1iIiwgIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksIGRpZmZDdXRvZmYsIDFlNikKY3JlYXRlX2Rpc3RfYmFycGxvdF9vZShkYXRhLCBmaWdEaXIsIHBhc3RlMChuYW1lLCAiX2xvZ09FIiksICJzdHIiLCAgYygiUy1TIiwgIlMtWCIpLCBkaWZmQ3V0b2ZmKQpjcmVhdGVfZGlzdF9iYXJwbG90X29lKGRhdGEsIGZpZ0RpciwgcGFzdGUwKG5hbWUsICJfbG9nT0UiKSwgInN0cl8xbWIiLCAgYygiUy1TIiwgIlMtWCIpLCBkaWZmQ3V0b2ZmLCAxZTYpCgpgYGAKIyMjIyBTcGxpdHRpbmcgbG9vcHMgaW50byBkaWZmIGJlZHBlCmBgYHtyfQojIEltcG9ydCBhbm5vdGF0aW9uCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmRhdGEgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiLnRzdiIpKSkKCiMgSW1wb3J0IG9icy9leHAgc2NvcmVzIGFuZCBtZXJnZSB0byB0aGUgZGF0YXNldAptaW5WYWx1ZSA9IC00Cm9ic2V4cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKCJsb29wU2NvcmVfY29uc19vYnNleHAudHN2IikpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLAogICAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksCiAgICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfQTQ4NSA9IGlmX2Vsc2Uob2JzZXhwX0E0ODUgPT0gMCwgbWluVmFsdWUsIGxvZzIob2JzZXhwX0E0ODUpKSkKCiMgTWVyZ2UgZGF0YXNldApkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoImlkIikpICU+JQogIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTywKICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pCmRpZmZDdXRvZmYgPC0gMC41Cm1ha2VfZGlmZl9iZWRwZV9vZShkYXRhLCBwYXN0ZTAobmFtZSwgIl9sb2dPRV8iLCAiYWxsIiksIHVuaXF1ZShkYXRhJEFubm8yKSwgY29uc2Vuc3VzRGlyLCBkaWZmQ3V0b2ZmKQptYWtlX2RpZmZfYmVkcGVfb2UoZGF0YSwgcGFzdGUwKG5hbWUsICJfbG9nT0VfIiwgInBlLXBlIiksIGMoIlAtUCIsICJQLUUiLCAiRS1FIiksIGNvbnNlbnN1c0RpciwgZGlmZkN1dG9mZikKbWFrZV9kaWZmX2JlZHBlX29lKGRhdGEsIHBhc3RlMChuYW1lLCAiX2xvZ09FXyIsICJzdHIiKSwgYygiUy1TIiwgIlMtWCIpLCBjb25zZW5zdXNEaXIsIGRpZmZDdXRvZmYpCgpgYGAKCiMjIyBbMi4yN10gRXh0cmFjdGluZyBUU1MgZm9yIGRlZXB0b29scwpgYGB7cn0KZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3YiKSkkZ2VuZQpncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdiIpKSRnZW5lCgpmbGFua1NpemUgPC0gMQpnZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkIikpICU+JQogIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09ICIrIiwgVjIsIFYzKSwKICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLAogICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiUKICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kLCBWNikKY29sbmFtZXMoZ2VuZS50YikgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIsICJlbnNlbWJsIikKCmJlZC4xIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdyb3VwMSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSkKYmVkLjIgPC0gZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgZ3JvdXAyKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKQoKZndyaXRlKGJlZC4xLCBoZXJlKHJlZkRpciwgIlRTU19iaW5hcnlHcm91cDEuYmVkIiksIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFKQpmd3JpdGUoYmVkLjIsIGhlcmUocmVmRGlyLCAiVFNTX2JpbmFyeUdyb3VwMi5iZWQiKSwgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gRkFMU0UpCgoKCmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWQiKSkKCmJlZC4xIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDEpCmJlZC4yIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDIpCgpmd3JpdGUoYmVkLjEsIGhlcmUocmVmRGlyLCAiVFNTX2JpbmFyeUdyb3VwMV9ndGYuYmVkIiksIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFKQpmd3JpdGUoYmVkLjIsIGhlcmUocmVmRGlyLCAiVFNTX2JpbmFyeUdyb3VwMl9ndGYuYmVkIiksIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFKQoKYGBgCgojIyMgWzIuMjhdIENoZWNraW5nIGdlbmUgZXhwcmVzc2lvbiBsZXZlbHMgb2YgYmluYXJ5R3JvdXAKYGBge3J9Cmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2IikpJGdlbmUKZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3YiKSkkZ2VuZQoKZGF0YSA8LSBmcmVhZChoZXJlKHJlZkRpciwgInJlYWRDb3VudC5maWx0ZXJlZC5UUE0uYWxsLnRzdiIpKSAlPiUgZHBseXI6Om11dGF0ZSgKICBncm91cCA9IGNhc2Vfd2hlbihlbnNlbWJsICVpbiUgZ3JvdXAxIH4gImdyb3VwMSIsCiAgICAgICAgICAgICAgICAgICAgZW5zZW1ibCAlaW4lIGdyb3VwMiB+ICJncm91cDIiLAogICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkKKSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpICU+JQogIGRwbHlyOjpzZWxlY3QoYygzNCwgMSwgMywgNCwgNSwgMTQsIDE1LCAzNCkpCgpkYXRhIDwtIGRhdGEgJT4lIG11dGF0ZShhdmVyYWdlID0gcm93TWVhbnMoYWNyb3NzKGNvbG5hbWVzKGRhdGEpWzM6N10pKSkKCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgYXZlcmFnZSkKCgpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkYXZlcmFnZQogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRhdmVyYWdlCiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKcHZhbCA8LSBjb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgImdyb3VwMSIsICJncm91cDIiKSkKCmdncGxvdCh0ZW1wLCBhZXMoeCA9IGdyb3VwLCB5ID0gYXZlcmFnZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBzY2FsZV95X2xvZzEwKCkgKwogIHlsYWIoImF2Z1RQTSIpICsgdGhlbWVfY2xhc3NpYygpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMTAwMDAsIGxhYmVsID0gcHZhbCkKCgoKCmBgYAoKIyMjIFsyLjI5XSBDaGVja2luZyBvdmVybGFwIHdpdGggU3RyaXBlcwpgYGB7cn0KZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3YiKSkkZ2VuZQpncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdiIpKSRnZW5lCgpmbGFua1NpemUgPC0gMQpnZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkIikpICU+JQogIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09ICIrIiwgVjIsIFYzKSwKICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLAogICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiUKICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kLCBWNikKY29sbmFtZXMoZ2VuZS50YikgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIsICJlbnNlbWJsIikKCmJlZC4xIDwtIGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdyb3VwMSkgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSkKYmVkLjIgPC0gZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgZ3JvdXAyKSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKQoKCmRhdGEgPC0gZnJlYWQoaGVyZSgiLi4vLi4iLCAicmVzdWx0IiwgInN0cmlwZW5uIiwgInJlc3VsdF9maWx0ZXJlZC50c3YiKSkKCmdncGxvdChkYXRhLCBhZXMoeCA9IHdpZHRoKSkgKyBnZW9tX2hpc3RvZ3JhbSgpICsgdGhlbWVfY2xhc3NpYygpICsKIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikKCgojIyBDaGVja2luZyBvdmVybGFwIHdpdGggZ2VuZSBUU1MKCnRzcyA8LSBmcmVhZChoZXJlKHJlZkRpciwgIm1tMTBfR1JDbTM4LnA2X1RTUzIuNWtiLmJlZCIpKQoKdHNzLmdyb3VwMSA8LSB0c3MgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDEpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpCmNvbG5hbWVzKHRzcy5ncm91cDEpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQp0c3MuZ3JvdXAxLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0c3MuZ3JvdXAxKQoKdHNzLmdyb3VwMiA8LSB0c3MgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDIpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpCmNvbG5hbWVzKHRzcy5ncm91cDIpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQp0c3MuZ3JvdXAyLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0c3MuZ3JvdXAyKQoKIyMgQW5jaG9yIG9mIHN0cmlwZXMKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KGNociwgcG9zMSwgcG9zMikKY29sbmFtZXModGVtcCkgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCgpzdHJpcGVBbmNob3IuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApCgpvdmVybGFwLmdyb3VwMSA8LSBmaW5kT3ZlcmxhcHModHNzLmdyb3VwMS5nciwgc3RyaXBlQW5jaG9yLmdyKQpvdmVybGFwLmdyb3VwMiA8LSBmaW5kT3ZlcmxhcHModHNzLmdyb3VwMi5nciwgc3RyaXBlQW5jaG9yLmdyKQoKbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ncm91cDEpKSkKbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ncm91cDIpKSkKCgojIyBib2R5IG9mIHN0cmlwZXMKdGVtcCA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KGNociwgcG9zMywgcG9zNCkKY29sbmFtZXModGVtcCkgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCgpzdHJpcGVCb2R5LmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKQoKb3ZlcmxhcC5ncm91cDEgPC0gZmluZE92ZXJsYXBzKHRzcy5ncm91cDEuZ3IsIHN0cmlwZUJvZHkuZ3IpCm92ZXJsYXAuZ3JvdXAyIDwtIGZpbmRPdmVybGFwcyh0c3MuZ3JvdXAyLmdyLCBzdHJpcGVCb2R5LmdyKQoKbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ncm91cDEpKSkKbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ncm91cDIpKSkKCiMjIENoZWNraW5nIFJBRDIxL0NUQ0YgcHJlc2VuY2UgYXQgYW5jaG9yCm92ZXJsYXAuYm9keS5jdGNmIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVCb2R5LmdyLCBwZWFrLkNUQ0YpCm92ZXJsYXAuYm9keS5yYWQyMSA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQm9keS5nciwgcGVhay5SQUQyMSkKb3ZlcmxhcC5hbmNob3IuY3RjZiA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBwZWFrLkNUQ0YpCm92ZXJsYXAuYW5jaG9yLnJhZDIxIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVBbmNob3IuZ3IsIHBlYWsuUkFEMjEpCgpsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmJvZHkuY3RjZikpKQpsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmJvZHkucmFkMjEpKSkKCmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuYW5jaG9yLmN0Y2YpKSkKbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5hbmNob3IucmFkMjEpKSkKICAKIyMgQ2hlY2tpbmcgb3ZlcmxhcCB3aXRoIGxvb3AgYW5jaG9yIChQRS1QRSkKbG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlIikpCmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKQphbmNob3IudXBubyA8LSBleHRyYWN0QW5jaG9yKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSkKCmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGUiKSkKYW5jaG9yLmRvd24gPC0gZXh0cmFjdEFuY2hvcihsb29wLmRvd24pCgoKb3ZlcmxhcC5ib2R5LnVwbm8gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci51cG5vKQpvdmVybGFwLmJvZHkuZG93biA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQm9keS5nciwgYW5jaG9yLmRvd24pCm92ZXJsYXAuYW5jaG9yLnVwbm8gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUFuY2hvci5nciwgYW5jaG9yLnVwbm8pCm92ZXJsYXAuYW5jaG9yLmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUFuY2hvci5nciwgYW5jaG9yLmRvd24pCgpsZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS51cG5vKSkpCmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LmRvd24pKSkKbGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci51cG5vKSkpCmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IuZG93bikpKQoKCiMjIENoZWNraW5nIG92ZXJsYXAgd2l0aCBsb29wIGFuY2hvciAoQUxMKQpsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlIikpCmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGUiKSkKYW5jaG9yLnVwbm8gPC0gZXh0cmFjdEFuY2hvcihiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykpCgpsb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKQphbmNob3IuZG93biA8LSBleHRyYWN0QW5jaG9yKGxvb3AuZG93bikKCgpvdmVybGFwLmJvZHkudXBubyA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQm9keS5nciwgYW5jaG9yLnVwbm8pCm92ZXJsYXAuYm9keS5kb3duIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVCb2R5LmdyLCBhbmNob3IuZG93bikKb3ZlcmxhcC5hbmNob3IudXBubyA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBhbmNob3IudXBubykKb3ZlcmxhcC5hbmNob3IuZG93biA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQW5jaG9yLmdyLCBhbmNob3IuZG93bikKCmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LnVwbm8pKSkKbGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkuZG93bikpKQpsZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLnVwbm8pKSkKbGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci5kb3duKSkpCgoKIyMgQ2hlY2tpbmcgb3ZlcmxhcCB3aXRoIGxvb3AgYW5jaG9yIChTdHJ1Y3R1cmUpCmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3N0cnVjdHVyZV9kVEFHdnNETVNPX1VQX2RpZmYwLjIuYmVkcGUiKSkKbG9vcC5ubyA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKQphbmNob3IudXBubyA8LSBleHRyYWN0QW5jaG9yKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSkKCmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlIikpCmFuY2hvci5kb3duIDwtIGV4dHJhY3RBbmNob3IobG9vcC5kb3duKQoKb3ZlcmxhcC5ib2R5LnVwbm8gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci51cG5vKQpvdmVybGFwLmJvZHkuZG93biA8LSBmaW5kT3ZlcmxhcHMoc3RyaXBlQm9keS5nciwgYW5jaG9yLmRvd24pCm92ZXJsYXAuYW5jaG9yLnVwbm8gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUFuY2hvci5nciwgYW5jaG9yLnVwbm8pCm92ZXJsYXAuYW5jaG9yLmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUFuY2hvci5nciwgYW5jaG9yLmRvd24pCgpsZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS51cG5vKSkpCmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LmRvd24pKSkKbGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci51cG5vKSkpCmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IuZG93bikpKQoKCmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LnVwbm8pKSkvbGVuZ3RoKGFuY2hvci51cG5vKSoxMDAKbGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkuZG93bikpKS9sZW5ndGgoYW5jaG9yLmRvd24pKjEwMApsZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLnVwbm8pKSkvbGVuZ3RoKGFuY2hvci51cG5vKSoxMDAKbGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci5kb3duKSkpL2xlbmd0aChhbmNob3IuZG93bikqMTAwCgoKIyMgQ2hlY2tpbmcgb3ZlcmxhcCB3aXRoIGxvb3AgYW5jaG9yIChSZWxheGVkUmVnKQpsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9yZWd1bGF0b3J5X2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZSIpKQpsb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9yZWd1bGF0b3J5X2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKQphbmNob3IudXBubyA8LSBleHRyYWN0QW5jaG9yKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSkKCmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcmVndWxhdG9yeV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKQphbmNob3IuZG93biA8LSBleHRyYWN0QW5jaG9yKGxvb3AuZG93bikKCm92ZXJsYXAuYm9keS51cG5vIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVCb2R5LmdyLCBhbmNob3IudXBubykKb3ZlcmxhcC5ib2R5LmRvd24gPC0gZmluZE92ZXJsYXBzKHN0cmlwZUJvZHkuZ3IsIGFuY2hvci5kb3duKQpvdmVybGFwLmFuY2hvci51cG5vIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVBbmNob3IuZ3IsIGFuY2hvci51cG5vKQpvdmVybGFwLmFuY2hvci5kb3duIDwtIGZpbmRPdmVybGFwcyhzdHJpcGVBbmNob3IuZ3IsIGFuY2hvci5kb3duKQoKbGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmJvZHkudXBubykpKQpsZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS5kb3duKSkpCmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IudXBubykpKQpsZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYW5jaG9yLmRvd24pKSkKCgpsZW5ndGgodW5pcXVlKHN1YmplY3RIaXRzKG92ZXJsYXAuYm9keS51cG5vKSkpL2xlbmd0aChhbmNob3IudXBubykqMTAwCmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5ib2R5LmRvd24pKSkvbGVuZ3RoKGFuY2hvci5kb3duKSoxMDAKbGVuZ3RoKHVuaXF1ZShzdWJqZWN0SGl0cyhvdmVybGFwLmFuY2hvci51cG5vKSkpL2xlbmd0aChhbmNob3IudXBubykqMTAwCmxlbmd0aCh1bmlxdWUoc3ViamVjdEhpdHMob3ZlcmxhcC5hbmNob3IuZG93bikpKS9sZW5ndGgoYW5jaG9yLmRvd24pKjEwMAoKCgoKYGBgCgojIyMgWzIuMzBdIEh1YnMgZnJvbSBEeWxhbiBQYXBlcgojIyMjIEFsbCBsb29wcwpgYGB7cn0KcmVzdWx0cyA8LSB0aWJibGUoaSA9IG51bWVyaWMoKSwgdXBubyA9IG51bWVyaWMoKSwgZG93biA9IG51bWVyaWMoKSkKCmZvcihpIGluIHNlcSgxLCAxMCkpewogIGRhdGEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJEeWxhbl9odWJfZXNjLmNzdiIpKQogIAogIGRhdGEuaHViIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoYWxsX2xjb24gPiBpKQogIHRlbXAgPC0gZGF0YS5odWIgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSkKICBjb2xuYW1lcyh0ZW1wKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKICBodWIuYW5jaG9yIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0ZW1wKQogIAogIAogIApsb29wLnVwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9hbGxfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlIikpCmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGUiKSkKYW5jaG9yLnVwbm8gPC0gZXh0cmFjdEFuY2hvcihiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykpCgpsb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X2FsbF9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKQphbmNob3IuZG93biA8LSBleHRyYWN0QW5jaG9yKGxvb3AuZG93bikKCiAgCiAgb3ZlcmxhcC51cG5vIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXBubywgaHViLmFuY2hvcikKICBvdmVybGFwLmRvd24gPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBodWIuYW5jaG9yKQogIAogIG4xIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAudXBubykpKQogIG4yIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuZG93bikpKQogIAogIHBlcmMxIDwtIHJvdW5kKG4xL2xlbmd0aChvdmVybGFwLnVwbm8pKjEwMCwgMikKICBwZXJjMiA8LSByb3VuZChuMi9sZW5ndGgob3ZlcmxhcC5kb3duKSoxMDAsIDIpCiAgCiAgcmVzdWx0cyA8LSByZXN1bHRzICU+JSBhZGRfcm93KGkgPSBpLCB1cG5vID0gcGVyYzEsIGRvd24gPSBwZXJjMikKfQoKCgpyZXN1bHRzX2xvbmcgPC0gcmVzdWx0cyAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGModXBubywgZG93biksIG5hbWVzX3RvID0gIkdyb3VwIiwgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2UiKQoKcmVzdWx0c19sb25nJEdyb3VwIDwtIGZhY3RvcihyZXN1bHRzX2xvbmckR3JvdXAsIGxldmVscyA9IGMoInVwbm8iLCAiZG93biIpKQojIENyZWF0ZSB0aGUgYmFyIHBsb3QKZ2dwbG90KHJlc3VsdHNfbG9uZywgYWVzKHggPSBmYWN0b3IoaSksIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gR3JvdXApKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJBbGwgbG9vcHMiLAogICAgeCA9ICJQcmVzZW5jZSBvZiBodWIgYW5jaG9yIHdpdGggPmkgY29ubmVjdGlvbnMiLAogICAgeSA9ICJQZXJjZW50YWdlIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygidXBubyIgPSAiYmx1ZSIsICJkb3duIiA9ICJyZWQiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsgeWxpbSgwLCAxMDApCmBgYAoKIyMjIyMgRmlzaGVycwpgYGB7cn0KbG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19VUF9kaWZmMC4yLmJlZHBlIikpCmxvb3Aubm8gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fTk9fZGlmZjAuMi5iZWRwZSIpKQpsb29wLnVwbm8gPC0gKGJpbmRfcm93cyhsb29wLnVwLCBsb29wLm5vKSkKCmxvb3AuZG93biA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfcGUtcGVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGUiKSkKCmdldE92ZXJsYXBMb29wTnVtIDwtIGZ1bmN0aW9uKGxvb3AsIHBlYWspewogIGFuY2hvcjEgPC0gR1JhbmdlcyhzZXFuYW1lcyA9IGxvb3AkVjEsIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBsb29wJFYyLCBlbmQgPSBsb29wJFYzKSkKICBhbmNob3IyIDwtIEdSYW5nZXMoc2VxbmFtZXMgPSBsb29wJFY0LCByYW5nZXMgPSBJUmFuZ2VzKHN0YXJ0ID0gbG9vcCRWNSwgZW5kID0gbG9vcCRWNikpCiAgYSA8LSBxdWVyeUhpdHMoZmluZE92ZXJsYXBzKGFuY2hvcjEsIHBlYWspKQogIGIgPC0gcXVlcnlIaXRzKGZpbmRPdmVybGFwcyhhbmNob3IyLCBwZWFrKSkKICByZXR1cm4obGVuZ3RoKHVuaXF1ZShjKGEsIGIpKSkpCn0KCmdldFNFT3ZlcmxhcEZpc2hlciA8LSBmdW5jdGlvbihhbGxMb29wLCBzdWJzZXRMb29wLCBwZWFrKXsKICBhbGwub3ZlcmxhcCA8LSBnZXRPdmVybGFwTG9vcE51bShhbGxMb29wLCBwZWFrKQogIGFsbC5ub3RPdmVybGFwIDwtIG5yb3coYWxsTG9vcCkgLSBhbGwub3ZlcmxhcAogIAogIHN1YnNldC5vdmVybGFwIDwtIGdldE92ZXJsYXBMb29wTnVtKHN1YnNldExvb3AsIHBlYWspCiAgc3Vic2V0Lm5vdE92ZXJsYXAgPC0gbnJvdyhzdWJzZXRMb29wKSAtIHN1YnNldC5vdmVybGFwCiAgCiAgY29udGluZ2VuY3lfdGFibGUgPC0gbWF0cml4KGMoc3Vic2V0Lm92ZXJsYXAsIHN1YnNldC5ub3RPdmVybGFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbC5vdmVybGFwLCBhbGwubm90T3ZlcmxhcCksIG5yb3cgPSAyLCBieXJvdyA9IFRSVUUpCiAgY29sbmFtZXMoY29udGluZ2VuY3lfdGFibGUpIDwtIGMoIk92ZXJsYXBwaW5nIiwgIk5vdF9PdmVybGFwcGluZyIpCiAgcm93bmFtZXMoY29udGluZ2VuY3lfdGFibGUpIDwtIGMoIkFsbCBsb29wcyIsICJTdWJzZXQgbG9vcHMiKQogIAogICMgUGVyZm9ybSBGaXNoZXIncyBFeGFjdCBUZXN0CiAgZmlzaGVyX3Rlc3RfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlKQogIHJldHVybihmaXNoZXJfdGVzdF9yZXN1bHQpCn0KCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmxvb3AgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlLmJlZHBlIikpCgoKaSA8LSAyCmRhdGEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJEeWxhbl9odWJfZXNjLmNzdiIpKQoKZGF0YS5odWIgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihhbGxfbGNvbiA+IGkpCnRlbXAgPC0gZGF0YS5odWIgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzKSkKY29sbmFtZXModGVtcCkgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCmh1Yi5hbmNob3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApCgoKdGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC51cG5vLCBodWIuYW5jaG9yKQpyZXN1bHQudGIgPC0gdGliYmxlKGxvb3BUeXBlID0gIlVQL05PIiwKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAoImh1Yl8iLCBpKSwKICAgICAgICAgICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKdGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5kb3duLCBodWIuYW5jaG9yKQpyZXN1bHQudGIgPC0gcmVzdWx0LnRiICU+JSAKICBhZGRfcm93KGxvb3BUeXBlID0gIkRPV04iLAogICAgICAgICAgdGFyZ2V0ID0gIHBhc3RlMCgiaHViXyIsIGkpLAogICAgICAgICAgcHZhbHVlID0gdGVtcCRwLnZhbHVlLAogICAgICAgICAgb2Rkc1JhdGlvID0gdGVtcCRlc3RpbWF0ZSkKCgpmb3IoaSBpbiBjKDUpKXsKICBkYXRhIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiRHlsYW5faHViX2VzYy5jc3YiKSkKICAKICBkYXRhLmh1YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGFsbF9sY29uID4gaSkKICB0ZW1wIDwtIGRhdGEuaHViICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpCiAgY29sbmFtZXModGVtcCkgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCiAgaHViLmFuY2hvciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCkKICAKICAKICB0ZW1wIDwtIGdldFNFT3ZlcmxhcEZpc2hlcihsb29wLCBsb29wLnVwbm8sIGh1Yi5hbmNob3IpCiAgcmVzdWx0LnRiIDwtIHJlc3VsdC50YiAlPiUgYWRkX3Jvdyhsb29wVHlwZSA9ICJVUC9OTyIsCiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBwYXN0ZTAoImh1Yl8iLCBpKSwKICAgICAgICAgICAgICAgICAgICAgIHB2YWx1ZSA9IHRlbXAkcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpCiAgdGVtcCA8LSBnZXRTRU92ZXJsYXBGaXNoZXIobG9vcCwgbG9vcC5kb3duLCBodWIuYW5jaG9yKQogIHJlc3VsdC50YiA8LSByZXN1bHQudGIgJT4lIAogICAgYWRkX3Jvdyhsb29wVHlwZSA9ICJET1dOIiwKICAgICAgICAgICAgdGFyZ2V0ID0gIHBhc3RlMCgiaHViXyIsIGkpLAogICAgICAgICAgICBwdmFsdWUgPSB0ZW1wJHAudmFsdWUsCiAgICAgICAgICAgIG9kZHNSYXRpbyA9IHRlbXAkZXN0aW1hdGUpCiAgCiAgCn0KCmxpYnJhcnkoY2lyY2xpemUpCmRhdGEgPC0gcmVzdWx0LnRiCmhlYXRtYXBfZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KHRhcmdldCwgbG9vcFR5cGUsIG9kZHNSYXRpbykgJT4lCnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBsb29wVHlwZSwgdmFsdWVzX2Zyb20gPSBvZGRzUmF0aW8pICU+JQogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAidGFyZ2V0IikKCnB2YWx1ZV9kYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QodGFyZ2V0LCBsb29wVHlwZSwgcHZhbHVlKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbG9vcFR5cGUsIHZhbHVlc19mcm9tID0gcHZhbHVlKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gInRhcmdldCIpCgojIGNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDIpLCAKIyAgICAgICAgICAgICAgICAgICAgICAgYygiYmx1ZSIsICJ3aGl0ZSIsICJyZWQiKSkKCmRhdGEkdGFyZ2V0IDwtIGZhY3RvcihkYXRhJHRhcmdldCwgbGV2ZWxzID0gYygiaHViXzUiLCAiaHViXzIiKSkKZGF0YSRsb29wVHlwZSA8LSBmYWN0b3IoZGF0YSRsb29wVHlwZSwgbGV2ZWxzID0gYygiVVAvTk8iLCAiRE9XTiIpKQpwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGxvb3BUeXBlLCB5ID0gdGFyZ2V0LCBzaXplID0gLWxvZzEwKHB2YWx1ZSksIGZpbGwgPSBvZGRzUmF0aW8pKSArCiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCAgICAgICAgIyBFbnN1cmVzIGEgcG9pbnQgd2l0aCBhbiBvdXRsaW5lCiAgICAgICAgICAgICBzdHJva2UgPSAxKnB0VG9NTSAgICAgICMgTGluZSB3aWR0aCBmb3IgdGhlIGJvcmRlcgogICkgKyB0aGVtZV9idygpICsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCAzKSkgKyAgIyBTZXQgbWluIGFuZCBtYXggcG9pbnQgc2l6ZXMgaGVyZQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycyA9IGMoIiM0ODUyQTAiLCAid2hpdGUiLCAiI0NCMzMzQSIpLCAgIyBEZWZpbmUgZ3JhZGllbnQgY29sb3JzCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBzY2FsZXM6OnJlc2NhbGUoYygwLjUsIDEsIDEuNSkpLCBsaW1pdHMgPSBjKDAuNSwgMS41KSwgCiAgICAgICAgICAgICAgICAgICAgICAjbG93ID0gIndoaXRlIiwgaGlnaCA9ICIjQ0IzMzNBIiwKICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEsIDMpLAogICAgICAgICAgICAgICAgICAgICAgb29iID0gc2NhbGVzOjpzcXVpc2gsICMgRGVmaW5lIGdyYWRpZW50IGNvbG9ycwogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcigKICAgICAgICAgICAgICAgICAgICAgICAgYmFyd2lkdGggPSAxLjUvNS4wOCwgICMgQWRqdXN0IHdpZHRoIG9mIHRoZSBjb2xvciBiYXIKICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUvNS4wOCAgICMgQWRqdXN0IGhlaWdodCBvZiB0aGUgY29sb3IgYmFyCiAgICAgICAgICAgICAgICAgICAgICApCiAgKSArIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSAgKwogIHRoZW1lKAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXMKICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb24KICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgKQoKCmZpbGVOYW1lIDwtIGhlcmUoZmlnRGlyLCAiaGVhdG1hcF9odWJfZW5yaWNobWVudF9kb3RwbG90X2FsbCIpCndpZHRoIDwtIHBhbmVsU2l6ZSgxLjY1KSptbVRvSW5jaApoZWlnaHQgPC0gcGFuZWxTaXplKDEuMSkqbW1Ub0luY2gKIyAjIHBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQojICMgcHJpbnQocCkKIyAjIGRldi5vZmYoKQpzdmdsaXRlKHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKCgojIyMjIFBFLVBFIGxvb3BzCmBgYHtyfQpyZXN1bHRzIDwtIHRpYmJsZShpID0gbnVtZXJpYygpLCB1cG5vID0gbnVtZXJpYygpLCBkb3duID0gbnVtZXJpYygpKQoKZm9yKGkgaW4gc2VxKDEsIDEwKSl7CiAgZGF0YSA8LSBmcmVhZChoZXJlKHJlZkRpciwgIkR5bGFuX2h1Yl9lc2MuY3N2IikpCiAgCiAgZGF0YS5odWIgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihhbGxfbGNvbiA+IGkpCiAgdGVtcCA8LSBkYXRhLmh1YiAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKQogIGNvbG5hbWVzKHRlbXApIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQogIGh1Yi5hbmNob3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApCiAgCiAgCiAgCmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZSIpKQpsb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGUiKSkKYW5jaG9yLnVwbm8gPC0gZXh0cmFjdEFuY2hvcihiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykpCgpsb29wLmRvd24gPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fRE9XTl9kaWZmMC4yLmJlZHBlIikpCmFuY2hvci5kb3duIDwtIGV4dHJhY3RBbmNob3IobG9vcC5kb3duKQoKCiAgCiAgb3ZlcmxhcC51cG5vIDwtIGZpbmRPdmVybGFwcyhhbmNob3IudXBubywgaHViLmFuY2hvcikKICBvdmVybGFwLmRvd24gPC0gZmluZE92ZXJsYXBzKGFuY2hvci5kb3duLCBodWIuYW5jaG9yKQogIAogIG4xIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAudXBubykpKQogIG4yIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuZG93bikpKQogIAogIHBlcmMxIDwtIHJvdW5kKG4xL2xlbmd0aChvdmVybGFwLnVwbm8pKjEwMCwgMikKICBwZXJjMiA8LSByb3VuZChuMi9sZW5ndGgob3ZlcmxhcC5kb3duKSoxMDAsIDIpCiAgCiAgcmVzdWx0cyA8LSByZXN1bHRzICU+JSBhZGRfcm93KGkgPSBpLCB1cG5vID0gcGVyYzEsIGRvd24gPSBwZXJjMikKfQoKCgpyZXN1bHRzX2xvbmcgPC0gcmVzdWx0cyAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGModXBubywgZG93biksIG5hbWVzX3RvID0gIkdyb3VwIiwgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2UiKQpyZXN1bHRzX2xvbmckR3JvdXAgPC0gZmFjdG9yKHJlc3VsdHNfbG9uZyRHcm91cCwgbGV2ZWxzID0gYygidXBubyIsICJkb3duIikpCgojIENyZWF0ZSB0aGUgYmFyIHBsb3QKZ2dwbG90KHJlc3VsdHNfbG9uZywgYWVzKHggPSBmYWN0b3IoaSksIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gR3JvdXApKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJQRS1QRSBsb29wcyIsCiAgICB4ID0gIlByZXNlbmNlIG9mIGh1YiBhbmNob3Igd2l0aCA+aSBjb25uZWN0aW9ucyIsCiAgICB5ID0gIlBlcmNlbnRhZ2UiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJ1cG5vIiA9ICJibHVlIiwgImRvd24iID0gInJlZCIpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyB5bGltKDAsIDEwMCkKYGBgCgoKIyMjIyBTdHIgbG9vcHMKYGBge3J9CnJlc3VsdHMgPC0gdGliYmxlKGkgPSBudW1lcmljKCksIHVwbm8gPSBudW1lcmljKCksIGRvd24gPSBudW1lcmljKCkpCgpmb3IoaSBpbiBzZXEoMSwgMTApKXsKICBkYXRhIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiRHlsYW5faHViX2VzYy5jc3YiKSkKICAKICBkYXRhLmh1YiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGFsbF9sY29uID4gaSkKICB0ZW1wIDwtIGRhdGEuaHViICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMykpCiAgY29sbmFtZXModGVtcCkgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCiAgaHViLmFuY2hvciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCkKICAKICAKICAKbG9vcC51cCA8LSBmcmVhZChoZXJlKGNvbnNlbnN1c0RpciwgImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHlfc3RydWN0dXJlX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZSIpKQpsb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmVfZFRBR3ZzRE1TT19OT19kaWZmMC4yLmJlZHBlIikpCmFuY2hvci51cG5vIDwtIGV4dHJhY3RBbmNob3IoYmluZF9yb3dzKGxvb3AudXAsIGxvb3Aubm8pKQoKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9zdHJ1Y3R1cmVfZFRBR3ZzRE1TT19ET1dOX2RpZmYwLjIuYmVkcGUiKSkKYW5jaG9yLmRvd24gPC0gZXh0cmFjdEFuY2hvcihsb29wLmRvd24pCgogIAogIG92ZXJsYXAudXBubyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLnVwbm8sIGh1Yi5hbmNob3IpCiAgb3ZlcmxhcC5kb3duIDwtIGZpbmRPdmVybGFwcyhhbmNob3IuZG93biwgaHViLmFuY2hvcikKICAKICBuMSA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLnVwbm8pKSkKICBuMiA8LSBsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwLmRvd24pKSkKICAKICBwZXJjMSA8LSByb3VuZChuMS9sZW5ndGgob3ZlcmxhcC51cG5vKSoxMDAsIDIpCiAgcGVyYzIgPC0gcm91bmQobjIvbGVuZ3RoKG92ZXJsYXAuZG93bikqMTAwLCAyKQogIAogIHJlc3VsdHMgPC0gcmVzdWx0cyAlPiUgYWRkX3JvdyhpID0gaSwgdXBubyA9IHBlcmMxLCBkb3duID0gcGVyYzIpCn0KCgoKcmVzdWx0c19sb25nIDwtIHJlc3VsdHMgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHVwbm8sIGRvd24pLCBuYW1lc190byA9ICJHcm91cCIsIHZhbHVlc190byA9ICJQZXJjZW50YWdlIikKcmVzdWx0c19sb25nJEdyb3VwIDwtIGZhY3RvcihyZXN1bHRzX2xvbmckR3JvdXAsIGxldmVscyA9IGMoInVwbm8iLCAiZG93biIpKQoKIyBDcmVhdGUgdGhlIGJhciBwbG90CmdncGxvdChyZXN1bHRzX2xvbmcsIGFlcyh4ID0gZmFjdG9yKGkpLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IEdyb3VwKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiU3RydWN0dXJlIGxvb3BzIiwKICAgIHggPSAiUHJlc2VuY2Ugb2YgaHViIGFuY2hvciB3aXRoID5pIGNvbm5lY3Rpb25zIiwKICAgIHkgPSAiUGVyY2VudGFnZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInVwbm8iID0gImJsdWUiLCAiZG93biIgPSAicmVkIikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArIHlsaW0oMCwgMTAwKQpgYGAKIyMjIyBUU1MKYGBge3J9CnJlc3VsdHMgPC0gdGliYmxlKGkgPSBudW1lcmljKCksIHBlcmMxID0gbnVtZXJpYygpLCBwZXJjMiA9IG51bWVyaWMoKSkKCmZvcihpIGluIHNlcSgxLCAxMCkpewogIGRhdGEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJEeWxhbl9odWJfZXBpc2MuY3N2IikpCiAgCiAgZGF0YS5odWIgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihhbGxfbGNvbiA+IGkpCiAgdGVtcCA8LSBkYXRhLmh1YiAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKQogIGNvbG5hbWVzKHRlbXApIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQogIGh1Yi5hbmNob3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApCiAgCiAgCiAgCiAgIyMgQ2hlY2tpbmcgb3ZlcmxhcCB3aXRoIGdlbmUgVFNTCiAgdHNzIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfVFNTMi41a2IuYmVkIikpCiAgCiAgdHNzLmdyb3VwMSA8LSB0c3MgJT4lIGRwbHlyOjpmaWx0ZXIoVjYgJWluJSBncm91cDEpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpCiAgY29sbmFtZXModHNzLmdyb3VwMSkgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIpCiAgdHNzLmdyb3VwMS5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodHNzLmdyb3VwMSkKICAKICB0c3MuZ3JvdXAyIDwtIHRzcyAlPiUgZHBseXI6OmZpbHRlcihWNiAlaW4lIGdyb3VwMikgJT4lIGRwbHlyOjpzZWxlY3QoVjEsIFYyLCBWMykKICBjb2xuYW1lcyh0c3MuZ3JvdXAyKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIikKICB0c3MuZ3JvdXAyLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSh0c3MuZ3JvdXAyKQogIAogIAogIG92ZXJsYXAuZ3JvdXAxIDwtIGZpbmRPdmVybGFwcyh0c3MuZ3JvdXAxLmdyLCBodWIuYW5jaG9yKQogIG92ZXJsYXAuZ3JvdXAyIDwtIGZpbmRPdmVybGFwcyh0c3MuZ3JvdXAyLmdyLCBodWIuYW5jaG9yKQogIAogIG4xIDwtIGxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKG92ZXJsYXAuZ3JvdXAxKSkpCiAgbjIgPC0gbGVuZ3RoKHVuaXF1ZShxdWVyeUhpdHMob3ZlcmxhcC5ncm91cDIpKSkKICAKICBwZXJjMSA8LSByb3VuZChuMS9ucm93KHRzcy5ncm91cDEpKjEwMCwgMikKICBwZXJjMiA8LSByb3VuZChuMi9ucm93KHRzcy5ncm91cDIpKjEwMCwgMikKICAKICByZXN1bHRzIDwtIHJlc3VsdHMgJT4lIGFkZF9yb3coaSA9IGksIHBlcmMxID0gcGVyYzEsIHBlcmMyID0gcGVyYzIpCn0KCgoKcmVzdWx0c19sb25nIDwtIHJlc3VsdHMgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHBlcmMxLCBwZXJjMiksIG5hbWVzX3RvID0gIkdyb3VwIiwgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2UiKQoKIyBDcmVhdGUgdGhlIGJhciBwbG90CmdncGxvdChyZXN1bHRzX2xvbmcsIGFlcyh4ID0gZmFjdG9yKGkpLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IEdyb3VwKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiUGVyY2VudGFnZSBieSAnaScgZm9yIHBlcmMxIGFuZCBwZXJjMiIsCiAgICB4ID0gIlByZXNlbmNlIG9mIGh1YiBhbmNob3Igd2l0aCA+aSBjb25uZWN0aW9ucyIsCiAgICB5ID0gIlBlcmNlbnRhZ2UiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJwZXJjMSIgPSAiYmx1ZSIsICJwZXJjMiIgPSAicmVkIikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpgYGAKCiMjI1syLjMwXSBIM0syN2FjIHBlYWsgbnVtYmVyIHBlciAxMGtiCmBgYHtyfQpwcm9jZXNzX2dyb3VwIDwtIGZ1bmN0aW9uKGdyb3VwX25hbWUsIGdlbmVfZGF0YSwgYmlucykgewogICMgRmlsdGVyIGZvciB0aGUgc3BlY2lmaWMgZ3JvdXAKICBUU1NfZ3JvdXAgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKAogICAgZ2VuZV9kYXRhICU+JSBmaWx0ZXIoZW5zZW1ibCAlaW4lIGdldChncm91cF9uYW1lKSksIAogICAga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRQogICkKICAKICAjIFByb2Nlc3MgZWFjaCBUU1MgaW4gdGhlIGdyb3VwCiAgYWxsX3Jlc3VsdHMgPC0gbWFwX2RmcihzZXFfbGVuKGxlbmd0aChUU1NfZ3JvdXApKSwgZnVuY3Rpb24oaSkgewogICAgIyBGaW5kIG92ZXJsYXBwaW5nIGJpbnMKICAgIG92ZXJsYXBwaW5nX2JpbnMgPC0gZmluZE92ZXJsYXBzKFRTU19ncm91cFtpXSwgYmlucykKICAgIGJpbnNfbmVhcl90c3MgPC0gYXNfdGliYmxlKGJpbnNbc3ViamVjdEhpdHMob3ZlcmxhcHBpbmdfYmlucyldKQogICAgCiAgICAjIENhbGN1bGF0ZSBkaXN0YW5jZSBiaW4KICAgIFRTU2NlbnRlciA8LSAoYXNfdGliYmxlKFRTU19ncm91cFtpXSkgJT4lCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGNlbnRlciA9IChzdGFydCArIGVuZCkgLyAyKSkkY2VudGVyCiAgICBjZW50ZXJCaW5TdGFydCA8LSBmbG9vcihUU1NjZW50ZXIgLyAxMGUzKSAqIDEwZTMgKyAxCiAgICBiaW5zX25lYXJfdHNzIDwtIGJpbnNfbmVhcl90c3MgJT4lCiAgICAgIG11dGF0ZShkaXN0YW5jZUJpbiA9IGFicygoc3RhcnQgLSBjZW50ZXJCaW5TdGFydCkpIC8gMTBlMykKICAgIAogICAgIyBTdW1tYXJpemUgcmVzdWx0cwogICAgcmVzdWx0IDwtIGJpbnNfbmVhcl90c3MgJT4lCiAgICAgIGdyb3VwX2J5KGRpc3RhbmNlQmluKSAlPiUKICAgICAgc3VtbWFyaXNlKG1lYW5fcGVha19jb3VudHMgPSBtZWFuKHBlYWtfY291bnRzLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICAgICAgbXV0YXRlKGdlbmUgPSBUU1NfZ3JvdXBbaV0kZW5zZW1ibCkKICAgIHJldHVybihyZXN1bHQpCiAgfSkKICAKICAjIENhbGN1bGF0ZSBtZWFuIGFuZCBTRCBmb3IgdGhlIGdyb3VwCiAgbWVhbl9kYXRhIDwtIGFsbF9yZXN1bHRzICU+JQogICAgZ3JvdXBfYnkoZGlzdGFuY2VCaW4pICU+JQogICAgc3VtbWFyaXNlKG1lYW5fcGVha19jb3VudHMgPSBtZWFuKG1lYW5fcGVha19jb3VudHMsIG5hLnJtID0gVFJVRSkpCiAgCiAgc2RfZGF0YSA8LSBhbGxfcmVzdWx0cyAlPiUKICAgIGdyb3VwX2J5KGRpc3RhbmNlQmluKSAlPiUKICAgIHN1bW1hcmlzZShzZF9wZWFrX2NvdW50cyA9IHNkKG1lYW5fcGVha19jb3VudHMsIG5hLnJtID0gVFJVRSkpCiAgCiAgIyBKb2luIGFuZCBhZGQgZ3JvdXAgbmFtZQogIHN1bW1hcnlfZGF0YSA8LSBsZWZ0X2pvaW4obWVhbl9kYXRhLCBzZF9kYXRhLCBieSA9ICJkaXN0YW5jZUJpbiIpICU+JQogICAgbXV0YXRlKGdyb3VwID0gZ3JvdXBfbmFtZSkKICAKICByZXR1cm4oc3VtbWFyeV9kYXRhKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKCiMjIEltcG9ydCBwZWFrCnJlZkRpciA8LSBoZXJlKCIuLi8uLiIsICJyZWZlcmVuY2UiKQojcGVhay5IM0syN2FjIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsICJHU00yNDM4NDc2X0VDLURHLTM0NTgtSDNLMjdBQ19BU1lOXzEubmFycm93UGVhay5iZWQiKSkKcGVhay5IM0syN2FjIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsICIzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5iZWQiKSkKI3BlYWsuSDNLMjdhYyA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkIikpCgojIyBJbXBvcnQgMTBrYiBiaW4KdGVtcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgIm1tMTAuYmluLjEwa2IuYmVkIikpCmNvbG5hbWVzKHRlbXApIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoc3RhcnQgPSBzdGFydCsxKQpiaW5zLjEwa2IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApCgojIyBDb3VudCBvdmVybGFwCmNvdW50cyA8LSBjb3VudE92ZXJsYXBzKGJpbnMuMTBrYiwgcGVhay5IM0syN2FjKQptY29scyhiaW5zLjEwa2IpJHBlYWtfY291bnRzIDwtIGNvdW50cwoKIyMgR2V0dGluZyBUU1MKZmxhbmtTaXplIDwtIDFlNgpnZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkIikpICU+JQogIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09ICIrIiwgVjIsIFYzKSwKICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLAogICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiUKICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kLCBWNikKY29sbmFtZXMoZ2VuZS50YikgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIsICJlbnNlbWJsIikKCmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3YiKSkkZ2VuZQpnZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2IikpJGdlbmUKCiNUU1MxbWIuZ3JvdXAxLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmwgJWluJSBnZW5lLmdyb3VwMSksIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpCiNUU1MxbWIuZ3JvdXAyLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmwgJWluJSBnZW5lLmdyb3VwMiksIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTGlzdCBvZiBncm91cHMgdG8gcHJvY2Vzcwpncm91cHMgPC0gYygiZ2VuZS5ncm91cDEiLCAiZ2VuZS5ncm91cDIiKQoKIyBQcm9jZXNzIGVhY2ggZ3JvdXAgYW5kIGNvbWJpbmUgcmVzdWx0cwpzdW1tYXJ5X2RhdGEgPC0gbWFwX2Rmcihncm91cHMsIH4gcHJvY2Vzc19ncm91cCgueCwgZ2VuZS50YiwgYmlucy4xMGtiKSkKCiMgQWRkIHRoZSBhZGRpdGlvbmFsIHJvd3MgZm9yIGRpc3RhbmNlQmluID0gMApzdW1tYXJ5X2RhdGEgPC0gc3VtbWFyeV9kYXRhICU+JQogIG11dGF0ZShkaXN0YW5jZUJpbiA9IGRpc3RhbmNlQmluICsgMSkgJT4lCiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gImdlbmUuZ3JvdXAxIikgJT4lCiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gImdlbmUuZ3JvdXAyIikKCiMgUGxvdCB0aGUgcmVzdWx0cwpwIDwtIGdncGxvdChzdW1tYXJ5X2RhdGEsIGFlcyh4ID0gZGlzdGFuY2VCaW4sIHkgPSBtZWFuX3BlYWtfY291bnRzLCBjb2xvciA9IGdyb3VwKSkgKyAKICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKwogIGxhYnMoCiAgICB4ID0gIkRpc3RhbmNlIGJpbiAoMTBrYikiLAogICAgeSA9ICJIM0s0bWUzIHBlYWsgY291bnQiCiAgKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjgsIDAuOCkgICMgTW92ZXMgbGVnZW5kIGluc2lkZSB0aGUgcGxvdCAoeCwgeSByZWxhdGl2ZSBjb29yZGluYXRlcykKICApICsKICBndWlkZXMoCiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKAogICAgICBrZXl3aWR0aCA9IDAuMiwgICMgQWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgbGVnZW5kIGtleXMKICAgICAga2V5aGVpZ2h0ID0gMC4yICAjIEFkanVzdCB0aGUgaGVpZ2h0IG9mIHRoZSBsZWdlbmQga2V5cwogICAgKSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJldihjKCIjNzc3Nzc3IiwgIiNGMjhFMkMiKSkpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmaWxlTmFtZSA8LSBwYXN0ZTAoImJpblBlYWtEZW5zaXR5X1JBRDIxX2JpbmFyeUdyb3VwIikKd2lkdGggPC0gMzIqbW1Ub0luY2gKaGVpZ2h0IDwtIDM1Km1tVG9JbmNoCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKCmBgYHtyfQoKIyMjIyMjIyBET2luZyB0aGlzIGZvciBQLVMgZ3JvdXBzCnJlc3VsdERpciA8LSBoZXJlKCIuLi8uLi9yZXN1bHQiKQp0ZW1wMiA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCAiZ2VuZV9sb29wX2xpbmsucmRzIikpCgpwc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gNCkpJGdlbmUKcHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDMsIG51bV9wcyA8IDQpKSRnZW5lCnBzT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAyLCBudW1fcHMgPCAzKSkkZ2VuZQpwc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMSwgbnVtX3BzIDwgMikpJGdlbmUKcHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzIDwgMSkpJGdlbmUKCiMgTGlzdCBvZiBncm91cHMgdG8gcHJvY2Vzcwpncm91cHMgPC0gYygicHNPdmVyMCIsICJwc092ZXIxIiwgInBzT3ZlcjIiLCAicHNPdmVyMyIsICJwc092ZXI0IikKCiMgUHJvY2VzcyBlYWNoIGdyb3VwIGFuZCBjb21iaW5lIHJlc3VsdHMKc3VtbWFyeV9kYXRhIDwtIG1hcF9kZnIoZ3JvdXBzLCB+IHByb2Nlc3NfZ3JvdXAoLngsIGdlbmUudGIsIGJpbnMuMTBrYikpCgojIEFkZCB0aGUgYWRkaXRpb25hbCByb3dzIGZvciBkaXN0YW5jZUJpbiA9IDAKc3VtbWFyeV9kYXRhIDwtIHN1bW1hcnlfZGF0YSAlPiUKICBtdXRhdGUoZGlzdGFuY2VCaW4gPSBkaXN0YW5jZUJpbiArIDEpICU+JQogIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9ICJwc092ZXIwIikgJT4lCiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gInBzT3ZlcjEiKSAlPiUKICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSAicHNPdmVyMiIpICU+JQogIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9ICJwc092ZXIzIiklPiUKICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSAicHNPdmVyNCIpCgojIFBsb3QgdGhlIHJlc3VsdHMKcCA8LSBnZ3Bsb3Qoc3VtbWFyeV9kYXRhLCBhZXMoeCA9IGRpc3RhbmNlQmluLCB5ID0gbWVhbl9wZWFrX2NvdW50cywgY29sb3IgPSBncm91cCkpICsgCiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICBsYWJzKAogICAgeCA9ICJEaXN0YW5jZSBiaW4gKDEwa2IpIiwKICAgIHkgPSAiSDNLNG1lMyBwZWFrIGNvdW50IgogICkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC44LCAwLjgpICAjIE1vdmVzIGxlZ2VuZCBpbnNpZGUgdGhlIHBsb3QgKHgsIHkgcmVsYXRpdmUgY29vcmRpbmF0ZXMpCiAgKSArCiAgZ3VpZGVzKAogICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgKICAgICAga2V5d2lkdGggPSAwLjIsICAjIEFkanVzdCB0aGUgd2lkdGggb2YgdGhlIGxlZ2VuZCBrZXlzCiAgICAgIGtleWhlaWdodCA9IDAuMiAgIyBBZGp1c3QgdGhlIGhlaWdodCBvZiB0aGUgbGVnZW5kIGtleXMKICAgICkpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjNzc3Nzc3IiwgIiM4QjdFNjUiLCAiI0EyODQ1MiIsICIjQzI4ODREIiwgIiNGMjhFMkMiKSkKCmZpbGVOYW1lIDwtIHBhc3RlMCgiYmluUGVha0RlbnNpdHlfUkFEMjFfcHNHcm91cDExIikKd2lkdGggPC0gMzIqbW1Ub0luY2gKaGVpZ2h0IDwtIDM1Km1tVG9JbmNoCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgojIyMgUEUKcGVPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDQpKSRnZW5lCnBlT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAzLCBudW1fcGUgPCA0KSkkZ2VuZQpwZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmUKcGVPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDEsIG51bV9wZSA8IDIpKSRnZW5lCnBlT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA8IDEpKSRnZW5lCgojIExpc3Qgb2YgZ3JvdXBzIHRvIHByb2Nlc3MKZ3JvdXBzIDwtIGMoInBlT3ZlcjAiLCAicGVPdmVyMSIsICJwZU92ZXIyIiwgInBlT3ZlcjMiLCAicGVPdmVyNCIpCgojIFByb2Nlc3MgZWFjaCBncm91cCBhbmQgY29tYmluZSByZXN1bHRzCnN1bW1hcnlfZGF0YSA8LSBtYXBfZGZyKGdyb3VwcywgfiBwcm9jZXNzX2dyb3VwKC54LCBnZW5lLnRiLCBiaW5zLjEwa2IpKQoKIyBBZGQgdGhlIGFkZGl0aW9uYWwgcm93cyBmb3IgZGlzdGFuY2VCaW4gPSAwCnN1bW1hcnlfZGF0YSA8LSBzdW1tYXJ5X2RhdGEgJT4lCiAgbXV0YXRlKGRpc3RhbmNlQmluID0gZGlzdGFuY2VCaW4gKyAxKSAlPiUKICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSAicGVPdmVyMCIpICU+JQogIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9ICJwZU92ZXIxIikgJT4lCiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gInBlT3ZlcjIiKSAlPiUKICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSAicGVPdmVyMyIpJT4lCiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gInBlT3ZlcjQiKQoKIyBQbG90IHRoZSByZXN1bHRzCmdncGxvdChzdW1tYXJ5X2RhdGEsIGFlcyh4ID0gZGlzdGFuY2VCaW4sIHkgPSBtZWFuX3BlYWtfY291bnRzLCBjb2xvciA9IGdyb3VwKSkgKyAKICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsgeGxpbSgwLCAxMCkrCiAgbGFicygKICAgIHRpdGxlID0gIk1lYW4gUGVhayBDb3VudHMiLAogICAgeCA9ICJEaXN0YW5jZSBCaW4gKDEwIGtiKSIsCiAgICB5ID0gIk1lYW4gUGVhayBDb3VudHMiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKQogICkKCiMjIyMjIyMjIyMjIyMjIwpwcE92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gNCkpJGdlbmUKcHBPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDMsIG51bV9wcCA8IDQpKSRnZW5lCnBwT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAyLCBudW1fcHAgPCAzKSkkZ2VuZQpwcE92ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMSwgbnVtX3BwIDwgMikpJGdlbmUKcHBPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwIDwgMSkpJGdlbmUKCiMgTGlzdCBvZiBncm91cHMgdG8gcHJvY2Vzcwpncm91cHMgPC0gYygicHBPdmVyMCIsICJwcE92ZXIxIiwgInBwT3ZlcjIiLCAicHBPdmVyMyIsICJwcE92ZXI0IikKCiMgUHJvY2VzcyBlYWNoIGdyb3VwIGFuZCBjb21iaW5lIHJlc3VsdHMKc3VtbWFyeV9kYXRhIDwtIG1hcF9kZnIoZ3JvdXBzLCB+IHByb2Nlc3NfZ3JvdXAoLngsIGdlbmUudGIsIGJpbnMuMTBrYikpCgojIEFkZCB0aGUgYWRkaXRpb25hbCByb3dzIGZvciBkaXN0YW5jZUJpbiA9IDAKc3VtbWFyeV9kYXRhIDwtIHN1bW1hcnlfZGF0YSAlPiUKICBtdXRhdGUoZGlzdGFuY2VCaW4gPSBkaXN0YW5jZUJpbiArIDEpICU+JQogIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9ICJwcE92ZXIwIikgJT4lCiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gInBwT3ZlcjEiKSAlPiUKICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSAicHBPdmVyMiIpICU+JQogIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9ICJwcE92ZXIzIiklPiUKICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSAicHBPdmVyNCIpCgojIFBsb3QgdGhlIHJlc3VsdHMKZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSBkaXN0YW5jZUJpbiwgeSA9IG1lYW5fcGVha19jb3VudHMsIGNvbG9yID0gZ3JvdXApKSArIAogIGdlb21fbGluZShzaXplID0gMSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJNZWFuIFBlYWsgQ291bnRzIiwKICAgIHggPSAiRGlzdGFuY2UgQmluICgxMCBrYikiLAogICAgeSA9ICJNZWFuIFBlYWsgQ291bnRzIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykKICApCmBgYAojIyMgWzIuMzFdIFRlc3RpbmcgU0VzPwpgYGB7cn0KcGVhay5XaHl0ZS5TRSA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAic3VwZXJFbmhhbmNlcl9XaHl0ZV9FU0NfbW0xMC5iZWQiKSkKcGVhay5EeWxhbi5TRSA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAic3VwZXJFbmhhbmNlcl9EeWxhbl9FU0MuYmVkIikpCgoKCmZsYW5rU2l6ZSA8LSAwLjVlNgpnZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkIikpICU+JQogIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09ICIrIiwgVjIsIFYzKSwKICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLAogICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiUKICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kLCBWNiwgVjUpCmNvbG5hbWVzKGdlbmUudGIpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiLCAiZW5zZW1ibCIsICJnZW5lIikKCmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3YiKSkkZ2VuZQpnZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2IikpJGdlbmUKClRTUzFtYi5ncm91cDEuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdlbmUuZ3JvdXAxKSwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSkKVFNTMW1iLmdyb3VwMi5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihlbnNlbWJsICVpbiUgZ2VuZS5ncm91cDIpLCBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKQoKCmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhUU1MxbWIuZ3JvdXAxLmdyLCBwZWFrLldoeXRlLlNFKSkpKS9sZW5ndGgoZ2VuZS5ncm91cDEpKjEwMApsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoVFNTMW1iLmdyb3VwMi5nciwgcGVhay5XaHl0ZS5TRSkpKSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDAKCmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhUU1MxbWIuZ3JvdXAxLmdyLCBwZWFrLkR5bGFuLlNFKSkpKS9sZW5ndGgoZ2VuZS5ncm91cDEpKjEwMApsZW5ndGgodW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoVFNTMW1iLmdyb3VwMi5nciwgcGVhay5EeWxhbi5TRSkpKSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDAKCiNWaWV3KGFzX3RpYmJsZShUU1MxbWIuZ3JvdXAxLmdyW3VuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKFRTUzFtYi5ncm91cDEuZ3IsIHBlYWsuV2h5dGUuU0UpKSldKSkKI1ZpZXcoYXNfdGliYmxlKFRTUzFtYi5ncm91cDEuZ3JbdW5pcXVlKHF1ZXJ5SGl0cyhmaW5kT3ZlcmxhcHMoVFNTMW1iLmdyb3VwMS5nciwgcGVhay5EeWxhbi5TRSkpKV0pKQoKZ2VuZS5ncm91cDEuU0UgPC0gKGFzX3RpYmJsZShUU1MxbWIuZ3JvdXAxLmdyW3VuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKFRTUzFtYi5ncm91cDEuZ3IsIHBlYWsuRHlsYW4uU0UpKSldKSkkZW5zZW1ibApnZW5lLmdyb3VwMS5ub1NFIDwtIGdlbmUuZ3JvdXAxWyEoZ2VuZS5ncm91cDEgJWluJSBnZW5lLmdyb3VwMS5TRSldCgpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoVFNTMW1iLmdyb3VwMi5nciwgcGVhay5EeWxhbi5TRSkKdW5pcXVlX2hpdHMgPC0gdW5pcXVlKHF1ZXJ5SGl0cyhvdmVybGFwcykpCmdlbmUuZ3JvdXAyLlNFIDwtIGFzX3RpYmJsZShUU1MxbWIuZ3JvdXAyLmdyW3VuaXF1ZV9oaXRzXSkkZW5zZW1ibApnZW5lLmdyb3VwMi5ub1NFIDwtIGFzX3RpYmJsZShUU1MxbWIuZ3JvdXAyLmdyWy11bmlxdWVfaGl0c10pJGVuc2VtYmwKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWQiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gIisiLCBWMiwgVjMpLAogICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSAxZTYsCiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyAxZTYpICU+JQogIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY2LCBWNSkKY29sbmFtZXMoZ2VuZS50YikgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIsICJlbnNlbWJsIiwgImdlbmUiKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIExpc3Qgb2YgZ3JvdXBzIHRvIHByb2Nlc3MKZ3JvdXBzIDwtIGMoImdlbmUuZ3JvdXAxLlNFIiwgImdlbmUuZ3JvdXAxLm5vU0UiKQoKIyBQcm9jZXNzIGVhY2ggZ3JvdXAgYW5kIGNvbWJpbmUgcmVzdWx0cwpzdW1tYXJ5X2RhdGEgPC0gbWFwX2Rmcihncm91cHMsIH4gcHJvY2Vzc19ncm91cCgueCwgZ2VuZS50YiwgYmlucy4xMGtiKSkKCiMgQWRkIHRoZSBhZGRpdGlvbmFsIHJvd3MgZm9yIGRpc3RhbmNlQmluID0gMApzdW1tYXJ5X2RhdGEgPC0gc3VtbWFyeV9kYXRhICU+JQogIG11dGF0ZShkaXN0YW5jZUJpbiA9IGRpc3RhbmNlQmluICsgMSkgJT4lCiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gImdlbmUuZ3JvdXAxLlNFIikgJT4lCiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gImdlbmUuZ3JvdXAxLm5vU0UiKQoKIyBQbG90IHRoZSByZXN1bHRzCmdncGxvdChzdW1tYXJ5X2RhdGEsIGFlcyh4ID0gZGlzdGFuY2VCaW4sIHkgPSBtZWFuX3BlYWtfY291bnRzLCBjb2xvciA9IGdyb3VwKSkgKyAKICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICBsYWJzKAogICAgdGl0bGUgPSBwYXN0ZTAoIk1lYW4gUGVhayBDb3VudHMsICstIiwgZmxhbmtTaXplLCAiYnAsIFdoeXRlIFNFIiksCiAgICB4ID0gIkRpc3RhbmNlIEJpbiAoMTAga2IpIiwKICAgIHkgPSAiTWVhbiBQZWFrIENvdW50cyIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpCiAgKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIExpc3Qgb2YgZ3JvdXBzIHRvIHByb2Nlc3MKZ3JvdXBzIDwtIGMoImdlbmUuZ3JvdXAxLlNFIiwgImdlbmUuZ3JvdXAxLm5vU0UiLCAiZ2VuZS5ncm91cDIuU0UiLCAiZ2VuZS5ncm91cDIubm9TRSIpCgojIFByb2Nlc3MgZWFjaCBncm91cCBhbmQgY29tYmluZSByZXN1bHRzCnN1bW1hcnlfZGF0YSA8LSBtYXBfZGZyKGdyb3VwcywgfiBwcm9jZXNzX2dyb3VwKC54LCBnZW5lLnRiLCBiaW5zLjEwa2IpKQoKIyBBZGQgdGhlIGFkZGl0aW9uYWwgcm93cyBmb3IgZGlzdGFuY2VCaW4gPSAwCnN1bW1hcnlfZGF0YSA8LSBzdW1tYXJ5X2RhdGEgJT4lCiAgbXV0YXRlKGRpc3RhbmNlQmluID0gZGlzdGFuY2VCaW4gKyAxKSAlPiUKICAgIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9ICJnZW5lLmdyb3VwMS5TRSIpICU+JQogIGFkZF9yb3coZGlzdGFuY2VCaW4gPSAwLCBtZWFuX3BlYWtfY291bnRzID0gMCwgc2RfcGVha19jb3VudHMgPSAwLCBncm91cCA9ICJnZW5lLmdyb3VwMS5ub1NFIikgJT4lCiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gImdlbmUuZ3JvdXAyLlNFIikgJT4lCiAgYWRkX3JvdyhkaXN0YW5jZUJpbiA9IDAsIG1lYW5fcGVha19jb3VudHMgPSAwLCBzZF9wZWFrX2NvdW50cyA9IDAsIGdyb3VwID0gImdlbmUuZ3JvdXAyLm5vU0UiKQoKIyBQbG90IHRoZSByZXN1bHRzCmdncGxvdChzdW1tYXJ5X2RhdGEsIGFlcyh4ID0gZGlzdGFuY2VCaW4sIHkgPSBtZWFuX3BlYWtfY291bnRzLCBjb2xvciA9IGdyb3VwKSkgKyAKICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICBsYWJzKAogICAgdGl0bGUgPSBwYXN0ZTAoIk1lYW4gUGVhayBDb3VudHMsICstIiwgZmxhbmtTaXplLCAiYnAsIFdoeXRlIFNFIiksCiAgICB4ID0gIkRpc3RhbmNlIEJpbiAoMTAga2IpIiwKICAgIHkgPSAiTWVhbiBQZWFrIENvdW50cyIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpCiAgKQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTGlzdCBvZiBncm91cHMgdG8gcHJvY2Vzcwpncm91cHMgPC0gYygiZ2VuZS5ncm91cDIuU0UiLCAiZ2VuZS5ncm91cDIubm9TRSIpCgojIFByb2Nlc3MgZWFjaCBncm91cCBhbmQgY29tYmluZSByZXN1bHRzCnN1bW1hcnlfZGF0YSA8LSBtYXBfZGZyKGdyb3VwcywgfiBwcm9jZXNzX2dyb3VwKC54LCBnZW5lLnRiLCBiaW5zLjEwa2IpKQoKIyBBZGQgdGhlIGFkZGl0aW9uYWwgcm93cyBmb3IgZGlzdGFuY2VCaW4gPSAwCnN1bW1hcnlfZGF0YSA8LSBzdW1tYXJ5X2RhdGEgJT4lCiAgbXV0YXRlKGRpc3RhbmNlQmluID0gZGlzdGFuY2VCaW4gKyAxKSAlPiUKICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSAiZ2VuZS5ncm91cDIuU0UiKSAlPiUKICBhZGRfcm93KGRpc3RhbmNlQmluID0gMCwgbWVhbl9wZWFrX2NvdW50cyA9IDAsIHNkX3BlYWtfY291bnRzID0gMCwgZ3JvdXAgPSAiZ2VuZS5ncm91cDIubm9TRSIpCgojIFBsb3QgdGhlIHJlc3VsdHMKZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSBkaXN0YW5jZUJpbiwgeSA9IG1lYW5fcGVha19jb3VudHMsIGNvbG9yID0gZ3JvdXApKSArIAogIGdlb21fbGluZShzaXplID0gMSkgKwogIGxhYnMoCiAgICB0aXRsZSA9IHBhc3RlMCgiTWVhbiBQZWFrIENvdW50cywgKy0iLCBmbGFua1NpemUsICJicCwgV2h5dGUgU0UiKSwKICAgIHggPSAiRGlzdGFuY2UgQmluICgxMCBrYikiLAogICAgeSA9ICJNZWFuIFBlYWsgQ291bnRzIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykKICApCgojIyBDaGVja2luZyBQLVMgaW4gdGhlIHN1YnNldCBvZiBnZW5lcwoKcmVzdWx0RGlyIDwtIGhlcmUoIi4uLy4uL3Jlc3VsdCIpCnRlbXAyIDwtIHJlYWRSRFMoaGVyZShyZXN1bHREaXIsICJnZW5lX2xvb3BfbGluay5yZHMiKSkKCnRlbXAzIDwtIHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmUgJWluJSBjKGdlbmUuZ3JvdXAxKSkgJT4lCiAgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihnZW5lICVpbiUgZ2VuZS5ncm91cDEuU0UgfiAiU0UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJub1NFIikpCgoKZ2dwbG90KHRlbXAzLCBhZXMoeCA9IGdyb3VwLCB5ID0gbnVtX3BzKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGdyb3VwKSkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEpICsgdGhlbWVfY2xhc3NpYygpCgpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkbnVtX3BwCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJG51bV9wcAogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCgpnZXRQdmFsV2lsY294KHRlbXAzLCAibm9TRSIsICJTRSIpCmBgYAoKIyMjIFsyLjMyXSBDaGVja2luZyBkaXJlY3Rpb25hbGl0eQpgYGB7cn0KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKZGlmZkN1dG9mZiA8LSAwLjIKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYpJT4lIAogIGRwbHlyOjptdXRhdGUoZGlzdGFuY2UgPSBzdGFydDIgLSBzdGFydDEpCgoKZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgdW5uZXN0KGdlbmUpCgoKZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgIm1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSAiKyIsIFYyLCBWMykpICU+JQogIGRwbHlyOjpzZWxlY3QoVjYsIFRTUykKY29sbmFtZXMoZ2VuZS50YikgPC0gYygiZW5zZW1ibCIsICJUU1MiKQoKCmdlbmVBbm5vRGF0YSAgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKGdlbmUudGIsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibCIpKQoKZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2LCAyOSwgMzEsIDM1KSkgJT4lCiAgcm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUoZGlzdFRvQW5jaG9yMSA9IChzdGFydDEgKyBlbmQxKS8yIC0gVFNTLAogICAgICAgICAgICAgICAgZGlzdFRvQW5jaG9yMiA9IChzdGFydDIgKyBlbmQyKS8yIC0gVFNTLAogICAgICAgICAgICAgICAgZGlzdFRvQW5jaG9yID0gaWZfZWxzZShhYnMoZGlzdFRvQW5jaG9yMSkgPiBhYnMoZGlzdFRvQW5jaG9yMiksIGRpc3RUb0FuY2hvcjEsIGRpc3RUb0FuY2hvcjIpLAogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gaWZfZWxzZShkaXN0VG9BbmNob3IgPiAwLCAicmlnaHQiLCAibGVmdCIpKQoKZGF0YS5kaXJlY3Rpb25hbGl0eSA8LSBkYXRhICU+JSBncm91cF9ieShnZW5lKSAlPiUKICBzdW1tYXJpc2UoY291bnQgPSBuKCksCiAgICAgICAgICAgIG5fcmlnaHQgPSBzdW0oZGlyZWN0aW9uID09ICJyaWdodCIpLAogICAgICAgICAgICBuX2xlZnQgPSBzdW0oZGlyZWN0aW9uID09ICJsZWZ0IikpICU+JQogIGRwbHlyOjpmaWx0ZXIoY291bnQgPiAxKSAlPiUKICBkcGx5cjo6bXV0YXRlKG4gPSBuX3JpZ2h0ICsgbl9sZWZ0LAogICAgICAgICAgICAgICAgZGlyZWN0aW9uYWxpdHkgPSBhYnMoKG5fcmlnaHQgLSBuX2xlZnQpL24pKQoKCiNnZ3Bsb3QoZGF0YS5kaXJlY3Rpb25hbGl0eSwgYWVzKHggPSBkaXJlY3Rpb25hbGl0eSkpICsgZ2VvbV9oaXN0b2dyYW0oKSArIHRoZW1lX2NsYXNzaWMoKQoKCmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3YiKSkkZ2VuZQpnZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2IikpJGdlbmUKCnRlbXAgPC0gZGF0YS5kaXJlY3Rpb25hbGl0eSAlPiUgZHBseXI6OmZpbHRlcihnZW5lICVpbiUgYyhnZW5lLmdyb3VwMSwgZ2VuZS5ncm91cDIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gaWZfZWxzZShnZW5lICVpbiUgZ2VuZS5ncm91cDEsICJncm91cDEiLCAiZ3JvdXAyIikpCgoKZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaXJlY3Rpb25hbGl0eSkpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUoIlAtUyIpICsKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNQUwoKZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGRpcmVjdGlvbmFsaXR5CiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGRpcmVjdGlvbmFsaXR5CiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKCnJlc3VsdERpciA8LSBoZXJlKCIuLi8uLi9yZXN1bHQiKQp0ZW1wMiA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCAiZ2VuZV9sb29wX2xpbmsucmRzIikpCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKcHNPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDQpKSRnZW5lCnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZQpwc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMiwgbnVtX3BzIDwgMykpJGdlbmUKcHNPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDEsIG51bV9wcyA8IDIpKSRnZW5lCnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lCgp0ZW1wIDwtIGRhdGEuZGlyZWN0aW9uYWxpdHkgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZSAlaW4lIGMocHNPdmVyMCwgcHNPdmVyMSwgcHNPdmVyMiwgcHNPdmVyMywgcHNPdmVyNCkpICU+JQogIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oZ2VuZSAlaW4lIHBzT3ZlcjAgfiAicHNPdmVyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHNPdmVyMSB+ICJwc092ZXIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIyIH4gInBzT3ZlcjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBzT3ZlcjMgfiAicHNPdmVyMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHNPdmVyNCB+ICJwc092ZXI0IikpCgpwMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMyIsICJwc092ZXI0IiksIDUpCnAyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIyIiwgInBzT3ZlcjMiKSwgNSkKcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBzT3ZlcjEiLCAicHNPdmVyMiIpLCA1KQpwMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHNPdmVyMCIsICJwc092ZXIxIiksIDUpCnAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwc092ZXIwIiwgInBzT3ZlcjQiKSwgNSkKCgoKZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaXJlY3Rpb25hbGl0eSkpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUoIlAtTiIpICsKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoInAzNDogIiwgY29udlB2YWx1ZShwMzQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDIzOiAiLCBjb252UHZhbHVlKHAyMyksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAwMTogIiwgY29udlB2YWx1ZShwMDEpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDA0OiAiLCBjb252UHZhbHVlKHAwNCksICJcbiIpLAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyBwZQoKcGVPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDQpKSRnZW5lCnBlT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAzLCBudW1fcGUgPCA0KSkkZ2VuZQpwZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmUKcGVPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDEsIG51bV9wZSA8IDIpKSRnZW5lCnBlT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA8IDEpKSRnZW5lCgp0ZW1wIDwtIGRhdGEuZGlyZWN0aW9uYWxpdHkgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZSAlaW4lIGMocGVPdmVyMCwgcGVPdmVyMSwgcGVPdmVyMiwgcGVPdmVyMywgcGVPdmVyNCkpICU+JQogIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oZ2VuZSAlaW4lIHBlT3ZlcjAgfiAicGVPdmVyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcGVPdmVyMSB+ICJwZU92ZXIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIyIH4gInBlT3ZlcjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBlT3ZlcjMgfiAicGVPdmVyMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcGVPdmVyNCB+ICJwZU92ZXI0IikpCgpwMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicGVPdmVyMyIsICJwZU92ZXI0IiksIDUpCnAyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwZU92ZXIyIiwgInBlT3ZlcjMiKSwgNSkKcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBlT3ZlcjEiLCAicGVPdmVyMiIpLCA1KQpwMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicGVPdmVyMCIsICJwZU92ZXIxIiksIDUpCnAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwZU92ZXIwIiwgInBlT3ZlcjQiKSwgNSkKCgoKZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaXJlY3Rpb25hbGl0eSkpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUoIlAtTiIpICsKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoInAzNDogIiwgY29udlB2YWx1ZShwMzQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDIzOiAiLCBjb252UHZhbHVlKHAyMyksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAwMTogIiwgY29udlB2YWx1ZShwMDEpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDA0OiAiLCBjb252UHZhbHVlKHAwNCksICJcbiIpLAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyBwcAoKcHBPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDQpKSRnZW5lCnBwT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAzLCBudW1fcHAgPCA0KSkkZ2VuZQpwcE92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmUKcHBPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDEsIG51bV9wcCA8IDIpKSRnZW5lCnBwT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA8IDEpKSRnZW5lCgp0ZW1wIDwtIGRhdGEuZGlyZWN0aW9uYWxpdHkgJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZSAlaW4lIGMocHBPdmVyMCwgcHBPdmVyMSwgcHBPdmVyMiwgcHBPdmVyMywgcHBPdmVyNCkpICU+JQogIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oZ2VuZSAlaW4lIHBwT3ZlcjAgfiAicHBPdmVyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHBPdmVyMSB+ICJwcE92ZXIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXIyIH4gInBwT3ZlcjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBwT3ZlcjMgfiAicHBPdmVyMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHBPdmVyNCB+ICJwcE92ZXI0IikpCgpwMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHBPdmVyMyIsICJwcE92ZXI0IiksIDUpCnAyMyA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwcE92ZXIyIiwgInBwT3ZlcjMiKSwgNSkKcDEyIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBwT3ZlcjEiLCAicHBPdmVyMiIpLCA1KQpwMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicHBPdmVyMCIsICJwcE92ZXIxIiksIDUpCnAwNCA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwcE92ZXIwIiwgInBwT3ZlcjQiKSwgNSkKCgoKZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaXJlY3Rpb25hbGl0eSkpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUoIlAtTiIpICsKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDAuNSwgbGFiZWwgPSBwYXN0ZTAoInAzNDogIiwgY29udlB2YWx1ZShwMzQpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDIzOiAiLCBjb252UHZhbHVlKHAyMyksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAwMTogIiwgY29udlB2YWx1ZShwMDEpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDA0OiAiLCBjb252UHZhbHVlKHAwNCksICJcbiIpLAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBzaXplID0gMykKCgpgYGAKCiMjIyBbMi4zM10gQ2hlY2tpbmcgZ3VpZGFuY2UKYGBge3J9Cm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmRpZmZDdXRvZmYgPC0gMC4yCmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIl9wLW5fZW5zZW1ibExpc3QudHN2IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmKSU+JSAKICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKQoKZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgdW5uZXN0KGdlbmUpCgpnZW5lLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkIikpICU+JQogIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09ICIrIiwgVjIsIFYzKSkgJT4lCiAgZHBseXI6OnNlbGVjdChWNiwgVFNTKQpjb2xuYW1lcyhnZW5lLnRiKSA8LSBjKCJlbnNlbWJsIiwgIlRTUyIpCgoKZ2VuZUFubm9EYXRhICA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4oZ2VuZS50YiwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsIikpCgpkYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMsIDQsIDUsIDYsIDI5LCAzMSwgMzUpKSAlPiUKICByb3d3aXNlKCkgJT4lCiAgZHBseXI6Om11dGF0ZShkaXN0VG9BbmNob3IxID0gKHN0YXJ0MSArIGVuZDEpLzIgLSBUU1MsCiAgICAgICAgICAgICAgICBkaXN0VG9BbmNob3IyID0gKHN0YXJ0MiArIGVuZDIpLzIgLSBUU1MsCiAgICAgICAgICAgICAgICBkaXN0VG9BbmNob3IgPSBpZl9lbHNlKGFicyhkaXN0VG9BbmNob3IxKSA+IGFicyhkaXN0VG9BbmNob3IyKSwgZGlzdFRvQW5jaG9yMSwgZGlzdFRvQW5jaG9yMiksCiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBpZl9lbHNlKGRpc3RUb0FuY2hvciA+IDAsICJyaWdodCIsICJsZWZ0IikpCgoKcmVzdWx0IDwtIGRhdGEgJT4lCiAgZ3JvdXBfYnkoZ2VuZSwgZGlyZWN0aW9uKSAlPiUKICBtdXRhdGUoZGlzdFRvQW5jaG9yID0gYWJzKGRpc3RUb0FuY2hvcikpICU+JQogIG11dGF0ZShtYXhfZGlzdF9QX1MgPSBpZmVsc2UoYW55KEFubm8yID09ICJQLVMiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoZGlzdFRvQW5jaG9yW0Fubm8yID09ICJQLVMiXSwgbmEucm0gPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpICU+JQogIG11dGF0ZShpc19zbWFsbGVyID0gaWZlbHNlKGlzLm5hKG1heF9kaXN0X1BfUyksIE5BLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGlzdFRvQW5jaG9yID09IG1heF9kaXN0X1BfUywgTkEsIGRpc3RUb0FuY2hvciA8IG1heF9kaXN0X1BfUykpKSAlPiUKICB1bmdyb3VwKCkKCgoKcmVzdWx0MiA8LSByZXN1bHQgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGlzX3NtYWxsZXIpKQoKcmVzdWx0MyA8LSByZXN1bHQyICU+JSBncm91cF9ieShnZW5lLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcml6ZShjb3VudF90cnVlID0gc3VtKGlzX3NtYWxsZXIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGNvdW50X2ZhbHNlID0gc3VtKGlzX3NtYWxsZXIgPT0gRkFMU0UsIG5hLnJtID0gVFJVRSkpICU+JQogIGRwbHlyOjptdXRhdGUoY291bnQgPSBjb3VudF90cnVlICsgY291bnRfZmFsc2UsCiAgICAgICAgICAgICAgICBwZXJjID0gY291bnRfdHJ1ZS9jb3VudCoxMDApICU+JQogIGRwbHlyOjpzZWxlY3QoZ2VuZSwgZGlyZWN0aW9uLCBwZXJjKQoKcmVzdWx0MyA8LSByZXN1bHQzICU+JSBncm91cF9ieShnZW5lKSAlPiUgc3VtbWFyaXplKHBlcmMgPSBtZWFuKHBlcmMpKQoKIyMjIyMjIyBET2luZyB0aGlzIGZvciBQLVMgZ3JvdXBzCnJlc3VsdERpciA8LSBoZXJlKCIuLi8uLi9yZXN1bHQiKQp0ZW1wMiA8LSByZWFkUkRTKGhlcmUocmVzdWx0RGlyLCAiZ2VuZV9sb29wX2xpbmsucmRzIikpCgpwc092ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gNCkpJGdlbmUKcHNPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDMsIG51bV9wcyA8IDQpKSRnZW5lCnBzT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAyLCBudW1fcHMgPCAzKSkkZ2VuZQpwc092ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMSwgbnVtX3BzIDwgMikpJGdlbmUKcHNPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzIDwgMSkpJGdlbmUKCgpyZXN1bHQ0IDwtIHJlc3VsdDMgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oZ2VuZSAlaW4lIHBzT3ZlcjAgfiAicHNPdmVyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBzT3ZlcjEgfiAicHNPdmVyMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBzT3ZlcjIgfiAicHNPdmVyMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBzT3ZlcjMgfiAicHNPdmVyMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBzT3ZlcjQgfiAicHNPdmVyNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSkgJT4lCiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKQoKCmdncGxvdChyZXN1bHQ0LCBhZXMoeCA9ICBncm91cCwgeSA9IHBlcmMpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjA1KSArIHRoZW1lX2NsYXNzaWMoKSArCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikKCiMjIyMjIyMgRE9pbmcgdGhpcyBmb3IgUC1FIGdyb3VwcwpwZU92ZXI0IDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gNCkpJGdlbmUKcGVPdmVyMyA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDMsIG51bV9wZSA8IDQpKSRnZW5lCnBlT3ZlcjIgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAyLCBudW1fcGUgPCAzKSkkZ2VuZQpwZU92ZXIxIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMSwgbnVtX3BlIDwgMikpJGdlbmUKcGVPdmVyMCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlIDwgMSkpJGdlbmUKCgpyZXN1bHQ0IDwtIHJlc3VsdDMgJT4lIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oZ2VuZSAlaW4lIHBlT3ZlcjAgfiAicGVPdmVyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBlT3ZlcjEgfiAicGVPdmVyMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBlT3ZlcjIgfiAicGVPdmVyMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBlT3ZlcjMgfiAicGVPdmVyMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZSAlaW4lIHBlT3ZlcjQgfiAicGVPdmVyNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSkgJT4lCiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKQoKCmdncGxvdChyZXN1bHQ0LCBhZXMoeCA9ICBncm91cCwgeSA9IHBlcmMpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjA1KSArIHRoZW1lX2NsYXNzaWMoKSArCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikKCiMjIyMjIyMgRE9pbmcgdGhpcyBmb3IgUC1QIGdyb3VwcwoKcHBPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDQpKSRnZW5lCnBwT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAzLCBudW1fcHAgPCA0KSkkZ2VuZQpwcE92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMiwgbnVtX3BwIDwgMykpJGdlbmUKcHBPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDEsIG51bV9wcCA8IDIpKSRnZW5lCnBwT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA8IDEpKSRnZW5lCgoKcmVzdWx0NCA8LSByZXN1bHQzICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGdlbmUgJWluJSBwcE92ZXIwIH4gInBwT3ZlcjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXIxIH4gInBwT3ZlcjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXIyIH4gInBwT3ZlcjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXIzIH4gInBwT3ZlcjMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwcE92ZXI0IH4gInBwT3ZlcjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JQogIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSkKCgpnZ3Bsb3QocmVzdWx0NCwgYWVzKHggPSAgZ3JvdXAsIHkgPSBwZXJjKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4wNSkgKyB0aGVtZV9jbGFzc2ljKCkgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpCgoKYGBgCgpgYGB7cn0KCnJlc3VsdCA8LSBkYXRhICU+JQogIGdyb3VwX2J5KGdlbmUsIGRpcmVjdGlvbikgJT4lCiAgbXV0YXRlKGRpc3RUb0FuY2hvciA9IGFicyhkaXN0VG9BbmNob3IpKSAlPiUKICBtdXRhdGUobWF4X2Rpc3RfUF9TID0gaWZlbHNlKGFueShBbm5vMiA9PSAiUC1TIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KGRpc3RUb0FuY2hvcltBbm5vMiA9PSAiUC1TIl0sIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKQpyZXN1bHQgPC0gcmVzdWx0ICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICE9ICJQLVMiKSAlPiUKICBtdXRhdGUoaXNfc21hbGxlciA9IGlmZWxzZShpcy5uYShtYXhfZGlzdF9QX1MpLCBOQSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRpc3RUb0FuY2hvciA9PSBtYXhfZGlzdF9QX1MsIE5BLCBkaXN0VG9BbmNob3IgPCBtYXhfZGlzdF9QX1MpKSkgJT4lCiAgdW5ncm91cCgpCgoKCnJlc3VsdDIgPC0gcmVzdWx0ICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShpc19zbWFsbGVyKSkKCnJlc3VsdDMgPC0gcmVzdWx0MiAlPiUgZ3JvdXBfYnkoZ2VuZSwgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpemUoY291bnRfdHJ1ZSA9IHN1bShpc19zbWFsbGVyLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBjb3VudF9mYWxzZSA9IHN1bShpc19zbWFsbGVyID09IEZBTFNFLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGNvdW50ID0gY291bnRfdHJ1ZSArIGNvdW50X2ZhbHNlLAogICAgICAgICAgICAgICAgcGVyYyA9IGNvdW50X3RydWUvY291bnQqMTAwKSAlPiUKICBkcGx5cjo6c2VsZWN0KGdlbmUsIGRpcmVjdGlvbiwgcGVyYykKCnJlc3VsdDMgPC0gcmVzdWx0MyAlPiUgZ3JvdXBfYnkoZ2VuZSkgJT4lIHN1bW1hcml6ZShwZXJjID0gbWVhbihwZXJjKSkKCiMjIyMjIyMgRE9pbmcgdGhpcyBmb3IgUC1TIGdyb3VwcwpyZXN1bHREaXIgPC0gaGVyZSgiLi4vLi4vcmVzdWx0IikKdGVtcDIgPC0gcmVhZFJEUyhoZXJlKHJlc3VsdERpciwgImdlbmVfbG9vcF9saW5rLnJkcyIpKQoKcHNPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDQpKSRnZW5lCnBzT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA+PSAzLCBudW1fcHMgPCA0KSkkZ2VuZQpwc092ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHMgPj0gMiwgbnVtX3BzIDwgMykpJGdlbmUKcHNPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BzID49IDEsIG51bV9wcyA8IDIpKSRnZW5lCnBzT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcyA8IDEpKSRnZW5lCgoKcmVzdWx0NCA8LSByZXN1bHQzICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGdlbmUgJWluJSBwc092ZXIwIH4gInBzT3ZlcjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIxIH4gInBzT3ZlcjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIyIH4gInBzT3ZlcjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXIzIH4gInBzT3ZlcjMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwc092ZXI0IH4gInBzT3ZlcjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JQogIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSkKCgpnZ3Bsb3QocmVzdWx0NCwgYWVzKHggPSAgZ3JvdXAsIHkgPSBwZXJjKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4wNSkgKyB0aGVtZV9jbGFzc2ljKCkgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpCgojIyMjIyMjIERPaW5nIHRoaXMgZm9yIFAtRSBncm91cHMKcGVPdmVyNCA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDQpKSRnZW5lCnBlT3ZlcjMgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA+PSAzLCBudW1fcGUgPCA0KSkkZ2VuZQpwZU92ZXIyIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcGUgPj0gMiwgbnVtX3BlIDwgMykpJGdlbmUKcGVPdmVyMSA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BlID49IDEsIG51bV9wZSA8IDIpKSRnZW5lCnBlT3ZlcjAgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wZSA8IDEpKSRnZW5lCgoKcmVzdWx0NCA8LSByZXN1bHQzICU+JSBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGdlbmUgJWluJSBwZU92ZXIwIH4gInBlT3ZlcjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIxIH4gInBlT3ZlcjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIyIH4gInBlT3ZlcjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXIzIH4gInBlT3ZlcjMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUgJWluJSBwZU92ZXI0IH4gInBlT3ZlcjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQSkpICU+JQogIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSkKCgpnZ3Bsb3QocmVzdWx0NCwgYWVzKHggPSAgZ3JvdXAsIHkgPSBwZXJjKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4wNSkgKyB0aGVtZV9jbGFzc2ljKCkgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpCgojIyMjIyMjIERPaW5nIHRoaXMgZm9yIFAtUCBncm91cHMKCnBwT3ZlcjQgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSA0KSkkZ2VuZQpwcE92ZXIzIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPj0gMywgbnVtX3BwIDwgNCkpJGdlbmUKcHBPdmVyMiA8LSAodGVtcDIgJT4lIGRwbHlyOjpmaWx0ZXIobnVtX3BwID49IDIsIG51bV9wcCA8IDMpKSRnZW5lCnBwT3ZlcjEgPC0gKHRlbXAyICU+JSBkcGx5cjo6ZmlsdGVyKG51bV9wcCA+PSAxLCBudW1fcHAgPCAyKSkkZ2VuZQpwcE92ZXIwIDwtICh0ZW1wMiAlPiUgZHBseXI6OmZpbHRlcihudW1fcHAgPCAxKSkkZ2VuZQoKCnJlc3VsdDQgPC0gcmVzdWx0MyAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihnZW5lICVpbiUgcHBPdmVyMCB+ICJwcE92ZXIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHBPdmVyMSB+ICJwcE92ZXIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHBPdmVyMiB+ICJwcE92ZXIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHBPdmVyMyB+ICJwcE92ZXIzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lICVpbiUgcHBPdmVyNCB+ICJwcE92ZXI0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpCgoKZ2dwbG90KHJlc3VsdDQsIGFlcyh4ID0gIGdyb3VwLCB5ID0gcGVyYykpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMDUpICsgdGhlbWVfY2xhc3NpYygpICsKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKQoKYGBgCgojIyMgWzIuMzRdIENoZWNraW5nIENUQ0YgbW90aWYgb3JpZW50YXRpb24KIyMjIyBDYWxjdWxhdGluZyBDVENGIG1vdGlmCmBgYHtyfQpwZWFrLkNUQ0YgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgIjMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZCIpKQoKbGlicmFyeShCU2dlbm9tZS5NbXVzY3VsdXMuVUNTQy5tbTEwKQoKIyBFeHRyYWN0IHNlcXVlbmNlcwpzZXF1ZW5jZXMgPC0gZ2V0U2VxKEJTZ2Vub21lLk1tdXNjdWx1cy5VQ1NDLm1tMTAsIHBlYWsuQ1RDRikKCgojIEdldCB0aGUgQ1RDRiBtb3RpZiAob3IgcHJvdmlkZSB5b3VyIG93biBQV00pCmN0Y2ZfbW90aWYgPC0gcXVlcnkoTW90aWZEYiwgYygiQ1RDRiIsICJNbXVzY3VsdXMiKSlbWzFdXQoKIyBTY2FuIGZvciB0aGUgbW90aWYKbW90aWZfaGl0cyA8LSBsYXBwbHkoc2VxdWVuY2VzLCBmdW5jdGlvbihzZXEpIHsKICAgIG1hdGNoUFdNKGN0Y2ZfbW90aWYsIHNlcSwgbWluLnNjb3JlID0gIjgwJSIpICMgQWRqdXN0IG1pbi5zY29yZSBhcyBuZWVkZWQKfSkKCm1vdGlmX2hpdHNfcmV2ZXJzZSA8LSBsYXBwbHkoc2VxdWVuY2VzLCBmdW5jdGlvbihzZXEpIHsKICAgIG1hdGNoUFdNKGN0Y2ZfbW90aWYsIHJldmVyc2VDb21wbGVtZW50KHNlcSksIG1pbi5zY29yZSA9ICI4MCUiKQp9KQoKIyBDb21iaW5lIHJlc3VsdHMKcmVzdWx0IDwtIG1hcHBseShmdW5jdGlvbihmd2QsIHJldikgewogICAgbGlzdChmb3J3YXJkID0gZndkLCByZXZlcnNlID0gcmV2KQp9LCBtb3RpZl9oaXRzLCBtb3RpZl9oaXRzX3JldmVyc2UsIFNJTVBMSUZZID0gRkFMU0UpCgoKcmVzdWx0W1s1XV0KCgpyZXN1bHRfdGliYmxlIDwtIHRpYmJsZSgKICAgIHBlYWtfaWQgPSBzZXFfYWxvbmcocmVzdWx0KSwgIyBDcmVhdGUgYW4gaWRlbnRpZmllciBmb3IgZWFjaCBwZWFrCiAgICBhbGlnbm1lbnQgPSBtYXBfY2hyKHJlc3VsdCwgZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgaGFzX2Z3ZCA8LSBsZW5ndGgocmVzJGZvcndhcmQpID4gMAogICAgICAgIGhhc19yZXYgPC0gbGVuZ3RoKHJlcyRyZXZlcnNlKSA+IDAKICAgICAgICAKICAgICAgICBpZiAoaGFzX2Z3ZCAmJiBoYXNfcmV2KSAiZndkcmV2IgogICAgICAgIGVsc2UgaWYgKGhhc19md2QpICJmd2QiCiAgICAgICAgZWxzZSBpZiAoaGFzX3JldikgInJldiIKICAgICAgICBlbHNlICJub25lIgogICAgfSkKKQoKdGVtcCA8LSBhc190aWJibGUocGVhay5DVENGKSAlPiUgYmluZF9jb2xzKHJlc3VsdF90aWJibGUpICU+JQogIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQsIGFsaWdubWVudCkKCmZ3cml0ZSh0ZW1wLCBoZXJlKHJlZkRpciwgIjMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLm1vdGlmQW5ub3RhdGVkLmJlZCIpLCBjb2wubmFtZXMgPSBGQUxTRSwgc2VwID0gIlx0IikKYGBgCiMjIyMgQ29tcGFyaW5nIGl0IHRvIFRTUwpgYGB7cn0KY3RjZi5wZWFrIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsubW90aWZBbm5vdGF0ZWQuYmVkIikpCmNvbG5hbWVzKGN0Y2YucGVhaykgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIsICJtb3RpZiIpCmN0Y2YucGVhay5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoY3RjZi5wZWFrLCBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKQoKCmZsYW5rU2l6ZSA8LSAxCmdlbmUuVFNTLnRiIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAibW0xMF9HUkNtMzgucDZfZ2VuZV9zb3J0ZWQuYmVkIikpICU+JQogIGRwbHlyOjptdXRhdGUoVFNTID0gaWZlbHNlKFY0ID09ICIrIiwgVjIsIFYzKSwKICAgICAgICAgICAgICAgIFRTU3N0YXJ0ID0gVFNTIC0gZmxhbmtTaXplLAogICAgICAgICAgICAgICAgVFNTZW5kID0gVFNTICsgZmxhbmtTaXplKSAlPiUKICBkcGx5cjo6c2VsZWN0KFYxLCBUU1NzdGFydCwgVFNTZW5kLCBWNCwgVjUsIFY2KQpjb2xuYW1lcyhnZW5lLlRTUy50YikgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiZ2VuZSIsICJlbnNlbWJsIikKCnRzcy5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS5UU1MudGIsIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpCgpmd2RfcGVha3MgPC0gY3RjZi5wZWFrLmdyW2N0Y2YucGVhay5nciRtb3RpZiAlaW4lIGMoImZ3ZCIsICJmd2RyZXYiKV0KcmV2X3BlYWtzIDwtIGN0Y2YucGVhay5ncltjdGNmLnBlYWsuZ3IkbW90aWYgJWluJSBjKCJyZXYiLCAiZndkcmV2IildCgojIEZpbmQgY29udmVyZ2VudCBDVENGIHBhaXJzIGZvciBlYWNoIFRTUwpjb252ZXJnZW50X3BhaXJzIDwtIGxhcHBseShzZXFfYWxvbmcodHNzLmdyKSwgZnVuY3Rpb24oaSkgewogICAgY3VycmVudF90c3MgPC0gdHNzLmdyW2ldCiAgICAKICAgICMgRmlsdGVyIHBlYWtzIG9uIHRoZSBzYW1lIGNocm9tb3NvbWUgYXMgdGhlIFRTUwogICAgZndkX3BlYWtzX2NociA8LSBmd2RfcGVha3NbYXMuY2hhcmFjdGVyKHNlcW5hbWVzKGZ3ZF9wZWFrcykpID09IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhjdXJyZW50X3RzcykpXQogICAgcmV2X3BlYWtzX2NociA8LSByZXZfcGVha3NbYXMuY2hhcmFjdGVyKHNlcW5hbWVzKHJldl9wZWFrcykpID09IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhjdXJyZW50X3RzcykpXQogICAgCiAgICAjIEZpbmQgdGhlIGNsb3Nlc3QgZm9yd2FyZCBwZWFrIHRvIHRoZSBsZWZ0IG9mIHRoZSBUU1MKICAgIGxlZnRfZndkIDwtIGZ3ZF9wZWFrc19jaHJbc3RhcnQoZndkX3BlYWtzX2NocikgPCBzdGFydChjdXJyZW50X3RzcyldCiAgICBjbG9zZXN0X2Z3ZCA8LSBpZiAobGVuZ3RoKGxlZnRfZndkKSA+IDApIHsKICAgICAgbGVmdF9md2Rbd2hpY2gubWF4KHN0YXJ0KGxlZnRfZndkKSldCiAgICB9IGVsc2UgewogICAgICBOQQogICAgfQogICAgCiAgICAjIEZpbmQgdGhlIGNsb3Nlc3QgcmV2ZXJzZSBwZWFrIHRvIHRoZSByaWdodCBvZiB0aGUgVFNTCiAgICByaWdodF9yZXYgPC0gcmV2X3BlYWtzX2NocltzdGFydChyZXZfcGVha3NfY2hyKSA+IHN0YXJ0KGN1cnJlbnRfdHNzKV0KICAgIGNsb3Nlc3RfcmV2IDwtIGlmIChsZW5ndGgocmlnaHRfcmV2KSA+IDApIHsKICAgICAgcmlnaHRfcmV2W3doaWNoLm1pbihzdGFydChyaWdodF9yZXYpKV0KICAgIH0gZWxzZSB7CiAgICAgIE5BCiAgICB9CiAgICAKICAgICMgQ29tYmluZSByZXN1bHRzIGlmIGJvdGggY2xvc2VzdCBwZWFrcyBleGlzdAogICAgaWYgKCFpcy5uYShjbG9zZXN0X2Z3ZCkgJiYgIWlzLm5hKGNsb3Nlc3RfcmV2KSkgewogICAgICAgIHRpYmJsZSgKICAgICAgICAgIGNocm9tMSA9IGFzLmNoYXJhY3RlcihzZXFuYW1lcyhjbG9zZXN0X2Z3ZCkpLAogICAgICAgICAgc3RhcnQxID0gc3RhcnQoY2xvc2VzdF9md2QpLAogICAgICAgICAgZW5kMSA9IGVuZChjbG9zZXN0X2Z3ZCksCiAgICAgICAgICBjaHJvbTIgPSBhcy5jaGFyYWN0ZXIoc2VxbmFtZXMoY2xvc2VzdF9yZXYpKSwKICAgICAgICAgIHN0YXJ0MiA9IHN0YXJ0KGNsb3Nlc3RfcmV2KSwKICAgICAgICAgIGVuZDIgPSBlbmQoY2xvc2VzdF9yZXYpLAogICAgICAgICAgZW5zZW1ibCA9IGN1cnJlbnRfdHNzJGVuc2VtYmwsCiAgICAgICAgKQogICAgfSBlbHNlIHsKICAgICAgICBOVUxMCiAgICB9Cn0pCgojIENvbWJpbmUgcmVzdWx0cyBpbnRvIGEgdGliYmxlCnJlc3VsdF90aWJibGUgPC0gYmluZF9yb3dzKGNvbnZlcmdlbnRfcGFpcnMpCgpmd3JpdGUocmVzdWx0X3RpYmJsZSwgaGVyZShyZWZEaXIsICJ0c3NfY29udmVyZ2VudF9jdGNmX21vdGlmX3BhaXJzLmJlZHBlIiksIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFKQpmd3JpdGUoZ2VuZS5UU1MudGIgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA1KSksIGhlcmUocmVmRGlyLCAidHNzXzJicC5iZWQiKSwgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gRkFMU0UpCgp0ZW1wIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAidHNzX2NvbnZlcmdlbnRfY3RjZl9tb3RpZl9wYWlycy5iZWRwZSIpKSAlPiUgZHBseXI6OmZpbHRlcihWNyA9PSAiS2xmNCIpCgpmd3JpdGUoYXNfdGliYmxlKHRlbXApLCBoZXJlKHJlZkRpciwgInRzc19jb252ZXJnZW50X2N0Y2ZfbW90aWZfcGFpcnNfa2xmNC5iZWRwZSIpLCBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSkKCiMgQ2hlY2tpbmcgc2l6ZSBkaXN0cmlidXRpb24gb2YgY3RjZiBwYWlyCnRlbXAgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJ0c3NfY29udmVyZ2VudF9jdGNmX21vdGlmX3BhaXJzLmJlZHBlIikpCnRlbXAgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShzaXplID0gKFY2ICsgVjUpLzIgLSAoVjMgKyBWMikvMiwKICAgICAgICAgICAgICAgICAgICAgICBpZCA9IHBhc3RlKFYxLCBWMiwgVjMsIFY1LCBWNiwgc2VwID0gIl8iKSkKdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6c2VsZWN0KGlkLCBzaXplKSAlPiUgZGlzdGluY3QoKQoKZ2dwbG90KHRlbXAsIGFlcyh4ID0gc2l6ZSkpICsgZ2VvbV9oaXN0b2dyYW0oKSArIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYiwgbGltaXRzID0gYygwLCAxZTYpKSArIHNjYWxlX3lfbG9nMTAoKSArIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUoInNpemUgZGlzdHJpYnV0aW9uIG9mIHNtYWxsZXN0IGNvbnZlcmdlbnQgY3RjZiBwYWlycyBhcm91bmQgZ2VuZSIpCmBgYAojIyMjIEZpbHRlcmluZyBsb29wcyB0aGF0IGZhbGwgd2l0aGluIENUQ0YgYm91bmRhcmllcwpgYGB7cn0KZmxhbmtTaXplIDwtIDEKZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWQiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gIisiLCBWMiwgVjMpLAogICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsCiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JQogIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY0LCBWNSwgVjYpCmNvbG5hbWVzKGdlbmUuVFNTLnRiKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJnZW5lIiwgImVuc2VtYmwiKQpnZW5lRW5zZW1ibFBhaXIgPC0gZ2VuZS5UU1MudGIgJT4lIGRwbHlyOjpzZWxlY3QoZ2VuZSwgZW5zZW1ibCkKCmJvdW5kYXJ5LnBhaXIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJ0c3NfY29udmVyZ2VudF9jdGNmX21vdGlmX3BhaXJzLmJlZHBlIikpCmNvbG5hbWVzKGJvdW5kYXJ5LnBhaXIpIDwtIGMoImJvdW5kYXJ5X2Nocm9tMSIsICJib3VuZGFyeV9zdGFydDEiLCAiYm91bmRhcnlfZW5kMSIsICJib3VuZGFyeV9jaHJvbTIiLCAiYm91bmRhcnlfc3RhcnQyIiwgImJvdW5kYXJ5X2VuZDIiLCAiZW5zZW1ibCIpCmJvdW5kYXJ5LnBhaXIgPC0gYm91bmRhcnkucGFpciAlPiUgZHBseXI6OmxlZnRfam9pbihnZW5lRW5zZW1ibFBhaXIsIGJ5ID0gYygiZW5zZW1ibCIpKQoKCiMgSW1wb3J0aW5nIGxvb3AgZ2VuZSBhbm5vdGF0aW9uCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmRpZmZDdXRvZmYgPC0gMC4yCmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIl9wLW5fZW5zZW1ibExpc3QudHN2IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYygiUC1QIiwgIlAtRSIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNCwgNSwgNiwgMTEsIDEyLCAyNCwgMjksIDMxKSkgJT4lIHVubmVzdChnZW5lKQoKCmRhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKGJvdW5kYXJ5LnBhaXIsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibCIpKQoKZGF0YSA8LSBkYXRhICU+JSByb3d3aXNlKCkgJT4lIGRwbHlyOjptdXRhdGUoaXNXaXRoaW5MZWZ0QmQgPSAoYm91bmRhcnlfc3RhcnQxIDw9IG1pbihlbmQxLCBlbmQyKSksCiAgICAgICAgICAgICAgICAgICAgICAgaXNXaXRoaW5SaWdodEJkID0gKGJvdW5kYXJ5X2VuZDIgPj0gbWF4KHN0YXJ0MSwgc3RhcnQyKSksCiAgICAgICAgICAgICAgICAgICAgICAgaXNXaXRoaW5CZCA9IGlzV2l0aGluTGVmdEJkICYgaXNXaXRoaW5SaWdodEJkKQpkYXRhIDwtIGRhdGEgJT4lIGRyb3BfbmEoKQoKCmdncGxvdChkYXRhLCBhZXMoeCA9IERNU08sIHkgPSBkVEFHKSkgKyBnZW9tX3BvaW50KCkgKyBjb29yZF9maXhlZCgpICsgIAogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiZ3JleSIpICsKICB0aGVtZV9jbGFzc2ljKCkgKyBmYWNldF93cmFwKH4gaXNXaXRoaW5CZCkKCmdncGxvdChkYXRhLCBhZXMoeCA9IGlzV2l0aGluQmQsIHkgPSBkaWZmX2RUQUdfRE1TTywgZmlsbCA9IGlzV2l0aGluQmQpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEpICsgdGhlbWVfY2xhc3NpYygpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKQoKCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihpc1dpdGhpbkJkID09Z3JvdXAxKSApJGRpZmZfZFRBR19ETVNPCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGlzV2l0aGluQmQgPT1ncm91cDIpICkkZGlmZl9kVEFHX0RNU08KICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9CgpnZXRQdmFsV2lsY294KGRhdGEsIFRSVUUsIEZBTFNFKQoKCiMgUHJvcG9ydGlvbiBvZiB0aG9zZSBnZW5lIGJldHdlZW4gZ3JvdXAxIGFuZCBncm91cDIKZGF0YS5pc1dpdGhpbkJkIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaXNXaXRoaW5CZCkKCmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3YiKSkkZ2VuZQpnZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2IikpJGdlbmUKCnN1bShnZW5lLmdyb3VwMSAlaW4lIGRhdGEuaXNXaXRoaW5CZCRnZW5lKS9sZW5ndGgoZ2VuZS5ncm91cDEpKjEwMAoKc3VtKGdlbmUuZ3JvdXAyICVpbiUgZGF0YS5pc1dpdGhpbkJkJGdlbmUpL2xlbmd0aChnZW5lLmdyb3VwMikqMTAwCgojIENoZWNraW5nIHNpemUgb2YgdGhvc2UgbG9vcHMKZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKQoKZ2dwbG90KGRhdGEsIGFlcyh4ID0gaXNXaXRoaW5CZCwgeSA9IGRpc3RhbmNlLCBmaWxsID0gaXNXaXRoaW5CZCkpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSkgKyB0aGVtZV9jbGFzc2ljKCkKCgoKYGBgCgoKIyMjIFsyLjM1XSBDaGVja2luZyBDVENGIG1vdGlmIHByZXNlbmNlIGF0IGdlbmUgVFNTCmBgYHtyfQpmbGFua1NpemUgPC0gMi41ZTMKZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgIm1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSAiKyIsIFYyLCBWMyksCiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSwKICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lCiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCwgVjYsIFY1KQpjb2xuYW1lcyhnZW5lLnRiKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIiwgImVuc2VtYmwiLCAiZ2VuZSIpCgpnZW5lLmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2IikpJGdlbmUKZ2VuZS5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdiIpKSRnZW5lCgpUU1MxbWIuZ3JvdXAxLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKGVuc2VtYmwgJWluJSBnZW5lLmdyb3VwMSksIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpClRTUzFtYi5ncm91cDIuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIoZW5zZW1ibCAlaW4lIGdlbmUuZ3JvdXAyKSwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSkKCgpjdGNmLnBlYWsgPC0gZnJlYWQoaGVyZShyZWZEaXIsICIzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5tb3RpZkFubm90YXRlZC5iZWQiKSkKY29sbmFtZXMoY3RjZi5wZWFrKSA8LSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIiwgIm1vdGlmIikKY3RjZi5wZWFrLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShjdGNmLnBlYWspCgoKcHJpbnQoIistMi41a2IgVFNTIG92ZXJsYSB3aXRoIENUQ0YgcGVhayIpCmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhUU1MxbWIuZ3JvdXAxLmdyLCBjdGNmLnBlYWsuZ3IpKSkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwCmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhUU1MxbWIuZ3JvdXAyLmdyLCBjdGNmLnBlYWsuZ3IpKSkpL2xlbmd0aChnZW5lLmdyb3VwMikqMTAwCgoKCmN0Y2YucGVhay5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoY3RjZi5wZWFrICU+JSBkcGx5cjo6ZmlsdGVyKG1vdGlmICE9ICJub25lIikpCnByaW50KCIrLTIuNWtiIFRTUyBvdmVybGEgd2l0aCBDVENGIHBlYWsgd2l0aCBtb3RpZiIpCmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhUU1MxbWIuZ3JvdXAxLmdyLCBjdGNmLnBlYWsuZ3IpKSkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwCmxlbmd0aCh1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyhUU1MxbWIuZ3JvdXAyLmdyLCBjdGNmLnBlYWsuZ3IpKSkpL2xlbmd0aChnZW5lLmdyb3VwMikqMTAwCgoKCgpgYGAKCiMjIyBbMi4zNl0gRmluZGluZyBmYXJ0aGVzdCBQLVMKYGBge3J9Cm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCmRpZmZDdXRvZmYgPC0gMC4yCmdlbmVBbm5vRGF0YSA8LSBsb2FkTG9vcEFubm9EYXRhKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAobmFtZSwgIl9wLW5fZW5zZW1ibExpc3QudHN2IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZDdXRvZmYgPSBkaWZmQ3V0b2ZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYygiUC1QIiwgIlAtRSIsICJQLVMiLCAiUC1YIikpICU+JQogIGRwbHlyOjpzZWxlY3QoYygxLCAyLCAzLCA0LCA1LCA2LCA3LCAxMSwgMTIsIDI0LCAyOSwgMzEpKSAlPiUgdW5uZXN0KGdlbmUpCgoKZ2VuZS5UU1MudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWQiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gIisiLCBWMiwgVjMpKSAlPiUKICBkcGx5cjo6c2VsZWN0KFY2LCBUU1MpCmNvbG5hbWVzKGdlbmUuVFNTLnRiKSA8LSBjKCJlbnNlbWJsIiwgIlRTUyIpCgoKZ2VuZUFubm9EYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihnZW5lLlRTUy50YiwgYnkgPSBjKCJnZW5lIiA9ICJlbnNlbWJsIikpCgpnZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSAKICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlMSA9IChzdGFydDEgKyBlbmQxKS8yIC0gVFNTLAogICAgICAgICAgICAgICAgZGlzdGFuY2UyID0gKHN0YXJ0MiArIGVuZDIpLzIgLSBUU1MsCiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IGlmX2Vsc2UoYWJzKGRpc3RhbmNlMSkgPiBhYnMoZGlzdGFuY2UyKSwgZGlzdGFuY2UxLCBkaXN0YW5jZTIpKQoKcmVzdWx0IDwtIGdlbmVBbm5vRGF0YSAlPiUKICBmaWx0ZXIoQW5ubzIgPT0gIlAtUyIpICU+JQogIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcmlzZSgKICAgIGZhclJpZ2h0ID0gaWYgKGFueShkaXN0YW5jZSA+IDApKSBtYXgoZGlzdGFuY2VbZGlzdGFuY2UgPiAwXSkgZWxzZSAwLCAgIyBSZXR1cm4gMCBpZiBubyBwb3NpdGl2ZSBkaXN0YW5jZQogICAgZmFyTGVmdCA9IGlmIChhbnkoZGlzdGFuY2UgPCAwKSkgbWluKGRpc3RhbmNlW2Rpc3RhbmNlIDwgMF0pIGVsc2UgMCAgIyBSZXR1cm4gMCBpZiBubyBuZWdhdGl2ZSBkaXN0YW5jZQogICkgJT4lCiAgdW5ncm91cCgpCgpnZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBsZWZ0X2pvaW4ocmVzdWx0LCBieSA9IGMoImdlbmUiKSkKCmdlbmVBbm5vRGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJQLVAiLCAiUC1FIikpICU+JQogIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oaXMubmEoZmFyUmlnaHQpIH4gIk5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXN0YW5jZSA+IGZhckxlZnQpICYgKGRpc3RhbmNlIDwgZmFyUmlnaHQpIH4gIldpdGhpbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk91dHNpZGUiKSwKICAgICAgICAgICAgICAgIHNpemUgPSBzdGFydDIgLSBzdGFydDEpCgpkYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgaWQsIHNpemUpICU+JSBkaXN0aW5jdCgpCmFuY2hvci5kYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgY2hyb20yLCBzdGFydDIsIGVuZDIsIGdyb3VwKSAlPiUgZGlzdGluY3QoKQoKdGVtcDEgPC0gYW5jaG9yLmRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gIk5vIikgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKQpmd3JpdGUodGVtcDEsIGhlcmUoY29uc2Vuc3VzRGlyLCAiaW5zdWxhdGVkX2RvbWFpbl9wc19uby5iZWRwZSIpLCBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSkKdGVtcDIgPC0gYW5jaG9yLmRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gIldpdGhpbiIpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cCkKZndyaXRlKHRlbXAyLCBoZXJlKGNvbnNlbnN1c0RpciwgImluc3VsYXRlZF9kb21haW5fcHNfd2l0aGluLmJlZHBlIiksIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFKQp0ZW1wMyA8LSBhbmNob3IuZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiT3V0c2lkZSIpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cCkKZndyaXRlKHRlbXAzLCBoZXJlKGNvbnNlbnN1c0RpciwgImluc3VsYXRlZF9kb21haW5fcHNfb3V0c2lkZS5iZWRwZSIpLCBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSkKCgpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkc2l6ZQogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRzaXplCiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKIyBjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGF0YSwgIm5vQm91bmRhcnkiLCAid2l0aGluQm91bmRhcnkiKSkKIyBjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGF0YSwgIm5vQm91bmRhcnkiLCAib3V0c2lkZUJvdW5kYXJ5IikpCiMgY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsICJvdXRzaWRlQm91bmRhcnkiLCAid2l0aGluQm91bmRhcnkiKSkKCgpwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gc2l6ZSwgZmlsbCA9IGdyb3VwKSkgKyAKICBnZW9tX3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwgYWxwaGEgPSAuNCwgLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKwogIHN0YXRfc3VtbWFyeSgKICAgICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLAogICAgICBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSwKICAgICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMykKICAgICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImdyZXk1MCIsICIjNUVDOTYyIiwgIiM1RUM5NjIiKSkgKwoKICB0aGVtZSgKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksICAgIAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzCiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uCiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvbgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkgK2xhYnMoeSA9ICJMb29wIHNpemUiKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJpbnN1bGF0aW9uQm91bmRhcnlfc2l6ZSIpCndpZHRoIDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoCmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQogIAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGRpZmZfZFRBR19ETVNPCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGRpZmZfZFRBR19ETVNPCiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKZGF0YSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGlkLCBkaWZmX2RUQUdfRE1TTykgJT4lIGRpc3RpbmN0KCkKCiMgY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsICJub0JvdW5kYXJ5IiwgIndpdGhpbkJvdW5kYXJ5IikpCiMgY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsICJub0JvdW5kYXJ5IiwgIm91dHNpZGVCb3VuZGFyeSIpKQojIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCAib3V0c2lkZUJvdW5kYXJ5IiwgIndpdGhpbkJvdW5kYXJ5IikpCgpwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlmZl9kVEFHX0RNU08sIGZpbGwgPSBncm91cCkpICsgCiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHRoZW1lX2NsYXNzaWMoKSArIAogIHN0YXRfc3VtbWFyeSgKICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LAogICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMykKICApICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5NTAiLCAiIzVFQzk2MiIsICIjNUVDOTYyIikpICsKCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLCAgICAKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlcwogICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApICtsYWJzKHkgPSAizpQgbG9vcCBzY29yZSIpICArICAgIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsCiAgICAgICAgICAgICBhbHBoYSA9IDEsCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgICAgICAgIGxpbmVlbmQgPSAic3F1YXJlIikgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLAogICAgICAgICAgICAgYWxwaGEgPSAwLjUsIAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgICAgICAgICBsaW5lZW5kID0gInNxdWFyZSIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuOCwgMC41KSkKICAgIApmaWxlTmFtZSA8LSBwYXN0ZTAoImluc3VsYXRpb25Cb3VuZGFyeV9kZWx0YSIpCnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpICAKICAKICAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCiAgICAKICAgIG1pblZhbHVlIDwtIC00CiAgb2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoImxvb3BTY29yZV9jb25zX29ic2V4cC50c3YiKSkpICU+JQogIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTywKICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pCgpnZW5lQW5ub0RhdGEgPC0gZ2VuZUFubm9EYXRhICU+JSBsZWZ0X2pvaW4ob2JzZXhwLCBieSA9IGMoImlkIikpCgpkYXRhIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgaWQsIGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08pICU+JSBkaXN0aW5jdCgpCgoKZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08KICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTwogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCiMgY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsICJub0JvdW5kYXJ5IiwgIndpdGhpbkJvdW5kYXJ5IikpCiMgY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsICJub0JvdW5kYXJ5IiwgIm91dHNpZGVCb3VuZGFyeSIpKQojIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveChkYXRhLCAib3V0c2lkZUJvdW5kYXJ5IiwgIndpdGhpbkJvdW5kYXJ5IikpCiMgCgpwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGdyb3VwLCB5ID0gbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTywgZmlsbCA9IGdyb3VwKSkgKyAKICBnZW9tX3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwgYWxwaGEgPSAuNCwgLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgdGhlbWVfY2xhc3NpYygpICsgCiAgc3RhdF9zdW1tYXJ5KAogICAgYWVzKGdyb3VwID0gZ3JvdXApLCBmdW4gPSBtZWFuLAogICAgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsCiAgICBmaWxsID0gImJsYWNrIiwgY29sb3IgPSAiYmxhY2siLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC4zKQogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImdyZXk1MCIsICIjNUVDOTYyIiwgIiM1RUM5NjIiKSkgKwoKICB0aGVtZSgKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksICAgIAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzCiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uCiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvbgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkgK2xhYnMoeSA9ICJsb2cyKGZjIG9mIG9icy9leHApIikgICsgICAgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwKICAgICAgICAgICAgIGFscGhhID0gMSwKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICAgICAgICAgbGluZWVuZCA9ICJzcXVhcmUiKSArIAogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMiwgMikpCiAgICAKZmlsZU5hbWUgPC0gcGFzdGUwKCJpbnN1bGF0aW9uQm91bmRhcnlfb2JzZXhwIikKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkgIAoKCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCmdlbmUud2l0aGluQm91bmRhcnkgPC0gdW5pcXVlKChnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gIndpdGhpbkJvdW5kYXJ5IikpJGdlbmUpCmdlbmUub3V0c2lkZUJvdW5kYXJ5IDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJvdXRzaWRlQm91bmRhcnkiKSkkZ2VuZSkKZ2VuZS5ub0JvdW5kYXJ5IDwtIHVuaXF1ZSgoZ2VuZUFubm9EYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJub0JvdW5kYXJ5IikpJGdlbmUpCgpnZW5lLndCb3VuZGFyeSA8LSB1bmlxdWUoYyhnZW5lLndpdGhpbkJvdW5kYXJ5LCBnZW5lLm91dHNpZGVCb3VuZGFyeSkpCgpnZW5lLmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2IikpJGdlbmUKZ2VuZS5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdiIpKSRnZW5lCgpwcmludCgicGVyYyBvZiBnZW5lIHdpdGggbG9vcCB3aXRoaW4gQm91bmRhcnkiKQpzdW0oZ2VuZS5ncm91cDEgJWluJSBnZW5lLndpdGhpbkJvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDEpKjEwMApzdW0oZ2VuZS5ncm91cDIgJWluJSBnZW5lLndpdGhpbkJvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDIpKjEwMAoKcHJpbnQoInBlcmMgb2YgZ2VuZSB3aXRoIGxvb3Agb3V0c2lkZSBCb3VuZGFyeSIpCnN1bShnZW5lLmdyb3VwMSAlaW4lIGdlbmUub3V0c2lkZUJvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDEpKjEwMApzdW0oZ2VuZS5ncm91cDIgJWluJSBnZW5lLm91dHNpZGVCb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDAKCnByaW50KCJwZXJjIG9mIGdlbmUgd2l0aCBsb29wIHdpdGggbm8gQm91bmRhcnkiKQpzdW0oZ2VuZS5ncm91cDEgJWluJSBnZW5lLm5vQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwCnN1bShnZW5lLmdyb3VwMiAlaW4lIGdlbmUubm9Cb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDAKCgpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpICU+JQogIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oCiAgICBlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lLndCb3VuZGFyeSB+ICJ3aXRoaW5Cb3VuZGFyeSIsCiAgICBlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lLm5vQm91bmRhcnkgfiAibm9Cb3VuZGFyeSIsCiAgICBUUlVFIH4gTkEKICApKSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpICU+JQogIGRwbHlyOjptdXRhdGUoYWJzTG9nMkZDID0gYWJzKGxvZzJGb2xkQ2hhbmdlKSkKCgpnZ3Bsb3QoZGlmZi5STkEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBsb2cyRm9sZENoYW5nZSkpICsgZ2VvbV92aW9saW4oKSArIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSkKCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRhYnNMb2cyRkMKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkYWJzTG9nMkZDCiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQpjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGlmZi5STkEsICJ3aXRoaW5Cb3VuZGFyeSIsICJub0JvdW5kYXJ5IikpCgoKIyBDcmVhdGUgdGhlIENERiBwbG90CnAgPC0gZ2dwbG90KGRpZmYuUk5BLCBhZXMoeCA9IGFic0xvZzJGQywgY29sb3IgPSBncm91cCkpICsKc3RhdF9lY2RmKHNpemUgPSAwLjQgKSArICMgVXNlIHN0YXRfZWNkZiB0byBwbG90IHRoZSBlbXBpcmljYWwgQ0RGCiAgbGFicygKICAgIHggPSAiQWJzb2x1dGUgbG9nMihmb2xkIGNoYW5nZSkiLAogICAgeSA9ICJDdW11bGF0aXZlIFByb2JhYmlsaXR5IgogICkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMC41KSkgKwogIHRoZW1lX2NsYXNzaWMoKSArICMgQ2xlYW4gdGhlbWUKICB0aGVtZSgKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICAgKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfY2RmX2luc3VsYXRpb25Cb3VuZGFyeSIpCndpZHRoIDwtIHBhbmVsU2l6ZSgyLjUpKm1tVG9JbmNoCmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKCgojIyMgQ2hlY2tpbmcgY2hhcmFjdGVyc3RpY3Mgb2YgYW5jaG9ycwp0ZW1wMSA8LSBhbmNob3IuZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAibm9Cb3VuZGFyeSIpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cCkKYW5jaG9yLm5vQm91bmRhcnkgPC0gZXh0cmFjdEFuY2hvcih0ZW1wMSkKCnRlbXAyIDwtIGFuY2hvci5kYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJ3aXRoaW5Cb3VuZGFyeSIpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cCkKYW5jaG9yLndpdGhpbkJvdW5kYXJ5IDwtIGV4dHJhY3RBbmNob3IodGVtcDIpCgp0ZW1wMyA8LSBhbmNob3IuZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAib3V0c2lkZUJvdW5kYXJ5IikgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKQphbmNob3Iub3V0c2lkZUJvdW5kYXJ5IDwtIGV4dHJhY3RBbmNob3IodGVtcDMpCgoKZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGxvb3AgPT1ncm91cDEpICkkc3VtU2NvcmUKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIobG9vcCA9PWdyb3VwMikgKSRzdW1TY29yZQogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCmdldFN1bVNjb3JlcyA8LSBmdW5jdGlvbih0cmFjaywgYW5jaG9yKSB7CiAgIyBGaW5kIG92ZXJsYXBzIGJldHdlZW4gYWxsIGFuY2hvcnMgYW5kIHRyYWNrIHJlZ2lvbnMgYXQgb25jZQogIG92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3IsIHRyYWNrKQogIAogICMgRXh0cmFjdCB0aGUgc2NvcmVzIGFuZCBjb3JyZXNwb25kaW5nIGFuY2hvciBpbmRpY2VzCiAgYW5jaG9yX2luZGljZXMgPC0gcXVlcnlIaXRzKG92ZXJsYXBzKQogIHRyYWNrX3Njb3JlcyA8LSBzY29yZSh0cmFjaylbc3ViamVjdEhpdHMob3ZlcmxhcHMpXQogIAogICMgVXNlIHRhcHBseSB0byBjYWxjdWxhdGUgdGhlIG1lZGlhbiBzY29yZXMgZm9yIGVhY2ggYW5jaG9yCiAgbWVkaWFuX3Njb3JlcyA8LSB0YXBwbHkodHJhY2tfc2NvcmVzLCBhbmNob3JfaW5kaWNlcywgbWVhbiwgbmEucm0gPSBUUlVFKQogIAogICMgSW5pdGlhbGl6ZSBhIG51bWVyaWMgdmVjdG9yIHRvIHN0b3JlIHRoZSBtZWRpYW4gc2NvcmVzIGZvciBlYWNoIGFuY2hvcgogIGFsbF9tZWRpYW5fc2NvcmVzIDwtIHJlcChOQSwgbGVuZ3RoKGFuY2hvcikpCiAgCiAgIyBQb3B1bGF0ZSB0aGUgbWVkaWFuIHNjb3JlcyBmb3IgdGhlIGFuY2hvcnMgdGhhdCBoYXZlIG92ZXJsYXBzCiAgYWxsX21lZGlhbl9zY29yZXNbYXMubnVtZXJpYyhuYW1lcyhtZWRpYW5fc2NvcmVzKSldIDwtIG1lZGlhbl9zY29yZXMKICAKICByZXR1cm4oYWxsX21lZGlhbl9zY29yZXMpCn0KCnBsb3RTdW1TY29yZXNCaW5hcnkgPC0gZnVuY3Rpb24odHJhY2ssIHBlYWssIG5hbWUsIGFuY2hvcjEsIGFuY2hvcjIsIGFuY2hvcjMpewogIHBlYWtUcmFjayA8LSB0cmFja1t1bmlxdWUocXVlcnlIaXRzKGZpbmRPdmVybGFwcyh0cmFjaywgcGVhaykpKV0KICBhIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvcjEpCiAgYiA8LSBnZXRTdW1TY29yZXMocGVha1RyYWNrLCBhbmNob3IyKQogIGMgPC0gZ2V0U3VtU2NvcmVzKHBlYWtUcmFjaywgYW5jaG9yMykKICBhLnRiIDwtIHRpYmJsZShsb29wID0gIm5vQm91bmRhcnkiLAogICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYSkKICBiLnRiIDwtIHRpYmJsZShsb29wID0gIndpdGhCb3VuZGFyeSIsCiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBiKQogIGMudGIgPC0gdGliYmxlKGxvb3AgPSAib3V0c2lkZUJvdW5kYXJ5IiwKICAgICAgICAgICAgICAgICBzdW1TY29yZSA9IGMpCiAgCiAgZGF0YSA8LSBiaW5kX3Jvd3MoYS50YiwgYi50YiwgYy50YikgJT4lIGRyb3BfbmEoKQogIGRhdGEkbG9vcCA8LSBmYWN0b3IoZGF0YSRsb29wLCBsZXZlbHMgPSBjKCJub0JvdW5kYXJ5IiwgIndpdGhCb3VuZGFyeSIsICJvdXRzaWRlQm91bmRhcnkiKSkKICAKICBwMTIgPC0gZ2V0UHZhbFdpbGNveChkYXRhLCAibm9Cb3VuZGFyeSIsICJ3aXRoQm91bmRhcnkiKQogIHAxMyA8LSBnZXRQdmFsV2lsY294KGRhdGEsICJub0JvdW5kYXJ5IiwgIm91dHNpZGVCb3VuZGFyeSIpCiAgcDIzIDwtIGdldFB2YWxXaWxjb3goZGF0YSwgIndpdGhCb3VuZGFyeSIsICJvdXRzaWRlQm91bmRhcnkiKQogIHAgPC0gIGdncGxvdChkYXRhLCBhZXMoeCA9IGxvb3AsIHkgPSBzdW1TY29yZSkpICsgCiAgICBsYWJzKHggPSBOVUxMLCB5ID0gcGFzdGUwKG5hbWUsICJcbmxvZyhhdmcgcGVhayBzY29yZSBwZXIgYW5jaG9yKSIpKSArCiAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGxvb3ApLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgICAgIG91dGxpZXIuc2l6ZSA9IDEsIG91dGxpZXIuc3Ryb2tlID0gTkEpICsgdGhlbWVfY2xhc3NpYygpICsKICAgIHN0YXRfc3VtbWFyeSgKICAgICAgYWVzKGdyb3VwID0gbG9vcCksIGZ1biA9IG1lYW4sCiAgICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMSwKICAgICAgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIKICAgICkgKyB0aGVtZSgKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICAgKSwKICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgICApLAogICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMQogICAgICApLAogICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgICApLAogICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICAgKSwKICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICAgKSArIAogICAgI2Nvb3JkX2NhcnRlc2lhbih5bGltID0gYyhxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjApLCBxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjk5KSkpICsgCiAgICBhbm5vdGF0ZSgKICAgICAgInRleHQiLCB4ID0gMSwgeSA9IHF1YW50aWxlKGRhdGEkc3VtU2NvcmUsIDAuNSksCiAgICAgIGxhYmVsID0gcGFzdGUwKCJwMTI6ICIsIGNvbnZQdmFsdWUocDEyKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgInAxMzogIiwgY29udlB2YWx1ZShwMTMpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAicDIzOiAiLCBjb252UHZhbHVlKHAyMykpLAogICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMKICAgICkgCiAgIysgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIikKICAKICBmaWxlTmFtZSA8LSBwYXN0ZTAoIkNoSVBfcGVha19hdmdQZWFrU2NvcmVfYm91bmRhcnlBbmNob3JfIiwgbmFtZSkKICB3aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2gKICBoZWlnaHQgPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoCiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KCiMgU3VtIHBlYWsgc2NvcmUKIyMjIwp0cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsICIzMzI1NV9IM0s0bWUzXzA0LTc0NV9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5idyIpLCBmb3JtYXQgPSAiQmlnV2lnIikKcGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiMzMyNTVfSDNLNG1lM18wNC03NDVfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkIikpCnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssICJIM0s0bWUzIiwgYW5jaG9yLm5vQm91bmRhcnksIGFuY2hvci53aXRoaW5Cb3VuZGFyeSwgYW5jaG9yLm91dHNpZGVCb3VuZGFyeSkKCnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgIkdTTTI0Mzg0NzZfRUMtREctMzQ1OC1IM0syN0FDX0FTWU5fMS5idyIpLCBmb3JtYXQgPSAiQmlnV2lnIikKcGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiR1NNMjQzODQ3Nl9FQy1ERy0zNDU4LUgzSzI3QUNfQVNZTl8xLm5hcnJvd1BlYWsuYmVkIikpCiNwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCAiSDNLMjdhYyIpCnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssICJIM0syN2FjIiwgYW5jaG9yLm5vQm91bmRhcnksIGFuY2hvci53aXRoaW5Cb3VuZGFyeSwgYW5jaG9yLm91dHNpZGVCb3VuZGFyeSkKCnRyYWNrIDwtIGltcG9ydChoZXJlKHJlZkRpciwgIkdTTTI2ODM0NDBfSjFfSDNLMTRhY19tbTEwTGlmdGVkLmJsYWNrLmJ3IiksIGZvcm1hdCA9ICJCaWdXaWciKQpwZWFrIDwtIGltcG9ydFBlYWsoaGVyZShyZWZEaXIsICJHU00yNjgzNDQwX0oxX0gzSzE0YWNfbW0xMExpZnRlZC5iZWQiKSkKI3Bsb3RTdW1TY29yZXModHJhY2ssIHBlYWssICJIM0sxNGFjIikKcGxvdFN1bVNjb3Jlc0JpbmFyeSh0cmFjaywgcGVhaywgIkgzSzE0YWMiLCBhbmNob3Iubm9Cb3VuZGFyeSwgYW5jaG9yLndpdGhpbkJvdW5kYXJ5LCBhbmNob3Iub3V0c2lkZUJvdW5kYXJ5KQoKdHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCAiMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYnciKSwgZm9ybWF0ID0gIkJpZ1dpZyIpCnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgIjMzMjQ4X0NUQ0ZfMDctNzI5X0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZCIpKQojcGxvdFN1bVNjb3Jlcyh0cmFjaywgcGVhaywgIkNUQ0YiKQpwbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCAiQ1RDRiIsIGFuY2hvci5ub0JvdW5kYXJ5LCBhbmNob3Iud2l0aGluQm91bmRhcnksIGFuY2hvci5vdXRzaWRlQm91bmRhcnkpCgp0cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsICIzMzI1MF9SQUQyMV9hYjk5Ml9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5idyIpLCBmb3JtYXQgPSAiQmlnV2lnIikKcGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkIikpCiNwbG90U3VtU2NvcmVzKHRyYWNrLCBwZWFrLCAiUkFEMjEiKQpwbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCAiUkFEMjEiLCBhbmNob3Iubm9Cb3VuZGFyeSwgYW5jaG9yLndpdGhpbkJvdW5kYXJ5LCBhbmNob3Iub3V0c2lkZUJvdW5kYXJ5KQoKCgojIyMjIyMjIyBMT0xBCmF0YWMgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJHU00zMTA2MjU3X0FUQUNfRVNDXzEuYmVkIikpICU+JSBkcGx5cjo6c2VsZWN0KFYxLCBWMiwgVjMpCmNvbG5hbWVzKGF0YWMpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiKQphdGFjLmdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShhdGFjKQoKIyBMT0FESU5HIExPT1BTCmxvb3AuYWxsIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeS50c3YiKSkgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJQLVAiLCAiUC1FIiwgIkUtRSIpKQphbmNob3IuYWxsIDwtIChleHRyYWN0QW5jaG9yKGxvb3AuYWxsKSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci5hbGwsIGF0YWMuZ3IpCmFuY2hvci5hbGwgPC0gcGludGVyc2VjdChhbmNob3IuYWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoYW5jaG9yLm5vQm91bmRhcnksIGF0YWMuZ3IpCmFuY2hvci5ub0JvdW5kYXJ5IDwtIHBpbnRlcnNlY3QoYW5jaG9yLm5vQm91bmRhcnlbcXVlcnlIaXRzKG92ZXJsYXBzKV0sIGF0YWMuZ3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGFuY2hvci53aXRoaW5Cb3VuZGFyeSwgYXRhYy5ncikKYW5jaG9yLndpdGhpbkJvdW5kYXJ5IDwtIHBpbnRlcnNlY3QoYW5jaG9yLndpdGhpbkJvdW5kYXJ5W3F1ZXJ5SGl0cyhvdmVybGFwcyldLCBhdGFjLmdyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhhbmNob3Iub3V0c2lkZUJvdW5kYXJ5LCBhdGFjLmdyKQphbmNob3Iub3V0c2lkZUJvdW5kYXJ5IDwtIHBpbnRlcnNlY3QoYW5jaG9yLm91dHNpZGVCb3VuZGFyeVtxdWVyeUhpdHMob3ZlcmxhcHMpXSwgYXRhYy5ncltzdWJqZWN0SGl0cyhvdmVybGFwcyldKQoKCgphbmNob3JzIDwtIGxpc3QoYW5jaG9yLm5vQm91bmRhcnksIGFuY2hvci53aXRoQm91bmRhcnksIGFuY2hvci5vdXRzaWRlQm91bmRhcnkpCnRicyA8LSBsaXN0KCkKdGVtcHMgPC0gbGlzdCgpCgphbHBoYSA8LSAwLjA1CgojIFByb2Nlc3MgY2x1c3RlcnMgYzEgdG8gYzgKZm9yIChpIGluIDE6MykgewogIAogIGFuY2hvciA8LSBhbmNob3JzW1tpXV0KICAjIFJ1biBMT0xBCiAgcmVzdWx0IDwtIHJ1bkxPTEEoYW5jaG9yLCBhbmNob3IuYWxsLCBsb2xhREIpCiAgdGIgPC0gYXNfdGliYmxlKHJlc3VsdCkKICAKICAjIEZpbHRlciBhbmQgc3VtbWFyaXplCiAgdGIgPC0gdGIgJT4lCiAgICBkcGx5cjo6bXV0YXRlKHRhcmdldCA9IHRvdXBwZXIoYW50aWJvZHkpKSAlPiUKICAgIGZpbHRlcihzdHJfdG9fbG93ZXIoY2VsbFR5cGUpID09ICJlbWJyeW9uaWMgc3RlbSBjZWxsIikgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKHFWYWx1ZSA8IGFscGhhKSAlPiUKICAgIGRwbHlyOjpncm91cF9ieSh0YXJnZXQpICU+JQogICAgc2xpY2VfbWluKG1lYW5SbmssIHdpdGhfdGllcyA9IEZBTFNFKQogIAogICMgU3RvcmUgdGIKICB0YnNbW2ldXSA8LSB0YgogIAogICMgU2VsZWN0IGFuZCByZW5hbWUgb2Rkc1JhdGlvCiAgdGVtcCA8LSB0YiAlPiUgZHBseXI6OnNlbGVjdCh0YXJnZXQsIG9kZHNSYXRpbykKICBjb2xuYW1lcyh0ZW1wKSA8LSBjKCJ0YXJnZXQiLCBwYXN0ZTAoIk9SX2MiLCBpKSkKICAKICAjIFN0b3JlIHRlbXAKICB0ZW1wc1tbaV1dIDwtIHRlbXAKfQoKIyBNZXJnZSBhbGwgdGVtcCB0YWJsZXMgaW50byBvbmUKdGVtcCA8LSBSZWR1Y2UoZnVuY3Rpb24oeCwgeSkgZnVsbF9qb2luKHgsIHksIGJ5ID0gInRhcmdldCIpLCB0ZW1wcykgJT4lCiAgbXV0YXRlX2FsbCh+cmVwbGFjZV9uYSguLCAxKSkKY29sbmFtZXModGVtcCkgPC0gYygidGFyZ2V0IiwgIm5vQm91bmRhcnkiLCAid2l0aGluQm91bmRhcnkiLCAib3V0c2lkZUJvdW5kYXJ5IikKZGF0YSA8LSB0ZW1wICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoInRhcmdldCIpICU+JSBhcy5tYXRyaXgoKQoKbGlicmFyeShjaXJjbGl6ZSkKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMoMSwgbWF4KGRhdGEpKSwgYygid2hpdGUiLCAicmVkIikpCgoKI2Z2aXpfbmJjbHVzdChkYXRhLCBrbWVhbnMsIG1ldGhvZCA9ICJ3c3MiKQoKcCA8LSBIZWF0bWFwKAogIGRhdGEsCiAgbmFtZSA9ICJPZGRzIFJhdGlvIiwgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBoZWF0bWFwIGxlZ2VuZAogIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCAgICAgICAgICAgICMgUmVtb3ZlIGNvbHVtbiBkZW5kcm9ncmFtCiAgc2hvd19yb3dfZGVuZCA9IEZBTFNFLAogIGNvbCA9IGNvbF9mdW4sCiAgYm9yZGVyID0gVFJVRQopCmBgYAoKIyMjIFszLjM3XSBDaGVja2luZyBSQUQyMSBsZXZlbCBhdCB0c3MKYGBge3J9CnRzcy41a2IuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiVFNTX2JpbmFyeUdyb3VwMS5iZWQiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShzdGFydCA9IChWMiArIFYzKS8yIC0gMjUwMCwKICAgICAgICAgICAgICAgIGVuZCA9IChWMiArIFYzKS8yICsgMjUwMCwKICAgICAgICAgICAgICAgIGNociA9IFYxKSAlPiUKICBkcGx5cjo6c2VsZWN0KGNociwgc3RhcnQsIGVuZCkKdHNzLjVrYi5ncm91cDEgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRzcy41a2IuZ3JvdXAxKQoKdHNzLjVrYi5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJUU1NfYmluYXJ5R3JvdXAyLmJlZCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHN0YXJ0ID0gKFYyICsgVjMpLzIgLSAyNTAwLAogICAgICAgICAgICAgICAgZW5kID0gKFYyICsgVjMpLzIgKyAyNTAwLAogICAgICAgICAgICAgICAgY2hyID0gVjEpICU+JQogIGRwbHlyOjpzZWxlY3QoY2hyLCBzdGFydCwgZW5kKQp0c3MuNWtiLmdyb3VwMiA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodHNzLjVrYi5ncm91cDIpCgoKcGxvdFN1bVNjb3Jlc0JpbmFyeSA8LSBmdW5jdGlvbih0cmFjaywgcGVhaywgbmFtZSwgYW5jaG9yMSwgYW5jaG9yMil7CiAgcGVha1RyYWNrIDwtIHRyYWNrW3VuaXF1ZShxdWVyeUhpdHMoZmluZE92ZXJsYXBzKHRyYWNrLCBwZWFrKSkpXQogIGEgPC0gZ2V0U3VtU2NvcmVzKHBlYWtUcmFjaywgYW5jaG9yMSkKICBiIDwtIGdldFN1bVNjb3JlcyhwZWFrVHJhY2ssIGFuY2hvcjIpCiAgYS50YiA8LSB0aWJibGUobG9vcCA9ICJncm91cDEiLAogICAgICAgICAgICAgICAgIHN1bVNjb3JlID0gYSkKICBiLnRiIDwtIHRpYmJsZShsb29wID0gImdyb3VwMiIsCiAgICAgICAgICAgICAgICAgc3VtU2NvcmUgPSBiKQogIAogIGRhdGEgPC0gYmluZF9yb3dzKGEudGIsIGIudGIpICU+JSBkcm9wX25hKCkKICBkYXRhJGxvb3AgPC0gZmFjdG9yKGRhdGEkbG9vcCwgbGV2ZWxzID0gYygiZ3JvdXAxIiwgImdyb3VwMiIpKQogIAogIHAxMiA8LSBnZXRQdmFsV2lsY294KGRhdGEsICJncm91cDEiLCAiZ3JvdXAyIikKICBwIDwtICBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBsb29wLCB5ID0gc3VtU2NvcmUpKSArIAogICAgbGFicyh4ID0gTlVMTCwgeSA9IHBhc3RlMChuYW1lLCAiXG5sb2coYXZnIHBlYWsgc2NvcmUgcGVyIGFuY2hvcikiKSkgKwogICAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBsb29wKSwgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICAgICBvdXRsaWVyLnNpemUgPSAxLCBvdXRsaWVyLnN0cm9rZSA9IE5BKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgICBzdGF0X3N1bW1hcnkoCiAgICAgIGFlcyhncm91cCA9IGxvb3ApLCBmdW4gPSBtZWFuLAogICAgICBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDEsCiAgICAgIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siCiAgICApICsgdGhlbWUoCiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgICAgc2l6ZSA9IGZvbnRTaXplUywgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICAgICksCiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICAgKSwKICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgICAgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEKICAgICAgKSwKICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICAgKSwKICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICAgICksCiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICAgICkgKyAKICAgICNjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMocXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC4wKSwgcXVhbnRpbGUoZGF0YSRzdW1TY29yZSwgMC45OSkpKSArIAogICAgYW5ub3RhdGUoCiAgICAgICJ0ZXh0IiwgeCA9IDEsIHkgPSBxdWFudGlsZShkYXRhJHN1bVNjb3JlLCAwLjUpLAogICAgICBsYWJlbCA9IHBhc3RlMCgicDEyOiAiLCBjb252UHZhbHVlKHAxMikpLAogICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDMKICAgICkgCiAgIysgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIikKICAKICBmaWxlTmFtZSA8LSBwYXN0ZTAoIkNoSVBfcGVha19hdmdQZWFrU2NvcmVfYmluYXJ5R3JvdXBfIiwgbmFtZSkKICB3aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2gKICBoZWlnaHQgPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoCiAgcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICBzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KCiMgU3VtIHBlYWsgc2NvcmUKIyMjIwp0cmFjayA8LSBpbXBvcnQoaGVyZShyZWZEaXIsICIzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3RyaW1fcTIwX2RlZHVwX2JsYWNrX2RlcHRoTm9ybS5idyIpLCBmb3JtYXQgPSAiQmlnV2lnIikKcGVhayA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiMzMyNDhfQ1RDRl8wNy03MjlfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkIikpCnBsb3RTdW1TY29yZXNCaW5hcnkodHJhY2ssIHBlYWssICJDVENGIiwgdHNzLjVrYi5ncm91cDEsIHRzcy41a2IuZ3JvdXAyKQoKdHJhY2sgPC0gaW1wb3J0KGhlcmUocmVmRGlyLCAiMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF90cmltX3EyMF9kZWR1cF9ibGFja19kZXB0aE5vcm0uYnciKSwgZm9ybWF0ID0gIkJpZ1dpZyIpCnBlYWsgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgIjMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZCIpKQpwbG90U3VtU2NvcmVzQmluYXJ5KHRyYWNrLCBwZWFrLCAiUkFEMjEiLCB0c3MuNWtiLmdyb3VwMSwgdHNzLjVrYi5ncm91cDIpCgoKCmBgYAoKIyMjIFszLjM4XSBTdHJpcGUgcGVyY2VudGFnZQpgYGB7cn0KIyBDcmVhdGUgdGhlIGRhdGEKZGF0YSA8LSBkYXRhLmZyYW1lKAogIEdyb3VwID0gYygiR3JvdXAxIiwgIkdyb3VwMiIpLAogIFZhbHVlID0gYygzMS4wMywgMTAuNjQpCikKCiMgQ3JlYXRlIHRoZSBiYXIgcGxvdApwIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IEdyb3VwLCB5ID0gVmFsdWUsIGZpbGwgPSBHcm91cCkpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gImJsYWNrIiwgd2lkdGggPSAwLjcsIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFLAogICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiKSArICMgVXNlIGlkZW50aXR5IGZvciByYXcgdmFsdWVzCiAgbGFicyh5ID0gIiUgb2YgVFNTIG9uIHN0cmlwZSIpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJwZXJjX29uX3N0cmlwZV9iaW5hcnlHcm91cCIpCndpZHRoIDwtIHBhbmVsU2l6ZSgxLjI1KSptbVRvSW5jaApoZWlnaHQgPC0gcGFuZWxTaXplKDEuMikqbW1Ub0luY2gKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKIyMjWzMuMzldIFNwbGl0dGluZyBiZWRwZQpgYGB7cn0KdGVtcCA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMikpCmdlbmVMaXN0IDwtICh0ZW1wICU+JSBkcGx5cjo6ZmlsdGVyKGV4dGVybmFsX2dlbmVfbmFtZSAlaW4lIGMoIktsZjQiLCAiVGJ4MyIsICJKdW4iLCAiRm9zbDIiLCAiTXljIiwgIlBobGRhMSIpKSkkZW5zZW1ibF9nZW5lX2lkCgojIExPQUQgQU5OT1RBVEVEIExPT1AKbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKZGlmZkN1dG9mZiA8LSAwLjIKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKCJQLVAiLCAiUC1FIiwgIlAtUyIsICJQLVgiKSklPiUKICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxKQoKZmlsdGVyZWRMb29wIDwtIGdlbmVBbm5vRGF0YSAlPiUgdW5uZXN0KGdlbmUpICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmUgJWluJSBnZW5lTGlzdCkKZndyaXRlKGZpbHRlcmVkTG9vcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgiUC1OX3NlbGVjdGVkR2VuZS5iZWRwZSIpKSwgCiAgICAgICAgIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFKQogIAp0ZW1wbG9vcCA8LSBmaWx0ZXJlZExvb3AgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJQLVAiLCAiUC1FIikpCmZ3cml0ZSh0ZW1wbG9vcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgiUC1QRV9zZWxlY3RlZEdlbmUuYmVkcGUiKSksIAogICAgICAgICBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSkKICAKdGVtcGxvb3AgPC0gZmlsdGVyZWRMb29wICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYygiUC1TIikpCmZ3cml0ZSh0ZW1wbG9vcCwgaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgiUC1TX3NlbGVjdGVkR2VuZS5iZWRwZSIpKSwgCiAgICAgICAgIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFKQpgYGAKCiMjIyBbMy40MF0gRmluZGluZyBsYXJnZXN0IGVuY29tcGFzc2luZyBTLVMKYGBge3J9Cm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCgojIElNUE9SVCBTLVMgbG9vcHMKYWxsTG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5LnRzdiIpKQpzdHJMb29wcyA8LSBhbGxMb29wcyAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoIlMtUyIpKQp0ZW1wIDwtIHN0ckxvb3BzICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgNikpCmNvbG5hbWVzKHRlbXApIDwtIGMoImNocm9tIiwgInN0YXJ0IiwgImVuZCIpCnN0ckxvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHRlbXApCgojIElNUE9SVCBUU1MKZmxhbmtTaXplIDwtIDEwCmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWQiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gIisiLCBWMiwgVjMpLAogICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsCiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JQogIGRwbHlyOjpzZWxlY3QoVjEsIFRTU3N0YXJ0LCBUU1NlbmQsIFY2LCBWNSkKY29sbmFtZXMoZ2VuZS50YikgPC0gYygiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgImVuc2VtYmwiLCAiZ2VuZSIpCmdlbmVHciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZ2VuZS50Yiwga2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSkKCgojIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBsb29wcyBhbmQgVFNTCm92ZXJsYXBzIDwtIGZpbmRPdmVybGFwcyhnZW5lR3IsIHN0ckxvb3BzR3IpCgojIEFubm90YXRlIG92ZXJsYXBzCnRzc193aXRoX2xvb3BzIDwtIGdlbmVHcltxdWVyeUhpdHMob3ZlcmxhcHMpXQpsb29wc193aXRoX3RzcyA8LSBzdHJMb29wc0dyW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0KCiMgQ29tYmluZSBpbnRvIGEgZGF0YSBmcmFtZSBmb3IgcHJvY2Vzc2luZwpsb29wX2RhdGEgPC0gZGF0YS5mcmFtZShnZW5lID0gdHNzX3dpdGhfbG9vcHMkZW5zZW1ibCwKICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9jaHIgPSBzZXFuYW1lcyhsb29wc193aXRoX3RzcyksCiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3Bfc3RhcnQgPSBzdGFydChsb29wc193aXRoX3RzcyksCiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BfZW5kID0gZW5kKGxvb3BzX3dpdGhfdHNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF93aWR0aCA9IHdpZHRoKGxvb3BzX3dpdGhfdHNzKSkKCiMgSWRlbnRpZnkgdGhlIGxhcmdlc3QgbG9vcCBmb3IgZWFjaCBnZW5lCmxhcmdlc3RfbG9vcHMgPC0gbG9vcF9kYXRhW29yZGVyKGxvb3BfZGF0YSRnZW5lLCAtbG9vcF9kYXRhJGxvb3Bfd2lkdGgpLCBdCmxhcmdlc3RfbG9vcHMgPC0gbGFyZ2VzdF9sb29wc1shZHVwbGljYXRlZChsYXJnZXN0X2xvb3BzJGdlbmUpLCBdCmxhcmdlc3RfbG9vcHMgPC0gbGFyZ2VzdF9sb29wcyAlPiUgZHBseXI6Om11dGF0ZShsb29wSUQgPSBwYXN0ZShsb29wX2NociwgbG9vcF9zdGFydCwgbG9vcF9lbmQsIHNlcCA9ICJfIikpCmxhcmdlc3RfbG9vcHMgPC0gbGFyZ2VzdF9sb29wc1tvcmRlcihsYXJnZXN0X2xvb3BzJGxvb3BfY2hyLCBsYXJnZXN0X2xvb3BzJGxvb3Bfc3RhcnQpLF0Kcm93bmFtZXMobGFyZ2VzdF9sb29wcykgPC0gTlVMTAoKIyBDaGVja2luZyBzbWFsbGVyIGxvb3BzCmFsbExvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGFsbExvb3BzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxbmFtZXMuZmllbGQgPSAiY2hyb20xIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LmZpZWxkID0gInN0YXJ0MSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQuZmllbGQgPSAiZW5kMiIpCmxhcmdlc3RMb29wc0dyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShsYXJnZXN0X2xvb3BzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcW5hbWVzLmZpZWxkID0gImxvb3BfY2hyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydC5maWVsZCA9ICJsb29wX3N0YXJ0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQuZmllbGQgPSAibG9vcF9lbmQiKQpsYXJnZXN0TG9vcHNHciA8LSBzb3J0KHVuaXF1ZShsYXJnZXN0TG9vcHNHcikpCmNvbXBsZXRlX292ZXJsYXBzIDwtIHN1YnNldEJ5T3ZlcmxhcHMoYWxsTG9vcHNHciwgbGFyZ2VzdExvb3BzR3IsIHR5cGUgPSAid2l0aGluIikKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGNvbXBsZXRlX292ZXJsYXBzLCBsYXJnZXN0TG9vcHNHcikKCgpjb21wbGV0ZU92ZXJsYXBEZiA8LSBhcy5kYXRhLmZyYW1lKGNvbXBsZXRlX292ZXJsYXBzKSAlPiUgZHBseXI6Om11dGF0ZShsb29wSURBbGwgPSBwYXN0ZShzZXFuYW1lcywgc3RhcnQsIGVuZCwgc2VwID0gIl8iKSkKbGFyZ2VzdExvb3BzRGYgPC0gYXMuZGF0YS5mcmFtZShsYXJnZXN0TG9vcHNHcikgJT4lIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoc2VxbmFtZXMsIHN0YXJ0LCBlbmQsIHNlcCA9ICJfIikpCgpsb29wSURwYWlycyA8LSBkYXRhLmZyYW1lKGxvb3BJRCA9IGNvbXBsZXRlT3ZlcmxhcERmJGxvb3BJREFsbFtxdWVyeUhpdHMob3ZlcmxhcHMpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSUQyID0gbGFyZ2VzdExvb3BzRGYkbG9vcElEW3N1YmplY3RIaXRzKG92ZXJsYXBzKV0pCgphbGxMb29wc0Fubm90YXRlZCA8LSBhbGxMb29wcyAlPiUgZHBseXI6Om11dGF0ZShsb29wSUQgPSBwYXN0ZShjaHJvbTEsIHN0YXJ0MSwgZW5kMiwgc2VwID0gIl8iKSkgJT4lIGRwbHlyOjpsZWZ0X2pvaW4obG9vcElEcGFpcnMsIGJ5ID0gYygibG9vcElEIikpCgp0ZW1wIDwtIGFsbExvb3BzQW5ub3RhdGVkICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYygiUC1FIiwgIlAtUCIsICJFLUUiKSkgJT4lIGRwbHlyOjptdXRhdGUoaGFzU1MgPSAhaXMubmEobG9vcElEMikpCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PWdyb3VwMSkgKSRkaWZmX2RUQUdfRE1TTwogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PWdyb3VwMikgKSRkaWZmX2RUQUdfRE1TTwogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KcHYgPC0gY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsIFRSVUUsIEZBTFNFKSkKZ2dwbG90KHRlbXAsIGFlcyh4ID0gaGFzU1MsIHkgPSBkaWZmX2RUQUdfRE1TTykpICsgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBoYXNTUyksIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEpICsKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gaGFzU1MpLCBmdW4gPSBtZWFuLCAKICAgICAgICAgICAgICAgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAyLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcHYsIHNpemUgPSA1LCBjb2xvciA9ICJibGFjayIpICsKICBnZ3RpdGxlKCJQRS1QRSIpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkKCgojIENvdW50aW5nIGxvb3AgdHlwZXMKYWxsTG9vcHNBbm5vdGF0ZWRGaWx0ZXJlZCA8LSBhbGxMb29wc0Fubm90YXRlZCAlPiUgZHBseXI6OmZpbHRlcighaXMubmEobG9vcElEMikpICU+JQogIGRwbHlyOjpmaWx0ZXIoIShsb29wSUQgPT0gbG9vcElEMikpCnRlbXAgPC0gYWxsTG9vcHNBbm5vdGF0ZWRGaWx0ZXJlZCAlPiUgZHBseXI6OnNlbGVjdChsb29wSUQyLCBBbm5vMikKcmVzdWx0IDwtIHRlbXAgJT4lCiAgZ3JvdXBfYnkobG9vcElEMiwgQW5ubzIpICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgZ3JvdXBfYnkobG9vcElEMikgJT4lCiAgbXV0YXRlKGZyZXF1ZW5jeSA9IGNvdW50IC8gc3VtKGNvdW50KSkgJT4lCiAgYXJyYW5nZShsb29wSUQyLCBBbm5vMikKCnJlc3VsdCA8LSBsYXJnZXN0X2xvb3BzICU+JSBkcGx5cjo6bGVmdF9qb2luKHJlc3VsdCwgYnkgPSBjKCJsb29wSUQiID0gImxvb3BJRDIiKSkKCmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3YiKSkkZ2VuZQpnZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2IikpJGdlbmUKCmRhdGEgPC0gdGliYmxlKAogIGdlbmUgPSBjKGdlbmUuZ3JvdXAxLCBnZW5lLmdyb3VwMiksCiAgZ3JvdXAgPSBjKHJlcCgiZ3JvdXAxIiwgbGVuZ3RoKGdlbmUuZ3JvdXAxKSksCiAgICAgICAgICAgIHJlcCgiZ3JvdXAyIiwgbGVuZ3RoKGdlbmUuZ3JvdXAyKSkpCikKCmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihyZXN1bHQsIGJ5ID0gYygiZ2VuZSIpKQpkYXRhIDwtIGRhdGEgJT4lIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkKCmFsbF9hbm5vMiA8LSB1bmlxdWUoZGF0YSRBbm5vMikKCiMgQ2FsY3VsYXRlIGF2ZXJhZ2UgZnJlcXVlbmN5IG9mIEFubm8yIGZvciBlYWNoIGdlbmUgaW4gZWFjaCBncm91cApyZXN1bHQgPC0gZGF0YSAlPiUKICAjIEVuc3VyZSBhbGwgcG9zc2libGUgQW5ubzIgdmFsdWVzIGFyZSBwcmVzZW50IGZvciBlYWNoIGdlbmUgYW5kIGdyb3VwCiAgY29tcGxldGUoZ2VuZSwgQW5ubzIgPSBhbGxfYW5ubzIsIGZpbGwgPSBsaXN0KGZyZXF1ZW5jeSA9IDApKSAlPiUgCiAgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbigKICAgIGdlbmUgJWluJSBnZW5lLmdyb3VwMSB+ICJncm91cDEiLAogICAgZ2VuZSAlaW4lIGdlbmUuZ3JvdXAyIH4gImdyb3VwMiIsCiAgICBUUlVFIH4gTkEKICApKSAlPiUKICBkcGx5cjo6c2VsZWN0KGdyb3VwLCBBbm5vMiwgZnJlcXVlbmN5KQogIAoKZ2dwbG90KHJlc3VsdCwgYWVzKHggPSBBbm5vMiwgZmlsbCA9IGdyb3VwLCB5ID0gZnJlcXVlbmN5KSkgKyBnZW9tX2JveHBsb3QoKQoKYGBgCgoKYGBge3J9CiMgVmlldyByZXN1bHRzCmdncGxvdChsYXJnZXN0X2xvb3BzLCBhZXMoeCA9IGxvb3Bfd2lkdGgpKSArIGdlb21faGlzdG9ncmFtKCkKCgojIyMgQ2hlY2tpbmcgaG93IG1hbnkgZ2VuZXMgZnJvbSBlYWNoIGdyb3VwIGhhcyBlbmNvbXBhc3NpbmcgUy1TCmdlbmUuZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3YiKSkkZ2VuZQpnZW5lLmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2IikpJGdlbmUKCmRhdGEgPC0gdGliYmxlKAogIGdlbmUgPSBjKGdlbmUuZ3JvdXAxLCBnZW5lLmdyb3VwMiksCiAgZ3JvdXAgPSBjKHJlcCgiZ3JvdXAxIiwgbGVuZ3RoKGdlbmUuZ3JvdXAxKSksCiAgICAgICAgICAgIHJlcCgiZ3JvdXAyIiwgbGVuZ3RoKGdlbmUuZ3JvdXAyKSkpCikKCmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihsYXJnZXN0X2xvb3BzLCBieSA9IGMoImdlbmUiKSkKZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bXV0YXRlKAogIGhhc1NTID0gaWZlbHNlKGlzLm5hKGxvb3Bfd2lkdGgpLCAiTk8iLCAiWUVTIikKKQoKZGF0YV9zdW1tYXJ5IDwtIGRhdGEgJT4lCiAgZ3JvdXBfYnkoZ3JvdXApICU+JQogIHN1bW1hcml6ZSgKICAgIHRvdGFsID0gbigpLAogICAgaGFzU1NfeWVzID0gc3VtKGhhc1NTID09ICJZRVMiKSwKICAgIHBlcmNlbnRhZ2VfeWVzID0gKGhhc1NTX3llcyAvIHRvdGFsKSAqIDEwMAogICkKCmdncGxvdChkYXRhX3N1bW1hcnksIGFlcyh4ID0gZ3JvdXAsIHkgPSBwZXJjZW50YWdlX3llcywgZmlsbCA9IGdyb3VwKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvciA9ICJibGFjayIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBFYWNoIEdyb3VwIHdpdGggaGFzU1MgPSBZRVMiLAogICAgeCA9ICJHcm91cCIsCiAgICB5ID0gIlBlcmNlbnRhZ2UgKCUpIgogICkgKyB5bGltKDAsIDEwMCkgKwogIHRoZW1lX21pbmltYWwoKQoKCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihoYXNTUyA9PSAiWUVTIikKZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGxvb3Bfd2lkdGgKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDIpICkkbG9vcF93aWR0aAogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KcHYgPC0gY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsICJncm91cDEiLCAiZ3JvdXAyIikpCgpnZ3Bsb3QodGVtcCwgYWVzKHggPSBncm91cCwgeSA9IGxvb3Bfd2lkdGgpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwdiwgc2l6ZSA9IDUsIGNvbG9yID0gImJsYWNrIikKCiMjIyBDb21wYXJpbmcgUk5BIHBlcnR1cmJhdGlvbgoKZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoMSwgNCwgNSkpICU+JQogIGRwbHlyOjptdXRhdGUoaGFzU1MgPSBpZmVsc2UoZW5zZW1ibF9nZW5lX2lkICVpbiUgbGFyZ2VzdF9sb29wcyRnZW5lLCAiaGFzU1MiLCAibm9TUyIpKQoKCmdncGxvdChkaWZmLlJOQSwgYWVzKHggPSBhYnMobG9nMkZvbGRDaGFuZ2UpLCBjb2xvciA9IGhhc1NTKSkgKwogIHN0YXRfZWNkZihzaXplID0gMC40KSArCiAgbGFicygKICAgIHggPSAiQWJzb2x1dGUgbG9nMihmb2xkIGNoYW5nZSkiLAogICAgeSA9ICJDdW11bGF0aXZlIFByb2JhYmlsaXR5IgogICkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMS41KSkgKwogIHRoZW1lX2NsYXNzaWMoKSArICMgQ2xlYW4gdGhlbWUKICB0aGVtZSgKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICAgKQoKCiMjIyBDaGVja2luZyBDaElQIHBlYWsgZGVuc2l0eQpsYXJnZXN0X2xvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGxhcmdlc3RfbG9vcHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcW5hbWVzLmZpZWxkID0gImxvb3BfY2hyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQuZmllbGQgPSAibG9vcF9zdGFydCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5maWVsZCA9ICJsb29wX2VuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpCgojIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBDaElQLXNlcSBwZWFrcyBhbmQgdGhlIGxhcmdlc3QgbG9vcHMKY2hpcF9vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMobGFyZ2VzdF9sb29wc0dyLCBwZWFrLkNUQ0YpCgojIENvdW50IHRoZSBudW1iZXIgb2YgQ2hJUC1zZXEgcGVha3MgcGVyIGxvb3AKbG9vcF9wZWFrX2NvdW50cyA8LSB0YWJsZShxdWVyeUhpdHMoY2hpcF9vdmVybGFwcykpCgojIENyZWF0ZSBhIGRhdGEgZnJhbWUgd2l0aCB0aGUgY291bnRzIGFuZCBsb29wIGRldGFpbHMKbGFyZ2VzdF9sb29wcyRkZW5zaXR5IDwtIDAgICMgSW5pdGlhbGl6ZSBkZW5zaXR5IGNvbHVtbgpsYXJnZXN0X2xvb3BzJGNvdW50IDwtIDAgICAgIyBJbml0aWFsaXplIHBlYWsgY291bnQgY29sdW1uCgojIEFkZCBwZWFrIGNvdW50cyB0byB0aGUgY29ycmVzcG9uZGluZyBsb29wcwpsYXJnZXN0X2xvb3BzW2FzLm51bWVyaWMobmFtZXMobG9vcF9wZWFrX2NvdW50cykpLCAiY291bnQiXSA8LSBhcy5pbnRlZ2VyKGxvb3BfcGVha19jb3VudHMpCgojIENhbGN1bGF0ZSB0aGUgZGVuc2l0eSAocGVha3MgcGVyIGtpbG9iYXNlKQpsYXJnZXN0X2xvb3BzJGRlbnNpdHkgPC0gbGFyZ2VzdF9sb29wcyRjb3VudCAvICgobGFyZ2VzdF9sb29wcyRsb29wX3dpZHRoLTEpIC8gMTAwMCkKCgpkYXRhIDwtIHRpYmJsZSgKICBnZW5lID0gYyhnZW5lLmdyb3VwMSwgZ2VuZS5ncm91cDIpLAogIGdyb3VwID0gYyhyZXAoImdyb3VwMSIsIGxlbmd0aChnZW5lLmdyb3VwMSkpLAogICAgICAgICAgICByZXAoImdyb3VwMiIsIGxlbmd0aChnZW5lLmdyb3VwMikpKQopCgpkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4obGFyZ2VzdF9sb29wcywgYnkgPSBjKCJnZW5lIikpCmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZSgKICBoYXNTUyA9IGlmZWxzZShpcy5uYShsb29wX3dpZHRoKSwgIk5PIiwgIllFUyIpCikgJT4lIGRwbHlyOjpmaWx0ZXIoaGFzU1MgPT0gIllFUyIpCgpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkZGVuc2l0eQogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRkZW5zaXR5CiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKcHYgPC0gY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsICJncm91cDEiLCAiZ3JvdXAyIikpCgpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGRlbnNpdHkpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgCiAgICAgICAgICAgICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHB2LCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2d0aXRsZSgiQ1RDRiIpCgoKYGBgCgojIyMgWzMuNDFdIEZpbmRpbmcgbGFyZ2VzdCBjb252ZXJnZW50IGVuY29tcGFzc2luZyBTLVMKIyMjIyBGaWx0ZXJpbmcgY29udmVyZ2VudCBTLVMgbG9vcHMKYGBge3J9Cm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCgojIElNUE9SVCBTLVMgTE9PUFMKYWxsTG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5LnRzdiIpKQpzdHJMb29wcyA8LSBhbGxMb29wcyAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoIlMtUyIpKQp0ZW1wIDwtIHN0ckxvb3BzICU+JSBkcGx5cjo6c2VsZWN0KGMoMSwgMiwgMywgNSwgNikpICAjIEFzc3VtaW5nIGNvbHVtbnMgaW5jbHVkZSBhbmNob3IgcG9zaXRpb25zCmNvbG5hbWVzKHRlbXApIDwtIGMoImNocm9tIiwgInN0YXJ0MSIsICJlbmQxIiwgInN0YXJ0MiIsICJlbmQyIikKc3RyTG9vcHNHcjEgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKAogIHRlbXAgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20sIHN0YXJ0ID0gc3RhcnQxLCBlbmQgPSBlbmQxKQopCnN0ckxvb3BzR3IyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSgKICB0ZW1wICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tLCBzdGFydCA9IHN0YXJ0MiwgZW5kID0gZW5kMikKKQoKIyBJTVBPUlQgQ1RDRiBNT1RJRiBBTk5PVEFUSU9OCmN0Y2ZNb3RpZnMgPC0gZnJlYWQoaGVyZShyZWZEaXIsICIzMzI0OF9DVENGXzA3LTcyOV9CcnVjZS00X3BlYWtzLm1lcmdlUGVhay5tb3RpZkFubm90YXRlZC5iZWQiKSkKY29sbmFtZXMoY3RjZk1vdGlmcykgPC0gYygiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgIm1vdGlmIikKY3RjZkdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShjdGNmTW90aWZzLCBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKQoKIyBBbm5vdGF0ZSBlYWNoIGxvb3AgYW5jaG9yIHdpdGggQ1RDRiBtb3RpZnMKYW5jaG9yMV93aXRoX2N0Y2YgPC0gZmluZE92ZXJsYXBzKHN0ckxvb3BzR3IxLCBjdGNmR3IpCmFuY2hvcjJfd2l0aF9jdGNmIDwtIGZpbmRPdmVybGFwcyhzdHJMb29wc0dyMiwgY3RjZkdyKQoKIyBHZXQgbW90aWYgaW5mb3JtYXRpb24gZm9yIGFuY2hvcjEgb3ZlcmxhcHMKYW5jaG9yMV9jdGNmX21vdGlmIDwtIHJlcChOQSwgbGVuZ3RoKHN0ckxvb3BzR3IxKSkgICMgSW5pdGlhbGl6ZSBtb3RpZiB2ZWN0b3IKYW5jaG9yMV9jdGNmX21vdGlmW3F1ZXJ5SGl0cyhhbmNob3IxX3dpdGhfY3RjZildIDwtIGN0Y2ZHcltzdWJqZWN0SGl0cyhhbmNob3IxX3dpdGhfY3RjZildJG1vdGlmCgojIEdldCBtb3RpZiBpbmZvcm1hdGlvbiBmb3IgYW5jaG9yMiBvdmVybGFwcwphbmNob3IyX2N0Y2ZfbW90aWYgPC0gcmVwKE5BLCBsZW5ndGgoc3RyTG9vcHNHcjIpKSAgIyBJbml0aWFsaXplIG1vdGlmIHZlY3RvcgphbmNob3IyX2N0Y2ZfbW90aWZbcXVlcnlIaXRzKGFuY2hvcjJfd2l0aF9jdGNmKV0gPC0gY3RjZkdyW3N1YmplY3RIaXRzKGFuY2hvcjJfd2l0aF9jdGNmKV0kbW90aWYKCiMgQWRkIG1vdGlmIGluZm9ybWF0aW9uIHRvIHN0ckxvb3BzCnN0ckxvb3BzIDwtIHN0ckxvb3BzICU+JQogIG11dGF0ZSgKICAgIGFuY2hvcjFfbW90aWYgPSBhbmNob3IxX2N0Y2ZfbW90aWYsCiAgICBhbmNob3IyX21vdGlmID0gYW5jaG9yMl9jdGNmX21vdGlmCiAgKQoKIyBGaWx0ZXIgZm9yIGNvbnZlcmdlbnQgQ1RDRiBpbnRlcmFjdGlvbnMgKGZvcndhcmQgaW4gYW5jaG9yMSwgcmV2ZXJzZSBpbiBhbmNob3IyKQpjb252ZXJnZW50X2xvb3BzIDwtIHN0ckxvb3BzICU+JQogIGZpbHRlcihhbmNob3IxX21vdGlmID09ICJmd2QiICYgYW5jaG9yMl9tb3RpZiA9PSAicmV2IikgJT4lIGRwbHlyOjpmaWx0ZXIoQW5ubzIgJWluJSBjKCJTLVMiKSkKYGBgCgojIyMjIFByb2Nlc3NpbmcKYGBge3J9CiMgRXh0cmFjdCBsb29wIGJvdW5kYXJ5IGZyb20gbGVmdCB0byByaWdodAp0ZW1wIDwtIGNvbnZlcmdlbnRfbG9vcHMgJT4lIGRwbHlyOjpzZWxlY3QoYygxLCAyLCA2KSkKY29sbmFtZXModGVtcCkgPC0gYygiY2hyb20iLCAic3RhcnQiLCAiZW5kIikKc3RyTG9vcHNHciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUodGVtcCkKCiMgSU1QT1JUIFRTUwpmbGFua1NpemUgPC0gMTAKZ2VuZS50YiA8LSBmcmVhZChoZXJlKHJlZkRpciwgIm1tMTBfR1JDbTM4LnA2X2dlbmVfc29ydGVkLmJlZCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKFRTUyA9IGlmZWxzZShWNCA9PSAiKyIsIFYyLCBWMyksCiAgICAgICAgICAgICAgICBUU1NzdGFydCA9IFRTUyAtIGZsYW5rU2l6ZSwKICAgICAgICAgICAgICAgIFRTU2VuZCA9IFRTUyArIGZsYW5rU2l6ZSkgJT4lCiAgZHBseXI6OnNlbGVjdChWMSwgVFNTc3RhcnQsIFRTU2VuZCwgVjYsIFY1KQpjb2xuYW1lcyhnZW5lLnRiKSA8LSBjKCJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAiZW5zZW1ibCIsICJnZW5lIikKZ2VuZUdyIDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShnZW5lLnRiLCBrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKQoKCiMgRmluZCBvdmVybGFwcyBiZXR3ZWVuIGxvb3BzIGFuZCBUU1MKb3ZlcmxhcHMgPC0gZmluZE92ZXJsYXBzKGdlbmVHciwgc3RyTG9vcHNHcikKCiMgQW5ub3RhdGUgb3ZlcmxhcHMKdHNzX3dpdGhfbG9vcHMgPC0gZ2VuZUdyW3F1ZXJ5SGl0cyhvdmVybGFwcyldCmxvb3BzX3dpdGhfdHNzIDwtIHN0ckxvb3BzR3Jbc3ViamVjdEhpdHMob3ZlcmxhcHMpXQoKIyBDb21iaW5lIGludG8gYSBkYXRhIGZyYW1lIGZvciBwcm9jZXNzaW5nCmxvb3BfZGF0YSA8LSBkYXRhLmZyYW1lKGdlbmUgPSB0c3Nfd2l0aF9sb29wcyRlbnNlbWJsLAogICAgICAgICAgICAgICAgICAgICAgICBsb29wX2NociA9IHNlcW5hbWVzKGxvb3BzX3dpdGhfdHNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9zdGFydCA9IHN0YXJ0KGxvb3BzX3dpdGhfdHNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9lbmQgPSBlbmQobG9vcHNfd2l0aF90c3MpLAogICAgICAgICAgICAgICAgICAgICAgICBsb29wX3dpZHRoID0gd2lkdGgobG9vcHNfd2l0aF90c3MpKQoKIyBJZGVudGlmeSB0aGUgbGFyZ2VzdCBsb29wIGZvciBlYWNoIGdlbmUKbGFyZ2VzdF9sb29wcyA8LSBsb29wX2RhdGFbb3JkZXIobG9vcF9kYXRhJGdlbmUsIC1sb29wX2RhdGEkbG9vcF93aWR0aCksIF0KbGFyZ2VzdF9sb29wcyA8LSBsYXJnZXN0X2xvb3BzWyFkdXBsaWNhdGVkKGxhcmdlc3RfbG9vcHMkZ2VuZSksIF0KbGFyZ2VzdF9sb29wcyA8LSBsYXJnZXN0X2xvb3BzICU+JSBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKGxvb3BfY2hyLCBsb29wX3N0YXJ0LCBsb29wX2VuZCwgc2VwID0gIl8iKSkKbGFyZ2VzdF9sb29wcyA8LSBsYXJnZXN0X2xvb3BzW29yZGVyKGxhcmdlc3RfbG9vcHMkbG9vcF9jaHIsIGxhcmdlc3RfbG9vcHMkbG9vcF9zdGFydCksXQpyb3duYW1lcyhsYXJnZXN0X2xvb3BzKSA8LSBOVUxMCgojIENoZWNraW5nIHNtYWxsZXIgbG9vcHMKYWxsTG9vcHNHciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoYWxsTG9vcHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFuYW1lcy5maWVsZCA9ICJjaHJvbTEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQuZmllbGQgPSAic3RhcnQxIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5maWVsZCA9ICJlbmQyIikKbGFyZ2VzdExvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGxhcmdlc3RfbG9vcHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxbmFtZXMuZmllbGQgPSAibG9vcF9jaHIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LmZpZWxkID0gImxvb3Bfc3RhcnQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5maWVsZCA9ICJsb29wX2VuZCIpCmxhcmdlc3RMb29wc0dyIDwtIHNvcnQodW5pcXVlKGxhcmdlc3RMb29wc0dyKSkKY29tcGxldGVfb3ZlcmxhcHMgPC0gc3Vic2V0QnlPdmVybGFwcyhhbGxMb29wc0dyLCBsYXJnZXN0TG9vcHNHciwgdHlwZSA9ICJ3aXRoaW4iKQpvdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMoY29tcGxldGVfb3ZlcmxhcHMsIGxhcmdlc3RMb29wc0dyKQoKCmNvbXBsZXRlT3ZlcmxhcERmIDwtIGFzLmRhdGEuZnJhbWUoY29tcGxldGVfb3ZlcmxhcHMpICU+JSBkcGx5cjo6bXV0YXRlKGxvb3BJREFsbCA9IHBhc3RlKHNlcW5hbWVzLCBzdGFydCwgZW5kLCBzZXAgPSAiXyIpKQpsYXJnZXN0TG9vcHNEZiA8LSBhcy5kYXRhLmZyYW1lKGxhcmdlc3RMb29wc0dyKSAlPiUgZHBseXI6Om11dGF0ZShsb29wSUQgPSBwYXN0ZShzZXFuYW1lcywgc3RhcnQsIGVuZCwgc2VwID0gIl8iKSkKCmxvb3BJRHBhaXJzIDwtIGRhdGEuZnJhbWUobG9vcElEID0gY29tcGxldGVPdmVybGFwRGYkbG9vcElEQWxsW3F1ZXJ5SGl0cyhvdmVybGFwcyldLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJRDIgPSBsYXJnZXN0TG9vcHNEZiRsb29wSURbc3ViamVjdEhpdHMob3ZlcmxhcHMpXSkKCiMgYWxsTG9vcHNBbm5vdGF0ZWQgPC0gYWxsTG9vcHMgJT4lIGRwbHlyOjptdXRhdGUobG9vcElEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIGVuZDIsIHNlcCA9ICJfIikpICU+JSBkcGx5cjo6bGVmdF9qb2luKGxvb3BJRHBhaXJzLCBieSA9IGMoImxvb3BJRCIpKQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZkN1dG9mZiA8LSAwLjIKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IGRpZmZDdXRvZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub0xpc3QgPSBjKCJQLVAiLCAiUC1FIiwgIlAtUyIsICJQLVgiKSkgJT4lIHVubmVzdChnZW5lKSAlPiUKICBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBlbmQyLCBzZXAgPSAiXyIpKQp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmxlZnRfam9pbihsb29wSURwYWlycywgYnkgPSBjKCJsb29wSUQiKSkKdGVtcDIgPC0gdGVtcCAlPiUgZHBseXI6OnNlbGVjdChnZW5lLCBsb29wSUQyKSAlPiUKICBncm91cF9ieShnZW5lKSAlPiUgICAgICAgICAgICAgICMgR3JvdXAgZGF0YSBieSB0aGUgJ2dlbmUnIGNvbHVtbgogIHN1bW1hcml6ZShnZW5lSGFzU1MgPSAhYWxsKGlzLm5hKGxvb3BJRDIpKSkgICMgQ2hlY2sgaWYgYWxsIGxvb3BJRDIgdmFsdWVzIGZvciBlYWNoIGdlbmUgYXJlIE5BCnRlbXAgPC0gdGVtcCAlPiUgbGVmdF9qb2luKHRlbXAyLCBieSA9IGMoImdlbmUiKSkKZGF0YS5hbGwgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGlmZWxzZSghZ2VuZUhhc1NTLCAiTm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGlzLm5hKGxvb3BJRDIpLCAiT3V0c2lkZSIsICJXaXRoaW4iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gc3RhcnQyIC0gc3RhcnQxKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpvdXRmaWxlIDwtIGRhdGEuYWxsICU+JSBkcGx5cjo6c2VsZWN0KGxvb3BJRDIsIGdlbmUpICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShsb29wSUQyKSkgJT4lCiAgc2VwYXJhdGUobG9vcElEMiwgaW50byA9IGMoImNocm9tIiwgInN0YXJ0IiwgImVuZCIpLCBzZXAgPSAiXyIsIGNvbnZlcnQgPSBUUlVFKQojIGZ3cml0ZShvdXRmaWxlLCBoZXJlKGNvbnNlbnN1c0RpciwgImNvbnZlcmdlbnRfc3NfZG9tYWluLmJlZCIpLCBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSkKYGBgCgojIyMjIFBsb3R0aW5nCmBgYHtyfQpkYXRhIDwtIGRhdGEuYWxsICU+JSBkcGx5cjo6ZmlsdGVyKEFubm8yICVpbiUgYygiUC1FIikpCgp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoY2hyb20xLCBzdGFydDEsIGVuZDEsIGNocm9tMiwgc3RhcnQyLCBlbmQyLCBncm91cCkgJT4lIGRpc3RpbmN0KCkKCnRlbXAxIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gIk5vIikgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKQpmd3JpdGUodGVtcDEsIGhlcmUoY29uc2Vuc3VzRGlyLCAiaW5zdWxhdGVkX2RvbWFpbl9zc19uby5iZWRwZSIpLCBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSkKdGVtcDIgPC0gdGVtcCAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiV2l0aGluIikgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKQpmd3JpdGUodGVtcDIsIGhlcmUoY29uc2Vuc3VzRGlyLCAiaW5zdWxhdGVkX2RvbWFpbl9zc193aXRoaW4uYmVkcGUiKSwgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gRkFMU0UpCnRlbXAzIDwtIHRlbXAgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gIk91dHNpZGUiKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApCmZ3cml0ZSh0ZW1wMywgaGVyZShjb25zZW5zdXNEaXIsICJpbnN1bGF0ZWRfZG9tYWluX3NzX291dHNpZGUuYmVkcGUiKSwgc2VwID0gIlx0IiwgY29sLm5hbWVzID0gRkFMU0UpCgp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoaWQsIGdyb3VwLCBzaXplKSAlPiUgZGlzdGluY3QoKQoKCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRzaXplCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJHNpemUKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9Cgpjb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgIk5vIiwgIldpdGhpbiIpKQpjb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgIk5vIiwgIk91dHNpZGUiKSkKY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsICJPdXRzaWRlIiwgIldpdGhpbiIpKQoKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBzaXplLCBmaWxsID0gZ3JvdXApKSArIAogIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0qIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLCBhbHBoYSA9IC40LCAsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9rYl9tYikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM3Nzc3NzciLCAiI0YyOEUyQyIsICIjRjI4RTJDIikpICsKICBzdGF0X3N1bW1hcnkoCiAgICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwKICAgICAgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsCiAgICAgIGZpbGwgPSAiYmxhY2siLCBjb2xvciA9ICJibGFjayIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpCiAgKSArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLCAgICAKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlcwogICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApICtsYWJzKHkgPSAiTG9vcCBzaXplIikKCmZpbGVOYW1lIDwtIHBhc3RlMCgiaW5zdWxhdGlvbkJvdW5kYXJ5X3NpemVfY29udlNTX1BFIikKd2lkdGggPC0zMyptbVRvSW5jaApoZWlnaHQgPC0gMzUqbW1Ub0luY2gKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRkaWZmX2RUQUdfRE1TTwogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRkaWZmX2RUQUdfRE1TTwogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCnRlbXAgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChncm91cCwgaWQsIGRpZmZfZFRBR19ETVNPKSAlPiUgZGlzdGluY3QoKQoKY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsICJObyIsICJXaXRoaW4iKSkKY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsICJObyIsICJPdXRzaWRlIikpCmNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCAiT3V0c2lkZSIsICJXaXRoaW4iKSkKCnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gZ3JvdXAsIHkgPSBkaWZmX2RUQUdfRE1TTywgZmlsbCA9IGdyb3VwKSkgKyAKICBnZW9tX3Zpb2xpbihsaW5ld2lkdGggPSBsaW5lTWVkaXVtICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyAgIAogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzc3Nzc3NyIsICIjRjI4RTJDIiwgIiNGMjhFMkMiKSkgKwogIHN0YXRfc3VtbWFyeSgKICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LAogICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMykKICApICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksICAgIAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzCiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uCiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvbgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkgK2xhYnMoeSA9ICLOlCBsb29wIHNjb3JlIikgKyAgICAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLAogICAgICAgICAgICAgYWxwaGEgPSAxLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgICAgICAgICBsaW5lZW5kID0gInNxdWFyZSIpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTAuMiwKICAgICAgICAgICAgIGFscGhhID0gMC41LCAKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICAgICAgICAgbGluZWVuZCA9ICJzcXVhcmUiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjgsIDAuNSkpCiAgICAKZmlsZU5hbWUgPC0gcGFzdGUwKCJpbnN1bGF0aW9uQm91bmRhcnlfZGVsdGFfY29udlNTX3BlIikKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkgIAoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCgptaW5WYWx1ZSA8LSAtNApvYnNleHAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMCgibG9vcFNjb3JlX2NvbnNfb2JzZXhwLnRzdiIpKSkgJT4lCiAgZHBseXI6Om11dGF0ZShsb2dfb2JzZXhwX0RNU08gPSBpZl9lbHNlKG9ic2V4cF9ETVNPID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9ETVNPKSksCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RUQUcgPSBpZl9lbHNlKG9ic2V4cF9kVEFHID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9kVEFHKSksCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX0E0ODUgPSBpZl9lbHNlKG9ic2V4cF9BNDg1ID09IDAsIG1pblZhbHVlLCBsb2cyKG9ic2V4cF9BNDg1KSksCiAgICAgICAgICAgICAgICBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPID0gbG9nX29ic2V4cF9kVEFHIC0gbG9nX29ic2V4cF9ETVNPLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX0E0ODVfRE1TTyA9IGxvZ19vYnNleHBfQTQ4NSAtIGxvZ19vYnNleHBfRE1TTykKCmRhdGEyIDwtIGRhdGEgJT4lIGxlZnRfam9pbihvYnNleHAsIGJ5ID0gYygiaWQiKSkKCnRlbXAgPC0gZGF0YTIgJT4lIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGlkLCBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPKSAlPiUgZGlzdGluY3QoKQoKCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGxvZ19vYnNleHBfZGlmZl9kVEFHX0RNU08KICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9Cgpjb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgIk5vIiwgIldpdGhpbiIpKQpjb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgIk5vIiwgIk91dHNpZGUiKSkKY29udlB2YWx1ZShnZXRQdmFsV2lsY294KHRlbXAsICJPdXRzaWRlIiwgIldpdGhpbiIpKQoKCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBmaWxsID0gZ3JvdXApKSArIAogIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0qIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLCBhbHBoYSA9IC40LCAsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAgYWxwaGEgPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgdGhlbWVfY2xhc3NpYygpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzc3Nzc3NyIsICIjRjI4RTJDIiwgIiNGMjhFMkMiKSkgKwogIAogIHN0YXRfc3VtbWFyeSgKICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LAogICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMykKICApICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksICAgIAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGFuZ2xlID0gNDUsICAgICAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyA0NSBkZWdyZWVzCiAgICAgIGhqdXN0ID0gMSwgICAgICAgIyBBZGp1c3QgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uCiAgICAgIHZqdXN0ID0gMSAgICAgICAgIyBBZGp1c3QgdmVydGljYWwganVzdGlmaWNhdGlvbgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICkgK2xhYnMoeSA9ICJsb2cyKGZjIG9mIG9icy9leHApIikgKyAgICAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLAogICAgICAgICAgICAgYWxwaGEgPSAxLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgICAgICAgICBsaW5lZW5kID0gInNxdWFyZSIpICsgCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0yLCAyKSkKICAgIHdpZHRoIDwtMzAqbW1Ub0luY2gKaGVpZ2h0IDwtIDM1Km1tVG9JbmNoCmZpbGVOYW1lIDwtIHBhc3RlMCgiaW5zdWxhdGlvbkJvdW5kYXJ5X29ic2V4cF9jb252U1NfcGUiKQpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKSAgCgoKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpkYXRhIDwtIGRhdGEuYWxsCmdlbmUud2l0aGluQm91bmRhcnkgPC0gdW5pcXVlKChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJXaXRoaW4iKSkkZ2VuZSkKZ2VuZS5vdXRzaWRlQm91bmRhcnkgPC0gdW5pcXVlKChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJPdXRzaWRlIikpJGdlbmUpCmdlbmUubm9Cb3VuZGFyeSA8LSB1bmlxdWUoKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gIk5vIikpJGdlbmUpCgpnZW5lLndCb3VuZGFyeSA8LSB1bmlxdWUoYyhnZW5lLndpdGhpbkJvdW5kYXJ5LCBnZW5lLm91dHNpZGVCb3VuZGFyeSkpCgpnZW5lLmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2IikpJGdlbmUKZ2VuZS5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdiIpKSRnZW5lCgpwcmludCgicGVyYyBvZiBnZW5lIHdpdGggbG9vcCB3aXRoaW4gQm91bmRhcnkiKQpzdW0oZ2VuZS5ncm91cDEgJWluJSBnZW5lLndpdGhpbkJvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDEpKjEwMApzdW0oZ2VuZS5ncm91cDIgJWluJSBnZW5lLndpdGhpbkJvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDIpKjEwMAoKcHJpbnQoInBlcmMgb2YgZ2VuZSB3aXRoIGxvb3Agb3V0c2lkZSBCb3VuZGFyeSIpCnN1bShnZW5lLmdyb3VwMSAlaW4lIGdlbmUub3V0c2lkZUJvdW5kYXJ5KS9sZW5ndGgoZ2VuZS5ncm91cDEpKjEwMApzdW0oZ2VuZS5ncm91cDIgJWluJSBnZW5lLm91dHNpZGVCb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDAKCnByaW50KCJwZXJjIG9mIGdlbmUgd2l0aCBsb29wIHdpdGggbm8gQm91bmRhcnkiKQpzdW0oZ2VuZS5ncm91cDEgJWluJSBnZW5lLm5vQm91bmRhcnkpL2xlbmd0aChnZW5lLmdyb3VwMSkqMTAwCnN1bShnZW5lLmdyb3VwMiAlaW4lIGdlbmUubm9Cb3VuZGFyeSkvbGVuZ3RoKGdlbmUuZ3JvdXAyKSoxMDAKCgpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoZW5zZW1ibF9nZW5lX2lkLCBsb2cyRm9sZENoYW5nZSwgc2hyaW5rZWRfbG9nMkZDLCBwYWRqLCBleHRlcm5hbF9nZW5lX25hbWUpICU+JQogIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oCiAgICBlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lLndCb3VuZGFyeSB+ICJ3aXRoaW5Cb3VuZGFyeSIsCiAgICBlbnNlbWJsX2dlbmVfaWQgJWluJSBnZW5lLm5vQm91bmRhcnkgfiAibm9Cb3VuZGFyeSIsCiAgICBUUlVFIH4gTkEKICApKSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShncm91cCkpICU+JQogIGRwbHlyOjptdXRhdGUoYWJzTG9nMkZDID0gYWJzKGxvZzJGb2xkQ2hhbmdlKSkKa3NfcmVzdWx0IDwtIGtzLnRlc3QoCiAgZGlmZi5STkEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gIndpdGhpbkJvdW5kYXJ5IikgJT4lIHB1bGwoYWJzTG9nMkZDKSwKICBkaWZmLlJOQSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAibm9Cb3VuZGFyeSIpICU+JSBwdWxsKGFic0xvZzJGQykKKQoKZ2dwbG90KGRpZmYuUk5BLCBhZXMoeCA9IGdyb3VwLCB5ID0gbG9nMkZvbGRDaGFuZ2UpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEpCgojIGdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewojICAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAxKSApJGFic0xvZzJGQwojICAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGFic0xvZzJGQwojICAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQojICAgcmV0dXJuKHdpbCRwLnZhbHVlKQojIH0KIyBjb252UHZhbHVlKGdldFB2YWxXaWxjb3goZGlmZi5STkEsICJ3aXRoQm91bmRhcnkiLCAibm9Cb3VuZGFyeSIpKQojIAoKIyBDcmVhdGUgdGhlIENERiBwbG90CnAgPC0gZ2dwbG90KGRpZmYuUk5BLCBhZXMoeCA9IGFic0xvZzJGQywgY29sb3IgPSBncm91cCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gKGMoIiM3Nzc3NzciLCAiI0YyOEUyQyIpKSkgKwoKc3RhdF9lY2RmKHNpemUgPSAwLjQsIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiAgKSArICMgVXNlIHN0YXRfZWNkZiB0byBwbG90IHRoZSBlbXBpcmljYWwgQ0RGCiAgbGFicygKICAgIHggPSAiQWJzLiBsb2cyKGZvbGQgY2hhbmdlKSIsCiAgICB5ID0gIkN1bXVsYXRpdmUgUHJvYmFiaWxpdHkiCiAgKSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArICMgQ2xlYW4gdGhlbWUKICB0aGVtZSgKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICAgKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJsb2cyRkNfY2RmX2luc3VsYXRpb25Cb3VuZGFyeV9jb252U1NfcGUiKQp3aWR0aCA8LSAzMyptbVRvSW5jaApoZWlnaHQgPC0zMyptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCgpgYGB7cn0KdGVtcCA8LSBhbGxMb29wc0Fubm90YXRlZCAlPiUgZHBseXI6OmZpbHRlcihBbm5vMiAlaW4lIGMoIlAtRSIpKSAlPiUgZHBseXI6Om11dGF0ZShoYXNTUyA9ICFpcy5uYShsb29wSUQyKSkKZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGhhc1NTID09Z3JvdXAxKSApJGRpZmZfZFRBR19ETVNPCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGhhc1NTID09Z3JvdXAyKSApJGRpZmZfZFRBR19ETVNPCiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQpwdiA8LSBjb252UHZhbHVlKGdldFB2YWxXaWxjb3godGVtcCwgVFJVRSwgRkFMU0UpKQpnZ3Bsb3QodGVtcCwgYWVzKHggPSBoYXNTUywgeSA9IGRpZmZfZFRBR19ETVNPKSkgKyBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGhhc1NTKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSkgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBoYXNTUyksIGZ1biA9IG1lYW4sIAogICAgICAgICAgICAgICBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLCB5ID0gMCwgbGFiZWwgPSBwdiwgc2l6ZSA9IDUsIGNvbG9yID0gImJsYWNrIikgKwogIGdndGl0bGUoIlBFIikgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKQoKCgoKIyBDb3VudGluZyBsb29wIHR5cGVzCmFsbExvb3BzQW5ub3RhdGVkRmlsdGVyZWQgPC0gYWxsTG9vcHNBbm5vdGF0ZWQgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGxvb3BJRDIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKCEobG9vcElEID09IGxvb3BJRDIpKQp0ZW1wIDwtIGFsbExvb3BzQW5ub3RhdGVkRmlsdGVyZWQgJT4lIGRwbHlyOjpzZWxlY3QobG9vcElEMiwgQW5ubzIpCnJlc3VsdCA8LSB0ZW1wICU+JQogIGdyb3VwX2J5KGxvb3BJRDIsIEFubm8yKSAlPiUKICBzdW1tYXJpc2UoY291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQogIGdyb3VwX2J5KGxvb3BJRDIpICU+JQogIG11dGF0ZShmcmVxdWVuY3kgPSBjb3VudCAvIHN1bShjb3VudCkpICU+JQogIGFycmFuZ2UobG9vcElEMiwgQW5ubzIpCgpyZXN1bHQgPC0gbGFyZ2VzdF9sb29wcyAlPiUgZHBseXI6OmxlZnRfam9pbihyZXN1bHQsIGJ5ID0gYygibG9vcElEIiA9ICJsb29wSUQyIikpCgpnZW5lLmdyb3VwMSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDEudHN2IikpJGdlbmUKZ2VuZS5ncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdiIpKSRnZW5lCgpkYXRhIDwtIHRpYmJsZSgKICBnZW5lID0gYyhnZW5lLmdyb3VwMSwgZ2VuZS5ncm91cDIpLAogIGdyb3VwID0gYyhyZXAoImdyb3VwMSIsIGxlbmd0aChnZW5lLmdyb3VwMSkpLAogICAgICAgICAgICByZXAoImdyb3VwMiIsIGxlbmd0aChnZW5lLmdyb3VwMikpKQopCgpkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4ocmVzdWx0LCBieSA9IGMoImdlbmUiKSkKZGF0YSA8LSBkYXRhICU+JSBmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpCgphbGxfYW5ubzIgPC0gdW5pcXVlKGRhdGEkQW5ubzIpCgojIENhbGN1bGF0ZSBhdmVyYWdlIGZyZXF1ZW5jeSBvZiBBbm5vMiBmb3IgZWFjaCBnZW5lIGluIGVhY2ggZ3JvdXAKcmVzdWx0IDwtIGRhdGEgJT4lCiAgIyBFbnN1cmUgYWxsIHBvc3NpYmxlIEFubm8yIHZhbHVlcyBhcmUgcHJlc2VudCBmb3IgZWFjaCBnZW5lIGFuZCBncm91cAogIGNvbXBsZXRlKGdlbmUsIEFubm8yID0gYWxsX2Fubm8yLCBmaWxsID0gbGlzdChmcmVxdWVuY3kgPSAwKSkgJT4lIAogIGRwbHlyOjptdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oCiAgICBnZW5lICVpbiUgZ2VuZS5ncm91cDEgfiAiZ3JvdXAxIiwKICAgIGdlbmUgJWluJSBnZW5lLmdyb3VwMiB+ICJncm91cDIiLAogICAgVFJVRSB+IE5BCiAgKSkgJT4lCiAgZHBseXI6OnNlbGVjdChncm91cCwgQW5ubzIsIGZyZXF1ZW5jeSkKICAKCmdncGxvdChyZXN1bHQsIGFlcyh4ID0gQW5ubzIsIGZpbGwgPSBncm91cCwgeSA9IGZyZXF1ZW5jeSkpICsgZ2VvbV9ib3hwbG90KCkKCgoKIyBWaWV3IHJlc3VsdHMKZ2dwbG90KGxhcmdlc3RfbG9vcHMsIGFlcyh4ID0gbG9vcF93aWR0aCkpICsgZ2VvbV9oaXN0b2dyYW0oKQoKCiMjIyBDaGVja2luZyBob3cgbWFueSBnZW5lcyBmcm9tIGVhY2ggZ3JvdXAgaGFzIGVuY29tcGFzc2luZyBTLVMKZ2VuZS5ncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdiIpKSRnZW5lCmdlbmUuZ3JvdXAyIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMi50c3YiKSkkZ2VuZQoKZGF0YSA8LSB0aWJibGUoCiAgZ2VuZSA9IGMoZ2VuZS5ncm91cDEsIGdlbmUuZ3JvdXAyKSwKICBncm91cCA9IGMocmVwKCJncm91cDEiLCBsZW5ndGgoZ2VuZS5ncm91cDEpKSwKICAgICAgICAgICAgcmVwKCJncm91cDIiLCBsZW5ndGgoZ2VuZS5ncm91cDIpKSkKKQoKZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKGxhcmdlc3RfbG9vcHMsIGJ5ID0gYygiZ2VuZSIpKQpkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjptdXRhdGUoCiAgaGFzU1MgPSBpZmVsc2UoaXMubmEobG9vcF93aWR0aCksICJOTyIsICJZRVMiKQopCgpkYXRhX3N1bW1hcnkgPC0gZGF0YSAlPiUKICBncm91cF9ieShncm91cCkgJT4lCiAgc3VtbWFyaXplKAogICAgdG90YWwgPSBuKCksCiAgICBoYXNTU195ZXMgPSBzdW0oaGFzU1MgPT0gIllFUyIpLAogICAgcGVyY2VudGFnZV95ZXMgPSAoaGFzU1NfeWVzIC8gdG90YWwpICogMTAwCiAgKQoKZ2dwbG90KGRhdGFfc3VtbWFyeSwgYWVzKHggPSBncm91cCwgeSA9IHBlcmNlbnRhZ2VfeWVzLCBmaWxsID0gZ3JvdXApKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gImJsYWNrIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJQZXJjZW50YWdlIG9mIEVhY2ggR3JvdXAgd2l0aCBoYXNTUyA9IFlFUyIsCiAgICB4ID0gIkdyb3VwIiwKICAgIHkgPSAiUGVyY2VudGFnZSAoJSkiCiAgKSArIHlsaW0oMCwgMTAwKSArCiAgdGhlbWVfbWluaW1hbCgpCgp0ZW1wIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoaGFzU1MgPT0gIllFUyIpCmdldFB2YWxXaWxjb3ggPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXAxLCBncm91cDIpewogIGRpc3RhbmNlMSA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMSkgKSRsb29wX3dpZHRoCiAgZGlzdGFuY2UyIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09Z3JvdXAyKSApJGxvb3Bfd2lkdGgKICB3aWwgPC0gd2lsY294LnRlc3QoZGlzdGFuY2UxLCBkaXN0YW5jZTIpCiAgcmV0dXJuKHdpbCRwLnZhbHVlKQp9CnB2IDwtIGNvbnZQdmFsdWUoZ2V0UHZhbFdpbGNveCh0ZW1wLCAiZ3JvdXAxIiwgImdyb3VwMiIpKQoKZ2dwbG90KHRlbXAsIGFlcyh4ID0gZ3JvdXAsIHkgPSBsb29wX3dpZHRoKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41KSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDAsIGxhYmVsID0gcHYsIHNpemUgPSA1LCBjb2xvciA9ICJibGFjayIpCgoKIyMjIENvbXBhcmluZyBSTkEgcGVydHVyYmF0aW9uCgpkaWZmLlJOQSA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoYygxLCA0LCA1KSkgJT4lCiAgZHBseXI6Om11dGF0ZShoYXNTUyA9IGlmZWxzZShlbnNlbWJsX2dlbmVfaWQgJWluJSBsYXJnZXN0X2xvb3BzJGdlbmUsICJoYXNTUyIsICJub1NTIikpCgoKZ2dwbG90KGRpZmYuUk5BLCBhZXMoeCA9IGFicyhsb2cyRm9sZENoYW5nZSksIGNvbG9yID0gaGFzU1MpKSArCiAgc3RhdF9lY2RmKHNpemUgPSAwLjQpICsKICBsYWJzKAogICAgeCA9ICJBYnNvbHV0ZSBsb2cyKGZvbGQgY2hhbmdlKSIsCiAgICB5ID0gIkN1bXVsYXRpdmUgUHJvYmFiaWxpdHkiCiAgKSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxLjUpKSArCiAgdGhlbWVfY2xhc3NpYygpICsgIyBDbGVhbiB0aGVtZQogIHRoZW1lKAogICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgICApCgoKCiMjIyBDaGVja2luZyBDaElQIHBlYWsgZGVuc2l0eQpsYXJnZXN0X2xvb3BzR3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGxhcmdlc3RfbG9vcHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcW5hbWVzLmZpZWxkID0gImxvb3BfY2hyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQuZmllbGQgPSAibG9vcF9zdGFydCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5maWVsZCA9ICJsb29wX2VuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXAuZXh0cmEuY29sdW1ucyA9IFRSVUUpCgojIEZpbmQgb3ZlcmxhcHMgYmV0d2VlbiBDaElQLXNlcSBwZWFrcyBhbmQgdGhlIGxhcmdlc3QgbG9vcHMKY2hpcF9vdmVybGFwcyA8LSBmaW5kT3ZlcmxhcHMobGFyZ2VzdF9sb29wc0dyLCBwZWFrLkgzSzRtZTMpCgojIENvdW50IHRoZSBudW1iZXIgb2YgQ2hJUC1zZXEgcGVha3MgcGVyIGxvb3AKbG9vcF9wZWFrX2NvdW50cyA8LSB0YWJsZShxdWVyeUhpdHMoY2hpcF9vdmVybGFwcykpCgojIENyZWF0ZSBhIGRhdGEgZnJhbWUgd2l0aCB0aGUgY291bnRzIGFuZCBsb29wIGRldGFpbHMKbGFyZ2VzdF9sb29wcyRkZW5zaXR5IDwtIDAgICMgSW5pdGlhbGl6ZSBkZW5zaXR5IGNvbHVtbgpsYXJnZXN0X2xvb3BzJGNvdW50IDwtIDAgICAgIyBJbml0aWFsaXplIHBlYWsgY291bnQgY29sdW1uCgojIEFkZCBwZWFrIGNvdW50cyB0byB0aGUgY29ycmVzcG9uZGluZyBsb29wcwpsYXJnZXN0X2xvb3BzW2FzLm51bWVyaWMobmFtZXMobG9vcF9wZWFrX2NvdW50cykpLCAiY291bnQiXSA8LSBhcy5pbnRlZ2VyKGxvb3BfcGVha19jb3VudHMpCgojIENhbGN1bGF0ZSB0aGUgZGVuc2l0eSAocGVha3MgcGVyIGtpbG9iYXNlKQpsYXJnZXN0X2xvb3BzJGRlbnNpdHkgPC0gbGFyZ2VzdF9sb29wcyRjb3VudCAvICgobGFyZ2VzdF9sb29wcyRsb29wX3dpZHRoLTEpIC8gMTAwMCkKCgpkYXRhIDwtIHRpYmJsZSgKICBnZW5lID0gYyhnZW5lLmdyb3VwMSwgZ2VuZS5ncm91cDIpLAogIGdyb3VwID0gYyhyZXAoImdyb3VwMSIsIGxlbmd0aChnZW5lLmdyb3VwMSkpLAogICAgICAgICAgICByZXAoImdyb3VwMiIsIGxlbmd0aChnZW5lLmdyb3VwMikpKQopCgpkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpsZWZ0X2pvaW4obGFyZ2VzdF9sb29wcywgYnkgPSBjKCJnZW5lIikpCmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6Om11dGF0ZSgKICBoYXNTUyA9IGlmZWxzZShpcy5uYShsb29wX3dpZHRoKSwgIk5PIiwgIllFUyIpCikgJT4lIGRwbHlyOjpmaWx0ZXIoaGFzU1MgPT0gIllFUyIpCgpnZXRQdmFsV2lsY294IDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwMSwgZ3JvdXAyKXsKICBkaXN0YW5jZTEgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT1ncm91cDEpICkkZGVuc2l0eQogIGRpc3RhbmNlMiA8LSAoZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PWdyb3VwMikgKSRkZW5zaXR5CiAgd2lsIDwtIHdpbGNveC50ZXN0KGRpc3RhbmNlMSwgZGlzdGFuY2UyKQogIHJldHVybih3aWwkcC52YWx1ZSkKfQoKcHYgPC0gY29udlB2YWx1ZShnZXRQdmFsV2lsY294KGRhdGEsICJncm91cDEiLCAiZ3JvdXAyIikpCgpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncm91cCwgeSA9IGRlbnNpdHkpKSArIGdlb21fdmlvbGluKGFlcyhmaWxsID0gZ3JvdXApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwgCiAgICAgICAgICAgICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHB2LCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2d0aXRsZSgiSDNLNG1lMyIpCgoKYGBgCgojIyMgWzMuNDJdIENvbXBhcmluZyB0byBSZWcgbG9vcHMgdG8gQTQ4NQpgYGB7cn0KbmFtZSA8LSAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeSIKIyBVUCBsb29wCmxvb3AudXAgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5X3BlLXBlX2RUQUd2c0RNU09fVVBfZGlmZjAuMi5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKFYxLCBWMiwgVjYsIHNlcCA9ICJfIikpCiMgTk8gbG9vcApsb29wLm5vIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX05PX2RpZmYwLjIuYmVkcGUiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShsb29wSUQgPSBwYXN0ZShWMSwgVjIsIFY2LCBzZXAgPSAiXyIpKQojIFVQIE5PCmxvb3AudXBubyA8LSBiaW5kX3Jvd3MobG9vcC51cCwgbG9vcC5ubykKIyBET1dOIGxvb3AKbG9vcC5kb3duIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCAiY2hyb21vX2NvbnNfYW5ub0hpZXJhcmNoeV9wZS1wZV9kVEFHdnNETVNPX0RPV05fZGlmZjAuMi5iZWRwZSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKFYxLCBWMiwgVjYsIHNlcCA9ICJfIikpCgoKYWxsTG9vcHMgPC0gZnJlYWQoaGVyZShjb25zZW5zdXNEaXIsICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5LnRzdiIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGxvb3BJRCA9IHBhc3RlKGNocm9tMSwgc3RhcnQxLCBlbmQyLCBzZXAgPSAiXyIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKAogICAgbG9vcElEICVpbiUgbG9vcC51cG5vJGxvb3BJRCB+ICJVUCZOTyIsCiAgICBsb29wSUQgJWluJSBsb29wLmRvd24kbG9vcElEIH4gIkRPV04iLAogICAgVFJVRSB+IE5BCiAgKSkgJT4lCiAgZHBseXI6OmZpbHRlcighaXMubmEoZ3JvdXApKQoKbWluVmFsdWUgPC0gLTQKb2JzZXhwIDwtIGZyZWFkKGhlcmUoY29uc2Vuc3VzRGlyLCBwYXN0ZTAoImxvb3BTY29yZV9jb25zX29ic2V4cC50c3YiKSkpICU+JQogIGRwbHlyOjptdXRhdGUobG9nX29ic2V4cF9ETVNPID0gaWZfZWxzZShvYnNleHBfRE1TTyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfRE1TTykpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kVEFHID0gaWZfZWxzZShvYnNleHBfZFRBRyA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfZFRBRykpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9BNDg1ID0gaWZfZWxzZShvYnNleHBfQTQ4NSA9PSAwLCBtaW5WYWx1ZSwgbG9nMihvYnNleHBfQTQ4NSkpLAogICAgICAgICAgICAgICAgbG9nX29ic2V4cF9kaWZmX2RUQUdfRE1TTyA9IGxvZ19vYnNleHBfZFRBRyAtIGxvZ19vYnNleHBfRE1TTywKICAgICAgICAgICAgICAgIGxvZ19vYnNleHBfZGlmZl9BNDg1X0RNU08gPSBsb2dfb2JzZXhwX0E0ODUgLSBsb2dfb2JzZXhwX0RNU08pCgphbGxMb29wcyA8LSBhbGxMb29wcyAlPiUgbGVmdF9qb2luKG9ic2V4cCwgYnkgPSBjKCJpZCIpKQphbGxMb29wcyRncm91cCA8LSBmYWN0b3IoYWxsTG9vcHMkZ3JvdXAsIGxldmVscyA9IGMoIlVQJk5PIiwgIkRPV04iKSkKCgojIyMgUGxvdHRpbmcKcDEgPC0gZ2dwbG90KGFsbExvb3BzLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlmZl9BNDg1X0RNU08sIGZpbGwgPSBncm91cCkpICsgCiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHRoZW1lX2NsYXNzaWMoKSArIAogIHN0YXRfc3VtbWFyeSgKICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LAogICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMykKICApICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5NTAiLCAiZ3JleTUwIikpICsKCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLCAgICAKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlcwogICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApICtsYWJzKHkgPSAizpQgbG9vcCBzY29yZSIpICArICAgIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsCiAgICAgICAgICAgICBhbHBoYSA9IDEsCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgICAgICAgIGxpbmVlbmQgPSAic3F1YXJlIikgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLAogICAgICAgICAgICAgYWxwaGEgPSAwLjUsIAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgICAgICAgICBsaW5lZW5kID0gInNxdWFyZSIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC41KSkKICAgIAoKIyMjIwpwMiA8LSBnZ3Bsb3QoYWxsTG9vcHMsIGFlcyh4ID0gZ3JvdXAsIHkgPSBsb2dfb2JzZXhwX2RpZmZfQTQ4NV9ETVNPLCBmaWxsID0gZ3JvdXApKSArIAogIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLCBhbHBoYSA9IC40LCAsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyAKICBzdGF0X3N1bW1hcnkoCiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sCiAgICBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSwKICAgIGZpbGwgPSAiYmxhY2siLCBjb2xvciA9ICJibGFjayIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpCiAgKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZ3JleTUwIiwgImdyZXk1MCIpKSArCgogIHRoZW1lKAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwgICAgCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXMKICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb24KICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgKSArbGFicyh5ID0gImxvZzIoZmMgb2Ygb2JzL2V4cCkiKSAgKyAgICAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLAogICAgICAgICAgICAgYWxwaGEgPSAxLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgICAgICAgICBsaW5lZW5kID0gInNxdWFyZSIpICsgCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0yLCAyKSkKICAKCgojIyMjIyMjIyMjIyMjCgojIyMgUGxvdHRpbmcKcDMgPC0gZ2dwbG90KGFsbExvb3BzLCBhZXMoeCA9IGdyb3VwLCB5ID0gZGlmZl9kVEFHX0RNU08sIGZpbGwgPSBncm91cCkpICsgCiAgZ2VvbV92aW9saW4obGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsIGFscGhhID0gLjQsICwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgIGFscGhhID0gMC42LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHRoZW1lX2NsYXNzaWMoKSArIAogIHN0YXRfc3VtbWFyeSgKICAgIGFlcyhncm91cCA9IGdyb3VwKSwgZnVuID0gbWVhbiwKICAgIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIxLCBzaXplID0gMC41LAogICAgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImJsYWNrIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguMykKICApICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5NTAiLCAiZ3JleTUwIikpICsKCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZU0sCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplUywKICAgICAgZmFtaWx5ID0gZm9udFR5cGUsCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLCAgICAKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBhbmdsZSA9IDQ1LCAgICAgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMgNDUgZGVncmVlcwogICAgICBoanVzdCA9IDEsICAgICAgICMgQWRqdXN0IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICB2anVzdCA9IDEgICAgICAgICMgQWRqdXN0IHZlcnRpY2FsIGp1c3RpZmljYXRpb24KICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApICtsYWJzKHkgPSAizpQgbG9vcCBzY29yZSIpICArICAgIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsCiAgICAgICAgICAgICBhbHBoYSA9IDEsCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgICAgICAgIGxpbmVlbmQgPSAic3F1YXJlIikgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMC4yLAogICAgICAgICAgICAgYWxwaGEgPSAwLjUsIAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgICAgICAgICBsaW5lZW5kID0gInNxdWFyZSIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMC41KSkKICAgIAoKIyMjIwpwNCA8LSBnZ3Bsb3QoYWxsTG9vcHMsIGFlcyh4ID0gZ3JvdXAsIHkgPSBsb2dfb2JzZXhwX2RpZmZfZFRBR19ETVNPLCBmaWxsID0gZ3JvdXApKSArIAogIGdlb21fdmlvbGluKGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLCBhbHBoYSA9IC40LCAsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiLAogICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICBhbHBoYSA9IDAuNiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyAKICBzdGF0X3N1bW1hcnkoCiAgICBhZXMoZ3JvdXAgPSBncm91cCksIGZ1biA9IG1lYW4sCiAgICBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDAuNSwKICAgIGZpbGwgPSAiYmxhY2siLCBjb2xvciA9ICJibGFjayIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjMpCiAgKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZ3JleTUwIiwgImdyZXk1MCIpKSArCgogIHRoZW1lKAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwgICAgCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwKICAgICAgYW5nbGUgPSA0NSwgICAgICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIDQ1IGRlZ3JlZXMKICAgICAgaGp1c3QgPSAxLCAgICAgICAjIEFkanVzdCBob3Jpem9udGFsIGp1c3RpZmljYXRpb24KICAgICAgdmp1c3QgPSAxICAgICAgICAjIEFkanVzdCB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uCiAgICApLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLAogICAgICBzaXplID0gbGluZVRoaWNrKm1tVG9MaW5lVW5pdCwKICAgICAgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgKSArbGFicyh5ID0gImxvZzIoZmMgb2Ygb2JzL2V4cCkiKSAgKyAgICAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLAogICAgICAgICAgICAgYWxwaGEgPSAxLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgICAgICAgICBsaW5lZW5kID0gInNxdWFyZSIpICsgCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0yLCAyKSkKICAKd2lkdGggPC0gcGFuZWxTaXplKDIpKm1tVG9JbmNoCmhlaWdodCA8LSBwYW5lbFNpemUoMS41KSptbVRvSW5jaApmaWxlTmFtZSA8LSBwYXN0ZTAoInJlZ0xvb3BTY29yZWZyb21kVEFHX2RUQUciKQpwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocGxvdF9ncmlkKHAxLCBwMikpCmRldi5vZmYoKQpzdmdsaXRlKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIuc3ZnIikpLCAgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwbG90X2dyaWQocDEsIHAyKSkKZGV2Lm9mZigpICAKCndpZHRoIDwtIHBhbmVsU2l6ZSgyKSptbVRvSW5jaApoZWlnaHQgPC0gcGFuZWxTaXplKDEuNSkqbW1Ub0luY2gKZmlsZU5hbWUgPC0gcGFzdGUwKCJyZWdMb29wU2NvcmVmcm9tZFRBR19BNDg1IikKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChwMywgcDQpKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocGxvdF9ncmlkKHAzLCBwNCkpCmRldi5vZmYoKSAgCgp3aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoCmZpbGVOYW1lIDwtIHBhc3RlMCgicmVnTG9vcFNjb3JlZnJvbWRUQUdfbG9vcFNjb3JlIikKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChwMSwgcDMpKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocGxvdF9ncmlkKHAxLCBwMykpCmRldi5vZmYoKSAgCgp3aWR0aCA8LSBwYW5lbFNpemUoMikqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjUpKm1tVG9JbmNoCmZpbGVOYW1lIDwtIHBhc3RlMCgicmVnTG9vcFNjb3JlZnJvbWRUQUdfbG9nMmZjIikKcG5nKGhlcmUoZmlnRGlyLCBwYXN0ZTAoZmlsZU5hbWUsICIucG5nIikpLCByZXMgPSA2MDAsIHVuaXQgPSAiaW4iLCBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHBsb3RfZ3JpZChwMiwgcDQpKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocGxvdF9ncmlkKHAyLCBwNCkpCmRldi5vZmYoKSAgCgpgYGAKCiMjIyBbMy40M10gQ2hlY2tpbmcgUkFEMjEgcGVhayBkZW5zaXR5IGF0IGdyb3VwMSBhbmQgZ3JvdXAyIHByb21vdGVyCmBgYHtyfQoKcGVhay5SQUQyMSA8LSBpbXBvcnRQZWFrKGhlcmUocmVmRGlyLCAiMzMyNTBfUkFEMjFfYWI5OTJfQnJ1Y2UtNF9wZWFrcy5tZXJnZVBlYWsuYmVkIikpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZsYW5rU2l6ZSA8LSA1MDAwCmdlbmUudGIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJtbTEwX0dSQ20zOC5wNl9nZW5lX3NvcnRlZC5iZWQiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShUU1MgPSBpZmVsc2UoVjQgPT0gIisiLCBWMiwgVjMpLAogICAgICAgICAgICAgICAgVFNTc3RhcnQgPSBUU1MgLSBmbGFua1NpemUsCiAgICAgICAgICAgICAgICBUU1NlbmQgPSBUU1MgKyBmbGFua1NpemUpICU+JQogIGRwbHlyOjpzZWxlY3QoVjYsIFY1LCBWMSwgVFNTc3RhcnQsIFRTU2VuZCkKY29sbmFtZXMoZ2VuZS50YikgPC0gYygiZW5zZW1ibF9nZW5lX2lkIiwgImV4dGVybmFsX2dlbmVfbmFtZSIsICJjaHIiLCAic3RhcnQiLCAiZW5kIikKCgojIENvbnZlcnQgZ2VuZS50YiB0byBhIEdSYW5nZXMgb2JqZWN0CmdlbmVfZ3IgPC0gR1JhbmdlcygKICBzZXFuYW1lcyA9IGdlbmUudGIkY2hyLAogIHJhbmdlcyA9IElSYW5nZXMoc3RhcnQgPSBnZW5lLnRiJHN0YXJ0LCBlbmQgPSBnZW5lLnRiJGVuZCksCiAgZ2VuZV9pZCA9IGdlbmUudGIkZW5zZW1ibF9nZW5lX2lkCikKCiMgQ291bnQgb3ZlcmxhcHMgYmV0d2VlbiBwZWFrcyBhbmQgZ2VuZXMKb3ZlcmxhcF9jb3VudHMgPC0gY291bnRPdmVybGFwcyhnZW5lX2dyLCBwZWFrLlJBRDIxKQoKIyBBZGQgb3ZlcmxhcCBjb3VudHMgdG8gdGhlIG9yaWdpbmFsIGdlbmUudGIgZGF0YQpnZW5lLnRiJHBlYWtfY291bnQgPC0gb3ZlcmxhcF9jb3VudHMKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnBlYWtOdW0wIDwtIChnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKHBlYWtfY291bnQgPT0gMCkpJGVuc2VtYmxfZ2VuZV9pZApwZWFrTnVtMSA8LSAoZ2VuZS50YiAlPiUgZHBseXI6OmZpbHRlcihwZWFrX2NvdW50ID09IDEpKSRlbnNlbWJsX2dlbmVfaWQKcGVha051bTIgPC0gKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIocGVha19jb3VudCA9PSAyKSkkZW5zZW1ibF9nZW5lX2lkCnBlYWtOdW0zIDwtIChnZW5lLnRiICU+JSBkcGx5cjo6ZmlsdGVyKHBlYWtfY291bnQgPT0gMykpJGVuc2VtYmxfZ2VuZV9pZApwZWFrTnVtT3ZlcjQgPC0gKGdlbmUudGIgJT4lIGRwbHlyOjpmaWx0ZXIocGVha19jb3VudCA+PSA0KSkkZW5zZW1ibF9nZW5lX2lkCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpuYW1lIDwtICJjaHJvbW9fY29uc19hbm5vSGllcmFyY2h5IgoKYWxwaGEgPC0gMC4wNQpmY0N1dG9mZiA8LSAwLjUKZGlmZi5STkEuRzEuZFRBRyA8LSBmcmVhZChoZXJlKHJlZkRpciwgImRpZmZfRzEuZFRBR19HMS4yaS5kVEFHX3ZzX0cxLjJpLkRNU08udHN2IikpICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8IGFscGhhLCBhYnMoc2hyaW5rZWRfbG9nMkZDKSA+IGZjQ3V0b2ZmKQpkaWZmLlJOQS5HMS5kVEFHLm5vRkNjdXRvZmYgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPCBhbHBoYSkKZ2VuZUFubm9EYXRhIDwtIGxvYWRMb29wQW5ub0RhdGEoaGVyZShjb25zZW5zdXNEaXIsIHBhc3RlMChuYW1lLCAiX3Atbl9lbnNlbWJsTGlzdC50c3YiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkN1dG9mZiA9IDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vTGlzdCA9IGMoIlAtUCIsICJQLUUiLCAiUC1TIiwgIlAtWCIpKSU+JSAKICBkcGx5cjo6bXV0YXRlKGRpc3RhbmNlID0gc3RhcnQyIC0gc3RhcnQxLAogICAgICAgICAgICAgICAgcGVha0lEID0gcGFzdGUoY2hyb20xLCBzdGFydDEsIHN0YXJ0Miwgc2VwID0gIl8iKSkKCgojIyBEaXZpZGluZyBnZW5lcyBpbnRvIGdyb3Vwcwp0ZW1wIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OnNlbGVjdChkaWZmX2RUQUdfRE1TTywgZGlzdGFuY2UsIGdlbmUpICU+JSAKICB1bm5lc3QoZ2VuZSkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JQogIHN1bW1hcml6ZShtZWFuX2RpZmZfc2NvcmUgPSBtZWFuKGRpZmZfZFRBR19ETVNPKSwKICAgICAgICAgICAgbWVhbl9kaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2UpLAogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQoKZGlmZi5STkEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJkaWZmX0cxLmRUQUdfRzEuMmkuZFRBR192c19HMS4yaS5ETVNPLnRzdiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGVuc2VtYmxfZ2VuZV9pZCwgbG9nMkZvbGRDaGFuZ2UsIHNocmlua2VkX2xvZzJGQywgcGFkaiwgZXh0ZXJuYWxfZ2VuZV9uYW1lKQoKbWF4TG9nMkZDID0gMgoKdGVtcCA8LSBsZWZ0X2pvaW4odGVtcCwgZGlmZi5STkEsIGJ5ID0gYygiZ2VuZSIgPSAiZW5zZW1ibF9nZW5lX2lkIikpICU+JSAKICBkcGx5cjo6bXV0YXRlKGZsYWcgPSBpZmVsc2UoZ2VuZSAlaW4lIGRpZmYuUk5BLkcxLmRUQUckZW5zZW1ibF9nZW5lX2lkLCAiMkRPV04iLCAiME5PIiksCiAgICAgICAgICAgICAgICBtYXhGbGFnID0gKGFicyhzaHJpbmtlZF9sb2cyRkMpID4gbWF4TG9nMkZDKSwKICAgICAgICAgICAgICAgIGxvZzJmY01heCA9IHBtYXgocG1pbihzaHJpbmtlZF9sb2cyRkMsIG1heExvZzJGQyksIC1tYXhMb2cyRkMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZmxhZykgJT4lCiAgZHJvcF9uYShzaHJpbmtlZF9sb2cyRkMpCgp0ZW1wIDwtIHRlbXAgJT4lIGRwbHlyOjptdXRhdGUoCiAgcG5PdmVyID0gaWZlbHNlKGdlbmUgJWluJSBwZWFrTnVtMCwgInBlYWtOdW0wIiwKICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwZWFrTnVtMSwgInBlYWtOdW0xIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnZW5lICVpbiUgcGVha051bTIsICJwZWFrTnVtMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwZWFrTnVtMywgInBlYWtOdW0zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdlbmUgJWluJSBwZWFrTnVtT3ZlcjQsICJwZWFrTnVtT3ZlcjQiLCBOQSkpKSkpKSAlPiUKICBkcm9wX25hKHBuT3ZlcikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDaGVja2luZyBwZXJjZW50YWdlIG9mIGdlbmVzIHdpdGggUkFEMjEgcGVha3MKZ3JvdXAxIDwtIGZyZWFkKGhlcmUocmVmRGlyLCAiZ2VuZUxpc3RfZFRBR192c19ETVNPX1JOQV9sb29wX2JpbmFyeUdyb3VwMS50c3YiKSkkZ2VuZQpncm91cDIgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAyLnRzdiIpKSRnZW5lCgphYWEgPC0gdGVtcCAlPiUgZHBseXI6Om11dGF0ZShncm91cCA9IGNhc2Vfd2hlbigKICBnZW5lICVpbiUgZ3JvdXAxIH4gImdyb3VwMSIsCiAgZ2VuZSAlaW4lIGdyb3VwMiB+ICJncm91cDIiLAogIFRSVUUgfiBOQQopKSAlPiUKICBkcGx5cjo6c2VsZWN0KGdyb3VwLCBwbk92ZXIsIGdlbmUpICU+JQogIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgJWluJSBjKCJncm91cDEiLCAiZ3JvdXAyIikpICU+JQogIGRwbHlyOjptdXRhdGUoaGFzUGVhayA9IGlmZWxzZShwbk92ZXIgPT0gInBlYWtOdW0wIiwgRkFMU0UsIFRSVUUpKQoKYmJiIDwtIGFhYSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiZ3JvdXAxIikgCgpzdW0oYmJiJGhhc1BlYWspCmJiYiA8LSBhYWEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gImdyb3VwMiIpIApzdW0oYmJiJGhhc1BlYWspCgphYWFfc3VtbWFyeSA8LSBhYWEgJT4lCiAgZ3JvdXBfYnkoZ3JvdXAsIHBuT3ZlcikgJT4lCiAgc3VtbWFyaXplKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKQoKIyBDcmVhdGUgdGhlIHN0YWNrZWQgYmFycGxvdAphYWFfc3VtbWFyeSA8LSBhYWEgJT4lCiAgZ3JvdXBfYnkoZ3JvdXAsIHBuT3ZlcikgJT4lCiAgc3VtbWFyaXplKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBncm91cF9ieShncm91cCkgJT4lCiAgbXV0YXRlKHJhdGlvID0gY291bnQgLyBzdW0oY291bnQpKQoKIyBEZWZpbmUgdGhlIGdyYWRpZW50IGNvbG9ycwpncmFkaWVudF9jb2xvcnMgPC0gYygiI0Q0RDRENCIsICIjRENCMEFGIiwgIiNFNDhEOEEiLCAiI0VDNjk2NSIsICIjRjQ0NjQxIikKIyBncmFkaWVudF9jb2xvcnMgPC0gYygiI0Q0RDRENCIsICIjQTJCQkNBIiwgIiM3MUEyQzAiLCAiIzNGODlCNyIsICIjMEU3MUFEIikKCiMgQ3JlYXRlIHRoZSBzdGFja2VkIGJhcnBsb3Qgd2l0aCBncmFkaWVudCBjb2xvcnMKcCA8LSBnZ3Bsb3QoYWFhX3N1bW1hcnksIGFlcyh4ID0gZ3JvdXAsIHkgPSByYXRpbywgZmlsbCA9IHBuT3ZlcikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAic3RhY2siLAogICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIikgKwogIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gIlJhdGlvIikgKwogIHRoZW1lKAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gZ3JhZGllbnRfY29sb3JzLCAKICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMC41KSwgIyBBZGp1c3QgbGVnZW5kIGtleSBzeW1ib2wgc2l6ZQogICAgICBrZXl3aWR0aCA9IDIgLyAyLjU0LCAjIENvbnZlcnQgMm1tIHRvIGNtCiAgICAgIGtleWhlaWdodCA9IDIgLyAyLjU0ICMgQ29udmVydCAybW0gdG8gY20KICAgICkpIAoKd2lkdGggPC0gcGFuZWxTaXplKDEuNykqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjMpKm1tVG9JbmNoCmZpbGVOYW1lIDwtIHBhc3RlMCgicmFkMjFwZXJjX3Byb21vdGVyIikKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpICAKCmBgYAoKIyMjIyMgbG9vcCBzY29yZQpgYGB7cn0KZ2V0UHZhbFdpbGNveCA8LSBmdW5jdGlvbihkYXRhLCBncm91cDEsIGdyb3VwMil7CiAgZGlzdGFuY2UxIDwtIChkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHBuT3ZlciA9PWdyb3VwMSkgKSRtZWFuX2RpZmZfc2NvcmUKICBkaXN0YW5jZTIgPC0gKGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIocG5PdmVyID09Z3JvdXAyKSApJG1lYW5fZGlmZl9zY29yZQogIHdpbCA8LSB3aWxjb3gudGVzdChkaXN0YW5jZTEsIGRpc3RhbmNlMikKICByZXR1cm4od2lsJHAudmFsdWUpCn0KCnBzMDEgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicGVha051bTAiLCAicGVha051bTEiKSwgNSkKcHMxMiA8LSByb3VuZChnZXRQdmFsV2lsY294KHRlbXAsICJwZWFrTnVtMSIsICJwZWFrTnVtMiIpLCA1KQpwczIzIDwtIHJvdW5kKGdldFB2YWxXaWxjb3godGVtcCwgInBlYWtOdW0yIiwgInBlYWtOdW0zIiksIDUpCnBzMzQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicGVha051bTMiLCAicGVha051bU92ZXI0IiksIDUpCnBzMjQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicGVha051bTIiLCAicGVha051bU92ZXI0IiksIDUpCnBzMTQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicGVha051bTEiLCAicGVha051bU92ZXI0IiksIDUpCnBzMDQgPC0gcm91bmQoZ2V0UHZhbFdpbGNveCh0ZW1wLCAicGVha051bTAiLCAicGVha051bU92ZXI0IiksIDUpCgoKcCA8LSBnZ3Bsb3QodGVtcCwgYWVzKHggPSBwbk92ZXIsIHkgPSBtZWFuX2RpZmZfc2NvcmUpKSArIAogIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcG5PdmVyKSwgCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4zLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIiwKICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BCiAgKSArIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gIkF2ZXJhZ2UgzpQgbG9vcCBzY29yZSIpICsKICBzdGF0X3N1bW1hcnkoCiAgICBhZXMoZ3JvdXAgPSBwbk92ZXIpLCBmdW4gPSBtZWFuLAogICAgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjEsIHNpemUgPSAwLjUsCiAgICBmaWxsID0gImJsYWNrIiwgY29sb3IgPSAiYmxhY2siCiAgKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0KSArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVNLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsIGZhbWlseSA9IGZvbnRUeXBlLCBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMQogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSBsaW5lVGhpY2sgKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUykKICApKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSAwLCBsYWJlbCA9IHBhc3RlMCgicHMwMTogIiwgY29udlB2YWx1ZShwczAxKSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMTI6ICIsIGNvbnZQdmFsdWUocHMxMiksICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwczIzOiAiLCBjb252UHZhbHVlKHBzMjMpLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMzNDogIiwgY29udlB2YWx1ZShwczM0KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMjQ6ICIsIGNvbnZQdmFsdWUocHMyNCksICJcbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHMxNDogIiwgY29udlB2YWx1ZShwczE0KSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzMDQ6ICIsIGNvbnZQdmFsdWUocHMwNCksICJcbiIpLCAKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgc2l6ZSA9IDIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM3Nzc3NzciLCAiIzhCN0U2NSIsICIjQTI4NDUyIiwgIiNDMjg4NEQiLCAiI0YyOEUyQyIpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDAuMSkpCgoKCmZpbGVOYW1lIDwtIHBhc3RlMCgiZGlmZlNjb3JlX2JhcnBsb3RfUkFEMjFwZWFrV2l0aGluMTBrYl9kVEFHX3ZzX0RNU08iKQp3aWR0aCA8LSAzMyptbVRvSW5jaApoZWlnaHQgPC0zOCptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIyMjIGxvZzJGQwpgYGB7cn0KdGVtcCA8LSB0ZW1wICU+JSBkcGx5cjo6bXV0YXRlKGFic0xvZzJGQyA9IGFicyhsb2cyRm9sZENoYW5nZSkpCnAgPC0gZ2dwbG90KHRlbXAsIGFlcyh4ID0gYWJzTG9nMkZDLCBjb2xvciA9IHBuT3ZlcikpICsKc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IChjKCIjNzc3Nzc3IiwgIiM4QjdFNjUiLCAiI0EyODQ1MiIsICIjQzI4ODREIiwgIiNGMjhFMkMiKSkpICsKICBzdGF0X2VjZGYoc2l6ZSA9IDAuNCwgbGluZXdpZHRoID0gbGluZU1lZGl1bSAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiICkgKyAjIFVzZSBzdGF0X2VjZGYgdG8gcGxvdCB0aGUgZW1waXJpY2FsIENERgogIGxhYnMoCiAgICB4ID0gIkFicy4gbG9nMihmb2xkIGNoYW5nZSkiLAogICAgeSA9ICJDdW11bGF0aXZlIFByb2JhYmlsaXR5IgogICkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMS41KSkgKwogIHRoZW1lX2NsYXNzaWMoKSArICMgQ2xlYW4gdGhlbWUKICB0aGVtZSgKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgICBzaXplID0gZm9udFNpemVNLAogICAgICBmYW1pbHkgPSBmb250VHlwZSwKICAgICAgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSBmb250U2l6ZVMsCiAgICAgIGZhbWlseSA9IGZvbnRUeXBlLAogICAgICBjb2xvciA9ICIjMDAwMDAwIgogICAgKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgKICAgICAgY29sb3IgPSAiIzAwMDAwMCIsCiAgICAgIHNpemUgPSBsaW5lVGhpY2sqbW1Ub0xpbmVVbml0LAogICAgICBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwKICAgICAgc2l6ZSA9IGxpbmVUaGljayptbVRvTGluZVVuaXQsCiAgICAgIGxpbmVlbmQgPSAic3F1YXJlIgogICAgKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnRUeXBlLCBzaXplID0gZm9udFNpemVTKQogICAgKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAwLjEpKQpmaWxlTmFtZSA8LSBwYXN0ZTAoImxvZzJGQ19jZGZfcHNHcm91cF9kVEFHX3ZzX0RNU08iKQp3aWR0aCA8LSAzMyptbVRvSW5jaApoZWlnaHQgPC0zMyptbVRvSW5jaApwbmcoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5wbmciKSksIHJlcyA9IDYwMCwgdW5pdCA9ICJpbiIsIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKQoKYGBgCgojIyMgWzMuNDRdIENoZWNraW5nIFJBRDIxIHBlYWsgZGVuc2l0eSBhdCBncm91cDEgYW5kIGdyb3VwMiBwcm9tb3RlcgpgYGB7cn0KCnBlYWsuUkFEMjEgPC0gaW1wb3J0UGVhayhoZXJlKHJlZkRpciwgIjMzMjUwX1JBRDIxX2FiOTkyX0JydWNlLTRfcGVha3MubWVyZ2VQZWFrLmJlZCIpKQpncm91cDEgPC0gZnJlYWQoaGVyZShyZWZEaXIsICJnZW5lTGlzdF9kVEFHX3ZzX0RNU09fUk5BX2xvb3BfYmluYXJ5R3JvdXAxLnRzdiIpKSRnZW5lCmdyb3VwMiA8LSBmcmVhZChoZXJlKHJlZkRpciwgImdlbmVMaXN0X2RUQUdfdnNfRE1TT19STkFfbG9vcF9iaW5hcnlHcm91cDIudHN2IikpJGdlbmUKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCm5hbWUgPC0gImNocm9tb19jb25zX2Fubm9IaWVyYXJjaHkiCgpnZW5lQW5ub0RhdGEgPC0gbG9hZExvb3BBbm5vRGF0YShoZXJlKGNvbnNlbnN1c0RpciwgcGFzdGUwKG5hbWUsICJfcC1uX2Vuc2VtYmxMaXN0LnRzdiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmQ3V0b2ZmID0gMC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm9MaXN0ID0gYygiUC1FIikpCgp0ZW1wMSA8LSBnZW5lQW5ub0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoQTEgPT0gIkUiKSAlPiUgZHBseXI6OnNlbGVjdChjaHJvbTEsIHN0YXJ0MSwgZW5kMSwgZ2VuZSkKY29sbmFtZXModGVtcDEpIDwtIGMoImNociIsICJzdGFydCIsICJlbmQiLCAiZ2VuZSIpCnRlbXAyIDwtIGdlbmVBbm5vRGF0YSAlPiUgZHBseXI6OmZpbHRlcihBMiA9PSAiRSIpICU+JSBkcGx5cjo6c2VsZWN0KGNocm9tMiwgc3RhcnQyLCBlbmQyLCBnZW5lKQpjb2xuYW1lcyh0ZW1wMikgPC0gYygiY2hyIiwgInN0YXJ0IiwgImVuZCIsICJnZW5lIikKCmVuaEFuY2hvcnMgPC0gYmluZF9yb3dzKHRlbXAxLCB0ZW1wMikgJT4lIHVubmVzdChnZW5lKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgZ3JvdXAgPSBjYXNlX3doZW4oCiAgICAgIGdlbmUgJWluJSBncm91cDEgfiAiR3JwMSIsCiAgICAgIGdlbmUgJWluJSBncm91cDIgfiAiR3JwMiIsCiAgICAgIFRSVUUgfiBOQQogICAgKQogICkgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGdyb3VwKSkKCmVuaCA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoZW5oQW5jaG9ycyAlPiUgZHBseXI6OnNlbGVjdChjKDEsIDIsIDMpKSkKCiMgQ291bnQgb3ZlcmxhcHMgYmV0d2VlbiBwZWFrcyBhbmQgZ2VuZXMKb3ZlcmxhcF9jb3VudHMgPC0gY291bnRPdmVybGFwcyhlbmgsIHBlYWsuUkFEMjEpCgojIEFkZCBvdmVybGFwIGNvdW50cyB0byB0aGUgb3JpZ2luYWwgZ2VuZS50YiBkYXRhCmVuaEFuY2hvcnMkcGVha19jb3VudCA8LSBvdmVybGFwX2NvdW50cwoKZW5oQW5jaG9ycyA8LSBlbmhBbmNob3JzICU+JSBkcGx5cjo6bXV0YXRlKAogIHBlYWtHcm91cCA9IGNhc2Vfd2hlbigKICAgIHBlYWtfY291bnQgPT0gMCB+ICJwZWFrTnVtMCIsCiAgICBwZWFrX2NvdW50ID09IDEgfiAicGVha051bTEiLAogICAgcGVha19jb3VudCA9PSAyIH4gInBlYWtOdW0yIiwKICAgIHBlYWtfY291bnQgPT0gMyB+ICJwZWFrTnVtMyIsCiAgICBwZWFrX2NvdW50ID49IDQgfiAicGVha051bU92ZXI0IgogICkKKQoKYWFhIDwtIGVuaEFuY2hvcnMgJT4lIAogIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIHBlYWtHcm91cCwgZ2VuZSkgJT4lCiAgZHBseXI6Om11dGF0ZShoYXNQZWFrID0gaWZlbHNlKHBlYWtHcm91cCA9PSAicGVha051bTAiLCBGQUxTRSwgVFJVRSkpCgpiYmIgPC0gYWFhICU+JSBkcGx5cjo6ZmlsdGVyKGdyb3VwID09ICJHcnAxIikgCnN1bShiYmIkaGFzUGVhaykvbnJvdyhiYmIpCmJiYiA8LSBhYWEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gIkdycDIiKSAKc3VtKGJiYiRoYXNQZWFrKS9ucm93KGJiYikKCgphYWFfc3VtbWFyeSA8LSBhYWEgJT4lCiAgZ3JvdXBfYnkoZ3JvdXAsIHBlYWtHcm91cCkgJT4lCiAgc3VtbWFyaXplKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKQoKIyBDcmVhdGUgdGhlIHN0YWNrZWQgYmFycGxvdAphYWFfc3VtbWFyeSA8LSBhYWEgJT4lCiAgZ3JvdXBfYnkoZ3JvdXAsIHBlYWtHcm91cCkgJT4lCiAgc3VtbWFyaXplKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBncm91cF9ieShncm91cCkgJT4lCiAgbXV0YXRlKHJhdGlvID0gY291bnQgLyBzdW0oY291bnQpKQoKIyBEZWZpbmUgdGhlIGdyYWRpZW50IGNvbG9ycwojIGdyYWRpZW50X2NvbG9ycyA8LSBjKCIjRDRENEQ0IiwgIiNEQ0IwQUYiLCAiI0U0OEQ4QSIsICIjRUM2OTY1IiwgIiNGNDQ2NDEiKQpncmFkaWVudF9jb2xvcnMgPC0gYygiI0Q0RDRENCIsICIjQTJCQkNBIiwgIiM3MUEyQzAiLCAiIzNGODlCNyIsICIjMEU3MUFEIikKCiMgQ3JlYXRlIHRoZSBzdGFja2VkIGJhcnBsb3Qgd2l0aCBncmFkaWVudCBjb2xvcnMKcCA8LSBnZ3Bsb3QoYWFhX3N1bW1hcnksIGFlcyh4ID0gZ3JvdXAsIHkgPSByYXRpbywgZmlsbCA9IHBlYWtHcm91cCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAic3RhY2siLAogICAgICAgICAgIGxpbmV3aWR0aCA9IGxpbmVNZWRpdW0gKiBtbVRvTGluZVVuaXQsIGxpbmVlbmQgPSAic3F1YXJlIikgKwogIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9IE5VTEwgLCB5ID0gIlJhdGlvIikgKwogIHRoZW1lKAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IGZvbnRTaXplTSwgZmFtaWx5ID0gZm9udFR5cGUsIGNvbG9yID0gIiMwMDAwMDAiCiAgICApLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gZm9udFNpemVTLCBmYW1pbHkgPSBmb250VHlwZSwgY29sb3IgPSAiIzAwMDAwMCIKICAgICksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoCiAgICAgIGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gbGluZVRoaWNrICogbW1Ub0xpbmVVbml0LCBsaW5lZW5kID0gInNxdWFyZSIKICAgICksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKAogICAgICBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IGxpbmVUaGljayAqIG1tVG9MaW5lVW5pdCwgbGluZWVuZCA9ICJzcXVhcmUiCiAgICApLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250VHlwZSwgc2l6ZSA9IGZvbnRTaXplUyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udFR5cGUsIHNpemUgPSBmb250U2l6ZVMpCiAgKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gZ3JhZGllbnRfY29sb3JzLCAKICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMC41KSwgIyBBZGp1c3QgbGVnZW5kIGtleSBzeW1ib2wgc2l6ZQogICAgICBrZXl3aWR0aCA9IDIgLyAyLjU0LCAjIENvbnZlcnQgMm1tIHRvIGNtCiAgICAgIGtleWhlaWdodCA9IDIgLyAyLjU0ICMgQ29udmVydCAybW0gdG8gY20KICAgICkpIAoKd2lkdGggPC0gcGFuZWxTaXplKDEuNykqbW1Ub0luY2gKaGVpZ2h0IDwtIHBhbmVsU2l6ZSgxLjMpKm1tVG9JbmNoCmZpbGVOYW1lIDwtIHBhc3RlMCgicmFkMjFwZXJjX2VuaCIpCnN2Z2xpdGUoaGVyZShmaWdEaXIsIHBhc3RlMChmaWxlTmFtZSwgIi5zdmciKSksICBoZWlnaHQgPSBoZWlnaHQsIHdpZHRoID0gd2lkdGgpCnByaW50KHApCmRldi5vZmYoKSAgCgpgYGAKCiMgTk9UIENPTkNMVVNJVkUgQkVMT1cgSEVSRQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKYGBge3J9CgpkYXRhIDwtIGZyZWFkKGhlcmUocmVzdWx0RGlyLCAiY2hyb21ITU0iLCAiQTQ4NV9wZS1wZV9hbmNob3JzIiwgIm92ZXJsYXBfZW5yaWNoXzEwMF9zdGF0ZS50eHQiKSkKY29sbmFtZXMoZGF0YSkgPC0gYygic3RhdGUiLCAiZ2Vub21lIiwgInBlLXBlX0E0ODVfZG93biIsICJwZS1wZV9BNDg1X25vIiwgInBlLXBlX0E0ODVfdXAiKQpkYXRhIDwtIGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoLWdlbm9tZSkgJT4lIGFzLm1hdHJpeCgpCgogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAic3RhdGUiKSAlPiUKICBhcy5tYXRyaXgoKQoKbGlicmFyeShjaXJjbGl6ZSkKCmNvbF9mdW4gPC0gY29sb3JSYW1wMihjKDAsIDEsIDEwKSwgCiAgICAgICAgICAgICAgICAgICAgICBjKCJibHVlIiwgIndoaXRlIiwgInJlZCIpKQoKbGlicmFyeShjaXJjbGl6ZSkKY29sX2Z1biA8LSBjb2xvclJhbXAyKGMobWluKGRhdGEpLCBtYXgoZGF0YSkpLCBjKCJ3aGl0ZSIsICJyZWQiKSkKCgojZnZpel9uYmNsdXN0KGRhdGEsIGttZWFucywgbWV0aG9kID0gIndzcyIpCgpwIDwtIEhlYXRtYXAoCiAgZGF0YSwKICBuYW1lID0gIk9kZHMgUmF0aW8iLCAgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGhlYXRtYXAgbGVnZW5kCiAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsICAgICAgICAgICAgIyBSZW1vdmUgY29sdW1uIGRlbmRyb2dyYW0KICByb3dfa20gPSAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgIyBEZWZpbmUgdGhlIG51bWJlciBvZiBrLW1lYW5zIGNsdXN0ZXJzIGZvciByb3dzIChhZGp1c3QgYXMgbmVlZGVkKQogIHNob3dfcm93X2RlbmQgPSBGQUxTRSwKICBjb2wgPSBjb2xfZnVuLAogIGJvcmRlciA9IFRSVUUKKQoKZmlsZU5hbWUgPC0gcGFzdGUwKCJhbmNob3JMT0xBX2RUQUdfdnNfRE1TT19kaWZmMC4yX2FsbExvb3BzX2V4dHJlbWVfcmVnQW5jaG9yQmFja2dyb3VuZF9hdGFjIikKaGVpZ2h0IDwtIDcKd2lkdGggPC0gMy41CnBuZyhoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnBuZyIpKSwgcmVzID0gNjAwLCB1bml0ID0gImluIiwgaGVpZ2h0ID0gaGVpZ2h0LCB3aWR0aCA9IHdpZHRoKQpwcmludChwKQpkZXYub2ZmKCkKc3ZnbGl0ZShoZXJlKGZpZ0RpciwgcGFzdGUwKGZpbGVOYW1lLCAiLnN2ZyIpKSwgIGhlaWdodCA9IGhlaWdodCwgd2lkdGggPSB3aWR0aCkKcHJpbnQocCkKZGV2Lm9mZigpCgpgYGAKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoK